Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 | 42x 42x | /**
* ☴ 손 (SON) - Wind Stance Techniques
* 선풍연격 - Continuous Pressure (Taekyon Rhythmic Combat)
*
* The Wind stance (손괘) embodies continuous pressure and rhythmic flow.
* Based on traditional Taekyon (택견) - the oldest Korean martial art,
* emphasizing fluid footwork, rhythmic movement, and unrelenting pressure.
*
* Philosophy: "바람처럼 끊임없이 흐르라" - Flow endlessly like the wind
*
* @module SonTechniques
*/
import type { TrigramStanceTechnique } from "@/systems/vitalpoint";
import {
CombatAttackType,
DamageType,
TrigramStance,
} from "../../../types/common";
import { AnimationType } from "../../animation";
/**
* SON stance techniques - Wind / Continuous Pressure
* Taekyon rhythmic combat with continuous flowing attacks
*
* Technique characteristics:
* - Continuous pressure attacks
* - Rhythmic striking patterns
* - Fluid footwork integration
* - Destabilizing movements
*
* Animation speeds are calibrated for rhythmic flow:
* - Fast: 1.2-1.3 (rapid footwork, quick strikes)
* - Normal: 1.0 (standard techniques)
* - Sustained: 0.9-1.0 (continuous pressure)
*/
export const SON_TECHNIQUES: readonly TrigramStanceTechnique[] = [
// ============= Primary Technique =============
{
id: "son_whirlwind_barrage",
name: {
korean: "선풍연격",
english: "Whirlwind Barrage",
romanized: "seonpung_yeongyeok",
},
koreanName: "선풍연격",
englishName: "Whirlwind Barrage",
romanized: "seonpung_yeongyeok",
description: {
korean: "바람처럼 연속적인 공격",
english: "Continuous attacks like wind",
},
stance: TrigramStance.SON,
type: CombatAttackType.STRIKE,
damageType: DamageType.BLUNT,
damage: 22,
kiCost: 8,
staminaCost: 30,
accuracy: 0.7,
reachConfig: {
bodyPart: "arm",
techniqueType: "punch",
baseExtension: 0.95,
},
executionTime: 560,
recoveryTime: 840,
critChance: 0.06,
critMultiplier: 1.2,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "punch", // Type: shared category
animationId: "son_whirlwind_barrage", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Continuous striking pattern
animationType: AnimationType.RAPID_BARRAGE,
animationSpeed: 0.75,
category: "medium",
range: "short",
speed: 1.5,
// Son (Wind) combo flow properties - 선풍연쇄 (Whirlwind Chain)
comboWindow: 200, // 200ms timing window for next technique
comboPriority: 1, // Starter technique - opens combo chains
pressureStacks: 2, // Applies 2 pressure stacks on hit
},
// ============= Taekyon Footwork Techniques =============
{
id: "son_sweeping_low_kick",
name: {
korean: "품밟기",
english: "Sweeping Foot Attack",
romanized: "pum-balbgi",
},
koreanName: "품밟기",
englishName: "Sweeping Foot Attack",
romanized: "pum-balbgi",
description: {
korean: "택견의 낮은 발차기로 발목을 쓸어 넘어뜨림",
english: "Taekyon low sweeping kick targeting ankles",
},
stance: TrigramStance.SON,
type: CombatAttackType.KICK,
damageType: DamageType.BLUNT,
damage: 20,
kiCost: 10,
staminaCost: 22,
accuracy: 0.82,
reachConfig: {
bodyPart: "leg",
techniqueType: "kick",
baseExtension: 0.95,
},
executionTime: 770,
recoveryTime: 1190,
critChance: 0.12,
critMultiplier: 1.4,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "kick", // Type: shared category
animationId: "son_sweeping_low_kick", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Low sweeping kick
animationType: AnimationType.SON_SWEEPING_LOW_KICK,
animationSpeed: 0.75,
category: "medium",
range: "medium",
speed: 1.1,
// Son (Wind) combo flow properties
comboWindow: 200,
comboPriority: 2, // Mid-chain technique - bridges combos
pressureStacks: 1, // Applies 1 pressure stack on hit
},
{
id: "son_rapid_footwork",
name: {
korean: "품밟기연환",
english: "Rapid Footwork Chain",
romanized: "pum-balbgi-yeonhwan",
},
koreanName: "품밟기연환",
englishName: "Rapid Footwork Chain",
romanized: "pum-balbgi-yeonhwan",
description: {
korean: "택견의 빠른 발놀림으로 연속 타격",
english: "Taekyon rapid footwork with continuous strikes",
},
stance: TrigramStance.SON,
type: CombatAttackType.KICK,
damageType: DamageType.BLUNT,
damage: 28,
kiCost: 16,
staminaCost: 24,
accuracy: 0.74,
reachConfig: {
bodyPart: "leg",
techniqueType: "kick",
baseExtension: 1.05,
},
executionTime: 840,
recoveryTime: 1260,
critChance: 0.16,
critMultiplier: 1.6,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "footwork", // Type: shared category
animationId: "son_rapid_footwork", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Rapid footwork sequence
animationType: AnimationType.SON_RAPID_FOOTWORK,
animationSpeed: 0.75,
category: "medium",
range: "medium",
speed: 1.2,
// Son (Wind) combo flow properties
comboWindow: 200,
comboPriority: 2, // Mid-chain technique - bridges combos
pressureStacks: 2, // Applies 2 pressure stacks on hit
},
// ============= Rhythmic Striking Techniques =============
{
id: "son_rhythmic_strikes",
name: {
korean: "결련수",
english: "Rhythmic Hand Strikes",
romanized: "gyeolryeon-su",
},
koreanName: "결련수",
englishName: "Rhythmic Hand Strikes",
romanized: "gyeolryeon-su",
description: {
korean: "택견의 리듬감 있는 연속 손타격",
english: "Taekyon rhythmic continuous hand strikes",
},
stance: TrigramStance.SON,
type: CombatAttackType.STRIKE,
damageType: DamageType.PRESSURE,
damage: 24,
kiCost: 12,
staminaCost: 28,
accuracy: 0.85,
reachConfig: {
bodyPart: "arm",
techniqueType: "punch",
baseExtension: 0.95,
},
executionTime: 630,
recoveryTime: 979,
critChance: 0.22,
critMultiplier: 2.0,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "punch", // Type: shared category
animationId: "son_rhythmic_strikes", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Rhythmic hand combination
animationType: AnimationType.SON_RHYTHMIC_STRIKES,
animationSpeed: 0.75,
category: "special",
range: "short",
speed: 1.2,
// Son (Wind) combo flow properties
comboWindow: 200,
comboPriority: 3, // Finisher technique - ends combos
pressureStacks: 3, // Applies 3 pressure stacks on hit (high pressure)
},
{
id: "son_flowing_push",
name: {
korean: "밀기",
english: "Flowing Push",
romanized: "mil-gi",
},
koreanName: "밀기",
englishName: "Flowing Push",
romanized: "mil-gi",
description: {
korean: "택견의 밀기로 상대의 균형을 무너뜨림",
english: "Taekyon push disrupting opponent's balance",
},
stance: TrigramStance.SON,
type: CombatAttackType.STRIKE,
damageType: DamageType.PRESSURE,
damage: 20,
kiCost: 8,
staminaCost: 20,
accuracy: 0.85,
reachConfig: {
bodyPart: "arm",
techniqueType: "punch",
baseExtension: 0.9,
},
executionTime: 700,
recoveryTime: 1050,
critChance: 0.1,
critMultiplier: 1.3,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "strike", // Type: shared category
animationId: "son_flowing_push", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Flowing push movement
animationType: AnimationType.SON_FLOWING_PUSH,
animationSpeed: 0.75,
category: "medium",
range: "short",
speed: 1.0,
// Son (Wind) combo flow properties
comboWindow: 200,
comboPriority: 1, // Starter technique - opens combo chains
pressureStacks: 1, // Applies 1 pressure stack on hit
},
// ============= Spinning Techniques =============
{
id: "son_spinning_elbow",
name: {
korean: "돌려팔꿈치",
english: "Spinning Elbow",
romanized: "dollyeo-palkkumchi",
},
koreanName: "돌려팔꿈치",
englishName: "Spinning Elbow",
romanized: "dollyeo-palkkumchi",
description: {
korean: "회전하며 연속적으로 가하는 팔꿈치 공격",
english: "Continuous spinning elbow strikes",
},
stance: TrigramStance.SON,
type: CombatAttackType.ELBOW,
damageType: DamageType.BLUNT,
damage: 26,
kiCost: 14,
staminaCost: 26,
accuracy: 0.76,
reachConfig: {
bodyPart: "arm",
techniqueType: "elbow",
baseExtension: 0.5,
},
executionTime: 770,
recoveryTime: 1190,
critChance: 0.14,
critMultiplier: 1.5,
effects: [],
// NEW ARCHITECTURE: Separate type (category) from ID (unique)
animationCategory: "elbow_strike", // Type: shared category
animationId: "son_spinning_elbow", // ID: unique 1-1 mapping
// Legacy field for backward compatibility
// Animation: Spinning elbow attack
animationType: AnimationType.ELBOW_STRIKE,
animationSpeed: 0.75,
category: "medium",
range: "short",
speed: 1.1,
// Son (Wind) combo flow properties
comboWindow: 200,
comboPriority: 3, // Finisher technique - ends combos
pressureStacks: 2, // Applies 2 pressure stacks on hit
},
] as const;
/**
* Get SON techniques count
*/
export const SON_TECHNIQUE_COUNT = SON_TECHNIQUES.length;
/**
* Get SON technique by ID
*/
export function getSonTechniqueById(
id: string,
): TrigramStanceTechnique | undefined {
return SON_TECHNIQUES.find((t) => t.id === id);
}
/**
* Get all SON techniques by attack type
*/
export function getSonTechniquesByType(
type: CombatAttackType,
): readonly TrigramStanceTechnique[] {
return SON_TECHNIQUES.filter((t) => t.type === type);
}
|