A 2D story-driven adventure game about courage, conscience, and change.
SoulSteps is a top-down 2D adventure game built with the LibGDX framework in Java. Inspired by the UN's Sustainable Development Goal 16 (Peace, Justice, and Strong Institutions), the game places players in a fictional, corrupt world where doing the right thing comes at a cost.
Instead of traditional combat, players engage in non-lethal Confrontations, using logic, empathy, and collected evidence to win arguments and change the minds of others. The narrative is driven by player choice, with a dynamic story system that reacts to your decisions and a world that evolves as the plot unfolds.
The town of Aethelgard is slowly being choked by mysterious "resource shortages." Public gardens are wilting, water pressure is failing, and the community's spirit is drying up. The powerful Veridia Dynamics corporation, once hailed as the town's savior, now manages all infrastructure with an iron grip.
You play as Elian, a quiet but skilled technician just trying to do his job. When a routine repair job uncovers a strange device on a water main, Elian is pulled into a conspiracy that goes to the very top. Your choices will determine whether you expose the rot in Aethelgard or become a part of the system you sought to change.
This project serves as a showcase of robust game architecture and modern Java practices.
- Dynamic Story Progression: A powerful, data-driven
StoryProgressionManagercontrols the entire questline, making it easy to add new objectives, branches, and narrative content. - Modular World System: The
WorldManagerdynamically loads maps and populates them with the correct NPCs and triggers based on the player's progress in the story. - Event & Trigger System: The world is filled with interactive triggers for seamless map transitions, object examinations, and automatic "cutscenes" that interrupt the player to drive the story forward.
- Interactive Dialogue & Choice System: An on-screen UI handles both narrative dialogue and multi-choice ethical dilemmas that have real consequences on the story and gameplay.
- Waypoint Guidance System: An intelligent on-screen arrow guides the player towards their current objective's location, automatically hiding when the target is in view.
- Non-Lethal Confrontation System: A unique, turn-based "combat" system where players use dialogue, empathy, and evidence to deplete an opponent's "Resolve" rather than their health.
- Dynamic NPC Behavior: NPCs feature custom action/effect animations (e.g., spray-painting) and can follow complex, looping patrol paths. Their dialogue and presence in the world change based on story events.
- Layered Character Customization: A flexible
ClothesContainerand rendering system allows characters to wear multiple layers of clothing (pants, shirts, jackets) for diverse appearances. - Tile-Based Collision & Dynamic Rendering: Features robust collision detection against a Tiled map layer and a dynamic rendering system that correctly draws the player at any depth between map layers.
- Language: Java 8+
- Framework: LibGDX
- Build Tool: Gradle
- Font Rendering: gdx-freetype extension
To run this project on your local machine, follow these steps.
- Java Development Kit (JDK): Version 8 or higher.
- IDE: IntelliJ IDEA (recommended) or another IDE with Gradle support.
-
Clone the repository:
git clone https://github.com/Sadman-Shaharier/SoulSteps.git cd SoulSteps -
Import into IntelliJ IDEA:
- Open IntelliJ IDEA.
- Select
File > Open...(orOpenon the welcome screen). - Navigate to and select the
build.gradlefile in the project's root directory. - Choose "Open as Project".
- IntelliJ will automatically sync the Gradle project. This may take a few minutes.
-
Run the Game:
- In the project file browser, navigate to
lwjgl3/src/main/java/com/DMA173/soulsteps/lwjgl3/Lwjgl3Launcher.java. - Right-click on the
Lwjgl3Launcher.javafile and select "Run 'Lwjgl3Launcher.main()'".
- In the project file browser, navigate to
The project follows a clean, separated architecture to ensure maintainability and scalability.
core/src/main/java/com/DMA173/soulsteps/assets/: Contains all game assets (fonts, maps, character sprites, UI elements).Charecters/: The baseCharacterclass,Player,NPC, and theCharecterAssetsmanager.combat/: Contains theConfrontationManagerfor the non-lethal conflict system.story/: The "brain" of the game. Contains theGameStateManager(memory) andStoryProgressionManager(quest director).ui/: All UI components, including the in-gameUIManager, theMainMenu, andPauseMenu.world/: TheWorldManager, responsible for loading maps and their content.
The story system is designed to be easily extended without AI help. Refer to the detailed story_system_guide.md file for in-depth examples.
- Open
StoryProgressionManager.java: - Add a new objective ID and text to
initializeObjectives(). - (Optional) Add a waypoint for the objective in
initializeObjectiveLocations(). - Add the completion logic for the objective in a
caseblock insidecheckObjectiveCompletion().
- Create your map and save it to
assets/maps/. - Open
WorldManager.java: InloadNpcsForZone(), add acasefor your new map's ID and create the NPCs that will be there. - Open
StoryProgressionManager.java: IninitializeMapTransitions(), create a newMapTransitionobject to link an existing map to your new one.
- Open
WorldManager.java: InloadNpcsForZone(), add logic to spawn your new NPC, potentially based on aGameStateManagerflag (e.g., only spawn after a certain quest is complete). - Open
NPC.java: In theinteract()method, add acasefor your new NPC's name. Inside, write the custom dialogue logic, which can read flags from and write updates to theGameStateManagerto progress the story.
- Implement a full save/load system.
- Expand the Confrontation system with more argument types and status effects.
- Integrate sound effects and background music.
- Build out the complete story with all planned zones and characters.
This project is licensed under the Creative Commons Attribution 4.0 International License. See the LICENSE.md file for details.
- All character and map assets are placeholders sourced from various open-source platforms. Credit to the original artists.
- Built with the incredible LibGDX framework.