- 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.
This commit is contained in:
Christoph Oelckers 2022-12-08 19:15:55 +01:00
parent c34756e5f2
commit e23a5095cb
12 changed files with 39 additions and 92 deletions

View file

@ -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; 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; tbuild->tile[imp.tile].extinfo.picanm.sf |= imp.flags;
tbuild->tile[imp.tile].extinfo.surftype = imp.surface;
gi->SetTileProps(imp.tile, imp.surface, imp.shade); tbuild->tile[imp.tile].extinfo.tileshade = imp.shade;
// This is not quite the same as originally, for two reasons: // 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. // 1: Since these are texture properties now, there's no need to clear them.

View file

@ -110,7 +110,6 @@ struct GameInterface
virtual void NewGame(MapRecord* map, int skill, bool special = false) {} virtual void NewGame(MapRecord* map, int skill, bool special = false) {}
virtual void LevelCompleted(MapRecord* map, int skill) {} 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 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 playerPitchMin() { return DAngle::fromDeg(57.375); }
virtual DAngle playerPitchMax() { return DAngle::fromDeg(-57.375); } virtual DAngle playerPitchMax() { return DAngle::fromDeg(-57.375); }
virtual void WarpToCoords(double x, double y, double z, DAngle a) {} virtual void WarpToCoords(double x, double y, double z, DAngle a) {}

View file

@ -58,8 +58,8 @@ struct TileOffs
struct TexExtInfo struct TexExtInfo
{ {
// TexAnim *texanim // todo: extended texture animation like ZDoom's ANIMDEFS. // 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 surftype; // Contents depend on the game, e.g. this holds Blood's surfType. Other games have hard coded handling for similar effects.
uint8_t shadeinfo; // Blood's shade.dat uint8_t tileshade; // Blood's shade.dat
int16_t tiletovox; // engine-side voxel index int16_t tiletovox; // engine-side voxel index
picanm_t picanm; // tile-based animation data. picanm_t picanm; // tile-based animation data.
uint32_t flags; // contents are game dependent. uint32_t flags; // contents are game dependent.

View file

@ -3943,7 +3943,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
actDamageSprite(missileOwner, actorHit, kDamageBullet, nDamage); actDamageSprite(missileOwner, actorHit, kDamageBullet, nDamage);
} }
if (tprops[actorHit->spr.spritetexture()].surfType == kSurfFlesh) if (GetExtInfo(actorHit->spr.spritetexture()).surftype == kSurfFlesh)
{ {
missileActor->spr.picnum = 2123; missileActor->spr.picnum = 2123;
missileActor->SetTarget(actorHit); missileActor->SetTarget(actorHit);
@ -4109,7 +4109,7 @@ static void actTouchFloor(DBloodActor* actor, sectortype* pSector)
actDamageSprite(actor, actor, nDamageType, Scale(4, nDamage, 120) << 4); 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); actDamageSprite(actor, actor, kDamageBurn, 16);
sfxPlay3DSound(actor, 352, 5, 2); sfxPlay3DSound(actor, 352, 5, 2);
@ -6631,7 +6631,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
if (pSector->ceilingstat & CSTAT_SECTOR_SKY) if (pSector->ceilingstat & CSTAT_SECTOR_SKY)
nSurf = kSurfNone; nSurf = kSurfNone;
else else
nSurf = tprops[pSector->ceilingtexture()].surfType; nSurf = GetExtInfo(pSector->ceilingtexture()).surftype;
break; break;
} }
case 2: case 2:
@ -6639,17 +6639,17 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
if (pSector->floorstat & CSTAT_SECTOR_SKY) if (pSector->floorstat & CSTAT_SECTOR_SKY)
nSurf = kSurfNone; nSurf = kSurfNone;
else else
nSurf = tprops[pSector->floortexture()].surfType; nSurf = GetExtInfo(pSector->floortexture()).surftype;
break; break;
} }
case 0: case 0:
{ {
auto pWall = gHitInfo.hitWall; auto pWall = gHitInfo.hitWall;
nSurf = tprops[pWall->walltexture()].surfType; nSurf = GetExtInfo(pWall->walltexture()).surftype;
if (actCanSplatWall(pWall)) if (actCanSplatWall(pWall))
{ {
auto ppos = gHitInfo.hitpos - dv; auto ppos = gHitInfo.hitpos - dv;
int nnSurf = tprops[pWall->walltexture()].surfType; int nnSurf = GetExtInfo(pWall->walltexture()).surftype;
assert(nnSurf < kSurfMax); assert(nnSurf < kSurfMax);
if (pVectorData->surfHit[nnSurf].fx1 >= 0) if (pVectorData->surfHit[nnSurf].fx1 >= 0)
{ {
@ -6667,7 +6667,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
case 4: case 4:
{ {
auto pWall = gHitInfo.hitWall; auto pWall = gHitInfo.hitWall;
nSurf = tprops[pWall->overtexture()].surfType; nSurf = GetExtInfo(pWall->overtexture()).surftype;
if (pWall->hasX()) if (pWall->hasX())
{ {
if (pWall->xw().triggerVector) if (pWall->xw().triggerVector)
@ -6678,7 +6678,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
case 3: case 3:
{ {
auto actor = gHitInfo.actor(); auto actor = gHitInfo.actor();
nSurf = tprops[actor->spr.spritetexture()].surfType; nSurf = GetExtInfo(actor->spr.spritetexture()).surftype;
pos -= 7 * dv; pos -= 7 * dv;
int shift = 4; int shift = 4;
if (vectorType == kVectorTine && !actor->IsPlayerActor()) shift = 3; if (vectorType == kVectorTine && !actor->IsPlayerActor()) shift = 3;
@ -6742,7 +6742,7 @@ void actFireVector(DBloodActor* shooter, double offset, double zoffset, DVector3
if (actCanSplatWall(pWall)) if (actCanSplatWall(pWall))
{ {
auto ppos = gHitInfo.hitpos - dv; auto ppos = gHitInfo.hitpos - dv;
int nnSurf = tprops[pWall->walltexture()].surfType; int nnSurf = GetExtInfo(pWall->walltexture()).surftype;
const VECTORDATA* pVectorData1 = &gVectorData[19]; const VECTORDATA* pVectorData1 = &gVectorData[19];
FX_ID t2 = pVectorData1->surfHit[nnSurf].fx2; FX_ID t2 = pVectorData1->surfHit[nnSurf].fx2;
FX_ID t3 = pVectorData1->surfHit[nnSurf].fx3; FX_ID t3 = pVectorData1->surfHit[nnSurf].fx3;

View file

@ -1576,7 +1576,7 @@ static void scaleDamage(DBloodActor* actor)
} }
// take surface type into account // take surface type into account
int surfType = tprops[actor->spr.spritetexture()].surfType; int surfType = GetExtInfo(actor->spr.spritetexture()).surftype;
switch (surfType) switch (surfType)
{ {
case 1: // stone case 1: // stone

View file

@ -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) 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 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); 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. if ((pTSprite->flags & kHitagRespawn) && pTSprite->ownerActor->spr.intowner == 3 && owneractor->hasX()) // Where does this 3 come from? Nothing sets it.
{ {

View file

@ -75,7 +75,6 @@ IMPLEMENT_POINTERS_END
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void MarkSprInSect(); void MarkSprInSect();
void tileInitProps();
size_t DBloodActor::PropagateMark() size_t DBloodActor::PropagateMark()
{ {
@ -588,7 +587,6 @@ void GameInterface::loadPalette(void)
void GameInterface::app_init() void GameInterface::app_init()
{ {
mirrortile = tileGetTextureID(504); mirrortile = tileGetTextureID(504);
tileInitProps();
GC::AddMarkerFunc(markgcroots); GC::AddMarkerFunc(markgcroots);

View file

@ -132,7 +132,6 @@ struct GameInterface : public ::GameInterface
void NextLevel(MapRecord* map, int skill) override; void NextLevel(MapRecord* map, int skill) override;
void LevelCompleted(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; 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 playerPitchMin() override { return DAngle::fromDeg(54.575); }
DAngle playerPitchMax() override { return DAngle::fromDeg(-43.15); } DAngle playerPitchMax() override { return DAngle::fromDeg(-43.15); }
void WarpToCoords(double x, double y, double z, DAngle a) override; void WarpToCoords(double x, double y, double z, DAngle a) override;

View file

@ -100,33 +100,4 @@ void tilePrecacheTile(int nTile, int nType, int palette);
int tileGetSurfType(CollisionBase& hit); int tileGetSurfType(CollisionBase& hit);
struct TextureAttr
{
uint8_t surfType = kSurfNone;
int8_t tileShade = 0;
};
class FTextureAttrArray
{
TextureAttr defaultattr;
public:
TArray<TextureAttr> 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 END_BLD_NS

View file

@ -1446,7 +1446,7 @@ int getSpriteMassBySize(DBloodActor* actor)
int yscale = int(actor->spr.scale.Y * 64); int yscale = int(actor->spr.scale.Y * 64);
// take surface type into account // take surface type into account
switch (tprops[actor->spr.spritetexture()].surfType) switch (GetExtInfo(actor->spr.spritetexture()).surftype)
{ {
case 1: massDiv = 16; break; // stone case 1: massDiv = 16; break; // stone
case 2: massDiv = 18; break; // metal 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(); walltype* pObj = eob.wall();
switch (cond) 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 25: return condCmp(legacyTileNum(pObj->walltexture()), arg1, arg2, cmpOp);
case 26: return condCmp(pObj->pal, arg1, arg2, cmpOp); case 26: return condCmp(pObj->pal, arg1, arg2, cmpOp);
case 27: return condCmp(pObj->shade, 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; if (!actor) break;
switch (cond) 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 25: return condCmp(actor->spr.picnum, arg1, arg2, cmpOp);
case 26: return condCmp(actor->spr.pal, arg1, arg2, cmpOp); case 26: return condCmp(actor->spr.pal, arg1, arg2, cmpOp);
case 27: return condCmp(actor->spr.shade, 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: case 24:
switch (arg3) switch (arg3)
{ {
default: return (condCmp(tprops[pObj->floortexture()].surfType, arg1, arg2, cmpOp) || 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(tprops[pObj->floortexture()].surfType, arg1, arg2, cmpOp); case 1: return condCmp(GetExtInfo(pObj->floortexture()).surftype, arg1, arg2, cmpOp);
case 2: return condCmp(tprops[pObj->ceilingtexture()].surfType, arg1, arg2, cmpOp); case 2: return condCmp(GetExtInfo(pObj->ceilingtexture()).surftype, arg1, arg2, cmpOp);
} }
break; break;
case 25: case 25:

View file

@ -360,7 +360,7 @@ void SEQINST::Update()
if (!VanillaMode() && pSequence->frames[frameIndex].surfaceSound && actor->vel.Z == 0 && actor->vel.X != 0) { 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 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; if (!surf) break;
static int surfSfxMove[15][4] = { static int surfSfxMove[15][4] = {
/* {snd1, snd2, gameVolume, myVolume} */ /* {snd1, snd2, gameVolume, myVolume} */

View file

@ -36,9 +36,6 @@ BEGIN_BLD_NS
int nTileFiles = 0; 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); #define x(a, b) registerName(#a, b);
static void SetTileNames(TilesetBuildInfo& info) static void SetTileNames(TilesetBuildInfo& info)
@ -70,8 +67,13 @@ void GameInterface::LoadTextureInfo(TilesetBuildInfo& info)
auto hFile = fileSystem.OpenFileReader("SURFACE.DAT"); auto hFile = fileSystem.OpenFileReader("SURFACE.DAT");
if (hFile.isOpen()) 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"); hFile = fileSystem.OpenFileReader("VOXEL.DAT");
if (hFile.isOpen()) if (hFile.isOpen())
{ {
@ -88,10 +90,15 @@ void GameInterface::LoadTextureInfo(TilesetBuildInfo& info)
} }
} }
} }
hFile = fileSystem.OpenFileReader("SHADE.DAT"); hFile = fileSystem.OpenFileReader("SHADE.DAT");
if (hFile.isOpen()) 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: default:
return 0; return 0;
case kHitSector: case kHitSector:
return tprops[hit.hitSector->floortexture()].surfType; return GetExtInfo(hit.hitSector->floortexture()).surftype;
case kHitWall: case kHitWall:
return tprops[hit.hitWall->walltexture()].surfType; return GetExtInfo(hit.hitWall->walltexture()).surftype;
case kHitSprite: 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 END_BLD_NS