import React, { useState, useEffect, useRef } from "react"; import GameDataManager from "../../../services/GameDataManager.js"; import "./DungeonScreen.css"; import DungeonFinish from "../tabs/components/DungeonFinish.jsx"; const DungeonScreen = ({ session, socket }) => { const [roomData, setRoomData] = useState(session.room); const [hostiles, setHostiles] = useState(session.hostiles || []); const [roomIndex, setRoomIndex] = useState(session.roomIndex); const [enemyHp, setEnemyHp] = useState(null); const [isEnemyDefeated, setIsEnemyDefeated] = useState(false); const [isLooted, setIsLooted] = useState(false); const [summary, setSummary] = useState(null); const [log, setLog] = useState([ "SYSTEM: Neural link established. Scanning sector...", ]); const logEndRef = useRef(null); const currentEnemy = hostiles.length > 0 ? hostiles[0] : null; const dungeonData = GameDataManager.getDungeon(session.dungeonId); const getEnemyDisplayName = (enemy) => { if (!enemy) return "UNKNOWN_ENTITY"; const data = GameDataManager.getEnemy(enemy.id); return data?.displayName || enemy.displayName || enemy.id; }; const getRoomDisplayName = (room) => { if (!room) return "UNKNOWN_LOCATION"; const data = GameDataManager.getRoom(room.id); return data?.displayName || room.displayName || room.id; }; useEffect(() => { logEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [log]); useEffect(() => { socket.on("dungeon:room_update", (data) => { setRoomData(data.room); setHostiles(data.hostiles || []); setRoomIndex(data.roomIndex); setIsEnemyDefeated(false); setIsLooted(false); setEnemyHp(null); addLog(`--- ENTERING SECTOR ${data.roomIndex + 1} ---`); }); socket.on("dungeon:combat_result", (data) => { if (data.message) addLog(data.message); if (data.enemyHp !== undefined) { const maxHp = currentEnemy?.stats?.health || 100; const hpPercent = (data.enemyHp / maxHp) * 100; setEnemyHp(hpPercent); } if (data.targetDefeated) { setIsEnemyDefeated(true); addLog("TARGET_NEUTRALIZED: Threat eliminated."); if (data.loot && data.loot.length > 0) { addLog("SCANNING FOR DROPPED ASSETS..."); data.loot.forEach((item) => { const itemData = GameDataManager.getItem(item.id); const itemName = itemData?.displayName || item.id; addLog(`RECOVERED: ${itemName} x${item.count}`); }); } } }); socket.on("dungeon:completed", (data) => { setSummary(data.rewards); addLog("MISSION_SUCCESS: All objectives secured."); }); return () => { socket.off("dungeon:room_update"); socket.off("dungeon:combat_result"); socket.off("dungeon:completed"); }; }, [socket, currentEnemy]); const addLog = (text) => { const time = new Date().toLocaleTimeString([], { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit", }); setLog((prev) => [...prev, `[${time}] ${text}`]); }; const handleCombat = () => { if (isEnemyDefeated || !currentEnemy) return; socket.emit("dungeon:combat_step", { enemyId: currentEnemy.id }); addLog(`Initiating strike sequence...`); }; const handleLoot = () => { setIsLooted(true); addLog("Loot encryption bypassed. Resources transferred."); }; const handleNextRoom = () => { socket.emit("dungeon:next_room"); }; return (
{summary && ( window.location.reload()} /> )}
SECTOR {roomIndex + 1} / {session.totalRooms}
{dungeonData?.displayName || "MISSION_ACTIVE"}
LIVE_FEED
ENVIRONMENT_SCAN
{getRoomDisplayName(roomData)}
TYPE: {hostiles.length > 0 ? "COMBAT_ZONE" : "SECURE_AREA"}
{currentEnemy ? (
{isEnemyDefeated ? "SIGNAL_LOST" : "HOSTILE_DETECTED"}

{getEnemyDisplayName(currentEnemy)}

STRUCTURE INTEGRITY
LVL: {currentEnemy.level || 1} {currentEnemy.id}
) : (

NO HOSTILES IN RANGE

)}
COMBAT_LOG_V3.0
{log.map((entry, i) => (
> {entry}
))}
{!isEnemyDefeated && currentEnemy && ( )} {isEnemyDefeated && !isLooted && ( )} {(isLooted || !currentEnemy) && ( )}
); }; export default DungeonScreen;