Resolve pending gameplay tickets

This commit is contained in:
Loïc Wisniewski 2026-09-02 13:43:56 +02:00
commit c2ebbfaa2d
28 changed files with 618 additions and 188 deletions

View file

@ -15,54 +15,11 @@ extends Area2D
# for.
const STRIKE_INTERVAL: float = 0.7
# #165: how fast a friendly vessel has to be going before touching a structure
# counts as hitting it. Comfortably above the speed a fleet drifts onto its own
# mothership to unload at, and below cruise - so ordinary docking is free and
# flying INTO a building is not.
const RAM_SPEED: float = 420.0
const RAM_DAMAGE: int = 4
const RAM_DAMAGE_MAX: int = 12
var _strike_timer: float = 0.0
func _ready() -> void:
add_to_group("player_buildings")
area_entered.connect(_on_area_entered)
# #165: a vessel of the player's own, arriving fast enough, damages what it
# hits.
#
# On ENTRY, not on the strike tick above. The tick is right for a siege - an
# enemy parked on a structure is besieging it - but wrong for a collision: a
# vessel is only moving fast for the instant it arrives, and by the time a
# 0.7s tick came round it had already braked to nothing. Measured: a ship sent
# in at 900 did no damage at all until this moved to entry.
#
# Below the threshold it is docking, not a collision. The fleet sits on its own
# mothership constantly to bank ore, and if resting there hurt, the economy
# loop would grind the player's own buildings down.
func _on_area_entered(area: Area2D) -> void:
if not is_instance_valid(area) or not area.is_in_group("player_ships"):
return
# A vessel stationed at an outpost is not ramming it. It launches from
# there, patrols, and comes back - repeatedly, and at speed. Only the
# fleet can collide with a structure.
if area.is_in_group("garrison_ships"):
return
var speed: float = float(area.velocity.length()) if "velocity" in area else 0.0
if speed < RAM_SPEED:
return
var id: int = building_id()
if id == 0:
return
# Scaled by how much faster than the threshold it was going, so a glancing
# touch above the line is not a full-speed charge, and capped so no engine
# upgrade turns a vessel into a wrecking ball.
var impact: int = mini(int(round(RAM_DAMAGE * speed / RAM_SPEED)), RAM_DAMAGE_MAX)
GameState.damage_building(id, impact)
area.take_damage(1)
func building_id() -> int: