From a010a0bca6e817144213c965509ff4ad0ac7bbbc Mon Sep 17 00:00:00 2001 From: hyper Date: Thu, 16 Apr 2026 17:14:13 +0800 Subject: [PATCH] refactor: update doc and .d.ts --- .../slay-the-spire-like/01-overview.md | 121 ++++++++++++------ src/samples/slay-the-spire-like/02-fighter.md | 8 +- src/samples/slay-the-spire-like/03-desert.md | 30 ++--- .../data/encounterDesert.csv.d.ts | 2 +- .../data/enemyDesert.csv.d.ts | 2 +- .../data/enemyIntentDesert.csv.d.ts | 2 +- .../data/heroItemFighter1.csv.d.ts | 2 +- .../data/statusCardDesert.csv.d.ts | 2 +- 8 files changed, 109 insertions(+), 60 deletions(-) diff --git a/src/samples/slay-the-spire-like/01-overview.md b/src/samples/slay-the-spire-like/01-overview.md index 38f8421..acda82c 100644 --- a/src/samples/slay-the-spire-like/01-overview.md +++ b/src/samples/slay-the-spire-like/01-overview.md @@ -1,4 +1,4 @@ -# slay the spire + backpack heroes +# 杀戮尖塔 + 背包英雄 玩家有4x6的背包 @@ -6,68 +6,113 @@ 战斗时玩杀戮尖塔 -## Roguelike structure +## 肉鸽结构 -Zone based Point Crawl: -- 分4个区域,每个区域有独立的随机遭遇池 -- 遭遇分为随机遭遇、战斗、服务 - - 随机遭遇使用d6双阶段结构 - - 战斗遭遇分简单和困难,困难可以绕 - - 服务遭遇分商店(恢复/卖装备/附魔)篝火(恢复/补充药水/下次战斗buff)奇遇(随机奖励/风险事件) +区域点到点地图 + +- 分4个区域,每个区域有独立的随机遭遇池,目前先考虑第一个区域 - 每区域10层,26个遭遇节点 - - 荒野层6层×3节点(小怪50%/精英25%/事件25%) - - 聚落层2层×4节点(≥1篝火/≥1商店/≥1奇遇,第4随机) - - 起点→终点,终点为boss战 -- 分支1-3-3-4-3-3-4-3-3-1 + - 荒野层6层×3节点(小怪50%/精英25%/事件25%) + - 聚落层2层×4节点(≥1篝火/≥1商店/≥1奇遇,第4随机) + - 起点→终点,终点为boss战 -## 战斗 +## 战斗(小怪、精英、boss) -典中典5手牌3费,每个格子1张牌,同一装备牌逻辑相同,但根据邻接吃到的牌buff不同 +基本流程 +- 怪物战斗开始效应 +- 玩家战斗开始效应 +- 重复直至一方不剩下存活角色 + - 玩家回合 + - 怪物回合 -3种牌(攻击/防御/强化)攻击克强化克防御克攻击,强化比sts强化窄但效果更大 +怪物战斗开始 +- 获得初始buff、初始血量、初始意图 -洗牌堆时洗入两张《疲劳》(1费/消耗) +玩家战斗开始 +- 获得3点能量,抓5张手牌 -背包物品可能会引用相邻的物品、同一行的物品、同一列的物品等 +玩家回合 +- buff更新阶段:临时buff消失、延时buff-1层 +- 回合开始:触发回合开始效果 +- 行动:玩家可以自由出牌直至结束回合 +- 回合结束:触发回合结束效果 +- 重置:恢复到3点能量,弃掉剩余手牌,抓5张手牌 +- 洗回牌堆:每当牌堆为空需要抓牌或与牌堆顶交互,则将弃牌堆与2张《疲劳》(没有效果,不能打出)洗回牌堆,然后再继续。 -部分物品带使用次数限制,药瓶喝完可以在篝火补 +怪物回合 +- buff更新阶段:每个怪物临时buff消失、延时buff-1层 +- 回合开始:触发每个怪物的回合开始效果 +- 行动:怪物的意图生效,然后更新意图 +- 回合结束:触发每个怪物的回合结束效果 -## 费用 +## 篝火 -60%牌1费,20%牌2费,20%牌0费 +在篝火处可进行3次行动,每次行动可以: +- 恢复20%最大生命 +- 恢复1次所有药品的使用次数 +- 合成一个物品(暂未设计) -怪物强化平均节奏较sts更快 +## 商店 -## 关键词 +在商店可以买/卖物品 +- 有5个随机的不同物品可以买,价格为原价50%-150%随机 +- 购买之后不会补充 +- 可以以原价25%的价格卖出背包内的任意物品 -行动关键词:以【攻击4】表示。分为指向行动或非指向行动。随机打出指向行动时,指向随机目标。 +## 奇遇 -buff/debuff:以【防御3】表示。分为不衰减(持续整场战斗)、回合衰减(每次更新层数-1)、临时(下次更新清空)和姿态(受伤害时扣除层数)四种。 +奇遇为Yarn Spinner驱动的分支对话遭遇 -物品的构筑配合按邻接性设计,临场动态策略配合按buff考虑 +对玩家产生的影响根据Yarn Spinner的命令结算 -## Buff / Debuff +在对话结束后奇遇结算结束 -玩家buff主要按照“有默认功能的货币”考虑 +## 战斗内Effect -debuff暂时只考虑“条件回合覆盖”类debuff,有时可以当货币用 +Effect分以下类型: +- 瞬间:立即生效,直接改变状态 +- Buff:作为状态叠加到角色身上 + - 持久Buff:持续整场战斗 + - 临时Buff:持续到下次Buff更新 + - 延时Buff:每次Buff更新-1层,持续到归零 + - 姿态Buff:受到伤害时,移除同等数量的层数 +- 卡牌:作为状态卡牌加入 + - 弃牌:加入弃牌堆 + - 手牌:加入手牌 + - 牌堆:加入抓牌堆 +- 物品:作为物品状态叠加到物品上,通常是效应来源卡牌对应的物品周围的物品,若没有上下文物品则可能无效或对玩家的随机物品生效 + - 临时:持续到下次Buff更新 + - 持久:持续整场战斗 + - 永久:持续整个冒险 + - 直到打出:持续到下次打出该物品的卡牌 + - 直到弃掉:持续到下次弃掉该物品的卡牌 -敌人buff和debuff与玩家对称设计 +## 时机 -## 遗物与药水 +产生Effect的时机包括: +- 打出卡牌/抓到卡牌/弃掉卡牌 +- 敌人意图生效 +- Effect侦听器需要的特定侦听事件 -药水在sts里属于不稳定容错,比较鸡肋 +## 卡牌属性 -这里药水作为物品携带,0费消耗次数使用,随篝火补充,功能较难溢出且稳定性更强 +- 费用:能量费用或物品使用次数费用,如果不能支付则无法打出 +- 抓牌效果/打出效果/弃掉效果:包括目标(自身、选择目标、全体),效果类型,和层数,可能有复数条 -纯触发奖励性遗物用以调节节奏,还是要有的,但是分池发 +能量费用以3费为准,希望大约60%牌1费,20%牌2费,20%牌0费 -## 区域设计 +## 遗物 -每区域10小怪,4精英,2商店,2篝火,8奇遇,1事件 +遗物不需要放在背包格里,且仅提供正面触发效果,暂未设计 -## 设计量 +## 区域设计量 + +每区域10小怪,4精英,8奇遇,1 boss(暂未设计) +目前仅考虑沙漠一个区域 + +## 角色设计量 ~24 物品 每角色(4种各6个) --10 小怪 4 精英 1 boss 每区域 --3+ 遗物 每角色 \ No newline at end of file +-8 遗物 每角色 + +在扩展更多区域后需添加更多内容随区域/奇遇解锁 \ No newline at end of file diff --git a/src/samples/slay-the-spire-like/02-fighter.md b/src/samples/slay-the-spire-like/02-fighter.md index c172c53..7eea463 100644 --- a/src/samples/slay-the-spire-like/02-fighter.md +++ b/src/samples/slay-the-spire-like/02-fighter.md @@ -1,5 +1,7 @@ # Fighter +战士角色:默认的角色。 + ## 物品 4种物品各6个:武器、防具、耗材、工具。 @@ -8,7 +10,7 @@ 每种物品每格提供一张牌加入玩家牌堆。 -使用武器、防具、工具的卡牌花费能量,每回合3点。耗材使用不计入费用,消耗本身的使用次数。使用次数在篝火处会完全恢复。 +使用武器、防具、工具的卡牌花费能量。每回合有3点能量。耗材使用不计入费用,但消耗本身的使用次数。使用次数在篝火处可以恢复。 ### 初始装备 @@ -29,7 +31,9 @@ 防具可以检查周围物品,每个匹配的给奖励。 -盾 2x2/1费:【防御3】 +物品被动:每个防具的周围每种不同防具+1最大生命。 + +盾 2x2/1费:【防御3】。 斗笠 4格T型/2费:【防御8】 披风 3格L型/1费:【防御2】,下回合【防御2】 护腕 1格/0费:【防御1】,抓1张牌 diff --git a/src/samples/slay-the-spire-like/03-desert.md b/src/samples/slay-the-spire-like/03-desert.md index 271bf44..93a6b62 100644 --- a/src/samples/slay-the-spire-like/03-desert.md +++ b/src/samples/slay-the-spire-like/03-desert.md @@ -6,31 +6,31 @@ 概念:防+强化 -【尖刺X】:对攻击者造成X点伤害 +【尖刺X】:对自己施加的持续buff,对攻击者造成X点伤害 ### 蛇 概念:攻+强化 -蛇毒/1费:消耗。一回合弃掉超过1张蛇毒时,受到6伤害。 +【蛇毒X】:对玩家施加的手牌状态(同名状态牌/1费:打出时移除此牌。弃掉时受到3点伤害。) ### 木乃伊 概念:攻+防 -【诅咒】:受攻击时物品【攻击】-1,直到弃掉一张该物品的牌 +【诅咒】:对自己施加的延时buff。受玩家卡牌攻击时,卡牌对应物品【攻击】-1,直到玩家弃掉一张该物品的牌 ### 枪手 概念:单回高攻 -【瞄准X】:造成双倍伤害。受伤时失去等量【瞄准】。 +【瞄准X】:对自己施加的姿态buff。造成双倍伤害。 ### 风卷草 概念:防+强化 -【滚动X】:攻击时,每消耗10点【滚动】,造成等量伤害。 +【滚动X】:对自己施加的姿态buff。攻击时,若有至少10层滚动,则消耗10层滚动让攻击+10。 ### 秃鹫 @@ -38,49 +38,49 @@ 若造成伤害,玩家获得秃鹫之眼。 -秃鹫之眼/0费:受到秃鹫的攻击。当你受到伤害时,自动从手牌打出。 +秃鹫之眼:对玩家施加的抓牌堆状态卡牌(同名状态牌/0费:打出时移除。抓到时获得3层【暴露】(临时debuff,受到的伤害+1/每层)) ### 沙蝎 概念:攻+强化 -【尾刺X】:玩家回合结束时受到沙蝎的X点攻击。受伤时失去等量【尾刺】。 +【尾刺X】:对自己施加的姿态buff。攻击时,伤害提升X。 ### 幼沙虫 防+强化 -每回合第一次受伤时,玩家失去1点能量。 +【能量吸取】:对自己施加的延时buff。受伤时,玩家失去X点能量。 ### 蜥蜴 概念:攻+防+逃跑 -【脱皮】:若脱皮达到生命上限,则怪物逃跑,玩家不能获得战斗奖励。 +【脱皮】:对自己施加的姿态buff。若脱皮达到生命上限,则怪物逃跑,玩家不能获得战斗奖励。 ### 沙匪 -概念:攻特化 +概念:弱化玩家 -洗牌时,将一个随机物品的牌全部弃掉。 +【劫掠】:对玩家施加的延时debuff。回合开始时,随机弃掉一张手牌。 ## 精英 - 4种 ### 风暴之灵 -静电/0费:抓一张牌。在手里时,受到【电击】伤害+1。 +静电:对玩家施加的弃牌堆状态卡牌/0费:打出时自己获得1层【暴露】并抓一张牌。(临时debuff,受到的伤害+1/每层) -【风暴X】:攻击时,玩家获得1张静电。受伤时失去等量【风暴】。 +【风暴X】:对自己施加的姿态buff。攻击时,玩家获得1张静电。 ### 骑马枪手 -【冲锋X】:受到或造成的伤害翻倍并消耗等量的冲锋。 +【冲锋X】:对自己施加的姿态buff,受到或造成的伤害翻倍并消耗等量的冲锋。(额外伤害不会消耗姿态) ### 沙虫王 召唤幼体沙虫 -每当玩家弃掉一张牌,恢复1生命 +玩家弃掉疲劳时,恢复10生命 ### 沙漠守卫 diff --git a/src/samples/slay-the-spire-like/data/encounterDesert.csv.d.ts b/src/samples/slay-the-spire-like/data/encounterDesert.csv.d.ts index 348797f..b38ee83 100644 --- a/src/samples/slay-the-spire-like/data/encounterDesert.csv.d.ts +++ b/src/samples/slay-the-spire-like/data/encounterDesert.csv.d.ts @@ -4,7 +4,7 @@ type EncounterDesertTable = readonly { readonly type: "minion" | "elite" | "event" | "shop" | "camp" | "curio"; readonly name: string; readonly description: string; - readonly enemies: readonly [readonly enemy: EnemyDesert, readonly bonusHp: number]; + readonly enemies: readonly (readonly [enemy: EnemyDesert, bonusHp: number])[]; readonly dialogue: string; }[]; diff --git a/src/samples/slay-the-spire-like/data/enemyDesert.csv.d.ts b/src/samples/slay-the-spire-like/data/enemyDesert.csv.d.ts index 5f76109..7fdd3e4 100644 --- a/src/samples/slay-the-spire-like/data/enemyDesert.csv.d.ts +++ b/src/samples/slay-the-spire-like/data/enemyDesert.csv.d.ts @@ -3,7 +3,7 @@ import type { EffectDesert } from './effectDesert.csv'; type EnemyDesertTable = readonly { readonly id: string; readonly initHp: number; - readonly initBuffs: readonly [readonly effect: EffectDesert, readonly stacks: number]; + readonly initBuffs: readonly (readonly [effect: EffectDesert, stacks: number])[]; readonly initialIntent: string; }[]; diff --git a/src/samples/slay-the-spire-like/data/enemyIntentDesert.csv.d.ts b/src/samples/slay-the-spire-like/data/enemyIntentDesert.csv.d.ts index 73b4766..64e0e04 100644 --- a/src/samples/slay-the-spire-like/data/enemyIntentDesert.csv.d.ts +++ b/src/samples/slay-the-spire-like/data/enemyIntentDesert.csv.d.ts @@ -6,7 +6,7 @@ type EnemyIntentDesertTable = readonly { readonly id: string; readonly nextIntents: readonly EnemyIntentDesert[]; readonly brokenIntent: readonly EnemyIntentDesert[]; - readonly effects: readonly ["self" | "player" | "team", EffectDesert, number]; + readonly effects: readonly (readonly [target: "self" | "player" | "team", effect: EffectDesert, value: number])[]; }[]; export type EnemyIntentDesert = EnemyIntentDesertTable[number]; diff --git a/src/samples/slay-the-spire-like/data/heroItemFighter1.csv.d.ts b/src/samples/slay-the-spire-like/data/heroItemFighter1.csv.d.ts index de4efd2..7e58151 100644 --- a/src/samples/slay-the-spire-like/data/heroItemFighter1.csv.d.ts +++ b/src/samples/slay-the-spire-like/data/heroItemFighter1.csv.d.ts @@ -9,7 +9,7 @@ type HeroItemFighter1Table = readonly { readonly targetType: "single" | "none"; readonly price: number; readonly desc: string; - readonly effects: readonly ["self" | "target" | "all" | "random", EffectDesert, number]; + readonly effects: readonly (readonly [target: "self" | "target" | "all" | "random", effect: EffectDesert, value: number])[]; }[]; export type HeroItemFighter1 = HeroItemFighter1Table[number]; diff --git a/src/samples/slay-the-spire-like/data/statusCardDesert.csv.d.ts b/src/samples/slay-the-spire-like/data/statusCardDesert.csv.d.ts index 45134c5..1ecf59a 100644 --- a/src/samples/slay-the-spire-like/data/statusCardDesert.csv.d.ts +++ b/src/samples/slay-the-spire-like/data/statusCardDesert.csv.d.ts @@ -5,7 +5,7 @@ type StatusCardDesertTable = readonly { readonly name: string; readonly desc: string; readonly unplayable: boolean; - readonly effects: readonly ["self", EffectDesert, number]; + readonly effects: readonly (readonly [target: "self", effect: EffectDesert, value: number])[]; }[]; export type StatusCardDesert = StatusCardDesertTable[number];