mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-15 00:42:08 +00:00
- exported all breakable ceilings.
Very simple stuff with instant profit. :)
This commit is contained in:
parent
a63ee8079a
commit
a08db47528
19 changed files with 200 additions and 212 deletions
|
@ -360,7 +360,7 @@ void FMapInfoParser::ParseBreakWall()
|
||||||
sc.MustGetString();
|
sc.MustGetString();
|
||||||
|
|
||||||
size_t p = strcspn(sc.String, ".");
|
size_t p = strcspn(sc.String, ".");
|
||||||
if (p != 0)
|
if (sc.String[p] != 0)
|
||||||
{
|
{
|
||||||
FName clsname(sc.String, p, false);
|
FName clsname(sc.String, p, false);
|
||||||
FName funcname = sc.String + p + 1;
|
FName funcname = sc.String + p + 1;
|
||||||
|
@ -384,6 +384,70 @@ void FMapInfoParser::ParseBreakWall()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void FMapInfoParser::ParseBreakCeiling()
|
||||||
|
{
|
||||||
|
|
||||||
|
sc.MustGetStringName("{");
|
||||||
|
while (!sc.CheckString("}"))
|
||||||
|
{
|
||||||
|
int basetile = -1;
|
||||||
|
int breaktile = -1;
|
||||||
|
int flags = 0;
|
||||||
|
FSoundID sound = NO_SOUND;
|
||||||
|
VMFunction* handler = nullptr;
|
||||||
|
|
||||||
|
sc.MustGetString();
|
||||||
|
FString basename = sc.String; // save for printing error messages.
|
||||||
|
basetile = TileFiles.tileForName(sc.String);
|
||||||
|
if (basetile < 0)
|
||||||
|
{
|
||||||
|
sc.ScriptMessage("Unknown texture '%s' in breakceiling definition", sc.String, basetile);
|
||||||
|
SkipToNext();
|
||||||
|
}
|
||||||
|
ParseAssign();
|
||||||
|
sc.MustGetString();
|
||||||
|
breaktile = TileFiles.tileForName(sc.String);
|
||||||
|
if (*sc.String && breaktile < 0) sc.ScriptMessage("Unknown texture '%s' in breakceiling definition", sc.String, breaktile);
|
||||||
|
if (sc.CheckString(","))
|
||||||
|
{
|
||||||
|
sc.MustGetString();
|
||||||
|
sound = S_FindSound(sc.String);
|
||||||
|
if (*sc.String && !sound.isvalid()) Printf(TEXTCOLOR_RED "Unknown sound '%s' in definition for breakable ceiling '5s'\n", basename.GetChars());
|
||||||
|
|
||||||
|
auto saved = sc.SavePos();
|
||||||
|
if (sc.CheckString(","))
|
||||||
|
{
|
||||||
|
sc.MustGetString();
|
||||||
|
|
||||||
|
size_t p = strcspn(sc.String, ".");
|
||||||
|
if (sc.String[p] != 0)
|
||||||
|
{
|
||||||
|
FName clsname(sc.String, p, false);
|
||||||
|
FName funcname = sc.String + p + 1;
|
||||||
|
handler = PClass::FindFunction(clsname, funcname);
|
||||||
|
if (handler == nullptr)
|
||||||
|
sc.ScriptMessage("Call to undefined function %s", sc.String);
|
||||||
|
// todo: validate the function's signature. Must be (sectortype)
|
||||||
|
}
|
||||||
|
else sc.RestorePos(saved);
|
||||||
|
while (sc.CheckString(","))
|
||||||
|
{
|
||||||
|
sc.MustGetString();
|
||||||
|
if (sc.Compare("lightsout")) flags |= 1; // all internal definitions have these two flags.
|
||||||
|
else if (sc.Compare("ceilingglass")) flags |= 2;
|
||||||
|
else sc.ScriptMessage("'%s': Unknown breakable flag", sc.String);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
breakCeilingMap.Insert(basetile, { breaktile, sound, handler, flags });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -1436,6 +1500,10 @@ void FMapInfoParser::ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord
|
||||||
{
|
{
|
||||||
ParseBreakWall();
|
ParseBreakWall();
|
||||||
}
|
}
|
||||||
|
else if (sc.Compare("breakceiling"))
|
||||||
|
{
|
||||||
|
ParseBreakCeiling();
|
||||||
|
}
|
||||||
else if (sc.Compare("clearall"))
|
else if (sc.Compare("clearall"))
|
||||||
{
|
{
|
||||||
// clears all map and progression related data, so that a mod can start with a clean slate.
|
// clears all map and progression related data, so that a mod can start with a clean slate.
|
||||||
|
|
|
@ -64,6 +64,7 @@ struct BreakWallRec
|
||||||
};
|
};
|
||||||
using BreakWallMap = TMap<int, BreakWallRec>;
|
using BreakWallMap = TMap<int, BreakWallRec>;
|
||||||
inline BreakWallMap breakWallMap;
|
inline BreakWallMap breakWallMap;
|
||||||
|
inline BreakWallMap breakCeilingMap;
|
||||||
|
|
||||||
struct FMapInfoParser
|
struct FMapInfoParser
|
||||||
{
|
{
|
||||||
|
@ -91,6 +92,7 @@ struct FMapInfoParser
|
||||||
void ParseGameInfo();
|
void ParseGameInfo();
|
||||||
void ParseSpawnClasses();
|
void ParseSpawnClasses();
|
||||||
void ParseBreakWall();
|
void ParseBreakWall();
|
||||||
|
void ParseBreakCeiling();
|
||||||
void ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord &defaultinfo);
|
void ParseMapInfo (int lump, MapRecord &gamedefaults, MapRecord &defaultinfo);
|
||||||
|
|
||||||
void ParseOpenBrace();
|
void ParseOpenBrace();
|
||||||
|
|
|
@ -306,6 +306,11 @@ struct walltype
|
||||||
|
|
||||||
struct sectortype
|
struct sectortype
|
||||||
{
|
{
|
||||||
|
enum EWhich
|
||||||
|
{
|
||||||
|
ceiling = 0,
|
||||||
|
floor = 1,
|
||||||
|
};
|
||||||
|
|
||||||
// Fields were reordered by size, some also enlarged.
|
// Fields were reordered by size, some also enlarged.
|
||||||
DCoreActor* firstEntry, * lastEntry;
|
DCoreActor* firstEntry, * lastEntry;
|
||||||
|
@ -439,6 +444,12 @@ struct sectortype
|
||||||
|
|
||||||
// same for SW
|
// same for SW
|
||||||
bool hasU() const { return u_defined; }
|
bool hasU() const { return u_defined; }
|
||||||
|
|
||||||
|
// Refactoring helper to remove all places that will need the tile num from future searches
|
||||||
|
int legacyTileNum(int which) const
|
||||||
|
{
|
||||||
|
return which? ceilingpicnum : floorpicnum;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
|
@ -363,7 +363,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
|
||||||
if (!pNSprite)
|
if (!pNSprite)
|
||||||
break;
|
break;
|
||||||
pNSprite->pos.Z = getflorzofslopeptr(pTSprite->sectp, pNSprite->pos);
|
pNSprite->pos.Z = getflorzofslopeptr(pTSprite->sectp, pNSprite->pos);
|
||||||
if ((pNSprite->sectp->floorpicnum >= 4080) && (pNSprite->sectp->floorpicnum <= 4095) && !VanillaMode()) // if floor has ror, find actual floor
|
if (pNSprite->sectp->portalflags == PORTAL_SECTOR_FLOOR && !VanillaMode()) // if floor has ror, find actual floor
|
||||||
{
|
{
|
||||||
DVector3 cPos = pNSprite->pos;
|
DVector3 cPos = pNSprite->pos;
|
||||||
double cZrel = cPos.Z;
|
double cZrel = cPos.Z;
|
||||||
|
@ -374,7 +374,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
|
||||||
break;
|
break;
|
||||||
const double newFloorZ = getflorzofslopeptr(cSect, cPos.X, cPos.Z);
|
const double newFloorZ = getflorzofslopeptr(cSect, cPos.X, cPos.Z);
|
||||||
cZrel += newFloorZ - cPos.Z; // get height difference for next sector's ceiling/floor, and add to relative height for shadow
|
cZrel += newFloorZ - cPos.Z; // get height difference for next sector's ceiling/floor, and add to relative height for shadow
|
||||||
if ((cSect->floorpicnum < 4080) || (cSect->floorpicnum > 4095)) // if current sector is not open air, use as floor for shadow casting, otherwise continue to next sector
|
if (cSect->portalflags != PORTAL_SECTOR_FLOOR) // if current sector is not open air, use as floor for shadow casting, otherwise continue to next sector
|
||||||
break;
|
break;
|
||||||
cPos.Z = newFloorZ;
|
cPos.Z = newFloorZ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2850,13 +2850,13 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
|
||||||
aLower->spr.type = kMarkerLowWater;
|
aLower->spr.type = kMarkerLowWater;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) aLower->xspr.sysData1 = kMarkerLowLink;
|
if (pSector->portalflags != PORTAL_SECTOR_CEILING) aLower->xspr.sysData1 = kMarkerLowLink;
|
||||||
else aLower->xspr.sysData1 = kMarkerLowStack;
|
else aLower->xspr.sysData1 = kMarkerLowStack;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (aLower->xspr.sysData1 > 0) aLower->spr.type = aLower->xspr.sysData1;
|
else if (aLower->xspr.sysData1 > 0) aLower->spr.type = aLower->xspr.sysData1;
|
||||||
else if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) aLower->spr.type = kMarkerLowLink;
|
else if (pSector->portalflags != PORTAL_SECTOR_CEILING) aLower->spr.type = kMarkerLowLink;
|
||||||
else aLower->spr.type = kMarkerLowStack;
|
else aLower->spr.type = kMarkerLowStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2872,13 +2872,13 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
|
||||||
aUpper->spr.type = kMarkerUpWater;
|
aUpper->spr.type = kMarkerUpWater;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) aUpper->xspr.sysData1 = kMarkerUpLink;
|
if (pSector->portalflags != PORTAL_SECTOR_FLOOR) aUpper->xspr.sysData1 = kMarkerUpLink;
|
||||||
else aUpper->xspr.sysData1 = kMarkerUpStack;
|
else aUpper->xspr.sysData1 = kMarkerUpStack;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (aUpper->xspr.sysData1 > 0) aUpper->spr.type = aUpper->xspr.sysData1;
|
else if (aUpper->xspr.sysData1 > 0) aUpper->spr.type = aUpper->xspr.sysData1;
|
||||||
else if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) aUpper->spr.type = kMarkerUpLink;
|
else if (pSector->portalflags != PORTAL_SECTOR_FLOOR) aUpper->spr.type = kMarkerUpLink;
|
||||||
else aUpper->spr.type = kMarkerUpStack;
|
else aUpper->spr.type = kMarkerUpStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3983,17 +3983,17 @@ bool condCheckMixed(DBloodActor* aCond, const EVENT& event, int cmpOp, bool PUSH
|
||||||
case 24:
|
case 24:
|
||||||
switch (arg3)
|
switch (arg3)
|
||||||
{
|
{
|
||||||
default: return (condCmp(surfType[pObj->floorpicnum], arg1, arg2, cmpOp) || condCmp(surfType[pObj->ceilingpicnum], arg1, arg2, cmpOp));
|
default: return (condCmp(surfType[pObj->legacyTileNum(sectortype::floor)], arg1, arg2, cmpOp) || condCmp(surfType[pObj->legacyTileNum(sectortype::ceiling)], arg1, arg2, cmpOp));
|
||||||
case 1: return condCmp(surfType[pObj->floorpicnum], arg1, arg2, cmpOp);
|
case 1: return condCmp(surfType[pObj->legacyTileNum(sectortype::floor)], arg1, arg2, cmpOp);
|
||||||
case 2: return condCmp(surfType[pObj->ceilingpicnum], arg1, arg2, cmpOp);
|
case 2: return condCmp(surfType[pObj->legacyTileNum(sectortype::ceiling)], arg1, arg2, cmpOp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 25:
|
case 25:
|
||||||
switch (arg3)
|
switch (arg3)
|
||||||
{
|
{
|
||||||
default: return (condCmp(pObj->floorpicnum, arg1, arg2, cmpOp) || condCmp(pObj->ceilingpicnum, arg1, arg2, cmpOp));
|
default: return (condCmp(pObj->legacyTileNum(sectortype::floor), arg1, arg2, cmpOp) || condCmp(pObj->legacyTileNum(sectortype::ceiling), arg1, arg2, cmpOp));
|
||||||
case 1: return condCmp(pObj->floorpicnum, arg1, arg2, cmpOp);
|
case 1: return condCmp(pObj->legacyTileNum(sectortype::floor), arg1, arg2, cmpOp);
|
||||||
case 2: return condCmp(pObj->ceilingpicnum, arg1, arg2, cmpOp);
|
case 2: return condCmp(pObj->legacyTileNum(sectortype::ceiling), arg1, arg2, cmpOp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 26:
|
case 26:
|
||||||
|
@ -4265,7 +4265,7 @@ bool condCheckWall(DBloodActor* aCond, int cmpOp, bool PUSH)
|
||||||
if (PUSH) condPush(aCond, pWall->sectorp());
|
if (PUSH) condPush(aCond, pWall->sectorp());
|
||||||
return true;
|
return true;
|
||||||
case 10: // this wall is a mirror? // must be as constants here
|
case 10: // this wall is a mirror? // must be as constants here
|
||||||
return (pWall->type != kWallStack && condCmp(pWall->picnum, 4080, (4080 + 16) - 1, 0));
|
return (pWall->portalflags == PORTAL_WALL_MIRROR);
|
||||||
case 15:
|
case 15:
|
||||||
if (!pWall->twoSided()) return false;
|
if (!pWall->twoSided()) return false;
|
||||||
else if (PUSH) condPush(aCond, pWall->nextSector());
|
else if (PUSH) condPush(aCond, pWall->nextSector());
|
||||||
|
|
|
@ -231,13 +231,13 @@ void hitradius_d(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
|
||||||
auto wal = dasectp->walls.Data();
|
auto wal = dasectp->walls.Data();
|
||||||
double d = (wal->pos - actor->spr.pos.XY()).Sum();
|
double d = (wal->pos - actor->spr.pos.XY()).Sum();
|
||||||
if (d < radius)
|
if (d < radius)
|
||||||
fi.checkhitceiling(dasectp);
|
checkhitceiling(dasectp);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto thirdpoint = wal->point2Wall()->point2Wall();
|
auto thirdpoint = wal->point2Wall()->point2Wall();
|
||||||
d = (thirdpoint->pos - actor->spr.pos.XY()).Sum();
|
d = (thirdpoint->pos - actor->spr.pos.XY()).Sum();
|
||||||
if (d < radius)
|
if (d < radius)
|
||||||
fi.checkhitceiling(dasectp);
|
checkhitceiling(dasectp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1066,7 +1066,7 @@ static void flamethrowerflame(DDukeActor *actor)
|
||||||
{
|
{
|
||||||
SetActor(actor, dapos);
|
SetActor(actor, dapos);
|
||||||
if (actor->vel.Z < 0)
|
if (actor->vel.Z < 0)
|
||||||
fi.checkhitceiling(actor->sector());
|
checkhitceiling(actor->sector());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->spr.scale.X >= 0.15625)
|
if (actor->spr.scale.X >= 0.15625)
|
||||||
|
|
|
@ -184,13 +184,13 @@ void hitradius_r(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
|
||||||
auto wal = dasectp->walls.Data();
|
auto wal = dasectp->walls.Data();
|
||||||
double d = (wal->pos - actor->spr.pos.XY()).Sum();
|
double d = (wal->pos - actor->spr.pos.XY()).Sum();
|
||||||
if (d < radius)
|
if (d < radius)
|
||||||
fi.checkhitceiling(dasectp);
|
checkhitceiling(dasectp);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto thirdpoint = wal->point2Wall()->point2Wall();
|
auto thirdpoint = wal->point2Wall()->point2Wall();
|
||||||
d = (thirdpoint->pos - actor->spr.pos.XY()).Sum();
|
d = (thirdpoint->pos - actor->spr.pos.XY()).Sum();
|
||||||
if (d < radius)
|
if (d < radius)
|
||||||
fi.checkhitceiling(dasectp);
|
checkhitceiling(dasectp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,6 @@ bool checkhitswitch_d(int snum, walltype* w, DDukeActor *act);
|
||||||
bool checkhitswitch_r(int snum, walltype* w, DDukeActor* act);
|
bool checkhitswitch_r(int snum, walltype* w, DDukeActor* act);
|
||||||
void activatebysector_d(sectortype* sect, DDukeActor* j);
|
void activatebysector_d(sectortype* sect, DDukeActor* j);
|
||||||
void activatebysector_r(sectortype* sect, DDukeActor* j);
|
void activatebysector_r(sectortype* sect, DDukeActor* j);
|
||||||
bool checkhitceiling_d(sectortype* sn);
|
|
||||||
bool checkhitceiling_r(sectortype* sn);
|
|
||||||
void checkhitsprite_d(DDukeActor* i, DDukeActor* sn);
|
void checkhitsprite_d(DDukeActor* i, DDukeActor* sn);
|
||||||
void checkhitsprite_r(DDukeActor* i, DDukeActor* sn);
|
void checkhitsprite_r(DDukeActor* i, DDukeActor* sn);
|
||||||
void checkhitdefault_d(DDukeActor* i, DDukeActor* sn);
|
void checkhitdefault_d(DDukeActor* i, DDukeActor* sn);
|
||||||
|
@ -105,7 +103,6 @@ void SetDispatcher()
|
||||||
operateforcefields_d,
|
operateforcefields_d,
|
||||||
checkhitswitch_d,
|
checkhitswitch_d,
|
||||||
activatebysector_d,
|
activatebysector_d,
|
||||||
checkhitceiling_d,
|
|
||||||
checkhitsprite_d,
|
checkhitsprite_d,
|
||||||
checkhitdefault_d,
|
checkhitdefault_d,
|
||||||
checksectors_d,
|
checksectors_d,
|
||||||
|
@ -142,7 +139,6 @@ void SetDispatcher()
|
||||||
operateforcefields_r,
|
operateforcefields_r,
|
||||||
checkhitswitch_r,
|
checkhitswitch_r,
|
||||||
activatebysector_r,
|
activatebysector_r,
|
||||||
checkhitceiling_r,
|
|
||||||
checkhitsprite_r,
|
checkhitsprite_r,
|
||||||
checkhitdefault_r,
|
checkhitdefault_r,
|
||||||
checksectors_r,
|
checksectors_r,
|
||||||
|
|
|
@ -79,7 +79,6 @@ struct Dispatcher
|
||||||
void (*operateforcefields)(DDukeActor* act, int low);
|
void (*operateforcefields)(DDukeActor* act, int low);
|
||||||
bool (*checkhitswitch)(int snum, walltype* w, DDukeActor* act);
|
bool (*checkhitswitch)(int snum, walltype* w, DDukeActor* act);
|
||||||
void (*activatebysector)(sectortype* sect, DDukeActor* j);
|
void (*activatebysector)(sectortype* sect, DDukeActor* j);
|
||||||
bool (*checkhitceiling)(sectortype* sn);
|
|
||||||
void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn);
|
void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn);
|
||||||
void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn);
|
void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn);
|
||||||
void (*checksectors)(int low);
|
void (*checksectors)(int low);
|
||||||
|
|
|
@ -116,6 +116,7 @@ int setpal(player_struct* p);
|
||||||
int madenoise(int playerNum);
|
int madenoise(int playerNum);
|
||||||
int haskey(sectortype* sect, int snum);
|
int haskey(sectortype* sect, int snum);
|
||||||
|
|
||||||
|
bool checkhitceiling(sectortype* sectp);
|
||||||
void checkhitwall(DDukeActor* spr, walltype* wal, const DVector3& pos);
|
void checkhitwall(DDukeActor* spr, walltype* wal, const DVector3& pos);
|
||||||
int callsound(sectortype* sectnum,DDukeActor* snum, bool endstate = false);
|
int callsound(sectortype* sectnum,DDukeActor* snum, bool endstate = false);
|
||||||
double hitasprite(DDukeActor* snum,DDukeActor **hitSprite);
|
double hitasprite(DDukeActor* snum,DDukeActor **hitSprite);
|
||||||
|
|
|
@ -1075,7 +1075,7 @@ void DoSector(bool bSet, int lVar1, int lLabelID, int lVar2, DDukeActor* sActor,
|
||||||
break;
|
break;
|
||||||
case SECTOR_CEILINGPICNUM:
|
case SECTOR_CEILINGPICNUM:
|
||||||
if (bSet) sectp->ceilingpicnum = lValue;
|
if (bSet) sectp->ceilingpicnum = lValue;
|
||||||
else SetGameVarID(lVar2, sectp->ceilingpicnum, sActor, sPlayer);
|
else SetGameVarID(lVar2, sectp->legacyTileNum(sectortype::ceiling), sActor, sPlayer);
|
||||||
break;
|
break;
|
||||||
case SECTOR_CEILINGSLOPE:
|
case SECTOR_CEILINGSLOPE:
|
||||||
if (bSet) sectp->setceilingslope(lValue);
|
if (bSet) sectp->setceilingslope(lValue);
|
||||||
|
@ -1099,7 +1099,7 @@ void DoSector(bool bSet, int lVar1, int lLabelID, int lVar2, DDukeActor* sActor,
|
||||||
break;
|
break;
|
||||||
case SECTOR_FLOORPICNUM:
|
case SECTOR_FLOORPICNUM:
|
||||||
if (bSet) sectp->floorpicnum = lValue;
|
if (bSet) sectp->floorpicnum = lValue;
|
||||||
else SetGameVarID(lVar2, sectp->floorpicnum, sActor, sPlayer);
|
else SetGameVarID(lVar2, sectp->legacyTileNum(sectortype::ceiling), sActor, sPlayer);
|
||||||
break;
|
break;
|
||||||
case SECTOR_FLOORSLOPE:
|
case SECTOR_FLOORSLOPE:
|
||||||
if (bSet) sectp->setfloorslope(lValue);
|
if (bSet) sectp->setfloorslope(lValue);
|
||||||
|
@ -3454,7 +3454,7 @@ int ParseState::parse(void)
|
||||||
case concmd_gettexturefloor:
|
case concmd_gettexturefloor:
|
||||||
{
|
{
|
||||||
insptr++;
|
insptr++;
|
||||||
SetGameVarID(g_iTextureID, g_ac->sector()->floorpicnum, g_ac, g_p);
|
SetGameVarID(g_iTextureID, g_ac->sector()->legacyTileNum(sectortype::ceiling), g_ac, g_p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3591,7 +3591,7 @@ int ParseState::parse(void)
|
||||||
case concmd_gettextureceiling:
|
case concmd_gettextureceiling:
|
||||||
{
|
{
|
||||||
insptr++;
|
insptr++;
|
||||||
SetGameVarID(g_iTextureID, g_ac->sector()->ceilingpicnum, g_ac, g_p);
|
SetGameVarID(g_iTextureID, g_ac->sector()->legacyTileNum(sectortype::ceiling), g_ac, g_p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case concmd_ifvarvarand:
|
case concmd_ifvarvarand:
|
||||||
|
|
|
@ -418,7 +418,7 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fi.checkhitceiling(hit.hitSector);
|
checkhitceiling(hit.hitSector);
|
||||||
}
|
}
|
||||||
spawn(spark, DTILE_SMALLSMOKE);
|
spawn(spark, DTILE_SMALLSMOKE);
|
||||||
}
|
}
|
||||||
|
@ -947,7 +947,7 @@ static void shootgrowspark(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
|
||||||
if (hit.hitWall == nullptr && hit.actor() == nullptr && hit.hitSector != nullptr)
|
if (hit.hitWall == nullptr && hit.actor() == nullptr && hit.hitSector != nullptr)
|
||||||
{
|
{
|
||||||
if (zvel < 0 && (hit.hitSector->ceilingstat & CSTAT_SECTOR_SKY) == 0)
|
if (zvel < 0 && (hit.hitSector->ceilingstat & CSTAT_SECTOR_SKY) == 0)
|
||||||
fi.checkhitceiling(hit.hitSector);
|
checkhitceiling(hit.hitSector);
|
||||||
}
|
}
|
||||||
else if (hit.actor() != nullptr) fi.checkhitsprite(hit.actor(), spark);
|
else if (hit.actor() != nullptr) fi.checkhitsprite(hit.actor(), spark);
|
||||||
else if (hit.hitWall != nullptr)
|
else if (hit.hitWall != nullptr)
|
||||||
|
|
|
@ -308,7 +308,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fi.checkhitceiling(hit.hitSector);
|
checkhitceiling(hit.hitSector);
|
||||||
}
|
}
|
||||||
if (hit.hitSector->lotag != 1)
|
if (hit.hitSector->lotag != 1)
|
||||||
spawn(spark, RTILE_SMALLSMOKE);
|
spawn(spark, RTILE_SMALLSMOKE);
|
||||||
|
|
|
@ -1319,6 +1319,67 @@ void checkhitwall(DDukeActor* spr, walltype* wal, const DVector3& pos)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool checkhitceiling(sectortype* sectp)
|
||||||
|
{
|
||||||
|
auto data = breakCeilingMap.CheckKey(sectp->ceilingpicnum);
|
||||||
|
if (data && !(data->flags & 1))
|
||||||
|
{
|
||||||
|
if (!data->handler)
|
||||||
|
{
|
||||||
|
sectp->ceilingpicnum = data->brokentex;
|
||||||
|
S_PlayActorSound(data->breaksound, ps[screenpeek].GetActor()); // this is nonsense but what the original code did.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VMValue args[7] = { sectp, data->brokentex, data->breaksound.index() };
|
||||||
|
VMCall(data->handler, args, 3, nullptr, 0);
|
||||||
|
}
|
||||||
|
if (data->flags & 1)
|
||||||
|
{
|
||||||
|
if (!sectp->hitag)
|
||||||
|
{
|
||||||
|
DukeSectIterator it(sectp);
|
||||||
|
while (auto act = it.Next())
|
||||||
|
{
|
||||||
|
if (iseffector(act) && act->spr.lotag == SE_12_LIGHT_SWITCH)
|
||||||
|
{
|
||||||
|
DukeStatIterator it1(STAT_EFFECTOR);
|
||||||
|
while (auto act2 = it1.Next())
|
||||||
|
{
|
||||||
|
if (act2->spr.hitag == act->spr.hitag)
|
||||||
|
act2->temp_data[3] = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int j = krand() & 1;
|
||||||
|
DukeStatIterator it(STAT_EFFECTOR);
|
||||||
|
while (auto act = it.Next())
|
||||||
|
{
|
||||||
|
if (act->spr.hitag == (sectp->hitag) && act->spr.lotag == SE_3_RANDOM_LIGHTS_AFTER_SHOT_OUT)
|
||||||
|
{
|
||||||
|
act->temp_data[2] = j;
|
||||||
|
act->temp_data[4] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data->flags & 2)
|
||||||
|
{
|
||||||
|
ceilingglass(ps[myconnectindex].GetActor(), sectp, 10);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
void allignwarpelevators(void)
|
void allignwarpelevators(void)
|
||||||
{
|
{
|
||||||
DukeStatIterator it(STAT_EFFECTOR);
|
DukeStatIterator it(STAT_EFFECTOR);
|
||||||
|
|
|
@ -599,82 +599,6 @@ void checkplayerhurt_d(player_struct* p, const Collision& coll)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool checkhitceiling_d(sectortype* sectp)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
switch (sectp->ceilingpicnum)
|
|
||||||
{
|
|
||||||
case DTILE_WALLLIGHT1:
|
|
||||||
case DTILE_WALLLIGHT2:
|
|
||||||
case DTILE_WALLLIGHT3:
|
|
||||||
case DTILE_WALLLIGHT4:
|
|
||||||
case DTILE_TECHLIGHT2:
|
|
||||||
case DTILE_TECHLIGHT4:
|
|
||||||
|
|
||||||
ceilingglass(ps[myconnectindex].GetActor(), sectp, 10);
|
|
||||||
S_PlayActorSound(GLASS_BREAKING, ps[screenpeek].GetActor());
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_WALLLIGHT1)
|
|
||||||
sectp->ceilingpicnum = DTILE_WALLLIGHTBUST1;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_WALLLIGHT2)
|
|
||||||
sectp->ceilingpicnum = DTILE_WALLLIGHTBUST2;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_WALLLIGHT3)
|
|
||||||
sectp->ceilingpicnum = DTILE_WALLLIGHTBUST3;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_WALLLIGHT4)
|
|
||||||
sectp->ceilingpicnum = DTILE_WALLLIGHTBUST4;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_TECHLIGHT2)
|
|
||||||
sectp->ceilingpicnum = DTILE_TECHLIGHTBUST2;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == DTILE_TECHLIGHT4)
|
|
||||||
sectp->ceilingpicnum = DTILE_TECHLIGHTBUST4;
|
|
||||||
|
|
||||||
|
|
||||||
if (!sectp->hitag)
|
|
||||||
{
|
|
||||||
DukeSectIterator it(sectp);
|
|
||||||
while (auto act = it.Next())
|
|
||||||
{
|
|
||||||
if (iseffector(act) && act->spr.lotag == SE_12_LIGHT_SWITCH)
|
|
||||||
{
|
|
||||||
DukeStatIterator it1(STAT_EFFECTOR);
|
|
||||||
while (auto act2 = it1.Next())
|
|
||||||
{
|
|
||||||
if (act2->spr.hitag == act->spr.hitag)
|
|
||||||
act2->temp_data[3] = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
j = krand() & 1;
|
|
||||||
DukeStatIterator it(STAT_EFFECTOR);
|
|
||||||
while (auto act = it.Next())
|
|
||||||
{
|
|
||||||
if (act->spr.hitag == (sectp->hitag) && act->spr.lotag == 3)
|
|
||||||
{
|
|
||||||
act->temp_data[2] = j;
|
|
||||||
act->temp_data[4] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void checkhitdefault_d(DDukeActor* targ, DDukeActor* proj)
|
void checkhitdefault_d(DDukeActor* targ, DDukeActor* proj)
|
||||||
{
|
{
|
||||||
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT)
|
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT)
|
||||||
|
|
|
@ -721,107 +721,6 @@ void checkplayerhurt_r(player_struct* p, const Collision &coll)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool checkhitceiling_r(sectortype* sectp)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
switch (sectp->ceilingpicnum)
|
|
||||||
{
|
|
||||||
case RTILE_WALLLIGHT1:
|
|
||||||
case RTILE_WALLLIGHT3:
|
|
||||||
case RTILE_WALLLIGHT4:
|
|
||||||
case RTILE_TECHLIGHT2:
|
|
||||||
case RTILE_TECHLIGHT4:
|
|
||||||
case RTILE_RRTILE1939:
|
|
||||||
case RTILE_RRTILE1986:
|
|
||||||
case RTILE_RRTILE1988:
|
|
||||||
case RTILE_RRTILE2123:
|
|
||||||
case RTILE_RRTILE2125:
|
|
||||||
case RTILE_RRTILE2878:
|
|
||||||
case RTILE_RRTILE2898:
|
|
||||||
|
|
||||||
|
|
||||||
ceilingglass(ps[myconnectindex].GetActor(), sectp, 10);
|
|
||||||
S_PlayActorSound(GLASS_BREAKING, ps[screenpeek].GetActor());
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_WALLLIGHT1)
|
|
||||||
sectp->ceilingpicnum = RTILE_WALLLIGHTBUST1;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_WALLLIGHT3)
|
|
||||||
sectp->ceilingpicnum = RTILE_WALLLIGHTBUST3;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_WALLLIGHT4)
|
|
||||||
sectp->ceilingpicnum = RTILE_WALLLIGHTBUST4;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_TECHLIGHT2)
|
|
||||||
sectp->ceilingpicnum = RTILE_TECHLIGHTBUST2;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_TECHLIGHT4)
|
|
||||||
sectp->ceilingpicnum = RTILE_TECHLIGHTBUST4;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE1986)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE1987;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE1939)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2004;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE1988)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2005;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE2898)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2899;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE2878)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2879;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE2123)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2124;
|
|
||||||
|
|
||||||
if (sectp->ceilingpicnum == RTILE_RRTILE2125)
|
|
||||||
sectp->ceilingpicnum = RTILE_RRTILE2126;
|
|
||||||
|
|
||||||
|
|
||||||
if (!sectp->hitag)
|
|
||||||
{
|
|
||||||
DukeSectIterator it(sectp);
|
|
||||||
while (auto act1 = it.Next())
|
|
||||||
{
|
|
||||||
if (iseffector(act1) && (act1->spr.lotag == SE_12_LIGHT_SWITCH || (isRRRA() && (act1->spr.lotag == 47 || act1->spr.lotag == 48))))
|
|
||||||
{
|
|
||||||
DukeStatIterator itr(STAT_EFFECTOR);
|
|
||||||
while (auto act2 = itr.Next())
|
|
||||||
{
|
|
||||||
if (act2->spr.hitag == act1->spr.hitag)
|
|
||||||
act2->temp_data[3] = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
j = krand() & 1;
|
|
||||||
DukeStatIterator it(STAT_EFFECTOR);
|
|
||||||
while (auto act1 = it.Next())
|
|
||||||
{
|
|
||||||
if (act1->spr.hitag == (sectp->hitag) && act1->spr.lotag == 3)
|
|
||||||
{
|
|
||||||
act1->temp_data[2] = j;
|
|
||||||
act1->temp_data[4] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void checkhitdefault_r(DDukeActor* targ, DDukeActor* proj)
|
void checkhitdefault_r(DDukeActor* targ, DDukeActor* proj)
|
||||||
{
|
{
|
||||||
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == 0)
|
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == 0)
|
||||||
|
|
|
@ -1343,7 +1343,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, checkhitwall, duke_checkhitwall)
|
||||||
|
|
||||||
void duke_checkhitceiling(sectortype* sect, DDukeActor* actor)
|
void duke_checkhitceiling(sectortype* sect, DDukeActor* actor)
|
||||||
{
|
{
|
||||||
fi.checkhitceiling(sect); // actor is currently unused, this may change.
|
checkhitceiling(sect); // actor is currently unused, this may change.
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, checkhitceiling, duke_checkhitceiling)
|
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, checkhitceiling, duke_checkhitceiling)
|
||||||
|
@ -1351,7 +1351,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, checkhitceiling, duke_checkhitceiling)
|
||||||
PARAM_PROLOGUE;
|
PARAM_PROLOGUE;
|
||||||
PARAM_POINTER(wal, sectortype);
|
PARAM_POINTER(wal, sectortype);
|
||||||
PARAM_POINTER(act, DDukeActor);
|
PARAM_POINTER(act, DDukeActor);
|
||||||
fi.checkhitceiling(wal);
|
checkhitceiling(wal);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,3 +58,13 @@ breakwalls
|
||||||
TECHLIGHT4 = TECHLIGHTBUST4, "", "DukeBreakWalls.LightBreak"
|
TECHLIGHT4 = TECHLIGHTBUST4, "", "DukeBreakWalls.LightBreak"
|
||||||
ATM = ATMBROKE, "GLASS_HEAVYBREAK", "DukeBreakWalls.ATMBreak"
|
ATM = ATMBROKE, "GLASS_HEAVYBREAK", "DukeBreakWalls.ATMBreak"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
breakceiling
|
||||||
|
{
|
||||||
|
WALLLIGHT1 = WALLLIGHTBUST1, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
WALLLIGHT2 = WALLLIGHTBUST2, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
WALLLIGHT3 = WALLLIGHTBUST3, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
WALLLIGHT4 = WALLLIGHTBUST4, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
TECHLIGHT2 = TECHLIGHTBUST2, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
TECHLIGHT4 = TECHLIGHTBUST4, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,23 @@ breakwalls
|
||||||
PICKUPFRONT = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
PICKUPFRONT = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
||||||
PICKUPBACK1 = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
PICKUPBACK1 = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
||||||
PICKUPBACK2 = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
PICKUPBACK2 = "", "TRUKDIE", "RedneckBreakwalls.PickupHit"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
breakceiling
|
||||||
|
{
|
||||||
|
WALLLIGHT1 = WALLLIGHTBUST1, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
WALLLIGHT3 = WALLLIGHTBUST3, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
WALLLIGHT4 = WALLLIGHTBUST4, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
TECHLIGHT2 = TECHLIGHTBUST2, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
TECHLIGHT4 = TECHLIGHTBUST4, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE1986 = RRTILE1987, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE1939 = RRTILE2004, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE1988 = RRTILE2005, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE2898 = RRTILE2899, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE2878 = RRTILE2879, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE2123 = RRTILE2124, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
RRTILE2125 = RRTILE2126, "GLASS_BREAKING", lightsout, ceilingglass
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue