aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2007-08-27 13:04:35 +0000
committerFilippos Karapetis2007-08-27 13:04:35 +0000
commitb39c4cbdbabac991cfafbcf7a007f7a7493221ba (patch)
tree58d4ff7404b12f4b6f1dee8869947971ab4f9419
parentb9be60c0cd2341e6ddba3ac7a3c4dcc7fab2600a (diff)
downloadscummvm-rg350-b39c4cbdbabac991cfafbcf7a007f7a7493221ba.tar.gz
scummvm-rg350-b39c4cbdbabac991cfafbcf7a007f7a7493221ba.tar.bz2
scummvm-rg350-b39c4cbdbabac991cfafbcf7a007f7a7493221ba.zip
Added some skeleton code for the IHNM credits movie. Also, changed the location of the RF_DISABLE_ACTORS is set from loadScene to endScene
svn-id: r28757
-rw-r--r--engines/saga/ihnm_introproc.cpp119
-rw-r--r--engines/saga/scene.cpp52
-rw-r--r--engines/saga/scene.h4
-rw-r--r--engines/saga/sfuncs.cpp9
4 files changed, 177 insertions, 7 deletions
diff --git a/engines/saga/ihnm_introproc.cpp b/engines/saga/ihnm_introproc.cpp
index 5bf9d49391..f4841a34aa 100644
--- a/engines/saga/ihnm_introproc.cpp
+++ b/engines/saga/ihnm_introproc.cpp
@@ -83,6 +83,17 @@ SceneDescription IHNM_IntroMovie4Desc = {
ARRAYSIZE(IHNM_IntroMovie4RL)
};
+SceneResourceData IHNM_CreditsMovieRL[] = {
+ {37, 2, 0, 0, false},
+ {38, 14, 0, 0, false}
+};
+
+SceneDescription IHNM_CredisMovieDesc = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ IHNM_CreditsMovieRL,
+ ARRAYSIZE(IHNM_CreditsMovieRL)
+};
+
// Demo
SceneResourceData IHNMDEMO_IntroMovie1RL[] = {
{19, 2, 0, 0, false} // this scene doesn't have an animation
@@ -111,6 +122,10 @@ LoadSceneParams IHNM_IntroList[] = {
{0, kLoadByDescription, &IHNM_IntroMovie3Desc, Scene::SC_IHNMIntroMovieProc3, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
};
+LoadSceneParams IHNM_CreditsList[] = {
+ {0, kLoadByDescription, &IHNM_CredisMovieDesc, Scene::SC_IHNMCreditsMovieProc, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
+};
+
LoadSceneParams IHNMDEMO_IntroList[] = {
{0, kLoadByDescription, &IHNMDEMO_IntroMovie1Desc, Scene::SC_IHNMIntroMovieProc1, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
{0, kLoadByDescription, &IHNMDEMO_IntroMovie2Desc, Scene::SC_IHNMIntroMovieProc3, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
@@ -120,6 +135,21 @@ LoadSceneParams IHNMDEMO_IntroList[] = {
#define RID_IHNM_INTRO_CUTAWAYS 39
#define RID_IHNMDEMO_INTRO_CUTAWAYS 25
+int Scene::IHNMCreditsProc() {
+ _vm->_anim->setCutAwayMode(kPanelVideo);
+ _vm->_interface->setMode(kPanelVideo);
+
+ // Queue the credits scene
+ if (_vm->getGameId() != GID_IHNM_DEMO) {
+ _vm->_scene->queueScene(&IHNM_CreditsList[0]);
+ } else {
+ // TODO: demo credits
+ //_vm->_scene->queueScene(&IHNMDEMO_CreditsList[0]);
+ }
+
+ return SUCCESS;
+}
+
int Scene::IHNMStartProc() {
size_t n_introscenes;
size_t i;
@@ -158,6 +188,10 @@ int Scene::IHNMStartProc() {
// Load the cutaways for the title screens
_vm->_anim->loadCutawayList(resourcePointer, resourceLength);
+ // Debug
+ //for (int k = 0; k < _vm->_anim->cutawayListLength(); k++) {
+ // printf("%i %i\n", _vm->_anim->cutawayBgResourceID(k), _vm->_anim->cutawayAnimResourceID(k));
+ //}
for (int k = 0; k < _vm->_anim->cutawayListLength(); k++) {
// Scene resources
@@ -481,4 +515,89 @@ int Scene::IHNMIntroMovieProc3(int param) {
return 0;
}
+int Scene::SC_IHNMCreditsMovieProc(int param, void *refCon) {
+ return ((Scene *)refCon)->IHNMCreditsMovieProc(param);
+}
+
+int Scene::IHNMCreditsMovieProc(int param) {
+ Event event;
+ Event *q_event;
+ PalEntry *pal;
+ static PalEntry current_pal[PAL_ENTRIES];
+
+ switch (param) {
+ case SCENE_BEGIN:
+ // Fade to black out of the end movie anim
+ _vm->_gfx->getCurrentPal(current_pal);
+
+ event.type = kEvTContinuous;
+ event.code = kPalEvent;
+ event.op = kEventPalToBlack;
+ event.time = 0;
+ event.duration = IHNM_PALFADE_TIME;
+ event.data = current_pal;
+
+ q_event = _vm->_events->queue(&event);
+
+ event.type = kEvTOneshot;
+ event.code = kMusicEvent;
+ event.param = 0;
+ event.param2 = MUSIC_NORMAL;
+ event.op = kEventPlay;
+ event.time = 0;
+
+ q_event = _vm->_events->chain(q_event, &event);
+
+ // Background for credits scene is the first frame of the credits
+ // animation; display it but don't set palette
+ event.type = kEvTOneshot;
+ event.code = kBgEvent;
+ event.op = kEventDisplay;
+ event.param = kEvPNoSetPalette;
+ event.time = 0;
+
+ q_event = _vm->_events->chain(q_event, &event);
+
+ // Fade in from black to the scene background palette
+ _vm->_scene->getBGPal(pal);
+
+ event.type = kEvTContinuous;
+ event.code = kPalEvent;
+ event.op = kEventBlackToPal;
+ event.time = 0;
+ event.duration = IHNM_PALFADE_TIME;
+ event.data = pal;
+
+ q_event = _vm->_events->chain(q_event, &event);
+
+ event.type = kEvTOneshot;
+ event.code = kAnimEvent;
+ event.op = kEventPlay;
+ event.param = 0;
+ event.time = 0;
+
+ q_event = _vm->_events->chain(q_event, &event);
+
+ // Queue end of scene after a while
+ event.type = kEvTOneshot;
+ event.code = kSceneEvent;
+ event.op = kEventEnd;
+ // TODO
+ if (_vm->getGameId() != GID_IHNM_DEMO)
+ event.time = 12000;
+ else
+ event.time = 12000;
+
+ q_event = _vm->_events->chain(q_event, &event);
+ break;
+ case SCENE_END:
+ _vm->shutDown();
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
} // End of namespace Saga
diff --git a/engines/saga/scene.cpp b/engines/saga/scene.cpp
index c9bcb7858b..f97fabd288 100644
--- a/engines/saga/scene.cpp
+++ b/engines/saga/scene.cpp
@@ -292,6 +292,51 @@ void Scene::startScene() {
loadScene(sceneQueue);
}
+void Scene::creditsScene() {
+ // FIXME: Just shutdown for now
+ _vm->shutDown();
+ return;
+
+ /*
+ SceneQueueList::iterator queueIterator;
+ LoadSceneParams *sceneQueue;
+ Event event;
+
+ // End the last game ending scene
+ _vm->_scene->endScene();
+ // We're not in the game anymore
+ _inGame = false;
+
+ // Hide cursor during credits
+ event.type = kEvTOneshot;
+ event.code = kCursorEvent;
+ event.op = kEventHide;
+ _vm->_events->queue(&event);
+
+ switch (_vm->getGameType()) {
+ case GType_ITE:
+ // Not called by ITE
+ break;
+ case GType_IHNM:
+ IHNMCreditsProc();
+ break;
+ default:
+ error("Scene::creditsScene(): Error: Can't start credits scene... gametype not supported");
+ break;
+ }
+
+ // Load the head in scene queue
+ queueIterator = _sceneQueue.begin();
+ if (queueIterator == _sceneQueue.end()) {
+ return;
+ }
+
+ sceneQueue = queueIterator.operator->();
+
+ loadScene(sceneQueue);
+ */
+}
+
void Scene::nextScene() {
SceneQueueList::iterator queueIterator;
LoadSceneParams *sceneQueue;
@@ -710,9 +755,6 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) {
}
_sceneLoaded = true;
- // Scene is loaded, but don't show actors till the scene's background is drawn
- // via kEventDisplay later on
- _vm->_render->setFlag(RF_DISABLE_ACTORS);
q_event = NULL;
@@ -1180,7 +1222,9 @@ void Scene::endScene() {
_sceneProc(SCENE_END, this);
}
- //
+ // Stop showing actors till the next scene's background is drawn from loadScene
+ _vm->_render->setFlag(RF_DISABLE_ACTORS);
+
_vm->_script->abortAllThreads();
_vm->_script->_skipSpeeches = false;
diff --git a/engines/saga/scene.h b/engines/saga/scene.h
index 47abfcb959..e0508efab0 100644
--- a/engines/saga/scene.h
+++ b/engines/saga/scene.h
@@ -221,6 +221,7 @@ class Scene {
void cmdSceneChange(int argc, const char **argv);
void startScene();
+ void creditsScene();
void nextScene();
void skipScene();
void endScene();
@@ -395,17 +396,20 @@ class Scene {
private:
int IHNMStartProc();
+ int IHNMCreditsProc();
int ITEStartProc();
public:
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_IHNMCreditsMovieProc(int param, void *refCon);
private:
int IHNMIntroMovieProc1(int param);
int IHNMIntroMovieProc2(int param);
int IHNMIntroMovieProc3(int param);
+ int IHNMCreditsMovieProc(int param);
public:
static int SC_ITEIntroAnimProc(int param, void *refCon);
diff --git a/engines/saga/sfuncs.cpp b/engines/saga/sfuncs.cpp
index 01b54e7aaf..723af34d4f 100644
--- a/engines/saga/sfuncs.cpp
+++ b/engines/saga/sfuncs.cpp
@@ -571,13 +571,16 @@ void Script::sfScriptGotoScene(SCRIPTFUNC_PARAMS) {
_vm->_gfx->setCursor(kCursorBusy);
}
- if ((_vm->getGameType() == GType_ITE && sceneNumber < 0) ||
- (_vm->getGameType() == GType_IHNM && sceneNumber == 0)) {
- // TODO: set creditsFlag to true for IHNM
+ if (_vm->getGameType() == GType_ITE && sceneNumber < 0) {
_vm->shutDown();
return;
}
+ if (_vm->getGameType() == GType_IHNM && sceneNumber == 0) {
+ _vm->_scene->creditsScene();
+ return;
+ }
+
// It is possible to leave scene when converse panel is on,
// particulalrly it may happen at Moneychanger tent. This
// prevents this from happening.