160 - API文档汉化 - 地图与遭遇战
Updated 2 weeks ago地图与遭遇战
自定义地图与遭遇战
与能力不同,遭遇战通过枚举和字符串的组合编码到游戏数据中。例如,对手由Opponent.Type枚举定义,但特殊序列器和独特AI规则则以字符串形式嵌入每个遭遇战数据中。
要创建自定义遭遇战(例如自定义头目战),您需要组合使用对手类型、特殊序列器和AI规则。
遭遇战回合计划
创建遭遇战时,需同时制定决定对战过程中出牌顺序的回合计划。本API提供多种方法简化此流程。
以下示例将创建一个14回合的回合计划,其卡牌序列如下: 第1回合 - 打出2张寻骨猎犬;其生成槽位由游戏自动选择(制定回合计划时无法控制) 第2-3回合 - 不出牌 第4回合 - 打出1张骨堆 第5回合 - 打出1张骨堆(当难度≥10时替换为寻骨猎犬) 第6回合 - 不出牌 第7回合 - 打出1张骨堆 随后重复第1-7回合一次。
using static InscryptionAPI.Encounters.EncounterManager;
private void AddEncounters()
{
CardBlueprint bonePile_rp = NewCardBlueprint("Bonepile").SetReplacement("Bonehound", 10);
List<List<CardBlueprint>> turnPlan = new()
{
CreateTurn("Bonehound", "Bonehound"),
CreateTurn(),
CreateTurn(),
CreateTurn("Bonepile"),
CreateTurn(bonePile_rp),
CreateTurn(),
CreateTurn("Bonepile")
};
New("ExampleEncounter").AddTurns(turnPlan).DuplicateTurns(1);
}
提供以下便捷方法:
- New: 创建新的EncounterBlueprintData实例并添加到API(不会自动添加到任何区域)
- NewCardBlueprint: 创建新CardBlueprint
- CreateTurn: 创建表示单个回合的List<CardBlueprint>,可传入卡牌名称、CardBlueprint对象或留空表示空回合
扩展方法分类说明:
- EncounterBlueprintData
- SetDifficulty: 设置遭遇战可触发的最低/最高难度
- AddDominantTribes: 用于图腾战,决定可能使用的图腾顶部
- SetRegionSpecific: 游戏未使用,仅作保留(除非您有自定义用途)
- AddRandomReplacementCards: 设置卡牌可能被随机替换的候选卡
- SetRedundantAbilities: 设置图腾战中莱西不能选择的能力
- SetUnlockedCardPrerequisites: 设置本遭遇战中可使用的卡牌解锁条件
- AddTurnMods: 在第三章中,用于在指定回合对指定难度以上的卡牌进行超频
- AddTurn/AddTurns: 添加单个/多个回合
- DuplicateTurns: 按指定次数复制现有回合
- SyncDifficulties: 同步回合计划中所有卡牌的最低/最高难度
- CardBlueprint
- SetDifficulty: 设置卡牌可被使用的最低/最高难度
- SetReplacement: 设置当难度≥指定值时替换的卡牌
- List<CardBlueprint>
- SetTurnDifficulty: 设置列表中每张卡牌的难度范围
- DuplicateTurn: 按指定次数复制当前回合列表(需配合AddTurns()使用)
添加地图节点
添加自定义地图节点时,需准备实现可能复杂的游戏逻辑。每个新节点都需要一个“序列器”类来控制节点触发事件,包括:
- 游戏对象创建
- 对象动画
- 玩家牌组操作
- 其他自定义功能
序列器类必须实现ICustomNodeSequencer
接口,否则API无法正确执行事件。API提供两个模板类简化开发:
CustomNodeSequencer
:基础抽象类,已实现所有节点相关接口CustomCardChoiceNodeSequencer
:专用于自定义卡牌选择节点
强烈建议反编译游戏原生节点序列器类以理解其工作机制
除序列器外,还需创建节点地图动画。这需要提供4张49x49像素的纹理数组,若需模拟游戏节点的“抖动”效果,纹理内容应保持相似。
最终通过API注册节点:
Assembly asm = typeof(MyCustomSequencer).Assembly;
NewNodeManager.New(
"MyPluginGUID", "MyCustomNode",
GenerationType.SpecialEvent, typeof(MyCustomSequencer),
new List<Texture2D> {
TextureHelper.GetImageAsTexture("animated_node_1.png", asm),
TextureHelper.GetImageAsTexture("animated_node_2.png", asm),
TextureHelper.GetImageAsTexture("animated_node_3.png", asm),
TextureHelper.GetImageAsTexture("animated_node_4.png", asm)
}
);
GenerationType是标志位枚举,定义节点生成位置(可用按位或运算符|
组合):
- None: 不自动生成,但可手动添加(如手动操作第三章地图时)
- SpecialCardChoice: 出现在战后随机事件池
- SpecialEvent: 出现在战前随机事件池
- RegionStart: 强制出现在每张地图起点(除非条件不满足)
- PreBoss: 强制出现在头目战前(除非条件不满足)
- PostBoss: 强制出现在头目战后(除非条件不满足)
条件节点
可通过SelectionCondition
类实现节点生成条件逻辑。注册节点时可添加两种条件类型:
- 前提条件(任一条件为false则阻止生成)
- 强制生成条件(任一条件为true则强制生成)
游戏内置基础条件:
- CardsInDeckTraits: 检查牌组卡牌是否含有指定特质(可设黑/白名单)
- EitherOr: 检查是否满足任意给定条件
- IsAscension: 检查是否处于凯茜模组模式
- PastRunsCompleted: 检查已完成运行次数是否≥指定值
- PreviousNodes/RowContent: 检查历史节点/上一行节点是否包含指定NodeType(可设黑/白名单)
- StoryEventCompleted: 检查指定剧情事件是否完成
- WithinGridYRange: 检查当前节点位置是否在Y轴范围内
API扩展条件:
- ChallengeIsActive: 检查指定挑战是否激活(可设黑/白名单)
- NumChallengesOfTypeActive: 根据greaterThanNumActive参数比较激活挑战数量
示例代码:
NewNodeManager.New(
"MyPluginGUID", "MyCustomNode",
GenerationType.SpecialEvent, typeof(MyCustomSequencer),
/* 纹理列表 */,
new List<NodeData.SelectionCondition> {
new ChallengeIsActive(AscensionChallenge.BaseDifficulty, exclude: true) // 当无BaseDifficulty挑战激活时阻止生成
},
new List<NodeData.SelectionCondition> {
new NumChallengesOfTypeActive(AscensionChallenge.BaseDifficulty, 2, greaterThanNumActive: false) // 当≥2个BaseDifficulty挑战激活时强制生成
}
);
Pages
- 0 - 邪恶冥刻模组简体中文语言包Wiki
- 100 - API文档汉化 - 首页
- 110 - API文档汉化 - 入门指南
- 120 - API文档汉化 - 卡牌
- 121 - API文档汉化 - 自定义卡牌费用系统
- 122 - API文档汉化 - 会说话的卡牌
- 123 - API文档汉化 - 自定义毛皮
- 130 - API文档汉化 - 能力
- 131 - API文档汉化 - 自定义触发器
- 132 - API文档汉化 - 自定义狙击逻辑
- 133 - API文档汉化 - 伤害护盾行为
- 134 - API文档汉化 - 卡槽修改功能
- 135 - API文档汉化 - 触发器与执行顺序
- 140 - API文档汉化 - 自定义/扩展属性
- 150 - API文档汉化 - 扬升(凯茜模组)
- 160 - API文档汉化 - 地图与遭遇战
- 170 - API文档汉化 - 对手
- 180 - API文档汉化 - 图腾
- 190 - API文档汉化 - 道具
- 1A0 - API文档汉化 - 规则书
- 1A1 - API文档汉化 - 添加自定义页面
- 1A2 - API文档汉化 - 添加文本重定向功能
- 1B0 - API文档汉化 - 本地化
- 1B0 - API文档汉化 - 声音
- 1B0 - API文档汉化 - 资产包
- 1C0 - API文档汉化 - 其他特性
- 200 - JSONLoader文档汉化 - Wiki
- 201 - JSONLoader文档汉化 - 枚举值
- A00-凯茜模组通用信息站汉化-首页
- A10-凯茜模组通用信息站汉化-安装
- A11-凯茜模组通用信息站汉化-技术支持常见问题
- A12-凯茜模组通用信息站汉化-补丁
- A20-凯茜模组通用信息站汉化-入门指南
- A30-凯茜模组通用信息站汉化-一般常见问题
- A40-凯茜模组通用信息站汉化-游戏机制
- A50-凯茜模组通用信息站汉化-装饰选项
- A60-凯茜模组通用信息站汉化-与原版游戏的差异
- A70-凯茜模组通用信息站汉化-解锁
- A71-凯茜模组通用信息站汉化-初始牌组
- A72-凯茜模组通用信息站汉化-道具
- A73-凯茜模组通用信息站汉化-卡牌
- A74-凯茜模组通用信息站汉化-伊耶拉克的细节
- A75-凯茜模组通用信息站汉化-挑战
- A76-凯茜模组通用信息站汉化-最终头目
- A77-凯茜模组通用信息站汉化-成就
- A80-凯茜模组通用信息站汉化-提示:挑战提示
- A81-凯茜模组通用信息站汉化-提示:地图节点
- A82-凯茜模组通用信息站汉化-提示:印记
- A90-凯茜模组通用信息站汉化-背景故事
- AA0-凯茜模组通用信息站汉化-ARG解谜
- AA1-凯茜模组通用信息站汉化-ARG事件概览
- AA2-凯茜模组通用信息站汉化-磐石卡牌
- AA3-凯茜模组通用信息站汉化-命令:DAMPNSOGGY
- AA4-凯茜模组通用信息站汉化-命令:RAZORSHARP
- AA5-凯茜模组通用信息站汉化-命令:PALESICKLY
- AA6-凯茜模组通用信息站汉化-命令:LEMONLIMES
- AA7-凯茜模组通用信息站汉化-命令:THESHIPWILLRISEAGAIN
- AA8-凯茜模组通用信息站汉化-频道:#prospector
- AA9-凯茜模组通用信息站汉化-频道:#angler
- AAA-凯茜模组通用信息站汉化-频道:#trader
- AAB-凯茜模组通用信息站汉化-频道:#_-_-_-_-_
- AAC-凯茜模组通用信息站汉化-管理员笔记
- AAD-凯茜模组通用信息站汉化-木雕师的消息
- AAE-凯茜模组通用信息站汉化-提示和工具
- AAF-凯茜模组通用信息站汉化-ARG文档
- AAG-凯茜模组通用信息站汉化-前传ARG
- AB0-凯茜模组通用信息站汉化-趣事:名人堂
- AB1-凯茜模组通用信息站汉化-趣事:耻辱柱
- AB2-凯茜模组通用信息站汉化-趣事:以及其他有趣内容……
- AB3-凯茜模组通用信息站汉化-趣事:全挑战模式胜利记录
- ABC-凯茜模组通用信息站汉化-趣事:解谜和游戏
- AC0-凯茜模组通用信息站汉化-“作弊”:存档修改
- AC1-凯茜模组通用信息站汉化-“作弊”:重复读档
- AD0-凯茜模组通用信息站汉化-漏洞和代码注释