mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
- Expand README.md with complete feature list (quests, vendors, combat, spells, inventory, etc.) - Update Controls section with comprehensive keybindings organized by category - Rewrite docs/quickstart.md from "TODO" state to reflect all working features - Enhance docs/architecture.md with detailed system descriptions and current capabilities - Add CHANGELOG.md documenting 50+ recent commits grouped by feature area - Add FEATURES.md with 100+ documented features across 8 major categories - Update technical details with architecture, networking, and asset loading info
541 lines
16 KiB
Markdown
541 lines
16 KiB
Markdown
# Architecture Overview
|
|
|
|
## System Design
|
|
|
|
Wowee follows a modular architecture with clear separation of concerns:
|
|
|
|
```
|
|
┌─────────────────────────────────────────────┐
|
|
│ Application (main loop) │
|
|
│ - State management (auth/realms/game) │
|
|
│ - Update cycle (60 FPS) │
|
|
│ - Event dispatch │
|
|
└──────────────┬──────────────────────────────┘
|
|
│
|
|
┌───────┴────────┐
|
|
│ │
|
|
┌──────▼──────┐ ┌─────▼──────┐
|
|
│ Window │ │ Input │
|
|
│ (SDL2) │ │ (Keyboard/ │
|
|
│ │ │ Mouse) │
|
|
└──────┬──────┘ └─────┬──────┘
|
|
│ │
|
|
└───────┬────────┘
|
|
│
|
|
┌──────────┴──────────┐
|
|
│ │
|
|
┌───▼────────┐ ┌───────▼──────┐
|
|
│ Renderer │ │ UI Manager │
|
|
│ (OpenGL) │ │ (ImGui) │
|
|
└───┬────────┘ └──────────────┘
|
|
│
|
|
├─ Camera
|
|
├─ Scene Graph
|
|
├─ Shaders
|
|
├─ Meshes
|
|
└─ Textures
|
|
```
|
|
|
|
## Core Systems
|
|
|
|
### 1. Application Layer (`src/core/`)
|
|
|
|
**Application** - Main controller
|
|
- Owns all subsystems
|
|
- Manages application state
|
|
- Runs update/render loop
|
|
- Handles lifecycle (init/shutdown)
|
|
|
|
**Window** - SDL2 wrapper
|
|
- Creates window and OpenGL context
|
|
- Handles resize events
|
|
- Manages VSync and fullscreen
|
|
|
|
**Input** - Input management
|
|
- Keyboard state tracking
|
|
- Mouse position and buttons
|
|
- Mouse locking for camera control
|
|
|
|
**Logger** - Logging system
|
|
- Thread-safe logging
|
|
- Multiple log levels (DEBUG, INFO, WARNING, ERROR, FATAL)
|
|
- Timestamp formatting
|
|
|
|
### 2. Rendering System (`src/rendering/`)
|
|
|
|
**Renderer** - Main rendering coordinator
|
|
- Manages OpenGL state
|
|
- Coordinates frame rendering
|
|
- Owns camera and scene
|
|
|
|
**Camera** - View/projection matrices
|
|
- Position and orientation
|
|
- FOV and aspect ratio
|
|
- View frustum (for culling)
|
|
|
|
**Scene** - Scene graph
|
|
- Mesh collection
|
|
- Spatial organization
|
|
- Visibility determination
|
|
|
|
**Shader** - GLSL program wrapper
|
|
- Loads vertex/fragment shaders
|
|
- Uniform management
|
|
- Compilation and linking
|
|
|
|
**Mesh** - Geometry container
|
|
- Vertex buffer (position, normal, texcoord)
|
|
- Index buffer
|
|
- VAO/VBO/EBO management
|
|
|
|
**Texture** - Texture management
|
|
- Loading (will support BLP format)
|
|
- OpenGL texture object
|
|
- Mipmap generation
|
|
|
|
**Material** - Surface properties
|
|
- Shader assignment
|
|
- Texture binding
|
|
- Color/properties
|
|
|
|
### 3. Networking (`src/network/`)
|
|
|
|
**Socket** (Abstract base class)
|
|
- Connection interface
|
|
- Packet send/receive
|
|
- Callback system
|
|
|
|
**TCPSocket** - Linux TCP sockets
|
|
- Non-blocking I/O
|
|
- Raw TCP (replaces WebSocket)
|
|
- Packet framing
|
|
|
|
**Packet** - Binary data container
|
|
- Read/write primitives
|
|
- Byte order handling
|
|
- Opcode management
|
|
|
|
### 4. Authentication (`src/auth/`)
|
|
|
|
**AuthHandler** - Auth server protocol
|
|
- Connects to port 3724
|
|
- SRP authentication flow
|
|
- Session key generation
|
|
|
|
**SRP** - Secure Remote Password
|
|
- SRP6a algorithm
|
|
- Big integer math
|
|
- Salt and verifier generation
|
|
|
|
**Crypto** - Cryptographic functions
|
|
- SHA1 hashing (OpenSSL)
|
|
- Random number generation
|
|
- Encryption helpers
|
|
|
|
### 5. Game Logic (`src/game/`)
|
|
|
|
**GameHandler** - World server protocol
|
|
- Connects to port 8085 (configurable)
|
|
- Packet handlers for 100+ opcodes
|
|
- Session management with RC4 encryption
|
|
- Character enumeration and login flow
|
|
|
|
**World** - Game world state
|
|
- Map loading with async terrain streaming
|
|
- Entity management (players, NPCs, creatures)
|
|
- Zone management and exploration
|
|
- Time-of-day synchronization
|
|
|
|
**Player** - Player character
|
|
- Position and movement (WASD + spline movement)
|
|
- Stats tracking (health, mana, XP, level)
|
|
- Equipment and inventory (23 + 16 slots)
|
|
- Action queue and spell casting
|
|
- Death and resurrection handling
|
|
|
|
**Character** - Character data
|
|
- Race, class, gender, appearance
|
|
- Creation and customization
|
|
- 3D model preview
|
|
- Persistence (online and offline)
|
|
|
|
**Entity** - Game entities
|
|
- NPCs and creatures with display info
|
|
- Animation state (idle, combat, walk, run)
|
|
- GUID management (player, creature, item, gameobject)
|
|
- Targeting and selection
|
|
|
|
**Inventory** - Item management
|
|
- Equipment slots (head, shoulders, chest, etc.)
|
|
- Backpack storage (16 slots)
|
|
- Item metadata (icons, stats, durability)
|
|
- Drag-drop system
|
|
- Auto-equip and unequip
|
|
|
|
**NPCManager** - NPC interactions
|
|
- Gossip system
|
|
- Quest givers with markers (! and ?)
|
|
- Vendors (buy/sell)
|
|
- Trainers (placeholder)
|
|
- Combat animations
|
|
|
|
**ZoneManager** - Zone and area tracking
|
|
- Map exploration
|
|
- Area discovery
|
|
- Zone change detection
|
|
|
|
**Opcodes** - Protocol definitions
|
|
- 100+ Client→Server opcodes (CMSG_*)
|
|
- 100+ Server→Client opcodes (SMSG_*)
|
|
- WoW 3.3.5a (build 12340) specific
|
|
|
|
### 6. Asset Pipeline (`src/pipeline/`)
|
|
|
|
**MPQManager** - Archive management
|
|
- Loads .mpq files (via StormLib)
|
|
- Priority-based file lookup (patch files override base files)
|
|
- Data extraction with caching
|
|
- Locale support (enUS, enGB, etc.)
|
|
|
|
**BLPLoader** - Texture parser
|
|
- BLP format (Blizzard texture format)
|
|
- DXT1/3/5 compression support
|
|
- Mipmap extraction and generation
|
|
- OpenGL texture object creation
|
|
|
|
**M2Loader** - Model parser
|
|
- Character/creature models with materials
|
|
- Skeletal animation data (256 bones max)
|
|
- Bone hierarchies and transforms
|
|
- Animation sequences (idle, walk, run, attack, etc.)
|
|
- Particle emitters (WotLK FBlock format)
|
|
- Attachment points (weapons, mounts, etc.)
|
|
- Geoset support (hide/show body parts)
|
|
- Multiple texture units and render batches
|
|
|
|
**WMOLoader** - World object parser
|
|
- Buildings and structures
|
|
- Multi-material batches
|
|
- Portal system (visibility culling)
|
|
- Doodad placement (decorations)
|
|
- Group-based rendering
|
|
- Liquid data (indoor water)
|
|
|
|
**ADTLoader** - Terrain parser
|
|
- 64x64 tiles per map (map_XX_YY.adt)
|
|
- 16x16 chunks per tile (MCNK)
|
|
- Height map data (9x9 outer + 8x8 inner vertices)
|
|
- Texture layers (up to 4 per chunk with alpha blending)
|
|
- Liquid data (water/lava/slime with height and flags)
|
|
- Object placement (M2 and WMO references)
|
|
- Terrain holes
|
|
- Async loading to prevent frame stalls
|
|
|
|
**DBCLoader** - Database parser
|
|
- 20+ DBC files loaded (Spell, Item, Creature, SkillLine, Faction, etc.)
|
|
- Type-safe record access
|
|
- String block parsing
|
|
- Memory-efficient caching
|
|
- Used for:
|
|
- Spell icons and tooltips (Spell.dbc, SpellIcon.dbc)
|
|
- Item data (Item.dbc, ItemDisplayInfo.dbc)
|
|
- Creature display info (CreatureDisplayInfo.dbc, CreatureModelData.dbc)
|
|
- Class and race info (ChrClasses.dbc, ChrRaces.dbc)
|
|
- Skill lines (SkillLine.dbc, SkillLineAbility.dbc)
|
|
- Faction and reputation (Faction.dbc)
|
|
- Map and area names (Map.dbc, AreaTable.dbc)
|
|
|
|
### 7. UI System (`src/ui/`)
|
|
|
|
**UIManager** - ImGui coordinator
|
|
- ImGui initialization with SDL2/OpenGL backend
|
|
- Event handling and input routing
|
|
- Render dispatch with opacity control
|
|
- Screen state management
|
|
|
|
**AuthScreen** - Login interface
|
|
- Username/password input fields
|
|
- Server address configuration
|
|
- "Single Player" offline mode button
|
|
- Connection status and error messages
|
|
|
|
**RealmScreen** - Server selection
|
|
- Realm list display with names and types
|
|
- Population info (Low/Medium/High/Full)
|
|
- Realm type indicators (PvP/PvE/RP/RPPvP)
|
|
- Auto-select for single realm
|
|
|
|
**CharacterScreen** - Character selection
|
|
- Character list with 3D animated preview
|
|
- Stats panel (level, race, class, location)
|
|
- Create/delete character buttons
|
|
- Enter world button
|
|
- Auto-select for single character
|
|
|
|
**CharacterCreateScreen** - Character creation
|
|
- Race selection (all Alliance and Horde races)
|
|
- Class selection (class availability by race)
|
|
- Gender selection
|
|
- Appearance customization (face, skin, hair, color, features)
|
|
- Name input with validation
|
|
- 3D character preview
|
|
|
|
**GameScreen** - In-game HUD
|
|
- Chat window with message history and formatting
|
|
- Action bar (12 slots with icons, cooldowns, keybindings)
|
|
- Target frame (name, level, health, hostile/friendly coloring)
|
|
- Player stats (health, mana/rage/energy)
|
|
- Minimap with quest markers
|
|
- Experience bar
|
|
|
|
**InventoryScreen** - Inventory management
|
|
- Equipment paper doll (23 slots: head, shoulders, chest, etc.)
|
|
- Backpack grid (16 slots)
|
|
- Item icons with tooltips
|
|
- Drag-drop to equip/unequip
|
|
- Item stats and durability
|
|
- Gold display
|
|
|
|
**SpellbookScreen** - Spells and abilities
|
|
- Tabbed interface (class specialties + General)
|
|
- Spell icons organized by SkillLine
|
|
- Spell tooltips (name, rank, cost, cooldown, description)
|
|
- Drag-drop to action bar
|
|
- Known spell tracking
|
|
|
|
**QuestLogScreen** - Quest tracking
|
|
- Active quest list
|
|
- Quest objectives and progress
|
|
- Quest details (description, objectives, rewards)
|
|
- Abandon quest button
|
|
- Quest level and recommended party size
|
|
|
|
**TalentScreen** - Talent trees
|
|
- Placeholder for talent system
|
|
- Tree visualization (TODO)
|
|
- Talent point allocation (TODO)
|
|
|
|
**Settings Window** - Configuration
|
|
- UI opacity slider
|
|
- Graphics options (TODO)
|
|
- Audio controls (TODO)
|
|
- Keybinding customization (TODO)
|
|
|
|
**Loading Screen** - Map loading progress
|
|
- Progress bar with percentage
|
|
- Background image (map-specific, TODO)
|
|
- Loading tips (TODO)
|
|
- Shown during world entry and map transitions
|
|
|
|
## Data Flow Examples
|
|
|
|
### Authentication Flow
|
|
```
|
|
User Input (username/password)
|
|
↓
|
|
AuthHandler::authenticate()
|
|
↓
|
|
SRP::calculateVerifier()
|
|
↓
|
|
TCPSocket::send(LOGON_CHALLENGE)
|
|
↓
|
|
Server Response (LOGON_CHALLENGE)
|
|
↓
|
|
AuthHandler receives packet
|
|
↓
|
|
SRP::calculateProof()
|
|
↓
|
|
TCPSocket::send(LOGON_PROOF)
|
|
↓
|
|
Server Response (LOGON_PROOF) → Success
|
|
↓
|
|
Application::setState(REALM_SELECTION)
|
|
```
|
|
|
|
### Rendering Flow
|
|
```
|
|
Application::render()
|
|
↓
|
|
Renderer::beginFrame()
|
|
├─ glClearColor() - Clear screen
|
|
└─ glClear() - Clear buffers
|
|
↓
|
|
Renderer::renderWorld(world)
|
|
├─ Update camera matrices
|
|
├─ Frustum culling
|
|
├─ For each visible chunk:
|
|
│ ├─ Bind shader
|
|
│ ├─ Set uniforms (matrices, lighting)
|
|
│ ├─ Bind textures
|
|
│ └─ Mesh::draw() → glDrawElements()
|
|
└─ For each entity:
|
|
├─ Calculate bone transforms
|
|
└─ Render skinned mesh
|
|
↓
|
|
UIManager::render()
|
|
├─ ImGui::NewFrame()
|
|
├─ Render current UI screen
|
|
└─ ImGui::Render()
|
|
↓
|
|
Renderer::endFrame()
|
|
↓
|
|
Window::swapBuffers()
|
|
```
|
|
|
|
### Asset Loading Flow
|
|
```
|
|
World::loadMap(mapId)
|
|
↓
|
|
MPQManager::readFile("World/Maps/{map}/map.adt")
|
|
↓
|
|
ADTLoader::load(adtData)
|
|
├─ Parse MCNK chunks (terrain)
|
|
├─ Parse MCLY chunks (textures)
|
|
├─ Parse MCVT chunks (vertices)
|
|
└─ Parse MCNR chunks (normals)
|
|
↓
|
|
For each texture reference:
|
|
MPQManager::readFile(texturePath)
|
|
↓
|
|
BLPLoader::load(blpData)
|
|
↓
|
|
Texture::loadFromMemory(imageData)
|
|
↓
|
|
Create Mesh from vertices/normals/texcoords
|
|
↓
|
|
Add to Scene
|
|
↓
|
|
Renderer draws in next frame
|
|
```
|
|
|
|
## Threading Model
|
|
|
|
Currently **single-threaded** with async operations:
|
|
- Main thread: Window events, update, render
|
|
- Network I/O: Non-blocking in main thread (event-driven)
|
|
- Asset loading: Async terrain streaming (non-blocking chunk loads)
|
|
|
|
**Async Systems Implemented:**
|
|
- Terrain streaming loads ADT chunks asynchronously to prevent frame stalls
|
|
- Network packets processed in batches per frame
|
|
- UI rendering deferred until after world rendering
|
|
|
|
**Future multi-threading opportunities:**
|
|
- Asset loading thread pool (background texture/model decompression)
|
|
- Network thread (dedicated for socket I/O)
|
|
- Physics thread (if collision detection is added)
|
|
- Audio streaming thread
|
|
|
|
## Memory Management
|
|
|
|
- **Smart pointers:** Used throughout (std::unique_ptr, std::shared_ptr)
|
|
- **RAII:** All resources (OpenGL, SDL) cleaned up automatically
|
|
- **No manual memory management:** No raw new/delete
|
|
- **OpenGL resources:** Wrapped in classes with proper destructors
|
|
|
|
## Performance Considerations
|
|
|
|
### Rendering
|
|
- **Frustum culling:** Only render visible chunks (terrain and WMO groups)
|
|
- **Distance culling:** WMO groups culled beyond 160 units
|
|
- **Batching:** Group draw calls by material and shader
|
|
- **LOD:** Distance-based level of detail (TODO)
|
|
- **Occlusion:** Portal-based visibility (WMO system)
|
|
- **GPU skinning:** Character animation computed on GPU (256 bones)
|
|
- **Instancing:** Future optimization for repeated models
|
|
|
|
### Asset Streaming
|
|
- **Async loading:** Terrain chunks load asynchronously (prevents frame stalls)
|
|
- **Lazy loading:** Load chunks as player moves within streaming radius
|
|
- **Unloading:** Free distant chunks automatically
|
|
- **Caching:** Keep frequently used assets in memory (textures, models)
|
|
- **Priority queue:** Load visible chunks first
|
|
|
|
### Network
|
|
- **Non-blocking I/O:** Never stall main thread
|
|
- **Packet buffering:** Handle multiple packets per frame
|
|
- **Batch processing:** Process received packets in batches
|
|
- **RC4 encryption:** Efficient header encryption (minimal overhead)
|
|
- **Compression:** Some packets are compressed (TODO)
|
|
|
|
### Memory Management
|
|
- **Smart pointers:** Automatic cleanup, no memory leaks
|
|
- **Object pooling:** Reuse particle objects (weather system)
|
|
- **DBC caching:** Load once, access fast
|
|
- **Texture sharing:** Same texture used by multiple models
|
|
|
|
## Error Handling
|
|
|
|
- **Logging:** All errors logged with context
|
|
- **Graceful degradation:** Missing assets show placeholder
|
|
- **State recovery:** Network disconnect → back to auth screen
|
|
- **No crashes:** Exceptions caught at application level
|
|
|
|
## Configuration
|
|
|
|
Currently hardcoded, future config system:
|
|
- Window size and fullscreen
|
|
- Graphics quality settings
|
|
- Server addresses
|
|
- Keybindings
|
|
- Audio volume
|
|
|
|
## Testing Strategy
|
|
|
|
**Unit Testing** (TODO):
|
|
- Packet serialization/deserialization
|
|
- SRP math functions
|
|
- Asset parsers with sample files
|
|
- DBC record parsing
|
|
- Inventory slot calculations
|
|
|
|
**Integration Testing** (TODO):
|
|
- Full auth flow against test server
|
|
- Realm list retrieval
|
|
- Character creation and selection
|
|
- Quest turn-in flow
|
|
- Vendor transactions
|
|
|
|
**Manual Testing:**
|
|
- Visual verification of rendering (terrain, water, models, particles)
|
|
- Performance profiling (F1 performance HUD)
|
|
- Memory leak checking (valgrind)
|
|
- Online gameplay against TrinityCore/MaNGOS servers
|
|
- Single-player mode functionality
|
|
- UI interactions (drag-drop, click events)
|
|
|
|
**Current Test Coverage:**
|
|
- Full authentication flow tested against live servers
|
|
- Character creation and selection verified
|
|
- Quest system tested (accept, track, turn-in)
|
|
- Vendor system tested (buy, sell)
|
|
- Combat system tested (targeting, auto-attack, spells)
|
|
- Inventory system tested (equip, unequip, drag-drop)
|
|
|
|
## Build System
|
|
|
|
**CMake:**
|
|
- Modular target structure
|
|
- Automatic dependency discovery
|
|
- Cross-platform (Linux focus, but portable)
|
|
- Out-of-source builds
|
|
|
|
**Dependencies:**
|
|
- SDL2 (system)
|
|
- OpenGL/GLEW (system)
|
|
- OpenSSL (system)
|
|
- GLM (system or header-only)
|
|
- ImGui (submodule in extern/)
|
|
- StormLib (system, optional)
|
|
|
|
## Code Style
|
|
|
|
- **C++17 standard**
|
|
- **Namespaces:** wowee::core, wowee::rendering, etc.
|
|
- **Naming:** PascalCase for classes, camelCase for functions/variables
|
|
- **Headers:** .hpp extension
|
|
- **Includes:** Relative to project root
|
|
|
|
---
|
|
|
|
This architecture provides a solid foundation for a full-featured native WoW client!
|