aboutsummaryrefslogtreecommitdiff
path: root/engines/cine/bg_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cine/bg_list.cpp')
-rw-r--r--engines/cine/bg_list.cpp165
1 files changed, 76 insertions, 89 deletions
diff --git a/engines/cine/bg_list.cpp b/engines/cine/bg_list.cpp
index 1d69407c8a..7d35f9981e 100644
--- a/engines/cine/bg_list.cpp
+++ b/engines/cine/bg_list.cpp
@@ -36,129 +36,116 @@
namespace Cine {
uint32 var8;
-BGIncrustList *bgIncrustList;
+Common::List<BGIncrust> bgIncrustList;
+/*! \brief Add masked sprite to the background
+ * \param objIdx Sprite description
+ * \param addList Add sprite to incrust list if true
+ * \todo Fix incrust objects on CT background. Always drawing incrust elements
+ * on CT background breaks game zones
+ */
void addToBGList(int16 objIdx, bool addList) {
int16 x = objectTable[objIdx].x;
int16 y = objectTable[objIdx].y;
- int16 width = animDataTable[objectTable[objIdx].frame].var1;
- int16 height = animDataTable[objectTable[objIdx].frame].height;
+ int16 width = animDataTable[objectTable[objIdx].frame]._var1;
+ int16 height = animDataTable[objectTable[objIdx].frame]._height;
+ const byte *data = animDataTable[objectTable[objIdx].frame].data();
+ const byte *mask = animDataTable[objectTable[objIdx].frame].mask();
// int16 part = objectTable[objIdx].part;
+ // Operation Stealth may switch among multiple backgrounds
if (g_cine->getGameType() == GType_OS) {
- drawSpriteRaw2(animDataTable[objectTable[objIdx].frame].ptr1, objectTable[objIdx].part, width, height, page2Raw, x, y);
+ for (int i = 0; i < 8; i++) {
+ if (additionalBgTable[i]) {
+ drawSpriteRaw2(data, objectTable[objIdx].part, width, height, additionalBgTable[i], x, y);
+ }
+ }
} else {
- drawSpriteRaw(animDataTable[objectTable[objIdx].frame].ptr1, animDataTable[objectTable[objIdx].frame].ptr2, width, height, page2Raw, x, y);
+ drawSpriteRaw(data, mask, width, height, page2Raw, x, y);
}
if (addList)
createBgIncrustListElement(objIdx, 0);
}
+/*! \brief Add filled sprite to the background
+ * \param objIdx Sprite description
+ * \param addList Add sprite to incrust list if true
+ * \todo Fix incrust objects on CT background. Always drawing incrust elements
+ * on CT background breaks game zones
+ */
void addSpriteFilledToBGList(int16 objIdx, bool addList) {
int16 x = objectTable[objIdx].x;
int16 y = objectTable[objIdx].y;
- int16 width = animDataTable[objectTable[objIdx].frame].width;
- int16 height = animDataTable[objectTable[objIdx].frame].height;
-
- if (animDataTable[objectTable[objIdx].frame].ptr1) {
- gfxFillSprite(animDataTable[objectTable[objIdx].frame].ptr1, width / 2, height, page2Raw, x, y);
+ int16 width = animDataTable[objectTable[objIdx].frame]._width;
+ int16 height = animDataTable[objectTable[objIdx].frame]._height;
+ const byte *data = animDataTable[objectTable[objIdx].frame].data();
+
+ if (data) {
+ // Operation Stealth may switch among multiple backgrounds
+ if (g_cine->getGameType() == GType_OS) {
+ for (int i = 0; i < 8; i++) {
+ if (additionalBgTable[i]) {
+ gfxFillSprite(data, width / 2, height, additionalBgTable[i], x, y);
+ }
+ }
+ } else {
+ gfxFillSprite(data, width / 2, height, page2Raw, x, y);
+ }
}
if (addList)
createBgIncrustListElement(objIdx, 1);
}
+/*! \brief Add new element to incrust list
+ * \param objIdx Element description
+ * \param param Type of element
+ */
void createBgIncrustListElement(int16 objIdx, int16 param) {
- BGIncrustList *bgIncrustPtr = bgIncrustList;
- BGIncrustList *bgIncrustPtrP = 0;
-
- // Find first empty element
- while (bgIncrustPtr) {
- bgIncrustPtrP = bgIncrustPtr;
- bgIncrustPtr = bgIncrustPtr->next;
- }
-
- bgIncrustPtr = new BGIncrustList;
- if (bgIncrustPtrP)
- bgIncrustPtrP->next = bgIncrustPtr;
- else
- bgIncrustList = bgIncrustPtr;
-
- bgIncrustPtr->next = 0;
-
- bgIncrustPtr->objIdx = objIdx;
- bgIncrustPtr->param = param;
- bgIncrustPtr->x = objectTable[objIdx].x;
- bgIncrustPtr->y = objectTable[objIdx].y;
- bgIncrustPtr->frame = objectTable[objIdx].frame;
- bgIncrustPtr->part = objectTable[objIdx].part;
-}
+ BGIncrust tmp;
-void freeBgIncrustList(void) {
- BGIncrustList *bgIncrustPtr = bgIncrustList;
- BGIncrustList *bgIncrustPtrN;
+ tmp.objIdx = objIdx;
+ tmp.param = param;
+ tmp.x = objectTable[objIdx].x;
+ tmp.y = objectTable[objIdx].y;
+ tmp.frame = objectTable[objIdx].frame;
+ tmp.part = objectTable[objIdx].part;
- while (bgIncrustPtr) {
- bgIncrustPtrN = bgIncrustPtr->next;
- delete bgIncrustPtr;
- bgIncrustPtr = bgIncrustPtrN;
- }
-
- resetBgIncrustList();
+ bgIncrustList.push_back(tmp);
}
+/*! \brief Reset var8 (probably something related to bgIncrustList
+ */
void resetBgIncrustList(void) {
- bgIncrustList = NULL;
var8 = 0;
}
-void loadBgIncrustFromSave(Common::InSaveFile *fHandle) {
- BGIncrustList *bgIncrustPtr = bgIncrustList;
- BGIncrustList *bgIncrustPtrP = 0;
-
- // Find first empty element
- while (bgIncrustPtr) {
- bgIncrustPtrP = bgIncrustPtr;
- bgIncrustPtr = bgIncrustPtr->next;
- }
-
- bgIncrustPtr = new BGIncrustList;
- if (bgIncrustPtrP)
- bgIncrustPtrP->next = bgIncrustPtr;
- else
- bgIncrustList = bgIncrustPtr;
-
- bgIncrustPtr->next = 0;
-
- fHandle->readUint32BE();
- fHandle->readUint32BE();
-
- bgIncrustPtr->objIdx = fHandle->readUint16BE();
- bgIncrustPtr->param = fHandle->readUint16BE();
- bgIncrustPtr->x = fHandle->readUint16BE();
- bgIncrustPtr->y = fHandle->readUint16BE();
- bgIncrustPtr->frame = fHandle->readUint16BE();
- bgIncrustPtr->part = fHandle->readUint16BE();
-}
-
-void reincrustAllBg(void) {
- BGIncrustList *bgIncrustPtr = bgIncrustList;
-
- while (bgIncrustPtr) {
-#if 0
- objectTable[bgIncrustPtr->objIdx].x = bgIncrustPtr->x;
- objectTable[bgIncrustPtr->objIdx].y = bgIncrustPtr->y;
- objectTable[bgIncrustPtr->objIdx].frame = bgIncrustPtr->frame;
- objectTable[bgIncrustPtr->objIdx].part = bgIncrustPtr->part;
-#endif
- if (bgIncrustPtr->param == 0) {
- addToBGList(bgIncrustPtr->objIdx, false);
+/*! \brief Restore incrust list from savefile
+ * \param fHandle Savefile open for reading
+ */
+void loadBgIncrustFromSave(Common::InSaveFile &fHandle) {
+ BGIncrust tmp;
+ int size = fHandle.readSint16BE();
+
+ for (int i = 0; i < size; i++) {
+ fHandle.readUint32BE();
+ fHandle.readUint32BE();
+
+ tmp.objIdx = fHandle.readUint16BE();
+ tmp.param = fHandle.readUint16BE();
+ tmp.x = fHandle.readUint16BE();
+ tmp.y = fHandle.readUint16BE();
+ tmp.frame = fHandle.readUint16BE();
+ tmp.part = fHandle.readUint16BE();
+
+ bgIncrustList.push_back(tmp);
+
+ if (tmp.param == 0) {
+ addToBGList(tmp.objIdx, false);
} else {
- addSpriteFilledToBGList(bgIncrustPtr->objIdx, false);
+ addSpriteFilledToBGList(tmp.objIdx, false);
}
-
- bgIncrustPtr = bgIncrustPtr->next;
}
}