(svn r8428) -Codechange: Add proper names to aircraft subtypes instead of magic numbers and add a function IsNormalAircraft() which tells us whether the aircraft is in fact some flying device or a rotor/shadow.

pull/155/head
Darkvater 18 years ago
parent 36039f318d
commit 2ff4492abc

@ -95,7 +95,7 @@ static void AiStateVehLoop(Player *p)
if ((v->type == VEH_Train && v->subtype == 0) ||
v->type == VEH_Road ||
(v->type == VEH_Aircraft && v->subtype <= 2) ||
(v->type == VEH_Aircraft && IsNormalAircraft(v)) ||
v->type == VEH_Ship) {
/* replace engine? */
if (v->type == VEH_Train && v->engine_type < 3 &&

@ -6,6 +6,28 @@
#include "station_map.h"
#include "vehicle.h"
typedef enum AircraftSubTypes {
AIR_HELICOPTER = 0,
AIR_AIRCRAFT = 2,
AIR_SHADOW = 4,
AIR_ROTOR = 6
} AircraftSubType;
/** Check if the aircraft type is a normal flying device; eg
* not a rotor or a shadow
* @param v vehicle to check
* @return Returns true if the aircraft is a helicopter/airplane and
* false if it is a shadow or a rotor) */
static inline bool IsNormalAircraft(const Vehicle *v)
{
assert(v->type == VEH_Aircraft);
/* To be fully correct the commented out functionality is the proper one,
* but since value can only be 0 or 2, it is sufficient to only check <= 2
* return (v->subtype == AIR_HELICOPTER) || (v->subtype == AIR_AIRCRAFT); */
return v->subtype <= AIR_AIRCRAFT;
}
static inline bool IsAircraftInHangar(const Vehicle* v)
{

@ -17,6 +17,7 @@
#include "news.h"
#include "sound.h"
#include "player.h"
#include "aircraft.h"
#include "airport.h"
#include "vehicle_gui.h"
#include "table/sprites.h"
@ -129,7 +130,7 @@ SpriteID GetRotorImage(const Vehicle *v)
{
const Vehicle *w;
assert((v->subtype & 1) == 0);
assert(v->subtype == AIR_HELICOPTER);
w = v->next->next;
if (is_custom_sprite(v->spritenum)) {
@ -206,11 +207,10 @@ uint16 AircraftDefaultCargoCapacity(CargoID cid, EngineID engine_type)
int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
int32 value;
Vehicle *vl[3], *v, *u, *w;
Vehicle *vl[3];
UnitID unit_num;
const AircraftVehicleInfo *avi;
const AirportFTAClass* ap;
Engine *e;
if (!IsEngineBuildable(p1, VEH_Aircraft, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
@ -231,7 +231,8 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
return CMD_ERROR;
}
// allocate 2 or 3 vehicle structs, depending on type
/* Allocate 2 or 3 vehicle structs, depending on type
* vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */
if (!AllocateVehicles(vl, avi->subtype & AIR_CTOL ? 2 : 3) ||
IsOrderPoolFull()) {
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
@ -246,8 +247,8 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
uint x;
uint y;
v = vl[0];
u = vl[1];
Vehicle *v = vl[0]; // aircraft
Vehicle *u = vl[1]; // shadow
v->unitnumber = unit_num;
v->type = u->type = VEH_Aircraft;
@ -302,10 +303,10 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v->acceleration = avi->acceleration;
v->engine_type = p1;
v->subtype = (avi->subtype & AIR_CTOL ? 2 : 0);
v->subtype = (avi->subtype & AIR_CTOL ? AIR_AIRCRAFT : AIR_HELICOPTER);
v->value = value;
u->subtype = 4;
u->subtype = AIR_SHADOW;
/* Danger, Will Robinson!
* If the aircraft is refittable, but cannot be refitted to
@ -333,7 +334,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
u->cargo_cap = 0;
}
e = GetEngine(p1);
const Engine *e = GetEngine(p1);
v->reliability = e->reliability;
v->reliability_spd_dec = e->reliability_spd_dec;
v->max_age = e->lifelength * 366;
@ -381,8 +382,8 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
VehiclePositionChanged(u);
// Aircraft with 3 vehicles (chopper)?
if (v->subtype == 0) {
w = vl[2];
if (v->subtype == AIR_HELICOPTER) {
Vehicle *w = vl[2];
u->next = w;
@ -397,7 +398,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
w->z_height = 1;
w->vehstatus = VS_HIDDEN | VS_UNCLICKABLE;
w->spritenum = 0xFF;
w->subtype = 6;
w->subtype = AIR_ROTOR;
w->cur_image = SPR_ROTOR_STOPPED;
w->random_bits = VehicleRandomBits();
/* Use rotor's air.state to store the rotor animation frame */
@ -700,7 +701,7 @@ void OnNewDay_Aircraft(Vehicle *v)
{
int32 cost;
if (v->subtype > 2) return;
if (!IsNormalAircraft(v)) return;
if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v);
@ -728,7 +729,7 @@ void AircraftYearlyLoop(void)
Vehicle *v;
FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Aircraft && v->subtype <= 2) {
if (v->type == VEH_Aircraft && IsNormalAircraft(v)) {
v->profit_last_year = v->profit_this_year;
v->profit_this_year = 0;
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
@ -807,7 +808,7 @@ static void SetAircraftPosition(Vehicle *v, int x, int y, int z)
v->z_pos = z;
v->cur_image = GetAircraftImage(v, v->direction);
if (v->subtype == 0) v->next->next->cur_image = GetRotorImage(v);
if (v->subtype == AIR_HELICOPTER) v->next->next->cur_image = GetRotorImage(v);
BeginVehicleMove(v);
VehiclePositionChanged(v);
@ -1250,9 +1251,7 @@ static void ProcessAircraftOrder(Vehicle *v)
static void MarkAircraftDirty(Vehicle *v)
{
v->cur_image = GetAircraftImage(v, v->direction);
if (v->subtype == 0) {
v->next->next->cur_image = GetRotorImage(v);
}
if (v->subtype == AIR_HELICOPTER) v->next->next->cur_image = GetRotorImage(v);
MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
}
@ -1488,14 +1487,14 @@ static void AircraftEventHandler_InHangar(Vehicle *v, const AirportFTAClass *apc
if (v->current_order.dest == v->u.air.targetairport) {
// FindFreeTerminal:
// 1. Find a free terminal, 2. Occupy it, 3. Set the vehicle's state to that terminal
if (v->subtype != 0) {
if (!AirportFindFreeTerminal(v, apc)) return; // airplane
} else {
if (v->subtype == AIR_HELICOPTER) {
if (!AirportFindFreeHelipad(v, apc)) return; // helicopter
} else {
if (!AirportFindFreeTerminal(v, apc)) return; // airplane
}
} else { // Else prepare for launch.
// airplane goto state takeoff, helicopter to helitakeoff
v->u.air.state = (v->subtype != 0) ? TAKEOFF : HELITAKEOFF;
v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
}
AircraftLeaveHangar(v);
AirportMove(v, apc);
@ -1510,7 +1509,7 @@ static void AircraftEventHandler_AtTerminal(Vehicle *v, const AirportFTAClass *a
// on an airport with helipads, a helicopter will always land there
// and get serviced at the same time - patch setting
if (_patches.serviceathelipad) {
if (v->subtype == 0 && apc->helipads != NULL) {
if (v->subtype == AIR_HELICOPTER && apc->helipads != NULL) {
// an exerpt of ServiceAircraft, without the invisibility stuff
v->date_of_last_service = _date;
v->breakdowns_since_last_service = 0;
@ -1532,13 +1531,13 @@ static void AircraftEventHandler_AtTerminal(Vehicle *v, const AirportFTAClass *a
switch (v->current_order.type) {
case OT_GOTO_STATION: // ready to fly to another airport
// airplane goto state takeoff, helicopter to helitakeoff
v->u.air.state = (v->subtype != 0) ? TAKEOFF : HELITAKEOFF;
v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
break;
case OT_GOTO_DEPOT: // visit hangar for serivicing, sale, etc.
if (v->current_order.dest == v->u.air.targetairport) {
v->u.air.state = HANGAR;
} else {
v->u.air.state = (v->subtype != 0) ? TAKEOFF : HELITAKEOFF;
v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
}
break;
default: // orders have been deleted (no orders), goto depot and don't bother us
@ -1612,7 +1611,7 @@ static void AircraftEventHandler_Flying(Vehicle *v, const AirportFTAClass *apc)
// {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
landingtype = (v->subtype != 0) ? LANDING : HELILANDING;
landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
current = apc->layout[v->u.air.pos].next;
while (current != NULL) {
if (current->heading == landingtype) {
@ -2024,9 +2023,9 @@ void Aircraft_Tick(Vehicle *v)
{
int i;
if (v->subtype > 2) return;
if (!IsNormalAircraft(v)) return;
if (v->subtype == 0) HelicopterTickHandler(v);
if (v->subtype == AIR_HELICOPTER) HelicopterTickHandler(v);
AgeAircraftCargo(v);
@ -2063,7 +2062,7 @@ void UpdateOldAircraft(void)
FOR_ALL_VEHICLES(v_oldstyle) {
// airplane has another vehicle with subtype 4 (shadow), helicopter also has 3 (rotor)
// skip those
if (v_oldstyle->type == VEH_Aircraft && v_oldstyle->subtype <= 2) {
if (v_oldstyle->type == VEH_Aircraft && IsNormalAircraft(v_oldstyle)) {
// airplane in terminal stopped doesn't hurt anyone, so goto next
if (v_oldstyle->vehstatus & VS_STOPPED && v_oldstyle->u.air.state == 0) {
v_oldstyle->u.air.state = HANGAR;
@ -2078,7 +2077,7 @@ void UpdateOldAircraft(void)
v_oldstyle->tile = 0; // aircraft in air is tile=0
// correct speed of helicopter-rotors
if (v_oldstyle->subtype == 0) v_oldstyle->next->next->cur_speed = 32;
if (v_oldstyle->subtype == AIR_HELICOPTER) v_oldstyle->next->next->cur_speed = 32;
// set new position x,y,z
SetAircraftPosition(v_oldstyle, gp.x, gp.y, GetAircraftFlyingAltitude(v_oldstyle));
@ -2095,7 +2094,7 @@ void UpdateAirplanesOnNewStation(Station *st)
// only 1 station is updated per function call, so it is enough to get entry_point once
const AirportFTAClass *ap = GetAirport(st->airport_type);
FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Aircraft && v->subtype <= 2) {
if (v->type == VEH_Aircraft && IsNormalAircraft(v)) {
if (v->u.air.targetairport == st->index) { // if heading to this airport
/* update position of airplane. If plane is not flying, landing, or taking off
*you cannot delete airport, so it doesn't matter
@ -2110,7 +2109,7 @@ void UpdateAirplanesOnNewStation(Station *st)
SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v));
} else {
assert(v->u.air.state == ENDTAKEOFF || v->u.air.state == HELITAKEOFF);
takeofftype = (v->subtype == 0) ? HELITAKEOFF : ENDTAKEOFF;
takeofftype = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : ENDTAKEOFF;
// search in airportdata for that heading
// easiest to do, since this doesn't happen a lot
for (cnt = 0; cnt < ap->nofelements; cnt++) {

@ -24,7 +24,7 @@ void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selection)
{
SpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
DrawSprite(GetAircraftImage(v, DIR_W), pal, x + 25, y + 10);
if (v->subtype == 0) {
if (v->subtype == AIR_HELICOPTER) {
SpriteID rotor_sprite = GetCustomRotorSprite(v, true);
if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED;
DrawSprite(rotor_sprite, PAL_NONE, x + 25, y + 5);
@ -114,7 +114,7 @@ static void AircraftDetailsWndProc(Window *w, WindowEvent *e)
int y = 57;
do {
if (v->subtype <= 2) {
if (IsNormalAircraft(v)) {
SetDParam(0, GetCustomEngineName(v->engine_type));
SetDParam(1, v->build_year);
SetDParam(2, v->value);

@ -27,6 +27,7 @@
#include "vehicle_gui.h"
#include "ai/ai.h"
#include "train.h"
#include "aircraft.h"
#include "newgrf_engine.h"
#include "newgrf_sound.h"
#include "newgrf_callbacks.h"
@ -76,7 +77,7 @@ int64 CalculateCompanyValue(const Player* p)
if (v->type == VEH_Train ||
v->type == VEH_Road ||
(v->type == VEH_Aircraft && v->subtype<=2) ||
(v->type == VEH_Aircraft && IsNormalAircraft(v)) ||
v->type == VEH_Ship) {
value += v->value * 3 >> 1;
}
@ -108,7 +109,7 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
if (v->owner != owner) continue;
if ((v->type == VEH_Train && IsFrontEngine(v)) ||
v->type == VEH_Road ||
(v->type == VEH_Aircraft && v->subtype <= 2) ||
(v->type == VEH_Aircraft && IsNormalAircraft(v)) ||
v->type == VEH_Ship) {
num++;
if (v->age > 730) {
@ -299,7 +300,7 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
case VEH_Train: if (IsFrontEngine(v)) num_train++; break;
case VEH_Road: num_road++; break;
case VEH_Ship: num_ship++; break;
case VEH_Aircraft: if (v->subtype <= 2) num_aircraft++; break;
case VEH_Aircraft: if (IsNormalAircraft(v)) num_aircraft++; break;
default: break;
}
}
@ -319,7 +320,7 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
case VEH_Train: if (IsFrontEngine(v)) v->unitnumber = ++num_train; break;
case VEH_Road: v->unitnumber = ++num_road; break;
case VEH_Ship: v->unitnumber = ++num_ship; break;
case VEH_Aircraft: if (v->subtype <= 2) v->unitnumber = ++num_aircraft; break;
case VEH_Aircraft: if (IsNormalAircraft(v)) v->unitnumber = ++num_aircraft; break;
}
}
}

@ -14,6 +14,7 @@
#include "saveload.h"
#include "variables.h"
#include "train.h"
#include "aircraft.h"
#include "newgrf_cargo.h"
#include "date.h"
#include "table/engines.h"
@ -306,7 +307,7 @@ static void NewVehicleAvailable(Engine *e)
FOR_ALL_VEHICLES(v) {
if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship ||
(v->type == VEH_Aircraft && v->subtype <= 2)) {
(v->type == VEH_Aircraft && IsNormalAircraft(v))) {
if (v->owner == p->index && v->engine_type == index) {
/* The user did prove me wrong, so restore old value */
p->block_preview = block_preview;

@ -45,7 +45,7 @@ typedef struct ShipVehicleInfo {
bool refittable;
} ShipVehicleInfo;
// Aircraft subtypes
/* AircraftVehicleInfo subtypes */
enum {
AIR_CTOL = 1, // Conventional Take Off and Landing, i.e. planes
AIR_FAST = 2

@ -10,6 +10,7 @@
#include "network_data.h"
#include "core/tcp.h"
#include "../train.h"
#include "../aircraft.h"
#include "../date.h"
#include "table/strings.h"
#include "../functions.h"
@ -1255,7 +1256,7 @@ void NetworkPopulateCompanyInfo(void)
break;
case VEH_Aircraft:
if (v->subtype <= 2) _network_player_info[v->owner].num_vehicle[3]++;
if (IsNormalAircraft(v)) _network_player_info[v->owner].num_vehicle[3]++;
break;
case VEH_Ship:

@ -16,6 +16,7 @@
#include "network/network.h"
#include "variables.h"
#include "train.h"
#include "aircraft.h"
#include "date.h"
#include "newgrf.h"
#include "network/network_data.h"
@ -607,7 +608,7 @@ static void DrawPlayerVehiclesAmount(PlayerID player)
switch (v->type) {
case VEH_Train: if (IsFrontEngine(v)) train++; break;
case VEH_Road: road++; break;
case VEH_Aircraft: if (v->subtype <= 2) air++; break;
case VEH_Aircraft: if (IsNormalAircraft(v)) air++; break;
case VEH_Ship: ship++; break;
default: break;
}

@ -232,7 +232,7 @@ void AfterLoadVehicles(void)
case VEH_Road: v->cur_image = GetRoadVehImage(v, v->direction); break;
case VEH_Ship: v->cur_image = GetShipImage(v, v->direction); break;
case VEH_Aircraft:
if (v->subtype == 0 || v->subtype == 2) {
if (IsNormalAircraft(v)) {
v->cur_image = GetAircraftImage(v, v->direction);
if (v->next != NULL) v->next->cur_image = v->cur_image;
}
@ -537,7 +537,7 @@ uint CountVehiclesInChain(const Vehicle* v)
bool IsEngineCountable(const Vehicle *v)
{
switch (v->type) {
case VEH_Aircraft: return (v->subtype <= 2); // don't count plane shadows and helicopter rotors
case VEH_Aircraft: return IsNormalAircraft(v); // don't count plane shadows and helicopter rotors
case VEH_Train:
return !IsArticulatedPart(v) && // tenders and other articulated parts
(!IsMultiheaded(v) || IsTrainEngine(v)); // rear parts of multiheaded engines
@ -651,7 +651,7 @@ void CallVehicleTicks(void)
case VEH_Aircraft:
case VEH_Ship:
if (v->type == VEH_Train && IsTrainWagon(v)) continue;
if (v->type == VEH_Aircraft && v->subtype > 0) continue;
if (v->type == VEH_Aircraft && v->subtype != AIR_HELICOPTER) continue;
v->motion_counter += (v->direction & 1) ? (v->cur_speed * 3) / 4 : v->cur_speed;
/* Play a running sound if the motion counter passes 256 (Do we not skip sounds?) */
@ -2334,8 +2334,7 @@ void BuildDepotVehicleList(byte type, TileIndex tile, Vehicle ***engine_list, ui
case VEH_Aircraft:
FOR_ALL_VEHICLES(v) {
if (v->tile == tile &&
v->type == VEH_Aircraft &&
v->subtype <= 2 &&
v->type == VEH_Aircraft && IsNormalAircraft(v) &&
v->vehstatus & VS_HIDDEN) {
if (*engine_count == *engine_list_length) ExtendVehicleListSize((const Vehicle***)engine_list, engine_list_length, 25);
(*engine_list)[(*engine_count)++] = v;
@ -2362,7 +2361,7 @@ void BuildDepotVehicleList(byte type, TileIndex tile, Vehicle ***engine_list, ui
*/
uint GenerateVehicleSortList(const Vehicle ***sort_list, uint16 *length_of_array, byte type, PlayerID owner, uint32 index, uint16 window_type)
{
const uint subtype = (type != VEH_Aircraft) ? Train_Front : 2;
const byte subtype = (type != VEH_Aircraft) ? (byte)Train_Front : (byte)AIR_AIRCRAFT;
uint n = 0;
const Vehicle *v;

@ -144,7 +144,7 @@ typedef struct VehicleShip {
struct Vehicle {
byte type; // type, ie roadven,train,ship,aircraft,special
byte subtype; // subtype (Filled with values from EffectVehicles or TrainSubTypes)
byte subtype; // subtype (Filled with values from EffectVehicles/TrainSubTypes/AircraftSubTypes)
VehicleID index; // NOSAVE: Index in vehicle array

Loading…
Cancel
Save