mirror of
https://github.com/ZDoom/Raze.git
synced 2025-03-22 17:01:08 +00:00
- consolidated move functions.
This commit is contained in:
parent
5a2410cbbb
commit
0b3f18a903
7 changed files with 236 additions and 435 deletions
|
@ -1063,6 +1063,238 @@ int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int clipty
|
|||
return result.type;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void move(DDukeActor* actor, int pnum, double pdist)
|
||||
{
|
||||
DAngle goalang, angdif;
|
||||
double daxvel;
|
||||
|
||||
int a = actor->spr.hitag;
|
||||
|
||||
if (a == -1) a = 0;
|
||||
|
||||
actor->counter++;
|
||||
|
||||
if (a & face_player)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = (ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5 / 16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (a & spin)
|
||||
actor->spr.Angles.Yaw += DAngle45 * BobVal(actor->counter << 3);
|
||||
|
||||
if (a & face_player_slow)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = (ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = DAngle22_5 * 0.25 * Sgn(deltaangle(actor->spr.Angles.Yaw, goalang).Degrees()); // this looks very wrong...
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (a & antifaceplayerslow)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = ((ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle() + DAngle180);
|
||||
else goalang = ((ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle() + DAngle180);
|
||||
angdif = DAngle22_5 * 0.25 * Sgn(deltaangle(actor->spr.Angles.Yaw, goalang).Degrees()); // this looks very wrong...
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if ((a & jumptoplayer) == jumptoplayer)
|
||||
{
|
||||
if (actor->counter < 16)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_jumptoplayer_factor);
|
||||
}
|
||||
else if (a & justjump1)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_justjump1_factor);
|
||||
}
|
||||
if (a & justjump2)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_justjump2_factor);
|
||||
}
|
||||
if (a & windang)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_windang_factor);
|
||||
}
|
||||
|
||||
|
||||
if (a & face_player_smart)
|
||||
{
|
||||
DVector2 newpos = ps[pnum].GetActor()->spr.pos.XY() + (ps[pnum].vel.XY() * (4. / 3.));
|
||||
goalang = (newpos - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5 / 16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (actor->curMove->name == NAME_None || a == 0)
|
||||
{
|
||||
if ((badguy(actor) && actor->spr.extra <= 0) || (actor->opos.X != actor->spr.pos.X) || (actor->opos.Y != actor->spr.pos.Y))
|
||||
{
|
||||
if (!actor->isPlayer()) actor->backupvec2();
|
||||
SetActor(actor, actor->spr.pos);
|
||||
}
|
||||
if (badguy(actor) && actor->spr.extra <= 0)
|
||||
{
|
||||
if (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY)
|
||||
{
|
||||
if (actor->sector()->shadedsector == 1)
|
||||
{
|
||||
actor->spr.shade += (16 - actor->spr.shade) >> 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->ceilingshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->floorshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (a & geth) actor->vel.X += (actor->curMove->movex - actor->vel.X) * 0.5;
|
||||
if (a & getv) actor->vel.Z += (actor->curMove->movez - actor->vel.Z) * 0.5;
|
||||
|
||||
if (a & dodgebullet)
|
||||
dodge(actor);
|
||||
|
||||
if (!actor->isPlayer())
|
||||
alterang(a, actor, pnum);
|
||||
|
||||
if (abs(actor->vel.X) < 6 / 16.) actor->vel.X = 0;
|
||||
|
||||
a = badguy(actor);
|
||||
|
||||
if (actor->vel.X != 0 || actor->vel.Z != 0)
|
||||
{
|
||||
if (a && !(actor->flags3 & SFLAG3_NOVERTICALMOVE))
|
||||
{
|
||||
if ((actor->flags2 & SFLAG2_FLOATING) && actor->spr.extra > 0)
|
||||
{
|
||||
double fdist = actor->FloatVar(NAME_floating_floordist);
|
||||
double cdist = actor->FloatVar(NAME_floating_ceilingdist);
|
||||
double c, f;
|
||||
calcSlope(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &c, &f);
|
||||
actor->floorz = f;
|
||||
actor->ceilingz = c;
|
||||
|
||||
if (actor->spr.pos.Z > f - fdist)
|
||||
{
|
||||
actor->spr.pos.Z = f - fdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
|
||||
if (actor->spr.pos.Z < c + cdist)
|
||||
{
|
||||
actor->spr.pos.Z = c + cdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (actor->vel.Z > 0 && actor->floorz < actor->spr.pos.Z)
|
||||
actor->spr.pos.Z = actor->floorz;
|
||||
if (actor->vel.Z < 0)
|
||||
{
|
||||
double c = getceilzofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y);
|
||||
if (actor->spr.pos.Z < c + 66)
|
||||
{
|
||||
actor->spr.pos.Z = c + 66;
|
||||
actor->vel.Z *= 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
daxvel = actor->vel.X;
|
||||
angdif = actor->spr.Angles.Yaw;
|
||||
|
||||
if (a && !(actor->flags3 & SFLAG3_MOVE_NOPLAYERINTERACT))
|
||||
{
|
||||
if (pdist < 60 && actor->spr.scale.X > 0.25)
|
||||
{
|
||||
|
||||
daxvel = -(64 - pdist);
|
||||
angdif = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
|
||||
if (pdist < 32)
|
||||
{
|
||||
ps[pnum].vel.X = 0;
|
||||
ps[pnum].vel.Y = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ps[pnum].vel.XY() *= gs.playerfriction - 0.125;
|
||||
}
|
||||
}
|
||||
else if (!(actor->flags2 & SFLAG2_FLOATING))
|
||||
{
|
||||
if (actor->curMove->movez == 0)
|
||||
{
|
||||
if (actor->opos.Z != actor->spr.pos.Z || (ud.multimode < 2 && ud.player_skill < 2))
|
||||
{
|
||||
if ((actor->counter & 1) || ps[pnum].actorsqu == actor) return;
|
||||
else daxvel *= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((actor->counter & 3) || ps[pnum].actorsqu == actor) return;
|
||||
else daxvel *= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (actor->sector()->lotag != ST_1_ABOVE_WATER)
|
||||
{
|
||||
daxvel *= actor->FloatVar(NAME_landmovefactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
daxvel *= actor->FloatVar(NAME_watermovefactor);
|
||||
}
|
||||
|
||||
Collision coll;
|
||||
actor->movflag = movesprite_ex(actor, DVector3(angdif.ToVector() * daxvel, actor->vel.Z), CLIPMASK0, coll);
|
||||
}
|
||||
|
||||
if (a)
|
||||
{
|
||||
if (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY)
|
||||
{
|
||||
if (actor->sector()->shadedsector == 1)
|
||||
{
|
||||
actor->spr.shade += (16 - actor->spr.shade) >> 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->ceilingshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
else actor->spr.shade += (actor->sector()->floorshade - actor->spr.shade) >> 1;
|
||||
|
||||
if (actor->sector()->floortexture == mirrortex)
|
||||
actor->Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Rotating sector
|
||||
|
|
|
@ -864,180 +864,6 @@ void moveeffectors_d(void) //STATNUM 3
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void move_d(DDukeActor *actor, int playernum, int xvel)
|
||||
{
|
||||
DAngle goalang, angdif;
|
||||
double daxvel;
|
||||
|
||||
int a = actor->spr.hitag;
|
||||
|
||||
if (a == -1) a = 0;
|
||||
|
||||
actor->counter++;
|
||||
|
||||
if (a & face_player)
|
||||
{
|
||||
if (ps[playernum].newOwner != nullptr)
|
||||
goalang = (ps[playernum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[playernum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5 / 16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (a & spin)
|
||||
actor->spr.Angles.Yaw += DAngle45 * BobVal(actor->counter << 3);
|
||||
|
||||
if (a & face_player_slow)
|
||||
{
|
||||
if (ps[playernum].newOwner != nullptr)
|
||||
goalang = (ps[playernum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[playernum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = DAngle22_5 * 0.25 * Sgn(deltaangle(actor->spr.Angles.Yaw, goalang).Degrees()); // this looks very wrong...
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
|
||||
if ((a & jumptoplayer) == jumptoplayer)
|
||||
{
|
||||
if (actor->counter < 16)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * 2;
|
||||
}
|
||||
|
||||
if (a & face_player_smart)
|
||||
{
|
||||
DVector2 newpos = ps[playernum].GetActor()->spr.pos.XY() + (ps[playernum].vel.XY() * (4. / 3.));
|
||||
goalang = (newpos - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5/16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (actor->curMove->name == NAME_None || a == 0)
|
||||
{
|
||||
if ((badguy(actor) && actor->spr.extra <= 0) || (actor->opos.X != actor->spr.pos.X) || (actor->opos.Y != actor->spr.pos.Y))
|
||||
{
|
||||
if (!actor->isPlayer()) actor->backupvec2();
|
||||
SetActor(actor, actor->spr.pos);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (a & geth) actor->vel.X += (actor->curMove->movex - actor->vel.X) * 0.5;
|
||||
if (a & getv) actor->vel.Z += (actor->curMove->movez - actor->vel.Z) * 0.5;
|
||||
|
||||
if (a & dodgebullet)
|
||||
dodge(actor);
|
||||
|
||||
if (!actor->isPlayer())
|
||||
alterang(a, actor, playernum);
|
||||
|
||||
if (abs(actor->vel.X) < 6 / 16.) actor->vel.X = 0;
|
||||
|
||||
a = badguy(actor);
|
||||
|
||||
if (actor->vel.X != 0 || actor->vel.Z != 0)
|
||||
{
|
||||
if (a && !(actor->flags3 & SFLAG3_NOVERTICALMOVE))
|
||||
{
|
||||
if ((actor->flags2 & SFLAG2_FLOATING) && actor->spr.extra > 0)
|
||||
{
|
||||
double fdist = actor->FloatVar(NAME_floating_floordist);
|
||||
double cdist = actor->FloatVar(NAME_floating_ceilingdist);
|
||||
double c, f;
|
||||
calcSlope(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &c, &f);
|
||||
actor->floorz = f;
|
||||
actor->ceilingz = c;
|
||||
|
||||
if (actor->spr.pos.Z > f - fdist)
|
||||
{
|
||||
actor->spr.pos.Z = f - fdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
|
||||
if (actor->spr.pos.Z < c + cdist)
|
||||
{
|
||||
actor->spr.pos.Z = c + cdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (actor->vel.Z > 0 && actor->floorz < actor->spr.pos.Z)
|
||||
actor->spr.pos.Z = actor->floorz;
|
||||
if (actor->vel.Z < 0)
|
||||
{
|
||||
double c = getceilzofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y);
|
||||
if (actor->spr.pos.Z < c + 66)
|
||||
{
|
||||
actor->spr.pos.Z = c + 66;
|
||||
actor->vel.Z *= 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
daxvel = actor->vel.X;
|
||||
angdif = actor->spr.Angles.Yaw;
|
||||
|
||||
if (a && !(actor->flags3 & SFLAG3_MOVE_NOPLAYERINTERACT))
|
||||
{
|
||||
if (xvel < 960 && actor->spr.scale.X > 0.25 )
|
||||
{
|
||||
|
||||
daxvel = -(1024 - xvel) * maptoworld;
|
||||
angdif = (ps[playernum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
|
||||
if (xvel < 512)
|
||||
{
|
||||
ps[playernum].vel.X = 0;
|
||||
ps[playernum].vel.Y = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ps[playernum].vel.XY() *= gs.playerfriction - 0.125;
|
||||
}
|
||||
}
|
||||
else if (!(actor->flags2 & SFLAG2_FLOATING))
|
||||
{
|
||||
if (actor->curMove->movez == 0)
|
||||
{
|
||||
if (actor->opos.Z != actor->spr.pos.Z || (ud.multimode < 2 && ud.player_skill < 2))
|
||||
{
|
||||
if ((actor->counter & 1) || ps[playernum].actorsqu == actor) return;
|
||||
else daxvel *= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((actor->counter & 3) || ps[playernum].actorsqu == actor) return;
|
||||
else daxvel *= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Collision coll;
|
||||
actor->movflag = movesprite_ex(actor, DVector3(angdif.ToVector() * daxvel, actor->vel.Z), CLIPMASK0, coll);
|
||||
}
|
||||
|
||||
if (a)
|
||||
{
|
||||
if (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY)
|
||||
actor->spr.shade += (actor->sector()->ceilingshade - actor->spr.shade) >> 1;
|
||||
else actor->spr.shade += (actor->sector()->floorshade - actor->spr.shade) >> 1;
|
||||
|
||||
if (actor->sector()->floortexture == mirrortex)
|
||||
actor->Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
|
|
@ -1002,233 +1002,6 @@ double adjustfall(DDukeActor *actor, double c)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void move_r(DDukeActor *actor, int pnum, int xvel)
|
||||
{
|
||||
DAngle goalang, angdif;
|
||||
double daxvel;
|
||||
|
||||
int a = actor->spr.hitag;
|
||||
|
||||
if (a == -1) a = 0;
|
||||
|
||||
actor->counter++;
|
||||
|
||||
if (a & face_player)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = (ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5 / 16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (a & spin)
|
||||
actor->spr.Angles.Yaw += DAngle45 * BobVal(actor->counter << 3);
|
||||
|
||||
if (a & face_player_slow)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = (ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle();
|
||||
else goalang = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
angdif = DAngle22_5 * 0.25 * Sgn(deltaangle(actor->spr.Angles.Yaw, goalang).Degrees()); // this looks very wrong...
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (a & antifaceplayerslow)
|
||||
{
|
||||
if (ps[pnum].newOwner != nullptr)
|
||||
goalang = ((ps[pnum].GetActor()->opos.XY() - actor->spr.pos.XY()).Angle() + DAngle180);
|
||||
else goalang = ((ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle() + DAngle180);
|
||||
angdif = DAngle22_5 * 0.25 * Sgn(deltaangle(actor->spr.Angles.Yaw, goalang).Degrees()); // this looks very wrong...
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if ((a & jumptoplayer) == jumptoplayer)
|
||||
{
|
||||
if (actor->counter < 16)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_jumptoplayer_factor);
|
||||
}
|
||||
else if (a & justjump1)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_justjump1_factor);
|
||||
}
|
||||
if (a & justjump2)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_justjump2_factor);
|
||||
}
|
||||
if (a & windang)
|
||||
{
|
||||
if (actor->counter < 8)
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4)) * actor->FloatVar(NAME_windang_factor);
|
||||
actor->vel.Z -= BobVal(512 + (actor->counter << 4) * 2.667);
|
||||
}
|
||||
|
||||
|
||||
if (a & face_player_smart)
|
||||
{
|
||||
DVector2 newpos = ps[pnum].GetActor()->spr.pos.XY() + (ps[pnum].vel.XY() * (4. / 3.));
|
||||
goalang = (newpos - actor->spr.pos.XY()).Angle();
|
||||
angdif = deltaangle(actor->spr.Angles.Yaw, goalang) * 0.25;
|
||||
if (angdif > -DAngle22_5 / 16 && angdif < nullAngle) angdif = nullAngle;
|
||||
actor->spr.Angles.Yaw += angdif;
|
||||
}
|
||||
|
||||
if (actor->curMove->name == NAME_None || a == 0)
|
||||
{
|
||||
if ((badguy(actor) && actor->spr.extra <= 0) || (actor->opos.X != actor->spr.pos.X) || (actor->opos.Y != actor->spr.pos.Y))
|
||||
{
|
||||
if (!actor->isPlayer()) actor->backupvec2();
|
||||
SetActor(actor, actor->spr.pos);
|
||||
}
|
||||
if (badguy(actor) && actor->spr.extra <= 0)
|
||||
{
|
||||
if (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY)
|
||||
{
|
||||
if (actor->sector()->shadedsector == 1)
|
||||
{
|
||||
actor->spr.shade += (16 - actor->spr.shade) >> 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->ceilingshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->floorshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (a & geth) actor->vel.X += (actor->curMove->movex - actor->vel.X) * 0.5;
|
||||
if (a & getv) actor->vel.Z += (actor->curMove->movez - actor->vel.Z) * 0.5;
|
||||
|
||||
if (a & dodgebullet)
|
||||
dodge(actor);
|
||||
|
||||
if (!actor->isPlayer())
|
||||
alterang(a, actor, pnum);
|
||||
|
||||
if (abs(actor->vel.X) < 6 / 16.) actor->vel.X = 0;
|
||||
|
||||
a = badguy(actor);
|
||||
|
||||
if (actor->vel.X != 0 || actor->vel.Z != 0)
|
||||
{
|
||||
if (a)
|
||||
{
|
||||
if ((actor->flags2 & SFLAG2_FLOATING) && actor->spr.extra > 0)
|
||||
{
|
||||
double fdist = actor->FloatVar(NAME_floating_floordist);
|
||||
double cdist = actor->FloatVar(NAME_floating_ceilingdist);
|
||||
double c, f;
|
||||
calcSlope(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &c, &f);
|
||||
actor->floorz = f;
|
||||
actor->ceilingz = c;
|
||||
|
||||
if (actor->spr.pos.Z > f - fdist)
|
||||
{
|
||||
actor->spr.pos.Z = f - fdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
|
||||
if (actor->spr.pos.Z < c + cdist)
|
||||
{
|
||||
actor->spr.pos.Z = c + cdist;
|
||||
actor->vel.Z = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (actor->vel.Z > 0 && actor->floorz < actor->spr.pos.Z)
|
||||
actor->spr.pos.Z = actor->floorz;
|
||||
if (actor->vel.Z < 0)
|
||||
{
|
||||
double c = getceilzofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y);
|
||||
if (actor->spr.pos.Z < c + 66)
|
||||
{
|
||||
actor->spr.pos.Z = c + 66;
|
||||
actor->vel.Z *= 0.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
daxvel = actor->vel.X;
|
||||
angdif = actor->spr.Angles.Yaw;
|
||||
|
||||
if (a)
|
||||
{
|
||||
if (xvel < 960 && actor->spr.scale.X > 0.25 )
|
||||
{
|
||||
|
||||
daxvel = -(1024 - xvel) * maptoworld;
|
||||
angdif = (ps[pnum].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Angle();
|
||||
|
||||
if (xvel < 512)
|
||||
{
|
||||
ps[pnum].vel.X = 0;
|
||||
ps[pnum].vel.Y = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ps[pnum].vel.XY() *= gs.playerfriction - 0.125;
|
||||
}
|
||||
}
|
||||
else if (!(actor->flags2 & SFLAG2_FLOATING))
|
||||
{
|
||||
if (actor->curMove->movez == 0)
|
||||
{
|
||||
if (actor->opos.Z != actor->spr.pos.Z || (ud.multimode < 2 && ud.player_skill < 2))
|
||||
{
|
||||
if ((actor->counter & 1) || ps[pnum].actorsqu == actor) return;
|
||||
else daxvel *= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((actor->counter & 3) || ps[pnum].actorsqu == actor) return;
|
||||
else daxvel *= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (actor->sector()->lotag != ST_1_ABOVE_WATER)
|
||||
{
|
||||
daxvel *= actor->FloatVar(NAME_landmovefactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
daxvel *= actor->FloatVar(NAME_watermovefactor);
|
||||
}
|
||||
|
||||
Collision coll;
|
||||
actor->movflag = movesprite_ex(actor, DVector3(angdif.ToVector() * daxvel, actor->vel.Z), CLIPMASK0, coll);
|
||||
}
|
||||
|
||||
if (a)
|
||||
{
|
||||
if (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY)
|
||||
{
|
||||
if (actor->sector()->shadedsector == 1)
|
||||
{
|
||||
actor->spr.shade += (16 - actor->spr.shade) >> 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
actor->spr.shade += (actor->sector()->ceilingshade - actor->spr.shade) >> 1;
|
||||
}
|
||||
}
|
||||
else actor->spr.shade += (actor->sector()->floorshade - actor->spr.shade) >> 1;
|
||||
|
||||
if (actor->sector()->floortexture == mirrortex)
|
||||
actor->Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
void fakebubbaspawn(DDukeActor *actor, player_struct* p)
|
||||
{
|
||||
fakebubba_spawn++;
|
||||
|
|
|
@ -50,8 +50,6 @@ int ifhitbyweapon_r(DDukeActor* sn);
|
|||
int ifhitbyweapon_d(DDukeActor* sn);
|
||||
void fall_d(DDukeActor* i, int g_p);
|
||||
void fall_r(DDukeActor* i, int g_p);
|
||||
void move_d(DDukeActor* i, int g_p, int g_x);
|
||||
void move_r(DDukeActor* i, int g_p, int g_x);
|
||||
void incur_damage_d(player_struct* p);
|
||||
void incur_damage_r(player_struct* p);
|
||||
void selectweapon_d(int snum, int j);
|
||||
|
@ -91,7 +89,6 @@ void SetDispatcher()
|
|||
addweapon_d,
|
||||
ifhitbyweapon_d,
|
||||
fall_d,
|
||||
move_d,
|
||||
|
||||
incur_damage_d,
|
||||
selectweapon_d,
|
||||
|
@ -117,7 +114,6 @@ void SetDispatcher()
|
|||
addweapon_r,
|
||||
ifhitbyweapon_r,
|
||||
fall_r,
|
||||
move_r,
|
||||
|
||||
incur_damage_r,
|
||||
selectweapon_r,
|
||||
|
|
|
@ -83,7 +83,6 @@ struct Dispatcher
|
|||
void (*addweapon)(player_struct *p, int weapon, bool wswitch);
|
||||
int (*ifhitbyweapon)(DDukeActor* sectnum);
|
||||
void (*fall)(DDukeActor* actor, int g_p);
|
||||
void (*move)(DDukeActor* i, int g_p, int g_x);
|
||||
|
||||
// player
|
||||
void (*incur_damage)(player_struct* p);
|
||||
|
|
|
@ -42,6 +42,7 @@ void RANDOMSCRAP(DDukeActor* i);
|
|||
void detonate(DDukeActor* i, PClassActor* explosion);
|
||||
void hitradius(DDukeActor* i, int r, int hp1, int hp2, int hp3, int hp4);
|
||||
int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result);
|
||||
void move(DDukeActor* actor, int pnum, double xvel);
|
||||
void lotsofstuff(DDukeActor* s, int n, PClassActor* spawntype);
|
||||
void watersplash2(DDukeActor* i);
|
||||
bool money(DDukeActor* i, int BLOODPOOL);
|
||||
|
|
|
@ -3221,34 +3221,8 @@ void LoadActor(DDukeActor *actor, int p, int x)
|
|||
|
||||
if (s.killit_flag == 1)
|
||||
{
|
||||
// if player was set to squish, first stop that..
|
||||
if (p >= 0)
|
||||
{
|
||||
if (ps[p].actorsqu == actor)
|
||||
ps[p].actorsqu = nullptr;
|
||||
}
|
||||
actor->Destroy();
|
||||
}
|
||||
else
|
||||
{
|
||||
fi.move(actor, p, x);
|
||||
|
||||
if (actor->spr.statnum == STAT_ACTOR)
|
||||
{
|
||||
if (badguy(actor))
|
||||
{
|
||||
if (actor->spr.scale.X > 0.9375 ) return;
|
||||
if (ud.respawn_monsters == 1 && actor->spr.extra <= 0) return;
|
||||
}
|
||||
else if (ud.respawn_items == 1 && (actor->spr.cstat & CSTAT_SPRITE_INVISIBLE)) return;
|
||||
|
||||
if (actor->timetosleep > 1)
|
||||
actor->timetosleep--;
|
||||
else if (actor->timetosleep == 1)
|
||||
ChangeActorStat(actor, STAT_ZOMBIEACTOR);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -3257,7 +3231,7 @@ void LoadActor(DDukeActor *actor, int p, int x)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool execute(DDukeActor *actor,int p,double xx)
|
||||
bool execute(DDukeActor *actor,int p,double pdist)
|
||||
{
|
||||
auto coninf = actor->conInfo();
|
||||
if (coninf == nullptr)
|
||||
|
@ -3265,7 +3239,7 @@ bool execute(DDukeActor *actor,int p,double xx)
|
|||
|
||||
ParseState s;
|
||||
s.g_p = p; // Player ID
|
||||
s.g_x = int(xx / maptoworld); // ??
|
||||
s.g_x = int(pdist / maptoworld); // ??
|
||||
s.g_ac = actor;
|
||||
s.insptr = &ScriptCode[4 + (gs.actorinfo[actor->spr.picnum].scriptaddress)];
|
||||
auto insptr = coninf? &ScriptCode[4 + coninf->scriptaddress] : nullptr;
|
||||
|
@ -3287,7 +3261,7 @@ bool execute(DDukeActor *actor,int p,double xx)
|
|||
}
|
||||
else
|
||||
{
|
||||
fi.move(actor, p, int(xx / maptoworld));
|
||||
move(actor, p, pdist);
|
||||
|
||||
if (actor->spr.statnum == STAT_ACTOR)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue