- first xwall[] removal in Blood.

This commit is contained in:
Christoph Oelckers 2021-11-19 01:12:05 +01:00
parent 19f3365efc
commit 70da9e2526
4 changed files with 33 additions and 29 deletions

View file

@ -4551,20 +4551,19 @@ static void ProcessTouchObjects(DBloodActor* actor)
// Touch walls
Collision coll = actor->hit.hit;
int nHWall = -1;
walltype* pHWall = nullptr;
if (coll.type == kHitWall)
{
nHWall = coll.index;
if (wallRangeIsFine(nHWall) && xwallRangeIsFine(wall[nHWall].extra))
pHWall = coll.wall();
if (pHWall && pHWall->hasX())
{
XWALL* pXHWall = &xwall[wall[nHWall].extra];
if (pXHWall->triggerTouch && !pXHWall->isTriggered && (!pXHWall->dudeLockout || actor->IsPlayerActor()))
trTriggerWall(nHWall, pXHWall, kCmdWallTouch);
if (pHWall->xw().triggerTouch && !pHWall->xw().isTriggered && (!pHWall->xw().dudeLockout || actor->IsPlayerActor()))
trTriggerWall(pHWall, kCmdWallTouch);
}
}
// enough to reset SpriteHit values
if (nHWall != -1 || actor2) actor->xvel += 5;
if (pHWall != nullptr || actor2) actor->xvel += 5;
}
#endif

View file

@ -609,9 +609,9 @@ void evSendSector(int index, int rxId, COMMAND_ID command)
evSend(nullptr, index, SS_SECTOR, rxId, command);
}
void evSendWall(int index, int rxId, COMMAND_ID command)
void evSendWall(walltype* wal, int rxId, COMMAND_ID command)
{
evSend(nullptr, index, SS_WALL, rxId, command);
evSend(nullptr, wallnum(wal), SS_WALL, rxId, command);
}
//---------------------------------------------------------------------------

View file

@ -87,9 +87,9 @@ bool SetWallState(int nWall, XWALL *pXWall, int nState)
if (pXWall->txID)
{
if (pXWall->command != kCmdLink && pXWall->triggerOn && pXWall->state)
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(&wall[nWall], pXWall->txID, (COMMAND_ID)pXWall->command);
if (pXWall->command != kCmdLink && pXWall->triggerOff && !pXWall->state)
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(&wall[nWall], pXWall->txID, (COMMAND_ID)pXWall->command);
}
return 1;
}
@ -646,9 +646,9 @@ void SetupGibWallState(walltype *pWall, XWALL *pXWall)
}
}
void OperateWall(int nWall, XWALL *pXWall, EVENT event) {
walltype *pWall = &wall[nWall];
void OperateWall(walltype* pWall, EVENT event) {
auto pXWall = &pWall->xw();
switch (event.cmd) {
case kCmdLock:
pXWall->locked = 1;
@ -662,24 +662,24 @@ void OperateWall(int nWall, XWALL *pXWall, EVENT event) {
}
#ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateWall(nWall, pWall, pXWall, event))
if (gModernMap && modernTypeOperateWall(wallnum(pWall), pWall, pXWall, event))
return;
#endif
switch (pWall->type) {
case kWallGib:
if (GetWallType(nWall) != pWall->type) break;
if (GetWallType(wallnum(pWall)) != pWall->type) break;
bool bStatus;
switch (event.cmd) {
case kCmdOn:
case kCmdWallImpact:
bStatus = SetWallState(nWall, pXWall, 1);
bStatus = SetWallState(wallnum(pWall), pXWall, 1);
break;
case kCmdOff:
bStatus = SetWallState(nWall, pXWall, 0);
bStatus = SetWallState(wallnum(pWall), pXWall, 0);
break;
default:
bStatus = SetWallState(nWall, pXWall, pXWall->state ^ 1);
bStatus = SetWallState(wallnum(pWall), pXWall, pXWall->state ^ 1);
break;
}
@ -689,20 +689,20 @@ void OperateWall(int nWall, XWALL *pXWall, EVENT event) {
CGibVelocity vel(100, 100, 250);
int nType = ClipRange(pXWall->data, 0, 31);
if (nType > 0)
GibWall(nWall, (GIBTYPE)nType, &vel);
GibWall(wallnum(pWall), (GIBTYPE)nType, &vel);
}
}
return;
default:
switch (event.cmd) {
case kCmdOff:
SetWallState(nWall, pXWall, 0);
SetWallState(wallnum(pWall), pXWall, 0);
break;
case kCmdOn:
SetWallState(nWall, pXWall, 1);
SetWallState(wallnum(pWall), pXWall, 1);
break;
default:
SetWallState(nWall, pXWall, pXWall->state ^ 1);
SetWallState(wallnum(pWall), pXWall, pXWall->state ^ 1);
break;
}
return;
@ -1738,20 +1738,21 @@ void trTriggerSector(unsigned int nSector, XSECTOR *pXSector, int command) {
}
}
void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command) {
assert(nWall < (unsigned int)numwalls);
void trTriggerWall(walltype* pWall, int command)
{
auto pXWall = &pWall->xw();
if (!pXWall->locked && !pXWall->isTriggered) {
if (pXWall->triggerOnce)
pXWall->isTriggered = 1;
if (pXWall->decoupled && pXWall->txID > 0)
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(pWall, pXWall->txID, (COMMAND_ID)pXWall->command);
else {
EVENT event;
event.cmd = command;
OperateWall(nWall, pXWall, event);
OperateWall(pWall, event);
}
}
@ -1815,7 +1816,7 @@ void trMessageWall(unsigned int nWall, EVENT event) {
break;
#endif
default:
OperateWall(nWall, pXWall, event);
OperateWall(&wall[nWall], event);
break;
}
}

View file

@ -55,7 +55,11 @@ extern int gBusyCount;
void trTriggerSector(unsigned int nSector, XSECTOR *pXSector, int command);
void trMessageSector(unsigned int nSector, EVENT event);
void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command);
void trTriggerWall(walltype*, int command);
inline void trTriggerWall(unsigned int nWall, XWALL* pXWall, int command)
{
trTriggerWall(&wall[nWall], command);
}
void trMessageWall(unsigned int nWall, EVENT event);
void trTriggerSprite(DBloodActor* actor, int command);
void trMessageSprite(DBloodActor* actor, EVENT event);