Connexion
FR
games/open-lemmings / src / Scene / ResultScene.php · commit 04e2e2a
<?phpnamespace App\Scene;use App\Service\Progress;use App\Sim\Levels;use JumPHP\Renderer\Renderer;/** The end of a level, over it: how many came home, stars, what next. */final class ResultScene extends MenuBase{    private array $result = [];    public function isOverlay(): bool    {        return true;    }    public function enter(array $params = []): void    {        $this->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);                }            }        }    }}