import Phaser from "phaser"; import { BaseGameScene } from "../../../shared/BaseGameScene.js"; import { setupExemplo2API } from "./hooks/setupExemplo2API.js"; import { validationSolution } from "./validation/validators.js"; import { gameConfig } from "./config/config.js"; import { Constantes } from "./ui/constants.js"; import { montarDisplay } from "./ui/layout.js"; export class Exemplo2Scene extends BaseGameScene { constructor() { super("Exemplo2Scene"); this.textoAtual = ""; this.textoDisplay = null; } preload() { this.preloadGlobalAssets(); } create() { this.validatorFunc = (historico) => validationSolution(historico, this.configFase, gameConfig, this); // Registra a API do interpreter e os handlers de run/reset via BaseGameScene this.setupStandardController( () => setupExemplo2API(this), this.validatorFunc ); this.montarFase(); } onBeforeRun() { this.isRunning = true; this.historico = []; this.textoAtual = ""; this.textoDisplay.setText(""); this.textoDisplay.setColor("#e0e0ff"); } onReset() { this.isRunning = false; this.textoAtual = ""; this.textoDisplay.setText(""); this.textoDisplay.setColor("#e0e0ff"); } async onSuccess() { this.isRunning = false; this.textoDisplay.setColor("#69f0ae"); return new Promise((resolve) => { this.tweens.add({ targets: this.textoDisplay, scaleX: 1.1, scaleY: 1.1, duration: 150, yoyo: true, repeat: 2, onComplete: () => { this.textoDisplay.setColor("#e0e0ff"); resolve(); }, }); }); } async onFailure() { this.isRunning = false; this.textoDisplay.setColor("#ff4444"); return new Promise((resolve) => { this.time.delayedCall(500, () => { this.textoDisplay.setColor("#e0e0ff"); resolve(); }); }); } montarFase() { if (this.textoDisplay) this.textoDisplay.destroy(); this.textoAtual = ""; // montarDisplay cria os objetos visuais e retorna a referência ao texto de saída this.textoDisplay = montarDisplay(this); } // --- API exposta ao js-interpreter via setupExemplo2API --- imprimir(texto) { this.textoAtual = texto; this.textoDisplay.setText(texto); this.historico.push({ tipo: "imprimir", texto }); } } /** * Factory para criar a configuração Phaser do jogo Exemplo2. * Injeta configFase e gameConfig no registry antes do boot da cena. */ export const createGame = (elementoPai, configFaseAtual) => { const scene = new Exemplo2Scene(); const { LARGURA, ALTURA } = Constantes; return { type: Phaser.AUTO, width: LARGURA, height: ALTURA, backgroundColor: "#0a0a1a", parent: elementoPai, scale: { mode: Phaser.Scale.FIT, autoCenter: Phaser.Scale.CENTER_BOTH }, scene, callbacks: { preBoot: (game) => { game.registry.set("configFase", configFaseAtual); game.registry.set("gameConfig", gameConfig); }, }, }; };