故事文件定义规范文档

概述

本文档详细描述了交互式故事游戏文件的定义规范。该格式用于创建基于选择的文本冒险游戏,支持复杂的条件判断、状态管理和多分支剧情。

文件结构

1. 基本格式

故事文件采用标签化的文本格式,使用 @ 符号作为标签前缀,使用方括号 [] 定义节点标识符。

2. 节点定义

每个故事节点使用以下格式:

[NODE_ID]
@TYPE: 节点类型
@SUMMARY: 节点摘要
@DESC: 详细描述
@CHOICE_START
  选择内容...
@CHOICE_END

节点类型 (@TYPE)

支持的节点类型:

  1. START - 游戏开始节点

    • 必须存在且唯一
    • 作为游戏的入口点
  2. NORMAL - 普通剧情节点

    • 标准的故事进展节点
    • 包含选择和后果
  3. ENDING - 结局节点

    • 游戏结束节点
    • 通常包含重新开始的选择

节点属性

@SUMMARY (必需)

  • 用途: 节点的简短摘要
  • 格式: 单行文本
  • 示例: @SUMMARY: 海难幸存者醒来在神秘孤岛

@DESC (必需)

  • 用途: 节点的详细描述
  • 格式: 多行文本描述
  • 示例:
@DESC: 你从昏迷中醒来,发现自己躺在一片陌生的沙滩上。头部隐隐作痛,身体疲惫不堪,但你还活着。

选择系统

选择块结构

@CHOICE_START
  @CHOICE_TEXT: 选择显示文本
  @TARGET: 目标节点ID
  @COND_START
    条件定义...
  @COND_END
  @EFFECT_START
    效果定义...
  @EFFECT_END
@CHOICE_END

选择属性详解

@CHOICE_TEXT (必需)

  • 用途: 显示给玩家的选择文本
  • 格式: 单行文本
  • 示例: @CHOICE_TEXT: 检查周围的船只残骸,寻找有用物品

@TARGET (必需)

  • 用途: 选择该选项后跳转的目标节点
  • 格式: 节点ID(不含方括号)
  • 示例: @TARGET: SEARCH_WRECK

条件系统 (@COND)

条件块结构

@COND_START
  @COND: [类型][属性][操作符][值]
  @COND: [类型][属性][操作符][值]
@COND_END

条件格式详解

基本语法

  • 格式: @COND: [类型][属性][操作符][值]
  • 类型: 状态、技能、物品
  • 属性: 具体的属性名称
  • 操作符: >=, <=, >, <, ==
  • : 数值或字符串

条件类型

  1. 状态条件(数值型判断,范围 0-100)

    @COND: [状态][体力][>=][30]     # 体力大于等于30
    @COND: [状态][精神][>][20]      # 精神大于20
    @COND: [状态][生命][<=][50]     # 生命小于等于50
    
    • 特点: 基于数值进行比较判断
    • 操作符: >=, <=, >, <, ==
    • 数值范围: 0-100
  2. 技能条件(累积次数判断)

    @COND: [技能][制作技能][>=][2]  # 制作技能至少2次
    @COND: [技能][探索经验][>][1]   # 探索经验超过1次
    
    • 特点: 基于累积次数进行判断
    • 操作符: >=, >, ==(通常不使用 <=, <
    • 数值: 表示累积的次数
  3. 食物条件(数量判断)

    @COND: [食物][干粮][>=][2]      # 拥有至少2份干粮
    @COND: [食物][淡水][>][1]       # 拥有超过1份淡水
    @COND: [食物][野果][==][0]      # 没有野果
    
    • 特点: 基于数量进行判断
    • 操作符: >=, >, <=, <, ==
    • 数值: 表示食物的具体数量
  4. 工具条件(拥有状态判断)

    @COND: [工具][简易刀具][>=][1]  # 拥有简易刀具
    @COND: [工具][火把][>][0]       # 拥有火把
    @COND: [工具][绳索][==][0]      # 没有绳索
    
    • 特点: 基于拥有/不拥有状态判断
    • 操作符: >=, >, ==
    • 常用值: 1(拥有)、0(没有)

条件逻辑

  • 多个条件之间为 AND 关系
  • 所有条件必须同时满足才能显示该选择
  • 空的条件块表示无条件限制

效果系统 (@EFFECT)

效果块结构

@EFFECT_START
  @EFFECT: [类型][属性][操作][值]
  @EFFECT: [类型][属性][操作][值]
@EFFECT_END

效果格式详解

基本语法

  • 格式: @EFFECT: [类型][属性][操作][值]
  • 类型: 状态、技能、物品
  • 属性: 具体的属性名称
  • 操作: +(增加)、-(减少)
  • : 数值(可选,默认为1)

效果类型

  1. 状态效果(数值型,范围 0-100)

    @EFFECT: [状态][体力][+][10]    # 体力增加10
    @EFFECT: [状态][体力][-][5]     # 体力减少5
    @EFFECT: [状态][精神][+][15]    # 精神增加15
    @EFFECT: [状态][生命][-][20]    # 生命减少20
    
    • 特点: 必须指定具体数值
    • 范围: 最终值会被限制在 0-100 之间
    • 操作: 支持增加 [+] 和减少 [-]
  2. 技能效果(累积型,只增不减)

    @EFFECT: [技能][探索经验][+]    # 探索经验增加1次
    @EFFECT: [技能][制作技能][+]    # 制作技能增加1次
    
    • 特点: 不需要指定数值,默认增加1次
    • 限制: 只能使用 [+] 操作,不能减少
    • 累积: 每次执行都会累积经验
  3. 食物效果(数量型,可增减)

    @EFFECT: [食物][干粮][+][3]     # 获得3份干粮
    @EFFECT: [食物][淡水][+][2]     # 获得2份淡水
    @EFFECT: [食物][干粮][-][1]     # 消耗1份干粮
    @EFFECT: [食物][野果][+][5]     # 获得5个野果
    
    • 特点: 基于数量进行管理,可以累积和消耗
    • 操作: 支持 [+][-] 操作,必须指定数量
    • 累积: 多次获得会累积总数量
  4. 工具效果(存在型,可增减)

    @EFFECT: [工具][简易刀具][+]    # 获得简易刀具
    @EFFECT: [工具][火把][+]        # 获得火把
    @EFFECT: [工具][绳索][-]        # 失去绳索
    @EFFECT: [工具][指南针][+]      # 获得指南针
    
    • 特点: 基于拥有/不拥有状态,无数量概念
    • 操作: 支持获得 [+] 和失去 [-],无需指定数值
    • 状态: 以拥有/不拥有为准

效果执行

  • 效果在选择该选项时立即执行
  • 多个效果按顺序执行
  • 空的效果块表示无效果

游戏状态管理

状态系统

基础状态(数值型,范围 0-100)

  1. 生命 (生命)

    • 范围: 0-100
    • 用途: 角色的生命值,影响生存状态
    • 操作: 可增加 [+] 或减少 [-]
    • 示例: @EFFECT: [状态][生命][+][15]
  2. 体力 (体力)

    • 范围: 0-100
    • 用途: 角色的体力值,影响行动能力
    • 操作: 可增加 [+] 或减少 [-]
    • 示例: @EFFECT: [状态][体力][-][10]
  3. 精神 (精神)

    • 范围: 0-100
    • 用途: 角色的精神状态,影响决策和士气
    • 操作: 可增加 [+] 或减少 [-]
    • 示例: @EFFECT: [状态][精神][+][5]

状态使用规则

  • 数值范围: 所有状态值必须在 0-100 之间
  • 边界处理:
    • 当状态值降到 0 时,可能触发特殊事件
    • 当状态值达到 100 时,为最佳状态
  • 条件判断: 可用于选择条件中
    @COND: [状态][体力][>=][30]
    @COND: [状态][生命][>][50]
    

技能系统(累积型,只增不减)

技能特性

  • 增长方式: 只能增加,不能减少
  • 数值特性: 不存在具体数值,以累积次数计算
  • 扩展性: 可以无限扩展新的技能类型

当前技能类型(示例)

  • 探索经验: 探索相关技能
  • 制作技能: 制作相关技能
  • 狩猎技能: 狩猎相关技能
  • 捕鱼技能: 捕鱼相关技能
  • 导航技能: 导航相关技能
  • 航海技能: 航海相关技能
  • 觅食技能: 觅食相关技能
  • 信号技能: 信号相关技能
  • 耐心技能: 耐心相关技能
  • 准备技能: 准备相关技能
  • 生存技能: 生存相关技能

技能使用规则

  • 获得方式: 通过执行相关行动获得
    @EFFECT: [技能][探索经验][+]    # 获得探索经验
    @EFFECT: [技能][制作技能][+]    # 获得制作技能
    
  • 条件判断: 可用于选择条件中
    @COND: [技能][制作技能][>=][2]  # 需要至少2次制作经验
    @COND: [技能][探索经验][>][1]   # 需要超过1次探索经验
    
  • 扩展性: 可以根据游戏需要添加新的技能类型

物品系统(分类管理)

物品系统分为食物和工具两个子系统,分别采用不同的管理方式。

物品分类

  1. 食物系统(数量型)

    • 特性: 有具体数量,可以累积和消耗
    • 操作: 支持增加 [+] 和减少 [-] 操作,需要指定数量
    • 数值: 必须指定具体数值,表示增减的数量
    • 示例: 干粮、淡水、野果等
  2. 工具系统(存在型)

    • 特性: 只有拥有/不拥有状态,无数量概念
    • 操作: 支持获得 [+] 和失去 [-] 操作,无需指定数量
    • 数值: 无需指定数值,默认为存在状态
    • 示例: 简易刀具、火把、绳索等

当前物品类型(示例)

食物类型

  • 干粮: 基础食物
  • 淡水: 饮用水
  • 椰子: 天然食物
  • 野果: 采集食物
  • 鱼类: 捕获食物

工具类型

  • 简易刀具: 基础工具
  • 绳索: 制作材料
  • 水壶: 容器
  • 渔网: 捕鱼工具
  • 火堆: 生火设施
  • 火把: 照明工具
  • 求救信号: 救援道具
  • 地下水源: 水源设施
  • 地图碎片: 导航工具
  • 日记本: 信息物品
  • 指南针: 导航工具
  • 工具箱: 工具集合
  • 海图: 导航资料
  • 等等...

物品使用规则

食物规则

  • 获得方式: 通过行动获得食物,需要指定数量
    @EFFECT: [食物][干粮][+][3]     # 获得3份干粮
    @EFFECT: [食物][淡水][+][2]     # 获得2份淡水
    
  • 消耗方式: 通过行动消耗食物,需要指定数量
    @EFFECT: [食物][干粮][-][1]     # 消耗1份干粮
    @EFFECT: [食物][淡水][-][1]     # 消耗1份淡水
    
  • 条件判断: 可用于选择条件中
    @COND: [食物][干粮][>=][2]      # 需要至少2份干粮
    @COND: [食物][淡水][>][0]       # 需要有淡水
    

工具规则

  • 获得方式: 通过行动获得工具
    @EFFECT: [工具][简易刀具][+]    # 获得简易刀具
    @EFFECT: [工具][火把][+]        # 获得火把
    
  • 失去方式: 通过行动失去工具
    @EFFECT: [工具][绳索][-]        # 失去绳索
    @EFFECT: [工具][火把][-]        # 失去火把
    
  • 条件判断: 可用于选择条件中
    @COND: [工具][简易刀具][>=][1]  # 需要拥有简易刀具
    @COND: [工具][指南针][>][0]     # 需要拥有指南针
    
  • 扩展性: 可以根据游戏剧情添加新的物品类型

节点命名规范

节点ID命名规则

  1. 开始节点: START
  2. 普通节点: 使用大写字母和下划线,描述性命名
    • 示例: SEARCH_WRECK, FIND_SHELTER, COAST_EXPLORE
  3. 结局节点: 以 ENDING_ 开头
    • 示例: ENDING_RESCUED, ENDING_SURVIVORS_UNITE, ENDING_ISLAND_LIFE

命名最佳实践

  • 使用英文命名,便于程序处理
  • 名称应该简洁且具有描述性
  • 避免使用特殊字符和空格
  • 保持一致的命名风格

文件组织规范

文件结构建议

  1. 开始节点 放在文件开头
  2. 普通节点 按逻辑顺序排列
  3. 结局节点 放在文件末尾

注释规范

  • 可以使用 //# 添加注释
  • 注释不会影响游戏逻辑
  • 建议在复杂节点前添加说明注释

验证规则

必需验证

  1. 节点完整性

    • 每个节点必须有 @TYPE, @SUMMARY, @DESC
    • 每个选择必须有 @CHOICE_TEXT@TARGET
  2. 引用完整性

    • 所有 @TARGET 必须指向存在的节点
    • 避免循环引用导致的死循环
  3. 条件合理性

    • 状态条件值应该在 0-100 范围内
    • 技能条件值应该为正整数
    • 物品条件值通常为 0 或 1
    • 避免不可能满足的条件
  4. 效果合理性

    • 状态效果必须指定数值,且考虑 0-100 范围限制
    • 技能效果只能使用 [+] 操作,无需指定数值
    • 食物效果必须指定数量,支持 [+][-] 操作
    • 工具效果无需指定数值,支持 [+][-] 操作
  5. 条件合理性

    • 状态条件值应该在 0-100 范围内
    • 技能条件值应该为正整数
    • 食物条件值应该为非负整数,表示具体数量
    • 工具条件值通常为 0 或 1,表示拥有状态

建议验证

  1. 游戏平衡性

    • 状态变化应该合理,避免过大的数值波动
    • 技能获得频率应该适中
    • 物品获得和失去应该符合逻辑
  2. 剧情连贯性

    • 节点之间的逻辑关系应该合理
    • 描述文本应该与游戏状态一致
    • 选择文本应该清晰明确
  3. 系统一致性

    • 状态名称应该统一(生命、体力、精神)
    • 技能和物品命名应该保持一致性
    • 扩展的技能和物品应该遵循现有命名规范

扩展性考虑

当前系统的扩展特性

  1. 状态系统(固定)

    • 三个基础状态:生命、体力、精神
    • 数值范围固定为 0-100
    • 不建议扩展新的状态类型
  2. 技能系统(无限扩展)

    • 可以根据游戏需要添加任意新技能
    • 所有技能都遵循累积型、只增不减的规则
    • 建议使用描述性的中文名称
  3. 技能系统(无限扩展)

    • 可以根据游戏需要添加任意新技能
    • 所有技能都遵循累积型、只增不减的规则
    • 建议使用描述性的中文名称
  4. 食物系统(无限扩展)

    • 可以根据剧情需要添加任意新食物
    • 所有食物都遵循数量型、可增减的规则
    • 必须指定具体数量,支持累积和消耗
    • 建议使用描述性的中文名称
  5. 工具系统(无限扩展)

    • 可以根据剧情需要添加任意新工具
    • 所有工具都遵循存在型、可增减的规则
    • 无需指定数量,只有拥有/不拥有状态
    • 建议使用描述性的中文名称

未来可能的扩展

  1. 更复杂的条件系统

    • 支持 OR 逻辑运算
    • 支持嵌套条件判断
    • 支持复合条件表达式
  2. 更丰富的效果类型

    • 时间相关效果(延迟效果)
    • 随机事件触发
    • 条件性效果执行
  3. 多媒体支持

    • 图片引用和显示
    • 音效和背景音乐
    • 动画效果支持
  4. 高级游戏机制

    • 时间系统(日夜循环)
    • 天气系统
    • 随机事件系统
    • 多角色系统

扩展建议

  1. 技能扩展原则

    • 使用清晰的中文名称
    • 避免与现有技能重复
    • 考虑技能之间的逻辑关系
  2. 食物扩展原则

    • 使用描述性的中文名称
    • 考虑食物的获得和消耗场景
    • 设定合理的数量范围
    • 保持食物系统的平衡性
  3. 工具扩展原则

    • 使用描述性的中文名称
    • 考虑工具的获得和使用场景
    • 明确工具的功能和作用
    • 保持工具系统的逻辑性
  4. 向后兼容性

    • 新增功能不应影响现有故事文件
    • 保持核心语法的稳定性
    • 提供平滑的升级路径

示例模板

完整节点示例

[EXAMPLE_NODE]
@TYPE: NORMAL
@SUMMARY: 寻找食物和工具
@DESC: 你在海滩上发现了一些椰子和一根结实的木棍。椰子可以提供食物和水分,木棍可以制作成简易工具。你决定如何处理这些发现?

@CHOICE_START
@CHOICE_TEXT: 收集椰子作为食物储备
@TARGET: NEXT_NODE_1
@COND_START
@COND: [状态][体力][>=][20]
@COND_END
@EFFECT_START
@EFFECT: [食物][椰子][+][3]
@EFFECT: [状态][体力][-][5]
@EFFECT: [技能][采集经验][+]
@EFFECT_END
@CHOICE_END

@CHOICE_START
@CHOICE_TEXT: 制作简易工具
@TARGET: NEXT_NODE_2
@COND_START
@COND: [技能][制作技能][>=][1]
@COND_END
@EFFECT_START
@EFFECT: [工具][简易刀具][+]
@EFFECT: [状态][精神][+][10]
@EFFECT: [技能][制作技能][+]
@EFFECT_END
@CHOICE_END

@CHOICE_START
@CHOICE_TEXT: 既收集椰子又制作工具
@TARGET: NEXT_NODE_3
@COND_START
@COND: [状态][体力][>=][30]
@COND: [技能][制作技能][>=][1]
@COND_END
@EFFECT_START
@EFFECT: [食物][椰子][+][2]
@EFFECT: [工具][简易刀具][+]
@EFFECT: [状态][体力][-][10]
@EFFECT: [状态][精神][+][5]
@EFFECT: [技能][采集经验][+]
@EFFECT: [技能][制作技能][+]
@EFFECT_END
@CHOICE_END

@CHOICE_START
@CHOICE_TEXT: 休息一下,保存体力
@TARGET: NEXT_NODE_4
@EFFECT_START
@EFFECT: [状态][体力][+][5]
@EFFECT: [状态][精神][+][3]
@EFFECT_END
@CHOICE_END

系统使用示例

食物系统示例

# 获得食物
@EFFECT: [食物][干粮][+][5]        # 获得5份干粮
@EFFECT: [食物][淡水][+][3]        # 获得3份淡水
@EFFECT: [食物][野果][+][8]        # 获得8个野果

# 消耗食物
@EFFECT: [食物][干粮][-][2]        # 消耗2份干粮
@EFFECT: [食物][淡水][-][1]        # 消耗1份淡水

# 食物条件判断
@COND: [食物][干粮][>=][3]         # 需要至少3份干粮
@COND: [食物][淡水][>][0]          # 需要有淡水
@COND: [食物][野果][==][0]         # 没有野果时

工具系统示例

# 获得工具
@EFFECT: [工具][简易刀具][+]       # 获得简易刀具
@EFFECT: [工具][火把][+]           # 获得火把
@EFFECT: [工具][绳索][+]           # 获得绳索

# 失去工具
@EFFECT: [工具][火把][-]           # 失去火把
@EFFECT: [工具][绳索][-]           # 失去绳索

# 工具条件判断
@COND: [工具][简易刀具][>=][1]     # 需要拥有简易刀具
@COND: [工具][火把][>][0]          # 需要拥有火把
@COND: [工具][绳索][==][0]         # 没有绳索时

综合系统示例

# 复合条件:需要工具和食物
@COND: [工具][简易刀具][>=][1]     # 需要刀具
@COND: [食物][干粮][>=][2]         # 需要至少2份干粮
@COND: [状态][体力][>=][30]        # 需要足够体力

# 复合效果:消耗食物,使用工具,获得技能
@EFFECT: [食物][干粮][-][1]        # 消耗1份干粮
@EFFECT: [状态][体力][+][15]       # 恢复体力
@EFFECT: [技能][生存技巧][+]       # 获得生存经验

基础节点模板

[NODE_ID]
@TYPE: NORMAL
@SUMMARY: 节点摘要
@DESC: 详细的节点描述,描述当前情况和环境。
@CHOICE_START
  @CHOICE_TEXT: 选择1的描述
  @TARGET: TARGET_NODE_1
  @COND_START
    @COND: [状态][体力][>=][20]
  @COND_END
  @EFFECT_START
    @EFFECT: [状态][体力][-][10]
    @EFFECT: [技能][探索经验][+]
  @EFFECT_END
@CHOICE_END
@CHOICE_START
  @CHOICE_TEXT: 选择2的描述
  @TARGET: TARGET_NODE_2
  @COND_START
  @COND_END
  @EFFECT_START
    @EFFECT: [状态][精神][+][5]
  @EFFECT_END
@CHOICE_END

结局节点模板

[ENDING_NAME]
@TYPE: ENDING
@SUMMARY: 结局摘要
@DESC: 结局的详细描述,总结玩家的经历和结果。
@CHOICE_START
  @CHOICE_TEXT: 重新开始游戏
  @TARGET: START
  @COND_START
  @COND_END
  @EFFECT_START
  @EFFECT_END
@CHOICE_END

总结

这个故事文件格式提供了一个灵活而强大的框架来创建交互式文本冒险游戏。通过合理使用条件和效果系统,可以创建复杂的游戏机制和引人入胜的故事体验。

遵循本规范可以确保故事文件的一致性、可维护性和可扩展性。