- removed all remaining native components of the weapon class.

This commit is contained in:
Christoph Oelckers 2018-11-25 10:00:55 +01:00
parent 70d3c31551
commit d6b781312c
25 changed files with 130 additions and 253 deletions

View file

@ -50,7 +50,6 @@
#define MMAXSELECT 100 //Maximum number of monsters that can be selected at a time.
struct FCheckPosition;
class AWeapon;
struct botskill_t
{
@ -100,7 +99,7 @@ using BotInfoMap = TMap<FName, BotInfoData>;
extern BotInfoMap BotInfo;
inline BotInfoData GetBotInfo(AWeapon *weap)
inline BotInfoData GetBotInfo(AInventory *weap)
{
if (weap == nullptr) return BotInfoData();
auto k = BotInfo.CheckKey(weap->GetClass()->TypeName);

View file

@ -362,9 +362,9 @@ void DBot::WhatToGet (AActor *item)
if (item->IsKindOf(NAME_Weapon))
{
// FIXME
AWeapon *heldWeapon;
AInventory *heldWeapon;
heldWeapon = dyn_cast<AWeapon>(player->mo->FindInventory(item->GetClass()));
heldWeapon = player->mo->FindInventory(item->GetClass());
if (heldWeapon != NULL)
{
if (!weapgiveammo)

View file

@ -374,7 +374,7 @@ static void ShoveChatStr (const char *str, uint8_t who)
static bool DoSubstitution (FString &out, const char *in)
{
player_t *player = &players[consoleplayer];
AWeapon *weapon = player->ReadyWeapon;
auto weapon = player->ReadyWeapon;
auto ammo1 = weapon ? weapon->PointerVar<AInventory>(NAME_Ammo1) : nullptr;
auto ammo2 = weapon ? weapon->PointerVar<AInventory>(NAME_Ammo2) : nullptr;
const char *a, *b;

View file

@ -761,8 +761,8 @@ void SetDehParams(FState *state, int codepointer)
// Let's identify the codepointer we're dealing with.
PFunction *sym;
sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->FindSymbol(FName(MBFCodePointers[codepointer].name), true));
if (sym == NULL) return;
sym = dyn_cast<PFunction>(PClass::FindActor(NAME_Weapon)->FindSymbol(FName(MBFCodePointers[codepointer].name), true));
if (sym == NULL ) return;
if (codepointer < 0 || (unsigned)codepointer >= countof(MBFCodePointerFactories))
{
@ -1580,9 +1580,9 @@ static int PatchAmmo (int ammoNum)
defaultAmmo->MaxAmount = *max;
defaultAmmo->Amount = Scale (defaultAmmo->Amount, *per, oldclip);
}
else if (type->IsDescendantOf (RUNTIME_CLASS(AWeapon)))
else if (type->IsDescendantOf (NAME_Weapon))
{
AWeapon *defWeap = (AWeapon *)GetDefaultByType (type);
auto defWeap = GetDefaultByType (type);
if (defWeap->PointerVar<PClassActor>(NAME_AmmoType1) == ammoType)
{
auto &AmmoGive1 = defWeap->IntVar(NAME_AmmoGive1);
@ -1603,9 +1603,8 @@ static int PatchAmmo (int ammoNum)
static int PatchWeapon (int weapNum)
{
int result;
PClassActor *type = NULL;
uint8_t dummy[sizeof(AWeapon)];
AWeapon *info = (AWeapon *)&dummy;
PClassActor *type = nullptr;
AInventory *info = nullptr;
bool patchedStates = false;
FStateDefinitions statedef;
@ -1614,7 +1613,7 @@ static int PatchWeapon (int weapNum)
type = WeaponNames[weapNum];
if (type != NULL)
{
info = (AWeapon *)GetDefaultByType (type);
info = (AInventory*)GetDefaultByType (type);
DPrintf (DMSG_SPAMMY, "Weapon %d\n", weapNum);
}
}
@ -1657,15 +1656,18 @@ static int PatchWeapon (int weapNum)
{
val = 5;
}
auto &AmmoType = info->PointerVar<PClassActor>(NAME_AmmoType1);
AmmoType = AmmoNames[val];
if (AmmoType != nullptr)
if (info)
{
info->IntVar(NAME_AmmoGive1) = ((AInventory*)GetDefaultByType (AmmoType))->Amount * 2;
auto &AmmoUse = info->IntVar(NAME_AmmoUse1);
if (AmmoUse == 0)
auto &AmmoType = info->PointerVar<PClassActor>(NAME_AmmoType1);
AmmoType = AmmoNames[val];
if (AmmoType != nullptr)
{
AmmoUse = 1;
info->IntVar(NAME_AmmoGive1) = ((AInventory*)GetDefaultByType(AmmoType))->Amount * 2;
auto &AmmoUse = info->IntVar(NAME_AmmoUse1);
if (AmmoUse == 0)
{
AmmoUse = 1;
}
}
}
}
@ -1680,7 +1682,7 @@ static int PatchWeapon (int weapNum)
const FDecalTemplate *decal = DecalLibrary.GetDecalByName (Line2);
if (decal != NULL)
{
info->DecalGenerator = const_cast <FDecalTemplate *>(decal);
if (info) info->DecalGenerator = const_cast <FDecalTemplate *>(decal);
}
else
{
@ -1689,12 +1691,15 @@ static int PatchWeapon (int weapNum)
}
else if (stricmp (Line1, "Ammo use") == 0 || stricmp (Line1, "Ammo per shot") == 0)
{
info->IntVar(NAME_AmmoUse1) = val;
info->flags6 |= MF6_INTRYMOVE; // flag the weapon for postprocessing (reuse a flag that can't be set by external means)
if (info)
{
info->IntVar(NAME_AmmoUse1) = val;
info->flags6 |= MF6_INTRYMOVE; // flag the weapon for postprocessing (reuse a flag that can't be set by external means)
}
}
else if (stricmp (Line1, "Min ammo") == 0)
{
info->IntVar(NAME_MinSelAmmo1) = val;
if (info) info->IntVar(NAME_MinSelAmmo1) = val;
}
else
{
@ -1702,14 +1707,17 @@ static int PatchWeapon (int weapNum)
}
}
if (info->PointerVar<PClassActor>(NAME_AmmoType1) == nullptr)
if (info)
{
info->IntVar(NAME_AmmoUse1) = 0;
}
if (info->PointerVar<PClassActor>(NAME_AmmoType1) == nullptr)
{
info->IntVar(NAME_AmmoUse1) = 0;
}
if (patchedStates)
{
statedef.InstallStates(type, info);
if (patchedStates)
{
statedef.InstallStates(type, info);
}
}
return result;
@ -2121,7 +2129,7 @@ static int PatchCodePtrs (int dummy)
// This skips the action table and goes directly to the internal symbol table
// DEH compatible functions are easy to recognize.
PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->FindSymbol(symname, true));
PFunction *sym = dyn_cast<PFunction>(PClass::FindActor(NAME_Weapon)->FindSymbol(symname, true));
if (sym == NULL)
{
Printf(TEXTCOLOR_RED "Frame %d: Unknown code pointer '%s'\n", frame, Line2);
@ -2728,6 +2736,7 @@ static bool LoadDehSupp ()
sc.OpenLumpNum(lump);
sc.SetCMode(true);
auto wcls = PClass::FindActor(NAME_Weapon);
while (sc.GetString())
{
if (sc.Compare("ActionList"))
@ -2742,11 +2751,11 @@ static bool LoadDehSupp ()
}
else
{
// all relevant code pointers are either defined in AWeapon
// or AActor so this will find all of them.
// all relevant code pointers are either defined in Weapon
// or Actor so this will find all of them.
FString name = "A_";
name << sc.String;
PFunction *sym = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->FindSymbol(name, true));
PFunction *sym = dyn_cast<PFunction>(wcls->FindSymbol(name, true));
if (sym == NULL)
{
sc.ScriptError("Unknown code pointer '%s'", sc.String);
@ -3088,9 +3097,10 @@ void FinishDehPatch ()
// Now it gets nasty: We have to fiddle around with the weapons' ammo use info to make Doom's original
// ammo consumption work as intended.
auto wcls = PClass::FindActor(NAME_Weapon);
for(unsigned i = 0; i < WeaponNames.Size(); i++)
{
AWeapon *weap = (AWeapon*)GetDefaultByType(WeaponNames[i]);
AInventory *weap = (AInventory*)GetDefaultByType(WeaponNames[i]);
bool found = false;
if (weap->flags6 & MF6_INTRYMOVE)
{
@ -3119,7 +3129,7 @@ void FinishDehPatch ()
{
if (AmmoPerAttacks[j].ptr == nullptr)
{
auto p = dyn_cast<PFunction>(RUNTIME_CLASS(AWeapon)->FindSymbol(AmmoPerAttacks[j].func, true));
auto p = dyn_cast<PFunction>(wcls->FindSymbol(AmmoPerAttacks[j].func, true));
if (p != nullptr) AmmoPerAttacks[j].ptr = p->Variants[0].Implementation;
}
if (state->ActionFunc == AmmoPerAttacks[j].ptr)

View file

@ -97,8 +97,8 @@ public:
bool ResetAirSupply (bool playgasp = true);
int GetMaxHealth(bool withupgrades = false) const;
AWeapon *PickNewWeapon (PClassActor *ammotype);
AWeapon *BestWeapon (PClassActor *ammotype);
AInventory *PickNewWeapon (PClassActor *ammotype);
AInventory *BestWeapon (PClassActor *ammotype);
void GiveDeathmatchInventory ();
void GiveDefaultInventory ();
@ -231,7 +231,7 @@ enum
// The VM cannot deal with this as an invalid pointer because it performs a read barrier on every object pointer read.
// This doesn't have to point to a valid weapon, though, because WP_NOCHANGE is never dereferenced, but it must point to a valid object
// and the class descriptor just works fine for that.
extern AWeapon *WP_NOCHANGE;
extern AInventory *WP_NOCHANGE;
#define MAXPLAYERNAME 15
@ -417,8 +417,8 @@ public:
uint8_t spreecount = 0; // [RH] Keep track of killing sprees
uint16_t WeaponState = 0;
AWeapon *ReadyWeapon = nullptr;
AWeapon *PendingWeapon = nullptr; // WP_NOCHANGE if not changing
AInventory *ReadyWeapon = nullptr;
AInventory *PendingWeapon = nullptr; // WP_NOCHANGE if not changing
TObjPtr<DPSprite*> psprites = nullptr; // view sprites (gun, etc)
int cheats = 0; // bit flags
@ -443,7 +443,7 @@ public:
PClassActor *MorphedPlayerClass = nullptr; // [MH] (for SBARINFO) class # for this player instance when morphed
int MorphStyle = 0; // which effects to apply for this player instance when morphed
PClassActor *MorphExitFlash = nullptr; // flash to apply when demorphing (cache of value given to MorphPlayer)
TObjPtr<AWeapon*> PremorphWeapon = nullptr; // ready weapon before morphing
TObjPtr<AInventory*> PremorphWeapon = nullptr; // ready weapon before morphing
int chickenPeck = 0; // chicken peck countdown
int jumpTics = 0; // delay the next jump for a moment
bool onground = 0; // Identifies if this player is on the ground or other object

View file

@ -426,6 +426,8 @@ template<class T> T *dyn_cast(DObject *p)
return NULL;
}
template<class T> const T *dyn_cast(const DObject *p)
{
return dyn_cast<T>(const_cast<DObject *>(p));

View file

@ -75,7 +75,7 @@ bool PClass::bVMOperational;
// that does not work anymore. WP_NOCHANGE needs to point to a vaild object to work as intended.
// This Object does not need to be garbage collected, though, but it needs to provide the proper structure so that the
// GC can process it.
AWeapon *WP_NOCHANGE;
AInventory *WP_NOCHANGE;
DEFINE_GLOBAL(WP_NOCHANGE);
@ -231,7 +231,7 @@ void PClass::StaticInit ()
// WP_NOCHANGE must point to a valid object, although it does not need to be a weapon.
// A simple DObject is enough to give the GC the ability to deal with it, if subjected to it.
WP_NOCHANGE = (AWeapon*)Create<DObject>();
WP_NOCHANGE = (AInventory*)Create<DObject>();
WP_NOCHANGE->Release();
}

View file

@ -2713,7 +2713,7 @@ void FParser::SF_PlayerSelectedWeapon()
return;
}
players[playernum].PendingWeapon = (AWeapon*)players[playernum].mo->FindInventory(ti);
players[playernum].PendingWeapon = (AInventory*)players[playernum].mo->FindInventory(ti);
}
t_return.type = svt_int;

View file

@ -47,45 +47,6 @@
#include "serializer.h"
#include "vm.h"
IMPLEMENT_CLASS(AWeapon, false, true)
IMPLEMENT_POINTERS_START(AWeapon)
IMPLEMENT_POINTER(Ammo1)
IMPLEMENT_POINTER(Ammo2)
IMPLEMENT_POINTER(SisterWeapon)
IMPLEMENT_POINTERS_END
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, SelectionOrder)
DEFINE_FIELD(AWeapon, MinSelAmmo1)
DEFINE_FIELD(AWeapon, MinSelAmmo2)
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(AWeapon, WeaponFlags)
DEFINE_FIELD(AWeapon, bDehAmmo)
//===========================================================================
//
//
@ -101,50 +62,6 @@ TMap<PClassActor *, int> Weapons_hton;
static int ntoh_cmp(const void *a, const void *b);
//===========================================================================
//
// AWeapon :: Serialize
//
//===========================================================================
void AWeapon::Serialize(FSerializer &arc)
{
Super::Serialize (arc);
auto def = (AWeapon*)GetDefault();
arc("weaponflags", WeaponFlags, def->WeaponFlags)
("ammogive1", AmmoGive1, def->AmmoGive1)
("ammogive2", AmmoGive2, def->AmmoGive2)
("minammo1", MinAmmo1, def->MinAmmo1)
("minammo2", MinAmmo2, def->MinAmmo2)
("ammouse1", AmmoUse1, def->AmmoUse1)
("ammouse2", AmmoUse2, def->AmmoUse2)
("kickback", Kickback, Kickback)
("yadjust", YAdjust, def->YAdjust)
("upsound", UpSound, def->UpSound)
("readysound", ReadySound, def->ReadySound)
("selectionorder", SelectionOrder, def->SelectionOrder)
("ammo1", Ammo1)
("ammo2", Ammo2)
("sisterweapon", SisterWeapon)
("givenasmorphweapon", GivenAsMorphWeapon, def->GivenAsMorphWeapon)
("altfire", bAltFire, def->bAltFire)
("reloadcounter", ReloadCounter, def->ReloadCounter)
("bobstyle", BobStyle, def->BobStyle)
("bobspeed", BobSpeed, def->BobSpeed)
("bobrangex", BobRangeX, def->BobRangeX)
("bobrangey", BobRangeY, def->BobRangeY)
("fovscale", FOVScale, def->FOVScale)
("crosshair", Crosshair, def->Crosshair)
("minselammo1", MinSelAmmo1, def->MinSelAmmo1)
("minselammo2", MinSelAmmo2, def->MinSelAmmo2);
/* these can never change
("ammotype1", AmmoType1, def->AmmoType1)
("ammotype2", AmmoType2, def->AmmoType2)
("sisterweapontype", SisterWeaponType, def->SisterWeaponType)
*/
}
/* Weapon slots ***********************************************************/
@ -376,7 +293,7 @@ bool FWeaponSlots::LocateWeapon (PClassActor *type, int *const slot, int *const
DEFINE_ACTION_FUNCTION(FWeaponSlots, LocateWeapon)
{
PARAM_SELF_STRUCT_PROLOGUE(FWeaponSlots);
PARAM_CLASS(weap, AWeapon);
PARAM_CLASS(weap, AInventory);
int slot = 0, index = 0;
bool retv = self->LocateWeapon(weap, &slot, &index);
if (numret >= 1) ret[0].SetInt(retv);
@ -434,10 +351,10 @@ void FWeaponSlots::AddExtraWeapons()
{
continue;
}
auto weapdef = ((AWeapon*)GetDefaultByType(cls));
auto weapdef = ((AInventory*)GetDefaultByType(cls));
// Let the weapon decide for itself if it wants to get added to a slot.
IFVIRTUALPTR(weapdef, AWeapon, CheckAddToSlots)
IFVIRTUALPTRNAME(weapdef, NAME_Weapon, CheckAddToSlots)
{
VMValue param = weapdef;
int slot = -1, slotpriority;

View file

@ -2,7 +2,6 @@
#include "a_pickups.h"
class PClassActor;
class AWeapon;
class APlayerPawn;
class FWeaponSlot
@ -128,40 +127,6 @@ void P_WriteDemoWeaponsChunk(uint8_t **demo);
void P_ReadDemoWeaponsChunk(uint8_t **demo);
class AWeapon : public AStateProvider
{
DECLARE_CLASS(AWeapon, AStateProvider)
HAS_OBJECT_POINTERS
public:
uint32_t WeaponFlags;
PClassActor *AmmoType1, *AmmoType2; // Types of ammo used by this weapon
int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
int MinAmmo1, MinAmmo2; // Minimum ammo needed to switch to this weapon
int AmmoUse1, AmmoUse2; // How much ammo to use with each shot
int Kickback;
double YAdjust; // For viewing the weapon fullscreen (visual only so no need to be a double)
FSoundIDNoInit UpSound, ReadySound; // Sounds when coming up and idle
PClassActor *SisterWeaponType; // Another weapon to pick up with this one
int SelectionOrder; // Lower-numbered weapons get picked first
int MinSelAmmo1, MinSelAmmo2; // Ignore in BestWeapon() if inadequate ammo
int ReloadCounter; // For A_CheckForReload
int BobStyle; // [XA] Bobbing style. Defines type of bobbing (e.g. Normal, Alpha) (visual only so no need to be a double)
float BobSpeed; // [XA] Bobbing speed. Defines how quickly a weapon bobs.
float BobRangeX, BobRangeY; // [XA] Bobbing range. Defines how far a weapon bobs in either direction.
// In-inventory instance variables
TObjPtr<AInventory*> Ammo1, Ammo2;
TObjPtr<AWeapon*> SisterWeapon;
double FOVScale;
int Crosshair; // 0 to use player's crosshair
bool GivenAsMorphWeapon;
bool bAltFire;
bool bDehAmmo;
void Serialize(FSerializer &arc) override;
};
enum class EBobStyle
{
BobNormal,

View file

@ -507,7 +507,7 @@ static int DrawKeys(player_t * CPlayer, int x, int y)
//---------------------------------------------------------------------------
static TArray<PClassActor *> orderedammos;
static void AddAmmoToList(AWeapon * weapdef)
static void AddAmmoToList(AInventory * weapdef)
{
for (int i = 0; i < 2; i++)
@ -570,7 +570,7 @@ static int DrawAmmo(player_t *CPlayer, int x, int y)
char buf[256];
AInventory *inv;
AWeapon *wi=CPlayer->ReadyWeapon;
auto wi=CPlayer->ReadyWeapon;
orderedammos.Clear();
@ -593,7 +593,7 @@ static int DrawAmmo(player_t *CPlayer, int x, int y)
if (hud_showammo > 1 || CPlayer->mo->FindInventory(weap))
{
AddAmmoToList((AWeapon*)GetDefaultByType(weap));
AddAmmoToList((AInventory*)GetDefaultByType(weap));
}
}
}
@ -603,7 +603,7 @@ static int DrawAmmo(player_t *CPlayer, int x, int y)
{
if (inv->IsKindOf(NAME_Weapon))
{
AddAmmoToList((AWeapon*)inv);
AddAmmoToList(inv);
}
}
}
@ -736,7 +736,7 @@ DEFINE_ACTION_FUNCTION(DBaseStatusBar, GetInventoryIcon)
return MIN(numret, 2);
}
static void DrawOneWeapon(player_t * CPlayer, int x, int & y, AWeapon * weapon)
static void DrawOneWeapon(player_t * CPlayer, int x, int & y, AInventory * weapon)
{
double trans;
@ -776,9 +776,9 @@ static void DrawWeapons(player_t *CPlayer, int x, int y)
for(inv = CPlayer->mo->Inventory; inv; inv = inv->Inventory)
{
if (inv->IsKindOf(NAME_Weapon) &&
!CPlayer->weapons.LocateWeapon(static_cast<AWeapon*>(inv)->GetClass(), NULL, NULL))
!CPlayer->weapons.LocateWeapon(inv->GetClass(), NULL, NULL))
{
DrawOneWeapon(CPlayer, x, y, static_cast<AWeapon*>(inv));
DrawOneWeapon(CPlayer, x, y, inv);
}
}
@ -791,7 +791,7 @@ static void DrawWeapons(player_t *CPlayer, int x, int y)
inv=CPlayer->mo->FindInventory(weap);
if (inv)
{
DrawOneWeapon(CPlayer, x, y, static_cast<AWeapon*>(inv));
DrawOneWeapon(CPlayer, x, y, inv);
}
}
}

View file

@ -52,8 +52,6 @@ enum EHudState
HUD_AltHud // Used for passing through popups to the alt hud
};
class AWeapon;
bool ST_IsTimeVisible();
bool ST_IsLatencyVisible();

View file

@ -2882,7 +2882,7 @@ class CommandIsSelected : public SBarInfoNegatableFlowControl
if(weapon[i] == NULL || !weapon[i]->IsDescendantOf(NAME_Weapon))
{
sc.ScriptMessage("'%s' is not a type of weapon.", sc.String);
weapon[i] = RUNTIME_CLASS(AWeapon);
weapon[i] = PClass::FindClass(NAME_Weapon);
}
if(sc.CheckToken(','))
@ -3035,7 +3035,7 @@ class CommandHasWeaponPiece : public SBarInfoCommandFlowControl
if (weapon == NULL || !weapon->IsDescendantOf(NAME_Weapon)) //must be a weapon
{
sc.ScriptMessage("%s is not a kind of weapon.", sc.String);
weapon = RUNTIME_CLASS(AWeapon);
weapon = PClass::FindClass(NAME_Weapon);
}
sc.MustGetToken(',');
sc.MustGetToken(TK_IntConst);

View file

@ -480,7 +480,7 @@ void cht_DoCheat (player_t *player, int cheat)
}
else
{
player->PendingWeapon = static_cast<AWeapon *> (item);
player->PendingWeapon = item;
}
}
}

View file

@ -1874,7 +1874,7 @@ enum SW_Flags
DEFINE_ACTION_FUNCTION(AActor, A_SelectWeapon)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_CLASS(cls, AWeapon);
PARAM_CLASS(cls, AInventory);
PARAM_INT(flags);
bool selectPriority = !!(flags & SWF_SELECTPRIORITY);
@ -1884,7 +1884,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SelectWeapon)
ACTION_RETURN_BOOL(false);
}
AWeapon *weaponitem = static_cast<AWeapon*>(self->FindInventory(cls));
auto weaponitem = self->FindInventory(cls);
if (weaponitem != NULL && weaponitem->IsKindOf(NAME_Weapon))
{

View file

@ -4458,7 +4458,7 @@ DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLin
else
{
// [BB] Disable autoaim on weapons with WIF_NOAUTOAIM.
AWeapon *weapon = t1->player->ReadyWeapon;
auto weapon = t1->player->ReadyWeapon;
if ((weapon && (weapon->IntVar(NAME_WeaponFlags) & WIF_NOAUTOAIM)) && !(flags & ALF_NOWEAPONCHECK))
{
vrange = 0.5;

View file

@ -804,7 +804,7 @@ bool AActor::GiveInventory(PClassActor *type, int amount, bool givecheat)
if (type == nullptr || !type->IsDescendantOf(RUNTIME_CLASS(AInventory))) return false;
AWeapon *savedPendingWeap = player != NULL ? player->PendingWeapon : NULL;
auto savedPendingWeap = player != NULL ? player->PendingWeapon : NULL;
bool hadweap = player != NULL ? player->ReadyWeapon != NULL : true;
AInventory *item;

View file

@ -604,7 +604,7 @@ static void P_CheckWeaponButtons (player_t *player)
{
return;
}
AWeapon *weapon = player->ReadyWeapon;
auto weapon = player->ReadyWeapon;
if (weapon == nullptr)
{
return;
@ -1057,12 +1057,13 @@ void player_t::DestroyPSprites()
//
//------------------------------------------------------------------------------------
void P_SetSafeFlash(AWeapon *weapon, player_t *player, FState *flashstate, int index)
void P_SetSafeFlash(AInventory *weapon, player_t *player, FState *flashstate, int index)
{
auto wcls = PClass::FindActor(NAME_Weapon);
if (flashstate != nullptr)
{
PClassActor *cls = weapon->GetClass();
while (cls != RUNTIME_CLASS(AWeapon))
while (cls != wcls)
{
if (cls->OwnsState(flashstate))
{
@ -1100,7 +1101,7 @@ void P_SetSafeFlash(AWeapon *weapon, player_t *player, FState *flashstate, int i
DEFINE_ACTION_FUNCTION(_PlayerInfo, SetSafeFlash)
{
PARAM_SELF_STRUCT_PROLOGUE(player_t);
PARAM_OBJECT_NOT_NULL(weapon, AWeapon);
PARAM_OBJECT_NOT_NULL(weapon, AInventory);
PARAM_POINTER(state, FState);
PARAM_INT(index);
P_SetSafeFlash(weapon, self, state, index);
@ -1147,8 +1148,8 @@ void DPSprite::OnDestroy()
float DPSprite::GetYAdjust(bool fullscreen)
{
AWeapon *weapon = dyn_cast<AWeapon>(GetCaller());
if (weapon != nullptr)
auto weapon = GetCaller();
if (weapon != nullptr && weapon->IsKindOf(NAME_Weapon))
{
auto fYAd = weapon->FloatVar(NAME_YAdjust);
if (fYAd != 0)

View file

@ -1057,9 +1057,9 @@ bool APlayerPawn::UseInventory (AInventory *item)
//
//===========================================================================
AWeapon *APlayerPawn::PickNewWeapon(PClassActor *ammotype)
AInventory *APlayerPawn::PickNewWeapon(PClassActor *ammotype)
{
AWeapon *best = nullptr;
AInventory *best = nullptr;
IFVM(PlayerPawn, DropWeapon)
{
VMValue param = player->mo;

View file

@ -310,9 +310,10 @@ static void CheckForUnsafeStates(PClassActor *obj)
TMap<FState *, bool> checked;
ENamedName *test;
if (obj->IsDescendantOf(NAME_Weapon))
auto cwtype = PClass::FindActor(NAME_Weapon);
if (obj->IsDescendantOf(cwtype))
{
if (obj->Size == RUNTIME_CLASS(AWeapon)->Size) return; // This class cannot have user variables.
if (obj->Size == cwtype->Size) return; // This class cannot have user variables.
test = weaponstates;
}
else

View file

@ -442,17 +442,6 @@ static FFlagDef InventoryFlagDefs[] =
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),
};
static FFlagDef WeaponFlagDefs[] =
{
// Weapon flags
DEFINE_DUMMY_FLAG(NOLMS, false),
DEFINE_DUMMY_FLAG(ALLOW_WITH_RESPAWN_INVUL, false),
DEFINE_DUMMY_FLAG(BFG, false),
DEFINE_DUMMY_FLAG(EXPLOSIVE, false),
};
static FFlagDef PlayerPawnFlagDefs[] =
{
// PlayerPawn flags
@ -485,7 +474,6 @@ static const struct FFlagList { const PClass * const *Type; FFlagDef *Defs; int
{ &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(ADynamicLight),DynLightFlagDefs, countof(DynLightFlagDefs), 3 },
};
@ -542,8 +530,8 @@ FFlagDef *FindFlag (const PClass *type, const char *part1, const char *part2, bo
{
forInternalFlags.fieldsize = 4;
forInternalFlags.name = "";
forInternalFlags.flagbit = 1 << field->bitval;
forInternalFlags.structoffset = field->Offset->Offset;
forInternalFlags.flagbit = field->bitval >= 0? 1 << field->bitval : DEPF_UNUSED;
forInternalFlags.structoffset = field->bitval >= 0 ? field->Offset->Offset : -1;
forInternalFlags.varflags = 0;
return &forInternalFlags;
}
@ -560,8 +548,8 @@ FFlagDef *FindFlag (const PClass *type, const char *part1, const char *part2, bo
{
forInternalFlags.fieldsize = 4;
forInternalFlags.name = "";
forInternalFlags.flagbit = 1 << field->bitval;
forInternalFlags.structoffset = field->Offset->Offset;
forInternalFlags.flagbit = field->bitval >= 0 ? 1 << field->bitval : DEPF_UNUSED;
forInternalFlags.structoffset = field->bitval >= 0 ? field->Offset->Offset : -1;
forInternalFlags.varflags = 0;
return &forInternalFlags;
}
@ -994,17 +982,6 @@ void InitThingdef()
void SynthesizeFlagFields()
{
// These are needed for inserting the flag symbols
/*
NewClassType(RUNTIME_CLASS(DObject));
NewClassType(RUNTIME_CLASS(DThinker));
NewClassType(RUNTIME_CLASS(AActor));
NewClassType(RUNTIME_CLASS(AInventory));
NewClassType(RUNTIME_CLASS(AStateProvider));
NewClassType(RUNTIME_CLASS(AWeapon));
NewClassType(RUNTIME_CLASS(APlayerPawn));
NewClassType(RUNTIME_CLASS(ADynamicLight));
*/
// synthesize a symbol for each flag from the flag name tables to avoid redundant declaration of them.
for (auto &fl : FlagLists)
{

View file

@ -1179,7 +1179,7 @@ DEFINE_CLASS_PROPERTY(pickupannouncerentry, S, Inventory)
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY(defaultkickback, 0, Weapon)
DEFINE_SCRIPTED_PROPERTY(defaultkickback, 0, Weapon)
{
defaults->IntVar(NAME_Kickback) = gameinfo.defKickback;
}
@ -1187,7 +1187,7 @@ DEFINE_CLASS_PROPERTY(defaultkickback, 0, Weapon)
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY(bobstyle, S, Weapon)
DEFINE_SCRIPTED_PROPERTY(bobstyle, S, Weapon)
{
static const char *names[] = { "Normal", "Inverse", "Alpha", "InverseAlpha", "Smooth", "InverseSmooth", NULL };
static const EBobStyle styles[] = { EBobStyle::BobNormal,
@ -1206,7 +1206,7 @@ DEFINE_CLASS_PROPERTY(bobstyle, S, Weapon)
//==========================================================================
//
//==========================================================================
DEFINE_CLASS_PROPERTY(preferredskin, S, Weapon)
DEFINE_SCRIPTED_PROPERTY(preferredskin, S, Weapon)
{
PROP_STRING_PARM(str, 0);
// NoOp - only for Skulltag compatibility

View file

@ -1498,7 +1498,8 @@ bool ZCCCompiler::CompileFlagDefs(PClass *type, TArray<ZCC_FlagDef *> &Propertie
}
}
type->VMType->AddNativeField(FStringf("b%s", name.GetChars()), TypeSInt32, field->Offset, 0, 1 << p->BitValue);
if (p->BitValue >= 0)
type->VMType->AddNativeField(FStringf("b%s", name.GetChars()), TypeSInt32, field->Offset, 0, 1 << p->BitValue);
}
}
return true;

View file

@ -87,11 +87,11 @@ const char *GetVersionString();
#define SAVEGAME_EXT "zds"
// MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 4551
#define MINSAVEVER 4553
// Use 4500 as the base git save version, since it's higher than the
// SVN revision ever got.
#define SAVEVER 4552
#define SAVEVER 4553
// This is so that derivates can use the same savegame versions without worrying about engine compatibility
#define GAMESIG "GZDOOM"

View file

@ -1,4 +1,4 @@
class Weapon : StateProvider native
class Weapon : StateProvider
{
enum EFireMode
{
@ -10,29 +10,29 @@ class Weapon : StateProvider native
const ZOOM_INSTANT = 1;
const ZOOM_NOSCALETURNING = 2;
deprecated("3.7") native uint WeaponFlags; // not to be used directly.
native class<Ammo> AmmoType1, AmmoType2; // Types of ammo used by self weapon
native int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
deprecated("3.7") native int MinAmmo1, MinAmmo2; // not used anywhere and thus deprecated.
native int AmmoUse1, AmmoUse2; // How much ammo to use with each shot
native int Kickback;
native double YAdjust; // For viewing the weapon fullscreen
native sound UpSound, ReadySound; // Sounds when coming up and idle
native class<Weapon> SisterWeaponType; // Another weapon to pick up with self one
native int SelectionOrder; // Lower-numbered weapons get picked first
native int MinSelAmmo1, MinSelAmmo2; // Ignore in BestWeapon() if inadequate ammo
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 double 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; // Uses Doom's original amount of ammo for the respective attack functions so that old DEHACKED patches work as intended.
// AmmoUse1 will be set to the first attack's ammo use so that checking for empty weapons still works
deprecated("3.7") uint WeaponFlags; // not to be used directly.
class<Ammo> AmmoType1, AmmoType2; // Types of ammo used by self weapon
int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
deprecated("3.7") int MinAmmo1, MinAmmo2; // not used anywhere and thus deprecated.
int AmmoUse1, AmmoUse2; // How much ammo to use with each shot
int Kickback;
double YAdjust; // For viewing the weapon fullscreen
sound UpSound, ReadySound; // Sounds when coming up and idle
class<Weapon> SisterWeaponType; // Another weapon to pick up with self one
int SelectionOrder; // Lower-numbered weapons get picked first
int MinSelAmmo1, MinSelAmmo2; // Ignore in BestWeapon() if inadequate ammo
int ReloadCounter; // For A_CheckForReload
int BobStyle; // [XA] Bobbing style. Defines type of bobbing (e.g. Normal, Alpha) (visual only so no need to be a double)
float BobSpeed; // [XA] Bobbing speed. Defines how quickly a weapon bobs.
float BobRangeX, BobRangeY; // [XA] Bobbing range. Defines how far a weapon bobs in either direction.
Ammo Ammo1, Ammo2; // In-inventory instance variables
Weapon SisterWeapon;
double FOVScale;
int Crosshair; // 0 to use player's crosshair
bool GivenAsMorphWeapon;
bool bAltFire; // Set when this weapon's alternate fire is used.
readonly bool bDehAmmo; // Uses Doom's original amount of ammo for the respective attack functions so that old DEHACKED patches work as intended.
// AmmoUse1 will be set to the first attack's ammo use so that checking for empty weapons still works
meta int SlotNumber;
meta int SlotPriority;
@ -79,6 +79,12 @@ class Weapon : StateProvider native
flagdef NoDeathInput: WeaponFlags, 17; // The weapon cannot be fired/reloaded/whatever when the player is dead
flagdef CheatNotWeapon: WeaponFlags, 18; // Give cheat considers this not a weapon (used by Sigil)
// no-op flags
flagdef NoLMS: WeaponFlags, -1;
flagdef Allow_With_Respawn_Invul: WeaponFlags, -1;
flagdef BFG: WeaponFlags, -1;
flagdef Explosive: WeaponFlags, -1;
Default
{
Inventory.PickupSound "misc/w_pkup";
@ -100,7 +106,7 @@ class Weapon : StateProvider native
//===========================================================================
//
// AWeapon :: MarkPrecacheSounds
// Weapon :: MarkPrecacheSounds
//
//===========================================================================
@ -856,7 +862,7 @@ class Weapon : StateProvider native
//===========================================================================
//
// AWeapon :: CheckAmmo
// Weapon :: CheckAmmo
//
// Returns true if there is enough ammo to shoot. If not, selects the
// next weapon to use.
@ -934,7 +940,7 @@ class Weapon : StateProvider native
//===========================================================================
//
// AWeapon :: DepleteAmmo
// Weapon :: DepleteAmmo
//
// Use up some of the weapon's ammo. Returns true if the ammo was successfully
// depleted. If checkEnough is false, then the ammo will always be depleted,