- scriptified canwithsomething, the last internal STAT_STANDABLE item.

This commit is contained in:
Christoph Oelckers 2022-11-19 19:01:17 +01:00
parent c6b3cf3e0a
commit 714a2ef70e
15 changed files with 100 additions and 24 deletions

View file

@ -372,6 +372,7 @@ void DCoreActor::initFromSprite(spritetype* mspr)
spr.cstat = (mspr->cstat & ~ESpriteFlags::FromInt(actorinfo->DefaultCstat)) | (spr.cstat & ESpriteFlags::FromInt(actorinfo->DefaultCstat));
spr.pos = mspr->pos;
spr.sectp = mspr->sectp;
spr.clipdist = mspr->clipdist; // this has no associated property because it is needed for initialization of the real clipdist.
// only copy those values which have not been defaulted by the class definition.
#define setter(flag, var) if (!(actorinfo->DefaultFlags & flag)) spr.var = mspr->var;
@ -388,7 +389,6 @@ void DCoreActor::initFromSprite(spritetype* mspr)
setter(DEFF_DETAIL, detail);
setter(DEFF_SHADE, shade);
setter(DEFF_PAL, pal);
setter(DEFF_CLIPDIST, clipdist);
setter(DEFF_BLEND, blend);
setter(DEFF_XREPEAT, scale.X);
setter(DEFF_YREPEAT, scale.Y);
@ -398,7 +398,7 @@ void DCoreActor::initFromSprite(spritetype* mspr)
#undef setter
clipdist = spr.clipdist * 0.25;
if (!(actorinfo->DefaultFlags & DEFF_CLIPDIST)) clipdist = spr.clipdist * 0.25;
if (mspr->statnum != 0 && !(actorinfo->DefaultFlags & DEFF_STATNUM))
ChangeActorStat(this, mspr->statnum);
}

View file

@ -440,10 +440,10 @@ DEFINE_PROPERTY(pal, I, CoreActor)
//==========================================================================
//
//==========================================================================
DEFINE_PROPERTY(clipdist, I, CoreActor)
DEFINE_PROPERTY(clipdist, F, CoreActor)
{
PROP_INT_PARM(i, 0);
defaults->spr.clipdist = i;
PROP_FLOAT_PARM(i, 0);
defaults->clipdist = i;
bag.Info->ActorInfo()->DefaultFlags |= DEFF_CLIPDIST;
}

View file

@ -1925,7 +1925,7 @@ void handle_se00(DDukeActor* actor)
actor->tempval += 4;
if (actor->tempval >= 256)
callsound(actor->sector(), actor, true);
if (actor->spr.clipdist) direction = 1; // notreallyclipdist
if (actor->spr.detail) direction = 1;
else direction = -1;
}
else actor->tempval = 256;
@ -1953,7 +1953,7 @@ void handle_se00(DDukeActor* actor)
actor->tempval -= 4;
if (actor->tempval <= 0)
callsound(actor->sector(), actor, true);
if (actor->spr.clipdist) direction = -1; // notreallyclipdist
if (actor->spr.detail) direction = -1;
else direction = 1;
}
else actor->tempval = 0;

View file

@ -813,11 +813,6 @@ void movestandables_d(void)
continue;
}
else if (isIn(picnum, CANWITHSOMETHING, CANWITHSOMETHING2, CANWITHSOMETHING3, CANWITHSOMETHING4))
{
movecanwithsomething(act);
}
else if (isIn(picnum,
EXPLODINGBARREL,
WOODENHORSE,

View file

@ -732,11 +732,6 @@ void movestandables_r(void)
continue;
}
else if (picnum == CANWITHSOMETHING)
{
movecanwithsomething(act);
}
else if (isIn(picnum,
EXPLODINGBARREL,
WOODENHORSE,

View file

@ -818,8 +818,8 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
{
if (sectp->lotag == 30)
{
if (actor->spr.pal) actor->spr.clipdist = 1; // notreallyclipdist
else actor->spr.clipdist = 0;
if (actor->spr.pal) actor->spr.detail = 1;
else actor->spr.detail = 0;
actor->temp_pos.Z = sectp->floorz;
sectp->hitagactor = actor;
}

View file

@ -999,10 +999,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
act->clipdist = 2;
act->SetOwner(act);
break;
case CANWITHSOMETHING:
case CANWITHSOMETHING2:
case CANWITHSOMETHING3:
case CANWITHSOMETHING4:
case RUBBERCAN:
act->spr.extra = 0;
[[fallthrough]];

View file

@ -1272,7 +1272,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
act->clipdist = 2;
act->SetOwner(act);
break;
case CANWITHSOMETHING:
case RUBBERCAN:
act->spr.extra = 0;
[[fallthrough]];

View file

@ -268,6 +268,22 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, spawn, DukeActor_Spawn)
ACTION_RETURN_POINTER(DukeActor_Spawn(self, type));
}
DDukeActor* DukeActor_Spawnsprite(DDukeActor* origin, int picnum)
{
if (picnum >= 0 && picnum < MAXTILES)
{
return spawn(origin, picnum);
}
return nullptr;
}
DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, spawnsprite, DukeActor_Spawnsprite)
{
PARAM_SELF_PROLOGUE(DDukeActor);
PARAM_INT(type);
ACTION_RETURN_POINTER(DukeActor_Spawnsprite(self, type));
}
DDukeActor* DukeActor_spawnweaponorammo(DDukeActor* origin, unsigned intname)
{
if (intname > 14) return nullptr;

View file

@ -45,4 +45,9 @@ spawnclasses
4528 = DukeSideBolt4
660 = DukeWaterdrip
160 = DukeDoorshock
1232 = DukeCanWithSomething
2807 = DukeCanWithSomething2
2808 = DukeCanWithSomething3
2809 = DukeCanWithSomething4
}

View file

@ -29,5 +29,6 @@ spawnclasses
1130 = DukeBolt4
239 = DukeWaterdrip
120 = DukeDoorshock
1309 = DukeCanWithSomething
}

View file

@ -66,6 +66,7 @@ version "4.10"
#include "zscript/games/duke/actors/waterdrip.zs"
#include "zscript/games/duke/actors/doorshock.zs"
#include "zscript/games/duke/actors/viewscreen.zs"
#include "zscript/games/duke/actors/canwithsomething.zs"
#include "zscript/games/blood/bloodgame.zs"
#include "zscript/games/blood/ui/menu.zs"

View file

@ -66,5 +66,12 @@ class CoreActor native
return CSTAT_SPRITE_XFLIP | CSTAT_SPRITE_YFLIP;
}
int randomXFlip()
{
int r = random(0, 1);
if (r == 0) return 0;
return CSTAT_SPRITE_XFLIP;
}
}

View file

@ -0,0 +1,60 @@
class DukeCanWithSomething : DukeActor
{
Default
{
extra 0;
clipdist 18;
statnum STAT_ZOMBIEACTOR;
pic "CANWITHSOMETHING";
}
override void Initialize()
{
if (self.ownerActor != self)
self.scale = (0.5, 0.5);
self.makeitfall();
self.cstat = CSTAT_SPRITE_BLOCK_ALL | randomXFlip();
}
override void Tick()
{
self.makeitfall();
int j = self.ifhitbyweapon();
if (j >= 0)
{
self.PlayActorSound(DukeSnd.VENT_BUST);
for (j = 0; j < 10; j++)
self.RANDOMSCRAP();
if (self.lotag) self.spawnsprite(self.lotag);
self.Destroy();
}
}
}
class DukeCanWithSomething2 : DukeCanWithSomething
{
Default
{
pic "CANWITHSOMETHING2";
}
}
class DukeCanWithSomething3 : DukeCanWithSomething
{
Default
{
pic "CANWITHSOMETHING3";
}
}
class DukeCanWithSomething4 : DukeCanWithSomething
{
Default
{
pic "CANWITHSOMETHING4";
}
}

View file

@ -128,6 +128,7 @@ class DukeActor : CoreActor native
native int domove(int clipmask);
native void PlayActorSound(int snd);
native DukeActor spawn(Name type);
native DukeActor spawnsprite(int type); // for cases where the map has a picnum stored. Avoid when possible.
native DukeActor spawnweaponorammo(int type);
native void lotsofglass(int count);
native void makeitfall();