61 wo->trains = trains; |
61 wo->trains = trains; |
62 wo->train_id = MallocT<byte>(trains); |
62 wo->train_id = MallocT<byte>(trains); |
63 memcpy(wo->train_id, train_id, trains); |
63 memcpy(wo->train_id, train_id, trains); |
64 } |
64 } |
65 |
65 |
66 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine) |
66 const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine) |
67 { |
67 { |
68 const WagonOverrides *wos = &_engine_wagon_overrides[engine]; |
68 const WagonOverrides *wos = &_engine_wagon_overrides[engine]; |
69 int i; |
|
70 |
69 |
71 /* XXX: This could turn out to be a timesink on profiles. We could |
70 /* XXX: This could turn out to be a timesink on profiles. We could |
72 * always just dedicate 65535 bytes for an [engine][train] trampoline |
71 * always just dedicate 65535 bytes for an [engine][train] trampoline |
73 * for O(1). Or O(logMlogN) and searching binary tree or smt. like |
72 * for O(1). Or O(logMlogN) and searching binary tree or smt. like |
74 * that. --pasky */ |
73 * that. --pasky */ |
75 |
74 |
76 for (i = 0; i < wos->overrides_count; i++) { |
75 for (int i = 0; i < wos->overrides_count; i++) { |
77 const WagonOverride *wo = &wos->overrides[i]; |
76 const WagonOverride *wo = &wos->overrides[i]; |
78 int j; |
77 |
79 |
78 if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue; |
80 for (j = 0; j < wo->trains; j++) { |
79 |
81 if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == CT_DEFAULT)) return wo->group; |
80 for (int j = 0; j < wo->trains; j++) { |
|
81 if (wo->train_id[j] == overriding_engine) return wo->group; |
82 } |
82 } |
83 } |
83 } |
84 return NULL; |
84 return NULL; |
85 } |
85 } |
86 |
86 |
244 */ |
244 */ |
245 static byte MapAircraftMovementState(const Vehicle *v) |
245 static byte MapAircraftMovementState(const Vehicle *v) |
246 { |
246 { |
247 const Station *st = GetStation(v->u.air.targetairport); |
247 const Station *st = GetStation(v->u.air.targetairport); |
248 const AirportFTAClass *afc = st->Airport(); |
248 const AirportFTAClass *afc = st->Airport(); |
249 byte amdflag = afc->MovingData(v->u.air.pos)->flag; |
249 uint16 amdflag = afc->MovingData(v->u.air.pos)->flag; |
250 |
250 |
251 switch (v->u.air.state) { |
251 switch (v->u.air.state) { |
252 case HANGAR: |
252 case HANGAR: |
253 /* The international airport is a special case as helicopters can land in |
253 /* The international airport is a special case as helicopters can land in |
254 * front of the hanger. Helicopters also change their air.state to |
254 * front of the hanger. Helicopters also change their air.state to |
311 } else { |
311 } else { |
312 return AMS_TTDP_HELI_TAKEOFF_HELIPORT; |
312 return AMS_TTDP_HELI_TAKEOFF_HELIPORT; |
313 } |
313 } |
314 |
314 |
315 case FLYING: |
315 case FLYING: |
316 return AMS_TTDP_FLIGHT_TO_TOWER; |
316 return amdflag & AMED_HOLD ? AMS_TTDP_FLIGHT_APPROACH : AMS_TTDP_FLIGHT_TO_TOWER; |
317 |
317 |
318 case LANDING: // Descent |
318 case LANDING: // Descent |
319 return AMS_TTDP_FLIGHT_DESCENT; |
319 return AMS_TTDP_FLIGHT_DESCENT; |
320 |
320 |
321 case ENDLANDING: // On the runway braking |
321 case ENDLANDING: // On the runway braking |
768 case 0x62: return MapAircraftMovementState(v); // Current movement state |
768 case 0x62: return MapAircraftMovementState(v); // Current movement state |
769 case 0x63: return v->u.air.targetairport; // Airport to which the action refers |
769 case 0x63: return v->u.air.targetairport; // Airport to which the action refers |
770 case 0x66: return MapAircraftMovementAction(v); // Current movement action |
770 case 0x66: return MapAircraftMovementAction(v); // Current movement action |
771 } |
771 } |
772 break; |
772 break; |
|
773 |
|
774 default: break; |
773 } |
775 } |
774 |
776 |
775 DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type); |
777 DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type); |
776 |
778 |
777 *available = false; |
779 *available = false; |
848 cargo = CT_PURCHASE; |
850 cargo = CT_PURCHASE; |
849 } else { |
851 } else { |
850 cargo = v->cargo_type; |
852 cargo = v->cargo_type; |
851 |
853 |
852 if (v->type == VEH_TRAIN) { |
854 if (v->type == VEH_TRAIN) { |
853 group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
855 group = v->u.rail.cached_override; |
854 |
|
855 if (group != NULL) return group; |
856 if (group != NULL) return group; |
856 } |
857 } |
857 } |
858 } |
858 |
859 |
859 group = _engine_custom_sprites[engine][cargo]; |
860 group = _engine_custom_sprites[engine][cargo]; |
910 * @return true if it is using an override, false otherwise |
911 * @return true if it is using an override, false otherwise |
911 */ |
912 */ |
912 bool UsesWagonOverride(const Vehicle* v) |
913 bool UsesWagonOverride(const Vehicle* v) |
913 { |
914 { |
914 assert(v->type == VEH_TRAIN); |
915 assert(v->type == VEH_TRAIN); |
915 return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL; |
916 return v->u.rail.cached_override != NULL; |
916 } |
917 } |
917 |
918 |
918 /** |
919 /** |
919 * Evaluate a newgrf callback for vehicles |
920 * Evaluate a newgrf callback for vehicles |
920 * @param callback The callback to evalute |
921 * @param callback The callback to evalute |