Drawaria POU Interactive Game

Juego completo de POU interactivo en Drawaria con minijuegos en tiempo real

// ==UserScript==
// @name         Drawaria POU Interactive Game
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Juego completo de POU interactivo en Drawaria con minijuegos en tiempo real
// @author       YouTubeDrawaria
// @match        https://drawaria.online/*
// @match        https://*.drawaria.online/*
// @grant        none
// @license      MIT
// @icon         https://static.wikitide.net/pouwiki/thumb/8/8a/Pouveryhappy.png/120px-Pouveryhappy.png
// ==/UserScript==

(function() {
    'use strict';

    /* ----------  SISTEMA BASE OPTIMIZADO  ---------- */
    let drawariaSocket = null;
    let drawariaCanvas = null;
    let drawariaCtx = null;

    // Queue optimizado para comandos
    const commandQueue = [];
    let batchProcessor = null;
    const BATCH_SIZE = 6;
    const BATCH_INTERVAL = 50;

    // Variables de control del sistema POU
    let pouGameActive = false;
    let selectedPlayerId = null;
    let selectedPlayerName = null;

    // Estados del POU
    let pouStates = new Map();

    // Intercept WebSocket
    const originalWebSocketSend = WebSocket.prototype.send;
    WebSocket.prototype.send = function (...args) {
        if (!drawariaSocket && this.url && this.url.includes('drawaria')) {
            drawariaSocket = this;
            console.log('🔗 [POU GAME] Socket capturado para POU Game');
            startBatchProcessor();
        }
        return originalWebSocketSend.apply(this, args);
    };

    function startBatchProcessor() {
        if (batchProcessor) return;
        batchProcessor = setInterval(() => {
            if (!drawariaSocket || drawariaSocket.readyState !== WebSocket.OPEN || commandQueue.length === 0) {
                return;
            }
            const batch = commandQueue.splice(0, BATCH_SIZE);
            batch.forEach(cmd => {
                try {
                    drawariaSocket.send(cmd);
                } catch (e) {
                    console.warn('⚠️ [POU GAME] Error enviando comando:', e);
                }
            });
        }, BATCH_INTERVAL);
    }

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    /* ----------  PATRONES PIXEL ART DE POU  ---------- */
    const pouPatterns = {
        'pou_happy': [
            "      BBBBBBBBBB      ",
            "    BBBBBBBBBBBBBB    ",
            "  BBBBBBBBBBBBBBBBBB  ",
            " BBBBBBBBBBBBBBBBBBBB ",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWKWBBBBWWKWBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBRRRRRRRRRRBBBBBBBB",
            "BBBBBRRRRRRRRBBBBBBBBB",
            "BBBBBBRRRRRRBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            " BBBBBBBBBBBBBBBBBBBB ",
            "  BBBBBBBBBBBBBBBBBB  ",
            "    BBBBBBBBBBBBBB    ",
            "      BBBBBBBBBB      "
        ],
        'pou_sad': [
            "      BBBBBBBBBB      ",
            "    BBBBBBBBBBBBBB    ",
            "  BBBBBBBBBBBBBBBBBB  ",
            " BBBBBBBBBBBBBBBBBBBB ",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWKWBBBBWWKWBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBRRRRRRBBBBBBBBBB",
            "BBBBBBRRRRRRBBBBBBBBB ",
            "BBBBRRRRRRRRRRBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            " BBBBBBBBBBBBBBBBBBBB ",
            "  BBBBBBBBBBBBBBBBBB  ",
            "    BBBBBBBBBBBBBB    ",
            "      BBBBBBBBBB      "
        ],
        'pou_angry': [
            "      BBBBBBBBBB      ",
            "    BBBBBBBBBBBBBB    ",
            "  BBBBBBBBBBBBBBBBBB  ",
            " BBBBBBBBBBBBBBBBBBBB ",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBRRRBBBBBBBRRRBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWWWBBBBWWWWBBBBBB",
            "BBBBWWKWBBBBWWKWBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            "BBBBBBRRRRRRBBBBBBBBBB",
            "BBBBRRRRRRRRRRBBBBBBB ",
            "BBBBRRRRRRRRRRBBBBBBBB",
            "BBBBBBRRRRRRBBBBBBBBBB",
            "BBBBBBBBBBBBBBBBBBBBBB",
            " BBBBBBBBBBBBBBBBBBBB ",
            "  BBBBBBBBBBBBBBBBBB  ",
            "    BBBBBBBBBBBBBB    ",
            "      BBBBBBBBBB      "
        ],
        'food_apple': [
            "   GG   ",
            "  GGGG  ",
            " RRRRRR ",
            "RRRRRRRR",
            "RRRRRRRR",
            "RRRRRRRR",
            " RRRRRR ",
            "  RRRR  "
        ],
        'food_cake': [
            "YYYYYYYY",
            "WWWWWWWW",
            "PPPPPPPP",
            "WWWWWWWW",
            "PPPPPPPP",
            "WWWWWWWW",
            "BBBBBBBB"
        ],
        'toy_ball': [
            "  RRRR  ",
            " RRRRRR ",
            "RRRWWRRR",
            "RRWWWWRR",
            "RRWWWWRR",
            "RRRWWRRR",
            " RRRRRR ",
            "  RRRR  "
        ],
        'heart': [
            " RR   RR ",
            "RRRR RRRR",
            "RRRRRRRRR",
            " RRRRRRR ",
            "  RRRRR  ",
            "   RRR   ",
            "    R    "
        ]
    };

    // Esquemas de colores para POU
    const pouColorSchemes = {
        pou_happy: {
            'B': '#8B4513', // Marrón para el cuerpo
            'W': '#FFFFFF', // Blanco para los ojos
            'K': '#000000', // Negro para las pupilas
            'R': '#FF1493', // Rosa para la boca feliz
            ' ': null
        },
        pou_sad: {
            'B': '#696969', // Gris para el cuerpo triste
            'W': '#FFFFFF', // Blanco para los ojos
            'K': '#000000', // Negro para las pupilas
            'R': '#0000FF', // Azul para la boca triste
            ' ': null
        },
        pou_angry: {
            'B': '#DC143C', // Rojo oscuro para el cuerpo enojado
            'W': '#FFFFFF', // Blanco para los ojos
            'K': '#000000', // Negro para las pupilas
            'R': '#8B0000', // Rojo más oscuro para la boca
            ' ': null
        },
        food_apple: {
            'R': '#FF0000', // Rojo manzana
            'G': '#00FF00', // Verde hoja
            ' ': null
        },
        food_cake: {
            'Y': '#FFD700', // Amarillo
            'W': '#FFFFFF', // Blanco crema
            'P': '#FFC0CB', // Rosa
            'B': '#8B4513', // Marrón base
            ' ': null
        },
        toy_ball: {
            'R': '#FF0000', // Rojo pelota
            'W': '#FFFFFF', // Blanco detalles
            ' ': null
        },
        heart: {
            'R': '#FF0000', // Rojo corazón
            ' ': null
        }
    };

    /* ----------  SISTEMA DE DIBUJO OPTIMIZADO  ---------- */
    function enqueueDrawCommand(x1, y1, x2, y2, color, thickness) {
        if (!drawariaCanvas || !drawariaSocket || !pouGameActive) return;

        const normX1 = (x1 / drawariaCanvas.width).toFixed(4);
        const normY1 = (y1 / drawariaCanvas.height).toFixed(4);
        const normX2 = (x2 / drawariaCanvas.width).toFixed(4);
        const normY2 = (y2 / drawariaCanvas.height).toFixed(4);

        const cmd = `42["drawcmd",0,[${normX1},${normY1},${normX2},${normY2},false,${-Math.abs(thickness)},"${color}",0,0,{}]]`;
        commandQueue.push(cmd);

        if (drawariaCtx) {
            drawariaCtx.strokeStyle = color;
            drawariaCtx.lineWidth = thickness;
            drawariaCtx.lineCap = 'round';
            drawariaCtx.beginPath();
            drawariaCtx.moveTo(x1, y1);
            drawariaCtx.lineTo(x2, y2);
            drawariaCtx.stroke();
        }
    }

    function optimizePatternToLines(pattern) {
        const lines = [];
        for (let row = 0; row < pattern.length; row++) {
            let currentLine = null;
            for (let col = 0; col < pattern[row].length; col++) {
                const char = pattern[row][col];
                if (char !== ' ') {
                    if (!currentLine || currentLine.char !== char) {
                        if (currentLine) lines.push(currentLine);
                        currentLine = { char, startCol: col, endCol: col, row };
                    } else {
                        currentLine.endCol = col;
                    }
                } else {
                    if (currentLine) {
                        lines.push(currentLine);
                        currentLine = null;
                    }
                }
            }
            if (currentLine) lines.push(currentLine);
        }
        return lines;
    }

    function drawOptimizedPixelArt(patternName, pixelSize, centerX, centerY, eraseMode = false) {
        const pattern = pouPatterns[patternName];
        if (!pattern) return;

        const lines = optimizePatternToLines(pattern);
        const colors = eraseMode ?
            Object.keys(pouColorSchemes[patternName] || {}).reduce((acc, key) => {
                acc[key] = key === ' ' ? null : '#FFFFFF';
                return acc;
            }, {}) :
            pouColorSchemes[patternName];

        const patternCenter = Math.floor(pattern.length / 2);

        lines.forEach(line => {
            if (!colors[line.char]) return;

            const startX = centerX + (line.startCol - patternCenter) * pixelSize;
            const endX = centerX + (line.endCol - patternCenter) * pixelSize + pixelSize;
            const y = centerY + (line.row - patternCenter) * pixelSize;

            enqueueDrawCommand(startX, y, endX, y, colors[line.char], pixelSize * 1.2);
        });
    }

    /* ----------  GESTIÓN DE JUGADORES  ---------- */
    class PlayerManager {
        constructor() {
            this.validPlayers = [];
            this.updateInterval = null;
        }

        updatePlayerOptions() {
            const playerSelect = document.getElementById('pou-player-selector');
            if (!playerSelect) return;

            const currentSelection = playerSelect.value;
            playerSelect.innerHTML = '';

            const playerElements = document.querySelectorAll('.spawnedavatar[data-playerid], .playerlist-row[data-playerid]');
            const validPlayers = [];

            playerElements.forEach(el => {
                const playerId = el.dataset.playerid;
                if (!playerId || playerId === '0' || el.dataset.self === 'true') return;

                let playerName = '';
                const nicknameEl = el.querySelector('.nickname, .playerlist-name a, .player-name');
                if (nicknameEl) {
                    playerName = nicknameEl.textContent.trim();
                }

                if (!playerName) {
                    const parentRow = el.closest('.playerlist-row');
                    if (parentRow) {
                        const nameEl = parentRow.querySelector('.playerlist-name a, .player-name');
                        if (nameEl) {
                            playerName = nameEl.textContent.trim();
                        }
                    }
                }

                if (!playerName) {
                    playerName = `Player ${playerId}`;
                }

                if (!validPlayers.some(p => p.id === playerId)) {
                    validPlayers.push({ id: playerId, name: playerName });
                }
            });

            this.validPlayers = validPlayers;

            if (validPlayers.length === 0) {
                const opt = document.createElement('option');
                opt.value = '';
                opt.textContent = '❌ No players available';
                opt.disabled = true;
                playerSelect.appendChild(opt);

                const startBtn = document.getElementById('pou-start-btn');
                if (startBtn) startBtn.disabled = true;
            } else {
                const allOpt = document.createElement('option');
                allOpt.value = 'all';
                allOpt.textContent = `🌍 All Players (${validPlayers.length})`;
                playerSelect.appendChild(allOpt);

                validPlayers.forEach(player => {
                    const opt = document.createElement('option');
                    opt.value = player.id;
                    opt.textContent = `🎮 ${player.name}`;
                    opt.dataset.playerName = player.name;
                    playerSelect.appendChild(opt);
                });

                const stillExists = currentSelection === 'all' || validPlayers.some(p => p.id === currentSelection);
                if (currentSelection && stillExists) {
                    playerSelect.value = currentSelection;
                    if (currentSelection === 'all') {
                        selectedPlayerName = 'All Players';
                    } else {
                        const selectedPlayer = validPlayers.find(p => p.id === currentSelection);
                        selectedPlayerName = selectedPlayer ? selectedPlayer.name : null;
                    }
                } else {
                    playerSelect.value = 'all';
                    selectedPlayerId = 'all';
                    selectedPlayerName = 'All Players';
                }

                const startBtn = document.getElementById('pou-start-btn');
                if (startBtn) startBtn.disabled = false;
            }

            selectedPlayerId = playerSelect.value;
        }

        startAutoUpdate() {
            if (this.updateInterval) return;
            this.updateInterval = setInterval(() => {
                this.updatePlayerOptions();
            }, 2000);
            this.updatePlayerOptions();
        }

        stopAutoUpdate() {
            if (this.updateInterval) {
                clearInterval(this.updateInterval);
                this.updateInterval = null;
            }
        }
    }

    /* ----------  SISTEMA PRINCIPAL DE POU  ---------- */
    class PouGameSystem {
        constructor() {
            this.initialized = false;
            this.playerManager = new PlayerManager();
            this.pouStates = new Map();
            this.gameStats = {
                happiness: 100,
                hunger: 50,
                cleanliness: 80,
                energy: 70
            };
            this.lastUpdateTime = 0;
            this.UPDATE_INTERVAL = 100;
            this.activeMinigame = null;
            this.init();
        }

        init() {
            const checkGameReady = () => {
                const gameCanvas = document.getElementById('canvas');
                if (gameCanvas) {
                    this.canvasElement = gameCanvas;
                    drawariaCanvas = gameCanvas;
                    this.canvasContext = gameCanvas.getContext('2d');
                    drawariaCtx = gameCanvas.getContext('2d');
                    this.initialized = true;
                    this.createInterface();
                    console.log('✅ [POU GAME] Sistema POU inicializado');
                } else {
                    setTimeout(checkGameReady, 100);
                }
            };
            checkGameReady();
        }

        getTargetPlayerCoords(playerId = null) {
            if (!playerId || playerId === 'all') {
                const allPlayers = [];
                const avatars = document.querySelectorAll('.spawnedavatar[data-playerid]:not([data-playerid="0"]):not(.self)');

                avatars.forEach(avatar => {
                    if (!this.canvasElement) return;
                    const cRect = this.canvasElement.getBoundingClientRect();
                    const aRect = avatar.getBoundingClientRect();

                    if (aRect.width > 0 && aRect.height > 0) {
                        allPlayers.push({
                            id: avatar.dataset.playerid || `player_${allPlayers.length}`,
                            x: Math.round((aRect.left - cRect.left) + (aRect.width / 2)),
                            y: Math.round((aRect.top - cRect.top) + (aRect.height / 2)),
                            width: aRect.width,
                            height: aRect.height
                        });
                    }
                });

                return allPlayers.length > 0 ? allPlayers : null;
            }

            const targetPlayers = [];
            const avatars = document.querySelectorAll(`.spawnedavatar[data-playerid="${playerId}"]`);

            avatars.forEach(avatar => {
                if (!this.canvasElement) return;
                const cRect = this.canvasElement.getBoundingClientRect();
                const aRect = avatar.getBoundingClientRect();

                if (aRect.width > 0 && aRect.height > 0) {
                    targetPlayers.push({
                        id: playerId,
                        x: Math.round((aRect.left - cRect.left) + (aRect.width / 2)),
                        y: Math.round((aRect.top - cRect.top) + (aRect.height / 2)),
                        width: aRect.width,
                        height: aRect.height
                    });
                }
            });

            return targetPlayers.length > 0 ? targetPlayers : null;
        }

        updatePouForPlayer(player) {
            const playerId = player.id;

            if (!this.pouStates.has(playerId)) {
                this.pouStates.set(playerId, {
                    mood: 'happy',
                    lastX: -9999,
                    lastY: -9999,
                    needsRedraw: true,
                    lastAction: Date.now(),
                    items: []
                });
            }

            const state = this.pouStates.get(playerId);

            // Determinar mood basado en stats
            let mood = 'happy';
            if (this.gameStats.happiness < 30) mood = 'sad';
            if (this.gameStats.hunger < 20) mood = 'angry';

            const pouX = player.x;
            const pouY = player.y - 60; // POU encima del jugador

            // Redibujar POU si es necesario
            if (Math.abs(pouX - state.lastX) > 5 || Math.abs(pouY - state.lastY) > 5 || state.needsRedraw || state.mood !== mood) {
                // Borrar POU anterior
                if (state.lastX !== -9999) {
                    drawOptimizedPixelArt(`pou_${state.mood}`, 2, state.lastX, state.lastY, true);
                }

                // Dibujar nuevo POU
                state.mood = mood;
                drawOptimizedPixelArt(`pou_${mood}`, 2, pouX, pouY, false);

                state.lastX = pouX;
                state.lastY = pouY;
                state.needsRedraw = false;
            }

            // Dibujar elementos adicionales
            this.drawPouElements(player, state);
        }

        drawPouElements(player, state) {
            const now = Date.now();

            // Corazones de felicidad
            if (this.gameStats.happiness > 70) {
                if (now - state.lastAction > 3000) {
                    const heartX = player.x + (Math.random() - 0.5) * 60;
                    const heartY = player.y - 100 - Math.random() * 30;
                    drawOptimizedPixelArt('heart', 1, heartX, heartY, false);
                    state.lastAction = now;
                }
            }

            // Items disponibles alrededor del POU
            state.items.forEach((item, index) => {
                if (now - item.spawnTime < 10000) { // 10 segundos
                    drawOptimizedPixelArt(item.type, 1, item.x, item.y, false);
                } else {
                    state.items.splice(index, 1); // Remover item expirado
                }
            });
        }

        // Minijuego: Alimentar POU
        async feedingMinigame(player) {
            console.log('🍎 [POU GAME] Iniciando minijuego de alimentación');

            const foods = ['food_apple', 'food_cake'];
            const selectedFood = foods[Math.floor(Math.random() * foods.length)];

            // Generar comida cerca del jugador
            const foodX = player.x + (Math.random() - 0.5) * 100;
            const foodY = player.y + 50;

            drawOptimizedPixelArt(selectedFood, 2, foodX, foodY, false);

            // Animar POU comiendo
            await sleep(1000);
            drawOptimizedPixelArt(selectedFood, 2, foodX, foodY, true); // Borrar comida

            // Aumentar stats
            this.gameStats.hunger = Math.min(100, this.gameStats.hunger + 20);
            this.gameStats.happiness = Math.min(100, this.gameStats.happiness + 10);

            console.log('🍎 [POU GAME] ¡POU ha comido! Hambre: ' + this.gameStats.hunger);
        }

        // Minijuego: Jugar con POU
        async playMinigame(player) {
            console.log('⚽ [POU GAME] Iniciando minijuego de juego');

            const ballX = player.x + 40;
            const ballY = player.y;

            // Mostrar pelota
            drawOptimizedPixelArt('toy_ball', 2, ballX, ballY, false);

            // Animar juego
            for (let i = 0; i < 5; i++) {
                await sleep(500);
                drawOptimizedPixelArt('toy_ball', 2, ballX + i * 10, ballY - Math.sin(i) * 20, false);
                if (i > 0) {
                    drawOptimizedPixelArt('toy_ball', 2, ballX + (i-1) * 10, ballY - Math.sin(i-1) * 20, true);
                }
            }

            // Limpiar pelota
            drawOptimizedPixelArt('toy_ball', 2, ballX + 40, ballY, true);

            // Aumentar stats
            this.gameStats.happiness = Math.min(100, this.gameStats.happiness + 15);
            this.gameStats.energy = Math.max(0, this.gameStats.energy - 10);

            console.log('⚽ [POU GAME] ¡POU ha jugado! Felicidad: ' + this.gameStats.happiness);
        }

        // Minijuego: Limpiar POU
        async cleaningMinigame(player) {
            console.log('🧼 [POU GAME] Iniciando minijuego de limpieza');

            // Efectos de limpieza
            for (let i = 0; i < 3; i++) {
                const bubbleX = player.x + (Math.random() - 0.5) * 40;
                const bubbleY = player.y - 40 - Math.random() * 30;

                // Dibujar burbuja (usando patrón de corazón pero en azul)
                enqueueDrawCommand(bubbleX-3, bubbleY-3, bubbleX+3, bubbleY+3, '#87CEEB', 2);
                enqueueDrawCommand(bubbleX-3, bubbleY+3, bubbleX+3, bubbleY-3, '#87CEEB', 2);

                await sleep(300);

                // Borrar burbuja
                enqueueDrawCommand(bubbleX-3, bubbleY-3, bubbleX+3, bubbleY+3, '#FFFFFF', 3);
                enqueueDrawCommand(bubbleX-3, bubbleY+3, bubbleX+3, bubbleY-3, '#FFFFFF', 3);
            }

            // Aumentar stats
            this.gameStats.cleanliness = Math.min(100, this.gameStats.cleanliness + 25);
            this.gameStats.happiness = Math.min(100, this.gameStats.happiness + 5);

            console.log('🧼 [POU GAME] ¡POU está limpio! Limpieza: ' + this.gameStats.cleanliness);
        }

        updateGameLoop() {
            if (!pouGameActive || !this.initialized) return;

            const now = Date.now();
            if (now - this.lastUpdateTime < this.UPDATE_INTERVAL) return;

            const targetPlayers = this.getTargetPlayerCoords(selectedPlayerId);
            if (!targetPlayers) return;

            targetPlayers.forEach(player => {
                this.updatePouForPlayer(player);
            });

            // Decrementar stats con el tiempo
            if (now % 5000 < this.UPDATE_INTERVAL) { // Cada 5 segundos
                this.gameStats.hunger = Math.max(0, this.gameStats.hunger - 1);
                this.gameStats.energy = Math.max(0, this.gameStats.energy - 0.5);
                this.gameStats.cleanliness = Math.max(0, this.gameStats.cleanliness - 0.5);

                if (this.gameStats.hunger < 50) {
                    this.gameStats.happiness = Math.max(0, this.gameStats.happiness - 1);
                }
            }

            this.updateStatsDisplay();
            this.lastUpdateTime = now;
        }

        updateStatsDisplay() {
            const statsDiv = document.getElementById('pou-stats');
            if (statsDiv) {
                statsDiv.innerHTML = `
                    <div>😊 Happiness: ${Math.round(this.gameStats.happiness)}%</div>
                    <div>🍎 Hunger: ${Math.round(this.gameStats.hunger)}%</div>
                    <div>🧼 Clean: ${Math.round(this.gameStats.cleanliness)}%</div>
                    <div>⚡ Energy: ${Math.round(this.gameStats.energy)}%</div>
                `;
            }
        }

        async cleanCanvas() {
            if (!drawariaCanvas) return;
            console.log('🧹 [POU GAME] Limpiando canvas...');

            const canvasWidth = drawariaCanvas.width;
            const canvasHeight = drawariaCanvas.height;

            for (let y = 0; y < canvasHeight; y += 80) {
                for (let x = 0; x < canvasWidth; x += 80) {
                    const width = Math.min(80, canvasWidth - x);
                    const height = Math.min(80, canvasHeight - y);
                    enqueueDrawCommand(x, y, x + width, y + height, '#FFFFFF', Math.max(width, height));
                    await sleep(5);
                }
            }

            if (drawariaCtx) {
                drawariaCtx.clearRect(0, 0, canvasWidth, canvasHeight);
            }
        }

        startSystem() {
            if (!this.initialized) {
                console.log('❌ [POU GAME] Sistema no inicializado');
                return;
            }

            if (!selectedPlayerId) {
                console.log('❌ [POU GAME] No hay jugador seleccionado');
                return;
            }

            pouGameActive = true;
            this.playerManager.startAutoUpdate();

            // Reset stats
            this.gameStats = {
                happiness: 100,
                hunger: 50,
                cleanliness: 80,
                energy: 70
            };

            const updateLoop = () => {
                if (pouGameActive && this.initialized) {
                    this.updateGameLoop();
                }
                if (pouGameActive) {
                    requestAnimationFrame(updateLoop);
                }
            };
            updateLoop();

            console.log('🎮 [POU GAME] Juego POU iniciado');
        }

        async stopSystem() {
            console.log('⏹️ [POU GAME] Deteniendo juego POU...');

            pouGameActive = false;
            this.playerManager.stopAutoUpdate();

            await this.cleanCanvas();

            commandQueue.length = 0;
            this.pouStates.clear();

            console.log('⏹️ [POU GAME] Juego POU detenido');
        }

        createInterface() {
            const existingPanel = document.getElementById('pou-game-control');
            if (existingPanel) existingPanel.remove();

            const controlPanel = document.createElement('div');
            controlPanel.id = 'pou-game-control';
            controlPanel.style.cssText = `
                position: fixed; top: 20px; right: 20px; z-index: 9999;
                background: linear-gradient(135deg, #8B4513, #DEB887);
                color: white; padding: 20px; border-radius: 15px;
                font-family: 'Segoe UI', Arial, sans-serif;
                border: 3px solid #FFD700; min-width: 320px;
                box-shadow: 0 0 30px rgba(255,215,0,0.4);
                font-size: 14px;
            `;

            controlPanel.innerHTML = `
                <div style="text-align: center; font-weight: bold; color: #FFD700; margin-bottom: 15px;">
                    🎮 POU INTERACTIVE GAME 🎮
                </div>

                <div style="margin-bottom: 15px;">
                    <label style="display: block; margin-bottom: 5px; color: #FFD700;">🎯 Target Player:</label>
                    <select id="pou-player-selector" style="width: 100%; padding: 8px; border-radius: 5px; background: #2d2d2d; color: white; border: 1px solid #FFD700;">
                        <option value="">🔍 Scanning players...</option>
                    </select>
                </div>

                <div id="pou-stats" style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; margin-bottom: 15px; font-size: 12px;">
                    <div>😊 Happiness: 100%</div>
                    <div>🍎 Hunger: 50%</div>
                    <div>🧼 Clean: 80%</div>
                    <div>⚡ Energy: 70%</div>
                </div>

                <div style="margin-bottom: 15px;">
                    <label style="display: block; margin-bottom: 8px; color: #FFD700;">🎲 Mini Games:</label>
                    <div style="display: flex; gap: 5px; flex-wrap: wrap;">
                        <button id="feed-btn" style="flex: 1; padding: 6px; background: #FF6B6B; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 11px;">🍎 Feed</button>
                        <button id="play-btn" style="flex: 1; padding: 6px; background: #4ECDC4; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 11px;">⚽ Play</button>
                        <button id="clean-btn" style="flex: 1; padding: 6px; background: #45B7D1; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 11px;">🧼 Clean</button>
                    </div>
                </div>

                <div style="display: flex; gap: 10px; margin-bottom: 10px;">
                    <button id="pou-start-btn" style="flex: 1; padding: 10px; background: linear-gradient(135deg, #00FF00, #32CD32); color: white; border: none; border-radius: 8px; font-weight: bold; cursor: pointer;" disabled>
                        ▶️ START POU
                    </button>
                    <button id="pou-stop-btn" style="flex: 1; padding: 10px; background: linear-gradient(135deg, #FF4444, #CC0000); color: white; border: none; border-radius: 8px; font-weight: bold; cursor: pointer;" disabled>
                        ⏹️ STOP
                    </button>
                </div>

                <div style="font-size: 11px; color: rgba(255,255,255,0.7); text-align: center;">
                    🎯 POU follows selected player | 🎲 Interactive minigames | 📊 Real-time stats
                </div>
            `;

            document.body.appendChild(controlPanel);
            this.setupEventListeners();
        }

        setupEventListeners() {
            const playerSelect = document.getElementById('pou-player-selector');
            const startBtn = document.getElementById('pou-start-btn');
            const stopBtn = document.getElementById('pou-stop-btn');
            const feedBtn = document.getElementById('feed-btn');
            const playBtn = document.getElementById('play-btn');
            const cleanBtn = document.getElementById('clean-btn');

            playerSelect?.addEventListener('change', (e) => {
                selectedPlayerId = e.target.value;
                if (selectedPlayerId === 'all') {
                    selectedPlayerName = 'All Players';
                } else if (selectedPlayerId) {
                    const selectedOption = e.target.options[e.target.selectedIndex];
                    selectedPlayerName = selectedOption.dataset.playerName || selectedOption.textContent.replace('🎮 ', '');
                } else {
                    selectedPlayerName = null;
                }

                if (startBtn) startBtn.disabled = !selectedPlayerId;
                console.log(`🎯 [POU GAME] Target: ${selectedPlayerName || 'None'}`);
            });

            startBtn?.addEventListener('click', () => {
                this.startSystem();
                startBtn.disabled = true;
                if (stopBtn) stopBtn.disabled = false;
                if (feedBtn) feedBtn.disabled = false;
                if (playBtn) playBtn.disabled = false;
                if (cleanBtn) cleanBtn.disabled = false;
            });

            stopBtn?.addEventListener('click', async () => {
                stopBtn.disabled = true;
                stopBtn.textContent = '🧹 CLEANING...';

                await this.stopSystem();

                stopBtn.textContent = '⏹️ STOP';
                if (startBtn) startBtn.disabled = false;
                stopBtn.disabled = true;
                if (feedBtn) feedBtn.disabled = true;
                if (playBtn) playBtn.disabled = true;
                if (cleanBtn) cleanBtn.disabled = true;
            });

            feedBtn?.addEventListener('click', async () => {
                if (!pouGameActive) return;
                const players = this.getTargetPlayerCoords(selectedPlayerId);
                if (players) {
                    players.forEach(player => this.feedingMinigame(player));
                }
            });

            playBtn?.addEventListener('click', async () => {
                if (!pouGameActive) return;
                const players = this.getTargetPlayerCoords(selectedPlayerId);
                if (players) {
                    players.forEach(player => this.playMinigame(player));
                }
            });

            cleanBtn?.addEventListener('click', async () => {
                if (!pouGameActive) return;
                const players = this.getTargetPlayerCoords(selectedPlayerId);
                if (players) {
                    players.forEach(player => this.cleaningMinigame(player));
                }
            });

            // Inicializar actualización de jugadores
            setTimeout(() => {
                this.playerManager.startAutoUpdate();
            }, 1000);
        }
    }

    /* ----------  INICIALIZACIÓN  ---------- */
    let pouGameSystem = null;

    const initPouGame = () => {
        if (!pouGameSystem) {
            console.log('🚀 [POU GAME] Inicializando POU Interactive Game...');
            pouGameSystem = new PouGameSystem();

            setTimeout(() => {
                console.log('');
                console.log('✅ [POU GAME] POU INTERACTIVE GAME LOADED! 🎮');
                console.log('🐾 [POU GAME] Tu mascota virtual POU en Drawaria');
                console.log('🎯 [POU GAME] Selecciona jugador para que POU lo siga');
                console.log('🎲 [POU GAME] 3 Minijuegos: Feed 🍎 | Play ⚽ | Clean 🧼');
                console.log('📊 [POU GAME] Stats en tiempo real: Felicidad, Hambre, Limpieza, Energía');
                console.log('😊 [POU GAME] POU cambia de humor según sus stats');
                console.log('💖 [POU GAME] Corazones cuando POU está feliz');
                console.log('🎨 [POU GAME] Pixel art optimizado y animaciones');
                console.log('🧹 [POU GAME] Limpieza automática de canvas al parar');
                console.log('');
            }, 1000);
        }
    };

    // Inicialización
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initPouGame);
    } else {
        setTimeout(initPouGame, 500);
    }

    setTimeout(initPouGame, 2000);

    console.log('🌟 [POU GAME] Drawaria POU Interactive Game loaded! 🌟');

})();