Skip to content

Commit

Permalink
- made DCoreActor's properties functional.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
coelckers committed Feb 15, 2022
1 parent e3f1893 commit e396798
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 24 deletions.
2 changes: 2 additions & 0 deletions source/core/actorinfo.h
Expand Up @@ -3,6 +3,7 @@
#include <stddef.h>
#include <stdint.h>

#include "maptypes.h"
#include "dobject.h"
#include "m_fixed.h"
#include "m_random.h"
Expand Down Expand Up @@ -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;
Expand Down
14 changes: 14 additions & 0 deletions source/core/actorlist.cpp
Expand Up @@ -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<PClassActor*>(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;
}
65 changes: 43 additions & 22 deletions source/core/thingdef_properties.cpp
Expand Up @@ -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.
**
Expand Down Expand Up @@ -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);
}
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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);
}
}

2 changes: 0 additions & 2 deletions source/core/zcc_compile_raze.cpp
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions wadsrc/static/zscript/coreactor.zs
Expand Up @@ -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.
}

0 comments on commit e396798

Please sign in to comment.