diff --git a/vacuum_gambit.p8 b/vacuum_gambit.p8 index 5291039..5e5d6c8 100644 --- a/vacuum_gambit.p8 +++ b/vacuum_gambit.p8 @@ -1570,7 +1570,7 @@ function flotilla:load(ulc_cx, ulc_cy, lvl) -- and we allow alternates -- for this type of ship ship_t+=(uv>>ship_t&0x1)&(f&0x10>>4) - add(row, self.ship_bases[ship_t]:new{column=cx-ulc_cx}) + add(row, self.ship_bases[ship_t]:new{col=cx-ulc_cx}) end end until mode==1 @@ -1602,7 +1602,59 @@ function flotilla:statisfy(counts) end function flotilla:update() - -- TODO: assign new want_x, want_y to everyone who isn't dead + -- algorithm: redistribute + -- TODO: alternate flotilla movement algorithms + + -- find effective width and height + local min_col,max_col,live_rows=999,0,0 + for row in all(self.rows) do + local row_alive=false + for ship in all(row) do + if not ship.dead then + row_alive=true + local col=ship.col + if (col < min_col) min_col = col + if (col > max_col) max_col = col + end + end -- scanned row + if (row_alive) live_rows += 1 + end -- extent search + + if (live_rows == 0) return true -- done + + -- distribute across box: + -- x = [4, 100) + -- y = [4, 80) + + local x_interval,x_offset = 0,52 + if min_col < max_col then + x_interval=96/(max_col-min_col) + x_offset = 4-min_col*x_interval + end + + local y_interval,y_offset=0,40 + if live_rows > 1 then + y_interval=76/(live_rows-1) + x_offset=4-y_interval + end + + -- now assign target locations + local real_row=0 + for row in all(self.rows) do + local row_alive = false + for ship in all(row) do + if not ship.dead then + if not row_alive then + real_row += 1 + row_alive = true + end + ship.want_x = ship.col * x_interval - x_offset + ship.want_y = real_row * y_interval - y_offset + end -- ship updated + end -- row updated + end -- table updated + + return false -- some ships remain end -->8