- added proper definitions for all exported native fields.

- synthesize native fields for all declared flags, not just for AActor.
This commit is contained in:
Christoph Oelckers 2016-11-22 23:42:32 +01:00
parent e1c4e4939a
commit 099b9970ef
23 changed files with 452 additions and 246 deletions

View file

@ -565,7 +565,6 @@ class DDropItem : public DObject
{ {
DECLARE_CLASS(DDropItem, DObject) DECLARE_CLASS(DDropItem, DObject)
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
HAS_FIELDS
public: public:
DDropItem *Next; DDropItem *Next;
FName Name; FName Name;
@ -579,7 +578,6 @@ const double MinVel = EQUAL_EPSILON;
class AActor : public DThinker class AActor : public DThinker
{ {
DECLARE_CLASS_WITH_META (AActor, DThinker, PClassActor) DECLARE_CLASS_WITH_META (AActor, DThinker, PClassActor)
HAS_FIELDS
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
public: public:
AActor () throw(); AActor () throw();

View file

@ -100,7 +100,6 @@ FString GetPrintableDisplayName(PClassPlayerPawn *cls);
class APlayerPawn : public AActor class APlayerPawn : public AActor
{ {
DECLARE_CLASS_WITH_META(APlayerPawn, AActor, PClassPlayerPawn) DECLARE_CLASS_WITH_META(APlayerPawn, AActor, PClassPlayerPawn)
HAS_FIELDS
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
public: public:

View file

@ -64,12 +64,15 @@ ClassReg DObject::RegistrationInfo =
&DVMObject<DObject>::RegistrationInfo, // VMExport &DVMObject<DObject>::RegistrationInfo, // VMExport
nullptr, // Pointers nullptr, // Pointers
&DObject::InPlaceConstructor, // ConstructNative &DObject::InPlaceConstructor, // ConstructNative
&DObject::InitNativeFields, // InitNatives nullptr,
sizeof(DObject), // SizeOf sizeof(DObject), // SizeOf
CLASSREG_PClass, // MetaClassNum CLASSREG_PClass, // MetaClassNum
}; };
_DECLARE_TI(DObject) _DECLARE_TI(DObject)
// This bit is needed in the playsim - but give it a less crappy name.
DEFINE_FIELD_BIT(DObject,ObjectFlags, bDestroyed, OF_EuthanizeMe)
//========================================================================== //==========================================================================
// //
// //
@ -347,18 +350,6 @@ DObject::~DObject ()
// //
//========================================================================== //==========================================================================
void DObject::InitNativeFields()
{
auto meta = RUNTIME_CLASS(DObject);
meta->AddNativeField("bDestroyed", TypeSInt32, myoffsetof(DObject, ObjectFlags), VARF_ReadOnly, OF_EuthanizeMe);
}
//==========================================================================
//
//
//
//==========================================================================
void DObject::Destroy () void DObject::Destroy ()
{ {
ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe; ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe;

View file

@ -150,9 +150,6 @@ protected: \
#define HAS_OBJECT_POINTERS \ #define HAS_OBJECT_POINTERS \
static const size_t PointerOffsets[]; static const size_t PointerOffsets[];
#define HAS_FIELDS \
static void InitNativeFields();
#if defined(_MSC_VER) #if defined(_MSC_VER)
# pragma section(".creg$u",read) # pragma section(".creg$u",read)
# define _DECLARE_TI(cls) __declspec(allocate(".creg$u")) ClassReg * const cls::RegistrationInfoPtr = &cls::RegistrationInfo; # define _DECLARE_TI(cls) __declspec(allocate(".creg$u")) ClassReg * const cls::RegistrationInfoPtr = &cls::RegistrationInfo;
@ -187,7 +184,7 @@ protected: \
// Possible arguments for the IMPLEMENT_CLASS macro // Possible arguments for the IMPLEMENT_CLASS macro
#define _X_POINTERS_true(cls) cls::PointerOffsets #define _X_POINTERS_true(cls) cls::PointerOffsets
#define _X_POINTERS_false(cls) nullptr #define _X_POINTERS_false(cls) nullptr
#define _X_FIELDS_true(cls) cls::InitNativeFields #define _X_FIELDS_true(cls) nullptr
#define _X_FIELDS_false(cls) nullptr #define _X_FIELDS_false(cls) nullptr
#define _X_CONSTRUCTOR_true(cls) #define _X_CONSTRUCTOR_true(cls)
#define _X_CONSTRUCTOR_false(cls) void cls::InPlaceConstructor(void *mem) { new((EInPlace *)mem) cls; } #define _X_CONSTRUCTOR_false(cls) void cls::InPlaceConstructor(void *mem) { new((EInPlace *)mem) cls; }
@ -445,7 +442,6 @@ public:
virtual PClass *StaticType() const { return RegistrationInfo.MyClass; } virtual PClass *StaticType() const { return RegistrationInfo.MyClass; }
static ClassReg RegistrationInfo, * const RegistrationInfoPtr; static ClassReg RegistrationInfo, * const RegistrationInfoPtr;
static void InPlaceConstructor (void *mem); static void InPlaceConstructor (void *mem);
static void InitNativeFields();
typedef PClass MetaClass; typedef PClass MetaClass;
private: private:
typedef DObject ThisClass; typedef DObject ThisClass;

View file

@ -2515,7 +2515,7 @@ PField::PField(FName name, PType *type, DWORD flags, size_t offset, int bitvalue
else else
{ {
// Just abort. Bit fields should only be defined internally. // Just abort. Bit fields should only be defined internally.
I_FatalError("Trying to create an invalid bit field element: %s", name.GetChars()); I_Error("Trying to create an invalid bit field element: %s", name.GetChars());
} }
} }
else BitValue = -1; else BitValue = -1;

View file

@ -281,16 +281,17 @@ bool ABasicArmorPickup::Use (bool pickup)
//=========================================================================== //===========================================================================
// //
// ABasicArmorBonus :: InitNativeFields // ABasicArmorBonus
// //
//=========================================================================== //===========================================================================
void ABasicArmorBonus::InitNativeFields() DEFINE_FIELD(ABasicArmorBonus, SavePercent)
{ DEFINE_FIELD(ABasicArmorBonus, MaxSaveAmount)
auto meta = RUNTIME_CLASS(ABasicArmorBonus); DEFINE_FIELD(ABasicArmorBonus, MaxAbsorb)
meta->AddNativeField("SaveAmount", TypeSInt32, myoffsetof(ABasicArmorBonus, SaveAmount)); DEFINE_FIELD(ABasicArmorBonus, MaxFullAbsorb)
meta->AddNativeField("MaxSaveAmount", TypeSInt32, myoffsetof(ABasicArmorBonus, MaxSaveAmount)); DEFINE_FIELD(ABasicArmorBonus, SaveAmount)
} DEFINE_FIELD(ABasicArmorBonus, BonusCount)
DEFINE_FIELD(ABasicArmorBonus, BonusMax)
//=========================================================================== //===========================================================================
// //

View file

@ -289,7 +289,6 @@ public:
class AWeapon : public AStateProvider class AWeapon : public AStateProvider
{ {
DECLARE_CLASS_WITH_META(AWeapon, AStateProvider, PClassWeapon) DECLARE_CLASS_WITH_META(AWeapon, AStateProvider, PClassWeapon)
HAS_FIELDS
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
public: public:
DWORD WeaponFlags; DWORD WeaponFlags;
@ -500,7 +499,6 @@ public:
class ABasicArmorBonus : public AArmor class ABasicArmorBonus : public AArmor
{ {
DECLARE_CLASS (ABasicArmorBonus, AArmor) DECLARE_CLASS (ABasicArmorBonus, AArmor)
HAS_FIELDS
public: public:
virtual void Serialize(FSerializer &arc); virtual void Serialize(FSerializer &arc);

View file

@ -31,25 +31,45 @@ IMPLEMENT_POINTERS_START(AWeapon)
IMPLEMENT_POINTER(SisterWeapon) IMPLEMENT_POINTER(SisterWeapon)
IMPLEMENT_POINTERS_END IMPLEMENT_POINTERS_END
void AWeapon::InitNativeFields() DEFINE_FIELD(AWeapon, WeaponFlags)
{ DEFINE_FIELD(AWeapon, AmmoType1)
auto meta = RUNTIME_CLASS(AWeapon); DEFINE_FIELD(AWeapon, AmmoType2)
DEFINE_FIELD(AWeapon, AmmoGive1)
DEFINE_FIELD(AWeapon, AmmoGive2)
DEFINE_FIELD(AWeapon, MinAmmo1)
DEFINE_FIELD(AWeapon, MinAmmo2)
DEFINE_FIELD(AWeapon, AmmoUse1)
DEFINE_FIELD(AWeapon, AmmoUse2)
DEFINE_FIELD(AWeapon, Kickback)
DEFINE_FIELD(AWeapon, YAdjust)
DEFINE_FIELD(AWeapon, UpSound)
DEFINE_FIELD(AWeapon, ReadySound)
DEFINE_FIELD(AWeapon, SisterWeaponType)
DEFINE_FIELD(AWeapon, ProjectileType)
DEFINE_FIELD(AWeapon, AltProjectileType)
DEFINE_FIELD(AWeapon, SelectionOrder)
DEFINE_FIELD(AWeapon, MinSelAmmo1)
DEFINE_FIELD(AWeapon, MinSelAmmo2)
DEFINE_FIELD(AWeapon, MoveCombatDist)
DEFINE_FIELD(AWeapon, ReloadCounter)
DEFINE_FIELD(AWeapon, BobStyle)
DEFINE_FIELD(AWeapon, BobSpeed)
DEFINE_FIELD(AWeapon, BobRangeX)
DEFINE_FIELD(AWeapon, BobRangeY)
DEFINE_FIELD(AWeapon, Ammo1)
DEFINE_FIELD(AWeapon, Ammo2)
DEFINE_FIELD(AWeapon, SisterWeapon)
DEFINE_FIELD(AWeapon, FOVScale)
DEFINE_FIELD(AWeapon, Crosshair)
DEFINE_FIELD(AWeapon, GivenAsMorphWeapon)
DEFINE_FIELD(AWeapon, bAltFire)
DEFINE_FIELD_BIT(AWeapon, WeaponFlags, bDehAmmo, WIF_DEHAMMO)
meta->AddNativeField("bAltFire", TypeBool, myoffsetof(AWeapon, bAltFire)); //===========================================================================
//
//
// synthesize a symbol for each flag from the flag name tables to avoid redundant declaration of them. //
for (size_t i = 0; WeaponFlagDefs[i].flagbit != 0xffffffff; i++) //===========================================================================
{
if (WeaponFlagDefs[i].structoffset > 0)
{
meta->AddNativeField(FStringf("b%s", WeaponFlagDefs[i].name), (WeaponFlagDefs[i].fieldsize == 4 ? TypeSInt32 : TypeSInt16), WeaponFlagDefs[i].structoffset, WeaponFlagDefs[i].varflags, WeaponFlagDefs[i].flagbit);
}
}
// This flag is not accessible through actor definitions.
meta->AddNativeField("bDehAmmo", TypeSInt32, myoffsetof(AWeapon, WeaponFlags), VARF_ReadOnly, WIF_DEHAMMO);
}
FString WeaponSection; FString WeaponSection;
TArray<FString> KeyConfWeapons; TArray<FString> KeyConfWeapons;
@ -62,12 +82,24 @@ static int ntoh_cmp(const void *a, const void *b);
IMPLEMENT_CLASS(PClassWeapon, false, false, false, false) IMPLEMENT_CLASS(PClassWeapon, false, false, false, false)
//===========================================================================
//
//
//
//===========================================================================
PClassWeapon::PClassWeapon() PClassWeapon::PClassWeapon()
{ {
SlotNumber = -1; SlotNumber = -1;
SlotPriority = INT_MAX; SlotPriority = INT_MAX;
} }
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::DeriveData(PClass *newclass) void PClassWeapon::DeriveData(PClass *newclass)
{ {
assert(newclass->IsKindOf(RUNTIME_CLASS(PClassWeapon))); assert(newclass->IsKindOf(RUNTIME_CLASS(PClassWeapon)));
@ -79,6 +111,12 @@ void PClassWeapon::DeriveData(PClass *newclass)
} }
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass) void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass)
{ {
Super::ReplaceClassRef(oldclass, newclass); Super::ReplaceClassRef(oldclass, newclass);
@ -91,6 +129,12 @@ void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass)
} }
} }
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::Finalize(FStateDefinitions &statedef) void PClassWeapon::Finalize(FStateDefinitions &statedef)
{ {
Super::Finalize(statedef); Super::Finalize(statedef);

View file

@ -131,7 +131,7 @@ CVAR (Int, cl_bloodtype, 0, CVAR_ARCHIVE);
// CODE -------------------------------------------------------------------- // CODE --------------------------------------------------------------------
IMPLEMENT_CLASS(AActor, false, true, true, true) IMPLEMENT_CLASS(AActor, false, true, false, true)
IMPLEMENT_POINTERS_START(AActor) IMPLEMENT_POINTERS_START(AActor)
IMPLEMENT_POINTER(target) IMPLEMENT_POINTER(target)
@ -310,24 +310,6 @@ DEFINE_FIELD(AActor, ConversationRoot)
DEFINE_FIELD(AActor, Conversation) DEFINE_FIELD(AActor, Conversation)
DEFINE_FIELD(AActor, DecalGenerator) DEFINE_FIELD(AActor, DecalGenerator)
void AActor::InitNativeFields()
{
auto meta = RUNTIME_CLASS(AActor);
// needs to be done manually until it can be given a proper type.
meta->AddNativeField("DecalGenerator", NewPointer(TypeVoid), myoffsetof(AActor, DecalGenerator));
// synthesize a symbol for each flag from the flag name tables to avoid redundant declaration of them.
for (size_t i = 0; ActorFlagDefs[i].flagbit != 0xffffffff; i++)
{
meta->AddNativeField(FStringf("b%s", ActorFlagDefs[i].name), (ActorFlagDefs[i].fieldsize == 4? TypeSInt32 : TypeSInt16), ActorFlagDefs[i].structoffset, ActorFlagDefs[i].varflags, ActorFlagDefs[i].flagbit);
}
for (size_t i = 0; InternalActorFlagDefs[i].flagbit != 0xffffffff; i++)
{
meta->AddNativeField(FStringf("b%s", InternalActorFlagDefs[i].name), (InternalActorFlagDefs[i].fieldsize == 4 ? TypeSInt32 : TypeSInt16), InternalActorFlagDefs[i].structoffset, InternalActorFlagDefs[i].varflags, InternalActorFlagDefs[i].flagbit);
}
}
//========================================================================== //==========================================================================
// //
// AActor :: Serialize // AActor :: Serialize
@ -7186,15 +7168,10 @@ IMPLEMENT_POINTERS_START(DDropItem)
IMPLEMENT_POINTER(Next) IMPLEMENT_POINTER(Next)
IMPLEMENT_POINTERS_END IMPLEMENT_POINTERS_END
void DDropItem::InitNativeFields() DEFINE_FIELD(DDropItem, Next)
{ DEFINE_FIELD(DDropItem, Name)
auto meta = RUNTIME_CLASS(DDropItem); DEFINE_FIELD(DDropItem, Probability)
PType *TypeDropItem = NewPointer(RUNTIME_CLASS(DDropItem)); DEFINE_FIELD(DDropItem, Amount)
meta->AddNativeField("Next", TypeDropItem, myoffsetof(DDropItem, Next), VARF_ReadOnly);
meta->AddNativeField("Name", TypeName, myoffsetof(DDropItem, Name), VARF_ReadOnly);
meta->AddNativeField("Probability", TypeSInt32, myoffsetof(DDropItem, Probability), VARF_ReadOnly);
meta->AddNativeField("Amount", TypeSInt32, myoffsetof(DDropItem, Amount));
}
void PrintMiscActorInfo(AActor *query) void PrintMiscActorInfo(AActor *query)
{ {

View file

@ -99,40 +99,32 @@ static const FGenericButtons ButtonChecks[] =
// //
//------------------------------------------------------------------------ //------------------------------------------------------------------------
IMPLEMENT_CLASS(DPSprite, false, true, true, false) IMPLEMENT_CLASS(DPSprite, false, true, false, false)
IMPLEMENT_POINTERS_START(DPSprite) IMPLEMENT_POINTERS_START(DPSprite)
IMPLEMENT_POINTER(Caller) IMPLEMENT_POINTER(Caller)
IMPLEMENT_POINTER(Next) IMPLEMENT_POINTER(Next)
IMPLEMENT_POINTERS_END IMPLEMENT_POINTERS_END
void DPSprite::InitNativeFields() DEFINE_FIELD_NAMED(DPSprite, State, CurState) // deconflict with same named type
{ DEFINE_FIELD(DPSprite, Caller)
auto meta = RUNTIME_CLASS(DPSprite); DEFINE_FIELD(DPSprite, Next)
PType *TypeActor = NewPointer(RUNTIME_CLASS(AActor)); DEFINE_FIELD(DPSprite, Owner)
PType *TypePSP = NewPointer(RUNTIME_CLASS(DPSprite)); DEFINE_FIELD(DPSprite, Sprite)
PType *TypePlayer = NewPointer(NewNativeStruct("Player", nullptr)); DEFINE_FIELD(DPSprite, Frame)
DEFINE_FIELD(DPSprite, ID)
meta->AddNativeField("State", TypeState, myoffsetof(DPSprite, State), VARF_ReadOnly); DEFINE_FIELD(DPSprite, processPending)
meta->AddNativeField("Caller", TypeActor, myoffsetof(DPSprite, Caller), VARF_ReadOnly); DEFINE_FIELD(DPSprite, x)
meta->AddNativeField("Next", TypePSP, myoffsetof(DPSprite, Next), VARF_ReadOnly); DEFINE_FIELD(DPSprite, y)
meta->AddNativeField("Owner", TypePlayer, myoffsetof(DPSprite, Owner), VARF_ReadOnly); DEFINE_FIELD(DPSprite, oldx)
meta->AddNativeField("Sprite", TypeSpriteID, myoffsetof(DPSprite, Sprite)); DEFINE_FIELD(DPSprite, oldy)
meta->AddNativeField("Frame", TypeSInt32, myoffsetof(DPSprite, Frame)); DEFINE_FIELD(DPSprite, firstTic)
meta->AddNativeField("ID", TypePlayer, myoffsetof(DPSprite, ID), VARF_ReadOnly); DEFINE_FIELD(DPSprite, Tics)
meta->AddNativeField("processPending", TypeBool, myoffsetof(DPSprite, processPending)); DEFINE_FIELD_BIT(DPSprite, Flags, bAddWeapon, PSPF_ADDWEAPON)
meta->AddNativeField("x", TypeFloat64, myoffsetof(DPSprite, x)); DEFINE_FIELD_BIT(DPSprite, Flags, bAddBob, PSPF_ADDBOB)
meta->AddNativeField("y", TypeFloat64, myoffsetof(DPSprite, y)); DEFINE_FIELD_BIT(DPSprite, Flags, bPowDouble, PSPF_POWDOUBLE)
meta->AddNativeField("oldx", TypeFloat64, myoffsetof(DPSprite, oldx)); DEFINE_FIELD_BIT(DPSprite, Flags, bCVarFast, PSPF_CVARFAST)
meta->AddNativeField("oldy", TypeFloat64, myoffsetof(DPSprite, oldy)); DEFINE_FIELD_BIT(DPSprite, Flags, bFlip, PSPF_FLIP)
meta->AddNativeField("firstTic", TypeBool, myoffsetof(DPSprite, firstTic));
meta->AddNativeField("Tics", TypeSInt32, myoffsetof(DPSprite, Tics));
meta->AddNativeField("bAddWeapon", TypeSInt32, myoffsetof(DPSprite, Flags), 0, PSPF_ADDWEAPON);
meta->AddNativeField("bAddBob", TypeSInt32, myoffsetof(DPSprite, Flags), 0, PSPF_ADDBOB);
meta->AddNativeField("bPowDouble", TypeSInt32, myoffsetof(DPSprite, Flags), 0, PSPF_POWDOUBLE);
meta->AddNativeField("bCVarFast", TypeSInt32, myoffsetof(DPSprite, Flags), 0, PSPF_CVARFAST);
meta->AddNativeField("bFlip", TypeSInt32, myoffsetof(DPSprite, Flags), 0, PSPF_FLIP);
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// //

View file

@ -59,7 +59,6 @@ enum PSPFlags
class DPSprite : public DObject class DPSprite : public DObject
{ {
DECLARE_CLASS (DPSprite, DObject) DECLARE_CLASS (DPSprite, DObject)
HAS_FIELDS
HAS_OBJECT_POINTERS HAS_OBJECT_POINTERS
public: public:
DPSprite(player_t *owner, AActor *caller, int id); DPSprite(player_t *owner, AActor *caller, int id);
@ -89,6 +88,7 @@ private:
void Tick(); void Tick();
void Destroy(); void Destroy();
public: // must be public to be able to generate the field export tables. Grrr...
TObjPtr<AActor> Caller; TObjPtr<AActor> Caller;
TObjPtr<DPSprite> Next; TObjPtr<DPSprite> Next;
player_t *Owner; player_t *Owner;

View file

@ -161,12 +161,6 @@ bool ValidatePlayerClass(PClassActor *ti, const char *name)
return true; return true;
} }
void APlayerPawn::InitNativeFields()
{
auto meta = RUNTIME_CLASS(APlayerPawn);
meta->AddNativeField("JumpZ", TypeFloat64, myoffsetof(APlayerPawn, JumpZ));
}
void SetupPlayerClasses () void SetupPlayerClasses ()
{ {
FPlayerClass newclass; FPlayerClass newclass;
@ -628,7 +622,7 @@ void player_t::SendPitchLimits() const
// //
//=========================================================================== //===========================================================================
IMPLEMENT_CLASS(APlayerPawn, false, true, true, true) IMPLEMENT_CLASS(APlayerPawn, false, true, false, true)
IMPLEMENT_POINTERS_START(APlayerPawn) IMPLEMENT_POINTERS_START(APlayerPawn)
IMPLEMENT_POINTER(InvFirst) IMPLEMENT_POINTER(InvFirst)
@ -3139,112 +3133,118 @@ bool P_IsPlayerTotallyFrozen(const player_t *player)
//========================================================================== //==========================================================================
// //
// sets up the script-side version of players // native members
// Since this is a global variable and the script compiler does
// not allow defining them, it will be fully set up here.
// //
//========================================================================== //==========================================================================
void P_InitPlayerForScript() DEFINE_FIELD(APlayerPawn, crouchsprite)
{ DEFINE_FIELD(APlayerPawn, MaxHealth)
PStruct *pstruct = NewNativeStruct("PlayerInfo", nullptr); DEFINE_FIELD(APlayerPawn, MugShotMaxHealth)
pstruct->Size = sizeof(player_t); DEFINE_FIELD(APlayerPawn, RunHealth)
pstruct->Align = alignof(player_t); DEFINE_FIELD(APlayerPawn, PlayerFlags)
PArray *parray = NewArray(pstruct, MAXPLAYERS); DEFINE_FIELD(APlayerPawn, InvFirst)
pstruct->Size = 0; // make sure it cannot be instantiated in the script. DEFINE_FIELD(APlayerPawn, InvSel)
PField *playerf = new PField("players", pstruct, VARF_Native | VARF_Static, (intptr_t)&players); DEFINE_FIELD(APlayerPawn, JumpZ)
GlobalSymbols.AddSymbol(playerf); DEFINE_FIELD(APlayerPawn, GruntSpeed)
DEFINE_FIELD(APlayerPawn, FallingScreamMinSpeed)
DEFINE_FIELD(APlayerPawn, FallingScreamMaxSpeed)
DEFINE_FIELD(APlayerPawn, ViewHeight)
DEFINE_FIELD(APlayerPawn, ForwardMove1)
DEFINE_FIELD(APlayerPawn, ForwardMove2)
DEFINE_FIELD(APlayerPawn, SideMove1)
DEFINE_FIELD(APlayerPawn, SideMove2)
DEFINE_FIELD(APlayerPawn, ScoreIcon)
DEFINE_FIELD(APlayerPawn, SpawnMask)
DEFINE_FIELD(APlayerPawn, MorphWeapon)
DEFINE_FIELD(APlayerPawn, AttackZOffset)
DEFINE_FIELD(APlayerPawn, UseRange)
DEFINE_FIELD(APlayerPawn, AirCapacity)
DEFINE_FIELD(APlayerPawn, FlechetteType)
DEFINE_FIELD(APlayerPawn, DamageFade)
DEFINE_FIELD(APlayerPawn, ViewBob)
PType *TypeActor = NewPointer(RUNTIME_CLASS(AActor)); DEFINE_FIELD_X(PlayerInfo, player_t, mo)
PType *TypePlayerPawn = NewPointer(RUNTIME_CLASS(APlayerPawn)); DEFINE_FIELD_X(PlayerInfo, player_t, playerstate)
PType *TypeWeapon = NewPointer(RUNTIME_CLASS(AWeapon)); DEFINE_FIELD_X(PlayerInfo, player_t, original_oldbuttons)
PType *TypeClassActor = NewClassPointer(RUNTIME_CLASS(AActor)); DEFINE_FIELD_X(PlayerInfo, player_t, cls)
PType *TypeClassPlayerPawn = NewClassPointer(RUNTIME_CLASS(APlayerPawn)); DEFINE_FIELD_X(PlayerInfo, player_t, DesiredFOV)
PType *TypeClassWeapon = NewClassPointer(RUNTIME_CLASS(AWeapon)); DEFINE_FIELD_X(PlayerInfo, player_t, FOV)
DEFINE_FIELD_X(PlayerInfo, player_t, viewz)
//ticcmd_t cmd; DEFINE_FIELD_X(PlayerInfo, player_t, viewheight)
//usercmd_t original_cmd; DEFINE_FIELD_X(PlayerInfo, player_t, deltaviewheight)
//userinfo_t userinfo; // [RH] who is this? DEFINE_FIELD_X(PlayerInfo, player_t, bob)
//FWeaponSlots weapons; DEFINE_FIELD_X(PlayerInfo, player_t, Vel)
pstruct->AddNativeField("mo", TypePlayerPawn, myoffsetof(player_t, mo), VARF_ReadOnly); DEFINE_FIELD_X(PlayerInfo, player_t, centering)
pstruct->AddNativeField("playerstate", TypeUInt8, myoffsetof(player_t, playerstate)); DEFINE_FIELD_X(PlayerInfo, player_t, turnticks)
pstruct->AddNativeField("original_oldbuttons", TypeUInt32, myoffsetof(player_t, original_oldbuttons)); DEFINE_FIELD_X(PlayerInfo, player_t, attackdown)
pstruct->AddNativeField("cls", TypeClassPlayerPawn, myoffsetof(player_t, cls), VARF_ReadOnly); DEFINE_FIELD_X(PlayerInfo, player_t, usedown)
pstruct->AddNativeField("DesiredFOV", TypeFloat32, myoffsetof(player_t, DesiredFOV)); DEFINE_FIELD_X(PlayerInfo, player_t, oldbuttons)
pstruct->AddNativeField("FOV", TypeFloat32, myoffsetof(player_t, FOV), VARF_ReadOnly); DEFINE_FIELD_X(PlayerInfo, player_t, health)
pstruct->AddNativeField("viewz", TypeFloat64, myoffsetof(player_t, viewz)); DEFINE_FIELD_X(PlayerInfo, player_t, inventorytics)
pstruct->AddNativeField("viewheight", TypeFloat64, myoffsetof(player_t, viewheight)); DEFINE_FIELD_X(PlayerInfo, player_t, CurrentPlayerClass)
pstruct->AddNativeField("deltaviewheight", TypeFloat64, myoffsetof(player_t, deltaviewheight)); DEFINE_FIELD_X(PlayerInfo, player_t, frags)
pstruct->AddNativeField("bob", TypeFloat64, myoffsetof(player_t, bob)); DEFINE_FIELD_X(PlayerInfo, player_t, fragcount)
pstruct->AddNativeField("vel", TypeVector2, myoffsetof(player_t, Vel)); DEFINE_FIELD_X(PlayerInfo, player_t, lastkilltime)
pstruct->AddNativeField("centering", TypeBool, myoffsetof(player_t, centering)); DEFINE_FIELD_X(PlayerInfo, player_t, multicount)
pstruct->AddNativeField("turnticks", TypeUInt8, myoffsetof(player_t, turnticks)); DEFINE_FIELD_X(PlayerInfo, player_t, spreecount)
pstruct->AddNativeField("attackdown", TypeBool, myoffsetof(player_t, attackdown)); DEFINE_FIELD_X(PlayerInfo, player_t, WeaponState)
pstruct->AddNativeField("usedown", TypeBool, myoffsetof(player_t, usedown)); DEFINE_FIELD_X(PlayerInfo, player_t, ReadyWeapon)
pstruct->AddNativeField("oldbuttons", TypeUInt32, myoffsetof(player_t, oldbuttons)); DEFINE_FIELD_X(PlayerInfo, player_t, PendingWeapon)
pstruct->AddNativeField("health", TypeSInt32, myoffsetof(player_t, health)); DEFINE_FIELD_X(PlayerInfo, player_t, psprites)
pstruct->AddNativeField("inventorytics", TypeSInt32, myoffsetof(player_t, inventorytics)); DEFINE_FIELD_X(PlayerInfo, player_t, cheats)
pstruct->AddNativeField("CurrentPlayerClass", TypeUInt8, myoffsetof(player_t, CurrentPlayerClass)); DEFINE_FIELD_X(PlayerInfo, player_t, timefreezer)
pstruct->AddNativeField("frags", NewArray(TypeSInt32, MAXPLAYERS), myoffsetof(player_t, frags)); DEFINE_FIELD_X(PlayerInfo, player_t, refire)
pstruct->AddNativeField("fragcount", TypeSInt32, myoffsetof(player_t, fragcount)); DEFINE_FIELD_NAMED_X(PlayerInfo, player_t, inconsistant, inconsistent)
pstruct->AddNativeField("lastkilltime", TypeSInt32, myoffsetof(player_t, lastkilltime)); DEFINE_FIELD_X(PlayerInfo, player_t, waiting)
pstruct->AddNativeField("multicount", TypeUInt8, myoffsetof(player_t, multicount)); DEFINE_FIELD_X(PlayerInfo, player_t, killcount)
pstruct->AddNativeField("spreecount", TypeUInt8, myoffsetof(player_t, spreecount)); DEFINE_FIELD_X(PlayerInfo, player_t, itemcount)
pstruct->AddNativeField("WeaponState", TypeUInt16, myoffsetof(player_t, WeaponState)); DEFINE_FIELD_X(PlayerInfo, player_t, secretcount)
pstruct->AddNativeField("ReadyWeapon", TypeWeapon, myoffsetof(player_t, ReadyWeapon)); DEFINE_FIELD_X(PlayerInfo, player_t, damagecount)
pstruct->AddNativeField("PendingWeapon", TypeWeapon, myoffsetof(player_t, PendingWeapon)); DEFINE_FIELD_X(PlayerInfo, player_t, bonuscount)
pstruct->AddNativeField("psprites", NewPointer(RUNTIME_CLASS(DPSprite)), myoffsetof(player_t, psprites)); DEFINE_FIELD_X(PlayerInfo, player_t, hazardcount)
pstruct->AddNativeField("cheats", TypeSInt32, myoffsetof(player_t, cheats)); DEFINE_FIELD_X(PlayerInfo, player_t, hazardinterval)
pstruct->AddNativeField("timefreezer", TypeSInt32, myoffsetof(player_t, timefreezer)); DEFINE_FIELD_X(PlayerInfo, player_t, hazardtype)
pstruct->AddNativeField("refire", TypeSInt16, myoffsetof(player_t, refire)); DEFINE_FIELD_X(PlayerInfo, player_t, poisoncount)
pstruct->AddNativeField("inconsistent", TypeSInt16, myoffsetof(player_t, inconsistant)); DEFINE_FIELD_X(PlayerInfo, player_t, poisontype)
pstruct->AddNativeField("waiting", TypeSInt32, myoffsetof(player_t, waiting)); DEFINE_FIELD_X(PlayerInfo, player_t, poisonpaintype)
pstruct->AddNativeField("killcount", TypeSInt32, myoffsetof(player_t, killcount)); DEFINE_FIELD_X(PlayerInfo, player_t, poisoner)
pstruct->AddNativeField("itemcount", TypeSInt32, myoffsetof(player_t, itemcount)); DEFINE_FIELD_X(PlayerInfo, player_t, attacker)
pstruct->AddNativeField("secretcount", TypeSInt32, myoffsetof(player_t, secretcount)); DEFINE_FIELD_X(PlayerInfo, player_t, extralight)
pstruct->AddNativeField("damagecount", TypeSInt32, myoffsetof(player_t, damagecount)); DEFINE_FIELD_X(PlayerInfo, player_t, fixedcolormap)
pstruct->AddNativeField("bonuscount", TypeSInt32, myoffsetof(player_t, bonuscount)); DEFINE_FIELD_X(PlayerInfo, player_t, fixedlightlevel)
pstruct->AddNativeField("hazardcount", TypeSInt32, myoffsetof(player_t, hazardcount)); DEFINE_FIELD_X(PlayerInfo, player_t, morphTics)
pstruct->AddNativeField("hazardinterval", TypeSInt32, myoffsetof(player_t, hazardinterval)); DEFINE_FIELD_X(PlayerInfo, player_t, MorphedPlayerClass)
pstruct->AddNativeField("hazardtype", TypeName, myoffsetof(player_t, hazardtype)); DEFINE_FIELD_X(PlayerInfo, player_t, MorphStyle)
pstruct->AddNativeField("poisoncount", TypeSInt32, myoffsetof(player_t, poisoncount)); DEFINE_FIELD_X(PlayerInfo, player_t, MorphExitFlash)
pstruct->AddNativeField("poisontype", TypeName, myoffsetof(player_t, poisontype)); DEFINE_FIELD_X(PlayerInfo, player_t, PremorphWeapon)
pstruct->AddNativeField("poisonpaintype", TypeName, myoffsetof(player_t, poisonpaintype)); DEFINE_FIELD_X(PlayerInfo, player_t, chickenPeck)
pstruct->AddNativeField("poisoner", TypeActor, myoffsetof(player_t, poisoner)); DEFINE_FIELD_X(PlayerInfo, player_t, jumpTics)
pstruct->AddNativeField("attacker", TypeActor, myoffsetof(player_t, attacker)); DEFINE_FIELD_X(PlayerInfo, player_t, onground)
pstruct->AddNativeField("extralight", TypeSInt32, myoffsetof(player_t, extralight)); DEFINE_FIELD_X(PlayerInfo, player_t, respawn_time)
pstruct->AddNativeField("fixedcolormap", TypeSInt16, myoffsetof(player_t, fixedcolormap)); DEFINE_FIELD_X(PlayerInfo, player_t, camera)
pstruct->AddNativeField("fixedlightlevel", TypeSInt16, myoffsetof(player_t, fixedlightlevel)); DEFINE_FIELD_X(PlayerInfo, player_t, air_finished)
pstruct->AddNativeField("morphtics", TypeSInt32, myoffsetof(player_t, morphTics)); DEFINE_FIELD_X(PlayerInfo, player_t, LastDamageType)
pstruct->AddNativeField("MorphedPlayerClass", TypeClassPlayerPawn, myoffsetof(player_t, MorphedPlayerClass)); DEFINE_FIELD_X(PlayerInfo, player_t, MUSINFOactor)
pstruct->AddNativeField("MorphStyle", TypeSInt32, myoffsetof(player_t, MorphStyle)); DEFINE_FIELD_X(PlayerInfo, player_t, MUSINFOtics)
pstruct->AddNativeField("MorphExitFlash", TypeClassActor, myoffsetof(player_t, MorphExitFlash)); DEFINE_FIELD_X(PlayerInfo, player_t, settings_controller)
pstruct->AddNativeField("PremorphWeapon", TypeClassWeapon, myoffsetof(player_t, PremorphWeapon)); DEFINE_FIELD_X(PlayerInfo, player_t, crouching)
pstruct->AddNativeField("chickenPeck", TypeSInt32, myoffsetof(player_t, chickenPeck)); DEFINE_FIELD_X(PlayerInfo, player_t, crouchdir)
pstruct->AddNativeField("jumpTics", TypeSInt32, myoffsetof(player_t, jumpTics)); DEFINE_FIELD_X(PlayerInfo, player_t, Bot)
pstruct->AddNativeField("onground", TypeBool, myoffsetof(player_t, onground)); DEFINE_FIELD_X(PlayerInfo, player_t, BlendR)
pstruct->AddNativeField("respawn_time", TypeSInt32, myoffsetof(player_t, respawn_time)); DEFINE_FIELD_X(PlayerInfo, player_t, BlendG)
pstruct->AddNativeField("camera", TypeActor, myoffsetof(player_t, camera)); DEFINE_FIELD_X(PlayerInfo, player_t, BlendB)
pstruct->AddNativeField("air_finished", TypeSInt32, myoffsetof(player_t, air_finished)); DEFINE_FIELD_X(PlayerInfo, player_t, BlendA)
pstruct->AddNativeField("LastDamageType", TypeName, myoffsetof(player_t, LastDamageType)); DEFINE_FIELD_X(PlayerInfo, player_t, LogText)
pstruct->AddNativeField("MUSINFOactor", TypeActor, myoffsetof(player_t, MUSINFOactor)); DEFINE_FIELD_X(PlayerInfo, player_t, MinPitch)
pstruct->AddNativeField("MUSINFOtics", TypeSInt8, myoffsetof(player_t, MUSINFOtics)); DEFINE_FIELD_X(PlayerInfo, player_t, MaxPitch)
pstruct->AddNativeField("settings_controller", TypeBool, myoffsetof(player_t, settings_controller)); DEFINE_FIELD_X(PlayerInfo, player_t, crouchfactor)
pstruct->AddNativeField("crouching", TypeSInt8, myoffsetof(player_t, crouching)); DEFINE_FIELD_X(PlayerInfo, player_t, crouchoffset)
pstruct->AddNativeField("crouchdir", TypeSInt8, myoffsetof(player_t, crouchdir)); DEFINE_FIELD_X(PlayerInfo, player_t, crouchviewdelta)
pstruct->AddNativeField("bot", NewPointer(RUNTIME_CLASS(DBot)), myoffsetof(player_t, Bot)); DEFINE_FIELD_X(PlayerInfo, player_t, ConversationNPC)
pstruct->AddNativeField("BlendR", TypeFloat32, myoffsetof(player_t, BlendR)); DEFINE_FIELD_X(PlayerInfo, player_t, ConversationPC)
pstruct->AddNativeField("BlendG", TypeFloat32, myoffsetof(player_t, BlendG)); DEFINE_FIELD_X(PlayerInfo, player_t, ConversationNPCAngle)
pstruct->AddNativeField("BlendB", TypeFloat32, myoffsetof(player_t, BlendB)); DEFINE_FIELD_X(PlayerInfo, player_t, ConversationFaceTalker)
pstruct->AddNativeField("BlendA", TypeFloat32, myoffsetof(player_t, BlendA)); DEFINE_FIELD_X(PlayerInfo, player_t, cmd)
pstruct->AddNativeField("LogText", TypeString, myoffsetof(player_t, LogText)); DEFINE_FIELD_X(PlayerInfo, player_t, original_cmd)
pstruct->AddNativeField("MinPitch", TypeFloat64, myoffsetof(player_t, MinPitch)); DEFINE_FIELD_X(PlayerInfo, player_t, userinfo)
pstruct->AddNativeField("MaxPitch", TypeFloat64, myoffsetof(player_t, MaxPitch)); DEFINE_FIELD_X(PlayerInfo, player_t, weapons)
pstruct->AddNativeField("crouchfactor", TypeFloat64, myoffsetof(player_t, crouchfactor));
pstruct->AddNativeField("crouchoffset", TypeFloat64, myoffsetof(player_t, crouchoffset));
pstruct->AddNativeField("crouchviewdelta", TypeFloat64, myoffsetof(player_t, crouchviewdelta));
pstruct->AddNativeField("ConversationNPC", TypeActor, myoffsetof(player_t, ConversationNPC));
pstruct->AddNativeField("ConversationPC", TypeActor, myoffsetof(player_t, ConversationPC));
pstruct->AddNativeField("ConversationNPCAngle", TypeFloat64, myoffsetof(player_t, ConversationNPCAngle));
pstruct->AddNativeField("ConversationFaceTalker", TypeBool, myoffsetof(player_t, ConversationFaceTalker));
}

View file

@ -63,7 +63,7 @@ static TArray<FieldDesc> FieldTable;
#define DEFINE_DUMMY_FLAG(name, deprec) { DEPF_UNUSED, #name, -1, 0, deprec? VARF_Deprecated:0 } #define DEFINE_DUMMY_FLAG(name, deprec) { DEPF_UNUSED, #name, -1, 0, deprec? VARF_Deprecated:0 }
// internal flags. These do not get exposed to actor definitions but scripts need to be able to access them as variables. // internal flags. These do not get exposed to actor definitions but scripts need to be able to access them as variables.
FFlagDef InternalActorFlagDefs[]= static FFlagDef InternalActorFlagDefs[]=
{ {
DEFINE_FLAG(MF, INCHASE, AActor, flags), DEFINE_FLAG(MF, INCHASE, AActor, flags),
DEFINE_FLAG(MF, UNMORPHED, AActor, flags), DEFINE_FLAG(MF, UNMORPHED, AActor, flags),
@ -90,11 +90,10 @@ FFlagDef InternalActorFlagDefs[]=
DEFINE_FLAG(MF6, INTRYMOVE, AActor, flags6), DEFINE_FLAG(MF6, INTRYMOVE, AActor, flags6),
DEFINE_FLAG(MF7, HANDLENODELAY, AActor, flags7), DEFINE_FLAG(MF7, HANDLENODELAY, AActor, flags7),
DEFINE_FLAG(MF7, FLYCHEAT, AActor, flags7), DEFINE_FLAG(MF7, FLYCHEAT, AActor, flags7),
{ 0xffffffff }
}; };
FFlagDef ActorFlagDefs[]= static FFlagDef ActorFlagDefs[]=
{ {
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags), DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags), DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
@ -328,7 +327,6 @@ FFlagDef ActorFlagDefs[]=
DEFINE_FLAG2(BOUNCE_MBF, MBFBOUNCER, AActor, BounceFlags), DEFINE_FLAG2(BOUNCE_MBF, MBFBOUNCER, AActor, BounceFlags),
DEFINE_FLAG2(BOUNCE_AutoOffFloorOnly, BOUNCEAUTOOFFFLOORONLY, AActor, BounceFlags), DEFINE_FLAG2(BOUNCE_AutoOffFloorOnly, BOUNCEAUTOOFFFLOORONLY, AActor, BounceFlags),
DEFINE_FLAG2(BOUNCE_UseBounceState, USEBOUNCESTATE, AActor, BounceFlags), DEFINE_FLAG2(BOUNCE_UseBounceState, USEBOUNCESTATE, AActor, BounceFlags),
{ 0xffffffff }
}; };
// These won't be accessible through bitfield variables // These won't be accessible through bitfield variables
@ -387,10 +385,9 @@ static FFlagDef InventoryFlagDefs[] =
DEFINE_DEPRECATED_FLAG(PICKUPFLASH), DEFINE_DEPRECATED_FLAG(PICKUPFLASH),
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP), DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),
{ 0xffffffff }
}; };
FFlagDef WeaponFlagDefs[] = static FFlagDef WeaponFlagDefs[] =
{ {
// Weapon flags // Weapon flags
DEFINE_FLAG(WIF, NOAUTOFIRE, AWeapon, WeaponFlags), DEFINE_FLAG(WIF, NOAUTOFIRE, AWeapon, WeaponFlags),
@ -417,7 +414,6 @@ FFlagDef WeaponFlagDefs[] =
DEFINE_DUMMY_FLAG(NOLMS, false), DEFINE_DUMMY_FLAG(NOLMS, false),
DEFINE_DUMMY_FLAG(ALLOW_WITH_RESPAWN_INVUL, false), DEFINE_DUMMY_FLAG(ALLOW_WITH_RESPAWN_INVUL, false),
{ 0xffffffff }
}; };
@ -428,24 +424,23 @@ static FFlagDef PlayerPawnFlagDefs[] =
DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags), DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags),
DEFINE_FLAG(PPF, CANSUPERMORPH, APlayerPawn, PlayerFlags), DEFINE_FLAG(PPF, CANSUPERMORPH, APlayerPawn, PlayerFlags),
DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags), DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags),
{ 0xffffffff }
}; };
static FFlagDef PowerSpeedFlagDefs[] = static FFlagDef PowerSpeedFlagDefs[] =
{ {
// PowerSpeed flags // PowerSpeed flags
DEFINE_FLAG(PSF, NOTRAIL, APowerSpeed, SpeedFlags), DEFINE_FLAG(PSF, NOTRAIL, APowerSpeed, SpeedFlags),
{ 0xffffffff }
}; };
static const struct FFlagList { const PClass * const *Type; FFlagDef *Defs; int NumDefs; } FlagLists[] = static const struct FFlagList { const PClass * const *Type; FFlagDef *Defs; int NumDefs; int Use; } FlagLists[] =
{ {
{ &RUNTIME_CLASS_CASTLESS(AActor), ActorFlagDefs, countof(ActorFlagDefs)-1 }, // -1 to account for the terminator { &RUNTIME_CLASS_CASTLESS(AActor), ActorFlagDefs, countof(ActorFlagDefs), 3 }, // -1 to account for the terminator
{ &RUNTIME_CLASS_CASTLESS(AActor), MoreFlagDefs, countof(MoreFlagDefs) }, { &RUNTIME_CLASS_CASTLESS(AActor), MoreFlagDefs, countof(MoreFlagDefs), 1 },
{ &RUNTIME_CLASS_CASTLESS(AInventory), InventoryFlagDefs, countof(InventoryFlagDefs)-1 }, { &RUNTIME_CLASS_CASTLESS(AActor), InternalActorFlagDefs, countof(InternalActorFlagDefs), 2 },
{ &RUNTIME_CLASS_CASTLESS(AWeapon), WeaponFlagDefs, countof(WeaponFlagDefs)-1 }, { &RUNTIME_CLASS_CASTLESS(AInventory), InventoryFlagDefs, countof(InventoryFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(APlayerPawn), PlayerPawnFlagDefs, countof(PlayerPawnFlagDefs)-1 }, { &RUNTIME_CLASS_CASTLESS(AWeapon), WeaponFlagDefs, countof(WeaponFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(APowerSpeed), PowerSpeedFlagDefs, countof(PowerSpeedFlagDefs)-1 }, { &RUNTIME_CLASS_CASTLESS(APlayerPawn), PlayerPawnFlagDefs, countof(PlayerPawnFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(APowerSpeed), PowerSpeedFlagDefs, countof(PowerSpeedFlagDefs), 3 },
}; };
#define NUM_FLAG_LISTS (countof(FlagLists)) #define NUM_FLAG_LISTS (countof(FlagLists))
@ -493,7 +488,7 @@ FFlagDef *FindFlag (const PClass *type, const char *part1, const char *part2, bo
int max = strict ? 2 : NUM_FLAG_LISTS; int max = strict ? 2 : NUM_FLAG_LISTS;
for (int i = 0; i < max; ++i) for (int i = 0; i < max; ++i)
{ {
if (type->IsDescendantOf (*FlagLists[i].Type)) if ((FlagLists[i].Use & 1) && type->IsDescendantOf (*FlagLists[i].Type))
{ {
def = FindFlag (FlagLists[i].Defs, FlagLists[i].NumDefs, part1); def = FindFlag (FlagLists[i].Defs, FlagLists[i].NumDefs, part1);
if (def != NULL) if (def != NULL)
@ -709,9 +704,35 @@ void InitThingdef()
sstruct->AddNativeField("soundtarget", TypeActor, myoffsetof(sector_t, SoundTarget)); sstruct->AddNativeField("soundtarget", TypeActor, myoffsetof(sector_t, SoundTarget));
G_InitLevelLocalsForScript(); G_InitLevelLocalsForScript();
P_InitPlayerForScript();
P_InitStateForScript(); P_InitStateForScript();
// set up a variable for the global players array.
PStruct *pstruct = NewNativeStruct("PlayerInfo", nullptr);
pstruct->Size = sizeof(player_t);
pstruct->Align = alignof(player_t);
PArray *parray = NewArray(pstruct, MAXPLAYERS);
PField *playerf = new PField("players", pstruct, VARF_Native | VARF_Static, (intptr_t)&players);
GlobalSymbols.AddSymbol(playerf);
// this needs to be done manually until it can be given a proper type.
RUNTIME_CLASS(AActor)->AddNativeField("DecalGenerator", NewPointer(TypeVoid), myoffsetof(AActor, DecalGenerator));
// synthesize a symbol for each flag from the flag name tables to avoid redundant declaration of them.
for (auto &fl : FlagLists)
{
if (fl.Use & 2)
{
for(int i=0;i<fl.NumDefs;i++)
{
if (fl.Defs[i].structoffset > 0) // skip the deprecated entries in this list
{
const_cast<PClass*>(*fl.Type)->AddNativeField(FStringf("b%s", fl.Defs[i].name), (fl.Defs[i].fieldsize == 4 ? TypeSInt32 : TypeSInt16), fl.Defs[i].structoffset, fl.Defs[i].varflags, fl.Defs[i].flagbit);
}
}
}
}
FAutoSegIterator probe(CRegHead, CRegTail); FAutoSegIterator probe(CRegHead, CRegTail);
while (*++probe != NULL) while (*++probe != NULL)

View file

@ -1061,7 +1061,12 @@ struct AFuncDesc
#define DEFINE_FIELD_X(cls, icls, name) \ #define DEFINE_FIELD_X(cls, icls, name) \
static const FieldDesc VMField_##icls##_##name = { "A" #cls, #name, (unsigned)myoffsetof(icls, name), (unsigned)sizeof(icls::name), 0 }; \ static const FieldDesc VMField_##icls##_##name = { "A" #cls, #name, (unsigned)myoffsetof(icls, name), (unsigned)sizeof(icls::name), 0 }; \
extern FieldDesc const *const VMField_##icls##_##name##_HookPtr; \ extern FieldDesc const *const VMField_##icls##_##name##_HookPtr; \
MSVC_FSEG FieldDesc const *const VMField_##icls##_##name##_HookPtr GCC_FSEG = &VMField_##cls##_##name; MSVC_FSEG FieldDesc const *const VMField_##icls##_##name##_HookPtr GCC_FSEG = &VMField_##icls##_##name;
#define DEFINE_FIELD_NAMED_X(cls, icls, name, scriptname) \
static const FieldDesc VMField_##icls##_##scriptname = { "A" #cls, #scriptname, (unsigned)myoffsetof(icls, name), (unsigned)sizeof(icls::name), 0 }; \
extern FieldDesc const *const VMField_##icls##_##scriptname##_HookPtr; \
MSVC_FSEG FieldDesc const *const VMField_##icls##_##scriptname##_HookPtr GCC_FSEG = &VMField_##icls##_##scriptname;
#define DEFINE_FIELD_X_BIT(cls, icls, name, bitval) \ #define DEFINE_FIELD_X_BIT(cls, icls, name, bitval) \
static const FieldDesc VMField_##icls##_##name = { "A" #cls, #name, (unsigned)myoffsetof(icls, name), (unsigned)sizeof(icls::name), bitval }; \ static const FieldDesc VMField_##icls##_##name = { "A" #cls, #name, (unsigned)myoffsetof(icls, name), (unsigned)sizeof(icls::name), bitval }; \

View file

@ -295,8 +295,9 @@ struct_flags(X) ::= NATIVE. { X.Flags = ZCC_Native; }
opt_struct_body(X) ::= . { X = NULL; } opt_struct_body(X) ::= . { X = NULL; }
opt_struct_body(X) ::= struct_body(X). opt_struct_body(X) ::= struct_body(X).
opt_struct_body(X) ::= error. { X = NULL; }
struct_body(X) ::= error. { X = NULL; }
struct_body(X) ::= struct_member(X). struct_body(X) ::= struct_member(X).
struct_body(X) ::= struct_member(A) struct_body(B). { X = A; /*X-overwrites-A*/ X->AppendSibling(B); } struct_body(X) ::= struct_member(A) struct_body(B). { X = A; /*X-overwrites-A*/ X->AppendSibling(B); }

View file

@ -1274,7 +1274,9 @@ bool ZCCCompiler::CompileFields(PStruct *type, TArray<ZCC_VarDeclarator *> &Fiel
PType *fieldtype = DetermineType(type, field, field->Names->Name, field->Type, true, true); PType *fieldtype = DetermineType(type, field, field->Names->Name, field->Type, true, true);
// For structs only allow 'deprecated', for classes exclude function qualifiers. // For structs only allow 'deprecated', for classes exclude function qualifiers.
int notallowed = forstruct? ~ZCC_Deprecated : ZCC_Latent | ZCC_Final | ZCC_Action | ZCC_Static | ZCC_FuncConst | ZCC_Abstract | ZCC_Virtual | ZCC_Override; int notallowed = forstruct?
ZCC_Latent | ZCC_Final | ZCC_Action | ZCC_Static | ZCC_FuncConst | ZCC_Abstract | ZCC_Virtual | ZCC_Override | ZCC_Meta | ZCC_Extension :
ZCC_Latent | ZCC_Final | ZCC_Action | ZCC_Static | ZCC_FuncConst | ZCC_Abstract | ZCC_Virtual | ZCC_Override | ZCC_Extension;
if (field->Flags & notallowed) if (field->Flags & notallowed)
{ {
@ -1323,13 +1325,15 @@ bool ZCCCompiler::CompileFields(PStruct *type, TArray<ZCC_VarDeclarator *> &Fiel
{ {
Error(field, "The member variable '%s.%s' has not been exported from the executable.", type->TypeName.GetChars(), FName(name->Name).GetChars()); Error(field, "The member variable '%s.%s' has not been exported from the executable.", type->TypeName.GetChars(), FName(name->Name).GetChars());
} }
else if (thisfieldtype->Size != fd->FieldSize) else if (thisfieldtype->Size != fd->FieldSize && fd->BitValue == 0)
{ {
Error(field, "The member variable '%s.%s' has mismatching sizes in internal and external declaration. (Internal = %d, External = %d)", type->TypeName.GetChars(), FName(name->Name).GetChars(), fd->FieldSize, thisfieldtype->Size); Error(field, "The member variable '%s.%s' has mismatching sizes in internal and external declaration. (Internal = %d, External = %d)", type->TypeName.GetChars(), FName(name->Name).GetChars(), fd->FieldSize, thisfieldtype->Size);
} }
// Q: Should we check alignment, too? A mismatch may be an indicator for bad assumptions. // Q: Should we check alignment, too? A mismatch may be an indicator for bad assumptions.
else else
{ {
// for bit fields the type must point to the source variable.
if (fd->BitValue != 0) thisfieldtype = fd->FieldSize == 1 ? TypeUInt8 : fd->FieldSize == 2 ? TypeUInt16 : TypeUInt32;
type->AddNativeField(name->Name, thisfieldtype, fd->FieldOffset, varflags, fd->BitValue); type->AddNativeField(name->Name, thisfieldtype, fd->FieldOffset, varflags, fd->BitValue);
} }
} }
@ -1427,6 +1431,7 @@ PType *ZCCCompiler::DetermineType(PType *outertype, ZCC_TreeNode *field, FName n
case ZCC_FloatAuto: case ZCC_FloatAuto:
retval = formember ? TypeFloat32 : TypeFloat64; retval = formember ? TypeFloat32 : TypeFloat64;
break;
case ZCC_Float64: case ZCC_Float64:
retval = TypeFloat64; retval = TypeFloat64;

View file

@ -164,6 +164,11 @@ struct ZCC_TreeNode
// Appends a sibling to this node's sibling list. // Appends a sibling to this node's sibling list.
void AppendSibling(ZCC_TreeNode *sibling) void AppendSibling(ZCC_TreeNode *sibling)
{ {
if (this == nullptr)
{
// Some bad syntax can actually get here, so better abort so that the user can see the error which caused this.
I_FatalError("Internal script compiler error. Execution aborted.");
}
if (sibling == NULL) if (sibling == NULL)
{ {
return; return;

View file

@ -1,5 +1,7 @@
class Object native class Object native
{ {
native bool bDestroyed;
// These really should be global functions... // These really should be global functions...
native static int G_SkillPropertyInt(int p); native static int G_SkillPropertyInt(int p);
native static double G_SkillPropertyFloat(int p); native static double G_SkillPropertyFloat(int p);
@ -35,12 +37,10 @@ class ActorIterator : Object native
class DropItem : Object native class DropItem : Object native
{ {
/* native fields listed for reference only for now
native readonly DropItem Next; native readonly DropItem Next;
native readonly name Name; native readonly name Name;
native readonly int Probability; native readonly int Probability;
native readonly int Amount; native int Amount;
*/
} }
class SpotState : Object native class SpotState : Object native

View file

@ -1,5 +1,6 @@
// for flag changer functions. // for flag changer functions.
const FLAG_NO_CHANGE = -1; const FLAG_NO_CHANGE = -1;
const MAXPLAYERS = 8;
enum EStateUseFlags enum EStateUseFlags
{ {

View file

@ -70,7 +70,7 @@ extend class StateProvider
{ {
// Removed most of the mess that was here in the C++ code because SetSafeFlash already does some thorough validation. // Removed most of the mess that was here in the C++ code because SetSafeFlash already does some thorough validation.
State atk = weap.FindState('Fire'); State atk = weap.FindState('Fire');
State cur = player.GetPSprite(PSP_WEAPON).State; State cur = player.GetPSprite(PSP_WEAPON).CurState;
int theflash = atk == cur? 0:1; int theflash = atk == cur? 0:1;
player.SetSafeFlash(weap, flash, theflash); player.SetSafeFlash(weap, flash, theflash);
} }

View file

@ -23,3 +23,7 @@ class CajunTrace : Actor
+NOTELEPORT +NOTELEPORT
} }
} }
struct Bot native
{
}

View file

@ -102,6 +102,14 @@ class BasicArmor : Armor native
class BasicArmorBonus : Armor native class BasicArmorBonus : Armor native
{ {
native double SavePercent; // The default, for when you don't already have armor
native int MaxSaveAmount;
native int MaxAbsorb;
native int MaxFullAbsorb;
native int SaveAmount;
native int BonusCount;
native int BonusMax;
Default Default
{ {
+Inventory.AUTOACTIVATE +Inventory.AUTOACTIVATE
@ -438,6 +446,32 @@ class PuzzleItem : Inventory native
class Weapon : StateProvider native class Weapon : StateProvider native
{ {
native uint WeaponFlags;
native class<Ammo> AmmoType1, AmmoType2; // Types of ammo used by this weapon
native int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
native int MinAmmo1, MinAmmo2; // Minimum ammo needed to switch to this weapon
native int AmmoUse1, AmmoUse2; // How much ammo to use with each shot
native int Kickback;
native float YAdjust; // For viewing the weapon fullscreen (visual only so no need to be a double)
native sound UpSound, ReadySound; // Sounds when coming up and idle
native class<Weapon> SisterWeaponType; // Another weapon to pick up with this one
native class<Actor> ProjectileType; // Projectile used by primary attack
native class<Actor> AltProjectileType; // Projectile used by alternate attack
native int SelectionOrder; // Lower-numbered weapons get picked first
native int MinSelAmmo1, MinSelAmmo2; // Ignore in BestWeapon() if inadequate ammo
native double MoveCombatDist; // Used by bots, but do they *really* need it?
native int ReloadCounter; // For A_CheckForReload
native int BobStyle; // [XA] Bobbing style. Defines type of bobbing (e.g. Normal, Alpha) (visual only so no need to be a double)
native float BobSpeed; // [XA] Bobbing speed. Defines how quickly a weapon bobs.
native float BobRangeX, BobRangeY; // [XA] Bobbing range. Defines how far a weapon bobs in either direction.
native Ammo Ammo1, Ammo2; // In-inventory instance variables
native Weapon SisterWeapon;
native float FOVScale;
native int Crosshair; // 0 to use player's crosshair
native bool GivenAsMorphWeapon;
native bool bAltFire; // Set when this weapon's alternate fire is used.
native readonly bool bDehAmmo;
Default Default
{ {
Inventory.PickupSound "misc/w_pkup"; Inventory.PickupSound "misc/w_pkup";

View file

@ -1,5 +1,31 @@
class PlayerPawn : Actor native class PlayerPawn : Actor native
{ {
native int crouchsprite;
native int MaxHealth;
native int MugShotMaxHealth;
native int RunHealth;
native int PlayerFlags;
native Inventory InvFirst; // first inventory item displayed on inventory bar
native Inventory InvSel; // selected inventory item
// [GRB] Player class properties
native double JumpZ;
native double GruntSpeed;
native double FallingScreamMinSpeed, FallingScreamMaxSpeed;
native double ViewHeight;
native double ForwardMove1, ForwardMove2;
native double SideMove1, SideMove2;
native TextureID ScoreIcon;
native int SpawnMask;
native Name MorphWeapon;
native double AttackZOffset; // attack height, relative to player center
native double UseRange; // [NS] Distance at which player can +use
native double AirCapacity; // Multiplier for air supply underwater.
native Class<Actor> FlechetteType;
native color DamageFade; // [CW] Fades for when you are being damaged.
native double ViewBob; // [SP] ViewBob Multiplier
Default Default
{ {
Health 100; Health 100;
@ -75,10 +101,118 @@ class PlayerChunk : PlayerPawn native
class PSprite : Object native class PSprite : Object native
{ {
native readonly State CurState;
native readonly Actor Caller;
native readonly PSprite Next;
native readonly PlayerInfo Owner;
native SpriteID Sprite;
native int Frame;
native readonly int ID;
native Bool processPending;
native double x;
native double y;
native double oldx;
native double oldy;
native Bool firstTic;
native int Tics;
native bool bAddWeapon;
native bool bAddBob;
native bool bPowDouble;
native bool bCVarFast;
native bool bFlip;
} }
struct PlayerInfo native // this is what internally is player_t struct PlayerInfo native // this is what internally is known as player_t
{ {
native readonly PlayerPawn mo;
native uint8 playerstate;
native uint original_oldbuttons;
native readonly Class<PlayerPawn> cls;
native float DesiredFOV;
native readonly float FOV;
native double viewz;
native double viewheight;
native double deltaviewheight;
native double bob;
native vector2 vel;
native bool centering;
native uint8 turnticks;
native bool attackdown;
native bool usedown;
native uint oldbuttons;
native int health;
native int inventorytics;
native uint8 CurrentPlayerClass;
native int frags[MAXPLAYERS];
native int fragcount;
native int lastkilltime;
native uint8 multicount;
native uint8 spreecount;
native uint16 WeaponState;
native Weapon ReadyWeapon;
native Weapon PendingWeapon;
native PSprite psprites;
native int cheats;
native int timefreezer;
native int16 refire;
native int16 inconsistent;
native bool waiting;
native int killcount;
native int itemcount;
native int secretcount;
native int damagecount;
native int bonuscount;
native int hazardcount;
native int hazardinterval;
native Name hazardtype;
native int poisoncount;
native Name poisontype;
native Name poisonpaintype;
native Actor poisoner;
native Actor attacker;
native int extralight;
native int16 fixedcolormap;
native int16 fixedlightlevel;
native int morphtics;
native Class<PlayerPawn>MorphedPlayerClass;
native int MorphStyle;
native Class<Actor> MorphExitFlash;
native Class<Weapon> PremorphWeapon;
native int chickenPeck;
native int jumpTics;
native bool onground;
native int respawn_time;
native Actor camera;
native int air_finished;
native Name LastDamageType;
native Actor MUSINFOactor;
native int8 MUSINFOtics;
native bool settings_controller;
native int8 crouching;
native int8 crouchdir;
native Bot bot;
native float BlendR;
native float BlendG;
native float BlendB;
native float BlendA;
native String LogText;
native double MinPitch;
native double MaxPitch;
native double crouchfactor;
native double crouchoffset;
native double crouchviewdelta;
native Actor ConversationNPC;
native Actor ConversationPC;
native double ConversationNPCAngle;
native bool ConversationFaceTalker;
/* these are not doable yet
ticcmd_t cmd;
usercmd_t original_cmd;
userinfo_t userinfo; // [RH] who is this?
FWeaponSlots weapons;
*/
native void SetPsprite(int id, State stat, bool pending = false); native void SetPsprite(int id, State stat, bool pending = false);
native void SetSafeFlash(Weapon weap, State flashstate, int index); native void SetSafeFlash(Weapon weap, State flashstate, int index);
native PSprite GetPSprite(int id); native PSprite GetPSprite(int id);