HUGO: Replace cypher by a global variable, clean engine destructor

This commit is contained in:
strangerke 2011-02-15 19:30:15 +01:00
parent 325a301a4f
commit 2f0b35bbb5
10 changed files with 119 additions and 154 deletions

View file

@ -585,17 +585,12 @@ void Screen::loadPalette(Common::ReadStream &in) {
}
/**
* Free main and current palettes
* Free fonts, main and current palettes
*/
void Screen::freePalette() {
void Screen::freeScreen() {
free(_curPalette);
free(_mainPalette);
}
/**
* Free fonts
*/
void Screen::freeFonts() {
for (int i = 0; i < kNumFonts; i++) {
if (_arrayFont[i])
free(_arrayFont[i]);

View file

@ -65,8 +65,7 @@ public:
void drawRectangle(const bool filledFl, const int16 x1, const int16 y1, const int16 x2, const int16 y2, const int color);
void drawShape(const int x, const int y, const int color1, const int color2);
void drawStatusText();
void freeFonts();
void freePalette();
void freeScreen();
void hideCursor();
void initDisplay();
void initNewScreenDisplay();

View file

@ -369,14 +369,7 @@ bool FileManager::saveGame(const int16 slot, const Common::String &descrip) {
for (int i = 0; i < _vm->_numScreens; i++)
out->writeByte(_vm->_screenStates[i]);
_vm->_scheduler->savePoints(out);
// Now save current time and all current events in event queue
_vm->_scheduler->saveEvents(out);
// Now save current actions
_vm->_scheduler->saveActions(out);
_vm->_scheduler->saveSchedulerData(out);
// Save palette table
_vm->_screen->savePal(out);
@ -471,14 +464,7 @@ bool FileManager::restoreGame(const int16 slot) {
for (int i = 0; i < _vm->_numScreens; i++)
_vm->_screenStates[i] = in->readByte();
_vm->_scheduler->restorePoints(in);
_vm->_object->restoreAllSeq();
// Now restore time of the save and the event queue
_vm->_scheduler->restoreEvents(in);
// Now restore actions
_vm->_scheduler->restoreActions(in);
_vm->_scheduler->restoreSchedulerData(in);
// Restore palette and change it if necessary
_vm->_screen->restorePal(in);

View file

@ -74,30 +74,22 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
}
HugoEngine::~HugoEngine() {
shutdown();
_file->closeDatabaseFiles();
_screen->freePalette();
_text->freeAllTexts();
_intro->freeIntroData();
_parser->freeArrayReqs();
_mouse->freeHotspots();
_inventory->freeInvent();
_object->freeObjectUses();
_parser->freeCatchallList();
_parser->freeBackgroundObjects();
_scheduler->freePoints();
_parser->freeCmdList();
_scheduler->freeScreenAct();
_object->freeObjectArr();
_scheduler->freeActListArr();
_mouse->freeHotspots();
_object->freeObjects();
_parser->freeParser();
_scheduler->freeScheduler();
_screen->freeScreen();
_text->freeAllTexts();
free(_defltTunes);
free(_screenStates);
_screen->freeFonts();
delete _topMenu;
delete _object;
delete _sound;
delete _route;
@ -203,11 +195,12 @@ Common::Error HugoEngine::run() {
_screen->setCursorPal();
_screen->resetInventoryObjId();
_scheduler->initCypher();
initStatus(); // Initialize game status
initConfig(); // Initialize user's config
initialize();
resetConfig(); // Reset user's config
initMachine();
// Start the state machine
@ -576,16 +569,6 @@ void HugoEngine::initialize() {
}
}
/**
* Restore all resources before termination
*/
void HugoEngine::shutdown() {
debugC(1, kDebugEngine, "shutdown");
_file->closeDatabaseFiles();
_object->freeObjects();
}
/**
* Read scenery, overlay files for given screen number
*/

View file

@ -213,52 +213,54 @@ void ObjectHandler::lookObject(object_t *obj) {
}
/**
* Free all object images
* Free all object images, uses and ObjArr (before exiting)
*/
void ObjectHandler::freeObjects() {
debugC(1, kDebugObject, "freeObjects");
// Nothing to do if not allocated yet
if (_vm->_hero == 0 || _vm->_hero->seqList[0].seqPtr == 0)
return;
// Free all sequence lists and image data
for (int i = 0; i < _numObj; i++) {
object_t *obj = &_objects[i];
for (int j = 0; j < obj->seqNumb; j++) {
seq_t *seq = obj->seqList[j].seqPtr;
seq_t *next;
if (seq == 0) // Failure during database load
break;
if (seq->imagePtr != 0) {
free(seq->imagePtr);
seq->imagePtr = 0;
}
seq = seq->nextSeqPtr;
while (seq != obj->seqList[j].seqPtr) {
if (_vm->_hero != 0 && _vm->_hero->seqList[0].seqPtr != 0) {
// Free all sequence lists and image data
for (int16 i = 0; i < _numObj; i++) {
object_t *obj = &_objects[i];
for (int16 j = 0; j < obj->seqNumb; j++) {
seq_t *seq = obj->seqList[j].seqPtr;
seq_t *next;
if (seq == 0) // Failure during database load
break;
if (seq->imagePtr != 0) {
free(seq->imagePtr);
seq->imagePtr = 0;
}
next = seq->nextSeqPtr;
seq = seq->nextSeqPtr;
while (seq != obj->seqList[j].seqPtr) {
if (seq->imagePtr != 0) {
free(seq->imagePtr);
seq->imagePtr = 0;
}
next = seq->nextSeqPtr;
free(seq);
seq = next;
}
free(seq);
seq = next;
}
free(seq);
}
}
}
/**
* Free all object uses
*/
void ObjectHandler::freeObjectUses() {
if (_uses) {
for (int i = 0; i < _usesSize; i++)
for (int16 i = 0; i < _usesSize; i++)
free(_uses[i].targets);
free(_uses);
}
for(int16 i = 0; i < _objCount; i++) {
free(_objects[i].stateDataIndex);
_objects[i].stateDataIndex = 0;
}
free(_objects);
_objects = 0;
}
/**
* Compare function for the quicksort. The sort is to order the objects in
* increasing vertical position, using y+y2 as the baseline
@ -366,18 +368,6 @@ bool ObjectHandler::findObjectSpace(object_t *obj, int16 *destx, int16 *desty) {
return foundFl;
}
/**
* Free ObjectArr (before exiting)
*/
void ObjectHandler::freeObjectArr() {
for(int16 i = 0; i < _objCount; i++) {
free(_objects[i].stateDataIndex);
_objects[i].stateDataIndex = 0;
}
free(_objects);
_objects = 0;
}
/**
* Load _uses from Hugo.dat
*/

View file

@ -73,10 +73,8 @@ public:
int calcMaxScore();
int16 findObject(uint16 x, uint16 y);
void freeObjects();
void freeObjectUses();
void loadObjectArr(Common::ReadStream &in);
void loadObjectUses(Common::ReadStream &in);
void freeObjectArr();
void loadNumObj(Common::ReadStream &in);
void lookObject(object_t *obj);
void readObjectImages();

View file

@ -105,14 +105,6 @@ void Parser::loadCmdList(Common::ReadStream &in) {
}
}
void Parser::freeCmdList() {
if (_cmdList) {
for (int i = 0; i < _cmdListSize; i++)
free(_cmdList[i]);
free(_cmdList);
}
}
/**
* Read _backgrounObjects from Hugo.dat
*/
@ -146,14 +138,6 @@ void Parser::loadBackgroundObjects(Common::ReadStream &in) {
}
}
void Parser::freeBackgroundObjects() {
if (_backgroundObjects) {
for (int i = 0; i < _backgroundObjectsSize; i++)
free(_backgroundObjects[i]);
free(_backgroundObjects);
}
}
/**
* Read _catchallList from Hugo.dat
*/
@ -178,10 +162,6 @@ void Parser::loadCatchallList(Common::ReadStream &in) {
}
}
void Parser::freeCatchallList() {
free(_catchallList);
}
void Parser::loadArrayReqs(Common::ReadStream &in) {
_arrayReqs = _vm->loadLongArray(in);
}
@ -204,12 +184,26 @@ const char *Parser::useBG(const char *name) {
return 0;
}
void Parser::freeArrayReqs() {
void Parser::freeParser() {
if (_arrayReqs) {
for (int i = 0; _arrayReqs[i] != 0; i++)
free(_arrayReqs[i]);
free(_arrayReqs);
}
free(_catchallList);
if (_backgroundObjects) {
for (int i = 0; i < _backgroundObjectsSize; i++)
free(_backgroundObjects[i]);
free(_backgroundObjects);
}
if (_cmdList) {
for (int i = 0; i < _cmdListSize; i++)
free(_cmdList[i]);
free(_cmdList);
}
}
void Parser::switchTurbo() {

View file

@ -53,10 +53,7 @@ public:
void charHandler();
void command(const char *format, ...);
void freeArrayReqs();
void freeBackgroundObjects();
void freeCatchallList();
void freeCmdList();
void freeParser();
void keyHandler(Common::Event event);
void loadArrayReqs(Common::ReadStream &in);
void loadBackgroundObjects(Common::ReadStream &in);

View file

@ -57,6 +57,10 @@ Scheduler::Scheduler(HugoEngine *vm) : _vm(vm), _actListArr(0), _curTick(0), _ol
Scheduler::~Scheduler() {
}
void Scheduler::initCypher() {
_cypher = getCypher();
}
/**
* Initialise the timer event queue
*/
@ -840,21 +844,6 @@ void Scheduler::loadActListArr(Common::ReadStream &in) {
}
}
void Scheduler::freeActListArr() {
debugC(6, kDebugSchedule, "freeActListArr()");
if (_actListArr) {
for (int i = 0; i < _actListArrSize; i++) {
for (int j = 0; _actListArr[i][j].a0.actType != ANULL; j++) {
if (_actListArr[i][j].a0.actType == PROMPT)
free(_actListArr[i][j].a3.responsePtr);
}
free(_actListArr[i]);
}
free(_actListArr);
}
}
/**
* Read _screenActs
*/
@ -885,12 +874,27 @@ void Scheduler::loadScreenAct(Common::ReadStream &in) {
}
}
void Scheduler::freeScreenAct() {
void Scheduler::freeScheduler() {
debugC(6, kDebugSchedule, "freeActListArr()");
free(_points);
if (_screenActs) {
for (int i = 0; i < _screenActsSize; i++)
free(_screenActs[i]);
free(_screenActs);
}
if (_actListArr) {
for (int i = 0; i < _actListArrSize; i++) {
for (int j = 0; _actListArr[i][j].a0.actType != ANULL; j++) {
if (_actListArr[i][j].a0.actType == PROMPT)
free(_actListArr[i][j].a3.responsePtr);
}
free(_actListArr[i]);
}
free(_actListArr);
}
}
/**
@ -1020,7 +1024,6 @@ int16 Scheduler::calcMaxPoints() const {
/*
* Save the action data in the file with handle f
*/
void Scheduler::saveActions(Common::WriteStream* f) const {
for (int i = 0; i < _actListArrSize; i++) {
// write all the sub elems data
@ -1061,6 +1064,27 @@ void Scheduler::findAction(act* action, int16* index, int16* subElem) {
assert(0);
}
void Scheduler::saveSchedulerData(Common::WriteStream *out) {
savePoints(out);
// Now save current time and all current events in event queue
saveEvents(out);
// Now save current actions
saveActions(out);
}
void Scheduler::restoreSchedulerData(Common::ReadStream *in) {
restorePoints(in);
_vm->_object->restoreAllSeq();
// Now restore time of the save and the event queue
restoreEvents(in);
// Now restore actions
restoreActions(in);
}
/**
* Restore the event list from file with handle f
*/
@ -1455,7 +1479,7 @@ void Scheduler::delEventType(const action_t actTypeDel) {
/**
* Save the points table
*/
void Scheduler::savePoints(Common::WriteStream *out) {
void Scheduler::savePoints(Common::WriteStream *out) const {
for (int i = 0; i < _numBonuses; i++) {
out->writeByte(_points[i].score);
out->writeByte((_points[i].scoredFl) ? 1 : 0);
@ -1533,11 +1557,9 @@ void Scheduler_v1d::promptAction(act *action) {
void Scheduler_v1d::decodeString(char *line) {
debugC(1, kDebugSchedule, "decodeString(%s)", line);
static const Common::String cypher = getCypher();
uint16 linelength = strlen(line);
for(uint16 i = 0; i < linelength; i++) {
line[i] = (line[i] + cypher.c_str()[i % cypher.size()]) % '~';
line[i] = (line[i] + _cypher.c_str()[i % _cypher.size()]) % '~';
if (line[i] < ' ')
line[i] += ' ';
}
@ -1586,11 +1608,10 @@ void Scheduler_v2d::promptAction(act *action) {
void Scheduler_v2d::decodeString(char *line) {
debugC(1, kDebugSchedule, "decodeString(%s)", line);
static const Common::String cypher = getCypher();
int16 lineLength = strlen(line);
for (uint16 i = 0; i < lineLength; i++)
line[i] -= cypher.c_str()[i % cypher.size()];
line[i] -= _cypher.c_str()[i % _cypher.size()];
debugC(1, kDebugSchedule, "result : %s", line);
}

View file

@ -458,12 +458,10 @@ public:
virtual void decodeString(char *line) = 0;
virtual void runScheduler() = 0;
void freePoints() { free(_points); }
int16 calcMaxPoints() const;
void freeActListArr();
void freeScreenAct();
void freeScheduler();
void initCypher();
void initEventQueue();
void insertActionList(const uint16 actIndex);
void loadActListArr(Common::ReadStream &in);
@ -473,24 +471,20 @@ public:
void newScreen(const int screenIndex);
void processBonus(const int bonusIndex);
void processMaze(const int x1, const int x2, const int y1, const int y2);
void restoreSchedulerData(Common::ReadStream *in);
void restoreScreen(const int screenIndex);
void restoreEvents(Common::ReadStream *f);
void restorePoints(Common::ReadStream *in);
void saveEvents(Common::WriteStream *f);
void savePoints(Common::WriteStream *out);
void screenActions(const int screenNum);
void saveSchedulerData(Common::WriteStream *out);
void waitForRefresh();
void findAction(act* action, int16* index, int16* subElem);
void saveActions(Common::WriteStream* f) const;
void restoreActions(Common::ReadStream *f);
protected:
HugoEngine *_vm;
static const int kFilenameLength = 12; // Max length of a DOS file name
static const int kMaxEvents = 50; // Max events in event queue
static const int kShiftSize = 8; // Place hero this far inside bounding box
Common::String _cypher;
uint16 _actListArrSize;
uint16 _alNewscrIndex;
uint16 _screenActsSize;
@ -525,6 +519,14 @@ protected:
void delEventType(const action_t actTypeDel);
void delQueue(event_t *curEvent);
void insertAction(act *action);
void restoreActions(Common::ReadStream *f);
void restoreEvents(Common::ReadStream *f);
void restorePoints(Common::ReadStream *in);
void saveActions(Common::WriteStream* f) const;
void saveEvents(Common::WriteStream *f);
void savePoints(Common::WriteStream *out) const;
void screenActions(const int screenNum);
};
class Scheduler_v1d : public Scheduler {