mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-27 14:22:13 +00:00
Merge remote-tracking branch 'remotes/zdoom/master'
This commit is contained in:
commit
069889c5ce
10 changed files with 86 additions and 69 deletions
30
src/actor.h
30
src/actor.h
|
@ -951,23 +951,43 @@ public:
|
|||
return ret;
|
||||
}
|
||||
|
||||
fixedvec2 Vec2Offset(fixed_t dx, fixed_t dy) const
|
||||
fixedvec2 Vec2Offset(fixed_t dx, fixed_t dy, bool absolute = false) const
|
||||
{
|
||||
fixedvec2 ret = { x + dx, y + dy };
|
||||
return ret;
|
||||
}
|
||||
|
||||
fixedvec3 Vec3Offset(fixed_t dx, fixed_t dy, fixed_t dz) const
|
||||
|
||||
fixedvec2 Vec2Angle(fixed_t length, angle_t angle, bool absolute = false) const
|
||||
{
|
||||
fixedvec2 ret = { x + FixedMul(length, finecosine[angle >> ANGLETOFINESHIFT]),
|
||||
y + FixedMul(length, finesine[angle >> ANGLETOFINESHIFT]) };
|
||||
return ret;
|
||||
}
|
||||
|
||||
fixedvec3 Vec3Offset(fixed_t dx, fixed_t dy, fixed_t dz, bool absolute = false) const
|
||||
{
|
||||
fixedvec3 ret = { x + dx, y + dy, z + dz };
|
||||
return ret;
|
||||
}
|
||||
|
||||
fixedvec3 Vec3Angle(fixed_t length, angle_t angle, fixed_t dz, bool absolute = false) const
|
||||
{
|
||||
fixedvec3 ret = { x + FixedMul(length, finecosine[angle >> ANGLETOFINESHIFT]),
|
||||
y + FixedMul(length, finesine[angle >> ANGLETOFINESHIFT]), z + dz };
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Move(fixed_t dx, fixed_t dy, fixed_t dz)
|
||||
{
|
||||
SetOrigin(x + dx, y + dy, z + dz, true);
|
||||
}
|
||||
|
||||
void SetOrigin(const fixedvec3 & npos, bool moving)
|
||||
{
|
||||
SetOrigin(npos.x, npos.y, npos.z, moving);
|
||||
}
|
||||
|
||||
inline void SetFriendPlayer(player_t *player);
|
||||
|
||||
bool IsVisibleToPlayer() const;
|
||||
|
@ -1227,7 +1247,11 @@ public:
|
|||
{
|
||||
return z;
|
||||
}
|
||||
void SetZ(fixed_t newz)
|
||||
fixed_t Top() const
|
||||
{
|
||||
return z + height;
|
||||
}
|
||||
void SetZ(fixed_t newz, bool moving = true)
|
||||
{
|
||||
z = newz;
|
||||
}
|
||||
|
|
|
@ -2376,7 +2376,7 @@ void Net_DoCommand (int type, BYTE **stream, int player)
|
|||
s = ReadString (stream);
|
||||
|
||||
if (Trace (players[player].mo->X(), players[player].mo->Y(),
|
||||
players[player].mo->Z() + players[player].mo->height - (players[player].mo->height>>2),
|
||||
players[player].mo->Top() - (players[player].mo->height>>2),
|
||||
players[player].mo->Sector,
|
||||
vx, vy, vz, 172*FRACUNIT, 0, ML_BLOCKEVERYTHING, players[player].mo,
|
||||
trace, TRACE_NoSky))
|
||||
|
|
|
@ -982,7 +982,7 @@ void FParser::SF_ObjX(void)
|
|||
}
|
||||
|
||||
t_return.type = svt_fixed; // haleyjd: SoM's fixed-point fix
|
||||
t_return.value.f = mo ? mo->x : 0; // null ptr check
|
||||
t_return.value.f = mo ? mo->X() : 0; // null ptr check
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -1005,7 +1005,7 @@ void FParser::SF_ObjY(void)
|
|||
}
|
||||
|
||||
t_return.type = svt_fixed; // haleyjd
|
||||
t_return.value.f = mo ? mo->y : 0; // null ptr check
|
||||
t_return.value.f = mo ? mo->Y() : 0; // null ptr check
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -1028,7 +1028,7 @@ void FParser::SF_ObjZ(void)
|
|||
}
|
||||
|
||||
t_return.type = svt_fixed; // haleyjd
|
||||
t_return.value.f = mo ? mo->z : 0; // null ptr check
|
||||
t_return.value.f = mo ? mo->Z() : 0; // null ptr check
|
||||
}
|
||||
|
||||
|
||||
|
@ -1466,8 +1466,8 @@ void FParser::SF_SetCamera(void)
|
|||
angle = t_argc < 2 ? newcamera->angle : (fixed_t)FixedToAngle(fixedvalue(t_argv[1]));
|
||||
|
||||
newcamera->special1=newcamera->angle;
|
||||
newcamera->special2=newcamera->z;
|
||||
newcamera->z = t_argc < 3 ? (newcamera->z + (41 << FRACBITS)) : (intvalue(t_argv[2]) << FRACBITS);
|
||||
newcamera->special2=newcamera->Z();
|
||||
newcamera->SetZ(t_argc < 3 ? (newcamera->Z() + (41 << FRACBITS)) : (intvalue(t_argv[2]) << FRACBITS));
|
||||
newcamera->angle = angle;
|
||||
if(t_argc < 4) newcamera->pitch = 0;
|
||||
else
|
||||
|
@ -1498,7 +1498,7 @@ void FParser::SF_ClearCamera(void)
|
|||
{
|
||||
player->camera=player->mo;
|
||||
cam->angle=cam->special1;
|
||||
cam->z=cam->special2;
|
||||
cam->SetZ(cam->special2);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3065,7 +3065,7 @@ void FParser::SF_SetWeapon()
|
|||
void FParser::SF_MoveCamera(void)
|
||||
{
|
||||
fixed_t x, y, z;
|
||||
fixed_t xdist, ydist, zdist, xydist, movespeed;
|
||||
fixed_t zdist, xydist, movespeed;
|
||||
fixed_t xstep, ystep, zstep, targetheight;
|
||||
angle_t anglespeed, anglestep, angledist, targetangle,
|
||||
mobjangle, bigangle, smallangle;
|
||||
|
@ -3097,9 +3097,8 @@ void FParser::SF_MoveCamera(void)
|
|||
anglespeed = (angle_t)FixedToAngle(fixedvalue(t_argv[5]));
|
||||
|
||||
// figure out how big one step will be
|
||||
xdist = target->x - cam->x;
|
||||
ydist = target->y - cam->y;
|
||||
zdist = targetheight - cam->z;
|
||||
fixedvec2 dist = cam->Vec2To(target);
|
||||
zdist = targetheight - cam->Z();
|
||||
|
||||
// Angle checking...
|
||||
// 90
|
||||
|
@ -3170,19 +3169,19 @@ void FParser::SF_MoveCamera(void)
|
|||
else
|
||||
anglestep = anglespeed;
|
||||
|
||||
if(abs(xstep) >= (abs(xdist) - 1))
|
||||
x = target->x;
|
||||
if(abs(xstep) >= (abs(dist.x) - 1))
|
||||
x = cam->X() + dist.x;
|
||||
else
|
||||
{
|
||||
x = cam->x + xstep;
|
||||
x = cam->X() + xstep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
if(abs(ystep) >= (abs(ydist) - 1))
|
||||
y = target->y;
|
||||
if(abs(ystep) >= (abs(dist.y) - 1))
|
||||
y = cam->Y() + dist.y;
|
||||
else
|
||||
{
|
||||
y = cam->y + ystep;
|
||||
y = cam->Y() + ystep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
|
@ -3190,7 +3189,7 @@ void FParser::SF_MoveCamera(void)
|
|||
z = targetheight;
|
||||
else
|
||||
{
|
||||
z = cam->z + zstep;
|
||||
z = cam->Z() + zstep;
|
||||
moved = 1;
|
||||
}
|
||||
|
||||
|
@ -3212,12 +3211,12 @@ void FParser::SF_MoveCamera(void)
|
|||
|
||||
cam->radius=8;
|
||||
cam->height=8;
|
||||
if ((x != cam->x || y != cam->y) && !P_TryMove(cam, x, y, true))
|
||||
if ((x != cam->X() || y != cam->Y()) && !P_TryMove(cam, x, y, true))
|
||||
{
|
||||
Printf("Illegal camera move to (%f, %f)\n", x/65536.f, y/65536.f);
|
||||
return;
|
||||
}
|
||||
cam->z = z;
|
||||
cam->SetZ(z);
|
||||
|
||||
t_return.type = svt_int;
|
||||
t_return.value.i = moved;
|
||||
|
@ -3410,13 +3409,10 @@ void FParser::SF_SetObjPosition()
|
|||
|
||||
if (!mobj) return;
|
||||
|
||||
mobj->UnlinkFromWorld();
|
||||
|
||||
mobj->x = intvalue(t_argv[1]) << FRACBITS;
|
||||
if(t_argc >= 3) mobj->y = intvalue(t_argv[2]) << FRACBITS;
|
||||
if(t_argc == 4) mobj->z = intvalue(t_argv[3]) << FRACBITS;
|
||||
|
||||
mobj->LinkToWorld();
|
||||
mobj->SetOrigin(
|
||||
fixedvalue(t_argv[1]),
|
||||
(t_argc >= 3)? fixedvalue(t_argv[2]) : mobj->Y(),
|
||||
(t_argc >= 4)? fixedvalue(t_argv[3]) : mobj->Z(), false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4285,7 +4281,7 @@ void FParser::SF_SpawnShot2(void)
|
|||
|
||||
t_return.type = svt_mobj;
|
||||
|
||||
AActor *mo = Spawn (PClass, source->x, source->y, source->z+z, ALLOW_REPLACE);
|
||||
AActor *mo = Spawn (PClass, source->X(), source->Y(), source->Z()+z, ALLOW_REPLACE);
|
||||
if (mo)
|
||||
{
|
||||
S_Sound (mo, CHAN_VOICE, mo->SeeSound, 1, ATTN_NORM);
|
||||
|
|
|
@ -52,7 +52,6 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Fire)
|
|||
void A_Fire(AActor *self, int height)
|
||||
{
|
||||
AActor *dest;
|
||||
angle_t an;
|
||||
|
||||
dest = self->tracer;
|
||||
if (dest == NULL || self->target == NULL)
|
||||
|
@ -62,11 +61,8 @@ void A_Fire(AActor *self, int height)
|
|||
if (!P_CheckSight (self->target, dest, 0) )
|
||||
return;
|
||||
|
||||
an = dest->angle >> ANGLETOFINESHIFT;
|
||||
|
||||
self->SetOrigin (dest->x + FixedMul (24*FRACUNIT, finecosine[an]),
|
||||
dest->y + FixedMul (24*FRACUNIT, finesine[an]),
|
||||
dest->z + height);
|
||||
fixedvec3 newpos = dest->Vec3Angle(24 * FRACUNIT, dest->angle, height);
|
||||
self->SetOrigin(newpos, true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -86,8 +82,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileTarget)
|
|||
|
||||
A_FaceTarget (self);
|
||||
|
||||
fog = Spawn (fire, self->target->x, self->target->y,
|
||||
self->target->z, ALLOW_REPLACE);
|
||||
fog = Spawn (fire, self->target->X(), self->target->Y(),
|
||||
self->target->Z(), ALLOW_REPLACE);
|
||||
|
||||
self->tracer = fog;
|
||||
fog->target = self;
|
||||
|
@ -117,7 +113,6 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
|
|||
ACTION_PARAM_INT(flags,6);
|
||||
|
||||
AActor *fire, *target;
|
||||
angle_t an;
|
||||
|
||||
if (NULL == (target = self->target))
|
||||
return;
|
||||
|
@ -139,15 +134,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack)
|
|||
|
||||
P_TraceBleed (newdam > 0 ? newdam : dmg, target);
|
||||
|
||||
an = self->angle >> ANGLETOFINESHIFT;
|
||||
fire = self->tracer;
|
||||
|
||||
if (fire != NULL)
|
||||
{
|
||||
// move the fire between the vile and the player
|
||||
fire->SetOrigin (target->x - FixedMul (24*FRACUNIT, finecosine[an]),
|
||||
target->y - FixedMul (24*FRACUNIT, finesine[an]),
|
||||
target->z);
|
||||
fixedvec3 pos = target->Vec3Angle(-24 * FRACUNIT, self->angle, target->Z());
|
||||
fire->SetOrigin (pos, true);
|
||||
|
||||
P_RadiusAttack (fire, self, blastdmg, blastrad, dmgtype, 0);
|
||||
}
|
||||
|
|
|
@ -340,7 +340,7 @@ void P_PlayerOnSpecial3DFloor(player_t* player)
|
|||
{
|
||||
//Water and DEATH FOG!!! heh
|
||||
if (player->mo->Z() > rover->top.plane->ZatPoint(player->mo) ||
|
||||
(player->mo->Z() + player->mo->height) < rover->bottom.plane->ZatPoint(player->mo))
|
||||
player->mo->Top() < rover->bottom.plane->ZatPoint(player->mo))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -4158,7 +4158,7 @@ bool DLevelScript::DoCheckActorTexture(int tid, AActor *activator, int string, b
|
|||
}
|
||||
else
|
||||
{
|
||||
fixed_t z = actor->Z() + actor->height;
|
||||
fixed_t z = actor->Top();
|
||||
// Looking through planes from bottom to top
|
||||
for (i = numff-1; i >= 0; --i)
|
||||
{
|
||||
|
|
|
@ -243,9 +243,9 @@ bool AActor::CheckMeleeRange ()
|
|||
// [RH] Don't melee things too far above or below actor.
|
||||
if (!(flags5 & MF5_NOVERTICALMELEERANGE))
|
||||
{
|
||||
if (pl->Z() > Z() + height)
|
||||
if (pl->Z() > Top())
|
||||
return false;
|
||||
if (pl->Z() + pl->height < Z())
|
||||
if (pl->Top() < Z())
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -280,11 +280,11 @@ bool P_CheckMeleeRange2 (AActor *actor)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
if (mo->Z() > actor->Z()+actor->height)
|
||||
if (mo->Z() > actor->Top())
|
||||
{ // Target is higher than the attacker
|
||||
return false;
|
||||
}
|
||||
else if (actor->Z() > mo->Z()+mo->height)
|
||||
else if (actor->Z() > mo->Top())
|
||||
{ // Attacker is higher
|
||||
return false;
|
||||
}
|
||||
|
@ -2787,7 +2787,7 @@ void A_Face (AActor *self, AActor *other, angle_t max_turn, angle_t max_pitch, a
|
|||
|
||||
// If the target z is above the target's head, reposition to the middle of
|
||||
// its body.
|
||||
if (target_z >= other->Z() + other->height)
|
||||
if (target_z >= other->Top())
|
||||
{
|
||||
target_z = other->Z() + (other->height / 2);
|
||||
}
|
||||
|
@ -2918,8 +2918,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_MonsterRail)
|
|||
{
|
||||
// We probably won't hit the target, but aim at it anyway so we don't look stupid.
|
||||
TVector2<double> xydiff = self->Vec2To(self->target);
|
||||
double zdiff = (self->target->Z() + (self->target->height>>1)) -
|
||||
(self->Z() + (self->height>>1) - self->floorclip);
|
||||
double zdiff = FIXED2DBL((self->target->Z() + (self->target->height>>1)) - (self->Z() + (self->height>>1) - self->floorclip));
|
||||
self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI);
|
||||
}
|
||||
|
||||
|
|
|
@ -3107,7 +3107,7 @@ FUNC(LS_GlassBreak)
|
|||
{
|
||||
glass = Spawn("GlassJunk", x, y, ONFLOORZ, ALLOW_REPLACE);
|
||||
|
||||
glass->SetZ(glass->z + 24 * FRACUNIT);
|
||||
glass->SetZ(glass->Z() + 24 * FRACUNIT);
|
||||
glass->SetState (glass->SpawnState + (pr_glass() % glass->health));
|
||||
an = pr_glass() << (32-8);
|
||||
glass->angle = an;
|
||||
|
|
|
@ -190,7 +190,7 @@ static bool PIT_FindFloorCeiling(line_t *ld, const FBoundingBox &box, FCheckPosi
|
|||
}
|
||||
else if (r >= (1 << 24))
|
||||
{
|
||||
P_LineOpening(open, tmf.thing, ld, sx = ld->v2->x, sy = ld->v2->y, tmf.thing->x, tmf.thing->y, flags);
|
||||
P_LineOpening(open, tmf.thing, ld, sx = ld->v2->x, sy = ld->v2->y, tmf.thing->X(), tmf.thing->Y(), flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -288,9 +288,9 @@ void P_FindFloorCeiling(AActor *actor, int flags)
|
|||
FCheckPosition tmf;
|
||||
|
||||
tmf.thing = actor;
|
||||
tmf.x = actor->x;
|
||||
tmf.y = actor->y;
|
||||
tmf.z = actor->z;
|
||||
tmf.x = actor->X();
|
||||
tmf.y = actor->Y();
|
||||
tmf.z = actor->Z();
|
||||
|
||||
if (flags & FFCF_ONLYSPAWNPOS)
|
||||
{
|
||||
|
@ -336,7 +336,7 @@ void P_FindFloorCeiling(AActor *actor, int flags)
|
|||
|
||||
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
|
||||
|
||||
if (!(flags & FFCF_ONLYSPAWNPOS) || (tmf.abovemidtex && (tmf.floorz <= actor->z)))
|
||||
if (!(flags & FFCF_ONLYSPAWNPOS) || (tmf.abovemidtex && (tmf.floorz <= actor->Z())))
|
||||
{
|
||||
actor->floorz = tmf.floorz;
|
||||
actor->dropoffz = tmf.dropoffz;
|
||||
|
@ -404,13 +404,13 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
|
|||
line_t *ld;
|
||||
|
||||
// P_LineOpening requires the thing's z to be the destination z in order to work.
|
||||
fixed_t savedz = thing->z;
|
||||
thing->z = z;
|
||||
fixed_t savedz = thing->Z();
|
||||
thing->SetZ(z);
|
||||
while ((ld = it.Next()))
|
||||
{
|
||||
PIT_FindFloorCeiling(ld, box, tmf, 0);
|
||||
}
|
||||
thing->z = savedz;
|
||||
thing->SetZ(savedz);
|
||||
|
||||
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
|
||||
|
||||
|
@ -427,7 +427,7 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
|
|||
continue;
|
||||
|
||||
fixed_t blockdist = th->radius + tmf.thing->radius;
|
||||
if (abs(th->x - tmf.x) >= blockdist || abs(th->y - tmf.y) >= blockdist)
|
||||
if (abs(th->X() - tmf.x) >= blockdist || abs(th->Y() - tmf.y) >= blockdist)
|
||||
continue;
|
||||
|
||||
// [RH] Z-Check
|
||||
|
@ -437,8 +437,8 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
|
|||
{
|
||||
if (!(th->flags3 & thing->flags3 & MF3_DONTOVERLAP))
|
||||
{
|
||||
if (z > th->z + th->height || // overhead
|
||||
z + thing->height < th->z) // underneath
|
||||
if (z > th->Top() || // overhead
|
||||
z + thing->height < th->Z()) // underneath
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -459,7 +459,7 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
|
|||
if (modifyactor)
|
||||
{
|
||||
// the move is ok, so link the thing into its new position
|
||||
thing->SetOrigin(x, y, z);
|
||||
thing->SetOrigin(x, y, z, false);
|
||||
thing->floorz = tmf.floorz;
|
||||
thing->ceilingz = tmf.ceilingz;
|
||||
thing->floorsector = tmf.floorsector;
|
||||
|
@ -507,7 +507,7 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
|
|||
void P_PlayerStartStomp(AActor *actor)
|
||||
{
|
||||
AActor *th;
|
||||
FBlockThingsIterator it(FBoundingBox(actor->x, actor->y, actor->radius));
|
||||
FBlockThingsIterator it(FBoundingBox(actor->X(), actor->Y(), actor->radius));
|
||||
|
||||
while ((th = it.Next()))
|
||||
{
|
||||
|
@ -525,9 +525,9 @@ void P_PlayerStartStomp(AActor *actor)
|
|||
if (th->player == NULL && !(th->flags3 & MF3_ISMONSTER))
|
||||
continue;
|
||||
|
||||
if (actor->z > th->z + th->height)
|
||||
if (actor->Z() > th->Top())
|
||||
continue; // overhead
|
||||
if (actor->z + actor->height < th->z)
|
||||
if (actor->Top() < th->Z())
|
||||
continue; // underneath
|
||||
|
||||
P_DamageMobj(th, actor, actor, TELEFRAG_DAMAGE, NAME_Telefrag);
|
||||
|
|
|
@ -500,6 +500,11 @@ struct secspecial_t
|
|||
short leakydamage; // chance of leaking through radiation suit
|
||||
int Flags;
|
||||
|
||||
secspecial_t()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
memset(this, 0, sizeof(*this));
|
||||
|
|
Loading…
Reference in a new issue