Add compat for old P_SetScale behavior, fixes Malicious Metropolis

This commit is contained in:
GenericHeroGuy 2025-07-21 18:12:07 +02:00
parent 1d31cefa0e
commit 792bb65e9e
4 changed files with 16 additions and 7 deletions

View file

@ -970,7 +970,7 @@ static int lib_pSetScale(lua_State *L)
return LUA_ErrInvalid(L, "mobj_t");
if (newscale < FRACUNIT/100)
newscale = FRACUNIT/100;
P_SetScale(mobj, newscale);
P_SetScale2(mobj, newscale, lua_compatmode);
return 0;
}

View file

@ -897,7 +897,7 @@ static int mobj_set(lua_State *L)
return luaL_error(L, "mobj.type %d out of range (0 - %d).", newtype, NUMMOBJTYPES-1);
mo->type = newtype;
mo->info = &mobjinfo[newtype];
P_SetScale(mo, mo->scale);
P_SetScale2(mo, mo->scale, lua_compatmode);
break;
}
case mobj_info:
@ -972,7 +972,7 @@ static int mobj_set(lua_State *L)
if (scale < FRACUNIT/100)
scale = FRACUNIT/100;
mo->destscale = scale;
P_SetScale(mo, scale);
P_SetScale2(mo, scale, lua_compatmode);
mo->old_scale = scale;
break;
}

View file

@ -6165,7 +6165,7 @@ void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 numb
//
// Sets the sprite scaling
//
void P_SetScale(mobj_t *mobj, fixed_t newscale)
void P_SetScale2(mobj_t *mobj, fixed_t newscale, boolean compat)
{
player_t *player;
fixed_t oldscale;
@ -6177,8 +6177,16 @@ void P_SetScale(mobj_t *mobj, fixed_t newscale)
mobj->scale = newscale;
mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale);
mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale);
if (compat)
{
mobj->radius = FixedMul(mobj->info->radius, newscale);
mobj->height = FixedMul(mobj->info->height, newscale);
}
else
{
mobj->radius = FixedMul(FixedDiv(mobj->radius, oldscale), newscale);
mobj->height = FixedMul(FixedDiv(mobj->height, oldscale), newscale);
}
player = mobj->player;

View file

@ -566,7 +566,8 @@ boolean P_SupermanLook4Players(mobj_t *actor);
boolean P_PrecipThinker(precipmobj_t *mobj);
void P_NullPrecipThinker(precipmobj_t *mobj);
void P_FreePrecipMobj(precipmobj_t *mobj);
void P_SetScale(mobj_t *mobj, fixed_t newscale);
#define P_SetScale(mobj, newscale) P_SetScale2(mobj, newscale, false)
void P_SetScale2(mobj_t *mobj, fixed_t newscale, boolean compat);
void P_XYMovement(mobj_t *mo);
void P_RingXYMovement(mobj_t *mo);
void P_SceneryXYMovement(mobj_t *mo);