8.4 KiB
8.4 KiB
Update: Variable Meteor Scale
worldEffects.jsresolves a fresh size multiplier for every fire/frost meteor drop.- Tune the base damage/frost zone with
WORLD_EFFECT.AREA_TILES, the base sprite size withWORLD_EFFECT.VISUAL_SCALE, and the shared random spread withWORLD_EFFECT.SIZE_SCALE_VARIANCE. - The same multiplier changes both the damage/frost zone bounds and the falling/impact sprite scale.
- Meteor impact shake uses the same size multiplier, scaling from
WORLD_EFFECT.METEOR_SHAKE_DURATION_MSandWORLD_EFFECT.METEOR_SHAKE_INTENSITY.
Update: Large Battle Targeting
combat.jsnow prepares a per-frame target spatial index throughprepareCombatFrame(scene).resolveTargetEnemy()keeps valid cached targets until their scan interval expires, then immediately looks up a fresh nearest enemy through the spatial grid.- Nearest enemy lookup searches grid cells outward from the fighter's current cell, with full-array scanning kept only as a fallback when no frame index exists.
- Large-battle corpse cleanup uses
PERFORMANCE.LARGE_BATTLE_FIGHTER_THRESHOLDandPERFORMANCE.LARGE_BATTLE_DEAD_DESPAWN_DELAY_MSfromsrc/constants.js.
Update: Team Shadow Animations And Frost Tint
- Dead fighters keep their death animation/corpse state at initial opacity, then fade out until
combat.jsremoves them fromscene.fightersand destroys the sprite. - Tune that fade/despawn lifetime with
FIGHTER.DEAD_DESPAWN_DELAY_MSand the final alpha withFIGHTER.DEAD_DESPAWN_ALPHAinsrc/constants.js. combat.jsresolves fighter animation keys throughensureFighterTeamAnimation()so every action can use the team-shadow baked texture generated from the original spritesheet.playIfNeeded()compares against the team-shadow animation key. This avoids switching back to the original non-team-colored spritesheet when fighters move, attack, take damage, or die.- Frost stun remains a body tint effect in
worldEffects.js. Since team identity is baked into the floor shadow pixels, there is noteamMarkertint state to update or restore. - The removed
teamMarkerdisplay object means death handling no longer needs to hide or destroy a separate marker. HUD cleanup only owns the name label and health bar objects.
Context: Combat System
1. 모듈별 상세 역할 (src/game/combat/)
combat.js: 전투 AI, 피해 계산, 처치 보상 등 핵심 전투 로직을 담당합니다.fighterStats.js에서 해석한 역할별 수치로 이동, 공격, 투사체 발사 등을 처리합니다.combatSettings.js: 전투 속도 배율 등 런타임 전투 설정을 관리합니다.arenaFinalCombatEffects.js: 최종 교전 시 슬로우 모션 등 연출 효과를 담당합니다. 수학적인 이징(easing) 함수와 물리 시간 배율 계산을 포함합니다.worldEffects.js: 실제 전투에서 4초마다 발동하는 화염/냉기 메테오 선택, 사분면별 대각선 낙하 연출, 5x5 영역 판정, 냉기 동결과 감속 구역 수명주기를 처리합니다.
2. 주요 로직 구현 세부 사항
전투 AI 및 유닛 동작
updateFighter(): 가장 가까운 적을 찾아 이동하거나 공격하는 유닛 AI의 핵심입니다.applyHit(): 일반 공격 피해량은 공격자의melee/ranged/magic프로필 피해량 범위에서 계산하고, 치명타 적중은Critical!표기와 즉시 처치를 처리합니다.- 역할별 기본값:
src/constants.js의FIGHTER_TYPE_STATS에서 체력, 이동속도, 사거리, 공격 쿨다운, 피해량, 치명타 확률, 발동 지연을 독립적으로 조절합니다. 투사체 속도는ranged, 효과 적중 지연은magic프로필에 포함됩니다. projectilePathHitsDefender(): 투사체가 대상을 스쳐 지나가지 않도록 궤적(Line)과 히트박스(Rectangle) 겹침 검사를 수행합니다.
처치 보상 및 성장
applyKillReward(): 처치한 캐릭터의 체력 회복(현재 체력 30%), 크기 증가, 공격속도/이동속도 배율 증가를 처리합니다. 누적 배율은KILL_GROWTH_MAX_MULTIPLIER로 제한합니다.clampFighterInsideArena(): 처치 성장 중 커진 캐릭터가 전장 바깥으로 나가지 않도록 위치를 보정합니다.
월드 이펙트
- 발동 규칙: 프리뷰가 아닌 실제 전투에서 전투 시간 4초마다 생존 캐릭터 하나를 표적으로 선택하고, 대상의 당시 위치를 중심으로 메테오 또는 냉각지대 중 하나를 무작위 발동합니다.
- 독주 표적 가중치:
닉네임*N의 구매 배수는 해당 팀의 정당한 초기 생존 지분으로 취급합니다. 생존 팀 사이에서 현재 생존 지분이 구매 배수 지분을 넘어선 팀만WORLD_EFFECT.DOMINANCE_TARGETING_MULTIPLIER에 따라 추가 표적 확률을 받습니다. 따라서 배수 팀은 시작 시 스탯이나 수량 패널티를 받지 않으며, 전투 중 독주가 생겼을 때만 랜덤 위험이 증가합니다. - 서든 데스 (Sudden Death):
- 조건: 매치 시작 후
WORLD_EFFECT.SUDDEN_DEATH.TRIGGER_MS시간이 경과하면 서든 데스 상태에 진입합니다 (활성화 시). - 효과: 메테오 투하 주기가
SUDDEN_DEATH.INTERVAL_MS로 단축되며,FORCE_FROST설정 시 빙결 효과를 가진 냉기 메테오가 집중적으로 생성됩니다. - 목적: 장기전을 방지하고 전장에 무작위 변수를 극대화하여 물량 중심 팀에게 리스크를 부여합니다.
- 조건: 매치 시작 후
- 낙하 방향과 크기: 대상이 전장 좌측 반면(2, 3사분면)이면 화살표가 좌상단에서 우하단으로, 우측 반면(1, 4사분면)이면 좌우 반전되어 우상단에서 좌하단으로 이동합니다. 스프라이트를 45도로 기울이고 전용 시각 배율을 사용해 전역 마법 규모로 표현합니다.
- 화염 메테오:
world_Effect.png의 7프레임 애니메이션이 낙하하면 크기에 따른 화면 흔들림을 적용하고, 5x5 타일 영역의 생존자에게 고정 피해를 줍니다. 자동 관전 진입 전에는CAMERA.METEOR_FOCUS_ENABLED가 켜져 있을 때 착탄 위치를 임시 포커싱합니다. 환경 피해로 인한 사망은 킬 보상을 지급하지 않지만 사망 통계와 승패 판정에는 반영됩니다. - 냉기 메테오:
world_Effect_2.png의 7프레임 애니메이션으로 착탄을 표시하고 크기에 따른 화면 흔들림을 적용하며, 자동 관전 진입 전에는 같은 설정에 따라 착탄 위치를 임시 포커싱합니다. 착탄 시 별도 조정 가능한 피해를 주며, 생존한 피격 대상은 캐릭터 본체와 실루엣이 얼음색으로 바뀐 채 2초 동안 기절합니다. 이후 남은 5x5 냉각지대 안에서는 공격속도와 이동속도 감속 배율을 적용하며, 영역을 벗어나거나 지속시간이 끝나면 배율을 복구합니다.
최종교전 슬로우모션
COMBAT.FINAL_SLOW_MOTION_ENABLED가 활성화된 경우:
- 최종교전 상태에서 공격 모션이 시작될 때 전역 time scale을 낮춥니다.
- 진입/유지/복귀 속도 램프(Ease)를 적용합니다.
- Arcade Physics는 timeScale 방향이 반대라 물리 이동에는 역수 배율을 적용합니다.
3. 유지보수 규칙
- 처치 성장 상한:
src/constants.js의KILL_GROWTH_MAX_MULTIPLIER를 수정합니다. - 공격력 조정:
src/constants.js의FIGHTER_TYPE_STATS.<type>.damageMin/damageMax를 수정합니다. - 월드 이펙트 및 서든 데스 조정:
src/constants.js의WORLD_EFFECT.METEOR_DAMAGE와WORLD_EFFECT.FROST_DAMAGE로 피해량을 조정합니다.SUDDEN_DEATH.ENABLED로 서든 데스 활성화 여부를 결정하며,TRIGGER_MS(시작 시간),INTERVAL_MS(주기),FORCE_FROST(냉기 고정) 설정을 변경할 수 있습니다.DOMINANCE_TARGETING_MULTIPLIER는 구매 지분을 초과한 생존 지분에 대한 표적 가중치입니다.0은 기존 생존 유닛 비례 추첨, 기본값1은 계산된 초과 비율을 그대로 반영합니다.WORLD_EFFECT.FROST_STUN_DURATION/FROST_STUN_TINT로 동결 시간과 표시 색상을 조정합니다.- 나머지
WORLD_EFFECT.*값으로 발동 주기, 범위, 냉각 지속시간과 감속 정도를 수정하며, 메테오 착탄 위치 포커싱은CAMERA.METEOR_FOCUS_ENABLED에서 켜고 끕니다.
- 특수 규칙: 캐릭터별 특수 공격 방식은
fighterManifest.js의combat설정을 확인합니다.