OpenClonk
C4Object Class Reference

#include <C4Object.h>

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

Public Types

enum  DrawMode { ODM_Normal =0, ODM_Overlay =1, ODM_BaseOnly =2 }
 
enum  { SAC_StartCall = 1, SAC_EndCall = 2, SAC_AbortCall = 4 }
 

Public Member Functions

 C4Object ()
 
 ~C4Object () override
 
void ClearParticleLists ()
 
void Resort ()
 
void SetPlane (int32_t z)
 
int32_t GetPlane () const
 
int32_t GetSolidMaskPlane () const
 
void SetCommand (int32_t iCommand, C4Object *pTarget, C4Value iTx, int32_t iTy=0, C4Object *pTarget2=nullptr, bool fControl=false, C4Value iData=C4VNull, int32_t iRetries=0, C4String *szText=nullptr)
 
void SetCommand (int32_t iCommand, C4Object *pTarget=nullptr, int32_t iTx=0, int32_t iTy=0, C4Object *pTarget2=nullptr, bool fControl=false, C4Value iData=C4VNull, int32_t iRetries=0, C4String *szText=nullptr)
 
bool AddCommand (int32_t iCommand, C4Object *pTarget, C4Value iTx, int32_t iTy=0, int32_t iUpdateInterval=0, C4Object *pTarget2=nullptr, bool fInitEvaluation=true, C4Value iData=C4VNull, bool fAppend=false, int32_t iRetries=0, C4String *szText=nullptr, int32_t iBaseMode=0)
 
bool AddCommand (int32_t iCommand, C4Object *pTarget=nullptr, int32_t iTx=0, int32_t iTy=0, int32_t iUpdateInterval=0, C4Object *pTarget2=nullptr, bool fInitEvaluation=true, C4Value iData=C4VNull, bool fAppend=false, int32_t iRetries=0, C4String *szText=nullptr, int32_t iBaseMode=0)
 
C4CommandFindCommand (int32_t iCommandType) const
 
void ClearCommand (C4Command *pUntil)
 
void ClearCommands ()
 
void DrawSelectMark (C4TargetFacet &cgo) const
 
void UpdateActionFace ()
 
void SyncClearance ()
 
void SetSolidMask (int32_t iX, int32_t iY, int32_t iWdt, int32_t iHgt, int32_t iTX, int32_t iTY)
 
void SetHalfVehicleSolidMask (bool set)
 
bool CheckSolidMaskRect ()
 
bool MenuCommand (const char *szCommand)
 
void Clear ()
 
void ClearInfo (C4ObjectInfo *pInfo)
 
bool AssignInfo ()
 
bool ValidateOwner ()
 
bool AssignLightRange ()
 
void DrawPicture (C4Facet &cgo, bool fSelected=false, C4DrawTransform *transform=nullptr)
 
void Picture2Facet (C4FacetSurface &cgo)
 
void Default ()
 
bool Init (C4PropList *ndef, C4Object *pCreator, int32_t owner, C4ObjectInfo *info, int32_t nx, int32_t ny, int32_t nr, C4Real nxdir, C4Real nydir, C4Real nrdir, int32_t iController)
 
void CompileFunc (StdCompiler *pComp, C4ValueNumbers *)
 
void Denumerate (C4ValueNumbers *) override
 
void DrawLine (C4TargetFacet &cgo, int32_t at_player)
 
bool SetPhase (int32_t iPhase)
 
void AssignRemoval (bool fExitContents=false)
 
void Draw (C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
 
void DrawTopFace (C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
 
void DrawActionFace (C4TargetFacet &cgo, float offX, float offY) const
 
void DrawFace (C4TargetFacet &cgo, float offX, float offY, int32_t iPhaseX=0, int32_t iPhaseY=0) const
 
void DrawFaceImpl (C4TargetFacet &cgo, bool action, float fx, float fy, float fwdt, float fhgt, float tx, float ty, float twdt, float thgt, C4DrawTransform *transform) const
 
void Execute ()
 
void ClearPointers (C4Object *ptr)
 
bool ExecMovement ()
 
void ExecAction ()
 
bool ExecLife ()
 
bool ExecuteCommand ()
 
void AssignDeath (bool fForced)
 
void ContactAction ()
 
void NoAttachAction ()
 
void DoMovement ()
 
void Stabilize ()
 
void SetOCF ()
 
void UpdateOCF ()
 
void UpdateShape (bool bUpdateVertices=true)
 
void UpdatePos ()
 
void UpdateSolidMask (bool fRestoreAttachedObjects)
 
void UpdateMass ()
 
bool ChangeDef (C4ID idNew)
 
void UpdateFace (bool bUpdateShape, bool fTemp=false)
 
void UpdateGraphics (bool fGraphicsChanged, bool fTemp=false)
 
void UpdateFlipDir ()
 
bool At (int32_t ctx, int32_t cty) const
 
bool At (int32_t ctx, int32_t cty, DWORD &ocf) const
 
void GetOCFForPos (int32_t ctx, int32_t cty, DWORD &ocf) const
 
bool CloseMenu (bool fForce)
 
bool ActivateMenu (int32_t iMenu, int32_t iMenuSelect=0, int32_t iMenuData=0, int32_t iMenuPosition=0, C4Object *pTarget=nullptr)
 
int32_t ContactCheck (int32_t atx, int32_t aty, uint32_t *border_hack_contacts=nullptr, bool collide_halfvehic=false)
 
bool Contact (int32_t cnat)
 
void StopAndContact (C4Real &ctco, C4Real limit, C4Real &speed, int32_t cnat)
 
C4PropListGetAction () const
 
bool SetAction (C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
 
bool SetActionByName (C4String *ActName, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
 
bool SetActionByName (const char *szActName, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
 
void SetDir (int32_t tdir)
 
void SetCategory (int32_t Category)
 
int32_t GetProcedure () const
 
bool Enter (C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
 
bool Exit (int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
 
void CopyMotion (C4Object *from)
 
void ForcePosition (C4Real tx, C4Real ty)
 
void MovePosition (int32_t dx, int32_t dy)
 
void MovePosition (C4Real dx, C4Real dy)
 
void DoMotion (int32_t mx, int32_t my)
 
bool ActivateEntrance (int32_t by_plr, C4Object *by_obj)
 
void DoDamage (int32_t iLevel, int32_t iCausedByPlr, int32_t iCause)
 
void DoEnergy (int32_t iChange, bool fExact, int32_t iCause, int32_t iCausedByPlr)
 
void UpdatLastEnergyLossCause (int32_t iNewCausePlr)
 
void DoBreath (int32_t iChange)
 
void DoCon (int32_t iChange, bool grow_from_center)
 
int32_t GetCon () const
 
void DoExperience (int32_t change)
 
bool Promote (int32_t torank, bool exception, bool fForceRankName)
 
bool Push (C4Real txdir, C4Real dforce, bool fStraighten)
 
bool Lift (C4Real tydir, C4Real dforce)
 
void Fling (C4Real txdir, C4Real tydir, bool fAddSpeed)
 
C4ObjectCreateContents (C4PropList *)
 
bool CreateContentsByList (C4IDList &idlist)
 
BYTE GetArea (int32_t &aX, int32_t &aY, int32_t &aWdt, int32_t &aHgt) const
 
int32_t addtop () const
 
int32_t Left () const
 
int32_t Top () const
 
int32_t Width () const
 
int32_t Height () const
 
int32_t GetX () const
 
int32_t GetY () const
 
int32_t GetR () const
 
C4Real GetFixedX () const
 
C4Real GetFixedY () const
 
C4Real GetFixedR () const
 
BYTE GetEntranceArea (int32_t &aX, int32_t &aY, int32_t &aWdt, int32_t &aHgt) const
 
BYTE GetMomentum (C4Real &rxdir, C4Real &rydir) const
 
C4Real GetSpeed () const
 
StdStrBuf GetDataString ()
 
void SetName (const char *NewName=nullptr) override
 
int32_t GetValue (C4Object *pInBase, int32_t iForPlayer)
 
bool SetOwner (int32_t iOwner)
 
bool SetLightRange (int32_t iToRange, int32_t iToFadeoutRange)
 
uint32_t GetLightColor () const
 
bool SetLightColor (uint32_t iValue)
 
void SetOnFire (bool OnFire) override
 
bool GetOnFire () const
 
void SetAlive (bool Alive)
 
bool GetAlive () const
 
void UpdateLight ()
 
void SetAudibilityAt (C4TargetFacet &cgo, int32_t iX, int32_t iY, int32_t player)
 
bool IsVisible (int32_t iForPlr, bool fAsOverlay) const
 
void SetRotation (int32_t nr)
 
void PrepareDrawing () const
 
void FinishedDrawing () const
 
void DrawSolidMask (C4TargetFacet &cgo) const
 
bool Collect (C4Object *pObj)
 
bool GrabInfo (C4Object *pFrom)
 
bool ShiftContents (bool fShiftBack, bool fDoCalls)
 
void DirectComContents (C4Object *pTarget, bool fDoCalls)
 
void GetParallaxity (int32_t *parX, int32_t *parY) const
 
bool GetDrawPosition (const C4TargetFacet &cgo, float &resultx, float &resulty, float &resultzoom) const
 
bool GetDrawPosition (const C4TargetFacet &cgo, float x, float y, float zoom, float &resultx, float &resulty, float &resultzoom) const
 
bool IsInLiquidCheck () const
 
void UpdateInLiquid ()
 
void GrabContents (C4Object *pFrom)
 
bool GetDragImage (C4Object **drag_object, C4Def **drag_id) const
 
int32_t AddObjectAndContentsToArray (C4ValueArray *target_array, int32_t index=0)
 
void BoundsCheck (C4Real &ctcox, C4Real &ctcoy)
 
bool DoSelect ()
 
void UnSelect ()
 
void GetViewPos (float &riX, float &riY, float tx, float ty, const C4Facet &fctViewport) const
 
void GetViewPosPar (float &riX, float &riY, float tx, float ty, const C4Facet &fctViewport) const
 
bool PutAwayUnusedObject (C4Object *pToMakeRoomForObject)
 
C4DefGraphicsGetGraphics () const
 
bool SetGraphics (const char *szGraphicsName=nullptr, C4Def *pSourceDef=nullptr)
 
bool SetGraphics (C4DefGraphics *pNewGfx, bool fUpdateData)
 
class C4GraphicsOverlayGetGraphicsOverlay (int32_t iForID) const
 
class C4GraphicsOverlayGetGraphicsOverlay (int32_t iForID, bool fCreate)
 
bool RemoveGraphicsOverlay (int32_t iOverlayID)
 
bool HasGraphicsOverlayRecursion (const C4Object *pCheckObj) const
 
void UpdateScriptPointers ()
 
bool StatusActivate ()
 
bool StatusDeactivate (bool fClearPointers)
 
void ClearContentsAndContained (bool fDoCalls=true)
 
bool AdjustWalkRotation (int32_t iRangeX, int32_t iRangeY, int32_t iSpeed)
 
StdStrBuf GetInfoString ()
 
bool CanConcatPictureWith (C4Object *pOtherObject) const
 
bool IsMoveableBySolidMask (int ComparisonPlane) const
 
bool IsPlayerObject (int32_t iPlayerNumber=NO_OWNER) const
 
bool IsUserPlayerObject ()
 
C4ObjectGetObject () override
 
C4Object const * GetObject () const override
 
void SetPropertyByS (C4String *k, const C4Value &to) override
 
void ResetProperty (C4String *k) override
 
bool GetPropertyByS (const C4String *k, C4Value *pResult) const override
 
C4ValueArrayGetProperties () const override
 
C4PropListNumberedGetPropListNumbered () override
 
bool IsNumbered () const override
 
virtual const char * GetName () const
 
virtual C4Def const * GetDef () const
 
virtual C4DefGetDef ()
 
virtual C4EffectGetEffect ()
 
virtual class C4MapScriptLayerGetMapScriptLayer ()
 
virtual class C4MapScriptMapGetMapScriptMap ()
 
C4PropListGetPrototype () const
 
void RemoveCyclicPrototypes ()
 
virtual class C4PropListStaticIsStatic ()
 
const class C4PropListStaticIsStatic () const
 
virtual bool Delete ()
 
bool GetProperty (C4PropertyName k, C4Value *pResult) const
 
C4StringGetPropertyStr (C4PropertyName k) const
 
C4ValueArrayGetPropertyArray (C4PropertyName n) const
 
C4AulFuncGetFunc (C4PropertyName k) const
 
C4AulFuncGetFunc (C4String *k) const
 
C4AulFuncGetFunc (const char *k) const
 
C4StringEnumerateOwnFuncs (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
 
C4PropListGetPropertyPropList (C4PropertyName k) const
 
bool HasProperty (C4String *k) const
 
void SetProperty (C4PropertyName k, const C4Value &to)
 
void Freeze ()
 
void Thaw ()
 
void ThawRecursively ()
 
bool IsFrozen () const
 
C4PropListStaticFreezeAndMakeStaticRecursively (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 C4PropListGetByNumber (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 C4PropListNew (C4PropList *prototype=nullptr)
 
static C4PropListStaticNewStatic (C4PropList *prototype, const C4PropListStatic *parent, C4String *key)
 

Public Attributes

C4ID id
 
int32_t RemovalDelay
 
int32_t Owner
 
int32_t Controller
 
int32_t LastEnergyLossCausePlayer
 
int32_t Category
 
int32_t old_x
 
int32_t old_y
 
C4LArea Area
 
int32_t Mass
 
int32_t OwnMass
 
int32_t Damage
 
int32_t Energy
 
int32_t Breath
 
int32_t InMat
 
uint32_t Color
 
int32_t Audible
 
int32_t AudiblePan
 
int32_t AudiblePlayer
 
int32_t lightRange
 
int32_t lightFadeoutRange
 
uint32_t lightColor
 
C4Real fix_x
 
C4Real fix_y
 
C4Real fix_r
 
C4Real xdir
 
C4Real ydir
 
C4Real rdir
 
int32_t iLastAttachMovementFrame
 
bool Mobile
 
bool Unsorted
 
bool Initializing
 
bool InLiquid
 
bool EntranceStatus
 
uint32_t t_contact
 
uint32_t OCF
 
uint32_t Marker
 
C4ObjectPtr Layer
 
C4DrawTransformpDrawTransform
 
class C4ObjectMenuMenu
 
C4Facet TopFace
 
C4DefDef
 
C4ObjectPtr Contained
 
C4ObjectInfoInfo
 
C4Action Action
 
C4Shape Shape
 
bool fOwnVertices
 
C4TargetRect SolidMask
 
bool HalfVehicleSolidMask
 
C4Rect PictureRect
 
C4NotifyingObjectList Contents
 
C4MaterialListMaterialContents
 
C4DefGraphicspGraphics
 
StdMeshInstancepMeshInstance
 
C4EffectpEffects
 
class C4ParticleListFrontParticles
 
class C4ParticleListBackParticles
 
uint32_t ColorMod
 
uint32_t BlitMode
 
bool CrewDisabled
 
C4CommandCommand
 
StdCopyStrBuf nInfo
 
class C4GraphicsOverlaypGfxOverlay
 
int32_t Number {-1}
 
int32_t Status {1}
 

Protected Member Functions

void SideBounds (C4Real &ctcox)
 
void VerticalBounds (C4Real &ctcoy)
 
void AcquireNumber ()
 
void ClearNumber ()
 
void ClearRefs ()
 

Protected Attributes

bool OnFire
 
int32_t Con
 
int32_t Plane
 
bool Alive
 
C4SolidMaskpSolidMaskData
 

Static Protected Attributes

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

Detailed Description

Definition at line 100 of file C4Object.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
SAC_StartCall 
SAC_EndCall 
SAC_AbortCall 

Definition at line 252 of file C4Object.h.

◆ DrawMode

Enumerator
ODM_Normal 
ODM_Overlay 
ODM_BaseOnly 

Definition at line 217 of file C4Object.h.

Constructor & Destructor Documentation

◆ C4Object()

C4Object::C4Object ( )

Definition at line 85 of file C4Object.cpp.

References C4Action::Default().

86 {
87  FrontParticles = BackParticles = nullptr;
88  Default();
89 }
class C4ParticleList * BackParticles
Definition: C4Object.h:159
void Default()
Definition: C4Object.cpp:91
class C4ParticleList * FrontParticles
Definition: C4Object.h:159
Here is the call graph for this function:

◆ ~C4Object()

C4Object::~C4Object ( )
override

Definition at line 236 of file C4Object.cpp.

References C4LSectors::AssertObjectNotInList(), Objects, and C4GameObjects::Sectors.

237 {
238  Clear();
239 
240 #if defined(_DEBUG)
241  // debug: mustn't be listed in any list now
243 #endif
244 }
void Clear()
Definition: C4Object.cpp:2436
void AssertObjectNotInList(C4Object *pObj)
Definition: C4Sector.cpp:185
C4LSectors Sectors
Definition: C4GameObjects.h:42
C4GameObjects Objects
Definition: C4Globals.cpp:48
Here is the call graph for this function:

Member Function Documentation

◆ AcquireNumber()

void C4PropListNumbered::AcquireNumber ( )
protectedinherited

Definition at line 155 of file C4PropList.cpp.

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

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

156 {
157  // Enumerate object
158  do
160  while (PropLists.Get(Number));
161  // Add to list
162  PropLists.Add(this);
163 }
T * Add(T const &e)
T & Get(H e) const
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
static int32_t EnumerationIndex
Definition: C4PropList.h:238
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ActivateEntrance()

bool C4Object::ActivateEntrance ( int32_t  by_plr,
C4Object by_obj 
)

Definition at line 1351 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, OCF_Entrance, and PSF_ActivateEntrance.

Referenced by C4Command::Enter(), and C4Command::Exit().

1352 {
1353 
1354  // Try entrance activation
1355  if (OCF & OCF_Entrance)
1356  if (!! Call(PSF_ActivateEntrance,&C4AulParSet(by_obj)))
1357  return true;
1358  // Failure
1359  return false;
1360 }
const uint32_t OCF_Entrance
Definition: C4Constants.h:90
#define PSF_ActivateEntrance
Definition: C4GameScript.h:67
uint32_t OCF
Definition: C4Object.h:134
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the caller graph for this function:

◆ ActivateMenu()

bool C4Object::ActivateMenu ( int32_t  iMenu,
int32_t  iMenuSelect = 0,
int32_t  iMenuData = 0,
int32_t  iMenuPosition = 0,
C4Object pTarget = nullptr 
)

Definition at line 1479 of file C4Object.cpp.

References C4MN_Activate, C4MN_Buy, C4MN_Extra_None, C4SymbolSize, C4PropList::Call(), C4Menu::ClearItems(), Color, C4FacetSurface::Create(), Def, C4Def::Draw(), FormatString(), C4PropList::GetName(), LoadResStr(), and PSF_RejectContents.

Referenced by C4Command::Activate(), C4Command::Get(), ObjectComPutTake(), ObjectComTake(), and ObjectComTake2().

1482 {
1483  // Variables
1484  C4FacetSurface fctSymbol;
1485  C4IDList ListItems;
1486  // Close any other menu
1487  if (Menu && Menu->IsActive()) if (!Menu->TryClose(true, false)) return false;
1488  // Create menu
1489  if (!Menu) Menu = new C4ObjectMenu; else Menu->ClearItems();
1490  // Open menu
1491  switch (iMenu)
1492  {
1493  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1494  case C4MN_Activate:
1495  // No target specified: use own container as target
1496  if (!pTarget) if (!(pTarget=Contained)) break;
1497  // Opening contents menu blocked by RejectContents
1498  if (!!pTarget->Call(PSF_RejectContents)) return false;
1499  // Create symbol
1500  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1501  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1502  // Init
1503  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1504  Menu->SetPermanent(true);
1505  Menu->SetRefillObject(pTarget);
1506  // Success
1507  return true;
1508  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1509  case C4MN_Buy:
1510  // No target specified: container is base
1511  if (!pTarget) if (!(pTarget=Contained)) break;
1512  // Create symbol
1513  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1514  DrawMenuSymbol(C4MN_Buy, fctSymbol, pTarget->Owner);
1515  // Init menu
1516  Menu->Init(fctSymbol,LoadResStr("IDS_PLR_NOBUY"),this,C4MN_Extra_Value,0,iMenu);
1517  Menu->SetPermanent(true);
1518  Menu->SetRefillObject(pTarget);
1519  // Success
1520  return true;
1521  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1522  case C4MN_Sell:
1523  // No target specified: container is base
1524  if (!pTarget) if (!(pTarget=Contained)) break;
1525  // Create symbol & init
1526  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1527  DrawMenuSymbol(C4MN_Sell, fctSymbol, pTarget->Owner);
1528  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_Value,0,iMenu);
1529  Menu->SetPermanent(true);
1530  Menu->SetRefillObject(pTarget);
1531  // Success
1532  return true;
1533  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1534  case C4MN_Get:
1535  case C4MN_Contents:
1536  // No target specified
1537  if (!pTarget) break;
1538  // Opening contents menu blocked by RejectContents
1539  if (!!pTarget->Call(PSF_RejectContents)) return false;
1540  // Create symbol & init
1541  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1542  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1543  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1544  Menu->SetPermanent(true);
1545  Menu->SetRefillObject(pTarget);
1546  // Success
1547  return true;
1548  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1549  case C4MN_Info:
1550  // Target by parameter
1551  if (!pTarget) break;
1552  // Create symbol & init menu
1553  fctSymbol.Create(C4SymbolSize, C4SymbolSize); GfxR->fctOKCancel.Draw(fctSymbol,true,0,1);
1554  Menu->Init(fctSymbol, pTarget->GetName(), this, C4MN_Extra_None, 0, iMenu, C4MN_Style_Info);
1555  Menu->SetPermanent(true);
1557  C4Viewport *pViewport = ::Viewports.GetViewport(Controller); // Hackhackhack!!!
1558  if (pViewport) Menu->SetLocation((pTarget->GetX() + pTarget->Shape.GetX() + pTarget->Shape.Wdt + 10 - pViewport->GetViewX()) * pViewport->GetZoom(),
1559  (pTarget->GetY() + pTarget->Shape.GetY() - pViewport->GetViewY()) * pViewport->GetZoom());
1560  // Add info item
1561  fctSymbol.Create(C4PictureSize, C4PictureSize); pTarget->Def->Draw(fctSymbol, false, pTarget->Color, pTarget);
1562  Menu->Add(pTarget->GetName(), fctSymbol, "", C4MN_Item_NoCount, nullptr, pTarget->GetInfoString().getData());
1563  fctSymbol.Default();
1564  // Success
1565  return true;
1566  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1567  }
1568  // Invalid menu identification
1569  CloseMenu(true);
1570  return false;
1571 }
bool Add(const char *szCaption, C4FacetSurface &fctSymbol, const char *szCommand, int32_t iCount=C4MN_Item_NoCount, C4Object *pObject=nullptr, const char *szInfoCaption=nullptr, C4ID idID=C4ID::None, const char *szCommand2=nullptr, bool fOwnValue=false, int32_t iValue=0, bool fIsSelectable=true)
Definition: C4Menu.cpp:350
int32_t GetX() const
Definition: C4Object.h:287
#define GfxR
void SetAlignment(int32_t iAlignment)
Definition: C4Menu.cpp:857
bool Init(C4FacetSurface &fctSymbol, const char *szEmpty, C4Object *pObject, int32_t iExtra=C4MN_Extra_None, int32_t iExtraData=0, int32_t iId=0, int32_t iStyle=C4MN_Style_Normal, bool fUserMenu=false)
C4Viewport * GetViewport(int32_t iPlayer, C4Viewport *pPrev=nullptr)
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
void Default()
Definition: C4FacetEx.h:43
int32_t Wdt
Definition: C4Rect.h:30
class C4ObjectMenu * Menu
Definition: C4Object.h:140
bool CloseMenu(bool fForce)
Definition: C4Object.cpp:1573
C4Def * Def
Definition: C4Object.h:143
bool SetLocation(int32_t iX, int32_t iY)
Definition: C4Menu.cpp:951
int32_t GetX() const
Definition: C4Shape.h:62
void ClearItems()
Definition: C4Menu.cpp:895
int32_t Owner
Definition: C4Object.h:110
uint32_t Color
Definition: C4Object.h:120
void Draw(C4Facet &cgo, bool fSelected=false, DWORD iColor=0, C4Object *pObj=nullptr, int32_t iPhaseX=0, int32_t iPhaseY=0, C4DrawTransform *trans=nullptr, const char *graphicsName=nullptr)
Definition: C4Def.cpp:597
int32_t GetY() const
Definition: C4Object.h:288
const char * getData() const
Definition: StdBuf.h:442
bool IsActive()
Definition: C4Menu.cpp:480
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:280
#define PSF_RejectContents
Definition: C4GameScript.h:134
int32_t GetY() const
Definition: C4Shape.h:63
const int C4PictureSize
Definition: C4Constants.h:60
C4ViewportList Viewports
Definition: C4Viewport.cpp:841
float GetViewY()
Definition: C4Viewport.h:75
StdStrBuf GetInfoString()
Definition: C4Object.cpp:4720
const int C4SymbolSize
Definition: C4Constants.h:58
virtual const char * GetName() const
Definition: C4PropList.cpp:649
float GetZoom()
Definition: C4Viewport.h:45
bool Create(int iWdt, int iHgt, int iWdt2=C4FCT_Full, int iHgt2=C4FCT_Full)
Definition: C4FacetEx.cpp:54
void SetPermanent(bool fPermanent)
Definition: C4Menu.cpp:862
void SetRefillObject(C4Object *pObj)
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Shape Shape
Definition: C4Object.h:148
float GetViewX()
Definition: C4Viewport.h:73
int32_t Controller
Definition: C4Object.h:111
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddCommand() [1/2]

bool C4Object::AddCommand ( int32_t  iCommand,
C4Object pTarget,
C4Value  iTx,
int32_t  iTy = 0,
int32_t  iUpdateInterval = 0,
C4Object pTarget2 = nullptr,
bool  fInitEvaluation = true,
C4Value  iData = C4VNull,
bool  fAppend = false,
int32_t  iRetries = 0,
C4String szText = nullptr,
int32_t  iBaseMode = 0 
)

Definition at line 2567 of file C4Object.cpp.

References C4CMD_First, C4CMD_Last, Inside(), C4Command::Next, and C4Command::Set().

Referenced by C4Command::Acquire(), C4Command::Activate(), C4Command::Attack(), C4Command::Dig(), C4Command::Drop(), C4Command::Enter(), C4Command::Execute(), C4Command::Follow(), C4Command::Get(), C4Command::Grab(), C4Command::JumpControl(), C4Command::MoveTo(), ObjectAddWaypoint::operator()(), C4Command::PushTo(), C4Command::Put(), StopActionDelayCommand(), C4Command::Throw(), and C4Command::Transfer().

2571 {
2572  // Command stack size safety
2573  const int32_t MaxCommandStack = 35;
2574  C4Command *pCom,*pLast; int32_t iCommands;
2575  for (pCom=Command,iCommands=0; pCom; pCom=pCom->Next,iCommands++) {}
2576  if (iCommands>=MaxCommandStack) return false;
2577  // Valid command safety
2578  if (!Inside(iCommand,C4CMD_First,C4CMD_Last)) return false;
2579  // Allocate and set new command
2580  if (!(pCom=new C4Command)) return false;
2581  pCom->Set(iCommand,this,pTarget,iTx,iTy,pTarget2,iData,
2582  iUpdateInterval,!fInitEvaluation,iRetries,szText,iBaseMode);
2583  // Append to bottom of stack
2584  if (fAppend)
2585  {
2586  for (pLast=Command; pLast && pLast->Next; pLast=pLast->Next) {}
2587  if (pLast) pLast->Next=pCom;
2588  else Command=pCom;
2589  }
2590  // Add to top of command stack
2591  else
2592  {
2593  pCom->Next=Command;
2594  Command=pCom;
2595  }
2596  // Success
2597  return true;
2598 }
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:167
const int32_t C4CMD_First
Definition: C4Command.h:56
const int32_t C4CMD_Last
Definition: C4Command.h:57
void Set(int32_t iCommand, C4Object *pObj, C4Object *pTarget, C4Value iTx, int32_t iTy, C4Object *pTarget2, C4Value iData, int32_t iUpdateInterval, bool fEvaluated, int32_t iRetries, C4String *szText, int32_t iBaseMode)
Definition: C4Command.cpp:1810
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:43
Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddCommand() [2/2]

bool C4Object::AddCommand ( int32_t  iCommand,
C4Object pTarget = nullptr,
int32_t  iTx = 0,
int32_t  iTy = 0,
int32_t  iUpdateInterval = 0,
C4Object pTarget2 = nullptr,
bool  fInitEvaluation = true,
C4Value  iData = C4VNull,
bool  fAppend = false,
int32_t  iRetries = 0,
C4String szText = nullptr,
int32_t  iBaseMode = 0 
)
inline

Definition at line 187 of file C4Object.h.

References C4VInt(), C4Action::CompileFunc(), C4Action::Default(), C4GraphicsOverlay::DrawPicture(), C4GraphicsOverlay::iPhase, and C4GraphicsOverlay::SetPhase().

188  { return AddCommand(iCommand, pTarget, C4VInt(iTx), iTy, iUpdateInterval, pTarget2, fInitEvaluation, iData, fAppend, iRetries, szText, iBaseMode); }
C4Value C4VInt(int32_t i)
Definition: C4Value.h:242
bool AddCommand(int32_t iCommand, C4Object *pTarget, C4Value iTx, int32_t iTy=0, int32_t iUpdateInterval=0, C4Object *pTarget2=nullptr, bool fInitEvaluation=true, C4Value iData=C4VNull, bool fAppend=false, int32_t iRetries=0, C4String *szText=nullptr, int32_t iBaseMode=0)
Definition: C4Object.cpp:2567
Here is the call graph for this function:

◆ AddObjectAndContentsToArray()

int32_t C4Object::AddObjectAndContentsToArray ( C4ValueArray target_array,
int32_t  index = 0 
)

Definition at line 4305 of file C4Object.cpp.

References AddObjectAndContentsToArray(), C4VObj(), and C4ValueArray::SetItem().

Referenced by AddObjectAndContentsToArray(), and C4EditCursor::PerformDuplication().

4306 {
4307  // add self, contents and child contents count recursively to value array. Return index after last added item.
4308  target_array->SetItem(index++, C4VObj(this));
4309  for (C4Object *cobj : Contents)
4310  {
4311  index = cobj->AddObjectAndContentsToArray(target_array, index);
4312  }
4313  return index;
4314 }
void SetItem(int32_t iElemNr, const C4Value &Value)
C4Value C4VObj(C4Object *pObj)
Definition: C4Value.cpp:88
C4NotifyingObjectList Contents
Definition: C4Object.h:153
Here is the call graph for this function:
Here is the caller graph for this function:

◆ addtop()

int32_t C4Object::addtop ( ) const
inline

Definition at line 282 of file C4Object.h.

References C4Rect::Hgt.

Referenced by C4MouseControl::UpdateCursorTarget().

282 { return std::max<int32_t>(18-Shape.Hgt,0); } // Minimum top action size for build check
int32_t Hgt
Definition: C4Rect.h:30
C4Shape Shape
Definition: C4Object.h:148
Here is the caller graph for this function:

◆ AdjustWalkRotation()

bool C4Object::AdjustWalkRotation ( int32_t  iRangeX,
int32_t  iRangeY,
int32_t  iSpeed 
)

Definition at line 4593 of file C4Object.cpp.

References Abs(), GBackSolid(), and itofix().

4594 {
4595  int32_t iDestAngle;
4596  // attachment at middle (bottom) vertex?
4598  {
4599  // evaluate floor around attachment pos
4600  int32_t iSolidLeft=0, iSolidRight=0;
4601  // left
4602  int32_t iXCheck = Shape.iAttachX-iRangeX;
4603  if (GBackSolid(iXCheck, Shape.iAttachY))
4604  {
4605  // up
4606  while (--iSolidLeft>-iRangeY)
4607  if (GBackSolid(iXCheck, Shape.iAttachY+iSolidLeft))
4608  { ++iSolidLeft; break; }
4609  }
4610  else
4611  // down
4612  while (++iSolidLeft<iRangeY)
4613  if (GBackSolid(iXCheck, Shape.iAttachY+iSolidLeft))
4614  { --iSolidLeft; break; }
4615  // right
4616  iXCheck += 2*iRangeX;
4617  if (GBackSolid(iXCheck, Shape.iAttachY))
4618  {
4619  // up
4620  while (--iSolidRight>-iRangeY)
4621  if (GBackSolid(iXCheck, Shape.iAttachY+iSolidRight))
4622  { ++iSolidRight; break; }
4623  }
4624  else
4625  // down
4626  while (++iSolidRight<iRangeY)
4627  if (GBackSolid(iXCheck, Shape.iAttachY+iSolidRight))
4628  { --iSolidRight; break; }
4629  // calculate destination angle
4630  // 100% accurate for large values of Pi ;)
4631  iDestAngle=(iSolidRight-iSolidLeft)*(35/std::max<int32_t>(iRangeX, 1));
4632  }
4633  else
4634  {
4635  // attachment at other than horizontal middle vertex: get your feet to the ground!
4636  // rotate target to large angle is OK, because rotation will stop once the real
4637  // bottom vertex hits solid ground
4638  if (Shape.VtxX[Shape.iAttachVtx] > 0)
4639  iDestAngle = -50;
4640  else
4641  iDestAngle = 50;
4642  }
4643  // move to destination angle
4644  if (Abs(iDestAngle-GetR())>2)
4645  {
4646  rdir = itofix(Clamp<int32_t>(iDestAngle-GetR(), -15,+15));
4647  rdir/=(10000/iSpeed);
4648  }
4649  else rdir=0;
4650  // done, success
4651  return true;
4652 }
C4Real rdir
Definition: C4Object.h:126
int32_t iAttachY
Definition: C4Shape.h:53
C4Shape Shape
Definition: C4Def.h:104
C4Def * Def
Definition: C4Object.h:143
int32_t iAttachX
Definition: C4Shape.h:53
int32_t VtxX[C4D_MaxVertex]
Definition: C4Shape.h:43
C4Fixed itofix(int32_t x)
Definition: C4Real.h:261
int32_t GetR() const
Definition: C4Object.h:289
int32_t iAttachVtx
Definition: C4Shape.h:53
T Abs(T val)
Definition: Standard.h:42
C4Shape Shape
Definition: C4Object.h:148
bool GBackSolid(int32_t x, int32_t y)
Definition: C4Landscape.h:229
Here is the call 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 518 of file C4PropList.cpp.

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

Referenced by C4PropList::IsFrozen().

519 {
520  StdStrBuf & DataString = *out;
521  if (depth <= 0 && Properties.GetSize())
522  {
523  DataString.Append("...");
524  return;
525  }
526  bool has_elements = false;
527  // Append prototype
528  if (prototype)
529  {
530  DataString.Append("Prototype = ");
531  DataString.Append(prototype.GetDataString(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
532  has_elements = true;
533  }
534  // Append other properties
535  std::list<const C4Property *> sorted_props = Properties.GetSortedListOfElementPointers();
536  for (std::list<const C4Property *>::const_iterator p = sorted_props.begin(); p != sorted_props.end(); ++p)
537  {
538  if (has_elements) DataString.Append(delim);
539  DataString.Append((*p)->Key->GetData());
540  DataString.Append(" = ");
541  DataString.Append((*p)->Value.GetDataString(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
542  has_elements = true;
543  }
544 }
StdStrBuf GetDataString(int depth=10, const class C4PropListStatic *ignore_reference_parent=nullptr) const
Definition: C4Value.cpp:131
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:85
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:519
std::list< const T * > GetSortedListOfElementPointers() const
unsigned int GetSize() const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ AssignDeath()

void C4Object::AssignDeath ( bool  fForced)

Definition at line 991 of file C4Object.cpp.

References C4FxCall_RemoveDeath, C4ScriptGuiWindowActionID::Call, C4Player::ClearPointers(), C4Player::Crew, Exit(), Game, C4PlayerList::Get(), GetObject(), GetX(), GetY(), C4Game::GRBroadcast(), C4ObjectInfo::HasDied, C4ObjectList::ObjectCount(), Players, PSF_Death, and PSF_RelaunchPlayer.

Referenced by ExecMovement().

992 {
993  C4Object *thing;
994  // Alive objects only
995  if (!Alive) return;
996  // clear all effects
997  // do not delete effects afterwards, because they might have denied removal
998  // set alive-flag before, so objects know what's up
999  // and prevent recursive death-calls this way
1000  // get death causing player before doing effect calls, because those might meddle around with the flags
1001  int32_t iDeathCausingPlayer = LastEnergyLossCausePlayer;
1002  Alive=false;
1004  // if the object is alive again, abort here if the kill is not forced
1005  if (Alive && !fForced) return;
1006  // Action
1007  SetActionByName("Dead");
1008  // Values
1009  Alive=false;
1010  ClearCommands();
1011  C4ObjectInfo * pInfo = Info;
1012  if (Info)
1013  {
1014  Info->HasDied=true;
1015  ++Info->DeathCount;
1016  Info->Retire();
1017  }
1018  // Remove from crew/cursor/view
1019  C4Player *pPlr = ::Players.Get(Owner);
1020  if (pPlr) pPlr->ClearPointers(this, true);
1021  // Remove from light sources
1022  SetLightRange(0,0);
1023  // Engine script call
1024  C4AulParSet pars(iDeathCausingPlayer);
1025  Call(PSF_Death, &pars);
1026  // Lose contents
1027  while ((thing=Contents.GetObject())) thing->Exit(thing->GetX(),thing->GetY());
1028  // Update OCF. Done here because previously it would have been done in the next frame
1029  // Whats worse: Having the OCF change because of some unrelated script-call like
1030  // SetCategory, or slightly breaking compatibility?
1031  SetOCF();
1032  // Engine broadcast: relaunch player (in CR, this was called from clonk script.
1033  // Now, it is done for every crew member)
1034  if(pPlr)
1035  if(!pPlr->Crew.ObjectCount())
1037  &C4AulParSet(Owner, iDeathCausingPlayer, Status ? this : nullptr));
1038  if (pInfo)
1039  pInfo->HasDied = false;
1040 }
void ClearAll(int32_t iClearFlag)
Definition: C4Effect.cpp:369
int32_t GetX() const
Definition: C4Object.h:287
#define C4FxCall_RemoveDeath
Definition: C4Effect.h:46
C4Game Game
Definition: C4Globals.cpp:52
bool Alive
Definition: C4Object.h:176
bool SetActionByName(C4String *ActName, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2819
C4Object * GetObject(int Index=0) const
void ClearPointers(C4Object *tptr, bool fDeath)
Definition: C4Player.cpp:98
C4ObjectInfo * Info
Definition: C4Object.h:145
C4Player * Get(int iPlayer) const
C4NotifyingObjectList Contents
Definition: C4Object.h:153
#define PSF_Death
Definition: C4GameScript.h:66
int32_t Owner
Definition: C4Object.h:110
C4PlayerList Players
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
Definition: C4Object.cpp:1227
int ObjectCount(C4ID id=C4ID::None) const
int32_t Status
Definition: C4PropList.h:168
int32_t GetY() const
Definition: C4Object.h:288
C4ObjectList Crew
Definition: C4Player.h:125
void ClearCommands()
Definition: C4Object.cpp:2536
#define PSF_RelaunchPlayer
Definition: C4GameScript.h:47
bool SetLightRange(int32_t iToRange, int32_t iToFadeoutRange)
Definition: C4Object.cpp:4011
C4Value GRBroadcast(const char *szFunction, C4AulParSet *pPars=nullptr, bool fPassError=false, bool fRejectTest=false)
Definition: C4Game.cpp:3853
C4Effect * pEffects
Definition: C4Object.h:157
void SetOCF()
Definition: C4Object.cpp:669
int32_t DeathCount
Definition: C4InfoCore.h:44
int32_t LastEnergyLossCausePlayer
Definition: C4Object.h:112
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ AssignInfo()

bool C4Object::AssignInfo ( )

Definition at line 2390 of file C4Object.cpp.

References C4Player::ClearPointers(), C4Player::Crew, C4PlayerList::Get(), C4ObjectList::GetLink(), C4Player::MakeCrewMember(), Players, C4ObjectList::Remove(), and ValidPlr().

Referenced by C4ObjectList::AssignInfo().

2391 {
2392  if (Info || !ValidPlr(Owner)) return false;
2393  // In crew list?
2394  C4Player *pPlr = ::Players.Get(Owner);
2395  if (pPlr->Crew.GetLink(this))
2396  {
2397  // Register with player
2398  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2399  pPlr->Crew.Remove(this);
2400  return true;
2401  }
2402  // Info set, but not in crew list, so
2403  // a) The savegame is old-style (without crew list)
2404  // or b) The clonk is dead
2405  // or c) The clonk belongs to a script player that's restored without Game.txt
2406  else if (nInfo.getLength())
2407  {
2408  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2409  return false;
2410  // Dead and gone (info flags, remove from crew/cursor)
2411  if (!Alive)
2412  {
2413  if (ValidPlr(Owner)) ::Players.Get(Owner)->ClearPointers(this, true);
2414  }
2415  return true;
2416  }
2417  return false;
2418 }
bool MakeCrewMember(C4Object *pObj, bool fForceInfo=true, bool fDoCalls=true)
Definition: C4Player.cpp:1008
bool Alive
Definition: C4Object.h:176
void ClearPointers(C4Object *tptr, bool fDeath)
Definition: C4Player.cpp:98
C4ObjectInfo * Info
Definition: C4Object.h:145
C4Player * Get(int iPlayer) const
int32_t Owner
Definition: C4Object.h:110
C4PlayerList Players
C4ObjectList Crew
Definition: C4Player.h:125
StdCopyStrBuf nInfo
Definition: C4Object.h:169
int32_t ValidPlr(int32_t plr)
const C4ObjectLink * GetLink(const C4Object *pObj) const
size_t getLength() const
Definition: StdBuf.h:445
virtual bool Remove(C4Object *pObj)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ AssignLightRange()

bool C4Object::AssignLightRange ( )

Definition at line 2420 of file C4Object.cpp.

2421 {
2422  if (!lightRange && !lightFadeoutRange) return true;
2423 
2424  UpdateLight();
2425  return true;
2426 }
int32_t lightFadeoutRange
Definition: C4Object.h:123
int32_t lightRange
Definition: C4Object.h:122
void UpdateLight()
Definition: C4Object.cpp:4034

◆ AssignRemoval()

void C4Object::AssignRemoval ( bool  fExitContents = false)

Definition at line 255 of file C4Object.cpp.

References C4GameObjects::Add(), AddDbgRec(), C4FxCall_RemoveClear, C4OS_INACTIVE, C4OS_NORMAL, C4ScriptGuiWindowActionID::Call, C4Game::ClearPointers(), Config, Contents, C4ConfigGeneral::DebugRec, Enter(), Exit(), Game, C4Config::General, C4RCCreateObj::id, C4GameObjects::InactiveObjects, Objects, C4RCCreateObj::oei, C4RCCreateObj::ownr, PSF_ContentsDestruction, PSF_Destruction, RCT_DsObj, C4ObjectList::Remove(), SetOCF(), UpdateMass(), C4RCCreateObj::x, and C4RCCreateObj::y.

Referenced by CreateContents(), C4Landscape::P::DigMaterial2Objects(), ExecMovement(), C4Player::RemoveCrewObjects(), and C4ControlEMMoveObject::~C4ControlEMMoveObject().

256 {
257  // check status
258  if (!Status) return;
259  if (Config.General.DebugRec)
260  {
261  C4RCCreateObj rc;
262  memset(&rc, '\0', sizeof(rc));
263  rc.oei=Number;
264  if (Def && Def->GetName()) strncpy(rc.id, Def->GetName(), 32+1);
265  rc.x=GetX(); rc.y=GetY(); rc.ownr=Owner;
266  AddDbgRec(RCT_DsObj, &rc, sizeof(rc));
267  }
268  // Destruction call in container
269  if (Contained)
270  {
271  C4AulParSet pars(this);
273  if (!Status) return;
274  }
275  // Destruction call
277  // Destruction-callback might have deleted the object already
278  if (!Status) return;
279  // remove all effects (extinguishes as well)
280  if (pEffects)
281  {
283  // Effect-callback might actually have deleted the object already
284  if (!Status) return;
285  }
286  // remove particles
288  // Action idle
289  SetAction(nullptr);
290  // Object system operation
291  if (Status == C4OS_INACTIVE)
292  {
293  // object was inactive: activate first, then delete
296  ::Objects.Add(this);
297  }
298  Status=0;
299  // count decrease
300  Def->Count--;
301 
302  // get container for next actions
303  C4Object *pCont = Contained;
304  // remove or exit contents
305  for (C4Object *cobj : Contents)
306  {
307  if (fExitContents)
308  {
309  // move objects to parent container or exit them completely
310  bool fRejectCollect;
311  if (!pCont || !cobj->Enter(pCont, true, false, &fRejectCollect))
312  cobj->Exit(GetX(), GetY());
313  }
314  else
315  {
316  Contents.Remove(cobj);
317  cobj->Contained = nullptr;
318  cobj->AssignRemoval();
319  }
320  }
321  // remove this object from container *after* its contents have been removed!
322  if (pCont)
323  {
324  pCont->Contents.Remove(this);
325  pCont->UpdateMass();
326  pCont->SetOCF();
327  Contained=nullptr;
328  }
329  // Object info
330  if (Info) Info->Retire();
331  Info = nullptr;
332  // Object system operation
333  ClearRefs();
334  Game.ClearPointers(this);
335  ClearCommands();
336  if (pSolidMaskData)
337  {
338  delete pSolidMaskData;
339  pSolidMaskData = nullptr;
340  }
341  SolidMask.Wdt = 0;
342  RemovalDelay=2;
343 }
void ClearAll(int32_t iClearFlag)
Definition: C4Effect.cpp:369
int32_t GetX() const
Definition: C4Object.h:287
C4Config Config
Definition: C4Config.cpp:833
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1263
bool Add(C4Object *nObj)
C4Game Game
Definition: C4Globals.cpp:52
C4ConfigGeneral General
Definition: C4Config.h:251
#define C4OS_NORMAL
Definition: C4Object.h:35
#define C4FxCall_RemoveClear
Definition: C4Effect.h:45
int32_t RemovalDelay
Definition: C4Object.h:109
void ClearParticleLists()
Definition: C4Object.cpp:246
C4ObjectInfo * Info
Definition: C4Object.h:145
const char * GetName() const override
Definition: C4PropList.cpp:267
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
int32_t Wdt
Definition: C4Rect.h:30
C4NotifyingObjectList Contents
Definition: C4Object.h:153
C4Def * Def
Definition: C4Object.h:143
int32_t Count
Definition: C4Def.h:179
int32_t Owner
Definition: C4Object.h:110
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2686
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
Definition: C4Object.cpp:1227
char id[32+1]
Definition: C4Record.h:150
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
Definition: C4Record.cpp:32
#define PSF_ContentsDestruction
Definition: C4GameScript.h:39
int32_t Status
Definition: C4PropList.h:168
void UpdateMass()
Definition: C4Object.cpp:641
int32_t GetY() const
Definition: C4Object.h:288
void ClearCommands()
Definition: C4Object.cpp:2536
#define C4OS_INACTIVE
Definition: C4Object.h:36
void ClearPointers(C4Object *cobj)
Definition: C4Game.cpp:921
int32_t DebugRec
Definition: C4Config.h:60
C4Effect * pEffects
Definition: C4Object.h:157
#define PSF_Destruction
Definition: C4GameScript.h:38
void SetOCF()
Definition: C4Object.cpp:669
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
virtual bool Remove(C4Object *pObj)
C4GameObjects Objects
Definition: C4Globals.cpp:48
void ClearRefs()
Definition: C4PropList.h:156
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ At() [1/2]

bool C4Object::At ( int32_t  ctx,
int32_t  cty 
) const

Definition at line 952 of file C4Object.cpp.

Referenced by C4Command::Enter(), C4Command::Get(), and C4Command::Grab().

953 {
954  if (Status) if (!Contained) if (Def)
955  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
956  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
957  return true;
958  return false;
959 }
int32_t GetX() const
Definition: C4Object.h:287
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
int32_t GetX() const
Definition: C4Shape.h:62
int32_t Status
Definition: C4PropList.h:168
int32_t GetY() const
Definition: C4Object.h:288
int32_t GetY() const
Definition: C4Shape.h:63
C4ObjectPtr Contained
Definition: C4Object.h:144
int32_t Hgt
Definition: C4Rect.h:30
C4Shape Shape
Definition: C4Object.h:148
int32_t addtop() const
Definition: C4Object.h:282
Here is the caller graph for this function:

◆ At() [2/2]

bool C4Object::At ( int32_t  ctx,
int32_t  cty,
DWORD ocf 
) const

Definition at line 961 of file C4Object.cpp.

962 {
963  if (Status) if (!Contained) if (Def)
964  if (OCF & ocf)
965  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
966  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
967  {
968  // Set ocf return value
969  GetOCFForPos(ctx, cty, ocf);
970  return true;
971  }
972  return false;
973 }
int32_t GetX() const
Definition: C4Object.h:287
void GetOCFForPos(int32_t ctx, int32_t cty, DWORD &ocf) const
Definition: C4Object.cpp:975
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
int32_t GetX() const
Definition: C4Shape.h:62
int32_t Status
Definition: C4PropList.h:168
int32_t GetY() const
Definition: C4Object.h:288
int32_t GetY() const
Definition: C4Shape.h:63
C4ObjectPtr Contained
Definition: C4Object.h:144
int32_t Hgt
Definition: C4Rect.h:30
C4Shape Shape
Definition: C4Object.h:148
uint32_t OCF
Definition: C4Object.h:134
int32_t addtop() const
Definition: C4Object.h:282

◆ begin()

C4PropList::Iterator C4PropList::begin ( )
inherited

Definition at line 1026 of file C4PropList.cpp.

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

Referenced by C4PropList::begin(), C4ParticleProperties::Set(), ShiftContents(), and C4ScriptGuiWindow::~C4ScriptGuiWindow().

1027 {
1028  C4PropList::Iterator iter;
1029 
1030  if (GetPrototype())
1031  {
1032  iter = GetPrototype()->begin();
1033  }
1034  else
1035  {
1036  iter.properties = std::make_shared<std::vector<const C4Property*> >();
1037  }
1038  iter.Reserve(Properties.GetSize());
1039 
1040  const C4Property * p = Properties.First();
1041  while (p)
1042  {
1043  iter.AddProperty(p);
1044  p = Properties.Next(p);
1045  }
1046 
1047  iter.Init();
1048  return iter;
1049 }
C4PropList * GetPrototype() const
Definition: C4PropList.h:81
T const * Next(T const *p) const
Iterator begin()
T const * First() const
unsigned int GetSize() const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ BoundsCheck()

void C4Object::BoundsCheck ( C4Real ctcox,
C4Real ctcoy 
)
inline

Definition at line 332 of file C4Object.h.

333  { SideBounds(ctcox); VerticalBounds(ctcoy); }
void SideBounds(C4Real &ctcox)
Definition: C4Movement.cpp:156
void VerticalBounds(C4Real &ctcoy)
Definition: C4Movement.cpp:179

◆ Call() [1/3]

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

Definition at line 110 of file C4PropList.h.

References C4ScriptGuiWindowActionID::Call, C4PropList::GetPropertyBool(), C4PropList::GetPropertyInt(), C4PropList::GetPropertyP(), C4PropList::GetPropertyPropList(), C4StringTable::P, and Strings.

Referenced by C4Command::Acquire(), ActivateMenu(), C4ControlPlayerSelect::C4ControlPlayerSelect(), C4Command::Call(), C4GameScriptHost::Call(), C4Effect::CallEffect(), C4Command::CallFailed(), C4Effect::CallStart(), C4Effect::CallStop(), C4Effect::CallTimer(), C4FindObjectFunc::Check(), C4Effect::ClearAll(), Collect(), C4SortObjectFunc::CompareGetValue(), C4Control::CompileFunc(), Contact(), C4GameObjects::CrossCheck(), C4Landscape::P::DigMaterial2Objects(), DoMovement(), C4ObjectMenu::DoRefillInternal(), C4ControlPlayerMouse::DragDrop(), Enter(), C4RoundResults::EvaluateGame(), C4RoundResults::EvaluateGoals(), C4ScriptGuiWindowAction::ExecuteCommand(), C4PlayerControl::ExecuteControlPacket(), Exit(), C4Command::Fail(), C4Command::GetTryEnter(), C4Def::GetValue(), GetValue(), GrabLost(), C4GameObjects::GRBroadcast(), C4Landscape::Incinerate(), C4Effect::Init(), C4Player::Init(), C4ControlPlayerAction::InitPlayerControl(), C4ObjectMenu::IsCloseDenied(), C4Effect::Kill(), C4Game::NewObject(), ObjectActionJump(), ObjectComGrab(), ObjectComPunch(), ObjectComPut(), ObjectComUnGrab(), C4ObjectMenu::OnSelectionChanged(), C4GameObjects::OnSynchronized(), C4EditCursor::PerformDuplication(), C4EditCursor::PerformDuplicationLegacy(), C4Landscape::P::PostFreeShape(), C4Game::SaveData(), C4GUI::FrameDecoration::SetByDef(), C4Player::SetObjectCrewStatus(), C4DefList::Synchronize(), C4Command::Transfer(), and C4ControlEMMoveObject::~C4ControlEMMoveObject().

111  { return Call(&Strings.P[k], pPars, fPassErrors); }
C4String P[P_LAST]
C4StringTable Strings
Definition: C4Globals.cpp:42
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
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 828 of file C4PropList.cpp.

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

829 {
830  if (!Status) return C4Value();
831  C4AulFunc *pFn = GetFunc(k);
832  if (!pFn) return C4Value();
833  return pFn->Exec(this, Pars, fPassErrors);
834 }
friend class C4Value
Definition: C4PropList.h:165
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:72
int32_t Status
Definition: C4PropList.h:168
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:105
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 836 of file C4PropList.cpp.

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

837 {
838  if (!Status) return C4Value();
839  assert(s && s[0]);
840  C4AulFunc *pFn = GetFunc(s);
841  if (!pFn)
842  {
843  if (s[0] != '~')
844  {
845  C4AulExecError err(FormatString("Undefined function: %s", s).getData());
846  if (fPassErrors)
847  throw err;
848  ::ScriptEngine.GetErrorHandler()->OnError(err.what());
849  }
850  return C4Value();
851  }
852  return pFn->Exec(this, Pars, fPassErrors);
853 }
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
friend class C4Value
Definition: C4PropList.h:165
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:173
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:72
int32_t Status
Definition: C4PropList.h:168
virtual void OnError(const char *msg)=0
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:105
#define s
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
Here is the call graph for this function:

◆ CanConcatPictureWith()

bool C4Object::CanConcatPictureWith ( C4Object pOtherObject) const

Definition at line 4758 of file C4Object.cpp.

References APS_Color, APS_Graphics, APS_Name, APS_Overlay, BlitMode, Color, ColorMod, GetGraphicsOverlay(), C4PropList::GetName(), C4GraphicsOverlay::GetNext(), id, pGfxOverlay, pGraphics, and PictureRect.

Referenced by C4ObjectMenu::DoRefillInternal(), and ShiftContents().

4759 {
4760  // check current definition ID
4761  if (id != pOtherObject->id) return false;
4762  // def overwrite of stack conditions
4763  int32_t allow_picture_stack = Def->AllowPictureStack;
4764  if (!(allow_picture_stack & APS_Color))
4765  {
4766  // check color if ColorByOwner (flags)
4767  if (Color != pOtherObject->Color && Def->ColorByOwner) return false;
4768  // check modulation
4769  if (ColorMod != pOtherObject->ColorMod) return false;
4770  if (BlitMode != pOtherObject->BlitMode) return false;
4771  }
4772  if (!(allow_picture_stack & APS_Graphics))
4773  {
4774  // check graphics
4775  if (pGraphics != pOtherObject->pGraphics) return false;
4776  // check any own picture rect
4777  if (PictureRect != pOtherObject->PictureRect) return false;
4778  }
4779  if (!(allow_picture_stack & APS_Name))
4780  {
4781  // check name, so zagabar's sandwiches don't stack
4782  if (GetName() != pOtherObject->GetName()) return false;
4783  }
4784  if (!(allow_picture_stack & APS_Overlay))
4785  {
4786  // check overlay graphics
4787  for (C4GraphicsOverlay *pOwnOverlay = pGfxOverlay; pOwnOverlay; pOwnOverlay = pOwnOverlay->GetNext())
4788  if (pOwnOverlay->IsPicture())
4789  {
4790  C4GraphicsOverlay *pOtherOverlay = pOtherObject->GetGraphicsOverlay(pOwnOverlay->GetID(), false);
4791  if (!pOtherOverlay || !(*pOtherOverlay == *pOwnOverlay)) return false;
4792  }
4793  for (C4GraphicsOverlay *pOtherOverlay = pOtherObject->pGfxOverlay; pOtherOverlay; pOtherOverlay = pOtherOverlay->GetNext())
4794  if (pOtherOverlay->IsPicture())
4795  if (!GetGraphicsOverlay(pOtherOverlay->GetID())) return false;
4796  }
4797  // concat OK
4798  return true;
4799 }
C4GraphicsOverlay * GetNext() const
C4ID id
Definition: C4Object.h:108
C4Rect PictureRect
Definition: C4Object.h:152
class C4GraphicsOverlay * GetGraphicsOverlay(int32_t iForID) const
Definition: C4Object.cpp:4480
C4Def * Def
Definition: C4Object.h:143
uint32_t Color
Definition: C4Object.h:120
C4DefGraphics * pGraphics
Definition: C4Object.h:155
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
int32_t GetID() const
int32_t ColorByOwner
Definition: C4Def.h:121
virtual const char * GetName() const
Definition: C4PropList.cpp:649
uint32_t ColorMod
Definition: C4Object.h:162
int32_t AllowPictureStack
Definition: C4Def.h:147
uint32_t BlitMode
Definition: C4Object.h:163
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ChangeDef()

bool C4Object::ChangeDef ( C4ID  idNew)

Definition at line 1042 of file C4Object.cpp.

References C4GFXBLIT_CUSTOM, C4Id2Def(), C4VPropList(), C4Player::ColorDw, Fix0, GameScript, C4PlayerList::Get(), C4Def::Graphics, C4Def::id, Objects, C4Effect::OnObjectChangedDef(), C4StringTable::P, P_Action, P_Prototype, C4AulScriptEngine::pGlobalEffects, Players, C4GameScriptHost::pScenarioEffects, ScriptEngine, Strings, and ValidPlr().

1043 {
1044  // Get new definition
1045  C4Def *pDef=C4Id2Def(idNew);
1046  if (!pDef) return false;
1047  // Containment storage
1048  C4Object *pContainer=Contained;
1049  // Exit container (no Ejection/Departure)
1050  if (Contained) Exit(0,0,0,Fix0,Fix0,Fix0,false);
1051  // Pre change resets
1052  SetAction(nullptr);
1053  ResetProperty(&Strings.P[P_Action]); // Enforce ActIdle because SetAction may have failed due to NoOtherAction
1054  SetDir(0); // will drop any outdated flipdir
1055  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
1056  Def->Count--;
1057  // Def change
1058  Def=pDef;
1060  id=pDef->id;
1061  Def->Count++;
1062  // new def: Needs to be resorted
1063  Unsorted=true;
1064  // graphics change
1065  pGraphics = &pDef->Graphics;
1066  // blit mode adjustment
1068  // an object may have newly become an ColorByOwner-object
1069  // if it had been ColorByOwner, but is not now, this will be caught in UpdateGraphics()
1070  if (!Color && ValidPlr(Owner))
1072  if (!Def->Rotateable) { fix_r=rdir=Fix0; }
1073  // Reset solid mask
1075  HalfVehicleSolidMask=false;
1076  // Post change updates
1077  UpdateGraphics(true);
1078  UpdateMass();
1079  UpdateFace(true);
1080  SetOCF();
1081  // Any effect callbacks to this object might need to reinitialize their target functions
1082  // This is ugly, because every effect there is must be updated...
1087  for (C4Object *obj : Objects)
1088  if (obj->pEffects) obj->pEffects->OnObjectChangedDef(this);
1089  // Containment (no Entrance)
1090  if (pContainer) Enter(pContainer,false);
1091  // Done
1092  return true;
1093 }
C4String P[P_LAST]
C4ID id
Definition: C4Def.h:101
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1263
C4GameScriptHost GameScript
void SetDir(int32_t tdir)
Definition: C4Object.cpp:2845
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
bool HalfVehicleSolidMask
Definition: C4Object.h:151
C4Real rdir
Definition: C4Object.h:126
void SetProperty(C4PropertyName k, const C4Value &to)
Definition: C4PropList.h:120
void ResetProperty(C4String *k) override
Definition: C4Object.cpp:4866
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:406
uint32_t ColorDw
Definition: C4Player.h:89
int32_t Rotateable
Definition: C4Def.h:119
C4Player * Get(int iPlayer) const
C4Def * Def
Definition: C4Object.h:143
C4StringTable Strings
Definition: C4Globals.cpp:42
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:245
int32_t Count
Definition: C4Def.h:179
int32_t Owner
Definition: C4Object.h:110
C4PlayerList Players
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2686
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
Definition: C4Object.cpp:1227
uint32_t Color
Definition: C4Object.h:120
Definition: C4Def.h:98
C4DefGraphics * pGraphics
Definition: C4Object.h:155
void UpdateMass()
Definition: C4Object.cpp:641
C4TargetRect SolidMask
Definition: C4Def.h:108
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:380
bool Unsorted
Definition: C4Object.h:129
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:84
#define C4GFXBLIT_CUSTOM
Definition: C4Surface.h:35
C4Real fix_r
Definition: C4Object.h:125
int32_t ValidPlr(int32_t plr)
C4Effect * pScenarioEffects
Definition: C4ScriptHost.h:165
int32_t BlitMode
Definition: C4Def.h:141
uint32_t BlitMode
Definition: C4Object.h:163
void SetOCF()
Definition: C4Object.cpp:669
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
C4DefGraphics Graphics
Definition: C4Def.h:191
C4Effect * pGlobalEffects
Definition: C4Aul.h:144
C4GameObjects Objects
Definition: C4Globals.cpp:48
const C4Real Fix0
Definition: C4Real.h:312
void OnObjectChangedDef(C4PropList *pObj)
Definition: C4Effect.cpp:471
Here is the call graph for this function:

◆ CheckPropList()

bool C4PropListNumbered::CheckPropList ( C4PropList pObj)
staticinherited

Definition at line 80 of file C4PropList.cpp.

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

81 {
82  if (!pObj) return false;
83  C4PropListNumbered * const * p = PropLists.First();
84  while (p)
85  {
86  if (*p == pObj)
87  return true;
88  p = PropLists.Next(p);
89  }
90  return false;
91 }
T const * Next(T const *p) const
T const * First() const
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
Here is the caller graph for this function:

◆ CheckSolidMaskRect()

bool C4Object::CheckSolidMaskRect ( )

Definition at line 2479 of file C4Object.cpp.

References CSurface8::Hgt, and CSurface8::Wdt.

2480 {
2481  // Ensure SolidMask rect lies within bounds of SolidMask bitmap in definition
2482  CSurface8 *sfcGraphics = Def->pSolidMask;
2483  if (!sfcGraphics)
2484  {
2485  // no graphics to set solid in
2486  SolidMask.Set(0,0,0,0,0,0);
2487  return false;
2488  }
2489  SolidMask.Set(std::max<int32_t>(SolidMask.x,0), std::max<int32_t>(SolidMask.y,0),
2490  std::min<int32_t>(SolidMask.Wdt,sfcGraphics->Wdt-SolidMask.x), std::min<int32_t>(SolidMask.Hgt, sfcGraphics->Hgt-SolidMask.y),
2492  if (SolidMask.Hgt<=0) SolidMask.Wdt=0;
2493  return SolidMask.Wdt>0;
2494 }
int Hgt
Definition: CSurface8.h:28
CSurface8 * pSolidMask
Definition: C4Def.h:192
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
int32_t y
Definition: C4Rect.h:30
int32_t tx
Definition: C4Rect.h:79
int32_t ty
Definition: C4Rect.h:79
int32_t x
Definition: C4Rect.h:30
int Wdt
Definition: CSurface8.h:28
int32_t Hgt
Definition: C4Rect.h:30
void Set(int32_t iX, int32_t iY, int32_t iWdt, int32_t iHgt, int32_t iTX, int32_t iTY)
Definition: C4Rect.cpp:45
C4TargetRect SolidMask
Definition: C4Object.h:150

◆ Clear()

void C4Object::Clear ( )

Definition at line 2436 of file C4Object.cpp.

References C4Command::Next.

2437 {
2439 
2440  if (pEffects) { delete pEffects; pEffects=nullptr; }
2441  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
2442  if (Menu) delete Menu; Menu=nullptr;
2443  if (MaterialContents) delete MaterialContents; MaterialContents=nullptr;
2444  // clear commands!
2445  C4Command *pCom, *pNext;
2446  for (pCom=Command; pCom; pCom=pNext)
2447  {
2448  pNext=pCom->Next; delete pCom; pCom=pNext;
2449  }
2450  if (pDrawTransform) { delete pDrawTransform; pDrawTransform=nullptr; }
2451  if (pGfxOverlay) { delete pGfxOverlay; pGfxOverlay=nullptr; }
2452  if (pMeshInstance) { delete pMeshInstance; pMeshInstance = nullptr; }
2453 }
C4DrawTransform * pDrawTransform
Definition: C4Object.h:137
C4Command * Next
Definition: C4Command.h:90
C4MaterialList * MaterialContents
Definition: C4Object.h:154
C4Command * Command
Definition: C4Object.h:167
void ClearParticleLists()
Definition: C4Object.cpp:246
class C4ObjectMenu * Menu
Definition: C4Object.h:140
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
C4Effect * pEffects
Definition: C4Object.h:157
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156

◆ ClearCommand()

void C4Object::ClearCommand ( C4Command pUntil)

Definition at line 2550 of file C4Object.cpp.

References C4Command::iExec, and C4Command::Next.

Referenced by GrabLost(), and ObjectComStopDig().

2551 {
2552  C4Command *pCom,*pNext;
2553  for (pCom=Command; pCom; pCom=pNext)
2554  {
2555  // Last one to clear
2556  if (pCom==pUntil) pNext=nullptr;
2557  // Next one to clear after this
2558  else pNext=pCom->Next;
2559  Command=pCom->Next;
2560  if (!pCom->iExec)
2561  delete pCom;
2562  else
2563  pCom->iExec = 2;
2564  }
2565 }
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:167
int32_t iExec
Definition: C4Command.h:91
Here is the caller graph for this function:

◆ ClearCommands()

void C4Object::ClearCommands ( )

Definition at line 2536 of file C4Object.cpp.

References C4Command::iExec, and C4Command::Next.

2537 {
2538  C4Command *pNext;
2539  while (Command)
2540  {
2541  pNext=Command->Next;
2542  if (!Command->iExec)
2543  delete Command;
2544  else
2545  Command->iExec = 2;
2546  Command=pNext;
2547  }
2548 }
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:167
int32_t iExec
Definition: C4Command.h:91

◆ ClearContentsAndContained()

void C4Object::ClearContentsAndContained ( bool  fDoCalls = true)

Definition at line 4582 of file C4Object.cpp.

References Exit(), and Fix0.

4583 {
4584  // exit contents from container
4585  for (C4Object *cobj : Contents)
4586  {
4587  cobj->Exit(GetX(), GetY(), 0,Fix0,Fix0,Fix0, fDoCalls);
4588  }
4589  // remove from container *after* contents have been removed!
4590  if (Contained) Exit(GetX(), GetY(), 0, Fix0, Fix0, Fix0, fDoCalls);
4591 }
int32_t GetX() const
Definition: C4Object.h:287
C4NotifyingObjectList Contents
Definition: C4Object.h:153
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
Definition: C4Object.cpp:1227
int32_t GetY() const
Definition: C4Object.h:288
C4ObjectPtr Contained
Definition: C4Object.h:144
const C4Real Fix0
Definition: C4Real.h:312
Here is the call graph for this function:

◆ ClearInfo()

void C4Object::ClearInfo ( C4ObjectInfo pInfo)

Definition at line 2428 of file C4Object.cpp.

Referenced by C4ObjectList::ClearInfo(), and GrabInfo().

2429 {
2430  if (Info==pInfo)
2431  {
2432  Info=nullptr;
2433  }
2434 }
C4ObjectInfo * Info
Definition: C4Object.h:145
Here is the caller graph for this function:

◆ ClearNumber()

void C4PropListNumbered::ClearNumber ( )
protectedinherited

Definition at line 165 of file C4PropList.cpp.

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

Referenced by C4PropListNumbered::ShelveNumberedPropLists().

166 {
167  // Make proplist invisible during denumeration process
168  if (Number != -1)
169  {
170  PropLists.Remove(this);
171  Number = -1;
172  }
173 }
void Remove(H e)
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearNumberedPropLists()

void C4PropListNumbered::ClearNumberedPropLists ( )
staticinherited

Definition at line 137 of file C4PropList.cpp.

References C4PropList::Clear().

Referenced by C4Game::Clear().

138 {
139  // empty all proplists to ensure safe deletion of proplists with circular references
140  // note that this the call to Clear() might delete some prop lists. So it is assumed that
141  // PropLists does not shrink its table as the number of values goes down
142  C4PropListNumbered *const* p_next = PropLists.First(), *const* p;
143  while ((p = p_next))
144  {
145  p_next = PropLists.Next(p);
146  // check *p since it might have been deleted by clearing the previous prop list
147  if (*p) (*p)->Clear();
148  }
149 }
T const * Next(T const *p) const
void Clear()
Definition: C4PropList.h:66
T const * First() const
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearParticleLists()

void C4Object::ClearParticleLists ( )

Definition at line 246 of file C4Object.cpp.

References Particles, and C4ParticleSystem::ReleaseParticleList().

247 {
248  if (FrontParticles != nullptr)
250  if (BackParticles != nullptr)
252  FrontParticles = BackParticles = nullptr;
253 }
C4ParticleSystem Particles
class C4ParticleList * BackParticles
Definition: C4Object.h:159
void ReleaseParticleList(C4ParticleList *first, C4ParticleList *second=nullptr)
class C4ParticleList * FrontParticles
Definition: C4Object.h:159
Here is the call graph for this function:

◆ ClearPointers()

void C4Object::ClearPointers ( C4Object ptr)

Definition at line 1738 of file C4Object.cpp.

References C4Command::ClearPointers(), C4GraphicsOverlay::GetNext(), and C4Command::Next.

Referenced by C4Game::ClearObjectPtrs(), and C4ScriptGuiWindowAction::ClearPointers().

1739 {
1740  // mesh attachments and animation nodes
1742  // effects
1743  if (pEffects) pEffects->ClearPointers(pObj);
1744  // contents/contained: although normally not necessery because it's done in AssignRemoval and StatusDeactivate,
1745  // it is also required during game destruction (because ClearPointers might do script callbacks)
1746  // Perform silent exit to avoid additional callbacks
1747  if (Contained == pObj)
1748  {
1749  Contained->Contents.Remove(this);
1750  Contained = nullptr;
1751  }
1752  Contents.Remove(pObj);
1753  // Action targets
1754  if (Action.Target==pObj) Action.Target=nullptr;
1755  if (Action.Target2==pObj) Action.Target2=nullptr;
1756  // Commands
1757  C4Command *cCom;
1758  for (cCom=Command; cCom; cCom=cCom->Next)
1759  cCom->ClearPointers(pObj);
1760  // Menu
1761  if (Menu) Menu->ClearPointers(pObj);
1762  // Layer
1763  if (Layer==pObj) Layer=nullptr;
1764  // gfx overlays
1765  if (pGfxOverlay)
1766  {
1767  C4GraphicsOverlay *pNextGfxOvrl = pGfxOverlay, *pGfxOvrl;
1768  while ((pGfxOvrl = pNextGfxOvrl))
1769  {
1770  pNextGfxOvrl = pGfxOvrl->GetNext();
1771  if (pGfxOvrl->GetOverlayObject() == pObj)
1772  // overlay relying on deleted object: Delete!
1773  RemoveGraphicsOverlay(pGfxOvrl->GetID());
1774  }
1775  }
1776 }
C4GraphicsOverlay * GetNext() const
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:167
void ClearPointers(C4Object *pObj)
Definition: C4Command.cpp:1289
C4ObjectPtr Target2
Definition: C4Object.h:87
C4ObjectPtr Layer
Definition: C4Object.h:136
void ClearPointers(C4Object *pObj)
class C4ObjectMenu * Menu
Definition: C4Object.h:140
C4NotifyingObjectList Contents
Definition: C4Object.h:153
void ClearPointers(class C4Object *pObj)
Definition: StdMesh.cpp:1684
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
C4ObjectPtr Target
Definition: C4Object.h:87
C4Effect * pEffects
Definition: C4Object.h:157
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Action Action
Definition: C4Object.h:147
bool RemoveGraphicsOverlay(int32_t iOverlayID)
Definition: C4Object.cpp:4508
void ClearPointers(C4PropList *pObj)
Definition: C4Effect.cpp:191
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156
virtual bool Remove(C4Object *pObj)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearRefs()

void C4PropList::ClearRefs ( )
inlineprotectedinherited

Definition at line 156 of file C4PropList.h.

156 { while (FirstRef) FirstRef->Set0(); }
void Set0()
Definition: C4Value.h:336

◆ ClearShelve()

void C4PropListNumbered::ClearShelve ( )
staticinherited

Definition at line 131 of file C4PropList.cpp.

Referenced by C4Game::Clear().

132 {
133  // cleanup shelve - used in game clear, un unsuccessful section load, etc.
134  ShelvedPropLists.clear();
135 }
static std::vector< C4PropListNumbered * > ShelvedPropLists
Definition: C4PropList.h:237
Here is the caller graph for this function:

◆ CloseMenu()

bool C4Object::CloseMenu ( bool  fForce)

Definition at line 1573 of file C4Object.cpp.

Referenced by ObjectComUnGrab().

1574 {
1575  if (Menu)
1576  {
1577  if (Menu->IsActive()) if (!Menu->TryClose(fForce, false)) return false;
1578  if (!Menu->IsCloseQuerying()) { delete Menu; Menu=nullptr; } // protect menu deletion from recursive menu operation calls
1579  }
1580  return true;
1581 }
bool IsCloseQuerying() const
Definition: C4ObjectMenu.h:74
class C4ObjectMenu * Menu
Definition: C4Object.h:140
bool IsActive()
Definition: C4Menu.cpp:480
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:280
Here is the caller graph for this function:

◆ Collect()

bool C4Object::Collect ( C4Object pObj)

Definition at line 4174 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, C4PropList::Call(), Contained, CopyMotion(), Enter(), ObjectComCancelAttach(), OCF, OCF_HitSpeed1, OCF_HitSpeed2, OCF_HitSpeed3, PSF_Collection, PSF_Hit, PSF_Hit2, PSF_Hit3, and C4PropList::Status.

Referenced by C4GameObjects::CrossCheck(), and C4Landscape::P::DigMaterial2Objects().

4175 {
4176  // Object enter container
4177  bool fRejectCollect;
4178  if (!pObj->Enter(this, true, false, &fRejectCollect))
4179  return false;
4180  // Cancel attach (hacky)
4181  ObjectComCancelAttach(pObj);
4182  // Container Collection call
4184  // Object Hit call
4185  if (pObj->Status && pObj->OCF & OCF_HitSpeed1) pObj->Call(PSF_Hit);
4186  if (pObj->Status && pObj->OCF & OCF_HitSpeed2) pObj->Call(PSF_Hit2);
4187  if (pObj->Status && pObj->OCF & OCF_HitSpeed3) pObj->Call(PSF_Hit3);
4188  // post-copy the motion of the new container
4189  if (pObj->Contained == this) pObj->CopyMotion(this);
4190  // done, success
4191  return true;
4192 }
const uint32_t OCF_HitSpeed1
Definition: C4Constants.h:84
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1263
#define PSF_Hit
Definition: C4GameScript.h:49
bool ObjectComCancelAttach(C4Object *cObj)
const uint32_t OCF_HitSpeed2
Definition: C4Constants.h:91
#define PSF_Hit2
Definition: C4GameScript.h:50
int32_t Status
Definition: C4PropList.h:168
void CopyMotion(C4Object *from)
Definition: C4Movement.cpp:503
#define PSF_Hit3
Definition: C4GameScript.h:51
const uint32_t OCF_HitSpeed3
Definition: C4Constants.h:92
#define PSF_Collection
Definition: C4GameScript.h:56
C4ObjectPtr Contained
Definition: C4Object.h:144
uint32_t OCF
Definition: C4Object.h:134
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ CompileFunc()

void C4Object::CompileFunc ( StdCompiler pComp,
C4ValueNumbers numbers 
)

Definition at line 2161 of file C4Object.cpp.

References C4MeshDenumeratorFactory, C4Command::cObj, Definitions, StdCompiler::excNotFound(), Fix0, StdCompiler::FollowName(), FormatString(), C4Game::fResortAnyObject, FullCon, Game, StdStrBuf::getData(), C4DefList::ID2Def(), StdCompiler::isDeserializer(), LoadResStr(), mkNamingAdapt(), mkNamingPtrAdapt(), mkParAdapt(), C4Command::Next, NO_OWNER, C4ID::None, C4ObjectPtr::Null, toC4CStrBuf, C4DefGraphics::TYPE_Mesh, and StdCompiler::Value().

2162 {
2163  bool deserializing = pComp->isDeserializer();
2164  if (deserializing)
2165  Clear();
2166 
2167  // Compile ID, search definition
2168  pComp->Value(mkNamingAdapt(id, "id", C4ID::None ));
2169  if (deserializing)
2170  {
2171  Def = ::Definitions.ID2Def(id);
2172  if (!Def)
2173  { pComp->excNotFound(LoadResStr("IDS_PRC_UNDEFINEDOBJECT"),id.ToString()); return; }
2174  }
2175 
2176  pComp->Value(mkNamingAdapt( mkParAdapt(static_cast<C4PropListNumbered&>(*this), numbers), "Properties"));
2177  pComp->Value(mkNamingAdapt( Status, "Status", 1 ));
2178  if (Info) nInfo = Info->Name; else nInfo.Clear();
2179  pComp->Value(mkNamingAdapt( toC4CStrBuf(nInfo), "Info", "" ));
2180  pComp->Value(mkNamingAdapt( Owner, "Owner", NO_OWNER ));
2181  pComp->Value(mkNamingAdapt( Controller, "Controller", NO_OWNER ));
2182  pComp->Value(mkNamingAdapt( LastEnergyLossCausePlayer, "LastEngLossPlr", NO_OWNER ));
2183  pComp->Value(mkNamingAdapt( Category, "Category", 0 ));
2184  pComp->Value(mkNamingAdapt( Plane, "Plane", 0 ));
2185 
2186  pComp->Value(mkNamingAdapt( iLastAttachMovementFrame, "LastSolidAtchFrame", -1 ));
2187  pComp->Value(mkNamingAdapt( Con, "Size", 0 ));
2188  pComp->Value(mkNamingAdapt( OwnMass, "OwnMass", 0 ));
2189  pComp->Value(mkNamingAdapt( Mass, "Mass", 0 ));
2190  pComp->Value(mkNamingAdapt( Damage, "Damage", 0 ));
2191  pComp->Value(mkNamingAdapt( Energy, "Energy", 0 ));
2192  pComp->Value(mkNamingAdapt( Alive, "Alive", false ));
2193  pComp->Value(mkNamingAdapt( Breath, "Breath", 0 ));
2194  pComp->Value(mkNamingAdapt( Color, "Color", 0u ));
2195  pComp->Value(mkNamingAdapt( fix_x, "X", Fix0 ));
2196  pComp->Value(mkNamingAdapt( fix_y, "Y", Fix0 ));
2197  pComp->Value(mkNamingAdapt( fix_r, "R", Fix0 ));
2198  pComp->Value(mkNamingAdapt( xdir, "XDir", 0 ));
2199  pComp->Value(mkNamingAdapt( ydir, "YDir", 0 ));
2200  pComp->Value(mkNamingAdapt( rdir, "RDir", 0 ));
2201  pComp->Value(mkParAdapt(Shape, &Def->Shape));
2202  pComp->Value(mkNamingAdapt( fOwnVertices, "OwnVertices", false ));
2203  pComp->Value(mkNamingAdapt( SolidMask, "SolidMask", Def->SolidMask ));
2204  pComp->Value(mkNamingAdapt( HalfVehicleSolidMask, "HalfVehicleSolidMask", false ));
2205  pComp->Value(mkNamingAdapt( PictureRect, "Picture" ));
2206  pComp->Value(mkNamingAdapt( Mobile, "Mobile", false ));
2207  pComp->Value(mkNamingAdapt( OnFire, "OnFire", false ));
2208  pComp->Value(mkNamingAdapt( InLiquid, "InLiquid", false ));
2209  pComp->Value(mkNamingAdapt( EntranceStatus, "EntranceStatus", false ));
2210  pComp->Value(mkNamingAdapt( OCF, "OCF", 0u ));
2211  pComp->Value(Action);
2212  pComp->Value(mkNamingAdapt( Contained, "Contained", C4ObjectPtr::Null ));
2213  pComp->Value(mkNamingAdapt( Action.Target, "ActionTarget1", C4ObjectPtr::Null ));
2214  pComp->Value(mkNamingAdapt( Action.Target2, "ActionTarget2", C4ObjectPtr::Null ));
2215  pComp->Value(mkNamingAdapt( mkParAdapt(Contents, numbers), "Contents" ));
2216  pComp->Value(mkNamingAdapt( lightRange, "LightRange", 0 ));
2217  pComp->Value(mkNamingAdapt( lightFadeoutRange, "LightFadeoutRange", 0 ));
2218  pComp->Value(mkNamingAdapt( lightColor, "lightColor", 0xffffffffu ));
2219  pComp->Value(mkNamingAdapt( ColorMod, "ColorMod", 0xffffffffu ));
2220  pComp->Value(mkNamingAdapt( BlitMode, "BlitMode", 0u ));
2221  pComp->Value(mkNamingAdapt( CrewDisabled, "CrewDisabled", false ));
2222  pComp->Value(mkNamingAdapt( Layer, "Layer", C4ObjectPtr::Null ));
2223  pComp->Value(mkNamingAdapt( C4DefGraphicsAdapt(pGraphics), "Graphics", &Def->Graphics ));
2224  pComp->Value(mkNamingPtrAdapt( pDrawTransform, "DrawTransform" ));
2225  pComp->Value(mkParAdapt(mkNamingPtrAdapt( pEffects, "Effects" ), this, numbers));
2226  pComp->Value(mkNamingAdapt( C4GraphicsOverlayListAdapt(pGfxOverlay),"GfxOverlay", (C4GraphicsOverlay *)nullptr));
2227 
2228  // Serialize mesh instance if we have a mesh graphics
2230  {
2231  if(pComp->isDeserializer())
2232  {
2233  assert(!pMeshInstance);
2234  pMeshInstance = new StdMeshInstance(*pGraphics->Mesh, Def->GrowthType ? 1.0f : static_cast<float>(Con)/static_cast<float>(FullCon));
2235  }
2236 
2238 
2239  // Does not work because unanimated meshes without attached meshes
2240  // do not even write a [Mesh] header so this does not create a mesh instance in that case
2241 /* pComp->Value(mkNamingContextPtrAdapt( pMeshInstance, *pGraphics->Mesh, "Mesh"));
2242  if(!pMeshInstance)
2243  pComp->excCorrupt("Mesh graphics without mesh instance");*/
2244  }
2245 
2246  // TODO: Animations / attached meshes
2247 
2248  // Commands
2249  if (pComp->FollowName("Commands"))
2250  {
2251  if (deserializing)
2252  {
2253  C4Command *pCmd = nullptr;
2254  for (int i = 1; ; i++)
2255  {
2256  // Every command has its own naming environment
2257  StdStrBuf Naming = FormatString("Command%d", i);
2258  pComp->Value(mkParAdapt(mkNamingPtrAdapt(pCmd ? pCmd->Next : Command, Naming.getData()), numbers));
2259  // Last command?
2260  pCmd = (pCmd ? pCmd->Next : Command);
2261  if (!pCmd)
2262  break;
2263  pCmd->cObj = this;
2264  }
2265  }
2266  else
2267  {
2268  C4Command *pCmd = Command;
2269  for (int i = 1; pCmd; i++, pCmd = pCmd->Next)
2270  {
2271  StdStrBuf Naming = FormatString("Command%d", i);
2272  pComp->Value(mkNamingAdapt(mkParAdapt(*pCmd, numbers), Naming.getData()));
2273  }
2274  }
2275  }
2276 
2277  // Compiling? Do initialization.
2278  if (deserializing)
2279  {
2280  // add to def count
2281  Def->Count++;
2282 
2283 
2284  // Set action (override running data)
2285  /* FIXME
2286  int32_t iTime=Action.Time;
2287  int32_t iPhase=Action.Phase;
2288  int32_t iPhaseDelay=Action.PhaseDelay;
2289  if (SetActionByName(Action.pActionDef->GetName(),0,0,false))
2290  {
2291  Action.Time=iTime;
2292  Action.Phase=iPhase; // No checking for valid phase
2293  Action.PhaseDelay=iPhaseDelay;
2294  }*/
2295 
2296  if (pMeshInstance)
2297  {
2298  // Set Action animation by slot 0
2301  }
2302 
2303  // blit mode not assigned? use definition default then
2304  if (!BlitMode) BlitMode = Def->BlitMode;
2305 
2306  // object needs to be resorted? May happen if there's unsorted objects in savegame
2307  if (Unsorted) Game.fResortAnyObject = true;
2308  }
2309 
2310 }
C4Def * ID2Def(C4ID id)
C4Object * cObj
Definition: C4Command.h:80
C4DrawTransform * pDrawTransform
Definition: C4Object.h:137
C4Game Game
Definition: C4Globals.cpp:52
C4Command * Next
Definition: C4Command.h:90
bool Alive
Definition: C4Object.h:176
void Clear()
Definition: StdBuf.h:466
int32_t Mass
Definition: C4Object.h:115
void SetFaceOrderingForClrModulation(uint32_t clrmod)
Definition: StdMesh.cpp:1133
C4Rect PictureRect
Definition: C4Object.h:152
bool HalfVehicleSolidMask
Definition: C4Object.h:151
C4Command * Command
Definition: C4Object.h:167
int32_t OwnMass
Definition: C4Object.h:115
C4Real rdir
Definition: C4Object.h:126
const StdMeshInstance::AttachedMesh::DenumeratorFactoryFunc C4MeshDenumeratorFactory
AnimationNode * GetRootAnimationForSlot(int slot)
Definition: StdMesh.cpp:1251
bool OnFire
Definition: C4Object.h:173
int32_t Breath
Definition: C4Object.h:118
void Clear()
Definition: C4Object.cpp:2436
C4ObjectPtr Target2
Definition: C4Object.h:87
C4ObjectPtr Layer
Definition: C4Object.h:136
StdMeshInstanceAnimationNode * Animation
Definition: C4Object.h:90
C4ObjectInfo * Info
Definition: C4Object.h:145
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
bool Mobile
Definition: C4Object.h:128
const int32_t FullCon
Definition: C4Constants.h:181
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
int32_t Energy
Definition: C4Object.h:117
int32_t lightFadeoutRange
Definition: C4Object.h:123
static const C4ObjectPtr Null
Definition: C4ObjectPtr.h:28
bool InLiquid
Definition: C4Object.h:131
C4NotifyingObjectList Contents
Definition: C4Object.h:153
int32_t GrowthType
Definition: C4Def.h:111
C4Shape Shape
Definition: C4Def.h:104
int32_t Plane
Definition: C4Object.h:175
C4Def * Def
Definition: C4Object.h:143
bool CrewDisabled
Definition: C4Object.h:164
int32_t lightRange
Definition: C4Object.h:122
int32_t Count
Definition: C4Def.h:179
static const C4ID None
Definition: C4Id.h:39
int32_t Con
Definition: C4Object.h:174
int32_t Owner
Definition: C4Object.h:110
uint32_t Color
Definition: C4Object.h:120
bool EntranceStatus
Definition: C4Object.h:132
const int NO_OWNER
Definition: C4Constants.h:137
C4DefGraphics * pGraphics
Definition: C4Object.h:155
char Name[C4MaxName+1]
Definition: C4InfoCore.h:37
void excNotFound(const char *szMessage,...)
Definition: StdCompiler.h:233
int32_t Status
Definition: C4PropList.h:168
void Value(const T &rStruct)
Definition: StdCompiler.h:161
C4TargetRect SolidMask
Definition: C4Def.h:108
const char * getData() const
Definition: StdBuf.h:442
int32_t Damage
Definition: C4Object.h:116
bool Unsorted
Definition: C4Object.h:129
int32_t Category
Definition: C4Object.h:113
virtual bool isDeserializer()
Definition: StdCompiler.h:53
bool fResortAnyObject
Definition: C4Game.h:139
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
C4ObjectPtr Target
Definition: C4Object.h:87
C4Real fix_r
Definition: C4Object.h:125
C4Real fix_x
Definition: C4Object.h:125
StdCopyStrBuf nInfo
Definition: C4Object.h:169
uint32_t ColorMod
Definition: C4Object.h:162
GraphicsType Type
Definition: C4DefGraphics.h:48
int32_t iLastAttachMovementFrame
Definition: C4Object.h:127
int32_t BlitMode
Definition: C4Def.h:141
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
Definition: StdAdaptors.h:476
uint32_t BlitMode
Definition: C4Object.h:163
C4DefList Definitions
Definition: C4Globals.cpp:49
C4Effect * pEffects
Definition: C4Object.h:157
C4Real fix_y
Definition: C4Object.h:125
C4ObjectPtr Contained
Definition: C4Object.h:144
StdPtrAdapt< T > mkNamingPtrAdapt(T *&rpObj, const char *szNaming)
Definition: StdAdaptors.h:622
C4Action Action
Definition: C4Object.h:147
C4Shape Shape
Definition: C4Object.h:148
uint32_t OCF
Definition: C4Object.h:134
#define toC4CStrBuf(rBuf)
Definition: StdAdaptors.h:25
virtual bool FollowName(const char *szName)
Definition: StdCompiler.h:84
C4TargetRect SolidMask
Definition: C4Object.h:150
bool fOwnVertices
Definition: C4Object.h:149
C4Real xdir
Definition: C4Object.h:126
int32_t Controller
Definition: C4Object.h:111
C4DefGraphics Graphics
Definition: C4Def.h:191
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156
C4Real ydir
Definition: C4Object.h:126
int32_t LastEnergyLossCausePlayer
Definition: C4Object.h:112
uint32_t lightColor
Definition: C4Object.h:124
const C4Real Fix0
Definition: C4Real.h:312
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
Here is the call graph for this function:

◆ Contact()

bool C4Object::Contact ( int32_t  cnat)

Definition at line 114 of file C4Movement.cpp.

References C4PropList::Call(), CNATName(), FormatString(), C4PropList::GetPropertyInt(), P_ContactCalls, and PSF_Contact.

Referenced by ContactCheck(), and StopAndContact().

115 {
117  {
118  return !! Call(FormatString(PSF_Contact, CNATName(iCNAT)).getData());
119  }
120  return false;
121 }
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
const char * CNATName(int32_t cnat)
Definition: C4Movement.cpp:100
#define PSF_Contact
Definition: C4GameScript.h:69
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ContactAction()

void C4Object::ContactAction ( )

Definition at line 2922 of file C4Object.cpp.

References C4REAL100(), CNAT_Bottom, CNAT_Left, CNAT_Right, CNAT_Top, COMD_Down, COMD_Left, COMD_Right, COMD_Stop, COMD_Up, ComDirLike(), DFA_DIG, DFA_FLIGHT, DFA_HANGLE, DFA_SCALE, DFA_SWIM, DFA_WALK, DIR_Left, DIR_Right, FullCon, GBackSemiSolid(), C4PropList::GetPropertyInt(), C4PropList::GetPropertyP(), ObjectActionCornerScale(), ObjectActionFlat(), ObjectActionHangle(), ObjectActionJump(), ObjectActionKneel(), ObjectActionScale(), ObjectActionStand(), ObjectActionTumble(), ObjectActionWalk(), OCF_HitSpeed3, OCF_HitSpeed4, P_ObjectDisabled, and P_Procedure.

Referenced by DoMovement().

2923 {
2924  // Take certain action on contact. Evaluate t_contact-CNAT and Procedure.
2925 
2926  // Determine Procedure
2927  C4PropList* pActionDef = GetAction();
2928  if (!pActionDef) return;
2929  int32_t iProcedure=pActionDef->GetPropertyP(P_Procedure);
2930  int32_t fDisabled=pActionDef->GetPropertyInt(P_ObjectDisabled);
2931 
2932  //------------------------------- Hit Bottom ---------------------------------------------
2933  if (t_contact & CNAT_Bottom)
2934  switch (iProcedure)
2935  {
2936  case DFA_FLIGHT:
2937  if (ydir < 0) return;
2938  // Jump: FlatHit / HardHit / Walk
2939  if ((OCF & OCF_HitSpeed4) || fDisabled)
2940  if (ObjectActionFlat(this,Action.Dir)) return;
2941  if (OCF & OCF_HitSpeed3)
2942  if (ObjectActionKneel(this)) return;
2943  ObjectActionWalk(this);
2944  ydir = 0;
2945  return;
2946  case DFA_SCALE:
2947  // Scale down: stand
2949  {
2950  ObjectActionStand(this);
2951  return;
2952  }
2953  break;
2954  case DFA_DIG:
2955  // no special action
2956  break;
2957  case DFA_SWIM:
2958  // Try corner scale out
2959  if (!GBackSemiSolid(GetX(),GetY()-1+Def->Float*Con/FullCon-1))
2960  if (ObjectActionCornerScale(this)) return;
2961  break;
2962  }
2963 
2964  //------------------------------- Hit Ceiling -----------------------------------------
2965  if (t_contact & CNAT_Top)
2966  switch (iProcedure)
2967  {
2968  case DFA_WALK:
2969  // Walk: Stop
2970  ObjectActionStand(this); return;
2971  case DFA_SCALE:
2972  // Scale: Try hangle, else stop if going upward
2974  {
2975  if (ObjectActionHangle(this))
2976  {
2978  return;
2979  }
2981  }
2982  break;
2983  case DFA_FLIGHT:
2984  // Jump: Try hangle, else bounce off
2985  // High Speed Flight: Tumble
2986  if ((OCF & OCF_HitSpeed3) || fDisabled)
2987  { ObjectActionTumble(this, Action.Dir, xdir, ydir); break; }
2988  if (ObjectActionHangle(this)) return;
2989  break;
2990  case DFA_DIG:
2991  // No action
2992  break;
2993  case DFA_HANGLE:
2995  break;
2996  }
2997 
2998  //---------------------------- Hit Left Wall ----------------------------------------
2999  if (t_contact & CNAT_Left)
3000  {
3001  switch (iProcedure)
3002  {
3003  case DFA_FLIGHT:
3004  // High Speed Flight: Tumble
3005  if ((OCF & OCF_HitSpeed3) || fDisabled)
3006  { ObjectActionTumble(this, DIR_Left, xdir, ydir); break; }
3007  // Else
3008  else if (!ComDirLike(Action.ComDir, COMD_Right) && ObjectActionScale(this,DIR_Left)) return;
3009  break;
3010  case DFA_WALK:
3011  // Walk: Try scale
3013  {
3014  if (ObjectActionScale(this,DIR_Left))
3015  {
3016  ydir = C4REAL100(-1);
3017  return;
3018  }
3019  }
3020  // Heading away from solid
3022  {
3023  // Slide off
3024  ObjectActionJump(this,xdir/2,ydir,false);
3025  }
3026  return;
3027  case DFA_SWIM:
3028  // Only scale if swimming at the surface
3029  if (!GBackSemiSolid(GetX(),GetY()-1+Def->Float*Con/FullCon-1))
3030  {
3031  // Try scale, only if swimming at the surface.
3033  if (ObjectActionScale(this,DIR_Left)) return;
3034  // Try corner scale out
3035  if (ObjectActionCornerScale(this)) return;
3036  }
3037  return;
3038  case DFA_HANGLE:
3039  // Hangle: Try scale
3040  if (ObjectActionScale(this,DIR_Left))
3041  {
3042  ydir = C4REAL100(1);
3043  return;
3044  }
3045  return;
3046  case DFA_DIG:
3047  // Dig: no action
3048  break;
3049  }
3050  }
3051 
3052  //------------------------------ Hit Right Wall --------------------------------------
3053  if (t_contact & CNAT_Right)
3054  {
3055  switch (iProcedure)
3056  {
3057  case DFA_FLIGHT:
3058  // High Speed Flight: Tumble
3059  if ((OCF & OCF_HitSpeed3) || fDisabled)
3060  { ObjectActionTumble(this, DIR_Right, xdir, ydir); break; }
3061  // Else Scale
3062  else if (!ComDirLike(Action.ComDir, COMD_Left) && ObjectActionScale(this,DIR_Right)) return;
3063  break;
3064  case DFA_WALK:
3065  // Walk: Try scale
3067  {
3068  if (ObjectActionScale(this,DIR_Right))
3069  {
3070  ydir = C4REAL100(-1);
3071  return;
3072  }
3073  }
3074  // Heading away from solid
3076  {
3077  // Slide off
3078  ObjectActionJump(this,xdir/2,ydir,false);
3079  }
3080  return;
3081  case DFA_SWIM:
3082  // Only scale if swimming at the surface
3083  if (!GBackSemiSolid(GetX(),GetY()-1+Def->Float*Con/FullCon-1))
3084  {
3085  // Try scale
3087  if (ObjectActionScale(this,DIR_Right)) return;
3088  // Try corner scale out
3089  if (ObjectActionCornerScale(this)) return;
3090  }
3091  return;
3092  case DFA_HANGLE:
3093  // Hangle: Try scale
3094  if (ObjectActionScale(this,DIR_Right))
3095  {
3096  ydir = C4REAL100(1);
3097  return;
3098  }
3099  return;
3100  case DFA_DIG:
3101  // Dig: no action
3102  break;
3103  }
3104  }
3105 
3106  //---------------------------- Unresolved Cases ---------------------------------------
3107 
3108  // Flight stuck
3109  if (iProcedure==DFA_FLIGHT)
3110  {
3111  // Enforce slide free (might slide through tiny holes this way)
3112  if (!ydir)
3113  {
3114  int fAllowDown = !(t_contact & CNAT_Bottom);
3115  if (t_contact & CNAT_Right)
3116  {
3117  ForcePosition(fix_x - 1, fix_y + fAllowDown);
3118  xdir=ydir=0;
3119  }
3120  if (t_contact & CNAT_Left)
3121  {
3122  ForcePosition(fix_x + 1, fix_y + fAllowDown);
3123  xdir=ydir=0;
3124  }
3125  }
3126  if (!xdir)
3127  {
3128  if (t_contact & CNAT_Top)
3129  {
3130  ForcePosition(fix_x, fix_y + 1);
3131  xdir=ydir=0;
3132  }
3133  }
3134  }
3135 }
int32_t GetX() const
Definition: C4Object.h:287
void ForcePosition(C4Real tx, C4Real ty)
Definition: C4Movement.cpp:515
#define COMD_Down
Definition: C4Object.h:55
bool ObjectActionKneel(C4Object *cObj)
Definition: C4ObjectCom.cpp:94
int32_t Float
Definition: C4Def.h:120
void SetDir(int32_t tdir)
Definition: C4Object.cpp:2845
#define DIR_Right
Definition: C4Object.h:42
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
C4Real C4REAL100(int x)
Definition: C4Real.h:267
const int32_t FullCon
Definition: C4Constants.h:181
bool ObjectActionWalk(C4Object *cObj)
Definition: C4ObjectCom.cpp:39
C4Def * Def
Definition: C4Object.h:143
#define DIR_Left
Definition: C4Object.h:41
uint32_t t_contact
Definition: C4Object.h:133
C4PropertyName GetPropertyP(C4PropertyName k) const
Definition: C4PropList.cpp:855
int32_t Con
Definition: C4Object.h:174
bool ComDirLike(int32_t iComDir, int32_t iSample)
int32_t GetY() const
Definition: C4Object.h:288
bool ObjectActionCornerScale(C4Object *cObj)
#define COMD_Right
Definition: C4Object.h:53
#define COMD_Stop
Definition: C4Object.h:50
bool ObjectActionStand(C4Object *cObj)
Definition: C4ObjectCom.cpp:45
C4Real fix_x
Definition: C4Object.h:125
const BYTE CNAT_Top
Definition: C4Constants.h:111
C4PropList * GetAction() const
Definition: C4Object.cpp:2679
#define COMD_Up
Definition: C4Object.h:51
bool GBackSemiSolid(int32_t x, int32_t y)
Definition: C4Landscape.h:234
#define COMD_Left
Definition: C4Object.h:57
bool ObjectActionScale(C4Object *cObj, int32_t dir)
const BYTE CNAT_Right
Definition: C4Constants.h:110
int32_t Dir
Definition: C4Object.h:80
const uint32_t OCF_HitSpeed3
Definition: C4Constants.h:92
C4Real fix_y
Definition: C4Object.h:125
bool ObjectActionFlat(C4Object *cObj, int32_t dir)
C4Action Action
Definition: C4Object.h:147
uint32_t OCF
Definition: C4Object.h:134
const uint32_t OCF_HitSpeed4
Definition: C4Constants.h:95
bool ObjectActionHangle(C4Object *cObj)
bool ObjectActionTumble(C4Object *cObj, int32_t dir, C4Real xdir, C4Real ydir)
Definition: C4ObjectCom.cpp:79
C4Real xdir
Definition: C4Object.h:126
const BYTE CNAT_Left
Definition: C4Constants.h:109
const BYTE CNAT_Bottom
Definition: C4Constants.h:112
C4Real ydir
Definition: C4Object.h:126
bool ObjectActionJump(C4Object *cObj, C4Real xdir, C4Real ydir, bool fByCom)
Definition: C4ObjectCom.cpp:52
int32_t ComDir
Definition: C4Object.h:82
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ContactCheck()

int32_t C4Object::ContactCheck ( int32_t  atx,
int32_t  aty,
uint32_t *  border_hack_contacts = nullptr,
bool  collide_halfvehic = false 
)

Definition at line 136 of file C4Movement.cpp.

References Contact(), C4Shape::ContactCheck(), C4Shape::ContactCNAT, C4Shape::ContactCount, Shape, and t_contact.

Referenced by DoMovement(), and Stabilize().

137 {
138  // Check shape contact at given position
139  Shape.ContactCheck(iAtX,iAtY,border_hack_contacts,collide_halfvehic);
140 
141  // Store shape contact values in object t_contact
143 
144  // Contact script call for the first contacted cnat
145  if (Shape.ContactCNAT)
146  for (int32_t ccnat=0; ccnat<4; ccnat++) // Left, right, top bottom
147  if (Shape.ContactCNAT & (1<<ccnat))
148  if (Contact(1<<ccnat))
149  break; // Will stop on first positive return contact call!
150 
151  // Return shape contact count
152  return Shape.ContactCount;
153 }
int32_t ContactCount
Definition: C4Shape.h:49
uint32_t t_contact
Definition: C4Object.h:133
bool ContactCheck(int32_t cx, int32_t cy, uint32_t *border_hack_contacts=nullptr, bool collide_halfvehic=false)
Definition: C4Shape.cpp:350
int32_t ContactCNAT
Definition: C4Shape.h:48
C4Shape Shape
Definition: C4Object.h:148
bool Contact(int32_t cnat)
Definition: C4Movement.cpp:114
Here is the call graph for this function:
Here is the caller graph for this function:

◆ CopyMotion()

void C4Object::CopyMotion ( C4Object from)

Definition at line 503 of file C4Movement.cpp.

References fix_x, fix_y, UpdatePos(), xdir, and ydir.

Referenced by Collect(), and ExecMovement().

504 {
505  // Designed for contained objects, no static
506  if (fix_x != from->fix_x || fix_y != from->fix_y)
507  {
508  fix_x=from->fix_x; fix_y=from->fix_y;
509  // Resort into sectors
510  UpdatePos();
511  }
512  xdir=from->xdir; ydir=from->ydir;
513 }
void UpdatePos()
Definition: C4Object.cpp:372
C4Real fix_x
Definition: C4Object.h:125
C4Real fix_y
Definition: C4Object.h:125
C4Real xdir
Definition: C4Object.h:126
C4Real ydir
Definition: C4Object.h:126
Here is the call graph for this function:
Here is the caller graph for this function:

◆ CreateContents()

C4Object * C4Object::CreateContents ( C4PropList PropList)

Definition at line 1439 of file C4Object.cpp.

References AssignRemoval(), C4Game::CreateObject(), Enter(), and Game.

1440 {
1441  C4Object *nobj;
1442  if (!(nobj=Game.CreateObject(PropList,this,Owner))) return nullptr;
1443  if (!nobj->Enter(this)) { nobj->AssignRemoval(); return nullptr; }
1444  return nobj;
1445 }
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1263
C4Game Game
Definition: C4Globals.cpp:52
int32_t Owner
Definition: C4Object.h:110
void AssignRemoval(bool fExitContents=false)
Definition: C4Object.cpp:255
C4Object * CreateObject(C4PropList *type, C4Object *pCreator, int32_t owner=NO_OWNER, int32_t x=50, int32_t y=50, int32_t r=0, bool grow_from_center=false, C4Real xdir=Fix0, C4Real ydir=Fix0, C4Real rdir=Fix0, int32_t iController=NO_OWNER)
Definition: C4Game.cpp:1072
Here is the call graph for this function:

◆ CreateContentsByList()

bool C4Object::CreateContentsByList ( C4IDList idlist)

Definition at line 1447 of file C4Object.cpp.

References C4Id2Def(), C4IDList::GetCount(), and C4IDList::GetID().

Referenced by C4Player::PlaceReadyMaterial().

1448 {
1449  int32_t cnt,cnt2;
1450  for (cnt=0; idlist.GetID(cnt); cnt++)
1451  for (cnt2=0; cnt2<idlist.GetCount(cnt); cnt2++)
1452  if (!CreateContents(C4Id2Def(idlist.GetID(cnt))))
1453  return false;
1454  return true;
1455 }
C4ID GetID(size_t index, int32_t *ipCount=nullptr) const
Definition: C4IDList.cpp:99
C4Object * CreateContents(C4PropList *)
Definition: C4Object.cpp:1439
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:84
int32_t GetCount(size_t index) const
Definition: C4IDList.cpp:111
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Default()

void C4Object::Default ( )

Definition at line 91 of file C4Object.cpp.

References MNone, NO_OWNER, and C4ID::None.

92 {
93  id=C4ID::None;
94  nInfo.Clear();
95  RemovalDelay=0;
99  Category=0;
100  Con=0;
101  Mass=OwnMass=0;
102  Damage=0;
103  Energy=0;
104  Alive=false;
105  Breath=0;
106  InMat=MNone;
107  Color=0;
108  lightRange=0;
110  lightColor=0xffffffff;
111  fix_x=fix_y=fix_r=0;
112  xdir=ydir=rdir=0;
113  Mobile=false;
114  Unsorted=false;
115  Initializing=false;
116  OnFire=false;
117  InLiquid=false;
118  EntranceStatus=false;
121  t_contact=0;
122  OCF=0;
123  Action.Default();
124  Shape.Default();
125  fOwnVertices=false;
126  Contents.Default();
127  SolidMask.Default();
128  HalfVehicleSolidMask=false;
130  Def=nullptr;
131  Info=nullptr;
132  Command=nullptr;
133  Contained=nullptr;
134  TopFace.Default();
135  Menu=nullptr;
136  MaterialContents=nullptr;
137  Marker=0;
138  ColorMod=0xffffffff;
139  BlitMode=0;
140  CrewDisabled=false;
141  Layer=nullptr;
142  pSolidMaskData=nullptr;
143  pGraphics=nullptr;
144  pMeshInstance=nullptr;
145  pDrawTransform=nullptr;
146  pEffects=nullptr;
147  pGfxOverlay=nullptr;
149 
151 }
C4DrawTransform * pDrawTransform
Definition: C4Object.h:137
bool Alive
Definition: C4Object.h:176
void Clear()
Definition: StdBuf.h:466
int32_t Mass
Definition: C4Object.h:115
C4Rect PictureRect
Definition: C4Object.h:152
bool HalfVehicleSolidMask
Definition: C4Object.h:151
C4MaterialList * MaterialContents
Definition: C4Object.h:154
uint32_t Marker
Definition: C4Object.h:135
C4Command * Command
Definition: C4Object.h:167
int32_t OwnMass
Definition: C4Object.h:115
C4Real rdir
Definition: C4Object.h:126
bool OnFire
Definition: C4Object.h:173
void Default()
Definition: C4Shape.cpp:36
int32_t Breath
Definition: C4Object.h:118
int32_t InMat
Definition: C4Object.h:119
int32_t RemovalDelay
Definition: C4Object.h:109
C4ObjectPtr Layer
Definition: C4Object.h:136
void ClearParticleLists()
Definition: C4Object.cpp:246
C4ObjectInfo * Info
Definition: C4Object.h:145
bool Mobile
Definition: C4Object.h:128
int32_t Energy
Definition: C4Object.h:117
int32_t lightFadeoutRange
Definition: C4Object.h:123
int32_t AudiblePlayer
Definition: C4Object.h:121
bool InLiquid
Definition: C4Object.h:131
class C4ObjectMenu * Menu
Definition: C4Object.h:140
const int32_t MNone
Definition: C4Constants.h:177
C4NotifyingObjectList Contents
Definition: C4Object.h:153
C4Def * Def
Definition: C4Object.h:143
bool CrewDisabled
Definition: C4Object.h:164
uint32_t t_contact
Definition: C4Object.h:133
int32_t AudiblePan
Definition: C4Object.h:121
void Default()
Definition: C4Facet.cpp:31
int32_t lightRange
Definition: C4Object.h:122
void Default()
Definition: C4Action.cpp:30
static const C4ID None
Definition: C4Id.h:39
int32_t Con
Definition: C4Object.h:174
int32_t Owner
Definition: C4Object.h:110
uint32_t Color
Definition: C4Object.h:120
bool EntranceStatus
Definition: C4Object.h:132
const int NO_OWNER
Definition: C4Constants.h:137
C4DefGraphics * pGraphics
Definition: C4Object.h:155
void Default()
Definition: C4Rect.cpp:26
int32_t Damage
Definition: C4Object.h:116
bool Unsorted
Definition: C4Object.h:129
int32_t Category
Definition: C4Object.h:113
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
C4Real fix_r
Definition: C4Object.h:125
C4Real fix_x
Definition: C4Object.h:125
StdCopyStrBuf nInfo
Definition: C4Object.h:169
uint32_t ColorMod
Definition: C4Object.h:162
int32_t iLastAttachMovementFrame
Definition: C4Object.h:127
virtual void Default()
uint32_t BlitMode
Definition: C4Object.h:163
C4Effect * pEffects
Definition: C4Object.h:157
C4Real fix_y
Definition: C4Object.h:125
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Action Action
Definition: C4Object.h:147
C4Shape Shape
Definition: C4Object.h:148
int32_t Audible
Definition: C4Object.h:121
uint32_t OCF
Definition: C4Object.h:134
void Default()
Definition: C4Rect.cpp:39
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
bool fOwnVertices
Definition: C4Object.h:149
C4Real xdir
Definition: C4Object.h:126
int32_t Controller
Definition: C4Object.h:111
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156
C4Real ydir
Definition: C4Object.h:126
int32_t LastEnergyLossCausePlayer
Definition: C4Object.h:112
uint32_t lightColor
Definition: C4Object.h:124
C4Facet TopFace
Definition: C4Object.h:142
bool Initializing
Definition: C4Object.h:130

◆ Delete()

virtual bool C4PropList::Delete ( )
inlinevirtualinherited

Reimplemented in C4PropListStaticMember, C4PropListStatic, C4PropListScript, and C4Def.

Definition at line 90 of file C4PropList.h.

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

90 { return false; }
Here is the caller graph for this function:

◆ Denumerate()

void C4Object::Denumerate ( C4ValueNumbers numbers)
overridevirtual

Reimplemented from C4PropList.

Definition at line 2312 of file C4Object.cpp.

References C4PropList::Denumerate(), C4GraphicsOverlay::GetNext(), and C4Command::Next.

Referenced by C4ObjectList::Denumerate().

2313 {
2314  C4PropList::Denumerate(numbers);
2315  // Standard enumerated pointers
2320 
2321  // Post-compile object list
2323 
2324  // Commands
2325  for (C4Command *pCom=Command; pCom; pCom=pCom->Next)
2326  pCom->Denumerate(numbers);
2327 
2328  // effects
2329  if (pEffects) pEffects->Denumerate(numbers);
2330 
2331  // gfx overlays
2332  if (pGfxOverlay)
2333  for (C4GraphicsOverlay *pGfxOvrl = pGfxOverlay; pGfxOvrl; pGfxOvrl = pGfxOvrl->GetNext())
2334  pGfxOvrl->DenumeratePointers();
2335 
2336  // mesh instance
2338 }
C4GraphicsOverlay * GetNext() const
bool DenumeratePointers()
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:167
void Denumerate(C4ValueNumbers *) override
Definition: C4Effect.cpp:176
C4ObjectPtr Target2
Definition: C4Object.h:87
C4ObjectPtr Layer
Definition: C4Object.h:136
void DenumeratePointers()
Definition: C4ObjectPtr.cpp:47
virtual void Denumerate(C4ValueNumbers *)
Definition: C4PropList.cpp:350
C4NotifyingObjectList Contents
Definition: C4Object.h:153
void DenumeratePointers()
Definition: StdMesh.cpp:1672
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:171
C4ObjectPtr Target
Definition: C4Object.h:87
C4Effect * pEffects
Definition: C4Object.h:157
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Action Action
Definition: C4Object.h:147
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DirectComContents()

void C4Object::DirectComContents ( C4Object pTarget,
bool  fDoCalls 
)

Definition at line 4250 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, Contained, StartSoundEffect(), and C4PropList::Status.

4251 {
4252  // safety
4253  if (!pTarget || !pTarget->Status || pTarget->Contained != this) return;
4254  // Desired object already at front?
4255  if (Contents.GetObject() == pTarget) return;
4256  // select object via script?
4257  if (fDoCalls)
4258  if (Call("~ControlContents", &C4AulParSet(pTarget)))
4259  return;
4260  // default action
4261  if (!(Contents.ShiftContents(pTarget))) return;
4262  // Selection sound
4263  if (fDoCalls) if (!Contents.GetObject()->Call("~Selection", &C4AulParSet(this))) StartSoundEffect("Clonk::Action::Grab",false,100,this);
4264  // update menu with the new item in "put" entry
4265  if (Menu && Menu->IsActive() && Menu->IsContextMenu())
4266  {
4267  Menu->Refill();
4268  }
4269  // Done
4270  return;
4271 }
bool IsContextMenu()
Definition: C4Menu.h:164
bool Refill()
Definition: C4Menu.cpp:915
bool ShiftContents(C4Object *pNewFirst)
C4Object * GetObject(int Index=0) const
C4SoundInstance * StartSoundEffect(const char *szSndName, bool fLoop, int32_t iVolume, C4Object *pObj, int32_t iCustomFalloffDistance, int32_t iPitch, C4SoundModifier *modifier)
class C4ObjectMenu * Menu
Definition: C4Object.h:140
C4NotifyingObjectList Contents
Definition: C4Object.h:153
int32_t Status
Definition: C4PropList.h:168
bool IsActive()
Definition: C4Menu.cpp:480
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:

◆ DoBreath()

void C4Object::DoBreath ( int32_t  iChange)

Definition at line 1146 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, P_MaxBreath, and PSF_BreathChange.

1147 {
1148  // Do change
1149  iChange = Clamp<int32_t>(iChange, -Breath, GetPropertyInt(P_MaxBreath) - Breath);
1150  Breath += iChange;
1151  // call to object
1152  Call(PSF_BreathChange,&C4AulParSet(iChange));
1153 }
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
int32_t Breath
Definition: C4Object.h:118
#define PSF_BreathChange
Definition: C4GameScript.h:143
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110

◆ DoCon()

void C4Object::DoCon ( int32_t  iChange,
bool  grow_from_center 
)

Definition at line 1155 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, Enter(), Exit(), FullCon, GetObject(), GetX(), GetY(), PSF_Initialize, and PSF_OnCompletionChange.

Referenced by C4Game::NewObject(), and C4ControlEMMoveObject::~C4ControlEMMoveObject().

1156 {
1157  C4Real strgt_con_b = fix_y + Shape.GetBottom();
1158  bool fWasFull = (Con>=FullCon);
1159  int32_t old_con = Con;
1160 
1161  // Change con
1162  if (Def->Oversize)
1163  Con=std::max<int32_t>(Con+iChange,0);
1164  else
1165  Con=Clamp<int32_t>(Con+iChange,0,FullCon);
1166 
1167  // Update OCF
1168  SetOCF();
1169 
1170  // Mass
1171  UpdateMass();
1172 
1173  // shape and position
1174  UpdateShape();
1175  // make the bottom-most vertex stay in place
1176  if (!grow_from_center)
1177  {
1178  fix_y = strgt_con_b - Shape.GetBottom();
1179  }
1180  // Face (except for the shape)
1181  UpdateFace(false);
1182 
1183  // Do a callback on completion change.
1184  if (iChange != 0)
1185  Call(PSF_OnCompletionChange, &C4AulParSet(old_con, Con));
1186 
1187  // Unfullcon
1188  if (fWasFull && (Con<FullCon))
1189  {
1190  // Lose contents
1191  if (!Def->IncompleteActivity)
1192  {
1193  C4Object *cobj;
1194  while ((cobj=Contents.GetObject()))
1195  if (Contained) cobj->Enter(Contained);
1196  else cobj->Exit(cobj->GetX(),cobj->GetY());
1197  SetAction(nullptr);
1198  }
1199  }
1200 
1201  // Completion
1202  if (!fWasFull && (Con>=FullCon))
1204 
1205  // Con Zero Removal
1206  if (Con<=0)
1207  AssignRemoval();
1208  // Mesh Graphics Update
1209  else if(pMeshInstance)
1210  pMeshInstance->SetCompletion(Def->GrowthType ? 1.0f : static_cast<float>(Con)/static_cast<float>(FullCon));
1211 }
int32_t GetX() const
Definition: C4Object.h:287
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1263
int GetBottom()
Definition: C4Shape.cpp:468
C4Object * GetObject(int Index=0) const
Definition: C4Real.h:58
const int32_t FullCon
Definition: C4Constants.h:181
#define PSF_Initialize
Definition: C4GameScript.h:34
C4NotifyingObjectList Contents
Definition: C4Object.h:153
int32_t GrowthType
Definition: C4Def.h:111
C4Def * Def
Definition: C4Object.h:143
void UpdateShape(bool bUpdateVertices=true)
Definition: C4Object.cpp:345
int32_t Con
Definition: C4Object.h:174
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2686
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
Definition: C4Object.cpp:1227
#define PSF_OnCompletionChange
Definition: C4GameScript.h:103
void AssignRemoval(bool fExitContents=false)
Definition: C4Object.cpp:255
void UpdateMass()
Definition: C4Object.cpp:641
int32_t GetY() const
Definition: C4Object.h:288
int32_t Oversize
Definition: C4Def.h:129
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:380
void SetCompletion(float completion)
Definition: StdMesh.cpp:1150
int32_t IncompleteActivity
Definition: C4Def.h:128
C4Real fix_y
Definition: C4Object.h:125
void SetOCF()
Definition: C4Object.cpp:669
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Shape Shape
Definition: C4Object.h:148
StdMeshInstance * pMeshInstance
Definition: C4Object.h:156
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDamage()

void C4Object::DoDamage ( int32_t  iLevel,
int32_t  iCausedByPlr,
int32_t  iCause 
)

Definition at line 1095 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, and PSF_Damage.

1096 {
1097  // non-living: ask effects first
1098  if (pEffects && !Alive)
1099  {
1100  pEffects->DoDamage(iChange, iCause, iCausedBy);
1101  if (!iChange) return;
1102  }
1103  // Change value
1104  Damage = std::max<int32_t>( Damage+iChange, 0 );
1105  // Engine script call
1106  Call(PSF_Damage,&C4AulParSet(iChange, iCause, iCausedBy));
1107 }
bool Alive
Definition: C4Object.h:176
#define PSF_Damage
Definition: C4GameScript.h:63
int32_t Damage
Definition: C4Object.h:116
C4Effect * pEffects
Definition: C4Object.h:157
void DoDamage(int32_t &riDamage, int32_t iDamageType, int32_t iCausePlr)
Definition: C4Effect.cpp:394
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110

◆ DoEnergy()

void C4Object::DoEnergy ( int32_t  iChange,
bool  fExact,
int32_t  iCause,
int32_t  iCausedByPlr 
)

Definition at line 1109 of file C4Object.cpp.

References C4MaxPhysical, C4ScriptGuiWindowActionID::Call, P_MaxEnergy, and PSF_EnergyChange.

Referenced by C4GameObjects::CrossCheck(), and ObjectComPunch().

1110 {
1111  if (!fExact)
1112  {
1113  // Clamp range of change to prevent integer overflow errors
1114  // Do not clamp directly to (0...MaxEnergy)-current_energy, because
1115  // the change value calculated here may be reduced by effect callbacks
1116  int32_t scale = C4MaxPhysical / 100; // iChange 100% = Physical 100000
1117  iChange = Clamp<int32_t>(iChange, std::numeric_limits<int32_t>::min()/scale, std::numeric_limits<int32_t>::max()/scale)*scale;
1118  }
1119  // Was zero?
1120  bool fWasZero=(Energy==0);
1121  // Mark last damage causing player to trace kills
1122  if (iChange < 0) UpdatLastEnergyLossCause(iCausedByPlr);
1123  // Living things: ask effects for change first
1124  if (pEffects && Alive)
1125  pEffects->DoDamage(iChange, iCause, iCausedByPlr);
1126  // Do change
1127  iChange = Clamp<int32_t>(iChange, -Energy, GetPropertyInt(P_MaxEnergy) - Energy);
1128  Energy += iChange;
1129  // call to object
1130  Call(PSF_EnergyChange,&C4AulParSet(iChange, iCause, iCausedByPlr));
1131  // Alive and energy reduced to zero: death
1132  if (Alive) if (Energy==0) if (!fWasZero) AssignDeath(false);
1133 }
const int32_t C4MaxPhysical
Definition: C4InfoCore.h:28
bool Alive
Definition: C4Object.h:176
#define PSF_EnergyChange
Definition: C4GameScript.h:142
void AssignDeath(bool fForced)
Definition: C4Object.cpp:991
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
void UpdatLastEnergyLossCause(int32_t iNewCausePlr)
Definition: C4Object.cpp:1135
int32_t Energy
Definition: C4Object.h:117
C4Effect * pEffects
Definition: C4Object.h:157
void DoDamage(int32_t &riDamage, int32_t iDamageType, int32_t iCausePlr)
Definition: C4Effect.cpp:394
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the caller graph for this function:

◆ DoExperience()

void C4Object::DoExperience ( int32_t  change)

Definition at line 1213 of file C4Object.cpp.

References DefaultRanks, and C4RankSystem::Experience().

Referenced by C4Player::CountControl(), and C4Command::Finish().

1214 {
1215  const int32_t MaxExperience = 100000000;
1216 
1217  if (!Info) return;
1218 
1219  Info->Experience=Clamp<int32_t>(Info->Experience+change,0,MaxExperience);
1220 
1221  // Promotion check
1222  if (Info->Experience<MaxExperience)
1224  Promote(Info->Rank+1, false, false);
1225 }
C4RankSystem DefaultRanks
bool Promote(int32_t torank, bool exception, bool fForceRankName)
Definition: C4Object.cpp:1715
C4ObjectInfo * Info
Definition: C4Object.h:145
int32_t Experience
Definition: C4InfoCore.h:43
int Experience(int iRank)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoMotion()

void C4Object::DoMotion ( int32_t  mx,
int32_t  my 
)

Definition at line 123 of file C4Movement.cpp.

References fix_x, fix_y, pSolidMaskData, and C4SolidMask::Remove().

Referenced by DoMovement().

124 {
126  fix_x += mx; fix_y += my;
127 }
void Remove(bool fBackupAttachment)
C4Real fix_x
Definition: C4Object.h:125
C4Real fix_y
Definition: C4Object.h:125
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoMovement()

void C4Object::DoMovement ( )

Definition at line 202 of file C4Movement.cpp.

References Action, Alive, ApplyFriction(), C4Shape::Attach(), C4PropList::Call(), CNAT_Left, CNAT_Right, Con, ContactAction(), ContactCheck(), ContactVtxCNAT(), ContactVtxFriction(), ContactVtxWeight(), Def, C4Landscape::DigFree(), C4Landscape::DigFreeRect(), DoMotion(), Fix0, fix_r, fix_x, fix_y, FixFullCircle, FixHalfCircle, fixtoi(), FullCon, GetAction(), C4PropList::GetPropertyInt(), C4Shape::GetX(), GetX(), C4Shape::GetY(), GetY(), C4Rect::Hgt, InLiquid, IsInLiquidCheck(), itofix(), Landscape, Mass, NoAttachAction(), C4Def::NoHorizontalMove, OCF, OCF_HitSpeed1, OCF_HitSpeed2, OCF_HitSpeed3, OCF_Rotate, P_DigFree, PSF_Hit, PSF_Hit2, PSF_Hit3, pSolidMaskData, rdir, RedirectForce(), C4SolidMask::Remove(), C4Def::Rotateable, Shape, SideBounds(), Sign(), C4Action::t_attach, t_contact, UpdateFace(), UpdatePos(), UpdateShape(), UpdateSolidMask(), VerticalBounds(), C4Rect::Wdt, xdir, and ydir.

Referenced by ExecMovement().

203 {
204  int32_t iContact=0;
205  bool fAnyContact=false; int iContacts = 0;
206  BYTE fTurned=0,fRedirectYR=0,fNoAttach=0;
207  // Restrictions
208  if (Def->NoHorizontalMove) xdir=0;
209  // Dig free target area
210  C4PropList* pActionDef = GetAction();
211  if (pActionDef)
212  if (pActionDef->GetPropertyInt(P_DigFree))
213  {
214  int ctcox, ctcoy;
215  // Shape size square
216  if (pActionDef->GetPropertyInt(P_DigFree)==1)
217  {
218  ctcox=fixtoi(fix_x+xdir); ctcoy=fixtoi(fix_y+ydir);
219  ::Landscape.DigFreeRect(ctcox+Shape.GetX(),ctcoy+Shape.GetY(),Shape.Wdt,Shape.Hgt,this);
220  }
221  // Free size round (variable size)
222  else
223  {
224  ctcox=fixtoi(fix_x+xdir); ctcoy=fixtoi(fix_y+ydir);
225  int32_t rad = pActionDef->GetPropertyInt(P_DigFree);
226  if (Con<FullCon) rad = rad*6*Con/5/FullCon;
227  ::Landscape.DigFree(ctcox,ctcoy-1,rad,this);
228  }
229  }
230 
231  // store previous movement and ocf
232  C4Real oldxdir(xdir), oldydir(ydir);
233  uint32_t old_ocf = OCF;
234 
235  bool fMoved = false;
236  C4Real new_x = fix_x + xdir;
237  C4Real new_y = fix_y + ydir;
238  SideBounds(new_x);
239 
240  if (!Action.t_attach) // Unattached movement = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
241  {
242  // Horizontal movement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
243  // Move to target
244  while (fixtoi(new_x) != fixtoi(fix_x))
245  {
246  // Next step
247  int step = Sign(new_x - fix_x);
248  uint32_t border_hack_contacts = 0;
249  iContact=ContactCheck(GetX() + step, GetY(), &border_hack_contacts);
250  if (iContact || border_hack_contacts)
251  {
252  fAnyContact=true; iContacts |= t_contact | border_hack_contacts;
253  }
254  if (iContact)
255  {
256  // Abort horizontal movement
257  new_x = fix_x;
258  // Vertical redirection (always)
259  RedirectForce(xdir,ydir,-1);
260  ApplyFriction(ydir,ContactVtxFriction(this));
261  }
262  else // Free horizontal movement
263  {
264  DoMotion(step, 0);
265  fMoved = true;
266  }
267  }
268  // Vertical movement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
269  // Movement target
270  new_y = fix_y + ydir;
271  // Movement bounds (vertical)
272  VerticalBounds(new_y);
273  // Move to target
274  while (fixtoi(new_y) != fixtoi(fix_y))
275  {
276  // Next step
277  int step = Sign(new_y - fix_y);
278  if ((iContact=ContactCheck(GetX(), GetY() + step, nullptr, ydir > 0)))
279  {
280  fAnyContact=true; iContacts |= t_contact;
281  new_y = fix_y;
282  // Vertical contact horizontal friction
283  ApplyFriction(xdir,ContactVtxFriction(this));
284  // Redirection slide or rotate
285  if (!ContactVtxCNAT(this,CNAT_Left))
286  RedirectForce(ydir,xdir,-1);
287  else if (!ContactVtxCNAT(this,CNAT_Right))
288  RedirectForce(ydir,xdir,+1);
289  else
290  {
291  // living things are always capable of keeping their rotation
292  if (OCF & OCF_Rotate) if (iContact==1) if (!Alive)
293  {
294  RedirectForce(ydir,rdir,-ContactVtxWeight(this));
295  fRedirectYR=1;
296  }
297  ydir=0;
298  }
299  }
300  else // Free vertical movement
301  {
302  DoMotion(0,step);
303  fMoved = true;
304  }
305  }
306  }
307  if (Action.t_attach) // Attached movement = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
308  {
309  VerticalBounds(new_y);
310  // Move to target
311  do
312  {
313  // Set next step target
314  int step_x = 0, step_y = 0;
315  if (fixtoi(new_x) != GetX())
316  step_x = Sign(fixtoi(new_x) - GetX());
317  else if (fixtoi(new_y) != GetY())
318  step_y = Sign(fixtoi(new_y) - GetY());
319  int32_t ctx = GetX() + step_x;
320  int32_t cty = GetY() + step_y;
321  // Attachment check
322  if (!Shape.Attach(ctx,cty,Action.t_attach))
323  fNoAttach=1;
324  else
325  {
326  // Attachment change to ctx/cty overrides target
327  if (ctx != GetX() + step_x)
328  {
329  xdir = Fix0; new_x = itofix(ctx);
330  }
331  if (cty != GetY() + step_y)
332  {
333  ydir = Fix0; new_y = itofix(cty);
334  }
335  }
336  // Contact check & evaluation
337  uint32_t border_hack_contacts = 0;
338  iContact=ContactCheck(ctx,cty,&border_hack_contacts);
339  if (iContact || border_hack_contacts)
340  {
341  fAnyContact=true; iContacts |= border_hack_contacts | t_contact;
342  }
343  if (iContact)
344  {
345  // Abort movement
346  if (ctx != GetX())
347  {
348  ctx = GetX(); new_x = fix_x;
349  }
350  if (cty != GetY())
351  {
352  cty = GetY(); new_y = fix_y;
353  }
354  }
355  DoMotion(ctx - GetX(), cty - GetY());
356  fMoved = true;
357  }
358  while (fixtoi(new_x) != GetX() || fixtoi(new_y) != GetY());
359  }
360 
361  if(fix_x != new_x || fix_y != new_y)
362  {
363  fMoved = true;
365  fix_x = new_x;
366  fix_y = new_y;
367  }
368  // Rotation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
369  if (OCF & OCF_Rotate && !!rdir)
370  {
371  C4Real target_r = fix_r + rdir * 5;
372  // Rotation limit
373  if (Def->Rotateable>1)
374  {
375  if (target_r > itofix(Def->Rotateable))
376  { target_r = itofix(Def->Rotateable); rdir=0; }
377  if (target_r < itofix(-Def->Rotateable))
378  { target_r = itofix(-Def->Rotateable); rdir=0; }
379  }
380  int32_t ctx=GetX(); int32_t cty=GetY();
381  // Move to target
382  while (fixtoi(fix_r) != fixtoi(target_r))
383  {
384  // Save step undos
385  C4Real lcobjr = fix_r; C4Shape lshape=Shape;
386  // Try next step
387  fix_r += Sign(target_r - fix_r);
388  UpdateShape();
389  // attached rotation: rotate around attachment pos
390  if (Action.t_attach && !fNoAttach)
391  {
392  // more accurately, attachment should be evaluated by a rotation around the attachment vertex
393  // however, as long as this code is only used for some surfaces adjustment for large vehicles,
394  // it's enough to assume rotation around the center
395  ctx=GetX(); cty=GetY();
396  // evaluate attachment, but do not bother about attachment loss
397  // that will then be done in next execution cycle
398  Shape.Attach(ctx,cty,Action.t_attach);
399  }
400  // check for contact
401  if ((iContact=ContactCheck(ctx,cty))) // Contact
402  {
403  fAnyContact=true; iContacts |= t_contact;
404  // Undo step and abort movement
405  Shape=lshape;
406  target_r = fix_r = lcobjr;
407  // last UpdateShape-call might have changed sector lists!
408  UpdatePos();
409  // Redirect to GetY()
410  if (iContact==1) if (!fRedirectYR)
411  RedirectForce(rdir,ydir,-1);
412  // Stop rotation
413  rdir=0;
414  }
415  else
416  {
417  fTurned=1;
418  if (ctx != GetX() || cty != GetY())
419  {
420  fix_x = itofix(ctx); fix_y = itofix(cty);
421  }
422  }
423  }
424  // Circle bounds
425  if (target_r < -FixHalfCircle) { target_r += FixFullCircle; }
426  if (target_r > +FixHalfCircle) { target_r -= FixFullCircle; }
427  fix_r = target_r;
428  }
429  // Reput solid mask if moved by motion
430  if (fMoved || fTurned) UpdateSolidMask(true);
431  // Misc checks ===========================================================================================
432  // InLiquid check
433  // this equals C4Object::UpdateLiquid, but the "fNoAttach=false;"-line
434  if (IsInLiquidCheck()) // In Liquid
435  {
436  if (!InLiquid) // Enter liquid
437  {
438  if (OCF & OCF_HitSpeed2)
439  if (Mass>3) Splash();
440  fNoAttach=false;
441  InLiquid=true;
442  }
443  }
444  else // Out of liquid
445  {
446  if (InLiquid) // Leave liquid
447  InLiquid=false;
448  }
449  // Contact Action
450  if (fAnyContact)
451  {
452  t_contact = iContacts;
453  ContactAction();
454  }
455  // Attachment Loss Action
456  if (fNoAttach)
457  NoAttachAction();
458  // Movement Script Execution
459  if (fAnyContact)
460  {
461  C4AulParSet pars(fixtoi(oldxdir, 100), fixtoi(oldydir, 100));
462  if (old_ocf & OCF_HitSpeed1) Call(PSF_Hit, &pars);
463  if (old_ocf & OCF_HitSpeed2) Call(PSF_Hit2, &pars);
464  if (old_ocf & OCF_HitSpeed3) Call(PSF_Hit3, &pars);
465  }
466  // Rotation gfx
467  if (fTurned)
468  UpdateFace(true);
469  else
470  // pos changed?
471  if (fMoved) UpdatePos();
472 }
const uint32_t OCF_HitSpeed1
Definition: C4Constants.h:84
int32_t ContactCheck(int32_t atx, int32_t aty, uint32_t *border_hack_contacts=nullptr, bool collide_halfvehic=false)
Definition: C4Movement.cpp:136
int32_t GetX() const
Definition: C4Object.h:287
#define PSF_Hit
Definition: C4GameScript.h:49
bool IsInLiquidCheck() const
Definition: C4Object.cpp:4107
bool Alive
Definition: C4Object.h:176
int32_t DigFree(int32_t tx, int32_t ty, int32_t rad, C4Object *by_object=nullptr, bool no_dig2objects=false, bool no_instability_check=false)
int32_t Mass
Definition: C4Object.h:115
void Remove(bool fBackupAttachment)
C4Real rdir
Definition: C4Object.h:126
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
int32_t DigFreeRect(int32_t tx, int32_t ty, int32_t wdt, int32_t hgt, C4Object *by_object=nullptr, bool no_dig2objects=false, bool no_instability_check=false)
uint8_t BYTE
int Sign(T val)
Definition: Standard.h:45
int32_t NoHorizontalMove
Definition: C4Def.h:122
Definition: C4Real.h:58
const int32_t FullCon
Definition: C4Constants.h:181
void UpdatePos()
Definition: C4Object.cpp:372
int32_t Rotateable
Definition: C4Def.h:119
int32_t Wdt
Definition: C4Rect.h:30
bool InLiquid
Definition: C4Object.h:131
const uint32_t OCF_HitSpeed2
Definition: C4Constants.h:91
void SideBounds(C4Real &ctcox)
Definition: C4Movement.cpp:156
C4Def * Def
Definition: C4Object.h:143
int32_t t_attach
Definition: C4Object.h:86
void ApplyFriction(C4Real &tval, int32_t percent)
Definition: C4Movement.cpp:52
void RedirectForce(C4Real &from, C4Real &to, int32_t tdir)
Definition: C4Movement.cpp:44
void UpdateShape(bool bUpdateVertices=true)
Definition: C4Object.cpp:345
#define PSF_Hit2
Definition: C4GameScript.h:50
uint32_t t_contact
Definition: C4Object.h:133
int32_t GetX() const
Definition: C4Shape.h:62
int32_t ContactVtxFriction(C4Object *cobj)
Definition: C4Movement.cpp:91
C4Landscape Landscape
void ContactAction()
Definition: C4Object.cpp:2922
void NoAttachAction()
Definition: C4Object.cpp:2887
int32_t Con
Definition: C4Object.h:174
C4Fixed itofix(int32_t x)
Definition: C4Real.h:261
const C4Real FixFullCircle
Definition: C4Movement.cpp:33
const uint32_t OCF_Rotate
Definition: C4Constants.h:88
int32_t GetY() const
Definition: C4Object.h:288
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:380
void VerticalBounds(C4Real &ctcoy)
Definition: C4Movement.cpp:179
int32_t GetY() const
Definition: C4Shape.h:63
int32_t ContactVtxWeight(C4Object *cobj)
Definition: C4Movement.cpp:76
C4Real fix_r
Definition: C4Object.h:125
C4Real fix_x
Definition: C4Object.h:125
C4PropList * GetAction() const
Definition: C4Object.cpp:2679
const BYTE CNAT_Right
Definition: C4Constants.h:110
#define PSF_Hit3
Definition: C4GameScript.h:51
const uint32_t OCF_HitSpeed3
Definition: C4Constants.h:92
C4Real fix_y
Definition: C4Object.h:125
int32_t Hgt
Definition: C4Rect.h:30
C4Action Action
Definition: C4Object.h:147
C4Shape Shape
Definition: C4Object.h:148
uint32_t OCF
Definition: C4Object.h:134
void UpdateSolidMask(bool fRestoreAttachedObjects)
Definition: C4Object.cpp:4147
bool ContactVtxCNAT(C4Object *cobj, BYTE cnat_dir)
Definition: C4Movement.cpp:63
C4SolidMask * pSolidMaskData
Definition: C4Object.h:177
int fixtoi(const C4Fixed &x)
Definition: C4Real.h:259
C4Real xdir
Definition: C4Object.h:126
const C4Real FixHalfCircle
Definition: C4Movement.cpp:33
const BYTE CNAT_Left
Definition: C4Constants.h:109
bool Attach(int32_t &cx, int32_t &cy, BYTE cnat_pos)
Definition: C4Shape.cpp:183
C4Real ydir
Definition: C4Object.h:126
void DoMotion(int32_t mx, int32_t my)
Definition: C4Movement.cpp:123
const C4Real Fix0
Definition: C4Real.h:312
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoSelect()

bool C4Object::DoSelect ( )

Definition at line 4316 of file C4Object.cpp.

References C4ScriptGuiWindowActionID::Call, and PSF_CrewSelection.

Referenced by C4Player::SetCursor().

4317 {
4318  // selection allowed?
4319  if (CrewDisabled) return false;
4320  // do callback
4322  // done
4323  return true;
4324 }
#define PSF_CrewSelection
Definition: C4GameScript.h:86
bool CrewDisabled
Definition: C4Object.h:164
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110
Here is the caller graph for this function:

◆ Draw()

void C4Object::Draw ( C4TargetFacet cgo,
int32_t  iByPlayer = -1,
DrawMode  eDrawMode = ODM_Normal,
float  offX = 0,
float  offY = 0 
)

Definition at line 1788 of file C4Object.cpp.

References C4Value::_getInt(), ACenter, Angle(), StdStrBuf::Append(), StdStrBuf::AppendChar(), StdStrBuf::AppendFormat(), C4Draw::Blit(), C4CMD_Acquire, C4CMD_Buy, C4CMD_Call, C4CMD_MoveTo, C4CMD_None, C4CMD_Put, C4CMD_Sell, C4CMD_Transfer, C4D_IgnoreFoW, C4D_Parallax, C4RGB, C4Command::Command, CommandName(), C4Command::Data, C4Draw::DEFAULT_MESSAGE_COLOR, C4Draw::DrawFrameDw(), C4Draw::DrawLineDw(), C4Command::Finished, Fix0, fixtof(), C4GraphicsResource::FontRegular, FullCon, C4String::GetCStr(), StdStrBuf::getData(), C4Value::GetDataString(), C4Draw::GetFoW(), C4PropList::GetName(), C4GraphicsOverlay::GetNext(), C4PropList::GetPropertyInt(), CStdFont::GetTextExtent(), GraphicsResource, GraphicsSystem, C4Facet::Hgt, C4Command::Next, P_FacetBase, P_FacetTargetStretch, pDraw, C4ScriptUniform::Push(), C4Draw::scriptUniform, C4Draw::SetFoW(), C4GraphicsSystem::Show8BitSurface, C4GraphicsSystem::ShowCommand, C4GraphicsSystem::ShowVertices, sprintf, C4Facet::Surface, C4Command::Target, C4Command::Target2, C4Command::Text, C4Draw::TextOut(), C4Command::Tx, C4Command::Ty, C4DefGraphics::TYPE_Bitmap, C4Surface::Wdt, C4Facet::Wdt, C4Facet::X, C4Facet::Y, and C4TargetFacet::Zoom.

Referenced by C4ObjectList::Draw(), C4GraphicsOverlay::Draw(), C4ObjectList::DrawIfCategory(), and C4EditCursor::DrawObject().

1789 {
1790 #ifndef USE_CONSOLE
1791  C4Facet ccgo;
1792 
1793  // Status
1794  if (!Status || !Def) return;
1795 
1796  // visible?
1797  if (!IsVisible(iByPlayer, !!eDrawMode)) return;
1798 
1799  // Set up custom uniforms.
1800  auto uniform_popper = pDraw->scriptUniform.Push(this);
1801 
1802  // Line
1803  if (Def->Line) { DrawLine(cgo, iByPlayer); return; }
1804 
1805  // background particles (bounds not checked)
1806  if (BackParticles) BackParticles->Draw(cgo, this);
1807 
1808  // Object output position
1809  float newzoom = cgo.Zoom;
1810  if (eDrawMode!=ODM_Overlay)
1811  {
1812  if (!GetDrawPosition(cgo, offX, offY, newzoom)) return;
1813  }
1814  ZoomDataStackItem zdsi(newzoom);
1815 
1816  bool fYStretchObject=false;
1817  C4PropList* pActionDef = GetAction();
1818  if (pActionDef)
1819  if (pActionDef->GetPropertyInt(P_FacetTargetStretch))
1820  fYStretchObject=true;
1821 
1822  // Set audibility
1823  if (!eDrawMode) SetAudibilityAt(cgo, GetX(), GetY(), iByPlayer);
1824 
1825  // Output boundary
1826  if (!fYStretchObject && !eDrawMode && !(Category & C4D_Parallax))
1827  {
1828  // For actions with a custom facet set, check against that action facet. Otherwise (or with oversize objects), just check against shape.
1829  if (pActionDef && fix_r == Fix0 && !pActionDef->GetPropertyInt(P_FacetBase) && Con <= FullCon && Action.Facet.Wdt)
1830  {
1831  // active
1832  if ( !Inside<float>(offX+Shape.GetX()+Action.FacetX,cgo.X-Action.Facet.Wdt,cgo.X+cgo.Wdt)
1833  || (!Inside<float>(offY+Shape.GetY()+Action.FacetY,cgo.Y-Action.Facet.Hgt,cgo.Y+cgo.Hgt)) )
1834  {
1835  if (FrontParticles && !Contained) FrontParticles->Draw(cgo, this);
1836  return;
1837  }
1838  }
1839  else
1840  // idle
1841  if ( !Inside<float>(offX+Shape.GetX(),cgo.X-Shape.Wdt,cgo.X+cgo.Wdt)
1842  || (!Inside<float>(offY+Shape.GetY(),cgo.Y-Shape.Hgt,cgo.Y+cgo.Hgt)) )
1843  {
1844  if (FrontParticles && !Contained) FrontParticles->Draw(cgo, this);
1845  return;
1846  }
1847  }
1848 
1849  // ensure correct color is set
1850  if (GetGraphics()->Type == C4DefGraphics::TYPE_Bitmap)
1851  if (GetGraphics()->Bmp.BitmapClr) GetGraphics()->Bmp.BitmapClr->SetClr(Color);
1852 
1853  // Debug Display //////////////////////////////////////////////////////////////////////
1854  if (::GraphicsSystem.ShowCommand && !eDrawMode)
1855  {
1856  C4Command *pCom;
1857  int32_t ccx=GetX(),ccy=GetY();
1858  float offX1, offY1, offX2, offY2, newzoom;
1859  char szCommand[200];
1860  StdStrBuf Cmds;
1861  int32_t iMoveTos=0;
1862  for (pCom=Command; pCom; pCom=pCom->Next)
1863  {
1864  switch (pCom->Command)
1865  {
1866  case C4CMD_MoveTo:
1867  // Angle
1868  int32_t iAngle; iAngle=Angle(ccx,ccy,pCom->Tx._getInt(),pCom->Ty); while (iAngle>180) iAngle-=360;
1869  // Path
1870  if(GetDrawPosition(cgo, ccx, ccy, cgo.Zoom, offX1, offY1, newzoom) &&
1871  GetDrawPosition(cgo, pCom->Tx._getInt(), pCom->Ty, cgo.Zoom, offX2, offY2, newzoom))
1872  {
1873  ZoomDataStackItem zdsi(newzoom);
1874  pDraw->DrawLineDw(cgo.Surface,offX1,offY1,offX2,offY2,C4RGB(0xca,0,0));
1875  pDraw->DrawFrameDw(cgo.Surface,offX2-1,offY2-1,offX2+1,offY2+1,C4RGB(0xca,0,0));
1876  }
1877 
1878  ccx=pCom->Tx._getInt(); ccy=pCom->Ty;
1879  // Message
1880  iMoveTos++; szCommand[0]=0;
1881  break;
1882  case C4CMD_Put:
1883  sprintf(szCommand,"%s %s to %s",CommandName(pCom->Command),pCom->Target2 ? pCom->Target2->GetName() : pCom->Data ? pCom->Data.GetDataString().getData() : "Content",pCom->Target ? pCom->Target->GetName() : "");
1884  break;
1885  case C4CMD_Buy: case C4CMD_Sell:
1886  sprintf(szCommand,"%s %s at %s",CommandName(pCom->Command),pCom->Data.GetDataString().getData(),pCom->Target ? pCom->Target->GetName() : "closest base");
1887  break;
1888  case C4CMD_Acquire:
1889  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Data.GetDataString().getData());
1890  break;
1891  case C4CMD_Call:
1892  sprintf(szCommand,"%s %s in %s",CommandName(pCom->Command),pCom->Text->GetCStr(),pCom->Target ? pCom->Target->GetName() : "(null)");
1893  break;
1894  case C4CMD_None:
1895  szCommand[0]=0;
1896  break;
1897  case C4CMD_Transfer:
1898  // Path
1899  if(GetDrawPosition(cgo, ccx, ccy, cgo.Zoom, offX1, offY1, newzoom) &&
1900  GetDrawPosition(cgo, pCom->Tx._getInt(), pCom->Ty, cgo.Zoom, offX2, offY2, newzoom))
1901  {
1902  ZoomDataStackItem zdsi(newzoom);
1903  pDraw->DrawLineDw(cgo.Surface,offX1,offY1,offX2,offY2,C4RGB(0,0xca,0));
1904  pDraw->DrawFrameDw(cgo.Surface,offX2-1,offY2-1,offX2+1,offY2+1,C4RGB(0,0xca,0));
1905  }
1906 
1907  ccx=pCom->Tx._getInt(); ccy=pCom->Ty;
1908  // Message
1909  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Target ? pCom->Target->GetName() : "");
1910  break;
1911  default:
1912  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Target ? pCom->Target->GetName() : "");
1913  break;
1914  }
1915  // Compose command stack message
1916  if (szCommand[0])
1917  {
1918  // End MoveTo stack first
1919  if (iMoveTos) { Cmds.AppendChar('|'); Cmds.AppendFormat("%dx MoveTo",iMoveTos); iMoveTos=0; }
1920  // Current message
1921  Cmds.AppendChar('|');
1922  if (pCom->Finished) Cmds.Append("<i>");
1923  Cmds.Append(szCommand);
1924  if (pCom->Finished) Cmds.Append("</i>");
1925  }
1926  }
1927  // Open MoveTo stack
1928  if (iMoveTos) { Cmds.AppendChar('|'); Cmds.AppendFormat("%dx MoveTo",iMoveTos); iMoveTos=0; }
1929  // Draw message
1930  int32_t cmwdt,cmhgt; ::GraphicsResource.FontRegular.GetTextExtent(Cmds.getData(),cmwdt,cmhgt,true);
1932  }
1933  // Debug Display ///////////////////////////////////////////////////////////////////////////////
1934 
1935  // Don't draw (show solidmask)
1936  if (::GraphicsSystem.Show8BitSurface != 0)
1937  if (SolidMask.Wdt)
1938  {
1939  // DrawSolidMask(cgo); - no need to draw it, because the 8bit-surface will be shown
1940  return;
1941  }
1942 
1943  // Contained check
1944  if (Contained && !eDrawMode) return;
1945 
1946  // Visibility inside FoW
1947  const C4FoWRegion* pOldFoW = pDraw->GetFoW();
1948  if(pOldFoW && (Category & C4D_IgnoreFoW))
1949  pDraw->SetFoW(nullptr);
1950 
1951  // color modulation (including construction sign...)
1952  if (ColorMod != 0xffffffff || BlitMode) if (!eDrawMode) PrepareDrawing();
1953 
1954  // Not active or rotated: BaseFace only
1955  if (!pActionDef)
1956  {
1957  DrawFace(cgo, offX, offY);
1958  }
1959 
1960  // Active
1961  else
1962  {
1963  // FacetBase
1965  DrawFace(cgo, offX, offY, 0, Action.DrawDir);
1966 
1967  // Special: stretched action facet
1969  {
1970  if (Action.Target)
1972  float(Action.Facet.X),float(Action.Facet.Y),float(Action.Facet.Wdt),float(Action.Facet.Hgt),
1973  cgo.Surface,
1974  offX + Shape.GetX() + Action.FacetX, offY + Shape.GetY() + Action.FacetY,Action.Facet.Wdt,
1976  true);
1977  }
1978  else if (Action.Facet.Surface)
1979  DrawActionFace(cgo, offX, offY);
1980  }
1981 
1982  // end of color modulation
1983  if (ColorMod != 0xffffffff || BlitMode) if (!eDrawMode) FinishedDrawing();
1984 
1985  // draw overlays - after blit mode changes, because overlay gfx set their own
1986  if (pGfxOverlay) if (eDrawMode!=ODM_BaseOnly)
1987  for (C4GraphicsOverlay *pGfxOvrl = pGfxOverlay; pGfxOvrl; pGfxOvrl = pGfxOvrl->GetNext())
1988  if (!pGfxOvrl->IsPicture())
1989  pGfxOvrl->Draw(cgo, this, iByPlayer);
1990 
1991  // local particles in front of the object
1992  if (eDrawMode!=ODM_BaseOnly)
1993  {
1994  if (FrontParticles)
1995  FrontParticles->Draw(cgo, this);
1996  }
1997 
1998  // Debug Display ////////////////////////////////////////////////////////////////////////
1999  if (::GraphicsSystem.ShowVertices) if (eDrawMode!=ODM_BaseOnly)
2000  {
2001  int32_t cnt;
2002  if (Shape.VtxNum>1)
2003  for (cnt=0; cnt<Shape.VtxNum; cnt++)
2004  {
2005  DrawVertex(cgo,
2006  offX+Shape.VtxX[cnt],
2007  offY+Shape.VtxY[cnt],
2008  (Shape.VtxCNAT[cnt] & CNAT_NoCollision) ? C4RGB(0, 0, 0xff) : (Mobile ? C4RGB(0xff, 0, 0) : C4RGB(0xef, 0xef, 0)),
2009  Shape.VtxContactCNAT[cnt]);
2010  }
2011  }
2012 
2013  if (::GraphicsSystem.ShowEntrance) if (eDrawMode!=ODM_BaseOnly)
2014  {
2015  if (OCF & OCF_Entrance)
2016  pDraw->DrawFrameDw(cgo.Surface,offX+Def->Entrance.x,
2017  offY+Def->Entrance.y,
2018  offX+Def->Entrance.x+Def->Entrance.Wdt-1,
2019  offY+Def->Entrance.y+Def->Entrance.Hgt-1,
2020  C4RGB(0, 0, 0xff));
2021  if (OCF & OCF_Collection)
2022  pDraw->DrawFrameDw(cgo.Surface,offX+Def->Collection.x,
2023  offY+Def->Collection.y,
2024  offX+Def->Collection.x+Def->Collection.Wdt-1,
2025  offY+Def->Collection.y+Def->Collection.Hgt-1,
2026  C4RGB(0xca, 0, 0));
2027  }
2028 
2029  if (::GraphicsSystem.ShowAction) if (eDrawMode!=ODM_BaseOnly)
2030  {
2031  if (pActionDef)
2032  {
2033  StdStrBuf str;
2034  str.Format("%s (%d)",pActionDef->GetName(),Action.Phase);
2035  int32_t cmwdt,cmhgt; ::GraphicsResource.FontRegular.GetTextExtent(str.getData(),cmwdt,cmhgt,true);
2037  1.0, cgo.Surface, offX, offY + Shape.GetY() - cmhgt,
2039  }
2040  }
2041  // Debug Display ///////////////////////////////////////////////////////////////////////
2042 
2043  // Restore visibility inside FoW
2044  if (pOldFoW) pDraw->SetFoW(pOldFoW);
2045 #endif
2046 }
void SetFoW(const C4FoWRegion *fow)
Definition: C4Draw.h:193
int32_t Line
Definition: C4Def.h:126
int32_t GetX() const
Definition: C4Object.h:287
float Y
Definition: C4Facet.h:118
const char * CommandName(int32_t iCommand)
Definition: C4Command.cpp:47
C4GraphicsOverlay * GetNext() const
const uint32_t OCF_Entrance
Definition: C4Constants.h:90
const uint32_t OCF_Collection
Definition: C4Constants.h:93
float Zoom
Definition: C4Facet.h:165
C4ScriptUniform scriptUniform
Definition: C4Draw.h:100
C4Value Data
Definition: C4Command.h:85
C4Command * Next
Definition: C4Command.h:90
#define sprintf
Definition: Standard.h:164
void SetAudibilityAt(C4TargetFacet &cgo, int32_t iX, int32_t iY, int32_t player)
Definition: C4Object.cpp:4039
C4Command * Command
Definition: C4Object.h:167
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
StdStrBuf GetDataString(int depth=10, const class C4PropListStatic *ignore_reference_parent=nullptr) const
Definition: C4Value.cpp:131
bool TextOut(const char *szText, CStdFont &rFont, float fZoom, C4Surface *sfcDest, float iTx, float iTy, DWORD dwFCol=0xffffffff, BYTE byForm=ALeft, bool fDoMarkup=true)
Definition: C4Draw.cpp:567
int32_t Ty
Definition: C4Command.h:83