DragonSword Legend
DragonSword Legend is a Korean-language Windows-console RPG: stat-based combat, five wearable equipment slots fed by around 185 hand-authored items, around eight regional monster zones each capped by a scaling boss, a quest chain, an inventory, and leveling with skill points to spend. It's the earliest thing here — an ambitious, self-taught solo build whose depth lives in its data tables and its text UI rather than its polish.
Where the journey started
Before any engine or framework, this was the project that taught me how a game is actually wired together. There are no graphics and no audio library — it is pure C drawing into the Windows console, with colour attributes and cursor positioning standing in for sprites.
What makes it hold up is scope: rather than one clever mechanic, it commits to the full RPG loop — fight monsters, earn experience and gold, level up, spend the gold on gear across five wearable equipment slots, take quests, and push deeper into harder zones — and every piece of that loop is backed by data tables I wrote by hand.
The whole game is hand-authored data
Coded item catalogue
Every item carries a numeric code, and an item() lookup decodes the leading digit into a category — weapons (1xxx), head armour (2xxx), body armour (3xxx), shoes (4xxx), jewelry (5xxx), consumables (6xxx) and quest items (7xxx) — then indexes the right table. Around 185 entries, each with its own price, attack, speed, defence, HP bonus and required level. The first five categories are wearable equipment slots; consumables and quest items are handled separately.
Eight regional monster zones
A mon() lookup maps a monster code into one of around eight zones — open field, desert, mountain, undead pirates, sea, outback, the dead lands and the final kingdom — each a tier of progressively tougher enemies. The last entry in every zone is a boss with a huge HP and attack spike over the rank-and-file.
Quest chain
A quest() table holds named missions keyed by progress, each pointing at the monster codes to defeat (or items to gather) and the gold, experience and item reward on completion — a story spine threaded through the zones rather than ad-hoc fetch tasks.
One decode per concern
Items, monsters and quests each resolve through a single typed struct returned by code, so gameplay code asks for an entity by number and gets a fully populated record back. Adding content meant adding a row, not touching logic — the discipline that kept a project this size editable by one person.
A speed gauge decides turns; experience reshapes the hero
Turn battle and leveling
Combat is driven by a speed gauge: each tick adds the combatant's SPD, and once a gauge crosses its threshold that side acts — so a faster build simply gets more turns. The player picks Attack, Use item, Dodge (evade) or Flee — healing runs through the Item action, not a separate menu entry. The player's attack lands at full value, while incoming enemy damage is mitigated by the player's defence. On a kill, expadd() animates the experience bar filling, and each level-up raises attack, HP, defence and speed while granting skill points — the SP gain scaling up by level band — which the player allocates to push a build further.
- SPD fills each combatant's gauge
- Gauge crosses threshold → that side acts
- Attack · Item · Dodge · Flee
- Defence mitigates incoming damage
- Kill → EXP, gold, level-up + skill points
A text interface made to feel like a real screen
Cursor-addressed drawing
A gotoxy() wrapper over SetConsoleCursorPosition moves the caret anywhere on screen, with companion wherex/wherey helpers reading it back — so menus, the battle layout and the inventory redraw in place instead of scrolling endlessly.
Colour as feedback
A textColor() wrapper over SetConsoleTextAttribute switches foreground colours from windows.h, so action prompts, damage numbers and headings read at a glance in an all-text screen.
Equipment view
The inventory tracks a set[] of equipped items across the five wearable slots plus stacks of consumables and quest items; equipping a piece folds its attack, speed, defence and HP into the live stats, and the screen resizes via mode con so battle, inventory and stat allocation each get a fitting canvas.
Keypress navigation
Most navigation reads keys directly with _getch(), so the player moves through the maps and the inventory with single presses; some menus, like the battle menu, take numeric line input via scanf — the closest a console build gets to feeling responsive.
What it's built on
- Language
- CPlain structsCode-keyed lookups
- Rendering
- Windows console (windows.h)SetConsoleCursorPositionSetConsoleTextAttribute
- Input
- conio.h _getchmode con sizing
- Tooling
- Visual StudioBuilt in 2015
An early, ambitious solo RPG in pure console C — the hand-built item, monster and quest tables and the text UI behind it are where I first learned to think in systems.
