Rework end loop in GrowTownWithBridge

Rework the end loop in GrowTownWithBridge to keep track of bridge
types already tried. This also fixes a bug that prevented the last
bridge type from being tried at all.

(cherry picked from commit 2b1d2c5887f8c3e27a8229ef87d670395aab2011)
pull/73/head
cirdan 8 years ago committed by Jonathan G Rennison
parent f41a125d8e
commit c6d4a6b5e4

@ -10,6 +10,9 @@
/** @file town_cmd.cpp Handling of town tiles. */
#include "stdafx.h"
#include <bitset>
#include "road_internal.h" /* Cleaning up road bits */
#include "road_cmd.h"
#include "landscape.h"
@ -1263,17 +1266,33 @@ static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDi
/* no water tiles in between? */
if (bridge_length == 1) return false;
for (uint8 times = 0; times <= 22; times++) {
byte bridge_type = RandomRange(MAX_BRIDGES - 1);
std::bitset <MAX_BRIDGES> tried;
uint n = MAX_BRIDGES;
byte bridge_type = RandomRange (n);
for (;;) {
/* Can we actually build the bridge? */
if (DoCommand(tile, bridge_tile, bridge_type | ROADTYPES_ROAD << 8 | TRANSPORT_ROAD << 15, CommandFlagsToDCFlags(GetCommandFlags(CMD_BUILD_BRIDGE)), CMD_BUILD_BRIDGE).Succeeded()) {
DoCommand(tile, bridge_tile, bridge_type | ROADTYPES_ROAD << 8 | TRANSPORT_ROAD << 15, DC_EXEC | CommandFlagsToDCFlags(GetCommandFlags(CMD_BUILD_BRIDGE)), CMD_BUILD_BRIDGE);
_grow_town_result = GROWTH_SUCCEED;
return true;
}
/* Try a different bridge. */
tried[bridge_type] = true;
n--;
assert (n + tried.count() == MAX_BRIDGES);
if (n == 0) break;
bridge_type = 0;
uint i = RandomRange (n);
while (tried[bridge_type] || (i-- > 0)) {
bridge_type++;
assert (bridge_type < MAX_BRIDGES);
}
}
/* Quit if it selecting an appropriate bridge type fails a large number of times. */
/* Quit if no bridge can be built. */
return false;
}

Loading…
Cancel
Save