arena/context/core.md

12 KiB

Update: Worker Entrypoints

  • src/game/arena/fighterLodWorker.js is bundled as a Vite module worker for large-battle render LOD candidate selection.
  • It is separate from src/game/combat/aggregateCombatWorker.js: LOD worker chooses which sprites should be detailed, while aggregate combat worker advances detached/offscreen combat math.

Update: Full Rolling-Window Detail Constants

  • Focused large-battle rendering no longer uses a separate zoomed sprite cap or rolling-window buffer ratio.
  • PERFORMANCE.LARGE_BATTLE_SPRITE_RENDER_LIMIT is the bounded representative sprite count for full-arena overview.
  • PERFORMANCE.LARGE_BATTLE_ROLLING_WINDOW_SCALE and PERFORMANCE.LARGE_BATTLE_SPRITE_VIEW_PADDING define the focused camera window whose living fighters are all promoted to detailed sprites.

Update: Web Worker Aggregate Path

  • aggregateCombatWorker.js is bundled as a Vite module worker and is used only for detached/offscreen aggregate combat math.
  • Main-thread combat keeps the authoritative Phaser/game-state mutations, while the worker exchanges Transferable TypedArrays for model position, HP, team, speed, DPS, and death results.
  • Worker failure disables the worker path and leaves the synchronous aggregate fallback active.

Update: LOD Traversal Reduction

  • Large-battle LOD now removes parked fighter bodies from Arcade World's active body set and re-enables them only when a fighter becomes detailed again.
  • LOD refreshes still use PERFORMANCE.LARGE_BATTLE_LOD_REFRESH_MS, but detail visibility changes are now applied as set differences after initial activation.
  • PERFORMANCE.LARGE_BATTLE_SPRITE_VIEW_PADDING also pads the dot redraw culling view so zoomed camera movement does not require drawing every offscreen LOD dot.

Update: Aggregate Combat Constants

  • PERFORMANCE.LARGE_BATTLE_AGGREGATE_COMBAT_REFRESH_MS controls the detached/offscreen aggregate combat tick interval.
  • PERFORMANCE.LARGE_BATTLE_AGGREGATE_CELL_SIZE controls the coarse combat grid size used for large-battle detached model groups.
  • PERFORMANCE.LARGE_BATTLE_AGGREGATE_SQUAD_SIZE controls how many detached fighters are represented by one squad in a cell/team group.
  • PERFORMANCE.LARGE_BATTLE_AGGREGATE_MAX_DEATHS_PER_CELL_TICK and LARGE_BATTLE_AGGREGATE_MAX_DEATHS_PER_TICK cap batched deaths to avoid a single aggregate tick creating a large DOM/game-state spike.
  • PERFORMANCE.LARGE_BATTLE_AGGREGATE_MOVEMENT_RATIO tunes the speed of detached models moving toward their nearest aggregate enemy cell.

Update: Large Battle Throttle Constants

  • PERFORMANCE.LARGE_BATTLE_SIMULATION_BUCKETS spreads detached model-only combat updates across frames during large live matches.
  • PERFORMANCE.LARGE_BATTLE_SIMULATION_MAX_DELTA_MS caps the accumulated delta used by throttled detached fighters.
  • PERFORMANCE.LARGE_BATTLE_TARGET_INDEX_REFRESH_MS controls how often the full target spatial index is rebuilt in large battles.
  • PERFORMANCE.WORLD_EFFECT_MODIFIER_REFRESH_MS throttles frost-zone speed modifier scans.
  • PERFORMANCE.LARGE_BATTLE_HUD_VISIBLE_LIMIT caps pooled fighter HUD health bars separately from normal battles.
  • The 8,000-fighter full-arena overview budget is intentionally tight through LARGE_BATTLE_SPRITE_RENDER_LIMIT; focused rolling-window views promote all fighters in the local window.

Update: Fighter Render LOD Constants

  • PERFORMANCE.LARGE_BATTLE_SPRITE_RENDER_LIMIT caps the number of representative detailed fighter sprites kept visible in the full-arena overview during large live battles.
  • PERFORMANCE.LARGE_BATTLE_ROLLING_WINDOW_SCALE makes the sprite-ready area larger than the exact camera view.
  • PERFORMANCE.LARGE_BATTLE_SPRITE_VIEW_PADDING provides a minimum rolling-window expansion even at tighter zooms.
  • PERFORMANCE.LARGE_BATTLE_LOD_REFRESH_MS throttles detailed-set recomputation, and PERFORMANCE.LARGE_BATTLE_DOT_REFRESH_MS throttles the shared dot overlay redraw.
  • PERFORMANCE.LARGE_BATTLE_DOT_SIZE and PERFORMANCE.LARGE_BATTLE_DOT_ALPHA tune the hidden-fighter dot representation.
  • CAMERA.LARGE_BATTLE_START_ZOOM controls the initial zoom used when a live match starts as a large battle.
  • CAMERA.MANUAL_FOCUS_TWEEN_MS and CAMERA.MANUAL_FOCUS_TWEEN_EASE tune manual camera pan/zoom transitions used by fighter/team selection and full-arena return.

Update: Phaser Render Tuning

  • src/constants.js exports RENDER for the Phaser canvas resolution. The arena remains ARENA.SIZE = 3200, while the canvas now renders at 1280 x 1280.
  • CAMERA.MIN_ZOOM is derived from render size versus arena size so full-arena overview still works at the lower internal canvas resolution.
  • src/main.js keeps pixelArt: true and now also sets autoRound: true plus powerPreference: "high-performance" for the Phaser game config.
  • PERFORMANCE.MINIMAP_REFRESH_MS centralizes the live minimap redraw interval so large battles avoid redrawing thousands of dots on every scene update.

Context: Core & Infrastructure

Update: Dense-Area Meteor Barrage

  • WORLD_EFFECT.AREA_TILES now defines the large warning/search square selected from the densest living-fighter region.
  • WORLD_EFFECT.WARNING_DURATION_MS controls how long that large warning marker stays visible without changing the scheduled strikes.
  • WORLD_EFFECT.IMPACT_AREA_TILES, IMPACT_COUNT_MIN, IMPACT_COUNT_MAX, IMPACT_STAGGER_MS, and IMPACT_VISUAL_SCALE configure the smaller strikes fired inside that warning square.
  • WORLD_EFFECT.SIZE_SCALE_VARIANCE randomizes each fire/frost impact around the smaller strike size.
  • WORLD_EFFECT.INTERVAL schedules the first barrage after match start, and WORLD_EFFECT.REPEAT_INTERVAL schedules later normal barrages.
  • Meteor impact shake strength follows the same size multiplier, using WORLD_EFFECT.METEOR_SHAKE_DURATION_MS and WORLD_EFFECT.METEOR_SHAKE_INTENSITY as base values.

Update: Direct Fighter Counts And Match Cap

  • Live-match name entries use the name*N suffix as the assigned fighter count; a name without *N creates one assigned fighter.
  • SPAWN.MAX_FIGHTER_COUNT is the maximum for participant-assigned fighter slots and is currently 8,000; Slime trait-generated fighters are excluded.
  • Limit failures during live-match setup are surfaced beneath the participant nickname input.
  • SPAWN.FIGHTERS_PER_STARTING_ZONE controls starting-zone distribution; each additional block of that many assigned fighters adds a team zone.

Update: Performance Constants

  • src/constants.js now exports PERFORMANCE for large-battle tuning: fighter threshold, target grid size, HUD pool/candidate limits, graphics minimap settings/redraw interval, and large-battle dead despawn delay.
  • Keep large-battle behavior switches tied to PERFORMANCE.LARGE_BATTLE_FIGHTER_THRESHOLD so high-count match tuning stays centralized.

Update: Dead Fighter Despawn Constant

  • FIGHTER.DEAD_DESPAWN_DELAY_MS controls how long a dead fighter fades before disappearing; FIGHTER.DEAD_DESPAWN_ALPHA controls the fade target.

1. 모듈별 상세 역할

  • src/main.js: Phaser 게임의 전역 설정(Physics, Scale, Canvas Parent)을 담당하며, ArenaScene을 인스턴스화합니다.
    • 앱 로드 시 trackVisitor()를 호출해 방문자 체크 API와 연동합니다.
    • Start 버튼, 옵션 drawer, 전투 시작 submit 흐름을 제어하며 전투 시작 시 #appmatch-live 상태 클래스를 부여합니다.
    • 전투 중 drawer 접기/펼치기(drawer-collapsed), 재시작 버튼, 일시정지 버튼 상태(match-paused)를 DOM 클래스와 ArenaScene 상태에 동기화합니다.
  • src/constants.js: 게임 내 모든 튜닝 수치를 관리합니다.
    • FIGHTER_TYPE_STATS: melee, ranged, magic별 최대 체력, 이동속도, 사거리, 쿨다운, 피해량, 치명타 및 공격 발동 지연 기본값.
    • FIGHTER_HITBOX_*: 100x100 캐릭터 프레임 안에서 실제 충돌 판정이 놓이는 위치와 크기.
    • KILL_HEALTH_RECOVERY_RATIO, KILL_GROWTH_MULTIPLIER, KILL_GROWTH_MAX_MULTIPLIER: 처치 후 회복량, 크기/공격속도/이동속도 성장 배율, 누적 보상 상한.
    • WORLD_EFFECT.*: 첫/반복 포격 간격, 밀집 경고 범위, 개별 탄착 범위/발수/시각 배율, 대각선 낙하 거리, 화염/냉기 메테오 피해량, 냉기 동결 시간/색상, 냉각지대 지속시간과 감속 배율.
    • SELECTED_FIGHTER_OUTLINE_GAP, SELECTED_FIGHTER_OUTLINE_WIDTH, SELECTED_FIGHTER_OUTLINE_ALPHA: 팀 색상 실루엣 마커의 캐릭터 이격 거리, 두께, 투명도.
    • TEAM_COLORS, getTeamColor(): 8팀 이하에서는 기본 팔레트를 쓰고, 9팀 이상에서는 팀 수에 맞춰 중복 없는 색상을 동적으로 생성합니다.
    • CAMERA.SPECTATOR_LERP: 카메라 추적의 부드러움 정도.
    • CAMERA.METEOR_FOCUS_ENABLED, CAMERA.METEOR_FOCUS_ZOOM, CAMERA.METEOR_FOCUS_HOLD_DURATION: 자동 관전 진입 전 화염/냉기 메테오 착탄 위치의 임시 포커싱 on/off, 확대 배율 및 착탄 후 유지 시간.
    • CAMERA.SPECTATOR_LATE_FIGHTER_THRESHOLD: 생존 인원 임계값에 따른 후반 자동 관전 진입 조건. (2팀만 남았더라도 이 수치보다 인원이 많으면 자동 관전을 유예합니다.)
    • CAMERA.SPECTATOR_FINAL_TEAM_TOTAL_THRESHOLD, CAMERA.SPECTATOR_RANDOM_FOCUS_INTERVAL, COMBAT.FINAL_SLOW_MOTION_*: 최종교전 관전 조건, 랜덤 포커싱 간격, 슬로우모션 on/off, 배율과 속도 램프 시간.
    • MINIMAP_VIEWPORT_SIZE: 미니맵의 고정 픽셀 크기.
    • ARENA_SIZE: 경기장 전체 크기 (GRID * TILE).

2. 개발 및 유지보수 규칙

  • 신규 캐릭터 추가: public/assets/characters/에 에셋 배치 후 fighterManifest.js에 정의를 추가하면 즉시 게임에 반영됩니다.
  • 종족값 유지: 신규 스킨을 추가할 때는 사망 통계가 누락되지 않도록 specieshuman, orc, skeleton, slime, wolf, bear 중 하나로 지정해야 합니다.
  • 물리 수치 조정: 역할별 기본 체력/속도/사거리/공격 수치는 src/constants.jsFIGHTER_TYPE_STATS에서 변경하고, 특정 스킨만 다르게 할 때는 fighterManifest.jsstats 또는 combat 설정을 사용하십시오.
  • 처치 성장 상한 조정: 처치 보상으로 캐릭터가 커지는 최대치와 공격/이동 배율 상한은 src/constants.jsKILL_GROWTH_MAX_MULTIPLIER를 수정합니다.
  • 공격력 조정: 역할별 기본 피해량은 src/constants.jsFIGHTER_TYPE_STATS.<type>.damageMin/damageMax를 수정합니다. 캐릭터별 특수 공격 방식은 fighterManifest.jscombat 설정을 우선 확인합니다.
  • 월드 이펙트 조정: src/constants.jsWORLD_EFFECT.INTERVAL, WORLD_EFFECT.REPEAT_INTERVAL, WORLD_EFFECT.AREA_TILES, WORLD_EFFECT.WARNING_DURATION_MS, WORLD_EFFECT.IMPACT_AREA_TILES, WORLD_EFFECT.IMPACT_COUNT_MIN, WORLD_EFFECT.IMPACT_COUNT_MAX, WORLD_EFFECT.IMPACT_STAGGER_MS, WORLD_EFFECT.IMPACT_VISUAL_SCALE, WORLD_EFFECT.SIZE_SCALE_VARIANCE, WORLD_EFFECT.FALL_TRAVEL_TILES, WORLD_EFFECT.METEOR_SHAKE_DURATION_MS, WORLD_EFFECT.METEOR_SHAKE_INTENSITY, WORLD_EFFECT.METEOR_DAMAGE, WORLD_EFFECT.FROST_DAMAGE, WORLD_EFFECT.FROST_STUN_DURATION, WORLD_EFFECT.FROST_STUN_TINT, WORLD_EFFECT.FROST_DURATION, WORLD_EFFECT.FROST_SPEED_MULTIPLIER를 수정합니다. INTERVAL은 첫 포격까지의 대기 시간, REPEAT_INTERVAL은 이후 일반 포격 주기, AREA_TILESWARNING_DURATION_MS는 밀집 경고 구역과 표시 시간이며, IMPACT_* 값은 그 내부 실제 포격을 제어합니다. 임시 메테오 카메라는 CAMERA.METEOR_FOCUS_ENABLED로 끌 수 있습니다.
  • DOM 접근: 성능을 위해 ArenaScene은 좌측 HUD badge 등 필요한 시점에만 최소한으로 DOM에 접근합니다.
  • 패키지 락 파일: 이 프로젝트는 package-lock.json을 저장소에서 제외합니다. 의존성 변경 시 package.json을 기준으로 관리합니다.