10 KiB
10 KiB
Cattopia: Hero, Parrot, Pirate Ship & Level 2
Context
The refactoring to PixiJS/GSAP/Vite/ES6 modules is complete. Now we're adding new gameplay: a player-controlled Hero (auto-move + click-to-attack), a pet Parrot companion, both fighting alongside cats in all levels. After defeating the Blood Wolf (boss 5), a pirate ship transition leads to Level 2 where skeleton rats replace mice and the final boss — Lord of the Rat Dead — summons skeleton rats.
Game Flow (Updated)
Intro → Creator (cats + hero + parrot) → Level 1 (hunt mice → 5 bosses)
→ Pirate Ship Transition → Level 2 (hunt skeleton rats → Lord of the Rat Dead)
→ Victory
New Files
src/
entities/
Hero.js (auto-move AI + click-attack, stats, XP/leveling)
Parrot.js (follows hero, auto-attacks, stats)
SkeletonRat.js (Level 2 prey — tougher than Mouse, bone visual)
renderers/
HeroRenderer.js (dark green hoodie, emerald knife, legs, attack anim)
ParrotRenderer.js (colorful bird body, flapping wings, color-customizable)
SkeletonRatRenderer.js (bone-colored rat with skeletal details)
PirateShipRenderer.js (ship hull, mast, sails, water — used by transition scene)
scenes/
PirateShipScene.js (boarding animation: cats/hero/parrot walk onto ship, ship sails off, GSAP transition)
Modified Files
| File | Changes |
|---|---|
src/constants.js |
Add LEVEL_2_BOSS_DEF, SKELETON_RAT_GOAL, new game phases (SHIP_TRANSITION) |
src/state/GameState.js |
Add hero, parrot, skeletonRats[], currentLevel (1 or 2) |
src/scenes/CreatorScene.js |
Add hero creator section (name + color) and parrot creator section (name + color) |
src/scenes/GameScene.js |
Integrate hero + parrot into update/render loops, handle click-to-attack, Level 2 skeleton rat logic, Lord of the Rat Dead boss |
src/scenes/VictoryScene.js |
Include hero + parrot in final scoreboard |
src/main.js |
Register new PirateShipScene |
index.html |
Add hero + parrot creator DOM elements |
styles/style.css |
Styles for hero/parrot creator sections |
Phase 1: Constants, State & Entity Classes
1a. Update src/constants.js
- Add
SHIP_TRANSITIONtoGAME_PHASES - Add Level 2 constants:
export const SKELETON_RAT_GOAL = 25; export const LEVEL_2_BOSS_DEF = { name: 'Lord of the Rat Dead', icon: '💀🐀', color: '#2a1a2a', loot: { name: "Necro Crown", icon: '💀👑', stats: { hunting: 12, speed: 8, agility: 8, stealth: 8 } }, summonInterval: 300, // frames between skeleton rat summons hpPerAlly: 250 // HP per cat+hero };
1b. Update src/state/GameState.js
- Add to
reset():this.hero = null; this.parrot = null; this.skeletonRats = []; this.currentLevel = 1;
1c. Create src/entities/Hero.js
- Similar structure to
Cat.js— has name, color, stats, level, xp, gear updateHunt(targets, bounds): auto-move AI chases nearest mouse/skeleton rat (same pattern as Cat.updateHunt)updateBossChase(boss): auto-move toward boss (same pattern as Cat.updateBossChase)triggerAttack(enemies, boss): called on player click — finds nearest enemy within ~80px range and deals bonus damage burst. Returns{ type: 'attackHit', target, damage }or nullapplyPhysics(bounds): identical to Cat- Distinguishing stats: higher base hunting, lower stealth (knife fighter)
1d. Create src/entities/Parrot.js
- Has name, color, stats (auto-generated like cats), level, xp
update(hero, targets, boss, bounds): follows hero loosely (offset position), periodically attacks nearest enemy within range (every ~90 frames). Returns action:{ type: 'peck', target, damage }or nullapplyPhysics(bounds): same clamping pattern- Smaller hitbox, faster movement, lower damage than hero
1e. Create src/entities/SkeletonRat.js
- Based on
Mouse.jsbut tougher:hpfield (takes 2-3 hits to kill), slightly faster update(hunters, bounds): flee AI like Mouse but with more erratic movementaliveflag set to false when hp <= 0
Phase 2: Renderers
2a. Create src/renderers/HeroRenderer.js
- Follow
CatRenderer.jspooling pattern (single hero, but consistent API) - Draw: human-ish figure (slightly taller than cats), dark green hoodie body, hood, legs (animated walk cycle), arms
- Emerald knife: green-tinted blade held in right hand, glows on attack
- Attack animation: knife slash arc (brief GSAP or frame-based flash)
- Name tag above head like cats
2b. Create src/renderers/ParrotRenderer.js
- Colorful bird body using user-selected color as base
- Flapping wings (oscillating wing angle per frame)
- Small beak, tail feathers, beady eyes
- Name tag (smaller than hero/cat)
2c. Create src/renderers/SkeletonRatRenderer.js
- Based on
MouseRenderer.jsbut bone-white/gray color palette - Visible ribs/bones on body, hollow eye sockets
- HP bar above (since they take multiple hits)
- Scared state: bones rattle (slight shake)
2d. Create src/renderers/PirateShipRenderer.js
- Ship hull (brown, curved), mast with sails, jolly roger flag
- Water beneath (blue waves, animated)
- Used by PirateShipScene for the transition
Phase 3: Creator Scene Updates
3a. Update index.html
- Inside
#creator-screen > .creator-panel, add after cat creation form:- Hero section: name input + color picker (dark green hoodie preview + alternate colors)
- Parrot section: name input + color picker (red/blue/green/yellow parrot previews)
- Reorder: cats first, then hero, then parrot, then "Start the Hunt!" button
3b. Update src/scenes/CreatorScene.js
- Add hero creation logic: name + color →
new Hero({...})→gameState.hero = hero - Add parrot creation logic: name + color →
new Parrot({...})→gameState.parrot = parrot - Stats reveal for hero and parrot (same animated bar pattern as cats)
- Require at least 1 cat + hero + parrot before "Start the Hunt!" enables
- Add hero/parrot to roster display
3c. Update styles/style.css
- Styles for hero/parrot creator sections, color picker buttons, preview icons
Phase 4: GameScene Integration (Level 1 + Level 2)
4a. Add hero to update loop (GameScene.js)
- Hunt phase:
hero.updateHunt(currentTargets, bounds)wherecurrentTargets= mice (L1) or skeletonRats (L2) - Boss phase:
hero.updateBossChase(boss) - Catch/damage checks same pattern as cats but with hero's stats
- Click handler on PixiJS container:
this.container.on('pointerdown', (e) => this._onHeroAttack(e)) _onHeroAttack(e): callhero.triggerAttack()to find and damage nearest enemy
4b. Add parrot to update loop
- Every frame:
parrot.update(hero, targets, boss, bounds) - Process returned peck actions: apply damage, spawn hit particles, award XP to parrot
4c. Add renderers to GameScene
- Create
HeroRenderer,ParrotRenderer,SkeletonRatRendererinstances - Add containers in render order (hero between cats and giga dog, parrot near hero)
- Sync in
render():this.heroRenderer.sync(gameState.hero),this.parrotRenderer.sync(gameState.parrot),this.skeletonRatRenderer.sync(gameState.skeletonRats)
4d. Level 2 hunt logic
- When
gameState.currentLevel === 2:- "Add Mouse" buttons become "Add Skeleton Rat" buttons
- Mice array unused; skeleton rats array used instead
- Catch = skeleton rat HP reduced; when HP <= 0, award XP + increment totalCaught
- Goal:
SKELETON_RAT_GOALskeleton rats killed triggers Lord of the Rat Dead
4e. Lord of the Rat Dead boss
- Reuse
Boss.jsentity with a new defIndex (6) or create specialized subclass - Approach: extend
BOSS_DEFSarray with the Lord entry at index 5 (only used in Level 2) - Boss mechanics: standard movement + periodically summons skeleton rats (using
summonIntervalfrom def) - On defeat: transition to victory (
sceneManager.switchTo('victory'))
4f. Update _defeatBoss() flow
- After Blood Wolf defeat (boss index 4, Level 1): instead of victory, set
gameState.currentLevel = 2andsceneManager.switchTo('ship') - After Lord of the Rat Dead defeat (Level 2): go to victory
Phase 5: Pirate Ship Transition Scene
5a. Create src/scenes/PirateShipScene.js
- PixiJS scene with PirateShipRenderer for the ship + water background
- GSAP timeline:
- Show "The seas await..." text overlay (fade in)
- Cats, hero, and parrot walk/fly from left toward ship (small sprites moving right)
- Board the ship (sprites move onto deck)
- Ship sails right, screen fades to black
- Switch to GameScene with Level 2 state
- Duration: ~4-5 seconds total
5b. Update src/main.js
- Import and register PirateShipScene:
sceneManager.register('ship', pirateShipScene)
5c. Update GameScene.enter()
- Check
gameState.currentLevel:- Level 1: current behavior (forest, mice)
- Level 2: reset totalCaught, update HUD text ("Skeleton Rats" instead of "Mice"), different forest theme (darker/undead aesthetic via ForestRenderer flag), spawn skeleton rats
5d. Optional: ForestRenderer Level 2 theme
- When
currentLevel === 2: darker sky gradient, dead/gray trees, eerie green ground glow - Reuse blood moon infrastructure but with green/purple tint instead of red
Phase 6: Victory Scene Updates
6a. Update VictoryScene.js
- Include hero and parrot in final scoreboard alongside cats
- Hero gets a special "Hero" badge, parrot gets "Companion" badge
- MVP calculation includes hero (hero.catches or boss damage dealt)
Phase 7: Polish & Cleanup
- Update SpawnSystem with
spawnSkeletonRats()method - Update
_updateHUD()to show level indicator ("Level 1" / "Level 2") - Update
_updateScoreboard()to include hero + parrot entries - Ensure Giga Dog works in both levels
- Update README with new features
Verification
After each phase, verify with npm run dev:
- Creator: Can create cats, hero (name + color), and parrot (name + color). All show in roster with stats.
- Level 1: Hero auto-moves and chases mice. Click near hero attacks. Parrot follows hero and pecks enemies. All 5 bosses work.
- Ship Transition: After Blood Wolf defeat, pirate ship scene plays, transitions to Level 2.
- Level 2: Skeleton rats spawn instead of mice. Hunt → Lord of the Rat Dead boss. Boss summons skeleton rats. Defeating boss triggers victory.
- Victory: Scoreboard shows cats, hero, and parrot. MVP includes all.
- Full build:
npm run buildsucceeds, Docker still works.