Finally, a reason to be one.
A high-fantasy roguelike where you defeat ancient evils through the rhythm of your keystrokes. Descend into the ruins of a shattered kingdom. Face corrupted knights, void walkers, and eldritch horrors. Type to survive. Die repeatedly.
This is a personal hobby project — a fun "fuck around and find out" experiment in terminal game development.
- Full 10-floor dungeon progression with zone-themed encounters
- Combat with typing, combos, and flow states
- Lore-integrated typing -- words match the zone, enemy, and story
- Corruption effects on typing -- narrative state warps your words
- 5 playable classes with distinct stats
- Skill tree combat integration -- damage, crits, evasion, damage reduction
- Basic spellcasting (Tab to toggle, 1-9 to select)
- Items, shops, rest sites, treasure rooms
- Faction-voiced NPCs -- merchants and healers speak with personality
- Authored encounters -- scripted narrative moments during exploration
- Run modifiers -- difficulty scaling for challenge modes
- Tutorial system (5 phases)
- Help overlay (press
?-- works in combat!) - Meta-progression persists -- Ink earned, upgrades bought, history tracked across runs
- Faction reputation system (displayed in Stats)
- Boss-specific dialogue during boss fights
- Narrative progression through typed sentences
- EventBus architecture — systems communicate dynamically
- Immersive combat — per-keystroke feedback, enemy damage states, player avatars
- Visual effects LIVE — floating damage numbers, screen shake, hit flash, combos
- Battle summaries — stats shown after every fight (WPM, damage, accuracy)
- Run summaries — comprehensive stats at victory/game over
- Three endings — Final Silence, First Word, Third Grammar
- Boss phase transitions — multi-phase fights with escalating mechanics
- Quest log — main quests track your progression (press
l) - Lore journal — discovered lore fragments collected (press
j) - Narrative engine wired — lore discovery, mystery progress, chapter advancement
Persistence, Endings & Balance — The game actually has a real ending now:
- Meta-progression persists — Ink, upgrades, and run history save to disk (RON format, XDG paths)
- Three endings — Floor 10 boss routes to EndingChoice scene with three doors
- Boss phase transitions — Hollow Knight phase 2 at 50% HP, Void Herald phases at 66%/33%
- Balance pass — enemy HP scaling tuned, time limits tightened, first upgrade costs reduced 40%
- Quest log scene — main quests activate on game start, viewable with
lkey - Lore journal scene — discovered fragments browseable with
jkey - Narrative engine wired — lore feeds mystery progress, faction choices track ending tendency
- Lore fragments integrated — 30% chance of authored lore during exploration
- Run summaries with Ink — proper RunSummary built on death/victory, Ink calculated and awarded
- Meta preserved across restarts — upgrades and history survive death/restart
- Deep Lore (1,016 lines) — Three Ages, The Sundering, full cosmology (referenced but not directly surfaced)
- World System (607 + 274 lines) — Location simulation
- Characters (329 lines) — 4 NPCs defined but not appearing in dungeons yet
- Quest objective completion not yet triggered by gameplay events
- NPC encounters (characters.rs) not appearing in dungeons
- Mid-run save/load not implemented (save.rs exists but unused)
- Spell damage calculations are placeholder
- Item effects are minimal
- Some run stats (total damage, perfect words) not yet tracked across full run
This is a learning project. It compiles. It runs. It's fun to hack on. Don't expect polish. Expect to die.
"Wait, there's actual lore?" — Yes. Thousands of lines of it. Most of it unused.
Keyboard Warrior is set in a dark fantasy world recovering from The Sundering — a cataclysm caused when Archon Malachar tried to pierce the Veil between worlds and become a god.
| Age | Era | What Happened |
|---|---|---|
| Age of Dawn | Before time | Gods walked among mortals. Dragons spoke prophecy. |
| Age of Crowns | 3,000 years | Mortal kingdoms rose. The great Orders were founded. |
| Age of Shadow | Now (47 years) | The Sundering tore reality. The Blight spreads. |
| Faction | Philosophy |
|---|---|
| Mages Guild | Arcane knowledge is the key to sealing the breach |
| Temple of Dawn | Divine light will purge the corruption |
| Rangers of the Wild | Nature's balance must be restored |
| Shadow Guild | Information is power; secrets are currency |
| Merchant Consortium | Trade continues; neutrality profits |
- Floors 1-2: The Shattered Halls — ruined castle, echoes of the old kingdom
- Floors 3-4: The Sunken Archives — flooded library, forbidden knowledge
- Floors 5-6: The Blighted Gardens — corrupted greenhouse, twisted nature
- Floors 7-8: The Clockwork Depths — ancient machinery, dwarven ruins
- Floors 9-10: The Void's Edge — reality breaks down, glimpses of the beyond
- Floor 11+: The Breach — where The Sundering occurred
You are not who you think you are. As you descend, fragments of memory surface. The truth waits at the bottom — and three possible endings: Final Silence, First Word, or Third Grammar.
Keyboard Warrior is a typing game that feels like an RPG. Every keystroke has weight. Combos build momentum. Flow states reward consistency. The dungeon unfolds through your fingers.
It's also a pun. You're literally a warrior. With a keyboard. Fighting things. In a terminal. Look, the name was available.
Inspired by ttyper, Undertale, Balatro, Hades, and Dark Souls.
# Clone and build
git clone https://github.com/cd4u2b0z/keyboard-warrior.git
cd keyboard-warrior
cargo build --release
# Run the game
./target/release/keyboard-warriorRequirements:
- Rust 1.70+
- A terminal with Unicode support
- Nerd Font recommended for icons
╭─────────────────────────────────────────────────────────────────────╮
│ FLOOR 3 — The Whispering Archives HP ████████░░ 42/50 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Shadow Scribe │
│ ████████░░░░░░░░ 34/80 HP │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ Type: 「 arcane manuscript 」 │ │
│ │ ~~~~~~ ___________ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ Combo: 7x · Flow: BUILDING · 89 WPM · 96% │
│ │
╰─────────────────────────────────────────────────────────────────────╯
[Tab] Spells [?] Help [Esc] Flee
- Explore — Navigate a 10-floor dungeon with procedural rooms
- Fight — Type words to attack enemies; accuracy and speed deal damage
- Grow — Level up, find items, learn spells, build your character
- Die — Roguelike permadeath with meta-progression between runs
Words appear. You type them. Damage happens.
- Correct characters flash green; errors flash red
- Combos build with consecutive correct words (up to 3x damage)
- Flow states reward consistent typing rhythm
- Time pressure adds urgency without being punishing
Each floor contains rooms: combat encounters, elite enemies, shops, rest sites, treasure, and random events. Choose your path. Manage your resources. Reach the boss.
| Key | Action |
|---|---|
j/k or ↑/↓ |
Navigate menus |
Enter or e |
Confirm / Explore |
Backspace |
Fix typing errors |
Esc |
Back / Flee combat |
? |
Toggle help overlay |
i |
Inventory |
s |
Character stats |
l |
Quest log |
j |
Lore journal |
Tab |
Toggle spell mode (combat) |
1-9 |
Select spell (spell mode) |
| Class | Style | Strength |
|---|---|---|
| Wordsmith | Balanced | +10% damage, starts with Heal |
| Scribe | Spellcaster | +25% MP, faster spell learning |
| Spellweaver | Glass cannon | +50% spell damage, -20% HP |
| Barbarian | Tank | +30% HP, +15% damage, no spells |
| Trickster | Luck-based | Random bonuses, critical hits |
See Project Status for the full breakdown.
keyboard-warrior/
├── src/
│ ├── main.rs # Game loop, input handling (870+ lines)
│ │
│ ├── game/ # Core game logic (~21,400 lines, 43 files)
│ │ ├── mod.rs # Module exports
│ │ │
│ │ │ # ─── CORE SYSTEMS (wired up) ───
│ │ ├── state.rs # Game state, scene management (600+)
│ │ ├── combat.rs # Combat state, skill integration (600+)
│ │ ├── combat_engine.rs # Damage calc, word generation (510)
│ │ ├── combat_events.rs # Combat event handling (282)
│ │ ├── player.rs # Player, classes, leveling (381)
│ │ ├── enemy.rs # Enemy definitions (366)
│ │ ├── dungeon.rs # Floor/room generation (308)
│ │ ├── items.rs # Equipment, consumables (455)
│ │ ├── spells.rs # Spell definitions (281)
│ │ ├── events.rs # Game events system (305)
│ │ ├── stats.rs # Statistics tracking (559)
│ │ │
│ │ │ # ─── FEEL & UX (wired up) ───
│ │ ├── typing_feel.rs # Combo, flow, rhythm (550)
│ │ ├── tutorial.rs # 5-phase tutorial (617)
│ │ ├── help_system.rs # Help overlay (750)
│ │ ├── config.rs # Game configuration (434)
│ │ │
│ │ │ # ─── PROGRESSION (wired up) ───
│ │ ├── faction_system.rs # Faction reputation (815)
│ │ ├── meta_progression.rs # Ink/unlocks framework (612)
│ │ ├── save.rs # Save/load system (299)
│ │ │
│ │ │ # ─── INTEGRATED SYSTEMS (v0.5.1) ───
│ │ ├── event_bus.rs # Central event messaging (594)
│ │ ├── narrative_seed.rs # Corruption effects on typing (906)
│ │ ├── skills.rs # Skill trees → combat (490+)
│ │ ├── voice_system.rs # Faction NPC dialogue (794)
│ │ ├── encounter_writing.rs # Authored exploration events (783)
│ │ ├── run_modifiers.rs # Difficulty scaling (632)
│ │ │
│ │ │ # ─── IMMERSION OVERHAUL (v0.5.1) ───
│ │ ├── typing_impact.rs # Per-keystroke damage tracking (372)
│ │ ├── dialogue_engine.rs # Context-aware enemy dialogue (384)
│ │ ├── enemy_visuals.rs # Progressive ASCII damage (412)
│ │ ├── pacing.rs # Tension/breather beats (370)
│ │ ├── player_avatar.rs # Player visual presence (381)
│ │ ├── combat_immersion.rs # Unified immersion wrapper (498)
│ │ │
│ │ │ # ─── NARRATIVE & LORE (v0.6.0) ───
│ │ ├── narrative.rs # Faction enum, Chapter enum, dialogue structs (486)
│ │ ├── narrative_integration.rs # NarrativeEngine coordinator (649)
│ │ ├── lore_fragments.rs # 9 discoverable lore pieces (752)
│ │ ├── quests.rs # Quest system, 3 main quests (368)
│ │ ├── world_integration.rs # Zone defs, lore fragment wiring (407)
│ │ ├── writing_guidelines.rs # Tone/style guide (540)
│ │ │
│ │ │ # ─── WORLD & CHARACTERS (dormant) ───
│ │ ├── deep_lore.rs # High fantasy cosmology (1,016)
│ │ ├── world.rs # World locations (607)
│ │ ├── world_engine.rs # World simulation (274)
│ │ ├── characters.rs # 4 NPC definitions (329)
│ │ │
│ │ │ # ─── LEGACY ───
│ │ ├── typing_context.rs # Replaced by lore_words.rs (754)
│ │ └── enemy_old.rs # Legacy (240)
│ │
│ ├── ui/ # Rendering (~2,850 lines)
│ │ ├── render.rs # Core screen rendering (1,700+)
│ │ ├── combat_render.rs # Enhanced combat UI (450)
│ │ ├── effects.rs # Visual effects system (400)
│ │ ├── theme.rs # Colors, icons, styles (424)
│ │ ├── lore_render.rs # Lore display (80)
│ │ ├── spell_ui.rs # Spell selection UI
│ │ └── stats_summary.rs # Battle + run summary screens (450+)
│ │
│ └── data/ # Static content (~1,700 lines)
│ ├── mod.rs # Data exports, lore word methods (180)
│ ├── enemies.rs # Enemy templates (555)
│ ├── sentences.rs # Word lists (490)
│ ├── word_lists.rs # More words (155)
│ ├── lore_words.rs # Zone/enemy/boss word pools (350)
│ ├── items.rs # Item templates
│ ├── spells.rs # Spell data
│ ├── zones.rs # Zone data
│ └── achievements.rs # Achievement definitions
│
├── docs/
│ └── SYSTEM_INTEGRATION_PLAN.md # Integration roadmap (completed)
│
├── .github/ # GitHub configuration
│ ├── workflows/ci.yml # CI pipeline (Rust checks, cross-build)
│ ├── ISSUE_TEMPLATE/ # Bug report, feature request templates
│ └── PULL_REQUEST_TEMPLATE.md # PR template
│
├── Cargo.toml
├── CHANGELOG.md
└── README.md
Legend: (wired up) / (dormant) / (legacy)
~29,000 lines of Rust across 56 source files.
- Wire up spell casting (Tab + 1-9 + incantation)
- Wire up faction reputation system
- Wire up combat feel (combos, flow states)
- Meta-progression: Ink earned on death
- Fix floor progression bugs
- High fantasy cosmology (Three Ages, The Sundering, Malachar)
- Five factions with distinct philosophies
- Fantasy-themed zones (6 unique areas)
- Bosses with personality (Hollow Knight, Void Herald)
- 14 thematic enemies with lore
- Player mystery and multiple endings framework
- Zone-specific word pools (30+ per zone)
- Enemy-type word themes
- Boss-specific dialogue lines
- Narrative progression through typed sentences
- Combat wired to use lore words
- EventBus architecture (60+ event types)
- NarrativeSeed corruption effects
- SkillTree combat integration (5 trees, 25+ skills)
- VoiceSystem for faction NPCs
- EncounterWriting authored events
- RunModifiers difficulty scaling
- TypingImpact per-keystroke damage
- DialogueEngine context-aware taunts
- EnemyVisuals progressive ASCII damage
- PacingSystem tension/breather beats
- PlayerAvatar class-based visuals
- CombatImmersion unified wrapper
- Effects system (floating damage, screen shake, hit flash)
- Enhanced combat render (450 lines)
- Combo pulse animations
- Typing ripple feedback
- Game loop integration (
update_effects()every frame) - Damage tracking with deferred pattern
- Switched to
render_combat_enhanced() - All visual effects now actually display
- Meta-progression persists to disk (RON format, XDG paths)
- Three endings (Final Silence, First Word, Third Grammar)
- EndingChoice scene with narrative-driven door selection
- Boss phase transitions (Hollow Knight, Void Herald)
- Balance pass (enemy scaling, time limits, upgrade costs)
- Quest log scene with main quest tracking
- Lore journal scene with discovered fragments
- NarrativeEngine wired (lore discovery, mystery progress, chapter advancement)
- Lore fragments integrated into exploration (30% chance)
- RunSummary with Ink calculation on death and victory
- Meta preserved across restarts
- NPC encounters in dungeons (characters.rs)
- Quest objective completion hooks
- Mid-run save/load
- Deep lore surfaced in gameplay
- World simulation integration
- Full balance pass
- All quest chains completable
- Documentation complete
- Actually ship something
# Development build
cargo build
# Release build (optimized, ~1.5MB binary)
cargo build --release
# Run directly
cargo run --release
# Check for errors without building
cargo checkKeyboard Warrior is a personal hobby project. It's not looking for contributors, but if you want to fork it and do something cool, go for it.
If you find a bug that's actually blocking gameplay (not just "this system isn't wired up"), feel free to open an issue. I might even fix it.
MIT License. See LICENSE for details.
Do whatever you want with this code. I'm not your mom.
Keyboard Warrior — Original work by Dr. Baklava
"I spent hundreds of hours on this so you can type 'ancient prophecy' at a Goblin."
Built with:
- ratatui — Terminal UI framework
- crossterm — Terminal manipulation
- Nerd Fonts — Icons
Inspired by:
- ttyper — Terminal typing
- Undertale — Personality and charm
- Hades — Meta-progression
- Balatro — Satisfying feedback
- Dark Souls — The joy of repeated death
Type well, die often.
