Files
WoWee/docs/architecture.md
kelsi davis 82afb83591 Update documentation to reflect current implementation and features
- 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
2026-02-06 22:39:45 -08:00

16 KiB

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!