Merge branch 'spritestuff2-archiving-fix' into 'next'
Fix archived mobjs having no default blend mode and sprite scales See merge request STJr/SRB2!1300
This commit is contained in:
commit
c97056f9ce
|
@ -279,6 +279,7 @@ mobjtype_t P_GetMobjtype(UINT16 mthingtype);
|
||||||
void P_RespawnSpecials(void);
|
void P_RespawnSpecials(void);
|
||||||
|
|
||||||
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
|
||||||
|
void P_SetMobjSpawnDefaults(mobj_t *mobj);
|
||||||
|
|
||||||
void P_RecalcPrecipInSector(sector_t *sector);
|
void P_RecalcPrecipInSector(sector_t *sector);
|
||||||
void P_PrecipitationEffects(void);
|
void P_PrecipitationEffects(void);
|
||||||
|
|
90
src/p_mobj.c
90
src/p_mobj.c
|
@ -10440,52 +10440,12 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
mobj->x = x;
|
mobj->x = x;
|
||||||
mobj->y = y;
|
mobj->y = y;
|
||||||
|
|
||||||
mobj->radius = info->radius;
|
P_SetMobjSpawnDefaults(mobj);
|
||||||
mobj->height = info->height;
|
|
||||||
mobj->flags = info->flags;
|
|
||||||
|
|
||||||
mobj->health = (info->spawnhealth ? info->spawnhealth : 1);
|
|
||||||
|
|
||||||
mobj->reactiontime = info->reactiontime;
|
|
||||||
|
|
||||||
mobj->lastlook = -1; // stuff moved in P_enemy.P_LookForPlayer
|
|
||||||
|
|
||||||
// do not set the state with P_SetMobjState,
|
|
||||||
// because action routines can not be called yet
|
|
||||||
st = &states[info->spawnstate];
|
|
||||||
|
|
||||||
mobj->state = st;
|
|
||||||
mobj->tics = st->tics;
|
|
||||||
mobj->sprite = st->sprite;
|
|
||||||
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
|
||||||
P_SetupStateAnimation(mobj, st);
|
|
||||||
|
|
||||||
mobj->friction = ORIG_FRICTION;
|
|
||||||
|
|
||||||
mobj->movefactor = FRACUNIT;
|
|
||||||
|
|
||||||
// All mobjs are created at 100% scale.
|
|
||||||
mobj->scale = FRACUNIT;
|
|
||||||
mobj->destscale = mobj->scale;
|
|
||||||
mobj->scalespeed = FRACUNIT/12;
|
|
||||||
|
|
||||||
// TODO: Make this a special map header
|
|
||||||
if ((maptol & TOL_ERZ3) && !(mobj->type == MT_BLACKEGGMAN))
|
|
||||||
mobj->destscale = FRACUNIT/2;
|
|
||||||
|
|
||||||
// Sprite rendering
|
|
||||||
mobj->blendmode = AST_TRANSLUCENT;
|
|
||||||
mobj->spritexscale = mobj->spriteyscale = mobj->scale;
|
|
||||||
mobj->spritexoffset = mobj->spriteyoffset = 0;
|
|
||||||
mobj->floorspriteslope = NULL;
|
|
||||||
|
|
||||||
// set subsector and/or block links
|
// set subsector and/or block links
|
||||||
P_SetThingPosition(mobj);
|
P_SetThingPosition(mobj);
|
||||||
I_Assert(mobj->subsector != NULL);
|
I_Assert(mobj->subsector != NULL);
|
||||||
|
|
||||||
// Make sure scale matches destscale immediately when spawned
|
|
||||||
P_SetScale(mobj, mobj->destscale);
|
|
||||||
|
|
||||||
mobj->floorz = P_GetSectorFloorZAt (mobj->subsector->sector, x, y);
|
mobj->floorz = P_GetSectorFloorZAt (mobj->subsector->sector, x, y);
|
||||||
mobj->ceilingz = P_GetSectorCeilingZAt(mobj->subsector->sector, x, y);
|
mobj->ceilingz = P_GetSectorCeilingZAt(mobj->subsector->sector, x, y);
|
||||||
|
|
||||||
|
@ -10787,6 +10747,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
mobj->frame &= ~FF_FRAMEMASK;
|
mobj->frame &= ~FF_FRAMEMASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
st = &states[info->spawnstate];
|
||||||
|
|
||||||
// Call action functions when the state is set
|
// Call action functions when the state is set
|
||||||
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
|
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
|
||||||
{
|
{
|
||||||
|
@ -10817,6 +10779,52 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
return mobj;
|
return mobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void P_SetMobjSpawnDefaults(mobj_t *mobj)
|
||||||
|
{
|
||||||
|
const mobjinfo_t *info = mobj->info;
|
||||||
|
state_t *st = &states[info->spawnstate];
|
||||||
|
|
||||||
|
mobj->radius = info->radius;
|
||||||
|
mobj->height = info->height;
|
||||||
|
mobj->flags = info->flags;
|
||||||
|
|
||||||
|
mobj->health = (info->spawnhealth ? info->spawnhealth : 1);
|
||||||
|
|
||||||
|
mobj->reactiontime = info->reactiontime;
|
||||||
|
|
||||||
|
mobj->lastlook = -1; // stuff moved in P_enemy.P_LookForPlayer
|
||||||
|
|
||||||
|
// do not set the state with P_SetMobjState,
|
||||||
|
// because action routines can not be called yet
|
||||||
|
mobj->state = st;
|
||||||
|
mobj->tics = st->tics;
|
||||||
|
mobj->sprite = st->sprite;
|
||||||
|
mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits..
|
||||||
|
P_SetupStateAnimation(mobj, st);
|
||||||
|
|
||||||
|
mobj->friction = ORIG_FRICTION;
|
||||||
|
|
||||||
|
mobj->movefactor = FRACUNIT;
|
||||||
|
|
||||||
|
// All mobjs are created at 100% scale.
|
||||||
|
mobj->scale = FRACUNIT;
|
||||||
|
mobj->destscale = mobj->scale;
|
||||||
|
mobj->scalespeed = FRACUNIT/12;
|
||||||
|
|
||||||
|
// TODO: Make this a special map header
|
||||||
|
if ((maptol & TOL_ERZ3) && !(mobj->type == MT_BLACKEGGMAN))
|
||||||
|
mobj->destscale = FRACUNIT/2;
|
||||||
|
|
||||||
|
// Make sure scale matches destscale immediately when spawned
|
||||||
|
P_SetScale(mobj, mobj->destscale);
|
||||||
|
|
||||||
|
// Sprite rendering
|
||||||
|
mobj->blendmode = AST_TRANSLUCENT;
|
||||||
|
mobj->spritexscale = mobj->spriteyscale = FRACUNIT;
|
||||||
|
mobj->spritexoffset = mobj->spriteyoffset = 0;
|
||||||
|
mobj->floorspriteslope = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
{
|
{
|
||||||
state_t *st;
|
state_t *st;
|
||||||
|
|
|
@ -1506,7 +1506,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
{
|
{
|
||||||
const mobj_t *mobj = (const mobj_t *)th;
|
const mobj_t *mobj = (const mobj_t *)th;
|
||||||
UINT32 diff;
|
UINT32 diff;
|
||||||
UINT16 diff2;
|
UINT32 diff2;
|
||||||
|
|
||||||
// Ignore stationary hoops - these will be respawned from mapthings.
|
// Ignore stationary hoops - these will be respawned from mapthings.
|
||||||
if (mobj->type == MT_HOOP)
|
if (mobj->type == MT_HOOP)
|
||||||
|
@ -1638,7 +1638,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
diff2 |= MD2_SHADOWSCALE;
|
diff2 |= MD2_SHADOWSCALE;
|
||||||
if (mobj->renderflags)
|
if (mobj->renderflags)
|
||||||
diff2 |= MD2_RENDERFLAGS;
|
diff2 |= MD2_RENDERFLAGS;
|
||||||
if (mobj->renderflags)
|
if (mobj->blendmode != AST_TRANSLUCENT)
|
||||||
diff2 |= MD2_BLENDMODE;
|
diff2 |= MD2_BLENDMODE;
|
||||||
if (mobj->spritexscale != FRACUNIT)
|
if (mobj->spritexscale != FRACUNIT)
|
||||||
diff2 |= MD2_SPRITEXSCALE;
|
diff2 |= MD2_SPRITEXSCALE;
|
||||||
|
@ -1646,6 +1646,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
diff2 |= MD2_SPRITEYSCALE;
|
diff2 |= MD2_SPRITEYSCALE;
|
||||||
if (mobj->spritexoffset)
|
if (mobj->spritexoffset)
|
||||||
diff2 |= MD2_SPRITEXOFFSET;
|
diff2 |= MD2_SPRITEXOFFSET;
|
||||||
|
if (mobj->spriteyoffset)
|
||||||
|
diff2 |= MD2_SPRITEYOFFSET;
|
||||||
if (mobj->floorspriteslope)
|
if (mobj->floorspriteslope)
|
||||||
{
|
{
|
||||||
pslope_t *slope = mobj->floorspriteslope;
|
pslope_t *slope = mobj->floorspriteslope;
|
||||||
|
@ -1667,7 +1669,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type)
|
||||||
WRITEUINT8(save_p, type);
|
WRITEUINT8(save_p, type);
|
||||||
WRITEUINT32(save_p, diff);
|
WRITEUINT32(save_p, diff);
|
||||||
if (diff & MD_MORE)
|
if (diff & MD_MORE)
|
||||||
WRITEUINT16(save_p, diff2);
|
WRITEUINT32(save_p, diff2);
|
||||||
|
|
||||||
// save pointer, at load time we will search this pointer to reinitilize pointers
|
// save pointer, at load time we will search this pointer to reinitilize pointers
|
||||||
WRITEUINT32(save_p, (size_t)mobj);
|
WRITEUINT32(save_p, (size_t)mobj);
|
||||||
|
@ -2615,14 +2617,14 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
thinker_t *next;
|
thinker_t *next;
|
||||||
mobj_t *mobj;
|
mobj_t *mobj;
|
||||||
UINT32 diff;
|
UINT32 diff;
|
||||||
UINT16 diff2;
|
UINT32 diff2;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
fixed_t z, floorz, ceilingz;
|
fixed_t z, floorz, ceilingz;
|
||||||
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
|
ffloor_t *floorrover = NULL, *ceilingrover = NULL;
|
||||||
|
|
||||||
diff = READUINT32(save_p);
|
diff = READUINT32(save_p);
|
||||||
if (diff & MD_MORE)
|
if (diff & MD_MORE)
|
||||||
diff2 = READUINT16(save_p);
|
diff2 = READUINT32(save_p);
|
||||||
else
|
else
|
||||||
diff2 = 0;
|
diff2 = 0;
|
||||||
|
|
||||||
|
@ -2690,7 +2692,10 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
}
|
}
|
||||||
mobj->type = i;
|
mobj->type = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
mobj->info = &mobjinfo[mobj->type];
|
mobj->info = &mobjinfo[mobj->type];
|
||||||
|
P_SetMobjSpawnDefaults(mobj);
|
||||||
|
|
||||||
if (diff & MD_POS)
|
if (diff & MD_POS)
|
||||||
{
|
{
|
||||||
mobj->x = READFIXED(save_p);
|
mobj->x = READFIXED(save_p);
|
||||||
|
@ -2716,35 +2721,21 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
|
|
||||||
if (diff & MD_RADIUS)
|
if (diff & MD_RADIUS)
|
||||||
mobj->radius = READFIXED(save_p);
|
mobj->radius = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->radius = mobj->info->radius;
|
|
||||||
if (diff & MD_HEIGHT)
|
if (diff & MD_HEIGHT)
|
||||||
mobj->height = READFIXED(save_p);
|
mobj->height = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->height = mobj->info->height;
|
|
||||||
if (diff & MD_FLAGS)
|
if (diff & MD_FLAGS)
|
||||||
mobj->flags = READUINT32(save_p);
|
mobj->flags = READUINT32(save_p);
|
||||||
else
|
|
||||||
mobj->flags = mobj->info->flags;
|
|
||||||
if (diff & MD_FLAGS2)
|
if (diff & MD_FLAGS2)
|
||||||
mobj->flags2 = READUINT32(save_p);
|
mobj->flags2 = READUINT32(save_p);
|
||||||
if (diff & MD_HEALTH)
|
if (diff & MD_HEALTH)
|
||||||
mobj->health = READINT32(save_p);
|
mobj->health = READINT32(save_p);
|
||||||
else
|
|
||||||
mobj->health = mobj->info->spawnhealth;
|
|
||||||
if (diff & MD_RTIME)
|
if (diff & MD_RTIME)
|
||||||
mobj->reactiontime = READINT32(save_p);
|
mobj->reactiontime = READINT32(save_p);
|
||||||
else
|
|
||||||
mobj->reactiontime = mobj->info->reactiontime;
|
|
||||||
|
|
||||||
if (diff & MD_STATE)
|
if (diff & MD_STATE)
|
||||||
mobj->state = &states[READUINT16(save_p)];
|
mobj->state = &states[READUINT16(save_p)];
|
||||||
else
|
|
||||||
mobj->state = &states[mobj->info->spawnstate];
|
|
||||||
if (diff & MD_TICS)
|
if (diff & MD_TICS)
|
||||||
mobj->tics = READINT32(save_p);
|
mobj->tics = READINT32(save_p);
|
||||||
else
|
|
||||||
mobj->tics = mobj->state->tics;
|
|
||||||
if (diff & MD_SPRITE) {
|
if (diff & MD_SPRITE) {
|
||||||
mobj->sprite = READUINT16(save_p);
|
mobj->sprite = READUINT16(save_p);
|
||||||
if (mobj->sprite == SPR_PLAY)
|
if (mobj->sprite == SPR_PLAY)
|
||||||
|
@ -2760,11 +2751,6 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->frame = READUINT32(save_p);
|
mobj->frame = READUINT32(save_p);
|
||||||
mobj->anim_duration = READUINT16(save_p);
|
mobj->anim_duration = READUINT16(save_p);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
mobj->frame = mobj->state->frame;
|
|
||||||
mobj->anim_duration = (UINT16)mobj->state->var2;
|
|
||||||
}
|
|
||||||
if (diff & MD_EFLAGS)
|
if (diff & MD_EFLAGS)
|
||||||
mobj->eflags = READUINT16(save_p);
|
mobj->eflags = READUINT16(save_p);
|
||||||
if (diff & MD_PLAYER)
|
if (diff & MD_PLAYER)
|
||||||
|
@ -2781,20 +2767,14 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->threshold = READINT32(save_p);
|
mobj->threshold = READINT32(save_p);
|
||||||
if (diff & MD_LASTLOOK)
|
if (diff & MD_LASTLOOK)
|
||||||
mobj->lastlook = READINT32(save_p);
|
mobj->lastlook = READINT32(save_p);
|
||||||
else
|
|
||||||
mobj->lastlook = -1;
|
|
||||||
if (diff & MD_TARGET)
|
if (diff & MD_TARGET)
|
||||||
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
||||||
if (diff & MD_TRACER)
|
if (diff & MD_TRACER)
|
||||||
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
||||||
if (diff & MD_FRICTION)
|
if (diff & MD_FRICTION)
|
||||||
mobj->friction = READFIXED(save_p);
|
mobj->friction = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->friction = ORIG_FRICTION;
|
|
||||||
if (diff & MD_MOVEFACTOR)
|
if (diff & MD_MOVEFACTOR)
|
||||||
mobj->movefactor = READFIXED(save_p);
|
mobj->movefactor = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->movefactor = FRACUNIT;
|
|
||||||
if (diff & MD_FUSE)
|
if (diff & MD_FUSE)
|
||||||
mobj->fuse = READINT32(save_p);
|
mobj->fuse = READINT32(save_p);
|
||||||
if (diff & MD_WATERTOP)
|
if (diff & MD_WATERTOP)
|
||||||
|
@ -2803,16 +2783,10 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->waterbottom = READFIXED(save_p);
|
mobj->waterbottom = READFIXED(save_p);
|
||||||
if (diff & MD_SCALE)
|
if (diff & MD_SCALE)
|
||||||
mobj->scale = READFIXED(save_p);
|
mobj->scale = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->scale = FRACUNIT;
|
|
||||||
if (diff & MD_DSCALE)
|
if (diff & MD_DSCALE)
|
||||||
mobj->destscale = READFIXED(save_p);
|
mobj->destscale = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->destscale = mobj->scale;
|
|
||||||
if (diff2 & MD2_SCALESPEED)
|
if (diff2 & MD2_SCALESPEED)
|
||||||
mobj->scalespeed = READFIXED(save_p);
|
mobj->scalespeed = READFIXED(save_p);
|
||||||
else
|
|
||||||
mobj->scalespeed = FRACUNIT/12;
|
|
||||||
if (diff2 & MD2_CUSVAL)
|
if (diff2 & MD2_CUSVAL)
|
||||||
mobj->cusval = READINT32(save_p);
|
mobj->cusval = READINT32(save_p);
|
||||||
if (diff2 & MD2_CVMEM)
|
if (diff2 & MD2_CVMEM)
|
||||||
|
|
Loading…
Reference in New Issue