#pragma once #include "game/game_handler.hpp" #include "game/inventory.hpp" #include "rendering/world_map.hpp" #include "rendering/character_preview.hpp" #include "ui/inventory_screen.hpp" #include "ui/quest_log_screen.hpp" #include "ui/spellbook_screen.hpp" #include "ui/talent_screen.hpp" #include #include #include #include namespace wowee { namespace pipeline { class AssetManager; } namespace ui { /** * In-game screen UI * * Displays player info, entity list, chat, and game controls */ class GameScreen { public: GameScreen(); /** * Render the UI * @param gameHandler Reference to game handler */ void render(game::GameHandler& gameHandler); /** * Check if chat input is active */ bool isChatInputActive() const { return chatInputActive; } /** * Toggle the teleporter panel */ void toggleTeleporter() { showTeleporter = !showTeleporter; } /** * Check if teleporter panel is open */ bool isTeleporterOpen() const { return showTeleporter; } private: // Chat state char chatInputBuffer[512] = ""; bool chatInputActive = false; int selectedChatType = 0; // 0=SAY, 1=YELL, 2=PARTY, etc. bool chatInputMoveCursorToEnd = false; // UI state bool showEntityWindow = false; bool showChatWindow = true; bool showPlayerInfo = false; bool refocusChatInput = false; bool chatWindowLocked = true; ImVec2 chatWindowPos_ = ImVec2(0.0f, 0.0f); bool chatWindowPosInit_ = false; bool showTeleporter = false; bool showEscapeMenu = false; bool showEscapeSettingsNotice = false; bool showSettingsWindow = false; bool settingsInit = false; bool pendingFullscreen = false; bool pendingVsync = false; int pendingResIndex = 0; bool pendingShadows = true; int pendingMusicVolume = 30; int pendingSfxVolume = 100; float pendingMouseSensitivity = 0.2f; bool pendingInvertMouse = false; int pendingUiOpacity = 100; // UI element transparency (0.0 = fully transparent, 1.0 = fully opaque) float uiOpacity_ = 1.0f; /** * Render player info window */ void renderPlayerInfo(game::GameHandler& gameHandler); /** * Render entity list window */ void renderEntityList(game::GameHandler& gameHandler); /** * Render chat window */ void renderChatWindow(game::GameHandler& gameHandler); /** * Send chat message */ void sendChatMessage(game::GameHandler& gameHandler); /** * Get chat type name */ const char* getChatTypeName(game::ChatType type) const; /** * Get chat type color */ ImVec4 getChatTypeColor(game::ChatType type) const; /** * Render player unit frame (top-left) */ void renderPlayerFrame(game::GameHandler& gameHandler); /** * Render target frame */ void renderTargetFrame(game::GameHandler& gameHandler); /** * Process targeting input (Tab, Escape, click) */ void processTargetInput(game::GameHandler& gameHandler); /** * Rebuild character geosets from current equipment state */ void updateCharacterGeosets(game::Inventory& inventory); /** * Re-composite character skin texture from current equipment */ void updateCharacterTextures(game::Inventory& inventory); // ---- New UI renders ---- void renderActionBar(game::GameHandler& gameHandler); void renderXpBar(game::GameHandler& gameHandler); void renderCastBar(game::GameHandler& gameHandler); void renderCombatText(game::GameHandler& gameHandler); void renderPartyFrames(game::GameHandler& gameHandler); void renderGroupInvitePopup(game::GameHandler& gameHandler); void renderBuffBar(game::GameHandler& gameHandler); void renderLootWindow(game::GameHandler& gameHandler); void renderGossipWindow(game::GameHandler& gameHandler); void renderQuestDetailsWindow(game::GameHandler& gameHandler); void renderVendorWindow(game::GameHandler& gameHandler); void renderTeleporterPanel(); void renderDeathScreen(game::GameHandler& gameHandler); void renderEscapeMenu(); void renderSettingsWindow(); void renderQuestMarkers(game::GameHandler& gameHandler); void renderMinimapMarkers(game::GameHandler& gameHandler); /** * Inventory screen */ void renderWorldMap(game::GameHandler& gameHandler); InventoryScreen inventoryScreen; QuestLogScreen questLogScreen; SpellbookScreen spellbookScreen; TalentScreen talentScreen; rendering::WorldMap worldMap; bool actionSpellDbAttempted = false; bool actionSpellDbLoaded = false; std::unordered_map actionSpellNames; // Spell icon cache: spellId -> GL texture ID std::unordered_map spellIconCache_; // SpellIconID -> icon path (from SpellIcon.dbc) std::unordered_map spellIconPaths_; // SpellID -> SpellIconID (from Spell.dbc field 133) std::unordered_map spellIconIds_; bool spellIconDbLoaded_ = false; GLuint getSpellIcon(uint32_t spellId, pipeline::AssetManager* am); // Action bar drag state (-1 = not dragging) int actionBarDragSlot_ = -1; GLuint actionBarDragIcon_ = 0; }; } // namespace ui } // namespace wowee