summaryrefslogtreecommitdiff
path: root/src/newgrf_commons.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/newgrf_commons.cpp')
-rw-r--r--src/newgrf_commons.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp
index 0867b2675..add37d43c 100644
--- a/src/newgrf_commons.cpp
+++ b/src/newgrf_commons.cpp
@@ -571,10 +571,11 @@ void NewGRFSpriteLayout::AllocateRegisters()
* @param orig_offset Offset to apply to non-action-1 sprites.
* @param newgrf_ground_offset Offset to apply to action-1 ground sprites.
* @param newgrf_offset Offset to apply to action-1 non-ground sprites.
+ * @param constr_stage Construction stage (0-3) to apply to all action-1 sprites.
* @param separate_ground Whether the ground sprite shall be resolved by a separate action-1-2-3 chain by default.
* @return Bitmask of values for variable 10 to resolve action-1-2-3 chains for.
*/
-uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_ground_offset, uint32 newgrf_offset, bool separate_ground) const
+uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_ground_offset, uint32 newgrf_offset, uint constr_stage, bool separate_ground) const
{
result_seq.Clear();
uint32 var10_values = 0;
@@ -611,6 +612,7 @@ uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_groun
if (!(flags & TLF_SPRITE)) {
if (HasBit(result->image.sprite, SPRITE_MODIFIER_CUSTOM_SPRITE)) {
result->image.sprite += ground ? newgrf_ground_offset : newgrf_offset;
+ if (constr_stage > 0 && regs != NULL) result->image.sprite += GetConstructionStageOffset(constr_stage, regs->max_sprite_offset);
} else {
result->image.sprite += orig_offset;
}
@@ -626,6 +628,7 @@ uint32 NewGRFSpriteLayout::PrepareLayout(uint32 orig_offset, uint32 newgrf_groun
if (!(flags & TLF_PALETTE)) {
if (HasBit(result->image.pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) {
result->image.sprite += ground ? newgrf_ground_offset : newgrf_offset;
+ if (constr_stage > 0 && regs != NULL) result->image.sprite += GetConstructionStageOffset(constr_stage, regs->max_palette_offset);
}
}
@@ -663,7 +666,14 @@ void NewGRFSpriteLayout::ProcessRegisters(uint8 resolved_var10, uint32 resolved_
result->image.sprite = 0;
} else {
if (HasBit(result->image.sprite, SPRITE_MODIFIER_CUSTOM_SPRITE)) result->image.sprite += resolved_sprite;
- if (flags & TLF_SPRITE) result->image.sprite += (int16)GetRegister(regs->sprite); // mask to 16 bits to avoid trouble
+ if (flags & TLF_SPRITE) {
+ int16 offset = (int16)GetRegister(regs->sprite); // mask to 16 bits to avoid trouble
+ if (!HasBit(result->image.sprite, SPRITE_MODIFIER_CUSTOM_SPRITE) || (offset >= 0 && offset < regs->max_sprite_offset)) {
+ result->image.sprite += offset;
+ } else {
+ result->image.sprite = SPR_IMG_QUERY;
+ }
+ }
if (result->IsParentSprite()) {
if (flags & TLF_BB_XY_OFFSET) {
@@ -686,7 +696,15 @@ void NewGRFSpriteLayout::ProcessRegisters(uint8 resolved_var10, uint32 resolved_
if (var10 == resolved_var10) {
/* Apply registers */
if (HasBit(result->image.pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) result->image.pal += resolved_sprite;
- if (flags & TLF_PALETTE) result->image.pal += (int16)GetRegister(regs->palette); // mask to 16 bits to avoid trouble
+ if (flags & TLF_PALETTE) {
+ int16 offset = (int16)GetRegister(regs->palette); // mask to 16 bits to avoid trouble
+ if (!HasBit(result->image.pal, SPRITE_MODIFIER_CUSTOM_SPRITE) || (offset >= 0 && offset < regs->max_palette_offset)) {
+ result->image.pal += offset;
+ } else {
+ result->image.sprite = SPR_IMG_QUERY;
+ result->image.pal = PAL_NONE;
+ }
+ }
}
}