aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Mettifogo2008-12-21 15:42:47 +0000
committerNicola Mettifogo2008-12-21 15:42:47 +0000
commite11c17a005a1efb1be077ceb856c48446e11d95c (patch)
tree2272e2286e382d24640577eebf88a40cc9a06d44
parent74b251d45d0ae9bafaa96f36e4e3dc2aebefa225 (diff)
downloadscummvm-rg350-e11c17a005a1efb1be077ceb856c48446e11d95c.tar.gz
scummvm-rg350-e11c17a005a1efb1be077ceb856c48446e11d95c.tar.bz2
scummvm-rg350-e11c17a005a1efb1be077ceb856c48446e11d95c.zip
Moved more GfxObj management to Gfx object.
svn-id: r35466
-rw-r--r--engines/parallaction/dialogue.cpp4
-rw-r--r--engines/parallaction/gfxbase.cpp18
-rw-r--r--engines/parallaction/graphics.cpp5
-rw-r--r--engines/parallaction/graphics.h5
-rw-r--r--engines/parallaction/gui_br.cpp2
-rw-r--r--engines/parallaction/inventory.cpp2
-rw-r--r--engines/parallaction/parallaction.cpp45
-rw-r--r--engines/parallaction/parallaction.h10
-rw-r--r--engines/parallaction/parallaction_br.cpp28
-rw-r--r--engines/parallaction/parallaction_ns.cpp29
-rw-r--r--engines/parallaction/parser.h1
11 files changed, 81 insertions, 68 deletions
diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp
index d8564459a8..217af71eff 100644
--- a/engines/parallaction/dialogue.cpp
+++ b/engines/parallaction/dialogue.cpp
@@ -309,7 +309,7 @@ void DialogueManager::runQuestion() {
debugC(9, kDebugDialogue, "runQuestion\n");
if (_mouseButtons == kMouseLeftUp) {
- _vm->hideDialogueStuff();
+ _vm->_gfx->freeDialogueObjects();
_state = NEXT_ANSWER;
}
@@ -347,7 +347,7 @@ void DialogueManager::runAnswer() {
if (_answerId != -1) {
_cmdList = &_q->_answers[_answerId]->_commands;
- _vm->hideDialogueStuff();
+ _vm->_gfx->freeDialogueObjects();
_state = NEXT_QUESTION;
}
}
diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp
index 9d4389855e..58cc1e2728 100644
--- a/engines/parallaction/gfxbase.cpp
+++ b/engines/parallaction/gfxbase.cpp
@@ -103,6 +103,12 @@ GfxObj* Gfx::loadAnim(const char *name) {
return obj;
}
+GfxObj* Gfx::loadCharacterAnim(const char *name) {
+ GfxObj *obj = loadAnim(name);
+ obj->setFlags(kGfxObjCharacter);
+ obj->clearFlags(kGfxObjNormal);
+ return obj;
+}
GfxObj* Gfx::loadGet(const char *name) {
GfxObj *obj = _disk->loadStatic(name);
@@ -140,6 +146,18 @@ void Gfx::clearGfxObjects(uint filter) {
}
+void Gfx::freeLocationObjects() {
+ freeDialogueObjects();
+ clearGfxObjects(kGfxObjNormal);
+ freeLabels();
+}
+
+void Gfx::freeCharacterObjects() {
+ freeDialogueObjects();
+ clearGfxObjects(kGfxObjCharacter);
+}
+
+
void Gfx::loadGfxObjMask(const char *name, GfxObj *obj) {
Common::Rect rect;
obj->getRect(0, rect);
diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp
index c675b2c510..26360e3a64 100644
--- a/engines/parallaction/graphics.cpp
+++ b/engines/parallaction/graphics.cpp
@@ -775,6 +775,11 @@ void Gfx::destroyBalloons() {
_balloons.clear();
}
+void Gfx::freeDialogueObjects() {
+ freeItems();
+ _vm->_balloonMan->freeBalloons();
+}
+
void Gfx::freeItems() {
_items.clear();
}
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index 4e6ab7b037..856c43c360 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -507,6 +507,9 @@ public:
GfxObj* loadAnim(const char *name);
GfxObj* loadGet(const char *name);
GfxObj* loadDoor(const char *name);
+ GfxObj* loadCharacterAnim(const char *name);
+ void freeCharacterObjects();
+ void freeLocationObjects();
void showGfxObj(GfxObj* obj, bool visible);
void clearGfxObjects(uint filter);
void sortScene();
@@ -526,6 +529,8 @@ public:
GfxObj* registerBalloon(Frames *frames, const char *text);
void destroyBalloons();
+ void freeDialogueObjects();
+
// other items
int setItem(GfxObj* obj, uint16 x, uint16 y, byte transparentColor = 0);
void setItemFrame(uint item, uint16 f);
diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp
index d0be95574d..9422bdc5d6 100644
--- a/engines/parallaction/gui_br.cpp
+++ b/engines/parallaction/gui_br.cpp
@@ -160,7 +160,7 @@ class MainMenuInputState_BR : public MenuInputState {
void cleanup() {
_vm->_system->showMouse(false);
- _vm->hideDialogueStuff();
+ _vm->_gfx->freeDialogueObjects();
for (int i = 0; i < _availItems; i++) {
delete _lines[i];
diff --git a/engines/parallaction/inventory.cpp b/engines/parallaction/inventory.cpp
index 7b92974205..8d9daec0af 100644
--- a/engines/parallaction/inventory.cpp
+++ b/engines/parallaction/inventory.cpp
@@ -216,7 +216,7 @@ void InventoryRenderer::drawItem(ItemPosition pos, ItemName name) {
}
void InventoryRenderer::drawItem(ItemName name, byte *buffer, uint pitch) {
- byte* s = _vm->_char._objs->getData(name);
+ byte* s = _vm->_objects->getData(name);
byte* d = buffer;
for (uint i = 0; i < _props->_itemHeight; i++) {
memcpy(d, s, _props->_itemWidth);
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index b76c2ae034..6d583cf966 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -83,11 +83,10 @@ Parallaction::~Parallaction() {
delete _programExec;
delete _saveLoad;
- _gfx->clearGfxObjects(kGfxObjCharacter | kGfxObjNormal);
- hideDialogueStuff();
+ _gfx->freeCharacterObjects();
+ _gfx->freeLocationObjects();
delete _balloonMan;
- freeCharacter();
destroyInventory();
cleanupGui();
@@ -110,6 +109,7 @@ Common::Error Parallaction::init() {
_location._startPosition.x = -1000;
_location._startPosition.y = -1000;
_location._startFrame = 0;
+ _objects = 0;
_screenSize = _screenWidth * _screenHeight;
@@ -173,25 +173,6 @@ void Parallaction::updateView() {
}
-void Parallaction::hideDialogueStuff() {
- _gfx->freeItems();
- _balloonMan->freeBalloons();
-}
-
-
-void Parallaction::freeCharacter() {
- debugC(1, kDebugExec, "freeCharacter()");
-
- delete _objectsNames;
- _objectsNames = 0;
-
- _gfx->clearGfxObjects(kGfxObjCharacter);
-
- _char.free();
-
- return;
-}
-
void Parallaction::pauseJobs() {
debugC(9, kDebugExec, "pausing jobs execution");
@@ -571,7 +552,7 @@ void Parallaction::enterCommentMode(ZonePtr z) {
void Parallaction::exitCommentMode() {
_input->_inputMode = Input::kInputModeGame;
- hideDialogueStuff();
+ _gfx->freeDialogueObjects();
_gfx->setHalfbriteMode(false);
_cmdExec->run(_commentZone->_commands, _commentZone);
@@ -848,7 +829,6 @@ WalkFrames _char24WalkFrames = {
Character::Character(Parallaction *vm) : _vm(vm), _ani(new Animation) {
_talk = NULL;
_head = NULL;
- _objs = NULL;
_direction = WALK_DOWN;
_step = 0;
@@ -877,8 +857,6 @@ Character::~Character() {
delete _walker;
_walker = 0;
-
- free();
}
void Character::getFoot(Common::Point &foot) {
@@ -918,21 +896,6 @@ void Character::scheduleWalk(int16 x, int16 y) {
_engineFlags |= kEngineWalking;
}
-void Character::free() {
-
- delete _talk;
- delete _head;
- delete _objs;
- delete _ani->gfxobj;
-
- _talk = NULL;
- _head = NULL;
- _objs = NULL;
- _ani->gfxobj = NULL;
-
- return;
-}
-
void Character::setName(const char *name) {
_name.bind(name);
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index bffd8b2940..291ab56eb2 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -198,7 +198,6 @@ struct Character {
AnimationPtr _ani;
GfxObj *_head;
GfxObj *_talk;
- GfxObj *_objs;
PathBuilder *_builder;
PathWalker *_walker;
PointList _walkPath;
@@ -210,8 +209,6 @@ struct Character {
void setFoot(const Common::Point &foot);
void scheduleWalk(int16 x, int16 y);
- void free();
-
protected:
CharacterName _name;
@@ -281,6 +278,7 @@ public:
// game utilities
Table *_globalFlagsNames;
Table *_objectsNames;
+ GfxObj *_objects;
Table *_callableNames;
Table *_localFlagNames;
CommandExec *_cmdExec;
@@ -314,7 +312,6 @@ protected:
void exitCommentMode();
void updateView();
void drawAnimations();
- void freeCharacter();
void doLocationEnterTransition();
void allocateLocationSlot(const char *name);
void finalizeLocationParsing();
@@ -325,7 +322,6 @@ public:
void beep();
void pauseJobs();
void resumeJobs();
- void hideDialogueStuff();
uint getInternLanguage();
void setInternLanguage(uint id);
void enterDialogueMode(ZonePtr z);
@@ -388,7 +384,6 @@ public:
virtual void runPendingZones();
virtual void cleanupGame();
-
void switchBackground(const char* background, const char* mask);
private:
@@ -405,6 +400,7 @@ private:
void startEndPartSequence();
void loadProgram(AnimationPtr a, const char *filename);
void freeLocation(bool removeAll);
+ void freeCharacter();
// callables data
@@ -478,7 +474,6 @@ public:
virtual void runPendingZones();
virtual void cleanupGame();
-
void setupSubtitles(char *s, char *s2, int y);
void clearSubtitles();
@@ -509,6 +504,7 @@ private:
void freeLocation(bool removeAll);
void loadProgram(AnimationPtr a, const char *filename);
void startGui(bool showSplash);
+ void freeCharacter();
typedef void (Parallaction_br::*Callable)(void*);
const Callable *_callables;
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 59b5c247ab..7d7fe660bc 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -100,6 +100,7 @@ Common::Error Parallaction_br::init() {
Parallaction_br::~Parallaction_br() {
freeFonts();
+ freeCharacter();
delete _locationParser;
delete _programParser;
@@ -178,14 +179,24 @@ void Parallaction_br::runPendingZones() {
}
}
+void Parallaction_br::freeCharacter() {
+ _gfx->freeCharacterObjects();
+
+ delete _char._talk;
+ delete _char._ani->gfxobj;
+
+ _char._talk = 0;
+ _char._ani->gfxobj = 0;
+}
+
void Parallaction_br::freeLocation(bool removeAll) {
// free open location stuff
clearSubtitles();
- _gfx->clearGfxObjects(kGfxObjNormal);
- _gfx->freeLabels();
_subtitle[0] = _subtitle[1] = -1;
+ _gfx->freeLocationObjects();
+
_location._animations.remove(_char._ani);
_location.cleanup(removeAll);
_location._animations.push_front(_char._ani);
@@ -195,7 +206,7 @@ void Parallaction_br::freeLocation(bool removeAll) {
void Parallaction_br::cleanupGame() {
freeLocation(true);
-// freeCharacter();
+ freeCharacter();
delete _globalFlagsNames;
delete _objectsNames;
@@ -233,9 +244,9 @@ void Parallaction_br::changeLocation(char *location) {
// TODO: maybe handle this into Disk
if (getPlatform() == Common::kPlatformPC) {
- _char._objs = _disk->loadObjects("icone.ico");
+ _objects = _disk->loadObjects("icone.ico");
} else {
- _char._objs = _disk->loadObjects("icons.ico");
+ _objects = _disk->loadObjects("icons.ico");
}
parseLocation("common.slf");
@@ -299,15 +310,16 @@ void Parallaction_br::loadProgram(AnimationPtr a, const char *filename) {
void Parallaction_br::changeCharacter(const char *name) {
+
const char *charName = _char.getName();
if (scumm_stricmp(charName, name)) {
+ freeCharacter();
+
debugC(1, kDebugExec, "changeCharacter(%s)", name);
_char.setName(name);
- _char._ani->gfxobj = _gfx->loadAnim(name);
- _char._ani->gfxobj->setFlags(kGfxObjCharacter);
- _char._ani->gfxobj->clearFlags(kGfxObjNormal);
+ _char._ani->gfxobj = _gfx->loadCharacterAnim(name);
_char._talk = _disk->loadTalk(name);
}
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index 594fcb61c0..cf875d00a1 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -202,13 +202,13 @@ Common::Error Parallaction_ns::init() {
Parallaction_ns::~Parallaction_ns() {
freeFonts();
+ freeCharacter();
delete _locationParser;
delete _programParser;
freeLocation(true);
_location._animations.remove(_char._ani);
-
}
@@ -405,18 +405,14 @@ void Parallaction_ns::changeCharacter(const char *name) {
return;
}
- // freeCharacter takes responsibility for checking
- // character for sanity before memory is freed
freeCharacter();
- _char._ani->gfxobj = _gfx->loadAnim(_char.getFullName());
- _char._ani->gfxobj->setFlags(kGfxObjCharacter);
- _char._ani->gfxobj->clearFlags(kGfxObjNormal);
+ _char._ani->gfxobj = _gfx->loadCharacterAnim(_char.getFullName());
if (!_char.dummy()) {
_char._head = _disk->loadHead(_char.getBaseName());
_char._talk = _disk->loadTalk(_char.getBaseName());
- _char._objs = _disk->loadObjects(_char.getBaseName());
+ _objects = _disk->loadObjects(_char.getBaseName());
_objectsNames = _disk->loadTable(_char.getBaseName());
_soundMan->playCharacterMusic(_char.getBaseName());
@@ -437,6 +433,23 @@ void Parallaction_ns::changeCharacter(const char *name) {
return;
}
+void Parallaction_ns::freeCharacter() {
+ _gfx->freeCharacterObjects();
+
+ delete _char._talk;
+ delete _char._head;
+ delete _char._ani->gfxobj;
+ delete _objects;
+ delete _objectsNames;
+
+ _char._talk = 0;
+ _char._head = 0;
+ _char._ani->gfxobj = 0;
+
+ _objects = 0;
+ _objectsNames = 0;
+}
+
void Parallaction_ns::freeLocation(bool removeAll) {
debugC(2, kDebugExec, "freeLocation");
@@ -447,7 +460,7 @@ void Parallaction_ns::freeLocation(bool removeAll) {
_localFlagNames->clear();
- _gfx->clearGfxObjects(kGfxObjNormal);
+ _gfx->freeLocationObjects();
_location._animations.remove(_char._ani);
_location.cleanup(removeAll);
diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h
index bcef8660f1..48facb620e 100644
--- a/engines/parallaction/parser.h
+++ b/engines/parallaction/parser.h
@@ -190,6 +190,7 @@ protected:
Dialogue *parseDialogue();
void resolveDialogueForwards(Dialogue *dialogue, uint numQuestions, Table &forwards);
Answer *parseAnswer();
+ void parseAnswerVariants(Answer *answer);
Question *parseQuestion();
void parseZone(ZoneList &list, char *name);