mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-02 12:24:15 +00:00
(svn r4643) - NewGRF: Add support for ttdp aircraft states. This involves mapping from our own state. (heavily based on mart3p's code)
This commit is contained in:
parent
d1fa0742a5
commit
f0ea2b0551
224
newgrf_engine.c
224
newgrf_engine.c
@ -8,6 +8,8 @@
|
||||
#include "engine.h"
|
||||
#include "train.h"
|
||||
#include "player.h"
|
||||
#include "station.h"
|
||||
#include "airport.h"
|
||||
#include "newgrf_callbacks.h"
|
||||
#include "newgrf_engine.h"
|
||||
#include "newgrf_station.h"
|
||||
@ -173,6 +175,222 @@ static int MapOldSubType(const Vehicle *v)
|
||||
}
|
||||
|
||||
|
||||
/* TTDP style aircraft movement states for GRF Action 2 Var 0xE2 */
|
||||
enum {
|
||||
AMS_TTDP_HANGER,
|
||||
AMS_TTDP_TO_HANGER,
|
||||
AMS_TTDP_TO_PAD1,
|
||||
AMS_TTDP_TO_PAD2,
|
||||
AMS_TTDP_TO_PAD3,
|
||||
AMS_TTDP_TO_ENTRY_2_AND_3,
|
||||
AMS_TTDP_TO_ENTRY_2_AND_3_AND_H,
|
||||
AMS_TTDP_TO_JUNCTION,
|
||||
AMS_TTDP_LEAVE_RUNWAY,
|
||||
AMS_TTDP_TO_INWAY,
|
||||
AMS_TTDP_TO_RUNWAY,
|
||||
AMS_TTDP_TO_OUTWAY,
|
||||
AMS_TTDP_WAITING,
|
||||
AMS_TTDP_TAKEOFF,
|
||||
AMS_TTDP_TO_TAKEOFF,
|
||||
AMS_TTDP_CLIMBING,
|
||||
AMS_TTDP_FLIGHT_APPROACH,
|
||||
AMS_TTDP_UNUSED_0x11,
|
||||
AMS_TTDP_FLIGHT_TO_TOWER,
|
||||
AMS_TTDP_UNUSED_0x13,
|
||||
AMS_TTDP_FLIGHT_FINAL,
|
||||
AMS_TTDP_FLIGHT_DESCENT,
|
||||
AMS_TTDP_BRAKING,
|
||||
AMS_TTDP_HELI_TAKEOFF_AIRPOPT,
|
||||
AMS_TTDP_HELI_TO_TAKEOFF_AIRPOPT,
|
||||
AMS_TTDP_HELI_LAND_AIRPOPT,
|
||||
AMS_TTDP_HELI_TAKEOFF_HELIPORT,
|
||||
AMS_TTDP_HELI_TO_TAKEOFF_HELIPORT,
|
||||
AMS_TTDP_HELI_LAND_HELIPORT,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Map OTTD aircraft movement states to TTDPatch style movement states
|
||||
* (VarAction 2 Variable 0xE2)
|
||||
*/
|
||||
static byte MapAircraftMovementState(const Vehicle *v)
|
||||
{
|
||||
const Station *st = GetStation(v->u.air.targetairport);
|
||||
byte amdflag = GetAirportMovingData(st->airport_type, v->u.air.pos)->flag;
|
||||
|
||||
switch (v->u.air.state) {
|
||||
case HANGAR:
|
||||
/* The international airport is a special case as helicopters can land in
|
||||
* front of the hanger. Helicopters also change their air.state to
|
||||
* AMED_HELI_LOWER some time before actually descending. */
|
||||
|
||||
/* This condition only occurs for helicopters, during descent,
|
||||
* to a landing by the hanger of an international airport. */
|
||||
if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPOPT;
|
||||
|
||||
/* This condition only occurs for helicopters, before starting descent,
|
||||
* to a landing by the hanger of an international airport. */
|
||||
if (amdflag & AMED_SLOWTURN) return AMS_TTDP_FLIGHT_TO_TOWER;
|
||||
|
||||
// The final two conditions apply to helicopters or aircraft.
|
||||
/* Has reached hanger? */
|
||||
if (amdflag & AMED_EXACTPOS) return AMS_TTDP_HANGER;
|
||||
|
||||
// Still moving towards hanger.
|
||||
return AMS_TTDP_TO_HANGER;
|
||||
|
||||
case TERM1:
|
||||
if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD1;
|
||||
return AMS_TTDP_TO_JUNCTION;
|
||||
|
||||
case TERM2:
|
||||
if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD2;
|
||||
return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
|
||||
|
||||
case TERM3:
|
||||
case TERM4:
|
||||
case TERM5:
|
||||
case TERM6:
|
||||
/* TTDPatch only has 3 terminals, so treat these states the same */
|
||||
if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD3;
|
||||
return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
|
||||
|
||||
case HELIPAD1:
|
||||
case HELIPAD2: // Will only occur for helicopters.
|
||||
if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPOPT; // Descending.
|
||||
if (amdflag & AMED_SLOWTURN) return AMS_TTDP_FLIGHT_TO_TOWER; // Still hasn't started descent.
|
||||
return AMS_TTDP_TO_JUNCTION; // On the ground.
|
||||
|
||||
case TAKEOFF: // Moving to takeoff position.
|
||||
return AMS_TTDP_TO_OUTWAY;
|
||||
|
||||
case STARTTAKEOFF: // Accelerating down runway.
|
||||
return AMS_TTDP_TAKEOFF;
|
||||
|
||||
case ENDTAKEOFF: // Ascent
|
||||
return AMS_TTDP_CLIMBING;
|
||||
|
||||
case HELITAKEOFF: // Helicopter is moving to take off position.
|
||||
switch (st->airport_type) {
|
||||
case AT_SMALL:
|
||||
case AT_LARGE:
|
||||
case AT_METROPOLITAN:
|
||||
case AT_INTERNATIONAL:
|
||||
if (amdflag & AMED_HELI_RAISE) return AMS_TTDP_HELI_TAKEOFF_AIRPOPT;
|
||||
return AMS_TTDP_TO_JUNCTION;
|
||||
|
||||
case AT_HELIPORT:
|
||||
case AT_OILRIG:
|
||||
return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
|
||||
|
||||
default:
|
||||
return AMS_TTDP_HELI_TAKEOFF_AIRPOPT;
|
||||
}
|
||||
|
||||
case FLYING:
|
||||
return AMS_TTDP_FLIGHT_TO_TOWER;
|
||||
|
||||
case LANDING: // Descent
|
||||
return AMS_TTDP_FLIGHT_DESCENT;
|
||||
|
||||
case ENDLANDING: // On the runway braking
|
||||
if (amdflag & AMED_BRAKE) return AMS_TTDP_BRAKING;
|
||||
// Landed - moving off runway
|
||||
return AMS_TTDP_TO_INWAY;
|
||||
|
||||
case HELILANDING:
|
||||
case HELIENDLANDING: // Helicoptor is decending.
|
||||
if (amdflag & AMED_HELI_LOWER) {
|
||||
switch (st->airport_type) {
|
||||
case AT_HELIPORT:
|
||||
case AT_OILRIG:
|
||||
return AMS_TTDP_HELI_LAND_HELIPORT;
|
||||
|
||||
default:
|
||||
return AMS_TTDP_HELI_LAND_AIRPOPT;
|
||||
}
|
||||
}
|
||||
return AMS_TTDP_FLIGHT_TO_TOWER;
|
||||
|
||||
default:
|
||||
return AMS_TTDP_HANGER;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* TTDP style aircraft movement action for GRF Action 2 Var 0xE6 */
|
||||
enum {
|
||||
AMA_TTDP_IN_HANGER,
|
||||
AMA_TTDP_ON_PAD1,
|
||||
AMA_TTDP_ON_PAD2,
|
||||
AMA_TTDP_ON_PAD3,
|
||||
AMA_TTDP_HANGER_TO_PAD1,
|
||||
AMA_TTDP_HANGER_TO_PAD2,
|
||||
AMA_TTDP_HANGER_TO_PAD3,
|
||||
AMA_TTDP_LANDING_TO_PAD1,
|
||||
AMA_TTDP_LANDING_TO_PAD2,
|
||||
AMA_TTDP_LANDING_TO_PAD3,
|
||||
AMA_TTDP_PAD1_TO_HANGER,
|
||||
AMA_TTDP_PAD2_TO_HANGER,
|
||||
AMA_TTDP_PAD3_TO_HANGER,
|
||||
AMA_TTDP_PAD1_TO_TAKEOFF,
|
||||
AMA_TTDP_PAD2_TO_TAKEOFF,
|
||||
AMA_TTDP_PAD3_TO_TAKEOFF,
|
||||
AMA_TTDP_HANGER_TO_TAKOFF,
|
||||
AMA_TTDP_LANDING_TO_HANGER,
|
||||
AMA_TTDP_IN_FLIGHT,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Map OTTD aircraft movement states to TTDPatch style movement actions
|
||||
* (VarAction 2 Variable 0xE6)
|
||||
* This is not fully supported yet but it's enough for Planeset.
|
||||
*/
|
||||
static byte MapAircraftMovementAction(const Vehicle *v)
|
||||
{
|
||||
switch (v->u.air.state) {
|
||||
case HANGAR:
|
||||
return (v->cur_speed > 0) ? AMA_TTDP_LANDING_TO_HANGER : AMA_TTDP_IN_HANGER;
|
||||
|
||||
case TERM1:
|
||||
case HELIPAD1:
|
||||
return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
|
||||
|
||||
case TERM2:
|
||||
case HELIPAD2:
|
||||
return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
|
||||
|
||||
case TERM3:
|
||||
case TERM4:
|
||||
case TERM5:
|
||||
case TERM6:
|
||||
return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
|
||||
|
||||
case TAKEOFF: // Moving to takeoff position
|
||||
case STARTTAKEOFF: // Accelerating down runway
|
||||
case ENDTAKEOFF: // Ascent
|
||||
case HELITAKEOFF:
|
||||
// TODO Need to find which terminal (or hanger) we've come from. How?
|
||||
return AMA_TTDP_PAD1_TO_TAKEOFF;
|
||||
|
||||
case FLYING:
|
||||
return AMA_TTDP_IN_FLIGHT;
|
||||
|
||||
case LANDING: // Descent
|
||||
case ENDLANDING: // On the runway braking
|
||||
case HELILANDING:
|
||||
case HELIENDLANDING:
|
||||
// TODO Need to check terminal we're landing to. Is it known yet?
|
||||
return (v->current_order.type == OT_GOTO_DEPOT) ?
|
||||
AMA_TTDP_LANDING_TO_HANGER : AMA_TTDP_LANDING_TO_PAD1;
|
||||
|
||||
default:
|
||||
return AMA_TTDP_IN_HANGER;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Vehicle Resolver Functions */
|
||||
static inline const Vehicle *GRV(const ResolverObject *object)
|
||||
{
|
||||
@ -363,9 +581,9 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
|
||||
|
||||
case VEH_Aircraft:
|
||||
switch (variable - 0x80) {
|
||||
// case 0x62: XXX Need to convert from ottd to ttdp state
|
||||
case 0x63: return v->u.air.targetairport;
|
||||
// case 0x66: XXX
|
||||
case 0x62: return MapAircraftMovementState(v); // Current movement state
|
||||
case 0x63: return v->u.air.targetairport; // Airport to which the action refers
|
||||
case 0x66: return MapAircraftMovementAction(v); // Current movement action
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user