-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtypes.ts
More file actions
238 lines (221 loc) · 7.58 KB
/
Copy pathtypes.ts
File metadata and controls
238 lines (221 loc) · 7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
export enum GameState {
MENU,
BOND_SELECTION, // ⭐ 新增:羁绊选择界面
PLAYING,
PAUSED_LEVEL_UP,
GAME_OVER,
VICTORY
}
export enum CharacterId {
REIMU = 'reimu',
MOKOU = 'mokou',
MARISA = 'marisa',
SAKUYA = 'sakuya',
YUMA = 'yuma',
KOISHI = 'koishi'
}
export interface CharacterPhysics {
mass: number; // 质量(影响击退,10-100)
friction: number; // 摩擦力(0.05-0.2)
hitboxScale: number; // 判定倍率(0.8-1.2)
immuneToOilSlow: boolean; // 免疫油渍减速
healInFire: boolean; // 火中回血
immuneToKnockback: boolean; // 免疫击退
canPassThroughEnemies: boolean; // 穿过敌人
}
export interface CharacterConfig {
id: CharacterId;
name: string;
title: string;
description: string;
color: string;
stats: PlayerStats;
physics: CharacterPhysics;
startingWeaponId: string;
}
export interface PlayerStats {
maxHp: number;
hp: number;
speed: number;
might: number; // Damage multiplier
area: number; // Size multiplier
cooldown: number; // 0.0 to 1.0 (multiplier)
pickupRange: number;
luck: number;
armor: number;
recovery: number; // HP regen per sec
revivals: number; // Lives
}
export interface Vector2 {
x: number;
y: number;
}
export interface Entity {
id: string;
position: Vector2;
velocity: Vector2;
radius: number;
color: string;
sprite?: string;
}
export interface Enemy extends Entity {
hp: number;
maxHp: number;
damage: number;
speed: number;
type: 'fairy' | 'ghost' | 'boss' | 'slime' | 'elf';
exp: number; // ⭐ Added to match GameCanvas usage
frozen: number; // Frames frozen
// Bouncing properties for slime-type enemies
bounceTimer?: number;
bounceHeight?: number;
isJumping?: boolean;
// Shooting properties for elf-type enemies
shootTimer?: number;
// Boss properties
isBoss?: boolean;
bossName?: string;
bossType?: 'cirno' | 'youmu' | 'kaguya';
attackPattern?: number;
patternTimer?: number;
// Status effects
burnDuration?: number; // Frames of burn remaining
burnDamage?: number; // Burn damage per tick
poisonDuration?: number; // Frames of poison remaining
poisonDamage?: number; // Poison damage per tick
stunDuration?: number; // Frames of stun remaining
// ⭐ 元素附魔状态
iceLayers?: number; // 冰霜层数(3层冻结)
poisonStacks?: number; // 毒层数(影响易伤)
gravitySuckDuration?: number; // 引力吸附剩余时间
gravitySuckPoint?: Vector2; // 引力吸附中心点
}
export interface Gem extends Entity {
value: number;
exp: number; // ⭐ Added to match GameCanvas usage
type: 'small' | 'medium' | 'large';
}
// ⭐ 元素掉落物 - 一次性永久附魔道具
export type ElementType = 'fire' | 'ice' | 'poison' | 'oil' | 'lightning' | 'gravity';
export interface ElementDrop extends Entity {
elementType: ElementType;
itemName: string; // 道具名称(如"琪露诺喝剩的水")
itemDescription: string; // 道具描述
}
export interface DamageNumber {
id: string;
position: Vector2;
value: number;
life: number; // frames
isCrit: boolean;
}
// ⭐ 地面效果区域(油渍、火焰区域等)
export interface GroundEffect {
id: string;
position: Vector2;
radius: number;
duration: number; // frames remaining
maxDuration: number;
type: 'oil' | 'fire';
slowAmount?: number; // For oil
damage?: number; // For fire
}
export interface Weapon {
id: string;
name: string;
description: string;
level: number;
maxLevel: number;
cooldownTimer: number;
cooldownMax: number; // in frames (60fps)
baseDamage: number;
exclusiveTo?: CharacterId; // If set, only this char can find it
type: 'projectile' | 'aura' | 'orbital' | 'laser' | 'dash' | 'special' | 'passive';
onFire: (source: Vector2, target: Vector2 | null, stats: PlayerStats, time: number) => Projectile[];
// 技能升级选项
upgrades?: string[]; // 已选择的升级ID列表(3/5/7级的特殊升级)
// 通用升级统计
damageBonus?: number; // 伤害加成倍数
cooldownBonus?: number; // 冷却减少倍数
areaBonus?: number; // 范围加成倍数
countBonus?: number; // 数量加成
speedBonus?: number; // 速度加成倍数
// ⭐ 符卡标记
isSpellCard?: boolean; // 是否是融合后的符卡武器
}
// 技能升级选项
export interface WeaponUpgradeChoice {
id: string;
weaponId: string;
name: string;
description: string;
icon: string;
tier: number; // 1, 2, 3 对应三次升级
}
export interface Projectile extends Entity {
damage: number;
duration: number; // frames
maxDuration: number;
penetration: number;
knockback: number;
homingStrength?: number; // 0 to 1
returnToPlayer?: boolean; // Boomerang
orbitSpeed?: number; // Orbital
orbitRadius?: number;
orbitAngle?: number;
isLaser?: boolean; // Raycast
isBlackHole?: boolean; // Pulls enemies
isTimeStop?: boolean; // Freezes enemies
onHitEffect?: 'freeze' | 'explode' | 'split' | 'heal' | 'burn' | 'poison' | 'stun' | 'slow';
isEnemyProjectile?: boolean; // True for enemy bullets
invisible?: boolean; // 隐形碰撞体,不渲染但有伤害判定
useFlameParticle?: boolean; // 使用火焰粒子特效代替普通渲染
// Special mechanics
splitCount?: number; // Number of projectiles to split into
splitAngleSpread?: number; // Angle spread for split projectiles
bounceCount?: number; // Number of times to bounce between enemies
chainCount?: number; // Number of enemies to chain to
chainRange?: number; // Range for chain lightning
burnDuration?: number; // Frames of burn effect
burnDamage?: number; // Burn damage per tick
poisonDuration?: number; // Frames of poison effect
poisonDamage?: number; // Poison damage per tick
stunDuration?: number; // Frames of stun effect
healAmount?: number; // HP to heal on hit
explosionRadius?: number; // Radius of explosion on hit/expiry
explosionDamage?: number; // Damage of explosion
bouncedEnemies?: Set<string>; // Track which enemies were already bounced to
chainedEnemies?: Set<string>; // Track which enemies were already chained to
weaponId?: string; // Track which weapon spawned this (for upgrade checks)
// ⭐ 元素附魔
element?: ElementType; // 弹幕附带的元素
// ⭐ 特殊效果
hasGravity?: boolean; // 受重力影响(抛物线)
onDeathEffect?: 'explode'; // 消失时触发的效果
slowDuration?: number; // Lv.3鸡尾酒瓶减速时间
slowAmount?: number; // 减速量
// ⭐ 博丽结界力场
isBarrierField?: boolean; // 结界力场特效
damageInterval?: number; // 伤害判定间隔(帧)
slowEffect?: number; // 减速效果(0-1,速度倍率)
damageTimer?: number; // 内部计时器,用于伤害判定
// ⭐⭐ 羁绊物理修正
wallBounces?: number; // 墙壁反弹次数(灵梦羁绊+1)
hasHomingAfterBounce?: boolean; // 反弹后是否诱导(灵梦羁绊)
canResurrect?: boolean; // 销毁时是否可复活(妹红羁绊)
hasResurrected?: boolean; // 是否已经复活过
delayTimer?: number; // 延迟发射计时器(咲夜羁绊)
phaseChance?: number; // 穿墙概率(恋恋羁绊)
}
export interface UpgradeOption {
id: string;
type: 'weapon' | 'passive' | 'heal' | 'weapon_upgrade' | 'weapon_stat';
name: string;
description: string;
icon: string;
level: number;
isNew: boolean;
rarity: 'common' | 'rare' | 'legendary';
weaponId?: string; // For weapon_upgrade/weapon_stat type, which weapon this upgrade belongs to
statType?: 'damage' | 'cooldown' | 'area' | 'count' | 'speed'; // For weapon_stat type
}