aboutsummaryrefslogtreecommitdiff
path: root/engines/access
diff options
context:
space:
mode:
Diffstat (limited to 'engines/access')
-rw-r--r--engines/access/animation.cpp143
-rw-r--r--engines/access/animation.h22
-rw-r--r--engines/access/scripts.cpp2
3 files changed, 158 insertions, 9 deletions
diff --git a/engines/access/animation.cpp b/engines/access/animation.cpp
index 0d8589d4f1..705fd7bf8f 100644
--- a/engines/access/animation.cpp
+++ b/engines/access/animation.cpp
@@ -22,11 +22,12 @@
#include "common/endian.h"
#include "common/memstream.h"
+#include "access/access.h"
#include "access/animation.h"
namespace Access {
-AnimationResource::AnimationResource(const byte *data, int size) {
+AnimationResource::AnimationResource(AccessEngine *vm, const byte *data, int size) {
Common::MemoryReadStream stream(data, size);
int count = stream.readUint16LE();
@@ -37,7 +38,7 @@ AnimationResource::AnimationResource(const byte *data, int size) {
_animations.reserve(count);
for (int i = 0; i < count; ++i) {
stream.seek(offsets[i]);
- Animation *anim = new Animation(stream);
+ Animation *anim = new Animation(vm, stream);
_animations.push_back(anim);
}
}
@@ -49,7 +50,8 @@ AnimationResource::~AnimationResource() {
/*------------------------------------------------------------------------*/
-Animation::Animation(Common::MemoryReadStream &stream) {
+Animation::Animation(AccessEngine *vm, Common::MemoryReadStream &stream):
+ Manager(vm) {
uint32 startOfs = stream.pos();
_type = stream.readByte();
@@ -82,10 +84,143 @@ Animation::~Animation() {
delete _frames[i];
}
+typedef void(Animation::*AnimationMethodPtr)();
+
void Animation::animate() {
+ static const AnimationMethodPtr METHODS[8] =
+ { &Animation::anim0, &Animation::anim1, &Animation::anim2, &Animation::anim3,
+ &Animation::anim4, &Animation::animNone, &Animation::animNone, &Animation::anim7 };
+
+ (this->*METHODS[_type])();
+}
+
+void Animation::anim0() {
+ if (_currentLoopCount != -1) {
+ if (_countdownTicks != 0) {
+ calcFrame();
+ setFrame1();
+ } else {
+ _countdownTicks = _initialTicks;
+ ++_frameNumber;
+ calcFrame();
+
+ if (this == _vm->_animation->_animStart) {
+ _frameNumber = 0;
+ _currentLoopCount = -1;
+ }
+
+ setFrame();
+ }
+ }
+}
+
+void Animation::anim1() {
+ if (_currentLoopCount == -1 || _countdownTicks != 0) {
+ calcFrame();
+ setFrame1();
+ } else {
+ _countdownTicks = _initialTicks;
+ ++_frameNumber;
+ calcFrame();
+
+ if (this == _vm->_animation->_animStart) {
+ --_frameNumber;
+ _currentLoopCount = -1;
+ }
+
+ setFrame();
+ }
+}
+
+void Animation::anim2() {
+ if (_countdownTicks != 0) {
+ calcFrame();
+ setFrame1();
+ } else {
+ _countdownTicks = _initialTicks;
+ ++_frameNumber;
+ calcFrame();
+
+ if (this == _vm->_animation->_animStart) {
+ _frameNumber = 0;
+ calcFrame();
+ }
+
+ setFrame();
+ }
+}
+
+void Animation::anim3() {
+ if (_currentLoopCount != -1) {
+ if (_countdownTicks != 0) {
+ calcFrame();
+ setFrame1();
+ } else {
+ _countdownTicks = _initialTicks;
+ ++_frameNumber;
+ calcFrame();
+
+ if (this == _vm->_animation->_animStart) {
+ --_currentLoopCount;
+ _frameNumber = 0;
+ calcFrame();
+ }
+
+ setFrame();
+ }
+ }
+}
+
+void Animation::anim4() {
+ if (_currentLoopCount == -1 || _countdownTicks != 0) {
+ calcFrame();
+ setFrame1();
+ } else {
+ _countdownTicks = _initialTicks;
+ ++_frameNumber;
+ calcFrame();
+
+ if (this == _vm->_animation->_animStart) {
+ if (--_currentLoopCount == -1) {
+ calcFrame();
+ setFrame1();
+ return;
+ } else {
+ _frameNumber = 0;
+ calcFrame();
+ }
+ }
+
+ setFrame();
+ }
+}
+
+void Animation::animNone() {
+ // No implementation
+}
+
+void Animation::anim7() {
+ calcFrame1();
+ setFrame();
+}
+
+void Animation::calcFrame() {
+ error("TODO");
+}
+
+void Animation::calcFrame1() {
+ error("TODO");
+}
+
+void Animation::setFrame() {
error("TODO");
}
+void Animation::setFrame1() {
+ error("TODO");
+}
+
+
/*------------------------------------------------------------------------*/
AnimationFrame::AnimationFrame(Common::MemoryReadStream &stream, int startOffset) {
@@ -150,7 +285,7 @@ void AnimationManager::clearTimers() {
void AnimationManager::loadAnimations(const byte *data, int size) {
_animationTimers.clear();
delete _animation;
- _animation = new AnimationResource(data, size);
+ _animation = new AnimationResource(_vm, data, size);
}
diff --git a/engines/access/animation.h b/engines/access/animation.h
index 45a59efb68..38065bb4c9 100644
--- a/engines/access/animation.h
+++ b/engines/access/animation.h
@@ -36,9 +36,10 @@ class AnimationFrame;
class AnimationFramePart;
class AnimationManager : public Manager {
-public:
+private:
Common::Array<Animation *> _animationTimers;
AnimationResource *_animation;
+public:
Animation *_animStart;
public:
AnimationManager(AccessEngine *vm);
@@ -60,16 +61,29 @@ class AnimationResource {
private:
Common::Array<Animation *> _animations;
public:
- AnimationResource(const byte *data, int size);
+ AnimationResource(AccessEngine *vm, const byte *data, int size);
~AnimationResource();
int getCount() { return _animations.size(); }
Animation *getAnimation(int idx) { return _animations[idx]; }
};
-class Animation {
+class Animation: public Manager {
private:
Common::Array<AnimationFrame *> _frames;
+
+ void anim0();
+ void anim1();
+ void anim2();
+ void anim3();
+ void anim4();
+ void animNone();
+ void anim7();
+
+ void calcFrame();
+ void calcFrame1();
+ void setFrame();
+ void setFrame1();
public:
int _type;
int _scaling;
@@ -80,7 +94,7 @@ public:
int _currentLoopCount;
int _field10;
public:
- Animation(Common::MemoryReadStream &stream);
+ Animation(AccessEngine *vm, Common::MemoryReadStream &stream);
~Animation();
void animate();
diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp
index fd42530eb9..8018f503a3 100644
--- a/engines/access/scripts.cpp
+++ b/engines/access/scripts.cpp
@@ -171,7 +171,7 @@ void Scripts::cmdRetPos() {
}
void Scripts::cmdAnim() {
- int animId = _data->readUint16LE();
+ int animId = _data->readByte();
_vm->_animation->animate(animId);
}