1
0
Fork 0

(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!

release/0.4.5
truelight 2004-09-10 19:02:27 +00:00
parent 1c1a5b91c9
commit eb49a19460
82 changed files with 1857 additions and 1857 deletions

196
ai.c
View File

@ -68,7 +68,7 @@ static void AiCase1(Player *p)
static void AiStateVehLoop(Player *p) static void AiStateVehLoop(Player *p)
{ {
Vehicle *v; Vehicle *v;
v = p->ai.cur_veh == NULL ? _vehicles : p->ai.cur_veh+1; v = p->ai.cur_veh == NULL ? _vehicles : p->ai.cur_veh+1;
for (;v != endof(_vehicles); v++) { for (;v != endof(_vehicles); v++) {
@ -79,7 +79,7 @@ static void AiStateVehLoop(Player *p)
v->type == VEH_Road || v->type == VEH_Road ||
(v->type == VEH_Aircraft && v->subtype <= 2) || (v->type == VEH_Aircraft && v->subtype <= 2) ||
v->type == VEH_Ship) { v->type == VEH_Ship) {
/* replace engine? */ /* replace engine? */
if (v->type == VEH_Train && v->engine_type < 3 && if (v->type == VEH_Train && v->engine_type < 3 &&
(_price.build_railvehicle >> 3) < p->player_money) { (_price.build_railvehicle >> 3) < p->player_money) {
@ -115,7 +115,7 @@ static void AiStateVehLoop(Player *p)
// XXX // XXX
static const byte _rail_locos_count[3] = { static const byte _rail_locos_count[3] = {
27, 3, 5 27, 3, 5
}; };
extern const byte _rail_engines_start[3]; extern const byte _rail_engines_start[3];
@ -130,14 +130,14 @@ static int AiChooseTrainToBuild(byte railtype, int32 money, byte flag)
Engine *e = &_engines[i]; Engine *e = &_engines[i];
do { do {
assert(!(_rail_vehicle_info[i].flags & RVI_WAGON)); assert(!(_rail_vehicle_info[i].flags & RVI_WAGON));
if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D)
continue; continue;
r = DoCommandByTile(0, i, 0, 0, CMD_BUILD_RAIL_VEHICLE); r = DoCommandByTile(0, i, 0, 0, CMD_BUILD_RAIL_VEHICLE);
if (r != CMD_ERROR && if (r != CMD_ERROR &&
(!(_cmd_build_rail_veh_var1&1) || !(flag&1)) && (!(_cmd_build_rail_veh_var1&1) || !(flag&1)) &&
r <= money && r <= money &&
_cmd_build_rail_veh_score >= best_veh_score) { _cmd_build_rail_veh_score >= best_veh_score) {
best_veh_score = _cmd_build_rail_veh_score; best_veh_score = _cmd_build_rail_veh_score;
best_veh_index = i; best_veh_index = i;
@ -206,7 +206,7 @@ static int32 AiGetBasePrice(Player *p)
// adjust base price when more expensive vehicles are available // adjust base price when more expensive vehicles are available
if (p->ai.railtype_to_use == 1) base = (base * 3) >> 1; if (p->ai.railtype_to_use == 1) base = (base * 3) >> 1;
else if (p->ai.railtype_to_use == 2) base *= 2; else if (p->ai.railtype_to_use == 2) base *= 2;
return base; return base;
} }
@ -266,7 +266,7 @@ static void AiHandleGotoDepot(Player *p, int cmd)
p->ai.cur_veh->next_order = OT_DUMMY; p->ai.cur_veh->next_order = OT_DUMMY;
InvalidateWindow(WC_VEHICLE_VIEW, p->ai.cur_veh->index); InvalidateWindow(WC_VEHICLE_VIEW, p->ai.cur_veh->index);
} }
} }
static void AiRestoreVehicleOrders(Vehicle *v, BackuppedOrders *bak) static void AiRestoreVehicleOrders(Vehicle *v, BackuppedOrders *bak)
{ {
@ -296,7 +296,7 @@ static void AiHandleReplaceTrain(Player *p)
if (veh != -1) { if (veh != -1) {
BackupVehicleOrders(v, orderbak); BackupVehicleOrders(v, orderbak);
tile = v->tile; tile = v->tile;
if (DoCommandByTile(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON) != CMD_ERROR && if (DoCommandByTile(0, v->index, 2, DC_EXEC, CMD_SELL_RAIL_WAGON) != CMD_ERROR &&
DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE) != CMD_ERROR) { DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_RAIL_VEHICLE) != CMD_ERROR) {
veh = _new_train_id; veh = _new_train_id;
@ -324,7 +324,7 @@ static void AiHandleReplaceRoadVeh(Player *p)
if (veh != -1) { if (veh != -1) {
BackupVehicleOrders(v, orderbak); BackupVehicleOrders(v, orderbak);
tile = v->tile; tile = v->tile;
if (DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH) != CMD_ERROR && if (DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH) != CMD_ERROR &&
DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH) != CMD_ERROR) { DoCommandByTile(tile, veh, 0, DC_EXEC, CMD_BUILD_ROAD_VEH) != CMD_ERROR) {
veh = _new_roadveh_id; veh = _new_roadveh_id;
@ -437,7 +437,7 @@ static void AiFindSubsidyIndustryRoute(FoundRoute *fr)
// initially error // initially error
fr->distance = -1; fr->distance = -1;
// Randomize subsidy index.. // Randomize subsidy index..
i = RandomRange(lengthof(_subsidies) * 3); i = RandomRange(lengthof(_subsidies) * 3);
if (i >= lengthof(_subsidies)) if (i >= lengthof(_subsidies))
return; return;
@ -476,7 +476,7 @@ static void AiFindSubsidyPassengerRoute(FoundRoute *fr)
// initially error // initially error
fr->distance = -1; fr->distance = -1;
// Randomize subsidy index.. // Randomize subsidy index..
i = RandomRange(lengthof(_subsidies) * 3); i = RandomRange(lengthof(_subsidies) * 3);
if (i >= lengthof(_subsidies)) if (i >= lengthof(_subsidies))
return; return;
@ -512,7 +512,7 @@ static void AiFindRandomIndustryRoute(FoundRoute *fr)
// pick a source // pick a source
fr->from = i = AiFindRandomIndustry(); fr->from = i = AiFindRandomIndustry();
if (i == NULL) if (i == NULL)
return; return;
// pick a random produced cargo // pick a random produced cargo
@ -539,7 +539,7 @@ static void AiFindRandomIndustryRoute(FoundRoute *fr)
t = AiFindRandomTown(); t = AiFindRandomTown();
if (t == NULL || t->population < (uint32)(cargo == CT_FOOD ? 200 : 900)) if (t == NULL || t->population < (uint32)(cargo == CT_FOOD ? 200 : 900))
return; return;
fr->to = t; fr->to = t;
fr->distance = GetTileDist(i->xy, t->xy); fr->distance = GetTileDist(i->xy, t->xy);
} }
@ -558,7 +558,7 @@ static void AiFindRandomPassengerRoute(FoundRoute *fr)
fr->from = source = AiFindRandomTown(); fr->from = source = AiFindRandomTown();
if (source == NULL || source->population < 400) if (source == NULL || source->population < 400)
return; return;
fr->to = dest = AiFindRandomTown(); fr->to = dest = AiFindRandomTown();
if (dest == NULL || source == dest || dest->population < 400) if (dest == NULL || source == dest || dest->population < 400)
return; return;
@ -589,7 +589,7 @@ static bool AiCheckIfRouteIsGood(Player *p, FoundRoute *fr, byte bitmask)
if (to_tile == from_tile && st->xy == to_tile) if (to_tile == from_tile && st->xy == to_tile)
same_station++; same_station++;
} }
// To prevent the AI from building ten busstations in the same town, do some calculations // To prevent the AI from building ten busstations in the same town, do some calculations
// For each road or airport station, we want 350 of population! // For each road or airport station, we want 350 of population!
if ((bitmask == 2 || bitmask == 4) && same_station > 2 && ((Town *)(fr->from))->population < same_station * 350) if ((bitmask == 2 || bitmask == 4) && same_station > 2 && ((Town *)(fr->from))->population < same_station * 350)
@ -612,8 +612,8 @@ static bool AiCheckIfRouteIsGood(Player *p, FoundRoute *fr, byte bitmask)
return false; return false;
} else { } else {
Industry *i = (Industry*)fr->from; Industry *i = (Industry*)fr->from;
if (i->pct_transported[fr->cargo != i->produced_cargo[0]] > 0x99 || if (i->pct_transported[fr->cargo != i->produced_cargo[0]] > 0x99 ||
i->total_production[fr->cargo != i->produced_cargo[0]] == 0) i->total_production[fr->cargo != i->produced_cargo[0]] == 0)
return false; return false;
} }
@ -680,7 +680,7 @@ static void AiWantLongIndustryRoute(Player *p)
p->ai.src.cargo = fr.cargo | 0x80; p->ai.src.cargo = fr.cargo | 0x80;
// Fill the dest field // Fill the dest field
p->ai.dst.use_tile = 0; p->ai.dst.use_tile = 0;
p->ai.dst.rand_rng = 9; p->ai.dst.rand_rng = 9;
p->ai.dst.cur_building_rule = 0xFF; p->ai.dst.cur_building_rule = 0xFF;
@ -751,7 +751,7 @@ static void AiWantMediumIndustryRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyIndustryRoute(&fr); AiFindSubsidyIndustryRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 40, 60+1)) if (IS_INT_INSIDE(fr.distance, 40, 60+1))
@ -824,7 +824,7 @@ static void AiWantShortIndustryRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyIndustryRoute(&fr); AiFindSubsidyIndustryRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 15, 40+1)) if (IS_INT_INSIDE(fr.distance, 15, 40+1))
@ -897,7 +897,7 @@ static void AiWantMailRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyPassengerRoute(&fr); AiFindSubsidyPassengerRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 60, 110+1)) if (IS_INT_INSIDE(fr.distance, 60, 110+1))
@ -1003,7 +1003,7 @@ static void AiWantPassengerRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyPassengerRoute(&fr); AiFindSubsidyPassengerRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 0, 55+1)) if (IS_INT_INSIDE(fr.distance, 0, 55+1))
@ -1075,7 +1075,7 @@ static void AiWantTrainRoute(Player *p)
uint16 r; uint16 r;
p->ai.railtype_to_use = p->max_railtype - 1; p->ai.railtype_to_use = p->max_railtype - 1;
r = (uint16)Random(); r = (uint16)Random();
if (r > 0xD000) { if (r > 0xD000) {
AiWantLongIndustryRoute(p); AiWantLongIndustryRoute(p);
} else if (r > 0x6000) { } else if (r > 0x6000) {
@ -1096,7 +1096,7 @@ static void AiWantLongRoadIndustryRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyIndustryRoute(&fr); AiFindSubsidyIndustryRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 35, 55+1)) if (IS_INT_INSIDE(fr.distance, 35, 55+1))
@ -1157,7 +1157,7 @@ static void AiWantMediumRoadIndustryRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyIndustryRoute(&fr); AiFindSubsidyIndustryRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 15, 40+1)) if (IS_INT_INSIDE(fr.distance, 15, 40+1))
@ -1218,7 +1218,7 @@ static void AiWantLongRoadPassengerRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyPassengerRoute(&fr); AiFindSubsidyPassengerRoute(&fr);
if (IS_INT_INSIDE(fr.distance, 55, 180+1)) if (IS_INT_INSIDE(fr.distance, 55, 180+1))
@ -1356,7 +1356,7 @@ static void AiWantPassengerAircraftRoute(Player *p)
i = 60; i = 60;
for(;;) { for(;;) {
// look for one from the subsidy list // look for one from the subsidy list
AiFindSubsidyPassengerRoute(&fr); AiFindSubsidyPassengerRoute(&fr);
if (IS_INT_INSIDE(fr.distance,0,95+1)) if (IS_INT_INSIDE(fr.distance,0,95+1))
@ -1401,7 +1401,7 @@ static void AiWantPassengerAircraftRoute(Player *p)
p->ai.order_list_blocks[0] = 0; p->ai.order_list_blocks[0] = 0;
p->ai.order_list_blocks[1] = 1; p->ai.order_list_blocks[1] = 1;
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_AIRPORT_STUFF; p->ai.state = AIS_AIRPORT_STUFF;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1498,11 +1498,11 @@ static void AiStateWantNewRoute(Player *p)
i = 200; i = 200;
for(;;) { for(;;) {
r = (uint16)Random(); r = (uint16)Random();
if (_patches.ai_disable_veh_train && _patches.ai_disable_veh_roadveh && if (_patches.ai_disable_veh_train && _patches.ai_disable_veh_roadveh &&
_patches.ai_disable_veh_aircraft && _patches.ai_disable_veh_ship) _patches.ai_disable_veh_aircraft && _patches.ai_disable_veh_ship)
return; return;
if (r < 0x7626) { if (r < 0x7626) {
if (_patches.ai_disable_veh_train) continue; if (_patches.ai_disable_veh_train) continue;
AiWantTrainRoute(p); AiWantTrainRoute(p);
@ -1516,7 +1516,7 @@ static void AiStateWantNewRoute(Player *p)
if (_patches.ai_disable_veh_ship) continue; if (_patches.ai_disable_veh_ship) continue;
AiWantShipRoute(p); AiWantShipRoute(p);
} }
// got a route? // got a route?
if (p->ai.state != AIS_WANT_NEW_ROUTE) if (p->ai.state != AIS_WANT_NEW_ROUTE)
break; break;
@ -1598,7 +1598,7 @@ clear_town_stuff:;
j = p->attr; j = p->attr;
k = 0; k = 0;
// Build the rail // Build the rail
for(i=0; i!=6; i++,j>>=1) { for(i=0; i!=6; i++,j>>=1) {
if (j&1) { if (j&1) {
@ -1608,7 +1608,7 @@ clear_town_stuff:;
total_cost += r; total_cost += r;
} }
} }
/* signals too? */ /* signals too? */
if (j&3) { if (j&3) {
// Can't build signals on a road. // Can't build signals on a road.
@ -1643,7 +1643,7 @@ clear_town_stuff:;
// Unk // Unk
break; break;
} }
p++; p++;
} }
@ -1663,7 +1663,7 @@ static int AiBuildDefaultRailTrack(TileIndex tile, byte p0, byte p1, byte p2, by
const AiDefaultRailBlock *p; const AiDefaultRailBlock *p;
for(i=0; (p = _default_rail_track_data[i]) != NULL; i++) { for(i=0; (p = _default_rail_track_data[i]) != NULL; i++) {
if (p->p0 == p0 && p->p1 == p1 && p->p2 == p2 && p->p3 == p3 && if (p->p0 == p0 && p->p1 == p1 && p->p2 == p2 && p->p3 == p3 &&
(p->dir == 0xFF || p->dir == dir || ((p->dir-1)&3) == dir)) { (p->dir == 0xFF || p->dir == dir || ((p->dir-1)&3) == dir)) {
*cost = AiDoBuildDefaultRailTrack(tile, p->data, DC_NO_TOWN_RATING); *cost = AiDoBuildDefaultRailTrack(tile, p->data, DC_NO_TOWN_RATING);
if (*cost != CMD_ERROR && AiCheckTrackResources(tile, p->data, cargo)) if (*cost != CMD_ERROR && AiCheckTrackResources(tile, p->data, cargo))
@ -1723,7 +1723,7 @@ static void AiDoTerraformLand(TileIndex tile, int dir, int unk, int mode)
} while (--unk >= 0); } while (--unk >= 0);
slope = GetTileSlope(tile, &h); slope = GetTileSlope(tile, &h);
if (slope != 0) { if (slope != 0) {
if (mode > 0 || (mode == 0 && !(r&0xC))) { if (mode > 0 || (mode == 0 && !(r&0xC))) {
// Terraform up // Terraform up
@ -1731,9 +1731,9 @@ static void AiDoTerraformLand(TileIndex tile, int dir, int unk, int mode)
DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND); DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
} else if (h != 0) { } else if (h != 0) {
// Terraform down // Terraform down
DoCommandByTile(tile, _terraform_down_flags[slope-1], 0, DoCommandByTile(tile, _terraform_down_flags[slope-1], 0,
DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND); DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
} }
} }
_current_player = old_player; _current_player = old_player;
@ -1850,7 +1850,7 @@ static bool AiDoFollowTrack(Player *p)
arpfd.tile2 = p->ai.cur_tile_a; arpfd.tile2 = p->ai.cur_tile_a;
arpfd.flag = false; arpfd.flag = false;
arpfd.count = 0; arpfd.count = 0;
FollowTrack(p->ai.cur_tile_a + _tileoffs_by_dir[p->ai.cur_dir_a], 0x2000 | TRANSPORT_RAIL, p->ai.cur_dir_a^2, FollowTrack(p->ai.cur_tile_a + _tileoffs_by_dir[p->ai.cur_dir_a], 0x2000 | TRANSPORT_RAIL, p->ai.cur_dir_a^2,
(TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd); (TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd);
return arpfd.count > 8; return arpfd.count > 8;
} }
@ -1888,7 +1888,7 @@ static bool AiIsTileBanned(Player *p, TileIndex tile, byte val) {
int i; int i;
for(i=0; i!=p->ai.banned_tile_count; i++) for(i=0; i!=p->ai.banned_tile_count; i++)
if (p->ai.banned_tiles[i] == tile && if (p->ai.banned_tiles[i] == tile &&
p->ai.banned_val[i] == val) p->ai.banned_val[i] == val)
return true; return true;
return false; return false;
@ -1924,7 +1924,7 @@ static bool AiCheckRailPathBetter(AiRailFinder *arf, const byte *p)
arf->best_ptr = p; arf->best_ptr = p;
arf->best_tile = arf->cur_best_tile; arf->best_tile = arf->cur_best_tile;
better = true; better = true;
} }
} else if (arf->recursive_mode > 1) { } else if (arf->recursive_mode > 1) {
// Mode is 2. // Mode is 2.
if (arf->best_dist != 0 || arf->cur_best_depth < arf->best_depth) { if (arf->best_dist != 0 || arf->cur_best_depth < arf->best_depth) {
@ -1948,7 +1948,7 @@ static void FORCEINLINE AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex
bool flag; bool flag;
int dir2 = p[0] & 3; int dir2 = p[0] & 3;
FindLandscapeHeightByTile(&arf->ti, tile); FindLandscapeHeightByTile(&arf->ti, tile);
if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) { if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) {
@ -1969,11 +1969,11 @@ static void FORCEINLINE AiCheckBuildRailBridgeHere(AiRailFinder *arf, TileIndex
} }
// Is building a (rail)bridge possible at this place (type doesn't matter)? // 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, arf->player->ai.railtype_to_use<<8,
DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR) DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR)
return; return;
AiBuildRailRecursive(arf, tile_new, dir2); AiBuildRailRecursive(arf, tile_new, dir2);
// At the bottom depth, check if the new path is better than the old one. // At the bottom depth, check if the new path is better than the old one.
if (arf->depth == 1) { if (arf->depth == 1) {
if (AiCheckRailPathBetter(arf, p)) if (AiCheckRailPathBetter(arf, p))
@ -1986,7 +1986,7 @@ static void FORCEINLINE AiCheckBuildRailTunnelHere(AiRailFinder *arf, TileIndex
{ {
FindLandscapeHeightByTile(&arf->ti, tile); FindLandscapeHeightByTile(&arf->ti, tile);
if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) { if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) {
int32 cost = DoCommandByTile(tile, arf->player->ai.railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL); int32 cost = DoCommandByTile(tile, arf->player->ai.railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL);
if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) { if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) {
@ -2004,7 +2004,7 @@ static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir)
const byte *p; const byte *p;
tile = TILE_MASK(tile + _tileoffs_by_dir[dir]); tile = TILE_MASK(tile + _tileoffs_by_dir[dir]);
// Reached destination? // Reached destination?
if (tile == arf->final_tile) { if (tile == arf->final_tile) {
if (arf->final_dir != (dir^2)) { if (arf->final_dir != (dir^2)) {
@ -2067,7 +2067,7 @@ static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir)
} }
static const byte _dir_table_3[]= {0x25, 0x2A, 0x19, 0x16}; static const byte _dir_table_3[]= {0x25, 0x2A, 0x19, 0x16};
static void AiBuildRailConstruct(Player *p) static void AiBuildRailConstruct(Player *p)
{ {
@ -2078,7 +2078,7 @@ static void AiBuildRailConstruct(Player *p)
if (AiDoFollowTrack(p)) { if (AiDoFollowTrack(p)) {
p->ai.state_counter = (Random()&0xE)+6; // Destruct this amount of blocks p->ai.state_counter = (Random()&0xE)+6; // Destruct this amount of blocks
p->ai.state_mode = 1; // Start destruct p->ai.state_mode = 1; // Start destruct
// Ban this tile and don't reach it for a while. // Ban this tile and don't reach it for a while.
AiBanTile(p, p->ai.cur_tile_a, FindFirstBit(GetRailTrackStatus(p->ai.cur_tile_a))); AiBanTile(p, p->ai.cur_tile_a, FindFirstBit(GetRailTrackStatus(p->ai.cur_tile_a)));
return; return;
@ -2097,7 +2097,7 @@ static void AiBuildRailConstruct(Player *p)
arf.best_depth = 0xff; arf.best_depth = 0xff;
arf.cur_best_tile = 0; arf.cur_best_tile = 0;
arf.best_tile = 0; arf.best_tile = 0;
AiBuildRailRecursive(&arf, p->ai.cur_tile_a, p->ai.cur_dir_a); AiBuildRailRecursive(&arf, p->ai.cur_tile_a, p->ai.cur_dir_a);
// Reached destination? // Reached destination?
if (arf.recursive_mode == 2 && arf.cur_best_depth == 0) { if (arf.recursive_mode == 2 && arf.cur_best_depth == 0) {
@ -2114,19 +2114,19 @@ static void AiBuildRailConstruct(Player *p)
if (++p->ai.state_counter == 21) { if (++p->ai.state_counter == 21) {
p->ai.state_counter = 40; p->ai.state_counter = 40;
p->ai.state_mode = 1; p->ai.state_mode = 1;
// Ban this tile // Ban this tile
AiBanTile(p, p->ai.cur_tile_a, FindFirstBit(GetRailTrackStatus(p->ai.cur_tile_a))); AiBanTile(p, p->ai.cur_tile_a, FindFirstBit(GetRailTrackStatus(p->ai.cur_tile_a)));
} }
return; return;
} }
p->ai.cur_tile_a += _tileoffs_by_dir[p->ai.cur_dir_a]; p->ai.cur_tile_a += _tileoffs_by_dir[p->ai.cur_dir_a];
if (arf.best_ptr[0]&0x80) { if (arf.best_ptr[0]&0x80) {
int i; int i;
int32 bridge_len = GetBridgeLength(arf.bridge_end_tile, p->ai.cur_tile_a); int32 bridge_len = GetBridgeLength(arf.bridge_end_tile, p->ai.cur_tile_a);
/* Figure out what (rail)bridge type to build /* Figure out what (rail)bridge type to build
start with best bridge, then go down to worse and worse bridges start with best bridge, then go down to worse and worse bridges
unnecessary to check for worse bridge (i=0), since AI will always build that. unnecessary to check for worse bridge (i=0), since AI will always build that.
@ -2153,7 +2153,7 @@ static void AiBuildRailConstruct(Player *p)
} else { } else {
// rail // rail
p->ai.cur_dir_a = arf.best_ptr[1]; p->ai.cur_dir_a = arf.best_ptr[1];
DoCommandByTile(p->ai.cur_tile_a, p->ai.railtype_to_use, arf.best_ptr[0], DoCommandByTile(p->ai.cur_tile_a, p->ai.railtype_to_use, arf.best_ptr[0],
DC_EXEC | DC_AUTO | DC_NO_WATER | DC_NO_RAIL_OVERLAP, CMD_BUILD_SINGLE_RAIL); DC_EXEC | DC_AUTO | DC_NO_WATER | DC_NO_RAIL_OVERLAP, CMD_BUILD_SINGLE_RAIL);
p->ai.state_counter = 0; p->ai.state_counter = 0;
} }
@ -2183,7 +2183,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
} }
if (!(_map5[tile] & 0x40)) { if (!(_map5[tile] & 0x40)) {
// Check if the bridge points in the right direction. // Check if the bridge points in the right direction.
// This is not really needed the first place AiRemoveTileAndGoForward is called. // This is not really needed the first place AiRemoveTileAndGoForward is called.
if ((_map5[tile]&1) != (p->ai.cur_dir_a&1)) if ((_map5[tile]&1) != (p->ai.cur_dir_a&1))
@ -2194,7 +2194,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
do { do {
tile = TILE_MASK(tile - offs); tile = TILE_MASK(tile - offs);
} while (_map5[tile] & 0x40); } while (_map5[tile] & 0x40);
tilenew = TILE_MASK(tile - offs); tilenew = TILE_MASK(tile - offs);
// And clear the bridge. // And clear the bridge.
if (DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR) == CMD_ERROR) if (DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR) == CMD_ERROR)
@ -2217,7 +2217,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
(_map5[tile]&0xC0) == 0x40) { (_map5[tile]&0xC0) == 0x40) {
DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_REMOVE_SIGNALS); DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_REMOVE_SIGNALS);
} }
// And also remove the rail. // And also remove the rail.
if (DoCommandByTile(tile, 0, bit, DC_EXEC, CMD_REMOVE_SINGLE_RAIL) == CMD_ERROR) if (DoCommandByTile(tile, 0, bit, DC_EXEC, CMD_REMOVE_SINGLE_RAIL) == CMD_ERROR)
return false; return false;
@ -2226,7 +2226,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
ptr = _ai_table_15[p->ai.cur_dir_a^2]; ptr = _ai_table_15[p->ai.cur_dir_a^2];
while (ptr[0] != bit) ptr+=2; while (ptr[0] != bit) ptr+=2;
p->ai.cur_dir_a = ptr[1] ^ 2; p->ai.cur_dir_a = ptr[1] ^ 2;
// And then also switch tile. // And then also switch tile.
p->ai.cur_tile_a = TILE_MASK(p->ai.cur_tile_a - _tileoffs_by_dir[p->ai.cur_dir_a]); p->ai.cur_tile_a = TILE_MASK(p->ai.cur_tile_a - _tileoffs_by_dir[p->ai.cur_dir_a]);
@ -2246,7 +2246,7 @@ static void AiBuildRailDestruct(Player *p)
if (p->ai.cur_tile_a == p->ai.start_tile_a) if (p->ai.cur_tile_a == p->ai.start_tile_a)
return; return;
AiRemoveTileAndGoForward(p); AiRemoveTileAndGoForward(p);
} }
@ -2256,9 +2256,9 @@ static void AiBuildRail(Player *p)
if (p->ai.state_mode < 1) { if (p->ai.state_mode < 1) {
// Construct mode, build new rail. // Construct mode, build new rail.
AiBuildRailConstruct(p); AiBuildRailConstruct(p);
} else if (p->ai.state_mode == 1) { } else if (p->ai.state_mode == 1) {
// Destruct mode, destroy the rail currently built. // Destruct mode, destroy the rail currently built.
AiBuildRailDestruct(p); AiBuildRailDestruct(p);
} else if (p->ai.state_mode == 2) { } else if (p->ai.state_mode == 2) {
@ -2291,7 +2291,7 @@ static void AiStateBuildRail(Player *p)
// Currently building a rail between two points? // Currently building a rail between two points?
if (p->ai.state_mode != 255) { if (p->ai.state_mode != 255) {
AiBuildRail(p); AiBuildRail(p);
// Alternate between edges // Alternate between edges
swap_tile(&p->ai.start_tile_a, &p->ai.start_tile_b); swap_tile(&p->ai.start_tile_a, &p->ai.start_tile_b);
swap_tile(&p->ai.cur_tile_a, &p->ai.cur_tile_b); swap_tile(&p->ai.cur_tile_a, &p->ai.cur_tile_b);
@ -2425,7 +2425,7 @@ handle_nocash:
bool is_pass = (p->ai.cargo_type == CT_PASSENGERS || bool is_pass = (p->ai.cargo_type == CT_PASSENGERS ||
p->ai.cargo_type == CT_MAIL || p->ai.cargo_type == CT_MAIL ||
(_opt.landscape==LT_NORMAL && p->ai.cargo_type == CT_VALUABLES)); (_opt.landscape==LT_NORMAL && p->ai.cargo_type == CT_VALUABLES));
if (!is_pass && i == 1) flags |= OF_UNLOAD; if (!is_pass && i == 1) flags |= OF_UNLOAD;
if (p->ai.num_want_fullload != 0 && (is_pass || i == 0)) flags |= OF_FULL_LOAD; if (p->ai.num_want_fullload != 0 && (is_pass || i == 0)) flags |= OF_FULL_LOAD;
@ -2453,7 +2453,7 @@ static void AiStateDeleteRailBlocks(Player *p)
AiBuildRec *aib; AiBuildRec *aib;
const AiDefaultBlockData *b; const AiDefaultBlockData *b;
num = p->ai.num_build_rec; num = p->ai.num_build_rec;
aib = &p->ai.src; aib = &p->ai.src;
do { do {
if (aib->cur_building_rule != 255) { if (aib->cur_building_rule != 255) {
@ -2521,13 +2521,13 @@ static int32 AiDoBuildDefaultRoadBlock(TileIndex tile, const AiDefaultBlockData
uint c = TILE_MASK(tile+ p->tileoffs); uint c = TILE_MASK(tile+ p->tileoffs);
_cleared_town = NULL; _cleared_town = NULL;
if (p->mode == 2) { if (p->mode == 2) {
if (IS_TILETYPE(c, MP_STREET) && if (IS_TILETYPE(c, MP_STREET) &&
(_map5[c]&0xF0)==0 && (_map5[c]&0xF0)==0 &&
(_map5[c]&p->attr)!=0) { (_map5[c]&p->attr)!=0) {
roadflag |= 2; roadflag |= 2;
// all bits are already built? // all bits are already built?
if ((_map5[c]&p->attr)==p->attr) if ((_map5[c]&p->attr)==p->attr)
continue; continue;
@ -2575,7 +2575,7 @@ clear_town_stuff:;
r = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR); r = DoCommandByTile(c, 0, 0, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_LANDSCAPE_CLEAR);
if (r == CMD_ERROR) return CMD_ERROR; if (r == CMD_ERROR) return CMD_ERROR;
} }
} }
} }
@ -2595,9 +2595,9 @@ static bool AiCheckBlockDistances(Player *p, TileIndex tile)
{ {
AiBuildRec *aib; AiBuildRec *aib;
int num; int num;
num = p->ai.num_build_rec; num = p->ai.num_build_rec;
aib = &p->ai.src; aib = &p->ai.src;
do { do {
if (aib->cur_building_rule != 255) { if (aib->cur_building_rule != 255) {
@ -2720,7 +2720,7 @@ static bool AiCheckRoadPathBetter(AiRoadFinder *arf, const byte *p)
if (arf->recursive_mode < 1) { if (arf->recursive_mode < 1) {
// Mode is 0. This means destination has not been found yet. // Mode is 0. This means destination has not been found yet.
// If the found path is shorter than the current one, remember it. // If the found path is shorter than the current one, remember it.
if (arf->cur_best_dist < arf->best_dist || if (arf->cur_best_dist < arf->best_dist ||
(arf->cur_best_dist == arf->best_dist && arf->cur_best_depth < arf->best_depth)) { (arf->cur_best_dist == arf->best_dist && arf->cur_best_depth < arf->best_depth)) {
arf->best_depth = arf->cur_best_depth; arf->best_depth = arf->cur_best_depth;
arf->best_dist = arf->cur_best_dist; arf->best_dist = arf->cur_best_dist;
@ -2728,7 +2728,7 @@ static bool AiCheckRoadPathBetter(AiRoadFinder *arf, const byte *p)
arf->best_ptr = p; arf->best_ptr = p;
arf->best_tile = arf->cur_best_tile; arf->best_tile = arf->cur_best_tile;
better = true; better = true;
} }
} else if (arf->recursive_mode > 1) { } else if (arf->recursive_mode > 1) {
// Mode is 2. // Mode is 2.
if (arf->best_dist != 0 || arf->cur_best_depth < arf->best_depth) { if (arf->best_dist != 0 || arf->cur_best_depth < arf->best_depth) {
@ -2825,14 +2825,14 @@ static void FORCEINLINE AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex
bool flag; bool flag;
int dir2 = p[0] & 3; int dir2 = p[0] & 3;
FindLandscapeHeightByTile(&arf->ti, tile); FindLandscapeHeightByTile(&arf->ti, tile);
if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) { if (arf->ti.tileh == _dir_table_1[dir2] || (arf->ti.tileh==0 && arf->ti.z!=0)) {
tile_new = tile; tile_new = tile;
// Allow bridges directly over bottom tiles // Allow bridges directly over bottom tiles
flag = arf->ti.z == 0; flag = arf->ti.z == 0;
for(;;) { for(;;) {
if (tile_new < -_tileoffs_by_dir[dir2]) return; // Wraping around map, no bridge possible! if (tile_new < -_tileoffs_by_dir[dir2]) return; // Wraping around map, no bridge possible!
tile_new = TILE_MASK(tile_new + _tileoffs_by_dir[dir2]); tile_new = TILE_MASK(tile_new + _tileoffs_by_dir[dir2]);
FindLandscapeHeightByTile(&arf->ti, tile_new); FindLandscapeHeightByTile(&arf->ti, tile_new);
if (arf->ti.tileh != 0 || arf->ti.type == MP_CLEAR || arf->ti.type == MP_TREES) { if (arf->ti.tileh != 0 || arf->ti.type == MP_CLEAR || arf->ti.type == MP_TREES) {
@ -2850,7 +2850,7 @@ static void FORCEINLINE AiCheckBuildRoadBridgeHere(AiRoadFinder *arf, TileIndex
if (DoCommandByTile(tile_new, tile, 0x8000, DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR) if (DoCommandByTile(tile_new, tile, 0x8000, DC_AUTO, CMD_BUILD_BRIDGE) == CMD_ERROR)
return; return;
AiBuildRoadRecursive(arf, tile_new, dir2); AiBuildRoadRecursive(arf, tile_new, dir2);
// At the bottom depth, check if the new path is better than the old one. // At the bottom depth, check if the new path is better than the old one.
if (arf->depth == 1) { if (arf->depth == 1) {
if (AiCheckRoadPathBetter(arf, p)) if (AiCheckRoadPathBetter(arf, p))
@ -2863,7 +2863,7 @@ static void FORCEINLINE AiCheckBuildRoadTunnelHere(AiRoadFinder *arf, TileIndex
{ {
FindLandscapeHeightByTile(&arf->ti, tile); FindLandscapeHeightByTile(&arf->ti, tile);
if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) { if (arf->ti.tileh == _dir_table_2[p[0]&3] && arf->ti.z!=0) {
int32 cost = DoCommandByTile(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL); int32 cost = DoCommandByTile(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL);
if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) { if (cost != CMD_ERROR && cost <= (arf->player->player_money>>4)) {
@ -2882,13 +2882,13 @@ static void AiBuildRoadRecursive(AiRoadFinder *arf, TileIndex tile, int dir)
const byte *p; const byte *p;
tile = TILE_MASK(tile + _tileoffs_by_dir[dir]); tile = TILE_MASK(tile + _tileoffs_by_dir[dir]);
// Reached destination? // Reached destination?
if (tile == arf->final_tile) { if (tile == arf->final_tile) {
if ((arf->final_dir^2) == dir) { if ((arf->final_dir^2) == dir) {
arf->recursive_mode = 2; arf->recursive_mode = 2;
arf->cur_best_depth = arf->depth; arf->cur_best_depth = arf->depth;
} }
return; return;
} }
@ -2965,7 +2965,7 @@ static void AiBuildRoadConstruct(Player *p)
arf.best_depth = 0xff; arf.best_depth = 0xff;
arf.cur_best_tile = 0; arf.cur_best_tile = 0;
arf.best_tile = 0; arf.best_tile = 0;
AiBuildRoadRecursive(&arf, p->ai.cur_tile_a, p->ai.cur_dir_a); AiBuildRoadRecursive(&arf, p->ai.cur_tile_a, p->ai.cur_dir_a);
// Reached destination? // Reached destination?
if (arf.recursive_mode == 2 && arf.cur_best_depth == 0) { if (arf.recursive_mode == 2 && arf.cur_best_depth == 0) {
@ -3003,7 +3003,7 @@ do_some_terraform:
unnecessary to check for worse bridge (i=0), since AI will always build that. 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 AI is so fucked up that fixing this small thing will probably not solve a thing
*/ */
for(i = 10; i != 0; i--) { for(i = 10; i != 0; i--) {
if (CheckBridge_Stuff(i, bridge_len)) { if (CheckBridge_Stuff(i, bridge_len)) {
int32 cost = DoCommandByTile(tile, p->ai.cur_tile_a, i + (0x80 << 8), DC_AUTO, CMD_BUILD_BRIDGE); int32 cost = DoCommandByTile(tile, p->ai.cur_tile_a, i + (0x80 << 8), DC_AUTO, CMD_BUILD_BRIDGE);
if (cost != CMD_ERROR && cost < (p->player_money >> 5)) if (cost != CMD_ERROR && cost < (p->player_money >> 5))
@ -3021,7 +3021,7 @@ do_some_terraform:
p->ai.cur_tile_a = _build_tunnel_endtile; p->ai.cur_tile_a = _build_tunnel_endtile;
p->ai.state_counter = 0; p->ai.state_counter = 0;
} else { } else {
// road // road
if (!AiBuildRoadHelper(tile, DC_EXEC | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, arf.best_ptr[0])) if (!AiBuildRoadHelper(tile, DC_EXEC | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, arf.best_ptr[0]))
goto do_some_terraform; goto do_some_terraform;
@ -3044,7 +3044,7 @@ static void AiBuildRoad(Player *p)
if (p->ai.state_mode < 1) { if (p->ai.state_mode < 1) {
// Construct mode, build new road. // Construct mode, build new road.
AiBuildRoadConstruct(p); AiBuildRoadConstruct(p);
} else if (p->ai.state_mode == 1) { } else if (p->ai.state_mode == 1) {
// Destruct mode, not implemented for roads. // Destruct mode, not implemented for roads.
p->ai.state_mode = 2; p->ai.state_mode = 2;
@ -3088,7 +3088,7 @@ static void AiStateBuildRoad(Player *p)
// Currently building a road between two points? // Currently building a road between two points?
if (p->ai.state_mode != 255) { if (p->ai.state_mode != 255) {
AiBuildRoad(p); AiBuildRoad(p);
// Alternate between edges // Alternate between edges
swap_tile(&p->ai.start_tile_a, &p->ai.start_tile_b); swap_tile(&p->ai.start_tile_a, &p->ai.start_tile_b);
swap_tile(&p->ai.cur_tile_a, &p->ai.cur_tile_b); swap_tile(&p->ai.cur_tile_a, &p->ai.cur_tile_b);
@ -3149,7 +3149,7 @@ static void AiStateBuildRoadVehicles(Player *p)
uint tile,loco_id; uint tile,loco_id;
int veh, i; int veh, i;
int32 cost; int32 cost;
ptr = _road_default_block_data[p->ai.src.cur_building_rule]->data; ptr = _road_default_block_data[p->ai.src.cur_building_rule]->data;
for(;ptr->mode != 0;ptr++) {} for(;ptr->mode != 0;ptr++) {}
tile = TILE_ADD(p->ai.src.use_tile, ptr->tileoffs); tile = TILE_ADD(p->ai.src.use_tile, ptr->tileoffs);
@ -3197,7 +3197,7 @@ static void AiStateDeleteRoadBlocks(Player *p)
AiBuildRec *aib; AiBuildRec *aib;
const AiDefaultBlockData *b; const AiDefaultBlockData *b;
num = p->ai.num_build_rec; num = p->ai.num_build_rec;
aib = &p->ai.src; aib = &p->ai.src;
do { do {
if (aib->cur_building_rule != 255) { if (aib->cur_building_rule != 255) {
@ -3379,7 +3379,7 @@ static void AiStateBuildDefaultAirportBlocks(Player *p)
// do the following 8 times // do the following 8 times
i = 8; i = 8;
do { do {
// check if we can build the default // check if we can build the default
aib = &p->ai.src; aib = &p->ai.src;
j = p->ai.num_build_rec; j = p->ai.num_build_rec;
do { do {
@ -3399,7 +3399,7 @@ static void AiStateBuildDefaultAirportBlocks(Player *p)
!IS_TILETYPE(aib->use_tile, MP_RAILWAY) && !IS_TILETYPE(aib->use_tile, MP_RAILWAY) &&
!IS_TILETYPE(aib->use_tile, MP_STATION) !IS_TILETYPE(aib->use_tile, MP_STATION)
) { ) {
_map_type_and_height[aib->use_tile] = 0xa1; _map_type_and_height[aib->use_tile] = 0xa1;
_map5[aib->use_tile] = 0x80; _map5[aib->use_tile] = 0x80;
MarkTileDirtyByTile(aib->use_tile); MarkTileDirtyByTile(aib->use_tile);
@ -3460,7 +3460,7 @@ static void AiStateBuildAircraftVehicles(Player *p)
int32 cost; int32 cost;
int i; int i;
uint loco_id; uint loco_id;
ptr = _airport_default_block_data[p->ai.src.cur_building_rule]; ptr = _airport_default_block_data[p->ai.src.cur_building_rule];
for(;ptr->mode!=0;ptr++) {} for(;ptr->mode!=0;ptr++) {}
@ -3523,7 +3523,7 @@ static void AiStateSellVeh(Player *p)
if (v->owner == _current_player) { if (v->owner == _current_player) {
if (v->type == VEH_Train) { if (v->type == VEH_Train) {
if (!IsTrainDepotTile(v->tile) || v->u.rail.track != 0x80 || !(v->vehstatus&VS_STOPPED)) { if (!IsTrainDepotTile(v->tile) || v->u.rail.track != 0x80 || !(v->vehstatus&VS_STOPPED)) {
if ((v->next_order & OT_MASK) != OT_GOTO_DEPOT) if ((v->next_order & OT_MASK) != OT_GOTO_DEPOT)
DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_TRAIN_GOTO_DEPOT); DoCommandByTile(0, v->index, 0, DC_EXEC, CMD_TRAIN_GOTO_DEPOT);
@ -3532,7 +3532,7 @@ static void AiStateSellVeh(Player *p)
// Sell whole train // Sell whole train
DoCommandByTile(v->tile, v->index, 1, DC_EXEC, CMD_SELL_RAIL_WAGON); DoCommandByTile(v->tile, v->index, 1, DC_EXEC, CMD_SELL_RAIL_WAGON);
} else if (v->type == VEH_Road) { } else if (v->type == VEH_Road) {
if (!IsRoadDepotTile(v->tile) || v->u.road.state != 254 || !(v->vehstatus&VS_STOPPED)) { if (!IsRoadDepotTile(v->tile) || v->u.road.state != 254 || !(v->vehstatus&VS_STOPPED)) {
if ((v->next_order & OT_MASK) != OT_GOTO_DEPOT) if ((v->next_order & OT_MASK) != OT_GOTO_DEPOT)
@ -3613,7 +3613,7 @@ static void AiRemovePlayerRailOrRoad(Player *p, uint tile)
if ((m5&~0x3) != 0xC0) { if ((m5&~0x3) != 0xC0) {
is_rail_crossing:; is_rail_crossing:;
m5 = GetRailTrackStatus(tile); m5 = GetRailTrackStatus(tile);
if (m5 == 0xC || m5 == 0x30) if (m5 == 0xC || m5 == 0x30)
return; return;
@ -3662,7 +3662,7 @@ pos_3:
m5 &= 3; m5 &= 3;
if (GetRailTrackStatus(tile + _tileoffs_by_dir[m5]) & _depot_bits[m5]) if (GetRailTrackStatus(tile + _tileoffs_by_dir[m5]) & _depot_bits[m5])
return; return;
DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
} }
} else if (IS_TILETYPE(tile, MP_STREET)) { } else if (IS_TILETYPE(tile, MP_STREET)) {
@ -3707,7 +3707,7 @@ pos_3:
if (_map_owner[tile] != _current_player || (_map5[tile] & 0xC6) != 0x80) if (_map_owner[tile] != _current_player || (_map5[tile] & 0xC6) != 0x80)
return; return;
m5 = 0; m5 = 0;
b = _map5[tile] & 0x21; b = _map5[tile] & 0x21;
@ -3721,7 +3721,7 @@ pos_3:
static void AiStateRemoveTrack(Player *p) static void AiStateRemoveTrack(Player *p)
{ {
int num = 1000; int num = 1000;
do { do {
uint tile = ++p->ai.state_counter; uint tile = ++p->ai.state_counter;
@ -3775,7 +3775,7 @@ static AiStateAction * const _ai_actions[] = {
AiStateSellVeh, AiStateSellVeh,
AiStateRemoveStation, AiStateRemoveStation,
AiStateRemoveTrack, AiStateRemoveTrack,
AiStateRemoveSingleRailTile AiStateRemoveSingleRailTile
}; };
@ -3875,10 +3875,10 @@ static void AiBuildCompanyHQ(Player *p)
} }
void AiDoGameLoop(Player *p) void AiDoGameLoop(Player *p)
{ {
_cur_ai_player = p; _cur_ai_player = p;
if (p->bankrupt_asked != 0) { if (p->bankrupt_asked != 0) {
AiHandleTakeover(p); AiHandleTakeover(p);
return; return;
@ -3913,7 +3913,7 @@ void AiDoGameLoop(Player *p)
return; return;
} }
} }
} }
#if 0 #if 0
{ {
static byte old_state = 99; static byte old_state = 99;

View File

@ -85,8 +85,8 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla
if (part < 1) part = 1; if (part < 1) part = 1;
// When we are done, stop it // When we are done, stop it
if (part >= PathFinderInfo->route_length - 1) { PathFinderInfo->position = -2; return 0; } if (part >= PathFinderInfo->route_length - 1) { PathFinderInfo->position = -2; return 0; }
if (PathFinderInfo->rail_or_road) { if (PathFinderInfo->rail_or_road) {
// Tunnel code // Tunnel code
if ((AI_PATHFINDER_FLAG_TUNNEL & route_extra[part]) != 0) { if ((AI_PATHFINDER_FLAG_TUNNEL & route_extra[part]) != 0) {
@ -198,7 +198,7 @@ int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte fla
if (!EnsureNoVehicle(route[part]) && flag == DC_EXEC) part--; if (!EnsureNoVehicle(route[part]) && flag == DC_EXEC) part--;
PathFinderInfo->position = part; PathFinderInfo->position = part;
} }
return cost; return cost;
} }
@ -232,7 +232,7 @@ int AiNew_PickVehicle(Player *p) {
int AiNew_Build_Vehicle(Player *p, uint tile, byte flag) { int AiNew_Build_Vehicle(Player *p, uint tile, byte flag) {
int i = AiNew_PickVehicle(p); int i = AiNew_PickVehicle(p);
if (i == -1) return CMD_ERROR; if (i == -1) return CMD_ERROR;
if (p->ainew.tbt == AI_TRAIN) { if (p->ainew.tbt == AI_TRAIN) {
return CMD_ERROR; return CMD_ERROR;
} else { } else {

View File

@ -38,7 +38,7 @@ int32 AyStar_AiPathFinder_EndNodeCheck(AyStar *aystar, OpenListNode *current) {
if (IS_TILETYPE(current->path.node.tile, MP_CLEAR) || IS_TILETYPE(current->path.node.tile, MP_TREES)) if (IS_TILETYPE(current->path.node.tile, MP_CLEAR) || IS_TILETYPE(current->path.node.tile, MP_TREES))
if (current->path.parent == NULL || TestCanBuildStationHere(current->path.node.tile,AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile))) if (current->path.parent == NULL || TestCanBuildStationHere(current->path.node.tile,AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile)))
return AYSTAR_FOUND_END_NODE; return AYSTAR_FOUND_END_NODE;
return AYSTAR_DONE; return AYSTAR_DONE;
} }
@ -103,7 +103,7 @@ AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFin
void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo) { void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo) {
PathNode start_node; PathNode start_node;
uint x,y; uint x,y;
aystar->clear(aystar); aystar->clear(aystar);
// Set the user_data to the PathFinderInfo // Set the user_data to the PathFinderInfo
@ -149,7 +149,7 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target; Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
int i = 0; int i = 0;
PathNode *parent = &current->path; PathNode *parent = &current->path;
do { do {
PathFinderInfo->route_extra[i] = parent->node.user_data[0]; PathFinderInfo->route_extra[i] = parent->node.user_data[0];
PathFinderInfo->route[i++] = parent->node.tile; PathFinderInfo->route[i++] = parent->node.tile;
@ -169,16 +169,16 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current) { static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current) {
int i, r, dir; int i, r, dir;
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target; Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
aystar->num_neighbours = 0; aystar->num_neighbours = 0;
// Go through all surrounding tiles and check if they are within the limits // Go through all surrounding tiles and check if they are within the limits
for (i=0;i<4;i++) { for (i=0;i<4;i++) {
if (GET_TILE_X(_tiles_around[i] + current->path.node.tile) > 1 && GET_TILE_X(_tiles_around[i] + current->path.node.tile) < TILE_X_MAX - 1 && if (GET_TILE_X(_tiles_around[i] + current->path.node.tile) > 1 && GET_TILE_X(_tiles_around[i] + current->path.node.tile) < TILE_X_MAX - 1 &&
GET_TILE_Y(_tiles_around[i] + current->path.node.tile) > 1 && GET_TILE_Y(_tiles_around[i] + current->path.node.tile) < TILE_Y_MAX - 1) { GET_TILE_Y(_tiles_around[i] + current->path.node.tile) > 1 && GET_TILE_Y(_tiles_around[i] + current->path.node.tile) < TILE_Y_MAX - 1) {
// We also directly test if the current tile can connect to this tile.. // We also directly test if the current tile can connect to this tile..
// We do this simply by just building the tile! // We do this simply by just building the tile!
// If the next step is a bridge, we have to enter it the right way // If the next step is a bridge, we have to enter it the right way
if (!PathFinderInfo->rail_or_road && AI_PATHFINDER_IS_ROAD(current->path.node.tile + _tiles_around[i])) { if (!PathFinderInfo->rail_or_road && AI_PATHFINDER_IS_ROAD(current->path.node.tile + _tiles_around[i])) {
if (IS_TILETYPE(current->path.node.tile + _tiles_around[i], MP_TUNNELBRIDGE)) { if (IS_TILETYPE(current->path.node.tile + _tiles_around[i], MP_TUNNELBRIDGE)) {
@ -198,7 +198,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if ((_map5[current->path.node.tile] & 1) != (i & 1)) continue; if ((_map5[current->path.node.tile] & 1) != (i & 1)) continue;
} }
} }
if ((AI_PATHFINDER_FLAG_BRIDGE & current->path.node.user_data[0]) != 0 || if ((AI_PATHFINDER_FLAG_BRIDGE & current->path.node.user_data[0]) != 0 ||
(AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) { (AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) {
// We are a bridge/tunnel, how cool!! // We are a bridge/tunnel, how cool!!
@ -206,7 +206,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if (i != (current->path.node.user_data[0] >> 8)) continue; if (i != (current->path.node.user_data[0] >> 8)) continue;
} }
dir = 0; dir = 0;
// First, check if we have a parent // First, check if we have a parent
if (current->path.parent == NULL && current->path.node.user_data[0] == 0) { if (current->path.parent == NULL && current->path.node.user_data[0] == 0) {
// If not, this means we are at the starting station // If not, this means we are at the starting station
@ -254,16 +254,16 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if (r == CMD_ERROR) continue; if (r == CMD_ERROR) continue;
} }
} }
} }
// The tile can be connected // The tile can be connected
aystar->neighbours[aystar->num_neighbours].tile = _tiles_around[i] + current->path.node.tile; aystar->neighbours[aystar->num_neighbours].tile = _tiles_around[i] + current->path.node.tile;
aystar->neighbours[aystar->num_neighbours].user_data[0] = 0; aystar->neighbours[aystar->num_neighbours].user_data[0] = 0;
aystar->neighbours[aystar->num_neighbours++].direction = 0; aystar->neighbours[aystar->num_neighbours++].direction = 0;
} }
} }
// Next step, check for bridges and tunnels // Next step, check for bridges and tunnels
if (current->path.parent != NULL && current->path.node.user_data[0] == 0) { if (current->path.parent != NULL && current->path.node.user_data[0] == 0) {
@ -273,9 +273,9 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
// It means we can only walk with the track, so the bridge has to be in the same direction // It means we can only walk with the track, so the bridge has to be in the same direction
TileIndex tile = current->path.node.tile; TileIndex tile = current->path.node.tile;
TileIndex new_tile = tile; TileIndex new_tile = tile;
FindLandscapeHeightByTile(&ti, tile); FindLandscapeHeightByTile(&ti, tile);
// Bridges can only be build on land that is not flat // Bridges can only be build on land that is not flat
// And if there is a road or rail blocking // And if there is a road or rail blocking
if (ti.tileh != 0 || if (ti.tileh != 0 ||
@ -284,10 +284,10 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
for (;;) { for (;;) {
new_tile += _tiles_around[dir]; new_tile += _tiles_around[dir];
// Precheck, is the length allowed? // Precheck, is the length allowed?
if (!CheckBridge_Stuff(0,GetBridgeLength(tile, new_tile))) break; if (!CheckBridge_Stuff(0,GetBridgeLength(tile, new_tile))) break;
// Check if we hit the station-tile.. we don't like that! // Check if we hit the station-tile.. we don't like that!
if (TILES_BETWEEN(new_tile,PathFinderInfo->end_tile_tl,PathFinderInfo->end_tile_br)) break; if (TILES_BETWEEN(new_tile,PathFinderInfo->end_tile_tl,PathFinderInfo->end_tile_br)) break;
@ -302,7 +302,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if (aystar->num_neighbours == 11) break; if (aystar->num_neighbours == 11) break;
} }
} }
// Next, check for tunnels! // Next, check for tunnels!
// Tunnels can only be build with tileh of 3, 6, 9 or 12, depending on the direction // Tunnels can only be build with tileh of 3, 6, 9 or 12, depending on the direction
// For now, we check both sides for this tile.. terraforming gives fuzzy result // For now, we check both sides for this tile.. terraforming gives fuzzy result
@ -334,11 +334,11 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target; Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
int r, res = 0; int r, res = 0;
TileInfo ti, parent_ti; TileInfo ti, parent_ti;
// Gather some information about the tile.. // Gather some information about the tile..
FindLandscapeHeightByTile(&ti, current->tile); FindLandscapeHeightByTile(&ti, current->tile);
FindLandscapeHeightByTile(&parent_ti, parent->path.node.tile); FindLandscapeHeightByTile(&parent_ti, parent->path.node.tile);
// Check if we hit the end-tile // Check if we hit the end-tile
if (TILES_BETWEEN(current->tile,PathFinderInfo->end_tile_tl,PathFinderInfo->end_tile_br)) { if (TILES_BETWEEN(current->tile,PathFinderInfo->end_tile_tl,PathFinderInfo->end_tile_br)) {
// We are at the end-tile, check if we had a direction or something... // We are at the end-tile, check if we had a direction or something...
@ -348,7 +348,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
// If it was valid, drop out.. we don't build on the endtile // If it was valid, drop out.. we don't build on the endtile
return 0; return 0;
} }
// Give everything a small penalty // Give everything a small penalty
res += AI_PATHFINDER_PENALTY; res += AI_PATHFINDER_PENALTY;
@ -359,7 +359,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
res -= AI_PATHFINDER_ROAD_ALREADY_EXISTS_BONUS; res -= AI_PATHFINDER_ROAD_ALREADY_EXISTS_BONUS;
} }
} }
// We should give a penalty when the tile is going up or down.. this is one way to do so! // We should give a penalty when the tile is going up or down.. this is one way to do so!
// Too bad we have to count it from the parent.. but that is not so bad // Too bad we have to count it from the parent.. but that is not so bad
if (parent_ti.tileh != 0 && parent->path.parent != NULL) { if (parent_ti.tileh != 0 && parent->path.parent != NULL) {
@ -380,7 +380,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
} }
} }
} }
// Are we part of a tunnel? // Are we part of a tunnel?
if ((AI_PATHFINDER_FLAG_TUNNEL & current->user_data[0]) != 0) { if ((AI_PATHFINDER_FLAG_TUNNEL & current->user_data[0]) != 0) {
// Tunnels are very expensive when build on long routes.. // Tunnels are very expensive when build on long routes..
@ -409,7 +409,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
if (ti.tileh == 0) if (ti.tileh == 0)
res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
// To prevent the AI from taking the fastest way in tiles, but not the fastest way // To prevent the AI from taking the fastest way in tiles, but not the fastest way
// in speed, we have to give a good penalty to direction changing // in speed, we have to give a good penalty to direction changing
// This way, we get almost the fastest way in tiles, and a very good speed on the track // This way, we get almost the fastest way in tiles, and a very good speed on the track
@ -448,7 +448,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
} }
} }
} }
// Res should never be below zero.. if so, make it zero! // Res should never be below zero.. if so, make it zero!
if (res < 0) { res = 0; } if (res < 0) { res = 0; }

View File

@ -275,8 +275,8 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// On hold for NewAI // On hold for NewAI
v->u.air.pos = (!_patches.ainew_active && _is_ai_player) ? 0:MAX_ELEMENTS; v->u.air.pos = (!_patches.ainew_active && _is_ai_player) ? 0:MAX_ELEMENTS;
/* When we click on hangar we know the tile (it is in var 'tile')it is on. By that we know /* When we click on hangar we know the tile (it is in var 'tile')it is on. By that we know
its position in the array of depots the airport has.....we can search its position in the array of depots the airport has.....we can search
->layout for #th position of depot. Since layout must start with depots, it is simple ->layout for #th position of depot. Since layout must start with depots, it is simple
*/ */
{ {
@ -542,7 +542,7 @@ static void CheckIfAircraftNeedsService(Vehicle *v)
if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr)) if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr))
return; return;
st = DEREF_STATION(v->next_order_param); st = DEREF_STATION(v->next_order_param);
// only goto depot if the target airport has terminals (eg. it is airport) // only goto depot if the target airport has terminals (eg. it is airport)
if (st->xy != 0 && st->airport_tile != 0 && GetAirport(st->airport_type)->nofterminals != 0) { if (st->xy != 0 && st->airport_tile != 0 && GetAirport(st->airport_type)->nofterminals != 0) {
@ -621,7 +621,7 @@ static void HelicopterTickHandler(Vehicle *v)
if (u->vehstatus & VS_HIDDEN) if (u->vehstatus & VS_HIDDEN)
return; return;
// if true, helicopter rotors do not rotate. This should only be the case if a helicopter is // if true, helicopter rotors do not rotate. This should only be the case if a helicopter is
// loading/unloading at a terminal or stopped // loading/unloading at a terminal or stopped
if ((v->next_order&OT_MASK) == OT_LOADING || (v->vehstatus&VS_STOPPED)) { if ((v->next_order&OT_MASK) == OT_LOADING || (v->vehstatus&VS_STOPPED)) {
if (u->cur_speed != 0) { if (u->cur_speed != 0) {
@ -735,7 +735,7 @@ static bool UpdateAircraftSpeed(Vehicle *v)
v->subspeed = (t=v->subspeed) + (byte)spd; v->subspeed = (t=v->subspeed) + (byte)spd;
spd = min( v->cur_speed + (spd >> 8) + (v->subspeed < t), v->max_speed); spd = min( v->cur_speed + (spd >> 8) + (v->subspeed < t), v->max_speed);
// adjust speed for broken vehicles // adjust speed for broken vehicles
if(v->vehstatus&VS_AIRCRAFT_BROKEN) spd = min(spd, 27); if(v->vehstatus&VS_AIRCRAFT_BROKEN) spd = min(spd, 27);
@ -875,7 +875,7 @@ static bool Aircraft_5(Vehicle *v)
// Change direction smoothly to final direction. // Change direction smoothly to final direction.
dirdiff = amd->direction - v->direction; dirdiff = amd->direction - v->direction;
// if distance is 0, and plane points in right direction, no point in calling // if distance is 0, and plane points in right direction, no point in calling
// UpdateAircraftSpeed(). So do it only afterwards // UpdateAircraftSpeed(). So do it only afterwards
if (dirdiff == 0) { if (dirdiff == 0) {
v->cur_speed = 0; v->cur_speed = 0;
@ -1061,7 +1061,7 @@ static void ProcessAircraftOrder(Vehicle *v)
if ((v->next_order & (OT_MASK|OF_UNLOAD)) != (OT_GOTO_DEPOT|OF_UNLOAD)) if ((v->next_order & (OT_MASK|OF_UNLOAD)) != (OT_GOTO_DEPOT|OF_UNLOAD))
return; return;
} }
if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) && if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) &&
SERVICE_INTERVAL) { SERVICE_INTERVAL) {
v->cur_order_index++; v->cur_order_index++;
@ -1217,7 +1217,7 @@ static void AircraftEnterHangar(Vehicle *v)
byte old_order; byte old_order;
ServiceAircraft(v); ServiceAircraft(v);
MaybeRenewVehicle(v, EstimateAircraftCost(v->engine_type)); MaybeRenewVehicle(v, EstimateAircraftCost(v->engine_type));
if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT) { if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT) {
@ -1227,7 +1227,7 @@ static void AircraftEnterHangar(Vehicle *v)
v->next_order = OT_NOTHING; v->next_order = OT_NOTHING;
if (old_order & OF_UNLOAD) { v->cur_order_index++; } if (old_order & OF_UNLOAD) { v->cur_order_index++; }
else if (old_order & OF_FULL_LOAD) { // force depot visit else if (old_order & OF_FULL_LOAD) { // force depot visit
v->vehstatus |= VS_STOPPED; v->vehstatus |= VS_STOPPED;
@ -1692,7 +1692,7 @@ static bool FreeTerminal(Vehicle *v, byte i, byte last_terminal)
return false; return false;
} }
static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *Airport) static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *Airport)
{ {
byte nofterminalspergroup, i; byte nofterminalspergroup, i;
AirportFTA *temp; AirportFTA *temp;
@ -1703,9 +1703,9 @@ static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *Airport)
Heading 255 denotes a group. We see 2 groups here: Heading 255 denotes a group. We see 2 groups here:
1. group 0 -- TERM_GROUP1_block (check block) 1. group 0 -- TERM_GROUP1_block (check block)
2. group 1 -- TERM_GROUP2_ENTER_block (check block) 2. group 1 -- TERM_GROUP2_ENTER_block (check block)
First in line is checked first, group 0. If the block (TERM_GROUP1_block) is free, it First in line is checked first, group 0. If the block (TERM_GROUP1_block) is free, it
looks at the corresponding terminals of that group. If no free ones are found, other looks at the corresponding terminals of that group. If no free ones are found, other
possible groups are checked (in this case group 1, since that is after group 0). If that possible groups are checked (in this case group 1, since that is after group 0). If that
fails, then attempt fails and plane waits fails, then attempt fails and plane waits
*/ */
if (Airport->nofterminalgroups > 1) { if (Airport->nofterminalgroups > 1) {
@ -1731,7 +1731,7 @@ static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *Airport)
return FreeTerminal(v, 0, Airport->nofterminals); return FreeTerminal(v, 0, Airport->nofterminals);
} }
static bool AirportFindFreeHelipad(Vehicle *v, const AirportFTAClass *Airport) static bool AirportFindFreeHelipad(Vehicle *v, const AirportFTAClass *Airport)
{ {
Station *st; Station *st;
byte nofhelipadspergroup, i; byte nofhelipadspergroup, i;
@ -1847,7 +1847,7 @@ void UpdateOldAircraft()
AircraftNextAirportPos_and_Order(v_oldstyle); // move it to the entry point of the airport AircraftNextAirportPos_and_Order(v_oldstyle); // move it to the entry point of the airport
GetNewVehiclePos(v_oldstyle, &gp); // get the position of the plane (to be used for setting) GetNewVehiclePos(v_oldstyle, &gp); // get the position of the plane (to be used for setting)
v_oldstyle->tile = 0; // aircraft in air is tile=0 v_oldstyle->tile = 0; // aircraft in air is tile=0
// correct speed of helicopter-rotors // correct speed of helicopter-rotors
if (v_oldstyle->subtype == 0) {v_oldstyle->next->next->cur_speed = 32;} if (v_oldstyle->subtype == 0) {v_oldstyle->next->next->cur_speed = 32;}
@ -1857,7 +1857,7 @@ void UpdateOldAircraft()
} }
} }
void UpdateAirplanesOnNewStation(Station *st) void UpdateAirplanesOnNewStation(Station *st)
{ {
GetNewVehiclePosResult gp; GetNewVehiclePosResult gp;
Vehicle *v; Vehicle *v;

View File

@ -891,7 +891,7 @@ static void MakeSortedAircraftList(byte owner)
// aircraft are stored as a cummulative index, eg 25, 41, 43. This means // aircraft are stored as a cummulative index, eg 25, 41, 43. This means
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
for (i = &_num_aircraft_sort[1]; i != endof(_num_aircraft_sort); i++) {*i += *(i-1);} for (i = &_num_aircraft_sort[1]; i != endof(_num_aircraft_sort); i++) {*i += *(i-1);}
// sort by owner, then only subsort the requested owner-vehicles // sort by owner, then only subsort the requested owner-vehicles
qsort(_aircraft_sort, n, sizeof(_aircraft_sort[0]), GeneralOwnerSorter); qsort(_aircraft_sort, n, sizeof(_aircraft_sort[0]), GeneralOwnerSorter);
@ -936,7 +936,7 @@ static void PlayerAircraftWndProc(Window *w, WindowEvent *e)
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 aircraft // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 aircraft
i = (window_number == 0) ? 0 : _num_aircraft_sort[window_number-1]; i = (window_number == 0) ? 0 : _num_aircraft_sort[window_number-1];
SetVScrollCount(w, _num_aircraft_sort[window_number] - i); SetVScrollCount(w, _num_aircraft_sort[window_number] - i);
/* draw the widgets */ /* draw the widgets */
{ {
Player *p = DEREF_PLAYER(window_number); Player *p = DEREF_PLAYER(window_number);
@ -980,7 +980,7 @@ static void PlayerAircraftWndProc(Window *w, WindowEvent *e)
SET_DPARAM32(0, v->profit_this_year); SET_DPARAM32(0, v->profit_this_year);
SET_DPARAM32(1, v->profit_last_year); SET_DPARAM32(1, v->profit_last_year);
DrawString(x+19, y + 28, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0); DrawString(x+19, y + 28, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
if (v->string_id != STR_SV_AIRCRAFT_NAME) { if (v->string_id != STR_SV_AIRCRAFT_NAME) {
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
DrawString(x+19, y, STR_01AB, 0); DrawString(x+19, y, STR_01AB, 0);
@ -1007,7 +1007,7 @@ static void PlayerAircraftWndProc(Window *w, WindowEvent *e)
return; return;
case 6: { /* Matrix to show vehicles */ case 6: { /* Matrix to show vehicles */
uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_BIG; uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_BIG;
if (id_v >= w->vscroll.cap) { return;} // click out of bounds if (id_v >= w->vscroll.cap) { return;} // click out of bounds
id_v += w->vscroll.pos; id_v += w->vscroll.pos;

View File

@ -77,12 +77,12 @@ static void BuildAirToolbWndProc(Window *w, WindowEvent *e)
case WE_CLICK: case WE_CLICK:
if (e->click.widget-2 >= 0) if (e->click.widget-2 >= 0)
_build_air_button_proc[e->click.widget - 2](w); _build_air_button_proc[e->click.widget - 2](w);
break; break;
case WE_PLACE_OBJ: case WE_PLACE_OBJ:
_place_proc(e->place.tile); _place_proc(e->place.tile);
break; break;
case WE_PLACE_DRAG: { case WE_PLACE_DRAG: {
VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata); VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata);
@ -160,7 +160,7 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
// strings such as 'Size' and 'Coverage Area' // strings such as 'Size' and 'Coverage Area'
DrawStringCentered(74, 16, STR_305B_SIZE, 0); DrawStringCentered(74, 16, STR_305B_SIZE, 0);
DrawStringCentered(74, 78, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0); DrawStringCentered(74, 78, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
DrawStationCoverageAreaText(2, 104, (uint)-1); DrawStationCoverageAreaText(2, 104, (uint)-1);
break; break;
} }

View File

@ -5,7 +5,7 @@
* For more information about AyStar (A* Algorithm), you can look at * For more information about AyStar (A* Algorithm), you can look at
* http://en.wikipedia.org/wiki/A-star_search_algorithm * http://en.wikipedia.org/wiki/A-star_search_algorithm
*/ */
/* /*
* Friendly reminder: * Friendly reminder:
* Call (AyStar).free() when you are done with Aystar. It reserves a lot of memory * Call (AyStar).free() when you are done with Aystar. It reserves a lot of memory
@ -46,7 +46,7 @@ OpenListNode *AyStarMain_OpenList_Pop(AyStar *aystar) {
OpenListNode* res = (OpenListNode*)aystar->OpenListQueue.pop(&aystar->OpenListQueue); OpenListNode* res = (OpenListNode*)aystar->OpenListQueue.pop(&aystar->OpenListQueue);
if (res != NULL) if (res != NULL)
Hash_Delete(&aystar->OpenListHash, res->path.node.tile, res->path.node.direction); Hash_Delete(&aystar->OpenListHash, res->path.node.tile, res->path.node.direction);
return res; return res;
} }
@ -76,29 +76,29 @@ int AyStarMain_CheckTile(AyStar *aystar, AyStarNode *current, OpenListNode *pare
// Check the new node against the ClosedList // Check the new node against the ClosedList
if (AyStarMain_ClosedList_IsInList(aystar, current) != NULL) return AYSTAR_DONE; if (AyStarMain_ClosedList_IsInList(aystar, current) != NULL) return AYSTAR_DONE;
// Calculate the G-value for this node // Calculate the G-value for this node
new_g = aystar->CalculateG(aystar, current, parent); new_g = aystar->CalculateG(aystar, current, parent);
// If the value was INVALID_NODE, we don't do anything with this node // If the value was INVALID_NODE, we don't do anything with this node
if (new_g == AYSTAR_INVALID_NODE) return AYSTAR_DONE; if (new_g == AYSTAR_INVALID_NODE) return AYSTAR_DONE;
// There should not be given any other error-code.. // There should not be given any other error-code..
assert(new_g >= 0); assert(new_g >= 0);
// Add the parent g-value to the new g-value // Add the parent g-value to the new g-value
new_g += parent->g; new_g += parent->g;
if (aystar->max_path_cost != 0 && (uint)new_g > aystar->max_path_cost) return AYSTAR_DONE; if (aystar->max_path_cost != 0 && (uint)new_g > aystar->max_path_cost) return AYSTAR_DONE;
// Calculate the h-value // Calculate the h-value
new_h = aystar->CalculateH(aystar, current, parent); new_h = aystar->CalculateH(aystar, current, parent);
// There should not be given any error-code.. // There should not be given any error-code..
assert(new_h >= 0); assert(new_h >= 0);
// The f-value if g + h // The f-value if g + h
new_f = new_g + new_h; new_f = new_g + new_h;
// Get the pointer to the parent in the ClosedList (the currentone is to a copy of the one in the OpenList) // Get the pointer to the parent in the ClosedList (the currentone is to a copy of the one in the OpenList)
closedlist_parent = AyStarMain_ClosedList_IsInList(aystar, &parent->path.node); closedlist_parent = AyStarMain_ClosedList_IsInList(aystar, &parent->path.node);
// Check if this item is already in the OpenList // Check if this item is already in the OpenList
if ((check = AyStarMain_OpenList_IsInList(aystar, current)) != NULL) { if ((check = AyStarMain_OpenList_IsInList(aystar, current)) != NULL) {
int i; int i;
@ -117,7 +117,7 @@ int AyStarMain_CheckTile(AyStar *aystar, AyStarNode *current, OpenListNode *pare
// A new node, add him to the OpenList // A new node, add him to the OpenList
AyStarMain_OpenList_Add(aystar, closedlist_parent, current, new_f, new_g, 0); AyStarMain_OpenList_Add(aystar, closedlist_parent, current, new_f, new_g, 0);
} }
return AYSTAR_DONE; return AYSTAR_DONE;
} }
@ -134,12 +134,12 @@ int AyStarMain_CheckTile(AyStar *aystar, AyStarNode *current, OpenListNode *pare
*/ */
int AyStarMain_Loop(AyStar *aystar) { int AyStarMain_Loop(AyStar *aystar) {
int i, r; int i, r;
// Get the best node from OpenList // Get the best node from OpenList
OpenListNode *current = AyStarMain_OpenList_Pop(aystar); OpenListNode *current = AyStarMain_OpenList_Pop(aystar);
// If empty, drop an error // If empty, drop an error
if (current == NULL) return AYSTAR_EMPTY_OPENLIST; if (current == NULL) return AYSTAR_EMPTY_OPENLIST;
// Check for end node and if found, return that code // Check for end node and if found, return that code
if (aystar->EndNodeCheck(aystar, current) == AYSTAR_FOUND_END_NODE) { if (aystar->EndNodeCheck(aystar, current) == AYSTAR_FOUND_END_NODE) {
if (aystar->FoundEndNode != NULL) if (aystar->FoundEndNode != NULL)
@ -147,22 +147,22 @@ int AyStarMain_Loop(AyStar *aystar) {
free(current); free(current);
return AYSTAR_FOUND_END_NODE; return AYSTAR_FOUND_END_NODE;
} }
// Add the node to the ClosedList // Add the node to the ClosedList
AyStarMain_ClosedList_Add(aystar, &current->path); AyStarMain_ClosedList_Add(aystar, &current->path);
// Load the neighbours // Load the neighbours
aystar->GetNeighbours(aystar, current); aystar->GetNeighbours(aystar, current);
// Go through all neighbours // Go through all neighbours
for (i=0;i<aystar->num_neighbours;i++) { for (i=0;i<aystar->num_neighbours;i++) {
// Check and add them to the OpenList if needed // Check and add them to the OpenList if needed
r = aystar->checktile(aystar, &aystar->neighbours[i], current); r = aystar->checktile(aystar, &aystar->neighbours[i], current);
} }
// Free the node // Free the node
free(current); free(current);
if (aystar->max_search_nodes != 0 && Hash_Size(&aystar->ClosedListHash) >= aystar->max_search_nodes) if (aystar->max_search_nodes != 0 && Hash_Size(&aystar->ClosedListHash) >= aystar->max_search_nodes)
/* We've expanded enough nodes */ /* We've expanded enough nodes */
return AYSTAR_LIMIT_REACHED; return AYSTAR_LIMIT_REACHED;
@ -228,7 +228,7 @@ int AyStarMain_Main(AyStar *aystar) {
if (r != AYSTAR_STILL_BUSY) if (r != AYSTAR_STILL_BUSY)
/* We're done, clean up */ /* We're done, clean up */
aystar->clear(aystar); aystar->clear(aystar);
// Check result-value // Check result-value
if (r == AYSTAR_FOUND_END_NODE) return AYSTAR_FOUND_END_NODE; if (r == AYSTAR_FOUND_END_NODE) return AYSTAR_FOUND_END_NODE;
// Check if we have some left in the OpenList // Check if we have some left in the OpenList
@ -242,7 +242,7 @@ int AyStarMain_Main(AyStar *aystar) {
* Adds a node from where to start an algorithm. Multiple nodes can be added * Adds a node from where to start an algorithm. Multiple nodes can be added
* if wanted. You should make sure that clear() is called before adding nodes * if wanted. You should make sure that clear() is called before adding nodes
* if the AyStar has been used before (though the normal main loop calls * if the AyStar has been used before (though the normal main loop calls
* clear() automatically when the algorithm finishes * clear() automatically when the algorithm finishes
*/ */
void AyStarMain_AddStartNode(AyStar *aystar, AyStarNode *start_node) { void AyStarMain_AddStartNode(AyStar *aystar, AyStarNode *start_node) {
#ifdef AYSTAR_DEBUG #ifdef AYSTAR_DEBUG

View File

@ -107,7 +107,7 @@ struct AyStar {
AyStar_GetNeighbours* GetNeighbours; AyStar_GetNeighbours* GetNeighbours;
AyStar_EndNodeCheck* EndNodeCheck; AyStar_EndNodeCheck* EndNodeCheck;
AyStar_FoundEndNode* FoundEndNode; AyStar_FoundEndNode* FoundEndNode;
/* These are completely untouched by AyStar, they can be accesed by /* These are completely untouched by AyStar, they can be accesed by
* the application specific routines to input and output data. * the application specific routines to input and output data.
* user_path should typically contain data about the resulting path * user_path should typically contain data about the resulting path
@ -117,7 +117,7 @@ struct AyStar {
void *user_path; void *user_path;
void *user_target; void *user_target;
uint user_data[10]; uint user_data[10];
/* How many loops are there called before AyStarMain_Main gives /* How many loops are there called before AyStarMain_Main gives
* control back to the caller. 0 = until done */ * control back to the caller. 0 = until done */
byte loops_per_tick; byte loops_per_tick;
@ -125,7 +125,7 @@ struct AyStar {
* 0 = infinite */ * 0 = infinite */
uint max_path_cost; uint max_path_cost;
/* The maximum amount of nodes that will be expanded, 0 = infinite */ /* The maximum amount of nodes that will be expanded, 0 = infinite */
uint max_search_nodes; uint max_search_nodes;
/* These should be filled with the neighbours of a tile by /* These should be filled with the neighbours of a tile by
* GetNeighbours */ * GetNeighbours */
@ -140,7 +140,7 @@ struct AyStar {
AyStar_Free* free; AyStar_Free* free;
AyStar_Clear* clear; AyStar_Clear* clear;
AyStar_CheckTile* checktile; AyStar_CheckTile* checktile;
/* These will contain the open and closed lists */ /* These will contain the open and closed lists */
/* The actual closed list */ /* The actual closed list */
@ -164,6 +164,6 @@ void AyStarMain_Clear(AyStar *aystar);
* callling init_AyStar (see the declaration of AyStar for which fields are * callling init_AyStar (see the declaration of AyStar for which fields are
* internal */ * internal */
void init_AyStar(AyStar* aystar, Hash_HashProc hash, uint num_buckets); void init_AyStar(AyStar* aystar, Hash_HashProc hash, uint num_buckets);
#endif #endif

View File

@ -30,7 +30,7 @@ static void CcBuildBridge(bool success, uint tile, uint32 p1, uint32 p2)
static void BuildBridge(Window *w, int i) static void BuildBridge(Window *w, int i)
{ {
DeleteWindow(w); DeleteWindow(w);
DoCommandP(_bridge.end_tile, _bridge.start_tile, _bridge.indexes[i] | (_bridge.type << 8), CcBuildBridge, DoCommandP(_bridge.end_tile, _bridge.start_tile, _bridge.indexes[i] | (_bridge.type << 8), CcBuildBridge,
CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE)); CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
} }
@ -60,11 +60,11 @@ static void BuildBridgeWndProc(Window *w, WindowEvent *e)
e->keypress.cont = false; e->keypress.cont = false;
BuildBridge(w, i); BuildBridge(w, i);
} }
break; break;
} }
case WE_CLICK: case WE_CLICK:
if (e->click.widget == 2) { if (e->click.widget == 2) {
uint ind = ((int)e->click.pt.y - 14) / 22; uint ind = ((int)e->click.pt.y - 14) / 22;
if (ind < 4 && (ind += w->vscroll.pos) < (uint)_bridge.count) if (ind < 4 && (ind += w->vscroll.pos) < (uint)_bridge.count)
@ -136,7 +136,7 @@ void ShowBuildBridgeWindow(uint start, uint end, byte bridge_type)
// get absolute bridge length // get absolute bridge length
bridge_len = GetBridgeLength(start, end); bridge_len = GetBridgeLength(start, end);
tot_bridge_len = bridge_len + 2; tot_bridge_len = bridge_len + 2;
tot_bridge_len = CalcBridgeLenCostFactor(tot_bridge_len); tot_bridge_len = CalcBridgeLenCostFactor(tot_bridge_len);
@ -155,7 +155,7 @@ void ShowBuildBridgeWindow(uint start, uint end, byte bridge_type)
_bridge.count = j; _bridge.count = j;
if (j != 0) { if (j != 0) {
Window *w = AllocateWindowDesc((_bridge.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc); Window *w = AllocateWindowDesc((_bridge.type & 0x80) ? &_build_road_bridge_desc : &_build_bridge_desc);
w->vscroll.cap = 4; w->vscroll.cap = 4;
w->vscroll.count = (byte)j; w->vscroll.count = (byte)j;
} else { } else {

View File

@ -15,7 +15,7 @@ typedef struct TerraformerState {
int direction; int direction;
int modheight_count; int modheight_count;
int tile_table_count; int tile_table_count;
int32 cost; int32 cost;
TileIndex *tile_table; TileIndex *tile_table;
@ -44,7 +44,7 @@ static int TerraformGetHeightOfTile(TerraformerState *ts, TileIndex tile)
{ {
TerraformerHeightMod *mod = ts->modheight; TerraformerHeightMod *mod = ts->modheight;
int count; int count;
for(count = ts->modheight_count; count != 0; count--, mod++) { for(count = ts->modheight_count; count != 0; count--, mod++) {
if (mod->tile == tile) if (mod->tile == tile)
return mod->height; return mod->height;
@ -85,10 +85,10 @@ static int TerraformProc(TerraformerState *ts, uint tile, int mode)
int32 ret; int32 ret;
assert(tile < TILES_X * TILES_Y); assert(tile < TILES_X * TILES_Y);
if ((r=TerraformAllowTileProcess(ts, tile)) <= 0) if ((r=TerraformAllowTileProcess(ts, tile)) <= 0)
return r; return r;
if ((_map_type_and_height[tile] >> 4) == MP_RAILWAY) { if ((_map_type_and_height[tile] >> 4) == MP_RAILWAY) {
static const byte _railway_modes[4] = {8, 0x10, 4, 0x20}; static const byte _railway_modes[4] = {8, 0x10, 4, 0x20};
static const byte _railway_dangslopes[4] = {0xd, 0xe, 7, 0xb}; static const byte _railway_dangslopes[4] = {0xd, 0xe, 7, 0xb};
@ -128,7 +128,7 @@ static bool TerraformTileHeight(TerraformerState *ts, uint tile, int height)
int nh; int nh;
TerraformerHeightMod *mod; TerraformerHeightMod *mod;
int count; int count;
assert(tile < TILES_X * TILES_Y); assert(tile < TILES_X * TILES_Y);
if (height < 0) { if (height < 0) {
@ -140,11 +140,11 @@ static bool TerraformTileHeight(TerraformerState *ts, uint tile, int height)
if (height > 0xF) if (height > 0xF)
return false; return false;
nh = TerraformGetHeightOfTile(ts, tile); nh = TerraformGetHeightOfTile(ts, tile);
if (nh < 0 || height == nh) if (nh < 0 || height == nh)
return false; return false;
if (TerraformProc(ts, tile, 0)<0) if (TerraformProc(ts, tile, 0)<0)
return false; return false;
@ -227,7 +227,7 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
if (p1 & 1) { if (p1 & 1) {
if (!TerraformTileHeight(&ts, tile+TILE_XY(1,0), if (!TerraformTileHeight(&ts, tile+TILE_XY(1,0),
(_map_type_and_height[tile+TILE_XY(1,0)]&0xF) + direction)) (_map_type_and_height[tile+TILE_XY(1,0)]&0xF) + direction))
return CMD_ERROR; return CMD_ERROR;
} }
@ -254,7 +254,7 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* Check if tunnel would take damage */ /* Check if tunnel would take damage */
int count; int count;
TileIndex *ti = ts.tile_table; TileIndex *ti = ts.tile_table;
for(count = ts.tile_table_count; count != 0; count--, ti++) { for(count = ts.tile_table_count; count != 0; count--, ti++) {
uint z, t; uint z, t;
uint tile = *ti; uint tile = *ti;
@ -280,7 +280,7 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
for(count = ts.tile_table_count; count != 0; count--, ti++) { for(count = ts.tile_table_count; count != 0; count--, ti++) {
DoCommandByTile(*ti, 0, 0, flags, CMD_LANDSCAPE_CLEAR); DoCommandByTile(*ti, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
} }
} }
/* change the height */ /* change the height */
{ {
@ -291,10 +291,10 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
mod = ts.modheight; mod = ts.modheight;
for(count = ts.modheight_count; count != 0; count--, mod++) { for(count = ts.modheight_count; count != 0; count--, mod++) {
til = mod->tile; til = mod->tile;
// Change tile height // Change tile height
_map_type_and_height[til] = (_map_type_and_height[til]&~0x0F)|mod->height; _map_type_and_height[til] = (_map_type_and_height[til]&~0x0F)|mod->height;
TerraformAddDirtyTileAround(&ts, til); TerraformAddDirtyTileAround(&ts, til);
} }
} }
@ -306,7 +306,7 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
for(count = ts.tile_table_count; count != 0; count--, ti++) { for(count = ts.tile_table_count; count != 0; count--, ti++) {
MarkTileDirtyByTile(*ti); MarkTileDirtyByTile(*ti);
} }
} }
} }
return ts.cost; return ts.cost;
} }
@ -374,9 +374,9 @@ int32 CmdPurchaseLandArea(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
uint tile; uint tile;
int32 cost; int32 cost;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
if (!EnsureNoVehicle(tile)) if (!EnsureNoVehicle(tile))
@ -426,7 +426,7 @@ int32 ClearTile_Clear(uint tile, byte flags) {
int32 CmdSellLandArea(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdSellLandArea(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
uint tile; uint tile;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
@ -464,7 +464,7 @@ void DrawHillyLandTile(TileInfo *ti)
void DrawClearLandFence(TileInfo *ti, byte img) void DrawClearLandFence(TileInfo *ti, byte img)
{ {
byte z = ti->z; byte z = ti->z;
if (ti->tileh & 2) { if (ti->tileh & 2) {
z += 8; z += 8;
if (ti->tileh == 0x17) if (ti->tileh == 0x17)
@ -508,7 +508,7 @@ static void DrawTile_Clear(TileInfo *ti)
DrawGroundSprite( _clear_land_sprites_3[ti->map5&3] + _tileh_to_sprite[ti->tileh]); DrawGroundSprite( _clear_land_sprites_3[ti->map5&3] + _tileh_to_sprite[ti->tileh]);
break; break;
} }
DrawClearLandFence(ti, _map3_hi[ti->tile] >> 2); DrawClearLandFence(ti, _map3_hi[ti->tile] >> 2);
} }
@ -521,7 +521,7 @@ uint GetSlopeTileh_Clear(TileInfo *ti)
static void GetAcceptedCargo_Clear(uint tile, AcceptedCargo *ac) static void GetAcceptedCargo_Clear(uint tile, AcceptedCargo *ac)
{ {
/* unused */ /* unused */
} }
static void AnimateTile_Clear(uint tile) static void AnimateTile_Clear(uint tile)
@ -553,7 +553,7 @@ void TileLoopClearHelper(uint tile)
if ( (img_1&2) != (img_2&2) ) { if ( (img_1&2) != (img_2&2) ) {
_map3_hi[tile] |= 3 << 5; _map3_hi[tile] |= 3 << 5;
dirty = tile; dirty = tile;
} }
} else { } else {
if (img_1 == 1 && img_2 == 1) { if (img_1 == 1 && img_2 == 1) {
_map3_hi[tile] &= ~(3 << 5); _map3_hi[tile] &= ~(3 << 5);
@ -572,7 +572,7 @@ void TileLoopClearHelper(uint tile)
if ( (img_1&2) != (img_2&2) ) { if ( (img_1&2) != (img_2&2) ) {
_map3_hi[tile] |= 3 << 2; _map3_hi[tile] |= 3 << 2;
dirty = tile; dirty = tile;
} }
} else { } else {
if (img_1 == 1 && img_2 == 1) { if (img_1 == 1 && img_2 == 1) {
_map3_hi[tile] &= ~(3 << 2); _map3_hi[tile] &= ~(3 << 2);
@ -596,7 +596,7 @@ static void TileLoopClearAlps(uint tile)
m5 = _map5[tile] & 0x1C; m5 = _map5[tile] & 0x1C;
tmp = _map5[tile] & 3; tmp = _map5[tile] & 3;
if (k < -8) { if (k < -8) {
/* snow_m2_down */ /* snow_m2_down */
if (m5 != 0x10) if (m5 != 0x10)
@ -671,7 +671,7 @@ static void TileLoop_Clear(uint tile)
byte m5,m3; byte m5,m3;
TileLoopClearHelper(tile); TileLoopClearHelper(tile);
if (_opt.landscape == LT_DESERT) { if (_opt.landscape == LT_DESERT) {
TileLoopClearDesert(tile); TileLoopClearDesert(tile);
} else if (_opt.landscape == LT_HILLY) { } else if (_opt.landscape == LT_HILLY) {
@ -685,7 +685,7 @@ static void TileLoop_Clear(uint tile)
if ( (m5 & 0x1C) != 0xC) { if ( (m5 & 0x1C) != 0xC) {
if ( (m5 & 3) == 3) if ( (m5 & 3) == 3)
return; return;
if (_game_mode != GM_EDITOR) { if (_game_mode != GM_EDITOR) {
m5 += 0x20; m5 += 0x20;
if (m5 >= 0x20) { if (m5 >= 0x20) {
@ -727,7 +727,7 @@ void GenerateClearTile()
/* add hills */ /* add hills */
i = (Random() & 0x3FF) | 0x400; i = (Random() & 0x3FF) | 0x400;
do { do {
tile = TILE_MASK(Random()); tile = TILE_MASK(Random());
if (IS_TILETYPE(tile, MP_CLEAR)) if (IS_TILETYPE(tile, MP_CLEAR))
_map5[tile] = (byte)((_map5[tile] & ~(3<<2)) | (1<<2)); _map5[tile] = (byte)((_map5[tile] & ~(3<<2)) | (1<<2));
} while (--i); } while (--i);
@ -736,7 +736,7 @@ void GenerateClearTile()
i = (Random() & 0x7F) | 0x80; i = (Random() & 0x7F) | 0x80;
do { do {
r = Random(); r = Random();
tile = TILE_MASK(r); tile = TILE_MASK(r);
if (IS_TILETYPE(tile, MP_CLEAR)) { if (IS_TILETYPE(tile, MP_CLEAR)) {
j = ((r >> 16) & 0xF) + 5; j = ((r >> 16) & 0xF) + 5;
for(;;) { for(;;) {

View File

@ -305,7 +305,7 @@ static CommandProc * const _command_proc_table[] = {
int32 DoCommandByTile(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc) int32 DoCommandByTile(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc)
{ {
return DoCommand(GET_TILE_X(tile)*16, GET_TILE_Y(tile)*16, p1, p2, flags, procc); return DoCommand(GET_TILE_X(tile)*16, GET_TILE_Y(tile)*16, p1, p2, flags, procc);
} }
//extern void _stdcall Sleep(int s); //extern void _stdcall Sleep(int s);
@ -314,7 +314,7 @@ int32 DoCommand(int x, int y, uint32 p1, uint32 p2, uint32 flags, uint procc)
{ {
int32 res; int32 res;
CommandProc *proc; CommandProc *proc;
proc = _command_proc_table[procc]; proc = _command_proc_table[procc];
if (_docommand_recursive == 0) { if (_docommand_recursive == 0) {
@ -383,7 +383,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
int x = GET_TILE_X(tile)*16; int x = GET_TILE_X(tile)*16;
int y = GET_TILE_Y(tile)*16; int y = GET_TILE_Y(tile)*16;
assert(_docommand_recursive == 0); assert(_docommand_recursive == 0);
_error_message = INVALID_STRING_ID; _error_message = INVALID_STRING_ID;
_error_message_2 = cmd >> 16; _error_message_2 = cmd >> 16;
@ -404,9 +404,9 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
proc = _command_proc_table[cmd & 0xFF]; proc = _command_proc_table[cmd & 0xFF];
// this command is a notest command? // this command is a notest command?
notest = notest =
(cmd & 0xFF) == CMD_CLEAR_AREA || (cmd & 0xFF) == CMD_CLEAR_AREA ||
(cmd & 0xFF) == CMD_CONVERT_RAIL || (cmd & 0xFF) == CMD_CONVERT_RAIL ||
(cmd & 0xFF) == CMD_LEVEL_LAND || (cmd & 0xFF) == CMD_LEVEL_LAND ||
(cmd & 0xFF) == CMD_TRAIN_GOTO_DEPOT; (cmd & 0xFF) == CMD_TRAIN_GOTO_DEPOT;
@ -429,7 +429,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
return false; return false;
} }
// unless the command is a notest command, check if it can be executed. // unless the command is a notest command, check if it can be executed.
if (!notest) { if (!notest) {
@ -456,7 +456,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
// actually try and execute the command. // actually try and execute the command.
_yearly_expenses_type = 0; _yearly_expenses_type = 0;
res2 = proc(x,y, flags|DC_EXEC, p1, p2); res2 = proc(x,y, flags|DC_EXEC, p1, p2);
if (!notest) { if (!notest) {
assert(res == res2); // sanity check assert(res == res2); // sanity check
} else { } else {
@ -479,7 +479,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
} }
_docommand_recursive = 0; _docommand_recursive = 0;
if (callback) callback(true, tile, p1, p2); if (callback) callback(true, tile, p1, p2);
return true; return true;
@ -490,7 +490,7 @@ show_error:
callb_err: callb_err:
_docommand_recursive = 0; _docommand_recursive = 0;
if (callback) callback(false, tile, p1, p2); if (callback) callback(false, tile, p1, p2);
return false; return false;
} }

View File

@ -140,7 +140,7 @@ enum {
CMD_REFIT_RAIL_VEHICLE = 106, CMD_REFIT_RAIL_VEHICLE = 106,
CMD_RESTORE_ORDER_INDEX = 107, CMD_RESTORE_ORDER_INDEX = 107,
CMD_BUILD_LOCK = 108, CMD_BUILD_LOCK = 108,
CMD_START_SCENARIO = 109, CMD_START_SCENARIO = 109,
CMD_BUILD_MANY_SIGNALS = 110, CMD_BUILD_MANY_SIGNALS = 110,
@ -157,7 +157,7 @@ enum {
DC_AI_BUILDING = 0x20, // special building rules for AI DC_AI_BUILDING = 0x20, // special building rules for AI
DC_NO_TOWN_RATING = 0x40, // town rating does not disallow you from building DC_NO_TOWN_RATING = 0x40, // town rating does not disallow you from building
DC_FORCETEST = 0x80, // force test too. DC_FORCETEST = 0x80, // force test too.
CMD_ERROR = ((int32)0x80000000), CMD_ERROR = ((int32)0x80000000),
}; };

View File

@ -44,7 +44,7 @@ static const WindowDesc _iconsole_window_desc = {
static _iconsole_cmd * _iconsole_cmds; // list of registred commands static _iconsole_cmd * _iconsole_cmds; // list of registred commands
static _iconsole_var * _iconsole_vars; // list of registred vars static _iconsole_var * _iconsole_vars; // list of registred vars
// ** console std lib ** // // ** console std lib ** //
static byte _stdlib_developer=1; static byte _stdlib_developer=1;
static bool _stdlib_con_developer=false; static bool _stdlib_con_developer=false;
static void IConsoleStdLibRegister(); static void IConsoleStdLibRegister();
@ -96,7 +96,7 @@ static void IConsoleWndProc(Window *w, WindowEvent *e)
GfxFillRect(posx,posy,posx+5,posy+1,color); GfxFillRect(posx,posy,posx+5,posy+1,color);
_video_driver->make_dirty(posx,posy,5,1); _video_driver->make_dirty(posx,posy,5,1);
} }
_icursor_counter=0; _icursor_counter=0;
} }
break; break;
@ -157,14 +157,14 @@ static void IConsoleWndProc(Window *w, WindowEvent *e)
{ {
IConsoleSwitch(); IConsoleSwitch();
} else } else
if (e->keypress.keycode == WKC_RETURN) if (e->keypress.keycode == WKC_RETURN)
{ {
IConsolePrintF(_iconsole_color_commands, "] %s", _iconsole_cmdline); IConsolePrintF(_iconsole_color_commands, "] %s", _iconsole_cmdline);
IConsoleCmdBufferAdd(_iconsole_cmdline); IConsoleCmdBufferAdd(_iconsole_cmdline);
IConsoleCmdExec((byte *) _iconsole_cmdline); IConsoleCmdExec((byte *) _iconsole_cmdline);
IConsoleClearCommand(); IConsoleClearCommand();
} else } else
if (e->keypress.keycode == WKC_BACKSPACE) if (e->keypress.keycode == WKC_BACKSPACE)
{ {
if (_iconsole_cmdpos!=0) _iconsole_cmdpos--; if (_iconsole_cmdpos!=0) _iconsole_cmdpos--;
_iconsole_cmdline[_iconsole_cmdpos]=0; _iconsole_cmdline[_iconsole_cmdpos]=0;
@ -175,10 +175,10 @@ static void IConsoleWndProc(Window *w, WindowEvent *e)
{ {
_iconsole_scroll=79; _iconsole_scroll=79;
_iconsole_cmdline[_iconsole_cmdpos]=e->keypress.ascii; _iconsole_cmdline[_iconsole_cmdpos]=e->keypress.ascii;
if (_iconsole_cmdpos!=255) _iconsole_cmdpos++; if (_iconsole_cmdpos!=255) _iconsole_cmdpos++;
SetWindowDirty(w); SetWindowDirty(w);
_iconsole_cmdbufferpos=19; _iconsole_cmdbufferpos=19;
} else e->keypress.cont=true; } else e->keypress.cont=true;
break; break;
} }
@ -211,9 +211,9 @@ for (i=0;i<80;i++) {
} }
IConsoleStdLibRegister(); IConsoleStdLibRegister();
#if defined(WITH_REV) #if defined(WITH_REV)
IConsolePrintF(13,"OpenTTD Game Console Revision 3 - %s",_openttd_revision); IConsolePrintF(13,"OpenTTD Game Console Revision 3 - %s",_openttd_revision);
#else #else
IConsolePrint(13,"OpenTTD Game Console Revision 3"); IConsolePrint(13,"OpenTTD Game Console Revision 3");
#endif #endif
IConsolePrint(12,"---------------------------------"); IConsolePrint(12,"---------------------------------");
IConsolePrint(12,"use \"help\" for more info"); IConsolePrint(12,"use \"help\" for more info");
@ -386,7 +386,7 @@ void* IConsoleCmdGetAddr(byte * name) {
_iconsole_cmd * item; _iconsole_cmd * item;
item = _iconsole_cmds; item = _iconsole_cmds;
while (item != NULL) { while (item != NULL) {
if (strcmp(item->name,name)==0) return item->addr; if (strcmp(item->name,name)==0) return item->addr;
item = item->_next; item = item->_next;
} }
@ -455,7 +455,7 @@ _iconsole_var * IConsoleVarGet(byte * name) {
_iconsole_var * item; _iconsole_var * item;
item = _iconsole_vars; item = _iconsole_vars;
while (item != NULL) { while (item != NULL) {
if (strcmp(item->name,name)==0) return item; if (strcmp(item->name,name)==0) return item;
item = item->_next; item = item->_next;
} }
@ -733,7 +733,7 @@ tokenstream--;
if (!(*tokenstream==0)) { if (!(*tokenstream==0)) {
c++; c++;
tokenstream++; tokenstream++;
*tokenstream = 0; *tokenstream = 0;
} }
//** interpreting **// //** interpreting **//
@ -790,7 +790,7 @@ if (function != NULL) {
//** executing **// //** executing **//
if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode); if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode);
switch (execution_mode) { switch (execution_mode) {
case 0: case 0:
{ {
// not found // not found
IConsoleError("command or variable not found"); IConsoleError("command or variable not found");
@ -830,7 +830,7 @@ case 2:
else if (strcmp(tokens[1],"--")==0) { else if (strcmp(tokens[1],"--")==0) {
*(bool *)var->addr=!*(bool *)var->addr; *(bool *)var->addr=!*(bool *)var->addr;
IConsoleVarDump(var,NULL); IConsoleVarDump(var,NULL);
} }
else { IConsoleError("operation not supported"); } else { IConsoleError("operation not supported"); }
} }
break; break;
@ -852,7 +852,7 @@ case 2:
else if (strcmp(tokens[1],"--")==0) { else if (strcmp(tokens[1],"--")==0) {
(*(byte *)var->addr)--; (*(byte *)var->addr)--;
IConsoleVarDump(var,NULL); IConsoleVarDump(var,NULL);
} }
else { IConsoleError("operation not supported"); } else { IConsoleError("operation not supported"); }
} }
break; break;
@ -1083,7 +1083,7 @@ case 4:
result = NULL; result = NULL;
} }
} }
} }
break; break;
default: default:
@ -1129,7 +1129,7 @@ static _iconsole_var * IConsoleStdLibPrintFC(byte argc, byte* argv[], byte argt[
} }
static _iconsole_var * IConsoleStdLibScreenShot(byte argc, byte* argv[], byte argt[]) { static _iconsole_var * IConsoleStdLibScreenShot(byte argc, byte* argv[], byte argt[]) {
if (argc<2) { if (argc<2) {
_make_screenshot=1; _make_screenshot=1;
} else { } else {
@ -1201,7 +1201,7 @@ int l = 0;
if (argv[1]!=NULL) l = strlen((char *) argv[1]); if (argv[1]!=NULL) l = strlen((char *) argv[1]);
item = _iconsole_cmds; item = _iconsole_cmds;
while (item != NULL) { while (item != NULL) {
if (argv[1]!=NULL) { if (argv[1]!=NULL) {
if (memcmp((void *) item->name, (void *) argv[1],l)==0) if (memcmp((void *) item->name, (void *) argv[1],l)==0)
@ -1225,7 +1225,7 @@ int l = 0;
if (argv[1]!=NULL) l = strlen((char *) argv[1]); if (argv[1]!=NULL) l = strlen((char *) argv[1]);
item = _iconsole_vars; item = _iconsole_vars;
while (item != NULL) { while (item != NULL) {
if (argv[1]!=NULL) { if (argv[1]!=NULL) {
if (memcmp((void *) item->name, (void *) argv[1],l)==0) if (memcmp((void *) item->name, (void *) argv[1],l)==0)
@ -1249,7 +1249,7 @@ int l = 0;
if (argv[1]!=NULL) l = strlen((char *) argv[1]); if (argv[1]!=NULL) l = strlen((char *) argv[1]);
item = _iconsole_vars; item = _iconsole_vars;
while (item != NULL) { while (item != NULL) {
if (argv[1]!=NULL) { if (argv[1]!=NULL) {
if (memcmp((void *) item->name, (void *) argv[1],l)==0) if (memcmp((void *) item->name, (void *) argv[1],l)==0)

View File

@ -13,7 +13,7 @@
static void DisasterClearSquare(uint tile) static void DisasterClearSquare(uint tile)
{ {
int type; int type;
if (!EnsureNoVehicle(tile)) if (!EnsureNoVehicle(tile))
return; return;
@ -107,7 +107,7 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
if ( (u=v->next) != NULL) { if ( (u=v->next) != NULL) {
BeginVehicleMove(u); BeginVehicleMove(u);
u->x_pos = x; u->x_pos = x;
u->y_pos = yt = y - 1 - (max(z - GetSlopeZ(x, y-1), 0) >> 3); u->y_pos = yt = y - 1 - (max(z - GetSlopeZ(x, y-1), 0) >> 3);
u->z_pos = GetSlopeZ(x,yt); u->z_pos = GetSlopeZ(x,yt);
@ -144,7 +144,7 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
return; return;
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos); SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
if (v->next_order == 1) { if (v->next_order == 1) {
@ -162,7 +162,7 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
if (IS_TILETYPE(tile, MP_STATION) && if (IS_TILETYPE(tile, MP_STATION) &&
IS_BYTE_INSIDE(_map5[tile], 8, 0x43) && IS_BYTE_INSIDE(_map5[tile], 8, 0x43) &&
IS_HUMAN_PLAYER(_map_owner[tile])) { IS_HUMAN_PLAYER(_map_owner[tile])) {
v->next_order = 1; v->next_order = 1;
v->age = 0; v->age = 0;
@ -176,12 +176,12 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
if (v->y_pos >= (TILES_Y+9) * 16 - 1) if (v->y_pos >= (TILES_Y+9) * 16 - 1)
DeleteDisasterVeh(v); DeleteDisasterVeh(v);
return; return;
} }
if (v->next_order > 2) { if (v->next_order > 2) {
if (++v->age <= 13320) if (++v->age <= 13320)
return; return;
tile = v->tile; /**/ tile = v->tile; /**/
if (IS_TILETYPE(tile, MP_STATION) && if (IS_TILETYPE(tile, MP_STATION) &&
@ -245,9 +245,9 @@ static void DisasterTick_UFO(Vehicle *v)
byte z; byte z;
v->u.disaster.image_override = (++v->tick_counter & 8) ? 0xF45 : 0xF44; v->u.disaster.image_override = (++v->tick_counter & 8) ? 0xF45 : 0xF44;
if (v->next_order == 0) { if (v->next_order == 0) {
// fly around randomly // fly around randomly
int x = GET_TILE_X(v->dest_tile)*16; int x = GET_TILE_X(v->dest_tile)*16;
int y = GET_TILE_Y(v->dest_tile)*16; int y = GET_TILE_Y(v->dest_tile)*16;
if (abs(x - v->x_pos) + abs(y - v->y_pos) >= 16) { if (abs(x - v->x_pos) + abs(y - v->y_pos) >= 16) {
@ -288,11 +288,11 @@ static void DisasterTick_UFO(Vehicle *v)
v->direction = GetDirectionTowards(v, u->x_pos, u->y_pos); v->direction = GetDirectionTowards(v, u->x_pos, u->y_pos);
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
z = v->z_pos; z = v->z_pos;
if (dist <= 16 && z > u->z_pos) z--; if (dist <= 16 && z > u->z_pos) z--;
SetDisasterVehiclePos(v, gp.x, gp.y, z); SetDisasterVehiclePos(v, gp.x, gp.y, z);
if (z <= u->z_pos && (u->vehstatus&VS_HIDDEN)==0) { if (z <= u->z_pos && (u->vehstatus&VS_HIDDEN)==0) {
v->age++; v->age++;
if (u->u.road.crashed_ctr == 0) { if (u->u.road.crashed_ctr == 0) {
@ -332,10 +332,10 @@ static void DestructIndustry(Industry *i)
static void DisasterTick_2(Vehicle *v) static void DisasterTick_2(Vehicle *v)
{ {
GetNewVehiclePosResult gp; GetNewVehiclePosResult gp;
v->tick_counter++; v->tick_counter++;
v->u.disaster.image_override = (v->next_order == 1 && v->tick_counter&4) ? 0xF4F : 0; v->u.disaster.image_override = (v->next_order == 1 && v->tick_counter&4) ? 0xF4F : 0;
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos); SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@ -386,7 +386,7 @@ static void DisasterTick_2(Vehicle *v)
return; return;
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
if (!IS_TILETYPE(tile, MP_INDUSTRY)) if (!IS_TILETYPE(tile, MP_INDUSTRY))
return; return;
v->dest_tile = ind = _map2[tile]; v->dest_tile = ind = _map2[tile];
@ -456,7 +456,7 @@ static void DisasterTick_3(Vehicle *v)
return; return;
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
if (!IS_TILETYPE(tile, MP_INDUSTRY)) if (!IS_TILETYPE(tile, MP_INDUSTRY))
return; return;
v->dest_tile = ind = _map2[tile]; v->dest_tile = ind = _map2[tile];
@ -546,7 +546,7 @@ static void DisasterTick_4(Vehicle *v)
InitializeDisasterVehicle(w, -6*16, v->y_pos, 0, 5, 12); InitializeDisasterVehicle(w, -6*16, v->y_pos, 0, 5, 12);
w->vehstatus |= VS_DISASTER; w->vehstatus |= VS_DISASTER;
} else if (v->next_order < 1) { } else if (v->next_order < 1) {
int x = GET_TILE_X(v->dest_tile)*16; int x = GET_TILE_X(v->dest_tile)*16;
int y = GET_TILE_Y(v->dest_tile)*16; int y = GET_TILE_Y(v->dest_tile)*16;
if (abs(x - v->x_pos) + abs(y - v->y_pos) >= 16) { if (abs(x - v->x_pos) + abs(y - v->y_pos) >= 16) {
@ -593,7 +593,7 @@ static void DisasterTick_4b(Vehicle *v)
} }
if (v->next_order == 0) { if (v->next_order == 0) {
u = &_vehicles[v->u.disaster.unk2]; u = &_vehicles[v->u.disaster.unk2];
if (abs(v->x_pos - u->x_pos) > 16) if (abs(v->x_pos - u->x_pos) > 16)
return; return;
v->next_order = 1; v->next_order = 1;
@ -685,7 +685,7 @@ void OnNewDay_DisasterVehicle(Vehicle *v)
typedef void DisasterInitProc(); typedef void DisasterInitProc();
// Zeppeliner which crashes on a small airport // Zeppeliner which crashes on a small airport
static void Disaster0_Init() static void Disaster0_Init()
{ {
Vehicle *v = ForceAllocateSpecialVehicle(), *u; Vehicle *v = ForceAllocateSpecialVehicle(), *u;
Station *st; Station *st;
@ -695,7 +695,7 @@ static void Disaster0_Init()
return; return;
for(st=_stations;;) { for(st=_stations;;) {
if (st->xy && st->airport_tile != 0 && if (st->xy && st->airport_tile != 0 &&
st->airport_type <= 1 && st->airport_type <= 1 &&
IS_HUMAN_PLAYER(st->owner)) { IS_HUMAN_PLAYER(st->owner)) {
x = (GET_TILE_X(st->xy) + 2) * 16; x = (GET_TILE_X(st->xy) + 2) * 16;
@ -714,12 +714,12 @@ static void Disaster0_Init()
u = ForceAllocateSpecialVehicle(); u = ForceAllocateSpecialVehicle();
if (u != NULL) { if (u != NULL) {
v->next = u; v->next = u;
InitializeDisasterVehicle(u,x,0,0,3,1); InitializeDisasterVehicle(u,x,0,0,3,1);
u->vehstatus |= VS_DISASTER; u->vehstatus |= VS_DISASTER;
} }
} }
static void Disaster1_Init() static void Disaster1_Init()
{ {
Vehicle *v = ForceAllocateSpecialVehicle(), *u; Vehicle *v = ForceAllocateSpecialVehicle(), *u;
int x; int x;
@ -737,12 +737,12 @@ static void Disaster1_Init()
u = ForceAllocateSpecialVehicle(); u = ForceAllocateSpecialVehicle();
if (u != NULL) { if (u != NULL) {
v->next = u; v->next = u;
InitializeDisasterVehicle(u,x,0,0,3,3); InitializeDisasterVehicle(u,x,0,0,3,3);
u->vehstatus |= VS_DISASTER; u->vehstatus |= VS_DISASTER;
} }
} }
static void Disaster2_Init() static void Disaster2_Init()
{ {
Industry *i, *found; Industry *i, *found;
Vehicle *v,*u; Vehicle *v,*u;
@ -750,7 +750,7 @@ static void Disaster2_Init()
for(found=NULL,i=_industries; i != endof(_industries); i++) { for(found=NULL,i=_industries; i != endof(_industries); i++) {
if (i->xy != 0 && if (i->xy != 0 &&
i->type == IT_OIL_REFINERY && i->type == IT_OIL_REFINERY &&
(found==NULL || CHANCE16(1,2))) { (found==NULL || CHANCE16(1,2))) {
found = i; found = i;
} }
@ -771,12 +771,12 @@ static void Disaster2_Init()
u = ForceAllocateSpecialVehicle(); u = ForceAllocateSpecialVehicle();
if (u != NULL) { if (u != NULL) {
v->next = u; v->next = u;
InitializeDisasterVehicle(u,x,y,0,3,5); InitializeDisasterVehicle(u,x,y,0,3,5);
u->vehstatus |= VS_DISASTER; u->vehstatus |= VS_DISASTER;
} }
} }
static void Disaster3_Init() static void Disaster3_Init()
{ {
Industry *i, *found; Industry *i, *found;
Vehicle *v,*u,*w; Vehicle *v,*u,*w;
@ -784,7 +784,7 @@ static void Disaster3_Init()
for(found=NULL,i=_industries; i != endof(_industries); i++) { for(found=NULL,i=_industries; i != endof(_industries); i++) {
if (i->xy != 0 && if (i->xy != 0 &&
i->type == IT_FACTORY && i->type == IT_FACTORY &&
(found==NULL || CHANCE16(1,2))) { (found==NULL || CHANCE16(1,2))) {
found = i; found = i;
} }
@ -805,18 +805,18 @@ static void Disaster3_Init()
u = ForceAllocateSpecialVehicle(); u = ForceAllocateSpecialVehicle();
if (u != NULL) { if (u != NULL) {
v->next = u; v->next = u;
InitializeDisasterVehicle(u,x,y,0,5,7); InitializeDisasterVehicle(u,x,y,0,5,7);
u->vehstatus |= VS_DISASTER; u->vehstatus |= VS_DISASTER;
w = ForceAllocateSpecialVehicle(); w = ForceAllocateSpecialVehicle();
if (w != NULL) { if (w != NULL) {
u->next = w; u->next = w;
InitializeDisasterVehicle(w,x,y,140,5,8); InitializeDisasterVehicle(w,x,y,140,5,8);
} }
} }
} }
static void Disaster4_Init() static void Disaster4_Init()
{ {
Vehicle *v = ForceAllocateSpecialVehicle(), *u; Vehicle *v = ForceAllocateSpecialVehicle(), *u;
int x,y; int x,y;
@ -835,13 +835,13 @@ static void Disaster4_Init()
u = ForceAllocateSpecialVehicle(); u = ForceAllocateSpecialVehicle();
if (u != NULL) { if (u != NULL) {
v->next = u; v->next = u;
InitializeDisasterVehicle(u,x,y,0,7,10); InitializeDisasterVehicle(u,x,y,0,7,10);
u->vehstatus |= VS_DISASTER; u->vehstatus |= VS_DISASTER;
} }
} }
// Submarine type 1 // Submarine type 1
static void Disaster5_Init() static void Disaster5_Init()
{ {
Vehicle *v = ForceAllocateSpecialVehicle(); Vehicle *v = ForceAllocateSpecialVehicle();
int x,y; int x,y;
@ -862,7 +862,7 @@ static void Disaster5_Init()
} }
// Submarine type 2 // Submarine type 2
static void Disaster6_Init() static void Disaster6_Init()
{ {
Vehicle *v = ForceAllocateSpecialVehicle(); Vehicle *v = ForceAllocateSpecialVehicle();
int x,y; int x,y;
@ -882,20 +882,20 @@ static void Disaster6_Init()
v->age = 0; v->age = 0;
} }
static void Disaster7_Init() static void Disaster7_Init()
{ {
Industry *i; Industry *i;
int maxloop = 15; int maxloop = 15;
int index = Random() & 0xF; int index = Random() & 0xF;
do { do {
for(i=_industries; i != endof(_industries); i++) { for(i=_industries; i != endof(_industries); i++) {
if (i->xy != 0 && i->type == IT_COAL_MINE && --index < 0) { if (i->xy != 0 && i->type == IT_COAL_MINE && --index < 0) {
SET_DPARAM16(0, i->town->index); SET_DPARAM16(0, i->town->index);
AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES, AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES,
NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy + TILE_XY(1,1), 0); NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy + TILE_XY(1,1), 0);
{ {
uint tile = i->xy; uint tile = i->xy;
int step = _tileoffs_by_dir[Random() & 3]; int step = _tileoffs_by_dir[Random() & 3];

View File

@ -129,7 +129,7 @@ static void BuildDocksToolbWndProc(Window *w, WindowEvent *e)
case WE_PLACE_OBJ: case WE_PLACE_OBJ:
_place_proc(e->place.tile); _place_proc(e->place.tile);
break; break;
case WE_PLACE_DRAG: { case WE_PLACE_DRAG: {
VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata); VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, e->place.userdata);
@ -155,7 +155,7 @@ static void BuildDocksToolbWndProc(Window *w, WindowEvent *e)
w = FindWindowById(WC_BUILD_DEPOT, 0); w = FindWindowById(WC_BUILD_DEPOT, 0);
if (w != NULL) WP(w,def_d).close=true; if (w != NULL) WP(w,def_d).close=true;
break; break;
case WE_PLACE_PRESIZE: { case WE_PLACE_PRESIZE: {
uint tile_from, tile_to; uint tile_from, tile_to;
@ -225,7 +225,7 @@ static void BuildDockStationWndProc(Window *w, WindowEvent *e)
CheckRedrawStationCoverage(w); CheckRedrawStationCoverage(w);
break; break;
} }
} }
} }
static const Widget _build_dock_station_widgets[] = { static const Widget _build_dock_station_widgets[] = {

View File

@ -44,11 +44,11 @@ void UpdatePlayerHouse(Player *p, uint score)
uint32 CalculateCompanyValue(Player *p) { uint32 CalculateCompanyValue(Player *p) {
byte owner = p->index; byte owner = p->index;
uint32 value; uint32 value;
{ {
Station *st; Station *st;
uint num = 0; uint num = 0;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0 && st->owner == owner) { if (st->xy != 0 && st->owner == owner) {
uint facil = st->facilities; uint facil = st->facilities;
@ -194,7 +194,7 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
{ {
_score_part[owner][SCORE_LOAN] = score_info[SCORE_LOAN].needed - p->current_loan; _score_part[owner][SCORE_LOAN] = score_info[SCORE_LOAN].needed - p->current_loan;
} }
// Now we calculate the score for each item.. // Now we calculate the score for each item..
{ {
int i; int i;
@ -210,9 +210,9 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
score += s; score += s;
total_score += score_info[i].score; total_score += score_info[i].score;
} }
_score_part[owner][SCORE_TOTAL] = score; _score_part[owner][SCORE_TOTAL] = score;
// We always want the score scaled to SCORE_MAX (1000) // We always want the score scaled to SCORE_MAX (1000)
if (total_score != SCORE_MAX) if (total_score != SCORE_MAX)
score = score * SCORE_MAX / total_score; score = score * SCORE_MAX / total_score;
@ -223,7 +223,7 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
UpdatePlayerHouse(p, score); UpdatePlayerHouse(p, score);
p->old_economy[0].company_value = CalculateCompanyValue(p); p->old_economy[0].company_value = CalculateCompanyValue(p);
} }
InvalidateWindow(WC_PERFORMANCE_DETAIL, 0); InvalidateWindow(WC_PERFORMANCE_DETAIL, 0);
return score; return score;
} }
@ -236,7 +236,7 @@ void ChangeOwnershipOfPlayerItems(byte old_player, byte new_player)
if (new_player == 255) { if (new_player == 255) {
Subsidy *s; Subsidy *s;
for(s=_subsidies; s != endof(_subsidies); s++) { for(s=_subsidies; s != endof(_subsidies); s++) {
if (s->cargo_type != 0xff && s->age >= 12) { if (s->cargo_type != 0xff && s->age >= 12) {
Station *st = DEREF_STATION(s->to); Station *st = DEREF_STATION(s->to);
@ -249,7 +249,7 @@ void ChangeOwnershipOfPlayerItems(byte old_player, byte new_player)
// take care of rating in towns // take care of rating in towns
{ {
Town *t; Town *t;
// if a player takes over, give the ratings to that player. // if a player takes over, give the ratings to that player.
if (new_player != 255) { if (new_player != 255) {
FOR_ALL_TOWNS(t) if (t->xy && HASBIT(t->have_ratings, old_player)) { FOR_ALL_TOWNS(t) if (t->xy && HASBIT(t->have_ratings, old_player)) {
@ -269,7 +269,7 @@ void ChangeOwnershipOfPlayerItems(byte old_player, byte new_player)
CLRBIT(t->have_ratings, old_player); CLRBIT(t->have_ratings, old_player);
} }
} }
{ {
int num_train = 0; int num_train = 0;
int num_road = 0; int num_road = 0;
@ -353,7 +353,7 @@ static void PlayersCheckBankrupt(Player *p)
if (p->quarters_of_bankrupcy == 2) { if (p->quarters_of_bankrupcy == 2) {
year_2: year_2:
AddNewsItem( (StringID)(owner + 16), AddNewsItem( (StringID)(owner + 16),
NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0); NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
} else if (p->quarters_of_bankrupcy == 3) { } else if (p->quarters_of_bankrupcy == 3) {
@ -396,7 +396,7 @@ void DrawNewsBankrupcy(Window *w)
{ {
Player *p; Player *p;
DrawNewsBorder(w); DrawNewsBorder(w);
p = DEREF_PLAYER(WP(w,news_d).ni->string_id & 15); p = DEREF_PLAYER(WP(w,news_d).ni->string_id & 15);
DrawPlayerFace(p->face, p->player_color, 2, 23); DrawPlayerFace(p->face, p->player_color, 2, 23);
@ -446,7 +446,7 @@ void DrawNewsBankrupcy(Window *w)
90, 90,
STR_705D_HAS_BEEN_CLOSED_DOWN_BY, STR_705D_HAS_BEEN_CLOSED_DOWN_BY,
w->width - 101); w->width - 101);
break; break;
case 4: case 4:
DrawStringCentered(w->width>>1, 1, STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED, 0); DrawStringCentered(w->width>>1, 1, STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED, 0);
@ -499,7 +499,7 @@ StringID GetNewsStringBankrupcy(NewsItem *ni)
default: default:
NOT_REACHED(); NOT_REACHED();
} }
/* useless, but avoids compiler warning this way */ /* useless, but avoids compiler warning this way */
return 0; return 0;
} }
@ -563,13 +563,13 @@ static void AddInflation()
} }
_economy.max_loan_unround += BIGMULUS(_economy.max_loan_unround, inf, 16); _economy.max_loan_unround += BIGMULUS(_economy.max_loan_unround, inf, 16);
if (_economy.max_loan + 50000 <= _economy.max_loan_unround) if (_economy.max_loan + 50000 <= _economy.max_loan_unround)
_economy.max_loan += 50000; _economy.max_loan += 50000;
inf = _economy.infl_amount_pr * 54; inf = _economy.infl_amount_pr * 54;
for(i=0; i!=NUM_CARGO; i++) { for(i=0; i!=NUM_CARGO; i++) {
AddSingleInflation( AddSingleInflation(
_cargo_payment_rates + i, _cargo_payment_rates + i,
_cargo_payment_rates_frac + i, _cargo_payment_rates_frac + i,
inf inf
@ -592,7 +592,7 @@ static void PlayersPayInterest()
_current_player = p->index; _current_player = p->index;
SET_EXPENSES_TYPE(EXPENSES_LOAN_INT); SET_EXPENSES_TYPE(EXPENSES_LOAN_INT);
SubtractMoneyFromPlayer(BIGMULUS(p->current_loan, interest, 16)); SubtractMoneyFromPlayer(BIGMULUS(p->current_loan, interest, 16));
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
@ -767,28 +767,28 @@ Pair SetupSubsidyDecodeParam(Subsidy *s, bool mode)
void DeleteSubsidyWithIndustry(byte index) void DeleteSubsidyWithIndustry(byte index)
{ {
Subsidy *s; Subsidy *s;
for(s=_subsidies; s != endof(_subsidies); s++) { for(s=_subsidies; s != endof(_subsidies); s++) {
if (s->cargo_type != 0xFF && s->age < 12 && if (s->cargo_type != 0xFF && s->age < 12 &&
s->cargo_type != CT_PASSENGERS && s->cargo_type != CT_MAIL && s->cargo_type != CT_PASSENGERS && s->cargo_type != CT_MAIL &&
(index == s->from || (s->cargo_type!=CT_GOODS && s->cargo_type!=CT_FOOD && index==s->to))) { (index == s->from || (s->cargo_type!=CT_GOODS && s->cargo_type!=CT_FOOD && index==s->to))) {
s->cargo_type = 0xFF; s->cargo_type = 0xFF;
} }
} }
} }
void DeleteSubsidyWithStation(byte index) void DeleteSubsidyWithStation(byte index)
{ {
Subsidy *s; Subsidy *s;
bool dirty = false; bool dirty = false;
for(s=_subsidies; s != endof(_subsidies); s++) { for(s=_subsidies; s != endof(_subsidies); s++) {
if (s->cargo_type != 0xFF && s->age >= 12 && if (s->cargo_type != 0xFF && s->age >= 12 &&
(s->from == index || s->to == index)) { (s->from == index || s->to == index)) {
s->cargo_type = 0xFF; s->cargo_type = 0xFF;
dirty = true; dirty = true;
} }
} }
if (dirty) if (dirty)
InvalidateWindow(WC_SUBSIDIES_LIST, 0); InvalidateWindow(WC_SUBSIDIES_LIST, 0);
@ -852,7 +852,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
if (cargo == CT_GOODS || cargo == CT_FOOD) { if (cargo == CT_GOODS || cargo == CT_FOOD) {
// The destination is a town // The destination is a town
Town *t = DEREF_TOWN(RandomRange(_total_towns)); Town *t = DEREF_TOWN(RandomRange(_total_towns));
// Only want big towns // Only want big towns
if (t->xy == 0 || t->population < 900) if (t->xy == 0 || t->population < 900)
return; return;
@ -861,9 +861,9 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
} else { } else {
// The destination is an industry // The destination is an industry
Industry *i2 = DEREF_INDUSTRY(RandomRange(_total_industries)); Industry *i2 = DEREF_INDUSTRY(RandomRange(_total_industries));
// The industry must accept the cargo // The industry must accept the cargo
if (i == i2 || i2->xy == 0 || if (i == i2 || i2->xy == 0 ||
(cargo != i2->accepts_cargo[0] && (cargo != i2->accepts_cargo[0] &&
cargo != i2->accepts_cargo[1] && cargo != i2->accepts_cargo[1] &&
cargo != i2->accepts_cargo[2])) cargo != i2->accepts_cargo[2]))
@ -873,15 +873,15 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
} }
} }
static bool CheckSubsidyDuplicate(Subsidy *s) static bool CheckSubsidyDuplicate(Subsidy *s)
{ {
Subsidy *ss; Subsidy *ss;
for(ss=_subsidies; ss != endof(_subsidies); ss++) { for(ss=_subsidies; ss != endof(_subsidies); ss++) {
if (s != ss && if (s != ss &&
// ss->age < 12 && // ss->age < 12 &&
ss->from == s->from && ss->from == s->from &&
ss->to == s->to && ss->to == s->to &&
ss->cargo_type == s->cargo_type) { ss->cargo_type == s->cargo_type) {
s->cargo_type = 0xFF; s->cargo_type = 0xFF;
return true; return true;
@ -929,7 +929,7 @@ static void SubsidyMonthlyHandler()
if (++s == endof(_subsidies)) if (++s == endof(_subsidies))
goto no_add; goto no_add;
} }
n = 1000; n = 1000;
do { do {
FindSubsidyPassengerRoute(&fr); FindSubsidyPassengerRoute(&fr);
@ -1002,7 +1002,7 @@ int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, b
if (transit_days > _cargoc.transit_days_1[cargo]) { if (transit_days > _cargoc.transit_days_1[cargo]) {
transit_days -= _cargoc.transit_days_1[cargo]; transit_days -= _cargoc.transit_days_1[cargo];
f -= transit_days; f -= transit_days;
if (transit_days > _cargoc.transit_days_2[cargo]) { if (transit_days > _cargoc.transit_days_2[cargo]) {
transit_days -= _cargoc.transit_days_2[cargo]; transit_days -= _cargoc.transit_days_2[cargo];
@ -1019,7 +1019,7 @@ int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, b
static void DeliverGoodsToIndustry(TileIndex xy, byte cargo_type, int num_pieces) static void DeliverGoodsToIndustry(TileIndex xy, byte cargo_type, int num_pieces)
{ {
Industry *ind, *best; Industry *ind, *best;
int t, u; int t, u;
/* Check if there's an industry close to the station that accepts /* Check if there's an industry close to the station that accepts
@ -1031,7 +1031,7 @@ static void DeliverGoodsToIndustry(TileIndex xy, byte cargo_type, int num_pieces
== ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[2]) && == ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[2]) &&
ind->produced_cargo[0] != 0xFF && ind->produced_cargo[0] != 0xFF &&
ind->produced_cargo[0] != cargo_type && ind->produced_cargo[0] != cargo_type &&
(t=GetTileDist(ind->xy, xy)) < u) { (t=GetTileDist(ind->xy, xy)) < u) {
u = t; u = t;
best = ind; best = ind;
} }
@ -1063,7 +1063,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
/* check if there's a new subsidy that applies.. */ /* check if there's a new subsidy that applies.. */
for(s=_subsidies; s != endof(_subsidies); s++) { for(s=_subsidies; s != endof(_subsidies); s++) {
if (s->cargo_type == cargo_type && s->age < 12) { if (s->cargo_type == cargo_type && s->age < 12) {
/* Check distance from source */ /* Check distance from source */
if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL) { if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL) {
xy = DEREF_TOWN(s->from)->xy; xy = DEREF_TOWN(s->from)->xy;
@ -1072,7 +1072,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
} }
if (GetTileDist1D(xy, from->xy) > 9) if (GetTileDist1D(xy, from->xy) > 9)
continue; continue;
/* Check distance from dest */ /* Check distance from dest */
if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL || cargo_type == CT_GOODS || cargo_type == CT_FOOD) { if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL || cargo_type == CT_GOODS || cargo_type == CT_FOOD) {
xy = DEREF_TOWN(s->to)->xy; xy = DEREF_TOWN(s->to)->xy;
@ -1096,7 +1096,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
SET_DPARAM16(0, p->name_1); SET_DPARAM16(0, p->name_1);
SET_DPARAM32(1, p->name_2); SET_DPARAM32(1, p->name_2);
AddNewsItem( AddNewsItem(
STR_2031_SERVICE_SUBSIDY_AWARDED + _opt.diff.subsidy_multiplier, STR_2031_SERVICE_SUBSIDY_AWARDED + _opt.diff.subsidy_multiplier,
NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0),
pair.a, pair.b); pair.a, pair.b);
@ -1138,7 +1138,7 @@ static int32 DeliverGoods(int num_pieces, byte cargo_type, byte source, byte des
// Give the goods to the industry. // Give the goods to the industry.
DeliverGoodsToIndustry(s_to->xy, cargo_type, num_pieces); DeliverGoodsToIndustry(s_to->xy, cargo_type, num_pieces);
// Determine profit // Determine profit
{ {
int t = GetTileDist(s_from->xy, s_to->xy); int t = GetTileDist(s_from->xy, s_to->xy);
@ -1197,7 +1197,7 @@ int LoadUnloadVehicle(Vehicle *v)
for(;;) { for(;;) {
if (v->cargo_cap == 0) if (v->cargo_cap == 0)
goto next_vehicle; goto next_vehicle;
ge = &st->goods[v->cargo_type]; ge = &st->goods[v->cargo_type];
/* unload? */ /* unload? */
@ -1211,7 +1211,7 @@ int LoadUnloadVehicle(Vehicle *v)
} else if (u->next_order & OF_UNLOAD) { } else if (u->next_order & OF_UNLOAD) {
/* unload goods and let it wait at the station */ /* unload goods and let it wait at the station */
st->time_since_unload = 0; st->time_since_unload = 0;
if ((t=ge->waiting_acceptance & 0xFFF) == 0) { if ((t=ge->waiting_acceptance & 0xFFF) == 0) {
// No goods waiting at station // No goods waiting at station
ge->enroute_time = v->cargo_days; ge->enroute_time = v->cargo_days;
@ -1229,7 +1229,7 @@ int LoadUnloadVehicle(Vehicle *v)
v->cargo_count = 0; v->cargo_count = 0;
} }
} }
/* don't pick up goods that we unloaded */ /* don't pick up goods that we unloaded */
if (u->next_order & OF_UNLOAD) if (u->next_order & OF_UNLOAD)
goto next_vehicle; goto next_vehicle;
@ -1238,7 +1238,7 @@ int LoadUnloadVehicle(Vehicle *v)
ge->days_since_pickup = 0; ge->days_since_pickup = 0;
t = u->max_speed; t = u->max_speed;
if (u->type == VEH_Road) t >>=1; if (u->type == VEH_Road) t >>=1;
// if last speed is 0, we treat that as if no vehicle has ever visited the station. // if last speed is 0, we treat that as if no vehicle has ever visited the station.
ge->last_speed = t < 255 ? t : 255; ge->last_speed = t < 255 ? t : 255;
ge->last_age = _cur_year - v->build_year; ge->last_age = _cur_year - v->build_year;
@ -1252,7 +1252,7 @@ int LoadUnloadVehicle(Vehicle *v)
ge->waiting_acceptance -= cap; ge->waiting_acceptance -= cap;
unloading_time += cap; unloading_time += cap;
st->time_since_load = 0; st->time_since_load = 0;
// And record the source of the cargo, and the days in travel. // And record the source of the cargo, and the days in travel.
v->cargo_source = ge->enroute_from; v->cargo_source = ge->enroute_from;
v->cargo_days = ge->enroute_time; v->cargo_days = ge->enroute_time;

View File

@ -36,7 +36,7 @@ enum {
SCORE_TOTAL = 9, // This must always be the last entry SCORE_TOTAL = 9, // This must always be the last entry
NUM_SCORE = 10, // How many scores are there.. NUM_SCORE = 10, // How many scores are there..
SCORE_MAX = 1000, // The max score that can be in the performance history SCORE_MAX = 1000, // The max score that can be in the performance history
// the scores together of score_info is allowed to be more! // the scores together of score_info is allowed to be more!
}; };

View File

@ -124,7 +124,7 @@ void StartupEngines()
e->railtype = ei->railtype_climates >> 4; e->railtype = ei->railtype_climates >> 4;
e->flags = 0; e->flags = 0;
e->player_avail = 0; e->player_avail = 0;
r = Random(); r = Random();
e->intro_date = (uint16)((r & 0x1FF) + ei->base_intro); e->intro_date = (uint16)((r & 0x1FF) + ei->base_intro);
if (e->intro_date <= _date) { if (e->intro_date <= _date) {
@ -191,7 +191,7 @@ void SetWagonOverrideSprites(byte engine, struct SpriteSuperSet *superset,
wos->overrides_count++; wos->overrides_count++;
wos->overrides = realloc(wos->overrides, wos->overrides = realloc(wos->overrides,
wos->overrides_count * sizeof(struct WagonOverride)); wos->overrides_count * sizeof(struct WagonOverride));
wo = &wos->overrides[wos->overrides_count - 1]; wo = &wos->overrides[wos->overrides_count - 1];
wo->superset = *superset; wo->superset = *superset;
wo->trains = trains; wo->trains = trains;
@ -246,7 +246,7 @@ int GetCustomEngineSprite(byte engine, uint16 overriding_engine, byte cargo,
overset = GetWagonOverrideSpriteSet(engine, overriding_engine); overset = GetWagonOverrideSpriteSet(engine, overriding_engine);
if (overset) superset = overset; if (overset) superset = overset;
} }
if (!superset->sprites_per_set && cargo != 29) { if (!superset->sprites_per_set && cargo != 29) {
// This superset is empty but perhaps there'll be a default one. // This superset is empty but perhaps there'll be a default one.
superset = &_engine_custom_sprites[engine][29]; superset = &_engine_custom_sprites[engine][29];
@ -307,7 +307,7 @@ void AcceptEnginePreview(Engine *e, int player)
SETBIT(e->player_avail, player); SETBIT(e->player_avail, player);
p = DEREF_PLAYER(player); p = DEREF_PLAYER(player);
UPDATE_PLAYER_RAILTYPE(e,p); UPDATE_PLAYER_RAILTYPE(e,p);
e->preview_player = 0xFF; e->preview_player = 0xFF;
@ -333,7 +333,7 @@ void EnginesDailyLoop()
e->flags &= ~ENGINE_PREVIEWING; e->flags &= ~ENGINE_PREVIEWING;
DeleteWindowById(WC_ENGINE_PREVIEW, i); DeleteWindowById(WC_ENGINE_PREVIEW, i);
e->preview_player++; e->preview_player++;
} }
} else if (e->preview_player != 0xFF) { } else if (e->preview_player != 0xFF) {
num = e->preview_player; num = e->preview_player;
mask = 0; mask = 0;
@ -341,7 +341,7 @@ void EnginesDailyLoop()
best_hist = -1; best_hist = -1;
best_player = -1; best_player = -1;
FOR_ALL_PLAYERS(p) { FOR_ALL_PLAYERS(p) {
if (p->is_active && p->block_preview == 0 && !HASBIT(mask,p->index) && if (p->is_active && p->block_preview == 0 && !HASBIT(mask,p->index) &&
p->old_economy[0].performance_history > best_hist) { p->old_economy[0].performance_history > best_hist) {
best_hist = p->old_economy[0].performance_history; best_hist = p->old_economy[0].performance_history;
best_player = p->index; best_player = p->index;
@ -353,7 +353,7 @@ void EnginesDailyLoop()
} }
mask |= (1 << best_player); mask |= (1 << best_player);
} while (--num != 0); } while (--num != 0);
if (!IS_HUMAN_PLAYER(best_player)) { if (!IS_HUMAN_PLAYER(best_player)) {
/* TTDBUG: TTD has a bug here */ /* TTDBUG: TTD has a bug here */
AcceptEnginePreview(e, best_player); AcceptEnginePreview(e, best_player);
@ -361,7 +361,7 @@ void EnginesDailyLoop()
e->flags |= ENGINE_PREVIEWING; e->flags |= ENGINE_PREVIEWING;
e->preview_wait = 20; e->preview_wait = 20;
if (IS_INTERACTIVE_PLAYER(best_player)) { if (IS_INTERACTIVE_PLAYER(best_player)) {
ShowEnginePreviewWindow(i); ShowEnginePreviewWindow(i);
} }
} }
} }
@ -390,7 +390,7 @@ void NewVehicleAvailable(Engine *e)
FOR_ALL_PLAYERS(p) { FOR_ALL_PLAYERS(p) {
if (!HASBIT(e->player_avail,p->index)) if (!HASBIT(e->player_avail,p->index))
continue; continue;
for(v=_vehicles;;) { for(v=_vehicles;;) {
if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship || if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship ||
(v->type == VEH_Aircraft && v->subtype <= 2)) { (v->type == VEH_Aircraft && v->subtype <= 2)) {
@ -466,7 +466,7 @@ int32 CmdRenameEngine(int x, int y, uint32 flags, uint32 p1, uint32 p2)
str = AllocateName((byte*)_decode_parameters, 0); str = AllocateName((byte*)_decode_parameters, 0);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
StringID old_str = _engine_name_strings[p1]; StringID old_str = _engine_name_strings[p1];
_engine_name_strings[p1] = str; _engine_name_strings[p1] = str;

View File

@ -88,7 +88,7 @@ static void EnginePreviewWndProc(Window *w, WindowEvent *e)
case WE_CLICK: case WE_CLICK:
switch(e->click.widget) { switch(e->click.widget) {
case 3: DeleteWindow(w); break; case 3: DeleteWindow(w); break;
case 4: case 4:
DoCommandP(0, w->window_number, 0, NULL, CMD_WANT_ENGINE_PREVIEW); DoCommandP(0, w->window_number, 0, NULL, CMD_WANT_ENGINE_PREVIEW);
DeleteWindow(w); DeleteWindow(w);
break; break;
@ -150,7 +150,7 @@ void DrawNewsNewAircraftAvail(Window *w)
DrawNewsBorder(w); DrawNewsBorder(w);
engine = WP(w,news_d).ni->string_id; engine = WP(w,news_d).ni->string_id;
DrawStringMultiCenter(w->width >> 1, 20, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE, w->width - 2); DrawStringMultiCenter(w->width >> 1, 20, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE, w->width - 2);
GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); GfxFillRect(25, 56, w->width - 25, w->height - 2, 10);
@ -203,7 +203,7 @@ void DrawNewsNewShipAvail(Window *w)
DrawNewsBorder(w); DrawNewsBorder(w);
engine = WP(w,news_d).ni->string_id; engine = WP(w,news_d).ni->string_id;
DrawStringMultiCenter(w->width >> 1, 20, STR_982C_NEW_SHIP_NOW_AVAILABLE, w->width - 2); DrawStringMultiCenter(w->width >> 1, 20, STR_982C_NEW_SHIP_NOW_AVAILABLE, w->width - 2);
GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); GfxFillRect(25, 56, w->width - 25, w->height - 2, 10);

View File

@ -101,7 +101,7 @@ void FioOpenFile(int slot, const char *filename)
char buf[MAX_PATH]; char buf[MAX_PATH];
sprintf(buf, "%s%s", _path.data_dir, filename); sprintf(buf, "%s%s", _path.data_dir, filename);
f = fopen(buf, "rb"); f = fopen(buf, "rb");
#if !defined(WIN32) #if !defined(WIN32)
if (f == NULL) { if (f == NULL) {
@ -115,7 +115,7 @@ void FioOpenFile(int slot, const char *filename)
if (f == NULL) if (f == NULL)
error("Cannot open file '%s'", buf); error("Cannot open file '%s'", buf);
_fio.handles[slot] = f; _fio.handles[slot] = f;
FioSeekToFile(slot << 24); FioSeekToFile(slot << 24);
} }

18
gfx.c
View File

@ -242,17 +242,17 @@ void GfxDrawLine(int x, int y, int x2, int y2, int color)
// 0 - end of string // 0 - end of string
// 1 - SETX <BYTE> // 1 - SETX <BYTE>
// 2 - SETXY <BYTE> <BYTE> // 2 - SETXY <BYTE> <BYTE>
// 3-7 - // 3-7 -
// 8 - TINYFONT // 8 - TINYFONT
// 9 - BIGFONT // 9 - BIGFONT
// 10 - newline // 10 - newline
// 11-14 - // 11-14 -
// 15-31 - 17 colors // 15-31 - 17 colors
enum { enum {
ASCII_LETTERSTART = 32, ASCII_LETTERSTART = 32,
ASCII_SETX = 1, ASCII_SETX = 1,
ASCII_SETXY = 2, ASCII_SETXY = 2,
@ -510,7 +510,7 @@ check_bounds:
skip_char:; skip_char:;
for(;;) { for(;;) {
c = *string++; c = *string++;
if (c < ASCII_LETTERSTART) goto skip_cont; if (c < ASCII_LETTERSTART) goto skip_cont;
} }
} }
@ -586,7 +586,7 @@ static void GfxBlitTileZoomIn(BlitterParams *bp)
if (bp->mode & 1) { if (bp->mode & 1) {
src_o += READ_LE_UINT16(src_o + bp->start_y * 2); src_o += READ_LE_UINT16(src_o + bp->start_y * 2);
do { do {
do { do {
done = src_o[0]; done = src_o[0];
@ -1351,7 +1351,7 @@ static void GfxMainBlitter(byte *sprite, int x, int y, int mode)
if (dpi->zoom > 0) { if (dpi->zoom > 0) {
start_y += bp.height &~ zoom_mask; start_y += bp.height &~ zoom_mask;
bp.height &= zoom_mask; bp.height &= zoom_mask;
if (bp.height == 0) return; if (bp.height == 0) return;
y&=zoom_mask; y&=zoom_mask;
} }
@ -1622,7 +1622,7 @@ void UndrawMouseCursor()
_screen.dst_ptr + _cursor.draw_pos.x + _cursor.draw_pos.y * _screen.pitch, _screen.dst_ptr + _cursor.draw_pos.x + _cursor.draw_pos.y * _screen.pitch,
_cursor_backup, _cursor_backup,
_cursor.draw_size.x, _cursor.draw_size.y, _cursor.draw_size.x, _screen.pitch); _cursor.draw_size.x, _cursor.draw_size.y, _cursor.draw_size.x, _screen.pitch);
_video_driver->make_dirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y); _video_driver->make_dirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
} }
} }
@ -1920,9 +1920,9 @@ void SetAnimatedMouseCursor(const uint16 *table)
} }
bool ChangeResInGame(int w, int h) bool ChangeResInGame(int w, int h)
{ {
if ((_screen.width != w || _screen.height != h) && !_video_driver->change_resolution(w, h)) if ((_screen.width != w || _screen.height != h) && !_video_driver->change_resolution(w, h))
return false; return false;
_cur_resolution[0] = w; _cur_resolution[0] = w;
_cur_resolution[1] = h; _cur_resolution[1] = h;

6
gfx.h
View File

@ -13,7 +13,7 @@ struct DrawPixelInfo {
byte *dst_ptr; byte *dst_ptr;
int left, top, width, height; int left, top, width, height;
int pitch; int pitch;
uint16 zoom; uint16 zoom;
}; };
@ -47,8 +47,8 @@ int DrawString(int x, int y, uint16 str, byte color);
void DrawStringCenterUnderline(int x, int y, uint16 str, byte color); void DrawStringCenterUnderline(int x, int y, uint16 str, byte color);
int DoDrawString(const byte *string, int x, int y, byte color); int DoDrawString(const byte *string, int x, int y, byte color);
void DrawStringRightAligned(int x, int y, uint16 str, byte color); void DrawStringRightAligned(int x, int y, uint16 str, byte color);
void GfxFillRect(int left, int top, int right, int bottom, int color); void GfxFillRect(int left, int top, int right, int bottom, int color);
void GfxDrawLine(int left, int top, int right, int bottom, int color); void GfxDrawLine(int left, int top, int right, int bottom, int color);
void DrawFrameRect(int left, int top, int right, int bottom, int color, int flags); void DrawFrameRect(int left, int top, int right, int bottom, int color, int flags);
int GetStringWidth(const byte *str); int GetStringWidth(const byte *str);

View File

@ -33,7 +33,7 @@ typedef struct GraphDrawer {
void DrawGraph(GraphDrawer *gw) void DrawGraph(GraphDrawer *gw)
{ {
int i,j,k; int i,j,k;
int x,y,old_x,old_y; int x,y,old_x,old_y;
int color; int color;
@ -57,7 +57,7 @@ void DrawGraph(GraphDrawer *gw)
GfxFillRect(x, gw->top, x, bottom, color); GfxFillRect(x, gw->top, x, bottom, color);
x += 22; x += 22;
} while (--i); } while (--i);
/* draw the horizontal lines */ /* draw the horizontal lines */
i = 9; i = 9;
x = gw->left + 44; x = gw->left + 44;
@ -95,7 +95,7 @@ void DrawGraph(GraphDrawer *gw)
} }
} while (col_ptr++, --num_x); } while (col_ptr++, --num_x);
} while (row_ptr+=24, --num_dataset); } while (row_ptr+=24, --num_dataset);
/* setup scaling */ /* setup scaling */
y_scaling = 0x80000000; y_scaling = 0x80000000;
value = adj_height * 2; value = adj_height * 2;
@ -271,10 +271,10 @@ static void SetupGraphDrawerForPlayers(GraphDrawer *gd)
int nums; int nums;
int mo,yr; int mo,yr;
// Exclude the players which aren't valid // Exclude the players which aren't valid
FOR_ALL_PLAYERS(p) { FOR_ALL_PLAYERS(p) {
if (!p->is_active) CLRBIT(showbits,p->index); if (!p->is_active) CLRBIT(showbits,p->index);
} }
gd->sel = showbits; gd->sel = showbits;
gd->num_vert_lines = 24; gd->num_vert_lines = 24;
@ -305,7 +305,7 @@ static void OperatingProfitWndProc(Window *w, WindowEvent *e)
int numd; int numd;
DrawWindowWidgets(w); DrawWindowWidgets(w);
gd.left = 2; gd.left = 2;
gd.top = 18; gd.top = 18;
gd.height = 136; gd.height = 136;
@ -314,7 +314,7 @@ static void OperatingProfitWndProc(Window *w, WindowEvent *e)
gd.color_3 = 0x10; gd.color_3 = 0x10;
gd.color_2 = 0xD7; gd.color_2 = 0xD7;
gd.bg_line_color = 0xE; gd.bg_line_color = 0xE;
SetupGraphDrawerForPlayers(&gd); SetupGraphDrawerForPlayers(&gd);
numd = 0; numd = 0;
@ -528,13 +528,13 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
uint16 y=14; uint16 y=14;
int total_score = 0; int total_score = 0;
int color_done, color_notdone; int color_done, color_notdone;
// Draw standard stuff // Draw standard stuff
DrawWindowWidgets(w); DrawWindowWidgets(w);
// The player of which we check the detail performance rating // The player of which we check the detail performance rating
owner = FindFirstBit(w->click_state) - 13; owner = FindFirstBit(w->click_state) - 13;
// Paint the player icons // Paint the player icons
for (i=0;i<MAX_PLAYERS;i++) { for (i=0;i<MAX_PLAYERS;i++) {
if (!DEREF_PLAYER(i)->is_active) { if (!DEREF_PLAYER(i)->is_active) {
@ -550,7 +550,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
} }
continue; continue;
} }
// Check if we have the player marked as inactive // Check if we have the player marked as inactive
if ((w->disabled_state & (1 << (i+13)))) { if ((w->disabled_state & (1 << (i+13)))) {
// New player! Yippie :p // New player! Yippie :p
@ -558,11 +558,11 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
// We need a repaint // We need a repaint
SetWindowDirty(w); SetWindowDirty(w);
} }
if (i == owner) x = 1; else x = 0; if (i == owner) x = 1; else x = 0;
DrawPlayerIcon(i, i*33+11+x, 16+x); DrawPlayerIcon(i, i*33+11+x, 16+x);
} }
// The colors used to show how the progress is going // The colors used to show how the progress is going
color_done = _color_list[6].window_color_1b; color_done = _color_list[6].window_color_1b;
color_notdone = _color_list[4].window_color_1b; color_notdone = _color_list[4].window_color_1b;
@ -579,44 +579,44 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
score = SCORE_MAX; score = SCORE_MAX;
} else } else
total_score += score; total_score += score;
DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, 0); DrawString(7, y, STR_PERFORMANCE_DETAIL_VEHICLES + i, 0);
// Draw the score // Draw the score
SET_DPARAM32(0, score); SET_DPARAM32(0, score);
DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, 0); DrawStringRightAligned(107, y, SET_PERFORMANCE_DETAIL_INT, 0);
// Calculate the %-bar // Calculate the %-bar
if (val > needed) x = 50; if (val > needed) x = 50;
else if (val == 0) x = 0; else if (val == 0) x = 0;
else x = ((val * 50) / needed); else x = ((val * 50) / needed);
// SCORE_LOAN is inversed // SCORE_LOAN is inversed
if (val < 0 && i == SCORE_LOAN) if (val < 0 && i == SCORE_LOAN)
x = 0; x = 0;
// Draw the bar // Draw the bar
if (x != 0) if (x != 0)
GfxFillRect(112, y-2, x + 112, y+10, color_done); GfxFillRect(112, y-2, x + 112, y+10, color_done);
if (x != 50) if (x != 50)
GfxFillRect(x + 112, y-2, 50 + 112, y+10, color_notdone); GfxFillRect(x + 112, y-2, 50 + 112, y+10, color_notdone);
// Calculate the % // Calculate the %
if (val > needed) x = 100; if (val > needed) x = 100;
else x = ((val * 100) / needed); else x = ((val * 100) / needed);
// SCORE_LOAN is inversed // SCORE_LOAN is inversed
if (val < 0 && i == SCORE_LOAN) if (val < 0 && i == SCORE_LOAN)
x = 0; x = 0;
// Draw it // Draw it
SET_DPARAM32(0, x); SET_DPARAM32(0, x);
DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, 0); DrawStringCentered(137, y, STR_PERFORMANCE_DETAIL_PERCENT, 0);
// SCORE_LOAN is inversed // SCORE_LOAN is inversed
if (i == SCORE_LOAN) if (i == SCORE_LOAN)
val = needed - val; val = needed - val;
// Draw the amount we have against what is needed // Draw the amount we have against what is needed
// For some of them it is in currency format // For some of them it is in currency format
SET_DPARAM32(0, val); SET_DPARAM32(0, val);
@ -666,12 +666,12 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
FOR_ALL_PLAYERS(p2) FOR_ALL_PLAYERS(p2)
if (p2->is_active) if (p2->is_active)
UpdateCompanyRatingAndValue(p2, false); UpdateCompanyRatingAndValue(p2, false);
w->custom[0] = DAY_TICKS; w->custom[0] = DAY_TICKS;
w->custom[1] = 5; w->custom[1] = 5;
w->click_state = 1 << 13; w->click_state = 1 << 13;
SetWindowDirty(w); SetWindowDirty(w);
} }
break; break;
@ -927,7 +927,7 @@ static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e)
gd.month = 0xFF; gd.month = 0xFF;
gd.unk61A = 10; gd.unk61A = 10;
gd.unk61C = 10; gd.unk61C = 10;
for(i=0; i!=NUM_CARGO; i++) { for(i=0; i!=NUM_CARGO; i++) {
gd.colors[i] = _cargo_legend_colors[i]; gd.colors[i] = _cargo_legend_colors[i];
for(j=0; j!=20; j++) { for(j=0; j!=20; j++) {
@ -1031,14 +1031,14 @@ static void CompanyLeagueWndProc(Window *w, WindowEvent *e)
size_t pl_num, i; size_t pl_num, i;
DrawWindowWidgets(w); DrawWindowWidgets(w);
pl_num=0; pl_num=0;
FOR_ALL_PLAYERS(p) { FOR_ALL_PLAYERS(p) {
if (p->is_active) if (p->is_active)
plist[pl_num++] = p; plist[pl_num++] = p;
} }
assert(pl_num > 0); assert(pl_num > 0);
qsort(plist, pl_num, sizeof(Player*), _perf_hist_comp); qsort(plist, pl_num, sizeof(Player*), _perf_hist_comp);
i = 0; i = 0;
@ -1047,12 +1047,12 @@ static void CompanyLeagueWndProc(Window *w, WindowEvent *e)
p = plist[i]; p = plist[i];
SET_DPARAM16(1, p->name_1); SET_DPARAM16(1, p->name_1);
SET_DPARAM32(2, p->name_2); SET_DPARAM32(2, p->name_2);
SET_DPARAM16(3, GetPlayerNameString(p->index, 4)); SET_DPARAM16(3, GetPlayerNameString(p->index, 4));
/* WARNING ugly hack! /* WARNING ugly hack!
GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16 GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16
It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like
that because there is another param after it. that because there is another param after it.
So we'll just shift the rating one back if player is AI and all is fine So we'll just shift the rating one back if player is AI and all is fine
*/ */
SET_DPARAM16((IS_HUMAN_PLAYER(p->index) ? 5 : 4), GetPerformanceTitleFromValue(p->old_economy[1].performance_history)); SET_DPARAM16((IS_HUMAN_PLAYER(p->index) ? 5 : 4), GetPerformanceTitleFromValue(p->old_economy[1].performance_history));

View File

@ -465,20 +465,20 @@ static void VehicleChangeInfo(byte *buf, int len)
uint8 prop = grf_load_byte(&buf); uint8 prop = grf_load_byte(&buf);
switch (prop) { switch (prop) {
case 0x00: { case 0x00: {
/* Introduction date */ /* Introduction date */
foreach_engine { foreach_engine {
uint16 date = grf_load_word(&buf); uint16 date = grf_load_word(&buf);
ei[i].base_intro = date; ei[i].base_intro = date;
} }
break; break;
} }
case 0x02: { case 0x02: {
/* Decay speed */ /* Decay speed */
foreach_engine { foreach_engine {
uint8 decay = grf_load_byte(&buf); uint8 decay = grf_load_byte(&buf);
ei[i].unk2 &= 0x80; ei[i].unk2 &= 0x80;
ei[i].unk2 |= decay & 0x7f; ei[i].unk2 |= decay & 0x7f;
} }
@ -493,7 +493,7 @@ static void VehicleChangeInfo(byte *buf, int len)
} }
break; break;
} }
case 0x04: { case 0x04: {
/* Model life */ /* Model life */
foreach_engine { foreach_engine {
uint8 life = grf_load_byte(&buf); uint8 life = grf_load_byte(&buf);
@ -512,7 +512,7 @@ static void VehicleChangeInfo(byte *buf, int len)
} }
break; break;
} }
case 0x07: { case 0x07: {
/* Loading speed */ /* Loading speed */
/* Hyronymus explained me what does /* Hyronymus explained me what does
* this mean and insists on having a * this mean and insists on having a
@ -636,7 +636,7 @@ static void SpriteNewSuperset(byte *buf, int len)
uint8 nvar = buf[7]; uint8 nvar = buf[7];
//uint32 val; //uint32 val;
uint16 def; uint16 def;
grfmsg(GMS_WARN, "SpriteNewSuperset(0x81): Unsupported variable %x. Using default cid.", var); grfmsg(GMS_WARN, "SpriteNewSuperset(0x81): Unsupported variable %x. Using default cid.", var);
//val = (0xff << shiftnum) & andmask; //val = (0xff << shiftnum) & andmask;

2
hal.h
View File

@ -65,7 +65,7 @@ extern const HalVideoDriver _sdl_video_driver;
#if defined(UNIX) #if defined(UNIX)
extern const HalMusicDriver _extmidi_music_driver; extern const HalMusicDriver _extmidi_music_driver;
#endif #endif
#if defined(__BEOS__) #if defined(__BEOS__)
extern const HalMusicDriver _bemidi_music_driver; extern const HalMusicDriver _bemidi_music_driver;

View File

@ -42,7 +42,7 @@ static void BuildIndustryWndProc(Window *w, WindowEvent *e)
if (DoCommandP(e->place.tile, _build_industry_types[_opt.landscape][WP(w,def_d).data_1], 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY))) if (DoCommandP(e->place.tile, _build_industry_types[_opt.landscape][WP(w,def_d).data_1], 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY)))
ResetObjectToPlace(); ResetObjectToPlace();
break; break;
case WE_ABORT_PLACE_OBJ: case WE_ABORT_PLACE_OBJ:
w->click_state = 0; w->click_state = 0;
SetWindowDirty(w); SetWindowDirty(w);
@ -259,7 +259,7 @@ static const WindowDesc * const _industry_window_desc[2][4] = {
}; };
void ShowBuildIndustryWindow() void ShowBuildIndustryWindow()
{ {
AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt.landscape],0); AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt.landscape],0);
} }
@ -291,20 +291,20 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e)
} }
DrawString(2, 107, str, 0); DrawString(2, 107, str, 0);
} }
if (i->produced_cargo[0] != 0xFF) { if (i->produced_cargo[0] != 0xFF) {
DrawString(2, 117, STR_482A_PRODUCTION_LAST_MONTH, 0); DrawString(2, 117, STR_482A_PRODUCTION_LAST_MONTH, 0);
SET_DPARAM16(1, i->total_production[0]); SET_DPARAM16(1, i->total_production[0]);
SET_DPARAM16(0, _cargoc.names_long_s[i->produced_cargo[0]] + ((i->total_production[0]!=1)<<5)); SET_DPARAM16(0, _cargoc.names_long_s[i->produced_cargo[0]] + ((i->total_production[0]!=1)<<5));
SET_DPARAM16(2, i->pct_transported[0] * 100 >> 8); SET_DPARAM16(2, i->pct_transported[0] * 100 >> 8);
DrawString(4, 127, STR_482B_TRANSPORTED, 0); DrawString(4, 127, STR_482B_TRANSPORTED, 0);
if (i->produced_cargo[1] != 0xFF) { if (i->produced_cargo[1] != 0xFF) {
SET_DPARAM16(1, i->total_production[1]); SET_DPARAM16(1, i->total_production[1]);
SET_DPARAM16(0, _cargoc.names_long_s[i->produced_cargo[1]] + ((i->total_production[1]!=1)<<5)); SET_DPARAM16(0, _cargoc.names_long_s[i->produced_cargo[1]] + ((i->total_production[1]!=1)<<5));
SET_DPARAM16(2, i->pct_transported[1] * 100 >> 8); SET_DPARAM16(2, i->pct_transported[1] * 100 >> 8);
DrawString(4, 137, STR_482B_TRANSPORTED, 0); DrawString(4, 137, STR_482B_TRANSPORTED, 0);
} }
} }
@ -323,7 +323,7 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e)
/* passing only i->xy is not safe if industry has a weird shape like: /* passing only i->xy is not safe if industry has a weird shape like:
_ X X _ X X
X X X X X X
_ <--- grass, no industry, but i->xy points there (first top-left tile)!, _ <--- grass, no industry, but i->xy points there (first top-left tile)!,
so passing i->xy to destroy industry will fail in called procedure so passing i->xy to destroy industry will fail in called procedure
*/ */
//DoCommandP(i->xy, w->window_number, 0, CcPlaySound10, CMD_DESTROY_INDUSTRY | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA)); //DoCommandP(i->xy, w->window_number, 0, CcPlaySound10, CMD_DESTROY_INDUSTRY | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
@ -399,7 +399,7 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
switch (_industry_sort_order >> 1) { switch (_industry_sort_order >> 1) {
/* case 0: Sort by Name (handled later) */ /* case 0: Sort by Name (handled later) */
case 1: /* Sort by Type */ case 1: /* Sort by Type */
r = i->type - j->type; r = i->type - j->type;
break; break;
// FIXME - Production & Transported sort need to be inversed...but, WTF it does not wanna! // FIXME - Production & Transported sort need to be inversed...but, WTF it does not wanna!
// FIXME - And no simple --> "if (!(_industry_sort_order & 1)) r = -r;" hack at the bottom!! // FIXME - And no simple --> "if (!(_industry_sort_order & 1)) r = -r;" hack at the bottom!!
@ -407,7 +407,7 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
if (i->produced_cargo[0] != 0xFF && j->produced_cargo[0] != 0xFF) { // both industries produce cargo? if (i->produced_cargo[0] != 0xFF && j->produced_cargo[0] != 0xFF) { // both industries produce cargo?
if (i->produced_cargo[1] == 0xFF) // producing one or two things? if (i->produced_cargo[1] == 0xFF) // producing one or two things?
r = j->total_production[0] - i->total_production[0]; r = j->total_production[0] - i->total_production[0];
else else
r = (j->total_production[0] + j->total_production[1]) / 2 - (i->total_production[0] + i->total_production[1]) / 2; r = (j->total_production[0] + j->total_production[1]) / 2 - (i->total_production[0] + i->total_production[1]) / 2;
} else if (i->produced_cargo[0] == 0xFF && j->produced_cargo[0] == 0xFF) // none of them producing anything, let them go to the name-sorting } else if (i->produced_cargo[0] == 0xFF && j->produced_cargo[0] == 0xFF) // none of them producing anything, let them go to the name-sorting
r = 0; r = 0;
@ -421,7 +421,7 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
if (i->produced_cargo[0] != 0xFF && j->produced_cargo[0] != 0xFF) { // both industries produce cargo? if (i->produced_cargo[0] != 0xFF && j->produced_cargo[0] != 0xFF) { // both industries produce cargo?
if (i->produced_cargo[1] == 0xFF) // producing one or two things? if (i->produced_cargo[1] == 0xFF) // producing one or two things?
r = (j->pct_transported[0] * 100 >> 8) - (i->pct_transported[0] * 100 >> 8); r = (j->pct_transported[0] * 100 >> 8) - (i->pct_transported[0] * 100 >> 8);
else else
r = ((j->pct_transported[0] * 100 >> 8) + (j->pct_transported[1] * 100 >> 8)) / 2 - ((i->pct_transported[0] * 100 >> 8) + (i->pct_transported[1] * 100 >> 8)) / 2; r = ((j->pct_transported[0] * 100 >> 8) + (j->pct_transported[1] * 100 >> 8)) / 2 - ((i->pct_transported[0] * 100 >> 8) + (i->pct_transported[1] * 100 >> 8)) / 2;
} else if (i->produced_cargo[0] == 0xFF && j->produced_cargo[0] == 0xFF) // none of them producing anything, let them go to the name-sorting } else if (i->produced_cargo[0] == 0xFF && j->produced_cargo[0] == 0xFF) // none of them producing anything, let them go to the name-sorting
r = 0; r = 0;
@ -444,8 +444,8 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
} }
r = strcmp(buf1, _bufcache); r = strcmp(buf1, _bufcache);
} }
if (_industry_sort_order & 1) r = -r; if (_industry_sort_order & 1) r = -r;
return r; return r;
} }
@ -496,7 +496,7 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
if (i->produced_cargo[0] != 0xFF) { if (i->produced_cargo[0] != 0xFF) {
SET_DPARAM16(3, i->total_production[0] * 100 >> 8); SET_DPARAM16(3, i->total_production[0] * 100 >> 8);
SET_DPARAM16(2, _cargoc.names_long_s[i->produced_cargo[0]] + ((i->total_production[0]!=1)<<5)); SET_DPARAM16(2, _cargoc.names_long_s[i->produced_cargo[0]] + ((i->total_production[0]!=1)<<5));
if (i->produced_cargo[1] != 0xFF) { if (i->produced_cargo[1] != 0xFF) {
SET_DPARAM16(5, i->total_production[1] * 100 >> 8); SET_DPARAM16(5, i->total_production[1] * 100 >> 8);
SET_DPARAM16(4, _cargoc.names_long_s[i->produced_cargo[1]] + ((i->total_production[1]!=1)<<5)); SET_DPARAM16(4, _cargoc.names_long_s[i->produced_cargo[1]] + ((i->total_production[1]!=1)<<5));
@ -541,7 +541,7 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
_industry_sort_dirty = true; _industry_sort_dirty = true;
SetWindowDirty(w); SetWindowDirty(w);
} break; } break;
case 7: { case 7: {
int y = (e->click.pt.y - 28) / 10; int y = (e->click.pt.y - 28) / 10;
byte p; byte p;
@ -561,7 +561,7 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
case WE_4: case WE_4:
SetWindowDirty(w); SetWindowDirty(w);
break; break;
} }
} }

View File

@ -54,7 +54,7 @@ static void SelectGameWndProc(Window *w, WindowEvent *e) {
case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break; case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
case 4: ShowPatchesSelection(); break; case 4: ShowPatchesSelection(); break;
case 5: DoCommandP(0, InteractiveRandom(), 0, NULL, CMD_CREATE_SCENARIO); break; case 5: DoCommandP(0, InteractiveRandom(), 0, NULL, CMD_CREATE_SCENARIO); break;
case 6: case 6:
if (_networking) if (_networking)
DoCommandP(0, 0, 0, NULL, CMD_SET_SINGLE_PLAYER); DoCommandP(0, 0, 0, NULL, CMD_SET_SINGLE_PLAYER);
break; break;
@ -113,7 +113,7 @@ int32 CmdStartNewGame(int x, int y, uint32 flags, uint32 p1, uint32 p2)
DeleteWindowById(WC_SAVELOAD, 0); DeleteWindowById(WC_SAVELOAD, 0);
break; break;
} }
return 0; return 0;
} }
@ -216,7 +216,7 @@ static void AskAbandonGameWndProc(Window *w, WindowEvent *e) {
case WE_KEYPRESS: /* Exit game on pressing 'Enter' */ case WE_KEYPRESS: /* Exit game on pressing 'Enter' */
if (e->keypress.keycode == WKC_RETURN) if (e->keypress.keycode == WKC_RETURN)
_exit_game = true; _exit_game = true;
break; break;
} }
} }
@ -247,9 +247,9 @@ static void AskQuitGameWndProc(Window *w, WindowEvent *e) {
switch(e->event) { switch(e->event) {
case WE_PAINT: case WE_PAINT:
DrawWindowWidgets(w); DrawWindowWidgets(w);
DrawStringMultiCenter(0x5A, 0x26, DrawStringMultiCenter(0x5A, 0x26,
_game_mode != GM_EDITOR ? STR_0160_ARE_YOU_SURE_YOU_WANT_TO : _game_mode != GM_EDITOR ? STR_0160_ARE_YOU_SURE_YOU_WANT_TO :
STR_029B_ARE_YOU_SURE_YOU_WANT_TO, STR_029B_ARE_YOU_SURE_YOU_WANT_TO,
178); 178);
return; return;

View File

@ -3,7 +3,7 @@
#define MAX_INT 0x7FFFFFFF #define MAX_INT 0x7FFFFFFF
#ifdef min #ifdef min
#undef min #undef min
#endif #endif
@ -35,7 +35,7 @@ static INLINE bool str_eq(const byte *a, const byte *b)
} }
// Will crash if strings are equal // Will crash if strings are equal
static INLINE bool str_is_below(byte *a, byte *b) { static INLINE bool str_is_below(byte *a, byte *b) {
while (*a <= *b) { while (*a <= *b) {
if (*a < *b) return true; if (*a < *b) return true;
a++; a++;
@ -152,7 +152,7 @@ static INLINE int FindFirstBit2x64(int value)
#if TILE_X_BITS + TILE_Y_BITS <= 16 #if TILE_X_BITS + TILE_Y_BITS <= 16
typedef uint16 TileIndex; typedef uint16 TileIndex;
typedef int16 TileIndexDiff; typedef int16 TileIndexDiff;
#else #else
typedef uint32 TileIndex; typedef uint32 TileIndex;
@ -210,7 +210,7 @@ static INLINE void swap_tile(TileIndex *a, TileIndex *b) { TileIndex t = *a; *a
static INLINE uint16 READ_LE_UINT16(const void *b) { static INLINE uint16 READ_LE_UINT16(const void *b) {
return ((byte*)b)[0] + (((byte*)b)[1] << 8); return ((byte*)b)[0] + (((byte*)b)[1] << 8);
} }
# define ADD_WORD(x) ((x) >> 8)&0xFF, (x)&0xFF # define ADD_WORD(x) ((x) >> 8)&0xFF, (x)&0xFF
# define ADD_DWORD(x) ((x) >> 24)&0xFF, ((x) >> 16)&0xFF, ((x) >> 8)&0xFF, (x)&0xFF # define ADD_DWORD(x) ((x) >> 24)&0xFF, ((x) >> 16)&0xFF, ((x) >> 8)&0xFF, (x)&0xFF
#endif #endif

View File

@ -36,7 +36,7 @@ static void HandleOnEditText(WindowEvent *e) {
memcpy(_decode_parameters, b, 32); memcpy(_decode_parameters, b, 32);
id = _rename_id; id = _rename_id;
switch(_rename_what) { switch(_rename_what) {
case 0: case 0:
// for empty string send "remove sign" parameter // for empty string send "remove sign" parameter
@ -188,7 +188,7 @@ void MenuClickCompany(int index)
{ {
ShowPlayerCompany(index); ShowPlayerCompany(index);
} }
void MenuClickGraphs(int index) void MenuClickGraphs(int index)
{ {
@ -403,11 +403,11 @@ static void MenuWndProc(Window *w, WindowEvent *e)
SetWindowDirty(v); SetWindowDirty(v);
return; return;
} }
case WE_POPUPMENU_SELECT: { case WE_POPUPMENU_SELECT: {
int index = GetMenuItemIndex(w, e->popupmenu.pt.x, e->popupmenu.pt.y); int index = GetMenuItemIndex(w, e->popupmenu.pt.x, e->popupmenu.pt.y);
int action_id; int action_id;
if (index < 0) { if (index < 0) {
Window *w2 = FindWindowById(WC_MAIN_TOOLBAR,0); Window *w2 = FindWindowById(WC_MAIN_TOOLBAR,0);
@ -417,10 +417,10 @@ static void MenuWndProc(Window *w, WindowEvent *e)
action_id = WP(w,menu_d).action_id; action_id = WP(w,menu_d).action_id;
DeleteWindow(w); DeleteWindow(w);
if (index >= 0) if (index >= 0)
_menu_clicked_procs[action_id](index); _menu_clicked_procs[action_id](index);
break; break;
} }
case WE_POPUPMENU_OVER: { case WE_POPUPMENU_OVER: {
@ -458,7 +458,7 @@ static int GetPlayerIndexFromMenu(int index)
if (--index < 0) if (--index < 0)
return p->index; return p->index;
} }
} }
} }
return -1; return -1;
} }
@ -472,7 +472,7 @@ static void UpdatePlayerMenuHeight(Window *w)
if (p->is_active) if (p->is_active)
num++; num++;
} }
if (WP(w,menu_d).item_count != num) { if (WP(w,menu_d).item_count != num) {
WP(w,menu_d).item_count = num; WP(w,menu_d).item_count = num;
SetWindowDirty(w); SetWindowDirty(w);
@ -499,25 +499,25 @@ static void PlayerMenuWndProc(Window *w, WindowEvent *e)
y = 1; y = 1;
sel = WP(w,menu_d).sel_index; sel = WP(w,menu_d).sel_index;
chk = WP(w,menu_d).checked_items; // let this mean gray items. chk = WP(w,menu_d).checked_items; // let this mean gray items.
FOR_ALL_PLAYERS(p) { FOR_ALL_PLAYERS(p) {
if (p->is_active) { if (p->is_active) {
if (p->index == sel) { if (p->index == sel) {
GfxFillRect(x, y, x + 0xEE, y + 9, 0); GfxFillRect(x, y, x + 0xEE, y + 9, 0);
} }
DrawSprite( ((p->player_color + 0x307)<<16)+0x82EB, x+2, y+1); DrawSprite( ((p->player_color + 0x307)<<16)+0x82EB, x+2, y+1);
SET_DPARAM16(0, p->name_1); SET_DPARAM16(0, p->name_1);
SET_DPARAM32(1, p->name_2); SET_DPARAM32(1, p->name_2);
SET_DPARAM16(2, GetPlayerNameString(p->index, 3)); SET_DPARAM16(2, GetPlayerNameString(p->index, 3));
color = (byte)((p->index==sel) ? 0xC : 0x10); color = (byte)((p->index==sel) ? 0xC : 0x10);
if (chk&1) color = 14; if (chk&1) color = 14;
DrawString(x+0x13, y, STR_7021, color); DrawString(x+0x13, y, STR_7021, color);
y += 10; y += 10;
} }
chk >>= 1; chk >>= 1;
} }
break; break;
} }
@ -528,7 +528,7 @@ static void PlayerMenuWndProc(Window *w, WindowEvent *e)
SetWindowDirty(v); SetWindowDirty(v);
return; return;
} }
case WE_POPUPMENU_SELECT: { case WE_POPUPMENU_SELECT: {
int index = GetPlayerIndexFromMenu(GetMenuItemIndex(w, e->popupmenu.pt.x, e->popupmenu.pt.y)); int index = GetPlayerIndexFromMenu(GetMenuItemIndex(w, e->popupmenu.pt.x, e->popupmenu.pt.y));
int action_id = WP(w,menu_d).action_id; int action_id = WP(w,menu_d).action_id;
@ -540,7 +540,7 @@ static void PlayerMenuWndProc(Window *w, WindowEvent *e)
} }
DeleteWindow(w); DeleteWindow(w);
if (index >= 0) { if (index >= 0) {
assert(index >= 0 && index < 30); assert(index >= 0 && index < 30);
_menu_clicked_procs[action_id](index); _menu_clicked_procs[action_id](index);
@ -576,7 +576,7 @@ static Window *PopupMainToolbMenu(Window *w, int x, int main_button, StringID ba
_menu_widgets[0].bottom = h = item_count * 10 + 1; _menu_widgets[0].bottom = h = item_count * 10 + 1;
w = AllocateWindow(x, 0x16, 0xA0, h+1, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets); w = AllocateWindow(x, 0x16, 0xA0, h+1, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
w->flags4 &= ~WF_WHITE_BORDER_MASK; w->flags4 &= ~WF_WHITE_BORDER_MASK;
WP(w,menu_d).item_count = item_count; WP(w,menu_d).item_count = item_count;
WP(w,menu_d).sel_index = 0; WP(w,menu_d).sel_index = 0;
WP(w,menu_d).main_button = main_button; WP(w,menu_d).main_button = main_button;
@ -585,7 +585,7 @@ static Window *PopupMainToolbMenu(Window *w, int x, int main_button, StringID ba
WP(w,menu_d).checked_items = 0; WP(w,menu_d).checked_items = 0;
_popup_menu_active = true; _popup_menu_active = true;
SndPlayFx(0x13); SndPlayFx(0x13);
return w; return w;
@ -594,7 +594,7 @@ static Window *PopupMainToolbMenu(Window *w, int x, int main_button, StringID ba
static Window *PopupMainPlayerToolbMenu(Window *w, int x, int main_button, int gray) static Window *PopupMainPlayerToolbMenu(Window *w, int x, int main_button, int gray)
{ {
x += w->left; x += w->left;
SETBIT(w->click_state, main_button); SETBIT(w->click_state, main_button);
InvalidateWidget(w, main_button); InvalidateWidget(w, main_button);
@ -703,7 +703,7 @@ bool DoZoomInOutWindow(int how, Window *w)
{ {
ViewPort *vp; ViewPort *vp;
int button; int button;
switch(_game_mode) { switch(_game_mode) {
case GM_EDITOR: button = 9; break; case GM_EDITOR: button = 9; break;
case GM_NORMAL: button = 17; break; case GM_NORMAL: button = 17; break;
@ -758,7 +758,7 @@ bool DoZoomInOutWindow(int how, Window *w)
else if (vp->zoom == 2) SETBIT(wt->disabled_state, button + 1); else if (vp->zoom == 2) SETBIT(wt->disabled_state, button + 1);
SetWindowDirty(wt); SetWindowDirty(wt);
} }
return true; return true;
} }
@ -855,7 +855,7 @@ static void ToolbarScenDateBackward(Window *w)
if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) { if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
HandleButtonClick(w, 6); HandleButtonClick(w, 6);
InvalidateWidget(w, 5); InvalidateWidget(w, 5);
if (_date > 0x2ACE) { if (_date > 0x2ACE) {
SetDate(ConvertYMDToDay(_cur_year - 1, 0, 1)); SetDate(ConvertYMDToDay(_cur_year - 1, 0, 1));
} }
@ -898,7 +898,7 @@ static void ToolbarScenZoomOut(Window *w)
} }
} }
void ZoomInOrOutToCursorWindow(bool in, Window *w) void ZoomInOrOutToCursorWindow(bool in, Window *w)
{ {
ViewPort * vp; ViewPort * vp;
Point pt; Point pt;
@ -924,10 +924,10 @@ void ResetLandscape()
{ {
_random_seed_1 = InteractiveRandom(); _random_seed_1 = InteractiveRandom();
_random_seed_2 = InteractiveRandom(); _random_seed_2 = InteractiveRandom();
GenerateWorld(1); GenerateWorld(1);
MarkWholeScreenDirty(); MarkWholeScreenDirty();
} }
static const Widget _ask_reset_landscape_widgets[] = { static const Widget _ask_reset_landscape_widgets[] = {
{ WWT_TEXTBTN, 4, 0, 10, 0, 13, STR_00C5, STR_NULL}, { WWT_TEXTBTN, 4, 0, 10, 0, 13, STR_00C5, STR_NULL},
@ -961,7 +961,7 @@ static void AskResetLandscapeWndProc(Window *w, WindowEvent *e)
SndPlayFx(0x13); SndPlayFx(0x13);
_switch_mode = SM_GENRANDLAND; _switch_mode = SM_GENRANDLAND;
} }
break; break;
} }
} }
@ -1131,7 +1131,7 @@ static void ScenEditLandGenWndProc(Window *w, WindowEvent *e)
case WE_PAINT: case WE_PAINT:
// XXX: only show reset button when nothing was built // XXX: only show reset button when nothing was built
DrawWindowWidgets(w); DrawWindowWidgets(w);
{ {
int n = _terraform_size * _terraform_size; int n = _terraform_size * _terraform_size;
const int8 *coords = &_multi_terraform_coords[0][0]; const int8 *coords = &_multi_terraform_coords[0][0];
@ -1190,7 +1190,7 @@ terraform_size_common:;
case 10: /* place rocky areas */ case 10: /* place rocky areas */
HandlePlacePushButton(w, 10, 0xFF7, 1, PlaceProc_RockyArea); HandlePlacePushButton(w, 10, 0xFF7, 1, PlaceProc_RockyArea);
break; break;
case 11: /* place lighthouse */ case 11: /* place lighthouse */
HandlePlacePushButton(w, 11, 0xFF8, 1, _opt.landscape == LT_DESERT ? PlaceProc_Desert : PlaceProc_LightHouse); HandlePlacePushButton(w, 11, 0xFF8, 1, _opt.landscape == LT_DESERT ? PlaceProc_Desert : PlaceProc_LightHouse);
break; break;
@ -1493,7 +1493,7 @@ static void ScenEditIndustryWndProc(Window *w, WindowEvent *e)
break; break;
case WE_CLICK: case WE_CLICK:
if ((button=e->click.widget) == 3) { if ((button=e->click.widget) == 3) {
HandleButtonClick(w, 3); HandleButtonClick(w, 3);
if (!AnyTownExists()) { if (!AnyTownExists()) {
@ -1505,7 +1505,7 @@ static void ScenEditIndustryWndProc(Window *w, WindowEvent *e)
GenerateIndustries(); GenerateIndustries();
_generating_world = false; _generating_world = false;
} }
if ((button=e->click.widget) >= 4) { if ((button=e->click.widget) >= 4) {
if (HandlePlacePushButton(w, button, 0xFF1, 1, NULL)) if (HandlePlacePushButton(w, button, 0xFF1, 1, NULL))
_industry_type_to_place = _industry_type_list[_opt.landscape][button - 4]; _industry_type_to_place = _industry_type_list[_opt.landscape][button - 4];
@ -1705,7 +1705,7 @@ static void MainToolbarWndProc(Window *w, WindowEvent *e)
case WKC_CTRL | WKC_ALT | 'C': if(!_networking) ShowCheatWindow(); break; case WKC_CTRL | WKC_ALT | 'C': if(!_networking) ShowCheatWindow(); break;
} }
} break; } break;
case WE_PLACE_OBJ: { case WE_PLACE_OBJ: {
_place_proc(e->place.tile); _place_proc(e->place.tile);
} break; } break;
@ -1718,12 +1718,12 @@ static void MainToolbarWndProc(Window *w, WindowEvent *e)
case WE_ON_EDIT_TEXT: HandleOnEditText(e); break; case WE_ON_EDIT_TEXT: HandleOnEditText(e); break;
case WE_MOUSELOOP: case WE_MOUSELOOP:
if (((w->click_state) & 1) != (uint)!!_pause) { if (((w->click_state) & 1) != (uint)!!_pause) {
w->click_state ^= (1 << 0); w->click_state ^= (1 << 0);
SetWindowDirty(w); SetWindowDirty(w);
} }
if (((w->click_state >> 1) & 1) != (uint)!!_fast_forward) { if (((w->click_state >> 1) & 1) != (uint)!!_fast_forward) {
w->click_state ^= (1 << 1); w->click_state ^= (1 << 1);
SetWindowDirty(w); SetWindowDirty(w);
@ -1900,7 +1900,7 @@ static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
} }
break; break;
} }
case WE_PLACE_OBJ: { case WE_PLACE_OBJ: {
_place_proc(e->place.tile); _place_proc(e->place.tile);
} break; } break;
@ -1950,7 +1950,7 @@ static bool DrawScrollingStatusText(NewsItem *ni, int pos)
str = _get_news_string_callback[ni->callback](ni); str = _get_news_string_callback[ni->callback](ni);
} else { } else {
COPY_IN_DPARAM(0, ni->params, lengthof(ni->params)); COPY_IN_DPARAM(0, ni->params, lengthof(ni->params));
str = ni->string_id; str = ni->string_id;
} }
GetString(str_buffr, str); GetString(str_buffr, str);
@ -1992,7 +1992,7 @@ void StatusBarWndProc(Window *w, WindowEvent *e)
DrawWindowWidgets(w); DrawWindowWidgets(w);
SET_DPARAM16(0, _date); SET_DPARAM16(0, _date);
DrawStringCentered(70, 1, ((_pause||_patches.status_long_date)?STR_00AF:STR_00AE), 0); DrawStringCentered(70, 1, ((_pause||_patches.status_long_date)?STR_00AF:STR_00AE), 0);
p = _local_player == OWNER_SPECTATOR ? NULL : DEREF_PLAYER(_local_player); p = _local_player == OWNER_SPECTATOR ? NULL : DEREF_PLAYER(_local_player);
if (p) { if (p) {
@ -2092,7 +2092,7 @@ static void MainWindowWndProc(Window *w, WindowEvent *e) {
DrawSprite(0x12EA, off_x+275,50); // o DrawSprite(0x12EA, off_x+275,50); // o
DrawSprite(0x12E5, off_x+307,50); // r DrawSprite(0x12E5, off_x+307,50); // r
DrawSprite(0x12E4, off_x+337,50); // t DrawSprite(0x12E4, off_x+337,50); // t
DrawSprite(0x12E4, off_x+390,50); // t DrawSprite(0x12E4, off_x+390,50); // t
DrawSprite(0x12EB, off_x+417,50); // y DrawSprite(0x12EB, off_x+417,50); // y
DrawSprite(0x12EC, off_x+447,50); // c DrawSprite(0x12EC, off_x+447,50); // c
@ -2146,7 +2146,7 @@ static void MainWindowWndProc(Window *w, WindowEvent *e) {
} }
break; break;
} }
case WKC_ESC: ResetObjectToPlace(); break; case WKC_ESC: ResetObjectToPlace(); break;
case WKC_DELETE: DeleteNonVitalWindows(); break; case WKC_DELETE: DeleteNonVitalWindows(); break;
case 'Q' | WKC_CTRL: AskExitGame(); break; case 'Q' | WKC_CTRL: AskExitGame(); break;
@ -2185,7 +2185,7 @@ static void MainWindowWndProc(Window *w, WindowEvent *e) {
} }
e->keypress.cont = false; e->keypress.cont = false;
break; break;
} }
} }
@ -2224,7 +2224,7 @@ void SetupColorsAndInitialWindow()
w = AllocateWindowDesc(&_toolb_normal_desc); w = AllocateWindowDesc(&_toolb_normal_desc);
w->disabled_state = 1 << 17; w->disabled_state = 1 << 17;
w->flags4 &= ~WF_WHITE_BORDER_MASK; w->flags4 &= ~WF_WHITE_BORDER_MASK;
PositionMainToolbar(w); // already WC_MAIN_TOOLBAR passed (&_toolb_normal_desc) PositionMainToolbar(w); // already WC_MAIN_TOOLBAR passed (&_toolb_normal_desc)
_main_status_desc.top = height - 12; _main_status_desc.top = height - 12;
@ -2241,7 +2241,7 @@ void SetupColorsAndInitialWindow()
w = AllocateWindowDesc(&_toolb_scen_desc); w = AllocateWindowDesc(&_toolb_scen_desc);
w->disabled_state = 1 << 9; w->disabled_state = 1 << 9;
w->flags4 &= ~WF_WHITE_BORDER_MASK; w->flags4 &= ~WF_WHITE_BORDER_MASK;
PositionMainToolbar(w); // already WC_MAIN_TOOLBAR passed (&_toolb_scen_desc) PositionMainToolbar(w); // already WC_MAIN_TOOLBAR passed (&_toolb_scen_desc)
break; break;
default: default:

View File

@ -39,7 +39,7 @@ int32 CmdSetPlayerColor(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (pp->is_active && pp != p && pp->player_color == (byte)p2) if (pp->is_active && pp != p && pp->player_color == (byte)p2)
return CMD_ERROR; return CMD_ERROR;
} }
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
_player_colors[p1] = (byte)p2; _player_colors[p1] = (byte)p2;
p->player_color = (byte)p2; p->player_color = (byte)p2;
@ -126,7 +126,7 @@ int32 CmdChangeCompanyName(int x, int y, uint32 flags, uint32 p1, uint32 p2)
str = AllocateName((byte*)_decode_parameters, 4); str = AllocateName((byte*)_decode_parameters, 4);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
p = DEREF_PLAYER(p1); p = DEREF_PLAYER(p1);
old_str = p->name_1; old_str = p->name_1;
@ -148,7 +148,7 @@ int32 CmdChangePresidentName(int x, int y, uint32 flags, uint32 p1, uint32 p2)
str = AllocateName((byte*)_decode_parameters, 4); str = AllocateName((byte*)_decode_parameters, 4);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
p = DEREF_PLAYER(p1); p = DEREF_PLAYER(p1);
old_str = p->president_name_1; old_str = p->president_name_1;
@ -161,13 +161,13 @@ int32 CmdChangePresidentName(int x, int y, uint32 flags, uint32 p1, uint32 p2)
d--; do d++; while (*d); d--; do d++; while (*d);
do *d++ = b = *s++; while(d != (byte*)endof(_decode_parameters) && b != 0); do *d++ = b = *s++; while(d != (byte*)endof(_decode_parameters) && b != 0);
DoCommandByTile(0, p1, 0, DC_EXEC, CMD_CHANGE_COMPANY_NAME); DoCommandByTile(0, p1, 0, DC_EXEC, CMD_CHANGE_COMPANY_NAME);
} }
MarkWholeScreenDirty(); MarkWholeScreenDirty();
} else { } else {
DeleteName(str); DeleteName(str);
} }
return 0; return 0;
} }
static void UpdateSignVirtCoords(SignStruct *ss) static void UpdateSignVirtCoords(SignStruct *ss)
@ -200,7 +200,7 @@ static void MarkSignDirty(SignStruct *ss)
int32 CmdPlaceSign(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdPlaceSign(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
SignStruct *ss; SignStruct *ss;
for(ss=_sign_list; ss != endof(_sign_list); ss++) { for(ss=_sign_list; ss != endof(_sign_list); ss++) {
if (ss->str == 0) { if (ss->str == 0) {
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
@ -213,7 +213,7 @@ int32 CmdPlaceSign(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_new_sign_struct = ss; _new_sign_struct = ss;
} }
return 0; return 0;
} }
} }
return_cmd_error(STR_2808_TOO_MANY_SIGNS); return_cmd_error(STR_2808_TOO_MANY_SIGNS);
@ -275,7 +275,7 @@ int32 CmdResume(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 CmdMoneyCheat(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdMoneyCheat(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
return (int32)p1; return (int32)p1;
} }
@ -290,7 +290,7 @@ int32 CmdChangeDifficultyLevel(int x, int y, uint32 flags, uint32 p1, uint32 p2)
} }
InvalidateWindow(WC_GAME_OPTIONS, 0); InvalidateWindow(WC_GAME_OPTIONS, 0);
} }
return 0; return 0;
} }
static const byte _sign_desc[] = { static const byte _sign_desc[] = {

View File

@ -45,7 +45,7 @@ static void LandInfoWndProc(Window *w, WindowEvent *e)
str = STR_01A4_COST_TO_CLEAR_N_A; str = STR_01A4_COST_TO_CLEAR_N_A;
if (lid->costclear != CMD_ERROR) { if (lid->costclear != CMD_ERROR) {
SET_DPARAM32(0, lid->costclear); SET_DPARAM32(0, lid->costclear);
str = STR_01A5_COST_TO_CLEAR; str = STR_01A5_COST_TO_CLEAR;
} }
DrawStringCentered(140, 38, str, 0); DrawStringCentered(140, 38, str, 0);
@ -102,7 +102,7 @@ static void LandInfoWndProc(Window *w, WindowEvent *e)
if (str != (STR_01CE_CARGO_ACCEPTED - 1)) if (str != (STR_01CE_CARGO_ACCEPTED - 1))
DrawStringMultiCenter(140, 76, str, 276); DrawStringMultiCenter(140, 76, str, 276);
if (lid->td.build_date != 0) { if (lid->td.build_date != 0) {
SET_DPARAM16(0,lid->td.build_date); SET_DPARAM16(0,lid->td.build_date);
DrawStringCentered(140,71, STR_BUILD_DATE, 0); DrawStringCentered(140,71, STR_BUILD_DATE, 0);
@ -136,7 +136,7 @@ static void Place_LandInfo(uint tile)
w = AllocateWindowDesc(&_land_info_desc); w = AllocateWindowDesc(&_land_info_desc);
WP(w,void_d).data = &lid; WP(w,void_d).data = &lid;
lid.tile = tile; lid.tile = tile;
lid.town = ClosestTownFromTile(tile, _patches.dist_local_authority); lid.town = ClosestTownFromTile(tile, _patches.dist_local_authority);
@ -150,13 +150,13 @@ static void Place_LandInfo(uint tile)
lid.costclear = DoCommandByTile(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR); lid.costclear = DoCommandByTile(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR);
p->money64 = old_money; p->money64 = old_money;
UpdatePlayerMoney32(p); UpdatePlayerMoney32(p);
// Becuase build_date is not set yet in every TileDesc, we make sure it is empty // Becuase build_date is not set yet in every TileDesc, we make sure it is empty
lid.td.build_date = 0; lid.td.build_date = 0;
GetAcceptedCargo(tile, &lid.ac); GetAcceptedCargo(tile, &lid.ac);
GetTileDesc(tile, &lid.td); GetTileDesc(tile, &lid.td);
#if defined(_DEBUG) #if defined(_DEBUG)
DEBUG(misc, 0) ("TILE: %#x (%i,%i)", tile, GET_TILE_X(tile), GET_TILE_Y(tile)); DEBUG(misc, 0) ("TILE: %#x (%i,%i)", tile, GET_TILE_X(tile), GET_TILE_Y(tile));
DEBUG(misc, 0) ("TILE: %d ", tile); DEBUG(misc, 0) ("TILE: %d ", tile);
@ -273,7 +273,7 @@ static void BuildTreesWndProc(Window *w, WindowEvent *e)
case 11:case 12: case 13: case 14: case 11:case 12: case 13: case 14:
if ( (uint)(wid-3) >= (uint)WP(w,tree_d).count) if ( (uint)(wid-3) >= (uint)WP(w,tree_d).count)
return; return;
if (HandlePlacePushButton(w, wid, 0x7DA, 1, NULL)) if (HandlePlacePushButton(w, wid, 0x7DA, 1, NULL))
_tree_to_plant = WP(w,tree_d).base + wid - 3; _tree_to_plant = WP(w,tree_d).base + wid - 3;
break; break;
@ -292,7 +292,7 @@ static void BuildTreesWndProc(Window *w, WindowEvent *e)
break; break;
} }
} break; } break;
case WE_PLACE_OBJ: case WE_PLACE_OBJ:
VpStartPlaceSizing(e->place.tile, VPM_X_AND_Y_LIMITED); VpStartPlaceSizing(e->place.tile, VPM_X_AND_Y_LIMITED);
VpSetPlaceSizingLimit(20); VpSetPlaceSizingLimit(20);
@ -304,7 +304,7 @@ static void BuildTreesWndProc(Window *w, WindowEvent *e)
case WE_PLACE_MOUSEUP: case WE_PLACE_MOUSEUP:
if (e->click.pt.x != -1) { if (e->click.pt.x != -1) {
DoCommandP(e->place.tile, _tree_to_plant, e->place.starttile, NULL, DoCommandP(e->place.tile, _tree_to_plant, e->place.starttile, NULL,
CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE)); CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
} }
break; break;
@ -377,7 +377,7 @@ static const WindowDesc _build_trees_scen_desc = {
BuildTreesWndProc BuildTreesWndProc
}; };
void ShowBuildTreesToolbar() void ShowBuildTreesToolbar()
{ {
DeleteWindowById(WC_BUILD_TOOLBAR, 0); DeleteWindowById(WC_BUILD_TOOLBAR, 0);
@ -418,7 +418,7 @@ static void ErrmsgWndProc(Window *w, WindowEvent *e)
if (w->widget != _errmsg_face_widgets) { if (w->widget != _errmsg_face_widgets) {
DrawStringMultiCenter( DrawStringMultiCenter(
120, 120,
(_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15), (_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
_errmsg_message_2, _errmsg_message_2,
238); 238);
if (_errmsg_message_1 != INVALID_STRING_ID) if (_errmsg_message_1 != INVALID_STRING_ID)
@ -433,7 +433,7 @@ static void ErrmsgWndProc(Window *w, WindowEvent *e)
DrawStringMultiCenter( DrawStringMultiCenter(
214, 214,
(_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45), (_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
_errmsg_message_2, _errmsg_message_2,
238); 238);
if (_errmsg_message_1 != INVALID_STRING_ID) if (_errmsg_message_1 != INVALID_STRING_ID)
@ -490,7 +490,7 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
_errmsg_duration = _patches.errmsg_duration; _errmsg_duration = _patches.errmsg_duration;
if (!_errmsg_duration) if (!_errmsg_duration)
return; return;
if (_errmsg_message_1 != STR_013B_OWNED_BY || GET_DPARAMX8(_errmsg_decode_params,2) >= 8) { if (_errmsg_message_1 != STR_013B_OWNED_BY || GET_DPARAMX8(_errmsg_decode_params,2) >= 8) {
if ( (x|y) != 0) { if ( (x|y) != 0) {
@ -501,11 +501,11 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
// move x pos to opposite corner // move x pos to opposite corner
pt.x = ((pt.x - vp->virtual_left) >> vp->zoom) + vp->left; pt.x = ((pt.x - vp->virtual_left) >> vp->zoom) + vp->left;
pt.x = (pt.x < (_screen.width >> 1)) ? _screen.width - 260 : 20; pt.x = (pt.x < (_screen.width >> 1)) ? _screen.width - 260 : 20;
// move y pos to opposite corner // move y pos to opposite corner
pt.y = ((pt.y - vp->virtual_top) >> vp->zoom) + vp->top; pt.y = ((pt.y - vp->virtual_top) >> vp->zoom) + vp->top;
pt.y = (pt.y < (_screen.height >> 1)) ? _screen.height - 80 : 100; pt.y = (pt.y < (_screen.height >> 1)) ? _screen.height - 80 : 100;
} else { } else {
pt.x = (_screen.width - 240) >> 1; pt.x = (_screen.width - 240) >> 1;
pt.y = (_screen.height - 46) >> 1; pt.y = (_screen.height - 46) >> 1;
@ -566,7 +566,7 @@ static void TooltipsWndProc(Window *w, WindowEvent *e)
switch(e->event) { switch(e->event) {
case WE_PAINT: { case WE_PAINT: {
GfxFillRect(0, 0, w->width - 1, w->height - 1, 0); GfxFillRect(0, 0, w->width - 1, w->height - 1, 0);
GfxFillRect(1, 1, w->width - 2, w->height - 2, 0x44); GfxFillRect(1, 1, w->width - 2, w->height - 2, 0x44);
DrawStringMultiCenter((w->width>>1), (w->height>>1)-5, WP(w,tooltips_d).string_id, 197); DrawStringMultiCenter((w->width>>1), (w->height>>1)-5, WP(w,tooltips_d).string_id, 197);
break; break;
@ -583,7 +583,7 @@ void GuiShowTooltips(StringID string_id)
Window *w; Window *w;
int right,bottom; int right,bottom;
int x,y; int x,y;
if (string_id == 0) if (string_id == 0)
return; return;
@ -628,7 +628,7 @@ static void DrawStationCoverageText(const uint *accepts, int str_x, int str_y, u
{ {
int i; int i;
byte *b; byte *b;
b = _userstring; b = _userstring;
b[0] = 0x81; b[0] = 0x81;
b[1] = STR_000D_ACCEPTS; b[1] = STR_000D_ACCEPTS;
@ -734,7 +734,7 @@ int HandleEditBoxKey(Window *w, int wid, WindowEvent *we)
count++; count++;
width += _stringwidth_table[*p - 32]; width += _stringwidth_table[*p - 32];
} while (1); } while (1);
if (we->keypress.keycode == WKC_BACKSPACE) { if (we->keypress.keycode == WKC_BACKSPACE) {
if (count != 0) { if (count != 0) {
WP(w,querystr_d).buf[count-1] = 0; WP(w,querystr_d).buf[count-1] = 0;
@ -1067,7 +1067,7 @@ static void SaveLoadDlgWndProc(Window *w, WindowEvent *e)
return; return;
file = _fios_list + y; file = _fios_list + y;
if ((name = FiosBrowseTo(file)) != NULL) { if ((name = FiosBrowseTo(file)) != NULL) {
if (_saveload_mode == SLD_LOAD_GAME) { if (_saveload_mode == SLD_LOAD_GAME) {
_switch_mode = SM_LOAD; _switch_mode = SM_LOAD;
@ -1120,7 +1120,7 @@ static void SaveLoadDlgWndProc(Window *w, WindowEvent *e)
_query_string_active = false; _query_string_active = false;
FiosFreeSavegameList(); FiosFreeSavegameList();
break; break;
} }
} }
static const WindowDesc _load_dialog_desc = { static const WindowDesc _load_dialog_desc = {
@ -1226,7 +1226,7 @@ static void SelectScenarioWndProc(Window *w, WindowEvent *e) {
_savegame_sort_dirty = false; _savegame_sort_dirty = false;
MakeSortedSaveGameList(); MakeSortedSaveGameList();
} }
SetVScrollCount(w, _fios_num); SetVScrollCount(w, _fios_num);
DrawWindowWidgets(w); DrawWindowWidgets(w);
@ -1272,7 +1272,7 @@ static void SelectScenarioWndProc(Window *w, WindowEvent *e) {
return; return;
file = _fios_list + y; file = _fios_list + y;
if ((name = FiosBrowseTo(file)) != NULL) { if ((name = FiosBrowseTo(file)) != NULL) {
SetFiosType(file->type); SetFiosType(file->type);
strcpy(_file_to_saveload.name, name); strcpy(_file_to_saveload.name, name);
@ -1410,7 +1410,7 @@ static int32 ReadCE(const CheatEntry*ce)
default: default:
NOT_REACHED(); NOT_REACHED();
} }
/* useless, but avoids compiler warning this way */ /* useless, but avoids compiler warning this way */
return 0; return 0;
} }
@ -1490,7 +1490,7 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
DrawFrameRect(x+30, y+1, x+30+9, y+9, 3, clk == i*2+2 ? 0x20 : 0); DrawFrameRect(x+30, y+1, x+30+9, y+9, 3, clk == i*2+2 ? 0x20 : 0);
DrawStringCentered(x+25, y+1, STR_6819, 0); DrawStringCentered(x+25, y+1, STR_6819, 0);
DrawStringCentered(x+35, y+1, STR_681A, 0); DrawStringCentered(x+35, y+1, STR_681A, 0);
val = ReadCE(ce); val = ReadCE(ce);
// set correct string for switch climate cheat // set correct string for switch climate cheat
@ -1502,7 +1502,7 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
// display date for change date cheat // display date for change date cheat
if(ce->str==STR_CHEAT_CHANGE_DATE) if(ce->str==STR_CHEAT_CHANGE_DATE)
SET_DPARAM16(0, _date); SET_DPARAM16(0, _date);
// draw colored flag for change player cheat // draw colored flag for change player cheat
if(ce->str==STR_CHEAT_CHANGE_PLAYER) if(ce->str==STR_CHEAT_CHANGE_PLAYER)
DrawPlayerIcon(_current_player, 156, y+2); DrawPlayerIcon(_current_player, 156, y+2);
@ -1579,7 +1579,7 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
WP(w,def_d).data_1 = 0; WP(w,def_d).data_1 = 0;
SetWindowDirty(w); SetWindowDirty(w);
break; break;
} }
} }
static const WindowDesc _cheats_desc = { static const WindowDesc _cheats_desc = {
240, 22, 400, 148, 240, 22, 400, 148,
@ -1593,7 +1593,7 @@ static const WindowDesc _cheats_desc = {
void ShowCheatWindow() void ShowCheatWindow()
{ {
Window *w; Window *w;
DeleteWindowById(WC_CHEATS, 0); DeleteWindowById(WC_CHEATS, 0);
w = AllocateWindowDesc(&_cheats_desc); w = AllocateWindowDesc(&_cheats_desc);

View File

@ -44,7 +44,7 @@ static void SkipToPrevSong()
// empty playlist // empty playlist
if (b[0] == 0) if (b[0] == 0)
return; return;
// find the end // find the end
do p++; while (p[0] != 0); do p++; while (p[0] != 0);
@ -132,7 +132,7 @@ static void PlayPlaylistSong()
_music_wnd_cursong = _cur_playlist[0]; _music_wnd_cursong = _cur_playlist[0];
DoPlaySong(); DoPlaySong();
_song_is_active = true; _song_is_active = true;
InvalidateWindowWidget(WC_MUSIC_WINDOW, 0, 9); InvalidateWindowWidget(WC_MUSIC_WINDOW, 0, 9);
} }
@ -190,7 +190,7 @@ static void MusicTrackSelectionWndProc(Window *w, WindowEvent *e)
DrawStringCentered(216, 45 + i*8, STR_01D5_ALL + i, (i==msf.playlist) ? 0xC : 0x10); DrawStringCentered(216, 45 + i*8, STR_01D5_ALL + i, (i==msf.playlist) ? 0xC : 0x10);
} }
DrawStringCentered(216, 45+8*6+16, STR_01F0_CLEAR, 0); DrawStringCentered(216, 45+8*6+16, STR_01F0_CLEAR, 0);
DrawStringCentered(216, 45+8*6+16*2, STR_01F1_SAVE, 0); DrawStringCentered(216, 45+8*6+16*2, STR_01F1_SAVE, 0);
y = 23; y = 23;
@ -203,7 +203,7 @@ static void MusicTrackSelectionWndProc(Window *w, WindowEvent *e)
} }
break; break;
} }
case WE_CLICK: case WE_CLICK:
switch(e->click.widget) { switch(e->click.widget) {
case 3: { /* add to playlist */ case 3: { /* add to playlist */
@ -321,7 +321,7 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
DrawString(60, 38, STR_01E8_TRACK_XTITLE, 0); DrawString(60, 38, STR_01E8_TRACK_XTITLE, 0);
for(i=0; i!=6; i++) { for(i=0; i!=6; i++) {
DrawStringCentered(25+i*50, 59, STR_01D5_ALL+i, msf.playlist == i ? 0xC : 0x10); DrawStringCentered(25+i*50, 59, STR_01D5_ALL+i, msf.playlist == i ? 0xC : 0x10);
} }
@ -336,14 +336,14 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
DrawFrameRect(108, 23, 174, 26, 14, 0x20); DrawFrameRect(108, 23, 174, 26, 14, 0x20);
DrawFrameRect(214, 23, 280, 26, 14, 0x20); DrawFrameRect(214, 23, 280, 26, 14, 0x20);
DrawFrameRect(108 + (msf.music_vol>>1), DrawFrameRect(108 + (msf.music_vol>>1),
22, 22,
111 + (msf.music_vol>>1), 111 + (msf.music_vol>>1),
28, 28,
14, 14,
0); 0);
DrawFrameRect(214 + (msf.effect_vol>>1), DrawFrameRect(214 + (msf.effect_vol>>1),
22, 22,
217 + (msf.effect_vol>>1), 217 + (msf.effect_vol>>1),
28, 28,
@ -371,7 +371,7 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
break; break;
case 6:{ // volume sliders case 6:{ // volume sliders
byte *vol,new_vol; byte *vol,new_vol;
int x = e->click.pt.x - 88; int x = e->click.pt.x - 88;
if (x < 0) if (x < 0)
return; return;

View File

@ -11,7 +11,7 @@ static void AppendPart(byte **buf, int num, const char *names)
while (--num>=0) { while (--num>=0) {
do names++; while (names[-1]); do names++; while (names[-1]);
} }
for(s=*buf; (*s++ = *names++) != 0;) {} for(s=*buf; (*s++ = *names++) != 0;) {}
*buf = s - 1; *buf = s - 1;
} }
@ -19,14 +19,14 @@ static void AppendPart(byte **buf, int num, const char *names)
#define MK(x) x "\x0" #define MK(x) x "\x0"
#define NUM_ENGLISH_1 4 #define NUM_ENGLISH_1 4
static const char english_1[] = static const char english_1[] =
MK("Great ") MK("Great ")
MK("Little ") MK("Little ")
MK("New ") MK("New ")
MK("Fort ") MK("Fort ")
; ;
#define NUM_ENGLISH_2 26 #define NUM_ENGLISH_2 26
static const char english_2[] = static const char english_2[] =
MK("Wr") MK("Wr")
MK("B") MK("B")
@ -57,7 +57,7 @@ static const char english_2[] =
; ;
#define NUM_ENGLISH_3 8 #define NUM_ENGLISH_3 8
static const char english_3[] = static const char english_3[] =
MK("ar") MK("ar")
MK("a") MK("a")
MK("e") MK("e")
@ -69,7 +69,7 @@ static const char english_3[] =
; ;
#define NUM_ENGLISH_4 7 #define NUM_ENGLISH_4 7
static const char english_4[] = static const char english_4[] =
MK("n") MK("n")
MK("ning") MK("ning")
MK("ding") MK("ding")
@ -80,7 +80,7 @@ static const char english_4[] =
; ;
#define NUM_ENGLISH_5 23 #define NUM_ENGLISH_5 23
static const char english_5[] = static const char english_5[] =
MK("ville") MK("ville")
MK("ham") MK("ham")
MK("field") MK("field")
@ -107,7 +107,7 @@ static const char english_5[] =
; ;
#define NUM_ENGLISH_6 9 #define NUM_ENGLISH_6 9
static const char english_6[] = static const char english_6[] =
MK("-on-sea") MK("-on-sea")
MK(" Bay") MK(" Bay")
MK(" Market") MK(" Market")
@ -130,7 +130,7 @@ static byte MakeEnglishTownName(byte *buf, uint32 seed)
i = GETNUM(0, 54) - 50; i = GETNUM(0, 54) - 50;
if (i >= 0) if (i >= 0)
AppendPart(&buf, i, english_1); AppendPart(&buf, i, english_1);
start = buf; start = buf;
AppendPart(&buf, GETNUM(4, NUM_ENGLISH_2), english_2); AppendPart(&buf, GETNUM(4, NUM_ENGLISH_2), english_2);
@ -141,14 +141,14 @@ static byte MakeEnglishTownName(byte *buf, uint32 seed)
i = GETNUM(15, NUM_ENGLISH_6 + 60) - 60; i = GETNUM(15, NUM_ENGLISH_6 + 60) - 60;
result = 0; result = 0;
if (i >= 0) { if (i >= 0) {
if (i <= 1) result = NG_EDGE; if (i <= 1) result = NG_EDGE;
AppendPart(&buf, i, english_6); AppendPart(&buf, i, english_6);
} }
if (start[0]=='C' && (start[1] == 'e' || start[1] == 'i')) if (start[0]=='C' && (start[1] == 'e' || start[1] == 'i'))
start[0] = 'K'; start[0] = 'K';
/* Replace certain words (routine identical to TTD now) */ /* Replace certain words (routine identical to TTD now) */
@ -167,7 +167,7 @@ static byte MakeEnglishTownName(byte *buf, uint32 seed)
} }
#define NUM_AUSTRIAN_A1 6 #define NUM_AUSTRIAN_A1 6
static const char austrian_a1[] = static const char austrian_a1[] =
MK("Bad ") MK("Bad ")
MK("Deutsch ") MK("Deutsch ")
MK("Gross ") MK("Gross ")
@ -177,7 +177,7 @@ static const char austrian_a1[] =
; ;
#define NUM_AUSTRIAN_A2 42 #define NUM_AUSTRIAN_A2 42
static const char austrian_a2[] = static const char austrian_a2[] =
MK("Aus") MK("Aus")
MK("Alten") MK("Alten")
MK("Braun") MK("Braun")
@ -223,7 +223,7 @@ static const char austrian_a2[] =
; ;
#define NUM_AUSTRIAN_A3 16 #define NUM_AUSTRIAN_A3 16
static const char austrian_a3[] = static const char austrian_a3[] =
MK("see") MK("see")
MK("bach") MK("bach")
MK("dorf") MK("dorf")
@ -371,8 +371,8 @@ static byte MakeAustrianTownName(byte *buf, uint32 seed)
} }
#define NUM_GERMAN_1 114 #define NUM_GERMAN_1 114
#define NUM_GERMAN_1_HARDCODED 21 #define NUM_GERMAN_1_HARDCODED 21
static const char german_1[] = static const char german_1[] =
/* hardcoded names */ /* hardcoded names */
MK("Berlin") MK("Berlin")
MK("Bonn") MK("Bonn")
@ -531,14 +531,14 @@ static const char german_4[] =
MK("Elbe") MK("Elbe")
/* use "am" */ /* use "am" */
MK("Main") MK("Main")
; ;
static byte MakeGermanTownName(byte *buf, uint32 seed) static byte MakeGermanTownName(byte *buf, uint32 seed)
{ {
int i; int i;
int ext; int ext;
ext=GETNUM(7, 28); /* Extension - Prefix / Suffix */ ext=GETNUM(7, 28); /* Extension - Prefix / Suffix */
if ((ext==12) || (ext==19)) { if ((ext==12) || (ext==19)) {
@ -571,7 +571,7 @@ static byte MakeGermanTownName(byte *buf, uint32 seed)
} }
#define NUM_SPANISH_1 86 #define NUM_SPANISH_1 86
static const char spanish_1[] = static const char spanish_1[] =
MK("Caracas") MK("Caracas")
MK("Maracay") MK("Maracay")
MK("Maracaibo") MK("Maracaibo")
@ -662,11 +662,11 @@ static const char spanish_1[] =
static byte MakeSpanishTownName(byte *buf, uint32 seed) static byte MakeSpanishTownName(byte *buf, uint32 seed)
{ {
AppendPart(&buf, GETNUM(0, NUM_SPANISH_1), spanish_1); AppendPart(&buf, GETNUM(0, NUM_SPANISH_1), spanish_1);
return 0; return 0;
} }
#define NUM_FRENCH_1 70 #define NUM_FRENCH_1 70
static const char french_1[] = static const char french_1[] =
MK("Agincourt") MK("Agincourt")
MK("Lille") MK("Lille")
MK("Dinan") MK("Dinan")
@ -684,7 +684,7 @@ static const char french_1[] =
MK("St. Tropez") MK("St. Tropez")
MK("Marseilles") MK("Marseilles")
MK("Narbonne") MK("Narbonne")
MK("Sète") MK("Sète")
MK("Aurillac") MK("Aurillac")
MK("Gueret") MK("Gueret")
MK("Le Creusot") MK("Le Creusot")
@ -751,7 +751,7 @@ static byte MakeAmericanTownName(byte *buf, uint32 seed)
} }
#define NUM_SILLY_1 88 #define NUM_SILLY_1 88
static const char silly_1[] = static const char silly_1[] =
MK("Binky") MK("Binky")
MK("Blubber") MK("Blubber")
MK("Bumble") MK("Bumble")
@ -851,7 +851,7 @@ static const char silly_1[] =
; ;
#define NUM_SILLY_2 15 #define NUM_SILLY_2 15
static const char silly_2[] = static const char silly_2[] =
MK("ton") MK("ton")
MK("bury") MK("bury")
MK("bottom") MK("bottom")
@ -862,7 +862,7 @@ static const char silly_2[] =
MK("wig") MK("wig")
MK("wick") MK("wick")
MK("wood") MK("wood")
MK("pool") MK("pool")
MK("head") MK("head")
MK("burg") MK("burg")
@ -872,7 +872,7 @@ static const char silly_2[] =
static byte MakeSillyTownName(byte *buf, uint32 seed) static byte MakeSillyTownName(byte *buf, uint32 seed)
{ {
AppendPart(&buf, GETNUM(0, NUM_SILLY_1), silly_1); AppendPart(&buf, GETNUM(0, NUM_SILLY_1), silly_1);
AppendPart(&buf, GETNUM(16, NUM_SILLY_2),silly_2); AppendPart(&buf, GETNUM(16, NUM_SILLY_2),silly_2);
return 0; return 0;
@ -1081,7 +1081,7 @@ static const char dutch_1[] =
MK("Klein "); MK("Klein ");
#define NUM_DUTCH_2 57 #define NUM_DUTCH_2 57
static const char dutch_2[] = static const char dutch_2[] =
MK("Hoog") MK("Hoog")
MK("Laag") MK("Laag")
MK("Klein") MK("Klein")
@ -1141,7 +1141,7 @@ static const char dutch_2[] =
MK("Hil"); MK("Hil");
#define NUM_DUTCH_3 20 #define NUM_DUTCH_3 20
static const char dutch_3[] = static const char dutch_3[] =
MK("Drog") MK("Drog")
MK("Nat") MK("Nat")
MK("Valk") MK("Valk")
@ -1162,10 +1162,10 @@ static const char dutch_3[] =
MK("Wams") MK("Wams")
MK("Heerhug") MK("Heerhug")
MK("Koning"); MK("Koning");
#define NUM_DUTCH_4 6 #define NUM_DUTCH_4 6
static const char dutch_4[] = static const char dutch_4[] =
MK("e") MK("e")
MK("er") MK("er")
MK("el") MK("el")
@ -1174,7 +1174,7 @@ static const char dutch_4[] =
MK("s"); MK("s");
#define NUM_DUTCH_5 56 #define NUM_DUTCH_5 56
static const char dutch_5[] = static const char dutch_5[] =
MK("stad") MK("stad")
MK("vorst") MK("vorst")
MK("dorp") MK("dorp")
@ -1231,13 +1231,13 @@ static const char dutch_5[] =
MK("schede") MK("schede")
MK("mere") MK("mere")
MK("end"); MK("end");
static byte MakeDutchTownName(byte *buf, uint32 seed) static byte MakeDutchTownName(byte *buf, uint32 seed)
{ {
int i; int i;
i = GETNUM(0, 50 + NUM_DUTCH_1) - 50; i = GETNUM(0, 50 + NUM_DUTCH_1) - 50;
if (i >= 0) if (i >= 0)
AppendPart(&buf, i, dutch_1); AppendPart(&buf, i, dutch_1);
i = GETNUM(6, 9); i = GETNUM(6, 9);
@ -1253,7 +1253,7 @@ static byte MakeDutchTownName(byte *buf, uint32 seed)
} }
#define NUM_FINNISH_1 25 #define NUM_FINNISH_1 25
static const char finnish_1[] = static const char finnish_1[] =
MK("Aijala") MK("Aijala")
MK("Kisko") MK("Kisko")
MK("Espoo") MK("Espoo")
@ -1279,9 +1279,9 @@ static const char finnish_1[] =
MK("Imatra") MK("Imatra")
MK("Tapanila") MK("Tapanila")
MK("Pasila"); MK("Pasila");
#define NUM_FINNISH_2a 26 #define NUM_FINNISH_2a 26
static const char finnish_2a[] = static const char finnish_2a[] =
MK("Hiekka") MK("Hiekka")
MK("Haapa") MK("Haapa")
MK("Mylly") MK("Mylly")
@ -1310,7 +1310,7 @@ static const char finnish_2a[] =
MK("Koivu"); MK("Koivu");
#define NUM_FINNISH_2b 18 #define NUM_FINNISH_2b 18
static const char finnish_2b[] = static const char finnish_2b[] =
MK("harju") MK("harju")
MK("linna") MK("linna")
MK("järvi") MK("järvi")
@ -1576,7 +1576,7 @@ MK(" Malopolski")
MK(" Podlaski") MK(" Podlaski")
MK(" Lesny") MK(" Lesny")
; ;
static const char polish_3_f[] = static const char polish_3_f[] =
MK(" Wybudowanie") MK(" Wybudowanie")
MK(" Swietokrzyska") MK(" Swietokrzyska")
MK(" Gorska") MK(" Gorska")
@ -1692,7 +1692,7 @@ static byte MakePolishTownName(byte *buf, uint32 seed)
} }
#define NUM_CZECH_1 82 #define NUM_CZECH_1 82
static const char czech_1[] = static const char czech_1[] =
MK("As") MK("As")
MK("Benesov") MK("Benesov")
MK("Beroun") MK("Beroun")
@ -1780,7 +1780,7 @@ MK("Znojmo")
static byte MakeCzechTownName(byte *buf, uint32 seed) static byte MakeCzechTownName(byte *buf, uint32 seed)
{ {
AppendPart(&buf, GETNUM(0, NUM_CZECH_1), czech_1); AppendPart(&buf, GETNUM(0, NUM_CZECH_1), czech_1);
return 0; return 0;
} }
@ -1879,12 +1879,12 @@ MK("Zvolen")
static byte MakeSlovakishTownName(byte *buf, uint32 seed) static byte MakeSlovakishTownName(byte *buf, uint32 seed)
{ {
AppendPart(&buf, GETNUM(0, NUM_SLOVAKISH_1), slovakish_1); AppendPart(&buf, GETNUM(0, NUM_SLOVAKISH_1), slovakish_1);
return 0; return 0;
} }
// Modifiers // Modifiers
#define NUM_HUNGARIAN_1 5 #define NUM_HUNGARIAN_1 5
static const char hungarian_1[] = static const char hungarian_1[] =
MK("Nagy-") MK("Nagy-")
MK("Kis-") MK("Kis-")
MK("Felsõ-") MK("Felsõ-")
@ -1893,7 +1893,7 @@ static const char hungarian_1[] =
; ;
#define NUM_HUNGARIAN_2 54 #define NUM_HUNGARIAN_2 54
static const char hungarian_2[] = static const char hungarian_2[] =
// River modifiers // River modifiers
// 1 - 10 // 1 - 10
MK("Bodrog") MK("Bodrog")
@ -1971,7 +1971,7 @@ static const char hungarian_2[] =
; ;
#define NUM_HUNGARIAN_3 16 #define NUM_HUNGARIAN_3 16
static const char hungarian_3[] = static const char hungarian_3[] =
MK("apáti") MK("apáti")
MK("bába") MK("bába")
MK("bikk") MK("bikk")
@ -1991,7 +1991,7 @@ static const char hungarian_3[] =
; ;
#define NUM_HUNGARIAN_4 5 #define NUM_HUNGARIAN_4 5
static const char hungarian_4[] = static const char hungarian_4[] =
MK("alja") MK("alja")
MK("egyháza") MK("egyháza")
MK("háza") MK("háza")
@ -2054,7 +2054,7 @@ static byte MakeHungarianTownName(byte *buf, uint32 seed)
AppendPart(&buf, GETNUM(3, NUM_HUNGARIAN_2), hungarian_2); AppendPart(&buf, GETNUM(3, NUM_HUNGARIAN_2), hungarian_2);
AppendPart(&buf, GETNUM(6, NUM_HUNGARIAN_3), hungarian_3); AppendPart(&buf, GETNUM(6, NUM_HUNGARIAN_3), hungarian_3);
i = GETNUM(10, NUM_HUNGARIAN_4 * 3); i = GETNUM(10, NUM_HUNGARIAN_4 * 3);
if (i < NUM_HUNGARIAN_4) AppendPart(&buf, i, hungarian_4); if (i < NUM_HUNGARIAN_4) AppendPart(&buf, i, hungarian_4);
} }

View File

@ -232,7 +232,7 @@ static size_t _transmit_file_size;
static FILE *_recv_file; static FILE *_recv_file;
typedef struct NetworkGameInfo { typedef struct NetworkGameInfo {
char server_name[40]; // name of the game char server_name[40]; // name of the game
char server_revision[8]; // server game version char server_revision[8]; // server game version
byte server_lang; // langid byte server_lang; // langid
@ -263,17 +263,17 @@ void CSleep(int milliseconds) {
Sleep(milliseconds); Sleep(milliseconds);
#endif #endif
#if defined(UNIX) #if defined(UNIX)
#if !defined(__BEOS__) && !defined(__MORPHOS__) && !defined(__AMIGAOS__) #if !defined(__BEOS__) && !defined(__MORPHOS__) && !defined(__AMIGAOS__)
usleep(milliseconds*1000); usleep(milliseconds*1000);
#endif #endif
#ifdef __BEOS__ #ifdef __BEOS__
snooze(milliseconds*1000); snooze(milliseconds*1000);
#endif #endif
#if defined(__MORPHOS__) #if defined(__MORPHOS__)
usleep(milliseconds*1000); usleep(milliseconds*1000);
#endif #endif
#if defined(__AMIGAOS__) && !defined(__MORPHOS__) #if defined(__AMIGAOS__) && !defined(__MORPHOS__)
{ {
ULONG signals; ULONG signals;
ULONG TimerSigBit = 1 << TimerPort->mp_SigBit; ULONG TimerSigBit = 1 << TimerPort->mp_SigBit;
@ -826,7 +826,7 @@ void NetworkSendReadyPacket()
rp->packet_type = 5; rp->packet_type = 5;
rp->packet_length = sizeof(rp); rp->packet_length = sizeof(rp);
SendBytes(c, rp, sizeof(rp)); SendBytes(c, rp, sizeof(rp));
_network_ready_sent = true; _network_ready_sent = true;
} }
} }
@ -955,7 +955,7 @@ bool NetworkConnect(const char *hostname, int port)
b = 1; b = 1;
setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)); setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = NetworkResolveHost(hostname); sin.sin_addr.s_addr = NetworkResolveHost(hostname);
sin.sin_port = htons(port); sin.sin_port = htons(port);
@ -980,7 +980,7 @@ bool NetworkConnect(const char *hostname, int port)
void NetworkListen() void NetworkListen()
{ {
SOCKET ls; SOCKET ls;
struct sockaddr_in sin; struct sockaddr_in sin;
int port; int port;
@ -992,7 +992,7 @@ void NetworkListen()
ls = socket(AF_INET, SOCK_STREAM, 0); ls = socket(AF_INET, SOCK_STREAM, 0);
if (ls == INVALID_SOCKET) if (ls == INVALID_SOCKET)
error("socket() on listen socket failed"); error("socket() on listen socket failed");
// reuse the socket // reuse the socket
{ {
int reuse = 1; if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) == -1) int reuse = 1; if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) == -1)
@ -1021,7 +1021,7 @@ void NetworkReceive()
int n; int n;
fd_set read_fd, write_fd; fd_set read_fd, write_fd;
struct timeval tv; struct timeval tv;
FD_ZERO(&read_fd); FD_ZERO(&read_fd);
FD_ZERO(&write_fd); FD_ZERO(&write_fd);
@ -1119,13 +1119,13 @@ void NetworkSend()
CSleep(5); CSleep(5);
} }
} }
_not_packet = 0; _not_packet = 0;
new_max = max(_frame_counter + (int)_network_ahead_frames, _frame_counter_max); new_max = max(_frame_counter + (int)_network_ahead_frames, _frame_counter_max);
DEBUG(net,3) ("net: serv: sync max=%i, seed1=%i, seed2=%i",new_max,_sync_seed_1,_sync_seed_2); DEBUG(net,3) ("net: serv: sync max=%i, seed1=%i, seed2=%i",new_max,_sync_seed_1,_sync_seed_2);
sp.packet_length = sizeof(sp); sp.packet_length = sizeof(sp);
sp.packet_type = 1; sp.packet_type = 1;
sp.frames = new_max - _frame_counter_max; sp.frames = new_max - _frame_counter_max;
@ -1196,7 +1196,7 @@ void NetworkClose(bool client) {
void NetworkShutdown() void NetworkShutdown()
{ {
_networking_server = false; _networking_server = false;
_networking = false; _networking = false;
_networking_sync = false; _networking_sync = false;
_frame_counter = 0; _frame_counter = 0;
@ -1255,10 +1255,10 @@ void NetworkUDPListen(bool client)
DEBUG(net, 1) ("[NET][UDP] listening on port %i", port); DEBUG(net, 1) ("[NET][UDP] listening on port %i", port);
udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// this disables network // this disables network
_network_available = !(udp == INVALID_SOCKET); _network_available = !(udp == INVALID_SOCKET);
// set nonblocking mode for socket // set nonblocking mode for socket
{ unsigned long blocking = 1; ioctlsocket(udp, FIONBIO, &blocking); } { unsigned long blocking = 1; ioctlsocket(udp, FIONBIO, &blocking); }
@ -1268,7 +1268,7 @@ void NetworkUDPListen(bool client)
if (bind(udp, (struct sockaddr*)&sin, sizeof(sin)) != 0) if (bind(udp, (struct sockaddr*)&sin, sizeof(sin)) != 0)
DEBUG(net, 1) ("[NET][UDP] error: bind failed on port %i", port); DEBUG(net, 1) ("[NET][UDP] error: bind failed on port %i", port);
// enable broadcasting // enable broadcasting
{ unsigned long val=1; setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val)); } { unsigned long val=1; setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val)); }
@ -1280,7 +1280,7 @@ void NetworkUDPListen(bool client)
} }
void NetworkUDPClose(bool client) { void NetworkUDPClose(bool client) {
if (client) { if (client) {
DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port); DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
closesocket(_udp_client_socket); closesocket(_udp_client_socket);
_udp_client_socket = INVALID_SOCKET; _udp_client_socket = INVALID_SOCKET;
@ -1301,17 +1301,17 @@ void NetworkUDPReceive(bool client) {
int nbytes; int nbytes;
struct UDPPacket packet; struct UDPPacket packet;
int packet_len; int packet_len;
SOCKET udp; SOCKET udp;
if (client) udp=_udp_client_socket; else udp=_udp_server_socket; if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
packet_len = sizeof(packet); packet_len = sizeof(packet);
client_len = sizeof(client_addr); client_len = sizeof(client_addr);
nbytes = recvfrom(udp, (char *) &packet, packet_len , 0, (struct sockaddr *) &client_addr, &client_len); nbytes = recvfrom(udp, (char *) &packet, packet_len , 0, (struct sockaddr *) &client_addr, &client_len);
if (nbytes>0) { if (nbytes>0) {
if (packet.command_code==packet.command_check) switch (packet.command_code) { if (packet.command_code==packet.command_check) switch (packet.command_code) {
case NET_UDPCMD_SERVERSEARCH: case NET_UDPCMD_SERVERSEARCH:
if (!client) { if (!client) {
packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO; packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO;
@ -1335,7 +1335,7 @@ void NetworkUDPReceive(bool client) {
item = (NetworkGameList *) NetworkGameListAdd(); item = (NetworkGameList *) NetworkGameListAdd();
item -> ip = inet_addr(inet_ntoa(client_addr.sin_addr)); item -> ip = inet_addr(inet_ntoa(client_addr.sin_addr));
item -> port = ntohs(client_addr.sin_port); item -> port = ntohs(client_addr.sin_port);
memcpy(item,&packet.data,packet.data_len); memcpy(item,&packet.data,packet.data_len);
} }
break; break;
@ -1365,14 +1365,14 @@ void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
if (res==-1) DEBUG(net, 1)("udp: broadcast error: %i",GET_LAST_ERROR()); if (res==-1) DEBUG(net, 1)("udp: broadcast error: %i",GET_LAST_ERROR());
i++; i++;
} }
} }
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) { void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) {
SOCKET udp; SOCKET udp;
if (client) udp=_udp_client_socket; else udp=_udp_server_socket; if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &recv,sizeof(recv)); sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &recv,sizeof(recv));
} }
@ -1380,13 +1380,13 @@ void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet
bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) { bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) {
struct UDPPacket packet; struct UDPPacket packet;
int timeout=3000; int timeout=3000;
NetworkGameListClear(); NetworkGameListClear();
DEBUG(net, 0) ("[NET][UDP] searching server"); DEBUG(net, 0) ("[NET][UDP] searching server");
*_network_detected_serverip = "255.255.255.255"; *_network_detected_serverip = "255.255.255.255";
*_network_detected_serverport = 0; *_network_detected_serverport = 0;
packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH; packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
packet.data_len=0; packet.data_len=0;
NetworkUDPBroadCast(true, packet); NetworkUDPBroadCast(true, packet);
@ -1403,11 +1403,11 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho
timeout=-1; timeout=-1;
DEBUG(net, 0) ("[NET][UDP] server found on %s", *_network_detected_serverip); DEBUG(net, 0) ("[NET][UDP] server found on %s", *_network_detected_serverip);
} }
} }
return (*_network_detected_serverport>0); return (*_network_detected_serverport>0);
} }
@ -1420,7 +1420,7 @@ void NetworkIPListInit() {
char hostname[250]; char hostname[250];
uint32 bcaddr; uint32 bcaddr;
int i=0; int i=0;
gethostname(hostname,250); gethostname(hostname,250);
DEBUG(net, 2) ("[NET][IP] init for host %s", hostname); DEBUG(net, 2) ("[NET][IP] init for host %s", hostname);
he=gethostbyname((char *) hostname); he=gethostbyname((char *) hostname);
@ -1428,7 +1428,7 @@ void NetworkIPListInit() {
if (he == NULL) { if (he == NULL) {
he = gethostbyname("localhost"); he = gethostbyname("localhost");
} }
if (he == NULL) { if (he == NULL) {
bcaddr = inet_addr("127.0.0.1"); bcaddr = inet_addr("127.0.0.1");
he = gethostbyaddr(inet_ntoa(*(struct in_addr *) &bcaddr), sizeof(bcaddr), AF_INET); he = gethostbyaddr(inet_ntoa(*(struct in_addr *) &bcaddr), sizeof(bcaddr), AF_INET);
@ -1437,7 +1437,7 @@ void NetworkIPListInit() {
if (he == NULL) { if (he == NULL) {
DEBUG(net, 2) ("[NET][IP] cannot resolve %s", hostname); DEBUG(net, 2) ("[NET][IP] cannot resolve %s", hostname);
} else { } else {
while(he->h_addr_list[i]) { while(he->h_addr_list[i]) {
bcaddr = inet_addr(inet_ntoa(*(struct in_addr *) he->h_addr_list[i])); bcaddr = inet_addr(inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
_network_ip_list[i]=bcaddr; _network_ip_list[i]=bcaddr;
DEBUG(net, 2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i])); DEBUG(net, 2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
@ -1446,7 +1446,7 @@ void NetworkIPListInit() {
} }
_network_ip_list[i]=0; _network_ip_list[i]=0;
} }
/* *************************************************** */ /* *************************************************** */
@ -1468,7 +1468,7 @@ _network_client_timeout=3000;
_network_available=false; _network_available=false;
} }
} }
#else #else
// [morphos/amigaos] bsd-socket startup // [morphos/amigaos] bsd-socket startup
@ -1486,14 +1486,14 @@ _network_client_timeout=3000;
if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) { if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) { if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) { if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
// free ressources... // free ressources...
DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer."); DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
_network_available=false; _network_available=false;
} }
} }
} }
} }
#endif #endif
} }
#else #else
@ -1527,9 +1527,9 @@ void NetworkCoreShutdown() {
DEBUG(net, 3) ("[NET][Core] shutdown()"); DEBUG(net, 3) ("[NET][Core] shutdown()");
#if defined(__MORPHOS__) || defined(__AMIGA__) #if defined(__MORPHOS__) || defined(__AMIGA__)
{ {
// free allocated ressources // free allocated ressources
#if !defined(__MORPHOS__) #if !defined(__MORPHOS__)
if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); } if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); }
if (TimerRequest) { DeleteIORequest(TimerRequest); } if (TimerRequest) { DeleteIORequest(TimerRequest); }
if (TimerPort) { DeleteMsgPort(TimerPort); } if (TimerPort) { DeleteMsgPort(TimerPort); }
@ -1574,9 +1574,9 @@ bool NetworkCoreConnectGame(const byte* b, unsigned short port)
if (_networking) { if (_networking) {
NetworkLobbyShutdown(); NetworkLobbyShutdown();
} else { } else {
if (_networking_override) if (_networking_override)
NetworkLobbyShutdown(); NetworkLobbyShutdown();
ShowErrorMessage(-1, STR_NETWORK_ERR_NOCONNECTION,0,0); ShowErrorMessage(-1, STR_NETWORK_ERR_NOCONNECTION,0,0);
_switch_mode_errorstr = STR_NETWORK_ERR_NOCONNECTION; _switch_mode_errorstr = STR_NETWORK_ERR_NOCONNECTION;
} }
@ -1607,13 +1607,13 @@ void NetworkCoreDisconnect()
if (_networking_server) { if (_networking_server) {
NetworkUDPClose(false); NetworkUDPClose(false);
NetworkClose(false); NetworkClose(false);
} }
/* terminate client connection */ /* terminate client connection */
else if (_networking) { else if (_networking) {
NetworkClose(true); NetworkClose(true);
} }
NetworkShutdown(); NetworkShutdown();
} }
@ -1670,7 +1670,7 @@ void NetworkLobbyShutdown() {
void NetworkGameListClear() { void NetworkGameListClear() {
NetworkGameList * item; NetworkGameList * item;
NetworkGameList * next; NetworkGameList * next;
DEBUG(net, 4) ("[NET][G-List] cleared server list"); DEBUG(net, 4) ("[NET][G-List] cleared server list");
@ -1686,7 +1686,7 @@ _network_game_count=0;
char * NetworkGameListAdd() { char * NetworkGameListAdd() {
NetworkGameList * item; NetworkGameList * item;
NetworkGameList * before; NetworkGameList * before;
DEBUG(net, 4) ("[NET][G-List] added server to list"); DEBUG(net, 4) ("[NET][G-List] added server to list");
@ -1726,7 +1726,7 @@ void NetworkGameListFromInternet() {
char * NetworkGameListItem(uint16 index) { char * NetworkGameListItem(uint16 index) {
NetworkGameList * item; NetworkGameList * item;
NetworkGameList * next; NetworkGameList * next;
uint16 cnt = 0; uint16 cnt = 0;
item = _network_game_list; item = _network_game_list;
@ -1749,7 +1749,7 @@ void NetworkGameFillDefaults() {
#if defined(WITH_REV) #if defined(WITH_REV)
extern char _openttd_revision[]; extern char _openttd_revision[];
#endif #endif
DEBUG(net, 4) ("[NET][G-Info] setting defaults"); DEBUG(net, 4) ("[NET][G-Info] setting defaults");
ttd_strlcpy(game->server_name,"OpenTTD Game",13); ttd_strlcpy(game->server_name,"OpenTTD Game",13);
@ -1768,7 +1768,7 @@ void NetworkGameFillDefaults() {
game->players_max=8; game->players_max=8;
game->players_on=0; game->players_on=0;
game->server_lang=_dynlang.curr; game->server_lang=_dynlang.curr;
} }

View File

@ -23,12 +23,12 @@ static const StringID _connection_types_dropdown[] = {
}; };
/* Should be _network_game->players_max but since network is not yet really done /* Should be _network_game->players_max but since network is not yet really done
* we'll just use some dummy here * we'll just use some dummy here
* network.c -->> static NetworkGameInfo _network_game; * network.c -->> static NetworkGameInfo _network_game;
*/ */
static byte _players_max; static byte _players_max;
/* Should be ??????????? (something) but since network is not yet really done /* Should be ??????????? (something) but since network is not yet really done
* we'll just use some dummy here * we'll just use some dummy here
*/ */
static byte _network_connection; static byte _network_connection;
@ -36,20 +36,20 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_PAINT: { case WE_PAINT: {
SET_DPARAM16(0, 0x00); SET_DPARAM16(0, 0x00);
SET_DPARAM16(2, STR_NETWORK_LAN + _network_connection); SET_DPARAM16(2, STR_NETWORK_LAN + _network_connection);
DrawWindowWidgets(w); DrawWindowWidgets(w);
DrawEditBox(w, 6); DrawEditBox(w, 6);
DrawString(9, 43, STR_NETWORK_PLAYER_NAME, 2); DrawString(9, 43, STR_NETWORK_PLAYER_NAME, 2);
DrawString(9, 63, STR_NETWORK_SELECT_CONNECTION, 2); DrawString(9, 63, STR_NETWORK_SELECT_CONNECTION, 2);
DrawString(15, 82, STR_NETWORK_GAME_NAME, 2); DrawString(15, 82, STR_NETWORK_GAME_NAME, 2);
DrawString(238, 82, STR_NETWORK_PLAYERS, 2); DrawString(238, 82, STR_NETWORK_PLAYERS, 2);
DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2); DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2);
} break; } break;
case WE_CLICK: case WE_CLICK:
@ -65,7 +65,7 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
case 4: { /* Connect via direct ip */ case 4: { /* Connect via direct ip */
StringID str; StringID str;
str = AllocateName((byte*)_decode_parameters, 0); str = AllocateName((byte*)_decode_parameters, 0);
ShowQueryString( ShowQueryString(
str, str,
STR_NETWORK_ENTER_IP, STR_NETWORK_ENTER_IP,
@ -93,7 +93,7 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
case WE_MOUSELOOP: case WE_MOUSELOOP:
if (_selected_field == 6) if (_selected_field == 6)
HandleEditBox(w, 6); HandleEditBox(w, 6);
break; break;
case WE_KEYPRESS: case WE_KEYPRESS:
@ -160,11 +160,11 @@ void ShowNetworkGameWindow()
DeleteWindowById(WC_NETWORK_WINDOW, 0); DeleteWindowById(WC_NETWORK_WINDOW, 0);
NetworkLobbyInit(); NetworkLobbyInit();
w = AllocateWindowDesc(&_network_game_window_desc); w = AllocateWindowDesc(&_network_game_window_desc);
strcpy(_edit_str_buf, "Your name"); strcpy(_edit_str_buf, "Your name");
WP(w,querystr_d).caret = 1; WP(w,querystr_d).caret = 1;
WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
WP(w,querystr_d).maxwidth = 240; WP(w,querystr_d).maxwidth = 240;
@ -186,7 +186,7 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_PAINT: { case WE_PAINT: {
SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _players_max); SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _players_max);
DrawWindowWidgets(w); DrawWindowWidgets(w);
@ -194,13 +194,13 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
DrawEditBox(w, 3); DrawEditBox(w, 3);
DrawEditBox(w, 4); DrawEditBox(w, 4);
DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2); DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2);
DrawString(210, 22, STR_NETWORK_PASSWORD, 2); DrawString(210, 22, STR_NETWORK_PASSWORD, 2);
DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2); DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2);
DrawString(260, 63, STR_NETWORK_NUMBER_OF_PLAYERS, 2); DrawString(260, 63, STR_NETWORK_NUMBER_OF_PLAYERS, 2);
} break; } break;
case WE_CLICK: case WE_CLICK:
@ -251,7 +251,7 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
break; break;
} }
break; break;
} }
} }
@ -288,10 +288,10 @@ static void ShowNetworkStartServerWindow()
{ {
Window *w; Window *w;
DeleteWindowById(WC_NETWORK_WINDOW, 0); DeleteWindowById(WC_NETWORK_WINDOW, 0);
w = AllocateWindowDesc(&_network_start_server_window_desc); w = AllocateWindowDesc(&_network_start_server_window_desc);
strcpy(_edit_str_buf, ""); strcpy(_edit_str_buf, "");
WP(w,querystr_d).caret = 1; WP(w,querystr_d).caret = 1;
WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
WP(w,querystr_d).maxwidth = 240; WP(w,querystr_d).maxwidth = 240;
@ -303,7 +303,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_PAINT: { case WE_PAINT: {
SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _opt_mod_ptr->road_side); SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _opt_mod_ptr->road_side);
DrawWindowWidgets(w); DrawWindowWidgets(w);
@ -312,7 +312,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
DrawEditBox(w, 5); DrawEditBox(w, 5);
DrawEditBox(w, 7); DrawEditBox(w, 7);
DrawString(10, 255, STR_NETWORK_COMPANY_NAME, 2); DrawString(10, 255, STR_NETWORK_COMPANY_NAME, 2);
break; break;
@ -340,7 +340,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
HandleEditBox(w, 7); HandleEditBox(w, 7);
break; break;
} }
break; break;
case WE_KEYPRESS: case WE_KEYPRESS:
@ -352,7 +352,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
break; break;
} }
break; break;
} }
} }
@ -398,11 +398,11 @@ static void ShowNetworkLobbyWindow()
{ {
Window *w; Window *w;
DeleteWindowById(WC_NETWORK_WINDOW, 0); DeleteWindowById(WC_NETWORK_WINDOW, 0);
w = AllocateWindowDesc(&_network_lobby_window_desc); w = AllocateWindowDesc(&_network_lobby_window_desc);
strcpy(_edit_str_buf, ""); strcpy(_edit_str_buf, "");
WP(w,querystr_d).caret = 1; WP(w,querystr_d).caret = 1;
WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
WP(w,querystr_d).maxwidth = 240; WP(w,querystr_d).maxwidth = 240;

View File

@ -12,7 +12,7 @@
News system is realized as a FIFO queue (in an array) News system is realized as a FIFO queue (in an array)
The positions in the queue can't be rearranged, we only access The positions in the queue can't be rearranged, we only access
the array elements through pointers to the elements. Once the the array elements through pointers to the elements. Once the
array is full, the oldest entry (_oldest_news) is being overwritten array is full, the oldest entry (_oldest_news) is being overwritten
by the newest (_latest news). by the newest (_latest news).
oldest current lastest oldest current lastest
@ -28,7 +28,7 @@ static NewsItem _news_items[MAX_NEWS];
static byte _current_news = 255; // points to news item that should be shown next static byte _current_news = 255; // points to news item that should be shown next
static byte _oldest_news = 0; // points to first item in fifo queue static byte _oldest_news = 0; // points to first item in fifo queue
static byte _latest_news = 255; // points to last item in fifo queue static byte _latest_news = 255; // points to last item in fifo queue
static byte _forced_news = 255; // if the message being shown was forced by the user, its index is stored in _forced_news. static byte _forced_news = 255; // if the message being shown was forced by the user, its index is stored in _forced_news.
//forced_news is 255 otherwise. (Users can force messages through history or "last message") //forced_news is 255 otherwise. (Users can force messages through history or "last message")
static byte _total_news = 0; // total news count static byte _total_news = 0; // total news count
@ -80,13 +80,13 @@ void DrawNewsBorder(Window *w)
int bottom = w->height - 1; int bottom = w->height - 1;
GfxFillRect(left, top, right, bottom, 0xF); GfxFillRect(left, top, right, bottom, 0xF);
GfxFillRect(left, top, left, bottom, 0xD7); GfxFillRect(left, top, left, bottom, 0xD7);
GfxFillRect(right, top, right, bottom, 0xD7); GfxFillRect(right, top, right, bottom, 0xD7);
GfxFillRect(left, top, right, top, 0xD7); GfxFillRect(left, top, right, top, 0xD7);
GfxFillRect(left, bottom, right, bottom, 0xD7); GfxFillRect(left, bottom, right, bottom, 0xD7);
DrawString(left + 2, top + 1, STR_00C6, 0); DrawString(left + 2, top + 1, STR_00C6, 0);
} }
static void NewsWindowProc(Window *w, WindowEvent *e) static void NewsWindowProc(Window *w, WindowEvent *e)
@ -115,7 +115,7 @@ static void NewsWindowProc(Window *w, WindowEvent *e)
/* Shade the viewport into gray, or color*/ /* Shade the viewport into gray, or color*/
vp = w->viewport; vp = w->viewport;
GfxFillRect(vp->left - w->left, vp->top - w->top, vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1, GfxFillRect(vp->left - w->left, vp->top - w->top, vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1,
ni->flags & NF_INCOLOR ? 0x4322:0x4323 ni->flags & NF_INCOLOR ? 0x4322:0x4323
); );
@ -208,7 +208,7 @@ void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
_forced_news = 255; _forced_news = 255;
if(_total_news < MAX_NEWS) _total_news++; if(_total_news < MAX_NEWS) _total_news++;
// make sure our pointer isn't overflowing // make sure our pointer isn't overflowing
_latest_news = increaseIndex(_latest_news); _latest_news = increaseIndex(_latest_news);
@ -431,7 +431,7 @@ void ShowLastNewsMessage()
else if(_forced_news!=0) else if(_forced_news!=0)
ShowNewsMessage(_forced_news-1); ShowNewsMessage(_forced_news-1);
else { else {
if(_total_news != MAX_NEWS) if(_total_news != MAX_NEWS)
ShowNewsMessage(_latest_news); ShowNewsMessage(_latest_news);
else else
ShowNewsMessage(MAX_NEWS-1); ShowNewsMessage(MAX_NEWS-1);
@ -443,7 +443,7 @@ void ShowLastNewsMessage()
recent news. Returns 255 if end of queue reached. */ recent news. Returns 255 if end of queue reached. */
static byte getNews(byte i) static byte getNews(byte i)
{ {
if(i>=_total_news) if(i>=_total_news)
return 255; return 255;
if(_latest_news < i) if(_latest_news < i)
@ -459,17 +459,17 @@ static void GetNewsString(NewsItem *ni, byte *buffer)
{ {
StringID str; StringID str;
byte *s, *d; byte *s, *d;
if (ni->display_mode == 3) { if (ni->display_mode == 3) {
str = _get_news_string_callback[ni->callback](ni); str = _get_news_string_callback[ni->callback](ni);
} else { } else {
COPY_IN_DPARAM(0, ni->params, lengthof(ni->params)); COPY_IN_DPARAM(0, ni->params, lengthof(ni->params));
str = ni->string_id; str = ni->string_id;
} }
GetString(str_buffr, str); GetString(str_buffr, str);
assert(strlen(str_buffr) < sizeof(str_buffr) - 1); assert(strlen(str_buffr) < sizeof(str_buffr) - 1);
s = str_buffr; s = str_buffr;
d = buffer; d = buffer;
@ -611,7 +611,7 @@ static void MessageOptionsWndProc(Window *w, WindowEvent *e)
for(i=STR_0206_ARRIVAL_OF_FIRST_VEHICLE; i <= STR_020F_GENERAL_INFORMATION; i++) { for(i=STR_0206_ARRIVAL_OF_FIRST_VEHICLE; i <= STR_020F_GENERAL_INFORMATION; i++) {
DrawString(124, y, i, 0); DrawString(124, y, i, 0);
y += 12; y += 12;
} }
break; break;
} }

View File

@ -314,7 +314,7 @@ typedef struct {
byte owner; byte owner;
uint16 tile; uint16 tile;
uint16 cur_image; uint16 cur_image;
int16 left_coord, right_coord, top_coord, bottom_coord; // NOLOAD, calculated automatically. int16 left_coord, right_coord, top_coord, bottom_coord; // NOLOAD, calculated automatically.
uint16 vehstatus; uint16 vehstatus;
uint16 cur_speed; uint16 cur_speed;
@ -420,21 +420,21 @@ typedef struct {
uint16 age_cargo_skip_counter; uint16 age_cargo_skip_counter;
uint16 tick_counter; uint16 tick_counter;
uint16 cur_tileloop_tile; uint16 cur_tileloop_tile;
OldPrice prices[49]; OldPrice prices[49];
OldPaymentRate cargo_payment_rates[12]; OldPaymentRate cargo_payment_rates[12];
byte map_owner[256*256]; byte map_owner[256*256];
byte map2[256*256]; byte map2[256*256];
uint16 map3[256*256]; uint16 map3[256*256];
byte map_extra[256*256/4]; byte map_extra[256*256/4];
OldStation stations[250]; OldStation stations[250];
OldIndustry industries[90]; OldIndustry industries[90];
OldPlayer players[8]; OldPlayer players[8];
OldVehicle vehicles[850]; OldVehicle vehicles[850];
OldName names[500]; OldName names[500];
uint16 vehicle_position_hash[0x1000]; // NOLOAD, calculated automatically. uint16 vehicle_position_hash[0x1000]; // NOLOAD, calculated automatically.
OldSign signs[40]; OldSign signs[40];
@ -455,7 +455,7 @@ typedef struct {
uint16 cargo_sprites[12]; uint16 cargo_sprites[12];
uint16 engine_name_strings[256]; uint16 engine_name_strings[256];
//NOLOAD. These are calculated from InitializeLandscapeVariables //NOLOAD. These are calculated from InitializeLandscapeVariables
uint16 railveh_by_cargo_1[12], railveh_by_cargo_2[12], railveh_by_cargo_3[12]; uint16 railveh_by_cargo_1[12], railveh_by_cargo_2[12], railveh_by_cargo_3[12];
uint16 roadveh_by_cargo_start[12]; uint16 roadveh_by_cargo_start[12];
@ -486,9 +486,9 @@ typedef struct {
byte snow_line_height; byte snow_line_height;
byte new_industry_randtable[32]; // NOLOAD. Not needed due to different code design. byte new_industry_randtable[32]; // NOLOAD. Not needed due to different code design.
//NOLOAD. Initialized by InitializeLandscapeVariables //NOLOAD. Initialized by InitializeLandscapeVariables
byte cargo_weights[12]; byte cargo_weights[12];
byte transit_days_table_1[12]; byte transit_days_table_1[12];
byte transit_days_table_2[12]; byte transit_days_table_2[12];
@ -557,7 +557,7 @@ static byte DecodeSavegameByte()
return GetSavegameByteFromBuffer(); return GetSavegameByteFromBuffer();
} }
} }
x = GetSavegameByteFromBuffer(); x = GetSavegameByteFromBuffer();
if (x >= 0) { if (x >= 0) {
lss->count = x; lss->count = x;
@ -568,7 +568,7 @@ static byte DecodeSavegameByte()
lss->count = -x; lss->count = -x;
lss->rep_char = GetSavegameByteFromBuffer(); lss->rep_char = GetSavegameByteFromBuffer();
return lss->rep_char; return lss->rep_char;
} }
} }
static void LoadSavegameBytes(void *p, size_t count) static void LoadSavegameBytes(void *p, size_t count)
@ -642,7 +642,7 @@ static void FixIndustry(Industry *i, OldIndustry *o, int num)
i->prod_level = o->prod_level; i->prod_level = o->prod_level;
i->last_mo_production[0] = o->last_mo_production[0]; i->last_mo_production[0] = o->last_mo_production[0];
i->last_mo_production[1] = o->last_mo_production[1]; i->last_mo_production[1] = o->last_mo_production[1];
i->last_mo_transported[0] = o->last_mo_transported[0]; i->last_mo_transported[0] = o->last_mo_transported[0];
i->last_mo_transported[1] = o->last_mo_transported[1]; i->last_mo_transported[1] = o->last_mo_transported[1];
i->last_mo_transported[2] = o->last_mo_transported[2]; i->last_mo_transported[2] = o->last_mo_transported[2];
@ -652,7 +652,7 @@ static void FixIndustry(Industry *i, OldIndustry *o, int num)
i->total_production[0] = o->total_production[0]; i->total_production[0] = o->total_production[0];
i->total_production[1] = o->total_production[1]; i->total_production[1] = o->total_production[1];
i->total_transported[0] = i->total_transported[0]; i->total_transported[0] = i->total_transported[0];
i->total_transported[1] = i->total_transported[1]; i->total_transported[1] = i->total_transported[1];
@ -688,7 +688,7 @@ static void FixStation(Station *s, OldStation *o, int num)
s->train_tile = o->train_tile; s->train_tile = o->train_tile;
s->airport_tile = o->airport_tile; s->airport_tile = o->airport_tile;
s->dock_tile = o->dock_tile; s->dock_tile = o->dock_tile;
if (o->train_tile) { if (o->train_tile) {
int w = (o->platforms >> 3) & 0x7; int w = (o->platforms >> 3) & 0x7;
int h = (o->platforms & 0x7); int h = (o->platforms & 0x7);
@ -696,7 +696,7 @@ static void FixStation(Station *s, OldStation *o, int num)
s->trainst_w = w; s->trainst_w = w;
s->trainst_h = h; s->trainst_h = h;
} }
s->string_id = RemapOldStringID(o->string_id); s->string_id = RemapOldStringID(o->string_id);
s->had_vehicle_of_type = o->had_vehicle_of_type; s->had_vehicle_of_type = o->had_vehicle_of_type;
FixGoodsEntry(s->goods, o->goods, lengthof(o->goods)); FixGoodsEntry(s->goods, o->goods, lengthof(o->goods));
@ -727,7 +727,7 @@ static void FixVehicle(Vehicle *n, OldVehicle *o, int num)
do { do {
n->type = o->type; n->type = o->type;
n->subtype = o->subtype; n->subtype = o->subtype;
if (o->schedule_ptr == 0xFFFFFFFF || o->schedule_ptr == 0) { if (o->schedule_ptr == 0xFFFFFFFF || o->schedule_ptr == 0) {
n->schedule_ptr = NULL; n->schedule_ptr = NULL;
} else { } else {
@ -758,7 +758,7 @@ static void FixVehicle(Vehicle *n, OldVehicle *o, int num)
n->owner = o->owner; n->owner = o->owner;
n->tile = o->tile; n->tile = o->tile;
n->cur_image = o->cur_image; n->cur_image = o->cur_image;
n->vehstatus = o->vehstatus; n->vehstatus = o->vehstatus;
n->cur_speed = o->cur_speed; n->cur_speed = o->cur_speed;
n->subspeed = o->subspeed; n->subspeed = o->subspeed;
@ -787,7 +787,7 @@ static void FixVehicle(Vehicle *n, OldVehicle *o, int num)
n->next = o->next_in_chain == 0xffff ? NULL : &_vehicles[o->next_in_chain]; n->next = o->next_in_chain == 0xffff ? NULL : &_vehicles[o->next_in_chain];
n->value = o->value; n->value = o->value;
n->string_id = RemapOldStringID(o->string_id); n->string_id = RemapOldStringID(o->string_id);
switch(o->type) { switch(o->type) {
case VEH_Train: case VEH_Train:
n->u.rail.track = o->u.rail.track; n->u.rail.track = o->u.rail.track;
@ -864,7 +864,7 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
{ {
int i, j; int i, j;
int x = 0; int x = 0;
do { do {
n->name_1 = RemapOldStringID(o->name_1); n->name_1 = RemapOldStringID(o->name_1);
n->name_2 = o->name_2; n->name_2 = o->name_2;
@ -882,15 +882,15 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
if (o->name_1 != 0) if (o->name_1 != 0)
n->is_active = true; n->is_active = true;
n->face = o->face; n->face = o->face;
n->president_name_1 = o->pres_name_1; n->president_name_1 = o->pres_name_1;
n->president_name_2 = o->pres_name_2; n->president_name_2 = o->pres_name_2;
n->money64 = n->player_money = o->money; n->money64 = n->player_money = o->money;
n->current_loan = o->loan; n->current_loan = o->loan;
// Correct money for scenario loading. // Correct money for scenario loading.
// It's always 893288 pounds (and no loan), if not corrected // It's always 893288 pounds (and no loan), if not corrected
if(o->money==0xda168) if(o->money==0xda168)
n->money64 = n->player_money = n->current_loan =100000; n->money64 = n->player_money = n->current_loan =100000;
@ -905,7 +905,7 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
n->bankrupt_value = o->bankrupt_value; n->bankrupt_value = o->bankrupt_value;
n->bankrupt_timeout = o->bankrupt_timeout; n->bankrupt_timeout = o->bankrupt_timeout;
n->cargo_types = o->cargo_types; n->cargo_types = o->cargo_types;
for(i=0; i!=3; i++) for(i=0; i!=3; i++)
for(j=0; j!=13; j++) for(j=0; j!=13; j++)
n->yearly_expenses[i][j] = o->expenses[i].cost[j]; n->yearly_expenses[i][j] = o->expenses[i].cost[j];
@ -916,7 +916,7 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
n->last_build_coordinate = o->last_build_coordinate; n->last_build_coordinate = o->last_build_coordinate;
n->num_valid_stat_ent = o->num_valid_stat_ent; n->num_valid_stat_ent = o->num_valid_stat_ent;
/* Not good, since AI doesn't have a vehicle assigned as /* Not good, since AI doesn't have a vehicle assigned as
* in p->ai.cur_veh and thus will crash on certain actions. * in p->ai.cur_veh and thus will crash on certain actions.
* Best is to set state to AiStateVehLoop (2) * Best is to set state to AiStateVehLoop (2)
* n->ai.state = o->ai_state; * n->ai.state = o->ai_state;
@ -927,18 +927,18 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
n->ai.timeout_counter = o->ai_timeout_counter; n->ai.timeout_counter = o->ai_timeout_counter;
n->ai.banned_tile_count = o->ai_banned_tile_count; n->ai.banned_tile_count = o->ai_banned_tile_count;
n->ai.railtype_to_use = o->ai_railtype_to_use; n->ai.railtype_to_use = o->ai_railtype_to_use;
FixAiBuildRec(&n->ai.src, &o->ai_src); FixAiBuildRec(&n->ai.src, &o->ai_src);
FixAiBuildRec(&n->ai.dst, &o->ai_dst); FixAiBuildRec(&n->ai.dst, &o->ai_dst);
FixAiBuildRec(&n->ai.mid1, &o->ai_mid1); FixAiBuildRec(&n->ai.mid1, &o->ai_mid1);
FixAiBuildRec(&n->ai.mid2, &o->ai_mid2); FixAiBuildRec(&n->ai.mid2, &o->ai_mid2);
n->ai.cargo_type = o->ai_cargo_type; n->ai.cargo_type = o->ai_cargo_type;
n->ai.num_wagons = o->ai_num_wagons; n->ai.num_wagons = o->ai_num_wagons;
n->ai.num_build_rec = o->ai_num_build_rec; n->ai.num_build_rec = o->ai_num_build_rec;
n->ai.num_loco_to_build = o->ai_num_loco_to_build; n->ai.num_loco_to_build = o->ai_num_loco_to_build;
n->ai.num_want_fullload = o->ai_num_want_fullload; n->ai.num_want_fullload = o->ai_num_want_fullload;
for(i=0; i!=9; i++) n->ai.wagon_list[i] = o->ai_wagonlist[i]; for(i=0; i!=9; i++) n->ai.wagon_list[i] = o->ai_wagonlist[i];
memcpy(n->ai.order_list_blocks, o->ai_order_list_blocks, 20); memcpy(n->ai.order_list_blocks, o->ai_order_list_blocks, 20);
n->ai.start_tile_a = o->ai_start_tile_a; n->ai.start_tile_a = o->ai_start_tile_a;
@ -949,7 +949,7 @@ static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type)
n->ai.start_dir_b = o->ai_start_dir_b; n->ai.start_dir_b = o->ai_start_dir_b;
n->ai.cur_dir_a = o->ai_cur_dir_a; n->ai.cur_dir_a = o->ai_cur_dir_a;
n->ai.cur_dir_b = o->ai_cur_dir_b; n->ai.cur_dir_b = o->ai_cur_dir_b;
for(i=0; i!=16; i++) { for(i=0; i!=16; i++) {
n->ai.banned_tiles[i] = o->banned_tiles[i].tile; n->ai.banned_tiles[i] = o->banned_tiles[i].tile;
n->ai.banned_val[i] = o->banned_tiles[i].data; n->ai.banned_val[i] = o->banned_tiles[i].data;
@ -1081,7 +1081,7 @@ bool LoadOldSaveGame(const char *file)
for(i=0; i!=256*256; i++) { for(i=0; i!=256*256; i++) {
if (IS_TILETYPE(i, MP_RAILWAY) && (_map5[i] & 0xC0) == 0x40) { if (IS_TILETYPE(i, MP_RAILWAY) && (_map5[i] & 0xC0) == 0x40) {
// this byte is always zero in real ttd. // this byte is always zero in real ttd.
if (_map3_hi[i]) { if (_map3_hi[i]) {
// convert ttdpatch presignal format to openttd presignal format. // convert ttdpatch presignal format to openttd presignal format.
_map3_hi[i] = (_map3_hi[i] >> 1) & 7; _map3_hi[i] = (_map3_hi[i] >> 1) & 7;
} }
@ -1098,7 +1098,7 @@ bool LoadOldSaveGame(const char *file)
FixDepot(_depots, m->depots, lengthof(m->depots)); FixDepot(_depots, m->depots, lengthof(m->depots));
FixVehicle(_vehicles, m->vehicles, lengthof(m->vehicles)); FixVehicle(_vehicles, m->vehicles, lengthof(m->vehicles));
FixSubsidy(_subsidies, m->subsidies, lengthof(m->subsidies)); FixSubsidy(_subsidies, m->subsidies, lengthof(m->subsidies));
FixPlayer(_players, m->players, lengthof(m->players), m->town_name_type); FixPlayer(_players, m->players, lengthof(m->players), m->town_name_type);
FixName(m->names, lengthof(m->names)); FixName(m->names, lengthof(m->names));
FixSign(_sign_list, m->signs, lengthof(m->signs)); FixSign(_sign_list, m->signs, lengthof(m->signs));
@ -1154,7 +1154,7 @@ bool LoadOldSaveGame(const char *file)
_cargo_payment_rates[i] = -(int32)m->cargo_payment_rates[i].price; _cargo_payment_rates[i] = -(int32)m->cargo_payment_rates[i].price;
_cargo_payment_rates_frac[i] = m->cargo_payment_rates[i].frac; _cargo_payment_rates_frac[i] = m->cargo_payment_rates[i].frac;
} }
free(m); free(m);
fclose(lss.fin); fclose(lss.fin);
return true; return true;

View File

@ -23,7 +23,7 @@ int32 CmdInsertOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// for ships, make sure that the station is not too far away from the previous destination. // for ships, make sure that the station is not too far away from the previous destination.
if (v->type == VEH_Ship && IS_HUMAN_PLAYER(v->owner) && if (v->type == VEH_Ship && IS_HUMAN_PLAYER(v->owner) &&
sel != 0 && ((t=v->schedule_ptr[sel-1])&OT_MASK) == OT_GOTO_STATION) { sel != 0 && ((t=v->schedule_ptr[sel-1])&OT_MASK) == OT_GOTO_STATION) {
int dist = GetTileDist(DEREF_STATION(t >> 8)->xy, DEREF_STATION(p2 >> 8)->xy); int dist = GetTileDist(DEREF_STATION(t >> 8)->xy, DEREF_STATION(p2 >> 8)->xy);
if (dist >= 130) if (dist >= 130)
return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO); return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO);
@ -39,7 +39,7 @@ int32 CmdInsertOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
s1[0] = (uint16)p2; s1[0] = (uint16)p2;
s1 = v->schedule_ptr; s1 = v->schedule_ptr;
FOR_ALL_VEHICLES(u) { FOR_ALL_VEHICLES(u) {
if (u->type != 0 && u->schedule_ptr != NULL) { if (u->type != 0 && u->schedule_ptr != NULL) {
if (s1 < u->schedule_ptr) { if (s1 < u->schedule_ptr) {
@ -69,10 +69,10 @@ static int32 DecloneOrder(Vehicle *dst, uint32 flags)
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
DeleteVehicleSchedule(dst); DeleteVehicleSchedule(dst);
dst->num_orders = 0; dst->num_orders = 0;
*(dst->schedule_ptr = _ptr_to_next_order++) = 0; *(dst->schedule_ptr = _ptr_to_next_order++) = 0;
InvalidateWindow(WC_VEHICLE_ORDERS, dst->index); InvalidateWindow(WC_VEHICLE_ORDERS, dst->index);
} }
return 0; return 0;
@ -92,7 +92,7 @@ int32 CmdDeleteOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
uint16 *s1; uint16 *s1;
s1 = &v->schedule_ptr[sel]; s1 = &v->schedule_ptr[sel];
// copy all orders to get rid of the hole // copy all orders to get rid of the hole
@ -119,7 +119,7 @@ int32 CmdDeleteOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
} }
} }
} }
return 0; return 0;
} }
@ -133,7 +133,7 @@ int32 CmdSkipOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
byte b = v->cur_order_index + 1; byte b = v->cur_order_index + 1;
if (b >= v->num_orders) b = 0; if (b >= v->num_orders) b = 0;
v->cur_order_index = b; v->cur_order_index = b;
if (v->type == VEH_Train) if (v->type == VEH_Train)
v->u.rail.days_since_order_progr = 0; v->u.rail.days_since_order_progr = 0;
} }
@ -160,7 +160,7 @@ int32 CmdModifyOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
return CMD_ERROR; return CMD_ERROR;
sched = &v->schedule_ptr[sel]; sched = &v->schedule_ptr[sel];
if (!((*sched & OT_MASK) == OT_GOTO_STATION || if (!((*sched & OT_MASK) == OT_GOTO_STATION ||
((*sched & OT_MASK) == OT_GOTO_DEPOT && (p2>>8) != 1))) ((*sched & OT_MASK) == OT_GOTO_DEPOT && (p2>>8) != 1)))
return CMD_ERROR; return CMD_ERROR;
@ -185,9 +185,9 @@ int32 CmdModifyOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (v->schedule_ptr == sched) if (v->schedule_ptr == sched)
InvalidateWindow(WC_VEHICLE_ORDERS, v->index); InvalidateWindow(WC_VEHICLE_ORDERS, v->index);
} }
} }
return 0; return 0;
} }
@ -204,12 +204,12 @@ int32 CmdModifyOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 CmdCloneOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdCloneOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
Vehicle *dst = &_vehicles[p1 & 0xFFFF]; Vehicle *dst = &_vehicles[p1 & 0xFFFF];
if (!(dst->type && dst->owner == _current_player)) if (!(dst->type && dst->owner == _current_player))
return CMD_ERROR; return CMD_ERROR;
switch(p2) { switch(p2) {
// share vehicle orders? // share vehicle orders?
case 0: { case 0: {
Vehicle *src = &_vehicles[p1 >> 16]; Vehicle *src = &_vehicles[p1 >> 16];
@ -217,7 +217,7 @@ int32 CmdCloneOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// sanity checks // sanity checks
if (!(src->owner == _current_player && dst->type == src->type && dst != src)) if (!(src->owner == _current_player && dst->type == src->type && dst != src))
return CMD_ERROR; return CMD_ERROR;
// let's see what happens with road vehicles // let's see what happens with road vehicles
if (src->type == VEH_Road) { if (src->type == VEH_Road) {
if (src->cargo_type != dst->cargo_type && (src->cargo_type == CT_PASSENGERS || dst->cargo_type == CT_PASSENGERS)) if (src->cargo_type != dst->cargo_type && (src->cargo_type == CT_PASSENGERS || dst->cargo_type == CT_PASSENGERS))
@ -243,14 +243,14 @@ int32 CmdCloneOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// sanity checks // sanity checks
if (!(src->owner == _current_player && dst->type == src->type && dst != src)) if (!(src->owner == _current_player && dst->type == src->type && dst != src))
return CMD_ERROR; return CMD_ERROR;
// let's see what happens with road vehicles // let's see what happens with road vehicles
if (src->type == VEH_Road) { if (src->type == VEH_Road) {
uint16 ord; uint16 ord;
int i; int i;
Station *st; Station *st;
TileIndex required_dst; TileIndex required_dst;
for (i=0; (ord = src->schedule_ptr[i]) != 0; i++) { for (i=0; (ord = src->schedule_ptr[i]) != 0; i++) {
if ( ( ord & OT_MASK ) == OT_GOTO_STATION ) { if ( ( ord & OT_MASK ) == OT_GOTO_STATION ) {
st = DEREF_STATION(ord >> 8); st = DEREF_STATION(ord >> 8);
@ -292,7 +292,7 @@ void BackupVehicleOrders(Vehicle *v, BackuppedOrders *bak)
bak->orderindex = v->cur_order_index; bak->orderindex = v->cur_order_index;
bak->service_interval = v->service_interval; bak->service_interval = v->service_interval;
if ((v->string_id & 0xF800) != 0x7800) { if ((v->string_id & 0xF800) != 0x7800) {
bak->name[0] = 0; bak->name[0] = 0;
} else { } else {
@ -306,7 +306,7 @@ void BackupVehicleOrders(Vehicle *v, BackuppedOrders *bak)
os[1] = u->index; os[1] = u->index;
return; return;
} }
sched = v->schedule_ptr; sched = v->schedule_ptr;
do { do {
ord = *sched++; ord = *sched++;
@ -325,7 +325,7 @@ void RestoreVehicleOrders(Vehicle *v, BackuppedOrders *bak)
} }
DoCommandP(0, v->index, bak->orderindex|(bak->service_interval<<16) , NULL, CMD_RESTORE_ORDER_INDEX | CMD_ASYNC); DoCommandP(0, v->index, bak->orderindex|(bak->service_interval<<16) , NULL, CMD_RESTORE_ORDER_INDEX | CMD_ASYNC);
os = bak->order; os = bak->order;
if (os[0] == 0xFFFF) { if (os[0] == 0xFFFF) {
DoCommandP(0, v->index | os[1]<<16, 0, NULL, CMD_CLONE_ORDER); DoCommandP(0, v->index | os[1]<<16, 0, NULL, CMD_CLONE_ORDER);
@ -359,7 +359,7 @@ int CheckOrders(Vehicle *v)
{ {
if (!_patches.order_review_system) //User doesn't want things to be checked if (!_patches.order_review_system) //User doesn't want things to be checked
return 0; return 0;
if ( (_patches.order_review_system == 1) && (v->vehstatus & VS_STOPPED) ) if ( (_patches.order_review_system == 1) && (v->vehstatus & VS_STOPPED) )
return 0; return 0;
@ -401,17 +401,17 @@ int CheckOrders(Vehicle *v)
if ( (v->schedule_ptr[0] == v->schedule_ptr[i-2]) && ( i-2 != 0 ) ) { if ( (v->schedule_ptr[0] == v->schedule_ptr[i-2]) && ( i-2 != 0 ) ) {
problem_type = 2; problem_type = 2;
} }
if (n_st < 2) problem_type = 0; if (n_st < 2) problem_type = 0;
if (!required_tile) problem_type = 3; if (!required_tile) problem_type = 3;
SET_DPARAM16(0, v->unitnumber); SET_DPARAM16(0, v->unitnumber);
message = (STR_TRAIN_HAS_TOO_FEW_ORDERS) + (((v->type) - VEH_Train) << 2) + problem_type; message = (STR_TRAIN_HAS_TOO_FEW_ORDERS) + (((v->type) - VEH_Train) << 2) + problem_type;
if (problem_type < 0) return 0; if (problem_type < 0) return 0;
AddNewsItem( AddNewsItem(
message, message,
NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),

View File

@ -58,7 +58,7 @@ static void DrawOrdersWindow(Window *w)
SetVScrollCount(w, num+1); SetVScrollCount(w, num+1);
sel = OrderGetSel(w); sel = OrderGetSel(w);
SET_DPARAM16(2,STR_8827_FULL_LOAD); SET_DPARAM16(2,STR_8827_FULL_LOAD);
switch(v->schedule_ptr[sel] & 0x1F) { switch(v->schedule_ptr[sel] & 0x1F) {
case OT_GOTO_STATION: case OT_GOTO_STATION:
@ -70,7 +70,7 @@ static void DrawOrdersWindow(Window *w)
default: default:
SETBIT(w->disabled_state, 6); /* nonstop */ SETBIT(w->disabled_state, 6); /* nonstop */
SETBIT(w->disabled_state, 8); /* full load */ SETBIT(w->disabled_state, 8); /* full load */
SETBIT(w->disabled_state, 9); /* unload */ SETBIT(w->disabled_state, 9); /* unload */
} }
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
@ -82,11 +82,11 @@ static void DrawOrdersWindow(Window *w)
i = 0; i = 0;
for(;;) { for(;;) {
str = ((byte)v->cur_order_index == i) ? STR_8805 : STR_8804; str = ((byte)v->cur_order_index == i) ? STR_8805 : STR_8804;
ord = v->schedule_ptr[i]; ord = v->schedule_ptr[i];
if ( (uint)(i - w->vscroll.pos) < 6) { if ( (uint)(i - w->vscroll.pos) < 6) {
if (ord == 0) { if (ord == 0) {
str = shared_schedule ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS; str = shared_schedule ? STR_END_OF_SHARED_ORDERS : STR_882A_END_OF_ORDERS;
} else { } else {
@ -149,7 +149,7 @@ static void *FindVehicleCallb(Vehicle *v, FindVehS *f)
{ {
if (v->tile != f->tile || v->owner != f->owner || v->vehstatus & VS_HIDDEN ) return NULL; if (v->tile != f->tile || v->owner != f->owner || v->vehstatus & VS_HIDDEN ) return NULL;
return v; return v;
} }
Vehicle *GetVehicleOnTile(TileIndex tile, byte owner) Vehicle *GetVehicleOnTile(TileIndex tile, byte owner)
{ {
@ -231,7 +231,7 @@ static bool HandleOrderVehClick(Vehicle *v, Vehicle *u, Window *w)
// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
// obviously if you press CTRL on a non-empty orders vehicle you know what you are doing // obviously if you press CTRL on a non-empty orders vehicle you know what you are doing
if (v->num_orders != 0 && _ctrl_pressed == 0) {return false;} if (v->num_orders != 0 && _ctrl_pressed == 0) {return false;}
if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? 0 : 1, NULL, if (DoCommandP(v->tile, v->index | (u->index << 16), _ctrl_pressed ? 0 : 1, NULL,
_ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) { _ctrl_pressed ? CMD_CLONE_ORDER | CMD_MSG(STR_CANT_SHARE_ORDER_LIST) : CMD_CLONE_ORDER | CMD_MSG(STR_CANT_COPY_ORDER_LIST))) {
WP(w,order_d).sel = -1; WP(w,order_d).sel = -1;
@ -245,7 +245,7 @@ static void OrdersPlaceObj(Vehicle *v, uint tile, Window *w)
{ {
uint cmd; uint cmd;
Vehicle *u; Vehicle *u;
// check if we're clicking on a vehicle first.. clone orders in that case. // check if we're clicking on a vehicle first.. clone orders in that case.
u = CheckMouseOverVehicle(); u = CheckMouseOverVehicle();
if (u && HandleOrderVehClick(v, u, w)) if (u && HandleOrderVehClick(v, u, w))
@ -273,7 +273,7 @@ static void OrdersWndProc(Window *w, WindowEvent *e)
Vehicle *v = &_vehicles[w->window_number]; Vehicle *v = &_vehicles[w->window_number];
int mode; int mode;
switch(e->click.widget) { switch(e->click.widget) {
case 2: {/* orders list */ case 2: {/* orders list */
int sel; int sel;
sel = (e->click.pt.y - 15) / 10; sel = (e->click.pt.y - 15) / 10;
@ -298,7 +298,7 @@ static void OrdersWndProc(Window *w, WindowEvent *e)
if (xy) if (xy)
ScrollMainWindowToTile(xy); ScrollMainWindowToTile(xy);
return; return;
} }
@ -383,7 +383,7 @@ static void OrdersWndProc(Window *w, WindowEvent *e)
HandleOrderVehClick(&_vehicles[w->window_number], v, w); HandleOrderVehClick(&_vehicles[w->window_number], v, w);
} }
} break; } break;
} }
} }
@ -556,7 +556,7 @@ void ShowOrdersWindow(Vehicle *v)
DeleteWindowById(WC_VEHICLE_ORDERS, veh); DeleteWindowById(WC_VEHICLE_ORDERS, veh);
DeleteWindowById(WC_VEHICLE_DETAILS, veh); DeleteWindowById(WC_VEHICLE_DETAILS, veh);
_alloc_wnd_parent_num = veh; _alloc_wnd_parent_num = veh;
w = AllocateWindowDesc( w = AllocateWindowDesc(
_order_window_desc[(v->type - VEH_Train)*2 + (v->owner != _local_player)]); _order_window_desc[(v->type - VEH_Train)*2 + (v->owner != _local_player)]);

View File

@ -37,7 +37,7 @@ static bool TPFSetTileBit(TrackPathFinder *tpf, uint tile, int dir)
return true; return true;
} else { } else {
/* two tiles with the same hash, need to make a link */ /* two tiles with the same hash, need to make a link */
/* allocate a link. if out of links, handle this by returning /* allocate a link. if out of links, handle this by returning
* that a tile was already visisted. */ * that a tile was already visisted. */
if (tpf->num_links_left == 0) if (tpf->num_links_left == 0)
@ -51,7 +51,7 @@ static bool TPFSetTileBit(TrackPathFinder *tpf, uint tile, int dir)
tpf->hash_tile[hash] = PATHFIND_GET_LINK_OFFS(tpf, link); tpf->hash_tile[hash] = PATHFIND_GET_LINK_OFFS(tpf, link);
link->flags = tpf->hash_head[hash]; link->flags = tpf->hash_head[hash];
tpf->hash_head[hash] = 0xFFFF; /* multi link */ tpf->hash_head[hash] = 0xFFFF; /* multi link */
link->next = 0xFFFF; link->next = 0xFFFF;
} }
@ -59,7 +59,7 @@ static bool TPFSetTileBit(TrackPathFinder *tpf, uint tile, int dir)
/* a linked list of many tiles, /* a linked list of many tiles,
* find the one corresponding to the tile, if it exists. * find the one corresponding to the tile, if it exists.
* otherwise make a new link */ * otherwise make a new link */
offs = tpf->hash_tile[hash]; offs = tpf->hash_tile[hash];
do { do {
link = PATHFIND_GET_LINK_PTR(tpf, offs); link = PATHFIND_GET_LINK_PTR(tpf, offs);
@ -74,7 +74,7 @@ static bool TPFSetTileBit(TrackPathFinder *tpf, uint tile, int dir)
} }
} while ((offs=link->next) != 0xFFFF); } while ((offs=link->next) != 0xFFFF);
} }
/* get here if we need to add a new link to link, /* get here if we need to add a new link to link,
* first, allocate a new link, in the same way as before */ * first, allocate a new link, in the same way as before */
if (tpf->num_links_left == 0) if (tpf->num_links_left == 0)
@ -130,12 +130,12 @@ void TPFMode2(TrackPathFinder *tpf, uint tile, int direction)
// This addition will sometimes overflow by a single tile. // This addition will sometimes overflow by a single tile.
// The use of TILE_MASK here makes sure that we still point at a valid // The use of TILE_MASK here makes sure that we still point at a valid
// tile, and then this tile will be in the sentinel row/col, so GetTileTrackStatus will fail. // tile, and then this tile will be in the sentinel row/col, so GetTileTrackStatus will fail.
tile = TILE_MASK(tile + _tileoffs_by_dir[direction]); tile = TILE_MASK(tile + _tileoffs_by_dir[direction]);
if (++tpf->rd.cur_length > 50) if (++tpf->rd.cur_length > 50)
return; return;
bits = GetTileTrackStatus(tile, tpf->tracktype); bits = GetTileTrackStatus(tile, tpf->tracktype);
bits = (byte)((bits | (bits >> 8)) & _bits_mask[direction]); bits = (byte)((bits | (bits >> 8)) & _bits_mask[direction]);
if (bits == 0) if (bits == 0)
@ -161,7 +161,7 @@ void TPFMode2(TrackPathFinder *tpf, uint tile, int direction)
// Change direction 4 times only // Change direction 4 times only
if ((byte)i != tpf->rd.pft_var6) { if ((byte)i != tpf->rd.pft_var6) {
if(++tpf->rd.depth > 4) { if(++tpf->rd.depth > 4) {
tpf->rd = rd; tpf->rd = rd;
return; return;
} }
tpf->rd.pft_var6 = (byte)i; tpf->rd.pft_var6 = (byte)i;
@ -169,7 +169,7 @@ void TPFMode2(TrackPathFinder *tpf, uint tile, int direction)
continue_here:; continue_here:;
tpf->the_dir = HASBIT(_otherdir_mask[direction],i) ? (i+8) : i; tpf->the_dir = HASBIT(_otherdir_mask[direction],i) ? (i+8) : i;
#ifdef DEBUG_TILE_PUSH #ifdef DEBUG_TILE_PUSH
dbg_push_tile(tile, tpf->the_dir); dbg_push_tile(tile, tpf->the_dir);
#endif #endif
@ -265,7 +265,7 @@ void TPFMode1(TrackPathFinder *tpf, uint tile, int direction)
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) && (_map5[tile] & 0xF0)==0) { if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) && (_map5[tile] & 0xF0)==0) {
if ((_map5[tile] & 3) != direction || ((_map5[tile]>>1)&6) != tpf->tracktype) if ((_map5[tile] & 3) != direction || ((_map5[tile]>>1)&6) != tpf->tracktype)
return; return;
tile = SkipToEndOfTunnel(tpf, tile, direction); tile = SkipToEndOfTunnel(tpf, tile, direction);
} }
tile += _tileoffs_by_dir[direction]; tile += _tileoffs_by_dir[direction];
tpf->rd.cur_length++; tpf->rd.cur_length++;
@ -286,7 +286,7 @@ void TPFMode1(TrackPathFinder *tpf, uint tile, int direction)
tpf->the_dir = (_otherdir_mask[direction] & (byte)(1 << i)) ? (i+8) : i; tpf->the_dir = (_otherdir_mask[direction] & (byte)(1 << i)) ? (i+8) : i;
rd = tpf->rd; rd = tpf->rd;
#ifdef DEBUG_TILE_PUSH #ifdef DEBUG_TILE_PUSH
dbg_push_tile(tile, tpf->the_dir); dbg_push_tile(tile, tpf->the_dir);
#endif #endif
@ -304,12 +304,12 @@ void TPFMode1(TrackPathFinder *tpf, uint tile, int direction)
/* the next is only used when signals are checked. /* the next is only used when signals are checked.
* seems to go in 2 directions simultaneously */ * seems to go in 2 directions simultaneously */
/* if i can get rid of this, tail end recursion can be used to minimize /* if i can get rid of this, tail end recursion can be used to minimize
* stack space dramatically. */ * stack space dramatically. */
if (tpf->hasbit_13) if (tpf->hasbit_13)
return; return;
tile = tile_org; tile = tile_org;
direction ^= 2; direction ^= 2;
@ -327,7 +327,7 @@ void TPFMode1(TrackPathFinder *tpf, uint tile, int direction)
do { do {
i = FIND_FIRST_BIT(bits); i = FIND_FIRST_BIT(bits);
bits = KILL_FIRST_BIT(bits); bits = KILL_FIRST_BIT(bits);
tpf->the_dir = (_otherdir_mask[direction] & (byte)(1 << i)) ? (i+8) : i; tpf->the_dir = (_otherdir_mask[direction] & (byte)(1 << i)) ? (i+8) : i;
rd = tpf->rd; rd = tpf->rd;
if (TPFSetTileBit(tpf, tile, tpf->the_dir) && if (TPFSetTileBit(tpf, tile, tpf->the_dir) &&
@ -344,16 +344,16 @@ void FollowTrack(uint tile, uint16 flags, byte direction, TPFEnumProc *enum_proc
assert(direction < 4); assert(direction < 4);
/* initialize path finder variables */ /* initialize path finder variables */
tpf->userdata = data; tpf->userdata = data;
tpf->enum_proc = enum_proc; tpf->enum_proc = enum_proc;
tpf->new_link = tpf->links; tpf->new_link = tpf->links;
tpf->num_links_left = 0x400; tpf->num_links_left = 0x400;
tpf->rd.cur_length = 0; tpf->rd.cur_length = 0;
tpf->rd.depth = 0; tpf->rd.depth = 0;
tpf->rd.pft_var6 = 0; tpf->rd.pft_var6 = 0;
tpf->var2 = HASBIT(flags, 15) ? 0x43 : 0xFF; /* 0x8000 */ tpf->var2 = HASBIT(flags, 15) ? 0x43 : 0xFF; /* 0x8000 */
tpf->disable_tile_hash = HASBIT(flags, 12) != 0; /* 0x1000 */ tpf->disable_tile_hash = HASBIT(flags, 12) != 0; /* 0x1000 */
@ -362,10 +362,10 @@ void FollowTrack(uint tile, uint16 flags, byte direction, TPFEnumProc *enum_proc
tpf->tracktype = (byte)flags; tpf->tracktype = (byte)flags;
if (HASBIT(flags, 11)) { if (HASBIT(flags, 11)) {
tpf->rd.pft_var6 = 0xFF; tpf->rd.pft_var6 = 0xFF;
tpf->enum_proc(tile, data, 0, 0, 0); tpf->enum_proc(tile, data, 0, 0, 0);
TPFMode2(tpf, tile, direction); TPFMode2(tpf, tile, direction);
} else { } else {
/* clear the hash_heads */ /* clear the hash_heads */
memset(tpf->hash_head, 0, sizeof(tpf->hash_head)); memset(tpf->hash_head, 0, sizeof(tpf->hash_head));
@ -373,7 +373,7 @@ void FollowTrack(uint tile, uint16 flags, byte direction, TPFEnumProc *enum_proc
} }
if (after_proc != NULL) if (after_proc != NULL)
after_proc(tpf); after_proc(tpf);
} }
typedef struct { typedef struct {
@ -439,10 +439,10 @@ static void INLINE HeapifyUp(NewTrackPathFinder *tpf)
{ {
StackedItem si; StackedItem si;
int i = ++tpf->nstack; int i = ++tpf->nstack;
while (i != 1 && ARR(i).cur_length < ARR(i>>1).cur_length) { while (i != 1 && ARR(i).cur_length < ARR(i>>1).cur_length) {
// the child element is larger than the parent item. // the child element is larger than the parent item.
// swap the child item and the parent item. // swap the child item and the parent item.
si = ARR(i); ARR(i) = ARR(i>>1); ARR(i>>1) = si; si = ARR(i); ARR(i) = ARR(i>>1); ARR(i>>1) = si;
i>>=1; i>>=1;
} }
@ -462,13 +462,13 @@ static void INLINE HeapifyDown(NewTrackPathFinder *tpf)
while ((j=i*2) <= n) { while ((j=i*2) <= n) {
// figure out which is smaller of the children. // figure out which is smaller of the children.
if (j != n && ARR(j).cur_length > ARR(j+1).cur_length) if (j != n && ARR(j).cur_length > ARR(j+1).cur_length)
j++; // right item is smaller j++; // right item is smaller
assert(i <= n && j <= n); assert(i <= n && j <= n);
if (ARR(i).cur_length <= ARR(j).cur_length) if (ARR(i).cur_length <= ARR(j).cur_length)
break; // base elem smaller than smallest, done! break; // base elem smaller than smallest, done!
// swap parent with the child // swap parent with the child
si = ARR(i); ARR(i) = ARR(j); ARR(j) = si; si = ARR(i); ARR(i) = ARR(j); ARR(j) = si;
i = j; i = j;
@ -484,7 +484,7 @@ static bool NtpVisit(NewTrackPathFinder *tpf, uint tile, uint dir, uint length)
HashLink *link, *new_link; HashLink *link, *new_link;
assert(length < 1024); assert(length < 1024);
hash = PATHFIND_HASH_TILE(tile); hash = PATHFIND_HASH_TILE(tile);
// never visited before? // never visited before?
@ -496,10 +496,10 @@ static bool NtpVisit(NewTrackPathFinder *tpf, uint tile, uint dir, uint length)
if (head != 0xffff) { if (head != 0xffff) {
if ( (TileIndex)tile == tpf->hash_tile[hash] && (head & 0x3) == dir ) { if ( (TileIndex)tile == tpf->hash_tile[hash] && (head & 0x3) == dir ) {
// longer length // longer length
if (length >= (head >> 2)) return false; if (length >= (head >> 2)) return false;
tpf->hash_head[hash] = dir | (length << 2); tpf->hash_head[hash] = dir | (length << 2);
return true; return true;
} }
@ -517,13 +517,13 @@ static bool NtpVisit(NewTrackPathFinder *tpf, uint tile, uint dir, uint length)
tpf->hash_tile[hash] = NTP_GET_LINK_OFFS(tpf, link); tpf->hash_tile[hash] = NTP_GET_LINK_OFFS(tpf, link);
link->typelength = tpf->hash_head[hash]; link->typelength = tpf->hash_head[hash];
tpf->hash_head[hash] = 0xFFFF; /* multi link */ tpf->hash_head[hash] = 0xFFFF; /* multi link */
link->next = 0xFFFF; link->next = 0xFFFF;
} else { } else {
// a linked list of many tiles, // a linked list of many tiles,
// find the one corresponding to the tile, if it exists. // find the one corresponding to the tile, if it exists.
// otherwise make a new link // otherwise make a new link
uint offs = tpf->hash_tile[hash]; uint offs = tpf->hash_tile[hash];
do { do {
link = NTP_GET_LINK_PTR(tpf, offs); link = NTP_GET_LINK_PTR(tpf, offs);
@ -534,7 +534,7 @@ static bool NtpVisit(NewTrackPathFinder *tpf, uint tile, uint dir, uint length)
} }
} while ((offs=link->next) != 0xFFFF); } while ((offs=link->next) != 0xFFFF);
} }
/* get here if we need to add a new link to link, /* get here if we need to add a new link to link,
* first, allocate a new link, in the same way as before */ * first, allocate a new link, in the same way as before */
if (tpf->num_links_left == 0) if (tpf->num_links_left == 0)
@ -613,7 +613,7 @@ restart:
for(;;) { for(;;) {
tile += _tileoffs_by_dir[direction]; tile += _tileoffs_by_dir[direction];
// too long search length? bail out. // too long search length? bail out.
if (++si.cur_length >= tpf->maxlength) if (++si.cur_length >= tpf->maxlength)
goto popnext; goto popnext;
@ -628,7 +628,7 @@ restart:
// regular rail tile, determine the tracks that are actually reachable. // regular rail tile, determine the tracks that are actually reachable.
bits &= _bits_mask[direction]; bits &= _bits_mask[direction];
if (bits == 0) goto popnext; // no tracks there? stop searching. if (bits == 0) goto popnext; // no tracks there? stop searching.
// complex tile?, let the generic handler handle that.. // complex tile?, let the generic handler handle that..
if (KILL_FIRST_BIT(bits) != 0) break; if (KILL_FIRST_BIT(bits) != 0) break;
@ -656,16 +656,16 @@ restart:
// too high recursion depth.. bail out.. // too high recursion depth.. bail out..
if (si.depth >= _patches.pf_maxdepth) if (si.depth >= _patches.pf_maxdepth)
goto popnext; goto popnext;
si.depth++; // increase recursion depth. si.depth++; // increase recursion depth.
// see if this tile was already visited..? // see if this tile was already visited..?
if (NtpVisit(tpf, tile, direction, si.cur_length)) { if (NtpVisit(tpf, tile, direction, si.cur_length)) {
// push all possible alternatives // push all possible alternatives
si.tile = tile; si.tile = tile;
do { do {
si.track = _new_track[FIND_FIRST_BIT(bits)][direction]; si.track = _new_track[FIND_FIRST_BIT(bits)][direction];
// out of stack items, bail out? // out of stack items, bail out?
if (tpf->nstack >= lengthof(tpf->stack)) if (tpf->nstack >= lengthof(tpf->stack))
break; break;
@ -678,11 +678,11 @@ restart:
// also randomize the order in which we search through them. // also randomize the order in which we search through them.
if (si.depth == 1) { if (si.depth == 1) {
uint32 r = Random(); uint32 r = Random();
assert(tpf->nstack == 2 || tpf->nstack == 3); assert(tpf->nstack == 2 || tpf->nstack == 3);
if (r&1) swap_byte(&tpf->stack[0].track, &tpf->stack[1].track); if (r&1) swap_byte(&tpf->stack[0].track, &tpf->stack[1].track);
if (tpf->nstack != 2) { if (tpf->nstack != 2) {
byte t = tpf->stack[2].track; byte t = tpf->stack[2].track;
if (r&2) swap_byte(&tpf->stack[0].track, &t); if (r&2) swap_byte(&tpf->stack[0].track, &t);
if (r&4) swap_byte(&tpf->stack[1].track, &t); if (r&4) swap_byte(&tpf->stack[1].track, &t);
tpf->stack[2].first_track = tpf->stack[2].track = t; tpf->stack[2].first_track = tpf->stack[2].track = t;
} }
@ -702,7 +702,7 @@ popnext:
!NtpCheck(tpf, tile, _tpf_prev_direction[si.track], si.cur_length) || // already have better path to that tile? !NtpCheck(tpf, tile, _tpf_prev_direction[si.track], si.cur_length) || // already have better path to that tile?
tpf->enum_proc(tile, tpf->userdata, si.track, si.cur_length, &si.state) tpf->enum_proc(tile, tpf->userdata, si.track, si.cur_length, &si.state)
); );
direction = _tpf_new_direction[si.track]; direction = _tpf_new_direction[si.track];
goto restart; goto restart;
} }
@ -718,7 +718,7 @@ void NewTrainPathfind(uint tile, byte direction, TPFEnumProc *enum_proc, void *d
tpf = alloca(sizeof(NewTrackPathFinder)); tpf = alloca(sizeof(NewTrackPathFinder));
tpf->userdata = data; tpf->userdata = data;
tpf->enum_proc = enum_proc; tpf->enum_proc = enum_proc;
tpf->tracktype = 0; tpf->tracktype = 0;
tpf->maxlength = _patches.pf_maxlength; tpf->maxlength = _patches.pf_maxlength;
tpf->nstack = 0; tpf->nstack = 0;

View File

@ -128,17 +128,17 @@ static void BuildRoadClick_Raise(Window *w)
static void BuildRoadClick_Depot(Window *w) static void BuildRoadClick_Depot(Window *w)
{ {
if (HandlePlacePushButton(w, 7, 0x511, 1, PlaceRoad_Depot)) ShowRoadDepotPicker(); if (HandlePlacePushButton(w, 7, 0x511, 1, PlaceRoad_Depot)) ShowRoadDepotPicker();
} }
static void BuildRoadClick_BusStation(Window *w) static void BuildRoadClick_BusStation(Window *w)
{ {
if (HandlePlacePushButton(w, 8, 0xAA5, 1, PlaceRoad_BusStation)) ShowBusStationPicker(); if (HandlePlacePushButton(w, 8, 0xAA5, 1, PlaceRoad_BusStation)) ShowBusStationPicker();
} }
static void BuildRoadClick_TruckStation(Window *w) static void BuildRoadClick_TruckStation(Window *w)
{ {
if (HandlePlacePushButton(w, 9, 0xAA6, 1, PlaceRoad_TruckStation)) ShowTruckStationPicker(); if (HandlePlacePushButton(w, 9, 0xAA6, 1, PlaceRoad_TruckStation)) ShowTruckStationPicker();
} }
static void BuildRoadClick_Bridge(Window *w) static void BuildRoadClick_Bridge(Window *w)
@ -244,7 +244,7 @@ static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) {
} else { } else {
sel_method = VPM_X_OR_Y; sel_method = VPM_X_OR_Y;
} }
VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, sel_method); VpSelectTilesWithMethod(e->place.pt.x, e->place.pt.y, sel_method);
return; return;
} }
@ -257,8 +257,8 @@ static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) {
ResetObjectToPlace(); ResetObjectToPlace();
ShowBuildBridgeWindow(start_tile, end_tile, 0x80); ShowBuildBridgeWindow(start_tile, end_tile, 0x80);
} else if (e->place.userdata != 4) { } else if (e->place.userdata != 4) {
DoCommandP(end_tile, start_tile, _place_road_flag, CcPlaySound1D, DoCommandP(end_tile, start_tile, _place_road_flag, CcPlaySound1D,
_remove_button_clicked ? _remove_button_clicked ?
CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1805_CAN_T_REMOVE_ROAD_FROM) : CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1805_CAN_T_REMOVE_ROAD_FROM) :
CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1804_CAN_T_BUILD_ROAD_HERE)); CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1804_CAN_T_BUILD_ROAD_HERE));
} else { } else {
@ -363,9 +363,9 @@ static void BuildRoadDepotWndProc(Window *w, WindowEvent *e) {
SndPlayFx(0x13); SndPlayFx(0x13);
SetWindowDirty(w); SetWindowDirty(w);
break; break;
} }
} break; } break;
case WE_MOUSELOOP: case WE_MOUSELOOP:
if (WP(w,def_d).close) if (WP(w,def_d).close)
DeleteWindow(w); DeleteWindow(w);
@ -445,7 +445,7 @@ static void RoadStationPickerWndProc(Window *w, WindowEvent *e) {
break; break;
} }
} break; } break;
case WE_MOUSELOOP: { case WE_MOUSELOOP: {
if (WP(w,def_d).close) { if (WP(w,def_d).close) {
DeleteWindow(w); DeleteWindow(w);
@ -454,7 +454,7 @@ static void RoadStationPickerWndProc(Window *w, WindowEvent *e) {
CheckRedrawStationCoverage(w); CheckRedrawStationCoverage(w);
} break; } break;
} }
} }
static const Widget _bus_station_picker_widgets[] = { static const Widget _bus_station_picker_widgets[] = {

View File

@ -38,7 +38,7 @@ static const byte _roadveh_spritenum[88] = {
0, 17, 17, 34, 51, 51, 51, 1, 0, 17, 17, 34, 51, 51, 51, 1,
18, 35, 2, 19, 36, 57, 57, 57, 18, 35, 2, 19, 36, 57, 57, 57,
3, 20, 37, 4, 21, 38, 5, 22, 3, 20, 37, 4, 21, 38, 5, 22,
39, 6, 23, 40, 7, 24, 41, 8, 39, 6, 23, 40, 7, 24, 41, 8,
25, 42, 9, 26, 43, 10, 27, 44, 25, 42, 9, 26, 43, 10, 27, 44,
11, 28, 45, 12, 29, 46, 13, 30, 11, 28, 45, 12, 29, 46, 13, 30,
@ -47,7 +47,7 @@ static const byte _roadveh_spritenum[88] = {
33, 50, 52, 52, 52, 53, 53, 53, 33, 50, 52, 52, 52, 53, 53, 53,
54, 54, 54, 55, 55, 55, 56, 56, 54, 54, 54, 55, 55, 55, 56, 56,
56, 58, 58, 58, 59, 59, 59, 60, 56, 58, 58, 58, 59, 59, 59, 60,
60, 60, 61, 61, 61, 62, 62, 62, 60, 60, 61, 61, 61, 62, 62, 62,
}; };
const byte _roadveh_speed[88] = { const byte _roadveh_speed[88] = {
@ -164,7 +164,7 @@ int GetRoadVehImage(Vehicle *v, byte direction)
img = _engine_original_sprites[v->engine_type]; img = _engine_original_sprites[v->engine_type];
} }
#endif #endif
image = direction + _roadveh_images[img]; image = direction + _roadveh_images[img];
if (v->cargo_count >= (v->cargo_cap >> 1)) if (v->cargo_count >= (v->cargo_cap >> 1))
image += _roadveh_full_adder[img]; image += _roadveh_full_adder[img];
@ -186,7 +186,7 @@ void DrawRoadVehEngineInfo(int engine, int x, int y, int maxw)
SET_DPARAM16(4, _roadveh_capacity[engine]); SET_DPARAM16(4, _roadveh_capacity[engine]);
SET_DPARAM16(3, _cargoc.names_long_p[_roadveh_cargo_type[engine]]); SET_DPARAM16(3, _cargoc.names_long_p[_roadveh_cargo_type[engine]]);
DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw); DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw);
} }
@ -202,7 +202,7 @@ int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
byte unit_num; byte unit_num;
uint tile = TILE_FROM_XY(x,y); uint tile = TILE_FROM_XY(x,y);
Engine *e; Engine *e;
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
cost = EstimateRoadVehCost(p1); cost = EstimateRoadVehCost(p1);
@ -256,7 +256,7 @@ int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->reliability_spd_dec = e->reliability_spd_dec; v->reliability_spd_dec = e->reliability_spd_dec;
v->max_age = e->lifelength * 366; v->max_age = e->lifelength * 366;
_new_roadveh_id = v->index; _new_roadveh_id = v->index;
v->string_id = STR_SV_ROADVEH_NAME; v->string_id = STR_SV_ROADVEH_NAME;
*(v->schedule_ptr = _ptr_to_next_order++) = 0; *(v->schedule_ptr = _ptr_to_next_order++) = 0;
@ -303,7 +303,7 @@ int32 CmdSellRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
Vehicle *v; Vehicle *v;
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
v = &_vehicles[p1]; v = &_vehicles[p1];
if (v->type != VEH_Road || !CheckOwnership(v->owner)) if (v->type != VEH_Road || !CheckOwnership(v->owner))
@ -311,7 +311,7 @@ int32 CmdSellRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (!IsRoadDepotTile(v->tile) || v->u.road.state != 254 || !(v->vehstatus&VS_STOPPED)) if (!IsRoadDepotTile(v->tile) || v->u.road.state != 254 || !(v->vehstatus&VS_STOPPED))
return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
// Invalidate depot // Invalidate depot
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@ -321,7 +321,7 @@ int32 CmdSellRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteWindowById(WC_VEHICLE_VIEW, v->index);
DeleteVehicle(v); DeleteVehicle(v);
} }
return -(int32)v->value; return -(int32)v->value;
} }
@ -351,7 +351,7 @@ static bool EnumRoadSignalFindDepot(uint tile, RoadFindDepotData *rfdd, int trac
if (IS_TILETYPE(tile, MP_STREET) && if (IS_TILETYPE(tile, MP_STREET) &&
(_map5[tile] & 0xF0) == 0x20 && (_map5[tile] & 0xF0) == 0x20 &&
_map_owner[tile] == rfdd->owner) { _map_owner[tile] == rfdd->owner) {
if (length < rfdd->best_length) { if (length < rfdd->best_length) {
rfdd->best_length = length; rfdd->best_length = length;
rfdd->tile = tile; rfdd->tile = tile;
@ -365,7 +365,7 @@ static int FindClosestRoadDepot(Vehicle *v)
uint tile = v->tile; uint tile = v->tile;
int i; int i;
RoadFindDepotData rfdd; RoadFindDepotData rfdd;
if (v->u.road.state == 255) { tile = GetVehicleOutOfTunnelTile(v); } if (v->u.road.state == 255) { tile = GetVehicleOutOfTunnelTile(v); }
rfdd.owner = v->owner; rfdd.owner = v->owner;
@ -409,7 +409,7 @@ int32 CmdSendRoadVehToDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->dest_tile = _depots[depot].xy; v->dest_tile = _depots[depot].xy;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
return 0; return 0;
} }
@ -430,10 +430,10 @@ int32 CmdTurnRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_error_message = STR_EMPTY; _error_message = STR_EMPTY;
return CMD_ERROR; return CMD_ERROR;
} }
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
v->u.road.reverse_ctr = 180; v->u.road.reverse_ctr = 180;
} }
return 0; return 0;
} }
@ -495,10 +495,10 @@ static void ClearCrashedStation(Vehicle *v)
// mark station as not busy // mark station as not busy
bb &= ~0x80; bb &= ~0x80;
// free parking bay // free parking bay
bb |= (v->u.road.state&0x02)?2:1; bb |= (v->u.road.state&0x02)?2:1;
*b = bb; *b = bb;
} }
@ -506,17 +506,17 @@ static void RoadVehDelete(Vehicle *v)
{ {
DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteWindowById(WC_VEHICLE_VIEW, v->index);
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
_vehicle_sort_dirty[VEHROAD] = true; // delete bus/truck (eg. crash for example) _vehicle_sort_dirty[VEHROAD] = true; // delete bus/truck (eg. crash for example)
InvalidateWindow(WC_ROADVEH_LIST, v->owner); InvalidateWindow(WC_ROADVEH_LIST, v->owner);
InvalidateWindow(WC_COMPANY, v->owner); InvalidateWindow(WC_COMPANY, v->owner);
if(IS_TILETYPE(v->tile, MP_STATION)) if(IS_TILETYPE(v->tile, MP_STATION))
ClearCrashedStation(v); ClearCrashedStation(v);
BeginVehicleMove(v); BeginVehicleMove(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
} }
@ -531,7 +531,7 @@ static byte SetRoadVehPosition(Vehicle *v, int x, int y)
old_z = v->z_pos; old_z = v->z_pos;
v->z_pos = new_z; v->z_pos = new_z;
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
return old_z; return old_z;
@ -621,10 +621,10 @@ static void HandleBrokenRoadVeh(Vehicle *v)
if (v->breakdowns_since_last_service != 255) if (v->breakdowns_since_last_service != 255)
v->breakdowns_since_last_service++; v->breakdowns_since_last_service++;
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xD : 0x34, v); SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xD : 0x34, v);
if (!(v->vehstatus & VS_HIDDEN)) { if (!(v->vehstatus & VS_HIDDEN)) {
@ -693,7 +693,7 @@ static void HandleRoadVehLoading(Vehicle *v)
{ {
if (v->next_order == OT_NOTHING) if (v->next_order == OT_NOTHING)
return; return;
if (v->next_order != OT_DUMMY) { if (v->next_order != OT_DUMMY) {
if ((v->next_order&OT_MASK) != OT_LOADING) if ((v->next_order&OT_MASK) != OT_LOADING)
return; return;
@ -709,7 +709,7 @@ static void HandleRoadVehLoading(Vehicle *v)
} }
return; return;
} }
{ {
byte b = v->next_order; byte b = v->next_order;
v->next_order = OT_LEAVESTATION; v->next_order = OT_LEAVESTATION;
@ -737,16 +737,16 @@ typedef struct RoadVehFindData {
void *EnumCheckRoadVehClose(Vehicle *v, RoadVehFindData *rvf) void *EnumCheckRoadVehClose(Vehicle *v, RoadVehFindData *rvf)
{ {
static const short _dists[] = { static const short _dists[] = {
-4, -8, -4, -1, 4, 8, 4, 1, -4, -8, -4, -1, 4, 8, 4, 1,
-4, -1, 4, 8, 4, 1, -4, -8, -4, -1, 4, 8, 4, 1, -4, -8,
}; };
short x_diff = v->x_pos - rvf->x; short x_diff = v->x_pos - rvf->x;
short y_diff = v->y_pos - rvf->y; short y_diff = v->y_pos - rvf->y;
if (rvf->veh == v || if (rvf->veh == v ||
v->type != VEH_Road || v->type != VEH_Road ||
v->u.road.state == 254 || v->u.road.state == 254 ||
myabs(v->z_pos - rvf->veh->z_pos) > 6 || myabs(v->z_pos - rvf->veh->z_pos) > 6 ||
v->direction != rvf->dir || v->direction != rvf->dir ||
@ -766,13 +766,13 @@ static Vehicle *RoadVehFindCloseTo(Vehicle *v, int x, int y, byte dir)
if (v->u.road.reverse_ctr != 0) if (v->u.road.reverse_ctr != 0)
return NULL; return NULL;
rvf.x = x; rvf.x = x;
rvf.y = y; rvf.y = y;
rvf.dir = dir; rvf.dir = dir;
rvf.veh = v; rvf.veh = v;
u = VehicleFromPos(TILE_FROM_XY(x,y), &rvf, (VehicleFromPosProc*)EnumCheckRoadVehClose); u = VehicleFromPos(TILE_FROM_XY(x,y), &rvf, (VehicleFromPosProc*)EnumCheckRoadVehClose);
// This code protects a roadvehicle from being blocked for ever // This code protects a roadvehicle from being blocked for ever
// If more then 1480 / 74 days a road vehicle is blocked, it will // If more then 1480 / 74 days a road vehicle is blocked, it will
// drive just through it. The ultimate backup-code of TTD. // drive just through it. The ultimate backup-code of TTD.
@ -784,7 +784,7 @@ static Vehicle *RoadVehFindCloseTo(Vehicle *v, int x, int y, byte dir)
if (++v->u.road.unk2 > 1480) if (++v->u.road.unk2 > 1480)
return NULL; return NULL;
return u; return u;
} }
@ -825,13 +825,13 @@ static bool RoadVehAccelerate(Vehicle *v)
{ {
uint spd = v->cur_speed + 1 + ((v->u.road.overtaking != 0)?1:0); uint spd = v->cur_speed + 1 + ((v->u.road.overtaking != 0)?1:0);
byte t; byte t;
// Clamp // Clamp
spd = min(spd, v->max_speed); spd = min(spd, v->max_speed);
//updates statusbar only if speed have changed to save CPU time //updates statusbar only if speed have changed to save CPU time
if (spd != v->cur_speed) { if (spd != v->cur_speed) {
v->cur_speed = spd; v->cur_speed = spd;
if (_patches.vehicle_speed) if (_patches.vehicle_speed)
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
@ -858,7 +858,7 @@ static byte RoadVehGetNewDirection(Vehicle *v, int x, int y)
1, 0, 5, 0, 1, 0, 5, 0,
2, 3, 4 2, 3, 4
}; };
x = x - v->x_pos + 1; x = x - v->x_pos + 1;
y = y - v->y_pos + 1; y = y - v->y_pos + 1;
@ -878,7 +878,7 @@ static byte RoadVehGetSlidingDirection(Vehicle *v, int x, int y)
if (b==d) return d; if (b==d) return d;
if (b==((d-1)&7)) return d; if (b==((d-1)&7)) return d;
if (b==((d-2)&7)) return d; if (b==((d-2)&7)) return d;
return (d+2)&7; return (d+2)&7;
} }
typedef struct OvertakeData { typedef struct OvertakeData {
@ -890,11 +890,11 @@ typedef struct OvertakeData {
void *EnumFindVehToOvertake(Vehicle *v, OvertakeData *od) void *EnumFindVehToOvertake(Vehicle *v, OvertakeData *od)
{ {
if (v->tile != (TileIndex)od->tile || if (v->tile != (TileIndex)od->tile ||
v->type != VEH_Road || v->type != VEH_Road ||
v == od->u || v == od->u ||
v == od->v) v == od->v)
return NULL; return NULL;
return v; return v;
} }
static bool FindRoadVehToOvertake(OvertakeData *od) static bool FindRoadVehToOvertake(OvertakeData *od)
@ -1078,7 +1078,7 @@ do_it:;
if (desttile == tile && bitmask&_road_pf_table_3[m5&3]) { if (desttile == tile && bitmask&_road_pf_table_3[m5&3]) {
return_track(FindFirstBit2x64(bitmask&_road_pf_table_3[m5&3])); return_track(FindFirstBit2x64(bitmask&_road_pf_table_3[m5&3]));
} }
} }
} }
// do pathfind // do pathfind
frd.dest = desttile; frd.dest = desttile;
@ -1107,7 +1107,7 @@ found_best_track:;
if (HASBIT(signal, best_track)) if (HASBIT(signal, best_track))
return -1; return -1;
return best_track; return best_track;
} }
typedef struct RoadDriveEntry { typedef struct RoadDriveEntry {
@ -1173,13 +1173,13 @@ static void RoadVehEventHandler(Vehicle *v)
byte rd2; byte rd2;
v->cur_speed = 0; v->cur_speed = 0;
dir = _map5[v->tile]&3; dir = _map5[v->tile]&3;
v->direction = dir*2+1; v->direction = dir*2+1;
rd2 = _roadveh_data_2[dir]; rd2 = _roadveh_data_2[dir];
rdp = _road_drive_data[(_opt.road_side<<4) + rd2]; rdp = _road_drive_data[(_opt.road_side<<4) + rd2];
x = GET_TILE_X(v->tile)*16 + (rdp[6].x&0xF); x = GET_TILE_X(v->tile)*16 + (rdp[6].x&0xF);
y = GET_TILE_Y(v->tile)*16 + (rdp[6].y&0xF); y = GET_TILE_Y(v->tile)*16 + (rdp[6].y&0xF);
@ -1193,7 +1193,7 @@ static void RoadVehEventHandler(Vehicle *v)
v->vehstatus &= ~VS_HIDDEN; v->vehstatus &= ~VS_HIDDEN;
v->u.road.state = rd2; v->u.road.state = rd2;
v->u.road.frame = 6; v->u.road.frame = 6;
v->cur_image = GetRoadVehImage(v, v->direction); v->cur_image = GetRoadVehImage(v, v->direction);
UpdateRoadVehDeltaXY(v); UpdateRoadVehDeltaXY(v);
SetRoadVehPosition(v,x,y); SetRoadVehPosition(v,x,y);
@ -1223,7 +1223,7 @@ static void RoadVehEventHandler(Vehicle *v)
if (IS_TILETYPE(gp.new_tile, MP_TUNNELBRIDGE) && if (IS_TILETYPE(gp.new_tile, MP_TUNNELBRIDGE) &&
(_map5[gp.new_tile]&0xF0) == 0 && (_map5[gp.new_tile]&0xF0) == 0 &&
(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y)&4)) { (VehicleEnterTile(v, gp.new_tile, gp.x, gp.y)&4)) {
//new_dir = RoadGetNewDirection(v, gp.x, gp.y) //new_dir = RoadGetNewDirection(v, gp.x, gp.y)
v->cur_image = GetRoadVehImage(v, v->direction); v->cur_image = GetRoadVehImage(v, v->direction);
UpdateRoadVehDeltaXY(v); UpdateRoadVehDeltaXY(v);
@ -1353,7 +1353,7 @@ again:
x = (v->x_pos&~15)+(rd.x&15); x = (v->x_pos&~15)+(rd.x&15);
y = (v->y_pos&~15)+(rd.y&15); y = (v->y_pos&~15)+(rd.y&15);
new_dir = RoadVehGetSlidingDirection(v, x, y); new_dir = RoadVehGetSlidingDirection(v, x, y);
if (!IS_BYTE_INSIDE(v->u.road.state, 0x20, 0x30) && (u=RoadVehFindCloseTo(v, x, y, new_dir)) != NULL) { if (!IS_BYTE_INSIDE(v->u.road.state, 0x20, 0x30) && (u=RoadVehFindCloseTo(v, x, y, new_dir)) != NULL) {
@ -1383,7 +1383,7 @@ again:
if ( (v->next_order&OT_MASK) != OT_LEAVESTATION && if ( (v->next_order&OT_MASK) != OT_LEAVESTATION &&
(v->next_order&OT_MASK) != OT_GOTO_DEPOT) { (v->next_order&OT_MASK) != OT_GOTO_DEPOT) {
*b &= ~0x80; *b &= ~0x80;
v->last_station_visited = _map2[v->tile]; v->last_station_visited = _map2[v->tile];
@ -1393,7 +1393,7 @@ again:
old_order = v->next_order; old_order = v->next_order;
v->next_order = OT_LOADING; v->next_order = OT_LOADING;
if ((old_order & OT_MASK) == OT_GOTO_STATION && if ((old_order & OT_MASK) == OT_GOTO_STATION &&
v->next_order_param == v->last_station_visited) { v->next_order_param == v->last_station_visited) {
v->next_order = OT_LOADING | OF_NON_STOP | (old_order & (OF_FULL_LOAD|OF_UNLOAD)); v->next_order = OT_LOADING | OF_NON_STOP | (old_order & (OF_FULL_LOAD|OF_UNLOAD));
} }
@ -1449,10 +1449,10 @@ void RoadVehEnterDepot(Vehicle *v)
MaybeRenewVehicle(v, EstimateRoadVehCost(v->engine_type)); MaybeRenewVehicle(v, EstimateRoadVehCost(v->engine_type));
if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) { if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) {
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
t = v->next_order; t = v->next_order;
v->next_order = OT_DUMMY; v->next_order = OT_DUMMY;
@ -1504,7 +1504,7 @@ static void CheckIfRoadVehNeedsService(Vehicle *v)
if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr)) if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr))
return; return;
// Don't interfere with a depot visit scheduled by the user, or a // Don't interfere with a depot visit scheduled by the user, or a
// depot visit by the order list. // depot visit by the order list.
if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT && if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT &&
@ -1527,7 +1527,7 @@ static void CheckIfRoadVehNeedsService(Vehicle *v)
v->next_order = OT_GOTO_DEPOT | OF_NON_STOP; v->next_order = OT_GOTO_DEPOT | OF_NON_STOP;
v->next_order_param = (byte)i; v->next_order_param = (byte)i;
v->dest_tile = (&_depots[i])->xy; v->dest_tile = (&_depots[i])->xy;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
void OnNewDay_RoadVeh(Vehicle *v) void OnNewDay_RoadVeh(Vehicle *v)

View File

@ -51,7 +51,7 @@ static void RoadVehDetailsWndProc(Window *w, WindowEvent *e)
StringID str; StringID str;
SET_DPARAM16(1, year); SET_DPARAM16(1, year);
str = STR_0199_YEAR; str = STR_0199_YEAR;
if (year != 1) { if (year != 1) {
str++; str++;
@ -97,7 +97,7 @@ static void RoadVehDetailsWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(1, 1920 + v->build_year); SET_DPARAM16(1, 1920 + v->build_year);
SET_DPARAM32(2, v->value); SET_DPARAM32(2, v->value);
DrawString(34, 57, STR_9011_BUILT_VALUE, 0); DrawString(34, 57, STR_9011_BUILT_VALUE, 0);
SET_DPARAM16(0, _cargoc.names_long_p[v->cargo_type]); SET_DPARAM16(0, _cargoc.names_long_p[v->cargo_type]);
SET_DPARAM16(1, v->cargo_cap); SET_DPARAM16(1, v->cargo_cap);
DrawString(34, 67, STR_9012_CAPACITY, 0); DrawString(34, 67, STR_9012_CAPACITY, 0);
@ -180,7 +180,7 @@ static void ShowRoadVehDetailsWindow(Vehicle *v)
VehicleID veh = v->index; VehicleID veh = v->index;
DeleteWindowById(WC_VEHICLE_ORDERS, veh); DeleteWindowById(WC_VEHICLE_ORDERS, veh);
DeleteWindowById(WC_VEHICLE_DETAILS, veh); DeleteWindowById(WC_VEHICLE_DETAILS, veh);
_alloc_wnd_parent_num = veh; _alloc_wnd_parent_num = veh;
w = AllocateWindowDesc(&_roadveh_details_desc); w = AllocateWindowDesc(&_roadveh_details_desc);
w->window_number = veh; w->window_number = veh;
w->caption_color = v->owner; w->caption_color = v->owner;
@ -242,13 +242,13 @@ static void RoadVehViewWndProc(Window *w, WindowEvent *e)
DrawStringCentered(125, 105, str, 0); DrawStringCentered(125, 105, str, 0);
DrawWindowViewport(w); DrawWindowViewport(w);
} break; } break;
case WE_CLICK: { case WE_CLICK: {
Vehicle *v = &_vehicles[w->window_number]; Vehicle *v = &_vehicles[w->window_number];
switch(e->click.widget) { switch(e->click.widget) {
case 4: /* start stop */ case 4: /* start stop */
DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_ROADVEH | CMD_MSG(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE)); DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_ROADVEH | CMD_MSG(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE));
break; break;
case 5: /* center main view */ case 5: /* center main view */
ScrollMainWindowTo(v->x_pos, v->y_pos); ScrollMainWindowTo(v->x_pos, v->y_pos);
@ -267,11 +267,11 @@ static void RoadVehViewWndProc(Window *w, WindowEvent *e)
break; break;
} }
} break; } break;
case WE_DESTROY: case WE_DESTROY:
DeleteWindowById(WC_VEHICLE_ORDERS, w->window_number); DeleteWindowById(WC_VEHICLE_ORDERS, w->window_number);
DeleteWindowById(WC_VEHICLE_DETAILS, w->window_number); DeleteWindowById(WC_VEHICLE_DETAILS, w->window_number);
break; break;
} }
} }
@ -348,7 +348,7 @@ static void DrawNewRoadVehWindow(Window *w)
DrawRoadVehEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); DrawRoadVehEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)));
y += 14; y += 14;
} }
sel--; sel--;
} }
} while (++engine_id, ++e,--num); } while (++engine_id, ++e,--num);
@ -362,12 +362,12 @@ static void DrawNewRoadVehWindow(Window *w)
SET_DPARAM16(4, _roadveh_capacity[selected_id - ROAD_ENGINES_INDEX]); SET_DPARAM16(4, _roadveh_capacity[selected_id - ROAD_ENGINES_INDEX]);
SET_DPARAM16(3, _cargoc.names_long_p[_roadveh_cargo_type[selected_id - ROAD_ENGINES_INDEX]]); SET_DPARAM16(3, _cargoc.names_long_p[_roadveh_cargo_type[selected_id - ROAD_ENGINES_INDEX]]);
e = &_engines[selected_id]; e = &_engines[selected_id];
SET_DPARAM16(6, e->lifelength); SET_DPARAM16(6, e->lifelength);
SET_DPARAM8(7, e->reliability * 100 >> 16); SET_DPARAM8(7, e->reliability * 100 >> 16);
ConvertDayToYMD(&ymd, e->intro_date); ConvertDayToYMD(&ymd, e->intro_date);
SET_DPARAM16(5, ymd.year + 1920); SET_DPARAM16(5, ymd.year + 1920);
DrawString(2, 127, STR_9008_COST_SPEED_RUNNING_COST, 0); DrawString(2, 127, STR_9008_COST_SPEED_RUNNING_COST, 0);
} }
} }
@ -419,7 +419,7 @@ static void NewRoadVehWndProc(Window *w, WindowEvent *e)
160, 160,
w->window_class, w->window_class,
w->window_number); w->window_number);
break; break;
} }
break; break;
@ -436,8 +436,8 @@ static void NewRoadVehWndProc(Window *w, WindowEvent *e)
memcpy(_decode_parameters, b, 32); memcpy(_decode_parameters, b, 32);
DoCommandP(0, WP(w,buildtrain_d).rename_engine, 0, NULL, CMD_RENAME_ENGINE | CMD_MSG(STR_9037_CAN_T_RENAME_ROAD_VEHICLE)); DoCommandP(0, WP(w,buildtrain_d).rename_engine, 0, NULL, CMD_RENAME_ENGINE | CMD_MSG(STR_9037_CAN_T_RENAME_ROAD_VEHICLE));
} break; } break;
} }
} }
static const Widget _new_road_veh_widgets[] = { static const Widget _new_road_veh_widgets[] = {
@ -468,7 +468,7 @@ static void ShowBuildRoadVehWindow(TileIndex tile)
w = AllocateWindowDesc(&_new_road_veh_desc); w = AllocateWindowDesc(&_new_road_veh_desc);
w->window_number = tile; w->window_number = tile;
w->vscroll.cap = 8; w->vscroll.cap = 8;
if (tile != 0) { if (tile != 0) {
w->caption_color = _map_owner[tile]; w->caption_color = _map_owner[tile];
} else { } else {
@ -509,17 +509,17 @@ static void DrawRoadDepotWindow(Window *w)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Road && if (v->type == VEH_Road &&
v->u.road.state == 254 && v->u.road.state == 254 &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
--num < 0 && num >= -15) { --num < 0 && num >= -15) {
DrawRoadVehImage(v, x+24, y, WP(w,traindepot_d).sel); DrawRoadVehImage(v, x+24, y, WP(w,traindepot_d).sel);
SET_DPARAM16(0, v->unitnumber); SET_DPARAM16(0, v->unitnumber);
DrawString(x, y+2, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, 0); DrawString(x, y+2, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, 0);
DrawSprite( (v->vehstatus & VS_STOPPED) ? 0xC12 : 0xC13, x + 16, y); DrawSprite( (v->vehstatus & VS_STOPPED) ? 0xC12 : 0xC13, x + 16, y);
if ((x+=56) == 2+56*5) { if ((x+=56) == 2+56*5) {
x = 2; x = 2;
y += 14; y += 14;
@ -534,7 +534,7 @@ static int GetVehicleFromRoadDepotWndPt(Window *w, int x, int y, Vehicle **veh)
TileIndex tile; TileIndex tile;
Vehicle *v; Vehicle *v;
int pos; int pos;
xt = x / 56; xt = x / 56;
xm = x % 56; xm = x % 56;
if (xt >= 5) if (xt >= 5)
@ -549,7 +549,7 @@ static int GetVehicleFromRoadDepotWndPt(Window *w, int x, int y, Vehicle **veh)
tile = w->window_number; tile = w->window_number;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Road && if (v->type == VEH_Road &&
v->u.road.state == 254 && v->u.road.state == 254 &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
--pos < 0) { --pos < 0) {
*veh = v; *veh = v;
@ -611,7 +611,7 @@ static void RoadDepotWndProc(Window *w, WindowEvent *e)
case 2: case 2:
RoadDepotClickVeh(w, e->click.pt.x, e->click.pt.y); RoadDepotClickVeh(w, e->click.pt.x, e->click.pt.y);
break; break;
case 5: case 5:
ShowBuildRoadVehWindow(w->window_number); ShowBuildRoadVehWindow(w->window_number);
break; break;
@ -621,7 +621,7 @@ static void RoadDepotWndProc(Window *w, WindowEvent *e)
break; break;
} }
} break; } break;
case WE_DESTROY: case WE_DESTROY:
DeleteWindowById(WC_BUILD_VEHICLE, w->window_number); DeleteWindowById(WC_BUILD_VEHICLE, w->window_number);
break; break;
@ -641,12 +641,12 @@ static void RoadDepotWndProc(Window *w, WindowEvent *e)
ShowRoadVehViewWindow(v); ShowRoadVehViewWindow(v);
} }
} break; } break;
case 3: case 3:
if (!HASBIT(w->disabled_state, 3) && if (!HASBIT(w->disabled_state, 3) &&
WP(w,traindepot_d).sel != INVALID_VEHICLE) { WP(w,traindepot_d).sel != INVALID_VEHICLE) {
Vehicle *v; Vehicle *v;
HandleButtonClick(w, 3); HandleButtonClick(w, 3);
v = &_vehicles[WP(w,traindepot_d).sel]; v = &_vehicles[WP(w,traindepot_d).sel];
@ -654,7 +654,7 @@ static void RoadDepotWndProc(Window *w, WindowEvent *e)
_backup_orders_tile = v->tile; _backup_orders_tile = v->tile;
BackupVehicleOrders(v, _backup_orders_data); BackupVehicleOrders(v, _backup_orders_data);
if (!DoCommandP(v->tile, v->index, 0, NULL, CMD_SELL_ROAD_VEH | CMD_MSG(STR_9014_CAN_T_SELL_ROAD_VEHICLE))) if (!DoCommandP(v->tile, v->index, 0, NULL, CMD_SELL_ROAD_VEH | CMD_MSG(STR_9014_CAN_T_SELL_ROAD_VEHICLE)))
_backup_orders_tile = 0; _backup_orders_tile = 0;
} }
@ -693,7 +693,7 @@ static const WindowDesc _road_depot_desc = {
void ShowRoadDepotWindow(uint tile) void ShowRoadDepotWindow(uint tile)
{ {
Window *w; Window *w;
w = AllocateWindowDescFront(&_road_depot_desc, tile); w = AllocateWindowDescFront(&_road_depot_desc, tile);
if (w) { if (w) {
w->caption_color = _map_owner[w->window_number]; w->caption_color = _map_owner[w->window_number];
@ -730,7 +730,7 @@ static void MakeSortedRoadList(byte owner)
// roads are stored as a cummulative index, eg 25, 41, 43. This means // roads are stored as a cummulative index, eg 25, 41, 43. This means
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
for (i = &_num_road_sort[1]; i != endof(_num_road_sort); i++) {*i += *(i-1);} for (i = &_num_road_sort[1]; i != endof(_num_road_sort); i++) {*i += *(i-1);}
// sort by owner, then only subsort the requested owner-vehicles // sort by owner, then only subsort the requested owner-vehicles
qsort(_road_sort, n, sizeof(_road_sort[0]), GeneralOwnerSorter); qsort(_road_sort, n, sizeof(_road_sort[0]), GeneralOwnerSorter);
@ -775,7 +775,7 @@ static void PlayerRoadVehWndProc(Window *w, WindowEvent *e)
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 roads // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 roads
i = (window_number == 0) ? 0 : _num_road_sort[window_number-1]; i = (window_number == 0) ? 0 : _num_road_sort[window_number-1];
SetVScrollCount(w, _num_road_sort[window_number] - i); SetVScrollCount(w, _num_road_sort[window_number] - i);
/* draw the widgets */ /* draw the widgets */
{ {
Player *p = DEREF_PLAYER(window_number); Player *p = DEREF_PLAYER(window_number);
@ -818,7 +818,7 @@ static void PlayerRoadVehWndProc(Window *w, WindowEvent *e)
SET_DPARAM32(0, v->profit_this_year); SET_DPARAM32(0, v->profit_this_year);
SET_DPARAM32(1, v->profit_last_year); SET_DPARAM32(1, v->profit_last_year);
DrawString(x + 24, y + 18, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0); DrawString(x + 24, y + 18, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
if (v->string_id != STR_SV_ROADVEH_NAME) { if (v->string_id != STR_SV_ROADVEH_NAME) {
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
DrawString(x+24, y, STR_01AB, 0); DrawString(x+24, y, STR_01AB, 0);
@ -843,7 +843,7 @@ static void PlayerRoadVehWndProc(Window *w, WindowEvent *e)
return; return;
case 6: { /* Matrix to show vehicles */ case 6: { /* Matrix to show vehicles */
uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_SMALL; uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_SMALL;
if (id_v >= w->vscroll.cap) { return;} // click out of bounds if (id_v >= w->vscroll.cap) { return;} // click out of bounds
id_v += w->vscroll.pos; id_v += w->vscroll.pos;
@ -868,15 +868,15 @@ static void PlayerRoadVehWndProc(Window *w, WindowEvent *e)
tile = _last_built_road_depot_tile; tile = _last_built_road_depot_tile;
do { do {
if (_map_owner[tile] == _local_player && IsRoadDepotTile(tile)) { if (_map_owner[tile] == _local_player && IsRoadDepotTile(tile)) {
ShowRoadDepotWindow(tile); ShowRoadDepotWindow(tile);
ShowBuildRoadVehWindow(tile); ShowBuildRoadVehWindow(tile);
return; return;
} }
tile = TILE_MASK(tile + 1); tile = TILE_MASK(tile + 1);
} while(tile != _last_built_road_depot_tile); } while(tile != _last_built_road_depot_tile);
ShowBuildRoadVehWindow(0); ShowBuildRoadVehWindow(0);
} break; } break;
} }

View File

@ -88,7 +88,7 @@ static void SlWriteFill()
_sl.offs_base += len; _sl.offs_base += len;
if (len) _sl.write_bytes(len); if (len) _sl.write_bytes(len);
} }
// setup next buffer // setup next buffer
_sl.bufp = _sl.buf; _sl.bufp = _sl.buf;
_sl.bufe = _sl.buf + _sl.bufsize; _sl.bufe = _sl.buf + _sl.bufsize;
@ -203,7 +203,7 @@ int SlIterateArray()
{ {
int ind; int ind;
static uint32 next_offs; static uint32 next_offs;
// Must be at end of current block. // Must be at end of current block.
assert(next_offs == 0 || SlGetOffs() == next_offs); assert(next_offs == 0 || SlGetOffs() == next_offs);
@ -224,7 +224,7 @@ int SlIterateArray()
DEBUG(misc, 0) ("SlIterateArray: error\n"); DEBUG(misc, 0) ("SlIterateArray: error\n");
return -1; // error return -1; // error
} }
if (len != 0) if (len != 0)
return ind; return ind;
} }
@ -300,7 +300,7 @@ uint SlGetFieldLength()
static void SlSaveLoadConv(void *ptr, uint conv) static void SlSaveLoadConv(void *ptr, uint conv)
{ {
int64 x = 0; int64 x = 0;
if (_sl.save) { if (_sl.save) {
// Read a value from the struct. These ARE endian safe. // Read a value from the struct. These ARE endian safe.
switch((conv >> 4)&0xf) { switch((conv >> 4)&0xf) {
@ -310,7 +310,7 @@ static void SlSaveLoadConv(void *ptr, uint conv)
case SLE_VAR_U16>>4: x = *(uint16*)ptr; break; case SLE_VAR_U16>>4: x = *(uint16*)ptr; break;
case SLE_VAR_I32>>4: x = *(int32*)ptr; break; case SLE_VAR_I32>>4: x = *(int32*)ptr; break;
case SLE_VAR_U32>>4: x = *(uint32*)ptr; break; case SLE_VAR_U32>>4: x = *(uint32*)ptr; break;
case SLE_VAR_I64>>4: x = *(int64*)ptr; break; case SLE_VAR_I64>>4: x = *(int64*)ptr; break;
case SLE_VAR_U64>>4: x = *(uint64*)ptr; break; case SLE_VAR_U64>>4: x = *(uint64*)ptr; break;
case SLE_VAR_NULL>>4: x = 0; break; case SLE_VAR_NULL>>4: x = 0; break;
default: default:
@ -333,7 +333,7 @@ static void SlSaveLoadConv(void *ptr, uint conv)
NOT_REACHED(); NOT_REACHED();
} }
} else { } else {
// Read a value from the file // Read a value from the file
switch(conv & 0xF) { switch(conv & 0xF) {
case SLE_FILE_I8: x = (int8)SlReadByte(); break; case SLE_FILE_I8: x = (int8)SlReadByte(); break;
@ -441,7 +441,7 @@ static size_t SlCalcObjLength(void *object, const void *desc)
switch(cmd&3) { switch(cmd&3) {
// Normal variable // Normal variable
case 0: length += SlCalcConvLen(conv, NULL);break; case 0: length += SlCalcConvLen(conv, NULL);break;
// Reference // Reference
case 1: length += 2; break; case 1: length += 2; break;
// Array // Array
@ -509,7 +509,7 @@ void SlObject(void *object, const void *desc)
case 2: SlArray(ptr, *d++, conv); break; case 2: SlArray(ptr, *d++, conv); break;
default:NOT_REACHED(); default:NOT_REACHED();
} }
// Write byte. // Write byte.
} else if (cmd == 8) { } else if (cmd == 8) {
if (_sl.save) { if (_sl.save) {
@ -592,7 +592,7 @@ static void SlLoadChunk(const ChunkHandler *ch)
_sl.block_mode = m; _sl.block_mode = m;
_sl.obj_len = 0; _sl.obj_len = 0;
switch(m) { switch(m) {
case CH_ARRAY: case CH_ARRAY:
_sl.array_index = 0; _sl.array_index = 0;
@ -641,7 +641,7 @@ static void SlSaveChunk(const ChunkHandler *ch)
_tmp_proc_1 = proc; _tmp_proc_1 = proc;
proc = SlStubSaveProc; proc = SlStubSaveProc;
} }
_sl.block_mode = ch->flags & CH_TYPE_MASK; _sl.block_mode = ch->flags & CH_TYPE_MASK;
switch(ch->flags & CH_TYPE_MASK) { switch(ch->flags & CH_TYPE_MASK) {
case CH_RIFF: case CH_RIFF:
@ -674,7 +674,7 @@ void SlSaveChunks()
for(chsc=_sl.chs;(ch=*chsc++) != NULL;) { for(chsc=_sl.chs;(ch=*chsc++) != NULL;) {
while(true) { while(true) {
if (((ch->flags >> CH_PRI_SHL) & (CH_NUM_PRI_LEVELS - 1)) == p) if (((ch->flags >> CH_PRI_SHL) & (CH_NUM_PRI_LEVELS - 1)) == p)
SlSaveChunk(ch); SlSaveChunk(ch);
if (ch->flags & CH_LAST) if (ch->flags & CH_LAST)
break; break;
ch++; ch++;
@ -741,7 +741,7 @@ static uint ReadLZO()
// Check if size is bad // Check if size is bad
((uint32*)out)[0] = size = tmp[1]; ((uint32*)out)[0] = size = tmp[1];
if (_sl.version != 0) { if (_sl.version != 0) {
tmp[0] = TO_BE32(tmp[0]); tmp[0] = TO_BE32(tmp[0]);
size = TO_BE32(size); size = TO_BE32(size);
@ -754,7 +754,7 @@ static uint ReadLZO()
// Verify checksum // Verify checksum
if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError("bad checksum"); if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError("bad checksum");
// Decompress // Decompress
lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL); lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL);
return len; return len;
@ -767,7 +767,7 @@ static void WriteLZO(uint size)
byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8]; byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8];
byte wrkmem[sizeof(byte*)*4096]; byte wrkmem[sizeof(byte*)*4096];
uint outlen; uint outlen;
lzo1x_1_compress(_sl.buf, size, out + sizeof(uint32)*2, &outlen, wrkmem); lzo1x_1_compress(_sl.buf, size, out + sizeof(uint32)*2, &outlen, wrkmem);
((uint32*)out)[1] = TO_BE32(outlen); ((uint32*)out)[1] = TO_BE32(outlen);
((uint32*)out)[0] = TO_BE32(lzo_adler32(0, out + sizeof(uint32), outlen + sizeof(uint32))); ((uint32*)out)[0] = TO_BE32(lzo_adler32(0, out + sizeof(uint32), outlen + sizeof(uint32)));
@ -821,7 +821,7 @@ static bool InitReadZlib()
{ {
memset(&_z, 0, sizeof(_z)); memset(&_z, 0, sizeof(_z));
if (inflateInit(&_z) != Z_OK) return false; if (inflateInit(&_z) != Z_OK) return false;
_sl.bufsize = 4096; _sl.bufsize = 4096;
_sl.buf = (byte*)malloc(4096 + 4096); // also contains fread buffer _sl.buf = (byte*)malloc(4096 + 4096); // also contains fread buffer
return true; return true;
@ -845,7 +845,7 @@ static uint ReadZlib()
if (r == Z_STREAM_END) if (r == Z_STREAM_END)
break; break;
if (r != Z_OK) if (r != Z_OK)
SlError("inflate() failed"); SlError("inflate() failed");
} while (_z.avail_out); } while (_z.avail_out);
@ -1020,7 +1020,7 @@ int SaveOrLoad(const char *filename, int mode)
uint32 hdr[2]; uint32 hdr[2];
const SaveLoadFormat *fmt; const SaveLoadFormat *fmt;
uint version; uint version;
// old style load // old style load
if (mode == SL_OLD_LOAD) { if (mode == SL_OLD_LOAD) {
InitializeGame(); InitializeGame();
@ -1028,11 +1028,11 @@ int SaveOrLoad(const char *filename, int mode)
AfterLoadGame(0); AfterLoadGame(0);
return SL_OK; return SL_OK;
} }
_sl.fh = fopen(filename, mode?"wb":"rb"); _sl.fh = fopen(filename, mode?"wb":"rb");
if (_sl.fh == NULL) if (_sl.fh == NULL)
return SL_ERROR; return SL_ERROR;
_sl.bufe = _sl.bufp = NULL; _sl.bufe = _sl.bufp = NULL;
_sl.offs_base = 0; _sl.offs_base = 0;
_sl.int_to_ref_proc = IntToReference; _sl.int_to_ref_proc = IntToReference;
@ -1060,23 +1060,23 @@ int SaveOrLoad(const char *filename, int mode)
} }
} }
// we first initialize here to avoid: "warning: variable `version' might // we first initialize here to avoid: "warning: variable `version' might
// be clobbered by `longjmp' or `vfork'" // be clobbered by `longjmp' or `vfork'"
version = 0; version = 0;
if (mode != SL_LOAD) { if (mode != SL_LOAD) {
fmt = GetSavegameFormat(_savegame_format); fmt = GetSavegameFormat(_savegame_format);
_sl.write_bytes = fmt->writer; _sl.write_bytes = fmt->writer;
_sl.excpt_uninit = fmt->uninit_write; _sl.excpt_uninit = fmt->uninit_write;
if (!fmt->init_write()) goto init_err; if (!fmt->init_write()) goto init_err;
hdr[0] = fmt->tag; hdr[0] = fmt->tag;
hdr[1] = TO_BE32((SAVEGAME_MAJOR_VERSION<<16) + (SAVEGAME_MINOR_VERSION << 8)); hdr[1] = TO_BE32((SAVEGAME_MAJOR_VERSION<<16) + (SAVEGAME_MINOR_VERSION << 8));
if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError("file write failed"); if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError("file write failed");
_sl.version = SAVEGAME_MAJOR_VERSION; _sl.version = SAVEGAME_MAJOR_VERSION;
BeforeSaveGame(); BeforeSaveGame();
SlSaveChunks(); SlSaveChunks();
SlWriteFill(); // flush the save buffer SlWriteFill(); // flush the save buffer
@ -1104,7 +1104,7 @@ init_err:
if (fmt->tag == hdr[0]) { if (fmt->tag == hdr[0]) {
// check version number // check version number
version = TO_BE32(hdr[1]) >> 8; version = TO_BE32(hdr[1]) >> 8;
// incompatible version? // incompatible version?
if (version > SAVEGAME_LOADABLE_VERSION) goto read_err; if (version > SAVEGAME_LOADABLE_VERSION) goto read_err;
_sl.version = (version>>8); _sl.version = (version>>8);

View File

@ -23,7 +23,7 @@ typedef struct {
#pragma pack(push, 1) #pragma pack(push, 1)
#endif #endif
typedef struct BitmapFileHeader { typedef struct BitmapFileHeader {
uint16 type; uint16 type;
uint32 size; uint32 size;
uint32 reserved; uint32 reserved;
@ -113,12 +113,12 @@ static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *user
// determine # lines // determine # lines
n = min(h, maxlines); n = min(h, maxlines);
h -= n; h -= n;
// render the pixels // render the pixels
callb(userdata, buff, h, padw, n); callb(userdata, buff, h, padw, n);
// write each line // write each line
while (n) while (n)
fwrite(buff + (--n) * padw, 1, padw, f); fwrite(buff + (--n) * padw, 1, padw, f);
} while (h); } while (h);
@ -182,10 +182,10 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
} }
png_init_io(png_ptr, f); png_init_io(png_ptr, f);
png_set_filter(png_ptr, 0, PNG_FILTER_NONE); png_set_filter(png_ptr, 0, PNG_FILTER_NONE);
png_set_IHDR(png_ptr, info_ptr, w, h, pixelformat, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, png_set_IHDR(png_ptr, info_ptr, w, h, pixelformat, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
// convert the palette to the .PNG format. // convert the palette to the .PNG format.
@ -215,7 +215,7 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
do { do {
// determine # lines to write // determine # lines to write
n = min(h - y, maxlines); n = min(h - y, maxlines);
// render the pixels into the buffer // render the pixels into the buffer
callb(userdata, buff, y, w, n); callb(userdata, buff, y, w, n);
y += n; y += n;
@ -272,7 +272,7 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
if (f == NULL) return false; if (f == NULL) return false;
memset(&pcx, 0, sizeof(pcx)); memset(&pcx, 0, sizeof(pcx));
// setup pcx header // setup pcx header
pcx.manufacturer = 10; pcx.manufacturer = 10;
pcx.version = 5; pcx.version = 5;
@ -287,7 +287,7 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
pcx.cpal = TO_LE16(1); pcx.cpal = TO_LE16(1);
pcx.width = pcx.pitch = TO_LE16(w); pcx.width = pcx.pitch = TO_LE16(w);
pcx.height = TO_LE16(h); pcx.height = TO_LE16(h);
// write pcx header // write pcx header
fwrite(&pcx, sizeof(pcx), 1, f); fwrite(&pcx, sizeof(pcx), 1, f);
@ -302,7 +302,7 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
do { do {
// determine # lines to write // determine # lines to write
uint n = min(h - y, maxlines), i; uint n = min(h - y, maxlines), i;
// render the pixels into the buffer // render the pixels into the buffer
callb(userdata, buff, y, w, n); callb(userdata, buff, y, w, n);
y += n; y += n;
@ -314,7 +314,7 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
byte runchar = buff[0]; byte runchar = buff[0];
uint left = w - 1; uint left = w - 1;
// for each pixel... // for each pixel...
while (left) { while (left) {
byte ch = *bufp++; byte ch = *bufp++;
if (ch != runchar || runcount >= 0x3f) { if (ch != runchar || runcount >= 0x3f) {
@ -334,7 +334,7 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
} while (y != h); } while (y != h);
// write 8-bit color palette // write 8-bit color palette
fputc(12, f); fputc(12, f);
fwrite(palette, 256*3, 1, f); fwrite(palette, 256*3, 1, f);
fclose(f); fclose(f);
@ -404,8 +404,8 @@ void LargeWorldCallback(void *userdata, byte *buf, uint y, uint pitch, uint n)
while (vp->width - left != 0) { while (vp->width - left != 0) {
wx = min(vp->width - left, 1600); wx = min(vp->width - left, 1600);
left += wx; left += wx;
ViewportDoDraw(vp, ViewportDoDraw(vp,
((left - wx - vp->left) << vp->zoom) + vp->virtual_left, ((left - wx - vp->left) << vp->zoom) + vp->virtual_left,
((y - vp->top) << vp->zoom) + vp->virtual_top, ((y - vp->top) << vp->zoom) + vp->virtual_top,
((left - vp->left) << vp->zoom) + vp->virtual_left, ((left - vp->left) << vp->zoom) + vp->virtual_left,
@ -437,7 +437,7 @@ static char *MakeScreenshotName(const char *ext)
serial = 0; serial = 0;
for(;;) { for(;;) {
snprintf(filename, sizeof(filename), "%s%s", _path.personal_dir, _screenshot_name); snprintf(filename, sizeof(filename), "%s%s", _path.personal_dir, _screenshot_name);
if (!FileExists(filename)) if (!FileExists(filename))
break; break;
sprintf(base, " #%d.%s", ++serial, ext); sprintf(base, " #%d.%s", ++serial, ext);
@ -451,7 +451,7 @@ extern byte _cur_palette[768];
bool MakeScreenshot() bool MakeScreenshot()
{ {
const ScreenshotFormat *sf = _screenshot_formats + _cur_screenshot_format; const ScreenshotFormat *sf = _screenshot_formats + _cur_screenshot_format;
return sf->proc(MakeScreenshotName(sf->extension), CurrentScreenCallback, NULL, _screen.width, _screen.height, 8, _cur_palette); return sf->proc(MakeScreenshotName(sf->extension), CurrentScreenCallback, NULL, _screen.width, _screen.height, 8, _cur_palette);
} }
bool MakeWorldScreenshot(int left, int top, int width, int height, int zoom) bool MakeWorldScreenshot(int left, int top, int width, int height, int zoom)

38
sdl.c
View File

@ -23,7 +23,7 @@ static bool _all_modes;
static SDL_Rect _dirty_rects[MAX_DIRTY_RECTS]; static SDL_Rect _dirty_rects[MAX_DIRTY_RECTS];
static int _num_dirty_rects; static int _num_dirty_rects;
#define SDL_CALL #define SDL_CALL
#if defined(DYNAMICALLY_LOADED_SDL) && defined(WIN32) #if defined(DYNAMICALLY_LOADED_SDL) && defined(WIN32)
@ -60,7 +60,7 @@ typedef struct {
} SDLProcs; } SDLProcs;
#define M(x) x "\0" #define M(x) x "\0"
static const char sdl_files[] = static const char sdl_files[] =
M("sdl.dll") M("sdl.dll")
M("SDL_Init") M("SDL_Init")
M("SDL_InitSubSystem") M("SDL_InitSubSystem")
@ -97,7 +97,7 @@ static SDLProcs _proc;
static char *LoadSdlDLL() static char *LoadSdlDLL()
{ {
if (_proc.SDL_Init != NULL) if (_proc.SDL_Init != NULL)
return NULL; return NULL;
if (!LoadLibraryList((void**)&_proc, sdl_files)) if (!LoadLibraryList((void**)&_proc, sdl_files))
return "Unable to load sdl.dll"; return "Unable to load sdl.dll";
@ -247,7 +247,7 @@ static void GetVideoModes(void) {
for(i = 0; modes[i]; i++) { for(i = 0; modes[i]; i++) {
int w = modes[i]->w; int w = modes[i]->w;
int h = modes[i]->h; int h = modes[i]->h;
if (IS_INT_INSIDE(w, 640, MAX_SCREEN_WIDTH+1) && if (IS_INT_INSIDE(w, 640, MAX_SCREEN_WIDTH+1) &&
IS_INT_INSIDE(h, 480, MAX_SCREEN_HEIGHT+1) && IS_INT_INSIDE(h, 480, MAX_SCREEN_HEIGHT+1) &&
w%8 == 0 && h%8 == 0) { // disable screen resolutions which are not multiples of 8 w%8 == 0 && h%8 == 0) { // disable screen resolutions which are not multiples of 8
int j; int j;
@ -363,7 +363,7 @@ static const VkMapping _vk_mapping[] = {
AS(SDLK_KP_PLUS, WKC_NUM_PLUS), AS(SDLK_KP_PLUS, WKC_NUM_PLUS),
AS(SDLK_KP_ENTER, WKC_NUM_ENTER), AS(SDLK_KP_ENTER, WKC_NUM_ENTER),
AS(SDLK_KP_PERIOD, WKC_NUM_DECIMAL), AS(SDLK_KP_PERIOD, WKC_NUM_DECIMAL),
{0, 0, 0} {0, 0, 0}
}; };
static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym) static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym)
@ -376,7 +376,7 @@ static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym)
from = map->vk_from; from = map->vk_from;
if (from == 0) { if (from == 0) {
key = 0; key = 0;
break; break;
} }
if ((uint)(key - from) <= map->vk_count) { if ((uint)(key - from) <= map->vk_count) {
key = key - from + map->map_to; key = key - from + map->map_to;
@ -444,7 +444,7 @@ static int PollEvent() {
_right_button_down = true; _right_button_down = true;
_right_button_clicked = true; _right_button_clicked = true;
} }
#if !defined(WIN32) #if !defined(WIN32)
else if (ev.button.button == SDL_BUTTON_WHEELUP) { else if (ev.button.button == SDL_BUTTON_WHEELUP) {
_cursor.wheel--; _cursor.wheel--;
} else if (ev.button.button == SDL_BUTTON_WHEELDOWN) { } else if (ev.button.button == SDL_BUTTON_WHEELDOWN) {
@ -479,17 +479,17 @@ static int PollEvent() {
_pressed_key = ConvertSdlKeyIntoMy(&ev.key.keysym); _pressed_key = ConvertSdlKeyIntoMy(&ev.key.keysym);
} }
break; break;
case SDL_VIDEORESIZE: { case SDL_VIDEORESIZE: {
int w, h; int w, h;
w = ev.resize.w; w = ev.resize.w;
h = ev.resize.h; h = ev.resize.h;
w = clamp(w & ~0x7, 64, MAX_SCREEN_WIDTH); w = clamp(w & ~0x7, 64, MAX_SCREEN_WIDTH);
h = clamp(h & ~0x7, 64, MAX_SCREEN_HEIGHT); h = clamp(h & ~0x7, 64, MAX_SCREEN_HEIGHT);
ChangeResInGame(w, h); ChangeResInGame(w, h);
break; break;
} }
} }
@ -529,14 +529,14 @@ static int SdlVideoMainLoop()
while (true) { while (true) {
InteractiveRandom(); // randomness InteractiveRandom(); // randomness
while ((i=PollEvent()) == -1) {} while ((i=PollEvent()) == -1) {}
if (i>=0) return i; if (i>=0) return i;
if (_exit_game) return ML_QUIT; if (_exit_game) return ML_QUIT;
mod = SDL_CALL SDL_GetModState(); mod = SDL_CALL SDL_GetModState();
keys = SDL_CALL SDL_GetKeyState(&numkeys); keys = SDL_CALL SDL_GetKeyState(&numkeys);
#if defined(_DEBUG) #if defined(_DEBUG)
if (_shift_pressed) { if (_shift_pressed) {
#else #else
@ -556,12 +556,12 @@ static int SdlVideoMainLoop()
_ctrl_pressed = !!(mod & (KMOD_LCTRL | KMOD_RCTRL)); _ctrl_pressed = !!(mod & (KMOD_LCTRL | KMOD_RCTRL));
_shift_pressed = !!(mod & (KMOD_LSHIFT | KMOD_RSHIFT)); _shift_pressed = !!(mod & (KMOD_LSHIFT | KMOD_RSHIFT));
// determine which directional keys are down // determine which directional keys are down
_dirkeys = _dirkeys =
(keys[SDLK_LEFT] ? 1 : 0) + (keys[SDLK_LEFT] ? 1 : 0) +
(keys[SDLK_UP] ? 2 : 0) + (keys[SDLK_UP] ? 2 : 0) +
(keys[SDLK_RIGHT] ? 4 : 0) + (keys[SDLK_RIGHT] ? 4 : 0) +
(keys[SDLK_DOWN] ? 8 : 0); (keys[SDLK_DOWN] ? 8 : 0);
GameLoop(); GameLoop();
@ -607,7 +607,7 @@ static void CDECL fill_sound_buffer(void *userdata, Uint8 *stream, int len)
static char *SdlSoundStart(char **parm) static char *SdlSoundStart(char **parm)
{ {
SDL_AudioSpec spec; SDL_AudioSpec spec;
{char *s;if ((s = SdlOpen(SDL_INIT_AUDIO)) != NULL) return s;} {char *s;if ((s = SdlOpen(SDL_INIT_AUDIO)) != NULL) return s;}
spec.freq = GetDriverParamInt(parm, "hz", 11025); spec.freq = GetDriverParamInt(parm, "hz", 11025);
spec.format = AUDIO_S16SYS; spec.format = AUDIO_S16SYS;

View File

@ -50,7 +50,7 @@ static MemoryPool *pool_new(uint minsize)
{ {
MemoryPool *p; MemoryPool *p;
if (minsize < 4096 - 12) minsize = 4096 - 12; if (minsize < 4096 - 12) minsize = 4096 - 12;
p = malloc(sizeof(MemoryPool) - 1 + minsize); p = malloc(sizeof(MemoryPool) - 1 + minsize);
p->pos = 0; p->pos = 0;
p->size = minsize; p->size = minsize;
@ -78,7 +78,7 @@ static void *pool_alloc(MemoryPool **pool, uint size)
MemoryPool *n = pool_new(size); MemoryPool *n = pool_new(size);
*pool = n; *pool = n;
n->next = p; n->next = p;
p = n; p = n;
} }
pos = p->pos; pos = p->pos;
@ -188,7 +188,7 @@ static IniFile *ini_load(const char *filename)
// for each line in the file // for each line in the file
while (fgets(buffer, sizeof(buffer), in)) { while (fgets(buffer, sizeof(buffer), in)) {
// trim whitespace from the left side // trim whitespace from the left side
for(s=buffer; *s == ' ' || *s == '\t'; s++); for(s=buffer; *s == ' ' || *s == '\t'; s++);
@ -230,7 +230,7 @@ static IniFile *ini_load(const char *filename)
} else if (group) { } else if (group) {
// find end of keyname // find end of keyname
for(t=s; *t != 0 && *t != '=' && *t != '\t' && *t != ' '; t++) {} for(t=s; *t != 0 && *t != '=' && *t != '\t' && *t != ' '; t++) {}
// it's an item in an existing group // it's an item in an existing group
item = ini_item_alloc(group, s, t-s); item = ini_item_alloc(group, s, t-s);
if (comment_size) { if (comment_size) {
@ -285,7 +285,7 @@ static IniItem *ini_getitem(IniGroup *group, const char *name, bool create)
for(item = group->item; item; item = item->next) for(item = group->item; item; item = item->next)
if (!strcmp(item->name, name)) if (!strcmp(item->name, name))
return item; return item;
if (!create) return NULL; if (!create) return NULL;
// otherwise make a new one // otherwise make a new one
@ -299,7 +299,7 @@ static bool ini_save(const char *filename, IniFile *ini)
FILE *f; FILE *f;
IniGroup *group; IniGroup *group;
IniItem *item; IniItem *item;
f = fopen(filename, "w"); f = fopen(filename, "w");
if (f == NULL) return false; if (f == NULL) return false;
@ -328,7 +328,7 @@ struct SettingDesc {
void *def; void *def;
void *ptr; void *ptr;
void *b; void *b;
}; };
static int lookup_oneofmany(const char *many, const char *one, int onelen) static int lookup_oneofmany(const char *many, const char *one, int onelen)
@ -341,7 +341,7 @@ static int lookup_oneofmany(const char *many, const char *one, int onelen)
// check if it's an integer // check if it's an integer
if (*one >= '0' && *one <= '9') if (*one >= '0' && *one <= '9')
return strtoul(one, NULL, 0); return strtoul(one, NULL, 0);
idx = 0; idx = 0;
for(;;) { for(;;) {
// find end of item // find end of item
@ -400,7 +400,7 @@ static bool load_intlist(const char *str, void *array, int nelems, int type)
{ {
int items[64]; int items[64];
int i,nitems; int i,nitems;
if (str == NULL) { if (str == NULL) {
memset(items, 0, sizeof(items)); memset(items, 0, sizeof(items));
nitems = nelems; nitems = nelems;
@ -522,7 +522,7 @@ static void *string_to_val(const SettingDesc *desc, const char *str)
return (void*)false; return (void*)false;
ShowInfoF("ini: invalid setting value '%s' for '%s'", str, desc->name); ShowInfoF("ini: invalid setting value '%s' for '%s'", str, desc->name);
break; break;
case SDT_STRING: case SDT_STRING:
case SDT_STRINGBUF: case SDT_STRINGBUF:
case SDT_INTLIST: case SDT_INTLIST:
@ -549,14 +549,14 @@ static void load_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
s = desc->name; s = desc->name;
group = group_def; group = group_def;
} }
item = ini_getitem(group, s, false); item = ini_getitem(group, s, false);
if (!item) { if (!item) {
p = desc->def; p = desc->def;
} else { } else {
p = string_to_val(desc, item->value); p = string_to_val(desc, item->value);
} }
// get ptr to array // get ptr to array
ptr = desc->ptr; ptr = desc->ptr;
if ( (uint32)ptr < 0x10000) if ( (uint32)ptr < 0x10000)
@ -600,7 +600,7 @@ static void load_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
default: default:
NOT_REACHED(); NOT_REACHED();
} }
} }
} }
static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpname, void *base) static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpname, void *base)
@ -615,7 +615,7 @@ static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
for (;desc->name;desc++) { for (;desc->name;desc++) {
if (desc->flags & SDT_NOSAVE) if (desc->flags & SDT_NOSAVE)
continue; continue;
// group override? // group override?
s = strchr(desc->name, '.'); s = strchr(desc->name, '.');
if (s) { if (s) {
@ -627,16 +627,16 @@ static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
s = desc->name; s = desc->name;
group = group_def; group = group_def;
} }
item = ini_getitem(group, s, true); item = ini_getitem(group, s, true);
// get ptr to array // get ptr to array
ptr = desc->ptr; ptr = desc->ptr;
if ( (uint32)ptr < 0x10000) if ( (uint32)ptr < 0x10000)
ptr = (byte*)base + (uint32)ptr; ptr = (byte*)base + (uint32)ptr;
if (item->value != NULL) { if (item->value != NULL) {
// check if the value is the same as the old value // check if the value is the same as the old value
p = string_to_val(desc, item->value); p = string_to_val(desc, item->value);
switch(desc->flags & 0xF) { switch(desc->flags & 0xF) {
@ -658,7 +658,7 @@ static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
case SDT_INT32 >> 4: case SDT_INT32 >> 4:
case SDT_UINT32 >> 4: case SDT_UINT32 >> 4:
if (*(uint32*)ptr == (uint32)p) if (*(uint32*)ptr == (uint32)p)
continue; continue;
break; break;
default: default:
NOT_REACHED(); NOT_REACHED();
@ -717,7 +717,7 @@ static void save_setting_desc(IniFile *ini, const SettingDesc *desc, void *grpna
} }
// the value is different, that means we have to write it to the ini // the value is different, that means we have to write it to the ini
item->value = pool_strdup(&ini->pool, buf, strlen(buf)); item->value = pool_strdup(&ini->pool, buf, strlen(buf));
} }
} }
//*************************** //***************************
@ -826,7 +826,7 @@ static const SettingDesc patch_settings[] = {
{"nonuniform_stations", SDT_BOOL, (void*)false, (void*)offsetof(Patches, nonuniform_stations), NULL}, {"nonuniform_stations", SDT_BOOL, (void*)false, (void*)offsetof(Patches, nonuniform_stations), NULL},
{"always_small_airport",SDT_BOOL, (void*)false, (void*)offsetof(Patches, always_small_airport), NULL}, {"always_small_airport",SDT_BOOL, (void*)false, (void*)offsetof(Patches, always_small_airport), NULL},
{"realistic_acceleration",SDT_BOOL, (void*)false, (void*)offsetof(Patches, realistic_acceleration), NULL}, {"realistic_acceleration",SDT_BOOL, (void*)false, (void*)offsetof(Patches, realistic_acceleration), NULL},
{"toolbar_pos", SDT_UINT8, (void*)0, (void*)offsetof(Patches, toolbar_pos), NULL}, {"toolbar_pos", SDT_UINT8, (void*)0, (void*)offsetof(Patches, toolbar_pos), NULL},
{"max_trains", SDT_UINT8, (void*)80, (void*)offsetof(Patches, max_trains), NULL}, {"max_trains", SDT_UINT8, (void*)80, (void*)offsetof(Patches, max_trains), NULL},
@ -848,7 +848,7 @@ static const SettingDesc patch_settings[] = {
{"pf_maxlength", SDT_UINT16, (void*)512, (void*)offsetof(Patches, pf_maxlength), NULL}, {"pf_maxlength", SDT_UINT16, (void*)512, (void*)offsetof(Patches, pf_maxlength), NULL},
{"pf_maxdepth", SDT_UINT8, (void*)16, (void*)offsetof(Patches, pf_maxdepth), NULL}, {"pf_maxdepth", SDT_UINT8, (void*)16, (void*)offsetof(Patches, pf_maxdepth), NULL},
{"ai_disable_veh_train",SDT_BOOL, (void*)false, (void*)offsetof(Patches, ai_disable_veh_train), NULL}, {"ai_disable_veh_train",SDT_BOOL, (void*)false, (void*)offsetof(Patches, ai_disable_veh_train), NULL},
{"ai_disable_veh_roadveh",SDT_BOOL, (void*)false, (void*)offsetof(Patches, ai_disable_veh_roadveh), NULL}, {"ai_disable_veh_roadveh",SDT_BOOL, (void*)false, (void*)offsetof(Patches, ai_disable_veh_roadveh), NULL},
{"ai_disable_veh_aircraft",SDT_BOOL,(void*)false, (void*)offsetof(Patches, ai_disable_veh_aircraft),NULL}, {"ai_disable_veh_aircraft",SDT_BOOL,(void*)false, (void*)offsetof(Patches, ai_disable_veh_aircraft),NULL},
@ -875,7 +875,7 @@ static const SettingDesc patch_settings[] = {
{"wait_oneway_signal", SDT_UINT8, (void*)15, (void*)offsetof(Patches, wait_oneway_signal), NULL}, {"wait_oneway_signal", SDT_UINT8, (void*)15, (void*)offsetof(Patches, wait_oneway_signal), NULL},
{"wait_twoway_signal", SDT_UINT8, (void*)41, (void*)offsetof(Patches, wait_twoway_signal), NULL}, {"wait_twoway_signal", SDT_UINT8, (void*)41, (void*)offsetof(Patches, wait_twoway_signal), NULL},
{"ainew_active", SDT_BOOL, (void*)false, (void*)offsetof(Patches, ainew_active), NULL}, {"ainew_active", SDT_BOOL, (void*)false, (void*)offsetof(Patches, ainew_active), NULL},
{"drag_signals_density",SDT_UINT8, (void*)4, (void*)offsetof(Patches, drag_signals_density), NULL}, {"drag_signals_density",SDT_UINT8, (void*)4, (void*)offsetof(Patches, drag_signals_density), NULL},

View File

@ -117,11 +117,11 @@ static void GameOptionsWndProc(Window *w, WindowEvent *e)
// setup screenshot format dropdown // setup screenshot format dropdown
ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_SCREENSHOT_START, _num_screenshot_formats), _cur_screenshot_format, e->click.widget, 0); ShowDropDownMenu(w, BuildDynamicDropdown(SPECSTR_SCREENSHOT_START, _num_screenshot_formats), _cur_screenshot_format, e->click.widget, 0);
return; return;
} }
break; break;
case WE_DROPDOWN_SELECT: case WE_DROPDOWN_SELECT:
switch(e->dropdown.button) { switch(e->dropdown.button) {
case 20: case 20:
if (e->dropdown.index == 0) { if (e->dropdown.index == 0) {
@ -220,7 +220,7 @@ static const Widget _game_options_widgets[] = {
{ WWT_CLOSEBOX, 14, 130, 349, 202, 213, STR_02C0_SAVE_CUSTOM_NAMES_TO_DISK, STR_02C2_SAVE_CUSTOMIZED_VEHICLE}, { WWT_CLOSEBOX, 14, 130, 349, 202, 213, STR_02C0_SAVE_CUSTOM_NAMES_TO_DISK, STR_02C2_SAVE_CUSTOMIZED_VEHICLE},
{ WWT_FRAME, 14, 190, 359, 104, 139, STR_OPTIONS_LANG, STR_NULL}, { WWT_FRAME, 14, 190, 359, 104, 139, STR_OPTIONS_LANG, STR_NULL},
{ WWT_6, 14, 200, 349, 118, 129, STR_OPTIONS_LANG_CBO, STR_OPTIONS_LANG_TIP}, { WWT_6, 14, 200, 349, 118, 129, STR_OPTIONS_LANG_CBO, STR_OPTIONS_LANG_TIP},
{ WWT_CLOSEBOX, 14, 338, 348, 119, 128, STR_0225, STR_OPTIONS_LANG_TIP}, { WWT_CLOSEBOX, 14, 338, 348, 119, 128, STR_0225, STR_OPTIONS_LANG_TIP},
{ WWT_FRAME, 14, 10, 179, 146, 181, STR_OPTIONS_RES, STR_NULL}, { WWT_FRAME, 14, 10, 179, 146, 181, STR_OPTIONS_RES, STR_NULL},
{ WWT_6, 14, 20, 169, 160, 171, STR_OPTIONS_RES_CBO, STR_OPTIONS_RES_TIP}, { WWT_6, 14, 20, 169, 160, 171, STR_OPTIONS_RES_CBO, STR_OPTIONS_RES_TIP},
@ -354,7 +354,7 @@ static void GameDifficultyWndProc(Window *w, WindowEvent *e)
uint btn, dis; uint btn, dis;
int val; int val;
const GameSettingData *info; const GameSettingData *info;
x = e->click.pt.x - 5; x = e->click.pt.x - 5;
if (!IS_INT_INSIDE(x, 0, 21)) if (!IS_INT_INSIDE(x, 0, 21))
return; return;
@ -470,7 +470,7 @@ void ShowGameDifficulty()
*/ */
memcpy(&_opt_mod_temp, _opt_mod_ptr, sizeof(GameOptions)); memcpy(&_opt_mod_temp, _opt_mod_ptr, sizeof(GameOptions));
AllocateWindowDesc(&_game_difficulty_desc); AllocateWindowDesc(&_game_difficulty_desc);
} }
void ShowHighscoreTable(int tbl) void ShowHighscoreTable(int tbl)
{ {
@ -490,7 +490,7 @@ int32 AiNew_PatchActive_Warning(int32 p1)
{ {
if (p1 == 1) if (p1 == 1)
ShowErrorMessage(-1, TEMP_AI_ACTIVATED, 0, 0); ShowErrorMessage(-1, TEMP_AI_ACTIVATED, 0, 0);
return 0; return 0;
} }
@ -511,14 +511,14 @@ int32 CheckInterval(int32 p1)
{ {
bool warning; bool warning;
if (p1) { if (p1) {
warning = ( (IS_INT_INSIDE(_patches.servint_trains, 5, 90+1) || _patches.servint_trains == 0) && warning = ( (IS_INT_INSIDE(_patches.servint_trains, 5, 90+1) || _patches.servint_trains == 0) &&
(IS_INT_INSIDE(_patches.servint_roadveh, 5, 90+1) || _patches.servint_roadveh == 0) && (IS_INT_INSIDE(_patches.servint_roadveh, 5, 90+1) || _patches.servint_roadveh == 0) &&
(IS_INT_INSIDE(_patches.servint_aircraft, 5, 90+1) || _patches.servint_aircraft == 0) && (IS_INT_INSIDE(_patches.servint_aircraft, 5, 90+1) || _patches.servint_aircraft == 0) &&
(IS_INT_INSIDE(_patches.servint_ships, 5, 90+1) || _patches.servint_ships == 0) ); (IS_INT_INSIDE(_patches.servint_ships, 5, 90+1) || _patches.servint_ships == 0) );
} else { } else {
warning = ( (IS_INT_INSIDE(_patches.servint_trains, 30, 800+1) || _patches.servint_trains == 0) && warning = ( (IS_INT_INSIDE(_patches.servint_trains, 30, 800+1) || _patches.servint_trains == 0) &&
(IS_INT_INSIDE(_patches.servint_roadveh, 30, 800+1) || _patches.servint_roadveh == 0) && (IS_INT_INSIDE(_patches.servint_roadveh, 30, 800+1) || _patches.servint_roadveh == 0) &&
(IS_INT_INSIDE(_patches.servint_aircraft, 30, 800+1) || _patches.servint_aircraft == 0) && (IS_INT_INSIDE(_patches.servint_aircraft, 30, 800+1) || _patches.servint_aircraft == 0) &&
(IS_INT_INSIDE(_patches.servint_ships, 30, 800+1) || _patches.servint_ships == 0) ); (IS_INT_INSIDE(_patches.servint_ships, 30, 800+1) || _patches.servint_ships == 0) );
} }
@ -560,7 +560,7 @@ static const PatchEntry _patches_ui[] = {
{PE_BOOL, 0, STR_CONFIG_PATCHES_AUTOSCROLL, &_patches.autoscroll, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_AUTOSCROLL, &_patches.autoscroll, 0, 0, 0, NULL},
{PE_UINT8, 0, STR_CONFIG_PATCHES_ERRMSG_DURATION, &_patches.errmsg_duration, 0, 20, 1, NULL}, {PE_UINT8, 0, STR_CONFIG_PATCHES_ERRMSG_DURATION, &_patches.errmsg_duration, 0, 20, 1, NULL},
{PE_UINT8, PF_MULTISTRING, STR_CONFIG_PATCHES_TOOLBAR_POS, &_patches.toolbar_pos, 0, 2, 1, &v_PositionMainToolbar}, {PE_UINT8, PF_MULTISTRING, STR_CONFIG_PATCHES_TOOLBAR_POS, &_patches.toolbar_pos, 0, 2, 1, &v_PositionMainToolbar},
{PE_BOOL, 0, STR_CONFIG_PATCHES_INVISIBLE_TREES, &_patches.invisible_trees, 0, 1, 1, &InvisibleTreesActive}, {PE_BOOL, 0, STR_CONFIG_PATCHES_INVISIBLE_TREES, &_patches.invisible_trees, 0, 1, 1, &InvisibleTreesActive},
}; };
@ -570,7 +570,7 @@ static const PatchEntry _patches_construction[] = {
{PE_BOOL, 0, STR_CONFIG_PATCHES_EXTRADYNAMITE, &_patches.extra_dynamite, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_EXTRADYNAMITE, &_patches.extra_dynamite, 0, 0, 0, NULL},
{PE_BOOL, 0, STR_CONFIG_PATCHES_LONGBRIDGES, &_patches.longbridges, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_LONGBRIDGES, &_patches.longbridges, 0, 0, 0, NULL},
{PE_BOOL, 0, STR_CONFIG_PATCHES_SIGNALSIDE, &_patches.signal_side, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_SIGNALSIDE, &_patches.signal_side, 0, 0, 0, NULL},
{PE_BOOL, 0, STR_CONFIG_PATCHES_SMALL_AIRPORTS, &_patches.always_small_airport, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_SMALL_AIRPORTS, &_patches.always_small_airport, 0, 0, 0, NULL},
{PE_UINT8, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY, &_patches.drag_signals_density, 1, 20, 1, NULL}, {PE_UINT8, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY, &_patches.drag_signals_density, 1, 20, 1, NULL},
@ -622,7 +622,7 @@ static const PatchEntry _patches_economy[] = {
{PE_BOOL, 0, STR_CONFIG_PATCHES_SAMEINDCLOSE, &_patches.same_industry_close, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_SAMEINDCLOSE, &_patches.same_industry_close, 0, 0, 0, NULL},
{PE_BOOL, 0, STR_CONFIG_PATCHES_BRIBE, &_patches.bribe, 0, 0, 0, NULL}, {PE_BOOL, 0, STR_CONFIG_PATCHES_BRIBE, &_patches.bribe, 0, 0, 0, NULL},
{PE_UINT8, 0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT, &_patches.snow_line_height, 2, 13, 1, NULL}, {PE_UINT8, 0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT, &_patches.snow_line_height, 2, 13, 1, NULL},
{PE_INT32, PF_NOCOMMA, STR_CONFIG_PATCHES_COLORED_NEWS_DATE, &_patches.colored_news_date, 1900, 2200, 5, NULL}, {PE_INT32, PF_NOCOMMA, STR_CONFIG_PATCHES_COLORED_NEWS_DATE, &_patches.colored_news_date, 1900, 2200, 5, NULL},
{PE_INT32, PF_NOCOMMA, STR_CONFIG_PATCHES_STARTING_DATE, &_patches.starting_date, 1920,2100, 1, NULL}, {PE_INT32, PF_NOCOMMA, STR_CONFIG_PATCHES_STARTING_DATE, &_patches.starting_date, 1920,2100, 1, NULL},
@ -666,7 +666,7 @@ static int32 ReadPE(const PatchEntry*pe)
default: default:
NOT_REACHED(); NOT_REACHED();
} }
/* useless, but avoids compiler warning this way */ /* useless, but avoids compiler warning this way */
return 0; return 0;
} }
@ -682,36 +682,36 @@ static void WritePE(const PatchEntry *pe, int32 val)
switch(pe->type) { switch(pe->type) {
case PE_BOOL: *(bool*)pe->variable = (bool)val; break; case PE_BOOL: *(bool*)pe->variable = (bool)val; break;
case PE_UINT8: if ((uint8)val > (uint8)pe->max) case PE_UINT8: if ((uint8)val > (uint8)pe->max)
*(uint8*)pe->variable = (uint8)pe->max; *(uint8*)pe->variable = (uint8)pe->max;
else if ((uint8)val < (uint8)pe->min) else if ((uint8)val < (uint8)pe->min)
*(uint8*)pe->variable = (uint8)pe->min; *(uint8*)pe->variable = (uint8)pe->min;
else else
*(uint8*)pe->variable = (uint8)val; *(uint8*)pe->variable = (uint8)val;
break; break;
case PE_INT16: if ((int16)val > (int16)pe->max) case PE_INT16: if ((int16)val > (int16)pe->max)
*(int16*)pe->variable = (int16)pe->max; *(int16*)pe->variable = (int16)pe->max;
else if ((int16)val < (int16)pe->min) else if ((int16)val < (int16)pe->min)
*(int16*)pe->variable = (int16)pe->min; *(int16*)pe->variable = (int16)pe->min;
else else
*(int16*)pe->variable = (int16)val; *(int16*)pe->variable = (int16)val;
break; break;
case PE_UINT16: if ((uint16)val > (uint16)pe->max) case PE_UINT16: if ((uint16)val > (uint16)pe->max)
*(uint16*)pe->variable = (uint16)pe->max; *(uint16*)pe->variable = (uint16)pe->max;
else if ((uint16)val < (uint16)pe->min) else if ((uint16)val < (uint16)pe->min)
*(uint16*)pe->variable = (uint16)pe->min; *(uint16*)pe->variable = (uint16)pe->min;
else else
*(uint16*)pe->variable = (uint16)val; *(uint16*)pe->variable = (uint16)val;
break; break;
case PE_INT32: if ((int32)val > (int32)pe->max) case PE_INT32: if ((int32)val > (int32)pe->max)
*(int32*)pe->variable = (int32)pe->max; *(int32*)pe->variable = (int32)pe->max;
else if ((int32)val < (int32)pe->min) else if ((int32)val < (int32)pe->min)
*(int32*)pe->variable = (int32)pe->min; *(int32*)pe->variable = (int32)pe->min;
else else
*(int32*)pe->variable = val; *(int32*)pe->variable = val;
break; break;
case PE_CURRENCY: val /= GetCurrentCurrencyRate(); case PE_CURRENCY: val /= GetCurrentCurrencyRate();
@ -791,7 +791,7 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
y = e->click.pt.y - 46 - 1; y = e->click.pt.y - 46 - 1;
if (y < 0) return; if (y < 0) return;
btn = y / 11; btn = y / 11;
if (y % 11 > 9) return; if (y % 11 > 9) return;
@ -836,13 +836,13 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
if (val < pe->min) val = pe->min; if (val < pe->min) val = pe->min;
} }
} }
if (val != oval) { if (val != oval) {
WP(w,def_d).data_2 = btn * 2 + 1 + ((x>=10) ? 1 : 0); WP(w,def_d).data_2 = btn * 2 + 1 + ((x>=10) ? 1 : 0);
w->flags4 |= 5 << WF_TIMEOUT_SHL; w->flags4 |= 5 << WF_TIMEOUT_SHL;
_left_button_clicked = false; _left_button_clicked = false;
} }
break; break;
} }
if (val != oval) { if (val != oval) {
WritePE(pe, val); WritePE(pe, val);
@ -858,7 +858,7 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, WC_GAME_OPTIONS, 0); ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, WC_GAME_OPTIONS, 0);
} }
} }
break; break;
} }
case 4: case 5: case 6: case 7: case 8: case 9: case 4: case 5: case 6: case 7: case 8: case 9:
@ -878,7 +878,7 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
if (*e->edittext.str) { if (*e->edittext.str) {
const PatchPage *page = &_patches_page[WP(w,def_d).data_1]; const PatchPage *page = &_patches_page[WP(w,def_d).data_1];
const PatchEntry *pe = &page->entries[WP(w,def_d).data_3]; const PatchEntry *pe = &page->entries[WP(w,def_d).data_3];
WritePE(pe, atoi(e->edittext.str)); WritePE(pe, atoi(e->edittext.str));
SetWindowDirty(w); SetWindowDirty(w);
if (pe->click_proc != NULL) // call callback function if (pe->click_proc != NULL) // call callback function

View File

@ -93,7 +93,7 @@ static void CheckIfShipNeedsService(Vehicle *v)
if (v->vehstatus & VS_STOPPED) if (v->vehstatus & VS_STOPPED)
return; return;
if ((v->next_order & (OT_MASK | OF_FULL_LOAD)) == (OT_GOTO_DEPOT | OF_FULL_LOAD)) if ((v->next_order & (OT_MASK | OF_FULL_LOAD)) == (OT_GOTO_DEPOT | OF_FULL_LOAD))
return; return;
@ -113,7 +113,7 @@ static void CheckIfShipNeedsService(Vehicle *v)
v->next_order = OT_GOTO_DEPOT | OF_NON_STOP; v->next_order = OT_GOTO_DEPOT | OF_NON_STOP;
v->next_order_param = (byte)i; v->next_order_param = (byte)i;
v->dest_tile = (&_depots[i])->xy; v->dest_tile = (&_depots[i])->xy;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
void OnNewDay_Ship(Vehicle *v) void OnNewDay_Ship(Vehicle *v)
@ -128,11 +128,11 @@ void OnNewDay_Ship(Vehicle *v)
CheckIfShipNeedsService(v); CheckIfShipNeedsService(v);
CheckOrders(v); CheckOrders(v);
if (v->vehstatus & VS_STOPPED) if (v->vehstatus & VS_STOPPED)
return; return;
cost = ship_vehicle_info(v->engine_type).running_cost * _price.ship_running / 364; cost = ship_vehicle_info(v->engine_type).running_cost * _price.ship_running / 364;
v->profit_this_year -= cost >> 8; v->profit_this_year -= cost >> 8;
@ -152,10 +152,10 @@ static void HandleBrokenShip(Vehicle *v)
if (v->breakdowns_since_last_service != 255) if (v->breakdowns_since_last_service != 255)
v->breakdowns_since_last_service++; v->breakdowns_since_last_service++;
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xE : 0x3A, v); SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xE : 0x3A, v);
if (!(v->vehstatus & VS_HIDDEN)) { if (!(v->vehstatus & VS_HIDDEN)) {
@ -231,7 +231,7 @@ static void ProcessShipOrder(Vehicle *v)
if ((order & OT_MASK) == OT_GOTO_STATION) { if ((order & OT_MASK) == OT_GOTO_STATION) {
if ( (byte)(order >> 8) == v->last_station_visited) if ( (byte)(order >> 8) == v->last_station_visited)
v->last_station_visited = 0xFF; v->last_station_visited = 0xFF;
st = DEREF_STATION(order >> 8); st = DEREF_STATION(order >> 8);
if (st->dock_tile != 0) { if (st->dock_tile != 0) {
v->dest_tile = TILE_ADD(st->dock_tile, _dock_offs[_map5[st->dock_tile]-0x4B]); v->dest_tile = TILE_ADD(st->dock_tile, _dock_offs[_map5[st->dock_tile]-0x4B]);
@ -248,7 +248,7 @@ static void HandleShipLoading(Vehicle *v)
{ {
if (v->next_order == OT_NOTHING) if (v->next_order == OT_NOTHING)
return; return;
if (v->next_order != OT_DUMMY) { if (v->next_order != OT_DUMMY) {
if ((v->next_order&OT_MASK) != OT_LOADING) if ((v->next_order&OT_MASK) != OT_LOADING)
return; return;
@ -265,7 +265,7 @@ static void HandleShipLoading(Vehicle *v)
return; return;
} }
PlayShipSound(v); PlayShipSound(v);
{ {
byte b = v->next_order; byte b = v->next_order;
v->next_order = OT_LEAVESTATION; v->next_order = OT_LEAVESTATION;
@ -352,7 +352,7 @@ static bool ShipAccelerate(Vehicle *v)
//updates statusbar only if speed have changed to save CPU time //updates statusbar only if speed have changed to save CPU time
if (spd != v->cur_speed) { if (spd != v->cur_speed) {
v->cur_speed = spd; v->cur_speed = spd;
if (_patches.vehicle_speed) if (_patches.vehicle_speed)
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
@ -384,7 +384,7 @@ static void ShipEnterDepot(Vehicle *v)
v->vehstatus |= VS_HIDDEN; v->vehstatus |= VS_HIDDEN;
v->cur_speed = 0; v->cur_speed = 0;
RecalcShipStuff(v); RecalcShipStuff(v);
v->date_of_last_service = _date; v->date_of_last_service = _date;
v->breakdowns_since_last_service = 0; v->breakdowns_since_last_service = 0;
v->reliability = _engines[v->engine_type].reliability; v->reliability = _engines[v->engine_type].reliability;
@ -394,7 +394,7 @@ static void ShipEnterDepot(Vehicle *v)
if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) { if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) {
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
t = v->next_order; t = v->next_order;
v->next_order = OT_DUMMY; v->next_order = OT_DUMMY;
@ -444,7 +444,7 @@ static bool ShipTrackFollower(uint tile, PathFindShip *pfs, int track, uint leng
// Found dest? // Found dest?
if (tile == pfs->dest_coords) { if (tile == pfs->dest_coords) {
pfs->best_bird_dist = 0; pfs->best_bird_dist = 0;
// if (length < pfs->best_length) // if (length < pfs->best_length)
// dbg_store_path(); // dbg_store_path();
@ -456,7 +456,7 @@ static bool ShipTrackFollower(uint tile, PathFindShip *pfs, int track, uint leng
if (tile != pfs->skiptile) { if (tile != pfs->skiptile) {
pfs->best_bird_dist = minu(pfs->best_bird_dist, GetTileDist1Db(pfs->dest_coords, tile)); pfs->best_bird_dist = minu(pfs->best_bird_dist, GetTileDist1Db(pfs->dest_coords, tile));
} }
return false; return false;
} }
@ -488,12 +488,12 @@ static uint FindShipTrack(Vehicle *v, uint tile, int dir, uint bits, uint skipti
do { do {
i = FIND_FIRST_BIT(bits); i = FIND_FIRST_BIT(bits);
bits = KILL_FIRST_BIT(bits); bits = KILL_FIRST_BIT(bits);
pfs.best_bird_dist = (uint)-1; pfs.best_bird_dist = (uint)-1;
pfs.best_length = (uint)-1; pfs.best_length = (uint)-1;
FollowTrack(tile, 0x3800 | TRANSPORT_WATER, _ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs); FollowTrack(tile, 0x3800 | TRANSPORT_WATER, _ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
if (best_track >= 0) { if (best_track >= 0) {
if (pfs.best_bird_dist != 0) { if (pfs.best_bird_dist != 0) {
/* neither reached the destination, pick the one with the smallest bird dist */ /* neither reached the destination, pick the one with the smallest bird dist */
@ -503,8 +503,8 @@ static uint FindShipTrack(Vehicle *v, uint tile, int dir, uint bits, uint skipti
if (pfs.best_length > best_length) goto bad; if (pfs.best_length > best_length) goto bad;
if (pfs.best_length < best_length) goto good; if (pfs.best_length < best_length) goto good;
} }
/* if we reach this position, there's two paths of equal value so far. /* if we reach this position, there's two paths of equal value so far.
* pick one randomly. */ * pick one randomly. */
r = (byte)Random(); r = (byte)Random();
if (_pick_shiptrack_table[i] == ship_dir) r += 80; if (_pick_shiptrack_table[i] == ship_dir) r += 80;
@ -554,7 +554,7 @@ static const byte _new_vehicle_direction_table[11] = {
static int ShipGetNewDirectionFromTiles(uint new_tile, uint old_tile) static int ShipGetNewDirectionFromTiles(uint new_tile, uint old_tile)
{ {
uint offs = (GET_TILE_Y(new_tile) - GET_TILE_Y(old_tile) + 1) * 4 + uint offs = (GET_TILE_Y(new_tile) - GET_TILE_Y(old_tile) + 1) * 4 +
GET_TILE_X(new_tile) - GET_TILE_X(old_tile) + 1; GET_TILE_X(new_tile) - GET_TILE_X(old_tile) + 1;
assert(offs < 11 && offs != 3 && offs != 7); assert(offs < 11 && offs != 3 && offs != 7);
return _new_vehicle_direction_table[offs]; return _new_vehicle_direction_table[offs];
@ -707,7 +707,7 @@ static void ShipController(Vehicle *v)
goto reverse_direction; goto reverse_direction;
b = _ship_subcoord[dir][track]; b = _ship_subcoord[dir][track];
gp.x = (gp.x&~0xF) | b[0]; gp.x = (gp.x&~0xF) | b[0];
gp.y = (gp.y&~0xF) | b[1]; gp.y = (gp.y&~0xF) | b[1];
@ -794,7 +794,7 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
uint unit_num; uint unit_num;
uint tile = TILE_FROM_XY(x,y); uint tile = TILE_FROM_XY(x,y);
Engine *e; Engine *e;
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
value = EstimateShipCost(p1); value = EstimateShipCost(p1);
@ -802,10 +802,10 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
return value; return value;
v = AllocateVehicle(); v = AllocateVehicle();
if (v == NULL || _ptr_to_next_order >= endof(_order_array) || if (v == NULL || _ptr_to_next_order >= endof(_order_array) ||
(unit_num = GetFreeUnitNumber(VEH_Ship)) > _patches.max_ships) (unit_num = GetFreeUnitNumber(VEH_Ship)) > _patches.max_ships)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
v->unitnumber = unit_num; v->unitnumber = unit_num;
@ -823,12 +823,12 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->x_offs = -3; v->x_offs = -3;
v->y_offs = -3; v->y_offs = -3;
v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL; v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
v->spritenum = ship_vehicle_info(p1).image_index; v->spritenum = ship_vehicle_info(p1).image_index;
v->cargo_type = ship_vehicle_info(p1).cargo_type; v->cargo_type = ship_vehicle_info(p1).cargo_type;
v->cargo_cap = ship_vehicle_info(p1).capacity; v->cargo_cap = ship_vehicle_info(p1).capacity;
v->value = value; v->value = value;
v->last_station_visited = 255; v->last_station_visited = 255;
v->max_speed = ship_vehicle_info(p1).max_speed; v->max_speed = ship_vehicle_info(p1).max_speed;
v->engine_type = (byte)p1; v->engine_type = (byte)p1;
@ -856,7 +856,7 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
InvalidateWindow(WC_SHIPS_LIST, v->owner); InvalidateWindow(WC_SHIPS_LIST, v->owner);
InvalidateWindow(WC_COMPANY, v->owner); InvalidateWindow(WC_COMPANY, v->owner);
} }
return value; return value;
} }
@ -865,7 +865,7 @@ int32 CmdSellShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
Vehicle *v; Vehicle *v;
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
v = &_vehicles[p1]; v = &_vehicles[p1];
if (!CheckOwnership(v->owner)) if (!CheckOwnership(v->owner))
@ -873,7 +873,7 @@ int32 CmdSellShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (!IsShipDepotTile(v->tile) || v->u.road.state != 0x80 || !(v->vehstatus&VS_STOPPED)) if (!IsShipDepotTile(v->tile) || v->u.road.state != 0x80 || !(v->vehstatus&VS_STOPPED))
return_cmd_error(STR_980B_SHIP_MUST_BE_STOPPED_IN); return_cmd_error(STR_980B_SHIP_MUST_BE_STOPPED_IN);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
_vehicle_sort_dirty[VEHSHIP] = true; // sell a ship _vehicle_sort_dirty[VEHSHIP] = true; // sell a ship
@ -882,7 +882,7 @@ int32 CmdSellShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteWindowById(WC_VEHICLE_VIEW, v->index);
DeleteVehicle(v); DeleteVehicle(v);
} }
return -(int32)v->value; return -(int32)v->value;
} }
@ -919,7 +919,7 @@ int32 CmdSendShipToDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
if (v->next_order&OF_UNLOAD) {v->cur_order_index++;} if (v->next_order&OF_UNLOAD) {v->cur_order_index++;}
v->next_order = OT_DUMMY; v->next_order = OT_DUMMY;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
} else { } else {
depot = FindClosestShipDepot(v); depot = FindClosestShipDepot(v);
@ -963,7 +963,7 @@ int32 CmdRefitShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 cost; int32 cost;
SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN); SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN);
v = &_vehicles[p1]; v = &_vehicles[p1];
if (!CheckOwnership(v->owner)) if (!CheckOwnership(v->owner))
return CMD_ERROR; return CMD_ERROR;

View File

@ -26,7 +26,7 @@ static void ShipRefitWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_PAINT: { case WE_PAINT: {
Vehicle *v = &_vehicles[w->window_number]; Vehicle *v = &_vehicles[w->window_number];
const byte *b; const byte *b;
int sel; int sel;
int x,y; int x,y;
@ -38,7 +38,7 @@ static void ShipRefitWndProc(Window *w, WindowEvent *e)
DrawWindowWidgets(w); DrawWindowWidgets(w);
DrawString(1, 15, STR_983F_SELECT_CARGO_TYPE_TO_CARRY, 0); DrawString(1, 15, STR_983F_SELECT_CARGO_TYPE_TO_CARRY, 0);
cargo = -1; cargo = -1;
x = 6; x = 6;
y = 25; y = 25;
@ -103,7 +103,7 @@ static void ShipRefitWndProc(Window *w, WindowEvent *e)
} break; } break;
case 4: /* refit button */ case 4: /* refit button */
if (WP(w,refit_d).cargo != 0xFF) { if (WP(w,refit_d).cargo != 0xFF) {
Vehicle *v = &_vehicles[w->window_number]; Vehicle *v = &_vehicles[w->window_number];
if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo, NULL, CMD_REFIT_SHIP | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP))) if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo, NULL, CMD_REFIT_SHIP | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP)))
DeleteWindow(w); DeleteWindow(w);
} }
@ -136,8 +136,8 @@ static void ShowShipRefitWindow(Vehicle *v)
Window *w; Window *w;
DeleteWindowById(WC_VEHICLE_REFIT, v->index); DeleteWindowById(WC_VEHICLE_REFIT, v->index);
_alloc_wnd_parent_num = v->index; _alloc_wnd_parent_num = v->index;
w = AllocateWindowDesc(&_ship_refit_desc); w = AllocateWindowDesc(&_ship_refit_desc);
w->window_number = v->index; w->window_number = v->index;
w->caption_color = v->owner; w->caption_color = v->owner;
@ -166,7 +166,7 @@ static void ShipDetailsWndProc(Window *w, WindowEvent *e)
StringID str; StringID str;
SET_DPARAM16(1, year); SET_DPARAM16(1, year);
str = STR_0199_YEAR; str = STR_0199_YEAR;
if (year != 1) { if (year != 1) {
str++; str++;
@ -212,7 +212,7 @@ static void ShipDetailsWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(0, GetCustomEngineName(v->engine_type)); SET_DPARAM16(0, GetCustomEngineName(v->engine_type));
SET_DPARAM32(2, v->value); SET_DPARAM32(2, v->value);
DrawString(74, 57, STR_9816_BUILT_VALUE, 0); DrawString(74, 57, STR_9816_BUILT_VALUE, 0);
SET_DPARAM16(0, _cargoc.names_long_p[v->cargo_type]); SET_DPARAM16(0, _cargoc.names_long_p[v->cargo_type]);
SET_DPARAM16(1, v->cargo_cap); SET_DPARAM16(1, v->cargo_cap);
DrawString(74, 67, STR_9817_CAPACITY, 0); DrawString(74, 67, STR_9817_CAPACITY, 0);
@ -295,7 +295,7 @@ static void ShowShipDetailsWindow(Vehicle *v)
VehicleID veh = v->index; VehicleID veh = v->index;
DeleteWindowById(WC_VEHICLE_ORDERS, veh); DeleteWindowById(WC_VEHICLE_ORDERS, veh);
DeleteWindowById(WC_VEHICLE_DETAILS, veh); DeleteWindowById(WC_VEHICLE_DETAILS, veh);
_alloc_wnd_parent_num = veh; _alloc_wnd_parent_num = veh;
w = AllocateWindowDesc(&_ship_details_desc); w = AllocateWindowDesc(&_ship_details_desc);
w->window_number = veh; w->window_number = veh;
w->caption_color = v->owner; w->caption_color = v->owner;
@ -314,7 +314,7 @@ static void CcBuildShip(bool success, uint tile, uint32 p1, uint32 p2)
ShowShipViewWindow(v); ShowShipViewWindow(v);
} }
static void NewShipWndProc(Window *w, WindowEvent *e) static void NewShipWndProc(Window *w, WindowEvent *e)
{ {
YearMonthDay ymd; YearMonthDay ymd;
switch(e->event) { switch(e->event) {
@ -354,7 +354,7 @@ static void NewShipWndProc(Window *w, WindowEvent *e)
DrawShipEngine(x+35, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); DrawShipEngine(x+35, y+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)));
y += 24; y += 24;
} }
sel--; sel--;
} }
} while (++engine_id, ++e,--num); } while (++engine_id, ++e,--num);
@ -370,12 +370,12 @@ static void NewShipWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(4, ship_vehicle_info(selected_id).refittable ? STR_9842_REFITTABLE : STR_EMPTY); SET_DPARAM16(4, ship_vehicle_info(selected_id).refittable ? STR_9842_REFITTABLE : STR_EMPTY);
SET_DPARAM32(5, ship_vehicle_info(selected_id).running_cost * _price.ship_running >> 8); SET_DPARAM32(5, ship_vehicle_info(selected_id).running_cost * _price.ship_running >> 8);
e = &_engines[selected_id]; e = &_engines[selected_id];
SET_DPARAM16(7, e->lifelength); SET_DPARAM16(7, e->lifelength);
SET_DPARAM8(8, e->reliability * 100 >> 16); SET_DPARAM8(8, e->reliability * 100 >> 16);
ConvertDayToYMD(&ymd, e->intro_date); ConvertDayToYMD(&ymd, e->intro_date);
SET_DPARAM16(6, ymd.year + 1920); SET_DPARAM16(6, ymd.year + 1920);
DrawString(2, 111, STR_980A_COST_SPEED_CAPACITY_RUNNING, 0); DrawString(2, 111, STR_980A_COST_SPEED_CAPACITY_RUNNING, 0);
} }
} }
@ -456,13 +456,13 @@ static void ShowBuildShipWindow(TileIndex tile)
w = AllocateWindowDesc(&_new_ship_desc); w = AllocateWindowDesc(&_new_ship_desc);
w->window_number = tile; w->window_number = tile;
w->vscroll.cap = 4; w->vscroll.cap = 4;
if (tile != 0) { if (tile != 0) {
w->caption_color = _map_owner[tile]; w->caption_color = _map_owner[tile];
} else { } else {
w->caption_color = _local_player; w->caption_color = _local_player;
} }
} }
@ -479,7 +479,7 @@ static void ShipViewWndProc(Window *w, WindowEvent *e) {
v->u.ship.state == 0x80 && v->u.ship.state == 0x80 &&
IsShipDepotTile(v->tile)) IsShipDepotTile(v->tile))
disabled = 0; disabled = 0;
if (v->owner != _local_player) if (v->owner != _local_player)
disabled |= 1<<7 | 1<<6; disabled |= 1<<7 | 1<<6;
w->disabled_state = disabled; w->disabled_state = disabled;
@ -535,13 +535,13 @@ static void ShipViewWndProc(Window *w, WindowEvent *e) {
switch(e->click.widget) { switch(e->click.widget) {
case 4: /* start stop */ case 4: /* start stop */
DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_SHIP | CMD_MSG(STR_9818_CAN_T_STOP_START_SHIP)); DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_SHIP | CMD_MSG(STR_9818_CAN_T_STOP_START_SHIP));
break; break;
case 5: /* center main view */ case 5: /* center main view */
ScrollMainWindowTo(v->x_pos, v->y_pos); ScrollMainWindowTo(v->x_pos, v->y_pos);
break; break;
case 6: /* goto hangar */ case 6: /* goto hangar */
DoCommandP(v->tile, v->index, 0, NULL, CMD_SEND_SHIP_TO_DEPOT | CMD_MSG(STR_9819_CAN_T_SEND_SHIP_TO_DEPOT)); DoCommandP(v->tile, v->index, 0, NULL, CMD_SEND_SHIP_TO_DEPOT | CMD_MSG(STR_9819_CAN_T_SEND_SHIP_TO_DEPOT));
break; break;
case 7: /* refit */ case 7: /* refit */
ShowShipRefitWindow(v); ShowShipRefitWindow(v);
@ -557,7 +557,7 @@ static void ShipViewWndProc(Window *w, WindowEvent *e) {
case WE_DESTROY: case WE_DESTROY:
DeleteWindowById(WC_VEHICLE_ORDERS, w->window_number); DeleteWindowById(WC_VEHICLE_ORDERS, w->window_number);
DeleteWindowById(WC_VEHICLE_REFIT, w->window_number); DeleteWindowById(WC_VEHICLE_REFIT, w->window_number);
DeleteWindowById(WC_VEHICLE_DETAILS, w->window_number); DeleteWindowById(WC_VEHICLE_DETAILS, w->window_number);
break; break;
} }
@ -641,17 +641,17 @@ static void DrawShipDepotWindow(Window *w)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Ship && if (v->type == VEH_Ship &&
v->u.ship.state == 0x80 && v->u.ship.state == 0x80 &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
--num < 0 && num >= -6) { --num < 0 && num >= -6) {
DrawShipImage(v, x+19, y, WP(w,traindepot_d).sel); DrawShipImage(v, x+19, y, WP(w,traindepot_d).sel);
SET_DPARAM16(0, v->unitnumber); SET_DPARAM16(0, v->unitnumber);
DrawString(x, y, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, 0); DrawString(x, y, (uint16)(v->max_age-366) >= v->age ? STR_00E2 : STR_00E3, 0);
DrawSprite( (v->vehstatus & VS_STOPPED) ? 0xC12 : 0xC13, x, y + 9); DrawSprite( (v->vehstatus & VS_STOPPED) ? 0xC12 : 0xC13, x, y + 9);
if ((x+=90) == 2+90*3) { if ((x+=90) == 2+90*3) {
x = 2; x = 2;
y += 24; y += 24;
@ -666,7 +666,7 @@ static int GetVehicleFromShipDepotWndPt(Window *w, int x, int y, Vehicle **veh)
TileIndex tile; TileIndex tile;
Vehicle *v; Vehicle *v;
int pos; int pos;
xt = x / 90; xt = x / 90;
xm = x % 90; xm = x % 90;
if (xt >= 5) if (xt >= 5)
@ -682,7 +682,7 @@ static int GetVehicleFromShipDepotWndPt(Window *w, int x, int y, Vehicle **veh)
tile = w->window_number; tile = w->window_number;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Ship && if (v->type == VEH_Ship &&
v->vehstatus&VS_HIDDEN && v->vehstatus&VS_HIDDEN &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
--pos < 0) { --pos < 0) {
*veh = v; *veh = v;
@ -695,7 +695,7 @@ static int GetVehicleFromShipDepotWndPt(Window *w, int x, int y, Vehicle **veh)
} }
return 1; /* outside */ return 1; /* outside */
} }
static void ShipDepotClick(Window *w, int x, int y) static void ShipDepotClick(Window *w, int x, int y)
@ -714,7 +714,7 @@ static void ShipDepotClick(Window *w, int x, int y)
if (v != NULL) { if (v != NULL) {
WP(w,traindepot_d).sel = v->index; WP(w,traindepot_d).sel = v->index;
SetWindowDirty(w); SetWindowDirty(w);
SetObjectToPlaceWnd( SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner)) + SetObjectToPlaceWnd( SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner)) +
GetShipImage(v, 6), 4, w); GetShipImage(v, 6), 4, w);
} }
break; break;
@ -743,7 +743,7 @@ static void ShipDepotWndProc(Window *w, WindowEvent *e) {
case 2: case 2:
ShipDepotClick(w, e->click.pt.x, e->click.pt.y); ShipDepotClick(w, e->click.pt.x, e->click.pt.y);
break; break;
case 5: case 5:
ShowBuildShipWindow(w->window_number); ShowBuildShipWindow(w->window_number);
break; break;
@ -773,12 +773,12 @@ static void ShipDepotWndProc(Window *w, WindowEvent *e) {
ShowShipViewWindow(v); ShowShipViewWindow(v);
} }
} break; } break;
case 3: case 3:
if (!HASBIT(w->disabled_state, 3) && if (!HASBIT(w->disabled_state, 3) &&
WP(w,traindepot_d).sel != INVALID_VEHICLE) { WP(w,traindepot_d).sel != INVALID_VEHICLE) {
Vehicle *v; Vehicle *v;
HandleButtonClick(w, 3); HandleButtonClick(w, 3);
v = &_vehicles[WP(w,traindepot_d).sel]; v = &_vehicles[WP(w,traindepot_d).sel];
@ -786,7 +786,7 @@ static void ShipDepotWndProc(Window *w, WindowEvent *e) {
_backup_orders_tile = v->tile; _backup_orders_tile = v->tile;
BackupVehicleOrders(v, _backup_orders_data); BackupVehicleOrders(v, _backup_orders_data);
if (!DoCommandP(v->tile, v->index, 0, NULL, CMD_SELL_SHIP | CMD_MSG(STR_980C_CAN_T_SELL_SHIP))) if (!DoCommandP(v->tile, v->index, 0, NULL, CMD_SELL_SHIP | CMD_MSG(STR_980C_CAN_T_SELL_SHIP)))
_backup_orders_tile = 0; _backup_orders_tile = 0;
} }
@ -854,7 +854,7 @@ static void DrawSmallShipSchedule(Vehicle *v, int x, int y) {
if ((ord & OT_MASK) == OT_GOTO_STATION) { if ((ord & OT_MASK) == OT_GOTO_STATION) {
st = DEREF_STATION(ord >> 8); st = DEREF_STATION(ord >> 8);
if (!(st->had_vehicle_of_type & HVOT_BUOY)) { if (!(st->had_vehicle_of_type & HVOT_BUOY)) {
SET_DPARAM16(0, ord >> 8); SET_DPARAM16(0, ord >> 8);
DrawString(x, y, STR_A036, 0); DrawString(x, y, STR_A036, 0);
@ -894,7 +894,7 @@ static void MakeSortedShiptList(byte owner)
// ships are stored as a cummulative index, eg 25, 41, 43. This means // ships are stored as a cummulative index, eg 25, 41, 43. This means
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
for (i = &_num_ship_sort[1]; i != endof(_num_ship_sort); i++) {*i += *(i-1);} for (i = &_num_ship_sort[1]; i != endof(_num_ship_sort); i++) {*i += *(i-1);}
// sort by owner, then only subsort the requested owner-vehicles // sort by owner, then only subsort the requested owner-vehicles
qsort(_ship_sort, n, sizeof(_ship_sort[0]), GeneralOwnerSorter); qsort(_ship_sort, n, sizeof(_ship_sort[0]), GeneralOwnerSorter);
@ -939,7 +939,7 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 ships // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 ships
i = (window_number == 0) ? 0 : _num_ship_sort[window_number-1]; i = (window_number == 0) ? 0 : _num_ship_sort[window_number-1];
SetVScrollCount(w, _num_ship_sort[window_number] - i); SetVScrollCount(w, _num_ship_sort[window_number] - i);
/* draw the widgets */ /* draw the widgets */
{ {
Player *p = DEREF_PLAYER(window_number); Player *p = DEREF_PLAYER(window_number);
@ -982,7 +982,7 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
SET_DPARAM32(0, v->profit_this_year); SET_DPARAM32(0, v->profit_this_year);
SET_DPARAM32(1, v->profit_last_year); SET_DPARAM32(1, v->profit_last_year);
DrawString(x + 12, y + 28, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0); DrawString(x + 12, y + 28, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
if (v->string_id != STR_SV_SHIP_NAME) { if (v->string_id != STR_SV_SHIP_NAME) {
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
DrawString(x+12, y, STR_01AB, 0); DrawString(x+12, y, STR_01AB, 0);
@ -1010,7 +1010,7 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
return; return;
case 6: { /* Matrix to show vehicles */ case 6: { /* Matrix to show vehicles */
uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_BIG; uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_BIG;
if (id_v >= w->vscroll.cap) { return;} // click out of bounds if (id_v >= w->vscroll.cap) { return;} // click out of bounds
id_v += w->vscroll.pos; id_v += w->vscroll.pos;
@ -1035,15 +1035,15 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
tile = _last_built_ship_depot_tile; tile = _last_built_ship_depot_tile;
do { do {
if (_map_owner[tile] == _local_player && IsShipDepotTile(tile)) { if (_map_owner[tile] == _local_player && IsShipDepotTile(tile)) {
ShowShipDepotWindow(tile); ShowShipDepotWindow(tile);
ShowBuildShipWindow(tile); ShowBuildShipWindow(tile);
return; return;
} }
tile = TILE_MASK(tile + 1); tile = TILE_MASK(tile + 1);
} while(tile != _last_built_ship_depot_tile); } while(tile != _last_built_ship_depot_tile);
ShowBuildShipWindow(0); ShowBuildShipWindow(0);
} break; } break;
} }

View File

@ -78,7 +78,7 @@ static const uint16 _legend_land_contours[] = {
MK(0x5E,STR_00F2_300M), MK(0x5E,STR_00F2_300M),
MK(0x1F,STR_00F3_400M), MK(0x1F,STR_00F3_400M),
MK(0x27,STR_00F4_500M), MK(0x27,STR_00F4_500M),
MS(0xD7,STR_00EB_ROADS), MS(0xD7,STR_00EB_ROADS),
MK(0x0A,STR_00EC_RAILROADS), MK(0x0A,STR_00EC_RAILROADS),
MK(0x98,STR_00ED_STATIONS_AIRPORTS_DOCKS), MK(0x98,STR_00ED_STATIONS_AIRPORTS_DOCKS),
@ -509,7 +509,7 @@ static uint32 INLINE GetSmallMapVegetationPixels(uint tile)
if (i >= 0) i = (i >> 2); if (i >= 0) i = (i >> 2);
bits = _vegetation_clear_bits[i + 4]; bits = _vegetation_clear_bits[i + 4];
} else if (t == MP_INDUSTRY) { } else if (t == MP_INDUSTRY) {
bits = IS_BYTE_INSIDE(_map5[tile], 0x10, 0x12) ? MKCOLOR(0xD0D0D0D0) : MKCOLOR(0xB5B5B5B5); bits = IS_BYTE_INSIDE(_map5[tile], 0x10, 0x12) ? MKCOLOR(0xD0D0D0D0) : MKCOLOR(0xB5B5B5B5);
} else if (t == MP_TREES) { } else if (t == MP_TREES) {
bits = MKCOLOR(0x54575754); bits = MKCOLOR(0x54575754);
if ((_map2[tile] & 0x30) == 0x20) if ((_map2[tile] & 0x30) == 0x20)
@ -550,7 +550,7 @@ static uint32 INLINE GetSmallMapOwnerPixels(uint tile)
t = GET_TILETYPE(tile); t = GET_TILETYPE(tile);
if (t == MP_HOUSE || _map_owner[tile] == OWNER_TOWN) { if (t == MP_HOUSE || _map_owner[tile] == OWNER_TOWN) {
t = 0x80; t = 0x80;
} else if (t == MP_INDUSTRY) { } else if (t == MP_INDUSTRY) {
t = 0xff; t = 0xff;
} else { } else {
@ -641,10 +641,10 @@ static void DrawSmallMap(DrawPixelInfo *dpi, Window *w, int type, bool show_town
/* setup owners ptr */ /* setup owners ptr */
_owner_colors = tbl = alloca(256 * sizeof(*_owner_colors)); _owner_colors = tbl = alloca(256 * sizeof(*_owner_colors));
/* clear the town colors */ /* clear the town colors */
memset(tbl + 128, 0xB4, 128 * sizeof(*_owner_colors)); memset(tbl + 128, 0xB4, 128 * sizeof(*_owner_colors));
/* fill with some special colors */ /* fill with some special colors */
tbl[0x10] = MKCOLOR(0x54545454); tbl[0x10] = MKCOLOR(0x54545454);
tbl[0x11] = MKCOLOR(0xCACACACA); tbl[0x11] = MKCOLOR(0xCACACACA);
@ -655,7 +655,7 @@ static void DrawSmallMap(DrawPixelInfo *dpi, Window *w, int type, bool show_town
if (p->is_active) { if (p->is_active) {
tbl[p->index] = dup_byte32(GetSpritePtr(0x307 + p->player_color)[0xCB]); tbl[p->index] = dup_byte32(GetSpritePtr(0x307 + p->player_color)[0xCB]);
} }
} }
} }
tile_x = (int)WP(w,smallmap_d).scroll_x >> 4; tile_x = (int)WP(w,smallmap_d).scroll_x >> 4;
@ -712,7 +712,7 @@ static void DrawSmallMap(DrawPixelInfo *dpi, Window *w, int type, bool show_town
proc(ptr, tile_x, tile_y, dpi->pitch*2, reps, mask); proc(ptr, tile_x, tile_y, dpi->pitch*2, reps, mask);
} }
skip_column: skip_column:
if (y == 0) { if (y == 0) {
tile_y++; tile_y++;
y++; y++;
@ -736,7 +736,7 @@ skip_column:
if (v->type != 0 && v->type != 0x14 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0) { if (v->type != 0 && v->type != 0x14 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0) {
// Remap into flat coordinates. // Remap into flat coordinates.
Point pt = RemapCoords( Point pt = RemapCoords(
(int)(v->x_pos - WP(w,smallmap_d).scroll_x) >> 4, (int)(v->x_pos - WP(w,smallmap_d).scroll_x) >> 4,
(int)(v->y_pos - WP(w,smallmap_d).scroll_y) >> 4, (int)(v->y_pos - WP(w,smallmap_d).scroll_y) >> 4,
0); 0);
x = pt.x; x = pt.x;
@ -765,11 +765,11 @@ skip_column:
continue; continue;
skip = true; skip = true;
} }
// Calculate pointer to pixel and the color // Calculate pointer to pixel and the color
ptr = dpi->dst_ptr + y * dpi->pitch + x; ptr = dpi->dst_ptr + y * dpi->pitch + x;
color = (type == 1) ? _vehicle_type_colors[v->type-0x10] : 0xF; color = (type == 1) ? _vehicle_type_colors[v->type-0x10] : 0xF;
// And draw either one or two pixels depending on clipping // And draw either one or two pixels depending on clipping
ptr[0] = color; ptr[0] = color;
if (!skip) if (!skip)
@ -789,11 +789,11 @@ skip_column:
0); 0);
x = pt.x - WP(w,smallmap_d).subscroll + 3 - (t->sign.width_2 >> 1); x = pt.x - WP(w,smallmap_d).subscroll + 3 - (t->sign.width_2 >> 1);
y = pt.y; y = pt.y;
// Check if the town sign is within bounds // Check if the town sign is within bounds
if (x + t->sign.width_2 > dpi->left && if (x + t->sign.width_2 > dpi->left &&
x < dpi->left + dpi->width && x < dpi->left + dpi->width &&
y + 6 > dpi->top && y + 6 > dpi->top &&
y < dpi->top + dpi->height) { y < dpi->top + dpi->height) {
// And draw it. // And draw it.
SET_DPARAM16(0, t->index); SET_DPARAM16(0, t->index);
@ -801,7 +801,7 @@ skip_column:
} }
} }
} }
} }
// Draw map indicators // Draw map indicators
{ {
@ -809,7 +809,7 @@ skip_column:
// Find main viewport. // Find main viewport.
vp = FindWindowById(WC_MAIN_WINDOW,0)->viewport; vp = FindWindowById(WC_MAIN_WINDOW,0)->viewport;
pt = RemapCoords( pt = RemapCoords(
WP(w,smallmap_d).scroll_x, WP(w,smallmap_d).scroll_x,
WP(w,smallmap_d).scroll_y, WP(w,smallmap_d).scroll_y,
@ -846,7 +846,7 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e)
/* draw the window */ /* draw the window */
SET_DPARAM16(0, STR_00E5_CONTOURS + _smallmap_type); SET_DPARAM16(0, STR_00E5_CONTOURS + _smallmap_type);
DrawWindowWidgets(w); DrawWindowWidgets(w);
/* draw the legend */ /* draw the legend */
tbl = _legend_table[(_smallmap_type != 2) ? _smallmap_type : (_opt.landscape + IND_OFFS)]; tbl = _legend_table[(_smallmap_type != 2) ? _smallmap_type : (_opt.landscape + IND_OFFS)];
x = 4; x = 4;
@ -877,7 +877,7 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e)
case WE_CLICK: case WE_CLICK:
switch(e->click.widget) { switch(e->click.widget) {
case 2: {/* big/small size */ case 2: {/* big/small size */
// const Widget *wi = w->widget; // const Widget *wi = w->widget;
DeleteWindow(w); DeleteWindow(w);
SndPlayFx(0x13); SndPlayFx(0x13);
{ {
@ -903,7 +903,7 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e)
case 5: /* show land contours */ case 5: /* show land contours */
case 6: /* show vehicles */ case 6: /* show vehicles */
case 7: /* show industries */ case 7: /* show industries */
case 8: /* show transport routes */ case 8: /* show transport routes */
case 9: /* show vegetation */ case 9: /* show vegetation */
case 10: /* show land owners */ case 10: /* show land owners */
w->click_state &= ~(1<<5|1<<6|1<<7|1<<8|1<<9|1<<10); w->click_state &= ~(1<<5|1<<6|1<<7|1<<8|1<<9|1<<10);
@ -978,7 +978,7 @@ static void DoShowSmallMap(int big)
int x,y; int x,y;
_smallmap_size = big; _smallmap_size = big;
w = AllocateWindowDescFront(_smallmap_descs[big], 0); w = AllocateWindowDescFront(_smallmap_descs[big], 0);
if (w) { if (w) {
w->click_state = (1<<5) << _smallmap_type | _smallmap_show_towns << 11; w->click_state = (1<<5) << _smallmap_type | _smallmap_show_towns << 11;
@ -1039,7 +1039,7 @@ static void ExtraViewPortWndProc(Window *w, WindowEvent *e)
// set this view to same location. Based on the center, adjusting for zoom // set this view to same location. Based on the center, adjusting for zoom
WP(w2,vp_d).scrollpos_x = x - (w2->viewport->virtual_width - (294 <<vp->zoom) )/2; WP(w2,vp_d).scrollpos_x = x - (w2->viewport->virtual_width - (294 <<vp->zoom) )/2;
WP(w2,vp_d).scrollpos_y = y - (w2->viewport->virtual_height - (214 << vp->zoom) )/2; WP(w2,vp_d).scrollpos_y = y - (w2->viewport->virtual_height - (214 << vp->zoom) )/2;
} break; } break;
case 7: { /* inverse location button (move this view to same spot as main view) */ case 7: { /* inverse location button (move this view to same spot as main view) */
Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0); Window * w2 = FindWindowById(WC_MAIN_WINDOW, 0);
@ -1047,9 +1047,9 @@ static void ExtraViewPortWndProc(Window *w, WindowEvent *e)
int y = WP(w2,vp_d).scrollpos_y; int y = WP(w2,vp_d).scrollpos_y;
WP(w,vp_d).scrollpos_x = x + (w2->viewport->virtual_width - (294 <<vp->zoom) )/2; WP(w,vp_d).scrollpos_x = x + (w2->viewport->virtual_width - (294 <<vp->zoom) )/2;
WP(w,vp_d).scrollpos_y = y + (w2->viewport->virtual_height - (214 << vp->zoom) )/2; WP(w,vp_d).scrollpos_y = y + (w2->viewport->virtual_height - (214 << vp->zoom) )/2;
} break; } break;
} }
} break; } break;
} }
} }
@ -1066,7 +1066,7 @@ void ShowExtraViewPortWindow()
{ {
Window *w, *v; Window *w, *v;
int i = 0; int i = 0;
// find next free window number for extra viewport // find next free window number for extra viewport
while (FindWindowById(WC_EXTRA_VIEW_PORT,i) ) { while (FindWindowById(WC_EXTRA_VIEW_PORT,i) ) {
i++; i++;
@ -1078,8 +1078,8 @@ void ShowExtraViewPortWindow()
// disable zoom in button // disable zoom in button
w->disabled_state = 1 << 4; w->disabled_state = 1 << 4;
// the main window with the main view // the main window with the main view
v = FindWindowById(WC_MAIN_WINDOW, 0); v = FindWindowById(WC_MAIN_WINDOW, 0);
// New viewport start ats (zero,zero) // New viewport start ats (zero,zero)
AssignWindowViewport(w, 3, 17, 294, 214, 0 , 0); AssignWindowViewport(w, 3, 17, 294, 214, 0 , 0);
// center on same place as main window (zoom is maximum, no adjustment needed) // center on same place as main window (zoom is maximum, no adjustment needed)

22
sound.c
View File

@ -73,7 +73,7 @@ static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples)
volume_left = sc->volume_left; volume_left = sc->volume_left;
volume_right = sc->volume_right; volume_right = sc->volume_right;
if (frac_speed == 0x10000) { if (frac_speed == 0x10000) {
// Special case when frac_speed is 0x10000 // Special case when frac_speed is 0x10000
do { do {
buffer[0]+= *b * volume_left >> 8; buffer[0]+= *b * volume_left >> 8;
@ -110,10 +110,10 @@ void MxMixSamples(Mixer *mx, void *buffer, uint samples)
{ {
int i; int i;
MixerChannel *mc; MixerChannel *mc;
// Clear the buffer // Clear the buffer
memset(buffer, 0, sizeof(int16)*2*samples); memset(buffer, 0, sizeof(int16)*2*samples);
// Mix each channel // Mix each channel
for(i=0,mc=mx->channels; i!=lengthof(mx->channels); i++,mc++) { for(i=0,mc=mx->channels; i!=lengthof(mx->channels); i++,mc++) {
if (mc->active) { if (mc->active) {
@ -154,7 +154,7 @@ static void MxSetChannelRawSrc(MixerChannel *mc, void *mem, uint size, uint rate
// adjust the magnitude to prevent overflow // adjust the magnitude to prevent overflow
while (size & 0xFFFF0000) while (size & 0xFFFF0000)
size >>= 1, rate = (rate >> 1) + 1; size >>= 1, rate = (rate >> 1) + 1;
mc->samples_left = size * mc->mx->play_rate / rate; mc->samples_left = size * mc->mx->play_rate / rate;
} }
@ -180,7 +180,7 @@ static void MxOpenBankFile(Mixer *mx, const char *filename)
fe->file_offset = FioReadDword(); fe->file_offset = FioReadDword();
fe->file_size = FioReadDword(); fe->file_size = FioReadDword();
} }
fe = mx->files; fe = mx->files;
for(i=0; i!=count; i++,fe++) { for(i=0; i!=count; i++,fe++) {
FioSeekTo(fe->file_offset, SEEK_SET); FioSeekTo(fe->file_offset, SEEK_SET);
@ -221,7 +221,7 @@ static bool MxSetBankSource(MixerChannel *mc, uint bank)
if (fe->file_size == 0) if (fe->file_size == 0)
return false; return false;
mem = malloc(fe->file_size); mem = malloc(fe->file_size);
FioSeekToFile(fe->file_offset); FioSeekToFile(fe->file_offset);
FioReadBlock(mem, fe->file_size); FioReadBlock(mem, fe->file_size);
@ -229,7 +229,7 @@ static bool MxSetBankSource(MixerChannel *mc, uint bank)
for(i=0; i!=fe->file_size; i++) { for(i=0; i!=fe->file_size; i++) {
((byte*)mem)[i] ^= 0x80; ((byte*)mem)[i] ^= 0x80;
} }
assert(fe->bits_per_sample == 8 && fe->channels == 1 && fe->file_size != 0 && fe->rate != 0); assert(fe->bits_per_sample == 8 && fe->channels == 1 && fe->file_size != 0 && fe->rate != 0);
MxSetChannelRawSrc(mc, mem, fe->file_size, fe->rate, MX_AUTOFREE | MX_UNSIGNED); MxSetChannelRawSrc(mc, mem, fe->file_size, fe->rate, MX_AUTOFREE | MX_UNSIGNED);
@ -302,10 +302,10 @@ void SndPlayScreenCoordFx(int sound, int x, int y)
if ((vp=w->viewport) && if ((vp=w->viewport) &&
IS_INSIDE_1D(x, vp->virtual_left, vp->virtual_width) && IS_INSIDE_1D(x, vp->virtual_left, vp->virtual_width) &&
IS_INSIDE_1D(y, vp->virtual_top, vp->virtual_height)) { IS_INSIDE_1D(y, vp->virtual_top, vp->virtual_height)) {
left = ((x - vp->virtual_left) >> vp->zoom) + vp->left; left = ((x - vp->virtual_left) >> vp->zoom) + vp->left;
StartSound( StartSound(
_sound_idx[sound], _sound_idx[sound],
clamp(left / 71, 0, 8), clamp(left / 71, 0, 8),
(_sound_base_vol[sound] * msf.effect_vol * _vol_factor_by_zoom[vp->zoom]) >> 15 (_sound_base_vol[sound] * msf.effect_vol * _vol_factor_by_zoom[vp->zoom]) >> 15
); );
@ -334,8 +334,8 @@ void SndPlayVehicleFx(int sound, Vehicle *v)
void SndPlayFx(int sound) void SndPlayFx(int sound)
{ {
StartSound( StartSound(
_sound_idx[sound], _sound_idx[sound],
4, 4,
(_sound_base_vol[sound] * msf.effect_vol) >> 7 (_sound_base_vol[sound] * msf.effect_vol) >> 7
); );
} }

View File

@ -28,7 +28,7 @@ struct Station {
ViewportSign sign; ViewportSign sign;
uint16 had_vehicle_of_type; uint16 had_vehicle_of_type;
byte time_since_load; byte time_since_load;
byte time_since_unload; byte time_since_unload;
byte delete_ctr; byte delete_ctr;

View File

@ -126,7 +126,7 @@ static Station *AllocateStation()
return NULL; return NULL;
} }
i = a_free->index; i = a_free->index;
memset(a_free, 0, sizeof(Station)); memset(a_free, 0, sizeof(Station));
a_free->index = i; a_free->index = i;
return a_free; return a_free;
@ -143,7 +143,7 @@ static int CountMapSquareAround(uint tile, byte type, byte min, byte max) {
TILE_XY(-6,1), 1, 1, 1, 1, 1, 1, TILE_XY(-6,1), 1, 1, 1, 1, 1, 1,
TILE_XY(-6,1), 1, 1, 1, 1, 1, 1, TILE_XY(-6,1), 1, 1, 1, 1, 1, 1,
0, 0,
}; };
int j; int j;
const TileIndexDiff *p = _count_square_table; const TileIndexDiff *p = _count_square_table;
int num = 0; int num = 0;
@ -189,9 +189,9 @@ static bool GenerateStationName(Station *st, uint tile, int flag)
CLRBIT(free_names, str); CLRBIT(free_names, str);
} }
} }
} }
} }
/* check default names */ /* check default names */
tmp = free_names & _gen_station_name_bits[flag]; tmp = free_names & _gen_station_name_bits[flag];
if (tmp != 0) { if (tmp != 0) {
@ -255,9 +255,9 @@ static bool GenerateStationName(Station *st, uint tile, int flag)
~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_EAST)) | (1<<M(STR_SV_STNAME_NORTH)) ), ~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_EAST)) | (1<<M(STR_SV_STNAME_NORTH)) ),
~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_WEST)) | (1<<M(STR_SV_STNAME_EAST)) ), ~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_WEST)) | (1<<M(STR_SV_STNAME_EAST)) ),
}; };
free_names &= _direction_and_table[ free_names &= _direction_and_table[
(GET_TILE_X(tile) < GET_TILE_X(t->xy)) + (GET_TILE_X(tile) < GET_TILE_X(t->xy)) +
(GET_TILE_Y(tile) < GET_TILE_Y(t->xy))*2]; (GET_TILE_Y(tile) < GET_TILE_Y(t->xy))*2];
} }
@ -335,7 +335,7 @@ void UpdateAllStationVirtCoord()
Station *st; Station *st;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy != 0) if (st->xy != 0)
UpdateStationVirtCoord(st); UpdateStationVirtCoord(st);
} }
} }
@ -488,7 +488,7 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
} }
span[4] = st->airport_tile; span[4] = st->airport_tile;
if (st->airport_tile != 0) { if (st->airport_tile != 0) {
span[5] = st->airport_tile + TILE_XY(_airport_size_x[st->airport_type]-1, _airport_size_y[st->airport_type]-1); span[5] = st->airport_tile + TILE_XY(_airport_size_x[st->airport_type]-1, _airport_size_y[st->airport_type]-1);
} }
span[6] = st->dock_tile; span[6] = st->dock_tile;
@ -529,7 +529,7 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
new_acc = GetAcceptanceMask(st); new_acc = GetAcceptanceMask(st);
if (old_acc == new_acc) if (old_acc == new_acc)
return; return;
// show a message to report that the acceptance was changed? // show a message to report that the acceptance was changed?
if (show_msg && st->owner == _local_player && st->facilities) { if (show_msg && st->owner == _local_player && st->facilities) {
uint32 accept=0, reject=0; /* these contain two string ids each */ uint32 accept=0, reject=0; /* these contain two string ids each */
@ -537,7 +537,7 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
do { do {
if (new_acc & 1) { if (new_acc & 1) {
if (!(old_acc & 1)) accept = (accept << 16) | *str; if (!(old_acc & 1)) accept = (accept << 16) | *str;
} else { } else {
if (old_acc & 1) reject = (reject << 16) | *str; if (old_acc & 1) reject = (reject << 16) | *str;
} }
@ -595,7 +595,7 @@ int32 CheckFlatLandBelow(uint tile, uint w, uint h, uint flags, uint invalid_dir
cost += _price.terraform; cost += _price.terraform;
flat_z += 8; flat_z += 8;
} }
// get corresponding flat level and make sure that all parts of the station have the same level. // get corresponding flat level and make sure that all parts of the station have the same level.
if (allowed_z == -1) { if (allowed_z == -1) {
// first tile // first tile
@ -605,7 +605,7 @@ int32 CheckFlatLandBelow(uint tile, uint w, uint h, uint flags, uint invalid_dir
return CMD_ERROR; return CMD_ERROR;
} }
// if station is set, then we have special handling to allow building on top of already existing stations. // if station is set, then we have special handling to allow building on top of already existing stations.
// so station points to -1 if we can build on any station. or it points to a station if we're only allowed to build // so station points to -1 if we can build on any station. or it points to a station if we're only allowed to build
// on exactly that station. // on exactly that station.
if (station && IS_TILETYPE(tile_cur, MP_STATION)) { if (station && IS_TILETYPE(tile_cur, MP_STATION)) {
@ -795,7 +795,7 @@ int32 CmdBuildRailroadStation(int x_org, int y_org, uint32 flags, uint32 p1, uin
st = AllocateStation(); st = AllocateStation();
if (st == NULL) if (st == NULL)
return CMD_ERROR; return CMD_ERROR;
st->town = ClosestTownFromTile(tile_org, (uint)-1); st->town = ClosestTownFromTile(tile_org, (uint)-1);
if (_current_player < MAX_PLAYERS && flags&DC_EXEC) if (_current_player < MAX_PLAYERS && flags&DC_EXEC)
SETBIT(st->town->have_ratings, _current_player); SETBIT(st->town->have_ratings, _current_player);
@ -819,20 +819,20 @@ int32 CmdBuildRailroadStation(int x_org, int y_org, uint32 flags, uint32 p1, uin
st->trainst_w = finalvalues[1]; st->trainst_w = finalvalues[1];
st->trainst_h = finalvalues[2]; st->trainst_h = finalvalues[2];
st->build_date = _date; st->build_date = _date;
tile_delta = direction ? TILE_XY(0,1) : TILE_XY(1,0); tile_delta = direction ? TILE_XY(0,1) : TILE_XY(1,0);
layout_ptr = alloca(numtracks * plat_len); layout_ptr = alloca(numtracks * plat_len);
GetStationLayout(layout_ptr, numtracks, plat_len); GetStationLayout(layout_ptr, numtracks, plat_len);
do { do {
int tile = tile_org; int tile = tile_org;
int w = plat_len; int w = plat_len;
do { do {
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP5 | MP_MAP3LO | MP_MAP3HI_CLEAR, MP_MAP2 | MP_MAP5 | MP_MAP3LO | MP_MAP3HI_CLEAR,
station_index, /* map2 parameter */ station_index, /* map2 parameter */
@ -866,7 +866,7 @@ static void MakeRailwayStationAreaSmaller(Station *st)
uint i; uint i;
restart: restart:
// too small? // too small?
if (w != 0 && h != 0) { if (w != 0 && h != 0) {
// check the left side, x = constant, y changes // check the left side, x = constant, y changes
@ -966,7 +966,7 @@ static int32 RemoveRailroadStation(Station *st, TileIndex tile, uint32 flags)
tile = st->train_tile; tile = st->train_tile;
w = st->trainst_w; w = st->trainst_w;
h = st->trainst_h; h = st->trainst_h;
assert(w != 0 && h != 0); assert(w != 0 && h != 0);
/* cost is area * constant */ /* cost is area * constant */
@ -996,7 +996,7 @@ static int32 RemoveRailroadStation(Station *st, TileIndex tile, uint32 flags)
UpdateStationVirtCoordDirty(st); UpdateStationVirtCoordDirty(st);
DeleteStationIfEmpty(st); DeleteStationIfEmpty(st);
} }
return cost; return cost;
} }
@ -1056,7 +1056,7 @@ int32 CmdBuildBusStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (st != NULL) { if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player) if (st->owner != OWNER_NONE && st->owner != _current_player)
return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
if (!CheckStationSpreadOut(st, tile, 1, 1)) if (!CheckStationSpreadOut(st, tile, 1, 1))
return CMD_ERROR; return CMD_ERROR;
@ -1091,10 +1091,10 @@ int32 CmdBuildBusStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
st->facilities |= FACIL_BUS_STOP; st->facilities |= FACIL_BUS_STOP;
st->bus_stop_status = 3; st->bus_stop_status = 3;
st->owner = _current_player; st->owner = _current_player;
st->build_date = _date; st->build_date = _date;
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP5 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR, MP_MAP2 | MP_MAP5 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR,
st->index, /* map2 parameter */ st->index, /* map2 parameter */
@ -1117,7 +1117,7 @@ static int32 RemoveBusStation(Station *st, uint32 flags)
return CMD_ERROR; return CMD_ERROR;
tile = st->bus_tile; tile = st->bus_tile;
if (!EnsureNoVehicle(tile)) if (!EnsureNoVehicle(tile))
return CMD_ERROR; return CMD_ERROR;
@ -1131,7 +1131,7 @@ static int32 RemoveBusStation(Station *st, uint32 flags)
DeleteStationIfEmpty(st); DeleteStationIfEmpty(st);
} }
return _price.remove_bus_station; return _price.remove_bus_station;
} }
@ -1168,7 +1168,7 @@ int32 CmdBuildTruckStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (st != NULL) { if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player) if (st->owner != OWNER_NONE && st->owner != _current_player)
return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
if (!CheckStationSpreadOut(st, tile, 1, 1)) if (!CheckStationSpreadOut(st, tile, 1, 1))
return CMD_ERROR; return CMD_ERROR;
@ -1206,8 +1206,8 @@ int32 CmdBuildTruckStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
st->build_date = _date; st->build_date = _date;
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP5, MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP5,
st->index, /* map2 parameter */ st->index, /* map2 parameter */
p1 + 0x43 /* map5 parameter */ p1 + 0x43 /* map5 parameter */
@ -1227,7 +1227,7 @@ static int32 RemoveTruckStation(Station *st, uint32 flags)
if (_current_player != OWNER_WATER && !CheckOwnership(st->owner)) if (_current_player != OWNER_WATER && !CheckOwnership(st->owner))
return CMD_ERROR; return CMD_ERROR;
tile = st->lorry_tile; tile = st->lorry_tile;
if (!EnsureNoVehicle(tile)) if (!EnsureNoVehicle(tile))
@ -1235,7 +1235,7 @@ static int32 RemoveTruckStation(Station *st, uint32 flags)
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
DoClearSquare(tile); DoClearSquare(tile);
st->lorry_tile = 0; st->lorry_tile = 0;
st->facilities &= ~FACIL_TRUCK_STOP; st->facilities &= ~FACIL_TRUCK_STOP;
@ -1243,7 +1243,7 @@ static int32 RemoveTruckStation(Station *st, uint32 flags)
DeleteStationIfEmpty(st); DeleteStationIfEmpty(st);
} }
return _price.remove_truck_station; return _price.remove_truck_station;
} }
// FIXME -- need to move to its corresponding Airport variable // FIXME -- need to move to its corresponding Airport variable
@ -1294,7 +1294,7 @@ static const byte * const _airport_map5_tiles[] = {
_airport_map5_tiles_country, // Country Airfield (small) _airport_map5_tiles_country, // Country Airfield (small)
_airport_map5_tiles_town, // City Airport (large) _airport_map5_tiles_town, // City Airport (large)
_airport_map5_tiles_heliport, // Heliport _airport_map5_tiles_heliport, // Heliport
_airport_map5_tiles_metropolitan, // Metropolitain Airport (large) _airport_map5_tiles_metropolitan, // Metropolitain Airport (large)
_airport_map5_tiles_international, // International Airport (xlarge) _airport_map5_tiles_international, // International Airport (xlarge)
}; };
@ -1309,12 +1309,12 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
Station *st; Station *st;
int32 cost; int32 cost;
int w,h; int w,h;
bool airport_upgrade = true; bool airport_upgrade = true;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile)) if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile))
return CMD_ERROR; return CMD_ERROR;
@ -1353,7 +1353,7 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (st != NULL) { if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player) if (st->owner != OWNER_NONE && st->owner != _current_player)
return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
if (!CheckStationSpreadOut(st, tile, 1, 1)) if (!CheckStationSpreadOut(st, tile, 1, 1))
return CMD_ERROR; return CMD_ERROR;
@ -1397,7 +1397,7 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
st->facilities |= FACIL_AIRPORT; st->facilities |= FACIL_AIRPORT;
st->airport_type = (byte)p1; st->airport_type = (byte)p1;
st->airport_flags = 0; st->airport_flags = 0;
st->build_date = _date; st->build_date = _date;
/* if airport was demolished while planes were en-route to it, the positions can no longer /* if airport was demolished while planes were en-route to it, the positions can no longer
@ -1407,11 +1407,11 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
2. airport is added to existing station (unfortunately unavoideable) 2. airport is added to existing station (unfortunately unavoideable)
*/ */
if (airport_upgrade) {UpdateAirplanesOnNewStation(st);} if (airport_upgrade) {UpdateAirplanesOnNewStation(st);}
{ {
const byte *b = _airport_map5_tiles[p1]; const byte *b = _airport_map5_tiles[p1];
BEGIN_TILE_LOOP(tile_cur,w,h,tile) BEGIN_TILE_LOOP(tile_cur,w,h,tile)
ModifyTile(tile_cur, ModifyTile(tile_cur,
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP5, MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP5,
st->index, *b++); st->index, *b++);
@ -1467,7 +1467,7 @@ END_TILE_LOOP(tile_cur, w,h,tile)
return cost; return cost;
} }
/* Build a buoy /* Build a buoy
* p1,p2 unused * p1,p2 unused
*/ */
@ -1499,7 +1499,7 @@ int32 CmdBuildBuoy(int x, int y, uint32 flags, uint32 p1, uint32 p2)
st->facilities |= FACIL_DOCK; st->facilities |= FACIL_DOCK;
st->had_vehicle_of_type |= HVOT_BUOY; st->had_vehicle_of_type |= HVOT_BUOY;
st->owner = OWNER_NONE; st->owner = OWNER_NONE;
st->build_date = _date; st->build_date = _date;
ModifyTile(ti.tile, ModifyTile(ti.tile,
@ -1511,7 +1511,7 @@ int32 CmdBuildBuoy(int x, int y, uint32 flags, uint32 p1, uint32 p2)
); );
UpdateStationVirtCoordDirty(st); UpdateStationVirtCoordDirty(st);
UpdateStationAcceptance(st, false); UpdateStationAcceptance(st, false);
InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindow(WC_STATION_LIST, st->owner);
} }
@ -1538,7 +1538,7 @@ static int32 RemoveBuoy(Station *st, uint32 flags)
st->facilities &= ~FACIL_DOCK; st->facilities &= ~FACIL_DOCK;
st->had_vehicle_of_type &= ~HVOT_BUOY; st->had_vehicle_of_type &= ~HVOT_BUOY;
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_WATER) | MP_SETTYPE(MP_WATER) |
MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAPOWNER | MP_MAP5 | MP_MAP2_CLEAR, MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAPOWNER | MP_MAP5 | MP_MAP2_CLEAR,
OWNER_WATER, /* map_owner */ OWNER_WATER, /* map_owner */
@ -1602,13 +1602,13 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
FindLandscapeHeightByTile(&ti, tile_cur); FindLandscapeHeightByTile(&ti, tile_cur);
if (ti.tileh != 0 || ti.type != MP_WATER) if (ti.tileh != 0 || ti.type != MP_WATER)
return_cmd_error(STR_304B_SITE_UNSUITABLE); return_cmd_error(STR_304B_SITE_UNSUITABLE);
/* middle */ /* middle */
st = GetStationAround(tile + _dock_tileoffs_chkaround[direction], st = GetStationAround(tile + _dock_tileoffs_chkaround[direction],
_dock_w_chk[direction], _dock_h_chk[direction], -1); _dock_w_chk[direction], _dock_h_chk[direction], -1);
if (st == CHECK_STATIONS_ERR) if (st == CHECK_STATIONS_ERR)
return CMD_ERROR; return CMD_ERROR;
/* Find a station close to us */ /* Find a station close to us */
if (st == NULL) { if (st == NULL) {
st = GetClosestStationFromTile(tile, 8, _current_player); st = GetClosestStationFromTile(tile, 8, _current_player);
@ -1618,7 +1618,7 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (st != NULL) { if (st != NULL) {
if (st->owner != OWNER_NONE && st->owner != _current_player) if (st->owner != OWNER_NONE && st->owner != _current_player)
return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION); return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
if (!CheckStationSpreadOut(st, tile, 1, 1)) if (!CheckStationSpreadOut(st, tile, 1, 1))
return CMD_ERROR; return CMD_ERROR;
@ -1650,23 +1650,23 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (!st->facilities) st->xy = tile; if (!st->facilities) st->xy = tile;
st->facilities |= FACIL_DOCK; st->facilities |= FACIL_DOCK;
st->owner = _current_player; st->owner = _current_player;
st->build_date = _date; st->build_date = _date;
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR |
MP_MAP5, MP_MAP5,
st->index, st->index,
direction + 0x4C); direction + 0x4C);
ModifyTile(tile + _tileoffs_by_dir[direction], ModifyTile(tile + _tileoffs_by_dir[direction],
MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT | MP_SETTYPE(MP_STATION) | MP_MAPOWNER_CURRENT |
MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR | MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR |
MP_MAP5, MP_MAP5,
st->index, st->index,
(direction&1) + 0x50); (direction&1) + 0x50);
UpdateStationVirtCoordDirty(st); UpdateStationVirtCoordDirty(st);
UpdateStationAcceptance(st, false); UpdateStationAcceptance(st, false);
InvalidateWindow(WC_STATION_LIST, st->owner); InvalidateWindow(WC_STATION_LIST, st->owner);
@ -1747,13 +1747,13 @@ static void DrawTile_Station(TileInfo *ti)
t += sizeof(uint32); t += sizeof(uint32);
if (image & 0x8000) if (image & 0x8000)
image |= image_or_modificator; image |= image_or_modificator;
DrawGroundSprite(image + base_img); DrawGroundSprite(image + base_img);
for(dtss = (DrawTileSeqStruct *)t; (byte)dtss->delta_x != 0x80; dtss++) { for(dtss = (DrawTileSeqStruct *)t; (byte)dtss->delta_x != 0x80; dtss++) {
if ((byte)dtss->delta_z != 0x80) { if ((byte)dtss->delta_z != 0x80) {
image = dtss->image + base_img; image = dtss->image + base_img;
if (_display_opt & DO_TRANS_BUILDINGS) { if (_display_opt & DO_TRANS_BUILDINGS) {
if (image&0x8000) image |= image_or_modificator; if (image&0x8000) image |= image_or_modificator;
} else { } else {
image = (image & 0x3FFF) | 0x03224000; image = (image & 0x3FFF) | 0x03224000;
} }
@ -1763,7 +1763,7 @@ static void DrawTile_Station(TileInfo *ti)
image = *(uint32*)&dtss->height + base_img; /* endian ok */ image = *(uint32*)&dtss->height + base_img; /* endian ok */
if (_display_opt & DO_TRANS_BUILDINGS) { if (_display_opt & DO_TRANS_BUILDINGS) {
if (image&0x8000) image |= image_or_modificator; if (image&0x8000) image |= image_or_modificator;
} else { } else {
image = (image & 0x3FFF) | 0x03224000; image = (image & 0x3FFF) | 0x03224000;
} }
@ -1852,7 +1852,7 @@ static uint32 GetTileTrackStatus_Station(uint tile, TransportType mode) {
(IS_BYTE_INSIDE(i, 0x47, 0x4B) && (_patches.roadveh_queue || st->bus_stop_status&3)) ) { (IS_BYTE_INSIDE(i, 0x47, 0x4B) && (_patches.roadveh_queue || st->bus_stop_status&3)) ) {
/* This is a bus/truck stop, and there is free space /* This is a bus/truck stop, and there is free space
* (or we allow queueing) */ * (or we allow queueing) */
/* We reverse the dir because it points out of the /* We reverse the dir because it points out of the
* exit, and we want to get in. Maybe we should return * exit, and we want to get in. Maybe we should return
* both dirs here? */ * both dirs here? */
@ -1878,7 +1878,7 @@ static void TileLoop_Station(uint tile)
// 0x3A - flag small airport (58) // 0x3A - flag small airport (58)
if (_map5[tile] == 39 || _map5[tile] == 58 || _map5[tile] == 90 || _map5[tile] == 102) if (_map5[tile] == 39 || _map5[tile] == 58 || _map5[tile] == 90 || _map5[tile] == 102)
AddAnimatedTile(tile); AddAnimatedTile(tile);
// treat a bouy tile as water. // treat a bouy tile as water.
else if (_map5[tile] == 0x52) else if (_map5[tile] == 0x52)
TileLoop_Water(tile); TileLoop_Water(tile);
@ -1900,7 +1900,7 @@ static void AnimateTile_Station(uint tile)
if (m5 >= 39 && m5 <= 50) { // turning radar (39 - 50) if (m5 >= 39 && m5 <= 50) { // turning radar (39 - 50)
if (_tick_counter & 3) if (_tick_counter & 3)
return; return;
if (++m5 == 50+1) if (++m5 == 50+1)
m5 = 39; m5 = 39;
@ -1910,14 +1910,14 @@ static void AnimateTile_Station(uint tile)
} else if (m5 >= 90 && m5 <= 113) { // turning radar with ground under it (different fences) (90 - 101 | 102 - 113) } else if (m5 >= 90 && m5 <= 113) { // turning radar with ground under it (different fences) (90 - 101 | 102 - 113)
if (_tick_counter & 3) if (_tick_counter & 3)
return; return;
m5++; m5++;
if (m5 == 101+1) {m5 = 90;} // radar with fences in south if (m5 == 101+1) {m5 = 90;} // radar with fences in south
else if (m5 == 113+1) {m5 = 102;} // radar with fences in north else if (m5 == 113+1) {m5 = 102;} // radar with fences in north
_map5[tile] = m5; _map5[tile] = m5;
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
//added - end //added - end
} else if (m5 >= 0x3A && m5 <= 0x3D) { // windsack (58 - 61) } else if (m5 >= 0x3A && m5 <= 0x3D) { // windsack (58 - 61)
if (_tick_counter & 1) if (_tick_counter & 1)
@ -1925,7 +1925,7 @@ static void AnimateTile_Station(uint tile)
if (++m5 == 0x3D+1) if (++m5 == 0x3D+1)
m5 = 0x3A; m5 = 0x3A;
_map5[tile] = m5; _map5[tile] = m5;
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
@ -1957,17 +1957,17 @@ static uint32 VehicleEnter_Station(Vehicle *v, uint tile, int x, int y)
uint16 spd; uint16 spd;
if (v->type == VEH_Train) { if (v->type == VEH_Train) {
if (IS_BYTE_INSIDE(_map5[tile], 0, 8) && v->subtype == 0 && if (IS_BYTE_INSIDE(_map5[tile], 0, 8) && v->subtype == 0 &&
!IsTrainStationTile(tile + _tileoffs_by_dir[v->direction >> 1])) { !IsTrainStationTile(tile + _tileoffs_by_dir[v->direction >> 1])) {
station_id = _map2[tile]; station_id = _map2[tile];
if ((!(v->next_order & OF_NON_STOP) && !_patches.new_nonstop) || if ((!(v->next_order & OF_NON_STOP) && !_patches.new_nonstop) ||
(((v->next_order & OT_MASK) == OT_GOTO_STATION && v->next_order_param == station_id))) { (((v->next_order & OT_MASK) == OT_GOTO_STATION && v->next_order_param == station_id))) {
if (!(_patches.new_nonstop && (v->next_order & OF_NON_STOP)) && v->next_order != OT_LEAVESTATION && v->last_station_visited != station_id) { if (!(_patches.new_nonstop && (v->next_order & OF_NON_STOP)) && v->next_order != OT_LEAVESTATION && v->last_station_visited != station_id) {
x &= 0xF; x &= 0xF;
y &= 0xF; y &= 0xF;
dir = v->direction & 6; dir = v->direction & 6;
if (dir & 2) intswap(x,y); if (dir & 2) intswap(x,y);
if (y == 8) { if (y == 8) {
@ -1983,7 +1983,7 @@ static uint32 VehicleEnter_Station(Vehicle *v, uint tile, int x, int y)
} }
} }
} }
} }
} }
} else if (v->type == VEH_Road) { } else if (v->type == VEH_Road) {
if (v->u.road.state < 16 && (v->u.road.state&4)==0 && v->u.road.frame==0) { if (v->u.road.state < 16 && (v->u.road.state&4)==0 && v->u.road.frame==0) {
@ -2015,7 +2015,7 @@ static uint32 VehicleEnter_Station(Vehicle *v, uint tile, int x, int y)
} }
} }
} }
return 0; return 0;
} }
@ -2041,7 +2041,7 @@ void DeleteAllPlayerStations()
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && st->owner < MAX_PLAYERS) if (st->xy && st->owner < MAX_PLAYERS)
DeleteStation(st); DeleteStation(st);
} }
} }
@ -2111,7 +2111,7 @@ static void UpdateStationRating(Station *st)
(rating += 45, days > 3) || (rating += 45, days > 3) ||
(rating += 35, true); (rating += 35, true);
} }
{ {
waiting = ge->waiting_acceptance & 0xFFF; waiting = ge->waiting_acceptance & 0xFFF;
(rating -= 90, waiting > 1500) || (rating -= 90, waiting > 1500) ||
@ -2127,7 +2127,7 @@ static void UpdateStationRating(Station *st)
// only modify rating in steps of -2, -1, 0, 1 or 2 // only modify rating in steps of -2, -1, 0, 1 or 2
ge->rating = rating = or + clamp(clamp(rating, 0, 255) - or, -2, 2); ge->rating = rating = or + clamp(clamp(rating, 0, 255) - or, -2, 2);
// if rating is <= 64 and more than 200 items waiting, remove some random amount of goods from the station // if rating is <= 64 and more than 200 items waiting, remove some random amount of goods from the station
if (rating <= 64 && waiting >= 200) { if (rating <= 64 && waiting >= 200) {
int dec = Random() & 0x1F; int dec = Random() & 0x1F;
@ -2150,7 +2150,7 @@ static void UpdateStationRating(Station *st)
} }
} }
} while (++ge != endof(st->goods)); } while (++ge != endof(st->goods));
index = st->index; index = st->index;
if (waiting_changed) if (waiting_changed)
@ -2223,8 +2223,8 @@ void ModifyStationRatingAround(TileIndex tile, byte owner, int amount, uint radi
static void UpdateStationWaiting(Station *st, int type, uint amount) static void UpdateStationWaiting(Station *st, int type, uint amount)
{ {
st->goods[type].waiting_acceptance = st->goods[type].waiting_acceptance =
(st->goods[type].waiting_acceptance & ~0xFFF) + (st->goods[type].waiting_acceptance & ~0xFFF) +
min(0xFFF, (st->goods[type].waiting_acceptance & 0xFFF) + amount); min(0xFFF, (st->goods[type].waiting_acceptance & 0xFFF) + amount);
st->goods[type].enroute_time = 0; st->goods[type].enroute_time = 0;
@ -2240,7 +2240,7 @@ int32 CmdRenameStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
str = AllocateName((byte*)_decode_parameters, 6); str = AllocateName((byte*)_decode_parameters, 6);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
st = DEREF_STATION(p1); st = DEREF_STATION(p1);
old_str = st->string_id; old_str = st->string_id;
@ -2282,11 +2282,11 @@ uint MoveGoodsToStation(uint tile, int w, int h, int type, uint amount)
st = DEREF_STATION(st_index); st = DEREF_STATION(st_index);
if ((st->had_vehicle_of_type & HVOT_BUOY) == 0 && if ((st->had_vehicle_of_type & HVOT_BUOY) == 0 &&
( !st->town->exclusive_counter || (st->town->exclusivity == st->owner) ) && // check exclusive transport rights ( !st->town->exclusive_counter || (st->town->exclusivity == st->owner) ) && // check exclusive transport rights
st->goods[type].rating != 0 && st->goods[type].rating != 0 &&
(!_patches.selectgoods || st->goods[type].last_speed) && // if last_speed is 0, no vehicle has been there. (!_patches.selectgoods || st->goods[type].last_speed) && // if last_speed is 0, no vehicle has been there.
((st->facilities & (byte)~FACIL_BUS_STOP)!=0 || type==CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers ((st->facilities & (byte)~FACIL_BUS_STOP)!=0 || type==CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers
((st->facilities & (byte)~FACIL_TRUCK_STOP)!=0 || type!=CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers ((st->facilities & (byte)~FACIL_TRUCK_STOP)!=0 || type!=CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers
around[i] = st_index; around[i] = st_index;
around_ptr[i] = st; around_ptr[i] = st;
} }
@ -2320,10 +2320,10 @@ uint MoveGoodsToStation(uint tile, int w, int h, int type, uint amount)
st1 = around_ptr[i]; st1 = around_ptr[i];
} else if (around_ptr[i]->goods[type].rating >= best_rating2) { } else if (around_ptr[i]->goods[type].rating >= best_rating2) {
best_rating2 = around_ptr[i]->goods[type].rating; best_rating2 = around_ptr[i]->goods[type].rating;
st2 = around_ptr[i]; st2 = around_ptr[i];
} }
} }
assert(st1 != NULL); assert(st1 != NULL);
assert(st2 != NULL); assert(st2 != NULL);
assert(best_rating != 0 || best_rating2 != 0); assert(best_rating != 0 || best_rating2 != 0);
@ -2338,7 +2338,7 @@ uint MoveGoodsToStation(uint tile, int w, int h, int type, uint amount)
if (t != 0) { if (t != 0) {
moved = (t * best_rating >> 8) + 1; moved = (t * best_rating >> 8) + 1;
amount -= t; amount -= t;
UpdateStationWaiting(st1, type, moved); UpdateStationWaiting(st1, type, moved);
} }
assert(amount >= 0); assert(amount >= 0);
@ -2398,7 +2398,7 @@ void BuildOilRig(uint tile)
UpdateStationVirtCoordDirty(st); UpdateStationVirtCoordDirty(st);
UpdateStationAcceptance(st, false); UpdateStationAcceptance(st, false);
return; return;
} }
} }
} }
@ -2456,10 +2456,10 @@ static int32 ClearTile_Station(uint tile, byte flags) {
// original airports < 67, new airports between 83 - 114 // original airports < 67, new airports between 83 - 114
if (m5 < 0x43 || ( m5 >= 83 && m5 <= 114) ) if (m5 < 0x43 || ( m5 >= 83 && m5 <= 114) )
return RemoveAirport(st, flags); return RemoveAirport(st, flags);
if (m5 < 0x47) if (m5 < 0x47)
return RemoveTruckStation(st, flags); return RemoveTruckStation(st, flags);
if (m5 < 0x4B) if (m5 < 0x4B)
return RemoveBusStation(st, flags); return RemoveBusStation(st, flags);
@ -2527,7 +2527,7 @@ static const byte _station_desc[] = {
SLE_VAR(Station,airport_type, SLE_UINT8), SLE_VAR(Station,airport_type, SLE_UINT8),
SLE_VAR(Station,truck_stop_status, SLE_UINT8), SLE_VAR(Station,truck_stop_status, SLE_UINT8),
SLE_VAR(Station,bus_stop_status, SLE_UINT8), SLE_VAR(Station,bus_stop_status, SLE_UINT8),
// blocked_months was stored here in savegame format 0 - 4.0 // blocked_months was stored here in savegame format 0 - 4.0
SLE_CONDVAR(Station,blocked_months_obsolete, SLE_UINT8, 0, 4), SLE_CONDVAR(Station,blocked_months_obsolete, SLE_UINT8, 0, 4),

View File

@ -16,7 +16,7 @@ static void StationsWndShowStationRating(int x, int y, int type, uint acceptance
if (acceptance > 575) if (acceptance > 575)
acceptance = 575; acceptance = 575;
acceptance = (acceptance + 7) >> 3; acceptance = (acceptance + 7) >> 3;
/* draw cargo */ /* draw cargo */
@ -31,12 +31,12 @@ static void StationsWndShowStationRating(int x, int y, int type, uint acceptance
} }
x -= (acceptance>>3); x -= (acceptance>>3);
DrawString(x+1, y, _cargoc.names_short[type], 0x10); DrawString(x+1, y, _cargoc.names_short[type], 0x10);
/* draw green/red ratings bar */ /* draw green/red ratings bar */
GfxFillRect(x+1, y+8, x+7, y+8, 0xB8); GfxFillRect(x+1, y+8, x+7, y+8, 0xB8);
rating = (rating >> 5); rating = (rating >> 5);
if (rating != 0) { if (rating != 0) {
@ -110,7 +110,7 @@ static void MakeSortedStationList(byte owner)
} }
qsort(firstelement, n, sizeof(_station_sort[0]), StationNameSorter); qsort(firstelement, n, sizeof(_station_sort[0]), StationNameSorter);
DEBUG(misc, 1) ("Resorting Stations list..."); DEBUG(misc, 1) ("Resorting Stations list...");
} }
@ -151,7 +151,7 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
DrawString(xb, y, STR_304A_NONE, 0); DrawString(xb, y, STR_304A_NONE, 0);
return; return;
} }
i += w->vscroll.pos; // offset from sorted station list of current player i += w->vscroll.pos; // offset from sorted station list of current player
assert(i < _num_station_sort[window_number]); // at least one station must exist assert(i < _num_station_sort[window_number]); // at least one station must exist
@ -318,7 +318,7 @@ static void DrawStationViewWindow(Window *w)
uint waiting = (st->goods[i].waiting_acceptance & 0xFFF); uint waiting = (st->goods[i].waiting_acceptance & 0xFFF);
if (waiting == 0) if (waiting == 0)
continue; continue;
num = (waiting + 5) / 10; num = (waiting + 5) / 10;
if (num != 0) { if (num != 0) {
int cur_x = x; int cur_x = x;
@ -352,7 +352,7 @@ static void DrawStationViewWindow(Window *w)
} }
} }
} while (pos > -5 && ++i != 12); } while (pos > -5 && ++i != 12);
if (w->widget == _station_view_widgets) { if (w->widget == _station_view_widgets) {
b = _userstring; b = _userstring;
b[0] = 0x81; b[0] = 0x81;
@ -368,7 +368,7 @@ static void DrawStationViewWindow(Window *w)
b += 5; b += 5;
} }
} }
if (b == (byte*)&_userstring[3]) { if (b == (byte*)&_userstring[3]) {
b[0] = 0x81; b[0] = 0x81;
b[1] = STR_00D0_NOTHING; b[1] = STR_00D0_NOTHING;
@ -380,7 +380,7 @@ static void DrawStationViewWindow(Window *w)
DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245); DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245);
} else { } else {
DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, 0); DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, 0);
y = 77; y = 77;
@ -412,7 +412,7 @@ static void StationViewWndProc(Window *w, WindowEvent *e)
case 7: case 7:
SetWindowDirty(w); SetWindowDirty(w);
/* toggle height/widget set */ /* toggle height/widget set */
w->height ^= (210 ^ 110); w->height ^= (210 ^ 110);
*(uint32*)&w->widget ^= (uint32)_station_view_expanded_widgets ^ (uint32)_station_view_widgets; *(uint32*)&w->widget ^= (uint32)_station_view_expanded_widgets ^ (uint32)_station_view_widgets;
@ -438,7 +438,7 @@ static void StationViewWndProc(Window *w, WindowEvent *e)
st = DEREF_STATION(w->window_number); st = DEREF_STATION(w->window_number);
DoCommandP(st->xy, w->window_number, 0, NULL, CMD_RENAME_STATION | CMD_MSG(STR_3031_CAN_T_RENAME_STATION)); DoCommandP(st->xy, w->window_number, 0, NULL, CMD_RENAME_STATION | CMD_MSG(STR_3031_CAN_T_RENAME_STATION));
} break; } break;
} }
} }

View File

@ -119,7 +119,7 @@ static uint32 INLINE TO_LE32(uint32 x) { return BSWAP32(x); }
static uint16 INLINE TO_LE16(uint16 x) { return BSWAP16(x); } static uint16 INLINE TO_LE16(uint16 x) { return BSWAP16(x); }
# define TO_BE32(x) x # define TO_BE32(x) x
# define TO_BE16(x) x # define TO_BE16(x) x
#define TO_BE32X(x) x #define TO_BE32X(x) x
#else #else
# define TO_LE32(x) x # define TO_LE32(x) x
# define TO_LE16(x) x # define TO_LE16(x) x

View File

@ -68,7 +68,7 @@ static const CurrencySpec _currency_specs[] = {
{ 3, ',', CF_TOEURO_2002, "NLG ", "" }, { 3, ',', CF_TOEURO_2002, "NLG ", "" },
{ 2730,',', CF_TOEURO_2002, "ITL ", "" }, { 2730,',', CF_TOEURO_2002, "ITL ", "" },
{ 13, '.', 0, "", " kr" }, { 13, '.', 0, "", " kr" },
{ 5, ' ', 0, "", " rur" }, { 5, ' ', 0, "", " rur" },
{ 50, ',', 0, "", " Kc" }, { 50, ',', 0, "", " Kc" },
{ 130, '.', 0, "", " kr" }, { 130, '.', 0, "", " kr" },
{ 11, '.', 0, "", " kr" }, { 11, '.', 0, "", " kr" },
@ -171,9 +171,9 @@ byte *GetString(byte *buffr, uint16 string)
return DecodeString(buffr, GetStringPtr(string)); return DecodeString(buffr, GetStringPtr(string));
} }
void InjectDparam(int amount) void InjectDparam(int amount)
{ {
memmove(_decode_parameters + amount, _decode_parameters, sizeof(_decode_parameters) - amount * sizeof(uint32)); memmove(_decode_parameters + amount, _decode_parameters, sizeof(_decode_parameters) - amount * sizeof(uint32));
} }
@ -301,7 +301,7 @@ static byte *FormatYmdString(byte *buff, uint16 number)
ConvertDayToYMD(&ymd, number); ConvertDayToYMD(&ymd, number);
for(src = GetStringPtr(ymd.day+STR_01AC_1ST-1); (*buff++=*src++) != 0;) {} for(src = GetStringPtr(ymd.day+STR_01AC_1ST-1); (*buff++=*src++) != 0;) {}
buff[-1] = ' '; buff[-1] = ' ';
memcpy(buff, GetStringPtr(STR_0162_JAN + ymd.month), 4); memcpy(buff, GetStringPtr(STR_0162_JAN + ymd.month), 4);
buff[3] = ' '; buff[3] = ' ';
@ -338,7 +338,7 @@ static byte *FormatGenericCurrency(byte *buff, const CurrencySpec *spec, int64 n
// convert from negative // convert from negative
if (number < 0) { *buff++ = '-'; number = -number; } if (number < 0) { *buff++ = '-'; number = -number; }
// add pre part // add pre part
s = spec->pre; s = spec->pre;
while (s != spec->pre + lengthof(spec->pre) && (c=*s++)) *buff++ = c; while (s != spec->pre + lengthof(spec->pre) && (c=*s++)) *buff++ = c;
@ -352,13 +352,13 @@ static byte *FormatGenericCurrency(byte *buff, const CurrencySpec *spec, int64 n
} else if (number >= 1000000) { } else if (number >= 1000000) {
number = (number + 500) / 1000; number = (number + 500) / 1000;
compact = 'k'; compact = 'k';
} }
} }
// convert to ascii number and add commas // convert to ascii number and add commas
p = buf; p = buf;
j = 4; j = 4;
do { do {
if (--j == 0) { *p++ = spec->separator; j = 3; } if (--j == 0) { *p++ = spec->separator; j = 3; }
*p++ = '0' + number % 10; *p++ = '0' + number % 10;
} while (number /= 10); } while (number /= 10);
@ -427,8 +427,8 @@ static byte *DecodeString(byte *buff, const byte *str)
} }
break; break;
} }
// 0x85 is used as escape character.. // 0x85 is used as escape character..
case 0x85: case 0x85:
switch(*str++) { switch(*str++) {
case 0: case 0:
@ -453,7 +453,7 @@ static byte *DecodeString(byte *buff, const byte *str)
// liquid type of cargo is multiplied by 100 to get correct amount // liquid type of cargo is multiplied by 100 to get correct amount
buff = FormatCommaNumber(buff, GetParamInt16() * multiplier ); buff = FormatCommaNumber(buff, GetParamInt16() * multiplier );
s = GetStringPtr(cargo_str); s = GetStringPtr(cargo_str);
memcpy(buff++, " ", 1); memcpy(buff++, " ", 1);
while (*s) *buff++ = *s++; while (*s) *buff++ = *s++;
break; break;
@ -476,7 +476,7 @@ static byte *DecodeString(byte *buff, const byte *str)
while (*s) *buff++ = *s++; while (*s) *buff++ = *s++;
break; break;
} }
case 0x88: // {STRING} case 0x88: // {STRING}
buff = GetString(buff, (uint16)GetParamUint16()); buff = GetString(buff, (uint16)GetParamUint16());
break; break;
@ -515,7 +515,7 @@ static byte *DecodeString(byte *buff, const byte *str)
} }
case 0x9C: { // {CURRENCY64} case 0x9C: { // {CURRENCY64}
buff = FormatGenericCurrency(buff, &_currency_specs[_opt.currency], GetParamInt64(), false); buff = FormatGenericCurrency(buff, &_currency_specs[_opt.currency], GetParamInt64(), false);
break; break;
} }
@ -567,7 +567,7 @@ static byte *StationGetSpecialString(byte *buff)
static byte *GetSpecialTownNameString(byte *buff, int ind) { static byte *GetSpecialTownNameString(byte *buff, int ind) {
uint32 x = GetParamInt32(); uint32 x = GetParamInt32();
_town_name_generators[ind](buff, x); _town_name_generators[ind](buff, x);
while (*buff != 0) buff++; while (*buff != 0) buff++;
@ -669,7 +669,7 @@ static byte *GenPlayerName_4(byte *buff)
if (i < sizeof(_initial_name_letters)) { if (i < sizeof(_initial_name_letters)) {
buff[0] = _initial_name_letters[i]; buff[0] = _initial_name_letters[i];
buff[1] = '.'; buff[1] = '.';
buff += 2; buff += 2;
} }
base = 0; base = 0;
@ -712,7 +712,7 @@ static const char * const _song_names[] = {
static byte *GetSpecialPlayerNameString(byte *buff, int ind) static byte *GetSpecialPlayerNameString(byte *buff, int ind)
{ {
switch(ind) { switch(ind) {
// not used // not used
case 1: { case 1: {
int i = GetParamInt32() & 0xFFFF; int i = GetParamInt32() & 0xFFFF;
@ -789,14 +789,14 @@ bool ReadLanguagePack(int lang_index) {
free(lang); free(lang);
} }
if (lang_pack == NULL) return false; if (lang_pack == NULL) return false;
if (len < sizeof(LanguagePackHeader) || if (len < sizeof(LanguagePackHeader) ||
HDR->ident != TO_LE32(LANGUAGE_PACK_IDENT) || HDR->ident != TO_LE32(LANGUAGE_PACK_IDENT) ||
HDR->version != TO_LE32(LANGUAGE_PACK_VERSION)) { HDR->version != TO_LE32(LANGUAGE_PACK_VERSION)) {
free(lang_pack); free(lang_pack);
return false; return false;
} }
#undef HDR #undef HDR
#if defined(TTD_BIG_ENDIAN) #if defined(TTD_BIG_ENDIAN)
for(i=0; i!=32; i++) { for(i=0; i!=32; i++) {
((LanguagePackHeader*)lang_pack)->offsets[i] = READ_LE_UINT16(&((LanguagePackHeader*)lang_pack)->offsets[i]); ((LanguagePackHeader*)lang_pack)->offsets[i] = READ_LE_UINT16(&((LanguagePackHeader*)lang_pack)->offsets[i]);
@ -855,7 +855,7 @@ void InitializeLanguagePacks()
char *s = str_fmt("%s%s", _path.lang_dir, files[i]); char *s = str_fmt("%s%s", _path.lang_dir, files[i]);
in = fopen(s, "rb"); in = fopen(s, "rb");
free(s); free(s);
if (!in || if (!in ||
(j = fread(&hdr, sizeof(hdr), 1, in), fclose(in), j) != 1 || (j = fread(&hdr, sizeof(hdr), 1, in), fclose(in), j) != 1 ||
hdr.ident != TO_LE32(LANGUAGE_PACK_IDENT) || hdr.ident != TO_LE32(LANGUAGE_PACK_IDENT) ||
hdr.version != TO_LE32(LANGUAGE_PACK_VERSION)) { hdr.version != TO_LE32(LANGUAGE_PACK_VERSION)) {
@ -865,7 +865,7 @@ void InitializeLanguagePacks()
dl->ent[m].file = files[i]; dl->ent[m].file = files[i];
dl->ent[m].name = strdup(hdr.name); dl->ent[m].name = strdup(hdr.name);
if (!strcmp(hdr.name, "English")) def = m; if (!strcmp(hdr.name, "English")) def = m;
m++; m++;
@ -873,7 +873,7 @@ void InitializeLanguagePacks()
if (m == 0) if (m == 0)
error(n == 0 ? "No available language packs" : "Invalid version of language packs"); error(n == 0 ? "No available language packs" : "Invalid version of language packs");
dl->num = m; dl->num = m;
for(i=0; i!=dl->num; i++) for(i=0; i!=dl->num; i++)
dl->dropdown[i] = SPECSTR_LANGUAGE_START + i; dl->dropdown[i] = SPECSTR_LANGUAGE_START + i;

View File

@ -10,7 +10,7 @@
#include "economy.h" #include "economy.h"
static void HandleSubsidyClick(int y) static void HandleSubsidyClick(int y)
{ {
Subsidy *s; Subsidy *s;
int num,offs; int num,offs;
TileIndex xy; TileIndex xy;
@ -42,7 +42,7 @@ static void HandleSubsidyClick(int y)
} }
} }
return; return;
handle_click: handle_click:
/* determine from coordinate for subsidy and try to scroll to it */ /* determine from coordinate for subsidy and try to scroll to it */
@ -53,7 +53,7 @@ handle_click:
xy = DEREF_TOWN(offs)->xy; xy = DEREF_TOWN(offs)->xy;
} else { } else {
xy = _industries[offs].xy; xy = _industries[offs].xy;
} }
if (!ScrollMainWindowToTile(xy)) { if (!ScrollMainWindowToTile(xy)) {
/* otherwise determine to coordinate for subsidy and scroll to it */ /* otherwise determine to coordinate for subsidy and scroll to it */
@ -90,7 +90,7 @@ static void DrawSubsidiesWindow(Window *w)
if (s->cargo_type != 0xFF && s->age < 12) { if (s->cargo_type != 0xFF && s->age < 12) {
SetupSubsidyDecodeParam(s, 1); SetupSubsidyDecodeParam(s, 1);
x2 = DrawString(x+2, y, STR_2027_FROM_TO, 0); x2 = DrawString(x+2, y, STR_2027_FROM_TO, 0);
SET_DPARAM16(0, _date - ymd.day + 384 - s->age * 32); SET_DPARAM16(0, _date - ymd.day + 384 - s->age * 32);
DrawString(x2, y, STR_2028_BY, 0); DrawString(x2, y, STR_2028_BY, 0);
y += 10; y += 10;

View File

@ -21,9 +21,9 @@ static void CcTerraform(bool success, uint tile, uint32 p1, uint32 p2)
static void GenericRaiseLowerLand(uint tile, int mode) static void GenericRaiseLowerLand(uint tile, int mode)
{ {
if (mode) { if (mode) {
DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)); DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE));
} else { } else {
DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)); DoCommandP(tile, 8, (uint32)mode, CcTerraform, CMD_TERRAFORM_LAND | CMD_AUTO | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE));
} }
} }
@ -94,7 +94,7 @@ static void TerraformClick_BuyLand(Window *w)
static void TerraformClick_Trees(Window *w) static void TerraformClick_Trees(Window *w)
{ {
if (HandlePlacePushButton(w, 8, 0, 1, PlaceProc_PlantTree)) ShowBuildTreesToolbar(); if (HandlePlacePushButton(w, 8, 0, 1, PlaceProc_PlantTree)) ShowBuildTreesToolbar();
} }
static void TerraformClick_PlaceSign(Window *w) static void TerraformClick_PlaceSign(Window *w)
@ -159,7 +159,7 @@ static void TerraformToolbWndProc(Window *w, WindowEvent *e)
DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO); DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO);
} else if (e->place.userdata == VPM_X_AND_Y_LIMITED) { } else if (e->place.userdata == VPM_X_AND_Y_LIMITED) {
// if (e->click.pt.x != -1) { // if (e->click.pt.x != -1) {
// DoCommandP(e->place.tile, _tree_to_plant, e->place.starttile, NULL, // DoCommandP(e->place.tile, _tree_to_plant, e->place.starttile, NULL,
// CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE)); // CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
} else { } else {
assert(true); assert(true);

View File

@ -33,7 +33,7 @@ void AddTextEffect(StringID msg, int x, int y, uint16 duration)
if (_game_mode == GM_MENU) if (_game_mode == GM_MENU)
return; return;
for (te = _text_effect_list; te->string_id != 0xFFFF; ) { for (te = _text_effect_list; te->string_id != 0xFFFF; ) {
if (++te == endof(_text_effect_list)) if (++te == endof(_text_effect_list))
return; return;
@ -115,7 +115,7 @@ void DrawTextEffects(DrawPixelInfo *dpi)
continue; continue;
AddStringToDraw(te->x, te->y, (StringID)(te->string_id-1), te->params_1, te->params_2); AddStringToDraw(te->x, te->y, (StringID)(te->string_id-1), te->params_1, te->params_2);
} }
} }
} }
@ -131,7 +131,7 @@ void DeleteAnimatedTile(uint tile)
endof(_animated_tile_list)[-1] = 0; endof(_animated_tile_list)[-1] = 0;
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
return; return;
} }
} }
} }
@ -145,7 +145,7 @@ bool AddAnimatedTile(uint tile)
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
return true; return true;
} }
} }
return false; return false;
} }

16
town.h
View File

@ -9,14 +9,14 @@ struct Town {
// Current population of people and amount of houses. // Current population of people and amount of houses.
uint16 num_houses; uint16 num_houses;
uint32 population; uint32 population;
// Town name // Town name
uint16 townnametype; uint16 townnametype;
uint32 townnameparts; uint32 townnameparts;
// NOSAVE: Location of name sign, UpdateTownVirtCoord updates this. // NOSAVE: Location of name sign, UpdateTownVirtCoord updates this.
ViewportSign sign; ViewportSign sign;
// Makes sure we don't build certain house types twice. // Makes sure we don't build certain house types twice.
byte flags12; byte flags12;
@ -32,7 +32,7 @@ struct Town {
uint8 exclusivity; // which player has exslusivity uint8 exclusivity; // which player has exslusivity
uint8 exclusive_counter; // months till the exclusivity expires uint8 exclusive_counter; // months till the exclusivity expires
int16 ratings[MAX_PLAYERS]; int16 ratings[MAX_PLAYERS];
// Maximum amount of passengers and mail that can be transported. // Maximum amount of passengers and mail that can be transported.
uint16 max_pass; uint16 max_pass;
uint16 max_mail; uint16 max_mail;
@ -52,17 +52,17 @@ struct Town {
uint16 act_water; uint16 act_water;
uint16 new_act_food; uint16 new_act_food;
uint16 new_act_water; uint16 new_act_water;
// Time until we rebuild a house. // Time until we rebuild a house.
byte time_until_rebuild; byte time_until_rebuild;
// When to grow town next time. // When to grow town next time.
byte grow_counter; byte grow_counter;
byte growth_rate; byte growth_rate;
// Fund buildings program in action? // Fund buildings program in action?
byte fund_buildings_months; byte fund_buildings_months;
// Fund road reconstruction in action? // Fund road reconstruction in action?
byte road_build_months; byte road_build_months;

View File

@ -76,8 +76,8 @@ static void DrawTile_Town(TileInfo *ti)
if ((image = dcts->sprite_2) != 0) { if ((image = dcts->sprite_2) != 0) {
if (!(_display_opt & DO_TRANS_BUILDINGS)) if (!(_display_opt & DO_TRANS_BUILDINGS))
image = (image & 0x3FFF) | 0x3224000; image = (image & 0x3FFF) | 0x3224000;
AddSortableSpriteToDraw(image, AddSortableSpriteToDraw(image,
ti->x | (dcts->subtile_xy>>4), ti->x | (dcts->subtile_xy>>4),
ti->y | (dcts->subtile_xy&0xF), ti->y | (dcts->subtile_xy&0xF),
(dcts->width_height>>4)+1, (dcts->width_height>>4)+1,
@ -100,7 +100,7 @@ static uint GetSlopeZ_Town(TileInfo *ti)
{ {
uint z = GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z; uint z = GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
if (ti->tileh != 0) z = (z & ~7) + 4; if (ti->tileh != 0) z = (z & ~7) + 4;
return (uint16) z; return (uint16) z;
} }
static uint GetSlopeTileh_Town(TileInfo *ti) static uint GetSlopeTileh_Town(TileInfo *ti)
@ -140,7 +140,7 @@ static void AnimateTile_Town(uint tile)
_map_owner[tile] &= 0x7F; _map_owner[tile] &= 0x7F;
DeleteAnimatedTile(tile); DeleteAnimatedTile(tile);
} }
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
@ -169,9 +169,9 @@ static void ChangePopulation(Town *t, int mod)
static void MakeSingleHouseBigger(uint tile) static void MakeSingleHouseBigger(uint tile)
{ {
byte b; byte b;
assert(IS_TILETYPE(tile, MP_HOUSE)); assert(IS_TILETYPE(tile, MP_HOUSE));
b = _map5[tile]; b = _map5[tile];
if (b & 0x80) if (b & 0x80)
return; return;
@ -185,14 +185,14 @@ static void MakeSingleHouseBigger(uint tile)
if ( (_map3_lo[tile] & 0xC0) == 0xC0) { if ( (_map3_lo[tile] & 0xC0) == 0xC0) {
Town *t = ClosestTownFromTile(tile, (uint)-1); Town *t = ClosestTownFromTile(tile, (uint)-1);
ChangePopulation(t, _housetype_population[_map2[tile]]); ChangePopulation(t, _housetype_population[_map2[tile]]);
} }
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
static void MakeTownHouseBigger(uint tile) static void MakeTownHouseBigger(uint tile)
{ {
uint flags = _house_more_flags[_map2[tile]]; uint flags = _house_more_flags[_map2[tile]];
if (flags & 8) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 0)); if (flags & 8) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 0));
if (flags & 4) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 1)); if (flags & 4) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 1));
if (flags & 2) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 0)); if (flags & 2) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 0));
@ -245,7 +245,7 @@ static void TileLoop_Town(uint tile)
_current_player = OWNER_TOWN; _current_player = OWNER_TOWN;
ClearTownHouse(t, tile); ClearTownHouse(t, tile);
// rebuild with another house? // rebuild with another house?
if ( (byte) (r >> 8) >= 12) { if ( (byte) (r >> 8) >= 12) {
DoBuildTownHouse(t, tile); DoBuildTownHouse(t, tile);
@ -274,12 +274,12 @@ static int32 ClearTile_Town(uint tile, byte flags)
rating = _housetype_remove_ratingmod[house]; rating = _housetype_remove_ratingmod[house];
_cleared_town_rating += rating; _cleared_town_rating += rating;
_cleared_town = t = ClosestTownFromTile(tile, (uint)-1); _cleared_town = t = ClosestTownFromTile(tile, (uint)-1);
if (_current_player < MAX_PLAYERS) { if (_current_player < MAX_PLAYERS) {
if (rating > t->ratings[_current_player] && !(flags & DC_NO_TOWN_RATING) && !_cheats.magic_bulldozer.value) { if (rating > t->ratings[_current_player] && !(flags & DC_NO_TOWN_RATING) && !_cheats.magic_bulldozer.value) {
SET_DPARAM16(0, t->index); SET_DPARAM16(0, t->index);
return_cmd_error(STR_2009_LOCAL_AUTHORITY_REFUSES); return_cmd_error(STR_2009_LOCAL_AUTHORITY_REFUSES);
} }
} }
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
@ -293,7 +293,7 @@ static int32 ClearTile_Town(uint tile, byte flags)
static void GetAcceptedCargo_Town(uint tile, AcceptedCargo *ac) static void GetAcceptedCargo_Town(uint tile, AcceptedCargo *ac)
{ {
int type = _map2[tile]; int type = _map2[tile];
ac->type_1 = CT_PASSENGERS; ac->type_1 = CT_PASSENGERS;
ac->amount_1 = _housetype_cargo_passengers[type]; ac->amount_1 = _housetype_cargo_passengers[type];
@ -336,7 +336,7 @@ static const TileIndexDiff _roadblock_tileadd[4+3] = {
TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(0,1), TILE_XY(0,1),
TILE_XY(-1,0), TILE_XY(-1,0),
// Store the first 3 elements again. // Store the first 3 elements again.
// Lets us rotate without using &3. // Lets us rotate without using &3.
TILE_XY(0,-1), TILE_XY(0,-1),
@ -352,7 +352,7 @@ static void TownTickHandler(Town *t)
if (GrowTown(t)) { if (GrowTown(t)) {
i = t->growth_rate; i = t->growth_rate;
} else { } else {
i = 0; i = 0;
} }
} }
t->grow_counter = i; t->grow_counter = i;
@ -400,7 +400,7 @@ static bool IsRoadAllowedHere(uint tile, int dir)
// If this assertion fails, it might be because the world contains // If this assertion fails, it might be because the world contains
// land at the edges. This is not ok. // land at the edges. This is not ok.
TILE_ASSERT(tile); TILE_ASSERT(tile);
for(;;) { for(;;) {
// Check if there already is a road at this point? // Check if there already is a road at this point?
if (GetRoadBitsByTile(tile) == 0) { if (GetRoadBitsByTile(tile) == 0) {
@ -421,11 +421,11 @@ static bool IsRoadAllowedHere(uint tile, int dir)
HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+1] + _roadblock_tileadd[dir+2])), dir) || HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+1] + _roadblock_tileadd[dir+2])), dir) ||
HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+3] + _roadblock_tileadd[dir+2])), dir)) HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+3] + _roadblock_tileadd[dir+2])), dir))
return false; return false;
// Otherwise allow // Otherwise allow
return true; return true;
} }
// If the tile is not a slope in the right direction, then // If the tile is not a slope in the right direction, then
// maybe terraform some. // maybe terraform some.
if ((k = (dir&1)?0xC:0x9) != slope && (k^0xF) != slope) { if ((k = (dir&1)?0xC:0x9) != slope && (k^0xF) != slope) {
@ -447,7 +447,7 @@ static bool IsRoadAllowedHere(uint tile, int dir)
static bool TerraformTownTile(uint tile, int edges, int dir) static bool TerraformTownTile(uint tile, int edges, int dir)
{ {
int32 r; int32 r;
TILE_ASSERT(tile); TILE_ASSERT(tile);
r = DoCommandByTile(tile, edges, dir, DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND); r = DoCommandByTile(tile, edges, dir, DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
@ -491,7 +491,7 @@ static void GrowTownInTile(uint *tile_ptr, uint mask, int block, Town *t1)
if (mask == 0) { if (mask == 0) {
// Tile has no road. First reset the status counter // Tile has no road. First reset the status counter
// to say that this is the last iteration. // to say that this is the last iteration.
_grow_town_result = 0; _grow_town_result = 0;
// Then check if the tile we are at belongs to the town, // Then check if the tile we are at belongs to the town,
@ -520,7 +520,7 @@ static void GrowTownInTile(uint *tile_ptr, uint mask, int block, Town *t1)
// return if the road we're trying to build is curved. // return if the road we're trying to build is curved.
if ( a != (b^2)) if ( a != (b^2))
return; return;
// Return if neither side of the new road is a house // Return if neither side of the new road is a house
if (!IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+1]), MP_HOUSE) && if (!IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+1]), MP_HOUSE) &&
!IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+3]), MP_HOUSE)) !IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+3]), MP_HOUSE))
@ -544,7 +544,7 @@ static void GrowTownInTile(uint *tile_ptr, uint mask, int block, Town *t1)
*tile_ptr = flotr.tile; *tile_ptr = flotr.tile;
return; return;
} }
// For any other kind of tunnel/bridge, bail out. // For any other kind of tunnel/bridge, bail out.
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE)) if (IS_TILETYPE(tile, MP_TUNNELBRIDGE))
return; return;
@ -557,7 +557,7 @@ static void GrowTownInTile(uint *tile_ptr, uint mask, int block, Town *t1)
// This is the tile we will reach if we extend to this direction. // This is the tile we will reach if we extend to this direction.
tmptile = TILE_ADD(tile,_roadblock_tileadd[i]); tmptile = TILE_ADD(tile,_roadblock_tileadd[i]);
// Don't do it if it reaches to water. // Don't do it if it reaches to water.
if (IS_WATER_TILE(tmptile)) if (IS_WATER_TILE(tmptile))
return; return;
@ -569,7 +569,7 @@ static void GrowTownInTile(uint *tile_ptr, uint mask, int block, Town *t1)
return; return;
} }
// Build a house at the edge. 60% chance or // Build a house at the edge. 60% chance or
// always ok if no road allowed. // always ok if no road allowed.
if (!IsRoadAllowedHere(tmptile, i) || CHANCE16(6,10)) { if (!IsRoadAllowedHere(tmptile, i) || CHANCE16(6,10)) {
// But not if there already is a house there. // But not if there already is a house there.
@ -722,7 +722,7 @@ bool GrowTown(Town *t)
return GrowTownAtRoad(t, tile); return GrowTownAtRoad(t, tile);
} }
offs = *ptr++; offs = *ptr++;
tile = TILE_ADD(tile, offs); tile = TILE_ADD(tile, offs);
} while (offs); } while (offs);
@ -732,7 +732,7 @@ bool GrowTown(Town *t)
ptr = _town_coord_mod; ptr = _town_coord_mod;
do { do {
FindLandscapeHeightByTile(&ti, tile); FindLandscapeHeightByTile(&ti, tile);
// Only work with plain land that not already has a house with map5=0 // Only work with plain land that not already has a house with map5=0
if (ti.tileh == 0 && !(ti.type==MP_HOUSE && ti.map5==0)) { if (ti.tileh == 0 && !(ti.type==MP_HOUSE && ti.map5==0)) {
if (DoCommandByTile(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR) != CMD_ERROR) { if (DoCommandByTile(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR) != CMD_ERROR) {
@ -800,7 +800,7 @@ restart:
SET_DPARAM32(0, r); SET_DPARAM32(0, r);
GetString(buf1, t1->townnametype); GetString(buf1, t1->townnametype);
// Check size and width // Check size and width
if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130) if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130)
continue; continue;
@ -814,7 +814,7 @@ restart:
} }
} }
t1->townnameparts = r; t1->townnameparts = r;
return; return;
} }
} }
@ -868,7 +868,7 @@ static void DoCreateTown(Town *t, TileIndex tile)
t->statues = 0; t->statues = 0;
CreateTownName(t); CreateTownName(t);
UpdateTownVirtCoord(t); UpdateTownVirtCoord(t);
_town_sort_dirty = true; _town_sort_dirty = true;
@ -906,7 +906,7 @@ int32 CmdBuildTown(int x, int y, uint32 flags, uint32 p1, uint32 p2)
uint tile = TILE_FROM_XY(x,y); uint tile = TILE_FROM_XY(x,y);
TileInfo ti; TileInfo ti;
Town *t; Town *t;
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
// Check if too close to the edge of map // Check if too close to the edge of map
@ -925,7 +925,7 @@ int32 CmdBuildTown(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// Allocate town struct // Allocate town struct
t = AllocateTown(); t = AllocateTown();
if (t == NULL) if (t == NULL)
return_cmd_error(STR_023A_TOO_MANY_TOWNS); return_cmd_error(STR_023A_TOO_MANY_TOWNS);
// Create the town // Create the town
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
@ -959,7 +959,7 @@ Town *CreateRandomTown()
// Check not too close to a town // Check not too close to a town
if (IsCloseToTown(tile, 20)) if (IsCloseToTown(tile, 20))
continue; continue;
// Allocate a town struct // Allocate a town struct
t = AllocateTown(); t = AllocateTown();
if (t == NULL) if (t == NULL)
@ -1042,7 +1042,7 @@ static bool CheckFree2x2Area(Town *t1, uint tile)
tile += _tile_add[i]; tile += _tile_add[i];
t = ClosestTownFromTile(tile, (uint)-1); t = ClosestTownFromTile(tile, (uint)-1);
if (t1 != t) if (t1 != t)
return false; return false;
if (GetTileSlope(tile, NULL)) if (GetTileSlope(tile, NULL))
@ -1063,7 +1063,7 @@ static void DoBuildTownHouse(Town *t, uint tile)
uint slope; uint slope;
int z; int z;
uint oneof; uint oneof;
// Above snow? // Above snow?
slope = GetTileSlope(tile, &z); slope = GetTileSlope(tile, &z);
@ -1110,7 +1110,7 @@ static void DoBuildTownHouse(Town *t, uint tile)
// Make sure there is no slope? // Make sure there is no slope?
if (_housetype_extra_flags[house]&0x12 && slope) if (_housetype_extra_flags[house]&0x12 && slope)
continue; continue;
if (_housetype_extra_flags[house]&0x10) { if (_housetype_extra_flags[house]&0x10) {
if (CheckFree2x2Area(t,tile) || if (CheckFree2x2Area(t,tile) ||
CheckFree2x2Area(t,(tile+=TILE_XY(-1,0))) || CheckFree2x2Area(t,(tile+=TILE_XY(-1,0))) ||
@ -1121,7 +1121,7 @@ static void DoBuildTownHouse(Town *t, uint tile)
} else if (_housetype_extra_flags[house]&4) { } else if (_housetype_extra_flags[house]&4) {
if (CheckBuildHouseMode(t, tile+TILE_XY(1,0), slope, 0)) if (CheckBuildHouseMode(t, tile+TILE_XY(1,0), slope, 0))
break; break;
if (CheckBuildHouseMode(t, tile+TILE_XY(-1,0), slope, 1)) { if (CheckBuildHouseMode(t, tile+TILE_XY(-1,0), slope, 1)) {
tile += TILE_XY(-1,0); tile += TILE_XY(-1,0);
break; break;
@ -1143,7 +1143,7 @@ static void DoBuildTownHouse(Town *t, uint tile)
// Special houses that there can be only one of. // Special houses that there can be only one of.
t->flags12 |= oneof; t->flags12 |= oneof;
{ {
int m3lo,m5,eflags; int m3lo,m5,eflags;
@ -1152,21 +1152,21 @@ static void DoBuildTownHouse(Town *t, uint tile)
m5 = 0; m5 = 0;
if (_generating_world) { if (_generating_world) {
uint32 r = Random(); uint32 r = Random();
// Value for map3lo // Value for map3lo
m3lo = 0xC0; m3lo = 0xC0;
if ((byte)r >= 220) m3lo &= (r>>8); if ((byte)r >= 220) m3lo &= (r>>8);
if (m3lo == 0xC0) if (m3lo == 0xC0)
ChangePopulation(t, _housetype_population[house]); ChangePopulation(t, _housetype_population[house]);
// Initial value for map5. // Initial value for map5.
m5 = (r >> 16) & 0x3F; m5 = (r >> 16) & 0x3F;
} }
assert(IS_TILETYPE(tile, MP_CLEAR)); assert(IS_TILETYPE(tile, MP_CLEAR));
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_HOUSE) | MP_MAP2 | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5 | MP_MAPOWNER, MP_SETTYPE(MP_HOUSE) | MP_MAP2 | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5 | MP_MAPOWNER,
house, /* map2 */ house, /* map2 */
m3lo, /* map3_lo */ m3lo, /* map3_lo */
@ -1216,7 +1216,7 @@ static void DoBuildTownHouse(Town *t, uint tile)
static bool BuildTownHouse(Town *t, uint tile) static bool BuildTownHouse(Town *t, uint tile)
{ {
int32 r; int32 r;
// make sure it's possible // make sure it's possible
if (!EnsureNoVehicle(tile)) return false; if (!EnsureNoVehicle(tile)) return false;
if (GetTileSlope(tile, NULL) & 0x10) return false; if (GetTileSlope(tile, NULL) & 0x10) return false;
@ -1258,7 +1258,7 @@ static void ClearTownHouse(Town *t, uint tile) {
tile += TILE_XY(-1,-1); tile += TILE_XY(-1,-1);
} }
} }
// Remove population from the town if the // Remove population from the town if the
// house is finished. // house is finished.
if ((~_map3_lo[tile] & 0xC0) == 0) { if ((~_map3_lo[tile] & 0xC0) == 0) {
@ -1273,7 +1273,7 @@ static void ClearTownHouse(Town *t, uint tile) {
t->flags12 &= ~2; t->flags12 &= ~2;
if (house == 0x14 || house == 0x20) if (house == 0x14 || house == 0x20)
t->flags12 &= ~4; t->flags12 &= ~4;
// Do the actual clearing of tiles // Do the actual clearing of tiles
eflags = _housetype_extra_flags[house]; eflags = _housetype_extra_flags[house];
DoClearTownHouseHelper(tile); DoClearTownHouseHelper(tile);
@ -1286,7 +1286,7 @@ int32 CmdRenameTown(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
StringID str; StringID str;
Town *t = DEREF_TOWN(p1); Town *t = DEREF_TOWN(p1);
str = AllocateName((byte*)_decode_parameters, 4); str = AllocateName((byte*)_decode_parameters, 4);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
@ -1349,7 +1349,7 @@ void ExpandTown(Town *t)
int amount, n; int amount, n;
_generating_world = true; _generating_world = true;
amount = ((int)Random()&3) + 3; amount = ((int)Random()&3) + 3;
t->num_houses += amount; t->num_houses += amount;
UpdateTownRadius(t); UpdateTownRadius(t);
@ -1374,7 +1374,7 @@ static void TownActionAdvertise(Town *t, int action)
{ {
static const byte _advertising_amount[3] = {0x40, 0x70, 0xA0}; static const byte _advertising_amount[3] = {0x40, 0x70, 0xA0};
static const byte _advertising_radius[3] = {10,15,20}; static const byte _advertising_radius[3] = {10,15,20};
ModifyStationRatingAround(t->xy, _current_player, ModifyStationRatingAround(t->xy, _current_player,
_advertising_amount[action], _advertising_amount[action],
_advertising_radius[action]); _advertising_radius[action]);
} }
@ -1384,14 +1384,14 @@ static void TownActionRoadRebuild(Town *t, int action)
Player *p; Player *p;
t->road_build_months = 6; t->road_build_months = 6;
SET_DPARAM16(0, t->index); SET_DPARAM16(0, t->index);
p = DEREF_PLAYER(_current_player); p = DEREF_PLAYER(_current_player);
SET_DPARAM16(1, p->name_1); SET_DPARAM16(1, p->name_1);
SET_DPARAM32(2, p->name_2); SET_DPARAM32(2, p->name_2);
AddNewsItem(STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING, AddNewsItem(STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING,
NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_GENERAL, 0), t->xy, 0); NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_GENERAL, 0), t->xy, 0);
} }
@ -1429,7 +1429,7 @@ static void TownActionBuildStatue(Town *t, int action)
// Layouted as an outward spiral // Layouted as an outward spiral
static const TileIndexDiff _statue_tiles[] = { static const TileIndexDiff _statue_tiles[] = {
TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0),
TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1),
TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
@ -1437,7 +1437,7 @@ static void TownActionBuildStatue(Town *t, int action)
TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1),
TILE_XY(0,1), TILE_XY(0,1), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0),
TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(-1,0), TILE_XY(0,1), TILE_XY(0,1), TILE_XY(0,1),
@ -1445,7 +1445,7 @@ static void TownActionBuildStatue(Town *t, int action)
TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0), TILE_XY(1,0),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
0, 0,
@ -1657,7 +1657,7 @@ Town *ClosestTownFromTile(uint tile, uint threshold)
Town *t; Town *t;
uint dist, best = threshold; uint dist, best = threshold;
Town *best_town = NULL; Town *best_town = NULL;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) { if (t->xy != 0) {
dist = GetTileDist(tile, t->xy); dist = GetTileDist(tile, t->xy);
@ -1680,9 +1680,9 @@ void ChangeTownRating(Town *t, int add, int max)
return; return;
SETBIT(t->have_ratings, _current_player); SETBIT(t->have_ratings, _current_player);
rating = t->ratings[_current_player]; rating = t->ratings[_current_player];
if (add < 0) { if (add < 0) {
if (rating > max) { if (rating > max) {
rating += add; rating += add;
@ -1714,7 +1714,7 @@ bool CheckforTownRating(uint tile, uint32 flags, Town *t, byte type)
return true; return true;
/* check if you're allowed to remove the street/bridge/tunnel/industry /* check if you're allowed to remove the street/bridge/tunnel/industry
* owned by a town no removal if rating is lower than ... depends now on * owned by a town no removal if rating is lower than ... depends now on
* difficulty setting. Minimum town rating selected by difficulty level * difficulty setting. Minimum town rating selected by difficulty level
*/ */
modemod = _default_rating_settings[_opt_mod_ptr->diff.town_council_tolerance][type]; modemod = _default_rating_settings[_opt_mod_ptr->diff.town_council_tolerance][type];
@ -1785,7 +1785,7 @@ const TileTypeProcs _tile_type_town_procs = {
// Save and load of towns. // Save and load of towns.
static const byte _town_desc[] = { static const byte _town_desc[] = {
SLE_VAR(Town,xy, SLE_UINT16), SLE_VAR(Town,xy, SLE_UINT16),
SLE_CONDVAR(Town,population, SLE_FILE_U16 | SLE_VAR_U32, 0, 2), SLE_CONDVAR(Town,population, SLE_FILE_U16 | SLE_VAR_U32, 0, 2),
SLE_CONDVAR(Town,population, SLE_UINT32, 3, 255), SLE_CONDVAR(Town,population, SLE_UINT32, 3, 255),

View File

@ -84,7 +84,7 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
uint buttons; uint buttons;
int numact; int numact;
Town *t = DEREF_TOWN(w->window_number); Town *t = DEREF_TOWN(w->window_number);
switch(e->event) { switch(e->event) {
case WE_PAINT: case WE_PAINT:
buttons = GetMaskOfTownActions(&numact, t); buttons = GetMaskOfTownActions(&numact, t);
@ -129,7 +129,7 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
/* WARNING ugly hack! /* WARNING ugly hack!
GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16 GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16
It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like
that because there is another param after it. that because there is another param after it.
So we'll just shift the rating one back if player is AI and all is fine So we'll just shift the rating one back if player is AI and all is fine
*/ */
SET_DPARAM16((IS_HUMAN_PLAYER(p->index) ? 4 : 3), str); SET_DPARAM16((IS_HUMAN_PLAYER(p->index) ? 4 : 3), str);
@ -167,7 +167,7 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
DrawStringMultiLine(2, 159, STR_204D_INITIATE_A_SMALL_LOCAL + i, 313); DrawStringMultiLine(2, 159, STR_204D_INITIATE_A_SMALL_LOCAL + i, 313);
} }
} }
break; break;
case WE_CLICK: case WE_CLICK:
@ -225,11 +225,11 @@ static void TownViewWndProc(Window *w, WindowEvent *e)
case WE_PAINT: case WE_PAINT:
SET_DPARAM16(0, t->index); SET_DPARAM16(0, t->index);
DrawWindowWidgets(w); DrawWindowWidgets(w);
SET_DPARAM32(0, t->population); SET_DPARAM32(0, t->population);
SET_DPARAM32(1, t->num_houses); SET_DPARAM32(1, t->num_houses);
DrawString(2,107,STR_2006_POPULATION,0); DrawString(2,107,STR_2006_POPULATION,0);
SET_DPARAM16(0, t->act_pass); SET_DPARAM16(0, t->act_pass);
SET_DPARAM16(1, t->max_pass); SET_DPARAM16(1, t->max_pass);
DrawString(2,117,STR_200D_PASSENGERS_LAST_MONTH_MAX,0); DrawString(2,117,STR_200D_PASSENGERS_LAST_MONTH_MAX,0);
@ -237,7 +237,7 @@ static void TownViewWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(0, t->act_mail); SET_DPARAM16(0, t->act_mail);
SET_DPARAM16(1, t->max_mail); SET_DPARAM16(1, t->max_mail);
DrawString(2,127,STR_200E_MAIL_LAST_MONTH_MAX,0); DrawString(2,127,STR_200E_MAIL_LAST_MONTH_MAX,0);
DrawWindowViewport(w); DrawWindowViewport(w);
break; break;
@ -411,7 +411,7 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
DrawWindowWidgets(w); DrawWindowWidgets(w);
DoDrawString(_town_sort_order & 1 ? "\xAA" : "\xA0", (_town_sort_order <= 1) ? 88 : 187, 15, 0x10); DoDrawString(_town_sort_order & 1 ? "\xAA" : "\xA0", (_town_sort_order <= 1) ? 88 : 187, 15, 0x10);
{ {
Town *t; Town *t;
int n = 0; int n = 0;
@ -447,7 +447,7 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
_town_sort_dirty = true; _town_sort_dirty = true;
SetWindowDirty(w); SetWindowDirty(w);
} break; } break;
case 4: { /* Click on Town Matrix */ case 4: { /* Click on Town Matrix */
uint16 id_v = (e->click.pt.y - 28) / 10; uint16 id_v = (e->click.pt.y - 28) / 10;
@ -460,17 +460,17 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
{ {
Town *t = DEREF_TOWN(_town_sort[id_v]); Town *t = DEREF_TOWN(_town_sort[id_v]);
assert(t->xy); assert(t->xy);
ScrollMainWindowToTile(t->xy); ScrollMainWindowToTile(t->xy);
} }
} break; } break;
} }
break; break;
case WE_4: case WE_4:
SetWindowDirty(w); SetWindowDirty(w);
break; break;
} }
} }
static const WindowDesc _town_directory_desc = { static const WindowDesc _town_directory_desc = {

View File

@ -22,7 +22,7 @@ static const byte _vehicle_initial_y_fract[4] = {8,4,8,10};
static const byte _state_dir_table[4] = { 0x20, 8, 0x10, 4 }; static const byte _state_dir_table[4] = { 0x20, 8, 0x10, 4 };
static const byte _signal_onedir[14] = { static const byte _signal_onedir[14] = {
0x80, 0x80, 0x80, 0x20, 0x40, 0x10, 0, 0, 0x80, 0x80, 0x80, 0x20, 0x40, 0x10, 0, 0,
0x40, 0x40, 0x40, 0x10, 0x80, 0x20 0x40, 0x40, 0x40, 0x10, 0x80, 0x20
}; };
@ -41,7 +41,7 @@ void UpdateTrainAcceleration(Vehicle *v)
// compute stuff like max speed, power, and weight. // compute stuff like max speed, power, and weight.
do { do {
const RailVehicleInfo *rvi = &_rail_vehicle_info[u->engine_type]; const RailVehicleInfo *rvi = &_rail_vehicle_info[u->engine_type];
// power is sum of the power for all engines // power is sum of the power for all engines
power += rvi->power; power += rvi->power;
@ -53,7 +53,7 @@ void UpdateTrainAcceleration(Vehicle *v)
weight += (_cargoc.weights[u->cargo_type] * u->cargo_count) >> 4; weight += (_cargoc.weights[u->cargo_type] * u->cargo_count) >> 4;
} while ( (u=u->next) != NULL); } while ( (u=u->next) != NULL);
// these are shown in the UI // these are shown in the UI
v->u.rail.cached_weight = weight; v->u.rail.cached_weight = weight;
v->u.rail.cached_power = power; v->u.rail.cached_power = power;
@ -123,15 +123,15 @@ static int GetRealisticAcceleration(Vehicle *v)
if (te > te2) te = te2; if (te > te2) te = te2;
f += te; f += te;
} }
// add air resistance // add air resistance
{ {
float cx = 1.0f; // NOT DONE float cx = 1.0f; // NOT DONE
// air resistance is doubled in tunnels. // air resistance is doubled in tunnels.
if (v->vehstatus == 0x40) cx *= 2; if (v->vehstatus == 0x40) cx *= 2;
f -= cx * spd * spd * (F_KPH_MS * F_KPH_MS * 0.001f); f -= cx * spd * spd * (F_KPH_MS * F_KPH_MS * 0.001f);
} }
// after this f contains the acceleration. // after this f contains the acceleration.
@ -158,7 +158,7 @@ int GetTrainImage(Vehicle *v, byte direction)
if (base) return base; if (base) return base;
img = _engine_original_sprites[v->engine_type]; img = _engine_original_sprites[v->engine_type];
} }
base = _engine_sprite_base[img] + ((direction + _engine_sprite_add[img]) & _engine_sprite_and[img]); base = _engine_sprite_base[img] + ((direction + _engine_sprite_add[img]) & _engine_sprite_and[img]);
if (v->cargo_count >= (v->cargo_cap >> 1)) if (v->cargo_count >= (v->cargo_cap >> 1))
@ -169,7 +169,7 @@ int GetTrainImage(Vehicle *v, byte direction)
void DrawTrainEngine(int x, int y, int engine, uint32 image_ormod) void DrawTrainEngine(int x, int y, int engine, uint32 image_ormod)
{ {
const RailVehicleInfo *rvi = &_rail_vehicle_info[engine]; const RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
int img = rvi->image_index; int img = rvi->image_index;
uint32 image = 0; uint32 image = 0;
@ -190,7 +190,7 @@ void DrawTrainEngine(int x, int y, int engine, uint32 image_ormod)
if (!image) img = _engine_original_sprites[engine]; if (!image) img = _engine_original_sprites[engine];
} }
if (!image) { if (!image) {
image = ((6 + _engine_sprite_add[img+1]) & _engine_sprite_and[img+1]) + _engine_sprite_base[img+1]; image = ((6 + _engine_sprite_add[img+1]) & _engine_sprite_and[img+1]) + _engine_sprite_base[img+1];
} }
} }
DrawSprite(image | image_ormod, x, y); DrawSprite(image | image_ormod, x, y);
@ -208,7 +208,7 @@ void DrawTrainEngineInfo(int engine, int x, int y, int maxw)
SET_DPARAM16(1, rvi->weight << multihead); SET_DPARAM16(1, rvi->weight << multihead);
SET_DPARAM32(4, (rvi->running_cost_base * _price.running_rail[rvi->engclass] >> 8) << multihead); SET_DPARAM32(4, (rvi->running_cost_base * _price.running_rail[rvi->engclass] >> 8) << multihead);
cap = rvi->capacity; cap = rvi->capacity;
SET_DPARAM16(5, STR_8838_N_A); SET_DPARAM16(5, STR_8838_N_A);
if (cap != 0) { if (cap != 0) {
@ -264,7 +264,7 @@ int32 CmdBuildRailWagon(uint engine, uint tile, uint32 flags)
v->direction = (byte)(dir*2+1); v->direction = (byte)(dir*2+1);
v->tile = (TileIndex)tile; v->tile = (TileIndex)tile;
x = GET_TILE_X(tile)*16 | _vehicle_initial_x_fract[dir]; x = GET_TILE_X(tile)*16 | _vehicle_initial_x_fract[dir];
y = GET_TILE_Y(tile)*16 | _vehicle_initial_y_fract[dir]; y = GET_TILE_Y(tile)*16 | _vehicle_initial_y_fract[dir];
@ -294,11 +294,11 @@ int32 CmdBuildRailWagon(uint engine, uint tile, uint32 flags)
e = &_engines[engine]; e = &_engines[engine];
v->u.rail.railtype = e->railtype; v->u.rail.railtype = e->railtype;
v->build_year = _cur_year; v->build_year = _cur_year;
v->type = VEH_Train; v->type = VEH_Train;
v->cur_image = 0xAC2; v->cur_image = 0xAC2;
_new_wagon_id = v->index; _new_wagon_id = v->index;
VehiclePositionChanged(v); VehiclePositionChanged(v);
@ -380,12 +380,12 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
uint tile; uint tile;
_cmd_build_rail_veh_var1 = 0; _cmd_build_rail_veh_var1 = 0;
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
tile = TILE_FROM_XY(x,y); tile = TILE_FROM_XY(x,y);
rvi = &_rail_vehicle_info[p1]; rvi = &_rail_vehicle_info[p1];
if (rvi->flags & RVI_WAGON) { if (rvi->flags & RVI_WAGON) {
return CmdBuildRailWagon(p1, tile, flags); return CmdBuildRailWagon(p1, tile, flags);
} }
@ -434,14 +434,14 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->dest_tile = 0; v->dest_tile = 0;
// v->profit_last_year = 0; // v->profit_last_year = 0;
// v->profit_this_year = 0; // v->profit_this_year = 0;
v->engine_type = (byte)p1; v->engine_type = (byte)p1;
e = &_engines[p1]; e = &_engines[p1];
v->reliability = e->reliability; v->reliability = e->reliability;
v->reliability_spd_dec = e->reliability_spd_dec; v->reliability_spd_dec = e->reliability_spd_dec;
v->max_age = e->lifelength * 366; v->max_age = e->lifelength * 366;
v->string_id = STR_SV_TRAIN_NAME; v->string_id = STR_SV_TRAIN_NAME;
// v->cur_speed = 0; // v->cur_speed = 0;
// v->subspeed = 0; // v->subspeed = 0;
@ -449,11 +449,11 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_new_train_id = v->index; _new_train_id = v->index;
// v->cur_order_index = 0; // v->cur_order_index = 0;
// v->num_orders = 0; // v->num_orders = 0;
*(v->schedule_ptr = _ptr_to_next_order++) = 0; *(v->schedule_ptr = _ptr_to_next_order++) = 0;
// v->next_in_chain = 0xffff; // v->next_in_chain = 0xffff;
// v->next = NULL; // v->next = NULL;
v->service_interval = _patches.servint_trains; v->service_interval = _patches.servint_trains;
// v->breakdown_ctr = 0; // v->breakdown_ctr = 0;
// v->breakdowns_since_last_service = 0; // v->breakdowns_since_last_service = 0;
@ -503,7 +503,7 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
} }
_cmd_build_rail_veh_var1 = _railveh_unk1[p1]; _cmd_build_rail_veh_var1 = _railveh_unk1[p1];
_cmd_build_rail_veh_score = _railveh_score[p1]; _cmd_build_rail_veh_score = _railveh_score[p1];
return value; return value;
} }
@ -524,7 +524,7 @@ int CheckStoppedInDepot(Vehicle *v)
{ {
int count; int count;
TileIndex tile = v->tile; TileIndex tile = v->tile;
/* check if stopped in a depot */ /* check if stopped in a depot */
if (!IsTrainDepotTile(tile) || v->cur_speed != 0) { if (!IsTrainDepotTile(tile) || v->cur_speed != 0) {
errmsg: errmsg:
@ -535,7 +535,7 @@ errmsg:
count = 0; count = 0;
do { do {
count++; count++;
if (v->u.rail.track != 0x80 || v->tile != (TileIndex)tile || if (v->u.rail.track != 0x80 || v->tile != (TileIndex)tile ||
(v->subtype==0 && !(v->vehstatus&VS_STOPPED))) (v->subtype==0 && !(v->vehstatus&VS_STOPPED)))
goto errmsg; goto errmsg;
} while ( (v=v->next) != NULL); } while ( (v=v->next) != NULL);
@ -599,7 +599,7 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
&& is_firsthead_sprite(src->spritenum); && is_firsthead_sprite(src->spritenum);
// if nothing is selected as destination, try and find a matching vehicle to drag to. // if nothing is selected as destination, try and find a matching vehicle to drag to.
if (((int32)p1 >> 16) == -1) { if (((int32)p1 >> 16) == -1) {
dst = NULL; dst = NULL;
if (!is_loco) dst = FindGoodVehiclePos(src); if (!is_loco) dst = FindGoodVehiclePos(src);
} else { } else {
@ -609,7 +609,7 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// don't move the same vehicle.. // don't move the same vehicle..
if (src == dst) if (src == dst)
return 0; return 0;
/* the player must be the owner */ /* the player must be the owner */
if (!CheckOwnership(src->owner) || (dst!=NULL && !CheckOwnership(dst->owner))) if (!CheckOwnership(src->owner) || (dst!=NULL && !CheckOwnership(dst->owner)))
return CMD_ERROR; return CMD_ERROR;
@ -618,7 +618,7 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
src_head = GetFirstVehicleInChain(src); src_head = GetFirstVehicleInChain(src);
dst_head = NULL; dst_head = NULL;
if (dst != NULL) dst_head = GetFirstVehicleInChain(dst); if (dst != NULL) dst_head = GetFirstVehicleInChain(dst);
/* check if all vehicles in the source train are stopped */ /* check if all vehicles in the source train are stopped */
if (CheckStoppedInDepot(src_head) < 0) if (CheckStoppedInDepot(src_head) < 0)
return CMD_ERROR; return CMD_ERROR;
@ -695,7 +695,7 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
DeleteWindowById(WC_VEHICLE_VIEW, src->index); DeleteWindowById(WC_VEHICLE_VIEW, src->index);
DeleteVehicleSchedule(src); DeleteVehicleSchedule(src);
} }
src->subtype = 2; src->subtype = 2;
src->unitnumber = 0; // doesn't occupy a unitnumber anymore. src->unitnumber = 0; // doesn't occupy a unitnumber anymore.
@ -785,7 +785,7 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2)
last = NULL; last = NULL;
} }
} }
// make sure the vehicle is stopped in the depot // make sure the vehicle is stopped in the depot
if (CheckStoppedInDepot(first) < 0) if (CheckStoppedInDepot(first) < 0)
return CMD_ERROR; return CMD_ERROR;
@ -801,7 +801,7 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// when selling an attached locomotive. we need to delete its window. // when selling an attached locomotive. we need to delete its window.
if (v->subtype == 0) { if (v->subtype == 0) {
DeleteWindowById(WC_VEHICLE_VIEW, v->index); DeleteWindowById(WC_VEHICLE_VIEW, v->index);
// rearrange all vehicles that follow to separate lines. // rearrange all vehicles that follow to separate lines.
if (p2 == 2) { if (p2 == 2) {
Vehicle *u,*tmp; Vehicle *u,*tmp;
@ -809,7 +809,7 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2)
while (u != last) { while (u != last) {
tmp = u; tmp = u;
u = u->next; u = u->next;
DoCommandByTile(tmp->tile, tmp->index | ((-1)<<16), 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE); DoCommandByTile(tmp->tile, tmp->index | ((-1)<<16), 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
} }
} }
} }
@ -834,7 +834,7 @@ int32 CmdSellRailWagon(int x, int y, uint32 flags, uint32 p1, uint32 p2)
cost -= last->value; cost -= last->value;
DeleteVehicle(last); DeleteVehicle(last);
} }
// an attached train changed? // an attached train changed?
if (first && first->subtype == 0) { if (first && first->subtype == 0) {
UpdateTrainAcceleration(first); UpdateTrainAcceleration(first);
@ -884,7 +884,7 @@ static void UpdateVarsAfterSwap(Vehicle *v)
EndVehicleMove(v); EndVehicleMove(v);
} }
static void SetLastSpeed(Vehicle *v, int spd) { static void SetLastSpeed(Vehicle *v, int spd) {
int old = v->u.rail.last_speed; int old = v->u.rail.last_speed;
if (spd != old) { if (spd != old) {
v->u.rail.last_speed = spd; v->u.rail.last_speed = spd;
@ -908,7 +908,7 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
b->vehstatus = (b->vehstatus & ~VS_HIDDEN) | (a->vehstatus&VS_HIDDEN); b->vehstatus = (b->vehstatus & ~VS_HIDDEN) | (a->vehstatus&VS_HIDDEN);
a->vehstatus = tmp; a->vehstatus = tmp;
} }
/* swap variables */ /* swap variables */
swap_byte(&a->u.rail.track, &b->u.rail.track); swap_byte(&a->u.rail.track, &b->u.rail.track);
swap_byte(&a->direction, &b->direction); swap_byte(&a->direction, &b->direction);
@ -916,7 +916,7 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
/* toggle direction */ /* toggle direction */
if (!(a->u.rail.track & 0x80)) a->direction ^= 4; if (!(a->u.rail.track & 0x80)) a->direction ^= 4;
if (!(b->u.rail.track & 0x80)) b->direction ^= 4; if (!(b->u.rail.track & 0x80)) b->direction ^= 4;
/* swap more variables */ /* swap more variables */
swap_int16(&a->x_pos, &b->x_pos); swap_int16(&a->x_pos, &b->x_pos);
swap_int16(&a->y_pos, &b->y_pos); swap_int16(&a->y_pos, &b->y_pos);
@ -928,7 +928,7 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
UpdateVarsAfterSwap(b); UpdateVarsAfterSwap(b);
} else { } else {
if (!(a->u.rail.track & 0x80)) a->direction ^= 4; if (!(a->u.rail.track & 0x80)) a->direction ^= 4;
UpdateVarsAfterSwap(a); UpdateVarsAfterSwap(a);
} }
} }
@ -996,7 +996,7 @@ int32 CmdForceTrainProceed(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) if (flags & DC_EXEC)
v->u.rail.force_proceed = 0x50; v->u.rail.force_proceed = 0x50;
return 0; return 0;
} }
@ -1027,7 +1027,7 @@ int32 CmdRefitRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->cargo_type = (byte)p2; v->cargo_type = (byte)p2;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
} }
} }
} while ( (v=v->next) != NULL); } while ( (v=v->next) != NULL);
_returned_refit_amount = num; _returned_refit_amount = num;
@ -1082,7 +1082,7 @@ static uint FindClosestTrainDepot(Vehicle *v)
return tile; return tile;
if (v->u.rail.track == 0x40) { tile = GetVehicleOutOfTunnelTile(v); } if (v->u.rail.track == 0x40) { tile = GetVehicleOutOfTunnelTile(v); }
tfdd.owner = v->owner; tfdd.owner = v->owner;
tfdd.best_length = (uint)-1; tfdd.best_length = (uint)-1;
@ -1107,7 +1107,7 @@ static uint FindClosestTrainDepot(Vehicle *v)
if (tfdd.best_length != (uint)-1) if (tfdd.best_length != (uint)-1)
return tfdd.tile; return tfdd.tile;
} }
return (uint)-1; return (uint)-1;
} }
@ -1122,7 +1122,7 @@ int32 CmdTrainGotoDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->u.rail.days_since_order_progr = 0; v->u.rail.days_since_order_progr = 0;
v->cur_order_index++; v->cur_order_index++;
} }
v->next_order = OT_DUMMY; v->next_order = OT_DUMMY;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
@ -1139,7 +1139,7 @@ int32 CmdTrainGotoDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->next_order_param = GetDepotByTile(depot_tile); v->next_order_param = GetDepotByTile(depot_tile);
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
} }
return 0; return 0;
} }
@ -1157,7 +1157,7 @@ int32 CmdChangeTrainServiceInt(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->service_interval = (uint16)p2; v->service_interval = (uint16)p2;
InvalidateWindowWidget(WC_VEHICLE_DETAILS, v->index, 8); InvalidateWindowWidget(WC_VEHICLE_DETAILS, v->index, 8);
} }
return 0; return 0;
} }
@ -1193,7 +1193,7 @@ static void HandleLocomotiveSmokeCloud(Vehicle *v)
case 0: case 0:
// steam smoke. // steam smoke.
if ( (v->tick_counter&0xF) == 0 && !IsTrainDepotTile(v->tile) && !IsTunnelTile(v->tile)) { if ( (v->tick_counter&0xF) == 0 && !IsTrainDepotTile(v->tile) && !IsTunnelTile(v->tile)) {
CreateEffectVehicleRel(v, CreateEffectVehicleRel(v,
(_vehicle_smoke_pos[v->direction]), (_vehicle_smoke_pos[v->direction]),
(_vehicle_smoke_pos[v->direction+8]), (_vehicle_smoke_pos[v->direction+8]),
10, 10,
@ -1257,14 +1257,14 @@ static bool CheckTrainStayInDepot(Vehicle *v)
} }
TrainPlayLeaveStationSound(v); TrainPlayLeaveStationSound(v);
v->u.rail.track = 1; v->u.rail.track = 1;
if (v->direction & 2) if (v->direction & 2)
v->u.rail.track = 2; v->u.rail.track = 2;
v->vehstatus &= ~VS_HIDDEN; v->vehstatus &= ~VS_HIDDEN;
v->cur_speed = 0; v->cur_speed = 0;
UpdateTrainDeltaXY(v, v->direction); UpdateTrainDeltaXY(v, v->direction);
v->cur_image = GetTrainImage(v, v->direction); v->cur_image = GetTrainImage(v, v->direction);
VehiclePositionChanged(v); VehiclePositionChanged(v);
@ -1324,7 +1324,7 @@ static bool TrainTrackFollower(uint tile, TrainTrackFollowerData *ttfd, int trac
// we've actually found the destination already. no point searching in directions longer than this. // we've actually found the destination already. no point searching in directions longer than this.
if (ttfd->best_track_dist != (uint)-1) if (ttfd->best_track_dist != (uint)-1)
return length >= ttfd->best_track_dist; return length >= ttfd->best_track_dist;
// didn't find station // didn't find station
dist = GetTileDist(tile, ttfd->dest_coords); dist = GetTileDist(tile, ttfd->dest_coords);
if (dist < ttfd->best_bird_dist) { if (dist < ttfd->best_bird_dist) {
@ -1374,7 +1374,7 @@ static const byte _pick_track_table[6] = {1, 3, 2, 2, 0, 0};
/* choose a track */ /* choose a track */
static byte ChooseTrainTrack(Vehicle *v, uint tile, int direction, byte trackbits) static byte ChooseTrainTrack(Vehicle *v, uint tile, int direction, byte trackbits)
{ {
TrainTrackFollowerData fd; TrainTrackFollowerData fd;
int bits = trackbits; int bits = trackbits;
uint best_track; uint best_track;
@ -1420,7 +1420,7 @@ static byte ChooseTrainTrack(Vehicle *v, uint tile, int direction, byte trackbit
fd.best_bird_dist = (uint)-1; fd.best_bird_dist = (uint)-1;
fd.best_track_dist = (uint)-1; fd.best_track_dist = (uint)-1;
NewTrainPathfind(tile, _search_directions[i][direction], (TPFEnumProc*)TrainTrackFollower, &fd, NULL); NewTrainPathfind(tile, _search_directions[i][direction], (TPFEnumProc*)TrainTrackFollower, &fd, NULL);
if (best_track != -1) { if (best_track != -1) {
if (best_track_dist == -1) { if (best_track_dist == -1) {
@ -1430,7 +1430,7 @@ static byte ChooseTrainTrack(Vehicle *v, uint tile, int direction, byte trackbit
if (fd.best_bird_dist < best_bird_dist) goto good; if (fd.best_bird_dist < best_bird_dist) goto good;
} else { } else {
/* we found the destination for the first time */ /* we found the destination for the first time */
goto good; goto good;
} }
} else { } else {
if (fd.best_track_dist == -1) { if (fd.best_track_dist == -1) {
@ -1442,13 +1442,13 @@ static byte ChooseTrainTrack(Vehicle *v, uint tile, int direction, byte trackbit
if (fd.best_track_dist < best_track_dist) goto good; if (fd.best_track_dist < best_track_dist) goto good;
} }
} }
/* if we reach this position, there's two paths of equal value so far. /* if we reach this position, there's two paths of equal value so far.
* pick one randomly. */ * pick one randomly. */
r = (byte)Random(); r = (byte)Random();
if (_pick_track_table[i] == train_dir) r += 80; if (_pick_track_table[i] == train_dir) r += 80;
if (_pick_track_table[best_track] == train_dir) r -= 80; if (_pick_track_table[best_track] == train_dir) r -= 80;
if (r <= 127) goto bad; if (r <= 127) goto bad;
} }
good:; good:;
@ -1508,7 +1508,7 @@ static bool CheckReverseTrain(Vehicle *v)
if (fd.best_bird_dist < best_bird_dist) goto good; if (fd.best_bird_dist < best_bird_dist) goto good;
} else { } else {
/* we found the destination for the first time */ /* we found the destination for the first time */
goto good; goto good;
} }
} else { } else {
if (fd.best_bird_dist != 0) { if (fd.best_bird_dist != 0) {
@ -1520,8 +1520,8 @@ static bool CheckReverseTrain(Vehicle *v)
if (fd.best_track_dist < best_track_dist) goto good; if (fd.best_track_dist < best_track_dist) goto good;
} }
} }
/* if we reach this position, there's two paths of equal value so far. /* if we reach this position, there's two paths of equal value so far.
* pick one randomly. */ * pick one randomly. */
r = (byte)Random(); r = (byte)Random();
if (_pick_track_table[i] == (v->direction & 3)) r += 80; if (_pick_track_table[i] == (v->direction & 3)) r += 80;
@ -1549,7 +1549,7 @@ static bool ProcessTrainOrder(Vehicle *v)
// These are un-interruptible // These are un-interruptible
if ((v->next_order & OT_MASK) >= OT_GOTO_DEPOT && (v->next_order & OT_MASK) <= OT_LEAVESTATION) { if ((v->next_order & OT_MASK) >= OT_GOTO_DEPOT && (v->next_order & OT_MASK) <= OT_LEAVESTATION) {
// Let a depot order in the schedule interrupt. // Let a depot order in the schedule interrupt.
if ((v->next_order & (OT_MASK|OF_UNLOAD)) != (OT_GOTO_DEPOT|OF_UNLOAD)) if ((v->next_order & (OT_MASK|OF_UNLOAD)) != (OT_GOTO_DEPOT|OF_UNLOAD))
return false; return false;
@ -1565,9 +1565,9 @@ static bool ProcessTrainOrder(Vehicle *v)
v->cur_order_index++; v->cur_order_index++;
} }
// check if we've reached a non-stop station while TTDPatch nonstop is enabled.. // check if we've reached a non-stop station while TTDPatch nonstop is enabled..
if (_patches.new_nonstop && (v->next_order & OF_NON_STOP) && v->next_order_param == _map2[v->tile]) { if (_patches.new_nonstop && (v->next_order & OF_NON_STOP) && v->next_order_param == _map2[v->tile]) {
v->cur_order_index++; v->cur_order_index++;
} }
// Get the current order // Get the current order
@ -1623,7 +1623,7 @@ static void HandleTrainLoading(Vehicle *v, bool mode)
{ {
if (v->next_order == OT_NOTHING) if (v->next_order == OT_NOTHING)
return; return;
if (v->next_order != OT_DUMMY) { if (v->next_order != OT_DUMMY) {
if ((v->next_order&OT_MASK) != OT_LOADING) if ((v->next_order&OT_MASK) != OT_LOADING)
return; return;
@ -1643,19 +1643,19 @@ static void HandleTrainLoading(Vehicle *v, bool mode)
if (LoadUnloadVehicle(v)) { if (LoadUnloadVehicle(v)) {
InvalidateWindow(WC_TRAINS_LIST, v->owner); InvalidateWindow(WC_TRAINS_LIST, v->owner);
MarkTrainDirty(v); MarkTrainDirty(v);
// need to update acceleration since the goods on the train changed. // need to update acceleration since the goods on the train changed.
UpdateTrainAcceleration(v); UpdateTrainAcceleration(v);
} }
return; return;
} }
TrainPlayLeaveStationSound(v); TrainPlayLeaveStationSound(v);
{ {
byte b = v->next_order; byte b = v->next_order;
v->next_order = OT_LEAVESTATION; v->next_order = OT_LEAVESTATION;
// If this was not the final order, don't remove it from the list. // If this was not the final order, don't remove it from the list.
if (!(b & OF_NON_STOP)) if (!(b & OF_NON_STOP))
return; return;
@ -1735,7 +1735,7 @@ static void TrainEnterStation(Vehicle *v, int station)
static byte AfterSetTrainPos(Vehicle *v) static byte AfterSetTrainPos(Vehicle *v)
{ {
byte new_z, old_z; byte new_z, old_z;
// need this hint so it returns the right z coordinate on bridges. // need this hint so it returns the right z coordinate on bridges.
_get_z_hint = v->z_pos; _get_z_hint = v->z_pos;
new_z = GetSlopeZ(v->x_pos, v->y_pos); new_z = GetSlopeZ(v->x_pos, v->y_pos);
@ -1763,7 +1763,7 @@ static const byte _new_vehicle_direction_table[11] = {
static int GetNewVehicleDirectionByTile(uint new_tile, uint old_tile) static int GetNewVehicleDirectionByTile(uint new_tile, uint old_tile)
{ {
uint offs = (GET_TILE_Y(new_tile) - GET_TILE_Y(old_tile) + 1) * 4 + uint offs = (GET_TILE_Y(new_tile) - GET_TILE_Y(old_tile) + 1) * 4 +
GET_TILE_X(new_tile) - GET_TILE_X(old_tile) + 1; GET_TILE_X(new_tile) - GET_TILE_X(old_tile) + 1;
assert(offs < 11); assert(offs < 11);
return _new_vehicle_direction_table[offs]; return _new_vehicle_direction_table[offs];
@ -1812,7 +1812,7 @@ static bool CheckCompatibleRail(Vehicle *v, uint tile)
// correct Z position of a train going under a bridge on slopes // correct Z position of a train going under a bridge on slopes
if (CORRECT_Z(ti.tileh)) if (CORRECT_Z(ti.tileh))
ti.z += 8; ti.z += 8;
if(v->z_pos != ti.z) // train is going over bridge if(v->z_pos != ti.z) // train is going over bridge
return true; return true;
} }
@ -1822,7 +1822,7 @@ static bool CheckCompatibleRail(Vehicle *v, uint tile)
if (_map_owner[tile] != v->owner || if (_map_owner[tile] != v->owner ||
(v->subtype == 0 && (_map3_lo[tile] & 0xF) != v->u.rail.railtype)) (v->subtype == 0 && (_map3_lo[tile] & 0xF) != v->u.rail.railtype))
return false; return false;
return true; return true;
} }
@ -1910,7 +1910,7 @@ static void SetVehicleCrashed(Vehicle *v)
return; return;
v->u.rail.crash_anim_pos++; v->u.rail.crash_anim_pos++;
u = v; u = v;
BEGIN_ENUM_WAGONS(v) BEGIN_ENUM_WAGONS(v)
v->vehstatus |= VS_CRASHED; v->vehstatus |= VS_CRASHED;
@ -1921,7 +1921,7 @@ static void SetVehicleCrashed(Vehicle *v)
static int CountPassengersInTrain(Vehicle *v) static int CountPassengersInTrain(Vehicle *v)
{ {
int num = 0; int num = 0;
BEGIN_ENUM_WAGONS(v) BEGIN_ENUM_WAGONS(v)
if (v->cargo_type == 0) num += v->cargo_count; if (v->cargo_type == 0) num += v->cargo_count;
END_ENUM_WAGONS(v) END_ENUM_WAGONS(v)
@ -1943,8 +1943,8 @@ static void CheckTrainCollision(Vehicle *v)
/* can't collide in depot */ /* can't collide in depot */
if (v->u.rail.track == 0x80) if (v->u.rail.track == 0x80)
return; return;
if ( !(v->u.rail.track == 0x40) ) if ( !(v->u.rail.track == 0x40) )
assert((uint)TILE_FROM_XY(v->x_pos, v->y_pos) == v->tile); assert((uint)TILE_FROM_XY(v->x_pos, v->y_pos) == v->tile);
tcc.v = v; tcc.v = v;
@ -1954,27 +1954,27 @@ static void CheckTrainCollision(Vehicle *v)
realcoll = coll = VehicleFromPos(TILE_FROM_XY(v->x_pos, v->y_pos), &tcc, (VehicleFromPosProc*)FindTrainCollideEnum); realcoll = coll = VehicleFromPos(TILE_FROM_XY(v->x_pos, v->y_pos), &tcc, (VehicleFromPosProc*)FindTrainCollideEnum);
if (coll == NULL) if (coll == NULL)
return; return;
coll = GetFirstVehicleInChain(coll); coll = GetFirstVehicleInChain(coll);
/* it can't collide with its own wagons */ /* it can't collide with its own wagons */
if ( (v == coll) || ( (v->u.rail.track & 0x40) && ( (v->direction & 2) != (realcoll->direction & 2) ) ) ) if ( (v == coll) || ( (v->u.rail.track & 0x40) && ( (v->direction & 2) != (realcoll->direction & 2) ) ) )
return; return;
//two drivers + passangers killed in train v //two drivers + passangers killed in train v
num = 2 + CountPassengersInTrain(v); num = 2 + CountPassengersInTrain(v);
if(!(coll->vehstatus&VS_CRASHED)) if(!(coll->vehstatus&VS_CRASHED))
//two drivers + passangers killed in train coll (if it was not crashed already) //two drivers + passangers killed in train coll (if it was not crashed already)
num += 2 + CountPassengersInTrain(coll); num += 2 + CountPassengersInTrain(coll);
SetVehicleCrashed(v); SetVehicleCrashed(v);
if (coll->subtype == 0) if (coll->subtype == 0)
SetVehicleCrashed(coll); SetVehicleCrashed(coll);
SET_DPARAM16(0, num); SET_DPARAM16(0, num);
AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL, AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0), NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
v->index, v->index,
@ -2009,7 +2009,7 @@ static void TrainController(Vehicle *v)
/* For every vehicle after and including the given vehicle */ /* For every vehicle after and including the given vehicle */
for(;;) { for(;;) {
BeginVehicleMove(v); BeginVehicleMove(v);
if (v->u.rail.track != 0x40) { if (v->u.rail.track != 0x40) {
/* Not inside tunnel */ /* Not inside tunnel */
if (GetNewVehiclePos(v, &gp)) { if (GetNewVehiclePos(v, &gp)) {
@ -2039,7 +2039,7 @@ static void TrainController(Vehicle *v)
/* Determine what direction we're entering the new tile from */ /* Determine what direction we're entering the new tile from */
dir = GetNewVehicleDirectionByTile(gp.new_tile, gp.old_tile); dir = GetNewVehicleDirectionByTile(gp.new_tile, gp.old_tile);
assert(dir==1 || dir==3 || dir==5 || dir==7); assert(dir==1 || dir==3 || dir==5 || dir==7);
/* Get the status of the tracks in the new tile and mask /* Get the status of the tracks in the new tile and mask
* away the bits that aren't reachable. */ * away the bits that aren't reachable. */
ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL) & _reachable_tracks[dir >> 1]; ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL) & _reachable_tracks[dir >> 1];
@ -2065,7 +2065,7 @@ static void TrainController(Vehicle *v)
if ( (tracks>>16)&chosen_track && v->u.rail.force_proceed == 0) goto red_light; if ( (tracks>>16)&chosen_track && v->u.rail.force_proceed == 0) goto red_light;
} else { } else {
static byte _matching_tracks[8] = {0x30, 1, 0xC, 2, 0x30, 1, 0xC, 2}; static byte _matching_tracks[8] = {0x30, 1, 0xC, 2, 0x30, 1, 0xC, 2};
/* The wagon is active, simply follow the prev vehicle. */ /* The wagon is active, simply follow the prev vehicle. */
chosen_track = (byte)(_matching_tracks[GetDirectionToVehicle(prev, gp.x, gp.y)] & tracks); chosen_track = (byte)(_matching_tracks[GetDirectionToVehicle(prev, gp.x, gp.y)] & tracks);
} }
@ -2080,7 +2080,7 @@ static void TrainController(Vehicle *v)
gp.y = (gp.y & ~0xF) | b[1]; gp.y = (gp.y & ~0xF) | b[1];
chosen_dir = b[2]; chosen_dir = b[2];
} }
/* Call the landscape function and tell it that the vehicle entered the tile */ /* Call the landscape function and tell it that the vehicle entered the tile */
r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y); r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
if (r&0x8) if (r&0x8)
@ -2100,7 +2100,7 @@ static void TrainController(Vehicle *v)
* (above) or the last vehicle moves. */ * (above) or the last vehicle moves. */
if (v->next == NULL) if (v->next == NULL)
TrainMovedChangeSignals(gp.old_tile, (dir>>1) ^ 2); TrainMovedChangeSignals(gp.old_tile, (dir>>1) ^ 2);
if (prev == NULL) { if (prev == NULL) {
AffectSpeedByDirChange(v, chosen_dir); AffectSpeedByDirChange(v, chosen_dir);
} }
@ -2110,7 +2110,7 @@ static void TrainController(Vehicle *v)
} else { } else {
/* in tunnel */ /* in tunnel */
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
if (IS_TILETYPE(gp.new_tile, MP_TUNNELBRIDGE) && if (IS_TILETYPE(gp.new_tile, MP_TUNNELBRIDGE) &&
!(_map5[gp.new_tile] & 0xF0)) { !(_map5[gp.new_tile] & 0xF0)) {
r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y); r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
@ -2136,7 +2136,7 @@ common:;
/* update the Z position of the vehicle */ /* update the Z position of the vehicle */
old_z = AfterSetTrainPos(v); old_z = AfterSetTrainPos(v);
if (prev == NULL) { if (prev == NULL) {
/* This is the first vehicle in the train */ /* This is the first vehicle in the train */
AffectSpeedByZChange(v, old_z); AffectSpeedByZChange(v, old_z);
@ -2162,7 +2162,7 @@ red_light: {
/* find the first set bit in ts. need to do it in 2 steps, since /* find the first set bit in ts. need to do it in 2 steps, since
* FIND_FIRST_BIT only handles 6 bits at a time. */ * FIND_FIRST_BIT only handles 6 bits at a time. */
i = FindFirstBit2x64(ts); i = FindFirstBit2x64(ts);
if (!(_map3_lo[gp.new_tile] & _signal_otherdir[i])) { if (!(_map3_lo[gp.new_tile] & _signal_otherdir[i])) {
v->cur_speed = 0; v->cur_speed = 0;
v->subspeed = 0; v->subspeed = 0;
@ -2181,7 +2181,7 @@ red_light: {
} }
} }
} }
reverse_train_direction: reverse_train_direction:
v->load_unload_time_rem = 0; v->load_unload_time_rem = 0;
v->cur_speed = 0; v->cur_speed = 0;
@ -2216,7 +2216,7 @@ static void DeleteLastWagon(Vehicle *v)
if (!((t=v->u.rail.track) & 0xC0)) { if (!((t=v->u.rail.track) & 0xC0)) {
SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t)); SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t));
} }
if (v->u.rail.track == 0x40) { if (v->u.rail.track == 0x40) {
int length; int length;
TileIndex endtile = CheckTunnelBusy(v->tile, &length); TileIndex endtile = CheckTunnelBusy(v->tile, &length);
@ -2232,10 +2232,10 @@ static void DeleteLastWagon(Vehicle *v)
static void ChangeTrainDirRandomly(Vehicle *v) static void ChangeTrainDirRandomly(Vehicle *v)
{ {
static int8 _random_dir_change[4] = { -1, 0, 0, 1}; static int8 _random_dir_change[4] = { -1, 0, 0, 1};
do { do {
//I need to buffer the train direction //I need to buffer the train direction
if (!v->u.rail.track & 0x40) if (!v->u.rail.track & 0x40)
v->direction = (v->direction + _random_dir_change[Random()&3]) & 7; v->direction = (v->direction + _random_dir_change[Random()&3]) & 7;
if (!(v->vehstatus & VS_HIDDEN)) { if (!(v->vehstatus & VS_HIDDEN)) {
BeginVehicleMove(v); BeginVehicleMove(v);
@ -2251,7 +2251,7 @@ static void HandleCrashedTrain(Vehicle *v)
int state = ++v->u.rail.crash_anim_pos, index; int state = ++v->u.rail.crash_anim_pos, index;
uint32 r; uint32 r;
Vehicle *u; Vehicle *u;
if ( (state == 4) && (v->u.rail.track != 0x40) ) { if ( (state == 4) && (v->u.rail.track != 0x40) ) {
CreateEffectVehicleRel(v, 4, 4, 8, EV_CRASHED_SMOKE); CreateEffectVehicleRel(v, 4, 4, 8, EV_CRASHED_SMOKE);
} }
@ -2290,10 +2290,10 @@ static void HandleBrokenTrain(Vehicle *v)
if (v->breakdowns_since_last_service != 255) if (v->breakdowns_since_last_service != 255)
v->breakdowns_since_last_service++; v->breakdowns_since_last_service++;
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xE : 0x3A, v); SndPlayVehicleFx((_opt.landscape != LT_CANDY) ? 0xE : 0x3A, v);
if (!(v->vehstatus & VS_HIDDEN)) { if (!(v->vehstatus & VS_HIDDEN)) {
@ -2324,7 +2324,7 @@ static void TrainCheckIfLineEnds(Vehicle *v)
if ((uint)(t=v->breakdown_ctr) > 1) { if ((uint)(t=v->breakdown_ctr) > 1) {
v->vehstatus |= VS_TRAIN_SLOWING; v->vehstatus |= VS_TRAIN_SLOWING;
t = _breakdown_speeds[ ((~t) >> 4) & 0xF]; t = _breakdown_speeds[ ((~t) >> 4) & 0xF];
if ((uint16)t <= v->cur_speed) if ((uint16)t <= v->cur_speed)
v->cur_speed = t; v->cur_speed = t;
@ -2342,7 +2342,7 @@ static void TrainCheckIfLineEnds(Vehicle *v)
if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) && if (IS_TILETYPE(tile, MP_TUNNELBRIDGE) &&
(_map5[tile] & 0xF0) == 0 && (byte)((_map5[tile] & 3)*2+1) == v->direction) (_map5[tile] & 0xF0) == 0 && (byte)((_map5[tile] & 3)*2+1) == v->direction)
return; return;
// depot? // depot?
if (IS_TILETYPE(tile, MP_RAILWAY) && (_map5[tile] & 0xFC) == 0xC0) if (IS_TILETYPE(tile, MP_RAILWAY) && (_map5[tile] & 0xFC) == 0xC0)
return; return;
@ -2356,11 +2356,11 @@ static void TrainCheckIfLineEnds(Vehicle *v)
tile += _tileoffs_by_dir[t]; tile += _tileoffs_by_dir[t];
// determine the track status on the next tile. // determine the track status on the next tile.
ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[t]; ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[t];
/* Calc position within the current tile ?? */ /* Calc position within the current tile ?? */
x = v->x_pos & 0xF; x = v->x_pos & 0xF;
y = v->y_pos & 0xF; y = v->y_pos & 0xF;
switch(v->direction) { switch(v->direction) {
case 0: case 0:
x = (~x) + (~y) + 24; x = (~x) + (~y) + 24;
@ -2488,7 +2488,7 @@ void Train_Tick(Vehicle *v)
if (v->subtype == 0) { if (v->subtype == 0) {
TrainLocoHandler(v, false); TrainLocoHandler(v, false);
// make sure vehicle wasn't deleted. // make sure vehicle wasn't deleted.
if (v->type == VEH_Train && v->subtype == 0) if (v->type == VEH_Train && v->subtype == 0)
TrainLocoHandler(v, true); TrainLocoHandler(v, true);
@ -2519,7 +2519,7 @@ void TrainEnterDepot(Vehicle *v, uint tile)
if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) { if ((v->next_order&OT_MASK) == OT_GOTO_DEPOT) {
InvalidateWindow(WC_VEHICLE_VIEW, v->index); InvalidateWindow(WC_VEHICLE_VIEW, v->index);
t = v->next_order; t = v->next_order;
v->next_order = OT_DUMMY; v->next_order = OT_DUMMY;
@ -2557,7 +2557,7 @@ static void CheckIfTrainNeedsService(Vehicle *v)
if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr)) if (_patches.gotodepot && ScheduleHasDepotOrders(v->schedule_ptr))
return; return;
// Don't interfere with a depot visit scheduled by the user, or a // Don't interfere with a depot visit scheduled by the user, or a
// depot visit by the order list. // depot visit by the order list.
if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT && if ((v->next_order & OT_MASK) == OT_GOTO_DEPOT &&
@ -2607,9 +2607,9 @@ void OnNewDay_Train(Vehicle *v)
if (v->subtype == 0) { if (v->subtype == 0) {
CheckVehicleBreakdown(v); CheckVehicleBreakdown(v);
AgeVehicle(v); AgeVehicle(v);
CheckIfTrainNeedsService(v); CheckIfTrainNeedsService(v);
// check if train hasn't advanced in its order list for a set number of days // check if train hasn't advanced in its order list for a set number of days
if (_patches.lost_train_days && v->num_orders && !(v->vehstatus & VS_STOPPED) && ++v->u.rail.days_since_order_progr >= _patches.lost_train_days && v->owner == _local_player) { if (_patches.lost_train_days && v->num_orders && !(v->vehstatus & VS_STOPPED) && ++v->u.rail.days_since_order_progr >= _patches.lost_train_days && v->owner == _local_player) {
v->u.rail.days_since_order_progr = 0; v->u.rail.days_since_order_progr = 0;
@ -2622,7 +2622,7 @@ void OnNewDay_Train(Vehicle *v)
} }
CheckOrders(v); CheckOrders(v);
/* update destination */ /* update destination */
if ((v->next_order & OT_MASK) == OT_GOTO_STATION && if ((v->next_order & OT_MASK) == OT_GOTO_STATION &&
(tile=DEREF_STATION(v->next_order_param)->train_tile) != 0) (tile=DEREF_STATION(v->next_order_param)->train_tile) != 0)
@ -2649,7 +2649,7 @@ void TrainsYearlyLoop()
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Train && v->subtype == 0) { if (v->type == VEH_Train && v->subtype == 0) {
// show warning if train is not generating enough income last 2 years (corresponds to a red icon in the vehicle list) // show warning if train is not generating enough income last 2 years (corresponds to a red icon in the vehicle list)
if (_patches.train_income_warn && v->owner == _local_player && v->age >= 730 && v->profit_this_year < 0) { if (_patches.train_income_warn && v->owner == _local_player && v->age >= 730 && v->profit_this_year < 0) {
SET_DPARAM32(1, v->profit_this_year); SET_DPARAM32(1, v->profit_this_year);

View File

@ -63,7 +63,7 @@ static void CcBuildLoco(bool success, uint tile, uint32 p1, uint32 p2)
if (!success) if (!success)
return; return;
v = &_vehicles[_new_train_id]; v = &_vehicles[_new_train_id];
if (tile == _backup_orders_tile) { if (tile == _backup_orders_tile) {
_backup_orders_tile = 0; _backup_orders_tile = 0;
@ -76,7 +76,7 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_PAINT: case WE_PAINT:
if (w->window_number == 0) if (w->window_number == 0)
SETBIT(w->disabled_state, 5); SETBIT(w->disabled_state, 5);
@ -93,7 +93,7 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(0, WP(w,buildtrain_d).railtype + STR_881C_NEW_RAIL_VEHICLES); SET_DPARAM16(0, WP(w,buildtrain_d).railtype + STR_881C_NEW_RAIL_VEHICLES);
DrawWindowWidgets(w); DrawWindowWidgets(w);
{ {
int num = _rail_engines_count[WP(w,buildtrain_d).railtype]; int num = _rail_engines_count[WP(w,buildtrain_d).railtype];
Engine *e = _rail_engines[WP(w,buildtrain_d).railtype]; Engine *e = _rail_engines[WP(w,buildtrain_d).railtype];
@ -112,7 +112,7 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e)
DrawTrainEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player))); DrawTrainEngine(x+29, y+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)));
y += 14; y += 14;
} }
sel--; sel--;
} }
} while (++engine_id, ++e,--num); } while (++engine_id, ++e,--num);
@ -132,15 +132,15 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(3, rvi->power << multihead); SET_DPARAM16(3, rvi->power << multihead);
SET_DPARAM16(1, rvi->weight << multihead); SET_DPARAM16(1, rvi->weight << multihead);
SET_DPARAM32(4, (rvi->running_cost_base * _price.running_rail[rvi->engclass] >> 8) << multihead); SET_DPARAM32(4, (rvi->running_cost_base * _price.running_rail[rvi->engclass] >> 8) << multihead);
SET_DPARAM16(5, STR_8838_N_A); SET_DPARAM16(5, STR_8838_N_A);
if (rvi->capacity != 0) { if (rvi->capacity != 0) {
SET_DPARAM16(6, rvi->capacity << multihead); SET_DPARAM16(6, rvi->capacity << multihead);
SET_DPARAM16(5, _cargoc.names_long_p[rvi->cargo_type]); SET_DPARAM16(5, _cargoc.names_long_p[rvi->cargo_type]);
} }
e = &_engines[selected_id]; e = &_engines[selected_id];
SET_DPARAM16(8, e->lifelength); SET_DPARAM16(8, e->lifelength);
SET_DPARAM8(9, e->reliability * 100 >> 16); SET_DPARAM8(9, e->reliability * 100 >> 16);
ConvertDayToYMD(&ymd, e->intro_date); ConvertDayToYMD(&ymd, e->intro_date);
@ -207,7 +207,7 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e)
} break; } break;
} }
} }
static const Widget _new_rail_vehicle_widgets[] = { static const Widget _new_rail_vehicle_widgets[] = {
{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, { WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
{ WWT_CAPTION, 14, 11, 227, 0, 13, STR_0315, STR_018C_WINDOW_TITLE_DRAG_THIS}, { WWT_CAPTION, 14, 11, 227, 0, 13, STR_0315, STR_018C_WINDOW_TITLE_DRAG_THIS},
@ -236,7 +236,7 @@ static void ShowBuildTrainWindow(uint tile)
w = AllocateWindowDesc(&_new_rail_vehicle_desc); w = AllocateWindowDesc(&_new_rail_vehicle_desc);
w->window_number = tile; w->window_number = tile;
w->vscroll.cap = 8; w->vscroll.cap = 8;
if (tile != 0) { if (tile != 0) {
w->caption_color = _map_owner[tile]; w->caption_color = _map_owner[tile];
WP(w,buildtrain_d).railtype = _map3_lo[tile] & 0xF; WP(w,buildtrain_d).railtype = _map3_lo[tile] & 0xF;
@ -296,7 +296,7 @@ static void DrawTrainDepotWindow(Window *w)
} }
SetVScrollCount(w, num); SetVScrollCount(w, num);
SetHScrollCount(w, hnum); SetHScrollCount(w, hnum);
/* locate the depot struct */ /* locate the depot struct */
for(d=_depots; d->xy != (TileIndex)tile; d++) {} for(d=_depots; d->xy != (TileIndex)tile; d++) {}
@ -312,7 +312,7 @@ static void DrawTrainDepotWindow(Window *w)
if (v->type == VEH_Train && if (v->type == VEH_Train &&
v->subtype == 0 && v->subtype == 0 &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
v->u.rail.track == 0x80 && v->u.rail.track == 0x80 &&
--num < 0 && num >= -6) { --num < 0 && num >= -6) {
DrawTrainImage(v, x+21, y, 10, w->hscroll.pos, WP(w,traindepot_d).sel); DrawTrainImage(v, x+21, y, 10, w->hscroll.pos, WP(w,traindepot_d).sel);
@ -331,7 +331,7 @@ static void DrawTrainDepotWindow(Window *w)
if (v->type == VEH_Train && if (v->type == VEH_Train &&
v->subtype == 4 && v->subtype == 4 &&
v->tile == (TileIndex)tile && v->tile == (TileIndex)tile &&
v->u.rail.track == 0x80 && v->u.rail.track == 0x80 &&
--num < 0 && num >= -6) { --num < 0 && num >= -6) {
DrawTrainImage(v, x+50, y, 9, 0, WP(w,traindepot_d).sel); DrawTrainImage(v, x+50, y, 9, 0, WP(w,traindepot_d).sel);
@ -395,20 +395,20 @@ static int GetVehicleFromTrainDepotWndPt(Window *w, int x, int y, GetDepotVehicl
/* didn't find anything, get out */ /* didn't find anything, get out */
return 0; return 0;
found_it: found_it:
d->head = d->wagon = v; d->head = d->wagon = v;
/* either pressed the flag or the number, but only when it's a loco */ /* either pressed the flag or the number, but only when it's a loco */
if (area_x < 0 && v->subtype==0) if (area_x < 0 && v->subtype==0)
return area_x; return area_x;
/* find the vehicle in this row that was clicked */ /* find the vehicle in this row that was clicked */
while (--area_x >= 0) { while (--area_x >= 0) {
v = v->next; v = v->next;
if (v == NULL) break; if (v == NULL) break;
} }
d->wagon = v; d->wagon = v;
return 0; return 0;
} }
@ -447,7 +447,7 @@ static void TrainDepotClickTrain(Window *w, int x, int y)
// share / copy orders // share / copy orders
if (_thd.place_mode && mode <= 0) { _place_clicked_vehicle = gdvp.head; return; } if (_thd.place_mode && mode <= 0) { _place_clicked_vehicle = gdvp.head; return; }
v = gdvp.wagon; v = gdvp.wagon;
switch(mode) { switch(mode) {
@ -482,10 +482,10 @@ static void TrainDepotWndProc(Window *w, WindowEvent *e)
case WE_CLICK: { case WE_CLICK: {
switch(e->click.widget) { switch(e->click.widget) {
case 6: case 6:
ShowBuildTrainWindow(w->window_number); ShowBuildTrainWindow(w->window_number);
break; break;
case 7: case 7:
ScrollMainWindowToTile(w->window_number); ScrollMainWindowToTile(w->window_number);
break; break;
case 2: case 2:
@ -513,7 +513,7 @@ static void TrainDepotWndProc(Window *w, WindowEvent *e)
return; return;
v = &_vehicles[WP(w,traindepot_d).sel]; v = &_vehicles[WP(w,traindepot_d).sel];
WP(w,traindepot_d).sel = INVALID_VEHICLE; WP(w,traindepot_d).sel = INVALID_VEHICLE;
SetWindowDirty(w); SetWindowDirty(w);
@ -538,14 +538,14 @@ static void TrainDepotWndProc(Window *w, WindowEvent *e)
WP(w,traindepot_d).sel = INVALID_VEHICLE; WP(w,traindepot_d).sel = INVALID_VEHICLE;
SetWindowDirty(w); SetWindowDirty(w);
if (GetVehicleFromTrainDepotWndPt(w, e->dragdrop.pt.x, e->dragdrop.pt.y, &gdvp) == 0 && if (GetVehicleFromTrainDepotWndPt(w, e->dragdrop.pt.x, e->dragdrop.pt.y, &gdvp) == 0 &&
sel != INVALID_VEHICLE) { sel != INVALID_VEHICLE) {
if (gdvp.wagon == NULL || gdvp.wagon->index != sel) { if (gdvp.wagon == NULL || gdvp.wagon->index != sel) {
TrainDepotMoveVehicle(gdvp.wagon, sel, gdvp.head); TrainDepotMoveVehicle(gdvp.wagon, sel, gdvp.head);
} else if (gdvp.head != NULL && gdvp.head->subtype==0) { } else if (gdvp.head != NULL && gdvp.head->subtype==0) {
ShowTrainViewWindow(gdvp.head); ShowTrainViewWindow(gdvp.head);
} }
} }
} break; } break;
default: default:
@ -722,11 +722,11 @@ static void TrainViewWndProc(Window *w, WindowEvent *e)
Vehicle *v; Vehicle *v;
StringID str; StringID str;
v = &_vehicles[w->window_number]; v = &_vehicles[w->window_number];
w->disabled_state = (v->owner == _local_player) ? 0 : 0x1C0; w->disabled_state = (v->owner == _local_player) ? 0 : 0x1C0;
/* draw widgets & caption */ /* draw widgets & caption */
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
SET_DPARAM16(1, v->unitnumber); SET_DPARAM16(1, v->unitnumber);
@ -734,7 +734,7 @@ static void TrainViewWndProc(Window *w, WindowEvent *e)
/* draw the flag */ /* draw the flag */
DrawSprite( (v->vehstatus&VS_STOPPED) ? 0xC12 : 0xC13, 2, 123); DrawSprite( (v->vehstatus&VS_STOPPED) ? 0xC12 : 0xC13, 2, 123);
if (v->u.rail.crash_anim_pos != 0) { if (v->u.rail.crash_anim_pos != 0) {
str = STR_8863_CRASHED; str = STR_8863_CRASHED;
} else if (v->breakdown_ctr == 1) { } else if (v->breakdown_ctr == 1) {
@ -772,7 +772,7 @@ static void TrainViewWndProc(Window *w, WindowEvent *e)
SET_DPARAM16(1, v->u.rail.last_speed * 10 >> 4); SET_DPARAM16(1, v->u.rail.last_speed * 10 >> 4);
break; break;
} }
default: default:
if (v->num_orders == 0) { if (v->num_orders == 0) {
str = STR_NO_ORDERS + _patches.vehicle_speed; str = STR_NO_ORDERS + _patches.vehicle_speed;
@ -792,20 +792,20 @@ static void TrainViewWndProc(Window *w, WindowEvent *e)
Vehicle *v = &_vehicles[w->window_number]; Vehicle *v = &_vehicles[w->window_number];
switch(wid) { switch(wid) {
case 4: /* start/stop train */ case 4: /* start/stop train */
DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_TRAIN | CMD_MSG(STR_883B_CAN_T_STOP_START_TRAIN)); DoCommandP(v->tile, v->index, 0, NULL, CMD_START_STOP_TRAIN | CMD_MSG(STR_883B_CAN_T_STOP_START_TRAIN));
break; break;
case 5: /* center main view */ case 5: /* center main view */
ScrollMainWindowTo(v->x_pos, v->y_pos); ScrollMainWindowTo(v->x_pos, v->y_pos);
break; break;
case 6: /* goto depot */ case 6: /* goto depot */
DoCommandP(v->tile, v->index, 0, NULL, CMD_TRAIN_GOTO_DEPOT | CMD_MSG(STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT)); DoCommandP(v->tile, v->index, 0, NULL, CMD_TRAIN_GOTO_DEPOT | CMD_MSG(STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT));
break; break;
case 7: /* force proceed */ case 7: /* force proceed */
DoCommandP(v->tile, v->index, 0, NULL, CMD_FORCE_TRAIN_PROCEED | CMD_MSG(STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL)); DoCommandP(v->tile, v->index, 0, NULL, CMD_FORCE_TRAIN_PROCEED | CMD_MSG(STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL));
break; break;
case 8: /* reverse direction */ case 8: /* reverse direction */
DoCommandP(v->tile, v->index, 0, NULL, CMD_REVERSE_TRAIN_DIRECTION | CMD_MSG(STR_8869_CAN_T_REVERSE_DIRECTION)); DoCommandP(v->tile, v->index, 0, NULL, CMD_REVERSE_TRAIN_DIRECTION | CMD_MSG(STR_8869_CAN_T_REVERSE_DIRECTION));
break; break;
case 9: /* show train orders */ case 9: /* show train orders */
ShowOrdersWindow(v); ShowOrdersWindow(v);
@ -828,7 +828,7 @@ static void TrainViewWndProc(Window *w, WindowEvent *e)
Vehicle *v; Vehicle *v;
uint32 h; uint32 h;
v = &_vehicles[w->window_number]; v = &_vehicles[w->window_number];
assert(v->type == VEH_Train); assert(v->type == VEH_Train);
h = CheckStoppedInDepot(v) >= 0 ? (1 << 8) : (1 << 11); h = CheckStoppedInDepot(v) >= 0 ? (1 << 8) : (1 << 11);
if (h != w->hidden_state) { if (h != w->hidden_state) {
@ -893,7 +893,7 @@ static void TrainDetailsInfoTab(Vehicle *v, int x, int y)
SET_DPARAM16(0, GetCustomEngineName(v->engine_type)); SET_DPARAM16(0, GetCustomEngineName(v->engine_type));
SET_DPARAM32(1, v->value); SET_DPARAM32(1, v->value);
DrawString(x, y, STR_882D_VALUE, 0x10); DrawString(x, y, STR_882D_VALUE, 0x10);
} }
} }
static void TrainDetailsCapacityTab(Vehicle *v, int x, int y) static void TrainDetailsCapacityTab(Vehicle *v, int x, int y)
@ -927,7 +927,7 @@ static void DrawTrainDetailsWindow(Window *w)
// det_tab == 3 <-- Total Cargo tab // det_tab == 3 <-- Total Cargo tab
if (det_tab == 3) // reset tot_cargo array to 0 values if (det_tab == 3) // reset tot_cargo array to 0 values
memset(tot_cargo, 0, sizeof(tot_cargo)); memset(tot_cargo, 0, sizeof(tot_cargo));
u = v = &_vehicles[w->window_number]; u = v = &_vehicles[w->window_number];
do { do {
if (det_tab != 3) if (det_tab != 3)
@ -964,9 +964,9 @@ static void DrawTrainDetailsWindow(Window *w)
num = v->age / 366; num = v->age / 366;
SET_DPARAM16(1, num); SET_DPARAM16(1, num);
x = 2; x = 2;
str = STR_0199_YEAR; str = STR_0199_YEAR;
if (num != 1) { if (num != 1) {
str += STR_019A_YEARS - STR_0199_YEAR; str += STR_019A_YEARS - STR_0199_YEAR;
@ -975,7 +975,7 @@ static void DrawTrainDetailsWindow(Window *w)
} }
SET_DPARAM16(0, str); SET_DPARAM16(0, str);
SET_DPARAM16(2, v->max_age / 366); SET_DPARAM16(2, v->max_age / 366);
SET_DPARAM32(3, GetTrainRunningCost(v) >> 8); SET_DPARAM32(3, GetTrainRunningCost(v) >> 8);
DrawString(x, 15, STR_885D_AGE_RUNNING_COST_YR, 0); DrawString(x, 15, STR_885D_AGE_RUNNING_COST_YR, 0);
SET_DPARAM16(2, v->max_speed * 10 >> 4); SET_DPARAM16(2, v->max_speed * 10 >> 4);
@ -998,7 +998,7 @@ static void DrawTrainDetailsWindow(Window *w)
x = 1; x = 1;
y = 57; y = 57;
sel = w->vscroll.pos; sel = w->vscroll.pos;
// draw the first 3 details tabs // draw the first 3 details tabs
if (det_tab != 3) { if (det_tab != 3) {
for(;;) { for(;;) {
@ -1058,7 +1058,7 @@ do_change_service_int:
mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1); mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1);
if (mod == v->service_interval) if (mod == v->service_interval)
return; return;
DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_TRAIN_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING)); DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_TRAIN_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING));
break; break;
/* details buttons*/ /* details buttons*/
@ -1127,7 +1127,7 @@ void ShowTrainDetailsWindow(Vehicle *v)
DeleteWindowById(WC_VEHICLE_ORDERS, veh); DeleteWindowById(WC_VEHICLE_ORDERS, veh);
DeleteWindowById(WC_VEHICLE_DETAILS, veh); DeleteWindowById(WC_VEHICLE_DETAILS, veh);
_alloc_wnd_parent_num = veh; _alloc_wnd_parent_num = veh;
w = AllocateWindowDesc(&_train_details_desc); w = AllocateWindowDesc(&_train_details_desc);
w->window_number = veh; w->window_number = veh;
@ -1163,7 +1163,7 @@ static void MakeSortedTrainList(byte owner)
// trains are stored as a cummulative index, eg 25, 41, 43. This means // trains are stored as a cummulative index, eg 25, 41, 43. This means
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
for (i = &_num_train_sort[1]; i != endof(_num_train_sort); i++) {*i += *(i-1);} for (i = &_num_train_sort[1]; i != endof(_num_train_sort); i++) {*i += *(i-1);}
// sort by owner, then only subsort the requested owner-vehicles // sort by owner, then only subsort the requested owner-vehicles
qsort(_train_sort, n, sizeof(_train_sort[0]), GeneralOwnerSorter); qsort(_train_sort, n, sizeof(_train_sort[0]), GeneralOwnerSorter);
@ -1208,7 +1208,7 @@ static void PlayerTrainsWndProc(Window *w, WindowEvent *e)
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 trains // Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 trains
i = (window_number == 0) ? 0 : _num_train_sort[window_number-1]; i = (window_number == 0) ? 0 : _num_train_sort[window_number-1];
SetVScrollCount(w, _num_train_sort[window_number] - i); SetVScrollCount(w, _num_train_sort[window_number] - i);
/* draw the widgets */ /* draw the widgets */
{ {
Player *p = DEREF_PLAYER(window_number); Player *p = DEREF_PLAYER(window_number);
@ -1251,7 +1251,7 @@ static void PlayerTrainsWndProc(Window *w, WindowEvent *e)
SET_DPARAM32(0, v->profit_this_year); SET_DPARAM32(0, v->profit_this_year);
SET_DPARAM32(1, v->profit_last_year); SET_DPARAM32(1, v->profit_last_year);
DrawString(x + 21, y + 18, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0); DrawString(x + 21, y + 18, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
if (v->string_id != STR_SV_TRAIN_NAME) { if (v->string_id != STR_SV_TRAIN_NAME) {
SET_DPARAM16(0, v->string_id); SET_DPARAM16(0, v->string_id);
DrawString(x+21, y, STR_01AB, 0); DrawString(x+21, y, STR_01AB, 0);
@ -1276,7 +1276,7 @@ static void PlayerTrainsWndProc(Window *w, WindowEvent *e)
return; return;
case 6: { /* Matrix to show vehicles */ case 6: { /* Matrix to show vehicles */
uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_SMALL; uint32 id_v = (e->click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / PLY_WND_PRC__SIZE_OF_ROW_SMALL;
if (id_v >= w->vscroll.cap) { return;} // click out of bounds if (id_v >= w->vscroll.cap) { return;} // click out of bounds
id_v += w->vscroll.pos; id_v += w->vscroll.pos;
@ -1301,15 +1301,15 @@ static void PlayerTrainsWndProc(Window *w, WindowEvent *e)
tile = _last_built_train_depot_tile; tile = _last_built_train_depot_tile;
do { do {
if (_map_owner[tile] == _local_player && IsTrainDepotTile(tile)) { if (_map_owner[tile] == _local_player && IsTrainDepotTile(tile)) {
ShowTrainDepotWindow(tile); ShowTrainDepotWindow(tile);
ShowBuildTrainWindow(tile); ShowBuildTrainWindow(tile);
return; return;
} }
tile = TILE_MASK(tile + 1); tile = TILE_MASK(tile + 1);
} while(tile != _last_built_train_depot_tile); } while(tile != _last_built_train_depot_tile);
ShowBuildTrainWindow(0); ShowBuildTrainWindow(0);
} break; } break;
} }

View File

@ -18,7 +18,7 @@ static int GetRandomTreeType(uint tile, uint seed)
return (seed >> 6) + 28; return (seed >> 6) + 28;
} else if (i == 1) { } else if (i == 1) {
if (seed > 12) if (seed > 12)
return -1; return -1;
return 27; return 27;
} else { } else {
return (seed * 7 >> 8) + 20; return (seed * 7 >> 8) + 20;
@ -144,7 +144,7 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
int32 cost; int32 cost;
int sx,sy,x,y; int sx,sy,x,y;
int treetype; int treetype;
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
// make sure sx,sy are smaller than ex,ey // make sure sx,sy are smaller than ex,ey
@ -152,7 +152,7 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
sy = GET_TILE_Y(p2)*16; sy = GET_TILE_Y(p2)*16;
if (ex < sx) intswap(ex, sx); if (ex < sx) intswap(ex, sx);
if (ey < sy) intswap(ey, sy); if (ey < sy) intswap(ey, sy);
cost = 0; // total cost cost = 0; // total cost
for(x=sx; x<=ex; x+=16) { for(x=sx; x<=ex; x+=16) {
@ -174,7 +174,7 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
} }
// 2x as expensive to add more trees to an existing tile // 2x as expensive to add more trees to an existing tile
cost += _price.build_trees * 2; cost += _price.build_trees * 2;
} else { } else {
// don't allow building on rocks // don't allow building on rocks
if (ti.type != MP_CLEAR || _map_owner[ti.tile] != OWNER_NONE || (ti.map5 & 0x1C) == 8) { if (ti.type != MP_CLEAR || _map_owner[ti.tile] != OWNER_NONE || (ti.map5 & 0x1C) == 8) {
_error_message = STR_2804_SITE_UNSUITABLE; _error_message = STR_2804_SITE_UNSUITABLE;
@ -204,9 +204,9 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
treetype = GetRandomTreeType(ti.tile, Random()>>24); treetype = GetRandomTreeType(ti.tile, Random()>>24);
if (treetype==-1) treetype=27; if (treetype==-1) treetype=27;
} }
ModifyTile(ti.tile, ModifyTile(ti.tile,
MP_SETTYPE(MP_TREES) | MP_SETTYPE(MP_TREES) |
MP_MAP2 | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5, MP_MAP2 | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5,
m2, /* map2 */ m2, /* map2 */
treetype, /* map3lo */ treetype, /* map3lo */
@ -221,7 +221,7 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
} }
} }
} }
if (cost == 0) return CMD_ERROR; if (cost == 0) return CMD_ERROR;
return cost; return cost;
} }
@ -276,12 +276,12 @@ static void DrawTile_Trees(TileInfo *ti)
d = _tree_layout_xy[(tmp & 0x30) >> 4]; d = _tree_layout_xy[(tmp & 0x30) >> 4];
index = ((tmp>>6)&3) + (_map3_lo[ti->tile]<<2); index = ((tmp>>6)&3) + (_map3_lo[ti->tile]<<2);
/* different tree styles above one of the grounds */ /* different tree styles above one of the grounds */
if ((m2 & 0xB0) == 0xA0 && index >= 48 && index < 80) if ((m2 & 0xB0) == 0xA0 && index >= 48 && index < 80)
index += 164 - 48; index += 164 - 48;
assert(index < lengthof(_tree_layout_sprite)); assert(index < lengthof(_tree_layout_sprite));
s = _tree_layout_sprite[index]; s = _tree_layout_sprite[index];
} }
@ -342,7 +342,7 @@ static int32 ClearTile_Trees(uint tile, byte flags) {
if (flags & DC_EXEC && _current_player < MAX_PLAYERS) { if (flags & DC_EXEC && _current_player < MAX_PLAYERS) {
Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority); Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
if (t != NULL) if (t != NULL)
ChangeTownRating(t, -35, -1000); ChangeTownRating(t, -35, -1000);
} }
@ -372,7 +372,7 @@ static void GetTileDesc_Trees(uint tile, TileDesc *td)
(str=STR_2810_CACTUS_PLANTS, b==0x1B) || (str=STR_2810_CACTUS_PLANTS, b==0x1B) ||
(str=STR_280F_RAINFOREST, IS_BYTE_INSIDE(b, 0x14, 0x1A+1)) || (str=STR_280F_RAINFOREST, IS_BYTE_INSIDE(b, 0x14, 0x1A+1)) ||
(str=STR_280E_TREES, true); (str=STR_280E_TREES, true);
td->str = str; td->str = str;
} }
static void AnimateTile_Trees(uint tile) static void AnimateTile_Trees(uint tile)
@ -420,7 +420,7 @@ static void TileLoopTreesAlps(uint tile)
m2 = 0; m2 = 0;
} else if (k == -8) { } else if (k == -8) {
/* snow_m1 */ /* snow_m1 */
m2 = 0x20; m2 = 0x20;
if (tmp == m2) if (tmp == m2)
return; return;
} else if (k < 8) { } else if (k < 8) {
@ -492,7 +492,7 @@ static void TileLoop_Trees(uint tile)
case 0: /* start destructing */ case 0: /* start destructing */
m5++; m5++;
break; break;
case 1: /* add a tree */ case 1: /* add a tree */
if (m5 < 0xC0) { if (m5 < 0xC0) {
m5 = (m5 + 0x40) & ~7; m5 = (m5 + 0x40) & ~7;
@ -502,7 +502,7 @@ static void TileLoop_Trees(uint tile)
case 2: { /* add a neighbouring tree */ case 2: { /* add a neighbouring tree */
byte m3 = _map3_lo[tile]; byte m3 = _map3_lo[tile];
tile += _tileloop_trees_dir[Random() & 7]; tile += _tileloop_trees_dir[Random() & 7];
if (!IS_TILETYPE(tile, MP_CLEAR)) if (!IS_TILETYPE(tile, MP_CLEAR))
@ -525,7 +525,7 @@ static void TileLoop_Trees(uint tile)
m5 = 0; m5 = 0;
break; break;
} }
default: default:
return; return;
@ -566,14 +566,14 @@ void OnTick_Trees()
int tree; int tree;
/* place a tree at a random rainforest spot */ /* place a tree at a random rainforest spot */
if (_opt.landscape == LT_DESERT && if (_opt.landscape == LT_DESERT &&
(r=Random(),tile=TILE_MASK(r),GetMapExtraBits(tile)==2) && (r=Random(),tile=TILE_MASK(r),GetMapExtraBits(tile)==2) &&
IS_TILETYPE(tile, MP_CLEAR) && IS_TILETYPE(tile, MP_CLEAR) &&
(m=_map5[tile]&0x1C, m<=4) && (m=_map5[tile]&0x1C, m<=4) &&
(tree=GetRandomTreeType(tile, r>>24)) >= 0) { (tree=GetRandomTreeType(tile, r>>24)) >= 0) {
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_TREES) | MP_SETTYPE(MP_TREES) |
MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5, MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5,
(m == 4 ? 0x10 : 0), (m == 4 ? 0x10 : 0),
tree, tree,
@ -585,7 +585,7 @@ void OnTick_Trees()
// byte underflow // byte underflow
if (--_trees_tick_ctr) if (--_trees_tick_ctr)
return; return;
/* place a tree at a random spot */ /* place a tree at a random spot */
r = Random(); r = Random();
tile = TILE_MASK(r); tile = TILE_MASK(r);
@ -593,7 +593,7 @@ void OnTick_Trees()
(m=_map5[tile]&0x1C, m==0 || m==4 || m==0x10) && (m=_map5[tile]&0x1C, m==0 || m==4 || m==0x10) &&
(tree=GetRandomTreeType(tile, r>>24)) >= 0) { (tree=GetRandomTreeType(tile, r>>24)) >= 0) {
int m2; int m2;
if (m == 0) { if (m == 0) {
m2 = 0; m2 = 0;
} else if (m == 4) { } else if (m == 4) {
@ -603,7 +603,7 @@ void OnTick_Trees()
} }
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_TREES) | MP_SETTYPE(MP_TREES) |
MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5, MP_MAP2 | MP_MAP3LO | MP_MAP3HI | MP_MAP5,
m2, m2,
tree, tree,

68
ttd.c
View File

@ -59,7 +59,7 @@ void CDECL error(const char *s, ...) {
va_start(va, s); va_start(va, s);
vsprintf(buf, s, va); vsprintf(buf, s, va);
va_end(va); va_end(va);
ShowOSErrorBox(buf); ShowOSErrorBox(buf);
if (_video_driver) if (_video_driver)
_video_driver->stop(); _video_driver->stop();
@ -145,7 +145,7 @@ static int NullVideoMainLoop() {
static bool NullVideoChangeRes(int w, int h) { return false; } static bool NullVideoChangeRes(int w, int h) { return false; }
const HalVideoDriver _null_video_driver = { const HalVideoDriver _null_video_driver = {
NullVideoStart, NullVideoStart,
NullVideoStop, NullVideoStop,
@ -298,7 +298,7 @@ static void showhelp()
const DriverDesc *dd; const DriverDesc *dd;
int i; int i;
p = strecpy(buf, p = strecpy(buf,
"Command line options:\n" "Command line options:\n"
" -v drv = Set video driver (see below)\n" " -v drv = Set video driver (see below)\n"
" -s drv = Set sound driver (see below)\n" " -s drv = Set sound driver (see below)\n"
@ -313,7 +313,7 @@ static void showhelp()
" -G seed= Set random seed\n" " -G seed= Set random seed\n"
); );
for(i=0; i!=lengthof(_driver_classes); i++,dc++) { for(i=0; i!=lengthof(_driver_classes); i++,dc++) {
p += sprintf(p, "List of %s drivers:\n", dc->name); p += sprintf(p, "List of %s drivers:\n", dc->name);
dd = dc->descs; dd = dc->descs;
do { do {
@ -427,7 +427,7 @@ void SetDebugString(const char *s)
if (*s >= '0' && *s <= '9') { if (*s >= '0' && *s <= '9') {
v = strtoul(s, &end, 0); v = strtoul(s, &end, 0);
s = end; s = end;
_debug_spritecache_level = v; _debug_spritecache_level = v;
_debug_misc_level = v; _debug_misc_level = v;
_debug_grf_level = v; _debug_grf_level = v;
@ -460,7 +460,7 @@ void SetDebugString(const char *s)
v = strtoul(s, &end, 0); v = strtoul(s, &end, 0);
s = end; s = end;
if (p) *p = v; if (p) *p = v;
} }
} }
void ParseResolution(int res[2], char *s) void ParseResolution(int res[2], char *s)
@ -473,7 +473,7 @@ void ParseResolution(int res[2], char *s)
res[0] = (strtoul(s, NULL, 0) + 7) & ~7; res[0] = (strtoul(s, NULL, 0) + 7) & ~7;
res[1] = (strtoul(t+1, NULL, 0) + 7) & ~7; res[1] = (strtoul(t+1, NULL, 0) + 7) & ~7;
} }
int ttd_main(int argc, char* argv[]) int ttd_main(int argc, char* argv[])
{ {
@ -500,10 +500,10 @@ int ttd_main(int argc, char* argv[])
case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break; case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break;
case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break; case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break;
case 'n': { case 'n': {
network = 1; network = 1;
_networking_override=true; _networking_override=true;
if (mgo.opt) { if (mgo.opt) {
network_conn = mgo.opt; network_conn = mgo.opt;
network++; network++;
} }
else else
@ -525,7 +525,7 @@ int ttd_main(int argc, char* argv[])
} break; } break;
case 'e': _switch_mode = SM_EDITOR; break; case 'e': _switch_mode = SM_EDITOR; break;
case 'i': _ignore_wrong_grf = true; break; case 'i': _ignore_wrong_grf = true; break;
case 'g': case 'g':
if (mgo.opt) { if (mgo.opt) {
strcpy(_file_to_saveload.name, mgo.opt); strcpy(_file_to_saveload.name, mgo.opt);
_switch_mode = SM_LOAD; _switch_mode = SM_LOAD;
@ -568,10 +568,10 @@ int ttd_main(int argc, char* argv[])
// initialize airport state machines // initialize airport state machines
InitializeAirports(); InitializeAirports();
// Sample catalogue // Sample catalogue
DEBUG(misc, 1) ("Loading sound effects..."); DEBUG(misc, 1) ("Loading sound effects...");
MxInitialize(11025, "sample.cat"); MxInitialize(11025, "sample.cat");
// This must be done early, since functions use the InvalidateWindow* calls // This must be done early, since functions use the InvalidateWindow* calls
InitWindowSystem(); InitWindowSystem();
@ -588,7 +588,7 @@ int ttd_main(int argc, char* argv[])
// Default difficulty level // Default difficulty level
_opt_mod_ptr = &_new_opt; _opt_mod_ptr = &_new_opt;
// ugly hack, if diff_level is 9, it means we got no setting from the config file, so we load the default settings. // ugly hack, if diff_level is 9, it means we got no setting from the config file, so we load the default settings.
if (_opt_mod_ptr->diff_level == 9) if (_opt_mod_ptr->diff_level == 9)
SetDifficultyLevel(0, _opt_mod_ptr); SetDifficultyLevel(0, _opt_mod_ptr);
@ -646,7 +646,7 @@ void LoadIntroGame()
_opt_mod_ptr = &_new_opt; _opt_mod_ptr = &_new_opt;
GfxLoadSprites(); GfxLoadSprites();
LoadStringWidthTable(); LoadStringWidthTable();
// Setup main window // Setup main window
InitWindowSystem(); InitWindowSystem();
SetupColorsAndInitialWindow(); SetupColorsAndInitialWindow();
@ -655,7 +655,7 @@ void LoadIntroGame()
sprintf(filename, "%sopntitle.dat", _path.data_dir); sprintf(filename, "%sopntitle.dat", _path.data_dir);
if (SaveOrLoad(filename, SL_LOAD) != SL_OK) if (SaveOrLoad(filename, SL_LOAD) != SL_OK)
GenerateWorld(1); // if failed loading, make empty world. GenerateWorld(1); // if failed loading, make empty world.
_opt.currency = _new_opt.currency; _opt.currency = _new_opt.currency;
_pause = 0; _pause = 0;
@ -687,7 +687,7 @@ void MakeNewGame()
// Create a single player // Create a single player
DoStartupNewPlayer(false); DoStartupNewPlayer(false);
_local_player = 0; _local_player = 0;
MarkWholeScreenDirty(); MarkWholeScreenDirty();
@ -700,7 +700,7 @@ void MakeNewEditorWorld()
// Copy in game options // Copy in game options
_opt_mod_ptr = &_opt; _opt_mod_ptr = &_opt;
memcpy(&_opt, &_new_opt, sizeof(_opt)); memcpy(&_opt, &_new_opt, sizeof(_opt));
GfxLoadSprites(); GfxLoadSprites();
// Re-init the windowing system // Re-init the windowing system
@ -758,7 +758,7 @@ void StartScenario()
// and in AfterLoad a player is started when it is // and in AfterLoad a player is started when it is
// a scenario.. so we do not need it here. // a scenario.. so we do not need it here.
// DoStartupNewPlayer(false); // DoStartupNewPlayer(false);
_local_player = 0; _local_player = 0;
MarkWholeScreenDirty(); MarkWholeScreenDirty();
@ -781,7 +781,7 @@ bool SafeSaveOrLoad(const char *filename, int mode, int newgm)
return false; return false;
} else if (r != SL_OK) { } else if (r != SL_OK) {
_game_mode = ogm; _game_mode = ogm;
return false; return false;
} else } else
return true; return true;
} }
@ -789,7 +789,7 @@ bool SafeSaveOrLoad(const char *filename, int mode, int newgm)
static void SwitchMode(int new_mode) static void SwitchMode(int new_mode)
{ {
_in_state_game_loop = true; _in_state_game_loop = true;
switch(new_mode) { switch(new_mode) {
case SM_EDITOR: // Switch to scenario editor case SM_EDITOR: // Switch to scenario editor
MakeNewEditorWorld(); MakeNewEditorWorld();
@ -842,7 +842,7 @@ normal_load:
case SM_MENU: // Switch to game menu case SM_MENU: // Switch to game menu
if ((_networking) && (!_networking_override)) NetworkCoreDisconnect(); if ((_networking) && (!_networking_override)) NetworkCoreDisconnect();
_networking_override=false; _networking_override=false;
@ -863,8 +863,8 @@ normal_load:
MarkWholeScreenDirty(); MarkWholeScreenDirty();
break; break;
} }
if (_switch_mode_errorstr!=INVALID_STRING_ID) if (_switch_mode_errorstr!=INVALID_STRING_ID)
ShowErrorMessage(INVALID_STRING_ID,_switch_mode_errorstr,0,0); ShowErrorMessage(INVALID_STRING_ID,_switch_mode_errorstr,0,0);
_in_state_game_loop = false; _in_state_game_loop = false;
@ -885,10 +885,10 @@ void StateGameLoop()
_sync_seed_2 = _random_seed_2; _sync_seed_2 = _random_seed_2;
if (_networking) disable_computer=true; if (_networking) disable_computer=true;
if (_savedump_path[0] && (uint)_frame_counter >= _savedump_first && (uint)(_frame_counter -_savedump_first) % _savedump_freq == 0 ) { if (_savedump_path[0] && (uint)_frame_counter >= _savedump_first && (uint)(_frame_counter -_savedump_first) % _savedump_freq == 0 ) {
char buf[100]; char buf[100];
sprintf(buf, "%s%.5d.sav", _savedump_path, _frame_counter); sprintf(buf, "%s%.5d.sav", _savedump_path, _frame_counter);
SaveOrLoad(buf, SL_SAVE); SaveOrLoad(buf, SL_SAVE);
if ((uint)_frame_counter >= _savedump_last) exit(1); if ((uint)_frame_counter >= _savedump_last) exit(1);
} }
@ -917,7 +917,7 @@ void StateGameLoop()
static void DoAutosave() static void DoAutosave()
{ {
char buf[200]; char buf[200];
if (_patches.keep_all_autosave && _local_player != OWNER_SPECTATOR) { if (_patches.keep_all_autosave && _local_player != OWNER_SPECTATOR) {
Player *p; Player *p;
char *s; char *s;
@ -1063,7 +1063,7 @@ void UpdateExclusiveRights()
FOR_ALL_TOWNS(t) if (t->xy != 0) { FOR_ALL_TOWNS(t) if (t->xy != 0) {
t->exclusivity=(byte)-1; t->exclusivity=(byte)-1;
} }
/* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete) /* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete)
could be implemented this way: could be implemented this way:
1.) Go through all stations 1.) Go through all stations
@ -1090,7 +1090,7 @@ bool AfterLoadGame(uint version)
if (version <= 0x400) { if (version <= 0x400) {
UpdateExclusiveRights(); UpdateExclusiveRights();
} }
// convert road side to my format. // convert road side to my format.
if (_opt.road_side) _opt.road_side = 1; if (_opt.road_side) _opt.road_side = 1;
@ -1102,7 +1102,7 @@ bool AfterLoadGame(uint version)
// reinit the landscape variables (landscape might have changed) // reinit the landscape variables (landscape might have changed)
InitializeLandscapeVariables(true); InitializeLandscapeVariables(true);
// Update all vehicles // Update all vehicles
AfterLoadVehicles(); AfterLoadVehicles();
// in version 2.2 of the savegame, we have new airports // in version 2.2 of the savegame, we have new airports
@ -1131,7 +1131,7 @@ bool AfterLoadGame(uint version)
WP(w,vp_d).scrollpos_x = _saved_scrollpos_x; WP(w,vp_d).scrollpos_x = _saved_scrollpos_x;
WP(w,vp_d).scrollpos_y = _saved_scrollpos_y; WP(w,vp_d).scrollpos_y = _saved_scrollpos_y;
vp = w->viewport; vp = w->viewport;
vp->zoom = _saved_scrollpos_zoom; vp->zoom = _saved_scrollpos_zoom;
vp->virtual_width = vp->width << vp->zoom; vp->virtual_width = vp->width << vp->zoom;
@ -1143,8 +1143,8 @@ bool AfterLoadGame(uint version)
if (version <= 0x400) { if (version <= 0x400) {
CheckIsPlayerActive(); CheckIsPlayerActive();
} }
// If Load Scenario / New (Scenario) Game is used, // If Load Scenario / New (Scenario) Game is used,
// a player does not exist yet. So create one here. // a player does not exist yet. So create one here.
if (!_players[0].is_active) if (!_players[0].is_active)
DoStartupNewPlayer(false); DoStartupNewPlayer(false);

20
ttd.h
View File

@ -9,7 +9,7 @@
#endif #endif
// use this on non static functions // use this on non static functions
#define PUBLIC #define PUBLIC
typedef struct Rect { typedef struct Rect {
int left,top,right,bottom; int left,top,right,bottom;
@ -34,10 +34,10 @@ typedef struct YearMonthDay {
/* --- 1 Day is 74 ticks --- /* --- 1 Day is 74 ticks ---
* The game's internal structure is dictated by ticks. The date counter (date_fract) is an integer of * The game's internal structure is dictated by ticks. The date counter (date_fract) is an integer of
* uint16 type, so it can have a max value of 65536. Every tick this variable (date_fract) is * uint16 type, so it can have a max value of 65536. Every tick this variable (date_fract) is
* increased by 885. When it overflows, the new day loop is called. * increased by 885. When it overflows, the new day loop is called.
* * this that means 1 day is : 65536 / 885 = 74 ticks * * this that means 1 day is : 65536 / 885 = 74 ticks
* * 1 tick is approximately 27ms. * * 1 tick is approximately 27ms.
* * 1 day is thus about 2 seconds (74*27 = 1998) on a machine that can run OpenTTD normally * * 1 day is thus about 2 seconds (74*27 = 1998) on a machine that can run OpenTTD normally
*/ */
#define DAY_TICKS 74 #define DAY_TICKS 74
@ -196,7 +196,7 @@ typedef struct Prices {
int32 aircraft_running; int32 aircraft_running;
int32 roadveh_running; int32 roadveh_running;
int32 ship_running; int32 ship_running;
int32 build_industry; int32 build_industry;
} Prices; } Prices;
#define GAME_DIFFICULTY_NUM 18 #define GAME_DIFFICULTY_NUM 18
@ -267,12 +267,12 @@ typedef void GetTileDescProc(uint tile, TileDesc *td);
* tracks = (byte)(ts | ts >>8) * tracks = (byte)(ts | ts >>8)
* This effectively converts the present part of the result (ccdd) to a * This effectively converts the present part of the result (ccdd) to a
* track bitmask, which disregards directions. Normally, this is the same as just * track bitmask, which disregards directions. Normally, this is the same as just
* doing (byte)ts I think, although I am not really sure * doing (byte)ts I think, although I am not really sure
* *
* A trackdir is combination of a track and a dir, where the lower three bits * A trackdir is combination of a track and a dir, where the lower three bits
* are a track, the fourth bit is the direction. these give 12 (or 14) * are a track, the fourth bit is the direction. these give 12 (or 14)
* possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask * possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask
* above. * above.
*/ */
typedef uint32 GetTileTrackStatusProc(uint tile, TransportType mode); typedef uint32 GetTileTrackStatusProc(uint tile, TransportType mode);
typedef void GetProducedCargoProc(uint tile, byte *b); typedef void GetProducedCargoProc(uint tile, byte *b);
@ -316,7 +316,7 @@ enum {
MP_MAP5 = 1<<3, MP_MAP5 = 1<<3,
MP_MAPOWNER_CURRENT = 1<<4, MP_MAPOWNER_CURRENT = 1<<4,
MP_MAPOWNER = 1<<5, MP_MAPOWNER = 1<<5,
MP_TYPE_MASK = 0xF << 8, MP_TYPE_MASK = 0xF << 8,
MP_MAP2_CLEAR = 1 << 12, MP_MAP2_CLEAR = 1 << 12,
@ -466,7 +466,7 @@ enum {
// special string constants // special string constants
enum SpecialStrings { enum SpecialStrings {
// special strings for town names. the town name is generated dynamically on request. // special strings for town names. the town name is generated dynamically on request.
SPECSTR_TOWNNAME_START = 0x20C0, SPECSTR_TOWNNAME_START = 0x20C0,
SPECSTR_TOWNNAME_ENGLISH = SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_ENGLISH = SPECSTR_TOWNNAME_START,
@ -493,7 +493,7 @@ enum SpecialStrings {
SPECSTR_PLAYERNAME_AMERICAN, SPECSTR_PLAYERNAME_AMERICAN,
SPECSTR_PLAYERNAME_LATIN, SPECSTR_PLAYERNAME_LATIN,
SPECSTR_PLAYERNAME_SILLY, SPECSTR_PLAYERNAME_SILLY,
SPECSTR_PLAYERNAME_LAST = SPECSTR_PLAYERNAME_SILLY, SPECSTR_PLAYERNAME_LAST = SPECSTR_PLAYERNAME_SILLY,
SPECSTR_ANDCO_NAME = 0x70E6, SPECSTR_ANDCO_NAME = 0x70E6,
SPECSTR_PRESIDENT_NAME = 0x70E7, SPECSTR_PRESIDENT_NAME = 0x70E7,

View File

@ -17,7 +17,7 @@ static const byte _bridge_minlen[MAX_BRIDGES] = {
}; };
static const byte _bridge_maxlen[MAX_BRIDGES] = { static const byte _bridge_maxlen[MAX_BRIDGES] = {
16, 2, 5, 10, 16, 16, 7, 8, 9, 2, 16, 32, 32, 16, 2, 5, 10, 16, 16, 7, 8, 9, 2, 16, 32, 32,
}; };
const uint16 _bridge_type_price_mod[MAX_BRIDGES] = { const uint16 _bridge_type_price_mod[MAX_BRIDGES] = {
@ -31,8 +31,8 @@ const uint16 _bridge_speeds[MAX_BRIDGES] = {
const PalSpriteID _bridge_sprites[MAX_BRIDGES] = { const PalSpriteID _bridge_sprites[MAX_BRIDGES] = {
0x0A24, 0x31E8A26, 0x0A25, 0x3208A22, 0x0A24, 0x31E8A26, 0x0A25, 0x3208A22,
0x0A22, 0x3218A22, 0x0A23, 0x31C8A23, 0x0A22, 0x3218A22, 0x0A23, 0x31C8A23,
0x31E8A23, 0x0A27, 0x0A28, 0x3218A28, 0x31E8A23, 0x0A27, 0x0A28, 0x3218A28,
0x3238A28, 0x3238A28,
}; };
const StringID _bridge_material[MAX_BRIDGES] = { const StringID _bridge_material[MAX_BRIDGES] = {
@ -88,11 +88,11 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
- no extra cost - no extra cost
- direction X: tiles 0,12 - direction X: tiles 0,12
- direction Y: tiles 0, 9 - direction Y: tiles 0, 9
*/ */
if ((direction?0x201:0x1001) & (1 << tileh)) if ((direction?0x201:0x1001) & (1 << tileh))
return 0; return 0;
// disallow certain start tiles to avoid certain crooked bridges // disallow certain start tiles to avoid certain crooked bridges
if (tileh == 2) if (tileh == 2)
return CMD_ERROR; return CMD_ERROR;
@ -106,7 +106,7 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
if ((direction?0x41:0x9) & (1 << tileh)) if ((direction?0x41:0x9) & (1 << tileh))
return 0; return 0;
// disallow certain end tiles to avoid certain crooked bridges // disallow certain end tiles to avoid certain crooked bridges
if (tileh == 8) if (tileh == 8)
return CMD_ERROR; return CMD_ERROR;
@ -116,7 +116,7 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
* start-tile: X 2,1 Y 2,4 (2 was disabled before) * start-tile: X 2,1 Y 2,4 (2 was disabled before)
* end-tile: X 8,4 Y 8,1 (8 was disabled before) * end-tile: X 8,4 Y 8,1 (8 was disabled before)
*/ */
if ( (tileh == 1 && (is_start_tile != (bool)direction)) || if ( (tileh == 1 && (is_start_tile != (bool)direction)) ||
(tileh == 4 && (is_start_tile == (bool)direction)) ) (tileh == 4 && (is_start_tile == (bool)direction)) )
return CMD_ERROR; return CMD_ERROR;
@ -135,7 +135,7 @@ uint32 GetBridgeLength(TileIndex begin, TileIndex end)
y1 = GET_TILE_Y(begin); y1 = GET_TILE_Y(begin);
x2 = GET_TILE_X(end); x2 = GET_TILE_X(end);
y2 = GET_TILE_Y(end); y2 = GET_TILE_Y(end);
return abs((x2 + y2 - x1 - y1)) - 1; return abs((x2 + y2 - x1 - y1)) - 1;
} }
@ -156,7 +156,7 @@ bool CheckBridge_Stuff(byte bridge_type, int bridge_len)
return true; return true;
} }
/* Build a Bridge /* Build a Bridge
* x,y - end tile coord * x,y - end tile coord
* p1 - packed start tile coords (~ dx) * p1 - packed start tile coords (~ dx)
* p2&0xFF - bridge type (hi bh) * p2&0xFF - bridge type (hi bh)
@ -174,11 +174,11 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 cost, terraformcost, ret; int32 cost, terraformcost, ret;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
/* unpack parameters */ /* unpack parameters */
bridge_type = p2 & 0xFF; bridge_type = p2 & 0xFF;
railtype = (byte)(p2 >> 8); railtype = (byte)(p2 >> 8);
// type of bridge // type of bridge
if (railtype & 0x80) { if (railtype & 0x80) {
railtype = 0; railtype = 0;
@ -238,9 +238,9 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
cost = ret; cost = ret;
terraformcost = CheckBridgeSlope(direction, ti_start.tileh, true); // true - bridge-start-tile, false - bridge-end-tile terraformcost = CheckBridgeSlope(direction, ti_start.tileh, true); // true - bridge-start-tile, false - bridge-end-tile
// towns are not allowed to use bridges on slopes. // towns are not allowed to use bridges on slopes.
if (terraformcost == CMD_ERROR || if (terraformcost == CMD_ERROR ||
(terraformcost && ((!_patches.ainew_active && _is_ai_player) || _current_player == OWNER_TOWN || !_patches.build_on_slopes))) (terraformcost && ((!_patches.ainew_active && _is_ai_player) || _current_player == OWNER_TOWN || !_patches.build_on_slopes)))
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION); return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
@ -250,11 +250,11 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ((ret=DoCommandByTile(ti_end.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)) == CMD_ERROR) if ((ret=DoCommandByTile(ti_end.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)) == CMD_ERROR)
return CMD_ERROR; return CMD_ERROR;
cost += ret; cost += ret;
terraformcost = CheckBridgeSlope(direction, ti_end.tileh, false); // false - end tile slope check terraformcost = CheckBridgeSlope(direction, ti_end.tileh, false); // false - end tile slope check
// towns are not allowed to use bridges on slopes. // towns are not allowed to use bridges on slopes.
if (terraformcost == CMD_ERROR || if (terraformcost == CMD_ERROR ||
(terraformcost && ((!_patches.ainew_active && _is_ai_player) || _current_player == OWNER_TOWN || !_patches.build_on_slopes))) (terraformcost && ((!_patches.ainew_active && _is_ai_player) || _current_player == OWNER_TOWN || !_patches.build_on_slopes)))
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION); return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
@ -299,7 +299,7 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (ti.tileh != 0 && ti.z >= ti_start.z) if (ti.tileh != 0 && ti.z >= ti_start.z)
return CMD_ERROR; return CMD_ERROR;
// Find ship below // Find ship below
if ( ti.type == MP_WATER && !EnsureNoVehicle(ti.tile) ) if ( ti.type == MP_WATER && !EnsureNoVehicle(ti.tile) )
{ {
_error_message = STR_980E_SHIP_IN_THE_WAY; _error_message = STR_980E_SHIP_IN_THE_WAY;
@ -339,26 +339,26 @@ not_valid_below:;
_map_type_and_height[ti.tile] |= MP_TUNNELBRIDGE << 4; _map_type_and_height[ti.tile] |= MP_TUNNELBRIDGE << 4;
//bridges pieces sequence (middle parts) //bridges pieces sequence (middle parts)
// bridge len 1: 0 // bridge len 1: 0
// bridge len 2: 0 1 // bridge len 2: 0 1
// bridge len 3: 0 4 1 // bridge len 3: 0 4 1
// bridge len 4: 0 2 3 1 // bridge len 4: 0 2 3 1
// bridge len 5: 0 2 5 3 1 // bridge len 5: 0 2 5 3 1
// bridge len 6: 0 2 3 2 3 1 // bridge len 6: 0 2 3 2 3 1
// bridge len 7: 0 2 3 4 2 3 1 // bridge len 7: 0 2 3 4 2 3 1
// #0 - alwats as first, #1 - always as last (if len>1) // #0 - alwats as first, #1 - always as last (if len>1)
// #2,#3 are to pair in order // #2,#3 are to pair in order
// for odd bridges: #5 is going in the bridge middle if on even position, #4 on odd (counting from 0) // for odd bridges: #5 is going in the bridge middle if on even position, #4 on odd (counting from 0)
if(i==0) //first tile if(i==0) //first tile
m5 = 0; m5 = 0;
else if (i==bridge_len-1) //last tile else if (i==bridge_len-1) //last tile
m5 = 1; m5 = 1;
else if(i==odd_middle_part) //we are on the middle of odd bridge: #5 on even pos, #4 on odd else if(i==odd_middle_part) //we are on the middle of odd bridge: #5 on even pos, #4 on odd
m5 = 5 - (i%2); m5 = 5 - (i%2);
else { else {
// generate #2 and #3 in turns [i%2==0], after the middle of odd bridge // generate #2 and #3 in turns [i%2==0], after the middle of odd bridge
// this sequence swaps [... XOR (i>odd_middle_part)], // this sequence swaps [... XOR (i>odd_middle_part)],
// for even bridges XOR does not apply as odd_middle_part==bridge_len // for even bridges XOR does not apply as odd_middle_part==bridge_len
m5 = 2 + ((i%2==0)^(i>odd_middle_part)); m5 = 2 + ((i%2==0)^(i>odd_middle_part));
} }
@ -377,7 +377,7 @@ not_valid_below:;
It's unnecessary to execute this command every time for every bridge. So it is done only It's unnecessary to execute this command every time for every bridge. So it is done only
and cost is computed in "bridge_gui.c". For AI, Towns this has to be of course calculated and cost is computed in "bridge_gui.c". For AI, Towns this has to be of course calculated
*/ */
if (!(flags & DC_QUERY_COST)) { if (!(flags & DC_QUERY_COST)) {
bridge_len += 2; // begin and end tiles/ramps bridge_len += 2; // begin and end tiles/ramps
if (_current_player < MAX_PLAYERS && !(_is_ai_player && !_patches.ainew_active)) if (_current_player < MAX_PLAYERS && !(_is_ai_player && !_patches.ainew_active))
@ -575,7 +575,7 @@ int32 CmdBuildTunnel(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC && DoBuildTunnel(x,y,tiorg.x,tiorg.y,flags&~DC_EXEC,excavated_tile) == CMD_ERROR) if (flags & DC_EXEC && DoBuildTunnel(x,y,tiorg.x,tiorg.y,flags&~DC_EXEC,excavated_tile) == CMD_ERROR)
return CMD_ERROR; return CMD_ERROR;
return DoBuildTunnel(x,y,tiorg.x, tiorg.y,flags,excavated_tile); return DoBuildTunnel(x,y,tiorg.x, tiorg.y,flags,excavated_tile);
} }
@ -588,14 +588,14 @@ uint CheckTunnelBusy(uint tile, int *length)
int delta = _tileoffs_by_dir[m5 & 3], len = 0; int delta = _tileoffs_by_dir[m5 & 3], len = 0;
uint starttile = tile; uint starttile = tile;
Vehicle *v; Vehicle *v;
do { tile += delta; len++; } while (!IS_TILETYPE(tile, MP_TUNNELBRIDGE) || _map5[tile]&0xF0 || (byte)(_map5[tile] ^ 2) != m5 || GetTileZ(tile) != z); do { tile += delta; len++; } while (!IS_TILETYPE(tile, MP_TUNNELBRIDGE) || _map5[tile]&0xF0 || (byte)(_map5[tile] ^ 2) != m5 || GetTileZ(tile) != z);
if ((v=FindVehicleBetween(starttile, tile, z)) != NULL) { if ((v=FindVehicleBetween(starttile, tile, z)) != NULL) {
_error_message = v->type == VEH_Train ? STR_5000_TRAIN_IN_TUNNEL : STR_5001_ROAD_VEHICLE_IN_TUNNEL; _error_message = v->type == VEH_Train ? STR_5000_TRAIN_IN_TUNNEL : STR_5001_ROAD_VEHICLE_IN_TUNNEL;
return (uint)-1; return (uint)-1;
} }
if (length) *length = len; if (length) *length = len;
return tile; return tile;
} }
@ -618,7 +618,7 @@ static int32 DoClearTunnel(uint tile, uint32 flags)
if (endtile == (uint)-1) return CMD_ERROR; if (endtile == (uint)-1) return CMD_ERROR;
_build_tunnel_endtile = endtile; _build_tunnel_endtile = endtile;
t = ClosestTownFromTile(tile, (uint)-1); //needed for town rating penalty t = ClosestTownFromTile(tile, (uint)-1); //needed for town rating penalty
// check if you're allowed to remove the tunnel owned by a town // check if you're allowed to remove the tunnel owned by a town
// removal allowal depends on difficulty settings // removal allowal depends on difficulty settings
@ -638,7 +638,7 @@ static int32 DoClearTunnel(uint tile, uint32 flags)
DoClearSquare(endtile); DoClearSquare(endtile);
UpdateSignalsOnSegment(tile, _updsignals_tunnel_dir[tile_dir]); UpdateSignalsOnSegment(tile, _updsignals_tunnel_dir[tile_dir]);
UpdateSignalsOnSegment(endtile, _updsignals_tunnel_dir[endtile_dir]); UpdateSignalsOnSegment(endtile, _updsignals_tunnel_dir[endtile_dir]);
if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR) if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR)
ChangeTownRating(t, -250, 0); ChangeTownRating(t, -250, 0);
} }
return _price.clear_tunnel * (length + 1); return _price.clear_tunnel * (length + 1);
@ -676,7 +676,7 @@ static int32 DoClearBridge(uint tile, uint32 flags)
Vehicle *v; Vehicle *v;
Town *t; Town *t;
int direction; int direction;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION); SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
direction = _map5[tile]&1; direction = _map5[tile]&1;
@ -688,7 +688,7 @@ static int32 DoClearBridge(uint tile, uint32 flags)
// check if we own the tile below the bridge.. // check if we own the tile below the bridge..
if (_current_player != OWNER_WATER && (!CheckTileOwnership(tile) || !EnsureNoVehicleZ(tile, GET_TILEHEIGHT(tile)) )) if (_current_player != OWNER_WATER && (!CheckTileOwnership(tile) || !EnsureNoVehicleZ(tile, GET_TILEHEIGHT(tile)) ))
return CMD_ERROR; return CMD_ERROR;
cost = (_map5[tile] & 8) ? _price.remove_road * 2 : _price.remove_rail; cost = (_map5[tile] & 8) ? _price.remove_road * 2 : _price.remove_rail;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
@ -697,11 +697,11 @@ static int32 DoClearBridge(uint tile, uint32 flags)
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
return cost; return cost;
/* delete canal under bridge */ /* delete canal under bridge */
} else if(_map5[tile]==0xC8 && GET_TILEHEIGHT(tile)!=0) { } else if(_map5[tile]==0xC8 && GET_TILEHEIGHT(tile)!=0) {
int32 cost; int32 cost;
// check for vehicles under bridge // check for vehicles under bridge
if ( !EnsureNoVehicleZ(tile, GET_TILEHEIGHT(tile)) ) if ( !EnsureNoVehicleZ(tile, GET_TILEHEIGHT(tile)) )
return CMD_ERROR; return CMD_ERROR;
@ -732,7 +732,7 @@ static int32 DoClearBridge(uint tile, uint32 flags)
tile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0); tile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
endtile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0); endtile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
if ((v=FindVehicleBetween(tile, endtile, GET_TILEHEIGHT(tile) + 8)) != NULL) { if ((v=FindVehicleBetween(tile, endtile, GET_TILEHEIGHT(tile) + 8)) != NULL) {
VehicleInTheWayErrMsg(v); VehicleInTheWayErrMsg(v);
return CMD_ERROR; return CMD_ERROR;
} }
@ -740,12 +740,12 @@ static int32 DoClearBridge(uint tile, uint32 flags)
tile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0); tile -= direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
endtile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0); endtile += direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
t = ClosestTownFromTile(tile, (uint)-1); //needed for town rating penalty t = ClosestTownFromTile(tile, (uint)-1); //needed for town rating penalty
// check if you're allowed to remove the bridge owned by a town. // check if you're allowed to remove the bridge owned by a town.
// removal allowal depends on difficulty settings // removal allowal depends on difficulty settings
if(_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR) { if(_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR) {
if (!CheckforTownRating(tile, flags, t, TUNNELBRIDGE_REMOVE)) if (!CheckforTownRating(tile, flags, t, TUNNELBRIDGE_REMOVE))
return CMD_ERROR; return CMD_ERROR;
} }
@ -756,8 +756,8 @@ static int32 DoClearBridge(uint tile, uint32 flags)
//checks if the owner is town then decrease town rating by 250 until //checks if the owner is town then decrease town rating by 250 until
// you have a "Poor" (0) town rating // you have a "Poor" (0) town rating
if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR) if (_map_owner[tile] == OWNER_TOWN && _game_mode != GM_EDITOR)
ChangeTownRating(t, -250, 0); ChangeTownRating(t, -250, 0);
do { do {
m5 = _map5[c]; m5 = _map5[c];
@ -787,7 +787,7 @@ clear_it:;
SetSignalsOnBothDir(tile, direction); SetSignalsOnBothDir(tile, direction);
SetSignalsOnBothDir(endtile, direction); SetSignalsOnBothDir(endtile, direction);
} }
return ((((endtile - tile) >> (direction?8:0))&0xFF)+1) * _price.clear_bridge; return ((((endtile - tile) >> (direction?8:0))&0xFF)+1) * _price.clear_bridge;
@ -826,7 +826,7 @@ int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec)
if (!CheckTileOwnership(tile)) return CMD_ERROR; if (!CheckTileOwnership(tile)) return CMD_ERROR;
if ( (uint)(_map3_lo[tile] & 0xF) == totype) return CMD_ERROR; if ( (uint)(_map3_lo[tile] & 0xF) == totype) return CMD_ERROR;
endtile = CheckTunnelBusy(tile, &length); endtile = CheckTunnelBusy(tile, &length);
if (endtile == (uint)-1) return CMD_ERROR; if (endtile == (uint)-1) return CMD_ERROR;
@ -861,7 +861,7 @@ int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec)
starttile = tile = FindEdgesOfBridge(tile, &endtile); starttile = tile = FindEdgesOfBridge(tile, &endtile);
// Make sure there's no vehicle on the bridge // Make sure there's no vehicle on the bridge
if ((v=FindVehicleBetween(tile, endtile, 0xff)) != NULL) { if ((v=FindVehicleBetween(tile, endtile, 0xff)) != NULL) {
VehicleInTheWayErrMsg(v); VehicleInTheWayErrMsg(v);
return CMD_ERROR; return CMD_ERROR;
} }
@ -881,7 +881,7 @@ int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec)
} while (tile <= endtile); } while (tile <= endtile);
return cost; return cost;
} else } else
return CMD_ERROR; return CMD_ERROR;
} }
@ -906,7 +906,7 @@ uint GetBridgeHeight(const TileInfo *ti)
FindLandscapeHeightByTile(&ti_end, tile); FindLandscapeHeightByTile(&ti_end, tile);
if (HASBIT(1 << 7, ti_end.tileh)) if (HASBIT(1 << 7, ti_end.tileh))
z_correction += 8; z_correction += 8;
// return the height there (the height of the NORTH CORNER) // return the height there (the height of the NORTH CORNER)
return GET_TILEHEIGHT(tile) + z_correction; return GET_TILEHEIGHT(tile) + z_correction;
} }
@ -973,7 +973,7 @@ uint GetBridgeFoundation(uint tileh, byte direction) {
return tileh; return tileh;
// inclined sloped building // inclined sloped building
if ( ((i=0, tileh == 1) || (i+=2, tileh == 2) || (i+=2, tileh == 4) || (i+=2, tileh == 8)) && if ( ((i=0, tileh == 1) || (i+=2, tileh == 2) || (i+=2, tileh == 4) || (i+=2, tileh == 8)) &&
( direction == 0 || (i++, direction == 1)) ) ( direction == 0 || (i++, direction == 1)) )
return i + 15; return i + 15;
@ -986,8 +986,8 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
uint tmp; uint tmp;
const uint32 *b; const uint32 *b;
bool ice = _map3_hi[ti->tile] & 0x80; bool ice = _map3_hi[ti->tile] & 0x80;
// draw tunnel? // draw tunnel?
if ( (byte)(ti->map5&0xF0) == 0) { if ( (byte)(ti->map5&0xF0) == 0) {
/* railway type */ /* railway type */
image = (_map3_lo[ti->tile] & 0xF) * 8; image = (_map3_lo[ti->tile] & 0xF) * 8;
@ -1018,11 +1018,11 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
tmp = (ti->map5&3) + (tmp*2); tmp = (ti->map5&3) + (tmp*2);
if (!(ti->map5 & 0x40)) { // bridge ramps if (!(ti->map5 & 0x40)) { // bridge ramps
if (!(BRIDGE_NO_FOUNDATION & (1 << ti->tileh))) { // no foundations for 0, 3, 6, 9, 12 if (!(BRIDGE_NO_FOUNDATION & (1 << ti->tileh))) { // no foundations for 0, 3, 6, 9, 12
int f = GetBridgeFoundation(ti->tileh, ti->map5 & 0x1); // pass direction int f = GetBridgeFoundation(ti->tileh, ti->map5 & 0x1); // pass direction
if (f) DrawFoundation(ti, f); if (f) DrawFoundation(ti, f);
// default sloped sprites.. // default sloped sprites..
if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + 0x3F3; if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + 0x3F3;
} }
@ -1033,8 +1033,8 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
b += (tmp&1); // direction b += (tmp&1); // direction
if (ti->tileh == 0) b += 4; // sloped "entrance" ? if (ti->tileh == 0) b += 4; // sloped "entrance" ?
if (ti->map5 & 0x20) b += 2; // which side if (ti->map5 & 0x20) b += 2; // which side
image = *b; image = *b;
if (!ice) { if (!ice) {
DrawClearLandTile(ti, 3); DrawClearLandTile(ti, 3);
@ -1062,7 +1062,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
if (ti->map5 & 8 && ti->z != 0) DrawCanalWater(ti->tile); if (ti->map5 & 8 && ti->z != 0) DrawCanalWater(ti->tile);
} else { } else {
// draw transport route under bridge // draw transport route under bridge
// draw foundation? // draw foundation?
if (ti->tileh) { if (ti->tileh) {
int f = _bridge_foundations[ti->map5&1][ti->tileh]; int f = _bridge_foundations[ti->map5&1][ti->tileh];
@ -1087,7 +1087,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
b = _bridge_sprite_table[_map2[ti->tile]>>4][_map2[ti->tile]&0xF] + tmp * 4; b = _bridge_sprite_table[_map2[ti->tile]>>4][_map2[ti->tile]&0xF] + tmp * 4;
z = GetBridgeHeight(ti) + 5; z = GetBridgeHeight(ti) + 5;
// draw rail // draw rail
image = b[0]; image = b[0];
if (!(_display_opt & DO_TRANS_BUILDINGS)) image = (image & 0x3FFF) | 0x03224000; if (!(_display_opt & DO_TRANS_BUILDINGS)) image = (image & 0x3FFF) | 0x03224000;
@ -1106,7 +1106,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
y += 12; y += 12;
if (image&0x3FFF) AddSortableSpriteToDraw(image, x,y, 16, 1, 0x28, z); if (image&0x3FFF) AddSortableSpriteToDraw(image, x,y, 16, 1, 0x28, z);
} }
if (ti->z + 5 == z ) { if (ti->z + 5 == z ) {
// draw poles below for small bridges // draw poles below for small bridges
image = b[2]; image = b[2];
@ -1136,7 +1136,7 @@ static uint GetSlopeZ_TunnelBridge(TileInfo *ti) {
if ( (ti->map5 & 0xF0) == 0) if ( (ti->map5 & 0xF0) == 0)
return z; return z;
// bridge? // bridge?
if ( ti->map5 & 0x80 ) { if ( ti->map5 & 0x80 ) {
// bridge ending? // bridge ending?
if (!(ti->map5 & 0x40)) { if (!(ti->map5 & 0x40)) {
@ -1154,18 +1154,18 @@ static uint GetSlopeZ_TunnelBridge(TileInfo *ti) {
// ramp in opposite dir // ramp in opposite dir
return (z + ((x^0xF)>>1)); return (z + ((x^0xF)>>1));
} }
// bridge middle part // bridge middle part
} else { } else {
// build on slopes? // build on slopes?
if (ti->tileh) z+=8; if (ti->tileh) z+=8;
// keep the same elevation because we're on the bridge? // keep the same elevation because we're on the bridge?
if (_get_z_hint >= z + 8) if (_get_z_hint >= z + 8)
return _get_z_hint; return _get_z_hint;
// actually on the bridge, but not yet in the shared area. // actually on the bridge, but not yet in the shared area.
if (!IS_INT_INSIDE(x, 5, 10+1)) if (!IS_INT_INSIDE(x, 5, 10+1))
return GetBridgeHeight(ti) + 8; return GetBridgeHeight(ti) + 8;
// in the shared area, assume that we're below the bridge, cause otherwise the hint would've caught it. // in the shared area, assume that we're below the bridge, cause otherwise the hint would've caught it.
@ -1174,11 +1174,11 @@ static uint GetSlopeZ_TunnelBridge(TileInfo *ti) {
uint f = _bridge_foundations[ti->map5&1][ti->tileh]; uint f = _bridge_foundations[ti->map5&1][ti->tileh];
// make sure that the slope is not inclined foundation // make sure that the slope is not inclined foundation
if (IS_BYTE_INSIDE(f, 1, 15)) return z; if (IS_BYTE_INSIDE(f, 1, 15)) return z;
// change foundation type? // change foundation type?
if (f) ti->tileh = _inclined_tileh[f - 15]; if (f) ti->tileh = _inclined_tileh[f - 15];
} }
// no transport route, fallback to default // no transport route, fallback to default
} }
} }
@ -1282,7 +1282,7 @@ static void TileLoop_TunnelBridge(uint tile)
} else if (_opt.landscape == LT_DESERT) { } else if (_opt.landscape == LT_DESERT) {
if (GetMapExtraBits(tile) == 1 && !(_map3_hi[tile]&0x80)) { if (GetMapExtraBits(tile) == 1 && !(_map3_hi[tile]&0x80)) {
_map3_hi[tile] |= 0x80; _map3_hi[tile] |= 0x80;
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
} }
} }
@ -1303,7 +1303,7 @@ static uint32 GetTileTrackStatus_TunnelBridge(uint tile, TransportType mode)
if ((m5 & 0xF0) == 0) { if ((m5 & 0xF0) == 0) {
/* This is a tunnel */ /* This is a tunnel */
if (((m5 & 0xC) >> 2) == mode) { if (((m5 & 0xC) >> 2) == mode) {
/* Tranport in the tunnel is compatible */ /* Tranport in the tunnel is compatible */
return m5&1 ? 0x202 : 0x101; return m5&1 ? 0x202 : 0x101;
} }
@ -1321,7 +1321,7 @@ static uint32 GetTileTrackStatus_TunnelBridge(uint tile, TransportType mode)
if ((m5 &= 0x18) != 8) if ((m5 &= 0x18) != 8)
/* Clear ground */ /* Clear ground */
return result; return result;
else else
if (mode != TRANSPORT_WATER) if (mode != TRANSPORT_WATER)
return result; return result;
} else { } else {
@ -1347,7 +1347,7 @@ static void ChangeTileOwner_TunnelBridge(uint tile, byte old_player, byte new_pl
{ {
if (_map_owner[tile] != old_player) if (_map_owner[tile] != old_player)
return; return;
if (new_player != 255) { if (new_player != 255) {
_map_owner[tile] = new_player; _map_owner[tile] = new_player;
} else { } else {
@ -1394,7 +1394,7 @@ static uint32 VehicleEnter_TunnelBridge(Vehicle *v, uint tile, int x, int y)
if (v->type == VEH_Train) { if (v->type == VEH_Train) {
fc = (x&0xF)+(y<<4); fc = (x&0xF)+(y<<4);
dir = _map5[tile] & 3; dir = _map5[tile] & 3;
vdir = v->direction >> 1; vdir = v->direction >> 1;
@ -1428,10 +1428,10 @@ static uint32 VehicleEnter_TunnelBridge(Vehicle *v, uint tile, int x, int y)
if (v->u.road.state != 0xFF && dir == vdir) { if (v->u.road.state != 0xFF && dir == vdir) {
if (fc == _tunnel_fractcoord_4[dir] || if (fc == _tunnel_fractcoord_4[dir] ||
fc == _tunnel_fractcoord_5[dir]) { fc == _tunnel_fractcoord_5[dir]) {
v->tile = tile; v->tile = tile;
v->u.road.state = 0xFF; v->u.road.state = 0xFF;
v->vehstatus |= VS_HIDDEN; v->vehstatus |= VS_HIDDEN;
return 4; return 4;
} else { } else {
return 0; return 0;

42
unix.c
View File

@ -44,7 +44,7 @@ int compare_FiosItems (const void *a, const void *b) {
if (_savegame_sort_order < 2) // sort by date if (_savegame_sort_order < 2) // sort by date
r = da->mtime < db->mtime ? -1 : 1; r = da->mtime < db->mtime ? -1 : 1;
else else
r = strcmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name); r = strcmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name);
if (_savegame_sort_order & 1) r = -r; if (_savegame_sort_order & 1) r = -r;
@ -71,7 +71,7 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
_fios_path = _fios_scn_path; _fios_path = _fios_scn_path;
else else
_fios_path = _fios_save_path; _fios_path = _fios_save_path;
// Parent directory, only if not in root already. // Parent directory, only if not in root already.
if (_fios_path[1] != 0) { if (_fios_path[1] != 0) {
fios = FiosAlloc(); fios = FiosAlloc();
@ -263,11 +263,11 @@ char *FiosBrowseTo(const FiosItem *item)
case FIOS_TYPE_OLDFILE: case FIOS_TYPE_OLDFILE:
sprintf(str_buffr, "%s/%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]); sprintf(str_buffr, "%s/%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]);
return str_buffr; return str_buffr;
case FIOS_TYPE_SCENARIO: case FIOS_TYPE_SCENARIO:
sprintf(str_buffr, "%s/%s.scn", path, item->name); sprintf(str_buffr, "%s/%s.scn", path, item->name);
return str_buffr; return str_buffr;
case FIOS_TYPE_OLD_SCENARIO: case FIOS_TYPE_OLD_SCENARIO:
sprintf(str_buffr, "%s/%s.%s", path, item->name, _old_extensions[item->old_extension]); sprintf(str_buffr, "%s/%s.%s", path, item->name, _old_extensions[item->old_extension]);
return str_buffr; return str_buffr;
@ -291,14 +291,14 @@ StringID FiosGetDescText(char **path)
{ {
uint64 tot = (uint64)s.f_bsize * s.f_bavail; uint64 tot = (uint64)s.f_bsize * s.f_bavail;
SET_DPARAM32(0, (uint32)(tot >> 20)); SET_DPARAM32(0, (uint32)(tot >> 20));
return STR_4005_BYTES_FREE; return STR_4005_BYTES_FREE;
} }
else else
return STR_4006_UNABLE_TO_READ_DRIVE; return STR_4006_UNABLE_TO_READ_DRIVE;
} }
#else #else
SET_DPARAM32(0, 0); SET_DPARAM32(0, 0);
return STR_4005_BYTES_FREE; return STR_4005_BYTES_FREE;
#endif #endif
} }
@ -348,14 +348,14 @@ const DriverDesc _music_driver_descs[] = {
#endif #endif
#ifdef __BEOS__ #ifdef __BEOS__
{ "bemidi", "BeOS MIDI Driver", &_bemidi_music_driver, 1}, { "bemidi", "BeOS MIDI Driver", &_bemidi_music_driver, 1},
#endif #endif
{ "null", "Null Music Driver", &_null_music_driver, 1}, { "null", "Null Music Driver", &_null_music_driver, 1},
{ NULL, NULL, NULL, 0} { NULL, NULL, NULL, 0}
}; };
bool FileExists(const char *filename) bool FileExists(const char *filename)
{ {
return access(filename, 0) == 0; return access(filename, 0) == 0;
} }
static int LanguageCompareFunc(const void *a, const void *b) static int LanguageCompareFunc(const void *a, const void *b)
@ -380,7 +380,7 @@ int GetLanguageList(char **languages, int max)
} }
closedir(dir); closedir(dir);
} }
qsort(languages, num, sizeof(char*), LanguageCompareFunc); qsort(languages, num, sizeof(char*), LanguageCompareFunc);
return num; return num;
} }
@ -403,7 +403,7 @@ void ShowInfo(const char *str)
void ShowOSErrorBox(const char *buf) void ShowOSErrorBox(const char *buf)
{ {
fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf); fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf);
#if defined(__APPLE__) #if defined(__APPLE__)
// this opens the crash log opener script // this opens the crash log opener script
system("./Crash_Log_Opener.app"); system("./Crash_Log_Opener.app");
@ -435,25 +435,25 @@ void DeterminePaths()
#if defined(USE_HOMEDIR) #if defined(USE_HOMEDIR)
{ {
char *homedir; char *homedir;
homedir = getenv("HOME"); homedir = getenv("HOME");
if(!homedir) { if(!homedir) {
struct passwd *pw = getpwuid(getuid()); struct passwd *pw = getpwuid(getuid());
if (pw) homedir = pw->pw_dir; if (pw) homedir = pw->pw_dir;
} }
_path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR); _path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR);
} }
#else /* not defined(USE_HOMEDIR) */ #else /* not defined(USE_HOMEDIR) */
_path.personal_dir = malloc( MAX_PATH ); _path.personal_dir = malloc( MAX_PATH );
strcpy(_path.personal_dir, PERSONAL_DIR); strcpy(_path.personal_dir, PERSONAL_DIR);
// check if absolute or relative path // check if absolute or relative path
s = strchr(_path.personal_dir, '/'); s = strchr(_path.personal_dir, '/');
// add absolute path // add absolute path
if (s==NULL || _path.personal_dir != s) { if (s==NULL || _path.personal_dir != s) {
getcwd(_path.personal_dir, MAX_PATH); getcwd(_path.personal_dir, MAX_PATH);
@ -461,23 +461,23 @@ void DeterminePaths()
*s++ = '/'; *s++ = '/';
strcpy(s, PERSONAL_DIR); strcpy(s, PERSONAL_DIR);
} }
#endif /* defined(USE_HOMEDIR) */ #endif /* defined(USE_HOMEDIR) */
s = strchr(_path.personal_dir, 0); s = strchr(_path.personal_dir, 0);
// append a / ? // append a / ?
if (s[-1] != '/') { s[0] = '/'; s[1] = 0; } if (s[-1] != '/') { s[0] = '/'; s[1] = 0; }
_path.save_dir = str_fmt("%ssave", _path.personal_dir); _path.save_dir = str_fmt("%ssave", _path.personal_dir);
_path.autosave_dir = str_fmt("%s/autosave", _path.save_dir); _path.autosave_dir = str_fmt("%s/autosave", _path.save_dir);
_path.scenario_dir = str_fmt("%sscenario", _path.personal_dir); _path.scenario_dir = str_fmt("%sscenario", _path.personal_dir);
_path.gm_dir = str_fmt("%sgm/", _path.game_data_dir); _path.gm_dir = str_fmt("%sgm/", _path.game_data_dir);
_path.data_dir = str_fmt("%sdata/", _path.game_data_dir); _path.data_dir = str_fmt("%sdata/", _path.game_data_dir);
_path.lang_dir = str_fmt("%slang/", _path.game_data_dir); _path.lang_dir = str_fmt("%slang/", _path.game_data_dir);
_config_file = str_fmt("%sopenttd.cfg", _path.personal_dir); _config_file = str_fmt("%sopenttd.cfg", _path.personal_dir);
// make (auto)save and scenario folder // make (auto)save and scenario folder
mkdir(_path.save_dir, 0755); mkdir(_path.save_dir, 0755);
mkdir(_path.autosave_dir, 0755); mkdir(_path.autosave_dir, 0755);

View File

@ -31,10 +31,10 @@ typedef struct DrawTileSeqStruct {
static void DrawTile_Unmovable(TileInfo *ti) static void DrawTile_Unmovable(TileInfo *ti)
{ {
uint32 image, ormod; uint32 image, ormod;
if (!(ti->map5 & 0x80)) { if (!(ti->map5 & 0x80)) {
if (ti->map5 == 2) { if (ti->map5 == 2) {
// statue // statue
DrawGroundSprite(0x58C); DrawGroundSprite(0x58C);
@ -44,32 +44,32 @@ static void DrawTile_Unmovable(TileInfo *ti)
image = (image & 0x3FFF) | 0x3224000; image = (image & 0x3FFF) | 0x3224000;
AddSortableSpriteToDraw(image, ti->x, ti->y, 16, 16, 25, ti->z); AddSortableSpriteToDraw(image, ti->x, ti->y, 16, 16, 25, ti->z);
} else if (ti->map5 == 3) { } else if (ti->map5 == 3) {
// "owned by" sign // "owned by" sign
DrawClearLandTile(ti, 0); DrawClearLandTile(ti, 0);
AddSortableSpriteToDraw( AddSortableSpriteToDraw(
PLAYER_SPRITE_COLOR(_map_owner[ti->tile]) + 0x92B6, PLAYER_SPRITE_COLOR(_map_owner[ti->tile]) + 0x92B6,
ti->x+8, ti->y+8, ti->x+8, ti->y+8,
1, 1, 1, 1,
10, 10,
GetSlopeZ(ti->x+8, ti->y+8) GetSlopeZ(ti->x+8, ti->y+8)
); );
} else { } else {
// lighthouse or transmitter // lighthouse or transmitter
const DrawTileUnmovableStruct *dtus; const DrawTileUnmovableStruct *dtus;
if (ti->tileh) DrawFoundation(ti, ti->tileh); if (ti->tileh) DrawFoundation(ti, ti->tileh);
DrawClearLandTile(ti, 2); DrawClearLandTile(ti, 2);
dtus = &_draw_tile_unmovable_data[ti->map5]; dtus = &_draw_tile_unmovable_data[ti->map5];
image = dtus->image; image = dtus->image;
if (!(_display_opt & DO_TRANS_BUILDINGS)) if (!(_display_opt & DO_TRANS_BUILDINGS))
image = (image & 0x3FFF) | 0x3224000; image = (image & 0x3FFF) | 0x3224000;
AddSortableSpriteToDraw(image, AddSortableSpriteToDraw(image,
ti->x | dtus->subcoord_x, ti->x | dtus->subcoord_x,
ti->y | dtus->subcoord_y, ti->y | dtus->subcoord_y,
dtus->width, dtus->height, dtus->width, dtus->height,
@ -87,7 +87,7 @@ static void DrawTile_Unmovable(TileInfo *ti)
DrawGroundSprite(*(uint16*)t | ormod); DrawGroundSprite(*(uint16*)t | ormod);
t += sizeof(uint16); t += sizeof(uint16);
for(dtss = (DrawTileSeqStruct *)t; (byte)dtss->delta_x != 0x80; dtss++) { for(dtss = (DrawTileSeqStruct *)t; (byte)dtss->delta_x != 0x80; dtss++) {
image = dtss->image; image = dtss->image;
if (_display_opt & DO_TRANS_BUILDINGS) { if (_display_opt & DO_TRANS_BUILDINGS) {
@ -101,12 +101,12 @@ static void DrawTile_Unmovable(TileInfo *ti)
} }
} }
static uint GetSlopeZ_Unmovable(TileInfo *ti) static uint GetSlopeZ_Unmovable(TileInfo *ti)
{ {
return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z; return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
} }
static uint GetSlopeTileh_Unmovable(TileInfo *ti) static uint GetSlopeTileh_Unmovable(TileInfo *ti)
{ {
return 0; return 0;
} }
@ -114,12 +114,12 @@ static uint GetSlopeTileh_Unmovable(TileInfo *ti)
static int32 ClearTile_Unmovable(uint tile, byte flags) static int32 ClearTile_Unmovable(uint tile, byte flags)
{ {
byte m5 = _map5[tile]; byte m5 = _map5[tile];
if (m5 & 0x80) { if (m5 & 0x80) {
if (_current_player == OWNER_WATER) if (_current_player == OWNER_WATER)
return DoCommandByTile(tile, OWNER_WATER, 0, DC_EXEC, CMD_DESTROY_COMPANY_HQ); return DoCommandByTile(tile, OWNER_WATER, 0, DC_EXEC, CMD_DESTROY_COMPANY_HQ);
return_cmd_error(STR_5804_COMPANY_HEADQUARTERS_IN); return_cmd_error(STR_5804_COMPANY_HEADQUARTERS_IN);
} }
if (m5 == 3) // company owned land if (m5 == 3) // company owned land
return DoCommandByTile(tile, 0, 0, flags, CMD_SELL_LAND_AREA); return DoCommandByTile(tile, 0, 0, flags, CMD_SELL_LAND_AREA);
@ -127,8 +127,8 @@ static int32 ClearTile_Unmovable(uint tile, byte flags)
// checks if you're allowed to remove unmovable things // checks if you're allowed to remove unmovable things
if (_game_mode != GM_EDITOR && _current_player != OWNER_WATER && ((flags & DC_AUTO || !_cheats.magic_bulldozer.value)) ) if (_game_mode != GM_EDITOR && _current_player != OWNER_WATER && ((flags & DC_AUTO || !_cheats.magic_bulldozer.value)) )
return_cmd_error(STR_5800_OBJECT_IN_THE_WAY); return_cmd_error(STR_5800_OBJECT_IN_THE_WAY);
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
DoClearSquare(tile); DoClearSquare(tile);
} }
@ -171,7 +171,7 @@ static const StringID _unmovable_tile_str[] = {
STR_5802_LIGHTHOUSE, STR_5802_LIGHTHOUSE,
STR_2016_STATUE, STR_2016_STATUE,
STR_5805_COMPANY_OWNED_LAND, STR_5805_COMPANY_OWNED_LAND,
}; };
static void GetTileDesc_Unmovable(uint tile, TileDesc *td) static void GetTileDesc_Unmovable(uint tile, TileDesc *td)
{ {
@ -289,7 +289,7 @@ void GenerateUnmovables()
if (_opt.landscape == LT_DESERT) if (_opt.landscape == LT_DESERT)
return; return;
/* add lighthouses */ /* add lighthouses */
i = (Random()&3) + 7; i = (Random()&3) + 7;
do { do {
@ -297,7 +297,7 @@ restart:
r = Random(); r = Random();
dir = r >> 30; dir = r >> 30;
r = r%((dir==0 || dir== 2)?TILE_Y_MAX:TILE_X_MAX); r = r%((dir==0 || dir== 2)?TILE_Y_MAX:TILE_X_MAX);
tile = tile =
(dir==0)?TILE_XY(0,r):0 + // left (dir==0)?TILE_XY(0,r):0 + // left
(dir==1)?TILE_XY(r,0):0 + // top (dir==1)?TILE_XY(r,0):0 + // top
(dir==2)?TILE_XY(TILE_X_MAX,r):0 + // right (dir==2)?TILE_XY(TILE_X_MAX,r):0 + // right
@ -308,7 +308,7 @@ restart:
goto restart; goto restart;
tile = TILE_MASK(tile + _tile_add[dir]); tile = TILE_MASK(tile + _tile_add[dir]);
} while (!(IS_TILETYPE(tile, MP_CLEAR) && GetTileSlope(tile, &h) == 0 && h <= 16)); } while (!(IS_TILETYPE(tile, MP_CLEAR) && GetTileSlope(tile, &h) == 0 && h <= 16));
assert(tile == TILE_MASK(tile)); assert(tile == TILE_MASK(tile));
_map_type_and_height[tile] |= MP_UNMOVABLE << 4; _map_type_and_height[tile] |= MP_UNMOVABLE << 4;
@ -328,7 +328,7 @@ int32 CmdBuildCompanyHQ(int x, int y, uint32 flags, uint32 p1, uint32 p2)
Player *p = DEREF_PLAYER(_current_player); Player *p = DEREF_PLAYER(_current_player);
int score; int score;
int32 cost = 0; int32 cost = 0;
if (CheckFlatLandBelow(tile, 2, 2, flags, 0, NULL) == CMD_ERROR) if (CheckFlatLandBelow(tile, 2, 2, flags, 0, NULL) == CMD_ERROR)
return CMD_ERROR; return CMD_ERROR;
@ -404,7 +404,7 @@ static void ChangeTileOwner_Unmovable(uint tile, byte old_player, byte new_playe
{ {
if (_map_owner[tile] != old_player) if (_map_owner[tile] != old_player)
return; return;
if (_map5[tile]==3 && new_player != 255) { if (_map5[tile]==3 && new_player != 255) {
_map_owner[tile] = new_player; _map_owner[tile] = new_player;
} else { } else {

View File

@ -110,7 +110,7 @@ typedef struct Patches {
bool always_small_airport; // always allow small airports bool always_small_airport; // always allow small airports
bool realistic_acceleration; // realistic acceleration for trains bool realistic_acceleration; // realistic acceleration for trains
bool invisible_trees; // don't show trees when buildings are transparent bool invisible_trees; // don't show trees when buildings are transparent
uint8 toolbar_pos; // position of toolbars, 0=left, 1=center, 2=right uint8 toolbar_pos; // position of toolbars, 0=left, 1=center, 2=right
byte max_trains; //max trains in game per player (these are 8bit because the unitnumber field can't hold more) byte max_trains; //max trains in game per player (these are 8bit because the unitnumber field can't hold more)
@ -132,7 +132,7 @@ typedef struct Patches {
byte pf_maxdepth; // maximum recursion depth when searching for a train route for new pathfinder byte pf_maxdepth; // maximum recursion depth when searching for a train route for new pathfinder
uint16 pf_maxlength; // maximum length when searching for a train route for new pathfinder uint16 pf_maxlength; // maximum length when searching for a train route for new pathfinder
bool bridge_pillars; // show bridge pillars for high bridges bool bridge_pillars; // show bridge pillars for high bridges
bool ai_disable_veh_train; // disable types for AI bool ai_disable_veh_train; // disable types for AI
@ -169,7 +169,7 @@ typedef struct Cheat {
} Cheat; } Cheat;
// WARNING! Do _not_ remove entries in Cheats struct or change the order // WARNING! Do _not_ remove entries in Cheats struct or change the order
// of the existing ones! Would break downward compatibility. // of the existing ones! Would break downward compatibility.
// Only add new entries at the end of the struct! // Only add new entries at the end of the struct!
@ -187,7 +187,7 @@ typedef struct Cheats {
VARDEF Cheats _cheats; VARDEF Cheats _cheats;
typedef struct Paths { typedef struct Paths {
char *personal_dir; // includes cfg file and save folder char *personal_dir; // includes cfg file and save folder
char *game_data_dir; // includes data, gm, lang char *game_data_dir; // includes data, gm, lang
char *data_dir; char *data_dir;
char *gm_dir; char *gm_dir;

View File

@ -30,10 +30,10 @@ static void *EnsureNoVehicleProc(Vehicle *v, void *data)
{ {
if (v->tile != (TileIndex)(int)data || v->type == VEH_Disaster) if (v->tile != (TileIndex)(int)data || v->type == VEH_Disaster)
return NULL; return NULL;
VehicleInTheWayErrMsg(v); VehicleInTheWayErrMsg(v);
return (void*)1; return (void*)1;
} }
bool EnsureNoVehicle(TileIndex tile) bool EnsureNoVehicle(TileIndex tile)
{ {
@ -169,7 +169,7 @@ static Vehicle *InitializeVehicle(Vehicle *v)
Vehicle *ForceAllocateSpecialVehicle() Vehicle *ForceAllocateSpecialVehicle()
{ {
Vehicle *v; Vehicle *v;
for(v=_vehicles + NUM_NORMAL_VEHICLES; for(v=_vehicles + NUM_NORMAL_VEHICLES;
v!=&_vehicles[NUM_NORMAL_VEHICLES+NUM_SPECIAL_VEHICLES]; v++) { v!=&_vehicles[NUM_NORMAL_VEHICLES+NUM_SPECIAL_VEHICLES]; v++) {
if (v->type == 0) if (v->type == 0)
return InitializeVehicle(v); return InitializeVehicle(v);
@ -227,7 +227,7 @@ void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc)
while (veh != INVALID_VEHICLE) { while (veh != INVALID_VEHICLE) {
Vehicle *v = &_vehicles[veh]; Vehicle *v = &_vehicles[veh];
void *a; void *a;
if ((a = proc(v, data)) != NULL) if ((a = proc(v, data)) != NULL)
return a; return a;
veh = v->next_hash; veh = v->next_hash;
@ -259,7 +259,7 @@ void UpdateVehiclePosHash(Vehicle *v, int x, int y)
new_hash = (x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(x,y)]; new_hash = (x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(x,y)];
old_hash = (old_x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(old_x, old_y)]; old_hash = (old_x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(old_x, old_y)];
if (old_hash == new_hash) if (old_hash == new_hash)
return; return;
@ -295,7 +295,7 @@ void InitializeVehicles()
memset(&_vehicles, 0, sizeof(_vehicles)); memset(&_vehicles, 0, sizeof(_vehicles));
memset(&_checkpoints, 0, sizeof(_checkpoints)); memset(&_checkpoints, 0, sizeof(_checkpoints));
memset(&_depots, 0, sizeof(_depots)); memset(&_depots, 0, sizeof(_depots));
// setup indexes.. // setup indexes..
i = 0; i = 0;
FOR_ALL_VEHICLES(v) FOR_ALL_VEHICLES(v)
@ -334,7 +334,7 @@ Vehicle *GetFirstVehicleInChain(Vehicle *v)
if (++v == endof(_vehicles)) if (++v == endof(_vehicles))
return u; return u;
} }
} }
} }
int CountVehiclesInChain(Vehicle *v) int CountVehiclesInChain(Vehicle *v)
@ -358,13 +358,13 @@ Depot *AllocateDepot()
} }
} }
if (free_dep == NULL || if (free_dep == NULL ||
(num_free < 30 && IS_HUMAN_PLAYER(_current_player))) { (num_free < 30 && IS_HUMAN_PLAYER(_current_player))) {
_error_message = STR_1009_TOO_MANY_DEPOTS; _error_message = STR_1009_TOO_MANY_DEPOTS;
return NULL; return NULL;
} }
return free_dep; return free_dep;
} }
Checkpoint *AllocateCheckpoint() Checkpoint *AllocateCheckpoint()
@ -443,7 +443,7 @@ void DeleteCommandFromVehicleSchedule(uint cmd)
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0 && v->schedule_ptr != NULL) { if (v->type != 0 && v->schedule_ptr != NULL) {
// clear last station visited // clear last station visited
if (v->last_station_visited == (cmd>>8) && (cmd & OT_MASK) == OT_GOTO_STATION) if (v->last_station_visited == (cmd>>8) && (cmd & OT_MASK) == OT_GOTO_STATION)
v->last_station_visited = 0xFF; v->last_station_visited = 0xFF;
@ -459,7 +459,7 @@ void DeleteCommandFromVehicleSchedule(uint cmd)
sched = v->schedule_ptr; sched = v->schedule_ptr;
while ((order=*sched++) != 0) { while ((order=*sched++) != 0) {
if ( (order & (OT_MASK|0xFF00)) == cmd) { if ( (order & (OT_MASK|0xFF00)) == cmd) {
sched[-1] = OT_DUMMY; sched[-1] = OT_DUMMY;
need_invalidate = true; need_invalidate = true;
} }
} }
@ -538,7 +538,7 @@ void CallVehicleTicks()
static bool CanFillVehicle_FullLoadAny(Vehicle *v) static bool CanFillVehicle_FullLoadAny(Vehicle *v)
{ {
uint32 full = 0, not_full = 0; uint32 full = 0, not_full = 0;
// patch should return "true" to continue loading, i.e. when there is no cargo type that is fully loaded. // patch should return "true" to continue loading, i.e. when there is no cargo type that is fully loaded.
do { do {
//Should never happen, but just in case future additions change this //Should never happen, but just in case future additions change this
@ -559,7 +559,7 @@ bool CanFillVehicle(Vehicle *v)
byte *t = &_map_type_and_height[v->tile]; byte *t = &_map_type_and_height[v->tile];
if (t[0] >> 4 == MP_STATION || if (t[0] >> 4 == MP_STATION ||
(v->type == VEH_Ship && (v->type == VEH_Ship &&
(t[TILE_XY(1,0)] >> 4 == MP_STATION || (t[TILE_XY(1,0)] >> 4 == MP_STATION ||
t[TILE_XY(-1,0)] >> 4 == MP_STATION || t[TILE_XY(-1,0)] >> 4 == MP_STATION ||
t[TILE_XY(0,1)] >> 4 == MP_STATION || t[TILE_XY(0,1)] >> 4 == MP_STATION ||
@ -581,14 +581,14 @@ bool CanFillVehicle(Vehicle *v)
static void DoDrawVehicle(Vehicle *v) static void DoDrawVehicle(Vehicle *v)
{ {
uint32 image = v->cur_image; uint32 image = v->cur_image;
if (v->vehstatus & VS_DISASTER) { if (v->vehstatus & VS_DISASTER) {
image |= 0x3224000; image |= 0x3224000;
} else if (v->vehstatus & VS_DEFPAL) { } else if (v->vehstatus & VS_DEFPAL) {
image |= (v->vehstatus & VS_CRASHED) ? 0x3248000 : SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner)); image |= (v->vehstatus & VS_CRASHED) ? 0x3248000 : SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
} }
AddSortableSpriteToDraw(image, v->x_pos + v->x_offs, v->y_pos + v->y_offs, AddSortableSpriteToDraw(image, v->x_pos + v->x_offs, v->y_pos + v->y_offs,
v->sprite_width, v->sprite_height, v->z_height, v->z_pos); v->sprite_width, v->sprite_height, v->z_height, v->z_pos);
} }
@ -610,12 +610,12 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
veh = _vehicle_position_hash[ (x+y)&0xFFFF ]; veh = _vehicle_position_hash[ (x+y)&0xFFFF ];
while (veh != INVALID_VEHICLE) { while (veh != INVALID_VEHICLE) {
v = &_vehicles[veh]; v = &_vehicles[veh];
if (!(v->vehstatus & VS_HIDDEN) && if (!(v->vehstatus & VS_HIDDEN) &&
dpi->left <= v->right_coord && dpi->left <= v->right_coord &&
dpi->top <= v->bottom_coord && dpi->top <= v->bottom_coord &&
dpi->left + dpi->width >= v->left_coord && dpi->left + dpi->width >= v->left_coord &&
dpi->top + dpi->height >= v->top_coord) { dpi->top + dpi->height >= v->top_coord) {
DoDrawVehicle(v); DoDrawVehicle(v);
} }
veh = v->next_hash; veh = v->next_hash;
@ -647,7 +647,7 @@ static void EffectTick_0(Vehicle *v)
if (--v->progress & 0x80) { if (--v->progress & 0x80) {
BeginVehicleMove(v); BeginVehicleMove(v);
tile = TILE_FROM_XY(v->x_pos, v->y_pos); tile = TILE_FROM_XY(v->x_pos, v->y_pos);
if (!IS_TILETYPE(tile, MP_INDUSTRY)) { if (!IS_TILETYPE(tile, MP_INDUSTRY)) {
EndVehicleMove(v); EndVehicleMove(v);
@ -673,11 +673,11 @@ static void EffectInit_1(Vehicle *v)
static void EffectTick_1(Vehicle *v) static void EffectTick_1(Vehicle *v)
{ {
bool moved; bool moved;
BeginVehicleMove(v); BeginVehicleMove(v);
moved = false; moved = false;
if ((++v->progress & 7) == 0) { if ((++v->progress & 7) == 0) {
v->z_pos++; v->z_pos++;
moved = true; moved = true;
@ -753,11 +753,11 @@ static void EffectInit_4(Vehicle *v)
static void EffectTick_4(Vehicle *v) static void EffectTick_4(Vehicle *v)
{ {
bool moved; bool moved;
BeginVehicleMove(v); BeginVehicleMove(v);
moved = false; moved = false;
if ((++v->progress & 3) == 0) { if ((++v->progress & 3) == 0) {
v->z_pos++; v->z_pos++;
moved = true; moved = true;
@ -1095,8 +1095,8 @@ again:
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
return; return;
} }
if (*b == 0x81) { if (*b == 0x81) {
if (v->z_pos > 180 || CHANCE16(1,96)) { if (v->z_pos > 180 || CHANCE16(1,96)) {
v->spritenum = 5; v->spritenum = 5;
@ -1104,8 +1104,8 @@ again:
} }
et = 0; et = 0;
goto again; goto again;
} }
if (*b == 0x82) { if (*b == 0x82) {
uint tile; uint tile;
@ -1163,7 +1163,7 @@ static EffectTickProc * const _effect_tick_procs[] = {
Vehicle *CreateEffectVehicle(int x, int y, int z, int type) Vehicle *CreateEffectVehicle(int x, int y, int z, int type)
{ {
Vehicle *v; Vehicle *v;
v = ForceAllocateSpecialVehicle(); v = ForceAllocateSpecialVehicle();
if (v != NULL) { if (v != NULL) {
v->type = VEH_Special; v->type = VEH_Special;
@ -1213,10 +1213,10 @@ Vehicle *CheckClickOnVehicle(ViewPort *vp, int x, int y)
y = (y << vp->zoom) + vp->virtual_top; y = (y << vp->zoom) + vp->virtual_top;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type != 0 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 && if (v->type != 0 && (v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 &&
x >= v->left_coord && x <= v->right_coord && x >= v->left_coord && x <= v->right_coord &&
y >= v->top_coord && y <= v->bottom_coord) { y >= v->top_coord && y <= v->bottom_coord) {
dist = max( dist = max(
myabs( ((v->left_coord + v->right_coord)>>1) - x ), myabs( ((v->left_coord + v->right_coord)>>1) - x ),
myabs( ((v->top_coord + v->bottom_coord)>>1) - y ) myabs( ((v->top_coord + v->bottom_coord)>>1) - y )
@ -1275,7 +1275,7 @@ void CheckVehicleBreakdown(Vehicle *v)
/* calculate reliability value to use in comparison */ /* calculate reliability value to use in comparison */
rel = v->reliability; rel = v->reliability;
if (v->type == VEH_Ship) rel += 0x6666; if (v->type == VEH_Ship) rel += 0x6666;
/* disabled breakdowns? */ /* disabled breakdowns? */
if (_opt.diff.vehicle_breakdowns < 1) if (_opt.diff.vehicle_breakdowns < 1)
return; return;
@ -1320,8 +1320,8 @@ void AgeVehicle(Vehicle *v)
age = v->age - v->max_age; age = v->age - v->max_age;
if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4) if (age == 366*0 || age == 366*1 || age == 366*2 || age == 366*3 || age == 366*4)
v->reliability_spd_dec <<= 1; v->reliability_spd_dec <<= 1;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
if (age == -366) { if (age == -366) {
@ -1343,7 +1343,7 @@ void MaybeRenewVehicle(Vehicle *v, int32 build_cost)
// It can be any value between -12 and 12. // It can be any value between -12 and 12.
if (!_patches.autorenew || v->age - v->max_age < (_patches.autorenew_months * 30)) if (!_patches.autorenew || v->age - v->max_age < (_patches.autorenew_months * 30))
return; return;
if (DEREF_PLAYER(v->owner)->money64 < _patches.autorenew_money + build_cost - v->value) { if (DEREF_PLAYER(v->owner)->money64 < _patches.autorenew_money + build_cost - v->value) {
if (v->owner == _local_player) { if (v->owner == _local_player) {
int message; int message;
@ -1361,7 +1361,7 @@ void MaybeRenewVehicle(Vehicle *v, int32 build_cost)
} }
return; return;
} }
// Withdraw the money from the right player ;) // Withdraw the money from the right player ;)
_current_player = v->owner; _current_player = v->owner;
@ -1376,7 +1376,7 @@ void MaybeRenewVehicle(Vehicle *v, int32 build_cost)
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
SubtractMoneyFromPlayer(build_cost - v->value); SubtractMoneyFromPlayer(build_cost - v->value);
v->value = build_cost; v->value = build_cost;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index); InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
} }
@ -1394,7 +1394,7 @@ int32 CmdNameVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
str = AllocateName((byte*)_decode_parameters, 2); str = AllocateName((byte*)_decode_parameters, 2);
if (str == 0) if (str == 0)
return CMD_ERROR; return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
StringID old_str = v->string_id; StringID old_str = v->string_id;
v->string_id = str; v->string_id = str;
@ -1490,10 +1490,10 @@ byte GetDirectionTowards(Vehicle *v, int x, int y)
* bit 0x8 set, the vehicle could not and did not enter the tile. Are there * bit 0x8 set, the vehicle could not and did not enter the tile. Are there
* other bits that can be set? */ * other bits that can be set? */
uint32 VehicleEnterTile(Vehicle *v, uint tile, int x, int y) uint32 VehicleEnterTile(Vehicle *v, uint tile, int x, int y)
{ {
uint old_tile = v->tile; uint old_tile = v->tile;
uint32 result = _tile_type_procs[GET_TILETYPE(tile)]->vehicle_enter_tile_proc(v, tile, x, y); uint32 result = _tile_type_procs[GET_TILETYPE(tile)]->vehicle_enter_tile_proc(v, tile, x, y);
/* When vehicle_enter_tile_proc returns 8, that apparently means that /* When vehicle_enter_tile_proc returns 8, that apparently means that
* we cannot enter the tile at all. In that case, don't call * we cannot enter the tile at all. In that case, don't call
* leave_tile. */ * leave_tile. */
@ -1513,7 +1513,7 @@ uint GetFreeUnitNumber(byte type)
restart: restart:
unit_num++; unit_num++;
FOR_ALL_VEHICLES(u) { FOR_ALL_VEHICLES(u) {
if (u->type == type && u->owner == _current_player && if (u->type == type && u->owner == _current_player &&
unit_num == u->unitnumber) unit_num == u->unitnumber)
goto restart; goto restart;
} }
@ -1524,7 +1524,7 @@ restart:
// Save and load of vehicles // Save and load of vehicles
const byte _common_veh_desc[] = { const byte _common_veh_desc[] = {
SLE_VAR(Vehicle,subtype, SLE_UINT8), SLE_VAR(Vehicle,subtype, SLE_UINT8),
SLE_VAR(Vehicle,next_in_chain_old, SLE_UINT16), SLE_VAR(Vehicle,next_in_chain_old, SLE_UINT16),
SLE_VAR(Vehicle,string_id, SLE_STRINGID), SLE_VAR(Vehicle,string_id, SLE_STRINGID),
SLE_VAR(Vehicle,unitnumber, SLE_UINT8), SLE_VAR(Vehicle,unitnumber, SLE_UINT8),
@ -1589,7 +1589,7 @@ const byte _common_veh_desc[] = {
// reserve extra space in savegame here. (currently 16 bytes) // reserve extra space in savegame here. (currently 16 bytes)
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255), SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 2, 2, 255),
SLE_END() SLE_END()
}; };
@ -1646,7 +1646,7 @@ static const byte _aircraft_desc[] = {
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,pos), SLE_UINT8), SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,pos), SLE_UINT8),
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,targetairport), SLE_UINT8), SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,targetairport), SLE_UINT8),
SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,state), SLE_UINT8), SLE_VARX(offsetof(Vehicle,u)+offsetof(VehicleAir,state), SLE_UINT8),
SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleAir,previous_pos), SLE_UINT8, 2, 255), SLE_CONDVARX(offsetof(Vehicle,u)+offsetof(VehicleAir,previous_pos), SLE_UINT8, 2, 255),
// reserve extra space in savegame here. (currently 15 bytes) // reserve extra space in savegame here. (currently 15 bytes)
@ -1659,7 +1659,7 @@ static const byte _special_desc[] = {
SLE_WRITEBYTE(Vehicle,type,VEH_Special, 4), SLE_WRITEBYTE(Vehicle,type,VEH_Special, 4),
SLE_VAR(Vehicle,subtype, SLE_UINT8), SLE_VAR(Vehicle,subtype, SLE_UINT8),
SLE_VAR(Vehicle,tile, SLE_UINT16), SLE_VAR(Vehicle,tile, SLE_UINT16),
SLE_VAR(Vehicle,x_pos, SLE_INT16), SLE_VAR(Vehicle,x_pos, SLE_INT16),

View File

@ -6,8 +6,8 @@
typedef struct VehicleRail { typedef struct VehicleRail {
uint16 last_speed; // NOSAVE: only used in UI uint16 last_speed; // NOSAVE: only used in UI
uint16 crash_anim_pos; uint16 crash_anim_pos;
uint16 days_since_order_progr; uint16 days_since_order_progr;
uint16 cached_weight; // cached power and weight for the vehicle. uint16 cached_weight; // cached power and weight for the vehicle.
uint32 cached_power; // no need to save those, they are recomputed on load. uint32 cached_power; // no need to save those, they are recomputed on load.
@ -69,7 +69,7 @@ struct WorldSprite {
// screen coordinates // screen coordinates
int16 left, top, right, bottom; int16 left, top, right, bottom;
// world coordinates // world coordinates
int16 x; int16 x;
int16 y; int16 y;
@ -126,7 +126,7 @@ struct Vehicle {
byte vehstatus; // Status byte vehstatus; // Status
byte last_station_visited; byte last_station_visited;
byte cargo_type; // type of cargo this vehicle is carrying byte cargo_type; // type of cargo this vehicle is carrying
byte cargo_days; // how many days have the pieces been in transit byte cargo_days; // how many days have the pieces been in transit
byte cargo_source;// source of cargo byte cargo_source;// source of cargo
@ -162,7 +162,7 @@ struct Vehicle {
byte build_year; byte build_year;
uint16 load_unload_time_rem; uint16 load_unload_time_rem;
int32 profit_this_year; int32 profit_this_year;
int32 profit_last_year; int32 profit_last_year;
uint32 value; uint32 value;
@ -379,7 +379,7 @@ enum {
NUM_NORMAL_VEHICLES = 2048, NUM_NORMAL_VEHICLES = 2048,
NUM_SPECIAL_VEHICLES = 512, NUM_SPECIAL_VEHICLES = 512,
NUM_VEHICLES = NUM_NORMAL_VEHICLES + NUM_SPECIAL_VEHICLES NUM_VEHICLES = NUM_NORMAL_VEHICLES + NUM_SPECIAL_VEHICLES
}; };
VARDEF Vehicle _vehicles[NUM_VEHICLES]; VARDEF Vehicle _vehicles[NUM_VEHICLES];

View File

@ -96,7 +96,7 @@ int CDECL VehicleNameSorter(const void *a, const void *b)
} }
r = strcmp(buf1, _bufcache); // sort by name r = strcmp(buf1, _bufcache); // sort by name
if (r == 0) // if the sorting criteria had the same value, sort by unitnumber if (r == 0) // if the sorting criteria had the same value, sort by unitnumber
r = va->unitnumber - vb->unitnumber; r = va->unitnumber - vb->unitnumber;
@ -120,7 +120,7 @@ int CDECL VehicleProfitThisYearSorter(const void *a, const void *b)
const Vehicle *va = DEREF_VEHICLE((*(const SortStruct*)a).index); const Vehicle *va = DEREF_VEHICLE((*(const SortStruct*)a).index);
const Vehicle *vb = DEREF_VEHICLE((*(const SortStruct*)b).index); const Vehicle *vb = DEREF_VEHICLE((*(const SortStruct*)b).index);
int r = va->profit_this_year - vb->profit_this_year; int r = va->profit_this_year - vb->profit_this_year;
if (r == 0) // if the sorting criteria had the same value, sort by unitnumber if (r == 0) // if the sorting criteria had the same value, sort by unitnumber
r = va->unitnumber - vb->unitnumber; r = va->unitnumber - vb->unitnumber;
@ -191,4 +191,4 @@ int CDECL VehicleMaxSpeedSorter(const void *a, const void *b)
r = va->unitnumber - vb->unitnumber; r = va->unitnumber - vb->unitnumber;
return (_internal_sort_order & 1) ? -r : r; return (_internal_sort_order & 1) ? -r : r;
} }

View File

@ -48,9 +48,9 @@ typedef struct ParentSpriteToDraw {
typedef struct ViewportDrawer { typedef struct ViewportDrawer {
DrawPixelInfo dpi; DrawPixelInfo dpi;
byte *spritelist_mem, *eof_spritelist_mem; byte *spritelist_mem, *eof_spritelist_mem;
StringSpriteToDraw **last_string, *first_string; StringSpriteToDraw **last_string, *first_string;
TileSpriteToDraw **last_tile, *first_tile; TileSpriteToDraw **last_tile, *first_tile;
@ -79,7 +79,7 @@ Point MapXYZToViewport(ViewPort *vp, uint x, uint y, uint z)
return p; return p;
} }
void AssignWindowViewport(Window *w, int x, int y, void AssignWindowViewport(Window *w, int x, int y,
int width, int height, uint32 follow_flags, byte zoom) int width, int height, uint32 follow_flags, byte zoom)
{ {
ViewPort *vp; ViewPort *vp;
@ -98,7 +98,7 @@ void AssignWindowViewport(Window *w, int x, int y,
vp->top = y + w->top; vp->top = y + w->top;
vp->width = width; vp->width = width;
vp->height = height; vp->height = height;
vp->zoom = zoom; vp->zoom = zoom;
vp->virtual_width = width << zoom; vp->virtual_width = width << zoom;
@ -133,7 +133,7 @@ static void DoSetViewportPosition(Window *w, int left, int top, int width, int h
w->left+w->width > left && w->left+w->width > left &&
top + height > w->top && top + height > w->top &&
w->top+w->height > top) { w->top+w->height > top) {
if (left < w->left) { if (left < w->left) {
DoSetViewportPosition(w, left, top, w->left - left, height); DoSetViewportPosition(w, left, top, w->left - left, height);
DoSetViewportPosition(w, left + (w->left - left), top, width - (w->left - left), height); DoSetViewportPosition(w, left + (w->left - left), top, width - (w->left - left), height);
@ -234,7 +234,7 @@ void SetViewportPosition(Window *w, int x, int y)
height += top; height += top;
top = 0; top = 0;
} }
if ( (i=(top + height - _screen.height)) >= 0) { if ( (i=(top + height - _screen.height)) >= 0) {
height -= i; height -= i;
} }
@ -285,7 +285,7 @@ Point TranslateXYToTileCoord(ViewPort *vp, int x, int y) {
pt.x = a+z; pt.x = a+z;
pt.y = b+z; pt.y = b+z;
if ((uint)pt.x >= TILE_X_MAX*16 || (uint)pt.y >= TILE_Y_MAX*16) { if ((uint)pt.x >= TILE_X_MAX*16 || (uint)pt.y >= TILE_Y_MAX*16) {
pt.x = pt.y = -1; pt.x = pt.y = -1;
} }
@ -294,12 +294,12 @@ Point TranslateXYToTileCoord(ViewPort *vp, int x, int y) {
} }
static Point GetTileFromScreenXY(int x, int y) static Point GetTileFromScreenXY(int x, int y)
{ {
Window *w; Window *w;
ViewPort *vp; ViewPort *vp;
Point pt; Point pt;
if ( (w = FindWindowFromPt(x, y)) != NULL && if ( (w = FindWindowFromPt(x, y)) != NULL &&
(vp = IsPtInWindowViewport(w, x, y)) != NULL) (vp = IsPtInWindowViewport(w, x, y)) != NULL)
return TranslateXYToTileCoord(vp, x, y); return TranslateXYToTileCoord(vp, x, y);
@ -335,7 +335,7 @@ void DrawGroundSpriteAt(uint32 image, int16 x, int16 y, byte z)
{ {
ViewportDrawer *vd = _cur_vd; ViewportDrawer *vd = _cur_vd;
TileSpriteToDraw *ts; TileSpriteToDraw *ts;
assert( (image & 0x3fff) < NUM_SPRITES); assert( (image & 0x3fff) < NUM_SPRITES);
ts = (TileSpriteToDraw*)vd->spritelist_mem; ts = (TileSpriteToDraw*)vd->spritelist_mem;
@ -345,14 +345,14 @@ void DrawGroundSpriteAt(uint32 image, int16 x, int16 y, byte z)
} }
vd->spritelist_mem += sizeof(TileSpriteToDraw); vd->spritelist_mem += sizeof(TileSpriteToDraw);
ts->image = image; ts->image = image;
ts->next = NULL; ts->next = NULL;
ts->x = x; ts->x = x;
ts->y = y; ts->y = y;
ts->z = z; ts->z = z;
*vd->last_tile = ts; *vd->last_tile = ts;
vd->last_tile = &ts->next; vd->last_tile = &ts->next;
} }
void DrawGroundSprite(uint32 image) void DrawGroundSprite(uint32 image)
@ -384,7 +384,7 @@ static void AddCombinedSprite(uint32 image, int x, int y, byte z)
sd = GetSpriteDimension(image & 0x3FFF); sd = GetSpriteDimension(image & 0x3FFF);
if ((t = pt.x + sd->xoffs) >= vd->dpi.left + vd->dpi.width || if ((t = pt.x + sd->xoffs) >= vd->dpi.left + vd->dpi.width ||
(t + sd->xsize) <= vd->dpi.left || (t + sd->xsize) <= vd->dpi.left ||
(t = pt.y + sd->yoffs) >= vd->dpi.top + vd->dpi.height || (t = pt.y + sd->yoffs) >= vd->dpi.top + vd->dpi.height ||
(t + sd->ysize) <= vd->dpi.top) (t + sd->ysize) <= vd->dpi.top)
@ -417,16 +417,16 @@ void AddSortableSpriteToDraw(uint32 image, int x, int y, int w, int h, byte dz,
} }
if (vd->parent_list >= vd->eof_parent_list) { if (vd->parent_list >= vd->eof_parent_list) {
// This can happen rarely, mostly when you zoom out completely // This can happen rarely, mostly when you zoom out completely
// and have a lot of stuff that moves (and is added to the // and have a lot of stuff that moves (and is added to the
// sort-list, this function). To solve it, increase // sort-list, this function). To solve it, increase
// parent_list somewhere below to a higher number. // parent_list somewhere below to a higher number.
// This can not really hurt you, it just gives some black // This can not really hurt you, it just gives some black
// spots on the screen ;) // spots on the screen ;)
DEBUG(misc, 0) ("Out of sprite mem (parent_list)\n"); DEBUG(misc, 0) ("Out of sprite mem (parent_list)\n");
return; return;
} }
vd->spritelist_mem += sizeof(ParentSpriteToDraw); vd->spritelist_mem += sizeof(ParentSpriteToDraw);
ps->image = image; ps->image = image;
ps->tile_x = x; ps->tile_x = x;
@ -441,7 +441,7 @@ void AddSortableSpriteToDraw(uint32 image, int x, int y, int w, int h, byte dz,
pt = RemapCoords(x, y, z); pt = RemapCoords(x, y, z);
sd = GetSpriteDimension(image & 0x3FFF); sd = GetSpriteDimension(image & 0x3FFF);
if ((ps->left = (pt.x += sd->xoffs)) >= vd->dpi.left + vd->dpi.width || if ((ps->left = (pt.x += sd->xoffs)) >= vd->dpi.left + vd->dpi.width ||
(ps->right = (pt.x + sd->xsize)) <= vd->dpi.left || (ps->right = (pt.x + sd->xsize)) <= vd->dpi.left ||
(ps->top = (pt.y += sd->yoffs)) >= vd->dpi.top + vd->dpi.height || (ps->top = (pt.y += sd->yoffs)) >= vd->dpi.top + vd->dpi.height ||
(ps->bottom = (pt.y + sd->ysize)) <= vd->dpi.top) { (ps->bottom = (pt.y + sd->ysize)) <= vd->dpi.top) {
@ -473,7 +473,7 @@ void AddChildSpriteScreen(uint32 image, int x, int y)
{ {
ViewportDrawer *vd = _cur_vd; ViewportDrawer *vd = _cur_vd;
ChildScreenSpriteToDraw *cs; ChildScreenSpriteToDraw *cs;
assert( (image & 0x3fff) < NUM_SPRITES); assert( (image & 0x3fff) < NUM_SPRITES);
cs = (ChildScreenSpriteToDraw*) vd->spritelist_mem; cs = (ChildScreenSpriteToDraw*) vd->spritelist_mem;
@ -484,8 +484,8 @@ void AddChildSpriteScreen(uint32 image, int x, int y)
if (vd->last_child == NULL) if (vd->last_child == NULL)
return; return;
vd->spritelist_mem += sizeof(ChildScreenSpriteToDraw); vd->spritelist_mem += sizeof(ChildScreenSpriteToDraw);
*vd->last_child = cs; *vd->last_child = cs;
vd->last_child = &cs->next; vd->last_child = &cs->next;
@ -602,7 +602,7 @@ static bool IsPartOfAutoLine(int px, int py)
default: default:
NOT_REACHED(); NOT_REACHED();
} }
/* useless, but avoids compiler warning this way */ /* useless, but avoids compiler warning this way */
return 0; return 0;
} }
@ -615,7 +615,7 @@ static void DrawTileSelection(const TileInfo *ti)
#ifdef DEBUG_TILE_PUSH #ifdef DEBUG_TILE_PUSH
dbg_draw_pushed(ti); dbg_draw_pushed(ti);
#endif #endif
// Draw a red error square? // Draw a red error square?
if (thd->redsq != 0 && thd->redsq == (TileIndex)ti->tile) { if (thd->redsq != 0 && thd->redsq == (TileIndex)ti->tile) {
DrawSelectionSprite(0x030382F0 | _tileh_to_sprite[ti->tileh], ti); DrawSelectionSprite(0x030382F0 | _tileh_to_sprite[ti->tileh], ti);
@ -636,8 +636,8 @@ static void DrawTileSelection(const TileInfo *ti)
// Figure out the Z coordinate for the single dot. // Figure out the Z coordinate for the single dot.
byte z = ti->z; byte z = ti->z;
if (ti->tileh & 8) { if (ti->tileh & 8) {
z += 8; z += 8;
if (!(ti->tileh & 2) && (ti->tileh & 0x10)) { if (!(ti->tileh & 2) && (ti->tileh & 0x10)) {
z += 8; z += 8;
} }
} }
@ -689,14 +689,14 @@ void ViewportAddLandscape()
assert(width > 0); assert(width > 0);
assert(height > 0); assert(height > 0);
direction = false; direction = false;
do { do {
int width_cur = width; int width_cur = width;
int x_cur = x; int x_cur = x;
int y_cur = y; int y_cur = y;
do { do {
FindLandscapeHeight(&ti, x_cur, y_cur); FindLandscapeHeight(&ti, x_cur, y_cur);
#if !defined(NEW_ROTATION) #if !defined(NEW_ROTATION)
@ -708,11 +708,11 @@ void ViewportAddLandscape()
#endif #endif
_added_tile_sprite = false; _added_tile_sprite = false;
_offset_ground_sprites = false; _offset_ground_sprites = false;
DrawTile(&ti); DrawTile(&ti);
DrawTileSelection(&ti); DrawTileSelection(&ti);
} while (--width_cur); } while (--width_cur);
#if !defined(NEW_ROTATION) #if !defined(NEW_ROTATION)
if ( (direction^=1) != 0) if ( (direction^=1) != 0)
y += 0x10; y += 0x10;
@ -724,7 +724,7 @@ void ViewportAddLandscape()
else else
y -= 0x10; y -= 0x10;
#endif #endif
} while (--height); } while (--height);
} }
@ -748,7 +748,7 @@ void ViewportAddTownNames(DrawPixelInfo *dpi)
top < t->sign.top + 12 && top < t->sign.top + 12 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_1) { left < t->sign.left + t->sign.width_1) {
AddStringToDraw(t->sign.left + 1, t->sign.top + 1, STR_2001, t->townnametype, t->townnameparts); AddStringToDraw(t->sign.left + 1, t->sign.top + 1, STR_2001, t->townnametype, t->townnameparts);
} }
} }
@ -762,9 +762,9 @@ void ViewportAddTownNames(DrawPixelInfo *dpi)
top < t->sign.top + 24 && top < t->sign.top + 24 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_1*2) { left < t->sign.left + t->sign.width_1*2) {
AddStringToDraw(t->sign.left + 1, t->sign.top + 1, STR_2001, t->townnametype, t->townnameparts); AddStringToDraw(t->sign.left + 1, t->sign.top + 1, STR_2001, t->townnametype, t->townnameparts);
} }
} }
} else { } else {
right += 4; right += 4;
@ -777,10 +777,10 @@ void ViewportAddTownNames(DrawPixelInfo *dpi)
top < t->sign.top + 24 && top < t->sign.top + 24 &&
right > t->sign.left && right > t->sign.left &&
left < t->sign.left + t->sign.width_2*4) { left < t->sign.left + t->sign.width_2*4) {
AddStringToDraw(t->sign.left + 5, t->sign.top + 1, STR_2002, t->townnametype, t->townnameparts); AddStringToDraw(t->sign.left + 5, t->sign.top + 1, STR_2002, t->townnametype, t->townnameparts);
AddStringToDraw(t->sign.left + 1, t->sign.top - 3, STR_2003, t->townnametype, t->townnameparts); AddStringToDraw(t->sign.left + 1, t->sign.top - 3, STR_2003, t->townnametype, t->townnameparts);
} }
} }
} }
} }
@ -806,7 +806,7 @@ void ViewportAddStationNames(DrawPixelInfo *dpi)
top < st->sign.top + 12 && top < st->sign.top + 12 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_1) { left < st->sign.left + st->sign.width_1) {
sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305C_0, st->index, st->facilities); sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305C_0, st->index, st->facilities);
if (sstd != NULL) { if (sstd != NULL) {
sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner]; sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner];
@ -824,7 +824,7 @@ void ViewportAddStationNames(DrawPixelInfo *dpi)
top < st->sign.top + 24 && top < st->sign.top + 24 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_1*2) { left < st->sign.left + st->sign.width_1*2) {
sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305C_0, st->index, st->facilities); sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305C_0, st->index, st->facilities);
if (sstd != NULL) { if (sstd != NULL) {
sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner]; sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner];
@ -845,7 +845,7 @@ void ViewportAddStationNames(DrawPixelInfo *dpi)
top < st->sign.top + 24 && top < st->sign.top + 24 &&
right > st->sign.left && right > st->sign.left &&
left < st->sign.left + st->sign.width_2*4) { left < st->sign.left + st->sign.width_2*4) {
sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305D_0, st->index, st->facilities); sstd=AddStringToDraw(st->sign.left + 1, st->sign.top + 1, STR_305D_0, st->index, st->facilities);
if (sstd != NULL) { if (sstd != NULL) {
sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner]; sstd->color = (st->owner == OWNER_NONE || !st->facilities) ? 0xE : _player_colors[st->owner];
@ -877,14 +877,14 @@ void ViewportAddSigns(DrawPixelInfo *dpi)
top < ss->sign.top + 12 && top < ss->sign.top + 12 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_1) { left < ss->sign.left + ss->sign.width_1) {
sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2806, ss->str, 0); sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2806, ss->str, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = ss->sign.width_1; sstd->width = ss->sign.width_1;
sstd->color = 14; sstd->color = 14;
} }
} }
} }
} else if (dpi->zoom == 1) { } else if (dpi->zoom == 1) {
right += 2; right += 2;
bottom += 2; bottom += 2;
@ -894,14 +894,14 @@ void ViewportAddSigns(DrawPixelInfo *dpi)
top < ss->sign.top + 24 && top < ss->sign.top + 24 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_1*2) { left < ss->sign.left + ss->sign.width_1*2) {
sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2806, ss->str, 0); sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2806, ss->str, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = ss->sign.width_1; sstd->width = ss->sign.width_1;
sstd->color = 14; sstd->color = 14;
} }
} }
} }
} else { } else {
right += 4; right += 4;
bottom += 5; bottom += 5;
@ -912,14 +912,14 @@ void ViewportAddSigns(DrawPixelInfo *dpi)
top < ss->sign.top + 24 && top < ss->sign.top + 24 &&
right > ss->sign.left && right > ss->sign.left &&
left < ss->sign.left + ss->sign.width_2*4) { left < ss->sign.left + ss->sign.width_2*4) {
sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2807, ss->str, 0); sstd=AddStringToDraw(ss->sign.left + 1, ss->sign.top + 1, STR_2807, ss->str, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = ss->sign.width_2 | 0x8000; sstd->width = ss->sign.width_2 | 0x8000;
sstd->color = 14; sstd->color = 14;
} }
} }
} }
} }
} }
@ -945,14 +945,14 @@ void ViewportAddCheckpoints(DrawPixelInfo *dpi)
top < cp->sign.top + 12 && top < cp->sign.top + 12 &&
right > cp->sign.left && right > cp->sign.left &&
left < cp->sign.left + cp->sign.width_1) { left < cp->sign.left + cp->sign.width_1) {
sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT, cp - _checkpoints, 0); sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT, cp - _checkpoints, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = cp->sign.width_1; sstd->width = cp->sign.width_1;
sstd->color = (cp->deleted ? 0xE : 11); sstd->color = (cp->deleted ? 0xE : 11);
} }
} }
} }
} else if (dpi->zoom == 1) { } else if (dpi->zoom == 1) {
right += 2; right += 2;
bottom += 2; bottom += 2;
@ -962,14 +962,14 @@ void ViewportAddCheckpoints(DrawPixelInfo *dpi)
top < cp->sign.top + 24 && top < cp->sign.top + 24 &&
right > cp->sign.left && right > cp->sign.left &&
left < cp->sign.left + cp->sign.width_1*2) { left < cp->sign.left + cp->sign.width_1*2) {
sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT, cp - _checkpoints, 0); sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT, cp - _checkpoints, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = cp->sign.width_1; sstd->width = cp->sign.width_1;
sstd->color = (cp->deleted ? 0xE : 11); sstd->color = (cp->deleted ? 0xE : 11);
} }
} }
} }
} else { } else {
right += 4; right += 4;
bottom += 5; bottom += 5;
@ -980,14 +980,14 @@ void ViewportAddCheckpoints(DrawPixelInfo *dpi)
top < cp->sign.top + 24 && top < cp->sign.top + 24 &&
right > cp->sign.left && right > cp->sign.left &&
left < cp->sign.left + cp->sign.width_2*4) { left < cp->sign.left + cp->sign.width_2*4) {
sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT_TINY, cp - _checkpoints, 0); sstd=AddStringToDraw(cp->sign.left + 1, cp->sign.top + 1, STR_CHECKPOINT_VIEWPORT_TINY, cp - _checkpoints, 0);
if (sstd != NULL) { if (sstd != NULL) {
sstd->width = cp->sign.width_2 | 0x8000; sstd->width = cp->sign.width_2 | 0x8000;
sstd->color = (cp->deleted ? 0xE : 11); sstd->color = (cp->deleted ? 0xE : 11);
} }
} }
} }
} }
} }
@ -1011,7 +1011,7 @@ void UpdateViewportSignPos(ViewportSign *sign, int left, int top, StringID str)
void ViewportDrawTileSprites(TileSpriteToDraw *ts) void ViewportDrawTileSprites(TileSpriteToDraw *ts)
{ {
do { do {
Point pt = RemapCoords(ts->x, ts->y, ts->z); Point pt = RemapCoords(ts->x, ts->y, ts->z);
DrawSprite(ts->image, pt.x, pt.y); DrawSprite(ts->image, pt.x, pt.y);
@ -1026,7 +1026,7 @@ void ViewportSortParentSprites(ParentSpriteToDraw **psd)
if (!(ps->unk16 & 1)) { if (!(ps->unk16 & 1)) {
ps->unk16 |= 1; ps->unk16 |= 1;
psd2 = psd; psd2 = psd;
while ( (ps2=*++psd2) != NULL) { while ( (ps2=*++psd2) != NULL) {
if (ps2->unk16 & 1) if (ps2->unk16 & 1)
continue; continue;
@ -1075,7 +1075,7 @@ void ViewportDrawStrings(DrawPixelInfo *dpi, StringSpriteToDraw *ss)
{ {
DrawPixelInfo dp; DrawPixelInfo dp;
byte zoom; byte zoom;
_cur_dpi = &dp; _cur_dpi = &dp;
dp = *dpi; dp = *dpi;
@ -1090,7 +1090,7 @@ void ViewportDrawStrings(DrawPixelInfo *dpi, StringSpriteToDraw *ss)
do { do {
if (ss->width != 0) { if (ss->width != 0) {
int x, y, w, bottom; int x, y, w, bottom;
x = (ss->x >> zoom) - 1; x = (ss->x >> zoom) - 1;
y = (ss->y >> zoom) - 1; y = (ss->y >> zoom) - 1;
@ -1172,7 +1172,7 @@ void ViewportDoDraw(ViewPort *vp, int left, int top, int right, int bottom)
vd.first_string = NULL; vd.first_string = NULL;
vd.last_tile = &vd.first_tile; vd.last_tile = &vd.first_tile;
vd.first_tile = NULL; vd.first_tile = NULL;
ViewportAddLandscape(); ViewportAddLandscape();
#if !defined(NEW_ROTATION) #if !defined(NEW_ROTATION)
ViewportAddVehicles(&vd.dpi); ViewportAddVehicles(&vd.dpi);
@ -1196,10 +1196,10 @@ void ViewportDoDraw(ViewPort *vp, int left, int top, int right, int bottom)
ViewportSortParentSprites(parent_list); ViewportSortParentSprites(parent_list);
ViewportDrawParentSprites(parent_list); ViewportDrawParentSprites(parent_list);
if (vd.first_string != NULL) if (vd.first_string != NULL)
ViewportDrawStrings(&vd.dpi, vd.first_string); ViewportDrawStrings(&vd.dpi, vd.first_string);
_cur_dpi = old_dpi; _cur_dpi = old_dpi;
} }
@ -1218,7 +1218,7 @@ static void ViewportDrawChk(ViewPort *vp, int left, int top, int right, int bott
ViewportDrawChk(vp, t, top, right, bottom); ViewportDrawChk(vp, t, top, right, bottom);
} }
} else { } else {
ViewportDoDraw(vp, ViewportDoDraw(vp,
((left - vp->left) << vp->zoom) + vp->virtual_left, ((left - vp->left) << vp->zoom) + vp->virtual_left,
((top - vp->top) << vp->zoom) + vp->virtual_top, ((top - vp->top) << vp->zoom) + vp->virtual_top,
((right - vp->left) << vp->zoom) + vp->virtual_left, ((right - vp->left) << vp->zoom) + vp->virtual_left,
@ -1285,7 +1285,7 @@ void UpdateViewportPosition(Window *w)
t = x; t = x;
x = y - t; x = y - t;
y = y + t; y = y + t;
// check if inside bounds? // check if inside bounds?
t = (-130) << vp->zoom; t = (-130) << vp->zoom;
err = 0; err = 0;
@ -1301,7 +1301,7 @@ void UpdateViewportPosition(Window *w)
if (err != 0) { if (err != 0) {
/* coordinate remap */ /* coordinate remap */
Point pt = RemapCoords(x, y, 0); Point pt = RemapCoords(x, y, 0);
t = (-1) << vp->zoom; t = (-1) << vp->zoom;
WP(w,vp_d).scrollpos_x = pt.x & t; WP(w,vp_d).scrollpos_x = pt.x & t;
WP(w,vp_d).scrollpos_y = pt.y & t; WP(w,vp_d).scrollpos_y = pt.y & t;
} }
@ -1373,7 +1373,7 @@ void MarkTileDirty(int x, int y)
pt.x - 31 + 67, pt.x - 31 + 67,
pt.y - 122 + 154 pt.y - 122 + 154
); );
} }
void SetSelectionTilesDirty() void SetSelectionTilesDirty()
{ {
@ -1417,8 +1417,8 @@ static bool CheckClickOnTown(ViewPort *vp, int x, int y)
if (vp->zoom < 1) { if (vp->zoom < 1) {
x = x - vp->left + vp->virtual_left; x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (t->xy &&
y >= t->sign.top && y >= t->sign.top &&
@ -1431,7 +1431,7 @@ static bool CheckClickOnTown(ViewPort *vp, int x, int y)
} }
} else if (vp->zoom == 1) { } else if (vp->zoom == 1) {
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (t->xy &&
y >= t->sign.top && y >= t->sign.top &&
@ -1444,7 +1444,7 @@ static bool CheckClickOnTown(ViewPort *vp, int x, int y)
} }
} else { } else {
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy && if (t->xy &&
y >= t->sign.top && y >= t->sign.top &&
@ -1469,7 +1469,7 @@ static bool CheckClickOnStation(ViewPort *vp, int x, int y)
if (vp->zoom < 1) { if (vp->zoom < 1) {
x = x - vp->left + vp->virtual_left; x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (st->xy &&
@ -1483,7 +1483,7 @@ static bool CheckClickOnStation(ViewPort *vp, int x, int y)
} }
} else if (vp->zoom == 1) { } else if (vp->zoom == 1) {
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (st->xy &&
y >= st->sign.top && y >= st->sign.top &&
@ -1496,7 +1496,7 @@ static bool CheckClickOnStation(ViewPort *vp, int x, int y)
} }
} else { } else {
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
FOR_ALL_STATIONS(st) { FOR_ALL_STATIONS(st) {
if (st->xy && if (st->xy &&
y >= st->sign.top && y >= st->sign.top &&
@ -1521,7 +1521,7 @@ static bool CheckClickOnSign(ViewPort *vp, int x, int y)
if (vp->zoom < 1) { if (vp->zoom < 1) {
x = x - vp->left + vp->virtual_left; x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
for(ss = _sign_list; ss != endof(_sign_list); ss++) { for(ss = _sign_list; ss != endof(_sign_list); ss++) {
if (ss->str && if (ss->str &&
@ -1535,7 +1535,7 @@ static bool CheckClickOnSign(ViewPort *vp, int x, int y)
} }
} else if (vp->zoom == 1) { } else if (vp->zoom == 1) {
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
for(ss = _sign_list; ss != endof(_sign_list); ss++) { for(ss = _sign_list; ss != endof(_sign_list); ss++) {
if (ss->str && if (ss->str &&
y >= ss->sign.top && y >= ss->sign.top &&
@ -1548,7 +1548,7 @@ static bool CheckClickOnSign(ViewPort *vp, int x, int y)
} }
} else { } else {
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
for(ss = _sign_list; ss != endof(_sign_list); ss++) { for(ss = _sign_list; ss != endof(_sign_list); ss++) {
if (ss->str && if (ss->str &&
y >= ss->sign.top && y >= ss->sign.top &&
@ -1573,7 +1573,7 @@ static bool CheckClickOnCheckpoint(ViewPort *vp, int x, int y)
if (vp->zoom < 1) { if (vp->zoom < 1) {
x = x - vp->left + vp->virtual_left; x = x - vp->left + vp->virtual_left;
y = y - vp->top + vp->virtual_top; y = y - vp->top + vp->virtual_top;
for(cp = _checkpoints; cp != endof(_checkpoints); cp++) { for(cp = _checkpoints; cp != endof(_checkpoints); cp++) {
if (cp->xy && if (cp->xy &&
@ -1587,7 +1587,7 @@ static bool CheckClickOnCheckpoint(ViewPort *vp, int x, int y)
} }
} else if (vp->zoom == 1) { } else if (vp->zoom == 1) {
x = (x - vp->left + 1) * 2 + vp->virtual_left; x = (x - vp->left + 1) * 2 + vp->virtual_left;
y = (y - vp->top + 1) * 2 + vp->virtual_top; y = (y - vp->top + 1) * 2 + vp->virtual_top;
for(cp = _checkpoints; cp != endof(_checkpoints); cp++) { for(cp = _checkpoints; cp != endof(_checkpoints); cp++) {
if (cp->xy && if (cp->xy &&
y >= cp->sign.top && y >= cp->sign.top &&
@ -1600,7 +1600,7 @@ static bool CheckClickOnCheckpoint(ViewPort *vp, int x, int y)
} }
} else { } else {
x = (x - vp->left + 3) * 4 + vp->virtual_left; x = (x - vp->left + 3) * 4 + vp->virtual_left;
y = (y - vp->top + 3) * 4 + vp->virtual_top; y = (y - vp->top + 3) * 4 + vp->virtual_top;
for(cp = _checkpoints; cp != endof(_checkpoints); cp++) { for(cp = _checkpoints; cp != endof(_checkpoints); cp++) {
if (cp->xy && if (cp->xy &&
y >= cp->sign.top && y >= cp->sign.top &&
@ -1691,7 +1691,7 @@ void PlaceObject()
Point pt; Point pt;
Window *w; Window *w;
WindowEvent e; WindowEvent e;
pt = GetTileBelowCursor(); pt = GetTileBelowCursor();
if (pt.x == -1) if (pt.x == -1)
return; return;
@ -1808,7 +1808,7 @@ void UpdateTileSelection()
int y2 = thd->selstart.y; int y2 = thd->selstart.y;
x1 &= ~0xF; x1 &= ~0xF;
y1 &= ~0xF; y1 &= ~0xF;
if (x1 >= x2) intswap(x1,x2); if (x1 >= x2) intswap(x1,x2);
if (y1 >= y2) intswap(y1,y2); if (y1 >= y2) intswap(y1,y2);
thd->new_pos.x = x1; thd->new_pos.x = x1;
@ -1834,10 +1834,10 @@ void UpdateTileSelection()
} }
} }
if (thd->drawstyle != thd->new_drawstyle || if (thd->drawstyle != thd->new_drawstyle ||
thd->pos.x != thd->new_pos.x || thd->pos.y != thd->new_pos.y || thd->pos.x != thd->new_pos.x || thd->pos.y != thd->new_pos.y ||
thd->size.x != thd->new_size.x || thd->size.y != thd->new_size.y) { thd->size.x != thd->new_size.x || thd->size.y != thd->new_size.y) {
// clear the old selection? // clear the old selection?
if (thd->drawstyle) SetSelectionTilesDirty(); if (thd->drawstyle) SetSelectionTilesDirty();
@ -1898,7 +1898,7 @@ static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y)
int d; int d;
bool b; bool b;
uint w,h; uint w,h;
w = myabs((x & ~0xF) - thd->selstart.x) + 16; w = myabs((x & ~0xF) - thd->selstart.x) + 16;
h = myabs((y & ~0xF) - thd->selstart.y) + 16; h = myabs((y & ~0xF) - thd->selstart.y) + 16;
@ -2002,7 +2002,7 @@ bool VpHandlePlaceSizingDrag()
{ {
Window *w; Window *w;
WindowEvent e; WindowEvent e;
if (_special_mouse_mode != WSM_SIZING) if (_special_mouse_mode != WSM_SIZING)
return true; return true;
@ -2024,9 +2024,9 @@ bool VpHandlePlaceSizingDrag()
// mouse button released.. // mouse button released..
// keep the selected tool, but reset it to the original mode. // keep the selected tool, but reset it to the original mode.
_special_mouse_mode = WSM_NONE; _special_mouse_mode = WSM_NONE;
_thd.place_mode = (_thd.next_drawstyle == HT_RECT || _thd.next_drawstyle & HT_LINE) ? 1 : 2; _thd.place_mode = (_thd.next_drawstyle == HT_RECT || _thd.next_drawstyle & HT_LINE) ? 1 : 2;
SetTileSelectSize(1, 1); SetTileSelectSize(1, 1);
// and call the mouseup event. // and call the mouseup event.
@ -2035,7 +2035,7 @@ bool VpHandlePlaceSizingDrag()
e.place.tile = TILE_FROM_XY(e.place.pt.x, e.place.pt.y); e.place.tile = TILE_FROM_XY(e.place.pt.x, e.place.pt.y);
e.place.starttile = TILE_FROM_XY(_thd.selstart.x, _thd.selstart.y); e.place.starttile = TILE_FROM_XY(_thd.selstart.x, _thd.selstart.y);
w->wndproc(w, &e); w->wndproc(w, &e);
return false; return false;
} }
@ -2057,9 +2057,9 @@ void SetObjectToPlace(int icon, byte mode, byte window_class, uint16 window_num)
if (w != NULL) if (w != NULL)
CallWindowEventNP(w, WE_ABORT_PLACE_OBJ); CallWindowEventNP(w, WE_ABORT_PLACE_OBJ);
} }
SetTileSelectSize(1, 1); SetTileSelectSize(1, 1);
thd->make_square_red = false; thd->make_square_red = false;
if (mode == 4) { if (mode == 4) {
@ -2075,7 +2075,7 @@ void SetObjectToPlace(int icon, byte mode, byte window_class, uint16 window_num)
if (mode == 3) if (mode == 3)
VpStartPreSizing(); VpStartPreSizing();
if ( (int)icon < 0) if ( (int)icon < 0)
SetAnimatedMouseCursor(_animcursors[~icon]); SetAnimatedMouseCursor(_animcursors[~icon]);
else else

View File

@ -8,12 +8,12 @@ struct ViewPort {
int virtual_left, virtual_top; // virtual coordinates int virtual_left, virtual_top; // virtual coordinates
int virtual_width, virtual_height; // these are just width << zoom, height << zoom int virtual_width, virtual_height; // these are just width << zoom, height << zoom
byte zoom; byte zoom;
}; };
/* viewport.c */ /* viewport.c */
Point MapXYZToViewport(ViewPort *vp, uint x, uint y, uint z); Point MapXYZToViewport(ViewPort *vp, uint x, uint y, uint z);
void AssignWindowViewport(Window *w, int x, int y, void AssignWindowViewport(Window *w, int x, int y,
int width, int height, uint32 follow_flags, byte zoom); int width, int height, uint32 follow_flags, byte zoom);
void SetViewportPosition(Window *w, int x, int y); void SetViewportPosition(Window *w, int x, int y);
ViewPort *IsPtInWindowViewport(Window *w, int x, int y); ViewPort *IsPtInWindowViewport(Window *w, int x, int y);

View File

@ -65,7 +65,7 @@ IDirectMusicPerformance *performance = NULL;
IDirectMusicSegment *segment = NULL; IDirectMusicSegment *segment = NULL;
// the loader bject can load many types of DMusic related files // the loader bject can load many types of DMusic related files
IDirectMusicLoader *loader = NULL; IDirectMusicLoader *loader = NULL;
// whether we've initialized COM or not (when deciding whether to shut down) // whether we've initialized COM or not (when deciding whether to shut down)
int COMInitialized = 0; int COMInitialized = 0;
@ -81,7 +81,7 @@ struct ProcPtrs {
}; };
#define M(x) x "\0" #define M(x) x "\0"
static const char ole_files[] = static const char ole_files[] =
M("ole32.dll") M("ole32.dll")
M("CoCreateInstance") M("CoCreateInstance")
M("CoInitialize") M("CoInitialize")
@ -95,7 +95,7 @@ static ProcPtrs _proc;
static bool LoadOleDLL() static bool LoadOleDLL()
{ {
if (_proc.CoCreateInstance != NULL) if (_proc.CoCreateInstance != NULL)
return true; return true;
if (!LoadLibraryList((void**)&_proc, ole_files)) if (!LoadLibraryList((void**)&_proc, ole_files))
return false; return false;
@ -151,7 +151,7 @@ bool InitDirectMusic (void)
// midi file for our demo. Again, we need to use CoCreateInstance // midi file for our demo. Again, we need to use CoCreateInstance
// and pass the appropriate ID parameters // and pass the appropriate ID parameters
if (FAILED(_proc.CoCreateInstance((REFCLSID)CLSID_DirectMusicLoader, if (FAILED(_proc.CoCreateInstance((REFCLSID)CLSID_DirectMusicLoader,
NULL, CLSCTX_INPROC, NULL, CLSCTX_INPROC,
(REFIID)IID_IDirectMusicLoader, (REFIID)IID_IDirectMusicLoader,
(LPVOID *)&loader))) { (LPVOID *)&loader))) {
MSGBOX("Failed to create loader object"); MSGBOX("Failed to create loader object");
@ -163,7 +163,7 @@ bool InitDirectMusic (void)
return true; return true;
} }
// Releases memory used by all of the initialized // Releases memory used by all of the initialized
// DirectMusic objects in the program // DirectMusic objects in the program
void ReleaseSegment (void) void ReleaseSegment (void)
{ {
@ -174,8 +174,8 @@ void ReleaseSegment (void)
} }
void ShutdownDirectMusic (void) void ShutdownDirectMusic (void)
{ {
// release everything but the segment, which the performance // release everything but the segment, which the performance
// will release automatically (and it'll crash if it's been // will release automatically (and it'll crash if it's been
// released already) // released already)
if (NULL != loader) { if (NULL != loader) {
@ -196,7 +196,7 @@ void ShutdownDirectMusic (void)
} }
} }
// Load MIDI file for playing // Load MIDI file for playing
bool LoadMIDI (char *directory, char *filename) bool LoadMIDI (char *directory, char *filename)
{ {
DMUS_OBJECTDESC obj_desc; DMUS_OBJECTDESC obj_desc;
@ -229,8 +229,8 @@ bool LoadMIDI (char *directory, char *filename)
ReleaseSegment(); ReleaseSegment();
// and make a new segment // and make a new segment
if (FAILED(loader->GetObject(&obj_desc, if (FAILED(loader->GetObject(&obj_desc,
(REFIID)IID_IDirectMusicSegment, (REFIID)IID_IDirectMusicSegment,
(LPVOID *) &segment))) { (LPVOID *) &segment))) {
MSGBOX("LoadMIDI: Get object failed"); MSGBOX("LoadMIDI: Get object failed");
return FALSE; return FALSE;

View File

@ -27,7 +27,7 @@ bool IsClearWaterTile(uint tile)
int32 CmdBuildShipDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdBuildShipDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
uint tile, tile2; uint tile, tile2;
int32 cost, ret; int32 cost, ret;
Depot *dep; Depot *dep;
@ -49,7 +49,7 @@ int32 CmdBuildShipDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
ret = DoCommandByTile(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR); ret = DoCommandByTile(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
if (ret == CMD_ERROR) if (ret == CMD_ERROR)
return CMD_ERROR; return CMD_ERROR;
// pretend that we're not making land from the water even though we actually are. // pretend that we're not making land from the water even though we actually are.
cost = 0; cost = 0;
@ -62,12 +62,12 @@ int32 CmdBuildShipDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_last_built_ship_depot_tile = tile; _last_built_ship_depot_tile = tile;
dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index; dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
ModifyTile(tile, ModifyTile(tile,
MP_SETTYPE(MP_WATER) | MP_MAPOWNER_CURRENT | MP_MAP5 | MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR, MP_SETTYPE(MP_WATER) | MP_MAPOWNER_CURRENT | MP_MAP5 | MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR,
(0x80 + p1*2) (0x80 + p1*2)
); );
ModifyTile(tile2, ModifyTile(tile2,
MP_SETTYPE(MP_WATER) | MP_MAPOWNER_CURRENT | MP_MAP5 | MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR, MP_SETTYPE(MP_WATER) | MP_MAPOWNER_CURRENT | MP_MAP5 | MP_MAP2_CLEAR | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR,
(0x81 + p1*2) (0x81 + p1*2)
); );
@ -101,8 +101,8 @@ static int32 RemoveShipDepot(uint tile, uint32 flags)
// Kill the entry from the depot table // Kill the entry from the depot table
for(d=_depots; d->xy != tile; d++) {} for(d=_depots; d->xy != tile; d++) {}
d->xy = 0; d->xy = 0;
DeleteWindowById(WC_VEHICLE_DEPOT, tile); DeleteWindowById(WC_VEHICLE_DEPOT, tile);
} }
return _price.remove_ship_depot; return _price.remove_ship_depot;
@ -117,7 +117,7 @@ static int32 DoBuildShiplift(uint tile, int dir, uint32 flags)
// middle tile // middle tile
ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
if (ret == CMD_ERROR) return CMD_ERROR; if (ret == CMD_ERROR) return CMD_ERROR;
delta = _tileoffs_by_dir[dir]; delta = _tileoffs_by_dir[dir];
// lower tile // lower tile
ret = DoCommandByTile(tile - delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR); ret = DoCommandByTile(tile - delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@ -151,7 +151,7 @@ static int32 RemoveShiplift(uint tile, uint32 flags)
DoClearSquare(tile + delta); DoClearSquare(tile + delta);
DoClearSquare(tile - delta); DoClearSquare(tile - delta);
} }
return _price.clear_water * 2; return _price.clear_water * 2;
} }
@ -168,7 +168,7 @@ int32 CmdBuildLock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
uint tile = TILE_FROM_XY(x,y); uint tile = TILE_FROM_XY(x,y);
int32 ret; int32 ret;
uint th; uint th;
th = GetTileSlope(tile, NULL); th = GetTileSlope(tile, NULL);
if (th==3 || th==6 || th==9 || th==12) { if (th==3 || th==6 || th==9 || th==12) {
static const byte _shiplift_dirs[16] = {0,0,0,2,0,0,1,0,0,3,0,0,0}; static const byte _shiplift_dirs[16] = {0,0,0,2,0,0,1,0,0,3,0,0,0};
@ -194,7 +194,7 @@ int32 CmdBuildCanal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// move in which direction? // move in which direction?
delta = (GET_TILE_X(tile) == GET_TILE_X(endtile)) ? TILE_XY(0,1) : TILE_XY(1,0); delta = (GET_TILE_X(tile) == GET_TILE_X(endtile)) ? TILE_XY(0,1) : TILE_XY(1,0);
if (endtile < tile) delta = -delta; if (endtile < tile) delta = -delta;
cost = 0; cost = 0;
for(;;) { for(;;) {
ret = 0; ret = 0;
@ -277,7 +277,7 @@ static int32 ClearTile_Water(uint tile, byte flags) {
DoClearSquare(tile); DoClearSquare(tile);
return _price.clear_water; return _price.clear_water;
} }
if (flags & DC_EXEC) if (flags & DC_EXEC)
DoClearSquare(tile); DoClearSquare(tile);
return _price.purchase_land; return _price.purchase_land;
} else } else
@ -290,7 +290,7 @@ static int32 ClearTile_Water(uint tile, byte flags) {
TILE_XY(-1, 0),TILE_XY(0, 1),TILE_XY(1, 0),TILE_XY(0, -1), // lower TILE_XY(-1, 0),TILE_XY(0, 1),TILE_XY(1, 0),TILE_XY(0, -1), // lower
TILE_XY(1, 0),TILE_XY(0, -1),TILE_XY(-1, 0),TILE_XY(0, 1), // upper TILE_XY(1, 0),TILE_XY(0, -1),TILE_XY(-1, 0),TILE_XY(0, 1), // upper
}; };
if (flags & DC_AUTO) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED); if (flags & DC_AUTO) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
// don't allow water to delete it. // don't allow water to delete it.
if (_current_player == OWNER_WATER) return CMD_ERROR; if (_current_player == OWNER_WATER) return CMD_ERROR;
@ -316,9 +316,9 @@ static bool IsWateredTile(uint tile)
{ {
byte m5 = _map5[tile]; byte m5 = _map5[tile];
if (IS_TILETYPE(tile, MP_WATER)) { if (IS_TILETYPE(tile, MP_WATER)) {
return m5 != 1; return m5 != 1;
} else if (IS_TILETYPE(tile, MP_STATION)) { } else if (IS_TILETYPE(tile, MP_STATION)) {
// returns true if it is a dock-station (m5 inside values is m5<75 all stations, // returns true if it is a dock-station (m5 inside values is m5<75 all stations,
// 83<=m5<=114 new airports // 83<=m5<=114 new airports
return !(m5 < 75 || (m5 >= 83 && m5 <= 114)); return !(m5 < 75 || (m5 >= 83 && m5 <= 114));
} else if (IS_TILETYPE(tile, MP_TUNNELBRIDGE)) { } else if (IS_TILETYPE(tile, MP_TUNNELBRIDGE)) {
@ -331,13 +331,13 @@ static bool IsWateredTile(uint tile)
void DrawCanalWater(uint tile) void DrawCanalWater(uint tile)
{ {
uint wa; uint wa;
// determine the edges around with water. // determine the edges around with water.
wa = IsWateredTile(TILE_ADDXY(tile, -1, 0)) << 0; wa = IsWateredTile(TILE_ADDXY(tile, -1, 0)) << 0;
wa += IsWateredTile(TILE_ADDXY(tile, 0, 1)) << 1; wa += IsWateredTile(TILE_ADDXY(tile, 0, 1)) << 1;
wa += IsWateredTile(TILE_ADDXY(tile, 1, 0)) << 2; wa += IsWateredTile(TILE_ADDXY(tile, 1, 0)) << 2;
wa += IsWateredTile(TILE_ADDXY(tile, 0, -1)) << 3; wa += IsWateredTile(TILE_ADDXY(tile, 0, -1)) << 3;
if (!(wa & 1)) DrawGroundSprite(SPR_CANALS_BASE + 57); if (!(wa & 1)) DrawGroundSprite(SPR_CANALS_BASE + 57);
if (!(wa & 2)) DrawGroundSprite(SPR_CANALS_BASE + 58); if (!(wa & 2)) DrawGroundSprite(SPR_CANALS_BASE + 58);
if (!(wa & 4)) DrawGroundSprite(SPR_CANALS_BASE + 59); if (!(wa & 4)) DrawGroundSprite(SPR_CANALS_BASE + 59);
@ -383,9 +383,9 @@ static void DrawWaterStuff(TileInfo *ti, const byte *t, uint32 palette, uint bas
const WaterDrawTileStruct *wdts; const WaterDrawTileStruct *wdts;
uint32 image; uint32 image;
DrawGroundSprite(*(uint16*)t); DrawGroundSprite(*(uint16*)t);
t += sizeof(uint16); t += sizeof(uint16);
for(wdts = (WaterDrawTileStruct *)t; (byte)wdts->delta_x != 0x80; wdts++) { for(wdts = (WaterDrawTileStruct *)t; (byte)wdts->delta_x != 0x80; wdts++) {
image = wdts->image + base; image = wdts->image + base;
if (_display_opt & DO_TRANS_BUILDINGS) { if (_display_opt & DO_TRANS_BUILDINGS) {
@ -431,7 +431,7 @@ void DrawShipDepotSprite(int x, int y, int image)
t = _shipdepot_display_seq[image]; t = _shipdepot_display_seq[image];
DrawSprite(*(uint16*)t, x, y); DrawSprite(*(uint16*)t, x, y);
t += sizeof(uint16); t += sizeof(uint16);
for(wdts = (WaterDrawTileStruct *)t; (byte)wdts->delta_x != 0x80; wdts++) { for(wdts = (WaterDrawTileStruct *)t; (byte)wdts->delta_x != 0x80; wdts++) {
Point pt = RemapCoords(wdts->delta_x, wdts->delta_y, wdts->delta_z); Point pt = RemapCoords(wdts->delta_x, wdts->delta_y, wdts->delta_z);
DrawSprite(wdts->image + PLAYER_SPRITE_COLOR(_local_player), x + pt.x, y + pt.y); DrawSprite(wdts->image + PLAYER_SPRITE_COLOR(_local_player), x + pt.x, y + pt.y);
@ -440,12 +440,12 @@ void DrawShipDepotSprite(int x, int y, int image)
uint GetSlopeZ_Water(TileInfo *ti) uint GetSlopeZ_Water(TileInfo *ti)
{ {
return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z; return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
} }
uint GetSlopeTileh_Water(TileInfo *ti) uint GetSlopeTileh_Water(TileInfo *ti)
{ {
return ti->tileh; return ti->tileh;
} }
@ -534,7 +534,7 @@ static void FloodVehicle(Vehicle *v)
_vehicle_sort_dirty[VEHROAD] = true; _vehicle_sort_dirty[VEHROAD] = true;
InvalidateWindow(WC_ROADVEH_LIST, v->owner); InvalidateWindow(WC_ROADVEH_LIST, v->owner);
} }
else if (v->type == VEH_Train) { else if (v->type == VEH_Train) {
v = GetFirstVehicleInChain(v); v = GetFirstVehicleInChain(v);
u = v; u = v;
@ -549,13 +549,13 @@ static void FloodVehicle(Vehicle *v)
v = u; v = u;
v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast
_vehicle_sort_dirty[VEHTRAIN] = true; _vehicle_sort_dirty[VEHTRAIN] = true;
InvalidateWindow(WC_TRAINS_LIST, v->owner); InvalidateWindow(WC_TRAINS_LIST, v->owner);
} else } else
return; return;
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4); InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, 4);
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
SET_DPARAM16(0, pass); SET_DPARAM16(0, pass);
AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED, AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED,
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0), NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
@ -621,7 +621,7 @@ static uint32 GetTileTrackStatus_Water(uint tile, TransportType mode)
} }
if ( (m5 & 0x10) == 0x10) { if ( (m5 & 0x10) == 0x10) {
// //
b = _shiplift_tracks[m5 & 0xF]; b = _shiplift_tracks[m5 & 0xF];
return b + (b<<8); return b + (b<<8);
} }
@ -638,7 +638,7 @@ extern void ShowShipDepotWindow(uint tile);
static void ClickTile_Water(uint tile) static void ClickTile_Water(uint tile)
{ {
byte m5 = _map5[tile] - 0x80; byte m5 = _map5[tile] - 0x80;
if (IS_BYTE_INSIDE(m5, 0, 3+1)) { if (IS_BYTE_INSIDE(m5, 0, 3+1)) {
if (m5 & 1) if (m5 & 1)
tile += (m5==1) ? TILE_XY(-1,0) : TILE_XY(0,-1); tile += (m5==1) ? TILE_XY(-1,0) : TILE_XY(0,-1);

View File

@ -11,7 +11,7 @@ static Point HandleScrollbarHittest(Scrollbar *sb, int top, int bottom)
top += 10; top += 10;
bottom -= 9; bottom -= 9;
height = (bottom - top); height = (bottom - top);
pos = sb->pos; pos = sb->pos;
@ -19,7 +19,7 @@ static Point HandleScrollbarHittest(Scrollbar *sb, int top, int bottom)
cap = sb->cap; cap = sb->cap;
if (count != 0) top += height * pos / count; if (count != 0) top += height * pos / count;
if (cap > count) cap = count; if (cap > count) cap = count;
if (count != 0) if (count != 0)
bottom -= (count - pos - cap) * height / count; bottom -= (count - pos - cap) * height / count;
@ -61,7 +61,7 @@ void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y)
pos = x; pos = x;
sb = &w->hscroll; sb = &w->hscroll;
} }
if (pos <= mi+9) { if (pos <= mi+9) {
// Pressing the upper button? // Pressing the upper button?
if (!_demo_mode) { if (!_demo_mode) {
@ -76,7 +76,7 @@ void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y)
// Pressing the lower button? // Pressing the lower button?
if (!_demo_mode) { if (!_demo_mode) {
w->flags4 |= WF_SCROLL_DOWN; w->flags4 |= WF_SCROLL_DOWN;
if (_scroller_click_timeout == 0) { if (_scroller_click_timeout == 0) {
_scroller_click_timeout = 6; _scroller_click_timeout = 6;
if ((byte)(sb->pos + sb->cap) < sb->count) if ((byte)(sb->pos + sb->cap) < sb->count)
@ -85,14 +85,14 @@ void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y)
_left_button_clicked = false; _left_button_clicked = false;
} }
} else { } else {
// //
Point pt = HandleScrollbarHittest(sb, mi, ma); Point pt = HandleScrollbarHittest(sb, mi, ma);
if (pos < pt.x) { if (pos < pt.x) {
sb->pos = max(sb->pos - sb->cap, 0); sb->pos = max(sb->pos - sb->cap, 0);
} else if (pos > pt.y) { } else if (pos > pt.y) {
sb->pos = min( sb->pos = min(
sb->pos + sb->cap, sb->pos + sb->cap,
max(sb->count - sb->cap, 0) max(sb->count - sb->cap, 0)
); );
} else { } else {
@ -147,9 +147,9 @@ void DrawWindowWidgets(Window *w)
Rect r; Rect r;
uint32 dparam_backup[10]; uint32 dparam_backup[10];
uint32 cur_click, cur_disabled, cur_hidden; uint32 cur_click, cur_disabled, cur_hidden;
if (w->desc_flags & WDF_RESTORE_DPARAM) COPY_OUT_DPARAM(dparam_backup, 0, lengthof(dparam_backup)); if (w->desc_flags & WDF_RESTORE_DPARAM) COPY_OUT_DPARAM(dparam_backup, 0, lengthof(dparam_backup));
wi = w->widget; wi = w->widget;
cur_click = w->click_state; cur_click = w->click_state;
@ -190,7 +190,7 @@ void DrawWindowWidgets(Window *w)
StringID str = wi->unkA; StringID str = wi->unkA;
if ((wi->type&WWT_MASK) == WWT_4 && (cur_click&1)) str++; if ((wi->type&WWT_MASK) == WWT_4 && (cur_click&1)) str++;
DrawStringCentered((r.left + r.right+1)>>1, ((r.top+r.bottom + 1)>>1) - 5, str, 0); DrawStringCentered((r.left + r.right+1)>>1, ((r.top+r.bottom + 1)>>1) - 5, str, 0);
goto restore_dparam; goto restore_dparam;
} }
@ -207,13 +207,13 @@ void DrawWindowWidgets(Window *w)
} }
case WWT_MATRIX: { case WWT_MATRIX: {
int c, d, ctr; int c, d, ctr;
int x, amt1, amt2; int x, amt1, amt2;
int color; int color;
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color,
(cur_click & 1) ? 0x20 : 0); (cur_click & 1) ? 0x20 : 0);
c = (wi->unkA&0xFF); c = (wi->unkA&0xFF);
amt1 = (wi->right - wi->left + 1) / c; amt1 = (wi->right - wi->left + 1) / c;
@ -221,7 +221,7 @@ void DrawWindowWidgets(Window *w)
amt2 = (wi->bottom - wi->top + 1) / d; amt2 = (wi->bottom - wi->top + 1) / d;
color = _color_list[wi->color&0xF].window_color_bgb; color = _color_list[wi->color&0xF].window_color_bgb;
x = r.left; x = r.left;
for(ctr=c; --ctr; ) { for(ctr=c; --ctr; ) {
x += amt1; x += amt1;
@ -248,7 +248,7 @@ void DrawWindowWidgets(Window *w)
GfxFillRect(r.left+1, x, r.right-1, x, color); GfxFillRect(r.left+1, x, r.right-1, x, color);
} }
goto draw_default; goto draw_default;
} }
// vertical scrollbar // vertical scrollbar
@ -276,7 +276,7 @@ void DrawWindowWidgets(Window *w)
GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2); GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2);
GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1); GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1);
GfxFillRect(r.left+8, r.top+10, r.left+8, r.bottom-10, c2); GfxFillRect(r.left+8, r.top+10, r.left+8, r.bottom-10, c2);
pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom); pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == WF_SCROLL_MIDDLE ? 0x20 : 0); DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == WF_SCROLL_MIDDLE ? 0x20 : 0);
break; break;
@ -350,7 +350,7 @@ void DrawWindowWidgets(Window *w)
case WWT_CAPTION: { case WWT_CAPTION: {
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, 0x10); DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, 0x10);
DrawFrameRect(r.left+1, r.top+1, r.right-1, r.bottom-1, wi->color, (w->caption_color == 0xFF) ? 0x60 : 0x70); DrawFrameRect(r.left+1, r.top+1, r.right-1, r.bottom-1, wi->color, (w->caption_color == 0xFF) ? 0x60 : 0x70);
if (w->caption_color != 0xFF) { if (w->caption_color != 0xFF) {
GfxFillRect(r.left+2, r.top+2, r.right-2, r.bottom-2, _color_list[_player_colors[w->caption_color]].window_color_1b); GfxFillRect(r.left+2, r.top+2, r.right-2, r.bottom-2, _color_list[_player_colors[w->caption_color]].window_color_1b);
} }
@ -365,7 +365,7 @@ draw_default:;
} }
} }
} while (cur_click>>=1, cur_disabled>>=1, cur_hidden >>= 1, (++wi)->type != WWT_LAST); } while (cur_click>>=1, cur_disabled>>=1, cur_hidden >>= 1, (++wi)->type != WWT_LAST);
if (w->flags4 & WF_WHITE_BORDER_MASK) { if (w->flags4 & WF_WHITE_BORDER_MASK) {
//DrawFrameRect(w->left, w->top, w->left + w->width-1, w->top+w->height-1, 0xF, 0x10); //DrawFrameRect(w->left, w->top, w->left + w->width-1, w->top+w->height-1, 0xF, 0x10);
@ -396,7 +396,7 @@ static int GetDropdownItem(Window *w)
if (GetWidgetFromPos(w, _cursor.pos.x - w->left, _cursor.pos.y - w->top) < 0) if (GetWidgetFromPos(w, _cursor.pos.x - w->left, _cursor.pos.y - w->top) < 0)
return -1; return -1;
y = _cursor.pos.y - w->top - 2; y = _cursor.pos.y - w->top - 2;
if (y < 0) if (y < 0)
@ -433,7 +433,7 @@ void DropdownMenuWndProc(Window *w, WindowEvent *e)
DrawString(x+2, y, _dropdown_items[i], sel==0 ? 12 : 16); DrawString(x+2, y, _dropdown_items[i], sel==0 ? 12 : 16);
if (dis & 1) { if (dis & 1) {
GfxFillRect(x, y, x+w->width-3, y + 9, 0x8000 + GfxFillRect(x, y, x+w->width-3, y + 9, 0x8000 +
_color_list[_dropdown_menu_widgets[0].color].window_color_bga); _color_list[_dropdown_menu_widgets[0].color].window_color_bga);
} }
} else { } else {
@ -491,7 +491,7 @@ void DropdownMenuWndProc(Window *w, WindowEvent *e)
SetWindowDirty(w); SetWindowDirty(w);
} }
} break; } break;
case WE_DESTROY: { case WE_DESTROY: {
Window *w2 = FindWindowById(_dropdown_windowclass, _dropdown_windownum); Window *w2 = FindWindowById(_dropdown_windowclass, _dropdown_windownum);
if (w2 != NULL) { if (w2 != NULL) {
@ -510,7 +510,7 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
const Widget *wi; const Widget *wi;
Window *w2; Window *w2;
uint32 old_click_state = w->click_state; uint32 old_click_state = w->click_state;
_dropdown_disabled = disabled_mask; _dropdown_disabled = disabled_mask;
cls = w->window_class; cls = w->window_class;
@ -524,7 +524,7 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
SETBIT(w->click_state, button); SETBIT(w->click_state, button);
InvalidateWidget(w, button); InvalidateWidget(w, button);
for(i=0;strings[i] != INVALID_STRING_ID;i++); for(i=0;strings[i] != INVALID_STRING_ID;i++);
if (i == 0) if (i == 0)
return; return;
@ -532,11 +532,11 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
_dropdown_items = strings; _dropdown_items = strings;
_dropdown_item_count = i; _dropdown_item_count = i;
_dropdown_selindex = selected; _dropdown_selindex = selected;
_dropdown_windowclass = w->window_class; _dropdown_windowclass = w->window_class;
_dropdown_windownum = w->window_number; _dropdown_windownum = w->window_number;
_dropdown_button = button; _dropdown_button = button;
_dropdown_var1 = 0; _dropdown_var1 = 0;
_dropdown_var2 = 1; _dropdown_var2 = 1;
@ -547,8 +547,8 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
w2 = AllocateWindow( w2 = AllocateWindow(
w->left + wi[-1].left + 1, w->left + wi[-1].left + 1,
w->top + wi->bottom + 2, w->top + wi->bottom + 2,
(_dropdown_menu_widgets[0].right=t1=wi->right - wi[-1].left, t1 + 1), (_dropdown_menu_widgets[0].right=t1=wi->right - wi[-1].left, t1 + 1),
(_dropdown_menu_widgets[0].bottom=t2=i*10+3, t2+1), (_dropdown_menu_widgets[0].bottom=t2=i*10+3, t2+1),
DropdownMenuWndProc, DropdownMenuWndProc,
0x3F, 0x3F,
_dropdown_menu_widgets); _dropdown_menu_widgets);

142
win32.c
View File

@ -51,7 +51,7 @@ static void MakePalette()
pal->palVersion = 0x300; pal->palVersion = 0x300;
pal->palNumEntries = 256; pal->palNumEntries = 256;
for(i=0,b=_cur_palette; i!=256;i++,b+=3) { for(i=0,b=_cur_palette; i!=256;i++,b+=3) {
pal->palPalEntry[i].peRed = b[0]; pal->palPalEntry[i].peRed = b[0];
pal->palPalEntry[i].peGreen = b[1]; pal->palPalEntry[i].peGreen = b[1];
@ -60,7 +60,7 @@ static void MakePalette()
} }
_wnd.gdi_palette = CreatePalette(pal); _wnd.gdi_palette = CreatePalette(pal);
if (_wnd.gdi_palette == NULL) if (_wnd.gdi_palette == NULL)
error("CreatePalette failed!\n"); error("CreatePalette failed!\n");
} }
@ -133,7 +133,7 @@ static const VkMapping _vk_mapping[] = {
AS(VK_SUBTRACT, WKC_NUM_MINUS), AS(VK_SUBTRACT, WKC_NUM_MINUS),
AS(VK_ADD, WKC_NUM_PLUS), AS(VK_ADD, WKC_NUM_PLUS),
AS(VK_DECIMAL, WKC_NUM_DECIMAL), AS(VK_DECIMAL, WKC_NUM_DECIMAL),
{0} {0}
}; };
static uint MapWindowsKey(uint key) static uint MapWindowsKey(uint key)
@ -162,14 +162,14 @@ static bool AllocateDibSection(int w, int h);
static void ClientSizeChanged(int w, int h) static void ClientSizeChanged(int w, int h)
{ {
if (_wnd.double_size) { w >>= 1; h >>= 1; } if (_wnd.double_size) { w >>= 1; h >>= 1; }
// allocate new dib section of the new size // allocate new dib section of the new size
if (AllocateDibSection(w, h)) { if (AllocateDibSection(w, h)) {
// mark all palette colors dirty // mark all palette colors dirty
_pal_first_dirty = 0; _pal_first_dirty = 0;
_pal_last_dirty = 255; _pal_last_dirty = 255;
GameSizeChanged(); GameSizeChanged();
// redraw screen // redraw screen
if (_wnd.running) { if (_wnd.running) {
_screen.dst_ptr = _wnd.buffer_bits; _screen.dst_ptr = _wnd.buffer_bits;
@ -191,12 +191,12 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
dc2 = CreateCompatibleDC(dc); dc2 = CreateCompatibleDC(dc);
old_bmp = SelectObject(dc2, _wnd.dib_sect); old_bmp = SelectObject(dc2, _wnd.dib_sect);
old_palette = SelectPalette(dc, _wnd.gdi_palette, FALSE); old_palette = SelectPalette(dc, _wnd.gdi_palette, FALSE);
if (_pal_last_dirty != -1) { if (_pal_last_dirty != -1) {
UpdatePalette(dc2, _pal_first_dirty, _pal_last_dirty - _pal_first_dirty + 1); UpdatePalette(dc2, _pal_first_dirty, _pal_last_dirty - _pal_first_dirty + 1);
_pal_last_dirty = -1; _pal_last_dirty = -1;
} }
BitBlt(dc, 0, 0, _wnd.width, _wnd.height, dc2, 0, 0, SRCCOPY); BitBlt(dc, 0, 0, _wnd.width, _wnd.height, dc2, 0, 0, SRCCOPY);
SelectPalette(dc, old_palette, TRUE); SelectPalette(dc, old_palette, TRUE);
SelectObject(dc2, old_bmp); SelectObject(dc2, old_bmp);
@ -219,7 +219,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
InvalidateRect(hwnd, NULL, FALSE); InvalidateRect(hwnd, NULL, FALSE);
return 0; return 0;
} }
case WM_CLOSE: case WM_CLOSE:
AskExitGame(); AskExitGame();
return 0; return 0;
@ -255,7 +255,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
x >>= 1; x >>= 1;
y >>= 1; y >>= 1;
} }
if (_cursor.fix_at) { if (_cursor.fix_at) {
int dx = x - _cursor.pos.x; int dx = x - _cursor.pos.x;
int dy = y - _cursor.pos.y; int dy = y - _cursor.pos.y;
@ -285,7 +285,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
} }
case WM_KEYDOWN: case WM_KEYDOWN:
{ {
// this is the rewritten ascii input function // this is the rewritten ascii input function
// it disables windows deadkey handling --> more linux like :D // it disables windows deadkey handling --> more linux like :D
unsigned short w = 0; unsigned short w = 0;
@ -304,7 +304,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
ClientSizeChanged(_wnd.width, _wnd.height); ClientSizeChanged(_wnd.width, _wnd.height);
MarkWholeScreenDirty(); MarkWholeScreenDirty();
} }
break; break;
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
@ -334,7 +334,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
SetRect(&r2, 0, 0, 0, 0); SetRect(&r2, 0, 0, 0, 0);
AdjustWindowRect(&r2, GetWindowLong(hwnd, GWL_STYLE), FALSE); AdjustWindowRect(&r2, GetWindowLong(hwnd, GWL_STYLE), FALSE);
w = r->right - r->left - (r2.right - r2.left); w = r->right - r->left - (r2.right - r2.left);
h = r->bottom - r->top - (r2.bottom - r2.top); h = r->bottom - r->top - (r2.bottom - r2.top);
if (_wnd.double_size) { w >>= 1; h >>= 1; } if (_wnd.double_size) { w >>= 1; h >>= 1; }
@ -389,7 +389,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
#endif //GET_WHEEL_DELTA_WPARAM #endif //GET_WHEEL_DELTA_WPARAM
case WM_MOUSEWHEEL: { case WM_MOUSEWHEEL: {
int delta = GET_WHEEL_DELTA_WPARAM(wParam); int delta = GET_WHEEL_DELTA_WPARAM(wParam);
if (delta < 0) { if (delta < 0) {
_cursor.wheel++; _cursor.wheel++;
} else if (delta > 0) { } else if (delta > 0) {
@ -433,13 +433,13 @@ static void MakeWindow(bool full_screen)
_fullscreen = full_screen; _fullscreen = full_screen;
_wnd.double_size = _double_size && !full_screen; _wnd.double_size = _double_size && !full_screen;
// recreate window? // recreate window?
if ((full_screen|_wnd.fullscreen) && _wnd.main_wnd) { if ((full_screen|_wnd.fullscreen) && _wnd.main_wnd) {
DestroyWindow(_wnd.main_wnd); DestroyWindow(_wnd.main_wnd);
_wnd.main_wnd = 0; _wnd.main_wnd = 0;
} }
if (full_screen) { if (full_screen) {
DEVMODE settings; DEVMODE settings;
memset(&settings, 0, sizeof(DEVMODE)); memset(&settings, 0, sizeof(DEVMODE));
@ -467,7 +467,7 @@ static void MakeWindow(bool full_screen)
RECT r; RECT r;
uint style; uint style;
int x, y, w, h; int x, y, w, h;
if ((_wnd.fullscreen=full_screen) != false) { if ((_wnd.fullscreen=full_screen) != false) {
style = WS_POPUP | WS_VISIBLE; style = WS_POPUP | WS_VISIBLE;
SetRect(&r, 0, 0, _wnd.width_org, _wnd.height_org); SetRect(&r, 0, 0, _wnd.width_org, _wnd.height_org);
@ -510,11 +510,11 @@ static bool AllocateDibSection(int w, int h)
free(_wnd.alloced_bits); free(_wnd.alloced_bits);
_wnd.alloced_bits = NULL; _wnd.alloced_bits = NULL;
} }
bi = alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256); bi = alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256); memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
{ {
if (_wnd.double_size) { if (_wnd.double_size) {
_wnd.alloced_bits = _wnd.buffer_bits = (byte*)malloc(w * h); _wnd.alloced_bits = _wnd.buffer_bits = (byte*)malloc(w * h);
@ -525,7 +525,7 @@ static bool AllocateDibSection(int w, int h)
bi->bmiHeader.biWidth = _wnd.width = w; bi->bmiHeader.biWidth = _wnd.width = w;
bi->bmiHeader.biHeight = -(_wnd.height = h); bi->bmiHeader.biHeight = -(_wnd.height = h);
} }
bi->bmiHeader.biPlanes = 1; bi->bmiHeader.biPlanes = 1;
bi->bmiHeader.biBitCount = 8; bi->bmiHeader.biBitCount = 8;
bi->bmiHeader.biCompression = BI_RGB; bi->bmiHeader.biCompression = BI_RGB;
@ -539,7 +539,7 @@ static bool AllocateDibSection(int w, int h)
error("CreateDIBSection failed"); error("CreateDIBSection failed");
ReleaseDC(0, dc); ReleaseDC(0, dc);
if (!_wnd.double_size) if (!_wnd.double_size)
_wnd.buffer_bits = _wnd.bitmap_bits; _wnd.buffer_bits = _wnd.bitmap_bits;
return true; return true;
@ -562,7 +562,7 @@ static void FindResolutions()
DEVMODE dm; DEVMODE dm;
while (EnumDisplaySettings(NULL, i++, &dm)) { while (EnumDisplaySettings(NULL, i++, &dm)) {
if (dm.dmBitsPerPel == 8 && if (dm.dmBitsPerPel == 8 &&
IS_INT_INSIDE(dm.dmPelsWidth, 640, MAX_SCREEN_WIDTH+1) && IS_INT_INSIDE(dm.dmPelsWidth, 640, MAX_SCREEN_WIDTH+1) &&
IS_INT_INSIDE(dm.dmPelsHeight, 480, MAX_SCREEN_HEIGHT+1) && IS_INT_INSIDE(dm.dmPelsHeight, 480, MAX_SCREEN_HEIGHT+1) &&
(n == 0 || _resolutions[n-1][0] != dm.dmPelsWidth || _resolutions[n-1][1] != dm.dmPelsHeight)) { (n == 0 || _resolutions[n-1][0] != dm.dmPelsWidth || _resolutions[n-1][1] != dm.dmPelsHeight)) {
@ -625,7 +625,7 @@ static void filter(int left, int top, int width, int height)
while (height) { while (height) {
for(i=0; i!=width; i++) { for(i=0; i!=width; i++) {
d[i*2] = d[i*2+1] = d[i*2+p*2] = d[i*2+1+p*2] = s[i]; d[i*2] = d[i*2+1] = d[i*2+p*2] = d[i*2+1+p*2] = s[i];
} }
s += p; s += p;
d += p * 4; d += p * 4;
@ -676,7 +676,7 @@ static int Win32GdiMainLoop()
} else if (_fast_forward&2) { } else if (_fast_forward&2) {
_fast_forward = 0; _fast_forward = 0;
} }
cur_ticks=GetTickCount(); cur_ticks=GetTickCount();
if ((_fast_forward && !_pause) || cur_ticks > next_tick) if ((_fast_forward && !_pause) || cur_ticks > next_tick)
@ -687,15 +687,15 @@ static int Win32GdiMainLoop()
_ctrl_pressed = _wnd.has_focus && GetAsyncKeyState(VK_CONTROL)<0; _ctrl_pressed = _wnd.has_focus && GetAsyncKeyState(VK_CONTROL)<0;
_shift_pressed = _wnd.has_focus && GetAsyncKeyState(VK_SHIFT)<0; _shift_pressed = _wnd.has_focus && GetAsyncKeyState(VK_SHIFT)<0;
_dbg_screen_rect = _wnd.has_focus && GetAsyncKeyState(VK_CAPITAL)<0; _dbg_screen_rect = _wnd.has_focus && GetAsyncKeyState(VK_CAPITAL)<0;
// determine which directional keys are down // determine which directional keys are down
_dirkeys = _dirkeys =
(GetAsyncKeyState(VK_LEFT) < 0 ? 1 : 0) + (GetAsyncKeyState(VK_LEFT) < 0 ? 1 : 0) +
(GetAsyncKeyState(VK_UP) < 0 ? 2 : 0) + (GetAsyncKeyState(VK_UP) < 0 ? 2 : 0) +
(GetAsyncKeyState(VK_RIGHT) < 0 ? 4 : 0) + (GetAsyncKeyState(VK_RIGHT) < 0 ? 4 : 0) +
(GetAsyncKeyState(VK_DOWN) < 0 ? 8 : 0); (GetAsyncKeyState(VK_DOWN) < 0 ? 8 : 0);
GameLoop(); GameLoop();
_cursor.delta.x = _cursor.delta.y = 0; _cursor.delta.x = _cursor.delta.y = 0;
if (_force_full_redraw) if (_force_full_redraw)
@ -718,9 +718,9 @@ static bool Win32GdiChangeRes(int w, int h)
{ {
_wnd.width = _wnd.width_org = w; _wnd.width = _wnd.width_org = w;
_wnd.height = _wnd.height_org = h; _wnd.height = _wnd.height_org = h;
MakeWindow(_wnd.fullscreen); MakeWindow(_wnd.fullscreen);
return true; return true;
} }
@ -823,15 +823,15 @@ static DWORD WINAPI MidiThread(LPVOID arg)
if ((vol=_midi.new_vol) != -1) { if ((vol=_midi.new_vol) != -1) {
_midi.new_vol = -1; _midi.new_vol = -1;
MidiIntSetVolume(vol); MidiIntSetVolume(vol);
} }
if ((s=_midi.start_song)[0]) { if ((s=_midi.start_song)[0]) {
_midi.playing = MidiIntPlaySong(s); _midi.playing = MidiIntPlaySong(s);
s[0] = 0; s[0] = 0;
// Delay somewhat in case we don't manage to play. // Delay somewhat in case we don't manage to play.
if (!_midi.playing) { if (!_midi.playing) {
Sleep(5000); Sleep(5000);
} }
} }
if (_midi.stop_song != false && _midi.playing) { if (_midi.stop_song != false && _midi.playing) {
@ -893,7 +893,7 @@ static void FillHeaders()
WAVEHDR *hdr; WAVEHDR *hdr;
for(hdr=_wave_hdr; hdr != endof(_wave_hdr); hdr++) { for(hdr=_wave_hdr; hdr != endof(_wave_hdr); hdr++) {
if (!(hdr->dwFlags & WHDR_INQUEUE)) { if (!(hdr->dwFlags & WHDR_INQUEUE)) {
MxMixSamples(_mixer, hdr->lpData, hdr->dwBufferLength >> 2); MxMixSamples(_mixer, hdr->lpData, hdr->dwBufferLength >> 2);
if (waveOutWrite(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) if (waveOutWrite(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
error("waveOutWrite failed"); error("waveOutWrite failed");
} }
@ -914,7 +914,7 @@ static char *Win32SoundStart(char **parm)
{ {
WAVEFORMATEX wfex; WAVEFORMATEX wfex;
int hz; int hz;
_bufsize = GetDriverParamInt(parm, "bufsize", 1024); _bufsize = GetDriverParamInt(parm, "bufsize", 1024);
hz = GetDriverParamInt(parm, "hz", 11025); hz = GetDriverParamInt(parm, "hz", 11025);
wfex.wFormatTag = WAVE_FORMAT_PCM; wfex.wFormatTag = WAVE_FORMAT_PCM;
@ -1007,7 +1007,7 @@ static uint32 *_crc_table;
static void MakeCRCTable(uint32 *table) { static void MakeCRCTable(uint32 *table) {
uint32 crc, poly = 0xEDB88320L; uint32 crc, poly = 0xEDB88320L;
int i, j; int i, j;
_crc_table = table; _crc_table = table;
for (i=0; i!=256; i++) { for (i=0; i!=256; i++) {
@ -1051,7 +1051,7 @@ static void GetFileInfo(DebugFileInfo *dfi, const char *filename)
} }
dfi->size = filesize; dfi->size = filesize;
dfi->crc32 = crc ^ (uint32)-1; dfi->crc32 = crc ^ (uint32)-1;
if (GetFileTime(file, NULL, NULL, &write_time)) { if (GetFileTime(file, NULL, NULL, &write_time)) {
FileTimeToSystemTime(&write_time, &dfi->file_time); FileTimeToSystemTime(&write_time, &dfi->file_time);
} }
@ -1108,14 +1108,14 @@ static char *PrintModuleList(char *output)
return output; return output;
} }
static const char _crash_desc[] = static const char _crash_desc[] =
"A serious fault condition occured in the game. The game will shut down.\n" "A serious fault condition occured in the game. The game will shut down.\n"
"Press \"Submit report\" to send crash information to the developers. " "Press \"Submit report\" to send crash information to the developers. "
"This will greatly help debugging. The information contained in the report is " "This will greatly help debugging. The information contained in the report is "
"displayed below.\n" "displayed below.\n"
"Press \"Emergency save\" to attempt saving the game."; "Press \"Emergency save\" to attempt saving the game.";
static const char _save_succeeded[] = static const char _save_succeeded[] =
"Emergency save succeeded.\nBe aware that critical parts of the internal game state " "Emergency save succeeded.\nBe aware that critical parts of the internal game state "
"may have become corrupted. The saved game is not guaranteed to work."; "may have become corrupted. The saved game is not guaranteed to work.";
@ -1132,7 +1132,7 @@ typedef struct {
} WinInetProcs; } WinInetProcs;
#define M(x) x "\0" #define M(x) x "\0"
static const char wininet_files[] = static const char wininet_files[] =
M("wininet.dll") M("wininet.dll")
M("InternetOpenA") M("InternetOpenA")
M("InternetConnectA") M("InternetConnectA")
@ -1153,7 +1153,7 @@ static char *SubmitCrashReport(HWND wnd, void *msg, size_t msglen, const char *a
DWORD code, len; DWORD code, len;
static char buf[100]; static char buf[100];
char buff[100]; char buff[100];
if (_wininet.InternetOpen == NULL && !LoadLibraryList((void**)&_wininet, wininet_files)) return "can't load wininet.dll"; if (_wininet.InternetOpen == NULL && !LoadLibraryList((void**)&_wininet, wininet_files)) return "can't load wininet.dll";
inet = _wininet.InternetOpen("TTD", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); inet = _wininet.InternetOpen("TTD", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
@ -1171,7 +1171,7 @@ static char *SubmitCrashReport(HWND wnd, void *msg, size_t msglen, const char *a
len = sizeof(code); len = sizeof(code);
if (!_wininet.HttpQueryInfo(http, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &code, &len, 0)) { err = "httpqueryinfo failed"; goto error4; } if (!_wininet.HttpQueryInfo(http, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &code, &len, 0)) { err = "httpqueryinfo failed"; goto error4; }
if (code != 200) { if (code != 200) {
int l = sprintf(buf, "Server said: %d ", code); int l = sprintf(buf, "Server said: %d ", code);
len = sizeof(buf) - l; len = sizeof(buf) - l;
@ -1201,13 +1201,13 @@ static void SubmitFile(HWND wnd, const char *file)
size = GetFileSize(h, NULL); size = GetFileSize(h, NULL);
if (size > 500000) goto error1; if (size > 500000) goto error1;
mem = malloc(size); mem = malloc(size);
if (mem == NULL) goto error1; if (mem == NULL) goto error1;
if (!ReadFile(h, mem, size, &read, NULL) || read != size) goto error2; if (!ReadFile(h, mem, size, &read, NULL) || read != size) goto error2;
SubmitCrashReport(wnd, mem, size, file); SubmitCrashReport(wnd, mem, size, file);
error2: error2:
free(mem); free(mem);
@ -1223,16 +1223,16 @@ static void SetWndSize(HWND wnd, int mode)
int offs; int offs;
GetWindowRect(wnd, &r); GetWindowRect(wnd, &r);
SetDlgItemText(wnd, 15, _expand_texts[mode == 1]); SetDlgItemText(wnd, 15, _expand_texts[mode == 1]);
if (mode >= 0) { if (mode >= 0) {
GetWindowRect(GetDlgItem(wnd, 11), &r2); GetWindowRect(GetDlgItem(wnd, 11), &r2);
offs = r2.bottom - r2.top + 10; offs = r2.bottom - r2.top + 10;
if (!mode) offs=-offs; if (!mode) offs=-offs;
SetWindowPos(wnd, HWND_TOPMOST, 0, 0, r.right - r.left, r.bottom - r.top + offs, SWP_NOMOVE | SWP_NOZORDER); SetWindowPos(wnd, HWND_TOPMOST, 0, 0, r.right - r.left, r.bottom - r.top + offs, SWP_NOMOVE | SWP_NOZORDER);
} else { } else {
SetWindowPos(wnd, HWND_TOPMOST, SetWindowPos(wnd, HWND_TOPMOST,
(GetSystemMetrics(SM_CXSCREEN) - (r.right - r.left)) >> 1, (GetSystemMetrics(SM_CXSCREEN) - (r.right - r.left)) >> 1,
(GetSystemMetrics(SM_CYSCREEN) - (r.bottom - r.top)) >> 1, (GetSystemMetrics(SM_CYSCREEN) - (r.bottom - r.top)) >> 1,
0, 0, SWP_NOSIZE); 0, 0, SWP_NOSIZE);
@ -1273,7 +1273,7 @@ static BOOL CALLBACK CrashDialogFunc(HWND wnd,UINT msg,WPARAM wParam,LPARAM lPar
} }
case 14: { // Submit crash report case 14: { // Submit crash report
char *s; char *s;
SetCursor(LoadCursor(NULL, IDC_WAIT)); SetCursor(LoadCursor(NULL, IDC_WAIT));
s = SubmitCrashReport(wnd, _crash_msg, strlen(_crash_msg), ""); s = SubmitCrashReport(wnd, _crash_msg, strlen(_crash_msg), "");
@ -1281,7 +1281,7 @@ static BOOL CALLBACK CrashDialogFunc(HWND wnd,UINT msg,WPARAM wParam,LPARAM lPar
MessageBoxA(wnd, s, "Error", MB_ICONSTOP); MessageBoxA(wnd, s, "Error", MB_ICONSTOP);
break; break;
} }
// try to submit emergency savegame // try to submit emergency savegame
if (_did_emerg_save || DoEmergencySave(wnd)) { if (_did_emerg_save || DoEmergencySave(wnd)) {
SubmitFile(wnd, "crash.sav"); SubmitFile(wnd, "crash.sav");
@ -1324,7 +1324,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
if (had_exception) { ExitProcess(0); } if (had_exception) { ExitProcess(0); }
had_exception = true; had_exception = true;
_ident = GetTickCount(); // something pretty unique _ident = GetTickCount(); // something pretty unique
MakeCRCTable(alloca(256 * sizeof(uint32))); MakeCRCTable(alloca(256 * sizeof(uint32)));
@ -1333,7 +1333,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
{ {
SYSTEMTIME time; SYSTEMTIME time;
GetLocalTime(&time); GetLocalTime(&time);
output += sprintf(output, output += sprintf(output,
"*** OpenTTD Crash Report ***\r\n" "*** OpenTTD Crash Report ***\r\n"
"Date: %d-%.2d-%.2d %.2d:%.2d:%.2d\r\n" "Date: %d-%.2d-%.2d %.2d:%.2d:%.2d\r\n"
"Build: %s built on " __TIMESTAMP__ "\r\n", "Build: %s built on " __TIMESTAMP__ "\r\n",
@ -1436,7 +1436,7 @@ static void Win32InitializeExceptions()
_asm { _asm {
mov _safe_esp,esp mov _safe_esp,esp
} }
SetUnhandledExceptionFilter(ExceptionHandler); SetUnhandledExceptionFilter(ExceptionHandler);
} }
#endif #endif
@ -1459,7 +1459,7 @@ static FiosItem *FiosAlloc()
static HANDLE MyFindFirstFile(char *path, char *file, WIN32_FIND_DATA *fd) static HANDLE MyFindFirstFile(char *path, char *file, WIN32_FIND_DATA *fd)
{ {
char paths[MAX_PATH]; char paths[MAX_PATH];
sprintf(paths, "%s\\%s", path, file); sprintf(paths, "%s\\%s", path, file);
return FindFirstFile(paths, fd); return FindFirstFile(paths, fd);
} }
@ -1471,7 +1471,7 @@ int CDECL compare_FiosItems (const void *a, const void *b) {
if (_savegame_sort_order < 2) // sort by date if (_savegame_sort_order < 2) // sort by date
r = da->mtime < db->mtime ? -1 : 1; r = da->mtime < db->mtime ? -1 : 1;
else else
r = stricmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name); r = stricmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name);
if (_savegame_sort_order & 1) r = -r; if (_savegame_sort_order & 1) r = -r;
@ -1503,7 +1503,7 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
fios->type = FIOS_TYPE_PARENT; fios->type = FIOS_TYPE_PARENT;
strcpy(fios->title, ".. (Parent directory)"); strcpy(fios->title, ".. (Parent directory)");
} }
// Show subdirectories first // Show subdirectories first
h = MyFindFirstFile(_fios_path, "*.*", &fd); h = MyFindFirstFile(_fios_path, "*.*", &fd);
@ -1695,7 +1695,7 @@ char *FiosBrowseTo(const FiosItem *item)
case FIOS_TYPE_DRIVE: case FIOS_TYPE_DRIVE:
sprintf(path, "%c:\\", item->title[0]); sprintf(path, "%c:\\", item->title[0]);
break; break;
case FIOS_TYPE_PARENT: case FIOS_TYPE_PARENT:
// Skip drive part // Skip drive part
path += 3; path += 3;
@ -1713,7 +1713,7 @@ char *FiosBrowseTo(const FiosItem *item)
while (*++path); while (*++path);
// Add backslash? // Add backslash?
if (path[-1] != '\\') *path++ = '\\'; if (path[-1] != '\\') *path++ = '\\';
strcpy(path, item->name); strcpy(path, item->name);
break; break;
@ -1752,7 +1752,7 @@ StringID FiosGetDescText(char **path)
if (GetDiskFreeSpace(root, &spc, &bps, &nfc, &tnc)) { if (GetDiskFreeSpace(root, &spc, &bps, &nfc, &tnc)) {
uint32 tot = ((spc*bps)*(uint64)nfc) >> 20; uint32 tot = ((spc*bps)*(uint64)nfc) >> 20;
SET_DPARAM32(0, tot); SET_DPARAM32(0, tot);
return STR_4005_BYTES_FREE; return STR_4005_BYTES_FREE;
} else { } else {
return STR_4006_UNABLE_TO_READ_DRIVE; return STR_4006_UNABLE_TO_READ_DRIVE;
} }
@ -1848,7 +1848,7 @@ static int ParseCommandLine(char *line, char **argv, int max_argc)
// end? // end?
if (*line == 0) if (*line == 0)
break; break;
// special handling when quoted // special handling when quoted
if (*line == '"') { if (*line == '"') {
argv[n++] = ++line; argv[n++] = ++line;
@ -1863,7 +1863,7 @@ static int ParseCommandLine(char *line, char **argv, int max_argc)
line++; line++;
} }
} }
*line++ = 0; *line++ = 0;
} while (n != max_argc); } while (n != max_argc);
return n; return n;
@ -1890,12 +1890,12 @@ void CreateConsole()
_has_console = true; _has_console = true;
AllocConsole(); AllocConsole();
hand = GetStdHandle(STD_OUTPUT_HANDLE); hand = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hand, &coninfo); GetConsoleScreenBufferInfo(hand, &coninfo);
coninfo.dwSize.Y = 500; coninfo.dwSize.Y = 500;
SetConsoleScreenBufferSize(hand, coninfo.dwSize); SetConsoleScreenBufferSize(hand, coninfo.dwSize);
// redirect unbuffered STDIN, STDOUT, STDERR to the console // redirect unbuffered STDIN, STDOUT, STDERR to the console
#if !defined(__CYGWIN__) #if !defined(__CYGWIN__)
*stdout = *_fdopen( _open_osfhandle((long)hand, _O_TEXT), "w" ); *stdout = *_fdopen( _open_osfhandle((long)hand, _O_TEXT), "w" );
@ -1905,11 +1905,11 @@ void CreateConsole()
// open_osfhandle is not in cygwin // open_osfhandle is not in cygwin
*stdout = *fdopen(1, "w" ); *stdout = *fdopen(1, "w" );
*stdin = *fdopen(0, "w" ); *stdin = *fdopen(0, "w" );
*stderr = *fdopen(2, "w" ); *stderr = *fdopen(2, "w" );
#endif #endif
setvbuf( stdin, NULL, _IONBF, 0 ); setvbuf( stdin, NULL, _IONBF, 0 );
setvbuf( stdout, NULL, _IONBF, 0 ); setvbuf( stdout, NULL, _IONBF, 0 );
setvbuf( stderr, NULL, _IONBF, 0 ); setvbuf( stderr, NULL, _IONBF, 0 );
} }
@ -1919,10 +1919,10 @@ void ShowInfo(const char *str)
puts(str); puts(str);
else { else {
bool old; bool old;
ReleaseCapture(); ReleaseCapture();
_left_button_clicked =_left_button_down = false; _left_button_clicked =_left_button_down = false;
old = MyShowCursor(true); old = MyShowCursor(true);
if (MessageBoxA(GetActiveWindow(), str, "OpenTTD", MB_ICONINFORMATION | MB_OKCANCEL) == IDCANCEL) { if (MessageBoxA(GetActiveWindow(), str, "OpenTTD", MB_ICONINFORMATION | MB_OKCANCEL) == IDCANCEL) {
CreateConsole(); CreateConsole();
@ -1960,7 +1960,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLin
argc = ParseCommandLine(GetCommandLine(), argv, lengthof(argv)); argc = ParseCommandLine(GetCommandLine(), argv, lengthof(argv));
#if defined(WIN32_EXCEPTION_TRACKER) #if defined(WIN32_EXCEPTION_TRACKER)
{ {
Win32InitializeExceptions(); Win32InitializeExceptions();
} }
#endif #endif
@ -1985,7 +1985,7 @@ void DeterminePaths()
_path.personal_dir = _path.game_data_dir = cfg = malloc(MAX_PATH); _path.personal_dir = _path.game_data_dir = cfg = malloc(MAX_PATH);
GetCurrentDirectory(MAX_PATH - 1, cfg); GetCurrentDirectory(MAX_PATH - 1, cfg);
s = strchr(cfg, 0); s = strchr(cfg, 0);
if (s[-1] != '\\') { s[0] = '\\'; s[1] = 0; } if (s[-1] != '\\') { s[0] = '\\'; s[1] = 0; }

View File

@ -1021,7 +1021,7 @@ void MouseLoop()
return; return;
// only allow zooming in-out in main window, or in viewports // only allow zooming in-out in main window, or in viewports
if ( mousewheel && !(w->flags4 & WF_DISABLE_VP_SCROLL) && if ( mousewheel && !(w->flags4 & WF_DISABLE_VP_SCROLL) &&
(w->window_class == WC_MAIN_WINDOW || w->window_class == WC_EXTRA_VIEW_PORT) ) { (w->window_class == WC_MAIN_WINDOW || w->window_class == WC_EXTRA_VIEW_PORT) ) {
ZoomInOrOutToCursorWindow(mousewheel < 0,w); ZoomInOrOutToCursorWindow(mousewheel < 0,w);
} }