116 for (
C4Object* ball : *in_goal_area)
121 && (ball->OCF & ball_required_ocf)
124 && Inside<int32_t>(ball->GetX() - (goal->
GetX() + goal->
Shape.
x), 0, goal->
Shape.
Wdt - 1)
125 && Inside<int32_t>(ball->GetY() - (goal->
GetY() + goal->
Shape.
y), 0, goal->
Shape.
Hgt - 1))
128 if (ball->Marker == Marker)
132 ball->Marker = Marker;
142 C4Real relative_xdir = ball->xdir - goal->
xdir;
143 C4Real relative_ydir = ball->ydir - goal->
ydir;
144 C4Real hit_speed = relative_xdir * relative_xdir + relative_ydir * relative_ydir;
148 int32_t hit_energy =
fixtoi(hit_speed * ball->Mass / 5);
154 hit_energy = std::max(hit_energy / 3, 1);
158 int32_t damage = -hit_energy / 5;
164 int goal_mass = std::max<int32_t>(goal->
Mass, min_mass);
168 goal->
Fling(ball->xdir * min_mass / goal_mass, -
Abs(ball->ydir / 2) * min_mass / goal_mass,
false);
175 goto check_next_goal;
200 goto check_next_goal;
226 return object->GetObject();
234 if (
object && !object->
Status)
247 object->UpdateSolidMask(
false);
257 if (delete_inactive_objects)
266 if (clear_inactive_objects)
276 int32_t max_object_number = 0;
280 max_object_number = std::max(max_object_number, object->Number);
295 if (keep_inactive_objects)
305 if (keep_inactive_objects)
308 inactiveObjectsCopy.
Clear();
322 object->xdir =
object->ydir = 0;
334 auto contents_iterator =
object->Contents.begin();
335 while (!contents_iterator.atEnd())
337 C4Object* contained_object = *contents_iterator;
340 if (contents_iterator2.find(contained_object) && contents_iterator2 != contents_iterator)
342 DebugLogF(
"Error in Objects.txt: Double containment of #%d by #%d!", contained_object->
Number, object->
Number);
344 object->Contents.Remove(contained_object);
351 DebugLogF(
"Error in Objects.txt: Object #%d not in container #%d as referenced!", contained_object->
Number, object->
Number);
387 object->UpdateLight();
390 object->UpdateFlipDir();
419 C4Value vResult =
object->Call(function_name, parameters, pass_error);
421 if (reject_test && !!vResult)
448 while (pLnk0 != pLnkL)
456 int lastPlane = 2147483647;
457 for (pLnk = pLnk0; pLnk != pLnkL->
Next; pLnk = pLnk->
Next)
464 int currentPlane = pObj->
GetPlane();
468 DebugLogF(
"Objects.txt: Object #%d has zero Plane!", (
int) pObj->
Number);
469 pObj->
SetPlane(lastPlane); currentPlane = lastPlane;
472 if (currentPlane > lastPlane)
475 if (pLnkPrev->
Obj != pLastWarnObj)
478 pLastWarnObj = pLnkPrev->
Obj;
480 pLnk->
Obj = pLnkPrev->
Obj;
481 pLnkPrev->
Obj = pObj;
482 pLnkLastUnsorted = pLnkPrev;
486 lastPlane = currentPlane;
490 if (!pLnkLastUnsorted)
494 pLnkL = pLnkLastUnsorted;
496 lastPlane = -2147483647-1;
497 for (pLnk = pLnkL; pLnk != pLnk0->
Prev; pLnk = pLnk->
Prev)
504 int currentPlane = pObj->
GetPlane();
505 if (currentPlane < lastPlane)
508 if (pLnkPrev->
Obj != pLastWarnObj)
511 pLastWarnObj = pLnkPrev->
Obj;
513 pLnk->
Obj = pLnkPrev->
Obj;
514 pLnkPrev->
Obj = pObj;
515 pLnk1stUnsorted = pLnkPrev;
519 lastPlane = currentPlane;
523 if (!pLnk1stUnsorted)
527 pLnk0 = pLnk1stUnsorted;
541 object->Unsorted =
false;
560 return object_list_valid && inactive_objects_valid;
571 return object_list_assigned && inactive_objects_assigned;
580 object->AssignLightRange();
591 object->SyncClearance();
613 object->Audible =
object->AudiblePan = 0;
633 uint32_t marker = ++LastUsedMarker;
644 marker = ++LastUsedMarker;
const uint32_t OCF_Carryable
const uint32_t OCF_Collection
const uint32_t OCF_HitSpeed2
const int32_t C4D_Foreground
const int32_t C4D_StaticBack
const int32_t C4D_Environment
#define C4FxCall_EngObjHit
#define PSF_OnSynchronized
#define PSF_QueryCatchBlow
bool DebugLogF(const char *strMessage ...)
int fixtoi(const C4Fixed &x)
void ClearPointers(C4Object *obj)
void Init(int32_t width, int32_t height)
bool Remove(C4Object *game_object) override
C4Object * ObjectPointer(int32_t object_number)
void UpdatePos(C4Object *game_object)
C4Value GRBroadcast(const char *function_name, C4AulParSet *parameters, bool pass_error, bool reject_test)
virtual bool Add(C4Object *new_obj, SortType sort_type, C4ObjectList *sorted_list=nullptr)
void UpdateScriptPointers()
C4Object * SafeObjectPointer(int32_t object_number)
bool ValidateOwners() override
C4ObjectList InactiveObjects
void Denumerate(C4ValueNumbers *)
bool AssignInfo() override
int PostLoad(bool keep_inactive_objects, C4ValueNumbers *)
void UpdatePosResort(C4Object *game_object)
~C4GameObjects() override
C4ObjectList * NextObjects(C4ObjectList *pPrev, C4LSector **ppSct)
C4ObjectList * FirstObjects(C4LSector **ppSct)
void Update(C4Object *pObj, C4ObjectList *pMainList)
void Add(C4Object *pObj, C4ObjectList *pMainList)
void Init(int Wdt, int Hgt)
void Remove(C4Object *pObj)
C4PropList * GetAction() const
void Fling(C4Real txdir, C4Real tydir, bool fAddSpeed)
bool Collect(C4Object *pObj)
C4NotifyingObjectList Contents
void DoEnergy(int32_t iChange, bool fExact, int32_t iCause, int32_t iCausedByPlr)
void UpdateFaces(bool update_shape)
void UpdateGraphics(bool graphics_changed)
void UpdateScriptPointers()
virtual bool AssignInfo()
void Copy(const C4ObjectList &list)
const C4ObjectLink * GetLink(const C4Object *obj) const
virtual bool Add(C4Object *new_obj, SortType sort_type, C4ObjectList *sorted_list=nullptr)
virtual bool ValidateOwners()
const ReverseView reverse() const
virtual bool Remove(C4Object *obj)
int ObjectCount(C4ID id=C4ID::None) const
void Denumerate(C4ValueNumbers *)
C4PropertyName GetPropertyP(C4PropertyName k) const
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
static void UnshelveNumberedPropLists()
static void SetEnumerationIndex(int32_t iMaxObjectNumber)
static C4PropList * GetByNumber(int32_t iNumber)