mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r3181) -Bracing
-Indentation -Whitespace -DeMorgan's Law -Test with NULL or 0 for non-booleans -'\0' instead of 0 for chars -Remove redundantly redundant comments (like DoFoo(); // Do foo) -Join multiple short lines with a single statement -Split single lines with multiple statements -Avoid assignments in if
This commit is contained in:
parent
d8b56c123e
commit
f7abff5f96
13
ai/ai.c
13
ai/ai.c
|
@ -125,9 +125,9 @@ static void AI_RunTick(PlayerID player)
|
|||
Player *p = GetPlayer(player);
|
||||
_current_player = player;
|
||||
|
||||
if (_patches.ainew_active)
|
||||
if (_patches.ainew_active) {
|
||||
AiNewDoGameLoop(p);
|
||||
else {
|
||||
} else {
|
||||
/* Enable all kind of cheats the old AI needs in order to operate correctly... */
|
||||
_is_old_ai_player = true;
|
||||
AiDoGameLoop(p);
|
||||
|
@ -143,8 +143,7 @@ static void AI_RunTick(PlayerID player)
|
|||
void AI_RunGameLoop(void)
|
||||
{
|
||||
/* Don't do anything if ai is disabled */
|
||||
if (!_ai.enabled)
|
||||
return;
|
||||
if (!_ai.enabled) return;
|
||||
|
||||
/* New tick */
|
||||
_ai.tick++;
|
||||
|
@ -212,11 +211,9 @@ void AI_Initialize(void)
|
|||
*/
|
||||
void AI_Uninitialize(void)
|
||||
{
|
||||
Player *p;
|
||||
Player* p;
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active && p->is_ai) {
|
||||
AI_PlayerDied(p->index);
|
||||
}
|
||||
if (p->is_active && p->is_ai) AI_PlayerDied(p->index);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,11 +278,12 @@ static void AiHandleGotoDepot(Player *p, int cmd)
|
|||
|
||||
static void AiRestoreVehicleOrders(Vehicle *v, BackuppedOrders *bak)
|
||||
{
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
for (i = 0; bak->order[i].type != OT_NOTHING; i++)
|
||||
for (i = 0; bak->order[i].type != OT_NOTHING; i++) {
|
||||
if (CmdFailed(DoCommandP(0, v->index + (i << 16), PackOrder(&bak->order[i]), NULL, CMD_INSERT_ORDER | CMD_NO_TEST_IF_IN_NETWORK)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void AiHandleReplaceTrain(Player *p)
|
||||
|
@ -673,8 +674,7 @@ static void AiWantLongIndustryRoute(Player *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.dst.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.to);
|
||||
|
@ -688,9 +688,9 @@ static void AiWantLongIndustryRoute(Player *p)
|
|||
p->ai.src.buildcmd_a = 0x24;
|
||||
p->ai.src.buildcmd_b = 0xFF;
|
||||
p->ai.src.direction = AiGetDirectionBetweenTiles(
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile
|
||||
);
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile
|
||||
);
|
||||
p->ai.src.cargo = fr.cargo | 0x80;
|
||||
|
||||
// Fill the dest field
|
||||
|
@ -703,17 +703,17 @@ static void AiWantLongIndustryRoute(Player *p)
|
|||
p->ai.dst.buildcmd_a = 0x34;
|
||||
p->ai.dst.buildcmd_b = 0xFF;
|
||||
p->ai.dst.direction = AiGetDirectionBetweenTiles(
|
||||
p->ai.dst.spec_tile,
|
||||
p->ai.src.spec_tile
|
||||
);
|
||||
p->ai.dst.spec_tile,
|
||||
p->ai.src.spec_tile
|
||||
);
|
||||
p->ai.dst.cargo = fr.cargo;
|
||||
|
||||
// Fill middle field 1
|
||||
p->ai.mid1.spec_tile = AiGetPctTileBetween(
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile,
|
||||
0x55
|
||||
);
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile,
|
||||
0x55
|
||||
);
|
||||
p->ai.mid1.use_tile = 0;
|
||||
p->ai.mid1.rand_rng = 6;
|
||||
p->ai.mid1.cur_building_rule = 0xFF;
|
||||
|
@ -726,10 +726,10 @@ static void AiWantLongIndustryRoute(Player *p)
|
|||
|
||||
// Fill middle field 2
|
||||
p->ai.mid2.spec_tile = AiGetPctTileBetween(
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile,
|
||||
0xAA
|
||||
);
|
||||
p->ai.src.spec_tile,
|
||||
p->ai.dst.spec_tile,
|
||||
0xAA
|
||||
);
|
||||
p->ai.mid2.use_tile = 0;
|
||||
p->ai.mid2.rand_rng = 6;
|
||||
p->ai.mid2.cur_building_rule = 0xFF;
|
||||
|
@ -781,8 +781,7 @@ static void AiWantMediumIndustryRoute(Player *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -854,8 +853,7 @@ static void AiWantShortIndustryRoute(Player *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -928,8 +926,7 @@ static void AiWantMailRoute(Player *p)
|
|||
}
|
||||
|
||||
fr.cargo = CT_MAIL;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -1034,8 +1031,7 @@ static void AiWantPassengerRoute(Player *p)
|
|||
}
|
||||
|
||||
fr.cargo = CT_PASSENGERS;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 1)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -1047,9 +1043,9 @@ static void AiWantPassengerRoute(Player *p)
|
|||
p->ai.src.buildcmd_a = 0x10;
|
||||
p->ai.src.buildcmd_b = 0xFF;
|
||||
p->ai.src.direction = AiGetDirectionBetweenTiles(
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.from),
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.to)
|
||||
);
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.from),
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.to)
|
||||
);
|
||||
p->ai.src.cargo = fr.cargo;
|
||||
|
||||
// Fill the dest field
|
||||
|
@ -1062,9 +1058,9 @@ static void AiWantPassengerRoute(Player *p)
|
|||
p->ai.dst.buildcmd_a = 0xFF;
|
||||
p->ai.dst.buildcmd_b = 0xFF;
|
||||
p->ai.dst.direction = AiGetDirectionBetweenTiles(
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.to),
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.from)
|
||||
);
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.to),
|
||||
GET_TOWN_OR_INDUSTRY_TILE(fr.from)
|
||||
);
|
||||
p->ai.dst.cargo = fr.cargo;
|
||||
|
||||
// Fill common fields
|
||||
|
@ -1126,8 +1122,7 @@ static void AiWantLongRoadIndustryRoute(Player *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -1187,8 +1182,7 @@ static void AiWantMediumRoadIndustryRoute(Player *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.from);
|
||||
|
@ -1250,8 +1244,7 @@ static void AiWantLongRoadPassengerRoute(Player *p)
|
|||
|
||||
fr.cargo = CT_PASSENGERS;
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = GET_TOWN_OR_INDUSTRY_TILE(fr.to);
|
||||
|
@ -1309,8 +1302,7 @@ static void AiWantPassengerRouteInsideTown(Player *p)
|
|||
fr.cargo = CT_PASSENGERS;
|
||||
fr.from = fr.to = t;
|
||||
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2))
|
||||
return;
|
||||
if (!AiCheckIfRouteIsGood(p, &fr, 2)) return;
|
||||
|
||||
// Fill the source field
|
||||
p->ai.src.spec_tile = t->xy;
|
||||
|
@ -1360,7 +1352,6 @@ static void AiWantRoadRoute(Player *p)
|
|||
} else {
|
||||
AiWantPassengerRouteInsideTown(p);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void AiWantPassengerAircraftRoute(Player *p)
|
||||
|
@ -1615,14 +1606,13 @@ clear_town_stuff:;
|
|||
}
|
||||
} else if (p->mode == 2) {
|
||||
// Rail
|
||||
if (IsTileType(c, MP_RAILWAY))
|
||||
return CMD_ERROR;
|
||||
if (IsTileType(c, MP_RAILWAY)) return CMD_ERROR;
|
||||
|
||||
j = p->attr;
|
||||
k = 0;
|
||||
|
||||
// Build the rail
|
||||
for(i=0; i!=6; i++,j>>=1) {
|
||||
for (i = 0; i != 6; i++, j >>= 1) {
|
||||
if (j&1) {
|
||||
k = i;
|
||||
ret = DoCommandByTile(c, _cur_ai_player->ai.railtype_to_use, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
|
||||
|
@ -1683,9 +1673,9 @@ static int AiBuildDefaultRailTrack(TileIndex tile, byte p0, byte p1, byte p2, by
|
|||
int i;
|
||||
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 &&
|
||||
(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);
|
||||
if (*cost != CMD_ERROR && AiCheckTrackResources(tile, p->data, cargo))
|
||||
return i;
|
||||
|
@ -1762,7 +1752,8 @@ static void AiDoTerraformLand(TileIndex tile, int dir, int unk, int mode)
|
|||
|
||||
static void AiStateBuildDefaultRailBlocks(Player *p)
|
||||
{
|
||||
int i, j;
|
||||
uint i;
|
||||
int j;
|
||||
AiBuildRec *aib;
|
||||
int rule;
|
||||
int32 cost;
|
||||
|
@ -1823,8 +1814,7 @@ static void AiStateBuildDefaultRailBlocks(Player *p)
|
|||
aib = &p->ai.src;
|
||||
j = p->ai.num_build_rec;
|
||||
do {
|
||||
if (aib->cur_building_rule == 255)
|
||||
return;
|
||||
if (aib->cur_building_rule == 255) return;
|
||||
} while (++aib,--j);
|
||||
|
||||
// yep, all are done. switch state to the rail building state.
|
||||
|
@ -1850,16 +1840,14 @@ typedef struct AiRailPathFindData {
|
|||
|
||||
static bool AiEnumFollowTrack(TileIndex tile, AiRailPathFindData *a, int track, uint length, byte *state)
|
||||
{
|
||||
if (a->flag)
|
||||
return true;
|
||||
if (a->flag) return true;
|
||||
|
||||
if (length > 20 || tile == a->tile) {
|
||||
a->flag = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DistanceMax(tile, a->tile2) < 4)
|
||||
a->count++;
|
||||
if (DistanceMax(tile, a->tile2) < 4) a->count++;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1867,6 +1855,7 @@ static bool AiEnumFollowTrack(TileIndex tile, AiRailPathFindData *a, int track,
|
|||
static bool AiDoFollowTrack(Player *p)
|
||||
{
|
||||
AiRailPathFindData arpfd;
|
||||
|
||||
arpfd.tile = p->ai.start_tile_a;
|
||||
arpfd.tile2 = p->ai.cur_tile_a;
|
||||
arpfd.flag = false;
|
||||
|
@ -1909,26 +1898,29 @@ static bool AiIsTileBanned(const Player* p, TileIndex tile, byte val)
|
|||
{
|
||||
int i;
|
||||
|
||||
for(i=0; i!=p->ai.banned_tile_count; i++)
|
||||
if (p->ai.banned_tiles[i] == tile &&
|
||||
p->ai.banned_val[i] == val)
|
||||
return true;
|
||||
for (i = 0; i != p->ai.banned_tile_count; i++) {
|
||||
if (p->ai.banned_tiles[i] == tile && p->ai.banned_val[i] == val) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void AiBanTile(Player *p, TileIndex tile, byte val) {
|
||||
static void AiBanTile(Player* p, TileIndex tile, byte val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i=lengthof(p->ai.banned_tiles)-1; i!=0; i--) {
|
||||
p->ai.banned_tiles[i] = p->ai.banned_tiles[i-1];
|
||||
p->ai.banned_val[i] = p->ai.banned_val[i-1];
|
||||
for (i = lengthof(p->ai.banned_tiles) - 1; i != 0; i--) {
|
||||
p->ai.banned_tiles[i] = p->ai.banned_tiles[i - 1];
|
||||
p->ai.banned_val[i] = p->ai.banned_val[i - 1];
|
||||
}
|
||||
|
||||
p->ai.banned_tiles[0] = tile;
|
||||
p->ai.banned_val[0] = val;
|
||||
|
||||
if (p->ai.banned_tile_count != lengthof(p->ai.banned_tiles))
|
||||
if (p->ai.banned_tile_count != lengthof(p->ai.banned_tiles)) {
|
||||
p->ai.banned_tile_count++;
|
||||
}
|
||||
}
|
||||
|
||||
static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir);
|
||||
|
@ -3201,11 +3193,13 @@ static void AiStateBuildRoadVehicles(Player *p)
|
|||
|
||||
loco_id = _new_roadveh_id;
|
||||
|
||||
for(i=0; p->ai.order_list_blocks[i] != 0xFF; i++) {
|
||||
AiBuildRec *aib = (&p->ai.src) + p->ai.order_list_blocks[i];
|
||||
bool is_pass = (p->ai.cargo_type == CT_PASSENGERS ||
|
||||
p->ai.cargo_type == CT_MAIL ||
|
||||
(_opt.landscape==LT_NORMAL && p->ai.cargo_type == CT_VALUABLES));
|
||||
for (i = 0; p->ai.order_list_blocks[i] != 0xFF; i++) {
|
||||
AiBuildRec* aib = &p->ai.src + p->ai.order_list_blocks[i];
|
||||
bool is_pass = (
|
||||
p->ai.cargo_type == CT_PASSENGERS ||
|
||||
p->ai.cargo_type == CT_MAIL ||
|
||||
(_opt.landscape == LT_NORMAL && p->ai.cargo_type == CT_VALUABLES)
|
||||
);
|
||||
Order order;
|
||||
|
||||
order.type = OT_GOTO_STATION;
|
||||
|
@ -3220,15 +3214,10 @@ static void AiStateBuildRoadVehicles(Player *p)
|
|||
}
|
||||
|
||||
DoCommandByTile(0, loco_id, 0, DC_EXEC, CMD_START_STOP_ROADVEH);
|
||||
|
||||
DoCommandByTile(0, loco_id, _ai_service_interval, DC_EXEC, CMD_CHANGE_TRAIN_SERVICE_INT);
|
||||
|
||||
if (p->ai.num_want_fullload != 0)
|
||||
p->ai.num_want_fullload--;
|
||||
|
||||
if (--p->ai.num_loco_to_build == 0) {
|
||||
p->ai.state = AIS_0;
|
||||
}
|
||||
if (p->ai.num_want_fullload != 0) p->ai.num_want_fullload--;
|
||||
if (--p->ai.num_loco_to_build == 0) p->ai.state = AIS_0;
|
||||
}
|
||||
|
||||
static void AiStateDeleteRoadBlocks(Player *p)
|
||||
|
|
|
@ -250,8 +250,7 @@ int AiNew_Build_Vehicle(Player *p, TileIndex tile, byte flag)
|
|||
int i = AiNew_PickVehicle(p);
|
||||
if (i == -1) return CMD_ERROR;
|
||||
|
||||
if (p->ainew.tbt == AI_TRAIN)
|
||||
return CMD_ERROR;
|
||||
if (p->ainew.tbt == AI_TRAIN) return CMD_ERROR;
|
||||
|
||||
return DoCommandByTile(tile, i, 0, flag, CMD_BUILD_ROAD_VEH);
|
||||
}
|
||||
|
|
228
aircraft_cmd.c
228
aircraft_cmd.c
|
@ -155,8 +155,9 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
avi = AircraftVehInfo(p1);
|
||||
// allocate 2 or 3 vehicle structs, depending on type
|
||||
if (!AllocateVehicles(vl, (avi->subtype & 1) == 0 ? 3 : 2) ||
|
||||
IsOrderPoolFull())
|
||||
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
|
||||
IsOrderPoolFull()) {
|
||||
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
|
||||
}
|
||||
|
||||
unit_num = GetFreeUnitNumber(VEH_Aircraft);
|
||||
if (unit_num > _patches.max_aircraft)
|
||||
|
@ -546,21 +547,15 @@ static void CheckIfAircraftNeedsService(Vehicle *v)
|
|||
{
|
||||
const Station* st;
|
||||
|
||||
if (_patches.servint_aircraft == 0)
|
||||
return;
|
||||
|
||||
if (!VehicleNeedsService(v))
|
||||
return;
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
if (_patches.servint_aircraft == 0) return;
|
||||
if (!VehicleNeedsService(v)) return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
if (v->current_order.type == OT_GOTO_DEPOT &&
|
||||
v->current_order.flags & OF_HALT_IN_DEPOT)
|
||||
return;
|
||||
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v))
|
||||
return;
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v)) return;
|
||||
|
||||
st = GetStation(v->current_order.station);
|
||||
// only goto depot if the target airport has terminals (eg. it is airport)
|
||||
|
@ -581,11 +576,9 @@ void OnNewDay_Aircraft(Vehicle *v)
|
|||
{
|
||||
int32 cost;
|
||||
|
||||
if (v->subtype > 2)
|
||||
return;
|
||||
if (v->subtype > 2) return;
|
||||
|
||||
if ((++v->day_counter & 7) == 0)
|
||||
DecreaseVehicleValue(v);
|
||||
if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v);
|
||||
|
||||
CheckOrders(v->index, OC_INIT);
|
||||
|
||||
|
@ -593,8 +586,7 @@ void OnNewDay_Aircraft(Vehicle *v)
|
|||
AgeVehicle(v);
|
||||
CheckIfAircraftNeedsService(v);
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
cost = AircraftVehInfo(v->engine_type)->running_cost * _price.aircraft_running / 364;
|
||||
|
||||
|
@ -622,13 +614,12 @@ void AircraftYearlyLoop(void)
|
|||
|
||||
static void AgeAircraftCargo(Vehicle *v)
|
||||
{
|
||||
if (_age_cargo_skip_counter != 0)
|
||||
return;
|
||||
if (_age_cargo_skip_counter != 0) return;
|
||||
|
||||
do {
|
||||
if (v->cargo_days != 0xFF)
|
||||
v->cargo_days++;
|
||||
} while ( (v=v->next) != NULL );
|
||||
if (v->cargo_days != 0xFF) v->cargo_days++;
|
||||
v = v->next;
|
||||
} while (v != NULL);
|
||||
}
|
||||
|
||||
static void HelicopterTickHandler(Vehicle *v)
|
||||
|
@ -639,8 +630,7 @@ static void HelicopterTickHandler(Vehicle *v)
|
|||
|
||||
u = v->next->next;
|
||||
|
||||
if (u->vehstatus & VS_HIDDEN)
|
||||
return;
|
||||
if (u->vehstatus & VS_HIDDEN) return;
|
||||
|
||||
// if true, helicopter rotors do not rotate. This should only be the case if a helicopter is
|
||||
// loading/unloading at a terminal or stopped
|
||||
|
@ -707,7 +697,8 @@ static void SetAircraftPosition(Vehicle *v, int x, int y, int z)
|
|||
VehiclePositionChanged(u);
|
||||
EndVehicleMove(u);
|
||||
|
||||
if ((u=u->next) != NULL) {
|
||||
u = u->next;
|
||||
if (u != NULL) {
|
||||
u->x_pos = x;
|
||||
u->y_pos = y;
|
||||
u->z_pos = z + 5;
|
||||
|
@ -729,7 +720,8 @@ static void ServiceAircraft(Vehicle *v)
|
|||
|
||||
u = v->next;
|
||||
u->vehstatus |= VS_HIDDEN;
|
||||
if ((u=u->next) != NULL) {
|
||||
u = u->next;
|
||||
if (u != NULL) {
|
||||
u->vehstatus |= VS_HIDDEN;
|
||||
u->cur_speed = 0;
|
||||
}
|
||||
|
@ -752,10 +744,10 @@ static bool UpdateAircraftSpeed(Vehicle *v)
|
|||
byte t;
|
||||
|
||||
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
|
||||
if(v->vehstatus&VS_AIRCRAFT_BROKEN) spd = min(spd, 27);
|
||||
if (v->vehstatus & VS_AIRCRAFT_BROKEN) spd = min(spd, 27);
|
||||
|
||||
//updates statusbar only if speed have changed to save CPU time
|
||||
if (spd != v->cur_speed) {
|
||||
|
@ -764,19 +756,15 @@ static bool UpdateAircraftSpeed(Vehicle *v)
|
|||
InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
|
||||
}
|
||||
|
||||
if (!(v->direction & 1)) {
|
||||
spd = spd * 3 >> 2;
|
||||
}
|
||||
if (!(v->direction & 1)) spd = spd * 3 / 4;
|
||||
|
||||
if (spd == 0)
|
||||
return false;
|
||||
if (spd == 0) return false;
|
||||
|
||||
if ((byte)++spd == 0)
|
||||
return true;
|
||||
if ((byte)++spd == 0) return true;
|
||||
|
||||
v->progress = (t = v->progress) - (byte)spd;
|
||||
|
||||
return (t < v->progress);
|
||||
return t < v->progress;
|
||||
}
|
||||
|
||||
// get Aircraft running altitude
|
||||
|
@ -822,9 +810,7 @@ static bool AircraftController(Vehicle *v)
|
|||
// Make sure the rotors don't rotate too fast
|
||||
if (u->cur_speed > 32) {
|
||||
v->cur_speed = 0;
|
||||
if (--u->cur_speed == 32) {
|
||||
SndPlayVehicleFx(SND_18_HELICOPTER, v);
|
||||
}
|
||||
if (--u->cur_speed == 32) SndPlayVehicleFx(SND_18_HELICOPTER, v);
|
||||
} else {
|
||||
u->cur_speed = 32;
|
||||
if (UpdateAircraftSpeed(v)) {
|
||||
|
@ -865,9 +851,8 @@ static bool AircraftController(Vehicle *v)
|
|||
u = v->next->next;
|
||||
|
||||
// Increase speed of rotors. When speed is 80, we've landed.
|
||||
if (u->cur_speed >= 80)
|
||||
return true;
|
||||
u->cur_speed+=4;
|
||||
if (u->cur_speed >= 80) return true;
|
||||
u->cur_speed += 4;
|
||||
} else if (v->z_pos > z) {
|
||||
SetAircraftPosition(v, v->x_pos, v->y_pos, v->z_pos-1);
|
||||
} else {
|
||||
|
@ -886,10 +871,7 @@ static bool AircraftController(Vehicle *v)
|
|||
|
||||
// At final pos?
|
||||
if (dist == 0) {
|
||||
|
||||
// Clamp speed to 12.
|
||||
if (v->cur_speed > 12)
|
||||
v->cur_speed = 12;
|
||||
if (v->cur_speed > 12) v->cur_speed = 12;
|
||||
|
||||
// Change direction smoothly to final direction.
|
||||
dirdiff = amd->direction - v->direction;
|
||||
|
@ -900,8 +882,7 @@ static bool AircraftController(Vehicle *v)
|
|||
return true;
|
||||
}
|
||||
|
||||
if (!UpdateAircraftSpeed(v))
|
||||
return false;
|
||||
if (!UpdateAircraftSpeed(v)) return false;
|
||||
|
||||
v->direction = (v->direction+((dirdiff&7)<5?1:-1)) & 7;
|
||||
v->cur_speed >>= 1;
|
||||
|
@ -910,24 +891,17 @@ static bool AircraftController(Vehicle *v)
|
|||
return false;
|
||||
}
|
||||
|
||||
// Clamp speed?
|
||||
if (!(amd->flag & AMED_NOSPDCLAMP) && v->cur_speed > 12)
|
||||
v->cur_speed = 12;
|
||||
if (!(amd->flag & AMED_NOSPDCLAMP) && v->cur_speed > 12) v->cur_speed = 12;
|
||||
|
||||
if (!UpdateAircraftSpeed(v))
|
||||
return false;
|
||||
if (!UpdateAircraftSpeed(v)) return false;
|
||||
|
||||
// Decrease animation counter.
|
||||
if (v->load_unload_time_rem != 0)
|
||||
v->load_unload_time_rem--;
|
||||
if (v->load_unload_time_rem != 0) v->load_unload_time_rem--;
|
||||
|
||||
// Turn. Do it slowly if in the air.
|
||||
newdir = GetDirectionTowards(v, x + amd->x, y + amd->y);
|
||||
if (newdir != v->direction) {
|
||||
if (amd->flag & AMED_SLOWTURN) {
|
||||
if (v->load_unload_time_rem == 0) {
|
||||
v->load_unload_time_rem = 8;
|
||||
}
|
||||
if (v->load_unload_time_rem == 0) v->load_unload_time_rem = 8;
|
||||
v->direction = newdir;
|
||||
} else {
|
||||
v->cur_speed >>= 1;
|
||||
|
@ -940,19 +914,15 @@ static bool AircraftController(Vehicle *v)
|
|||
v->tile = gp.new_tile;
|
||||
|
||||
// If vehicle is in the air, use tile coordinate 0.
|
||||
if (amd->flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) {
|
||||
v->tile = 0;
|
||||
}
|
||||
if (amd->flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0;
|
||||
|
||||
// Adjust Z for land or takeoff?
|
||||
z = v->z_pos;
|
||||
|
||||
if (amd->flag & AMED_TAKEOFF) {
|
||||
z+=2;
|
||||
// Determine running altitude
|
||||
z += 2;
|
||||
maxz = GetAircraftFlyingAltitude(v);
|
||||
if (z > maxz)
|
||||
z = maxz;
|
||||
if (z > maxz) z = maxz;
|
||||
}
|
||||
|
||||
if (amd->flag & AMED_LAND) {
|
||||
|
@ -969,7 +939,7 @@ static bool AircraftController(Vehicle *v)
|
|||
if (curz > z) {
|
||||
z++;
|
||||
} else {
|
||||
int t = max(1, dist-4);
|
||||
int t = max(1, dist - 4);
|
||||
|
||||
z -= ((z - curz) + t - 1) / t;
|
||||
if (z < curz) z = curz;
|
||||
|
@ -980,11 +950,13 @@ static bool AircraftController(Vehicle *v)
|
|||
if (amd->flag & AMED_BRAKE) {
|
||||
curz = GetSlopeZ(x, y) + 1;
|
||||
|
||||
if (z > curz) z--;
|
||||
else if (z < curz) z++;
|
||||
if (z > curz) {
|
||||
z--;
|
||||
} else if (z < curz) {
|
||||
z++;
|
||||
}
|
||||
|
||||
if (dist < 64 && v->cur_speed > 12)
|
||||
v->cur_speed -= 4;
|
||||
if (dist < 64 && v->cur_speed > 12) v->cur_speed -= 4;
|
||||
}
|
||||
|
||||
SetAircraftPosition(v, gp.x, gp.y, z);
|
||||
|
@ -1061,8 +1033,7 @@ static const int8 _aircraft_smoke_xy[16] = {
|
|||
|
||||
static void HandleAircraftSmoke(Vehicle *v)
|
||||
{
|
||||
if (!(v->vehstatus&VS_AIRCRAFT_BROKEN))
|
||||
return;
|
||||
if (!(v->vehstatus & VS_AIRCRAFT_BROKEN)) return;
|
||||
|
||||
if (v->cur_speed < 10) {
|
||||
v->vehstatus &= ~VS_AIRCRAFT_BROKEN;
|
||||
|
@ -1098,8 +1069,7 @@ static void ProcessAircraftOrder(Vehicle *v)
|
|||
v->cur_order_index++;
|
||||
}
|
||||
|
||||
if (v->cur_order_index >= v->num_orders)
|
||||
v->cur_order_index = 0;
|
||||
if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
|
||||
|
||||
order = GetVehicleOrder(v, v->cur_order_index);
|
||||
|
||||
|
@ -1132,18 +1102,12 @@ static void ProcessAircraftOrder(Vehicle *v)
|
|||
|
||||
static void HandleAircraftLoading(Vehicle *v, int mode)
|
||||
{
|
||||
if (v->current_order.type == OT_NOTHING)
|
||||
return;
|
||||
if (v->current_order.type == OT_NOTHING) return;
|
||||
|
||||
if (v->current_order.type != OT_DUMMY) {
|
||||
if (v->current_order.type != OT_LOADING)
|
||||
return;
|
||||
|
||||
if (mode != 0)
|
||||
return;
|
||||
|
||||
if (--v->load_unload_time_rem)
|
||||
return;
|
||||
if (v->current_order.type != OT_LOADING) return;
|
||||
if (mode != 0) return;
|
||||
if (--v->load_unload_time_rem != 0) return;
|
||||
|
||||
if (v->current_order.flags & OF_FULL_LOAD && CanFillVehicle(v)) {
|
||||
SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_INC);
|
||||
|
@ -1155,8 +1119,7 @@ static void HandleAircraftLoading(Vehicle *v, int mode)
|
|||
Order b = v->current_order;
|
||||
v->current_order.type = OT_NOTHING;
|
||||
v->current_order.flags = 0;
|
||||
if (!(b.flags & OF_NON_STOP))
|
||||
return;
|
||||
if (!(b.flags & OF_NON_STOP)) return;
|
||||
}
|
||||
}
|
||||
v->cur_order_index++;
|
||||
|
@ -1183,7 +1146,7 @@ static void CrashAirplane(Vehicle *v)
|
|||
v->cargo_count = 0;
|
||||
v->next->cargo_count = 0,
|
||||
st = GetStation(v->u.air.targetairport);
|
||||
if(st->airport_tile==0) {
|
||||
if (st->airport_tile == 0) {
|
||||
newsitem = STR_PLANE_CRASH_OUT_OF_FUEL;
|
||||
} else {
|
||||
SetDParam(1, st->index);
|
||||
|
@ -1230,8 +1193,7 @@ static void AircraftEntersTerminal(Vehicle *v)
|
|||
Station *st;
|
||||
Order old_order;
|
||||
|
||||
if (v->current_order.type == OT_GOTO_DEPOT)
|
||||
return;
|
||||
if (v->current_order.type == OT_GOTO_DEPOT) return;
|
||||
|
||||
st = GetStation(v->u.air.targetairport);
|
||||
v->last_station_visited = v->u.air.targetairport;
|
||||
|
@ -1267,7 +1229,7 @@ static void AircraftEntersTerminal(Vehicle *v)
|
|||
InvalidateWindowClasses(WC_AIRCRAFT_LIST);
|
||||
}
|
||||
|
||||
static bool ValidateAircraftInHangar( uint data_a, uint data_b )
|
||||
static bool ValidateAircraftInHangar(uint data_a, uint data_b)
|
||||
{
|
||||
const Vehicle* v = GetVehicle(data_a);
|
||||
|
||||
|
@ -1348,7 +1310,8 @@ static void AircraftLeaveHangar(Vehicle *v)
|
|||
u->vehstatus &= ~VS_HIDDEN;
|
||||
|
||||
// Rotor blades
|
||||
if ((u=u->next) != NULL) {
|
||||
u = u->next;
|
||||
if (u != NULL) {
|
||||
u->vehstatus &= ~VS_HIDDEN;
|
||||
u->cur_speed = 80;
|
||||
}
|
||||
|
@ -1452,10 +1415,11 @@ static void AircraftEventHandler_AtTerminal(Vehicle *v, const AirportFTAClass *A
|
|||
v->u.air.state = (v->subtype != 0) ? TAKEOFF : HELITAKEOFF;
|
||||
break;
|
||||
case OT_GOTO_DEPOT: // visit hangar for serivicing, sale, etc.
|
||||
if (v->current_order.station == v->u.air.targetairport)
|
||||
if (v->current_order.station == v->u.air.targetairport) {
|
||||
v->u.air.state = HANGAR;
|
||||
else
|
||||
} else {
|
||||
v->u.air.state = (v->subtype != 0) ? TAKEOFF : HELITAKEOFF;
|
||||
}
|
||||
break;
|
||||
default: // orders have been deleted (no orders), goto depot and don't bother us
|
||||
v->current_order.type = OT_NOTHING;
|
||||
|
@ -1498,8 +1462,10 @@ static void AircraftEventHandler_HeliTakeOff(Vehicle *v, const AirportFTAClass *
|
|||
AircraftNextAirportPos_and_Order(v);
|
||||
|
||||
// check if the aircraft needs to be replaced or renewed and send it to a hangar if needed
|
||||
if ((v->owner == _local_player && p->engine_replacement[v->engine_type] != INVALID_ENGINE) ||
|
||||
(v->owner == _local_player && p->engine_renew && v->age - v->max_age > (p->engine_renew_months * 30))) {
|
||||
if (v->owner == _local_player && (
|
||||
p->engine_replacement[v->engine_type] != INVALID_ENGINE ||
|
||||
(p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30)
|
||||
)) {
|
||||
_current_player = _local_player;
|
||||
DoCommandP(v->tile, v->index, 1, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
|
||||
_current_player = OWNER_NONE;
|
||||
|
@ -1519,9 +1485,9 @@ static void AircraftEventHandler_Flying(Vehicle *v, const AirportFTAClass *Airpo
|
|||
// all other airports --> all types of flying devices (ALL)
|
||||
// heliport/oilrig, etc --> no airplanes (HELICOPTERS_ONLY)
|
||||
// runway busy or not allowed to use this airstation, circle
|
||||
if (! (v->subtype == Airport->acc_planes ||
|
||||
st->airport_tile == 0 || (st->owner != OWNER_NONE && st->owner != v->owner) )) {
|
||||
|
||||
if (v->subtype != Airport->acc_planes &&
|
||||
st->airport_tile != 0 &&
|
||||
(st->owner == OWNER_NONE || st->owner == v->owner)) {
|
||||
// {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
|
||||
// if it is an airplane, look for LANDING, for helicopter HELILANDING
|
||||
// it is possible to choose from multiple landing runways, so loop until a free one is found
|
||||
|
@ -1636,10 +1602,10 @@ static AircraftStateHandler * const _aircraft_state_handlers[] = {
|
|||
|
||||
static void AirportClearBlock(const Vehicle* v, const AirportFTAClass* Airport)
|
||||
{
|
||||
Station *st;
|
||||
// we have left the previous block, and entered the new one. Free the previous block
|
||||
if (Airport->layout[v->u.air.previous_pos].block != Airport->layout[v->u.air.pos].block) {
|
||||
st = GetStation(v->u.air.targetairport);
|
||||
Station* st = GetStation(v->u.air.targetairport);
|
||||
|
||||
CLRBITS(st->airport_flags, Airport->layout[v->u.air.previous_pos].block);
|
||||
}
|
||||
}
|
||||
|
@ -1689,10 +1655,10 @@ static bool AirportMove(Vehicle *v, const AirportFTAClass *Airport)
|
|||
// matches our heading
|
||||
do {
|
||||
if (v->u.air.state == current->heading || current->heading == TO_ALL) {
|
||||
if (AirportSetBlocks(v, current, Airport)) {
|
||||
v->u.air.pos = current->next_position;
|
||||
} // move to next position
|
||||
return retval;
|
||||
if (AirportSetBlocks(v, current, Airport)) {
|
||||
v->u.air.pos = current->next_position;
|
||||
} // move to next position
|
||||
return retval;
|
||||
}
|
||||
current = current->next_in_chain;
|
||||
} while (current != NULL);
|
||||
|
@ -1731,16 +1697,15 @@ static bool AirportHasBlock(Vehicle *v, AirportFTA *current_pos, const AirportFT
|
|||
// returns true on success. Eg, next block was free and we have occupied it
|
||||
static bool AirportSetBlocks(Vehicle *v, AirportFTA *current_pos, const AirportFTAClass *Airport)
|
||||
{
|
||||
Station *st;
|
||||
uint32 airport_flags;
|
||||
AirportFTA *current, *reference, *next;
|
||||
next = &Airport->layout[current_pos->next_position];
|
||||
reference = &Airport->layout[v->u.air.pos];
|
||||
AirportFTA* next = &Airport->layout[current_pos->next_position];
|
||||
AirportFTA* reference = &Airport->layout[v->u.air.pos];
|
||||
AirportFTA* current;
|
||||
|
||||
// if the next position is in another block, check it and wait until it is free
|
||||
if (Airport->layout[current_pos->position].block != next->block) {
|
||||
airport_flags = next->block;
|
||||
st = GetStation(v->u.air.targetairport);
|
||||
uint32 airport_flags = next->block;
|
||||
Station* st = GetStation(v->u.air.targetairport);
|
||||
|
||||
//search for all all elements in the list with the same state, and blocks != N
|
||||
// this means more blocks should be checked/set
|
||||
current = current_pos;
|
||||
|
@ -1784,12 +1749,12 @@ static bool FreeTerminal(Vehicle *v, byte i, byte last_terminal)
|
|||
return false;
|
||||
}
|
||||
|
||||
static int GetNumTerminals(const AirportFTAClass *Airport)
|
||||
static uint GetNumTerminals(const AirportFTAClass *Airport)
|
||||
{
|
||||
int i, num = 0;
|
||||
uint num = 0;
|
||||
uint i;
|
||||
|
||||
for (i = Airport->terminals[0]; i > 0; i--)
|
||||
num += Airport->terminals[i];
|
||||
for (i = Airport->terminals[0]; i > 0; i--) num += Airport->terminals[i];
|
||||
|
||||
return num;
|
||||
}
|
||||
|
@ -1846,12 +1811,12 @@ static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *Airport)
|
|||
return FreeTerminal(v, 0, GetNumTerminals(Airport));
|
||||
}
|
||||
|
||||
static int GetNumHelipads(const AirportFTAClass *Airport)
|
||||
static uint GetNumHelipads(const AirportFTAClass *Airport)
|
||||
{
|
||||
int i, num = 0;
|
||||
uint num = 0;
|
||||
uint i;
|
||||
|
||||
for (i = Airport->helipads[0]; i > 0; i--)
|
||||
num += Airport->helipads[i];
|
||||
for (i = Airport->helipads[0]; i > 0; i--) num += Airport->helipads[i];
|
||||
|
||||
return num;
|
||||
}
|
||||
|
@ -1914,9 +1879,7 @@ static void AircraftEventHandler(Vehicle *v, int loop)
|
|||
return;
|
||||
}
|
||||
|
||||
/* exit if aircraft is stopped */
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
/* aircraft is broken down? */
|
||||
if (v->breakdown_ctr != 0) {
|
||||
|
@ -1931,8 +1894,7 @@ static void AircraftEventHandler(Vehicle *v, int loop)
|
|||
ProcessAircraftOrder(v);
|
||||
HandleAircraftLoading(v, loop);
|
||||
|
||||
if (v->current_order.type >= OT_LOADING)
|
||||
return;
|
||||
if (v->current_order.type >= OT_LOADING) return;
|
||||
|
||||
// pass the right airport structure to the functions
|
||||
// DEREF_STATION gets target airport (Station *st), its type is passed to GetAirport
|
||||
|
@ -1944,24 +1906,22 @@ void Aircraft_Tick(Vehicle *v)
|
|||
{
|
||||
int i;
|
||||
|
||||
if (v->subtype > 2)
|
||||
return;
|
||||
if (v->subtype > 2) return;
|
||||
|
||||
if (v->subtype == 0)
|
||||
HelicopterTickHandler(v);
|
||||
if (v->subtype == 0) HelicopterTickHandler(v);
|
||||
|
||||
AgeAircraftCargo(v);
|
||||
|
||||
for(i=0; i!=6; i++) {
|
||||
for (i = 0; i != 6; i++) {
|
||||
AircraftEventHandler(v, i);
|
||||
if (v->type != VEH_Aircraft) // In case it was deleted
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateOilRig( void )
|
||||
void UpdateOilRig(void)
|
||||
{
|
||||
Station *st;
|
||||
Station* st;
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (st->airport_type == 5) st->airport_type = AT_OILRIG;
|
||||
|
@ -1987,7 +1947,7 @@ void UpdateOldAircraft(void)
|
|||
// skip those
|
||||
if (v_oldstyle->type == VEH_Aircraft && v_oldstyle->subtype <= 2) {
|
||||
// airplane in terminal stopped doesn't hurt anyone, so goto next
|
||||
if ((v_oldstyle->vehstatus & VS_STOPPED) && (v_oldstyle->u.air.state == 0)) {
|
||||
if (v_oldstyle->vehstatus & VS_STOPPED && v_oldstyle->u.air.state == 0) {
|
||||
v_oldstyle->u.air.state = HANGAR;
|
||||
continue;
|
||||
}
|
||||
|
|
105
aircraft_gui.c
105
aircraft_gui.c
|
@ -65,13 +65,11 @@ static void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selectio
|
|||
{
|
||||
int image = GetAircraftImage(v, 6);
|
||||
uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
|
||||
if (v->vehstatus & VS_CRASHED)
|
||||
ormod = PALETTE_CRASH;
|
||||
DrawSprite(image | ormod, x+25, y+10);
|
||||
if (v->subtype == 0)
|
||||
DrawSprite(SPR_ROTOR_STOPPED, x + 25, y + 5);
|
||||
if (v->vehstatus & VS_CRASHED) ormod = PALETTE_CRASH;
|
||||
DrawSprite(image | ormod, x + 25, y + 10);
|
||||
if (v->subtype == 0) DrawSprite(SPR_ROTOR_STOPPED, x + 25, y + 5);
|
||||
if (v->index == selection) {
|
||||
DrawFrameRect(x-1, y-1, x+58, y+21, 0xF, FR_BORDERONLY);
|
||||
DrawFrameRect(x - 1, y - 1, x + 58, y + 21, 0xF, FR_BORDERONLY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,20 +88,14 @@ void CcBuildAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
|
||||
void CcCloneAircraft(bool success, uint tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) {
|
||||
const Vehicle* v = GetVehicle(_new_aircraft_id);
|
||||
|
||||
ShowAircraftViewWindow(v);
|
||||
}
|
||||
if (success) ShowAircraftViewWindow(GetVehicle(_new_aircraft_id));
|
||||
}
|
||||
|
||||
static void NewAircraftWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
if (w->window_number == 0)
|
||||
SETBIT(w->disabled_state, 5);
|
||||
if (w->window_number == 0) SETBIT(w->disabled_state, 5);
|
||||
|
||||
{
|
||||
int count = 0;
|
||||
|
@ -111,8 +103,7 @@ static void NewAircraftWndProc(Window *w, WindowEvent *e)
|
|||
const Engine* e = GetEngine(AIRCRAFT_ENGINES_INDEX);
|
||||
|
||||
do {
|
||||
if (HASBIT(e->player_avail, _local_player))
|
||||
count++;
|
||||
if (HASBIT(e->player_avail, _local_player)) count++;
|
||||
} while (++e,--num);
|
||||
SetVScrollCount(w, count);
|
||||
}
|
||||
|
@ -508,7 +499,7 @@ static void AircraftViewWndProc(Window *w, WindowEvent *e)
|
|||
switch(e->event) {
|
||||
case WE_PAINT: {
|
||||
const Vehicle* v = GetVehicle(w->window_number);
|
||||
uint32 disabled = 1<<8;
|
||||
uint32 disabled = 1 << 8;
|
||||
StringID str;
|
||||
|
||||
{
|
||||
|
@ -520,8 +511,7 @@ static void AircraftViewWndProc(Window *w, WindowEvent *e)
|
|||
disabled = 0;
|
||||
}
|
||||
|
||||
if (v->owner != _local_player)
|
||||
disabled |= 1<<8 | 1<<7;
|
||||
if (v->owner != _local_player) disabled |= 1 << 8 | 1 << 7;
|
||||
w->disabled_state = disabled;
|
||||
|
||||
/* draw widgets & caption */
|
||||
|
@ -555,8 +545,9 @@ static void AircraftViewWndProc(Window *w, WindowEvent *e)
|
|||
if (v->num_orders == 0) {
|
||||
str = STR_NO_ORDERS + _patches.vehicle_speed;
|
||||
SetDParam(0, v->cur_speed * 8);
|
||||
} else
|
||||
} else {
|
||||
str = STR_EMPTY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -656,9 +647,12 @@ static void DrawAircraftDepotWindow(Window *w)
|
|||
/* determine amount of items for scroller */
|
||||
num = 0;
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Aircraft && v->subtype <= 2 && v->vehstatus&VS_HIDDEN &&
|
||||
v->tile == tile)
|
||||
num++;
|
||||
if (v->type == VEH_Aircraft &&
|
||||
v->subtype <= 2 &&
|
||||
v->vehstatus & VS_HIDDEN &&
|
||||
v->tile == tile) {
|
||||
num++;
|
||||
}
|
||||
}
|
||||
SetVScrollCount(w, (num + w->hscroll.cap - 1) / w->hscroll.cap);
|
||||
|
||||
|
@ -729,9 +723,12 @@ static void AircraftDepotClickAircraft(Window *w, int x, int y)
|
|||
int mode = GetVehicleFromAircraftDepotWndPt(w, x, y, &v);
|
||||
|
||||
// share / copy orders
|
||||
if (_thd.place_mode && mode <= 0) { _place_clicked_vehicle = v; return; }
|
||||
if (_thd.place_mode && mode <= 0) {
|
||||
_place_clicked_vehicle = v;
|
||||
return;
|
||||
}
|
||||
|
||||
switch(mode) {
|
||||
switch (mode) {
|
||||
case 1:
|
||||
return;
|
||||
|
||||
|
@ -789,30 +786,31 @@ static void AircraftDepotWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
case 5: /* click aircraft */
|
||||
AircraftDepotClickAircraft(w, e->click.pt.x, e->click.pt.y);
|
||||
break;
|
||||
case 7: /* show build aircraft window */
|
||||
ResetObjectToPlace();
|
||||
ShowBuildAircraftWindow(w->window_number);
|
||||
break;
|
||||
case 5: /* click aircraft */
|
||||
AircraftDepotClickAircraft(w, e->click.pt.x, e->click.pt.y);
|
||||
break;
|
||||
|
||||
case 8: /* clone button */
|
||||
InvalidateWidget(w, 8);
|
||||
TOGGLEBIT(w->click_state, 8);
|
||||
|
||||
if (HASBIT(w->click_state, 8)) {
|
||||
_place_clicked_vehicle = NULL;
|
||||
SetObjectToPlaceWnd(SPR_CURSOR_CLONE, VHM_RECT, w);
|
||||
} else {
|
||||
case 7: /* show build aircraft window */
|
||||
ResetObjectToPlace();
|
||||
}
|
||||
break;
|
||||
ShowBuildAircraftWindow(w->window_number);
|
||||
break;
|
||||
|
||||
case 9: /* scroll to tile */
|
||||
ResetObjectToPlace();
|
||||
ScrollMainWindowToTile(w->window_number);
|
||||
break;
|
||||
case 8: /* clone button */
|
||||
InvalidateWidget(w, 8);
|
||||
TOGGLEBIT(w->click_state, 8);
|
||||
|
||||
if (HASBIT(w->click_state, 8)) {
|
||||
_place_clicked_vehicle = NULL;
|
||||
SetObjectToPlaceWnd(SPR_CURSOR_CLONE, VHM_RECT, w);
|
||||
} else {
|
||||
ResetObjectToPlace();
|
||||
}
|
||||
break;
|
||||
|
||||
case 9: /* scroll to tile */
|
||||
ResetObjectToPlace();
|
||||
ScrollMainWindowToTile(w->window_number);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -920,7 +918,7 @@ void ShowAircraftDepotWindow(TileIndex tile)
|
|||
Window *w;
|
||||
|
||||
w = AllocateWindowDescFront(&_aircraft_depot_desc, tile);
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->caption_color = GetTileOwner(tile);
|
||||
w->vscroll.cap = 2;
|
||||
w->hscroll.cap = 4;
|
||||
|
@ -950,8 +948,7 @@ static void DrawSmallOrderList(const Vehicle *v, int x, int y) {
|
|||
DrawString(x, y, STR_A036, 0);
|
||||
|
||||
y += 6;
|
||||
if (++i == 4)
|
||||
break;
|
||||
if (++i == 4) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1008,8 +1005,7 @@ static void PlayerAircraftWndProc(Window *w, WindowEvent *e)
|
|||
SetVScrollCount(w, vl->list_length);
|
||||
|
||||
// disable 'Sort By' tooltip on Unsorted sorting criteria
|
||||
if (vl->sort_type == SORT_BY_UNSORTED)
|
||||
w->disabled_state |= (1 << 3);
|
||||
if (vl->sort_type == SORT_BY_UNSORTED) w->disabled_state |= (1 << 3);
|
||||
|
||||
/* draw the widgets */
|
||||
{
|
||||
|
@ -1137,8 +1133,7 @@ static void PlayerAircraftWndProc(Window *w, WindowEvent *e)
|
|||
_sorting.aircraft.criteria = vl->sort_type;
|
||||
|
||||
// enable 'Sort By' if a sorter criteria is chosen
|
||||
if (vl->sort_type != SORT_BY_UNSORTED)
|
||||
CLRBIT(w->disabled_state, 3);
|
||||
if (vl->sort_type != SORT_BY_UNSORTED) CLRBIT(w->disabled_state, 3);
|
||||
}
|
||||
SetWindowDirty(w);
|
||||
break;
|
||||
|
@ -1198,7 +1193,7 @@ void ShowPlayerAircraft(PlayerID player, StationID station)
|
|||
w = AllocateWindowDescFront(&_other_player_aircraft_desc, (station << 16) | player);
|
||||
}
|
||||
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->caption_color = w->window_number;
|
||||
w->vscroll.cap = 4;
|
||||
w->widget[7].unkA = (w->vscroll.cap << 8) + 1;
|
||||
|
|
|
@ -376,7 +376,7 @@ uint32 GetValidAirports(void)
|
|||
|
||||
// 1980-1-1 is --> 21915
|
||||
// 1990-1-1 is --> 25568
|
||||
if (_date >= 21915) {SETBIT(bytemask, 3);} // metropilitan airport 1980
|
||||
if (_date >= 25568) {SETBIT(bytemask, 4);} // international airport 1990
|
||||
if (_date >= 21915) SETBIT(bytemask, 3); // metropilitan airport 1980
|
||||
if (_date >= 25568) SETBIT(bytemask, 4); // international airport 1990
|
||||
return bytemask;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ static OnButtonClick * const _build_air_button_proc[] = {
|
|||
|
||||
static void BuildAirToolbWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
break;
|
||||
|
@ -156,9 +156,9 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
|
|||
if (!HASBIT(avail_airports, 0) && sel == AT_SMALL) sel = AT_LARGE;
|
||||
if (!HASBIT(avail_airports, 1) && sel == AT_LARGE) sel = AT_SMALL;
|
||||
|
||||
/* 'Country Airport' starts at widget 3, and if its bit is set, it is available,
|
||||
* so take its opposite value to set the disabled_state. There are only 5 available
|
||||
* airports, so XOr with 0x1F (1 1111) */
|
||||
/* 'Country Airport' starts at widget 3, and if its bit is set, it is
|
||||
* available, so take its opposite value to set the disabled_state. There
|
||||
* are only 5 available airports, so XOR with 0x1F (1 1111) */
|
||||
w->disabled_state = (avail_airports ^ 0x1F) << 3;
|
||||
|
||||
_selected_airport_type = sel;
|
||||
|
@ -177,7 +177,7 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
}
|
||||
|
||||
if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
|
||||
if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
|
||||
|
||||
DrawWindowWidgets(w);
|
||||
// strings such as 'Size' and 'Coverage Area'
|
||||
|
@ -188,7 +188,7 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 3: case 4: case 5: case 6: case 7:
|
||||
_selected_airport_type = e->click.widget - 3;
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
|
@ -212,8 +212,7 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,7 +33,8 @@ void CcBuildBridge(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
static void BuildBridge(Window *w, int i)
|
||||
{
|
||||
DeleteWindow(w);
|
||||
DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile, _bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
|
||||
DoCommandP(_bridgedata.end_tile, _bridgedata.start_tile,
|
||||
_bridgedata.indexes[i] | (_bridgedata.type << 8), CcBuildBridge,
|
||||
CMD_BUILD_BRIDGE | CMD_AUTO | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
|
||||
}
|
||||
|
||||
|
|
50
clear_cmd.c
50
clear_cmd.c
|
@ -37,13 +37,11 @@ static int TerraformAllowTileProcess(TerraformerState *ts, TileIndex tile)
|
|||
TileIndex *t;
|
||||
int count;
|
||||
|
||||
if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY())
|
||||
return -1;
|
||||
if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return -1;
|
||||
|
||||
t = ts->tile_table;
|
||||
for(count = ts->tile_table_count; count != 0; count--,t++) {
|
||||
if (*t == tile)
|
||||
return 0;
|
||||
for (count = ts->tile_table_count; count != 0; count--, t++) {
|
||||
if (*t == tile) return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -54,9 +52,8 @@ static int TerraformGetHeightOfTile(TerraformerState *ts, TileIndex tile)
|
|||
TerraformerHeightMod *mod = ts->modheight;
|
||||
int count;
|
||||
|
||||
for(count = ts->modheight_count; count != 0; count--, mod++) {
|
||||
if (mod->tile == tile)
|
||||
return mod->height;
|
||||
for (count = ts->modheight_count; count != 0; count--, mod++) {
|
||||
if (mod->tile == tile) return mod->height;
|
||||
}
|
||||
|
||||
return TileHeight(tile);
|
||||
|
@ -69,12 +66,10 @@ static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
|
|||
|
||||
count = ts->tile_table_count;
|
||||
|
||||
if (count >= 625)
|
||||
return;
|
||||
if (count >= 625) return;
|
||||
|
||||
for(t = ts->tile_table; count != 0; count--,t++) {
|
||||
if (*t == tile)
|
||||
return;
|
||||
if (*t == tile) return;
|
||||
}
|
||||
|
||||
ts->tile_table[ts->tile_table_count++] = tile;
|
||||
|
@ -116,8 +111,7 @@ static int TerraformProc(TerraformerState *ts, TileIndex tile, int mode)
|
|||
|
||||
// If we have a single diagonal track there, the other side of
|
||||
// tile can be terraformed.
|
||||
if ((_m[tile].m5&~0x40) == _railway_modes[mode])
|
||||
return 0;
|
||||
if ((_m[tile].m5 & ~0x40) == _railway_modes[mode]) return 0;
|
||||
}
|
||||
|
||||
ret = DoCommandByTile(tile, 0,0, ts->flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
|
||||
|
@ -129,8 +123,7 @@ static int TerraformProc(TerraformerState *ts, TileIndex tile, int mode)
|
|||
|
||||
ts->cost += ret;
|
||||
|
||||
if (ts->tile_table_count >= 625)
|
||||
return -1;
|
||||
if (ts->tile_table_count >= 625) return -1;
|
||||
ts->tile_table[ts->tile_table_count++] = tile;
|
||||
|
||||
return 0;
|
||||
|
@ -151,12 +144,10 @@ static bool TerraformTileHeight(TerraformerState *ts, TileIndex tile, int height
|
|||
|
||||
_error_message = STR_1004_TOO_HIGH;
|
||||
|
||||
if (height > 0xF)
|
||||
return false;
|
||||
if (height > 15) return false;
|
||||
|
||||
nh = TerraformGetHeightOfTile(ts, tile);
|
||||
if (nh < 0 || height == nh)
|
||||
return false;
|
||||
if (nh < 0 || height == nh) return false;
|
||||
|
||||
if (TerraformProc(ts, tile, 0) < 0) return false;
|
||||
if (TerraformProc(ts, tile + TileDiffXY( 0, -1), 1) < 0) return false;
|
||||
|
@ -166,7 +157,7 @@ static bool TerraformTileHeight(TerraformerState *ts, TileIndex tile, int height
|
|||
mod = ts->modheight;
|
||||
count = ts->modheight_count;
|
||||
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
if (count == 0) {
|
||||
if (ts->modheight_count >= 576)
|
||||
return false;
|
||||
|
@ -280,8 +271,9 @@ int32 CmdTerraformLand(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
|
||||
if (t <= z) z = t;
|
||||
|
||||
if (!CheckTunnelInWay(tile, z*8))
|
||||
if (!CheckTunnelInWay(tile, z * 8)) {
|
||||
return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -505,8 +497,7 @@ void DrawClearLandFence(const TileInfo *ti)
|
|||
|
||||
if (ti->tileh & 2) {
|
||||
z += 8;
|
||||
if (ti->tileh == 0x17)
|
||||
z += 8;
|
||||
if (ti->tileh == 0x17) z += 8;
|
||||
}
|
||||
|
||||
if (GB(m4, 5, 3) != 0) {
|
||||
|
@ -697,8 +688,7 @@ static void TileLoopClearAlps(TileIndex tile)
|
|||
|
||||
static void TileLoopClearDesert(TileIndex tile)
|
||||
{
|
||||
if ( (_m[tile].m5 & 0x1C) == 0x14)
|
||||
return;
|
||||
if ((_m[tile].m5 & 0x1C) == 0x14) return;
|
||||
|
||||
if (GetMapExtraBits(tile) == 1) {
|
||||
_m[tile].m5 = 0x17;
|
||||
|
@ -727,12 +717,10 @@ static void TileLoop_Clear(TileIndex tile)
|
|||
}
|
||||
|
||||
m5 = _m[tile].m5;
|
||||
if ( (m5 & 0x1C) == 0x10 || (m5 & 0x1C) == 0x14)
|
||||
return;
|
||||
if ((m5 & 0x1C) == 0x10 || (m5 & 0x1C) == 0x14) return;
|
||||
|
||||
if ( (m5 & 0x1C) != 0xC) {
|
||||
if ( (m5 & 3) == 3)
|
||||
return;
|
||||
if ((m5 & 0x1C) != 0xC) {
|
||||
if ((m5 & 3) == 3) return;
|
||||
|
||||
if (_game_mode != GM_EDITOR) {
|
||||
m5 += 0x20;
|
||||
|
|
9
debug.c
9
debug.c
|
@ -76,12 +76,11 @@ void SetDebugString(const char *s)
|
|||
v = strtoul(s, &end, 0);
|
||||
s = end;
|
||||
|
||||
for (i = debug_level; i != endof(debug_level); ++i)
|
||||
*i->level = v;
|
||||
for (i = debug_level; i != endof(debug_level); ++i) *i->level = v;
|
||||
}
|
||||
|
||||
// individual levels
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
const DebugLevel *i;
|
||||
int *p;
|
||||
|
||||
|
@ -103,9 +102,9 @@ void SetDebugString(const char *s)
|
|||
if (*s == '=') s++;
|
||||
v = strtoul(s, &end, 0);
|
||||
s = end;
|
||||
if (p != NULL)
|
||||
if (p != NULL) {
|
||||
*p = v;
|
||||
else {
|
||||
} else {
|
||||
ShowInfoF("Unknown debug level '%.*s'", s - t, t);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -21,8 +21,7 @@
|
|||
|
||||
static void DisasterClearSquare(TileIndex tile)
|
||||
{
|
||||
if (!EnsureNoVehicle(tile))
|
||||
return;
|
||||
if (!EnsureNoVehicle(tile)) return;
|
||||
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_RAILWAY:
|
||||
|
@ -352,7 +351,7 @@ static void DisasterTick_2(Vehicle *v)
|
|||
|
||||
v->tick_counter++;
|
||||
v->u.disaster.image_override =
|
||||
(v->current_order.station == 1 && v->tick_counter&4) ? SPR_F_15_FIRING : 0;
|
||||
(v->current_order.station == 1 && v->tick_counter & 4) ? SPR_F_15_FIRING : 0;
|
||||
|
||||
GetNewVehiclePos(v, &gp);
|
||||
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
|
||||
|
@ -423,7 +422,7 @@ static void DisasterTick_3(Vehicle *v)
|
|||
|
||||
v->tick_counter++;
|
||||
v->u.disaster.image_override =
|
||||
(v->current_order.station == 1 && v->tick_counter&4) ? SPR_AH_64A_FIRING : 0;
|
||||
(v->current_order.station == 1 && v->tick_counter & 4) ? SPR_AH_64A_FIRING : 0;
|
||||
|
||||
GetNewVehiclePos(v, &gp);
|
||||
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
|
||||
|
@ -843,8 +842,7 @@ static void Disaster4_Init(void)
|
|||
Vehicle *v = ForceAllocateSpecialVehicle(), *u;
|
||||
int x,y;
|
||||
|
||||
if (v == NULL)
|
||||
return;
|
||||
if (v == NULL) return;
|
||||
|
||||
x = TileX(Random()) * 16 + 8;
|
||||
|
||||
|
@ -870,8 +868,7 @@ static void Disaster5_Init(void)
|
|||
byte dir;
|
||||
uint32 r;
|
||||
|
||||
if (v == NULL)
|
||||
return;
|
||||
if (v == NULL) return;
|
||||
|
||||
r = Random();
|
||||
x = TileX(r) * 16 + 8;
|
||||
|
@ -891,8 +888,7 @@ static void Disaster6_Init(void)
|
|||
byte dir;
|
||||
uint32 r;
|
||||
|
||||
if (v == NULL)
|
||||
return;
|
||||
if (v == NULL) return;
|
||||
|
||||
r = Random();
|
||||
x = TileX(r) * 16 + 8;
|
||||
|
@ -964,18 +960,17 @@ static const DisasterYears _dis_years[8] = {
|
|||
|
||||
static void DoDisaster(void)
|
||||
{
|
||||
byte buf[8];
|
||||
byte buf[lengthof(_dis_years)];
|
||||
byte year = _cur_year;
|
||||
int i,j;
|
||||
uint i;
|
||||
uint j;
|
||||
|
||||
for(i=j=0; i!=lengthof(_dis_years); i++) {
|
||||
if (year >= _dis_years[i].min &&
|
||||
year < _dis_years[i].max)
|
||||
buf[j++] = i;
|
||||
j = 0;
|
||||
for (i = 0; i != lengthof(_dis_years); i++) {
|
||||
if (year >= _dis_years[i].min && year < _dis_years[i].max) buf[j++] = i;
|
||||
}
|
||||
|
||||
if (j == 0)
|
||||
return;
|
||||
if (j == 0) return;
|
||||
|
||||
_disaster_initprocs[buf[RandomRange(j)]]();
|
||||
}
|
||||
|
@ -988,13 +983,11 @@ static void ResetDisasterDelay(void)
|
|||
|
||||
void DisasterDailyLoop(void)
|
||||
{
|
||||
if (--_disaster_delay != 0)
|
||||
return;
|
||||
if (--_disaster_delay != 0) return;
|
||||
|
||||
ResetDisasterDelay();
|
||||
|
||||
if (_opt.diff.disasters != 0)
|
||||
DoDisaster();
|
||||
if (_opt.diff.disasters != 0) DoDisaster();
|
||||
}
|
||||
|
||||
void StartupDisasters(void)
|
||||
|
|
48
dock_gui.c
48
dock_gui.c
|
@ -222,35 +222,39 @@ void ShowBuildDocksToolbar(void)
|
|||
|
||||
static void BuildDockStationWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
int rad;
|
||||
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
if (WP(w,def_d).close)
|
||||
return;
|
||||
int rad;
|
||||
|
||||
if (WP(w,def_d).close) return;
|
||||
w->click_state = (1<<3) << _station_show_coverage;
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
rad = (_patches.modified_catchment) ? CA_DOCK : 4;
|
||||
|
||||
if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
|
||||
else SetTileSelectBigSize(0, 0, 0, 0);
|
||||
if (_station_show_coverage) {
|
||||
SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
|
||||
} else {
|
||||
SetTileSelectBigSize(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
DrawStringCentered(74, 17, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
|
||||
DrawStationCoverageAreaText(4, 50, (uint)-1, rad);
|
||||
} break;
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
case 3: case 4:
|
||||
_station_show_coverage = e->click.widget - 3;
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
SetWindowDirty(w);
|
||||
break;
|
||||
case WE_CLICK:
|
||||
switch (e->click.widget) {
|
||||
case 3:
|
||||
case 4:
|
||||
_station_show_coverage = e->click.widget - 3;
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
SetWindowDirty(w);
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case WE_MOUSELOOP: {
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close) {
|
||||
DeleteWindow(w);
|
||||
return;
|
||||
|
@ -258,11 +262,9 @@ static void BuildDockStationWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
CheckRedrawStationCoverage(w);
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -324,13 +326,11 @@ static void BuildDocksDepotWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close)
|
||||
DeleteWindow(w);
|
||||
if (WP(w,def_d).close) DeleteWindow(w);
|
||||
break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
24
economy.c
24
economy.c
|
@ -72,7 +72,7 @@ void UpdatePlayerHouse(Player *p, uint score)
|
|||
MarkTileDirtyByTile(tile + TileDiffXY(1, 1));
|
||||
}
|
||||
|
||||
int64 CalculateCompanyValue(const Player *p)
|
||||
int64 CalculateCompanyValue(const Player* p)
|
||||
{
|
||||
PlayerID owner = p->index;
|
||||
int64 value;
|
||||
|
@ -647,8 +647,8 @@ static void AddInflation(void)
|
|||
int i;
|
||||
int32 inf = _economy.infl_amount * 54;
|
||||
|
||||
for(i=0; i!=NUM_PRICES; i++) {
|
||||
AddSingleInflation( (int32*)&_price + i, _price_frac + i, inf );
|
||||
for (i = 0; i != NUM_PRICES; i++) {
|
||||
AddSingleInflation((int32*)&_price + i, _price_frac + i, inf);
|
||||
}
|
||||
|
||||
_economy.max_loan_unround += BIGMULUS(_economy.max_loan_unround, inf, 16);
|
||||
|
@ -657,7 +657,7 @@ static void AddInflation(void)
|
|||
_economy.max_loan += 50000;
|
||||
|
||||
inf = _economy.infl_amount_pr * 54;
|
||||
for(i=0; i!=NUM_CARGO; i++) {
|
||||
for (i = 0; i != NUM_CARGO; i++) {
|
||||
AddSingleInflation(
|
||||
(int32*)_cargo_payment_rates + i,
|
||||
_cargo_payment_rates_frac + i,
|
||||
|
@ -677,8 +677,7 @@ static void PlayersPayInterest(void)
|
|||
int interest = _economy.interest_rate * 54;
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (!p->is_active)
|
||||
continue;
|
||||
if (!p->is_active) continue;
|
||||
|
||||
_current_player = p->index;
|
||||
SET_EXPENSES_TYPE(EXPENSES_LOAN_INT);
|
||||
|
@ -692,8 +691,7 @@ static void PlayersPayInterest(void)
|
|||
|
||||
static void HandleEconomyFluctuations(void)
|
||||
{
|
||||
if (_opt.diff.economy == 0)
|
||||
return;
|
||||
if (_opt.diff.economy == 0) return;
|
||||
|
||||
if (--_economy.fluct == 0) {
|
||||
_economy.fluct = - (int)(Random()&3);
|
||||
|
@ -985,9 +983,8 @@ static bool CheckSubsidyDuplicate(Subsidy *s)
|
|||
{
|
||||
const Subsidy* ss;
|
||||
|
||||
for(ss=_subsidies; ss != endof(_subsidies); ss++) {
|
||||
for (ss = _subsidies; ss != endof(_subsidies); ss++) {
|
||||
if (s != ss &&
|
||||
// ss->age < 12 &&
|
||||
ss->from == s->from &&
|
||||
ss->to == s->to &&
|
||||
ss->cargo_type == s->cargo_type) {
|
||||
|
@ -1333,7 +1330,6 @@ int LoadUnloadVehicle(Vehicle *v)
|
|||
int result = 0;
|
||||
uint16 last_visited;
|
||||
Station *st;
|
||||
GoodsEntry *ge;
|
||||
int t;
|
||||
uint count, cap;
|
||||
PlayerID old_player;
|
||||
|
@ -1349,13 +1345,15 @@ int LoadUnloadVehicle(Vehicle *v)
|
|||
st = GetStation(last_visited = v->last_station_visited);
|
||||
|
||||
for (; v != NULL; v = v->next) {
|
||||
GoodsEntry* ge;
|
||||
|
||||
if (v->cargo_cap == 0) continue;
|
||||
|
||||
ge = &st->goods[v->cargo_type];
|
||||
|
||||
/* unload? */
|
||||
if (v->cargo_count != 0) {
|
||||
if ( v->cargo_source != last_visited && ge->waiting_acceptance & 0x8000 && !(u->current_order.flags & OF_TRANSFER) ) {
|
||||
if (v->cargo_source != last_visited && ge->waiting_acceptance & 0x8000 && !(u->current_order.flags & OF_TRANSFER)) {
|
||||
// deliver goods to the station
|
||||
st->time_since_unload = 0;
|
||||
|
||||
|
@ -1363,7 +1361,7 @@ int LoadUnloadVehicle(Vehicle *v)
|
|||
profit += DeliverGoods(v->cargo_count, v->cargo_type, v->cargo_source, last_visited, v->cargo_days);
|
||||
result |= 1;
|
||||
v->cargo_count = 0;
|
||||
} else if (u->current_order.flags & ( OF_UNLOAD | OF_TRANSFER) ) {
|
||||
} else if (u->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
|
||||
/* unload goods and let it wait at the station */
|
||||
st->time_since_unload = 0;
|
||||
|
||||
|
|
11
engine.c
11
engine.c
|
@ -883,8 +883,7 @@ void EnginesDailyLoop(void)
|
|||
} else {
|
||||
e->flags |= ENGINE_PREVIEWING;
|
||||
e->preview_wait = 20;
|
||||
if (IS_INTERACTIVE_PLAYER(best_player))
|
||||
ShowEnginePreviewWindow(i);
|
||||
if (IS_INTERACTIVE_PLAYER(best_player)) ShowEnginePreviewWindow(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -925,12 +924,11 @@ static void NewVehicleAvailable(Engine *e)
|
|||
|
||||
// In case the player didn't build the vehicle during the intro period,
|
||||
// prevent that player from getting future intro periods for a while.
|
||||
if (e->flags&ENGINE_INTRODUCING) {
|
||||
if (e->flags & ENGINE_INTRODUCING) {
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
uint block_preview = p->block_preview;
|
||||
|
||||
if (!HASBIT(e->player_avail,p->index))
|
||||
continue;
|
||||
if (!HASBIT(e->player_avail, p->index)) continue;
|
||||
|
||||
/* We assume the user did NOT build it.. prove me wrong ;) */
|
||||
p->block_preview = 20;
|
||||
|
@ -956,8 +954,7 @@ static void NewVehicleAvailable(Engine *e)
|
|||
e->player_avail = (byte)-1;
|
||||
|
||||
// Do not introduce new rail wagons
|
||||
if (IsWagon(index))
|
||||
return;
|
||||
if (IsWagon(index)) return;
|
||||
|
||||
// make maglev / monorail available
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
|
|
22
engine_gui.c
22
engine_gui.c
|
@ -65,12 +65,11 @@ static const DrawEngineInfo _draw_engine_list[4] = {
|
|||
|
||||
static void EnginePreviewWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
const DrawEngineInfo *dei;
|
||||
int width;
|
||||
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
EngineID engine = w->window_number;
|
||||
const DrawEngineInfo* dei;
|
||||
int width;
|
||||
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
|
@ -91,12 +90,15 @@ static void EnginePreviewWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
case 3: DeleteWindow(w); break;
|
||||
case 4:
|
||||
DoCommandP(0, w->window_number, 0, NULL, CMD_WANT_ENGINE_PREVIEW);
|
||||
DeleteWindow(w);
|
||||
break;
|
||||
switch (e->click.widget) {
|
||||
case 3:
|
||||
DeleteWindow(w);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
DoCommandP(0, w->window_number, 0, NULL, CMD_WANT_ENGINE_PREVIEW);
|
||||
DeleteWindow(w);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ void InitializeAnimatedTiles(void);
|
|||
|
||||
/* tunnelbridge_cmd.c */
|
||||
bool CheckTunnelInWay(TileIndex tile, int z);
|
||||
bool CheckBridge_Stuff(byte bridge_type, int bridge_len);
|
||||
bool CheckBridge_Stuff(byte bridge_type, uint bridge_len);
|
||||
uint32 GetBridgeLength(TileIndex begin, TileIndex end);
|
||||
int CalcBridgeLenCostFactor(int x);
|
||||
|
||||
|
|
3
gfx.c
3
gfx.c
|
@ -1994,7 +1994,6 @@ uint16 GetDrawStringPlayerColor(PlayerID player)
|
|||
{
|
||||
// Get the color for DrawString-subroutines which matches the color
|
||||
// of the player
|
||||
if (player == OWNER_SPECTATOR || player == OWNER_SPECTATOR - 1)
|
||||
return 1;
|
||||
if (player == OWNER_SPECTATOR || player == OWNER_SPECTATOR - 1) return 1;
|
||||
return (_color_list[_player_colors[player]].window_color_1b) | IS_PALETTE_COLOR;
|
||||
}
|
||||
|
|
|
@ -145,7 +145,7 @@ static bool FileMD5(const MD5File file, bool warn)
|
|||
fclose(f);
|
||||
|
||||
md5_finish(&filemd5state, digest);
|
||||
return CheckMD5Digest(file, digest, warn);
|
||||
return CheckMD5Digest(file, digest, warn);
|
||||
} else { // file not found
|
||||
return false;
|
||||
}
|
||||
|
@ -321,11 +321,9 @@ static byte _sprite_page_to_load = 0xFF;
|
|||
|
||||
static void LoadSpriteTables(void)
|
||||
{
|
||||
uint load_index = 0;
|
||||
const FileList* files = _use_dos_palette ? &files_dos : &files_win;
|
||||
uint load_index;
|
||||
uint i;
|
||||
const FileList *files; // list of grf files to be loaded. Either Windows files or DOS files
|
||||
|
||||
files = _use_dos_palette? &files_dos : &files_win;
|
||||
|
||||
LoadGrfIndexed(files->basic[0].filename, trg1idx, 0);
|
||||
DupSprite( 2, 130); // non-breaking space medium
|
||||
|
|
10
graph_gui.c
10
graph_gui.c
|
@ -224,15 +224,13 @@ static void GraphLegendWndProc(Window *w, WindowEvent *e)
|
|||
switch(e->event) {
|
||||
case WE_PAINT:
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (!p->is_active)
|
||||
SETBIT(_legend_excludebits, p->index);
|
||||
if (!p->is_active) SETBIT(_legend_excludebits, p->index);
|
||||
}
|
||||
w->click_state = ((~_legend_excludebits) << 3);
|
||||
w->click_state = (~_legend_excludebits) << 3;
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (!p->is_active)
|
||||
continue;
|
||||
if (!p->is_active) continue;
|
||||
|
||||
DrawPlayerIcon(p->index, 4, 18+p->index*12);
|
||||
|
||||
|
@ -245,7 +243,7 @@ static void GraphLegendWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
case WE_CLICK:
|
||||
if (IS_INT_INSIDE(e->click.widget, 3, 11)) {
|
||||
_legend_excludebits ^= (1 << (e->click.widget-3));
|
||||
_legend_excludebits ^= (1 << (e->click.widget - 3));
|
||||
SetWindowDirty(w);
|
||||
InvalidateWindow(WC_INCOME_GRAPH, 0);
|
||||
InvalidateWindow(WC_OPERATING_PROFIT, 0);
|
||||
|
|
303
industry_cmd.c
303
industry_cmd.c
|
@ -31,8 +31,7 @@ void IndustryPoolNewBlock(uint start_item)
|
|||
{
|
||||
Industry *i;
|
||||
|
||||
FOR_ALL_INDUSTRIES_FROM(i, start_item)
|
||||
i->index = start_item++;
|
||||
FOR_ALL_INDUSTRIES_FROM(i, start_item) i->index = start_item++;
|
||||
}
|
||||
|
||||
/* Initialize the industry-pool */
|
||||
|
@ -251,7 +250,7 @@ static const StringID _industry_close_strings[] = {
|
|||
STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,
|
||||
STR_4832_ANNOUNCES_IMMINENT_CLOSURE,
|
||||
STR_4832_ANNOUNCES_IMMINENT_CLOSURE,
|
||||
STR_4832_ANNOUNCES_IMMINENT_CLOSURE ,
|
||||
STR_4832_ANNOUNCES_IMMINENT_CLOSURE
|
||||
};
|
||||
|
||||
|
||||
|
@ -260,19 +259,20 @@ static void IndustryDrawTileProc1(const TileInfo *ti)
|
|||
const DrawIndustrySpec1Struct *d;
|
||||
uint32 image;
|
||||
|
||||
if (!(_m[ti->tile].m1 & 0x80))
|
||||
return;
|
||||
if (!(_m[ti->tile].m1 & 0x80)) return;
|
||||
|
||||
d = &_draw_industry_spec1[_m[ti->tile].m3];
|
||||
|
||||
AddChildSpriteScreen(0x12A7 + d->image_1, d->x, 0);
|
||||
|
||||
if ( (image = d->image_2) != 0)
|
||||
AddChildSpriteScreen(0x12B0 + image - 1, 8, 41);
|
||||
image = d->image_2;
|
||||
if (image != 0) AddChildSpriteScreen(0x12B0 + image - 1, 8, 41);
|
||||
|
||||
if ( (image = d->image_3) != 0)
|
||||
image = d->image_3;
|
||||
if (image != 0) {
|
||||
AddChildSpriteScreen(0x12AC + image - 1,
|
||||
_drawtile_proc1_x[image-1], _drawtile_proc1_y[image-1]);
|
||||
_drawtile_proc1_x[image - 1], _drawtile_proc1_y[image - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
static void IndustryDrawTileProc2(const TileInfo *ti)
|
||||
|
@ -285,17 +285,17 @@ static void IndustryDrawTileProc2(const TileInfo *ti)
|
|||
x = 0;
|
||||
}
|
||||
|
||||
AddChildSpriteScreen(0x129F, 22-x, x+24);
|
||||
AddChildSpriteScreen(0x129F, 22 - x, 24 + x);
|
||||
AddChildSpriteScreen(0x129E, 6, 0xE);
|
||||
}
|
||||
|
||||
static void IndustryDrawTileProc3(const TileInfo *ti)
|
||||
{
|
||||
if (_m[ti->tile].m1 & 0x80) {
|
||||
AddChildSpriteScreen(0x128B, 5,
|
||||
_industry_anim_offs_2[_m[ti->tile].m3]);
|
||||
AddChildSpriteScreen(0x128B, 5, _industry_anim_offs_2[_m[ti->tile].m3]);
|
||||
} else {
|
||||
AddChildSpriteScreen(4746, 3, 67);
|
||||
}
|
||||
AddChildSpriteScreen(4746, 3, 67);
|
||||
}
|
||||
|
||||
static void IndustryDrawTileProc4(const TileInfo *ti)
|
||||
|
@ -309,7 +309,7 @@ static void IndustryDrawTileProc4(const TileInfo *ti)
|
|||
}
|
||||
|
||||
if (d->image_2 != 0xFF) {
|
||||
AddChildSpriteScreen(0x1270, 0x10 - d->image_2*2, 100 + d->image_2);
|
||||
AddChildSpriteScreen(0x1270, 0x10 - d->image_2 * 2, 100 + d->image_2);
|
||||
}
|
||||
|
||||
AddChildSpriteScreen(0x126E, 7, d->image_3);
|
||||
|
@ -323,8 +323,8 @@ static void DrawCoalPlantSparkles(const TileInfo *ti)
|
|||
image = GB(image, 2, 5);
|
||||
if (image != 0 && image < 7) {
|
||||
AddChildSpriteScreen(image + 0x806,
|
||||
_coal_plant_sparkles_x[image-1],
|
||||
_coal_plant_sparkles_y[image-1]
|
||||
_coal_plant_sparkles_x[image - 1],
|
||||
_coal_plant_sparkles_y[image - 1]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -348,7 +348,7 @@ static void DrawTile_Industry(TileInfo *ti)
|
|||
|
||||
/* Pointer to industry */
|
||||
ind = GetIndustry(_m[ti->tile].m2);
|
||||
ormod = (ind->color_map+0x307) << PALETTE_SPRITE_START;
|
||||
ormod = (ind->color_map + 0x307) << PALETTE_SPRITE_START;
|
||||
|
||||
/* Retrieve pointer to the draw industry tile struct */
|
||||
dits = &_industry_draw_tile_data[(ti->map5 << 2) | GB(_m[ti->tile].m1, 0, 2)];
|
||||
|
@ -369,13 +369,12 @@ static void DrawTile_Industry(TileInfo *ti)
|
|||
}
|
||||
|
||||
/* Add industry on top of the ground? */
|
||||
if ((image = dits->sprite_2) != 0) {
|
||||
|
||||
image = dits->sprite_2;
|
||||
if (image != 0) {
|
||||
if (image & PALETTE_MODIFIER_COLOR && (image & PALETTE_SPRITE_MASK) == 0)
|
||||
image |= ormod;
|
||||
|
||||
if (_display_opt & DO_TRANS_BUILDINGS)
|
||||
MAKE_TRANSPARENT(image);
|
||||
if (_display_opt & DO_TRANS_BUILDINGS) MAKE_TRANSPARENT(image);
|
||||
|
||||
AddSortableSpriteToDraw(image,
|
||||
ti->x | (dits->subtile_xy>>4),
|
||||
|
@ -385,15 +384,12 @@ static void DrawTile_Industry(TileInfo *ti)
|
|||
dits->dz,
|
||||
z);
|
||||
|
||||
if (_display_opt & DO_TRANS_BUILDINGS)
|
||||
return;
|
||||
if (_display_opt & DO_TRANS_BUILDINGS) return;
|
||||
}
|
||||
|
||||
/* TTDBUG: strange code here, return if AddSortableSpriteToDraw failed? */
|
||||
{
|
||||
int proc;
|
||||
if ((proc=dits->proc-1) >= 0 )
|
||||
_industry_draw_tile_procs[proc](ti);
|
||||
{
|
||||
int proc = dits->proc - 1;
|
||||
if (proc >= 0) _industry_draw_tile_procs[proc](ti);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -451,9 +447,7 @@ static int32 ClearTile_Industry(TileIndex tile, byte flags)
|
|||
return_cmd_error(STR_4800_IN_THE_WAY);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
DeleteIndustry(i);
|
||||
}
|
||||
if (flags & DC_EXEC) DeleteIndustry(i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -468,20 +462,17 @@ static const byte _industry_min_cargo[] = {
|
|||
|
||||
static void TransportIndustryGoods(TileIndex tile)
|
||||
{
|
||||
Industry *i;
|
||||
int type;
|
||||
Industry* i = GetIndustry(_m[tile].m2);
|
||||
uint cw, am;
|
||||
byte m5;
|
||||
|
||||
i = GetIndustry(_m[tile].m2);
|
||||
|
||||
type = i->type;
|
||||
cw = min(i->cargo_waiting[0], 255);
|
||||
if (cw > _industry_min_cargo[type]/* && i->produced_cargo[0] != 0xFF*/) {
|
||||
if (cw > _industry_min_cargo[i->type]/* && i->produced_cargo[0] != 0xFF*/) {
|
||||
byte m5;
|
||||
|
||||
i->cargo_waiting[0] -= cw;
|
||||
|
||||
/* fluctuating economy? */
|
||||
if (_economy.fluct <= 0) cw = (cw + 1) >> 1;
|
||||
if (_economy.fluct <= 0) cw = (cw + 1) / 2;
|
||||
|
||||
i->last_mo_production[0] += cw;
|
||||
|
||||
|
@ -494,12 +485,11 @@ static void TransportIndustryGoods(TileIndex tile)
|
|||
}
|
||||
}
|
||||
|
||||
type = i->type;
|
||||
cw = min(i->cargo_waiting[1], 255);
|
||||
if (cw > _industry_min_cargo[type]) {
|
||||
if (cw > _industry_min_cargo[i->type]) {
|
||||
i->cargo_waiting[1] -= cw;
|
||||
|
||||
if (_economy.fluct <= 0) cw = (cw + 1) >> 1;
|
||||
if (_economy.fluct <= 0) cw = (cw + 1) / 2;
|
||||
|
||||
i->last_mo_production[1] += cw;
|
||||
|
||||
|
@ -717,7 +707,6 @@ static void MakeIndustryTileBigger(TileIndex tile, byte size)
|
|||
}
|
||||
|
||||
|
||||
|
||||
static void TileLoopIndustryCase161(TileIndex tile)
|
||||
{
|
||||
int dir;
|
||||
|
@ -739,8 +728,7 @@ static void TileLoopIndustryCase161(TileIndex tile)
|
|||
EV_BUBBLE
|
||||
);
|
||||
|
||||
if (v != NULL)
|
||||
v->u.special.unk2 = dir;
|
||||
if (v != NULL) v->u.special.unk2 = dir;
|
||||
}
|
||||
|
||||
static void TileLoop_Industry(TileIndex tile)
|
||||
|
@ -752,8 +740,7 @@ static void TileLoop_Industry(TileIndex tile)
|
|||
return;
|
||||
}
|
||||
|
||||
if (_game_mode == GM_EDITOR)
|
||||
return;
|
||||
if (_game_mode == GM_EDITOR) return;
|
||||
|
||||
TransportIndustryGoods(tile);
|
||||
|
||||
|
@ -768,7 +755,7 @@ static void TileLoop_Industry(TileIndex tile)
|
|||
#define SET_AND_ANIMATE(tile, a, b) { _m[tile].m5 = a; _m[tile].m1 = b; AddAnimatedTile(tile); }
|
||||
#define SET_AND_UNANIMATE(tile, a, b) { _m[tile].m5 = a; _m[tile].m1 = b; DeleteAnimatedTile(tile); }
|
||||
|
||||
switch(_m[tile].m5) {
|
||||
switch (_m[tile].m5) {
|
||||
case 0x18: // coast line at oilrigs
|
||||
case 0x19:
|
||||
case 0x1A:
|
||||
|
@ -819,9 +806,9 @@ static void TileLoop_Industry(TileIndex tile)
|
|||
}
|
||||
break;
|
||||
|
||||
case 49: {
|
||||
case 49:
|
||||
CreateEffectVehicleAbove(TileX(tile) * 16 + 6, TileY(tile) * 16 + 6, 43, EV_SMOKE);
|
||||
} break;
|
||||
break;
|
||||
|
||||
|
||||
case 143: {
|
||||
|
@ -843,9 +830,7 @@ static void TileLoop_Industry(TileIndex tile)
|
|||
break;
|
||||
|
||||
case 174:
|
||||
if (CHANCE16(1,3)) {
|
||||
AddAnimatedTile(tile);
|
||||
}
|
||||
if (CHANCE16(1, 3)) AddAnimatedTile(tile);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1030,15 +1015,17 @@ static void ChopLumberMillTrees(Industry *i)
|
|||
};
|
||||
|
||||
TileIndex tile = i->xy;
|
||||
int dir, a, j;
|
||||
int a;
|
||||
|
||||
if ((_m[tile].m1 & 0x80) == 0)
|
||||
return;
|
||||
if ((_m[tile].m1 & 0x80) == 0) return;
|
||||
|
||||
/* search outwards as a rectangular spiral */
|
||||
for(a=1; a!=41; a+=2) {
|
||||
for(dir=0; dir!=4; dir++) {
|
||||
j = a;
|
||||
for (a = 1; a != 41; a += 2) {
|
||||
uint dir;
|
||||
|
||||
for (dir = 0; dir != 4; dir++) {
|
||||
int j = a;
|
||||
|
||||
do {
|
||||
tile = TILE_MASK(tile);
|
||||
if (IsTileType(tile, MP_TREES)) {
|
||||
|
@ -1127,10 +1114,11 @@ static void ProduceIndustryGoods(Industry *i)
|
|||
i->cargo_waiting[0] = min(0xffff, i->cargo_waiting[0] + i->production_rate[0]);
|
||||
i->cargo_waiting[1] = min(0xffff, i->cargo_waiting[1] + i->production_rate[1]);
|
||||
|
||||
if (i->type == IT_FARM)
|
||||
if (i->type == IT_FARM) {
|
||||
MaybePlantFarmField(i);
|
||||
else if (i->type == IT_LUMBER_MILL && (i->counter & 0x1FF) == 0)
|
||||
} else if (i->type == IT_LUMBER_MILL && (i->counter & 0x1FF) == 0) {
|
||||
ChopLumberMillTrees(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1149,12 +1137,10 @@ void OnTick_Industry(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (_game_mode == GM_EDITOR)
|
||||
return;
|
||||
if (_game_mode == GM_EDITOR) return;
|
||||
|
||||
FOR_ALL_INDUSTRIES(i) {
|
||||
if (i->xy != 0)
|
||||
ProduceIndustryGoods(i);
|
||||
if (i->xy != 0) ProduceIndustryGoods(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1180,14 +1166,9 @@ extern bool _ignore_restrictions;
|
|||
/* Oil Rig and Oil Refinery */
|
||||
static bool CheckNewIndustry_Oil(TileIndex tile, int type)
|
||||
{
|
||||
if(_ignore_restrictions && _game_mode == GM_EDITOR)
|
||||
return true;
|
||||
|
||||
if (type != IT_OIL_RIG && _game_mode == GM_EDITOR)
|
||||
return true;
|
||||
|
||||
if (DistanceFromEdge(TILE_ADDXY(tile, 1, 1)) < 16)
|
||||
return true;
|
||||
if (_game_mode == GM_EDITOR && _ignore_restrictions) return true;
|
||||
if (_game_mode == GM_EDITOR && type != IT_OIL_RIG) return true;
|
||||
if (DistanceFromEdge(TILE_ADDXY(tile, 1, 1)) < 16) return true;
|
||||
|
||||
_error_message = STR_483B_CAN_ONLY_BE_POSITIONED;
|
||||
return false;
|
||||
|
@ -1255,7 +1236,7 @@ static bool CheckSuitableIndustryPos(TileIndex tile)
|
|||
uint x = TileX(tile);
|
||||
uint y = TileY(tile);
|
||||
|
||||
if ( x < 2 || y < 2 || x > MapMaxX() - 3 || y > MapMaxY() - 3) {
|
||||
if (x < 2 || y < 2 || x > MapMaxX() - 3 || y > MapMaxY() - 3) {
|
||||
_error_message = STR_0239_SITE_UNSUITABLE;
|
||||
return false;
|
||||
}
|
||||
|
@ -1270,8 +1251,7 @@ static const Town* CheckMultipleIndustryInTown(TileIndex tile, int type)
|
|||
|
||||
t = ClosestTownFromTile(tile, (uint)-1);
|
||||
|
||||
if (_patches.multiple_industry_per_town)
|
||||
return t;
|
||||
if (_patches.multiple_industry_per_town) return t;
|
||||
|
||||
FOR_ALL_INDUSTRIES(i) {
|
||||
if (i->xy != 0 &&
|
||||
|
@ -1320,26 +1300,21 @@ static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable*
|
|||
TileIndex cur_tile = tile + ToTileIndexDiff(it->ti);
|
||||
|
||||
if (!IsValidTile(cur_tile)) {
|
||||
if (it->map5 == 0xff)
|
||||
continue;
|
||||
if (it->map5 == 0xff) continue;
|
||||
return false;
|
||||
}
|
||||
|
||||
FindLandscapeHeightByTile(&ti, cur_tile);
|
||||
|
||||
if (it->map5 == 0xFF) {
|
||||
if (ti.type != MP_WATER || ti.tileh != 0)
|
||||
return false;
|
||||
if (ti.type != MP_WATER || ti.tileh != 0) return false;
|
||||
} else {
|
||||
if (!EnsureNoVehicle(cur_tile))
|
||||
return false;
|
||||
if (!EnsureNoVehicle(cur_tile)) return false;
|
||||
|
||||
if (type == IT_OIL_RIG) {
|
||||
if (ti.type != MP_WATER || ti.map5 != 0)
|
||||
return false;
|
||||
if (ti.type != MP_WATER || ti.map5 != 0) return false;
|
||||
} else {
|
||||
if (ti.type == MP_WATER && ti.map5 == 0)
|
||||
return false;
|
||||
if (ti.type == MP_WATER && ti.map5 == 0) return false;
|
||||
if (IsSteepTileh(ti.tileh))
|
||||
return false;
|
||||
|
||||
|
@ -1347,22 +1322,14 @@ static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable*
|
|||
int t;
|
||||
byte bits = _industry_map5_bits[it->map5];
|
||||
|
||||
if (bits & 0x10)
|
||||
return false;
|
||||
if (bits & 0x10) return false;
|
||||
|
||||
t = ~ti.tileh;
|
||||
|
||||
if (bits & 1 && (t & (1+8)))
|
||||
return false;
|
||||
|
||||
if (bits & 2 && (t & (4+8)))
|
||||
return false;
|
||||
|
||||
if (bits & 4 && (t & (1+2)))
|
||||
return false;
|
||||
|
||||
if (bits & 8 && (t & (2+4)))
|
||||
return false;
|
||||
if (bits & 1 && (t & (1 + 8))) return false;
|
||||
if (bits & 2 && (t & (4 + 8))) return false;
|
||||
if (bits & 4 && (t & (1 + 2))) return false;
|
||||
if (bits & 8 && (t & (2 + 4))) return false;
|
||||
}
|
||||
|
||||
if (type == IT_BANK) {
|
||||
|
@ -1376,8 +1343,7 @@ static bool CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileTable*
|
|||
return false;
|
||||
}
|
||||
} else if (type == IT_TOY_SHOP) {
|
||||
if (DistanceMax(t->xy, cur_tile) > 9)
|
||||
return false;
|
||||
if (DistanceMax(t->xy, cur_tile) > 9) return false;
|
||||
if (ti.type != MP_HOUSE) goto do_clear;
|
||||
} else if (type == IT_WATER_TOWER) {
|
||||
if (ti.type != MP_HOUSE) {
|
||||
|
@ -1398,9 +1364,8 @@ do_clear:
|
|||
|
||||
static bool CheckIfTooCloseToIndustry(TileIndex tile, int type)
|
||||
{
|
||||
const IndustrySpec* spec = &_industry_spec[type];
|
||||
const Industry* i;
|
||||
const IndustrySpec *spec;
|
||||
spec = &_industry_spec[type];
|
||||
|
||||
// accepting industries won't be close, not even with patch
|
||||
if (_patches.same_industry_close && spec->accepts_cargo[0] == CT_INVALID)
|
||||
|
@ -1409,15 +1374,16 @@ static bool CheckIfTooCloseToIndustry(TileIndex tile, int type)
|
|||
FOR_ALL_INDUSTRIES(i) {
|
||||
// check if an industry that accepts the same goods is nearby
|
||||
if (i->xy != 0 &&
|
||||
(DistanceMax(tile, i->xy) <= 14) &&
|
||||
DistanceMax(tile, i->xy) <= 14 &&
|
||||
spec->accepts_cargo[0] != CT_INVALID &&
|
||||
spec->accepts_cargo[0] == i->accepts_cargo[0] &&
|
||||
!(_game_mode == GM_EDITOR &&
|
||||
_patches.same_industry_close &&
|
||||
_patches.multiple_industry_per_town)) {
|
||||
_error_message = STR_INDUSTRY_TOO_CLOSE;
|
||||
return false;
|
||||
}
|
||||
spec->accepts_cargo[0] == i->accepts_cargo[0] && (
|
||||
_game_mode != GM_EDITOR ||
|
||||
!_patches.same_industry_close ||
|
||||
!_patches.multiple_industry_per_town
|
||||
)) {
|
||||
_error_message = STR_INDUSTRY_TOO_CLOSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// check "not close to" field.
|
||||
if (i->xy != 0 &&
|
||||
|
@ -1438,10 +1404,9 @@ static Industry *AllocateIndustry(void)
|
|||
if (i->xy == 0) {
|
||||
uint index = i->index;
|
||||
|
||||
if (i->index > _total_industries)
|
||||
_total_industries = i->index;
|
||||
if (i->index > _total_industries) _total_industries = i->index;
|
||||
|
||||
memset(i, 0, sizeof(Industry));
|
||||
memset(i, 0, sizeof(*i));
|
||||
i->index = index;
|
||||
|
||||
return i;
|
||||
|
@ -1498,8 +1463,7 @@ static void DoCreateNewIndustry(Industry* i, TileIndex tile, int type, const Ind
|
|||
i->total_production[0] = i->production_rate[0] * 8;
|
||||
i->total_production[1] = i->production_rate[1] * 8;
|
||||
|
||||
if (_generating_world == 0)
|
||||
i->total_production[0] = i->total_production[1] = 0;
|
||||
if (!_generating_world) i->total_production[0] = i->total_production[1] = 0;
|
||||
|
||||
i->prod_level = 0x10;
|
||||
|
||||
|
@ -1528,13 +1492,12 @@ static void DoCreateNewIndustry(Industry* i, TileIndex tile, int type, const Ind
|
|||
|
||||
if (i->type == IT_FARM || i->type == IT_FARM_2) {
|
||||
tile = i->xy + TileDiffXY(i->width / 2, i->height / 2);
|
||||
for(j=0; j!=50; j++) {
|
||||
for (j = 0; j != 50; j++) {
|
||||
int x = Random() % 31 - 16;
|
||||
int y = Random() % 31 - 16;
|
||||
TileIndex new_tile = TileAddWrap(tile, x, y);
|
||||
TileIndex new_tile = TileAddWrap(tile, x, y);
|
||||
|
||||
if (new_tile != INVALID_TILE)
|
||||
PlantFarmField(new_tile);
|
||||
if (new_tile != INVALID_TILE) PlantFarmField(new_tile);
|
||||
}
|
||||
}
|
||||
_industry_sort_dirty = true;
|
||||
|
@ -1562,10 +1525,15 @@ int32 CmdBuildIndustry(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
/* Check if the to-be built/founded industry is available for this climate.
|
||||
* Unfortunately we have no easy way of checking, except for looping the table */
|
||||
{ const byte *i;
|
||||
{
|
||||
const byte* i;
|
||||
bool found = false;
|
||||
|
||||
for (i = &_build_industry_types[_opt_ptr->landscape][0]; i != endof(_build_industry_types[_opt_ptr->landscape]); i++) {
|
||||
if (*i == p1) {found = true; break;}
|
||||
if (*i == p1) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) return CMD_ERROR;
|
||||
}
|
||||
|
@ -1584,7 +1552,8 @@ int32 CmdBuildIndustry(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (!_check_new_industry_procs[spec->check_proc](tile, p1)) return CMD_ERROR;
|
||||
|
||||
if ((t = CheckMultipleIndustryInTown(tile, p1)) == NULL) return CMD_ERROR;
|
||||
t = CheckMultipleIndustryInTown(tile, p1);
|
||||
if (t == NULL) return CMD_ERROR;
|
||||
|
||||
num = spec->num_table;
|
||||
itt = spec->table;
|
||||
|
@ -1596,10 +1565,10 @@ int32 CmdBuildIndustry(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (!CheckIfTooCloseToIndustry(tile, p1)) return CMD_ERROR;
|
||||
|
||||
if ( (i = AllocateIndustry()) == NULL) return CMD_ERROR;
|
||||
i = AllocateIndustry();
|
||||
if (i == NULL) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC)
|
||||
DoCreateNewIndustry(i, tile, p1, it, t, OWNER_NONE);
|
||||
if (flags & DC_EXEC) DoCreateNewIndustry(i, tile, p1, it, t, OWNER_NONE);
|
||||
|
||||
return (_price.build_industry >> 5) * _industry_type_costs[p1];
|
||||
}
|
||||
|
@ -1613,28 +1582,23 @@ Industry *CreateNewIndustry(TileIndex tile, int type)
|
|||
|
||||
const IndustrySpec *spec;
|
||||
|
||||
if (!CheckSuitableIndustryPos(tile))
|
||||
return NULL;
|
||||
if (!CheckSuitableIndustryPos(tile)) return NULL;
|
||||
|
||||
spec = &_industry_spec[type];
|
||||
|
||||
if (!_check_new_industry_procs[spec->check_proc](tile, type))
|
||||
return NULL;
|
||||
if (!_check_new_industry_procs[spec->check_proc](tile, type)) return NULL;
|
||||
|
||||
if (!(t=CheckMultipleIndustryInTown(tile, type)))
|
||||
return NULL;
|
||||
t = CheckMultipleIndustryInTown(tile, type);
|
||||
if (t == NULL) return NULL;
|
||||
|
||||
/* pick a random layout */
|
||||
it = spec->table[RandomRange(spec->num_table)];;
|
||||
it = spec->table[RandomRange(spec->num_table)];
|
||||
|
||||
if (!CheckIfIndustryTilesAreFree(tile, it, type, t))
|
||||
return NULL;
|
||||
if (!CheckIfIndustryTilesAreFree(tile, it, type, t)) return NULL;
|
||||
if (!CheckIfTooCloseToIndustry(tile, type)) return NULL;
|
||||
|
||||
if (!CheckIfTooCloseToIndustry(tile, type))
|
||||
return NULL;
|
||||
|
||||
if ( (i = AllocateIndustry()) == NULL)
|
||||
return NULL;
|
||||
i = AllocateIndustry();
|
||||
if (i == NULL) return NULL;
|
||||
|
||||
DoCreateNewIndustry(i, tile, type, it, t, OWNER_NONE);
|
||||
|
||||
|
@ -1659,18 +1623,17 @@ static void PlaceInitialIndustry(byte type, int amount)
|
|||
num = ScaleByMapSize(num);
|
||||
}
|
||||
|
||||
if (_opt.diff.number_industries != 0)
|
||||
{
|
||||
if (_opt.diff.number_industries != 0) {
|
||||
PlayerID old_player = _current_player;
|
||||
_current_player = OWNER_NONE;
|
||||
assert(num > 0);
|
||||
|
||||
do {
|
||||
int i = 2000;
|
||||
do {
|
||||
if (CreateNewIndustry(RandomTile(), type) != NULL)
|
||||
break;
|
||||
} while (--i != 0);
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < 2000; i++) {
|
||||
if (CreateNewIndustry(RandomTile(), type) != NULL) break;
|
||||
}
|
||||
} while (--num);
|
||||
|
||||
_current_player = old_player;
|
||||
|
@ -1713,7 +1676,6 @@ static void ExtChangeIndustryProduction(Industry *i)
|
|||
if (CHANCE16I(20 + (i->pct_transported[j] * 20 >> 8), 1024, r >> 16))
|
||||
new += ((RandomRange(50) + 10) * old) >> 8;
|
||||
|
||||
// make sure it doesn't exceed 255 or goes below 0
|
||||
new = clamp(new, 0, 255);
|
||||
if (new == old) {
|
||||
closeit = false;
|
||||
|
@ -1731,9 +1693,11 @@ static void ExtChangeIndustryProduction(Industry *i)
|
|||
SetDParam(2, mag);
|
||||
SetDParam(0, _cargoc.names_s[i->produced_cargo[j]]);
|
||||
SetDParam(1, i->index);
|
||||
AddNewsItem(percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
|
||||
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
|
||||
i->xy + TileDiffXY(1, 1), 0);
|
||||
AddNewsItem(
|
||||
percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
|
||||
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
|
||||
i->xy + TileDiffXY(1, 1), 0
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -1742,9 +1706,11 @@ static void ExtChangeIndustryProduction(Industry *i)
|
|||
if (closeit) {
|
||||
i->prod_level = 0;
|
||||
SetDParam(0, i->index);
|
||||
AddNewsItem(_industry_close_strings[i->type],
|
||||
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
|
||||
i->xy + TileDiffXY(1, 1), 0);
|
||||
AddNewsItem(
|
||||
_industry_close_strings[i->type],
|
||||
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
|
||||
i->xy + TileDiffXY(1, 1), 0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1787,10 +1753,11 @@ static void UpdateIndustryStatistics(Industry *i)
|
|||
if (i->produced_cargo[0] != CT_INVALID || i->produced_cargo[1] != CT_INVALID)
|
||||
InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
|
||||
|
||||
if (i->prod_level == 0)
|
||||
if (i->prod_level == 0) {
|
||||
DeleteIndustry(i);
|
||||
else if (_patches.smooth_economy)
|
||||
} else if (_patches.smooth_economy) {
|
||||
ExtChangeIndustryProduction(i);
|
||||
}
|
||||
}
|
||||
|
||||
static const byte _new_industry_rand[4][32] = {
|
||||
|
@ -1807,19 +1774,15 @@ static void MaybeNewIndustry(uint32 r)
|
|||
Industry *i;
|
||||
|
||||
type = _new_industry_rand[_opt.landscape][GB(r, 16, 5)];
|
||||
if (type == IT_OIL_WELL && _date > 10958)
|
||||
return;
|
||||
|
||||
if (type == IT_OIL_RIG && _date < 14610)
|
||||
return;
|
||||
if (type == IT_OIL_WELL && _date > 10958) return;
|
||||
if (type == IT_OIL_RIG && _date < 14610) return;
|
||||
|
||||
j = 2000;
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
i = CreateNewIndustry(RandomTile(), type);
|
||||
if (i != NULL)
|
||||
break;
|
||||
if (--j == 0)
|
||||
return;
|
||||
if (i != NULL) break;
|
||||
if (--j == 0) return;
|
||||
}
|
||||
|
||||
SetDParam(0, type + STR_4802_COAL_MINE);
|
||||
|
@ -1905,8 +1868,7 @@ void IndustryMonthlyLoop(void)
|
|||
_current_player = OWNER_NONE;
|
||||
|
||||
FOR_ALL_INDUSTRIES(i) {
|
||||
if (i->xy != 0)
|
||||
UpdateIndustryStatistics(i);
|
||||
if (i->xy != 0) UpdateIndustryStatistics(i);
|
||||
}
|
||||
|
||||
/* 3% chance that we start a new industry */
|
||||
|
@ -1914,8 +1876,7 @@ void IndustryMonthlyLoop(void)
|
|||
MaybeNewIndustry(Random());
|
||||
} else if (!_patches.smooth_economy && _total_industries > 0) {
|
||||
i = GetIndustry(RandomRange(_total_industries));
|
||||
if (i->xy != 0)
|
||||
ChangeIndustryProduction(i);
|
||||
if (i->xy != 0) ChangeIndustryProduction(i);
|
||||
}
|
||||
|
||||
_current_player = old_player;
|
||||
|
@ -1928,7 +1889,6 @@ void IndustryMonthlyLoop(void)
|
|||
|
||||
void InitializeIndustries(void)
|
||||
{
|
||||
|
||||
CleanPool(&_industry_pool);
|
||||
AddBlockToPool(&_industry_pool);
|
||||
|
||||
|
@ -2012,8 +1972,7 @@ static void Load_INDY(void)
|
|||
i = GetIndustry(index);
|
||||
SlObject(i, _industry_desc);
|
||||
|
||||
if (index > _total_industries)
|
||||
_total_industries = index;
|
||||
if (index > _total_industries) _total_industries = index;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
50
intro_gui.c
50
intro_gui.c
|
@ -154,8 +154,9 @@ static const Widget _ask_abandon_game_widgets[] = {
|
|||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static void AskAbandonGameWndProc(Window *w, WindowEvent *e) {
|
||||
switch(e->event) {
|
||||
static void AskAbandonGameWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
#if defined(_WIN32)
|
||||
|
@ -173,7 +174,7 @@ static void AskAbandonGameWndProc(Window *w, WindowEvent *e) {
|
|||
#else
|
||||
SetDParam(0, STR_0134_UNIX);
|
||||
#endif
|
||||
DrawStringMultiCenter(0x5A, 0x26, STR_00CA_ARE_YOU_SURE_YOU_WANT_TO, 178);
|
||||
DrawStringMultiCenter(90, 38, STR_00CA_ARE_YOU_SURE_YOU_WANT_TO, 178);
|
||||
return;
|
||||
|
||||
case WE_CLICK:
|
||||
|
@ -217,32 +218,29 @@ static const Widget _ask_quit_game_widgets[] = {
|
|||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static void AskQuitGameWndProc(Window *w, WindowEvent *e) {
|
||||
switch(e->event) {
|
||||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
DrawStringMultiCenter(0x5A, 0x26,
|
||||
_game_mode != GM_EDITOR ? STR_0160_ARE_YOU_SURE_YOU_WANT_TO :
|
||||
STR_029B_ARE_YOU_SURE_YOU_WANT_TO,
|
||||
178);
|
||||
return;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
case 3:
|
||||
DeleteWindow(w);
|
||||
static void AskQuitGameWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
DrawStringMultiCenter(
|
||||
90, 38,
|
||||
_game_mode != GM_EDITOR ?
|
||||
STR_0160_ARE_YOU_SURE_YOU_WANT_TO : STR_029B_ARE_YOU_SURE_YOU_WANT_TO,
|
||||
178
|
||||
);
|
||||
break;
|
||||
case 4:
|
||||
_switch_mode = SM_MENU;
|
||||
|
||||
case WE_CLICK:
|
||||
switch (e->click.widget) {
|
||||
case 3: DeleteWindow(w); break;
|
||||
case 4: _switch_mode = SM_MENU; break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS: /* Return to main menu on pressing 'Enter' */
|
||||
if (e->keypress.keycode == WKC_RETURN)
|
||||
_switch_mode = SM_MENU;
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS: /* Return to main menu on pressing 'Enter' */
|
||||
if (e->keypress.keycode == WKC_RETURN) _switch_mode = SM_MENU;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
10
landscape.c
10
landscape.c
|
@ -208,16 +208,16 @@ void DrawFoundation(TileInfo *ti, uint f)
|
|||
uint32 sprite_base = SPR_SLOPES_BASE-14;
|
||||
|
||||
TileInfo ti2;
|
||||
FindLandscapeHeight(&ti2, ti->x, ti->y-1);
|
||||
if(hasFoundation( &ti2, true )) sprite_base += 22; // foundation in NW direction
|
||||
FindLandscapeHeight(&ti2, ti->x-1, ti->y);
|
||||
if(hasFoundation( &ti2, false )) sprite_base += 22*2; // foundation in NE direction
|
||||
FindLandscapeHeight(&ti2, ti->x, ti->y - 1);
|
||||
if (hasFoundation(&ti2, true)) sprite_base += 22; // foundation in NW direction
|
||||
FindLandscapeHeight(&ti2, ti->x - 1, ti->y);
|
||||
if (hasFoundation(&ti2, false)) sprite_base += 22 * 2; // foundation in NE direction
|
||||
|
||||
if (f < 15) {
|
||||
// leveled foundation
|
||||
if (sprite_base < SPR_SLOPES_BASE) sprite_base = SPR_FOUNDATION_BASE + 1; // use original slope sprites
|
||||
|
||||
AddSortableSpriteToDraw(f-1 + sprite_base, ti->x, ti->y, 16, 16, 7, ti->z);
|
||||
AddSortableSpriteToDraw(f - 1 + sprite_base, ti->x, ti->y, 16, 16, 7, ti->z);
|
||||
ti->z += 8;
|
||||
ti->tileh = 0;
|
||||
OffsetGroundSprite(31, 1);
|
||||
|
|
277
main_gui.c
277
main_gui.c
|
@ -47,7 +47,7 @@ extern bool GenerateTowns(void);
|
|||
|
||||
void HandleOnEditTextCancel(void)
|
||||
{
|
||||
switch(_rename_what) {
|
||||
switch (_rename_what) {
|
||||
#ifdef ENABLE_NETWORK
|
||||
case 4:
|
||||
NetworkDisconnect();
|
||||
|
@ -119,13 +119,11 @@ void HandleOnEditText(WindowEvent *e)
|
|||
|
||||
* @return true if the button is clicked, false if it's unclicked
|
||||
*/
|
||||
|
||||
bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, int mode, PlaceProc *placeproc)
|
||||
{
|
||||
uint32 mask = 1 << widget;
|
||||
|
||||
if (w->disabled_state & mask)
|
||||
return false;
|
||||
if (w->disabled_state & mask) return false;
|
||||
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
SetWindowDirty(w);
|
||||
|
@ -148,14 +146,11 @@ void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
}
|
||||
|
||||
|
||||
typedef void ToolbarButtonProc(Window *w);
|
||||
|
||||
static void ToolbarPauseClick(Window *w)
|
||||
{
|
||||
if (_networking && !_network_server) return; // only server can pause the game
|
||||
|
||||
if (DoCommandP(0, _pause ? 0 : 1, 0, NULL, CMD_PAUSE))
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
if (DoCommandP(0, _pause ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
|
||||
}
|
||||
|
||||
static void ToolbarFastForwardClick(Window *w)
|
||||
|
@ -164,8 +159,6 @@ static void ToolbarFastForwardClick(Window *w)
|
|||
SndPlayFx(SND_15_BEEP);
|
||||
}
|
||||
|
||||
typedef void MenuClickedProc(int index);
|
||||
|
||||
|
||||
static void MenuClickSettings(int index)
|
||||
{
|
||||
|
@ -389,9 +382,9 @@ void ShowRenameWaypointWindow(const Waypoint *wp)
|
|||
|
||||
static void SelectSignTool(void)
|
||||
{
|
||||
if (_cursor.sprite == SPR_CURSOR_SIGN)
|
||||
if (_cursor.sprite == SPR_CURSOR_SIGN) {
|
||||
ResetObjectToPlace();
|
||||
else {
|
||||
} else {
|
||||
SetObjectToPlace(SPR_CURSOR_SIGN, 1, 1, 0);
|
||||
_place_proc = PlaceProc_Sign;
|
||||
}
|
||||
|
@ -431,6 +424,9 @@ static void MenuClickHelp(int index)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
typedef void MenuClickedProc(int index);
|
||||
|
||||
static MenuClickedProc * const _menu_clicked_procs[] = {
|
||||
NULL, /* 0 */
|
||||
NULL, /* 1 */
|
||||
|
@ -463,7 +459,7 @@ static MenuClickedProc * const _menu_clicked_procs[] = {
|
|||
|
||||
static void MenuWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int count,sel;
|
||||
int x,y;
|
||||
|
@ -519,16 +515,15 @@ static void MenuWndProc(Window *w, WindowEvent *e)
|
|||
action_id = WP(w,menu_d).action_id;
|
||||
DeleteWindow(w);
|
||||
|
||||
if (index >= 0)
|
||||
_menu_clicked_procs[action_id](index);
|
||||
if (index >= 0) _menu_clicked_procs[action_id](index);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_POPUPMENU_OVER: {
|
||||
int index = GetMenuItemIndex(w, e->popupmenu.pt.x, e->popupmenu.pt.y);
|
||||
|
||||
if (index == -1 || index == WP(w,menu_d).sel_index)
|
||||
return;
|
||||
if (index == -1 || index == WP(w,menu_d).sel_index) return;
|
||||
|
||||
WP(w,menu_d).sel_index = index;
|
||||
SetWindowDirty(w);
|
||||
|
@ -555,10 +550,7 @@ static int GetPlayerIndexFromMenu(int index)
|
|||
const Player* p;
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active) {
|
||||
if (--index < 0)
|
||||
return p->index;
|
||||
}
|
||||
if (p->is_active && --index < 0) return p->index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
|
@ -566,19 +558,15 @@ static int GetPlayerIndexFromMenu(int index)
|
|||
|
||||
static void UpdatePlayerMenuHeight(Window *w)
|
||||
{
|
||||
int num = 0;
|
||||
uint num = 0;
|
||||
const Player* p;
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active)
|
||||
num++;
|
||||
if (p->is_active) num++;
|
||||
}
|
||||
|
||||
// Increase one to fit in PlayerList in the menu when
|
||||
// in network
|
||||
if (_networking && WP(w,menu_d).main_button == 9) {
|
||||
num++;
|
||||
}
|
||||
// Increase one to fit in PlayerList in the menu when in network
|
||||
if (_networking && WP(w,menu_d).main_button == 9) num++;
|
||||
|
||||
if (WP(w,menu_d).item_count != num) {
|
||||
WP(w,menu_d).item_count = num;
|
||||
|
@ -594,7 +582,7 @@ extern void DrawPlayerIcon(int p, int x, int y);
|
|||
|
||||
static void PlayerMenuWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int x,y;
|
||||
byte sel, color;
|
||||
|
@ -657,10 +645,10 @@ static void PlayerMenuWndProc(Window *w, WindowEvent *e)
|
|||
// We have a new entry at the top of the list of menu 9 when networking
|
||||
// so keep that in count
|
||||
if (_networking && WP(w,menu_d).main_button == 9) {
|
||||
if (index > 0)
|
||||
index = GetPlayerIndexFromMenu(index - 1) + 1;
|
||||
} else
|
||||
if (index > 0) index = GetPlayerIndexFromMenu(index - 1) + 1;
|
||||
} else {
|
||||
index = GetPlayerIndexFromMenu(index);
|
||||
}
|
||||
|
||||
if (index < 0) {
|
||||
Window *w2 = FindWindowById(WC_MAIN_TOOLBAR,0);
|
||||
|
@ -684,13 +672,12 @@ static void PlayerMenuWndProc(Window *w, WindowEvent *e)
|
|||
// We have a new entry at the top of the list of menu 9 when networking
|
||||
// so keep that in count
|
||||
if (_networking && WP(w,menu_d).main_button == 9) {
|
||||
if (index > 0)
|
||||
index = GetPlayerIndexFromMenu(index - 1) + 1;
|
||||
} else
|
||||
if (index > 0) index = GetPlayerIndexFromMenu(index - 1) + 1;
|
||||
} else {
|
||||
index = GetPlayerIndexFromMenu(index);
|
||||
}
|
||||
|
||||
if (index == -1 || index == WP(w,menu_d).sel_index)
|
||||
return;
|
||||
if (index == -1 || index == WP(w,menu_d).sel_index) return;
|
||||
|
||||
WP(w,menu_d).sel_index = index;
|
||||
SetWindowDirty(w);
|
||||
|
@ -740,11 +727,12 @@ static Window *PopupMainPlayerToolbMenu(Window *w, int x, int main_button, int g
|
|||
WP(w,menu_d).item_count = 0;
|
||||
WP(w,menu_d).sel_index = (_local_player != OWNER_SPECTATOR) ? _local_player : GetPlayerIndexFromMenu(0);
|
||||
if (_networking && main_button == 9) {
|
||||
if (_local_player != OWNER_SPECTATOR)
|
||||
if (_local_player != OWNER_SPECTATOR) {
|
||||
WP(w,menu_d).sel_index++;
|
||||
else
|
||||
} else {
|
||||
/* Select client list by default for spectators */
|
||||
WP(w,menu_d).sel_index = 0;
|
||||
}
|
||||
}
|
||||
WP(w,menu_d).action_id = main_button;
|
||||
WP(w,menu_d).main_button = main_button;
|
||||
|
@ -809,8 +797,10 @@ static void ToolbarTrainClick(Window *w)
|
|||
{
|
||||
const Vehicle* v;
|
||||
int dis = -1;
|
||||
FOR_ALL_VEHICLES(v)
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Train && v->subtype == TS_Front_Engine) CLRBIT(dis, v->owner);
|
||||
}
|
||||
PopupMainPlayerToolbMenu(w, 310, 13, dis);
|
||||
}
|
||||
|
||||
|
@ -818,8 +808,10 @@ static void ToolbarRoadClick(Window *w)
|
|||
{
|
||||
const Vehicle* v;
|
||||
int dis = -1;
|
||||
FOR_ALL_VEHICLES(v)
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Road) CLRBIT(dis, v->owner);
|
||||
}
|
||||
PopupMainPlayerToolbMenu(w, 332, 14, dis);
|
||||
}
|
||||
|
||||
|
@ -827,8 +819,10 @@ static void ToolbarShipClick(Window *w)
|
|||
{
|
||||
const Vehicle* v;
|
||||
int dis = -1;
|
||||
FOR_ALL_VEHICLES(v)
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Ship) CLRBIT(dis, v->owner);
|
||||
}
|
||||
PopupMainPlayerToolbMenu(w, 354, 15, dis);
|
||||
}
|
||||
|
||||
|
@ -836,8 +830,10 @@ static void ToolbarAirClick(Window *w)
|
|||
{
|
||||
const Vehicle* v;
|
||||
int dis = -1;
|
||||
FOR_ALL_VEHICLES(v)
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Aircraft) CLRBIT(dis, v->owner);
|
||||
}
|
||||
PopupMainPlayerToolbMenu(w, 376, 16, dis);
|
||||
}
|
||||
|
||||
|
@ -882,15 +878,17 @@ bool DoZoomInOutWindow(int how, Window *w)
|
|||
|
||||
// routine to disable/enable the zoom buttons. Didn't know where to place these otherwise
|
||||
{
|
||||
Window *wt = NULL;
|
||||
Window* wt = NULL;
|
||||
|
||||
switch (w->window_class) {
|
||||
case WC_MAIN_WINDOW:
|
||||
wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
|
||||
break;
|
||||
case WC_EXTRA_VIEW_PORT:
|
||||
wt = FindWindowById(WC_EXTRA_VIEW_PORT, w->window_number);
|
||||
button = 5;
|
||||
break;
|
||||
case WC_MAIN_WINDOW:
|
||||
wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
|
||||
break;
|
||||
|
||||
case WC_EXTRA_VIEW_PORT:
|
||||
wt = FindWindowById(WC_EXTRA_VIEW_PORT, w->window_number);
|
||||
button = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
assert(wt);
|
||||
|
@ -1003,8 +1001,7 @@ static void ToolbarScenDateBackward(Window *w)
|
|||
HandleButtonClick(w, 6);
|
||||
InvalidateWidget(w, 5);
|
||||
|
||||
if (_date > MinDate)
|
||||
SetDate(ConvertYMDToDay(_cur_year - 1, 0, 1));
|
||||
if (_date > MinDate) SetDate(ConvertYMDToDay(_cur_year - 1, 0, 1));
|
||||
}
|
||||
_left_button_clicked = false;
|
||||
}
|
||||
|
@ -1016,8 +1013,7 @@ static void ToolbarScenDateForward(Window *w)
|
|||
HandleButtonClick(w, 7);
|
||||
InvalidateWidget(w, 5);
|
||||
|
||||
if (_date < MaxDate)
|
||||
SetDate(ConvertYMDToDay(_cur_year + 1, 0, 1));
|
||||
if (_date < MaxDate) SetDate(ConvertYMDToDay(_cur_year + 1, 0, 1));
|
||||
}
|
||||
_left_button_clicked = false;
|
||||
}
|
||||
|
@ -1070,7 +1066,7 @@ static void ResetLandscape(void)
|
|||
_random_seeds[0][0] = InteractiveRandom();
|
||||
_random_seeds[0][1] = InteractiveRandom();
|
||||
|
||||
GenerateWorld(1, 1<<_patches.map_x, 1<<_patches.map_y);
|
||||
GenerateWorld(1, 1 << _patches.map_x, 1 << _patches.map_y);
|
||||
MarkWholeScreenDirty();
|
||||
}
|
||||
|
||||
|
@ -1088,13 +1084,17 @@ static void AskResetLandscapeWndProc(Window *w, WindowEvent *e)
|
|||
{
|
||||
uint mode = w->window_number;
|
||||
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
DrawStringMultiCenter(90, 38, mode?STR_022D_ARE_YOU_SURE_YOU_WANT_TO:STR_GENERATE_RANDOM_LANDSCAPE , 168);
|
||||
DrawStringMultiCenter(
|
||||
90, 38,
|
||||
mode ? STR_022D_ARE_YOU_SURE_YOU_WANT_TO : STR_GENERATE_RANDOM_LANDSCAPE,
|
||||
168
|
||||
);
|
||||
break;
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 3:
|
||||
DeleteWindow(w);
|
||||
break;
|
||||
|
@ -1110,7 +1110,6 @@ static void AskResetLandscapeWndProc(Window *w, WindowEvent *e)
|
|||
SndPlayFx(SND_15_BEEP);
|
||||
_switch_mode = SM_GENRANDLAND;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1358,7 +1357,7 @@ static void ScenEditLandGenWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_KEYPRESS: {
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i != lengthof(_editor_terraform_keycodes); i++) {
|
||||
if (e->keypress.keycode == _editor_terraform_keycodes[i]) {
|
||||
|
@ -1471,7 +1470,7 @@ static const Widget _scen_edit_town_gen_widgets[] = {
|
|||
|
||||
static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
w->click_state = (w->click_state & ~(1<<7 | 1<<8 | 1<<9) ) | (1 << (_new_town_size + 7));
|
||||
DrawWindowWidgets(w);
|
||||
|
@ -1493,8 +1492,9 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
if (t == NULL) {
|
||||
ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
|
||||
} else
|
||||
} else {
|
||||
ScrollMainWindowToTile(t->xy);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -1503,8 +1503,9 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
_generating_world = true;
|
||||
_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
|
||||
if (!GenerateTowns())
|
||||
ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
|
||||
if (!GenerateTowns()) {
|
||||
ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
|
||||
}
|
||||
_generating_world = false;
|
||||
|
||||
_game_mode = GM_EDITOR;
|
||||
|
@ -1642,8 +1643,7 @@ static bool AnyTownExists(void)
|
|||
const Town* t;
|
||||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy)
|
||||
return true;
|
||||
if (t->xy != 0) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1695,13 +1695,13 @@ static void ScenEditIndustryWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
if ((button=e->click.widget) == 3) {
|
||||
if (e->click.widget == 3) {
|
||||
HandleButtonClick(w, 3);
|
||||
|
||||
if (!AnyTownExists()) {
|
||||
ShowErrorMessage(STR_0286_MUST_BUILD_TOWN_FIRST, STR_CAN_T_GENERATE_INDUSTRIES, 0, 0);
|
||||
return;
|
||||
}
|
||||
if (!AnyTownExists()) {
|
||||
ShowErrorMessage(STR_0286_MUST_BUILD_TOWN_FIRST, STR_CAN_T_GENERATE_INDUSTRIES, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
_generating_world = true;
|
||||
GenerateIndustries();
|
||||
|
@ -1729,7 +1729,7 @@ static void ScenEditIndustryWndProc(Window *w, WindowEvent *e)
|
|||
_ignore_restrictions = true;
|
||||
if (!TryBuildIndustry(e->place.tile,type)) {
|
||||
SetDParam(0, type + STR_4802_COAL_MINE);
|
||||
ShowErrorMessage(_error_message, STR_0285_CAN_T_BUILD_HERE,e->place.pt.x, e->place.pt.y);
|
||||
ShowErrorMessage(_error_message, STR_0285_CAN_T_BUILD_HERE, e->place.pt.x, e->place.pt.y);
|
||||
}
|
||||
_ignore_restrictions = false;
|
||||
_generating_world = false;
|
||||
|
@ -1817,6 +1817,9 @@ static void ToolbarBtn_NULL(Window *w)
|
|||
{
|
||||
}
|
||||
|
||||
|
||||
typedef void ToolbarButtonProc(Window *w);
|
||||
|
||||
static ToolbarButtonProc* const _toolbar_button_procs[] = {
|
||||
ToolbarPauseClick,
|
||||
ToolbarFastForwardClick,
|
||||
|
@ -1875,7 +1878,7 @@ static void MainToolbarWndProc(Window *w, WindowEvent *e)
|
|||
case WE_KEYPRESS: {
|
||||
PlayerID local = (_local_player != OWNER_SPECTATOR) ? _local_player : 0;
|
||||
|
||||
switch(e->keypress.keycode) {
|
||||
switch (e->keypress.keycode) {
|
||||
case WKC_F1: case WKC_PAUSE:
|
||||
ToolbarPauseClick(w);
|
||||
break;
|
||||
|
@ -1924,7 +1927,6 @@ static void MainToolbarWndProc(Window *w, WindowEvent *e)
|
|||
case WE_ON_EDIT_TEXT: HandleOnEditText(e); break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
|
||||
if (((w->click_state) & 1) != (uint)!!_pause) {
|
||||
w->click_state ^= (1 << 0);
|
||||
SetWindowDirty(w);
|
||||
|
@ -2068,14 +2070,16 @@ static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
|
|||
switch(e->event) {
|
||||
case WE_PAINT:
|
||||
/* XXX look for better place for these */
|
||||
if (_date <= MinDate)
|
||||
if (_date <= MinDate) {
|
||||
SETBIT(w->disabled_state, 6);
|
||||
else
|
||||
} else {
|
||||
CLRBIT(w->disabled_state, 6);
|
||||
if (_date >= MaxDate)
|
||||
}
|
||||
if (_date >= MaxDate) {
|
||||
SETBIT(w->disabled_state, 7);
|
||||
else
|
||||
} else {
|
||||
CLRBIT(w->disabled_state, 7);
|
||||
}
|
||||
|
||||
// Draw brown-red toolbar bg.
|
||||
GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
|
||||
|
@ -2093,8 +2097,7 @@ static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_CLICK: {
|
||||
if (_game_mode == GM_MENU)
|
||||
return;
|
||||
if (_game_mode == GM_MENU) return;
|
||||
_scen_toolbar_button_procs[e->click.widget](w);
|
||||
} break;
|
||||
|
||||
|
@ -2111,8 +2114,8 @@ static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
|
|||
case WKC_F9: ToolbarScenPlaceSign(w); break;
|
||||
case WKC_F10: ShowMusicWindow(); break;
|
||||
case WKC_F11: PlaceLandBlockInfo(); break;
|
||||
case WKC_CTRL | 'S': _make_screenshot = 1; break;
|
||||
case WKC_CTRL | 'G': _make_screenshot = 2; break;
|
||||
case WKC_CTRL | 'S': _make_screenshot = 1; break;
|
||||
case WKC_CTRL | 'G': _make_screenshot = 2; break;
|
||||
case 'L': ShowEditorTerraformToolBar(); break;
|
||||
} break;
|
||||
} break;
|
||||
|
@ -2176,20 +2179,19 @@ static bool DrawScrollingStatusText(const NewsItem *ni, int pos)
|
|||
s = buf;
|
||||
d = buffer;
|
||||
|
||||
for(;;s++) {
|
||||
if (*s == 0) {
|
||||
*d = 0;
|
||||
for (;; s++) {
|
||||
if (*s == '\0') {
|
||||
*d = '\0';
|
||||
break;
|
||||
} else if (*s == 0x0D) {
|
||||
d[0] = d[1] = d[2] = d[3] = ' ';
|
||||
d+=4;
|
||||
d += 4;
|
||||
} else if ((byte)*s >= ' ' && ((byte)*s < 0x88 || (byte)*s >= 0x99)) {
|
||||
*d++ = *s;
|
||||
}
|
||||
}
|
||||
|
||||
if (!FillDrawPixelInfo(&tmp_dpi, NULL, 141, 1, 358, 11))
|
||||
return true;
|
||||
if (!FillDrawPixelInfo(&tmp_dpi, NULL, 141, 1, 358, 11)) return true;
|
||||
|
||||
old_dpi = _cur_dpi;
|
||||
_cur_dpi = &tmp_dpi;
|
||||
|
@ -2208,7 +2210,9 @@ static void StatusBarWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
DrawWindowWidgets(w);
|
||||
SetDParam(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
|
||||
);
|
||||
|
||||
if (p != NULL) {
|
||||
// Draw player money
|
||||
|
@ -2228,7 +2232,7 @@ static void StatusBarWndProc(Window *w, WindowEvent *e)
|
|||
if (!DrawScrollingStatusText(&_statusbar_news_item, WP(w,def_d).data_1))
|
||||
WP(w,def_d).data_1 = -1280;
|
||||
} else {
|
||||
if (p) {
|
||||
if (p != NULL) {
|
||||
// This is the default text
|
||||
SetDParam(0, p->name_1);
|
||||
SetDParam(1, p->name_2);
|
||||
|
@ -2334,65 +2338,64 @@ static void MainWindowWndProc(Window *w, WindowEvent *e) {
|
|||
break;
|
||||
}
|
||||
|
||||
// check to see if Command-Q has been pressed on a Mac
|
||||
// must be done before checking if we are at the main menu
|
||||
if ( (e->keypress.keycode == ('Q' | WKC_CTRL)) || (e->keypress.keycode == ('Q' | WKC_META)) )
|
||||
{
|
||||
AskExitGame();
|
||||
switch (e->keypress.keycode) {
|
||||
case 'Q' | WKC_CTRL:
|
||||
case 'Q' | WKC_META:
|
||||
AskExitGame();
|
||||
break;
|
||||
}
|
||||
|
||||
if (_game_mode == GM_MENU) break;
|
||||
|
||||
switch (e->keypress.keycode) {
|
||||
case 'C': case 'Z': {
|
||||
Point pt = GetTileBelowCursor();
|
||||
if (pt.x != -1) {
|
||||
ScrollMainWindowTo(pt.x, pt.y);
|
||||
if (e->keypress.keycode == 'Z')
|
||||
MaxZoomIn();
|
||||
case 'C':
|
||||
case 'Z': {
|
||||
Point pt = GetTileBelowCursor();
|
||||
if (pt.x != -1) {
|
||||
ScrollMainWindowTo(pt.x, pt.y);
|
||||
if (e->keypress.keycode == 'Z') MaxZoomIn();
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WKC_ESC: ResetObjectToPlace(); break;
|
||||
case WKC_DELETE: DeleteNonVitalWindows(); break;
|
||||
case WKC_DELETE | WKC_SHIFT: DeleteAllNonVitalWindows(); break;
|
||||
case 'R' | WKC_CTRL: MarkWholeScreenDirty(); break;
|
||||
case WKC_ESC: ResetObjectToPlace(); break;
|
||||
case WKC_DELETE: DeleteNonVitalWindows(); break;
|
||||
case WKC_DELETE | WKC_SHIFT: DeleteAllNonVitalWindows(); break;
|
||||
case 'R' | WKC_CTRL: MarkWholeScreenDirty(); break;
|
||||
|
||||
#if defined(_DEBUG)
|
||||
case '0' | WKC_ALT: /* Crash the game */
|
||||
*(byte*)0 = 0;
|
||||
break;
|
||||
case '1' | WKC_ALT: /* Gimme money */
|
||||
/* Server can not cheat in advertise mode either! */
|
||||
#ifdef ENABLE_NETWORK
|
||||
if (!_networking || !_network_server || !_network_advertise)
|
||||
#endif
|
||||
DoCommandP(0, -10000000, 0, NULL, CMD_MONEY_CHEAT);
|
||||
break;
|
||||
case '2' | WKC_ALT: /* Update the coordinates of all station signs */
|
||||
UpdateAllStationVirtCoord();
|
||||
break;
|
||||
case '3' | WKC_ALT:
|
||||
case '4' | WKC_ALT:
|
||||
break;
|
||||
case '0' | WKC_ALT: /* Crash the game */
|
||||
*(byte*)0 = 0;
|
||||
break;
|
||||
|
||||
case '1' | WKC_ALT: /* Gimme money */
|
||||
/* Server can not cheat in advertise mode either! */
|
||||
#ifdef ENABLE_NETWORK
|
||||
if (!_networking || !_network_server || !_network_advertise)
|
||||
#endif
|
||||
DoCommandP(0, -10000000, 0, NULL, CMD_MONEY_CHEAT);
|
||||
break;
|
||||
|
||||
case '2' | WKC_ALT: /* Update the coordinates of all station signs */
|
||||
UpdateAllStationVirtCoord();
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 'X':
|
||||
_display_opt ^= DO_TRANS_BUILDINGS;
|
||||
MarkWholeScreenDirty();
|
||||
break;
|
||||
case 'X':
|
||||
_display_opt ^= DO_TRANS_BUILDINGS;
|
||||
MarkWholeScreenDirty();
|
||||
break;
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
case WKC_RETURN: case 'T' | WKC_SHIFT:
|
||||
if (_networking) ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0);
|
||||
break;
|
||||
case WKC_RETURN: case 'T' | WKC_SHIFT:
|
||||
if (_networking) ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default: return;
|
||||
default: return;
|
||||
}
|
||||
e->keypress.cont = false;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2402,11 +2405,11 @@ extern void ShowJoinStatusWindowAfterJoin(void);
|
|||
|
||||
void SetupColorsAndInitialWindow(void)
|
||||
{
|
||||
int i;
|
||||
uint i;
|
||||
Window *w;
|
||||
int width,height;
|
||||
|
||||
for(i=0; i!=16; i++) {
|
||||
for (i = 0; i != 16; i++) {
|
||||
const byte* b = GetNonSprite(0x307 + i);
|
||||
|
||||
assert(b);
|
||||
|
@ -2417,7 +2420,7 @@ void SetupColorsAndInitialWindow(void)
|
|||
height = _screen.height;
|
||||
|
||||
// XXX: these are not done
|
||||
switch(_game_mode) {
|
||||
switch (_game_mode) {
|
||||
case GM_MENU:
|
||||
w = AllocateWindow(0, 0, width, height, MainWindowWndProc, WC_MAIN_WINDOW, NULL);
|
||||
AssignWindowViewport(w, 0, 0, width, height, TileXY(32, 32), 0);
|
||||
|
|
167
misc_gui.c
167
misc_gui.c
|
@ -86,7 +86,10 @@ static void LandInfoWndProc(Window *w, WindowEvent *e)
|
|||
for (i = 0; i < NUM_CARGO; ++i) {
|
||||
if (lid->ac[i] > 0) {
|
||||
// Add a comma between each item.
|
||||
if (found) { *p++ = ','; *p++ = ' '; }
|
||||
if (found) {
|
||||
*p++ = ',';
|
||||
*p++ = ' ';
|
||||
}
|
||||
found = true;
|
||||
|
||||
// If the accepted value is less than 8, show it in 1/8:ths
|
||||
|
@ -101,8 +104,7 @@ static void LandInfoWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
}
|
||||
|
||||
if (found)
|
||||
DrawStringMultiCenter(140, 76, BindCString(buf), 276);
|
||||
if (found) DrawStringMultiCenter(140, 76, BindCString(buf), 276);
|
||||
}
|
||||
|
||||
if (lid->td.build_date != 0) {
|
||||
|
@ -221,7 +223,7 @@ static const char *credits[] = {
|
|||
|
||||
static void AboutWindowProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_CREATE: /* Set up window counter and start position of scroller */
|
||||
WP(w, scroller_d).counter = 0;
|
||||
WP(w, scroller_d).height = w->height - 40;
|
||||
|
@ -292,7 +294,7 @@ static const uint32 _tree_sprites[] = {
|
|||
|
||||
static void BuildTreesWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int x,y;
|
||||
int i, count;
|
||||
|
@ -308,24 +310,24 @@ static void BuildTreesWndProc(Window *w, WindowEvent *e)
|
|||
DrawSprite(_tree_sprites[i], x, y);
|
||||
x += 35;
|
||||
if (!(++i & 3)) {
|
||||
x -= 35*4;
|
||||
x -= 35 * 4;
|
||||
y += 47;
|
||||
}
|
||||
} while (--count);
|
||||
} break;
|
||||
|
||||
case WE_CLICK: {
|
||||
int wid;
|
||||
int wid = e->click.widget;
|
||||
|
||||
switch(wid=e->click.widget) {
|
||||
switch (wid) {
|
||||
case 0:
|
||||
ResetObjectToPlace();
|
||||
return;
|
||||
break;
|
||||
|
||||
case 3: case 4: case 5: case 6:
|
||||
case 7: case 8: case 9: case 10:
|
||||
case 11:case 12: case 13: case 14:
|
||||
if ( (uint)(wid-3) >= (uint)WP(w,tree_d).count)
|
||||
return;
|
||||
if (wid - 3 >= WP(w,tree_d).count) break;
|
||||
|
||||
if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, 1, NULL))
|
||||
_tree_to_plant = WP(w,tree_d).base + wid - 3;
|
||||
|
@ -462,7 +464,7 @@ static const Widget _errmsg_face_widgets[] = {
|
|||
|
||||
static void ErrmsgWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
COPY_IN_DPARAM(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
|
||||
DrawWindowWidgets(w);
|
||||
|
@ -498,18 +500,17 @@ static void ErrmsgWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (_right_button_down)
|
||||
DeleteWindow(w);
|
||||
if (_right_button_down) DeleteWindow(w);
|
||||
break;
|
||||
|
||||
case WE_4:
|
||||
if (!--_errmsg_duration)
|
||||
DeleteWindow(w);
|
||||
if (--_errmsg_duration == 0) DeleteWindow(w);
|
||||
break;
|
||||
case WE_DESTROY: {
|
||||
|
||||
case WE_DESTROY:
|
||||
SetRedErrorSquare(0);
|
||||
_switch_mode_errorstr = INVALID_STRING_ID;
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_KEYPRESS:
|
||||
if (e->keypress.keycode == WKC_SPACE) {
|
||||
|
@ -619,18 +620,16 @@ static const Widget _tooltips_widgets[] = {
|
|||
|
||||
static void TooltipsWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
GfxFillRect(0, 0, w->width - 1, w->height - 1, 0);
|
||||
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);
|
||||
break;
|
||||
|
||||
switch(e->event) {
|
||||
case WE_PAINT: {
|
||||
GfxFillRect(0, 0, w->width - 1, w->height - 1, 0);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
case WE_MOUSELOOP:
|
||||
if (!_right_button_down)
|
||||
DeleteWindow(w);
|
||||
break;
|
||||
case WE_MOUSELOOP:
|
||||
if (!_right_button_down) DeleteWindow(w);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -641,8 +640,7 @@ void GuiShowTooltips(StringID string_id)
|
|||
int right,bottom;
|
||||
int x,y;
|
||||
|
||||
if (string_id == 0)
|
||||
return;
|
||||
if (string_id == 0) return;
|
||||
|
||||
w = FindWindowById(WC_TOOLTIPS, 0);
|
||||
if (w != NULL) {
|
||||
|
@ -941,8 +939,7 @@ bool HandleCaret(Textbuf *tb)
|
|||
|
||||
void HandleEditBox(Window *w, int wid)
|
||||
{
|
||||
if (HandleCaret(&WP(w, querystr_d).text))
|
||||
InvalidateWidget(w, wid);
|
||||
if (HandleCaret(&WP(w, querystr_d).text)) InvalidateWidget(w, wid);
|
||||
}
|
||||
|
||||
void DrawEditBox(Window *w, int wid)
|
||||
|
@ -1012,7 +1009,7 @@ press_ok:;
|
|||
} break;
|
||||
|
||||
case WE_KEYPRESS: {
|
||||
switch(HandleEditBoxKey(w, 5, e)) {
|
||||
switch (HandleEditBoxKey(w, 5, e)) {
|
||||
case 1: // Return
|
||||
goto press_ok;
|
||||
case 2: // Escape
|
||||
|
@ -1240,12 +1237,16 @@ static void SaveLoadDlgWndProc(Window *w, WindowEvent *e)
|
|||
case WE_CREATE: { /* Set up OPENTTD button */
|
||||
o_dir.type = FIOS_TYPE_DIRECT;
|
||||
switch (_saveload_mode) {
|
||||
case SLD_SAVE_GAME: case SLD_LOAD_GAME:
|
||||
case SLD_SAVE_GAME:
|
||||
case SLD_LOAD_GAME:
|
||||
ttd_strlcpy(&o_dir.name[0], _path.save_dir, sizeof(o_dir.name));
|
||||
break;
|
||||
case SLD_SAVE_SCENARIO: case SLD_LOAD_SCENARIO:
|
||||
|
||||
case SLD_SAVE_SCENARIO:
|
||||
case SLD_LOAD_SCENARIO:
|
||||
ttd_strlcpy(&o_dir.name[0], _path.scenario_dir, sizeof(o_dir.name));
|
||||
break;
|
||||
|
||||
default:
|
||||
ttd_strlcpy(&o_dir.name[0], _path.personal_dir, sizeof(o_dir.name));
|
||||
}
|
||||
|
@ -1308,12 +1309,12 @@ static void SaveLoadDlgWndProc(Window *w, WindowEvent *e)
|
|||
char *name;
|
||||
const FiosItem *file;
|
||||
|
||||
if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count)
|
||||
return;
|
||||
if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return;
|
||||
|
||||
file = _fios_list + y;
|
||||
|
||||
if ((name = FiosBrowseTo(file)) != NULL) {
|
||||
name = FiosBrowseTo(file);
|
||||
if (name != NULL) {
|
||||
if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
|
||||
_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
|
||||
|
||||
|
@ -1474,8 +1475,9 @@ void ShowSaveLoadDialog(int mode)
|
|||
|
||||
// pause is only used in single-player, non-editor mode, non-menu mode. It
|
||||
// will be unpaused in the WE_DESTROY event handler.
|
||||
if(_game_mode != GM_MENU && !_networking && _game_mode != GM_EDITOR)
|
||||
if (_game_mode != GM_MENU && !_networking && _game_mode != GM_EDITOR) {
|
||||
DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
|
||||
}
|
||||
|
||||
BuildFileList();
|
||||
|
||||
|
@ -1500,9 +1502,11 @@ static const Widget _select_scenario_widgets[] = {
|
|||
{ WIDGETS_END},
|
||||
};
|
||||
|
||||
static void SelectScenarioWndProc(Window *w, WindowEvent *e) {
|
||||
static void SelectScenarioWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
const int list_start = 45;
|
||||
switch(e->event) {
|
||||
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
{
|
||||
int y,pos;
|
||||
|
@ -1642,8 +1646,8 @@ static int32 ClickMoneyCheat(int32 p1, int32 p2)
|
|||
// p1 player to set to, p2 is -1 or +1 (down/up)
|
||||
static int32 ClickChangePlayerCheat(int32 p1, int32 p2)
|
||||
{
|
||||
while(p1 >= 0 && p1 < MAX_PLAYERS) {
|
||||
if (_players[p1].is_active) {
|
||||
while (p1 >= 0 && p1 < MAX_PLAYERS) {
|
||||
if (_players[p1].is_active) {
|
||||
_local_player = p1;
|
||||
MarkWholeScreenDirty();
|
||||
return _local_player;
|
||||
|
@ -1657,8 +1661,8 @@ static int32 ClickChangePlayerCheat(int32 p1, int32 p2)
|
|||
// p1 -1 or +1 (down/up)
|
||||
static int32 ClickChangeClimateCheat(int32 p1, int32 p2)
|
||||
{
|
||||
if(p1==-1) p1 = 3;
|
||||
if(p1==4) p1 = 0;
|
||||
if (p1 == -1) p1 = 3;
|
||||
if (p1 == 4) p1 = 0;
|
||||
_opt.landscape = p1;
|
||||
GfxLoadSprites();
|
||||
MarkWholeScreenDirty();
|
||||
|
@ -1673,7 +1677,7 @@ static int32 ClickChangeDateCheat(int32 p1, int32 p2)
|
|||
YearMonthDay ymd;
|
||||
ConvertDayToYMD(&ymd, _date);
|
||||
|
||||
if((ymd.year==0 && p2==-1) || (ymd.year==170 && p2==1)) return _cur_year;
|
||||
if ((ymd.year == 0 && p2 == -1) || (ymd.year == 170 && p2 == 1)) return _cur_year;
|
||||
|
||||
SetDate(ConvertYMDToDay(_cur_year + p2, ymd.month, ymd.day));
|
||||
EnginesMonthlyLoop();
|
||||
|
@ -1761,11 +1765,9 @@ extern void DrawPlayerIcon(int p, int x, int y);
|
|||
|
||||
static void CheatsWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int clk = WP(w,def_d).data_1;
|
||||
const CheatEntry *ce = &_cheats_ui[0];
|
||||
int32 val;
|
||||
int x, y;
|
||||
int i;
|
||||
|
||||
|
@ -1773,53 +1775,55 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, 350);
|
||||
|
||||
x=0;
|
||||
y=45;
|
||||
x = 0;
|
||||
y = 45;
|
||||
|
||||
for (i = 0; i != lengthof(_cheats_ui); i++) {
|
||||
const CheatEntry* ce = &_cheats_ui[i];
|
||||
|
||||
for(i=0; i!=lengthof(_cheats_ui); i++,ce++) {
|
||||
DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, x + 5, y + 2);
|
||||
|
||||
if (ce->type == CE_BOOL) {
|
||||
DrawFrameRect(x+20, y+1, x+30+9, y+9, (*(bool*)ce->variable) ? 6 : 4, (*(bool*)ce->variable) ? FR_LOWERED : 0);
|
||||
DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, (*(bool*)ce->variable) ? 6 : 4, (*(bool*)ce->variable) ? FR_LOWERED : 0);
|
||||
SetDParam(0, *(bool*)ce->variable ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
|
||||
|
||||
} else if (ce->type == CE_CLICK) {
|
||||
DrawFrameRect(x+20, y+1, x+30+9, y+9, 0, (WP(w,def_d).data_1 == i*2+1) ? FR_LOWERED : 0);
|
||||
if (i == 0)
|
||||
SetDParam64(0, (int64) 10000000);
|
||||
else
|
||||
DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (WP(w,def_d).data_1 == i * 2 + 1) ? FR_LOWERED : 0);
|
||||
if (i == 0) {
|
||||
SetDParam64(0, 10000000);
|
||||
} else {
|
||||
SetDParam(0, false);
|
||||
|
||||
}
|
||||
} else {
|
||||
DrawFrameRect(x+20, y+1, x+20+9, y+9, 3, clk == i*2+1 ? FR_LOWERED : 0);
|
||||
DrawFrameRect(x+30, y+1, x+30+9, y+9, 3, clk == i*2+2 ? FR_LOWERED : 0);
|
||||
DrawStringCentered(x+25, y+1, STR_6819, 0);
|
||||
DrawStringCentered(x+35, y+1, STR_681A, 0);
|
||||
int32 val;
|
||||
|
||||
DrawFrameRect(x + 20, y + 1, x + 20 + 9, y + 9, 3, clk == i * 2 + 1 ? FR_LOWERED : 0);
|
||||
DrawFrameRect(x + 30, y + 1, x + 30 + 9, y + 9, 3, clk == i * 2 + 2 ? FR_LOWERED : 0);
|
||||
DrawStringCentered(x + 25, y + 1, STR_6819, 0);
|
||||
DrawStringCentered(x + 35, y + 1, STR_681A, 0);
|
||||
|
||||
val = ReadCE(ce);
|
||||
|
||||
// set correct string for switch climate cheat
|
||||
if(ce->str==STR_CHEAT_SWITCH_CLIMATE)
|
||||
val += STR_TEMPERATE_LANDSCAPE;
|
||||
if (ce->str == STR_CHEAT_SWITCH_CLIMATE) val += STR_TEMPERATE_LANDSCAPE;
|
||||
|
||||
SetDParam(0, val);
|
||||
|
||||
// display date for change date cheat
|
||||
if(ce->str==STR_CHEAT_CHANGE_DATE)
|
||||
SetDParam(0, _date);
|
||||
if (ce->str == STR_CHEAT_CHANGE_DATE) SetDParam(0, _date);
|
||||
|
||||
// draw colored flag for change player cheat
|
||||
if(ce->str==STR_CHEAT_CHANGE_PLAYER)
|
||||
DrawPlayerIcon(_current_player, 156, y+2);
|
||||
|
||||
if (ce->str == STR_CHEAT_CHANGE_PLAYER) {
|
||||
DrawPlayerIcon(_current_player, 156, y + 2);
|
||||
}
|
||||
}
|
||||
|
||||
DrawString(50, y+1, ce->str, 0);
|
||||
DrawString(50, y + 1, ce->str, 0);
|
||||
|
||||
y+=12;
|
||||
y += 12;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_CLICK: {
|
||||
const CheatEntry *ce;
|
||||
uint btn = (e->click.pt.y - 46) / 12;
|
||||
|
@ -1827,19 +1831,17 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
|
|||
uint x = e->click.pt.x;
|
||||
|
||||
// not clicking a button?
|
||||
if(!IS_INT_INSIDE(x, 20, 40) || btn>=lengthof(_cheats_ui))
|
||||
break;
|
||||
if (!IS_INT_INSIDE(x, 20, 40) || btn >= lengthof(_cheats_ui)) break;
|
||||
|
||||
ce = &_cheats_ui[btn];
|
||||
oval = val = ReadCE(ce);
|
||||
|
||||
*ce->been_used = true;
|
||||
|
||||
switch(ce->type) {
|
||||
switch (ce->type) {
|
||||
case CE_BOOL: {
|
||||
val ^= 1;
|
||||
if (ce->click_proc != NULL)
|
||||
ce->click_proc(val, 0);
|
||||
if (ce->click_proc != NULL) ce->click_proc(val, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1861,11 +1863,11 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
// take whatever the function returns
|
||||
val = ce->click_proc(val, (x>=30) ? 1 : -1);
|
||||
|
||||
if (val != oval)
|
||||
WP(w,def_d).data_1 = btn * 2 + 1 + ((x>=30) ? 1 : 0);
|
||||
val = ce->click_proc(val, (x >= 30) ? 1 : -1);
|
||||
|
||||
if (val != oval) {
|
||||
WP(w,def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1886,6 +1888,7 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const WindowDesc _cheats_desc = {
|
||||
240, 22, 400, 160,
|
||||
WC_CHEATS,0,
|
||||
|
|
67
music_gui.c
67
music_gui.c
|
@ -20,11 +20,11 @@ static byte _cur_playlist[33];
|
|||
|
||||
|
||||
static byte _playlist_all[] = {
|
||||
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,0,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0
|
||||
};
|
||||
|
||||
static byte _playlist_old_style[] = {
|
||||
1, 8, 2, 9, 14, 15, 19, 13, 0,
|
||||
1, 8, 2, 9, 14, 15, 19, 13, 0
|
||||
};
|
||||
|
||||
static byte _playlist_new_style[] = {
|
||||
|
@ -45,7 +45,7 @@ static byte * const _playlists[] = {
|
|||
};
|
||||
|
||||
// Map the order of the song names to the numbers of the midi filenames
|
||||
static const int midi_idx[] = {
|
||||
static const byte midi_idx[] = {
|
||||
0, // Tycoon DELUXE Theme
|
||||
2, // Easy Driver
|
||||
3, // Little Red Diesel
|
||||
|
@ -78,8 +78,7 @@ static void SkipToPrevSong(void)
|
|||
byte t;
|
||||
|
||||
// empty playlist
|
||||
if (b[0] == 0)
|
||||
return;
|
||||
if (b[0] == 0) return;
|
||||
|
||||
// find the end
|
||||
do p++; while (p[0] != 0);
|
||||
|
@ -97,10 +96,12 @@ static void SkipToPrevSong(void)
|
|||
|
||||
static void SkipToNextSong(void)
|
||||
{
|
||||
byte *b = _cur_playlist, t;
|
||||
byte* b = _cur_playlist;
|
||||
byte t;
|
||||
|
||||
if ((t=b[0]) != 0) {
|
||||
while (b[1]) {
|
||||
t = b[0];
|
||||
if (t != 0) {
|
||||
while (b[1] != 0) {
|
||||
b[0] = b[1];
|
||||
b++;
|
||||
}
|
||||
|
@ -165,8 +166,7 @@ static void PlayPlaylistSong(void)
|
|||
{
|
||||
if (_cur_playlist[0] == 0) {
|
||||
SelectSongToPlay();
|
||||
if (_cur_playlist[0] == 0)
|
||||
return;
|
||||
if (_cur_playlist[0] == 0) return;
|
||||
}
|
||||
_music_wnd_cursong = _cur_playlist[0];
|
||||
DoPlaySong();
|
||||
|
@ -189,16 +189,16 @@ void MusicLoop(void)
|
|||
PlayPlaylistSong();
|
||||
}
|
||||
|
||||
if (_song_is_active == false)
|
||||
return;
|
||||
if (_song_is_active == false) return;
|
||||
|
||||
if (!_music_driver->is_song_playing()) {
|
||||
if (_game_mode != GM_MENU) {
|
||||
StopMusic();
|
||||
SkipToNextSong();
|
||||
PlayPlaylistSong();
|
||||
} else
|
||||
} else {
|
||||
ResetMusic();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,18 +229,18 @@ static void MusicTrackSelectionWndProc(Window *w, WindowEvent *e)
|
|||
DrawString(4, 23+(i-1)*6, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
|
||||
}
|
||||
|
||||
for(i=0; i!=6; i++) {
|
||||
DrawStringCentered(216, 45 + i*8, STR_01D5_ALL + i, (i==msf.playlist) ? 0xC : 0x10);
|
||||
for (i = 0; i != 6; i++) {
|
||||
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*2, STR_01F1_SAVE, 0);
|
||||
|
||||
y = 23;
|
||||
for(p = _playlists[msf.playlist],i=0; (i=*p) != 0; p++) {
|
||||
for (p = _playlists[msf.playlist], i = 0; (i = *p) != 0; p++) {
|
||||
SetDParam(0, i);
|
||||
SetDParam(2, i);
|
||||
SetDParam(1, SPECSTR_SONGNAME);
|
||||
SetDParam(2, i);
|
||||
DrawString(252, y, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
|
||||
y += 6;
|
||||
}
|
||||
|
@ -248,19 +248,20 @@ static void MusicTrackSelectionWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 3: { /* add to playlist */
|
||||
int y = (e->click.pt.y - 23) / 6;
|
||||
int i;
|
||||
uint i;
|
||||
byte *p;
|
||||
|
||||
if (msf.playlist < 4) return;
|
||||
if ((uint)y >= NUM_SONGS_AVAILABLE) return;
|
||||
if (!IS_INT_INSIDE(y, 0, NUM_SONGS_AVAILABLE)) return;
|
||||
|
||||
p = _playlists[msf.playlist];
|
||||
for(i=0; i!=32; i++) {
|
||||
for (i = 0; i != 32; i++) {
|
||||
if (p[i] == 0) {
|
||||
p[i] = (byte)(y + 1);
|
||||
p[i+1] = 0;
|
||||
p[i] = y + 1;
|
||||
p[i + 1] = 0;
|
||||
SetWindowDirty(w);
|
||||
SelectSongToPlay();
|
||||
break;
|
||||
|
@ -323,7 +324,7 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
|
|||
{
|
||||
switch(e->event) {
|
||||
case WE_PAINT: {
|
||||
int i,num;
|
||||
uint i;
|
||||
StringID str;
|
||||
|
||||
w->click_state |= 0x280;
|
||||
|
@ -331,8 +332,7 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
GfxFillRect(187, 16, 200, 33, 0);
|
||||
|
||||
num = 8;
|
||||
for (i=0; i!=num; i++) {
|
||||
for (i = 0; i != 8; i++) {
|
||||
int color = 0xD0;
|
||||
if (i > 4) {
|
||||
color = 0xBF;
|
||||
|
@ -340,17 +340,16 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
|
|||
color = 0xB8;
|
||||
}
|
||||
}
|
||||
GfxFillRect(187, 33 - i*2, 200, 33 - i*2, color);
|
||||
GfxFillRect(187, 33 - i * 2, 200, 33 - i * 2, color);
|
||||
}
|
||||
|
||||
GfxFillRect(60, 46, 239, 52, 0);
|
||||
|
||||
str = STR_01E3;
|
||||
if (_song_is_active != 0 && _music_wnd_cursong != 0) {
|
||||
str = STR_01E4_0;
|
||||
if (_song_is_active == 0 || _music_wnd_cursong == 0) {
|
||||
str = STR_01E3;
|
||||
} else {
|
||||
SetDParam(0, _music_wnd_cursong);
|
||||
if (_music_wnd_cursong >= 10)
|
||||
str = STR_01E5;
|
||||
str = (_music_wnd_cursong < 10) ? STR_01E4_0 : STR_01E5;
|
||||
}
|
||||
DrawString(62, 46, str, 0);
|
||||
|
||||
|
@ -365,8 +364,8 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
DrawString(60, 38, STR_01E8_TRACK_XTITLE, 0);
|
||||
|
||||
for(i=0; i!=6; i++) {
|
||||
DrawStringCentered(25+i*50, 59, STR_01D5_ALL+i, msf.playlist == i ? 0xC : 0x10);
|
||||
for (i = 0; i != 6; i++) {
|
||||
DrawStringCentered(25 + i * 50, 59, STR_01D5_ALL + i, msf.playlist == i ? 0xC : 0x10);
|
||||
}
|
||||
|
||||
DrawStringCentered(31, 43, STR_01E9_SHUFFLE, (msf.shuffle ? 0xC : 0x10));
|
||||
|
|
|
@ -1257,7 +1257,7 @@ static void NetworkGenerateUniqueId(void)
|
|||
|
||||
/* Generate the MD5 hash */
|
||||
md5_init(&state);
|
||||
md5_append(&state, coding_string, strlen(coding_string));
|
||||
md5_append(&state, (const md5_byte_t*)coding_string, strlen(coding_string));
|
||||
md5_finish(&state, digest);
|
||||
|
||||
for (di = 0; di < 16; ++di)
|
||||
|
|
119
network_gui.c
119
network_gui.c
|
@ -62,11 +62,10 @@ static FiosItem *_selected_map = NULL; // to highlight slected map
|
|||
// called when a new server is found on the network
|
||||
void UpdateNetworkGameWindow(bool unselect)
|
||||
{
|
||||
Window *w;
|
||||
w = FindWindowById(WC_NETWORK_WINDOW, 0);
|
||||
Window* w = FindWindowById(WC_NETWORK_WINDOW, 0);
|
||||
|
||||
if (w != NULL) {
|
||||
if (unselect)
|
||||
_selected_item = NULL;
|
||||
if (unselect) _selected_item = NULL;
|
||||
w->vscroll.count = _network_game_count;
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
|
@ -123,8 +122,8 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
while (cur_item != NULL) {
|
||||
bool compatible =
|
||||
!strncmp(cur_item->info.server_revision, _openttd_revision, NETWORK_REVISION_LENGTH - 1) ||
|
||||
!strncmp(cur_item->info.server_revision, NOREV_STRING, sizeof(cur_item->info.server_revision));
|
||||
strncmp(cur_item->info.server_revision, _openttd_revision, NETWORK_REVISION_LENGTH - 1) == 0 ||
|
||||
strncmp(cur_item->info.server_revision, NOREV_STRING, sizeof(cur_item->info.server_revision) == 0);
|
||||
|
||||
if (cur_item == sel)
|
||||
GfxFillRect(11, y - 2, 218, y + 9, 10); // show highlighted item with a different colour
|
||||
|
@ -138,10 +137,8 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
// only draw icons if the server is online
|
||||
if (cur_item->online) {
|
||||
|
||||
// draw a lock if the server is password protected.
|
||||
if(cur_item->info.use_password)
|
||||
DrawSprite(SPR_LOCK, 186, y-1);
|
||||
if (cur_item->info.use_password) DrawSprite(SPR_LOCK, 186, y - 1);
|
||||
|
||||
// draw red or green icon, depending on compatibility with server.
|
||||
DrawSprite(SPR_BLOT | (compatible ? PALETTE_TO_GREEN : PALETTE_TO_RED), 195, y);
|
||||
|
@ -180,43 +177,43 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
SetDParam(0, sel->info.clients_on);
|
||||
SetDParam(1, sel->info.clients_max);
|
||||
DrawString(260, y, STR_NETWORK_CLIENTS, 2); // clients on the server / maximum slots
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
if (sel->info.server_lang < NETWORK_NUM_LANGUAGES) {
|
||||
SetDParam(0, STR_NETWORK_LANG_ANY+sel->info.server_lang);
|
||||
SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
|
||||
DrawString(260, y, STR_NETWORK_LANGUAGE, 2); // server language
|
||||
}
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
if (sel->info.map_set < NUM_LANDSCAPE ) {
|
||||
SetDParam(0, STR_TEMPERATE_LANDSCAPE+sel->info.map_set);
|
||||
SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
|
||||
DrawString(260, y, STR_NETWORK_TILESET, 2); // tileset
|
||||
}
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, sel->info.map_width);
|
||||
SetDParam(1, sel->info.map_height);
|
||||
DrawString(260, y, STR_NETWORK_MAP_SIZE, 2); // map size
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
SetDParamStr(0, sel->info.server_revision);
|
||||
DrawString(260, y, STR_NETWORK_SERVER_VERSION, 2); // server version
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
SetDParamStr(0, sel->info.hostname);
|
||||
SetDParam(1, sel->port);
|
||||
DrawString(260, y, STR_NETWORK_SERVER_ADDRESS, 2); // server address
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, sel->info.start_date);
|
||||
DrawString(260, y, STR_NETWORK_START_DATE, 2); // start date
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
SetDParam(0, sel->info.game_date);
|
||||
DrawString(260, y, STR_NETWORK_CURRENT_DATE, 2); // current date
|
||||
y+=10;
|
||||
y += 10;
|
||||
|
||||
y+=2;
|
||||
y += 2;
|
||||
|
||||
if (strncmp(sel->info.server_revision, _openttd_revision, NETWORK_REVISION_LENGTH - 1) != 0) {
|
||||
if (strncmp(sel->info.server_revision, NOREV_STRING, sizeof(sel->info.server_revision)) != 0)
|
||||
|
@ -224,10 +221,11 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
} else if (sel->info.clients_on == sel->info.clients_max) {
|
||||
// Show: server full, when clients_on == clients_max
|
||||
DrawStringMultiCenter(365, y, STR_NETWORK_SERVER_FULL, 2); // server full
|
||||
} else if (sel->info.use_password)
|
||||
} else if (sel->info.use_password) {
|
||||
DrawStringMultiCenter(365, y, STR_NETWORK_PASSWORD, 2); // password warning
|
||||
}
|
||||
|
||||
y+=10;
|
||||
y += 10;
|
||||
}
|
||||
} break;
|
||||
|
||||
|
@ -306,9 +304,7 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (_selected_field == 3)
|
||||
HandleEditBox(w, 3);
|
||||
|
||||
if (_selected_field == 3) HandleEditBox(w, 3);
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS:
|
||||
|
@ -331,10 +327,11 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
|
|||
if (HandleEditBoxKey(w, 3, e) == 1) break; // enter pressed
|
||||
|
||||
// The name is only allowed when it starts with a letter!
|
||||
if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ')
|
||||
if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ') {
|
||||
ttd_strlcpy(_network_player_name, _edit_str_buf, lengthof(_network_player_name));
|
||||
else
|
||||
} else {
|
||||
ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
@ -396,7 +393,7 @@ void ShowNetworkGameWindow(void)
|
|||
if (_first_time_show_network_game_window) {
|
||||
_first_time_show_network_game_window = false;
|
||||
// add all servers from the config file to our list
|
||||
for (i=0; i != lengthof(_network_host_list); i++) {
|
||||
for (i = 0; i != lengthof(_network_host_list); i++) {
|
||||
if (_network_host_list[i] == NULL) break;
|
||||
NetworkAddServer(_network_host_list[i]);
|
||||
}
|
||||
|
@ -489,18 +486,22 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
case WE_CLICK:
|
||||
_selected_field = e->click.widget;
|
||||
switch(e->click.widget) {
|
||||
case 0: case 15: /* Close 'X' | Cancel button */
|
||||
switch (e->click.widget) {
|
||||
case 0: /* Close 'X' */
|
||||
case 15: /* Cancel button */
|
||||
ShowNetworkGameWindow();
|
||||
break;
|
||||
case 4: { /* Set password button */
|
||||
|
||||
case 4: /* Set password button */
|
||||
ShowQueryString(BindCString(_network_server_password),
|
||||
STR_NETWORK_SET_PASSWORD, 20, 250, w->window_class, w->window_number);
|
||||
} break;
|
||||
break;
|
||||
|
||||
case 5: { /* Select map */
|
||||
int y = (e->click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
|
||||
if ((y += w->vscroll.pos) >= w->vscroll.count)
|
||||
return;
|
||||
|
||||
y += w->vscroll.pos;
|
||||
if (y >= w->vscroll.count) return;
|
||||
|
||||
_selected_map = (y == 0) ? NULL : _fios_list + y - 1;
|
||||
SetWindowDirty(w);
|
||||
|
@ -561,18 +562,15 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (_selected_field == 3)
|
||||
HandleEditBox(w, 3);
|
||||
if (_selected_field == 3) HandleEditBox(w, 3);
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS:
|
||||
if (_selected_field == 3)
|
||||
HandleEditBoxKey(w, 3, e);
|
||||
if (_selected_field == 3) HandleEditBoxKey(w, 3, e);
|
||||
break;
|
||||
|
||||
case WE_ON_EDIT_TEXT: {
|
||||
const char *b = e->edittext.str;
|
||||
ttd_strlcpy(_network_server_password, b, sizeof(_network_server_password));
|
||||
ttd_strlcpy(_network_server_password, e->edittext.str, lengthof(_network_server_password));
|
||||
_network_game_info.use_password = (_network_server_password[0] != '\0');
|
||||
SetWindowDirty(w);
|
||||
} break;
|
||||
|
@ -636,12 +634,12 @@ static void ShowNetworkStartServerWindow(void)
|
|||
static byte NetworkLobbyFindCompanyIndex(byte pos)
|
||||
{
|
||||
byte i;
|
||||
|
||||
/* Scroll through all _network_player_info and get the 'pos' item
|
||||
that is not empty */
|
||||
for (i = 0; i < MAX_PLAYERS; i++) {
|
||||
if (_network_player_info[i].company_name[0] != '\0') {
|
||||
if (pos-- == 0)
|
||||
return i;
|
||||
if (pos-- == 0) return i;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -650,7 +648,7 @@ static byte NetworkLobbyFindCompanyIndex(byte pos)
|
|||
|
||||
static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
|
||||
|
||||
|
@ -678,7 +676,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
|
|||
GfxFillRect(11, y - 1, 154, y + 10, 155); // show highlighted item with a different colour
|
||||
|
||||
DoDrawString(_network_player_info[index].company_name, 13, y, 2);
|
||||
if(_network_player_info[index].use_password != 0)
|
||||
if (_network_player_info[index].use_password != 0)
|
||||
DrawSprite(SPR_LOCK, 135, y);
|
||||
|
||||
/* If the company's income was positive puts a green dot else a red dot */
|
||||
|
@ -688,8 +686,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
pos++;
|
||||
y += NET_PRC__SIZE_OF_ROW_COMPANY;
|
||||
if (pos >= w->vscroll.cap)
|
||||
break;
|
||||
if (pos >= w->vscroll.cap) break;
|
||||
}
|
||||
|
||||
// draw info about selected company
|
||||
|
@ -1087,7 +1084,7 @@ static Window *PopupClientList(Window *w, int client_no, int x, int y)
|
|||
// Main handle for the popup
|
||||
static void ClientListPopupWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int i, y, sel;
|
||||
byte colour;
|
||||
|
@ -1141,7 +1138,7 @@ static void ClientListPopupWndProc(Window *w, WindowEvent *e)
|
|||
// Main handle for clientlist
|
||||
static void ClientListWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
NetworkClientInfo *ci;
|
||||
int y, i = 0;
|
||||
|
@ -1166,8 +1163,9 @@ static void ClientListWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
if (ci->client_index == NETWORK_SERVER_INDEX) {
|
||||
DrawString(4, y, STR_NETWORK_SERVER, colour);
|
||||
} else
|
||||
} else {
|
||||
DrawString(4, y, STR_NETWORK_CLIENT, colour);
|
||||
}
|
||||
|
||||
// Filter out spectators
|
||||
if (ci->client_playas > 0 && ci->client_playas <= MAX_PLAYERS)
|
||||
|
@ -1220,15 +1218,14 @@ static void ClientListWndProc(Window *w, WindowEvent *e)
|
|||
void ShowClientList(void)
|
||||
{
|
||||
Window *w = AllocateWindowDescFront(&_client_list_desc, 0);
|
||||
if (w)
|
||||
w->window_number = 0;
|
||||
if (w != NULL) w->window_number = 0;
|
||||
}
|
||||
|
||||
extern void SwitchMode(int new_mode);
|
||||
|
||||
static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
uint8 progress; // used for progress bar
|
||||
DrawWindowWidgets(w);
|
||||
|
@ -1258,13 +1255,14 @@ static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
case 0: case 3: /* Close 'X' | Disconnect button */
|
||||
NetworkDisconnect();
|
||||
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
|
||||
SwitchMode(SM_MENU);
|
||||
ShowNetworkGameWindow();
|
||||
break;
|
||||
switch (e->click.widget) {
|
||||
case 0: /* Close 'X' */
|
||||
case 3: /* Disconnect button */
|
||||
NetworkDisconnect();
|
||||
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
|
||||
SwitchMode(SM_MENU);
|
||||
ShowNetworkGameWindow();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1311,6 +1309,7 @@ void ShowJoinStatusWindowAfterJoin(void)
|
|||
static void ChatWindowWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
static bool closed = false;
|
||||
|
||||
switch (e->event) {
|
||||
case WE_CREATE:
|
||||
SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
|
||||
|
@ -1324,7 +1323,7 @@ static void ChatWindowWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 3: DeleteWindow(w); break; // Cancel
|
||||
case 2: // Send
|
||||
press_ok:;
|
||||
|
|
63
news_gui.c
63
news_gui.c
|
@ -376,8 +376,7 @@ static void ShowNewspaper(NewsItem *ni)
|
|||
ni->duration = 555;
|
||||
|
||||
sound = _news_sounds[ni->type];
|
||||
if (sound != 0)
|
||||
SndPlayFx(sound);
|
||||
if (sound != 0) SndPlayFx(sound);
|
||||
|
||||
top = _screen.height;
|
||||
switch (ni->display_mode) {
|
||||
|
@ -422,8 +421,7 @@ static void ShowTicker(const NewsItem *ni)
|
|||
|
||||
_statusbar_news_item = *ni;
|
||||
w = FindWindowById(WC_STATUS_BAR, 0);
|
||||
if (w != NULL)
|
||||
WP(w, def_d).data_1 = 360;
|
||||
if (w != NULL) WP(w, def_d).data_1 = 360;
|
||||
}
|
||||
|
||||
|
||||
|
@ -441,8 +439,7 @@ static bool ReadyForNextItem(void)
|
|||
// Ticker message
|
||||
// Check if the status bar message is still being displayed?
|
||||
w = FindWindowById(WC_STATUS_BAR, 0);
|
||||
if (w != NULL && WP(w, def_d).data_1 > -1280)
|
||||
return false;
|
||||
if (w != NULL && WP(w, const def_d).data_1 > -1280) return false;
|
||||
|
||||
// Newspaper message
|
||||
// Wait until duration reaches 0
|
||||
|
@ -468,31 +465,33 @@ static void MoveToNexItem(void)
|
|||
ni = &_news_items[_current_news];
|
||||
|
||||
// check the date, don't show too old items
|
||||
if (_date - _news_items_age[ni->type] > ni->date)
|
||||
return;
|
||||
if (_date - _news_items_age[ni->type] > ni->date) return;
|
||||
|
||||
// execute the validation function to see if this item is still valid
|
||||
if ( ni->isValid != NULL && !ni->isValid(ni->data_a, ni->data_b) )
|
||||
return;
|
||||
if (ni->isValid != NULL && !ni->isValid(ni->data_a, ni->data_b)) return;
|
||||
|
||||
switch (GetNewsDisplayValue(ni->type)) {
|
||||
case 0: { /* Off - show nothing only a small reminder in the status bar */
|
||||
Window* w = FindWindowById(WC_STATUS_BAR, 0);
|
||||
|
||||
switch (GetNewsDisplayValue(ni->type)) {
|
||||
case 0: { /* Off - show nothing only a small reminder in the status bar */
|
||||
Window *w = FindWindowById(WC_STATUS_BAR, 0);
|
||||
if (w != NULL) {
|
||||
WP(w, def_d).data_2 = 91;
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
} break;
|
||||
case 1: /* Summary - show ticker, but if forced big, cascade to full */
|
||||
if (!(ni->flags & NF_FORCE_BIG)) {
|
||||
ShowTicker(ni);
|
||||
break;
|
||||
}
|
||||
/* Fallthrough */
|
||||
case 2: /* Full - show newspaper*/
|
||||
ShowNewspaper(ni);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 1: /* Summary - show ticker, but if forced big, cascade to full */
|
||||
if (!(ni->flags & NF_FORCE_BIG)) {
|
||||
ShowTicker(ni);
|
||||
break;
|
||||
}
|
||||
/* Fallthrough */
|
||||
|
||||
case 2: /* Full - show newspaper*/
|
||||
ShowNewspaper(ni);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -501,8 +500,7 @@ void NewsLoop(void)
|
|||
// no news item yet
|
||||
if (_total_news == 0) return;
|
||||
|
||||
if (ReadyForNextItem())
|
||||
MoveToNexItem();
|
||||
if (ReadyForNextItem()) MoveToNexItem();
|
||||
}
|
||||
|
||||
/* Do a forced show of a specific message */
|
||||
|
@ -541,13 +539,13 @@ void ShowLastNewsMessage(void)
|
|||
recent news. Returns INVALID_NEWS if end of queue reached. */
|
||||
static byte getNews(byte i)
|
||||
{
|
||||
if (i >= _total_news)
|
||||
return INVALID_NEWS;
|
||||
if (i >= _total_news) return INVALID_NEWS;
|
||||
|
||||
if (_latest_news < i)
|
||||
if (_latest_news < i) {
|
||||
i = _latest_news + MAX_NEWS - i;
|
||||
else
|
||||
} else {
|
||||
i = _latest_news - i;
|
||||
}
|
||||
|
||||
i %= MAX_NEWS;
|
||||
return i;
|
||||
|
@ -636,10 +634,11 @@ static void MessageHistoryWndProc(Window *w, WindowEvent *e)
|
|||
p = y + w->vscroll.pos;
|
||||
if (p > _total_news - 1) break;
|
||||
|
||||
if (_latest_news >= p)
|
||||
if (_latest_news >= p) {
|
||||
q = _latest_news - p;
|
||||
else
|
||||
} else {
|
||||
q = _latest_news + MAX_NEWS - p;
|
||||
}
|
||||
ShowNewsMessage(q);
|
||||
|
||||
break;
|
||||
|
|
138
openttd.c
138
openttd.c
|
@ -69,16 +69,17 @@ bool _dbg_screen_rect;
|
|||
* caused by the user, i.e. missing files or fatal configuration errors.
|
||||
* Post-0.4.0 since Celestar doesn't want this in SVN before. --pasky */
|
||||
|
||||
void CDECL error(const char *s, ...) {
|
||||
void CDECL error(const char* s, ...)
|
||||
{
|
||||
va_list va;
|
||||
char buf[512];
|
||||
|
||||
va_start(va, s);
|
||||
vsprintf(buf, s, va);
|
||||
va_end(va);
|
||||
|
||||
ShowOSErrorBox(buf);
|
||||
if (_video_driver)
|
||||
_video_driver->stop();
|
||||
if (_video_driver != NULL) _video_driver->stop();
|
||||
|
||||
assert(0);
|
||||
exit(1);
|
||||
|
@ -102,8 +103,7 @@ void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize)
|
|||
size_t len;
|
||||
|
||||
in = fopen(filename, "rb");
|
||||
if (in == NULL)
|
||||
return NULL;
|
||||
if (in == NULL) return NULL;
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
len = ftell(in);
|
||||
|
@ -178,12 +178,12 @@ static int MyGetOpt(MyGetOptData *md)
|
|||
{
|
||||
char *s,*r,*t;
|
||||
|
||||
if ((s=md->cont) != NULL)
|
||||
s = md->cont;
|
||||
if (s != NULL)
|
||||
goto md_continue_here;
|
||||
|
||||
while(true) {
|
||||
if (--md->numleft < 0)
|
||||
return -1;
|
||||
for (;;) {
|
||||
if (--md->numleft < 0) return -1;
|
||||
|
||||
s = *md->argv++;
|
||||
if (*s == '-') {
|
||||
|
@ -347,9 +347,9 @@ int ttd_main(int argc, char* argv[])
|
|||
case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break;
|
||||
case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break;
|
||||
case 'D': {
|
||||
sprintf(musicdriver,"null");
|
||||
sprintf(sounddriver,"null");
|
||||
sprintf(videodriver,"dedicated");
|
||||
strcpy(musicdriver, "null");
|
||||
strcpy(sounddriver, "null");
|
||||
strcpy(videodriver, "dedicated");
|
||||
dedicated = true;
|
||||
} break;
|
||||
case 'f': {
|
||||
|
@ -364,23 +364,18 @@ int ttd_main(int argc, char* argv[])
|
|||
network_conn = NULL;
|
||||
} break;
|
||||
case 'r': ParseResolution(resolution, mgo.opt); break;
|
||||
case 'l': {
|
||||
language = mgo.opt;
|
||||
} break;
|
||||
case 't': {
|
||||
startdate = atoi(mgo.opt);
|
||||
} break;
|
||||
case 'l': language = mgo.opt; break;
|
||||
case 't': startdate = atoi(mgo.opt); break;
|
||||
case 'd': {
|
||||
#if defined(WIN32)
|
||||
CreateConsole();
|
||||
#endif
|
||||
if (mgo.opt)
|
||||
SetDebugString(mgo.opt);
|
||||
if (mgo.opt != NULL) SetDebugString(mgo.opt);
|
||||
} break;
|
||||
case 'e': _switch_mode = SM_EDITOR; break;
|
||||
case 'i': _use_dos_palette = true; break;
|
||||
case 'g':
|
||||
if (mgo.opt) {
|
||||
if (mgo.opt != NULL) {
|
||||
strcpy(_file_to_saveload.name, mgo.opt);
|
||||
_switch_mode = SM_LOAD;
|
||||
} else
|
||||
|
@ -598,7 +593,7 @@ static void MakeNewGame(void)
|
|||
|
||||
// Copy in game options
|
||||
_opt_ptr = &_opt;
|
||||
memcpy(_opt_ptr, &_opt_newgame, sizeof(GameOptions));
|
||||
memcpy(_opt_ptr, &_opt_newgame, sizeof(*_opt_ptr));
|
||||
|
||||
GfxLoadSprites();
|
||||
|
||||
|
@ -643,7 +638,7 @@ static void MakeNewEditorWorld(void)
|
|||
SetupColorsAndInitialWindow();
|
||||
|
||||
// Startup the game system
|
||||
GenerateWorld(1, 1<<_patches.map_x, 1<<_patches.map_y);
|
||||
GenerateWorld(1, 1 << _patches.map_x, 1 << _patches.map_y);
|
||||
|
||||
_local_player = OWNER_NONE;
|
||||
MarkWholeScreenDirty();
|
||||
|
@ -716,8 +711,9 @@ bool SafeSaveOrLoad(const char *filename, int mode, int newgm)
|
|||
} else if (r != SL_OK) {
|
||||
_game_mode = ogm;
|
||||
return false;
|
||||
} else
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void SwitchMode(int new_mode)
|
||||
|
@ -804,9 +800,9 @@ void SwitchMode(int new_mode)
|
|||
_generating_world = false;
|
||||
// delete all stations owned by a player
|
||||
DeleteAllPlayerStations();
|
||||
} else
|
||||
} else {
|
||||
ShowErrorMessage(INVALID_STRING_ID, STR_4009_GAME_LOAD_FAILED, 0, 0);
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -816,10 +812,11 @@ void SwitchMode(int new_mode)
|
|||
break;
|
||||
|
||||
case SM_SAVE: /* Save game */
|
||||
if (SaveOrLoad(_file_to_saveload.name, SL_SAVE) != SL_OK)
|
||||
if (SaveOrLoad(_file_to_saveload.name, SL_SAVE) != SL_OK) {
|
||||
ShowErrorMessage(INVALID_STRING_ID, STR_4007_GAME_SAVE_FAILED, 0, 0);
|
||||
else
|
||||
} else {
|
||||
DeleteWindowById(WC_SAVELOAD, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case SM_GENRANDLAND: /* Generate random land within scenario editor */
|
||||
|
@ -847,8 +844,7 @@ void StateGameLoop(void)
|
|||
// _frame_counter is increased somewhere else when in network-mode
|
||||
// Sidenote: _frame_counter is ONLY used for _savedump in non-MP-games
|
||||
// Should that not be deleted? If so, the next 2 lines can also be deleted
|
||||
if (!_networking)
|
||||
_frame_counter++;
|
||||
if (!_networking) _frame_counter++;
|
||||
|
||||
if (_savedump_path[0] && (uint)_frame_counter >= _savedump_first && (uint)(_frame_counter -_savedump_first) % _savedump_freq == 0 ) {
|
||||
char buf[100];
|
||||
|
@ -951,7 +947,6 @@ void GameLoop(void)
|
|||
int m;
|
||||
ThreadMsg message;
|
||||
|
||||
|
||||
if ((message = OTTD_PollThreadEvent()) != 0) ProcessSentMessage(message);
|
||||
|
||||
// autosave game?
|
||||
|
@ -987,13 +982,14 @@ void GameLoop(void)
|
|||
IncreaseSpriteLRU();
|
||||
InteractiveRandom();
|
||||
|
||||
if (_scroller_click_timeout > 3)
|
||||
if (_scroller_click_timeout > 3) {
|
||||
_scroller_click_timeout -= 3;
|
||||
else
|
||||
} else {
|
||||
_scroller_click_timeout = 0;
|
||||
}
|
||||
|
||||
_caret_timer += 3;
|
||||
_timer_counter+=8;
|
||||
_timer_counter += 8;
|
||||
CursorTick();
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
|
@ -1016,11 +1012,9 @@ void GameLoop(void)
|
|||
StateGameLoop();
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
if (!_pause && _display_opt&DO_FULL_ANIMATION)
|
||||
DoPaletteAnimations();
|
||||
if (!_pause && _display_opt & DO_FULL_ANIMATION) DoPaletteAnimations();
|
||||
|
||||
if (!_pause || _cheats.build_in_pause.value)
|
||||
MoveAllTextEffects();
|
||||
if (!_pause || _cheats.build_in_pause.value) MoveAllTextEffects();
|
||||
|
||||
InputLoop();
|
||||
|
||||
|
@ -1044,8 +1038,7 @@ static void ConvertTownOwner(void)
|
|||
|
||||
for (tile = 0; tile != MapSize(); tile++) {
|
||||
if (IsTileType(tile, MP_STREET)) {
|
||||
if (IsLevelCrossing(tile) && _m[tile].m3 & 0x80)
|
||||
_m[tile].m3 = OWNER_TOWN;
|
||||
if (IsLevelCrossing(tile) && _m[tile].m3 & 0x80) _m[tile].m3 = OWNER_TOWN;
|
||||
|
||||
if (_m[tile].m1 & 0x80) SetTileOwner(tile, OWNER_TOWN);
|
||||
} else if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
||||
|
@ -1057,20 +1050,20 @@ static void ConvertTownOwner(void)
|
|||
// before savegame version 4, the name of the company determined if it existed
|
||||
static void CheckIsPlayerActive(void)
|
||||
{
|
||||
Player *p;
|
||||
Player* p;
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->name_1 != 0) {
|
||||
p->is_active = true;
|
||||
}
|
||||
if (p->name_1 != 0) p->is_active = true;
|
||||
}
|
||||
}
|
||||
|
||||
// since savegame version 4.1, exclusive transport rights are stored at towns
|
||||
static void UpdateExclusiveRights(void)
|
||||
{
|
||||
Town *t;
|
||||
FOR_ALL_TOWNS(t) if (t->xy != 0) {
|
||||
t->exclusivity=(byte)-1;
|
||||
Town* t;
|
||||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy != 0) t->exclusivity = (byte)-1;
|
||||
}
|
||||
|
||||
/* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete)
|
||||
|
@ -1113,9 +1106,8 @@ static void UpdateVoidTiles(void)
|
|||
static void UpdateSignOwner(void)
|
||||
{
|
||||
SignStruct *ss;
|
||||
FOR_ALL_SIGNS(ss) {
|
||||
ss->owner = OWNER_NONE; // no owner
|
||||
}
|
||||
|
||||
FOR_ALL_SIGNS(ss) ss->owner = OWNER_NONE;
|
||||
}
|
||||
|
||||
extern void UpdateOldAircraft( void );
|
||||
|
@ -1128,24 +1120,16 @@ bool AfterLoadGame(uint version)
|
|||
Player *p;
|
||||
|
||||
// in version 2.1 of the savegame, town owner was unified.
|
||||
if (version <= 0x200) {
|
||||
ConvertTownOwner();
|
||||
}
|
||||
if (version <= 0x200) ConvertTownOwner();
|
||||
|
||||
// from version 4.1 of the savegame, exclusive rights are stored at towns
|
||||
if (version <= 0x400) {
|
||||
UpdateExclusiveRights();
|
||||
}
|
||||
if (version <= 0x400) UpdateExclusiveRights();
|
||||
|
||||
// from version 4.2 of the savegame, currencies are in a different order
|
||||
if (version <= 0x401) {
|
||||
UpdateCurrencies();
|
||||
}
|
||||
if (version <= 0x401) UpdateCurrencies();
|
||||
|
||||
// from version 6.0 of the savegame, signs have an "owner"
|
||||
if (version <= 0x600) {
|
||||
UpdateSignOwner();
|
||||
}
|
||||
if (version <= 0x600) UpdateSignOwner();
|
||||
|
||||
/* In old version there seems to be a problem that water is owned by
|
||||
OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
|
||||
|
@ -1178,15 +1162,12 @@ bool AfterLoadGame(uint version)
|
|||
AfterLoadVehicles();
|
||||
|
||||
// Update all waypoints
|
||||
if (version < 0x0C00)
|
||||
FixOldWaypoints();
|
||||
if (version < 0x0C00) FixOldWaypoints();
|
||||
|
||||
UpdateAllWaypointSigns();
|
||||
|
||||
// in version 2.2 of the savegame, we have new airports
|
||||
if (version <= 0x201) {
|
||||
UpdateOldAircraft();
|
||||
}
|
||||
if (version <= 0x201) UpdateOldAircraft();
|
||||
|
||||
UpdateAllStationVirtCoord();
|
||||
|
||||
|
@ -1195,8 +1176,7 @@ bool AfterLoadGame(uint version)
|
|||
UpdateAllSignVirtCoords();
|
||||
|
||||
// make sure there is a town in the game
|
||||
if (_game_mode == GM_NORMAL && !ClosestTownFromTile(0, (uint)-1))
|
||||
{
|
||||
if (_game_mode == GM_NORMAL && !ClosestTownFromTile(0, (uint)-1)) {
|
||||
_error_message = STR_NO_TOWN_IN_SCENARIO;
|
||||
return false;
|
||||
}
|
||||
|
@ -1215,16 +1195,12 @@ bool AfterLoadGame(uint version)
|
|||
vp->virtual_width = vp->width << vp->zoom;
|
||||
vp->virtual_height = vp->height << vp->zoom;
|
||||
|
||||
|
||||
// in version 4.0 of the savegame, is_active was introduced to determine
|
||||
// if a player does exist, rather then checking name_1
|
||||
if (version <= 0x400) {
|
||||
CheckIsPlayerActive();
|
||||
}
|
||||
if (version <= 0x400) CheckIsPlayerActive();
|
||||
|
||||
// the void tiles on the southern border used to belong to a wrong class.
|
||||
if (version <= 0x402)
|
||||
UpdateVoidTiles();
|
||||
if (version <= 0x402) UpdateVoidTiles();
|
||||
|
||||
// If Load Scenario / New (Scenario) Game is used,
|
||||
// a player does not exist yet. So create one here.
|
||||
|
@ -1237,9 +1213,7 @@ bool AfterLoadGame(uint version)
|
|||
MarkWholeScreenDirty();
|
||||
|
||||
//In 5.1, Oilrigs have been moved (again)
|
||||
if (version <= 0x500) {
|
||||
UpdateOilRig();
|
||||
}
|
||||
if (version <= 0x500) UpdateOilRig();
|
||||
|
||||
if (version <= 0x600) {
|
||||
BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
|
||||
|
@ -1265,9 +1239,7 @@ bool AfterLoadGame(uint version)
|
|||
|
||||
if (version < 0x900) {
|
||||
Town *t;
|
||||
FOR_ALL_TOWNS(t) {
|
||||
UpdateTownMaxPass(t);
|
||||
}
|
||||
FOR_ALL_TOWNS(t) UpdateTownMaxPass(t);
|
||||
}
|
||||
|
||||
if (version < 0xF00) {
|
||||
|
@ -1320,9 +1292,7 @@ bool AfterLoadGame(uint version)
|
|||
}
|
||||
}
|
||||
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
p->avail_railtypes = GetPlayerRailtypes(p->index);
|
||||
}
|
||||
FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
35
order_cmd.c
35
order_cmd.c
|
@ -29,8 +29,7 @@ static void OrderPoolNewBlock(uint start_item)
|
|||
{
|
||||
Order *order;
|
||||
|
||||
FOR_ALL_ORDERS_FROM(order, start_item)
|
||||
order->index = start_item++;
|
||||
FOR_ALL_ORDERS_FROM(order, start_item) order->index = start_item++;
|
||||
}
|
||||
|
||||
/* Initialize the order-pool */
|
||||
|
@ -117,7 +116,7 @@ static Order *AllocateOrder(void)
|
|||
if (order->type == OT_NOTHING) {
|
||||
uint index = order->index;
|
||||
|
||||
memset(order, 0, sizeof(Order));
|
||||
memset(order, 0, sizeof(*order));
|
||||
order->index = index;
|
||||
order->next = NULL;
|
||||
|
||||
|
@ -126,8 +125,7 @@ static Order *AllocateOrder(void)
|
|||
}
|
||||
|
||||
/* Check if we can add a block to the pool */
|
||||
if (AddBlockToPool(&_order_pool))
|
||||
return AllocateOrder();
|
||||
if (AddBlockToPool(&_order_pool)) return AllocateOrder();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -207,19 +205,19 @@ int32 CmdInsertOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
* [full-load | unload] [+ transfer] [+ non-stop]
|
||||
* non-stop orders (if any) are only valid for trains */
|
||||
switch (new_order.flags) {
|
||||
case 0: /* Fallthrough */
|
||||
case 0:
|
||||
case OF_FULL_LOAD:
|
||||
case OF_FULL_LOAD | OF_TRANSFER: /* Fallthrough */
|
||||
case OF_FULL_LOAD | OF_TRANSFER:
|
||||
case OF_UNLOAD:
|
||||
case OF_UNLOAD | OF_TRANSFER: /* Fallthrough */
|
||||
case OF_UNLOAD | OF_TRANSFER:
|
||||
case OF_TRANSFER:
|
||||
break;
|
||||
|
||||
case OF_NON_STOP:
|
||||
case OF_NON_STOP | OF_FULL_LOAD:
|
||||
case OF_NON_STOP | OF_FULL_LOAD | OF_TRANSFER: /* Fallthrough */
|
||||
case OF_NON_STOP | OF_FULL_LOAD | OF_TRANSFER:
|
||||
case OF_NON_STOP | OF_UNLOAD:
|
||||
case OF_NON_STOP | OF_UNLOAD | OF_TRANSFER: /* Fallthrough */
|
||||
case OF_NON_STOP | OF_UNLOAD | OF_TRANSFER:
|
||||
case OF_NON_STOP | OF_TRANSFER:
|
||||
if (v->type != VEH_Train) return CMD_ERROR;
|
||||
break;
|
||||
|
@ -407,9 +405,7 @@ int32 CmdInsertOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
static int32 DecloneOrder(Vehicle *dst, uint32 flags)
|
||||
{
|
||||
if (flags & DC_EXEC) {
|
||||
/* Delete orders from vehicle */
|
||||
DeleteVehicleOrders(dst);
|
||||
|
||||
InvalidateVehicleOrder(dst);
|
||||
RebuildVehicleLists();
|
||||
}
|
||||
|
@ -568,8 +564,7 @@ int32 CmdModifyOrder(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
switch (p2) {
|
||||
case OFB_FULL_LOAD:
|
||||
TOGGLEBIT(order->flags, OFB_FULL_LOAD);
|
||||
if (order->type != OT_GOTO_DEPOT)
|
||||
CLRBIT(order->flags, OFB_UNLOAD);
|
||||
if (order->type != OT_GOTO_DEPOT) CLRBIT(order->flags, OFB_UNLOAD);
|
||||
break;
|
||||
case OFB_UNLOAD:
|
||||
TOGGLEBIT(order->flags, OFB_UNLOAD);
|
||||
|
@ -750,7 +745,7 @@ void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *bak)
|
|||
|
||||
/* Safe custom string, if any */
|
||||
if ((v->string_id & 0xF800) != 0x7800) {
|
||||
bak->name[0] = 0;
|
||||
bak->name[0] = '\0';
|
||||
} else {
|
||||
GetName(v->string_id & 0x7FF, bak->name);
|
||||
}
|
||||
|
@ -899,8 +894,7 @@ bool CheckOrders(uint data_a, uint data_b)
|
|||
n_st++;
|
||||
st = GetStation(order->station);
|
||||
required_tile = GetStationTileForVehicle(v, st);
|
||||
if (!required_tile)
|
||||
problem_type = 3;
|
||||
if (required_tile == 0) problem_type = 3;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -912,8 +906,7 @@ bool CheckOrders(uint data_a, uint data_b)
|
|||
problem_type = 2;
|
||||
|
||||
/* Do we only have 1 station in our order list? */
|
||||
if ((n_st < 2) && (problem_type == -1))
|
||||
problem_type = 0;
|
||||
if (n_st < 2 && problem_type == -1) problem_type = 0;
|
||||
|
||||
/* We don't have a problem */
|
||||
if (problem_type < 0) {
|
||||
|
@ -1104,9 +1097,7 @@ bool CheckForValidOrders(const Vehicle* v)
|
|||
{
|
||||
const Order *order;
|
||||
|
||||
FOR_VEHICLE_ORDERS(v, order)
|
||||
if (order->type != OT_DUMMY)
|
||||
return true;
|
||||
FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
12
order_gui.c
12
order_gui.c
|
@ -472,13 +472,15 @@ static void OrdersWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
case WE_RCLICK: {
|
||||
Vehicle *v = GetVehicle(w->window_number);
|
||||
int sel = OrderGetSel(w);
|
||||
if (e->click.widget != 8) break;
|
||||
if (sel == v->num_orders || GetVehicleOrder(v, sel)->type != OT_GOTO_DEPOT)
|
||||
Vehicle* v = GetVehicle(w->window_number);
|
||||
int s = OrderGetSel(w);
|
||||
|
||||
if (e->click.widget != 8) break;
|
||||
if (s == v->num_orders || GetVehicleOrder(v, s)->type != OT_GOTO_DEPOT) {
|
||||
GuiShowTooltips(STR_8857_MAKE_THE_HIGHLIGHTED_ORDER);
|
||||
else
|
||||
} else {
|
||||
GuiShowTooltips(STR_SERVICE_HINT);
|
||||
}
|
||||
} break;
|
||||
|
||||
case WE_4: {
|
||||
|
|
10
player_gui.c
10
player_gui.c
|
@ -685,10 +685,10 @@ static const WindowDesc _other_player_company_desc = {
|
|||
|
||||
void ShowPlayerCompany(PlayerID player)
|
||||
{
|
||||
Window *w;
|
||||
w = AllocateWindowDescFront(player == _local_player ? &_my_player_company_desc : &_other_player_company_desc, player);
|
||||
if (w)
|
||||
w->caption_color = w->window_number;
|
||||
Window* w;
|
||||
|
||||
w = AllocateWindowDescFront(player == _local_player ? &_my_player_company_desc : &_other_player_company_desc, player);
|
||||
if (w != NULL) w->caption_color = w->window_number;
|
||||
}
|
||||
|
||||
|
||||
|
@ -881,7 +881,7 @@ void ShowHighscoreTable(int difficulty, int8 ranking)
|
|||
if (!_networking) DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
|
||||
|
||||
/* Close all always on-top windows to get a clean screen */
|
||||
if (_game_mode != GM_MENU) HideVitalWindows();
|
||||
if (_game_mode != GM_MENU) HideVitalWindows();
|
||||
|
||||
DeleteWindowByClass(WC_HIGHSCORE);
|
||||
w = AllocateWindowDesc(&_highscore_desc);
|
||||
|
|
28
players.c
28
players.c
|
@ -135,17 +135,17 @@ void DrawPlayerFace(uint32 face, int color, int x, int y)
|
|||
/* draw the hair */
|
||||
{
|
||||
uint val = GB(face, 16, 4);
|
||||
if (!(flag&2)) {
|
||||
if (!(flag&1)) {
|
||||
DrawSprite(0x382 + (val*9>>4), x, y);
|
||||
if (flag & 2) {
|
||||
if (flag & 1) {
|
||||
DrawSprite(0x3D9 + (val * 5 >> 4), x, y);
|
||||
} else {
|
||||
DrawSprite(0x38B + (val*5>>4), x, y);
|
||||
DrawSprite(0x3D4 + (val * 5 >> 4), x, y);
|
||||
}
|
||||
} else {
|
||||
if (!(flag&1)) {
|
||||
DrawSprite(0x3D4 + (val*5>>4), x, y);
|
||||
if (flag & 1) {
|
||||
DrawSprite(0x38B + (val * 5 >> 4), x, y);
|
||||
} else {
|
||||
DrawSprite(0x3D9 + (val*5>>4), x, y);
|
||||
DrawSprite(0x382 + (val * 9 >> 4), x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -163,9 +163,7 @@ void DrawPlayerFace(uint32 face, int color, int x, int y)
|
|||
DrawSprite(0x37B + (GB(val, 2, 2) * 4 >> 2), x, y);
|
||||
|
||||
val >>= 4;
|
||||
if (val < 3) {
|
||||
DrawSprite((flag&2 ? 0x3D1 : 0x37F) + val, x, y);
|
||||
}
|
||||
if (val < 3) DrawSprite((flag & 2 ? 0x3D1 : 0x37F) + val, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -173,14 +171,10 @@ void DrawPlayerFace(uint32 face, int color, int x, int y)
|
|||
{
|
||||
uint val = GB(face, 28, 3);
|
||||
|
||||
if (!(flag&2)) {
|
||||
if (val<=1) {
|
||||
DrawSprite(0x347 + val, x, y);
|
||||
}
|
||||
if (flag & 2) {
|
||||
if (val <= 1) DrawSprite(0x3AE + val, x, y);
|
||||
} else {
|
||||
if (val<=1) {
|
||||
DrawSprite(0x3AE + val, x, y);
|
||||
}
|
||||
if (val <= 1) DrawSprite(0x347 + val, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
48
rail_cmd.c
48
rail_cmd.c
|
@ -224,7 +224,7 @@ uint GetRailFoundation(uint tileh, uint bits)
|
|||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
static uint32 CheckRailSlope(uint tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
|
||||
{
|
||||
// never allow building on top of steep tiles
|
||||
|
@ -689,8 +689,7 @@ int32 CmdBuildTrainDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
cost = ret;
|
||||
|
||||
d = AllocateDepot();
|
||||
if (d == NULL)
|
||||
return CMD_ERROR;
|
||||
if (d == NULL) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
if (IsLocalPlayer()) _last_built_train_depot_tile = tile;
|
||||
|
@ -820,10 +819,11 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
_m[tile].m3 &= ~SignalOnTrack(track);
|
||||
_m[tile].m3 |= p2 & SignalOnTrack(track);
|
||||
// convert between signal<->semaphores when dragging
|
||||
if (semaphore)
|
||||
if (semaphore) {
|
||||
SETBIT(_m[tile].m4, 3);
|
||||
else
|
||||
} else {
|
||||
CLRBIT(_m[tile].m4, 3);
|
||||
}
|
||||
}
|
||||
|
||||
MarkTileDirtyByTile(tile);
|
||||
|
@ -859,8 +859,7 @@ static int32 CmdSignalTrackHelper(int x, int y, uint32 flags, uint32 p1, uint32
|
|||
if (p1 > MapSize()) return CMD_ERROR;
|
||||
if (signal_density == 0 || signal_density > 20) return CMD_ERROR;
|
||||
|
||||
if (!IsTileType(tile, MP_RAILWAY))
|
||||
return CMD_ERROR;
|
||||
if (!IsTileType(tile, MP_RAILWAY)) return CMD_ERROR;
|
||||
|
||||
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
|
||||
|
||||
|
@ -1290,8 +1289,7 @@ static void DrawTrackFence_NE_SW(const TileInfo *ti)
|
|||
static void DrawTrackFence_NS_1(const TileInfo *ti)
|
||||
{
|
||||
int z = ti->z;
|
||||
if (ti->tileh & 1)
|
||||
z += 8;
|
||||
if (ti->tileh & 1) z += 8;
|
||||
AddSortableSpriteToDraw(0x517 | _drawtile_track_palette,
|
||||
ti->x + 8, ti->y + 8, 1, 1, 4, z);
|
||||
}
|
||||
|
@ -1299,8 +1297,7 @@ static void DrawTrackFence_NS_1(const TileInfo *ti)
|
|||
static void DrawTrackFence_NS_2(const TileInfo *ti)
|
||||
{
|
||||
int z = ti->z;
|
||||
if (ti->tileh & 4)
|
||||
z += 8;
|
||||
if (ti->tileh & 4) z += 8;
|
||||
AddSortableSpriteToDraw(0x517 | _drawtile_track_palette,
|
||||
ti->x + 8, ti->y + 8, 1, 1, 4, z);
|
||||
}
|
||||
|
@ -1308,8 +1305,7 @@ static void DrawTrackFence_NS_2(const TileInfo *ti)
|
|||
static void DrawTrackFence_WE_1(const TileInfo *ti)
|
||||
{
|
||||
int z = ti->z;
|
||||
if (ti->tileh & 8)
|
||||
z += 8;
|
||||
if (ti->tileh & 8) z += 8;
|
||||
AddSortableSpriteToDraw(0x518 | _drawtile_track_palette,
|
||||
ti->x + 8, ti->y + 8, 1, 1, 4, z);
|
||||
}
|
||||
|
@ -1317,8 +1313,7 @@ static void DrawTrackFence_WE_1(const TileInfo *ti)
|
|||
static void DrawTrackFence_WE_2(const TileInfo *ti)
|
||||
{
|
||||
int z = ti->z;
|
||||
if (ti->tileh & 2)
|
||||
z += 8;
|
||||
if (ti->tileh & 2) z += 8;
|
||||
AddSortableSpriteToDraw(0x518 | _drawtile_track_palette,
|
||||
ti->x + 8, ti->y + 8, 1, 1, 4, z);
|
||||
}
|
||||
|
@ -1795,8 +1790,7 @@ static void SetSignalsAfterProc(TrackPathFinder *tpf)
|
|||
/* Go through all the PF tiles */
|
||||
for (i = 0; i < lengthof(tpf->hash_head); i++) {
|
||||
/* Empty hash item */
|
||||
if (tpf->hash_head[i] == 0)
|
||||
continue;
|
||||
if (tpf->hash_head[i] == 0) continue;
|
||||
|
||||
/* If 0x8000 is not set, there is only 1 item */
|
||||
if (!(tpf->hash_head[i] & 0x8000)) {
|
||||
|
@ -1917,8 +1911,7 @@ bool UpdateSignalsOnSegment(TileIndex tile, byte direction)
|
|||
if (result < 0) result = ssd.stop;
|
||||
|
||||
// if any exit signals were changed, we need to keep going to modify the stuff behind those.
|
||||
if(!ssd.cur_stack)
|
||||
break;
|
||||
if (ssd.cur_stack == 0) break;
|
||||
|
||||
// one or more exit signals were changed, so we need to update another segment too.
|
||||
tile = ssd.next_tile[--ssd.cur_stack];
|
||||
|
@ -2020,8 +2013,7 @@ static void TileLoop_Track(TileIndex tile)
|
|||
}
|
||||
|
||||
// Don't continue tile loop for depots
|
||||
if (_m[tile].m5 & RAIL_TYPE_SPECIAL)
|
||||
return;
|
||||
if (_m[tile].m5 & RAIL_TYPE_SPECIAL) return;
|
||||
|
||||
a2 = RAIL_GROUND_GREEN;
|
||||
|
||||
|
@ -2085,8 +2077,7 @@ static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode)
|
|||
uint16 b;
|
||||
uint32 ret;
|
||||
|
||||
if (mode != TRANSPORT_RAIL)
|
||||
return 0;
|
||||
if (mode != TRANSPORT_RAIL) return 0;
|
||||
|
||||
m5 = _m[tile].m5;
|
||||
|
||||
|
@ -2111,10 +2102,10 @@ static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode)
|
|||
if ((a & 0xC0) == 0) b |= 0xC0;
|
||||
if ((a & 0x30) == 0) b |= 0x30;
|
||||
|
||||
if ( (b & 0x80) == 0) ret |= 0x10070000;
|
||||
if ( (b & 0x40) == 0) ret |= 0x7100000;
|
||||
if ( (b & 0x20) == 0) ret |= 0x20080000;
|
||||
if ( (b & 0x10) == 0) ret |= 0x8200000;
|
||||
if ((b & 0x80) == 0) ret |= 0x10070000;
|
||||
if ((b & 0x40) == 0) ret |= 0x07100000;
|
||||
if ((b & 0x20) == 0) ret |= 0x20080000;
|
||||
if ((b & 0x10) == 0) ret |= 0x08200000;
|
||||
}
|
||||
} else if (m5 & 0x40) {
|
||||
static const byte _train_spec_tracks[6] = {1,2,1,2,1,2};
|
||||
|
@ -2193,8 +2184,7 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
|
|||
int length;
|
||||
|
||||
// this routine applies only to trains in depot tiles
|
||||
if (v->type != VEH_Train || !IsTileDepotType(tile, TRANSPORT_RAIL))
|
||||
return 0;
|
||||
if (v->type != VEH_Train || !IsTileDepotType(tile, TRANSPORT_RAIL)) return 0;
|
||||
|
||||
/* depot direction */
|
||||
dir = GetDepotDirection(tile, TRANSPORT_RAIL);
|
||||
|
|
105
rail_gui.c
105
rail_gui.c
|
@ -24,7 +24,7 @@
|
|||
static RailType _cur_railtype;
|
||||
static bool _remove_button_clicked;
|
||||
static byte _build_depot_direction;
|
||||
static byte _waypoint_count=1;
|
||||
static byte _waypoint_count = 1;
|
||||
static byte _cur_waypoint_type;
|
||||
|
||||
static struct {
|
||||
|
@ -40,8 +40,6 @@ static void ShowBuildTrainDepotPicker(void);
|
|||
static void ShowBuildWaypointPicker(void);
|
||||
static void ShowStationBuilder(void);
|
||||
|
||||
typedef void OnButtonClick(Window *w);
|
||||
|
||||
void CcPlaySound1E(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) SndPlayTileFx(SND_20_SPLAT_2, tile);
|
||||
|
@ -53,7 +51,7 @@ static void GenericPlaceRail(TileIndex tile, int cmd)
|
|||
_remove_button_clicked ?
|
||||
CMD_REMOVE_SINGLE_RAIL | CMD_MSG(STR_1012_CAN_T_REMOVE_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER :
|
||||
CMD_BUILD_SINGLE_RAIL | CMD_MSG(STR_1011_CAN_T_BUILD_RAILROAD_TRACK) | CMD_AUTO | CMD_NO_WATER
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
static void PlaceRail_N(TileIndex tile)
|
||||
|
@ -159,7 +157,7 @@ static void PlaceRail_Station(TileIndex tile)
|
|||
static void GenericPlaceSignals(TileIndex tile)
|
||||
{
|
||||
uint trackstat;
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
trackstat = (byte)GetTileTrackStatus(tile, TRANSPORT_RAIL);
|
||||
|
||||
|
@ -171,7 +169,9 @@ static void GenericPlaceSignals(TileIndex tile)
|
|||
|
||||
// Lookup the bit index
|
||||
i = 0;
|
||||
if (trackstat != 0) { while (!(trackstat & 1)) { i++; trackstat >>= 1; }}
|
||||
if (trackstat != 0) {
|
||||
for (; !(trackstat & 1); trackstat >>= 1) i++;
|
||||
}
|
||||
|
||||
if (!_remove_button_clicked) {
|
||||
DoCommandP(tile, i + (_ctrl_pressed ? 8 : 0), 0, CcPlaySound1E,
|
||||
|
@ -258,9 +258,10 @@ static void BuildRailClick_Depot(Window *w)
|
|||
static void BuildRailClick_Waypoint(Window *w)
|
||||
{
|
||||
_waypoint_count = GetNumCustomStations(STAT_CLASS_WAYP);
|
||||
if (HandlePlacePushButton(w, 11, SPR_CURSOR_WAYPOINT, 1, PlaceRail_Waypoint)
|
||||
&& _waypoint_count > 1)
|
||||
if (HandlePlacePushButton(w, 11, SPR_CURSOR_WAYPOINT, 1, PlaceRail_Waypoint) &&
|
||||
_waypoint_count > 1) {
|
||||
ShowBuildWaypointPicker();
|
||||
}
|
||||
}
|
||||
|
||||
static void BuildRailClick_Station(Window *w)
|
||||
|
@ -295,10 +296,11 @@ static void BuildRailClick_Remove(Window *w)
|
|||
|
||||
// handle station builder
|
||||
if (HASBIT(w->click_state, 16)) {
|
||||
if(_remove_button_clicked)
|
||||
if (_remove_button_clicked) {
|
||||
SetTileSelectSize(1, 1);
|
||||
else
|
||||
} else {
|
||||
BringWindowToFrontById(WC_BUILD_STATION, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -346,13 +348,20 @@ static void HandleAutoSignalPlacement(void)
|
|||
|
||||
// _patches.drag_signals_density is given as a parameter such that each user in a network
|
||||
// game can specify his/her own signal density
|
||||
DoCommandP(TileVirtXY(thd->selstart.x, thd->selstart.y), TileVirtXY(thd->selend.x, thd->selend.y),
|
||||
(_ctrl_pressed ? 1 << 3 : 0) | (trackstat << 4) | (_patches.drag_signals_density << 24),
|
||||
CcPlaySound1E,
|
||||
(_remove_button_clicked ? CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
|
||||
CMD_BUILD_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE) ) );
|
||||
DoCommandP(
|
||||
TileVirtXY(thd->selstart.x, thd->selstart.y),
|
||||
TileVirtXY(thd->selend.x, thd->selend.y),
|
||||
(_ctrl_pressed ? 1 << 3 : 0) | (trackstat << 4) | (_patches.drag_signals_density << 24),
|
||||
CcPlaySound1E,
|
||||
_remove_button_clicked ?
|
||||
CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
|
||||
CMD_BUILD_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
typedef void OnButtonClick(Window *w);
|
||||
|
||||
static OnButtonClick * const _build_railroad_button_proc[] = {
|
||||
BuildRailClick_N,
|
||||
BuildRailClick_NE,
|
||||
|
@ -390,11 +399,9 @@ static const uint16 _rail_keycodes[] = {
|
|||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static void BuildRailToolbWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
w->disabled_state &= ~(1 << 16);
|
||||
if (!(w->click_state & ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<11)|(1<<12)|(1<<13)))) {
|
||||
|
@ -412,9 +419,9 @@ static void BuildRailToolbWndProc(Window *w, WindowEvent *e)
|
|||
break;
|
||||
|
||||
case WE_KEYPRESS: {
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
for(i=0; i!=lengthof(_rail_keycodes); i++) {
|
||||
for (i = 0; i != lengthof(_rail_keycodes); i++) {
|
||||
if (e->keypress.keycode == _rail_keycodes[i]) {
|
||||
e->keypress.cont = false;
|
||||
_remove_button_clicked = false;
|
||||
|
@ -467,16 +474,16 @@ static void BuildRailToolbWndProc(Window *w, WindowEvent *e)
|
|||
SetWindowDirty(w);
|
||||
|
||||
w = FindWindowById(WC_BUILD_STATION, 0);
|
||||
if (w != NULL) WP(w,def_d).close=true;
|
||||
if (w != NULL) WP(w,def_d).close = true;
|
||||
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;
|
||||
|
||||
case WE_PLACE_PRESIZE: {
|
||||
TileIndex tile = e->place.tile;
|
||||
|
||||
DoCommandByTile(tile, 0, 0, DC_AUTO, CMD_BUILD_TUNNEL);
|
||||
VpSetPresizeRange(tile, _build_tunnel_endtile==0?tile:_build_tunnel_endtile);
|
||||
VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
|
||||
} break;
|
||||
|
||||
case WE_DESTROY:
|
||||
|
@ -541,7 +548,7 @@ typedef enum {
|
|||
* @param railtype the railtype to display
|
||||
* @param w the window to modify
|
||||
*/
|
||||
static void SetupRailToolbar(RailType railtype, Window *w)
|
||||
static void SetupRailToolbar(RailType railtype, Window* w)
|
||||
{
|
||||
const RailtypeInfo *rti = GetRailTypeInfo(railtype);
|
||||
|
||||
|
@ -703,17 +710,16 @@ static void StationBuildWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
} break;
|
||||
|
||||
case WE_MOUSELOOP: {
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close) {
|
||||
DeleteWindow(w);
|
||||
return;
|
||||
}
|
||||
CheckRedrawStationCoverage(w);
|
||||
} break;
|
||||
break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -772,28 +778,30 @@ static void BuildTrainDepotWndProc(Window *w, WindowEvent *e)
|
|||
r = _cur_railtype;
|
||||
DrawTrainDepotSprite(70, 17, 0, r);
|
||||
DrawTrainDepotSprite(70, 69, 1, r);
|
||||
DrawTrainDepotSprite(2, 69, 2, r);
|
||||
DrawTrainDepotSprite(2, 17, 3, r);
|
||||
DrawTrainDepotSprite( 2, 69, 2, r);
|
||||
DrawTrainDepotSprite( 2, 17, 3, r);
|
||||
break;
|
||||
}
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
case 3: case 4: case 5: case 6:
|
||||
_build_depot_direction = e->click.widget - 3;
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
SetWindowDirty(w);
|
||||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch (e->click.widget) {
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
_build_depot_direction = e->click.widget - 3;
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
SetWindowDirty(w);
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close)
|
||||
DeleteWindow(w);
|
||||
if (WP(w,def_d).close) DeleteWindow(w);
|
||||
return;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -827,15 +835,16 @@ static void BuildWaypointWndProc(Window *w, WindowEvent *e)
|
|||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
w->click_state = (1 << 3) << (_cur_waypoint_type - w->hscroll.pos);
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (w->hscroll.pos + i < _waypoint_count)
|
||||
if (w->hscroll.pos + i < _waypoint_count) {
|
||||
DrawWaypointSprite(2 + i * 68, 25, w->hscroll.pos + i, _cur_railtype);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case WE_CLICK: {
|
||||
|
@ -850,13 +859,11 @@ static void BuildWaypointWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close)
|
||||
DeleteWindow(w);
|
||||
if (WP(w,def_d).close) DeleteWindow(w);
|
||||
break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
39
road_cmd.c
39
road_cmd.c
|
@ -377,7 +377,7 @@ int32 CmdBuildRoad(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (ti.type == MP_STREET) {
|
||||
if (!(ti.map5 & 0xF0)) {
|
||||
if ( (pieces & (byte)(ti.map5)) == (pieces))
|
||||
if ((pieces & (byte)ti.map5) == pieces)
|
||||
return_cmd_error(STR_1007_ALREADY_BUILT);
|
||||
existing = ti.map5;
|
||||
} else {
|
||||
|
@ -680,12 +680,9 @@ static int32 RemoveRoadDepot(TileIndex tile, uint32 flags)
|
|||
if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER)
|
||||
return CMD_ERROR;
|
||||
|
||||
if (!EnsureNoVehicle(tile))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(tile)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
DoDeleteDepot(tile);
|
||||
}
|
||||
if (flags & DC_EXEC) DoDeleteDepot(tile);
|
||||
|
||||
return _price.remove_road_depot;
|
||||
}
|
||||
|
@ -790,21 +787,16 @@ void DrawRoadBits(TileInfo *ti, byte road, byte ground_type, bool snow, bool fla
|
|||
foundation = GetRoadFoundation(ti->tileh, road);
|
||||
}
|
||||
|
||||
if (foundation != 0)
|
||||
DrawFoundation(ti, foundation);
|
||||
if (foundation != 0) DrawFoundation(ti, foundation);
|
||||
|
||||
// DrawFoundation() modifies ti.
|
||||
// Default sloped sprites..
|
||||
if (ti->tileh != 0) {
|
||||
image = _road_sloped_sprites[ti->tileh - 1] + 0x53F;
|
||||
}
|
||||
if (ti->tileh != 0) image = _road_sloped_sprites[ti->tileh - 1] + 0x53F;
|
||||
}
|
||||
|
||||
if (image == 0)
|
||||
image = _road_tile_sprites_1[road];
|
||||
if (image == 0) image = _road_tile_sprites_1[road];
|
||||
|
||||
if (ground_type == 0)
|
||||
image |= PALETTE_TO_BARE_LAND;
|
||||
if (ground_type == 0) image |= PALETTE_TO_BARE_LAND;
|
||||
|
||||
if (snow) {
|
||||
image += 19;
|
||||
|
@ -816,8 +808,7 @@ void DrawRoadBits(TileInfo *ti, byte road, byte ground_type, bool snow, bool fla
|
|||
DrawGroundSprite(image);
|
||||
|
||||
// Return if full detail is disabled, or we are zoomed fully out.
|
||||
if (!(_display_opt & DO_FULL_DETAIL) || _cur_dpi->zoom == 2)
|
||||
return;
|
||||
if (!(_display_opt & DO_FULL_DETAIL) || _cur_dpi->zoom == 2) return;
|
||||
|
||||
if (ground_type >= 6) {
|
||||
// Road works
|
||||
|
@ -831,8 +822,7 @@ void DrawRoadBits(TileInfo *ti, byte road, byte ground_type, bool snow, bool fla
|
|||
int x = ti->x | drts->subcoord_x;
|
||||
int y = ti->y | drts->subcoord_y;
|
||||
byte z = ti->z;
|
||||
if (ti->tileh != 0)
|
||||
z = GetSlopeZ(x, y);
|
||||
if (ti->tileh != 0) z = GetSlopeZ(x, y);
|
||||
AddSortableSpriteToDraw(image, x, y, 2, 2, 0x10, z);
|
||||
drts++;
|
||||
}
|
||||
|
@ -915,8 +905,8 @@ void DrawRoadDepotSprite(int x, int y, int image)
|
|||
|
||||
dtss = _road_display_datas[image];
|
||||
|
||||
x+=33;
|
||||
y+=17;
|
||||
x += 33;
|
||||
y += 17;
|
||||
|
||||
DrawSprite(dtss++->image, x, y);
|
||||
|
||||
|
@ -924,8 +914,7 @@ void DrawRoadDepotSprite(int x, int y, int image)
|
|||
Point pt = RemapCoords(dtss->subcoord_x, dtss->subcoord_y, 0);
|
||||
|
||||
image = dtss->image;
|
||||
if (image & PALETTE_MODIFIER_COLOR)
|
||||
image |= ormod;
|
||||
if (image & PALETTE_MODIFIER_COLOR) image |= ormod;
|
||||
|
||||
DrawSprite(image, x + pt.x, y + pt.y);
|
||||
}
|
||||
|
@ -986,9 +975,7 @@ static void GetAcceptedCargo_Road(TileIndex tile, AcceptedCargo ac)
|
|||
|
||||
static void AnimateTile_Road(TileIndex tile)
|
||||
{
|
||||
if (IsLevelCrossing(tile)) {
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
if (IsLevelCrossing(tile)) MarkTileDirtyByTile(tile);
|
||||
}
|
||||
|
||||
static const byte _town_road_types[5][2] = {
|
||||
|
|
34
road_gui.c
34
road_gui.c
|
@ -171,7 +171,7 @@ static void BuildRoadClick_Landscaping(Window *w)
|
|||
ShowTerraformToolbar();
|
||||
}
|
||||
|
||||
static OnButtonClick * const _build_road_button_proc[] = {
|
||||
static OnButtonClick* const _build_road_button_proc[] = {
|
||||
BuildRoadClick_NE,
|
||||
BuildRoadClick_NW,
|
||||
BuildRoadClick_Demolish,
|
||||
|
@ -184,8 +184,9 @@ static OnButtonClick * const _build_road_button_proc[] = {
|
|||
BuildRoadClick_Landscaping,
|
||||
};
|
||||
|
||||
static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) {
|
||||
switch(e->event) {
|
||||
static void BuildRoadToolbWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
w->disabled_state &= ~(1 << 11);
|
||||
if (!(w->click_state & ((1<<3)|(1<<4)))) {
|
||||
|
@ -196,8 +197,7 @@ static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) {
|
|||
break;
|
||||
|
||||
case WE_CLICK: {
|
||||
if (e->click.widget >= 3)
|
||||
_build_road_button_proc[e->click.widget - 3](w);
|
||||
if (e->click.widget >= 3) _build_road_button_proc[e->click.widget - 3](w);
|
||||
} break;
|
||||
|
||||
case WE_KEYPRESS:
|
||||
|
@ -228,11 +228,11 @@ static void BuildRoadToolbWndProc(Window *w, WindowEvent *e) {
|
|||
SetWindowDirty(w);
|
||||
|
||||
w = FindWindowById(WC_BUS_STATION, 0);
|
||||
if (w != NULL) WP(w,def_d).close=true;
|
||||
if (w != NULL) WP(w,def_d).close = true;
|
||||
w = FindWindowById(WC_TRUCK_STATION, 0);
|
||||
if (w != NULL) WP(w,def_d).close=true;
|
||||
if (w != NULL) WP(w,def_d).close = true;
|
||||
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;
|
||||
|
||||
case WE_PLACE_DRAG: {
|
||||
|
@ -351,16 +351,17 @@ void ShowBuildRoadScenToolbar(void)
|
|||
AllocateWindowDescFront(&_build_road_scen_desc, 0);
|
||||
}
|
||||
|
||||
static void BuildRoadDepotWndProc(Window *w, WindowEvent *e) {
|
||||
switch(e->event) {
|
||||
static void BuildRoadDepotWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
w->click_state = (1<<3) << _road_depot_orientation;
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
DrawRoadDepotSprite(70, 17, 0);
|
||||
DrawRoadDepotSprite(70, 69, 1);
|
||||
DrawRoadDepotSprite(2, 69, 2);
|
||||
DrawRoadDepotSprite(2, 17, 3);
|
||||
DrawRoadDepotSprite( 2, 69, 2);
|
||||
DrawRoadDepotSprite( 2, 17, 3);
|
||||
break;
|
||||
|
||||
case WE_CLICK: {
|
||||
|
@ -374,13 +375,11 @@ static void BuildRoadDepotWndProc(Window *w, WindowEvent *e) {
|
|||
} break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (WP(w,def_d).close)
|
||||
DeleteWindow(w);
|
||||
if (WP(w,def_d).close) DeleteWindow(w);
|
||||
break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -466,8 +465,7 @@ static void RoadStationPickerWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case WE_DESTROY:
|
||||
if (!WP(w,def_d).close)
|
||||
ResetObjectToPlace();
|
||||
if (!WP(w,def_d).close) ResetObjectToPlace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,12 +65,11 @@ static void DrawRoadVehImage(const Vehicle *v, int x, int y, VehicleID selection
|
|||
{
|
||||
int image = GetRoadVehImage(v, 6);
|
||||
uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
|
||||
if (v->vehstatus & VS_CRASHED)
|
||||
ormod = PALETTE_CRASH;
|
||||
DrawSprite(image | ormod, x+14, y+6);
|
||||
if (v->vehstatus & VS_CRASHED) ormod = PALETTE_CRASH;
|
||||
DrawSprite(image | ormod, x + 14, y + 6);
|
||||
|
||||
if (v->index == selection) {
|
||||
DrawFrameRect(x-1, y-1, x+28, y+12, 15, FR_BORDERONLY);
|
||||
DrawFrameRect(x - 1, y - 1, x + 28, y + 12, 15, FR_BORDERONLY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -215,6 +214,7 @@ static void ShowRoadVehDetailsWindow(const Vehicle* v)
|
|||
{
|
||||
Window *w;
|
||||
VehicleID veh = v->index;
|
||||
|
||||
DeleteWindowById(WC_VEHICLE_ORDERS, veh);
|
||||
DeleteWindowById(WC_VEHICLE_DETAILS, veh);
|
||||
_alloc_wnd_parent_num = veh;
|
||||
|
@ -225,11 +225,7 @@ static void ShowRoadVehDetailsWindow(const Vehicle* v)
|
|||
|
||||
void CcCloneRoadVeh(bool success, uint tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) {
|
||||
const Vehicle* v = GetVehicle(_new_roadveh_id);
|
||||
|
||||
ShowRoadVehViewWindow(v);
|
||||
}
|
||||
if (success) ShowRoadVehViewWindow(GetVehicle(_new_roadveh_id));
|
||||
}
|
||||
|
||||
static void RoadVehViewWndProc(Window *w, WindowEvent *e)
|
||||
|
@ -445,7 +441,7 @@ void CcBuildRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
|
||||
static void NewRoadVehWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawNewRoadVehWindow(w);
|
||||
break;
|
||||
|
@ -1073,7 +1069,7 @@ void ShowPlayerRoadVehicles(PlayerID player, StationID station)
|
|||
} else {
|
||||
w = AllocateWindowDescFront(&_other_player_roadveh_desc, (station << 16) | player);
|
||||
}
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->caption_color = player;
|
||||
w->vscroll.cap = 7; // maximum number of vehicles shown
|
||||
w->widget[7].unkA = (w->vscroll.cap << 8) + 1;
|
||||
|
|
|
@ -63,16 +63,20 @@ static StringID *BuildDynamicDropdown(StringID base, int num)
|
|||
static int GetCurRes(void)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i != _num_resolutions; i++)
|
||||
|
||||
for (i = 0; i != _num_resolutions; i++) {
|
||||
if (_resolutions[i][0] == _screen.width &&
|
||||
_resolutions[i][1] == _screen.height)
|
||||
_resolutions[i][1] == _screen.height) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline bool RoadVehiclesAreBuilt(void)
|
||||
{
|
||||
const Vehicle *v;
|
||||
const Vehicle* v;
|
||||
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_Road) return true;
|
||||
}
|
||||
|
@ -551,30 +555,23 @@ void ShowGameDifficulty(void)
|
|||
// virtual PositionMainToolbar function, calls the right one.
|
||||
static int32 v_PositionMainToolbar(int32 p1)
|
||||
{
|
||||
if (_game_mode != GM_MENU)
|
||||
PositionMainToolbar(NULL);
|
||||
|
||||
if (_game_mode != GM_MENU) PositionMainToolbar(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32 AiNew_PatchActive_Warning(int32 p1)
|
||||
{
|
||||
if (p1 == 1)
|
||||
ShowErrorMessage(-1, TEMP_AI_ACTIVATED, 0, 0);
|
||||
|
||||
return 0;
|
||||
if (p1 == 1) ShowErrorMessage(-1, TEMP_AI_ACTIVATED, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32 PopulationInLabelActive(int32 p1)
|
||||
{
|
||||
Town *t;
|
||||
Town* t;
|
||||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy) {
|
||||
UpdateTownVirtCoord(t);
|
||||
}
|
||||
if (t->xy != 0) UpdateTownVirtCoord(t);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -639,14 +636,14 @@ static int32 EngineRenewMoneyUpdate(int32 p1)
|
|||
typedef int32 PatchButtonClick(int32);
|
||||
|
||||
typedef struct PatchEntry {
|
||||
byte type; // type of selector
|
||||
byte flags; // selector flags
|
||||
StringID str; // string with descriptive text
|
||||
char console_name[40]; // the name this patch has in console
|
||||
void *variable; // pointer to the variable
|
||||
int32 min, max; // range for spinbox setting
|
||||
uint32 step; // step for spinbox
|
||||
PatchButtonClick *click_proc; // callback procedure
|
||||
byte type; // type of selector
|
||||
byte flags; // selector flags
|
||||
StringID str; // string with descriptive text
|
||||
char console_name[40]; // the name this patch has in console
|
||||
void* variable; // pointer to the variable
|
||||
int32 min, max; // range for spinbox setting
|
||||
uint32 step; // step for spinbox
|
||||
PatchButtonClick* click_proc; // callback procedure
|
||||
} PatchEntry;
|
||||
|
||||
enum {
|
||||
|
@ -821,7 +818,6 @@ static void WritePE(const PatchEntry* p, int32 v)
|
|||
|
||||
static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
uint i;
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
int x,y;
|
||||
|
@ -829,6 +825,7 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
|
|||
const PatchPage *page;
|
||||
uint clk;
|
||||
int32 val;
|
||||
uint i;
|
||||
|
||||
w->click_state = 1 << (WP(w,def_d).data_1 + 4);
|
||||
|
||||
|
@ -1116,8 +1113,9 @@ void IConsoleGetPatchSetting(const char *name)
|
|||
|
||||
if (pe->type == PE_BOOL) {
|
||||
snprintf(value, sizeof(value), (ReadPE(pe) == 1) ? "on" : "off");
|
||||
} else
|
||||
} else {
|
||||
snprintf(value, sizeof(value), "%d", ReadPE(pe));
|
||||
}
|
||||
|
||||
IConsolePrintF(_icolour_warn, "Current value for '%s' is: '%s'", name, value);
|
||||
}
|
||||
|
@ -1175,9 +1173,9 @@ static void NewgrfWndProc(Window *w, WindowEvent *e)
|
|||
// draw list of all grf files
|
||||
while (c != NULL) {
|
||||
if (i >= w->vscroll.pos) { // draw files according to scrollbar position
|
||||
bool h = (_sel_grffile==c);
|
||||
bool h = (_sel_grffile == c);
|
||||
// show highlighted item with a different background and highlighted text
|
||||
if(h) GfxFillRect(1, y + 1, 267, y + 12, 156);
|
||||
if (h) GfxFillRect(1, y + 1, 267, y + 12, 156);
|
||||
// XXX - will be grf name later
|
||||
DoDrawString(c->filename, 25, y + 2, h ? 0xC : 0x10);
|
||||
DrawSprite(SPRITE_PALETTE(SPR_SQUARE | PALETTE_TO_RED), 5, y + 2);
|
||||
|
@ -1448,23 +1446,27 @@ static void CustCurrencyWndProc(Window *w, WindowEvent *e)
|
|||
val = atoi(b);
|
||||
val = clamp(val, 1, 5000);
|
||||
_custom_currency.rate = val;
|
||||
break;
|
||||
break;
|
||||
|
||||
case 1: /* Thousands seperator */
|
||||
_custom_currency.separator = (b[0] == '\0') ? ' ' : b[0];
|
||||
ttd_strlcpy(_str_separator, b, lengthof(_str_separator));
|
||||
break;
|
||||
break;
|
||||
|
||||
case 2: /* Currency prefix */
|
||||
ttd_strlcpy(_custom_currency.prefix, b, lengthof(_custom_currency.prefix));
|
||||
break;
|
||||
break;
|
||||
|
||||
case 3: /* Currency suffix */
|
||||
ttd_strlcpy(_custom_currency.suffix, b, lengthof(_custom_currency.suffix));
|
||||
break;
|
||||
break;
|
||||
|
||||
case 4: /* Year to switch to euro */
|
||||
val = atoi(b);
|
||||
val = clamp(val, 1999, MAX_YEAR_END_REAL);
|
||||
if (val == 1999) val = 0;
|
||||
_custom_currency.to_euro = val;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
MarkWholeScreenDirty();
|
||||
|
||||
|
@ -1500,11 +1502,9 @@ static const WindowDesc _cust_currency_desc = {
|
|||
|
||||
void ShowCustCurrency(void)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
_str_separator[0] = _custom_currency.separator;
|
||||
_str_separator[1] = '\0';
|
||||
|
||||
DeleteWindowById(WC_CUSTOM_CURRENCY, 0);
|
||||
w = AllocateWindowDesc(&_cust_currency_desc);
|
||||
AllocateWindowDesc(&_cust_currency_desc);
|
||||
}
|
||||
|
|
80
ship_cmd.c
80
ship_cmd.c
|
@ -35,7 +35,7 @@ void DrawShipEngine(int x, int y, EngineID engine, uint32 image_ormod)
|
|||
if (is_custom_sprite(spritenum)) {
|
||||
int sprite = GetCustomVehicleIcon(engine, 6);
|
||||
|
||||
if (sprite) {
|
||||
if (sprite != 0) {
|
||||
DrawSprite(sprite | image_ormod, x, y);
|
||||
return;
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ int GetShipImage(const Vehicle *v, byte direction)
|
|||
if (is_custom_sprite(spritenum)) {
|
||||
int sprite = GetCustomVehicleSprite(v, direction);
|
||||
|
||||
if (sprite) return sprite;
|
||||
if (sprite != 0) return sprite;
|
||||
spritenum = orig_ship_vehicle_info[v->engine_type - SHIP_ENGINES_INDEX].image_index;
|
||||
}
|
||||
return _ship_sprites[spritenum] + direction;
|
||||
|
@ -70,10 +70,11 @@ static const Depot* FindClosestShipDepot(const Vehicle* v)
|
|||
NPFFoundTargetData ftd;
|
||||
byte trackdir = GetVehicleTrackdir(v);
|
||||
ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE);
|
||||
if (ftd.best_bird_dist == 0)
|
||||
if (ftd.best_bird_dist == 0) {
|
||||
best_depot = GetDepotByTile(ftd.node.tile); /* Found target */
|
||||
else
|
||||
} else {
|
||||
best_depot = NULL; /* Did not find target */
|
||||
}
|
||||
} else {
|
||||
FOR_ALL_DEPOTS(depot) {
|
||||
tile = depot->xy;
|
||||
|
@ -93,21 +94,15 @@ static void CheckIfShipNeedsService(Vehicle *v)
|
|||
{
|
||||
const Depot* depot;
|
||||
|
||||
if (_patches.servint_ships == 0)
|
||||
return;
|
||||
|
||||
if (!VehicleNeedsService(v))
|
||||
return;
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
if (_patches.servint_ships == 0) return;
|
||||
if (!VehicleNeedsService(v)) return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
if (v->current_order.type == OT_GOTO_DEPOT &&
|
||||
v->current_order.flags & OF_HALT_IN_DEPOT)
|
||||
return;
|
||||
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v))
|
||||
return;
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v)) return;
|
||||
|
||||
depot = FindClosestShipDepot(v);
|
||||
|
||||
|
@ -140,10 +135,7 @@ void OnNewDay_Ship(Vehicle *v)
|
|||
|
||||
CheckOrders(v->index, OC_INIT);
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
|
||||
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
cost = ShipVehInfo(v->engine_type)->running_cost * _price.ship_running / 364;
|
||||
v->profit_this_year -= cost >> 8;
|
||||
|
@ -173,8 +165,7 @@ static void HandleBrokenShip(Vehicle *v)
|
|||
|
||||
if (!(v->vehstatus & VS_HIDDEN)) {
|
||||
Vehicle *u = CreateEffectVehicleRel(v, 4, 4, 5, EV_BREAKDOWN_SMOKE);
|
||||
if (u)
|
||||
u->u.special.unk0 = v->breakdown_delay * 2;
|
||||
if (u != NULL) u->u.special.unk0 = v->breakdown_delay * 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -268,15 +259,11 @@ static void ProcessShipOrder(Vehicle *v)
|
|||
|
||||
static void HandleShipLoading(Vehicle *v)
|
||||
{
|
||||
if (v->current_order.type == OT_NOTHING)
|
||||
return;
|
||||
if (v->current_order.type == OT_NOTHING) return;
|
||||
|
||||
if (v->current_order.type != OT_DUMMY) {
|
||||
if (v->current_order.type != OT_LOADING)
|
||||
return;
|
||||
|
||||
if (--v->load_unload_time_rem)
|
||||
return;
|
||||
if (v->current_order.type != OT_LOADING) return;
|
||||
if (--v->load_unload_time_rem) return;
|
||||
|
||||
if (v->current_order.flags & OF_FULL_LOAD && CanFillVehicle(v)) {
|
||||
SET_EXPENSES_TYPE(EXPENSES_SHIP_INC);
|
||||
|
@ -292,8 +279,7 @@ static void HandleShipLoading(Vehicle *v)
|
|||
Order b = v->current_order;
|
||||
v->current_order.type = OT_LEAVESTATION;
|
||||
v->current_order.flags = 0;
|
||||
if (!(b.flags & OF_NON_STOP))
|
||||
return;
|
||||
if (!(b.flags & OF_NON_STOP)) return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -341,8 +327,7 @@ static void CheckShipLeaveDepot(Vehicle *v)
|
|||
int d;
|
||||
uint m;
|
||||
|
||||
if (v->u.ship.state != 0x80)
|
||||
return;
|
||||
if (v->u.ship.state != 0x80) return;
|
||||
|
||||
tile = v->tile;
|
||||
d = (_m[tile].m5&2) ? 1 : 0;
|
||||
|
@ -383,15 +368,10 @@ static bool ShipAccelerate(Vehicle *v)
|
|||
}
|
||||
|
||||
// Decrease somewhat when turning
|
||||
if (!(v->direction&1)) {
|
||||
spd = spd * 3 >> 2;
|
||||
}
|
||||
if (!(v->direction & 1)) spd = spd * 3 / 4;
|
||||
|
||||
if (spd == 0)
|
||||
return false;
|
||||
|
||||
if ((byte)++spd == 0)
|
||||
return true;
|
||||
if (spd == 0) return false;
|
||||
if ((byte)++spd == 0) return true;
|
||||
|
||||
v->progress = (t = v->progress) - (byte)spd;
|
||||
|
||||
|
@ -447,7 +427,9 @@ static void ShipArrivesAt(const Vehicle* v, Station* st)
|
|||
/* Check if station was ever visited before */
|
||||
if (!(st->had_vehicle_of_type & HVOT_SHIP)) {
|
||||
uint32 flags;
|
||||
|
||||
st->had_vehicle_of_type |= HVOT_SHIP;
|
||||
|
||||
SetDParam(0, st->index);
|
||||
flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
|
||||
AddNewsItem(
|
||||
|
@ -564,14 +546,15 @@ static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks
|
|||
|
||||
ftd = NPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE, PBS_MODE_NONE);
|
||||
|
||||
if (ftd.best_trackdir != 0xff)
|
||||
if (ftd.best_trackdir != 0xff) {
|
||||
/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
|
||||
the direction we need to take to get there, if ftd.best_bird_dist is not 0,
|
||||
we did not find our target, but ftd.best_trackdir contains the direction leading
|
||||
to the tile closest to our target. */
|
||||
return ftd.best_trackdir & 7; /* TODO: Wrapper function? */
|
||||
else
|
||||
} else {
|
||||
return -1; /* Already at target, reverse? */
|
||||
}
|
||||
} else {
|
||||
uint b;
|
||||
uint tot_dist, dist;
|
||||
|
@ -676,19 +659,16 @@ static void ShipController(Vehicle *v)
|
|||
v->breakdown_ctr--;
|
||||
}
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
|
||||
ProcessShipOrder(v);
|
||||
HandleShipLoading(v);
|
||||
|
||||
if (v->current_order.type == OT_LOADING)
|
||||
return;
|
||||
if (v->current_order.type == OT_LOADING) return;
|
||||
|
||||
CheckShipLeaveDepot(v);
|
||||
|
||||
if (!ShipAccelerate(v))
|
||||
return;
|
||||
if (!ShipAccelerate(v)) return;
|
||||
|
||||
BeginVehicleMove(v);
|
||||
|
||||
|
@ -811,10 +791,8 @@ reverse_direction:
|
|||
|
||||
static void AgeShipCargo(Vehicle *v)
|
||||
{
|
||||
if (_age_cargo_skip_counter != 0)
|
||||
return;
|
||||
if (v->cargo_days != 255)
|
||||
v->cargo_days++;
|
||||
if (_age_cargo_skip_counter != 0) return;
|
||||
if (v->cargo_days != 255) v->cargo_days++;
|
||||
}
|
||||
|
||||
void Ship_Tick(Vehicle *v)
|
||||
|
|
50
ship_gui.c
50
ship_gui.c
|
@ -66,10 +66,10 @@ static void DrawShipImage(const Vehicle *v, int x, int y, VehicleID selection)
|
|||
{
|
||||
int image = GetShipImage(v, 6);
|
||||
uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
|
||||
DrawSprite(image | ormod, x+32, y+10);
|
||||
DrawSprite(image | ormod, x + 32, y + 10);
|
||||
|
||||
if (v->index == selection) {
|
||||
DrawFrameRect(x-5, y-1, x+67, y+21, 15, FR_BORDERONLY);
|
||||
DrawFrameRect(x - 5, y - 1, x + 67, y + 21, 15, FR_BORDERONLY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ static void ShipRefitWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 2: { /* listbox */
|
||||
int y = e->click.pt.y - 25;
|
||||
if (y >= 0) {
|
||||
|
@ -291,6 +291,7 @@ static void ShowShipDetailsWindow(const Vehicle* v)
|
|||
{
|
||||
Window *w;
|
||||
VehicleID veh = v->index;
|
||||
|
||||
DeleteWindowById(WC_VEHICLE_ORDERS, veh);
|
||||
DeleteWindowById(WC_VEHICLE_DETAILS, veh);
|
||||
_alloc_wnd_parent_num = veh;
|
||||
|
@ -314,19 +315,14 @@ void CcBuildShip(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
|
||||
void CcCloneShip(bool success, uint tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) {
|
||||
const Vehicle* v = GetVehicle(_new_ship_id);
|
||||
|
||||
ShowShipViewWindow(v);
|
||||
}
|
||||
if (success) ShowShipViewWindow(GetVehicle(_new_ship_id));
|
||||
}
|
||||
|
||||
static void NewShipWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
if (w->window_number == 0)
|
||||
w->disabled_state = 1 << 5;
|
||||
if (w->window_number == 0) w->disabled_state = 1 << 5;
|
||||
|
||||
// Setup scroll count
|
||||
{
|
||||
|
@ -335,8 +331,7 @@ static void NewShipWndProc(Window *w, WindowEvent *e)
|
|||
const Engine* e = GetEngine(SHIP_ENGINES_INDEX);
|
||||
|
||||
do {
|
||||
if (HASBIT(e->player_avail, _local_player))
|
||||
count++;
|
||||
if (HASBIT(e->player_avail, _local_player)) count++;
|
||||
} while (++e,--num);
|
||||
SetVScrollCount(w, count);
|
||||
}
|
||||
|
@ -760,8 +755,9 @@ static void ClonePlaceObj(TileIndex tile, const Window* w)
|
|||
if (v != NULL) HandleCloneVehClick(v, w);
|
||||
}
|
||||
|
||||
static void ShipDepotWndProc(Window *w, WindowEvent *e) {
|
||||
switch(e->event) {
|
||||
static void ShipDepotWndProc(Window* w, WindowEvent* e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawShipDepotWindow(w);
|
||||
break;
|
||||
|
@ -896,10 +892,9 @@ static const WindowDesc _ship_depot_desc = {
|
|||
|
||||
void ShowShipDepotWindow(TileIndex tile)
|
||||
{
|
||||
Window *w;
|
||||
Window* w = AllocateWindowDescFront(&_ship_depot_desc,tile);
|
||||
|
||||
w = AllocateWindowDescFront(&_ship_depot_desc,tile);
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->caption_color = GetTileOwner(w->window_number);
|
||||
w->vscroll.cap = 2;
|
||||
w->hscroll.cap = 3;
|
||||
|
@ -911,7 +906,8 @@ void ShowShipDepotWindow(TileIndex tile)
|
|||
}
|
||||
|
||||
|
||||
static void DrawSmallOrderList(const Vehicle *v, int x, int y) {
|
||||
static void DrawSmallOrderList(const Vehicle* v, int x, int y)
|
||||
{
|
||||
const Order *order;
|
||||
int sel, i = 0;
|
||||
|
||||
|
@ -920,7 +916,7 @@ static void DrawSmallOrderList(const Vehicle *v, int x, int y) {
|
|||
FOR_VEHICLE_ORDERS(v, order) {
|
||||
if (sel == 0) {
|
||||
_stringwidth_base = 0xE0;
|
||||
DoDrawString( "\xAF", x-6, y, 16);
|
||||
DoDrawString("\xAF", x - 6, y, 16);
|
||||
_stringwidth_base = 0;
|
||||
}
|
||||
sel--;
|
||||
|
@ -931,8 +927,7 @@ static void DrawSmallOrderList(const Vehicle *v, int x, int y) {
|
|||
DrawString(x, y, STR_A036, 0);
|
||||
|
||||
y += 6;
|
||||
if (++i == 4)
|
||||
break;
|
||||
if (++i == 4) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1081,9 +1076,7 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
|
|||
case 9: { /* Build new Vehicle */
|
||||
TileIndex tile;
|
||||
|
||||
if (!IsWindowOfPrototype(w, _player_ships_widgets))
|
||||
break;
|
||||
|
||||
if (!IsWindowOfPrototype(w, _player_ships_widgets)) break;
|
||||
|
||||
tile = _last_built_ship_depot_tile;
|
||||
do {
|
||||
|
@ -1100,8 +1093,7 @@ static void PlayerShipsWndProc(Window *w, WindowEvent *e)
|
|||
} break;
|
||||
|
||||
case 10: {
|
||||
if (!IsWindowOfPrototype(w, _player_ships_widgets))
|
||||
break;
|
||||
if (!IsWindowOfPrototype(w, _player_ships_widgets)) break;
|
||||
|
||||
ShowReplaceVehicleWindow(VEH_Ship);
|
||||
break;
|
||||
|
@ -1173,12 +1165,12 @@ void ShowPlayerShips(PlayerID player, StationID station)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
if ( player == _local_player) {
|
||||
if (player == _local_player) {
|
||||
w = AllocateWindowDescFront(&_player_ships_desc, (station << 16) | player);
|
||||
} else {
|
||||
w = AllocateWindowDescFront(&_other_player_ships_desc, (station << 16) | player);
|
||||
}
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->caption_color = w->window_number;
|
||||
w->vscroll.cap = 4;
|
||||
w->widget[7].unkA = (w->vscroll.cap << 8) + 1;
|
||||
|
|
239
station_cmd.c
239
station_cmd.c
|
@ -44,8 +44,7 @@ static void StationPoolNewBlock(uint start_item)
|
|||
{
|
||||
Station *st;
|
||||
|
||||
FOR_ALL_STATIONS_FROM(st, start_item)
|
||||
st->index = start_item++;
|
||||
FOR_ALL_STATIONS_FROM(st, start_item) st->index = start_item++;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,8 +54,7 @@ static void RoadStopPoolNewBlock(uint start_item)
|
|||
{
|
||||
RoadStop *rs;
|
||||
|
||||
FOR_ALL_ROADSTOPS_FROM(rs, start_item)
|
||||
rs->index = start_item++;
|
||||
FOR_ALL_ROADSTOPS_FROM(rs, start_item) rs->index = start_item++;
|
||||
}
|
||||
|
||||
/* Initialize the station-pool and roadstop-pool */
|
||||
|
@ -96,7 +94,7 @@ static void InitializeRoadStop(RoadStop *road_stop, RoadStop *previous, TileInde
|
|||
road_stop->station = index;
|
||||
}
|
||||
|
||||
RoadStop * GetPrimaryRoadStop(const Station *st, RoadStopType type)
|
||||
RoadStop* GetPrimaryRoadStop(const Station* st, RoadStopType type)
|
||||
{
|
||||
switch (type) {
|
||||
case RS_BUS: return st->bus_stops;
|
||||
|
@ -107,13 +105,14 @@ RoadStop * GetPrimaryRoadStop(const Station *st, RoadStopType type)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
RoadStop * GetRoadStopByTile(TileIndex tile, RoadStopType type)
|
||||
RoadStop* GetRoadStopByTile(TileIndex tile, RoadStopType type)
|
||||
{
|
||||
const Station *st = GetStation(_m[tile].m2);
|
||||
RoadStop *rs;
|
||||
const Station* st = GetStation(_m[tile].m2);
|
||||
RoadStop* rs;
|
||||
|
||||
for ( rs = GetPrimaryRoadStop(st, type); rs->xy != tile; rs = rs->next)
|
||||
for (rs = GetPrimaryRoadStop(st, type); rs->xy != tile; rs = rs->next) {
|
||||
assert(rs->next != NULL);
|
||||
}
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
@ -145,8 +144,7 @@ RoadStop *AllocateRoadStop(void)
|
|||
}
|
||||
|
||||
/* Check if we can add a block to the pool */
|
||||
if (AddBlockToPool(&_roadstop_pool))
|
||||
return AllocateRoadStop();
|
||||
if (AddBlockToPool(&_roadstop_pool)) return AllocateRoadStop();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -266,8 +264,7 @@ static Station *AllocateStation(void)
|
|||
}
|
||||
|
||||
/* Check if we can add a block to the pool */
|
||||
if (AddBlockToPool(&_station_pool))
|
||||
return AllocateStation();
|
||||
if (AddBlockToPool(&_station_pool)) return AllocateStation();
|
||||
|
||||
_error_message = STR_3008_TOO_MANY_STATIONS_LOADING;
|
||||
return NULL;
|
||||
|
@ -480,10 +477,10 @@ static void UpdateStationVirtCoord(Station *st)
|
|||
// Update the virtual coords needed to draw the station sign for all stations.
|
||||
void UpdateAllStationVirtCoord(void)
|
||||
{
|
||||
Station *st;
|
||||
Station* st;
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (st->xy != 0)
|
||||
UpdateStationVirtCoord(st);
|
||||
if (st->xy != 0) UpdateStationVirtCoord(st);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -602,8 +599,7 @@ void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile,
|
|||
uint i;
|
||||
|
||||
GetAcceptedCargo(tile, ac);
|
||||
for (i = 0; i < lengthof(ac); ++i)
|
||||
accepts[i] += ac[i];
|
||||
for (i = 0; i < lengthof(ac); ++i) accepts[i] += ac[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -642,8 +638,7 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
|
|||
rect.min_y = MapSizeY();
|
||||
rect.max_x = rect.max_y = 0;
|
||||
// Don't update acceptance for a buoy
|
||||
if (IsBuoy(st))
|
||||
return;
|
||||
if (IsBuoy(st)) return;
|
||||
|
||||
/* old accepted goods types */
|
||||
old_acc = GetAcceptanceMask(st);
|
||||
|
@ -732,7 +727,8 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
|
|||
// This is called right after a station was deleted.
|
||||
// It checks if the whole station is free of substations, and if so, the station will be
|
||||
// deleted after a little while.
|
||||
static void DeleteStationIfEmpty(Station *st) {
|
||||
static void DeleteStationIfEmpty(Station* st)
|
||||
{
|
||||
if (st->facilities == 0) {
|
||||
st->delete_ctr = 0;
|
||||
InvalidateWindow(WC_STATION_LIST, st->owner);
|
||||
|
@ -753,8 +749,7 @@ int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invali
|
|||
int flat_z;
|
||||
|
||||
BEGIN_TILE_LOOP(tile_cur, w, h, tile)
|
||||
if (!EnsureNoVehicle(tile_cur))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
|
||||
|
||||
tileh = GetTileSlope(tile_cur, &z);
|
||||
|
||||
|
@ -767,9 +762,7 @@ int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invali
|
|||
b) the build_on_slopes switch is disabled
|
||||
*/
|
||||
if (IsSteepTileh(tileh) ||
|
||||
((_is_old_ai_player || !_patches.build_on_slopes)
|
||||
&& tileh != 0)) {
|
||||
|
||||
((_is_old_ai_player || !_patches.build_on_slopes) && tileh != 0)) {
|
||||
_error_message = STR_0007_FLAT_LAND_REQUIRED;
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
@ -897,7 +890,6 @@ static inline byte *CreateMulti(byte *layout, int n, byte b)
|
|||
return layout;
|
||||
}
|
||||
|
||||
// stolen from TTDPatch
|
||||
static void GetStationLayout(byte *layout, int numtracks, int plat_len, const StationSpec *spec)
|
||||
{
|
||||
if (spec != NULL && spec->lengths >= plat_len &&
|
||||
|
@ -912,9 +904,8 @@ static void GetStationLayout(byte *layout, int numtracks, int plat_len, const St
|
|||
if (plat_len == 1) {
|
||||
CreateSingle(layout, numtracks);
|
||||
} else {
|
||||
if (numtracks & 1)
|
||||
layout = CreateSingle(layout, plat_len);
|
||||
numtracks>>=1;
|
||||
if (numtracks & 1) layout = CreateSingle(layout, plat_len);
|
||||
numtracks >>= 1;
|
||||
|
||||
while (--numtracks >= 0) {
|
||||
layout = CreateMulti(layout, plat_len, 4);
|
||||
|
@ -1004,24 +995,19 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
}
|
||||
|
||||
//XXX can't we pack this in the "else" part of the if above?
|
||||
if (!CheckStationSpreadOut(st, tile_org, w_org, h_org))
|
||||
return CMD_ERROR;
|
||||
|
||||
if (!CheckStationSpreadOut(st, tile_org, w_org, h_org)) return CMD_ERROR;
|
||||
} else {
|
||||
// Create a new station
|
||||
st = AllocateStation();
|
||||
if (st == NULL)
|
||||
return CMD_ERROR;
|
||||
if (st == NULL) return CMD_ERROR;
|
||||
|
||||
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);
|
||||
|
||||
if (!GenerateStationName(st, tile_org, 0))
|
||||
return CMD_ERROR;
|
||||
if (!GenerateStationName(st, tile_org, 0)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC)
|
||||
StationInitialize(st, tile_org);
|
||||
if (flags & DC_EXEC) StationInitialize(st, tile_org);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
|
@ -1176,20 +1162,26 @@ uint GetStationPlatforms(const Station *st, TileIndex tile)
|
|||
TileIndex t;
|
||||
TileIndexDiff delta;
|
||||
int dir;
|
||||
int len;
|
||||
uint len;
|
||||
assert(TileBelongsToRailStation(st, tile));
|
||||
|
||||
len = 0;
|
||||
dir = _m[tile].m5&1;
|
||||
dir = _m[tile].m5 & 1;
|
||||
delta = dir ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
|
||||
|
||||
// find starting tile..
|
||||
t = tile;
|
||||
do { t -= delta; len++; } while (TileBelongsToRailStation(st, t) && (_m[t].m5&1) == dir);
|
||||
do {
|
||||
t -= delta;
|
||||
len++;
|
||||
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1) == dir);
|
||||
|
||||
// find ending tile
|
||||
t = tile;
|
||||
do { t += delta; len++; }while (TileBelongsToRailStation(st, t) && (_m[t].m5&1) == dir);
|
||||
do {
|
||||
t += delta;
|
||||
len++;
|
||||
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1) == dir);
|
||||
|
||||
return len - 1;
|
||||
}
|
||||
|
@ -1396,17 +1388,15 @@ int32 CmdBuildRoadStop(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
return CMD_ERROR;
|
||||
|
||||
cost = CheckFlatLandBelow(tile, 1, 1, flags, 1 << p1, NULL);
|
||||
if (cost == CMD_ERROR)
|
||||
return CMD_ERROR;
|
||||
if (cost == CMD_ERROR) return CMD_ERROR;
|
||||
|
||||
st = GetStationAround(tile, 1, 1, -1);
|
||||
if (st == CHECK_STATIONS_ERR)
|
||||
return CMD_ERROR;
|
||||
if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
|
||||
|
||||
/* Find a station close to us */
|
||||
if (st == NULL) {
|
||||
st = GetClosestStationFromTile(tile, 8, _current_player);
|
||||
if (st!=NULL && st->facilities) st = NULL;
|
||||
if (st != NULL && st->facilities) st = NULL;
|
||||
}
|
||||
|
||||
//give us a road stop in the list, and check if something went wrong
|
||||
|
@ -1429,8 +1419,7 @@ int32 CmdBuildRoadStop(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
Town *t;
|
||||
|
||||
st = AllocateStation();
|
||||
if (st == NULL)
|
||||
return CMD_ERROR;
|
||||
if (st == NULL) return CMD_ERROR;
|
||||
|
||||
st->town = t = ClosestTownFromTile(tile, (uint)-1);
|
||||
|
||||
|
@ -1441,11 +1430,9 @@ int32 CmdBuildRoadStop(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
st->sign.width_1 = 0;
|
||||
|
||||
if (!GenerateStationName(st, tile, 0))
|
||||
return CMD_ERROR;
|
||||
if (!GenerateStationName(st, tile, 0)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC)
|
||||
StationInitialize(st, tile);
|
||||
if (flags & DC_EXEC) StationInitialize(st, tile);
|
||||
}
|
||||
|
||||
cost += (type) ? _price.build_truck_station : _price.build_bus_station;
|
||||
|
@ -1489,7 +1476,7 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
|
|||
if (_current_player != OWNER_WATER && !CheckOwnership(st->owner))
|
||||
return CMD_ERROR;
|
||||
|
||||
if (is_truck) { //truck stop
|
||||
if (is_truck) { // truck stop
|
||||
primary_stop = &st->truck_stops;
|
||||
cur_stop = GetRoadStopByTile(tile, RS_TRUCK);
|
||||
} else {
|
||||
|
@ -1503,7 +1490,7 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
|
|||
return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
int i;
|
||||
uint i;
|
||||
DoClearSquare(tile);
|
||||
|
||||
/* Clear all vehicles destined for this station */
|
||||
|
@ -1515,19 +1502,14 @@ static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
|
|||
}
|
||||
|
||||
cur_stop->used = false;
|
||||
if (cur_stop->prev != NULL) //alter previous stop
|
||||
cur_stop->prev->next = cur_stop->next;
|
||||
|
||||
if (cur_stop->next != NULL) //alter next stop
|
||||
cur_stop->next->prev = cur_stop->prev;
|
||||
if (cur_stop->prev != NULL) cur_stop->prev->next = cur_stop->next;
|
||||
if (cur_stop->next != NULL) cur_stop->next->prev = cur_stop->prev;
|
||||
|
||||
//we only had one stop left
|
||||
if (cur_stop->next == NULL && cur_stop->prev == NULL) {
|
||||
|
||||
//so we remove ALL stops
|
||||
*primary_stop = NULL;
|
||||
st->facilities &= (is_truck) ? ~FACIL_TRUCK_STOP : ~FACIL_BUS_STOP;
|
||||
|
||||
} else if (cur_stop == *primary_stop) {
|
||||
//removed the first stop in the list
|
||||
//need to set the primary element to the next stop
|
||||
|
@ -1666,7 +1648,7 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
st->town = t;
|
||||
|
||||
if (_current_player < MAX_PLAYERS && flags&DC_EXEC)
|
||||
if (_current_player < MAX_PLAYERS && flags & DC_EXEC)
|
||||
SETBIT(t->have_ratings, _current_player);
|
||||
|
||||
st->sign.width_1 = 0;
|
||||
|
@ -1697,12 +1679,13 @@ int32 CmdBuildAirport(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
st->build_date = _date;
|
||||
|
||||
/* if airport was demolished while planes were en-route to it, the positions can no longer
|
||||
be the same (v->u.air.pos), since different airports have different indexes. So update
|
||||
all planes en-route to this airport. Only update if
|
||||
1. airport is upgraded
|
||||
2. airport is added to existing station (unfortunately unavoideable)
|
||||
*/
|
||||
/* if airport was demolished while planes were en-route to it, the
|
||||
* positions can no longer be the same (v->u.air.pos), since different
|
||||
* airports have different indexes. So update all planes en-route to this
|
||||
* airport. Only update if
|
||||
* 1. airport is upgraded
|
||||
* 2. airport is added to existing station (unfortunately unavoideable)
|
||||
*/
|
||||
if (airport_upgrade) UpdateAirplanesOnNewStation(st);
|
||||
|
||||
{
|
||||
|
@ -1850,11 +1833,8 @@ static int32 RemoveBuoy(Station *st, uint32 flags)
|
|||
|
||||
tile = st->dock_tile;
|
||||
|
||||
if (CheckShipsOnBuoy(st))
|
||||
return_cmd_error(STR_BUOY_IS_IN_USE);
|
||||
|
||||
if (!EnsureNoVehicle(tile))
|
||||
return CMD_ERROR;
|
||||
if (CheckShipsOnBuoy(st)) return_cmd_error(STR_BUOY_IS_IN_USE);
|
||||
if (!EnsureNoVehicle(tile)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
st->dock_tile = 0;
|
||||
|
@ -1963,8 +1943,7 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (!GenerateStationName(st, tile, 3)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC)
|
||||
StationInitialize(st, tile);
|
||||
if (flags & DC_EXEC) StationInitialize(st, tile);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
|
@ -2001,17 +1980,13 @@ static int32 RemoveDock(Station *st, uint32 flags)
|
|||
TileIndex tile1;
|
||||
TileIndex tile2;
|
||||
|
||||
if (!CheckOwnership(st->owner))
|
||||
return CMD_ERROR;
|
||||
if (!CheckOwnership(st->owner)) return CMD_ERROR;
|
||||
|
||||
tile1 = st->dock_tile;
|
||||
tile2 = tile1 + TileOffsByDir(_m[tile1].m5 - 0x4C);
|
||||
|
||||
if (!EnsureNoVehicle(tile1))
|
||||
return CMD_ERROR;
|
||||
|
||||
if (!EnsureNoVehicle(tile2))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(tile1)) return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(tile2)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
DoClearSquare(tile1);
|
||||
|
@ -2048,8 +2023,7 @@ static void DrawTile_Station(TileInfo *ti)
|
|||
{
|
||||
PlayerID owner = GetTileOwner(ti->tile);
|
||||
image_or_modificator = PALETTE_TO_GREY; /* NOTE: possible bug in ttd here? */
|
||||
if (owner < MAX_PLAYERS)
|
||||
image_or_modificator = PLAYER_SPRITE_COLOR(owner);
|
||||
if (owner < MAX_PLAYERS) image_or_modificator = PLAYER_SPRITE_COLOR(owner);
|
||||
}
|
||||
|
||||
// don't show foundation for docks (docks are between 76 (0x4C) and 81 (0x51))
|
||||
|
@ -2074,8 +2048,7 @@ static void DrawTile_Station(TileInfo *ti)
|
|||
if (t == NULL) t = &_station_display_datas[ti->map5];
|
||||
|
||||
image = t->ground_sprite;
|
||||
if (image & PALETTE_MODIFIER_COLOR)
|
||||
image |= image_or_modificator;
|
||||
if (image & PALETTE_MODIFIER_COLOR) image |= image_or_modificator;
|
||||
|
||||
// For custom sprites, there's no railtype-based pitching.
|
||||
offset = (image & SPRITE_MASK) < _custom_sprites_base ? rti->total_offset : railtype;
|
||||
|
@ -2124,8 +2097,7 @@ void StationPickerDrawSprite(int x, int y, RailType railtype, int image)
|
|||
t = &_station_display_datas[image];
|
||||
|
||||
img = t->ground_sprite;
|
||||
if (img & PALETTE_MODIFIER_COLOR)
|
||||
img |= ormod;
|
||||
if (img & PALETTE_MODIFIER_COLOR) img |= ormod;
|
||||
DrawSprite(img + rti->total_offset, x, y);
|
||||
|
||||
foreach_draw_tile_seq(dtss, t->seq) {
|
||||
|
@ -2280,7 +2252,6 @@ static uint32 VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
|
|||
{
|
||||
StationID station_id;
|
||||
byte dir;
|
||||
uint16 spd;
|
||||
|
||||
if (v->type == VEH_Train) {
|
||||
if (IS_BYTE_INSIDE(_m[tile].m5, 0, 8) && v->subtype == TS_Front_Engine &&
|
||||
|
@ -2289,7 +2260,6 @@ static uint32 VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
|
|||
station_id = _m[tile].m2;
|
||||
if ((!(v->current_order.flags & OF_NON_STOP) && !_patches.new_nonstop) ||
|
||||
(v->current_order.type == OT_GOTO_STATION && v->current_order.station == station_id)) {
|
||||
|
||||
if (!(_patches.new_nonstop && v->current_order.flags & OF_NON_STOP) &&
|
||||
v->current_order.type != OT_LEAVESTATION &&
|
||||
v->last_station_visited != station_id) {
|
||||
|
@ -2299,15 +2269,14 @@ static uint32 VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
|
|||
dir = v->direction & 6;
|
||||
if (dir & 2) intswap(x,y);
|
||||
if (y == 8) {
|
||||
if (dir != 2 && dir != 4) {
|
||||
x = (~x)&0xF;
|
||||
}
|
||||
if (dir != 2 && dir != 4) x = ~x & 0xF;
|
||||
if (x == 12) return 2 | (station_id << 8); /* enter station */
|
||||
if (x < 12) {
|
||||
uint16 spd;
|
||||
|
||||
v->vehstatus |= VS_TRAIN_SLOWING;
|
||||
spd = _enter_station_speedtable[x];
|
||||
if (spd < v->cur_speed)
|
||||
v->cur_speed = spd;
|
||||
if (spd < v->cur_speed) v->cur_speed = spd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2391,8 +2360,7 @@ static void DeleteStation(Station *st)
|
|||
}
|
||||
}
|
||||
//Orders for the vehicle have been changed, invalidate the window
|
||||
if (invalidate)
|
||||
InvalidateWindow(WC_VEHICLE_ORDERS, v->index);
|
||||
if (invalidate) InvalidateWindow(WC_VEHICLE_ORDERS, v->index);
|
||||
}
|
||||
|
||||
//Subsidies need removal as well
|
||||
|
@ -2404,8 +2372,7 @@ void DeleteAllPlayerStations(void)
|
|||
Station *st;
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (st->xy && st->owner < MAX_PLAYERS)
|
||||
DeleteStation(st);
|
||||
if (st->xy != 0 && st->owner < MAX_PLAYERS) DeleteStation(st);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2435,10 +2402,7 @@ static void StationHandleBigTick(Station *st)
|
|||
{
|
||||
UpdateStationAcceptance(st, true);
|
||||
|
||||
if (st->facilities == 0) {
|
||||
if (++st->delete_ctr >= 8)
|
||||
DeleteStation(st);
|
||||
}
|
||||
if (st->facilities == 0 && ++st->delete_ctr >= 8) DeleteStation(st);
|
||||
|
||||
// Here we saveguard against orphaned slots
|
||||
CheckOrphanedSlots(st, RS_BUS);
|
||||
|
@ -2546,15 +2510,13 @@ static void StationHandleSmallTick(Station *st)
|
|||
{
|
||||
byte b;
|
||||
|
||||
if (st->facilities == 0)
|
||||
return;
|
||||
if (st->facilities == 0) return;
|
||||
|
||||
b = st->delete_ctr + 1;
|
||||
if (b >= 185) b = 0;
|
||||
st->delete_ctr = b;
|
||||
|
||||
if (b == 0)
|
||||
UpdateStationRating(st);
|
||||
if (b == 0) UpdateStationRating(st);
|
||||
}
|
||||
|
||||
void OnTick_Station(void)
|
||||
|
@ -2562,22 +2524,17 @@ void OnTick_Station(void)
|
|||
uint i;
|
||||
Station *st;
|
||||
|
||||
if (_game_mode == GM_EDITOR)
|
||||
return;
|
||||
if (_game_mode == GM_EDITOR) return;
|
||||
|
||||
i = _station_tick_ctr;
|
||||
if (++_station_tick_ctr == GetStationPoolSize())
|
||||
_station_tick_ctr = 0;
|
||||
if (++_station_tick_ctr == GetStationPoolSize()) _station_tick_ctr = 0;
|
||||
|
||||
st = GetStation(i);
|
||||
if (st->xy != 0)
|
||||
StationHandleBigTick(st);
|
||||
if (st->xy != 0) StationHandleBigTick(st);
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (st->xy != 0)
|
||||
StationHandleSmallTick(st);
|
||||
if (st->xy != INVALID_TILE) StationHandleSmallTick(st);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void StationMonthlyLoop(void)
|
||||
|
@ -2623,7 +2580,7 @@ static void UpdateStationWaiting(Station *st, int type, uint amount)
|
|||
*/
|
||||
int32 CmdRenameStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||
{
|
||||
StringID str,old_str;
|
||||
StringID str;
|
||||
Station *st;
|
||||
|
||||
if (!IsStationIndex(p1) || _cmd_text[0] == '\0') return CMD_ERROR;
|
||||
|
@ -2635,7 +2592,8 @@ int32 CmdRenameStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
if (str == 0) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
old_str = st->string_id;
|
||||
StringID old_str = st->string_id;
|
||||
|
||||
st->string_id = str;
|
||||
UpdateStationVirtCoord(st);
|
||||
DeleteName(old_str);
|
||||
|
@ -2686,7 +2644,7 @@ uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
|
|||
cur_tile = TILE_MASK(cur_tile);
|
||||
if (IsTileType(cur_tile, MP_STATION)) {
|
||||
st_index = _m[cur_tile].m2;
|
||||
for(i=0; i!=8; i++) {
|
||||
for (i = 0; i != 8; i++) {
|
||||
if (around[i] == INVALID_STATION) {
|
||||
st = GetStation(st_index);
|
||||
if (!IsBuoy(st) &&
|
||||
|
@ -2788,7 +2746,7 @@ uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
|
|||
|
||||
void BuildOilRig(TileIndex tile)
|
||||
{
|
||||
int j;
|
||||
uint j;
|
||||
Station *st = AllocateStation();
|
||||
|
||||
if (st == NULL) {
|
||||
|
@ -2804,11 +2762,11 @@ void BuildOilRig(TileIndex tile)
|
|||
st->sign.width_1 = 0;
|
||||
|
||||
SetTileType(tile, MP_STATION);
|
||||
_m[tile].m5 = 0x4B;
|
||||
SetTileOwner(tile, OWNER_NONE);
|
||||
_m[tile].m2 = st->index;
|
||||
_m[tile].m3 = 0;
|
||||
_m[tile].m4 = 0;
|
||||
_m[tile].m2 = st->index;
|
||||
_m[tile].m5 = 0x4B;
|
||||
|
||||
st->owner = OWNER_NONE;
|
||||
st->airport_flags = 0;
|
||||
|
@ -2887,24 +2845,14 @@ static int32 ClearTile_Station(TileIndex tile, byte flags)
|
|||
|
||||
st = GetStation(_m[tile].m2);
|
||||
|
||||
if (m5 < 8)
|
||||
return RemoveRailroadStation(st, tile, flags);
|
||||
|
||||
if (m5 < 8) return RemoveRailroadStation(st, tile, flags);
|
||||
// original airports < 67, new airports between 83 - 114
|
||||
if (m5 < 0x43 || ( m5 >= 83 && m5 <= 114) )
|
||||
return RemoveAirport(st, flags);
|
||||
|
||||
if (m5 < 0x4B)
|
||||
return RemoveRoadStop(st, flags, tile);
|
||||
|
||||
if (m5 == 0x52)
|
||||
return RemoveBuoy(st, flags);
|
||||
|
||||
if (m5 != 0x4B && m5 < 0x53)
|
||||
return RemoveDock(st, flags);
|
||||
if (m5 < 0x43 || (m5 >= 83 && m5 <= 114)) return RemoveAirport(st, flags);
|
||||
if (m5 < 0x4B) return RemoveRoadStop(st, flags, tile);
|
||||
if (m5 == 0x52) return RemoveBuoy(st, flags);
|
||||
if (m5 != 0x4B && m5 < 0x53) return RemoveDock(st, flags);
|
||||
|
||||
return CMD_ERROR;
|
||||
|
||||
}
|
||||
|
||||
void InitializeStations(void)
|
||||
|
@ -3036,8 +2984,9 @@ static void SaveLoad_STNS(Station *st)
|
|||
SlObject(&st->goods[i], _goods_desc);
|
||||
|
||||
/* In older versions, enroute_from had 0xFF as INVALID_STATION, is now 0xFFFF */
|
||||
if (_sl_full_version < 0x700 && st->goods[i].enroute_from == 0xFF)
|
||||
if (_sl_full_version < 0x700 && st->goods[i].enroute_from == 0xFF) {
|
||||
st->goods[i].enroute_from = INVALID_STATION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3066,10 +3015,11 @@ static void Load_STNS(void)
|
|||
SaveLoad_STNS(st);
|
||||
|
||||
// this means it's an oldstyle savegame without support for nonuniform stations
|
||||
if (st->train_tile && st->trainst_h == 0) {
|
||||
if (st->train_tile != 0 && st->trainst_h == 0) {
|
||||
int w = st->trainst_w >> 4;
|
||||
int h = st->trainst_w & 0xF;
|
||||
if (_m[st->train_tile].m5&1) intswap(w,h);
|
||||
|
||||
if (_m[st->train_tile].m5 & 1) intswap(w, h);
|
||||
st->trainst_w = w;
|
||||
st->trainst_h = h;
|
||||
}
|
||||
|
@ -3094,8 +3044,7 @@ static void Load_STNS(void)
|
|||
}
|
||||
|
||||
/* This is to ensure all pointers are within the limits of _stations_size */
|
||||
if (_station_tick_ctr > GetStationPoolSize())
|
||||
_station_tick_ctr = 0;
|
||||
if (_station_tick_ctr > GetStationPoolSize()) _station_tick_ctr = 0;
|
||||
}
|
||||
|
||||
static void Save_ROADSTOP(void)
|
||||
|
|
|
@ -22,34 +22,33 @@ static void StationsWndShowStationRating(int x, int y, int type, uint acceptance
|
|||
int color = _rating_colors[type];
|
||||
uint w;
|
||||
|
||||
if (acceptance > 575)
|
||||
acceptance = 575;
|
||||
if (acceptance > 575) acceptance = 575;
|
||||
|
||||
acceptance = (acceptance + 7) >> 3;
|
||||
acceptance = (acceptance + 7) / 8;
|
||||
|
||||
/* draw cargo */
|
||||
if ( (w=acceptance>>3) != 0) {
|
||||
GfxFillRect(x, y, x+w-1, y+6, color);
|
||||
w = acceptance / 8;
|
||||
if (w != 0) {
|
||||
GfxFillRect(x, y, x + w - 1, y + 6, color);
|
||||
x += w;
|
||||
}
|
||||
|
||||
if ( (w=acceptance&7) != 0) {
|
||||
if (w==7) w--;
|
||||
GfxFillRect(x, y+(w-1), x, y+6, color);
|
||||
w = acceptance % 8;
|
||||
if (w != 0) {
|
||||
if (w == 7) w--;
|
||||
GfxFillRect(x, y + (w - 1), x, y + 6, color);
|
||||
}
|
||||
|
||||
x -= (acceptance>>3);
|
||||
x -= acceptance / 8;
|
||||
|
||||
DrawString(x+1, y, _cargoc.names_short[type], 0x10);
|
||||
DrawString(x + 1, y, _cargoc.names_short[type], 0x10);
|
||||
|
||||
/* 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 >>= 5;
|
||||
|
||||
if (rating != 0) {
|
||||
GfxFillRect(x+1, y+8, x+rating, y+8, 0xD0);
|
||||
}
|
||||
if (rating != 0) GfxFillRect(x + 1, y + 8, x + rating, y + 8, 0xD0);
|
||||
}
|
||||
|
||||
static uint16 _num_station_sort[MAX_PLAYERS];
|
||||
|
@ -67,7 +66,7 @@ static int CDECL StationNameSorter(const void *a, const void *b)
|
|||
argv[0] = cmp1->index;
|
||||
GetStringWithArgs(buf1, STR_STATION, argv);
|
||||
|
||||
if ( cmp2->index != _last_station_idx) {
|
||||
if (cmp2->index != _last_station_idx) {
|
||||
_last_station_idx = cmp2->index;
|
||||
argv[0] = cmp2->index;
|
||||
GetStringWithArgs(_bufcache, STR_STATION, argv);
|
||||
|
@ -91,7 +90,7 @@ static void GlobalSortStationList(void)
|
|||
error("Could not allocate memory for the station-sorting-list");
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if(st->xy && st->owner != OWNER_NONE) {
|
||||
if (st->xy != 0 && st->owner != OWNER_NONE) {
|
||||
_station_sort[n].index = st->index;
|
||||
_station_sort[n++].owner = st->owner;
|
||||
_num_station_sort[st->owner]++; // add number of stations of player
|
||||
|
@ -101,7 +100,9 @@ static void GlobalSortStationList(void)
|
|||
// create cumulative station-ownership
|
||||
// stations are stored as a cummulative index, eg 25, 41, 43. This means
|
||||
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2
|
||||
for (i = &_num_station_sort[1]; i != endof(_num_station_sort); i++) {*i += *(i-1);}
|
||||
for (i = &_num_station_sort[1]; i != endof(_num_station_sort); i++) {
|
||||
*i += *(i - 1);
|
||||
}
|
||||
|
||||
qsort(_station_sort, n, sizeof(_station_sort[0]), GeneralOwnerSorter); // sort by owner
|
||||
|
||||
|
@ -135,18 +136,14 @@ static void MakeSortedStationList(PlayerID owner)
|
|||
|
||||
static void PlayerStationsWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
const PlayerID owner = w->window_number;
|
||||
uint32 i;
|
||||
|
||||
// resort station window if stations have been added/removed
|
||||
if (_global_station_sort_dirty)
|
||||
GlobalSortStationList();
|
||||
|
||||
if (_station_sort_dirty[owner]) { // resort in case of a station rename.
|
||||
MakeSortedStationList(owner);
|
||||
}
|
||||
if (_global_station_sort_dirty) GlobalSortStationList();
|
||||
if (_station_sort_dirty[owner]) MakeSortedStationList(owner);
|
||||
|
||||
// stations are stored as a cummulative index, eg 25, 41, 43. This means
|
||||
// Player0: 25; Player1: (41-25) 16; Player2: (43-41) 2 stations
|
||||
|
@ -187,8 +184,9 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
|
|||
x = DrawString(xb, y, STR_3049_0, 0) + 5;
|
||||
|
||||
// show cargo waiting and station ratings
|
||||
for(j=0; j!=NUM_CARGO; j++) {
|
||||
int acc = GB(st->goods[j].waiting_acceptance, 0, 12);
|
||||
for (j = 0; j != NUM_CARGO; j++) {
|
||||
uint acc = GB(st->goods[j].waiting_acceptance, 0, 12);
|
||||
|
||||
if (acc != 0) {
|
||||
StationsWndShowStationRating(x, y, j, acc, st->goods[j].rating);
|
||||
x += 10;
|
||||
|
@ -196,16 +194,16 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
y += 10;
|
||||
i++; // next station
|
||||
if (++p == w->vscroll.cap) { break;} // max number of stations in 1 window
|
||||
if (++p == w->vscroll.cap) break; // max number of stations in 1 window
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 3: {
|
||||
uint32 id_v = (e->click.pt.y - 15) / 10;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -215,7 +213,7 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
id_v += (owner == 0) ? 0 : _num_station_sort[owner - 1]; // first element in list
|
||||
|
||||
if (id_v >= _num_station_sort[owner]) { return;} // click out of station bound
|
||||
if (id_v >= _num_station_sort[owner]) return; // click out of station bound
|
||||
|
||||
st = GetStation(_station_sort[id_v].index);
|
||||
|
||||
|
@ -229,7 +227,7 @@ static void PlayerStationsWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
case WE_4:
|
||||
WP(w,plstations_d).refresh_counter++;
|
||||
if (WP(w,plstations_d).refresh_counter==5) {
|
||||
if (WP(w,plstations_d).refresh_counter == 5) {
|
||||
WP(w,plstations_d).refresh_counter = 0;
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
|
@ -320,11 +318,10 @@ static void DrawStationViewWindow(Window *w)
|
|||
StringID str;
|
||||
|
||||
num = 1;
|
||||
for(i=0; i!=NUM_CARGO; i++) {
|
||||
for (i = 0; i != NUM_CARGO; i++) {
|
||||
if (GB(st->goods[i].waiting_acceptance, 0, 12) != 0) {
|
||||
num++;
|
||||
if (st->goods[i].enroute_from != station_id)
|
||||
num++;
|
||||
if (st->goods[i].enroute_from != station_id) num++;
|
||||
}
|
||||
}
|
||||
SetVScrollCount(w, num);
|
||||
|
@ -347,8 +344,9 @@ static void DrawStationViewWindow(Window *w)
|
|||
|
||||
if (--pos < 0) {
|
||||
str = STR_00D0_NOTHING;
|
||||
for(i=0; i!=NUM_CARGO; i++)
|
||||
for (i = 0; i != NUM_CARGO; i++) {
|
||||
if (GB(st->goods[i].waiting_acceptance, 0, 12) != 0) str = STR_EMPTY;
|
||||
}
|
||||
SetDParam(0, str);
|
||||
DrawString(x, y, STR_0008_WAITING, 0);
|
||||
y += 10;
|
||||
|
@ -357,8 +355,7 @@ static void DrawStationViewWindow(Window *w)
|
|||
i = 0;
|
||||
do {
|
||||
uint waiting = GB(st->goods[i].waiting_acceptance, 0, 12);
|
||||
if (waiting == 0)
|
||||
continue;
|
||||
if (waiting == 0) continue;
|
||||
|
||||
num = (waiting + 5) / 10;
|
||||
if (num != 0) {
|
||||
|
@ -417,11 +414,10 @@ static void DrawStationViewWindow(Window *w)
|
|||
|
||||
DrawStringMultiLine(2, 67, STR_SPEC_USERSTRING, 245);
|
||||
} else {
|
||||
|
||||
DrawString(2, 67, STR_3034_LOCAL_RATING_OF_TRANSPORT, 0);
|
||||
|
||||
y = 77;
|
||||
for(i=0; i!=NUM_CARGO; i++) {
|
||||
for (i = 0; i != NUM_CARGO; i++) {
|
||||
if (st->goods[i].enroute_from != INVALID_STATION) {
|
||||
SetDParam(0, _cargoc.names_s[i]);
|
||||
SetDParam(2, st->goods[i].rating * 101 >> 8);
|
||||
|
@ -436,13 +432,13 @@ static void DrawStationViewWindow(Window *w)
|
|||
|
||||
static void StationViewWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
DrawStationViewWindow(w);
|
||||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
switch (e->click.widget) {
|
||||
case 7:
|
||||
ScrollMainWindowToTile(GetStation(w->window_number)->xy);
|
||||
break;
|
||||
|
|
20
stdafx.h
20
stdafx.h
|
@ -198,21 +198,21 @@ typedef unsigned char byte;
|
|||
static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); }
|
||||
static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); }
|
||||
static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); }
|
||||
# define TO_BE32(x) x
|
||||
# define TO_BE16(x) x
|
||||
# define FROM_BE32(x) x
|
||||
# define FROM_BE16(x) x
|
||||
# define TO_BE32X(x) x
|
||||
# define TO_BE32(x) (x)
|
||||
# define TO_BE16(x) (x)
|
||||
# define FROM_BE32(x) (x)
|
||||
# define FROM_BE16(x) (x)
|
||||
# define TO_BE32X(x) (x)
|
||||
#else
|
||||
static inline uint32 TO_BE32(uint32 x) { return BSWAP32(x); }
|
||||
static inline uint16 TO_BE16(uint16 x) { return BSWAP16(x); }
|
||||
static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); }
|
||||
static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); }
|
||||
# define TO_LE32(x) x
|
||||
# define TO_LE16(x) x
|
||||
# define TO_LE32(x) (x)
|
||||
# define TO_LE16(x) (x)
|
||||
# define TO_BE32X(x) BSWAP32(x)
|
||||
# define FROM_LE32(x) x
|
||||
# define FROM_LE16(x) x
|
||||
# define FROM_LE32(x) (x)
|
||||
# define FROM_LE16(x) (x)
|
||||
#endif /* TTD_BIG_ENDIAN */
|
||||
|
||||
#if !defined(GAME_DATA_DIR)
|
||||
|
@ -241,7 +241,7 @@ typedef unsigned char byte;
|
|||
|
||||
assert_compile(sizeof(uint32) == 4);
|
||||
assert_compile(sizeof(uint16) == 2);
|
||||
assert_compile(sizeof(uint8) == 1);
|
||||
assert_compile(sizeof(uint8) == 1);
|
||||
|
||||
#define lengthof(x) (sizeof(x)/sizeof(x[0]))
|
||||
#define endof(x) (&x[lengthof(x)])
|
||||
|
|
13
strings.c
13
strings.c
|
@ -188,11 +188,12 @@ char *GetStringWithArgs(char *buffr, uint string, const int32 *argv)
|
|||
return FormatString(buffr, _userstring, NULL, 0);
|
||||
}
|
||||
|
||||
if (index >= _langtab_num[tab])
|
||||
if (index >= _langtab_num[tab]) {
|
||||
error(
|
||||
"!String 0x%X is invalid. "
|
||||
"Probably because an old version of the .lng file.\n", string
|
||||
);
|
||||
}
|
||||
|
||||
return FormatString(buffr, GetStringPtr(GB(string, 0, 16)), argv, GB(string, 24, 8));
|
||||
}
|
||||
|
@ -317,7 +318,7 @@ static char *FormatYmdString(char *buff, uint16 number)
|
|||
memcpy(buff, GetStringPtr(STR_0162_JAN + ymd.month), 4);
|
||||
buff[3] = ' ';
|
||||
|
||||
return FormatNoCommaNumber(buff+4, ymd.year + MAX_YEAR_BEGIN_REAL);
|
||||
return FormatNoCommaNumber(buff + 4, ymd.year + MAX_YEAR_BEGIN_REAL);
|
||||
}
|
||||
|
||||
static char *FormatMonthAndYear(char *buff, uint16 number)
|
||||
|
@ -615,8 +616,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
|
|||
byte *s = (byte*)GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender.
|
||||
int len;
|
||||
int gender = 0;
|
||||
if (s && s[0] == 0x87)
|
||||
gender = s[1];
|
||||
if (s != NULL && s[0] == 0x87) gender = s[1];
|
||||
str = ParseStringChoice(str, gender, buff, &len);
|
||||
buff += len;
|
||||
break;
|
||||
|
@ -715,7 +715,8 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
|
|||
case 0x9B: { // {TOWN}
|
||||
const Town* t = GetTown(GetInt32(&argv));
|
||||
int32 temp[1];
|
||||
assert(t->xy);
|
||||
|
||||
assert(t->xy != 0);
|
||||
|
||||
temp[0] = t->townnameparts;
|
||||
buff = GetStringWithArgs(buff, t->townnametype, temp);
|
||||
|
@ -728,7 +729,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c
|
|||
}
|
||||
|
||||
case 0x9D: { // {SETCASE}
|
||||
// This is a pseudo command, it's outputted when someone does {STRING.ack}
|
||||
// This is a pseudo command, it's outputted when someone does {STRING.ack}
|
||||
// The modifier is added to all subsequent GetStringWithArgs that accept the modifier.
|
||||
modifier = (byte)*str++ << 24;
|
||||
break;
|
||||
|
|
|
@ -17,14 +17,14 @@
|
|||
static void HandleSubsidyClick(int y)
|
||||
{
|
||||
const Subsidy* s;
|
||||
int num,offs;
|
||||
uint num;
|
||||
int offs;
|
||||
TileIndex xy;
|
||||
|
||||
if (y < 0)
|
||||
return;
|
||||
if (y < 0) return;
|
||||
|
||||
num = 0;
|
||||
for(s=_subsidies; s != endof(_subsidies); s++) {
|
||||
for (s = _subsidies; s != endof(_subsidies); s++) {
|
||||
if (s->cargo_type != CT_INVALID && s->age < 12) {
|
||||
y -= 10;
|
||||
if (y < 0) goto handle_click;
|
||||
|
@ -40,7 +40,7 @@ static void HandleSubsidyClick(int y)
|
|||
y -= 11;
|
||||
if (y < 0) return;
|
||||
|
||||
for(s=_subsidies; s != endof(_subsidies); s++) {
|
||||
for (s = _subsidies; s != endof(_subsidies); s++) {
|
||||
if (s->cargo_type != CT_INVALID && s->age >= 12) {
|
||||
y -= 10;
|
||||
if (y < 0) goto handle_click;
|
||||
|
@ -78,7 +78,9 @@ static void DrawSubsidiesWindow(const Window* w)
|
|||
{
|
||||
YearMonthDay ymd;
|
||||
const Subsidy* s;
|
||||
int x,xt,y,num,x2;
|
||||
uint num;
|
||||
int x;
|
||||
int y;
|
||||
|
||||
DrawWindowWidgets(w);
|
||||
|
||||
|
@ -90,10 +92,12 @@ static void DrawSubsidiesWindow(const Window* w)
|
|||
y += 10;
|
||||
num = 0;
|
||||
|
||||
for(s=_subsidies; s != endof(_subsidies); s++) {
|
||||
for (s = _subsidies; s != endof(_subsidies); s++) {
|
||||
if (s->cargo_type != CT_INVALID && s->age < 12) {
|
||||
int x2;
|
||||
|
||||
SetupSubsidyDecodeParam(s, 1);
|
||||
x2 = DrawString(x+2, y, STR_2027_FROM_TO, 0);
|
||||
x2 = DrawString(x + 2, y, STR_2027_FROM_TO, 0);
|
||||
|
||||
SetDParam(0, _date - ymd.day + 384 - s->age * 32);
|
||||
DrawString(x2, y, STR_2028_BY, 0);
|
||||
|
@ -103,17 +107,18 @@ static void DrawSubsidiesWindow(const Window* w)
|
|||
}
|
||||
|
||||
if (num == 0) {
|
||||
DrawString(x+2, y, STR_202A_NONE, 0);
|
||||
DrawString(x + 2, y, STR_202A_NONE, 0);
|
||||
y += 10;
|
||||
}
|
||||
|
||||
DrawString(x, y+1, STR_202B_SERVICES_ALREADY_SUBSIDISED, 0);
|
||||
DrawString(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, 0);
|
||||
y += 10;
|
||||
num = 0;
|
||||
|
||||
for(s=_subsidies; s != endof(_subsidies); s++) {
|
||||
for (s = _subsidies; s != endof(_subsidies); s++) {
|
||||
if (s->cargo_type != CT_INVALID && s->age >= 12) {
|
||||
const Player* p;
|
||||
int xt;
|
||||
|
||||
SetupSubsidyDecodeParam(s, 1);
|
||||
|
||||
|
@ -121,7 +126,7 @@ static void DrawSubsidiesWindow(const Window* w)
|
|||
SetDParam(3, p->name_1);
|
||||
SetDParam(4, p->name_2);
|
||||
|
||||
xt = DrawString(x+2, y, STR_202C_FROM_TO, 0);
|
||||
xt = DrawString(x + 2, y, STR_202C_FROM_TO, 0);
|
||||
|
||||
SetDParam(0, _date - ymd.day + 768 - s->age * 32);
|
||||
DrawString(xt, y, STR_202D_UNTIL, 0);
|
||||
|
@ -130,21 +135,19 @@ static void DrawSubsidiesWindow(const Window* w)
|
|||
}
|
||||
}
|
||||
|
||||
if (num == 0) {
|
||||
DrawString(x+2, y, STR_202A_NONE, 0);
|
||||
}
|
||||
if (num == 0) DrawString(x + 2, y, STR_202A_NONE, 0);
|
||||
}
|
||||
|
||||
static void SubsidiesListWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
case WE_PAINT: DrawSubsidiesWindow(w); break;
|
||||
case WE_CLICK: {
|
||||
switch(e->click.widget) {
|
||||
case 2: HandleSubsidyClick(e->click.pt.y - 25); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
switch (e->event) {
|
||||
case WE_PAINT: DrawSubsidiesWindow(w); break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch (e->click.widget) {
|
||||
case 2: HandleSubsidyClick(e->click.pt.y - 25); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -469,7 +469,7 @@ const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES] = {
|
|||
{ 6, 18, 240, 3, SND_09_JET, 40, 74, 30, 200 }, /* 5 */
|
||||
{ 2, 17, 150, 1, SND_09_JET, 35, 74, 15, 100 }, /* 6 */
|
||||
{ 2, 18, 245, 3, SND_09_JET, 40, 74, 30, 150 }, /* 7 */
|
||||
{ 3, 19, 192, 3, SND_09_JET, 40, 74, 40, 220 }, /* 8 */
|
||||
{ 3, 19, 192, 3, SND_09_JET, 40, 74, 40, 220 }, /* 8 */
|
||||
{ 3, 20, 190, 3, SND_09_JET, 40, 74, 25, 230 }, /* 9 */
|
||||
{ 2, 16, 135, 3, SND_09_JET, 35, 74, 10, 95 }, /* 10 */
|
||||
{ 2, 18, 240, 3, SND_09_JET, 40, 74, 35, 170 }, /* 11 */
|
||||
|
|
|
@ -51,7 +51,7 @@ enum Sprites {
|
|||
SPR_CANALS_BASE = 5382,
|
||||
SPR_SLOPES_BASE = SPR_CANALS_BASE + 70,
|
||||
SPR_AUTORAIL_BASE = SPR_SLOPES_BASE + 78,
|
||||
SPR_OPENTTD_BASE = SPR_AUTORAIL_BASE + 55, // can be lowered once autorail.grf is finalized
|
||||
SPR_OPENTTD_BASE = SPR_AUTORAIL_BASE + 55,
|
||||
|
||||
SPR_BLOT = SPR_OPENTTD_BASE + 29, // colored circle (mainly used as vehicle profit marker and for sever compatibility)
|
||||
|
||||
|
@ -963,7 +963,6 @@ typedef enum CursorSprites {
|
|||
SPR_CURSOR_EW_MAGLEV = 1273,
|
||||
SPR_CURSOR_NWSE_MAGLEV = 1274,
|
||||
|
||||
SPR_CURSOR_RAIL_DEPOT = 1296,
|
||||
SPR_CURSOR_RAIL_STATION = 1300,
|
||||
|
||||
SPR_CURSOR_TUNNEL_RAIL = 2434,
|
||||
|
@ -975,6 +974,8 @@ typedef enum CursorSprites {
|
|||
SPR_CURSOR_AUTOMAGLEV = SPR_OPENTTD_BASE + 6,
|
||||
|
||||
SPR_CURSOR_WAYPOINT = SPR_OPENTTD_BASE + 7,
|
||||
|
||||
SPR_CURSOR_RAIL_DEPOT = 1296,
|
||||
SPR_CURSOR_MONO_DEPOT = SPR_OPENTTD_BASE + 11,
|
||||
SPR_CURSOR_MAGLEV_DEPOT = SPR_OPENTTD_BASE + 12,
|
||||
|
||||
|
@ -1004,15 +1005,15 @@ enum AnimCursors {
|
|||
};
|
||||
|
||||
/**
|
||||
* Bitmask setup. For the graphics system, 32 bits are used to define
|
||||
* the sprite to be displayed. This variable contains various information:<p>
|
||||
* <ul><li> SPRITE_WIDTH is the number of bits used for the actual sprite to be displayed.
|
||||
* This always starts at bit 0.</li>
|
||||
* <li> TRANSPARENT_BIT is the bit number which toggles sprite transparency</li>
|
||||
* <li> RECOLOR_BIT toggles the recoloring system</li>
|
||||
* <li> PALETTE_SPRITE_WIDTH and PALETTE_SPRITE_START determine the position and number of
|
||||
* bits used for the recoloring process. For transparency, it must be 0x322.</li>
|
||||
*/
|
||||
* Bitmask setup. For the graphics system, 32 bits are used to define
|
||||
* the sprite to be displayed. This variable contains various information:<p>
|
||||
* <ul><li> SPRITE_WIDTH is the number of bits used for the actual sprite to be displayed.
|
||||
* This always starts at bit 0.</li>
|
||||
* <li> TRANSPARENT_BIT is the bit number which toggles sprite transparency</li>
|
||||
* <li> RECOLOR_BIT toggles the recoloring system</li>
|
||||
* <li> PALETTE_SPRITE_WIDTH and PALETTE_SPRITE_START determine the position and number of
|
||||
* bits used for the recoloring process. For transparency, it must be 0x322.</li>
|
||||
*/
|
||||
enum SpriteSetup {
|
||||
TRANSPARENT_BIT = 31, ///< toggles transparency in the sprite
|
||||
RECOLOR_BIT = 15, ///< toggles recoloring in the sprite
|
||||
|
@ -1022,13 +1023,13 @@ enum SpriteSetup {
|
|||
};
|
||||
|
||||
/**
|
||||
these masks change the colors of the palette for a sprite.
|
||||
Apart from this bit, a sprite number is needed to define
|
||||
the palette used for recoloring. This palette is stored
|
||||
in the bits marked by PALETTE_SPRITE_MASK.
|
||||
@note Do not modify this enum. Alter SpriteSetup instead
|
||||
@see SpriteSetup
|
||||
*/
|
||||
* these masks change the colors of the palette for a sprite.
|
||||
* Apart from this bit, a sprite number is needed to define
|
||||
* the palette used for recoloring. This palette is stored
|
||||
* in the bits marked by PALETTE_SPRITE_MASK.
|
||||
* @note Do not modify this enum. Alter SpriteSetup instead
|
||||
* @see SpriteSetup
|
||||
*/
|
||||
enum Modifiers {
|
||||
///when a sprite is to be displayed transparently, this bit needs to be set.
|
||||
PALETTE_MODIFIER_TRANSPARENT = 1 << TRANSPARENT_BIT,
|
||||
|
|
|
@ -209,24 +209,23 @@ static void TerraformToolbWndProc(Window *w, WindowEvent *e)
|
|||
case WE_PAINT:
|
||||
DrawWindowWidgets(w);
|
||||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
if (e->click.widget >= 4) {
|
||||
_terraform_button_proc[e->click.widget - 4](w);
|
||||
}
|
||||
if (e->click.widget >= 4) _terraform_button_proc[e->click.widget - 4](w);
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS:
|
||||
{
|
||||
int i;
|
||||
case WE_KEYPRESS: {
|
||||
uint i;
|
||||
|
||||
for(i=0; i!=lengthof(_terraform_keycodes); i++)
|
||||
for (i = 0; i != lengthof(_terraform_keycodes); i++) {
|
||||
if (e->keypress.keycode == _terraform_keycodes[i]) {
|
||||
e->keypress.cont = false;
|
||||
_terraform_button_proc[i](w);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WE_PLACE_OBJ:
|
||||
_place_proc(e->place.tile);
|
||||
|
|
27
texteff.c
27
texteff.c
|
@ -95,9 +95,11 @@ void CDECL AddTextMessage(uint16 color, uint8 duration, const char *message, ...
|
|||
|
||||
void InitTextMessage(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_CHAT_MESSAGES; i++)
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < MAX_CHAT_MESSAGES; i++) {
|
||||
_text_message_list[i].message[0] = '\0';
|
||||
}
|
||||
|
||||
_textmessage_width = _textmessage_box_max_width;
|
||||
}
|
||||
|
@ -142,10 +144,10 @@ void UndrawTextMessage(void)
|
|||
// Check if a message is expired every day
|
||||
void TextMessageDailyLoop(void)
|
||||
{
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < MAX_CHAT_MESSAGES; i++) {
|
||||
if (_text_message_list[i].message[0] == '\0')
|
||||
continue;
|
||||
if (_text_message_list[i].message[0] == '\0') continue;
|
||||
|
||||
if (_date > _text_message_list[i].end_date) {
|
||||
/* Move the remaining messages over the current message */
|
||||
|
@ -168,8 +170,7 @@ void DrawTextMessage(void)
|
|||
int i, j;
|
||||
bool has_message;
|
||||
|
||||
if (!_textmessage_dirty)
|
||||
return;
|
||||
if (!_textmessage_dirty) return;
|
||||
|
||||
// First undraw if needed
|
||||
UndrawTextMessage();
|
||||
|
@ -180,13 +181,11 @@ void DrawTextMessage(void)
|
|||
/* Check if we have anything to draw at all */
|
||||
has_message = false;
|
||||
for ( i = 0; i < MAX_CHAT_MESSAGES; i++) {
|
||||
if (_text_message_list[i].message[0] == '\0')
|
||||
break;
|
||||
if (_text_message_list[i].message[0] == '\0') break;
|
||||
|
||||
has_message = true;
|
||||
}
|
||||
if (!has_message)
|
||||
return;
|
||||
if (!has_message) return;
|
||||
|
||||
// Make a copy of the screen as it is before painting (for undraw)
|
||||
memcpy_pitch(
|
||||
|
@ -200,8 +199,7 @@ void DrawTextMessage(void)
|
|||
j = 0;
|
||||
// Paint the messages
|
||||
for (i = MAX_CHAT_MESSAGES - 1; i >= 0; i--) {
|
||||
if (_text_message_list[i].message[0] == '\0')
|
||||
continue;
|
||||
if (_text_message_list[i].message[0] == '\0') continue;
|
||||
|
||||
j++;
|
||||
GfxFillRect(_textmessage_box_left, _screen.height-_textmessage_box_bottom-j*13-2, _textmessage_box_left+_textmessage_width - 1, _screen.height-_textmessage_box_bottom-j*13+10, /* black, but with some alpha */ 0x322 | USE_COLORTABLE);
|
||||
|
@ -237,8 +235,7 @@ void AddTextEffect(StringID msg, int x, int y, uint16 duration)
|
|||
return;
|
||||
|
||||
for (te = _text_effect_list; te->string_id != INVALID_STRING_ID; ) {
|
||||
if (++te == endof(_text_effect_list))
|
||||
return;
|
||||
if (++te == endof(_text_effect_list)) return;
|
||||
}
|
||||
|
||||
te->string_id = msg;
|
||||
|
|
128
town_cmd.c
128
town_cmd.c
|
@ -120,9 +120,9 @@ static void DrawTile_Town(TileInfo *ti)
|
|||
}
|
||||
|
||||
/* Add a house on top of the ground? */
|
||||
if ((image = dcts->sprite_2) != 0) {
|
||||
if (_display_opt & DO_TRANS_BUILDINGS)
|
||||
MAKE_TRANSPARENT(image);
|
||||
image = dcts->sprite_2;
|
||||
if (image != 0) {
|
||||
if (_display_opt & DO_TRANS_BUILDINGS) MAKE_TRANSPARENT(image);
|
||||
|
||||
AddSortableSpriteToDraw(image,
|
||||
ti->x + dcts->subtile_x,
|
||||
|
@ -132,14 +132,13 @@ static void DrawTile_Town(TileInfo *ti)
|
|||
dcts->dz,
|
||||
z);
|
||||
|
||||
if (_display_opt & DO_TRANS_BUILDINGS)
|
||||
return;
|
||||
if (_display_opt & DO_TRANS_BUILDINGS) return;
|
||||
}
|
||||
|
||||
{
|
||||
int proc;
|
||||
if ((proc=dcts->proc-1) >= 0 )
|
||||
_town_draw_tile_procs[proc](ti);
|
||||
int proc = dcts->proc - 1;
|
||||
|
||||
if (proc >= 0) _town_draw_tile_procs[proc](ti);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,11 +157,9 @@ static uint GetSlopeTileh_Town(const TileInfo *ti)
|
|||
static void AnimateTile_Town(TileIndex tile)
|
||||
{
|
||||
int old;
|
||||
int i;
|
||||
int a,b;
|
||||
|
||||
if (_tick_counter & 3)
|
||||
return;
|
||||
if (_tick_counter & 3) return;
|
||||
|
||||
// If the house is not one with a lift anymore, then stop this animating.
|
||||
// Not exactly sure when this happens, but probably when a house changes.
|
||||
|
@ -174,11 +171,13 @@ static void AnimateTile_Town(TileIndex tile)
|
|||
}
|
||||
|
||||
if (!((old = _m[tile].m1) & 0x80)) {
|
||||
int i;
|
||||
|
||||
_m[tile].m1 |= 0x80;
|
||||
|
||||
do {
|
||||
i = (Random()&7) - 1;
|
||||
} while (i < 0 || i == 1 || i*6==old);
|
||||
i = (Random() & 7) - 1;
|
||||
} while (i < 0 || i == 1 || i * 6 == old);
|
||||
|
||||
SB(_m[tile].m5, 0, 6, i);
|
||||
}
|
||||
|
@ -204,8 +203,7 @@ static bool IsCloseToTown(TileIndex tile, uint dist)
|
|||
const Town* t;
|
||||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy != 0 && DistanceManhattan(tile, t->xy) < dist)
|
||||
return true;
|
||||
if (t->xy != 0 && DistanceManhattan(tile, t->xy) < dist) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -248,9 +246,7 @@ uint32 GetWorldPopulation(void)
|
|||
const Town* t;
|
||||
|
||||
pop = 0;
|
||||
FOR_ALL_TOWNS(t) {
|
||||
pop += t->population;
|
||||
}
|
||||
FOR_ALL_TOWNS(t) pop += t->population;
|
||||
return pop;
|
||||
}
|
||||
|
||||
|
@ -265,7 +261,7 @@ static void MakeSingleHouseBigger(TileIndex tile)
|
|||
|
||||
_m[tile].m3 = _m[tile].m3 + 0x40;
|
||||
|
||||
if ( (_m[tile].m3 & 0xC0) == 0xC0) {
|
||||
if ((_m[tile].m3 & 0xC0) == 0xC0) {
|
||||
ChangePopulation(GetTown(_m[tile].m2), _housetype_population[_m[tile].m4]);
|
||||
}
|
||||
MarkTileDirtyByTile(tile);
|
||||
|
@ -294,9 +290,9 @@ static void TileLoop_Town(TileIndex tile)
|
|||
house = _m[tile].m4;
|
||||
if (_housetype_extra_flags[house] & 0x20 &&
|
||||
!(_m[tile].m5 & 0x80) &&
|
||||
CHANCE16(1,2) &&
|
||||
CHANCE16(1, 2) &&
|
||||
AddAnimatedTile(tile)) {
|
||||
_m[tile].m5 = (_m[tile].m5 & 0x40)|0x80;
|
||||
_m[tile].m5 = (_m[tile].m5 & 0x40) | 0x80;
|
||||
}
|
||||
|
||||
t = GetTown(_m[tile].m2);
|
||||
|
@ -323,7 +319,7 @@ static void TileLoop_Town(TileIndex tile)
|
|||
t->new_act_mail += moved;
|
||||
}
|
||||
|
||||
if (_house_more_flags[house]&8 && (t->flags12&1) && --t->time_until_rebuild == 0) {
|
||||
if (_house_more_flags[house] & 8 && (t->flags12 & 1) && --t->time_until_rebuild == 0) {
|
||||
t->time_until_rebuild = GB(r, 16, 6) + 130;
|
||||
|
||||
_current_player = OWNER_TOWN;
|
||||
|
@ -376,12 +372,12 @@ static int32 ClearTile_Town(TileIndex tile, byte flags)
|
|||
|
||||
static void GetAcceptedCargo_Town(TileIndex tile, AcceptedCargo ac)
|
||||
{
|
||||
int type = _m[tile].m4;
|
||||
byte type = _m[tile].m4;
|
||||
|
||||
ac[CT_PASSENGERS] = _housetype_cargo_passengers[type];
|
||||
ac[CT_MAIL] = _housetype_cargo_mail[type];
|
||||
ac[CT_GOODS] = _housetype_cargo_goods[type];
|
||||
ac[CT_FOOD] = _housetype_cargo_food[type];
|
||||
ac[CT_MAIL] = _housetype_cargo_mail[type];
|
||||
ac[CT_GOODS] = _housetype_cargo_goods[type];
|
||||
ac[CT_FOOD] = _housetype_cargo_food[type];
|
||||
}
|
||||
|
||||
static void GetTileDesc_Town(TileIndex tile, TileDesc *td)
|
||||
|
@ -439,8 +435,7 @@ static void TownTickHandler(Town *t)
|
|||
|
||||
void OnTick_Town(void)
|
||||
{
|
||||
if (_game_mode == GM_EDITOR)
|
||||
return;
|
||||
if (_game_mode == GM_EDITOR) return;
|
||||
|
||||
/* Make sure each town's tickhandler invocation frequency is about the
|
||||
* same - TOWN_GROWTH_FREQUENCY - independent on the number of towns. */
|
||||
|
@ -455,21 +450,21 @@ void OnTick_Town(void)
|
|||
|
||||
t = GetTown(i);
|
||||
|
||||
if (t->xy != 0)
|
||||
TownTickHandler(t);
|
||||
if (t->xy != 0) TownTickHandler(t);
|
||||
}
|
||||
}
|
||||
|
||||
static byte GetTownRoadMask(TileIndex tile)
|
||||
{
|
||||
byte b = GetRoadBitsByTile(tile);
|
||||
byte r=0;
|
||||
if (b&1) r|=10;
|
||||
if (b&2) r|=5;
|
||||
if (b&4) r|=9;
|
||||
if (b&8) r|=6;
|
||||
if (b&16) r|=3;
|
||||
if (b&32) r|=12;
|
||||
byte r = 0;
|
||||
|
||||
if (b & 0x01) r |= 10;
|
||||
if (b & 0x02) r |= 5;
|
||||
if (b & 0x04) r |= 9;
|
||||
if (b & 0x08) r |= 6;
|
||||
if (b & 0x10) r |= 3;
|
||||
if (b & 0x20) r |= 12;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -482,7 +477,7 @@ static bool IsRoadAllowedHere(TileIndex tile, int dir)
|
|||
// land at the edges. This is not ok.
|
||||
TILE_ASSERT(tile);
|
||||
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
// Check if there already is a road at this point?
|
||||
if (GetRoadBitsByTile(tile) == 0) {
|
||||
// No, try to build one in the direction.
|
||||
|
@ -513,24 +508,22 @@ no_slope:
|
|||
if ((k = (dir&1)?0xC:0x9) != slope && (k^0xF) != slope) {
|
||||
uint32 r = Random();
|
||||
|
||||
if (CHANCE16I(1,8, r) && !_generating_world) {
|
||||
if (CHANCE16I(1, 8, r) && !_generating_world) {
|
||||
int32 res;
|
||||
|
||||
if (CHANCE16I(1,16,r))
|
||||
if (CHANCE16I(1, 16, r)) {
|
||||
res = DoCommandByTile(tile, slope, 0, DC_EXEC | DC_AUTO | DC_NO_WATER,
|
||||
CMD_TERRAFORM_LAND);
|
||||
else
|
||||
} else {
|
||||
res = DoCommandByTile(tile, slope^0xF, 1, DC_EXEC | DC_AUTO | DC_NO_WATER,
|
||||
CMD_TERRAFORM_LAND);
|
||||
}
|
||||
if (res == CMD_ERROR && CHANCE16I(1,3,r))
|
||||
// We can consider building on the slope, though.
|
||||
goto no_slope;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Can somebody explain for what this is needed? :s */
|
||||
// tile = TILE_ADD(tile, _roadblock_tileadd[dir]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -556,8 +549,7 @@ static void LevelTownLand(TileIndex tile)
|
|||
|
||||
// Don't terraform if land is plain or if there's a house there.
|
||||
FindLandscapeHeightByTile(&ti, tile);
|
||||
if (ti.tileh == 0 || ti.type == MP_HOUSE)
|
||||
return;
|
||||
if (ti.tileh == 0 || ti.type == MP_HOUSE) return;
|
||||
|
||||
// First try up, then down
|
||||
if (!TerraformTownTile(tile, ~ti.tileh & 0xF, 1)) {
|
||||
|
@ -587,8 +579,7 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
LevelTownLand(tile);
|
||||
|
||||
// Is a road allowed here?
|
||||
if (!IsRoadAllowedHere(tile, block))
|
||||
return;
|
||||
if (!IsRoadAllowedHere(tile, block)) return;
|
||||
|
||||
// Randomize new road block numbers
|
||||
a = block;
|
||||
|
@ -602,8 +593,7 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
|
||||
// A road is not allowed to continue the randomized road,
|
||||
// return if the road we're trying to build is curved.
|
||||
if ( a != (b^2))
|
||||
return;
|
||||
if (a != (b ^ 2)) return;
|
||||
|
||||
// Return if neither side of the new road is a house
|
||||
if (!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 1])), MP_HOUSE) &&
|
||||
|
@ -619,7 +609,7 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
// Continue building on a partial road.
|
||||
// Always OK.
|
||||
_grow_town_result = 0;
|
||||
rcmd = 1 << (block^2);
|
||||
rcmd = 1 << (block ^ 2);
|
||||
} else {
|
||||
|
||||
// Reached a tunnel? Then continue at the other side of it.
|
||||
|
@ -630,25 +620,22 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
}
|
||||
|
||||
// For any other kind of tunnel/bridge, bail out.
|
||||
if (IsTileType(tile, MP_TUNNELBRIDGE))
|
||||
return;
|
||||
if (IsTileType(tile, MP_TUNNELBRIDGE)) return;
|
||||
|
||||
// Possibly extend the road in a direction.
|
||||
// Randomize a direction and if it has a road, bail out.
|
||||
i = GB(Random(), 0, 2);
|
||||
if (HASBIT(mask, i))
|
||||
return;
|
||||
if (HASBIT(mask, i)) return;
|
||||
|
||||
// This is the tile we will reach if we extend to this direction.
|
||||
tmptile = TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i]));
|
||||
|
||||
// Don't do it if it reaches to water.
|
||||
if (IS_WATER_TILE(tmptile))
|
||||
return;
|
||||
if (IS_WATER_TILE(tmptile)) return;
|
||||
|
||||
// Build a house at the edge. 60% chance or
|
||||
// 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.
|
||||
if (!IsTileType(tmptile, MP_HOUSE)) {
|
||||
// Level the land if possible
|
||||
|
@ -656,8 +643,7 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
|
||||
// And build a house.
|
||||
// Set result to -1 if we managed to build it.
|
||||
if (BuildTownHouse(t1, tmptile))
|
||||
_grow_town_result = -1;
|
||||
if (BuildTownHouse(t1, tmptile)) _grow_town_result = -1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -669,8 +655,7 @@ static void GrowTownInTile(TileIndex *tile_ptr, uint mask, int block, Town *t1)
|
|||
FindLandscapeHeightByTile(&ti, tile);
|
||||
|
||||
// Return if a water tile
|
||||
if (ti.type == MP_WATER && ti.map5==0)
|
||||
return;
|
||||
if (ti.type == MP_WATER && ti.map5 == 0) return;
|
||||
|
||||
// Determine direction of slope,
|
||||
// and build a road if not a special slope.
|
||||
|
@ -823,7 +808,7 @@ bool GrowTown(Town *t)
|
|||
FindLandscapeHeightByTile(&ti, tile);
|
||||
|
||||
// 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) {
|
||||
DoCommandByTile(tile, GenRandomRoadBits(), t->index, DC_EXEC | DC_AUTO, CMD_BUILD_ROAD);
|
||||
_current_player = old_player;
|
||||
|
@ -906,8 +891,7 @@ restart:
|
|||
GetString(buf1, townnametype);
|
||||
|
||||
// Check size and width
|
||||
if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130)
|
||||
continue;
|
||||
if (strlen(buf1) >= 31 || GetStringWidth(buf1) > 130) continue;
|
||||
|
||||
FOR_ALL_TOWNS(t2) {
|
||||
if (t2->xy != 0) {
|
||||
|
@ -916,8 +900,7 @@ restart:
|
|||
SetDParam(0, t2->index);
|
||||
GetString(buf2, STR_TOWN);
|
||||
if (strcmp(buf1, buf2) == 0) {
|
||||
if (tries-- < 0)
|
||||
return false;
|
||||
if (tries-- < 0) return false;
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
|
@ -1583,8 +1566,7 @@ static bool DoBuildStatueOfCompany(TileIndex tile)
|
|||
int32 r;
|
||||
|
||||
FindLandscapeHeightByTile(&ti, tile);
|
||||
if (ti.tileh != 0)
|
||||
return false;
|
||||
if (ti.tileh != 0) return false;
|
||||
|
||||
if (ti.type != MP_HOUSE && ti.type != MP_CLEAR && ti.type != MP_TREES)
|
||||
return false;
|
||||
|
@ -1634,8 +1616,7 @@ static void TownActionBuildStatue(Town *t, int action)
|
|||
SETBIT(t->statues, _current_player);
|
||||
|
||||
for (p = _statue_tiles; p != endof(_statue_tiles); ++p) {
|
||||
if (DoBuildStatueOfCompany(tile))
|
||||
return;
|
||||
if (DoBuildStatueOfCompany(tile)) return;
|
||||
tile = TILE_ADD(tile, ToTileIndexDiff(*p));
|
||||
}
|
||||
}
|
||||
|
@ -1873,8 +1854,11 @@ void ChangeTownRating(Town *t, int add, int max)
|
|||
int rating;
|
||||
|
||||
// if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff
|
||||
if (t == NULL || _current_player >= MAX_PLAYERS || (_cheats.magic_bulldozer.value && add < 0) )
|
||||
if (t == NULL ||
|
||||
_current_player >= MAX_PLAYERS ||
|
||||
(_cheats.magic_bulldozer.value && add < 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SETBIT(t->have_ratings, _current_player);
|
||||
|
||||
|
|
103
town_gui.c
103
town_gui.c
|
@ -45,7 +45,8 @@ uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
|
|||
uint buttons = 0;
|
||||
|
||||
if (pid != OWNER_SPECTATOR) {
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
// bribe option enabled?
|
||||
if (_patches.bribe) {
|
||||
// if unwanted, disable everything.
|
||||
|
@ -81,11 +82,12 @@ uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
|
|||
static int GetNthSetBit(uint32 bits, int n)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (n >= 0) {
|
||||
do {
|
||||
if (bits&1 && --n < 0) return i;
|
||||
if (bits & 1 && --n < 0) return i;
|
||||
i++;
|
||||
} while (bits>>=1);
|
||||
} while (bits >>= 1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -119,7 +121,7 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
|
|||
// Draw list of players
|
||||
y = 25;
|
||||
FOR_ALL_PLAYERS(p) {
|
||||
if (p->is_active && (HASBIT(t->have_ratings, p->index) || t->exclusivity==p->index)) {
|
||||
if (p->is_active && (HASBIT(t->have_ratings, p->index) || t->exclusivity == p->index)) {
|
||||
DrawPlayerIcon(p->index, 2, y);
|
||||
|
||||
SetDParam(0, p->name_1);
|
||||
|
@ -138,10 +140,10 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
SetDParam(4, str);
|
||||
if (t->exclusivity == p->index) // red icon for player with exclusive rights
|
||||
DrawSprite((SPR_BLOT) | PALETTE_TO_RED, 18, y);
|
||||
DrawSprite(SPR_BLOT | PALETTE_TO_RED, 18, y);
|
||||
|
||||
DrawString(28, y, STR_2024, 0);
|
||||
y+=10;
|
||||
y += 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -153,11 +155,10 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
if (--pos < 0) {
|
||||
DrawString(2, y, STR_2045_ACTIONS_AVAILABLE, 0);
|
||||
y+=10;
|
||||
y += 10;
|
||||
}
|
||||
for(i=0; buttons; i++,buttons>>=1) {
|
||||
if (pos <= -5)
|
||||
break;
|
||||
for (i = 0; buttons; i++, buttons >>= 1) {
|
||||
if (pos <= -5) break;
|
||||
|
||||
if (buttons&1 && --pos < 0) {
|
||||
DrawString(3, y, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i, 6);
|
||||
|
@ -167,8 +168,9 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
|
||||
{
|
||||
int i;
|
||||
if ((i=WP(w,def_d).data_1) != -1) {
|
||||
int i = WP(w,def_d).data_1;
|
||||
|
||||
if (i != -1) {
|
||||
SetDParam(1, (_price.build_industry >> 8) * _town_action_costs[i]);
|
||||
SetDParam(0, STR_2046_SMALL_ADVERTISING_CAMPAIGN + i);
|
||||
DrawStringMultiLine(2, 159, STR_204D_INITIATE_A_SMALL_LOCAL + i, 313);
|
||||
|
@ -182,8 +184,8 @@ static void TownAuthorityWndProc(Window *w, WindowEvent *e)
|
|||
case 3: { /* listbox */
|
||||
const Town *t = GetTown(w->window_number);
|
||||
int y = (e->click.pt.y - 0x6B) / 10;
|
||||
if (!IS_INT_INSIDE(y, 0, 5))
|
||||
return;
|
||||
|
||||
if (!IS_INT_INSIDE(y, 0, 5)) return;
|
||||
|
||||
y = GetNthSetBit(GetMaskOfTownActions(NULL, _local_player, t), y + w->vscroll.pos - 1);
|
||||
if (y >= 0) {
|
||||
|
@ -216,10 +218,9 @@ static const WindowDesc _town_authority_desc = {
|
|||
|
||||
static void ShowTownAuthorityWindow(uint town)
|
||||
{
|
||||
Window *w;
|
||||
Window* w = AllocateWindowDescFront(&_town_authority_desc, town);
|
||||
|
||||
w = AllocateWindowDescFront(&_town_authority_desc, town);
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->vscroll.cap = 5;
|
||||
WP(w,def_d).data_1 = -1;
|
||||
}
|
||||
|
@ -229,7 +230,7 @@ static void TownViewWndProc(Window *w, WindowEvent *e)
|
|||
{
|
||||
Town *t = GetTown(w->window_number);
|
||||
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
// disable renaming town in network games if you are not the server
|
||||
if (_networking && !_network_server) SETBIT(w->disabled_state, 8);
|
||||
|
@ -239,37 +240,41 @@ static void TownViewWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
SetDParam(0, t->population);
|
||||
SetDParam(1, t->num_houses);
|
||||
DrawString(2,107,STR_2006_POPULATION,0);
|
||||
DrawString(2, 107, STR_2006_POPULATION, 0);
|
||||
|
||||
SetDParam(0, t->act_pass);
|
||||
SetDParam(1, t->max_pass);
|
||||
DrawString(2,117,STR_200D_PASSENGERS_LAST_MONTH_MAX,0);
|
||||
DrawString(2, 117, STR_200D_PASSENGERS_LAST_MONTH_MAX, 0);
|
||||
|
||||
SetDParam(0, t->act_mail);
|
||||
SetDParam(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);
|
||||
break;
|
||||
|
||||
case WE_CLICK:
|
||||
switch(e->click.widget) {
|
||||
case 6: /* scroll to location */
|
||||
ScrollMainWindowToTile(t->xy);
|
||||
break;
|
||||
case 7: /* town authority */
|
||||
ShowTownAuthorityWindow(w->window_number);
|
||||
break;
|
||||
case 8: /* rename */
|
||||
SetDParam(0, w->window_number);
|
||||
ShowQueryString(STR_TOWN, STR_2007_RENAME_TOWN, 31, 130, w->window_class, w->window_number);
|
||||
break;
|
||||
case 9: /* expand town */
|
||||
ExpandTown(t);
|
||||
break;
|
||||
case 10: /* delete town */
|
||||
DeleteTown(t);
|
||||
break;
|
||||
switch (e->click.widget) {
|
||||
case 6: /* scroll to location */
|
||||
ScrollMainWindowToTile(t->xy);
|
||||
break;
|
||||
|
||||
case 7: /* town authority */
|
||||
ShowTownAuthorityWindow(w->window_number);
|
||||
break;
|
||||
|
||||
case 8: /* rename */
|
||||
SetDParam(0, w->window_number);
|
||||
ShowQueryString(STR_TOWN, STR_2007_RENAME_TOWN, 31, 130, w->window_class, w->window_number);
|
||||
break;
|
||||
|
||||
case 9: /* expand town */
|
||||
ExpandTown(t);
|
||||
break;
|
||||
|
||||
case 10: /* delete town */
|
||||
DeleteTown(t);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -331,7 +336,6 @@ static const WindowDesc _town_view_scen_desc = {
|
|||
void ShowTownViewWindow(uint town)
|
||||
{
|
||||
Window *w;
|
||||
Town *t;
|
||||
|
||||
if (_game_mode != GM_EDITOR) {
|
||||
w = AllocateWindowDescFront(&_town_view_desc, town);
|
||||
|
@ -339,10 +343,9 @@ void ShowTownViewWindow(uint town)
|
|||
w = AllocateWindowDescFront(&_town_view_scen_desc, town);
|
||||
}
|
||||
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->flags4 |= WF_DISABLE_VP_SCROLL;
|
||||
t = GetTown(w->window_number);
|
||||
AssignWindowViewport(w, 3, 17, 0xFE, 0x56, t->xy, 1);
|
||||
AssignWindowViewport(w, 3, 17, 0xFE, 0x56, GetTown(town)->xy, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -403,16 +406,16 @@ static int CDECL TownPopSorter(const void *a, const void *b)
|
|||
static void MakeSortedTownList(void)
|
||||
{
|
||||
const Town* t;
|
||||
int n = 0;
|
||||
uint n = 0;
|
||||
|
||||
/* Create array for sorting */
|
||||
_town_sort = realloc(_town_sort, GetTownPoolSize() * sizeof(_town_sort[0]));
|
||||
if (_town_sort == NULL)
|
||||
error("Could not allocate memory for the town-sorting-list");
|
||||
|
||||
FOR_ALL_TOWNS(t)
|
||||
if (t->xy)
|
||||
_town_sort[n++] = t->index;
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy != 0) _town_sort[n++] = t->index;
|
||||
}
|
||||
|
||||
_num_town_sort = n;
|
||||
|
||||
|
@ -425,9 +428,8 @@ static void MakeSortedTownList(void)
|
|||
|
||||
static void TownDirectoryWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch(e->event) {
|
||||
switch (e->event) {
|
||||
case WE_PAINT: {
|
||||
|
||||
if (_town_sort_dirty) {
|
||||
_town_sort_dirty = false;
|
||||
MakeSortedTownList();
|
||||
|
@ -516,10 +518,9 @@ static const WindowDesc _town_directory_desc = {
|
|||
|
||||
void ShowTownDirectory(void)
|
||||
{
|
||||
Window *w;
|
||||
Window* w = AllocateWindowDescFront(&_town_directory_desc, 0);
|
||||
|
||||
w = AllocateWindowDescFront(&_town_directory_desc, 0);
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
w->vscroll.cap = 16;
|
||||
w->resize.step_height = 10;
|
||||
w->resize.height = w->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
|
||||
|
|
241
train_cmd.c
241
train_cmd.c
|
@ -38,7 +38,8 @@ static const byte _state_dir_table[4] = { 0x20, 8, 0x10, 4 };
|
|||
* the consist changes.
|
||||
* @param v First vehicle of the consist.
|
||||
*/
|
||||
void TrainCargoChanged(Vehicle *v) {
|
||||
void TrainCargoChanged(Vehicle* v)
|
||||
{
|
||||
Vehicle *u;
|
||||
uint16 weight = 0;
|
||||
|
||||
|
@ -75,7 +76,8 @@ void TrainCargoChanged(Vehicle *v) {
|
|||
* Note: this needs to be called too for 'wagon chains' (in the depot, without an engine)
|
||||
* @param v First vehicle of the chain.
|
||||
*/
|
||||
void TrainConsistChanged(Vehicle *v) {
|
||||
void TrainConsistChanged(Vehicle* v)
|
||||
{
|
||||
const RailVehicleInfo *rvi_v;
|
||||
Vehicle *u;
|
||||
uint16 max_speed = 0xFFFF;
|
||||
|
@ -383,8 +385,7 @@ int GetTrainImage(const Vehicle *v, byte direction)
|
|||
|
||||
base = _engine_sprite_base[img] + ((direction + _engine_sprite_add[img]) & _engine_sprite_and[img]);
|
||||
|
||||
if (v->cargo_count >= (v->cargo_cap >> 1))
|
||||
base += _wagon_full_adder[img];
|
||||
if (v->cargo_count >= v->cargo_cap / 2) base += _wagon_full_adder[img];
|
||||
return base;
|
||||
}
|
||||
|
||||
|
@ -431,13 +432,11 @@ static uint CountArticulatedParts(const RailVehicleInfo *rvi, EngineID engine_ty
|
|||
uint16 callback;
|
||||
uint i;
|
||||
|
||||
if (!HASBIT(rvi->callbackmask, CBM_ARTIC_ENGINE))
|
||||
return 0;
|
||||
if (!HASBIT(rvi->callbackmask, CBM_ARTIC_ENGINE)) return 0;
|
||||
|
||||
for (i = 1; i < 10; i++) {
|
||||
callback = GetCallBackResult(CBID_ARTIC_ENGINE + (i << 8), engine_type, NULL);
|
||||
if (callback == CALLBACK_FAILED || callback == 0xFF)
|
||||
break;
|
||||
if (callback == CALLBACK_FAILED || callback == 0xFF) break;
|
||||
}
|
||||
|
||||
return i - 1;
|
||||
|
@ -502,10 +501,7 @@ static void AddArticulatedParts(const RailVehicleInfo *rvi, Vehicle **vl)
|
|||
static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
|
||||
{
|
||||
int32 value;
|
||||
Vehicle *v;
|
||||
const RailVehicleInfo *rvi;
|
||||
const Engine *e;
|
||||
int x,y;
|
||||
uint num_vehicles;
|
||||
|
||||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||
|
@ -517,17 +513,19 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
|
|||
|
||||
if (!(flags & DC_QUERY_COST)) {
|
||||
Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts.
|
||||
Vehicle* v;
|
||||
int x;
|
||||
int y;
|
||||
|
||||
if (!AllocateVehicles(vl, num_vehicles))
|
||||
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
byte img = rvi->image_index;
|
||||
Vehicle *u, *w;
|
||||
uint dir;
|
||||
|
||||
v = vl[0];
|
||||
v->spritenum = img;
|
||||
v->spritenum = rvi->image_index;
|
||||
|
||||
u = NULL;
|
||||
|
||||
|
@ -568,8 +566,7 @@ static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
|
|||
v->value = value;
|
||||
// v->day_counter = 0;
|
||||
|
||||
e = GetEngine(engine);
|
||||
v->u.rail.railtype = e->railtype;
|
||||
v->u.rail.railtype = GetEngine(engine)->railtype;
|
||||
|
||||
v->build_year = _cur_year;
|
||||
v->type = VEH_Train;
|
||||
|
@ -861,8 +858,8 @@ static Vehicle *FindGoodVehiclePos(const Vehicle *src)
|
|||
/** Move a rail vehicle around inside the depot.
|
||||
* @param x,y unused
|
||||
* @param p1 various bitstuffed elements
|
||||
* - p1 (bit 0 - 15) source vehicle index (p1 & 0xFFFF)
|
||||
* - p1 (bit 16 - 31) what wagon to put the source wagon AFTER (p1 & 0xFFFF0000) XXX - 0xFFFF0000 to make a new line
|
||||
* - p1 (bit 0 - 15) source vehicle index
|
||||
* - p1 (bit 16 - 31) what wagon to put the source wagon AFTER, XXX - INVALID_VEHICLE to make a new line
|
||||
* @param p2 (bit 0) move all vehicles following the source vehicle
|
||||
*/
|
||||
int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||
|
@ -898,7 +895,7 @@ int32 CmdMoveRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
if (src == dst) return 0;
|
||||
|
||||
/* 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;
|
||||
|
||||
/* locate the head of the two chains */
|
||||
|
@ -1293,7 +1290,8 @@ static void UpdateVarsAfterSwap(Vehicle *v)
|
|||
EndVehicleMove(v);
|
||||
}
|
||||
|
||||
static void SetLastSpeed(Vehicle *v, int spd) {
|
||||
static void SetLastSpeed(Vehicle* v, int spd)
|
||||
{
|
||||
int old = v->u.rail.last_speed;
|
||||
if (spd != old) {
|
||||
v->u.rail.last_speed = spd;
|
||||
|
@ -1377,24 +1375,18 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
|
|||
/* Check if the vehicle is a train and is on the tile we are testing */
|
||||
static void *TestTrainOnCrossing(Vehicle *v, void *data)
|
||||
{
|
||||
if (v->tile != *(const TileIndex*)data || v->type != VEH_Train)
|
||||
return NULL;
|
||||
|
||||
if (v->tile != *(const TileIndex*)data || v->type != VEH_Train) return NULL;
|
||||
return v;
|
||||
}
|
||||
|
||||
static void DisableTrainCrossing(TileIndex tile)
|
||||
{
|
||||
/* Test if we have a rail/road-crossing */
|
||||
if (IsTileType(tile, MP_STREET) && IsLevelCrossing(tile)) {
|
||||
/* Check if there is a train on the tile itself */
|
||||
if (VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL) {
|
||||
/* If light is on, switch light off */
|
||||
if (GB(_m[tile].m5, 2, 1) != 0) {
|
||||
SB(_m[tile].m5, 2, 1, 0);
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
}
|
||||
if (IsTileType(tile, MP_STREET) &&
|
||||
IsLevelCrossing(tile) &&
|
||||
VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL && // empty?
|
||||
GB(_m[tile].m5, 2, 1) != 0) { // Lights on?
|
||||
SB(_m[tile].m5, 2, 1, 0); // Switch lights off
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1406,34 +1398,35 @@ static void DisableTrainCrossing(TileIndex tile)
|
|||
*/
|
||||
static void AdvanceWagons(Vehicle *v, bool before)
|
||||
{
|
||||
Vehicle *base, *first, *last, *tempnext;
|
||||
int i, length;
|
||||
int differential;
|
||||
Vehicle* base;
|
||||
Vehicle* first;
|
||||
int length;
|
||||
|
||||
base = v;
|
||||
first = base->next;
|
||||
length = CountVehiclesInChain(v);
|
||||
|
||||
while (length > 2) {
|
||||
Vehicle* last;
|
||||
int differential;
|
||||
int i;
|
||||
|
||||
// find pairwise matching wagon
|
||||
// start<>end, start+1<>end-1, ... */
|
||||
last = first;
|
||||
for (i = length - 3; i; i--) {
|
||||
last = last->next;
|
||||
}
|
||||
for (i = length - 3; i > 0; i--) last = last->next;
|
||||
|
||||
differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
|
||||
if (before)
|
||||
differential *= -1;
|
||||
if (before) differential *= -1;
|
||||
|
||||
if (differential > 0) {
|
||||
Vehicle* tempnext;
|
||||
|
||||
// disconnect last car to make sure only this subset moves
|
||||
tempnext = last->next;
|
||||
last->next = NULL;
|
||||
|
||||
for (i = 0; i < differential; i++) {
|
||||
TrainController(first);
|
||||
}
|
||||
for (i = 0; i < differential; i++) TrainController(first);
|
||||
|
||||
last->next = tempnext;
|
||||
}
|
||||
|
@ -1450,15 +1443,13 @@ static TileIndex GetVehicleTileOutOfTunnel(const Vehicle* v, bool reverse)
|
|||
byte direction = (!reverse) ? DirToDiagdir(v->direction) : ReverseDiagdir(v->direction >> 1);
|
||||
TileIndexDiff delta = TileOffsByDir(direction);
|
||||
|
||||
if (v->u.rail.track != 0x40)
|
||||
return v->tile;
|
||||
if (v->u.rail.track != 0x40) return v->tile;
|
||||
|
||||
for (tile = v->tile;; tile += delta) {
|
||||
if (IsTunnelTile(tile) && GB(_m[tile].m5, 0, 2) != direction && GetTileZ(tile) == v->z_pos)
|
||||
break;
|
||||
}
|
||||
return tile;
|
||||
|
||||
}
|
||||
|
||||
static void ReverseTrainDirection(Vehicle *v)
|
||||
|
@ -1491,7 +1482,7 @@ static void ReverseTrainDirection(Vehicle *v)
|
|||
return;
|
||||
}
|
||||
|
||||
// we found a way out of the pbs block
|
||||
// we found a way out of the pbs block
|
||||
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
|
||||
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED)) {
|
||||
CLRBIT(v->u.rail.flags, VRF_REVERSING);
|
||||
|
@ -1610,8 +1601,7 @@ int32 CmdForceTrainProceed(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC)
|
||||
v->u.rail.force_proceed = 0x50;
|
||||
if (flags & DC_EXEC) v->u.rail.force_proceed = 0x50;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1676,8 +1666,7 @@ int32 CmdRefitRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
};
|
||||
|
||||
if (amount != 0) {
|
||||
if (new_cid != v->cargo_type)
|
||||
cost += (_price.build_railvehicle >> 8);
|
||||
if (new_cid != v->cargo_type) cost += _price.build_railvehicle >> 8;
|
||||
num += amount;
|
||||
if (flags & DC_EXEC) {
|
||||
v->cargo_count = 0;
|
||||
|
@ -1700,8 +1689,8 @@ typedef struct TrainFindDepotData {
|
|||
TileIndex tile;
|
||||
PlayerID owner;
|
||||
/**
|
||||
* true if reversing is necesarry for the train to get to this depot This
|
||||
* value is unused when new depot finding and NPF are both disabled
|
||||
* true if reversing is necessary for the train to get to this depot
|
||||
* This value is unused when new depot finding and NPF are both disabled
|
||||
*/
|
||||
bool reverse;
|
||||
} TrainFindDepotData;
|
||||
|
@ -1763,13 +1752,13 @@ static TrainFindDepotData FindClosestTrainDepot(Vehicle *v)
|
|||
} else {
|
||||
// search in the forward direction first.
|
||||
i = v->direction >> 1;
|
||||
if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) { i = (i - 1) & 3; }
|
||||
if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) i = (i - 1) & 3;
|
||||
NewTrainPathfind(tile, 0, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
|
||||
if (tfdd.best_length == (uint)-1){
|
||||
tfdd.reverse = true;
|
||||
// search in backwards direction
|
||||
i = (v->direction^4) >> 1;
|
||||
if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) { i = (i - 1) & 3; }
|
||||
if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) i = (i - 1) & 3;
|
||||
NewTrainPathfind(tile, 0, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
|
||||
}
|
||||
}
|
||||
|
@ -1880,8 +1869,10 @@ static void HandleLocomotiveSmokeCloud(const Vehicle* v)
|
|||
if ((RailVehInfo(engtype)->flags & RVI_WAGON && effect_type == 0) ||
|
||||
disable_effect ||
|
||||
GetEngine(engtype)->railtype > RAILTYPE_RAIL ||
|
||||
(v->vehstatus & VS_HIDDEN) || (v->u.rail.track & 0xC0))
|
||||
v->vehstatus & VS_HIDDEN ||
|
||||
v->u.rail.track & 0xC0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// No smoke in depots or tunnels
|
||||
if (IsTileDepotType(v->tile, TRANSPORT_RAIL) || IsTunnelTile(v->tile))
|
||||
|
@ -1952,9 +1943,9 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
|||
Vehicle *u;
|
||||
|
||||
// bail out if not all wagons are in the same depot or not in a depot at all
|
||||
for (u = v; u != NULL; u = u->next)
|
||||
if (u->u.rail.track != 0x80 || u->tile != v->tile)
|
||||
return false;
|
||||
for (u = v; u != NULL; u = u->next) {
|
||||
if (u->u.rail.track != 0x80 || u->tile != v->tile) return false;
|
||||
}
|
||||
|
||||
if (v->u.rail.force_proceed == 0) {
|
||||
Trackdir trackdir = GetVehicleTrackdir(v);
|
||||
|
@ -1970,8 +1961,7 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
|||
NPFFindStationOrTileData fstd;
|
||||
NPFFoundTargetData ftd;
|
||||
|
||||
if (PBSTileUnavail(v->tile) & (1 << trackdir))
|
||||
return true;
|
||||
if (PBSTileUnavail(v->tile) & (1 << trackdir)) return true;
|
||||
|
||||
NPFFillWithOrderData(&fstd, v);
|
||||
|
||||
|
@ -1980,9 +1970,9 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
|||
|
||||
// we found a way out of the pbs block
|
||||
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_EXIT)) {
|
||||
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED) || NPFGetFlag(&ftd.node, NPF_FLAG_PBS_RED))
|
||||
if (NPFGetFlag(&ftd.node, NPF_FLAG_PBS_BLOCKED) || NPFGetFlag(&ftd.node, NPF_FLAG_PBS_RED)) {
|
||||
return true;
|
||||
else {
|
||||
} else {
|
||||
v->u.rail.pbs_end_tile = ftd.node.tile;
|
||||
v->u.rail.pbs_end_trackdir = ftd.node.direction;
|
||||
goto green;
|
||||
|
@ -1990,7 +1980,6 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (UpdateSignalsOnSegment(v->tile, v->direction)) {
|
||||
InvalidateWindowClasses(WC_TRAINS_LIST);
|
||||
return true;
|
||||
|
@ -2002,8 +1991,7 @@ green:
|
|||
TrainPlayLeaveStationSound(v);
|
||||
|
||||
v->u.rail.track = 1;
|
||||
if (v->direction & 2)
|
||||
v->u.rail.track = 2;
|
||||
if (v->direction & 2) v->u.rail.track = 2;
|
||||
|
||||
v->vehstatus &= ~VS_HIDDEN;
|
||||
v->cur_speed = 0;
|
||||
|
@ -2057,12 +2045,12 @@ static bool NtpCallbFindStation(TileIndex tile, TrainTrackFollowerData *ttfd, in
|
|||
|
||||
static void FillWithStationData(TrainTrackFollowerData* fd, const Vehicle* v)
|
||||
{
|
||||
fd->dest_coords = v->dest_tile;
|
||||
if (v->current_order.type == OT_GOTO_STATION)
|
||||
fd->station_index = v->current_order.station;
|
||||
else
|
||||
fd->station_index = INVALID_STATION;
|
||||
|
||||
fd->dest_coords = v->dest_tile;
|
||||
if (v->current_order.type == OT_GOTO_STATION) {
|
||||
fd->station_index = v->current_order.station;
|
||||
} else {
|
||||
fd->station_index = INVALID_STATION;
|
||||
}
|
||||
}
|
||||
|
||||
static const byte _initial_tile_subcoord[6][4][3] = {
|
||||
|
@ -2095,10 +2083,10 @@ static const byte _pick_track_table[6] = {1, 3, 2, 2, 0, 0};
|
|||
#if !defined(_MSC_VER)
|
||||
unsigned int _rdtsc()
|
||||
{
|
||||
unsigned int high, low;
|
||||
unsigned int high, low;
|
||||
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high));
|
||||
return low;
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (low), "=d" (high));
|
||||
return low;
|
||||
}
|
||||
#else
|
||||
#ifndef _M_AMD64
|
||||
|
@ -2332,8 +2320,7 @@ static bool ProcessTrainOrder(Vehicle *v)
|
|||
}
|
||||
|
||||
// Get the current order
|
||||
if (v->cur_order_index >= v->num_orders)
|
||||
v->cur_order_index = 0;
|
||||
if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
|
||||
|
||||
order = GetVehicleOrder(v, v->cur_order_index);
|
||||
|
||||
|
@ -2407,27 +2394,22 @@ static void MarkTrainDirty(Vehicle *v)
|
|||
do {
|
||||
v->cur_image = GetTrainImage(v, v->direction);
|
||||
MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
|
||||
} while ( (v=v->next) != NULL);
|
||||
} while ((v = v->next) != NULL);
|
||||
}
|
||||
|
||||
static void HandleTrainLoading(Vehicle *v, bool mode)
|
||||
{
|
||||
if (v->current_order.type == OT_NOTHING)
|
||||
return;
|
||||
if (v->current_order.type == OT_NOTHING) return;
|
||||
|
||||
if (v->current_order.type != OT_DUMMY) {
|
||||
if (v->current_order.type != OT_LOADING)
|
||||
return;
|
||||
|
||||
if (mode)
|
||||
return;
|
||||
if (v->current_order.type != OT_LOADING) return;
|
||||
if (mode) return;
|
||||
|
||||
// don't mark the train as lost if we're loading on the final station.
|
||||
if (v->current_order.flags & OF_NON_STOP)
|
||||
v->u.rail.days_since_order_progr = 0;
|
||||
|
||||
if (--v->load_unload_time_rem)
|
||||
return;
|
||||
if (--v->load_unload_time_rem) return;
|
||||
|
||||
if (v->current_order.flags & OF_FULL_LOAD && CanFillVehicle(v)) {
|
||||
v->u.rail.days_since_order_progr = 0; /* Prevent a train lost message for full loading trains */
|
||||
|
@ -2451,8 +2433,7 @@ static void HandleTrainLoading(Vehicle *v, bool mode)
|
|||
v->current_order.flags = 0;
|
||||
|
||||
// If this was not the final order, don't remove it from the list.
|
||||
if (!(b.flags & OF_NON_STOP))
|
||||
return;
|
||||
if (!(b.flags & OF_NON_STOP)) return;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2467,15 +2448,17 @@ static int UpdateTrainSpeed(Vehicle *v)
|
|||
uint accel;
|
||||
|
||||
if (v->vehstatus & VS_STOPPED || HASBIT(v->u.rail.flags, VRF_REVERSING)) {
|
||||
if (_patches.realistic_acceleration)
|
||||
if (_patches.realistic_acceleration) {
|
||||
accel = GetTrainAcceleration(v, AM_BRAKE) * 2;
|
||||
else
|
||||
} else {
|
||||
accel = v->acceleration * -2;
|
||||
}
|
||||
} else {
|
||||
if (_patches.realistic_acceleration)
|
||||
if (_patches.realistic_acceleration) {
|
||||
accel = GetTrainAcceleration(v, AM_ACCEL);
|
||||
else
|
||||
} else {
|
||||
accel = v->acceleration;
|
||||
}
|
||||
}
|
||||
|
||||
spd = v->subspeed + accel * 2;
|
||||
|
@ -2682,8 +2665,7 @@ static void AffectSpeedByDirChange(Vehicle *v, byte new_dir)
|
|||
static void AffectSpeedByZChange(Vehicle *v, byte old_z)
|
||||
{
|
||||
const RailtypeSlowdownParams *rsp;
|
||||
if (old_z == v->z_pos || _patches.realistic_acceleration)
|
||||
return;
|
||||
if (old_z == v->z_pos || _patches.realistic_acceleration) return;
|
||||
|
||||
rsp = &_railtype_slowdown[v->u.rail.railtype];
|
||||
|
||||
|
@ -2691,8 +2673,7 @@ static void AffectSpeedByZChange(Vehicle *v, byte old_z)
|
|||
v->cur_speed -= (v->cur_speed * rsp->z_up >> 8);
|
||||
} else {
|
||||
uint16 spd = v->cur_speed + rsp->z_down;
|
||||
if (spd <= v->max_speed)
|
||||
v->cur_speed = spd;
|
||||
if (spd <= v->max_speed) v->cur_speed = spd;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2703,9 +2684,8 @@ static const byte _otherside_signal_directions[14] = {
|
|||
|
||||
static void TrainMovedChangeSignals(TileIndex tile, int dir)
|
||||
{
|
||||
int i;
|
||||
if (IsTileType(tile, MP_RAILWAY) && (_m[tile].m5 & 0xC0) == 0x40) {
|
||||
i = FindFirstBit2x64((_m[tile].m5+(_m[tile].m5<<8)) & _reachable_tracks[dir]);
|
||||
uint i = FindFirstBit2x64((_m[tile].m5 + (_m[tile].m5 << 8)) & _reachable_tracks[dir]);
|
||||
UpdateSignalsOnSegment(tile, _otherside_signal_directions[i]);
|
||||
}
|
||||
}
|
||||
|
@ -2770,11 +2750,10 @@ static void CheckTrainCollision(Vehicle *v)
|
|||
TrainCollideChecker tcc;
|
||||
Vehicle *coll;
|
||||
Vehicle *realcoll;
|
||||
int num;
|
||||
uint num;
|
||||
|
||||
/* can't collide in depot */
|
||||
if (v->u.rail.track == 0x80)
|
||||
return;
|
||||
if (v->u.rail.track == 0x80) return;
|
||||
|
||||
assert(v->u.rail.track == 0x40 || TileVirtXY(v->x_pos, v->y_pos) == v->tile);
|
||||
|
||||
|
@ -2783,9 +2762,7 @@ static void CheckTrainCollision(Vehicle *v)
|
|||
|
||||
/* find colliding vehicle */
|
||||
realcoll = VehicleFromPos(TileVirtXY(v->x_pos, v->y_pos), &tcc, FindTrainCollideEnum);
|
||||
if (realcoll == NULL)
|
||||
return;
|
||||
|
||||
if (realcoll == NULL) return;
|
||||
|
||||
coll = GetFirstVehicleInChain(realcoll);
|
||||
|
||||
|
@ -2801,12 +2778,9 @@ static void CheckTrainCollision(Vehicle *v)
|
|||
num += 2 + CountPassengersInTrain(coll);
|
||||
|
||||
SetVehicleCrashed(v);
|
||||
if (coll->subtype == TS_Front_Engine)
|
||||
SetVehicleCrashed(coll);
|
||||
|
||||
if (coll->subtype == TS_Front_Engine) SetVehicleCrashed(coll);
|
||||
|
||||
SetDParam(0, num);
|
||||
|
||||
AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
|
||||
NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
|
||||
v->index,
|
||||
|
@ -3052,9 +3026,7 @@ green_light:
|
|||
|
||||
invalid_rail:
|
||||
/* We've reached end of line?? */
|
||||
if (prev != NULL) {
|
||||
error("!Disconnecting train");
|
||||
}
|
||||
if (prev != NULL) error("!Disconnecting train");
|
||||
goto reverse_train_direction;
|
||||
|
||||
red_light: {
|
||||
|
@ -3091,7 +3063,6 @@ reverse_train_direction:
|
|||
v->cur_speed = 0;
|
||||
v->subspeed = 0;
|
||||
ReverseTrainDirection(v);
|
||||
|
||||
}
|
||||
|
||||
extern TileIndex CheckTunnelBusy(TileIndex tile, uint *length);
|
||||
|
@ -3188,7 +3159,7 @@ static void HandleCrashedTrain(Vehicle *v)
|
|||
uint32 r;
|
||||
Vehicle *u;
|
||||
|
||||
if ( (state == 4) && (v->u.rail.track != 0x40) ) {
|
||||
if (state == 4 && v->u.rail.track != 0x40) {
|
||||
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
|
||||
}
|
||||
|
||||
|
@ -3272,13 +3243,8 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
|
|||
v->vehstatus &= ~VS_TRAIN_SLOWING;
|
||||
}
|
||||
|
||||
// exit if inside a tunnel
|
||||
if (v->u.rail.track & 0x40)
|
||||
return true;
|
||||
|
||||
// exit if inside a depot
|
||||
if (v->u.rail.track & 0x80)
|
||||
return true;
|
||||
if (v->u.rail.track & 0x40) return true; // exit if inside a tunnel
|
||||
if (v->u.rail.track & 0x80) return true; // exit if inside a depot
|
||||
|
||||
tile = v->tile;
|
||||
|
||||
|
@ -3312,7 +3278,7 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
|
|||
x = v->x_pos & 0xF;
|
||||
y = v->y_pos & 0xF;
|
||||
|
||||
switch(v->direction) {
|
||||
switch (v->direction) {
|
||||
case 0:
|
||||
x = (~x) + (~y) + 24;
|
||||
break;
|
||||
|
@ -3494,8 +3460,7 @@ void TrainEnterDepot(Vehicle *v, TileIndex tile)
|
|||
{
|
||||
SetSignalsOnBothDir(tile, _depot_track_ind[GB(_m[tile].m5, 0, 2)]);
|
||||
|
||||
if (v->subtype != TS_Front_Engine)
|
||||
v = GetFirstVehicleInChain(v);
|
||||
if (v->subtype != TS_Front_Engine) v = GetFirstVehicleInChain(v);
|
||||
|
||||
VehicleServiceInDepot(v);
|
||||
|
||||
|
@ -3539,23 +3504,12 @@ static void CheckIfTrainNeedsService(Vehicle *v)
|
|||
const Depot* depot;
|
||||
TrainFindDepotData tfdd;
|
||||
|
||||
if (PBSTileReserved(v->tile) & v->u.rail.track)
|
||||
return;
|
||||
|
||||
if (v->u.rail.pbs_status == PBS_STAT_HAS_PATH)
|
||||
return;
|
||||
|
||||
if (_patches.servint_trains == 0)
|
||||
return;
|
||||
|
||||
if (!VehicleNeedsService(v))
|
||||
return;
|
||||
|
||||
if (v->vehstatus & VS_STOPPED)
|
||||
return;
|
||||
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v))
|
||||
return;
|
||||
if (PBSTileReserved(v->tile) & v->u.rail.track) return;
|
||||
if (v->u.rail.pbs_status == PBS_STAT_HAS_PATH) return;
|
||||
if (_patches.servint_trains == 0) return;
|
||||
if (!VehicleNeedsService(v)) return;
|
||||
if (v->vehstatus & VS_STOPPED) return;
|
||||
if (_patches.gotodepot && VehicleHasDepotOrders(v)) return;
|
||||
|
||||
// Don't interfere with a depot visit scheduled by the user, or a
|
||||
// depot visit by the order list.
|
||||
|
@ -3632,8 +3586,9 @@ void OnNewDay_Train(Vehicle *v)
|
|||
|
||||
/* update destination */
|
||||
if (v->current_order.type == OT_GOTO_STATION &&
|
||||
(tile = GetStation(v->current_order.station)->train_tile) != 0)
|
||||
v->dest_tile = tile;
|
||||
(tile = GetStation(v->current_order.station)->train_tile) != 0) {
|
||||
v->dest_tile = tile;
|
||||
}
|
||||
|
||||
if ((v->vehstatus & VS_STOPPED) == 0) {
|
||||
/* running costs */
|
||||
|
|
|
@ -150,8 +150,7 @@ void CcBuildLoco(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
{
|
||||
const Vehicle* v;
|
||||
|
||||
if (!success)
|
||||
return;
|
||||
if (!success) return;
|
||||
|
||||
v = GetVehicle(_new_train_id);
|
||||
if (tile == _backup_orders_tile) {
|
||||
|
@ -163,11 +162,7 @@ void CcBuildLoco(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
|||
|
||||
void CcCloneTrain(bool success, uint tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) {
|
||||
const Vehicle* v = GetVehicle(_new_train_id);
|
||||
|
||||
ShowTrainViewWindow(v);
|
||||
}
|
||||
if (success) ShowTrainViewWindow(GetVehicle(_new_train_id));
|
||||
}
|
||||
|
||||
static void engine_drawing_loop(int *x, int *y, int *pos, int *sel,
|
||||
|
|
|
@ -306,8 +306,7 @@ static void DrawTile_Trees(TileInfo *ti)
|
|||
i = (ti->map5 >> 6) + 1;
|
||||
do {
|
||||
uint32 image = s[0] + (--i == 0 ? GB(ti->map5, 0, 3) : 3);
|
||||
if (_display_opt & DO_TRANS_BUILDINGS)
|
||||
MAKE_TRANSPARENT(image);
|
||||
if (_display_opt & DO_TRANS_BUILDINGS) MAKE_TRANSPARENT(image);
|
||||
te[i].image = image;
|
||||
te[i].x = d[0];
|
||||
te[i].y = d[1];
|
||||
|
|
|
@ -58,10 +58,12 @@ const Bridge orig_bridge[] = {
|
|||
// basically the cost delta is 1,1, 1, 2,2, 3,3,3, 4,4,4,4, 5,5,5,5,5, 6,6,6,6,6,6, 7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,
|
||||
int CalcBridgeLenCostFactor(int x)
|
||||
{
|
||||
int n,r;
|
||||
int n;
|
||||
int r;
|
||||
|
||||
if (x < 2) return x;
|
||||
x -= 2;
|
||||
for(n=0,r=2;;n++) {
|
||||
for (n = 0, r = 2;; n++) {
|
||||
if (x <= n) return r + x * n;
|
||||
r += n * n;
|
||||
x -= n;
|
||||
|
@ -115,79 +117,68 @@ static inline int GetBridgeType(TileIndex tile)
|
|||
*/
|
||||
static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
|
||||
{
|
||||
if (!IsSteepTileh(tileh)) { // disable building on very steep slopes
|
||||
if (IsSteepTileh(tileh)) return CMD_ERROR;
|
||||
|
||||
if (is_start_tile) {
|
||||
/* check slope at start tile
|
||||
- no extra cost
|
||||
- direction X: tiles 0,12
|
||||
- direction Y: tiles 0, 9
|
||||
*/
|
||||
if ((direction?0x201:0x1001) & (1 << tileh))
|
||||
return 0;
|
||||
if (is_start_tile) {
|
||||
/* check slope at start tile
|
||||
- no extra cost
|
||||
- direction X: tiles 0, 12
|
||||
- direction Y: tiles 0, 9
|
||||
*/
|
||||
if ((direction ? 0x201 : 0x1001) & (1 << tileh)) return 0;
|
||||
|
||||
// disallow certain start tiles to avoid certain crooked bridges
|
||||
if (tileh == 2)
|
||||
return CMD_ERROR;
|
||||
// disallow certain start tiles to avoid certain crooked bridges
|
||||
if (tileh == 2) return CMD_ERROR;
|
||||
} else {
|
||||
/* check slope at end tile
|
||||
- no extra cost
|
||||
- direction X: tiles 0, 3
|
||||
- direction Y: tiles 0, 6
|
||||
*/
|
||||
if ((direction? 0x41 : 0x9) & (1 << tileh)) return 0;
|
||||
|
||||
}
|
||||
else {
|
||||
/* check slope at end tile
|
||||
- no extra cost
|
||||
- direction X: tiles 0, 3
|
||||
- direction Y: tiles 0, 6
|
||||
*/
|
||||
if ((direction?0x41:0x9) & (1 << tileh))
|
||||
return 0;
|
||||
|
||||
// disallow certain end tiles to avoid certain crooked bridges
|
||||
if (tileh == 8)
|
||||
return CMD_ERROR;
|
||||
|
||||
}
|
||||
|
||||
/* disallow common start/end tiles to avoid certain crooked bridges e.g.
|
||||
* start-tile: X 2,1 Y 2,4 (2 was disabled before)
|
||||
* end-tile: X 8,4 Y 8,1 (8 was disabled before)
|
||||
*/
|
||||
if ( (tileh == 1 && (is_start_tile != (bool)direction)) ||
|
||||
(tileh == 4 && (is_start_tile == (bool)direction)) )
|
||||
return CMD_ERROR;
|
||||
|
||||
// slope foundations
|
||||
if (BRIDGE_FULL_LEVELED_FOUNDATION & (1 << tileh) || BRIDGE_PARTLY_LEVELED_FOUNDATION & (1 << tileh))
|
||||
return _price.terraform;
|
||||
// disallow certain end tiles to avoid certain crooked bridges
|
||||
if (tileh == 8) return CMD_ERROR;
|
||||
}
|
||||
|
||||
/* disallow common start/end tiles to avoid certain crooked bridges e.g.
|
||||
* start-tile: X 2,1 Y 2,4 (2 was disabled before)
|
||||
* end-tile: X 8,4 Y 8,1 (8 was disabled before)
|
||||
*/
|
||||
if ((tileh == 1 && is_start_tile != (bool)direction) ||
|
||||
(tileh == 4 && is_start_tile == (bool)direction)) {
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
||||
// slope foundations
|
||||
if (BRIDGE_FULL_LEVELED_FOUNDATION & (1 << tileh) || BRIDGE_PARTLY_LEVELED_FOUNDATION & (1 << tileh))
|
||||
return _price.terraform;
|
||||
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
||||
uint32 GetBridgeLength(TileIndex begin, TileIndex end)
|
||||
{
|
||||
int x1, y1, x2, y2; // coordinates of starting and end tiles
|
||||
x1 = TileX(begin);
|
||||
y1 = TileY(begin);
|
||||
x2 = TileX(end);
|
||||
y2 = TileY(end);
|
||||
int x1 = TileX(begin);
|
||||
int y1 = TileY(begin);
|
||||
int x2 = TileX(end);
|
||||
int y2 = TileY(end);
|
||||
|
||||
return abs((x2 + y2 - x1 - y1)) - 1;
|
||||
return abs(x2 + y2 - x1 - y1) - 1;
|
||||
}
|
||||
|
||||
bool CheckBridge_Stuff(byte bridge_type, int bridge_len)
|
||||
bool CheckBridge_Stuff(byte bridge_type, uint bridge_len)
|
||||
{
|
||||
int max; // max possible length of a bridge (with patch 100)
|
||||
const Bridge *b = &_bridge[bridge_type];
|
||||
uint max; // max possible length of a bridge (with patch 100)
|
||||
|
||||
if (bridge_type >= MAX_BRIDGES) return false;
|
||||
if (b->avail_year > _cur_year) return false;
|
||||
|
||||
max = b->max_length;
|
||||
if (max >= 16 && _patches.longbridges)
|
||||
max = 100;
|
||||
if (max >= 16 && _patches.longbridges) max = 100;
|
||||
|
||||
if (bridge_len < b->min_length || bridge_len > max) return false;
|
||||
|
||||
return true;
|
||||
return b->min_length <= bridge_len && bridge_len <= max;
|
||||
}
|
||||
|
||||
/** Build a Bridge
|
||||
|
@ -203,9 +194,10 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
byte rail_or_road, railtype, m5;
|
||||
int sx,sy;
|
||||
TileInfo ti_start, ti_end, ti; /* OPT: only 2 of those are ever used */
|
||||
int bridge_len, odd_middle_part;
|
||||
uint bridge_len;
|
||||
uint odd_middle_part;
|
||||
uint direction;
|
||||
int i;
|
||||
uint i;
|
||||
int32 cost, terraformcost, ret;
|
||||
bool allow_on_slopes;
|
||||
|
||||
|
@ -233,8 +225,7 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
/* check if valid, and make sure that (x,y) are smaller than (sx,sy) */
|
||||
if (x == sx) {
|
||||
if (y == sy)
|
||||
return_cmd_error(STR_5008_CANNOT_START_AND_END_ON);
|
||||
if (y == sy) return_cmd_error(STR_5008_CANNOT_START_AND_END_ON);
|
||||
direction = 1;
|
||||
if (y > sy) {
|
||||
intswap(y,sy);
|
||||
|
@ -245,8 +236,9 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
intswap(y,sy);
|
||||
intswap(x,sx);
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
return_cmd_error(STR_500A_START_AND_END_MUST_BE_IN);
|
||||
}
|
||||
|
||||
/* set and test bridge length, availability */
|
||||
bridge_len = ((sx + sy - x - y) >> 4) - 1;
|
||||
|
@ -292,8 +284,8 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
/* Try and clear the end landscape */
|
||||
|
||||
if (CmdFailed(ret = DoCommandByTile(ti_end.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)))
|
||||
return CMD_ERROR;
|
||||
ret = DoCommandByTile(ti_end.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
|
||||
if (CmdFailed(ret)) return CMD_ERROR;
|
||||
cost += ret;
|
||||
|
||||
// false - end tile slope check
|
||||
|
@ -330,18 +322,17 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
for (i = 0; i != bridge_len; i++) {
|
||||
if (direction != 0) {
|
||||
y += 16;
|
||||
} else
|
||||
} else {
|
||||
x += 16;
|
||||
}
|
||||
|
||||
FindLandscapeHeight(&ti, x, y);
|
||||
|
||||
_error_message = STR_5009_LEVEL_LAND_OR_WATER_REQUIRED;
|
||||
if (ti.tileh != 0 && ti.z >= ti_start.z)
|
||||
return CMD_ERROR;
|
||||
if (ti.tileh != 0 && ti.z >= ti_start.z) return CMD_ERROR;
|
||||
|
||||
// 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;
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
@ -366,8 +357,8 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
} else {
|
||||
not_valid_below:;
|
||||
/* try and clear the middle landscape */
|
||||
if (CmdFailed(ret = DoCommandByTile(ti.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR)))
|
||||
return CMD_ERROR;
|
||||
ret = DoCommandByTile(ti.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
|
||||
if (CmdFailed(ret)) return CMD_ERROR;
|
||||
cost += ret;
|
||||
m5 = 0xC0;
|
||||
}
|
||||
|
@ -385,21 +376,21 @@ not_valid_below:;
|
|||
// bridge len 5: 0 2 5 3 1
|
||||
// bridge len 6: 0 2 3 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 - always as first, #1 - always as last (if len>1)
|
||||
// #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)
|
||||
|
||||
if(i==0) //first tile
|
||||
if (i == 0) { // first tile
|
||||
m5 = 0;
|
||||
else if (i==bridge_len-1) //last tile
|
||||
} else if (i == bridge_len - 1) { // last tile
|
||||
m5 = 1;
|
||||
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);
|
||||
else {
|
||||
} 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);
|
||||
} else {
|
||||
// generate #2 and #3 in turns [i%2==0], after the middle of odd bridge
|
||||
// this sequence swaps [... XOR (i>odd_middle_part)],
|
||||
// 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));
|
||||
}
|
||||
|
||||
_m[ti.tile].m2 = (bridge_type << 4) | m5;
|
||||
|
@ -409,7 +400,7 @@ not_valid_below:;
|
|||
}
|
||||
}
|
||||
|
||||
SetSignalsOnBothDir(ti_start.tile, (direction&1) ? 1 : 0);
|
||||
SetSignalsOnBothDir(ti_start.tile, (direction & 1) ? 1 : 0);
|
||||
|
||||
/* for human player that builds the bridge he gets a selection to choose from bridges (DC_QUERY_COST)
|
||||
It's unnecessary to execute this command every time for every bridge. So it is done only
|
||||
|
@ -496,7 +487,7 @@ static int32 DoBuildTunnel(int x, int y, int x2, int y2, uint32 flags, uint exc_
|
|||
z = ti.z;
|
||||
|
||||
if (exc_tile != 3) {
|
||||
if ( (direction ? 9U : 12U) != ti.tileh)
|
||||
if ((direction ? 9U : 12U) != ti.tileh)
|
||||
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
|
||||
ret = DoCommandByTile(ti.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
|
||||
if (CmdFailed(ret)) return CMD_ERROR;
|
||||
|
@ -504,11 +495,10 @@ static int32 DoBuildTunnel(int x, int y, int x2, int y2, uint32 flags, uint exc_
|
|||
}
|
||||
cost += _price.build_tunnel;
|
||||
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
if (direction) y2-=16; else x2-=16;
|
||||
|
||||
if (x2 == x && y2 == y)
|
||||
break;
|
||||
if (x2 == x && y2 == y) break;
|
||||
|
||||
FindLandscapeHeight(&ti, x2, y2);
|
||||
if (ti.z <= z) return CMD_ERROR;
|
||||
|
@ -519,15 +509,14 @@ static int32 DoBuildTunnel(int x, int y, int x2, int y2, uint32 flags, uint exc_
|
|||
cost += _price.build_tunnel;
|
||||
cost += (cost >> 3);
|
||||
|
||||
if (cost >= 400000000)
|
||||
cost = 400000000;
|
||||
if (cost >= 400000000) cost = 400000000;
|
||||
}
|
||||
|
||||
FindLandscapeHeight(&ti, x2, y2);
|
||||
if (ti.z != z) return CMD_ERROR;
|
||||
|
||||
if (exc_tile != 1) {
|
||||
if ( (direction ? 6U : 3U) != ti.tileh)
|
||||
if ((direction ? 6U : 3U) != ti.tileh)
|
||||
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
|
||||
|
||||
ret = DoCommandByTile(ti.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
|
||||
|
@ -559,7 +548,7 @@ static int32 DoBuildTunnel(int x, int y, int x2, int y2, uint32 flags, uint exc_
|
|||
/** Build Tunnel.
|
||||
* @param x,y start tile coord of tunnel
|
||||
* @param p1 railtype, 0x200 for road tunnel
|
||||
* @param p2 unused (XXX - ptr to uint that recieves end tile; wtf?????)
|
||||
* @param p2 unused
|
||||
*/
|
||||
int32 CmdBuildTunnel(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||
{
|
||||
|
@ -585,11 +574,12 @@ int32 CmdBuildTunnel(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
if (!EnsureNoVehicle(tiorg.tile))
|
||||
return CMD_ERROR;
|
||||
|
||||
if (!(direction=0, tiorg.tileh==12) &&
|
||||
!(direction++, tiorg.tileh==6) &&
|
||||
!(direction++, tiorg.tileh==3) &&
|
||||
!(direction++, tiorg.tileh==9) )
|
||||
if (!(direction=0, tiorg.tileh == 12) &&
|
||||
!(direction++, tiorg.tileh == 6) &&
|
||||
!(direction++, tiorg.tileh == 3) &&
|
||||
!(direction++, tiorg.tileh == 9)) {
|
||||
return_cmd_error(STR_500B_SITE_UNSUITABLE_FOR_TUNNEL);
|
||||
}
|
||||
|
||||
z = tiorg.z;
|
||||
do {
|
||||
|
@ -600,8 +590,7 @@ int32 CmdBuildTunnel(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
_build_tunnel_endtile = ti.tile;
|
||||
|
||||
|
||||
if (!EnsureNoVehicle(ti.tile))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(ti.tile)) return CMD_ERROR;
|
||||
|
||||
if (ti.tileh != _build_tunnel_tileh[direction]) {
|
||||
if (CmdFailed(DoCommandByTile(ti.tile, ti.tileh & ~_build_tunnel_tileh[direction], 0, flags, CMD_TERRAFORM_LAND)))
|
||||
|
@ -684,7 +673,7 @@ static int32 DoClearTunnel(TileIndex tile, uint32 flags)
|
|||
if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
|
||||
ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
|
||||
}
|
||||
return _price.clear_tunnel * (length + 1);
|
||||
return _price.clear_tunnel * (length + 1);
|
||||
}
|
||||
|
||||
static TileIndex FindEdgesOfBridge(TileIndex tile, TileIndex *endtile)
|
||||
|
@ -746,8 +735,7 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
|
|||
int32 cost;
|
||||
|
||||
// check for vehicles under bridge
|
||||
if (!EnsureNoVehicleZ(tile, TilePixelHeight(tile)))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicleZ(tile, TilePixelHeight(tile))) return CMD_ERROR;
|
||||
cost = _price.clear_water;
|
||||
if (flags & DC_EXEC) {
|
||||
_m[tile].m5 = _m[tile].m5 & ~0x38;
|
||||
|
@ -765,8 +753,7 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
|
|||
return CMD_ERROR;
|
||||
}
|
||||
|
||||
if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(endtile))
|
||||
return CMD_ERROR;
|
||||
if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(endtile)) return CMD_ERROR;
|
||||
|
||||
/* Make sure there's no vehicle on the bridge
|
||||
Omit tile and endtile, since these are already checked, thus solving the problem
|
||||
|
@ -775,7 +762,8 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
|
|||
tile += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
|
||||
endtile -= direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
|
||||
/* Bridges on slopes might have their Z-value offset..correct this */
|
||||
if ((v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8 + GetCorrectTileHeight(tile))) != NULL) {
|
||||
v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8 + GetCorrectTileHeight(tile));
|
||||
if (v != NULL) {
|
||||
VehicleInTheWayErrMsg(v);
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
@ -811,7 +799,7 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
|
|||
if (m5 & 0x40) {
|
||||
if (m5 & 0x20) {
|
||||
static const uint16 _new_data_table[] = {0x1002, 0x1001, 0x2005, 0x200A, 0, 0, 0, 0};
|
||||
new_data = _new_data_table[((m5 & 0x18) >> 2) | (m5&1)];
|
||||
new_data = _new_data_table[((m5 & 0x18) >> 2) | (m5 & 1)];
|
||||
} else {
|
||||
if (GB(m5, 3, 2) == 0) goto clear_it;
|
||||
new_data = (GetTileSlope(c, NULL) == 0) ? 0x6000 : 0x6001;
|
||||
|
@ -846,13 +834,11 @@ static int32 ClearTile_TunnelBridge(TileIndex tile, byte flags)
|
|||
byte m5 = _m[tile].m5;
|
||||
|
||||
if ((m5 & 0xF0) == 0) {
|
||||
if (flags & DC_AUTO)
|
||||
return_cmd_error(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST);
|
||||
if (flags & DC_AUTO) return_cmd_error(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST);
|
||||
|
||||
return DoClearTunnel(tile, flags);
|
||||
} else if (m5 & 0x80) {
|
||||
if (flags & DC_AUTO)
|
||||
return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
|
||||
if (flags & DC_AUTO) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
|
||||
|
||||
return DoClearBridge(tile, flags);
|
||||
}
|
||||
|
@ -896,7 +882,7 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
|
|||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
return _price.build_rail >> 1;
|
||||
} else if ((_m[tile].m5&0xC6) == 0x80) {
|
||||
} else if ((_m[tile].m5 & 0xC6) == 0x80) {
|
||||
TileIndex starttile;
|
||||
int32 cost;
|
||||
uint z = TilePixelHeight(tile);
|
||||
|
@ -908,7 +894,8 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
|
|||
// railway bridge
|
||||
starttile = tile = FindEdgesOfBridge(tile, &endtile);
|
||||
// Make sure there's no vehicle on the bridge
|
||||
if ((v=FindVehicleBetween(tile, endtile, z)) != NULL) {
|
||||
v = FindVehicleBetween(tile, endtile, z);
|
||||
if (v != NULL) {
|
||||
VehicleInTheWayErrMsg(v);
|
||||
return CMD_ERROR;
|
||||
}
|
||||
|
@ -929,7 +916,7 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
|
|||
}
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
cost += (_price.build_rail>>1);
|
||||
cost += _price.build_rail >> 1;
|
||||
tile += GB(_m[tile].m5, 0, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
|
||||
} while (tile <= endtile);
|
||||
|
||||
|
@ -1016,7 +1003,8 @@ static void DrawBridgePillars(const TileInfo *ti, int x, int y, int z)
|
|||
}
|
||||
}
|
||||
|
||||
uint GetBridgeFoundation(uint tileh, byte direction) {
|
||||
uint GetBridgeFoundation(uint tileh, byte direction)
|
||||
{
|
||||
int i;
|
||||
// normal level sloped building (7, 11, 13, 14)
|
||||
if (BRIDGE_FULL_LEVELED_FOUNDATION & (1 << tileh))
|
||||
|
@ -1089,7 +1077,6 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
|
|||
assert( (base_offset & 0x07) == 0x00);
|
||||
|
||||
if (!(ti->map5 & 0x40)) { // bridge ramps
|
||||
|
||||
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
|
||||
if (f) DrawFoundation(ti, f);
|
||||
|
@ -1228,11 +1215,10 @@ static uint GetSlopeZ_TunnelBridge(const TileInfo* ti)
|
|||
// to the side of the tunnel/bridge?
|
||||
if (IS_INT_INSIDE(y, 5, 10+1)) {
|
||||
// tunnel?
|
||||
if ( (ti->map5 & 0xF0) == 0)
|
||||
return z;
|
||||
if ((ti->map5 & 0xF0) == 0) return z;
|
||||
|
||||
// bridge?
|
||||
if ( ti->map5 & 0x80 ) {
|
||||
if (ti->map5 & 0x80) {
|
||||
// bridge ending?
|
||||
if (!(ti->map5 & 0x40)) {
|
||||
if (BRIDGE_FULL_LEVELED_FOUNDATION & (1 << tileh)) // 7, 11, 13, 14
|
||||
|
@ -1241,7 +1227,6 @@ static uint GetSlopeZ_TunnelBridge(const TileInfo* ti)
|
|||
// no ramp for bridge ending
|
||||
if ((BRIDGE_PARTLY_LEVELED_FOUNDATION & (1 << tileh) || BRIDGE_NO_FOUNDATION & (1 << tileh)) && tileh != 0) {
|
||||
return z + 8;
|
||||
|
||||
} else if (!(ti->map5 & 0x20)) { // northern / southern ending
|
||||
// ramp
|
||||
return (z + (x>>1) + 1);
|
||||
|
@ -1256,12 +1241,10 @@ static uint GetSlopeZ_TunnelBridge(const TileInfo* ti)
|
|||
if (tileh != 0) z += 8;
|
||||
|
||||
// keep the same elevation because we're on the bridge?
|
||||
if (_get_z_hint >= z + 8)
|
||||
return _get_z_hint;
|
||||
if (_get_z_hint >= z + 8) return _get_z_hint;
|
||||
|
||||
// actually on the bridge, but not yet in the shared area.
|
||||
if (!IS_INT_INSIDE(x, 5, 10+1))
|
||||
return GetBridgeHeight(ti) + 8;
|
||||
if (!IS_INT_INSIDE(x, 5, 10 + 1)) return GetBridgeHeight(ti) + 8;
|
||||
|
||||
// in the shared area, assume that we're below the bridge, cause otherwise the hint would've caught it.
|
||||
// if rail or road below then it means it's possibly build on slope below the bridge.
|
||||
|
@ -1279,21 +1262,21 @@ static uint GetSlopeZ_TunnelBridge(const TileInfo* ti)
|
|||
}
|
||||
} else {
|
||||
// if it's a bridge middle with transport route below, then we need to compensate for build on slopes
|
||||
if ( (ti->map5 & (0x80 + 0x40 + 0x20)) == (0x80 + 0x40 + 0x20)) {
|
||||
if ((ti->map5 & (0x80 | 0x40 | 0x20)) == (0x80 | 0x40 | 0x20)) {
|
||||
uint f;
|
||||
if (tileh != 0) z += 8;
|
||||
f = _bridge_foundations[ti->map5&1][tileh];
|
||||
f = _bridge_foundations[ti->map5 & 1][tileh];
|
||||
if (IS_BYTE_INSIDE(f, 1, 15)) return z;
|
||||
if (f != 0) tileh = _inclined_tileh[f - 15];
|
||||
}
|
||||
}
|
||||
|
||||
// default case
|
||||
z = ti->z;
|
||||
return GetPartialZ(ti->x & 0xF, ti->y & 0xF, tileh) + z;
|
||||
return GetPartialZ(ti->x & 0xF, ti->y & 0xF, tileh) + ti->z;
|
||||
}
|
||||
|
||||
static uint GetSlopeTileh_TunnelBridge(const TileInfo *ti) {
|
||||
static uint GetSlopeTileh_TunnelBridge(const TileInfo* ti)
|
||||
{
|
||||
// not accurate, but good enough for slope graphics drawing
|
||||
return 0;
|
||||
}
|
||||
|
@ -1363,7 +1346,7 @@ static void AnimateTile_TunnelBridge(TileIndex tile)
|
|||
static void TileLoop_TunnelBridge(TileIndex tile)
|
||||
{
|
||||
if (_opt.landscape == LT_HILLY) {
|
||||
if ( GetTileZ(tile) > _opt.snow_line) {
|
||||
if (GetTileZ(tile) > _opt.snow_line) {
|
||||
if (!(_m[tile].m4 & 0x80)) {
|
||||
_m[tile].m4 |= 0x80;
|
||||
MarkTileDirtyByTile(tile);
|
||||
|
@ -1407,29 +1390,30 @@ static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode
|
|||
result = 0;
|
||||
if (GB(m5, 1, 2) == mode) {
|
||||
/* Transport over the bridge is compatible */
|
||||
result = m5&1 ? 0x202 : 0x101;
|
||||
result = m5 & 1 ? 0x202 : 0x101;
|
||||
}
|
||||
if (m5 & 0x40) {
|
||||
/* Bridge middle part */
|
||||
if (!(m5 & 0x20)) {
|
||||
/* Clear ground or water underneath */
|
||||
if ((m5 & 0x18) != 8)
|
||||
if ((m5 & 0x18) != 8) {
|
||||
/* Clear ground */
|
||||
return result;
|
||||
else
|
||||
if (mode != TRANSPORT_WATER)
|
||||
return result;
|
||||
} else {
|
||||
if (mode != TRANSPORT_WATER) return result;
|
||||
}
|
||||
} else {
|
||||
/* Transport underneath */
|
||||
if (GB(m5, 3, 2) != mode)
|
||||
if (GB(m5, 3, 2) != mode) {
|
||||
/* Incompatible transport underneath */
|
||||
return result;
|
||||
}
|
||||
}
|
||||
/* If we've not returned yet, there is a compatible
|
||||
* transport or water beneath, so we can add it to
|
||||
* result */
|
||||
/* Why is this xor'd ? Can't it just be or'd? */
|
||||
result ^= m5&1 ? 0x101 : 0x202;
|
||||
result ^= m5 & 1 ? 0x101 : 0x202;
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
|
@ -1445,7 +1429,7 @@ static void ChangeTileOwner_TunnelBridge(TileIndex tile, PlayerID old_player, Pl
|
|||
if (new_player != OWNER_SPECTATOR) {
|
||||
SetTileOwner(tile, new_player);
|
||||
} else {
|
||||
if((_m[tile].m5 & 0xC0)==0xC0) {
|
||||
if ((_m[tile].m5 & 0xC0) == 0xC0) {
|
||||
// the stuff BELOW the middle part is owned by the deleted player.
|
||||
if (!(_m[tile].m5 & (1 << 4 | 1 << 3))) {
|
||||
// convert railway into grass.
|
||||
|
@ -1556,9 +1540,8 @@ static uint32 VehicleEnter_TunnelBridge(Vehicle *v, TileIndex tile, int x, int y
|
|||
myabs(h - v->z_pos) > 2) { // high above the ground -> on the bridge
|
||||
/* modify speed of vehicle */
|
||||
uint16 spd = _bridge[GetBridgeType(tile)].speed;
|
||||
if (v->type == VEH_Road) spd<<=1;
|
||||
if (spd < v->cur_speed)
|
||||
v->cur_speed = spd;
|
||||
if (v->type == VEH_Road) spd *= 2;
|
||||
if (spd < v->cur_speed) v->cur_speed = spd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
117
vehicle.c
117
vehicle.c
|
@ -80,8 +80,7 @@ static void VehiclePoolNewBlock(uint start_item)
|
|||
{
|
||||
Vehicle *v;
|
||||
|
||||
FOR_ALL_VEHICLES_FROM(v, start_item)
|
||||
v->index = start_item++;
|
||||
FOR_ALL_VEHICLES_FROM(v, start_item) v->index = start_item++;
|
||||
}
|
||||
|
||||
/* Initialize the vehicle-pool */
|
||||
|
@ -230,9 +229,7 @@ void AfterLoadVehicles(void)
|
|||
case VEH_Aircraft:
|
||||
if (v->subtype == 0 || v->subtype == 2) {
|
||||
v->cur_image = GetAircraftImage(v, v->direction);
|
||||
if (v->next != NULL) {
|
||||
v->next->cur_image = v->cur_image;
|
||||
}
|
||||
if (v->next != NULL) v->next->cur_image = v->cur_image;
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
|
@ -325,12 +322,14 @@ static Vehicle *AllocateSingleVehicle(VehicleID *skip_vehicles)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Vehicle *AllocateVehicle(void)
|
||||
{
|
||||
VehicleID counter = 0;
|
||||
return AllocateSingleVehicle(&counter);
|
||||
}
|
||||
|
||||
|
||||
/** Allocates a lot of vehicles and frees them again
|
||||
* @param vl pointer to an array of vehicles to get allocated. Can be NULL if the vehicles aren't needed (makes it test only)
|
||||
* @param num number of vehicles to allocate room for
|
||||
|
@ -359,7 +358,6 @@ bool AllocateVehicles(Vehicle **vl, int num)
|
|||
void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc)
|
||||
{
|
||||
int x,y,x2,y2;
|
||||
VehicleID veh;
|
||||
Point pt = RemapCoords(TileX(tile) * 16, TileY(tile) * 16, 0);
|
||||
|
||||
x2 = ((pt.x + 104) & 0x1F80) >> 7;
|
||||
|
@ -368,16 +366,16 @@ void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc)
|
|||
y2 = ((pt.y + 56) & 0xFC0);
|
||||
y = ((pt.y - 294) & 0xFC0);
|
||||
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
int xb = x;
|
||||
for(;;) {
|
||||
veh = _vehicle_position_hash[ (x+y)&0xFFFF ];
|
||||
for (;;) {
|
||||
VehicleID veh = _vehicle_position_hash[(x + y) & 0xFFFF];
|
||||
while (veh != INVALID_VEHICLE) {
|
||||
Vehicle *v = GetVehicle(veh);
|
||||
void *a;
|
||||
|
||||
if ((a = proc(v, data)) != NULL)
|
||||
return a;
|
||||
a = proc(v, data);
|
||||
if (a != NULL) return a;
|
||||
veh = v->next_hash;
|
||||
}
|
||||
|
||||
|
@ -408,8 +406,7 @@ void UpdateVehiclePosHash(Vehicle *v, int x, int 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)];
|
||||
|
||||
if (old_hash == new_hash)
|
||||
return;
|
||||
if (old_hash == new_hash) return;
|
||||
|
||||
/* remove from hash table? */
|
||||
if (old_hash != NULL) {
|
||||
|
@ -421,10 +418,11 @@ void UpdateVehiclePosHash(Vehicle *v, int x, int y)
|
|||
last = u;
|
||||
}
|
||||
|
||||
if (last == NULL)
|
||||
if (last == NULL) {
|
||||
*old_hash = v->next_hash;
|
||||
else
|
||||
} else {
|
||||
last->next_hash = v->next_hash;
|
||||
}
|
||||
}
|
||||
|
||||
/* insert into hash table? */
|
||||
|
@ -525,8 +523,8 @@ Vehicle *GetFirstVehicleInChain(const Vehicle *v)
|
|||
|
||||
uint CountVehiclesInChain(const Vehicle* v)
|
||||
{
|
||||
int count = 0;
|
||||
do count++; while ( (v=v->next) != NULL);
|
||||
uint count = 0;
|
||||
do count++; while ((v = v->next) != NULL);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -719,7 +717,7 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
|||
for(;;) {
|
||||
xb = x;
|
||||
for(;;) {
|
||||
veh = _vehicle_position_hash[ (x+y)&0xFFFF ];
|
||||
veh = _vehicle_position_hash[(x + y) & 0xFFFF];
|
||||
while (veh != INVALID_VEHICLE) {
|
||||
v = GetVehicle(veh);
|
||||
|
||||
|
@ -1411,9 +1409,10 @@ void CheckVehicleBreakdown(Vehicle *v)
|
|||
if ((rel_old >> 8) != (rel >> 8))
|
||||
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
if (v->breakdown_ctr != 0 || (v->vehstatus & VS_STOPPED) != 0 ||
|
||||
v->cur_speed < 5 || _game_mode == GM_MENU)
|
||||
return;
|
||||
if (v->breakdown_ctr != 0 || v->vehstatus & VS_STOPPED ||
|
||||
v->cur_speed < 5 || _game_mode == GM_MENU) {
|
||||
return;
|
||||
}
|
||||
|
||||
r = Random();
|
||||
|
||||
|
@ -1427,8 +1426,7 @@ void CheckVehicleBreakdown(Vehicle *v)
|
|||
if (v->type == VEH_Ship) rel += 0x6666;
|
||||
|
||||
/* disabled breakdowns? */
|
||||
if (_opt.diff.vehicle_breakdowns < 1)
|
||||
return;
|
||||
if (_opt.diff.vehicle_breakdowns < 1) return;
|
||||
|
||||
/* reduced breakdowns? */
|
||||
if (_opt.diff.vehicle_breakdowns == 1) rel += 0x6666;
|
||||
|
@ -1450,12 +1448,10 @@ static const StringID _vehicle_type_names[4] = {
|
|||
|
||||
static void ShowVehicleGettingOld(Vehicle *v, StringID msg)
|
||||
{
|
||||
if (v->owner != _local_player)
|
||||
return;
|
||||
if (v->owner != _local_player) return;
|
||||
|
||||
// Do not show getting-old message if autorenew is active
|
||||
if (GetPlayer(v->owner)->engine_renew)
|
||||
return;
|
||||
if (GetPlayer(v->owner)->engine_renew) return;
|
||||
|
||||
SetDParam(0, _vehicle_type_names[v->type - 0x10]);
|
||||
SetDParam(1, v->unitnumber);
|
||||
|
@ -1492,20 +1488,19 @@ static Vehicle *GetNextEnginePart(Vehicle *v)
|
|||
{
|
||||
switch (v->type) {
|
||||
case VEH_Train:
|
||||
{
|
||||
const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
|
||||
if (rvi->flags & RVI_MULTIHEAD)
|
||||
if (RailVehInfo(v->engine_type)->flags & RVI_MULTIHEAD) {
|
||||
return GetRearEngine(v, v->engine_type);
|
||||
if (v->next != NULL && v->next->subtype == TS_Artic_Part)
|
||||
return v->next;
|
||||
}
|
||||
}
|
||||
if (v->next != NULL && v->next->subtype == TS_Artic_Part) return v->next;
|
||||
break;
|
||||
|
||||
case VEH_Aircraft:
|
||||
return v->next;
|
||||
break;
|
||||
|
||||
case VEH_Road:
|
||||
case VEH_Ship:
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
return NULL;
|
||||
|
@ -1523,8 +1518,7 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
Vehicle *w_front, *w, *w_rear;
|
||||
int cost, total_cost = 0;
|
||||
|
||||
if (!IsVehicleIndex(p1))
|
||||
return CMD_ERROR;
|
||||
if (!IsVehicleIndex(p1)) return CMD_ERROR;
|
||||
v = GetVehicle(p1);
|
||||
v_front = v;
|
||||
w = NULL;
|
||||
|
@ -1540,8 +1534,7 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
* w_rear is the rear end of the cloned train. It's used to add more cars and is only used by trains
|
||||
*/
|
||||
|
||||
if (!CheckOwnership(v->owner))
|
||||
return CMD_ERROR;
|
||||
if (!CheckOwnership(v->owner)) return CMD_ERROR;
|
||||
|
||||
if (v->type == VEH_Train && v->subtype != TS_Front_Engine) return CMD_ERROR;
|
||||
|
||||
|
@ -1567,7 +1560,7 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
total_cost += cost;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
w= GetVehicle(_new_vehicle_id);
|
||||
w = GetVehicle(_new_vehicle_id);
|
||||
|
||||
if (v->type != VEH_Road) { // road vehicles can't be refitted
|
||||
if (v->cargo_type != w->cargo_type) {
|
||||
|
@ -1636,11 +1629,11 @@ static void MoveVehicleCargo(Vehicle *dest, Vehicle *source)
|
|||
}
|
||||
|
||||
/* Replaces a vehicle (used to be called autorenew)
|
||||
* This function is only called from MaybeReplaceVehicle(), which is the next one
|
||||
* This function is only called from MaybeReplaceVehicle()
|
||||
* Must be called with _current_player set to the owner of the vehicle
|
||||
* @param w Vehicle to replace
|
||||
* @param flags is the flags to use when calling DoCommand(). Mainly DC_EXEC counts
|
||||
* return value is cost of the replacement or CMD_ERROR
|
||||
* @return value is cost of the replacement or CMD_ERROR
|
||||
*/
|
||||
static int32 ReplaceVehicle(Vehicle **w, byte flags)
|
||||
{
|
||||
|
@ -1652,11 +1645,9 @@ static int32 ReplaceVehicle(Vehicle **w, byte flags)
|
|||
bool new_front = false;
|
||||
Vehicle *new_v = NULL;
|
||||
|
||||
new_engine_type = p->engine_replacement[old_v->engine_type] == INVALID_ENGINE ? old_v->engine_type: p->engine_replacement[old_v->engine_type];
|
||||
new_engine_type = p->engine_replacement[old_v->engine_type] == INVALID_ENGINE ? old_v->engine_type : p->engine_replacement[old_v->engine_type];
|
||||
|
||||
cost = DoCommand(old_v->x_pos, old_v->y_pos, new_engine_type, 2, flags, CMD_BUILD_VEH(old_v->type));
|
||||
|
||||
//check if the new engine is buildable
|
||||
if (CmdFailed(cost)) return cost;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
|
@ -1708,11 +1699,12 @@ static int32 ReplaceVehicle(Vehicle **w, byte flags)
|
|||
return cost;
|
||||
}
|
||||
|
||||
/** replaces a vehicle if it's set for autoreplace or is too old(used to be called autorenew)
|
||||
* @param v The vehicle to replace
|
||||
* if the vehicle is a train, v needs to be the front engine
|
||||
* return value is a pointer to the new vehicle, which is the same as the argument if nothing happened
|
||||
*/
|
||||
/** replaces a vehicle if it's set for autoreplace or is too old
|
||||
* (used to be called autorenew)
|
||||
* @param v The vehicle to replace
|
||||
* if the vehicle is a train, v needs to be the front engine
|
||||
* return value is a pointer to the new vehicle, which is the same as the argument if nothing happened
|
||||
*/
|
||||
static void MaybeReplaceVehicle(Vehicle *v)
|
||||
{
|
||||
Vehicle *w;
|
||||
|
@ -1739,14 +1731,15 @@ static void MaybeReplaceVehicle(Vehicle *v)
|
|||
train_fits_in_station = true;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
for (;;) {
|
||||
cost = 0;
|
||||
w = v;
|
||||
do {
|
||||
// check if the vehicle should be replaced
|
||||
if (!p->engine_renew || w->age - w->max_age < (p->engine_renew_months * 30) //replace if engine is too old
|
||||
|| (w->max_age == 0)) { // rail cars got a max age of 0
|
||||
if (p->engine_replacement[w->engine_type] == INVALID_ENGINE) // updates to a new model
|
||||
if (!p->engine_renew ||
|
||||
w->age - w->max_age < (p->engine_renew_months * 30) || // replace if engine is too old
|
||||
w->max_age == 0) { // rail cars got a max age of 0
|
||||
if (p->engine_replacement[w->engine_type] == INVALID_ENGINE) // updates to a new model
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1760,14 +1753,16 @@ static void MaybeReplaceVehicle(Vehicle *v)
|
|||
/* Now replace the vehicle */
|
||||
temp_cost = ReplaceVehicle(&w, flags);
|
||||
|
||||
if (flags & DC_EXEC && !(w->type == VEH_Train && w->u.rail.first_engine != INVALID_VEHICLE)){
|
||||
// now we bought a new engine and sold the old one. We need to fix the pointers in order to avoid pointing to the old one
|
||||
// for trains: these pointers should point to the front engine and not the cars
|
||||
if (flags & DC_EXEC &&
|
||||
(w->type != VEH_Train || w->u.rail.first_engine == INVALID_VEHICLE)) {
|
||||
/* now we bought a new engine and sold the old one. We need to fix the
|
||||
* pointers in order to avoid pointing to the old one for trains: these
|
||||
* pointers should point to the front engine and not the cars
|
||||
*/
|
||||
v = w;
|
||||
}
|
||||
|
||||
if (CmdFailed(temp_cost))
|
||||
break;
|
||||
if (CmdFailed(temp_cost)) break;
|
||||
|
||||
cost += temp_cost;
|
||||
} while (w->type == VEH_Train && (w = GetNextVehicle(w)) != NULL);
|
||||
|
@ -1787,8 +1782,7 @@ static void MaybeReplaceVehicle(Vehicle *v)
|
|||
|
||||
AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
|
||||
}
|
||||
if (stopped)
|
||||
v->vehstatus &= ~VS_STOPPED; //we start the vehicle again
|
||||
if (stopped) v->vehstatus &= ~VS_STOPPED;
|
||||
_current_player = OWNER_NONE;
|
||||
return;
|
||||
}
|
||||
|
@ -1823,8 +1817,7 @@ static void MaybeReplaceVehicle(Vehicle *v)
|
|||
|
||||
if (IsLocalPlayer()) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost);
|
||||
|
||||
if (stopped)
|
||||
v->vehstatus &= ~VS_STOPPED; //we start the vehicle again
|
||||
if (stopped) v->vehstatus &= ~VS_STOPPED;
|
||||
_current_player = OWNER_NONE;
|
||||
}
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ struct WorldSprite {
|
|||
|
||||
struct Vehicle {
|
||||
byte type; // type, ie roadven,train,ship,aircraft,special
|
||||
byte subtype; // subtype (Filled with values from EffectVehicles or TrainSubTypes)(Filled with values from EffectVehicles or TrainSubTypes)
|
||||
byte subtype; // subtype (Filled with values from EffectVehicles or TrainSubTypes)
|
||||
|
||||
VehicleID index; // NOSAVE: Index in vehicle array
|
||||
|
||||
|
@ -184,7 +184,6 @@ struct Vehicle {
|
|||
|
||||
int32 x_pos; // coordinates
|
||||
int32 y_pos;
|
||||
|
||||
byte z_pos;
|
||||
byte direction; // facing
|
||||
|
||||
|
@ -263,8 +262,6 @@ struct Vehicle {
|
|||
int32 profit_last_year;
|
||||
uint32 value;
|
||||
|
||||
|
||||
|
||||
union {
|
||||
VehicleRail rail;
|
||||
VehicleAir air;
|
||||
|
|
130
vehicle_gui.c
130
vehicle_gui.c
|
@ -105,9 +105,9 @@ void ResortVehicleLists(void)
|
|||
|
||||
void BuildVehicleList(vehiclelist_d* vl, int type, PlayerID owner, StationID station)
|
||||
{
|
||||
int subtype = (type != VEH_Aircraft) ? TS_Front_Engine : 2;
|
||||
int n = 0;
|
||||
int i;
|
||||
uint subtype = (type != VEH_Aircraft) ? TS_Front_Engine : 2;
|
||||
uint n = 0;
|
||||
uint i;
|
||||
|
||||
if (!(vl->flags & VL_REBUILD)) return;
|
||||
|
||||
|
@ -185,14 +185,15 @@ void DrawVehicleProfitButton(const Vehicle *v, int x, int y)
|
|||
uint32 ormod;
|
||||
|
||||
// draw profit-based colored icons
|
||||
if(v->age <= 365 * 2)
|
||||
if (v->age <= 365 * 2) {
|
||||
ormod = PALETTE_TO_GREY;
|
||||
else if(v->profit_last_year < 0)
|
||||
} else if (v->profit_last_year < 0) {
|
||||
ormod = PALETTE_TO_RED;
|
||||
else if(v->profit_last_year < 10000)
|
||||
} else if (v->profit_last_year < 10000) {
|
||||
ormod = PALETTE_TO_YELLOW;
|
||||
else
|
||||
} else {
|
||||
ormod = PALETTE_TO_GREEN;
|
||||
}
|
||||
DrawSprite(SPR_BLOT | ormod, x, y);
|
||||
}
|
||||
|
||||
|
@ -282,7 +283,7 @@ static int CDECL VehicleNameSorter(const void *a, const void *b)
|
|||
GetString(buf1, STR_JUST_STRING);
|
||||
}
|
||||
|
||||
if ( cmp2->index != _last_vehicle_idx) {
|
||||
if (cmp2->index != _last_vehicle_idx) {
|
||||
_last_vehicle_idx = cmp2->index;
|
||||
_bufcache[0] = '\0';
|
||||
if (vb->string_id != _internal_name_sorter_id) {
|
||||
|
@ -415,9 +416,9 @@ static void train_engine_drawing_loop(int *x, int *y, int *pos, int *sel, int *s
|
|||
const RailVehicleInfo *rvi = RailVehInfo(i);
|
||||
const EngineInfo *info = &_engine_info[i];
|
||||
|
||||
if (p->engine_replacement[i] == INVALID_ENGINE && _player_num_engines[i] == 0 && show_outdated ) continue;
|
||||
if (p->engine_replacement[i] == INVALID_ENGINE && _player_num_engines[i] == 0 && show_outdated) continue;
|
||||
|
||||
if ( rvi->power == 0 && !(show_cars) ) // disables display of cars (works since they do not have power)
|
||||
if (rvi->power == 0 && !show_cars) // disables display of cars (works since they do not have power)
|
||||
continue;
|
||||
|
||||
if (*sel == 0) *selected_id = i;
|
||||
|
@ -473,14 +474,14 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
const Engine *e = GetEngine(engine_id);
|
||||
const EngineInfo *info = &_engine_info[engine_id];
|
||||
|
||||
if (ENGINE_AVAILABLE && RailVehInfo(engine_id)->power && e->railtype == railtype ) {
|
||||
if (ENGINE_AVAILABLE && RailVehInfo(engine_id)->power && e->railtype == railtype) {
|
||||
if (_player_num_engines[engine_id] > 0 || p->engine_replacement[engine_id] != INVALID_ENGINE) {
|
||||
if (sel[0]==0) selected_id[0] = engine_id;
|
||||
if (sel[0] == 0) selected_id[0] = engine_id;
|
||||
count++;
|
||||
sel[0]--;
|
||||
}
|
||||
if (HASBIT(e->player_avail, _local_player)) {
|
||||
if (sel[1]==0) selected_id[1] = engine_id;
|
||||
if (sel[1] == 0) selected_id[1] = engine_id;
|
||||
count2++;
|
||||
sel[1]--;
|
||||
}
|
||||
|
@ -498,22 +499,22 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
do {
|
||||
info = &_engine_info[engine_id];
|
||||
if (_player_num_engines[engine_id] > 0 || p->engine_replacement[engine_id] != INVALID_ENGINE) {
|
||||
if (sel[0]==0) selected_id[0] = engine_id;
|
||||
if (sel[0] == 0) selected_id[0] = engine_id;
|
||||
count++;
|
||||
sel[0]--;
|
||||
}
|
||||
} while (++engine_id,++e,--num);
|
||||
|
||||
if ( selected_id[0] != -1 ) { // only draw right array if we have anything in the left one
|
||||
if (selected_id[0] != -1) { // only draw right array if we have anything in the left one
|
||||
num = NUM_ROAD_ENGINES;
|
||||
engine_id = ROAD_ENGINES_INDEX;
|
||||
e = GetEngine(ROAD_ENGINES_INDEX);
|
||||
cargo = RoadVehInfo(selected_id[0])->cargo_type;
|
||||
|
||||
do {
|
||||
if ( cargo == RoadVehInfo(engine_id)->cargo_type && HASBIT(e->player_avail, _local_player)) {
|
||||
if (cargo == RoadVehInfo(engine_id)->cargo_type && HASBIT(e->player_avail, _local_player)) {
|
||||
count2++;
|
||||
if (sel[1]==0) selected_id[1] = engine_id;
|
||||
if (sel[1] == 0) selected_id[1] = engine_id;
|
||||
sel[1]--;
|
||||
}
|
||||
} while (++engine_id,++e,--num);
|
||||
|
@ -531,13 +532,13 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
do {
|
||||
info = &_engine_info[engine_id];
|
||||
if (_player_num_engines[engine_id] > 0 || p->engine_replacement[engine_id] != INVALID_ENGINE) {
|
||||
if ( sel[0] == 0 ) selected_id[0] = engine_id;
|
||||
if (sel[0] == 0) selected_id[0] = engine_id;
|
||||
count++;
|
||||
sel[0]--;
|
||||
}
|
||||
} while (++engine_id,++e,--num);
|
||||
|
||||
if ( selected_id[0] != -1 ) {
|
||||
if (selected_id[0] != -1) {
|
||||
num = NUM_SHIP_ENGINES;
|
||||
e = GetEngine(SHIP_ENGINES_INDEX);
|
||||
engine_id = SHIP_ENGINES_INDEX;
|
||||
|
@ -545,10 +546,9 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
refittable = ShipVehInfo(selected_id[0])->refittable;
|
||||
|
||||
do {
|
||||
if (HASBIT(e->player_avail, _local_player)
|
||||
&& ( cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) {
|
||||
|
||||
if ( sel[1]==0) selected_id[1] = engine_id;
|
||||
if (HASBIT(e->player_avail, _local_player) &&
|
||||
(cargo == ShipVehInfo(engine_id)->cargo_type || refittable & ShipVehInfo(engine_id)->refittable)) {
|
||||
if (sel[1] == 0) selected_id[1] = engine_id;
|
||||
sel[1]--;
|
||||
count2++;
|
||||
}
|
||||
|
@ -568,12 +568,12 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
info = &_engine_info[engine_id];
|
||||
if (_player_num_engines[engine_id] > 0 || p->engine_replacement[engine_id] != INVALID_ENGINE) {
|
||||
count++;
|
||||
if (sel[0]==0) selected_id[0] = engine_id;
|
||||
if (sel[0] == 0) selected_id[0] = engine_id;
|
||||
sel[0]--;
|
||||
}
|
||||
} while (++engine_id,++e,--num);
|
||||
|
||||
if ( selected_id[0] != -1 ) {
|
||||
if (selected_id[0] != -1) {
|
||||
num = NUM_AIRCRAFT_ENGINES;
|
||||
e = GetEngine(AIRCRAFT_ENGINES_INDEX);
|
||||
subtype = AircraftVehInfo(selected_id[0])->subtype;
|
||||
|
@ -582,7 +582,7 @@ static void SetupScrollStuffForReplaceWindow(Window *w)
|
|||
if (HASBIT(e->player_avail, _local_player)) {
|
||||
if (HASBIT(subtype, 0) == HASBIT(AircraftVehInfo(engine_id)->subtype, 0)) {
|
||||
count2++;
|
||||
if (sel[1]==0) selected_id[1] = engine_id;
|
||||
if (sel[1] == 0) selected_id[1] = engine_id;
|
||||
sel[1]--;
|
||||
}
|
||||
}
|
||||
|
@ -640,7 +640,7 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
byte cargo;
|
||||
const EngineInfo* info;
|
||||
|
||||
if ( selected_id[0] >= ROAD_ENGINES_INDEX && selected_id[0] <= SHIP_ENGINES_INDEX ) {
|
||||
if (selected_id[0] >= ROAD_ENGINES_INDEX && selected_id[0] < SHIP_ENGINES_INDEX) {
|
||||
cargo = RoadVehInfo(selected_id[0])->cargo_type;
|
||||
|
||||
do {
|
||||
|
@ -656,7 +656,7 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
sel[0]--;
|
||||
}
|
||||
|
||||
if ( RoadVehInfo(engine_id)->cargo_type == cargo && HASBIT(e->player_avail, _local_player) ) {
|
||||
if (RoadVehInfo(engine_id)->cargo_type == cargo && HASBIT(e->player_avail, _local_player)) {
|
||||
if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0) && RoadVehInfo(engine_id)->cargo_type == cargo) {
|
||||
DrawString(x2+59, y2+2, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10);
|
||||
DrawRoadVehEngine(x2+29, y2+6, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)));
|
||||
|
@ -676,7 +676,7 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
byte cargo, refittable;
|
||||
const EngineInfo* info;
|
||||
|
||||
if ( selected_id[0] != -1 ) {
|
||||
if (selected_id[0] != -1) {
|
||||
cargo = ShipVehInfo(selected_id[0])->cargo_type;
|
||||
refittable = ShipVehInfo(selected_id[0])->refittable;
|
||||
|
||||
|
@ -708,7 +708,7 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
} //end of ship
|
||||
|
||||
case VEH_Aircraft: {
|
||||
if ( selected_id[0] != -1 ) {
|
||||
if (selected_id[0] != -1) {
|
||||
int num = NUM_AIRCRAFT_ENGINES;
|
||||
const Engine* e = GetEngine(AIRCRAFT_ENGINES_INDEX);
|
||||
EngineID engine_id = AIRCRAFT_ENGINES_INDEX;
|
||||
|
@ -718,7 +718,7 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
do {
|
||||
info = &_engine_info[engine_id];
|
||||
if (_player_num_engines[engine_id] > 0 || p->engine_replacement[engine_id] != INVALID_ENGINE) {
|
||||
if (sel[0]==0) selected_id[0] = engine_id;
|
||||
if (sel[0] == 0) selected_id[0] = engine_id;
|
||||
if (IS_INT_INSIDE(--pos, -w->vscroll.cap, 0)) {
|
||||
DrawString(x+62, y+7, GetCustomEngineName(engine_id), sel[0]==0 ? 0xC : 0x10);
|
||||
DrawAircraftEngine(x+29, y+10, engine_id, _player_num_engines[engine_id] > 0 ? SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)) : PALETTE_CRASH);
|
||||
|
@ -728,9 +728,9 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
}
|
||||
sel[0]--;
|
||||
}
|
||||
if ( (HASBIT(subtype, 0) == HASBIT(AircraftVehInfo(engine_id)->subtype, 0))
|
||||
&& HASBIT(e->player_avail, _local_player) ) {
|
||||
if (sel[1]==0) selected_id[1] = engine_id;
|
||||
if (HASBIT(subtype, 0) == HASBIT(AircraftVehInfo(engine_id)->subtype, 0) &&
|
||||
HASBIT(e->player_avail, _local_player)) {
|
||||
if (sel[1] == 0) selected_id[1] = engine_id;
|
||||
if (IS_INT_INSIDE(--pos2, -w->vscroll.cap, 0)) {
|
||||
DrawString(x2+62, y2+7, GetCustomEngineName(engine_id), sel[1]==0 ? 0xC : 0x10);
|
||||
DrawAircraftEngine(x2+29, y2+10, engine_id, SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)));
|
||||
|
@ -743,11 +743,17 @@ static void DrawEngineArrayInReplaceWindow(Window *w, int x, int y, int x2, int
|
|||
break;
|
||||
} // end of aircraft
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
static const StringID _vehicle_type_names[4] = {STR_019F_TRAIN, STR_019C_ROAD_VEHICLE, STR_019E_SHIP,STR_019D_AIRCRAFT};
|
||||
static const StringID _vehicle_type_names[] = {
|
||||
STR_019F_TRAIN,
|
||||
STR_019C_ROAD_VEHICLE,
|
||||
STR_019E_SHIP,
|
||||
STR_019D_AIRCRAFT
|
||||
};
|
||||
const Player *p = GetPlayer(_local_player);
|
||||
|
||||
switch (e->event) {
|
||||
|
@ -771,11 +777,11 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
_player_num_engines[i] = 0;
|
||||
}
|
||||
FOR_ALL_VEHICLES(vehicle) {
|
||||
if ( vehicle->owner == _local_player ) {
|
||||
if (vehicle->owner == _local_player) {
|
||||
if (vehicle->type == VEH_Aircraft && vehicle->subtype > 2) continue;
|
||||
|
||||
// do not count the vehicles, that contains only 0 in all var
|
||||
if (vehicle->engine_type == 0 && vehicle->spritenum == 0 ) continue;
|
||||
if (vehicle->engine_type == 0 && vehicle->spritenum == 0) continue;
|
||||
|
||||
if (vehicle->type != GetEngine(vehicle->engine_type)->type) continue;
|
||||
|
||||
|
@ -791,7 +797,7 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
// sets the selected left item to the top one if it's greater than the number of vehicles in the left side
|
||||
|
||||
if ( WP(w,replaceveh_d).count[0] <= sel[0] ) {
|
||||
if (WP(w,replaceveh_d).count[0] <= sel[0]) {
|
||||
if (WP(w,replaceveh_d).count[0]) {
|
||||
sel[0] = 0;
|
||||
WP(w,replaceveh_d).sel_index[0] = 0;
|
||||
|
@ -804,7 +810,7 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
}
|
||||
}
|
||||
|
||||
if ( WP(w,replaceveh_d).count[1] <= sel[1] ) {
|
||||
if (WP(w,replaceveh_d).count[1] <= sel[1]) {
|
||||
if (WP(w,replaceveh_d).count[1]) {
|
||||
sel[1] = 0;
|
||||
WP(w,replaceveh_d).sel_index[1] = 0;
|
||||
|
@ -821,21 +827,24 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
// Either list is empty
|
||||
// or Both lists have the same vehicle selected
|
||||
// or The right list (new replacement) has the existing replacement vehicle selected
|
||||
if (selected_id[0] == -1 || selected_id[1] == -1 ||
|
||||
if (selected_id[0] == -1 ||
|
||||
selected_id[1] == -1 ||
|
||||
selected_id[0] == selected_id[1] ||
|
||||
p->engine_replacement[selected_id[0]] == selected_id[1])
|
||||
p->engine_replacement[selected_id[0]] == selected_id[1]) {
|
||||
SETBIT(w->disabled_state, 4);
|
||||
else
|
||||
} else {
|
||||
CLRBIT(w->disabled_state, 4);
|
||||
}
|
||||
|
||||
// Disable the "Stop Replacing" button if:
|
||||
// The left list (existing vehicle) is empty
|
||||
// or The selected vehicle has no replacement set up
|
||||
if (selected_id[0] == -1 ||
|
||||
p->engine_replacement[selected_id[0]] == INVALID_ENGINE)
|
||||
p->engine_replacement[selected_id[0]] == INVALID_ENGINE) {
|
||||
SETBIT(w->disabled_state, 6);
|
||||
else
|
||||
} else {
|
||||
CLRBIT(w->disabled_state, 6);
|
||||
}
|
||||
|
||||
// now the actual drawing of the window itself takes place
|
||||
SetDParam(0, _vehicle_type_names[WP(w, replaceveh_d).vehicletype - VEH_Train]);
|
||||
|
@ -848,18 +857,17 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
DrawWindowWidgets(w);
|
||||
|
||||
// sets up the string for the vehicle that is being replaced to
|
||||
if ( selected_id[0] != -1 ) {
|
||||
if (p->engine_replacement[selected_id[0]] == INVALID_ENGINE)
|
||||
if (selected_id[0] != -1) {
|
||||
if (p->engine_replacement[selected_id[0]] == INVALID_ENGINE) {
|
||||
SetDParam(0, STR_NOT_REPLACING);
|
||||
else
|
||||
} else {
|
||||
SetDParam(0, GetCustomEngineName(p->engine_replacement[selected_id[0]]));
|
||||
}
|
||||
} else {
|
||||
SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED);
|
||||
}
|
||||
|
||||
|
||||
DrawString(145, (w->resize.step_height == 24 ? 67 : 87 ) + ( w->resize.step_height * w->vscroll.cap), STR_02BD, 0x10);
|
||||
|
||||
DrawString(145, (w->resize.step_height == 24 ? 67 : 87) + w->resize.step_height * w->vscroll.cap, STR_02BD, 0x10);
|
||||
|
||||
/* now we draw the two arrays according to what we just counted */
|
||||
DrawEngineArrayInReplaceWindow(w, x, y, x2, y2, pos, pos2, sel[0], sel[1], selected_id[0], selected_id[1]);
|
||||
|
@ -872,9 +880,8 @@ static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
|
|||
byte i = 0;
|
||||
int offset = 0;
|
||||
|
||||
for ( i = 0 ; i < 2 ; i++) {
|
||||
if ( i )
|
||||
offset = 228;
|
||||
for (i = 0 ; i < 2 ; i++) {
|
||||
if (i > 0) offset = 228;
|
||||
if (selected_id[i] != -1) {
|
||||
if (!(RailVehInfo(selected_id[i])->flags & RVI_WAGON)) {
|
||||
/* it's an engine */
|
||||
|
@ -1101,37 +1108,34 @@ void InitializeGUI(void)
|
|||
}
|
||||
|
||||
/** Assigns an already open vehicle window to a new vehicle.
|
||||
* Assigns an already open vehicle window to a new vehicle. If the vehicle got any sub window open (orders and so on) it will change owner too
|
||||
* @param *from_v the current owner of the window
|
||||
* @param *to_v the new owner of the window
|
||||
*/
|
||||
* Assigns an already open vehicle window to a new vehicle. If the vehicle got
|
||||
* any sub window open (orders and so on) it will change owner too.
|
||||
* @param *from_v the current owner of the window
|
||||
* @param *to_v the new owner of the window
|
||||
*/
|
||||
void ChangeVehicleViewWindow(const Vehicle *from_v, const Vehicle *to_v)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
w = FindWindowById(WC_VEHICLE_VIEW, from_v->index);
|
||||
|
||||
if (w != NULL) {
|
||||
w->window_number = to_v->index;
|
||||
WP(w, vp_d).follow_vehicle = to_v->index; // tell the viewport to follow the new vehicle
|
||||
WP(w, vp_d).follow_vehicle = to_v->index;
|
||||
SetWindowDirty(w);
|
||||
|
||||
w = FindWindowById(WC_VEHICLE_ORDERS, from_v->index);
|
||||
|
||||
if (w != NULL) {
|
||||
w->window_number = to_v->index;
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
|
||||
w = FindWindowById(WC_VEHICLE_REFIT, from_v->index);
|
||||
|
||||
if (w != NULL) {
|
||||
w->window_number = to_v->index;
|
||||
SetWindowDirty(w);
|
||||
}
|
||||
|
||||
w = FindWindowById(WC_VEHICLE_DETAILS, from_v->index);
|
||||
|
||||
if (w != NULL) {
|
||||
w->window_number = to_v->index;
|
||||
SetWindowDirty(w);
|
||||
|
|
19
water_cmd.c
19
water_cmd.c
|
@ -502,12 +502,12 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
|
|||
TileIndex target = TILE_ADD(tile, ToTileIndexDiff(offs[0]));
|
||||
|
||||
// type of this tile mustn't be water already.
|
||||
if (IsTileType(target, MP_WATER))
|
||||
return;
|
||||
if (IsTileType(target, MP_WATER)) return;
|
||||
|
||||
if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[1]))) != 0 ||
|
||||
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[2]))) != 0)
|
||||
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[2]))) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
|
||||
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
|
||||
|
@ -639,8 +639,9 @@ void TileLoop_Water(TileIndex tile)
|
|||
|
||||
if (IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1) &&
|
||||
IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) {
|
||||
for(i=0; i!=4; i++)
|
||||
for (i = 0; i != lengthof(_tile_loop_offs_array); i++) {
|
||||
TileLoopWaterHelper(tile, _tile_loop_offs_array[i]);
|
||||
}
|
||||
}
|
||||
// _current_player can be changed by TileLoopWaterHelper.. reset it back
|
||||
// here
|
||||
|
@ -650,15 +651,17 @@ void TileLoop_Water(TileIndex tile)
|
|||
if (TileX(tile) == 0 && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) //NE
|
||||
TileLoopWaterHelper(tile, _tile_loop_offs_array[2]);
|
||||
|
||||
if (TileX(tile) == (MapSizeX() - 2) && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) //SW
|
||||
if (TileX(tile) == MapSizeX() - 2 && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) { //SW
|
||||
TileLoopWaterHelper(tile, _tile_loop_offs_array[0]);
|
||||
}
|
||||
|
||||
if (TileY(tile) == 0 && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) //NW
|
||||
if (TileY(tile) == 0 && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) { //NW
|
||||
TileLoopWaterHelper(tile, _tile_loop_offs_array[1]);
|
||||
}
|
||||
|
||||
if (TileY(tile) == (MapSizeY() - 2) && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) //SE
|
||||
if (TileY(tile) == MapSizeY() - 2 && IS_INT_INSIDE(TileX(tile), 1, MapSizeX() - 3 + 1)) { //SE
|
||||
TileLoopWaterHelper(tile, _tile_loop_offs_array[3]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
91
widget.c
91
widget.c
|
@ -27,8 +27,7 @@ static Point HandleScrollbarHittest(const Scrollbar *sb, int top, int bottom)
|
|||
if (count != 0) top += height * pos / count;
|
||||
|
||||
if (cap > count) cap = count;
|
||||
if (count != 0)
|
||||
bottom -= (count - pos - cap) * height / count;
|
||||
if (count != 0) bottom -= (count - pos - cap) * height / count;
|
||||
|
||||
pt.x = top;
|
||||
pt.y = bottom - 1;
|
||||
|
@ -139,12 +138,11 @@ int GetWidgetFromPos(const Window *w, int x, int y)
|
|||
// Go through the widgets and check if we find the widget that the coordinate is
|
||||
// inside.
|
||||
for (index = 0,wi = w->widget; wi->type != WWT_LAST; index++, wi++) {
|
||||
if (wi->type == WWT_EMPTY || wi->type == WWT_FRAME)
|
||||
continue;
|
||||
if (wi->type == WWT_EMPTY || wi->type == WWT_FRAME) continue;
|
||||
|
||||
if (x >= wi->left && x <= wi->right && y >= wi->top && y <= wi->bottom &&
|
||||
!HASBIT(w->hidden_state,index)) {
|
||||
found_index = index;
|
||||
found_index = index;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,11 +167,12 @@ void DrawWindowWidgets(const Window *w)
|
|||
bool clicked = (cur_click & 1);
|
||||
|
||||
if (dpi->left > (r.right=/*w->left + */wi->right) ||
|
||||
dpi->left + dpi->width <= (r.left=wi->left/* + w->left*/) ||
|
||||
dpi->left + dpi->width <= (r.left=wi->left/* + w->left*/) ||
|
||||
dpi->top > (r.bottom=/*w->top +*/ wi->bottom) ||
|
||||
dpi->top + dpi->height <= (r.top = /*w->top +*/ wi->top) ||
|
||||
(cur_hidden&1))
|
||||
continue;
|
||||
cur_hidden & 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (wi->type & WWT_MASK) {
|
||||
case WWT_PANEL: /* WWT_IMGBTN */
|
||||
|
@ -182,8 +181,10 @@ void DrawWindowWidgets(const Window *w)
|
|||
|
||||
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : 0);
|
||||
|
||||
if ((img = wi->unkA) != 0) { // has an image
|
||||
if ((wi->type & WWT_MASK) == WWT_PANEL_2 && clicked) img++; // show diff image when clicked
|
||||
img = wi->unkA;
|
||||
if (img != 0) { // has an image
|
||||
// show diff image when clicked
|
||||
if ((wi->type & WWT_MASK) == WWT_PANEL_2 && clicked) img++;
|
||||
|
||||
DrawSprite(img, r.left + 1 + clicked, r.top + 1 + clicked);
|
||||
}
|
||||
|
@ -210,9 +211,8 @@ void DrawWindowWidgets(const Window *w)
|
|||
StringID str;
|
||||
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_LOWERED | FR_DARKENED);
|
||||
|
||||
if ((str = wi->unkA) != 0) {
|
||||
DrawString(r.left+2, r.top+1, str, 0);
|
||||
}
|
||||
str = wi->unkA;
|
||||
if (str != 0) DrawString(r.left + 2, r.top + 1, str, 0);
|
||||
goto draw_default;
|
||||
}
|
||||
|
||||
|
@ -229,30 +229,30 @@ void DrawWindowWidgets(const Window *w)
|
|||
d = (wi->unkA >> 8);
|
||||
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;
|
||||
for(ctr=c; --ctr; ) {
|
||||
for (ctr = c; ctr > 0; ctr--) {
|
||||
x += amt1;
|
||||
GfxFillRect(x, r.top+1, x, r.bottom-1, color);
|
||||
GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
|
||||
}
|
||||
|
||||
x = r.top;
|
||||
for(ctr=d; --ctr; ) {
|
||||
for (ctr = d; ctr > 0; ctr--) {
|
||||
x += amt2;
|
||||
GfxFillRect(r.left+1, x, r.right-1, x, color);
|
||||
GfxFillRect(r.left + 1, x, r.right - 1, x, color);
|
||||
}
|
||||
|
||||
color = _color_list[wi->color&0xF].window_color_1b;
|
||||
|
||||
x = r.left-1;
|
||||
for(ctr=c; --ctr; ) {
|
||||
x = r.left - 1;
|
||||
for (ctr = c; ctr > 0; ctr--) {
|
||||
x += amt1;
|
||||
GfxFillRect(x, r.top+1, x, r.bottom-1, color);
|
||||
GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
|
||||
}
|
||||
|
||||
x = r.top-1;
|
||||
for(ctr=d; --ctr; ) {
|
||||
x = r.top - 1;
|
||||
for (ctr = d; ctr > 0; ctr--) {
|
||||
x += amt2;
|
||||
GfxFillRect(r.left+1, x, r.right-1, x, color);
|
||||
}
|
||||
|
@ -365,9 +365,7 @@ void DrawWindowWidgets(const Window *w)
|
|||
int c1,c2;
|
||||
int x2 = r.left; // by default the left side is the left side of the widget
|
||||
|
||||
if (wi->unkA != 0) {
|
||||
x2 = DrawString(r.left+6, r.top, wi->unkA, 0);
|
||||
}
|
||||
if (wi->unkA != 0) x2 = DrawString(r.left + 6, r.top, wi->unkA, 0);
|
||||
|
||||
c1 = _color_list[wi->color].window_color_1a;
|
||||
c2 = _color_list[wi->color].window_color_2;
|
||||
|
@ -485,20 +483,20 @@ static void DropdownMenuWndProc(Window *w, WindowEvent *e)
|
|||
continue;
|
||||
}
|
||||
if (WP(w,dropdown_d).items[i] != 0) {
|
||||
if (sel == 0) {
|
||||
GfxFillRect(x+1, y, x+w->width-4, y + 9, 0);
|
||||
}
|
||||
DrawString(x+2, y, WP(w,dropdown_d).items[i], sel==0 ? 12 : 16);
|
||||
if (sel == 0) GfxFillRect(x + 1, y, x + w->width - 4, y + 9, 0);
|
||||
DrawString(x + 2, y, WP(w,dropdown_d).items[i], sel == 0 ? 12 : 16);
|
||||
|
||||
if (HASBIT(w->disabled_state, i)) {
|
||||
GfxFillRect(x, y, x+w->width-3, y + 9, PALETTE_MODIFIER_GREYOUT |
|
||||
_color_list[_dropdown_menu_widgets[0].color].window_color_bga);
|
||||
GfxFillRect(x, y, x + w->width - 3, y + 9,
|
||||
PALETTE_MODIFIER_GREYOUT | _color_list[_dropdown_menu_widgets[0].color].window_color_bga
|
||||
);
|
||||
}
|
||||
} else {
|
||||
int color_1 = _color_list[_dropdown_menu_widgets[0].color].window_color_1a;
|
||||
int color_2 = _color_list[_dropdown_menu_widgets[0].color].window_color_2;
|
||||
GfxFillRect(x+1, y+3, x+w->width-5, y+3, color_1);
|
||||
GfxFillRect(x+1, y+4, x+w->width-5, y+4, color_2);
|
||||
int c1 = _color_list[_dropdown_menu_widgets[0].color].window_color_1a;
|
||||
int c2 = _color_list[_dropdown_menu_widgets[0].color].window_color_2;
|
||||
|
||||
GfxFillRect(x + 1, y + 3, x + w->width - 5, y + 3, c1);
|
||||
GfxFillRect(x + 1, y + 4, x + w->width - 5, y + 4, c2);
|
||||
}
|
||||
y += 10;
|
||||
sel--;
|
||||
|
@ -536,12 +534,10 @@ static void DropdownMenuWndProc(Window *w, WindowEvent *e)
|
|||
|
||||
if (!_left_button_clicked) {
|
||||
WP(w,dropdown_d).drag_mode = false;
|
||||
if (item < 0)
|
||||
return;
|
||||
if (item < 0) return;
|
||||
WP(w,dropdown_d).click_delay = 2;
|
||||
} else {
|
||||
if (item < 0)
|
||||
return;
|
||||
if (item < 0) return;
|
||||
}
|
||||
|
||||
WP(w,dropdown_d).selected_index = item;
|
||||
|
@ -573,25 +569,22 @@ void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int butt
|
|||
DeleteWindowById(WC_DROPDOWN_MENU, 0);
|
||||
w = FindWindowById(cls, num);
|
||||
|
||||
if (HASBIT(old_click_state, button))
|
||||
return;
|
||||
if (HASBIT(old_click_state, button)) return;
|
||||
|
||||
SETBIT(w->click_state, button);
|
||||
|
||||
InvalidateWidget(w, button);
|
||||
|
||||
for (i = 0; strings[i] != INVALID_STRING_ID; i++);
|
||||
if (i == 0)
|
||||
return;
|
||||
for (i = 0; strings[i] != INVALID_STRING_ID; i++) {}
|
||||
if (i == 0) return;
|
||||
|
||||
wi = &w->widget[button];
|
||||
|
||||
if (hidden_mask != 0) {
|
||||
int j;
|
||||
uint j;
|
||||
|
||||
for (j = 0; strings[j] != INVALID_STRING_ID; j++) {
|
||||
if (HASBIT(hidden_mask, j)) {
|
||||
i--;
|
||||
}
|
||||
if (HASBIT(hidden_mask, j)) i--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
1
win32.c
1
win32.c
|
@ -922,7 +922,6 @@ char *FiosBrowseTo(const FiosItem *item)
|
|||
sprintf(path, "%s\\", item->name);
|
||||
s = strrchr(path, '\\');
|
||||
if (s[1] == '\0') s[0] = '\0'; // strip trailing slash
|
||||
|
||||
break;
|
||||
|
||||
case FIOS_TYPE_FILE:
|
||||
|
|
312
window.c
312
window.c
|
@ -146,13 +146,13 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom)
|
|||
DrawPixelInfo bk;
|
||||
_cur_dpi = &bk;
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (right > w->left &&
|
||||
bottom > w->top &&
|
||||
left < w->left + w->width &&
|
||||
top < w->top + w->height) {
|
||||
DrawOverlappedWindow(w, left, top, right, bottom);
|
||||
}
|
||||
DrawOverlappedWindow(w, left, top, right, bottom);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,7 +166,6 @@ void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom)
|
|||
bottom > v->top &&
|
||||
left < v->left + v->width &&
|
||||
top < v->top + v->height) {
|
||||
|
||||
if (left < (x=v->left)) {
|
||||
DrawOverlappedWindow(w, left, top, x, bottom);
|
||||
DrawOverlappedWindow(w, x, top, right, bottom);
|
||||
|
@ -230,8 +229,7 @@ void DeleteWindow(Window *w)
|
|||
Window *v;
|
||||
int count;
|
||||
|
||||
if (w == NULL)
|
||||
return;
|
||||
if (w == NULL) return;
|
||||
|
||||
if (_thd.place_mode != 0 && _thd.window_class == w->window_class && _thd.window_number == w->window_number) {
|
||||
ResetObjectToPlace();
|
||||
|
@ -264,11 +262,8 @@ Window *FindWindowById(WindowClass cls, WindowNumber number)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class == cls &&
|
||||
w->window_number == number) {
|
||||
return w;
|
||||
}
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == cls && w->window_number == number) return w;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -282,12 +277,14 @@ void DeleteWindowById(WindowClass cls, WindowNumber number)
|
|||
void DeleteWindowByClass(WindowClass cls)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
for (w = _windows; w != _last_window;) {
|
||||
if (w->window_class == cls) {
|
||||
DeleteWindow(w);
|
||||
w = _windows;
|
||||
} else
|
||||
} else {
|
||||
w++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -323,12 +320,10 @@ Window *BringWindowToFront(Window *w)
|
|||
|
||||
v = _last_window;
|
||||
do {
|
||||
if (--v < _windows)
|
||||
return w;
|
||||
if (--v < _windows) return w;
|
||||
} while (IsVitalWindow(v));
|
||||
|
||||
if (w == v)
|
||||
return w;
|
||||
if (w == v) return w;
|
||||
|
||||
assert(w < v);
|
||||
|
||||
|
@ -351,9 +346,11 @@ Window *BringWindowToFront(Window *w)
|
|||
static Window *FindDeletableWindow(void)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
for (w = _windows; w < endof(_windows); w++) {
|
||||
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w) && !(w->flags4 & WF_STICKY) )
|
||||
return w;
|
||||
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w) && !(w->flags4 & WF_STICKY)) {
|
||||
return w;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -367,11 +364,10 @@ static Window *FindDeletableWindow(void)
|
|||
static Window *ForceFindDeletableWindow(void)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
for (w = _windows;; w++) {
|
||||
assert(w < _last_window);
|
||||
|
||||
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w))
|
||||
return w;
|
||||
if (w->window_class != WC_MAIN_WINDOW && !IsVitalWindow(w)) return w;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -386,17 +382,16 @@ void AssignWidgetToWindow(Window *w, const Widget *widget)
|
|||
w->original_widget = widget;
|
||||
|
||||
if (widget != NULL) {
|
||||
const Widget *wi = widget;
|
||||
uint index = 1;
|
||||
while (wi->type != WWT_LAST) {
|
||||
wi++;
|
||||
index++;
|
||||
}
|
||||
const Widget* wi;
|
||||
|
||||
w->widget = realloc(w->widget, sizeof(Widget) * index);
|
||||
memcpy(w->widget, widget, sizeof(Widget) * index);
|
||||
} else
|
||||
for (wi = widget; wi->type != WWT_LAST; wi++) index++;
|
||||
|
||||
w->widget = realloc(w->widget, sizeof(*w->widget) * index);
|
||||
memcpy(w->widget, widget, sizeof(*w->widget) * index);
|
||||
} else {
|
||||
w->widget = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/** Open a new window. If there is no space for a new window, close an open
|
||||
|
@ -422,8 +417,7 @@ Window *AllocateWindow(
|
|||
if (w >= endof(_windows)) {
|
||||
w = FindDeletableWindow();
|
||||
|
||||
if (w == NULL) // no window found, force it!
|
||||
w = ForceFindDeletableWindow();
|
||||
if (w == NULL) w = ForceFindDeletableWindow();
|
||||
|
||||
DeleteWindow(w);
|
||||
w = _last_window;
|
||||
|
@ -503,10 +497,9 @@ Window *AllocateWindowAutoPlace2(
|
|||
}
|
||||
|
||||
x = w->left;
|
||||
if (x > _screen.width - width)
|
||||
x = (_screen.width - width) - 20;
|
||||
if (x > _screen.width - width) x = _screen.width - width - 20;
|
||||
|
||||
return AllocateWindow(x+10,w->top+10,width,height,proc,cls,widget);
|
||||
return AllocateWindow(x + 10, w->top + 10, width, height, proc, cls, widget);
|
||||
}
|
||||
|
||||
|
||||
|
@ -531,15 +524,15 @@ static bool IsGoodAutoPlace1(int left, int top)
|
|||
return false;
|
||||
|
||||
// Make sure it is not obscured by any window.
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW)
|
||||
continue;
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW) continue;
|
||||
|
||||
if (right > w->left &&
|
||||
w->left + w->width > left &&
|
||||
w->left + w->width > left &&
|
||||
bottom > w->top &&
|
||||
w->top + w->height > top)
|
||||
return false;
|
||||
w->top + w->height > top) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -561,15 +554,15 @@ static bool IsGoodAutoPlace2(int left, int top)
|
|||
return false;
|
||||
|
||||
// Make sure it is not obscured by any window.
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW)
|
||||
continue;
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW) continue;
|
||||
|
||||
if (left + width > w->left &&
|
||||
w->left + w->width > left &&
|
||||
w->left + w->width > left &&
|
||||
top + height > w->top &&
|
||||
w->top + w->height > top)
|
||||
return false;
|
||||
w->top + w->height > top) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -585,9 +578,8 @@ static Point GetAutoPlacePosition(int width, int height)
|
|||
|
||||
if (IsGoodAutoPlace1(0, 24)) goto ok_pos;
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW)
|
||||
continue;
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW) continue;
|
||||
|
||||
if (IsGoodAutoPlace1(w->left+w->width+2,w->top)) goto ok_pos;
|
||||
if (IsGoodAutoPlace1(w->left- width-2,w->top)) goto ok_pos;
|
||||
|
@ -599,9 +591,8 @@ static Point GetAutoPlacePosition(int width, int height)
|
|||
if (IsGoodAutoPlace1(w->left+w->width-width,w->top- height-2)) goto ok_pos;
|
||||
}
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW)
|
||||
continue;
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == WC_MAIN_WINDOW) continue;
|
||||
|
||||
if (IsGoodAutoPlace2(w->left+w->width+2,w->top)) goto ok_pos;
|
||||
if (IsGoodAutoPlace2(w->left- width-2,w->top)) goto ok_pos;
|
||||
|
@ -613,7 +604,7 @@ static Point GetAutoPlacePosition(int width, int height)
|
|||
int left=0,top=24;
|
||||
|
||||
restart:;
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->left == left && w->top == top) {
|
||||
left += 5;
|
||||
top += 5;
|
||||
|
@ -647,8 +638,7 @@ Window *AllocateWindowDescFront(const WindowDesc *desc, int value)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
if (BringWindowToFrontById(desc->cls, value))
|
||||
return NULL;
|
||||
if (BringWindowToFrontById(desc->cls, value)) return NULL;
|
||||
w = AllocateWindowDesc(desc);
|
||||
w->window_number = value;
|
||||
return w;
|
||||
|
@ -696,11 +686,12 @@ Window *FindWindowFromPt(int x, int y)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
for(w=_last_window; w != _windows;) {
|
||||
for (w = _last_window; w != _windows;) {
|
||||
--w;
|
||||
if (IS_INSIDE_1D(x, w->left, w->width) &&
|
||||
IS_INSIDE_1D(y, w->top, w->height))
|
||||
return w;
|
||||
IS_INSIDE_1D(y, w->top, w->height)) {
|
||||
return w;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@ -755,8 +746,7 @@ static void DecreaseWindowCounters(void)
|
|||
|
||||
if (w->flags4&WF_TIMEOUT_MASK && !(--w->flags4&WF_TIMEOUT_MASK)) {
|
||||
CallWindowEventNP(w, WE_TIMEOUT);
|
||||
if (w->desc_flags & WDF_UNCLICK_BUTTONS)
|
||||
UnclickWindowButtons(w);
|
||||
if (w->desc_flags & WDF_UNCLICK_BUTTONS) UnclickWindowButtons(w);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -771,11 +761,10 @@ static void HandlePlacePresize(void)
|
|||
Window *w;
|
||||
WindowEvent e;
|
||||
|
||||
if (_special_mouse_mode != WSM_PRESIZE)
|
||||
return;
|
||||
if (_special_mouse_mode != WSM_PRESIZE) return;
|
||||
|
||||
if ((w = GetCallbackWnd()) == NULL)
|
||||
return;
|
||||
w = GetCallbackWnd();
|
||||
if (w == NULL) return;
|
||||
|
||||
e.place.pt = GetTileBelowCursor();
|
||||
if (e.place.pt.x == -1) {
|
||||
|
@ -792,17 +781,15 @@ static bool HandleDragDrop(void)
|
|||
Window *w;
|
||||
WindowEvent e;
|
||||
|
||||
if (_special_mouse_mode != WSM_DRAGDROP)
|
||||
return true;
|
||||
if (_special_mouse_mode != WSM_DRAGDROP) return true;
|
||||
|
||||
if (_left_button_down)
|
||||
return false;
|
||||
if (_left_button_down) return false;
|
||||
|
||||
w = GetCallbackWnd();
|
||||
|
||||
ResetObjectToPlace();
|
||||
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
// send an event in client coordinates.
|
||||
e.event = WE_DRAGDROP;
|
||||
e.dragdrop.pt.x = _cursor.pos.x - w->left;
|
||||
|
@ -818,8 +805,7 @@ static bool HandlePopupMenu(void)
|
|||
Window *w;
|
||||
WindowEvent e;
|
||||
|
||||
if (!_popup_menu_active)
|
||||
return true;
|
||||
if (!_popup_menu_active) return true;
|
||||
|
||||
w = FindWindowById(WC_TOOLBAR_MENU, 0);
|
||||
if (w == NULL) {
|
||||
|
@ -850,16 +836,15 @@ static bool HandleMouseOver(void)
|
|||
w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
|
||||
|
||||
// We changed window, put a MOUSEOVER event to the last window
|
||||
if (last_w && last_w != w) {
|
||||
if (last_w != NULL && last_w != w) {
|
||||
e.event = WE_MOUSEOVER;
|
||||
e.mouseover.pt.x = -1;
|
||||
e.mouseover.pt.y = -1;
|
||||
if (last_w->wndproc)
|
||||
last_w->wndproc(last_w, &e);
|
||||
if (last_w->wndproc) last_w->wndproc(last_w, &e);
|
||||
}
|
||||
last_w = w;
|
||||
|
||||
if (w) {
|
||||
if (w != NULL) {
|
||||
// send an event in client coordinates.
|
||||
e.event = WE_MOUSEOVER;
|
||||
e.mouseover.pt.x = _cursor.pos.x - w->left;
|
||||
|
@ -881,8 +866,7 @@ static bool HandleWindowDragging(void)
|
|||
{
|
||||
Window *w;
|
||||
// Get out immediately if no window is being dragged at all.
|
||||
if (!_dragging_window)
|
||||
return true;
|
||||
if (!_dragging_window) return true;
|
||||
|
||||
// Otherwise find the window...
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
|
@ -998,12 +982,13 @@ static bool HandleWindowDragging(void)
|
|||
} else {
|
||||
if (nx + t->left > v->left - 13 &&
|
||||
nx + t->right < v_right + 13) {
|
||||
if (w->top >= v_bottom)
|
||||
if (w->top >= v_bottom) {
|
||||
ny = v_bottom;
|
||||
else if (w->left < nx)
|
||||
} else if (w->left < nx) {
|
||||
nx = v->left - 13 - t->left;
|
||||
else
|
||||
} else {
|
||||
nx = v_right + 13 - t->right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1033,11 +1018,9 @@ static bool HandleWindowDragging(void)
|
|||
y = _cursor.pos.y - _drag_delta.y;
|
||||
|
||||
/* X and Y has to go by step.. calculate it */
|
||||
if (w->resize.step_width > 1)
|
||||
x = x - (x % (int)w->resize.step_width);
|
||||
if (w->resize.step_width > 1) x = x - (x % w->resize.step_width);
|
||||
|
||||
if (w->resize.step_height > 1)
|
||||
y = y - (y % (int)w->resize.step_height);
|
||||
if (w->resize.step_height > 1) y = y - (y % w->resize.step_height);
|
||||
|
||||
/* Check if we don't go below the minimum set size */
|
||||
if ((int)w->width + x < (int)w->resize.width)
|
||||
|
@ -1046,8 +1029,7 @@ static bool HandleWindowDragging(void)
|
|||
y = w->resize.height - w->height;
|
||||
|
||||
/* Window already on size */
|
||||
if (x == 0 && y == 0)
|
||||
return false;
|
||||
if (x == 0 && y == 0) return false;
|
||||
|
||||
/* Now find the new cursor pos.. this is NOT _cursor, because
|
||||
we move in steps. */
|
||||
|
@ -1087,10 +1069,8 @@ static bool HandleWindowDragging(void)
|
|||
}
|
||||
|
||||
/* We resized at least 1 widget, so let's rezise the window totally */
|
||||
if (resize_width)
|
||||
w->width = x + w->width;
|
||||
if (resize_height)
|
||||
w->height = y + w->height;
|
||||
if (resize_width) w->width = x + w->width;
|
||||
if (resize_height) w->height = y + w->height;
|
||||
}
|
||||
|
||||
e.event = WE_RESIZE;
|
||||
|
@ -1145,11 +1125,10 @@ static bool HandleScrollbarScrolling(void)
|
|||
Scrollbar *sb;
|
||||
|
||||
// Get out quickly if no item is being scrolled
|
||||
if (!_scrolling_scrollbar)
|
||||
return true;
|
||||
if (!_scrolling_scrollbar) return true;
|
||||
|
||||
// Find the scrolling window
|
||||
for(w=_windows; w != _last_window; w++) {
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->flags4 & WF_SCROLL_MIDDLE) {
|
||||
// Abort if no button is clicked any more.
|
||||
if (!_left_button_down) {
|
||||
|
@ -1189,8 +1168,7 @@ static bool HandleViewportScroll(void)
|
|||
ViewPort *vp;
|
||||
int dx,dy, x, y, sub;
|
||||
|
||||
if (!_scrolling_viewport)
|
||||
return true;
|
||||
if (!_scrolling_viewport) return true;
|
||||
|
||||
if (!_right_button_down) {
|
||||
stop_capt:;
|
||||
|
@ -1249,10 +1227,22 @@ stop_capt:;
|
|||
hy = (w->widget[4].bottom - w->widget[4].top ) / 2;
|
||||
hvx = hx * -4 + hy * 8;
|
||||
hvy = hx * 4 + hy * 8;
|
||||
if (x < -hvx) { x = -hvx; sub = 0; }
|
||||
if (x > (int)MapMaxX() * 16 - hvx) { x = MapMaxX() * 16 - hvx; sub = 0; }
|
||||
if (y < -hvy) { y = -hvy; sub = 0; }
|
||||
if (y > (int)MapMaxY() * 16 - hvy) { y = MapMaxY() * 16 - hvy; sub = 0; }
|
||||
if (x < -hvx) {
|
||||
x = -hvx;
|
||||
sub = 0;
|
||||
}
|
||||
if (x > (int)MapMaxX() * 16 - hvx) {
|
||||
x = MapMaxX() * 16 - hvx;
|
||||
sub = 0;
|
||||
}
|
||||
if (y < -hvy) {
|
||||
y = -hvy;
|
||||
sub = 0;
|
||||
}
|
||||
if (y > (int)MapMaxY() * 16 - hvy) {
|
||||
y = MapMaxY() * 16 - hvy;
|
||||
sub = 0;
|
||||
}
|
||||
|
||||
WP(w,smallmap_d).scroll_x = x;
|
||||
WP(w,smallmap_d).scroll_y = y;
|
||||
|
@ -1269,20 +1259,27 @@ static Window *MaybeBringWindowToFront(Window *w)
|
|||
{
|
||||
Window *u;
|
||||
|
||||
if (w->window_class == WC_MAIN_WINDOW || IsVitalWindow(w) ||
|
||||
w->window_class == WC_TOOLTIPS || w->window_class == WC_DROPDOWN_MENU)
|
||||
return w;
|
||||
if (w->window_class == WC_MAIN_WINDOW ||
|
||||
IsVitalWindow(w) ||
|
||||
w->window_class == WC_TOOLTIPS ||
|
||||
w->window_class == WC_DROPDOWN_MENU) {
|
||||
return w;
|
||||
}
|
||||
|
||||
for (u = w; ++u != _last_window;) {
|
||||
if (u->window_class == WC_MAIN_WINDOW || IsVitalWindow(u) ||
|
||||
u->window_class == WC_TOOLTIPS || u->window_class == WC_DROPDOWN_MENU)
|
||||
continue;
|
||||
if (u->window_class == WC_MAIN_WINDOW ||
|
||||
IsVitalWindow(u) ||
|
||||
u->window_class == WC_TOOLTIPS ||
|
||||
u->window_class == WC_DROPDOWN_MENU) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (w->left + w->width <= u->left ||
|
||||
u->left + u->width <= w->left ||
|
||||
w->top + w->height <= u->top ||
|
||||
u->top + u->height <= w->top)
|
||||
continue;
|
||||
u->top + u->height <= w->top) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return BringWindowToFront(w);
|
||||
}
|
||||
|
@ -1337,18 +1334,26 @@ static void HandleKeypress(uint32 key)
|
|||
we.keypress.cont = true;
|
||||
|
||||
// check if we have a query string window open before allowing hotkeys
|
||||
if(FindWindowById(WC_QUERY_STRING, 0)!=NULL || FindWindowById(WC_SEND_NETWORK_MSG, 0)!=NULL || FindWindowById(WC_CONSOLE, 0)!=NULL || FindWindowById(WC_SAVELOAD, 0)!=NULL)
|
||||
if (FindWindowById(WC_QUERY_STRING, 0) != NULL ||
|
||||
FindWindowById(WC_SEND_NETWORK_MSG, 0) != NULL ||
|
||||
FindWindowById(WC_CONSOLE, 0) != NULL ||
|
||||
FindWindowById(WC_SAVELOAD, 0) != NULL) {
|
||||
query_open = true;
|
||||
}
|
||||
|
||||
// Call the event, start with the uppermost window.
|
||||
for(w=_last_window; w != _windows;) {
|
||||
for (w = _last_window; w != _windows;) {
|
||||
--w;
|
||||
// if a query window is open, only call the event for certain window types
|
||||
if(query_open && w->window_class!=WC_QUERY_STRING && w->window_class!=WC_SEND_NETWORK_MSG && w->window_class!=WC_CONSOLE && w->window_class!=WC_SAVELOAD)
|
||||
if (query_open &&
|
||||
w->window_class != WC_QUERY_STRING &&
|
||||
w->window_class != WC_SEND_NETWORK_MSG &&
|
||||
w->window_class != WC_CONSOLE &&
|
||||
w->window_class != WC_SAVELOAD) {
|
||||
continue;
|
||||
}
|
||||
w->wndproc(w, &we);
|
||||
if (!we.keypress.cont)
|
||||
break;
|
||||
if (!we.keypress.cont) break;
|
||||
}
|
||||
|
||||
if (we.keypress.cont) {
|
||||
|
@ -1370,26 +1375,13 @@ static void MouseLoop(int click, int mousewheel)
|
|||
DecreaseWindowCounters();
|
||||
HandlePlacePresize();
|
||||
UpdateTileSelection();
|
||||
if (!VpHandlePlaceSizingDrag())
|
||||
return;
|
||||
|
||||
if (!HandleDragDrop())
|
||||
return;
|
||||
|
||||
if (!HandlePopupMenu())
|
||||
return;
|
||||
|
||||
if (!HandleWindowDragging())
|
||||
return;
|
||||
|
||||
if (!HandleScrollbarScrolling())
|
||||
return;
|
||||
|
||||
if (!HandleViewportScroll())
|
||||
return;
|
||||
|
||||
if (!HandleMouseOver())
|
||||
return;
|
||||
if (!VpHandlePlaceSizingDrag()) return;
|
||||
if (!HandleDragDrop()) return;
|
||||
if (!HandlePopupMenu()) return;
|
||||
if (!HandleWindowDragging()) return;
|
||||
if (!HandleScrollbarScrolling()) return;
|
||||
if (!HandleViewportScroll()) return;
|
||||
if (!HandleMouseOver()) return;
|
||||
|
||||
x = _cursor.pos.x;
|
||||
y = _cursor.pos.y;
|
||||
|
@ -1422,17 +1414,18 @@ static void MouseLoop(int click, int mousewheel)
|
|||
}
|
||||
|
||||
w = FindWindowFromPt(x, y);
|
||||
if (w == NULL)
|
||||
return;
|
||||
if (w == NULL) return;
|
||||
w = MaybeBringWindowToFront(w);
|
||||
vp = IsPtInWindowViewport(w, x, y);
|
||||
if (vp != NULL) {
|
||||
if (_game_mode == GM_MENU)
|
||||
return;
|
||||
if (_game_mode == GM_MENU) return;
|
||||
|
||||
// only allow zooming in-out in main window, or in viewports
|
||||
if ( mousewheel && !(w->flags4 & WF_DISABLE_VP_SCROLL) &&
|
||||
(w->window_class == WC_MAIN_WINDOW || w->window_class == WC_EXTRA_VIEW_PORT) ) {
|
||||
if (mousewheel &&
|
||||
!(w->flags4 & WF_DISABLE_VP_SCROLL) && (
|
||||
w->window_class == WC_MAIN_WINDOW ||
|
||||
w->window_class == WC_EXTRA_VIEW_PORT
|
||||
)) {
|
||||
ZoomInOrOutToCursorWindow(mousewheel < 0,w);
|
||||
}
|
||||
|
||||
|
@ -1509,9 +1502,9 @@ void UpdateWindows(void)
|
|||
Window *w;
|
||||
int t;
|
||||
|
||||
|
||||
if ((t=_we4_timer+1) >= 100) {
|
||||
for(w = _last_window; w != _windows;) {
|
||||
t = _we4_timer + 1;
|
||||
if (t >= 100) {
|
||||
for (w = _last_window; w != _windows;) {
|
||||
w--;
|
||||
CallWindowEventNP(w, WE_4);
|
||||
}
|
||||
|
@ -1519,7 +1512,7 @@ void UpdateWindows(void)
|
|||
}
|
||||
_we4_timer = t;
|
||||
|
||||
for(w = _last_window; w != _windows;) {
|
||||
for (w = _last_window; w != _windows;) {
|
||||
w--;
|
||||
if (w->flags4 & WF_WHITE_BORDER_MASK) {
|
||||
w->flags4 -= WF_WHITE_BORDER_ONE;
|
||||
|
@ -1531,9 +1524,8 @@ void UpdateWindows(void)
|
|||
|
||||
DrawDirtyBlocks();
|
||||
|
||||
for(w = _windows; w!=_last_window; w++) {
|
||||
if (w->viewport != NULL)
|
||||
UpdateViewportPosition(w);
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->viewport != NULL) UpdateViewportPosition(w);
|
||||
}
|
||||
DrawTextMessage();
|
||||
// Redraw mouse cursor in case it was hidden
|
||||
|
@ -1546,8 +1538,10 @@ int GetMenuItemIndex(const Window *w, int x, int y)
|
|||
if ((x -= w->left) >= 0 && x < w->width && (y -= w->top + 1) >= 0) {
|
||||
y /= 10;
|
||||
|
||||
if (y < WP(w,menu_d).item_count && !HASBIT(WP(w,menu_d).disabled_items, y))
|
||||
if (y < WP(w, const menu_d).item_count &&
|
||||
!HASBIT(WP(w, const menu_d).disabled_items, y)) {
|
||||
return y;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -1556,9 +1550,8 @@ void InvalidateWindow(byte cls, WindowNumber number)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class==cls && w->window_number==number)
|
||||
SetWindowDirty(w);
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == cls && w->window_number == number) SetWindowDirty(w);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1576,8 +1569,8 @@ void InvalidateWindowWidget(byte cls, WindowNumber number, byte widget_index)
|
|||
{
|
||||
const Window* w;
|
||||
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class==cls && w->window_number==number) {
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == cls && w->window_number == number) {
|
||||
InvalidateWidget(w, widget_index);
|
||||
}
|
||||
}
|
||||
|
@ -1586,9 +1579,9 @@ void InvalidateWindowWidget(byte cls, WindowNumber number, byte widget_index)
|
|||
void InvalidateWindowClasses(byte cls)
|
||||
{
|
||||
const Window* w;
|
||||
for(w=_windows; w!=_last_window; w++) {
|
||||
if (w->window_class==cls)
|
||||
SetWindowDirty(w);
|
||||
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
if (w->window_class == cls) SetWindowDirty(w);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1596,7 +1589,8 @@ void InvalidateWindowClasses(byte cls)
|
|||
void CallWindowTickEvent(void)
|
||||
{
|
||||
Window *w;
|
||||
for(w=_last_window; w != _windows;) {
|
||||
|
||||
for (w = _last_window; w != _windows;) {
|
||||
--w;
|
||||
CallWindowEventNP(w, WE_TICK);
|
||||
}
|
||||
|
@ -1605,7 +1599,8 @@ void CallWindowTickEvent(void)
|
|||
void DeleteNonVitalWindows(void)
|
||||
{
|
||||
Window *w;
|
||||
for(w=_windows; w!=_last_window;) {
|
||||
|
||||
for (w = _windows; w != _last_window;) {
|
||||
if (w->window_class != WC_MAIN_WINDOW &&
|
||||
w->window_class != WC_SELECT_GAME &&
|
||||
w->window_class != WC_MAIN_TOOLBAR &&
|
||||
|
@ -1629,6 +1624,7 @@ void DeleteNonVitalWindows(void)
|
|||
void DeleteAllNonVitalWindows(void)
|
||||
{
|
||||
Window *w;
|
||||
|
||||
// Delete every window except for stickied ones
|
||||
DeleteNonVitalWindows();
|
||||
// Delete all sticked windows
|
||||
|
@ -1668,7 +1664,7 @@ void RelocateAllWindows(int neww, int newh)
|
|||
{
|
||||
Window *w;
|
||||
|
||||
for(w=_windows; w!= _last_window ;w++) {
|
||||
for (w = _windows; w != _last_window; w++) {
|
||||
int left, top;
|
||||
|
||||
if (w->window_class == WC_MAIN_WINDOW) {
|
||||
|
@ -1704,7 +1700,7 @@ void RelocateAllWindows(int neww, int newh)
|
|||
if (top + (w->height>>1) >= newh) top = newh - w->height;
|
||||
}
|
||||
|
||||
if (w->viewport) {
|
||||
if (w->viewport != NULL) {
|
||||
w->viewport->left += left - w->left;
|
||||
w->viewport->top += top - w->top;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue