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:2433
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 1349 of file C4Object.cpp.

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

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

1350 {
1351 
1352  // Try entrance activation
1353  if (OCF & OCF_Entrance)
1354  if (!! Call(PSF_ActivateEntrance,&C4AulParSet(by_obj)))
1355  return true;
1356  // Failure
1357  return false;
1358 }
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 1477 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().

1480 {
1481  // Variables
1482  C4FacetSurface fctSymbol;
1483  C4IDList ListItems;
1484  // Close any other menu
1485  if (Menu && Menu->IsActive()) if (!Menu->TryClose(true, false)) return false;
1486  // Create menu
1487  if (!Menu) Menu = new C4ObjectMenu; else Menu->ClearItems();
1488  // Open menu
1489  switch (iMenu)
1490  {
1491  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1492  case C4MN_Activate:
1493  // No target specified: use own container as target
1494  if (!pTarget) if (!(pTarget=Contained)) break;
1495  // Opening contents menu blocked by RejectContents
1496  if (!!pTarget->Call(PSF_RejectContents)) return false;
1497  // Create symbol
1498  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1499  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1500  // Init
1501  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1502  Menu->SetPermanent(true);
1503  Menu->SetRefillObject(pTarget);
1504  // Success
1505  return true;
1506  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1507  case C4MN_Buy:
1508  // No target specified: container is base
1509  if (!pTarget) if (!(pTarget=Contained)) break;
1510  // Create symbol
1511  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1512  DrawMenuSymbol(C4MN_Buy, fctSymbol, pTarget->Owner);
1513  // Init menu
1514  Menu->Init(fctSymbol,LoadResStr("IDS_PLR_NOBUY"),this,C4MN_Extra_Value,0,iMenu);
1515  Menu->SetPermanent(true);
1516  Menu->SetRefillObject(pTarget);
1517  // Success
1518  return true;
1519  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1520  case C4MN_Sell:
1521  // No target specified: container is base
1522  if (!pTarget) if (!(pTarget=Contained)) break;
1523  // Create symbol & init
1524  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1525  DrawMenuSymbol(C4MN_Sell, fctSymbol, pTarget->Owner);
1526  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_Value,0,iMenu);
1527  Menu->SetPermanent(true);
1528  Menu->SetRefillObject(pTarget);
1529  // Success
1530  return true;
1531  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1532  case C4MN_Get:
1533  case C4MN_Contents:
1534  // No target specified
1535  if (!pTarget) break;
1536  // Opening contents menu blocked by RejectContents
1537  if (!!pTarget->Call(PSF_RejectContents)) return false;
1538  // Create symbol & init
1539  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1540  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1541  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1542  Menu->SetPermanent(true);
1543  Menu->SetRefillObject(pTarget);
1544  // Success
1545  return true;
1546  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1547  case C4MN_Info:
1548  // Target by parameter
1549  if (!pTarget) break;
1550  // Create symbol & init menu
1551  fctSymbol.Create(C4SymbolSize, C4SymbolSize); GfxR->fctOKCancel.Draw(fctSymbol,true,0,1);
1552  Menu->Init(fctSymbol, pTarget->GetName(), this, C4MN_Extra_None, 0, iMenu, C4MN_Style_Info);
1553  Menu->SetPermanent(true);
1555  C4Viewport *pViewport = ::Viewports.GetViewport(Controller); // Hackhackhack!!!
1556  if (pViewport) Menu->SetLocation((pTarget->GetX() + pTarget->Shape.GetX() + pTarget->Shape.Wdt + 10 - pViewport->GetViewX()) * pViewport->GetZoom(),
1557  (pTarget->GetY() + pTarget->Shape.GetY() - pViewport->GetViewY()) * pViewport->GetZoom());
1558  // Add info item
1559  fctSymbol.Create(C4PictureSize, C4PictureSize); pTarget->Def->Draw(fctSymbol, false, pTarget->Color, pTarget);
1560  Menu->Add(pTarget->GetName(), fctSymbol, "", C4MN_Item_NoCount, nullptr, pTarget->GetInfoString().getData());
1561  fctSymbol.Default();
1562  // Success
1563  return true;
1564  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1565  }
1566  // Invalid menu identification
1567  CloseMenu(true);
1568  return false;
1569 }
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:63
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:1571
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:649
int32_t Owner
Definition: C4Object.h:110
int32_t GetX() const
Definition: C4Shape.h:62
uint32_t Color
Definition: C4Object.h:120
void Draw(C4Facet &cgo, bool fSelected=false, DWORD iColor=0, C4Object *pObj=nullptr, int32_t iPhaseX=0, int32_t iPhaseY=0, C4DrawTransform *trans=nullptr, const char *graphicsName=nullptr)
Definition: C4Def.cpp:597
int32_t 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:4714
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 2563 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().

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

Here is the call graph for this function:

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

Definition at line 4299 of file C4Object.cpp.

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

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

4300 {
4301  // add self, contents and child contents count recursively to value array. Return index after last added item.
4302  target_array->SetItem(index++, C4VObj(this));
4303  for (C4Object *cobj : Contents)
4304  {
4305  index = cobj->AddObjectAndContentsToArray(target_array, index);
4306  }
4307  return index;
4308 }
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 4587 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().

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

991 {
992  C4Object *thing;
993  // Alive objects only
994  if (!Alive) return;
995  // clear all effects
996  // do not delete effects afterwards, because they might have denied removal
997  // set alive-flag before, so objects know what's up
998  // and prevent recursive death-calls this way
999  // get death causing player before doing effect calls, because those might meddle around with the flags
1000  int32_t iDeathCausingPlayer = LastEnergyLossCausePlayer;
1001  Alive=false;
1003  // if the object is alive again, abort here if the kill is not forced
1004  if (Alive && !fForced) return;
1005  // Action
1006  SetActionByName("Dead");
1007  // Values
1008  Alive=false;
1009  ClearCommands();
1010  C4ObjectInfo * pInfo = Info;
1011  if (Info)
1012  {
1013  Info->HasDied=true;
1014  ++Info->DeathCount;
1015  Info->Retire();
1016  }
1017  // Remove from crew/cursor/view
1018  C4Player *pPlr = ::Players.Get(Owner);
1019  if (pPlr) pPlr->ClearPointers(this, true);
1020  // Remove from light sources
1021  SetLightRange(0,0);
1022  // Engine script call
1023  C4AulParSet pars(iDeathCausingPlayer);
1024  Call(PSF_Death, &pars);
1025  // Lose contents
1026  while ((thing=Contents.GetObject())) thing->Exit(thing->GetX(),thing->GetY());
1027  // Update OCF. Done here because previously it would have been done in the next frame
1028  // Whats worse: Having the OCF change because of some unrelated script-call like
1029  // SetCategory, or slightly breaking compatibility?
1030  SetOCF();
1031  // Engine broadcast: relaunch player (in CR, this was called from clonk script.
1032  // Now, it is done for every crew member)
1033  if(pPlr)
1034  if(!pPlr->Crew.ObjectCount())
1036  &C4AulParSet(Owner, iDeathCausingPlayer, Status ? this : nullptr));
1037  if (pInfo)
1038  pInfo->HasDied = false;
1039 }
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:2815
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:1225
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:2532
#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:4006
C4Value GRBroadcast(const char *szFunction, C4AulParSet *pPars=nullptr, bool fPassError=false, bool fRejectTest=false)
Definition: C4Game.cpp:3844
C4Effect * pEffects
Definition: C4Object.h:156
void SetOCF()
Definition: C4Object.cpp:668
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 2387 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().

2388 {
2389  if (Info || !ValidPlr(Owner)) return false;
2390  // In crew list?
2391  C4Player *pPlr = ::Players.Get(Owner);
2392  if (pPlr->Crew.GetLink(this))
2393  {
2394  // Register with player
2395  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2396  pPlr->Crew.Remove(this);
2397  return true;
2398  }
2399  // Info set, but not in crew list, so
2400  // a) The savegame is old-style (without crew list)
2401  // or b) The clonk is dead
2402  // or c) The clonk belongs to a script player that's restored without Game.txt
2403  else if (nInfo.getLength())
2404  {
2405  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2406  return false;
2407  // Dead and gone (info flags, remove from crew/cursor)
2408  if (!Alive)
2409  {
2410  if (ValidPlr(Owner)) ::Players.Get(Owner)->ClearPointers(this, true);
2411  }
2412  return true;
2413  }
2414  return false;
2415 }
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 2417 of file C4Object.cpp.

References lightFadeoutRange, lightRange, and UpdateLight().

2418 {
2419  if (!lightRange && !lightFadeoutRange) return true;
2420 
2421  UpdateLight();
2422  return true;
2423 }
int32_t lightFadeoutRange
Definition: C4Object.h:123
int32_t lightRange
Definition: C4Object.h:122
void UpdateLight()
Definition: C4Object.cpp:4029

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  bool fRejectCollect;
310  if (!pCont || !cobj->Enter(pCont, true, false, &fRejectCollect))
311  cobj->Exit(GetX(), GetY());
312  }
313  else
314  {
315  Contents.Remove(cobj);
316  cobj->Contained = nullptr;
317  cobj->AssignRemoval();
318  }
319  }
320  // remove this object from container *after* its contents have been removed!
321  if (pCont)
322  {
323  pCont->Contents.Remove(this);
324  pCont->UpdateMass();
325  pCont->SetOCF();
326  Contained=nullptr;
327  }
328  // Object info
329  if (Info) Info->Retire();
330  Info = nullptr;
331  // Object system operation
332  ClearRefs();
333  Game.ClearPointers(this);
334  ClearCommands();
335  if (pSolidMaskData)
336  {
337  delete pSolidMaskData;
338  pSolidMaskData = nullptr;
339  }
340  SolidMask.Wdt = 0;
341  RemovalDelay=2;
342 }
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:1261
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:179
int32_t Owner
Definition: C4Object.h:110
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2682
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:1225
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:640
void ClearCommands()
Definition: C4Object.cpp:2532
#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:668
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 951 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().

952 {
953  if (Status) if (!Contained) if (Def)
954  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
955  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
956  return true;
957  return false;
958 }
int32_t GetY() const
Definition: C4Object.h:287
int32_t GetY() const
Definition: C4Shape.h:63
int32_t Wdt
Definition: C4Rect.h:30
C4Def * Def
Definition: C4Object.h:143
int32_t GetX() const
Definition: C4Shape.h:62
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 960 of file C4Object.cpp.

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

961 {
962  if (Status) if (!Contained) if (Def)
963  if (OCF & ocf)
964  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
965  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
966  {
967  // Set ocf return value
968  GetOCFForPos(ctx, cty, ocf);
969  return true;
970  }
971  return false;
972 }
int32_t GetY() const
Definition: C4Object.h:287
int32_t GetY() const
Definition: C4Shape.h:63
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:974
int32_t GetX() const
Definition: C4Shape.h:62
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 1007 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().

1008 {
1009  C4PropList::Iterator iter;
1010 
1011  if (GetPrototype())
1012  {
1013  iter = GetPrototype()->begin();
1014  }
1015  else
1016  {
1017  iter.properties = std::make_shared<std::vector<const C4Property*> >();
1018  }
1019  iter.Reserve(Properties.GetSize());
1020 
1021  const C4Property * p = Properties.First();
1022  while (p)
1023  {
1024  iter.AddProperty(p);
1025  p = Properties.Next(p);
1026  }
1027 
1028  iter.Init();
1029  return iter;
1030 }
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 828 of file C4PropList.cpp.

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

829 {
830  if (!Status) return C4Value();
831  C4AulFunc *pFn = GetFunc(k);
832  if (!pFn) return C4Value();
833  return pFn->Exec(this, Pars, fPassErrors);
834 }
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:72
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 836 of file C4PropList.cpp.

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

837 {
838  if (!Status) return C4Value();
839  assert(s && s[0]);
840  C4AulFunc *pFn = GetFunc(s);
841  if (!pFn)
842  {
843  if (s[0] != '~')
844  {
845  C4AulExecError err(FormatString("Undefined function: %s", s).getData());
846  if (fPassErrors)
847  throw err;
848  ::ScriptEngine.GetErrorHandler()->OnError(err.what());
849  }
850  return C4Value();
851  }
852  return pFn->Exec(this, Pars, fPassErrors);
853 }
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:72
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 4752 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().

4753 {
4754  // check current definition ID
4755  if (id != pOtherObject->id) return false;
4756  // def overwrite of stack conditions
4757  int32_t allow_picture_stack = Def->AllowPictureStack;
4758  if (!(allow_picture_stack & APS_Color))
4759  {
4760  // check color if ColorByOwner (flags)
4761  if (Color != pOtherObject->Color && Def->ColorByOwner) return false;
4762  // check modulation
4763  if (ColorMod != pOtherObject->ColorMod) return false;
4764  if (BlitMode != pOtherObject->BlitMode) return false;
4765  }
4766  if (!(allow_picture_stack & APS_Graphics))
4767  {
4768  // check graphics
4769  if (pGraphics != pOtherObject->pGraphics) return false;
4770  // check any own picture rect
4771  if (PictureRect != pOtherObject->PictureRect) return false;
4772  }
4773  if (!(allow_picture_stack & APS_Name))
4774  {
4775  // check name, so zagabar's sandwiches don't stack
4776  if (GetName() != pOtherObject->GetName()) return false;
4777  }
4778  if (!(allow_picture_stack & APS_Overlay))
4779  {
4780  // check overlay graphics
4781  for (C4GraphicsOverlay *pOwnOverlay = pGfxOverlay; pOwnOverlay; pOwnOverlay = pOwnOverlay->GetNext())
4782  if (pOwnOverlay->IsPicture())
4783  {
4784  C4GraphicsOverlay *pOtherOverlay = pOtherObject->GetGraphicsOverlay(pOwnOverlay->GetID(), false);
4785  if (!pOtherOverlay || !(*pOtherOverlay == *pOwnOverlay)) return false;
4786  }
4787  for (C4GraphicsOverlay *pOtherOverlay = pOtherObject->pGfxOverlay; pOtherOverlay; pOtherOverlay = pOtherOverlay->GetNext())
4788  if (pOtherOverlay->IsPicture())
4789  if (!GetGraphicsOverlay(pOtherOverlay->GetID())) return false;
4790  }
4791  // concat OK
4792  return true;
4793 }
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:649
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:147
int32_t GetID() const
uint32_t BlitMode
Definition: C4Object.h:162
class C4GraphicsOverlay * GetGraphicsOverlay(int32_t iForID) const
Definition: C4Object.cpp:4474
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 1041 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().

1042 {
1043  // Get new definition
1044  C4Def *pDef=C4Id2Def(idNew);
1045  if (!pDef) return false;
1046  // Containment storage
1047  C4Object *pContainer=Contained;
1048  // Exit container (no Ejection/Departure)
1049  if (Contained) Exit(0,0,0,Fix0,Fix0,Fix0,false);
1050  // Pre change resets
1051  SetAction(nullptr);
1052  ResetProperty(&Strings.P[P_Action]); // Enforce ActIdle because SetAction may have failed due to NoOtherAction
1053  SetDir(0); // will drop any outdated flipdir
1054  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
1055  Def->Count--;
1056  // Def change
1057  Def=pDef;
1059  id=pDef->id;
1060  Def->Count++;
1061  // new def: Needs to be resorted
1062  Unsorted=true;
1063  // graphics change
1064  pGraphics = &pDef->Graphics;
1065  // blit mode adjustment
1067  // an object may have newly become an ColorByOwner-object
1068  // if it had been ColorByOwner, but is not now, this will be caught in UpdateGraphics()
1069  if (!Color && ValidPlr(Owner))
1071  if (!Def->Rotateable) { fix_r=rdir=Fix0; }
1072  // Reset solid mask
1074  // Post change updates
1075  UpdateGraphics(true);
1076  UpdateMass();
1077  UpdateFace(true);
1078  SetOCF();
1079  // Any effect callbacks to this object might need to reinitialize their target functions
1080  // This is ugly, because every effect there is must be updated...
1085  for (C4Object *obj : Objects)
1086  if (obj->pEffects) obj->pEffects->OnObjectChangedDef(this);
1087  // Containment (no Entrance)
1088  if (pContainer) Enter(pContainer,false);
1089  // Done
1090  return true;
1091 }
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:1261
C4GameScriptHost GameScript
void SetDir(int32_t tdir)
Definition: C4Object.cpp:2841
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:4860
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:405
uint32_t ColorDw
Definition: C4Player.h:89
int32_t Rotateable
Definition: C4Def.h:119
C4Player * Get(int iPlayer) const
C4Def * Def
Definition: C4Object.h:143
C4StringTable Strings
Definition: C4Globals.cpp:42
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:245
int32_t Count
Definition: C4Def.h:179
int32_t Owner
Definition: C4Object.h:110
C4PlayerList Players
bool SetAction(C4PropList *Act, C4Object *pTarget=nullptr, C4Object *pTarget2=nullptr, int32_t iCalls=SAC_StartCall|SAC_AbortCall, bool fForce=false)
Definition: C4Object.cpp:2682
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:1225
uint32_t Color
Definition: C4Object.h:120
Definition: C4Def.h:98
C4DefGraphics * pGraphics
Definition: C4Object.h:154
void UpdateMass()
Definition: C4Object.cpp:640
C4TargetRect SolidMask
Definition: C4Def.h:108
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:379
bool Unsorted
Definition: C4Object.h:129
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:84
#define C4GFXBLIT_CUSTOM
Definition: C4Surface.h:35
C4Real fix_r
Definition: C4Object.h:125
int32_t ValidPlr(int32_t plr)
C4Effect * pScenarioEffects
Definition: C4ScriptHost.h:165
int32_t BlitMode
Definition: C4Def.h:141
uint32_t BlitMode
Definition: C4Object.h:162
void SetOCF()
Definition: C4Object.cpp:668
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
C4DefGraphics Graphics
Definition: C4Def.h:191
C4Effect * pGlobalEffects
Definition: C4Aul.h:144
C4GameObjects Objects
Definition: C4Globals.cpp:48
const C4Real Fix0
Definition: C4Real.h:312
void OnObjectChangedDef(C4PropList *pObj)
Definition: C4Effect.cpp:471

Here is the call graph for this function:

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

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::Clear ( )

Definition at line 2433 of file C4Object.cpp.

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

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

2434 {
2436 
2437  if (pEffects) { delete pEffects; pEffects=nullptr; }
2438  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
2439  if (Menu) delete Menu; Menu=nullptr;
2440  if (MaterialContents) delete MaterialContents; MaterialContents=nullptr;
2441  // clear commands!
2442  C4Command *pCom, *pNext;
2443  for (pCom=Command; pCom; pCom=pNext)
2444  {
2445  pNext=pCom->Next; delete pCom; pCom=pNext;
2446  }
2447  if (pDrawTransform) { delete pDrawTransform; pDrawTransform=nullptr; }
2448  if (pGfxOverlay) { delete pGfxOverlay; pGfxOverlay=nullptr; }
2449  if (pMeshInstance) { delete pMeshInstance; pMeshInstance = nullptr; }
2450 }
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 2546 of file C4Object.cpp.

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

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

2547 {
2548  C4Command *pCom,*pNext;
2549  for (pCom=Command; pCom; pCom=pNext)
2550  {
2551  // Last one to clear
2552  if (pCom==pUntil) pNext=nullptr;
2553  // Next one to clear after this
2554  else pNext=pCom->Next;
2555  Command=pCom->Next;
2556  if (!pCom->iExec)
2557  delete pCom;
2558  else
2559  pCom->iExec = 2;
2560  }
2561 }
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 2532 of file C4Object.cpp.

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

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

2533 {
2534  C4Command *pNext;
2535  while (Command)
2536  {
2537  pNext=Command->Next;
2538  if (!Command->iExec)
2539  delete Command;
2540  else
2541  Command->iExec = 2;
2542  Command=pNext;
2543  }
2544 }
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 4576 of file C4Object.cpp.

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

Referenced by StatusDeactivate().

4577 {
4578  // exit contents from container
4579  for (C4Object *cobj : Contents)
4580  {
4581  cobj->Exit(GetX(), GetY(), 0,Fix0,Fix0,Fix0, fDoCalls);
4582  }
4583  // remove from container *after* contents have been removed!
4584  if (Contained) Exit(GetX(), GetY(), 0, Fix0, Fix0, Fix0, fDoCalls);
4585 }
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:1225
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 2425 of file C4Object.cpp.

References Info.

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

2426 {
2427  if (Info==pInfo)
2428  {
2429  Info=nullptr;
2430  }
2431 }
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 1736 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().

1737 {
1738  // mesh attachments and animation nodes
1740  // effects
1741  if (pEffects) pEffects->ClearPointers(pObj);
1742  // contents/contained: although normally not necessery because it's done in AssignRemoval and StatusDeactivate,
1743  // it is also required during game destruction (because ClearPointers might do script callbacks)
1744  // Perform silent exit to avoid additional callbacks
1745  if (Contained == pObj)
1746  {
1747  Contained->Contents.Remove(this);
1748  Contained = nullptr;
1749  }
1750  Contents.Remove(pObj);
1751  // Action targets
1752  if (Action.Target==pObj) Action.Target=nullptr;
1753  if (Action.Target2==pObj) Action.Target2=nullptr;
1754  // Commands
1755  C4Command *cCom;
1756  for (cCom=Command; cCom; cCom=cCom->Next)
1757  cCom->ClearPointers(pObj);
1758  // Menu
1759  if (Menu) Menu->ClearPointers(pObj);
1760  // Layer
1761  if (Layer==pObj) Layer=nullptr;
1762  // gfx overlays
1763  if (pGfxOverlay)
1764  {
1765  C4GraphicsOverlay *pNextGfxOvrl = pGfxOverlay, *pGfxOvrl;
1766  while ((pGfxOvrl = pNextGfxOvrl))
1767  {
1768  pNextGfxOvrl = pGfxOvrl->GetNext();
1769  if (pGfxOvrl->GetOverlayObject() == pObj)
1770  // overlay relying on deleted object: Delete!
1771  RemoveGraphicsOverlay(pGfxOvrl->GetID());
1772  }
1773  }
1774 }
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:1684
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:4502
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 1571 of file C4Object.cpp.

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

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

1572 {
1573  if (Menu)
1574  {
1575  if (Menu->IsActive()) if (!Menu->TryClose(fForce, false)) return false;
1576  if (!Menu->IsCloseQuerying()) { delete Menu; Menu=nullptr; } // protect menu deletion from recursive menu operation calls
1577  }
1578  return true;
1579 }
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 4168 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().

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

2160 {
2161  bool deserializing = pComp->isDeserializer();
2162  if (deserializing)
2163  Clear();
2164 
2165  // Compile ID, search definition
2166  pComp->Value(mkNamingAdapt(id, "id", C4ID::None ));
2167  if (deserializing)
2168  {
2169  Def = ::Definitions.ID2Def(id);
2170  if (!Def)
2171  { pComp->excNotFound(LoadResStr("IDS_PRC_UNDEFINEDOBJECT"),id.ToString()); return; }
2172  }
2173 
2174  pComp->Value(mkNamingAdapt( mkParAdapt(static_cast<C4PropListNumbered&>(*this), numbers), "Properties"));
2175  pComp->Value(mkNamingAdapt( Status, "Status", 1 ));
2176  if (Info) nInfo = Info->Name; else nInfo.Clear();
2177  pComp->Value(mkNamingAdapt( toC4CStrBuf(nInfo), "Info", "" ));
2178  pComp->Value(mkNamingAdapt( Owner, "Owner", NO_OWNER ));
2179  pComp->Value(mkNamingAdapt( Controller, "Controller", NO_OWNER ));
2180  pComp->Value(mkNamingAdapt( LastEnergyLossCausePlayer, "LastEngLossPlr", NO_OWNER ));
2181  pComp->Value(mkNamingAdapt( Category, "Category", 0 ));
2182  pComp->Value(mkNamingAdapt( Plane, "Plane", 0 ));
2183 
2184  pComp->Value(mkNamingAdapt( iLastAttachMovementFrame, "LastSolidAtchFrame", -1 ));
2185  pComp->Value(mkNamingAdapt( Con, "Size", 0 ));
2186  pComp->Value(mkNamingAdapt( OwnMass, "OwnMass", 0 ));
2187  pComp->Value(mkNamingAdapt( Mass, "Mass", 0 ));
2188  pComp->Value(mkNamingAdapt( Damage, "Damage", 0 ));
2189  pComp->Value(mkNamingAdapt( Energy, "Energy", 0 ));
2190  pComp->Value(mkNamingAdapt( Alive, "Alive", false ));
2191  pComp->Value(mkNamingAdapt( Breath, "Breath", 0 ));
2192  pComp->Value(mkNamingAdapt( Color, "Color", 0u ));
2193  pComp->Value(mkNamingAdapt( fix_x, "X", Fix0 ));
2194  pComp->Value(mkNamingAdapt( fix_y, "Y", Fix0 ));
2195  pComp->Value(mkNamingAdapt( fix_r, "R", Fix0 ));
2196  pComp->Value(mkNamingAdapt( xdir, "XDir", 0 ));
2197  pComp->Value(mkNamingAdapt( ydir, "YDir", 0 ));
2198  pComp->Value(mkNamingAdapt( rdir, "RDir", 0 ));
2199  pComp->Value(mkParAdapt(Shape, &Def->Shape));
2200  pComp->Value(mkNamingAdapt( fOwnVertices, "OwnVertices", false ));
2201  pComp->Value(mkNamingAdapt( SolidMask, "SolidMask", Def->SolidMask ));
2202  pComp->Value(mkNamingAdapt( PictureRect, "Picture" ));
2203  pComp->Value(mkNamingAdapt( Mobile, "Mobile", false ));
2204  pComp->Value(mkNamingAdapt( OnFire, "OnFire", false ));
2205  pComp->Value(mkNamingAdapt( InLiquid, "InLiquid", false ));
2206  pComp->Value(mkNamingAdapt( EntranceStatus, "EntranceStatus", false ));
2207  pComp->Value(mkNamingAdapt( OCF, "OCF", 0u ));
2208  pComp->Value(Action);
2209  pComp->Value(mkNamingAdapt( Contained, "Contained", C4ObjectPtr::Null ));
2210  pComp->Value(mkNamingAdapt( Action.Target, "ActionTarget1", C4ObjectPtr::Null ));
2211  pComp->Value(mkNamingAdapt( Action.Target2, "ActionTarget2", C4ObjectPtr::Null ));
2212  pComp->Value(mkNamingAdapt( mkParAdapt(Contents, numbers), "Contents" ));
2213  pComp->Value(mkNamingAdapt( lightRange, "LightRange", 0 ));
2214  pComp->Value(mkNamingAdapt( lightFadeoutRange, "LightFadeoutRange", 0 ));
2215  pComp->Value(mkNamingAdapt( lightColor, "lightColor", 0xffffffffu ));
2216  pComp->Value(mkNamingAdapt( ColorMod, "ColorMod", 0xffffffffu ));
2217  pComp->Value(mkNamingAdapt( BlitMode, "BlitMode", 0u ));
2218  pComp->Value(mkNamingAdapt( CrewDisabled, "CrewDisabled", false ));
2219  pComp->Value(mkNamingAdapt( Layer, "Layer", C4ObjectPtr::Null ));
2220  pComp->Value(mkNamingAdapt( C4DefGraphicsAdapt(pGraphics), "Graphics", &Def->Graphics ));
2221  pComp->Value(mkNamingPtrAdapt( pDrawTransform, "DrawTransform" ));
2222  pComp->Value(mkParAdapt(mkNamingPtrAdapt( pEffects, "Effects" ), this, numbers));
2223  pComp->Value(mkNamingAdapt( C4GraphicsOverlayListAdapt(pGfxOverlay),"GfxOverlay", (C4GraphicsOverlay *)nullptr));
2224 
2225  // Serialize mesh instance if we have a mesh graphics
2227  {
2228  if(pComp->isDeserializer())
2229  {
2230  assert(!pMeshInstance);
2231  pMeshInstance = new StdMeshInstance(*pGraphics->Mesh, Def->GrowthType ? 1.0f : static_cast<float>(Con)/static_cast<float>(FullCon));
2232  }
2233 
2235 
2236  // Does not work because unanimated meshes without attached meshes
2237  // do not even write a [Mesh] header so this does not create a mesh instance in that case
2238 /* pComp->Value(mkNamingContextPtrAdapt( pMeshInstance, *pGraphics->Mesh, "Mesh"));
2239  if(!pMeshInstance)
2240  pComp->excCorrupt("Mesh graphics without mesh instance");*/
2241  }
2242 
2243  // TODO: Animations / attached meshes
2244 
2245  // Commands
2246  if (pComp->FollowName("Commands"))
2247  {
2248  if (deserializing)
2249  {
2250  C4Command *pCmd = nullptr;
2251  for (int i = 1; ; i++)
2252  {
2253  // Every command has its own naming environment
2254  StdStrBuf Naming = FormatString("Command%d", i);
2255  pComp->Value(mkParAdapt(mkNamingPtrAdapt(pCmd ? pCmd->Next : Command, Naming.getData()), numbers));
2256  // Last command?
2257  pCmd = (pCmd ? pCmd->Next : Command);
2258  if (!pCmd)
2259  break;
2260  pCmd->cObj = this;
2261  }
2262  }
2263  else
2264  {
2265  C4Command *pCmd = Command;
2266  for (int i = 1; pCmd; i++, pCmd = pCmd->Next)
2267  {
2268  StdStrBuf Naming = FormatString("Command%d", i);
2269  pComp->Value(mkNamingAdapt(mkParAdapt(*pCmd, numbers), Naming.getData()));
2270  }
2271  }
2272  }
2273 
2274  // Compiling? Do initialization.
2275  if (deserializing)
2276  {
2277  // add to def count
2278  Def->Count++;
2279 
2280 
2281  // Set action (override running data)
2282  /* FIXME
2283  int32_t iTime=Action.Time;
2284  int32_t iPhase=Action.Phase;
2285  int32_t iPhaseDelay=Action.PhaseDelay;
2286  if (SetActionByName(Action.pActionDef->GetName(),0,0,false))
2287  {
2288  Action.Time=iTime;
2289  Action.Phase=iPhase; // No checking for valid phase
2290  Action.PhaseDelay=iPhaseDelay;
2291  }*/
2292 
2293  if (pMeshInstance)
2294  {
2295  // Set Action animation by slot 0
2298  }
2299 
2300  // blit mode not assigned? use definition default then
2301  if (!BlitMode) BlitMode = Def->BlitMode;
2302 
2303  // object needs to be resorted? May happen if there's unsorted objects in savegame
2304  if (Unsorted) Game.fResortAnyObject = true;
2305  }
2306 
2307 }
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:2433
C4ObjectPtr Target2
Definition: C4Object.h:87
C4ObjectPtr Layer
Definition: C4Object.h:136
StdMeshInstanceAnimationNode * Animation
Definition: C4Object.h:90
C4ObjectInfo * Info
Definition: C4Object.h:145
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
bool Mobile
Definition: C4Object.h:128
const int32_t FullCon
Definition: C4Constants.h:181
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
int32_t Energy
Definition: C4Object.h:117
int32_t lightFadeoutRange
Definition: C4Object.h:123
static const C4ObjectPtr Null
Definition: C4ObjectPtr.h:28
bool InLiquid
Definition: C4Object.h:131
C4NotifyingObjectList Contents
Definition: C4Object.h: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:179
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:137
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:141
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:191
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:886
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 2918 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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

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:49
uint32_t t_contact
Definition: C4Object.h:133
bool ContactCheck(int32_t cx, int32_t cy, uint32_t *border_hack_contacts=nullptr, bool collide_halfvehic=false)
Definition: C4Shape.cpp:350
int32_t ContactCNAT
Definition: C4Shape.h:48
C4Shape Shape
Definition: C4Object.h:148
bool Contact(int32_t cnat)
Definition: C4Movement.cpp:114

Here is the call graph for this function:

Here is the caller graph for this function:

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:371
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 1437 of file C4Object.cpp.

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

Referenced by CreateContentsByList().

1438 {
1439  C4Object *nobj;
1440  if (!(nobj=Game.CreateObject(PropList,this,Owner))) return nullptr;
1441  if (!nobj->Enter(this)) { nobj->AssignRemoval(); return nullptr; }
1442  return nobj;
1443 }
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1261
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 1445 of file C4Object.cpp.

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

Referenced by C4Player::PlaceReadyMaterial().

1446 {
1447  int32_t cnt,cnt2;
1448  for (cnt=0; idlist.GetID(cnt); cnt++)
1449  for (cnt2=0; cnt2<idlist.GetCount(cnt); cnt2++)
1450  if (!CreateContents(C4Id2Def(idlist.GetID(cnt))))
1451  return false;
1452  return true;
1453 }
int32_t GetCount(size_t index) const
Definition: C4IDList.cpp:111
C4Object * CreateContents(C4PropList *)
Definition: C4Object.cpp:1437
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:177
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:137
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 2309 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().

2310 {
2311  C4PropList::Denumerate(numbers);
2312  // Standard enumerated pointers
2317 
2318  // Post-compile object list
2320 
2321  // Commands
2322  for (C4Command *pCom=Command; pCom; pCom=pCom->Next)
2323  pCom->Denumerate(numbers);
2324 
2325  // effects
2326  if (pEffects) pEffects->Denumerate(numbers);
2327 
2328  // gfx overlays
2329  if (pGfxOverlay)
2330  for (C4GraphicsOverlay *pGfxOvrl = pGfxOverlay; pGfxOvrl; pGfxOvrl = pGfxOvrl->GetNext())
2331  pGfxOvrl->DenumeratePointers();
2332 
2333  // mesh instance
2335 }
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:1672
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 4244 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().

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

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

Referenced by ExecLife().

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

1154 {
1155  C4Real strgt_con_b = fix_y + Shape.GetBottom();
1156  bool fWasFull = (Con>=FullCon);
1157  int32_t old_con = Con;
1158 
1159  // Change con
1160  if (Def->Oversize)
1161  Con=std::max<int32_t>(Con+iChange,0);
1162  else
1163  Con=Clamp<int32_t>(Con+iChange,0,FullCon);
1164 
1165  // Update OCF
1166  SetOCF();
1167 
1168  // Mass
1169  UpdateMass();
1170 
1171  // shape and position
1172  UpdateShape();
1173  // make the bottom-most vertex stay in place
1174  if (!grow_from_center)
1175  {
1176  fix_y = strgt_con_b - Shape.GetBottom();
1177  }
1178  // Face (except for the shape)
1179  UpdateFace(false);
1180 
1181  // Do a callback on completion change.
1182  if (iChange != 0)
1183  Call(PSF_OnCompletionChange, &C4AulParSet(old_con, Con));
1184 
1185  // Unfullcon
1186  if (fWasFull && (Con<FullCon))
1187  {
1188  // Lose contents
1189  if (!Def->IncompleteActivity)
1190  {
1191  C4Object *cobj;
1192  while ((cobj=Contents.GetObject()))
1193  if (Contained) cobj->Enter(Contained);
1194  else cobj->Exit(cobj->GetX(),cobj->GetY());
1195  SetAction(nullptr);
1196  }
1197  }
1198 
1199  // Completion
1200  if (!fWasFull && (Con>=FullCon))
1202 
1203  // Con Zero Removal
1204  if (Con<=0)
1205  AssignRemoval();
1206  // Mesh Graphics Update
1207  else if(pMeshInstance)
1208  pMeshInstance->SetCompletion(Def->GrowthType ? 1.0f : static_cast<float>(Con)/static_cast<float>(FullCon));
1209 }
int32_t GetY() const
Definition: C4Object.h:287
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1261
int GetBottom()
Definition: C4Shape.cpp:468
Definition: C4Real.h:58
const int32_t FullCon
Definition: C4Constants.h:181
#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:344
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:2682
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:1225
#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:640
int32_t Oversize
Definition: C4Def.h:129
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:379
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:668
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 1093 of file C4Object.cpp.

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

1094 {
1095  // non-living: ask effects first
1096  if (pEffects && !Alive)
1097  {
1098  pEffects->DoDamage(iChange, iCause, iCausedBy);
1099  if (!iChange) return;
1100  }
1101  // Change value
1102  Damage = std::max<int32_t>( Damage+iChange, 0 );
1103  // Engine script call
1104  Call(PSF_Damage,&C4AulParSet(iChange, iCause, iCausedBy));
1105 }
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 1107 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().

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

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

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

1212 {
1213  const int32_t MaxExperience = 100000000;
1214 
1215  if (!Info) return;
1216 
1217  Info->Experience=Clamp<int32_t>(Info->Experience+change,0,MaxExperience);
1218 
1219  // Promotion check
1220  if (Info->Experience<MaxExperience)
1222  Promote(Info->Rank+1, false, false);
1223 }
C4RankSystem DefaultRanks
bool Promote(int32_t torank, bool exception, bool fForceRankName)
Definition: C4Object.cpp:1713
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:63
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:2675
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:181
void UpdatePos()
Definition: C4Object.cpp:371
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:344
#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:2918
void NoAttachAction()
Definition: C4Object.cpp:2883
int32_t Con
Definition: C4Object.h:173
int32_t GetX() const
Definition: C4Shape.h:62
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:379
bool IsInLiquidCheck() const
Definition: C4Object.cpp:4102
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:110
#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:886
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:4142
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:109
bool Attach(int32_t &cx, int32_t &cy, BYTE cnat_pos)
Definition: C4Shape.cpp:183
C4Real ydir
Definition: C4Object.h:126
void DoMotion(int32_t mx, int32_t my)
Definition: C4Movement.cpp:123
const C4Real Fix0
Definition: C4Real.h:312
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:110

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::DoSelect ( )

Definition at line 4310 of file C4Object.cpp.

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

Referenced by C4Player::SetCursor().

4311 {
4312  // selection allowed?
4313  if (CrewDisabled) return false;
4314  // do callback
4316  // done
4317  return true;
4318 }
#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 1786 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().

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