20 template <
typename Tobj>
35 template <
typename Tbase,
typename Tspec,
typename Tobj,
typename Textra, u
int16_t (*GetCallback)(CallbackID callback, u
int32_t param1, u
int32_t param2, const Tspec *statspec, Tobj *st, TileIndex tile, Textra extra_data),
typename Tframehelper>
45 static void AnimateTile(
const Tspec *spec, Tobj *obj,
TileIndex tile,
bool random_animation, Textra extra_data = 0)
47 assert(spec !=
nullptr);
50 uint8_t animation_speed = spec->animation.speed;
51 if (
HasBit(spec->callback_mask, Tbase::cbm_animation_speed)) {
52 uint16_t callback = GetCallback(Tbase::cb_animation_speed, 0, 0, spec, obj, tile, extra_data);
54 if (callback >= 0x100 && spec->grf_prop.grffile->grf_version >= 8)
ErrorUnknownCallbackResult(spec->grf_prop.grffile->grfid, Tbase::cb_animation_speed, callback);
55 animation_speed =
Clamp(callback & 0xFF, 0, 16);
65 uint8_t frame = Tframehelper::Get(obj, tile);
66 uint8_t num_frames = spec->animation.frames;
68 bool frame_set_by_callback =
false;
70 if (
HasBit(spec->callback_mask, Tbase::cbm_animation_next_frame)) {
71 uint16_t callback = GetCallback(Tbase::cb_animation_next_frame, random_animation ? Random() : 0, 0, spec, obj, tile, extra_data);
74 frame_set_by_callback =
true;
76 switch (callback & 0xFF) {
82 frame_set_by_callback =
false;
86 frame = callback & 0xFF;
96 if (!frame_set_by_callback) {
97 if (frame < num_frames) {
108 Tframehelper::Set(obj, tile, frame);
126 uint16_t callback = GetCallback(cb, random_bits, trigger, spec, obj, tile, extra_data);
129 switch (callback & 0xFF) {
134 Tframehelper::Set(obj, tile, callback);