mirror of
https://github.com/ZDoom/Raze.git
synced 2024-12-13 06:01:28 +00:00
92bf1232da
Most are only needed internally or for very special uses and do not need any scripting consideration.
2912 lines
65 KiB
C++
2912 lines
65 KiB
C++
//-------------------------------------------------------------------------
|
|
/*
|
|
Copyright (C) 1996, 2003 - 3D Realms Entertainment
|
|
Copyright (C) 2017-2019 Nuke.YKT
|
|
Copyright (C) 2020 - Christoph Oelckers
|
|
|
|
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
|
|
|
Duke Nukem 3D is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
Original Source: 1996 - Todd Replogle
|
|
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
|
|
*/
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "ns.h"
|
|
#include "global.h"
|
|
#include "sounds.h"
|
|
#include "names_r.h"
|
|
#include "mapinfo.h"
|
|
#include "dukeactor.h"
|
|
|
|
// PRIMITIVE
|
|
BEGIN_DUKE_NS
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool isadoorwall_r(int dapic)
|
|
{
|
|
switch(dapic)
|
|
{
|
|
case DOORTILE1:
|
|
case DOORTILE2:
|
|
case DOORTILE3:
|
|
case DOORTILE4:
|
|
case DOORTILE5:
|
|
case DOORTILE6:
|
|
case DOORTILE7:
|
|
case DOORTILE8:
|
|
case DOORTILE9:
|
|
case DOORTILE10:
|
|
case DOORTILE11:
|
|
case DOORTILE12:
|
|
case DOORTILE14:
|
|
case DOORTILE15:
|
|
case DOORTILE16:
|
|
case DOORTILE17:
|
|
case DOORTILE18:
|
|
case DOORTILE19:
|
|
case DOORTILE20:
|
|
case DOORTILE21:
|
|
case DOORTILE22:
|
|
case RRTILE1856:
|
|
case RRTILE1877:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool isablockdoor(int dapic)
|
|
{
|
|
switch (dapic)
|
|
{
|
|
case RRTILE1792:
|
|
case RRTILE1801:
|
|
case RRTILE1805:
|
|
case RRTILE1807:
|
|
case RRTILE1808:
|
|
case RRTILE1812:
|
|
case RRTILE1821:
|
|
case RRTILE1826:
|
|
case RRTILE1850:
|
|
case RRTILE1851:
|
|
case RRTILE1856:
|
|
case RRTILE1877:
|
|
case RRTILE1938:
|
|
case RRTILE1942:
|
|
case RRTILE1944:
|
|
case RRTILE1945:
|
|
case RRTILE1951:
|
|
case RRTILE1961:
|
|
case RRTILE1964:
|
|
case RRTILE1985:
|
|
case RRTILE1995:
|
|
case RRTILE2022:
|
|
case RRTILE2052:
|
|
case RRTILE2053:
|
|
case RRTILE2060:
|
|
case RRTILE2074:
|
|
case RRTILE2132:
|
|
case RRTILE2136:
|
|
case RRTILE2139:
|
|
case RRTILE2150:
|
|
case RRTILE2178:
|
|
case RRTILE2186:
|
|
case RRTILE2319:
|
|
case RRTILE2321:
|
|
case RRTILE2326:
|
|
case RRTILE2329:
|
|
case RRTILE2578:
|
|
case RRTILE2581:
|
|
case RRTILE2610:
|
|
case RRTILE2613:
|
|
case RRTILE2621:
|
|
case RRTILE2622:
|
|
case RRTILE2676:
|
|
case RRTILE2732:
|
|
case RRTILE2831:
|
|
case RRTILE2832:
|
|
case RRTILE2842:
|
|
case RRTILE2940:
|
|
case RRTILE2970:
|
|
case RRTILE3083:
|
|
case RRTILE3100:
|
|
case RRTILE3155:
|
|
case RRTILE3195:
|
|
case RRTILE3232:
|
|
case RRTILE3600:
|
|
case RRTILE3631:
|
|
case RRTILE3635:
|
|
case RRTILE3637:
|
|
case RRTILE3643+2:
|
|
case RRTILE3643+3:
|
|
case RRTILE3647:
|
|
case RRTILE3652:
|
|
case RRTILE3653:
|
|
case RRTILE3671:
|
|
case RRTILE3673:
|
|
case RRTILE3684:
|
|
case RRTILE3708:
|
|
case RRTILE3714:
|
|
case RRTILE3716:
|
|
case RRTILE3723:
|
|
case RRTILE3725:
|
|
case RRTILE3737:
|
|
case RRTILE3754:
|
|
case RRTILE3762:
|
|
case RRTILE3763:
|
|
case RRTILE3764:
|
|
case RRTILE3765:
|
|
case RRTILE3767:
|
|
case RRTILE3793:
|
|
case RRTILE3814:
|
|
case RRTILE3815:
|
|
case RRTILE3819:
|
|
case RRTILE3827:
|
|
case RRTILE3837:
|
|
return true;
|
|
|
|
case RRTILE1996:
|
|
case RRTILE2382:
|
|
case RRTILE2961:
|
|
case RRTILE3804:
|
|
case RRTILE7430:
|
|
case RRTILE7467:
|
|
case RRTILE7469:
|
|
case RRTILE7470:
|
|
case RRTILE7475:
|
|
case RRTILE7566:
|
|
case RRTILE7576:
|
|
case RRTILE7716:
|
|
case RRTILE8063:
|
|
case RRTILE8067:
|
|
case RRTILE8076:
|
|
case RRTILE8106:
|
|
case RRTILE8379:
|
|
case RRTILE8380:
|
|
case RRTILE8565:
|
|
case RRTILE8605:
|
|
return isRRRA();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void animatewalls_r(void)
|
|
{
|
|
int i, j, p, t;
|
|
|
|
if (isRRRA() &&ps[screenpeek].sea_sick_stat == 1)
|
|
{
|
|
for (i = 0; i < MAXWALLS; i++)
|
|
{
|
|
if (wall[i].picnum == RRTILE7873)
|
|
wall[i].addxpan(6);
|
|
else if (wall[i].picnum == RRTILE7870)
|
|
wall[i].addxpan(6);
|
|
}
|
|
}
|
|
|
|
for (p = 0; p < numanimwalls; p++)
|
|
{
|
|
i = animwall[p].wallnum;
|
|
j = wall[i].picnum;
|
|
|
|
switch (j)
|
|
{
|
|
case SCREENBREAK1:
|
|
case SCREENBREAK2:
|
|
case SCREENBREAK3:
|
|
case SCREENBREAK4:
|
|
case SCREENBREAK5:
|
|
|
|
case SCREENBREAK9:
|
|
case SCREENBREAK10:
|
|
case SCREENBREAK11:
|
|
case SCREENBREAK12:
|
|
case SCREENBREAK13:
|
|
|
|
if ((krand() & 255) < 16)
|
|
{
|
|
animwall[p].tag = wall[i].picnum;
|
|
wall[i].picnum = SCREENBREAK6;
|
|
}
|
|
|
|
continue;
|
|
|
|
case SCREENBREAK6:
|
|
case SCREENBREAK7:
|
|
case SCREENBREAK8:
|
|
|
|
if (animwall[p].tag >= 0)
|
|
wall[i].picnum = animwall[p].tag;
|
|
else
|
|
{
|
|
wall[i].picnum++;
|
|
if (wall[i].picnum == (SCREENBREAK6 + 3))
|
|
wall[i].picnum = SCREENBREAK6;
|
|
}
|
|
continue;
|
|
|
|
}
|
|
|
|
if (wall[i].cstat & 16)
|
|
switch (wall[i].overpicnum)
|
|
{
|
|
case W_FORCEFIELD:
|
|
case W_FORCEFIELD + 1:
|
|
case W_FORCEFIELD + 2:
|
|
|
|
t = animwall[p].tag;
|
|
|
|
if (wall[i].cstat & 254)
|
|
{
|
|
wall[i].addxpan(-t / 4096.f); // bcos(t, -12);
|
|
wall[i].addypan(-t / 4096.f); // bsin(t, -12);
|
|
|
|
if (wall[i].extra == 1)
|
|
{
|
|
wall[i].extra = 0;
|
|
animwall[p].tag = 0;
|
|
}
|
|
else
|
|
animwall[p].tag += 128;
|
|
|
|
if (animwall[p].tag < (128 << 4))
|
|
{
|
|
if (animwall[p].tag & 128)
|
|
wall[i].overpicnum = W_FORCEFIELD;
|
|
else wall[i].overpicnum = W_FORCEFIELD + 1;
|
|
}
|
|
else
|
|
{
|
|
if ((krand() & 255) < 32)
|
|
animwall[p].tag = 128 << (krand() & 3);
|
|
else wall[i].overpicnum = W_FORCEFIELD + 1;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void operaterespawns_r(int low)
|
|
{
|
|
DukeStatIterator it(STAT_FX);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.lotag == low) switch (act->s.picnum)
|
|
{
|
|
case RESPAWN:
|
|
{
|
|
if (badguypic(act->s.hitag) && ud.monsters_off) break;
|
|
|
|
auto star = spawn(act, TRANSPORTERSTAR);
|
|
star->s.z -= (32 << 8);
|
|
|
|
act->s.extra = 66 - 12; // Just a way to killit
|
|
break;
|
|
}
|
|
case RRTILE7424:
|
|
if (isRRRA() && !ud.monsters_off)
|
|
changespritestat(act, 119);
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void operateforcefields_r(DDukeActor* act, int low)
|
|
{
|
|
operateforcefields_common(act, low, { BIGFORCE });
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool checkhitswitch_r(int snum, int ww, DDukeActor* act)
|
|
{
|
|
uint8_t switchpal;
|
|
int i, x, lotag, hitag, picnum, correctdips, numdips;
|
|
int sx, sy;
|
|
|
|
if (ww < 0 && act == nullptr) return 0;
|
|
correctdips = 1;
|
|
numdips = 0;
|
|
|
|
if (act)
|
|
{
|
|
lotag = act->s.lotag;
|
|
if (lotag == 0) return 0;
|
|
hitag = act->s.hitag;
|
|
sx = act->s.x;
|
|
sy = act->s.y;
|
|
picnum = act->s.picnum;
|
|
switchpal = act->s.pal;
|
|
}
|
|
else
|
|
{
|
|
auto wal = &wall[ww];
|
|
lotag = wal->lotag;
|
|
if (lotag == 0) return 0;
|
|
hitag = wal->hitag;
|
|
sx = wal->x;
|
|
sy = wal->y;
|
|
picnum = wal->picnum;
|
|
switchpal = wal->pal;
|
|
}
|
|
|
|
switch (picnum)
|
|
{
|
|
case DIPSWITCH:
|
|
case DIPSWITCH + 1:
|
|
case TECHSWITCH:
|
|
case TECHSWITCH + 1:
|
|
case ALIENSWITCH:
|
|
case ALIENSWITCH + 1:
|
|
break;
|
|
case ACCESSSWITCH:
|
|
case ACCESSSWITCH2:
|
|
if (ps[snum].access_incs == 0)
|
|
{
|
|
if (switchpal == 0)
|
|
{
|
|
if (ps[snum].keys[1])
|
|
ps[snum].access_incs = 1;
|
|
else
|
|
{
|
|
FTA(70, &ps[snum]);
|
|
if (isRRRA()) S_PlayActorSound(99, act? act : ps[snum].GetActor());
|
|
}
|
|
}
|
|
|
|
else if (switchpal == 21)
|
|
{
|
|
if (ps[snum].keys[2])
|
|
ps[snum].access_incs = 1;
|
|
else
|
|
{
|
|
FTA(71, &ps[snum]);
|
|
if (isRRRA()) S_PlayActorSound(99, act ? act : ps[snum].GetActor());
|
|
}
|
|
}
|
|
|
|
else if (switchpal == 23)
|
|
{
|
|
if (ps[snum].keys[3])
|
|
ps[snum].access_incs = 1;
|
|
else
|
|
{
|
|
FTA(72, &ps[snum]);
|
|
if (isRRRA()) S_PlayActorSound(99, act ? act : ps[snum].GetActor());
|
|
}
|
|
}
|
|
|
|
if (ps[snum].access_incs == 1)
|
|
{
|
|
if (!act)
|
|
ps[snum].access_wallnum = ww;
|
|
else
|
|
ps[snum].access_spritenum = act;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
goto goOn1;
|
|
|
|
case MULTISWITCH2:
|
|
case MULTISWITCH2 + 1:
|
|
case MULTISWITCH2 + 2:
|
|
case MULTISWITCH2 + 3:
|
|
case RRTILE8464:
|
|
case RRTILE8660:
|
|
if (!isRRRA()) break;
|
|
case DIPSWITCH2:
|
|
case DIPSWITCH2 + 1:
|
|
case DIPSWITCH3:
|
|
case DIPSWITCH3 + 1:
|
|
case MULTISWITCH:
|
|
case MULTISWITCH + 1:
|
|
case MULTISWITCH + 2:
|
|
case MULTISWITCH + 3:
|
|
case PULLSWITCH:
|
|
case PULLSWITCH + 1:
|
|
case HANDSWITCH:
|
|
case HANDSWITCH + 1:
|
|
case SLOTDOOR:
|
|
case SLOTDOOR + 1:
|
|
case LIGHTSWITCH:
|
|
case LIGHTSWITCH + 1:
|
|
case SPACELIGHTSWITCH:
|
|
case SPACELIGHTSWITCH + 1:
|
|
case SPACEDOORSWITCH:
|
|
case SPACEDOORSWITCH + 1:
|
|
case FRANKENSTINESWITCH:
|
|
case FRANKENSTINESWITCH + 1:
|
|
case LIGHTSWITCH2:
|
|
case LIGHTSWITCH2 + 1:
|
|
case POWERSWITCH1:
|
|
case POWERSWITCH1 + 1:
|
|
case LOCKSWITCH1:
|
|
case LOCKSWITCH1 + 1:
|
|
case POWERSWITCH2:
|
|
case POWERSWITCH2 + 1:
|
|
case NUKEBUTTON:
|
|
case NUKEBUTTON + 1:
|
|
case RRTILE2214:
|
|
case RRTILE2697:
|
|
case RRTILE2697 + 1:
|
|
case RRTILE2707:
|
|
case RRTILE2707 + 1:
|
|
goOn1:
|
|
if (check_activator_motion(lotag)) return 0;
|
|
break;
|
|
default:
|
|
if (fi.isadoorwall(picnum) == 0) return 0;
|
|
break;
|
|
}
|
|
|
|
DukeStatIterator it(STAT_DEFAULT);
|
|
while (auto other = it.Next())
|
|
{
|
|
auto si = &other->s;
|
|
if (lotag == si->lotag) switch (si->picnum)
|
|
{
|
|
case DIPSWITCH:
|
|
case TECHSWITCH:
|
|
case ALIENSWITCH:
|
|
if (act && act == other) si->picnum++;
|
|
else if (si->hitag == 0) correctdips++;
|
|
numdips++;
|
|
break;
|
|
case TECHSWITCH + 1:
|
|
case DIPSWITCH + 1:
|
|
case ALIENSWITCH + 1:
|
|
if (act && act == other) si->picnum--;
|
|
else if (si->hitag == 1) correctdips++;
|
|
numdips++;
|
|
break;
|
|
case MULTISWITCH:
|
|
case MULTISWITCH + 1:
|
|
case MULTISWITCH + 2:
|
|
case MULTISWITCH + 3:
|
|
si->picnum++;
|
|
if (si->picnum > (MULTISWITCH + 3))
|
|
si->picnum = MULTISWITCH;
|
|
break;
|
|
case MULTISWITCH2:
|
|
case MULTISWITCH2 + 1:
|
|
case MULTISWITCH2 + 2:
|
|
case MULTISWITCH2 + 3:
|
|
if (!isRRRA()) break;
|
|
si->picnum++;
|
|
if (si->picnum > (MULTISWITCH2 + 3))
|
|
si->picnum = MULTISWITCH2;
|
|
break;
|
|
|
|
case RRTILE2214:
|
|
//if (ud.level_numbe r > 6) ud.level_numbe r = 0; ??? Looks like some leftover garbage.
|
|
si->picnum++;
|
|
break;
|
|
case RRTILE8660:
|
|
if (!isRRRA()) break;
|
|
case ACCESSSWITCH:
|
|
case ACCESSSWITCH2:
|
|
case SLOTDOOR:
|
|
case LIGHTSWITCH:
|
|
case SPACELIGHTSWITCH:
|
|
case SPACEDOORSWITCH:
|
|
case FRANKENSTINESWITCH:
|
|
case LIGHTSWITCH2:
|
|
case POWERSWITCH1:
|
|
case LOCKSWITCH1:
|
|
case POWERSWITCH2:
|
|
case HANDSWITCH:
|
|
case PULLSWITCH:
|
|
case DIPSWITCH2:
|
|
case DIPSWITCH3:
|
|
case NUKEBUTTON:
|
|
case RRTILE2697:
|
|
case RRTILE2707:
|
|
if (si->picnum == DIPSWITCH3)
|
|
if (si->hitag == 999)
|
|
{
|
|
DukeStatIterator it1(107);
|
|
while (auto other2 = it1.Next())
|
|
{
|
|
if (other2->s.picnum == RRTILE3410)
|
|
{
|
|
other2->s.picnum++;
|
|
other2->s.hitag = 100;
|
|
other2->s.extra = 0;
|
|
S_PlayActorSound(474, other2);
|
|
}
|
|
else if (other2->s.picnum == RRTILE295)
|
|
deletesprite(other2);
|
|
}
|
|
si->picnum++;
|
|
break;
|
|
}
|
|
if (si->picnum == NUKEBUTTON)
|
|
chickenplant = 0;
|
|
if (si->picnum == RRTILE8660)
|
|
{
|
|
BellTime = 132;
|
|
BellSprite = other;
|
|
}
|
|
si->picnum++;
|
|
break;
|
|
case PULLSWITCH + 1:
|
|
case HANDSWITCH + 1:
|
|
case LIGHTSWITCH2 + 1:
|
|
case POWERSWITCH1 + 1:
|
|
case LOCKSWITCH1 + 1:
|
|
case POWERSWITCH2 + 1:
|
|
case SLOTDOOR + 1:
|
|
case LIGHTSWITCH + 1:
|
|
case SPACELIGHTSWITCH + 1:
|
|
case SPACEDOORSWITCH + 1:
|
|
case FRANKENSTINESWITCH + 1:
|
|
case DIPSWITCH2 + 1:
|
|
case DIPSWITCH3 + 1:
|
|
case NUKEBUTTON + 1:
|
|
case RRTILE2697 + 1:
|
|
case RRTILE2707 + 1:
|
|
if (si->picnum == NUKEBUTTON + 1)
|
|
chickenplant = 1;
|
|
if (si->hitag != 999)
|
|
si->picnum--;
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < numwalls; i++)
|
|
{
|
|
x = i;
|
|
if (lotag == wall[x].lotag)
|
|
switch (wall[x].picnum)
|
|
{
|
|
case DIPSWITCH:
|
|
case TECHSWITCH:
|
|
case ALIENSWITCH:
|
|
if (!act && i == ww) wall[x].picnum++;
|
|
else if (wall[x].hitag == 0) correctdips++;
|
|
numdips++;
|
|
break;
|
|
case DIPSWITCH + 1:
|
|
case TECHSWITCH + 1:
|
|
case ALIENSWITCH + 1:
|
|
if (!act && i == ww) wall[x].picnum--;
|
|
else if (wall[x].hitag == 1) correctdips++;
|
|
numdips++;
|
|
break;
|
|
case MULTISWITCH:
|
|
case MULTISWITCH + 1:
|
|
case MULTISWITCH + 2:
|
|
case MULTISWITCH + 3:
|
|
wall[x].picnum++;
|
|
if (wall[x].picnum > (MULTISWITCH + 3))
|
|
wall[x].picnum = MULTISWITCH;
|
|
break;
|
|
case MULTISWITCH2:
|
|
case MULTISWITCH2 + 1:
|
|
case MULTISWITCH2 + 2:
|
|
case MULTISWITCH2 + 3:
|
|
if (!isRRRA()) break;
|
|
wall[x].picnum++;
|
|
if (wall[x].picnum > (MULTISWITCH2 + 3))
|
|
wall[x].picnum = MULTISWITCH2;
|
|
break;
|
|
case RRTILE8660:
|
|
if (!isRRRA()) break;
|
|
case ACCESSSWITCH:
|
|
case ACCESSSWITCH2:
|
|
case SLOTDOOR:
|
|
case LIGHTSWITCH:
|
|
case SPACELIGHTSWITCH:
|
|
case SPACEDOORSWITCH:
|
|
case LIGHTSWITCH2:
|
|
case POWERSWITCH1:
|
|
case LOCKSWITCH1:
|
|
case POWERSWITCH2:
|
|
case PULLSWITCH:
|
|
case HANDSWITCH:
|
|
case DIPSWITCH2:
|
|
case DIPSWITCH3:
|
|
case RRTILE2697:
|
|
case RRTILE2707:
|
|
wall[x].picnum++;
|
|
break;
|
|
case HANDSWITCH + 1:
|
|
case PULLSWITCH + 1:
|
|
case LIGHTSWITCH2 + 1:
|
|
case POWERSWITCH1 + 1:
|
|
case LOCKSWITCH1 + 1:
|
|
case POWERSWITCH2 + 1:
|
|
case SLOTDOOR + 1:
|
|
case LIGHTSWITCH + 1:
|
|
case SPACELIGHTSWITCH + 1:
|
|
case SPACEDOORSWITCH + 1:
|
|
case DIPSWITCH2 + 1:
|
|
case DIPSWITCH3 + 1:
|
|
case RRTILE2697 + 1:
|
|
case RRTILE2707 + 1:
|
|
wall[x].picnum--;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (lotag == (short)65535)
|
|
{
|
|
setnextmap(false);
|
|
}
|
|
|
|
vec3_t v = { sx, sy, ps[snum].posz };
|
|
switch (picnum)
|
|
{
|
|
default:
|
|
if (fi.isadoorwall(picnum) == 0) break;
|
|
case DIPSWITCH:
|
|
case DIPSWITCH + 1:
|
|
case TECHSWITCH:
|
|
case TECHSWITCH + 1:
|
|
case ALIENSWITCH:
|
|
case ALIENSWITCH + 1:
|
|
if (picnum == DIPSWITCH || picnum == DIPSWITCH + 1 ||
|
|
picnum == ALIENSWITCH || picnum == ALIENSWITCH + 1 ||
|
|
picnum == TECHSWITCH || picnum == TECHSWITCH + 1)
|
|
{
|
|
if (picnum == ALIENSWITCH || picnum == ALIENSWITCH + 1)
|
|
{
|
|
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 MULTISWITCH2:
|
|
case MULTISWITCH2 + 1:
|
|
case MULTISWITCH2 + 2:
|
|
case MULTISWITCH2 + 3:
|
|
case RRTILE8464:
|
|
case RRTILE8660:
|
|
if (!isRRRA()) break;
|
|
case DIPSWITCH2:
|
|
case DIPSWITCH2 + 1:
|
|
case DIPSWITCH3:
|
|
case DIPSWITCH3 + 1:
|
|
case MULTISWITCH:
|
|
case MULTISWITCH + 1:
|
|
case MULTISWITCH + 2:
|
|
case MULTISWITCH + 3:
|
|
case ACCESSSWITCH:
|
|
case ACCESSSWITCH2:
|
|
case SLOTDOOR:
|
|
case SLOTDOOR + 1:
|
|
case LIGHTSWITCH:
|
|
case LIGHTSWITCH + 1:
|
|
case SPACELIGHTSWITCH:
|
|
case SPACELIGHTSWITCH + 1:
|
|
case SPACEDOORSWITCH:
|
|
case SPACEDOORSWITCH + 1:
|
|
case FRANKENSTINESWITCH:
|
|
case FRANKENSTINESWITCH + 1:
|
|
case LIGHTSWITCH2:
|
|
case LIGHTSWITCH2 + 1:
|
|
case POWERSWITCH1:
|
|
case POWERSWITCH1 + 1:
|
|
case LOCKSWITCH1:
|
|
case LOCKSWITCH1 + 1:
|
|
case POWERSWITCH2:
|
|
case POWERSWITCH2 + 1:
|
|
case HANDSWITCH:
|
|
case HANDSWITCH + 1:
|
|
case PULLSWITCH:
|
|
case PULLSWITCH + 1:
|
|
case RRTILE2697:
|
|
case RRTILE2697 + 1:
|
|
case RRTILE2707:
|
|
case RRTILE2707 + 1:
|
|
goOn2:
|
|
if (isRRRA())
|
|
{
|
|
if (picnum == RRTILE8660 && act)
|
|
{
|
|
BellTime = 132;
|
|
BellSprite = act;
|
|
act->s.picnum++;
|
|
}
|
|
else if (picnum == RRTILE8464)
|
|
{
|
|
act->s.picnum = act->s.picnum + 1;
|
|
if (hitag == 10001)
|
|
{
|
|
if (ps[snum].SeaSick == 0)
|
|
ps[snum].SeaSick = 350;
|
|
operateactivators(668, snum);
|
|
operatemasterswitches(668);
|
|
S_PlayActorSound(328, ps[snum].GetActor());
|
|
return 1;
|
|
}
|
|
}
|
|
else if (hitag == 10000)
|
|
{
|
|
if (picnum == MULTISWITCH || picnum == (MULTISWITCH + 1) ||
|
|
picnum == (MULTISWITCH + 2) || picnum == (MULTISWITCH + 3) ||
|
|
picnum == MULTISWITCH2 || picnum == (MULTISWITCH2 + 1) ||
|
|
picnum == (MULTISWITCH2 + 2) || picnum == (MULTISWITCH2 + 3))
|
|
{
|
|
DDukeActor* switches[3];
|
|
int switchcount = 0, j;
|
|
S_PlaySound3D(SWITCH_ON, act, &v);
|
|
DukeLinearSpriteIterator it;
|
|
while (auto actt = it.Next())
|
|
{
|
|
int jpn = actt->s.picnum;
|
|
int jht = actt->s.hitag;
|
|
if ((jpn == MULTISWITCH || jpn == MULTISWITCH2) && jht == 10000)
|
|
{
|
|
if (switchcount < 3)
|
|
{
|
|
switches[switchcount] = actt;
|
|
switchcount++;
|
|
}
|
|
}
|
|
}
|
|
if (switchcount == 3)
|
|
{
|
|
S_PlaySound3D(78, act, &v);
|
|
for (j = 0; j < switchcount; j++)
|
|
{
|
|
switches[j]->s.hitag = 0;
|
|
if (picnum >= MULTISWITCH2)
|
|
switches[j]->s.picnum = MULTISWITCH2 + 3;
|
|
else
|
|
switches[j]->s.picnum = MULTISWITCH + 3;
|
|
checkhitswitch_r(snum, -1, switches[j]);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
if (picnum == MULTISWITCH || picnum == (MULTISWITCH + 1) ||
|
|
picnum == (MULTISWITCH + 2) || picnum == (MULTISWITCH + 3))
|
|
lotag += picnum - MULTISWITCH;
|
|
if (isRRRA())
|
|
{
|
|
if (picnum == MULTISWITCH2 || picnum == (MULTISWITCH2 + 1) ||
|
|
picnum == (MULTISWITCH2 + 2) || picnum == (MULTISWITCH2 + 3))
|
|
lotag += picnum - MULTISWITCH2;
|
|
}
|
|
|
|
DukeStatIterator it(STAT_EFFECTOR);
|
|
while (auto other = it.Next())
|
|
{
|
|
if (other->s.hitag == lotag)
|
|
{
|
|
switch (other->s.lotag)
|
|
{
|
|
case 46:
|
|
case SE_47_LIGHT_SWITCH:
|
|
case SE_48_LIGHT_SWITCH:
|
|
if (!isRRRA()) break;
|
|
case SE_12_LIGHT_SWITCH:
|
|
sector[other->s.sectnum].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, snum);
|
|
fi.operateforcefields(ps[snum].GetActor(), lotag);
|
|
operatemasterswitches(lotag);
|
|
|
|
if (picnum == DIPSWITCH || picnum == DIPSWITCH + 1 ||
|
|
picnum == ALIENSWITCH || picnum == ALIENSWITCH + 1 ||
|
|
picnum == TECHSWITCH || picnum == TECHSWITCH + 1) return 1;
|
|
|
|
if (hitag == 0 && fi.isadoorwall(picnum) == 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;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void activatebysector_r(int sect, DDukeActor* activator)
|
|
{
|
|
DukeSectIterator it(sect);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == ACTIVATOR)
|
|
{
|
|
operateactivators(act->s.lotag, -1);
|
|
// return;
|
|
}
|
|
}
|
|
|
|
if (sector[sect].lotag != 22)
|
|
operatesectors(sect, activator);
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
static void lotsofpopcorn(DDukeActor *actor, short wallnum, short n)
|
|
{
|
|
int j, xv, yv, z, x1, y1;
|
|
short sect, a;
|
|
|
|
sect = -1;
|
|
auto sp = &actor->s;
|
|
|
|
if (wallnum < 0)
|
|
{
|
|
for (j = n - 1; j >= 0; j--)
|
|
{
|
|
a = sp->ang - 256 + (krand() & 511) + 1024;
|
|
EGS(sp->sectnum, sp->x, sp->y, sp->z, POPCORN, -32, 36, 36, a, 32 + (krand() & 63), 1024 - (krand() & 1023), actor, 5);
|
|
}
|
|
return;
|
|
}
|
|
|
|
j = n + 1;
|
|
|
|
x1 = wall[wallnum].x;
|
|
y1 = wall[wallnum].y;
|
|
|
|
xv = wall[wall[wallnum].point2].x - x1;
|
|
yv = wall[wall[wallnum].point2].y - y1;
|
|
|
|
x1 -= ksgn(yv);
|
|
y1 += ksgn(xv);
|
|
|
|
xv /= j;
|
|
yv /= j;
|
|
|
|
for (j = n; j > 0; j--)
|
|
{
|
|
x1 += xv;
|
|
y1 += yv;
|
|
|
|
updatesector(x1, y1, §);
|
|
if (sect >= 0)
|
|
{
|
|
z = sector[sect].floorz - (krand() & (abs(sector[sect].ceilingz - sector[sect].floorz)));
|
|
if (z < -(32 << 8) || z >(32 << 8))
|
|
z = sp->z - (32 << 8) + (krand() & ((64 << 8) - 1));
|
|
a = sp->ang - 1024;
|
|
EGS(sp->sectnum, x1, y1, z, POPCORN, -32, 36, 36, a, 32 + (krand() & 63), -(krand() & 1023), actor, 5);
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void checkhitwall_r(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith)
|
|
{
|
|
short j, i, sn = -1, darkestwall;
|
|
walltype* wal;
|
|
spritetype* s;
|
|
|
|
wal = &wall[dawallnum];
|
|
|
|
if (wal->overpicnum == MIRROR)
|
|
{
|
|
switch (atwith)
|
|
{
|
|
case RPG2:
|
|
if (!isRRRA()) break;
|
|
case HEAVYHBOMB:
|
|
case RADIUSEXPLOSION:
|
|
case RPG:
|
|
case HYDRENT:
|
|
case SEENINE:
|
|
case OOZFILTER:
|
|
case EXPLODINGBARREL:
|
|
lotsofglass(spr, dawallnum, 70);
|
|
wal->cstat &= ~16;
|
|
wal->overpicnum = MIRRORBROKE;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (((wal->cstat & 16) || wal->overpicnum == BIGFORCE) && wal->nextsector >= 0)
|
|
if (sector[wal->nextsector].floorz > z)
|
|
if (sector[wal->nextsector].floorz - sector[wal->nextsector].ceilingz)
|
|
switch (wal->overpicnum)
|
|
{
|
|
case FANSPRITE:
|
|
wal->overpicnum = FANSPRITEBROKE;
|
|
wal->cstat &= 65535 - 65;
|
|
if (wal->nextwall >= 0)
|
|
{
|
|
wall[wal->nextwall].overpicnum = FANSPRITEBROKE;
|
|
wall[wal->nextwall].cstat &= 65535 - 65;
|
|
}
|
|
S_PlayActorSound(VENT_BUST, spr);
|
|
S_PlayActorSound(GLASS_BREAKING, spr);
|
|
return;
|
|
|
|
case RRTILE1973:
|
|
{
|
|
updatesector(x, y, &sn); if (sn < 0) return;
|
|
wal->overpicnum = GLASS2;
|
|
lotsofpopcorn(spr, dawallnum, 64);
|
|
wal->cstat = 0;
|
|
|
|
if (wal->nextwall >= 0)
|
|
wall[wal->nextwall].cstat = 0;
|
|
|
|
auto spawned = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
|
|
spawned->s.lotag = 128;
|
|
spawned->temp_data[1] = 2;
|
|
spawned->temp_data[2] = dawallnum;
|
|
S_PlayActorSound(GLASS_BREAKING, spawned);
|
|
return;
|
|
}
|
|
case GLASS:
|
|
{
|
|
updatesector(x, y, &sn); if (sn < 0) return;
|
|
wal->overpicnum = GLASS2;
|
|
lotsofglass(spr, dawallnum, 10);
|
|
wal->cstat = 0;
|
|
|
|
if (wal->nextwall >= 0)
|
|
wall[wal->nextwall].cstat = 0;
|
|
|
|
auto spawned = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
|
|
spawned->s.lotag = 128;
|
|
spawned->temp_data[1] = 2;
|
|
spawned->temp_data[2] = dawallnum;
|
|
S_PlayActorSound(GLASS_BREAKING, spawned);
|
|
return;
|
|
}
|
|
case STAINGLASS1:
|
|
updatesector(x, y, &sn); if (sn < 0) return;
|
|
lotsofcolourglass(spr, dawallnum, 80);
|
|
wal->cstat = 0;
|
|
if (wal->nextwall >= 0)
|
|
wall[wal->nextwall].cstat = 0;
|
|
S_PlayActorSound(VENT_BUST, spr);
|
|
S_PlayActorSound(GLASS_BREAKING, spr);
|
|
return;
|
|
}
|
|
|
|
switch (wal->picnum)
|
|
{
|
|
case RRTILE8464:
|
|
if (isRRRA()) break;
|
|
break;
|
|
case RRTILE3643:
|
|
case RRTILE3643 + 1:
|
|
case RRTILE3643 + 2:
|
|
case RRTILE3643 + 3:
|
|
{
|
|
int sect;
|
|
int unk = 0;
|
|
int startwall, endwall;
|
|
sect = wall[wal->nextwall].nextsector;
|
|
DukeSectIterator it(sect);
|
|
while (auto act = it.Next())
|
|
{
|
|
s = &act->s;
|
|
if (s->lotag == 6)
|
|
{
|
|
//for (j = 0; j < 16; j++) RANDOMSCRAP(s, -1); This never spawned anything due to the -1.
|
|
act->spriteextra++;
|
|
if (act->spriteextra == 25)
|
|
{
|
|
startwall = sector[s->sectnum].wallptr;
|
|
endwall = startwall + sector[s->sectnum].wallnum;
|
|
for (i = startwall; i < endwall; i++)
|
|
sector[wall[i].nextsector].lotag = 0;
|
|
sector[s->sectnum].lotag = 0;
|
|
S_StopSound(act->s.lotag);
|
|
S_PlayActorSound(400, act);
|
|
deletesprite(act);
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
case RRTILE7555:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = SBMOVE;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7441:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5016;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7559:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5017;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7433:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5018;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7557:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5019;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7553:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5020;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7552:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5021;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7568:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5022;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7540:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5023;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7558:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5024;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7554:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5025;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7579:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5026;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7561:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5027;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7580:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5037;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8227:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5070;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8503:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5079;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8567:
|
|
case RRTILE8568:
|
|
case RRTILE8569:
|
|
case RRTILE8570:
|
|
case RRTILE8571:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5082;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE7859:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5081;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8496:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5061;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8617:
|
|
if (!isRRRA()) break;
|
|
if (numplayers < 2)
|
|
{
|
|
wal->picnum = RRTILE8618;
|
|
S_PlayActorSound(47, spr);
|
|
}
|
|
return;
|
|
case RRTILE8620:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE8621;
|
|
S_PlayActorSound(47, spr);
|
|
return;
|
|
case RRTILE8622:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE8623;
|
|
S_PlayActorSound(495, spr);
|
|
return;
|
|
case RRTILE7657:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE7659;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
case RRTILE8497:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5076;
|
|
S_PlayActorSound(495, spr);
|
|
return;
|
|
case RRTILE7533:
|
|
if (!isRRRA()) break;
|
|
wal->picnum = RRTILE5035;
|
|
S_PlayActorSound(495, spr);
|
|
return;
|
|
|
|
case COLAMACHINE:
|
|
case VENDMACHINE:
|
|
breakwall(wal->picnum + 2, spr, dawallnum);
|
|
S_PlayActorSound(GLASS_BREAKING, spr);
|
|
return;
|
|
|
|
case OJ:
|
|
|
|
case SCREENBREAK6:
|
|
case SCREENBREAK7:
|
|
case SCREENBREAK8:
|
|
|
|
lotsofglass(spr, dawallnum, 30);
|
|
wal->picnum = W_SCREENBREAK + (krand() % (isRRRA() ? 2 : 3));
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
return;
|
|
|
|
case ATM:
|
|
wal->picnum = ATMBROKE;
|
|
fi.lotsofmoney(spr, 1 + (krand() & 7));
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
break;
|
|
|
|
case WALLLIGHT1:
|
|
case WALLLIGHT3:
|
|
case WALLLIGHT4:
|
|
case TECHLIGHT2:
|
|
case TECHLIGHT4:
|
|
case RRTILE1814:
|
|
case RRTILE1939:
|
|
case RRTILE1986:
|
|
case RRTILE1988:
|
|
case RRTILE2123:
|
|
case RRTILE2125:
|
|
case RRTILE2636:
|
|
case RRTILE2878:
|
|
case RRTILE2898:
|
|
case RRTILE3200:
|
|
case RRTILE3202:
|
|
case RRTILE3204:
|
|
case RRTILE3206:
|
|
case RRTILE3208:
|
|
|
|
if (rnd(128))
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
|
|
else S_PlayActorSound(GLASS_BREAKING, spr);
|
|
lotsofglass(spr, dawallnum, 30);
|
|
|
|
if (wal->picnum == RRTILE1814)
|
|
wal->picnum = RRTILE1817;
|
|
|
|
if (wal->picnum == RRTILE1986)
|
|
wal->picnum = RRTILE1987;
|
|
|
|
if (wal->picnum == RRTILE1939)
|
|
wal->picnum = RRTILE2004;
|
|
|
|
if (wal->picnum == RRTILE1988)
|
|
wal->picnum = RRTILE2005;
|
|
|
|
if (wal->picnum == RRTILE2898)
|
|
wal->picnum = RRTILE2899;
|
|
|
|
if (wal->picnum == RRTILE2878)
|
|
wal->picnum = RRTILE2879;
|
|
|
|
if (wal->picnum == RRTILE2123)
|
|
wal->picnum = RRTILE2124;
|
|
|
|
if (wal->picnum == RRTILE2125)
|
|
wal->picnum = RRTILE2126;
|
|
|
|
if (wal->picnum == RRTILE3200)
|
|
wal->picnum = RRTILE3201;
|
|
|
|
if (wal->picnum == RRTILE3202)
|
|
wal->picnum = RRTILE3203;
|
|
|
|
if (wal->picnum == RRTILE3204)
|
|
wal->picnum = RRTILE3205;
|
|
|
|
if (wal->picnum == RRTILE3206)
|
|
wal->picnum = RRTILE3207;
|
|
|
|
if (wal->picnum == RRTILE3208)
|
|
wal->picnum = RRTILE3209;
|
|
|
|
if (wal->picnum == RRTILE2636)
|
|
wal->picnum = RRTILE2637;
|
|
|
|
if (wal->picnum == WALLLIGHT1)
|
|
wal->picnum = WALLLIGHTBUST1;
|
|
|
|
if (wal->picnum == WALLLIGHT3)
|
|
wal->picnum = WALLLIGHTBUST3;
|
|
|
|
if (wal->picnum == WALLLIGHT4)
|
|
wal->picnum = WALLLIGHTBUST4;
|
|
|
|
if (wal->picnum == TECHLIGHT2)
|
|
wal->picnum = TECHLIGHTBUST2;
|
|
|
|
if (wal->picnum == TECHLIGHT4)
|
|
wal->picnum = TECHLIGHTBUST4;
|
|
|
|
if (!wal->lotag) return;
|
|
|
|
sn = wal->nextsector;
|
|
if (sn < 0) return;
|
|
darkestwall = 0;
|
|
|
|
wal = &wall[sector[sn].wallptr];
|
|
for (i = sector[sn].wallnum; i > 0; i--, wal++)
|
|
if (wal->shade > darkestwall)
|
|
darkestwall = wal->shade;
|
|
|
|
j = krand() & 1;
|
|
DukeStatIterator it(STAT_EFFECTOR);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.hitag == wall[dawallnum].lotag && act->s.lotag == 3)
|
|
{
|
|
act->temp_data[2] = j;
|
|
act->temp_data[3] = darkestwall;
|
|
act->temp_data[4] = 1;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void checkplayerhurt_r(struct player_struct* p, const Collision &coll)
|
|
{
|
|
if (coll.type == kHitSprite)
|
|
{
|
|
switch (coll.actor->s.picnum)
|
|
{
|
|
case RRTILE2430:
|
|
case RRTILE2431:
|
|
case RRTILE2432:
|
|
case RRTILE2443:
|
|
case RRTILE2446:
|
|
case RRTILE2451:
|
|
case RRTILE2455:
|
|
if (isRRRA() && p->hurt_delay2 < 8)
|
|
{
|
|
p->GetActor()->s.extra -= 2;
|
|
p->hurt_delay2 = 16;
|
|
SetPlayerPal(p, PalEntry(32, 32, 0, 0));
|
|
S_PlayActorSound(DUKE_LONGTERM_PAIN, p->GetActor());
|
|
}
|
|
break;
|
|
case CACTUS:
|
|
if (!isRRRA() && p->hurt_delay < 8)
|
|
{
|
|
p->GetActor()->s.extra -= 5;
|
|
p->hurt_delay = 16;
|
|
SetPlayerPal(p, PalEntry(32, 32, 0, 0));
|
|
S_PlayActorSound(DUKE_LONGTERM_PAIN, p->GetActor());
|
|
}
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (coll.type != kHitWall) return;
|
|
int j = coll.index;
|
|
|
|
if (p->hurt_delay > 0) p->hurt_delay--;
|
|
else if (wall[j].cstat & 85) switch (wall[j].overpicnum)
|
|
{
|
|
case BIGFORCE:
|
|
p->hurt_delay = 26;
|
|
fi.checkhitwall(p->GetActor(), j,
|
|
p->posx + p->angle.ang.bcos(-9),
|
|
p->posy + p->angle.ang.bsin(-9),
|
|
p->posz, -1);
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool checkhitceiling_r(int sn)
|
|
{
|
|
short j;
|
|
|
|
switch (sector[sn].ceilingpicnum)
|
|
{
|
|
case WALLLIGHT1:
|
|
case WALLLIGHT3:
|
|
case WALLLIGHT4:
|
|
case TECHLIGHT2:
|
|
case TECHLIGHT4:
|
|
case RRTILE1939:
|
|
case RRTILE1986:
|
|
case RRTILE1988:
|
|
case RRTILE2123:
|
|
case RRTILE2125:
|
|
case RRTILE2878:
|
|
case RRTILE2898:
|
|
|
|
|
|
ceilingglass(ps[myconnectindex].GetActor(), sn, 10);
|
|
S_PlayActorSound(GLASS_BREAKING, ps[screenpeek].GetActor());
|
|
|
|
if (sector[sn].ceilingpicnum == WALLLIGHT1)
|
|
sector[sn].ceilingpicnum = WALLLIGHTBUST1;
|
|
|
|
if (sector[sn].ceilingpicnum == WALLLIGHT3)
|
|
sector[sn].ceilingpicnum = WALLLIGHTBUST3;
|
|
|
|
if (sector[sn].ceilingpicnum == WALLLIGHT4)
|
|
sector[sn].ceilingpicnum = WALLLIGHTBUST4;
|
|
|
|
if (sector[sn].ceilingpicnum == TECHLIGHT2)
|
|
sector[sn].ceilingpicnum = TECHLIGHTBUST2;
|
|
|
|
if (sector[sn].ceilingpicnum == TECHLIGHT4)
|
|
sector[sn].ceilingpicnum = TECHLIGHTBUST4;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE1986)
|
|
sector[sn].ceilingpicnum = RRTILE1987;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE1939)
|
|
sector[sn].ceilingpicnum = RRTILE2004;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE1988)
|
|
sector[sn].ceilingpicnum = RRTILE2005;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE2898)
|
|
sector[sn].ceilingpicnum = RRTILE2899;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE2878)
|
|
sector[sn].ceilingpicnum = RRTILE2879;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE2123)
|
|
sector[sn].ceilingpicnum = RRTILE2124;
|
|
|
|
if (sector[sn].ceilingpicnum == RRTILE2125)
|
|
sector[sn].ceilingpicnum = RRTILE2126;
|
|
|
|
|
|
if (!sector[sn].hitag)
|
|
{
|
|
DukeSectIterator it(sn);
|
|
while (auto act1 = it.Next())
|
|
{
|
|
auto spr1 = &act1->s;
|
|
if (spr1->picnum == SECTOREFFECTOR && (spr1->lotag == 12 || (isRRRA() && (spr1->lotag == 47 || spr1->lotag == 48))))
|
|
{
|
|
DukeStatIterator it(STAT_EFFECTOR);
|
|
while (auto act2 = it.Next())
|
|
{
|
|
if (act2->s.hitag == spr1->hitag)
|
|
act2->temp_data[3] = 1;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
j = krand() & 1;
|
|
DukeStatIterator it(STAT_EFFECTOR);
|
|
while (auto act1 = it.Next())
|
|
{
|
|
auto spr1 = &act1->s;
|
|
if (spr1->hitag == (sector[sn].hitag) && spr1->lotag == 3)
|
|
{
|
|
act1->temp_data[2] = j;
|
|
act1->temp_data[4] = 1;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void checkhitsprite_r(DDukeActor* targ, DDukeActor* proj)
|
|
{
|
|
int j, k, p;
|
|
spritetype* s = &targ->s;
|
|
auto pspr = &proj->s;
|
|
|
|
if (isRRRA()) switch (s->picnum)
|
|
{
|
|
case RRTILE8464:
|
|
break;
|
|
case RRTILE8487:
|
|
case RRTILE8489:
|
|
S_PlayActorSound(471, targ);
|
|
s->picnum++;
|
|
break;
|
|
case RRTILE7638:
|
|
case RRTILE7644:
|
|
case RRTILE7646:
|
|
case RRTILE7650:
|
|
case RRTILE7653:
|
|
case RRTILE7655:
|
|
case RRTILE7691:
|
|
case RRTILE7876:
|
|
case RRTILE7881:
|
|
case RRTILE7883:
|
|
s->picnum++;
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
case RRTILE7879:
|
|
s->picnum++;
|
|
S_PlayActorSound(495, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE7648:
|
|
case RRTILE7694:
|
|
case RRTILE7700:
|
|
case RRTILE7702:
|
|
case RRTILE7711:
|
|
s->picnum++;
|
|
S_PlayActorSound(47, targ);
|
|
break;
|
|
case RRTILE7636:
|
|
s->picnum += 3;
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
case RRTILE7875:
|
|
s->picnum += 3;
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
case RRTILE7640:
|
|
s->picnum += 2;
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
case RRTILE7595:
|
|
case RRTILE7704:
|
|
s->picnum = RRTILE7705;
|
|
S_PlayActorSound(495, targ);
|
|
break;
|
|
case RRTILE8579:
|
|
s->picnum = RRTILE5014;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7441:
|
|
s->picnum = RRTILE5016;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7534:
|
|
s->picnum = RRTILE5029;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7545:
|
|
s->picnum = RRTILE5030;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7547:
|
|
s->picnum = RRTILE5031;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7574:
|
|
s->picnum = RRTILE5032;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7575:
|
|
s->picnum = RRTILE5033;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7578:
|
|
s->picnum = RRTILE5034;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7478:
|
|
s->picnum = RRTILE5035;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8525:
|
|
s->picnum = RRTILE5036;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8537:
|
|
s->picnum = RRTILE5062;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8215:
|
|
s->picnum = RRTILE5064;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8216:
|
|
s->picnum = RRTILE5065;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8217:
|
|
s->picnum = RRTILE5066;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8218:
|
|
s->picnum = RRTILE5067;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8220:
|
|
s->picnum = RRTILE5068;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8221:
|
|
s->picnum = RRTILE5069;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8312:
|
|
s->picnum = RRTILE5071;
|
|
S_PlayActorSound(472, targ);
|
|
break;
|
|
case RRTILE8395:
|
|
s->picnum = RRTILE5072;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8423:
|
|
s->picnum = RRTILE5073;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE3462:
|
|
s->picnum = RRTILE5074;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case UWHIP:
|
|
s->picnum = RRTILE5075;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8608:
|
|
s->picnum = RRTILE5083;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8609:
|
|
s->picnum = RRTILE5084;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8567:
|
|
case RRTILE8568:
|
|
case RRTILE8569:
|
|
case RRTILE8570:
|
|
case RRTILE8571:
|
|
s->picnum = RRTILE5082;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8640:
|
|
s->picnum = RRTILE5085;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8611:
|
|
s->picnum = RRTILE5086;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case TECHLIGHTBUST2:
|
|
s->picnum = TECHLIGHTBUST4;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8497:
|
|
s->picnum = RRTILE5076;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8162:
|
|
case RRTILE8163:
|
|
case RRTILE8164:
|
|
case RRTILE8165:
|
|
case RRTILE8166:
|
|
case RRTILE8167:
|
|
case RRTILE8168:
|
|
changespritestat(targ, STAT_MISC);
|
|
s->picnum = RRTILE5063;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8589:
|
|
case RRTILE8590:
|
|
case RRTILE8591:
|
|
case RRTILE8592:
|
|
case RRTILE8593:
|
|
case RRTILE8594:
|
|
case RRTILE8595:
|
|
changespritestat(targ, STAT_MISC);
|
|
s->picnum = RRTILE8588;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE3497:
|
|
s->picnum = RRTILE5076;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE3498:
|
|
s->picnum = RRTILE5077;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE3499:
|
|
s->picnum = RRTILE5078;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8503:
|
|
s->picnum = RRTILE5079;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7901:
|
|
s->picnum = RRTILE5080;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7696:
|
|
s->picnum = RRTILE7697;
|
|
S_PlayActorSound(DUKE_SHUCKS, targ);
|
|
break;
|
|
case RRTILE7806:
|
|
s->picnum = RRTILE5043;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7885:
|
|
case RRTILE7890:
|
|
s->picnum = RRTILE5045;
|
|
S_PlayActorSound(495, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE7886:
|
|
s->picnum = RRTILE5046;
|
|
S_PlayActorSound(495, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE7887:
|
|
s->picnum = RRTILE5044;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE7900:
|
|
s->picnum = RRTILE5047;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7906:
|
|
s->picnum = RRTILE5048;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7912:
|
|
case RRTILE7913:
|
|
s->picnum = RRTILE5049;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8047:
|
|
s->picnum = RRTILE5050;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8596:
|
|
s->picnum = RRTILE8598;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8059:
|
|
s->picnum = RRTILE5051;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8060:
|
|
s->picnum = RRTILE5052;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8222:
|
|
s->picnum = RRTILE5053;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8223:
|
|
s->picnum = RRTILE5054;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8224:
|
|
s->picnum = RRTILE5055;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8370:
|
|
s->picnum = RRTILE5056;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8371:
|
|
s->picnum = RRTILE5057;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8372:
|
|
s->picnum = RRTILE5058;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8373:
|
|
s->picnum = RRTILE5059;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8396:
|
|
s->picnum = RRTILE5038;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8397:
|
|
s->picnum = RRTILE5039;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8398:
|
|
s->picnum = RRTILE5040;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8399:
|
|
s->picnum = RRTILE5041;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8385:
|
|
s->picnum = RRTILE8386;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8387:
|
|
s->picnum = RRTILE8388;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8389:
|
|
s->picnum = RRTILE8390;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8391:
|
|
s->picnum = RRTILE8392;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE7553:
|
|
s->picnum = RRTILE5035;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8475:
|
|
s->picnum = RRTILE5075;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8498:
|
|
s->picnum = RRTILE5077;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8499:
|
|
s->picnum = RRTILE5078;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE2445:
|
|
s->picnum = RRTILE2450;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE2123:
|
|
s->picnum = RRTILE2124;
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
break;
|
|
case RRTILE3773:
|
|
s->picnum = RRTILE8651;
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
break;
|
|
case RRTILE7533:
|
|
s->picnum = RRTILE5035;
|
|
S_PlayActorSound(495, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE8394:
|
|
s->picnum = RRTILE5072;
|
|
S_PlayActorSound(495, targ);
|
|
break;
|
|
case RRTILE8461:
|
|
case RRTILE8462:
|
|
s->picnum = RRTILE5074;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8679:
|
|
s->picnum = RRTILE8680;
|
|
S_PlayActorSound(DUKE_SHUCKS, targ);
|
|
fi.hitradius(targ, 10, 0, 0, 1, 1);
|
|
if (s->lotag != 0)
|
|
{
|
|
DukeSpriteIterator it;
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == RRTILE8679 && act->s.pal == 4)
|
|
{
|
|
if (act->s.lotag == s->lotag)
|
|
act->s.picnum = RRTILE8680;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case RRTILE3584:
|
|
s->picnum = RRTILE8681;
|
|
S_PlayActorSound(495, targ);
|
|
fi.hitradius(targ, 250, 0, 0, 1, 1);
|
|
break;
|
|
case RRTILE8682:
|
|
s->picnum = RRTILE8683;
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
case RRTILE8099:
|
|
if (s->lotag == 5)
|
|
{
|
|
s->lotag = 0;
|
|
s->picnum = RRTILE5087;
|
|
S_PlayActorSound(340, targ);
|
|
DukeSpriteIterator it;
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == RRTILE8094)
|
|
act->s.picnum = RRTILE5088;
|
|
}
|
|
}
|
|
break;
|
|
case RRTILE2431:
|
|
if (s->pal != 4)
|
|
{
|
|
s->picnum = RRTILE2451;
|
|
if (s->lotag != 0)
|
|
{
|
|
DukeSpriteIterator it;
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == RRTILE2431 && act->s.pal == 4)
|
|
{
|
|
if (s->lotag == act->s.lotag)
|
|
act->s.picnum = RRTILE2451;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case RRTILE2443:
|
|
if (s->pal != 19)
|
|
s->picnum = RRTILE2455;
|
|
break;
|
|
case RRTILE2455:
|
|
S_PlayActorSound(SQUISHED, targ);
|
|
fi.guts(targ, RRTILE2465, 3, myconnectindex);
|
|
deletesprite(targ);
|
|
break;
|
|
case RRTILE2451:
|
|
if (s->pal != 4)
|
|
{
|
|
S_PlayActorSound(SQUISHED, targ);
|
|
if (s->lotag != 0)
|
|
{
|
|
DukeSpriteIterator it;
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == RRTILE2451 && act->s.pal == 4)
|
|
{
|
|
if (s->lotag == act->s.lotag)
|
|
{
|
|
fi.guts(targ, RRTILE2460, 12, myconnectindex);
|
|
fi.guts(targ, RRTILE2465, 3, myconnectindex);
|
|
act->s.xrepeat = 0;
|
|
act->s.yrepeat = 0;
|
|
s->xrepeat = 0;
|
|
s->yrepeat = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fi.guts(targ, RRTILE2460, 12, myconnectindex);
|
|
fi.guts(targ, RRTILE2465, 3, myconnectindex);
|
|
s->xrepeat = 0;
|
|
s->yrepeat = 0;
|
|
}
|
|
}
|
|
break;
|
|
case RRTILE2437:
|
|
S_PlayActorSound(439, targ);
|
|
break;
|
|
}
|
|
|
|
switch (s->picnum)
|
|
{
|
|
case RRTILE3114:
|
|
s->picnum = RRTILE3117;
|
|
break;
|
|
case RRTILE2876:
|
|
s->picnum = RRTILE2990;
|
|
break;
|
|
case RRTILE3152:
|
|
s->picnum = RRTILE3218;
|
|
break;
|
|
case RRTILE3153:
|
|
s->picnum = RRTILE3219;
|
|
break;
|
|
case RRTILE2030:
|
|
s->picnum = RRTILE2034;
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
break;
|
|
case RRTILE2893:
|
|
case RRTILE2915:
|
|
case RRTILE3115:
|
|
case RRTILE3171:
|
|
switch (s->picnum)
|
|
{
|
|
case RRTILE2915:
|
|
s->picnum = RRTILE2977;
|
|
break;
|
|
case RRTILE2893:
|
|
s->picnum = RRTILE2978;
|
|
break;
|
|
case RRTILE3115:
|
|
s->picnum = RRTILE3116;
|
|
break;
|
|
case RRTILE3171:
|
|
s->picnum = RRTILE3216;
|
|
break;
|
|
}
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
break;
|
|
case RRTILE2156:
|
|
case RRTILE2158:
|
|
case RRTILE2160:
|
|
case RRTILE2175:
|
|
s->picnum++;
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
break;
|
|
case RRTILE2137:
|
|
case RRTILE2151:
|
|
case RRTILE2152:
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
s->picnum++;
|
|
for (k = 0; k < 6; k++)
|
|
EGS(s->sectnum, s->x, s->y, s->z - (8 << 8), SCRAP6 + (krand() & 15), -8, 48, 48, krand() & 2047, (krand() & 63) + 64, -(krand() & 4095) - (s->zvel >> 2), targ, 5);
|
|
break;
|
|
case BOWLINGBALL:
|
|
pspr->xvel = (s->xvel >> 1) + (s->xvel >> 2);
|
|
pspr->ang -= (krand() & 16);
|
|
S_PlayActorSound(355, targ);
|
|
break;
|
|
|
|
case STRIPEBALL:
|
|
case QUEBALL:
|
|
case RRTILE3440:
|
|
case RRTILE3440 + 1:
|
|
case HENSTAND:
|
|
case HENSTAND + 1:
|
|
if (pspr->picnum == QUEBALL || pspr->picnum == STRIPEBALL)
|
|
{
|
|
pspr->xvel = (s->xvel >> 1) + (s->xvel >> 2);
|
|
pspr->ang -= (s->ang << 1) + 1024;
|
|
s->ang = getangle(s->x - pspr->x, s->y - pspr->y) - 512;
|
|
if (S_CheckSoundPlaying(POOLBALLHIT) < 2)
|
|
S_PlayActorSound(POOLBALLHIT, targ);
|
|
}
|
|
else if (pspr->picnum == RRTILE3440 || pspr->picnum == RRTILE3440 + 1)
|
|
{
|
|
pspr->xvel = (s->xvel >> 1) + (s->xvel >> 2);
|
|
pspr->ang -= ((s->ang << 1) + krand()) & 64;
|
|
s->ang = (s->ang + krand()) & 16;
|
|
S_PlayActorSound(355, targ);
|
|
}
|
|
else if (pspr->picnum == HENSTAND || pspr->picnum == HENSTAND + 1)
|
|
{
|
|
pspr->xvel = (s->xvel >> 1) + (s->xvel >> 2);
|
|
pspr->ang -= ((s->ang << 1) + krand()) & 16;
|
|
s->ang = (s->ang + krand()) & 16;
|
|
S_PlayActorSound(355, targ);
|
|
}
|
|
else
|
|
{
|
|
if (krand() & 3)
|
|
{
|
|
s->xvel = 164;
|
|
s->ang = pspr->ang;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TREE1:
|
|
case TREE2:
|
|
case TIRE:
|
|
case BOX:
|
|
switch (pspr->picnum)
|
|
{
|
|
case RPG2:
|
|
if (!isRRRA()) break;
|
|
case RADIUSEXPLOSION:
|
|
case RPG:
|
|
case FIRELASER:
|
|
case HYDRENT:
|
|
case HEAVYHBOMB:
|
|
case TRIPBOMBSPRITE:
|
|
case COOLEXPLOSION1:
|
|
case OWHIP:
|
|
case UWHIP:
|
|
if (targ->temp_data[0] == 0)
|
|
{
|
|
s->cstat &= ~257;
|
|
targ->temp_data[0] = 1;
|
|
spawn(targ, BURNING);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CACTUS:
|
|
// case CACTUSBROKE:
|
|
switch (pspr->picnum)
|
|
{
|
|
case RPG2:
|
|
if (!isRRRA()) break;
|
|
case RADIUSEXPLOSION:
|
|
case RPG:
|
|
case FIRELASER:
|
|
case HYDRENT:
|
|
case HEAVYHBOMB:
|
|
case TRIPBOMBSPRITE:
|
|
case COOLEXPLOSION1:
|
|
case OWHIP:
|
|
case UWHIP:
|
|
for (k = 0; k < 64; k++)
|
|
{
|
|
auto j = EGS(s->sectnum, s->x, s->y, s->z - (krand() % (48 << 8)), SCRAP6 + (krand() & 3), -8, 48, 48, krand() & 2047, (krand() & 63) + 64, -(krand() & 4095) - (s->zvel >> 2), targ, 5);
|
|
j->s.pal = 8;
|
|
}
|
|
|
|
if (s->picnum == CACTUS)
|
|
s->picnum = CACTUSBROKE;
|
|
s->cstat &= ~257;
|
|
// else deletesprite(i);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
case FANSPRITE:
|
|
s->picnum = FANSPRITEBROKE;
|
|
s->cstat &= (65535 - 257);
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
for (j = 0; j < 16; j++) RANDOMSCRAP(targ);
|
|
|
|
break;
|
|
case WATERFOUNTAIN:
|
|
case WATERFOUNTAIN + 1:
|
|
case WATERFOUNTAIN + 2:
|
|
case WATERFOUNTAIN + 3:
|
|
spawn(targ, TOILETWATER);
|
|
break;
|
|
case SATELITE:
|
|
case FUELPOD:
|
|
case SOLARPANNEL:
|
|
case ANTENNA:
|
|
if (gs.actorinfo[SHOTSPARK1].scriptaddress && pspr->extra != ScriptCode[gs.actorinfo[SHOTSPARK1].scriptaddress])
|
|
{
|
|
for (j = 0; j < 15; j++)
|
|
EGS(s->sectnum, s->x, s->y, sector[s->sectnum].floorz - (12 << 8) - (j << 9), SCRAP1 + (krand() & 15), -8, 64, 64,
|
|
krand() & 2047, (krand() & 127) + 64, -(krand() & 511) - 256, targ, 5);
|
|
spawn(targ, EXPLOSION2);
|
|
deletesprite(targ);
|
|
}
|
|
break;
|
|
case RRTILE1824:
|
|
if (!isRRRA()) break;
|
|
case BOTTLE1:
|
|
case BOTTLE2:
|
|
case BOTTLE3:
|
|
case BOTTLE4:
|
|
case BOTTLE5:
|
|
case BOTTLE6:
|
|
case BOTTLE8:
|
|
case BOTTLE10:
|
|
case BOTTLE11:
|
|
case BOTTLE12:
|
|
case BOTTLE13:
|
|
case BOTTLE14:
|
|
case BOTTLE15:
|
|
case BOTTLE16:
|
|
case BOTTLE17:
|
|
case BOTTLE18:
|
|
case BOTTLE19:
|
|
case DOMELITE:
|
|
case SUSHIPLATE1:
|
|
case SUSHIPLATE2:
|
|
case SUSHIPLATE3:
|
|
case SUSHIPLATE4:
|
|
case SUSHIPLATE5:
|
|
case WAITTOBESEATED:
|
|
case VASE:
|
|
case STATUEFLASH:
|
|
case STATUE:
|
|
if (s->picnum == BOTTLE10)
|
|
fi.lotsofmoney(targ, 4 + (krand() & 3));
|
|
else if (s->picnum == STATUE || s->picnum == STATUEFLASH)
|
|
{
|
|
lotsofcolourglass(targ, -1, 40);
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
}
|
|
else if (s->picnum == VASE)
|
|
lotsofglass(targ, -1, 40);
|
|
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
s->ang = krand() & 2047;
|
|
lotsofglass(targ, -1, 8);
|
|
deletesprite(targ);
|
|
break;
|
|
case RRTILE2654:
|
|
case RRTILE2656:
|
|
case RRTILE3172:
|
|
if (!isRRRA()) break;
|
|
case BOTTLE7:
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
lotsofglass(targ, -1, 10);
|
|
deletesprite(targ);
|
|
break;
|
|
case FORCESPHERE:
|
|
{
|
|
s->xrepeat = 0;
|
|
auto Owner = targ->GetOwner();
|
|
if (Owner)
|
|
{
|
|
Owner->temp_data[0] = 32;
|
|
Owner->temp_data[1] = !Owner->temp_data[1];
|
|
Owner->temp_data[2] ++;
|
|
}
|
|
spawn(targ, EXPLOSION2);
|
|
break;
|
|
}
|
|
case TOILET:
|
|
s->picnum = TOILETBROKE;
|
|
s->cstat |= (krand() & 1) << 2;
|
|
s->cstat &= ~257;
|
|
spawn(targ, TOILETWATER);
|
|
S_PlayActorSound(GLASS_BREAKING, targ);
|
|
break;
|
|
|
|
case STALL:
|
|
s->picnum = STALLBROKE;
|
|
s->cstat |= (krand() & 1) << 2;
|
|
s->cstat &= ~257;
|
|
spawn(targ, TOILETWATER);
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
|
|
case HYDRENT:
|
|
s->picnum = BROKEFIREHYDRENT;
|
|
spawn(targ, TOILETWATER);
|
|
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
break;
|
|
|
|
case GRATE1:
|
|
s->picnum = BGRATE1;
|
|
s->cstat &= (65535 - 256 - 1);
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
|
|
case CIRCLEPANNEL:
|
|
s->picnum = CIRCLEPANNELBROKE;
|
|
s->cstat &= (65535 - 256 - 1);
|
|
S_PlayActorSound(VENT_BUST, targ);
|
|
break;
|
|
|
|
case PIPE1:
|
|
case PIPE2:
|
|
case PIPE3:
|
|
case PIPE4:
|
|
case PIPE5:
|
|
case PIPE6:
|
|
switch (s->picnum)
|
|
{
|
|
case PIPE1:s->picnum = PIPE1B; break;
|
|
case PIPE2:s->picnum = PIPE2B; break;
|
|
case PIPE3:s->picnum = PIPE3B; break;
|
|
case PIPE4:s->picnum = PIPE4B; break;
|
|
case PIPE5:s->picnum = PIPE5B; break;
|
|
case PIPE6:s->picnum = PIPE6B; break;
|
|
}
|
|
{
|
|
auto j = spawn(targ, STEAM);
|
|
j->s.z = sector[s->sectnum].floorz - (32 << 8);
|
|
}
|
|
break;
|
|
|
|
case CHAIR1:
|
|
case CHAIR2:
|
|
s->picnum = BROKENCHAIR;
|
|
s->cstat = 0;
|
|
break;
|
|
case CHAIR3:
|
|
case MOVIECAMERA:
|
|
case SCALE:
|
|
case VACUUM:
|
|
case CAMERALIGHT:
|
|
case IVUNIT:
|
|
case POT1:
|
|
case POT2:
|
|
case POT3:
|
|
S_PlayActorSound(GLASS_HEAVYBREAK, targ);
|
|
for (j = 0; j < 16; j++) RANDOMSCRAP(targ);
|
|
deletesprite(targ);
|
|
break;
|
|
case PLAYERONWATER:
|
|
targ = targ->GetOwner();
|
|
if (!targ) break;
|
|
s = &targ->s;
|
|
default:
|
|
if ((s->cstat & 16) && s->hitag == 0 && s->lotag == 0 && s->statnum == 0)
|
|
break;
|
|
|
|
if ((pspr->picnum == SHRINKSPARK || pspr->picnum == FREEZEBLAST || proj->GetOwner() != targ) && s->statnum != 4)
|
|
{
|
|
if (badguy(targ) == 1)
|
|
{
|
|
if (pspr->picnum == RPG) pspr->extra <<= 1;
|
|
else if (isRRRA() && pspr->picnum == RPG2) pspr->extra <<= 1;
|
|
|
|
if ((s->picnum != DRONE))
|
|
if (pspr->picnum != FREEZEBLAST)
|
|
//if (actortype[s->picnum] == 0) //TRANSITIONAL. Cannot be done right with EDuke mess backing the engine.
|
|
{
|
|
auto spawned = spawn(proj, JIBS6);
|
|
if (pspr->pal == 6)
|
|
spawned->s.pal = 6;
|
|
spawned->s.z += (4 << 8);
|
|
spawned->s.xvel = 16;
|
|
spawned->s.xrepeat = spawned->s.yrepeat = 24;
|
|
spawned->s.ang += 32 - (krand() & 63);
|
|
}
|
|
|
|
auto Owner = proj->GetOwner();
|
|
|
|
if (Owner && Owner->s.picnum == APLAYER && s->picnum != DRONE)
|
|
if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON)
|
|
{
|
|
fi.shoot(targ, BLOODSPLAT3);
|
|
fi.shoot(targ, BLOODSPLAT1);
|
|
fi.shoot(targ, BLOODSPLAT2);
|
|
fi.shoot(targ, BLOODSPLAT4);
|
|
}
|
|
|
|
if (s->statnum == 2)
|
|
{
|
|
changespritestat(targ, 1);
|
|
targ->timetosleep = SLEEPTIME;
|
|
}
|
|
}
|
|
|
|
if (s->statnum != 2)
|
|
{
|
|
if (pspr->picnum == FREEZEBLAST && ((s->picnum == APLAYER && s->pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ)))
|
|
return;
|
|
|
|
targ->picnum = pspr->picnum;
|
|
targ->extra += pspr->extra;
|
|
if (s->picnum != COW)
|
|
targ->ang = pspr->ang;
|
|
targ->SetHitOwner(proj->GetOwner());
|
|
}
|
|
|
|
if (s->statnum == 10)
|
|
{
|
|
p = s->yvel;
|
|
if (ps[p].newOwner != nullptr)
|
|
{
|
|
ps[p].newOwner = nullptr;
|
|
ps[p].posx = ps[p].oposx;
|
|
ps[p].posy = ps[p].oposy;
|
|
ps[p].posz = ps[p].oposz;
|
|
|
|
updatesector(ps[p].posx, ps[p].posy, &ps[p].cursectnum);
|
|
|
|
DukeStatIterator it(STAT_EFFECTOR);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == CAMERA1) act->s.yvel = 0;
|
|
}
|
|
}
|
|
auto Owner = targ->GetHitOwner();
|
|
if (!Owner || Owner->s.picnum != APLAYER)
|
|
if (ud.player_skill >= 3)
|
|
pspr->extra += (pspr->extra >> 1);
|
|
}
|
|
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void checksectors_r(int snum)
|
|
{
|
|
int i = -1, oldz;
|
|
struct player_struct* p;
|
|
int hitscanwall;
|
|
short neartagsector, neartagwall;
|
|
DDukeActor* neartagsprite;
|
|
int neartaghitdist;
|
|
|
|
p = &ps[snum];
|
|
auto pact = p->GetActor();
|
|
|
|
switch (sector[p->cursectnum].lotag)
|
|
{
|
|
|
|
case 32767:
|
|
sector[p->cursectnum].lotag = 0;
|
|
FTA(9, p);
|
|
p->secret_rooms++;
|
|
return;
|
|
case -1:
|
|
sector[p->cursectnum].lotag = 0;
|
|
if (!isRRRA() || !RRRA_ExitedLevel)
|
|
{
|
|
setnextmap(false);
|
|
RRRA_ExitedLevel = 1;
|
|
}
|
|
return;
|
|
case -2:
|
|
sector[p->cursectnum].lotag = 0;
|
|
p->timebeforeexit = 26 * 8;
|
|
p->customexitsound = sector[p->cursectnum].hitag;
|
|
return;
|
|
default:
|
|
if (sector[p->cursectnum].lotag >= 10000)
|
|
{
|
|
if (snum == screenpeek || ud.coop == 1)
|
|
S_PlayActorSound(sector[p->cursectnum].lotag - 10000, pact);
|
|
sector[p->cursectnum].lotag = 0;
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
//After this point the the player effects the map with space
|
|
|
|
if (chatmodeon || p->GetActor()->s.extra <= 0) return;
|
|
|
|
if (ud.cashman && PlayerInput(snum, SB_OPEN))
|
|
fi.lotsofmoney(p->GetActor(), 2);
|
|
|
|
|
|
if (!(PlayerInput(snum, SB_OPEN)))
|
|
p->toggle_key_flag = 0;
|
|
|
|
else if (!p->toggle_key_flag)
|
|
{
|
|
neartagsprite = nullptr;
|
|
p->toggle_key_flag = 1;
|
|
hitscanwall = -1;
|
|
|
|
hitawall(p, &hitscanwall);
|
|
|
|
if (isRRRA())
|
|
{
|
|
if (hitscanwall >= 0 && wall[hitscanwall].overpicnum == MIRROR && snum == screenpeek)
|
|
if (numplayers == 1)
|
|
{
|
|
if (S_CheckActorSoundPlaying(pact, 27) == 0 && S_CheckActorSoundPlaying(pact, 28) == 0 && S_CheckActorSoundPlaying(pact, 29) == 0
|
|
&& S_CheckActorSoundPlaying(pact, 257) == 0 && S_CheckActorSoundPlaying(pact, 258) == 0)
|
|
{
|
|
short snd = krand() % 5;
|
|
if (snd == 0)
|
|
S_PlayActorSound(27, pact);
|
|
else if (snd == 1)
|
|
S_PlayActorSound(28, pact);
|
|
else if (snd == 2)
|
|
S_PlayActorSound(29, pact);
|
|
else if (snd == 3)
|
|
S_PlayActorSound(257, pact);
|
|
else if (snd == 4)
|
|
S_PlayActorSound(258, pact);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (hitscanwall >= 0 && wall[hitscanwall].overpicnum == MIRROR)
|
|
if (wall[hitscanwall].lotag > 0 && S_CheckActorSoundPlaying(pact, wall[hitscanwall].lotag) == 0 && snum == screenpeek)
|
|
{
|
|
S_PlayActorSound(wall[hitscanwall].lotag, pact);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (hitscanwall >= 0 && (wall[hitscanwall].cstat & 16))
|
|
if (wall[hitscanwall].lotag)
|
|
return;
|
|
|
|
if (isRRRA())
|
|
{
|
|
if (p->OnMotorcycle)
|
|
{
|
|
if (p->MotoSpeed < 20)
|
|
{
|
|
OffMotorcycle(p);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
if (p->OnBoat)
|
|
{
|
|
if (p->MotoSpeed < 20)
|
|
{
|
|
OffBoat(p);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
neartag(p->posx, p->posy, p->posz, p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 3);
|
|
}
|
|
|
|
if (p->newOwner != nullptr)
|
|
neartag(p->oposx, p->oposy, p->oposz, p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 1);
|
|
else
|
|
{
|
|
neartag(p->posx, p->posy, p->posz, p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 1);
|
|
if (neartagsprite == nullptr && neartagwall == -1 && neartagsector == -1)
|
|
neartag(p->posx, p->posy, p->posz + (8 << 8), p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 1);
|
|
if (neartagsprite == nullptr && neartagwall == -1 && neartagsector == -1)
|
|
neartag(p->posx, p->posy, p->posz + (16 << 8), p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 1);
|
|
if (neartagsprite == nullptr && neartagwall == -1 && neartagsector == -1)
|
|
{
|
|
neartag(p->posx, p->posy, p->posz + (16 << 8), p->GetActor()->s.sectnum, p->angle.oang.asbuild(), &neartagsector, &neartagwall, &neartagsprite, &neartaghitdist, 1280L, 3);
|
|
if (neartagsprite != nullptr)
|
|
{
|
|
switch (neartagsprite->s.picnum)
|
|
{
|
|
case FEM10:
|
|
case NAKED1:
|
|
case STATUE:
|
|
case TOUGHGAL:
|
|
return;
|
|
case COW:
|
|
neartagsprite->spriteextra = 1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
neartagsprite = nullptr;
|
|
neartagwall = -1;
|
|
neartagsector = -1;
|
|
}
|
|
}
|
|
|
|
if (p->newOwner == nullptr && neartagsprite == nullptr && neartagsector == -1 && neartagwall == -1)
|
|
if (isanunderoperator(sector[p->GetActor()->s.sectnum].lotag))
|
|
neartagsector = p->GetActor()->s.sectnum;
|
|
|
|
if (neartagsector >= 0 && (sector[neartagsector].lotag & 16384))
|
|
return;
|
|
|
|
if (neartagsprite == nullptr && neartagwall == -1)
|
|
if (sector[p->cursectnum].lotag == 2)
|
|
{
|
|
DDukeActor* hit;
|
|
oldz = hitasprite(p->GetActor(), &hit);
|
|
if (hit) neartagsprite = hit;
|
|
if (oldz > 1280) neartagsprite = nullptr;
|
|
}
|
|
|
|
if (neartagsprite != nullptr)
|
|
{
|
|
if (fi.checkhitswitch(snum, -1,neartagsprite)) return;
|
|
|
|
switch (neartagsprite->s.picnum)
|
|
{
|
|
case RRTILE8448:
|
|
if (!isRRRA()) return;
|
|
if (!S_CheckActorSoundPlaying(neartagsprite, 340))
|
|
S_PlayActorSound(340, neartagsprite);
|
|
return;
|
|
case RRTILE8704:
|
|
if (!isRRRA()) return;
|
|
if (numplayers == 1)
|
|
{
|
|
// This is from RedneckGDX - the version in RR Reconstruction looked like broken nonsense.
|
|
if (S_CheckActorSoundPlaying(neartagsprite, 445) || sound445done != 0)
|
|
{
|
|
if (!S_CheckActorSoundPlaying(neartagsprite, 445) && !S_CheckActorSoundPlaying(neartagsprite, 446) &&
|
|
!S_CheckActorSoundPlaying(neartagsprite, 447) && sound445done != 0)
|
|
{
|
|
if ((krand() % 2) == 1)
|
|
S_PlayActorSound(446, neartagsprite);
|
|
else
|
|
S_PlayActorSound(447, neartagsprite);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
S_PlayActorSound(445, neartagsprite);
|
|
sound445done = 1;
|
|
}
|
|
}
|
|
return;
|
|
case EMPTYBIKE:
|
|
if (!isRRRA()) return;
|
|
OnMotorcycle(p, neartagsprite);
|
|
return;
|
|
case EMPTYBOAT:
|
|
if (!isRRRA()) return;
|
|
OnBoat(p, neartagsprite);
|
|
return;
|
|
case RRTILE8164:
|
|
case RRTILE8165:
|
|
case RRTILE8166:
|
|
case RRTILE8167:
|
|
case RRTILE8168:
|
|
case RRTILE8591:
|
|
case RRTILE8592:
|
|
case RRTILE8593:
|
|
case RRTILE8594:
|
|
case RRTILE8595:
|
|
if (!isRRRA()) return;
|
|
neartagsprite->s.extra = 60;
|
|
S_PlayActorSound(235, neartagsprite);
|
|
return;
|
|
|
|
case TOILET:
|
|
case STALL:
|
|
case RRTILE2121:
|
|
case RRTILE2122:
|
|
if (p->last_pissed_time == 0)
|
|
{
|
|
S_PlayActorSound(435, pact);
|
|
|
|
p->last_pissed_time = 26 * 220;
|
|
p->transporter_hold = 29 * 2;
|
|
if (p->holster_weapon == 0)
|
|
{
|
|
p->holster_weapon = 1;
|
|
p->weapon_pos = -1;
|
|
}
|
|
if (p->GetActor()->s.extra <= (gs.max_player_health - (gs.max_player_health / 10)))
|
|
{
|
|
p->GetActor()->s.extra += gs.max_player_health / 10;
|
|
p->last_extra = p->GetActor()->s.extra;
|
|
}
|
|
else if (p->GetActor()->s.extra < gs.max_player_health)
|
|
p->GetActor()->s.extra = gs.max_player_health;
|
|
}
|
|
else if (S_CheckActorSoundPlaying(pact, DUKE_GRUNT) == 0)
|
|
S_PlayActorSound(DUKE_GRUNT, pact);
|
|
return;
|
|
case WATERFOUNTAIN:
|
|
if (neartagsprite->temp_data[0] != 1)
|
|
{
|
|
neartagsprite->temp_data[0] = 1;
|
|
neartagsprite->SetOwner(p->GetActor());
|
|
|
|
if (p->GetActor()->s.extra < gs.max_player_health)
|
|
{
|
|
p->GetActor()->s.extra++;
|
|
S_PlayActorSound(DUKE_DRINKING, pact);
|
|
}
|
|
}
|
|
return;
|
|
case PLUG:
|
|
S_PlayActorSound(SHORT_CIRCUIT, pact);
|
|
p->GetActor()->s.extra -= 2 + (krand() & 3);
|
|
SetPlayerPal(p, PalEntry(32, 48, 48, 64));
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!PlayerInput(snum, SB_OPEN)) return;
|
|
|
|
if (neartagwall == -1 && neartagsector == -1 && neartagsprite == nullptr)
|
|
if (abs(hits(p->GetActor())) < 512)
|
|
{
|
|
if ((krand() & 255) < 16)
|
|
S_PlayActorSound(DUKE_SEARCH2, pact);
|
|
else S_PlayActorSound(DUKE_SEARCH, pact);
|
|
return;
|
|
}
|
|
|
|
if (neartagwall >= 0)
|
|
{
|
|
if (wall[neartagwall].lotag > 0 && fi.isadoorwall(wall[neartagwall].picnum))
|
|
{
|
|
if (hitscanwall == neartagwall || hitscanwall == -1)
|
|
fi.checkhitswitch(snum, neartagwall, nullptr);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (neartagsector >= 0 && (sector[neartagsector].lotag & 16384) == 0 && isanearoperator(sector[neartagsector].lotag))
|
|
{
|
|
short unk = 0;
|
|
DukeSectIterator it(neartagsector);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == ACTIVATOR || act->s.picnum == MASTERSWITCH)
|
|
return;
|
|
}
|
|
if (haskey(neartagsector, snum))
|
|
operatesectors(neartagsector, p->GetActor());
|
|
else
|
|
{
|
|
if (neartagsprite && neartagsprite->spriteextra > 3)
|
|
S_PlayActorSound(99, pact);
|
|
else
|
|
S_PlayActorSound(419, pact);
|
|
FTA(41, p);
|
|
}
|
|
}
|
|
else if ((sector[p->GetActor()->s.sectnum].lotag & 16384) == 0)
|
|
{
|
|
if (isanunderoperator(sector[p->GetActor()->s.sectnum].lotag))
|
|
{
|
|
DukeSectIterator it(p->GetActor()->s.sectnum);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == ACTIVATOR || act->s.picnum == MASTERSWITCH)
|
|
return;
|
|
}
|
|
if (haskey(neartagsector, snum))
|
|
operatesectors(p->GetActor()->s.sectnum, p->GetActor());
|
|
else
|
|
{
|
|
if (neartagsprite && neartagsprite->spriteextra > 3)
|
|
S_PlayActorSound(99, pact);
|
|
else
|
|
S_PlayActorSound(419, pact);
|
|
FTA(41, p);
|
|
}
|
|
}
|
|
else fi.checkhitswitch(snum, neartagwall, nullptr);
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void dofurniture(int wl, int sect, int snum)
|
|
{
|
|
int startwall;
|
|
int endwall;
|
|
int i;
|
|
int var_C;
|
|
int x;
|
|
int y;
|
|
int min_x;
|
|
int min_y;
|
|
int max_x;
|
|
int max_y;
|
|
int ins;
|
|
int var_cx;
|
|
|
|
startwall = sector[wall[wl].nextsector].wallptr;;
|
|
endwall = startwall + sector[wall[wl].nextsector].wallnum;
|
|
var_C = 1;
|
|
max_x = max_y = -0x20000;
|
|
min_x = min_y = 0x20000;
|
|
var_cx = sector[sect].hitag;
|
|
if (var_cx > 16)
|
|
var_cx = 16;
|
|
else if (var_cx == 0)
|
|
var_cx = 4;
|
|
for (i = startwall; i < endwall; i++)
|
|
{
|
|
x = wall[i].x;
|
|
y = wall[i].y;
|
|
if (x > max_x)
|
|
max_x = x;
|
|
if (y > max_y)
|
|
max_y = y;
|
|
if (x < min_x)
|
|
min_x = x;
|
|
if (y < min_y)
|
|
min_y = y;
|
|
}
|
|
max_x += var_cx + 1;
|
|
max_y += var_cx + 1;
|
|
min_x -= var_cx + 1;
|
|
min_y -= var_cx + 1;
|
|
ins = inside(max_x, max_y, sect);
|
|
if (!ins)
|
|
var_C = 0;
|
|
ins = inside(max_x, min_y, sect);
|
|
if (!ins)
|
|
var_C = 0;
|
|
ins = inside(min_x, min_y, sect);
|
|
if (!ins)
|
|
var_C = 0;
|
|
ins = inside(min_x, max_y, sect);
|
|
if (!ins)
|
|
var_C = 0;
|
|
if (var_C)
|
|
{
|
|
if (S_CheckActorSoundPlaying(ps[snum].GetActor(), 389) == 0)
|
|
S_PlayActorSound(389, ps[snum].GetActor());
|
|
for (i = startwall; i < endwall; i++)
|
|
{
|
|
x = wall[i].x;
|
|
y = wall[i].y;
|
|
switch (wall[wl].lotag)
|
|
{
|
|
case 42:
|
|
y = wall[i].y + var_cx;
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 41:
|
|
x = wall[i].x - var_cx;
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 40:
|
|
y = wall[i].y - var_cx;
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 43:
|
|
x = wall[i].x + var_cx;
|
|
dragpoint(i, x, y);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = startwall; i < endwall; i++)
|
|
{
|
|
x = wall[i].x;
|
|
y = wall[i].y;
|
|
switch (wall[wl].lotag)
|
|
{
|
|
case 42:
|
|
y = wall[i].y - (var_cx - 2);
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 41:
|
|
x = wall[i].x + (var_cx - 2);
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 40:
|
|
y = wall[i].y + (var_cx - 2);
|
|
dragpoint(i, x, y);
|
|
break;
|
|
case 43:
|
|
x = wall[i].x - (var_cx - 2);
|
|
dragpoint(i, x, y);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void tearitup(int sect)
|
|
{
|
|
DukeSectIterator it(sect);
|
|
while (auto act = it.Next())
|
|
{
|
|
if (act->s.picnum == DESTRUCTO)
|
|
{
|
|
act->picnum = SHOTSPARK1;
|
|
act->extra = 1;
|
|
}
|
|
}
|
|
}
|
|
END_DUKE_NS
|