import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { EventBus } from "../../../core/EventBus"; import { GameView } from "../../../core/game/GameView"; import { ReplaySpeedChangeEvent } from "../../InputHandler"; import { defaultReplaySpeedMultiplier, ReplaySpeedMultiplier, } from "../../utilities/ReplaySpeedMultiplier"; import { translateText } from "../../Utils"; import { Controller } from "./Controller"; export class ShowReplayPanelEvent { constructor( public visible: boolean = true, public isSingleplayer: boolean = false, ) {} } @customElement("replay-panel") export class ReplayPanel extends LitElement implements Controller { public game: GameView | undefined; public eventBus: EventBus | undefined; @property({ type: Boolean }) visible: boolean = false; @state() private _replaySpeedMultiplier: number = defaultReplaySpeedMultiplier; @property({ type: Boolean }) isSingleplayer = false; createRenderRoot() { return this; // Enable Tailwind CSS } init() { if (this.eventBus) { this.eventBus.on(ShowReplayPanelEvent, (event: ShowReplayPanelEvent) => { this.visible = event.visible; this.isSingleplayer = event.isSingleplayer; }); this.eventBus.on( ReplaySpeedChangeEvent, (event: ReplaySpeedChangeEvent) => { this._replaySpeedMultiplier = event.replaySpeedMultiplier; this.requestUpdate(); }, ); } } getTickIntervalMs() { return 1000; } tick() { if (!this.visible) return; this.requestUpdate(); } onReplaySpeedChange(value: ReplaySpeedMultiplier) { this._replaySpeedMultiplier = value; this.eventBus?.emit(new ReplaySpeedChangeEvent(value)); } render() { if (!this.visible) return html``; return html`
e.preventDefault()} >
${this.renderSpeedButton(ReplaySpeedMultiplier.slow, "×0.5")} ${this.renderSpeedButton(ReplaySpeedMultiplier.normal, "×1")} ${this.renderSpeedButton(ReplaySpeedMultiplier.fast, "×2")} ${this.renderSpeedButton( ReplaySpeedMultiplier.fastest, translateText("replay_panel.fastest_game_speed"), )}
`; } private renderSpeedButton(value: ReplaySpeedMultiplier, label: string) { const backgroundColor = this._replaySpeedMultiplier === value ? "bg-malibu-blue" : ""; return html` `; } }