OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
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
 
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
Enumerator
SAC_StartCall 
SAC_EndCall 
SAC_AbortCall 

Definition at line 251 of file C4Object.h.

Enumerator
ODM_Normal 
ODM_Overlay 
ODM_BaseOnly 

Definition at line 216 of file C4Object.h.

Constructor & Destructor Documentation

C4Object::C4Object ( )

Definition at line 85 of file C4Object.cpp.

References BackParticles, Default(), and FrontParticles.

86 {
87  FrontParticles = BackParticles = nullptr;
88  Default();
89 }
class C4ParticleList * BackParticles
Definition: C4Object.h:158
void Default()
Definition: C4Object.cpp:91
class C4ParticleList * FrontParticles
Definition: C4Object.h:158

Here is the call graph for this function:

C4Object::~C4Object ( )
override

Definition at line 235 of file C4Object.cpp.

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

236 {
237  Clear();
238 
239 #if defined(_DEBUG)
240  // debug: mustn't be listed in any list now
242 #endif
243 }
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

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:

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

Definition at line 1352 of file C4Object.cpp.

References C4PropList::Call(), OCF, OCF_Entrance, and PSF_ActivateEntrance.

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

1353 {
1354 
1355  // Try entrance activation
1356  if (OCF & OCF_Entrance)
1357  if (!! Call(PSF_ActivateEntrance,&C4AulParSet(by_obj)))
1358  return true;
1359  // Failure
1360  return false;
1361 }
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 call graph for this function:

Here is the caller graph for this function:

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

Definition at line 1480 of file C4Object.cpp.

References C4Menu::Add(), C4MN_Activate, C4MN_Align_Free, C4MN_Buy, C4MN_Contents, C4MN_Extra_None, C4MN_Extra_Value, C4MN_Get, C4MN_Info, C4MN_Item_NoCount, C4MN_Sell, C4MN_Style_Info, C4PictureSize, C4SymbolSize, C4PropList::Call(), C4Menu::ClearItems(), CloseMenu(), Color, Contained, Controller, C4FacetSurface::Create(), Def, C4FacetSurface::Default(), C4Def::Draw(), FormatString(), StdStrBuf::getData(), GetInfoString(), C4PropList::GetName(), C4ViewportList::GetViewport(), C4Viewport::GetViewX(), C4Viewport::GetViewY(), C4Shape::GetX(), GetX(), C4Shape::GetY(), GetY(), C4Viewport::GetZoom(), GfxR, C4ObjectMenu::Init(), C4Menu::IsActive(), LoadResStr(), Menu, Owner, PSF_RejectContents, C4Menu::SetAlignment(), C4Menu::SetLocation(), C4Menu::SetPermanent(), C4ObjectMenu::SetRefillObject(), Shape, C4Menu::TryClose(), Viewports, and C4Rect::Wdt.

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

1483 {
1484  // Variables
1485  C4FacetSurface fctSymbol;
1486  C4IDList ListItems;
1487  // Close any other menu
1488  if (Menu && Menu->IsActive()) if (!Menu->TryClose(true, false)) return false;
1489  // Create menu
1490  if (!Menu) Menu = new C4ObjectMenu; else Menu->ClearItems();
1491  // Open menu
1492  switch (iMenu)
1493  {
1494  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1495  case C4MN_Activate:
1496  // No target specified: use own container as target
1497  if (!pTarget) if (!(pTarget=Contained)) break;
1498  // Opening contents menu blocked by RejectContents
1499  if (!!pTarget->Call(PSF_RejectContents)) return false;
1500  // Create symbol
1501  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1502  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1503  // Init
1504  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1505  Menu->SetPermanent(true);
1506  Menu->SetRefillObject(pTarget);
1507  // Success
1508  return true;
1509  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1510  case C4MN_Buy:
1511  // No target specified: container is base
1512  if (!pTarget) if (!(pTarget=Contained)) break;
1513  // Create symbol
1514  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1515  DrawMenuSymbol(C4MN_Buy, fctSymbol, pTarget->Owner);
1516  // Init menu
1517  Menu->Init(fctSymbol,LoadResStr("IDS_PLR_NOBUY"),this,C4MN_Extra_Value,0,iMenu);
1518  Menu->SetPermanent(true);
1519  Menu->SetRefillObject(pTarget);
1520  // Success
1521  return true;
1522  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1523  case C4MN_Sell:
1524  // No target specified: container is base
1525  if (!pTarget) if (!(pTarget=Contained)) break;
1526  // Create symbol & init
1527  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1528  DrawMenuSymbol(C4MN_Sell, fctSymbol, pTarget->Owner);
1529  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_Value,0,iMenu);
1530  Menu->SetPermanent(true);
1531  Menu->SetRefillObject(pTarget);
1532  // Success
1533  return true;
1534  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1535  case C4MN_Get:
1536  case C4MN_Contents:
1537  // No target specified
1538  if (!pTarget) break;
1539  // Opening contents menu blocked by RejectContents
1540  if (!!pTarget->Call(PSF_RejectContents)) return false;
1541  // Create symbol & init
1542  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1543  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1544  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1545  Menu->SetPermanent(true);
1546  Menu->SetRefillObject(pTarget);
1547  // Success
1548  return true;
1549  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1550  case C4MN_Info:
1551  // Target by parameter
1552  if (!pTarget) break;
1553  // Create symbol & init menu
1554  fctSymbol.Create(C4SymbolSize, C4SymbolSize); GfxR->fctOKCancel.Draw(fctSymbol,true,0,1);
1555  Menu->Init(fctSymbol, pTarget->GetName(), this, C4MN_Extra_None, 0, iMenu, C4MN_Style_Info);
1556  Menu->SetPermanent(true);
1558  C4Viewport *pViewport = ::Viewports.GetViewport(Controller); // Hackhackhack!!!
1559  if (pViewport) Menu->SetLocation((pTarget->GetX() + pTarget->Shape.GetX() + pTarget->Shape.Wdt + 10 - pViewport->GetViewX()) * pViewport->GetZoom(),
1560  (pTarget->GetY() + pTarget->Shape.GetY() - pViewport->GetViewY()) * pViewport->GetZoom());
1561  // Add info item
1562  fctSymbol.Create(C4PictureSize, C4PictureSize); pTarget->Def->Draw(fctSymbol, false, pTarget->Color, pTarget);
1563  Menu->Add(pTarget->GetName(), fctSymbol, "", C4MN_Item_NoCount, nullptr, pTarget->GetInfoString().getData());
1564  fctSymbol.Default();
1565  // Success
1566  return true;
1567  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1568  }
1569  // Invalid menu identification
1570  CloseMenu(true);
1571  return false;
1572 }
const char * getData() const
Definition: StdBuf.h:442
int32_t GetY() const
Definition: C4Object.h:287
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
#define GfxR
void SetAlignment(int32_t iAlignment)
Definition: C4Menu.cpp:857
int32_t GetY() const
Definition: C4Shape.h:64
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:1574
C4Def * Def
Definition: C4Object.h:143
bool SetLocation(int32_t iX, int32_t iY)
Definition: C4Menu.cpp:951
void ClearItems()
Definition: C4Menu.cpp:895
virtual const char * GetName() const
Definition: C4PropList.cpp:645
int32_t Owner
Definition: C4Object.h:110
int32_t GetX() const
Definition: C4Shape.h:63
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:599
int32_t GetX() const
Definition: C4Object.h:286
bool IsActive()
Definition: C4Menu.cpp:480
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:280
#define PSF_RejectContents
Definition: C4GameScript.h:134
const int C4PictureSize
Definition: C4Constants.h:60
C4ViewportList Viewports
Definition: C4Viewport.cpp:841
float GetViewY()
Definition: C4Viewport.h:75
StdStrBuf GetInfoString()
Definition: C4Object.cpp:4717
const int C4SymbolSize
Definition: C4Constants.h:58
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:

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 2566 of file C4Object.cpp.

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

Referenced by C4Command::Acquire(), C4Command::Activate(), AddCommand(), 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(), PutAwayUnusedObject(), SetCommand(), StopActionDelayCommand(), C4Command::Throw(), and C4Command::Transfer().

2570 {
2571  // Command stack size safety
2572  const int32_t MaxCommandStack = 35;
2573  C4Command *pCom,*pLast; int32_t iCommands;
2574  for (pCom=Command,iCommands=0; pCom; pCom=pCom->Next,iCommands++) {}
2575  if (iCommands>=MaxCommandStack) return false;
2576  // Valid command safety
2577  if (!Inside(iCommand,C4CMD_First,C4CMD_Last)) return false;
2578  // Allocate and set new command
2579  if (!(pCom=new C4Command)) return false;
2580  pCom->Set(iCommand,this,pTarget,iTx,iTy,pTarget2,iData,
2581  iUpdateInterval,!fInitEvaluation,iRetries,szText,iBaseMode);
2582  // Append to bottom of stack
2583  if (fAppend)
2584  {
2585  for (pLast=Command; pLast && pLast->Next; pLast=pLast->Next) {}
2586  if (pLast) pLast->Next=pCom;
2587  else Command=pCom;
2588  }
2589  // Add to top of command stack
2590  else
2591  {
2592  pCom->Next=Command;
2593  Command=pCom;
2594  }
2595  // Success
2596  return true;
2597 }
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:166
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:

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 186 of file C4Object.h.

References AddCommand(), and C4VInt().

187  { 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:2566

Here is the call graph for this function:

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

Definition at line 4302 of file C4Object.cpp.

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

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

4303 {
4304  // add self, contents and child contents count recursively to value array. Return index after last added item.
4305  target_array->SetItem(index++, C4VObj(this));
4306  for (C4Object *cobj : Contents)
4307  {
4308  index = cobj->AddObjectAndContentsToArray(target_array, index);
4309  }
4310  return index;
4311 }
void SetItem(int32_t iElemNr, const C4Value &Value)
C4Value C4VObj(C4Object *pObj)
Definition: C4Value.cpp:88
C4NotifyingObjectList Contents
Definition: C4Object.h:152

Here is the call graph for this function:

Here is the caller graph for this function:

int32_t C4Object::addtop ( ) const
inline

Definition at line 281 of file C4Object.h.

References C4Rect::Hgt.

Referenced by At(), Height(), Top(), and C4MouseControl::UpdateCursorTarget().

281 { 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:

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

Definition at line 4590 of file C4Object.cpp.

References Abs(), Def, GBackSolid(), GetR(), C4Shape::iAttachVtx, C4Shape::iAttachX, C4Shape::iAttachY, itofix(), rdir, C4Def::Shape, Shape, and C4Shape::VtxX.

Referenced by ExecAction().

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

Here is the call graph for this function:

Here is the caller graph for this function:

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 C4Value::GetDataString(), and GetDataString().

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 }
std::list< const T * > GetSortedListOfElementPointers() const
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:85
StdStrBuf GetDataString(int depth=10, const class C4PropListStatic *ignore_reference_parent=nullptr) const
Definition: C4Value.cpp:131
unsigned int GetSize() const
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:519

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::AssignDeath ( bool  fForced)

Definition at line 993 of file C4Object.cpp.

References Alive, C4FxCall_RemoveDeath, C4PropList::Call(), C4Effect::ClearAll(), ClearCommands(), C4Player::ClearPointers(), Contents, C4Player::Crew, C4ObjectInfoCore::DeathCount, Exit(), Game, C4PlayerList::Get(), C4ObjectList::GetObject(), GetX(), GetY(), C4Game::GRBroadcast(), C4ObjectInfo::HasDied, Info, LastEnergyLossCausePlayer, C4ObjectList::ObjectCount(), Owner, pEffects, Players, PSF_Death, PSF_RelaunchPlayer, C4ObjectInfo::Retire(), SetActionByName(), SetLightRange(), SetOCF(), and C4PropList::Status.

Referenced by DoEnergy(), and ExecMovement().

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

bool C4Object::AssignInfo ( )

Definition at line 2390 of file C4Object.cpp.

References Alive, C4Player::ClearPointers(), C4Player::Crew, C4PlayerList::Get(), StdStrBuf::getLength(), C4ObjectList::GetLink(), Info, C4Player::MakeCrewMember(), nInfo, Owner, 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:175
void ClearPointers(C4Object *tptr, bool fDeath)
Definition: C4Player.cpp:98
C4ObjectInfo * Info
Definition: C4Object.h:145
const C4ObjectLink * GetLink(const C4Object *pObj) const
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:168
int32_t ValidPlr(int32_t plr)
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:

bool C4Object::AssignLightRange ( )

Definition at line 2420 of file C4Object.cpp.

References lightFadeoutRange, lightRange, and UpdateLight().

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:4032

Here is the call graph for this function:

void C4Object::AssignRemoval ( bool  fExitContents = false)

Definition at line 254 of file C4Object.cpp.

References C4GameObjects::Add(), AddDbgRec(), C4FxCall_RemoveClear, C4OS_INACTIVE, C4OS_NORMAL, C4PropList::Call(), C4Effect::ClearAll(), ClearCommands(), ClearParticleLists(), C4Game::ClearPointers(), C4PropList::ClearRefs(), Config, Contained, Contents, C4Def::Count, C4ConfigGeneral::DebugRec, Def, Enter(), Exit(), Game, C4Config::General, C4PropListStatic::GetName(), GetX(), GetY(), C4RCCreateObj::id, C4GameObjects::InactiveObjects, Info, C4PropListNumbered::Number, Objects, C4RCCreateObj::oei, Owner, C4RCCreateObj::ownr, pEffects, PSF_ContentsDestruction, PSF_Destruction, pSolidMaskData, RCT_DsObj, RemovalDelay, C4ObjectList::Remove(), C4ObjectInfo::Retire(), SetAction(), SetOCF(), SolidMask, C4PropList::Status, UpdateMass(), C4Rect::Wdt, C4RCCreateObj::x, and C4RCCreateObj::y.

Referenced by CreateContents(), C4Landscape::P::DigMaterial2Objects(), DoCon(), ExecAction(), ExecMovement(), and C4Player::RemoveCrewObjects().

255 {
256  // check status
257  if (!Status) return;
258  if (Config.General.DebugRec)
259  {
260  C4RCCreateObj rc;
261  memset(&rc, '\0', sizeof(rc));
262  rc.oei=Number;
263  if (Def && Def->GetName()) strncpy(rc.id, Def->GetName(), 32+1);
264  rc.x=GetX(); rc.y=GetY(); rc.ownr=Owner;
265  AddDbgRec(RCT_DsObj, &rc, sizeof(rc));
266  }
267  // Destruction call in container
268  if (Contained)
269  {
270  C4AulParSet pars(this);
272  if (!Status) return;
273  }
274  // Destruction call
276  // Destruction-callback might have deleted the object already
277  if (!Status) return;
278  // remove all effects (extinguishes as well)
279  if (pEffects)
280  {
282  // Effect-callback might actually have deleted the object already
283  if (!Status) return;
284  }
285  // remove particles
287  // Action idle
288  SetAction(nullptr);
289  // Object system operation
290  if (Status == C4OS_INACTIVE)
291  {
292  // object was inactive: activate first, then delete
295  ::Objects.Add(this);
296  }
297  Status=0;
298  // count decrease
299  Def->Count--;
300 
301  // get container for next actions
302  C4Object *pCont = Contained;
303  // remove or exit contents
304  for (C4Object *cobj : Contents)
305  {
306  if (fExitContents)
307  {
308  // move objects to parent container or exit them completely
309  if (!pCont || !cobj->Enter(pCont, false))
310  cobj->Exit(GetX(), GetY());
311  }
312  else
313  {
314  Contents.Remove(cobj);
315  cobj->Contained = nullptr;
316  cobj->AssignRemoval();
317  }
318  }
319  // remove this object from container *after* its contents have been removed!
320  if (pCont)
321  {
322  pCont->Contents.Remove(this);
323  pCont->UpdateMass();
324  pCont->SetOCF();
325  Contained=nullptr;
326  }
327  // Object info
328  if (Info) Info->Retire();
329  Info = nullptr;
330  // Object system operation
331  ClearRefs();
332  Game.ClearPointers(this);
333  ClearCommands();
334  if (pSolidMaskData)
335  {
336  delete pSolidMaskData;
337  pSolidMaskData = nullptr;
338  }
339  SolidMask.Wdt = 0;
340  RemovalDelay=2;
341 }
int32_t GetY() const
Definition: C4Object.h:287
void ClearAll(int32_t iClearFlag)
Definition: C4Effect.cpp:369
C4Config Config
Definition: C4Config.cpp:833
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1264
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:245
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:152
C4Def * Def
Definition: C4Object.h:143
int32_t Count
Definition: C4Def.h:180
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:2685
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:1228
char id[32+1]
Definition: C4Record.h:150
int32_t GetX() const
Definition: C4Object.h:286
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:639
void ClearCommands()
Definition: C4Object.cpp:2535
#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:156
#define PSF_Destruction
Definition: C4GameScript.h:38
void SetOCF()
Definition: C4Object.cpp:667
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
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:

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

Definition at line 954 of file C4Object.cpp.

References addtop(), Contained, Def, C4Shape::GetX(), GetX(), C4Shape::GetY(), GetY(), C4Rect::Hgt, Shape, C4PropList::Status, and C4Rect::Wdt.

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

955 {
956  if (Status) if (!Contained) if (Def)
957  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
958  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
959  return true;
960  return false;
961 }
int32_t GetY() const
Definition: C4Object.h:287
int32_t GetY() const
Definition: C4Shape.h:64
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
int32_t GetX() const
Definition: C4Shape.h:63
int32_t GetX() const
Definition: C4Object.h:286
int32_t Status
Definition: C4PropList.h:168
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:281

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 963 of file C4Object.cpp.

References addtop(), Contained, Def, GetOCFForPos(), C4Shape::GetX(), GetX(), C4Shape::GetY(), GetY(), C4Rect::Hgt, OCF, Shape, C4PropList::Status, and C4Rect::Wdt.

964 {
965  if (Status) if (!Contained) if (Def)
966  if (OCF & ocf)
967  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
968  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
969  {
970  // Set ocf return value
971  GetOCFForPos(ctx, cty, ocf);
972  return true;
973  }
974  return false;
975 }
int32_t GetY() const
Definition: C4Object.h:287
int32_t GetY() const
Definition: C4Shape.h:64
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
void GetOCFForPos(int32_t ctx, int32_t cty, DWORD &ocf) const
Definition: C4Object.cpp:977
int32_t GetX() const
Definition: C4Shape.h:63
int32_t GetX() const
Definition: C4Object.h:286
int32_t Status
Definition: C4PropList.h:168
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:281

Here is the call graph for this function:

C4PropList::Iterator C4PropList::begin ( )
inherited

Definition at line 1003 of file C4PropList.cpp.

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

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

1004 {
1005  C4PropList::Iterator iter;
1006 
1007  if (GetPrototype())
1008  {
1009  iter = GetPrototype()->begin();
1010  }
1011  else
1012  {
1013  iter.properties = std::make_shared<std::vector<const C4Property*> >();
1014  }
1015  iter.Reserve(Properties.GetSize());
1016 
1017  const C4Property * p = Properties.First();
1018  while (p)
1019  {
1020  iter.AddProperty(p);
1021  p = Properties.Next(p);
1022  }
1023 
1024  iter.Init();
1025  return iter;
1026 }
T const * Next(T const *p) const
unsigned int GetSize() const
Iterator begin()
C4PropList * GetPrototype() const
Definition: C4PropList.h:81
T const * First() const

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 331 of file C4Object.h.

References SideBounds(), and VerticalBounds().

Referenced by Exit().

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

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 110 of file C4PropList.h.

References C4StringTable::P, and Strings.

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

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 caller graph for this function:

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

Definition at line 824 of file C4PropList.cpp.

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

825 {
826  if (!Status) return C4Value();
827  C4AulFunc *pFn = GetFunc(k);
828  if (!pFn) return C4Value();
829  return pFn->Exec(this, Pars, fPassErrors);
830 }
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:105
friend class C4Value
Definition: C4PropList.h:165
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:73
int32_t Status
Definition: C4PropList.h:168

Here is the call graph for this function:

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

Definition at line 832 of file C4PropList.cpp.

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

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

Here is the call graph for this function:

bool C4Object::CanConcatPictureWith ( C4Object pOtherObject) const

Definition at line 4755 of file C4Object.cpp.

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

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

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::ChangeDef ( C4ID  idNew)

Definition at line 1044 of file C4Object.cpp.

References C4Def::BlitMode, BlitMode, C4GFXBLIT_CUSTOM, C4Id2Def(), C4VPropList(), Color, C4Player::ColorDw, Contained, C4Def::Count, Def, Enter(), Exit(), Fix0, fix_r, GameScript, C4PlayerList::Get(), C4Def::Graphics, C4Def::id, Objects, C4Effect::OnObjectChangedDef(), Owner, C4StringTable::P, P_Action, P_Prototype, C4AulScriptEngine::pGlobalEffects, pGraphics, Players, C4GameScriptHost::pScenarioEffects, pSolidMaskData, rdir, ResetProperty(), C4Def::Rotateable, ScriptEngine, SetAction(), SetDir(), SetOCF(), C4PropList::SetProperty(), C4Def::SolidMask, SolidMask, Strings, Unsorted, UpdateFace(), UpdateGraphics(), UpdateMass(), and ValidPlr().

1045 {
1046  // Get new definition
1047  C4Def *pDef=C4Id2Def(idNew);
1048  if (!pDef) return false;
1049  // Containment storage
1050  C4Object *pContainer=Contained;
1051  // Exit container (no Ejection/Departure)
1052  if (Contained) Exit(0,0,0,Fix0,Fix0,Fix0,false);
1053  // Pre change resets
1054  SetAction(nullptr);
1055  ResetProperty(&Strings.P[P_Action]); // Enforce ActIdle because SetAction may have failed due to NoOtherAction
1056  SetDir(0); // will drop any outdated flipdir
1057  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
1058  Def->Count--;
1059  // Def change
1060  Def=pDef;
1062  id=pDef->id;
1063  Def->Count++;
1064  // new def: Needs to be resorted
1065  Unsorted=true;
1066  // graphics change
1067  pGraphics = &pDef->Graphics;
1068  // blit mode adjustment
1070  // an object may have newly become an ColorByOwner-object
1071  // if it had been ColorByOwner, but is not now, this will be caught in UpdateGraphics()
1072  if (!Color && ValidPlr(Owner))
1074  if (!Def->Rotateable) { fix_r=rdir=Fix0; }
1075  // Reset solid mask
1077  // Post change updates
1078  UpdateGraphics(true);
1079  UpdateMass();
1080  UpdateFace(true);
1081  SetOCF();
1082  // Any effect callbacks to this object might need to reinitialize their target functions
1083  // This is ugly, because every effect there is must be updated...
1088  for (C4Object *obj : Objects)
1089  if (obj->pEffects) obj->pEffects->OnObjectChangedDef(this);
1090  // Containment (no Entrance)
1091  if (pContainer) Enter(pContainer,false);
1092  // Done
1093  return true;
1094 }
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:1264
C4GameScriptHost GameScript
void SetDir(int32_t tdir)
Definition: C4Object.cpp:2844
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
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:4863
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:404
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:180
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:2685
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:1228
uint32_t Color
Definition: C4Object.h:120
Definition: C4Def.h:98
C4DefGraphics * pGraphics
Definition: C4Object.h:154
void UpdateMass()
Definition: C4Object.cpp:639
C4TargetRect SolidMask
Definition: C4Def.h:108
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:378
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:142
uint32_t BlitMode
Definition: C4Object.h:162
void SetOCF()
Definition: C4Object.cpp:667
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
C4DefGraphics Graphics
Definition: C4Def.h:192
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:

bool C4PropListNumbered::CheckPropList ( C4PropList pObj)
staticinherited

Definition at line 80 of file C4PropList.cpp.

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

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
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
T const * First() const

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::CheckSolidMaskRect ( )

Definition at line 2478 of file C4Object.cpp.

References Def, CSurface8::Hgt, C4Rect::Hgt, C4Def::pSolidMask, C4TargetRect::Set(), SolidMask, C4TargetRect::tx, C4TargetRect::ty, CSurface8::Wdt, C4Rect::Wdt, C4Rect::x, and C4Rect::y.

Referenced by Init(), and SetSolidMask().

2479 {
2480  // Ensure SolidMask rect lies within bounds of SolidMask bitmap in definition
2481  CSurface8 *sfcGraphics = Def->pSolidMask;
2482  if (!sfcGraphics)
2483  {
2484  // no graphics to set solid in
2485  SolidMask.Set(0,0,0,0,0,0);
2486  return false;
2487  }
2488  SolidMask.Set(std::max<int32_t>(SolidMask.x,0), std::max<int32_t>(SolidMask.y,0),
2489  std::min<int32_t>(SolidMask.Wdt,sfcGraphics->Wdt-SolidMask.x), std::min<int32_t>(SolidMask.Hgt, sfcGraphics->Hgt-SolidMask.y),
2491  if (SolidMask.Hgt<=0) SolidMask.Wdt=0;
2492  return SolidMask.Wdt>0;
2493 }
int Hgt
Definition: CSurface8.h:28
CSurface8 * pSolidMask
Definition: C4Def.h:193
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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::Clear ( )

Definition at line 2436 of file C4Object.cpp.

References ClearParticleLists(), Command, MaterialContents, Menu, C4Command::Next, pDrawTransform, pEffects, pGfxOverlay, pMeshInstance, and pSolidMaskData.

Referenced by CompileFunc(), and ~C4Object().

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:153
C4Command * Command
Definition: C4Object.h:166
void ClearParticleLists()
Definition: C4Object.cpp:245
class C4ObjectMenu * Menu
Definition: C4Object.h:140
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:170
C4Effect * pEffects
Definition: C4Object.h:156
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
StdMeshInstance * pMeshInstance
Definition: C4Object.h:155

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::ClearCommand ( C4Command pUntil)

Definition at line 2549 of file C4Object.cpp.

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

Referenced by ExecuteCommand(), GrabLost(), and ObjectComStopDig().

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

Here is the caller graph for this function:

void C4Object::ClearCommands ( )

Definition at line 2535 of file C4Object.cpp.

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

Referenced by AssignDeath(), AssignRemoval(), and SetCommand().

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

Here is the caller graph for this function:

void C4Object::ClearContentsAndContained ( bool  fDoCalls = true)

Definition at line 4579 of file C4Object.cpp.

References Contained, Contents, Exit(), Fix0, GetX(), and GetY().

Referenced by StatusDeactivate().

4580 {
4581  // exit contents from container
4582  for (C4Object *cobj : Contents)
4583  {
4584  cobj->Exit(GetX(), GetY(), 0,Fix0,Fix0,Fix0, fDoCalls);
4585  }
4586  // remove from container *after* contents have been removed!
4587  if (Contained) Exit(GetX(), GetY(), 0, Fix0, Fix0, Fix0, fDoCalls);
4588 }
int32_t GetY() const
Definition: C4Object.h:287
C4NotifyingObjectList Contents
Definition: C4Object.h:152
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:1228
int32_t GetX() const
Definition: C4Object.h:286
C4ObjectPtr Contained
Definition: C4Object.h:144
const C4Real Fix0
Definition: C4Real.h:312

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::ClearInfo ( C4ObjectInfo pInfo)

Definition at line 2428 of file C4Object.cpp.

References Info.

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:

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:

void C4PropListNumbered::ClearNumberedPropLists ( )
staticinherited

Definition at line 137 of file C4PropList.cpp.

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

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 }
void Clear()
Definition: C4PropList.h:66
T const * Next(T const *p) const
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:236
T const * First() const

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::ClearParticleLists ( )

Definition at line 245 of file C4Object.cpp.

References BackParticles, FrontParticles, Particles, and C4ParticleSystem::ReleaseParticleList().

Referenced by AssignRemoval(), Clear(), Default(), and StatusDeactivate().

246 {
247  if (FrontParticles != nullptr)
249  if (BackParticles != nullptr)
251  FrontParticles = BackParticles = nullptr;
252 }
C4ParticleSystem Particles
class C4ParticleList * BackParticles
Definition: C4Object.h:158
void ReleaseParticleList(C4ParticleList *first, C4ParticleList *second=nullptr)
class C4ParticleList * FrontParticles
Definition: C4Object.h:158

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::ClearPointers ( C4Object ptr)

Definition at line 1739 of file C4Object.cpp.

References Action, C4ObjectMenu::ClearPointers(), C4Command::ClearPointers(), C4Effect::ClearPointers(), StdMeshInstance::ClearPointers(), Command, Contained, Contents, C4GraphicsOverlay::GetNext(), Layer, Menu, C4Command::Next, pEffects, pGfxOverlay, pMeshInstance, C4ObjectList::Remove(), RemoveGraphicsOverlay(), C4Action::Target, and C4Action::Target2.

Referenced by C4Game::ClearObjectPtrs().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PropList::ClearRefs ( )
inlineprotectedinherited

Definition at line 156 of file C4PropList.h.

References C4Value::Set0().

Referenced by AssignRemoval().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4PropListNumbered::ClearShelve ( )
staticinherited

Definition at line 131 of file C4PropList.cpp.

References C4PropListNumbered::ShelvedPropLists.

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:

bool C4Object::CloseMenu ( bool  fForce)

Definition at line 1574 of file C4Object.cpp.

References C4Menu::IsActive(), C4ObjectMenu::IsCloseQuerying(), Menu, and C4Menu::TryClose().

Referenced by ActivateMenu(), Enter(), Exit(), ObjectComUnGrab(), SetCommand(), and SyncClearance().

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::Collect ( C4Object pObj)

Definition at line 4171 of file C4Object.cpp.

References 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().

4172 {
4173  // Object enter container
4174  bool fRejectCollect;
4175  if (!pObj->Enter(this, true, false, &fRejectCollect))
4176  return false;
4177  // Cancel attach (hacky)
4178  ObjectComCancelAttach(pObj);
4179  // Container Collection call
4181  // Object Hit call
4182  if (pObj->Status && pObj->OCF & OCF_HitSpeed1) pObj->Call(PSF_Hit);
4183  if (pObj->Status && pObj->OCF & OCF_HitSpeed2) pObj->Call(PSF_Hit2);
4184  if (pObj->Status && pObj->OCF & OCF_HitSpeed3) pObj->Call(PSF_Hit3);
4185  // post-copy the motion of the new container
4186  if (pObj->Contained == this) pObj->CopyMotion(this);
4187  // done, success
4188  return true;
4189 }
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:1264
#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:

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

Definition at line 2162 of file C4Object.cpp.

References Action, Alive, C4Action::Animation, C4Def::BlitMode, BlitMode, Breath, C4MeshDenumeratorFactory, Category, Clear(), StdStrBuf::Clear(), C4Command::cObj, Color, ColorMod, Command, Con, Contained, Contents, Controller, C4Def::Count, CrewDisabled, Damage, Def, Definitions, Energy, EntranceStatus, StdCompiler::excNotFound(), Fix0, fix_r, fix_x, fix_y, StdCompiler::FollowName(), FormatString(), fOwnVertices, C4Game::fResortAnyObject, FullCon, Game, StdStrBuf::getData(), StdMeshInstance::GetRootAnimationForSlot(), C4Def::Graphics, C4Def::GrowthType, C4DefList::ID2Def(), iLastAttachMovementFrame, Info, InLiquid, StdCompiler::isDeserializer(), LastEnergyLossCausePlayer, Layer, lightColor, lightFadeoutRange, lightRange, LoadResStr(), Mass, mkNamingAdapt(), mkNamingPtrAdapt(), mkParAdapt(), Mobile, C4ObjectInfoCore::Name, C4Command::Next, nInfo, NO_OWNER, C4ID::None, C4ObjectPtr::Null, OCF, OnFire, Owner, OwnMass, pDrawTransform, pEffects, pGfxOverlay, pGraphics, PictureRect, Plane, pMeshInstance, rdir, StdMeshInstance::SetFaceOrderingForClrModulation(), C4Def::Shape, Shape, C4Def::SolidMask, SolidMask, C4PropList::Status, C4Action::Target, C4Action::Target2, toC4CStrBuf, C4DefGraphics::Type, C4DefGraphics::TYPE_Mesh, Unsorted, StdCompiler::Value(), xdir, and ydir.

2163 {
2164  bool deserializing = pComp->isDeserializer();
2165  if (deserializing)
2166  Clear();
2167 
2168  // Compile ID, search definition
2169  pComp->Value(mkNamingAdapt(id, "id", C4ID::None ));
2170  if (deserializing)
2171  {
2172  Def = ::Definitions.ID2Def(id);
2173  if (!Def)
2174  { pComp->excNotFound(LoadResStr("IDS_PRC_UNDEFINEDOBJECT"),id.ToString()); return; }
2175  }
2176 
2177  pComp->Value(mkNamingAdapt( mkParAdapt(static_cast<C4PropListNumbered&>(*this), numbers), "Properties"));
2178  pComp->Value(mkNamingAdapt( Status, "Status", 1 ));
2179  if (Info) nInfo = Info->Name; else nInfo.Clear();
2180  pComp->Value(mkNamingAdapt( toC4CStrBuf(nInfo), "Info", "" ));
2181  pComp->Value(mkNamingAdapt( Owner, "Owner", NO_OWNER ));
2182  pComp->Value(mkNamingAdapt( Controller, "Controller", NO_OWNER ));
2183  pComp->Value(mkNamingAdapt( LastEnergyLossCausePlayer, "LastEngLossPlr", NO_OWNER ));
2184  pComp->Value(mkNamingAdapt( Category, "Category", 0 ));
2185  pComp->Value(mkNamingAdapt( Plane, "Plane", 0 ));
2186 
2187  pComp->Value(mkNamingAdapt( iLastAttachMovementFrame, "LastSolidAtchFrame", -1 ));
2188  pComp->Value(mkNamingAdapt( Con, "Size", 0 ));
2189  pComp->Value(mkNamingAdapt( OwnMass, "OwnMass", 0 ));
2190  pComp->Value(mkNamingAdapt( Mass, "Mass", 0 ));
2191  pComp->Value(mkNamingAdapt( Damage, "Damage", 0 ));
2192  pComp->Value(mkNamingAdapt( Energy, "Energy", 0 ));
2193  pComp->Value(mkNamingAdapt( Alive, "Alive", false ));
2194  pComp->Value(mkNamingAdapt( Breath, "Breath", 0 ));
2195  pComp->Value(mkNamingAdapt( Color, "Color", 0u ));
2196  pComp->Value(mkNamingAdapt( fix_x, "X", Fix0 ));
2197  pComp->Value(mkNamingAdapt( fix_y, "Y", Fix0 ));
2198  pComp->Value(mkNamingAdapt( fix_r, "R", Fix0 ));
2199  pComp->Value(mkNamingAdapt( xdir, "XDir", 0 ));
2200  pComp->Value(mkNamingAdapt( ydir, "YDir", 0 ));
2201  pComp->Value(mkNamingAdapt( rdir, "RDir", 0 ));
2202  pComp->Value(mkParAdapt(Shape, &Def->Shape));
2203  pComp->Value(mkNamingAdapt( fOwnVertices, "OwnVertices", false ));
2204  pComp->Value(mkNamingAdapt( SolidMask, "SolidMask", Def->SolidMask ));
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 }
const char * getData() const
Definition: StdBuf.h:442
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:175
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:151
C4Command * Command
Definition: C4Object.h:166
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:172
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:182
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:152
int32_t GrowthType
Definition: C4Def.h:111
C4Shape Shape
Definition: C4Def.h:104
int32_t Plane
Definition: C4Object.h:174
C4Def * Def
Definition: C4Object.h:143
bool CrewDisabled
Definition: C4Object.h:163
int32_t lightRange
Definition: C4Object.h:122
int32_t Count
Definition: C4Def.h:180
static const C4ID None
Definition: C4Id.h:39
int32_t Con
Definition: C4Object.h:173
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:138
C4DefGraphics * pGraphics
Definition: C4Object.h:154
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
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:138
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:170
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:168
uint32_t ColorMod
Definition: C4Object.h:161
GraphicsType Type
Definition: C4DefGraphics.h:48
int32_t iLastAttachMovementFrame
Definition: C4Object.h:127
int32_t BlitMode
Definition: C4Def.h:142
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
Definition: StdAdaptors.h:458
uint32_t BlitMode
Definition: C4Object.h:162
C4DefList Definitions
Definition: C4Globals.cpp:49
C4Effect * pEffects
Definition: C4Object.h:156
C4Real fix_y
Definition: C4Object.h:125
C4ObjectPtr Contained
Definition: C4Object.h:144
StdPtrAdapt< T > mkNamingPtrAdapt(T *&rpObj, const char *szNaming)
Definition: StdAdaptors.h:604
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:192
StdMeshInstance * pMeshInstance
Definition: C4Object.h:155
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:

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 }
const char * CNATName(int32_t cnat)
Definition: C4Movement.cpp:100
#define PSF_Contact
Definition: C4GameScript.h:69
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:882
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:

void C4Object::ContactAction ( )

Definition at line 2921 of file C4Object.cpp.

References Action, C4REAL100(), CNAT_Bottom, CNAT_Left, CNAT_Right, CNAT_Top, COMD_Down, COMD_Left, COMD_Right, COMD_Stop, COMD_Up, C4Action::ComDir, ComDirLike(), Con, Def, DFA_DIG, DFA_FLIGHT, DFA_HANGLE, DFA_SCALE, DFA_SWIM, DFA_WALK, C4Action::Dir, DIR_Left, DIR_Right, fix_x, fix_y, C4Def::Float, ForcePosition(), FullCon, GBackSemiSolid(), GetAction(), C4PropList::GetPropertyInt(), C4PropList::GetPropertyP(), GetX(), GetY(), ObjectActionCornerScale(), ObjectActionFlat(), ObjectActionHangle(), ObjectActionJump(), ObjectActionKneel(), ObjectActionScale(), ObjectActionStand(), ObjectActionTumble(), ObjectActionWalk(), OCF, OCF_HitSpeed3, OCF_HitSpeed4, P_ObjectDisabled, P_Procedure, SetDir(), t_contact, xdir, and ydir.

Referenced by DoMovement().

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

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(), Lift(), Push(), 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:50
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:352
int32_t ContactCNAT
Definition: C4Shape.h:49
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:

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(), Enter(), 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:370
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:

C4Object * C4Object::CreateContents ( C4PropList PropList)

Definition at line 1440 of file C4Object.cpp.

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

Referenced by CreateContentsByList().

1441 {
1442  C4Object *nobj;
1443  if (!(nobj=Game.CreateObject(PropList,this,Owner))) return nullptr;
1444  if (!nobj->Enter(this)) { nobj->AssignRemoval(); return nullptr; }
1445  return nobj;
1446 }
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1264
C4Game Game
Definition: C4Globals.cpp:52
int32_t Owner
Definition: C4Object.h:110
void AssignRemoval(bool fExitContents=false)
Definition: C4Object.cpp:254
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:

Here is the caller graph for this function:

bool C4Object::CreateContentsByList ( C4IDList idlist)

Definition at line 1448 of file C4Object.cpp.

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

Referenced by C4Player::PlaceReadyMaterial().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::Default ( )

Definition at line 91 of file C4Object.cpp.

References Action, Alive, Audible, AudiblePan, AudiblePlayer, BlitMode, Breath, Category, StdStrBuf::Clear(), ClearParticleLists(), Color, ColorMod, Command, Con, Contained, Contents, Controller, CrewDisabled, Damage, Def, C4Rect::Default(), C4Shape::Default(), C4TargetRect::Default(), C4Action::Default(), C4ObjectList::Default(), C4Facet::Default(), Energy, EntranceStatus, fix_r, fix_x, fix_y, fOwnVertices, iLastAttachMovementFrame, Info, Initializing, InLiquid, InMat, LastEnergyLossCausePlayer, Layer, lightColor, lightFadeoutRange, lightRange, Marker, Mass, MaterialContents, Menu, MNone, Mobile, nInfo, NO_OWNER, C4ID::None, OCF, OnFire, Owner, OwnMass, pDrawTransform, pEffects, pGfxOverlay, pGraphics, PictureRect, pMeshInstance, pSolidMaskData, rdir, RemovalDelay, Shape, SolidMask, t_contact, TopFace, Unsorted, xdir, and ydir.

Referenced by C4Object().

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();
129  Def=nullptr;
130  Info=nullptr;
131  Command=nullptr;
132  Contained=nullptr;
133  TopFace.Default();
134  Menu=nullptr;
135  MaterialContents=nullptr;
136  Marker=0;
137  ColorMod=0xffffffff;
138  BlitMode=0;
139  CrewDisabled=false;
140  Layer=nullptr;
141  pSolidMaskData=nullptr;
142  pGraphics=nullptr;
143  pMeshInstance=nullptr;
144  pDrawTransform=nullptr;
145  pEffects=nullptr;
146  pGfxOverlay=nullptr;
148 
150 }
C4DrawTransform * pDrawTransform
Definition: C4Object.h:137
bool Alive
Definition: C4Object.h:175
void Clear()
Definition: StdBuf.h:466
int32_t Mass
Definition: C4Object.h:115
C4Rect PictureRect
Definition: C4Object.h:151
C4MaterialList * MaterialContents
Definition: C4Object.h:153
uint32_t Marker
Definition: C4Object.h:135
C4Command * Command
Definition: C4Object.h:166
int32_t OwnMass
Definition: C4Object.h:115
C4Real rdir
Definition: C4Object.h:126
bool OnFire
Definition: C4Object.h:172
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:245
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:178
C4NotifyingObjectList Contents
Definition: C4Object.h:152
C4Def * Def
Definition: C4Object.h:143
bool CrewDisabled
Definition: C4Object.h:163
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:173
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:138
C4DefGraphics * pGraphics
Definition: C4Object.h:154
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:170
C4Real fix_r
Definition: C4Object.h:125
C4Real fix_x
Definition: C4Object.h:125
StdCopyStrBuf nInfo
Definition: C4Object.h:168
uint32_t ColorMod
Definition: C4Object.h:161
int32_t iLastAttachMovementFrame
Definition: C4Object.h:127
virtual void Default()
uint32_t BlitMode
Definition: C4Object.h:162
C4Effect * pEffects
Definition: C4Object.h:156
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:176
bool fOwnVertices
Definition: C4Object.h:149
C4Real xdir
Definition: C4Object.h:126
int32_t Controller
Definition: C4Object.h:111
StdMeshInstance * pMeshInstance
Definition: C4Object.h:155
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

Here is the call graph for this function:

Here is the caller graph for this function:

virtual bool C4PropList::Delete ( )
inlinevirtualinherited

Reimplemented in C4PropListStaticMember, C4PropListStatic, C4PropListScript, and C4Def.

Definition at line 90 of file C4PropList.h.

Referenced by C4ScriptHost::DeleteOwnedPropLists().

90 { return false; }

Here is the caller graph for this function:

void C4Object::Denumerate ( C4ValueNumbers numbers)
overridevirtual

Reimplemented from C4PropList.

Definition at line 2312 of file C4Object.cpp.

References Action, Command, Contained, Contents, C4Effect::Denumerate(), C4PropList::Denumerate(), C4ObjectPtr::DenumeratePointers(), C4ObjectList::DenumeratePointers(), StdMeshInstance::DenumeratePointers(), C4GraphicsOverlay::GetNext(), Layer, C4Command::Next, pEffects, pGfxOverlay, pMeshInstance, C4Action::Target, and C4Action::Target2.

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 }
bool DenumeratePointers()
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:166
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:152
void DenumeratePointers()
Definition: StdMesh.cpp:1669
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:170
C4ObjectPtr Target
Definition: C4Object.h:87
C4Effect * pEffects
Definition: C4Object.h:156
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Action Action
Definition: C4Object.h:147
StdMeshInstance * pMeshInstance
Definition: C4Object.h:155
C4GraphicsOverlay * GetNext() const

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 4247 of file C4Object.cpp.

References C4PropList::Call(), Contained, Contents, C4ObjectList::GetObject(), C4Menu::IsActive(), C4Menu::IsContextMenu(), Menu, C4Menu::Refill(), C4ObjectList::ShiftContents(), StartSoundEffect(), and C4PropList::Status.

Referenced by ShiftContents().

4248 {
4249  // safety
4250  if (!pTarget || !pTarget->Status || pTarget->Contained != this) return;
4251  // Desired object already at front?
4252  if (Contents.GetObject() == pTarget) return;
4253  // select object via script?
4254  if (fDoCalls)
4255  if (Call("~ControlContents", &C4AulParSet(pTarget)))
4256  return;
4257  // default action
4258  if (!(Contents.ShiftContents(pTarget))) return;
4259  // Selection sound
4260  if (fDoCalls) if (!Contents.GetObject()->Call("~Selection", &C4AulParSet(this))) StartSoundEffect("Clonk::Action::Grab",false,100,this);
4261  // update menu with the new item in "put" entry
4262  if (Menu && Menu->IsActive() && Menu->IsContextMenu())
4263  {
4264  Menu->Refill();
4265  }
4266  // Done
4267  return;
4268 }
bool IsContextMenu()
Definition: C4Menu.h:164
bool Refill()
Definition: C4Menu.cpp:915
bool ShiftContents(C4Object *pNewFirst)
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:152
C4Object * GetObject(int Index=0) const
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:

Here is the caller graph for this function:

void C4Object::DoBreath ( int32_t  iChange)

Definition at line 1147 of file C4Object.cpp.

References Breath, C4PropList::Call(), C4PropList::GetPropertyInt(), P_MaxBreath, and PSF_BreathChange.

Referenced by ExecLife().

1148 {
1149  // Do change
1150  iChange = Clamp<int32_t>(iChange, -Breath, GetPropertyInt(P_MaxBreath) - Breath);
1151  Breath += iChange;
1152  // call to object
1153  Call(PSF_BreathChange,&C4AulParSet(iChange));
1154 }
int32_t Breath
Definition: C4Object.h:118
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:882
#define PSF_BreathChange
Definition: C4GameScript.h:143
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:

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

Definition at line 1156 of file C4Object.cpp.

References AssignRemoval(), C4PropList::Call(), Con, Contained, Contents, Def, Enter(), Exit(), fix_y, FullCon, C4Shape::GetBottom(), C4ObjectList::GetObject(), GetX(), GetY(), C4Def::GrowthType, C4Def::IncompleteActivity, C4Def::Oversize, pMeshInstance, PSF_Initialize, PSF_OnCompletionChange, SetAction(), StdMeshInstance::SetCompletion(), SetOCF(), Shape, UpdateFace(), UpdateMass(), and UpdateShape().

Referenced by C4Game::NewObject().

1157 {
1158  C4Real strgt_con_b = fix_y + Shape.GetBottom();
1159  bool fWasFull = (Con>=FullCon);
1160  int32_t old_con = Con;
1161 
1162  // Change con
1163  if (Def->Oversize)
1164  Con=std::max<int32_t>(Con+iChange,0);
1165  else
1166  Con=Clamp<int32_t>(Con+iChange,0,FullCon);
1167 
1168  // Update OCF
1169  SetOCF();
1170 
1171  // Mass
1172  UpdateMass();
1173 
1174  // shape and position
1175  UpdateShape();
1176  // make the bottom-most vertex stay in place
1177  if (!grow_from_center)
1178  {
1179  fix_y = strgt_con_b - Shape.GetBottom();
1180  }
1181  // Face (except for the shape)
1182  UpdateFace(false);
1183 
1184  // Do a callback on completion change.
1185  if (iChange != 0)
1186  Call(PSF_OnCompletionChange, &C4AulParSet(old_con, Con));
1187 
1188  // Unfullcon
1189  if (fWasFull && (Con<FullCon))
1190  {
1191  // Lose contents
1192  if (!Def->IncompleteActivity)
1193  {
1194  C4Object *cobj;
1195  while ((cobj=Contents.GetObject()))
1196  if (Contained) cobj->Enter(Contained);
1197  else cobj->Exit(cobj->GetX(),cobj->GetY());
1198  SetAction(nullptr);
1199  }
1200  }
1201 
1202  // Completion
1203  if (!fWasFull && (Con>=FullCon))
1205 
1206  // Con Zero Removal
1207  if (Con<=0)
1208  AssignRemoval();
1209  // Mesh Graphics Update
1210  else if(pMeshInstance)
1211  pMeshInstance->SetCompletion(Def->GrowthType ? 1.0f : static_cast<float>(Con)/static_cast<float>(FullCon));
1212 }
int32_t GetY() const
Definition: C4Object.h:287
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1264
int GetBottom()
Definition: C4Shape.cpp:471
Definition: C4Real.h:58
const int32_t FullCon
Definition: C4Constants.h:182
#define PSF_Initialize
Definition: C4GameScript.h:34
C4NotifyingObjectList Contents
Definition: C4Object.h:152
int32_t GrowthType
Definition: C4Def.h:111
C4Def * Def
Definition: C4Object.h:143
void UpdateShape(bool bUpdateVertices=true)
Definition: C4Object.cpp:343
int32_t Con
Definition: C4Object.h:173
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2685
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:1228
#define PSF_OnCompletionChange
Definition: C4GameScript.h:103
int32_t GetX() const
Definition: C4Object.h:286
void AssignRemoval(bool fExitContents=false)
Definition: C4Object.cpp:254
C4Object * GetObject(int Index=0) const
void UpdateMass()
Definition: C4Object.cpp:639
int32_t Oversize
Definition: C4Def.h:130
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:378
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:667
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Shape Shape
Definition: C4Object.h:148
StdMeshInstance * pMeshInstance
Definition: C4Object.h:155
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:

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

Definition at line 1096 of file C4Object.cpp.

References Alive, C4PropList::Call(), Damage, C4Effect::DoDamage(), pEffects, and PSF_Damage.

1097 {
1098  // non-living: ask effects first
1099  if (pEffects && !Alive)
1100  {
1101  pEffects->DoDamage(iChange, iCause, iCausedBy);
1102  if (!iChange) return;
1103  }
1104  // Change value
1105  Damage = std::max<int32_t>( Damage+iChange, 0 );
1106  // Engine script call
1107  Call(PSF_Damage,&C4AulParSet(iChange, iCause, iCausedBy));
1108 }
bool Alive
Definition: C4Object.h:175
#define PSF_Damage
Definition: C4GameScript.h:63
int32_t Damage
Definition: C4Object.h:116
C4Effect * pEffects
Definition: C4Object.h:156
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 call graph for this function:

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

Definition at line 1110 of file C4Object.cpp.

References Alive, AssignDeath(), C4MaxPhysical, C4PropList::Call(), C4Effect::DoDamage(), Energy, C4PropList::GetPropertyInt(), P_MaxEnergy, pEffects, PSF_EnergyChange, and UpdatLastEnergyLossCause().

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

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

Here is the caller graph for this function:

void C4Object::DoExperience ( int32_t  change)

Definition at line 1214 of file C4Object.cpp.

References DefaultRanks, C4ObjectInfoCore::Experience, C4RankSystem::Experience(), Info, Promote(), and C4ObjectInfoCore::Rank.

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

1215 {
1216  const int32_t MaxExperience = 100000000;
1217 
1218  if (!Info) return;
1219 
1220  Info->Experience=Clamp<int32_t>(Info->Experience+change,0,MaxExperience);
1221 
1222  // Promotion check
1223  if (Info->Experience<MaxExperience)
1225  Promote(Info->Rank+1, false, false);
1226 }
C4RankSystem DefaultRanks
bool Promote(int32_t torank, bool exception, bool fForceRankName)
Definition: C4Object.cpp:1716
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:

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:176

Here is the call graph for this function:

Here is the caller graph for this function:

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 }
int32_t GetY() const
Definition: C4Object.h:287
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
#define PSF_Hit
Definition: C4GameScript.h:49
int32_t GetY() const
Definition: C4Shape.h:64
bool Alive
Definition: C4Object.h:175
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)
C4PropList * GetAction() const
Definition: C4Object.cpp:2678
C4Real rdir
Definition: C4Object.h:126
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:182
void UpdatePos()
Definition: C4Object.cpp:370
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:343
#define PSF_Hit2
Definition: C4GameScript.h:50
uint32_t t_contact
Definition: C4Object.h:133
int32_t ContactVtxFriction(C4Object *cobj)
Definition: C4Movement.cpp:91
C4Landscape Landscape
void ContactAction()
Definition: C4Object.cpp:2921
void NoAttachAction()
Definition: C4Object.cpp:2886
int32_t Con
Definition: C4Object.h:173
int32_t GetX() const
Definition: C4Shape.h:63
int32_t GetX() const
Definition: C4Object.h:286
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
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:378
bool IsInLiquidCheck() const
Definition: C4Object.cpp:4105
void VerticalBounds(C4Real &ctcoy)
Definition: C4Movement.cpp:179
int32_t ContactVtxWeight(C4Object *cobj)
Definition: C4Movement.cpp:76
C4Real fix_r
Definition: C4Object.h:125
C4Real fix_x
Definition: C4Object.h:125
const BYTE CNAT_Right
Definition: C4Constants.h:111
#define PSF_Hit3
Definition: C4GameScript.h:51
const uint32_t OCF_HitSpeed3
Definition: C4Constants.h:92
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:882
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:4145
bool ContactVtxCNAT(C4Object *cobj, BYTE cnat_dir)
Definition: C4Movement.cpp:63
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
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:110
bool Attach(int32_t &cx, int32_t &cy, BYTE cnat_pos)
Definition: C4Shape.cpp:185
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:

bool C4Object::DoSelect ( )

Definition at line 4313 of file C4Object.cpp.

References C4PropList::Call(), CrewDisabled, and PSF_CrewSelection.

Referenced by C4Player::SetCursor().

4314 {
4315  // selection allowed?
4316  if (CrewDisabled) return false;
4317  // do callback
4319  // done
4320  return true;
4321 }
#define PSF_CrewSelection
Definition: C4GameScript.h:86
bool CrewDisabled
Definition: C4Object.h:163
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:

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

Definition at line 1789 of file C4Object.cpp.

References C4Value::_getInt(), ACenter, Action, Angle(), StdStrBuf::Append(), StdStrBuf::AppendChar(), StdStrBuf::AppendFormat(), BackParticles, C4Draw::Blit(), BlitMode, C4CMD_Acquire, C4CMD_Buy, C4CMD_Call, C4CMD_MoveTo, C4CMD_None, C4CMD_Put, C4CMD_Sell, C4CMD_Transfer, C4D_IgnoreFoW, C4D_Parallax, C4RGB, Category, CNAT_NoCollision, C4Def::Collection, Color, ColorMod, C4Command::Command, Command, CommandName(), Con, Contained, C4Command::Data, Def, C4Draw::DEFAULT_MESSAGE_COLOR, C4ParticleList::Draw(), DrawActionFace(), C4Action::DrawDir, DrawFace(), C4Draw::DrawFrameDw(), DrawLine(), C4Draw::DrawLineDw(), C4Def::Entrance, C4Action::Facet, C4Action::FacetX, C4Action::FacetY, C4Command::Finished, FinishedDrawing(), Fix0, fix_r, fix_y, fixtof(), C4GraphicsResource::FontRegular, StdStrBuf::Format(), FrontParticles, FullCon, GetAction(), C4String::GetCStr(), StdStrBuf::getData(), C4Value::GetDataString(), GetDrawPosition(), C4Draw::GetFoW(), GetGraphics(), C4PropList::GetName(), C4GraphicsOverlay::GetNext(), C4PropList::GetPropertyInt(), CStdFont::GetTextExtent(), C4Shape::GetX(), GetX(), C4Shape::GetY(), GetY(), GraphicsResource, GraphicsSystem, C4Rect::Hgt, C4Facet::Hgt, InLiquid, IsVisible(), C4Def::Line, Mobile, C4Command::Next, OCF, OCF_Collection, OCF_Entrance, ODM_BaseOnly, ODM_Overlay, P_FacetBase, P_FacetTargetStretch, pDraw, pGfxOverlay, C4Action::Phase, PrepareDrawing(), C4ScriptUniform::Push(), C4Draw::scriptUniform, SetAudibilityAt(), C4Draw::SetFoW(), Shape, C4GraphicsSystem::Show8BitSurface, C4GraphicsSystem::ShowAction, C4GraphicsSystem::ShowCommand, C4GraphicsSystem::ShowEntrance, C4GraphicsSystem::ShowVertices, SolidMask, sprintf, C4PropList::Status, C4Facet::Surface, C4Command::Target, C4Action::Target, C4Command::Target2, C4Command::Text, C4Draw::TextOut(), C4Command::Tx, C4Command::Ty, C4DefGraphics::Type, C4DefGraphics::TYPE_Bitmap, C4Shape::VtxCNAT, C4Shape::VtxContactCNAT, C4Shape::VtxNum, C4Shape::VtxX, C4Shape::VtxY, C4Rect::Wdt, C4Facet::Wdt, C4Rect::x, C4Facet::X, C4Rect::y, C4Facet::Y, and C4TargetFacet::Zoom.

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

1790 {
1791 #ifndef USE_CONSOLE
1792  C4Facet ccgo;
1793 
1794  // Status
1795  if (!Status || !Def) return;
1796 
1797  // visible?
1798  if (!IsVisible(iByPlayer, !!eDrawMode)) return;
1799 
1800  // Set up custom uniforms.
1801  auto uniform_popper = pDraw->scriptUniform.Push(this);
1802 
1803  // Line
1804  if (Def->Line) { DrawLine(cgo, iByPlayer); return; }
1805 
1806  // background particles (bounds not checked)
1807  if (BackParticles) BackParticles->Draw(cgo, this);
1808 
1809  // Object output position
1810  float newzoom = cgo.Zoom;
1811  if (eDrawMode!=ODM_Overlay)
1812  {
1813  if (!GetDrawPosition(cgo, offX, offY, newzoom)) return;
1814  }
1815  ZoomDataStackItem zdsi(newzoom);
1816 
1817  bool fYStretchObject=false;
1818  C4PropList* pActionDef = GetAction();
1819  if (pActionDef)
1820  if (pActionDef->GetPropertyInt(P_FacetTargetStretch))
1821  fYStretchObject=true;
1822 
1823  // Set audibility
1824  if (!eDrawMode) SetAudibilityAt(cgo, GetX(), GetY(), iByPlayer);
1825 
1826  // Output boundary
1827  if (!fYStretchObject && !eDrawMode && !(Category & C4D_Parallax))
1828  {
1829  // For actions with a custom facet set, check against that action facet. Otherwise (or with oversize objects), just check against shape.
1830  if (pActionDef && fix_r == Fix0 && !pActionDef->GetPropertyInt(P_FacetBase) && Con <= FullCon && Action.Facet.Wdt)
1831  {
1832  // active
1833  if ( !Inside<float>(offX+Shape.GetX()+Action.FacetX,cgo.X-Action.Facet.Wdt,cgo.X+cgo.Wdt)
1834  || (!Inside<float>(offY+Shape.GetY()+Action.FacetY,cgo.Y-Action.Facet.Hgt,cgo.Y+cgo.Hgt)) )
1835  {
1836  if (FrontParticles && !Contained) FrontParticles->Draw(cgo, this);
1837  return;
1838  }
1839  }
1840  else
1841  // idle
1842  if ( !Inside<float>(offX+Shape.GetX(),cgo.X-Shape.Wdt,cgo.X+cgo.Wdt)
1843  || (!Inside<float>(offY+Shape.GetY(),cgo.Y-Shape.Hgt,cgo.Y+cgo.Hgt)) )
1844  {
1845  if (FrontParticles && !Contained) FrontParticles->Draw(cgo, this);
1846  return;
1847  }
1848  }
1849 
1850  // ensure correct color is set
1851  if (GetGraphics()->Type == C4DefGraphics::TYPE_Bitmap)
1852  if (GetGraphics()->Bmp.BitmapClr) GetGraphics()->Bmp.BitmapClr->SetClr(Color);
1853 
1854  // Debug Display //////////////////////////////////////////////////////////////////////
1855  if (::GraphicsSystem.ShowCommand && !eDrawMode)
1856  {
1857  C4Command *pCom;
1858  int32_t ccx=GetX(),ccy=GetY();
1859  float offX1, offY1, offX2, offY2, newzoom;
1860  char szCommand[200];
1861  StdStrBuf Cmds;
1862  int32_t iMoveTos=0;
1863  for (pCom=Command; pCom; pCom=pCom->Next)
1864  {
1865  switch (pCom->Command)
1866  {
1867  case C4CMD_MoveTo:
1868  // Angle
1869  int32_t iAngle; iAngle=Angle(ccx,ccy,pCom->Tx._getInt(),pCom->Ty); while (iAngle>180) iAngle-=360;
1870  // Path
1871  if(GetDrawPosition(cgo, ccx, ccy, cgo.Zoom, offX1, offY1, newzoom) &&
1872  GetDrawPosition(cgo, pCom->Tx._getInt(), pCom->Ty, cgo.Zoom, offX2, offY2, newzoom))
1873  {
1874  ZoomDataStackItem zdsi(newzoom);
1875  pDraw->DrawLineDw(cgo.Surface,offX1,offY1,offX2,offY2,C4RGB(0xca,0,0));
1876  pDraw->DrawFrameDw(cgo.Surface,offX2-1,offY2-1,offX2+1,offY2+1,C4RGB(0xca,0,0));
1877  }
1878 
1879  ccx=pCom->Tx._getInt(); ccy=pCom->Ty;
1880  // Message
1881  iMoveTos++; szCommand[0]=0;
1882  break;
1883  case C4CMD_Put:
1884  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() : "");
1885  break;
1886  case C4CMD_Buy: case C4CMD_Sell:
1887  sprintf(szCommand,"%s %s at %s",CommandName(pCom->Command),pCom->Data.GetDataString().getData(),pCom->Target ? pCom->Target->GetName() : "closest base");
1888  break;
1889  case C4CMD_Acquire:
1890  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Data.GetDataString().getData());
1891  break;
1892  case C4CMD_Call:
1893  sprintf(szCommand,"%s %s in %s",CommandName(pCom->Command),pCom->Text->GetCStr(),pCom->Target ? pCom->Target->GetName() : "(null)");
1894  break;
1895  case C4CMD_None:
1896  szCommand[0]=0;
1897  break;
1898  case C4CMD_Transfer:
1899  // Path
1900  if(GetDrawPosition(cgo, ccx, ccy, cgo.Zoom, offX1, offY1, newzoom) &&
1901  GetDrawPosition(cgo, pCom->Tx._getInt(), pCom->Ty, cgo.Zoom, offX2, offY2, newzoom))
1902  {
1903  ZoomDataStackItem zdsi(newzoom);
1904  pDraw->DrawLineDw(cgo.Surface,offX1,offY1,offX2,offY2,C4RGB(0,0xca,0));
1905  pDraw->DrawFrameDw(cgo.Surface,offX2-1,offY2-1,offX2+1,offY2+1,C4RGB(0,0xca,0));
1906  }
1907 
1908  ccx=pCom->Tx._getInt(); ccy=pCom->Ty;
1909  // Message
1910  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Target ? pCom->Target->GetName() : "");
1911  break;
1912  default:
1913  sprintf(szCommand,"%s %s",CommandName(pCom->Command),pCom->Target ? pCom->Target->GetName() : "");
1914  break;
1915  }
1916  // Compose command stack message
1917  if (szCommand[0])
1918  {
1919  // End MoveTo stack first
1920  if (iMoveTos) { Cmds.AppendChar('|'); Cmds.AppendFormat("%dx MoveTo",iMoveTos); iMoveTos=0; }
1921  // Current message
1922  Cmds.AppendChar('|');
1923  if (pCom->Finished) Cmds.Append("<i>");
1924  Cmds.Append(szCommand);
1925  if (pCom->Finished) Cmds.Append("</i>");
1926  }
1927  }
1928  // Open MoveTo stack
1929  if (iMoveTos) { Cmds.AppendChar('|'); Cmds.AppendFormat("%dx MoveTo",iMoveTos); iMoveTos=0; }
1930  // Draw message
1931  int32_t cmwdt,cmhgt; ::GraphicsResource.FontRegular.GetTextExtent(Cmds.getData(),cmwdt,cmhgt,true);
1933  }
1934  // Debug Display ///////////////////////////////////////////////////////////////////////////////
1935 
1936  // Don't draw (show solidmask)