diff --git a/source/core/thingdef_data.cpp b/source/core/thingdef_data.cpp index cb4795388..d38cde2c8 100644 --- a/source/core/thingdef_data.cpp +++ b/source/core/thingdef_data.cpp @@ -188,6 +188,7 @@ static FFlagDef DukeActorFlagDefs[] = DEFINE_FLAG(SFLAG3, DONTENTERWATERONGROUND, DDukeActor, flags3), DEFINE_FLAG(SFLAG3, RANDOMANGLEONWATER, DDukeActor, flags3), DEFINE_FLAG(SFLAG3, NORANDOMANGLEWHENBLOCKED, DDukeActor, flags3), + DEFINE_FLAG(SFLAG3, QUICKALTERANG, DDukeActor, flags3), }; diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index d247b6c6a..6fa5ecaf8 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -3553,7 +3553,7 @@ void alterang(int ang, DDukeActor* actor, int playernum) else goalang = (Owner->spr.pos.XY() - actor->spr.pos.XY()).Angle(); - if (actor->vel.X != 0 && actor->spr.picnum != TILE_DRONE) + if (actor->vel.X != 0 && !(actor->flags3 & SFLAG3_QUICKALTERANG)) { angdif = deltaangle(aang, goalang); diff --git a/source/games/duke/src/animatesprites_d.cpp b/source/games/duke/src/animatesprites_d.cpp index 5f6c732e3..b06d1459a 100644 --- a/source/games/duke/src/animatesprites_d.cpp +++ b/source/games/duke/src/animatesprites_d.cpp @@ -116,7 +116,7 @@ void animatesprites_d(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi continue; } - if (h->spr.picnum == DTILE_APLAYER) + if (h->isPlayer()) { p = h->PlayerIndex(); diff --git a/source/games/duke/src/animatesprites_r.cpp b/source/games/duke/src/animatesprites_r.cpp index cb06a6e7d..5e541f8b3 100644 --- a/source/games/duke/src/animatesprites_r.cpp +++ b/source/games/duke/src/animatesprites_r.cpp @@ -114,7 +114,7 @@ void animatesprites_r(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi continue; } - if (h->spr.picnum == RTILE_APLAYER) + if (h->isPlayer()) { p = h->PlayerIndex(); diff --git a/source/games/duke/src/classnames.h b/source/games/duke/src/classnames.h index 75f10d0be..f262f9693 100644 --- a/source/games/duke/src/classnames.h +++ b/source/games/duke/src/classnames.h @@ -112,3 +112,5 @@ xx(RedneckMoonshine) xx(RedneckTitgun) xx(RedneckTitAmmo) xx(DukeRadiusExplosion) +xx(DukePlayerBase) +xx(DukePlayerPawn) diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index 0964e48c2..0151f7465 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -421,6 +421,7 @@ enum sflags3_t SFLAG3_DONTENTERWATERONGROUND = 0x00080000, SFLAG3_RANDOMANGLEONWATER = 0x00100000, SFLAG3_NORANDOMANGLEWHENBLOCKED = 0x00200000, + SFLAG3_QUICKALTERANG = 0x00400000, }; diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index b4d589cc0..5b1f2ba55 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -136,10 +136,6 @@ void SetDispatcher() } -int TILE_APLAYER; -int TILE_DRONE; -int TILE_WATERBUBBLE; -int TILE_BLOODPOOL; int TILE_CROSSHAIR; END_DUKE_NS diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index a6783668b..82c467ef8 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -57,10 +57,6 @@ void initactorflags_d() gs.weaponsandammosprites[14] = DukeFreezeAmmoClass; gs.firstdebris = DTILE_SCRAP6; - TILE_APLAYER = DTILE_APLAYER; - TILE_DRONE = DTILE_DRONE; - TILE_WATERBUBBLE = DTILE_WATERBUBBLE; - TILE_BLOODPOOL = DTILE_BLOODPOOL; TILE_CROSSHAIR = DTILE_CROSSHAIR; } diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index 167eefea0..8c2557a61 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -50,10 +50,6 @@ void initactorflags_r() gs.weaponsandammosprites[13] = RedneckTitgunClass; gs.weaponsandammosprites[14] = RedneckTitAmmoClass; - TILE_APLAYER = RTILE_APLAYER; - TILE_DRONE = RTILE_DRONE; - TILE_WATERBUBBLE = RTILE_WATERBUBBLE; - TILE_BLOODPOOL = RTILE_BLOODPOOL; TILE_CROSSHAIR = RTILE_CROSSHAIR; gs.firstdebris = RTILE_SCRAP6; diff --git a/source/games/duke/src/inlines.h b/source/games/duke/src/inlines.h index 03b65fe0c..141b60825 100644 --- a/source/games/duke/src/inlines.h +++ b/source/games/duke/src/inlines.h @@ -296,6 +296,12 @@ inline const ActorInfo* DDukeActor::conInfo() const return tn < 0 ? nullptr : &gs.actorinfo[tn]; } +inline bool DDukeActor::isPlayer() const +{ + return IsKindOf(DukePlayerBaseClass); +} + + inline void setPlayerActorViewZOffset(DDukeActor* const pact) { if (!PlayClock) diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index 650720fb4..25d226095 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -291,7 +291,7 @@ void hud_input(int plnum) p->inven_icon = 3; auto pactor = - CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ().plusZ(30), TILE_APLAYER, -64, DVector2(0, 0), p->GetActor()->spr.Angles.Yaw, 0., 0., nullptr, 10); + CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ().plusZ(30), DukePlayerPawnClass, -64, DVector2(0, 0), p->GetActor()->spr.Angles.Yaw, 0., 0., nullptr, 10); pactor->temp_data[3] = pactor->temp_data[4] = 0; p->holoduke_on = pactor; pactor->spr.yint = plnum; diff --git a/source/games/duke/src/names.h b/source/games/duke/src/names.h index d4bb05556..61de8fa87 100644 --- a/source/games/duke/src/names.h +++ b/source/games/duke/src/names.h @@ -3,10 +3,6 @@ BEGIN_DUKE_NS // These are all globally accessed tiles. -extern int TILE_APLAYER; -extern int TILE_DRONE; -extern int TILE_WATERBUBBLE; -extern int TILE_BLOODPOOL; extern int TILE_CROSSHAIR; diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp index e6c3ffe02..4b94d8620 100644 --- a/source/games/duke/src/premap.cpp +++ b/source/games/duke/src/premap.cpp @@ -495,7 +495,7 @@ void resetpspritevars(int g, const DVector3& startpos, const DAngle startang) STATUSBARTYPE tsbar[MAXPLAYERS]; auto newActor = CreateActor(ps[0].cursector, startpos, - TILE_APLAYER, 0, DVector2(0, 0), startang, 0., 0., nullptr, 10); + DukePlayerPawnClass /*fixme for RR later!*/, 0, DVector2(0, 0), startang, 0., 0., nullptr, 10); newActor->spr.Angles.Pitch = DAngle::fromDeg(-17.354); newActor->backuploc(); diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index f22a4e8ef..bafd981d4 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -144,10 +144,7 @@ public: return spr.yint; } - bool isPlayer() const - { - return spr.picnum == TILE_APLAYER; - } + bool isPlayer() const; void Serialize(FSerializer& arc) override; diff --git a/wadsrc/static/zscript/games/duke/actors/mech.zs b/wadsrc/static/zscript/games/duke/actors/mech.zs index 45b9443aa..aca3f30e3 100644 --- a/wadsrc/static/zscript/games/duke/actors/mech.zs +++ b/wadsrc/static/zscript/games/duke/actors/mech.zs @@ -7,6 +7,7 @@ class DukeDrone : DukeActor +KILLCOUNT; +NOWATERDIP; +FLOATING; + +QUICKALTERANG; falladjustz 0; } diff --git a/wadsrc/static/zscript/games/duke/actors/player.zs b/wadsrc/static/zscript/games/duke/actors/player.zs index 2cdedb0c6..b0b50ce36 100644 --- a/wadsrc/static/zscript/games/duke/actors/player.zs +++ b/wadsrc/static/zscript/games/duke/actors/player.zs @@ -1,4 +1,8 @@ -class DukePlayerPawn : DukeActor +class DukePlayerBase : DukeActor +{ +} + +class DukePlayerPawn : DukePlayerBase { default { diff --git a/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs b/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs index c02c1874a..47e66d4bb 100644 --- a/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs +++ b/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs @@ -440,6 +440,7 @@ class RedneckMosquito : DukeActor +KILLCOUNT; +NOWATERDIP; +FLOATING; + +QUICKALTERANG; falladjustz 0; } override void Initialize()