From e396798198718adfb4871a44cbe2cb3d235877c5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 13 Feb 2022 10:44:39 +0100 Subject: [PATCH] - made DCoreActor's properties functional. They cannot be parsed directly into the actor's sprite because that gets used in ways that require a different setup. This alsp adds a property parser and a setter function for the SpriteSet array. The idea here is to write code that does not need to use actual tile indices so it can later be refactored to real textures. --- source/core/actorinfo.h | 2 + source/core/actorlist.cpp | 14 +++++++ source/core/thingdef_properties.cpp | 65 +++++++++++++++++++---------- source/core/zcc_compile_raze.cpp | 2 - wadsrc/static/zscript/coreactor.zs | 1 + 5 files changed, 60 insertions(+), 24 deletions(-) diff --git a/source/core/actorinfo.h b/source/core/actorinfo.h index 5a5cb15a7e7..491bb2c1d71 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 c0b534e8662..a7591027dce 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 2f5e6fcc657..af903b45eed 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 65408d6dbc4..f31170d23f6 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 981b6c7f59a..4a80c7a8fcb 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. }