entities; $player = new Player('p1', 'Tester', new InputState(), $list, $room, ['x' => 100.0, 'y' => 0.0]); $room->addPlayer($player); $zombie = new Zombie(0.0, 0.0, $list, $room, ['emergeTime' => 0.0]); $list->append($zombie); $zombie->target = $player; $zombie->update(0.1); $this->assertGreaterThan(0.0, $zombie->pos->x, 'zombie moves toward player x'); $this->assertEqualsWithDelta(0.0, $zombie->pos->y, 1e-6, 'zombie stays on same y'); } #[Test] public function hitReducesHealthAndKnocksBack(): void { $room = new Room('test'); $zombie = new Zombie(10.0, 0.0, $room->entities, $room); $impulse = new Vector2(1.0, 0.0); $dead = $zombie->hit($impulse, 1); $this->assertTrue($dead); $this->assertSame(0, $zombie->health); } #[Test] public function hitDoesNotKillAtHighHealth(): void { $room = new Room('test'); $zombie = new Zombie(10.0, 0.0, $room->entities, $room, ['health' => 10]); $dead = $zombie->hit(new Vector2(1.0, 0.0), 1); $this->assertFalse($dead); $this->assertSame(9, $zombie->health); } #[Test] public function dieRemovesFromContainer(): void { $room = new Room('test'); $zombie = new Zombie(5.0, 5.0, $room->entities, $room); $room->entities->append($zombie); $zombie->die(); $this->assertCount(0, $room->entities); } #[Test] public function emergeBlocksMovement(): void { $room = new Room('test'); $zombie = new Zombie(0.0, 0.0, $room->entities, $room, ['emergeTime' => 1.0]); $room->entities->append($zombie); $zombie->target = new Player('p1', 'T', new InputState(), $room->entities, $room, ['x' => 100.0, 'y' => 100.0]); $zombie->update(0.1); $this->assertSame(0.0, $zombie->pos->x, 'zombie blocked during emerge'); } }