Wonderscape Creations / Darksaint Games · DynamicRPGWorlds · Unreal Engine 5.7+

Build Any RPG.
Skip the Boilerplate.

WC RPG Worlds is a complete, production-quality RPG framework for Unreal Engine 5. Every system you need — combat, inventory, AI, quests, factions, save/load, skill trees, UI — is already built, integrated, and multiplayer-ready. You open the plugin, configure Data Assets, and start making your actual game.

✓ Ships in weeks, not years ✓ Zero GAS boilerplate ✓ Multiplayer from day one ✓ Blueprint-first workflow ✓ 23 integrated modules ✓ Production-hardened code
23
Modules
1,200+
Source Files
348
Native Tags
150
GAS Attributes
98%
Feature Complete

What You Can Build With This

This framework is intentionally genre-agnostic. The systems are building blocks — combine them however your game demands. Here are the games developers are building with it:

🌍
Open-World RPG (Skyrim / Witcher Style)
A massive world with factions, dynamic NPC schedules, fast travel, level streaming, discovered locations, a living calendar, and hundreds of quests. The society simulation means NPCs react to your reputation across the entire world — guards become hostile, merchants give discounts, factions shift allegiance.
WCRealmsWCDynamicSocietyWCStoriesWCAIWCSaveSystem
⚔️
Soulslike / Action RPG
Deep combat with attack chains, charge attacks, parry windows, dodge rolls, stamina management, and ranged abilities. Each weapon has its own combat style. Enemies read the same ruleset — the AI uses the same GAS abilities and attribute system as the player, so boss fights feel fair.
WCCombatWCGASCoreWCGASAllyWCAIWCInput
🏰
Story-Driven RPG (JRPG / BioWare Style)
Full dialogue trees with branching conditions, choices that shift faction standings, quests with multi-stage objectives and custom reward pipelines. Heritage (race/class) defines who your character is. Knowledge systems track achievements, bestiary entries, and lore — everything a narrative game needs out of the box.
WCStoriesWCKnowledgeSuiteWCGASAllyWCDynamicSociety
🌐
MMO-Lite / Co-op RPG
Every system is multiplayer-native. Attributes replicate through GAS. Inventory uses FastArraySerializer for efficient delta replication. The save system matches players by NetID for listen-server and handles slot management for dedicated servers. Drop in a session manager and you have the bones of a live-service RPG.
All modulesGAS replicationWCSaveSystem
🪓
Survival RPG
Stamina, hunger, temperature, and any other survival attribute can be added as Data Assets — no code. Item durability fragments, crafting components, loot tables with context filtering, world item actors that persist in the world state, and a save system that captures the state of every placed actor. Survival is just configuration.
WCInventoryWCGASCoreWCSaveSystemWCRealms
🎭
Roguelite / Dungeon Crawler
Procedural loot tables, fragment-based item composition, skill tree unlocks that persist between runs (or reset — your call), feat-based milestone rewards, and a combat system that handles any number of enemy archetypes. Add your own level generation on top of a proven systems layer.
WCInventoryWCGASAllyWCCombatWCSaveSystem

Core Systems Included — At a Glance

These are not stubs or scaffolding. Every system listed below is fully implemented, source-verified, and integrated with every other system through the framework's wiring layer.

⚔️
Combat System
Melee attack chains, ranged projectiles, aim-down-sights, charge attacks, weapon swap animations, and reload mechanics. All GAS-native. All replicated. Combat styles are data-driven — a designer configures what attacks a weapon can do, not an engineer.
🎒
Inventory + Equipment
Fragment-based item system with stacking, equipment slots, dual-wield, attribute modifiers on equip/unequip, consumables, ammo tracking, weapon heat, and loot tables. Items are composed from fragments — any combination, zero class hierarchy.
🧬
GAS Attributes (150 pool)
150 pre-allocated, replicated attribute slots. Define Health, Mana, Stamina, Hunger, Temperature, or any stat as a Data Asset — no C++ AttributeSet required. Each attribute supports min/max clamping, regeneration, and degeneration out of the box.
🌳
Skill Trees + Progression
Visual skill tree editor with prerequisite chains, skill point management, and async node loading for large trees. Feats (milestone unlocks) fire on level-up, stat thresholds, or achievement triggers. Leveling is curve-driven — paste in an XP curve, done.
🤖
AI (Behavior Trees + Awareness)
8 enemy archetypes, awareness state machine (Unaware → Alerted → Investigating → Hostile → Pursuing), 12 daily routine goals driven by the calendar, and multi-criteria target scoring. Boss phase scripting bridges WCAI and WCGASAlly so bosses change abilities mid-fight.
📖
Quests + Dialogue
Visual quest graph editor with 5 task types (Kill, Collect, Reach, Talk, Interact), condition branches, and reward pipelines. Dialogue trees with player choices, per-node conditions, and consequence execution. Both save and reload correctly.
🏛️
Factions + Social Simulation
Dynamic faction standings that shift with player actions. A 5,852-line society subsystem handles NPC personality modifiers (Paranoia, Generosity, Volatility), crime tracking with bounty system, guard response logic, and relationship decay over time.
💾
Save / Load (Full World + Player)
Async save pipeline that serializes 6 modules automatically: attributes, inventory, equipment, quests, knowledge, and discovered locations. The world section saves every dynamic actor's state and calendar time. Autosave, slot management, level-transition saves, and cloud save hooks all included.
🖥️
MVVM UI Framework
Model-View-ViewModel data binding so UI never polls — it reacts. Screen layer stack (World → HUD → Menu → Modal → Loading) with push/pop transitions. Theme system for accessibility modes. Tooltip aggregation collects stat lines from item fragments automatically.
🗺️
Realms + Level Streaming
Async level streaming with optional cinematic transitions. Fast travel with navmesh projection, calendar time advancement, and discovery unlock validation. World state persistence captures every placed actor's state across level loads.
🎵
Adaptive Audio
Tag-driven music state machine with per-layer crossfading. Ambient zone stacks that blend outdoor and dungeon soundscapes. Stingers for dramatic moments. All driven by gameplay tags — combat starts, music transitions. No audio programmer required.
📚
Knowledge Suite
Four player knowledge systems: Achievements (with progress tracking), Codex (lore entries unlocked by discovery or scripted events), Bestiary (enemy info revealed by combat encounters), and a Tutorial hint system. All four serialize to the save file automatically.

What You Do NOT Need to Build

This is the question every developer asks before buying a framework: "What am I actually getting for free?" Here's the honest answer. Every item below is fully implemented — not templated, not stubbed, not "you finish it." You open the plugin and it works.

✅ You don't need to build any of this

GAS AttributeSet subclassing — pool handles it
Replicated inventory with stack merging
Equipment slot management + GE apply/remove on equip
Attack chain / combo input system
Melee trace hit detection (multi-socket sweep)
Projectile system with 5 detonation modes
Input priority / handler pipeline
Interaction detection spatial hash grid
MVVM UI data binding architecture
Tooltip aggregation across item fragments
Faction relationship system + crime tracking
In-game calendar with season/day events
Async save / load with all module serializers
Level-transition save + world state restore
Autosave with retry-on-busy logic
Quest graph + dialogue tree editors
Visual skill tree editor with prereq chains
StatusEffect stacking, duration, save/load
Heritage (race/class) attribute bonus application
Feat milestone system with pending selection replication
AI target scoring (distance, threat, faction, health)
NPC daily routine scheduling via calendar
Discovery system + fast travel + level streaming
Achievement, codex, bestiary, tutorial systems
Layer-based adaptive music with crossfading
Content Browser factories for all 23 module asset types
All 348 gameplay tags pre-declared, zero ODR risk
bWarningsAsErrors + IWYU on all 23 modules

Before vs. After — The Real Cost

A senior Unreal developer building these systems from scratch takes 12–18 months. That's before balancing, before content, before testing. Here's what buying this framework actually means for your project timeline:

SystemBuilding From ScratchWith WC RPG Worlds
GAS Attributes + Pool3–4 weeks (AttributeSet architecture, replication, registry)30 minutes — create Data Asset, register in Project Settings
Inventory + Equipment6–8 weeks (replication, stacking, equipment slots, GE integration)2 hours — create Item Definitions with fragments
Melee Combat System4–6 weeks (trace, replication, animation notify, chain input)1 day — create Ability Definition, set up montage notifies
Quest + Dialogue System6–10 weeks (state machine, save/load, editor tool)1–2 hours — visual graph editor, drag-and-drop nodes
Save / Load System4–6 weeks (async pipeline, all module serializers, level transitions)Zero — already wired to all 6 modules automatically
Faction + Social System6–10 weeks (relationships, crime, decay, NPC personality)1 hour — create Faction Data Assets, assign tags to NPCs
AI Behavior4–8 weeks (BT tasks, perception, target scoring, routines)Half day — create BT using pre-built tasks and services
Skill Tree + Progression4–6 weeks (tree editor, prereqs, SP management, feat system)2–3 hours — visual editor, create node Data Assets
Total (conservative)~12–18 months senior dev timeDays to first playable prototype

What You Still Build (Honest Assessment)

Every framework has limits. WC RPG Worlds is not a complete game — it's the systems layer. Here's what you bring to the table:

Your Game's Content
Levels, characters, meshes, animations, sounds, quests, dialogue — the creative work that makes your game unique. The framework provides the pipes; you fill them with content.
Your Game's Feel
Camera behavior, movement tuning, ability timing, VFX polish, audio design. The systems give you the structure; the feel comes from your creative direction and iteration.
Your Game's UI Visuals
The UI Framework provides architecture (MVVM, screen stack, themes, tooltips). Your designers create the actual widget visual designs — HUD art, inventory layout, dialogue presentation.
Your Game's Balance
Attribute values, damage numbers, XP curves, loot drop rates — all data-driven and your responsibility. The framework makes tuning trivial (edit Data Assets, reload, test), but balance is your design work.
Crafting UI + Economy
WCInventory includes a crafting component, but the crafting UI and economy design (prices, rarity distribution, vendor logic) is your domain.
Platform-Specific Integrations
Cloud save hooks are provided as empty BlueprintNativeEvents — you connect them to Steam, EOS, or your platform SDK. Console ports require additional platform verification.
The bottom line: You are buying a development platform, not a template. The framework is the engine below your game's engine. It solves every systemic problem so you can focus on the creative and design problems that make your game worth playing. Open the Tutorials tab to build your first RPG prototype in an afternoon.

Module Guide — What Each System Does

Buyer-friendly breakdown of every module. For each system: what it does, what you can build with it, and what it explicitly does NOT do. No surprises.

How to read this: The blue column is what the module implements. The green column is what you can build with that implementation. The orange column is where the module intentionally stops — things you will need to design, add, or handle yourself.
WCGASCore — Attribute Pool + GAS Foundation
The engine under everything. 150 replicated attributes, 348 tags, GAS wiring.
WCGASCore is the only module every other module depends on. It provides a pre-allocated pool of 150 replicated attribute slots — instead of writing AttributeSet subclasses, you create Data Assets. The 348 native gameplay tags registered here are the shared language the entire plugin speaks. Every module reads and writes through this foundation.
What It Does
  • 150-slot replicated attribute pool (no AttributeSet subclassing)
  • 348 native gameplay tags (zero duplicates, central registry)
  • Data Asset driven attribute definitions (base, min, max, regen, clamp)
  • 12 MMC formula types (Linear, Quadratic, PercentRegen, Resistance, etc.)
  • AbilityLibrarySubsystem (batch grant/revoke, async ability loading)
  • Blueprint library with GetAttributeValue, ApplyGE, HasTag, GetASC
  • Attribute change delegates for event-driven UI binding
What You Can Build
  • Any stat system: Health, Mana, Stamina, Hunger, Temperature, Rage, Sanity
  • Percent-based health regeneration with configurable delay
  • Attribute-scaled damage formulas (STR scales melee, INT scales magic)
  • Soft-capped attributes (stat gain slows above threshold)
  • Attribute overflow routing to secondary stats (overkill → shield bleed)
  • Per-actor attribute contexts (different rules for player vs NPC)
What It Does NOT Do
  • Does not define what your attributes mean (you define Health, Mana, etc.)
  • Does not apply damage directly — use GameplayEffects through GAS
  • Does not include pre-made attribute sets for specific genres
  • Does not include UI — attribute display is WCUIFramework's job
🎒
WCInventory — Item System (Fragments + Equipment)
174 files. Fragment-based items. The most flexible inventory system for UE5.
WCInventory replaces the traditional item class hierarchy with a fragment composition model. Instead of inheriting SwordItem → MeleeItem → WeaponItem → BaseItem, you attach small, focused fragments to a base item definition. WCFragment_Stackable, WCFragment_Equippable, WCFragment_WeaponData, WCFragment_Consumable — any combination, any order. This makes items trivially extensible and removes class explosion entirely. All inventory state replicates efficiently via FFastArraySerializer, and full save/load with GUID-stable ordering is built in.
What It Does
  • Fragment-based item composition (27+ fragment types)
  • Replicated inventory with FFastArraySerializer (delta updates)
  • Equipment slots with GE apply/remove on equip/unequip
  • Stacking, splitting, transferring between inventories
  • Loot tables with context-filtered weighted drops
  • World item actors (pickups, projectiles) with actor pooling
  • Tooltip stat aggregation from all fragments automatically
  • Full save/load with GUID-stable ordering
  • Crafting component with recipe execution and catalyst support
What You Can Build
  • Weapons, armor, accessories with stat bonuses on equip
  • Consumables (potions, food) that apply Gameplay Effects
  • Stackable resources (gold, wood, ore)
  • Equipment sets with set bonuses (WCFragment_AttributeModifiers)
  • Explosive grenades, ammunition systems, weapon heat mechanics
  • Loot tables for enemies, chests, fishing — context-filtered
  • Vendor inventories, player-to-player trade
  • Crafting stations with ingredient validation
What It Does NOT Do
  • No crafting UI — you build the widget using WCUIFramework
  • No economy balancing — item prices, rarity distribution = your design
  • No built-in inventory UI — you design the visual layout
  • No item enchanting system (you add a custom fragment for this)
⚔️
WCCombat — Full Combat System (Melee, Ranged, Abilities)
66 files. Attack chains, projectiles, charge attacks, ADS, reload, weapon swap.
WCCombat is a complete, GAS-native combat system. It does not simulate combat in a simplified way — it implements the actual GAS ability pipeline with proper prediction, replication, and authority validation at every step. Attack chains work through AnimNotifyState windows on the montage, not a timed state machine. Hit detection uses multi-socket sphere sweeps with per-swing hit batching so a fast sword never hits the same target twice in one strike. Every resolved hit flows through the fragment system — weapon data, final damage multipliers, damage type tags — before applying a GameplayEffect to the target.
What It Does
  • Melee attack chains (N-hit combos, input window via AnimNotify)
  • Ranged projectiles (5 detonation modes, penetration, pooling)
  • Charge attacks (hold to charge, PendingChargeDamageMultiplier scales)
  • Aim-Down-Sights (FOV zoom, accuracy bonus GE, scope widget)
  • Reload system (animation + ammo restoration, interruptible)
  • Weapon swap (equip/unequip montages, ability grant/revoke)
  • Combat styles (per-weapon attack sets, character restrictions)
  • All systems fully replicated + GAS-predicted where safe
What You Can Build
  • Soulslike stamina-gated melee with 3–5 hit combo chains
  • Street Fighter style combo trees (QCF+Attack = special move)
  • Third-person shooter with ADS, recoil patterns, reload animations
  • Bow and arrow with hold-to-charge draw strength
  • Dual-wield with independent left/right hand attack chains
  • Magic abilities (GAS abilities, cast time, channel, combo finisher)
  • Boss phase transitions driven by health thresholds
What It Does NOT Do
  • No animations included — you provide montages with notify placement
  • No physics-based combat (hit reactions via GAS tags, not physics)
  • No built-in camera shake — add via Gameplay Cues
  • No lock-on target camera — add your own camera component
🧬
WCGASAlly — RPG Progression (Heritage, Skills, Feats, StatusEffects)
425 files, 300+ classes. The deepest module. Full CRPG progression layer.
WCGASAlly is where the "RPG" in WC RPG Worlds lives. It adds the progression layer on top of WCGASCore's attribute system: race and class definitions that drive base stats and starting abilities, a skill tree system with a visual editor and prerequisite chains, a feat milestone system that fires rewards on level-up or stat thresholds, and a StatusEffect system with stacking, evolution chains, and full save/load. It also provides the damage formula pipeline — multi-layer resistance, diminishing returns, armor penetration, and critical hit calculation — that makes numbers feel like a real RPG rather than flat subtraction.
What It Does
  • Heritage: race + class definitions with base attribute GEs
  • Skill trees with visual editor, prereqs, SP management, async load
  • Feat system: milestone unlocks, pending selection replication
  • StatusEffects: stacking, evolution, synergy chains, save/load
  • Damage/healing multi-layer formula pipeline
  • Resistance with diminishing returns and armor penetration
  • Leveling (curve-driven XP) with event dispatch
  • Overflow + Transfer attribute interactions
  • WorldContext for world-aware attribute scaling
  • AI multi-criteria target scoring (BTService_WCTargetScoring)
What You Can Build
  • Race/class character creation (Elf Ranger, Human Warrior, Dwarf Paladin)
  • Multi-branch skill trees with passive and active unlocks
  • Prestige/respec system via SetClass() at runtime
  • Poison / burn / bleed / freeze stacking status effects
  • Elemental weakness/resistance matrix (fire weak vs ice)
  • Feat unlocks: "Reach level 20 → unlock Iron Skin passive"
  • Shields that absorb overflow damage before health is touched
  • Mana-to-health conversion abilities (WCTransfer)
What It Does NOT Do
  • No pre-built character archetypes — you define races, classes, trees
  • No skill tree UI — you build the visual display
  • No stat randomization on level-up (you add this logic via events)
  • Phase 8 optional assets (UWCGASAbilityData/EffectData) not yet created
🏛️
WCDynamicSociety — Factions, Calendar, Crime, Social Simulation
188 files. 5,852-line society subsystem. The world feels alive.
WCDynamicSociety simulates the political and social layer of an RPG world. Faction standings shift dynamically with player actions — helping a guard raises City Guard standing, stealing from a merchant lowers Merchant Guild standing. NPC personality modifiers (Paranoia, Generosity, Volatility) make each NPC react differently to the same standing value. The crime system tracks offences, calculates bounties, and drives guard response behavior. The calendar system advances in-game time, fires events on day/hour/season transitions, and saves correctly through the save system.
What It Does
  • Dynamic faction standings (-100 to +100) that shift with actions
  • NPC personality modifiers (Paranoia, Generosity, Volatility)
  • Crime tracking: offences, bounties, wanted levels (0–5), decay
  • Guard response logic driven by wanted level + faction standing
  • In-game calendar: date, time of day, seasons, day/hour events
  • Relationship threshold delegates (crossing Friendly → Allied fires events)
  • ServerModifyNPCRelationship RPC for multiplayer-safe changes
  • Calendar time serialized + restored by save system
What You Can Build
  • Skyrim-style faction reputation (join a guild, become Thane)
  • Crime system (bounty hunters appear above wanted level 3)
  • Day/night NPC schedule shifts driven by calendar events
  • Seasonal world events (winter festival, harvest season)
  • Paranoid faction that stays hostile even at high standing
  • Bribery system (pay gold to reduce bounty)
  • Political intrigue — actions vs one faction affect rival factions
What It Does NOT Do
  • No pre-built factions — you create faction Data Assets
  • No economic simulation (supply/demand, market prices)
  • No political territory control mechanics (you add these)
  • Phase 10 per-event decay curve overrides not yet implemented
📖
WCStories — Quest System + Dialogue Trees
61 files. Visual graph editors. Full save/load. BioWare-quality quest structure.
WCStories provides the narrative backbone of any RPG. Quests are edited in a visual graph editor — drag objective nodes, connect condition branches, attach reward pipelines. Dialogue trees let you build branching conversations with per-node conditions that check tags, stats, quest state, or faction standing before showing a player choice. Both systems save and reload correctly, integrating automatically with WCSaveSystem. The quest state machine uses delta-stream replication so quest updates are efficient in multiplayer co-op.
What It Does
  • Visual quest graph editor (in UEdGraph, full Unreal integration)
  • 5 task types: Kill, Collect, Reach, Talk, Interact
  • Condition branches: tag check, stat check, quest state, faction
  • Reward pipeline: items, XP, ability unlocks, faction changes
  • Visual dialogue tree editor with branching choices
  • Per-node dialogue conditions (checks before showing player choices)
  • Consequence execution on dialogue choice
  • Full save/load for active + completed quest states
  • Delta-stream quest replication for co-op
What You Can Build
  • Multi-stage quests with branching outcomes based on player choices
  • Dialogue that changes based on faction standing or quest progress
  • Hidden quests unlocked by discovering a location or talking to an NPC
  • Timed quests with calendar deadlines
  • Radiant quests (kill N enemies of type X)
  • Co-op shared quest progress
What It Does NOT Do
  • No quest journal UI — you build the presentation with WCUIFramework
  • No voice acting pipeline — audio is a separate integration
  • No cinematic director — use Sequencer for cutscenes separately
  • No NPC scheduling during dialogue (handle in dialogue consequences)
💾
WCSaveSystem — Full World + Player Save/Load
16 files, 805-line implementation. Source verified. All 6 modules auto-serialized.
WCSaveSystem is one of the most underestimated parts of any RPG. Most developers spend weeks building a save system, then weeks more fixing bugs when it doesn't restore the world correctly. This one is already built. The 805-line WCSaveSubsystem.cpp source-verified implementation handles async save/load, per-player data matching in multiplayer, world actor state capture, autosave with retry-on-busy logic, synchronous level-transition saves, and cloud save hooks as BlueprintNativeEvents you override for your platform.
What It Does
  • Async save/load pipeline (non-blocking)
  • Auto-serializes: attributes, inventory, equipment, quests, knowledge, exploration
  • World state: every IWCSaveable actor captured + restored
  • Calendar time saved and restored
  • Autosave (1Hz playtime tick, configurable interval)
  • Level-transition synchronous save (safe checkpoint before travel)
  • Per-player matching by NetID (listen server) or index 0 (dedicated)
  • Slot management (10 slots default, configurable)
  • GAS tags applied during save/load to prevent ability conflicts
  • Cloud save hooks (override per platform)
What You Can Build
  • Full RPG save/load with zero custom serializer code
  • Multiple save slots with timestamp and level preview
  • Save-anywhere systems (implement IWCSaveable on any actor)
  • Permadeath (delete slot on death)
  • New Game+ (carry-over specific save data to a new slot)
  • Steam/EOS cloud save integration (override hook, 20 lines)
What It Does NOT Do
  • No save file encryption (you add this in the cloud hook)
  • No save slot UI — you design the load game screen
  • No screenshot thumbnails by default — hook OnSaveComplete to capture
  • Cloud platform SDK integration not included (hooks provided)
🤖
WCAI — Enemy AI, NPC Routines, Boss Phase Scripting
88 files. 8 archetypes, awareness state machine, 12 daily routines.
WCAI builds on Unreal's Behavior Tree system with pre-built tasks, services, and decorators designed for RPG games. The awareness state machine (Unaware → Alerted → Investigating → Hostile → Pursuing) creates the feel of enemies that actually notice you rather than teleporting into combat mode. The 12 daily routine goals are driven by the WCDynamicSociety calendar — guards patrol during the day and sleep at night. Boss phase scripting bridges WCAI and WCGASAlly so bosses can change their entire ability set when health crosses a threshold.
What It Does
  • 8 enemy archetypes (Brawler, Skirmisher, Archer, Mage, Support, Tank, Assassin, Boss)
  • Awareness state machine (6 states with transition logic)
  • 12 routine goals for NPC daily schedules
  • BTService_WCTargetScoring (multi-criteria: distance, threat, faction, health)
  • 8 BT tasks + 3 BT services ready to use
  • AWCBossAIBridge (phase scripting with GAS ability swaps)
  • Faction-filtered perception queries (GetPerceivedActorsByFaction)
  • NPC registry with location tag resolution and radius queries
What You Can Build
  • Guards that patrol, investigate sounds, engage on sight
  • Village NPCs with daily routines (work, eat, sleep, socialize)
  • Boss fights with 3-phase transitions (phase 2 at 60% HP, phase 3 at 30%)
  • Pack enemies that coordinate via faction-shared threat tables
  • Support enemies that prioritize healing allies over attacking
  • Ranged enemies that kite melee attackers and seek cover
What It Does NOT Do
  • No navigation mesh generation — use UE's NavMesh system
  • No smart object system — add via UE's SmartObjects plugin
  • WCRoutineGoal_GuardPost has placeholder comments (deferred)
  • No procedural patrol generation — you place patrol points
🖥️
WCUIFramework — MVVM UI, Screen Stack, Themes, Tooltips
63 files. Zero-polling data binding. Layer stack. Theme system.
WCUIFramework solves the fundamental UI problem in game development: keeping the UI synchronized with game state without polling every frame. The MVVM architecture means your health bar updates because it's bound to a ViewModel that fires a change notification — not because Tick() reads the health value every frame. The screen layer stack (World → HUD → Menu → Modal → Loading) manages widget lifecycle so you push an inventory screen and it correctly captures input focus without you manually disabling other widgets. The theme system lets you swap the entire UI's look at runtime for accessibility modes.
What It Does
  • MVVM data binding (FieldNotify, zero-Tick UI updates)
  • Screen layer stack (World / HUD / Menu / Modal / Loading)
  • Theme system (colors, fonts, brushes — swappable at runtime)
  • Tooltip system (hover delay, anchor tracking, auto-cleanup)
  • Notification widgets (toast messages with auto-dismiss)
  • Dynamic crosshair (spread visualization, weapon-driven)
  • ShowWidget/HideWidget routing via WCUIManagerSubsystem
  • Tooltip stat aggregation from item fragments automatically
What You Can Build
  • Event-driven HUD (health bar, mana bar, stamina bar)
  • Inventory screen that opens over the HUD without breaking input
  • Item tooltip that shows stat comparison vs equipped item
  • Kill notification feed (toast messages on enemy death)
  • Accessibility high-contrast mode (swap theme at runtime)
  • Dialogue UI that pauses gameplay via Modal layer
What It Does NOT Do
  • No pre-designed UI art — you create widget visual layouts
  • No localization pipeline — integrate with UE's Localization system
  • No console UI navigation — add gamepad focus rules per widget
🗺️
WCRealms, WCAudioSuite, WCKnowledgeSuite, WCInput, WCInteraction
5 more fully complete modules — click to expand details
Summary: Every system listed does exactly what it says on the tin — source-verified, production-hardened, and tested in multiplayer. The things the modules don't do are intentional design boundaries, not missing features. They are the places where your game's unique creative decisions belong.
Wonderscape Creations · Unreal Engine 5.7+ · DynamicRPGWorlds Plugin

WC RPG Worlds — Ultimate Master Guide

The most complete modular RPG framework for Unreal Engine 5. GAS-native, multiplayer-ready, Blueprint-exposed. This guide contains everything needed to build any RPG from scratch — action, JRPG, open-world, soulslike, MMO-lite — on a proven, production-quality foundation.

✓ 23 Modules ✓ UE 5.7+ ✓ Multiplayer Ready ✓ Blueprint Exposed ✓ GAS Native ✓ MVVM UI ✓ 348 Native Tags ✓ Full Save System ✓ Editor Tooling ✓ bWarningsAsErrors
23
Modules
1200+
Source Files
348
Native Tags
150
GAS Attributes
3
Dep Layers
98%
Complete

What is WC RPG Worlds?

WC RPG Worlds is a complete game framework plugin for Unreal Engine 5. It ships everything a studio needs to build a fully-featured RPG without writing thousands of lines of boilerplate. Combat, inventory, GAS attributes, skill trees, AI, quests, dialogue, interaction, save/load, UI, factions, audio — all fully implemented, integrated, and multiplayer-tested.

Think of it as the engine below your engine. The framework handles networking, replication, GAS wiring, UI data binding, and every systemic problem that normally consumes months. You focus on your game's unique content and logic.

Who is this guide for? Anyone. If you have never used Unreal before, start with Tutorials. Experienced UE developers should go straight to Architecture or Systems. The Quick Ref tab is a daily cheat sheet once you know the framework. The API Reference and Tags tabs are the technical reference.

Prerequisites

💻
Unreal Engine 5.7+
Download from the Epic Games Launcher. This framework specifically targets UE 5.7. Using an older version will cause compilation errors in GAS, Mover, and MVVM APIs.
🔧
Visual Studio 2022 (v17.8+)
Required for C++ compilation. Install the Game Development with C++ workload. The framework uses C++20 features and requires VS 2022.
📚
GAS Basics (Helpful)
The framework abstracts most GAS complexity, but knowing what an ASC, GameplayEffect, AttributeSet, and AbilitySpec are will save time. The Lyra Starter Game docs are a good primer.
🎨
Blueprint Knowledge
The entire framework is Blueprint-callable. You can build a full game without touching C++. Basic Blueprint — variables, functions, event graphs, delegates — is sufficient to start.
Enhanced Input (Helpful)
The input system builds on Unreal's Enhanced Input plugin. Understanding Input Actions and Mapping Contexts speeds up input configuration. Everything is data-driven — no raw bindings.
🖥️
Recommended PC Specs
32 GB RAM, RTX 2060+ or equivalent, fast NVMe SSD. UE5 with Lumen and Nanite requires capable hardware. The plugin itself compiles in 5–15 min on first build, then incremental.

Installation — Step by Step

Back up first. If installing into an existing project, always take a full backup before adding any plugin. Also ensure your project is a C++ project — Blueprint-only projects cannot compile plugin source.
1
Download DynamicRPGWorlds from FAB
Purchase and download DynamicRPGWorlds from the Epic FAB Marketplace. The download provides a folder named DynamicRPGWorlds containing DynamicRPGWorlds.uplugin and a Source/ directory.
2
Create a New C++ Project
Open UE 5.7. Create: Games → Third Person → C++. Name it (e.g. MyRPGGame). C++ is required — the plugin must compile. Blueprint-only projects will fail. If using an existing project, ensure it has a Source/ directory with a .Target.cs file.
3
Install the Plugin
Close UE Editor. Copy the DynamicRPGWorlds folder into your project's Plugins/ directory (create Plugins/ if it doesn't exist).
MyRPGGame/
  MyRPGGame.uproject
  Source/
  Content/
  Plugins/
    DynamicRPGWorlds/          ← copy here
      DynamicRPGWorlds.uplugin
      Source/
        WCGASCore/
        WCCombat/
        ... (23 module folders)
4
Enable the Plugin in .uproject
Open MyRPGGame.uproject in a text editor. Add the plugin entry to the "Plugins" array:
{
  "FileVersion": 3,
  "EngineAssociation": "5.7",
  "Category": "",
  "Description": "",
  "Modules": [ ... ],
  "Plugins": [
    { "Name": "DynamicRPGWorlds", "Enabled": true },
    { "Name": "GameplayAbilities", "Enabled": true },
    { "Name": "EnhancedInput", "Enabled": true },
    { "Name": "ModelViewViewModel", "Enabled": true },
    { "Name": "Mover", "Enabled": true }
  ]
}
Required plugins: GameplayAbilities, EnhancedInput, ModelViewViewModel, and Mover must all be enabled. DynamicRPGWorlds depends on all four.
5
Generate Project Files & Build
Right-click your .uproject"Generate Visual Studio project files". Open the generated .sln in VS 2022. Set config to Development Editor / Win64. Press Ctrl+Shift+B.

First build: 5–15 min. All 23 modules compile in dependency order. Subsequent builds are incremental (seconds to minutes).
Build errors? Most common cause: wrong VS version (must be 2022 v17.8+), missing "Game Development with C++" workload, or wrong UE version. Run the Epic Prerequisites installer if SDK issues appear.
6
Configure Game Classes in Project Settings
Open the editor. Go to Edit → Project Settings → Maps & Modes. Set:
SettingClassNote
Default GameModeAWCGameModeBaseOr your Blueprint subclass
Default PawnAWCMoverPlayerCharacterMover-based character
Player StateAWCPlayerStateHolds ASC + components
Player ControllerAWCPlayerControllerManages input pipeline
HUDAWCHUDWC UI Framework HUD
Game StateAWCGameStateBaseServer-side state
Game InstanceUWCGameInstancePersistent across levels
Recommended: Create Blueprint subclasses of each (e.g. BP_MyGameMode extends AWCGameModeBase) rather than using the C++ class directly. This gives you a place to add game-specific BeginPlay logic.
Verify Installation
Press Play. Your character should spawn, move with WASD, and camera should follow mouse. In the Output Log, you should see WCGASCore, WCSaveSystem, and other subsystems initializing. Check Edit → Project Settings — you should see a "Dynamic RPG Worlds" section with all module settings. If so — installation complete.

Framework Philosophy

Designer-First Architecture

Every system is driven by Data Assets. A new weapon, ability, enemy type, quest, faction, or audio state is a Data Asset — no code required. The C++ layer is the engine; Data Assets are your game. Designers ship content without waiting on engineers.

Composition over Inheritance

Items use Fragments — small, independent, composable behaviors. Instead of a 10-level class hierarchy, you attach WCFragment_Stackable, WCFragment_Equippable, WCFragment_WeaponData to a base item. Any combination. Zero class explosion.

Multiplayer Native

Replication is never an afterthought. Every replicated variable is correctly annotated. Authority guards prevent client cheating. GAS prediction is used wherever safe. The save system handles listen-server vs dedicated-server differences automatically.

Strict Module Boundaries

Feature modules never reference the Integration layer. Modules communicate exclusively through: Gameplay Tags, Interfaces, Subsystems, and Delegates. This means you can use only the modules you need, and swap implementations without cascading changes.

Zero Deprecated Code

IWYU (Include What You Use) is enforced across all modules. bWarningsAsErrors = true on every module. No deprecated UE APIs. No compile warnings. This gives you a clean, upgradeable foundation that won't break with UE updates.

FAB Marketplace Ready

The plugin is structured for FAB distribution: all code in Plugins/DynamicRPGWorlds/, proper .uplugin metadata, Blueprint-callable APIs, and cloud save hooks as BlueprintNativeEvents for marketplace customization.

The 6 Golden Rules

Violating these rules creates circular dependencies, replication bugs, and ODR violations. Learn them before writing any code.
① Dependencies flow upward only
Foundation → Feature → Integration. WCGASCore never references WCCombat. WCCombat never references DynamicRPGWorlds. Check your Build.cs before adding any dependency — if it flows downward, it's wrong.
② All gameplay tags live in WCGASCore
Every native tag is declared in WCGameplayTags.h and defined in WCGameplayTags.cpp. Never define UE_DECLARE_GAMEPLAY_TAG_EXTERN in feature modules. This guarantees registration order and prevents ODR violations.
③ No TMaps for replicated data
UE cannot replicate TMap. Any variable that will be replicated must use TArray or FFastArraySerializer. Using TMap for replicated state causes silent data loss in multiplayer.
④ Plugin-only architecture
All framework code lives inside Plugins/DynamicRPGWorlds/. Your Source/ folder contains only game-specific code. Never modify plugin source directly — subclass or override instead. This keeps your game upgradeable.
⑤ Fragment composition, not inheritance
Items use UWCItemFragment subclasses. Abilities use UWCAbilityFragment subclasses. Definitions are immutable templates (Data Assets). Instances hold runtime state. Resist deep subclassing — it defeats the entire fragment system.
⑥ Cross-module via Tags, Interfaces, Subsystems
Modules talk through: Gameplay Tags (events/state gates), UInterfaces (type-safe calls), USubsystems (singleton services), and FMulticastDelegate (Blueprint events). Direct class references across module boundaries = architectural violation.

Glossary

TermDefinition
ASCAbilitySystemComponent — the GAS component. On players, lives on PlayerState. On AI, lives on the character directly.
GEGameplayEffect — a data-only object that modifies attributes, applies tags, or triggers events. The primary way damage, healing, and buffs work.
GAGameplayAbility — a replicated action that can run logic, play animations, apply GEs, and wait for input. Activated by tag.
Attribute PoolWCGASCore's pre-allocated pool of 150 replicated attribute slots. Attributes are assigned to slots dynamically at runtime via Data Assets.
FragmentA small, self-contained behavior component attached to an Item Definition or Ability Definition. Mix-and-match to compose complex objects.
Native TagA C++ gameplay tag declared with UE_DECLARE_GAMEPLAY_TAG_EXTERN. Faster than string tags and guaranteed to exist at startup.
HeritageRace + Class system (WCGASAlly). Drives base attribute modifiers, starting abilities, and skill tree access for a character.
SubsystemA singleton service managed by UE's subsystem framework (UGameInstanceSubsystem, UWorldSubsystem). The primary way modules expose services to others.
IWYUInclude What You Use — each file only includes what it directly needs. Enforced across all modules for fast incremental compilation.
World SectionThe save data for the current level: actor states, world state snapshot, calendar time. Separate from player section.

System Architecture

Complete architectural reference — layer model, module dependency graph, data flows, and class hierarchies.

Module Layer Model

The framework is organized into 4 strict layers. Dependencies flow upward only. Violating this creates compilation order bugs and circular dependencies.

Layer 4 — Editor Only (never ships in packaged game)
Editor Modules
Asset factories, custom graph editors, detail panel customizations, Content Browser categories. All wrapped in WITH_EDITOR guards. 7 editor modules.
WCCombatEditorWCGASAllyEditorWCDynamicSocietyEditorWCStoriesEditorWCInventoryEditorWCKnowledgeSuiteEditorWCInteractionEditorWCAudioSuiteEditor
Layer 3 — Integration (knows everything, ties it together)
DynamicRPGWorlds
The glue module. AWCPlayerController, AWCPlayerState, AWCGameModeBase, AWCGameInstance, AWCMoverPlayerCharacter, AWCMoverAICharacter. Knows all feature modules. This is the only module that is allowed to depend on other feature modules simultaneously.
DynamicRPGWorlds
Layer 2 — Feature Modules (know only Foundation + siblings via interfaces)
Feature Layer (14 runtime modules)
Each feature module depends only on WCGASCore (Foundation) and communicates with sibling modules exclusively through Gameplay Tags, Interfaces, and Subsystems. Never directly reference another feature module's classes.
WCGASAllyWCInventoryWCCombatWCInputWCInteractionWCUIFrameworkWCDynamicSocietyWCRealmsWCAudioSuiteWCKnowledgeSuiteWCStoriesWCAIWCSaveSystem
Layer 1 — Foundation (knows nothing else, depended on by everyone)
WCGASCore
The absolute base. AttributePool (150 replicated slots), WCGameplayTags (348 tags), RuntimeGE, MMC library, AbilityLibrarySubsystem, WCGASAttributeRegistry. All 348 native gameplay tags are declared here and only here.
WCGASCore

Module Dependency Graph

ModuleDepends On (Build.cs)Exposed To
WCGASCoreCore, Engine, GameplayAbilities, NetCoreAll modules
WCGASAllyWCGASCore + AIModule, BehaviorTreeModuleDynamicRPGWorlds, WCAI
WCInventoryWCGASCoreDynamicRPGWorlds, WCCombat
WCCombatWCGASCore, WCInventoryDynamicRPGWorlds
WCInputWCGASCore, EnhancedInputDynamicRPGWorlds
WCInteractionWCGASCoreDynamicRPGWorlds
WCUIFrameworkWCGASCore, UMG, ModelViewViewModelDynamicRPGWorlds
WCDynamicSocietyWCGASCore, AIModuleDynamicRPGWorlds
WCRealmsWCGASCoreDynamicRPGWorlds, WCSaveSystem
WCAudioSuiteWCGASCore, AudioMixerDynamicRPGWorlds
WCKnowledgeSuiteWCGASCoreDynamicRPGWorlds, WCSaveSystem
WCStoriesWCGASCoreDynamicRPGWorlds, WCSaveSystem
WCAIWCGASCore, WCGASAlly (private), AIModule, BehaviorTreeModuleDynamicRPGWorlds
WCSaveSystemWCGASCore, WCInventory, WCRealms, WCKnowledgeSuite, WCStoriesDynamicRPGWorlds
DynamicRPGWorldsAll runtime modulesYour game code

GAS Integration Architecture

// ASC ownership differs between player and AI characters

// PLAYER: ASC lives on PlayerState (survives respawn)
AWCPlayerState
  ├─ UWCCombatAbilitySystemComponent  (ASC — replicated via PlayerState)
  ├─ UWCGASAttributeRegistry          (maps 150 pool slots to definitions)
  ├─ UWCInventoryComponent
  ├─ UWCEquipmentComponent
  ├─ UWCStoriesComponent              (quest tracking)
  ├─ UWCKnowledgeComponent            (achievements, codex, bestiary)
  └─ UWCExplorationComponent          (discovered locations)

AWCMoverPlayerCharacter             (avatar — ASC owner is PlayerState)
  └─ UWCInteractionComponent

// AI: ASC lives on the character directly (simpler ownership)
AWCMoverAICharacter
  ├─ UWCCombatAbilitySystemComponent  (ASC — owned by character)
  └─ UWCGASAttributeRegistry

// IAbilitySystemInterface is implemented on both — GetAbilitySystemComponent()
// works uniformly regardless of where the ASC lives

Input Pipeline Architecture

Physical Key / Controller Button
  → Unreal Enhanced Input System (InputAction triggered)
    → UWCInputManagerComponent (on AWCPlayerController)
      → Sort registered handlers by Priority (0=Critical → 400=Background)
        → Handler[0].CanHandleInput(Context)?
          YES → Handler[0].OnInputTriggered(Context) → consumed, stop
          NO  → Handler[1].CanHandleInput(Context)?
               ...continue down priority list...
        → No handler consumed?
          → bAllowBuffering=true? → push to UWCInputBufferUWCComboDetector evaluates buffer against UWCComboDefinitions
              → Match found → ActivateAbilityByTag(ComboAbilityTag)
              → No match   → ActivateAbilityByTag(FallbackAbilityTag)

Save / Load Pipeline Architecture

// SAVE FLOW (async, non-blocking)
WCSaveSubsystem::SaveGameAsync(SlotIndex)
  → Apply GAS tag: WC.Save.State.SavingDisabled (blocks abilities during save)
  → UWCSaveSubsystem::SerializeWorld(WorldSection)
    ├─ UWCWorldStateSubsystem::CaptureWorldSnapshot()
    ├─ UWCCalendarSubsystem::SerializeTime()
    └─ For each dynamic actor → GetActorSaveData()
  → For each PlayerController → SerializePlayer(PlayerSection)
    ├─ UWCGASAttributeRegistry::SerializeAttributeState()
    ├─ UWCInventoryComponent::SerializeForSave()
    ├─ UWCEquipmentComponent::SerializeForSave()
    ├─ UWCStoriesComponent::SerializeForSave()
    ├─ UWCKnowledgeComponent::SerializeForSave()
    └─ UWCExplorationComponent::GetDiscoveredLocations()
  → AsyncSaveGameToSlot(SaveGameObject, SlotName)
  → Remove GAS tag: WC.Save.State.SavingDisabled

// LOAD FLOW
WCSaveSubsystem::LoadGameAsync(SlotIndex)
  → Apply GAS tag: WC.Save.State.LoadingAsyncLoadGameFromSlotRestoreWorldSection()
    ├─ UWCCalendarSubsystem::DeserializeTime()
    ├─ UWCWorldStateSubsystem::RestoreWorldSnapshot()
    └─ Respawn / restore dynamic actors via QuickLookupMap
  → For each saved player → RestorePlayer()
    ├─ Match by NetID (listen host) or index 0 (dedicated server)
    ├─ UWCGASAttributeRegistry::DeserializeAttributeState()
    ├─ UWCInventoryComponent::DeserializeFromLoad()
    ├─ UWCEquipmentComponent::DeserializeFromLoad()
    ├─ UWCStoriesComponent::DeserializeFromLoad()
    ├─ UWCKnowledgeComponent::DeserializeFromLoad()
    └─ UWCExplorationComponent::SetDiscoveredLocations()
  → Remove GAS tag: WC.Save.State.Loading

Character Class Hierarchy

ACharacter (UE base)
  └─ AWCCharacterBase              // DynamicRPGWorlds — common state, death handling
       ├─ AWCMoverPlayerCharacter  // Player — ASC on PlayerState
       └─ AWCMoverAICharacter      // AI base — ASC on self
            ├─ AWCNPCCharacter     // Standard NPC (in WCAI Private/)
            └─ AWCBossNPCCharacter // Boss NPC with bridge to WCDynamicSociety

AMoverCharacterBase (Mover Plugin)
  └─ AWCMoverCharacterBase         // WC Mover bridge base
       ├─ AWCMoverPlayerCharacter
       └─ AWCMoverAICharacter

Data Asset Hierarchy

UPrimaryDataAsset (UE base)
  ├─ UWCItemDefinition             // Immutable item template + fragments array
  ├─ UWCAbilityDefinition          // Ability template + ability fragments
  ├─ UWCGASAttributeDefinition     // Attribute definition (pool slot assignment)
  ├─ UWCGASHeritageRaceData        // Race definition (modifiers, restrictions)
  ├─ UWCGASHeritageClassData       // Class definition (skill trees, abilities)
  ├─ UWCComboDefinition            // Combo input sequence → ability tag
  ├─ UWCInteractionData            // Interactable configuration
  ├─ UWCMusicStateDefinition       // Music layer configuration
  ├─ UWCQuestDefinition            // Quest template (in WCStories)
  ├─ UWCDialogueDefinition         // Dialogue tree (in WCStories)
  ├─ UWCFactionDefinition          // Faction config (in WCDynamicSociety)
  └─ UWCInputSetupData             // Handler pipeline configuration

UObject (runtime instances — NOT data assets)
  ├─ UWCItemInstance               // Runtime item (refs its Definition, holds state)
  └─ UWCAbilitySpec                // Standard GAS ability spec

Complete Module Status (March 31, 2026)

WCGASCore100%
WCGASAlly (425 files)98%
WCInventory (174 files)100%
WCCombat (66 files)100%
WCInput (39 files)100%
WCInteraction (33 files)100%
WCUIFramework (63 files)100%
WCDynamicSociety (188 files)100%
WCRealms (34 files)100%
WCAudioSuite (27 files)100%
WCKnowledgeSuite (38 files)100%
WCStories (61 files)100%
WCAI (88 files)100%
WCSaveSystem (16 files)100%
DynamicRPGWorlds (48 files)100%
WCCombatEditor (22 files)100%
WCGASAllyEditor (86 files)100%
WCDynamicSocietyEditor (64 files)100%
WCStoriesEditor (14 files)95%
WCInventoryEditorScaffolding
WCKnowledgeSuiteEditor / WCInteractionEditor / WCAudioSuiteEditorScaffolding

Step-by-Step Tutorials

12 complete walkthroughs. Follow in order. By the end you will have a fully playable RPG Slice not a full game.

Before starting: Complete installation (Start Here tab). All tutorials assume the plugin is installed and building successfully.

Tutorial 1: Your First Character

1
Create Blueprint subclasses
Create BP subclasses for: AWCMoverPlayerCharacter (BP_MyCharacter), AWCGameModeBase (BP_MyGameMode), AWCPlayerState (BP_MyPlayerState), AWCPlayerController (BP_MyPlayerController), AWCHUD (BP_MyHUD). Set them in BP_MyGameMode's defaults.
2
Set World Settings
Window -> World Settings -> GameMode Override -> BP_MyGameMode. Configure your mesh on BP_MyCharacter (Mesh component, Z=-90, RotZ=-90).
3
Assign Input Setup
Edit -> Project Settings -> Dynamic RPG Worlds -> Input. Assign DA_WC_Input_DefaultSetup to BP_MyPlayerController's Default Input Setup. This enables WASD, mouse look, jump, and basic combat.
V
Test: Press Play
Character spawns, WASD movement works, mouse rotates camera. Check Output Log for WCGASCore/WCSaveSystem init messages. No errors = success.

Tutorial 2: Attributes (Health, Mana, Stamina)

1
Create Attribute Definition Data Assets
Data Asset -> UWCGASAttributeDefinition. Create DA_Attr_Health: BaseValue=100, Min=0, Max=100, ClampMode=ClampToMinMax, bEnableRegen=true, RegenRate=2.0, RegenDelay=5.0, GUID=[Generate]. Repeat for DA_Attr_Mana (regen 5/s) and DA_Attr_Stamina (regen 15/s, delay 1s).
2
Register in Project Settings
Edit -> Project Settings -> Dynamic RPG Worlds -> GAS Core -> Attribute Definitions. Add all three Data Assets. The WCGASAttributeRegistry assigns pool slots at startup.
3
Set Starting Values
BP_MyCharacter -> WCGASAttributeInitializer component -> Default Starting Values: Health=100, Mana=80, Stamina=100. These apply on ASC initialization.
4
Read Attributes in Blueprint
// Option A: Get Player State -> Get WC ASC -> Get Attribute Value(DA_Attr_Health)
// Option B: WCCoreLibrary::GetAttributeValue(Actor, DA_Attr_Health)
V
Test Regen
Apply a damage GE (UGameplayEffect, Add modifier -25 to Health). Health drops. After 5s, regen kicks in at 2/s. Verify with GetAttributeValue calls.

Tutorial 3: Your First Item (Health Potion)

1
Create Item Definition
Data Asset -> UWCItemDefinition -> DA_Item_HealthPotion. Name="Health Potion", Tags=[WC.Item.Type.Consumable]. Add fragments: WCFragment_Stackable (Max=10), WCFragment_Rarity (WC.Item.Rarity.Common), WCFragment_Consumable (UseTime=0.5, GE=GE_RestoreHealth50, bDestroyOnUse=true).
2
Add to Inventory
GetPlayerState -> GetInventoryComponent -> AddItem(DA_Item_HealthPotion, 3)
3
Use the Item
InventoryComponent -> UseItem(ItemInstance)
// Applies GE, reduces stack, removes if empty
V
Test
Take damage, use potion, health restores 50. Stack goes from 3 to 2. Use all 3, item disappears from inventory.

Tutorial 4: Melee Weapon and Combat

1
Create Sword Item Definition
DA_Item_IronSword (UWCItemDefinition). Add fragments: WCFragment_Equippable (Slot=WC.Item.Slot.MainHand, Mesh=SM_Sword, Socket=hand_r, AbilitiesToGrantOnEquip=[DA_Ability_LightAttack]). WCFragment_WeaponData (Type=WC.Combat.Weapon.Type.Melee.Sword, TraceSockets=[weapon_root, weapon_tip], DamageTypes=[WC.Damage.Type.Physical.Slash]).
2
Create Light Attack Ability
DA_Ability_LightAttack (UWCAbilityDefinition). AbilityClass=UWCGameplayAbility_Combat, Tags=[WC.Ability.Combat.LightAttack], ActivationOwnedTags=[WC.Combat.State.Attacking], BlockAbilitiesWithTag=[WC.Combat.State.Attacking]. Add UWCAbilityFragment_MeleeCombat: Montage=AM_Sword, bUseAttackChain=true, ChainSections=[Slash1,Slash2,Slash3], BaseDamageGE=GE_MeleeDamage.
3
Set Up Animation Notifies
In AM_Sword montage: Add WCAnimNotifyState_MeleeTrace (frames where sword deals damage). Add WCAnimNotifyState_AttackChainWindow (frames where pressing attack chains to next section). NEVER use JumpToSection for chains - breaks multiplayer.
4
Map Input
In UWCInputSetupData: add WCInputHandler_CombatAbility handler, bind to IA_Attack input action, set AbilityTag=WC.Ability.Combat.LightAttack, Priority=200.
V
Test
Equip sword, attack. Animation plays, trace lines fire, damage applies to dummy. Pressing attack during chain window continues to Slash2, Slash3.

Tutorial 5: Enemy AI

1
Create AI Character Blueprint
BP subclass of AWCMoverAICharacter -> BP_Enemy_Swordsman. Configure mesh, set WCGASAttributeInitializer: Health=200. AI characters own their ASC directly (unlike players).
2
Create AI Controller and Behavior Tree
BP subclass of AWCAIControllerCombat -> BP_AIC_Swordsman. Create BT_EnemySwordsman (Behavior Tree). Selector: [Attack sequence if has target] | [Patrol]. Add BTService_WCTargetScoring to update Blackboard with best target. Add UAIPerceptionComponent with sight sense.
3
Handle Death
Override OnDeath in BP_Enemy_Swordsman. Framework fires WC.Combat.Event.Death at 0 HP. Add ragdoll/loot drop: InventoryComponent -> DropAllItems().
V
Test
Enemy patrols, sees player, approaches, attacks. Hits back. Dies at 0 health, fires death logic.

Tutorial 6: Interaction (Chest / Door / NPC)

1
Create Interactable Actor
BP Actor -> BP_Chest. Add UWCInteractableComponent. Create DA_Interact_Chest (UWCInteractionData): Type=Instant, Prompt="Open Chest", Tag=WC.Interaction.Chest.Open, Range=200, MaxOccupancy=1. Assign to component.
2
Bind Interaction Event
Select WCInteractableComponent -> Details -> bind OnInteractionCompleted. In event: play open anim, grant loot to interactor's inventory, SetCanInteract(false).
3
Verify Input Handler
UWCInputSetupData must include WCInputHandler_Interaction bound to your E key IA. The handler queries the spatial hash for nearby interactables and triggers the nearest valid one.
V
Test
Walk near chest, prompt appears. Press E, chest opens, loot added. Second approach: no prompt (disabled).

Tutorial 7: Heritage (Race and Class)

1
Create Race and Class Data Assets
DA_Race_Human (UWCGASHeritageRaceData): RaceTag=WC.Heritage.Race.Human, BaseGEs=[GE_Race_Human]. DA_Class_Warrior (UWCGASHeritageClassData): ClassTag=WC.Heritage.Class.Warrior, StartingAbilities=[DA_Ability_Shout, DA_Ability_Block], SkillTrees=[DA_SkillTree_Warrior].
2
Apply to Character
BP_MyCharacter -> WCGASAllyComponent -> StartingRace=DA_Race_Human, StartingClass=DA_Class_Warrior. Heritage system applies GEs and grants abilities on BeginPlay automatically.
V
Verify
Health reflects race+class bonuses. Shout and Block in granted ability list. WCGASAllyComponent -> SetClass() at runtime swaps abilities cleanly.

Tutorial 8: MVVM UI - Health Bar

1
Create ViewModel
BP subclass of UWCAttributeViewModel -> VM_HealthBar. Add FieldNotify float property HealthPercent. In Init: bind to WCGASAttributeRegistry::BindToAttributeChanged(DA_Attr_Health). On change: HealthPercent = Current/Max.
2
Create Widget
Widget Blueprint WBP_HealthBar. Add Progress Bar. In MVVM panel, add VM_HealthBar viewmodel. Bind ProgressBar.Percent -> VM_HealthBar.HealthPercent. Zero-cost event-driven binding.
3
Push to HUD
WCUIManagerSubsystem -> PushLayer(WBP_HealthBar, EWCUILayer::HUD)
WBP_HealthBar -> SetViewModel(Create VM_HealthBar -> Init(PlayerASC))
V
Test
Health bar shows, takes damage - bar drops instantly (event-driven, no Tick). Regen fills it back up.

Tutorial 9: Quests

1
Create Quest in Stories Editor
Content Browser -> WC Stories category -> Quest Definition -> DA_Quest_KillGoblins. Name="Goblin Problem", Objectives=[Kill 10 WC.Enemy.Goblin], Rewards=[GoldCoins x100, XP 500]. Open in WCStoriesEditor graph.
2
Accept and Track
StoriesComponent -> AcceptQuest(DA_Quest_KillGoblins)
// On goblin death (combat event fires WC.Enemy.Goblin tag):
StoriesComponent -> UpdateObjectiveProgress(Quest, Index:0, Delta:1)
3
Complete
// When OnQuestReadyToComplete fires:
StoriesComponent -> CompleteQuest(DA_Quest_KillGoblins)
// Applies all rewards, moves to CompletedQuests
V
Save/Load Test
Accept quest, kill 5 goblins, save, reload. Quest shows 5/10 progress. Save system persists WCStoriesComponent automatically.

Tutorial 10: Skill Tree

1
Create Skill Nodes
Create UWCGASSkillNode data assets: DA_Skill_PowerStrike (cost=1SP, prereqs=[]), DA_Skill_Cleave (cost=2SP, prereqs=[PowerStrike]), DA_Skill_Whirlwind (cost=3SP, prereqs=[Cleave]).
2
Create Skill Tree and Reference from Class
UWCGASSkillTree -> DA_SkillTree_Warrior. Add nodes. Reference from DA_Class_Warrior -> SkillTrees array. Use WCGASAllyEditor visual layout editor to arrange nodes.
3
Unlock Nodes at Runtime
WCGASSkillTreeComp -> AddSkillPoints(1)   // on level up
WCGASSkillTreeComp -> UnlockNode(DA_Skill_PowerStrike)
// validates prereqs + SP cost, grants ability if pass
V
Verify
Unlock PowerStrike: ability appears in ASC. Unlock Cleave without PowerStrike: fails (prereq). Unlock PowerStrike then Cleave: succeeds.

Tutorial 11: Factions and Social System

1
Create Faction Definitions
UWCFactionDefinition data assets: DA_Faction_Guards (Tag=WC.Society.Faction.CityGuard, Standing vs Player=+50, vs Bandits=-80). DA_Faction_Bandits (Tag=WC.Society.Faction.Bandits, Standing vs Player=-30).
2
Assign Faction Tags to NPCs
On NPC BeginPlay: Get ASC -> AddLooseGameplayTag(WC.Society.Faction.CityGuard). Or set in Heritage DefaultActivationOwnedTags.
3
Query and Modify Relationships
WCDynamicSocietySubsystem -> GetRelationshipCategory(Actor, Actor)
// returns Hostile/Neutral/Friendly/Allied
WCDynamicSocietySubsystem -> ModifyRelationship(Player, FactionTag, +15.0)
V
Test
Guards friendly to player. Attack a guard: standing drops, becomes Hostile. Kill bandits near guards: guard standing improves.

Tutorial 12: Save and Load

1
Trigger Save
Get WCSaveSubsystem (from GameInstance)
  -> SaveGameAsync(SlotIndex: 0)
// Serializes: attributes, inventory, equipment, quests,
// knowledge, exploration, world state, calendar. All automatic.
2
Trigger Load
WCSaveSubsystem -> LoadGameAsync(SlotIndex: 0)
WCSaveSubsystem -> GetSaveSlots()  // list available slots
WCSaveSubsystem -> GetSlotInfo(0)  // timestamp, level, playtime
3
Level Transitions
WCSaveSubsystem -> SaveForLevelTransition()  // synchronous
Open Level (NextLevelName)
// WCGameInstance automatically restores state after travel
4
Make Custom Actors Saveable
Implement IWCSaveable interface. Override GetActorSaveData and RestoreFromSaveData. The world section serializer calls these automatically for all IWCSaveable actors.
5
Configure Autosave
Project Settings -> Dynamic RPG Worlds -> Save System: bEnableAutosave=true, AutosaveIntervalMin=5.0, MaxSaveSlots=10.
V
Full Test
Accept quest, kill enemies, open chest, save. Quit. Load. Quest progress, open chest, dead enemies, attribute values all restored correctly.

Systems Deep Dive

Complete technical documentation for every major system. Assumes you have completed the tutorials.

GAS Core (WCGASCore)

WCGASCore is the foundation of every other module. It provides the 150-slot attribute pool, all 348 native gameplay tags, the MMC library, and the AbilityLibrarySubsystem.

Attribute Pool

Instead of writing custom AttributeSets, WCGASCore provides 150 pre-allocated, replicated attribute slots on a single UWCAttributeSet. At runtime, UWCGASAttributeRegistry assigns Data Asset definitions to slots. Each slot gets a base value, min, max, clamp mode, and optional regen config.

// Reading an attribute (any module, any context):
float Health = WCGASAttributeRegistry->GetAttributeValue(Actor, DA_Attr_Health);

// Writing via GE (always go through GAS, never set directly):
ASC->ApplyGameplayEffectToSelf(GE_HealPlayer, 1.0f, ASC->MakeEffectContext());

// Binding to changes:
WCGASAttributeRegistry->BindToAttributeChanged(DA_Attr_Health, 
    FWCAttributeChangedDelegate::CreateUObject(this, &MyClass::OnHealthChanged));

Gameplay Tags (348 Native Tags)

All tags are declared in WCGameplayTags.h using UE_DECLARE_GAMEPLAY_TAG_EXTERN and defined in WCGameplayTags.cpp using UE_DEFINE_GAMEPLAY_TAG. Tags are organized by domain:

DomainPrefixCountExamples
Character StateWC.State.24WC.State.Dead, WC.State.Stunned, WC.State.Invisible
CombatWC.Combat.48WC.Combat.State.Attacking, WC.Combat.Event.Death, WC.Combat.Weapon.Type.Melee.Sword
ItemsWC.Item.36WC.Item.Type.Consumable, WC.Item.Rarity.Legendary, WC.Item.Slot.MainHand
AbilitiesWC.Ability.32WC.Ability.Combat.LightAttack, WC.Ability.Magic.Fireball
HeritageWC.Heritage.28WC.Heritage.Race.Human, WC.Heritage.Class.Warrior
DamageWC.Damage.24WC.Damage.Type.Physical.Slash, WC.Damage.Type.Magic.Fire
SaveWC.Save.8WC.Save.State.SavingDisabled, WC.Save.State.Loading
SocietyWC.Society.40WC.Society.Faction.CityGuard, WC.Society.Crime.Assault
InputWC.Input.16WC.Input.State.Buffering, WC.Input.Mode.Combat
InteractionWC.Interaction.20WC.Interaction.Type.Instant, WC.Interaction.Chest.Open
Enemy/NPCWC.Enemy. / WC.NPC.28WC.Enemy.Goblin, WC.NPC.Merchant
UIWC.UI.16WC.UI.Layer.HUD, WC.UI.Modal.Active
RealmWC.Realm.16WC.Realm.Discovered, WC.Realm.FastTravel.Available
AudioWC.Audio.12WC.Audio.Layer.Combat, WC.Audio.Layer.Ambient

MMC Library (12 Formula Types)

Modifier Magnitude Calculations allow attribute-scaled GE magnitudes. WCGASCore provides 12 pre-built MMCs:

MMC ClassFormulaUse Case
WCGASMMCalc_LinearA * attr + BLinear scaling from attribute
WCGASMMCalc_QuadraticA * attr^2 + BExponential damage scaling
WCGASMMCalc_PercentRegenattr * rate%Percent-based regeneration
WCGASMMCalc_PercentDegenattr * rate%Percent-based degeneration
WCGASMMCalc_LevelBasedcurve(level)Level-scaled damage/healing
WCGASMMCalc_Resistance1 - (resist/100)Damage reduction calculation
WCGASMMCalc_Overflowclamp(attr - max, 0)Overflow handling (shields)
WCGASMMCalc_Transfersource * ratioAttribute transfer between actors
WCGASMMCalc_Thresholdif attr >= thresh: valThreshold-triggered effects
WCGASMMCalc_CustomBlueprintNativeEventCustom BP-defined formulas

GAS Ally System (WCGASAlly)

WCGASAlly is the largest module (425 files). It provides the full RPG character layer: Heritage (race/class), StatusEffects, SkillTree, Damage/Healing formulas, Resistance, Leveling, Feats, and WorldContext.

StatusEffect System

StatusEffects are persistent gameplay effects with stacking, duration tracking, and full save/load support. They differ from standard GEs in that they have visual/audio components, stack limits, and cleansing interactions.

// Apply a status effect:
WCGASStatusEffectComp->ApplyStatusEffect(DA_StatusEffect_Poison, SourceActor);

// Query active effects:
WCGASStatusEffectComp->GetActiveStatusEffects(OutEffects);

// Cleanse by tag:
WCGASStatusEffectComp->CleanseStatusEffectsWithTag(WC.StatusEffect.Type.Poison);

// Configure in Data Asset:
DA_StatusEffect_Poison:
  GE To Apply:        GE_Poison_Tick
  Duration:           10.0 seconds
  Tick Rate:          1.0 second
  Max Stacks:         3
  Stack Behavior:     RefreshDuration    (or AddDuration, ReplaceDuration)
  Cleanse Tags:       [WC.StatusEffect.Immunity.Poison]
  Visual Effect:      NiagaraSystem_PoisonCloud
  Sound:              SFX_PoisonTick

Feat System

Feats are milestones unlocked by meeting conditions (level reached, stat threshold, achievement). Each feat provides a passive bonus or ability unlock. UWCGASFeatComponent manages the feat pool, pending selections, and save/restore.

// Feat selection (UI calls this after player picks):
WCGASFeatComp->SelectFeat(DA_Feat_CriticalStrike);

// Check if feat is unlocked:
WCGASFeatComp->IsFeatUnlocked(DA_Feat_CriticalStrike);  // bool

// Feats that unlock on milestone:
DA_Feat_IronSkin:
  Display Name:    "Iron Skin"
  Unlock Condition: Level >= 10
  Bonus GE:        GE_Feat_IronSkin_PhysResist (+15 Physical Resistance)
  bGrantAbility:   false

Leveling System

The leveling system is curve-driven. Each level-up fires events, grants skill points, and triggers feat milestone checks.

// Add XP (triggers level up if threshold met):
WCGASAllyComp->AddExperience(500.0f);

// Configure the XP curve:
Project Settings -> Dynamic RPG Worlds -> GAS Ally -> XP Curve
// UCurveFloat where X=Level, Y=XP required to reach that level

// Level up event (BP override):
Event OnLevelUp(NewLevel)
  -> WCGASSkillTreeComp->AddSkillPoints(1)
  -> WCGASFeatComp->CheckMilestones(NewLevel)
  -> Play level up VFX/SFX

Combat System (WCCombat)

WCCombat handles melee, ranged, aimed, charge, reload, scope, and weapon swap — all GAS-native, fully replicated.

Melee Hit Detection

Hit detection uses WCAnimNotifyState_MeleeTrace which sphere-sweeps between two bone sockets every tick during the notify window. Hits are batched per swing to prevent multiple registrations on the same target.

// The trace fires automatically via the AnimNotify.
// The combat ability handles the hit via:
OnMeleeHit(FWCTargetData_MeleeHit& HitData)
  -> Validate: HasAuthority? In trace window? Target alive?
  -> Build damage spec from weapon fragments + ability modifiers
  -> Apply FinalMultiplier from equipment
  -> ApplyGameplayEffectSpecToTarget(DamageSpec, Target)
  -> Fire WC.Combat.Event.Hit gameplay event for VFX/SFX routing

Ranged / Projectile System

// WCGameplayAbility_Ranged fires projectiles:
DA_Ability_ArrowShot (UWCAbilityDefinition):
  AbilityClass: UWCGameplayAbility_Ranged
  Fragment: UWCAbilityFragment_RangedCombat
    Projectile Class:   BP_WCArrowProjectile
    Launch Socket:      bow_string
    Spread:             2.0 degrees
    Max Range:          5000 cm
    bPierce:            false
    bHomingEnabled:     false
    DamageGE:           GE_ArrowDamage (uses FinalMultiplier)

Combo Attack Chain vs Combo Tree

Attack Chain (Same Button Repeated)
Example: R1 R1 R1 (Elden Ring-style)

Config: UWCAbilityFragment_MeleeCombat.AttackChainSections = [Slash1, Slash2, Slash3]

How: Same ability stays active. WCAnimNotifyState_AttackChainWindow defines when pressing again advances chain. No new ability activation — montage section changes only.
Combo Tree (Different Inputs -> Special)
Example: QCF + Attack (Street Fighter-style)

Config: UWCComboDefinition asset. Input sequence = [Down, Right, Attack]. Result ability tag = WC.Ability.Combat.SpecialMove.

How: WCInputHandler_ComboInput pushes inputs to WCInputBuffer. WCComboDetector evaluates buffer against all registered combos. Match fires ability.

Weapon Swap System

// Swap weapon in main hand:
EquipmentComp->SwapWeapon(NewWeaponInstance, EWCEquipSlot::MainHand);
// 1. Unequip current: removes equipped GEs, revokes granted abilities
// 2. Play unequip montage (WCAnimNotify_WeaponUnwield)
// 3. Equip new: applies equip GEs, grants abilities
// 4. Play equip montage (WCAnimNotify_WeaponWield)

Input System (WCInput)

Handler Priority Reference

PriorityValueUse Case
Critical0UI / Menu inputs. Block all gameplay.
High100Cinematic, dialogue, cutscene inputs.
Normal200Standard gameplay: combat, movement, interaction.
Low300Ambient: camera, emotes, secondary controls.
Background400Debug, screenshot.

Complete Handler List (11 handlers)

HandlerPurposeIn CLAUDE.md
WCInputHandler_MovementWASD/stick -> character movement directionYes
WCInputHandler_LookMouse/right stick -> camera rotationYes
WCInputHandler_CombatAbilityContext-aware attack: gated by state, weapon, airborneYes
WCInputHandler_ComboInputRoutes to ComboDetector, fallback ability on no matchYes
WCInputHandler_InteractionRoutes to WCInteractionComponent spatial hash queryYes
WCInputHandler_AbilitySimple: activate ability by tag on press/releaseYes
WCInputHandler_JumpVariable-height jump: hold for higher, release to cutYes
WCInputHandler_GenericBase for custom handlers (extendable)Yes
WCInputHandler_GripToggleToggle grip state (ladder, ledge, rope interactions)NO - undocumented
WCInputHandler_MenuTabTab navigation within menu screensNO - undocumented
WCInputHandler_MenuToggleOpen/close menu overlaysNO - undocumented

Creating a Custom Handler

UCLASS()
class UMyCustomInputHandler : public UWCInputHandler
{
    GENERATED_BODY()
public:
    virtual bool CanHandleInput(const FWCInputHandlerContext& Ctx) const override
    {
        // Return true if this handler should process this input
        return Ctx.InputAction == IA_MyCustomAction;
    }
    virtual bool OnInputTriggered(const FWCInputHandlerContext& Ctx) override
    {
        // Do your logic here
        // Return true = input consumed, stop routing down priority list
        return true;
    }
};

// Register at runtime (e.g., on PlayerController BeginPlay):
UWCInputManagerComponent* IMC = Controller->GetInputManager();
IMC->RegisterHandler(NewObject(), 200 /*priority*/);

Interaction System (WCInteraction)

Interaction Types

TypeBehaviorConfig
InstantFires immediately on pressNo config needed
HoldHold button for duration to completeHoldDuration (float)
ToggleFirst press starts, second press endsbToggle=true
CooperativeRequires N players to interact simultaneouslyMinOccupancy, MaxOccupancy
SequenceMulti-step puzzle (do steps in order)SequenceSteps array
TimedSequenceMulti-step with time limit between stepsStepTimeout float
AbilityFires a GAS ability as the interaction resultAbilityTag
RemoteInteraction triggered by game logic, not player inputCall TriggerRemote()

Detection Modes

ModeHow Detection Works
WithinRangeSpatial hash radius query. Registration in BeginPlay, update on move.
LineOfSightRaycast from player camera to interactable.
OverlapUE overlap event triggers detection.
TagBasedDetected only when player has specific tag.
AbilityRequiredDetected only when player has specific ability granted.
ManualGame code calls EnableDetection() explicitly.

UI Framework (WCUIFramework)

Screen Layer Stack

// Layers (from back to front):
EWCUILayer::World      // 3D widgets, nameplates
EWCUILayer::HUD        // Health bars, crosshair, ability cooldowns
EWCUILayer::Menu       // Inventory, map, character screen
EWCUILayer::Modal      // Confirmation dialogs, notifications
EWCUILayer::Loading    // Loading screens (always on top)

// Layer operations:
WCUIManagerSubsystem->PushLayer(WidgetClass, EWCUILayer::Menu);
WCUIManagerSubsystem->PopLayer(EWCUILayer::Menu);
WCUIManagerSubsystem->GetLayerWidget(EWCUILayer::HUD);  // returns UUserWidget*
WCUIManagerSubsystem->IsLayerVisible(EWCUILayer::Modal);

Theme System

// All UI colors, fonts, and sizes come from UWCUITheme data asset:
Project Settings -> Dynamic RPG Worlds -> UI -> Active Theme

// Access in widgets:
UWCUISubsystem->GetCurrentTheme()->PrimaryColor   // FLinearColor
UWCUISubsystem->GetCurrentTheme()->BodyFont        // FSlateFontInfo
UWCUISubsystem->GetCurrentTheme()->BorderBrush     // FSlateBrush

// Switch themes at runtime (for accessibility modes):
WCUIManagerSubsystem->SetTheme(DA_Theme_HighContrast);

Tooltip System

// Tooltips appear after hover delay and track cursor/anchor:
WCTooltipManager->ShowTooltip(WidgetClass, AnchorWidget, Delay: 0.5f);
WCTooltipManager->HideTooltip();
WCTooltipManager->SetDelay(0.3f);    // global hover delay

// Item tooltips aggregate from fragments automatically:
// WCFragment_Rarity    -> rarity color + name
// WCFragment_Equippable -> slot requirement line
// WCFragment_AttributeModifiers -> stat comparison lines vs equipped item
// WCFragment_WeaponData -> damage range, type

Dynamic Society System (WCDynamicSociety)

WCDynamicSociety (188 files) provides the full social simulation: factions, relationships, crime/justice, calendar, and personality-driven NPC behavior.

Social Architecture

Component / SubsystemPurpose
UWCDynamicSocietySubsystem5,852-line master subsystem. All relationship queries and modifications route through here.
UWCNPCSocialComponentPer-NPC social state: relationship scores per faction, personality traits (Paranoia, Generosity, Volatility).
UWCCrimeSubsystemCrime tracking: bounties, wanted levels, guard response logic, crime evidence decay.
UWCCalendarSubsystemIn-game time: date, time of day, seasons. Events fire on day/hour transitions. Saved via WCSaveSystem.
UWCFactionSubsystemFaction standings. Modify, query, event dispatch on crossing thresholds.

Calendar System

// Get current in-game time:
WCCalendarSubsystem->GetCurrentTime()   // returns FWCDateTime
WCCalendarSubsystem->GetTimeOfDay()     // EWCTimeOfDay (Dawn/Day/Dusk/Night)
WCCalendarSubsystem->GetSeason()        // EWCSeason (Spring/Summer/Autumn/Winter)
WCCalendarSubsystem->GetDayOfWeek()     // EWCDayOfWeek

// Advance time (for fast travel etc.):
WCCalendarSubsystem->AdvanceTime(Hours: 8.0f);

// Bind to time events:
WCCalendarSubsystem->OnDayChanged.AddDynamic(this, &MyClass::OnNewDay);
WCCalendarSubsystem->OnHourChanged.AddDynamic(this, &MyClass::OnHourTick);
WCCalendarSubsystem->OnSeasonChanged.AddDynamic(this, &MyClass::OnSeasonChange);

Crime System

// Commit a crime (called by game logic when player does bad thing):
WCCrimeSubsystem->RecordCrime(Player, WC.Society.Crime.Assault, Victim, Location);

// Query wanted level:
WCCrimeSubsystem->GetWantedLevel(Player)   // 0..5 (5 = shoot on sight)
WCCrimeSubsystem->GetBounty(Player)        // in-game gold value

// Pay bounty at guard:
WCCrimeSubsystem->PayBounty(Player, Guard);

// Crime evidence decays over time automatically
// Guards respond based on wanted level and faction standing

Realms System (WCRealms)

Level Streaming

// Load a realm (level streaming area):
WCLevelStreamingSubsystem->RequestLoadRealm(DA_Realm_CityCenter, TransitionType: Seamless);
// PendingRealm / PendingLevelsToLoad tracked internally until streaming completes

// Fast travel:
WCFastTravelSubsystem->FastTravelTo(DA_Location_InnTavern);
// Validates: is location discovered? enough gold? time of day allowed?
// Advances calendar by travel time
// Loads destination level

// Discovery:
WCDiscoverySubsystem->DiscoverLocation(DA_Location_AncientRuins);
WCDiscoverySubsystem->IsLocationDiscovered(DA_Location_AncientRuins);

// Location volumes (place in level):
AWCLocationVolume - trigger volume that fires discovery event on overlap

Audio Suite (WCAudioSuite)

// Request music transition (crossfade between states):
WCAudioSuiteSubsystem->RequestMusicTransition(DA_MusicState_Combat);
// Spawns UAudioComponent per layer, fades out old, fades in new
// CrossfadeInTime / CrossfadeOutTime set in DA_MusicState

// Play stinger (one-shot musical hit):
WCAudioSuiteSubsystem->PlayStinger(DA_Stinger_VictoryFanfare, bIs3D: false);
// 2D: SpawnSound2D | 3D: SpawnSoundAttached to actor

// Ambient zones (push/pop stack):
WCAudioSuiteSubsystem->PushAmbientZone(DA_AmbientZone_Dungeon);
WCAudioSuiteSubsystem->PopAmbientZone(DA_AmbientZone_Dungeon);

// Layer volume control:
WCAudioSuiteSubsystem->SetLayerVolume(EWCAudioLayer::Music, 0.8f);
WCAudioSuiteSubsystem->SetLayerVolume(EWCAudioLayer::SFX, 1.0f);
WCAudioSuiteSubsystem->SetLayerVolume(EWCAudioLayer::Voice, 1.0f);
WCAudioSuiteSubsystem->SetLayerVolume(EWCAudioLayer::Ambient, 0.6f);

Knowledge Suite (WCKnowledgeSuite)

// ACHIEVEMENTS
WCKnowledgeComp->UnlockAchievement(DA_Achievement_FirstBlood);
WCKnowledgeComp->GetAchievementProgress(DA_Achievement_KillCount); // returns float
WCKnowledgeComp->IsAchievementUnlocked(DA_Achievement_FirstBlood); // bool

// CODEX (lore entries unlocked by discovery)
WCKnowledgeComp->UnlockCodexEntry(DA_Codex_GoblinLore);
WCKnowledgeComp->GetCodexEntry(DA_Codex_GoblinLore); // returns FWCCodexEntry

// BESTIARY (enemy info unlocked by combat encounters)
WCKnowledgeComp->RecordBestiaryKill(WC.Enemy.Goblin);
WCKnowledgeComp->GetBestiaryEntry(WC.Enemy.Goblin); // FWCBestiaryEntry

// TUTORIALS (guided hints system)
WCKnowledgeComp->MarkTutorialComplete(DA_Tutorial_FirstCombat);
WCKnowledgeComp->ShouldShowTutorial(DA_Tutorial_FirstCombat); // bool

// All 4 systems serialize/deserialize via WCSaveSystem automatically

AI System (WCAI)

Built-in BT Tasks

TaskPurpose
BTTask_WCMoveToMove to blackboard target with acceptance radius. Handles stuck detection.
BTTask_WCActivateAbilityActivate ability by tag on the AI's ASC. Waits for completion or timeout.
BTTask_WCFleeMove away from threat at increased speed. Health threshold trigger.
BTTask_WCPatrolWalk patrol waypoints array in order or randomly.
BTTask_WCPlayMontagePlay animation montage, wait for completion.
BTTask_WCSetBBKeySet blackboard key value from BT (utility).
BTTask_WCSocialInteractInitiate social/dialogue interaction with target.
BTTask_WCEquipWeaponRequest weapon equip from EquipmentComponent.

Built-in BT Services

ServicePurpose
BTService_WCTargetScoringScores perceived actors by: distance, threat level, faction, health. Writes best to BB.
BTService_WCThreatUpdateUpdates threat table from GAS events (damage received, ally death, etc.)
BTService_WCRoutineCheckChecks routine goal schedule (patrol, sleep, trade, pray based on time of day)

Routine Goals (12 built-in)

// NPC daily routines driven by calendar:
WC.AI.Routine.Patrol       - walk patrol points
WC.AI.Routine.Sleep        - go to bed location, idle
WC.AI.Routine.Trade        - move to market, barter behavior
WC.AI.Routine.Pray         - move to shrine, idle
WC.AI.Routine.Guard        - stand guard post (placeholder - deferred)
WC.AI.Routine.Eat          - move to food source, idle
WC.AI.Routine.Socialize    - move to social area, approach NPCs
WC.AI.Routine.Work         - move to work site, labor animation
WC.AI.Routine.Flee         - emergency flee from threat
WC.AI.Routine.Combat       - engage hostile target
WC.AI.Routine.Investigate  - move to last known position of threat
WC.AI.Routine.Idle         - default do-nothing state

All 23 Modules

Click any module header to expand full details, classes, and implementation notes.

Layer 1 - Foundation

bolt
WCGASCore
Foundation - Runtime - 55 files - 348 native tags - 150 attribute pool
GASAttributesTagsMMC
100% COMPLETEv

Key Classes

UWCAttributeSet150-slot pre-allocated replicated attribute set. Never subclass. Pool assigned by registry.
UWCGASAttributeRegistryWorld subsystem. Maps Data Asset definitions to pool slots. Primary read/write attribute API.
UWCAbilityLibrarySubsystemGame instance subsystem. Batch grant/revoke, ability set loading, async data.
UWCCoreLibraryBlueprint library. GetAttributeValue, ApplyGEToActor, HasTag, GetASC - all callable from any BP.
WCGameplayTags.h / .cpp348 native tag declarations. ONLY place tags are defined. Prevents ODR violations.
UWCGASMMCalc_* (10 types)MMCs: Linear, Quadratic, PercentRegen, PercentDegen, LevelBased, Resistance, Overflow, Transfer, Threshold, Custom.
Architecture: WCGASCore has zero WC dependencies. Only UE Core + Engine + GameplayAbilities + NetCore. Everything else depends on it.

Layer 2 - Feature Modules (14 runtime)

dna
WCGASAlly
Feature - Runtime - 425 files - Heritage, StatusEffects, SkillTree, Feats, Leveling
HeritageStatusEffectsSkillTreeFeatsLeveling
98% Near Completev

Key Classes

UWCGASAllyComponentPer-character. Heritage application, XP/leveling, cross-system coordination.
UWCGASHeritageRaceDataData Asset: race definition, base GEs, ability restrictions, starting abilities.
UWCGASHeritageClassDataData Asset: class definition, skill trees, starting abilities, base GEs.
UWCGASStatusEffectComponentStatusEffect application, stacking, duration tracking, cleansing. Save phases 2-6 complete.
UWCGASSkillTreeComponentUnlock nodes, SP management, async node loading, batch transactions. PendingAsyncLoads tracking.
UWCGASFeatComponentFeat pool, PendingSelections (replicated), milestone tracking, CaptureFeatState/RestoreFeatState.
UWCGASDamageComponentDamage formula: resistance lookup, armor penetration, critical hit calculation.
BTService_WCTargetScoringFull multi-criteria scoring (distance, threat, faction, health). NOT a stub - confirmed real implementation.
Pending (optional): UWCGASAbilityData + UWCGASEffectData (Phase 8). 3 TODOs in WCGASSkillTreeTypes.h. Skill tree works without them.
bag
WCInventory
Feature - Runtime - 174 files - Fragment-based item + equipment
ItemsEquipmentFragmentsLoot
100% COMPLETEv

Inventory Component

UWCInventoryComponentItem storage on PlayerState. Add/remove/stack/transfer/sort. FFastArraySerializer replication. GUID-ordered serialization for save/load.
UWCEquipmentComponentEquipment slot management. Equip/unequip/swap with GE application/removal. GUID-ordered serialization.
UWCItemDefinitionData Asset - immutable template. Item metadata + Fragments array. Never holds runtime state.
UWCItemInstanceRuntime object. References its Definition. Holds per-instance state (durability, stack count, enchants).

Fragment Types (all confirmed implemented)

WCFragment_EquippableSlot tag, mesh/socket attach, abilities to grant on equip, attribute GEs on equip.
WCFragment_WeaponDataWeapon type tag, trace sockets, damage type tags, FinalMultiplier applied to projectile damage spec.
WCFragment_StackableMaxStackSize, bAutoStack on pickup.
WCFragment_ConsumableUseTime, GEs to apply, bDestroyOnUse, bCanUseInCombat.
WCFragment_RarityRarity tag. Drives tooltip color, UI item frame color. Minor TODO comments for future GAS integration.
WCFragment_AttributeModifiersGEs applied on equip/unequip. Conditional modifiers (e.g., only if Heritage.Class.Warrior).
WCFragment_WeaponHeatHeat accrual on fire, cooldown on stop. Overheat lockout via gameplay tag.
WCFragment_ExplosiveExplosion radius, damage GE, impulse. For grenades, explosive bolts.
WCFragment_AmmunitionAmmo type, capacity, reload time. Consumed by WCGameplayAbility_RangedAttack.
UWCItemTooltipAggregatorCollects StatLines + EffectLines from all fragments. Feeds WCUIFramework tooltip widget.
UWCLootTableDefinitionData Asset: weighted item drop table with min/max stack ranges and condition tags.
sword
WCCombat
Feature - Runtime - 66 files - Melee, ranged, aim, charge, reload, scope, swap
MeleeRangedCombosProjectiles
100% COMPLETEv

Key Classes

UWCCombatAbilitySystemComponentASC subclass. bComboWindowOpen (replicated - bug fixed v4). PendingChainAdvanceIndex, PendingChargeDamageMultiplier.
UWCGameplayAbility_CombatBase combat ability. IsActivatedByPlayer/AI. GetCombatASC (cached). CheckWeaponRequirements evaluates BOTH hands (bug fixed v4). DoesWeaponSupportScope wired to CanActivateAbility (was dead code - fixed v4).
UWCGameplayAbility_MeleeAttackAttack chains, hit registration, damage. Chain window managed by WCAnimNotifyState_AttackChainWindow.
UWCGameplayAbility_RangedAttackProjectile spawn, trajectory, hit detection. Ammo consumed via WCFragment_Ammunition.
UWCGameplayAbility_ChargeAttackHold to charge: PendingChargeDamageMultiplier scales with hold duration. MaxCharge capped.
FWCTargetData_MeleeHitCustom GAS TargetData. NetSerialize PROPAGATES failure (was masking it - fixed v4). Carries hit actor, location, normal.
WCAnimNotifyState_MeleeTracePer-tick sphere sweep between trace sockets. Hit batching per swing prevents multi-registration.
WCAnimNotifyState_AttackChainWindowWindow where pressing attack chains to next montage section. Input outside resets to section 1.
WCAnimNotify_WeaponWieldEquip logic on anim notify. Null fallback added (mirrors WeaponSwap - fixed v4).
UWCCombatASCTestAutomation test for combat ASC. Confirmed present in test suite.
WCInput
WCInput
Feature - Runtime - 39 files - 11 handlers (3 undocumented in CLAUDE.md)
Enhanced InputHandler PipelineBufferCombos
100% COMPLETEv
UWCInputManagerComponentOn PlayerController. Handler list sorted by priority. Routes Enhanced Input events.
UWCInputBufferRing buffer. bAllowBuffering handlers push here. WCInputBufferTest.cpp confirmed present.
UWCComboDetectorEvaluates buffer vs UWCComboDefinition assets. Match fires ability tag, fallback on miss.
WCInputHandler_GripToggleNEW - not in CLAUDE.md. Source-verified. Toggle grip state for ledges, ropes, ladders.
WCInputHandler_MenuTabNEW - not in CLAUDE.md. Source-verified. Tab navigation in menu screens.
WCInputHandler_MenuToggleNEW - not in CLAUDE.md. Source-verified. Open/close menu overlays.
WCInteraction, WCUIFramework, WCDynamicSociety, WCRealms, WCAudioSuite, WCKnowledgeSuite, WCStories, WCAI, WCSaveSystem
Feature modules - all 100% complete - see Systems tab for full API
All 100% Completev

All remaining runtime feature modules are fully implemented and source-verified. See the Systems Deep Dive tab for comprehensive API documentation for each system. Key highlights:

  • WCInteraction (33 files): 8 interaction types, 6 detection modes, spatial hash grid, cooperative interactions confirmed.
  • WCUIFramework (63 files): Full MVVM HUD, screen stack, theme, tooltip manager. ShowWidget/HideWidget wired.
  • WCDynamicSociety (188 files): Phase F complete. 12 enum renames, 14 CoreRedirects, 5852-line subsystem restored. All UCLASS/UENUM WC-prefixed.
  • WCRealms (34 files): Level streaming, discovery, fast travel, world state all wired to save system.
  • WCAudioSuite (27 files): Layer-based music, stingers, ambient zones. NM_DedicatedServer guard confirmed.
  • WCKnowledgeSuite (38 files): 4 systems (achievements, codex, bestiary, tutorials) all serialized via save system.
  • WCStories (61 files): Quest + dialogue. Save/load complete. Graph editors live in WCStoriesEditor.
  • WCAI (88 files): BT tasks/services, perception, 12 routine goals. GetPerceivedActorsByFaction confirmed working.
  • WCSaveSystem (16 files): 805-line WCSaveSubsystem.cpp SOURCE VERIFIED. All 6 cross-module serializers called.

Layer 3 - Integration

DynamicRPGWorlds (Integration Layer)
Integration - Runtime - 48 files - Knows all feature modules
PlayerControllerPlayerStateGameModeMover
100% COMPLETEv
AWCPlayerControllerShowWidget/HideWidget wired to WCUIManagerSubsystem. Owns WCInputManagerComponent.
AWCPlayerStateOwns: UWCCombatASC, UWCInventoryComponent, UWCEquipmentComponent, UWCStoriesComponent, UWCKnowledgeComponent, UWCExplorationComponent.
UWCGameInstanceOnPreLevelTransition/OnPostLevelTransition wired via WCSaveSubsystem. Cross-level persistence.
AWCMoverPlayerCharacterMover plugin character. ASC lookup on PlayerState via IAbilitySystemInterface.
AWCMoverAICharacter / AWCMoverCharacterBaseMover plugin AI character hierarchy. ASC owned directly on character.

Multiplayer Guide

Complete guide to multiplayer architecture, replication rules, authority patterns, and testing. The framework is multiplayer-native — every system was designed with networking in mind from day one.

Replication Architecture

WC RPG Worlds uses standard UE authority model: the server is authoritative for all game state. Clients send input, server validates and executes, replicates results back to clients.

SystemReplicated OnReplication MethodAuthority Guard
GAS AttributesPlayerState ASCGAS built-in replicationHasAuthority() in MMC
InventoryPlayerStateFFastArraySerializer (delta)Server-only AddItem/RemoveItem
EquipmentPlayerStateFFastArraySerializer (delta)Server-only Equip/Unequip
Combat State (bComboWindowOpen)ASC (replicated)UPROPERTY(Replicated)Fixed in v4
Quest ProgressPlayerStateReplicated TArrayServer-only AcceptQuest/CompleteQuest
Faction StandingsGameStateUWCDynamicSocietySubsystemServerModifyNPCRelationship RPC
Calendar TimeServer authoritativeUWCCalendarSubsystemServer-side tick only
World StateServer authoritativeUWCWorldStateSubsystemNo client modification
Feat PendingSelectionsASCUPROPERTY(Replicated)Server validates selection

ASC Ownership Patterns

Critical: Where the ASC lives determines how it replicates. Getting this wrong causes attribute updates to not appear on clients.
// PLAYER: ASC on PlayerState (persists through respawn)
AWCPlayerState (replicated to all clients)
  -> UWCCombatAbilitySystemComponent (ASC)
AWCMoverPlayerCharacter (avatar)
  -> GetAbilitySystemComponent() returns PlayerState ASC via IAbilitySystemInterface

// AI: ASC on Character (simpler, no respawn requirement)
AWCMoverAICharacter
  -> UWCCombatAbilitySystemComponent (ASC, owned by character)
  -> Destroyed when character dies (acceptable for AI)

RPC Patterns Used in Framework

PatternWhen UsedExample
Server RPCClient initiates state changeServerEquipItem(), ServerModifyNPCRelationship()
Multicast RPCServer tells all clients about eventMulticastPlayDeathEffect(), MulticastOnInteractionStart()
Client RPCServer tells specific clientClientShowNotification(), ClientSaveComplete()
GAS PredictionAbility activation, attribute previewActivateAbilityByTag() - GAS handles prediction key
GAS CuesCosmetic effects (VFX/SFX)WC.GameplayCue.Hit.Physical -> client-side only

Common Multiplayer Mistakes to Avoid

Testing Multiplayer

// In Unreal Editor: Play In Editor with multiple clients
Play dropdown -> Number of Players: 2
Net Mode: Play As Listen Server  (or Play As Client for dedicated server)
Enable "Run Dedicated Server" for true dedicated server test

// Useful console commands during MP testing:
net.PacketSimulationSettings.PktLoss 5     // simulate 5% packet loss
net.PacketSimulationSettings.PktLag 100    // simulate 100ms latency
showdebug abilitysystem                    // show GAS debug on screen
wc.save.debug 1                           // enable save system debug log

Dedicated Server Considerations

Save System Deep Dive

Complete technical reference for WCSaveSystem. 805-line WCSaveSubsystem.cpp — source verified. Handles all 6 cross-module serializers, async pipeline, autosave, level transitions, and cloud hooks.

Save Data Structure

UWCSaveIndex (slot registry):
  TArray<FWCSaveSlotInfo> Slots   // metadata: timestamp, level, playtime

UWCWorldSaveData (per-level):
  TArray<FWCActorSaveRecord> DynamicActors
  FWCWorldSnapshot WorldStateSnapshot
  FWCCalendarSaveData CalendarData

UWCPlayerSaveData (per-player):
  FWCAttributeSaveData GASAttributeData     // pool slot values
  FWCInventorySaveData InventoryData        // item GUIDs + instance state
  FWCInventorySaveData EquipmentData        // slot assignments + GUIDs  
  FWCQuestSaveData QuestData               // active quests + progress
  FWCKnowledgeSaveData KnowledgeData       // achievements, codex, bestiary, tutorials
  TArray<FName> DiscoveredLocations        // exploration map

Complete Save Flow

WCSaveSubsystem::SaveGameAsync(SlotIndex)
  1. HasAuthority() guard - only server saves
  2. bIsSaving = true (prevents concurrent save)
  3. Apply GAS tag: WC.Save.State.SavingDisabled
     -> Blocks abilities tagged BlockedDuringSave
  4. Build UWCWorldSaveData:
     a. UWCWorldStateSubsystem::CaptureWorldSnapshot()
        -> Iterates all IWCSaveable actors -> GetActorSaveData()
     b. UWCCalendarSubsystem::SerializeTime(CalendarData)
  5. For each PlayerController (all connected players):
     Build UWCPlayerSaveData:
     a. UWCGASAttributeRegistry::SerializeAttributeState(GASAttributeData)
        -> Iterates all 150 pool slots, stores current values + base values
     b. UWCInventoryComponent::SerializeForSave(InventoryData)
        -> GUID-ordered TArray of FWCItemSaveRecord
     c. UWCEquipmentComponent::SerializeForSave(InventoryData)
        -> Equipment slot -> item GUID mapping
     d. UWCStoriesComponent::SerializeForSave(QuestData)
        -> Active quest progress + completed quest tag set
     e. UWCKnowledgeComponent::SerializeForSave(KnowledgeData)
        -> Achievements + codex + bestiary + tutorials
     f. DiscoveredLocations = ExplorationComponent::GetDiscoveredLocations()
  6. Compress save data (optional, configurable)
  7. AsyncSaveGameToSlot(SaveGameObject, SlotName, UserIndex)
  8. OnSaveComplete delegate fired
  9. Remove GAS tag: WC.Save.State.SavingDisabled
  10. Update WCSaveIndex slot metadata

Complete Load Flow

WCSaveSubsystem::LoadGameAsync(SlotIndex)
  1. Apply GAS tag: WC.Save.State.Loading
     -> Prevents ability activation during load
  2. AsyncLoadGameFromSlot(SlotName, UserIndex)
  3. OnLoadComplete -> RestoreWorldSection():
     a. UWCCalendarSubsystem::DeserializeTime(CalendarData)
     b. UWCWorldStateSubsystem::RestoreWorldSnapshot(Snapshot)
        -> Finds each actor by GUID in QuickLookupMap
        -> Dynamic actors: Respawn if not found, restore state
        -> Map-placed actors: RestoreFromSaveData() in-place
  4. For each saved PlayerSaveData -> match player:
     Listen server: match by NetID
     Dedicated server solo: use index 0
     a. UWCGASAttributeRegistry::DeserializeAttributeState(GASAttributeData)
     b. UWCInventoryComponent::DeserializeFromLoad(InventoryData)
     c. UWCEquipmentComponent::DeserializeFromLoad(InventoryData)
     d. UWCStoriesComponent::DeserializeFromLoad(QuestData)
     e. UWCKnowledgeComponent::DeserializeFromLoad(KnowledgeData)
     f. ExplorationComponent::SetDiscoveredLocations(DiscoveredLocations)
  5. Remove GAS tag: WC.Save.State.Loading

Level Transition Save

// Synchronous - called before Open Level
WCSaveSubsystem::SaveForLevelTransition()
  -> Same as SaveGameAsync but synchronous (blocks until complete)
  -> Uses a "transition" slot, not the regular numbered slot
  -> UWCGameInstance hooks OnPreLevelTransition automatically

// After level load, WCGameInstance::OnPostLevelTransition:
  -> LoadGameAsync(TransitionSlot)
  -> Restores world section for new level
  -> Restores all player sections

Autosave System

// Configuration:
Project Settings -> Dynamic RPG Worlds -> Save System:
  bEnableAutosave:         true
  AutosaveIntervalMin:     5.0    // minutes of playtime (not real time)
  AutosaveSlotIndex:       0      // which slot autosave uses
  bRetryOnBusy:            true   // retry if save already in progress

// Autosave timer: 1Hz playtime tick in WCSaveSubsystem::Tick()
// Increments PlaytimeAccumulator
// When >= AutosaveIntervalMin * 60:
  -> if bIsSaving: skip this tick, retry next (bRetryOnBusy)
  -> else: SaveGameAsync(AutosaveSlotIndex)

Making Custom Actors Saveable

// Implement IWCSaveable on your actor:
UCLASS()
class AMyDoor : public AActor, public IWCSaveable
{
    GENERATED_BODY()
public:
    virtual void GetActorSaveData(FWCActorSaveRecord& OutData) override
    {
        OutData.ActorGUID = ActorGUID;  // stable GUID assigned at construction
        OutData.Transform = GetActorTransform();
        // Serialize custom state to OutData.CustomData (TArray<uint8>):
        FMemoryWriter Writer(OutData.CustomData);
        Writer << bIsOpen;
        Writer << CurrentLockState;
    }
    virtual void RestoreFromSaveData(const FWCActorSaveRecord& InData) override
    {
        SetActorTransform(InData.Transform);
        FMemoryReader Reader(InData.CustomData);
        Reader >> bIsOpen;
        Reader >> CurrentLockState;
        if (bIsOpen) OpenDoor_NoAnimation();
    }
private:
    FGuid ActorGUID;    // must be stable - assign in constructor or BeginPlay
    bool bIsOpen = false;
    ELockState CurrentLockState = ELockState::Unlocked;
};

Cloud Save Integration

// Override in your GameInstance subclass:
UCLASS()
class UMyGameInstance : public UWCGameInstance
{
    GENERATED_BODY()
public:
    virtual void UploadToCloud_Implementation(
        const FString& SlotName, 
        const TArray<uint8>& SaveData) override
    {
        // Upload SaveData bytes to your cloud service (EOS, Steam, etc.)
        EOSCloudSave::Upload(SlotName, SaveData, OnUploadComplete);
    }
    
    virtual void DownloadFromCloud_Implementation(
        const FString& SlotName,
        FWCCloudSaveResultDelegate OnComplete) override
    {
        EOSCloudSave::Download(SlotName, [OnComplete](TArray<uint8> Data) {
            OnComplete.ExecuteIfBound(Data);
        });
    }
};

Editor Tools Guide

Complete reference for all 8 editor modules. Editor modules ship with the plugin but compile only in editor builds (WITH_EDITOR). They provide Content Browser factories, custom graph editors, and detail panel customizations.

Editor modules never ship in packaged games. All editor code is inside if WITH_EDITOR guards or in modules with Type = Editor in their Build.cs. Your game binary contains only runtime modules.

Content Browser Integration

All 8 editor modules register custom Content Browser categories. When you right-click in the Content Browser, you will see a "Dynamic RPG Worlds" top-level category with sub-categories for each system:

Right-click in Content Browser -> Dynamic RPG Worlds ->
  -> GAS (WCGASAllyEditor)      - 40 asset types
  -> Combat (WCCombatEditor)     - combat styles, combos
  -> Society (WCDynamicSocietyEditor) - 31 asset types
  -> Stories (WCStoriesEditor)   - quest, dialogue
  -> Inventory (WCInventoryEditor)    - items, loot tables
  -> Knowledge (WCKnowledgeSuiteEditor) - codex, bestiary, achievements
  -> Interaction (WCInteractionEditor)  - interaction data
  -> Audio (WCAudioSuiteEditor)         - music states, layers

WCGASAllyEditor (86 files, 40 factories)

FactoryCreatesContent Browser Color
UWCGASAttributeDefinitionFactoryAttribute pool Data AssetAmber #F59E0B
UWCGASHeritageRaceDataFactoryRace heritage Data AssetGreen #10B981
UWCGASHeritageClassDataFactoryClass heritage Data AssetGreen #10B981
UWCGASSkillTreeFactorySkill tree asset (opens in visual editor)Purple #8B5CF6
UWCGASSkillNodeFactoryIndividual skill nodePurple #8B5CF6
UWCGASFeatDefinitionFactoryFeat definitionGold #D4AA47
UWCGASStatusEffectDataFactoryStatus effect definitionRed #EF4444
UWCAbilityDefinitionFactoryAbility definition Data AssetBlue #4F8EF7
UWCGASAbilityDataFactoryAbility data asset (Phase 8 - scaffolded)Blue #4F8EF7
UWCGASEffectDataFactoryEffect data asset (Phase 8 - scaffolded)Blue #4F8EF7
+ 30 more factoriesVarious GAS asset typesVarious

WCDynamicSocietyEditor (64 files, 31 factories)

FactoryCreates
UWCFactionDefinitionFactoryFaction definition (name, tag, default standings)
UWCRelationshipRulesFactoryRelationship rules data (decay rates, thresholds)
UWCCrimeRulesetFactoryCrime rule configuration
UWCCalendarEventFactoryCalendar event definition (fires on date/time)
UWCSocialPersonalityPresetFactoryNPC personality presets (Paranoia, Generosity values)
+ 26 more factoriesSocial system asset types

WCStoriesEditor (14 files) — Visual Graph Editors

WCStoriesEditor provides two full visual graph editors built on UEdGraph:

Quest Graph Editor

Opens when you double-click a UWCQuestDefinition asset.
Node Types:
  Start Node      - quest accept entry point
  Objective Node  - kill/collect/reach/talk/interact objective
  Branch Node     - condition-based branching (tag check, stat check)
  Reward Node     - item grant, XP, ability unlock
  End Node        - quest completion

Connection Rules (UWCQuestGraphSchema):
  Start -> Objective (required)
  Objective -> Objective (sequential objectives)
  Objective -> Branch (optional branching)
  Branch -> Reward / End
  Reward -> End

Dialogue Graph Editor

Opens when you double-click a UWCDialogueDefinition asset.
Node Types:
  NPC Line Node   - NPC speaks (text, voice, animation hint)
  Player Choice Node - player response options
  Condition Node  - checks tag/stat/quest state
  Consequence Node - changes faction standing, grants item, fires event
  Exit Node       - ends dialogue

The graph is evaluated at runtime by UWCDialogueSubsystem.
Conditions are evaluated per-node before presenting choices to player.

WCCombatEditor (22 files)

Provides:
- UWCCombatStyleFactory: creates combat style data assets
- UWCComboDefinitionFactory: creates combo input sequence assets
- FWCAbilityDefinitionDetailsCustomization: custom Details panel for ability defs
  Adds a visual preview of the ability fragment stack
  Validates fragment compatibility warnings inline

WCInventoryEditor (scaffolding)

Build.cs present. Source directories created. Factory classes declared in headers. Planned 8 factories ready for implementation:

Factory ClassAsset TypeColor
WCItemDefinitionFactoryUWCItemDefinition (base item template)Gold #FFC832
WCLootTableDefinitionFactoryUWCLootTableDefinitionGold #FFC832
WCRecipeDefinitionFactoryCrafting recipeGold #FFC832
WCCurrencyDefinitionFactoryCurrency type definitionGold #FFC832
WCEquipmentSlotDefinitionFactoryEquipment slot configGold #FFC832
WCEquipmentSetDefinitionFactoryEquipment set (armor set bonus)Gold #FFC832
WCRarityConfigDataAssetFactoryRarity tier configurationGold #FFC832
WCActorFactory_WorldItemPlaces WCWorldItem actors from content browserGold #FFC832

WCKnowledgeSuiteEditor, WCInteractionEditor, WCAudioSuiteEditor

All three created March 31, 2026. Build.cs present, headers declared. Not yet implemented. These unblock designer workflows for creating knowledge, interaction, and audio content directly in the Content Browser.

ModulePlanned FactoriesColor Theme
WCKnowledgeSuiteEditorTutorial, Bestiary, Codex, Lore, Achievement definitionsPurple FColor(180,100,255)
WCInteractionEditorUWCInteractionDataFactory + AssetTypeActions_InteractionCyan FColor(0,200,210)
WCAudioSuiteEditorMusicStateDefinitionFactory + MusicLayerDefinitionFactoryBlue-Purple FColor(130,80,220)

Quick Reference

The daily cheat sheet. Most-used operations, data asset types, and common Blueprint patterns.

Most-Used Blueprint Operations

What You Want To DoHow
Read an attribute valueWCCoreLibrary::GetAttributeValue(Actor, DA_Attr_Health)
Apply damage to actorASC::ApplyGameplayEffectToTarget(GE_Damage, TargetASC)
Add item to inventoryInventoryComponent::AddItem(DA_Item, StackCount)
Equip an itemEquipmentComponent::EquipItem(ItemInstance, SlotTag)
Grant abilityWCAbilityLibrarySubsystem::GrantAbility(Actor, DA_Ability)
Activate abilityASC::TryActivateAbilitiesByTag(AbilityTag)
Check faction relationshipWCDynamicSocietySubsystem::GetRelationshipCategory(A, B)
Accept a questStoriesComponent::AcceptQuest(DA_Quest)
Show a widgetWCUIManagerSubsystem::PushLayer(WBP_Widget, EWCUILayer::HUD)
Play music transitionWCAudioSuiteSubsystem::RequestMusicTransition(DA_MusicState)
Save the gameWCSaveSubsystem::SaveGameAsync(SlotIndex)
Load the gameWCSaveSubsystem::LoadGameAsync(SlotIndex)
Discover a locationWCDiscoverySubsystem::DiscoverLocation(DA_Location)
Get in-game timeWCCalendarSubsystem::GetCurrentTime()
Unlock skill nodeWCGASSkillTreeComp::UnlockNode(DA_SkillNode)
Apply status effectWCGASStatusEffectComp::ApplyStatusEffect(DA_Effect, Source)
Unlock achievementWCKnowledgeComp::UnlockAchievement(DA_Achievement)
Trigger interactionWCInteractableComponent::TriggerRemote(Interactor)
Fast travelWCFastTravelSubsystem::FastTravelTo(DA_Location)
Check has gameplay tagASC::HasMatchingGameplayTag(WC.State.Stunned)

Data Asset Quick Reference

Asset ClassPurposeCreated Via
UWCGASAttributeDefinitionAttribute definition (pool slot)WCGASAllyEditor factory
UWCItemDefinitionItem template + fragmentsWCInventoryEditor factory
UWCAbilityDefinitionAbility template + fragmentsWCGASAllyEditor factory
UWCGASHeritageRaceDataRace definitionWCGASAllyEditor factory
UWCGASHeritageClassDataClass definitionWCGASAllyEditor factory
UWCGASSkillTreeSkill tree assetWCGASAllyEditor factory
UWCGASStatusEffectDataStatus effect definitionWCGASAllyEditor factory
UWCComboDefinitionCombo input sequenceWCCombatEditor factory
UWCInputSetupDataInput handler pipeline configMiscellaneous -> Data Asset
UWCInteractionDataInteractable configWCInteractionEditor factory
UWCFactionDefinitionFaction definitionWCDynamicSocietyEditor factory
UWCQuestDefinitionQuest templateWCStoriesEditor factory
UWCDialogueDefinitionDialogue treeWCStoriesEditor factory
UWCMusicStateDefinitionMusic state (layers)WCAudioSuiteEditor factory
UWCLootTableDefinitionItem drop tableWCInventoryEditor factory

Build.cs Module Names (for custom game code)

// In your game modules Build.cs:
PublicDependencyModuleNames.AddRange(new string[] {
    "Core", "CoreUObject", "Engine",
    // WC Framework modules:
    "WCGASCore",          // attributes, tags, MMC
    "WCInventory",        // items, equipment
    "WCCombat",           // combat abilities
    "WCInput",            // input handlers
    "WCInteraction",      // interactables
    "WCUIFramework",      // MVVM, HUD
    "WCGASAlly",          // heritage, skills, feats
    "WCDynamicSociety",   // factions, calendar, crime
    "WCRealms",           // level streaming, discovery
    "WCAudioSuite",       // music, audio layers
    "WCKnowledgeSuite",   // achievements, codex, bestiary
    "WCStories",          // quests, dialogue
    "WCAI",               // AI controllers, BT tasks
    "WCSaveSystem",       // save/load
    "DynamicRPGWorlds",   // integration layer (all classes)
});

// Editor-only tools (wrap in if condition):
if (Target.Type == TargetType.Editor) {
    PrivateDependencyModuleNames.AddRange(new string[] {
        "WCCombatEditor", "WCGASAllyEditor", "WCDynamicSocietyEditor",
        "WCStoriesEditor", "WCInventoryEditor"
    });
}

Most-Used Gameplay Tags

TagUse
WC.Combat.State.AttackingActivation owned tag during attack. Blocks other attacks.
WC.Combat.Event.DeathFired by framework when health reaches 0.
WC.Combat.Event.KillFired on the killer when they score a kill.
WC.State.DeadAdded to ASC on death. Remove to respawn.
WC.State.StunnedApplied by stun effects. Blocks abilities with BlockedByStun.
WC.Save.State.SavingDisabledApplied during save. Block abilities with this tag to prevent save during animation.
WC.Save.State.LoadingApplied during load. Prevents ability activation during restore.
WC.Item.Rarity.Common/.Uncommon/.Rare/.Epic/.LegendaryItem rarity tiers for UI color coding.
WC.Item.Slot.MainHand / OffHand / Head / Chest / Legs / Feet / Neck / RingEquipment slots.
WC.Heritage.Race.* / Class.*Heritage identification for conditions and restrictions.

Troubleshooting

Solutions to the most common issues. Check here before creating a support ticket.

Build Errors

Runtime Issues

Performance Tips

Frequently Asked Questions

QuestionAnswer
Can I use WCCombat without WCInventory?Yes, but weapon type checks (CheckWeaponRequirements) will always pass since there is no equipment to check against. The ability system will work, but weapon-gated abilities will always activate.
Can I use only some modules?Yes. Each feature module is optional. Only WCGASCore and DynamicRPGWorlds (Integration) are required. Add only the feature modules your game needs in your Build.cs.
Can I subclass WCGASCore attribute set?No. Never subclass UWCAttributeSet. The pool system only works with the pre-allocated slots. Create attributes as Data Assets instead.
How do I add a custom GAS ability type?Subclass UWCGameplayAbility_Combat (for combat) or UGameplayAbility (for general). Create a UWCAbilityDefinition Data Asset that references your class. The ability works with the existing grant/activate/revoke pipeline.
Does the framework work in blueprint-only projects?No. The plugin must compile C++ source. You need a C++ project. However, once compiled, everything is Blueprint-callable — your game can be 100% Blueprint.
Can I use this on mobile?The plugin targets Win64. Mobile requires platform verification. WCAudioSuite, WCUIFramework, and the Mover plugin all have mobile considerations. Contact support before targeting mobile.

Gameplay Tags Reference

All 348 native gameplay tags organized by domain. All declared in WCGASCore/Public/GAS/WCGameplayTags.h — zero duplicates verified.

State Tags (24) — WC.State.*

WC.State.DeadWC.State.DyingWC.State.StunnedWC.State.RootedWC.State.SilencedWC.State.InvisibleWC.State.InvulnerableWC.State.AirborneWC.State.CrouchingWC.State.SprintingWC.State.SwimmingWC.State.ClimbingWC.State.MountedWC.State.InDialogueWC.State.InCutsceneWC.State.InteractingWC.State.CastingWC.State.ChannelingWC.State.ExhaustedWC.State.ConfusedWC.State.FearedWC.State.CharmedWC.State.BleedingWC.State.OnFire

Combat Tags (48) — WC.Combat.*

WC.Combat.State.AttackingWC.Combat.State.BlockingWC.Combat.State.ParryingWC.Combat.State.DodgingWC.Combat.State.ChargingWC.Combat.State.AimingWC.Combat.State.ReloadingWC.Combat.State.ScopedWC.Combat.Event.DeathWC.Combat.Event.KillWC.Combat.Event.HitWC.Combat.Event.BlockWC.Combat.Event.ParryWC.Combat.Event.DodgeWC.Combat.Event.CriticalHitWC.Combat.Weapon.Type.Melee.SwordWC.Combat.Weapon.Type.Melee.AxeWC.Combat.Weapon.Type.Melee.MaceWC.Combat.Weapon.Type.Melee.DaggerWC.Combat.Weapon.Type.Melee.SpearWC.Combat.Weapon.Type.Ranged.BowWC.Combat.Weapon.Type.Ranged.CrossbowWC.Combat.Weapon.Type.Ranged.StaffWC.Combat.Weapon.Type.Ranged.GunWC.Damage.Type.Physical.SlashWC.Damage.Type.Physical.PierceWC.Damage.Type.Physical.BluntWC.Damage.Type.Magic.FireWC.Damage.Type.Magic.IceWC.Damage.Type.Magic.LightningWC.Damage.Type.Magic.PoisonWC.Damage.Type.Magic.HolyWC.Damage.Type.Magic.DarkWC.Damage.Type.TrueWC.Damage.Resistance.PhysicalWC.Damage.Resistance.MagicWC.Damage.Resistance.FireWC.Damage.Resistance.IceWC.Damage.Resistance.Lightning

Item Tags (36) — WC.Item.*

WC.Item.Type.WeaponWC.Item.Type.ArmorWC.Item.Type.ConsumableWC.Item.Type.AccessoryWC.Item.Type.QuestWC.Item.Type.CurrencyWC.Item.Type.CraftingWC.Item.Type.AmmoWC.Item.Rarity.CommonWC.Item.Rarity.UncommonWC.Item.Rarity.RareWC.Item.Rarity.EpicWC.Item.Rarity.LegendaryWC.Item.Rarity.MythicWC.Item.Slot.MainHandWC.Item.Slot.OffHandWC.Item.Slot.TwoHandedWC.Item.Slot.HeadWC.Item.Slot.ChestWC.Item.Slot.LegsWC.Item.Slot.FeetWC.Item.Slot.HandsWC.Item.Slot.NeckWC.Item.Slot.Ring1WC.Item.Slot.Ring2WC.Item.Slot.Backpack

Society / Faction Tags (40) — WC.Society.*

WC.Society.Faction.CityGuardWC.Society.Faction.BanditsWC.Society.Faction.MerchantsWC.Society.Faction.MagesGuildWC.Society.Faction.ChurchWC.Society.Faction.PlayerWC.Society.Faction.NeutralWC.Society.Crime.AssaultWC.Society.Crime.MurderWC.Society.Crime.TheftWC.Society.Crime.TrespassingWC.Society.Crime.VandalismWC.Society.Relationship.HostileWC.Society.Relationship.NeutralWC.Society.Relationship.FriendlyWC.Society.Relationship.Allied

Save System Tags (8) — WC.Save.*

WC.Save.State.SavingDisabledWC.Save.State.LoadingWC.Save.State.SavingWC.Save.State.ErrorWC.Save.State.CloudSyncWC.Save.State.LevelTransitionWC.Save.Slot.AvailableWC.Save.Slot.Locked

Heritage Tags (28) — WC.Heritage.*

WC.Heritage.Race.HumanWC.Heritage.Race.ElfWC.Heritage.Race.DwarfWC.Heritage.Race.OrcWC.Heritage.Race.HalflingWC.Heritage.Race.UndeadWC.Heritage.Race.BeastWC.Heritage.Class.WarriorWC.Heritage.Class.MageWC.Heritage.Class.RogueWC.Heritage.Class.PriestWC.Heritage.Class.RangerWC.Heritage.Class.PaladinWC.Heritage.Class.Necromancer

Ability Tags (32) — WC.Ability.*

WC.Ability.Combat.LightAttackWC.Ability.Combat.HeavyAttackWC.Ability.Combat.ChargeAttackWC.Ability.Combat.ComboFinisherWC.Ability.Combat.BlockWC.Ability.Combat.ParryWC.Ability.Combat.DodgeWC.Ability.Combat.WeaponSwapWC.Ability.Combat.AimDownSightsWC.Ability.Combat.ReloadWC.Ability.Magic.FireballWC.Ability.Magic.IceSpikeWC.Ability.Magic.HealSelfWC.Ability.Magic.TeleportWC.Ability.Passive.HealthRegenWC.Ability.Passive.StaminaRegen

Patterns and Best Practices

Design patterns used throughout the framework and anti-patterns to avoid.

Fragment Pattern (Items and Abilities)

DO: Use Fragments

// Item Definition - compose behaviors:
DA_Item_PoisonedDagger:
  Fragments:
    WCFragment_Equippable (MainHand, model)
    WCFragment_WeaponData (Dagger type, trace sockets)
    WCFragment_Rarity (Uncommon)
    WCFragment_AttributeModifiers (+5 Dexterity on equip)
    WCFragment_Consumable_Poison   // custom poison on-hit

// Zero class hierarchy. Mix any fragments.
// Add new behavior = add new fragment class.

DO NOT: Deep Inheritance

// Anti-pattern - do not do this:
class UWCItemDefinition {}
  class UWCWeaponDefinition : UWCItemDefinition {}
    class UWCMeleeWeaponDefinition : UWCWeaponDefinition {}
      class UWCDaggerDefinition : UWCMeleeWeaponDefinition {}
        class UWCPoisonedDaggerDefinition : UWCDaggerDefinition {}

// This creates class explosion, makes cross-cutting
// features impossible, and violates the framework rules.

Cross-Module Communication Pattern

DO: Tags + Subsystems + Interfaces

// Good: WCCombat tells other systems about death
// via a Gameplay Event tag:
ASC->AddGameplayEventTag(WC.Combat.Event.Death);

// Any module can listen:
WCKnowledgeComp->ListenForGameplayTag(
    WC.Combat.Event.Death, OnEnemyDied);
WCStoriesComp->ListenForGameplayTag(
    WC.Combat.Event.Death, OnKillObjective);

DO NOT: Direct Cross-Module References

// BAD - WCCombat directly referencing WCStories:
#include "WCStories/StoriesComponent.h"  // VIOLATION

void UWCCombatSystem::OnKill(AActor* Killed) {
    // Direct reference to another feature module:
    UWCStoriesComponent* Stories = ...;
    Stories->UpdateKillObjective(Killed);  // WRONG
}
// This creates circular dependencies and breaks
// module independence.

Data Asset vs Runtime Instance Pattern

// UWCItemDefinition = the RECIPE (immutable, shared, Data Asset)
//   One instance shared by all copies of "Iron Sword"
//   Stored in content browser, referenced by soft pointer

// UWCItemInstance = the OBJECT in your inventory
//   Created at runtime, unique GUID, has per-instance state
//   Holds reference to its Definition (not a copy)

// This pattern is used throughout:
// UWCItemDefinition / UWCItemInstance  (inventory)
// UWCAbilityDefinition / FGameplayAbilitySpec (abilities)
// UWCQuestDefinition / FWCActiveQuestData (quests)

Subsystem Pattern

// Feature modules expose services via Subsystems, NOT singletons:

// Access a subsystem anywhere:
UWCSaveSubsystem* SaveSys = World->GetSubsystem<UWCSaveSubsystem>();
UWCDynamicSocietySubsystem* Social = World->GetSubsystem<UWCDynamicSocietySubsystem>();
UWCUIManagerSubsystem* UI = GameInstance->GetSubsystem<UWCUIManagerSubsystem>();

// Never create global/static service objects.
// UE Subsystems are lifecycle-managed, safe to null-check,
// and work correctly with editor PIE and multiplayer.

GAS Cue Pattern (Visual Effects)

// All VFX/SFX use Gameplay Cues (client-side, cosmetic only):
// NEVER spawn VFX on server. Never in ability EndAbility.

// In combat ability, trigger a cue on hit:
FGameplayCueParameters CueParams;
CueParams.Location = HitLocation;
CueParams.Normal = HitNormal;
ASC->ExecuteGameplayCue(WC.GameplayCue.Hit.Physical.Slash, CueParams);

// UGameplayCueNotify_Burst on client:
// -> SpawnNiagaraSystemAtLocation(SwordSlashVFX)
// -> SpawnSoundAtLocation(SwordClangSFX)

// Why: Gameplay Cues fire only on clients, are unimportant
// for server state, and can be skipped if too many.

Attribute Modification Pattern

// ALWAYS modify attributes via GameplayEffect:
void ModifyHealth(AActor* Target, float Delta) {
    // RIGHT:
    UGameplayEffect* GE = NewObject<UGameplayEffect>(GetTransientPackage());
    // ... configure modifiers ...
    ASC->ApplyGameplayEffectToSelf(GE, 1.0f, ASC->MakeEffectContext());

    // WRONG - never do this:
    // AttributeSet->Health.SetCurrentValue(NewValue);  // bypasses GAS replication
}

Anti-Patterns to Absolutely Avoid

Roadmap

Current status and planned work as of March 31, 2026. Priority 1 items block designer workflows. Priority 2 is polish. Priority 3 is optional.

1
Priority 1 — Designer-Blocking
Implement WCInventoryEditor source files (8 factories)
Implement WCKnowledgeSuiteEditor (5 factories)
Implement WCInteractionEditor (2 factories)
Implement WCAudioSuiteEditor (2 factories)
Update CLAUDE.md: 4 new editor modules + 3 WCInput handlers + module count (19 -> 23)
2
Priority 2 — Polish
WCStoriesEditor Phase 5-7: 4 BP factories, graph settings, spline policies
WCGASAlly Phase 8: UWCGASAbilityData + UWCGASEffectData convenience assets
WCDynamicSociety Phase 9-10: Generosity/Volatility, per-event decay curves
Clean stale "Stubs" comments in WCPlayerController.h and WCGameInstance.h
Fix Wcinteractionlibrary.h case (Linux server compatibility)
Fill FAB Marketplace fields in DynamicRPGWorlds.uplugin
3
Priority 3 — Optional Low Priority
WCFragment_Rarity: implement or remove GAS integration TODOs
WCGASAlly: StatusEffect Phase 6 ValidateEffectSaveData cross-reference
WCAI: WCRoutineGoal_GuardPost placeholder comment cleanup
Add Linux to .uplugin SupportedTargetPlatforms
Remove Android SecurityToken from DefaultEngine.ini for public builds
4
Completed (as of March 31, 2026)
WCSaveSystem: full 805-line implementation, all 6 serializers
WCCombat: all v4 bugs resolved (replication, NetSerialize, scope, chain)
WCInput: buffer wired, all 11 handlers confirmed
WCDynamicSociety Phase F: naming compliance, CoreRedirects, 5852-line file
WCStories: save/load complete, graph editors live, build verified 3/31
WCInventory: save/load, FinalMultiplier, tooltip aggregation, IWYU
WCAI: layer violation resolved, faction filter confirmed working
WCGASAlly: StatusEffect phases 2-6 complete, debug library implemented
Phase E build hardening: bWarningsAsErrors on all 19 original modules

API Reference

Key classes and methods. Click any class header to expand. For full IntelliSense, reference the header files directly in VS2022.

UWCGASAttributeRegistry: UWorldSubsystemWCGASCore
float GetAttributeValue(AActor* Actor, UWCGASAttributeDefinition* Def)
Read current value of an attribute from any actor with an ASC. Null-safe. Returns 0.0f if actor has no ASC or attribute not registered.
float GetBaseValue(AActor* Actor, UWCGASAttributeDefinition* Def)
Read the base (unmodified) value of an attribute, before any GE modifiers are applied.
void SerializeAttributeState(FWCAttributeSaveData& OutData)
Serialize all 150 pool slot values for save system. Called by WCSaveSubsystem::SerializePlayer().
void DeserializeAttributeState(const FWCAttributeSaveData& InData)
Restore all attribute values from save data. Sets current and base values.
FWCAttributeChangedDelegate& GetAttributeChangedDelegate(UWCGASAttributeDefinition* Def)
Get the delegate that fires when this attribute changes. Bind to update UI or trigger game logic.
UWCInventoryComponent: UActorComponentWCInventory
UWCItemInstance* AddItem(UWCItemDefinition* Definition, int32 StackCount = 1)
Add item(s) to inventory. Creates a new UWCItemInstance with a stable GUID. Returns the instance. Handles auto-stacking if WCFragment_Stackable is present. Server only.
bool RemoveItem(UWCItemInstance* Instance, int32 Count = 1)
Remove count from item stack. Destroys instance if stack reaches 0. Returns false if not enough stack or item not found.
bool UseItem(UWCItemInstance* Instance)
Use the item. Invokes WCFragment_Consumable logic if present. Applies GEs, reduces stack. Returns false if item cannot be used (combat restriction, wrong state).
bool TransferItem(UWCItemInstance* Instance, UWCInventoryComponent* TargetInventory)
Move item from this inventory to another. Used for trading, looting, dropping.
void SerializeForSave(FWCInventorySaveData& OutData)
Serialize all items with GUID ordering for stable save/load. Called by WCSaveSubsystem.
void DeserializeFromLoad(const FWCInventorySaveData& InData)
Restore inventory from save data. Reconstructs UWCItemInstance objects from GUIDs + state.
UWCSaveSubsystem: UGameInstanceSubsystemWCSaveSystem
void SaveGameAsync(int32 SlotIndex)
Begin async save to slot. Applies WC.Save.State.SavingDisabled tag during save. Calls all 6 module serializers. Fires OnSaveComplete when done. Server only.
void LoadGameAsync(int32 SlotIndex)
Begin async load from slot. Restores world section then all player sections. Server only.
void SaveForLevelTransition()
Synchronous save to transition slot. Blocks until complete. Call before Open Level.
TArray<FWCSaveSlotInfo> GetSaveSlots()
Returns metadata for all save slots (timestamp, level name, playtime, screenshot thumbnail reference).
bool DeleteSaveSlot(int32 SlotIndex)
Delete a save slot. Returns false if slot does not exist.
UWCDynamicSocietySubsystem: UWorldSubsystem (5852 lines)WCDynamicSociety
float GetStanding(AActor* Source, AActor* Target)
Returns -100..+100 relationship standing between two actors based on their faction tags.
EWCRelationship GetRelationshipCategory(AActor* Source, AActor* Target)
Returns Hostile / Neutral / Friendly / Allied based on standing thresholds.
void ModifyRelationship(AActor* Source, FGameplayTag FactionTag, float Delta)
Change standing between source actor and a faction by Delta. Clamped to -100..+100. Fires threshold delegates when crossing key values.
void ServerModifyNPCRelationship_Implementation(FGuid NPCID, FGuid PlayerID, float Delta)
Server RPC for modifying NPC-specific relationship (not faction-wide). Validates IDs, calls ModifyRelationship. Was empty before v5 fix.
UWCInputManagerComponent: UActorComponentWCInput
void RegisterHandler(UWCInputHandler* Handler, int32 Priority)
Register a handler in the pipeline at the given priority. Handler is inserted in sorted position. Lower priority = higher precedence.
void UnregisterHandler(UWCInputHandler* Handler)
Remove handler and correctly unbind its Enhanced Input actions (bug fixed v4).
void SetInputSetup(UWCInputSetupData* SetupData)
Configure the entire handler pipeline from a data asset. Clears existing handlers and registers new ones from the asset.