🦄
第一本 TinTin++ 编程书
  • 第一本 TinTin++ 编程书
  • 前言✅
    • 阅读指南✅
    • 术语和约定✅
  • TinTin++ 入门
    • 快速上手❌
      • 安装与启动✅
      • 连接到游戏❌
      • 你好,TinTin++❌
      • 到哪里寻求帮助?❌
      • 别名(#alias)❌
      • 重复(#N)和循环(#loop)❌
      • 第一个机器人❌
      • 触发器(#action)❌
      • 变量(#var)❌
      • 根据情况执行不同命令(#if)❌
      • 定时器(#timer)❌
      • 延迟执行(#delay)❌
      • 触发器(#action)❌
      • 归类(#class)❌
    • 更多触发❌
  • TinTin++ 语法指南
    • 命令和命令解析❌
      • 分号和花括号❌
      • 标识符和变量内插❌
      • 函数❌
    • 变量和数据类型❌
      • 局部变量(#local)❌
      • 字符串❌
      • 数值和数学运算❌
      • 带颜色的字符串❌
      • 字符串列表❌
      • 数组(#list)❌
      • 关联数组(table)❌
    • 流程控制❌
    • 强大的正则表达式❌
    • 调试和日志❌
    • 会话管理❌
  • 实战
    • 地图与路径❌
    • 从走路说起❌
    • 数据与代码同构❌
    • 定制你的人机交互方式❌
    • 坑❌
  • 参考手册
    • TinTin++ 指令手册❌
    • TinTin++ 支持的协议❌
  • TinTin++ 源代码解析
    • 源码概述❌
    • 命令是怎样被执行的❌
      • 词法分析❌
      • 语法分析❌
      • 文本替换❌
    • 核心数据结构❌
      • tintin_data* gtd❌
      • listroot 和 listnode
      • level_data* gtd->level❌
    • 内存管理和栈模型❌
      • str 和 ptr❌
      • str 维护❌
  • 社区
    • 社交礼仪❌
    • 贡献指南❌
    • 鸣谢❌
    • 流行 MUD 介绍❌
    • 参与 TinTin++ 开发❌
由 GitBook 提供支持
在本页
  1. TinTin++ 源代码解析
  2. 核心数据结构❌

listroot 和 listnode

list 是 TinTin++ 源码中非常重要的基础数据结构,顾名思义它就是一个列表,一维的有序的集合,这种基础数据结构可以用来存放大多数 TinTin++ 定义块。参见 #info 命令的输出,以及 #info aliases 等命令。

大体来说,一个 listnode 描述一个定义块,而 listroot 则是一组 listnode 的集合,但是和别处不同,这里采用了数组而非双向链表来储存多个 listnode。数组的长度由 listroot->used 给出,第一个元素位置为 listroot->list[0], 最后一个则是 listroot->list[listroot->used-1]。

注意 listnode 本身并没有类型字段,也就是说它的类型由 listroot->type 给出,换言之 listroot 只能用来储存同类型的 listnode,同一个 listroot 下的 listnode 具有相同类型。

另外,listroot->flags 为整个 list 提供了一些掩码,有如下这些:

#define LIST_FLAG_IGNORE              BV01
#define LIST_FLAG_PRIORITY            BV02
#define LIST_FLAG_MESSAGE             BV03
#define LIST_FLAG_DEBUG               BV04
#define LIST_FLAG_INFO                BV05
#define LIST_FLAG_LOG                 BV06
#define LIST_FLAG_CLASS               BV07
#define LIST_FLAG_READ                BV08
#define LIST_FLAG_WRITE               BV09
#define LIST_FLAG_HIDE                BV10
#define LIST_FLAG_INHERIT             BV11
#define LIST_FLAG_REGEX               BV12
#define LIST_FLAG_NEST                BV13
#define LIST_FLAG_CASE                BV14
#define LIST_FLAG_DEFAULT             LIST_FLAG_MESSAGE

特殊的 list

每一次 push_script_stack()都会为新栈帧创建一个 listroot,用来存放该栈帧专属的 #local 变量,该 listroot 的类型为 LIST_VARIABLE。

上一页tintin_data* gtd❌下一页level_data* gtd->level❌

最后更新于1年前