diff --git a/aircraft_cmd.c b/aircraft_cmd.c --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -41,11 +41,11 @@ static const SpriteID _aircraft_sprite[] * INVALID_STATION is returned, if the player does not have any suitable * airports (like helipads only) */ -static uint16 FindNearestHangar(const Vehicle *v) +static StationID FindNearestHangar(const Vehicle *v) { const Station *st; uint best = 0; - uint16 index = INVALID_STATION; + StationID index = INVALID_STATION; FOR_ALL_STATIONS(st) { if (st->owner == v->owner && st->facilities & FACIL_AIRPORT && @@ -153,13 +153,17 @@ static bool AllocateVehicles(Vehicle **v return success; } -int32 EstimateAircraftCost(uint16 engine_type) +int32 EstimateAircraftCost(EngineID engine_type) { return AircraftVehInfo(engine_type)->base_cost * (_price.aircraft_base>>3)>>5; } -/* p1 = engine */ +/** Build an aircraft. + * @param x,y tile coordinates of depot where aircraft is built + * @param p1 aircraft type being built (engine) + * @param p2 unused + */ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) { int32 value; @@ -180,8 +184,7 @@ int32 CmdBuildAircraft(int x, int y, uin value = EstimateAircraftCost(p1); - if (flags & DC_QUERY_COST) - return value; + if (flags & DC_QUERY_COST) return value; // allocate 2 or 3 vehicle structs, depending on type if (!AllocateVehicles(vl, (avi->subtype & 1) == 0 ? 3 : 2) || @@ -299,7 +302,7 @@ int32 CmdBuildAircraft(int x, int y, uin VehiclePositionChanged(v); VehiclePositionChanged(u); - // Aircraft with 3 vehicles? + // Aircraft with 3 vehicles (chopper)? if (v->subtype == 0) { w = vl[2]; @@ -323,10 +326,9 @@ int32 CmdBuildAircraft(int x, int y, uin InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); RebuildVehicleLists(); InvalidateWindow(WC_COMPANY, v->owner); + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window } - InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); //updates the replace Aircraft window - return value; } @@ -381,16 +383,15 @@ int32 CmdSellAircraft(int x, int y, uint // Invalidate depot InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); DoDeleteAircraft(v); + InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window } - InvalidateWindow(WC_REPLACE_VEHICLE, VEH_Aircraft); // updates the replace Aircraft window - return -(int32)v->value; } /** Start/Stop an aircraft. * @param x,y unused - * @param p1 aircraft to start/stop + * @param p1 aircraft ID to start/stop * @param p2 unused */ int32 CmdStartStopAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2) @@ -417,20 +418,23 @@ int32 CmdStartStopAircraft(int x, int y, return 0; } -// p1 = vehicle -// p2 = if set, the aircraft will try to goto a depot, but not stop +/** Send an aircraft to the hangar. + * @param x,y unused + * @param p1 vehicle ID to send to the hangar + * @param p2 various bitmasked elements + * - p2 = 0 - aircraft goes to the depot and stays there (user command) + * - p2 non-zero - aircraft will try to goto a depot, but not stop there (eg forced servicing) + * - p2 (bit 17) - aircraft will try to goto a depot at the next airport + */ int32 CmdSendAircraftToHangar(int x, int y, uint32 flags, uint32 p1, uint32 p2) { Vehicle *v; - Station *st; - uint16 next_airport_index; if (!IsVehicleIndex(p1)) return CMD_ERROR; v = GetVehicle(p1); - if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) - return CMD_ERROR; + if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR; if (v->current_order.type == OT_GOTO_DEPOT && p2 == 0) { if (flags & DC_EXEC) { @@ -441,23 +445,23 @@ int32 CmdSendAircraftToHangar(int x, int } } else { bool next_airport_has_hangar = true; - next_airport_index = (HASBIT(p2, 17)) ? (int16)p2 : v->u.air.targetairport; - st = GetStation(next_airport_index); + /* XXX - I don't think p2 is any valid station cause all calls use either 0, 1, or 1<<16!!!!!!!!! */ + StationID next_airport_index = (HASBIT(p2, 17)) ? (StationID)p2 : v->u.air.targetairport; + const Station *st = GetStation(next_airport_index); // If an airport doesn't have terminals (so no landing space for airports), // it surely doesn't have any hangars - if (st->xy == 0 || st->airport_tile == 0 || - GetAirport(st->airport_type)->nof_depots == 0) { - if (p2 == 0) { - // the aircraft has to search for a hangar on its own - uint16 station = FindNearestHangar(v); + if (!IsValidStation(st) || st->airport_tile == 0 || GetAirport(st->airport_type)->nof_depots == 0) { + StationID station; - next_airport_has_hangar = false; - if (station == INVALID_STATION) return CMD_ERROR; - st = GetStation(station); - next_airport_index = station; - } else { - return CMD_ERROR; - } + if (p2 != 0) return CMD_ERROR; + // the aircraft has to search for a hangar on its own + station = FindNearestHangar(v); + + next_airport_has_hangar = false; + if (station == INVALID_STATION) return CMD_ERROR; + st = GetStation(station); + next_airport_index = station; + } if (flags & DC_EXEC) { @@ -1594,7 +1598,7 @@ static void AircraftEventHandler_Landing // only the vehicle owner needs to calculate the rest (locally) if ((_autoreplace_array[v->engine_type] != v->engine_type) || (_patches.autorenew && v->age - v->max_age > (_patches.autorenew_months * 30))) { - // send the aircraft to the hangar at next airport + // send the aircraft to the hangar at next airport (bit 17 set) _current_player = _local_player; DoCommandP(v->tile, v->index, 1 << 16, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR); _current_player = OWNER_NONE;