free memory on quit.

Still leaks some, though

svn-id: r15735
This commit is contained in:
Robert Göffringmann
2004-11-09 04:06:10 +00:00
parent daee2edcfe
commit 021f2cbcce
17 changed files with 146 additions and 66 deletions
+11 -12
View File
@@ -216,7 +216,7 @@ void Control::askForCd(void) {
notAccepted = false;
}
}
} while (notAccepted);
} while (notAccepted && (!SwordEngine::_systemVars.engineQuit));
_resMan->resClose(fontId);
free(_screenBuf);
@@ -303,7 +303,7 @@ uint8 Control::runPanel(void) {
_system->updateScreen();
delay(1000 / 12);
newMode = getClicks(mode, &retVal);
} while ((newMode != 1) && (retVal == 0));
} while ((newMode != 1) && (retVal == 0) && (!SwordEngine::_systemVars.engineQuit));
destroyButtons();
_resMan->resClose(fontId);
_resMan->resClose(redFontId);
@@ -366,7 +366,7 @@ uint8 Control::handleButtonClick(uint8 id, uint8 mode, uint8 *retVal) {
switch(mode) {
case BUTTON_MAIN_PANEL:
if (id == BUTTON_RESTART) {
if (SwordEngine::_systemVars.deathScreenFlag) // if player is dead or has just started, don't ask for confirmation
if (SwordEngine::_systemVars.controlPanelMode) // if player is dead or has just started, don't ask for confirmation
*retVal |= CONTROL_RESTART_GAME;
else if (getConfirm(_lStrings[STR_RESTART]))
*retVal |= CONTROL_RESTART_GAME;
@@ -380,9 +380,8 @@ uint8 Control::handleButtonClick(uint8 id, uint8 mode, uint8 *retVal) {
_buttons[5]->setSelected(SwordEngine::_systemVars.showText);
} else if (id == BUTTON_QUIT) {
if (getConfirm(_lStrings[STR_QUIT]))
_system->quit();
else
return mode;
SwordEngine::_systemVars.engineQuit = true;
return mode;
}
break;
case BUTTON_SAVE_PANEL:
@@ -421,7 +420,7 @@ void Control::deselectSaveslots(void) {
void Control::setupMainPanel(void) {
uint32 panelId;
if (SwordEngine::_systemVars.deathScreenFlag == 1)
if (SwordEngine::_systemVars.controlPanelMode == CP_DEATHSCREEN)
panelId = SR_DEATHPANEL;
else {
if (SwordEngine::_systemVars.language <= BS1_SPANISH)
@@ -434,17 +433,17 @@ void Control::setupMainPanel(void) {
panel->draw();
delete panel;
if (SwordEngine::_systemVars.deathScreenFlag)
if (SwordEngine::_systemVars.controlPanelMode != CP_NORMAL)
createButtons(_deathButtons, 3);
else {
createButtons(_panelButtons, 7);
_buttons[5]->setSelected(SwordEngine::_systemVars.showText);
}
if (SwordEngine::_systemVars.deathScreenFlag == 2) // end of game
if (SwordEngine::_systemVars.controlPanelMode == CP_THEEND) // end of game
renderText(_lStrings[STR_THE_END], 480, 188 + 40, TEXT_RIGHT_ALIGN);
if (SwordEngine::_systemVars.deathScreenFlag == 0) { // normal panel
if (SwordEngine::_systemVars.controlPanelMode == CP_NORMAL) { // normal panel
renderText(_lStrings[STR_SAVE], 180, 188 + 40, TEXT_LEFT_ALIGN);
renderText(_lStrings[STR_DONE], 460, 332 + 40, TEXT_RIGHT_ALIGN);
renderText(_lStrings[STR_RESTORE], 180, 224 + 40, TEXT_LEFT_ALIGN);
@@ -455,7 +454,7 @@ void Control::setupMainPanel(void) {
renderText(_lStrings[STR_TEXT], 460, 224 + 40, TEXT_RIGHT_ALIGN);
} else {
renderText(_lStrings[STR_RESTORE], 285, 224 + 40, TEXT_LEFT_ALIGN);
if (SwordEngine::_systemVars.deathScreenFlag == 3) // just started game
if (SwordEngine::_systemVars.controlPanelMode == CP_NEWGAME) // just started game
renderText(_lStrings[STR_START], 285, 260 + 40, TEXT_LEFT_ALIGN);
else
renderText(_lStrings[STR_RESTART], 285, 260 + 40, TEXT_LEFT_ALIGN);
@@ -1031,7 +1030,7 @@ void Control::delay(uint32 msecs) {
_mouseState |= BS1_WHEEL_DOWN;
break;
case OSystem::EVENT_QUIT:
_system->quit();
SwordEngine::_systemVars.engineQuit = true;
break;
default:
break;
-1
View File
@@ -69,7 +69,6 @@ struct ButtonInfo {
class Control {
public:
Control(SaveFileManager *saveFileMan, ResMan *pResMan, ObjectMan *pObjMan, OSystem *system, Mouse *pMouse, Sound *pSound, Music *pMusic, const char *savePath);
~Control(void);
uint8 runPanel(void);
void doRestore(void);
void askForCd(void);
+8 -2
View File
@@ -61,6 +61,12 @@ Logic::Logic(ObjectMan *pObjMan, ResMan *resMan, Screen *pScreen, Mouse *pMouse,
_mixer = mixer;
}
Logic::~Logic(void) {
delete _textMan;
delete _router;
delete _eventMan;
}
void Logic::initialize(void) {
memset(_scriptVars, 0, NUM_SCRIPT_VARS * sizeof(uint32));
for (uint8 cnt = 0; cnt < NON_ZERO_SCRIPT_VARS; cnt++)
@@ -1616,9 +1622,9 @@ int Logic::fnQuitGame(Object *cpt, int32 id, int32 a, int32 b, int32 c, int32 d,
int Logic::fnDeathScreen(Object *cpt, int32 id, int32 a, int32 b, int32 c, int32 d, int32 z, int32 x) {
if (_scriptVars[FINALE_OPTION_FLAG] == 4) // successful end of game!
SwordEngine::_systemVars.deathScreenFlag = 2;
SwordEngine::_systemVars.controlPanelMode = CP_THEEND;
else
SwordEngine::_systemVars.deathScreenFlag = 1;
SwordEngine::_systemVars.controlPanelMode = CP_DEATHSCREEN;
cpt->o_logic = LOGIC_quit;
return SCRIPT_STOP;
+3
View File
@@ -31,6 +31,9 @@ MemMan::MemMan(void) {
}
MemMan::~MemMan(void) {
flush();
if (_alloced)
warning("deleting MemMan, still %d bytes alloced\n", _alloced);
}
void MemMan::alloc(MemHandle *bsMem, uint32 pSize, uint16 pCond) {
+12
View File
@@ -103,6 +103,18 @@ Menu::Menu(Screen *pScreen, Mouse *pMouse) {
_inMenu = 0;
}
Menu::~Menu(void) {
// the menu may be open, so delete the icons
for (int i = 0; i < TOTAL_pockets; i++) {
delete _objects[i];
_objects[i] = NULL;
}
for (int i = 0; i < TOTAL_subjects; i++) {
delete _subjects[i];
_subjects[i] = NULL;
}
}
void Menu::refreshMenus() {
if (_objectBarStatus == MENU_OPEN) {
buildMenu();
+1
View File
@@ -64,6 +64,7 @@ private:
class Menu {
public:
Menu(Screen *pScreen, Mouse *pMouse);
~Menu(void);
void fnChooser(Object *compact);
void fnEndChooser(void);
void fnAddSubject(int32 sub);
+8
View File
@@ -40,6 +40,14 @@ Mouse::Mouse(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan) {
_currentPtr = NULL;
}
Mouse::~Mouse(void) {
setLuggage(0, 0);
setPointer(0, 0);
for (uint8 cnt = 0; cnt < 17; cnt++) // force res manager to keep mouse
_resMan->resClose(MSE_POINTER + cnt); // cursors in memory all the time
}
void Mouse::initialize(void) {
_numObjs = 0;
Logic::_scriptVars[MOUSE_STATUS] = 0; // mouse off and unlocked
+1
View File
@@ -72,6 +72,7 @@ class ObjectMan;
class Mouse {
public:
Mouse(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan);
~Mouse(void);
void initialize(void);
void addToList(int id, Object *compact);
void useLogicAndMenu(Logic *pLogic, Menu *pMenu);
+19
View File
@@ -52,6 +52,25 @@ ResMan::ResMan(const char *resFile, MemMan *pMemoMan) {
}
ResMan::~ResMan(void) {
#if 0
for (uint32 clusCnt = 0; clusCnt < _prj.noClu; clusCnt++) {
Clu *cluster = _prj.clu[clusCnt];
if (cluster) {
for (uint32 grpCnt = 0; grpCnt < cluster->noGrp; grpCnt++) {
Grp *group = cluster->grp[grpCnt];
if (group) {
for (uint32 resCnt = 0; resCnt < group->noRes; resCnt++) {
if (group->resHandle[resCnt].cond == MEM_DONT_FREE) {
warning("ResMan::~ResMan: Resource %02X.%04X.%02X is still open",
clusCnt + 1, grpCnt, resCnt);
}
}
}
}
}
}
debug(0, "ResMan closed\n");
#endif
freeCluDescript();
}
-1
View File
@@ -96,7 +96,6 @@ extern int whatTarget(int32 startX, int32 startY, int32 destX, int32 destY);
class Router {
public:
Router(ObjectMan *pObjMan, ResMan *pResMan);
~Router(void);
int32 routeFinder(int32 id, Object *mega, int32 x, int32 y, int32 dir);
void setPlayerTarget(int32 x, int32 y, int32 dir, int32 stance);
void resetExtraData(void);
+11
View File
@@ -47,6 +47,16 @@ Screen::Screen(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan) {
_screenBuf = _screenGrid = NULL;
_backLength = _foreLength = _sortLength = 0;
_fadingStep = 0;
_currentScreen = 0xFFFF;
}
Screen::~Screen(void) {
if (_screenBuf)
free(_screenBuf);
if (_screenGrid)
free(_screenGrid);
if (_currentScreen != 0xFFFF)
quitScreen();
}
void Screen::useTextManager(Text *pTextMan) {
@@ -309,6 +319,7 @@ void Screen::quitScreen(void) {
_resMan->resClose(_roomDefTable[_currentScreen].parallax[0]);
if (_roomDefTable[_currentScreen].parallax[1])
_resMan->resClose(_roomDefTable[_currentScreen].parallax[1]);
_currentScreen = 0xFFFF;
}
void Screen::draw(void) {
+1 -1
View File
@@ -67,8 +67,8 @@ class Text; // Text objects use sprites that are created internally at run-time
class Screen {
public:
Screen(OSystem *system, ResMan *pResMan, ObjectMan *pObjMan);
void useTextManager(Text *pTextMan);
~Screen(void);
void useTextManager(Text *pTextMan);
void draw(void);
void quitScreen(void);
+10
View File
@@ -41,6 +41,16 @@ Sound::Sound(const char *searchPath, SoundMixer *mixer, ResMan *pResMan) {
_speechVolL = _speechVolR = _sfxVolL = _sfxVolR = 192;
}
Sound::~Sound(void) {
// clean up fx queue
_mixer->stopAll();
for (uint8 cnt = 0; cnt < _endOfQueue; cnt++)
if (_fxQueue[cnt].delay == 0)
_resMan->resClose(_fxList[_fxQueue[cnt].id].sampleId);
_endOfQueue = 0;
closeCowSystem();
}
int Sound::addToQueue(int32 fxNo) {
bool alreadyInQueue = false;
for (uint8 cnt = 0; (cnt < _endOfQueue) && (!alreadyInQueue); cnt++)
+47 -43
View File
@@ -113,6 +113,17 @@ SwordEngine::SwordEngine(GameDetector *detector, OSystem *syst)
}
SwordEngine::~SwordEngine() {
delete _control;
delete _logic;
delete _menu;
delete _sound;
delete _music;
delete _screen;
delete _mouse;
delete _objectMan;
_resMan->flush(); // free all memory
delete _resMan;
delete _memMan;
}
void SwordEngine::initialize(void) {
@@ -155,10 +166,10 @@ void SwordEngine::initialize(void) {
_systemVars.justRestoredGame = 0;
_systemVars.currentCD = 0;
_systemVars.gamePaused = 0;
_systemVars.deathScreenFlag = 3;
_systemVars.controlPanelMode = CP_NEWGAME;
_systemVars.forceRestart = false;
_systemVars.wantFade = true;
_systemVars.engineQuit = false;
switch (Common::parseLanguage(ConfMan.get("language"))) {
case Common::DE_DEU:
@@ -1065,7 +1076,7 @@ void SwordEngine::startPositions(int32 startNumber) {
compact = (Object*)_objectMan->fetchObject(PLAYER);
_logic->fnEnterSection(compact, PLAYER, startNumber, 0, 0, 0, 0, 0); // (automatically opens the compact resource for that section)
_systemVars.deathScreenFlag = 0;
_systemVars.controlPanelMode = CP_NORMAL;
_systemVars.wantFade = true;
}
@@ -1079,7 +1090,7 @@ void SwordEngine::checkCdFiles(void) { // check if we're running from cd, hdd or
#endif
"SPEECH%d.CLU"
};
int numFiles = 0;
bool fileFound[2] = { false, false };
File test;
_systemVars.playSpeech = true;
@@ -1090,13 +1101,13 @@ void SwordEngine::checkCdFiles(void) { // check if we're running from cd, hdd or
sprintf(fileName, speechFiles[j], i);
if (test.open(fileName)) {
test.close();
numFiles++;
fileFound[i - 1] = true;
break;
}
}
}
if (numFiles == 2) {
if (fileFound[0] && fileFound[1]) {
// both files exist, assume running from HDD and everything's fine.
_systemVars.runningFromCd = false;
_systemVars.playSpeech = true;
@@ -1128,28 +1139,30 @@ void SwordEngine::go(void) {
startPositions(startPos);
else {
if (_control->savegamesExist()) {
_systemVars.deathScreenFlag = 3;
_systemVars.controlPanelMode = CP_NEWGAME;
if (_control->runPanel() == CONTROL_GAME_RESTORED)
_control->doRestore();
else
else if (!_systemVars.engineQuit)
startPositions(0);
} else // no savegames, start new game.
startPositions(0);
}
_systemVars.deathScreenFlag = 0;
_systemVars.controlPanelMode = CP_NORMAL;
do {
while (!_systemVars.engineQuit) {
uint8 action = mainLoop();
// the mainloop was left, we have to reinitialize.
reinitialize();
if (action == CONTROL_GAME_RESTORED)
_control->doRestore();
else if (action == CONTROL_RESTART_GAME)
startPositions(1);
_systemVars.forceRestart = false;
_systemVars.deathScreenFlag = 0;
} while (true);
if (!_systemVars.engineQuit) {
// the mainloop was left, we have to reinitialize.
reinitialize();
if (action == CONTROL_GAME_RESTORED)
_control->doRestore();
else if (action == CONTROL_RESTART_GAME)
startPositions(1);
_systemVars.forceRestart = false;
_systemVars.controlPanelMode = CP_NORMAL;
}
}
}
void SwordEngine::checkCd(void) {
@@ -1178,7 +1191,7 @@ uint8 SwordEngine::mainLoop(void) {
uint8 retCode = 0;
_keyPressed = 0;
while (retCode == 0) {
while ((retCode == 0) && (!_systemVars.engineQuit)) {
// do we need the section45-hack from sword.c here?
checkCd();
@@ -1221,28 +1234,29 @@ uint8 SwordEngine::mainLoop(void) {
delay(0);
_mouse->engine( _mouseX, _mouseY, _mouseState);
_mouseState = 0;
if (_systemVars.forceRestart)
retCode = CONTROL_RESTART_GAME;
// The control panel is triggered by F5 or ESC.
// FIXME: This is a very strange way of detecting F5...
else if (((_keyPressed == 63 || _keyPressed == 27) && (Logic::_scriptVars[MOUSE_STATUS] & 1)) || (_systemVars.deathScreenFlag)) {
else if (((_keyPressed == 63 || _keyPressed == 27) && (Logic::_scriptVars[MOUSE_STATUS] & 1)) || (_systemVars.controlPanelMode)) {
retCode = _control->runPanel();
if (!retCode)
_screen->fullRefresh();
}
_keyPressed = 0;
_mouseState = _keyPressed = 0;
} while ((Logic::_scriptVars[SCREEN] == Logic::_scriptVars[NEW_SCREEN]) && (retCode == 0) && (!_systemVars.engineQuit));
// do something smart here to implement pausing the game. If we even want that, that is.
} while ((Logic::_scriptVars[SCREEN] == Logic::_scriptVars[NEW_SCREEN]) && (retCode == 0));
if ((retCode == 0) && (Logic::_scriptVars[SCREEN] != 53) && _systemVars.wantFade) {
if ((retCode == 0) && (Logic::_scriptVars[SCREEN] != 53) && _systemVars.wantFade && (!_systemVars.engineQuit)) {
_screen->fadeDownPalette();
while (_screen->stillFading()) {
int32 relDelay = (int32)_system->getMillis() + (1000 / FRAME_RATE);
_screen->updateScreen();
delay(1000/12);
relDelay -= (int32)_system->getMillis();
relDelay = (relDelay > 0) ? relDelay : 0;
delay(relDelay);
}
}
@@ -1258,7 +1272,6 @@ void SwordEngine::delay(uint amount) { //copied and mutilated from sky.cpp
OSystem::Event event;
uint32 start = _system->getMillis();
uint32 cur = start;
do {
while (_system->pollEvent(event)) {
@@ -1296,27 +1309,18 @@ void SwordEngine::delay(uint amount) { //copied and mutilated from sky.cpp
_mouseState |= BS1R_BUTTON_UP;
break;
case OSystem::EVENT_QUIT:
_system->quit();
//_system->quit();
_systemVars.engineQuit = true;
break;
default:
break;
}
}
if (amount == 0)
break;
if (amount > 0)
_system->delayMillis(10);
{
uint this_delay = 20; // 1?
#ifdef _WIN32_WCE
this_delay = 10;
#endif
if (this_delay > amount)
this_delay = amount;
_system->delayMillis(this_delay);
}
cur = _system->getMillis();
} while (cur < start + amount);
} while (_system->getMillis() < start + amount);
}
} // End of namespace Sword1
+9 -2
View File
@@ -33,6 +33,13 @@ enum {
GF_DEMO = 1 << 0
};
enum ControlPanelMode {
CP_NORMAL = 0,
CP_DEATHSCREEN,
CP_THEEND,
CP_NEWGAME
};
class Screen;
class Sound;
class Logic;
@@ -48,9 +55,9 @@ struct SystemVars {
bool runningFromCd;
uint32 currentCD; // starts at zero, then either 1 or 2 depending on section being played
uint32 justRestoredGame; // see main() in sword.c & New_screen() in gtm_core.c
uint32 gamePaused; // 1 when paused
bool engineQuit;
uint8 deathScreenFlag; // 1 death screen version of the control panel, 2 = successful end of game, 3 = force restart
uint8 controlPanelMode; // 1 death screen version of the control panel, 2 = successful end of game, 3 = force restart
bool forceRestart;
bool wantFade; // when true => fade during scene change, else cut.
uint8 playSpeech;
+4 -4
View File
@@ -41,10 +41,9 @@ Text::Text(ObjectMan *pObjMan, ResMan *pResMan, bool czechVersion) {
_objMan = pObjMan;
_resMan = pResMan;
_textCount = 0;
if (czechVersion)
_font = (uint8*)_resMan->openFetchRes(CZECH_GAME_FONT);
else
_font = (uint8*)_resMan->openFetchRes(GAME_FONT);
_fontId = (czechVersion) ? CZECH_GAME_FONT : GAME_FONT;
_font = (uint8*)_resMan->openFetchRes(_fontId);
_joinWidth = charWidth( SPACE ) - 2 * OVERLAP;
_charHeight = FROM_LE_16(_resMan->fetchFrame(_font, 0)->height); // all chars have the same height
_textBlocks[0] = _textBlocks[1] = NULL;
@@ -55,6 +54,7 @@ Text::~Text(void) {
free(_textBlocks[0]);
if (_textBlocks[1])
free(_textBlocks[1]);
//_resMan->resClose(_fontId); => wiped automatically by _resMan->flush();
}
uint32 Text::lowTextManager(uint8 *ascii, int32 width, uint8 pen) {
+1
View File
@@ -56,6 +56,7 @@ private:
ObjectMan *_objMan;
ResMan *_resMan;
FrameHeader *_textBlocks[MAX_TEXT_OBS];
uint32 _fontId;
};
} // End of namespace Sword1