aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Montoir2004-10-17 19:00:09 +0000
committerGregory Montoir2004-10-17 19:00:09 +0000
commitb33f7b4b76495b08532989fe9cde9e49a1d08a95 (patch)
tree5389d5df8921f10f182d3b1bc50cc617202bcba6
parenta41b8d22937396c10b913a0e9d58af311bccc5ad (diff)
downloadscummvm-rg350-b33f7b4b76495b08532989fe9cde9e49a1d08a95.tar.gz
scummvm-rg350-b33f7b4b76495b08532989fe9cde9e49a1d08a95.tar.bz2
scummvm-rg350-b33f7b4b76495b08532989fe9cde9e49a1d08a95.zip
plugged some memory leaks
svn-id: r15591
-rw-r--r--queen/command.cpp8
-rw-r--r--queen/command.h1
-rw-r--r--queen/grid.cpp7
-rw-r--r--queen/grid.h1
-rw-r--r--queen/logic.cpp159
-rw-r--r--queen/logic.h37
6 files changed, 129 insertions, 84 deletions
diff --git a/queen/command.cpp b/queen/command.cpp
index df93ab097c..bb9efe4d93 100644
--- a/queen/command.cpp
+++ b/queen/command.cpp
@@ -125,6 +125,14 @@ Command::Command(QueenEngine *vm)
: _cmdText((vm->resource()->getLanguage() == HEBREW), CmdText::COMMAND_Y_POS, vm), _vm(vm) {
}
+Command::~Command() {
+ delete[] _cmdList;
+ delete[] _cmdArea;
+ delete[] _cmdObject;
+ delete[] _cmdInventory;
+ delete[] _cmdGameState;
+}
+
void Command::clear(bool clearTexts) {
debug(6, "Command::clear(%d)", clearTexts);
_cmdText.clear();
diff --git a/queen/command.h b/queen/command.h
index 2d7aff98dc..df9dffcc2b 100644
--- a/queen/command.h
+++ b/queen/command.h
@@ -72,6 +72,7 @@ class Command {
public:
Command(QueenEngine *vm);
+ ~Command();
//! initialise command construction
void clear(bool clearTexts);
diff --git a/queen/grid.cpp b/queen/grid.cpp
index f015589a97..08c78c148e 100644
--- a/queen/grid.cpp
+++ b/queen/grid.cpp
@@ -33,6 +33,13 @@ Grid::Grid(QueenEngine *vm)
memset(_zones, 0, sizeof(_zones));
}
+Grid::~Grid() {
+ delete[] _objMax;
+ delete[] _areaMax;
+ delete[] _area;
+ delete[] _objectBox;
+}
+
void Grid::readDataFrom(uint16 numObjects, uint16 numRooms, byte *&ptr) {
uint16 i, j;
diff --git a/queen/grid.h b/queen/grid.h
index e9a99747b7..b85451d5c7 100644
--- a/queen/grid.h
+++ b/queen/grid.h
@@ -39,6 +39,7 @@ class Grid {
public:
Grid(QueenEngine *vm);
+ ~Grid();
void readDataFrom(uint16 numObjects, uint16 numRooms, byte *&ptr);
diff --git a/queen/logic.cpp b/queen/logic.cpp
index 711bb596fd..531ce1af62 100644
--- a/queen/logic.cpp
+++ b/queen/logic.cpp
@@ -43,19 +43,22 @@
namespace Queen {
-static char *trim(char *str) {
- char *p = str + strlen(str) - 1;
- while (p != str && *p == ' ') {
- *p-- = '\0';
- }
- while (str != p && *str == ' ') {
- ++str;
- }
- return str;
+static Common::String trim(const Common::String &s) {
+ const char *p;
+
+ p = s.c_str();
+ while (*p == ' ') ++p;
+ int start = p - s.c_str();
+
+ p = s.c_str() + s.size() - 1;
+ while (p != s.c_str() && *p == ' ') --p;
+ int end = p - s.c_str();
+
+ return Common::String(s.c_str() + start, end - start + 1);
}
Logic::Logic(QueenEngine *vm)
- : _queen2jas(NULL), _credits(NULL), _vm(vm) {
+ : _credits(NULL), _vm(vm) {
_joe.x = _joe.y = 0;
_joe.scale = 100;
_joe.walk = JWM_NORMAL;
@@ -69,7 +72,16 @@ Logic::Logic(QueenEngine *vm)
Logic::~Logic() {
delete _journal;
delete _credits;
- delete _queen2jas;
+ delete[] _objectData;
+ delete[] _roomData;
+ delete[] _sfxName;
+ delete[] _itemData;
+ delete[] _graphicData;
+ delete[] _walkOffData;
+ delete[] _objectDescription;
+ delete[] _furnitureData;
+ delete[] _actorData;
+ delete[] _graphicAnim;
}
void Logic::initialise() {
@@ -182,37 +194,37 @@ void Logic::initialise() {
uint32 size;
char *buf = (char *)_vm->resource()->loadFile("QUEEN2.JAS", 0, &size);
- _queen2jas = new LineReader(buf, size);
+ LineReader *queen2jas = new LineReader(buf, size);
- _objDescription = new char*[_numDescriptions + 1];
- _objDescription[0] = 0;
- for (i = 1; i <= _numDescriptions; i++)
- _objDescription[i] = _queen2jas->nextLine();
+ _objDescription.push_back("");
+ for (i = 1; i <= _numDescriptions; i++) {
+ _objDescription.push_back(queen2jas->nextLine());
+ }
- //Patch for German text bug
+ // Patch for German text bug
if (_vm->resource()->getLanguage() == GERMAN) {
- char *txt = new char[48];
- strcpy(txt, "Es bringt nicht viel, das festzubinden.");
- _objDescription[296] = txt;
+ _objDescription[296] = "Es bringt nicht viel, das festzubinden.";
}
- _objName = new char*[_numNames + 1];
- _objName[0] = 0;
- for (i = 1; i <= _numNames; i++)
- _objName[i] = _queen2jas->nextLine();
-
- _roomName = new char*[_numRooms + 1];
- _roomName[0] = 0;
- for (i = 1; i <= _numRooms; i++)
- _roomName[i] = _queen2jas->nextLine();
-
- _verbName[0] = 0;
- for (i = 1; i <= 12; i++)
- _verbName[i] = _queen2jas->nextLine();
-
- _joeResponse[0] = 0;
- for (i = 1; i <= JOE_RESPONSE_MAX; i++)
- _joeResponse[i] = _queen2jas->nextLine();
+ _objName.push_back("");
+ for (i = 1; i <= _numNames; i++) {
+ _objName.push_back(queen2jas->nextLine());
+ }
+
+ _roomName.push_back("");
+ for (i = 1; i <= _numRooms; i++) {
+ _roomName.push_back(queen2jas->nextLine());
+ }
+
+ _verbName.push_back("");
+ for (i = 1; i <= 12; i++) {
+ _verbName.push_back(queen2jas->nextLine());
+ }
+
+ _joeResponse.push_back("");
+ for (i = 1; i <= JOE_RESPONSE_MAX; i++) {
+ _joeResponse.push_back(queen2jas->nextLine());
+ }
// FIXME - the spanish version adds some space characters (0x20) at the
// beginning and the end of the journal button captions. As we don't need
@@ -223,21 +235,22 @@ void Logic::initialise() {
}
}
- _aAnim = new char*[_numAAnim + 1];
- _aAnim[0] = 0;
- for (i = 1; i <= _numAAnim; i++)
- _aAnim[i] = _queen2jas->nextLine();
+ _aAnim.push_back("");
+ for (i = 1; i <= _numAAnim; i++) {
+ _aAnim.push_back(queen2jas->nextLine());
+ }
- _aName = new char*[_numAName + 1];
- _aName[0] = 0;
- for (i = 1; i <= _numAName; i++)
- _aName[i] = _queen2jas->nextLine();
+ _aName.push_back("");
+ for (i = 1; i <= _numAName; i++) {
+ _aName.push_back(queen2jas->nextLine());
+ }
- _aFile = new char*[_numAFile + 1];
- _aFile[0] = 0;
- for (i = 1; i <= _numAFile; i++)
- _aFile[i] = _queen2jas->nextLine();
-
+ _aFile.push_back("");
+ for (i = 1; i <= _numAFile; i++) {
+ _aFile.push_back(queen2jas->nextLine());
+ }
+
+ delete queen2jas;
_vm->command()->clear(false);
_scene = 0;
@@ -264,23 +277,23 @@ uint16 Logic::findBob(uint16 obj) const {
uint16 bobnum = 0;
int16 img = _objectData[obj].image;
- if(img != 0) {
- if(img == -3 || img == -4) {
+ if (img != 0) {
+ if (img == -3 || img == -4) {
// a person object
bobnum = findPersonNumber(obj, room);
} else {
uint16 bobtype = 0; // 1 for animated, 0 for static
- if(img <= -10) {
+ if (img <= -10) {
// object has been turned off, but the image order hasn't been updated
if(_graphicData[-(img + 10)].lastFrame != 0) {
bobtype = 1;
}
- } else if(img == -2) {
+ } else if (img == -2) {
// -1 static, -2 animated
bobtype = 1;
- } else if(img > 0) {
- if(_graphicData[img].lastFrame != 0) {
+ } else if (img > 0) {
+ if (_graphicData[img].lastFrame != 0) {
bobtype = 1;
}
}
@@ -335,16 +348,16 @@ uint16 Logic::findFrame(uint16 obj) const {
int16 img = _objectData[obj].image;
if (img == -3 || img == -4) {
uint16 bobnum = findPersonNumber(obj, room);
- if(bobnum <= 3) {
+ if (bobnum <= 3) {
framenum = 31 + bobnum;
}
} else {
uint16 idx = 0;
- for(uint16 i = _roomData[room] + 1; i < obj; ++i) {
+ for (uint16 i = _roomData[room] + 1; i < obj; ++i) {
img = _objectData[i].image;
if (img <= -10) {
const GraphicData* pgd = &_graphicData[-(img + 10)];
- if(pgd->lastFrame != 0) {
+ if (pgd->lastFrame != 0) {
// skip all the frames of the animation
idx += ABS(pgd->lastFrame) - pgd->firstFrame + 1;
} else {
@@ -436,7 +449,23 @@ void Logic::gameState(int index, int16 newValue) {
const char *Logic::roomName(uint16 roomNum) const {
assert(roomNum >= 1 && roomNum <= _numRooms);
- return _roomName[roomNum];
+ return _roomName[roomNum].c_str();
+}
+
+const char *Logic::objectName(uint16 objNum) const {
+ return _objName[objNum].c_str();
+}
+
+const char *Logic::objectTextualDescription(uint16 objNum) const {
+ return _objDescription[objNum].c_str();
+}
+
+const char *Logic::joeResponse(int i) const {
+ return _joeResponse[i].c_str();
+}
+
+const char *Logic::verbName(Verb v) const {
+ return _verbName[v].c_str();
}
void Logic::eraseRoom() {
@@ -539,7 +568,7 @@ ActorData *Logic::findActor(uint16 noun, const char *name) const {
for (uint16 i = 1; i <= _numActors; ++i) {
ActorData *pad = &_actorData[i];
if (pad->room == _currentRoom && gameState(pad->gsSlot) == pad->gsValue) {
- if (bobNum == pad->bobNum || (name && !strcmp(_aName[pad->name], name))) {
+ if (bobNum == pad->bobNum || (name && _aName[pad->name] == name)) {
return pad;
}
}
@@ -552,14 +581,14 @@ bool Logic::initPerson(uint16 noun, const char *actorName, bool loadBank, Person
const ActorData *pad = findActor(noun, actorName);
if (pad != NULL) {
pp->actor = pad;
- pp->name = _aName[pad->name];
+ pp->name = _aName[pad->name].c_str();
if (pad->anim != 0) {
- pp->anim = _aAnim[pad->anim];
+ pp->anim = _aAnim[pad->anim].c_str();
} else {
pp->anim = NULL;
}
if (loadBank && pad->file != 0) {
- _vm->bankMan()->load(_aFile[pad->file], pad->bankNum);
+ _vm->bankMan()->load(_aFile[pad->file].c_str(), pad->bankNum);
// if there is no valid actor file (ie pad->file is 0), the person
// data is already loaded as it is included in objects room bank (.bbk)
}
@@ -851,7 +880,7 @@ void Logic::playCutaway(const char *cutFile, char *next) {
}
void Logic::makeJoeSpeak(uint16 descNum, bool objectType) {
- const char *text = objectType ? _objDescription[descNum] : _joeResponse[descNum];
+ const char *text = objectType ? _objDescription[descNum].c_str() : _joeResponse[descNum].c_str();
if (objectType) {
descNum += JOE_RESPONSE_MAX;
}
diff --git a/queen/logic.h b/queen/logic.h
index e020fd7b87..ea764aa293 100644
--- a/queen/logic.h
+++ b/queen/logic.h
@@ -22,6 +22,7 @@
#ifndef QUEENLOGIC_H
#define QUEENLOGIC_H
+#include "common/str.h"
#include "common/util.h"
#include "queen/defs.h"
#include "queen/structs.h"
@@ -29,8 +30,8 @@
namespace Queen {
enum RoomDisplayMode {
- RDM_FADE_NOJOE = 0, // fade in, no Joe
- RDM_FADE_JOE = 1, // Joe is to be displayed
+ RDM_FADE_NOJOE = 0, // fade in, hide Joe
+ RDM_FADE_JOE = 1, // fade in, display Joe
RDM_NOFADE_JOE = 2, // screen does not dissolve into view
RDM_FADE_JOE_XY = 3 // display Joe at the current X, Y coords
};
@@ -108,9 +109,6 @@ public:
void joeScale(uint16 scale) { _joe.scale = scale; }
void joeCutFacing(uint16 dir) { _joe.cutFacing = dir; }
void joePrevFacing(uint16 dir) { _joe.prevFacing = dir; }
-
- const char *joeResponse(int i) const { return _joeResponse[i]; }
- const char *verbName(Verb v) const { return _verbName[v]; }
int16 gameState(int index) const;
void gameState(int index, int16 newValue);
@@ -118,8 +116,10 @@ public:
TalkSelected *talkSelected(int index) { return &_talkSelected[index]; }
const char *roomName(uint16 roomNum) const;
- const char *objectName(uint16 objNum) const { return _objName[objNum]; }
- const char *objectTextualDescription(uint16 objNum) const { return _objDescription[objNum]; }
+ const char *objectName(uint16 objNum) const;
+ const char *objectTextualDescription(uint16 objNum) const;
+ const char *joeResponse(int i) const;
+ const char *verbName(Verb v) const;
void eraseRoom();
void setupRoom(const char *room, int comPanel, bool inCutaway);
@@ -250,9 +250,7 @@ protected:
virtual bool preChangeRoom() = 0;
virtual bool handleSpecialMove(uint16 sm) = 0;
-
-
- LineReader *_queen2jas;
+
uint16 _currentRoom;
uint16 _oldRoom;
@@ -300,29 +298,29 @@ protected:
int16 _entryObj;
//! Object description (Look At)
- char **_objDescription;
+ Common::StringList _objDescription;
uint16 _numDescriptions;
- char **_objName;
+ Common::StringList _objName;
uint16 _numNames;
//! Room name, prefix for data files (PCX, LUM...)
- char **_roomName;
+ Common::StringList _roomName;
- char *_verbName[13];
+ Common::StringList _verbName;
- char *_joeResponse[JOE_RESPONSE_MAX + 1];
+ Common::StringList _joeResponse;
//! Actor animation string
- char **_aAnim;
+ Common::StringList _aAnim;
uint16 _numAAnim;
//! Actor name
- char **_aName;
+ Common::StringList _aName;
uint16 _numAName;
//! Actor filename
- char **_aFile;
+ Common::StringList _aFile;
uint16 _numAFile;
struct {
@@ -339,9 +337,10 @@ protected:
//! Inventory items
int16 _inventoryItem[4];
+ //! Puzzle counter for room T7
uint8 _puzzleAttemptCount;
- //! scene counter
+ //! Cutscene counter
int _scene;
Credits *_credits;