Skip to content

Fire207/PowerShellRPG_v1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

129 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Echoes Below – PowerShell RPG

Game Banner

Table of Contents


Introduction

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.


🎮 Game Features

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):

Must-Have Features (Implemented)

  • Fully functional PowerShell script (.ps1 file 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

Additional Features (Implemented)

  • 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

Future Improvements

  • 🔲 More complex combo system for co-op abilities

📝 Story Synopsis

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.


👾 Installation & Run

Requirements

  • 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

How to run

Note: You can find the EXE-version in the "EXE_Version"-folder!

⚠️ IMPORTANT: Use the .ps1 script file, NOT the .exe version!

(More issues under chapter "Known Issues")

The EXE has save system issues. Follow these steps:

  1. Clone this repository on your device:
git clone https://github.com/Fire207/PowerShellRPG_v1.git
cd PowerShellRPG_v1
  1. Run the game:
.\Echoes_Below.ps1
  1. 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.


How to Play (Gameplay Guide)

1) Start the game

When you launch the script, you choose how to start:

  • Type new to begin a new run. When creating a new save-file, you have to enter a username, in order to continue.
  • Type load to continue from a saved game (you can select a save from a list).

Loading save-states

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.

2) Progress through scenes

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.

Pressing Enter on dialogues

To continue in the story, just press enter. When making a decision, just use a number that you can choose.

3) Decisions & Bond Level

Many choices affect the Bond Level between Aerin and Ebon. A higher Bond can unlock better outcomes and influences the ending.

When making a decision

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+)

When choosing "Climb" at the Bridge-Scene

Asking Clockwise for a Joke

General Note: Some screenshots were captured during the game’s development and the final product may differ from the intended design.

4) Fighting System with Timing-Based Combat

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

⚔️ Attack Timing System

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)

🛡️ Enemy Attacks (Block Timing)

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: Updated combat interface showing reaction timing and weapon selection 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: Updated ccombat interface showing getting damage, when not hitting early enough

🎯 Elemental Damage System (NEW):

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

🎲 Status Effects:

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

💰 Rewards & Penalties:

  • 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

🚪 Escape Rules:

  • ❌ 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.

5) In-game Menu

Between scenes you can open the menu to manage progress and view information.

This is how the game menu looks like. It has many different elements to choose from

Menu Options:

  1. Continue story – Return to current scene
  2. Save progress – Manual save with timestamp
  3. Auto-save toggle – Enable/disable automatic saves before chapters
  4. Ask Clockwise for the time – View current time via API (ASCII display)
  5. Ask Clockwise for a joke – Random joke via API (increases Bond +1)
  6. INVENTORY – Access categorized inventory system (see next section)
  7. View Map – See dungeon progress and travel to visited locations
  8. 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)

6) Inventory System (NEW)

The inventory system has been completely redesigned with 4 categorized sections:

📦 Inventory Categories:

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)

7) Save & Load

  • Saves are stored as JSON files in a Saves folder 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 Autosave isn't activated, the player has to save the game manually

When saving manually, type "save" or "yes". It won't save when you press "Enter" with nothing or type "no".

When Autosave is on, the game automatically creates a save-file

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

This is how a JSON-File is structured as a Save-File in "Echoes Below"

8) Map & Shop

🗺️ Map System:

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 G to visit Gruffboar's Forge (shop)
  • Type 0 to return to menu

A Map shows your position in the game, which can be used as a guide

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.

🛒 Shop System - Gruffboar's Forge (UPDATED):

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."

Gruffboars shop has many different armor, items and weapons that you can buy

Access Shop:

  • Via Map (press G when shop is unlocked)
  • Shop loop: Browse → Buy → Coin count updates → Browse again
  • Type 11 to exit shop

So now you know how the game works. Have fun with it!


👾 Installation & Run

Requirements

  • 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:

  1. Intro/Opening – Aerin awakens in the dungeon
  2. Cell Scene – Meet Ebon, make first decision (Strength vs. Cleverness)
  3. Tutorial Fight – Battle an Echo Bat, learn combat mechanics
  4. Blacksmith Encounter – Visit Gruffboar's forge, unlock shop access
  5. Forked Path – Choose between combat (Venomtail Serpent) or emotional vulnerability (memory scene)
  6. Bridge Scene – Trust Ebon's magic or climb alone
  7. Mirror Hall – Confront traumatic memories or avoid them
  8. Finale – Face the Owl of Echoes; ending depends on Bond Level

Decision System

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)

💡 Gameplay Tips

  • 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.)

🌟 Multiple Endings

Your Bond Level (0-8) determines which ending you receive:

🌈 Wholesome Ending (Bond 8+)

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.

🌗 Bittersweet Ending (Bond 5-7)

The Owl of Echoes hesitates but ultimately fights. Boss has moderate HP (110) and the fight is balanced.

⚔️ Hard Ending (Bond 0-4)

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): Screenshot


🥚 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.


🎨 Visual Design (ASCII Art)

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.

Screenshot

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.


🛠️ Technical Details

Language & Tools

  • 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.Stopwatch for reaction timing
    • ConvertTo-Json / ConvertFrom-Json for save system

APIs Used

  • 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
  • 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).

🌐 API Credits

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.


🔧 Key Technical Implementations

Reaction Combat System (Updated)

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
}
# ... etc

Block Timing:

if ($reactionTime -le 400) {
    $damageMultiplier = 0.0  # Perfect Block
}
elseif ($reactionTime -le 1000) {
    $damageMultiplier = 0.3  # Good Block
}
# ... etc

API Integration

  • 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)

Save/Load System

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

Bond System (Updated)

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

Inventory System (Redesigned)

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.


🐛 Challenges & Solutions

Problem 1: JSON Serialization

Issue: Nested hashtables (weapons inside inventory) caused serialization errors. Solution: Used -Depth 6 parameter in ConvertTo-Json to handle deep nesting.

Problem 2: Timing System Compatibility

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
}

Problem 3: Cross-Platform Timezone IDs

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 }
}

Problem 4: Fight Loop Not Exiting After Victory

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
}

Problem 5: Item Type Mismatch Errors

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 handling

General Note: Some code-snippets taken during the development of the game and the final result may look different than intended.


❗ Known Issues

  • 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.

📅 Development Timeline

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

📚 What We Learned

  • 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

❓ Troubleshooting / FAQ

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.


👥 Team

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


📜 License

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.


🙏 Acknowledgments

  • 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

📧 Contact

For questions, feedback, or collaboration:


Enjoy your journey through the Echoes Below!

Changelog - What Was Updated:

📂 Installation & Run

  • ✅ Updated filename from Echoes_BelowDemo.ps1Echoes_Below.ps1
  • ✅ Added note about correct file to run

⚔️ Fighting System

  • ✅ 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)

📦 Inventory System

  • ✅ 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)

🛒 Shop System

  • ✅ Updated shop prices and item list
  • ✅ Added elemental affinity descriptions
  • ✅ Documented paired purchase system
  • ✅ Added Gruffboar's dialogue examples
  • ✅ Added dynamic coin display colors

💰 Bond Level

  • ✅ Updated Bond gain examples
  • ✅ Added shop accessibility based on Bond
  • ✅ Documented joke limit (max 5 per chapter)

🗺️ Map

  • ✅ Added note about current visual issues
  • ✅ Documented fast-travel system

🐛 Challenges & Solutions

  • ✅ Added Problem 4: Fight Loop Not Exiting
  • ✅ Added Problem 5: Item Type Mismatch

Troubleshooting

  • ✅ Added FAQ entries for new bugs
  • ✅ Added file naming clarification

📅 Timeline

  • ✅ Added Week 12 (Jan 10) with major bugfixes

About

This is an RPG game made possible with PowerShell. It was a school project, were we decided to experiment with it.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors