aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/dialogue.cpp14
-rw-r--r--engines/parallaction/exec_ns.cpp2
-rw-r--r--engines/parallaction/graphics.h1
-rw-r--r--engines/parallaction/input.cpp5
-rw-r--r--engines/parallaction/parallaction.cpp29
-rw-r--r--engines/parallaction/parallaction.h4
-rw-r--r--engines/parallaction/parallaction_br.cpp3
-rw-r--r--engines/parallaction/parallaction_ns.cpp12
-rw-r--r--engines/parallaction/parser.cpp3
-rw-r--r--engines/parallaction/parser.h7
-rw-r--r--engines/parallaction/parser_ns.cpp2
11 files changed, 59 insertions, 23 deletions
diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp
index 70db637699..b9dea60dc0 100644
--- a/engines/parallaction/dialogue.cpp
+++ b/engines/parallaction/dialogue.cpp
@@ -105,10 +105,8 @@ uint16 DialogueManager::askPassword() {
if (g_system->getEventManager()->pollEvent(e)) {
if (e.type == Common::EVENT_QUIT) {
- // TODO: don't quit() here, just have caller routines to check
- // on kEngineQuit and exit gracefully to allow the engine to shut down
_engineFlags |= kEngineQuit;
- g_system->quit();
+ break;
}
if ((e.type == Common::EVENT_KEYDOWN) && isdigit(e.kbd.ascii)) {
@@ -231,11 +229,19 @@ void DialogueManager::run() {
answer = 0;
displayQuestion();
+
+ if (_engineFlags & kEngineQuit)
+ return;
+
if (_q->_answers[0] == NULL) break;
if (scumm_stricmp(_q->_answers[0]->_text, "NULL")) {
if (!displayAnswers()) break;
answer = getAnswer();
+
+ if (_engineFlags & kEngineQuit)
+ return;
+
cmdlist = &_q->_answers[answer]->_commands;
}
@@ -266,7 +272,7 @@ int16 DialogueManager::selectAnswer() {
uint32 event;
Common::Point p;
- while (true) {
+ while (_engineFlags & kEngineQuit == 0) {
_vm->_input->readInput();
_vm->_input->getCursorPos(p);
diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp
index a4b372f42a..bd2d54c0a0 100644
--- a/engines/parallaction/exec_ns.cpp
+++ b/engines/parallaction/exec_ns.cpp
@@ -519,6 +519,8 @@ uint16 Parallaction::runZone(ZonePtr z) {
case kZoneSpeak:
runDialogue(z->u.speak);
+ if (_engineFlags & kEngineQuit)
+ return 0;
break;
}
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index 894e0fd678..f03b8538b8 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -95,6 +95,7 @@ public:
}
~SurfaceToFrames() {
+ _surf->free();
delete _surf;
}
diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp
index 28d0ad888d..e758bbd41c 100644
--- a/engines/parallaction/input.cpp
+++ b/engines/parallaction/input.cpp
@@ -80,11 +80,8 @@ uint16 Input::readInput() {
break;
case Common::EVENT_QUIT:
- // TODO: don't quit() here, just have caller routines to check
- // on kEngineQuit and exit gracefully to allow the engine to shut down
_engineFlags |= kEngineQuit;
- _vm->_system->quit();
- break;
+ return KeyDown;
default:
break;
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index d66b1af1f1..25ebe4263d 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -84,21 +84,23 @@ Parallaction::Parallaction(OSystem *syst, const PARALLACTIONGameDescription *gam
Parallaction::~Parallaction() {
+ clearSet(_commandOpcodes);
+ clearSet(_instructionOpcodes);
+
delete _debugger;
-
delete _globalTable;
-
delete _callableNames;
- delete _localFlagNames;
freeLocation();
freeCharacter();
destroyInventory();
-
+
+ delete _localFlagNames;
delete _gfx;
delete _soundMan;
delete _disk;
+ delete _input;
}
@@ -136,9 +138,11 @@ int Parallaction::init() {
}
-
-
-
+void Parallaction::clearSet(OpcodeSet &opcodes) {
+ for (Common::Array<const Opcode*>::iterator i = opcodes.begin(); i != opcodes.end(); ++i)
+ delete *i;
+ opcodes.clear();
+}
void Parallaction::updateView() {
@@ -354,12 +358,20 @@ void Parallaction::runGame() {
processInput(data);
}
+ if (_engineFlags & kEngineQuit)
+ return;
+
runPendingZones();
+ if (_engineFlags & kEngineQuit)
+ return;
+
if (_engineFlags & kEngineChangeLocation) {
changeLocation(_location._name);
}
+ if (_engineFlags & kEngineQuit)
+ return;
_gfx->beginFrame();
@@ -522,11 +534,12 @@ void Character::free() {
delete _talk;
delete _head;
delete _objs;
+ delete _ani->gfxobj;
- _ani->gfxobj = NULL;
_talk = NULL;
_head = NULL;
_objs = NULL;
+ _ani->gfxobj = NULL;
return;
}
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 6e5957d3cd..5ae1386378 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -385,6 +385,9 @@ protected: // members
int16 pickupItem(ZonePtr z);
+ void clearSet(OpcodeSet &opcodes);
+
+
public:
virtual void callFunction(uint index, void* parm) { }
@@ -401,6 +404,7 @@ public:
void beep();
+
public:
// const char **_zoneFlagNamesRes;
// const char **_zoneTypeNamesRes;
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 0f5cc2a0c4..b22e1b0f2d 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -109,6 +109,9 @@ int Parallaction_br::go() {
guiStart();
+ if (_engineFlags & kEngineQuit)
+ return 0;
+
// initCharacter();
_input->_inputMode = Input::kInputModeGame;
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index 2cca3a6a4a..f346a278f7 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -156,7 +156,9 @@ int Parallaction_ns::init() {
Parallaction_ns::~Parallaction_ns() {
freeFonts();
-
+
+ delete _locationParser;
+ delete _programParser;
delete _mouseComposedArrow;
_location._animations.remove(_char._ani);
@@ -233,9 +235,15 @@ int Parallaction_ns::go() {
_globalTable = _disk->loadTable("global");
guiStart();
-
+
+ if (_engineFlags & kEngineQuit)
+ return 0;
+
changeLocation(_location._name);
+ if (_engineFlags & kEngineQuit)
+ return 0;
+
_input->_inputMode = Input::kInputModeGame;
while ((_engineFlags & kEngineQuit) == 0) {
runGame();
diff --git a/engines/parallaction/parser.cpp b/engines/parallaction/parser.cpp
index f9de6eb4af..6de0a7d7f5 100644
--- a/engines/parallaction/parser.cpp
+++ b/engines/parallaction/parser.cpp
@@ -30,8 +30,7 @@ namespace Parallaction {
char _tokens[20][MAX_TOKEN_LEN];
-Script::Script(Common::ReadStream *input, bool disposeSource) : _input(input), _disposeSource(disposeSource), _line(0) {
-}
+Script::Script(Common::ReadStream *input, bool disposeSource) : _input(input), _disposeSource(disposeSource), _line(0) {}
Script::~Script() {
if (_disposeSource)
diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h
index d488cf9b58..1541fb89b2 100644
--- a/engines/parallaction/parser.h
+++ b/engines/parallaction/parser.h
@@ -221,13 +221,14 @@ public:
virtual void init();
virtual ~LocationParser_ns() {
+ delete _parser;
delete _commandsNames;
delete _locationStmt;
+ delete _locationZoneStmt;
+ delete _locationAnimStmt;
delete _zoneTypeNames;
delete _zoneFlagNames;
- delete _parser;
-
clearSet(_commandParsers);
clearSet(_locationAnimParsers);
clearSet(_locationZoneParsers);
@@ -356,7 +357,9 @@ public:
virtual void init();
virtual ~ProgramParser_ns() {
+ delete _parser;
delete _instructionNames;
+
clearSet(_instructionParsers);
}
diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp
index 2c4601c938..c654e3008e 100644
--- a/engines/parallaction/parser_ns.cpp
+++ b/engines/parallaction/parser_ns.cpp
@@ -1397,7 +1397,7 @@ void LocationParser_ns::parseZone(ZoneList &list, char *name) {
list.push_front(z);
_parser->pushTables(&_locationZoneParsers, _locationZoneStmt);
-
+
return;
}