summaryrefslogtreecommitdiff
path: root/aircraft_cmd.c
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2005-05-12 00:11:37 +0000
committerDarkvater <Darkvater@openttd.org>2005-05-12 00:11:37 +0000
commit562a32c3ee7b1c3ebf87968bd57163dada00d941 (patch)
tree2a2c6834d0b034f560428a4c3abe47e5e2df1f44 /aircraft_cmd.c
parent238106257d8394ad40fe53af05ff27c1c939d2f9 (diff)
downloadopenttd-562a32c3ee7b1c3ebf87968bd57163dada00d941.tar.xz
(svn r2297) - CodeChange: server-check the next batch of commands.
- CodeChange: since only the server will be able to modify difficulty settings, leave the checking of correct values besides, and trust users will join legit servers. - CodeChange: for renaming signs, only check if GetDParam(); eg _decode_parameters is empty ('\0') or not, instead of the extra check of players, etc. That basically does the same thing. Also dirty sign two times when renaming, once before, once after the action. Because if the name becomes shorter and you update only after, garbage remains on the screen. - CodeChange: made GetMaskOfTownActions() available to the town-cmd to double-check if the action was available to the player. For this purpose the hardcoded _local_player has been removed from the function and is now passed as a parameter.
Diffstat (limited to 'aircraft_cmd.c')
-rw-r--r--aircraft_cmd.c72
1 files changed, 38 insertions, 34 deletions
diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 423e97c45..b351fca6f 100644
--- 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 **vl, int num)
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, uint32 flags, uint32 p1, uint32 p2)
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, uint32 flags, uint32 p1, uint32 p2)
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, uint32 flags, uint32 p1, uint32 p2)
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, uint32 flags, uint32 p1, uint32 p2)
// 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, uint32 flags, uint32 p1, uint32 p2)
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 y, uint32 flags, uint32 p1, uint32 p2)
}
} 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);
-
- next_airport_has_hangar = false;
- if (station == INVALID_STATION) return CMD_ERROR;
- st = GetStation(station);
- next_airport_index = station;
- } else {
- return CMD_ERROR;
- }
+ if (!IsValidStation(st) || st->airport_tile == 0 || GetAirport(st->airport_type)->nof_depots == 0) {
+ StationID station;
+
+ 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(Vehicle *v, const AirportFTAClass *Airp
// 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;