diff --git a/overview/racesclasses.md b/overview/racesclasses.md index 6f3139c..3a18fbe 100644 --- a/overview/racesclasses.md +++ b/overview/racesclasses.md @@ -1,10 +1,10 @@ # 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//`). 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 | |---|------|------|-------------| -| 1 | **Falcon** | Interceptor | Fast all-rounder. Standard guns, high agility. Best 1v1 duelist. | -| 2 | **Devastator** | Bomber | Launches grenades + missiles with large splash radius. Slow, massive damage. | -| 3 | **Sentinel** | Support | Deploys repair drones + turrets. Allies can attach. Mobile spawn point. | -| 4 | **Ranger** | Stealth | Cloaks, fires a single high-damage sniper shot, recloaks. | -| 5 | **Juggernaut** | Heavy | Armored fortress. Drops proximity mines, fires suppression bursts. Near-unkillable solo. | +| 1 | **Warframe** | Interceptor | Very fast, rapid weak laser bursts. Built to close distance instantly and chip away at anything in range. | +| 2 | **Striker** | Gunship | Super fast fire rate, very low damage lasers. Trades hitting power for volume of fire. | +| 3 | **Deployer** | Bomber | Fast lasers plus an EMP mine dropped in your wake. Strong for area denial and covering a retreat. | +| 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 | **Bastion** | Heavy | Tankier and slower, but its laser hits harder than anything else in the fleet. Anchors a push. | --- ### Race 4 — Mechanos Sovereignty ✅ Chosen -**Weapon type:** Railgun / Drone / EMP -**Visual:** Perfectly geometric chrome-and-gold ships. No organic curves. Modular, interchangeable parts. Clearly machine-made. -**Feel:** Pure precision AI. Railgun sniping, drone swarms, and tactical disruption. +**Weapon type:** Cannon / Missile +**Visual:** Heavy industrial war machines, chrome-and-gunmetal plating, red accent lighting. Modular, interchangeable parts. Clearly machine-made. +**Feel:** Brute-force industrial muscle. Durable, hard-hitting, built to grind a fight down rather than outmaneuver it. | # | Ship | Role | Description | |---|------|------|-------------| -| 1 | **Warframe** | Interceptor | Fires precise railgun bursts. Fast. Rewards aim skill. | -| 2 | **Fabricator** | Bomber | Deploys explosive drone clusters — set-and-forget area denial. | -| 3 | **Core Hub** | Support | Broadcasts repair nanobots to nearby allies. Creates mobile spawn beacon. | -| 4 | **Phantom Unit** | Stealth | Hacks enemy targeting — turns off their HUD radar briefly. Hard to detect. | -| 5 | **Siege Engine** | Heavy | Locks into stationary mode for massive railgun barrage. Vulnerable while moving. | +| 1 | **Sentinel** | Interceptor | A light scout mech with twin rapid cannons. Fast and maneuverable for a Mechanos hull. | +| 2 | **Vanguard** | Gunship | Dual autocannons built for sustained fire. Durable enough to hold a line, fast enough to reposition. | +| 3 | **Ravager** | Bomber | Drops heavy ordnance and mines from its cargo pods. Best used to seal off a chokepoint. | +| 4 | **Aegis** | Support | Projects a short-range shield and deploys a repair drone for nearby allies. | +| 5 | **Colossus** | Heavy | A walking fortress bristling with cannons. Slow and telegraphed, but absorbs enormous damage. | --- -### Race 5 — Void Wraiths ✅ Chosen -**Weapon type:** Dark Energy / Gravity / Phase -**Visual:** Inky black ships with white particle trails. Look like holes in space. Shifting, unstable edges. Eerie. -**Feel:** Terrifying and unpredictable. Gravity wells, phase attacks, hard to pin down. +### Race 3 — Vorg Swarm ✅ Chosen +**Weapon type:** Bio / Acid (DoT) +**Visual:** Organic insectoid creatures rather than built ships — chitin, wings, bioluminescent glow. No two look mechanically alike. +**Feel:** Chaotic organic swarm. Corrosive damage-over-time chips away at anyone who lingers nearby. | # | Ship | Role | Description | |---|------|------|-------------| -| 1 | **Shade** | Interceptor | Partially phases — hard to hit. Fires void energy bolts. | -| 2 | **Rift Caster** | Bomber | Opens gravity rifts that pull nearby enemies toward the center then collapse. | -| 3 | **Nexus Wraith** | Support | Creates phase portals allies can teleport through. Ally rally point. | -| 4 | **Specter** | Stealth | Fully phased and invisible. Only visible for 0.3s when firing. | -| 5 | **Void Titan** | Heavy | Absorbs incoming damage, then releases it all in a single omni-directional burst. | +| 1 | **Stinger** | Interceptor | Fast, acid shots with light damage-over-time. Swarms a target from range. | +| 2 | **Spitter** | Gunship | Faster-firing acid with a stronger damage-over-time effect. Sustained corrosive pressure. | +| 3 | **Broodling** | Bomber | Normal acid shots that also spawn a small slowing swarm cloud. Locks down a retreat or chokepoint. | +| 4 | **Nurse** | Support | Acid shots plus a small health/regeneration pack dropped for allies. | +| 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 **Weapon type:** Laser / Crystal Energy | **Feel:** Alien elegance, glass cannon -### Race 3 — Vorg Swarm -**Weapon type:** Bio / Organic (acid, spores) | **Feel:** Zergs in space, DOT chaos +### Race 5 — Void Wraiths +**Weapon type:** Dark Energy / Gravity / Phase | **Feel:** Terrifying and unpredictable, gravity wells and phase attacks, hard to pin down ### Race 6 — Solari Imperium **Weapon type:** Plasma / Solar Fire | **Feel:** Ancient empire, slow and devastating diff --git a/spacewar/autoload/game_config.gd b/spacewar/autoload/game_config.gd index 6796ba9..88802d1 100644 --- a/spacewar/autoload/game_config.gd +++ b/spacewar/autoload/game_config.gd @@ -22,3 +22,5 @@ var bullet_damage: int = 40 var player_name: String = "" var player_race: int = 0 var player_ship_path: String = "" +var player_ship_scale: float = 1.0 +var player_ship_speed_factor: float = 1.0 diff --git a/spacewar/menu/team_select.gd b/spacewar/menu/team_select.gd index cb48e52..1f9adf1 100644 --- a/spacewar/menu/team_select.gd +++ b/spacewar/menu/team_select.gd @@ -1,5 +1,15 @@ 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 := [ { "id": 1, "name": "TERRAN REPUBLIC", "sub": "Angular gray-blue military ships, standard balanced fighters", @@ -8,27 +18,27 @@ const RACES := [ { "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.", - "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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: GameConfig.player_ship_path = ship.path + GameConfig.player_ship_scale = ship.scale + GameConfig.player_ship_speed_factor = ship.speed_factor GameConfig.team_selected.emit() queue_free() diff --git a/spacewar/ships/ship.tscn b/spacewar/ships/ship.tscn index 9c44229..4390113 100644 --- a/spacewar/ships/ship.tscn +++ b/spacewar/ships/ship.tscn @@ -12,6 +12,7 @@ script = ExtResource("1_0e48y") shape = SubResource("CircleShape2D_2uxl3") [node name="Sprite2D" type="Sprite2D" parent="." unique_id=2083904209] +scale = Vector2(0.229, 0.229) texture = ExtResource("2_epypp") [node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="." unique_id=1504818491] diff --git a/spacewar/ships/ship_movement.gd b/spacewar/ships/ship_movement.gd index 8a731e3..208e7c8 100644 --- a/spacewar/ships/ship_movement.gd +++ b/spacewar/ships/ship_movement.gd @@ -25,6 +25,7 @@ func _init_player() -> void: var sprite := get_node_or_null("Sprite2D") if sprite and not GameConfig.player_ship_path.is_empty(): sprite.texture = load(GameConfig.player_ship_path) + sprite.scale = Vector2.ONE * GameConfig.player_ship_scale set_physics_process(true) _respawn() @@ -47,12 +48,14 @@ func _physics_process(delta: float) -> void: rotation -= GameConfig.ship_rotation_speed * delta # 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"): - velocity += Vector2.UP.rotated(rotation) * GameConfig.ship_thrust * delta + velocity += Vector2.UP.rotated(rotation) * thrust * delta 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()