"redistribute"-type flotilla: update
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user