Initial commit — Station 0 vertical slice in progress

Includes full design documentation (ARCHITECTURE, DESIGN_NOTES, CONTENT_SPEC, PRODUCTION_NOTES)
and active Godot 4 / GDScript codebase. Core systems built: player, floor generation,
room system, enemy base, body part upgrades, run manager, save system, HUD, EventBus.
This commit is contained in:
Station 0 Dev
2026-03-04 12:33:05 -05:00
commit 342175f4c3
66 changed files with 4683 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/enemies/anchor.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 13.0
[sub_resource type="CircleShape2D" id="2"]
radius = 15.0
[node name="Anchor" type="CharacterBody2D"]
collision_layer = 8
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Node2D" parent="."]
[node name="Body" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(0, -16, 14, 0, 0, 16, -14, 0)
color = Color(0.1, 0.45, 0.28, 1)
[node name="Eye" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(-3, -7, 3, -7, 3, -2, -3, -2)
color = Color(0.3, 0.95, 0.6, 1)
[node name="ContactArea" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="ContactCollision" type="CollisionShape2D" parent="ContactArea"]
shape = SubResource("2")
+14
View File
@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/enemies/currency_orb.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 8.0
[node name="CurrencyOrb" type="Area2D"]
collision_layer = 0
collision_mask = 2
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
+34
View File
@@ -0,0 +1,34 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/enemies/drifter.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 10.0
[sub_resource type="CircleShape2D" id="2"]
radius = 12.0
[node name="Drifter" type="CharacterBody2D"]
collision_layer = 8
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Node2D" parent="."]
[node name="Body" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(0, -14, 12, 0, 0, 14, -12, 0)
color = Color(0.65, 0.12, 0.42, 1)
[node name="Eye" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(-3, -6, 3, -6, 3, -2, -3, -2)
color = Color(0.9, 0.5, 0.8, 1)
[node name="ContactArea" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="ContactCollision" type="CollisionShape2D" parent="ContactArea"]
shape = SubResource("2")
+34
View File
@@ -0,0 +1,34 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/enemies/enemy_base.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 10.0
[sub_resource type="CircleShape2D" id="2"]
radius = 12.0
[node name="Enemy" type="CharacterBody2D"]
collision_layer = 8
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Node2D" parent="."]
[node name="Body" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(0, -14, 12, 0, 0, 14, -12, 0)
color = Color(0.75, 0.15, 0.15, 1)
[node name="Eye" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(-3, -6, 3, -6, 3, -2, -3, -2)
color = Color(1.0, 0.7, 0.0, 1)
[node name="ContactArea" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="ContactCollision" type="CollisionShape2D" parent="ContactArea"]
shape = SubResource("2")
+14
View File
@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/enemies/enemy_projectile.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 4.0
[node name="EnemyProjectile" type="Area2D"]
collision_layer = 0
collision_mask = 3
script = ExtResource("1")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("1")
+34
View File
@@ -0,0 +1,34 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/enemies/repeater.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 10.0
[sub_resource type="CircleShape2D" id="2"]
radius = 12.0
[node name="Repeater" type="CharacterBody2D"]
collision_layer = 8
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Node2D" parent="."]
[node name="Body" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(0, -14, 12, 0, 0, 14, -12, 0)
color = Color(0.8, 0.35, 0.05, 1)
[node name="Eye" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(-3, -6, 3, -6, 3, -2, -3, -2)
color = Color(1.0, 0.85, 0.3, 1)
[node name="ContactArea" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="ContactCollision" type="CollisionShape2D" parent="ContactArea"]
shape = SubResource("2")
+34
View File
@@ -0,0 +1,34 @@
[gd_scene load_steps=5 format=3]
[ext_resource type="Script" path="res://scripts/enemies/supervisor.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 22.0
[sub_resource type="CircleShape2D" id="2"]
radius = 26.0
[node name="Supervisor" type="CharacterBody2D"]
collision_layer = 8
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Node2D" parent="."]
[node name="Body" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(22, 0, 11, -19, -11, -19, -22, 0, -11, 19, 11, 19)
color = Color(0.2, 0.25, 0.45, 1)
[node name="Eye" type="Polygon2D" parent="Visual"]
polygon = PackedVector2Array(12, -5, 22, -5, 22, 5, 12, 5)
color = Color(1.0, 0.7, 0.1, 1)
[node name="ContactArea" type="Area2D" parent="."]
collision_layer = 0
collision_mask = 2
[node name="ContactCollision" type="CollisionShape2D" parent="ContactArea"]
shape = SubResource("2")
+20
View File
@@ -0,0 +1,20 @@
[gd_scene load_steps=5 format=3]
[ext_resource type="Script" path="res://scripts/hub/hub.gd" id="1"]
[ext_resource type="PackedScene" path="res://scenes/player/player.tscn" id="2"]
[ext_resource type="PackedScene" path="res://scenes/ui/hud.tscn" id="3"]
[ext_resource type="PackedScene" path="res://scenes/ui/armory_ui.tscn" id="4"]
[node name="Hub" type="Node2D"]
script = ExtResource("1")
[node name="Rooms" type="Node2D" parent="."]
[node name="Camera2D" type="Camera2D" parent="."]
zoom = Vector2(2, 2)
[node name="Player" parent="." instance=ExtResource("2")]
[node name="HUD" parent="." instance=ExtResource("3")]
[node name="ArmoryUI" parent="." instance=ExtResource("4")]
+16
View File
@@ -0,0 +1,16 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://scripts/hub/hub_room.gd" id="1"]
[node name="HubRoom" type="Node2D"]
script = ExtResource("1")
[node name="Floor" type="Polygon2D" parent="."]
polygon = PackedVector2Array(-480, -270, 480, -270, 480, 270, -480, 270)
color = Color(0.14, 0.14, 0.20, 1)
[node name="Walls" type="Node2D" parent="."]
[node name="DoorTriggers" type="Node2D" parent="."]
[node name="Contents" type="Node2D" parent="."]
+14
View File
@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/items/run_item_pickup.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 20.0
[node name="RunItemPickup" type="Area2D"]
script = ExtResource("1")
collision_layer = 0
collision_mask = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("1")
+61
View File
@@ -0,0 +1,61 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/player/player.gd" id="1"]
[ext_resource type="Script" path="res://scripts/player/player_stats.gd" id="2"]
[sub_resource type="CircleShape2D" id="1"]
radius = 10.0
[node name="Player" type="CharacterBody2D"]
collision_layer = 2
collision_mask = 1
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Body" type="Node2D" parent="."]
[node name="SlotLegs" type="Node2D" parent="Body"]
[node name="Placeholder" type="Polygon2D" parent="Body/SlotLegs"]
polygon = PackedVector2Array(-8, 4, 8, 4, 8, 14, -8, 14)
color = Color(0.3, 0.35, 0.45, 1)
[node name="SlotTorso" type="Node2D" parent="Body"]
[node name="Placeholder" type="Polygon2D" parent="Body/SlotTorso"]
polygon = PackedVector2Array(-10, -12, 10, -12, 10, 10, -10, 10)
color = Color(0.4, 0.55, 0.75, 1)
[node name="SlotLeftArm" type="Node2D" parent="Body"]
[node name="Placeholder" type="Polygon2D" parent="Body/SlotLeftArm"]
polygon = PackedVector2Array(-16, -8, -10, -8, -10, 6, -16, 6)
color = Color(0.35, 0.5, 0.7, 1)
[node name="SlotRightArm" type="Node2D" parent="Body"]
[node name="Placeholder" type="Polygon2D" parent="Body/SlotRightArm"]
polygon = PackedVector2Array(10, -8, 16, -8, 16, 6, 10, 6)
color = Color(0.35, 0.5, 0.7, 1)
[node name="SlotHead" type="Node2D" parent="Body"]
[node name="Placeholder" type="Polygon2D" parent="Body/SlotHead"]
polygon = PackedVector2Array(-8, -22, 8, -22, 8, -12, -8, -12)
color = Color(0.5, 0.65, 0.85, 1)
[node name="EyeLeft" type="Polygon2D" parent="Body/SlotHead"]
polygon = PackedVector2Array(-5, -20, -2, -20, -2, -17, -5, -17)
color = Color(1, 0.9, 0.3, 1)
[node name="EyeRight" type="Polygon2D" parent="Body/SlotHead"]
polygon = PackedVector2Array(2, -20, 5, -20, 5, -17, 2, -17)
color = Color(1, 0.9, 0.3, 1)
[node name="ShootOrigin" type="Marker2D" parent="."]
position = Vector2(16, 0)
[node name="Stats" type="Node" parent="."]
script = ExtResource("2")
+14
View File
@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/player/projectile.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 5.0
[node name="Projectile" type="Area2D"]
collision_layer = 4
collision_mask = 9
script = ExtResource("1")
[node name="Collision" type="CollisionShape2D" parent="."]
shape = SubResource("1")
+17
View File
@@ -0,0 +1,17 @@
[gd_scene load_steps=4 format=3]
[ext_resource type="Script" path="res://scripts/rooms/floor.gd" id="1"]
[ext_resource type="PackedScene" path="res://scenes/player/player.tscn" id="2"]
[ext_resource type="PackedScene" path="res://scenes/ui/hud.tscn" id="3"]
[node name="Floor" type="Node2D"]
script = ExtResource("1")
[node name="Rooms" type="Node2D" parent="."]
[node name="Camera2D" type="Camera2D" parent="."]
zoom = Vector2(2, 2)
[node name="Player" parent="." instance=ExtResource("2")]
[node name="HUD" parent="." instance=ExtResource("3")]
+16
View File
@@ -0,0 +1,16 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://scripts/rooms/room.gd" id="1"]
[node name="Room" type="Node2D"]
script = ExtResource("1")
[node name="Floor" type="Polygon2D" parent="."]
polygon = PackedVector2Array(-480, -270, 480, -270, 480, 270, -480, 270)
color = Color(0.12, 0.12, 0.18, 1)
[node name="Walls" type="Node2D" parent="."]
[node name="DoorTriggers" type="Node2D" parent="."]
[node name="Contents" type="Node2D" parent="."]
+30
View File
@@ -0,0 +1,30 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="PackedScene" path="res://scenes/player/player.tscn" id="1"]
[ext_resource type="PackedScene" path="res://scenes/enemies/enemy_basic.tscn" id="2"]
[node name="TestRoom" type="Node2D"]
[node name="Floor" type="Polygon2D" parent="."]
polygon = PackedVector2Array(-480, -270, 480, -270, 480, 270, -480, 270)
color = Color(0.12, 0.12, 0.18, 1)
[node name="Camera2D" type="Camera2D" parent="."]
zoom = Vector2(2, 2)
[node name="Player" parent="." instance=ExtResource("1")]
[node name="Enemy1" parent="." instance=ExtResource("2")]
position = Vector2(-200, -130)
[node name="Enemy2" parent="." instance=ExtResource("2")]
position = Vector2(200, -130)
[node name="Enemy3" parent="." instance=ExtResource("2")]
position = Vector2(-200, 130)
[node name="Enemy4" parent="." instance=ExtResource("2")]
position = Vector2(200, 130)
[node name="Enemy5" parent="." instance=ExtResource("2")]
position = Vector2(0, -200)
+6
View File
@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://scripts/ui/armory_ui.gd" id="1"]
[node name="ArmoryUI" type="CanvasLayer"]
script = ExtResource("1")
+6
View File
@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://scripts/ui/hud.gd" id="1"]
[node name="HUD" type="CanvasLayer"]
script = ExtResource("1")
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://scripts/upgrades/body_part_pickup.gd" id="1"]
[sub_resource type="CircleShape2D" id="1"]
radius = 16.0
[node name="BodyPartPickup" type="Area2D"]
script = ExtResource("1")
collision_layer = 0
collision_mask = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("1")
[node name="Visual" type="Polygon2D" parent="."]
color = Color(0.2, 0.9, 0.85, 1)
polygon = PackedVector2Array(12, 0, 6, 10.392305, -6, 10.392305, -12, 0, -6, -10.392305, 6, -10.392305)