From c880b26d985ced8c15d22a6511516df736ad619a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 20 Jan 2017 01:11:36 +0100 Subject: [PATCH] - scriptified MorphProjectile and CustomSprite. This should for now conclude actor class scriptification. The remaining ten classes with the exception of MorphedMonster are all too essential or too closely tied to engine feature so they should remain native. --- src/g_shared/a_morph.cpp | 61 +++++-------------- src/g_shared/a_sharedglobal.h | 39 ------------ src/gl/scene/gl_sprite.cpp | 4 +- src/namedef.h | 3 + src/p_buildmap.cpp | 42 ------------- src/r_defs.h | 14 ----- src/scripting/thingdef_data.cpp | 2 + src/scripting/thingdef_properties.cpp | 24 ++++---- wadsrc/static/zscript/actor.txt | 1 + wadsrc/static/zscript/inventory/inventory.txt | 1 + wadsrc/static/zscript/shared/morph.txt | 23 +++++-- wadsrc/static/zscript/shared/sharedmisc.txt | 29 ++++++++- 12 files changed, 83 insertions(+), 160 deletions(-) diff --git a/src/g_shared/a_morph.cpp b/src/g_shared/a_morph.cpp index 68309d8cc7..c8220af5a9 100644 --- a/src/g_shared/a_morph.cpp +++ b/src/g_shared/a_morph.cpp @@ -157,13 +157,13 @@ bool P_MorphPlayer (player_t *activator, player_t *p, PClassPlayerPawn *spawntyp DEFINE_ACTION_FUNCTION(_PlayerInfo, MorphPlayer) { PARAM_SELF_STRUCT_PROLOGUE(player_t); - PARAM_POINTER(victim, player_t); + PARAM_POINTER(activator, player_t); PARAM_CLASS(spawntype, APlayerPawn); PARAM_INT(duration); PARAM_INT(style); PARAM_CLASS_DEF(enter_flash, AActor); PARAM_CLASS_DEF(exit_flash, AActor); - ACTION_RETURN_BOOL(P_MorphPlayer(self, victim, spawntype, duration, style, enter_flash, exit_flash)); + ACTION_RETURN_BOOL(P_MorphPlayer(activator, self, spawntype, duration, style, enter_flash, exit_flash)); } //---------------------------------------------------------------------------- @@ -396,7 +396,7 @@ bool P_MorphMonster (AActor *actor, PClassActor *spawntype, int duration, int st if (actor == NULL || actor->player || spawntype == NULL || actor->flags3 & MF3_DONTMORPH || !(actor->flags3 & MF3_ISMONSTER) || - !spawntype->IsDescendantOf (RUNTIME_CLASS(AMorphedMonster))) + !spawntype->IsDescendantOf (PClass::FindActor(NAME_MorphedMonster))) { return false; } @@ -440,6 +440,17 @@ bool P_MorphMonster (AActor *actor, PClassActor *spawntype, int duration, int st return true; } +DEFINE_ACTION_FUNCTION(AActor, MorphMonster) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_CLASS(spawntype, APlayerPawn); + PARAM_INT(duration); + PARAM_INT(style); + PARAM_CLASS_DEF(enter_flash, AActor); + PARAM_CLASS_DEF(exit_flash, AActor); + ACTION_RETURN_BOOL(P_MorphMonster(self, spawntype, duration, style, enter_flash, exit_flash)); +} + //---------------------------------------------------------------------------- // // FUNC P_UndoMonsterMorph @@ -635,50 +646,6 @@ void InitAllPowerupEffects(AInventory *item) } } -// Base class for morphing projectiles -------------------------------------- - -IMPLEMENT_CLASS(AMorphProjectile, false, true) - -IMPLEMENT_POINTERS_START(AMorphProjectile) - IMPLEMENT_POINTER(PlayerClass) - IMPLEMENT_POINTER(MonsterClass) - IMPLEMENT_POINTER(MorphFlash) - IMPLEMENT_POINTER(UnMorphFlash) -IMPLEMENT_POINTERS_END - -DEFINE_FIELD(AMorphProjectile, PlayerClass) -DEFINE_FIELD(AMorphProjectile, MonsterClass) -DEFINE_FIELD(AMorphProjectile, MorphFlash) -DEFINE_FIELD(AMorphProjectile, UnMorphFlash) -DEFINE_FIELD(AMorphProjectile, Duration) -DEFINE_FIELD(AMorphProjectile, MorphStyle) - -int AMorphProjectile::DoSpecialDamage (AActor *target, int damage, FName damagetype) -{ - if (target->player) - { - P_MorphPlayer (NULL, target->player, PlayerClass, Duration, MorphStyle, MorphFlash, UnMorphFlash); - } - else - { - P_MorphMonster (target, MonsterClass, Duration, MorphStyle, MorphFlash, UnMorphFlash); - } - return -1; -} - -void AMorphProjectile::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - auto def = (AMorphProjectile*)GetDefault(); - arc("playerclass", PlayerClass, def->PlayerClass) - ("monsterclass", MonsterClass, def->MonsterClass) - ("duration", Duration, def->Duration) - ("morphstyle", MorphStyle, def->MorphStyle) - ("morphflash", MorphFlash, def->MorphFlash) - ("unmorphflash", UnMorphFlash, def->UnMorphFlash); -} - - // Morphed Monster (you must subclass this to do something useful) --------- IMPLEMENT_CLASS(AMorphedMonster, false, true) diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index bee819dd02..c9d0d86cef 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -76,31 +76,6 @@ private: DImpactDecal(); }; -class ASkyViewpoint : public AActor -{ - DECLARE_CLASS (ASkyViewpoint, AActor) -public: - void BeginPlay (); - void OnDestroy() override; -}; - -// For an EE compatible linedef based definition. -class ASkyCamCompat : public ASkyViewpoint -{ - DECLARE_CLASS (ASkyCamCompat, ASkyViewpoint) - -public: - void BeginPlay(); -}; - - -class AStackPoint : public ASkyViewpoint -{ - DECLARE_CLASS (AStackPoint, ASkyViewpoint) -public: - void BeginPlay (); -}; - class DFlashFader : public DThinker { DECLARE_CLASS (DFlashFader, DThinker) @@ -177,20 +152,6 @@ private: DEarthquake (); }; -class AMorphProjectile : public AActor -{ - DECLARE_CLASS (AMorphProjectile, AActor) - HAS_OBJECT_POINTERS; -public: - int DoSpecialDamage (AActor *target, int damage, FName damagetype); - - void Serialize(FSerializer &arc); - - PClassPlayerPawn *PlayerClass; - PClassActor *MonsterClass, *MorphFlash, *UnMorphFlash; - int Duration, MorphStyle; -}; - class AMorphedMonster : public AActor { DECLARE_CLASS (AMorphedMonster, AActor) diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 198dfea6e3..92416f88bd 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -779,8 +779,10 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) vt = gltexture->GetSpriteVT(); vb = gltexture->GetSpriteVB(); + if (thing->renderflags & RF_YFLIP) std::swap(vt, vb); + gltexture->GetSpriteRect(&r); - if (mirror) + if (mirror ^ !!(thing->renderflags & RF_XFLIP)) { r.left = -r.width - r.left; // mirror the sprite's x-offset ul = gltexture->GetSpriteUL(); diff --git a/src/namedef.h b/src/namedef.h index cc393ffaf6..731947da70 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -726,8 +726,11 @@ xx(MoveBob) xx(StillBob) xx(WBobSpeed) xx(PlayerClass) +xx(MonsterClass) +xx(MorphedMonster) xx(Wi_NoAutostartMap) +xx(Duration) xx(MorphStyle) xx(MorphFlash) xx(UnMorphFlash) diff --git a/src/p_buildmap.cpp b/src/p_buildmap.cpp index 3a1943fc87..3d1e77d6da 100644 --- a/src/p_buildmap.cpp +++ b/src/p_buildmap.cpp @@ -854,45 +854,3 @@ static void Decrypt (void *to_, const void *from_, int len, int key) } #endif -//========================================================================== -// -// Just an actor to make the Build sprites show up. It doesn't do anything -// with them other than display them. -// -//========================================================================== - -class ACustomSprite : public AActor -{ - DECLARE_CLASS (ACustomSprite, AActor); -public: - void BeginPlay (); -}; - -IMPLEMENT_CLASS(ACustomSprite, false, false) - -void ACustomSprite::BeginPlay () -{ - char name[9]; - Super::BeginPlay (); - - mysnprintf (name, countof(name), "BTIL%04d", args[0] & 0xffff); - picnum = TexMan.GetTexture (name, FTexture::TEX_Build); - - Scale.X = args[2] / 64.; - Scale.Y = args[3] / 64.; - - int cstat = args[4]; - if (cstat & 2) - { - RenderStyle = STYLE_Translucent; - Alpha = (cstat & 512) ? 0.6666 : 0.3333; - } - if (cstat & 4) - renderflags |= RF_XFLIP; - if (cstat & 8) - renderflags |= RF_YFLIP; - - // set face/wall/floor flags - renderflags |= ActorRenderFlags::FromInt (((cstat >> 4) & 3) << 12); -} - diff --git a/src/r_defs.h b/src/r_defs.h index a6e8358ee0..3c38f285dd 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -278,20 +278,6 @@ enum SECSPAC_HitFakeFloor= 1024, // Trigger when player hits fake floor }; -class ASectorAction : public AActor -{ - DECLARE_CLASS (ASectorAction, AActor) -public: - void OnDestroy() override; - void BeginPlay (); - void Activate (AActor *source); - void Deactivate (AActor *source); - bool CanTrigger (AActor *triggerer) const; - virtual bool DoTriggerAction(AActor *triggerer, int activationType); -protected: - bool CheckTrigger(AActor *triggerer) const; -}; - struct secplane_t { // the plane is defined as a*x + b*y + c*z + d = 0 diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 56209e1144..21e4f46d96 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -324,6 +324,8 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(RF, MASKROTATION, AActor, renderflags), DEFINE_FLAG(RF, ABSMASKANGLE, AActor, renderflags), DEFINE_FLAG(RF, ABSMASKPITCH, AActor, renderflags), + DEFINE_FLAG(RF, XFLIP, AActor, renderflags), + DEFINE_FLAG(RF, YFLIP, AActor, renderflags), // Bounce flags DEFINE_FLAG2(BOUNCE_Walls, BOUNCEONWALLS, AActor, BounceFlags), diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index 11e5dc96d3..807bd2a93f 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -2780,55 +2780,55 @@ DEFINE_CLASS_PROPERTY_PREFIX(player, viewbob, F, PlayerPawn) //========================================================================== // (non-fatal with non-existent types only in DECORATE) //========================================================================== -DEFINE_CLASS_PROPERTY(playerclass, S, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(playerclass, S, MorphProjectile) { PROP_STRING_PARM(str, 0); - defaults->PlayerClass = FindClassTentativePlayerPawn(str, bag.fromDecorate); + defaults->PointerVar(NAME_PlayerClass) = FindClassTentativePlayerPawn(str, bag.fromDecorate); } //========================================================================== // (non-fatal with non-existent types only in DECORATE) //========================================================================== -DEFINE_CLASS_PROPERTY(monsterclass, S, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(monsterclass, S, MorphProjectile) { PROP_STRING_PARM(str, 0); - defaults->MonsterClass = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); + defaults->PointerVar(NAME_MonsterClass) = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); } //========================================================================== // //========================================================================== -DEFINE_CLASS_PROPERTY(duration, I, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(duration, I, MorphProjectile) { PROP_INT_PARM(i, 0); - defaults->Duration = i >= 0 ? i : -i*TICRATE; + defaults->IntVar(NAME_Duration) = i >= 0 ? i : -i*TICRATE; } //========================================================================== // //========================================================================== -DEFINE_CLASS_PROPERTY(morphstyle, M, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(morphstyle, M, MorphProjectile) { PROP_INT_PARM(i, 0); - defaults->MorphStyle = i; + defaults->IntVar(NAME_MorphStyle) = i; } //========================================================================== // (non-fatal with non-existent types only in DECORATE) //========================================================================== -DEFINE_CLASS_PROPERTY(morphflash, S, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(morphflash, S, MorphProjectile) { PROP_STRING_PARM(str, 0); - defaults->MorphFlash = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); + defaults->PointerVar(NAME_MorphFlash) = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); } //========================================================================== // //========================================================================== -DEFINE_CLASS_PROPERTY(unmorphflash, S, MorphProjectile) +DEFINE_SCRIPTED_PROPERTY(unmorphflash, S, MorphProjectile) { PROP_STRING_PARM(str, 0); - defaults->UnMorphFlash = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); + defaults->PointerVar(NAME_UnMorphFlash) = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); } //========================================================================== diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index 9ae0126ebf..7df019fc37 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -497,6 +497,7 @@ class Actor : Thinker native native bool GiveAmmo (Class type, int amount); native bool UsePuzzleItem(int PuzzleItemType); native float AccuracyFactor(); + native bool MorphMonster (Class spawntype, int duration, int style, Class enter_flash, Class exit_flash); // DECORATE compatible functions native int CountInv(class itemtype, int ptr_select = AAPTR_DEFAULT); diff --git a/wadsrc/static/zscript/inventory/inventory.txt b/wadsrc/static/zscript/inventory/inventory.txt index 0a193978c6..da915f1704 100644 --- a/wadsrc/static/zscript/inventory/inventory.txt +++ b/wadsrc/static/zscript/inventory/inventory.txt @@ -65,6 +65,7 @@ class Inventory : Actor native Stop; } + //=========================================================================== // // AInventory :: BeginPlay diff --git a/wadsrc/static/zscript/shared/morph.txt b/wadsrc/static/zscript/shared/morph.txt index c5c2cbe0a7..149cf3ceaa 100644 --- a/wadsrc/static/zscript/shared/morph.txt +++ b/wadsrc/static/zscript/shared/morph.txt @@ -1,9 +1,9 @@ -class MorphProjectile : Actor native +class MorphProjectile : Actor { - native Class PlayerClass; - native Class MonsterClass, MorphFlash, UnMorphFlash; - native int Duration, MorphStyle; + Class PlayerClass; + Class MonsterClass, MorphFlash, UnMorphFlash; + int Duration, MorphStyle; Default { @@ -12,6 +12,21 @@ class MorphProjectile : Actor native -ACTIVATEIMPACT -ACTIVATEPCROSS } + + override int DoSpecialDamage (Actor target, int damage, Name damagetype) + { + if (target.player) + { + target.player.MorphPlayer (NULL, PlayerClass, Duration, MorphStyle, MorphFlash, UnMorphFlash); + } + else + { + target.MorphMonster (MonsterClass, Duration, MorphStyle, MorphFlash, UnMorphFlash); + } + return -1; + } + + } class MorphedMonster : Actor native diff --git a/wadsrc/static/zscript/shared/sharedmisc.txt b/wadsrc/static/zscript/shared/sharedmisc.txt index 812718d302..bc410e3f0e 100644 --- a/wadsrc/static/zscript/shared/sharedmisc.txt +++ b/wadsrc/static/zscript/shared/sharedmisc.txt @@ -140,7 +140,7 @@ class Gibs : RealGibs // Needed for loading Build maps ------------------------------------------- -class CustomSprite : Actor native +class CustomSprite : Actor { Default { @@ -153,6 +153,33 @@ class CustomSprite : Actor native TNT1 A -1; Stop; } + + override void BeginPlay () + { + String name; + Super.BeginPlay (); + + format(name, "BTIL%04d", args[0] & 0xffff); + picnum = TexMan.CheckForTexture (name, TexMan.TYPE_Build); + if (!picnum.Exists()) + { + Destroy(); + return; + } + + Scale.X = args[2] / 64.; + Scale.Y = args[3] / 64.; + + int cstat = args[4]; + if (cstat & 2) + { + A_SetRenderStyle((cstat & 512) ? 0.6666 : 0.3333, STYLE_Translucent); + } + if (cstat & 4) bXFlip = true; + if (cstat & 8) bYFlip = true; + if (cstat & 16) bWallSprite = true; + if (cstat & 32) bFlatSprite = true; + } } // SwitchableDecoration: Activate and Deactivate change state --------------