How harmonyhoney/rota works
Purpose and Runtime
ROTA: Bend Gravity is a gravity-bending puzzle platformer built in Godot 3.6.1. It targets Linux, Windows, macOS, Web, and Android, with Steam distribution/integration. Godot project and export entry configuration are in project.godot and export_presets.cfg.
Application Entry and Global Services
Godot starts from the scene configured in project.godot; persistent cross-scene behavior is organized as autoload scene/scripts. These provide shared game state, UI, camera, audio/music, transitions, touch input, and cheat handling:
• src/autoload/Shared.gd
• src/autoload/UI.gd
• src/autoload/Cam.gd
• src/autoload/Audio.gd
• src/autoload/Wipe.gd
This is the principal boundary between level-local nodes and application-wide state/presentation services.
Game Flow: Menu, Save Slots, and Options
The menu subsystem owns boot/title flow, file selection/deletion/opening, pause state, attract/demo behavior, player makeover, and input/display/audio settings. Save-oriented data abstractions are centered on src/class/SaveDict.gd, while menu screens operate through:
• src/menu/MenuBoot.gd
• src/menu/MenuTitle.gd
• src/menu/MenuFile.gd
• src/menu/MenuPause.gd
• src/menu/options/MenuOptions.gd
Control transitions from menus into a selected game world/level; pause/options return control to the active play state.
World and Level Composition
Playable content is scene-driven. World directories contain hub scenes and numbered stages, allowing door-based navigation among a large campaign:
• src/map/worlds/0/0_hub.tscn
• src/map/worlds/1/0_hub.tscn
• src/map/worlds/3B/8.tscn
Levels compose reusable actors, environmental details, tile maps, and shaders. Collision/solid terrain and hazard layout are encapsulated in:
• src/stage/SolidTileMap.gd
• src/stage/SpikeMap.gd
• src/stage/tileset/TileSet0.tres
Core Puzzle Gameplay Actors
The player and interactive objects implement the gravity-platforming puzzle loop: movement/gravity control, pushable boxes, hazards, collectibles/goals, NPC guidance/chat, and doors. Door nodes form the main level/world transition boundary:
• src/actor/Player.gd
• src/actor/Box.gd
• src/actor/Spike.gd
• src/actor/Goal.gd
• src/actor/door/Door.gd
Cutscenes coordinate milestone effects such as game start, gem collection, door unlocks, and goal presentation rather than embedding those sequences in level scenes:
• src/cutscene/Cutscene.gd
• src/cutscene/GemCollect.gd
• src/cutscene/DoorUnlock.gd
Arcade Subgame Boundary
A distinct arcade subsystem has its own wrapper, player, game logic, cabinet/screen presentation, audio behavior, and map set. It is embedded into the broader game but maintains separate gameplay scenes:
• src/arcade/Arcade.gd
• src/arcade/ArcadeGame.gd
• src/arcade/Wrapper.gd
• src/arcade/maps/0.tscn
Rendering, Assets, and Platform Integrations
Godot scenes consume packaged sprites, audio, fonts, tile textures, and custom shaders from media/ and src/shader/; audio buses are defined by default_bus_layout.tres. Steam is a native GDNative addon with macOS dynamic libraries and Steam-facing scripts:
• addons/steam_api/plugin.gd
• addons/steam_api/steam.gd
• addons/steam_api/libsteamsdk-godot.dylib
Distribution automation includes Godot and Flatpak GitHub workflows, Linux desktop/metainfo packaging, and platform export helper scripts:
• .github/workflows/godot.yml
• .github/workflows/flatpak.yml
• linux/net.hhoney.rota.yml
Main entry points: 0_hub.tscn Campaign worlds · project.godot Godot project entry · MenuBoot.gd Menu flow · Door.gd Doors
Components 20
Godot Runtime
- Godot project entry · Defines startup scene, autoloads, and export targets.
project.godot - Shared state · Cross-scene game state service.
src/autoload/Shared.gd - UI service
src/autoload/UI.gd - Camera service
src/autoload/Cam.gd - Audio service
src/autoload/Audio.gd - Scene transitions
src/autoload/Wipe.gd - Media & shaders · Sprites, audio, fonts, textures, and shaders.
Menu & Persistence
World Gameplay
- Campaign worlds · Hub-and-stage scene hierarchy.
src/map/worlds/0/0_hub.tscn - Doors · Moves players between levels and worlds.
src/actor/door/Door.gd - Player · Movement and gravity-bending control.
src/actor/Player.gd - Puzzle actors · Boxes, spikes, and goals define puzzle interactions.
src/actor/Box.gd - Terrain & hazards · Tile collision and spike layout.
src/stage/SolidTileMap.gd - Cutscene coordinator · Coordinates milestone presentations and unlock effects.
src/cutscene/Cutscene.gd
Arcade Subgame
- Arcade wrapper · Boundary between campaign and arcade mode.
src/arcade/Wrapper.gd - Arcade game
src/arcade/ArcadeGame.gd - Arcade maps
src/arcade/maps/0.tscn
Platform & Delivery
- Steam integration · Native Steam API bridge and scripts.
addons/steam_api/plugin.gd - Build & packaging · Godot exports plus Flatpak and Linux packaging.
.github/workflows/godot.yml
Connections 25
- Godot project entry → Shared state: autoloads
- Godot project entry → UI service: autoloads
- Godot project entry → Camera service: autoloads
- Godot project entry → Audio service: autoloads
- Godot project entry → Scene transitions: autoloads
- Godot project entry → Menu flow: starts flow
- Menu flow → Save data: reads and updates
- Menu flow → Campaign worlds: loads selected play state
- Campaign worlds → Player: composes
- Campaign worlds → Puzzle actors: composes
- Campaign worlds → Terrain & hazards: composes
- Campaign worlds → Doors: composes
- Player → Puzzle actors: interacts with
- Doors → Campaign worlds: loads destination
- Puzzle actors → Cutscene coordinator: triggers milestones
- Doors → Cutscene coordinator: triggers unlock sequence
- Arcade wrapper → Arcade game: hosts
- Arcade game → Arcade maps: loads
- Campaign worlds → Arcade wrapper: embeds
- Shared state → Campaign worlds: supplies state
- UI service → Menu flow: presents
- Audio service → Arcade game: provides audio
- Media & shaders → Campaign worlds: resources
- Steam integration → Godot project entry: platform integration
- Build & packaging → Godot project entry: builds and exports