A 2.5D turn-based RPG built in C++ on a custom engine, using an Octopath Traveler-inspired isometric presentation. The project implements turn-based combat, attribute calculations, sprite animation, and an XML-driven content pipeline.
Gameplay trailer
Core systems
The project is built around several gameplay and engine systems:
- Turn-based combat: A state machine orchestrates turn flow through Round, SkillSelection, SkillExecution, and BattleSettlement states.
- Attributes: Character stats (Health, Mana, Attack, Defense, Speed) drive initiative ordering, damage formulas, and skill scaling.
- Skills: Abilities define custom animations, mana costs, and status effects integrated with combat state transitions.
- Content pipeline: XML files configure characters, skills, dungeons, and encounters without recompiling C++ source.
- 2.5D lighting: Dynamic lighting adjusts sun direction, intensity, and ambient light alongside depth-sorted sprite rendering.
- Physics and collision: Actor movement uses depth-aware collision in 2.5D space.
- Animation: A state-driven animation controller synchronizes playback with combat turn phases.
- Interface: HUD widgets cover combat actions, skill selection, targeting, turn queues, and dungeon progression.
System architecture
graph TD
Game["Game - State Machine"]
Clock["Clock - Time Management"]
PlayerCtrl["PlayerController - Input Handling"]
TurnBase["TurnBaseSubsystem - Turn Management"]
BattleState["Battle States - State Stack"]
Initiative["Initiative Queue - Action Ordering"]
Character["Character - Battle Entity"]
Skills["Skill System - Ability Execution"]
Buffs["Buff System - Status Effects"]
PakData["PakData - XML Parsing"]
Definitions["Definitions - Character/Skill/Dungeon"]
Map["Map System - Scene Generation"]
Scene["Scene - 2.5D Rendering"]
Animation["Animation System - State-Driven Playback"]
Lighting["Lighting System - Dynamic Illumination"]
WidgetSubsystem["WidgetSubsystem - Widget Management"]
BattleUI["Battle UI - HUD Widgets"]
SkillUI["Skill UI - Selection & Targeting"]
Game --> TurnBase
Game --> PlayerCtrl
Game --> Clock
Game --> Scene
TurnBase --> BattleState
BattleState --> Initiative
Initiative --> Character
Character --> Skills
Character --> Buffs
Character --> Animation
Skills --> Definitions
Character --> Definitions
PakData --> Definitions
Map --> PakData
Scene --> Map
Scene --> Lighting
Scene --> Animation
WidgetSubsystem --> BattleUI
WidgetSubsystem --> SkillUI
BattleUI --> Character
SkillUI --> Skills
Turn-based combat system
The TurnBaseSubsystem drives combat through a hierarchical state machine. Combat cycles through predictable phases: round initialization determines turn order, skill selection accepts player input, skill execution resolves damage and effects, and battle settlement evaluates victory or defeat.
Initiative and action ordering
Characters roll initiative at the start of battle based on their Speed attribute. The system maintains an ordered queue for action dispatch, updating positions when actions or modifiers alter turn timing.
Skill execution pipeline
Skills trigger character-specific animations tied to combat states. The pipeline checks prerequisites like mana and cooldowns, applies damage or buffs, and broadcasts events to update the interface.
2.5D scene and lighting system
The dynamic lighting system adjusts sun direction, sunlight intensity, and ambient color in real time to shift scenes from bright day to dusk.
Scene transitions and level progression
The game shifts between exploration and battle scenes by repositioning the camera, updating lighting parameters, and switching the active UI context.
User interface system
The UI layer manages player interactions across the main menu, skill and target selection, turn order tracking, and dungeon progression.
Level progression and unlocking
Dungeon progression tracks completed encounters and unlocks subsequent stages, providing visual indicators for locked and unlocked states.
Data-driven architecture
XML configuration files drive content definitions. Character files specify baseline attributes, skill lists, and animation mappings. Skill files declare costs, cooldowns, and effects, while dungeon files configure enemy encounters.
XML configuration system
<!-- Character Definition Example -->
<Character name="Warrior" health="100" mana="30" attack="15" defense="10" speed="8">
<Skill name="BasicAttack" manaCost="0" cooldown="0" />
<Skill name="PowerStrike" manaCost="20" cooldown="2" />
</Character>
<!-- Dungeon Definition Example -->
<Dungeon name="Forest Ruins" scene="ForestScene" preRequest="None">
<Enemy name="Goblin" healthMultiplier="1.0" damageMultiplier="1.0" />
<Enemy name="Orc" healthMultiplier="1.5" damageMultiplier="1.2" />
</Dungeon>
Map generation from image data
Maps can also be generated from image files where pixel colors map to tile IDs, allowing level layouts to be drawn in image editors.
Design decisions
Modular state stack
The combat loop uses a state stack where each combat phase (initiative, input, execution, settlement) runs independently. This keeps turn sequencing logic separate from skill resolution.
Attribute-driven mechanics
Combat calculations read directly from entity attributes rather than maintaining separate combat formulas per character class.
Configuration decoupling
XML definitions allow tweaking character balance, encounters, and skill parameters without rebuilding the executable.
Event-driven updates
Combat systems communicate state changes through events, decoupling gameplay rules from UI animations and sound triggers.
Debug tooling
Major systems include debug views and console triggers to inspect turn queues, trace attribute modifiers, and verify skill outcomes directly.