aboutsummaryrefslogtreecommitdiff
path: root/engines/cine
diff options
context:
space:
mode:
authorVincent Hamm2012-08-13 20:12:07 -0700
committerVincent Hamm2012-08-13 20:12:07 -0700
commit2fd8bae31994e5581d0ef43da439d01ddd0d1ef5 (patch)
tree16486b6d85e8763a2cd28db600e9862ef401e979 /engines/cine
parentc839fd50b5ddfcceada8cbbd3046ce219df248a0 (diff)
downloadscummvm-rg350-2fd8bae31994e5581d0ef43da439d01ddd0d1ef5.tar.gz
scummvm-rg350-2fd8bae31994e5581d0ef43da439d01ddd0d1ef5.tar.bz2
scummvm-rg350-2fd8bae31994e5581d0ef43da439d01ddd0d1ef5.zip
CINE: Fix restoring of savegame in cave
Diffstat (limited to 'engines/cine')
-rw-r--r--engines/cine/anim.cpp13
-rw-r--r--engines/cine/anim.h2
-rw-r--r--engines/cine/bg_list.cpp12
-rw-r--r--engines/cine/gfx.cpp86
-rw-r--r--engines/cine/gfx.h9
-rw-r--r--engines/cine/saveload.cpp16
6 files changed, 80 insertions, 58 deletions
diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp
index 410fcca1f3..d81828d9f6 100644
--- a/engines/cine/anim.cpp
+++ b/engines/cine/anim.cpp
@@ -682,9 +682,10 @@ void convert8BBP2(byte *dest, byte *source, int16 width, int16 height) {
* Load image set
* @param resourceName Image set filename
* @param idx Target index in animDataTable (-1 if any empty space will do)
+ * @param frameIndex frame of animation to load (-1 for all frames)
* @return The number of the animDataTable entry after the loaded image set (-1 if error)
*/
-int loadSet(const char *resourceName, int16 idx) {
+int loadSet(const char *resourceName, int16 idx, int16 frameIndex =-1 ) {
AnimHeader2Struct header2;
uint16 numSpriteInAnim;
int16 foundFileIdx = findFileInBundle(resourceName);
@@ -708,6 +709,12 @@ int loadSet(const char *resourceName, int16 idx) {
entry = idx < 0 ? emptyAnimSpace() : idx;
assert(entry >= 0);
+ if(frameIndex>=0)
+ {
+ numSpriteInAnim = 1;
+ ptr += 0x10 * frameIndex;
+ }
+
for (int16 i = 0; i < numSpriteInAnim; i++, entry++) {
Common::MemoryReadStream readS(ptr, 0x10);
@@ -767,7 +774,7 @@ int loadSeq(const char *resourceName, int16 idx) {
* @return The number of the animDataTable entry after the loaded resource (-1 if error)
* @todo Implement loading of all resource types
*/
-int loadResource(const char *resourceName, int16 idx) {
+int loadResource(const char *resourceName, int16 idx, int16 frameIndex) {
int result = -1; // Return an error by default
if (strstr(resourceName, ".SPL")) {
result = loadSpl(resourceName, idx);
@@ -778,7 +785,7 @@ int loadResource(const char *resourceName, int16 idx) {
} else if (strstr(resourceName, ".ANM")) {
result = loadAni(resourceName, idx);
} else if (strstr(resourceName, ".SET")) {
- result = loadSet(resourceName, idx);
+ result = loadSet(resourceName, idx, frameIndex);
} else if (strstr(resourceName, ".SEQ")) {
result = loadSeq(resourceName, idx);
} else if (strstr(resourceName, ".H32")) {
diff --git a/engines/cine/anim.h b/engines/cine/anim.h
index 9c06c260ce..c5130aab82 100644
--- a/engines/cine/anim.h
+++ b/engines/cine/anim.h
@@ -98,7 +98,7 @@ public:
void freeAnimDataTable();
void freeAnimDataRange(byte startIdx, byte numIdx);
-int loadResource(const char *resourceName, int16 idx = -1);
+int loadResource(const char *resourceName, int16 idx = -1, int16 frameIndex = -1);
void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGameFormat saveGameFormat);
void generateMask(const byte *sprite, byte *mask, uint16 size, byte transparency);
diff --git a/engines/cine/bg_list.cpp b/engines/cine/bg_list.cpp
index 693fea3294..36ecf53dea 100644
--- a/engines/cine/bg_list.cpp
+++ b/engines/cine/bg_list.cpp
@@ -39,9 +39,9 @@ uint32 var8;
* @param objIdx Sprite description
*/
void addToBGList(int16 objIdx) {
- renderer->incrustSprite(g_cine->_objectTable[objIdx]);
-
createBgIncrustListElement(objIdx, 0);
+
+ renderer->incrustSprite(g_cine->_bgIncrustList.back());
}
/**
@@ -49,9 +49,9 @@ void addToBGList(int16 objIdx) {
* @param objIdx Sprite description
*/
void addSpriteFilledToBGList(int16 objIdx) {
- renderer->incrustMask(g_cine->_objectTable[objIdx]);
-
createBgIncrustListElement(objIdx, 1);
+
+ renderer->incrustMask(g_cine->_bgIncrustList.back());
}
/**
@@ -103,9 +103,9 @@ void loadBgIncrustFromSave(Common::SeekableReadStream &fHandle) {
g_cine->_bgIncrustList.push_back(tmp);
if (tmp.param == 0) {
- renderer->incrustSprite(g_cine->_objectTable[tmp.objIdx]);
+ renderer->incrustSprite(tmp);
} else {
- renderer->incrustMask(g_cine->_objectTable[tmp.objIdx]);
+ renderer->incrustMask(tmp);
}
}
}
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp
index d448f134ff..c51420e62b 100644
--- a/engines/cine/gfx.cpp
+++ b/engines/cine/gfx.cpp
@@ -113,7 +113,7 @@ FWRenderer::FWRenderer() : _background(NULL), _backupPal(), _cmd(""),
assert(_backBuffer);
memset(_backBuffer, 0, _screenSize);
- memset(_bgName, 0, sizeof(_bgName));
+ memset(_bgName, 0, sizeof (_bgName));
}
@@ -174,7 +174,8 @@ void FWRenderer::fillSprite(const ObjectStruct &obj, uint8 color) {
* @param obj Object info
* @param fillColor Sprite color
*/
-void FWRenderer::incrustMask(const ObjectStruct &obj, uint8 color) {
+void FWRenderer::incrustMask(const BGIncrust &incrust, uint8 color) {
+ const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx];
const byte *data = g_cine->_animDataTable[obj.frame].data();
int x, y, width, height;
@@ -218,7 +219,9 @@ void FWRenderer::drawSprite(const ObjectStruct &obj) {
* Draw color sprite on background
* @param obj Object info
*/
-void FWRenderer::incrustSprite(const ObjectStruct &obj) {
+void FWRenderer::incrustSprite(const BGIncrust &incrust) {
+ const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx];
+
const byte *data = g_cine->_animDataTable[obj.frame].data();
const byte *mask = g_cine->_animDataTable[obj.frame].mask();
int x, y, width, height;
@@ -301,7 +304,7 @@ void FWRenderer::drawMessage(const char *str, int x, int y, int width, int color
while (str[i] == ' ') i++;
line = fitLine(str + i, tw, words, cw);
- if (str[i + line] != '\0' && str[i + line] != 0x7C && words) {
+ if ( str[i + line] != '\0' && str[i + line] != 0x7C && words) {
space = (tw - cw) / words;
extraSpace = (tw - cw) % words;
} else {
@@ -1119,7 +1122,8 @@ void OSRenderer::clear() {
* @param obj Object info
* @param fillColor Sprite color
*/
-void OSRenderer::incrustMask(const ObjectStruct &obj, uint8 color) {
+void OSRenderer::incrustMask(const BGIncrust &incrust, uint8 color) {
+ const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx];
const byte *data = g_cine->_animDataTable[obj.frame].data();
int x, y, width, height;
@@ -1154,15 +1158,16 @@ void OSRenderer::drawSprite(const ObjectStruct &obj) {
* Draw color sprite
* @param obj Object info
*/
-void OSRenderer::incrustSprite(const ObjectStruct &obj) {
- const byte *data = g_cine->_animDataTable[obj.frame].data();
+void OSRenderer::incrustSprite(const BGIncrust &incrust) {
+ const ObjectStruct &obj = g_cine->_objectTable[incrust.objIdx];
+ const byte *data = g_cine->_animDataTable[incrust.frame].data();
int x, y, width, height, transColor;
- x = obj.x;
- y = obj.y;
+ x = incrust.x;
+ y = incrust.y;
transColor = obj.part;
- width = g_cine->_animDataTable[obj.frame]._realWidth;
- height = g_cine->_animDataTable[obj.frame]._height;
+ width = g_cine->_animDataTable[incrust.frame]._realWidth;
+ height = g_cine->_animDataTable[incrust.frame]._height;
if (_bgTable[_currentBg].bg) {
drawSpriteRaw2(data, transColor, width, height, _bgTable[_currentBg].bg, x, y);
@@ -1416,7 +1421,7 @@ void OSRenderer::selectBg(unsigned int idx) {
if (_bgTable[idx].bg) {
assert(_bgTable[idx].pal.isValid() && !(_bgTable[idx].pal.empty()));
- _currentBg = idx;
+ _currentBg = idx;
} else
warning("OSRenderer::selectBg(%d) - attempt to select null background", idx);
reloadPalette();
@@ -1737,43 +1742,53 @@ void drawSpriteRaw(const byte *spritePtr, const byte *maskPtr, int16 width, int1
}
}
-void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp) {
- byte *pMask = NULL;
+void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 width, int16 height, byte *page, int16 x, int16 y, byte transparentColor, byte bpp)
+{
+ byte* pMask = NULL;
// draw the mask based on next objects in the list
Common::List<overlay>::iterator it;
- for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it) {
- if (&(*it) == overlayPtr) {
+ for (it = g_cine->_overlayList.begin(); it != g_cine->_overlayList.end(); ++it)
+ {
+ if(&(*it) == overlayPtr)
+ {
break;
}
}
- while (it != g_cine->_overlayList.end()) {
- overlay *pCurrentOverlay = &(*it);
- if ((pCurrentOverlay->type == 5) || ((pCurrentOverlay->type == 21) && (pCurrentOverlay->x == overlayPtr->objIdx))) {
- AnimData *sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame];
+ while(it != g_cine->_overlayList.end())
+ {
+ overlay* pCurrentOverlay = &(*it);
+ if((pCurrentOverlay->type==5) || ((pCurrentOverlay->type==21) && (pCurrentOverlay->x==overlayPtr->objIdx)))
+ {
+ AnimData* sprite = &g_cine->_animDataTable[g_cine->_objectTable[it->objIdx].frame];
- if (pMask == NULL) {
- pMask = new byte[width * height];
+ if(pMask == NULL)
+ {
+ pMask = new byte[width*height];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
- byte spriteColor = spritePtr[width * i + j];
- pMask[width * i + j] = spriteColor;
+ byte spriteColor= spritePtr[width*i+j];
+ pMask[width*i+j] = spriteColor;
}
}
}
for (int i = 0; i < sprite->_realWidth; i++) {
for (int j = 0; j < sprite->_height; j++) {
- int inMaskX = (g_cine->_objectTable[it->objIdx].x + i) - x;
- int inMaskY = (g_cine->_objectTable[it->objIdx].y + j) - y;
-
- if (inMaskX >= 0 && inMaskX < width) {
- if (inMaskY >= 0 && inMaskY < height) {
- if (sprite->_bpp == 1) {
- if (!sprite->getColor(i, j)) {
- pMask[inMaskY * width + inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320];
+ int inMaskX = (g_cine->_objectTable[it->objIdx].x+i) - x;
+ int inMaskY = (g_cine->_objectTable[it->objIdx].y+j) - y;
+
+ if(inMaskX >=0 && inMaskX < width)
+ {
+ if(inMaskY >=0 && inMaskY < height)
+ {
+ if(sprite->_bpp == 1)
+ {
+ if(!sprite->getColor(i, j))
+ {
+ pMask[inMaskY*width+inMaskX] = page[x + y * 320 + inMaskX + inMaskY * 320];
}
}
}
@@ -1787,7 +1802,8 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi
}
// now, draw with the mask we created
- if (pMask) {
+ if(pMask)
+ {
spritePtr = pMask;
}
{
@@ -1796,7 +1812,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi
destPtr += i * 320;
for (int j = 0; j < width; j++) {
- byte color = *(spritePtr++);
+ byte color= *(spritePtr++);
if ((transparentColor != color) && x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200) {
*(destPtr++) = color;
} else {
@@ -1807,7 +1823,7 @@ void OSRenderer::drawSprite(overlay *overlayPtr, const byte *spritePtr, int16 wi
}
delete[] pMask;
-}
+};
void drawSpriteRaw2(const byte *spritePtr, byte transColor, int16 width, int16 height, byte *page, int16 x, int16 y) {
int16 i, j;
diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h
index 6ff5b08b77..3434cf9fc2 100644
--- a/engines/cine/gfx.h
+++ b/engines/cine/gfx.h
@@ -27,6 +27,7 @@
#include "common/rect.h"
#include "common/stack.h"
#include "cine/object.h"
+#include "cine/bg_list.h"
namespace Cine {
@@ -177,8 +178,8 @@ public:
void drawFrame();
void setCommand(Common::String cmd);
- virtual void incrustMask(const ObjectStruct &obj, uint8 color = 0);
- virtual void incrustSprite(const ObjectStruct &obj);
+ virtual void incrustMask(const BGIncrust &incrust, uint8 color = 0);
+ virtual void incrustSprite(const BGIncrust &incrust);
virtual void loadBg16(const byte *bg, const char *name, unsigned int idx = 0);
virtual void loadCt16(const byte *ct, const char *name);
@@ -239,8 +240,8 @@ public:
void clear();
- void incrustMask(const ObjectStruct &obj, uint8 color = 0);
- void incrustSprite(const ObjectStruct &obj);
+ void incrustMask(const BGIncrust &incrust, uint8 color = 0);
+ void incrustSprite(const BGIncrust &incrust);
void loadBg16(const byte *bg, const char *name, unsigned int idx = 0);
void loadCt16(const byte *ct, const char *name);
diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp
index 223099a587..20952eea52 100644
--- a/engines/cine/saveload.cpp
+++ b/engines/cine/saveload.cpp
@@ -991,7 +991,7 @@ void CineEngine::makeSave(char *saveFileName) {
* at a time.
*/
void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGameFormat saveGameFormat) {
- int16 currentAnim, foundFileIdx;
+ int16 foundFileIdx;
char *animName, part[256], name[10];
strcpy(part, currentPartName);
@@ -1001,10 +1001,10 @@ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGam
const int entrySize = ((saveGameFormat == ANIMSIZE_23) ? 23 : 30);
const int fileStartPos = fHandle.pos();
- currentAnim = 0;
- while (currentAnim < NUM_MAX_ANIMDATA) {
+
+ for(int resourceIndex=0; resourceIndex<NUM_MAX_ANIMDATA; resourceIndex++) {
// Seek to the start of the current animation's entry
- fHandle.seek(fileStartPos + currentAnim * entrySize);
+ fHandle.seek(fileStartPos + resourceIndex * entrySize);
// Read in the current animation entry
fHandle.readUint16BE(); // width
fHandle.readUint16BE();
@@ -1019,7 +1019,7 @@ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGam
}
foundFileIdx = fHandle.readSint16BE();
- fHandle.readSint16BE(); // frame
+ int16 frameIndex = fHandle.readSint16BE(); // frame
fHandle.read(name, 10);
// Handle variables only present in animation entries of size 23
@@ -1029,7 +1029,7 @@ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGam
// Don't try to load invalid entries.
if (foundFileIdx < 0 || !validPtr) {
- currentAnim++; // Jump over the invalid entry
+ //resourceIndex++; // Jump over the invalid entry
continue;
}
@@ -1041,9 +1041,7 @@ void loadResourcesFromSave(Common::SeekableReadStream &fHandle, enum CineSaveGam
animName = g_cine->_partBuffer[foundFileIdx].partName;
loadRelatedPalette(animName); // Is this for Future Wars only?
- const int16 prevAnim = currentAnim;
- currentAnim = loadResource(animName, currentAnim);
- assert(currentAnim > prevAnim); // Make sure we advance forward
+ loadResource(animName, resourceIndex, frameIndex);
}
loadPart(part);