/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useMemo } from 'react'; import { Coins, Sparkles, Hammer, Search, Plus, ShieldAlert, Cpu, Flame, Check, Zap, RotateCcw, Palette } from 'lucide-react'; import { GameStats, Entity, RarityType, Upgrade } from '../types'; import { ENTITIES, RARITIES } from '../data/entities'; import { voidAudio } from '../utils/audio'; interface JulioModPanelProps { stats: GameStats; upgrades: Upgrade[]; onUpdateStats: (newFields: Partial) => void; onSpawnEntity: (entity: Entity) => void; onUpdateUpgrades: (newUpgrades: Upgrade[]) => void; onSetUnlockedThemes: (themes: string[]) => void; addTerminalLog: (msg: string, type: 'info' | 'success' | 'warn' | 'error', color?: string) => void; } export const JulioModPanel: React.FC = ({ stats, upgrades, onUpdateStats, onSpawnEntity, onUpdateUpgrades, onSetUnlockedThemes, addTerminalLog }) => { const [customCoins, setCustomCoins] = useState(stats.coins.toString()); const [customLuck, setCustomSuerte] = useState(stats.luckMultiplier.toString()); const [searchQuery, setSearchQuery] = useState(''); const [rarityFilter, setRarityFilter] = useState('all'); const handleSetCoins = (e: React.FormEvent) => { e.preventDefault(); const val = parseInt(customCoins); if (!isNaN(val) && val >= 0) { onUpdateStats({ coins: val }); voidAudio.playClick(); addTerminalLog(`MOD MULTIVERSE: Monedas modificadas directamente a [${val.toLocaleString()}]`, 'warn', '#ef4444'); } }; const handleSetLuck = (e: React.FormEvent) => { e.preventDefault(); const val = parseFloat(customLuck); if (!isNaN(val) && val >= 0) { onUpdateStats({ luckMultiplier: val }); voidAudio.playClick(); addTerminalLog(`MOD MULTIVERSE: Multiplicador de Suerte fijado en [${val.toFixed(2)}x]`, 'warn', '#ef4444'); } }; const handleQuickAddCoins = (amount: number) => { const val = stats.coins + amount; onUpdateStats({ coins: val }); setCustomCoins(val.toString()); voidAudio.playBeep(600, 0.1, 'sine'); addTerminalLog(`MOD MULTIVERSE: Inyectada suma rápida de +${amount.toLocaleString()} Monedas`, 'warn', '#ef4444'); }; const handleQuickSetLuck = (multiplier: number) => { onUpdateStats({ luckMultiplier: multiplier }); setCustomSuerte(multiplier.toString()); voidAudio.playBeep(880, 0.1, 'triangle'); addTerminalLog(`MOD MULTIVERSE: Multiplicador cuántico alterado a [${multiplier.toFixed(1)}x]`, 'warn', '#ef4444'); }; const handleMaxUpgrades = () => { const maxed = upgrades.map((up) => ({ ...up, level: up.maxLevel, cost: Math.floor(up.cost * Math.pow(1.85, up.maxLevel - up.level)) })); onUpdateUpgrades(maxed); onUpdateStats({ luckMultiplier: 1 + (maxed.find(u => u.id === 'luck')?.level || 20 - 1) * 0.15, rollSpeedMultiplier: 1 + (maxed.find(u => u.id === 'speed_boost')?.level || 5 - 1) * 0.2 }); voidAudio.playRaritySfx('divine'); addTerminalLog(`MOD MULTIVERSE: ¡Mejoras de hardware de terminal maximizadas al límite extremo!`, 'warn', '#fbbf24'); }; const handleUnlockThemes = () => { const allThemeIds = ['matrix', 'neon', 'glitch', 'classic', 'divine-theme', 'julio']; onSetUnlockedThemes(allThemeIds); voidAudio.playBeep(520, 0.25, 'sine'); addTerminalLog(`MOD MULTIVERSE: Desencriptación masiva. Todos los esquemas de color liberados.`, 'success', '#4ade80'); }; // Filter items matching query and filters const filteredEntities = useMemo(() => { return ENTITIES.filter((ent) => { const matchSearch = ent.name.toLowerCase().includes(searchQuery.toLowerCase()) || ent.description.toLowerCase().includes(searchQuery.toLowerCase()); const matchRarity = rarityFilter === 'all' || ent.rarity === rarityFilter; return matchSearch && matchRarity; }); }, [searchQuery, rarityFilter]); const handleSpawn = (entity: Entity) => { voidAudio.playRaritySfx(entity.rarity); onSpawnEntity(entity); }; return (
{/* WARNING / DEFIANT INTRO BANNER */}
★ SUBSISTEMA MOD MAESTRO ACTIVADO : INOCULACIÓN DE CONTROL ★

MENÚ DE DESARROLLO - PROTOCOLO JULIO

Bypass total de seguridad detectado. Se ha otorgado acceso irrestricto de compilación a la red de datos local. Altera transacciones o inyecta elementos directamente en las bobinas.

{/* LEFT COLUMN: CURRENCY AND STATS HYBRID TUNER */}

Control Cuántico de Variables

{/* MONEY MOD */}
Ajustar Monedas {stats.coins.toLocaleString()}
setCustomCoins(e.target.value)} className="flex-1 bg-black border border-red-900/40 hover:border-red-700/60 rounded px-2.5 py-1.5 text-xs font-bold text-red-400 focus:outline-none focus:border-red-500 text-center" />
{/* LUCK LUCK TUNER */}
Factor de Suerte {stats.luckMultiplier.toFixed(2)}x
setCustomSuerte(e.target.value)} className="flex-1 bg-black border border-red-900/40 hover:border-red-700/60 rounded px-2.5 py-1.5 text-xs font-bold text-red-400 focus:outline-none focus:border-red-500 text-center" />
{/* QUICK FULL TRICK HANDLERS */}
Inyecciones Rápidas del Servidor
{/* RIGHT COLUMN (SPANS 2 COLUMNS): ALL ITEMS INJECTOR DEVICE */}

Inyector de Coordenadas de Datos (Spawner de Objetos)

{/* SEARCH FILTERS */}
setSearchQuery(e.target.value)} className="pl-9 pr-4 py-2 w-full bg-zinc-950 border border-zinc-850 rounded text-xs text-zinc-300 focus:outline-none focus:border-red-500/80 placeholder-zinc-700" />
{/* CARDS VIEWER SCROLL CONTAINER */}
{filteredEntities.map((entity) => { const rarityConfig = RARITIES[entity.rarity]; return (
{/* Tiny ASCII block view */}
{entity.ascii}
{entity.name} {rarityConfig.label}

{entity.description}

REF: {entity.id}
); })} {filteredEntities.length === 0 && (
No se encontraron coordenadas coincidiendo con los filtros.
)}
); };