mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Merge remote-tracking branch 'origin/next' into addplayer
This commit is contained in:
commit
b112e12c93
3 changed files with 81 additions and 56 deletions
|
@ -279,7 +279,6 @@ mobjtype_t P_GetMobjtype(UINT16 mthingtype);
|
|||
void P_RespawnSpecials(void);
|
||||
|
||||
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_PrecipitationEffects(void);
|
||||
|
|
96
src/p_mobj.c
96
src/p_mobj.c
|
@ -3187,13 +3187,16 @@ boolean P_SceneryZMovement(mobj_t *mo)
|
|||
//
|
||||
boolean P_CanRunOnWater(player_t *player, ffloor_t *rover)
|
||||
{
|
||||
fixed_t topheight = P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y);
|
||||
boolean flip = player->mo->eflags & MFE_VERTICALFLIP;
|
||||
fixed_t surfaceheight = flip ? P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y) : P_GetFFloorTopZAt(rover, player->mo->x, player->mo->y);
|
||||
fixed_t playerbottom = flip ? (player->mo->z + player->mo->height) : player->mo->z;
|
||||
boolean doifit = flip ? (surfaceheight - player->mo->floorz >= player->mo->height) : (player->mo->ceilingz - surfaceheight >= player->mo->height);
|
||||
|
||||
if (!player->powers[pw_carry] && !player->homing
|
||||
&& ((player->powers[pw_super] || player->charflags & SF_RUNONWATER || player->dashmode >= DASHMODE_THRESHOLD) && player->mo->ceilingz-topheight >= player->mo->height)
|
||||
&& ((player->powers[pw_super] || player->charflags & SF_RUNONWATER || player->dashmode >= DASHMODE_THRESHOLD) && doifit)
|
||||
&& (rover->flags & FF_SWIMMABLE) && !(player->pflags & PF_SPINNING) && player->speed > FixedMul(player->runspeed, player->mo->scale)
|
||||
&& !(player->pflags & PF_SLIDING)
|
||||
&& abs(player->mo->z - topheight) < FixedMul(30*FRACUNIT, player->mo->scale))
|
||||
&& abs(playerbottom - surfaceheight) < FixedMul(30*FRACUNIT, player->mo->scale))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -10439,7 +10442,44 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
mobj->x = x;
|
||||
mobj->y = y;
|
||||
|
||||
P_SetMobjSpawnDefaults(mobj);
|
||||
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
|
||||
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
|
||||
P_SetThingPosition(mobj);
|
||||
|
@ -10746,8 +10786,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
mobj->frame &= ~FF_FRAMEMASK;
|
||||
}
|
||||
|
||||
st = &states[info->spawnstate];
|
||||
|
||||
// Call action functions when the state is set
|
||||
if (st->action.acp1 && (mobj->flags & MF_RUNSPAWNFUNC))
|
||||
{
|
||||
|
@ -10778,52 +10816,6 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
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)
|
||||
{
|
||||
state_t *st;
|
||||
|
|
|
@ -2717,10 +2717,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
}
|
||||
mobj->type = i;
|
||||
}
|
||||
|
||||
mobj->info = &mobjinfo[mobj->type];
|
||||
P_SetMobjSpawnDefaults(mobj);
|
||||
|
||||
if (diff & MD_POS)
|
||||
{
|
||||
mobj->x = READFIXED(save_p);
|
||||
|
@ -2746,21 +2743,35 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
|
||||
if (diff & MD_RADIUS)
|
||||
mobj->radius = READFIXED(save_p);
|
||||
else
|
||||
mobj->radius = mobj->info->radius;
|
||||
if (diff & MD_HEIGHT)
|
||||
mobj->height = READFIXED(save_p);
|
||||
else
|
||||
mobj->height = mobj->info->height;
|
||||
if (diff & MD_FLAGS)
|
||||
mobj->flags = READUINT32(save_p);
|
||||
else
|
||||
mobj->flags = mobj->info->flags;
|
||||
if (diff & MD_FLAGS2)
|
||||
mobj->flags2 = READUINT32(save_p);
|
||||
if (diff & MD_HEALTH)
|
||||
mobj->health = READINT32(save_p);
|
||||
else
|
||||
mobj->health = mobj->info->spawnhealth;
|
||||
if (diff & MD_RTIME)
|
||||
mobj->reactiontime = READINT32(save_p);
|
||||
else
|
||||
mobj->reactiontime = mobj->info->reactiontime;
|
||||
|
||||
if (diff & MD_STATE)
|
||||
mobj->state = &states[READUINT16(save_p)];
|
||||
else
|
||||
mobj->state = &states[mobj->info->spawnstate];
|
||||
if (diff & MD_TICS)
|
||||
mobj->tics = READINT32(save_p);
|
||||
else
|
||||
mobj->tics = mobj->state->tics;
|
||||
if (diff & MD_SPRITE) {
|
||||
mobj->sprite = READUINT16(save_p);
|
||||
if (mobj->sprite == SPR_PLAY)
|
||||
|
@ -2776,6 +2787,11 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
mobj->frame = READUINT32(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)
|
||||
mobj->eflags = READUINT16(save_p);
|
||||
if (diff & MD_PLAYER)
|
||||
|
@ -2792,14 +2808,20 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
mobj->threshold = READINT32(save_p);
|
||||
if (diff & MD_LASTLOOK)
|
||||
mobj->lastlook = READINT32(save_p);
|
||||
else
|
||||
mobj->lastlook = -1;
|
||||
if (diff & MD_TARGET)
|
||||
mobj->target = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_TRACER)
|
||||
mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff & MD_FRICTION)
|
||||
mobj->friction = READFIXED(save_p);
|
||||
else
|
||||
mobj->friction = ORIG_FRICTION;
|
||||
if (diff & MD_MOVEFACTOR)
|
||||
mobj->movefactor = READFIXED(save_p);
|
||||
else
|
||||
mobj->movefactor = FRACUNIT;
|
||||
if (diff & MD_FUSE)
|
||||
mobj->fuse = READINT32(save_p);
|
||||
if (diff & MD_WATERTOP)
|
||||
|
@ -2808,10 +2830,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
mobj->waterbottom = READFIXED(save_p);
|
||||
if (diff & MD_SCALE)
|
||||
mobj->scale = READFIXED(save_p);
|
||||
else
|
||||
mobj->scale = FRACUNIT;
|
||||
if (diff & MD_DSCALE)
|
||||
mobj->destscale = READFIXED(save_p);
|
||||
else
|
||||
mobj->destscale = mobj->scale;
|
||||
if (diff2 & MD2_SCALESPEED)
|
||||
mobj->scalespeed = READFIXED(save_p);
|
||||
else
|
||||
mobj->scalespeed = FRACUNIT/12;
|
||||
if (diff2 & MD2_CUSVAL)
|
||||
mobj->cusval = READINT32(save_p);
|
||||
if (diff2 & MD2_CVMEM)
|
||||
|
@ -2842,10 +2870,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
mobj->renderflags = READUINT32(save_p);
|
||||
if (diff2 & MD2_BLENDMODE)
|
||||
mobj->blendmode = READINT32(save_p);
|
||||
else
|
||||
mobj->blendmode = AST_TRANSLUCENT;
|
||||
if (diff2 & MD2_SPRITEXSCALE)
|
||||
mobj->spritexscale = READFIXED(save_p);
|
||||
else
|
||||
mobj->spritexscale = FRACUNIT;
|
||||
if (diff2 & MD2_SPRITEYSCALE)
|
||||
mobj->spriteyscale = READFIXED(save_p);
|
||||
else
|
||||
mobj->spriteyscale = FRACUNIT;
|
||||
if (diff2 & MD2_SPRITEXOFFSET)
|
||||
mobj->spritexoffset = READFIXED(save_p);
|
||||
if (diff2 & MD2_SPRITEYOFFSET)
|
||||
|
|
Loading…
Reference in a new issue