diff --git a/source/games/blood/src/blood.cpp b/source/games/blood/src/blood.cpp index f9e0fc260..7bdd87ea5 100644 --- a/source/games/blood/src/blood.cpp +++ b/source/games/blood/src/blood.cpp @@ -856,4 +856,19 @@ DEFINE_SCRIPTED_PROPERTY(gibtype, III, BloodDudeBase) } +// store all data in a single array. +TArray preloadseqs; // this is only useful for sequence IDs. + +DEFINE_PROPERTY(preloadseq, iiiiiiiiiiiiiiii, BloodActor) +{ + auto start = preloadseqs.Reserve(PROP_PARM_COUNT); + for (int i = 0; i < PROP_PARM_COUNT; i++) + { + PROP_INT_PARM(v3, i); + preloadseqs[start + i] = v3; + } + info->ActorInfo()->FirstAction = start; + info->ActorInfo()->NumActions = PROP_PARM_COUNT; +} + END_BLD_NS diff --git a/source/games/blood/src/preload.cpp b/source/games/blood/src/preload.cpp index d2e60ffa0..f20f0952e 100644 --- a/source/games/blood/src/preload.cpp +++ b/source/games/blood/src/preload.cpp @@ -1,25 +1,20 @@ -//------------------------------------------------------------------------- /* -Copyright (C) 2010-2019 EDuke32 developers and contributors -Copyright (C) 2019 Nuke.YKT - -This file is part of NBlood. - -NBlood is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ -//------------------------------------------------------------------------- + * Copyright (C) 2018, 2022 nukeykt + * Copyright (C) 2020-2023 Christoph Oelckers + * + * This file is part of Raze + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ #include "ns.h" // Must come before everything else! #include "build.h" @@ -30,8 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_BLD_NS -int nPrecacheCount; - void fxPrecache(); void gibPrecache(); @@ -48,18 +41,10 @@ void tilePrecacheTile(FTextureID nTex, int nType, int palette) if (!nTex.isValid()) return; switch (GetExtInfo(nTex).picanm.extra & 7) { - case 0: - n = 1; - break; - case 1: - n = 5; - break; - case 2: - n = 8; - break; - case 3: - n = 2; - break; + case 1: n = 5; break; + case 2: n = 8; break; + case 3: n = 2; break; + default: break; } while (n--) { @@ -75,88 +60,49 @@ void tilePrecacheTile(FTextureID nTex, int nType, int palette) // //--------------------------------------------------------------------------- +extern TArray preloadseqs; // this is only useful for sequence IDs. + + void PrecacheDude(DBloodActor* actor) { + auto cls = actor->GetClass(); + auto seqname = actor->seqStartName(); + int seqstart = actor->seqStartID(); int palette = actor->spr.pal; - seqPrecacheId(actor->seqStartName(), actor->seqStartID(), palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 5, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 1, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 2, palette); - switch (actor->GetType()) + if (seqname == NAME_None) { - case kDudeCultistTommy: - case kDudeCultistShotgun: - case kDudeCultistTesla: - case kDudeCultistTNT: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 13, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 14, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 15, palette); - break; - case kDudeZombieButcher: - case kDudeGillBeast: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 10, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 11, palette); - break; - case kDudeGargoyleStatueFlesh: - case kDudeGargoyleStatueStone: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); //??? - [[fallthrough]]; - case kDudeGargoyleFlesh: - case kDudeGargoyleStone: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette); - break; - case kDudePhantasm: - case kDudeHellHound: - case kDudeSpiderBrown: - case kDudeSpiderRed: - case kDudeSpiderBlack: - case kDudeSpiderMother: - case kDudeTchernobog: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette); - break; - case kDudeCerberusTwoHead: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - [[fallthrough]]; - case kDudeHand: - case kDudeBoneEel: - case kDudeBat: - case kDudeRat: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - break; - case kDudeCultistBeast: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - break; - case kDudeZombieAxeBuried: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 12, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 9, palette); - [[fallthrough]]; - case kDudeZombieAxeLaying: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 10, palette); - [[fallthrough]]; - case kDudeZombieAxeNormal: - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 6, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 7, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 8, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 11, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 13, palette); - seqPrecacheId(actor->seqStartName(), actor->seqStartID() + 14, palette); - break; + if (seqstart > 0) + { + while (cls->IsDescendantOf(BloodDudeBaseClass)) + { + auto firstindex = static_cast(cls)->ActorInfo()->FirstAction; + auto numseqs = static_cast(cls)->ActorInfo()->NumActions; + for (int i = 0; i < numseqs; i++) + { + seqPrecacheId(NAME_None, seqstart + preloadseqs[i], palette); + } + cls = cls->ParentClass; + } + } + } + else + { + auto firstindex = static_cast(cls)->ActorInfo()->FirstAction; + auto numseqs = static_cast(cls)->ActorInfo()->NumActions; + if (numseqs > 0) + { + for (int i = 0; i < numseqs; i++) + { + seqPrecacheId(seqname, preloadseqs[i], palette); + } + } + else + { + for (int i = 0; i < 100; i++) // cache everything with the given name. + { + seqPrecacheId(seqname, i, palette); + } + } } } @@ -168,30 +114,21 @@ void PrecacheDude(DBloodActor* actor) void PrecacheThing(DBloodActor* actor) { + auto cls = actor->GetClass(); + auto seqname = actor->seqStartName(); int palette = actor->spr.pal; - switch (actor->GetType()) { - case kThingGlassWindow: // worthless... - case kThingFluorescent: - seqPrecacheId(12, palette); - break; - case kThingSpiderWeb: - seqPrecacheId(15, palette); - break; - case kThingMetalGrate: - seqPrecacheId(21, palette); - break; - case kThingFlammableTree: - seqPrecacheId(25, palette); - seqPrecacheId(26, palette); - break; - case kTrapMachinegun: - seqPrecacheId(38, palette); - seqPrecacheId(40, palette); - seqPrecacheId(28, palette); - break; - case kThingObjectGib: - //case kThingObjectExplode: weird that only gib object is precached and this one is not - break; + if (seqname == NAME_None) + { + while (cls->IsDescendantOf(BloodThingBaseClass)) + { + auto firstindex = static_cast(cls)->ActorInfo()->FirstAction; + auto numseqs = static_cast(cls)->ActorInfo()->NumActions; + for (int i = 0; i < numseqs; i++) + { + seqPrecacheId(NAME_None, preloadseqs[i], palette); + } + cls = cls->ParentClass; + } } tilePrecacheTile(actor->spr.spritetexture(), -1, palette); } @@ -226,10 +163,10 @@ void PreloadCache() } } - // Precache common SEQs + // On modern systems it makes sense to precache all of the common SEQs unconditionally. for (int i = 0; i < 100; i++) { - seqPrecacheId(i, 0); + seqPrecacheId(NAME_None, i, 0); } tilePrecacheTile(aTexIds[kTexWATERDRIP], -1, 0); // water drip @@ -238,30 +175,19 @@ void PreloadCache() // Player SEQs auto playerdef = static_cast(GetDefaultByType(PClass::FindActor("BloodPlayerBase"))); int seqStartID = playerdef->seqStartID(); - seqPrecacheId(seqStartID + 6, 0); - seqPrecacheId(seqStartID + 7, 0); - seqPrecacheId(seqStartID + 8, 0); - seqPrecacheId(seqStartID + 9, 0); - seqPrecacheId(seqStartID + 10, 0); - seqPrecacheId(seqStartID + 14, 0); - seqPrecacheId(seqStartID + 15, 0); - seqPrecacheId(seqStartID + 12, 0); - seqPrecacheId(seqStartID + 16, 0); - seqPrecacheId(seqStartID + 17, 0); - seqPrecacheId(seqStartID + 18, 0); + seqPrecacheId(NAME_None, seqStartID + 6, 0); + seqPrecacheId(NAME_None, seqStartID + 7, 0); + seqPrecacheId(NAME_None, seqStartID + 8, 0); + seqPrecacheId(NAME_None, seqStartID + 9, 0); + seqPrecacheId(NAME_None, seqStartID + 10, 0); + seqPrecacheId(NAME_None, seqStartID + 14, 0); + seqPrecacheId(NAME_None, seqStartID + 15, 0); + seqPrecacheId(NAME_None, seqStartID + 12, 0); + seqPrecacheId(NAME_None, seqStartID + 16, 0); + seqPrecacheId(NAME_None, seqStartID + 17, 0); + seqPrecacheId(NAME_None, seqStartID + 18, 0); - /* fixme: cache the composite sky. These are useless. - for (auto& sect : sector) - { - if ((sect.ceilingstat & CSTAT_SECTOR_SKY) != 0 && skyTile == -1) - skyTile = sect.ceilingtexture; - } - if (skyTile > -1 && skyTile < kMaxTiles) - { - for (int i = 1; i < gSkyCount; i++) - tilePrecacheTile(skyTile + i, 0, 0); - } - */ + // fixme: this needs to cache the composite sky. WeaponPrecache(); fxPrecache(); diff --git a/source/games/blood/src/seq.h b/source/games/blood/src/seq.h index 646e2da1b..804ef91e6 100644 --- a/source/games/blood/src/seq.h +++ b/source/games/blood/src/seq.h @@ -89,11 +89,6 @@ struct SEQINST void seqPrecacheId(FName name, int id, int palette); -inline void seqPrecacheId(int id, int palette) -{ - seqPrecacheId(NAME_None, id, palette); -} - SEQINST* GetInstance(int a1, EventObject& a2); SEQINST* GetInstance(DBloodActor* actor); diff --git a/wadsrc/static/zscript/games/blood/actors/dudes.zs b/wadsrc/static/zscript/games/blood/actors/dudes.zs index 07d46b151..9b86c7b15 100644 --- a/wadsrc/static/zscript/games/blood/actors/dudes.zs +++ b/wadsrc/static/zscript/games/blood/actors/dudes.zs @@ -363,6 +363,7 @@ class BloodDudeBase : Bloodactor AISTATE "zombieFSearch", "+8", 3, 1800, null, null, aiMoveForward, zombfThinkSearch, "zombieFIdle"; AISTATE "zombieFRecoil", "+5", 5, 0, null, null, null, null, "zombieFChase"; AISTATE "zombieFTeslaRecoil", "+4", 5, 0, null, null, null, null, "zombieFChase"; + preloadseq 0, 1, 2, 5; } override int getRespawnTime() { @@ -436,6 +437,7 @@ class BloodDudeCultistTommy : BloodDudeBase explodesound 717; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9, 13, 14, 15; } } @@ -468,6 +470,7 @@ class BloodDudeCultistShotgun : BloodDudeBase explodesound 717; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9, 13, 14, 15; } } @@ -498,6 +501,7 @@ class BloodDudeZombieAxeNormal : BloodDudeBase gibtype 15, -1, -1; dmgcontrol 256, 256, 112, 256, 256, 256, 160; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 11, 13, 14; } } @@ -528,6 +532,7 @@ class BloodDudeZombieButcher : BloodDudeBase gibtype 15, -1, -1; dmgcontrol 256, 256, 32, 128, 256, 64, 128; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9, 10, 11; } } @@ -558,6 +563,7 @@ class BloodDudeZombieAxeBuried : BloodDudeBase gibtype 15, -1, -1; dmgcontrol 256, 256, 112, 256, 256, 256, 256; +BloodDudeBase.floorhitdamage; + preloadseq 12, 9, 10; } } @@ -588,6 +594,7 @@ class BloodDudeGargoyleFlesh : BloodDudeBase gibtype 30, -1, -1; dmgcontrol 0, 128, 48, 208, 256, 256, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9; } } @@ -618,6 +625,7 @@ class BloodDudeGargoyleStone : BloodDudeBase gibtype 19, -1, -1; dmgcontrol 0, 0, 10, 10, 0, 128, 64; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9; } } @@ -645,6 +653,7 @@ class BloodDudeGargoyleStatueFlesh : BloodDudeBase backspeed 0; turnrange 0; gibtype -1, -1, -1; + preloadseq 6, 7, 8, 9; } } @@ -672,6 +681,7 @@ class BloodDudeGargoyleStatueStone : BloodDudeBase backspeed 0; turnrange 0; gibtype -1, -1, -1; + preloadseq 6, 7, 8, 9; } } @@ -701,6 +711,7 @@ class BloodDudePhantasm : BloodDudeBase gibtype -1, -1, -1; dmgcontrol 0, 0, 48, 0, 0, 16, 0; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -729,6 +740,7 @@ class BloodDudeHellHound : BloodDudeBase gibtype 29, -1, -1; dmgcontrol 48, 0, 48, 48, 256, 128, 192; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -757,6 +769,7 @@ class BloodDudeHand : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 64, 256, 256, 256, 0, 64, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -786,6 +799,7 @@ class BloodDudeSpiderBrown : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 64, 256, 256, 96, 256, 64, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -815,6 +829,7 @@ class BloodDudeSpiderRed : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 64, 128, 256, 96, 256, 64, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -844,6 +859,7 @@ class BloodDudeSpiderBlack : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 128, 256, 256, 96, 256, 64, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -872,6 +888,7 @@ class BloodDudeSpiderMother : BloodDudeBase turnrange 67.5; gibtype 7, -1, -1; dmgcontrol 32, 16, 16, 16, 32, 32, 32; + preloadseq 6, 7, 8; } } @@ -902,6 +919,7 @@ class BloodDudeGillBeast : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 48, 80, 64, 128, 0, 128, 48; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8, 9, 10, 11; } } @@ -930,6 +948,7 @@ class BloodDudeBoneEel : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 256, 256, 256, 256, 0, 256, 192; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -958,6 +977,7 @@ class BloodDudeBat : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 256, 256, 256, 256, 256, 64, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -986,6 +1006,7 @@ class BloodDudeRat : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 256, 256, 256, 256, 256, 128, 256; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -1174,6 +1195,7 @@ class BloodDudeCerberusTwoHead : BloodDudeBase dmgcontrol 16, 0, 16, 16, 0, 96, 48; deathMorphType "BloodDudeCerberusOneHead"; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -1202,6 +1224,7 @@ class BloodDudeCerberusOneHead : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 16, 0, 16, 16, 0, 96, 48; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7; } } @@ -1230,6 +1253,7 @@ class BloodDudeTchernobog : BloodDudeBase gibtype 7, -1, -1; dmgcontrol 3, 1, 4, 4, 0, 4, 3; +BloodDudeBase.floorhitdamage; + preloadseq 6, 7, 8; } } @@ -1464,6 +1488,7 @@ class BloodDudeZombieAxeLaying : BloodDudeBase turnrange 67.5; gibtype 15, -1, -1; dmgcontrol 256, 256, 112, 256, 256, 256, 256; + preloadseq 10; } } @@ -1555,6 +1580,7 @@ class BloodDudeCultistTesla : BloodDudeBase dmgcontrol 256, 256, 96, 160, 256, 256, 12; explodesound 717; + preloadseq 6, 7, 8, 9, 13, 14, 15; } } @@ -1586,6 +1612,7 @@ class BloodDudeCultistTNT : BloodDudeBase dmgcontrol 256, 160, 96, 64, 256, 256, 256; explodesound 717; + preloadseq 6, 7, 8, 9, 13, 14, 15; } } @@ -1617,6 +1644,7 @@ class BloodDudeCultistBeast : BloodDudeBase dmgcontrol 128, 128, 16, 16, 0, 64, 48; explodesound 717; + preloadseq 6, 7; } }