- scriptified the bolts.

This commit is contained in:
Christoph Oelckers 2022-11-19 12:54:50 +01:00
parent 676ca73983
commit 11acb92553
17 changed files with 240 additions and 210 deletions

View file

@ -250,7 +250,11 @@ void FActorInfo::ResolveTextures(const char* clsname, DCoreActor* defaults)
SpriteSet[i] = TileFiles.tileForName(SpriteSetNames[i]);
if (SpriteSet[i] == -1) Printf("Unknown texture '%s' in sprite set for class %s\n", SpriteSetNames[i].GetChars(), clsname);
}
if (SpriteSet.Size() > 0) defaults->spr.picnum = SpriteSet[0]; // Unless picnum is specified it will be set to the first image of the sprite set.
if (SpriteSet.Size() > 0)
{
if (defaults->spritesetindex < 0 || defaults->spritesetindex >= (int)SpriteSet.Size()) defaults->spritesetindex = 0;
defaults->spr.picnum = SpriteSet[defaults->spritesetindex]; // Unless picnum is specified it will be set to the given image of the sprite set.
}
if (PicName.IsNotEmpty())
{
defaults->spr.picnum = TileFiles.tileForName(PicName);

View file

@ -350,7 +350,7 @@ DEFINE_PROPERTY(intangle, I, CoreActor)
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(xvel, I, CoreActor)
DEFINE_PROPERTY(xint, I, CoreActor)
{
PROP_INT_PARM(i, 0);
defaults->spr.xint = i;
@ -360,7 +360,7 @@ DEFINE_PROPERTY(xvel, I, CoreActor)
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(yvel, I, CoreActor)
DEFINE_PROPERTY(yint, I, CoreActor)
{
PROP_INT_PARM(i, 0);
defaults->spr.yint = i;
@ -370,7 +370,7 @@ DEFINE_PROPERTY(yvel, I, CoreActor)
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(zvel, I, CoreActor)
DEFINE_PROPERTY(inittype, I, CoreActor)
{
PROP_INT_PARM(i, 0);
defaults->spr.inittype = i;
@ -511,6 +511,15 @@ DEFINE_PROPERTY(spriteset, Sssssssssssssssssssssssssssssss, CoreActor)
}
}
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(spritesetindex, I, CoreActor)
{
PROP_INT_PARM(i, 0);
defaults->spritesetindex = i;
}
//==========================================================================
//
//==========================================================================

View file

@ -819,107 +819,6 @@ static void moveviewscreen(DDukeActor* actor)
}
}
//---------------------------------------------------------------------------
//
// Duke only
//
//---------------------------------------------------------------------------
static void movesidebolt(DDukeActor* actor)
{
double xx;
auto sectp = actor->sector();
findplayer(actor, &xx);
if (xx > 1280) return;
CLEAR_THE_BOLT2:
if (actor->temp_data[2])
{
actor->temp_data[2]--;
return;
}
if ((actor->spr.scale.X == 0 && actor->spr.scale.Y) == 0)
{
actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y);
}
if ((krand() & 8) == 0)
{
actor->temp_pos.X = actor->spr.scale.X;
actor->temp_pos.Y = actor->spr.scale.Y;
actor->temp_data[2] = global_random & 4;
actor->spr.scale = DVector2(0, 0);
goto CLEAR_THE_BOLT2;
}
actor->spr.picnum++;
if ((krand() & 1) && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC))
S_PlayActorSound(SHORT_CIRCUIT, actor);
if (actor->spr.picnum == SIDEBOLT1 + 4) actor->spr.picnum = SIDEBOLT1;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void movebolt(DDukeActor *actor)
{
double xx;
auto sectp = actor->sector();
findplayer(actor, &xx);
if (xx > 1280) return;
if (actor->temp_data[3] == 0)
actor->temp_data[3] = sectp->floorshade;
CLEAR_THE_BOLT:
if (actor->temp_data[2])
{
actor->temp_data[2]--;
sectp->floorshade = 20;
sectp->ceilingshade = 20;
return;
}
if (actor->spr.scale.X == 0 && actor->spr.scale.Y == 0)
{
actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y);
}
else if ((krand() & 8) == 0)
{
actor->temp_pos.X = actor->spr.scale.X;
actor->temp_pos.Y = actor->spr.scale.Y;
actor->temp_data[2] = global_random & 4;
actor->spr.scale = DVector2(0, 0);
goto CLEAR_THE_BOLT;
}
actor->spr.picnum++;
int l = global_random & 7;
actor->spr.scale.X = (0.125 + l * REPEAT_SCALE);
if (l & 1) actor->spr.cstat ^= CSTAT_SPRITE_TRANSLUCENT;
if (actor->spr.picnum == (BOLT1+1) && (krand()&7) == 0 && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC))
S_PlayActorSound(SHORT_CIRCUIT,actor);
if (actor->spr.picnum==BOLT1+4) actor->spr.picnum=BOLT1;
if (actor->spr.picnum & 1)
{
sectp->floorshade = 0;
sectp->ceilingshade = 0;
}
else
{
sectp->floorshade = 20;
sectp->ceilingshade = 20;
}
}
//---------------------------------------------------------------------------
//
// this has been broken up into lots of smaller subfunctions
@ -950,16 +849,6 @@ void movestandables_d(void)
moveviewscreen(act);
}
else if (picnum >= SIDEBOLT1 && picnum <= SIDEBOLT1 + 3)
{
movesidebolt(act);
}
else if (picnum >= BOLT1 && picnum <= BOLT1 + 3)
{
movebolt(act);
}
else if (picnum == WATERDRIP)
{
movewaterdrip(act, WATERDRIP);

View file

@ -707,67 +707,6 @@ void movefallers_r(void)
//
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
static void movebolt(DDukeActor* actor)
{
double xx;
auto sectp = actor->sector();
findplayer(actor, &xx);
if (xx > 1280) return;
if (actor->temp_data[3] == 0)
actor->temp_data[3] = sectp->floorshade;
CLEAR_THE_BOLT:
if (actor->temp_data[2])
{
actor->temp_data[2]--;
sectp->floorshade = 20;
sectp->ceilingshade = 20;
return;
}
if (actor->spr.scale.X == 0 && actor->spr.scale.Y == 0)
{
actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y);
}
else if ((krand() & 8) == 0)
{
actor->temp_pos.X = actor->spr.scale.X;
actor->temp_pos.Y = actor->spr.scale.Y;
actor->temp_data[2] = global_random & 4;
actor->spr.scale = DVector2(0, 0);
goto CLEAR_THE_BOLT;
}
actor->spr.picnum++;
int l = global_random & 7;
actor->spr.scale.X = (0.125 + l * REPEAT_SCALE);
if (l & 1) actor->spr.cstat ^= CSTAT_SPRITE_TRANSLUCENT;
if (actor->spr.picnum == (BOLT1 + 1) && (krand() & 1) && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC))
S_PlayActorSound(SHORT_CIRCUIT, actor);
if (actor->spr.picnum == BOLT1 + 4) actor->spr.picnum = BOLT1;
if (actor->spr.picnum & 1)
{
sectp->floorshade = 0;
sectp->ceilingshade = 0;
}
else
{
sectp->floorshade = 20;
sectp->ceilingshade = 20;
}
}
//---------------------------------------------------------------------------
//
// this has been broken up into lots of smaller subfunctions
@ -793,16 +732,6 @@ void movestandables_r(void)
continue;
}
else if (picnum == TRASH)
{
movetrash(act);
}
else if (picnum >= BOLT1 && picnum <= BOLT1 + 3)
{
movebolt(act);
}
else if (picnum == WATERDRIP)
{
movewaterdrip(act, WATERDRIP);

View file

@ -210,7 +210,7 @@ void initactorflags_d()
setflag(SFLAG_HITRADIUS_FLAG2, { TRIPBOMB, QUEBALL, STRIPEBALL, DUKELYINGDEAD });
setflag(SFLAG_CHECKSLEEP, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, HORSEONSIDE, CANWITHSOMETHING, FIREBARREL, NUKEBARREL, NUKEBARRELDENTED, NUKEBARRELLEAKED, TRIPBOMB });
setflag(SFLAG_NOTELEPORT, { TRANSPORTERSTAR, TRANSPORTERBEAM, TRIPBOMB, BULLETHOLE, WATERSPLASH2, BURNING, BURNING2, FIRE, FIRE2, TOILETWATER, LASERLINE });
setflag(SFLAG_SE24_NOCARRY, { TRIPBOMB, LASERLINE, BOLT1, BOLT1 + 1,BOLT1 + 2, BOLT1 + 3, SIDEBOLT1, SIDEBOLT1 + 1, SIDEBOLT1 + 2, SIDEBOLT1 + 3, CRANE, CRANE1, CRANE2, BARBROKE });
setflag(SFLAG_SE24_NOCARRY, { TRIPBOMB, LASERLINE, BOLT1, BOLT2, BOLT3, BOLT4, SIDEBOLT1, SIDEBOLT2, SIDEBOLT3, SIDEBOLT4, CRANE, CRANE1, CRANE2, BARBROKE });
setflag(SFLAG_SE24_REMOVE, { BLOODPOOL, PUKE, FOOTPRINTS, FOOTPRINTS2, FOOTPRINTS3, FOOTPRINTS4, BULLETHOLE, BLOODSPLAT1, BLOODSPLAT2, BLOODSPLAT3, BLOODSPLAT4 });
setflag(SFLAG_BLOCK_TRIPBOMB, { TRIPBOMB }); // making this a flag adds the option to let other things block placing trip bombs as well.
setflag(SFLAG_NOFALLER, { CRACK1, CRACK2, CRACK3, CRACK4, SPEAKER, LETTER, DUCK, TARGET, TRIPBOMB, VIEWSCREEN, VIEWSCREEN2 });

View file

@ -240,7 +240,7 @@ void initactorflags_r()
setflag(SFLAG_HITRADIUS_FLAG2, { QUEBALL, STRIPEBALL, BOWLINGPIN, DUKELYINGDEAD });
setflag(SFLAG_CHECKSLEEP, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, HORSEONSIDE, CANWITHSOMETHING, FIREBARREL, NUKEBARREL, NUKEBARRELDENTED, NUKEBARRELLEAKED, EGG });
setflag(SFLAG_NOTELEPORT, { TRANSPORTERSTAR, TRANSPORTERBEAM, BULLETHOLE, WATERSPLASH2, BURNING, FIRE, MUD });
setflag(SFLAG_SE24_NOCARRY, { BULLETHOLE, BOLT1, BOLT1 + 1,BOLT1 + 2, BOLT1 + 3, CRANE, CRANE1, CRANE2, BARBROKE });
setflag(SFLAG_SE24_NOCARRY, { BULLETHOLE, BOLT1, BOLT2, BOLT3, BOLT4, CRANE, CRANE1, CRANE2, BARBROKE });
setflag(SFLAG_SE24_REMOVE, { BLOODPOOL, PUKE, FOOTPRINTS, FOOTPRINTS2, FOOTPRINTS3 });
setflag(SFLAG_NOFALLER, { CRACK1, CRACK2, CRACK3, CRACK4 });
setflag(SFLAG2_EXPLOSIVE, {RPG, RADIUSEXPLOSION, SEENINE, OOZFILTER });

View file

@ -32,7 +32,6 @@ void movefta();
void clearcameras(int i, player_struct* p);
void RANDOMSCRAP(DDukeActor* i);
void detonate(DDukeActor* i, int explosion);
void movetrash(DDukeActor* i);
void movewaterdrip(DDukeActor* i, int drip);
void movedoorshock(DDukeActor* i);
void movetouchplate(DDukeActor* i, int plate);

View file

@ -180,6 +180,9 @@ x(BRICK, 626)
x(SPLINTERWOOD, 630)
x(PIPE2B, 633)
x(BOLT1, 634)
x(BOLT2, 635)
x(BOLT3, 636)
x(BOLT4, 637)
x(W_NUMBERS, 640)
x(WATERDRIP, 660)
x(WATERBUBBLE, 661)
@ -753,6 +756,9 @@ x(PIRATE6A, 4515)
x(PIRATEHALF, 4516)
x(CHESTOFGOLD, 4520)
x(SIDEBOLT1, 4525)
x(SIDEBOLT2, 4526)
x(SIDEBOLT3, 4527)
x(SIDEBOLT4, 4528)
x(FOODOBJECT1, 4530)
x(FOODOBJECT2, 4531)
x(FOODOBJECT3, 4532)

View file

@ -298,6 +298,9 @@ x(PIPE3, 1123)
x(PIPE1, 1124)
x(PIPE2B, 1126)
x(BOLT1, 1127)
x(BOLT2, 1128)
x(BOLT3, 1129)
x(BOLT4, 1130)
x(PIPE3B, 1132)
x(CAMERA1, 1134)
x(BRICK, 1139)

View file

@ -684,18 +684,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
ChangeActorStat(act, STAT_STANDABLE);
break;
case BOLT1:
case BOLT1 + 1:
case BOLT1 + 2:
case BOLT1 + 3:
case SIDEBOLT1:
case SIDEBOLT1 + 1:
case SIDEBOLT1 + 2:
case SIDEBOLT1 + 3:
act->temp_pos.XY() = act->spr.scale;
act->spr.yint = 0;
ChangeActorStat(act, STAT_STANDABLE);
break;
case TARGET:
case DUCK:
case LETTER:

View file

@ -691,14 +691,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
ChangeActorStat(act, STAT_STANDABLE);
break;
case BOLT1:
case BOLT1 + 1:
case BOLT1 + 2:
case BOLT1 + 3:
act->temp_pos.XY() = act->spr.scale;
act->spr.yint = 0;
ChangeActorStat(act, STAT_STANDABLE);
break;
// this is not really nice...
case BIKERB:

View file

@ -84,6 +84,29 @@ 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;
}
DEFINE_ACTION_FUNCTION_NATIVE(_Duke, global_random, duke_global_random)
{
PARAM_PROLOGUE;
ACTION_RETURN_INT(global_random);
}
DEFINE_GLOBAL_UNSIZED(dlevel)
//---------------------------------------------------------------------------

View file

@ -26,5 +26,12 @@ spawnclasses
1079 = DukeOozFilter
1247 = DukeSeenine
1272 = DukeTrash
634 = DukeBolt1
635 = DukeBolt2
636 = DukeBolt3
637 = DukeBolt4
4525 = DukeSideBolt1
4526 = DukeSideBolt2
4527 = DukeSideBolt3
4528 = DukeSideBolt4
}

View file

@ -22,5 +22,9 @@ spawnclasses
1273 = DukeOozFilter
1324 = DukeSeenine
1346 = DukeTrash
1127 = DukeBolt1
1128 = DukeBolt2
1129 = DukeBolt3
1130 = DukeBolt4
}

View file

@ -61,6 +61,7 @@ version "4.10"
#include "zscript/games/duke/actors/fireext.zs"
#include "zscript/games/duke/actors/oozfilter.zs"
#include "zscript/games/duke/actors/trash.zs"
#include "zscript/games/duke/actors/bolt.zs"
#include "zscript/games/blood/bloodgame.zs"
#include "zscript/games/blood/ui/menu.zs"

View file

@ -0,0 +1,164 @@
class DukeBolt1 : DukeActor
{
default
{
yint 0;
statnum STAT_STANDABLE;
SpriteSet "BOLT1", "BOLT2", "BOLT3", "BOLT4";
spritesetindex 0;
}
override void Initialize()
{
self.temp_pos.XY = self.scale;
}
override void Tick()
{
DukePlayer p;
double xx;
let sectp = self.sector;
[p, xx] = self.findplayer();
if (xx > 1280) return;
if (self.temp_data[3] == 0)
self.temp_data[3] = sectp.floorshade;
while (true)
{
if (self.temp_data[2])
{
self.temp_data[2]--;
sectp.floorshade = 20;
sectp.ceilingshade = 20;
return;
}
if (self.scale == (0, 0))
{
self.scale = self.temp_pos.XY;
}
else if ((random() & 8) == 0)
{
self.temp_pos.XY = self.scale;
self.temp_data[2] = Duke.global_random() & 4;
self.scale = (0, 0);
continue;
}
break;
}
self.SetSpritesetImage((self.spritesetindex + 1) % self.GetSpriteSetSize());
int l = Duke.global_random() & 7;
self.scale.X = (0.125 + l * REPEAT_SCALE);
if (l & 1) self.cstat ^= CSTAT_SPRITE_TRANSLUCENT;
if (self.spritesetindex == 1 && random(0, 7) == 0 && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
self.PlayActorSound(DukeSnd.SHORT_CIRCUIT);
if (self.spritesetindex & 1)
{
sectp.floorshade = 0;
sectp.ceilingshade = 0;
}
else
{
sectp.floorshade = 20;
sectp.ceilingshade = 20;
}
}
}
class DukeBolt2 : DukeBolt1
{
default
{
spritesetindex 1;
}
}
class DukeBolt3 : DukeBolt1
{
default
{
spritesetindex 2;
}
}
class DukeBolt4 : DukeBolt1
{
default
{
spritesetindex 3;
}
}
class DukeSideBolt1 : DukeBolt1
{
default
{
SpriteSet "SIDEBOLT1", "SIDEBOLT2", "SIDEBOLT3", "SIDEBOLT4";
}
override void Tick()
{
DukePlayer p;
double xx;
let sectp = self.sector;
[p, xx] = self.findplayer();
if (xx > 1280) return;
while (true)
{
if (self.temp_data[2])
{
self.temp_data[2]--;
return;
}
if (self.scale == (0, 0))
{
self.scale = self.temp_pos.XY;
}
if ((random() & 8) == 0)
{
self.temp_pos.XY = self.scale;
self.temp_data[2] = Duke.global_random() & 4;
self.scale = (0, 0);
continue;
}
break;
}
self.SetSpriteSetImage((self.spritesetindex + 1) % self.GetSpriteSetSize());
if (random(0, 1) && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC))
self.PlayActorSound(DukeSnd.SHORT_CIRCUIT);
}
}
class DukeSideBolt2 : DukeSideBolt1
{
default
{
spritesetindex 1;
}
}
class DukeSideBolt3 : DukeSideBolt1
{
default
{
spritesetindex 2;
}
}
class DukeSideBolt4 : DukeSideBolt1
{
default
{
spritesetindex 3;
}
}

View file

@ -68,6 +68,16 @@ struct Duke native
CLIPMASK1 = (256 << 16) + 64
}
enum ETextureFlags
{
TFLAG_WALLSWITCH = 1,
TFLAG_ADULT = 2,
TFLAG_ELECTRIC = 4,
TFLAG_CLEARINVENTORY = 8, // really dumb Duke stuff...
TFLAG_SLIME = 16,
};
native static void PlaySpecialMusic(int which);
native static int PlaySound(int num, int channel = CHAN_AUTO, int flags = 0, float vol =0.8f);
native static void StopSound(int num);
@ -75,6 +85,8 @@ 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();
static void PlayBonusMusic()
{