diff options
author | Andrew Kurushin | 2005-05-08 14:04:06 +0000 |
---|---|---|
committer | Andrew Kurushin | 2005-05-08 14:04:06 +0000 |
commit | a81b093e65f90ea70c5b07676a1fcc46d3e95a5e (patch) | |
tree | e0fced8f17e32e28fe24a1c948d2a74e6a039699 | |
parent | 781472641e32d1999660caa54c27b218c5b4298d (diff) | |
download | scummvm-rg350-a81b093e65f90ea70c5b07676a1fcc46d3e95a5e.tar.gz scummvm-rg350-a81b093e65f90ea70c5b07676a1fcc46d3e95a5e.tar.bz2 scummvm-rg350-a81b093e65f90ea70c5b07676a1fcc46d3e95a5e.zip |
fixed sfSceneEq bug
fixed load actors entrance
removed some orphans
svn-id: r17964
-rw-r--r-- | saga/actor.cpp | 28 | ||||
-rw-r--r-- | saga/actor.h | 4 | ||||
-rw-r--r-- | saga/events.cpp | 4 | ||||
-rw-r--r-- | saga/ihnm_introproc.cpp | 49 | ||||
-rw-r--r-- | saga/ite_introproc.cpp | 119 | ||||
-rw-r--r-- | saga/render.cpp | 5 | ||||
-rw-r--r-- | saga/saga.h | 10 | ||||
-rw-r--r-- | saga/saveload.cpp | 47 | ||||
-rw-r--r-- | saga/scene.cpp | 321 | ||||
-rw-r--r-- | saga/scene.h | 136 | ||||
-rw-r--r-- | saga/sdebug.cpp | 7 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 12 |
12 files changed, 324 insertions, 418 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index 1990e1ef5f..73ee425361 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -374,7 +374,7 @@ void Actor::takeExit(uint16 actorId, const HitZone *hitZone) { actor = getActor(actorId); actor->lastZone = NULL; - _vm->_scene->changeScene(hitZone->getSceneNumber(), hitZone->getActorsEntrance()); + _vm->_scene->changeScene(hitZone->getSceneNumber(), hitZone->getActorsEntrance(), kTransitionNoFade); _vm->_script->setNoPendingVerb(); } @@ -562,6 +562,10 @@ void Actor::updateActorsScene(int actorsEntrance) { return; } + if (_vm->_scene->currentSceneNumber() == 0) { + error("Actor::updateActorsScene _vm->_scene->currentSceneNumber() == 0"); + } + _activeSpeech.stringsCount = 0; _protagonist = NULL; @@ -597,8 +601,6 @@ void Actor::updateActorsScene(int actorsEntrance) { _protagonist->location.z = sceneEntry->location.z * ACTOR_LMULT; } _protagonist->facingDirection = _protagonist->actionDirection = sceneEntry->facing; - } else { - warning("actorsEntrance < 0"); } _protagonist->currentAction = kActionWait; @@ -1261,7 +1263,11 @@ bool Actor::getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber return true; } -int Actor::drawActors() { +void Actor::drawActors() { + if (_vm->_scene->currentSceneNumber() <= 0) { + return; + } + CommonObjectOrderList::iterator drawOrderIterator; CommonObjectDataPointer drawObject; int frameNumber; @@ -1321,8 +1327,6 @@ int Actor::drawActors() { } } - - return SUCCESS; } bool Actor::followProtagonist(ActorData *actor) { @@ -2295,8 +2299,6 @@ void Actor::drawPathTest() { void Actor::saveState(File& out) { uint16 i; - out.writeSint32LE(_centerActor == NULL ? -1 : _centerActor->index); - out.writeSint32LE(_protagonist == NULL ? -1 : _protagonist->index); out.writeSint16LE(getProtagState()); for (i = 0; i < _actorsCount; i++) { @@ -2304,8 +2306,6 @@ void Actor::saveState(File& out) { a->saveState(out); } - //TODO: save _activeSpeech - for (i = 0; i < _objsCount; i++) { ObjectData *o = _objs[i]; o->saveState(out); @@ -2315,16 +2315,8 @@ void Actor::saveState(File& out) { void Actor::loadState(File& in) { int32 i; - i = in.readSint32LE(); - _centerActor = (i < 0) ? NULL : _actors[i]; - - i = in.readSint32LE(); - _protagonist = (i < 0) ? NULL : _actors[i]; - setProtagState(in.readSint16LE()); - //TODO: load _activeSpeech - for (i = 0; i < _actorsCount; i++) { ActorData *a = _actors[i]; a->loadState(in); diff --git a/saga/actor.h b/saga/actor.h index 93a36d7ad3..2afc7ec806 100644 --- a/saga/actor.h +++ b/saga/actor.h @@ -60,6 +60,8 @@ class HitZone; #define ACTOR_SPEECH_STRING_MAX 16 // speech const #define ACTOR_SPEECH_ACTORS_MAX 8 +#define ACTOR_NO_ENTRANCE -1 + #define PATH_NODE_EMPTY -1 enum ActorActions { @@ -464,7 +466,7 @@ public: } int direct(int msec); - int drawActors(); + void drawActors(); void updateActorsScene(int actorsEntrance); // calls from scene loading to update Actors info void drawPathTest(); diff --git a/saga/events.cpp b/saga/events.cpp index 759ac679b1..61f70ef612 100644 --- a/saga/events.cpp +++ b/saga/events.cpp @@ -277,9 +277,7 @@ int Events::handleOneShot(EVENT *event) { break; case EVENT_REMOVE: { - SCENE_INFO scene_info; - _vm->_scene->getInfo(&scene_info); - _vm->textDeleteEntry(scene_info.text_list, (TEXTLIST_ENTRY *)event->data); + _vm->textDeleteEntry(_vm->_scene->_textList, (TEXTLIST_ENTRY *)event->data); } break; default: diff --git a/saga/ihnm_introproc.cpp b/saga/ihnm_introproc.cpp index 2d98788694..09428d3ceb 100644 --- a/saga/ihnm_introproc.cpp +++ b/saga/ihnm_introproc.cpp @@ -80,18 +80,18 @@ SceneDescription IHNM_IntroMovie4Desc = { ARRAYSIZE(IHNM_IntroMovie4RL) }; -SCENE_QUEUE IHNM_IntroList[] = { - {0, &IHNM_IntroMovie1Desc, BY_DESC, Scene::SC_IHNMIntroMovieProc1, 0, SCENE_NOFADE}, - {0, &IHNM_IntroMovie2Desc, BY_DESC, Scene::SC_IHNMIntroMovieProc2, 0, SCENE_NOFADE}, - {0, &IHNM_IntroMovie3Desc, BY_DESC, Scene::SC_IHNMIntroMovieProc3, 0, SCENE_NOFADE}, - {0, &IHNM_IntroMovie4Desc, BY_DESC, Scene::SC_IHNMHateProc, 0, SCENE_NOFADE} +LoadSceneParams IHNM_IntroList[] = { + {0, kLoadByDescription, &IHNM_IntroMovie1Desc, Scene::SC_IHNMIntroMovieProc1, false, kTransitionNoFade, 0}, + {0, kLoadByDescription, &IHNM_IntroMovie2Desc, Scene::SC_IHNMIntroMovieProc2, false, kTransitionNoFade, 0}, + {0, kLoadByDescription, &IHNM_IntroMovie3Desc, Scene::SC_IHNMIntroMovieProc3, false, kTransitionNoFade, 0}, + {0, kLoadByDescription, &IHNM_IntroMovie4Desc, Scene::SC_IHNMHateProc, false, kTransitionNoFade, 0} }; int Scene::IHNMStartProc() { size_t n_introscenes; size_t i; - SCENE_QUEUE first_scene; + LoadSceneParams firstScene; n_introscenes = ARRAYSIZE(IHNM_IntroList); @@ -106,22 +106,23 @@ int Scene::IHNMStartProc() { // IHNM yet. Also, the end titles music to plays over the scene, which // is wrong. (But hey, it's a nice piece of music!) - first_scene.load_flag = BY_SCENE; - first_scene.scene_n = _vm->getStartSceneNumber(); - first_scene.scene_skiptarget = 1; - first_scene.scene_proc = NULL; - first_scene.fadeType = SCENE_FADE; + firstScene.loadFlag = kLoadBySceneNumber; + firstScene.sceneDescriptor = _vm->getStartSceneNumber(); + firstScene.sceneSkipTarget = true; + firstScene.sceneProc = NULL; + firstScene.transitionType = kTransitionFade; + firstScene.actorsEntrance = 0; - _vm->_scene->queueScene(&first_scene); + _vm->_scene->queueScene(&firstScene); return SUCCESS; } -int Scene::SC_IHNMIntroMovieProc1(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->IHNMIntroMovieProc1(param, scene_info); +int Scene::SC_IHNMIntroMovieProc1(int param, void *refCon) { + return ((Scene *)refCon)->IHNMIntroMovieProc1(param); } -int Scene::IHNMIntroMovieProc1(int param, SCENE_INFO *scene_info) { +int Scene::IHNMIntroMovieProc1(int param) { EVENT event; EVENT *q_event; @@ -155,11 +156,11 @@ int Scene::IHNMIntroMovieProc1(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_IHNMIntroMovieProc2(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->IHNMIntroMovieProc2(param, scene_info); +int Scene::SC_IHNMIntroMovieProc2(int param, void *refCon) { + return ((Scene *)refCon)->IHNMIntroMovieProc2(param); } -int Scene::IHNMIntroMovieProc2(int param, SCENE_INFO *scene_info) { +int Scene::IHNMIntroMovieProc2(int param) { EVENT event; EVENT *q_event; PALENTRY *pal; @@ -241,11 +242,11 @@ int Scene::IHNMIntroMovieProc2(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_IHNMIntroMovieProc3(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->IHNMIntroMovieProc3(param, scene_info); +int Scene::SC_IHNMIntroMovieProc3(int param, void *refCon) { + return ((Scene *)refCon)->IHNMIntroMovieProc3(param); } -int Scene::IHNMIntroMovieProc3(int param, SCENE_INFO *scene_info) { +int Scene::IHNMIntroMovieProc3(int param) { EVENT event; EVENT *q_event; PALENTRY *pal; @@ -327,11 +328,11 @@ int Scene::IHNMIntroMovieProc3(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_IHNMHateProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->IHNMHateProc(param, scene_info); +int Scene::SC_IHNMHateProc(int param, void *refCon) { + return ((Scene *)refCon)->IHNMHateProc(param); } -int Scene::IHNMHateProc(int param, SCENE_INFO *scene_info) { +int Scene::IHNMHateProc(int param) { EVENT event; EVENT *q_event; diff --git a/saga/ite_introproc.cpp b/saga/ite_introproc.cpp index 9f4b33b3c8..fd22d091db 100644 --- a/saga/ite_introproc.cpp +++ b/saga/ite_introproc.cpp @@ -40,46 +40,47 @@ namespace Saga { -SCENE_QUEUE ITE_IntroList[] = { - {RID_ITE_INTRO_ANIM_SCENE, NULL, BY_RESOURCE, Scene::SC_ITEIntroAnimProc, 0, SCENE_NOFADE}, - {RID_ITE_CAVE_SCENE_1, NULL, BY_RESOURCE, Scene::SC_ITEIntroCave1Proc, 0, SCENE_FADE_NO_INTERFACE}, - {RID_ITE_CAVE_SCENE_2, NULL, BY_RESOURCE, Scene::SC_ITEIntroCave2Proc, 0, SCENE_NOFADE}, - {RID_ITE_CAVE_SCENE_3, NULL, BY_RESOURCE, Scene::SC_ITEIntroCave3Proc, 0, SCENE_NOFADE}, - {RID_ITE_CAVE_SCENE_4, NULL, BY_RESOURCE, Scene::SC_ITEIntroCave4Proc, 0, SCENE_NOFADE}, - {RID_ITE_VALLEY_SCENE, NULL, BY_RESOURCE, Scene::SC_ITEIntroValleyProc, 0, SCENE_FADE_NO_INTERFACE}, - {RID_ITE_TREEHOUSE_SCENE, NULL, BY_RESOURCE, Scene::SC_ITEIntroTreeHouseProc, 0, SCENE_NOFADE}, - {RID_ITE_FAIREPATH_SCENE, NULL, BY_RESOURCE, Scene::SC_ITEIntroFairePathProc, 0, SCENE_NOFADE}, - {RID_ITE_FAIRETENT_SCENE, NULL, BY_RESOURCE, Scene::SC_ITEIntroFaireTentProc, 0, SCENE_NOFADE} +LoadSceneParams ITE_IntroList[] = { + {RID_ITE_INTRO_ANIM_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroAnimProc, false, kTransitionNoFade, 0}, + {RID_ITE_CAVE_SCENE_1, kLoadByResourceId, NULL, Scene::SC_ITEIntroCave1Proc, false, kTransitionFadeNoInterface, 0}, + {RID_ITE_CAVE_SCENE_2, kLoadByResourceId, NULL, Scene::SC_ITEIntroCave2Proc, false, kTransitionNoFade, 0}, + {RID_ITE_CAVE_SCENE_3, kLoadByResourceId, NULL, Scene::SC_ITEIntroCave3Proc, false, kTransitionNoFade, 0}, + {RID_ITE_CAVE_SCENE_4, kLoadByResourceId, NULL, Scene::SC_ITEIntroCave4Proc, false, kTransitionNoFade, 0}, + {RID_ITE_VALLEY_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroValleyProc, false, kTransitionFadeNoInterface, 0}, + {RID_ITE_TREEHOUSE_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroTreeHouseProc, false, kTransitionNoFade, 0}, + {RID_ITE_FAIREPATH_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroFairePathProc, false, kTransitionNoFade, 0}, + {RID_ITE_FAIRETENT_SCENE, kLoadByResourceId, NULL, Scene::SC_ITEIntroFaireTentProc, false, kTransitionNoFade, 0} }; int Scene::ITEStartProc() { size_t n_introscenes; size_t i; - SCENE_QUEUE first_scene; - SCENE_QUEUE tempScene; + LoadSceneParams firstScene; + LoadSceneParams tempScene; n_introscenes = ARRAYSIZE(ITE_IntroList); for (i = 0; i < n_introscenes; i++) { tempScene = ITE_IntroList[i]; - tempScene.scene_n = RSC_ConvertID(tempScene.scene_n); + tempScene.sceneDescriptor = RSC_ConvertID(tempScene.sceneDescriptor); _vm->_scene->queueScene(&tempScene); } - first_scene.load_flag = BY_SCENE; - first_scene.scene_n = _vm->getStartSceneNumber(); - first_scene.scene_skiptarget = 1; - first_scene.scene_proc = NULL; - first_scene.fadeType = SCENE_FADE; + firstScene.loadFlag = kLoadBySceneNumber; + firstScene.sceneDescriptor = _vm->getStartSceneNumber(); + firstScene.sceneSkipTarget = true; + firstScene.sceneProc = NULL; + firstScene.transitionType = kTransitionFade; + firstScene.actorsEntrance = 0; - _vm->_scene->queueScene(&first_scene); + _vm->_scene->queueScene(&firstScene); return SUCCESS; } -EVENT *Scene::ITEQueueDialogue(EVENT *q_event, SCENE_INFO *scene_info, int n_dialogues, const INTRO_DIALOGUE dialogue[]) { +EVENT *Scene::ITEQueueDialogue(EVENT *q_event, int n_dialogues, const INTRO_DIALOGUE dialogue[]) { TEXTLIST_ENTRY text_entry; TEXTLIST_ENTRY *entry_p; EVENT event; @@ -96,7 +97,7 @@ EVENT *Scene::ITEQueueDialogue(EVENT *q_event, SCENE_INFO *scene_info, int n_dia for (i = 0; i < n_dialogues; i++) { text_entry.string = dialogue[i].i_str; - entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry); + entry_p = _vm->textAddEntry(_textList, &text_entry); // Display text event.type = ONESHOT_EVENT; @@ -154,7 +155,7 @@ enum { // Queue a page of credits text. The original interpreter did word-wrapping // automatically. We currently don't. -EVENT *Scene::ITEQueueCredits(SCENE_INFO *scene_info, int delta_time, int duration, int n_credits, const INTRO_CREDIT credits[]) { +EVENT *Scene::ITEQueueCredits(int delta_time, int duration, int n_credits, const INTRO_CREDIT credits[]) { int game; // The assumption here is that all WyrmKeep versions have the same @@ -240,7 +241,7 @@ EVENT *Scene::ITEQueueCredits(SCENE_INFO *scene_info, int delta_time, int durati text_entry.font_id = font; text_entry.text_y = y; - entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry); + entry_p = _vm->textAddEntry(_textList, &text_entry); // Display text event.type = ONESHOT_EVENT; @@ -266,12 +267,12 @@ EVENT *Scene::ITEQueueCredits(SCENE_INFO *scene_info, int delta_time, int durati return q_event; } -int Scene::SC_ITEIntroAnimProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroAnimProc(param, scene_info); +int Scene::SC_ITEIntroAnimProc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroAnimProc(param); } // Handles the introductory Dreamer's Guild / NWC logo animation scene. -int Scene::ITEIntroAnimProc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroAnimProc(int param) { EVENT event; EVENT *q_event; @@ -347,12 +348,12 @@ int Scene::ITEIntroAnimProc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroCave1Proc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroCave1Proc(param, scene_info); +int Scene::SC_ITEIntroCave1Proc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroCave1Proc(param); } // Handles first introductory cave painting scene -int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroCave1Proc(int param) { EVENT event; EVENT *q_event; int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0; @@ -414,7 +415,7 @@ int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->queue(&event); // Queue narrator dialogue list - q_event = ITEQueueDialogue(q_event, scene_info, n_dialogues, dialogue[lang]); + q_event = ITEQueueDialogue(q_event, n_dialogues, dialogue[lang]); // End scene after last dialogue over event.type = ONESHOT_EVENT; @@ -435,12 +436,12 @@ int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroCave2Proc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroCave2Proc(param, scene_info); +int Scene::SC_ITEIntroCave2Proc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroCave2Proc(param); } // Handles second introductory cave painting scene -int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroCave2Proc(int param) { EVENT event; EVENT *q_event; int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0; @@ -499,7 +500,7 @@ int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue narrator dialogue list - q_event = ITEQueueDialogue(q_event, scene_info, n_dialogues, dialogue[lang]); + q_event = ITEQueueDialogue(q_event, n_dialogues, dialogue[lang]); // End scene after last dialogue over event.type = ONESHOT_EVENT; @@ -519,12 +520,12 @@ int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroCave3Proc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroCave3Proc(param, scene_info); +int Scene::SC_ITEIntroCave3Proc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroCave3Proc(param); } // Handles third introductory cave painting scene -int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroCave3Proc(int param) { EVENT event; EVENT *q_event; int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0; @@ -583,7 +584,7 @@ int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue narrator dialogue list - q_event = ITEQueueDialogue(q_event, scene_info, n_dialogues, dialogue[lang]); + q_event = ITEQueueDialogue(q_event, n_dialogues, dialogue[lang]); // End scene after last dialogue over event.type = ONESHOT_EVENT; @@ -603,12 +604,12 @@ int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroCave4Proc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroCave4Proc(param, scene_info); +int Scene::SC_ITEIntroCave4Proc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroCave4Proc(param); } // Handles fourth introductory cave painting scene -int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroCave4Proc(int param) { EVENT event; EVENT *q_event; int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0; @@ -676,7 +677,7 @@ int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue narrator dialogue list - q_event = ITEQueueDialogue(q_event, scene_info, n_dialogues, dialogue[lang]); + q_event = ITEQueueDialogue(q_event, n_dialogues, dialogue[lang]); // End scene after last dialogue over event.type = ONESHOT_EVENT; @@ -696,12 +697,12 @@ int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroValleyProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroValleyProc(param, scene_info); +int Scene::SC_ITEIntroValleyProc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroValleyProc(param); } // Handles intro title scene (valley overlook) -int Scene::ITEIntroValleyProc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroValleyProc(int param) { EVENT event; EVENT *q_event; @@ -782,7 +783,7 @@ int Scene::ITEIntroValleyProc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue game credits list - q_event = ITEQueueCredits(scene_info, 9000, CREDIT_DURATION1, n_credits, credits); + q_event = ITEQueueCredits(9000, CREDIT_DURATION1, n_credits, credits); // End scene after credit display event.type = ONESHOT_EVENT; @@ -802,12 +803,12 @@ int Scene::ITEIntroValleyProc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroTreeHouseProc(param, scene_info); +int Scene::SC_ITEIntroTreeHouseProc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroTreeHouseProc(param); } // Handles second intro credit screen (treehouse view) -int Scene::ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroTreeHouseProc(int param) { EVENT event; EVENT *q_event; @@ -866,8 +867,8 @@ int Scene::ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue game credits list - q_event = ITEQueueCredits(scene_info, DISSOLVE_DURATION + 2000, CREDIT_DURATION1, n_credits1, credits1); - q_event = ITEQueueCredits(scene_info, DISSOLVE_DURATION + 7000, CREDIT_DURATION1, n_credits2, credits2); + q_event = ITEQueueCredits(DISSOLVE_DURATION + 2000, CREDIT_DURATION1, n_credits1, credits1); + q_event = ITEQueueCredits(DISSOLVE_DURATION + 7000, CREDIT_DURATION1, n_credits2, credits2); // End scene after credit display event.type = ONESHOT_EVENT; @@ -887,12 +888,12 @@ int Scene::ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroFairePathProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroFairePathProc(param, scene_info); +int Scene::SC_ITEIntroFairePathProc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroFairePathProc(param); } // Handles third intro credit screen (path to puzzle tent) -int Scene::ITEIntroFairePathProc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroFairePathProc(int param) { EVENT event; EVENT *q_event; @@ -944,8 +945,8 @@ int Scene::ITEIntroFairePathProc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->chain(q_event, &event); // Queue game credits list - q_event = ITEQueueCredits(scene_info, DISSOLVE_DURATION + 2000, CREDIT_DURATION1, n_credits1, credits1); - q_event = ITEQueueCredits(scene_info, DISSOLVE_DURATION + 7000, CREDIT_DURATION1, n_credits2, credits2); + q_event = ITEQueueCredits(DISSOLVE_DURATION + 2000, CREDIT_DURATION1, n_credits1, credits1); + q_event = ITEQueueCredits(DISSOLVE_DURATION + 7000, CREDIT_DURATION1, n_credits2, credits2); // End scene after credit display event.type = ONESHOT_EVENT; @@ -965,12 +966,12 @@ int Scene::ITEIntroFairePathProc(int param, SCENE_INFO *scene_info) { return 0; } -int Scene::SC_ITEIntroFaireTentProc(int param, SCENE_INFO *scene_info, void *refCon) { - return ((Scene *)refCon)->ITEIntroFaireTentProc(param, scene_info); +int Scene::SC_ITEIntroFaireTentProc(int param, void *refCon) { + return ((Scene *)refCon)->ITEIntroFaireTentProc(param); } // Handles fourth intro credit screen (treehouse view) -int Scene::ITEIntroFaireTentProc(int param, SCENE_INFO *scene_info) { +int Scene::ITEIntroFaireTentProc(int param) { EVENT event; EVENT *q_event; EVENT *q_event_start; diff --git a/saga/render.cpp b/saga/render.cpp index 93b4068eed..eab1884729 100644 --- a/saga/render.cpp +++ b/saga/render.cpp @@ -96,7 +96,6 @@ bool Render::initialized() { int Render::drawScene() { SURFACE *backbuf_surface; - SCENE_INFO scene_info; SCENE_BGINFO bg_info; Point bg_pt; char txt_buf[20]; @@ -140,9 +139,7 @@ int Render::drawScene() { } // Draw queued text strings - _vm->_scene->getInfo(&scene_info); - - _vm->textDrawList(scene_info.text_list, backbuf_surface); + _vm->textDrawList(_vm->_scene->_textList, backbuf_surface); // Handle user input _vm->processInput(); diff --git a/saga/saga.h b/saga/saga.h index 081d820275..11027dd25a 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -433,8 +433,14 @@ public: virtual ~SagaEngine(); void shutDown() { _quit = true; } - void save(); - void load(); + void save() { //TODO: remove + save("iteSCUMMVM.sav"); + } + void load() { //TODO: remove + load("iteSCUMMVM.sav"); + } + void save(const char *fileName); + void load(const char *fileName); int _soundEnabled; int _musicEnabled; diff --git a/saga/saveload.cpp b/saga/saveload.cpp index 37d1933991..36c397054f 100644 --- a/saga/saveload.cpp +++ b/saga/saveload.cpp @@ -39,26 +39,24 @@ namespace Saga { -void SagaEngine::save() { +void SagaEngine::save(const char *fileName) { File out; - out.open("iteSCUMMVM.sav", File::kFileWriteMode); + out.open(fileName, File::kFileWriteMode); //TODO: version number - out.writeSint16LE(_script->_commonBufferSize); - // Surrounding scene out.writeSint32LE(_scene->getOutsetSceneNumber()); - out.writeSint32LE(0); // Inset scene out.writeSint32LE(_scene->currentSceneNumber()); - out.writeSint32LE(0); uint16 i; _actor->saveState(out); + out.writeSint16LE(_script->_commonBufferSize); + for (i = 0; i < _script->_commonBufferSize; i++) out.writeByte(_script->_commonBuffer[i]); @@ -68,36 +66,33 @@ void SagaEngine::save() { out.close(); } -void SagaEngine::load() { +void SagaEngine::load(const char *fileName) { File in; int commonBufferSize; - int scenenum, inset; + int sceneNumber, insetSceneNumber; int mapx, mapy; + uint16 i; - in.open("iteSCUMMVM.sav"); + in.open(fileName); if (!in.isOpen()) return; - commonBufferSize = in.readSint16LE(); // Surrounding scene - scenenum = in.readSint32LE(); - in.readSint32LE(); + sceneNumber = in.readSint32LE(); // Inset scene - inset = in.readSint32LE(); - in.readSint32LE(); - - debug(0, "scene: %d out: %d", scenenum, inset); + insetSceneNumber = in.readSint32LE(); - uint16 i; + debug(0, "scene: #%d inset scene: #%d", sceneNumber, insetSceneNumber); - _interface->clearInventory(); //TODO: interface load-save-state + _interface->clearInventory(); _actor->loadState(in); + commonBufferSize = in.readSint16LE(); for (i = 0; i < commonBufferSize; i++) _script->_commonBuffer[i] = in.readByte(); @@ -108,20 +103,18 @@ void SagaEngine::load() { _isoMap->setMapPosition(mapx, mapy); - // FIXME: When save/load screen will be implemented we should - // call these after that screen left by user - _interface->draw(); - - // FIXME: hmmm... now we always require actorsEntrance to be defined - // so no way to restore at arbitrary position _scene->clearSceneQueue(); - _scene->changeScene(scenenum, 0); + _scene->changeScene(sceneNumber, ACTOR_NO_ENTRANCE, kTransitionNoFade); - if (inset != scenenum) { + if (insetSceneNumber != sceneNumber) { _render->drawScene(); _scene->clearSceneQueue(); - _scene->changeScene(inset, 0); + _scene->changeScene(insetSceneNumber, ACTOR_NO_ENTRANCE, kTransitionNoFade); } + + // FIXME: When save/load screen will be implemented we should + // call these after that screen left by user + _interface->draw(); } } // End of namespace Saga diff --git a/saga/scene.cpp b/saga/scene.cpp index a9c2e33f86..4c33ee59ce 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -86,6 +86,7 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { for (i = 0; i < _sceneMax; i++) { _sceneLUT[i] = readS.readUint16(); + debug(8, "sceneNumber %i has resourceId %i", i, _sceneLUT[i]); } free(scene_lut_p); @@ -108,8 +109,8 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { _sceneNumber = 0; _sceneResourceId = 0; _inGame = false; - _loadDesc = false; - memset(&_desc, 0, sizeof(_desc)); + _loadDescription = false; + memset(&_sceneDescription, 0, sizeof(_sceneDescription)); _resListEntries = 0; _resList = NULL; _animEntries = 0; @@ -130,37 +131,17 @@ Scene::~Scene() { } } -int Scene::queueScene(SCENE_QUEUE *scene_queue) { - assert(_initialized); - assert(scene_queue != NULL); - - _sceneQueue.push_back(*scene_queue); - return SUCCESS; -} - -int Scene::clearSceneQueue() { - assert(_initialized); - - _sceneQueue.clear(); - - return SUCCESS; -} - -int Scene::startScene() { +void Scene::startScene() { SceneQueueList::iterator queueIterator; - SCENE_QUEUE *scene_qdat; + LoadSceneParams *sceneQueue; EVENT event; - assert(_initialized); - if (_sceneLoaded) { - warning("Scene::start(): Error: Can't start game...scene already loaded"); - return FAILURE; + error("Scene::start(): Error: Can't start game...scene already loaded"); } if (_inGame) { - warning("Scene::start(): Error: Can't start game...game already started"); - return FAILURE; + error("Scene::start(): Error: Can't start game...game already started"); } // Hide cursor during intro @@ -177,38 +158,31 @@ int Scene::startScene() { IHNMStartProc(); break; default: - warning("Scene::start(): Error: Can't start game... gametype not supported"); + error("Scene::start(): Error: Can't start game... gametype not supported"); break; } // Load the head in scene queue queueIterator = _sceneQueue.begin(); if (queueIterator == _sceneQueue.end()) { - return SUCCESS; + return; } - scene_qdat = queueIterator.operator->(); - assert(scene_qdat != NULL); + sceneQueue = queueIterator.operator->(); - loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->sceneDescription, scene_qdat->fadeType, 0); - - return SUCCESS; + loadScene(sceneQueue); } -int Scene::nextScene() { +void Scene::nextScene() { SceneQueueList::iterator queueIterator; - SCENE_QUEUE *scene_qdat; - - assert(_initialized); + LoadSceneParams *sceneQueue; if (!_sceneLoaded) { - warning("Scene::next(): Error: Can't advance scene...no scene loaded"); - return FAILURE; + error("Scene::next(): Error: Can't advance scene...no scene loaded"); } if (_inGame) { - warning("Scene::next(): Error: Can't advance scene...game already started"); - return FAILURE; + error("Scene::next(): Error: Can't advance scene...game already started"); } endScene(); @@ -216,100 +190,82 @@ int Scene::nextScene() { // Delete the current head in scene queue queueIterator = _sceneQueue.begin(); if (queueIterator == _sceneQueue.end()) { - return SUCCESS; + return; } queueIterator = _sceneQueue.erase(queueIterator); if (queueIterator == _sceneQueue.end()) { - return SUCCESS; + return; } // Load the head in scene queue - scene_qdat = queueIterator.operator->(); - assert(scene_qdat != NULL); + sceneQueue = queueIterator.operator->(); - loadScene(scene_qdat->scene_n, scene_qdat->load_flag, scene_qdat->scene_proc, scene_qdat->sceneDescription, scene_qdat->fadeType, 0); - - return SUCCESS; + loadScene(sceneQueue); } -int Scene::skipScene() { +void Scene::skipScene() { SceneQueueList::iterator queueIterator; - SCENE_QUEUE *scene_qdat = NULL; - SCENE_QUEUE *skip_qdat = NULL; + LoadSceneParams *sceneQueue = NULL; + LoadSceneParams *skipQueue = NULL; assert(_initialized); if (!_sceneLoaded) { - warning("Scene::skip(): Error: Can't skip scene...no scene loaded"); - return FAILURE; + error("Scene::skip(): Error: Can't skip scene...no scene loaded"); } if (_inGame) { - warning("Scene::skip(): Error: Can't skip scene...game already started"); - return FAILURE; + error("Scene::skip(): Error: Can't skip scene...game already started"); } // Walk down scene queue and try to find a skip target queueIterator = _sceneQueue.begin(); if (queueIterator == _sceneQueue.end()) { - warning("Scene::skip(): Error: Can't skip scene...no scenes in queue"); - return FAILURE; + error("Scene::skip(): Error: Can't skip scene...no scenes in queue"); } ++queueIterator; while (queueIterator != _sceneQueue.end()) { - scene_qdat = queueIterator.operator->(); - assert(scene_qdat != NULL); + sceneQueue = queueIterator.operator->(); + assert(sceneQueue != NULL); - if (scene_qdat->scene_skiptarget) { - skip_qdat = scene_qdat; + if (sceneQueue->sceneSkipTarget) { + skipQueue = sceneQueue; break; } ++queueIterator; } // If skip target found, remove preceding scenes and load - if (skip_qdat != NULL) { + if (skipQueue != NULL) { _sceneQueue.erase(_sceneQueue.begin(), queueIterator); endScene(); - loadScene(skip_qdat->scene_n, skip_qdat->load_flag, skip_qdat->scene_proc, skip_qdat->sceneDescription, skip_qdat->fadeType, 0); + loadScene(skipQueue); } - // Search for a scene to skip to - - return SUCCESS; } -int Scene::changeScene(int sceneNumber, int actorsEntrance, int fadeIn) { - assert(_initialized); +void Scene::changeScene(uint16 sceneNumber, int actorsEntrance, SceneTransitionType transitionType) { + LoadSceneParams sceneParams; - if (!_sceneLoaded) { - warning("Scene::changeScene(): Error: Can't change scene. No scene currently loaded. Game in invalid state"); - return FAILURE; - } - - if ((sceneNumber < 0) || (sceneNumber > _sceneMax)) { - warning("Scene::changeScene(): Error: Can't change scene. Invalid scene number"); - return FAILURE; - } - - if (_sceneLUT[sceneNumber] == 0) { - warning("Scene::changeScene(): Error: Can't change scene; invalid scene descriptor resource number (0)"); - return FAILURE; - } + sceneParams.actorsEntrance = actorsEntrance; + sceneParams.loadFlag = kLoadBySceneNumber; + sceneParams.sceneDescriptor = sceneNumber; + sceneParams.transitionType = transitionType; + sceneParams.sceneProc = NULL; + sceneParams.sceneSkipTarget = false; endScene(); - loadScene(sceneNumber, BY_SCENE, NULL, NULL, fadeIn, actorsEntrance); + loadScene(&sceneParams); - return SUCCESS; } void Scene::getSlopes(int &beginSlope, int &endSlope) { - beginSlope = _vm->getSceneHeight() - _desc.beginSlope; - endSlope = _vm->getSceneHeight() - _desc.endSlope; + beginSlope = _vm->getSceneHeight() - _sceneDescription.beginSlope; + endSlope = _vm->getSceneHeight() - _sceneDescription.endSlope; } int Scene::getBGInfo(SCENE_BGINFO *bginfo) { @@ -434,78 +390,50 @@ void Scene::initDoorsState() { memcpy(_sceneDoors, initSceneDoors, sizeof (_sceneDoors) ); } -int Scene::getInfo(SCENE_INFO *si) { - assert(_initialized); - assert(si != NULL); - - si->text_list = _textList; - - return SUCCESS; -} - -int Scene::getSceneLUT(int scene_num) { - assert((scene_num > 0) && (scene_num < _sceneMax)); - - return _sceneLUT[scene_num]; -} - -int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneDescription *scene_desc_param, int fadeType, int actorsEntrance) { - SCENE_INFO scene_info; - uint32 resourceId = 0; +void Scene::loadScene(LoadSceneParams *loadSceneParams) { int result; int i; EVENT event; EVENT *q_event; static PALENTRY current_pal[PAL_ENTRIES]; - assert(_initialized); - if (_sceneLoaded) { - warning("Scene::loadScene(): Error, a scene is already loaded"); - return FAILURE; + error("Scene::loadScene(): Error, a scene is already loaded"); } - _loadDesc = true; - _sceneNumber = -1; + _loadDescription = true; - switch (load_flag) { - case BY_RESOURCE: - resourceId = scene_num; + switch (loadSceneParams->loadFlag) { + case kLoadByResourceId: + _sceneNumber = 0; // original assign zero for loaded by resource id + _sceneResourceId = loadSceneParams->sceneDescriptor; break; - case BY_SCENE: - assert((scene_num > 0) && (scene_num < _sceneMax)); - resourceId = _sceneLUT[scene_num]; - _sceneNumber = scene_num; + case kLoadBySceneNumber: + _sceneNumber = loadSceneParams->sceneDescriptor; + _sceneResourceId = getSceneResourceId(_sceneNumber); break; - case BY_DESC: - assert(scene_desc_param != NULL); - assert(scene_desc_param->resList != NULL); - _loadDesc = false; - _desc = *scene_desc_param; - _resList = scene_desc_param->resList; - _resListEntries = scene_desc_param->resListCnt; - break; - default: - warning("Scene::loadScene(): Error: Invalid scene load flag"); - return FAILURE; + case kLoadByDescription: + _sceneNumber = -1; + _sceneResourceId = -1; + assert(loadSceneParams->sceneDescription != NULL); + assert(loadSceneParams->sceneDescription->resList != NULL); + _loadDescription = false; + _sceneDescription = *loadSceneParams->sceneDescription; + _resList = loadSceneParams->sceneDescription->resList; + _resListEntries = loadSceneParams->sceneDescription->resListCnt; break; } // Load scene descriptor and resource list resources - if (_loadDesc) { - - _sceneResourceId = resourceId; - assert(_sceneResourceId != 0); - debug(0, "Loading scene resource %u:", resourceId); + if (_loadDescription) { + debug(0, "Loading scene resource %u:", _sceneResourceId); - if (loadSceneDescriptor(resourceId) != SUCCESS) { - warning("Scene::loadScene(): Error reading scene descriptor"); - return FAILURE; + if (loadSceneDescriptor(_sceneResourceId) != SUCCESS) { + error("Scene::loadScene(): Error reading scene descriptor"); } - if (loadSceneResourceList(_desc.resListRN) != SUCCESS) { - warning("Scene::loadScene(): Error reading scene resource list"); - return FAILURE; + if (loadSceneResourceList(_sceneDescription.resListRN) != SUCCESS) { + error("Scene::loadScene(): Error reading scene resource list"); } } else { debug(0, "Loading memory scene resource."); @@ -516,18 +444,16 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD result = RSC_LoadResource(_sceneContext, _resList[i].res_number, &_resList[i].res_data, &_resList[i].res_data_len); if (result != SUCCESS) { - warning("Scene::loadScene(): Error: Allocation failure loading scene resource list"); - return FAILURE; + error("Scene::loadScene(): Error: Allocation failure loading scene resource list"); } } // Process resources from scene resource list if (processSceneResources() != SUCCESS) { - warning("Scene::loadScene(): Error loading scene resources"); - return FAILURE; + error("Scene::loadScene(): Error loading scene resources"); } - if (_desc.flags & kSceneFlagISO) { + if (_sceneDescription.flags & kSceneFlagISO) { _outsetSceneNumber = _sceneNumber; } else { if (!(_bg.w < _vm->getDisplayWidth() || _bg.h < _vm->getSceneHeight())) @@ -537,7 +463,8 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD _sceneLoaded = true; q_event = NULL; - if (fadeType == SCENE_FADE || fadeType == SCENE_FADE_NO_INTERFACE) { + if (loadSceneParams->transitionType == kTransitionFade || + loadSceneParams->transitionType == kTransitionFadeNoInterface) { _vm->_interface->rememberMode(); _vm->_interface->setMode(kPanelFade, true); @@ -552,7 +479,7 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD event.data = current_pal; q_event = _vm->_events->queue(&event); - if (fadeType != SCENE_FADE_NO_INTERFACE) { + if (loadSceneParams->transitionType != kTransitionFadeNoInterface) { // Activate user interface event.type = IMMEDIATE_EVENT; event.code = INTERFACE_EVENT; @@ -581,22 +508,23 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD } // Start the scene pre script, but stay with black palette - if (_desc.startScriptEntrypointNumber > 0) { + if (_sceneDescription.startScriptEntrypointNumber > 0) { event.type = ONESHOT_EVENT; event.code = SCRIPT_EVENT; event.op = EVENT_EXEC_BLOCKING; event.time = 0; - event.param = _desc.scriptModuleNumber; - event.param2 = _desc.startScriptEntrypointNumber; + event.param = _sceneDescription.scriptModuleNumber; + event.param2 = _sceneDescription.startScriptEntrypointNumber; event.param3 = 0; // Action event.param4 = _sceneNumber; // Object - event.param5 = actorsEntrance; // With Object + event.param5 = loadSceneParams->actorsEntrance; // With Object event.param6 = 0; // Actor q_event = _vm->_events->chain(q_event, &event); } - if (fadeType == SCENE_FADE || fadeType == SCENE_FADE_NO_INTERFACE) { + if (loadSceneParams->transitionType == kTransitionFade || + loadSceneParams->transitionType == kTransitionFadeNoInterface) { // Fade in from black to the scene background palette event.type = IMMEDIATE_EVENT; event.code = PAL_EVENT; @@ -608,9 +536,8 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD q_event = _vm->_events->chain(q_event, &event); } - getInfo(&scene_info); - if (scene_proc == NULL) { + if (loadSceneParams->sceneProc == NULL) { if (!_inGame) { _inGame = true; _vm->_interface->setMode(kPanelInventory); @@ -619,10 +546,10 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD _vm->_sound->stopVoice(); _vm->_sound->stopSound(); - if (_desc.musicRN >= 0) { + if (_sceneDescription.musicRN >= 0) { event.type = ONESHOT_EVENT; event.code = MUSIC_EVENT; - event.param = _desc.musicRN; + event.param = _sceneDescription.musicRN; event.param2 = MUSIC_DEFAULT; event.op = EVENT_PLAY; event.time = 0; @@ -669,16 +596,16 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD _vm->_events->chain(q_event, &event); // Start the scene main script - if (_desc.sceneScriptEntrypointNumber > 0) { + if (_sceneDescription.sceneScriptEntrypointNumber > 0) { event.type = ONESHOT_EVENT; event.code = SCRIPT_EVENT; event.op = EVENT_EXEC_NONBLOCKING; event.time = 0; - event.param = _desc.scriptModuleNumber; - event.param2 = _desc.sceneScriptEntrypointNumber; + event.param = _sceneDescription.scriptModuleNumber; + event.param2 = _sceneDescription.sceneScriptEntrypointNumber; event.param3 = kVerbEnter; // Action event.param4 = _sceneNumber; // Object - event.param5 = actorsEntrance; // With Object + event.param5 = loadSceneParams->actorsEntrance; // With Object event.param6 = 0; // Actor _vm->_events->queue(&event); @@ -687,20 +614,19 @@ int Scene::loadScene(int scene_num, int load_flag, SCENE_PROC scene_proc, SceneD debug(0, "Scene started"); } else { - scene_proc(SCENE_BEGIN, &scene_info, this); + loadSceneParams->sceneProc(SCENE_BEGIN, this); } - // We probably don't want "followers" to go into scene -1. At the very + // We probably don't want "followers" to go into scene -1 , 0. At the very // least we don't want garbage to be drawn that early in the ITE intro. - if (_sceneNumber != -1) - _vm->_actor->updateActorsScene(actorsEntrance); + if (_sceneNumber > 0) + _vm->_actor->updateActorsScene(loadSceneParams->actorsEntrance); - if (_desc.flags & kSceneFlagShowCursor) + if (_sceneDescription.flags & kSceneFlagShowCursor) _vm->_interface->activate(); - return SUCCESS; } int Scene::loadSceneDescriptor(uint32 res_number) { @@ -716,14 +642,14 @@ int Scene::loadSceneDescriptor(uint32 res_number) { MemoryReadStreamEndian readS(scene_desc_data, scene_desc_len, IS_BIG_ENDIAN); - _desc.flags = readS.readSint16(); - _desc.resListRN = readS.readSint16(); - _desc.endSlope = readS.readSint16(); - _desc.beginSlope = readS.readSint16(); - _desc.scriptModuleNumber = readS.readUint16(); - _desc.sceneScriptEntrypointNumber = readS.readUint16(); - _desc.startScriptEntrypointNumber = readS.readUint16(); - _desc.musicRN = readS.readSint16(); + _sceneDescription.flags = readS.readSint16(); + _sceneDescription.resListRN = readS.readSint16(); + _sceneDescription.endSlope = readS.readSint16(); + _sceneDescription.beginSlope = readS.readSint16(); + _sceneDescription.scriptModuleNumber = readS.readUint16(); + _sceneDescription.sceneScriptEntrypointNumber = readS.readUint16(); + _sceneDescription.startScriptEntrypointNumber = readS.readUint16(); + _sceneDescription.musicRN = readS.readSint16(); RSC_FreeResource(scene_desc_data); @@ -828,7 +754,7 @@ int Scene::processSceneResources() { _actionMap->load(res_data, res_data_len); break; case SAGA_ISO_IMAGES: - if (!(_desc.flags & kSceneFlagISO)) { + if (!(_sceneDescription.flags & kSceneFlagISO)) { error("Scene::ProcessSceneResources(): not Iso mode"); } @@ -837,7 +763,7 @@ int Scene::processSceneResources() { _vm->_isoMap->loadImages(res_data, res_data_len); break; case SAGA_ISO_MAP: - if (!(_desc.flags & kSceneFlagISO)) { + if (!(_sceneDescription.flags & kSceneFlagISO)) { error("Scene::ProcessSceneResources(): not Iso mode"); } @@ -846,7 +772,7 @@ int Scene::processSceneResources() { _vm->_isoMap->loadMap(res_data, res_data_len); break; case SAGA_ISO_PLATFORMS: - if (!(_desc.flags & kSceneFlagISO)) { + if (!(_sceneDescription.flags & kSceneFlagISO)) { error("Scene::ProcessSceneResources(): not Iso mode"); } @@ -855,7 +781,7 @@ int Scene::processSceneResources() { _vm->_isoMap->loadPlatforms(res_data, res_data_len); break; case SAGA_ISO_METATILES: - if (!(_desc.flags & kSceneFlagISO)) { + if (!(_sceneDescription.flags & kSceneFlagISO)) { error("Scene::ProcessSceneResources(): not Iso mode"); } @@ -891,7 +817,7 @@ int Scene::processSceneResources() { } break; case SAGA_ISO_MULTI: - if (!(_desc.flags & kSceneFlagISO)) { + if (!(_sceneDescription.flags & kSceneFlagISO)) { error("Scene::ProcessSceneResources(): not Iso mode"); } @@ -926,7 +852,7 @@ int Scene::draw(SURFACE *dst_s) { _vm->_render->getBufferInfo(&buf_info); - if (_desc.flags & kSceneFlagISO) { + if (_sceneDescription.flags & kSceneFlagISO) { _vm->_isoMap->adjustScroll(false); _vm->_isoMap->draw(dst_s); } else { @@ -937,22 +863,16 @@ int Scene::draw(SURFACE *dst_s) { return SUCCESS; } -int Scene::endScene() { - SCENE_INFO scene_info; - - assert(_initialized); +void Scene::endScene() { if (!_sceneLoaded) { - warning("Scene::endScene(): No scene to end"); - return -1; + error("Scene::endScene(): No scene to end"); } debug(0, "Ending scene..."); if (_sceneProc != NULL) { - getInfo(&scene_info); - - _sceneProc(SCENE_END, &scene_info, this); + _sceneProc(SCENE_END, this); } // @@ -978,7 +898,7 @@ int Scene::endScene() { } // Free scene resource list - if (_loadDesc) { + if (_loadDescription) { free(_resList); } @@ -1003,7 +923,6 @@ int Scene::endScene() { _sceneLoaded = false; - return SUCCESS; } void Scene::cmdSceneChange(int argc, const char **argv) { @@ -1018,11 +937,7 @@ void Scene::cmdSceneChange(int argc, const char **argv) { clearSceneQueue(); - if (changeScene(scene_num, 0) == SUCCESS) { - _vm->_console->DebugPrintf("Scene changed.\n"); - } else { - _vm->_console->DebugPrintf("Couldn't change scene!\n"); - } + changeScene(scene_num, 0, kTransitionNoFade); } void Scene::cmdSceneInfo() { @@ -1031,14 +946,14 @@ void Scene::cmdSceneInfo() { _vm->_console->DebugPrintf(fmt, "Scene number:", _sceneNumber); _vm->_console->DebugPrintf(fmt, "Descriptor ResourceId:", _sceneResourceId); _vm->_console->DebugPrintf("-------------------------\n"); - _vm->_console->DebugPrintf(fmt, "Flags:", _desc.flags); - _vm->_console->DebugPrintf(fmt, "Resource list R#:", _desc.resListRN); - _vm->_console->DebugPrintf(fmt, "End slope:", _desc.endSlope); - _vm->_console->DebugPrintf(fmt, "Begin slope:", _desc.beginSlope); - _vm->_console->DebugPrintf(fmt, "scriptModuleNumber:", _desc.scriptModuleNumber); - _vm->_console->DebugPrintf(fmt, "sceneScriptEntrypointNumber:", _desc.sceneScriptEntrypointNumber); - _vm->_console->DebugPrintf(fmt, "startScriptEntrypointNumber:", _desc.startScriptEntrypointNumber); - _vm->_console->DebugPrintf(fmt, "Music R#", _desc.musicRN); + _vm->_console->DebugPrintf(fmt, "Flags:", _sceneDescription.flags); + _vm->_console->DebugPrintf(fmt, "Resource list R#:", _sceneDescription.resListRN); + _vm->_console->DebugPrintf(fmt, "End slope:", _sceneDescription.endSlope); + _vm->_console->DebugPrintf(fmt, "Begin slope:", _sceneDescription.beginSlope); + _vm->_console->DebugPrintf(fmt, "scriptModuleNumber:", _sceneDescription.scriptModuleNumber); + _vm->_console->DebugPrintf(fmt, "sceneScriptEntrypointNumber:", _sceneDescription.sceneScriptEntrypointNumber); + _vm->_console->DebugPrintf(fmt, "startScriptEntrypointNumber:", _sceneDescription.startScriptEntrypointNumber); + _vm->_console->DebugPrintf(fmt, "Music R#", _sceneDescription.musicRN); } diff --git a/saga/scene.h b/saga/scene.h index 7405bcea77..6281497fb5 100644 --- a/saga/scene.h +++ b/saga/scene.h @@ -53,18 +53,8 @@ struct SCENE_BGINFO { size_t bg_buflen; }; -struct SCENE_INFO { - SCENE_BGINFO bg_info; - TEXTLIST *text_list; -}; - -typedef int (SCENE_PROC) (int, SCENE_INFO *, void *); +typedef int (SceneProc) (int, void *); -enum SCENE_LOAD_FLAGS { - BY_RESOURCE = 0, - BY_SCENE, - BY_DESC -}; enum SCENE_PROC_PARAMS { SCENE_BEGIN = 0, @@ -166,21 +156,28 @@ struct SCENE_ANIMINFO { typedef SortedList<SCENE_ANIMINFO> SceneAnimInfoList; enum SceneTransitionType { - SCENE_NOFADE = 0, - SCENE_FADE = 1, - SCENE_FADE_NO_INTERFACE = 2 + kTransitionNoFade, + kTransitionFade, + kTransitionFadeNoInterface }; -struct SCENE_QUEUE { - uint32 scene_n; +enum SceneLoadFlags { + kLoadByResourceId, + kLoadBySceneNumber, + kLoadByDescription +}; + +struct LoadSceneParams { + uint32 sceneDescriptor; + SceneLoadFlags loadFlag; SceneDescription* sceneDescription; - int load_flag; - SCENE_PROC *scene_proc; - int scene_skiptarget; - int fadeType; + SceneProc *sceneProc; + bool sceneSkipTarget; + SceneTransitionType transitionType; + int actorsEntrance; }; -typedef Common::List<SCENE_QUEUE> SceneQueueList; +typedef Common::List<LoadSceneParams> SceneQueueList; ///// IHNM-specific stuff #define IHNM_PALFADE_TIME 1000 @@ -227,14 +224,17 @@ class Scene { void cmdSceneChange(int argc, const char **argv); - int startScene(); - int nextScene(); - int skipScene(); - int endScene(); - int queueScene(SCENE_QUEUE *scene_queue); + void startScene(); + void nextScene(); + void skipScene(); + void endScene(); + void queueScene(LoadSceneParams *sceneQueue) { + _sceneQueue.push_back(*sceneQueue); + } + int draw(SURFACE *); - int getFlags() const { return _desc.flags; } - int getScriptModuleNumber() const { return _desc.scriptModuleNumber; } + int getFlags() const { return _sceneDescription.flags; } + int getScriptModuleNumber() const { return _sceneDescription.scriptModuleNumber; } bool isInDemo() { return !_inGame; } void getBGMaskInfo(int &width, int &height, byte *&buffer, size_t &bufferLength); @@ -250,22 +250,28 @@ class Scene { int getBGInfo(SCENE_BGINFO *bginfo); int getBGPal(PALENTRY **pal); - int getInfo(SCENE_INFO *si); void getSlopes(int &beginSlope, int &endSlope); - int clearSceneQueue(void); - int changeScene(int sceneNumber, int actorsEntrance, int fadeIn = SCENE_NOFADE); + void clearSceneQueue(void) { + _sceneQueue.clear(); + } + void changeScene(uint16 sceneNumber, int actorsEntrance, SceneTransitionType transitionType); bool initialized() { return _initialized; } - int getSceneLUT(int num); + int getSceneResourceId(int sceneNumber) { + if ((sceneNumber < 0) || (sceneNumber >= _sceneMax)) { + error("getSceneResourceId: wrong sceneNumber"); + } + return _sceneLUT[sceneNumber]; + } int currentSceneNumber() const { return _sceneNumber; } int getOutsetSceneNumber() const { return _outsetSceneNumber; } int currentSceneResourceId() const { return _sceneResourceId; } private: - int loadScene(int scene, int load_flag, SCENE_PROC scene_proc, SceneDescription *, int fadeIn, int actorsEntrance); + void loadScene(LoadSceneParams *loadSceneParams); int loadSceneDescriptor(uint32 res_number); int loadSceneResourceList(uint32 res_number); void loadSceneEntryList(const byte* resourcePointer, size_t resourceLength); @@ -286,14 +292,13 @@ class Scene { int _outsetSceneNumber; int _sceneResourceId; bool _inGame; - bool _loadDesc; - SceneDescription _desc; + bool _loadDescription; + SceneDescription _sceneDescription; int _resListEntries; SCENE_RESLIST *_resList; int _animEntries; SceneAnimInfoList _animList; - SCENE_PROC *_sceneProc; - TEXTLIST *_textList; + SceneProc *_sceneProc; SCENE_IMAGE _bg; SCENE_IMAGE _bgMask; @@ -305,46 +310,47 @@ class Scene { ObjectMap *_objectMap; SceneEntryList _entryList; StringsTable _sceneStrings; + TEXTLIST *_textList; private: int IHNMStartProc(); int ITEStartProc(); public: - static int SC_IHNMIntroMovieProc1(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_IHNMIntroMovieProc2(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_IHNMIntroMovieProc3(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_IHNMHateProc(int param, SCENE_INFO *scene_info, void *refCon); + static int SC_IHNMIntroMovieProc1(int param, void *refCon); + static int SC_IHNMIntroMovieProc2(int param, void *refCon); + static int SC_IHNMIntroMovieProc3(int param, void *refCon); + static int SC_IHNMHateProc(int param, void *refCon); private: - int IHNMIntroMovieProc1(int param, SCENE_INFO *scene_info); - int IHNMIntroMovieProc2(int param, SCENE_INFO *scene_info); - int IHNMIntroMovieProc3(int param, SCENE_INFO *scene_info); - int IHNMHateProc(int param, SCENE_INFO *scene_info); + int IHNMIntroMovieProc1(int param); + int IHNMIntroMovieProc2(int param); + int IHNMIntroMovieProc3(int param); + int IHNMHateProc(int param); public: - static int SC_ITEIntroAnimProc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroCave1Proc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroCave2Proc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroCave3Proc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroCave4Proc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroValleyProc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroFairePathProc(int param, SCENE_INFO *scene_info, void *refCon); - static int SC_ITEIntroFaireTentProc(int param, SCENE_INFO *scene_info, void *refCon); + static int SC_ITEIntroAnimProc(int param, void *refCon); + static int SC_ITEIntroCave1Proc(int param, void *refCon); + static int SC_ITEIntroCave2Proc(int param, void *refCon); + static int SC_ITEIntroCave3Proc(int param, void *refCon); + static int SC_ITEIntroCave4Proc(int param, void *refCon); + static int SC_ITEIntroValleyProc(int param, void *refCon); + static int SC_ITEIntroTreeHouseProc(int param, void *refCon); + static int SC_ITEIntroFairePathProc(int param, void *refCon); + static int SC_ITEIntroFaireTentProc(int param, void *refCon); private: - EVENT *ITEQueueDialogue(EVENT *q_event, SCENE_INFO *scene_info, int n_dialogues, const INTRO_DIALOGUE dialogue[]); - EVENT *ITEQueueCredits(SCENE_INFO *scene_info, int delta_time, int duration, int n_credits, const INTRO_CREDIT credits[]); - int ITEIntroAnimProc(int param, SCENE_INFO *scene_info); - int ITEIntroCave1Proc(int param, SCENE_INFO *scene_info); - int ITEIntroCave2Proc(int param, SCENE_INFO *scene_info); - int ITEIntroCave3Proc(int param, SCENE_INFO *scene_info); - int ITEIntroCave4Proc(int param, SCENE_INFO *scene_info); - int ITEIntroValleyProc(int param, SCENE_INFO *scene_info); - int ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info); - int ITEIntroFairePathProc(int param, SCENE_INFO *scene_info); - int ITEIntroFaireTentProc(int param, SCENE_INFO *scene_info); + EVENT *ITEQueueDialogue(EVENT *q_event, int n_dialogues, const INTRO_DIALOGUE dialogue[]); + EVENT *ITEQueueCredits(int delta_time, int duration, int n_credits, const INTRO_CREDIT credits[]); + int ITEIntroAnimProc(int param); + int ITEIntroCave1Proc(int param); + int ITEIntroCave2Proc(int param); + int ITEIntroCave3Proc(int param); + int ITEIntroCave4Proc(int param); + int ITEIntroValleyProc(int param); + int ITEIntroTreeHouseProc(int param); + int ITEIntroFairePathProc(int param); + int ITEIntroFaireTentProc(int param); }; diff --git a/saga/sdebug.cpp b/saga/sdebug.cpp index ebc378ea7c..7235023c67 100644 --- a/saga/sdebug.cpp +++ b/saga/sdebug.cpp @@ -45,14 +45,11 @@ int Script::SDebugPrintInstr(ScriptThread *thread) { // int op_offset; int n_switch; int i; - SCENE_INFO si; - - _vm->_scene->getInfo(&si); disp_buf[0] = 0; if (_dbg_txtentry != NULL) { - _vm->textDeleteEntry(si.text_list, _dbg_txtentry); + _vm->textDeleteEntry(_vm->_scene->_textList, _dbg_txtentry); _dbg_txtentry = NULL; } @@ -469,7 +466,7 @@ int Script::SDebugPrintInstr(ScriptThread *thread) { break; } - _dbg_txtentry = _vm->textAddEntry(si.text_list, &tl_e); + _dbg_txtentry = _vm->textAddEntry(_vm->_scene->_textList, &tl_e); _vm->textSetDisplay(_dbg_txtentry, 1); return SUCCESS; diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 434873069c..02881efef5 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -512,7 +512,7 @@ void Script::sfScriptGotoScene(SCRIPTFUNC_PARAMS) { } } - _vm->_scene->changeScene(sceneNumber, entrance, (sceneNumber == RID_ITE_ENDCREDIT_SCENE_1) ? SCENE_FADE : SCENE_NOFADE); + _vm->_scene->changeScene(sceneNumber, entrance, (sceneNumber == RID_ITE_ENDCREDIT_SCENE_1) ? kTransitionFade : kTransitionNoFade); //TODO: placard stuff _pendingVerb = kVerbNone; @@ -718,10 +718,11 @@ void Script::sfScriptMoveTo(SCRIPTFUNC_PARAMS) { } // Script function #31 (0x21) +// Param1: sceneNumber void Script::sfSceneEq(SCRIPTFUNC_PARAMS) { - int16 param = thread->pop(); + int16 sceneNumber = thread->pop(); - if (_vm->_scene->getSceneLUT(param) == _vm->_scene->currentSceneNumber()) + if (_vm->_scene->getSceneResourceId(sceneNumber) == _vm->_scene->currentSceneResourceId()) thread->_returnValue = 1; else thread->_returnValue = 0; @@ -1199,9 +1200,6 @@ void Script::sfPlacard(SCRIPTFUNC_PARAMS) { // but it's close enough for now at least. TEXTLIST_ENTRY text_entry; - SCENE_INFO scene_info; - - _vm->_scene->getInfo(&scene_info); text_entry.color = kITEColorBrightWhite; text_entry.effect_color = kITEColorBlack; @@ -1211,7 +1209,7 @@ void Script::sfPlacard(SCRIPTFUNC_PARAMS) { text_entry.flags = FONT_OUTLINE | FONT_CENTERED; text_entry.string = thread->_strings->getString(stringId); - placardTextEntry = _vm->textAddEntry(scene_info.text_list, &text_entry); + placardTextEntry = _vm->textAddEntry(_vm->_scene->_textList, &text_entry); event.type = ONESHOT_EVENT; event.code = TEXT_EVENT; |