Skip to content

Commit

Permalink
- added script exports for Duke's main structures.
Browse files Browse the repository at this point in the history
  • Loading branch information
coelckers committed Feb 20, 2022
1 parent df7e6df commit 7897945
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 11 deletions.
5 changes: 5 additions & 0 deletions source/games/duke/src/duke3d.h
Expand Up @@ -118,5 +118,10 @@ struct Dispatcher

extern Dispatcher fi;

void CallInitialize(DDukeActor* actor);
void CallTick(DDukeActor* actor);
void CallAction(DDukeActor* actor);


END_DUKE_NS

27 changes: 27 additions & 0 deletions source/games/duke/src/game.cpp
Expand Up @@ -400,4 +400,31 @@ void GameInterface::app_init()
}


void CallInitialize(DDukeActor* actor)
{
IFVIRTUALPTR(actor, DDukeActor, initialize)
{
VMValue val = actor;
VMCall(func, &val, 1, nullptr, 0);
}
}

void CallTick(DDukeActor* actor)
{
IFVIRTUALPTR(actor, DDukeActor, Tick)
{
VMValue val = actor;
VMCall(func, &val, 1, nullptr, 0);
}
}

void CallAction(DDukeActor* actor)
{
IFVIRTUALPTR(actor, DDukeActor, RunState)
{
VMValue val = actor;
VMCall(func, &val, 1, nullptr, 0);
}
}

END_DUKE_NS
11 changes: 10 additions & 1 deletion source/games/duke/src/types.h
Expand Up @@ -120,6 +120,16 @@ class DDukeActor : public DCoreActor

void Serialize(FSerializer& arc) override;

void ChangeType(PClass* newtype)
{
if (newtype->IsDescendantOf(RUNTIME_CLASS(DDukeActor)) && newtype->Size == RUNTIME_CLASS(DDukeActor)->Size && GetClass()->Size == RUNTIME_CLASS(DDukeActor)->Size)
{
// It sucks having to do this but the game heavily depends on being able to swap out the class type and often uses this to manage actor state.
// We'll allow this only for classes that do not add their own data, though.
SetClass(newtype);
}
}

};

// subclassed to add a game specific actor() method
Expand Down Expand Up @@ -335,7 +345,6 @@ struct player_struct
{
return cursector != nullptr;
}

};

struct Cycler
Expand Down
109 changes: 109 additions & 0 deletions source/games/duke/src/vmexports.cpp
Expand Up @@ -69,6 +69,20 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Duke, CheckSoundPlaying, S_CheckSoundPlaying)
ACTION_RETURN_INT(S_CheckSoundPlaying(snd));
}

player_struct* duke_checkcursectnums(sectortype* sector)
{
if (!sector) return nullptr;
int pp = checkcursectnums(sector);
return pp ? &ps[pp] : nullptr;
}

DEFINE_ACTION_FUNCTION_NATIVE(_Duke, checkcursectnums, duke_checkcursectnums)
{
PARAM_PROLOGUE;
PARAM_POINTER(sect, sectortype);
ACTION_RETURN_POINTER(duke_checkcursectnums(sect));
}

DEFINE_GLOBAL_UNSIZED(dlevel)

//---------------------------------------------------------------------------
Expand Down Expand Up @@ -96,6 +110,9 @@ DEFINE_FIELD(DDukeActor, seek_actor)
DEFINE_FIELD(DDukeActor, flags1)
DEFINE_FIELD(DDukeActor, flags2)
DEFINE_FIELD(DDukeActor, spritesetindex)
DEFINE_FIELD(DDukeActor, temp_walls)
DEFINE_FIELD(DDukeActor, temp_sect)
DEFINE_FIELD(DDukeActor, actorstayput)

static void setSpritesetImage(DDukeActor* self, unsigned int index)
{
Expand All @@ -117,6 +134,56 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, SetSpritesetImage, setSpritesetImage)
return 0;
}

DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, getglobalz, getglobalz)
{
PARAM_SELF_PROLOGUE(DDukeActor);
getglobalz(self);
return 0;
}

player_struct* DukeActor_findplayer(DDukeActor* self)
{
int a;
return &ps[findplayer(self, &a)];
}

DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, findplayer, DukeActor_findplayer)
{
PARAM_SELF_PROLOGUE(DDukeActor);
ACTION_RETURN_POINTER(DukeActor_findplayer(self));
}

int DukeActor_ifhitbyweapon(DDukeActor* self)
{
return fi.ifhitbyweapon(self);
}

DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, ifhitbyweapon, DukeActor_ifhitbyweapon)
{
PARAM_SELF_PROLOGUE(DDukeActor);
ACTION_RETURN_INT(DukeActor_ifhitbyweapon(self));
}

DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, domove, ssp)
{
PARAM_SELF_PROLOGUE(DDukeActor);
PARAM_INT(clipmask);
ACTION_RETURN_INT(ssp(self, clipmask));
}

int DukeActor_PlayActorSound(DDukeActor* self, int snd)
{
return S_PlayActorSound(snd, self);
}

DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, PlayActorSound, DukeActor_PlayActorSound)
{
PARAM_SELF_PROLOGUE(DDukeActor);
PARAM_INT(snd);
ACTION_RETURN_INT(DukeActor_PlayActorSound(self, snd));
}


//---------------------------------------------------------------------------
//
// DukePlayer
Expand Down Expand Up @@ -288,6 +355,13 @@ DEFINE_FIELD_X(DukePlayer, player_struct, vehTurnLeft)
DEFINE_FIELD_X(DukePlayer, player_struct, vehTurnRight)
DEFINE_FIELD_X(DukePlayer, player_struct, vehBraking)
DEFINE_FIELD_X(DukePlayer, player_struct, holoduke_on)
DEFINE_FIELD_X(DukePlayer, player_struct, actorsqu)
DEFINE_FIELD_X(DukePlayer, player_struct, wackedbyactor)
DEFINE_FIELD_X(DukePlayer, player_struct, on_crane)
DEFINE_FIELD_X(DukePlayer, player_struct, somethingonplayer)
DEFINE_FIELD_X(DukePlayer, player_struct, access_spritenum)
DEFINE_FIELD_X(DukePlayer, player_struct, dummyplayersprite)
DEFINE_FIELD_X(DukePlayer, player_struct, newOwner)

DEFINE_ACTION_FUNCTION(_DukePlayer, IsFrozen)
{
Expand All @@ -303,6 +377,41 @@ DEFINE_ACTION_FUNCTION(_DukePlayer, GetGameVar)
ACTION_RETURN_INT(GetGameVar(name, def, self->GetActor(), self->GetPlayerNum()).safeValue());
}

DEFINE_ACTION_FUNCTION(_DukePlayer, angleAsBuild)
{
PARAM_SELF_STRUCT_PROLOGUE(player_struct);
ACTION_RETURN_INT(self->angle.ang.asbuild());
}

void dukeplayer_backuppos(player_struct* self)
{
self->backuppos();
}

DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, backuppos, dukeplayer_backuppos)
{
PARAM_SELF_STRUCT_PROLOGUE(player_struct);
dukeplayer_backuppos(self);
return 0;
}

void dukeplayer_setpos(player_struct* self, double x, double y, double z)
{
self->pos.X = int(x * worldtoint);
self->pos.Y = int(y * worldtoint);
self->pos.Z = int(z * zworldtoint);
}

DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, setpos, dukeplayer_setpos)
{
PARAM_SELF_STRUCT_PROLOGUE(player_struct);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(z);
dukeplayer_setpos(self, x, y, z);
return 0;
}


//---------------------------------------------------------------------------
//
Expand Down
6 changes: 3 additions & 3 deletions source/games/duke/src/vmiterators.cpp
Expand Up @@ -98,23 +98,23 @@ class DDukeSectIterator : public DObject

DukeSectIterator it;

DDukeSectIterator(int Sectnum)
DDukeSectIterator(sectortype* Sectnum)
: it(Sectnum)
{
}
};

IMPLEMENT_CLASS(DDukeSectIterator, true, false);

static DDukeSectIterator *CreateSectIterator(int Sectnum)
static DDukeSectIterator *CreateSectIterator(sectortype* Sectnum)
{
return Create<DDukeSectIterator>(Sectnum);
}

DEFINE_ACTION_FUNCTION_NATIVE(_DukeLevel, CreateSectorIterator, CreateSectIterator)
{
PARAM_PROLOGUE;
PARAM_INT(Sectnum);
PARAM_POINTER(Sectnum, sectortype);
ACTION_RETURN_OBJECT(CreateSectIterator(Sectnum));
}

Expand Down
16 changes: 11 additions & 5 deletions wadsrc/static/zscript/games/duke/dukeactor.zs
Expand Up @@ -37,8 +37,8 @@ class DukeActor : CoreActor native
native int temp_data[6];
native private int flags1, flags2;
native readonly int16 spritesetindex;
//walltype* temp_walls[2]; // SE20 + SE128
//sectortype* temp_sect, *actorstayput;
native walltype temp_walls[2];
native sectortype temp_sect, actorstayput;

native DukeActor temp_actor, seek_actor;

Expand All @@ -65,10 +65,16 @@ class DukeActor : CoreActor native
flagdef SE24_NoFloorCheck: flags1, 19;
flagdef NoInterpolate: flags1, 20;

native void getglobalz();
native DukePlayer findplayer();
native int ifhitbyweapon();
native int domove(int clipmask);
native void PlayActorSound(int snd);

virtual void BeginPlay() {}
virtual bool Tick() { return false; }

virtual void Initialize() {}
virtual void Tick() {}
virtual void RunState() {} // this is the CON function.
}

extend struct _
Expand All @@ -81,7 +87,7 @@ extend struct _
struct DukeLevel
{
native static DukeStatIterator CreateStatIterator(int stat);
native static DukeSectIterator CreateSectorIterator(int sect);
native static DukeSectIterator CreateSectorIterator(sectortype sect);
native static DukeSpriteIterator CreateSpriteIterator();
}

Expand Down
14 changes: 12 additions & 2 deletions wadsrc/static/zscript/games/duke/dukegame.zs
Expand Up @@ -61,6 +61,12 @@ struct Duke native
ICON_BOOTS,
ICON_MAX
};

enum EClipMask
{
CLIPMASK0 = (1 << 16) + 1,
CLIPMASK1 = (256 << 16) + 64
}

native static void PlaySpecialMusic(int which);
native static int PlaySound(int num, int channel = CHAN_AUTO, int flags = 0, float vol =0.8f);
Expand All @@ -69,6 +75,7 @@ struct Duke native
native static DukePlayer GetViewPlayer();
native static int MaxPlayerHealth();
native static int MaxAmmoAmount(int weap);
native static DukePlayer checkcursectnums(sectortype sect);

static void PlayBonusMusic()
{
Expand Down Expand Up @@ -174,8 +181,8 @@ struct DukePlayer
native int16 cheat_phase;
native int16 extra_extra8, quick_kick, last_quick_kick;
native int16 heat_amount, timebeforeexit, customexitsound;
//DDukeActor* actor, actorsqu, *wackedbyactor, *on_crane, *holoduke_on, *somethingonplayer, *access_spritenum, *dummyplayersprite, *newOwner; // later
native voidptr holoduke_on; // cannot do it as a proper actor pointer yet - but the status bar needs it.
native DukeActor actor, actorsqu, wackedbyactor, on_crane, somethingonplayer, access_spritenum, dummyplayersprite, newOwner, holoduke_on;
native sectortype cursector;

native int16 weaprecs[256], weapreccnt;
native uint interface_toggle_flag;
Expand Down Expand Up @@ -260,6 +267,9 @@ struct DukePlayer

native bool IsFrozen();
native int GetGameVar(String varname, int defval);
native int angleAsBuild();
native void backuppos();
native void setpos(Vector3 pos);


}
Expand Down

0 comments on commit 7897945

Please sign in to comment.