(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:
		
							
								
								
									
										224
									
								
								newgrf_engine.c
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								newgrf_engine.c
									
									
									
									
									
								
							@@ -8,6 +8,8 @@
 | 
				
			|||||||
#include "engine.h"
 | 
					#include "engine.h"
 | 
				
			||||||
#include "train.h"
 | 
					#include "train.h"
 | 
				
			||||||
#include "player.h"
 | 
					#include "player.h"
 | 
				
			||||||
 | 
					#include "station.h"
 | 
				
			||||||
 | 
					#include "airport.h"
 | 
				
			||||||
#include "newgrf_callbacks.h"
 | 
					#include "newgrf_callbacks.h"
 | 
				
			||||||
#include "newgrf_engine.h"
 | 
					#include "newgrf_engine.h"
 | 
				
			||||||
#include "newgrf_station.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 */
 | 
					/* Vehicle Resolver Functions */
 | 
				
			||||||
static inline const Vehicle *GRV(const ResolverObject *object)
 | 
					static inline const Vehicle *GRV(const ResolverObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -363,9 +581,9 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		case VEH_Aircraft:
 | 
							case VEH_Aircraft:
 | 
				
			||||||
			switch (variable - 0x80) {
 | 
								switch (variable - 0x80) {
 | 
				
			||||||
				// case 0x62: XXX Need to convert from ottd to ttdp state
 | 
									case 0x62: return MapAircraftMovementState(v);  // Current movement state
 | 
				
			||||||
				case 0x63: return v->u.air.targetairport;
 | 
									case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
 | 
				
			||||||
				// case 0x66: XXX
 | 
									case 0x66: return MapAircraftMovementAction(v); // Current movement action
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user