aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/parallaction/animation.cpp8
-rw-r--r--engines/parallaction/defs.h2
-rw-r--r--engines/parallaction/parallaction.cpp10
-rw-r--r--engines/parallaction/zone.h18
4 files changed, 26 insertions, 12 deletions
diff --git a/engines/parallaction/animation.cpp b/engines/parallaction/animation.cpp
index 701abc9065..031aa66bbd 100644
--- a/engines/parallaction/animation.cpp
+++ b/engines/parallaction/animation.cpp
@@ -126,7 +126,8 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name)
strcat(vC8, "tras");
}
}
- _disk->loadFrames(vC8, &vD0->_cnv);
+ vD0->_cnv = new Cnv;
+ _disk->loadFrames(vC8, vD0->_cnv);
// int16 _ax = _vm->_gfx->loadCnv(vC8, &vD0->_cnv);
// if (_ax == -1) exit(-1);
}
@@ -169,8 +170,11 @@ void Parallaction::freeAnimations() {
Animation *v4 = (Animation*)_animations._next;
while (v4) {
freeScript(v4->_program);
- _vm->_gfx->freeCnv(&v4->_cnv);
+ _vm->_gfx->freeCnv(v4->_cnv);
+ if (v4->_cnv) delete v4->_cnv;
v4 = (Animation*)v4->_zone._next;
+
+ // TODO: delete Animation
}
return;
diff --git a/engines/parallaction/defs.h b/engines/parallaction/defs.h
index d1b5730a40..6501a2c4b1 100644
--- a/engines/parallaction/defs.h
+++ b/engines/parallaction/defs.h
@@ -97,7 +97,7 @@ public:
byte* getFramePtr(uint16 index) {
if (index >= _count)
- error("frame %i does not exist", index);
+ return NULL;
return _array[index];
}
};
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index 5b8a6ff0e1..9b8dc01b8f 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -779,6 +779,12 @@ void Parallaction::pickMusic(const char *location) {
}
}
+// FIXME: currently, changeCharacter does reload every chunk of
+// information about the new character every time it is loaded.
+// So, it is useless to load both mini and normal frames each
+// since only one of them will actually be used before the
+// following call to changeCharacter.
+//
void Parallaction::changeCharacter(const char *name) {
bool miniCharacter = false;
@@ -825,9 +831,9 @@ void Parallaction::changeCharacter(const char *name) {
}
if (miniCharacter)
- memcpy(&_vm->_char._ani._cnv, &_vm->_char._miniFrames, sizeof(Cnv));
+ _vm->_char._ani._cnv = &_vm->_char._miniFrames;
else
- memcpy(&_vm->_char._ani._cnv, &_vm->_char._normalFrames, sizeof(Cnv));
+ _vm->_char._ani._cnv = &_vm->_char._normalFrames;
strcpy(_characterName1, v32);
diff --git a/engines/parallaction/zone.h b/engines/parallaction/zone.h
index 31ac168096..046403d7a0 100644
--- a/engines/parallaction/zone.h
+++ b/engines/parallaction/zone.h
@@ -298,7 +298,7 @@ struct Program : public Node {
struct Animation {
Zone _zone;
Program *_program;
- Cnv _cnv;
+ Cnv *_cnv;
int16 _frame;
uint16 field_50; // unused
int16 _z;
@@ -328,19 +328,23 @@ struct Animation {
}
uint16 width() const {
- return _cnv._width;
+ if (!_cnv) return 0;
+ return _cnv->_width;
}
uint16 height() const {
- return _cnv._height;
+ if (!_cnv) return 0;
+ return _cnv->_height;
}
- uint16 getFrameNum() {
- return _cnv._count;
+ uint16 getFrameNum() const {
+ if (!_cnv) return 0;
+ return _cnv->_count;
}
- byte* getFrameData(uint32 index) {
- return _cnv.getFramePtr(index);
+ byte* getFrameData(uint32 index) const {
+ if (!_cnv) return NULL;
+ return _cnv->getFramePtr(index);
}
};