#glulx #if #export #blorb

glk

为交互式小说解释器提供Glk I/O接口的绑定

2个不稳定版本

0.2.0 2019年11月4日
0.1.1 2019年10月15日
0.1.0 2019年10月15日

#499 in 文本处理

MIT/Apache

280KB
6.5K SLoC

Rust 4K SLoC // 0.2% comments C 2K SLoC // 0.0% comments

glk-rs

此crate提供了实现交互式小说解释器Glk I/O接口的绑定。该标准由glulxe解释器等使用。

它导出C函数、Rust特性和一个示例实现。用户需要为解释器将调用的Glk函数提供实际的实现。

注意

此crate目前只能提供Glk库的能力。

在实现解释器或其他Glk应用程序时,使用Glk库将很有用,但目前此crate无法实现,尽管它可能至少共享一些特质、实用代码或常量。

使用方法

在一个具有处理器的结构体上实现glk::traits::Api和Glk特质(至少是处理基本功能的Base;每个Glk模块由一个单独的特质处理),然后调用glk::init()来注册处理器。

/** Dispatch trait for all Glk APIs. Each function returns a
 * reference to a trait which will be called for functions on the associated
 * Glk module.
 */
pub trait Api {
    /** Mandatory Glk API functions. */
    fn base(&mut self) -> &mut dyn Base;
    /** GLK_MODULE_LINE_ECHO */
    fn line_echo(&mut self) -> Option<&mut dyn LineEcho>;
    /** GLK_MODULE_LINE_TERMINATORS */
    fn line_terminators(&mut self) -> Option<&mut dyn LineTerminators>;
    /** GLK_MODULE_UNICODE */
    fn unicode(&mut self) -> Option<&mut dyn Unicode>;
    /** GLK_MODULE_UNICODE_NORM */
    fn unicode_norm(&mut self) -> Option<&mut dyn UnicodeNorm>;
    /** GLK_MODULE_IMAGE */
    fn image(&mut self) -> Option<&mut dyn Image>;
    /** GLK_MODULE_SOUND */
    fn sound(&mut self) -> Option<&mut dyn Sound>;
    /** GLK_MODULE_SOUND2 */
    fn sound2(&mut self) -> Option<&mut dyn Sound2>;
    /** GLK_MODULE_HYPERLINKS */
    fn hyperlinks(&mut self) -> Option<&mut dyn Hyperlinks>;
    /** GLK_MODULE_DATETIME */
    fn date_time(&mut self) -> Option<&mut dyn Datetime>;
    /** GLK_MODULE_RESOURCE_STREAM */
    fn resource_stream(&mut self) -> Option<&mut dyn ResourceStream>;
    /** GLK_MODULE_GARGLKTEXT */
    fn garglk_text(&mut self) -> Option<&mut dyn garglk::GarGlkText>;
    /** GI blorb handler functions */
    fn giblorb(&mut self) -> Option<&mut dyn giblorb::Handlers>;
    /** GI dispatch handler functions */
    fn gidispatch(&mut self) -> Option<&mut dyn gidispatch::Handlers>;
    /** Rust Glk extension handler functions */
    fn ext(&mut self) -> Option<&mut dyn ext::Handlers>;
}

这些函数可以返回Some(self),或者委托给实现给定特质的另一个对象。如果没有实现该模块,则返回None

然后将您的应用程序链接到需要glk_ API的任何内容。

请注意,使用glk::init注册的处理程序是线程本地的,因此请确保从注册glk API处理器的同一线程调用解释器。Glk仅支持单线程解释器。

示例:Toyglk

一个基本的演示Glk实现,使用crossterm作为终端后端。它使用glulxe crate托管Glulxe解释器。

  • 目标是实现Glk标准的完整版本,包括Unicode扩展。
  • 仅支持一个窗口:整个终端。
  • 行和字符(也是特殊键码)输入。
  • 保存和恢复工作。
  • 支持Glk样式和GarGlkText RGB颜色。

一些我最喜欢的小说,如《蓝色空洞》和《仿造猴子》可以工作。例如。

$ cargo run --release --example toyglk CounterfeitMonkey.gblorb
...
Can you hear me? >> yes

Good, you're conscious. We're conscious. I've heard urban legends about
synthesis going wrong, one half person getting lost.

Counterfeit Monkey

Glk+GarGlk styles

Glk类型

glui32直接映射到u32,而glsi32映射到i32

不透明的句柄类型(frefid_tschanid_tstrid_twinid_t)表示为不透明类型,可以转换为usize(或者指针,如果你处于危险状态)。

提供了与C兼容的结构体类型event_tglkdate_tglktimeval_tstream_result_t

为了方便使用,为gestalts、事件类型、键码等定义了便捷类型。这些是新类型,它们封装了一个u32,而不是枚举,以留出扩展(或特殊需求)传递新值的余地。

许可证

根据您的选择,许可协议为以下之一

(请注意,内部crate glk-sys 仅在MIT许可证下进行许可,因为它基于glk的文件,这些文件也是以这种许可证授权的)

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,没有任何额外的条款或条件。

依赖关系

~0–2MB
~37K SLoC