OpenClonk
C4Effect Class Reference

#include <C4Effect.h>

Inheritance diagram for C4Effect:
[legend]
Collaboration diagram for C4Effect:
[legend]

Public Member Functions

 ~C4Effect () override
 
void Register (C4Effect **ppEffectList, int32_t iPrio)
 
void Denumerate (C4ValueNumbers *) override
 
void ClearPointers (C4PropList *pObj)
 
void SetDead ()
 
bool IsDead ()
 
void FlipActive ()
 
bool IsActive ()
 
bool IsInactiveAndNotDead ()
 
C4Effect * Get (const char *szName, int32_t iIndex=0, int32_t iMaxPriority=0)
 
int32_t GetCount (const char *szMask, int32_t iMaxPriority=0)
 
C4Effect * Check (const char *szCheckEffect, int32_t iPrio, int32_t iTimer, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
 
C4PropList * GetCallbackScript ()
 
void Kill ()
 
void ClearAll (int32_t iClearFlag)
 
void DoDamage (int32_t &riDamage, int32_t iDamageType, int32_t iCausePlr)
 
C4Value DoCall (C4PropList *pObj, const char *szFn, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4, const C4Value &rVal5, const C4Value &rVal6, const C4Value &rVal7)
 
void ReAssignCallbackFunctions ()
 
void ReAssignAllCallbackFunctions ()
 
void OnObjectChangedDef (C4PropList *pObj)
 
void CompileFunc (StdCompiler *pComp, C4PropList *Owner, C4ValueNumbers *)
 
C4Effect * GetEffect () override
 
void SetPropertyByS (C4String *k, const C4Value &to) override
 
void ResetProperty (C4String *k) override
 
bool GetPropertyByS (const C4String *k, C4Value *pResult) const override
 
C4ValueArray * GetProperties () const override
 
void CompileFunc (StdCompiler *pComp, C4ValueNumbers *numbers)
 
C4PropListNumbered * GetPropListNumbered () override
 
bool IsNumbered () const override
 
void Clear ()
 
virtual const char * GetName () const
 
virtual void SetName (const char *NewName=nullptr)
 
virtual void SetOnFire (bool OnFire)
 
virtual C4Def const * GetDef () const
 
virtual C4Def * GetDef ()
 
virtual C4Object * GetObject ()
 
virtual C4Object const * GetObject () const
 
virtual class C4MapScriptLayer * GetMapScriptLayer ()
 
virtual class C4MapScriptMap * GetMapScriptMap ()
 
C4PropList * GetPrototype () const
 
void RemoveCyclicPrototypes ()
 
virtual class C4PropListStatic * IsStatic ()
 
const class C4PropListStatic * IsStatic () const
 
virtual bool Delete ()
 
bool GetProperty (C4PropertyName k, C4Value *pResult) const
 
C4String * GetPropertyStr (C4PropertyName k) const
 
C4ValueArray * GetPropertyArray (C4PropertyName n) const
 
C4AulFunc * GetFunc (C4PropertyName k) const
 
C4AulFunc * GetFunc (C4String *k) const
 
C4AulFunc * GetFunc (const char *k) const
 
C4String * EnumerateOwnFuncs (C4String *prev=nullptr) const
 
C4Value Call (C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
 
C4Value Call (C4String *k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
 
C4Value Call (const char *k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
 
C4PropertyName GetPropertyP (C4PropertyName k) const
 
int32_t GetPropertyBool (C4PropertyName n, bool default_val=false) const
 
int32_t GetPropertyInt (C4PropertyName k, int32_t default_val=0) const
 
C4PropList * GetPropertyPropList (C4PropertyName k) const
 
bool HasProperty (C4String *k) const
 
void SetProperty (C4PropertyName k, const C4Value &to)
 
void Freeze ()
 
void Thaw ()
 
void ThawRecursively ()
 
bool IsFrozen () const
 
C4PropListStatic * FreezeAndMakeStaticRecursively (std::vector< C4Value > *prop_lists, const C4PropListStatic *parent=nullptr, C4String *key=nullptr)
 
void AppendDataString (StdStrBuf *out, const char *delim, int depth=3, bool ignore_reference_parent=false) const
 
StdStrBuf ToJSON (int depth=10, bool ignore_reference_parent=false) const
 
std::vector< C4String * > GetSortedLocalProperties (bool add_prototype=true) const
 
std::vector< C4String * > GetSortedLocalProperties (const char *prefix, const C4PropList *ignore_overridden) const
 
std::vector< C4String * > GetUnsortedProperties (const char *prefix, C4PropList *ignore_parent=nullptr) const
 
std::vector< C4String * > GetSortedProperties (const char *prefix, C4PropList *ignore_parent=nullptr) const
 
bool operator== (const C4PropList &b) const
 
Iterator begin ()
 
Iterator end ()
 

Static Public Member Functions

static C4Effect * New (C4PropList *pForObj, C4Effect **ppEffectList, C4String *szName, int32_t iPrio, int32_t iTimerInterval, C4PropList *pCmdTarget, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
 
static C4Effect * New (C4PropList *pForObj, C4Effect **ppEffectList, C4PropList *prototype, int32_t iPrio, int32_t iTimerInterval, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
 
static void Execute (C4Effect **ppEffectList)
 
static C4PropList * GetByNumber (int32_t iNumber)
 
static bool CheckPropList (C4PropList *)
 
static void SetEnumerationIndex (int32_t iMaxObjectNumber)
 
static int32_t GetEnumerationIndex ()
 
static void ResetEnumerationIndex ()
 
static void ShelveNumberedPropLists ()
 
static void UnshelveNumberedPropLists ()
 
static void ClearShelve ()
 
static void ClearNumberedPropLists ()
 
static C4PropList * New (C4PropList *prototype=nullptr)
 
static C4PropListStatic * NewStatic (C4PropList *prototype, const C4PropListStatic *parent, C4String *key)
 

Public Attributes

int32_t iPriority
 
int32_t iTime
 
int32_t iInterval
 
C4Effect * pNext
 
int32_t Number {-1}
 
int32_t Status {1}
 

Protected Member Functions

void AssignCallbackFunctions ()
 
int CallStart (int temporary, const C4Value &var1, const C4Value &var2, const C4Value &var3, const C4Value &var4)
 
int CallStop (int reason, bool temporary)
 
int CallTimer (int time)
 
void CallDamage (int32_t &damage, int damagetype, int plr)
 
int CallEffect (const char *effect, const C4Value &var1, const C4Value &var2, const C4Value &var3, const C4Value &var4)
 
 C4Effect (C4Effect **ppEffectList, C4String *szName, int32_t iPrio, int32_t iTimerInterval, C4PropList *pCmdTarget)
 
 C4Effect (C4Effect **ppEffectList, C4PropList *prototype, int32_t iPrio, int32_t iTimerInterval)
 
 C4Effect (const C4Effect &)=delete
 
 C4Effect ()
 
C4Effect * Init (C4PropList *pForObj, int32_t iPrio, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
 
void TempRemoveUpperEffects (bool fTempRemoveThis, C4Effect **ppLastRemovedEffect)
 
void TempReaddUpperEffects (C4Effect *pLastReaddEffect)
 
void AcquireNumber ()
 
void ClearNumber ()
 
void ClearRefs ()
 

Protected Attributes

C4Value CommandTarget
 
C4PropList * Target
 
C4AulFunc * pFnTimer
 
C4AulFunc * pFnStart
 
C4AulFunc * pFnStop
 
C4AulFunc * pFnEffect
 
C4AulFunc * pFnDamage
 

Static Protected Attributes

static C4Set< C4PropListNumbered * > PropLists
 
static std::vector< C4PropListNumbered * > ShelvedPropLists
 
static int32_t EnumerationIndex = 0
 

Friends

template<class T , typename ... P>
void CompileNewFunc (T *&, StdCompiler *, P &&...)
 

Detailed Description

Definition at line 69 of file C4Effect.h.

Constructor & Destructor Documentation

◆ C4Effect() [1/4]

C4Effect::C4Effect ( C4Effect **  ppEffectList,
C4String *  szName,
int32_t  iPrio,
int32_t  iTimerInterval,
C4PropList *  pCmdTarget 
)
protected

Definition at line 45 of file C4Effect.cpp.

46 {
47  // assign values
48  iPriority = 0; // effect is not yet valid; some callbacks to other effects are done before
49  iInterval = iTimerInterval;
50  iTime = 0;
51  CommandTarget.SetPropList(pCmdTarget);
52  AcquireNumber();
53  Register(ppEffectList, iPrio);
54  // Set name and callback functions
55  SetProperty(P_Name, C4VString(szName));
56 }
@ P_Name
C4Value C4VString(C4String *pStr)
Definition: C4Value.h:243
int32_t iPriority
Definition: C4Effect.h:72
void Register(C4Effect **ppEffectList, int32_t iPrio)
Definition: C4Effect.cpp:71
int32_t iTime
Definition: C4Effect.h:73
int32_t iInterval
Definition: C4Effect.h:73
C4Value CommandTarget
Definition: C4Effect.h:78
void SetProperty(C4PropertyName k, const C4Value &to)
Definition: C4PropList.h:124
void SetPropList(C4PropList *PropList)
Definition: C4Value.h:141

References C4PropListNumbered::AcquireNumber(), C4VString(), CommandTarget, iInterval, iPriority, iTime, P_Name, Register(), C4PropList::SetProperty(), and C4Value::SetPropList().

Here is the call graph for this function:

◆ C4Effect() [2/4]

C4Effect::C4Effect ( C4Effect **  ppEffectList,
C4PropList *  prototype,
int32_t  iPrio,
int32_t  iTimerInterval 
)
protected

Definition at line 58 of file C4Effect.cpp.

58  :
59  C4PropListNumbered(prototype)
60 {
61  // assign values
62  iPriority = 0; // effect is not yet valid; some callbacks to other effects are done before
63  iInterval = iTimerInterval;
64  iTime = 0;
66  AcquireNumber();
67  Register(ppEffectList, iPrio);
68  SetProperty(P_Name, C4VString(prototype->GetName()));
69 }
virtual const char * GetName() const
Definition: C4PropList.cpp:618
C4PropListNumbered(C4PropList *prototype=nullptr)
Definition: C4PropList.cpp:127
void Set0()
Definition: C4Value.h:332

References C4PropListNumbered::AcquireNumber(), C4VString(), CommandTarget, C4PropList::GetName(), iInterval, iPriority, iTime, P_Name, Register(), C4Value::Set0(), and C4PropList::SetProperty().

Here is the call graph for this function:

◆ C4Effect() [3/4]

C4Effect::C4Effect ( const C4Effect &  )
protecteddelete

◆ C4Effect() [4/4]

C4Effect::C4Effect ( )
protected

Definition at line 156 of file C4Effect.cpp.

157 {
158  // defaults
161  pNext = nullptr;
162 }
C4Effect * pNext
Definition: C4Effect.h:75

References CommandTarget, iInterval, iPriority, iTime, pNext, and C4Value::Set0().

Referenced by New().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ~C4Effect()

C4Effect::~C4Effect ( )
override

Definition at line 164 of file C4Effect.cpp.

165 {
166  // del following effects (not recursively)
167  C4Effect *pEffect;
168  while ((pEffect = pNext))
169  {
170  pNext = pEffect->pNext;
171  pEffect->pNext = nullptr;
172  delete pEffect;
173  }
174 }

References pNext.

Member Function Documentation

◆ AcquireNumber()

void C4PropListNumbered::AcquireNumber ( )
protectedinherited

Definition at line 131 of file C4PropList.cpp.

132 {
133  // Enumerate object
134  do
136  while (PropLists.Get(Number));
137  // Add to list
138  PropLists.Add(this);
139 }
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:241
static int32_t EnumerationIndex
Definition: C4PropList.h:243
T & Get(H e) const
T * Add(T const &e)

References C4Set< T >::Add(), C4PropListNumbered::EnumerationIndex, C4Set< T >::Get(), C4PropListNumbered::Number, and C4PropListNumbered::PropLists.

Referenced by C4Effect(), C4MapScriptLayer::C4MapScriptLayer(), and C4Object::Init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AppendDataString()

void C4PropList::AppendDataString ( StdStrBuf *  out,
const char *  delim,
int  depth = 3,
bool  ignore_reference_parent = false 
) const
inherited

Definition at line 487 of file C4PropList.cpp.

488 {
489  StdStrBuf & DataString = *out;
490  if (depth <= 0 && Properties.GetSize())
491  {
492  DataString.Append("...");
493  return;
494  }
495  bool has_elements = false;
496  // Append prototype
497  if (prototype)
498  {
499  DataString.Append("Prototype = ");
500  DataString.Append(prototype.GetDataString(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
501  has_elements = true;
502  }
503  // Append other properties
504  std::list<const C4Property *> sorted_props = Properties.GetSortedListOfElementPointers();
505  for (std::list<const C4Property *>::const_iterator p = sorted_props.begin(); p != sorted_props.end(); ++p)
506  {
507  if (has_elements) DataString.Append(delim);
508  DataString.Append((*p)->Key->GetData());
509  DataString.Append(" = ");
510  DataString.Append((*p)->Value.GetDataString(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
511  has_elements = true;
512  }
513 }
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:89
std::list< const T * > GetSortedListOfElementPointers() const
unsigned int GetSize() const
StdStrBuf GetDataString(int depth=10, const class C4PropListStatic *ignore_reference_parent=nullptr) const
Definition: C4Value.cpp:131
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:519

References StdStrBuf::Append(), C4PropList::begin(), C4PropList::end(), C4Value::GetDataString(), C4Set< T >::GetSize(), C4Set< T >::GetSortedListOfElementPointers(), and C4PropList::IsStatic().

Referenced by C4Object::GetDataString().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AssignCallbackFunctions()

void C4Effect::AssignCallbackFunctions ( )
protected

Definition at line 27 of file C4Effect.cpp.

28 {
30  if (!p) return;
31  // compose function names and search them
32  char fn[C4AUL_MAX_Identifier+1];
33  sprintf(fn, PSF_FxStart, GetName()); pFnStart = p->GetFunc(fn);
34  sprintf(fn, PSF_FxStop, GetName()); pFnStop = p->GetFunc(fn);
35  sprintf(fn, PSF_FxTimer, GetName()); pFnTimer = p->GetFunc(fn);
36  sprintf(fn, PSF_FxEffect, GetName()); pFnEffect = p->GetFunc(fn);
37  sprintf(fn, PSF_FxDamage, GetName()); pFnDamage = p->GetFunc(fn);
38 }
#define C4AUL_MAX_Identifier
Definition: C4Aul.h:26
#define PSF_FxEffect
Definition: C4GameScript.h:112
#define PSF_FxStart
Definition: C4GameScript.h:109
#define PSF_FxTimer
Definition: C4GameScript.h:111
#define PSF_FxDamage
Definition: C4GameScript.h:113
#define PSF_FxStop
Definition: C4GameScript.h:110
#define sprintf
Definition: Standard.h:162
C4AulFunc * pFnTimer
Definition: C4Effect.h:81
C4PropList * GetCallbackScript()
Definition: C4Effect.cpp:40
C4AulFunc * pFnStart
Definition: C4Effect.h:82
C4AulFunc * pFnDamage
Definition: C4Effect.h:84
C4AulFunc * pFnStop
Definition: C4Effect.h:82
C4AulFunc * pFnEffect
Definition: C4Effect.h:83
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:109

References C4AUL_MAX_Identifier, GetCallbackScript(), C4PropList::GetFunc(), C4PropList::GetName(), pFnDamage, pFnEffect, pFnStart, pFnStop, pFnTimer, PSF_FxDamage, PSF_FxEffect, PSF_FxStart, PSF_FxStop, PSF_FxTimer, and sprintf.

Referenced by Denumerate(), and ReAssignCallbackFunctions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ begin()

C4PropList::Iterator C4PropList::begin ( )
inherited

Definition at line 995 of file C4PropList.cpp.

996 {
998 
999  if (GetPrototype())
1000  {
1001  iter = GetPrototype()->begin();
1002  }
1003  else
1004  {
1005  iter.properties = std::make_shared<std::vector<const C4Property*> >();
1006  }
1007  iter.Reserve(Properties.GetSize());
1008 
1009  const C4Property * p = Properties.First();
1010  while (p)
1011  {
1012  iter.AddProperty(p);
1013  p = Properties.Next(p);
1014  }
1015 
1016  iter.Init();
1017  return iter;
1018 }
C4PropList * GetPrototype() const
Definition: C4PropList.h:85
Iterator begin()
Definition: C4PropList.cpp:995
T const * Next(T const *p) const
T const * First() const

References C4PropList::begin(), C4Set< T >::First(), C4PropList::GetPrototype(), C4Set< T >::GetSize(), and C4Set< T >::Next().

Referenced by C4PropList::AppendDataString(), C4PropList::begin(), C4ParticleProperties::Set(), and C4PropList::ToJSON().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Call() [1/3]

C4Value C4PropList::Call ( C4PropertyName  k,
C4AulParSet *  pPars = nullptr,
bool  fPassErrors = false 
)
inlineinherited

Definition at line 114 of file C4PropList.h.

115  { return Call(&Strings.P[k], pPars, fPassErrors); }
C4StringTable Strings
Definition: C4Globals.cpp:42
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:114
C4String P[P_LAST]

References C4StringTable::P, and Strings.

Referenced by C4Command::Acquire(), C4Object::ActivateEntrance(), C4Object::ActivateMenu(), C4Object::AssignDeath(), C4Object::AssignRemoval(), C4Command::Call(), C4GameScriptHost::Call(), CallEffect(), C4Command::CallFailed(), CallStart(), CallStop(), CallTimer(), C4FindObjectFunc::Check(), ClearAll(), C4Object::Collect(), C4SortObjectFunc::CompareGetValue(), C4Object::Contact(), C4GameObjects::CrossCheck(), C4Landscape::P::DigMaterial2Objects(), C4Object::DirectComContents(), C4Object::DoBreath(), C4Object::DoCon(), C4Object::DoDamage(), C4Object::DoEnergy(), C4Object::DoMovement(), C4ObjectMenu::DoRefillInternal(), C4Object::DoSelect(), C4Object::Enter(), C4RoundResults::EvaluateGame(), C4RoundResults::EvaluateGoals(), C4Object::ExecLife(), C4Object::ExecuteCommand(), C4ScriptGuiWindowAction::ExecuteCommand(), C4Object::Exit(), C4Command::Fail(), C4Command::GetTryEnter(), C4Def::GetValue(), C4Object::GetValue(), GrabLost(), C4Landscape::Incinerate(), Init(), C4Player::Init(), C4ObjectMenu::IsCloseDenied(), Kill(), C4Object::Lift(), C4Game::NewObject(), ObjectActionJump(), ObjectComGrab(), ObjectComPunch(), ObjectComPut(), ObjectComUnGrab(), C4ObjectMenu::OnSelectionChanged(), C4EditCursor::PerformDuplication(), C4EditCursor::PerformDuplicationLegacy(), C4Landscape::P::PostFreeShape(), C4Object::Promote(), C4Object::Push(), C4Game::SaveData(), C4Object::SetAction(), C4GUI::FrameDecoration::SetByDef(), C4Object::SetCommand(), C4Player::SetObjectCrewStatus(), C4Object::SetOwner(), C4Object::StatusActivate(), C4Command::Transfer(), and C4Object::UnSelect().

Here is the caller graph for this function:

◆ Call() [2/3]

C4Value C4PropList::Call ( C4String *  k,
C4AulParSet *  pPars = nullptr,
bool  fPassErrors = false 
)
inherited

Definition at line 797 of file C4PropList.cpp.

798 {
799  if (!Status) return C4Value();
800  C4AulFunc *pFn = GetFunc(k);
801  if (!pFn) return C4Value();
802  return pFn->Exec(this, Pars, fPassErrors);
803 }
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:72
int32_t Status
Definition: C4PropList.h:173
friend class C4Value
Definition: C4PropList.h:170

References C4PropList::C4Value, C4AulFunc::Exec(), C4PropList::GetFunc(), and C4PropList::Status.

Here is the call graph for this function:

◆ Call() [3/3]

C4Value C4PropList::Call ( const char *  k,
C4AulParSet *  pPars = nullptr,
bool  fPassErrors = false 
)
inherited

Definition at line 805 of file C4PropList.cpp.

806 {
807  if (!Status) return C4Value();
808  assert(s && s[0]);
809  C4AulFunc *pFn = GetFunc(s);
810  if (!pFn)
811  {
812  if (s[0] != '~')
813  {
814  C4AulExecError err(FormatString("Undefined function: %s", s).getData());
815  if (fPassErrors)
816  throw err;
817  ::ScriptEngine.GetErrorHandler()->OnError(err.what());
818  }
819  return C4Value();
820  }
821  return pFn->Exec(this, Pars, fPassErrors);
822 }
#define s
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
virtual void OnError(const char *msg)=0
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:173

References C4PropList::C4Value, C4AulFunc::Exec(), FormatString(), C4AulScriptEngine::GetErrorHandler(), C4PropList::GetFunc(), C4AulErrorHandler::OnError(), s, ScriptEngine, C4PropList::Status, and C4AulError::what().

Here is the call graph for this function:

◆ CallDamage()

void C4Effect::CallDamage ( int32_t &  damage,
int  damagetype,
int  plr 
)
protected

Definition at line 462 of file C4Effect.cpp.

463 {
464  if (!GetCallbackScript())
465  {
466  C4AulFunc *pFn = GetFunc(P_Damage);
467  if (pFn)
468  damage = pFn->Exec(this, &C4AulParSet(damage, damagetype, plr)).getInt();
469  }
470  else if (pFnDamage)
471  damage = pFnDamage->Exec(GetCallbackScript(), &C4AulParSet(Obj(Target), this, damage, damagetype, plr)).getInt();
472 }
@ P_Damage
C4PropList * Target
Definition: C4Effect.h:79
int32_t getInt() const
Definition: C4Value.h:112

References C4AulFunc::Exec(), GetCallbackScript(), C4PropList::GetFunc(), C4Value::getInt(), P_Damage, and pFnDamage.

Referenced by DoDamage().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CallEffect()

int C4Effect::CallEffect ( const char *  effect,
const C4Value &  var1,
const C4Value &  var2,
const C4Value &  var3,
const C4Value &  var4 
)
protected

Definition at line 473 of file C4Effect.cpp.

474 {
475  if (!GetCallbackScript())
476  return Call(P_Effect, &C4AulParSet(effect, var1, var2, var3, var4)).getInt();
477  if (pFnEffect)
478  return pFnEffect->Exec(GetCallbackScript(), &C4AulParSet(effect, Obj(Target), this, var1, var2, var3, var4)).getInt();
479  return C4Fx_OK;
480 }
#define C4Fx_OK
Definition: C4Effect.h:30
@ P_Effect

References C4PropList::Call(), C4AulFunc::Exec(), GetCallbackScript(), C4Value::getInt(), P_Effect, and pFnEffect.

Here is the call graph for this function:

◆ CallStart()

int C4Effect::CallStart ( int  temporary,
const C4Value &  var1,
const C4Value &  var2,
const C4Value &  var3,
const C4Value &  var4 
)
protected

Definition at line 427 of file C4Effect.cpp.

428 {
429  if (!GetCallbackScript())
430  return Call(P_Start, &C4AulParSet(temporary, var1, var2, var3, var4)).getInt();
431  if (pFnStart)
432  return pFnStart->Exec(GetCallbackScript(), &C4AulParSet(Obj(Target), this, temporary, var1, var2, var3, var4)).getInt();
433  return C4Fx_OK;
434 }
@ P_Start

References C4PropList::Call(), C4AulFunc::Exec(), GetCallbackScript(), C4Value::getInt(), P_Start, and pFnStart.

Referenced by Init(), and Kill().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CallStop()

int C4Effect::CallStop ( int  reason,
bool  temporary 
)
protected

Definition at line 435 of file C4Effect.cpp.

436 {
437  if (!GetCallbackScript())
438  return Call(P_Stop, &C4AulParSet(reason, temporary)).getInt();
439  if (pFnStop)
440  return pFnStop->Exec(GetCallbackScript(), &C4AulParSet(Obj(Target), this, reason, temporary)).getInt();
441  return C4Fx_OK;
442 }
@ P_Stop

References C4PropList::Call(), C4AulFunc::Exec(), GetCallbackScript(), C4Value::getInt(), P_Stop, and pFnStop.

Referenced by ClearAll(), Kill(), and TempRemoveUpperEffects().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CallTimer()

int C4Effect::CallTimer ( int  time)
protected

Definition at line 443 of file C4Effect.cpp.

444 {
445  try
446  {
447  if (!GetCallbackScript())
448  return Call(P_Timer, &C4AulParSet(time), true).getInt();
449  if (pFnTimer)
450  return pFnTimer->Exec(GetCallbackScript(), &C4AulParSet(Obj(Target), this, time), true).getInt();
451  }
452  catch (C4AulError &e)
453  {
454  // Script error: remove the timer.
455  // TODO: The error message is printed after the stack trace. No way around that currently.
457  // => Removing effect { ... }
458  DebugLogF(" Removing %s", C4Value(this).GetDataString(3).getData());
459  }
460  return C4Fx_Execute_Kill;
461 }
#define C4Fx_Execute_Kill
Definition: C4Effect.h:36
bool DebugLogF(const char *strMessage ...)
Definition: C4Log.cpp:290
@ P_Timer
const char * what() const noexcept override
Definition: C4Aul.cpp:59

References C4PropList::Call(), C4AulFunc::Exec(), GetCallbackScript(), C4Value::getInt(), P_Timer, and pFnTimer.

Referenced by Execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Check()

C4Effect * C4Effect::Check ( const char *  szCheckEffect,
int32_t  iPrio,
int32_t  iTimer,
const C4Value &  rVal1,
const C4Value &  rVal2,
const C4Value &  rVal3,
const C4Value &  rVal4 
)

Definition at line 249 of file C4Effect.cpp.

250 {
251  // priority=1: always OK; no callbacks
252  if (iPrio == 1) return nullptr;
253  // check this and other effects
254  C4Effect *pAddToEffect = nullptr; bool fDoTempCallsForAdd = false;
255  C4Effect *pLastRemovedEffect=nullptr;
256  for (C4Effect *pCheck = this; pCheck; pCheck = pCheck->pNext)
257  {
258  if (!pCheck->IsDead() && pCheck->iPriority >= iPrio)
259  {
260  int32_t iResult = pCheck->CallEffect(szCheckEffect, rVal1, rVal2, rVal3, rVal4);
261  if (iResult == C4Fx_Effect_Deny)
262  // effect denied
263  return (C4Effect*)C4Fx_Effect_Deny;
264  // add to other effect
266  {
267  pAddToEffect = pCheck;
268  fDoTempCallsForAdd = (iResult == C4Fx_Effect_AnnulCalls);
269  }
270  }
271  }
272  // adding to other effect?
273  if (pAddToEffect)
274  {
275  // do temp remove calls if desired
276  if (pAddToEffect->pNext && fDoTempCallsForAdd)
277  pAddToEffect->TempRemoveUpperEffects(false, &pLastRemovedEffect);
278  C4Value Par1 = C4VString(szCheckEffect), Par2 = C4VInt(iTimer), Par8;
279  int32_t iResult = pAddToEffect->DoCall(Target, PSFS_FxAdd, Par1, Par2, rVal1, rVal2, rVal3, rVal4, Par8).getInt();
280  // do temp readd calls if desired
281  if (pAddToEffect->pNext && fDoTempCallsForAdd)
282  pAddToEffect->TempReaddUpperEffects(pLastRemovedEffect);
283  // effect removed by this call?
284  if (iResult == C4Fx_Start_Deny)
285  {
286  pAddToEffect->Kill();
287  return (C4Effect*)C4Fx_Effect_Annul;
288  }
289  else
290  // other effect is the target effect number
291  return pAddToEffect;
292  }
293  // added to no effect and not denied
294  return nullptr;
295 }
#define C4Fx_Start_Deny
Definition: C4Effect.h:39
#define C4Fx_Effect_Annul
Definition: C4Effect.h:33
#define C4Fx_Effect_Deny
Definition: C4Effect.h:32
#define C4Fx_Effect_AnnulCalls
Definition: C4Effect.h:34
#define PSFS_FxAdd
Definition: C4GameScript.h:156
int iResult
Definition: C4GroupMain.cpp:40
C4Value C4VInt(int32_t i)
Definition: C4Value.h:239
C4Value DoCall(C4PropList *pObj, const char *szFn, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4, const C4Value &rVal5, const C4Value &rVal6, const C4Value &rVal7)
Definition: C4Effect.cpp:409
void TempRemoveUpperEffects(bool fTempRemoveThis, C4Effect **ppLastRemovedEffect)
Definition: C4Effect.cpp:496
void Kill()
Definition: C4Effect.cpp:343
void TempReaddUpperEffects(C4Effect *pLastReaddEffect)
Definition: C4Effect.cpp:521

References C4Fx_Effect_Annul, C4Fx_Effect_AnnulCalls, C4Fx_Effect_Deny, C4Fx_Start_Deny, C4VInt(), C4VString(), DoCall(), C4Value::getInt(), iResult, Kill(), pNext, PSFS_FxAdd, Target, TempReaddUpperEffects(), and TempRemoveUpperEffects().

Referenced by Init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CheckPropList()

bool C4PropListNumbered::CheckPropList ( C4PropList *  pObj)
staticinherited

Definition at line 56 of file C4PropList.cpp.

57 {
58  if (!pObj) return false;
59  C4PropListNumbered * const * p = PropLists.First();
60  while (p)
61  {
62  if (*p == pObj)
63  return true;
64  p = PropLists.Next(p);
65  }
66  return false;
67 }

References C4Set< T >::First(), C4Set< T >::Next(), and C4PropListNumbered::PropLists.

Referenced by C4Object::SetOCF(), C4Object::UpdateOCF(), and C4PropList::~C4PropList().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Clear()

void C4PropList::Clear ( )
inlineinherited

Definition at line 70 of file C4PropList.h.

70 { constant = false; Properties.Clear(); prototype.Set0(); }
void Clear()

References C4Set< T >::Clear(), and C4Value::Set0().

Referenced by C4Def::Clear(), C4AulScriptEngine::Clear(), C4ExtraScriptHost::Clear(), C4PropListNumbered::ClearNumberedPropLists(), C4ScriptHost::DeleteOwnedPropLists(), and C4Def::~C4Def().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearAll()

void C4Effect::ClearAll ( int32_t  iClearFlag)

Definition at line 369 of file C4Effect.cpp.

370 {
371  // simply remove access all effects recursively, and do removal calls
372  // this does not regard lower-level effects being added in the removal calls,
373  // because this could hang the engine with poorly coded effects
374  if (pNext) pNext->ClearAll(iClearFlag);
375  if ((Target && !Target->Status) || IsDead()) return;
376  int32_t iPrevPrio = iPriority;
377  SetDead();
378  if (CallStop(iClearFlag, false) == C4Fx_Stop_Deny)
379  {
380  // this stop-callback might have deleted the object and then denied its own removal
381  // must not modify self in this case...
382  if (Target && !Target->Status) return;
383  // effect denied to be removed: recover it
384  iPriority = iPrevPrio;
385  }
386  // Update OnFire cache
388  if (!Get(C4Fx_AnyFire))
389  Target->SetOnFire(false);
390  if (IsDead() && !GetCallbackScript())
391  Call(P_Destruction, &C4AulParSet(iClearFlag));
392 }
#define C4Fx_Stop_Deny
Definition: C4Effect.h:38
#define C4Fx_AnyFire
Definition: C4Effect.h:149
@ P_Destruction
bool WildcardMatch(const char *szWildcard, const char *szString)
Definition: StdFile.cpp:396
int CallStop(int reason, bool temporary)
Definition: C4Effect.cpp:435
C4Effect * Get(const char *szName, int32_t iIndex=0, int32_t iMaxPriority=0)
Definition: C4Effect.cpp:210
bool IsDead()
Definition: C4Effect.h:110
void ClearAll(int32_t iClearFlag)
Definition: C4Effect.cpp:369
void SetDead()
Definition: C4Effect.cpp:205
virtual void SetOnFire(bool OnFire)
Definition: C4PropList.h:73

References C4Fx_AnyFire, C4Fx_Stop_Deny, C4PropList::Call(), CallStop(), ClearAll(), Get(), GetCallbackScript(), C4PropList::GetName(), iPriority, IsDead(), P_Destruction, pNext, SetDead(), C4PropList::SetOnFire(), C4PropList::Status, Target, and WildcardMatch().

Referenced by C4Object::AssignDeath(), C4Object::AssignRemoval(), ClearAll(), and C4Game::LoadScenarioSection().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearNumber()

void C4PropListNumbered::ClearNumber ( )
protectedinherited

Definition at line 141 of file C4PropList.cpp.

142 {
143  // Make proplist invisible during denumeration process
144  if (Number != -1)
145  {
146  PropLists.Remove(this);
147  Number = -1;
148  }
149 }
void Remove(H e)

References C4PropListNumbered::Number, C4PropListNumbered::PropLists, and C4Set< T >::Remove().

Referenced by C4PropListNumbered::ShelveNumberedPropLists().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearNumberedPropLists()

void C4PropListNumbered::ClearNumberedPropLists ( )
staticinherited

Definition at line 113 of file C4PropList.cpp.

114 {
115  // empty all proplists to ensure safe deletion of proplists with circular references
116  // note that this the call to Clear() might delete some prop lists. So it is assumed that
117  // PropLists does not shrink its table as the number of values goes down
118  C4PropListNumbered *const* p_next = PropLists.First(), *const* p;
119  while ((p = p_next))
120  {
121  p_next = PropLists.Next(p);
122  // check *p since it might have been deleted by clearing the previous prop list
123  if (*p) (*p)->Clear();
124  }
125 }
void Clear()
Definition: C4PropList.h:70

References C4PropList::Clear(), C4Set< T >::First(), C4Set< T >::Next(), and C4PropListNumbered::PropLists.

Referenced by C4Game::Clear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearPointers()

void C4Effect::ClearPointers ( C4PropList *  pObj)

Definition at line 191 of file C4Effect.cpp.

192 {
193  // clear pointers in all effects
194  C4Effect *pEff = this;
195  do
196  // command target lost: effect dead w/o callback
197  if (pEff->CommandTarget.getPropList() == pObj)
198  {
199  pEff->SetDead();
200  pEff->CommandTarget.Set0();
201  }
202  while ((pEff=pEff->pNext));
203 }
C4PropList * getPropList() const
Definition: C4Value.h:116

References CommandTarget, C4Value::getPropList(), pNext, C4Value::Set0(), and SetDead().

Referenced by C4Game::ClearPointers(), and C4Object::ClearPointers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearRefs()

void C4PropList::ClearRefs ( )
inlineprotectedinherited

Definition at line 160 of file C4PropList.h.

160 { for( C4Value * ref: RefSet{Refs}) ref->Set0(); assert(Refs.empty()); }

Referenced by C4Object::AssignRemoval().

Here is the caller graph for this function:

◆ ClearShelve()

void C4PropListNumbered::ClearShelve ( )
staticinherited

Definition at line 107 of file C4PropList.cpp.

108 {
109  // cleanup shelve - used in game clear, un unsuccessful section load, etc.
110  ShelvedPropLists.clear();
111 }
static std::vector< C4PropListNumbered * > ShelvedPropLists
Definition: C4PropList.h:242

References C4PropListNumbered::ShelvedPropLists.

Referenced by C4Game::Clear().

Here is the caller graph for this function:

◆ CompileFunc() [1/2]

void C4Effect::CompileFunc ( StdCompiler *  pComp,
C4PropList *  Owner,
C4ValueNumbers *  numbers 
)

Definition at line 541 of file C4Effect.cpp.

542 {
543  if (pComp->isDeserializer()) Target = Owner;
544  // read name
545  pComp->Separator(StdCompiler::SEP_START); // '('
546  // read priority
547  pComp->Value(iPriority); pComp->Separator();
548  // read time and intervall
549  pComp->Value(iTime); pComp->Separator();
550  pComp->Value(iInterval); pComp->Separator();
551  // read object number
552  // FIXME: replace with this when savegame compat breaks for other reasons
553  // pComp->Value(mkParAdapt(CommandTarget, numbers));
554  int32_t nptr = 0;
557  pComp->Value(nptr);
558  if (pComp->isDeserializer())
560  pComp->Separator();
561  // read ID
562  if (pComp->isSerializer())
563  {
565  if (p)
566  p->RefCompileFunc(pComp, numbers);
567  else
568  pComp->String(const_cast<char*>("None"), 5, StdCompiler::RCT_ID);
569  }
570  else
571  {
572  StdStrBuf s;
574  // An Object trumps a definition as command target
575  if (!nptr)
576  if (!::ScriptEngine.GetGlobalConstant(s.getData(), &CommandTarget))
578  }
579  pComp->Separator();
580  // proplist
581  C4PropListNumbered::CompileFunc(pComp, numbers);
582  pComp->Separator(StdCompiler::SEP_END); // ')'
583  // is there a next effect?
584  bool fNext = !! pNext;
585  if (pComp->hasNaming())
586  {
587  if (fNext || pComp->isDeserializer())
588  fNext = pComp->Separator();
589  }
590  else
591  pComp->Value(fNext);
592  if (!fNext) return;
593  // read next
594  pComp->Value(mkParAdapt(mkPtrAdaptNoNull(pNext), Owner, numbers));
595  // denumeration and callback assignment will be done later
596 }
StdPtrAdapt< T > mkPtrAdaptNoNull(T *&rpObj)
Definition: StdAdaptors.h:638
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
Definition: StdAdaptors.h:490
bool GetGlobalConstant(const char *szName, C4Value *pTargetValue)
Definition: C4Aul.cpp:133
virtual C4PropListNumbered * GetPropListNumbered()
Definition: C4PropList.cpp:672
void CompileFunc(StdCompiler *pComp, C4ValueNumbers *numbers)
Definition: C4PropList.cpp:156
void RefCompileFunc(StdCompiler *pComp, C4ValueNumbers *numbers) const
Definition: C4PropList.cpp:216
C4PropList * _getPropList() const
Definition: C4Value.h:129
void SetObjectEnum(int i)
Definition: C4Value.h:142
virtual bool Separator(Sep eSep=SEP_SEP)
Definition: StdCompiler.h:119
void Value(const T &rStruct)
Definition: StdCompiler.h:161
bool isSerializer()
Definition: StdCompiler.h:54
virtual void String(char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped)=0
virtual bool isDeserializer()
Definition: StdCompiler.h:53
virtual bool hasNaming()
Definition: StdCompiler.h:58

References C4Value::_getPropList(), CommandTarget, C4PropListNumbered::CompileFunc(), C4AulScriptEngine::GetGlobalConstant(), C4Value::getPropList(), C4PropList::GetPropListNumbered(), StdCompiler::hasNaming(), iInterval, iPriority, StdCompiler::isDeserializer(), StdCompiler::isSerializer(), C4PropList::IsStatic(), iTime, mkParAdapt(), mkPtrAdaptNoNull(), C4PropListNumbered::Number, pNext, StdCompiler::RCT_ID, C4PropListStatic::RefCompileFunc(), s, ScriptEngine, StdCompiler::SEP_END, StdCompiler::SEP_START, StdCompiler::Separator(), C4Value::Set0(), C4Value::SetObjectEnum(), StdCompiler::String(), Target, and StdCompiler::Value().

Here is the call graph for this function:

◆ CompileFunc() [2/2]

void C4PropListNumbered::CompileFunc ( StdCompiler *  pComp,
C4ValueNumbers *  numbers 
)
inherited

Definition at line 156 of file C4PropList.cpp.

157 {
158  int32_t n = Number;
159  pComp->Value(n);
161  C4PropList::CompileFunc(pComp, numbers);
162  if (pComp->isDeserializer())
163  {
164  if (PropLists.Get(n))
165  {
166  pComp->excCorrupt("multiple PropLists with Number %d", n);
167  return;
168  }
169  // Once this proplist has a Number, it has to be in PropLists. See the destructor below.
170  Number = n;
171  PropLists.Add(this);
172  }
173 }
void CompileFunc(StdCompiler *pComp, C4ValueNumbers *)
Definition: C4PropList.cpp:366
void excCorrupt(const char *szMessage,...)
Definition: StdCompiler.h:249

References C4Set< T >::Add(), C4PropList::CompileFunc(), StdCompiler::excCorrupt(), C4Set< T >::Get(), StdCompiler::isDeserializer(), C4PropListNumbered::Number, C4PropListNumbered::PropLists, StdCompiler::SEP_SEP2, StdCompiler::Separator(), and StdCompiler::Value().

Referenced by CompileFunc().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Delete()

virtual bool C4PropList::Delete ( )
inlinevirtualinherited

Reimplemented in C4PropListStaticMember, C4PropListStatic, C4PropListScript, and C4Def.

Definition at line 94 of file C4PropList.h.

94 { return false; }

Referenced by C4AulScriptEngine::Clear(), and C4ScriptHost::DeleteOwnedPropLists().

Here is the caller graph for this function:

◆ Denumerate()

void C4Effect::Denumerate ( C4ValueNumbers *  numbers)
overridevirtual

Reimplemented from C4PropList.

Definition at line 176 of file C4Effect.cpp.

177 {
178  // denum in all effects
179  C4Effect *pEff = this;
180  do
181  {
182  // command target
183  pEff->CommandTarget.Denumerate(numbers);
184  // assign any callback functions
185  pEff->AssignCallbackFunctions();
186  pEff->C4PropList::Denumerate(numbers);
187  }
188  while ((pEff=pEff->pNext));
189 }
void AssignCallbackFunctions()
Definition: C4Effect.cpp:27
void Denumerate(C4ValueNumbers *)
Definition: C4Value.cpp:251

References AssignCallbackFunctions(), CommandTarget, C4Value::Denumerate(), and pNext.

Referenced by C4Object::Denumerate(), C4AulScriptEngine::Denumerate(), and C4GameScriptHost::Denumerate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoCall()

C4Value C4Effect::DoCall ( C4PropList *  pObj,
const char *  szFn,
const C4Value &  rVal1,
const C4Value &  rVal2,
const C4Value &  rVal3,
const C4Value &  rVal4,
const C4Value &  rVal5,
const C4Value &  rVal6,
const C4Value &  rVal7 
)

Definition at line 409 of file C4Effect.cpp.

410 {
412  if (!p)
413  {
414  C4AulFunc * fn = GetFunc(szFn);
415  if (fn) return fn->Exec(this, &C4AulParSet(rVal1, rVal2, rVal3, rVal4, rVal5, rVal6, rVal7));
416  }
417  else
418  {
419  // old variant
420  // compose function name
421  C4AulFunc * fn = p->GetFunc(FormatString(PSF_FxCustom, GetName(), szFn).getData());
422  if (fn) return fn->Exec(p, &C4AulParSet(Obj(pObj), this, rVal1, rVal2, rVal3, rVal4, rVal5, rVal6, rVal7));
423  }
424  return C4Value();
425 }
#define PSF_FxCustom
Definition: C4GameScript.h:114

References C4AulFunc::Exec(), FormatString(), GetCallbackScript(), C4PropList::GetFunc(), C4PropList::GetName(), and PSF_FxCustom.

Referenced by Check().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDamage()

void C4Effect::DoDamage ( int32_t &  riDamage,
int32_t  iDamageType,
int32_t  iCausePlr 
)

Definition at line 394 of file C4Effect.cpp.

395 {
396  // ask all effects for damage adjustments
397  C4Effect *pEff = this;
398  do
399  {
400  if (!pEff->IsDead())
401  pEff->CallDamage(riDamage, iDamageType, iCausePlr);
402  if (Target && !Target->Status) return;
403  }
404  while ((pEff = pEff->pNext) && riDamage);
405 }
void CallDamage(int32_t &damage, int damagetype, int plr)
Definition: C4Effect.cpp:462

References CallDamage(), IsDead(), pNext, C4PropList::Status, and Target.

Referenced by C4Object::DoDamage(), and C4Object::DoEnergy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ end()

Iterator C4PropList::end ( )
inlineinherited

Definition at line 211 of file C4PropList.h.

211 { return Iterator(); }

Referenced by C4PropList::AppendDataString(), C4ParticleProperties::Set(), and C4PropList::ToJSON().

Here is the caller graph for this function:

◆ EnumerateOwnFuncs()

C4String * C4PropList::EnumerateOwnFuncs ( C4String *  prev = nullptr) const
inherited

Definition at line 928 of file C4PropList.cpp.

929 {
930  const C4Property * p = prev ? Properties.Next(&Properties.Get(prev)) : Properties.First();
931  while (p)
932  {
933  if (p->Value.getFunction())
934  return p->Key;
935  p = Properties.Next(p);
936  }
937  return nullptr;
938 }
C4Value Value
Definition: C4PropList.h:54
C4String * Key
Definition: C4PropList.h:53
C4AulFunc * getFunction() const
Definition: C4Value.h:119

References C4Set< T >::First(), C4Set< T >::Get(), C4Value::getFunction(), C4Property::Key, C4Set< T >::Next(), and C4Property::Value.

Here is the call graph for this function:

◆ Execute()

void C4Effect::Execute ( C4Effect **  ppEffectList)
static

Definition at line 297 of file C4Effect.cpp.

298 {
299  // advance all effect timers first; then do execution
300  // this prevents a possible endless loop if timers register into the same effect list with interval 1 while it is being executed
301  for (C4Effect *pEffect = *ppEffectList; pEffect; pEffect = pEffect->pNext)
302  {
303  // ignore dead status; adjusting their time doesn't hurt
304  ++pEffect->iTime;
305  }
306  // get effect list
307  // execute all effects not marked as dead
308  C4Effect *pEffect = *ppEffectList, **ppPrevEffect=ppEffectList;
309  while (pEffect)
310  {
311  // effect dead?
312  if (pEffect->IsDead())
313  {
314  // delete it, then
315  C4Effect *pNextEffect = pEffect->pNext;
316  pEffect->pNext = nullptr;
317  delete pEffect;
318  // next effect
319  *ppPrevEffect = pEffect = pNextEffect;
320  }
321  else
322  {
323  // check timer execution
324  if (pEffect->iInterval && !(pEffect->iTime % pEffect->iInterval) && pEffect->iTime)
325  {
326  if (pEffect->CallTimer(pEffect->iTime) == C4Fx_Execute_Kill)
327  {
328  // safety: this class got deleted!
329  if (pEffect->Target && !pEffect->Target->Status) return;
330  // timer function decided to finish it
331  pEffect->Kill();
332  }
333  // safety: this class got deleted!
334  if (pEffect->Target && !pEffect->Target->Status) return;
335  }
336  // next effect
337  ppPrevEffect = &pEffect->pNext;
338  pEffect = pEffect->pNext;
339  }
340  }
341 }
int CallTimer(int time)
Definition: C4Effect.cpp:443

References C4Fx_Execute_Kill, CallTimer(), iInterval, IsDead(), iTime, Kill(), pNext, C4PropList::Status, and Target.

Referenced by C4Game::Execute(), and C4Object::Execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FlipActive()

void C4Effect::FlipActive ( )
inline

Definition at line 111 of file C4Effect.h.

111 { iPriority*=-1; } // alters activation status

References iPriority.

Referenced by TempRemoveUpperEffects().

Here is the caller graph for this function:

◆ Freeze()

void C4PropList::Freeze ( )
inlineinherited

Definition at line 132 of file C4PropList.h.

132 { constant = true; }

Referenced by C4PropList::FreezeAndMakeStaticRecursively().

Here is the caller graph for this function:

◆ FreezeAndMakeStaticRecursively()

C4PropListStatic * C4PropList::FreezeAndMakeStaticRecursively ( std::vector< C4Value > *  prop_lists,
const C4PropListStatic *  parent = nullptr,
C4String *  key = nullptr 
)
inherited

Definition at line 279 of file C4PropList.cpp.

280 {
281  Freeze();
282  // Already static?
283  C4PropListStatic *this_static = IsStatic();
284  if (!this_static)
285  {
286  // Make self static by creating a copy and replacing all references
287  this_static = NewStatic(GetPrototype(), parent, key);
288  this_static->Properties.Swap(&Properties); // grab properties
289  this_static->Status = Status;
290  RefSet pre_freeze_refs{Refs}; // copy to avoid iterator validity headaches
291  C4Value holder = C4VPropList(this); // add another reference to prevent premature deletion
292  for (C4Value * ref : pre_freeze_refs)
293  ref->SetPropList(this_static);
294  // store reference
295  if (prop_lists)
296  prop_lists->push_back(C4VPropList(this_static));
297  // "this" should be deleted as holder goes out of scope
298  }
299  // Iterate over sorted list of elements to make static
300  // Must iterate over sorted list because the order must be defined, just in case it's a network game
301  // and a non-static child proplist is available through different paths it should still get the same name
302  auto prop_names = this_static->GetSortedLocalProperties(false);
303  for (auto prop_name : prop_names)
304  {
305  C4Value child_val;
306  this_static->GetPropertyByS(prop_name, &child_val);
307  C4PropList *child_proplist = child_val.getPropList();
308  if (child_proplist)
309  {
310  // Avoid infinite recursion: Only freeze into unfrozen children and "true" static children
311  C4PropListStatic *child_static = child_proplist->IsStatic();
312  if (!child_static || (child_static->GetParent() == this_static && child_static->GetParentKeyName() == prop_name))
313  {
314  child_proplist->FreezeAndMakeStaticRecursively(prop_lists, this_static, prop_name);
315  }
316  }
317  }
318  return this_static;
319 }
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:242
virtual bool GetPropertyByS(const C4String *k, C4Value *pResult) const
Definition: C4PropList.cpp:726
C4PropListStatic * FreezeAndMakeStaticRecursively(std::vector< C4Value > *prop_lists, const C4PropListStatic *parent=nullptr, C4String *key=nullptr)
Definition: C4PropList.cpp:279
std::vector< C4String * > GetSortedLocalProperties(bool add_prototype=true) const
Definition: C4PropList.cpp:545
void Freeze()
Definition: C4PropList.h:132
static C4PropListStatic * NewStatic(C4PropList *prototype, const C4PropListStatic *parent, C4String *key)
Definition: C4PropList.cpp:46
C4String * GetParentKeyName()
Definition: C4PropList.h:276
const C4PropListStatic * GetParent() const
Definition: C4PropList.h:275

References C4VPropList(), C4PropList::Freeze(), C4PropList::FreezeAndMakeStaticRecursively(), C4PropListStatic::GetParent(), C4PropListStatic::GetParentKeyName(), C4PropList::GetPropertyByS(), C4Value::getPropList(), C4PropList::GetPrototype(), C4PropList::GetSortedLocalProperties(), C4PropList::IsStatic(), C4PropList::NewStatic(), and C4PropList::Status.

Referenced by C4PropList::FreezeAndMakeStaticRecursively(), and C4AulScriptEngine::Link().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Get()

C4Effect * C4Effect::Get ( const char *  szName,
int32_t  iIndex = 0,
int32_t  iMaxPriority = 0 
)

Definition at line 210 of file C4Effect.cpp.

211 {
212  // safety
213  if (!szName) return nullptr;
214  // check all effects
215  C4Effect *pEff = this;
216  do
217  {
218  // skip dead
219  if (pEff->IsDead()) continue;
220  // skip effects with too high priority
221  if (iMaxPriority && pEff->iPriority > iMaxPriority) continue;
222  // wildcard compare name
223  const char *szEffectName = pEff->GetName();
224  if (!SWildcardMatchEx(szEffectName, szName)) continue;
225  // effect name matches
226  // check index
227  if (iIndex--) continue;
228  // effect found
229  return pEff;
230  }
231  while ((pEff=pEff->pNext));
232  // nothing found
233  return nullptr;
234 }
bool SWildcardMatchEx(const char *szString, const char *szWildcard)
Definition: Standard.cpp:635

References C4PropList::GetName(), iPriority, IsDead(), pNext, and SWildcardMatchEx().

Referenced by ClearAll(), Kill(), and TempRemoveUpperEffects().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetByNumber()

C4PropList * C4PropListNumbered::GetByNumber ( int32_t  iNumber)
staticinherited

Definition at line 51 of file C4PropList.cpp.

52 {
53  return PropLists.Get(iNumber);
54 }

References C4Set< T >::Get(), and C4PropListNumbered::PropLists.

Referenced by C4Value::Denumerate(), and C4GameObjects::ObjectPointer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetCallbackScript()

C4PropList * C4Effect::GetCallbackScript ( )

Definition at line 40 of file C4Effect.cpp.

41 {
42  return CommandTarget._getPropList();
43 }

References C4Value::_getPropList(), and CommandTarget.

Referenced by AssignCallbackFunctions(), CallDamage(), CallEffect(), CallStart(), CallStop(), CallTimer(), ClearAll(), DoCall(), Init(), Kill(), and OnObjectChangedDef().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetCount()

int32_t C4Effect::GetCount ( const char *  szMask,
int32_t  iMaxPriority = 0 
)

Definition at line 236 of file C4Effect.cpp.

237 {
238  // count all matching effects
239  int32_t iCnt=0; C4Effect *pEff = this;
240  do if (!pEff->IsDead())
241  if (!szMask || SWildcardMatchEx(pEff->GetName(), szMask))
242  if (!iMaxPriority || pEff->iPriority <= iMaxPriority)
243  ++iCnt;
244  while ((pEff = pEff->pNext));
245  // return count
246  return iCnt;
247 }
int iCnt
Definition: TstC4NetIO.cpp:32

References C4PropList::GetName(), iCnt, iPriority, IsDead(), pNext, and SWildcardMatchEx().

Here is the call graph for this function:

◆ GetDef() [1/2]

C4Def * C4PropList::GetDef ( )
virtualinherited

Reimplemented in C4Def.

Definition at line 648 of file C4PropList.cpp.

649 {
650  if (GetPrototype()) return GetPrototype()->GetDef();
651  return nullptr;
652 }
virtual C4Def const * GetDef() const
Definition: C4PropList.cpp:654

References C4PropList::GetDef(), and C4PropList::GetPrototype().

Here is the call graph for this function:

◆ GetDef() [2/2]

C4Def const * C4PropList::GetDef ( ) const
virtualinherited

Reimplemented in C4Def.

Definition at line 654 of file C4PropList.cpp.

655 {
656  if (GetPrototype()) return GetPrototype()->GetDef();
657  return nullptr;
658 }

References C4PropList::GetDef(), and C4PropList::GetPrototype().

Referenced by C4Value::_getDef(), ConstructionCheck(), C4Game::CreateObject(), C4Game::CreateObjectConstruction(), C4AulExec::DirectExec(), C4GameMessage::Draw(), C4Game::DrawPropListSpecImage(), C4AulExec::FnTranslate(), C4PropList::GetDef(), C4Value::getDef(), C4Object::Init(), C4GameMessage::Init(), C4FindObjectDef::IsImpossible(), C4PropList::operator==(), C4ScriptHost::Parse(), C4AulParse::Parse_Script(), C4Game::PlaceAnimal(), C4Game::PlaceVegetation(), and C4ScriptGuiWindowProperty::Set().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetEffect()

C4Effect* C4Effect::GetEffect ( )
inlineoverridevirtual

Reimplemented from C4PropList.

Definition at line 137 of file C4Effect.h.

137 { return this; }

◆ GetEnumerationIndex()

static int32_t C4PropListNumbered::GetEnumerationIndex ( )
inlinestaticinherited

Definition at line 230 of file C4PropList.h.

230 { return EnumerationIndex; }

References C4PropListNumbered::EnumerationIndex.

Referenced by C4Game::NewObject(), C4EditCursor::PerformDuplication(), and C4ControlSyncCheck::Set().

Here is the caller graph for this function:

◆ GetFunc() [1/3]

C4AulFunc* C4PropList::GetFunc ( C4PropertyName  k) const
inlineinherited

◆ GetFunc() [2/3]

C4AulFunc * C4PropList::GetFunc ( C4String *  k) const
inherited

Definition at line 772 of file C4PropList.cpp.

773 {
774  assert(k);
775  if (Properties.Has(k))
776  {
777  return Properties.Get(k).Value.getFunction();
778  }
779  if (GetPrototype())
780  {
781  return GetPrototype()->GetFunc(k);
782  }
783  return nullptr;
784 }
bool Has(H e) const

References C4Set< T >::Get(), C4PropList::GetFunc(), C4Value::getFunction(), C4PropList::GetPrototype(), C4Set< T >::Has(), and C4Property::Value.

Here is the call graph for this function:

◆ GetFunc() [3/3]

C4AulFunc * C4PropList::GetFunc ( const char *  k) const
inherited

Definition at line 786 of file C4PropList.cpp.

787 {
788  assert(s);
789  if (s[0] == '~') ++s;
790  C4String * k = Strings.FindString(s);
791  // this string is entirely unused
792  if (!k)
793  return nullptr;
794  return GetFunc(k);
795 }
C4String * FindString(const char *strString) const

References C4StringTable::FindString(), C4PropList::GetFunc(), s, and Strings.

Here is the call graph for this function:

◆ GetMapScriptLayer()

class C4MapScriptLayer * C4PropList::GetMapScriptLayer ( )
virtualinherited

Reimplemented in C4MapScriptLayer.

Definition at line 660 of file C4PropList.cpp.

661 {
662  if (GetPrototype()) return GetPrototype()->GetMapScriptLayer();
663  return nullptr;
664 }
virtual class C4MapScriptLayer * GetMapScriptLayer()
Definition: C4PropList.cpp:660

References C4PropList::GetMapScriptLayer(), and C4PropList::GetPrototype().

Referenced by C4MapScriptAlgoLayer::C4MapScriptAlgoLayer(), and C4PropList::GetMapScriptLayer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetMapScriptMap()

class C4MapScriptMap * C4PropList::GetMapScriptMap ( )
virtualinherited

Reimplemented in C4MapScriptMap.

Definition at line 666 of file C4PropList.cpp.

667 {
668  if (GetPrototype()) return GetPrototype()->GetMapScriptMap();
669  return nullptr;
670 }
virtual class C4MapScriptMap * GetMapScriptMap()
Definition: C4PropList.cpp:666

References C4PropList::GetMapScriptMap(), and C4PropList::GetPrototype().

Referenced by C4PropList::GetMapScriptMap().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetName()

const char * C4PropList::GetName ( ) const
virtualinherited

Reimplemented in C4PropListStatic.

Definition at line 618 of file C4PropList.cpp.

619 {
621  if (!s) return "";
622  return s->GetCStr();
623 }
C4String * GetPropertyStr(C4PropertyName k) const
Definition: C4PropList.cpp:744

References C4PropList::GetPropertyStr(), P_Name, and s.

Referenced by C4Object::ActivateMenu(), AssignCallbackFunctions(), C4Effect(), C4PropertyPath::C4PropertyPath(), C4Object::CanConcatPictureWith(), C4FindObjectAction::Check(), C4Game::CheckObjectEnumeration(), ClearAll(), ConstructionCheck(), DoCall(), C4EditCursor::DoContextMenu(), C4ObjectMenu::DoRefillInternal(), C4Object::Draw(), C4ScriptGuiWindow::Draw(), C4Game::DrawCrewOverheadText(), C4Object::ExecLife(), Get(), GetCount(), C4Object::GetDataString(), C4Object::GetInfoString(), Init(), Kill(), C4Object::Lift(), C4Game::NewObject(), ObjectComDig(), C4Object::Promote(), C4Object::Push(), C4Object::SetAction(), C4Object::SetOCF(), TempRemoveUpperEffects(), C4Object::UpdateOCF(), and C4EditCursor::UpdateStatusBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetObject() [1/2]

C4Object * C4PropList::GetObject ( )
virtualinherited

Reimplemented in C4Object.

Definition at line 636 of file C4PropList.cpp.

637 {
638  if (GetPrototype()) return GetPrototype()->GetObject();
639  return nullptr;
640 }
virtual C4Object * GetObject()
Definition: C4PropList.cpp:636

References C4PropList::GetObject(), and C4PropList::GetPrototype().

Referenced by C4Value::_getObj(), C4EditCursor::AddToSelection(), C4PropertyPath::C4PropertyPath(), C4ScriptGuiWindowAction::ClearPointers(), C4GameMessage::Draw(), C4ScriptGuiWindowAction::ExecuteCommand(), FnGetEffectsFor(), C4Value::getObj(), C4PropList::GetObject(), C4GameMessage::Init(), Object(), C4EditCursor::RemoveFromSelection(), and C4ScriptGuiWindowProperty::Set().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetObject() [2/2]

C4Object const * C4PropList::GetObject ( ) const
virtualinherited

Reimplemented in C4Object.

Definition at line 642 of file C4PropList.cpp.

643 {
644  if (GetPrototype()) return GetPrototype()->GetObject();
645  return nullptr;
646 }

References C4PropList::GetObject(), and C4PropList::GetPrototype().

Here is the call graph for this function:

◆ GetProperties()

C4ValueArray * C4Effect::GetProperties ( ) const
overridevirtual

Reimplemented from C4PropList.

Definition at line 665 of file C4Effect.cpp.

666 {
668  int i;
669  i = a->GetSize();
670  a->SetSize(i + 5);
671  (*a)[i++] = C4VString(&::Strings.P[P_Name]);
672  (*a)[i++] = C4VString(&::Strings.P[P_Priority]);
673  (*a)[i++] = C4VString(&::Strings.P[P_Interval]);
674  (*a)[i++] = C4VString(&::Strings.P[P_CommandTarget]);
675  (*a)[i++] = C4VString(&::Strings.P[P_Target]);
676  (*a)[i++] = C4VString(&::Strings.P[P_Time]);
677  return a;
678 }
#define a
@ P_Priority
@ P_CommandTarget
@ P_Time
@ P_Target
@ P_Interval
virtual C4ValueArray * GetProperties() const
Definition: C4PropList.cpp:883

References a, C4VString(), C4PropList::GetProperties(), C4StringTable::P, P_CommandTarget, P_Interval, P_Name, P_Priority, P_Target, P_Time, and Strings.

Here is the call graph for this function:

◆ GetProperty()

bool C4PropList::GetProperty ( C4PropertyName  k,
C4Value *  pResult 
) const
inlineinherited

◆ GetPropertyArray()

C4ValueArray * C4PropList::GetPropertyArray ( C4PropertyName  n) const
inherited

Definition at line 758 of file C4PropList.cpp.

759 {
760  C4String * k = &Strings.P[n];
761  if (Properties.Has(k))
762  {
763  return Properties.Get(k).Value.getArray();
764  }
765  if (GetPrototype())
766  {
767  return GetPrototype()->GetPropertyArray(n);
768  }
769  return nullptr;
770 }
C4ValueArray * GetPropertyArray(C4PropertyName n) const
Definition: C4PropList.cpp:758
C4ValueArray * getArray() const
Definition: C4Value.h:118

References C4Set< T >::Get(), C4Value::getArray(), C4PropList::GetPropertyArray(), C4PropList::GetPrototype(), C4Set< T >::Has(), C4StringTable::P, Strings, and C4Property::Value.

Referenced by C4EditCursor::DoContextMenu(), C4PropList::GetPropertyArray(), and C4FoWLight::Update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropertyBool()

int32_t C4PropList::GetPropertyBool ( C4PropertyName  n,
bool  default_val = false 
) const
inherited

Definition at line 841 of file C4PropList.cpp.

842 {
843  C4String * k = &Strings.P[n];
844  if (Properties.Has(k))
845  {
846  return Properties.Get(k).Value.getBool();
847  }
848  if (GetPrototype())
849  {
850  return GetPrototype()->GetPropertyBool(n, default_val);
851  }
852  return default_val;
853 }
int32_t GetPropertyBool(C4PropertyName n, bool default_val=false) const
Definition: C4PropList.cpp:841
bool getBool() const
Definition: C4Value.h:113

References C4Set< T >::Get(), C4Value::getBool(), C4PropList::GetPropertyBool(), C4PropList::GetPrototype(), C4Set< T >::Has(), C4StringTable::P, Strings, and C4Property::Value.

Referenced by C4Object::ExecLife(), and C4PropList::GetPropertyBool().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropertyByS()

bool C4Effect::GetPropertyByS ( const C4String *  k,
C4Value *  pResult 
) const
overridevirtual

Reimplemented from C4PropList.

Definition at line 648 of file C4Effect.cpp.

649 {
650  if (k >= &Strings.P[0] && k < &Strings.P[P_LAST])
651  {
652  switch(k - &Strings.P[0])
653  {
654  case P_Name: return C4PropListNumbered::GetPropertyByS(k, pResult);
655  case P_Priority: *pResult = C4VInt(Abs(iPriority)); return true;
656  case P_Interval: *pResult = C4VInt(iInterval); return true;
657  case P_CommandTarget: *pResult = CommandTarget; return true;
658  case P_Target: *pResult = C4Value(Target); return true;
659  case P_Time: *pResult = C4VInt(iTime); return true;
660  }
661  }
662  return C4PropListNumbered::GetPropertyByS(k, pResult);
663 }
@ P_LAST
T Abs(T val)
Definition: Standard.h:42

References Abs(), C4PropList::C4Value, C4VInt(), CommandTarget, C4PropList::GetPropertyByS(), iInterval, iPriority, iTime, C4StringTable::P, P_CommandTarget, P_Interval, P_LAST, P_Name, P_Priority, P_Target, P_Time, Strings, and Target.

Here is the call graph for this function:

◆ GetPropertyInt()

int32_t C4PropList::GetPropertyInt ( C4PropertyName  k,
int32_t  default_val = 0 
) const
inherited

Definition at line 855 of file C4PropList.cpp.

856 {
857  C4String * k = &Strings.P[n];
858  if (Properties.Has(k))
859  {
860  return Properties.Get(k).Value.getInt();
861  }
862  if (GetPrototype())
863  {
864  return GetPrototype()->GetPropertyInt(n, default_val);
865  }
866  return default_val;
867 }
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:855

References C4Set< T >::Get(), C4Value::getInt(), C4PropList::GetPropertyInt(), C4PropList::GetPrototype(), C4Set< T >::Has(), C4StringTable::P, Strings, and C4Property::Value.

Referenced by C4MouseControl::ButtonUpDragScript(), C4MapScriptAlgoEllipse::C4MapScriptAlgoEllipse(), C4MapScriptAlgoLines::C4MapScriptAlgoLines(), C4MapScriptAlgoOffset::C4MapScriptAlgoOffset(), C4MapScriptAlgoPolygon::C4MapScriptAlgoPolygon(), C4MapScriptAlgoRect::C4MapScriptAlgoRect(), C4MapScriptAlgoRndChecker::C4MapScriptAlgoRndChecker(), C4MapScriptAlgoRotate::C4MapScriptAlgoRotate(), C4MapScriptAlgoScale::C4MapScriptAlgoScale(), C4MapScriptAlgoTurbulence::C4MapScriptAlgoTurbulence(), C4Object::Contact(), C4Object::ContactAction(), C4Object::DoBreath(), C4Object::DoEnergy(), C4MouseControl::DragNone(), C4Object::Draw(), C4Object::DrawActionFace(), C4Game::DrawPropListSpecImage(), C4Object::DrawTopFace(), C4Command::Enter(), C4Object::ExecLife(), C4Object::ExecMovement(), C4ValueProviderAction::Execute(), C4Command::Exit(), C4Command::FlightControl(), C4SoundModifierList::Get(), C4SoundModifier::GetBoolProp(), C4SoundModifier::GetFloatProp(), C4Def::GetPlane(), C4PropList::GetPropertyInt(), C4Object::GetSolidMaskPlane(), C4Object::Init(), C4Object::IsVisible(), C4Command::MoveTo(), ObjectActionThrow(), ObjectComDrop(), ObjectComJump(), C4Game::PlaceAnimal(), C4Game::PlaceVegetation(), C4Object::Push(), C4Command::Put(), C4Object::ResetProperty(), C4Object::SetAction(), C4Object::SetDir(), C4Object::SetOCF(), C4Object::SetPhase(), C4Object::SideBounds(), C4Command::Throw(), C4Object::UpdateActionFace(), C4MouseControl::UpdateCursorTarget(), C4GraphicsOverlay::UpdateFacet(), C4Object::UpdateFlipDir(), C4Object::UpdateOCF(), and C4Object::VerticalBounds().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropertyP()

C4PropertyName C4PropList::GetPropertyP ( C4PropertyName  k) const
inherited

Definition at line 824 of file C4PropList.cpp.

825 {
826  C4String * k = &Strings.P[n];
827  if (Properties.Has(k))
828  {
829  C4String * v = Properties.Get(k).Value.getStr();
830  if (v >= &Strings.P[0] && v < &Strings.P[P_LAST])
831  return C4PropertyName(v - &Strings.P[0]);
832  return P_LAST;
833  }
834  if (GetPrototype())
835  {
836  return GetPrototype()->GetPropertyP(n);
837  }
838  return P_LAST;
839 }
C4PropertyName
C4PropertyName GetPropertyP(C4PropertyName k) const
Definition: C4PropList.cpp:824
C4String * getStr() const
Definition: C4Value.h:117

References C4Set< T >::Get(), C4PropList::GetPropertyP(), C4PropList::GetPrototype(), C4Value::getStr(), C4Set< T >::Has(), C4StringTable::P, P_LAST, Strings, and C4Property::Value.

Referenced by C4Object::ContactAction(), C4GameObjects::CrossCheck(), C4Object::ExecMovement(), C4Object::GetProcedure(), C4PropList::GetPropertyP(), ObjectComDrop(), C4Object::SetAction(), C4Object::SideBounds(), and C4Object::VerticalBounds().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropertyPropList()

C4PropList * C4PropList::GetPropertyPropList ( C4PropertyName  k) const
inherited

Definition at line 869 of file C4PropList.cpp.

870 {
871  C4String * k = &Strings.P[n];
872  if (Properties.Has(k))
873  {
874  return Properties.Get(k).Value.getPropList();
875  }
876  if (GetPrototype())
877  {
878  return GetPrototype()->GetPropertyPropList(n);
879  }
880  return nullptr;
881 }
C4PropList * GetPropertyPropList(C4PropertyName k) const
Definition: C4PropList.cpp:869

References C4Set< T >::Get(), C4PropList::GetPropertyPropList(), C4Value::getPropList(), C4PropList::GetPrototype(), C4Set< T >::Has(), C4StringTable::P, Strings, and C4Property::Value.

Referenced by C4MapScriptAlgoLayer::C4MapScriptAlgoLayer(), C4Game::DrawPropListSpecImage(), C4PropList::GetPropertyPropList(), and C4GameMessage::Init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropertyStr()

C4String * C4PropList::GetPropertyStr ( C4PropertyName  k) const
inherited

Definition at line 744 of file C4PropList.cpp.

745 {
746  C4String * k = &Strings.P[n];
747  if (Properties.Has(k))
748  {
749  return Properties.Get(k).Value.getStr();
750  }
751  if (GetPrototype())
752  {
753  return GetPrototype()->GetPropertyStr(n);
754  }
755  return nullptr;
756 }

References C4Set< T >::Get(), C4PropList::GetPropertyStr(), C4PropList::GetPrototype(), C4Value::getStr(), C4Set< T >::Has(), C4StringTable::P, Strings, and C4Property::Value.

Referenced by C4Game::DrawPropListSpecImage(), C4Object::ExecAction(), C4PropList::GetName(), C4PropListStatic::GetName(), C4PropList::GetPropertyStr(), C4Game::GetTranslatedString(), C4Object::SetAction(), C4Object::SetDir(), C4MouseControl::UpdateCursorTarget(), and C4GraphicsOverlay::UpdateFacet().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetPropListNumbered()

C4PropListNumbered * C4PropListNumbered::GetPropListNumbered ( )
overridevirtualinherited

Reimplemented from C4PropList.

Definition at line 151 of file C4PropList.cpp.

152 {
153  return this;
154 }

◆ GetPrototype()

◆ GetSortedLocalProperties() [1/2]

std::vector< C4String * > C4PropList::GetSortedLocalProperties ( bool  add_prototype = true) const
inherited

Definition at line 545 of file C4PropList.cpp.

546 {
547  // return property list without descending into prototype
548  std::list<const C4Property *> sorted_props = Properties.GetSortedListOfElementPointers();
549  std::vector< C4String * > result;
550  result.reserve(sorted_props.size() + add_prototype);
551  if (add_prototype) result.push_back(&::Strings.P[P_Prototype]); // implicit prototype for every prop list
552  for (auto p : sorted_props) result.push_back(p->Key);
553  return result;
554 }
@ P_Prototype

References C4Set< T >::GetSortedListOfElementPointers(), C4StringTable::P, P_Prototype, and Strings.

Referenced by C4PropList::FreezeAndMakeStaticRecursively(), and C4Game::GetTranslatedString().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetSortedLocalProperties() [2/2]

std::vector< C4String * > C4PropList::GetSortedLocalProperties ( const char *  prefix,
const C4PropList *  ignore_overridden 
) const
inherited

Definition at line 556 of file C4PropList.cpp.

557 {
558  // return property list without descending into prototype
559  // ignore properties that have been overridden by proplist given in ignore_overridden or any of its prototypes up to and excluding this
560  std::vector< C4String * > result;
561  for (const C4Property *pp = Properties.First(); pp; pp = Properties.Next(pp))
562  if (pp->Key != &::Strings.P[P_Prototype])
563  if (!prefix || pp->Key->GetData().BeginsWith(prefix))
564  {
565  // Override check
566  const C4PropList *check = ignore_overridden;
567  bool overridden = false;
568  if (check && check != this)
569  {
570  if (check->HasProperty(pp->Key)) { overridden = true; break; }
571  check = check->GetPrototype();
572  }
573  result.push_back(pp->Key);
574  }
575  // Sort
576  std::sort(result.begin(), result.end(), [](const C4String *a, const C4String *b) -> bool
577  {
578  return strcmp(a->GetCStr(), b->GetCStr()) < 0;
579  });
580  return result;
581 }
#define b
bool HasProperty(C4String *k) const
Definition: C4PropList.h:122

References a, b, C4Set< T >::First(), C4PropList::GetPrototype(), C4PropList::HasProperty(), C4Set< T >::Next(), C4StringTable::P, P_Prototype, and Strings.

Here is the call graph for this function:

◆ GetSortedProperties()

std::vector< C4String * > C4PropList::GetSortedProperties ( const char *  prefix,
C4PropList *  ignore_parent = nullptr 
) const
inherited

Definition at line 601 of file C4PropList.cpp.

602 {
603  struct sort_cmp {
604  bool operator() (const C4String *a, const C4String *b) const
605  {
606  return strcmp(a->GetCStr(), b->GetCStr()) < 0;
607  }
608  };
609  // Return property list with descending into prototype
610  // But do not include Prototype property
611  std::vector< C4String * > result = GetUnsortedProperties(prefix, ignore_parent);
612  // Sort and remove duplicates
613  std::set< C4String *, sort_cmp > result_set(result.begin(), result.end());
614  result.assign(result_set.begin(), result_set.end());
615  return result;
616 }
std::vector< C4String * > GetUnsortedProperties(const char *prefix, C4PropList *ignore_parent=nullptr) const
Definition: C4PropList.cpp:583

References a, b, and C4PropList::GetUnsortedProperties().

Here is the call graph for this function:

◆ GetUnsortedProperties()

std::vector< C4String * > C4PropList::GetUnsortedProperties ( const char *  prefix,
C4PropList *  ignore_parent = nullptr 
) const
inherited

Definition at line 583 of file C4PropList.cpp.

584 {
585  // Return property list with descending into prototype
586  // But do not include Prototype property
587  std::vector< C4String * > result;
588  const C4PropList *p = this;
589  do
590  {
591  for (const C4Property *pp = p->Properties.First(); pp; pp = p->Properties.Next(pp))
592  if (pp->Key != &::Strings.P[P_Prototype])
593  if (!prefix || pp->Key->GetData().BeginsWith(prefix))
594  result.push_back(pp->Key);
595  p = p->GetPrototype();
596  if (p == ignore_parent) break;
597  } while (p);
598  return result;
599 }

References C4Set< T >::First(), C4PropList::GetPrototype(), C4Set< T >::Next(), C4StringTable::P, P_Prototype, and Strings.

Referenced by C4PropList::GetSortedProperties(), and C4PropList::ThawRecursively().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HasProperty()

bool C4PropList::HasProperty ( C4String *  k) const
inlineinherited

Definition at line 122 of file C4PropList.h.

122 { return Properties.Has(k); }

References C4Set< T >::Has().

Referenced by C4AulScriptEngine::GetFunctionNames(), C4PropList::GetSortedLocalProperties(), C4MapScriptAlgo::GetXYProps(), and C4AulCompiler::ConstantResolver::visit().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Init()

C4Effect * C4Effect::Init ( C4PropList *  pForObj,
int32_t  iPrio,
const C4Value &  rVal1,
const C4Value &  rVal2,
const C4Value &  rVal3,
const C4Value &  rVal4 
)
protected

Definition at line 103 of file C4Effect.cpp.

104 {
105  Target = pForObj;
106  // ask all effects with higher priority first - except for prio 1 effects, which are considered out of the priority call chain (as per doc)
107  bool fRemoveUpper = (iPrio != 1);
108  // note that apart from denying the creation of this effect, higher priority effects may also remove themselves
109  // or do other things with the effect list
110  // (which does not quite make sense, because the effect might be denied by another effect)
111  // so the priority is assigned after this call, marking this effect dead before it's definitely valid
112  if (fRemoveUpper && pNext)
113  {
114  C4Effect * pEffect2 = pNext->Check(GetName(), iPrio, iInterval, rVal1, rVal2, rVal3, rVal4);
115  if (pEffect2)
116  {
117  // effect denied (iResult = -1), added to an effect (iResult = Number of that effect)
118  // or added to an effect that destroyed itself (iResult = -2)
119  if (pEffect2 != (C4Effect*)C4Fx_Effect_Deny && pEffect2 != (C4Effect*)C4Fx_Effect_Annul) return pEffect2;
120  // effect is still marked dead
121  return nullptr;
122  }
123  }
124  // init effect
125  // higher-priority effects must be deactivated temporarily, and then reactivated regarding the new effect
126  // higher-level effects should not be inserted during the process of removing or adding a lower-level effect
127  // because that would cause a wrong initialization order
128  // (hardly ever causing trouble, however...)
129  C4Effect *pLastRemovedEffect=nullptr;
130  C4AulFunc * pFn;
131  if (!GetCallbackScript())
132  {
133  Call(P_Construction, &C4AulParSet(rVal1, rVal2, rVal3, rVal4)).getInt();
134  if (pForObj && !pForObj->Status) return nullptr;
135  pFn = GetFunc(P_Start);
136  }
137  else
138  pFn = pFnStart;
139  if (fRemoveUpper && pNext && pFn)
140  TempRemoveUpperEffects(false, &pLastRemovedEffect);
141  // bad things may happen
142  if (pForObj && !pForObj->Status) return nullptr; // this will be invalid!
143  iPriority = iPrio; // validate effect now
144  if (CallStart(0, rVal1, rVal2, rVal3, rVal4) == C4Fx_Start_Deny)
145  // the effect denied to start: assume it hasn't, and mark it dead
146  SetDead();
147  if (fRemoveUpper && pNext && pFn)
148  TempReaddUpperEffects(pLastRemovedEffect);
149  if (pForObj && !pForObj->Status) return nullptr; // this will be invalid!
150  // Update OnFire cache
151  if (!IsDead() && pForObj && WildcardMatch(C4Fx_AnyFire, GetName()))
152  pForObj->SetOnFire(true);
153  return this;
154 }
@ P_Construction
C4Effect * Check(const char *szCheckEffect, int32_t iPrio, int32_t iTimer, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
Definition: C4Effect.cpp:249
int CallStart(int temporary, const C4Value &var1, const C4Value &var2, const C4Value &var3, const C4Value &var4)
Definition: C4Effect.cpp:427

References C4Fx_AnyFire, C4Fx_Effect_Annul, C4Fx_Effect_Deny, C4Fx_Start_Deny, C4PropList::Call(), CallStart(), Check(), GetCallbackScript(), C4PropList::GetFunc(), C4Value::getInt(), C4PropList::GetName(), iInterval, iPriority, IsDead(), P_Construction, P_Start, pFnStart, pNext, SetDead(), C4PropList::SetOnFire(), C4PropList::Status, Target, TempReaddUpperEffects(), TempRemoveUpperEffects(), and WildcardMatch().

Referenced by New().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsActive()

bool C4Effect::IsActive ( )
inline

Definition at line 112 of file C4Effect.h.

112 { return iPriority>0; } // returns whether effect is active

References iPriority.

Referenced by Kill(), and TempRemoveUpperEffects().

Here is the caller graph for this function:

◆ IsDead()

bool C4Effect::IsDead ( )
inline

Definition at line 110 of file C4Effect.h.

110 { return !iPriority; } // return whether effect is to be removed

References iPriority.

Referenced by ClearAll(), DoDamage(), Execute(), Get(), GetCount(), Init(), and Kill().

Here is the caller graph for this function:

◆ IsFrozen()

bool C4PropList::IsFrozen ( ) const
inlineinherited

Definition at line 135 of file C4PropList.h.

135 { return constant; }

Referenced by C4PropList::ThawRecursively().

Here is the caller graph for this function:

◆ IsInactiveAndNotDead()

bool C4Effect::IsInactiveAndNotDead ( )
inline

Definition at line 113 of file C4Effect.h.

113 { return iPriority<0; } // as the name says

References iPriority.

◆ IsNumbered()

bool C4PropListNumbered::IsNumbered ( ) const
inlineoverridevirtualinherited

Reimplemented from C4PropList.

Definition at line 225 of file C4PropList.h.

225 { return true; }

◆ IsStatic() [1/2]

virtual class C4PropListStatic* C4PropList::IsStatic ( )
inlinevirtualinherited

Reimplemented in C4PropListStatic.

Definition at line 89 of file C4PropList.h.

89 { return nullptr; }

Referenced by C4PropList::AppendDataString(), C4PropertyPath::C4PropertyPath(), CompileFunc(), C4Value::CompileFunc(), C4ScriptHost::CopyPropList(), C4Value::Denumerate(), C4AulExec::DirectExec(), C4PropList::FreezeAndMakeStaticRecursively(), C4ExtraScriptHost::GetPropList(), C4GameScriptHost::GetPropList(), C4PropList::ToJSON(), C4Value::ToJSON(), and C4AulCompiler::ConstexprEvaluator::visit().

Here is the caller graph for this function:

◆ IsStatic() [2/2]

const class C4PropListStatic* C4PropList::IsStatic ( ) const
inlineinherited

Definition at line 90 of file C4PropList.h.

90 { return const_cast<C4PropList*>(this)->IsStatic(); }

References C4PropList::IsStatic().

Referenced by C4PropList::IsStatic().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Kill()

void C4Effect::Kill ( )

Definition at line 343 of file C4Effect.cpp.

344 {
345  // active?
346  C4Effect *pLastRemovedEffect=nullptr;
347  if (IsActive())
348  // then temp remove all higher priority effects
349  TempRemoveUpperEffects(false, &pLastRemovedEffect);
350  else
351  // otherwise: temp reactivate before real removal
352  // this happens only if a lower priority effect removes an upper priority effect in its add- or removal-call
354  // remove this effect
355  int32_t iPrevPrio = iPriority; SetDead();
356  if (CallStop(C4FxCall_Normal, false) == C4Fx_Stop_Deny)
357  // effect denied to be removed: recover
358  iPriority = iPrevPrio;
359  // reactivate other effects
360  TempReaddUpperEffects(pLastRemovedEffect);
361  // Update OnFire cache
363  if (!Get(C4Fx_AnyFire))
364  Target->SetOnFire(false);
365  if (IsDead() && !GetCallbackScript())
367 }
#define C4FxCall_Normal
Definition: C4Effect.h:42
#define C4FxCall_TempAddForRemoval
Definition: C4Effect.h:44
bool IsActive()
Definition: C4Effect.h:112

References C4Fx_AnyFire, C4Fx_Stop_Deny, C4FxCall_Normal, C4FxCall_TempAddForRemoval, C4PropList::C4Value, C4PropList::Call(), CallStart(), CallStop(), Get(), GetCallbackScript(), C4PropList::GetName(), iPriority, IsActive(), IsDead(), P_Destruction, SetDead(), C4PropList::SetOnFire(), Target, TempReaddUpperEffects(), TempRemoveUpperEffects(), and WildcardMatch().

Referenced by Check(), and Execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ New() [1/3]

C4Effect * C4Effect::New ( C4PropList *  pForObj,
C4Effect **  ppEffectList,
C4PropList *  prototype,
int32_t  iPrio,
int32_t  iTimerInterval,
const C4Value &  rVal1,
const C4Value &  rVal2,
const C4Value &  rVal3,
const C4Value &  rVal4 
)
static

Definition at line 97 of file C4Effect.cpp.

98 {
99  C4Effect * pEffect = new C4Effect(ppEffectList, prototype, iPrio, iTimerInterval);
100  return pEffect->Init(pForObj, iPrio, rVal1, rVal2, rVal3, rVal4);
101 }
C4Effect * Init(C4PropList *pForObj, int32_t iPrio, const C4Value &rVal1, const C4Value &rVal2, const C4Value &rVal3, const C4Value &rVal4)
Definition: C4Effect.cpp:103

References C4Effect(), and Init().

Here is the call graph for this function:

◆ New() [2/3]

C4Effect * C4Effect::New ( C4PropList *  pForObj,
C4Effect **  ppEffectList,
C4String *  szName,
int32_t  iPrio,
int32_t  iTimerInterval,
C4PropList *  pCmdTarget,
const C4Value &  rVal1,
const C4Value &  rVal2,
const C4Value &  rVal3,
const C4Value &  rVal4 
)
static

Definition at line 91 of file C4Effect.cpp.

92 {
93  C4Effect * pEffect = new C4Effect(ppEffectList, szName, iPrio, iTimerInterval, pCmdTarget);
94  return pEffect->Init(pForObj, iPrio, rVal1, rVal2, rVal3, rVal4);
95 }

References C4Effect(), and Init().

Here is the call graph for this function:

◆ New() [3/3]

C4PropList * C4PropList::New ( C4PropList *  prototype = nullptr)
staticinherited

Definition at line 40 of file C4PropList.cpp.

41 {
42  C4PropList * r = new C4PropListScript(prototype);
43  return r;
44 }

Referenced by CompileNewFunc(), FnPlaceVegetation(), C4ScriptGuiWindowProperty::ToC4Value(), C4ScriptGuiWindow::ToC4Value(), and C4AulCompiler::ConstexprEvaluator::visit().

Here is the caller graph for this function:

◆ NewStatic()

C4PropListStatic * C4PropList::NewStatic ( C4PropList *  prototype,
const C4PropListStatic *  parent,
C4String *  key 
)
staticinherited

Definition at line 46 of file C4PropList.cpp.

47 {
48  return new C4PropListStatic(prototype, parent, key);
49 }

Referenced by C4PropListScen::C4PropListScen(), C4ScriptHost::CopyPropList(), C4PropList::FreezeAndMakeStaticRecursively(), C4ScenarioParameterDefs::RegisterScriptConstants(), and C4AulCompiler::ConstexprEvaluator::visit().

Here is the caller graph for this function:

◆ OnObjectChangedDef()

void C4Effect::OnObjectChangedDef ( C4PropList *  pObj)

Definition at line 482 of file C4Effect.cpp.

483 {
484  // safety
485  if (!pObj) return;
486  // check all effects for reassignment
487  C4Effect *pCheck = this;
488  while (pCheck)
489  {
490  if (pCheck->GetCallbackScript() == pObj)
491  pCheck->ReAssignCallbackFunctions();
492  pCheck = pCheck->pNext;
493  }
494 }
void ReAssignCallbackFunctions()
Definition: C4Effect.h:127

References GetCallbackScript(), pNext, and ReAssignCallbackFunctions().

Referenced by C4Object::ChangeDef().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator==()

bool C4PropList::operator== ( const C4PropList &  b) const
inherited

Definition at line 348 of file C4PropList.cpp.

349 {
350  // every numbered proplist has a unique number and is only identical to itself
351  if (this == &b) return true;
352  if (IsNumbered() || b.IsNumbered()) return false;
353  if (Properties.GetSize() != b.Properties.GetSize()) return false;
354  if (GetDef() != b.GetDef()) return false;
355  const C4Property * p = Properties.First();
356  while (p)
357  {
358  const C4Property & bp = b.Properties.Get(p->Key);
359  if (!bp) return false;
360  if (p->Value != bp.Value) return false;
361  p = Properties.Next(p);
362  }
363  return true;
364 }
virtual bool IsNumbered() const
Definition: C4PropList.h:92

References b, C4Set< T >::First(), C4PropList::GetDef(), C4Set< T >::GetSize(), C4PropList::IsNumbered(), C4Property::Key, C4Set< T >::Next(), and C4Property::Value.

Here is the call graph for this function:

◆ ReAssignAllCallbackFunctions()

void C4Effect::ReAssignAllCallbackFunctions ( )
inline

Definition at line 129 of file C4Effect.h.

130  {
133  }
void ReAssignAllCallbackFunctions()
Definition: C4Effect.h:129

References pNext, ReAssignAllCallbackFunctions(), and ReAssignCallbackFunctions().

Referenced by ReAssignAllCallbackFunctions(), C4AulScriptEngine::ReLink(), and C4Object::UpdateScriptPointers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReAssignCallbackFunctions()

void C4Effect::ReAssignCallbackFunctions ( )
inline

Definition at line 127 of file C4Effect.h.

References AssignCallbackFunctions().

Referenced by OnObjectChangedDef(), ReAssignAllCallbackFunctions(), and SetPropertyByS().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Register()

void C4Effect::Register ( C4Effect **  ppEffectList,
int32_t  iPrio 
)

Definition at line 71 of file C4Effect.cpp.

72 {
73  // get effect target
74  C4Effect *pCheck, *pPrev = *ppEffectList;
75  if (pPrev && Abs(pPrev->iPriority) < iPrio)
76  {
77  while ((pCheck = pPrev->pNext))
78  if (Abs(pCheck->iPriority) >= iPrio) break; else pPrev = pCheck;
79  // insert after previous
80  pNext = pPrev->pNext;
81  pPrev->pNext = this;
82  }
83  else
84  {
85  // insert as first effect
86  pNext = *ppEffectList;
87  *ppEffectList = this;
88  }
89 }

References Abs(), iPriority, and pNext.

Referenced by C4Effect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RemoveCyclicPrototypes()

void C4PropList::RemoveCyclicPrototypes ( )
inherited

Definition at line 399 of file C4PropList.cpp.

400 {
401  // clear any cyclic prototype chains
402  // Use prototype.getPropList() instead of GetPrototype() because denumeration might not be completed yet
403  for(C4PropList * it = prototype.getPropList(); it; it = it->prototype.getPropList())
404  if(it == this)
405  {
406  prototype.Set0();
407  }
408 }

References C4Value::getPropList(), and C4Value::Set0().

Referenced by C4PropList::Denumerate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ResetEnumerationIndex()

void C4PropListNumbered::ResetEnumerationIndex ( )
staticinherited

Definition at line 75 of file C4PropList.cpp.

76 {
77  assert(!PropLists.GetSize());
78  EnumerationIndex = 0;
79 }

References C4PropListNumbered::EnumerationIndex, C4Set< T >::GetSize(), and C4PropListNumbered::PropLists.

Referenced by C4Game::Clear().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ResetProperty()

void C4Effect::ResetProperty ( C4String *  k)
overridevirtual

Reimplemented from C4PropList.

Definition at line 625 of file C4Effect.cpp.

626 {
627  if (k >= &Strings.P[0] && k < &Strings.P[P_LAST])
628  {
629  switch(k - &Strings.P[0])
630  {
631  case P_Name:
632  throw C4AulExecError("effect: Name has to be a nonempty string");
633  case P_Priority:
634  throw C4AulExecError("effect: Priority is readonly");
635  case P_Interval: iInterval = 0; return;
636  case P_CommandTarget:
637  throw C4AulExecError("effect: CommandTarget is readonly");
638  case P_Target:
639  throw C4AulExecError("effect: Target is readonly");
640  case P_Time: iTime = 0; return;
641  case P_Prototype:
642  throw new C4AulExecError("effect: Prototype is readonly");
643  }
644  }
646 }
virtual void ResetProperty(C4String *k)
Definition: C4PropList.cpp:961

References iInterval, iTime, C4StringTable::P, P_CommandTarget, P_Interval, P_LAST, P_Name, P_Priority, P_Prototype, P_Target, P_Time, C4PropList::ResetProperty(), and Strings.

Here is the call graph for this function:

◆ SetDead()

void C4Effect::SetDead ( )

Definition at line 205 of file C4Effect.cpp.

206 {
207  iPriority = 0;
208 }

References iPriority.

Referenced by ClearAll(), ClearPointers(), Init(), and Kill().

Here is the caller graph for this function:

◆ SetEnumerationIndex()

void C4PropListNumbered::SetEnumerationIndex ( int32_t  iMaxObjectNumber)
staticinherited

Definition at line 69 of file C4PropList.cpp.

70 {
71  // update object enumeration index now, because calls like OnSynchronized might create objects
72  EnumerationIndex = std::max(EnumerationIndex, iMaxObjectNumber);
73 }

References C4PropListNumbered::EnumerationIndex.

Referenced by C4Game::CheckObjectEnumeration(), and C4GameObjects::PostLoad().

Here is the caller graph for this function:

◆ SetName()

void C4PropList::SetName ( const char *  NewName = nullptr)
virtualinherited

Reimplemented in C4Object.

Definition at line 625 of file C4PropList.cpp.

626 {
627  if (!NewName)
629  else
630  {
631  SetProperty(P_Name, C4VString(NewName));
632  }
633 }

References C4VString(), C4StringTable::P, P_Name, C4PropList::ResetProperty(), C4PropList::SetProperty(), and Strings.

Referenced by c4_mapgen_handle_set_map_library(), C4MapScriptHost::InitFunctionMap(), and C4Object::SetName().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetOnFire()

virtual void C4PropList::SetOnFire ( bool  OnFire)
inlinevirtualinherited

Reimplemented in C4Object.

Definition at line 73 of file C4PropList.h.

73 { }

Referenced by ClearAll(), Init(), Kill(), TempReaddUpperEffects(), and TempRemoveUpperEffects().

Here is the caller graph for this function:

◆ SetProperty()

void C4PropList::SetProperty ( C4PropertyName  k,
const C4Value &  to 
)
inlineinherited

Definition at line 124 of file C4PropList.h.

125  { SetPropertyByS(&Strings.P[k], to); }
virtual void SetPropertyByS(C4String *k, const C4Value &to)
Definition: C4PropList.cpp:940

References C4StringTable::P, C4PropList::SetPropertyByS(), and Strings.

Referenced by C4Game::AllocateTranslatedString(), C4Effect(), C4Object::ChangeDef(), C4Object::Init(), C4DefScriptHost::Parse(), C4ScriptHost::Preparse(), C4Object::SetAction(), C4PropList::SetName(), C4ScriptGuiWindow::ToC4Value(), C4ScriptHost::UnLink(), and C4MapScriptLayer::UpdateSurfaceSize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetPropertyByS()

void C4Effect::SetPropertyByS ( C4String *  k,
const C4Value &  to 
)
overridevirtual

Reimplemented from C4PropList.

Definition at line 598 of file C4Effect.cpp.

599 {
600  if (k >= &Strings.P[0] && k < &Strings.P[P_LAST])
601  {
602  switch(k - &Strings.P[0])
603  {
604  case P_Name:
605  if (!to.getStr() || !*to.getStr()->GetCStr())
606  throw C4AulExecError("effect: Name has to be a nonempty string");
609  return;
610  case P_Priority:
611  throw C4AulExecError("effect: Priority is readonly");
612  case P_Interval: iInterval = to.getInt(); return;
613  case P_CommandTarget:
614  throw C4AulExecError("effect: CommandTarget is readonly");
615  case P_Target:
616  throw C4AulExecError("effect: Target is readonly");
617  case P_Time: iTime = to.getInt(); return;
618  case P_Prototype:
619  throw new C4AulExecError("effect: Prototype is readonly");
620  }
621  }
623 }
const char * GetCStr() const
Definition: C4StringTable.h:49

References C4String::GetCStr(), C4Value::getInt(), C4Value::getStr(), iInterval, iTime, C4StringTable::P, P_CommandTarget, P_Interval, P_LAST, P_Name, P_Priority, P_Prototype, P_Target, P_Time, ReAssignCallbackFunctions(), C4PropList::SetPropertyByS(), and Strings.

Here is the call graph for this function:

◆ ShelveNumberedPropLists()

void C4PropListNumbered::ShelveNumberedPropLists ( )
staticinherited

Definition at line 81 of file C4PropList.cpp.

82 {
83  // unnumber all proplists and put them on the shelve. To be used on remaining objects before a savegame load.
84  assert(ShelvedPropLists.empty());
86  C4PropListNumbered *const* p_next = PropLists.First(), *const* p;
87  while ((p = p_next))
88  {
89  p_next = PropLists.Next(p);
90  C4PropListNumbered *pl = *p;
91  if (pl->Number != -1)
92  {
93  pl->ClearNumber();
94  ShelvedPropLists.push_back(pl);
95  }
96  }
97 }

References C4PropListNumbered::ClearNumber(), C4Set< T >::First(), C4Set< T >::GetSize(), C4Set< T >::Next(), C4PropListNumbered::Number, C4PropListNumbered::PropLists, and C4PropListNumbered::ShelvedPropLists.

Referenced by C4Game::CompileFunc().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ TempReaddUpperEffects()

void C4Effect::TempReaddUpperEffects ( C4Effect *  pLastReaddEffect)
protected

Definition at line 521 of file C4Effect.cpp.

522 {
523  // nothing to do? - this will also happen if TempRemoveUpperEffects did nothing due to priority==1
524  if (!pLastReaddEffect) return;
525  if (Target && !Target->Status) return; // this will be invalid!
526  // simply activate all following, inactive effects
527  for (C4Effect *pEff = pNext; pEff; pEff = pEff->pNext)
528  {
529  if (pEff->IsInactiveAndNotDead())
530  {
531  pEff->FlipActive();
532  if (pEff->iPriority!=1) pEff->CallStart(C4FxCall_Temp, C4Value(), C4Value(), C4Value(), C4Value());
533  if (Target && WildcardMatch(C4Fx_AnyFire, pEff->GetName()))
534  Target->SetOnFire(true);
535  }
536  // done?
537  if (pEff == pLastReaddEffect) break;
538  }
539 }
#define C4FxCall_Temp
Definition: C4Effect.h:43

References C4Fx_AnyFire, C4FxCall_Temp, C4PropList::C4Value, pNext, C4PropList::SetOnFire(), C4PropList::Status, Target, and WildcardMatch().

Referenced by Check(), Init(), and Kill().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ TempRemoveUpperEffects()

void C4Effect::TempRemoveUpperEffects ( bool  fTempRemoveThis,
C4Effect **  ppLastRemovedEffect 
)
protected

Definition at line 496 of file C4Effect.cpp.

497 {
498  if (Target && !Target->Status) return; // this will be invalid!
499  // priority=1: no callbacks
500  if (iPriority == 1) return;
501  // remove from high to low priority
502  // recursive implementation...
503  C4Effect *pEff = pNext;
504  while (pEff) if (pEff->IsActive()) break; else pEff = pEff->pNext;
505  // temp remove active effects with higher priority
506  if (pEff) pEff->TempRemoveUpperEffects(true, ppLastRemovedEffect);
507  // temp remove this
508  if (fTempRemoveThis)
509  {
510  FlipActive();
511  // Update OnFire cache
513  if (!Get(C4Fx_AnyFire))
514  Target->SetOnFire(false);
515  // temp callbacks only for higher priority effects
516  if (iPriority!=1) CallStop(C4FxCall_Temp, true);
517  if (!*ppLastRemovedEffect) *ppLastRemovedEffect = this;
518  }
519 }
void FlipActive()
Definition: C4Effect.h:111

References C4Fx_AnyFire, C4FxCall_Temp, CallStop(), FlipActive(), Get(), C4PropList::GetName(), iPriority, IsActive(), pNext, C4PropList::SetOnFire(), C4PropList::Status, Target, TempRemoveUpperEffects(), and WildcardMatch().

Referenced by Check(), Init(), Kill(), and TempRemoveUpperEffects().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Thaw()

void C4PropList::Thaw ( )
inlineinherited

Definition at line 133 of file C4PropList.h.

133 { constant = false; }

Referenced by C4PropList::ThawRecursively(), and C4ScriptHost::UnlinkOwnedFunctions().

Here is the caller graph for this function:

◆ ThawRecursively()

void C4PropList::ThawRecursively ( )
inherited

Definition at line 259 of file C4PropList.cpp.

260 {
261  //thaw self and all owned properties
262  Thaw();
263  //C4PropListStatic *s = IsStatic();
264  //if (s) LogF("Thaw: %s", s->GetDataString().getData());
265  auto prop_names = GetUnsortedProperties(nullptr, ::ScriptEngine.GetPropList());
266  for (auto prop_name : prop_names)
267  {
268  C4Value child_val;
269  GetPropertyByS(prop_name, &child_val);
270  //LogF(" %s=%s", prop_name->GetCStr(), child_val.GetDataString(1).getData());
271  C4PropList *child_proplist = child_val.getPropList();
272  if (child_proplist && child_proplist->IsFrozen())
273  {
274  child_proplist->ThawRecursively();
275  }
276  }
277 }
C4PropListStatic * GetPropList()
Definition: C4Aul.h:151
bool IsFrozen() const
Definition: C4PropList.h:135
void Thaw()
Definition: C4PropList.h:133
void ThawRecursively()
Definition: C4PropList.cpp:259

References C4PropList::GetPropertyByS(), C4AulScriptEngine::GetPropList(), C4Value::getPropList(), C4PropList::GetUnsortedProperties(), C4PropList::IsFrozen(), ScriptEngine, C4PropList::Thaw(), and C4PropList::ThawRecursively().

Referenced by C4PropList::ThawRecursively(), and C4AulScriptEngine::UnLink().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ToJSON()

StdStrBuf C4PropList::ToJSON ( int  depth = 10,
bool  ignore_reference_parent = false 
) const
inherited

Definition at line 515 of file C4PropList.cpp.

516 {
517  if (depth <= 0 && Properties.GetSize())
518  {
519  throw new C4JSONSerializationError("maximum depth reached");
520  }
521  StdStrBuf DataString;
522  DataString = "{";
523  bool has_elements = false;
524  // Append prototype
525  if (prototype)
526  {
527  DataString.Append("Prototype:");
528  DataString.Append(prototype.ToJSON(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
529  has_elements = true;
530  }
531  // Append other properties
532  std::list<const C4Property *> sorted_props = Properties.GetSortedListOfElementPointers();
533  for (std::list<const C4Property *>::const_iterator p = sorted_props.begin(); p != sorted_props.end(); ++p)
534  {
535  if (has_elements) DataString.Append(",");
536  DataString.Append(C4Value((*p)->Key).ToJSON());
537  DataString.Append(":");
538  DataString.Append((*p)->Value.ToJSON(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
539  has_elements = true;
540  }
541  DataString.Append("}");
542  return DataString;
543 }
StdStrBuf ToJSON(int depth=10, const class C4PropListStatic *ignore_reference_parent=nullptr) const
Definition: C4Value.cpp:189

References StdStrBuf::Append(), C4PropList::begin(), C4PropList::C4Value, C4PropList::end(), C4Set< T >::GetSize(), C4Set< T >::GetSortedListOfElementPointers(), C4PropList::IsStatic(), and C4Value::ToJSON().

Referenced by C4Value::ToJSON().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UnshelveNumberedPropLists()

void C4PropListNumbered::UnshelveNumberedPropLists ( )
staticinherited

Definition at line 99 of file C4PropList.cpp.

100 {
101  // re-insert shelved proplists into main list and give them a number
102  for (auto & ShelvedPropList : ShelvedPropLists)
103  ShelvedPropList->AcquireNumber();
104  ShelvedPropLists.clear();
105 }

References C4PropListNumbered::ShelvedPropLists.

Referenced by C4Game::LoadScenarioSection(), and C4GameObjects::PostLoad().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ CompileNewFunc

template<class T , typename ... P>
void CompileNewFunc ( T *&  ,
StdCompiler *  ,
P &&  ... 
)
friend

Member Data Documentation

◆ CommandTarget

C4Value C4Effect::CommandTarget
protected

◆ EnumerationIndex

int32_t C4PropListNumbered::EnumerationIndex = 0
staticprotectedinherited

◆ iInterval

int32_t C4Effect::iInterval

◆ iPriority

◆ iTime

int32_t C4Effect::iTime

Definition at line 73 of file C4Effect.h.

Referenced by C4Effect(), CompileFunc(), Execute(), GetPropertyByS(), ResetProperty(), and SetPropertyByS().

◆ Number

◆ pFnDamage

C4AulFunc* C4Effect::pFnDamage
protected

Definition at line 84 of file C4Effect.h.

Referenced by AssignCallbackFunctions(), and CallDamage().

◆ pFnEffect

C4AulFunc* C4Effect::pFnEffect
protected

Definition at line 83 of file C4Effect.h.

Referenced by AssignCallbackFunctions(), and CallEffect().

◆ pFnStart

C4AulFunc* C4Effect::pFnStart
protected

Definition at line 82 of file C4Effect.h.

Referenced by AssignCallbackFunctions(), CallStart(), and Init().

◆ pFnStop

C4AulFunc * C4Effect::pFnStop
protected

Definition at line 82 of file C4Effect.h.

Referenced by AssignCallbackFunctions(), and CallStop().

◆ pFnTimer

C4AulFunc* C4Effect::pFnTimer
protected

Definition at line 81 of file C4Effect.h.

Referenced by AssignCallbackFunctions(), and CallTimer().

◆ pNext

◆ PropLists

◆ ShelvedPropLists

std::vector< C4PropListNumbered * > C4PropListNumbered::ShelvedPropLists
staticprotectedinherited

◆ Status

int32_t C4PropList::Status {1}
inherited

Definition at line 173 of file C4PropList.h.

Referenced by C4Command::Acquire(), C4Command::Activate(), C4GameObjects::Add(), C4ObjectList::Add(), C4FoW::Add(), C4EditCursor::AddToSelection(), C4Object::AssignDeath(), C4ObjectList::AssignInfo(), C4Object::AssignRemoval(), C4Object::At(), C4PropList::Call(), C4Game::CastObjects(), C4ObjectList::CheckCategorySort(), C4ObjectList::CheckSort(), ClearAll(), C4ObjectList::ClearInfo(), C4Object::Collect(), C4ObjectList::CompileFunc(), C4Object::CompileFunc(), C4GameObjects::CrossCheck(), C4ObjectList::DeleteObjects(), C4ObjectList::Denumerate(), C4Landscape::P::DigMaterial2Objects(), C4Object::DirectComContents(), DoDamage(), C4Object::Draw(), C4Game::DrawCrewOverheadText(), C4Object::DrawSelectMark(), C4Object::DrawTopFace(), C4EditCursor::EMMoveObject(), C4Object::Enter(), C4Object::Execute(), C4SoundInstance::Execute(), Execute(), C4ScriptGuiWindowAction::ExecuteCommand(), C4Command::Fail(), C4ObjectList::Find(), C4FindObject::Find(), C4ObjectList::FindOther(), C4GameObjects::FixObjectOrder(), C4PropList::FreezeAndMakeStaticRecursively(), C4Object::GetArea(), C4EditCursor::GetCurrentSelectionPosition(), C4Object::GetEntranceArea(), C4Object::GetInfoString(), C4ObjectList::GetListID(), C4Object::GetMomentum(), C4ObjectList::GetObject(), C4Object::GrabInfo(), GrabLost(), C4GameObjects::GRBroadcast(), Init(), C4GameMessage::Init(), C4Object::IsMoveableBySolidMask(), C4GraphicsOverlay::IsValid(), C4Object::Lift(), C4Player::MakeCrewMember(), C4ObjectList::MassCount(), C4Object::MenuCommand(), C4GameMessageList::New(), C4Game::NewObject(), ObjectComGrab(), ObjectComUnGrab(), C4ObjectList::ObjectCount(), C4EditCursor::PerformDuplicationLegacy(), C4Landscape::P::PostFreeShape(), C4GameObjects::PostLoad(), C4Object::Push(), C4GameObjects::Remove(), C4EditCursor::RemoveFromSelection(), C4AulScriptContext::ReturnDump(), C4GameObjects::SafeObjectPointer(), C4Object::SetAction(), C4Object::SetGraphics(), C4GameObjects::SetOCF(), C4Object::SetOCF(), C4Object::StatusActivate(), C4Object::StatusDeactivate(), TempReaddUpperEffects(), TempRemoveUpperEffects(), C4ObjectList::UpdateFaces(), C4ObjectList::UpdateGraphics(), C4Object::UpdateOCF(), C4Object::UpdatePos(), C4Object::UpdateSolidMask(), C4GameObjects::UpdateSolidMasks(), C4ObjectList::ValidateOwners(), and C4ObjectList::Write().

◆ Target

C4PropList* C4Effect::Target
protected

The documentation for this class was generated from the following files: