Waveport is a Godot 4 deckbuilding tactics prototype about sailing a modular ship through escalating sea and pirate encounters. The project combines card-driven combat, cannon queue planning, enemy intent readability, ship loadout management, and a stylized voyage map that frames run progression as charting a course across unknown waters.
This repository is a portfolio snapshot focused on systems design, readable gameplay architecture, and UI iteration. It is not a finished commercial release.
- Pirate-map voyage flow: The intermission screen presents the run as a parchment treasure map with unknown destination markers, dotted ink routes, ship movement, and randomized route animations including wavy, zigzag, loopy, and staircase paths.
- Eight-battle run structure: Runs progress through sea encounters, a sea boss, pirate encounters, and a pirate boss while preserving a clear battle-to-battle flow.
- Cannon queue combat: Cannon cards load into a two-cannon firing queue, letting players plan attack order, previews, unloads, and turn timing around enemy intents.
- Modular ship management: The ship preview/loadout overlay supports installed modules, cargo modules, slot types, and between-battle inspection.
- Data-driven enemies: Enemy behavior is defined through reusable data tables for fixed patterns, weighted actions, conditional behavior, formation shifts, and pirate-specific encounters.
- Testing tools: Guided drills and a sandbox enemy selector make it easy to test combat rules, enemy behavior, and edge cases quickly.
Voyage map intermission showing parchment presentation, unknown route markers, and ship course plotting.
Combat prototype with card hand management, cannon loading, queued attack previews, and enemy intent display.
Ship preview/loadout screen used to inspect active slots, installed modules, and cargo capacity.
data/EnemyRunConfig.gdbuilds the current eight-battle run order and annotates encounters with route progress metadata.scenes/IntermissionScreen.gdowns the pirate-map presentation, route selection, ship animation, selected-marker ink effects, and fade into battle.- The map remains presentation-only for now: both unknown markers lead into the existing next-battle progression without adding branching, shops, treasure, or new event systems.
- Cards are defined in
data/CardList.gdand instantiated throughglobals/DeckManager.gd. - Queueable cannon cards are converted into lightweight queue data and managed by
globals/TurnManager.gd. globals/CombatMath.gdpreviews queue outcomes before firing, including order-sensitive bonuses, next-shot multipliers, repeated shots, and module-based cannon bonuses.- The current combat UI limits active cannon loading to two cannon slots, keeping the queue readable and deliberate.
- Enemy behavior is data-driven through
data/EnemyList.gdinstead of being hardcoded per encounter scene. - Enemies can use fixed patterns, weighted action tables, slot-specific side behaviors, conditional actions, and scripted follow-ups through
globals/EnemyActions.gd. - Intent text is generated from the selected action and surfaced in battle so the player can plan around attacks, defense turns, buffs, summons, and formation shifts.
- Ship slots are described in
data/ShipList.gd, while module definitions live indata/ModuleList.gd. globals/PlayerData.gdrecalculates command bonuses, hull bonuses, hand size, queue size, and module-granted cards from the installed loadout.scenes/ShipPreview.gdprovides an inspect/manage overlay for swapping modules between active slots and cargo outside combat.
scenes/BattleScene.gdorchestrates the combat loop: start turn, queue or unload cards, fire the queue, resolve enemy actions, rotate formations, then begin the next turn.- Battle entry now supports a cleaner fade sequence so the map fades out, battle fades in, and enemies appear after the battle screen has loaded.
ui/CannonLoadSlots.gdandui/CannonLoadSlot.gdhandle cannon placement visuals, loaded-card drag behavior, and damage previews.
- Building gameplay systems with clear ownership boundaries across data, global managers, scenes, and reusable UI.
- Iterating on game feel through small, testable presentation passes instead of rewriting core progression.
- Keeping prototype tools available through drills and sandbox fights while preserving the main run flow.
- Translating player-facing feedback into scoped engineering changes: route timing, motion readability, enemy fade sequencing, and combat UI clarity.
- Godot 4.4 or newer is recommended.
- No external addons or third-party dependencies are required.
- Clone or download this repository.
- Open Godot 4 and import the folder that contains
project.godot. - Let Godot finish its first asset reimport pass.
- Press
F5in the editor or use Run Project.
The project currently starts at scenes/MainMenu.tscn.
- Save data is written at runtime to
user://save_slot_1.jsonbyglobals/SaveManager.gd. - If you pull renamed assets or scene changes, reopen the project once so Godot can refresh imports.
- This repo intentionally ignores
.godot/and other local/generated editor artifacts.
- Mouse: play cards, queue attacks, inspect ship slots, and navigate menus
- Fire button: resolve the queued cannon attacks
- Unload button: empty the current queue and refund commands
Tab: open or close the ship preview overlay during battle or voyage intermissionEsc: close the ship preview; in sandbox mode it returns to the sandbox menuR: restart the current sandbox encounter+/-: cycle sandbox enemies while testing
assets/runtime art used by the gamecards/card scene and card behaviordata/card, enemy, ship, module, and run definitionsenemies/enemy scenes and base enemy behaviorglobals/autoload managers and combat systemsmodules/experimental module scene stubsscenes/menus, battle flow, plunder/intermission, drills, and sandboxship/player ship scenes/scriptsui/reusable combat UI scenesmedia/GitHub-facing screenshots and capture assetsdocs/repo audit notes for the public release pass


