From cdcccef47a66a478396ab2248315f4a2be3f0e75 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Thu, 28 Jul 2022 19:09:21 +1000 Subject: [PATCH] Return pointer from AddObject This allows removing the immediate lookup for call sites which need further initialisation. --- Source/levels/themes.cpp | 3 +-- Source/objects.cpp | 27 ++++++++++++++------------- Source/objects.h | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Source/levels/themes.cpp b/Source/levels/themes.cpp index a8f077f62..c546154d3 100644 --- a/Source/levels/themes.cpp +++ b/Source/levels/themes.cpp @@ -698,9 +698,8 @@ void Theme_Library(int t) for (int yp = 1; yp < MAXDUNY - 1; yp++) { for (int xp = 1; xp < MAXDUNX - 1; xp++) { if (CheckThemeObj3({ xp, yp }, themes[t].ttval) && dMonster[xp][yp] == 0 && FlipCoin(librnd[leveltype - 1])) { - AddObject(OBJ_BOOKSTAND, { xp, yp }); + Object *bookstand = AddObject(OBJ_BOOKSTAND, { xp, yp }); if (!FlipCoin(2 * librnd[leveltype - 1])) { - Object *bookstand = ObjectAtPosition({ xp, yp }); if (bookstand != nullptr) { bookstand->_oSelFlag = 0; bookstand->_oAnimFrame += 2; diff --git a/Source/objects.cpp b/Source/objects.cpp index eacb76530..093a0c379 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -465,15 +465,17 @@ void AddBookLever(Rectangle affectedArea, _speech_id msg) if (!position) return; + Object *lever = nullptr; if (Quests[Q_BLIND].IsAvailable()) - AddObject(OBJ_BLINDBOOK, *position); + lever = AddObject(OBJ_BLINDBOOK, *position); if (Quests[Q_WARLORD].IsAvailable()) - AddObject(OBJ_STEELTOME, *position); + lever = AddObject(OBJ_STEELTOME, *position); if (Quests[Q_BLOOD].IsAvailable()) { position = SetPiece.position.megaToWorld() + Displacement { 9, 24 }; - AddObject(OBJ_BLOODBOOK, *position); + lever = AddObject(OBJ_BLOODBOOK, *position); } - ObjectAtPosition(*position)->InitializeQuestBook(affectedArea, leverid, msg); + assert(lever != nullptr); + lever->InitializeQuestBook(affectedArea, leverid, msg); leverid++; } @@ -587,8 +589,7 @@ void AddObjTraps() if (!CanPlaceWallTrap(xp, j) || i - xp <= 1) continue; - AddObject(OBJ_TRAPL, { xp, j }); - trapObject = ObjectAtPosition({ xp, j }); + trapObject = AddObject(OBJ_TRAPL, { xp, j }); } else { int yp = j - 1; while (IsTileNotSolid({ i, yp })) @@ -597,8 +598,7 @@ void AddObjTraps() if (!CanPlaceWallTrap(i, yp) || j - yp <= 1) continue; - AddObject(OBJ_TRAPR, { i, yp }); - trapObject = ObjectAtPosition({ i, yp }); + trapObject = AddObject(OBJ_TRAPR, { i, yp }); } if (trapObject != nullptr) { @@ -664,9 +664,9 @@ void LoadMapObjects(const char *path, Point start, Rectangle mapRange = {}, int auto objectId = static_cast(SDL_SwapLE16(objectLayer[j * width + i])); if (objectId != 0) { Point mapPos = start + Displacement { i, j }; - AddObject(ObjTypeConv[objectId], mapPos); - if (leveridx > 0) - ObjectAtPosition(mapPos)->InitializeLoadedObject(mapRange, leveridx); + Object *mapObject = AddObject(ObjTypeConv[objectId], mapPos); + if (leveridx > 0 && mapObject != nullptr) + mapObject->InitializeLoadedObject(mapRange, leveridx); } } } @@ -4372,10 +4372,10 @@ void SetMapObjects(const uint16_t *dunData, int startx, int starty) ApplyObjectLighting = false; } -void AddObject(_object_id objType, Point objPos) +Object *AddObject(_object_id objType, Point objPos) { if (ActiveObjectCount >= MAXOBJECTS) - return; + return nullptr; int oi = AvailableObjects[0]; AvailableObjects[0] = AvailableObjects[MAXOBJECTS - 1 - ActiveObjectCount]; @@ -4529,6 +4529,7 @@ void AddObject(_object_id objType, Point objPos) break; } ActiveObjectCount++; + return &object; } void OperateTrap(Object &trap) diff --git a/Source/objects.h b/Source/objects.h index bd04cb212..c6f1445e6 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -297,7 +297,7 @@ void SetMapObjects(const uint16_t *dunData, int startx, int starty); * @param objType Type specifier * @param objPos tile coordinates */ -void AddObject(_object_id objType, Point objPos); +Object *AddObject(_object_id objType, Point objPos); void OperateTrap(Object &trap); void ProcessObjects(); void RedoPlayerVision();