diff --git a/src/actor.h b/src/actor.h index 8d58a5a6a..c449f5229 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1136,6 +1136,7 @@ public: } double projectilepassheight; // height for clipping projectile movement against this actor + SDWORD tics; // state tic counter FState *state; VMFunction *Damage; // For missiles and monster railgun @@ -1153,6 +1154,9 @@ public: int special1; // Special info int special2; // Special info + double specialf1; // With floats we cannot use the int versions for storing position or angle data without reverting to fixed point (which we do not want.) + double specialf2; + int weaponspecial; // Special info for weapons. int health; BYTE movedir; // 0-7 @@ -1290,6 +1294,7 @@ public: void AddToHash (); void RemoveFromHash (); + private: static AActor *TIDHash[128]; static inline int TIDHASH (int key) { return key & 127; } diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 3ac381041..0e9216d80 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1459,9 +1459,9 @@ void FParser::SF_SetCamera(void) angle = t_argc < 2 ? newcamera->Angles.Yaw : floatvalue(t_argv[1]); - newcamera->special1 = newcamera->Angles.Yaw.BAMs(); - newcamera->special2=newcamera->_f_Z(); - newcamera->_f_SetZ(t_argc < 3 ? (newcamera->_f_Z() + (41 << FRACBITS)) : (intvalue(t_argv[2]) << FRACBITS)); + newcamera->specialf1 = newcamera->Angles.Yaw.Degrees; + newcamera->specialf2 = newcamera->Z(); + newcamera->SetZ(t_argc < 3 ? newcamera->Z() + 41 : floatvalue(t_argv[2])); newcamera->Angles.Yaw = angle; if (t_argc < 4) newcamera->Angles.Pitch = 0.; else newcamera->Angles.Pitch = clamp(floatvalue(t_argv[3]), -50., 50.) * (20. / 32.); @@ -1485,8 +1485,8 @@ void FParser::SF_ClearCamera(void) if (cam) { player->camera=player->mo; - cam->Angles.Yaw = ANGLE2DBL(cam->special1); - cam->_f_SetZ(cam->special2); + cam->Angles.Yaw = cam->specialf1; + cam->SetZ(cam->specialf2); } } diff --git a/src/g_hexen/a_clericflame.cpp b/src/g_hexen/a_clericflame.cpp index c99b1fc83..10aff1ca0 100644 --- a/src/g_hexen/a_clericflame.cpp +++ b/src/g_hexen/a_clericflame.cpp @@ -134,8 +134,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile) mo->Angles.Yaw = an; mo->target = self->target; mo->VelFromAngle(FLAMESPEED); - mo->special1 = FLOAT2FIXED(mo->Vel.X); - mo->special2 = FLOAT2FIXED(mo->Vel.Y); + mo->specialf1 = mo->Vel.X; + mo->specialf2 = mo->Vel.Y; mo->tics -= pr_missile()&3; } mo = Spawn ("CircleFlame", BlockingMobj->Vec3Offset( @@ -146,8 +146,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile) mo->Angles.Yaw = an + 180.; mo->target = self->target; mo->VelFromAngle(-FLAMESPEED); - mo->special1 = FLOAT2FIXED(mo->Vel.X); - mo->special2 = FLOAT2FIXED(mo->Vel.Y); + mo->specialf1 = mo->Vel.X; + mo->specialf2 = mo->Vel.Y; mo->tics -= pr_missile()&3; } } @@ -168,7 +168,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameRotate) DAngle an = self->Angles.Yaw + 90.; self->VelFromAngle(an, FLAMEROTSPEED); - self->Vel += DVector2(FIXED2DBL(self->special1), FIXED2DBL(self->special2)); + self->Vel += DVector2(self->specialf1, self->specialf2); self->Angles.Yaw += 6.; return 0; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 22d7c87fc..7d183914e 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -2425,9 +2425,9 @@ void P_ZMovement (AActor *mo, fixed_t oldfloorz) // Hexen yanked all items to the floor, except those being spawned at map start in the air. // Those were kept at their original height. // Do this only if the item was actually spawned by the map above ground to avoid problems. - if (mo->special1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB)) + if (mo->specialf1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB)) { - mo->_f_SetZ(mo->_f_floorz() + mo->special1); + mo->SetZ(mo->floorz + mo->specialf1); } @@ -5123,7 +5123,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) mobj->_f_AddZ(mthing->z); if ((mobj->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB)) { - mobj->special1 = mthing->z; + mobj->specialf1 = FIXED2DBL(mthing->z); } } else if (z == ONCEILINGZ) @@ -5140,7 +5140,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) else mobj->flags &= ~MF_NOGRAVITY; // For Hexen floatbob 'compatibility' we do not really want to alter the floorz. - if (mobj->special1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(ib_compatflags & BCOMPATF_FLOATBOB)) + if (mobj->specialf1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(ib_compatflags & BCOMPATF_FLOATBOB)) { P_FindFloorCeiling(mobj, FFCF_SAMESECTOR | FFCF_ONLY3DFLOORS | FFCF_3DRESTRICT); } diff --git a/src/r_defs.h b/src/r_defs.h index a66575bb2..4e7e1a504 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -281,6 +281,11 @@ struct secplane_t return FixedMul (ic, -d - DMulScale16 (a, ac->_f_X(), b, ac->_f_Y())); } + double ZatPointF(const AActor *ac) const + { + return FIXED2DBL(ZatPoint(ac)); + } + // Returns the value of z at (x,y) if d is equal to dist fixed_t ZatPointDist (fixed_t x, fixed_t y, fixed_t dist) const {