From d2df62cdbe1bfe4127eb799e30866b60a695b171 Mon Sep 17 00:00:00 2001 From: Pabloader Date: Fri, 27 Jun 2025 13:55:55 +0000 Subject: [PATCH] Spin automation --- src/games/zombies/index.ts | 4 +++- src/games/zombies/player.ts | 4 ++-- src/games/zombies/spinner.ts | 8 ++++++++ src/games/zombies/tilemap.ts | 17 +++++++++++++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/games/zombies/index.ts b/src/games/zombies/index.ts index 102f5b6..4aa2ab0 100644 --- a/src/games/zombies/index.ts +++ b/src/games/zombies/index.ts @@ -14,12 +14,14 @@ const TILE_SIZE = (MAP_PIXEL_SIZE - MAP_PADDING * 2) / MAP_SIZE; const SIDEBAR_SIZE = clamp((window.innerWidth - window.innerHeight) / 2, 300, 600); const canvas = createCanvas(MAP_PIXEL_SIZE + SIDEBAR_SIZE * 2, MAP_PIXEL_SIZE); + +const spinner = new Spinner([MAP_PIXEL_SIZE + SIDEBAR_SIZE, 0], [SIDEBAR_SIZE, SIDEBAR_SIZE]); const map = new TileMap( [MAP_PADDING + SIDEBAR_SIZE, MAP_PADDING], MAP_SIZE, TILE_SIZE, + spinner, ); -const spinner = new Spinner([MAP_PIXEL_SIZE + SIDEBAR_SIZE, 0], [SIDEBAR_SIZE, SIDEBAR_SIZE]); const inventory = new Inventory( map, [0, 0], diff --git a/src/games/zombies/player.ts b/src/games/zombies/player.ts index ae5736e..92b0ad0 100644 --- a/src/games/zombies/player.ts +++ b/src/games/zombies/player.ts @@ -97,10 +97,10 @@ export default class Player extends Character { return true; case SpinnerAction.MELEE: - return this.meleeWeapon != null && !this.tile.enemy?.isBoss; + return !this.tile.enemy?.isBoss && this.meleeWeapon != null; case SpinnerAction.SHOOT: - return this.removeItem(this.gun) && !this.tile.enemy?.isBoss; + return !this.tile.enemy?.isBoss && this.removeItem(this.gun); } } } diff --git a/src/games/zombies/spinner.ts b/src/games/zombies/spinner.ts index d798af6..687671e 100644 --- a/src/games/zombies/spinner.ts +++ b/src/games/zombies/spinner.ts @@ -92,12 +92,20 @@ export default class Spinner extends Entity { } public override onClick() { + this.spin(); + } + + public spin() { if (!this.fired) return; this.fired = false; this.nextAngle = this.angle + (randInt(5, 10) + Math.random()) * 2 * Math.PI; } + public stop() { + this.fired = true; + } + public addListener(listener: SpinnerListener) { this.listeners.add(listener); } diff --git a/src/games/zombies/tilemap.ts b/src/games/zombies/tilemap.ts index 70f057c..4478e9e 100644 --- a/src/games/zombies/tilemap.ts +++ b/src/games/zombies/tilemap.ts @@ -4,7 +4,7 @@ import Tile, { TileType } from "./tile"; import Pathfinding from "./pathfinding"; import Item, { ItemType } from "./item"; import Player, { Players } from "./player"; -import { SpinnerAction } from "./spinner"; +import Spinner, { SpinnerAction } from "./spinner"; enum GameState { NORMAL, @@ -20,7 +20,13 @@ export default class TileMap extends Entity { private state = GameState.NORMAL; private availableTiles: Tile[] = []; - constructor(position: [number, number], private mapSize: number, private tileSize: number, numPlayers: number = 2) { + constructor( + position: [number, number], + private mapSize: number, + private tileSize: number, + private spinner: Spinner, + numPlayers: number = 2, + ) { super(position, [mapSize * tileSize, mapSize * tileSize]); this.players = shuffle(Object.values(Players)).slice(0, numPlayers); this.startTile = this.createMap(); @@ -218,6 +224,7 @@ export default class TileMap extends Entity { if (tile.isPointInBounds(x - this.left, y - this.top)) { const path = Pathfinding.findPath(this.player.tile, tile); if (path.length > 1) { + this.spinner.stop(); this.player.lastDoor = path.find(t => t.type === TileType.DOOR); this.player.moveTo(tile, path); tile.open(); @@ -265,6 +272,8 @@ export default class TileMap extends Entity { this.players.splice(this.currentPlayerIdx, 1); this.currentPlayerIdx = this.currentPlayerIdx % this.players.length; this.setNormalState(); + } else if (!this.player.grenade) { + this.spinner.spin(); } break; case SpinnerAction.MELEE: @@ -273,8 +282,11 @@ export default class TileMap extends Entity { break; case SpinnerAction.RUN: this.setNormalState(); + this.spinner.spin(); break; } + } else if (!this.player.grenade) { + this.spinner.spin(); } break; } @@ -311,6 +323,7 @@ export default class TileMap extends Entity { } private nextPlayer() { + this.spinner.stop(); this.currentPlayerIdx = (this.currentPlayerIdx + 1) % this.players.length; }