- scriptified the remaining controller sprites.

This commit is contained in:
Christoph Oelckers 2022-11-20 13:57:51 +01:00
parent cb005062cd
commit b069904be1
17 changed files with 199 additions and 90 deletions

View file

@ -102,6 +102,8 @@ DEFINE_FIELD_X(sectortype, sectortype, exflags)
DEFINE_FIELD_X(sectortype, sectortype, floorz)
DEFINE_FIELD_X(sectortype, sectortype, ceilingz)
DEFINE_FIELD_X(sectortype, sectortype, shadedsector)
DEFINE_FIELD_NAMED_X(walltype, walltype, xpan_, xpan)
DEFINE_FIELD_NAMED_X(walltype, walltype, ypan_, ypan)
DEFINE_FIELD_X(walltype, walltype, pos)

View file

@ -334,6 +334,19 @@ void movecyclers(void)
}
}
void addcycler(sectortype* sector, int lotag, int shade, int shade2, int hitag, int state)
{
if (numcyclers >= MAXCYCLERS)
I_Error("Too many cycling sectors.");
cyclers[numcyclers].sector = sector;
cyclers[numcyclers].lotag = lotag;
cyclers[numcyclers].shade1 = shade;
cyclers[numcyclers].shade2 = shade2;
cyclers[numcyclers].hitag = hitag;
cyclers[numcyclers].state = state;
numcyclers++;
}
//---------------------------------------------------------------------------
//
//

View file

@ -146,24 +146,24 @@ void lava_serialize(FSerializer& arc)
("windertime", windertime);
}
void addtorch(DDukeActor* actor)
void addtorch(sectortype* sect, int shade, int lotag)
{
if (torchcnt >= 64)
I_Error("Too many torch effects");
torchsector[torchcnt] = actor->sector();
torchsectorshade[torchcnt] = actor->sector()->floorshade;
torchtype[torchcnt] = actor->spr.lotag;
torchsector[torchcnt] = sect;
torchsectorshade[torchcnt] = shade;
torchtype[torchcnt] = lotag;
torchcnt++;
}
void addlightning(DDukeActor* actor)
void addlightning(sectortype* sect, int shade)
{
if (lightnincnt >= 64)
I_Error("Too many lightnin effects");
lightninsector[lightnincnt] = actor->sector();
lightninsectorshade[lightnincnt] = actor->sector()->floorshade;
lightninsector[lightnincnt] = sect;
lightninsectorshade[lightnincnt] = shade;
lightnincnt++;
}
@ -526,4 +526,16 @@ void thunder(void)
}
}
int addambient(int hitag, int lotag)
{
if (ambientfx >= 64)
I_Error("Too many ambient effects");
else
{
ambienthitag[ambientfx] = hitag;
ambientlotag[ambientfx] = lotag;
return ambientfx++;
}
}
END_DUKE_NS

View file

@ -123,6 +123,7 @@ void CallOnHurt(DDukeActor* actor, player_struct* hitter);
bool CallOnUse(DDukeActor* actor, player_struct* user);
void CallOnRespawn(DDukeActor* actor, int low);
bool CallAnimate(DDukeActor* actor, tspritetype* hitter);
void CallStaticSetup(DDukeActor* actor);
END_DUKE_NS

View file

@ -17,8 +17,9 @@ BEGIN_DUKE_NS
void lava_cleararrays();
void addjaildoor(int p1, int p2, int iht, int jlt, int p3, sectortype* h);
void addminecart(int p1, int p2, sectortype* i, int iht, int p3, sectortype* childsectnum);
void addtorch(DDukeActor* i);
void addlightning(DDukeActor* i);
void addtorch(sectortype* sect, int shade, int lotag);
void addlightning(sectortype* sect, int shade);
int addambient(int hitag, int lotag);
void movecyclers(void);
void movedummyplayers(void);

View file

@ -479,5 +479,13 @@ bool CallAnimate(DDukeActor* actor, tspritetype* tspr)
return nval;
}
void CallStaticSetup(DDukeActor* actor)
{
IFVIRTUALPTR(actor, DDukeActor, StaticSetup)
{
VMValue val = actor;
VMCall(func, &val, 1, nullptr, 0);
}
}
END_DUKE_NS

View file

@ -4,7 +4,7 @@ x(RPG2SPRITE, 14)
x(DUKETAG, 15)
x(SIGN1, 16)
x(SIGN2, 17)
y(RRTILE18, 18)
y(TORCHCTRL, 18)
y(RRTILE19, 19)
x(ARROW, 20)
x(FIRSTGUNSPRITE, 21)
@ -21,7 +21,7 @@ x(AMMOBOX, 31)
x(GROWSPRITEICON, 32)
x(INVENTORYBOX, 33)
y(RRTILE34, 34)
y(RRTILE35, 35)
y(LIGHTNINGCTRL, 35)
x(DESTRUCTO, 36)
x(FREEZEAMMO, 37)
y(RRJAILDOORSOUND, 38)
@ -50,8 +50,8 @@ y(RRTILE63, 63)
y(RRMINECART, 64)
y(RRMINECARTSOUND, 65)
y(RRMINECARTINNER, 66)
y(RRTILE67, 67)
y(RRTILE68, 68)
y(DUMMYCTRL, 67)
y(SHADEDSECTORCTRL, 68)
x(MIRRORBROKE, 70)
x(SOUNDFX, 71)
x(TECHLIGHT2, 72)

View file

@ -45,29 +45,10 @@ int which_palookup = 9;
void premapcontroller(DDukeActor* ac)
{
switch (ac->spr.picnum)
CallStaticSetup(ac);
if (ac->spr.picnum == SECTOREFFECTOR)
{
case SECTOREFFECTOR:
ac->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN | CSTAT_SPRITE_ALIGNMENT_MASK);
break;
case GPSPEED:
ac->sector()->extra = ac->spr.lotag;
deletesprite(ac);
break;
case CYCLER:
if (numcyclers >= MAXCYCLERS)
I_Error("Too many cycling sectors.");
cyclers[numcyclers].sector = ac->sector();
cyclers[numcyclers].lotag = ac->spr.lotag;
cyclers[numcyclers].shade1 = ac->spr.shade;
cyclers[numcyclers].shade2 = ac->sector()->floorshade;
cyclers[numcyclers].hitag = ac->spr.hitag;
cyclers[numcyclers].state = (ac->spr.angle == DAngle270);
numcyclers++;
deletesprite(ac);
break;
}
}

View file

@ -534,48 +534,9 @@ void prelevel_r(int g, TArray<DDukeActor*>& actors)
{
ps[0].Exit = ac->spr.pos.XY();
}
else switch (ac->spr.picnum)
else
{
default:
premapcontroller(ac);
break;
case NUKEBUTTON:
chickenplant = 1;
break;
case RRTILE18:
addtorch(ac);
deletesprite(ac);
break;
case RRTILE35:
addlightning(ac);
deletesprite(ac);
break;
case RRTILE68:
ac->sector()->shadedsector = 1;
deletesprite(ac);
break;
case RRTILE67:
ac->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
break;
case SOUNDFX:
if (ambientfx >= 64)
I_Error("Too many ambient effects");
else
{
ambienthitag[ambientfx] = ac->spr.hitag;
ambientlotag[ambientfx] = ac->spr.lotag;
ac->spr.detail = ambientfx;
ambientfx++;
ac->spr.lotag = 0;
ac->spr.hitag = 0;
}
break;
}
}

View file

@ -84,18 +84,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Duke, checkcursectnums, duke_checkcursectnums)
ACTION_RETURN_POINTER(duke_checkcursectnums(sect));
}
int duke_floorflags(sectortype* sector)
{
return gs.tileinfo[sector->floorpicnum].flags;
}
DEFINE_ACTION_FUNCTION_NATIVE(_Duke, floorflags, duke_floorflags)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
ACTION_RETURN_INT(duke_floorflags(sect));
}
int duke_global_random()
{
return global_random;
@ -867,7 +855,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, operatemasterswitches, operatemastersw
return 0;
}
DEFINE_ACTION_FUNCTION(_DukeLevel, operateactivators)//, operateactivators)
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, operateactivators, operateactivators)
{
PARAM_PROLOGUE;
PARAM_INT(lotag);
@ -876,6 +864,59 @@ DEFINE_ACTION_FUNCTION(_DukeLevel, operateactivators)//, operateactivators)
return 0;
}
int duke_floorflags(sectortype* sector)
{
return gs.tileinfo[sector->floorpicnum].flags;
}
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, floorflags, duke_floorflags)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
ACTION_RETURN_INT(duke_floorflags(sect));
}
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, addcycler, addcycler)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
PARAM_INT(lotag);
PARAM_INT(shade);
PARAM_INT(shade2);
PARAM_INT(hitag);
PARAM_INT(state);
addcycler(sect, lotag, shade, shade2, hitag, state);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, addtorch, addtorch)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
PARAM_INT(shade);
PARAM_INT(lotag);
addtorch(sect, shade, lotag);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, addlightning, addlightning)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
PARAM_INT(shade);
addlightning(sect, shade);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, addambient, addambient)
{
PARAM_PROLOGUE;
PARAM_INT(hitag);
PARAM_INT(lotag);
ACTION_RETURN_INT(addambient(hitag, lotag));
return 0;
}
DEFINE_FIELD_X(DukeGameInfo, DukeGameInfo, playerfriction);
DEFINE_FIELD_X(DukeGameInfo, DukeGameInfo, gravity);
DEFINE_FIELD_X(DukeGameInfo, DukeGameInfo, respawnactortime);

View file

@ -5,8 +5,10 @@ spawnclasses
4 = DukeActivatorLocked
5 = DukeSoundController
6 = DukeLocator
7 = DukeCycler
8 = DukeMasterSwitch
9 = DukeRespawnController
10 = DukeGPSpeed
1221 = DukeCranePole
1222 = DukeCrane

View file

@ -5,8 +5,16 @@ spawnclasses
4 = DukeActivatorLocked
5 = DukeSoundController
6 = DukeLocator
7 = DukeCycler
8 = DukeMasterSwitch
9 = DukeRespawnController
10 = DukeGPSpeed
18 = DukeTorchCtrl
35 = DukeLightningCtrl
68 = DukeShadeCtrl
67 = DukeDummyCtrl
71 = DukeSoundFX
1298 = DukeCranePole
1299 = DukeCrane

View file

@ -53,7 +53,7 @@ class DukeBolt1 : DukeActor
if (l & 1) self.cstat ^= CSTAT_SPRITE_TRANSLUCENT;
if (self.spritesetindex == 1 && random(0, 7) == 0 && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
if (self.spritesetindex == 1 && random(0, 7) == 0 && (dlevel.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
self.PlayActorSound(DukeSnd.SHORT_CIRCUIT);
if (self.spritesetindex & 1)
@ -132,7 +132,7 @@ class DukeSideBolt1 : DukeBolt1
}
self.SetSpriteSetImage((self.spritesetindex + 1) % self.GetSpriteSetSize());
if (random(0, 1) && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
if (random(0, 1) && (dlevel.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
self.PlayActorSound(DukeSnd.SHORT_CIRCUIT);
}

View file

@ -106,3 +106,74 @@ class DukeActivatorLocked : DukeActor
*/
}
// Note: StaticSetup is run much earlier than Initialize! This is only meant for things that modify global game state.
class DukeCycler : DukeActor
{
override void StaticSetup()
{
dlevel.AddCycler(self.sector, self.lotag, self.shade, self.sector.floorshade, self.hitag, self.intangle == 1536);
self.Destroy();
}
}
class DukeGPSpeed : DukeActor
{
override void StaticSetup()
{
self.sector.extra = self.lotag;
self.Destroy();
}
}
// the following ones are only used in RR.
class TorchCtrl : DukeActor
{
override void StaticSetup()
{
dlevel.addtorch(self.sector, self.sector.floorshade, self.lotag);
self.Destroy();
}
}
class DukeLightningCtrl : DukeActor
{
override void StaticSetup()
{
dlevel.addlightning(self.sector, self.sector.floorshade);
self.Destroy();
}
}
class DukeShadeCtrl : DukeActor
{
override void StaticSetup()
{
self.sector.shadedsector = 1;
self.Destroy();
}
}
class DukeDummyCtrl : DukeActor
{
override void StaticSetup()
{
self.cstat |= CSTAT_SPRITE_INVISIBLE;
}
}
class DukeSoundFX : DukeActor
{
default
{
statnum STAT_ZOMBIEACTOR;
}
override void StaticSetup()
{
self.cstat = CSTAT_SPRITE_INVISIBLE;
self.detail = dlevel.addambient(self.hitag, self.lotag);
self.lotag = self.hitag = 0;
}
}

View file

@ -168,6 +168,7 @@ class DukeActor : CoreActor native
native void operatesectors(sectortype sec);
virtual void BeginPlay() {}
virtual void StaticSetup() {}
virtual void Initialize() {}
virtual void Tick() {}
virtual void onHit(DukeActor hitter) { checkhitdefault(hitter); }
@ -209,6 +210,11 @@ struct DukeLevel
native static int check_activator_motion(int lotag);
native static void operatemasterswitches(int lotag);
native static void operateactivators(int lotag, DukePlayer p);
native static int floorflags(sectortype s);
native static void AddCycler(sectortype sector, int lotag, int shade, int shade2, int hitag, int state);
native static void addtorch(sectortype sector, int shade, int lotag);
native static void addlightning(sectortype sector, int shade);
native static int addambient(int hitag, int lotag);
}
struct DukeStatIterator

View file

@ -97,7 +97,6 @@ struct Duke native
native static DukePlayer GetViewPlayer();
native static int MaxAmmoAmount(int weap);
native static DukePlayer checkcursectnums(sectortype sect);
native static int floorflags(sectortype s);
native static int global_random();
native static int GetSoundFlags(int sound);
native static int badguyID(int id);

View file

@ -145,6 +145,9 @@ struct sectortype native
native uint8 exflags;
// Duke
native uint8 shadedsector;
/*
// Game specific extensions. Only export what's really needed.
union