mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 06:53:58 +00:00
Fixed: clearscope should also clear the inherited scope (through struct member access chain); Fixed: struct member access chain should ONLY work for structs (forgot that FxClassMember inherits FxStructMember)
This commit is contained in:
parent
723f9770a4
commit
c9a994a885
7 changed files with 42 additions and 36 deletions
|
@ -40,6 +40,7 @@ enum
|
||||||
VARF_UI = (1<<20), // [ZZ] ui: object is ui-scope only (can't modify playsim)
|
VARF_UI = (1<<20), // [ZZ] ui: object is ui-scope only (can't modify playsim)
|
||||||
VARF_Play = (1<<21), // [ZZ] play: object is playsim-scope only (can't access ui)
|
VARF_Play = (1<<21), // [ZZ] play: object is playsim-scope only (can't access ui)
|
||||||
VARF_VirtualScope = (1<<22), // [ZZ] virtualscope: object should use the scope of the particular class it's being used with (methods only)
|
VARF_VirtualScope = (1<<22), // [ZZ] virtualscope: object should use the scope of the particular class it's being used with (methods only)
|
||||||
|
VARF_ClearScope = (1<<23), // [ZZ] clearscope: this method ignores the member access chain that leads to it and is always plain data.
|
||||||
};
|
};
|
||||||
|
|
||||||
// An action function -------------------------------------------------------
|
// An action function -------------------------------------------------------
|
||||||
|
|
|
@ -6879,7 +6879,7 @@ FxExpression *FxStructMember::Resolve(FCompileContext &ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
BarrierSide = scopeBarrier.sidelast;
|
BarrierSide = scopeBarrier.sidelast;
|
||||||
if (classx->ExprType == EFX_StructMember) // note: only do this for structs now
|
if (classx->ExprType == EFX_StructMember && ExprType == EFX_StructMember) // note: only do this for structs now
|
||||||
{
|
{
|
||||||
FxStructMember* pmember = (FxStructMember*)classx;
|
FxStructMember* pmember = (FxStructMember*)classx;
|
||||||
if (BarrierSide == FScopeBarrier::Side_PlainData && pmember)
|
if (BarrierSide == FScopeBarrier::Side_PlainData && pmember)
|
||||||
|
@ -8175,12 +8175,15 @@ isresolved:
|
||||||
innerside = FScopeBarrier::SideFromObjectFlags(cls->ObjectFlags);
|
innerside = FScopeBarrier::SideFromObjectFlags(cls->ObjectFlags);
|
||||||
innerflags = FScopeBarrier::FlagsFromSide(innerside);
|
innerflags = FScopeBarrier::FlagsFromSide(innerside);
|
||||||
}
|
}
|
||||||
|
else if (innerside != FScopeBarrier::Side_Clear)
|
||||||
|
{
|
||||||
if (Self->ExprType == EFX_StructMember)
|
if (Self->ExprType == EFX_StructMember)
|
||||||
{
|
{
|
||||||
FxStructMember* pmember = (FxStructMember*)Self;
|
FxStructMember* pmember = (FxStructMember*)Self;
|
||||||
if (innerside == FScopeBarrier::Side_PlainData)
|
if (innerside == FScopeBarrier::Side_PlainData)
|
||||||
innerflags = FScopeBarrier::ChangeSideInFlags(innerflags, pmember->BarrierSide);
|
innerflags = FScopeBarrier::ChangeSideInFlags(innerflags, pmember->BarrierSide);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
FScopeBarrier scopeBarrier(outerflags, innerflags, MethodName.GetChars());
|
FScopeBarrier scopeBarrier(outerflags, innerflags, MethodName.GetChars());
|
||||||
if (!scopeBarrier.callable)
|
if (!scopeBarrier.callable)
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,7 +89,8 @@ struct FScopeBarrier
|
||||||
Side_PlainData = 0,
|
Side_PlainData = 0,
|
||||||
Side_UI = 1,
|
Side_UI = 1,
|
||||||
Side_Play = 2,
|
Side_Play = 2,
|
||||||
Side_Virtual = 3 // do NOT change the value
|
Side_Virtual = 3, // do NOT change the value
|
||||||
|
Side_Clear = 4
|
||||||
};
|
};
|
||||||
int sidefrom;
|
int sidefrom;
|
||||||
int sidelast;
|
int sidelast;
|
||||||
|
@ -103,6 +104,8 @@ struct FScopeBarrier
|
||||||
return Side_Play;
|
return Side_Play;
|
||||||
if (flags & VARF_VirtualScope)
|
if (flags & VARF_VirtualScope)
|
||||||
return Side_Virtual;
|
return Side_Virtual;
|
||||||
|
if (flags & VARF_ClearScope)
|
||||||
|
return Side_Clear;
|
||||||
return Side_PlainData;
|
return Side_PlainData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +130,8 @@ struct FScopeBarrier
|
||||||
return VARF_UI;
|
return VARF_UI;
|
||||||
case Side_Virtual:
|
case Side_Virtual:
|
||||||
return VARF_VirtualScope;
|
return VARF_VirtualScope;
|
||||||
|
case Side_Clear:
|
||||||
|
return VARF_ClearScope;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -144,7 +149,9 @@ struct FScopeBarrier
|
||||||
case Side_Play:
|
case Side_Play:
|
||||||
return "play";
|
return "play";
|
||||||
case Side_Virtual:
|
case Side_Virtual:
|
||||||
return "virtual"; // should not happen!
|
return "virtualscope"; // should not happen!
|
||||||
|
case Side_Clear:
|
||||||
|
return "clearscope"; // should not happen!
|
||||||
default:
|
default:
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
@ -153,7 +160,7 @@ struct FScopeBarrier
|
||||||
// this modifies VARF_ flags and sets the side properly.
|
// this modifies VARF_ flags and sets the side properly.
|
||||||
static int ChangeSideInFlags(int flags, int side)
|
static int ChangeSideInFlags(int flags, int side)
|
||||||
{
|
{
|
||||||
flags &= ~(VARF_UI | VARF_Play | VARF_VirtualScope);
|
flags &= ~(VARF_UI | VARF_Play | VARF_VirtualScope | VARF_ClearScope);
|
||||||
flags |= FlagsFromSide(side);
|
flags |= FlagsFromSide(side);
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2135,7 +2135,7 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
|
||||||
if (f->Flags & ZCC_Play)
|
if (f->Flags & ZCC_Play)
|
||||||
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_Play);
|
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_Play);
|
||||||
if (f->Flags & ZCC_ClearScope)
|
if (f->Flags & ZCC_ClearScope)
|
||||||
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_PlainData);
|
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_Clear);
|
||||||
if (f->Flags & ZCC_VirtualScope)
|
if (f->Flags & ZCC_VirtualScope)
|
||||||
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_Virtual);
|
varflags = FScopeBarrier::ChangeSideInFlags(varflags, FScopeBarrier::Side_Virtual);
|
||||||
|
|
||||||
|
@ -2405,12 +2405,7 @@ void ZCCCompiler::CompileFunction(ZCC_StructWork *c, ZCC_FuncDeclarator *f, bool
|
||||||
if (sym->Variants[0].Implementation != nullptr)
|
if (sym->Variants[0].Implementation != nullptr)
|
||||||
{
|
{
|
||||||
// [ZZ] unspecified virtual function inherits old scope. virtual function scope can't be changed.
|
// [ZZ] unspecified virtual function inherits old scope. virtual function scope can't be changed.
|
||||||
if (varflags & VARF_UI)
|
sym->Variants[0].Implementation->BarrierSide = FScopeBarrier::SideFromFlags(varflags);
|
||||||
sym->Variants[0].Implementation->BarrierSide = FScopeBarrier::Side_UI;
|
|
||||||
if (varflags & VARF_Play)
|
|
||||||
sym->Variants[0].Implementation->BarrierSide = FScopeBarrier::Side_Play;
|
|
||||||
if (varflags & VARF_VirtualScope)
|
|
||||||
sym->Variants[0].Implementation->BarrierSide = FScopeBarrier::Side_Virtual;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PClass *clstype = static_cast<PClass *>(c->Type());
|
PClass *clstype = static_cast<PClass *>(c->Type());
|
||||||
|
|
|
@ -425,7 +425,7 @@ class Actor : Thinker native
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual String GetObituary(Actor victim, Actor inflictor, Name mod, bool playerattack)
|
clearscope virtual String GetObituary(Actor victim, Actor inflictor, Name mod, bool playerattack)
|
||||||
{
|
{
|
||||||
if (mod == 'Telefrag')
|
if (mod == 'Telefrag')
|
||||||
{
|
{
|
||||||
|
@ -450,13 +450,13 @@ class Actor : Thinker native
|
||||||
native static int FindUniqueTid(int start = 0, int limit = 0);
|
native static int FindUniqueTid(int start = 0, int limit = 0);
|
||||||
native void SetShade(color col);
|
native void SetShade(color col);
|
||||||
|
|
||||||
native string GetTag(string defstr = "");
|
clearscope native string GetTag(string defstr = "");
|
||||||
native void SetTag(string defstr = "");
|
native void SetTag(string defstr = "");
|
||||||
native double GetBobOffset(double frac = 0);
|
native double GetBobOffset(double frac = 0);
|
||||||
native void ClearCounters();
|
native void ClearCounters();
|
||||||
native bool GiveBody (int num, int max=0);
|
native bool GiveBody (int num, int max=0);
|
||||||
native bool HitFloor();
|
native bool HitFloor();
|
||||||
native bool isTeammate(Actor other);
|
clearscope native bool isTeammate(Actor other);
|
||||||
native int PlayerNumber();
|
native int PlayerNumber();
|
||||||
native void SetFriendPlayer(PlayerInfo player);
|
native void SetFriendPlayer(PlayerInfo player);
|
||||||
native void SoundAlert(Actor target, bool splash = false, double maxdist = 0);
|
native void SoundAlert(Actor target, bool splash = false, double maxdist = 0);
|
||||||
|
@ -597,7 +597,7 @@ class Actor : Thinker native
|
||||||
native void ClearInventory();
|
native void ClearInventory();
|
||||||
native bool GiveInventory(class<Inventory> type, int amount, bool givecheat = false);
|
native bool GiveInventory(class<Inventory> type, int amount, bool givecheat = false);
|
||||||
native bool TakeInventory(class<Inventory> itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
native bool TakeInventory(class<Inventory> itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
||||||
native Inventory FindInventory(class<Inventory> itemtype, bool subclass = false);
|
clearscope native Inventory FindInventory(class<Inventory> itemtype, bool subclass = false);
|
||||||
native Inventory GiveInventoryType(class<Inventory> itemtype);
|
native Inventory GiveInventoryType(class<Inventory> itemtype);
|
||||||
native Inventory DropInventory (Inventory item, int amt = -1);
|
native Inventory DropInventory (Inventory item, int amt = -1);
|
||||||
native bool UseInventory(Inventory item);
|
native bool UseInventory(Inventory item);
|
||||||
|
|
|
@ -287,7 +287,7 @@ class Menu : Object native ui
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MenuDescriptor : Object native
|
class MenuDescriptor : Object native ui
|
||||||
{
|
{
|
||||||
native Name mMenuName;
|
native Name mMenuName;
|
||||||
native String mNetgameMessage;
|
native String mNetgameMessage;
|
||||||
|
|
|
@ -150,7 +150,7 @@ class PlayerPawn : Actor native
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is for SBARINFO.
|
// This is for SBARINFO.
|
||||||
int, int GetEffectTicsForItem(class<Inventory> item)
|
clearscope int, int GetEffectTicsForItem(class<Inventory> item)
|
||||||
{
|
{
|
||||||
let pg = (class<PowerupGiver>)(item);
|
let pg = (class<PowerupGiver>)(item);
|
||||||
if (pg != null)
|
if (pg != null)
|
||||||
|
@ -167,10 +167,10 @@ class PlayerPawn : Actor native
|
||||||
return -1, -1;
|
return -1, -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
native int GetMaxHealth(bool withupgrades = false);
|
clearscope native int GetMaxHealth(bool withupgrades = false);
|
||||||
native bool ResetAirSupply (bool playgasp = false);
|
native bool ResetAirSupply (bool playgasp = false);
|
||||||
native void CheckWeaponSwitch(class<Inventory> item);
|
native void CheckWeaponSwitch(class<Inventory> item);
|
||||||
native static String GetPrintableDisplayName(Class<Actor> cls);
|
clearscope native static String GetPrintableDisplayName(Class<Actor> cls);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ class PlayerChunk : PlayerPawn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class PSprite : Object native
|
class PSprite : Object native play
|
||||||
{
|
{
|
||||||
enum PSPLayers
|
enum PSPLayers
|
||||||
{
|
{
|
||||||
|
@ -237,7 +237,7 @@ enum EPlayerState
|
||||||
PST_GONE // Player has left the game
|
PST_GONE // Player has left the game
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PlayerInfo native // this is what internally is known as player_t
|
struct PlayerInfo native play // this is what internally is known as player_t
|
||||||
{
|
{
|
||||||
// technically engine constants but the only part of the playsim using them is the player.
|
// technically engine constants but the only part of the playsim using them is the player.
|
||||||
const NOFIXEDCOLORMAP = -1;
|
const NOFIXEDCOLORMAP = -1;
|
||||||
|
@ -338,22 +338,22 @@ usercmd_t original_cmd;
|
||||||
native void PoisonDamage(Actor source, int damage, bool playPainSound);
|
native void PoisonDamage(Actor source, int damage, bool playPainSound);
|
||||||
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) const;
|
||||||
native PSprite FindPSprite(int id);
|
native PSprite FindPSprite(int id) const;
|
||||||
native void SetLogNumber (int text);
|
native void SetLogNumber (int text);
|
||||||
native void SetLogText (String text);
|
native void SetLogText (String text);
|
||||||
native void DropWeapon();
|
native void DropWeapon();
|
||||||
native void BringUpWeapon();
|
native void BringUpWeapon();
|
||||||
|
|
||||||
native String GetUserName();
|
native String GetUserName() const;
|
||||||
native Color GetColor();
|
native Color GetColor() const;
|
||||||
native int GetColorSet();
|
native int GetColorSet() const;
|
||||||
native int GetPlayerClassNum();
|
native int GetPlayerClassNum() const;
|
||||||
native int GetSkin();
|
native int GetSkin() const;
|
||||||
native bool GetNeverSwitch();
|
native bool GetNeverSwitch() const;
|
||||||
native int GetGender();
|
native int GetGender() const;
|
||||||
native int GetTeam();
|
native int GetTeam() const;
|
||||||
native float GetAutoaim();
|
native float GetAutoaim() const;
|
||||||
native void SetFOV(float fov);
|
native void SetFOV(float fov);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue