- migrated the rest of the switch code to use the external data.

This commit is contained in:
Christoph Oelckers 2022-12-11 15:42:33 +01:00
parent 0c0199fbdc
commit 95a2b85fae
8 changed files with 194 additions and 471 deletions

View file

@ -39,8 +39,8 @@ void animatewalls_d(void);
void animatewalls_r(void);
void operateforcefields_r(DDukeActor* act, int low);
void operateforcefields_d(DDukeActor* act, int low);
bool checkhitswitch_d(int snum, walltype* w, DDukeActor *act);
bool checkhitswitch_r(int snum, walltype* w, DDukeActor* act);
bool checkaccessswitch_d(int snum, int pal, DDukeActor *act, walltype* w);
bool checkaccessswitch_r(int snum, int pal, DDukeActor* act, walltype* w);
void activatebysector_d(sectortype* sect, DDukeActor* j);
void activatebysector_r(sectortype* sect, DDukeActor* j);
void checkhitsprite_d(DDukeActor* i, DDukeActor* sn);
@ -101,7 +101,7 @@ void SetDispatcher()
initactorflags_d,
animatewalls_d,
operateforcefields_d,
checkhitswitch_d,
checkaccessswitch_d,
activatebysector_d,
checkhitsprite_d,
checkhitdefault_d,
@ -137,7 +137,7 @@ void SetDispatcher()
initactorflags_r,
animatewalls_r,
operateforcefields_r,
checkhitswitch_r,
checkaccessswitch_r,
activatebysector_r,
checkhitsprite_r,
checkhitdefault_r,
@ -185,8 +185,6 @@ int TILE_WATERBUBBLE;
int TILE_SMALLSMOKE;
int TILE_BLOODPOOL;
int TILE_CLOUDYSKIES;
int TILE_ACCESSSWITCH;
int TILE_ACCESSSWITCH2;
int TILE_HEN;
int TILE_MIRRORBROKE;
int TILE_LOADSCREEN;

View file

@ -75,7 +75,7 @@ struct Dispatcher
void (*initactorflags)();
void (*animatewalls)();
void (*operateforcefields)(DDukeActor* act, int low);
bool (*checkhitswitch)(int snum, walltype* w, DDukeActor* act);
bool (*checkaccessswitch)(int snum, int switchpal, DDukeActor* act, walltype* w);
void (*activatebysector)(sectortype* sect, DDukeActor* j);
void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn);
void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn);

View file

@ -220,6 +220,7 @@ bool movementBlocked(player_struct *p);
void loadcons();
void DrawStatusBar();
void thunder(void);
bool checkhitswitch(int snum, walltype* wwal, DDukeActor* act);
void drawshadows(tspriteArray& tsprites, tspritetype* t, DDukeActor* h);
void applyanimations(tspritetype* t, DDukeActor* h, const DVector2& viewVec, DAngle viewang);

View file

@ -271,7 +271,7 @@ static void shootknee(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
if (hit.actor() && ! isaccessswitch(hit.actor()->spr.spritetexture()))
{
fi.checkhitsprite(hit.actor(), knee);
if (p >= 0) fi.checkhitswitch(p, nullptr, hit.actor());
if (p >= 0) checkhitswitch(p, nullptr, hit.actor());
}
else if (hit.hitWall)
@ -284,7 +284,7 @@ static void shootknee(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
if (!isaccessswitch(hit.hitWall->walltexture()))
{
checkhitwall(knee, hit.hitWall, hit.hitpos);
if (p >= 0) fi.checkhitswitch(p, hit.hitWall, nullptr);
if (p >= 0) checkhitswitch(p, hit.hitWall, nullptr);
}
}
}
@ -443,7 +443,7 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int
if (p >= 0 && isshootableswitch(hit.actor()->spr.spritetexture()))
{
fi.checkhitswitch(p, nullptr, hit.actor());
checkhitswitch(p, nullptr, hit.actor());
return;
}
}
@ -457,7 +457,7 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int
goto SKIPBULLETHOLE;
if (p >= 0 && isshootableswitch(hit.hitWall->walltexture()))
{
fi.checkhitswitch(p, hit.hitWall, nullptr);
checkhitswitch(p, hit.hitWall, nullptr);
return;
}
@ -1507,7 +1507,7 @@ int doincrements_d(player_struct* p)
{
if (p->access_spritenum != nullptr)
{
fi.checkhitswitch(snum, nullptr, p->access_spritenum);
checkhitswitch(snum, nullptr, p->access_spritenum);
switch (p->access_spritenum->spr.pal)
{
case 0:p->got_access &= (0xffff - 0x1); break;
@ -1518,7 +1518,7 @@ int doincrements_d(player_struct* p)
}
else
{
fi.checkhitswitch(snum, p->access_wall, nullptr);
checkhitswitch(snum, p->access_wall, nullptr);
switch (p->access_wall->pal)
{
case 0:p->got_access &= (0xffff - 0x1); break;

View file

@ -163,7 +163,7 @@ static void shootmelee(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int a
if (hit.actor() && !isaccessswitch(hit.actor()->spr.spritetexture()))
{
fi.checkhitsprite(hit.actor(), wpn);
if (p >= 0) fi.checkhitswitch(p, nullptr, hit.actor());
if (p >= 0) checkhitswitch(p, nullptr, hit.actor());
}
else if (hit.hitWall)
{
@ -175,7 +175,7 @@ static void shootmelee(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int a
if (!isaccessswitch(hit.hitWall->walltexture()))
{
checkhitwall(wpn, hit.hitWall, hit.hitpos);
if (p >= 0) fi.checkhitswitch(p, hit.hitWall, nullptr);
if (p >= 0) checkhitswitch(p, hit.hitWall, nullptr);
}
}
}
@ -336,7 +336,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int
if (p >= 0 && isshootableswitch(hit.actor()->spr.spritetexture()))
{
fi.checkhitswitch(p, nullptr, hit.actor());
checkhitswitch(p, nullptr, hit.actor());
return;
}
}
@ -350,7 +350,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int
goto SKIPBULLETHOLE;
if (p >= 0 && isshootableswitch(hit.hitWall->walltexture()))
{
fi.checkhitswitch(p, hit.hitWall, nullptr);
checkhitswitch(p, hit.hitWall, nullptr);
return;
}
@ -1286,7 +1286,7 @@ int doincrements_r(player_struct* p)
{
if (p->access_spritenum != nullptr)
{
fi.checkhitswitch(snum, nullptr, p->access_spritenum);
checkhitswitch(snum, nullptr, p->access_spritenum);
switch (p->access_spritenum->spr.pal)
{
case 0:p->keys[1] = 1; break;
@ -1297,7 +1297,7 @@ int doincrements_r(player_struct* p)
}
else
{
fi.checkhitswitch(snum, p->access_wall, nullptr);
checkhitswitch(snum, p->access_wall, nullptr);
switch (p->access_wall->pal)
{
case 0:p->keys[1] = 1; break;

View file

@ -1489,7 +1489,7 @@ void tag10000specialswitch(int snum, DDukeActor* act, const DVector3& v)
{
switches[j]->spr.hitag = 0;
switches[j]->spr.setspritetexture(::switches[GetExtInfo(switches[j]->spr.spritetexture()).switchindex].states[3]);
fi.checkhitswitch(snum, nullptr, switches[j]);
checkhitswitch(snum, nullptr, switches[j]);
}
}
}
@ -1597,4 +1597,173 @@ void togglewallswitches(walltype* wwal, const TexExtInfo& ext, int lotag, int& c
}
}
//---------------------------------------------------------------------------
//
// how NOT to implement switches...
// (even after cleaning up the hard coded texture checks it's still a disaster)
//
//---------------------------------------------------------------------------
bool checkhitswitch(int snum, walltype* wwal, DDukeActor* act)
{
uint8_t switchpal;
int lotag, hitag, correctdips, numdips;
DVector2 spos;
FTextureID texid;
if (wwal == nullptr && act == nullptr) return 0;
correctdips = 1;
numdips = 0;
if (act)
{
lotag = act->spr.lotag;
if (lotag == 0) return 0;
hitag = act->spr.hitag;
spos = act->spr.pos.XY();
texid = act->spr.spritetexture();
switchpal = act->spr.pal;
// custom switches that maintain themselves can immediately abort.
if (CallTriggerSwitch(act, &ps[snum])) return true;
}
else
{
lotag = wwal->lotag;
if (lotag == 0) return 0;
hitag = wwal->hitag;
spos = wwal->pos;
texid = wwal->walltexture();
switchpal = wwal->pal;
}
auto& ext = GetExtInfo(texid);
auto& swdef = switches[ext.switchindex];
// check if the switch may be activated.
switch (swdef.type)
{
case SwitchDef::Combo:
break;
case SwitchDef::Access:
if (!fi.checkaccessswitch(snum, switchpal, act, wwal))
return 0;
[[fallthrough]];
case SwitchDef::Regular:
case SwitchDef::Multi:
if (check_activator_motion(lotag)) return 0;
break;
default:
if (isadoorwall(texid) == 0) return 0;
break;
}
togglespriteswitches(act, ext, lotag, correctdips, numdips);
togglewallswitches(wwal, ext, lotag, correctdips, numdips);
if (lotag == -1)
{
setnextmap(false);
return 1;
}
DVector3 v(spos, ps[snum].GetActor()->getOffsetZ());
// Yet another crude RRRA hack that cannot be fully generalized.
if (hitag == 10001 && swdef.flags & SwitchDef::oneway && isRRRA())
{
act->spr.setspritetexture(swdef.states[1]);
if (ps[snum].SeaSick == 0)
ps[snum].SeaSick = 350;
operateactivators(668, &ps[snum]);
operatemasterswitches(668);
S_PlayActorSound(328, ps[snum].GetActor());
return 1;
}
if (swdef.type != SwitchDef::None || isadoorwall(texid))
{
if (swdef.type == SwitchDef::Combo)
{
FSoundID sound = swdef.soundid != NO_SOUND ? swdef.soundid : S_FindSoundByResID(SWITCH_ON);
if (act) S_PlaySound3D(sound, act, v);
else S_PlaySound3D(sound, ps[snum].GetActor(), v);
if (numdips != correctdips) return 0;
S_PlaySound3D(END_OF_LEVEL_WARN, ps[snum].GetActor(), v);
}
if (swdef.type == SwitchDef::Multi)
{
lotag += ext.switchphase;
if (hitag == 10000 && act && isRRRA()) // no idea if the game check is really needed for something this far off the beaten path...
{
tag10000specialswitch(snum, act, v);
return 1;
}
}
DukeStatIterator itr(STAT_EFFECTOR);
while (auto other = itr.Next())
{
if (other->spr.hitag == lotag)
{
switch (other->spr.lotag)
{
case 46:
case SE_47_LIGHT_SWITCH:
case SE_48_LIGHT_SWITCH:
if (!isRRRA()) break;
[[fallthrough]];
case SE_12_LIGHT_SWITCH:
other->sector()->floorpal = 0;
other->temp_data[0]++;
if (other->temp_data[0] == 2)
other->temp_data[0]++;
break;
case SE_24_CONVEYOR:
case SE_34:
case SE_25_PISTON:
other->temp_data[4] = !other->temp_data[4];
if (other->temp_data[4])
FTA(15, &ps[snum]);
else FTA(2, &ps[snum]);
break;
case SE_21_DROP_FLOOR:
FTA(2, &ps[screenpeek]);
break;
}
}
}
operateactivators(lotag, &ps[snum]);
fi.operateforcefields(ps[snum].GetActor(), lotag);
operatemasterswitches(lotag);
if (swdef.type == SwitchDef::Combo) return 1;
if (hitag == 0 && isadoorwall(texid) == 0)
{
FSoundID sound = swdef.soundid != NO_SOUND ? swdef.soundid : S_FindSoundByResID(SWITCH_ON);
if (act) S_PlaySound3D(sound, act, v);
else S_PlaySound3D(sound, ps[snum].GetActor(), v);
}
else if (hitag != 0)
{
auto flags = S_GetUserFlags(hitag);
if (act && (flags & SF_TALK) == 0)
S_PlaySound3D(hitag, act, v);
else
S_PlayActorSound(hitag, ps[snum].GetActor());
}
return 1;
}
return 0;
}
END_DUKE_NS

View file

@ -198,206 +198,6 @@ bool checkaccessswitch_d(int snum, int switchpal, DDukeActor* act, walltype* wwa
return 0;
}
//---------------------------------------------------------------------------
//
// how NOT to implement switch animations...
//
//---------------------------------------------------------------------------
void togglespriteswitches(DDukeActor* act, const TexExtInfo& ext, int lotag, int& correctdips, int& numdips);
void togglewallswitches(walltype* wwal, const TexExtInfo& ext, int lotag, int& correctdips, int& numdips);
bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act)
{
uint8_t switchpal;
int lotag, hitag, picnum, correctdips, numdips;
DVector2 spos;
FTextureID texid;
if (wwal == nullptr && act == nullptr) return 0;
correctdips = 1;
numdips = 0;
if (act)
{
lotag = act->spr.lotag;
if (lotag == 0) return 0;
hitag = act->spr.hitag;
spos = act->spr.pos.XY();
picnum = act->spr.picnum;
switchpal = act->spr.pal;
// custom switches that maintain themselves can immediately abort.
if (CallTriggerSwitch(act, &ps[snum])) return true;
}
else
{
lotag = wwal->lotag;
if (lotag == 0) return 0;
hitag = wwal->hitag;
spos = wwal->pos;
picnum = wwal->wallpicnum;
switchpal = wwal->pal;
}
texid = tileGetTextureID(picnum);
auto& ext = GetExtInfo(texid);
auto& swdef = switches[ext.switchindex];
switch (swdef.type)
{
case SwitchDef::Combo:
break;
case SwitchDef::Access:
if (checkaccessswitch_d(snum, switchpal, act, wwal))
return 0;
[[fallthrough]];
case SwitchDef::Regular:
case SwitchDef::Multi:
if (check_activator_motion(lotag)) return 0;
break;
default:
if (isadoorwall(texid) == 0) return 0;
break;
}
togglespriteswitches(act, ext, lotag, correctdips, numdips);
togglewallswitches(wwal, ext, lotag, correctdips, numdips);
if (lotag == -1)
{
setnextmap(false);
return 1;
}
DVector3 v(spos, ps[snum].GetActor()->getOffsetZ());
switch (picnum)
{
default:
if (isadoorwall(texid) == 0) break;
[[fallthrough]];
case DTILE_DIPSWITCH:
case DTILE_DIPSWITCHON:
case DTILE_TECHSWITCH:
case DTILE_TECHSWITCHON:
case DTILE_ALIENSWITCH:
case DTILE_ALIENSWITCHON:
if (picnum == DTILE_DIPSWITCH || picnum == DTILE_DIPSWITCHON ||
picnum == DTILE_ALIENSWITCH || picnum == DTILE_ALIENSWITCHON ||
picnum == DTILE_TECHSWITCH || picnum == DTILE_TECHSWITCHON)
{
if (picnum == DTILE_ALIENSWITCH || picnum == DTILE_ALIENSWITCHON)
{
if (act)
S_PlaySound3D(ALIEN_SWITCH1, act, v);
else S_PlaySound3D(ALIEN_SWITCH1, ps[snum].GetActor(), v);
}
else
{
if (act)
S_PlaySound3D(SWITCH_ON, act, v);
else S_PlaySound3D(SWITCH_ON, ps[snum].GetActor(), v);
}
if (numdips != correctdips) break;
S_PlaySound3D(END_OF_LEVEL_WARN, ps[snum].GetActor(), v);
}
[[fallthrough]];
case DTILE_DIPSWITCH2:
case DTILE_DIPSWITCH2ON:
case DTILE_DIPSWITCH3:
case DTILE_DIPSWITCH3ON:
case DTILE_MULTISWITCH:
case DTILE_MULTISWITCH_2:
case DTILE_MULTISWITCH_3:
case DTILE_MULTISWITCH_4:
case DTILE_ACCESSSWITCH:
case DTILE_ACCESSSWITCH2:
case DTILE_SLOTDOOR:
case DTILE_SLOTDOORON:
case DTILE_LIGHTSWITCH:
case DTILE_LIGHTSWITCHON:
case DTILE_SPACELIGHTSWITCH:
case DTILE_SPACELIGHTSWITCHON:
case DTILE_SPACEDOORSWITCH:
case DTILE_SPACEDOORSWITCHON:
case DTILE_FRANKENSTINESWITCH:
case DTILE_FRANKENSTINESWITCHON:
case DTILE_LIGHTSWITCH2:
case DTILE_LIGHTSWITCH2ON:
case DTILE_POWERSWITCH1:
case DTILE_POWERSWITCH1ON:
case DTILE_LOCKSWITCH1:
case DTILE_LOCKSWITCH1ON:
case DTILE_POWERSWITCH2:
case DTILE_POWERSWITCH2ON:
case DTILE_HANDSWITCH:
case DTILE_HANDSWITCHON:
case DTILE_PULLSWITCH:
case DTILE_PULLSWITCHON:
if (picnum == DTILE_MULTISWITCH || picnum == (DTILE_MULTISWITCH_2) ||
picnum == (DTILE_MULTISWITCH_3) || picnum == (DTILE_MULTISWITCH_4))
lotag += picnum - DTILE_MULTISWITCH;
DukeStatIterator itr(STAT_EFFECTOR);
while (auto other = itr.Next())
{
if (other->spr.hitag == lotag)
{
switch (other->spr.lotag)
{
case SE_12_LIGHT_SWITCH:
other->sector()->floorpal = 0;
other->temp_data[0]++;
if (other->temp_data[0] == 2)
other->temp_data[0]++;
break;
case SE_24_CONVEYOR:
case SE_34:
case SE_25_PISTON:
other->temp_data[4] = !other->temp_data[4];
if (other->temp_data[4])
FTA(15, &ps[snum]);
else FTA(2, &ps[snum]);
break;
case SE_21_DROP_FLOOR:
FTA(2, &ps[screenpeek]);
break;
}
}
}
operateactivators(lotag, &ps[snum]);
fi.operateforcefields(ps[snum].GetActor(), lotag);
operatemasterswitches(lotag);
if (picnum == DTILE_DIPSWITCH || picnum == DTILE_DIPSWITCHON ||
picnum == DTILE_ALIENSWITCH || picnum == DTILE_ALIENSWITCHON ||
picnum == DTILE_TECHSWITCH || picnum == DTILE_TECHSWITCHON) return 1;
if (hitag == 0 && isadoorwall(texid) == 0)
{
if (act)
S_PlaySound3D(SWITCH_ON, act, v);
else S_PlaySound3D(SWITCH_ON, ps[snum].GetActor(), v);
}
else if (hitag != 0)
{
auto flags = S_GetUserFlags(hitag);
if (act && (flags & SF_TALK) == 0)
S_PlaySound3D(hitag, act, v);
else
S_PlayActorSound(hitag, ps[snum].GetActor());
}
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
//
//
@ -755,7 +555,7 @@ void checksectors_d(int snum)
auto const neartagsprite = near.actor();
if (neartagsprite != nullptr)
{
if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return;
if (checkhitswitch(snum, nullptr, neartagsprite)) return;
if (CallOnUse(neartagsprite, p))
return;
@ -782,7 +582,7 @@ void checksectors_d(int snum)
if (near.hitWall->lotag > 0 && isadoorwall(near.hitWall->walltexture()))
{
if (hitscanwall == near.hitWall || hitscanwall == nullptr)
fi.checkhitswitch(snum, near.hitWall, nullptr);
checkhitswitch(snum, near.hitWall, nullptr);
return;
}
else if (p->newOwner != nullptr)
@ -813,7 +613,7 @@ void checksectors_d(int snum)
}
operatesectors(p->GetActor()->sector(), p->GetActor());
}
else fi.checkhitswitch(snum, near.hitWall, nullptr);
else checkhitswitch(snum, near.hitWall, nullptr);
}
}
}

View file

@ -168,251 +168,6 @@ bool checkaccessswitch_r(int snum, int switchpal, DDukeActor* act, walltype* wwa
return 0;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void tag10000specialswitch(int snum, DDukeActor* act, const DVector3& v);
void togglespriteswitches(DDukeActor* act, const TexExtInfo& ext, int lotag, int& correctdips, int& numdips);
void togglewallswitches(walltype* wwal, const TexExtInfo& ext, int lotag, int& correctdips, int& numdips);
bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act)
{
uint8_t switchpal;
int lotag, hitag, picnum, correctdips, numdips;
DVector2 pos;
FTextureID texid;
if (wwal == nullptr && act == nullptr) return 0;
correctdips = 1;
numdips = 0;
if (act)
{
lotag = act->spr.lotag;
if (lotag == 0) return 0;
hitag = act->spr.hitag;
pos = act->spr.pos.XY();
picnum = act->spr.picnum;
switchpal = act->spr.pal;
// custom switches that maintain themselves can immediately abort.
if (CallTriggerSwitch(act, &ps[snum])) return true;
}
else
{
lotag = wwal->lotag;
if (lotag == 0) return 0;
hitag = wwal->hitag;
pos = wwal->pos;
picnum = wwal->wallpicnum;
switchpal = wwal->pal;
}
texid = tileGetTextureID(picnum);
auto& ext = GetExtInfo(texid);
auto& swdef = switches[ext.switchindex];
switch (swdef.type)
{
case SwitchDef::Combo:
break;
case SwitchDef::Access:
if (checkaccessswitch_r(snum, switchpal, act, wwal))
return 0;
[[fallthrough]];
case SwitchDef::Regular:
case SwitchDef::Multi:
if (check_activator_motion(lotag)) return 0;
break;
default:
if (isadoorwall(texid) == 0) return 0;
break;
}
togglespriteswitches(act, ext, lotag, correctdips, numdips);
togglewallswitches(wwal, ext, lotag, correctdips, numdips);
if (lotag == -1)
{
setnextmap(false);
return 1;
}
DVector3 v(pos, ps[snum].GetActor()->getOffsetZ());
switch (picnum)
{
default:
if (isadoorwall(texid) == 0) break;
[[fallthrough]];
case RTILE_DIPSWITCH:
case RTILE_DIPSWITCHON:
case RTILE_TECHSWITCH:
case RTILE_TECHSWITCHON:
case RTILE_ALIENSWITCH:
case RTILE_ALIENSWITCHON:
if (picnum == RTILE_DIPSWITCH || picnum == RTILE_DIPSWITCHON ||
picnum == RTILE_ALIENSWITCH || picnum == RTILE_ALIENSWITCHON ||
picnum == RTILE_TECHSWITCH || picnum == RTILE_TECHSWITCHON)
{
if (picnum == RTILE_ALIENSWITCH || picnum == RTILE_ALIENSWITCHON)
{
if (act)
S_PlaySound3D(ALIEN_SWITCH1, act, v);
else S_PlaySound3D(ALIEN_SWITCH1, ps[snum].GetActor(), v);
}
else
{
if (act)
S_PlaySound3D(SWITCH_ON, act, v);
else S_PlaySound3D(SWITCH_ON, ps[snum].GetActor(), v);
}
if (numdips != correctdips) break;
S_PlaySound3D(END_OF_LEVEL_WARN, ps[snum].GetActor(), v);
}
goto goOn2;
case RTILE_MULTISWITCH2:
case RTILE_MULTISWITCH2_2:
case RTILE_MULTISWITCH2_3:
case RTILE_MULTISWITCH2_4:
case RTILE_IRONWHEELSWITCH:
case RTILE_BELLSWITCH:
if (!isRRRA()) break;
[[fallthrough]];
case RTILE_DIPSWITCH2:
case RTILE_DIPSWITCH2ON:
case RTILE_DIPSWITCH3:
case RTILE_DIPSWITCH3ON:
case RTILE_MULTISWITCH:
case RTILE_MULTISWITCH_2:
case RTILE_MULTISWITCH_3:
case RTILE_MULTISWITCH_4:
case RTILE_ACCESSSWITCH:
case RTILE_ACCESSSWITCH2:
case RTILE_SLOTDOOR:
case RTILE_SLOTDOORON:
case RTILE_LIGHTSWITCH:
case RTILE_LIGHTSWITCHON:
case RTILE_SPACELIGHTSWITCH:
case RTILE_SPACELIGHTSWITCHON:
case RTILE_SPACEDOORSWITCH:
case RTILE_SPACEDOORSWITCHON:
case RTILE_FRANKENSTINESWITCH:
case RTILE_FRANKENSTINESWITCHON:
case RTILE_LIGHTSWITCH2:
case RTILE_LIGHTSWITCH2ON:
case RTILE_POWERSWITCH1:
case RTILE_POWERSWITCH1ON:
case RTILE_LOCKSWITCH1:
case RTILE_LOCKSWITCH1ON:
case RTILE_POWERSWITCH2:
case RTILE_POWERSWITCH2ON:
case RTILE_HANDSWITCH:
case RTILE_HANDSWITCHON:
case RTILE_PULLSWITCH:
case RTILE_PULLSWITCHON:
case RTILE_ALERTSWITCH:
case RTILE_ALERTSWITCHON:
case RTILE_HANDLESWITCH:
case RTILE_HANDLESWITCHON:
goOn2:
if (isRRRA())
{
if (picnum == RTILE_IRONWHEELSWITCH)
{
act->spr.picnum = act->spr.picnum + 1;
if (hitag == 10001)
{
if (ps[snum].SeaSick == 0)
ps[snum].SeaSick = 350;
operateactivators(668, &ps[snum]);
operatemasterswitches(668);
S_PlayActorSound(328, ps[snum].GetActor());
return 1;
}
}
else if (hitag == 10000 && swdef.type == SwitchDef::Multi)
{
tag10000specialswitch(snum, act, v);
return 1;
}
}
if (picnum == RTILE_MULTISWITCH || picnum == (RTILE_MULTISWITCH_2) ||
picnum == (RTILE_MULTISWITCH_3) || picnum == (RTILE_MULTISWITCH_4))
lotag += picnum - RTILE_MULTISWITCH;
if (isRRRA())
{
if (picnum == RTILE_MULTISWITCH2 || picnum == (RTILE_MULTISWITCH2_2) ||
picnum == (RTILE_MULTISWITCH2_3) || picnum == (RTILE_MULTISWITCH2_4))
lotag += picnum - RTILE_MULTISWITCH2;
}
DukeStatIterator itr(STAT_EFFECTOR);
while (auto other = itr.Next())
{
if (other->spr.hitag == lotag)
{
switch (other->spr.lotag)
{
case 46:
case SE_47_LIGHT_SWITCH:
case SE_48_LIGHT_SWITCH:
if (!isRRRA()) break;
[[fallthrough]];
case SE_12_LIGHT_SWITCH:
other->sector()->floorpal = 0;
other->temp_data[0]++;
if (other->temp_data[0] == 2)
other->temp_data[0]++;
break;
case SE_24_CONVEYOR:
case SE_34:
case SE_25_PISTON:
other->temp_data[4] = !other->temp_data[4];
if (other->temp_data[4])
FTA(15, &ps[snum]);
else FTA(2, &ps[snum]);
break;
case SE_21_DROP_FLOOR:
FTA(2, &ps[screenpeek]);
break;
}
}
}
operateactivators(lotag, &ps[snum]);
fi.operateforcefields(ps[snum].GetActor(), lotag);
operatemasterswitches(lotag);
if (picnum == RTILE_DIPSWITCH || picnum == RTILE_DIPSWITCHON ||
picnum == RTILE_ALIENSWITCH || picnum == RTILE_ALIENSWITCHON ||
picnum == RTILE_TECHSWITCH || picnum == RTILE_TECHSWITCHON) return 1;
if (hitag == 0 && isadoorwall(texid) == 0)
{
if (act)
S_PlaySound3D(SWITCH_ON, act, v);
else S_PlaySound3D(SWITCH_ON, ps[snum].GetActor(), v);
}
else if (hitag != 0)
{
auto flags = S_GetUserFlags(hitag);
if (act && (flags & SF_TALK) == 0)
S_PlaySound3D(hitag, act, v);
else
S_PlayActorSound(hitag, ps[snum].GetActor());
}
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
//
//
@ -757,7 +512,7 @@ void checksectors_r(int snum)
auto const neartagsprite = near.actor();
if (neartagsprite != nullptr)
{
if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return;
if (checkhitswitch(snum, nullptr, neartagsprite)) return;
if (neartagsprite->GetClass() != RUNTIME_CLASS(DDukeActor))
{
@ -782,7 +537,7 @@ void checksectors_r(int snum)
if (near.hitWall->lotag > 0 && isadoorwall(near.hitWall->walltexture()))
{
if (hitscanwall == near.hitWall || hitscanwall == nullptr)
fi.checkhitswitch(snum, near.hitWall, nullptr);
checkhitswitch(snum, near.hitWall, nullptr);
return;
}
}
@ -827,7 +582,7 @@ void checksectors_r(int snum)
FTA(41, p);
}
}
else fi.checkhitswitch(snum, near.hitWall, nullptr);
else checkhitswitch(snum, near.hitWall, nullptr);
}
}
}