Per-ship scale/speed factors and updated race/class doc

Give each ship an explicit sprite scale (tuned per role so an
Interceptor/Gunship/Bomber/Support/Heavy reads the same size across
all 3 races, then reduced another 25% per feedback that ships felt
oversized) and a movement speed_factor pulled from a shared
SPEED_BY_ROLE table, so e.g. every race's Interceptor moves at the
same speed as every other race's. GameConfig carries both through to
ship_movement.gd, which now scales thrust/max_speed by the chosen
ship's factor.

Rewrite overview/racesclasses.md to match what's actually implemented:
real ship names/roles for Terran Republic and Vorg Swarm, fill in the
previously-undocumented Mechanos Sovereignty roster, and correct the
chosen-race list now that Vorg Swarm (bio/acid swarm, matching the
uploaded art) replaced Void Wraiths as the third chosen race.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 23:14:30 -04:00
parent 9dce0177ac
commit 019f434995
5 changed files with 63 additions and 45 deletions
+27 -27
View File
@@ -1,10 +1,10 @@
# Races & Ship Classes # Races & Ship Classes
## Chosen Races: 1, 4, 5 ## Chosen Races: 1, 4, 3
From the 10 concepts below, races **1 (Terran Republic)**, **4 (Mechanos Sovereignty)**, and **5 (Void Wraiths)** were selected. From the 10 concepts below, races **1 (Terran Republic)**, **4 (Mechanos Sovereignty)**, and **3 (Vorg Swarm)** were selected.
> **Current in-game status:** The team selection screen uses temporary placeholder names ("Terran Federation", "The Collective", "Iron Order") with placeholder sprites until proper art and lore are integrated for the 3 chosen races. > **Current in-game status:** Team selection now uses the real race names and real ship art for all 3 chosen races (`assets/images/ships/<race>/`). Each race has its own 5-ship roster — Interceptor, Gunship, Bomber, Support, Heavy — matching the tables below. See `team_select.gd`.
--- ---
@@ -17,41 +17,41 @@ From the 10 concepts below, races **1 (Terran Republic)**, **4 (Mechanos Soverei
| # | Ship | Role | Description | | # | Ship | Role | Description |
|---|------|------|-------------| |---|------|------|-------------|
| 1 | **Falcon** | Interceptor | Fast all-rounder. Standard guns, high agility. Best 1v1 duelist. | | 1 | **Warframe** | Interceptor | Very fast, rapid weak laser bursts. Built to close distance instantly and chip away at anything in range. |
| 2 | **Devastator** | Bomber | Launches grenades + missiles with large splash radius. Slow, massive damage. | | 2 | **Striker** | Gunship | Super fast fire rate, very low damage lasers. Trades hitting power for volume of fire. |
| 3 | **Sentinel** | Support | Deploys repair drones + turrets. Allies can attach. Mobile spawn point. | | 3 | **Deployer** | Bomber | Fast lasers plus an EMP mine dropped in your wake. Strong for area denial and covering a retreat. |
| 4 | **Ranger** | Stealth | Cloaks, fires a single high-damage sniper shot, recloaks. | | 4 | **Link Node** | Support | Lasers plus a small repair pack dropped for allies to pick up. Keeps a team topped off in prolonged fights. |
| 5 | **Juggernaut** | Heavy | Armored fortress. Drops proximity mines, fires suppression bursts. Near-unkillable solo. | | 5 | **Bastion** | Heavy | Tankier and slower, but its laser hits harder than anything else in the fleet. Anchors a push. |
--- ---
### Race 4 — Mechanos Sovereignty ✅ Chosen ### Race 4 — Mechanos Sovereignty ✅ Chosen
**Weapon type:** Railgun / Drone / EMP **Weapon type:** Cannon / Missile
**Visual:** Perfectly geometric chrome-and-gold ships. No organic curves. Modular, interchangeable parts. Clearly machine-made. **Visual:** Heavy industrial war machines, chrome-and-gunmetal plating, red accent lighting. Modular, interchangeable parts. Clearly machine-made.
**Feel:** Pure precision AI. Railgun sniping, drone swarms, and tactical disruption. **Feel:** Brute-force industrial muscle. Durable, hard-hitting, built to grind a fight down rather than outmaneuver it.
| # | Ship | Role | Description | | # | Ship | Role | Description |
|---|------|------|-------------| |---|------|------|-------------|
| 1 | **Warframe** | Interceptor | Fires precise railgun bursts. Fast. Rewards aim skill. | | 1 | **Sentinel** | Interceptor | A light scout mech with twin rapid cannons. Fast and maneuverable for a Mechanos hull. |
| 2 | **Fabricator** | Bomber | Deploys explosive drone clusters — set-and-forget area denial. | | 2 | **Vanguard** | Gunship | Dual autocannons built for sustained fire. Durable enough to hold a line, fast enough to reposition. |
| 3 | **Core Hub** | Support | Broadcasts repair nanobots to nearby allies. Creates mobile spawn beacon. | | 3 | **Ravager** | Bomber | Drops heavy ordnance and mines from its cargo pods. Best used to seal off a chokepoint. |
| 4 | **Phantom Unit** | Stealth | Hacks enemy targeting — turns off their HUD radar briefly. Hard to detect. | | 4 | **Aegis** | Support | Projects a short-range shield and deploys a repair drone for nearby allies. |
| 5 | **Siege Engine** | Heavy | Locks into stationary mode for massive railgun barrage. Vulnerable while moving. | | 5 | **Colossus** | Heavy | A walking fortress bristling with cannons. Slow and telegraphed, but absorbs enormous damage. |
--- ---
### Race 5 — Void Wraiths ✅ Chosen ### Race 3 — Vorg Swarm ✅ Chosen
**Weapon type:** Dark Energy / Gravity / Phase **Weapon type:** Bio / Acid (DoT)
**Visual:** Inky black ships with white particle trails. Look like holes in space. Shifting, unstable edges. Eerie. **Visual:** Organic insectoid creatures rather than built ships — chitin, wings, bioluminescent glow. No two look mechanically alike.
**Feel:** Terrifying and unpredictable. Gravity wells, phase attacks, hard to pin down. **Feel:** Chaotic organic swarm. Corrosive damage-over-time chips away at anyone who lingers nearby.
| # | Ship | Role | Description | | # | Ship | Role | Description |
|---|------|------|-------------| |---|------|------|-------------|
| 1 | **Shade** | Interceptor | Partially phases — hard to hit. Fires void energy bolts. | | 1 | **Stinger** | Interceptor | Fast, acid shots with light damage-over-time. Swarms a target from range. |
| 2 | **Rift Caster** | Bomber | Opens gravity rifts that pull nearby enemies toward the center then collapse. | | 2 | **Spitter** | Gunship | Faster-firing acid with a stronger damage-over-time effect. Sustained corrosive pressure. |
| 3 | **Nexus Wraith** | Support | Creates phase portals allies can teleport through. Ally rally point. | | 3 | **Broodling** | Bomber | Normal acid shots that also spawn a small slowing swarm cloud. Locks down a retreat or chokepoint. |
| 4 | **Specter** | Stealth | Fully phased and invisible. Only visible for 0.3s when firing. | | 4 | **Nurse** | Support | Acid shots plus a small health/regeneration pack dropped for allies. |
| 5 | **Void Titan** | Heavy | Absorbs incoming damage, then releases it all in a single omni-directional burst. | | 5 | **Behemoth** | Heavy | Tankier and slower, with heavy acid shots that carry a large damage-over-time effect. The swarm's apex predator. |
--- ---
@@ -63,8 +63,8 @@ From the 10 concepts below, races **1 (Terran Republic)**, **4 (Mechanos Soverei
### Race 2 — Xel'Nara Collective ### Race 2 — Xel'Nara Collective
**Weapon type:** Laser / Crystal Energy | **Feel:** Alien elegance, glass cannon **Weapon type:** Laser / Crystal Energy | **Feel:** Alien elegance, glass cannon
### Race 3 — Vorg Swarm ### Race 5 — Void Wraiths
**Weapon type:** Bio / Organic (acid, spores) | **Feel:** Zergs in space, DOT chaos **Weapon type:** Dark Energy / Gravity / Phase | **Feel:** Terrifying and unpredictable, gravity wells and phase attacks, hard to pin down
### Race 6 — Solari Imperium ### Race 6 — Solari Imperium
**Weapon type:** Plasma / Solar Fire | **Feel:** Ancient empire, slow and devastating **Weapon type:** Plasma / Solar Fire | **Feel:** Ancient empire, slow and devastating
+2
View File
@@ -22,3 +22,5 @@ var bullet_damage: int = 40
var player_name: String = "" var player_name: String = ""
var player_race: int = 0 var player_race: int = 0
var player_ship_path: String = "" var player_ship_path: String = ""
var player_ship_scale: float = 1.0
var player_ship_speed_factor: float = 1.0
+27 -15
View File
@@ -1,5 +1,15 @@
extends CanvasLayer extends CanvasLayer
# Movement speed factor by role, shared across all 3 races so e.g. every
# race's Interceptor moves at the same speed as every other race's.
const SPEED_BY_ROLE := {
"Interceptor": 1.3,
"Gunship": 1.15,
"Bomber": 1.0,
"Support": 0.9,
"Heavy": 0.7,
}
const RACES := [ const RACES := [
{ {
"id": 1, "name": "TERRAN REPUBLIC", "sub": "Angular gray-blue military ships, standard balanced fighters", "id": 1, "name": "TERRAN REPUBLIC", "sub": "Angular gray-blue military ships, standard balanced fighters",
@@ -8,27 +18,27 @@ const RACES := [
{ {
"name": "WARFRAME", "role": "Interceptor", "name": "WARFRAME", "role": "Interceptor",
"desc": "Very fast, rapid weak laser bursts. Built to close distance instantly and chip away at anything in range. Low individual hit strength but a relentless rate of fire punishes anyone who stands still.", "desc": "Very fast, rapid weak laser bursts. Built to close distance instantly and chip away at anything in range. Low individual hit strength but a relentless rate of fire punishes anyone who stands still.",
"path": "res://assets/images/ships/terran/warframe.png", "path": "res://assets/images/ships/terran/warframe.png", "scale": 0.229, "speed_factor": SPEED_BY_ROLE.Interceptor,
}, },
{ {
"name": "STRIKER", "role": "Gunship", "name": "STRIKER", "role": "Gunship",
"desc": "Super fast fire rate, very low damage lasers. Trades hitting power for volume — the more shots in the air, the more that connect. Best flown aggressively, applying constant pressure rather than picking single shots.", "desc": "Super fast fire rate, very low damage lasers. Trades hitting power for volume — the more shots in the air, the more that connect. Best flown aggressively, applying constant pressure rather than picking single shots.",
"path": "res://assets/images/ships/terran/striker.png", "path": "res://assets/images/ships/terran/striker.png", "scale": 0.244, "speed_factor": SPEED_BY_ROLE.Gunship,
}, },
{ {
"name": "DEPLOYER", "role": "Bomber", "name": "DEPLOYER", "role": "Bomber",
"desc": "Fast lasers plus an EMP mine dropped in your wake. Punishes anyone chasing too closely and disables systems on contact. Strong for area denial and covering a retreat.", "desc": "Fast lasers plus an EMP mine dropped in your wake. Punishes anyone chasing too closely and disables systems on contact. Strong for area denial and covering a retreat.",
"path": "res://assets/images/ships/terran/deployer.png", "path": "res://assets/images/ships/terran/deployer.png", "scale": 0.265, "speed_factor": SPEED_BY_ROLE.Bomber,
}, },
{ {
"name": "LINK NODE", "role": "Support", "name": "LINK NODE", "role": "Support",
"desc": "Standard lasers plus a small repair pack dropped for allies to pick up. Keeps a team topped off in prolonged fights. Not built to duel alone — stay near the fight, not in the middle of it.", "desc": "Standard lasers plus a small repair pack dropped for allies to pick up. Keeps a team topped off in prolonged fights. Not built to duel alone — stay near the fight, not in the middle of it.",
"path": "res://assets/images/ships/terran/link_node.png", "path": "res://assets/images/ships/terran/link_node.png", "scale": 0.329, "speed_factor": SPEED_BY_ROLE.Support,
}, },
{ {
"name": "BASTION", "role": "Heavy", "name": "BASTION", "role": "Heavy",
"desc": "Tankier and slower, but its laser hits harder than anything else in the fleet. Built to anchor a push and absorb damage while dealing it back. Discourages anyone from engaging head-on.", "desc": "Tankier and slower, but its laser hits harder than anything else in the fleet. Built to anchor a push and absorb damage while dealing it back. Discourages anyone from engaging head-on.",
"path": "res://assets/images/ships/terran/bastion.png", "path": "res://assets/images/ships/terran/bastion.png", "scale": 0.283, "speed_factor": SPEED_BY_ROLE.Heavy,
}, },
], ],
}, },
@@ -39,27 +49,27 @@ const RACES := [
{ {
"name": "SENTINEL", "role": "Interceptor", "name": "SENTINEL", "role": "Interceptor",
"desc": "A light scout mech with twin rapid cannons. Fast and maneuverable for a Mechanos hull, built to screen the front line and harass before the heavier machines arrive.", "desc": "A light scout mech with twin rapid cannons. Fast and maneuverable for a Mechanos hull, built to screen the front line and harass before the heavier machines arrive.",
"path": "res://assets/images/ships/mech/sentinel.png", "path": "res://assets/images/ships/mech/sentinel.png", "scale": 0.205, "speed_factor": SPEED_BY_ROLE.Interceptor,
}, },
{ {
"name": "VANGUARD", "role": "Gunship", "name": "VANGUARD", "role": "Gunship",
"desc": "Dual autocannons built for sustained fire. Sits between the light scouts and the heavy machines — durable enough to hold a line, fast enough to reposition when it breaks.", "desc": "Dual autocannons built for sustained fire. Sits between the light scouts and the heavy machines — durable enough to hold a line, fast enough to reposition when it breaks.",
"path": "res://assets/images/ships/mech/vanguard.png", "path": "res://assets/images/ships/mech/vanguard.png", "scale": 0.266, "speed_factor": SPEED_BY_ROLE.Gunship,
}, },
{ {
"name": "RAVAGER", "role": "Bomber", "name": "RAVAGER", "role": "Bomber",
"desc": "Drops heavy ordnance and mines from its cargo pods. Slow to turn but devastating to anything caught in the blast radius. Best used to seal off a chokepoint.", "desc": "Drops heavy ordnance and mines from its cargo pods. Slow to turn but devastating to anything caught in the blast radius. Best used to seal off a chokepoint.",
"path": "res://assets/images/ships/mech/ravager.png", "path": "res://assets/images/ships/mech/ravager.png", "scale": 0.25, "speed_factor": SPEED_BY_ROLE.Bomber,
}, },
{ {
"name": "AEGIS", "role": "Support", "name": "AEGIS", "role": "Support",
"desc": "Projects a short-range shield and deploys a repair drone for nearby allies. Doesn't hit hard on its own — its job is keeping everyone else alive long enough to win the fight.", "desc": "Projects a short-range shield and deploys a repair drone for nearby allies. Doesn't hit hard on its own — its job is keeping everyone else alive long enough to win the fight.",
"path": "res://assets/images/ships/mech/aegis.png", "path": "res://assets/images/ships/mech/aegis.png", "scale": 0.248, "speed_factor": SPEED_BY_ROLE.Support,
}, },
{ {
"name": "COLOSSUS", "role": "Heavy", "name": "COLOSSUS", "role": "Heavy",
"desc": "A walking fortress bristling with cannons. Slow and telegraphed, but absorbs enormous damage and returns it with interest. Usually the last thing standing in an engagement.", "desc": "A walking fortress bristling with cannons. Slow and telegraphed, but absorbs enormous damage and returns it with interest. Usually the last thing standing in an engagement.",
"path": "res://assets/images/ships/mech/colossus.png", "path": "res://assets/images/ships/mech/colossus.png", "scale": 0.252, "speed_factor": SPEED_BY_ROLE.Heavy,
}, },
], ],
}, },
@@ -70,27 +80,27 @@ const RACES := [
{ {
"name": "STINGER", "role": "Interceptor", "name": "STINGER", "role": "Interceptor",
"desc": "Fast, acid shots with light damage-over-time. Built to swarm a target from range, applying just enough acid to wear an enemy down before backing off.", "desc": "Fast, acid shots with light damage-over-time. Built to swarm a target from range, applying just enough acid to wear an enemy down before backing off.",
"path": "res://assets/images/ships/vorg/stinger.png", "path": "res://assets/images/ships/vorg/stinger.png", "scale": 0.254, "speed_factor": SPEED_BY_ROLE.Interceptor,
}, },
{ {
"name": "SPITTER", "role": "Gunship", "name": "SPITTER", "role": "Gunship",
"desc": "Faster-firing acid with a stronger damage-over-time effect. Trades some speed for sustained corrosive pressure — anything it tags keeps taking damage long after contact.", "desc": "Faster-firing acid with a stronger damage-over-time effect. Trades some speed for sustained corrosive pressure — anything it tags keeps taking damage long after contact.",
"path": "res://assets/images/ships/vorg/spitter.png", "path": "res://assets/images/ships/vorg/spitter.png", "scale": 0.247, "speed_factor": SPEED_BY_ROLE.Gunship,
}, },
{ {
"name": "BROODLING", "role": "Bomber", "name": "BROODLING", "role": "Bomber",
"desc": "Normal acid shots that also spawn a small slowing swarm cloud. The cloud lingers, fouling movement for anyone caught inside it — ideal for locking down a retreat or a chokepoint.", "desc": "Normal acid shots that also spawn a small slowing swarm cloud. The cloud lingers, fouling movement for anyone caught inside it — ideal for locking down a retreat or a chokepoint.",
"path": "res://assets/images/ships/vorg/broodling.png", "path": "res://assets/images/ships/vorg/broodling.png", "scale": 0.404, "speed_factor": SPEED_BY_ROLE.Bomber,
}, },
{ {
"name": "NURSE", "role": "Support", "name": "NURSE", "role": "Support",
"desc": "Acid shots plus a small health/regeneration pack dropped for allies. Keeps the swarm alive in extended fights, at the cost of raw offensive power.", "desc": "Acid shots plus a small health/regeneration pack dropped for allies. Keeps the swarm alive in extended fights, at the cost of raw offensive power.",
"path": "res://assets/images/ships/vorg/nurse.png", "path": "res://assets/images/ships/vorg/nurse.png", "scale": 0.271, "speed_factor": SPEED_BY_ROLE.Support,
}, },
{ {
"name": "BEHEMOTH", "role": "Heavy", "name": "BEHEMOTH", "role": "Heavy",
"desc": "Tankier and slower, with heavy acid shots that carry a large damage-over-time effect. The swarm's apex predator — absorbs punishment while its acid keeps eating away at anyone nearby.", "desc": "Tankier and slower, with heavy acid shots that carry a large damage-over-time effect. The swarm's apex predator — absorbs punishment while its acid keeps eating away at anyone nearby.",
"path": "res://assets/images/ships/vorg/behemoth.png", "path": "res://assets/images/ships/vorg/behemoth.png", "scale": 0.171, "speed_factor": SPEED_BY_ROLE.Heavy,
}, },
], ],
}, },
@@ -193,6 +203,8 @@ func _show_ship_selection() -> void:
func _on_ship_chosen(ship: Dictionary) -> void: func _on_ship_chosen(ship: Dictionary) -> void:
GameConfig.player_ship_path = ship.path GameConfig.player_ship_path = ship.path
GameConfig.player_ship_scale = ship.scale
GameConfig.player_ship_speed_factor = ship.speed_factor
GameConfig.team_selected.emit() GameConfig.team_selected.emit()
queue_free() queue_free()
+1
View File
@@ -12,6 +12,7 @@ script = ExtResource("1_0e48y")
shape = SubResource("CircleShape2D_2uxl3") shape = SubResource("CircleShape2D_2uxl3")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2083904209] [node name="Sprite2D" type="Sprite2D" parent="." unique_id=2083904209]
scale = Vector2(0.229, 0.229)
texture = ExtResource("2_epypp") texture = ExtResource("2_epypp")
[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="." unique_id=1504818491] [node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="." unique_id=1504818491]
+6 -3
View File
@@ -25,6 +25,7 @@ func _init_player() -> void:
var sprite := get_node_or_null("Sprite2D") var sprite := get_node_or_null("Sprite2D")
if sprite and not GameConfig.player_ship_path.is_empty(): if sprite and not GameConfig.player_ship_path.is_empty():
sprite.texture = load(GameConfig.player_ship_path) sprite.texture = load(GameConfig.player_ship_path)
sprite.scale = Vector2.ONE * GameConfig.player_ship_scale
set_physics_process(true) set_physics_process(true)
_respawn() _respawn()
@@ -47,12 +48,14 @@ func _physics_process(delta: float) -> void:
rotation -= GameConfig.ship_rotation_speed * delta rotation -= GameConfig.ship_rotation_speed * delta
# 3. THRUST # 3. THRUST
var thrust := GameConfig.ship_thrust * GameConfig.player_ship_speed_factor
var max_speed := GameConfig.ship_max_speed * GameConfig.player_ship_speed_factor
if Input.is_action_pressed("move_up"): if Input.is_action_pressed("move_up"):
velocity += Vector2.UP.rotated(rotation) * GameConfig.ship_thrust * delta velocity += Vector2.UP.rotated(rotation) * thrust * delta
if Input.is_action_pressed("move_down"): if Input.is_action_pressed("move_down"):
velocity += Vector2.DOWN.rotated(rotation) * GameConfig.ship_thrust * delta velocity += Vector2.DOWN.rotated(rotation) * thrust * delta
velocity = velocity.limit_length(GameConfig.ship_max_speed) velocity = velocity.limit_length(max_speed)
move_and_slide() move_and_slide()