Add spellbook, fix WMO floor clipping, and polish UI/visuals

- Add spellbook screen (P key) with Spell.dbc name lookup and action bar assignment
- Default Attack and Hearthstone spells available in single player
- Fix WMO floor clipping (gryphon roost) by tightening ceiling rejection threshold
- Darken ocean water, increase wave motion and opacity
- Add M2 model distance fade-in to prevent pop-in
- Reposition chat window, add slash/enter key focus
- Remove debug key commands (keep only F1 perf HUD, N minimap)
- Performance: return chat history by const ref, use deque for O(1) pop_front
This commit is contained in:
Kelsi 2026-02-04 11:31:08 -08:00
parent c49bb58e47
commit 4bc5064515
17 changed files with 486 additions and 431 deletions

View file

@ -8,6 +8,7 @@
#include <memory>
#include <string>
#include <vector>
#include <deque>
#include <array>
#include <functional>
#include <cstdint>
@ -151,7 +152,7 @@ public:
* @param maxMessages Maximum number of messages to return (0 = all)
* @return Vector of chat messages
*/
std::vector<MessageChatData> getChatHistory(size_t maxMessages = 50) const;
const std::deque<MessageChatData>& getChatHistory() const { return chatHistory; }
/**
* Add a locally-generated chat message (e.g., emote feedback)
@ -401,7 +402,7 @@ private:
EntityManager entityManager; // Manages all entities in view
// Chat
std::vector<MessageChatData> chatHistory; // Recent chat messages
std::deque<MessageChatData> chatHistory; // Recent chat messages
size_t maxChatHistory = 100; // Maximum chat messages to keep
// Targeting

View file

@ -48,6 +48,7 @@ struct M2ModelGPU {
bool collisionSmallSolidProp = false;
bool collisionNarrowVerticalProp = false;
bool collisionNoBlock = false;
bool collisionStatue = false;
std::string name;

View file

@ -235,6 +235,7 @@ private:
glm::mat4 invModelMatrix; // Cached inverse for collision
glm::vec3 worldBoundsMin;
glm::vec3 worldBoundsMax;
std::vector<std::pair<glm::vec3, glm::vec3>> worldGroupBounds;
void updateModelMatrix();
};

View file

@ -3,6 +3,7 @@
#include "game/game_handler.hpp"
#include "game/inventory.hpp"
#include "ui/inventory_screen.hpp"
#include "ui/spellbook_screen.hpp"
#include <imgui.h>
#include <string>
@ -110,6 +111,7 @@ private:
* Inventory screen
*/
InventoryScreen inventoryScreen;
SpellbookScreen spellbookScreen;
};
}} // namespace wowee::ui

View file

@ -0,0 +1,38 @@
#pragma once
#include "game/game_handler.hpp"
#include <imgui.h>
#include <string>
#include <unordered_map>
namespace wowee {
namespace pipeline { class AssetManager; }
namespace ui {
class SpellbookScreen {
public:
void render(game::GameHandler& gameHandler, pipeline::AssetManager* assetManager);
bool isOpen() const { return open; }
void toggle() { open = !open; }
void setOpen(bool o) { open = o; }
private:
bool open = false;
bool pKeyWasDown = false;
// Spell name cache (loaded from Spell.dbc)
bool dbcLoaded = false;
bool dbcLoadAttempted = false;
std::unordered_map<uint32_t, std::string> spellNames;
// Action bar assignment
int assigningSlot = -1; // Which action bar slot is being assigned (-1 = none)
void loadSpellDBC(pipeline::AssetManager* assetManager);
std::string getSpellName(uint32_t spellId) const;
};
} // namespace ui
} // namespace wowee