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 ()
 
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 *)
 
virtual void Denumerate (C4ValueNumbers *)
 
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=0, 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=0)
 
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)
 
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 ()
 
virtual C4ObjectGetObject ()
 
virtual C4Object const * GetObject () const
 
virtual void SetPropertyByS (C4String *k, const C4Value &to)
 
virtual void ResetProperty (C4String *k)
 
virtual bool GetPropertyByS (const C4String *k, C4Value *pResult) const
 
virtual C4ValueArrayGetProperties () const
 
virtual C4PropListNumberedGetPropListNumbered ()
 
virtual bool IsNumbered () const
 
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=0) const
 
C4Value Call (C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
 
C4Value Call (C4String *k, C4AulParSet *pPars=0, bool fPassErrors=false)
 
C4Value Call (const char *k, C4AulParSet *pPars=0, 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=0)
 
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
 
int32_t Status
 

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

References BackParticles, Default(), and FrontParticles.

89 {
91  Default();
92 }
class C4ParticleList * BackParticles
Definition: C4Object.h:158
void Default()
Definition: C4Object.cpp:94
class C4ParticleList * FrontParticles
Definition: C4Object.h:158

Here is the call graph for this function:

C4Object::~C4Object ( )

Definition at line 238 of file C4Object.cpp.

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

239 {
240  Clear();
241 
242 #if defined(_DEBUG)
243  // debug: mustn't be listed in any list now
245 #endif
246 }
void Clear()
Definition: C4Object.cpp:2439
void AssertObjectNotInList(C4Object *pObj)
Definition: C4Sector.cpp:187
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:238
static int32_t EnumerationIndex
Definition: C4PropList.h:240

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

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

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

1356 {
1357 
1358  // Try entrance activation
1359  if (OCF & OCF_Entrance)
1360  if (!! Call(PSF_ActivateEntrance,&C4AulParSet(by_obj)))
1361  return true;
1362  // Failure
1363  return false;
1364 }
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=0, bool fPassErrors=false)
Definition: C4PropList.h:112

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

1486 {
1487  // Variables
1488  C4FacetSurface fctSymbol;
1489  C4IDList ListItems;
1490  // Close any other menu
1491  if (Menu && Menu->IsActive()) if (!Menu->TryClose(true, false)) return false;
1492  // Create menu
1493  if (!Menu) Menu = new C4ObjectMenu; else Menu->ClearItems();
1494  // Open menu
1495  switch (iMenu)
1496  {
1497  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1498  case C4MN_Activate:
1499  // No target specified: use own container as target
1500  if (!pTarget) if (!(pTarget=Contained)) break;
1501  // Opening contents menu blocked by RejectContents
1502  if (!!pTarget->Call(PSF_RejectContents)) return false;
1503  // Create symbol
1504  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1505  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1506  // Init
1507  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1508  Menu->SetPermanent(true);
1509  Menu->SetRefillObject(pTarget);
1510  // Success
1511  return true;
1512  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1513  case C4MN_Buy:
1514  // No target specified: container is base
1515  if (!pTarget) if (!(pTarget=Contained)) break;
1516  // Create symbol
1517  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1518  DrawMenuSymbol(C4MN_Buy, fctSymbol, pTarget->Owner);
1519  // Init menu
1520  Menu->Init(fctSymbol,LoadResStr("IDS_PLR_NOBUY"),this,C4MN_Extra_Value,0,iMenu);
1521  Menu->SetPermanent(true);
1522  Menu->SetRefillObject(pTarget);
1523  // Success
1524  return true;
1525  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1526  case C4MN_Sell:
1527  // No target specified: container is base
1528  if (!pTarget) if (!(pTarget=Contained)) break;
1529  // Create symbol & init
1530  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1531  DrawMenuSymbol(C4MN_Sell, fctSymbol, pTarget->Owner);
1532  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_Value,0,iMenu);
1533  Menu->SetPermanent(true);
1534  Menu->SetRefillObject(pTarget);
1535  // Success
1536  return true;
1537  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1538  case C4MN_Get:
1539  case C4MN_Contents:
1540  // No target specified
1541  if (!pTarget) break;
1542  // Opening contents menu blocked by RejectContents
1543  if (!!pTarget->Call(PSF_RejectContents)) return false;
1544  // Create symbol & init
1545  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
1546  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
1547  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
1548  Menu->SetPermanent(true);
1549  Menu->SetRefillObject(pTarget);
1550  // Success
1551  return true;
1552  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1553  case C4MN_Info:
1554  // Target by parameter
1555  if (!pTarget) break;
1556  // Create symbol & init menu
1557  fctSymbol.Create(C4SymbolSize, C4SymbolSize); GfxR->fctOKCancel.Draw(fctSymbol,true,0,1);
1558  Menu->Init(fctSymbol, pTarget->GetName(), this, C4MN_Extra_None, 0, iMenu, C4MN_Style_Info);
1559  Menu->SetPermanent(true);
1561  C4Viewport *pViewport = ::Viewports.GetViewport(Controller); // Hackhackhack!!!
1562  if (pViewport) Menu->SetLocation((pTarget->GetX() + pTarget->Shape.GetX() + pTarget->Shape.Wdt + 10 - pViewport->GetViewX()) * pViewport->GetZoom(),
1563  (pTarget->GetY() + pTarget->Shape.GetY() - pViewport->GetViewY()) * pViewport->GetZoom());
1564  // Add info item
1565  fctSymbol.Create(C4PictureSize, C4PictureSize); pTarget->Def->Draw(fctSymbol, false, pTarget->Color, pTarget);
1566  Menu->Add(pTarget->GetName(), fctSymbol, "", C4MN_Item_NoCount, nullptr, pTarget->GetInfoString().getData());
1567  fctSymbol.Default();
1568  // Success
1569  return true;
1570  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1571  }
1572  // Invalid menu identification
1573  CloseMenu(true);
1574  return false;
1575 }
const char * getData() const
Definition: StdBuf.h:450
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:351
#define GfxR
void SetAlignment(int32_t iAlignment)
Definition: C4Menu.cpp:858
int32_t GetY() const
Definition: C4Shape.h:64
bool Init(C4FacetSurface &fctSymbol, const char *szEmpty, C4Object *pObject, int32_t iExtra=C4MN_Extra_None, int32_t iExtraData=0, int32_t iId=0, int32_t iStyle=C4MN_Style_Normal, bool fUserMenu=false)
C4Viewport * GetViewport(int32_t iPlayer, C4Viewport *pPrev=nullptr)
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
void Default()
Definition: C4FacetEx.h:43
int32_t Wdt
Definition: C4Rect.h:32
class C4ObjectMenu * Menu
Definition: C4Object.h:140
bool CloseMenu(bool fForce)
Definition: C4Object.cpp:1577
C4Def * Def
Definition: C4Object.h:143
bool SetLocation(int32_t iX, int32_t iY)
Definition: C4Menu.cpp:952
void ClearItems()
Definition: C4Menu.cpp:896
virtual const char * GetName() const
Definition: C4PropList.cpp:626
int32_t Owner
Definition: C4Object.h:110
int32_t GetX() const
Definition: C4Shape.h:63
uint32_t Color
Definition: C4Object.h:120
void Draw(C4Facet &cgo, bool fSelected=false, DWORD iColor=0, C4Object *pObj=nullptr, int32_t iPhaseX=0, int32_t iPhaseY=0, C4DrawTransform *trans=nullptr, const char *graphicsName=nullptr)
Definition: C4Def.cpp:601
int32_t GetX() const
Definition: C4Object.h:286
bool IsActive()
Definition: C4Menu.cpp:481
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:281
#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:4720
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:863
void SetRefillObject(C4Object *pObj)
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Shape Shape
Definition: C4Object.h:148
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112
float GetViewX()
Definition: C4Viewport.h:73
int32_t Controller
Definition: C4Object.h:111
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:277

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

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

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

Here is the call graph for this function:

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

Definition at line 4305 of file C4Object.cpp.

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

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

4306 {
4307  // add self, contents and child contents count recursively to value array. Return index after last added item.
4308  target_array->SetItem(index++, C4VObj(this));
4309  for (C4Object *cobj : Contents)
4310  {
4311  index = cobj->AddObjectAndContentsToArray(target_array, index);
4312  }
4313  return index;
4314 }
void SetItem(int32_t iElemNr, const C4Value &Value)
C4Value C4VObj(C4Object *pObj)
Definition: C4Value.cpp:90
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:32
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 4593 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().

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

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 519 of file C4PropList.cpp.

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

Referenced by C4Value::GetDataString(), and GetDataString().

520 {
521  StdStrBuf & DataString = *out;
522  if (depth <= 0 && Properties.GetSize())
523  {
524  DataString.Append("...");
525  return;
526  }
527  std::list<const C4Property *> sorted_props = Properties.GetSortedListOfElementPointers();
528  for (std::list<const C4Property *>::const_iterator p = sorted_props.begin(); p != sorted_props.end(); ++p)
529  {
530  if (p != sorted_props.begin()) DataString.Append(delim);
531  DataString.Append((*p)->Key->GetData());
532  DataString.Append(" = ");
533  DataString.Append((*p)->Value.GetDataString(depth - 1, ignore_reference_parent ? IsStatic() : nullptr));
534  }
535 }
std::list< const T * > GetSortedListOfElementPointers() const
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:87
unsigned int GetSize() const
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:527

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::AssignDeath ( bool  fForced)

Definition at line 996 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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::AssignInfo ( )

Definition at line 2393 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().

2394 {
2395  if (Info || !ValidPlr(Owner)) return false;
2396  // In crew list?
2397  C4Player *pPlr = ::Players.Get(Owner);
2398  if (pPlr->Crew.GetLink(this))
2399  {
2400  // Register with player
2401  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2402  pPlr->Crew.Remove(this);
2403  return true;
2404  }
2405  // Info set, but not in crew list, so
2406  // a) The savegame is old-style (without crew list)
2407  // or b) The clonk is dead
2408  // or c) The clonk belongs to a script player that's restored without Game.txt
2409  else if (nInfo.getLength())
2410  {
2411  if (!::Players.Get(Owner)->MakeCrewMember(this, true, false))
2412  return false;
2413  // Dead and gone (info flags, remove from crew/cursor)
2414  if (!Alive)
2415  {
2416  if (ValidPlr(Owner)) ::Players.Get(Owner)->ClearPointers(this, true);
2417  }
2418  return true;
2419  }
2420  return false;
2421 }
bool MakeCrewMember(C4Object *pObj, bool fForceInfo=true, bool fDoCalls=true)
Definition: C4Player.cpp:1010
bool Alive
Definition: C4Object.h:175
void ClearPointers(C4Object *tptr, bool fDeath)
Definition: C4Player.cpp:100
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:127
StdCopyStrBuf nInfo
Definition: C4Object.h:168
int32_t ValidPlr(int32_t plr)
size_t getLength() const
Definition: StdBuf.h:453
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 2423 of file C4Object.cpp.

References lightFadeoutRange, lightRange, and UpdateLight().

2424 {
2425  if (!lightRange && !lightFadeoutRange) return true;
2426 
2427  UpdateLight();
2428  return true;
2429 }
int32_t lightFadeoutRange
Definition: C4Object.h:123
int32_t lightRange
Definition: C4Object.h:122
void UpdateLight()
Definition: C4Object.cpp:4035

Here is the call graph for this function:

void C4Object::AssignRemoval ( bool  fExitContents = false)

Definition at line 257 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().

258 {
259  // check status
260  if (!Status) return;
261  if (Config.General.DebugRec)
262  {
263  C4RCCreateObj rc;
264  memset(&rc, '\0', sizeof(rc));
265  rc.oei=Number;
266  if (Def && Def->GetName()) strncpy(rc.id, Def->GetName(), 32+1);
267  rc.x=GetX(); rc.y=GetY(); rc.ownr=Owner;
268  AddDbgRec(RCT_DsObj, &rc, sizeof(rc));
269  }
270  // Destruction call in container
271  if (Contained)
272  {
273  C4AulParSet pars(this);
275  if (!Status) return;
276  }
277  // Destruction call
279  // Destruction-callback might have deleted the object already
280  if (!Status) return;
281  // remove all effects (extinguishes as well)
282  if (pEffects)
283  {
285  // Effect-callback might actually have deleted the object already
286  if (!Status) return;
287  }
288  // remove particles
290  // Action idle
291  SetAction(0);
292  // Object system operation
293  if (Status == C4OS_INACTIVE)
294  {
295  // object was inactive: activate first, then delete
298  ::Objects.Add(this);
299  }
300  Status=0;
301  // count decrease
302  Def->Count--;
303 
304  // get container for next actions
305  C4Object *pCont = Contained;
306  // remove or exit contents
307  for (C4Object *cobj : Contents)
308  {
309  if (fExitContents)
310  {
311  // move objects to parent container or exit them completely
312  if (!pCont || !cobj->Enter(pCont, false))
313  cobj->Exit(GetX(), GetY());
314  }
315  else
316  {
317  Contents.Remove(cobj);
318  cobj->Contained = nullptr;
319  cobj->AssignRemoval();
320  }
321  }
322  // remove this object from container *after* its contents have been removed!
323  if (pCont)
324  {
325  pCont->Contents.Remove(this);
326  pCont->UpdateMass();
327  pCont->SetOCF();
328  Contained=nullptr;
329  }
330  // Object info
331  if (Info) Info->Retire();
332  Info = nullptr;
333  // Object system operation
334  ClearRefs();
335  Game.ClearPointers(this);
336  ClearCommands();
337  if (pSolidMaskData)
338  {
339  delete pSolidMaskData;
340  pSolidMaskData = nullptr;
341  }
342  SolidMask.Wdt = 0;
343  RemovalDelay=2;
344 }
int32_t GetY() const
Definition: C4Object.h:287
void ClearAll(int32_t iClearFlag)
Definition: C4Effect.cpp:369
C4Config Config
Definition: C4Config.cpp:837
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1267
virtual const char * GetName() const
Definition: C4PropList.cpp:267
bool Add(C4Object *nObj)
C4Game Game
Definition: C4Globals.cpp:52
C4ConfigGeneral General
Definition: C4Config.h:252
#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:248
C4ObjectInfo * Info
Definition: C4Object.h:145
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
int32_t Wdt
Definition: C4Rect.h:32
C4NotifyingObjectList Contents
Definition: C4Object.h:152
C4Def * Def
Definition: C4Object.h:143
int32_t Count
Definition: C4Def.h:182
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:2688
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:1231
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:36
#define PSF_ContentsDestruction
Definition: C4GameScript.h:39
int32_t Status
Definition: C4PropList.h:170
void UpdateMass()
Definition: C4Object.cpp:642
void ClearCommands()
Definition: C4Object.cpp:2538
#define C4OS_INACTIVE
Definition: C4Object.h:36
void ClearPointers(C4Object *cobj)
Definition: C4Game.cpp:925
int32_t DebugRec
Definition: C4Config.h:61
C4Effect * pEffects
Definition: C4Object.h:156
#define PSF_Destruction
Definition: C4GameScript.h:38
void SetOCF()
Definition: C4Object.cpp:670
C4ObjectPtr Contained
Definition: C4Object.h:144
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112
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:158

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

958 {
959  if (Status) if (!Contained) if (Def)
960  if (Inside<int32_t>(cty - (GetY() + Shape.GetY() - addtop()), 0, Shape.Hgt - 1 + addtop()))
961  if (Inside<int32_t>(ctx - (GetX() + Shape.GetX()), 0, Shape.Wdt - 1))
962  return true;
963  return false;
964 }
int32_t GetY() const
Definition: C4Object.h:287
int32_t GetY() const
Definition: C4Shape.h:64
int32_t Wdt
Definition: C4Rect.h:32
C4Def * Def
Definition: C4Object.h:143
int32_t GetX() const
Definition: C4Shape.h:63
int32_t GetX() const
Definition: C4Object.h:286
int32_t Status
Definition: C4PropList.h:170
C4ObjectPtr Contained
Definition: C4Object.h:144
int32_t Hgt
Definition: C4Rect.h:32
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 966 of file C4Object.cpp.

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

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

985 {
987 
988  if (GetPrototype())
989  {
990  iter = GetPrototype()->begin();
991  }
992  else
993  {
994  iter.properties = std::make_shared<std::vector<const C4Property*> >();
995  }
996  iter.Reserve(Properties.GetSize());
997 
998  const C4Property * p = Properties.First();
999  while (p)
1000  {
1001  iter.AddProperty(p);
1002  p = Properties.Next(p);
1003  }
1004 
1005  iter.Init();
1006  return iter;
1007 }
T const * Next(T const *p) const
unsigned int GetSize() const
Iterator begin()
Definition: C4PropList.cpp:984
C4PropList * GetPrototype() const
Definition: C4PropList.h:83
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:157
void VerticalBounds(C4Real &ctcoy)
Definition: C4Movement.cpp:180

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 112 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().

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

Here is the caller graph for this function:

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

Definition at line 805 of file C4PropList.cpp.

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

806 {
807  if (!Status) return C4Value();
808  C4AulFunc *pFn = GetFunc(k);
809  if (!pFn) return C4Value();
810  return pFn->Exec(this, Pars, fPassErrors);
811 }
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:107
friend class C4Value
Definition: C4PropList.h:167
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:73
int32_t Status
Definition: C4PropList.h:170

Here is the call graph for this function:

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

Definition at line 813 of file C4PropList.cpp.

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

814 {
815  if (!Status) return C4Value();
816  assert(s && s[0]);
817  C4AulFunc *pFn = GetFunc(s);
818  if (!pFn)
819  {
820  if (s[0] != '~')
821  {
822  C4AulExecError err(FormatString("Undefined function: %s", s).getData());
823  if (fPassErrors)
824  throw err;
825  ::ScriptEngine.GetErrorHandler()->OnError(err.what());
826  }
827  return C4Value();
828  }
829  return pFn->Exec(this, Pars, fPassErrors);
830 }
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:175
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:107
friend class C4Value
Definition: C4PropList.h:167
C4Value Exec(C4PropList *p=nullptr, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4AulFunc.h:73
int32_t Status
Definition: C4PropList.h:170
virtual void OnError(const char *msg)=0
#define s
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:277

Here is the call graph for this function:

bool C4Object::CanConcatPictureWith ( C4Object pOtherObject) const

Definition at line 4758 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().

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

1048 {
1049  // Get new definition
1050  C4Def *pDef=C4Id2Def(idNew);
1051  if (!pDef) return false;
1052  // Containment storage
1053  C4Object *pContainer=Contained;
1054  // Exit container (no Ejection/Departure)
1055  if (Contained) Exit(0,0,0,Fix0,Fix0,Fix0,false);
1056  // Pre change resets
1057  SetAction(0);
1058  ResetProperty(&Strings.P[P_Action]); // Enforce ActIdle because SetAction may have failed due to NoOtherAction
1059  SetDir(0); // will drop any outdated flipdir
1060  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
1061  Def->Count--;
1062  // Def change
1063  Def=pDef;
1065  id=pDef->id;
1066  Def->Count++;
1067  // new def: Needs to be resorted
1068  Unsorted=true;
1069  // graphics change
1070  pGraphics = &pDef->Graphics;
1071  // blit mode adjustment
1073  // an object may have newly become an ColorByOwner-object
1074  // if it had been ColorByOwner, but is not now, this will be caught in UpdateGraphics()
1075  if (!Color && ValidPlr(Owner))
1077  if (!Def->Rotateable) { fix_r=rdir=Fix0; }
1078  // Reset solid mask
1080  // Post change updates
1081  UpdateGraphics(true);
1082  UpdateMass();
1083  UpdateFace(true);
1084  SetOCF();
1085  // Any effect callbacks to this object might need to reinitialize their target functions
1086  // This is ugly, because every effect there is must be updated...
1091  for (C4Object *obj : Objects)
1092  if (obj->pEffects) obj->pEffects->OnObjectChangedDef(this);
1093  // Containment (no Entrance)
1094  if (pContainer) Enter(pContainer,false);
1095  // Done
1096  return true;
1097 }
C4String P[P_LAST]
C4ID id
Definition: C4Def.h:103
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1267
C4GameScriptHost GameScript
void SetDir(int32_t tdir)
Definition: C4Object.cpp:2847
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
C4Real rdir
Definition: C4Object.h:126
void SetProperty(C4PropertyName k, const C4Value &to)
Definition: C4PropList.h:122
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:407
uint32_t ColorDw
Definition: C4Player.h:91
int32_t Rotateable
Definition: C4Def.h:121
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:182
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:2688
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:1231
uint32_t Color
Definition: C4Object.h:120
Definition: C4Def.h:100
C4DefGraphics * pGraphics
Definition: C4Object.h:154
void UpdateMass()
Definition: C4Object.cpp:642
C4TargetRect SolidMask
Definition: C4Def.h:110
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:381
bool Unsorted
Definition: C4Object.h:129
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:80
#define C4GFXBLIT_CUSTOM
Definition: C4Surface.h:37
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:144
uint32_t BlitMode
Definition: C4Object.h:162
void SetOCF()
Definition: C4Object.cpp:670
C4ObjectPtr Contained
Definition: C4Object.h:144
C4TargetRect SolidMask
Definition: C4Object.h:150
C4SolidMask * pSolidMaskData
Definition: C4Object.h:176
virtual void ResetProperty(C4String *k)
Definition: C4Object.cpp:4866
C4DefGraphics Graphics
Definition: C4Def.h:194
C4Effect * pGlobalEffects
Definition: C4Aul.h:146
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:238
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 2481 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().

2482 {
2483  // Ensure SolidMask rect lies within bounds of SolidMask bitmap in definition
2484  CSurface8 *sfcGraphics = Def->pSolidMask;
2485  if (!sfcGraphics)
2486  {
2487  // no graphics to set solid in
2488  SolidMask.Set(0,0,0,0,0,0);
2489  return false;
2490  }
2491  SolidMask.Set(std::max<int32_t>(SolidMask.x,0), std::max<int32_t>(SolidMask.y,0),
2492  std::min<int32_t>(SolidMask.Wdt,sfcGraphics->Wdt-SolidMask.x), std::min<int32_t>(SolidMask.Hgt, sfcGraphics->Hgt-SolidMask.y),
2494  if (SolidMask.Hgt<=0) SolidMask.Wdt=0;
2495  return SolidMask.Wdt>0;
2496 }
int Hgt
Definition: CSurface8.h:28
CSurface8 * pSolidMask
Definition: C4Def.h:195
int32_t Wdt
Definition: C4Rect.h:32
C4Def * Def
Definition: C4Object.h:143
int32_t y
Definition: C4Rect.h:32
int32_t tx
Definition: C4Rect.h:81
int32_t ty
Definition: C4Rect.h:81
int32_t x
Definition: C4Rect.h:32
int Wdt
Definition: CSurface8.h:28
int32_t Hgt
Definition: C4Rect.h:32
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 2439 of file C4Object.cpp.

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

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

2440 {
2442 
2443  if (pEffects) { delete pEffects; pEffects=nullptr; }
2444  if (pSolidMaskData) { delete pSolidMaskData; pSolidMaskData=nullptr; }
2445  if (Menu) delete Menu; Menu=nullptr;
2446  if (MaterialContents) delete MaterialContents; MaterialContents=nullptr;
2447  // clear commands!
2448  C4Command *pCom, *pNext;
2449  for (pCom=Command; pCom; pCom=pNext)
2450  {
2451  pNext=pCom->Next; delete pCom; pCom=pNext;
2452  }
2453  if (pDrawTransform) { delete pDrawTransform; pDrawTransform=nullptr; }
2454  if (pGfxOverlay) { delete pGfxOverlay; pGfxOverlay=nullptr; }
2455  if (pMeshInstance) { delete pMeshInstance; pMeshInstance = nullptr; }
2456 }
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:248
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 2552 of file C4Object.cpp.

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

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

2553 {
2554  C4Command *pCom,*pNext;
2555  for (pCom=Command; pCom; pCom=pNext)
2556  {
2557  // Last one to clear
2558  if (pCom==pUntil) pNext=nullptr;
2559  // Next one to clear after this
2560  else pNext=pCom->Next;
2561  Command=pCom->Next;
2562  if (!pCom->iExec)
2563  delete pCom;
2564  else
2565  pCom->iExec = 2;
2566  }
2567 }
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 2538 of file C4Object.cpp.

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

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

2539 {
2540  C4Command *pNext;
2541  while (Command)
2542  {
2543  pNext=Command->Next;
2544  if (!Command->iExec)
2545  delete Command;
2546  else
2547  Command->iExec = 2;
2548  Command=pNext;
2549  }
2550 }
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 4582 of file C4Object.cpp.

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

Referenced by StatusDeactivate().

4583 {
4584  // exit contents from container
4585  for (C4Object *cobj : Contents)
4586  {
4587  cobj->Exit(GetX(), GetY(), 0,Fix0,Fix0,Fix0, fDoCalls);
4588  }
4589  // remove from container *after* contents have been removed!
4590  if (Contained) Exit(GetX(), GetY(), 0, Fix0, Fix0, Fix0, fDoCalls);
4591 }
int32_t 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:1231
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 2431 of file C4Object.cpp.

References Info.

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

2432 {
2433  if (Info==pInfo)
2434  {
2435  Info=nullptr;
2436  }
2437 }
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:238

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:68
T const * Next(T const *p) const
static C4Set< C4PropListNumbered * > PropLists
Definition: C4PropList.h:238
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 248 of file C4Object.cpp.

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

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

249 {
250  if (FrontParticles != 0)
252  if (BackParticles != 0)
255 }
C4ParticleSystem Particles
class C4ParticleList * BackParticles
Definition: C4Object.h:158
void ReleaseParticleList(C4ParticleList *first, C4ParticleList *second=0)
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 1742 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().

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

References C4Value::Set0().

Referenced by AssignRemoval().

158 { 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:239

Here is the caller graph for this function:

bool C4Object::CloseMenu ( bool  fForce)

Definition at line 1577 of file C4Object.cpp.

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

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

1578 {
1579  if (Menu)
1580  {
1581  if (Menu->IsActive()) if (!Menu->TryClose(fForce, false)) return false;
1582  if (!Menu->IsCloseQuerying()) { delete Menu; Menu=nullptr; } // protect menu deletion from recursive menu operation calls
1583  }
1584  return true;
1585 }
class C4ObjectMenu * Menu
Definition: C4Object.h:140
bool IsActive()
Definition: C4Menu.cpp:481
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:281
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 4174 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().

4175 {
4176  // Object enter container
4177  bool fRejectCollect;
4178  if (!pObj->Enter(this, true, false, &fRejectCollect))
4179  return false;
4180  // Cancel attach (hacky)
4181  ObjectComCancelAttach(pObj);
4182  // Container Collection call
4184  // Object Hit call
4185  if (pObj->Status && pObj->OCF & OCF_HitSpeed1) pObj->Call(PSF_Hit);
4186  if (pObj->Status && pObj->OCF & OCF_HitSpeed2) pObj->Call(PSF_Hit2);
4187  if (pObj->Status && pObj->OCF & OCF_HitSpeed3) pObj->Call(PSF_Hit3);
4188  // post-copy the motion of the new container
4189  if (pObj->Contained == this) pObj->CopyMotion(this);
4190  // done, success
4191  return true;
4192 }
const uint32_t OCF_HitSpeed1
Definition: C4Constants.h:84
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
Definition: C4Object.cpp:1267
#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:170
void CopyMotion(C4Object *from)
Definition: C4Movement.cpp:504
#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=0, bool fPassErrors=false)
Definition: C4PropList.h:112

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 2165 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.

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

Here is the call graph for this function:

bool C4Object::Contact ( int32_t  cnat)

Definition at line 115 of file C4Movement.cpp.

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

Referenced by ContactCheck(), and StopAndContact().

116 {
118  {
119  return !! Call(FormatString(PSF_Contact, CNATName(iCNAT)).getData());
120  }
121  return false;
122 }
const char * CNATName(int32_t cnat)
Definition: C4Movement.cpp:101
#define PSF_Contact
Definition: C4GameScript.h:69
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:863
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:277

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::ContactAction ( )

Definition at line 2924 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().

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

Definition at line 137 of file C4Movement.cpp.

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

Referenced by DoMovement(), Lift(), Push(), and Stabilize().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4Object::CopyMotion ( C4Object from)

Definition at line 504 of file C4Movement.cpp.

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

Referenced by Collect(), Enter(), and ExecMovement().

505 {
506  // Designed for contained objects, no static
507  if (fix_x != from->fix_x || fix_y != from->fix_y)
508  {
509  fix_x=from->fix_x; fix_y=from->fix_y;
510  // Resort into sectors
511  UpdatePos();
512  }
513  xdir=from->xdir; ydir=from->ydir;
514 }
void UpdatePos()
Definition: C4Object.cpp:373
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 1443 of file C4Object.cpp.

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

Referenced by CreateContentsByList().

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::CreateContentsByList ( C4IDList idlist)

Definition at line 1451 of file C4Object.cpp.

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

Referenced by C4Player::PlaceReadyMaterial().

1452 {
1453  int32_t cnt,cnt2;
1454  for (cnt=0; idlist.GetID(cnt); cnt++)
1455  for (cnt2=0; cnt2<idlist.GetCount(cnt); cnt2++)
1456  if (!CreateContents(C4Id2Def(idlist.GetID(cnt))))
1457  return false;
1458  return true;
1459 }
int32_t GetCount(size_t index) const
Definition: C4IDList.cpp:111
C4Object * CreateContents(C4PropList *)
Definition: C4Object.cpp:1443
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:80
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 94 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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

virtual bool C4PropList::Delete ( )
inlinevirtualinherited

Reimplemented in C4PropListStaticMember, C4PropListStatic, C4PropListScript, and C4Def.

Definition at line 92 of file C4PropList.h.

Referenced by C4ScriptHost::DeleteOwnedPropLists().

92 { return false; }

Here is the caller graph for this function:

void C4Object::Denumerate ( C4ValueNumbers numbers)
virtual

Reimplemented from C4PropList.

Definition at line 2315 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().

2316 {
2317  C4PropList::Denumerate(numbers);
2318  // Standard enumerated pointers
2323 
2324  // Post-compile object list
2326 
2327  // Commands
2328  for (C4Command *pCom=Command; pCom; pCom=pCom->Next)
2329  pCom->Denumerate(numbers);
2330 
2331  // effects
2332  if (pEffects) pEffects->Denumerate(numbers);
2333 
2334  // gfx overlays
2335  if (pGfxOverlay)
2336  for (C4GraphicsOverlay *pGfxOvrl = pGfxOverlay; pGfxOvrl; pGfxOvrl = pGfxOvrl->GetNext())
2337  pGfxOvrl->DenumeratePointers();
2338 
2339  // mesh instance
2341 }
bool DenumeratePointers()
C4Command * Next
Definition: C4Command.h:90
C4Command * Command
Definition: C4Object.h:166
C4ObjectPtr Target2
Definition: C4Object.h:87
C4ObjectPtr Layer
Definition: C4Object.h:136
void DenumeratePointers()
Definition: C4ObjectPtr.cpp:46
virtual void Denumerate(C4ValueNumbers *)
Definition: C4PropList.cpp:351
C4NotifyingObjectList Contents
Definition: C4Object.h:152
void DenumeratePointers()
Definition: StdMesh.cpp:1685
class C4GraphicsOverlay * pGfxOverlay
Definition: C4Object.h:170
C4ObjectPtr Target
Definition: C4Object.h:87
void Denumerate(C4ValueNumbers *)
Definition: C4Effect.cpp:176
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 4250 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().

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

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

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

Referenced by ExecLife().

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

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

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

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

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

1100 {
1101  // non-living: ask effects first
1102  if (pEffects && !Alive)
1103  {
1104  pEffects->DoDamage(iChange, iCause, iCausedBy);
1105  if (!iChange) return;
1106  }
1107  // Change value
1108  Damage = std::max<int32_t>( Damage+iChange, 0 );
1109  // Engine script call
1110  Call(PSF_Damage,&C4AulParSet(iChange, iCause, iCausedBy));
1111 }
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
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112
void DoDamage(int32_t &riDamage, int32_t iDamageType, int32_t iCausePlr)
Definition: C4Effect.cpp:394

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

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

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

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

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

1218 {
1219  const int32_t MaxExperience = 100000000;
1220 
1221  if (!Info) return;
1222 
1223  Info->Experience=Clamp<int32_t>(Info->Experience+change,0,MaxExperience);
1224 
1225  // Promotion check
1226  if (Info->Experience<MaxExperience)
1228  Promote(Info->Rank+1, false, false);
1229 }
C4RankSystem DefaultRanks
bool Promote(int32_t torank, bool exception, bool fForceRankName)
Definition: C4Object.cpp:1719
C4ObjectInfo * Info
Definition: C4Object.h:145
int32_t Experience
Definition: C4InfoCore.h:44
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 124 of file C4Movement.cpp.

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

Referenced by DoMovement().

125 {
127  fix_x += mx; fix_y += my;
128 }
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 203 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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4Object::DoSelect ( )

Definition at line 4316 of file C4Object.cpp.

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

Referenced by C4Player::SetCursor().

4317 {
4318  // selection allowed?
4319  if (CrewDisabled) return false;
4320  // do callback
4322  // done
4323  return true;
4324 }
#define PSF_CrewSelection
Definition: C4GameScript.h:86
bool CrewDisabled
Definition: C4Object.h:163
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112

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

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