aboutsummaryrefslogtreecommitdiff
path: root/saga
diff options
context:
space:
mode:
authorEugene Sandulenko2005-08-05 23:14:11 +0000
committerEugene Sandulenko2005-08-05 23:14:11 +0000
commit005843e55bf7dc8b326d802e75e0caa35816f0de (patch)
tree6eb48f6c6dbe576060c92034077a0eeae076a12b /saga
parent771373bfb92268ea90d2e0aa3760b800eb069f8b (diff)
downloadscummvm-rg350-005843e55bf7dc8b326d802e75e0caa35816f0de.tar.gz
scummvm-rg350-005843e55bf7dc8b326d802e75e0caa35816f0de.tar.bz2
scummvm-rg350-005843e55bf7dc8b326d802e75e0caa35816f0de.zip
o Some cleanup
o Fix warnings o Implemented IHNM changeChapter() o WIP for metaResources svn-id: r18618
Diffstat (limited to 'saga')
-rw-r--r--saga/actor.cpp3
-rw-r--r--saga/game.cpp13
-rw-r--r--saga/interface.h3
-rw-r--r--saga/resnames.h4
-rw-r--r--saga/rscfile.cpp44
-rw-r--r--saga/rscfile.h26
-rw-r--r--saga/saga.cpp2
-rw-r--r--saga/scene.cpp34
-rw-r--r--saga/scene.h2
-rw-r--r--saga/script.h10
10 files changed, 125 insertions, 16 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 1e5be15044..c95bec2039 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -577,7 +577,8 @@ void Actor::updateActorsScene(int actorsEntrance) {
if (actor->flags & kProtagonist) {
actor->finalTarget = actor->location;
_centerActor = _protagonist = actor;
- } else if (_vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
+ } else if (_vm->getGameType() == GType_ITE &&
+ _vm->_scene->currentSceneResourceId() == RID_ITE_OVERMAP_SCENE) {
continue;
}
diff --git a/saga/game.cpp b/saga/game.cpp
index 77cb8daf58..2f9f46cfdf 100644
--- a/saga/game.cpp
+++ b/saga/game.cpp
@@ -325,16 +325,7 @@ static GameFileDescription ITEMULTICD_GameFiles[] = {
{"music.rsc", GAME_MUSICFILE}
};
-// Inherit the Earth - Mac Dreamers version
static GameFileDescription ITEMACCD_G_GameFiles[] = {
- {"ITE Resources", GAME_RESOURCEFILE},
- {"ITE Scripts", GAME_SCRIPTFILE},
- {"ITE Sounds", GAME_SOUNDFILE},
- {"ITE Music", GAME_MUSICFILE_GM},
- {"ITE Voices", GAME_VOICEFILE}
-};
-
-static GameFileDescription ITEMACCD2_G_GameFiles[] = {
{"ITE Resources.bin", GAME_RESOURCEFILE | GAME_MACBINARY},
{"ITE Scripts.bin", GAME_SCRIPTFILE | GAME_MACBINARY},
{"ITE Sounds.bin", GAME_SOUNDFILE | GAME_MACBINARY},
@@ -869,8 +860,8 @@ static GameDescription gameDescriptions[] = {
&ITE_DisplayInfo,
ITE_DEFAULT_SCENE,
&ITE_Resources,
- ARRAYSIZE(ITEMACCD2_G_GameFiles),
- ITEMACCD2_G_GameFiles,
+ ARRAYSIZE(ITEMACCD_G_GameFiles),
+ ITEMACCD_G_GameFiles,
ARRAYSIZE(ITEWINDEMO_GameFonts),
ITEWINDEMO_GameFonts,
&ITEMACCD_G_GameSound,
diff --git a/saga/interface.h b/saga/interface.h
index d46e20138a..96b3057247 100644
--- a/saga/interface.h
+++ b/saga/interface.h
@@ -69,7 +69,8 @@ enum PanelModes {
kPanelProtect,
kPanelPlacard,
kPanelMap,
- kPanelSceneSubstitute
+ kPanelSceneSubstitute,
+ kPanelUnknown
// kPanelInventory
};
diff --git a/saga/resnames.h b/saga/resnames.h
index 809ff2917d..500fb0a82d 100644
--- a/saga/resnames.h
+++ b/saga/resnames.h
@@ -42,7 +42,9 @@ namespace Saga {
//obj names
#define ITE_OBJ_MAP 14
-#define ITE_MAGIC_HAT 0
+#define ITE_OBJ_MAGIC_HAT 0
+
+#define IHNM_OBJ_PROFILE 0x4000
//actor names
#define ITE_ACTOR_PUZZLE 176
diff --git a/saga/rscfile.cpp b/saga/rscfile.cpp
index 5adb56c979..545c81f547 100644
--- a/saga/rscfile.cpp
+++ b/saga/rscfile.cpp
@@ -421,4 +421,48 @@ void Resource::loadResource(ResourceContext *context, uint32 resourceId, byte*&r
}
}
+static int metaResourceTable[] = { 0, 326, 517, 677, 805, 968, 1165, 0, 1271 };
+
+void Resource::loadGlobalResources(int chapter, int actorsEntrance) {
+ // TODO
+ //if (module.voiceLUT)
+ // free module.voiceLUT;
+
+ // TODO: close chapeter context, or rather reassign it in our case
+
+ ResourceContext *resourceContext;
+
+ resourceContext = _vm->_resource->getContext(GAME_RESOURCEFILE);
+ if (resourceContext == NULL) {
+ error("Resource::loadGlobalResources() resource context not found");
+ }
+
+ byte *resourcePointer;
+ size_t resourceLength;
+
+ _vm->_resource->loadResource(resourceContext, metaResourceTable[chapter],
+ resourcePointer, resourceLength);
+
+ MemoryReadStream metaS(resourcePointer, resourceLength);
+
+ _metaResource.sceneIndex = metaS.readSint16LE();
+ _metaResource.obectCount = metaS.readSint16LE();
+ _metaResource.field_4 = metaS.readSint32LE();
+ _metaResource.field_8 = metaS.readSint32LE();
+ _metaResource.mainSpritesID = metaS.readSint32LE();
+ _metaResource.objectResourceID = metaS.readSint32LE();
+ _metaResource.actorCount = metaS.readSint16LE();
+ _metaResource.field_16 = metaS.readSint32LE();
+ _metaResource.actorsResourceID = metaS.readSint32LE();
+ _metaResource.protagFaceSpritesID = metaS.readSint32LE();
+ _metaResource.field_22 = metaS.readSint32LE();
+ _metaResource.field_26 = metaS.readSint16LE();
+ _metaResource.field_28 = metaS.readSint16LE();
+ _metaResource.field_2a = metaS.readSint32LE();
+ _metaResource.cutawayListResourceID = metaS.readSint32LE();
+ _metaResource.songTableID = metaS.readSint32LE();
+
+ free(resourcePointer);
+}
+
} // End of namespace Saga
diff --git a/saga/rscfile.h b/saga/rscfile.h
index a1d385aa5d..fa603119c8 100644
--- a/saga/rscfile.h
+++ b/saga/rscfile.h
@@ -89,6 +89,29 @@ struct ResourceContext {
}
};
+struct MetaResource {
+ int16 sceneIndex;
+ int16 obectCount;
+ int32 field_4;
+ int32 field_8;
+ int32 mainSpritesID;
+ int32 objectResourceID;
+ int16 actorCount;
+ int32 field_16;
+ int32 actorsResourceID;
+ int32 protagFaceSpritesID;
+ int32 field_22;
+ int16 field_26;
+ int16 field_28;
+ int32 field_2a;
+ int32 cutawayListResourceID;
+ int32 songTableID;
+
+ MetaResource() {
+ memset(this, 0, sizeof(*this));
+ }
+};
+
class Resource {
public:
Resource(SagaEngine *vm);
@@ -99,6 +122,8 @@ public:
size_t getResourceSize(ResourceContext *context, uint32 resourceId);
uint32 convertResourceId(uint32 resourceId);
+ void loadGlobalResources(int chapter, int actorsEntrance);
+
ResourceContext *getContext(uint16 fileType, int serial = 0) {
int i;
for (i = 0; i < _contextsCount; i++) {
@@ -137,6 +162,7 @@ private:
bool loadMacContext(ResourceContext *context);
bool loadSagaContext(ResourceContext *context, uint32 contextOffset, uint32 contextSize);
+ MetaResource _metaResource;
};
} // End of namespace Saga
diff --git a/saga/saga.cpp b/saga/saga.cpp
index eae240377b..d55bede34d 100644
--- a/saga/saga.cpp
+++ b/saga/saga.cpp
@@ -300,7 +300,7 @@ int SagaEngine::go() {
_scene->changeScene(ConfMan.getInt("start_scene"), 0, kTransitionNoFade);
} else if (ConfMan.hasKey("boot_param")) {
if (getGameType() == GType_ITE)
- _interface->addToInventory(_actor->objIndexToId(ITE_MAGIC_HAT));
+ _interface->addToInventory(_actor->objIndexToId(ITE_OBJ_MAGIC_HAT));
_scene->changeScene(ConfMan.getInt("boot_param"), 0, kTransitionNoFade);
} else if (ConfMan.hasKey("save_slot")) {
// First scene sets up palette
diff --git a/saga/scene.cpp b/saga/scene.cpp
index 2dc3365ac4..d13a9aa87b 100644
--- a/saga/scene.cpp
+++ b/saga/scene.cpp
@@ -472,6 +472,38 @@ void Scene::changeScene(uint16 sceneNumber, int actorsEntrance, SceneTransitionT
loadScene(&sceneParams);
}
+void Scene::changeChapter(int chapter, int16 sceneNumber, int actorsEntrance) {
+ if (chapter == 6)
+ _vm->_interface->setLeftPortrait(0);
+
+ freeCutawayList();
+ _vm->_script->freeModules();
+ // deleteAllScenes();
+
+ // installSomeAlarm()
+
+ _vm->_interface->clearInventory();
+ _vm->_resource->loadGlobalResources(chapter, actorsEntrance);
+ _vm->_interface->addToInventory(IHNM_OBJ_PROFILE);
+ _vm->_interface->activate();
+
+ if (chapter == 8 || chapter == -1)
+ _vm->_interface->setMode(kPanelUnknown);
+ else
+ _vm->_interface->setMode(kPanelMain);
+
+ _vm->_script->setVerb(kVerbIHNMWalkTo);
+
+ if (sceneNumber != -2)
+ changeScene(sceneNumber, actorsEntrance, kTransitionFade);
+}
+
+void Scene::freeCutawayList() {
+ // TODO
+ // It has to be in different class
+ warning("STUB: freeCutawayList()");
+}
+
void Scene::getSlopes(int &beginSlope, int &endSlope) {
beginSlope = _vm->getSceneHeight() - _sceneDescription.beginSlope;
endSlope = _vm->getSceneHeight() - _sceneDescription.endSlope;
@@ -675,7 +707,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) {
q_event = _vm->_events->chain(q_event, &event);
- if (loadSceneParams->transitionType == kTransitionFade ) {
+ if (loadSceneParams->transitionType == kTransitionFade) {
_vm->_interface->setFadeMode(kFadeOut);
diff --git a/saga/scene.h b/saga/scene.h
index 8c75581c5e..5805a44d89 100644
--- a/saga/scene.h
+++ b/saga/scene.h
@@ -249,6 +249,8 @@ class Scene {
_sceneQueue.clear();
}
void changeScene(uint16 sceneNumber, int actorsEntrance, SceneTransitionType transitionType);
+ void changeChapter(int chapter, int16 sceneNumber, int actorsEntrance);
+ void freeCutawayList();
bool isSceneLoaded() const { return _sceneLoaded; }
diff --git a/saga/script.h b/saga/script.h
index 5a5098ffa7..a0c00521d1 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -72,6 +72,16 @@ enum VerbTypes {
kVerbWalkOnly = 13,
kVerbLookOnly = 14,
+ kVerbIHNMNone = 0,
+ kVerbIHNMWalkTo = 1,
+ kVerbIHNMLookAt = 2,
+ kVerbIHNMTake = 3,
+ kVerbIHNMUse = 4,
+ kVerbIHNMTalkTo = 5,
+ kVerbIHNMSwallow = 6,
+ kVerbIHNMGive = 7,
+ kVerbIHNMPush = 8,
+
kVerbTypesMax = kVerbLookOnly + 1
};