aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kurushin2005-01-18 11:55:31 +0000
committerAndrew Kurushin2005-01-18 11:55:31 +0000
commit0b4fd4adbf88b1dac138e9ef55feefc7e2fd79ca (patch)
treed971b6b369db498d1f29c763039856141e72b63d
parentc9d0d4c840aac829d42bc5ec1b5b1e7f30b5a50c (diff)
downloadscummvm-rg350-0b4fd4adbf88b1dac138e9ef55feefc7e2fd79ca.tar.gz
scummvm-rg350-0b4fd4adbf88b1dac138e9ef55feefc7e2fd79ca.tar.bz2
scummvm-rg350-0b4fd4adbf88b1dac138e9ef55feefc7e2fd79ca.zip
- merged ActionMap and ObjectMap
- remove ActionMap.h & ActionMap.cpp - ObjectMap names move to Scene::_sceneStrings as in original engine - fix wrong StringsTable::stringsCount calculation svn-id: r16592
-rw-r--r--saga/actor.cpp4
-rw-r--r--saga/interface.cpp3
-rw-r--r--saga/objectmap.cpp322
-rw-r--r--saga/objectmap.h53
-rw-r--r--saga/render.cpp3
-rw-r--r--saga/saga.cpp3
-rw-r--r--saga/saga.h3
-rw-r--r--saga/scene.cpp57
-rw-r--r--saga/scene.h36
-rw-r--r--saga/sthread.cpp2
10 files changed, 112 insertions, 374 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 9ac8b3024f..0bb8ccafda 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -33,13 +33,13 @@
#include "saga/text.h"
#include "saga/sound.h"
#include "saga/scene.h"
-#include "saga/actionmap.h"
#include "saga/actor.h"
#include "saga/actordata.h"
#include "saga/stream.h"
#include "saga/interface.h"
#include "saga/events.h"
+#include "saga/objectmap.h"
#include "common/config-manager.h"
namespace Saga {
@@ -505,7 +505,7 @@ void Actor::updateActorsScene(int actorsEntrance) {
assert(_protagonist);
if (actorsEntrance >= 0) {
- sceneEntry = _vm->_scene->_entryList->getEntry(actorsEntrance);
+ sceneEntry = _vm->_scene->_entryList.getEntry(actorsEntrance);
// tiled stuff
if (_vm->_scene->getFlags() & kSceneFlagISO) {
//todo: it
diff --git a/saga/interface.cpp b/saga/interface.cpp
index 05493da657..8bb72e9843 100644
--- a/saga/interface.cpp
+++ b/saga/interface.cpp
@@ -497,7 +497,7 @@ int Interface::handlePlayfieldClick(SURFACE *ds, const Point& imousePt) {
return SUCCESS;
}
- object_flags = _vm->_scene->_objectMap->getFlags(objectNum);
+// object_flags = _vm->_scene->_objectMap->getFlags(objectNum);
if (object_flags & kHitZoneExit) { // FIXME. This is wrong
/* if ((script_num = _vm->_scene->_objectMap->getEPNum(objectNum)) != -1) {
@@ -746,6 +746,7 @@ void Interface::converseInit(void) {
_converseText[i].text = NULL;
converseClear();
}
+
void Interface::converseClear(void) {
for (int i = 0; i < CONVERSE_MAX_TEXTS; i++) {
if (_converseText[i].text)
diff --git a/saga/objectmap.cpp b/saga/objectmap.cpp
index c8c43068db..7333ea7e18 100644
--- a/saga/objectmap.cpp
+++ b/saga/objectmap.cpp
@@ -133,307 +133,75 @@ void HitZone::draw(SURFACE *ds, int color) {
}
-// Initializes the object map module, creates module allocation context
-ObjectMap::ObjectMap(SagaEngine *vm) : _vm(vm) {
- _objectsLoaded = false;
- _namesLoaded = false;
- _nNames = 0;
-}
-
-// Shuts down the object map module, destroys module allocation context
-ObjectMap::~ObjectMap() {
- freeMem();
- freeNames();
-}
-
// Loads an object map resource ( objects ( clickareas ( points ) ) )
-int ObjectMap::load(const byte *om_res, size_t om_res_len) {
- OBJECTMAP_ENTRY *object_map;
- CLICKAREA *clickarea;
- Point *point;
-
- int i, k, m;
-
- MemoryReadStreamEndian readS(om_res, om_res_len, IS_BIG_ENDIAN);
-
- if (_objectsLoaded) {
- freeMem();
- }
-
- // Obtain object count N and allocate space for N objects
- _nObjects = readS.readUint16();
-
- _objectMaps = (OBJECTMAP_ENTRY *)malloc(_nObjects * sizeof(*_objectMaps));
-
- if (_objectMaps == NULL) {
- warning("Error: Memory allocation failed");
- return MEM;
- }
-
- // Load all N objects
- for (i = 0; i < _nObjects; i++) {
- object_map = &_objectMaps[i];
- object_map->flags = readS.readByte();
- object_map->nClickareas = readS.readByte();
- object_map->defaultVerb = readS.readByte();
- readS.readByte();
- object_map->objectNum = readS.readUint16();
- object_map->scriptNum = readS.readUint16();
- object_map->clickareas = (CLICKAREA *)malloc(object_map->nClickareas * sizeof(*(object_map->clickareas)));
-
- if (object_map->clickareas == NULL) {
- warning("Error: Memory allocation failed");
- return MEM;
- }
-
- // Load all clickareas for this object
- for (k = 0; k < object_map->nClickareas; k++) {
- clickarea = &object_map->clickareas[k];
- clickarea->n_points = readS.readUint16LE();
- assert(clickarea->n_points != 0);
-
- clickarea->points = (Point *)malloc(clickarea->n_points * sizeof(*(clickarea->points)));
- if (clickarea->points == NULL) {
- warning("Error: Memory allocation failed");
- return MEM;
- }
-
- // Load all points for this clickarea
- for (m = 0; m < clickarea->n_points; m++) {
- point = &clickarea->points[m];
- point->x = readS.readSint16();
- point->y = readS.readSint16();
- }
- debug(2, "ObjectMap::load(): Read %d points for clickarea %d in object %d.",
- clickarea->n_points, k, object_map->objectNum);
- }
- }
-
- _objectsLoaded = true;
-
- return SUCCESS;
-}
-
-// Frees all storage allocated for the current object map data
-int ObjectMap::freeMem() {
- OBJECTMAP_ENTRY *object_map;
- CLICKAREA *clickarea;
-
- int i, k;
-
- if (!_objectsLoaded) {
- return FAILURE;
- }
-
- for (i = 0; i < _nObjects; i++) {
- object_map = &_objectMaps[i];
- for (k = 0; k < object_map->nClickareas; k++) {
- clickarea = &object_map->clickareas[k];
- free(clickarea->points);
- }
- free(object_map->clickareas);
- }
-
- if (_nObjects) {
- free(_objectMaps);
- }
-
- _objectsLoaded = false;
-
- return SUCCESS;
-}
-
-// Loads an object name list resource
-int ObjectMap::loadNames(const unsigned char *onl_res, size_t onl_res_len) {
- int table_len;
- int n_names;
- size_t name_offset;
-
+void ObjectMap::load(const byte *resourcePointer, size_t resourceLength) {
int i;
- MemoryReadStreamEndian readS(onl_res, onl_res_len, IS_BIG_ENDIAN);
-
- if (_namesLoaded) {
- freeNames();
- }
-
- table_len = readS.readUint16();
-
- n_names = table_len / 2 - 2;
- _nNames = n_names;
-
- debug(2, "ObjectMap::loadNames: Loading %d object names.", n_names);
- _names = (const char **)malloc(n_names * sizeof(*_names));
-
- if (_names == NULL) {
- warning("Error: Memory allocation failed");
- return MEM;
+ if (resourceLength < 4) {
+ error("ObjectMap::load wrong resourceLength");
}
- for (i = 0; i < n_names; i++) {
- name_offset = readS.readUint16();
- _names[i] = (const char *)(onl_res + name_offset);
+ MemoryReadStreamEndian readS(resourcePointer, resourceLength, IS_BIG_ENDIAN);
- debug(3, "Loaded object name string: %s", _names[i]);
+ _hitZoneListCount = readS.readSint16();
+ if (_hitZoneListCount < 0) {
+ error("ObjectMap::load _hitZoneListCount < 0");
}
- _namesLoaded = true;
+ if (_hitZoneList)
+ error("ObjectMap::load _hitZoneList != NULL");
- return SUCCESS;
-}
-
-// Frees all storage allocated for the current object name list data
-int ObjectMap::freeNames() {
- if (!_namesLoaded) {
- return FAILURE;
+ _hitZoneList = (HitZone **) malloc(_hitZoneListCount * sizeof(HitZone *));
+ if (_hitZoneList == NULL) {
+ error("ObjectMap::load Memory allocation failure");
}
- if (_nNames) {
- free(_names);
+ for (i = 0; i < _hitZoneListCount; i++) {
+ _hitZoneList[i] = new HitZone(&readS);
}
-
- _namesLoaded = false;
- return SUCCESS;
-}
-
-// If 'object' is a valid object number in the currently loaded object
-// name list resource, the funciton sets '*name' to the descriptive string
-// corresponding to 'object' and returns SUCCESS. Otherwise it returns
-// FAILURE.
-const char *ObjectMap::getName(int object) {
- assert(_namesLoaded);
- assert((object > 0) && (object <= _nNames));
-
- return _names[object - 1];
}
-const uint16 ObjectMap::getFlags(int object) {
+void ObjectMap::freeMem() {
int i;
- assert(_namesLoaded);
- assert((object > 0) && (object <= _nNames));
-
- for (i = 0; i < _nObjects; i++) {
- if (_objectMaps[i].objectNum == object) {
- return _objectMaps[i].flags;
+ if (_hitZoneList) {
+ for (i = 0; i < _hitZoneListCount; i++) {
+ delete _hitZoneList[i];
}
- }
-
- return 0;
-}
-
-// If 'object' is a valid object number in the currently loaded object
-// name list resource, the funciton sets '*ep_num' to the entrypoint number
-// corresponding to 'object' and returns SUCCESS. Otherwise, it returns
-// FAILURE.
-const int ObjectMap::getEPNum(int object) {
- int i;
-
- assert(_namesLoaded);
-
- if ((object < 0) || (object > (_nObjects + 1)))
- return -1;
-
- for (i = 0; i < _nObjects; i++)
- if (_objectMaps[i].objectNum == object)
- return _objectMaps[i].scriptNum;
-
- return -1;
+ free(_hitZoneList);
+ _hitZoneList = NULL;
+ }
}
-// Uses Gfx::drawLine to display all clickareas for each object in the
-// currently loaded object map resource.
-int ObjectMap::draw(SURFACE *ds, const Point& imousePt, int color, int color2) {
- OBJECTMAP_ENTRY *object_map;
- CLICKAREA *clickarea;
- char txt_buf[32];
- int draw_color = color;
- int draw_txt = 0;
-
- bool hitObject = false;
- int objectNum = 0;
+void ObjectMap::draw(SURFACE *ds, const Point& testPoint, int color, int color2) {
+ int i;
+ int hitZoneIndex;
+ char txtBuf[32];
- int i, k;
+ hitZoneIndex = hitTest(testPoint);
- if (!_objectsLoaded) {
- return FAILURE;
+ for (i = 0; i < _hitZoneListCount; i++) {
+ _hitZoneList[i]->draw(ds, (hitZoneIndex == i) ? color2 : color);
}
- if ((objectNum = hitTest(imousePt)) != -1) {
- hitObject = true;
- }
-
- for (i = 0; i < _nObjects; i++) {
- draw_color = color;
- if (hitObject && (objectNum == _objectMaps[i].objectNum)) {
- snprintf(txt_buf, sizeof(txt_buf), "obj %d: v %d, f %X",
- _objectMaps[i].objectNum,
- _objectMaps[i].defaultVerb,
- _objectMaps[i].flags);
- draw_txt = 1;
- draw_color = color2;
- }
+ if (hitZoneIndex != -1) {
+ snprintf(txtBuf, sizeof(txtBuf), "hitZone %d", hitZoneIndex);
+ _vm->_font->draw(SMALL_FONT_ID, ds, txtBuf, 0, 2, 2,
+ _vm->_gfx->getWhite(), _vm->_gfx->getBlack(), FONT_OUTLINE);
- object_map = &_objectMaps[i];
-
- for (k = 0; k < object_map->nClickareas; k++) {
- clickarea = &object_map->clickareas[k];
- if (clickarea->n_points == 2) {
- // 2 points represent a box
- drawFrame(ds, &clickarea->points[0], &clickarea->points[1], draw_color);
- } else if (clickarea->n_points > 2) {
- // Otherwise draw a polyline
- drawPolyLine(ds, clickarea->points, clickarea->n_points, draw_color);
- }
- }
- }
-
- if (draw_txt) {
- _vm->_font->draw(SMALL_FONT_ID, ds, txt_buf, 0, 2, 2,
- _vm->_gfx->getWhite(), _vm->_gfx->getBlack(), FONT_OUTLINE);
}
-
- return SUCCESS;
}
-int ObjectMap::hitTest(const Point& imousePt) {
- Point imouse;
- OBJECTMAP_ENTRY *object_map;
- CLICKAREA *clickarea;
- Point *points;
- int n_points;
-
- int i, k;
-
- imouse.x = imousePt.x;
- imouse.y = imousePt.y;
+int ObjectMap::hitTest(const Point& testPoint) {
+ int i;
// Loop through all scene objects
- for (i = 0; i < _nObjects; i++) {
- object_map = &_objectMaps[i];
-
- // Hit-test all clickareas for this object
- for (k = 0; k < object_map->nClickareas; k++) {
- clickarea = &object_map->clickareas[k];
- n_points = clickarea->n_points;
- points = clickarea->points;
-
- if (n_points == 2) {
- // Hit-test a box region
- if ((imouse.x > points[0].x) && (imouse.x <= points[1].x) &&
- (imouse.y > points[0].y) &&
- (imouse.y <= points[1].y)) {
- return object_map->objectNum;
- }
- } else if (n_points > 2) {
- // Hit-test a polygon
- if (hitTestPoly(points, n_points, imouse)) {
- return object_map->objectNum;
- }
- }
+ for (i = 0; i < _hitZoneListCount; i++) {
+ if (_hitZoneList[i]->hitTest(testPoint)) {
+ return i;
}
}
@@ -441,21 +209,7 @@ int ObjectMap::hitTest(const Point& imousePt) {
}
void ObjectMap::cmdInfo(void) {
- int i;
-
- _vm->_console->DebugPrintf("%d objects loaded.\n", _nObjects);
-
- for (i = 0; i < _nObjects; i++) {
- _vm->_console->DebugPrintf("%s:\n", _names[i]);
- _vm->_console->DebugPrintf("%d. verb: %d, flags: %X, name_i: %d, scr_n: %d, ca_ct: %d\n", i,
- _objectMaps[i].defaultVerb,
- _objectMaps[i].flags,
- _objectMaps[i].objectNum,
- _objectMaps[i].scriptNum,
- _objectMaps[i].nClickareas);
- }
-
- return;
+ _vm->_console->DebugPrintf("%d zone(s) loaded.\n\n", _hitZoneListCount);
}
} // End of namespace Saga
diff --git a/saga/objectmap.h b/saga/objectmap.h
index 3a856161c4..4571e77a1c 100644
--- a/saga/objectmap.h
+++ b/saga/objectmap.h
@@ -73,42 +73,35 @@ private:
};
-struct OBJECTMAP_ENTRY {
- byte flags;
- byte defaultVerb;
-
- int objectNum;
- int scriptNum;
+class ObjectMap {
+public:
+ ObjectMap(SagaEngine *vm) : _vm(vm) {
+ _hitZoneList = NULL;
+ _hitZoneListCount = 0;
- int nClickareas;
- CLICKAREA *clickareas;
-};
+ }
+ ~ObjectMap(void) {
+ freeMem();
+ }
+ void load(const byte *resourcePointer, size_t resourceLength);
+ void freeMem(void);
+
+ void draw(SURFACE *drawSurface, const Point& testPoint, int color, int color2);
+ int hitTest(const Point& testPoint);
+ const HitZone * getHitZone(int index) const {
+ if ((index < 0) || (index >= _hitZoneListCount)) {
+ error("ObjectMap::getHitZone wrong index 0x%X", index);
+ }
+ return _hitZoneList[index];
+ }
-class ObjectMap{
-public:
- ObjectMap(SagaEngine *vm);
- ~ObjectMap(void);
- int load(const byte *om_res, size_t om_res_len);
- int freeMem(void);
- int loadNames(const byte *onl_res, size_t onl_res_len);
- int freeNames();
- const char *getName(int object);
- const uint16 getFlags(int object);
- const int getEPNum(int object);
- int draw(SURFACE *draw_surface, const Point& imousePt, int color, int color2);
- int hitTest(const Point& imousePt);
void cmdInfo(void);
private:
-
- bool _objectsLoaded;
- int _nObjects;
- OBJECTMAP_ENTRY *_objectMaps;
-
- bool _namesLoaded;
- int _nNames;
- const char **_names;
SagaEngine *_vm;
+
+ int _hitZoneListCount;
+ HitZone **_hitZoneList;
};
} // End of namespace Saga
diff --git a/saga/render.cpp b/saga/render.cpp
index c3a72e779e..2446ae38e7 100644
--- a/saga/render.cpp
+++ b/saga/render.cpp
@@ -31,7 +31,6 @@
#include "saga/scene.h"
#include "saga/text.h"
-#include "saga/actionmap.h"
#include "saga/objectmap.h"
#include "saga/render.h"
@@ -129,7 +128,7 @@ int Render::drawScene() {
if (_vm->_scene->_objectMap)
_vm->_scene->_objectMap->draw(backbuf_surface, mouse_pt, _vm->_gfx->getWhite(), _vm->_gfx->getBlack());
if (_vm->_scene->_actionMap)
- _vm->_scene->_actionMap->draw(backbuf_surface, _vm->_gfx->matchColor(RGB_RED));
+ _vm->_scene->_actionMap->draw(backbuf_surface, mouse_pt, _vm->_gfx->matchColor(RGB_RED), _vm->_gfx->getBlack());
}
// Draw queued actors
diff --git a/saga/saga.cpp b/saga/saga.cpp
index 657f0fc4cd..6d06a149d7 100644
--- a/saga/saga.cpp
+++ b/saga/saga.cpp
@@ -330,7 +330,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin
error("Invalid string offset");
}
- stringsCount = offset / 2;
+ stringsCount = offset / 2 - 2;
stringsTable.stringsCount = stringsCount;
stringsTable.strings = (const char **)malloc(stringsCount * sizeof(const char *));
@@ -345,6 +345,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin
error("invalid string offset");
}
stringsTable.strings[i] = (const char *)stringsTable.stringsPointer + offset;
+ debug(9, "string[%i]=%s", i, stringsTable.strings[i]);
}
}
diff --git a/saga/saga.h b/saga/saga.h
index 7f17aa2e5d..b3b32aaae5 100644
--- a/saga/saga.h
+++ b/saga/saga.h
@@ -209,6 +209,9 @@ struct StringsTable {
StringsTable() {
memset(this, 0, sizeof(*this));
}
+ ~StringsTable() {
+ freeMem();
+ }
};
struct CLICKAREA {
diff --git a/saga/scene.cpp b/saga/scene.cpp
index 37ed57290b..0b5173ebd7 100644
--- a/saga/scene.cpp
+++ b/saga/scene.cpp
@@ -29,7 +29,6 @@
#include "saga/console.h"
#include "saga/interface.h"
#include "saga/events.h"
-#include "saga/actionmap.h"
#include "saga/isomap.h"
#include "saga/objectmap.h"
#include "saga/palanim.h"
@@ -115,9 +114,8 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) {
_resList = NULL;
_animEntries = 0;
_sceneProc = NULL;
- _objectMap = NULL;
- _actionMap = new ActionMap(_vm);
- _entryList = new SceneEntryList(_vm);
+ _objectMap = new ObjectMap(_vm);
+ _actionMap = new ObjectMap(_vm);
memset(&_bg, 0, sizeof(_bg));
memset(&_bgMask, 0, sizeof(_bgMask));
@@ -128,7 +126,6 @@ Scene::~Scene() {
if (_initialized) {
endScene();
delete _actionMap;
- delete _entryList;
free(_sceneLUT);
}
}
@@ -752,8 +749,6 @@ int Scene::processSceneResources() {
const byte *pal_p;
int i;
- _objectMap = new ObjectMap(_vm);
-
// Process the scene resource list
for (i = 0; i < _resListEntries; i++) {
res_data = _resList[i].res_data;
@@ -795,17 +790,13 @@ int Scene::processSceneResources() {
&_bgMask.buf_len, &_bgMask.w, &_bgMask.h);
debug(0, "BACKGROUND MASK width=%d height=%d length=%d", _bgMask.w, _bgMask.h, _bgMask.buf_len);
break;
- case SAGA_OBJECT_NAME_LIST:
- debug(0, "Loading object name list resource...");
- _objectMap->loadNames(_resList[i].res_data, _resList[i].res_data_len);
+ case SAGA_SCENE_NAME_LIST:
+ debug(0, "Loading scene name list resource...");
+ _vm->loadStrings(_sceneStrings, _resList[i].res_data, _resList[i].res_data_len);
break;
case SAGA_OBJECT_MAP:
debug(0, "Loading object map resource...");
- if (_objectMap->load(res_data,
- res_data_len) != SUCCESS) {
- warning("Scene::ProcessSceneResources(): Error loading object map resource");
- return FAILURE;
- }
+ _objectMap->load(res_data, res_data_len);
break;
case SAGA_ACTION_MAP:
debug(0, "Loading action map resource...");
@@ -881,7 +872,7 @@ int Scene::processSceneResources() {
break;
case SAGA_ENTRY:
debug(0, "Loading entry list resource...");
- _entryList->load(res_data, res_data_len);
+ loadSceneEntryList(res_data, res_data_len);
break;
case SAGA_FACES:
_vm->_interface->loadScenePortraits(_resList[i].res_number);
@@ -957,11 +948,11 @@ int Scene::endScene() {
_vm->_anim->reset();
_vm->_palanim->freePalAnim();
- delete _objectMap;
-
- _objectMap = NULL;
+
+ _objectMap->freeMem();
_actionMap->freeMem();
- _entryList->freeMem();
+ _entryList.freeMem();
+ _sceneStrings.freeMem();
_animList.clear();
@@ -1112,27 +1103,27 @@ int Scene::defaultScene(int param, SCENE_INFO *scene_info) {
return 0;
}
-void SceneEntryList::load(const byte* resourcePointer, size_t resourceLength) {
+void Scene::loadSceneEntryList(const byte* resourcePointer, size_t resourceLength) {
int i;
-
- _entryListCount = resourceLength / 8;
+
+ _entryList.entryListCount = resourceLength / 8;
MemoryReadStreamEndian readS(resourcePointer, resourceLength, IS_BIG_ENDIAN);
- if (_entryList)
- error("SceneEntryList::load _entryList != NULL");
+ if (_entryList.entryList)
+ error("Scene::loadSceneEntryList entryList != NULL");
- _entryList = (SceneEntry *) malloc(_entryListCount * sizeof(*_entryList));
- if (_entryList == NULL) {
- error("SceneEntryList::load Memory allocation failure");
+ _entryList.entryList = (SceneEntry *) malloc(_entryList.entryListCount * sizeof(*_entryList.entryList));
+ if (_entryList.entryList == NULL) {
+ error("Scene::loadSceneEntryList Memory allocation failure");
}
- for (i = 0; i < _entryListCount; i++) {
- _entryList[i].location.x = readS.readSint16();
- _entryList[i].location.y = readS.readSint16();
- _entryList[i].location.z = readS.readSint16();
- _entryList[i].facing = readS.readUint16();
+ for (i = 0; i < _entryList.entryListCount; i++) {
+ _entryList.entryList[i].location.x = readS.readSint16();
+ _entryList.entryList[i].location.y = readS.readSint16();
+ _entryList.entryList[i].location.z = readS.readSint16();
+ _entryList.entryList[i].facing = readS.readUint16();
}
}
diff --git a/saga/scene.h b/saga/scene.h
index cef6d76901..c76037ae60 100644
--- a/saga/scene.h
+++ b/saga/scene.h
@@ -76,7 +76,7 @@ enum SCENE_PROC_PARAMS {
enum SAGA_RESOURCE_TYPES {
SAGA_BG_IMAGE = 2,
SAGA_BG_MASK = 3,
- SAGA_OBJECT_NAME_LIST = 5,
+ SAGA_SCENE_NAME_LIST = 5,
SAGA_OBJECT_MAP = 6,
SAGA_ACTION_MAP = 7,
SAGA_ISO_TILESET = 8,
@@ -123,29 +123,22 @@ struct SceneEntry {
int facing;
};
-class SceneEntryList {
-private:
- SagaEngine *_vm;
- SceneEntry *_entryList;
- int _entryListCount;
-public:
- int getEntryListCount() const { return _entryListCount; }
+struct SceneEntryList {
+ SceneEntry *entryList;
+ int entryListCount;
+
const SceneEntry * getEntry(int index) {
- if ((index < 0) || (index >= _entryListCount)) {
+ if ((index < 0) || (index >= entryListCount)) {
error("SceneEntryList::getEntry wrong index");
}
- return &_entryList[index];
+ return &entryList[index];
}
- void load(const byte* resourcePointer, size_t resourceLength);
-
void freeMem() {
- free(_entryList);
- _entryList = NULL;
- _entryListCount = 0;
+ free(entryList);
+ memset(this, 0, sizeof(*this));
}
- SceneEntryList(SagaEngine *vm): _vm(vm) {
- _entryList = NULL;
- _entryListCount = 0;
+ SceneEntryList() {
+ memset(this, 0, sizeof(*this));
}
~SceneEntryList() {
freeMem();
@@ -272,6 +265,7 @@ class Scene {
int loadScene(int scene, int load_flag, SCENE_PROC scene_proc, SceneDescription *, int fadeIn, int actorsEntrance);
int loadSceneDescriptor(uint32 res_number);
int loadSceneResourceList(uint32 res_number);
+ void loadSceneEntryList(const byte* resourcePointer, size_t resourceLength);
int processSceneResources();
private:
@@ -298,15 +292,17 @@ class Scene {
TEXTLIST *_textList;
SCENE_IMAGE _bg;
SCENE_IMAGE _bgMask;
+
+ StringsTable _sceneStrings;
int _sceneDoors[SCENE_DOORS_MAX];
static int SC_defaultScene(int param, SCENE_INFO *scene_info, void *refCon);
int defaultScene(int param, SCENE_INFO *scene_info);
public:
- ActionMap *_actionMap;
+ ObjectMap *_actionMap;
ObjectMap *_objectMap;
- SceneEntryList *_entryList;
+ SceneEntryList _entryList;
private:
int IHNMStartProc();
diff --git a/saga/sthread.cpp b/saga/sthread.cpp
index cdd679ab3e..6fbc253775 100644
--- a/saga/sthread.cpp
+++ b/saga/sthread.cpp
@@ -509,7 +509,7 @@ void Script::runThread(ScriptThread *thread, int instr_limit) {
// (NEG) Negate stack by 2's complement
case 0x25:
data = thread->pop();
- thread->push(-data);
+ thread->push(-(int)data);
break;
// (TSTZ) Test for zero
case 0x26: