From e23a5095cbb29309c08b6cb862f4822b5247f118 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 8 Dec 2022 19:15:55 +0100 Subject: [PATCH] - moved the other tile info tables of Blood to the texExtInfo array as well. The two fields are easily reusable for the other games so it's a welcome simplification. --- source/core/defparser.cpp | 4 +- source/core/gamestruct.h | 1 - source/core/textures/texinfo.h | 4 +- source/games/blood/src/actor.cpp | 18 ++++----- source/games/blood/src/aiunicult.cpp | 2 +- source/games/blood/src/animatesprite.cpp | 6 +-- source/games/blood/src/blood.cpp | 2 - source/games/blood/src/blood.h | 1 - source/games/blood/src/misc.h | 29 -------------- source/games/blood/src/nnexts.cpp | 12 +++--- source/games/blood/src/seq.cpp | 2 +- source/games/blood/src/tile.cpp | 50 +++++++----------------- 12 files changed, 39 insertions(+), 92 deletions(-) diff --git a/source/core/defparser.cpp b/source/core/defparser.cpp index 69dfc1123..1218e040b 100644 --- a/source/core/defparser.cpp +++ b/source/core/defparser.cpp @@ -228,8 +228,8 @@ void processTileImport(FScanner& sc, const char* cmd, FScriptPosition& pos, Tile if (imp.fn.IsNotEmpty() && tileImportFromTexture(sc, imp.fn, imp.tile, imp.alphacut, imp.istexture) < 0) return; tbuild->tile[imp.tile].extinfo.picanm.sf |= imp.flags; - - gi->SetTileProps(imp.tile, imp.surface, imp.shade); + tbuild->tile[imp.tile].extinfo.surftype = imp.surface; + tbuild->tile[imp.tile].extinfo.tileshade = imp.shade; // This is not quite the same as originally, for two reasons: // 1: Since these are texture properties now, there's no need to clear them. diff --git a/source/core/gamestruct.h b/source/core/gamestruct.h index c2f374ac1..03a51f973 100644 --- a/source/core/gamestruct.h +++ b/source/core/gamestruct.h @@ -110,7 +110,6 @@ struct GameInterface virtual void NewGame(MapRecord* map, int skill, bool special = false) {} virtual void LevelCompleted(MapRecord* map, int skill) {} virtual bool DrawAutomapPlayer(const DVector2& mxy, const DVector2& cpos, const DAngle cang, const DVector2& xydim, const double czoom, double const interpfrac) { return false; } - virtual void SetTileProps(int tile, int surf, int shade) {} virtual DAngle playerPitchMin() { return DAngle::fromDeg(57.375); } virtual DAngle playerPitchMax() { return DAngle::fromDeg(-57.375); } virtual void WarpToCoords(double x, double y, double z, DAngle a) {} diff --git a/source/core/textures/texinfo.h b/source/core/textures/texinfo.h index 2cc890cd8..0841e51b3 100644 --- a/source/core/textures/texinfo.h +++ b/source/core/textures/texinfo.h @@ -58,8 +58,8 @@ struct TileOffs struct TexExtInfo { // TexAnim *texanim // todo: extended texture animation like ZDoom's ANIMDEFS. - uint8_t terrain; // Contents depend on the game, e.g. this holds Blood's surfType. - uint8_t shadeinfo; // Blood's shade.dat + uint8_t surftype; // Contents depend on the game, e.g. this holds Blood's surfType. Other games have hard coded handling for similar effects. + uint8_t tileshade; // Blood's shade.dat int16_t tiletovox; // engine-side voxel index picanm_t picanm; // tile-based animation data. uint32_t flags; // contents are game dependent. diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 5f99029dc..cb6e1e3f1 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -3943,7 +3943,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode) actDamageSprite(missileOwner, actorHit, kDamageBullet, nDamage); } - if (tprops[actorHit->spr.spritetexture()].surfType == kSurfFlesh) + if (GetExtInfo(actorHit->spr.spritetexture()).surftype == kSurfFlesh) { missileActor->spr.picnum = 2123; missileActor->SetTarget(actorHit); @@ -4109,7 +4109,7 @@ static void actTouchFloor(DBloodActor* actor, sectortype* pSector) actDamageSprite(actor, actor, nDamageType, Scale(4, nDamage, 120) << 4); } - if (tprops[pSector->floortexture()].surfType == kSurfLava) + if (GetExtInfo(pSector->floortexture()).surftype == kSurfLava) { actDamageSprite(actor, actor, kDamageBurn, 16); sfxPlay3DSound(actor, 352, 5, 2); @@ -6631,7 +6631,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3 if (pSector->ceilingstat & CSTAT_SECTOR_SKY) nSurf = kSurfNone; else - nSurf = tprops[pSector->ceilingtexture()].surfType; + nSurf = GetExtInfo(pSector->ceilingtexture()).surftype; break; } case 2: @@ -6639,17 +6639,17 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3 if (pSector->floorstat & CSTAT_SECTOR_SKY) nSurf = kSurfNone; else - nSurf = tprops[pSector->floortexture()].surfType; + nSurf = GetExtInfo(pSector->floortexture()).surftype; break; } case 0: { auto pWall = gHitInfo.hitWall; - nSurf = tprops[pWall->walltexture()].surfType; + nSurf = GetExtInfo(pWall->walltexture()).surftype; if (actCanSplatWall(pWall)) { auto ppos = gHitInfo.hitpos - dv; - int nnSurf = tprops[pWall->walltexture()].surfType; + int nnSurf = GetExtInfo(pWall->walltexture()).surftype; assert(nnSurf < kSurfMax); if (pVectorData->surfHit[nnSurf].fx1 >= 0) { @@ -6667,7 +6667,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3 case 4: { auto pWall = gHitInfo.hitWall; - nSurf = tprops[pWall->overtexture()].surfType; + nSurf = GetExtInfo(pWall->overtexture()).surftype; if (pWall->hasX()) { if (pWall->xw().triggerVector) @@ -6678,7 +6678,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3 case 3: { auto actor = gHitInfo.actor(); - nSurf = tprops[actor->spr.spritetexture()].surfType; + nSurf = GetExtInfo(actor->spr.spritetexture()).surftype; pos -= 7 * dv; int shift = 4; if (vectorType == kVectorTine && !actor->IsPlayerActor()) shift = 3; @@ -6742,7 +6742,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3 if (actCanSplatWall(pWall)) { auto ppos = gHitInfo.hitpos - dv; - int nnSurf = tprops[pWall->walltexture()].surfType; + int nnSurf = GetExtInfo(pWall->walltexture()).surftype; const VECTORDATA* pVectorData1 = &gVectorData[19]; FX_ID t2 = pVectorData1->surfHit[nnSurf].fx2; FX_ID t3 = pVectorData1->surfHit[nnSurf].fx3; diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index dab550bdc..cd339fe5c 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -1576,7 +1576,7 @@ static void scaleDamage(DBloodActor* actor) } // take surface type into account - int surfType = tprops[actor->spr.spritetexture()].surfType; + int surfType = GetExtInfo(actor->spr.spritetexture()).surftype; switch (surfType) { case 1: // stone diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp index 6a22740f2..807db408b 100644 --- a/source/games/blood/src/animatesprite.cpp +++ b/source/games/blood/src/animatesprite.cpp @@ -663,13 +663,13 @@ void viewProcessSprites(tspriteArray& tsprites, const DVector3& cPos, DAngle cA, if ((pSector->ceilingstat & CSTAT_SECTOR_SKY) && (pSector->floorstat & CSTAT_SECTOR_NO_CEILINGSHADE) == 0) { - nShade += tprops[pSector->ceilingtexture()].tileShade + pSector->ceilingshade; + nShade += GetExtInfo(pSector->ceilingtexture()).tileshade + pSector->ceilingshade; } else { - nShade += tprops[pSector->floortexture()].tileShade + pSector->floorshade; + nShade += GetExtInfo(pSector->floortexture()).tileshade + pSector->floorshade; } - nShade += tprops[pTSprite->spritetexture()].tileShade; + nShade += GetExtInfo(pTSprite->spritetexture()).tileshade; pTSprite->shade = ClipRange(nShade, -128, 127); if ((pTSprite->flags & kHitagRespawn) && pTSprite->ownerActor->spr.intowner == 3 && owneractor->hasX()) // Where does this 3 come from? Nothing sets it. { diff --git a/source/games/blood/src/blood.cpp b/source/games/blood/src/blood.cpp index f0c195df2..f99d5af4a 100644 --- a/source/games/blood/src/blood.cpp +++ b/source/games/blood/src/blood.cpp @@ -75,7 +75,6 @@ IMPLEMENT_POINTERS_END // //--------------------------------------------------------------------------- void MarkSprInSect(); -void tileInitProps(); size_t DBloodActor::PropagateMark() { @@ -588,7 +587,6 @@ void GameInterface::loadPalette(void) void GameInterface::app_init() { mirrortile = tileGetTextureID(504); - tileInitProps(); GC::AddMarkerFunc(markgcroots); diff --git a/source/games/blood/src/blood.h b/source/games/blood/src/blood.h index f97e6eeb6..8fb8b2e56 100644 --- a/source/games/blood/src/blood.h +++ b/source/games/blood/src/blood.h @@ -132,7 +132,6 @@ struct GameInterface : public ::GameInterface void NextLevel(MapRecord* map, int skill) override; void LevelCompleted(MapRecord* map, int skill) override; bool DrawAutomapPlayer(const DVector2& mxy, const DVector2& cpos, const DAngle cang, const DVector2& xydim, const double czoom, double const interpfrac) override; - void SetTileProps(int til, int surf, int shade) override; DAngle playerPitchMin() override { return DAngle::fromDeg(54.575); } DAngle playerPitchMax() override { return DAngle::fromDeg(-43.15); } void WarpToCoords(double x, double y, double z, DAngle a) override; diff --git a/source/games/blood/src/misc.h b/source/games/blood/src/misc.h index afc120f48..fc810e97a 100644 --- a/source/games/blood/src/misc.h +++ b/source/games/blood/src/misc.h @@ -100,33 +100,4 @@ void tilePrecacheTile(int nTile, int nType, int palette); int tileGetSurfType(CollisionBase& hit); -struct TextureAttr -{ - uint8_t surfType = kSurfNone; - int8_t tileShade = 0; -}; - -class FTextureAttrArray -{ - TextureAttr defaultattr; -public: - TArray Types; - - TextureAttr operator [](FTextureID tex) const - { - if ((unsigned)tex.GetIndex() >= Types.Size()) return defaultattr; - return Types[tex.GetIndex()]; - } - void Set(int index, const TextureAttr& value) - { - if ((unsigned)index >= Types.Size()) - { - Types.Resize(index + 1); - } - Types[index] = value; - } -}; - -inline FTextureAttrArray tprops; - END_BLD_NS diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index d88469d73..0c9ca7372 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -1446,7 +1446,7 @@ int getSpriteMassBySize(DBloodActor* actor) int yscale = int(actor->spr.scale.Y * 64); // take surface type into account - switch (tprops[actor->spr.spritetexture()].surfType) + switch (GetExtInfo(actor->spr.spritetexture()).surftype) { case 1: massDiv = 16; break; // stone case 2: massDiv = 18; break; // metal @@ -3956,7 +3956,7 @@ bool condCheckMixed(DBloodActor* aCond, const EVENT& event, int cmpOp, bool PUSH walltype* pObj = eob.wall(); switch (cond) { - case 24: return condCmp(tprops[pObj->walltexture()].surfType, arg1, arg2, cmpOp); + case 24: return condCmp(GetExtInfo(pObj->walltexture()).surftype, arg1, arg2, cmpOp); case 25: return condCmp(legacyTileNum(pObj->walltexture()), arg1, arg2, cmpOp); case 26: return condCmp(pObj->pal, arg1, arg2, cmpOp); case 27: return condCmp(pObj->shade, arg1, arg2, cmpOp); @@ -3974,7 +3974,7 @@ bool condCheckMixed(DBloodActor* aCond, const EVENT& event, int cmpOp, bool PUSH if (!actor) break; switch (cond) { - case 24: return condCmp(tprops[actor->spr.spritetexture()].surfType, arg1, arg2, cmpOp); + case 24: return condCmp(GetExtInfo(actor->spr.spritetexture()).surftype, arg1, arg2, cmpOp); case 25: return condCmp(actor->spr.picnum, arg1, arg2, cmpOp); case 26: return condCmp(actor->spr.pal, arg1, arg2, cmpOp); case 27: return condCmp(actor->spr.shade, arg1, arg2, cmpOp); @@ -3994,9 +3994,9 @@ bool condCheckMixed(DBloodActor* aCond, const EVENT& event, int cmpOp, bool PUSH case 24: switch (arg3) { - default: return (condCmp(tprops[pObj->floortexture()].surfType, arg1, arg2, cmpOp) || condCmp(tprops[pObj->ceilingtexture()].surfType, arg1, arg2, cmpOp)); - case 1: return condCmp(tprops[pObj->floortexture()].surfType, arg1, arg2, cmpOp); - case 2: return condCmp(tprops[pObj->ceilingtexture()].surfType, arg1, arg2, cmpOp); + default: return (condCmp(GetExtInfo(pObj->floortexture()).surftype, arg1, arg2, cmpOp) || condCmp(GetExtInfo(pObj->ceilingtexture()).surftype, arg1, arg2, cmpOp)); + case 1: return condCmp(GetExtInfo(pObj->floortexture()).surftype, arg1, arg2, cmpOp); + case 2: return condCmp(GetExtInfo(pObj->ceilingtexture()).surftype, arg1, arg2, cmpOp); } break; case 25: diff --git a/source/games/blood/src/seq.cpp b/source/games/blood/src/seq.cpp index f19ee25af..fe9ef16f4 100644 --- a/source/games/blood/src/seq.cpp +++ b/source/games/blood/src/seq.cpp @@ -360,7 +360,7 @@ void SEQINST::Update() if (!VanillaMode() && pSequence->frames[frameIndex].surfaceSound && actor->vel.Z == 0 && actor->vel.X != 0) { if (actor->sector()->upperLink) break; // don't play surface sound for stacked sectors - int surf = tprops[actor->sector()->floortexture()].surfType; + int surf = GetExtInfo(actor->sector()->floortexture()).surftype; if (!surf) break; static int surfSfxMove[15][4] = { /* {snd1, snd2, gameVolume, myVolume} */ diff --git a/source/games/blood/src/tile.cpp b/source/games/blood/src/tile.cpp index 99a4c4521..52b190146 100644 --- a/source/games/blood/src/tile.cpp +++ b/source/games/blood/src/tile.cpp @@ -36,9 +36,6 @@ BEGIN_BLD_NS int nTileFiles = 0; -// these arrays get partially filled by .def, so they need to remain global. -static uint8_t surfType[kMaxTiles]; -static int8_t tileShade[kMaxTiles]; #define x(a, b) registerName(#a, b); static void SetTileNames(TilesetBuildInfo& info) @@ -70,8 +67,13 @@ void GameInterface::LoadTextureInfo(TilesetBuildInfo& info) auto hFile = fileSystem.OpenFileReader("SURFACE.DAT"); if (hFile.isOpen()) { - hFile.Read(surfType, sizeof(surfType)); + int count = (int)hFile.GetLength(); + for (int i = 0; i < count; i++) + { + info.tile[i].extinfo.surftype = hFile.ReadInt8(); + } } + hFile = fileSystem.OpenFileReader("VOXEL.DAT"); if (hFile.isOpen()) { @@ -88,10 +90,15 @@ void GameInterface::LoadTextureInfo(TilesetBuildInfo& info) } } } + hFile = fileSystem.OpenFileReader("SHADE.DAT"); if (hFile.isOpen()) { - hFile.Read(tileShade, sizeof(tileShade)); + int count = (int)hFile.GetLength(); + for (int i = 0; i < count; i++) + { + info.tile[i].extinfo.tileshade = hFile.ReadInt8(); + } } } @@ -104,18 +111,6 @@ void GameInterface::SetupSpecialTextures(TilesetBuildInfo& info) } -void tileInitProps() -{ - for (int i = 0; i < MAXTILES; i++) - { - auto tex = tileGetTexture(i); - if (tex) - { - TextureAttr a = { surfType[i], tileShade[i] }; - tprops.Set(tex->GetID().GetIndex(), a); - } - } -} //--------------------------------------------------------------------------- // // @@ -129,27 +124,12 @@ int tileGetSurfType(CollisionBase& hit) default: return 0; case kHitSector: - return tprops[hit.hitSector->floortexture()].surfType; + return GetExtInfo(hit.hitSector->floortexture()).surftype; case kHitWall: - return tprops[hit.hitWall->walltexture()].surfType; + return GetExtInfo(hit.hitWall->walltexture()).surftype; case kHitSprite: - return tprops[hit.hitActor->spr.spritetexture()].surfType; + return GetExtInfo(hit.hitActor->spr.spritetexture()).surftype; } } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -void GameInterface::SetTileProps(int tile, int surf, int shade) -{ - if (surf != INT_MAX) surfType[tile] = surf; - if (shade != INT_MAX) tileShade[tile] = shade; - - mirrortile = tileGetTextureID(504); - -} - END_BLD_NS