feat: batch wiki-fication of 00_Raw data

Applied double-save rule: Master Archive + Specialized Mapping for Skybound, Datacollector, and Frontend Mastery.
This commit is contained in:
Antigravity Agent
2026-04-25 22:52:01 +09:00
parent 44f1f2140b
commit df275f935b
90 changed files with 3371 additions and 0 deletions
@@ -0,0 +1,125 @@
# Skybound Code Structure Audit and Stabilization Plan
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw analysis logged before implementation
## 1. Overview
This document records the first code-level audit after reviewing Skybound-related wiki documents. The goal was to compare the documented architecture with the actual code path in `/Volumes/Data/project/Antigravity/Skybound`, identify design and feature risks, and define the first stabilization pass.
## 2. Documents Reviewed
- `Topics/Skybound/Skybound-Knowledge-Hub.md`
- `Topics/Skybound/01_Core_Engine/Skybound-Modular-Game-Architecture.md`
- `Topics/Skybound/01_Core_Engine/Game-Engine-Loop-and-System-Orchestration.md`
- `Topics/Skybound/05_Project_Issues/2026-04-22_Engine_Stability_Audit.md`
- `Topics/Skybound/02_Combat_AI/Combat-System-and-Bullet-Interaction-Pipeline.md`
- `Topics/Skybound/04_Mechanics_Progression/Campaign_and_Dual_Loop_System.md`
- `Topics/Skybound/04_Mechanics_Progression/InGame_Progression_System.md`
- `Technical_Reports/2026-04-22_Boss_Battle_System_Implementation.md`
## 3. Code Structure Observations
Skybound's actual runtime center is `src/features/game/hooks/useGameEngine.ts`. It directly instantiates and updates `EntityManager`, `StageDirectorSystem`, `SpawnerSystem`, `CombatSystem`, `ProgressionSystem`, `ModularWeaponSystem`, `TacticalSystem`, `HazardSystem`, `BossSystem`, `EffectSystem`, and `GameRenderer`.
`SystemManager.ts` exists and documents a centralized orchestration pattern, but the active engine path does not use it. This is not inherently broken, but it creates a mismatch between the documented orchestrator and the actual execution path.
React is primarily responsible for scene composition and modal/UI handling through `GameSceneRenderer.tsx`, while Zustand state is centralized in `useGameStore.ts`.
## 4. Confirmed Problems
### 4.1 Build Gate Is Broken
`npm run build` fails. Representative causes:
- `App.tsx` imports `useGameEngine` but does not use it.
- Legacy `src/features/game/combatSystem.ts` is still included in TypeScript compilation and has type drift against current domain models.
- `useSceneAudio.ts` does not include `HANGAR` in `SCENE_AUDIO`, despite `Scene` including `HANGAR`.
- `SystemBoss.phase` is typed as `1 | 2 | 3`, while `bossRegistry.ts` contains a 4-phase boss.
- `GameRenderer.ts` calls `CanvasRenderingContext2D.close()`, which should be `closePath()`.
- `EntityManager` initializes enemies with `movePattern: 'NONE'`, which is not part of the current `Enemy.movePattern` union.
### 4.2 Timeline Spawn Intents Are Not Wired
`StageDirectorSystem` dispatches `SCRIPTED_SPAWN` and `SPAWN_MODE` intents, but `useGameEngine.ts` does not route those intents to `SpawnerSystem`.
`SpawnerSystem` already provides `notifyScriptedSpawn()` and `activateSwarmBurst()`, so the design exists but the active dispatch wiring is missing.
Expected impact: scripted waves and burst events may not appear as designed, leaving procedural spawning to carry too much of the combat pacing.
### 4.3 Campaign Stage State Is Not a Single Source of Truth
`StageDirectorSystem` receives `campaignStageIndex` when created, but `GameState.currentStage` still defaults to `1` and is not initialized from the selected campaign stage.
Expected impact: Standard campaign can show stage progression in UI while the engine continues to evaluate boss selection, damage curves, backgrounds, rewards, and tech-part rolls as Stage 1.
### 4.4 StageManager Mode Can Drift from Store Mode
`StageManager` has its own internal `mode`, defaulting to `BLITZ`. The UI updates Zustand `stageMode`, but `stageManager.setMode()` is not called from the store action.
Expected impact: Standard campaign clear can call `stageManager.onStageClear()` while the singleton still believes it is in Blitz mode, preventing next-stage campaign progression.
### 4.5 COMMS Events Are Not Rendered
`COMMS` events are emitted by engine systems, and `CommsOverlay.tsx` exists, but `useGameEngine.ts` does not map `COMMS` events to `useGameStore.setComms()`. `CommsOverlay` is also not rendered by `App.tsx`.
Expected impact: mission dialogue, warning text, and tactical pacing messages are silently dropped.
### 4.6 Starter Weapon Timer Is Not Cleaned Up
`useGameEngine.ts` starts a `setTimeout()` for starter weapon selection, but cleanup does not clear the timer.
Expected impact: if the engine unmounts quickly, a stale timer can emit a level-up modal or pause signal from an old engine instance.
### 4.7 Skill Sync Boundary Is Fragile
`GameSceneRenderer.tsx` calls store `addSkill()` and then engine `applySkill()`. `ProgressionSystem.applySkillSelection()` says Zustand owns skill increments, but also mutates `state.skills` as a fallback.
Expected impact: this usually works because of the store subscription bridge, but the ownership boundary is not clean and may cause missed or inconsistent skill levels under timing stress.
## 5. Stabilization Plan
Priority order:
1. Restore TypeScript build by removing obvious compile blockers and isolating legacy drift.
2. Wire `SCRIPTED_SPAWN` and `SPAWN_MODE` intents from `StageDirectorSystem` into `SpawnerSystem`.
3. Initialize engine `currentStage` from `stageMode` and `campaignStageIndex`.
4. Keep `StageManager` mode synchronized with Zustand `stageMode`.
5. Route `COMMS` events into the store and render `CommsOverlay`.
6. Clear the starter weapon timer during engine cleanup.
## 6. Verification Targets
- `npm run build`
- `npm run lint` as a visibility check, with the expectation that broad historical lint debt may remain after the first stabilization pass.
## 7. Implementation Result
The first stabilization pass was applied immediately after this raw audit.
### 7.1 Build Recovery
- Removed an unused `useGameEngine` import from `App.tsx`.
- Added `HANGAR` to `SCENE_AUDIO` in `useSceneAudio.ts`.
- Excluded legacy `src/features/game/combatSystem.ts` from `tsconfig.app.json` because the active runtime path uses `src/features/game/systems/CombatSystem.ts`.
- Expanded boss phase typing from `1 | 2 | 3` to `number` so 4-phase registry bosses are valid.
- Fixed `EntityManager` default enemy `movePattern` from invalid `NONE` to `SIDE_TO_SIDE`.
- Fixed `CanvasRenderingContext2D.close()` to `closePath()`.
- Removed compile-blocking unused locals from active systems.
### 7.2 Runtime Wiring Recovery
- `SCRIPTED_SPAWN` intents now call `SpawnerSystem.notifyScriptedSpawn()`.
- `SPAWN_MODE` intents now activate `SWARM_BURST` or enqueue `MINI_BOSS` spawns.
- Engine `currentStage` now initializes from `campaignStageIndex + 1` in Standard mode.
- Zustand `setStageMode()` now synchronizes the `StageManager` singleton mode.
- `COMMS` engine events now populate `useGameStore.activeComms`.
- `CommsOverlay` is rendered while playing.
- Starter weapon selection timer is cleared during engine cleanup.
### 7.3 Verification Result
- `npm run build`: passed.
- `npm run lint`: still fails due broad pre-existing lint debt, mostly `@typescript-eslint/no-explicit-any`, older helper files, and React hook lint findings. The first pass reduced the functional blockers but did not attempt a large-scale type cleanup.
@@ -0,0 +1,149 @@
# Skybound Final Stylized Casual Magitech Redirection
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw art direction correction after final concept change
## 1. Reason for Redirection
The previous pass moved Skybound toward **Semirealistic Magitech Fantasy**, but the latest direction returns the project to a clearer and more immediately readable mobile-survival style.
The new target is **Stylized Casual Magitech** for a top-down survival shooter inspired by Survivor.io.
This direction prioritizes:
- maximum in-game visibility
- bold silhouettes
- thick readable outlines
- flat lighting
- vivid magical accents
- consistent UI language from intro to mission result
## 2. Core Concept
Skybound should feel like a polished casual magitech action game rather than a dark semirealistic fantasy title.
Primary gameplay readability goals:
- player vehicle must be instantly identifiable
- enemies must remain readable in dense hordes
- pickups and weapon icons must be recognizable at small sizes
- background grid must support movement clarity without competing with combat
- every exposed screen should share the same playful magitech frame language
## 3. Tone and Manner
### Stylized Casual Magitech
Visual language:
- bold navy outlines
- clean top-down silhouettes
- flat color blocks
- minimal material noise
- bright arcane cyan
- gold/orange mechanical accents
- purple and pink enemy/corruption accents
- chunky UI frames
- high contrast buttons and progress bars
Avoid:
- gritty brushed metal
- heavy realistic shadows
- low-contrast dark UI
- thin semireal linework
- noisy texture detail
- external non-project image dependencies
## 4. Palette
Base colors:
- deep navy outline
- saturated royal blue panels
- readable sapphire floor tiles
- bright brass and gold trim
Magic accents:
- arcane cyan for player and positive energy
- crystal white-blue for highlights
- vivid purple for advanced magic
- hot pink for danger and enemy cores
- mint green for healing and positive pickups
- orange/gold for calls to action
## 5. Screen Coverage
The exposed user-facing screens were reviewed and targeted by the final theme pass:
- Intro title screen
- Airframe select screen
- Hangar / upgrade overlay
- In-game HUD
- Quick start overlay
- Tutorial overlay
- Comms overlay
- Level up modal
- Mission success / failed / complete result screen
## 6. Asset Coverage
The procedural asset generator now outputs the final Stylized Casual Magitech library while preserving runtime file paths.
Generated categories:
- Magitech player airframes
- normal enemies
- elite enemies
- bosses
- modular stage tiles
- title and result local backdrops
- item drop sprite sheet
- turret sheet
- weapon and skill icons
- projectiles
- shield and currency icons
- muzzle flash, impact, explosion, and laser VFX
- commander and pilot portraits
- contact sheet preview
## 7. Implementation Notes
The generator was redirected away from semirealistic material rendering and toward flat, readable shapes.
Main implementation choices:
- palette updated to bright casual magitech colors
- default shape helpers now draw bold navy outlines
- material texture strength reduced to keep assets flat
- background tiles use readable grid blocks and low-competition arcane circuitry
- local title and result background images were generated
- title and result screens no longer depend on external Google image URLs
- global magitech CSS override was rewritten for the final casual tone
## 8. Changed Runtime Paths
Important changed or generated paths:
- `/Volumes/Data/project/Antigravity/Skybound/scripts/generate_magitech_assets.py`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/styles/magitechArt.css`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/TitleScreen.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/ResultCard.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/magitech_art_contact_sheet.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/background/title_magitech.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/background/result_magitech.png`
## 9. Verification
Asset generation completed successfully.
Production build completed successfully with:
```bash
npm run build
```
The build still reports that `/sprites/player.png` is left unresolved at build time, which is a Vite static asset warning and was already non-blocking. The production bundle was generated successfully.
@@ -0,0 +1,74 @@
# Skybound HUD and TAC Level Up Stylized Casual Magitech Fix
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw follow-up fix from gameplay HUD screenshot review
## 1. Screenshot Issues
The reviewed gameplay screenshots showed that the HUD and TAC Level Up modal still leaned heavily into the previous cyber-terminal style.
Observed issues:
- side HUD panels used thin cyan lines and transparent glass styling
- top TAC level widget looked like a cold terminal module
- control buttons were dark monochrome blocks
- TAC Level Up modal used glitch text and blue terminal cards
- skill cards did not share the bold casual magitech frame language
## 2. Cause
The global `magitechArt.css` provided the broad art direction, but component-level CSS files still applied later or more specific styles.
Main affected files:
- `HUDOverlay.css`
- `LevelUpModal.css`
These files preserved the original Stitch/cyber UI look and overrode parts of the new tone.
## 3. Fixes Applied
### HUD
HUD styling was redirected to Stylized Casual Magitech:
- chunky navy outlines
- rounded blue magitech panels
- gold active highlights
- mint/cyan resource bars
- less transparent glass
- stronger mobile-game button affordance
- side modules grouped into readable cards
- top TAC level widget converted to a framed casual panel
### TAC Level Up Modal
The level-up modal was restyled:
- removed glitch pseudo text
- removed aggressive terminal skew animation
- converted the modal into a rounded blue magitech reward panel
- added thick dark outline and drop-shadow depth
- changed skill cards to chunky selectable cards
- changed icon boxes to framed magitech sockets
- converted level dots into brighter readable pips
- kept EVO cards gold/orange for special hierarchy
## 4. Changed Runtime Paths
Important changed paths:
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HUDOverlay.css`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.css`
## 5. Verification
Production build completed successfully with:
```bash
npm run build
```
The existing `/sprites/player.png` static path warning remains non-blocking.
@@ -0,0 +1,83 @@
# Skybound Nova Burst Icon and Effect Fix
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw follow-up fix for skill-specific visual mismatch
## 1. Screenshot Issue
`Nova Burst` looked like a lemon-shaped projectile icon.
This did not match the actual skill behavior.
## 2. Skill Meaning
`Nova Burst` is not a missile, crystal shard, or thrown projectile.
Actual gameplay behavior:
- automatic radial AoE shockwave
- triggers around the player
- damages enemies inside the radius
- knocks enemies outward
- cooldown-based burst every few seconds
- evolves into `Nova Guardian`, which adds stronger golden guardian behavior
## 3. Art Direction Correction
The icon should communicate:
- central arcane core
- circular shockwave expansion
- radial force
- rune-like magitech energy
- area control around the player
It should not communicate:
- lemon
- fruit
- single projectile
- gem pickup
- missile tip
## 4. Fixes Applied
The procedural generator now creates `Nova Burst.png` with a dedicated `nova` icon shape.
New visual structure:
- cyan circular shockwave rings
- central navy magitech core
- arcane core light
- radial spokes showing outward force
- subtle purple secondary energy ring
The in-game Nova Burst renderer was also adjusted:
- center sprite is smaller and treated as a rune core
- expanding shockwave ring is now the main visual read
- added translucent pressure disk
- added segmented rune ring
- kept Guardian variant as gold/orange
## 5. Changed Runtime Paths
Important changed paths:
- `/Volumes/Data/project/Antigravity/Skybound/scripts/generate_magitech_assets.py`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/missiles/Nova Burst.png`
## 6. Verification
Asset generation completed successfully.
Production build completed successfully with:
```bash
npm run build
```
The existing `/sprites/player.png` static asset warning remains non-blocking.
@@ -0,0 +1,74 @@
# Skybound Particle and Supply Readability Fix
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw follow-up fix from gameplay screenshot review
## 1. Screenshot Issues
The reviewed screenshot exposed two readability problems.
Observed issues:
- Mint/cyan square particles were scattered across the floor and looked like items even though they could not be collected.
- The supply crate asset looked good, but it was not clear whether it was a player pickup or an enemy projectile/debris object.
## 2. Cause
### Mint Floor Squares
The mint squares were runtime particles from `EffectSystem`.
They were rendered in `GameRenderer.renderEffects()` using `fillRect()`, so every spark appeared as a small collectible-looking square.
These particles can come from combat hits, skill effects, EMP interactions, exp pickup feedback, or other short-lived feedback systems.
### Supply Ambiguity
The supply crate sprite itself was readable as an object, but the gameplay affordance was weak.
It needed explicit pickup language:
- pickup color
- capture ring
- directional marker
- short label
## 3. Fixes Applied
### Particle Shape
Runtime particles now render as small rotated diamond sparks instead of square floor blocks.
This keeps the magical spark feedback while reducing item confusion.
Normal shard fragments were also changed from square blocks to triangular fragments.
### Supply Pickup Readability
Supply drops now render with:
- mint-green dashed pickup ring
- soft pickup fill
- bobbing downward arrow
- retained supply crate sprite
- `PICK UP` label
This separates supply drops from enemy bullets, hazards, and cosmetic particles.
## 4. Changed Runtime Paths
Important changed path:
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
## 5. Verification
Production build completed successfully with:
```bash
npm run build
```
The existing `/sprites/player.png` static path warning remains non-blocking.
@@ -0,0 +1,141 @@
# Skybound Semirealistic Magitech Fantasy Redirection
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw art direction correction before second asset pass
## 1. Reason for Redirection
The first generated art pack leaned too far into childish cartoon readability: thick outlines, flat toy-like shapes, and simplified symbolic silhouettes.
The new target is **Semirealistic Magitech Fantasy** for a top-down horde survival-shmup inspired by Survivor.io, aimed at players aged 12-18 and casual adults.
## 2. Core Concept
The visual library should feel detailed, grounded, and cool rather than cute.
Primary references by feel:
- League of Legends-like readable fantasy detail
- Warhammer-like dark material weight
- Survivor.io-like top-down clarity and grid readability
This is still a game with high enemy density, so readability remains critical, but contrast should come from lighting, value, and energy color rather than thick black outlines.
## 3. Tone and Manner
### Semirealistic Magitech
Visual language:
- dark iron
- aged brass
- brushed metal
- weathered stone
- glowing crystals
- engraved runes
- arcane circuitry
- controlled deep shadows
- focused magical highlights
Avoid:
- childish cartoon shapes
- toy-like flat icons
- heavy black outlines
- overly bright candy palettes
- large simplified emblem-only designs
## 4. Palette
Base colors:
- dark sapphire
- dark iron
- forest green
- weathered brass
- basalt gray
- deep crimson
Magic accents:
- arcane blue for player energy
- neon purple for corruption
- plasma red for enemy/boss danger
- molten orange for forge/lava accents
## 5. Asset Rules
### Player Vehicle
The player vehicle should read as a Magitech airship rather than a simple airplane.
Required traits:
- complex symmetrical or slightly asymmetrical hull
- dark iron and brass material mix
- intense crystalline power core
- smaller gun turrets
- visible engine components, gears, vents, and rune plates
- subtle energy glow readable from top-down view
### Enemies
Enemies should be threatening corrupted creatures or ancient mechanical horrors.
Examples:
- clockwork spiders with poison sacks
- rune golems made of dark stone
- corrupted winged drakes
- ancient mechanical horrors with plasma-red cores
### Background
Background should preserve Survivor.io-style grid readability but feel like an immersive fantasy environment.
Target environments:
- ancient overgrown Magitech city ruin
- subterranean magma forge
Rules:
- weathered stone pavement
- broken magitech circuitry embedded in the floor
- basalt structures
- subtle lava or arcane channels
- background contrast lower than enemies and player
### Effects
Player effects should be arcane blue or crystal cyan.
Enemy effects should lean plasma red, purple, or corrupted crimson.
Death effects should be optimized and satisfying:
- scrap metal shards
- dark crystal fragments
- arcane dust
- controlled flashes, not full-screen clutter
### UI
UI should use Survivor.io-like directness with a refined dark iron and crystal shell.
Required traits:
- heavy dark iron frames
- crystal level bar
- rune and gear details
- minimal but detailed HUD
- clean modern gothic / steampunk-inspired readability
## 6. Implementation Notes
The next pass should replace the first cartoony art pack with a darker semirealistic procedural raster set while preserving runtime file paths.
The existing generator should be rewritten so future iterations can adjust palette, materials, and silhouettes consistently.
@@ -0,0 +1,153 @@
# Skybound Semirealistic Magitech Fantasy Art Pack
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Superseded by semirealistic second pass
## 1. Direction
Skybound's 2D visual identity was first redirected toward **Stylized Casual Magitech**, then corrected into **Semirealistic Magitech Fantasy** after visual review.
The corrected target tone is a top-down survival shooter inspired by clear mobile action readability, but with more mature fantasy material treatment:
- reduced outlines
- dark iron and brass material language
- controlled lighting
- glowing crystalline cores
- corrupted magical enemies
- ancient magitech ruin backgrounds
- high contrast at small gameplay sizes
- color-coded enemy and weapon readability
- playful magitech forms instead of realistic military hardware
## 2. Core Art Rules
### Silhouette
Every gameplay object must remain readable at 36-72px on canvas.
- Player vehicles use triangular forward-facing silhouettes.
- Normal enemies use compact diamond/bug-like silhouettes.
- Elite enemies use wider, more decorated silhouettes.
- Bosses use tall central hulls with visible side modules and glowing cores.
- Weapons and drops use symbolic icons instead of detailed illustrations.
### Linework
Use value contrast and glow separation instead of heavy cartoon outlines.
Purpose:
- separates sprites from busy scrolling backgrounds through lighting
- keeps bullets, drops, and enemies visible during VFX-heavy combat
- supports a grounded semirealistic style
### Lighting
Lighting is controlled and directional. Avoid noisy photorealism, but use subtle brushed metal, stone, and crystal texture.
Allowed:
- small inner highlights
- soft magical glow behind important objects
- subtle bevels
- material grain
- controlled shadow
Avoid:
- toy-like flat panels
- low-contrast smoke
- tiny greeble details
### Palette
Corrected palette:
- Void: `#080a12`
- Dark iron: `#1c2029`
- Aged brass: `#a57a37`
- Dark sapphire: `#102a52`
- Forest green: `#164535`
- Crimson: `#671a20`
- Arcane blue: `#36cdff`
- Neon purple: `#b03eff`
- Plasma red: `#ff4149`
- Molten orange: `#ff7a21`
## 3. Generated Asset Coverage
The following runtime assets were regenerated in-place under `public/sprites`:
- player airframes: `Falcon.png`, `rayce.png`
- charge shot: `chargeshot.png`
- normal enemies: `normal_enemy/enemy01.png` through `enemy09.png`
- elite enemies: `elite_enemy/elite01.png` through `elite16.png`
- bosses: `boss/tile000.png` through `tile010.png`
- turret atlas: `turret/turret_sprites.png`
- item drops: `item_drops_sprite.png`
- stage backgrounds: `background/stage_tile_1.png` through `stage_tile_8.png`
- weapon and skill icons under `sprites/missiles`
- core bullet, shield, currency, VFX sprites
- comms portraits: `portraits/hq_commander.png`, `portraits/pilot_standard.png`
## 4. UI Skin Coverage
The UI skin was added through:
- `src/features/game/styles/magitechArt.css`
- imported from `src/App.css`
The skin aligns:
- HUD panels
- level-up cards
- comms overlay
- hangar/action buttons
- warning text
- canvas saturation/contrast
## 5. Generator
The art pack is reproducible through:
`scripts/generate_magitech_assets.py`
This script uses the bundled Python runtime with Pillow and generates vector-like raster PNGs. It intentionally avoids relying on one-off manual image files so future palette or silhouette changes can be regenerated consistently.
## 6. Preview Sheet
Generated preview sheet:
`public/sprites/magitech_art_contact_sheet.png`
The preview sheet is for art review only and is not currently consumed by the game runtime.
## 7. Follow-up Art Tasks
Recommended next art pass:
1. Add animation frame variants for normal and elite enemies.
2. Split skill icons into a formal UI icon atlas instead of relying on individual PNGs.
3. Add boss-specific silhouettes matching the narrative names in `bossRegistry.ts`.
4. Add projectile color language documentation for player, enemy, boss, and gimmick bullets.
5. Replace remaining CSS vocabulary from older cyber-neon UI with magitech naming over time.
## 8. Second Pass Correction
After user review, the first art pack was judged too childish/cartoon-like. The generator and UI skin were rewritten.
Second pass changes:
- removed thick outlines
- added brushed metal / stone noise
- added stronger shadows and glow-based separation
- changed vehicles into darker magitech airships
- changed enemies into corrupted mechanical/stone silhouettes
- changed backgrounds into darker stone grid ruins with broken circuitry
- changed UI from bright toy-card framing to dark iron/crystal framing
The reproducible generator remains:
`scripts/generate_magitech_assets.py`
@@ -0,0 +1,102 @@
# Skybound Stylized Casual Magitech Ingame Asset Fix
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw follow-up fix from gameplay screenshot review
## 1. Screenshot Issues
The reviewed screenshots exposed three in-game visual problems.
Observed issues:
- `SUPPLY` air drop was rendered as a simple cyan ring and text label instead of a proper magitech supply crate.
- Enemy sprites showed a faint rectangular transparency box around the aircraft body.
- Large falling translucent circular hazards were rendered as plain gray circles and did not match the Stylized Casual Magitech tone.
## 2. Cause
### Supply Drop
The supply drop was not using an image asset.
It was drawn directly in `GameRenderer.renderAirDrops()` as:
- animated circle stroke
- translucent cyan fill
- white `SUPPLY` text
### Enemy Rectangle Artifact
The procedural generator used glow layers and Lanczos downsampling.
This left very low alpha pixels across the image canvas. In gameplay, those tiny alpha values became visible as a faint rectangular box around enemies.
### Falling Circular Hazard
The falling translucent circle was an `EMP_CLOUD` hazard.
It was drawn directly in `GameRenderer.renderHazards()` as a generic gray filled circle.
## 3. Fixes Applied
### Supply Drop Asset
A new stylized magitech crate sprite was generated:
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/supply_crate.png`
The renderer now draws this crate for air drops while preserving a small dashed cyan capture ring.
### Alpha Cleanup
The procedural asset generator now clamps very low alpha values to `0` during PNG export.
This removes transparent rectangle artifacts while keeping intended outlines, glow, and silhouettes.
Verified enemy sprite alpha:
- normal enemy corner alpha: `0`
- elite enemy corner alpha: `0`
- boss corner alpha: `0`
- no alpha values below the cleanup threshold remain
### Hazard Assets
New hazard sprites were generated:
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_emp.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_asteroid.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_debris.png`
`EMP_CLOUD` now renders as an arcane rune-field instead of a plain gray circle.
`ASTEROID` and `DEBRIS` can render as stylized magitech rock fragments instead of fallback circles.
## 4. Changed Runtime Paths
Important changed or generated paths:
- `/Volumes/Data/project/Antigravity/Skybound/scripts/generate_magitech_assets.py`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/hooks/useGameAssets.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/utils/SpriteUtils.ts`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/supply_crate.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_emp.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_asteroid.png`
- `/Volumes/Data/project/Antigravity/Skybound/public/sprites/vfx/vfx_hazard_debris.png`
## 5. Verification
Asset generation completed successfully.
Alpha inspection confirmed transparent corners and no low-alpha rectangle residue for the checked enemy/boss/supply/hazard sprites.
Production build completed successfully with:
```bash
npm run build
```
The build still reports the existing `/sprites/player.png` static path warning, but it remains non-blocking and the production bundle was generated successfully.
@@ -0,0 +1,177 @@
# Skybound Survivor-Like Balance Curve Pass
**Date**: 2026-04-24
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw gameplay balance pass from user playtest feedback
## 1. Playtest Feedback
The game shell looked close to Survivor.io / Vampire Survivors, but the actual gameplay did not feel like that genre.
Reported issues:
- gameplay did not deliver enough horde-survival pressure
- stage balance felt uneven
- TAC Level Up pacing felt unbalanced
- growth did not form a satisfying user-facing curve
## 2. Diagnosis
The previous balance leaned closer to a shmup / tactical shooter.
Main causes found in code:
- simultaneous enemy cap was too low for a horde-survival feel
- procedural spawn did not fully use the timeline `spawnIntervalMult`
- early EXP requirement was too high
- EXP growth multiplier was too steep
- stage difficulty scaled enemy/bullet stats too aggressively
- stage scripted events were compressed too early in the timeline
- TAC Level Up card offers were weighted but not structured, so the user could receive awkward choices
- starter skill offers could omit key horde-survival archetypes
## 3. Target Curve
New target:
- first meaningful upgrade should arrive quickly
- player should see more enemies on screen
- enemies should be individually weaker
- danger should come from density and positioning, not bullet stat spikes
- level-up choices should consistently support build formation
- stage progression should rise smoothly rather than jump sharply
## 4. Applied Balance Changes
### EXP and Level-Up
Changes:
- initial required EXP lowered from `100` to `45`
- normal enemy EXP increased from `5` to `7`
- elite EXP increased from `25` to `32`
- level-up EXP multiplier changed from steep `1.60 / 1.72 / 1.85` to smoother `1.24 / 1.30 / 1.36 / 1.42`
Expected result:
- early TAC Level Ups arrive faster
- the player can form a build before the first spike
- later progression still slows down without becoming a wall
### TAC Level Up Card Structure
The card generator now tries to offer:
- one owned skill upgrade
- one synergy / spike-counter / EVO-supporting option
- one flexible option
Expected result:
- fewer dead-choice screens
- higher chance of completing coherent builds
- less frustration from random-only card pools
### Starter Selection
Starter cards now come from three archetype buckets:
- primary damage
- area / crowd control
- utility / defense
Expected result:
- every run begins with a usable horde-survival foundation
- the first choice feels strategic without becoming punishing
### Enemy Density and Spawning
Changes:
- hard enemy cap increased from `30` to `90`
- timeline phase caps increased by stage and phase
- procedural spawn interval now uses `spawnIntervalMult`
- procedural spawns can arrive in small batches
- formation spawns now occur more often
- individual enemy HP and speed were reduced to support higher density
- elite chance is now a gradual probability instead of flipping too hard by difficulty
Expected result:
- more screen-filling horde pressure
- less empty movement time
- more satisfying weapon-clearing moments
### Stage Curve
Changes:
- stage duration curve changed from `120 + stage * 30s` to `150 + stage * 18s`
- stage difficulty scaling reduced from steep `+0.4 per stage` to smoother `+0.18 per stage`
- phase difficulty multipliers were lowered
- phase enemy caps were increased
- scripted wave events are distributed across the stage instead of firing too early
Expected result:
- stages feel less spiky and more readable
- difficulty rises through density and phase rhythm
- player has time to grow before major pressure events
### Enemy Bullet and Damage Pressure
Changes:
- enemy bullet speed curves were reduced
- damage curves were reduced
- bullet caps were reduced
- global enemy bullet speed multiplier reduced
- enemy projectile damage multipliers reduced
Expected result:
- gameplay moves away from bullet-hell punishment
- movement pressure still exists, but horde positioning becomes the main focus
### Weapon Rhythm
Several weapon cooldowns were shortened so early picks feel active sooner.
Nova Burst was also adjusted to trigger sooner and scale more clearly as an AoE crowd-control tool.
## 5. Changed Runtime Paths
Important changed paths:
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/balance.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/CombatTimeline.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/weaponBehaviors.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/SpawnerSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/CombatSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ModularWeaponSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/hooks/useGameEngine.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
## 6. Verification
Production build completed successfully with:
```bash
npm run build
```
The existing `/sprites/player.png` static path warning remains non-blocking.
## 7. Next Playtest Questions
Recommended next playtest checks:
- Does the first level-up happen within a satisfying time window?
- Does the screen feel populated without becoming unreadable?
- Do weapons feel like they clear hordes?
- Do stage spikes feel earned rather than sudden?
- Does TAC Level Up usually offer at least one desirable choice?
@@ -0,0 +1,173 @@
# Skybound Core Gameplay Rebalance and Purpose Reset
**Date**: 2026-04-25
**Project**: Skybound Protocol
**Author**: Codex
**Status**: Raw corrective gameplay pass after balance regression
## 1. User Playtest Feedback
The previous balance pass made the game worse.
Observed issues:
- TAC Level Up triggered repeatedly and too quickly.
- Campaign and Blitz did not communicate a clear purpose.
- It was unclear whether the player should dodge bullets, collect upgrades, survive waves, or simply idle.
- Standing near the center could clear the stage with little interaction.
- Skill choice did not feel strategic because almost any pickup worked.
- The foundation felt like it had grown without a clear gameplay plan.
## 2. Diagnosis
The previous pass overcorrected toward reward frequency and enemy density.
Main problems:
- initial EXP requirement was too low
- EXP gem values were too high
- level-up carryover allowed too much momentum
- no cooldown existed between TAC Level Up events
- base magnet radius was too generous
- base damage multiplier was too high
- weapon cooldowns became too generous
- enemy caps became too high for the current combat model
- enemies were too weak for the amount of automatic player damage
The result was a reward flood without enough danger, movement, or tactical pressure.
## 3. New Gameplay Purpose
Skybound should not be a pure bullet hell and should not be an idle auto-clear game.
The intended player loop should be:
1. Survive incoming enemy formations and hazard pressure.
2. Move deliberately to collect EXP gems and supply rewards.
3. Choose upgrades that solve the current pressure pattern.
4. Build toward synergies and evolutions.
5. Enter boss or spike phases with a build that feels earned.
The main fun should come from:
- movement under pressure
- risk-reward EXP collection
- tactical skill choices
- visible power growth
- stage pressure that asks for different answers
The player should not be able to win reliably by standing still.
## 4. Corrective Fixes Applied
### TAC Level Up Flood Control
Applied:
- initial required EXP increased from `45` to `90`
- normal enemy EXP reduced from `7` to `4`
- elite EXP reduced from `32` to `20`
- level-up multiplier increased to `1.42 / 1.48 / 1.55 / 1.62`
- added a `360 frame` TAC Level Up lockout after each level-up
- EXP carryover is capped to `35%` of the next requirement
Expected result:
- level-up moments become meaningful beats
- no rapid-fire modal spam
- players must keep playing between upgrades
### Movement Incentive
Applied:
- base magnet radius reduced from `180` to `90`
- magnet passive now adds `35` per level instead of `60`
Expected result:
- EXP collection requires movement
- standing still misses more progression
- magnet becomes a strategic comfort/passive choice rather than free global collection
### Idle-Clear Reduction
Applied:
- base effective damage reduced from `1.5` to `1.0`
- damage passive now provides growth from deliberate investment
- several weapon cooldowns were pulled back from the previous overly generous pass
- Nova Burst was returned closer to a periodic tactical tool rather than constant auto-clear
Expected result:
- early weapons no longer erase all pressure automatically
- skill investment matters more
- AoE tools help but do not replace positioning
### Enemy Pressure Recentered
Applied:
- hard enemy cap reduced from `90` to `56`
- phase caps reduced from the previous overcorrection
- enemy HP increased from the previous too-low values
- enemies enter deeper into the playfield
- enemy speed and bullet pressure were slightly restored
- procedural spawn cadence reduced from the flood state
Expected result:
- fewer meaningless bodies
- enemies apply actual positional pressure
- player must dodge, reposition, and collect intentionally
## 5. Design Rule Going Forward
Future balance changes should follow this rule:
Do not increase rewards unless a matching risk or movement requirement exists.
Examples:
- faster level-up needs harder collection or less carryover
- more enemies need weaker auto-clear or stronger enemy pathing
- stronger skills need clearer spike counters or enemy behaviors
- more pickups need better pickup affordance and danger around pickup zones
## 6. Changed Runtime Paths
Important changed paths:
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/CombatSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/SpawnerSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/CombatTimeline.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/balance.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/weaponBehaviors.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ModularWeaponSystem.ts`
## 7. Verification
Production build completed successfully with:
```bash
npm run build
```
The existing `/sprites/player.png` static asset warning remains non-blocking.
## 8. Next Necessary Design Work
This corrective patch stabilizes the worst problems, but the project still needs a stronger core design pass.
Recommended next work:
- define Campaign as objective-based stages with unique pressure patterns
- define Blitz as score/survival mode with explicit risk-reward scoring
- add clear stage objectives to HUD
- add enemy archetypes that force movement differently
- add pickup-risk zones so rewards are not free
- review every skill for role identity: damage, crowd control, defense, mobility, economy
@@ -0,0 +1,103 @@
# Skybound Player Airframe and 8 Stage Boss Continuity Rework
작성일: 2026-04-25 09:51 KST
## 요청 요약
- 사용자 기체가 엔진에서 그린 도형 조립처럼 보여 시각적 완성도가 낮아 보이는 문제를 개선한다.
- Stage 1 클리어 후 Stage 2로 넘어가는 흐름이 결과 화면으로 끊겨 게임이 단절되는 문제를 개선한다.
- Aero Fighters처럼 보스를 처치하고 같은 런 안에서 다음 스테이지로 자연스럽게 이어지는 구조를 만든다.
- 총 8개 스테이지를 유지하고, 스테이지가 올라갈수록 난이도가 올라가도록 보스 HP, 파츠, 패턴을 재조정한다.
- 각 스테이지 보스가 서로 다른 공격 패턴을 체감할 수 있도록 실행부를 보강한다.
## 확인한 문제
### 플레이어 기체 렌더링
- `GameRenderer.renderPlayer()`에서 플레이어 스프라이트 위에 랜덤 원형 엔진 글로우를 직접 그려서, 기체 뒤쪽이 매 프레임 흔들리는 임시 도형처럼 보였다.
- `renderWeaponAttachments()`에서 일부 장착 무기를 `fillRect`, `strokeRect`, 랜덤 원형 플래시로 그려서 톤앤매너에 맞는 완성형 파츠가 아니라 디버그 박스처럼 보일 수 있었다.
- 특히 Hyper Sonic Vulcan, Gatling fallback, Missile Pod fallback이 사용자 기체 실루엣과 잘 섞이지 않았다.
### 스테이지 전환
- 보스 처치 후 `STAGE_CLEAR`가 되고, 300프레임 뒤 `BOSS_ACTION NEXT_STAGE` 이벤트가 발생한다.
- 기존 `useGameEngine`은 이 이벤트를 곧바로 `finishMission('CLEAR')`로 연결했다.
- 그 결과 Standard 캠페인에서도 Stage 1 보스 처치 후 결과 화면으로 끊기고, 다음 스테이지는 별도 런처럼 느껴졌다.
### 보스 패턴
- `bossActions.ts`에는 Stage 1부터 Stage 8까지 액션 테이블이 있다.
- 하지만 `BossSystem.executePattern()`은 일부 액션만 처리하고 있었기 때문에, 실제 전투에서는 많은 액션이 기본 단발 탄으로 떨어질 수 있었다.
- `StageDirectorSystem.instantiateBoss()`의 보스 파츠 turretId가 `T-CORE`, `T-WING`, `T-HEAVY`처럼 실제 `TURRET_CATALOG`에 없는 값이라 파츠 포탑이 의도대로 발사되지 않을 수 있었다.
- 기존 보스 HP는 Stage 2부터 `5000 * currentStage`로 급격히 올라가 캠페인 커브가 자연스럽지 않았다.
## 적용한 변경
### 플레이어 기체 완성도 개선
- 플레이어 엔진 글로우를 랜덤 원형에서 고정된 마기테크 추진 플룸으로 변경했다.
- 스프라이트 크기를 72px에서 78px로 약간 키워 중심 기체의 존재감을 높였다.
- `drawMagitechPod()` 헬퍼를 추가해 장착 무기를 작은 마기테크 포드 형태로 통일했다.
- Vulcan, Gatling fallback, Missile Pod fallback을 박스 도형 대신 다크 블루 메탈 바디, 시안/옐로/핑크 액센트, 라운드 포드 실루엣으로 렌더링한다.
- 장착 파츠의 랜덤 플래시를 줄이고 프레임 기반 pulse로 바꿔 덜 튀고 더 의도적으로 보이게 했다.
### 연속 캠페인 전환
- Standard 캠페인에서 Stage 1-7 보스 처치 후 `finishMission`을 호출하지 않고, 같은 엔진 런 안에서 다음 스테이지로 전환하도록 변경했다.
- 전환 시 다음 작업을 수행한다.
- `currentStage` 증가
- `campaignStageIndex` 저장
- `StageDirectorSystem.advanceToStage()`로 새 타임라인 로드
- 활성 총알, 적, 파티클 풀 정리
- 스포너 큐 초기화
- 보스, 탄막, hazard, airdrop, exp gem, vortex 정리
- `INTRO` 페이즈로 재시작
- 체력 25% 회복과 120프레임 무적 부여
- Stage 안내 텍스트와 HQ comms 출력
- Stage 8 보스 처치 시에는 `GAME_COMPLETE`로 결과 화면에 진입한다.
- Blitz 모드는 기존처럼 단일 전투 클리어로 유지한다.
### 8스테이지 보스 커브
- 보스 HP를 선형 폭증에서 완만한 곡선형 성장으로 변경했다.
- Stage 1은 낮게 시작하고, Stage 8은 누적 성장과 보스 패턴 난이도를 고려해 높은 난이도를 갖도록 설계했다.
- 보스 파츠 HP도 같은 stage curve를 사용해 코어, 날개, 포탑이 함께 성장한다.
- 각 스테이지에 실제 `TURRET_CATALOG`에 존재하는 turretId loadout을 지정했다.
### 보스 패턴 실행 보강
- 다음 액션들이 실제 탄막/기믹으로 실행되도록 매핑했다.
- `FAN_PART`, `DASH_PART`: 부채꼴 조준 사격
- `SIDE_WAVE`: 좌우 측면 웨이브
- `ZONE_BOMB`: 안전 구역 압박과 링 탄막
- `WALL_WAVE`: 틈이 있는 벽 형태 탄막
- `MISSILE_BARRAGE`, `HOMING_CHASE`: 유도성 탄막
- `CROSS_CHASE`: 네 방향 교차 추격 탄
- `SPIRAL_WEB`, `REVOLVING_FLAME`: 나선 탄막
- `BURST_SPLITTER`: 분열형 부채 탄
- `GEAR_STORM`: 고밀도 나선과 링 조합
- `PRECISION_LOCK`, `SNIPE_GRID`, `LASER_AIM`, `LASER_SWEEP`: 크로스헤어 기반 고속 압박
- `TELEPORT_STRIKE`: 보스 위치 변경 후 기습 사격
- `GIMMICK_PULSE`, `CC_REVERSE`, `ZONE_COLLAPSE`: 중력장/페이즈존 기믹과 링 탄막
- `ULTIMATE_SYMPHONY`: 기존 고난도 복합 패턴 유지
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/hooks/useGameEngine.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/StageDirectorSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/BossSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/EntityManager.ts`
## 검증
- `npm run build` 성공
- Vite 경고: `/sprites/player.png referenced in /sprites/player.png didn't resolve at build time`
- 위 경고는 기존 런타임 경로 관련 경고이며 이번 변경으로 인한 빌드 실패는 아니다.
## 후속 플레이테스트 포인트
- Stage 1 보스 처치 후 결과 화면 없이 Stage 2 INTRO로 자연스럽게 이어지는지 확인한다.
- Stage 8 보스 처치 후 `GAME_COMPLETE` 결과로 진입하는지 확인한다.
- 장착 무기 파츠가 기체와 과하게 분리되어 보이지 않는지 확인한다.
- Stage 3 이후 `ZONE_BOMB`, `WALL_WAVE`, `HOMING_CHASE`, `PRECISION_LOCK` 계열이 회피 목적을 명확히 만드는지 확인한다.
@@ -0,0 +1,75 @@
# Skybound Skill Concept and Hangar Layout Overlap Fix
작성일: 2026-04-25 10:09 KST
## 요청 요약
- 스킬 업그레이드 후 화면에 긴 라이트 기둥만 보이는 문제가 있어 스킬 개념과 연출을 수정한다.
- HUD/UI 관점에서 왼쪽에 여러 UI가 겹쳐 나오는 문제가 있어 필요하면 전체적으로 재설계한다.
## 확인한 문제
### Hyper-Sonic Vulcan 컨셉 불일치
- `Hyper-Sonic Vulcan`은 이름상 고속 벌컨/캐논 계열인데 실제 구현은 영구 지속되는 긴 레이저 빔이었다.
- `GameRenderer`가 플레이어 기준으로 화면 끝까지 이어지는 두꺼운 시안 빔을 그려서, 스킬이 무기라기보다 긴 조명처럼 보였다.
- `ModularWeaponSystem.updateHyperLaser()`도 라인 판정으로 지속 데미지를 넣고 있어 플레이어가 발사/탄막을 체감하기 어려웠다.
### Hangar UI 겹침
- `HangarOverlay.tsx`에서 `UPGRADE``PASS` 탭 콘텐츠가 오른쪽 `craft-area` 패널 밖에 렌더링되고 있었다.
- 그 결과 CSS Grid의 세 번째 아이템처럼 배치되어 왼쪽 패널/재료 영역과 겹쳐 보였다.
- 특히 `UPGRADE` 탭 선택 시 `PERMANENT UPGRADES` 콘텐츠가 왼쪽 재료 패널 위로 올라오는 문제가 발생했다.
### 전투 보상 텍스트 겹침
- 적 처치 보상 텍스트가 화면 가장자리에서 생성될 경우 `TechMats`, `+TAC` 같은 텍스트가 잘리거나 서로 겹쳐 보일 수 있었다.
## 적용한 변경
### Twin Arc Vulcan으로 스킬 컨셉 변경
- `HYPER_SONIC_VULCAN` 메타데이터 이름을 `Twin Arc Vulcan`으로 변경했다.
- 설명도 `Twin magitech cannons fire rapid piercing arc rounds.`로 바꿔 실제 플레이 감각과 맞췄다.
- 기존의 영구 레이저 빔 컨셉을 제거하고, 전방 관통 아크 탄환을 빠르게 발사하는 무기로 재설계했다.
- 플레이어 좌우 포드에서 3갈래 관통탄을 빠르게 발사해 “벌컨 업그레이드” 느낌을 강화했다.
- 스킬이 화면을 덮는 긴 빛이 아니라, 방향성과 탄막 밀도가 있는 공격으로 보이게 했다.
### 긴 라이트 렌더링 제거
- `GameRenderer`의 full-screen beam `fillRect()` 렌더링을 제거했다.
- 대신 기체 앞쪽 포드에 짧은 muzzle bloom과 짧은 시안 streak만 표시하도록 변경했다.
- 화면 전체를 가리는 시각 노이즈를 줄이고, 실제 공격은 projectile 렌더링이 담당하게 했다.
### Hangar 탭 레이아웃 수정
- `UPGRADE``PASS` 탭 콘텐츠를 오른쪽 `craft-area` 내부로 이동했다.
- 이제 탭 콘텐츠가 왼쪽 `Airframe Telemetry`/`Materials` 패널과 겹치지 않는다.
- 기존 스타일을 유지하면서 구조적 렌더링 오류를 먼저 제거했다.
### Floating Text 안전 영역 처리
- `ctx.spawnText()`에서 텍스트 생성 위치를 화면 안전 영역 안으로 clamp한다.
- 왼쪽 끝/오른쪽 끝에서 적이 죽어도 보상 텍스트가 화면 밖으로 잘리거나 HUD 영역에 과하게 겹치는 현상을 줄였다.
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ModularWeaponSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/GameRenderer.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/evolutions.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/weaponBehaviors.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HangarOverlay.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/hooks/useGameEngine.ts`
## 검증
- `npm run build` 성공
- Vite 경고: `/sprites/player.png referenced in /sprites/player.png didn't resolve at build time`
- 위 경고는 기존 런타임 경로 경고이며 이번 변경으로 인한 빌드 실패는 아니다.
## 후속 플레이테스트 포인트
- Gatling 진화 후 더 이상 긴 레이저 기둥이 보이지 않는지 확인한다.
- `Twin Arc Vulcan`이 빠른 관통 탄막 무기로 체감되는지 확인한다.
- Hangar에서 `UPGRADES`, `EVENT PASS` 탭 선택 시 왼쪽 패널과 콘텐츠가 겹치지 않는지 확인한다.
- 전투 보상 텍스트가 화면 가장자리에서 잘리지 않는지 확인한다.
@@ -0,0 +1,105 @@
# Skybound Tac EXP Direct Kill and UI Productization Pass
작성일: 2026-04-25 10:01 KST
## 요청 요약
- Tac Level 경험치는 적기를 처치했을 때 바로 획득하게 한다.
- 바닥에 경험치 파티클/젬이 떨어져 화면을 어지럽히지 않게 한다.
- 너무 빠른 레벨업으로 난이도 밸런스가 무너지는 문제를 완화한다.
- Hangar, HUD, Tac Level Up 등 아직 남아 있는 예전 UI 톤을 Stylized Casual Magitech 톤앤매너에 맞게 통일한다.
- `THRUST_OUTPUT`처럼 작동하지 않거나 내부 시스템 문자열처럼 보이는 UI 문구를 상품성 있게 정리한다.
## 확인한 문제
### Tac EXP
- `CombatSystem`이 적 사망 시 `spawnExpGem()`을 호출해 바닥에 경험치 젬을 생성하고 있었다.
- `ProgressionSystem`은 바닥 젬의 이동, 자석 흡수, 수집을 통해 경험치를 지급했다.
- 적 밀도가 올라갈수록 젬이 많이 쌓이고, 화면 가독성과 레벨업 속도 모두 불안정해질 수 있었다.
- 기존 젬 값은 일반몹/엘리트몹 기준으로 레벨업을 빠르게 밀어 올리는 구조였다.
### HUD 문구
- `SYSTEM_ACTIVE`, `TAC_LEVEL`, `HIGH_SCORE_SYNC`, `COMBO_LINK`, `ENERGY_CELL`, `LOCK_ON`, `HEAT_SIG`, `SHIELD_OS`, `THRUST_OUTPUT` 같은 내부 변수명 스타일 문구가 사용자에게 그대로 노출되고 있었다.
- `THRUST_OUTPUT``dodgeCooldownPct`를 읽지만 엔진에서 값을 갱신하지 않아 실질적으로 반응하지 않는 상태였다.
### Hangar UI
- 장비 카드가 빈 박스처럼 보이며 아이템명/레벨/스탯 정보가 충분히 드러나지 않았다.
- 탭 이름과 슬롯 이름이 기능적이지만 상품 화면처럼 자연스럽지는 않았다.
- 전체 스타일이 이전의 얇은 선, 어두운 반투명 박스 중심이라 현재 게임의 굵은 외곽선/밝은 마법 액센트 톤과 어긋났다.
## 적용한 변경
### Tac EXP 직접 지급
- `CombatSystem`에서 적 사망 시 더 이상 `spawnExpGem()`을 호출하지 않는다.
- 대신 `ctx.grantTacExp()`를 통해 처치 즉시 경험치를 지급한다.
- 일반 적: `+1 TAC`
- 엘리트 적: `+5 TAC`
- 미드 보스: `+16 TAC`
- 엘리트 이상만 짧은 `+TAC` 텍스트 피드백을 표시해 화면 노이즈를 줄였다.
- 바닥 경험치 젬은 신규 생성되지 않으므로, 플레이 중 먹을 수 없는 파란 점/구슬이 쌓이는 문제가 사라진다.
### 레벨업 속도 완화
- `ProgressionSystem.grantExp()`를 추가해 직접 경험치 지급과 기존 젬 수집 지급을 한 곳에서 처리한다.
- Spike 전 EXP 부스트는 최대 `x1.25`로 제한했다.
- 기존 레벨업 lockout과 carryover cap은 유지해 연속 레벨업 폭주를 방지한다.
### HUD 상품성 개선
- `HIGH_SCORE_SYNC``Best Run`
- `SYSTEM_ACTIVE``Falcon Online`
- `TAC_LEVEL``Tactical Level`
- `THRUST_OUTPUT``Afterburner`
- `ENERGY_CELL``Hull Core`
- `COMBO_LINK``Chain Bonus`
- `LOCK_ON``Lock-On`
- `HEAT_SIG``Heat Trace`
- `SHIELD_OS``Guard Field`
- 페이즈 표시도 `BOSS_WARNING` 같은 내부 enum 대신 `Boss Incoming`, `Horde Surge`, `Route Secured` 같은 플레이어용 문구로 매핑했다.
- 엔진에서 `setDodgeCooldownPct()`를 실제 dodge 상태에 맞게 갱신해 Afterburner 게이지가 부스트 중 반응하도록 연결했다.
### Hangar UI 톤 통일
- Hangar 배경과 패널을 Stylized Casual Magitech 톤으로 보강했다.
- 굵은 네이비 외곽선, 청록/민트/골드 마법 액센트, 둥근 카드, 명확한 hover 피드백을 적용했다.
- 장비 카드에 아이템 타입, 이름, 레벨, ATK, HP가 보이도록 개선했다.
- 탭 이름을 `LOADOUT`, `SYNTHESIS`, `SALVAGE`, `ASTRAL FORGE`, `UPGRADES` 등 더 자연스러운 메뉴명으로 바꿨다.
- 빈 슬롯 문구를 `NO MODULE`에서 `Available mount`로 바꿨다.
- `SYSTEM MOUNTS`, `MODULE STORAGE`를 각각 `Mount Bays`, `Module Storage`로 정리했다.
### Level Up 모달 문구 개선
- `TAC LV`, `TAC LEVEL UP!`, `SELECT TACTICAL ENHANCEMENT` 중심의 시스템 문자열 느낌을 줄였다.
- 일반 레벨업: `Tactical Upgrade`
- 시작 선택: `Choose First Weapon`
- 보급 선택: `Emergency Supply`
- 카드 문구도 `NEW ACQUISITION`에서 `New module`로 완화했다.
## 수정 파일
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/CombatSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/types.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/hooks/useGameEngine.ts`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HUDOverlay.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HangarOverlay.tsx`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/HangarOverlay.css`
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
## 검증
- `npm run build` 성공
- Vite 경고: `/sprites/player.png referenced in /sprites/player.png didn't resolve at build time`
- 위 경고는 기존 런타임 경로 경고이며 이번 변경으로 인한 빌드 실패는 아니다.
- 주요 내부 문자열 검색 결과, 요청에서 지적된 `SYSTEM_ACTIVE`, `THRUST_OUTPUT`, `TAC_LEVEL`, `HIGH_SCORE_SYNC`, `COMBO_LINK`, `ENERGY_CELL`, `LOCK_ON`, `HEAT_SIG`, `SHIELD_OS`는 현재 게임 UI 코드에서 제거되었다.
## 후속 플레이테스트 포인트
- 적 처치 후 바닥에 경험치 젬이 신규로 생성되지 않는지 확인한다.
- 일반몹을 많이 잡아도 Tac Level이 연속 폭주하지 않는지 확인한다.
- Afterburner 게이지가 회피/부스트 중 시각적으로 반응하는지 확인한다.
- Hangar 장비 카드가 더 이상 빈 회색 박스처럼 보이지 않고 아이템 정보를 명확히 보여주는지 확인한다.