Moved more GfxObj management to Gfx object.

svn-id: r35466
This commit is contained in:
Nicola Mettifogo 2008-12-21 15:42:47 +00:00
parent 74b251d45d
commit e11c17a005
11 changed files with 81 additions and 68 deletions

View file

@ -309,7 +309,7 @@ void DialogueManager::runQuestion() {
debugC(9, kDebugDialogue, "runQuestion\n"); debugC(9, kDebugDialogue, "runQuestion\n");
if (_mouseButtons == kMouseLeftUp) { if (_mouseButtons == kMouseLeftUp) {
_vm->hideDialogueStuff(); _vm->_gfx->freeDialogueObjects();
_state = NEXT_ANSWER; _state = NEXT_ANSWER;
} }
@ -347,7 +347,7 @@ void DialogueManager::runAnswer() {
if (_answerId != -1) { if (_answerId != -1) {
_cmdList = &_q->_answers[_answerId]->_commands; _cmdList = &_q->_answers[_answerId]->_commands;
_vm->hideDialogueStuff(); _vm->_gfx->freeDialogueObjects();
_state = NEXT_QUESTION; _state = NEXT_QUESTION;
} }
} }

View file

@ -103,6 +103,12 @@ GfxObj* Gfx::loadAnim(const char *name) {
return obj; 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* Gfx::loadGet(const char *name) {
GfxObj *obj = _disk->loadStatic(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) { void Gfx::loadGfxObjMask(const char *name, GfxObj *obj) {
Common::Rect rect; Common::Rect rect;
obj->getRect(0, rect); obj->getRect(0, rect);

View file

@ -775,6 +775,11 @@ void Gfx::destroyBalloons() {
_balloons.clear(); _balloons.clear();
} }
void Gfx::freeDialogueObjects() {
freeItems();
_vm->_balloonMan->freeBalloons();
}
void Gfx::freeItems() { void Gfx::freeItems() {
_items.clear(); _items.clear();
} }

View file

@ -507,6 +507,9 @@ public:
GfxObj* loadAnim(const char *name); GfxObj* loadAnim(const char *name);
GfxObj* loadGet(const char *name); GfxObj* loadGet(const char *name);
GfxObj* loadDoor(const char *name); GfxObj* loadDoor(const char *name);
GfxObj* loadCharacterAnim(const char *name);
void freeCharacterObjects();
void freeLocationObjects();
void showGfxObj(GfxObj* obj, bool visible); void showGfxObj(GfxObj* obj, bool visible);
void clearGfxObjects(uint filter); void clearGfxObjects(uint filter);
void sortScene(); void sortScene();
@ -526,6 +529,8 @@ public:
GfxObj* registerBalloon(Frames *frames, const char *text); GfxObj* registerBalloon(Frames *frames, const char *text);
void destroyBalloons(); void destroyBalloons();
void freeDialogueObjects();
// other items // other items
int setItem(GfxObj* obj, uint16 x, uint16 y, byte transparentColor = 0); int setItem(GfxObj* obj, uint16 x, uint16 y, byte transparentColor = 0);
void setItemFrame(uint item, uint16 f); void setItemFrame(uint item, uint16 f);

View file

@ -160,7 +160,7 @@ class MainMenuInputState_BR : public MenuInputState {
void cleanup() { void cleanup() {
_vm->_system->showMouse(false); _vm->_system->showMouse(false);
_vm->hideDialogueStuff(); _vm->_gfx->freeDialogueObjects();
for (int i = 0; i < _availItems; i++) { for (int i = 0; i < _availItems; i++) {
delete _lines[i]; delete _lines[i];

View file

@ -216,7 +216,7 @@ void InventoryRenderer::drawItem(ItemPosition pos, ItemName name) {
} }
void InventoryRenderer::drawItem(ItemName name, byte *buffer, uint pitch) { 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; byte* d = buffer;
for (uint i = 0; i < _props->_itemHeight; i++) { for (uint i = 0; i < _props->_itemHeight; i++) {
memcpy(d, s, _props->_itemWidth); memcpy(d, s, _props->_itemWidth);

View file

@ -83,11 +83,10 @@ Parallaction::~Parallaction() {
delete _programExec; delete _programExec;
delete _saveLoad; delete _saveLoad;
_gfx->clearGfxObjects(kGfxObjCharacter | kGfxObjNormal); _gfx->freeCharacterObjects();
hideDialogueStuff(); _gfx->freeLocationObjects();
delete _balloonMan; delete _balloonMan;
freeCharacter();
destroyInventory(); destroyInventory();
cleanupGui(); cleanupGui();
@ -110,6 +109,7 @@ Common::Error Parallaction::init() {
_location._startPosition.x = -1000; _location._startPosition.x = -1000;
_location._startPosition.y = -1000; _location._startPosition.y = -1000;
_location._startFrame = 0; _location._startFrame = 0;
_objects = 0;
_screenSize = _screenWidth * _screenHeight; _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() { void Parallaction::pauseJobs() {
debugC(9, kDebugExec, "pausing jobs execution"); debugC(9, kDebugExec, "pausing jobs execution");
@ -571,7 +552,7 @@ void Parallaction::enterCommentMode(ZonePtr z) {
void Parallaction::exitCommentMode() { void Parallaction::exitCommentMode() {
_input->_inputMode = Input::kInputModeGame; _input->_inputMode = Input::kInputModeGame;
hideDialogueStuff(); _gfx->freeDialogueObjects();
_gfx->setHalfbriteMode(false); _gfx->setHalfbriteMode(false);
_cmdExec->run(_commentZone->_commands, _commentZone); _cmdExec->run(_commentZone->_commands, _commentZone);
@ -848,7 +829,6 @@ WalkFrames _char24WalkFrames = {
Character::Character(Parallaction *vm) : _vm(vm), _ani(new Animation) { Character::Character(Parallaction *vm) : _vm(vm), _ani(new Animation) {
_talk = NULL; _talk = NULL;
_head = NULL; _head = NULL;
_objs = NULL;
_direction = WALK_DOWN; _direction = WALK_DOWN;
_step = 0; _step = 0;
@ -877,8 +857,6 @@ Character::~Character() {
delete _walker; delete _walker;
_walker = 0; _walker = 0;
free();
} }
void Character::getFoot(Common::Point &foot) { void Character::getFoot(Common::Point &foot) {
@ -918,21 +896,6 @@ void Character::scheduleWalk(int16 x, int16 y) {
_engineFlags |= kEngineWalking; _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) { void Character::setName(const char *name) {
_name.bind(name); _name.bind(name);

View file

@ -198,7 +198,6 @@ struct Character {
AnimationPtr _ani; AnimationPtr _ani;
GfxObj *_head; GfxObj *_head;
GfxObj *_talk; GfxObj *_talk;
GfxObj *_objs;
PathBuilder *_builder; PathBuilder *_builder;
PathWalker *_walker; PathWalker *_walker;
PointList _walkPath; PointList _walkPath;
@ -210,8 +209,6 @@ struct Character {
void setFoot(const Common::Point &foot); void setFoot(const Common::Point &foot);
void scheduleWalk(int16 x, int16 y); void scheduleWalk(int16 x, int16 y);
void free();
protected: protected:
CharacterName _name; CharacterName _name;
@ -281,6 +278,7 @@ public:
// game utilities // game utilities
Table *_globalFlagsNames; Table *_globalFlagsNames;
Table *_objectsNames; Table *_objectsNames;
GfxObj *_objects;
Table *_callableNames; Table *_callableNames;
Table *_localFlagNames; Table *_localFlagNames;
CommandExec *_cmdExec; CommandExec *_cmdExec;
@ -314,7 +312,6 @@ protected:
void exitCommentMode(); void exitCommentMode();
void updateView(); void updateView();
void drawAnimations(); void drawAnimations();
void freeCharacter();
void doLocationEnterTransition(); void doLocationEnterTransition();
void allocateLocationSlot(const char *name); void allocateLocationSlot(const char *name);
void finalizeLocationParsing(); void finalizeLocationParsing();
@ -325,7 +322,6 @@ public:
void beep(); void beep();
void pauseJobs(); void pauseJobs();
void resumeJobs(); void resumeJobs();
void hideDialogueStuff();
uint getInternLanguage(); uint getInternLanguage();
void setInternLanguage(uint id); void setInternLanguage(uint id);
void enterDialogueMode(ZonePtr z); void enterDialogueMode(ZonePtr z);
@ -388,7 +384,6 @@ public:
virtual void runPendingZones(); virtual void runPendingZones();
virtual void cleanupGame(); virtual void cleanupGame();
void switchBackground(const char* background, const char* mask); void switchBackground(const char* background, const char* mask);
private: private:
@ -405,6 +400,7 @@ private:
void startEndPartSequence(); void startEndPartSequence();
void loadProgram(AnimationPtr a, const char *filename); void loadProgram(AnimationPtr a, const char *filename);
void freeLocation(bool removeAll); void freeLocation(bool removeAll);
void freeCharacter();
// callables data // callables data
@ -478,7 +474,6 @@ public:
virtual void runPendingZones(); virtual void runPendingZones();
virtual void cleanupGame(); virtual void cleanupGame();
void setupSubtitles(char *s, char *s2, int y); void setupSubtitles(char *s, char *s2, int y);
void clearSubtitles(); void clearSubtitles();
@ -509,6 +504,7 @@ private:
void freeLocation(bool removeAll); void freeLocation(bool removeAll);
void loadProgram(AnimationPtr a, const char *filename); void loadProgram(AnimationPtr a, const char *filename);
void startGui(bool showSplash); void startGui(bool showSplash);
void freeCharacter();
typedef void (Parallaction_br::*Callable)(void*); typedef void (Parallaction_br::*Callable)(void*);
const Callable *_callables; const Callable *_callables;

View file

@ -100,6 +100,7 @@ Common::Error Parallaction_br::init() {
Parallaction_br::~Parallaction_br() { Parallaction_br::~Parallaction_br() {
freeFonts(); freeFonts();
freeCharacter();
delete _locationParser; delete _locationParser;
delete _programParser; 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) { void Parallaction_br::freeLocation(bool removeAll) {
// free open location stuff // free open location stuff
clearSubtitles(); clearSubtitles();
_gfx->clearGfxObjects(kGfxObjNormal);
_gfx->freeLabels();
_subtitle[0] = _subtitle[1] = -1; _subtitle[0] = _subtitle[1] = -1;
_gfx->freeLocationObjects();
_location._animations.remove(_char._ani); _location._animations.remove(_char._ani);
_location.cleanup(removeAll); _location.cleanup(removeAll);
_location._animations.push_front(_char._ani); _location._animations.push_front(_char._ani);
@ -195,7 +206,7 @@ void Parallaction_br::freeLocation(bool removeAll) {
void Parallaction_br::cleanupGame() { void Parallaction_br::cleanupGame() {
freeLocation(true); freeLocation(true);
// freeCharacter(); freeCharacter();
delete _globalFlagsNames; delete _globalFlagsNames;
delete _objectsNames; delete _objectsNames;
@ -233,9 +244,9 @@ void Parallaction_br::changeLocation(char *location) {
// TODO: maybe handle this into Disk // TODO: maybe handle this into Disk
if (getPlatform() == Common::kPlatformPC) { if (getPlatform() == Common::kPlatformPC) {
_char._objs = _disk->loadObjects("icone.ico"); _objects = _disk->loadObjects("icone.ico");
} else { } else {
_char._objs = _disk->loadObjects("icons.ico"); _objects = _disk->loadObjects("icons.ico");
} }
parseLocation("common.slf"); parseLocation("common.slf");
@ -299,15 +310,16 @@ void Parallaction_br::loadProgram(AnimationPtr a, const char *filename) {
void Parallaction_br::changeCharacter(const char *name) { void Parallaction_br::changeCharacter(const char *name) {
const char *charName = _char.getName(); const char *charName = _char.getName();
if (scumm_stricmp(charName, name)) { if (scumm_stricmp(charName, name)) {
freeCharacter();
debugC(1, kDebugExec, "changeCharacter(%s)", name); debugC(1, kDebugExec, "changeCharacter(%s)", name);
_char.setName(name); _char.setName(name);
_char._ani->gfxobj = _gfx->loadAnim(name); _char._ani->gfxobj = _gfx->loadCharacterAnim(name);
_char._ani->gfxobj->setFlags(kGfxObjCharacter);
_char._ani->gfxobj->clearFlags(kGfxObjNormal);
_char._talk = _disk->loadTalk(name); _char._talk = _disk->loadTalk(name);
} }

View file

@ -202,13 +202,13 @@ Common::Error Parallaction_ns::init() {
Parallaction_ns::~Parallaction_ns() { Parallaction_ns::~Parallaction_ns() {
freeFonts(); freeFonts();
freeCharacter();
delete _locationParser; delete _locationParser;
delete _programParser; delete _programParser;
freeLocation(true); freeLocation(true);
_location._animations.remove(_char._ani); _location._animations.remove(_char._ani);
} }
@ -405,18 +405,14 @@ void Parallaction_ns::changeCharacter(const char *name) {
return; return;
} }
// freeCharacter takes responsibility for checking
// character for sanity before memory is freed
freeCharacter(); freeCharacter();
_char._ani->gfxobj = _gfx->loadAnim(_char.getFullName()); _char._ani->gfxobj = _gfx->loadCharacterAnim(_char.getFullName());
_char._ani->gfxobj->setFlags(kGfxObjCharacter);
_char._ani->gfxobj->clearFlags(kGfxObjNormal);
if (!_char.dummy()) { if (!_char.dummy()) {
_char._head = _disk->loadHead(_char.getBaseName()); _char._head = _disk->loadHead(_char.getBaseName());
_char._talk = _disk->loadTalk(_char.getBaseName()); _char._talk = _disk->loadTalk(_char.getBaseName());
_char._objs = _disk->loadObjects(_char.getBaseName()); _objects = _disk->loadObjects(_char.getBaseName());
_objectsNames = _disk->loadTable(_char.getBaseName()); _objectsNames = _disk->loadTable(_char.getBaseName());
_soundMan->playCharacterMusic(_char.getBaseName()); _soundMan->playCharacterMusic(_char.getBaseName());
@ -437,6 +433,23 @@ void Parallaction_ns::changeCharacter(const char *name) {
return; 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) { void Parallaction_ns::freeLocation(bool removeAll) {
debugC(2, kDebugExec, "freeLocation"); debugC(2, kDebugExec, "freeLocation");
@ -447,7 +460,7 @@ void Parallaction_ns::freeLocation(bool removeAll) {
_localFlagNames->clear(); _localFlagNames->clear();
_gfx->clearGfxObjects(kGfxObjNormal); _gfx->freeLocationObjects();
_location._animations.remove(_char._ani); _location._animations.remove(_char._ani);
_location.cleanup(removeAll); _location.cleanup(removeAll);

View file

@ -190,6 +190,7 @@ protected:
Dialogue *parseDialogue(); Dialogue *parseDialogue();
void resolveDialogueForwards(Dialogue *dialogue, uint numQuestions, Table &forwards); void resolveDialogueForwards(Dialogue *dialogue, uint numQuestions, Table &forwards);
Answer *parseAnswer(); Answer *parseAnswer();
void parseAnswerVariants(Answer *answer);
Question *parseQuestion(); Question *parseQuestion();
void parseZone(ZoneList &list, char *name); void parseZone(ZoneList &list, char *name);