- Echoes Below – PowerShell RPG
- Table of Contents
- Introduction
- 🎮 Game Features
- 📝 Story Synopsis
- 👾 Installation & Run
- How to Play (Gameplay Guide)
- 👾 Installation & Run
- 💡 Gameplay Tips
- 🌟 Multiple Endings
- 🥚 Hidden Easter Egg
- 🎨 Visual Design (ASCII Art)
- 🛠️ Technical Details
- 🌐 API Credits
- 🔧 Key Technical Implementations
- 🐛 Challenges & Solutions
- ❗ Known Issues
- 📅 Development Timeline
- 📚 What We Learned
- ❓ Troubleshooting / FAQ
- 👥 Team
- 📜 License
- 🙏 Acknowledgments
- 📧 Contact
- ✅ Changelog - What Was Updated:
Echoes Below is an interactive, text-based-RPG, developed entirely in PowerShell as a school project for Module 122 (Automating tasks witha script language). It combines story scenes, turn-based combat with reaction timing, and player choices that influence your ending via the Bond Level.
You follow Aerin and Ebon through the Dungeon of Echoes, making decisions, fighting enemies, and building trust.
For our coding assignment we could choose our own goals, which means we had to achieve these realistic goals before the deadline (which was January 12th):
- ✅ Fully functional PowerShell script (
.ps1file executable in terminal) - ✅ Text-based story with at least 5 decision points
- ✅ Game Over & Victory conditions
- ✅ Turn-based combat system with multiple actions (Attack, Ability, Item, Escape)
- ✅ Save/Load system to preserve game progress
- ✅ API integration:
- NPC displays current time via API
- NPC tells random jokes via API
- ✅ ASCII art for characters, enemies, and environments
- ✅ Reaction-time combat mechanics (timed key inputs for attacks and blocks)
- ✅ Advanced inventory system with categorized items (Armor, Weapons, Items, Abilities)
- ✅ Healing items and buffs/debuffs (Poison, Burn, Stun, Confusion, Defense Down)
- ✅ Elemental system with Fire/Ice affinities and Elemental Mastery
- ✅ Armor system with different armor types, factors, and special effects
- ✅ Special abilities (status effects, armor pierce, combo attacks)
- ✅ Multiple weapon types with varying stats and damage
- ✅ Auto-save functionality (optional toggle in menu)
- ✅ Multiple endings based on Bond Level
- ✅ Shop system (Gruffboar's Forge) with paired equipment purchases
- ✅ Interactive map with progress tracking
- ✅ Coin economy - Earn coins from battles, spend at shop
- 🔲 More complex combo system for co-op abilities
Two stranges awaken in darkness. No memory of how they got here. No clear way out.
Aerin, an eagle-knight and Ebon, a sharp-witted magician-raven, find themselves trapped in the Dungeon of Echoes. A place whispered about in legends, where few enter and fewer return. The dungeon shifts, tests and breaks those who dare challenge it.
With only each other to rely on, they must navigate treacherous trials, face twisted creatures born from shadow and make choices, that could forge an unbreakable bond... or seal their fate.
Trust is survival. Survival is escape
Your decisions as the player shape their relationship and determine wether they'll see daylight again-or become another echo lost in the dephts.
- Windows 10/11 with PowerShell 5.1+ (PowerShell 7 also works with Linux and macOS)
- Internet connection (optional): only needed for Clockwise's time and joke features
Note: You can find the EXE-version in the "EXE_Version"-folder!
.ps1 script file, NOT the .exe version!
(More issues under chapter "Known Issues")
The EXE has save system issues. Follow these steps:
- Clone this repository on your device:
git clone https://github.com/Fire207/PowerShellRPG_v1.git
cd PowerShellRPG_v1- Run the game:
.\Echoes_Below.ps1- Follow on-screen prompts and make your choices!
Note: The game file is named Echoes_Below.ps1 (not Echoes_BelowDemo.ps1). Make sure you're running the correct file.
When you launch the script, you choose how to start:
- Type
newto begin a new run. When creating a new save-file, you have to enter a username, in order to continue. - Type
loadto continue from a saved game (you can select a save from a list).
Choose a number that appears and from there you can continue from that point, where you left off.
Tip: The game recommends a large terminal window, so maximize your PowerShell-window in full-screen for better readability.
The story is structured in scenes (e.g., Intro → Cell Escape → Tutorial Fight → Fork Path → Bridge Scene → Mirror Hall → Final Chamber). You advance by reading dialogue and entering choices when prompted.
To continue in the story, just press enter. When making a decision, just use a number that you can choose.
Many choices affect the Bond Level between Aerin and Ebon. A higher Bond can unlock better outcomes and influences the ending.
Every decision can make a different outcome. Just choose a number like "1" or "2", type that number in the terminal and press enter to confirm your choice.
Examples of Bond gain:
- Story choices like "Trust" boost Bond more than "Climb" (+2 vs +0)
- Listening to Clockwise's jokes increases Bond (+1 per joke, max 5 per chapter)
- Making empathetic dialogue choices adds Bond points
- Shop purchases unlock at higher Bond levels (some items require Bond 3+)
General Note: Some screenshots were captured during the game’s development and the final product may differ from the intended design.
Fights are turn-based with visual timing mechanics for attacks and blocks.
Your turn:
- Select an action: Weapon / Item / Special Ability / Escape
- For attacks, press SPACEBAR when the circle (O) reaches the target (x) on the timing bar
- Better timing = higher damage multipliers
When attacking, a moving indicator O slides across a bar. Press SPACEBAR when it aligns with the x.
Timing Results:
- ⚡ Perfect Hit (O exactly on x): 2.0x damage (PERFECT)
- ✨ Great Hit (O near x, ±10% distance): 1.5x damage (GREAT)
- ✓ Good Hit (O close, ±30% distance): 1.2x damage (GOOD)
- ⏰ Late Hit (O far from x): 1.0x damage (OK)
- ❌ Miss (no press): 0.3x damage (FAILED)
When enemies attack, the same timing bar appears. Press SPACEBAR when O hits x to block:
- 🟢 Perfect Block (O exactly on x): 100% blocked (NO DAMAGE!)
- 🔵 Good Block (O near x): 70% damage reduction
- 🟡 Partial Block (O far from x): 30% damage reduction
- 🔴 No Block (no press): Full damage taken
This is how it looks like:
That's the example of missing an attack.
Note: The final boss of the game will have the "X" positioned on different places, so it will be more challenging to finish the game.
The same happens when you block the attack of an enemy:

Some armor provides elemental affinities that boost specific attack types:
- 🔥 Fire Affinity (Royal Knight Armor): +20% Fire damage
- ❄️ Ice Affinity (Skyguard Armor): +15% Ice damage
- 🌟 Elemental Mastery (King's Fabric): +10% ALL elemental damage
Combat includes various debuffs that can affect both players and enemies:
| Status | Effect | Duration |
|---|---|---|
| 🧪 Poison | 5 HP damage per turn | 3 turns |
| 🔥 Burn | 7 HP damage per turn | 3 turns |
| 😵 Stun | Skip turn completely (cannot act) | 1 turn |
| 🌀 Confused | 40% chance to hurt yourself (15 damage) | 2 turns |
| 🛡️💥 Defense Down | Armor factor weakened (e.g., 1.5 → 5.0) | 2 turns |
- Winning a fight: Earn 5 coins per victory + 30% chance of loot drop (Healing Herb, Sweet Berry, Bitter Root)
- Losing a fight: Game Over screen with options to load last save or quit
- ❌ Escaping is NOT allowed in boss fights
- ✅ Non-boss fights have a 70% escape success chance
Note: After every fight the players will get healed to maximum HP and SP automatically.
Between scenes you can open the menu to manage progress and view information.
Menu Options:
- Continue story – Return to current scene
- Save progress – Manual save with timestamp
- Auto-save toggle – Enable/disable automatic saves before chapters
- Ask Clockwise for the time – View current time via API (ASCII display)
- Ask Clockwise for a joke – Random joke via API (increases Bond +1)
- INVENTORY – Access categorized inventory system (see next section)
- View Map – See dungeon progress and travel to visited locations
- Quit game (recommended only after saving)
Game Status Box: The top of the menu shows:
- HP/SP bars for both Aerin and Ebon
- Current coin count (color-coded: Yellow ≥10, DarkYellow ≥5, Red <5)
- Chapter progress bar (Chapters Completed / Total Chapters)
The inventory system has been completely redesigned with 4 categorized sections:
1️⃣ Items - Consumables that restore HP/SP:
- Healing Herb - Restores 50 HP
- Sweet Berry - Restores 25 HP
- Bitter Root - Restores 20 SP
- Energizing Nectar - Restores 50 SP
Items can be used:
- ✅ In combat - Select "Use Item" during your turn
- ✅ Outside combat - Use from menu inventory
2️⃣ Armor - Equipment that reduces incoming damage:
- View all collected armor with defense factor and special effects
- Equip armor for both Aerin AND Ebon simultaneously (paired equip)
- Special effects include:
- 🔥 Fire Affinity (+20% Fire damage)
- ❄️ Ice Affinity (+15% Ice damage)
- 🌟 Elemental Mastery (+10% all elemental damage)
- 🎲 Chance-based effects (dodge, reflect damage, phase through attacks)
3️⃣ Weapons - Offensive equipment for attacks:
- Primary Slot - Main weapon (always available)
- Secondary Slot - Optional second weapon
- View damage values and descriptions
- Equip weapons to:
- Aerin only
- Ebon only
- Both (paired equip)
4️⃣ Special Abilities - Powerful SP-costing attacks:
- Aerin's Abilities:
- Dive Attack - High crit timing bonus
- (Secondary ability slot available)
- Ebon's Abilities:
- Armor Pierce - Ignores enemy armor completely
- (Secondary ability slot available)
- View SP cost, damage, and effects
Inventory Features:
- Items show effect descriptions and usage context
- Equipped items are marked with [EQUIPPED] tag
- Armor shows defense reduction percentage
- Weapons show damage values
- Navigate with number keys (0 to go back)
- Saves are stored as JSON files in a
Savesfolder next to the script - Save files include player name, scene, and timestamp (e.g.,
Save_Aerin_TutorialFight_20260110143052.json) - Load shows a sorted list of saves (newest first) and restores the exact scene and game state
When saving manually, type "save" or "yes". It won't save when you press "Enter" with nothing or type "no".
Auto-Save Feature:
- Toggle in menu (Option 3)
- Automatically saves before each new chapter
- No need to manually save if enabled
How a JSON save file is structured: The save contains all game state:
- Player stats (HP/SP/max_hp/max_sp)
- Inventory (weapons/armor/items/abilities)
- Bond Level (0-8)
- Current scene and visited locations
- Coins earned
- Timestamp for file organization
The map shows your dungeon progress visually:
- 🔵 Current Location - White marker with
[★]symbol - ✅ Visited Locations - Gray color (accessible via travel)
- 🔒 Unknown Areas - Dark gray (not yet discovered)
- 🛒 Shop Location - Yellow color, marked with
[G]once unlocked
Map Navigation:
- Type location numbers to fast-travel to previously visited scenes
- Type
Gto visit Gruffboar's Forge (shop) - Type
0to return to menu
Keep in mind: You can only select Gruffboar's shop once in every chapter, until this option vanishes. If you continue in the story, the button to Gruffboar's shop reappears again.
Note: The map feature is currently undergoing improvements. Some visual elements may appear broken or misaligned in the current version. A fix is planned for the next update.
Gruffboar's blacksmith shop unlocks after the Blacksmith Encounter scene.
Shop Features:
- 🪙 Coin-based economy - Spend coins earned from battles
- 👥 Paired purchases - All equipment automatically equips to BOTH Aerin and Ebon
- 🔄 Dynamic coin display - Color changes based on wealth:
- Yellow ≥10 coins (Rich)
- DarkYellow ≥5 coins (Moderate)
- Red <5 coins (Poor)
- 📦 Item categories: Armor, Weapons, Consumables
Shop Inventory:
| Item | Type | Price | Effect |
|---|---|---|---|
| Padded Clothes | Armor | 3 coins | Solid starter protection |
| Healing Herb | Item | 2 coins | Restores 50 HP |
| Sharpened Claw | Weapon | 4 coins | Stronger attack (25 → 30 damage) |
| Skyguard Armor | Armor | 6 coins | ❄️ Ice Affinity (+15% Ice damage) |
| Studded Leather | Armor | 7 coins | Spikes keep enemies away |
| Brigandine Coat | Armor | 9 coins | 10% chance to reflect damage |
| Gloom Feathers Cloak | Armor | 11 coins | Chance to phase through attacks |
| Royal Knight Armor | Armor | 14 coins | 🔥 Fire Affinity (+20% Fire damage) |
| Bubble Shield | Armor | 16 coins | Insane defense, might pop |
| King's Fabric | Armor | 22 coins | 🌟 +40 HP bonus + Elemental Mastery (+10%) |
Gruffboar's Dialogue Examples:
- "Ere fer gear, eh? Every purchase gets PAIRED - one fer each bird."
- "Forged in dragonfire. Feel the heat? 🔥 Fire obeys yer command now."
- "Woven by the Elemental Archons themselves. Fire, Ice, Lightning... all bend to yer will."
Access Shop:
- Via Map (press
Gwhen shop is unlocked) - Shop loop: Browse → Buy → Coin count updates → Browse again
- Type
11to exit shop
So now you know how the game works. Have fun with it!
- Windows 10/11 with PowerShell 5.1+ (PowerShell 7 also works with Linux and macOS as well)
- Internet connection (optional): only needed for Clockwise's time and joke features
The game follows an 8-scene structure designed for approximately 8-10 minutes of gameplay:
- Intro/Opening – Aerin awakens in the dungeon
- Cell Scene – Meet Ebon, make first decision (Strength vs. Cleverness)
- Tutorial Fight – Battle an Echo Bat, learn combat mechanics
- Blacksmith Encounter – Visit Gruffboar's forge, unlock shop access
- Forked Path – Choose between combat (Venomtail Serpent) or emotional vulnerability (memory scene)
- Bridge Scene – Trust Ebon's magic or climb alone
- Mirror Hall – Confront traumatic memories or avoid them
- Finale – Face the Owl of Echoes; ending depends on Bond Level
Each choice affects the Bond Level between Aerin and Ebon, influencing:
- Combat effectiveness – Higher Bond unlocks combo abilities
- Story outcomes – Different dialogue and scene variations
- Shop access – Some premium items require higher Bond levels
- Endings – Three different endings based on final Bond Level (0-8 scale)
- Build Bond early: Listen to Clockwise's jokes (max 5 per chapter) for easy +1 Bond
- Perfect timing = OP: ≤300ms attacks deal 3x damage—practice your reflexes!
- Save often: Use the menu save before risky decisions or tough fights
- Shop smart: Prioritize armor from Gruffboar's shop for survivability
- Budget build (≤10 coins): Skyguard Armor (6) + Sharpened Claw (4)
- Mid-game build (≤18 coins): Royal Knight Armor (14) + healing items (4)
- Endgame build (≤25 coins): King's Fabric (22) + consumables (3)
- Explore choices: Different paths at Fork Path give different rewards (armor vs. healing + Bond)
- Elemental strategy: Match armor affinity to enemy weakness (Fire vs Ice enemies, etc.)
Your Bond Level (0-8) determines which ending you receive:
The Owl of Echoes recognizes the bond between Aerin and Ebon and becomes peaceful. The boss fight is significantly easier (HP reduced to 80), and you win without a full combat.
The Owl of Echoes hesitates but ultimately fights. Boss has moderate HP (110) and the fight is balanced.
The Owl of Echoes attacks with full force. Boss has maximum HP (normal difficulty) and the fight is challenging.
Here's an example of what an ending might look like (A huge spoiler):

🥚 Hidden Easter Egg
For the most dedicated players who explore every corner of the Dungeon of Echoes...
Requirements:
- 🎯 Reach Bond Level 14 or higher (extremely rare!)
- 🎭 Fully engage with all story content
- 🤝 Build the strongest possible relationship between Aerin and Ebon
What awaits you? We won't spoil the surprise. But let's just say: those who achieve this bond will witness something... unexpected. 👀
Hint: Clockwise holds more secrets than just jokes and time. Explore all his dialogue options across multiple chapters! Alternatively, you could simply listen to Clockwise’s jokes, leave the game, and resume it when you reach bond-level 14.
Note: This is intentionally vague. The discovery is part of the experience.
The game uses ASCII art throughout for immersive terminal visuals:
- Enemy designs – Each boss/enemy has unique ASCII artwork displayed before fights
- Story scenes – Prison cell, collapsing bridge, Gruffboar's forge with anvil header
- Interactive time display – Clockwise NPC shows time as 5-line ASCII digits (e.g.,
18:45) - Dungeon map – Visual hierarchy with connection lines (
│,├─,└─) - Title screen – Large "ECHOES BELOW" ASCII banner on game start
- Victory/Defeat banners – Dynamic ASCII art for combat results
Note: This screenshot is from a development version and may differ from the final release.
The image on the left shows how an enemy ASCII-Art is implemented in the code and how its output is in the game.
Technical note: All ASCII images are stored as multi-line strings and rendered with Write-Host. Pure text rendering makes it CPU-efficient even for large images (100+ lines).
Enemies have ASCII-Art stored in their own variables, but story scenes have ASCII art pasted directly within functions to suit their narrative context.
- Language: PowerShell 5.1+ (compatible with PowerShell Core 7)
- Platform: Windows Terminal, PowerShell ISE, VS Code
- Dependencies:
- Internet connection for optional API calls
System.Diagnostics.Stopwatchfor reaction timingConvertTo-Json/ConvertFrom-Jsonfor save system
- World Time API (
timeapi.world) – Real-time clock for Clockwise NPC dialogue (Zurich timezone)- Fallback: Uses
[System.TimeZoneInfo]for local device timezone if API fails
- Fallback: Uses
- JokeAPI (
v2.jokeapi.dev) – Random jokes with content filters (NSFW/political/racist/sexist blocked)
Fallback: If APIs fail, the game uses local system time and skips joke feature gracefully (no crashes).
This game uses the following free APIs:
- World Time API by AYMKDN – Real-time timezone data
- JokeAPI by Sv443 – Free joke database with content filtering
If 'World Time API' doesn't work, the game uses a fallback API from the device clock to display the current time.
Special thanks to the maintainers of these services.
Uses System.Diagnostics.Stopwatch to measure player reaction time in milliseconds with precise thresholds:
Attack Timing:
if ($keyPressed -and $reactionTime -le 300) {
$multiplier = 3.0 # Ultra Crit
}
elseif ($keyPressed -and $reactionTime -le 600) {
$multiplier = 2.2 # Great Hit
}
# ... etcBlock Timing:
if ($reactionTime -le 400) {
$damageMultiplier = 0.0 # Perfect Block
}
elseif ($reactionTime -le 1000) {
$damageMultiplier = 0.3 # Good Block
}
# ... etc- Time API: Displays Zurich time as ASCII art via
timeapi.world - Joke API: Fetches filtered jokes via
v2.jokeapi.dev(NSFW/political blocked) - Fallback: Uses local system time if API fails (no crashes)
Saves complete game state as JSON files in a Saves folder with structure:
- Player stats (HP/SP/max_hp/max_sp)
- Inventory (weapons/armor/items/abilities)
- Bond Level (0-8)
- Scene progress and visited locations
- Coins and timestamp
Save Filename Format:
Save_<PlayerName>_<SceneName>_<Timestamp>.json
Example: Save_Aerin_TutorialFight_20260110143052.json
Tracks relationship between Aerin and Ebon (0-8 scale):
- Influences story dialogue and endings
- Affects shop accessibility (some items require Bond 3+)
- Unlocks combo abilities at higher levels
- Affected by decisions, shared jokes, and combat victories
Bond Gain Examples:
- Trusting Ebon at Bridge: +2 Bond
- Listening to jokes: +1 Bond (max 5 per chapter)
- Making empathetic choices: +1-2 Bondx
Categorized inventory with 4 sections:
- Items: Consumables with HP/SP restoration
- Armor: Defense equipment with special effects
- Weapons: Primary and secondary weapon slots
- Abilities: SP-costing special attacks
Each category has its own menu with equip/use functionality.
Issue: Nested hashtables (weapons inside inventory) caused serialization errors.
Solution: Used -Depth 6 parameter in ConvertTo-Json to handle deep nesting.
Issue: Spacebar detection behaved differently in PowerShell 5.1 vs 7. Solution: Implemented multiple key-check methods:
if ($key.Key -eq [ConsoleKey]::Spacebar -or
$key.KeyChar -eq ' ' -or
$key.VirtualKeyCode -eq 32) {
# Key detected
}Issue: Windows uses "W. Europe Standard Time", Linux/macOS use "Europe/Zurich". Solution: Platform detection with fallback logic:
$tzIds = @("Europe/Zurich", "W. Europe Standard Time")
foreach ($id in $tzIds) {
try {
$tz = [System.TimeZoneInfo]::FindSystemTimeZoneById($id)
break
} catch { continue }
}Issue: Weapon menu continued after enemy defeat, allowing multiple victory rewards.
Solution: Implemented $script:fightActive flag and $victoryProcessed flag:
if ((Check-FightEnd -enemiesArray $enemiesArray)) {
$script:fightActive = $false
$weaponMenuActive = $false
$playerActionDone = $true
break # Exit immediately
}Issue: UseSPItem expected [hashtable] but received PSCustomObject from save files.
Solution: Removed type constraints:
# Before: param([hashtable]$character, [hashtable]$item)
# After: param($character, $item) # Flexible type handlingGeneral Note: Some code-snippets taken during the development of the game and the final result may look different than intended.
- Map Display: Alignment issues may occur on narrow terminal windows.
- Workaround: Maximize PowerShell to full-screen (F11) for best results.
- Destination: Gruffboar’s shop: One wall symbol around the loading sign is slightly misplaced.
- Workaround: The visual glitch doesn't affect gameplay. Please ignore it for now.
| Week | Date | Tasks Completed | Responsible | Time (h) |
|---|---|---|---|---|
| 1 (KW44) | Oct 27, 2025 | GitHub Setup, PowerPoint, Project Board, README Structure | Both | 2.5h |
| 2 (KW45) | Nov 3, 2025 | Fighting-System Basics, Damage System, Equipment System | Lionel | 2.5h |
| 3 (KW46) | Nov 10, 2025 | Save/Load (JSON), Title Screen ASCII, API Integration | Both | 2.5h |
| 4 (KW47) | Nov 17, 2025 | Tutorial Fight, Story Intro & Characters, Flow Diagram | Christoph | 2h |
| 5 (KW48) | Nov 24, 2025 | ASCII-Art (7 Bosses), Reaction Combat, Items & Debuffs | Both | 2.5h |
| 6 (KW49) | Dec 1, 2025 | Gruffboar's Shop, Bond Logic & Boss Fight, Map Feature | Both | 2.5h |
| 7 (KW50) | Dec 8, 2025 | AutoSave Feature, Menu Loop Bugfix, Dialog Enhancement | Lionel | 2h |
| 8 (KW51) | Dec 15, 2025 | Story Finalization, Choice/Branching, Status Menu | Both | 2h |
| 9 (KW52) | Dec 22, 2025 | Function Order Optimization, ASCII Variables, Save-Folder Fix | Christoph | 3h |
| 10 (KW01) | Dec 29, 2025 | Bugfix: Map, Load-Issue, Save Registration, Story Elements | Christoph | 3h |
| 11 (KW02) | Jan 5, 2026 | Current Bugs/Fixes, Combo Attacks, Inventory Enhancements | Both | 2h |
| 12 (KW03) | Jan 10, 2026 | Major Bugfixes: Fight loop exit, Item type handling, Elemental system balance | Both | 3h |
| Submission (KW03) | Jan 12, 2026 | Critical Bugfixes: Item system (HP/SP restoration), Game Over load functionality, Developer Documentation + Final Submission | Both | 7h |
| TOTAL | ~40h |
- JSON handling: Converting complex PowerShell objects to/from JSON (solved nested hashtable issues with
-Depth 6) - Event-driven programming: Implementing timing-based combat mechanics using
System.Diagnostics.Stopwatch - Type flexibility: Removing type constraints to handle both Hashtables and PSCustomObjects
- API integration: Working with REST APIs (
Invoke-RestMethod) and graceful error handling with try/catch blocks - State management: Implementing fight loop exit flags (
$fightActive,$victoryProcessed) to prevent duplicate rewards - User experience: Designing clear terminal UI with ASCII art, color-coded feedback, and categorized menus
- Debugging: Solving complex state management issues in save/load system (especially cross-scene variable persistence)
- Performance: Optimizing reaction timing system to work across PowerShell versions
- Collaboration: Git workflow with branches, merge conflict resolution, and task distribution via Notion board
Q: The game crashes when I press SPACEBAR A: Make sure your terminal window is active/focused during combat prompts.
Q: API features (time/jokes) don't work A: Check your internet connection. The game continues without these features if offline using device fallback.
Q: Save files disappeared
A: Check if the Saves folder exists next to the .ps1 script. Don't move the script without the folder.
Q: PowerShell 7 vs 5.1 differences? A: Both work. PowerShell 7 has better cross-platform support (Linux/macOS).
Q: Can I skip combat? A: Non-boss fights allow escape (70% chance). Boss fights must be completed.
Q: Weapon menu keeps appearing after victory
A: This was a bug in earlier versions. Update to the latest version (Echoes_Below.ps1) for the fix.
Q: Items give errors when using A: This was a type mismatch bug. Update to the latest version for the fix.
Q: Map looks broken/misaligned A: This is a known issue. Maximize your PowerShell window or use full-screen mode for better display. A fix is planned.
Q: Which file should I run?
A: Run Echoes_Below.ps1 (NOT Echoes_BelowDemo.ps1 which is an old development version).
Q: Coins not updating in shop A: This was fixed in the latest version. Coin count now updates dynamically after each purchase.
Q: Items don't restore HP/SP in combat A: This was a critical bug in earlier versions. Update to the latest version (Jan 14, 2026) for the fix.
Q: "No save to load" error on Game Over screen A: This was a critical bug in earlier versions. The Game Over screen now properly uses Show-LoadMenu to access save files. Update to latest version.
Q: SP drops to 0 when using SP items A: This was caused by incorrect property names in the UseSPItem function. Fixed in Jan 14, 2026 update.
Project Members:
- Christoph Haas – Story, Dialogs, ASCII Art, Documentation, Bugfixes
- Lionel Salomon – Combat System, Stats, Save/Load System, Core Mechanics
Class: ICT23d Module: 122 – Automating processes with a scripting language School: Berufsfachschule BBB Baden Date: October 20th, 2025 – January 12th, 2026
This project is created for educational purposes as part of a school assignment (Module 122).
All code is open-source and available under the MIT License.
- Thanks to our teacher Corrado Parisi for guidance throughout Module 122
- Inspired by classic text adventures (Zork, Colossal Cave) and modern narrative RPGs (Undertale, Disco Elysium)
- ASCII art sourced from community repositories and custom-created
- Special thanks to the PowerShell community for documentation and examples
For questions, feedback, or collaboration:
- GitHub Issues: Create an issue
- Email: christophhaas26@gmail.com
- GitHub: @Fire207 or @mayzor15
Enjoy your journey through the Echoes Below!
- ✅ Updated filename from
Echoes_BelowDemo.ps1→Echoes_Below.ps1 - ✅ Added note about correct file to run
- ✅ Updated millisecond thresholds (300ms/600ms/1200ms/2000ms)
- ✅ Added detailed block timing breakdown
- ✅ Added elemental damage system (Fire/Ice/Elemental Mastery)
- ✅ Updated coin rewards (5 coins per fight)
- ✅ Added entire new section "6) Inventory System (NEW)"
- ✅ Documented 4 categories (Items, Armor, Weapons, Abilities)
- ✅ Explained paired equip feature
- ✅ Added usage context (in combat vs outside)
- ✅ Updated shop prices and item list
- ✅ Added elemental affinity descriptions
- ✅ Documented paired purchase system
- ✅ Added Gruffboar's dialogue examples
- ✅ Added dynamic coin display colors
- ✅ Updated Bond gain examples
- ✅ Added shop accessibility based on Bond
- ✅ Documented joke limit (max 5 per chapter)
- ✅ Added note about current visual issues
- ✅ Documented fast-travel system
- ✅ Added Problem 4: Fight Loop Not Exiting
- ✅ Added Problem 5: Item Type Mismatch
- ✅ Added FAQ entries for new bugs
- ✅ Added file naming clarification
- ✅ Added Week 12 (Jan 10) with major bugfixes












