- 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)
HAS_OBJECT_POINTERS
HAS_FIELDS
public:
DDropItem *Next;
FName Name;
@ -579,7 +578,6 @@ const double MinVel = EQUAL_EPSILON;
class AActor : public DThinker
{
DECLARE_CLASS_WITH_META (AActor, DThinker, PClassActor)
HAS_FIELDS
HAS_OBJECT_POINTERS
public:
AActor () throw();

View file

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

View file

@ -64,12 +64,15 @@ ClassReg DObject::RegistrationInfo =
&DVMObject<DObject>::RegistrationInfo, // VMExport
nullptr, // Pointers
&DObject::InPlaceConstructor, // ConstructNative
&DObject::InitNativeFields, // InitNatives
nullptr,
sizeof(DObject), // SizeOf
CLASSREG_PClass, // MetaClassNum
};
_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 ()
{
ObjectFlags = (ObjectFlags & ~OF_Fixed) | OF_EuthanizeMe;

View file

@ -150,9 +150,6 @@ protected: \
#define HAS_OBJECT_POINTERS \
static const size_t PointerOffsets[];
#define HAS_FIELDS \
static void InitNativeFields();
#if defined(_MSC_VER)
# pragma section(".creg$u",read)
# 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
#define _X_POINTERS_true(cls) cls::PointerOffsets
#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_CONSTRUCTOR_true(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; }
static ClassReg RegistrationInfo, * const RegistrationInfoPtr;
static void InPlaceConstructor (void *mem);
static void InitNativeFields();
typedef PClass MetaClass;
private:
typedef DObject ThisClass;

View file

@ -2515,7 +2515,7 @@ PField::PField(FName name, PType *type, DWORD flags, size_t offset, int bitvalue
else
{
// 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;

View file

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

View file

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

View file

@ -31,25 +31,45 @@ IMPLEMENT_POINTERS_START(AWeapon)
IMPLEMENT_POINTER(SisterWeapon)
IMPLEMENT_POINTERS_END
void AWeapon::InitNativeFields()
{
auto meta = RUNTIME_CLASS(AWeapon);
DEFINE_FIELD(AWeapon, WeaponFlags)
DEFINE_FIELD(AWeapon, AmmoType1)
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;
TArray<FString> KeyConfWeapons;
@ -62,12 +82,24 @@ static int ntoh_cmp(const void *a, const void *b);
IMPLEMENT_CLASS(PClassWeapon, false, false, false, false)
//===========================================================================
//
//
//
//===========================================================================
PClassWeapon::PClassWeapon()
{
SlotNumber = -1;
SlotPriority = INT_MAX;
}
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::DeriveData(PClass *newclass)
{
assert(newclass->IsKindOf(RUNTIME_CLASS(PClassWeapon)));
@ -79,6 +111,12 @@ void PClassWeapon::DeriveData(PClass *newclass)
}
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass)
{
Super::ReplaceClassRef(oldclass, newclass);
@ -91,6 +129,12 @@ void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass)
}
}
//===========================================================================
//
//
//
//===========================================================================
void PClassWeapon::Finalize(FStateDefinitions &statedef)
{
Super::Finalize(statedef);

View file

@ -131,7 +131,7 @@ CVAR (Int, cl_bloodtype, 0, CVAR_ARCHIVE);
// CODE --------------------------------------------------------------------
IMPLEMENT_CLASS(AActor, false, true, true, true)
IMPLEMENT_CLASS(AActor, false, true, false, true)
IMPLEMENT_POINTERS_START(AActor)
IMPLEMENT_POINTER(target)
@ -310,24 +310,6 @@ DEFINE_FIELD(AActor, ConversationRoot)
DEFINE_FIELD(AActor, Conversation)
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
@ -7183,18 +7165,13 @@ DEFINE_ACTION_FUNCTION(AActor, Vec3Offset)
IMPLEMENT_CLASS(DDropItem, false, true, true, false)
IMPLEMENT_POINTERS_START(DDropItem)
IMPLEMENT_POINTER(Next)
IMPLEMENT_POINTER(Next)
IMPLEMENT_POINTERS_END
void DDropItem::InitNativeFields()
{
auto meta = RUNTIME_CLASS(DDropItem);
PType *TypeDropItem = NewPointer(RUNTIME_CLASS(DDropItem));
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));
}
DEFINE_FIELD(DDropItem, Next)
DEFINE_FIELD(DDropItem, Name)
DEFINE_FIELD(DDropItem, Probability)
DEFINE_FIELD(DDropItem, Amount)
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_POINTER(Caller)
IMPLEMENT_POINTER(Next)
IMPLEMENT_POINTERS_END
void DPSprite::InitNativeFields()
{
auto meta = RUNTIME_CLASS(DPSprite);
PType *TypeActor = NewPointer(RUNTIME_CLASS(AActor));
PType *TypePSP = NewPointer(RUNTIME_CLASS(DPSprite));
PType *TypePlayer = NewPointer(NewNativeStruct("Player", nullptr));
meta->AddNativeField("State", TypeState, myoffsetof(DPSprite, State), VARF_ReadOnly);
meta->AddNativeField("Caller", TypeActor, myoffsetof(DPSprite, Caller), VARF_ReadOnly);
meta->AddNativeField("Next", TypePSP, myoffsetof(DPSprite, Next), VARF_ReadOnly);
meta->AddNativeField("Owner", TypePlayer, myoffsetof(DPSprite, Owner), VARF_ReadOnly);
meta->AddNativeField("Sprite", TypeSpriteID, myoffsetof(DPSprite, Sprite));
meta->AddNativeField("Frame", TypeSInt32, myoffsetof(DPSprite, Frame));
meta->AddNativeField("ID", TypePlayer, myoffsetof(DPSprite, ID), VARF_ReadOnly);
meta->AddNativeField("processPending", TypeBool, myoffsetof(DPSprite, processPending));
meta->AddNativeField("x", TypeFloat64, myoffsetof(DPSprite, x));
meta->AddNativeField("y", TypeFloat64, myoffsetof(DPSprite, y));
meta->AddNativeField("oldx", TypeFloat64, myoffsetof(DPSprite, oldx));
meta->AddNativeField("oldy", TypeFloat64, myoffsetof(DPSprite, oldy));
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);
}
DEFINE_FIELD_NAMED(DPSprite, State, CurState) // deconflict with same named type
DEFINE_FIELD(DPSprite, Caller)
DEFINE_FIELD(DPSprite, Next)
DEFINE_FIELD(DPSprite, Owner)
DEFINE_FIELD(DPSprite, Sprite)
DEFINE_FIELD(DPSprite, Frame)
DEFINE_FIELD(DPSprite, ID)
DEFINE_FIELD(DPSprite, processPending)
DEFINE_FIELD(DPSprite, x)
DEFINE_FIELD(DPSprite, y)
DEFINE_FIELD(DPSprite, oldx)
DEFINE_FIELD(DPSprite, oldy)
DEFINE_FIELD(DPSprite, firstTic)
DEFINE_FIELD(DPSprite, Tics)
DEFINE_FIELD_BIT(DPSprite, Flags, bAddWeapon, PSPF_ADDWEAPON)
DEFINE_FIELD_BIT(DPSprite, Flags, bAddBob, PSPF_ADDBOB)
DEFINE_FIELD_BIT(DPSprite, Flags, bPowDouble, PSPF_POWDOUBLE)
DEFINE_FIELD_BIT(DPSprite, Flags, bCVarFast, PSPF_CVARFAST)
DEFINE_FIELD_BIT(DPSprite, Flags, bFlip, PSPF_FLIP)
//------------------------------------------------------------------------
//

View file

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

View file

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

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 }
// 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, UNMORPHED, AActor, flags),
@ -90,11 +90,10 @@ FFlagDef InternalActorFlagDefs[]=
DEFINE_FLAG(MF6, INTRYMOVE, AActor, flags6),
DEFINE_FLAG(MF7, HANDLENODELAY, AActor, flags7),
DEFINE_FLAG(MF7, FLYCHEAT, AActor, flags7),
{ 0xffffffff }
};
FFlagDef ActorFlagDefs[]=
static FFlagDef ActorFlagDefs[]=
{
DEFINE_FLAG(MF, PICKUP, APlayerPawn, flags),
DEFINE_FLAG(MF, SPECIAL, APlayerPawn, flags),
@ -328,7 +327,6 @@ FFlagDef ActorFlagDefs[]=
DEFINE_FLAG2(BOUNCE_MBF, MBFBOUNCER, AActor, BounceFlags),
DEFINE_FLAG2(BOUNCE_AutoOffFloorOnly, BOUNCEAUTOOFFFLOORONLY, AActor, BounceFlags),
DEFINE_FLAG2(BOUNCE_UseBounceState, USEBOUNCESTATE, AActor, BounceFlags),
{ 0xffffffff }
};
// These won't be accessible through bitfield variables
@ -387,10 +385,9 @@ static FFlagDef InventoryFlagDefs[] =
DEFINE_DEPRECATED_FLAG(PICKUPFLASH),
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),
{ 0xffffffff }
};
FFlagDef WeaponFlagDefs[] =
static FFlagDef WeaponFlagDefs[] =
{
// Weapon flags
DEFINE_FLAG(WIF, NOAUTOFIRE, AWeapon, WeaponFlags),
@ -417,7 +414,6 @@ FFlagDef WeaponFlagDefs[] =
DEFINE_DUMMY_FLAG(NOLMS, 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, CANSUPERMORPH, APlayerPawn, PlayerFlags),
DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags),
{ 0xffffffff }
};
static FFlagDef PowerSpeedFlagDefs[] =
{
// PowerSpeed flags
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), MoreFlagDefs, countof(MoreFlagDefs) },
{ &RUNTIME_CLASS_CASTLESS(AInventory), InventoryFlagDefs, countof(InventoryFlagDefs)-1 },
{ &RUNTIME_CLASS_CASTLESS(AWeapon), WeaponFlagDefs, countof(WeaponFlagDefs)-1 },
{ &RUNTIME_CLASS_CASTLESS(APlayerPawn), PlayerPawnFlagDefs, countof(PlayerPawnFlagDefs)-1 },
{ &RUNTIME_CLASS_CASTLESS(APowerSpeed), PowerSpeedFlagDefs, countof(PowerSpeedFlagDefs)-1 },
{ &RUNTIME_CLASS_CASTLESS(AActor), ActorFlagDefs, countof(ActorFlagDefs), 3 }, // -1 to account for the terminator
{ &RUNTIME_CLASS_CASTLESS(AActor), MoreFlagDefs, countof(MoreFlagDefs), 1 },
{ &RUNTIME_CLASS_CASTLESS(AActor), InternalActorFlagDefs, countof(InternalActorFlagDefs), 2 },
{ &RUNTIME_CLASS_CASTLESS(AInventory), InventoryFlagDefs, countof(InventoryFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(AWeapon), WeaponFlagDefs, countof(WeaponFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(APlayerPawn), PlayerPawnFlagDefs, countof(PlayerPawnFlagDefs), 3 },
{ &RUNTIME_CLASS_CASTLESS(APowerSpeed), PowerSpeedFlagDefs, countof(PowerSpeedFlagDefs), 3 },
};
#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;
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);
if (def != NULL)
@ -709,9 +704,35 @@ void InitThingdef()
sstruct->AddNativeField("soundtarget", TypeActor, myoffsetof(sector_t, SoundTarget));
G_InitLevelLocalsForScript();
P_InitPlayerForScript();
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);
while (*++probe != NULL)

View file

@ -1061,7 +1061,12 @@ struct AFuncDesc
#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 }; \
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) \
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) ::= 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(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);
// 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)
{
@ -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());
}
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);
}
// Q: Should we check alignment, too? A mismatch may be an indicator for bad assumptions.
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);
}
}
@ -1427,6 +1431,7 @@ PType *ZCCCompiler::DetermineType(PType *outertype, ZCC_TreeNode *field, FName n
case ZCC_FloatAuto:
retval = formember ? TypeFloat32 : TypeFloat64;
break;
case ZCC_Float64:
retval = TypeFloat64;

View file

@ -164,6 +164,11 @@ struct ZCC_TreeNode
// Appends a sibling to this node's sibling list.
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)
{
return;

View file

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

View file

@ -1,5 +1,6 @@
// for flag changer functions.
const FLAG_NO_CHANGE = -1;
const MAXPLAYERS = 8;
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.
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;
player.SetSafeFlash(weap, flash, theflash);
}

View file

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

View file

@ -102,6 +102,14 @@ class BasicArmor : 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
{
+Inventory.AUTOACTIVATE
@ -438,6 +446,32 @@ class PuzzleItem : Inventory 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
{
Inventory.PickupSound "misc/w_pkup";

View file

@ -1,5 +1,31 @@
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
{
Health 100;
@ -75,10 +101,118 @@ class PlayerChunk : PlayerPawn 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 SetSafeFlash(Weapon weap, State flashstate, int index);
native PSprite GetPSprite(int id);