equal
deleted
inserted
replaced
22 |
22 |
23 |
23 |
24 int _traininfo_vehicle_pitch = 0; |
24 int _traininfo_vehicle_pitch = 0; |
25 int _traininfo_vehicle_width = 29; |
25 int _traininfo_vehicle_width = 29; |
26 |
26 |
27 typedef struct WagonOverride { |
27 struct WagonOverride { |
28 byte *train_id; |
28 byte *train_id; |
29 int trains; |
29 int trains; |
30 CargoID cargo; |
30 CargoID cargo; |
31 const SpriteGroup *group; |
31 const SpriteGroup *group; |
32 } WagonOverride; |
32 }; |
33 |
33 |
34 typedef struct WagonOverrides { |
34 struct WagonOverrides { |
35 int overrides_count; |
35 int overrides_count; |
36 WagonOverride *overrides; |
36 WagonOverride *overrides; |
37 } WagonOverrides; |
37 }; |
38 |
38 |
39 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES]; |
39 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES]; |
40 |
40 |
41 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains) |
41 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains) |
42 { |
42 { |
83 } |
83 } |
84 |
84 |
85 /** |
85 /** |
86 * Unload all wagon override sprite groups. |
86 * Unload all wagon override sprite groups. |
87 */ |
87 */ |
88 void UnloadWagonOverrides(void) |
88 void UnloadWagonOverrides() |
89 { |
89 { |
90 WagonOverrides *wos; |
90 WagonOverrides *wos; |
91 WagonOverride *wo; |
91 WagonOverride *wo; |
92 EngineID engine; |
92 EngineID engine; |
93 int i; |
93 int i; |
121 } |
121 } |
122 |
122 |
123 /** |
123 /** |
124 * Unload all engine sprite groups. |
124 * Unload all engine sprite groups. |
125 */ |
125 */ |
126 void UnloadCustomEngineSprites(void) |
126 void UnloadCustomEngineSprites() |
127 { |
127 { |
128 memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites)); |
128 memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites)); |
129 memset(_engine_grf, 0, sizeof(_engine_grf)); |
129 memset(_engine_grf, 0, sizeof(_engine_grf)); |
130 } |
130 } |
131 |
131 |
142 } |
142 } |
143 heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group; |
143 heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group; |
144 } |
144 } |
145 |
145 |
146 /** Unload all rotor override sprite groups */ |
146 /** Unload all rotor override sprite groups */ |
147 void UnloadRotorOverrideSprites(void) |
147 void UnloadRotorOverrideSprites() |
148 { |
148 { |
149 EngineID engine; |
149 EngineID engine; |
150 |
150 |
151 /* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means |
151 /* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means |
152 * the context of EngineID is correct */ |
152 * the context of EngineID is correct */ |
193 } |
193 } |
194 |
194 |
195 |
195 |
196 static int MapOldSubType(const Vehicle *v) |
196 static int MapOldSubType(const Vehicle *v) |
197 { |
197 { |
198 if (v->type != VEH_Train) return v->subtype; |
198 if (v->type != VEH_TRAIN) return v->subtype; |
199 if (IsTrainEngine(v)) return 0; |
199 if (IsTrainEngine(v)) return 0; |
200 if (IsFreeWagon(v)) return 4; |
200 if (IsFreeWagon(v)) return 4; |
201 return 2; |
201 return 2; |
202 } |
202 } |
203 |
203 |
487 |
487 |
488 /* Calculated vehicle parameters */ |
488 /* Calculated vehicle parameters */ |
489 switch (variable) { |
489 switch (variable) { |
490 case 0x40: /* Get length of consist */ |
490 case 0x40: /* Get length of consist */ |
491 case 0x41: /* Get length of same consecutive wagons */ |
491 case 0x41: /* Get length of same consecutive wagons */ |
492 if (v->type != VEH_Train) return 1; |
492 if (v->type != VEH_TRAIN) return 1; |
493 |
493 |
494 { |
494 { |
495 const Vehicle* u; |
495 const Vehicle* u; |
496 byte chain_before = 0; |
496 byte chain_before = 0; |
497 byte chain_after = 0; |
497 byte chain_after = 0; |
543 |
543 |
544 case 0x43: /* Player information */ |
544 case 0x43: /* Player information */ |
545 return v->owner; |
545 return v->owner; |
546 |
546 |
547 case 0x44: /* Aircraft information */ |
547 case 0x44: /* Aircraft information */ |
548 if (v->type != VEH_Aircraft) return UINT_MAX; |
548 if (v->type != VEH_AIRCRAFT) return UINT_MAX; |
549 |
549 |
550 { |
550 { |
551 const Vehicle *w = v->next; |
551 const Vehicle *w = v->next; |
552 uint16 altitude = v->z_pos - w->z_pos; /* Aircraft height - shadow height */ |
552 uint16 altitude = v->z_pos - w->z_pos; /* Aircraft height - shadow height */ |
553 byte airporttype; |
553 byte airporttype; |
588 |
588 |
589 case 0x48: return GetEngine(v->engine_type)->flags; /* Vehicle Type Info */ |
589 case 0x48: return GetEngine(v->engine_type)->flags; /* Vehicle Type Info */ |
590 |
590 |
591 /* Variables which use the parameter */ |
591 /* Variables which use the parameter */ |
592 case 0x60: /* Count consist's engine ID occurance */ |
592 case 0x60: /* Count consist's engine ID occurance */ |
593 if (v->type != VEH_Train) return v->engine_type == parameter; |
593 if (v->type != VEH_TRAIN) return v->engine_type == parameter; |
594 |
594 |
595 { |
595 { |
596 uint count = 0; |
596 uint count = 0; |
597 for (; v != NULL; v = v->next) { |
597 for (; v != NULL; v = v->next) { |
598 if (v->engine_type == parameter) count++; |
598 if (v->engine_type == parameter) count++; |
697 case 0x7B: return v->waiting_triggers; |
697 case 0x7B: return v->waiting_triggers; |
698 } |
698 } |
699 |
699 |
700 /* Vehicle specific properties */ |
700 /* Vehicle specific properties */ |
701 switch (v->type) { |
701 switch (v->type) { |
702 case VEH_Train: |
702 case VEH_TRAIN: |
703 switch (variable - 0x80) { |
703 switch (variable - 0x80) { |
704 case 0x62: return v->u.rail.track; |
704 case 0x62: return v->u.rail.track; |
705 case 0x66: return v->u.rail.railtype; |
705 case 0x66: return v->u.rail.railtype; |
706 case 0x73: return v->u.rail.cached_veh_length; |
706 case 0x73: return v->u.rail.cached_veh_length; |
707 case 0x74: return v->u.rail.cached_power; |
707 case 0x74: return v->u.rail.cached_power; |
712 case 0x7D: return GB(v->first->index, 8, 8); |
712 case 0x7D: return GB(v->first->index, 8, 8); |
713 case 0x7F: return 0; // Used for vehicle reversing hack in TTDP |
713 case 0x7F: return 0; // Used for vehicle reversing hack in TTDP |
714 } |
714 } |
715 break; |
715 break; |
716 |
716 |
717 case VEH_Road: |
717 case VEH_ROAD: |
718 switch (variable - 0x80) { |
718 switch (variable - 0x80) { |
719 case 0x62: return v->u.road.state; |
719 case 0x62: return v->u.road.state; |
720 case 0x64: return v->u.road.blocked_ctr; |
720 case 0x64: return v->u.road.blocked_ctr; |
721 case 0x65: return GB(v->u.road.blocked_ctr, 8, 8); |
721 case 0x65: return GB(v->u.road.blocked_ctr, 8, 8); |
722 case 0x66: return v->u.road.overtaking; |
722 case 0x66: return v->u.road.overtaking; |
724 case 0x68: return v->u.road.crashed_ctr; |
724 case 0x68: return v->u.road.crashed_ctr; |
725 case 0x69: return GB(v->u.road.crashed_ctr, 8, 8); |
725 case 0x69: return GB(v->u.road.crashed_ctr, 8, 8); |
726 } |
726 } |
727 break; |
727 break; |
728 |
728 |
729 case VEH_Aircraft: |
729 case VEH_AIRCRAFT: |
730 switch (variable - 0x80) { |
730 switch (variable - 0x80) { |
731 case 0x62: return MapAircraftMovementState(v); // Current movement state |
731 case 0x62: return MapAircraftMovementState(v); // Current movement state |
732 case 0x63: return v->u.air.targetairport; // Airport to which the action refers |
732 case 0x63: return v->u.air.targetairport; // Airport to which the action refers |
733 case 0x66: return MapAircraftMovementAction(v); // Current movement action |
733 case 0x66: return MapAircraftMovementAction(v); // Current movement action |
734 } |
734 } |
749 uint set; |
749 uint set; |
750 bool in_motion; |
750 bool in_motion; |
751 |
751 |
752 if (v == NULL) return group->g.real.loading[0]; |
752 if (v == NULL) return group->g.real.loading[0]; |
753 |
753 |
754 if (v->type == VEH_Train) { |
754 if (v->type == VEH_TRAIN) { |
755 in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING; |
755 in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING; |
756 } else { |
756 } else { |
757 in_motion = v->current_order.type != OT_LOADING; |
757 in_motion = v->current_order.type != OT_LOADING; |
758 } |
758 } |
759 |
759 |
778 res->SetTriggers = &VehicleSetTriggers; |
778 res->SetTriggers = &VehicleSetTriggers; |
779 res->GetVariable = &VehicleGetVariable; |
779 res->GetVariable = &VehicleGetVariable; |
780 res->ResolveReal = &VehicleResolveReal; |
780 res->ResolveReal = &VehicleResolveReal; |
781 |
781 |
782 res->u.vehicle.self = v; |
782 res->u.vehicle.self = v; |
783 res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v; |
783 res->u.vehicle.parent = (v != NULL && v->type == VEH_TRAIN) ? GetFirstVehicleInChain(v) : v; |
784 |
784 |
785 res->u.vehicle.self_type = engine_type; |
785 res->u.vehicle.self_type = engine_type; |
786 |
786 |
787 res->info_view = false; |
787 res->info_view = false; |
788 |
788 |
810 if (v == NULL) { |
810 if (v == NULL) { |
811 cargo = CT_PURCHASE; |
811 cargo = CT_PURCHASE; |
812 } else { |
812 } else { |
813 cargo = v->cargo_type; |
813 cargo = v->cargo_type; |
814 |
814 |
815 if (v->type == VEH_Train) { |
815 if (v->type == VEH_TRAIN) { |
816 group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
816 group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
817 |
817 |
818 if (group != NULL) return group; |
818 if (group != NULL) return group; |
819 } |
819 } |
820 } |
820 } |
872 * @param v The wagon to check |
872 * @param v The wagon to check |
873 * @return true if it is using an override, false otherwise |
873 * @return true if it is using an override, false otherwise |
874 */ |
874 */ |
875 bool UsesWagonOverride(const Vehicle* v) |
875 bool UsesWagonOverride(const Vehicle* v) |
876 { |
876 { |
877 assert(v->type == VEH_Train); |
877 assert(v->type == VEH_TRAIN); |
878 return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL; |
878 return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL; |
879 } |
879 } |
880 |
880 |
881 /** |
881 /** |
882 * Evaluate a newgrf callback for vehicles |
882 * Evaluate a newgrf callback for vehicles |
960 * same for all triggered vehicles in the chain (to get |
960 * same for all triggered vehicles in the chain (to get |
961 * all the random-cargo wagons carry the same cargo, |
961 * all the random-cargo wagons carry the same cargo, |
962 * i.e.), so we give them all the NEW_CARGO triggered |
962 * i.e.), so we give them all the NEW_CARGO triggered |
963 * vehicle's portion of random bits. */ |
963 * vehicle's portion of random bits. */ |
964 assert(first); |
964 assert(first); |
965 DoTriggerVehicle((v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false); |
965 DoTriggerVehicle((v->type == VEH_TRAIN) ? GetFirstVehicleInChain(v) : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false); |
966 break; |
966 break; |
967 |
967 |
968 case VEHICLE_TRIGGER_DEPOT: |
968 case VEHICLE_TRIGGER_DEPOT: |
969 /* We now trigger the next vehicle in chain recursively. |
969 /* We now trigger the next vehicle in chain recursively. |
970 * The random bits portions may be different for each |
970 * The random bits portions may be different for each |
1005 { |
1005 { |
1006 assert(engine < lengthof(_engine_custom_names)); |
1006 assert(engine < lengthof(_engine_custom_names)); |
1007 _engine_custom_names[engine] = name; |
1007 _engine_custom_names[engine] = name; |
1008 } |
1008 } |
1009 |
1009 |
1010 void UnloadCustomEngineNames(void) |
1010 void UnloadCustomEngineNames() |
1011 { |
1011 { |
1012 EngineID i; |
1012 EngineID i; |
1013 for (i = 0; i < TOTAL_NUM_ENGINES; i++) { |
1013 for (i = 0; i < TOTAL_NUM_ENGINES; i++) { |
1014 _engine_custom_names[i] = 0; |
1014 _engine_custom_names[i] = 0; |
1015 } |
1015 } |
1023 // Functions for changing the order of vehicle purchase lists |
1023 // Functions for changing the order of vehicle purchase lists |
1024 // This is currently only implemented for rail vehicles. |
1024 // This is currently only implemented for rail vehicles. |
1025 static EngineID _engine_list_order[NUM_TRAIN_ENGINES]; |
1025 static EngineID _engine_list_order[NUM_TRAIN_ENGINES]; |
1026 static byte _engine_list_position[NUM_TRAIN_ENGINES]; |
1026 static byte _engine_list_position[NUM_TRAIN_ENGINES]; |
1027 |
1027 |
1028 void ResetEngineListOrder(void) |
1028 void ResetEngineListOrder() |
1029 { |
1029 { |
1030 EngineID i; |
1030 EngineID i; |
1031 |
1031 |
1032 for (i = 0; i < NUM_TRAIN_ENGINES; i++) { |
1032 for (i = 0; i < NUM_TRAIN_ENGINES; i++) { |
1033 _engine_list_order[i] = i; |
1033 _engine_list_order[i] = i; |