Workaround for wrong animate_rotation usage

Closes #128
This commit is contained in:
Alexander Batalov 2022-08-11 13:25:43 +03:00
parent 87289a34c0
commit 4ece7d1188
1 changed files with 17 additions and 1 deletions

View File

@ -3340,10 +3340,26 @@ static void opMetarule(Program* program)
// 0x4598BC
static void opAnim(Program* program)
{
int frame = programStackPopInteger(program);
ProgramValue frameValue = programStackPopValue(program);
int anim = programStackPopInteger(program);
Object* obj = static_cast<Object*>(programStackPopPointer(program));
// CE: There is a bug in the `animate_rotation` macro in the user-space
// sсripts - instead of passing direction, it passes object. The direction
// argument is thrown away by preprocessor. Original code ignores this bug
// since there is no distiction between integers and pointers. In addition
// there is a guard in the code path below which simply ignores any value
// greater than 6 (so rotation does not change when pointer is passed).
int frame;
if (frameValue.opcode == VALUE_TYPE_INT) {
frame = frameValue.integerValue;
} else if (anim == 1000 && frameValue.opcode == VALUE_TYPE_PTR) {
// Force code path below to skip setting rotation.
frame = ROTATION_COUNT;
} else {
programFatalError("script error: %s: invalid arg 2 to anim", program->name);
}
if (obj == NULL) {
scriptPredefinedError(program, "anim", SCRIPT_ERROR_OBJECT_IS_NULL);
return;