result = $params + ['level' => 0, 'won' => false, 'saved' => 0, 'total' => 1, 'need' => 1]; parent::enter($params); $this->sound()->playSfx($this->result['won'] ? 'win' : 'lose'); } protected function items(): array { $level = (int)$this->result['level']; $items = []; if ($this->result['won'] && $level + 1 < Levels::count()) { $items[] = ['NEXT LEVEL', null, fn () => $this->scenes()->switchTo(PlayScene::class, ['level' => $level + 1])]; } $items[] = ['RETRY', null, fn () => $this->scenes()->switchTo(PlayScene::class, ['level' => $level])]; $items[] = ['LEVELS', null, fn () => $this->scenes()->switchTo(LevelScene::class, ['level' => $level])]; return $items; } protected function top(): float { return 150; } protected function back(): void { $this->scenes()->switchTo(LevelScene::class, ['level' => (int)$this->result['level']]); } protected function renderTitle(Renderer $r): void { $e = $this->engine; $res = $this->result; $won = (bool)$res['won']; $last = $won && $res['level'] + 1 >= Levels::count(); $this->fonts->text($e, $r, $last ? 'ALL DONE' : ($won ? 'WELL DONE' : 'NOT ENOUGH'), 240, 40, 2.2, $won ? [255, 210, 60] : [255, 120, 100], 'center'); $percent = (int)floor($res['saved'] * 100 / max(1, $res['total'])); $this->fonts->text($e, $r, 'HOME {n}/{need}', 240, 78, 1.4, [255, 255, 255], 'center', ['n' => $res['saved'], 'need' => $res['need']]); $this->fonts->text($e, $r, 'RESCUED {n}%', 240, 97, 1.1, [200, 230, 255], 'center', ['n' => $percent]); if ($won) { $stars = Progress::stars($percent, (int)($res['need'] * 100 / max(1, $res['total']))); for ($s = 0; $s < 3; $s++) { $pop = min(1, max(0, $this->time * 3 - $s * 0.6)); if ($pop > 0) { $size = 2 * $pop; $this->art->icon($r, $e, 'star', 240 - 42 + $s * 30 + 12 - 6 * $size, 118 + 12 - 6 * $size, $s < $stars ? '-gold' : '-dim', $size); } } } } }