aboutsummaryrefslogtreecommitdiff
path: root/engines/hugo/hugo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hugo/hugo.cpp')
-rw-r--r--engines/hugo/hugo.cpp96
1 files changed, 53 insertions, 43 deletions
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index 4f9a814da3..3074a3d97d 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -84,30 +84,9 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
}
HugoEngine::~HugoEngine() {
- delete _object;
- delete _sound;
- delete _route;
- delete _parser;
- delete _inventory;
- delete _mouse;
- delete _screen;
- delete _scheduler;
- delete _file;
-
free(_palette);
free(_introX);
free(_introY);
-
-#if 0
- freeTexts(_textData);
- freeTexts(_stringtData);
- freeTexts(_textEngine);
- freeTexts(_textIntro);
- freeTexts(_textMouse);
- freeTexts(_textParser);
- freeTexts(_textSchedule);
- freeTexts(_textUtil);
-#endif
free(_textData);
free(_stringtData);
free(_screenNames);
@@ -118,8 +97,13 @@ HugoEngine::~HugoEngine() {
free(_textSchedule);
free(_textUtil);
- warning("Missing: free _arrayNouns");
- warning("Missing: free _arrayVerbs");
+ for (int i = 0; _arrayNouns[i]; i++)
+ free(_arrayNouns[i]);
+ free(_arrayNouns);
+
+ for (int i = 0; _arrayVerbs[i]; i++)
+ free(_arrayVerbs[i]);
+ free(_arrayVerbs);
free(_arrayReqs);
free(_hotspots);
@@ -127,13 +111,25 @@ HugoEngine::~HugoEngine() {
free(_uses);
free(_catchallList);
- warning("Missing: free _background_objects");
+ for (int i = 0; i < _backgroundObjectsSize; i++)
+ free(_backgroundObjects[i]);
+ free(_backgroundObjects);
free(_points);
- warning("Missing: free _cmdList");
- warning("Missing: free _screenActs");
- warning("Missing: free _objects");
+ for (int i = 0; i < _cmdListSize; i++)
+ free(_cmdList[i]);
+ free(_cmdList);
+
+ for (int i = 0; i < _screenActsSize; i++)
+ free(_screenActs[i]);
+ free(_screenActs);
+
+ _object->freeObjectArr();
+
+ for (int i = 0; i < _actListArrSize; i++)
+ free(_actListArr[i]);
+ free(_actListArr);
free(_defltTunes);
free(_screenStates);
@@ -146,6 +142,16 @@ HugoEngine::~HugoEngine() {
if (_arrayFont[2])
free(_arrayFont[2]);
+
+ delete _object;
+ delete _sound;
+ delete _route;
+ delete _parser;
+ delete _inventory;
+ delete _mouse;
+ delete _screen;
+ delete _scheduler;
+ delete _file;
}
GameType HugoEngine::getGameType() const {
@@ -389,10 +395,10 @@ bool HugoEngine::loadHugoDat() {
_stringtData = loadTextsVariante(in, 0);
// Read arrayNouns
- _arrayNouns = loadTextsArray(in);
+ _arrayNouns = loadTextsArray(in, &_arrayNounsSize);
// Read arrayVerbs
- _arrayVerbs = loadTextsArray(in);
+ _arrayVerbs = loadTextsArray(in, &_arrayVerbsSize);
// Read screenNames
_screenNames = loadTextsVariante(in, &_numScreens);
@@ -546,8 +552,9 @@ bool HugoEngine::loadHugoDat() {
for (int varnt = 0; varnt < _numVariant; varnt++) {
numElem = in.readUint16BE();
if (varnt == _gameVariant) {
- _backgroundObjects = (background_t **)malloc(sizeof(background_t *) * numElem);
- for (int i = 0; i < numElem; i++) {
+ _backgroundObjectsSize = numElem;
+ _backgroundObjects = (background_t **)malloc(sizeof(background_t *) * _backgroundObjectsSize);
+ for (int i = 0; i < _backgroundObjectsSize; i++) {
numSubElem = in.readUint16BE();
_backgroundObjects[i] = (background_t *)malloc(sizeof(background_t) * numSubElem);
for (int j = 0; j < numSubElem; j++) {
@@ -594,8 +601,9 @@ bool HugoEngine::loadHugoDat() {
for (int varnt = 0; varnt < _numVariant; varnt++) {
numElem = in.readUint16BE();
if (varnt == _gameVariant) {
- _cmdList = (cmd **)malloc(sizeof(cmd *) * numElem);
- for (int i = 0; i < numElem; i++) {
+ _cmdListSize = numElem;
+ _cmdList = (cmd **)malloc(sizeof(cmd *) * _cmdListSize);
+ for (int i = 0; i < _cmdListSize; i++) {
numSubElem = in.readUint16BE();
_cmdList[i] = (cmd *)malloc(sizeof(cmd) * numSubElem);
for (int j = 0; j < numSubElem; j++) {
@@ -631,8 +639,9 @@ bool HugoEngine::loadHugoDat() {
for (int varnt = 0; varnt < _numVariant; varnt++) {
numElem = in.readUint16BE();
if (varnt == _gameVariant) {
- _screenActs = (uint16 **)malloc(sizeof(uint16 *) * numElem);
- for (int i = 0; i < numElem; i++) {
+ _screenActsSize = numElem;
+ _screenActs = (uint16 **)malloc(sizeof(uint16 *) * _screenActsSize);
+ for (int i = 0; i < _screenActsSize; i++) {
numSubElem = in.readUint16BE();
if (numSubElem == 0) {
_screenActs[i] = 0;
@@ -651,7 +660,7 @@ bool HugoEngine::loadHugoDat() {
}
}
- _object->loadObject(in);
+ _object->loadObjectArr(in);
//#define HERO 0
_hero = &_object->_objects[HERO]; // This always points to hero
_screen_p = &(_object->_objects[HERO].screenIndex); // Current screen is hero's
@@ -661,8 +670,9 @@ bool HugoEngine::loadHugoDat() {
for (int varnt = 0; varnt < _numVariant; varnt++) {
numElem = in.readUint16BE();
if (varnt == _gameVariant) {
- _actListArr = (act **)malloc(sizeof(act *) * numElem);
- for (int i = 0; i < numElem; i++) {
+ _actListArrSize = numElem;
+ _actListArr = (act **)malloc(sizeof(act *) * _actListArrSize);
+ for (int i = 0; i < _actListArrSize; i++) {
numSubElem = in.readUint16BE();
_actListArr[i] = (act *) malloc(sizeof(act) * (numSubElem + 1));
for (int j = 0; j < numSubElem; j++) {
@@ -1377,16 +1387,16 @@ uint16 **HugoEngine::loadLongArray(Common::File &in) {
return resArray;
}
-char ***HugoEngine::loadTextsArray(Common::File &in) {
+char ***HugoEngine::loadTextsArray(Common::File &in, uint16 *arraySize) {
char ***resArray = 0;
for (int varnt = 0; varnt < _numVariant; varnt++) {
- int numNouns = in.readUint16BE();
+ *arraySize = in.readUint16BE();
if (varnt == _gameVariant) {
- resArray = (char ** *)malloc(sizeof(char **) * (numNouns + 1));
- resArray[numNouns] = 0;
+ resArray = (char ***)malloc(sizeof(char **) * (*arraySize + 1));
+ resArray[*arraySize] = 0;
}
- for (int i = 0; i < numNouns; i++) {
+ for (int i = 0; i < *arraySize; i++) {
int numTexts = in.readUint16BE();
int entryLen = in.readUint16BE();
char *pos = (char *)malloc(entryLen);