summaryrefslogtreecommitdiff
path: root/src/newgrf_house.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/newgrf_house.cpp')
-rw-r--r--src/newgrf_house.cpp93
1 files changed, 23 insertions, 70 deletions
diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp
index 4509cbeac..da4980b95 100644
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -28,6 +28,7 @@
#include "sprite.h"
#include "genworld.h"
#include "date_func.h"
+#include "newgrf_animation_base.h"
static BuildingCounts<uint32> _building_counts;
static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
@@ -471,82 +472,36 @@ void DrawNewHouseTile(TileInfo *ti, HouseID house_id)
}
}
-void AnimateNewHouseTile(TileIndex tile)
+/* Simple wrapper for GetHouseCallback to keep the animation unified. */
+uint16 GetSimpleHouseCallback(CallbackID callback, uint32 param1, uint32 param2, const HouseSpec *spec, const Town *town, TileIndex tile)
{
- const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
- byte animation_speed = hs->animation.speed;
- bool frame_set_by_callback = false;
-
- if (HasBit(hs->callback_mask, CBM_HOUSE_ANIMATION_SPEED)) {
- uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_SPEED, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
- if (callback_res != CALLBACK_FAILED) animation_speed = Clamp(callback_res & 0xFF, 2, 16);
- }
+ return GetHouseCallback(callback, param1, param2, spec - HouseSpec::Get(0), town, tile);
+}
- /* An animation speed of 2 means the animation frame changes 4 ticks, and
- * increasing this value by one doubles the wait. 2 is the minimum value
- * allowed for animation_speed, which corresponds to 120ms, and 16 is the
- * maximum, corresponding to around 33 minutes. */
- if (_tick_counter % (1 << animation_speed) != 0) return;
-
- byte frame = GetAnimationFrame(tile);
- byte num_frames = hs->animation.frames;
-
- if (HasBit(hs->callback_mask, CBM_HOUSE_ANIMATION_NEXT_FRAME)) {
- uint32 param = (hs->extra_flags & CALLBACK_1A_RANDOM_BITS) ? Random() : 0;
- uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_NEXT_FRAME, param, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
-
- if (callback_res != CALLBACK_FAILED) {
- frame_set_by_callback = true;
-
- switch (callback_res & 0xFF) {
- case 0xFF:
- DeleteAnimatedTile(tile);
- break;
- case 0xFE:
- /* Carry on as normal. */
- frame_set_by_callback = false;
- break;
- default:
- frame = callback_res & 0xFF;
- break;
- }
+/** Helper class for animation control. */
+struct HouseAnimationBase : public AnimationBase<HouseAnimationBase, HouseSpec, Town, GetSimpleHouseCallback> {
+ static const CallbackID cb_animation_speed = CBID_HOUSE_ANIMATION_SPEED;
+ static const CallbackID cb_animation_next_frame = CBID_HOUSE_ANIMATION_NEXT_FRAME;
- /* If the lower 7 bits of the upper byte of the callback
- * result are not empty, it is a sound effect. */
- if (GB(callback_res, 8, 7) != 0) PlayTileSound(hs->grf_prop.grffile, GB(callback_res, 8, 7), tile);
- }
- }
+ static const HouseCallbackMask cbm_animation_speed = CBM_HOUSE_ANIMATION_SPEED;
+ static const HouseCallbackMask cbm_animation_next_frame = CBM_HOUSE_ANIMATION_NEXT_FRAME;
+};
- if (!frame_set_by_callback) {
- if (frame < num_frames) {
- frame++;
- } else if (frame == num_frames && hs->animation.status == ANIM_STATUS_LOOPING) {
- /* This animation loops, so start again from the beginning */
- frame = 0;
- } else {
- /* This animation doesn't loop, so stay here */
- DeleteAnimatedTile(tile);
- }
- }
+void AnimateNewHouseTile(TileIndex tile)
+{
+ const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
+ if (hs == NULL) return;
- SetAnimationFrame(tile, frame);
- MarkTileDirtyByTile(tile);
+ HouseAnimationBase::AnimateTile(hs, Town::GetByTile(tile), tile, HasBit(hs->extra_flags, CALLBACK_1A_RANDOM_BITS));
}
-void ChangeHouseAnimationFrame(const GRFFile *file, TileIndex tile, uint16 callback_result)
+void AnimateNewHouseConstruction(TileIndex tile)
{
- switch (callback_result & 0xFF) {
- case 0xFD: /* Do nothing. */ break;
- case 0xFE: AddAnimatedTile(tile); break;
- case 0xFF: DeleteAnimatedTile(tile); break;
- default:
- SetAnimationFrame(tile, callback_result & 0xFF);
- AddAnimatedTile(tile);
- break;
+ const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
+
+ if (HasBit(hs->callback_mask, CBM_HOUSE_CONSTRUCTION_STATE_CHANGE)) {
+ HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE, hs, Town::GetByTile(tile), tile, 0, 0);
}
- /* If the lower 7 bits of the upper byte of the callback
- * result are not empty, it is a sound effect. */
- if (GB(callback_result, 8, 7) != 0) PlayTileSound(file, GB(callback_result, 8, 7), tile);
}
bool CanDeleteHouse(TileIndex tile)
@@ -573,9 +528,7 @@ static void AnimationControl(TileIndex tile, uint16 random_bits)
if (HasBit(hs->callback_mask, CBM_HOUSE_ANIMATION_START_STOP)) {
uint32 param = (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random();
- uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_START_STOP, param, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
-
- if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(hs->grf_prop.grffile, tile, callback_res);
+ HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_ANIMATION_START_STOP, hs, Town::GetByTile(tile), tile, param, 0);
}
}