mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-22 01:57:16 +00:00
plugged some memory leaks
svn-id: r15591
This commit is contained in:
parent
a41b8d2293
commit
b33f7b4b76
@ -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();
|
||||
|
@ -72,6 +72,7 @@ class Command {
|
||||
public:
|
||||
|
||||
Command(QueenEngine *vm);
|
||||
~Command();
|
||||
|
||||
//! initialise command construction
|
||||
void clear(bool clearTexts);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -39,6 +39,7 @@ class Grid {
|
||||
public:
|
||||
|
||||
Grid(QueenEngine *vm);
|
||||
~Grid();
|
||||
|
||||
void readDataFrom(uint16 numObjects, uint16 numRooms, byte *&ptr);
|
||||
|
||||
|
153
queen/logic.cpp
153
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();
|
||||
_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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user