import { html, LitElement } from "lit"; import { customElement, state } from "lit/decorators.js"; import { EventBus } from "../../../core/EventBus"; import { GameType } from "../../../core/game/Game"; import { GameUpdateType } from "../../../core/game/GameUpdates"; import { GameView } from "../../../core/game/GameView"; import { crazyGamesSDK } from "../../CrazyGamesSDK"; import { PauseGameIntentEvent } from "../../Transport"; import { translateText } from "../../Utils"; import { Layer } from "./Layer"; import { ShowReplayPanelEvent } from "./ReplayPanel"; import { ShowSettingsModalEvent } from "./SettingsModal"; import exitIcon from "/images/ExitIconWhite.svg?url"; import FastForwardIconSolid from "/images/FastForwardIconSolidWhite.svg?url"; import pauseIcon from "/images/PauseIconWhite.svg?url"; import playIcon from "/images/PlayIconWhite.svg?url"; import settingsIcon from "/images/SettingIconWhite.svg?url"; @customElement("game-right-sidebar") export class GameRightSidebar extends LitElement implements Layer { public game: GameView; public eventBus: EventBus; @state() private _isSinglePlayer: boolean = false; @state() private _isReplayVisible: boolean = false; @state() private _isVisible: boolean = true; @state() private isPaused: boolean = false; @state() private timer: number = 0; private hasWinner = false; private isLobbyCreator = false; createRenderRoot() { return this; } init() { this._isSinglePlayer = this.game?.config()?.gameConfig()?.gameType === GameType.Singleplayer || this.game.config().isReplay(); this._isVisible = true; this.game.inSpawnPhase(); this.requestUpdate(); } tick() { // Timer logic const updates = this.game.updatesSinceLastTick(); if (updates) { this.hasWinner = this.hasWinner || updates[GameUpdateType.Win].length > 0; } // Check if the player is the lobby creator if (!this.isLobbyCreator && this.game.myPlayer()?.isLobbyCreator()) { this.isLobbyCreator = true; this.requestUpdate(); } const maxTimerValue = this.game.config().gameConfig().maxTimerValue; if (maxTimerValue !== undefined) { if (this.game.inSpawnPhase()) { this.timer = maxTimerValue * 60; } else if (!this.hasWinner && this.game.ticks() % 10 === 0) { this.timer = Math.max(0, this.timer - 1); } } else { if (this.game.inSpawnPhase()) { this.timer = 0; } else if (!this.hasWinner && this.game.ticks() % 10 === 0) { this.timer++; } } } private secondsToHms = (d: number): string => { const pad = (n: number) => (n < 10 ? `0${n}` : n); const h = Math.floor(d / 3600); const m = Math.floor((d % 3600) / 60); const s = Math.floor((d % 3600) % 60); if (h !== 0) { return `${pad(h)}:${pad(m)}:${pad(s)}`; } else { return `${pad(m)}:${pad(s)}`; } }; private toggleReplayPanel(): void { this._isReplayVisible = !this._isReplayVisible; this.eventBus.emit( new ShowReplayPanelEvent(this._isReplayVisible, this._isSinglePlayer), ); } private onPauseButtonClick() { this.isPaused = !this.isPaused; if (this.isPaused) { crazyGamesSDK.gameplayStop(); } else { crazyGamesSDK.gameplayStart(); } this.eventBus.emit(new PauseGameIntentEvent(this.isPaused)); } private async onExitButtonClick() { const isAlive = this.game.myPlayer()?.isAlive(); if (isAlive) { const isConfirmed = confirm( translateText("help_modal.exit_confirmation"), ); if (!isConfirmed) return; } await crazyGamesSDK.requestMidgameAd(); await crazyGamesSDK.gameplayStop(); // redirect to the home page window.location.href = "/"; } private onSettingsButtonClick() { this.eventBus.emit( new ShowSettingsModalEvent(true, this._isSinglePlayer, this.isPaused), ); } render() { if (this.game === undefined) return html``; const timerColor = this.game.config().gameConfig().maxTimerValue !== undefined && this.timer < 60 ? "text-red-400" : ""; return html` `; } maybeRenderReplayButtons() { const isReplayOrSingleplayer = this._isSinglePlayer || this.game?.config()?.isReplay(); const showPauseButton = isReplayOrSingleplayer || this.isLobbyCreator; return html` ${isReplayOrSingleplayer ? html`
replay
` : ""} ${showPauseButton ? html`
play/pause
` : ""} `; } }