@@ -0,0 +1,60 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_all_in_crush
|
||||
*
|
||||
* 战斗中的正面爆发动作。它要求主角不绕、不拖,直接把当前回合的叙事、
|
||||
* 技能权重和视觉表现都推向“强压正面敌人”的方向。
|
||||
*/
|
||||
export const BATTLE_ALL_IN_CRUSH_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_all_in_crush',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
text: '战斗:全力压上',
|
||||
description:
|
||||
'正面强攻,优先触发高爆发和终结类技能,伤害更高,但承受的反击也更重。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.SKILL3,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}被正面强攻逼得节节后退',
|
||||
monsterAnimation: 'attack',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 1.3,
|
||||
incomingDamageMultiplier: 1.15,
|
||||
turnTimeMultiplier: 1,
|
||||
skillWeights: {
|
||||
finisher: 5,
|
||||
burst: 4,
|
||||
mobility: 2,
|
||||
steady: 1.5,
|
||||
projectile: 1.2,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'对面前敌人全力猛攻,文案可以自然改写,但仍要保持这是正面强攻而不是别的行为。',
|
||||
documentation: {
|
||||
id: 'battle_all_in_crush',
|
||||
domain: 'state',
|
||||
title: '战斗:全力压上',
|
||||
source: 'src/data/functionCatalog/state/battleAllInCrush.ts',
|
||||
summary: '战斗阶段的高风险高收益强攻 function。',
|
||||
detailedDescription:
|
||||
'这个 function 用于把当前回合塑造成硬碰硬的压制回合,让主角优先打出爆发和终结倾向更强的技能或叙事动作。',
|
||||
trigger: '仅在 battle 状态且场上仍有存活敌人时参与候选。',
|
||||
execution:
|
||||
'提高 damageMultiplier,并抬高 finisher / burst 权重,同时略微提高 incomingDamageMultiplier,突出换血压力。',
|
||||
result: '适合在残局抢收头、需要快速压血,或者希望把敌人直接压回去时使用。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
|
||||
/**
|
||||
* battle_attack_basic
|
||||
*
|
||||
* 后端单行为战斗模型的普通攻击入口。该 function 只登记文档和契约,
|
||||
* 不进入前端本地 state function 候选池。
|
||||
*/
|
||||
export const BATTLE_ATTACK_BASIC_FUNCTION: FunctionDocumentationEntry = {
|
||||
id: 'battle_attack_basic',
|
||||
domain: 'state',
|
||||
title: '普通攻击',
|
||||
source: 'src/data/functionCatalog/state/battleAttackBasic.ts',
|
||||
summary: '后端单行为战斗模型中的基础攻击 function。',
|
||||
detailedDescription:
|
||||
'这个 function 代表一次明确的普通攻击点击,后端直接结算伤害、敌方反击和下一轮战斗选项,不再请求 AI 续写整段战斗剧情。',
|
||||
trigger: '仅在 battle 状态且场上仍有存活敌人时,由后端战斗 option 池下发。',
|
||||
execution:
|
||||
'前端透传 functionId,Rust 后端经 story battle facade 调用 module-combat 按普通攻击规则结算本回合。',
|
||||
result: '刷新 HP、战斗日志和下一轮战斗 options;若敌人被击败,再进入脱战剧情推理。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
runtime: {
|
||||
storyMode: 'local_only',
|
||||
uiMode: 'none',
|
||||
executor:
|
||||
'server-rs/crates/module-combat/src/lib.rs -> resolve_combat_action',
|
||||
animationNote: '播放一次基础攻击和受击反馈,不扩展成连续多段连击。',
|
||||
storyNote:
|
||||
'战斗未结束时只展示本次结算文本;战斗结束后才请求脱战剧情。',
|
||||
uiNote: '由后端战斗 option 池生成,不进入前端本地 state function 候选。',
|
||||
compactDetailText: '直接攻击眼前敌人',
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,55 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_escape_breakout
|
||||
*
|
||||
* 战斗中的脱离动作。它不是继续换血,而是明确让主角放弃当前缠斗,
|
||||
* 把叙事重心切到“拉开距离、甩开追击、离开战场”。
|
||||
*/
|
||||
export const BATTLE_ESCAPE_BREAKOUT_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_escape_breakout',
|
||||
state: 'battle',
|
||||
category: 'escape',
|
||||
text: '逃跑:转身甩开',
|
||||
description: '立刻放弃缠斗,转身拉开距离,冲向下一片区域。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: -0.6,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'left',
|
||||
scrollWorld: true,
|
||||
monsterActionTemplate: '{monster}在后方死死咬住不放',
|
||||
monsterAnimation: 'idle',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
escapeDurationMs: 5000,
|
||||
escapeDistance: 5,
|
||||
monsterLagStart: 0.52,
|
||||
monsterLagEnd: 0.34,
|
||||
sceneShift: 0,
|
||||
enterBattle: false,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'从当前战斗中脱身、拉开距离或撤离,文案可以自然改写,但仍要保持这是逃脱而不是继续交战。',
|
||||
documentation: {
|
||||
id: 'battle_escape_breakout',
|
||||
domain: 'state',
|
||||
title: '逃跑:转身甩开',
|
||||
source: 'src/data/functionCatalog/state/battleEscapeBreakout.ts',
|
||||
summary: '用于脱战、逃离和切离镜头压力的战斗 function。',
|
||||
detailedDescription:
|
||||
'它让回合从“继续打”切换到“先活下来”,并带出逃跑镜头、距离拉开和怪物追击落后的演出逻辑。',
|
||||
trigger: '仅在 battle 状态下参与候选,并会在低血时提升优先级。',
|
||||
execution:
|
||||
'不追求伤害,而是提供 escapeDurationMs、escapeDistance 与 monsterLag 参数,驱动逃跑流程与镜头表现。',
|
||||
result: '适合生命见底、资源不够,或玩家主动决定放弃当前战斗时使用。',
|
||||
state: 'battle',
|
||||
category: 'escape',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_feint_step
|
||||
*
|
||||
* 战斗中的机动切入动作。它把重点放在虚晃、变线与抢身位,
|
||||
* 让战斗叙事更偏向灵活切入而不是硬扛伤害。
|
||||
*/
|
||||
export const BATTLE_FEINT_STEP_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_feint_step',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
text: '战斗:虚晃切入',
|
||||
description:
|
||||
'通过假动作和变线切入制造破绽,偏向机动技能,伤害适中但更安全。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.SKILL1_JUMP,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}被晃得节奏发虚,动作明显迟疑',
|
||||
monsterAnimation: 'attack',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 1.05,
|
||||
incomingDamageMultiplier: 0.8,
|
||||
skillWeights: {
|
||||
mobility: 5,
|
||||
burst: 2.4,
|
||||
steady: 2,
|
||||
finisher: 1.4,
|
||||
projectile: 1.2,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'通过虚晃、变线或切步逼近面前敌人,文案可以自然改写,但仍要保持这是机动切入。',
|
||||
documentation: {
|
||||
id: 'battle_feint_step',
|
||||
domain: 'state',
|
||||
title: '战斗:虚晃切入',
|
||||
source: 'src/data/functionCatalog/state/battleFeintStep.ts',
|
||||
summary: '通过身位变化制造安全破绽的机动战斗 function。',
|
||||
detailedDescription:
|
||||
'它适合把回合讲成“先骗、再切、再进”的过程,让主角依靠节奏误导和位移逼出敌人的迟疑。',
|
||||
trigger: '仅在 battle 状态下参与候选。',
|
||||
execution:
|
||||
'小幅提高输出,显著降低 incomingDamageMultiplier,并把技能权重偏到 mobility,让系统更愿意选机动型动作。',
|
||||
result:
|
||||
'适合想稳一点地逼近敌人、减少硬吃反击,或需要围绕灵巧角色塑造打法时使用。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_finisher_window
|
||||
*
|
||||
* 战斗中的终结窗口动作。它要求系统把这一回合理解为“敌人已经露出空档”,
|
||||
* 因而优先演出收割、补刀和终结技。
|
||||
*/
|
||||
export const BATTLE_FINISHER_WINDOW_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_finisher_window',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
text: '战斗:抓住破绽',
|
||||
description: '专门针对敌人露出的空档压上终结技,节奏更短、更猛。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.SKILL3,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}来不及调整姿态,只能仓促迎击',
|
||||
monsterAnimation: 'attack',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 1.4,
|
||||
incomingDamageMultiplier: 1.05,
|
||||
turnTimeMultiplier: 0.92,
|
||||
skillWeights: {
|
||||
finisher: 6,
|
||||
burst: 3.5,
|
||||
mobility: 1.5,
|
||||
steady: 0.8,
|
||||
projectile: 0.6,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'抓住面前敌人的破绽收割或终结,文案可以自然改写,但仍要保持这是终结窗口。',
|
||||
documentation: {
|
||||
id: 'battle_finisher_window',
|
||||
domain: 'state',
|
||||
title: '战斗:抓住破绽',
|
||||
source: 'src/data/functionCatalog/state/battleFinisherWindow.ts',
|
||||
summary: '围绕残局补刀与爆发终结的战斗 function。',
|
||||
detailedDescription:
|
||||
'它会强烈推动“敌人已经失衡、主角准备收口”的叙事判断,让 actionText 与技能选择都更像最后一击。',
|
||||
trigger: '仅在 battle 状态下参与候选,并会在敌方血量偏低时明显升优先级。',
|
||||
execution:
|
||||
'提供最高档位之一的 damageMultiplier,缩短 turnTimeMultiplier,并极度偏向 finisher / burst 技能。',
|
||||
result: '适合在敌方残血、明显露出空档,或需要一口气结束战斗时使用。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_guard_break
|
||||
*
|
||||
* 战斗中的破架重击动作。它强调“针对敌人当前动作强拆架势”,
|
||||
* 比纯换血更讲究把敌人的节奏打断。
|
||||
*/
|
||||
export const BATTLE_GUARD_BREAK_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_guard_break',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
text: '战斗:重击破架',
|
||||
description: '针对怪物当前动作强拆架势,伤害偏高,反击压力略低。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.SKILL2,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}被重击震得动作一滞',
|
||||
monsterAnimation: 'attack',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 1.2,
|
||||
incomingDamageMultiplier: 0.9,
|
||||
skillWeights: {
|
||||
burst: 4.5,
|
||||
finisher: 3,
|
||||
steady: 2.2,
|
||||
mobility: 1.5,
|
||||
projectile: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'针对面前敌人的架势或破绽重击破防,文案可以自然改写,但仍要保持这是破架强攻。',
|
||||
documentation: {
|
||||
id: 'battle_guard_break',
|
||||
domain: 'state',
|
||||
title: '战斗:重击破架',
|
||||
source: 'src/data/functionCatalog/state/battleGuardBreak.ts',
|
||||
summary: '围绕破架、震停和打断敌人节奏的战斗 function。',
|
||||
detailedDescription:
|
||||
'它不是单纯地压血,而是把回合重心放在“砸开架势、制造空档”,让后续剧情更容易承接敌人失衡的结果。',
|
||||
trigger: '仅在 battle 状态且敌人仍在场时参与候选。',
|
||||
execution:
|
||||
'维持较高 damageMultiplier,同时降低 incomingDamageMultiplier,并偏向 burst / steady 组合,突出稳中带狠的重击感。',
|
||||
result: '适合对付正在招架、准备反扑或看起来露出结构性破绽的敌人。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_probe_pressure
|
||||
*
|
||||
* 战斗中的稳扎试探动作。适合在局势未明、资源需要保留时,
|
||||
* 先用安全且持续的压制把信息和节奏摸出来。
|
||||
*/
|
||||
export const BATTLE_PROBE_PRESSURE_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_probe_pressure',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
text: '战斗:稳扎试探',
|
||||
description: '以持续压制和稳健试探为主,更容易发动常规连段和中段技能。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.SKILL1,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}一边招架一边寻找反扑的缝隙',
|
||||
monsterAnimation: 'attack',
|
||||
monsterMoveMeters: 0,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 1,
|
||||
incomingDamageMultiplier: 0.95,
|
||||
skillWeights: {
|
||||
steady: 5,
|
||||
burst: 2.2,
|
||||
mobility: 2,
|
||||
projectile: 2,
|
||||
finisher: 1.2,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'对面前敌人稳扎稳打地试探施压,文案可以自然改写,但仍要保持这是试探压制。',
|
||||
documentation: {
|
||||
id: 'battle_probe_pressure',
|
||||
domain: 'state',
|
||||
title: '战斗:稳扎试探',
|
||||
source: 'src/data/functionCatalog/state/battleProbePressure.ts',
|
||||
summary: '强调观察、压迫和中段连段的稳健战斗 function。',
|
||||
detailedDescription:
|
||||
'这个 function 让战斗回合更像“边压边看”,适合在想控制资源消耗、等待更好机会,或需要防止自己出手过重时使用。',
|
||||
trigger: '仅在 battle 状态下参与候选。',
|
||||
execution:
|
||||
'保持标准 damageMultiplier,轻微降低 incomingDamageMultiplier,并把 skillWeights 明显偏向 steady,兼顾少量 mobility / projectile。',
|
||||
result: '适合拉平节奏、压住敌人反扑窗口,或在低蓝时维持安全输出。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* battle_recover_breath
|
||||
*
|
||||
* 战斗中的恢复动作。它会把当前回合塑造成“先稳住伤势与灵力”,
|
||||
* 让数值、冷却和叙事都朝回气与整顿节奏的方向靠拢。
|
||||
*/
|
||||
export const BATTLE_RECOVER_BREATH_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'battle_recover_breath',
|
||||
state: 'battle',
|
||||
category: 'recovery',
|
||||
text: '战斗:收势调息',
|
||||
description: '边守边调息,恢复少量生命和灵力,并让技能冷却更快转动。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.IDLE,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterActionTemplate: '{monster}仍在逼近,不给你轻松喘息的空当',
|
||||
monsterAnimation: 'move',
|
||||
monsterMoveMeters: -0.1,
|
||||
},
|
||||
effect: {
|
||||
damageMultiplier: 0.72,
|
||||
incomingDamageMultiplier: 0.7,
|
||||
healAmount: 12,
|
||||
manaRestore: 18,
|
||||
cooldownTickBonus: 1,
|
||||
skillWeights: {
|
||||
steady: 3,
|
||||
mobility: 2,
|
||||
projectile: 1.8,
|
||||
burst: 1,
|
||||
finisher: 0.4,
|
||||
},
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'在战斗中收势调息、稳住伤势或回气,文案可以自然改写,但仍要保持这是恢复而不是继续猛攻。',
|
||||
documentation: {
|
||||
id: 'battle_recover_breath',
|
||||
domain: 'state',
|
||||
title: '战斗:收势调息',
|
||||
source: 'src/data/functionCatalog/state/battleRecoverBreath.ts',
|
||||
summary: '战斗中的保命与回气 function。',
|
||||
detailedDescription:
|
||||
'这个 function 专门为低血、低蓝或技能轮转吃紧时准备,让一回合承担“止血、回蓝、缓冷却”的综合恢复职责。',
|
||||
trigger: '仅在 battle 状态下参与候选,且通常会在低血或低蓝时被提权。',
|
||||
execution:
|
||||
'显著降低 damageMultiplier 和 incomingDamageMultiplier,同时提供 healAmount、manaRestore 与 cooldownTickBonus。',
|
||||
result: '适合临时止损、等关键技能转好,或把高压战斗拉回可控节奏。',
|
||||
state: 'battle',
|
||||
category: 'recovery',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
|
||||
/**
|
||||
* battle_use_skill
|
||||
*
|
||||
* 后端单行为战斗模型的技能释放入口。每个技能 option 复用同一个
|
||||
* functionId,具体技能必须由 runtimePayload.skillId 指定。
|
||||
*/
|
||||
export const BATTLE_USE_SKILL_FUNCTION: FunctionDocumentationEntry = {
|
||||
id: 'battle_use_skill',
|
||||
domain: 'state',
|
||||
title: '释放技能',
|
||||
source: 'src/data/functionCatalog/state/battleUseSkill.ts',
|
||||
summary: '后端单行为战斗模型中的指定技能释放 function。',
|
||||
detailedDescription:
|
||||
'这个 functionId 可以对应多个技能 option 实例。前端只展示技能名和不可用原因,后端根据 runtimePayload.skillId 校验蓝量、冷却并结算本次技能效果。',
|
||||
trigger: '仅在 battle 状态下由后端按角色技能列表生成,可能携带 disabled 状态。',
|
||||
execution:
|
||||
'前端透传 runtimePayload.skillId,Rust 后端经 story battle facade 调用 module-combat 校验技能并完成一次技能动作结算。',
|
||||
result:
|
||||
'更新 MP、技能冷却、敌我 HP 和下一轮战斗 options;若战斗结束,再触发脱战剧情推理。',
|
||||
state: 'battle',
|
||||
category: 'battle',
|
||||
active: true,
|
||||
runtime: {
|
||||
storyMode: 'local_only',
|
||||
uiMode: 'none',
|
||||
executor:
|
||||
'server-rs/crates/module-combat/src/lib.rs -> resolve_combat_action',
|
||||
animationNote: '根据技能 option 播放一次技能演出,不在本 function 内追加多回合动作。',
|
||||
storyNote:
|
||||
'战斗未结束时使用本次技能结算文本;只有战斗结束才请求新剧情。',
|
||||
uiNote: '每个技能是一个后端下发的独立 option,必须携带 skillId。',
|
||||
compactDetailText: '释放一个指定技能',
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,48 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_call_out
|
||||
*
|
||||
* 空闲状态下的主动喊话动作。它会把探索从“静悄悄地摸过去”
|
||||
* 转成“先出声试探,看谁先回应”的节奏。
|
||||
*/
|
||||
export const IDLE_CALL_OUT_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_call_out',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
text: '主动出声试探',
|
||||
description: '朝前方主动喊话试探,可能把藏着的角色、怪物或其他动静逼出来。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.IDLE,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
sceneShift: 0,
|
||||
enterBattle: false,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'主动朝前方出声试探,文案可以自然改写,但仍要保持这是出声试探。',
|
||||
documentation: {
|
||||
id: 'idle_call_out',
|
||||
domain: 'state',
|
||||
title: '主动出声试探',
|
||||
source: 'src/data/functionCatalog/state/idleCallOut.ts',
|
||||
summary: '通过主动发声引出附近实体反应的空闲 function。',
|
||||
detailedDescription:
|
||||
'它把探索节奏从被动观察切成主动打破寂静,更适合在玩家想逼出暗处角色、敌人或潜伏动静时使用。',
|
||||
trigger: '仅在 idle 状态下参与候选,且在当前设计里优先级较高。',
|
||||
execution:
|
||||
'维持站立演出,不推动场景位移;上层会把它理解为向前方喊话,从而让实体更容易被直接引到眼前。',
|
||||
result: '适合探草、叫阵、主动试探潜伏目标,或把隐藏互动直接拉到台前。',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_explore_forward
|
||||
*
|
||||
* 空闲状态下最核心的推进动作。它负责把“继续往前探”从一句泛化文案,
|
||||
* 落成真正会引出下一幕遭遇的运行时 function。
|
||||
*/
|
||||
export const IDLE_EXPLORE_FORWARD_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_explore_forward',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
text: '继续向前探索',
|
||||
description: '沿当前场景继续深入,很可能立刻撞上新的敌人或危险。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: 0.9,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
sceneShift: 0,
|
||||
enterBattle: true,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'继续向前推进当前场景,文案可以自然改写,但仍要保持这是往前探索。',
|
||||
documentation: {
|
||||
id: 'idle_explore_forward',
|
||||
domain: 'state',
|
||||
title: '继续向前探索',
|
||||
source: 'src/data/functionCatalog/state/idleExploreForward.ts',
|
||||
summary: '空闲阶段默认的主推进 function。',
|
||||
detailedDescription:
|
||||
'它负责把玩家继续深入当前场景的意图交给运行时,让场景实体池、前探预览和下一幕遭遇有机会真正落地。',
|
||||
trigger: '仅在 idle 状态下参与候选;营地场景会在运行时被额外过滤。',
|
||||
execution:
|
||||
'保持空闲探索态,视觉上推动角色向前,effect 中通过 enterBattle / sceneShift 让下一步遭遇有机会进入前探或战斗链路。',
|
||||
result: '适合在当前场景继续摸深、主动触发新的角色、怪物、宝藏或危险。',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_follow_clue
|
||||
*
|
||||
* 空闲状态下的循线推进动作。它在源码定义层仍然存在,
|
||||
* 但当前运行时会在聚合阶段被过滤,因此属于保留中的停用 function。
|
||||
*/
|
||||
export const IDLE_FOLLOW_CLUE_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_follow_clue',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
text: '顺着线索靠近',
|
||||
description: '沿着眼前痕迹、小道或声音来源继续靠近,可能更快撞上新的目标。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: 0.6,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
sceneShift: 0,
|
||||
enterBattle: false,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'顺着眼前线索继续靠近目标,文案可以自然改写,但仍要保持这是循线逼近。',
|
||||
documentation: {
|
||||
id: 'idle_follow_clue',
|
||||
domain: 'state',
|
||||
title: '顺着线索靠近',
|
||||
source: 'src/data/functionCatalog/state/idleFollowClue.ts',
|
||||
summary: '保留在源码中的循线 function,目前默认不进入运行时候选池。',
|
||||
detailedDescription:
|
||||
'它原本用于把观察结果进一步收束成“沿线索追过去”的动作,但当前项目在 applyRuntimeFunctionAdjustments 中会将其过滤。',
|
||||
trigger: '定义上属于 idle 状态,但默认运行时不会提供给玩家。',
|
||||
execution:
|
||||
'保留了向前靠近的视觉与 effect 配置,方便后续重新启用或用于编辑器审计。',
|
||||
result: '当前主要用于保留设计意图和支持后续恢复,不是默认可点选项。',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
active: false,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_observe_signs
|
||||
*
|
||||
* 空闲状态下的侦察动作。它把当前回合定义成“停下来观察”,
|
||||
* 重点不是立刻推进,而是为后续选择生成可引用的观察结果。
|
||||
*/
|
||||
export const IDLE_OBSERVE_SIGNS_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_observe_signs',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
text: '停步观察动静',
|
||||
description: '先收住脚步观察附近痕迹与风吹草动,判断前方是否有异样。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.IDLE,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
sceneShift: 0,
|
||||
enterBattle: false,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'停步观察周围动静、痕迹或征兆,文案可以自然改写,但仍要保持这是观察判断。',
|
||||
documentation: {
|
||||
id: 'idle_observe_signs',
|
||||
domain: 'state',
|
||||
title: '停步观察动静',
|
||||
source: 'src/data/functionCatalog/state/idleObserveSigns.ts',
|
||||
summary: '围绕侦察、判断和前情确认的空闲 function。',
|
||||
detailedDescription:
|
||||
'这个 function 不要求马上遇敌或推进,而是把回合用在收集线索、确认附近实体池与下一步风险上。',
|
||||
trigger: '仅在 idle 状态下参与候选。',
|
||||
execution:
|
||||
'保持原地观察姿态,不推进 sceneShift;上层 prompt 会把这一回合视为观察请求,要求模型输出可延续的侦察结论。',
|
||||
result: '适合进入未知区域前先看风向、脚印、气息或异响,减少盲走。',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_rest_focus
|
||||
*
|
||||
* 空闲状态下的原地恢复动作。它不会推进遭遇,而是给玩家一个
|
||||
* 在非战斗场景里回收少量血蓝的缓冲回合。
|
||||
*/
|
||||
export const IDLE_REST_FOCUS_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_rest_focus',
|
||||
state: 'idle',
|
||||
category: 'recovery',
|
||||
text: '原地调息恢复',
|
||||
description: '暂时停步整理呼吸,恢复少量生命与灵力,继续保持空闲状态。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.IDLE,
|
||||
playerMoveMeters: 0,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
healAmount: 10,
|
||||
manaRestore: 15,
|
||||
sceneShift: 0,
|
||||
enterBattle: false,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'原地调息、休整或恢复状态,文案可以自然改写,但仍要保持这是恢复。',
|
||||
documentation: {
|
||||
id: 'idle_rest_focus',
|
||||
domain: 'state',
|
||||
title: '原地调息恢复',
|
||||
source: 'src/data/functionCatalog/state/idleRestFocus.ts',
|
||||
summary: '空闲阶段用于回血回蓝的恢复 function。',
|
||||
detailedDescription:
|
||||
'它承担非战斗状态下的短暂停步与内息整理,让玩家不推进主线遭遇,也能通过一回合修整状态。',
|
||||
trigger: '仅在 idle 状态下参与候选,并会在生命或灵力偏低时提升优先级。',
|
||||
execution:
|
||||
'不推动场景前进,effect 直接提供 healAmount 与 manaRestore,确保结果稳定由本地规则控制。',
|
||||
result: '适合战后休整、资源吃紧,或玩家想稳一下再继续探路时使用。',
|
||||
state: 'idle',
|
||||
category: 'recovery',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { AnimationState } from '../../../types';
|
||||
import type { StateFunctionSource } from '../types';
|
||||
|
||||
/**
|
||||
* idle_travel_next_scene
|
||||
*
|
||||
* 空闲状态下的切场景动作。它代表玩家主动离开当前地点,
|
||||
* 进入相邻场景重新开启新的遭遇周期。
|
||||
*/
|
||||
export const IDLE_TRAVEL_NEXT_SCENE_FUNCTION_SOURCE: StateFunctionSource = {
|
||||
definition: {
|
||||
id: 'idle_travel_next_scene',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
text: '前往其他场景',
|
||||
description: '离开当前场景,进入下一处地点,并在那里重新遭遇新的威胁。',
|
||||
visual: {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: 1.1,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
},
|
||||
effect: {
|
||||
sceneShift: 1,
|
||||
enterBattle: true,
|
||||
},
|
||||
},
|
||||
promptDescription:
|
||||
'离开当前场景并前往下一个场景,文案可以自然改写,但仍要保持这是切换场景。',
|
||||
documentation: {
|
||||
id: 'idle_travel_next_scene',
|
||||
domain: 'state',
|
||||
title: '前往其他场景',
|
||||
source: 'src/data/functionCatalog/state/idleTravelNextScene.ts',
|
||||
summary: '空闲阶段的地图流转 function。',
|
||||
detailedDescription:
|
||||
'当玩家不再想在当前场景深挖,而是希望切换地形、敌人池和环境压力时,这个 function 负责驱动合法的场景迁移。',
|
||||
trigger: '仅在 idle 状态下参与候选。',
|
||||
execution:
|
||||
'视觉上继续向前奔跑,effect 里通过 sceneShift: 1 把结果导向相邻场景,并允许新的遭遇在新场景刷新。',
|
||||
result: '适合主动换图、回避当前区域、或推进地图探索节奏时使用。',
|
||||
state: 'idle',
|
||||
category: 'idle',
|
||||
active: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import type { StateFunctionSource } from '../types';
|
||||
import { BATTLE_ALL_IN_CRUSH_FUNCTION_SOURCE } from './battleAllInCrush';
|
||||
import { BATTLE_ATTACK_BASIC_FUNCTION } from './battleAttackBasic';
|
||||
import { BATTLE_ESCAPE_BREAKOUT_FUNCTION_SOURCE } from './battleEscapeBreakout';
|
||||
import { BATTLE_FEINT_STEP_FUNCTION_SOURCE } from './battleFeintStep';
|
||||
import { BATTLE_FINISHER_WINDOW_FUNCTION_SOURCE } from './battleFinisherWindow';
|
||||
import { BATTLE_GUARD_BREAK_FUNCTION_SOURCE } from './battleGuardBreak';
|
||||
import { BATTLE_PROBE_PRESSURE_FUNCTION_SOURCE } from './battleProbePressure';
|
||||
import { BATTLE_RECOVER_BREATH_FUNCTION_SOURCE } from './battleRecoverBreath';
|
||||
import { BATTLE_USE_SKILL_FUNCTION } from './battleUseSkill';
|
||||
import { IDLE_CALL_OUT_FUNCTION_SOURCE } from './idleCallOut';
|
||||
import { IDLE_EXPLORE_FORWARD_FUNCTION_SOURCE } from './idleExploreForward';
|
||||
import { IDLE_FOLLOW_CLUE_FUNCTION_SOURCE } from './idleFollowClue';
|
||||
import { IDLE_OBSERVE_SIGNS_FUNCTION_SOURCE } from './idleObserveSigns';
|
||||
import { IDLE_REST_FOCUS_FUNCTION_SOURCE } from './idleRestFocus';
|
||||
import { IDLE_TRAVEL_NEXT_SCENE_FUNCTION_SOURCE } from './idleTravelNextScene';
|
||||
|
||||
export const STATE_FUNCTION_SOURCES: StateFunctionSource[] = [
|
||||
BATTLE_ALL_IN_CRUSH_FUNCTION_SOURCE,
|
||||
BATTLE_GUARD_BREAK_FUNCTION_SOURCE,
|
||||
BATTLE_PROBE_PRESSURE_FUNCTION_SOURCE,
|
||||
BATTLE_FEINT_STEP_FUNCTION_SOURCE,
|
||||
BATTLE_RECOVER_BREATH_FUNCTION_SOURCE,
|
||||
BATTLE_FINISHER_WINDOW_FUNCTION_SOURCE,
|
||||
BATTLE_ESCAPE_BREAKOUT_FUNCTION_SOURCE,
|
||||
IDLE_EXPLORE_FORWARD_FUNCTION_SOURCE,
|
||||
IDLE_TRAVEL_NEXT_SCENE_FUNCTION_SOURCE,
|
||||
IDLE_REST_FOCUS_FUNCTION_SOURCE,
|
||||
IDLE_OBSERVE_SIGNS_FUNCTION_SOURCE,
|
||||
IDLE_FOLLOW_CLUE_FUNCTION_SOURCE,
|
||||
IDLE_CALL_OUT_FUNCTION_SOURCE,
|
||||
];
|
||||
|
||||
export const STATE_FUNCTION_DEFINITIONS = STATE_FUNCTION_SOURCES.map(
|
||||
(source) => source.definition,
|
||||
);
|
||||
|
||||
export const STATE_FUNCTION_PROMPT_DESCRIPTIONS = Object.fromEntries(
|
||||
STATE_FUNCTION_SOURCES.map((source) => [
|
||||
source.definition.id,
|
||||
source.promptDescription,
|
||||
]),
|
||||
) as Record<string, string>;
|
||||
|
||||
export const STATE_FUNCTION_DOCUMENTATION = [
|
||||
BATTLE_ATTACK_BASIC_FUNCTION,
|
||||
BATTLE_USE_SKILL_FUNCTION,
|
||||
...STATE_FUNCTION_SOURCES.map((source) => source.documentation),
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user