From 9eb78ec264ebebe7636efb26e90876b9a67a24cb Mon Sep 17 00:00:00 2001 From: Eugene Blikh Date: Tue, 28 Apr 2026 04:26:10 +0300 Subject: [PATCH] combat: thread ship through shield/evasion readouts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit drawShieldsIndicator and drawEvasionReadout took no Ship and were calling NewPlayerShip() per frame to locate the Shields/Engines room. That allocates a 5-room slice each draw call and hides the coupling. Pass g.ship through instead — explicit interface (GPC1), zero alloc, and the renderer follows whatever layout main.go owns. --- main.go | 4 ++-- render.go | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 0e953700b42aae12d24ba68b5fa551dcac89549b..e6281065be6950174533f6657adb632c35dd64c6 100644 --- a/main.go +++ b/main.go @@ -110,8 +110,8 @@ func (g *Game) Draw(screen *ebiten.Image) { drawHud(screen, g.systems) drawHullBars(screen, g.combat) drawWeaponCharge(screen, g.combat) - drawShieldsIndicator(screen, g.combat, g.systems) - drawEvasionReadout(screen, g.systems) + drawShieldsIndicator(screen, g.ship, g.combat, g.systems) + drawEvasionReadout(screen, g.ship, g.systems) drawResultOverlay(screen, g.combat.Result) } diff --git a/render.go b/render.go index 2f53043154534eb3a83d776bc5f98ff76029322f..b4ba8310d42895100a665b513a3ec1cb4bb12724 100644 --- a/render.go +++ b/render.go @@ -156,16 +156,15 @@ func drawWeaponCharge(screen *ebiten.Image, c Combat) { // drawShieldsIndicator renders dots above the Shields room. // Lit dot = active layer; dim dot = slot available but not yet regenerated. -func drawShieldsIndicator(screen *ebiten.Image, c Combat, sys []System) { +func drawShieldsIndicator(screen *ebiten.Image, s Ship, c Combat, sys []System) { shieldMax := playerShieldMax(sys) if shieldMax == 0 { return } - // Find the Shields room in the player ship layout. var shieldsRoom Room found := false - for _, r := range NewPlayerShip().Rooms { + for _, r := range s.Rooms { if r.Role == RoleShields { shieldsRoom = r found = true @@ -197,13 +196,12 @@ func drawShieldsIndicator(screen *ebiten.Image, c Combat, sys []System) { // drawEvasionReadout renders "Evade: NN%" above the Engines room. // Value is sys[RoleEngines].PowerLevel * 5. -func drawEvasionReadout(screen *ebiten.Image, sys []System) { +func drawEvasionReadout(screen *ebiten.Image, s Ship, sys []System) { pct := sys[int(RoleEngines)].PowerLevel * 5 - // Find the Engines room in the player ship layout. var enginesRoom Room found := false - for _, r := range NewPlayerShip().Rooms { + for _, r := range s.Rooms { if r.Role == RoleEngines { enginesRoom = r found = true