200 - JSONLoader文档汉化 - Wiki

Updated 3 weeks ago

JsonLoader 维基文档

生成器列表

以下是JSONLoader可用的生成器及相关资源:

生成器类型 文件扩展名 链接 额外要求
动态立绘 .json https://tinyurl.com/Animjsons 需安装: https://inscryption.thunderstore.io/package/KellyBetty/SpritesheetAPI/
头目卡牌 _giant.json https://tinyurl.com/GiantCardsMaker 需安装: https://inscryption.thunderstore.io/package/Cevin2006/GiantCardAPI/
头目对话 _bd.json https://tinyurl.com/BDGenerator 需安装: https://inscryption.thunderstore.io/package/KellyBetty/JSON_Boss_Dialogue/
卡牌 .jldr2 https://tinyurl.com/JsonCardMaker5
自定义卡包 .jlpk https://tinyurl.com/jlpkgen2 需安装: https://inscryption.thunderstore.io/package/Infiniscryption/Pack_Management_API/
遭遇战 _encounter.jldr2 http://tinyurl.com/JsonEncountersV5
留声机音轨 _gram.jldr2 https://tinyurl.com/GramophoneJLDR2
语言包 _language.jldr2 https://tinyurl.com/CustomLanguageJsonGenerator
面具 _mask.jldr2 https://tinyurl.com/MaskJsonGeneratorV2
模组清单 .json https://tinyurl.com/EasyuseManifestMakerTS 上传模组至Thunderstore的必要文件
印记 _sigil.jldr2 https://tinyurl.com/IKnowWhatImDoingConfigils4
初始牌组 _deck.jldr2 https://tinyurl.com/StarterDecksJsonV3
会说话的卡牌 _talk.jldr2 https://tinyurl.com/TalkingCardJSON
族群 _tribe.jldr2 https://tinyurl.com/TribeSchema2

额外资源

所有枚举类型(含模组): https://github.com/SaxbyMod/SabyModEnums/wiki

印记配置(Configils)维基: https://docs.google.com/document/d/1QLAfomaTcatm-foU2P1ZoqGQFFvhCfmEnN4jIxAWceQ/edit?usp=sharing

动态立绘制作建议:使用https://www.pixilart.com/draw制作GIF并导出为精灵图!

官方JSONLoader维基: https://github.com/MADH95/JSONLoader/wiki

动态立绘

动态立绘是独立API,允许创建动态卡牌立绘。例如通过制作114x94像素的帧序列图,可使蜜蜂呈现飞行效果。文件存储为.json且无需后缀。

字段 必填? 类型 功能说明
CardName 字符串 指定应用此文件的卡牌名称,格式应为GUID_Name
Spritesheet 字符串 精灵图文件路径
FrameRate 整数 设置播放帧率(FPS)
FrameCount 整数 指定精灵图总帧数
HasPause 布尔值 是否在播放中插入暂停
PauseTime 整数 当HasPause启用时,设置暂停时长

动态立绘示例

{
  "CardName": "Goat",         // 应用对象为黑山羊
  "Spritesheet": "MaidGoatAnim.png",  // 精灵图文件
  "FrameRate": 20,            // 20帧/秒
  "FrameCount": 10            // 共10帧
}

头目对话

头目对话也是独立的API,允许修改KCM(即凯茜模组)中任何头目的原始对话。文件扩展名为.json,后缀为_bd。基础字段如下:

字段 必填? 类型 功能说明
Filename 字符串 对话集合名称(游戏内显示)
Description 字符串 对话模式描述(游戏内显示在Filename下方)
Prospector 对象 修改矿工对话。详见矿工对话章节
Angler 对象 修改钓鱼人对话。详见钓鱼人对话章节
TrapperTrader 对象 修改猎人与毛皮商对话。详见猎人/毛皮商对话章节
Leshy 对象 修改莱西对话。详见莱西对话章节
Royal 对象 修改罗亚尔对话。详见罗亚尔对话章节

矿工对话字段

字段 必填? 类型 功能说明
PreIntro 字符串 莱西介绍矿工前的台词
Intro 字符串 矿工自我介绍台词
BeforePickaxe 字符串 挥动镐子前的台词
AfterPickaxe 字符串 将卡牌转化为金块后的台词
IfNoGold 字符串 挥镐后场上无金块时的台词
MuleKilled 字符串 骡子死亡时的台词

钓鱼人对话字段

字段 必填? 类型 功能说明
PreIntro 字符串 莱西介绍钓鱼人前的台词
Intro 字符串 钓鱼人自我介绍台词
GoFish 字符串 使用鱼钩机制前的台词(放置大白鲨时也会触发)
AimingHook 字符串 准备将卡牌钩到己方时的台词
EasyChoose 字符串 选定要钩取的卡牌后的台词
HookPull 字符串 成功钩取卡牌时的台词

猎人/毛皮商对话字段

字段 必填? 类型 功能说明
PreIntro 字符串 莱西介绍猎人前的台词
Intro 字符串 猎人自我介绍台词
PrePhase2 字符串 第二阶段切换前的台词
Phase2 字符串 切换为毛皮商时的台词
PreTrade 字符串 毛皮交易前的台词
Trade 字符串 交易过程中的台词
PostTrade 字符串 交易完成后的台词

莱西对话字段

字段 必填? 类型 功能说明
Intro 字符串 莱西自我介绍台词
AddCandle 字符串 作弊添加第三根蜡烛时的台词
Deathcards_Intro 字符串 第二阶段开始时介绍死亡卡牌的台词
Deathcards_Outro 字符串 第二阶段结束时的台词
PreMoon 字符串 放置月亮前的台词
MoonPlaced 字符串 放置月亮时的台词
StinkyMoon 字符串 当臭臭卡牌对阵月亮时的台词
MoonDestroyed 字符串 月亮被摧毁时的台词

罗亚尔对话字段

字段 必填? 类型 功能说明
LeshyConfusion 字符串 莱西看到罗亚尔头骨替代普通头骨时的台词
WakeUp 字符串 罗亚尔头骨苏醒时的台词
PreIntro 字符串 莱西介绍罗亚尔前的台词
Intro 字符串 罗亚尔自我介绍台词
Cannons 字符串 放置大炮时的台词
CannonFire 字符串 开炮时的台词
Rodents 字符串 赠送耗子包裹时的台词
Limoncello_Charge 字符串 召唤柠檬琴号时的台词
LeshyStop 字符串 莱西阻止柠檬琴号移动时的台词
Limoncello_Intro 字符串 放置柠檬琴号时的台词
Limoncello_Mutinee 字符串 船员跳船时的台词
Limoncello_NoCards 字符串 所有船员离船时的台词
Limoncello_Sunk 字符串 船只沉没时的台词
Defeated 字符串 战败时的台词
Farewell 字符串 制作人员名单播放前的告别台词

对话示例

{
  "FileName": "KEVIN CLICK THIS!",        // 对话集合名称
  "Description": "MAKES THE BOSSES KNOW KEVIN!",  // 描述
  "Prospector": {                         // 矿工对话
    "BeforePickaxe": "Why do you always forget, KEVIN!",  // 替换挥镐前台词
    "AfterPickaxe": "TOO BAD, SO SAD, KEVIN!",            // 替换挥镐后台词
    "IfNoGold": "Damn, you remembered, I did not expect this!",  // 替换无金块台词
    "MuleKilled": "NOT MY MULE! WHY, KEVIN, WHY?"         // 替换骡子死亡台词
  },
  "Angler": {                              // 钓鱼人对话
    "GoFish": "FISH A NEW CARD!",          // 替换钓鱼台词
    "AimingHook": "THIS ONE SHALL DO!",    // 替换瞄准台词
    "EasyChoose": "I TAKE THIS LITTLE FISHIE",  // 替换选择台词
    "HookPull": "DID YOU REALLY JUST DO THAT?"  // 替换钩取台词
  },
  "TrapperTrader": {                       // 猎人/毛皮商对话
    "PrePhase2": "GOODBYE KEVIN *TRAP SHUTS*",  // 替换阶段切换前台词
    "Phase2": "HELLO KEVIN *BELL DINGS*",       // 替换阶段切换台词
    "PreTrade": "I SHALL TAKE THOSE FINE PELTS!",  // 替换交易前台词
    "Trade": "CHOOSE THE BEST, KEVY BOY!",        // 替换交易台词
    "PostTrade": "I WOULD HAVE CHOSEN BETTER, KEVIN!"  // 替换交易后台词
  }
}

卡牌制作

在JsonLoader中创建卡牌相对简单,只需在插件文件夹中新建一个.jldr2文件,并填入包含以下字段的JSON:

字段 必填? 字段类型 功能说明
name 字符串 卡牌的代码内部名称,通常不会显示在卡面上(除非未设置displayedName)。此处不允许使用空格。
modPrefix 字符串 用于区分基础游戏或其他模组的标识符。此处不允许使用空格。
displayedName 字符串 玩家视角下卡牌的显示名称(如游戏内卡面所示)。
description 字符串 莱西首次介绍该卡牌时的描述文本。
metaCategories 字符串数组 定义卡牌出现的卡池,留空则不会出现在任何卡池。可选元类别:ChoiceNodeTraderOfferPart3RandomRareGBCPackGBCPlayable
cardComplexity 字符串 决定第一幕中卡牌出现的阶段。可选值:AdvancedIntermediateSimpleVanilla
temple 字符串 指定卡牌所属的冥刻者神殿(主要用于第二幕)。可选值:NatureTechUndeadWizard
baseAttack 整数 卡牌的基础攻击力(最低为0)。
baseHealth 整数 卡牌的基础生命值(技术上最低为1)。
hideAttackAndHealth 布尔值 是否隐藏卡牌的攻击力和生命值显示。
bloodCost 整数 召唤该卡牌需消耗的血祭数量。
bonesCost 整数 召唤该卡牌需消耗的骨头数量。
energyCost 整数 召唤该卡牌需消耗的能量点数。
gemsCost 字符串数组 召唤该卡牌需消耗的宝石类型及数量。可选值:BlueGreenOrange
specialStatIcon 字符串 卡牌上显示的特殊状态图标(支持基础游戏或模组添加)。
tribes 字符串数组 卡牌所属的族群(支持基础游戏或模组添加)。
traits 字符串数组 卡牌具有的特质(支持基础游戏或模组添加)。
specialAbilities 字符串数组 卡牌的特殊能力(支持基础游戏或模组添加)。
abilities 字符串数组 卡牌的常规能力(支持基础游戏或模组添加)。
evolveIntoName 字符串 当卡牌拥有/获得进化能力时,将转变为此字段指定的卡牌(需填写目标卡牌的代码名称)。
evolveTurns 整数 卡牌进化所需的回合数。
defaultEvolutionName 字符串 当卡牌没有指定进化目标时的默认名称(例如基础游戏中Dam卡牌进化后会变为God Dam)。
tailName 字符串 当卡牌断尾时生成的卡牌代码名称。
tailLostPortrait 字符串 卡牌断尾后使用的肖像图(尺寸必须为114x94像素)。
iceCubeName 字符串 卡牌从冰封状态解冻后转变的目标卡牌代码名称。
flipPortraitForStrafe 布尔值 卡牌移动时是否根据方向翻转肖像。
onePerDeck 布尔值 该卡牌是否在牌组中具有唯一性。
appearanceBehavior 字符串数组 卡牌的外观行为(支持基础游戏或模组添加)。
texture 字符串 3D场景中卡牌的肖像图(尺寸必须为114x94像素)。
emissionTexture 字符串 能力转移等情况下覆盖在卡牌上的发光图层(尺寸必须为114x94像素)。
altTexture 字符串 玩家持有山羊之眼时的替代肖像(尺寸必须为114x94像素)。
altEmissionTexture 字符串 玩家持有山羊之眼时的替代发光图层(尺寸必须为114x94像素)。
pixelTexture 字符串 2D场景或KCM界面中的卡牌像素图(建议尺寸41x28像素)。
titleGraphic 字符串 替代卡牌名称的标题图像(建议尺寸123x28像素)。
decals 字符串数组 完全覆盖卡牌的装饰图层(尺寸必须为125x190像素)。
extensionProperties 对象 模组扩展属性区(例如Custom Side Deck by TVF Labs模组添加的字段)。

注:未包含的非必填字段通常默认为禁用状态。

卡牌JSON示例

{
  "name": "LFTD_Cicada", // 卡牌的代码内部名称
  "modPrefix": "LFTD", // 模组标识符
  "displayedName": "蝉", // 游戏内显示名称
  "description": "那永远惹人生厌的蝉,其嗡鸣声远至数里可闻。", // 莱西的介绍文本
  "metaCategories": [
    "ChoiceNode",
    "TraderOffer"
  ], // 赋予该卡牌ChoiceNode和TraderOffer元类别
  "cardComplexity": "Simple", // 设置为简单复杂度
  "temple": "Nature", // 指定为莱西的卡牌
  "baseAttack": 1, // 攻击力设为1
  "baseHealth": 1, // 生命值设为1
  "bloodCost": 2, // 消耗2点血祭
  "tribes": [
    "Insect"
  ], // 赋予昆虫族群属性
  "abilities": [
    "BuffEnemy",
    "LFTD.Swarm"
  ], // 赋予"惹人生厌"印记及模组新增的"蜂群"能力
  "tailName": "Tail_Insect", // 断尾时生成昆虫类尾巴
  "texture": "LFTD_Cicada.png", // 卡牌肖像图
  "emissionTexture": "LFTD_Cicada_emission.png" // 发光图层
}

卡包系统

此独立API允许通过KCM界面启用/禁用卡包,文件格式为无后缀的.jlpk

字段 必填? 字段类型 功能说明
Title 字符串 卡包的显示名称。
Description 字符串 游戏内显示的卡包简短描述。
ModPrefix 字符串 卡包内卡牌的通用标识符(例如设为JSON时,将包含所有GUID为JSON的卡牌)。
PackArt 字符串 卡包图标的文件路径(未设置时API会自动生成)。图像尺寸为46x74像素。
ValidFor 字符串数组 指定适用的KCM菜单冥刻者神殿类型。可选枚举:MagnificusPackGrimoraPackP03PackLeshyPack
SplitPackByCardTemple 布尔值 是否根据卡牌所属冥刻者拆分为多个卡包(例如,如果你有5张莱西卡牌、20张P03卡牌、10张蔓尼菲科卡牌和3张格里魔拉卡牌,它会将它们拆分成4个卡包,每个神殿对应一个卡包,即分别包含5张、20张、10张和3张卡牌)。

卡包JSON示例

{
  "Title": "阿兹特克公会", // 卡包标题
  "Description": "这是阿兹特克人为提升游戏体验而创造的卡牌公会。", // 描述文本
  "ModPrefix": "AZTEC", // 关联的模组标识符
  "PackArt": "AZTECIAN_Pack_Icon.png", // 卡包图标文件
  "validFor": [ // 适用于所有冥刻者类型
    "LeshyPack",
    "P03Pack",
    "GrimoraPack",
    "MagnificusPack"
  ],
  "SplitPackByCardTemple": true // 按冥刻者类型拆分卡包
}

遭遇战配置

运作机制解析?本指南旨在提供帮助!

需要了解的关键事项:

  • 保存遭遇战文件时必须以"_encounter.jldr2"结尾
  • 记得检查json格式是否有效(推荐使用jsonlint网站验证)
  • 使用自定义卡牌创建遭遇战时,需使用内部名称(包括前缀,例如:IGCC_Boar

各组件独立运作说明:

组件 描述 示例
name 内部名称,供debugmenu测试遭遇战时使用 name: "Example.JungleTheme"
minDifficulty 遭遇战开始出现所需达到的关卡进度,由地图节点和KCM挑战骷髅头决定(冗余项:当前已失效,建议设为1) minDifficulty: 6
maxDifficulty 遭遇战停止出现所需达到的关卡进度(冗余项:当前已失效,建议设为99) maxDifficulty: 32
regions 遭遇战出现的地图区域,可多选 regions: [ "Wetlands", "Alpine", "Forest"]
dominantTribes 图腾战时优先选择的族群 "dominantTribes":["Feline"]
randomReplacementCards 当卡槽定义randomReplacementChance时,从该池中随机选取的卡牌 "randomReplacementCards": [ "Stoat", "Sparrow", "Snapper" ]
redundantAbilities 图腾战中不会出现的能力 "redundantAbilities": ["TouchOfDeath"]
turns 遭遇战的完整蓝图 "turns": [{ }]
cardInfo 单行战斗序列蓝图,卡牌位置随机生成 "cardInfo":[{card:"Wolf"},{card:"Opposum"}]
card 指定卡牌类型 "card": RatKing
randomReplaceChance card被randomReplaceCards池中卡牌随机替换的概率(百分比) "randomReplaceChance":50
difficultyReq 当玩家达到指定等级时(基于节点进度和挑战骷髅头),difficultyReplacement卡牌替换原卡牌的等级要求 "difficultyReq": 16
difficultyReplacement 当满足difficultyReq等级要求时,替换原卡牌的卡牌类型

地图枚举对照:

内部名称 游戏内显示 对应Boss地图
Alpine 雪线 猎人兼毛皮商
Wetlands 湿地 钓鱼人
Forest 林地 矿工
Midnight 莱西 最终头目
Midnight_Ascension 莱西(KCM) KCM模式最终头目
Pirateville 罗亚尔 替代最终头目

除非安装允许在最终头目前战斗的模组,否则Midnight、Midnight_Ascension和Pirateville均为冗余项。

配置示例:

{
  "name": "Example.BirdEncounter",
  //内部名称
  
  "minDifficulty": 1,
  //遭遇战出现所需最小进度(已失效,建议保持为1)
  
  "maxDifficulty": 32,
  //遭遇战停止出现所需最大进度(已失效,建议设为较高值)
  
  "regions": [
    "Alpine",
    "Forest"
  ],
  //遭遇战出现的地图区域(指定雪线和林地,仅出现在Prospector和Trapper/Trader地图)
  
  "dominantTribes": ["Bird"],
  //图腾战使用的族群类型
  
  "randomReplacementCards": [
    "Sparrow",
    "RavenEgg",
    "Porcupine",
    "AntFlying",
    "Cuckoo",
    "Adder",
    "Bee"
  ],
  //随机替换卡牌池
  
  "redundantAbilities": ["Flying"],
  //图腾战禁用能力
  
  "turns": [
    {
      "cardInfo": [
        //第一波次
        {
          //第一张卡
          "card": "Sparrow",
          //指定"麻雀"
          
          "randomReplaceChance": 50,
          //50%概率被randomReplacementCards池中的卡牌替换
          
          "difficultyReq": 15,
          //达到15级难度后替换原卡
          
          "difficultyReplacement": "Vulture"
          //满足等级要求后替换为"秃鹫"
        },
        {
          //第二张卡
          "card": "RavenEgg",
          "randomReplaceChance": 25,
          "difficultyReq": 10,
          "difficultyReplacement": "Raven"
        }
      ]
    },
    {
      //第二波次
      "cardInfo": [
        {
          "card": "Sparrow",
          "randomReplaceChance": 50,
          "difficultyReq": 15,
          "difficultyReplacement": "Vulture"
        },
        {
          "card": " ",
          //留空表示不放置卡牌,可用于隐藏卡牌直到满足特定条件
          "randomReplaceChance": 25,
          "difficultyReq": 10,
          "difficultyReplacement": "Raven"
        }
      ]
    }
  ]
}

留声机音轨配置

留声机音轨是JSONLoader中第二容易创建的要素,仅次于初始牌组(仅因需要制作/获取音轨文件)。文件应以.json为扩展名,并带有_gram后缀。

字段 是否必需 字段类型 功能说明
Prefix 字符串 确定音轨所属模组/ID的标识前缀
Tracks 字符串数组 定义该文件加载的音轨列表
Track 字符串 指定加载的音频文件名(位于Tracks数组内),支持格式:.mp3, .wav, .ogg, .aiff, .aif
Volume 整数 设置音轨音量(0-1之间的值,如0.5表示半音量播放)

音轨配置示例

{
  "Prefix": "Saxby", // 定义音轨来源模组
  "Tracks": [ // 加载括号内的音轨
    { // 加载.wav格式音轨(半音量)
      "Track": "TestTrackA.wav",
      "Volume": 0.5
    },
    { // 加载.mp3格式音轨(全音量)
      "Track": "TestTrack2.mp3",
      "Volume": 1
    }
  ]
}

初始牌组配置

初始牌组是JSONLoader中最易创建的要素之一。牌组可包含任意数量卡牌(最低要求3张)。创建时需新建带_deck后缀的.jldr2文件,并按以下字段结构配置json:

字段 是否必需 字段类型 功能说明
decks 对象 牌组存储的父级容器
name 字符串 牌组显示名称
iconTexture 字符串 牌组图标(35x44像素图像)
cards 字符串数组 牌组包含的卡牌列表,基础游戏卡牌名称参考:https://github.com/SaxbyMod/SabyModEnums/wiki/Card-Names-Wiki

牌组配置示例

详细配置示例如下:

{
  "decks": [ // 管理文件内所有牌组
    { // 注册测试牌组A
      "name": "TestDeckA", // 命名牌组A
      "iconTexture": "TestDeckA.png", // 设置牌组A图标
      "cards": [ // 管理牌组A的卡牌
        "AboveCurve", // 加入跑赢曲线
        "AnnoyTower", // 加入恼人广播站
        "DUMMY_5-5" // 加入第二幕的假人
      ]
    },
    { // 注册测试牌组B
      "name": "TestDeckB", // 命名牌组B
      "iconTexture": "TestDeckB.png", // 设置牌组B图标
      "cards": [ // 管理牌组B的卡牌
        "Goat", // 加入黑山羊
        "Moose", // 加入雄驼鹿
        "Grizzly" // 加入灰熊
      ]
    }
  ]
}

会说话的卡牌

本文将指导你如何使用JSONCardLoader制作具有对话功能的卡牌。

JSONCardLoader为会说话的卡牌提供以下功能支持:

  • 自定义动态肖像
  • 响应多种游戏事件的自定义对话内容
  • 通过短音频文件添加自定义语音
  • 支持在对话中切换面部表情

所有功能均通过JSON文件实现。你无需加载任何Unity预制件或类似资源——仅需准备若干图像文件并在JSON中引用即可。

准备工作

你需要基于一张已存在的卡牌进行改造。可使用JSONLoader创建新卡牌,具体说明请参阅JSONCardLoader的Thunderstore页面。

同时需要新建一个JLDR2格式文件,该文件需包含会说话卡牌的所有必要信息。此JSON文件名必须以"_talk.jldr2"结尾,否则将导致各类运行问题。

下文将详细解析"_talk.jldr2"文件结构。

文件结构

强烈建议使用此JSON生成器创建你的JSON文件。该生成器的JSON模式经过专门设计,包含详尽描述和模式匹配功能以简化流程。

再次强调,强烈推荐使用该JSON生成器:链接

标准JSON文件结构如下:

{
  "cardName": "",
  "faceSprite": "",
  "eyeSprites": {
    "open": "",
    "closed": ""
  },
  "mouthSprites": {
    "open": "",
    "closed": ""
  },
  "emissionSprites": {
    "open": "",
    "closed": ""
  },
  "faceInfo": {
    "blinkRate": 1.5,
    "voiceId": "female1_voice",
    "voiceSoundPitch": 1,
    "customVoice": ""
  },
  "emotions": [
  ],
  "dialogueEvents": [
    {
      "eventName": "OnDrawn",
      "mainLines": [ "" ],
      "repeatLines": [
        [ "" ],
        [ "" ]
      ]
    }
  ]
}

各字段详解见下文。完整示例可参考Talking Possum卡牌文件,该示例包含动态肖像、对话代码和自定义语音。

向后兼容性说明

已对原TalkingCardAPI模组创建的卡牌提供兼容支持。除新增的"emissionSprites"字段(旧版使用单图"emissionSprite"字段)外,多数字段保持相同。建议迁移至新结构。

字段总览
字段 说明
cardName 现有卡牌名称
faceSprite 卡牌面部图像
eyeSprites 睁眼/闭眼状态图像对
mouthSprites 张嘴/闭嘴状态图像对
emissionSprites 眼睛发光状态图像对(睁眼/闭眼)
faceInfo 卡牌面部细节配置(详见下文)
emotions 角色情绪表情配置(详见此节
dialogueEvents 卡牌对话事件配置(详见下文)
图像规格

所有面部图像(包括眼睛、嘴巴和发光效果)尺寸需符合《邪恶冥刻》第一章卡牌肖像标准:114×94像素。

建议使用分层绘图软件分别绘制面部、眼睛和嘴巴,并单独导出各图层。

同一图像重复使用不会影响性能(详见此节)。

可用_表示空纹理,用于隐藏面部特定部位(详见此节)。

FaceInfo配置

控制角色面部动画细节:

字段 说明
blinkRate 眨眼频率(数值越高频率越快)
voiceId 角色语音类型(可选值见下文)
voiceSoundPitch 语音音调(数值越高音调越高)
customVoice 自定义语音文件路径(优先于voiceId)

“voiceId”仅限以下三种取值:

  1. female1_voice
  2. cat_voice
  3. kobold_voice

多数游戏内卡牌使用第一种并通过调整音调实现变化。

自定义语音

可通过“customVoice”字段指定音频文件路径(支持MP3/WAV/OGG/AIFF格式)。建议使用极短的元音音频片段,因其将被快速重复播放。

当“customVoice”非空时,“voiceId”字段将被忽略。

对话事件

“dialogueEvents”为对话事件对象数组。建议使用前文提到的生成器简化配置。

每个对话事件对象包含以下字段:

字段 说明
eventName 对话触发条件(可选值见下表)
mainLines 首次触发时播放的对话内容
repeatLines 后续触发时循环播放的多组对话内容
事件触发器

有效“eventName”取值及说明:

触发器 触发条件
OnDrawn 卡牌被抽取时
OnPlayFromHand 从手牌打出时
OnAttacked 遭受攻击时
OnBecomeSelectablePositive 成为增益效果可选目标时
OnBecomeSelectableNegative 成为减益效果可选目标时
OnSacrificed 被献祭时
OnSelectedForDeckTrial 在牌组试炼节点被选中时
OnSelectedForCardMerge 在印记节点被选中接收印记前
OnSelectedForCardRemove 被选中移除时
ProspectorBoss 矿工头目战开始时
AnglerBoss 钓鱼人头目战开始时
TrapperTraderBoss 猎人/毛皮商头目战开始时
LeshyBoss 莱西头目战开始时
RoyalBoss 罗亚尔头目战开始时
主对话内容

“mainLines”包含首次触发时播放的文本内容。同一存档中仅播放一次。

如需重复播放,可将内容置于“repeatLines”数组中。

循环对话内容

“repeatLines”为二维数组结构,包含多组循环播放的对话文本。示例:

"repeatLines": [
  [
     "这是第一组有效对话",
     "这组对话结束于此"
  ],
  [
     "这是第二组有效对话",
     "这组对话又结束于此"
  ]
]

如果您仍然不清楚它们的工作原理,我强烈建议您使用我上面链接的JSON生成器。我为其编写的JSON架构完全支持添加循环的对话文本。

对话代码

《邪恶冥刻》对话事件中一项精妙的设计是对话代码(dialogue codes),它们能为对话注入鲜活的表现力!

以下将重点解析与可对话卡牌最相关的对话代码。所有代码均适用于可对话卡牌。

等待([w:])

这是使用频率最高的对话代码,也是游戏本体在所有对话中最常调用的功能。

“[w:x]”代码会在语句后续部分播放前插入x秒的暂停。

使用示例:

"哈喽。[w:1]你呢?"  

此例中,角色说完“哈喽”后会等待1秒,再继续“你呢?”。

秒数不必为整数。例如使用“[w:0.2]”实现0.2秒短暂停顿是合法操作,且在原版游戏对话中频繁出现。

需注意的是,建议不要使用低于[w:0.1]的数值,因为尚不清楚该参数的最小有效阈值(况且更短的停顿也无实际意义)。

颜色([c:])

[c:]代码用于改变局部文本颜色。

使用示例:

"[c:R]这段文字是红色。[c:] 这段恢复默认色。"  

此例中,[c:R]之后的内容会切换为代码“R”对应的红色,而[c:]之后则恢复默认文本颜色。其机制可理解为“开启”彩色文本模式后再“关闭”。

“如何获取各颜色对应代码?”
无需担忧!以下是完整的颜色代码对照表:

代码 颜色
B 蓝色
bB 浅蓝
bG 浅金
blGr 浅柠檬绿
bR 浅红
brnO 棕橙
dB 深蓝
dlGr 深柠檬绿
dSG 深海沫绿
bSG 荧光海沫绿
G 金色
gray 灰色
lGr 柠檬绿
O 橙色
R 红色

(注:这些是游戏内置的预设颜色,非本人选定。确实是个非常古怪的色系组合。)

自定义颜色

本模组新增了通过对话代码使用自定义颜色的功能。只需将上表中的颜色代码替换为十六进制颜色码,模组便会将其解析为可用文本颜色。

示例:

"你肯定...[w:0.4][c:#7f35e6]很困惑[c:][w:1]了。"  

此例中“很困惑”三字会显示为#7f35e6色值(若不想查证,即此色)。

请注意:为确保兼容性,十六进制代码必须包含#符号

莱西对话([leshy:x])

[leshy:x]代码会触发莱西说出x内容。该功能非常适合制造莱西与卡牌之间的互动效果!

使用示例:

"我们完了。[leshy:安静。][w:2]"  

此例中,角色说完"我们完了"后,莱西立即接话"安静。",文本将持续显示2秒。

关键注意事项:

  1. 莱西的台词无需额外添加引号
  2. “等待”代码仍适用于莱西的台词

情绪系统

原版所有可对话卡牌都具备多套情绪状态。情绪即字面含义:通过不同面部表情传递角色情感。

技术细节:情绪在游戏代码中是以C# enum实现的枚举类型,每个枚举项都有对应的数字编号。

角色的默认情绪是“Neutral”(中立),该状态会自动加载。

完整情绪列表及对应编号:

情绪 编号
Neutral 0
Laughter 1
Anger 2
Quiet 3
Surprise 4
Curious 5

枚举中还存在“None”项,但建议避免使用。

添加情绪

通过在JSON文件的“emotions”数组中添加新项来扩展情绪系统。标准格式如下:

"emotions": [  
  {  
    "emotion": "Anger",  
    "faceSprite": "Example_AngryFace.png",  
    "eyeSprites": {  
      "open": "Example_AngryEyes_Open.png",  
      "closed": "Example_AngryEyes_Closed.png"  
    },  
    "mouthSprites": {  
      "open": "Example_AngryMouth_Open.png",  
      "closed": "Example_AngryMouth_Closed.png"  
    },  
    "emissionSprites": {  
      "open": "Example_AngryEmission_Open.png",  
      "closed": "Example_AngryEmission_Closed.png"  
    }  
  }  
]  

此例添加了名为“Anger”的新情绪,并配置了对应的面部素材。

“emotion”字段必须使用有效情绪名称(参见前表)。

"必须替换所有素材吗?"

并非必须替换全部素材!

可仅修改需要变更的字段,未声明字段将自动继承Neutral情绪的对应素材。

示例:

"emotions": [  
  {  
    "emotion": "Anger",  
    "eyeSprites": {  
      "open": "Example_AngryEyes_Open.png",  
      "closed": "Example_AngryEyes_Closed.png"  
    },  
    "emissionSprites": {  
      "open": "Example_AngryEmission_Open.png",  
      "closed": "Example_AngryEmission_Closed.png"  
    }  
  }  
]  

此例仅修改了眼部素材和发光效果,面部与嘴部素材仍保持Neutral状态。

若仍有困惑,建议使用前文提到的JSON生成器工具。该工具支持字段可选配置,特别适合情绪系统搭建。

附注:素材复用

“我想重复使用同一张图片!会影响性能吗?”

本模组实现了纹理缓存机制,确保同一图片无论被引用多少次都仅加载一次。因此无需担忧素材复用问题。

这意味着你可以安全地在多个情绪(甚至多个角色)间复用眼部等素材,不会产生性能损耗。

附注:空白纹理

若需隐藏某个部件(如关闭发光效果),可用下划线_代表完全透明的空白纹理。

示例:

{  
  "emotion": "Quiet",  
  "eyeSprites": {  
    "open": "Example_QuietEyes_Open.png",  
    "closed": "Example_QuietEyes_Closed.png"  
  },  
  "emissionSprites": {  
    "open": "Example_QuietEmission_Open.png",  
    "closed": "_"  
  }  
}  

此例中,闭眼时的发光效果被隐藏。该技巧特别适用于眼部发光等场景。

同理可用于隐藏嘴部、完全关闭发光等各类需求。

使用情绪

通过[e:x]对话代码切换情绪状态,其中x为情绪名称(参见前表)。

模组已实现情绪名称大小写不敏感,以下写法等效:

"[e:Anger]我很生气。"  
"[e:anger]我很生气。"  
"[e:AnGeR]我很生气,我的键盘也在搞我。"  

也可直接使用数字编号:

"[e:2]我很生气。"  

常见问题

问: “加载_talk.jldr2文件时报错!如何解决?”

答: 请检查JSON文件语法是否正确。推荐使用JSONLint等在线校验工具排查问题。

Pages