From 3358181f18ec057793ff88a878bdc3f0b59b580a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 10 Feb 2016 00:46:51 +0100 Subject: [PATCH] - cleaned up the class data organization: * moved RestrictedToPlayerClass and ForbiddenToPlayerClass arrays to AInventory. * moved all copy-from-parent code into DeriveData functions. --- src/g_shared/a_pickups.cpp | 12 +++++++++++- src/g_shared/a_pickups.h | 2 ++ src/info.cpp | 26 ++++++++++++++++---------- src/info.h | 2 -- src/thingdef/thingdef.cpp | 17 ----------------- src/thingdef/thingdef_properties.cpp | 8 ++++---- 6 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index c19564f78..4a73212aa 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -50,6 +50,16 @@ void PClassInventory::ReplaceClassRef(PClass *oldclass, PClass *newclass) if (def != NULL) { if (def->PickupFlash == oldclass) def->PickupFlash = static_cast(newclass); + for (unsigned i = 0; i < ForbiddenToPlayerClass.Size(); i++) + { + if (ForbiddenToPlayerClass[i] == oldclass) + ForbiddenToPlayerClass[i] = static_cast(newclass); + } + for (unsigned i = 0; i < RestrictedToPlayerClass.Size(); i++) + { + if (RestrictedToPlayerClass[i] == oldclass) + RestrictedToPlayerClass[i] = static_cast(newclass); + } } } @@ -1536,7 +1546,7 @@ bool AInventory::CanPickup (AActor *toucher) if (!toucher) return false; - PClassActor *ai = GetClass(); + PClassInventory *ai = GetClass(); // Is the item restricted to certain player classes? if (ai->RestrictedToPlayerClass.Size() != 0) { diff --git a/src/g_shared/a_pickups.h b/src/g_shared/a_pickups.h index a927f1919..10391e0c8 100644 --- a/src/g_shared/a_pickups.h +++ b/src/g_shared/a_pickups.h @@ -143,6 +143,8 @@ public: FString PickupMessage; int GiveQuest; // Optionally give one of the quest items. FTextureID AltHUDIcon; + TArray RestrictedToPlayerClass; + TArray ForbiddenToPlayerClass; }; class AInventory : public AActor diff --git a/src/info.cpp b/src/info.cpp index c2aff93d4..3a800e2cf 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -275,6 +275,22 @@ void PClassActor::DeriveData(PClass *newclass) newa->MeleeSound = MeleeSound; newa->MissileName = MissileName; newa->MissileHeight = MissileHeight; + + newa->VisibleToPlayerClass = VisibleToPlayerClass; + + if (DamageFactors != NULL) + { + // copy damage factors from parent + newa->DamageFactors = new DmgFactors; + *newa->DamageFactors = *DamageFactors; + } + if (PainChances != NULL) + { + // copy pain chances from parent + newa->PainChances = new PainChanceList; + *newa->PainChances = *PainChances; + } + } //========================================================================== @@ -529,16 +545,6 @@ void PClassActor::ReplaceClassRef(PClass *oldclass, PClass *newclass) if (VisibleToPlayerClass[i] == oldclass) VisibleToPlayerClass[i] = static_cast(newclass); } - for (unsigned i = 0; i < ForbiddenToPlayerClass.Size(); i++) - { - if (ForbiddenToPlayerClass[i] == oldclass) - ForbiddenToPlayerClass[i] = static_cast(newclass); - } - for (unsigned i = 0; i < RestrictedToPlayerClass.Size(); i++) - { - if (RestrictedToPlayerClass[i] == oldclass) - RestrictedToPlayerClass[i] = static_cast(newclass); - } AActor *def = (AActor*)Defaults; if (def != NULL) { diff --git a/src/info.h b/src/info.h index 9014a2f55..460adb0fb 100644 --- a/src/info.h +++ b/src/info.h @@ -237,8 +237,6 @@ public: PainChanceList *PainChances; TArray VisibleToPlayerClass; - TArray RestrictedToPlayerClass; - TArray ForbiddenToPlayerClass; FString Obituary; // Player was killed by this actor FString HitObituary; // Player was killed by this actor in melee diff --git a/src/thingdef/thingdef.cpp b/src/thingdef/thingdef.cpp index 99d46baca..a85f0ea08 100644 --- a/src/thingdef/thingdef.cpp +++ b/src/thingdef/thingdef.cpp @@ -145,23 +145,6 @@ PClassActor *CreateNewActor(const FScriptPosition &sc, FName typeName, FName par ti = static_cast(parent->CreateDerivedClass (typeName, parent->Size)); } - // Copy class lists from parent - ti->ForbiddenToPlayerClass = parent->ForbiddenToPlayerClass; - ti->RestrictedToPlayerClass = parent->RestrictedToPlayerClass; - ti->VisibleToPlayerClass = parent->VisibleToPlayerClass; - - if (parent->DamageFactors != NULL) - { - // copy damage factors from parent - ti->DamageFactors = new DmgFactors; - *ti->DamageFactors = *parent->DamageFactors; - } - if (parent->PainChances != NULL) - { - // copy pain chances from parent - ti->PainChances = new PainChanceList; - *ti->PainChances = *parent->PainChances; - } ti->Replacee = ti->Replacement = NULL; ti->DoomEdNum = -1; return ti; diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index cecdfb172..57de3684f 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -1534,12 +1534,12 @@ DEFINE_PROPERTY(riplevelmax, I, Actor) //========================================================================== DEFINE_CLASS_PROPERTY(restrictedto, Ssssssssssssssssssss, Inventory) { - info->RestrictedToPlayerClass.Clear(); + static_cast(info)->RestrictedToPlayerClass.Clear(); for(int i = 0;i < PROP_PARM_COUNT;++i) { PROP_STRING_PARM(n, i); if (*n != 0) - info->RestrictedToPlayerClass.Push(FindClassTentativePlayerPawn(n)); + static_cast(info)->RestrictedToPlayerClass.Push(FindClassTentativePlayerPawn(n)); } } @@ -1548,12 +1548,12 @@ DEFINE_CLASS_PROPERTY(restrictedto, Ssssssssssssssssssss, Inventory) //========================================================================== DEFINE_CLASS_PROPERTY(forbiddento, Ssssssssssssssssssss, Inventory) { - info->ForbiddenToPlayerClass.Clear(); + static_cast(info)->ForbiddenToPlayerClass.Clear(); for(int i = 0;i < PROP_PARM_COUNT;++i) { PROP_STRING_PARM(n, i); if (*n != 0) - info->ForbiddenToPlayerClass.Push(FindClassTentativePlayerPawn(n)); + static_cast(info)->ForbiddenToPlayerClass.Push(FindClassTentativePlayerPawn(n)); } }