45 e->overrides =
ReallocT(e->overrides, e->overrides_count);
47 wo = &e->overrides[e->overrides_count - 1];
51 wo->train_id = MallocT<EngineID>(trains);
52 memcpy(wo->train_id, train_id, trains *
sizeof *train_id);
59 for (uint i = 0; i < e->overrides_count; i++) {
62 if (wo->cargo != cargo && wo->cargo != CT_DEFAULT)
continue;
64 for (uint j = 0; j < wo->trains; j++) {
65 if (wo->train_id[j] == overriding_engine)
return wo->group;
76 for (uint i = 0; i < e->overrides_count; i++) {
81 e->overrides_count = 0;
92 grfmsg(6,
"SetCustomEngineSprites: engine %d cargo %d already has group -- replacing", engine, cargo);
111 static int MapOldSubType(
const Vehicle *v)
123 default: NOT_REACHED();
129 enum TTDPAircraftMovementStates {
135 AMS_TTDP_TO_ENTRY_2_AND_3,
136 AMS_TTDP_TO_ENTRY_2_AND_3_AND_H,
137 AMS_TTDP_TO_JUNCTION,
138 AMS_TTDP_LEAVE_RUNWAY,
146 AMS_TTDP_FLIGHT_APPROACH,
147 AMS_TTDP_UNUSED_0x11,
148 AMS_TTDP_FLIGHT_TO_TOWER,
149 AMS_TTDP_UNUSED_0x13,
150 AMS_TTDP_FLIGHT_FINAL,
151 AMS_TTDP_FLIGHT_DESCENT,
153 AMS_TTDP_HELI_TAKEOFF_AIRPORT,
154 AMS_TTDP_HELI_TO_TAKEOFF_AIRPORT,
155 AMS_TTDP_HELI_LAND_AIRPORT,
156 AMS_TTDP_HELI_TAKEOFF_HELIPORT,
157 AMS_TTDP_HELI_TO_TAKEOFF_HELIPORT,
158 AMS_TTDP_HELI_LAND_HELIPORT,
169 if (st == NULL)
return AMS_TTDP_FLIGHT_TO_TOWER;
186 if (amdflag &
AMED_SLOWTURN)
return AMS_TTDP_FLIGHT_TO_TOWER;
193 return AMS_TTDP_TO_HANGAR;
196 if (amdflag & AMED_EXACTPOS)
return AMS_TTDP_TO_PAD1;
197 return AMS_TTDP_TO_JUNCTION;
200 if (amdflag & AMED_EXACTPOS)
return AMS_TTDP_TO_PAD2;
201 return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
210 if (amdflag & AMED_EXACTPOS)
return AMS_TTDP_TO_PAD3;
211 return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
217 if (amdflag & AMED_HELI_LOWER)
return AMS_TTDP_HELI_LAND_AIRPORT;
218 if (amdflag & AMED_SLOWTURN)
return AMS_TTDP_FLIGHT_TO_TOWER;
219 return AMS_TTDP_TO_JUNCTION;
222 return AMS_TTDP_TO_OUTWAY;
225 return AMS_TTDP_TAKEOFF;
228 return AMS_TTDP_CLIMBING;
233 AMS_TTDP_HELI_TAKEOFF_AIRPORT : AMS_TTDP_TO_JUNCTION;
235 return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
239 return amdflag &
AMED_HOLD ? AMS_TTDP_FLIGHT_APPROACH : AMS_TTDP_FLIGHT_TO_TOWER;
242 return AMS_TTDP_FLIGHT_DESCENT;
245 if (amdflag &
AMED_BRAKE)
return AMS_TTDP_BRAKING;
247 return AMS_TTDP_TO_INWAY;
251 if (amdflag & AMED_HELI_LOWER) {
253 AMS_TTDP_HELI_LAND_AIRPORT : AMS_TTDP_HELI_LAND_HELIPORT;
255 return AMS_TTDP_FLIGHT_TO_TOWER;
259 return AMS_TTDP_HANGAR;
265 enum TTDPAircraftMovementActions {
270 AMA_TTDP_HANGAR_TO_PAD1,
271 AMA_TTDP_HANGAR_TO_PAD2,
272 AMA_TTDP_HANGAR_TO_PAD3,
273 AMA_TTDP_LANDING_TO_PAD1,
274 AMA_TTDP_LANDING_TO_PAD2,
275 AMA_TTDP_LANDING_TO_PAD3,
276 AMA_TTDP_PAD1_TO_HANGAR,
277 AMA_TTDP_PAD2_TO_HANGAR,
278 AMA_TTDP_PAD3_TO_HANGAR,
279 AMA_TTDP_PAD1_TO_TAKEOFF,
280 AMA_TTDP_PAD2_TO_TAKEOFF,
281 AMA_TTDP_PAD3_TO_TAKEOFF,
282 AMA_TTDP_HANGAR_TO_TAKOFF,
283 AMA_TTDP_LANDING_TO_HANGAR,
297 return (v->
cur_speed > 0) ? AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_IN_HANGAR;
301 return (v->
current_order.
IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
305 return (v->
current_order.
IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
314 return (v->
current_order.
IsType(OT_LOADING)) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
321 return AMA_TTDP_PAD1_TO_TAKEOFF;
324 return AMA_TTDP_IN_FLIGHT;
332 AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_LANDING_TO_PAD1;
335 return AMA_TTDP_IN_HANGAR;
357 int32 count =
GB(relative, 0, 4);
358 if (this->
self_scope.
v != NULL && (relative != this->cached_relative_count || count == 0)) {
364 switch (
GB(relative, 6, 2)) {
365 default: NOT_REACHED();
379 if (u->engine_type != self->engine_type) {
382 if (v == NULL) v = u;
385 if (v == NULL) v =
self;
432 byte chain_before = 0;
433 byte chain_after = 0;
435 for (u = v->
First(); u != v; u = u->
Next()) {
445 return chain_before | chain_after << 8 | (chain_before + chain_after + consecutive) << 16;
472 byte cargo_classes = 0;
474 uint8 common_subtypes[256];
475 byte user_def_data = 0;
477 uint8 common_subtype = 0xFF;
480 memset(common_cargoes, 0,
sizeof(common_cargoes));
481 memset(common_subtypes, 0,
sizeof(common_subtypes));
483 for (u = v; u != NULL; u = u->
Next()) {
494 uint common_cargo_best_amount = 0;
496 if (common_cargoes[cargo] > common_cargo_best_amount) {
497 common_cargo_best_amount = common_cargoes[cargo];
498 common_cargo_type = cargo;
503 for (u = v; u != NULL; u = u->
Next()) {
511 uint common_subtype_best_amount = 0;
512 for (uint i = 0; i <
lengthof(common_subtypes); i++) {
513 if (common_subtypes[i] > common_subtype_best_amount) {
514 common_subtype_best_amount = common_subtypes[i];
536 const GRFFile *grffile =
object->ro.grffile;
537 uint8 common_bitnum = (common_cargo_type ==
CT_INVALID) ? 0xFF :
564 return (
Clamp(altitude, 0, 0xFF) << 8) | airporttype;
624 byte artic_before = 0;
626 byte artic_after = 0;
639 for (; v != NULL; v = v->
Next()) {
656 if (u == NULL)
return 0;
658 if (parameter == 0x5F) {
662 return VehicleGetVariable(u,
object, parameter,
GetRegister(0x10E), available);
679 if (u == NULL)
return 0;
682 bool prev = (int8)parameter < 0;
703 const Train *u = is_powered_wagon ? t->
First() : t;
705 bool powered = t->
IsEngine() || is_powered_wagon;
708 if (powered && has_power)
SetBit(modflags, 5);
709 if (powered && !has_power)
SetBit(modflags, 6);
715 return variable == 0xFE ? modflags :
GB(modflags, 8, 8);
720 switch (variable - 0x80) {
721 case 0x00:
return v->
type + 0x10;
722 case 0x01:
return MapOldSubType(v);
723 case 0x04:
return v->
index;
724 case 0x05:
return GB(v->
index, 8, 8);
738 default: ticks = 0;
break;
741 return (variable - 0x80) == 0x10 ? ticks :
GB(ticks, 8, 8);
745 case 0x14:
return v->GetServiceInterval();
746 case 0x15:
return GB(v->GetServiceInterval(), 8, 8);
761 return (variable - 0x80) == 0x18 ? max_speed :
GB(max_speed, 8, 8);
763 case 0x1A:
return v->
x_pos;
764 case 0x1B:
return GB(v->
x_pos, 8, 8);
765 case 0x1C:
return v->
y_pos;
766 case 0x1D:
return GB(v->
y_pos, 8, 8);
767 case 0x1E:
return v->
z_pos;
827 switch (variable - 0x80) {
828 case 0x62:
return t->track;
829 case 0x66:
return t->railtype;
844 switch (variable - 0x80) {
845 case 0x62:
return rv->
state;
846 case 0x64:
return rv->blocked_ctr;
847 case 0x65:
return GB(rv->blocked_ctr, 8, 8);
858 switch (variable - 0x80) {
859 case 0x62:
return s->
state;
866 switch (variable - 0x80) {
877 DEBUG(grf, 1,
"Unhandled vehicle variable 0x%X, type 0x%X", variable, (uint)v->
type);
885 if (this->v == NULL) {
902 case 0x4B:
return _date;
914 return VehicleGetVariable(const_cast<Vehicle*>(this->v),
this, variable, parameter, available);
932 if (totalsets == 0)
return NULL;
935 set =
min(
set, totalsets - 1);
948 return (e != NULL) ? e->
GetGRF() : NULL;
962 CallbackID callback, uint32 callback_param1, uint32 callback_param2)
964 self_scope(*this, engine_type, v, info_view),
965 parent_scope(*this, engine_type, ((v != NULL) ? v->First() : v), info_view),
966 relative_scope(*this, engine_type, v, info_view),
967 cached_relative_count(0)
969 if (wagon_override ==
WO_SELF) {
970 this->
root_spritegroup = GetWagonOverrideSpriteSet(engine_type, CT_DEFAULT, engine_type);
1002 uint max_stack = sprite_stack ?
lengthof(result->seq) : 1;
1003 for (uint stack = 0; stack < max_stack; ++stack) {
1004 object.ResetState();
1005 object.callback_param1 = image_type | (stack << 8);
1007 uint32 reg100 = sprite_stack ?
GetRegister(0x100) : 0;
1008 if (group != NULL && group->GetNumResults() != 0) {
1009 result->seq[result->count].
sprite = group->GetResult() + (direction % group->GetNumResults());
1010 result->seq[result->count].
pal =
GB(reg100, 0, 16);
1013 if (!
HasBit(reg100, 31))
break;
1028 uint rotor_pos = v == NULL || info_view ? 0 : v->
Next()->
Next()->
state;
1031 uint max_stack = sprite_stack ?
lengthof(result->seq) : 1;
1032 for (uint stack = 0; stack < max_stack; ++stack) {
1033 object.ResetState();
1034 object.callback_param1 = image_type | (stack << 8);
1036 uint32 reg100 = sprite_stack ?
GetRegister(0x100) : 0;
1037 if (group != NULL && group->GetNumResults() != 0) {
1038 result->seq[result->count].
sprite = group->GetResult() + (rotor_pos % group->GetNumResults());
1039 result->seq[result->count].
pal =
GB(reg100, 0, 16);
1042 if (!
HasBit(reg100, 31))
break;
1055 return Train::From(v)->tcache.cached_override != NULL;
1070 return object.ResolveCallback();
1086 object.parent_scope.SetVehicle(parent);
1087 return object.ResolveCallback();
1094 return GetEngineProperty(v->
engine_type, property, orig_value, v);
1107 static void DoTriggerVehicle(
Vehicle *v, VehicleTrigger trigger, byte base_random_bits,
bool first)
1117 if (group == NULL)
return;
1123 byte new_random_bits = Random();
1124 uint32 reseed =
object.GetReseedSum();
1126 v->
random_bits |= (first ? new_random_bits : base_random_bits) & reseed;
1129 case VEHICLE_TRIGGER_NEW_CARGO:
1138 DoTriggerVehicle(v->
First(), VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits,
false);
1141 case VEHICLE_TRIGGER_DEPOT:
1145 if (v->
Next() != NULL) DoTriggerVehicle(v->
Next(), trigger, 0,
true);
1148 case VEHICLE_TRIGGER_EMPTY:
1153 if (v->
Next() != NULL) DoTriggerVehicle(v->
Next(), trigger, first ? new_random_bits : base_random_bits,
false);
1156 case VEHICLE_TRIGGER_ANY_NEW_CARGO:
1160 if (v->
Next() != NULL) DoTriggerVehicle(v->
Next(), VEHICLE_TRIGGER_ANY_NEW_CARGO, base_random_bits,
false);
1163 case VEHICLE_TRIGGER_CALLBACK_32:
1169 void TriggerVehicle(
Vehicle *v, VehicleTrigger trigger)
1171 if (trigger == VEHICLE_TRIGGER_DEPOT) {
1177 DoTriggerVehicle(v, trigger, 0,
true);
1200 loc->engine = engine;
1233 FOR_ALL_ENGINES(e) {
1242 uint local_target = it->target;
1245 if (id_source->
internal_id == local_target)
continue;
1250 int source_index = ordering.
FindIndex(source);
1251 int target_index = ordering.
FindIndex(target);
1253 assert(source_index >= 0 && target_index >= 0);
1254 assert(source_index != target_index);
1257 if (source_index < target_index) {
1259 for (
int i = source_index; i < target_index; ++i) list[i] = list[i + 1];
1260 list[target_index] = source;
1262 for (
int i = source_index; i > target_index; --i) list[i] = list[i - 1];
1263 list[target_index] = source;
1270 for (
const EngineID *it = ordering.
Begin(); it != idend; ++it, ++index) {
1275 _list_order_changes.
Reset();
1287 static const int cache_entries[][2] = {
1297 for (
size_t i = 0; i <
lengthof(cache_entries); i++) {