- scriptified activators and locators.

This commit is contained in:
Christoph Oelckers 2022-11-20 12:43:24 +01:00
parent 9fa2fb75cf
commit cb005062cd
16 changed files with 148 additions and 56 deletions

View file

@ -16,3 +16,6 @@ xx(DukeMasterSwitch)
xx(DukeTouchplate)
xx(DukeSoundController)
xx(DukeRespawnController)
xx(DukeActivator)
xx(DukeActivatorLocked)
xx(DukeLocator)

View file

@ -2123,7 +2123,7 @@ void handle_se14(DDukeActor* actor, bool checkstat, int RPG, int JIBS6)
{
if (a2->spr.statnum != STAT_PLAYER && a2->sector()->lotag != 2 &&
(a2->spr.picnum != SECTOREFFECTOR || a2->spr.lotag == SE_49_POINT_LIGHT || a2->spr.lotag == SE_50_SPOT_LIGHT) &&
a2->spr.picnum != LOCATORS)
!islocator(a2))
{
a2->spr.pos.XY() = rotatepoint(actor->spr.pos.XY(), a2->spr.pos.XY(), diffangle) + vec;
a2->spr.angle += diffangle;
@ -2166,7 +2166,7 @@ void handle_se14(DDukeActor* actor, bool checkstat, int RPG, int JIBS6)
DukeSectIterator itr(actOwner->sector());
while (auto a2 = itr.Next())
{
if (a2->spr.statnum == 1 && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS)
if (a2->spr.statnum == 1 && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && !islocator(a2))
{
auto k = a2->sector();
updatesector(a2->spr.pos, &k);
@ -2285,7 +2285,7 @@ void handle_se30(DDukeActor *actor, int JIBS6)
DukeSectIterator its(actor->sector());
while (auto a2 = its.Next())
{
if (a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS)
if (a2->spr.picnum != SECTOREFFECTOR && !islocator(a2))
{
a2->spr.pos += vect;
@ -2324,7 +2324,7 @@ void handle_se30(DDukeActor *actor, int JIBS6)
DukeSectIterator it(Owner->sector());
while (auto a2 = it.Next())
{
if (a2->spr.statnum == STAT_ACTOR && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS)
if (a2->spr.statnum == STAT_ACTOR && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && !islocator(a2))
{
// if(a2->spr.sector != actor->spr.sector)
{

View file

@ -2498,7 +2498,7 @@ int ParseState::parse(void)
DDukeActor* a2;
while ((a2 = it.Next()))
{
if (a2->spr.picnum == ACTIVATOR)
if (isactivator(a2))
break;
}
if (a2 == nullptr)

View file

@ -29,6 +29,21 @@ inline int isrespawncontroller(DDukeActor* actor)
return actor->GetClass()->TypeName == NAME_DukeRespawnController;
}
inline int isactivator(DDukeActor* actor)
{
return actor->GetClass()->TypeName == NAME_DukeActivator;
}
inline int islockedactivator(DDukeActor* actor)
{
return actor->GetClass()->TypeName == NAME_DukeActivatorLocked;
}
inline int islocator(DDukeActor* actor)
{
return actor->GetClass()->TypeName == NAME_DukeLocator;
}
inline int badguypic(int const tileNum)
{
return ((gs.actorinfo[tileNum].flags & (SFLAG_INTERNAL_BADGUY | SFLAG_BADGUY)) != 0);

View file

@ -2446,7 +2446,7 @@ void onMotorcycleHit(int snum, DDukeActor* victim)
p->TurbCount = 6;
}
else if ((victim->spr.picnum == RRTILE2431 || victim->spr.picnum == RRTILE2443 || victim->spr.picnum == RRTILE2451 || victim->spr.picnum == RRTILE2455)
&& victim->spr.picnum != ACTIVATORLOCKED && p->MotoSpeed > 45)
&& !islockedactivator(victim) && p->MotoSpeed > 45)
{
S_PlayActorSound(SQUISHED, victim);
if (victim->spr.picnum == RRTILE2431 || victim->spr.picnum == RRTILE2451)

View file

@ -47,10 +47,6 @@ void premapcontroller(DDukeActor* ac)
{
switch (ac->spr.picnum)
{
case ACTIVATOR:
case ACTIVATORLOCKED:
case LOCATORS:
case MUSICANDSFX:
case SECTOREFFECTOR:
ac->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN | CSTAT_SPRITE_ALIGNMENT_MASK);
break;

View file

@ -1128,7 +1128,7 @@ void operateactivators(int low, player_struct* plr)
{
if (act->spr.lotag == low)
{
if (act->spr.picnum == ACTIVATORLOCKED)
if (islockedactivator(act))
{
act->sector()->lotag ^= 16384;

View file

@ -592,7 +592,7 @@ void activatebysector_d(sectortype* sect, DDukeActor* activator)
DukeSectIterator it(sect);
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR)
if (isactivator(act))
{
operateactivators(act->spr.lotag, nullptr);
didit = 1;
@ -1669,7 +1669,7 @@ void checksectors_d(int snum)
DukeSectIterator it(near.hitSector);
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR || ismasterswitch(act))
if (isactivator(act) || ismasterswitch(act))
return;
}
operatesectors(near.hitSector, p->GetActor());
@ -1681,7 +1681,7 @@ void checksectors_d(int snum)
DukeSectIterator it(p->GetActor()->sector());
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR || ismasterswitch(act)) return;
if (isactivator(act) || ismasterswitch(act)) return;
}
operatesectors(p->GetActor()->sector(), p->GetActor());
}

View file

@ -875,7 +875,7 @@ void activatebysector_r(sectortype* sect, DDukeActor* activator)
DukeSectIterator it(sect);
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR)
if (isactivator(act))
{
operateactivators(act->spr.lotag, nullptr);
// return;
@ -2637,7 +2637,7 @@ void checksectors_r(int snum)
DukeSectIterator it(near.hitSector);
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR || ismasterswitch(act))
if (isactivator(act) || ismasterswitch(act))
return;
}
if (haskey(near.hitSector, snum))
@ -2658,7 +2658,7 @@ void checksectors_r(int snum)
DukeSectIterator it(p->GetActor()->sector());
while (auto act = it.Next())
{
if (act->spr.picnum == ACTIVATOR || ismasterswitch(act))
if (isactivator(act) || ismasterswitch(act))
return;
}
if (haskey(near.hitSector, snum))

View file

@ -297,7 +297,7 @@ void spawninitdefault(DDukeActor* actj, DDukeActor *act)
act->clipdist = 20;
if (actj)
{
if (actj->spr.picnum == RESPAWN)
if (isrespawncontroller(actj))
act->tempval = act->spr.pal = actj->spr.pal;
ChangeActorStat(act, STAT_ACTOR);
}
@ -917,7 +917,7 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
DukeSectIterator it(actor->sector());
while (auto itActor = it.Next())
{
if (itActor->spr.picnum == ACTIVATOR || itActor->spr.picnum == ACTIVATORLOCKED)
if (isactivator(itActor) || islockedactivator(itActor))
actor->flags2 |= SFLAG2_USEACTIVATOR;
}
ChangeActorStat(actor, STAT_LIGHT);

View file

@ -520,18 +520,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
initshell(actj, act, act->spr.picnum == SHELL);
break;
case RESPAWN:
act->spr.extra = 66 - 13;
if (ud.multimode < 2 && act->spr.pal == 1)
{
act->spr.scale = DVector2(0, 0);
ChangeActorStat(act, STAT_MISC);
break;
}
act->spr.cstat = CSTAT_SPRITE_INVISIBLE;
ChangeActorStat(act, STAT_FX);
break;
case ONFIRE:
// Twentieth Anniversary World Tour
if (!isWorldTour())
@ -779,19 +767,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
break;
case LOCATORS:
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
ChangeActorStat(act, STAT_LOCATOR);
break;
case ACTIVATORLOCKED:
case ACTIVATOR:
act->spr.cstat = CSTAT_SPRITE_INVISIBLE;
if (act->spr.picnum == ACTIVATORLOCKED)
act->sector()->lotag |= 16384;
ChangeActorStat(act, STAT_ACTIVATOR);
break;
case OOZ:
case OOZ2:
{

View file

@ -948,18 +948,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
}
break;
case LOCATORS:
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
ChangeActorStat(act, STAT_LOCATOR);
break;
case ACTIVATORLOCKED:
case ACTIVATOR:
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
if (act->spr.picnum == ACTIVATORLOCKED)
sectp->lotag ^= 16384;
ChangeActorStat(act, STAT_ACTIVATOR);
break;
case OOZ:
{

View file

@ -1,7 +1,10 @@
spawnclasses
{
2 = DukeActivator
3 = DukeTouchplate
4 = DukeActivatorLocked
5 = DukeSoundController
6 = DukeLocator
8 = DukeMasterSwitch
9 = DukeRespawnController

View file

@ -1,7 +1,10 @@
spawnclasses
{
2 = DukeActivator
3 = DukeTouchplate
4 = DukeActivatorLocked
5 = DukeSoundController
6 = DukeLocator
8 = DukeMasterSwitch
9 = DukeRespawnController

View file

@ -50,6 +50,7 @@ version "4.10"
#include "zscript/games/duke/ui/screens.zs"
#include "zscript/games/duke/ui/cutscenes.zs"
#include "zscript/games/duke/ui/menu.zs"
#include "zscript/games/duke/actors/controllers.zs"
#include "zscript/games/duke/actors/masterswitch.zs"
#include "zscript/games/duke/actors/touchplate.zs"
#include "zscript/games/duke/actors/soundcontroller.zs"

View file

@ -0,0 +1,108 @@
class DukeActivator : DukeActor
{
default
{
statnum STAT_ACTIVATOR;
}
override void Initialize()
{
self.cstat = CSTAT_SPRITE_INVISIBLE;
}
/* this first needs work on the sector effectors.
override void onActivate(int low, DukePlayer plr)
{
switch (self.hitag)
{
case 0:
break;
case 1:
if (self.sector.floorz != self.sector.ceilingz)
{
continue;
}
break;
case 2:
if (self.sector.floorz == self.sector.ceilingz)
{
continue;
}
break;
}
if (self.sector.lotag < 3)
{
DukeSectIterator itr;
for(let a2 = itr.First(self.sector); a2; a2 = itr.Next())
{
// todo: move this into the effectors as a virtual override.
if (a2.statnum == STAT_EFFECTOR) switch (a2.lotag)
{
case SE_18_INCREMENTAL_SECTOR_RISE_FALL:
if (Raze.isRRRA()) break;
case SE_36_PROJ_SHOOTER:
case SE_31_FLOOR_RISE_FALL:
case SE_32_CEILING_RISE_FALL:
a2.temp_data[0] = 1 - a2.temp_data[0];
a2.callsound(self.sector());
break;
}
}
}
if (k == -1 && (self.sector.lotag & 0xff) == SE_22_TEETH_DOOR)
k = act.callsound(self.sector);
self.operatesectors(self.sector);
}
*/
}
class DukeLocator : DukeActor
{
default
{
statnum STAT_LOCATOR;
}
override void Initialize()
{
self.cstat = CSTAT_SPRITE_INVISIBLE;
}
}
class DukeActivatorLocked : DukeActor
{
default
{
statnum STAT_ACTIVATOR;
}
override void Initialize()
{
self.cstat = CSTAT_SPRITE_INVISIBLE;
if (!Raze.IsRR()) self.lotag |= 16384;
else self.lotag ^= 16384;
}
/* must wait until Activator.onActivate can be done.
override void onActivate(int low, DukePlayer plr)
{
if (self.lotag == low)
{
self.sector.lotag ^= 16384;
if (plr)
{
if (self.sector.lotag & 16384)
plr.FTA(QUOTE_LOCKED, true);
else plr.FTA(QUOTE_UNLOCKED, true);
}
}
}
*/
}