aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/agi/view.cpp40
-rw-r--r--engines/agi/view.h6
2 files changed, 34 insertions, 12 deletions
diff --git a/engines/agi/view.cpp b/engines/agi/view.cpp
index ac3e60ee6d..322afd8ec0 100644
--- a/engines/agi/view.cpp
+++ b/engines/agi/view.cpp
@@ -111,7 +111,6 @@ int AgiEngine::decodeView(byte *resourceData, uint16 resourceSize, int16 viewNr)
byte *celCompressedData = nullptr;
uint16 celCompressedSize = 0;
-// byte *rawBitmap = nullptr;
debugC(5, kDebugLevelResources, "decode_view(%d)", viewNr);
@@ -431,14 +430,28 @@ void AgiEngine::unloadView(int16 viewNr) {
* @param viewNr number of AGI view resource
*/
void AgiEngine::setView(ScreenObjEntry *screenObj, int16 viewNr) {
- screenObj->viewData = &_game.views[viewNr];
+ if (!(_game.dirView[viewNr].flags & RES_LOADED)) {
+ // View resource currently not loaded, this is probably a game bug
+ // Load the resource now to fix the issue, and give out a warning
+ // This happens in at least Larry 1 for Apple IIgs right after getting beaten up by taxi driver
+ // Original interpreter bombs out in this situation saying "view not loaded, Press ESC to quit"
+ warning("setView() called on screen object %d to use view %d, but view not loaded", screenObj->objectNr, viewNr);
+ warning("probably game script bug, trying to load view into memory");
+ if (agiLoadResource(RESOURCETYPE_VIEW, viewNr) != errOK) {
+ // loading failed, we better error() out now
+ error("setView() called to set view %d for screen object %d, which is not loaded atm and loading failed", viewNr, screenObj->objectNr);
+ return;
+ };
+ }
+
+ screenObj->viewResource = &_game.views[viewNr];
screenObj->currentViewNr = viewNr;
- screenObj->loopCount = screenObj->viewData->loopCount;
+ screenObj->loopCount = screenObj->viewResource->loopCount;
screenObj->viewReplaced = true;
if (getVersion() < 0x2000) {
- screenObj->stepSize = screenObj->viewData->headerStepSize;
- screenObj->cycleTime = screenObj->viewData->headerCycleTime;
+ screenObj->stepSize = screenObj->viewResource->headerStepSize;
+ screenObj->cycleTime = screenObj->viewResource->headerCycleTime;
screenObj->cycleTimeCount = 0;
}
if (screenObj->currentLoopNr >= screenObj->loopCount) {
@@ -454,7 +467,11 @@ void AgiEngine::setView(ScreenObjEntry *screenObj, int16 viewNr) {
* @param loopNr number of loop
*/
void AgiEngine::setLoop(ScreenObjEntry *screenObj, int16 loopNr) {
- assert(screenObj->viewData != NULL);
+ if (!(_game.dirView[screenObj->currentViewNr].flags & RES_LOADED)) {
+ error("setLoop() called on screen object %d, which has no loaded view resource assigned to it", screenObj->objectNr);
+ return;
+ }
+ assert(screenObj->viewResource);
if (screenObj->loopCount == 0) {
warning("setLoop() called on screen object %d, which has no loops (view %d)", screenObj->objectNr, screenObj->currentViewNr);
@@ -493,7 +510,16 @@ void AgiEngine::setLoop(ScreenObjEntry *screenObj, int16 loopNr) {
* @param celNr number of cel
*/
void AgiEngine::setCel(ScreenObjEntry *screenObj, int16 celNr) {
- assert(screenObj->viewData != NULL);
+ if (!(_game.dirView[screenObj->currentViewNr].flags & RES_LOADED)) {
+ error("setCel() called on screen object %d, which has no loaded view resource assigned to it", screenObj->objectNr);
+ return;
+ }
+ assert(screenObj->viewResource);
+
+ if (screenObj->loopCount == 0) {
+ warning("setLoop() called on screen object %d, which has no loops (view %d)", screenObj->objectNr, screenObj->currentViewNr);
+ return;
+ }
AgiViewLoop *curViewLoop = &_game.views[screenObj->currentViewNr].loop[screenObj->currentLoopNr];
diff --git a/engines/agi/view.h b/engines/agi/view.h
index 04021260a3..e59916da78 100644
--- a/engines/agi/view.h
+++ b/engines/agi/view.h
@@ -47,10 +47,6 @@ struct AgiView {
byte *description;
int16 loopCount;
AgiViewLoop *loop;
-
- //struct ViewLoop *loop;
- //bool agi256_2;
- //byte *resourceData;
};
enum MotionType {
@@ -98,7 +94,7 @@ struct ScreenObjEntry {
int16 yPos;
uint8 currentViewNr;
bool viewReplaced;
- struct AgiView *viewData;
+ struct AgiView *viewResource;
uint8 currentLoopNr;
uint8 loopCount;
struct AgiViewLoop *loopData;