plugged some memory leaks

svn-id: r15591
This commit is contained in:
Gregory Montoir 2004-10-17 19:00:09 +00:00
parent a41b8d2293
commit b33f7b4b76
6 changed files with 126 additions and 81 deletions

View File

@ -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();

View File

@ -72,6 +72,7 @@ class Command {
public:
Command(QueenEngine *vm);
~Command();
//! initialise command construction
void clear(bool clearTexts);

View File

@ -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;

View File

@ -39,6 +39,7 @@ class Grid {
public:
Grid(QueenEngine *vm);
~Grid();
void readDataFrom(uint16 numObjects, uint16 numRooms, byte *&ptr);

View File

@ -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();
_objName.push_back("");
for (i = 1; i <= _numNames; i++) {
_objName.push_back(queen2jas->nextLine());
}
_roomName = new char*[_numRooms + 1];
_roomName[0] = 0;
for (i = 1; i <= _numRooms; i++)
_roomName[i] = _queen2jas->nextLine();
_roomName.push_back("");
for (i = 1; i <= _numRooms; i++) {
_roomName.push_back(queen2jas->nextLine());
}
_verbName[0] = 0;
for (i = 1; i <= 12; i++)
_verbName[i] = _queen2jas->nextLine();
_verbName.push_back("");
for (i = 1; i <= 12; i++) {
_verbName.push_back(queen2jas->nextLine());
}
_joeResponse[0] = 0;
for (i = 1; i <= JOE_RESPONSE_MAX; i++)
_joeResponse[i] = _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;
}

View File

@ -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;