~bigbes/game-prototype-ftl

9eb78ec264ebebe7636efb26e90876b9a67a24cb — Eugene Blikh 30 days ago 5eed43f
combat: thread ship through shield/evasion readouts

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.
2 files changed, 6 insertions(+), 8 deletions(-)

M main.go
M render.go
M main.go => main.go +2 -2
@@ 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)
}


M render.go => render.go +4 -6
@@ 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