/simple-game-engine

A handcrafted game engine for point-and-click adventures, puzzle games, and narrative experiments. Written from scratch in Python with PyGame, YAML, and deep modularity in mind.

Primary LanguagePythonMIT LicenseMIT

πŸ”§ simple-game-engine

A modular point-and-click adventure engine written in Python.

Simple Game Engine is built to support surreal, story-rich games inspired by Rusty Lake, A Little to the Left, Frog Detective, Tangle Tower, Outer Wilds and more. It focuses on smooth interactions, seamless modularity and expansive possibilities.

License: MIT CI Status: WIP Pull Requests Welcome GitHub Discussions


🌟 Key Features

  • Scene manager with interactive hotspots
  • YAML-based item, character, and puzzle logic
  • Inventory and contextual action systems
  • Persistent GameState for flags and progress
  • Modular dialogue engine with branching paths
  • Timeline system for synced events and time loops
  • Support for character traits, interaction effects, and narrative memory

🧠 Goals

  • Total creative freedom
  • Extensible for visual scripting or modding
  • Engine + toolkit for building games that are weird, personal and beautiful

πŸ—ΊοΈ Project Roadmap

The full development roadmap lives in ROADMAP.md.


πŸš€ Getting Started

Clone this repo and install dependencies:

git clone https://github.com/your-username/simple-game-engine.git
cd simple-game-engine
pip install -r requirements.txt

πŸ›  Run the Demo

python main.py  # or your preferred dev command

⏱ Timeline Events

Scenes can schedule delayed actions:

scene:
  id: intro
  features:
    time_loop: true

events:
  - trigger: delay
    time: 30  # seconds
    action: set_flag
    flag: door_closed

πŸ—Ί World Manager

Worlds are described in YAML files that list regions and scenes. This new format includes metadata like title and start_region. Load a world with WorldManager:

world:
  id: montreal
  title: "Surreal Montreal"
  start_region: mileend
  regions:
    - id: mileend
      scenes: [ruelle_portail]
from engine.world_manager import WorldManager
wm = WorldManager("game/worlds/montreal.yaml")
print(wm.current_scene())

🎨 Asset Manager

Use AssetManager to cache images and music referenced by scenes:

from engine.asset_manager import AssetManager
assets = AssetManager()
scene = ...  # a Scene object
assets.preload_scene(scene)
background = assets.get_image(scene.background)

🀝 Contributing

We welcome bug reports, feature ideas and pull requests!

See CONTRIBUTING.md for how to get started. Join us in πŸ’¬ GitHub Discussions to share ideas.


πŸ“œ License

Distributed under the MIT License.
You are free to fork, remix, and share β€” just be kind.