diff --git a/source/core/actorinfo.h b/source/core/actorinfo.h index 5a5cb15a7..491bb2c1d 100644 --- a/source/core/actorinfo.h +++ b/source/core/actorinfo.h @@ -3,6 +3,7 @@ #include #include +#include "maptypes.h" #include "dobject.h" #include "m_fixed.h" #include "m_random.h" @@ -42,6 +43,7 @@ struct FActorInfo int TypeNum = -1; int DefaultFlags = 0; int DefaultCstat = 0; + spritetype defsprite{}; // Due to how the map format works we cannot define defaults for the sprite itself. These must be applied later. FActorInfo() = default; FActorInfo(const FActorInfo & other) = delete; diff --git a/source/core/actorlist.cpp b/source/core/actorlist.cpp index c0b534e86..a7591027d 100644 --- a/source/core/actorlist.cpp +++ b/source/core/actorlist.cpp @@ -581,3 +581,17 @@ DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, addz, coreactor_addz) self->spr.pos.Z = int(z * 256); return 0; } + +void coreactor_setSpritePic(DCoreActor* self, unsigned z) +{ + auto &spriteset = static_cast(self->GetClass())->ActorInfo()->SpriteSet; + if (z < spriteset.Size()) self->spr.picnum = spriteset[z]; +} + +DEFINE_ACTION_FUNCTION_NATIVE(DCoreActor, setSpritePic, coreactor_setSpritePic) +{ + PARAM_SELF_PROLOGUE(DCoreActor); + PARAM_INT(z); + coreactor_setSpritePic(self, z); + return 0; +} diff --git a/source/core/thingdef_properties.cpp b/source/core/thingdef_properties.cpp index 2f5e6fcc6..af903b45e 100644 --- a/source/core/thingdef_properties.cpp +++ b/source/core/thingdef_properties.cpp @@ -4,7 +4,7 @@ ** Actor denitions - properties and flags handling ** **--------------------------------------------------------------------------- -** Copyright 2002-2007 Christoph Oelckers +** Copyright 2002-2022 Christoph Oelckers ** Copyright 2004-2007 Randy Heit ** All rights reserved. ** @@ -309,15 +309,16 @@ static bool PointerCheck(PType *symtype, PType *checktype) //========================================================================== // -// Default spritetype fields need to set an additional flag -// so we need native handlers for them +// Default spritetype fields cannot be set directly +// they need to be combined with the data from the map, so they need to be +// stored outside the actual actor until the spawn code can init it. // //========================================================================== DEFINE_PROPERTY(pic, S, CoreActor) { PROP_STRING_PARM(str, 0); - defaults->spr.picnum = TileFiles.tileForName(str); - if (defaults->spr.picnum == -1) + bag.Info->ActorInfo()->defsprite.picnum = TileFiles.tileForName(str); + if (bag.Info->ActorInfo()->defsprite.picnum == -1) { I_Error("Unknown texture name '%s'", str); } @@ -330,7 +331,7 @@ DEFINE_PROPERTY(pic, S, CoreActor) DEFINE_PROPERTY(statnum, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.statnum = i; + bag.Info->ActorInfo()->defsprite.statnum = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_STATNUM; } @@ -340,7 +341,7 @@ DEFINE_PROPERTY(statnum, I, CoreActor) DEFINE_PROPERTY(angle, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.ang = i; + bag.Info->ActorInfo()->defsprite.ang = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_ANG; } @@ -350,7 +351,7 @@ DEFINE_PROPERTY(angle, I, CoreActor) DEFINE_PROPERTY(xvel, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.xvel = i; + bag.Info->ActorInfo()->defsprite.xvel = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_XVEL; } @@ -360,7 +361,7 @@ DEFINE_PROPERTY(xvel, I, CoreActor) DEFINE_PROPERTY(yvel, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.yvel = i; + bag.Info->ActorInfo()->defsprite.yvel = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_YVEL; } @@ -370,7 +371,7 @@ DEFINE_PROPERTY(yvel, I, CoreActor) DEFINE_PROPERTY(zvel, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.zvel = i; + bag.Info->ActorInfo()->defsprite.zvel = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_ZVEL; } @@ -380,7 +381,7 @@ DEFINE_PROPERTY(zvel, I, CoreActor) DEFINE_PROPERTY(lotag, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.lotag = i; + bag.Info->ActorInfo()->defsprite.lotag = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_LOTAG; } @@ -390,7 +391,7 @@ DEFINE_PROPERTY(lotag, I, CoreActor) DEFINE_PROPERTY(hitag, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.lotag = i; + bag.Info->ActorInfo()->defsprite.lotag = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_HITAG; } @@ -400,7 +401,7 @@ DEFINE_PROPERTY(hitag, I, CoreActor) DEFINE_PROPERTY(extra, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.lotag = i; + bag.Info->ActorInfo()->defsprite.lotag = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_EXTRA; } @@ -410,7 +411,7 @@ DEFINE_PROPERTY(extra, I, CoreActor) DEFINE_PROPERTY(detail, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.detail = i; + bag.Info->ActorInfo()->defsprite.detail = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_DETAIL; } @@ -420,7 +421,7 @@ DEFINE_PROPERTY(detail, I, CoreActor) DEFINE_PROPERTY(shade, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.shade = i; + bag.Info->ActorInfo()->defsprite.shade = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_SHADE; } @@ -430,7 +431,7 @@ DEFINE_PROPERTY(shade, I, CoreActor) DEFINE_PROPERTY(pal, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.pal = i; + bag.Info->ActorInfo()->defsprite.pal = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_PAL; } @@ -440,7 +441,7 @@ DEFINE_PROPERTY(pal, I, CoreActor) DEFINE_PROPERTY(clipdist, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.clipdist = i; + bag.Info->ActorInfo()->defsprite.clipdist = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_CLIPDIST; } @@ -450,7 +451,7 @@ DEFINE_PROPERTY(clipdist, I, CoreActor) DEFINE_PROPERTY(xrepeat, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.xrepeat = i; + bag.Info->ActorInfo()->defsprite.xrepeat = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_XREPEAT; } @@ -460,7 +461,7 @@ DEFINE_PROPERTY(xrepeat, I, CoreActor) DEFINE_PROPERTY(yrepeat, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.yrepeat = i; + bag.Info->ActorInfo()->defsprite.yrepeat = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_YREPEAT; } @@ -470,7 +471,7 @@ DEFINE_PROPERTY(yrepeat, I, CoreActor) DEFINE_PROPERTY(xoffset, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.xoffset = i; + bag.Info->ActorInfo()->defsprite.xoffset = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_XOFFSET; } @@ -480,7 +481,7 @@ DEFINE_PROPERTY(xoffset, I, CoreActor) DEFINE_PROPERTY(yoffset, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.yoffset = i; + bag.Info->ActorInfo()->defsprite.yoffset = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_YOFFSET; } @@ -490,6 +491,26 @@ DEFINE_PROPERTY(yoffset, I, CoreActor) DEFINE_PROPERTY(owner, I, CoreActor) { PROP_INT_PARM(i, 0); - defaults->spr.owner = i; + bag.Info->ActorInfo()->defsprite.owner = i; bag.Info->ActorInfo()->DefaultCstat |= DEFF_OWNER; } + +//========================================================================== +// +//========================================================================== +DEFINE_PROPERTY(spriteset, Ssssssssssssssssssss, CoreActor) +{ + info->ActorInfo()->SpriteSet.Clear(); + for (int i = 0; i < PROP_PARM_COUNT; ++i) + { + PROP_STRING_PARM(n, i); + + int picnum = TileFiles.tileForName(n); + if (picnum == -1) + { + I_Error("Unknown texture name '%s'", n); + } + info->ActorInfo()->SpriteSet.Push(picnum); + } +} + diff --git a/source/core/zcc_compile_raze.cpp b/source/core/zcc_compile_raze.cpp index 65408d6db..f31170d23 100644 --- a/source/core/zcc_compile_raze.cpp +++ b/source/core/zcc_compile_raze.cpp @@ -272,8 +272,6 @@ void ZCCRazeCompiler::DispatchProperty(FPropertyInfo *prop, ZCC_PropertyStmt *pr break; case 'I': - case 'M': // special case for morph styles in DECORATE . This expression-aware parser will not need this. - case 'N': // special case for thing activations in DECORATE. This expression-aware parser will not need this. conv.i = GetIntConst(ex, ctx); break; diff --git a/wadsrc/static/zscript/coreactor.zs b/wadsrc/static/zscript/coreactor.zs index 981b6c7f5..4a80c7a8f 100644 --- a/wadsrc/static/zscript/coreactor.zs +++ b/wadsrc/static/zscript/coreactor.zs @@ -42,5 +42,6 @@ class CoreActor native native void move(Vector3 newpos, bool relink = true); native void setz(double newz); native void addz(double amount); + native void setSpritePic(int index); // index into actor's spriteset. }