equal
deleted
inserted
replaced
56 }; |
56 }; |
57 |
57 |
58 int _traininfo_vehicle_pitch = 0; |
58 int _traininfo_vehicle_pitch = 0; |
59 int _traininfo_vehicle_width = 29; |
59 int _traininfo_vehicle_width = 29; |
60 |
60 |
61 // TODO: We don't support cargo-specific wagon overrides. Pretty exotic... ;-) --pasky |
|
62 |
|
63 typedef struct WagonOverride { |
61 typedef struct WagonOverride { |
64 byte *train_id; |
62 byte *train_id; |
65 int trains; |
63 int trains; |
|
64 CargoID cargo; |
66 const SpriteGroup *group; |
65 const SpriteGroup *group; |
67 } WagonOverride; |
66 } WagonOverride; |
68 |
67 |
69 typedef struct WagonOverrides { |
68 typedef struct WagonOverrides { |
70 int overrides_count; |
69 int overrides_count; |
71 WagonOverride *overrides; |
70 WagonOverride *overrides; |
72 } WagonOverrides; |
71 } WagonOverrides; |
73 |
72 |
74 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES]; |
73 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES]; |
75 |
74 |
76 void SetWagonOverrideSprites(EngineID engine, const SpriteGroup *group, byte *train_id, int trains) |
75 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains) |
77 { |
76 { |
78 WagonOverrides *wos; |
77 WagonOverrides *wos; |
79 WagonOverride *wo; |
78 WagonOverride *wo; |
80 |
79 |
81 wos = &_engine_wagon_overrides[engine]; |
80 wos = &_engine_wagon_overrides[engine]; |
86 wo = &wos->overrides[wos->overrides_count - 1]; |
85 wo = &wos->overrides[wos->overrides_count - 1]; |
87 /* FIXME: If we are replacing an override, release original SpriteGroup |
86 /* FIXME: If we are replacing an override, release original SpriteGroup |
88 * to prevent leaks. But first we need to refcount the SpriteGroup. |
87 * to prevent leaks. But first we need to refcount the SpriteGroup. |
89 * --pasky */ |
88 * --pasky */ |
90 wo->group = group; |
89 wo->group = group; |
|
90 wo->cargo = cargo; |
91 wo->trains = trains; |
91 wo->trains = trains; |
92 wo->train_id = malloc(trains); |
92 wo->train_id = malloc(trains); |
93 memcpy(wo->train_id, train_id, trains); |
93 memcpy(wo->train_id, train_id, trains); |
94 } |
94 } |
95 |
95 |
96 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, byte overriding_engine) |
96 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine) |
97 { |
97 { |
98 const WagonOverrides *wos = &_engine_wagon_overrides[engine]; |
98 const WagonOverrides *wos = &_engine_wagon_overrides[engine]; |
99 int i; |
99 int i; |
100 |
100 |
101 // XXX: This could turn out to be a timesink on profiles. We could |
101 // XXX: This could turn out to be a timesink on profiles. We could |
106 for (i = 0; i < wos->overrides_count; i++) { |
106 for (i = 0; i < wos->overrides_count; i++) { |
107 const WagonOverride *wo = &wos->overrides[i]; |
107 const WagonOverride *wo = &wos->overrides[i]; |
108 int j; |
108 int j; |
109 |
109 |
110 for (j = 0; j < wo->trains; j++) { |
110 for (j = 0; j < wo->trains; j++) { |
111 if (wo->train_id[j] == overriding_engine) return wo->group; |
111 if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == GC_DEFAULT)) return wo->group; |
112 } |
112 } |
113 } |
113 } |
114 return NULL; |
114 return NULL; |
115 } |
115 } |
116 |
116 |
870 assert(cargo != GC_INVALID); |
870 assert(cargo != GC_INVALID); |
871 |
871 |
872 group = engine_custom_sprites[engine][cargo]; |
872 group = engine_custom_sprites[engine][cargo]; |
873 |
873 |
874 if (v != NULL && v->type == VEH_Train) { |
874 if (v != NULL && v->type == VEH_Train) { |
875 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine); |
875 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
876 |
876 |
877 if (overset != NULL) group = overset; |
877 if (overset != NULL) group = overset; |
878 } |
878 } |
879 |
879 |
880 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
880 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
917 * @return true if it is using an override, false otherwise |
917 * @return true if it is using an override, false otherwise |
918 */ |
918 */ |
919 bool UsesWagonOverride(const Vehicle* v) |
919 bool UsesWagonOverride(const Vehicle* v) |
920 { |
920 { |
921 assert(v->type == VEH_Train); |
921 assert(v->type == VEH_Train); |
922 return GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine) != NULL; |
922 return GetWagonOverrideSpriteSet(v->engine_type, _global_cargo_id[_opt.landscape][v->cargo_type], v->u.rail.first_engine) != NULL; |
923 } |
923 } |
924 |
924 |
925 /** |
925 /** |
926 * Evaluate a newgrf callback for vehicles |
926 * Evaluate a newgrf callback for vehicles |
927 * @param callback The callback to evalute |
927 * @param callback The callback to evalute |
947 assert(cargo != GC_INVALID); |
947 assert(cargo != GC_INVALID); |
948 |
948 |
949 group = engine_custom_sprites[engine][cargo]; |
949 group = engine_custom_sprites[engine][cargo]; |
950 |
950 |
951 if (v != NULL && v->type == VEH_Train) { |
951 if (v != NULL && v->type == VEH_Train) { |
952 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine); |
952 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
953 |
953 |
954 if (overset != NULL) group = overset; |
954 if (overset != NULL) group = overset; |
955 } |
955 } |
956 |
956 |
957 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
957 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
989 assert(cargo != GC_INVALID); |
989 assert(cargo != GC_INVALID); |
990 |
990 |
991 group = engine_custom_sprites[engine][cargo]; |
991 group = engine_custom_sprites[engine][cargo]; |
992 |
992 |
993 if (v != NULL && v->type == VEH_Train) { |
993 if (v != NULL && v->type == VEH_Train) { |
994 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine); |
994 const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine); |
995 |
995 |
996 if (overset != NULL) group = overset; |
996 if (overset != NULL) group = overset; |
997 } |
997 } |
998 |
998 |
999 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
999 if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT]; |
1021 assert(cargo != GC_INVALID); |
1021 assert(cargo != GC_INVALID); |
1022 |
1022 |
1023 group = engine_custom_sprites[v->engine_type][cargo]; |
1023 group = engine_custom_sprites[v->engine_type][cargo]; |
1024 |
1024 |
1025 if (v->type == VEH_Train) { |
1025 if (v->type == VEH_Train) { |
1026 const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine); |
1026 const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, cargo, v->u.rail.first_engine); |
1027 if (overset != NULL) group = overset; |
1027 if (overset != NULL) group = overset; |
1028 } |
1028 } |
1029 |
1029 |
1030 if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT]; |
1030 if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT]; |
1031 group = Resolve(group, &object); |
1031 group = Resolve(group, &object); |