(svn r2066) - Fix: [ 1164248 ] game crash while AI builds bridge. Also protect bridge building against invalid bridges and some safeguards when drawing.
authorDarkvater
Fri, 25 Mar 2005 17:30:54 +0000
changeset 1562 20af59a8bc3b
parent 1561 e1e58de5f24a
child 1563 59f8641229fc
(svn r2066) - Fix: [ 1164248 ] game crash while AI builds bridge. Also protect bridge building against invalid bridges and some safeguards when drawing.
ai.c
table/bridge_land.h
tunnelbridge_cmd.c
--- a/ai.c	Fri Mar 25 16:10:33 2005 +0000
+++ b/ai.c	Fri Mar 25 17:30:54 2005 +0000
@@ -1976,7 +1976,7 @@
 		}
 
 		// Is building a (rail)bridge possible at this place (type doesn't matter)?
-		if (DoCommandByTile(tile_new, tile, arf->player->ai.railtype_to_use<<8,
+		if (DoCommandByTile(tile_new, tile, 0 | arf->player->ai.railtype_to_use << 8,
 			DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR)
 				return;
 		AiBuildRailRecursive(arf, tile_new, dir2);
@@ -2139,16 +2139,16 @@
 				unnecessary to check for worse bridge (i=0), since AI will always build that.
 				AI is so fucked up that fixing this small thing will probably not solve a thing
 		*/
-		for(i = 10 + (p->ai.railtype_to_use << 8); i != 0; i--) {
+		for (i = MAX_BRIDGES - 1; i != 0; i--) {
 			if (CheckBridge_Stuff(i, bridge_len)) {
-				int32 cost = DoCommandByTile(arf.bridge_end_tile, p->ai.cur_tile_a, i, DC_AUTO, CMD_BUILD_BRIDGE);
+				int32 cost = DoCommandByTile(arf.bridge_end_tile, p->ai.cur_tile_a, i | (p->ai.railtype_to_use << 8), DC_AUTO, CMD_BUILD_BRIDGE);
 				if (cost != CMD_ERROR && cost < (p->player_money >> 5))
 					break;
 			}
 		}
 
 		// Build it
-		DoCommandByTile(arf.bridge_end_tile, p->ai.cur_tile_a, i, DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
+		DoCommandByTile(arf.bridge_end_tile, p->ai.cur_tile_a, i | (p->ai.railtype_to_use << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
 
 		p->ai.cur_tile_a = arf.bridge_end_tile;
 		p->ai.state_counter = 0;
--- a/table/bridge_land.h	Fri Mar 25 16:10:33 2005 +0000
+++ b/table/bridge_land.h	Fri Mar 25 17:30:54 2005 +0000
@@ -724,7 +724,7 @@
 	_bridge_sprite_table_3_6,
 };
 
-static const uint32 * const * const _bridge_sprite_table[] = {
+static const uint32 * const * const _bridge_sprite_table[MAX_BRIDGES] = {
 	_bridge_sprite_table_0,
 	_bridge_sprite_table_1,
 	_bridge_sprite_table_2,
--- a/tunnelbridge_cmd.c	Fri Mar 25 16:10:33 2005 +0000
+++ b/tunnelbridge_cmd.c	Fri Mar 25 17:30:54 2005 +0000
@@ -197,6 +197,9 @@
 
 	direction = 0;
 
+	if (bridge_type >= MAX_BRIDGES) // out of bounds bridge
+		return_cmd_error(STR_5015_CAN_T_BUILD_BRIDGE_HERE);
+
 	/* check if valid, and make sure that (x,y) are smaller than (sx,sy) */
 	if (x == sx) {
 		if (y == sy)
@@ -1046,7 +1049,7 @@
 			}
 
 			// bridge ending.
-			b = _bridge_sprite_table[_map2[ti->tile]>>4][6];
+			b = _bridge_sprite_table[(_map2[ti->tile] >> 4) & 0xF][6];
 			b += (tmp&(3<<1))*4; /* actually ((tmp>>2)&3)*8 */
 			b += (tmp&1); // direction
 			if (ti->tileh == 0) b += 4; // sloped "entrance" ?
@@ -1106,7 +1109,7 @@
 				DrawGroundSprite(image);
 			}
 			// get bridge sprites
-			b = _bridge_sprite_table[_map2[ti->tile]>>4][_map2[ti->tile]&0xF] + tmp * 4;
+			b = _bridge_sprite_table[(_map2[ti->tile] >> 4) & 0xF][_map2[ti->tile]&0xF] + tmp * 4;
 
 			z = GetBridgeHeight(ti) + 5;