aboutsummaryrefslogtreecommitdiff
path: root/engines/toon
diff options
context:
space:
mode:
Diffstat (limited to 'engines/toon')
-rw-r--r--engines/toon/anim.cpp149
-rw-r--r--engines/toon/anim.h58
-rw-r--r--engines/toon/audio.cpp2
-rw-r--r--engines/toon/character.cpp125
-rw-r--r--engines/toon/character.h33
-rw-r--r--engines/toon/detection.cpp5
-rw-r--r--engines/toon/drew.cpp2
-rw-r--r--engines/toon/drew.h2
-rw-r--r--engines/toon/flux.cpp4
-rw-r--r--engines/toon/flux.h2
-rw-r--r--engines/toon/font.cpp46
-rw-r--r--engines/toon/font.h6
-rw-r--r--engines/toon/hotspot.cpp4
-rw-r--r--engines/toon/hotspot.h4
-rw-r--r--engines/toon/movie.cpp58
-rw-r--r--engines/toon/movie.h14
-rw-r--r--engines/toon/path.cpp267
-rw-r--r--engines/toon/path.h71
-rw-r--r--engines/toon/picture.cpp60
-rw-r--r--engines/toon/picture.h24
-rw-r--r--engines/toon/script_func.cpp4
-rw-r--r--engines/toon/toon.cpp50
-rw-r--r--engines/toon/toon.h5
23 files changed, 463 insertions, 532 deletions
diff --git a/engines/toon/anim.cpp b/engines/toon/anim.cpp
index 98c667c303..1c85a8d798 100644
--- a/engines/toon/anim.cpp
+++ b/engines/toon/anim.cpp
@@ -132,7 +132,7 @@ Common::Rect Animation::getRect() {
return Common::Rect(_x1, _y1, _x2, _y2);
}
-void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy) {
+void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy) {
debugC(3, kDebugAnim, "drawFrame(surface, %d, %d, %d)", frame, xx, yy);
if (frame < 0)
frame = 0;
@@ -146,10 +146,13 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int
if (_frames[frame]._ref != -1)
frame = _frames[frame]._ref;
- int32 rectX = _frames[frame]._x2 - _frames[frame]._x1;
- int32 rectY = _frames[frame]._y2 - _frames[frame]._y1;
- int32 offsX = 0;
- int32 offsY = 0;
+ if (!_frames[frame]._data)
+ return;
+
+ int16 rectX = _frames[frame]._x2 - _frames[frame]._x1;
+ int16 rectY = _frames[frame]._y2 - _frames[frame]._y1;
+ int16 offsX = 0;
+ int16 offsY = 0;
_vm->addDirtyRect(xx + _x1 + _frames[frame]._x1, yy + _y1 + _frames[frame]._y1, xx + rectX + _x1 + _frames[frame]._x1 , yy + rectY + _y1 + _frames[frame]._y1);
@@ -186,10 +189,10 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int
int32 destPitch = surface.pitch;
uint8 *srcRow = _frames[frame]._data + offsX + (_frames[frame]._x2 - _frames[frame]._x1) * offsY;
uint8 *curRow = (uint8 *)surface.pixels + (yy + _frames[frame]._y1 + _y1 + offsY) * destPitch + (xx + _x1 + _frames[frame]._x1 + offsX);
- for (int32 y = 0; y < rectY; y++) {
+ for (int16 y = 0; y < rectY; y++) {
uint8 *cur = curRow;
uint8 *c = srcRow + y * (_frames[frame]._x2 - _frames[frame]._x1);
- for (int32 x = 0; x < rectX; x++) {
+ for (int16 x = 0; x < rectX; x++) {
if (*c)
*cur = *c;
c++;
@@ -199,27 +202,27 @@ void Animation::drawFrame(Graphics::Surface &surface, int32 frame, int32 xx, int
}
}
-void Animation::drawFrameWithMask(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask) {
+void Animation::drawFrameWithMask(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask) {
debugC(1, kDebugAnim, "drawFrameWithMask(surface, %d, %d, %d, %d, mask)", frame, xx, yy, zz);
warning("STUB: drawFrameWithMask()");
}
-void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale) {
+void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask, int32 scale) {
debugC(5, kDebugAnim, "drawFrameWithMaskAndScale(surface, %d, %d, %d, %d, mask, %d)", frame, xx, yy, zz, scale);
if (_frames[frame]._ref != -1)
frame = _frames[frame]._ref;
- int32 rectX = _frames[frame]._x2 - _frames[frame]._x1;
- int32 rectY = _frames[frame]._y2 - _frames[frame]._y1;
+ int16 rectX = _frames[frame]._x2 - _frames[frame]._x1;
+ int16 rectY = _frames[frame]._y2 - _frames[frame]._y1;
- int32 finalWidth = rectX * scale / 1024;
- int32 finalHeight = rectY * scale / 1024;
+ int16 finalWidth = rectX * scale / 1024;
+ int16 finalHeight = rectY * scale / 1024;
// compute final x1, y1, x2, y2
- int32 xx1 = xx + _x1 + _frames[frame]._x1 * scale / 1024;
- int32 yy1 = yy + _y1 + _frames[frame]._y1 * scale / 1024;
- int32 xx2 = xx1 + finalWidth;
- int32 yy2 = yy1 + finalHeight;
- int32 w = _frames[frame]._x2 - _frames[frame]._x1;
+ int16 xx1 = xx + _x1 + _frames[frame]._x1 * scale / 1024;
+ int16 yy1 = yy + _y1 + _frames[frame]._y1 * scale / 1024;
+ int16 xx2 = xx1 + finalWidth;
+ int16 yy2 = yy1 + finalHeight;
+ int16 w = _frames[frame]._x2 - _frames[frame]._x1;
_vm->addDirtyRect(xx1, yy1, xx2, yy2);
@@ -229,37 +232,26 @@ void Animation::drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 fram
uint8 *curRow = (uint8 *)surface.pixels;
uint8 *curRowMask = mask->getDataPtr();
- if (strstr(_name, "SHADOW")) {
- for (int y = yy1; y < yy2; y++) {
- for (int x = xx1; x < xx2; x++) {
- if (x < 0 || x >= 1280 || y < 0 || y >= 400)
- continue;
+ bool shadowFlag = false;
+ if (strstr(_name, "SHADOW"))
+ shadowFlag = true;
+
+ for (int16 y = yy1; y < yy2; y++) {
+ for (int16 x = xx1; x < xx2; x++) {
+ if (x < 0 || x >= 1280 || y < 0 || y >= 400)
+ continue;
- uint8 *cur = curRow + x + y * destPitch;
- uint8 *curMask = curRowMask + x + y * destPitchMask;
+ uint8 *cur = curRow + x + y * destPitch;
+ uint8 *curMask = curRowMask + x + y * destPitchMask;
- // find the good c
- int32 xs = (x - xx1) * 1024 / scale;
- int32 ys = (y - yy1) * 1024 / scale;
- uint8 *cc = &c[ys * w + xs];
- if (*cc && ((*curMask) >= zz))
+ // find the good c
+ int16 xs = (x - xx1) * 1024 / scale;
+ int16 ys = (y - yy1) * 1024 / scale;
+ uint8 *cc = &c[ys * w + xs];
+ if (*cc && ((*curMask) >= zz)) {
+ if (shadowFlag)
*cur = _vm->getShadowLUT()[*cur];
- }
- }
- } else {
- for (int y = yy1; y < yy2; y++) {
- for (int x = xx1; x < xx2; x++) {
- if (x < 0 || x >= 1280 || y < 0 || y >= 400)
- continue;
-
- uint8 *cur = curRow + x + y * destPitch;
- uint8 *curMask = curRowMask + x + y * destPitchMask;
-
- // find the good c
- int32 xs = (x - xx1) * 1024 / scale;
- int32 ys = (y - yy1) * 1024 / scale;
- uint8 *cc = &c[ys * w + xs];
- if (*cc && ((*curMask) >= zz))
+ else
*cur = *cc;
}
}
@@ -283,7 +275,7 @@ Common::Rect Animation::getFrameRect(int32 frame) {
return Common::Rect(_frames[frame]._x1, _frames[frame]._y1, _frames[frame]._x2, _frames[frame]._y2);
}
-int32 Animation::getFrameWidth(int32 frame) {
+int16 Animation::getFrameWidth(int32 frame) {
debugC(4, kDebugAnim, "getFrameWidth(%d)", frame);
if ((frame < 0) || (frame >= _numFrames))
return 0;
@@ -294,7 +286,7 @@ int32 Animation::getFrameWidth(int32 frame) {
return _frames[frame]._x2 - _frames[frame]._x1;
}
-int32 Animation::getFrameHeight(int32 frame) {
+int16 Animation::getFrameHeight(int32 frame) {
debugC(4, kDebugAnim, "getFrameHeight(%d)", frame);
if (frame < 0 || frame >= _numFrames)
return 0;
@@ -305,15 +297,15 @@ int32 Animation::getFrameHeight(int32 frame) {
return _frames[frame]._y2 - _frames[frame]._y1;
}
-int32 Animation::getWidth() const {
+int16 Animation::getWidth() const {
return _x2 - _x1;
}
-int32 Animation::getHeight() const {
+int16 Animation::getHeight() const {
return _y2 - _y1;
}
-void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, byte *colorMap) {
+void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, byte *colorMap) {
debugC(4, kDebugAnim, "drawFontFrame(surface, %d, %d, %d, colorMap)", frame, xx, yy);
if (frame < 0)
frame = 0;
@@ -327,8 +319,8 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx,
if (_frames[frame]._ref != -1)
frame = _frames[frame]._ref;
- int32 rectX = _frames[frame]._x2 - _frames[frame]._x1;
- int32 rectY = _frames[frame]._y2 - _frames[frame]._y1;
+ int16 rectX = _frames[frame]._x2 - _frames[frame]._x1;
+ int16 rectY = _frames[frame]._y2 - _frames[frame]._y1;
if ((xx + _x1 + _frames[frame]._x1 < 0) || (yy + _y1 + _frames[frame]._y1 < 0))
return;
@@ -348,9 +340,9 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx,
int32 destPitch = surface.pitch;
uint8 *c = _frames[frame]._data;
uint8 *curRow = (uint8 *)surface.pixels + (yy + _frames[frame]._y1 + _y1) * destPitch + (xx + _x1 + _frames[frame]._x1);
- for (int32 y = 0; y < rectY; y++) {
+ for (int16 y = 0; y < rectY; y++) {
unsigned char *cur = curRow;
- for (int32 x = 0; x < rectX; x++) {
+ for (int16 x = 0; x < rectX; x++) {
if (*c && *c < 4)
*cur = colorMap[*c];
c++;
@@ -360,7 +352,7 @@ void Animation::drawFontFrame(Graphics::Surface &surface, int32 frame, int32 xx,
}
}
-void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) {
+void Animation::drawFrameOnPicture(int32 frame, int16 xx, int16 yy) {
debugC(1, kDebugAnim, "drawFrameOnPicture(%d, %d, %d)", frame, xx, yy);
if (frame < 0)
frame = 0;
@@ -374,8 +366,8 @@ void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) {
if (_frames[frame]._ref != -1)
frame = _frames[frame]._ref;
- int32 rectX = _frames[frame]._x2 - _frames[frame]._x1;
- int32 rectY = _frames[frame]._y2 - _frames[frame]._y1;
+ int16 rectX = _frames[frame]._x2 - _frames[frame]._x1;
+ int16 rectY = _frames[frame]._y2 - _frames[frame]._y1;
Picture *pic = _vm->getPicture();
@@ -397,9 +389,9 @@ void Animation::drawFrameOnPicture(int32 frame, int32 xx, int32 yy) {
int32 destPitch = pic->getWidth();
uint8 *c = _frames[frame]._data;
uint8 *curRow = (uint8 *)pic->getDataPtr() + (yy + _frames[frame]._y1 + _y1) * destPitch + (xx + _x1 + _frames[frame]._x1);
- for (int32 y = 0; y < rectY; y++) {
+ for (int16 y = 0; y < rectY; y++) {
unsigned char *cur = curRow;
- for (int32 x = 0; x < rectX; x++) {
+ for (int16 x = 0; x < rectX; x++) {
if (*c)
*cur = *c;
c++;
@@ -466,8 +458,8 @@ void AnimationInstance::render() {
if (frame >= _animation->_numFrames)
frame = _animation->_numFrames - 1;
- int32 x = _x;
- int32 y = _y;
+ int16 x = _x;
+ int16 y = _y;
if (_alignBottom) {
int32 offsetX = (_animation->_x2 - _animation->_x1) / 2 * (_scale - 1024);
@@ -509,7 +501,7 @@ void AnimationInstance::setAnimation(Animation *animation, bool setRange) {
}
}
-void AnimationInstance::setAnimationRange(int32 rangeStart, int rangeEnd) {
+void AnimationInstance::setAnimationRange(int32 rangeStart, int32 rangeEnd) {
debugC(5, kDebugAnim, "setAnimationRange(%d, %d)", rangeStart, rangeEnd);
_rangeStart = rangeStart;
_rangeEnd = rangeEnd;
@@ -521,7 +513,7 @@ void AnimationInstance::setAnimationRange(int32 rangeStart, int rangeEnd) {
_currentFrame = _rangeEnd;
}
-void AnimationInstance::setPosition(int32 x, int32 y, int32 z, bool relative) {
+void AnimationInstance::setPosition(int16 x, int16 y, int32 z, bool relative) {
debugC(5, kDebugAnim, "setPosition(%d, %d, %d, %d)", x, y, z, (relative) ? 1 : 0);
if (relative || !_animation) {
_x = x;
@@ -534,7 +526,7 @@ void AnimationInstance::setPosition(int32 x, int32 y, int32 z, bool relative) {
}
}
-void AnimationInstance::moveRelative(int32 dx, int32 dy, int32 dz) {
+void AnimationInstance::moveRelative(int16 dx, int16 dy, int32 dz) {
debugC(1, kDebugAnim, "moveRelative(%d, %d, %d)", dx, dy, dz);
_x += dx;
_y += dy;
@@ -579,13 +571,13 @@ void AnimationInstance::setUseMask(bool useMask) {
_useMask = useMask;
}
-void AnimationInstance::getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) const {
+void AnimationInstance::getRect(int16 *x1, int16 *y1, int16 *x2, int16 *y2) const {
debugC(5, kDebugAnim, "getRect(%d, %d, %d, %d)", *x1, *y1, *x2, *y2);
- int32 rectX = _animation->_frames[_currentFrame]._x2 - _animation->_frames[_currentFrame]._x1;
- int32 rectY = _animation->_frames[_currentFrame]._y2 - _animation->_frames[_currentFrame]._y1;
+ int16 rectX = _animation->_frames[_currentFrame]._x2 - _animation->_frames[_currentFrame]._x1;
+ int16 rectY = _animation->_frames[_currentFrame]._y2 - _animation->_frames[_currentFrame]._y1;
- int32 finalWidth = rectX * _scale / 1024;
- int32 finalHeight = rectY * _scale / 1024;
+ int16 finalWidth = rectX * _scale / 1024;
+ int16 finalHeight = rectY * _scale / 1024;
// compute final x1, y1, x2, y2
*x1 = _x + _animation->_x1 + _animation->_frames[_currentFrame]._x1 * _scale / 1024;
@@ -594,7 +586,7 @@ void AnimationInstance::getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) cons
*y2 = *y1 + finalHeight;
}
-void AnimationInstance::setX(int32 x, bool relative) {
+void AnimationInstance::setX(int16 x, bool relative) {
debugC(1, kDebugAnim, "setX(%d, %d)", x, (relative) ? 1 : 0);
if (relative || !_animation)
_x = x;
@@ -602,7 +594,7 @@ void AnimationInstance::setX(int32 x, bool relative) {
_x = x - _animation->_x1;
}
-void AnimationInstance::setY(int32 y, bool relative) {
+void AnimationInstance::setY(int16 y, bool relative) {
debugC(1, kDebugAnim, "setY(%d, %d)", y, (relative) ? 1 : 0);
if (relative || !_animation)
_y = y;
@@ -625,11 +617,11 @@ int32 AnimationInstance::getLayerZ() const {
return _layerZ;
}
-int32 AnimationInstance::getX2() const {
+int16 AnimationInstance::getX2() const {
return _x + _animation->_x1;
}
-int32 AnimationInstance::getY2() const {
+int16 AnimationInstance::getY2() const {
return _y + _animation->_y1;
}
@@ -658,6 +650,7 @@ void AnimationInstance::save(Common::WriteStream *stream) {
stream->writeSint32LE(_visible);
stream->writeSint32LE(_useMask);
}
+
void AnimationInstance::load(Common::ReadStream *stream) {
_currentFrame = stream->readSint32LE();
_currentTime = stream->readSint32LE();
@@ -706,14 +699,13 @@ void AnimationManager::updateInstance(AnimationInstance* instance) {
}
void AnimationManager::addInstance(AnimationInstance *instance) {
-
// if the instance already exists, we skip the add
for (uint32 i = 0; i < _instances.size(); i++) {
if (_instances[i] == instance)
return;
}
- int found = -1;
+ int32 found = -1;
// here we now do an ordered insert (closer to the original game)
for (uint32 i = 0; i < _instances.size(); i++) {
@@ -723,11 +715,10 @@ void AnimationManager::addInstance(AnimationInstance *instance) {
}
}
- if ( found == -1 ) {
+ if (found == -1)
_instances.push_back(instance);
- } else {
+ else
_instances.insert_at(found, instance);
- }
}
void AnimationManager::removeInstance(AnimationInstance *instance) {
diff --git a/engines/toon/anim.h b/engines/toon/anim.h
index eb8dcbd600..cd550b2621 100644
--- a/engines/toon/anim.h
+++ b/engines/toon/anim.h
@@ -36,10 +36,10 @@ class Picture;
class ToonEngine;
struct AnimationFrame {
- int32 _x1;
- int32 _y1;
- int32 _x2;
- int32 _y2;
+ int16 _x1;
+ int16 _y1;
+ int16 _x2;
+ int16 _y2;
int32 _ref;
uint8 *_data;
};
@@ -49,10 +49,10 @@ public:
Animation(ToonEngine *vm);
~Animation();
- int32 _x1;
- int32 _y1;
- int32 _x2;
- int32 _y2;
+ int16 _x1;
+ int16 _y1;
+ int16 _x2;
+ int16 _y2;
int32 _numFrames;
int32 _fps;
AnimationFrame *_frames;
@@ -61,18 +61,18 @@ public:
char _name[32];
bool loadAnimation(const Common::String &file);
- void drawFrame(Graphics::Surface &surface, int32 frame, int32 x, int32 y);
- void drawFontFrame(Graphics::Surface &surface, int32 frame, int32 x, int32 y, byte *colorMap);
- void drawFrameOnPicture(int32 frame, int32 x, int32 y);
- void drawFrameWithMask(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask);
- void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale);
+ void drawFrame(Graphics::Surface &surface, int32 frame, int16 x, int16 y);
+ void drawFontFrame(Graphics::Surface &surface, int32 frame, int16 x, int16 y, byte *colorMap);
+ void drawFrameOnPicture(int32 frame, int16 x, int16 y);
+ void drawFrameWithMask(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask);
+ void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int16 xx, int16 yy, int32 zz, Picture *mask, int32 scale);
void drawStrip(int32 offset = 0);
void applyPalette(int32 offset, int32 srcOffset, int32 numEntries);
Common::Rect getFrameRect(int32 frame);
- int32 getFrameWidth(int32 frame);
- int32 getFrameHeight(int32 frame);
- int32 getWidth() const;
- int32 getHeight() const;
+ int16 getFrameWidth(int32 frame);
+ int16 getFrameHeight(int32 frame);
+ int16 getWidth() const;
+ int16 getHeight() const;
Common::Rect getRect();
protected:
ToonEngine *_vm;
@@ -92,25 +92,25 @@ public:
void renderOnPicture();
void setAnimation(Animation *animation, bool setRange = true);
void playAnimation();
- void setAnimationRange(int32 rangeStart, int rangeEnd);
+ void setAnimationRange(int32 rangeStart, int32 rangeEnd);
void setFps(int32 fps);
void setLooping(bool enable);
void stopAnimation();
void setFrame(int32 position);
void forceFrame(int32 position);
- void setPosition(int32 x, int32 y, int32 z, bool relative = false);
+ void setPosition(int16 x, int16 y, int32 z, bool relative = false);
Animation *getAnimation() const { return _animation; }
void setScale(int32 scale, bool align = false);
void setVisible(bool visible);
bool getVisible() const { return _visible; }
void setUseMask(bool useMask);
- void moveRelative(int32 dx, int32 dy, int32 dz);
- void getRect(int32 *x1, int32 *y1, int32 *x2, int32 *y2) const;
- int32 getX() const { return _x; }
- int32 getY() const { return _y; }
+ void moveRelative(int16 dx, int16 dy, int32 dz);
+ void getRect(int16 *x1, int16 *y1, int16 *x2, int16 *y2) const;
+ int16 getX() const { return _x; }
+ int16 getY() const { return _y; }
int32 getZ() const { return _z; }
- int32 getX2() const;
- int32 getY2() const;
+ int16 getX2() const;
+ int16 getY2() const;
int32 getZ2() const;
int32 getFrame() const { return _currentFrame; }
void reset();
@@ -120,8 +120,8 @@ public:
void setId(int32 id) { _id = id; }
int32 getId() const { return _id; }
- void setX(int32 x, bool relative = false);
- void setY(int32 y, bool relative = false);
+ void setX(int16 x, bool relative = false);
+ void setY(int16 y, bool relative = false);
void setZ(int32 z, bool relative = false);
void setLayerZ(int32 layer);
int32 getLayerZ() const;
@@ -133,8 +133,8 @@ protected:
int32 _currentTime;
int32 _fps;
Animation *_animation;
- int32 _x;
- int32 _y;
+ int16 _x;
+ int16 _y;
int32 _z;
int32 _layerZ;
int32 _rangeStart;
diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp
index 77822ab078..bc0e051057 100644
--- a/engines/toon/audio.cpp
+++ b/engines/toon/audio.cpp
@@ -326,7 +326,7 @@ bool AudioStreamInstance::readPacket() {
}
if (numDecompressedBytes > _bufferMaxSize) {
- delete [] _buffer;
+ delete[] _buffer;
_bufferMaxSize = numDecompressedBytes;
_buffer = new int16[numDecompressedBytes];
}
diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp
index 0e5189957b..479f4965f3 100644
--- a/engines/toon/character.cpp
+++ b/engines/toon/character.cpp
@@ -56,14 +56,13 @@ Character::Character(ToonEngine *vm) : _vm(vm) {
_animScriptId = -1;
_animSpecialId = -1;
_animSpecialDefaultId = 0;
- _currentPathNodeCount = 0;
_currentPathNode = 0;
_currentWalkStamp = 0;
_visible = true;
_speed = 150; // 150 = nominal drew speed
_lastWalkTime = 0;
_numPixelToWalk = 0;
- _nextIdleTime = _vm->getSystem()->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength();
+ _nextIdleTime = _vm->_system->getMillis() + (_vm->randRange(0, 600) + 300) * _vm->getTickLength();
_lineToSayId = 0;
}
@@ -81,7 +80,7 @@ Character::~Character(void) {
void Character::init() {
}
-void Character::forceFacing( int32 facing ) {
+void Character::forceFacing(int32 facing) {
debugC(4, kDebugCharacter, "forceFacing(%d)", facing);
_facing = facing;
}
@@ -102,7 +101,7 @@ void Character::setFacing(int32 facing) {
int32 dir = 0;
- _lastWalkTime = _vm->getSystem()->getMillis();
+ _lastWalkTime = _vm->_system->getMillis();
if ((_facing - facing + 8) % 8 > (facing - _facing + 8) % 8)
dir = 1;
else
@@ -123,7 +122,7 @@ void Character::setFacing(int32 facing) {
_lastWalkTime = _vm->getOldMilli();
}
- if (_currentPathNode == 0)
+ if (_currentPathNode == 0)
playStandingAnim();
else
playWalkAnim(0, 0);
@@ -136,8 +135,7 @@ void Character::setFacing(int32 facing) {
_facing = facing;
}
-void Character::forcePosition(int32 x, int32 y) {
-
+void Character::forcePosition(int16 x, int16 y) {
debugC(5, kDebugCharacter, "forcePosition(%d, %d)", x, y);
setPosition(x, y);
@@ -145,7 +143,7 @@ void Character::forcePosition(int32 x, int32 y) {
_finalY = y;
}
-void Character::setPosition(int32 x, int32 y) {
+void Character::setPosition(int16 x, int16 y) {
debugC(5, kDebugCharacter, "setPosition(%d, %d)", x, y);
_x = x;
@@ -155,7 +153,7 @@ void Character::setPosition(int32 x, int32 y) {
return;
}
-bool Character::walkTo(int32 newPosX, int32 newPosY) {
+bool Character::walkTo(int16 newPosX, int16 newPosY) {
debugC(1, kDebugCharacter, "walkTo(%d, %d)", newPosX, newPosY);
if (!_visible)
@@ -167,9 +165,9 @@ bool Character::walkTo(int32 newPosX, int32 newPosY) {
_vm->getPathFinding()->resetBlockingRects();
// don't allow flux to go at the same position as drew
- if (_id == 1 ) {
- int32 sizeX = MAX<int32>(5, 30 * _vm->getDrew()->getScale() / 1024);
- int32 sizeY = MAX<int32>(2, 20 * _vm->getDrew()->getScale() / 1024);
+ if (_id == 1) {
+ int16 sizeX = MAX<int16>(5, 30 * _vm->getDrew()->getScale() / 1024);
+ int16 sizeY = MAX<int16>(2, 20 * _vm->getDrew()->getScale() / 1024);
_vm->getPathFinding()->addBlockingEllipse(_vm->getDrew()->getFinalX(), _vm->getDrew()->getFinalY(), sizeX, sizeY);
}
@@ -179,20 +177,18 @@ bool Character::walkTo(int32 newPosX, int32 newPosY) {
if (_vm->getPathFinding()->findPath(_x, _y, _finalX, _finalY)) {
- int32 localFinalX = _finalX;
- int32 localFinalY = _finalY;
+ int16 localFinalX = _finalX;
+ int16 localFinalY = _finalY;
int32 smoothDx = 0;
int32 smoothDy = 0;
- for (int32 a = 0; a < _vm->getPathFinding()->getPathNodeCount(); a++) {
- _currentPathX[a] = _vm->getPathFinding()->getPathNodeX(a);
- _currentPathY[a] = _vm->getPathFinding()->getPathNodeY(a);
- }
- _currentPathNodeCount = _vm->getPathFinding()->getPathNodeCount();
+ _currentPath.clear();
+ for (uint32 a = 0; a < _vm->getPathFinding()->getPathNodeCount(); a++)
+ _currentPath.push_back(Common::Point(_vm->getPathFinding()->getPathNodeX(a), _vm->getPathFinding()->getPathNodeY(a)));
_currentPathNode = 0;
stopSpecialAnim();
- _lastWalkTime = _vm->getSystem()->getMillis();
+ _lastWalkTime = _vm->_system->getMillis();
_numPixelToWalk = 0;
@@ -203,12 +199,12 @@ bool Character::walkTo(int32 newPosX, int32 newPosY) {
int32 localWalkStamp = _currentWalkStamp;
if (_blockingWalk) {
- while ((_x != newPosX || _y != newPosY) && _currentPathNode < _currentPathNodeCount && !_vm->shouldQuitGame()) {
- if (_currentPathNode < _currentPathNodeCount - 4) {
- int32 delta = MIN<int32>(4, _currentPathNodeCount - _currentPathNode);
+ while ((_x != newPosX || _y != newPosY) && _currentPathNode < _currentPath.size() && !_vm->shouldQuitGame()) {
+ if (_currentPathNode < _currentPath.size() - 4) {
+ int32 delta = MIN<int32>(4, _currentPath.size() - 1 - _currentPathNode);
- int32 dx = _currentPathX[_currentPathNode+delta] - _x;
- int32 dy = _currentPathY[_currentPathNode+delta] - _y;
+ int16 dx = _currentPath[_currentPathNode+delta].x - _x;
+ int16 dy = _currentPath[_currentPathNode+delta].y - _y;
// smooth the facing computation. It prevents some ugly flickering from happening
if (!smoothDx && !smoothDy) {
@@ -224,12 +220,12 @@ bool Character::walkTo(int32 newPosX, int32 newPosY) {
}
// in 1/1000 pixels
- _numPixelToWalk += _speed * (_vm->getSystem()->getMillis() - _lastWalkTime) * _scale / 1024;
- _lastWalkTime = _vm->getSystem()->getMillis();
+ _numPixelToWalk += _speed * (_vm->_system->getMillis() - _lastWalkTime) * _scale / 1024;
+ _lastWalkTime = _vm->_system->getMillis();
- while (_numPixelToWalk >= 1000 && _currentPathNode < _currentPathNodeCount) {
- _x = _currentPathX[_currentPathNode];
- _y = _currentPathY[_currentPathNode];
+ while (_numPixelToWalk >= 1000 && _currentPathNode < _currentPath.size()) {
+ _x = _currentPath[_currentPathNode].x;
+ _y = _currentPath[_currentPathNode].y;
_currentPathNode += 1;
_numPixelToWalk -= 1000;
}
@@ -245,7 +241,7 @@ bool Character::walkTo(int32 newPosX, int32 newPosY) {
playStandingAnim();
_flags &= ~0x1;
_currentPathNode = 0;
- _currentPathNodeCount = 0;
+ _currentPath.clear();
if (_x != localFinalX || _y != localFinalY) {
return false;
@@ -264,10 +260,11 @@ int32 Character::getFlag() {
return _flags;
}
-int32 Character::getX() {
+int16 Character::getX() {
return _x;
}
-int32 Character::getY() {
+
+int16 Character::getY() {
return _y;
}
@@ -348,23 +345,23 @@ void Character::stopSpecialAnim() {
void Character::update(int32 timeIncrement) {
debugC(5, kDebugCharacter, "update(%d)", timeIncrement);
- if ((_flags & 0x1) && _currentPathNodeCount > 0) {
- if (_currentPathNode < _currentPathNodeCount) {
- if (_currentPathNode < _currentPathNodeCount - 10) {
- int32 delta = MIN<int32>(10, _currentPathNodeCount - _currentPathNode);
- int32 dx = _currentPathX[_currentPathNode+delta] - _x;
- int32 dy = _currentPathY[_currentPathNode+delta] - _y;
+ if ((_flags & 0x1) && _currentPath.size() > 0) {
+ if (_currentPathNode < _currentPath.size()) {
+ if (_currentPathNode < _currentPath.size() - 10) {
+ int32 delta = MIN<int32>(10, _currentPath.size() - 1 - _currentPathNode);
+ int16 dx = _currentPath[_currentPathNode+delta].x - _x;
+ int16 dy = _currentPath[_currentPathNode+delta].y - _y;
setFacing(getFacingFromDirection(dx, dy));
playWalkAnim(0, 0);
}
// in 1/1000 pixels
- _numPixelToWalk += _speed * (_vm->getSystem()->getMillis() - _lastWalkTime) * _scale / 1024;
- _lastWalkTime = _vm->getSystem()->getMillis();
+ _numPixelToWalk += _speed * (_vm->_system->getMillis() - _lastWalkTime) * _scale / 1024;
+ _lastWalkTime = _vm->_system->getMillis();
- while (_numPixelToWalk > 1000 && _currentPathNode < _currentPathNodeCount) {
- _x = _currentPathX[_currentPathNode];
- _y = _currentPathY[_currentPathNode];
+ while (_numPixelToWalk > 1000 && _currentPathNode < _currentPath.size()) {
+ _x = _currentPath[_currentPathNode].x;
+ _y = _currentPath[_currentPathNode].y;
_currentPathNode += 1;
_numPixelToWalk -= 1000;
}
@@ -372,7 +369,7 @@ void Character::update(int32 timeIncrement) {
} else {
playStandingAnim();
_flags &= ~0x1;
- _currentPathNodeCount = 0;
+ _currentPath.clear();
}
}
@@ -527,7 +524,7 @@ void Character::update(int32 timeIncrement) {
}
// adapted from Kyra
-int32 Character::getFacingFromDirection(int32 dx, int32 dy) {
+int32 Character::getFacingFromDirection(int16 dx, int16 dy) {
debugC(4, kDebugCharacter, "getFacingFromDirection(%d, %d)", dx, dy);
static const int facingTable[] = {
@@ -537,35 +534,33 @@ int32 Character::getFacingFromDirection(int32 dx, int32 dy) {
dx = -dx;
int32 facingEntry = 0;
- int32 ydiff = dy;
+ int16 ydiff = dy;
if (ydiff < 0) {
++facingEntry;
ydiff = -ydiff;
}
- facingEntry <<= 1;
+ facingEntry *= 2;
- int32 xdiff = dx;
+ int16 xdiff = dx;
if (xdiff < 0) {
++facingEntry;
xdiff = -xdiff;
}
- facingEntry <<= 1;
+ facingEntry *= 2;
if (xdiff >= ydiff) {
- int32 temp = ydiff;
+ // Swap xdiff and ydiff
+ int16 temp = ydiff;
ydiff = xdiff;
xdiff = temp;
- } else {
- facingEntry += 1;
- }
-
- facingEntry <<= 1;
+ } else
+ facingEntry++;
- int32 temp = (ydiff + 1) >> 1;
+ facingEntry *= 2;
- if (xdiff < temp)
- facingEntry += 1;
+ if (xdiff < ((ydiff + 1) / 2))
+ facingEntry++;
return facingTable[facingEntry];
}
@@ -638,7 +633,7 @@ void Character::load(Common::ReadStream *stream) {
// "not visible" flag.
if (_flags & 0x100) {
_flags &= ~0x100;
- setVisible(false);
+ setVisible(false);
}
}
@@ -664,7 +659,7 @@ void Character::stopWalk() {
_finalY = _y;
_flags &= ~0x1;
_currentPathNode = 0;
- _currentPathNodeCount = 0;
+ _currentPath.clear();
}
const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterId, int32 animationId) {
@@ -996,8 +991,8 @@ bool Character::loadShadowAnimation(const Common::String &animName) {
}
void Character::plotPath(Graphics::Surface& surface) {
- for (int i = 0; i < _currentPathNodeCount; i++) {
- *(byte *)surface.getBasePtr(_currentPathX[i], _currentPathY[i]) = ( i < _currentPathNode);
+ for (uint32 i = 0; i < _currentPath.size(); i++) {
+ *(byte *)surface.getBasePtr(_currentPath[i].x, _currentPath[i].y) = (i < _currentPathNode);
}
}
@@ -1078,11 +1073,11 @@ void Character::setDefaultSpecialAnimationId(int32 defaultAnimationId) {
_animSpecialDefaultId = defaultAnimationId;
}
-int32 Character::getFinalX() {
+int16 Character::getFinalX() {
return _finalX;
}
-int32 Character::getFinalY() {
+int16 Character::getFinalY() {
return _finalY;
}
diff --git a/engines/toon/character.h b/engines/toon/character.h
index d06a6c060c..d33c314bf7 100644
--- a/engines/toon/character.h
+++ b/engines/toon/character.h
@@ -23,6 +23,9 @@
#ifndef TOON_CHARACTER_H
#define TOON_CHARACTER_H
+#include "common/array.h"
+#include "common/rect.h"
+
#include "toon/toon.h"
namespace Toon {
@@ -65,13 +68,13 @@ public:
virtual int32 getFlag();
virtual int32 getAnimFlag();
virtual void setAnimFlag(int32 flag);
- virtual void setPosition(int32 x, int32 y);
- virtual void forcePosition(int32 x, int32 y);
- virtual int32 getX();
- virtual int32 getY();
- virtual int32 getFinalX();
- virtual int32 getFinalY();
- virtual bool walkTo(int32 newPosX, int32 newPosY);
+ virtual void setPosition(int16 x, int16 y);
+ virtual void forcePosition(int16 x, int16 y);
+ virtual int16 getX();
+ virtual int16 getY();
+ virtual int16 getFinalX();
+ virtual int16 getFinalY();
+ virtual bool walkTo(int16 newPosX, int16 newPosY);
virtual bool getVisible();
virtual void setVisible(bool visible);
virtual bool loadWalkAnimation(const Common::String &animName);
@@ -99,7 +102,7 @@ public:
virtual void resetScale() {}
virtual void plotPath(Graphics::Surface& surface);
- int32 getFacingFromDirection(int32 dx, int32 dy);
+ int32 getFacingFromDirection(int16 dx, int16 dy);
static const SpecialCharacterAnimation *getSpecialAnimation(int32 characterId, int32 animationId);
protected:
@@ -112,11 +115,11 @@ protected:
int32 _sceneAnimationId;
int32 _lineToSayId;
int32 _time;
- int32 _x;
- int32 _y;
+ int16 _x;
+ int16 _y;
int32 _z;
- int32 _finalX;
- int32 _finalY;
+ int16 _finalX;
+ int16 _finalY;
int32 _facing;
int32 _flags;
int32 _animFlags;
@@ -137,10 +140,8 @@ protected:
Animation *_shadowAnim;
Animation *_specialAnim;
- int32 _currentPathX[4096];
- int32 _currentPathY[4096];
- int32 _currentPathNodeCount;
- int32 _currentPathNode;
+ Common::Array<Common::Point> _currentPath;
+ uint32 _currentPathNode;
int32 _currentWalkStamp;
};
diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp
index 8234934972..3877fa2a6c 100644
--- a/engines/toon/detection.cpp
+++ b/engines/toon/detection.cpp
@@ -133,7 +133,7 @@ public:
}
virtual const ADGameDescription *fallbackDetect(const FileMap &allFiles, const Common::FSList &fslist) const {
- return detectGameFilebased(allFiles, Toon::fileBasedFallback);
+ return detectGameFilebased(allFiles, fslist, Toon::fileBasedFallback);
}
virtual const char *getName() const {
@@ -234,9 +234,6 @@ SaveStateDescriptor ToonMetaEngine::querySaveMetaInfos(const char *target, int s
Graphics::Surface *const thumbnail = Graphics::loadThumbnail(*file);
desc.setThumbnail(thumbnail);
- desc.setDeletableFlag(true);
- desc.setWriteProtectedFlag(false);
-
uint32 saveDate = file->readUint32BE();
uint16 saveTime = file->readUint16BE();
diff --git a/engines/toon/drew.cpp b/engines/toon/drew.cpp
index df5cfcfa03..dfd3f515fa 100644
--- a/engines/toon/drew.cpp
+++ b/engines/toon/drew.cpp
@@ -48,7 +48,7 @@ bool CharacterDrew::setupPalette() {
return false;
}
-void CharacterDrew::setPosition(int32 x, int32 y) {
+void CharacterDrew::setPosition(int16 x, int16 y) {
debugC(5, kDebugCharacter, "setPosition(%d, %d)", x, y);
_z = _vm->getLayerAtPoint(x, y);
diff --git a/engines/toon/drew.h b/engines/toon/drew.h
index 3357b99846..ff1b619125 100644
--- a/engines/toon/drew.h
+++ b/engines/toon/drew.h
@@ -35,7 +35,7 @@ public:
virtual ~CharacterDrew();
bool setupPalette();
void playStandingAnim();
- void setPosition(int32 x, int32 y);
+ void setPosition(int16 x, int16 y);
void resetScale();
void update(int32 timeIncrement);
void playWalkAnim(int32 start, int32 end);
diff --git a/engines/toon/flux.cpp b/engines/toon/flux.cpp
index b752e65c82..70aa40fb36 100644
--- a/engines/toon/flux.cpp
+++ b/engines/toon/flux.cpp
@@ -45,7 +45,7 @@ void CharacterFlux::playStandingAnim() {
_animationInstance->stopAnimation();
_animationInstance->setLooping(true);
- //s/etVisible(true);
+ //setVisible(true);
}
void CharacterFlux::setVisible(bool visible) {
@@ -99,7 +99,7 @@ int32 CharacterFlux::fixFacingForAnimation(int32 originalFacing, int32 animation
return finalFacing;
}
-void CharacterFlux::setPosition(int32 x, int32 y) {
+void CharacterFlux::setPosition(int16 x, int16 y) {
debugC(5, kDebugCharacter, "setPosition(%d, %d)", x, y);
_z = _vm->getLayerAtPoint(x, y);
diff --git a/engines/toon/flux.h b/engines/toon/flux.h
index c208bc5bda..1dc0d9c55f 100644
--- a/engines/toon/flux.h
+++ b/engines/toon/flux.h
@@ -34,7 +34,7 @@ public:
CharacterFlux(ToonEngine *vm);
virtual ~CharacterFlux();
- void setPosition(int32 x, int32 y);
+ void setPosition(int16 x, int16 y);
void playStandingAnim();
void playWalkAnim(int32 start, int32 end);
void update(int32 timeIncrement);
diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp
index d58663a00c..1e851ff4ae 100644
--- a/engines/toon/font.cpp
+++ b/engines/toon/font.cpp
@@ -65,10 +65,10 @@ byte FontRenderer::textToFont(byte c) {
return map_textToFont[c - 0x80];
}
-void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText, int32 mode) {
+void FontRenderer::renderText(int16 x, int16 y, const Common::String &origText, int32 mode) {
debugC(5, kDebugFont, "renderText(%d, %d, %s, %d)", x, y, origText.c_str(), mode);
- int32 xx, yy;
+ int16 xx, yy;
computeSize(origText, &xx, &yy);
if (mode & 2) {
@@ -83,8 +83,8 @@ void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText,
_vm->addDirtyRect(x, y, x + xx, y + yy);
- int32 curX = x;
- int32 curY = y;
+ int16 curX = x;
+ int16 curY = y;
int32 height = 0;
const byte *text = (const byte *)origText.c_str();
@@ -98,20 +98,20 @@ void FontRenderer::renderText(int32 x, int32 y, const Common::String &origText,
curChar = textToFont(curChar);
_currentFont->drawFontFrame(_vm->getMainSurface(), curChar, curX, curY, _currentFontColor);
curX = curX + _currentFont->getFrameWidth(curChar) - 1;
- height = MAX(height, _currentFont->getFrameHeight(curChar));
+ height = MAX<int32>(height, _currentFont->getFrameHeight(curChar));
}
text++;
}
}
-void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int32 *retY) {
+void FontRenderer::computeSize(const Common::String &origText, int16 *retX, int16 *retY) {
debugC(4, kDebugFont, "computeSize(%s, retX, retY)", origText.c_str());
- int32 lineWidth = 0;
- int32 lineHeight = 0;
- int32 totalHeight = 0;
- int32 totalWidth = 0;
- int32 lastLineHeight = 0;
+ int16 lineWidth = 0;
+ int16 lineHeight = 0;
+ int16 totalHeight = 0;
+ int16 totalWidth = 0;
+ int16 lastLineHeight = 0;
const byte *text = (const byte *)origText.c_str();
while (*text) {
@@ -127,8 +127,8 @@ void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int3
lastLineHeight = 0;
} else {
curChar = textToFont(curChar);
- int32 charWidth = _currentFont->getFrameWidth(curChar) - 1;
- int32 charHeight = _currentFont->getFrameHeight(curChar);
+ int16 charWidth = _currentFont->getFrameWidth(curChar) - 1;
+ int16 charHeight = _currentFont->getFrameHeight(curChar);
lineWidth += charWidth;
lineHeight = MAX(lineHeight, charHeight);
@@ -137,7 +137,7 @@ void FontRenderer::computeSize(const Common::String &origText, int32 *retX, int3
// assume we only need to take the lower bound into
// consideration.
Common::Rect charRect = _currentFont->getFrameRect(curChar);
- lastLineHeight = MAX<int32>(lastLineHeight, charRect.bottom);
+ lastLineHeight = MAX(lastLineHeight, charRect.bottom);
}
text++;
}
@@ -189,7 +189,7 @@ void FontRenderer::setFontColor(int32 fontColor1, int32 fontColor2, int32 fontCo
_currentFontColor[3] = fontColor3;
}
-void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &origText, int32 mode) {
+void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode) {
debugC(5, kDebugFont, "renderMultiLineText(%d, %d, %s, %d)", x, y, origText.c_str(), mode);
// divide the text in several lines
@@ -204,10 +204,10 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o
byte *it = text;
- int32 maxWidth = 0;
- int32 curWidth = 0;
+ int16 maxWidth = 0;
+ int16 curWidth = 0;
- while (1) {
+ while (true) {
byte *lastLine = it;
byte *lastSpace = it;
int32 lastSpaceX = 0;
@@ -223,7 +223,7 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o
curChar = textToFont(curChar);
int width = _currentFont->getFrameWidth(curChar);
- curWidth += MAX<int32>(width - 2, 0);
+ curWidth += MAX(width - 2, 0);
it++;
curLetterNr++;
}
@@ -260,8 +260,8 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o
//numLines++;
// get font height (assumed to be constant)
- int32 height = _currentFont->getHeight();
- int textSize = (height - 2) * numLines;
+ int16 height = _currentFont->getHeight();
+ int32 textSize = (height - 2) * numLines;
y = y - textSize;
if (y < 30)
y = 30;
@@ -278,8 +278,8 @@ void FontRenderer::renderMultiLineText(int32 x, int32 y, const Common::String &o
x = TOON_SCREEN_WIDTH - (maxWidth / 2) - 30;
// we have good coordinates now, we can render the multi line
- int32 curX = x;
- int32 curY = y;
+ int16 curX = x;
+ int16 curY = y;
for (int32 i = 0; i < numLines; i++) {
const byte *line = lines[i];
diff --git a/engines/toon/font.h b/engines/toon/font.h
index 349d9d1ee7..2a46ad3559 100644
--- a/engines/toon/font.h
+++ b/engines/toon/font.h
@@ -33,9 +33,9 @@ public:
~FontRenderer();
void setFont(Animation *font);
- void computeSize(const Common::String &origText, int32 *retX, int32 *retY);
- void renderText(int32 x, int32 y, const Common::String &origText, int32 mode);
- void renderMultiLineText(int32 x, int32 y, const Common::String &origText, int32 mode);
+ void computeSize(const Common::String &origText, int16 *retX, int16 *retY);
+ void renderText(int16 x, int16 y, const Common::String &origText, int32 mode);
+ void renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode);
void setFontColorByCharacter(int32 characterId);
void setFontColor(int32 fontColor1, int32 fontColor2, int32 fontColor3);
protected:
diff --git a/engines/toon/hotspot.cpp b/engines/toon/hotspot.cpp
index ce2cdf1bb9..8b8f0ab577 100644
--- a/engines/toon/hotspot.cpp
+++ b/engines/toon/hotspot.cpp
@@ -57,7 +57,7 @@ void Hotspots::save(Common::WriteStream *Stream) {
}
}
-int32 Hotspots::FindBasedOnCorner(int32 x, int32 y) {
+int32 Hotspots::FindBasedOnCorner(int16 x, int16 y) {
debugC(1, kDebugHotspot, "FindBasedOnCorner(%d, %d)", x, y);
for (int32 i = 0; i < _numItems; i++) {
@@ -73,7 +73,7 @@ int32 Hotspots::FindBasedOnCorner(int32 x, int32 y) {
return -1;
}
-int32 Hotspots::Find(int32 x, int32 y) {
+int32 Hotspots::Find(int16 x, int16 y) {
debugC(6, kDebugHotspot, "Find(%d, %d)", x, y);
int32 priority = -1;
diff --git a/engines/toon/hotspot.h b/engines/toon/hotspot.h
index 70e80046e1..3852e2e42e 100644
--- a/engines/toon/hotspot.h
+++ b/engines/toon/hotspot.h
@@ -51,8 +51,8 @@ public:
~Hotspots();
bool LoadRif(const Common::String &rifName, const Common::String &additionalRifName);
- int32 Find(int32 x, int32 y);
- int32 FindBasedOnCorner(int32 x, int32 y);
+ int32 Find(int16 x, int16 y);
+ int32 FindBasedOnCorner(int16 x, int16 y);
HotspotData *Get(int32 id);
int32 getCount() const { return _numItems; }
diff --git a/engines/toon/movie.cpp b/engines/toon/movie.cpp
index 59ad8484d5..8c85e20f7c 100644
--- a/engines/toon/movie.cpp
+++ b/engines/toon/movie.cpp
@@ -25,6 +25,7 @@
#include "common/keyboard.h"
#include "common/stream.h"
#include "common/system.h"
+#include "graphics/palette.h"
#include "graphics/surface.h"
#include "toon/audio.h"
@@ -33,6 +34,10 @@
namespace Toon {
+ToonstruckSmackerDecoder::ToonstruckSmackerDecoder() : Video::SmackerDecoder() {
+ _lowRes = false;
+}
+
void ToonstruckSmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize) {
debugC(6, kDebugMovie, "handleAudioTrack(%d, %d, %d)", track, chunkSize, unpackedSize);
@@ -40,33 +45,21 @@ void ToonstruckSmackerDecoder::handleAudioTrack(byte track, uint32 chunkSize, ui
/* uint16 width = */ _fileStream->readUint16LE();
uint16 height = _fileStream->readUint16LE();
_lowRes = (height == getHeight() / 2);
- } else
+ } else {
Video::SmackerDecoder::handleAudioTrack(track, chunkSize, unpackedSize);
+ }
}
-bool ToonstruckSmackerDecoder::loadFile(const Common::String &filename) {
- debugC(1, kDebugMovie, "loadFile(%s)", filename.c_str());
+bool ToonstruckSmackerDecoder::loadStream(Common::SeekableReadStream *stream) {
+ if (!Video::SmackerDecoder::loadStream(stream))
+ return false;
_lowRes = false;
-
- if (Video::SmackerDecoder::loadFile(filename)) {
- if (_surface->h == 200) {
- if (_surface) {
- _surface->free();
- delete _surface;
- }
- _surface = new Graphics::Surface();
- _surface->create(640, 400, Graphics::PixelFormat::createFormatCLUT8());
- _header.flags = 4;
- }
-
- return true;
- }
- return false;
+ return true;
}
-ToonstruckSmackerDecoder::ToonstruckSmackerDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : Video::SmackerDecoder(mixer, soundType) {
- _lowRes = false;
+Video::SmackerDecoder::SmackerVideoTrack *ToonstruckSmackerDecoder::createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const {
+ return Video::SmackerDecoder::createVideoTrack(width, height, frameCount, frameRate, (height == 200) ? 4 : flags, signature);
}
// decoder is deallocated with Movie destruction i.e. new ToonstruckSmackerDecoder is needed
@@ -103,46 +96,49 @@ void Movie::play(const Common::String &video, int32 flags) {
bool Movie::playVideo(bool isFirstIntroVideo) {
debugC(1, kDebugMovie, "playVideo(isFirstIntroVideo: %d)", isFirstIntroVideo);
+
+ _decoder->start();
+
while (!_vm->shouldQuit() && !_decoder->endOfVideo()) {
if (_decoder->needsUpdate()) {
const Graphics::Surface *frame = _decoder->decodeNextFrame();
if (frame) {
if (_decoder->isLowRes()) {
// handle manually 2x scaling here
- Graphics::Surface* surf = _vm->getSystem()->lockScreen();
+ Graphics::Surface* surf = _vm->_system->lockScreen();
for (int y = 0; y < frame->h / 2; y++) {
memcpy(surf->getBasePtr(0, y * 2 + 0), frame->getBasePtr(0, y), frame->pitch);
memcpy(surf->getBasePtr(0, y * 2 + 1), frame->getBasePtr(0, y), frame->pitch);
}
- _vm->getSystem()->unlockScreen();
+ _vm->_system->unlockScreen();
} else {
- _vm->getSystem()->copyRectToScreen((byte *)frame->pixels, frame->pitch, 0, 0, frame->w, frame->h);
+ _vm->_system->copyRectToScreen(frame->pixels, frame->pitch, 0, 0, frame->w, frame->h);
// WORKAROUND: There is an encoding glitch in the first intro video. This hides this using the adjacent pixels.
if (isFirstIntroVideo) {
int32 currentFrame = _decoder->getCurFrame();
if (currentFrame >= 956 && currentFrame <= 1038) {
debugC(1, kDebugMovie, "Triggered workaround for glitch in first intro video...");
- _vm->getSystem()->copyRectToScreen((const byte *)frame->getBasePtr(frame->w-188, 123), frame->pitch, frame->w-188, 124, 188, 1);
- _vm->getSystem()->copyRectToScreen((const byte *)frame->getBasePtr(frame->w-188, 126), frame->pitch, frame->w-188, 125, 188, 1);
- _vm->getSystem()->copyRectToScreen((const byte *)frame->getBasePtr(0, 125), frame->pitch, 0, 126, 64, 1);
- _vm->getSystem()->copyRectToScreen((const byte *)frame->getBasePtr(0, 128), frame->pitch, 0, 127, 64, 1);
+ _vm->_system->copyRectToScreen(frame->getBasePtr(frame->w-188, 123), frame->pitch, frame->w-188, 124, 188, 1);
+ _vm->_system->copyRectToScreen(frame->getBasePtr(frame->w-188, 126), frame->pitch, frame->w-188, 125, 188, 1);
+ _vm->_system->copyRectToScreen(frame->getBasePtr(0, 125), frame->pitch, 0, 126, 64, 1);
+ _vm->_system->copyRectToScreen(frame->getBasePtr(0, 128), frame->pitch, 0, 127, 64, 1);
}
}
}
}
- _decoder->setSystemPalette();
- _vm->getSystem()->updateScreen();
+ _vm->_system->getPaletteManager()->setPalette(_decoder->getPalette(), 0, 256);
+ _vm->_system->updateScreen();
}
Common::Event event;
- while (_vm->getSystem()->getEventManager()->pollEvent(event))
+ while (_vm->_system->getEventManager()->pollEvent(event))
if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
_vm->dirtyAllScreen();
return false;
}
- _vm->getSystem()->delayMillis(10);
+ _vm->_system->delayMillis(10);
}
_vm->dirtyAllScreen();
return !_vm->shouldQuit();
diff --git a/engines/toon/movie.h b/engines/toon/movie.h
index 2cd33302f2..e795182cba 100644
--- a/engines/toon/movie.h
+++ b/engines/toon/movie.h
@@ -30,13 +30,17 @@ namespace Toon {
class ToonstruckSmackerDecoder : public Video::SmackerDecoder {
public:
- ToonstruckSmackerDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType = Audio::Mixer::kSFXSoundType);
- virtual ~ToonstruckSmackerDecoder() {}
- void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize);
- bool loadFile(const Common::String &filename);
+ ToonstruckSmackerDecoder();
+
+ bool loadStream(Common::SeekableReadStream *stream);
bool isLowRes() { return _lowRes; }
+
protected:
- bool _lowRes;
+ void handleAudioTrack(byte track, uint32 chunkSize, uint32 unpackedSize);
+ SmackerVideoTrack *createVideoTrack(uint32 width, uint32 height, uint32 frameCount, const Common::Rational &frameRate, uint32 flags, uint32 signature) const;
+
+private:
+ bool _lowRes;
};
class Movie {
diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp
index 2dd5fc45e2..7914aed595 100644
--- a/engines/toon/path.cpp
+++ b/engines/toon/path.cpp
@@ -60,12 +60,12 @@ void PathFindingHeap::clear() {
memset(_data, 0, sizeof(HeapDataGrid) * _size);
}
-void PathFindingHeap::push(int32 x, int32 y, int32 weight) {
+void PathFindingHeap::push(int16 x, int16 y, uint16 weight) {
debugC(2, kDebugPath, "push(%d, %d, %d)", x, y, weight);
if (_count == _size) {
// Increase size by 50%
- int newSize = _size + (_size >> 1) + 1;
+ uint32 newSize = _size + (_size / 2) + 1;
HeapDataGrid *newData;
newData = (HeapDataGrid *)realloc(_data, sizeof(HeapDataGrid) * newSize);
@@ -84,13 +84,13 @@ void PathFindingHeap::push(int32 x, int32 y, int32 weight) {
_data[_count]._weight = weight;
_count++;
- int32 lMax = _count-1;
- int32 lT = 0;
+ uint32 lMax = _count - 1;
+ uint32 lT = 0;
- while (1) {
+ while (true) {
if (lMax <= 0)
break;
- lT = (lMax-1) / 2;
+ lT = (lMax - 1) / 2;
if (_data[lT]._weight > _data[lMax]._weight) {
HeapDataGrid temp;
@@ -104,7 +104,7 @@ void PathFindingHeap::push(int32 x, int32 y, int32 weight) {
}
}
-void PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
+void PathFindingHeap::pop(int16 *x, int16 *y, uint16 *weight) {
debugC(2, kDebugPath, "pop(x, y, weight)");
if (!_count) {
@@ -120,13 +120,13 @@ void PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
if (!_count)
return;
- int32 lMin = 0;
- int32 lT = 0;
+ uint32 lMin = 0;
+ uint32 lT = 0;
- while (1) {
- lT = (lMin << 1) + 1;
+ while (true) {
+ lT = (lMin * 2) + 1;
if (lT < _count) {
- if (lT < _count-1) {
+ if (lT < _count - 1) {
if (_data[lT + 1]._weight < _data[lT]._weight)
lT++;
}
@@ -146,11 +146,11 @@ void PathFindingHeap::pop(int32 *x, int32 *y, int32 *weight) {
}
}
-PathFinding::PathFinding(ToonEngine *vm) : _vm(vm) {
+PathFinding::PathFinding() {
_width = 0;
_height = 0;
_heap = new PathFindingHeap();
- _gridTemp = NULL;
+ _sq = NULL;
_numBlockingRects = 0;
}
@@ -158,17 +158,29 @@ PathFinding::~PathFinding(void) {
if (_heap)
_heap->unload();
delete _heap;
- delete[] _gridTemp;
+ delete[] _sq;
}
-bool PathFinding::isLikelyWalkable(int32 x, int32 y) {
- for (int32 i = 0; i < _numBlockingRects; i++) {
+void PathFinding::init(Picture *mask) {
+ debugC(1, kDebugPath, "init(mask)");
+
+ _width = mask->getWidth();
+ _height = mask->getHeight();
+ _currentMask = mask;
+ _heap->unload();
+ _heap->init(500);
+ delete[] _sq;
+ _sq = new uint16[_width * _height];
+}
+
+bool PathFinding::isLikelyWalkable(int16 x, int16 y) {
+ for (uint8 i = 0; i < _numBlockingRects; i++) {
if (_blockingRects[i][4] == 0) {
if (x >= _blockingRects[i][0] && x <= _blockingRects[i][2] && y >= _blockingRects[i][1] && y < _blockingRects[i][3])
return false;
} else {
- int32 dx = abs(_blockingRects[i][0] - x);
- int32 dy = abs(_blockingRects[i][1] - y);
+ int16 dx = abs(_blockingRects[i][0] - x);
+ int16 dy = abs(_blockingRects[i][1] - y);
if ((dx << 8) / _blockingRects[i][2] < (1 << 8) && (dy << 8) / _blockingRects[i][3] < (1 << 8)) {
return false;
}
@@ -177,15 +189,13 @@ bool PathFinding::isLikelyWalkable(int32 x, int32 y) {
return true;
}
-bool PathFinding::isWalkable(int32 x, int32 y) {
+bool PathFinding::isWalkable(int16 x, int16 y) {
debugC(2, kDebugPath, "isWalkable(%d, %d)", x, y);
- bool maskWalk = (_currentMask->getData(x, y) & 0x1f) > 0;
-
- return maskWalk;
+ return (_currentMask->getData(x, y) & 0x1f) > 0;
}
-int32 PathFinding::findClosestWalkingPoint(int32 xx, int32 yy, int32 *fxx, int32 *fyy, int origX, int origY) {
+bool PathFinding::findClosestWalkingPoint(int16 xx, int16 yy, int16 *fxx, int16 *fyy, int16 origX, int16 origY) {
debugC(1, kDebugPath, "findClosestWalkingPoint(%d, %d, fxx, fyy, %d, %d)", xx, yy, origX, origY);
int32 currentFound = -1;
@@ -197,8 +207,8 @@ int32 PathFinding::findClosestWalkingPoint(int32 xx, int32 yy, int32 *fxx, int32
if (origY == -1)
origY = yy;
- for (int y = 0; y < _height; y++) {
- for (int x = 0; x < _width; x++) {
+ for (int16 y = 0; y < _height; y++) {
+ for (int16 x = 0; x < _width; x++) {
if (isWalkable(x, y) && isLikelyWalkable(x, y)) {
int32 ndist = (x - xx) * (x - xx) + (y - yy) * (y - yy);
int32 ndist2 = (x - origX) * (x - origX) + (y - origY) * (y - origY);
@@ -214,15 +224,15 @@ int32 PathFinding::findClosestWalkingPoint(int32 xx, int32 yy, int32 *fxx, int32
if (currentFound != -1) {
*fxx = currentFound % _width;
*fyy = currentFound / _width;
- return 1;
+ return true;
} else {
*fxx = 0;
*fyy = 0;
- return 0;
+ return false;
}
}
-bool PathFinding::walkLine(int32 x, int32 y, int32 x2, int32 y2) {
+void PathFinding::walkLine(int16 x, int16 y, int16 x2, int16 y2) {
uint32 bx = x << 16;
int32 dx = x2 - x;
uint32 by = y << 16;
@@ -238,24 +248,17 @@ bool PathFinding::walkLine(int32 x, int32 y, int32 x2, int32 y2) {
int32 cdx = (dx << 16) / t;
int32 cdy = (dy << 16) / t;
- int32 i = t;
- _gridPathCount = 0;
- while (i) {
- _tempPathX[i] = bx >> 16;
- _tempPathY[i] = by >> 16;
- _gridPathCount++;
+ _tempPath.clear();
+ for (int32 i = t; i > 0; i--) {
+ _tempPath.insert_at(0, Common::Point(bx >> 16, by >> 16));
bx += cdx;
by += cdy;
- i--;
}
- _tempPathX[0] = x2;
- _tempPathY[0] = y2;
-
- return true;
+ _tempPath.insert_at(0, Common::Point(x2, y2));
}
-bool PathFinding::lineIsWalkable(int32 x, int32 y, int32 x2, int32 y2) {
+bool PathFinding::lineIsWalkable(int16 x, int16 y, int16 x2, int16 y2) {
uint32 bx = x << 16;
int32 dx = x2 - x;
uint32 by = y << 16;
@@ -271,27 +274,26 @@ bool PathFinding::lineIsWalkable(int32 x, int32 y, int32 x2, int32 y2) {
int32 cdx = (dx << 16) / t;
int32 cdy = (dy << 16) / t;
- int32 i = t;
- while (i) {
+ for (int32 i = t; i > 0; i--) {
if (!isWalkable(bx >> 16, by >> 16))
return false;
bx += cdx;
by += cdy;
- i--;
}
return true;
}
-int32 PathFinding::findPath(int32 x, int32 y, int32 destx, int32 desty) {
+
+bool PathFinding::findPath(int16 x, int16 y, int16 destx, int16 desty) {
debugC(1, kDebugPath, "findPath(%d, %d, %d, %d)", x, y, destx, desty);
if (x == destx && y == desty) {
- _gridPathCount = 0;
+ _tempPath.clear();
return true;
}
// ignore path finding if the character is outside the screen
if (x < 0 || x > 1280 || y < 0 || y > 400 || destx < 0 || destx > 1280 || desty < 0 || desty > 400) {
- _gridPathCount = 0;
+ _tempPath.clear();
return true;
}
@@ -302,40 +304,45 @@ int32 PathFinding::findPath(int32 x, int32 y, int32 destx, int32 desty) {
}
// no direct line, we use the standard A* algorithm
- memset(_gridTemp , 0, _width * _height * sizeof(int32));
+ memset(_sq , 0, _width * _height * sizeof(uint16));
_heap->clear();
- int32 curX = x;
- int32 curY = y;
- int32 curWeight = 0;
- int32 *sq = _gridTemp;
+ int16 curX = x;
+ int16 curY = y;
+ uint16 curWeight = 0;
- sq[curX + curY *_width] = 1;
+ _sq[curX + curY *_width] = 1;
_heap->push(curX, curY, abs(destx - x) + abs(desty - y));
- int wei = 0;
while (_heap->getCount()) {
- wei = 0;
_heap->pop(&curX, &curY, &curWeight);
- int curNode = curX + curY * _width;
+ int32 curNode = curX + curY * _width;
- int32 endX = MIN<int32>(curX + 1, _width - 1);
- int32 endY = MIN<int32>(curY + 1, _height - 1);
- int32 startX = MAX<int32>(curX - 1, 0);
- int32 startY = MAX<int32>(curY - 1, 0);
+ int16 endX = MIN<int16>(curX + 1, _width - 1);
+ int16 endY = MIN<int16>(curY + 1, _height - 1);
+ int16 startX = MAX<int16>(curX - 1, 0);
+ int16 startY = MAX<int16>(curY - 1, 0);
bool next = false;
- for (int32 px = startX; px <= endX && !next; px++) {
- for (int py = startY; py <= endY && !next; py++) {
+ for (int16 px = startX; px <= endX && !next; px++) {
+ for (int16 py = startY; py <= endY && !next; py++) {
if (px != curX || py != curY) {
- wei = ((abs(px - curX) + abs(py - curY)));
+ uint16 wei = abs(px - curX) + abs(py - curY);
- int32 curPNode = px + py * _width;
if (isWalkable(px, py)) { // walkable ?
- int sum = sq[curNode] + wei * (1 + (isLikelyWalkable(px, py) ? 5 : 0));
- if (sq[curPNode] > sum || !sq[curPNode]) {
- int newWeight = abs(destx - px) + abs(desty - py);
- sq[curPNode] = sum;
- _heap->push(px, py, sq[curPNode] + newWeight);
+ int32 curPNode = px + py * _width;
+ uint32 sum = _sq[curNode] + wei * (1 + (isLikelyWalkable(px, py) ? 5 : 0));
+ if (sum > (uint32)0xFFFF) {
+ warning("PathFinding::findPath sum exceeds maximum representable!");
+ sum = (uint32)0xFFFF;
+ }
+ if (_sq[curPNode] > sum || !_sq[curPNode]) {
+ _sq[curPNode] = sum;
+ uint32 newWeight = _sq[curPNode] + abs(destx - px) + abs(desty - py);
+ if (newWeight > (uint32)0xFFFF) {
+ warning("PathFinding::findPath newWeight exceeds maximum representable!");
+ newWeight = (uint16)0xFFFF;
+ }
+ _heap->push(px, py, newWeight);
if (!newWeight)
next = true; // we found it !
}
@@ -346,49 +353,37 @@ int32 PathFinding::findPath(int32 x, int32 y, int32 destx, int32 desty) {
}
// let's see if we found a result !
- if (!_gridTemp[destx + desty * _width]) {
+ if (!_sq[destx + desty * _width]) {
// didn't find anything
- _gridPathCount = 0;
+ _tempPath.clear();
return false;
}
curX = destx;
curY = desty;
- int32 *retPathX = (int32 *)malloc(4096 * sizeof(int32));
- int32 *retPathY = (int32 *)malloc(4096 * sizeof(int32));
- if (!retPathX || !retPathY) {
- free(retPathX);
- free(retPathY);
-
- error("[PathFinding::findPath] Cannot allocate pathfinding buffers");
- }
-
- int32 numpath = 0;
+ Common::Array<Common::Point> retPath;
+ retPath.push_back(Common::Point(curX, curY));
- retPathX[numpath] = curX;
- retPathY[numpath] = curY;
- numpath++;
- int32 bestscore = sq[destx + desty * _width];
+ uint16 bestscore = _sq[destx + desty * _width];
- while (1) {
- int32 bestX = -1;
- int32 bestY = -1;
+ bool retVal = false;
+ while (true) {
+ int16 bestX = -1;
+ int16 bestY = -1;
- int32 endX = MIN<int32>(curX + 1, _width - 1);
- int32 endY = MIN<int32>(curY + 1, _height - 1);
- int32 startX = MAX<int32>(curX - 1, 0);
- int32 startY = MAX<int32>(curY - 1, 0);
+ int16 endX = MIN<int16>(curX + 1, _width - 1);
+ int16 endY = MIN<int16>(curY + 1, _height - 1);
+ int16 startX = MAX<int16>(curX - 1, 0);
+ int16 startY = MAX<int16>(curY - 1, 0);
- for (int32 px = startX; px <= endX; px++) {
- for (int32 py = startY; py <= endY; py++) {
+ for (int16 px = startX; px <= endX; px++) {
+ for (int16 py = startY; py <= endY; py++) {
if (px != curX || py != curY) {
- wei = abs(px - curX) + abs(py - curY);
-
- int PNode = px + py * _width;
- if (sq[PNode] && (isWalkable(px, py))) {
- if (sq[PNode] < bestscore) {
- bestscore = sq[PNode];
+ int32 PNode = px + py * _width;
+ if (_sq[PNode] && (isWalkable(px, py))) {
+ if (_sq[PNode] < bestscore) {
+ bestscore = _sq[PNode];
bestX = px;
bestY = py;
}
@@ -397,57 +392,33 @@ int32 PathFinding::findPath(int32 x, int32 y, int32 destx, int32 desty) {
}
}
- if (bestX < 0 || bestY < 0) {
- free(retPathX);
- free(retPathY);
-
- return 0;
- }
+ if (bestX < 0 || bestY < 0)
+ break;
- retPathX[numpath] = bestX;
- retPathY[numpath] = bestY;
- numpath++;
+ retPath.push_back(Common::Point(bestX, bestY));
if ((bestX == x && bestY == y)) {
- _gridPathCount = numpath;
-
- memcpy(_tempPathX, retPathX, sizeof(int32) * numpath);
- memcpy(_tempPathY, retPathY, sizeof(int32) * numpath);
-
- free(retPathX);
- free(retPathY);
+ _tempPath.clear();
+ for (uint32 i = 0; i < retPath.size(); i++)
+ _tempPath.push_back(retPath[i]);
- return true;
+ retVal = true;
+ break;
}
curX = bestX;
curY = bestY;
}
- free(retPathX);
- free(retPathY);
-
- return false;
+ return retVal;
}
-void PathFinding::init(Picture *mask) {
- debugC(1, kDebugPath, "init(mask)");
-
- _width = mask->getWidth();
- _height = mask->getHeight();
- _currentMask = mask;
- _heap->unload();
- _heap->init(500);
- delete[] _gridTemp;
- _gridTemp = new int32[_width*_height];
-}
-
-void PathFinding::resetBlockingRects() {
- _numBlockingRects = 0;
-}
-
-void PathFinding::addBlockingRect(int32 x1, int32 y1, int32 x2, int32 y2) {
+void PathFinding::addBlockingRect(int16 x1, int16 y1, int16 x2, int16 y2) {
debugC(1, kDebugPath, "addBlockingRect(%d, %d, %d, %d)", x1, y1, x2, y2);
+ if (_numBlockingRects >= kMaxBlockingRects) {
+ warning("Maximum number of %d Blocking Rects reached!", kMaxBlockingRects);
+ return;
+ }
_blockingRects[_numBlockingRects][0] = x1;
_blockingRects[_numBlockingRects][1] = y1;
@@ -457,8 +428,12 @@ void PathFinding::addBlockingRect(int32 x1, int32 y1, int32 x2, int32 y2) {
_numBlockingRects++;
}
-void PathFinding::addBlockingEllipse(int32 x1, int32 y1, int32 w, int32 h) {
- debugC(1, kDebugPath, "addBlockingRect(%d, %d, %d, %d)", x1, y1, w, h);
+void PathFinding::addBlockingEllipse(int16 x1, int16 y1, int16 w, int16 h) {
+ debugC(1, kDebugPath, "addBlockingEllipse(%d, %d, %d, %d)", x1, y1, w, h);
+ if (_numBlockingRects >= kMaxBlockingRects) {
+ warning("Maximum number of %d Blocking Rects reached!", kMaxBlockingRects);
+ return;
+ }
_blockingRects[_numBlockingRects][0] = x1;
_blockingRects[_numBlockingRects][1] = y1;
@@ -468,16 +443,4 @@ void PathFinding::addBlockingEllipse(int32 x1, int32 y1, int32 w, int32 h) {
_numBlockingRects++;
}
-int32 PathFinding::getPathNodeCount() const {
- return _gridPathCount;
-}
-
-int32 PathFinding::getPathNodeX(int32 nodeId) const {
- return _tempPathX[ _gridPathCount - nodeId - 1];
-}
-
-int32 PathFinding::getPathNodeY(int32 nodeId) const {
- return _tempPathY[ _gridPathCount - nodeId - 1];
-}
-
} // End of namespace Toon
diff --git a/engines/toon/path.h b/engines/toon/path.h
index 2de58064f0..59f74ef286 100644
--- a/engines/toon/path.h
+++ b/engines/toon/path.h
@@ -23,72 +23,75 @@
#ifndef TOON_PATH_H
#define TOON_PATH_H
+#include "common/array.h"
+#include "common/rect.h"
+
#include "toon/toon.h"
namespace Toon {
// binary heap system for fast A*
-struct HeapDataGrid {
- int16 _x, _y;
- int16 _weight;
-};
-
class PathFindingHeap {
public:
PathFindingHeap();
~PathFindingHeap();
- void push(int32 x, int32 y, int32 weight);
- void pop(int32 *x, int32 *y, int32 *weight);
+ void push(int16 x, int16 y, uint16 weight);
+ void pop(int16 *x, int16 *y, uint16 *weight);
void init(int32 size);
void clear();
void unload();
- int32 getCount() { return _count; }
+ uint32 getCount() { return _count; }
private:
+ struct HeapDataGrid {
+ int16 _x, _y;
+ uint16 _weight;
+ };
+
HeapDataGrid *_data;
- int32 _size;
- int32 _count;
+ uint32 _size;
+ uint32 _count;
};
class PathFinding {
public:
- PathFinding(ToonEngine *vm);
+ PathFinding();
~PathFinding();
- int32 findPath(int32 x, int32 y, int32 destX, int32 destY);
- int32 findClosestWalkingPoint(int32 xx, int32 yy, int32 *fxx, int32 *fyy, int origX = -1, int origY = -1);
- bool isWalkable(int32 x, int32 y);
- bool isLikelyWalkable(int32 x, int32 y);
- bool lineIsWalkable(int32 x, int32 y, int32 x2, int32 y2);
- bool walkLine(int32 x, int32 y, int32 x2, int32 y2);
void init(Picture *mask);
- void resetBlockingRects();
- void addBlockingRect(int32 x1, int32 y1, int32 x2, int32 y2);
- void addBlockingEllipse(int32 x1, int32 y1, int32 w, int32 h);
+ bool findPath(int16 x, int16 y, int16 destX, int16 destY);
+ bool findClosestWalkingPoint(int16 xx, int16 yy, int16 *fxx, int16 *fyy, int16 origX = -1, int16 origY = -1);
+ bool isWalkable(int16 x, int16 y);
+ bool isLikelyWalkable(int16 x, int16 y);
+ bool lineIsWalkable(int16 x, int16 y, int16 x2, int16 y2);
+ void walkLine(int16 x, int16 y, int16 x2, int16 y2);
+
+ void resetBlockingRects() { _numBlockingRects = 0; }
+ void addBlockingRect(int16 x1, int16 y1, int16 x2, int16 y2);
+ void addBlockingEllipse(int16 x1, int16 y1, int16 w, int16 h);
+
+ uint32 getPathNodeCount() const { return _tempPath.size(); }
+ int16 getPathNodeX(uint32 nodeId) const { return _tempPath[(_tempPath.size() - 1) - nodeId].x; }
+ int16 getPathNodeY(uint32 nodeId) const { return _tempPath[(_tempPath.size() - 1) - nodeId].y; }
+
+private:
+ static const uint8 kMaxBlockingRects = 16;
- int32 getPathNodeCount() const;
- int32 getPathNodeX(int32 nodeId) const;
- int32 getPathNodeY(int32 nodeId) const;
-protected:
Picture *_currentMask;
PathFindingHeap *_heap;
- int32 *_gridTemp;
- int32 _width;
- int32 _height;
+ uint16 *_sq;
+ int16 _width;
+ int16 _height;
- int32 _tempPathX[4096];
- int32 _tempPathY[4096];
- int32 _blockingRects[16][5];
- int32 _numBlockingRects;
- int32 _allocatedGridPathCount;
- int32 _gridPathCount;
+ Common::Array<Common::Point> _tempPath;
- ToonEngine *_vm;
+ int16 _blockingRects[kMaxBlockingRects][5];
+ uint8 _numBlockingRects;
};
} // End of namespace Toon
diff --git a/engines/toon/picture.cpp b/engines/toon/picture.cpp
index ff136e5acb..204b0fe576 100644
--- a/engines/toon/picture.cpp
+++ b/engines/toon/picture.cpp
@@ -150,7 +150,7 @@ void Picture::setupPalette() {
_vm->setPaletteEntries(_palette, 1, 128);
}
-void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy) {
+void Picture::drawMask(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy) {
debugC(1, kDebugPicture, "drawMask(surface, %d, %d, %d, %d)", x, y, dx, dy);
for (int32 i = 0; i < 128; i++) {
@@ -161,8 +161,8 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i
_vm->setPaletteEntries(color, i, 1);
}
- int32 rx = MIN(_width, surface.w - x);
- int32 ry = MIN(_height, surface.h - y);
+ int16 rx = MIN<int16>(_width, surface.w - x);
+ int16 ry = MIN<int16>(_height, surface.h - y);
if (rx < 0 || ry < 0)
return;
@@ -172,10 +172,10 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i
uint8 *c = _data + _width * dy + dx;
uint8 *curRow = (uint8 *)surface.pixels + y * destPitch + x;
- for (int32 yy = 0; yy < ry; yy++) {
+ for (int16 yy = 0; yy < ry; yy++) {
uint8 *curSrc = c;
uint8 *cur = curRow;
- for (int32 xx = 0; xx < rx; xx++) {
+ for (int16 xx = 0; xx < rx; xx++) {
//*cur = (*curSrc >> 5) * 8; // & 0x1f;
*cur = (*curSrc & 0x1f) ? 127 : 0;
@@ -187,10 +187,9 @@ void Picture::drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, i
}
}
-void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int32 dx, int32 dy, Common::Array<Common::Rect>& rectArray) {
-
- int32 rx = MIN(_width, surface.w - x);
- int32 ry = MIN(_height, surface.h - y);
+void Picture::drawWithRectList(Graphics::Surface& surface, int16 x, int16 y, int16 dx, int16 dy, Common::Array<Common::Rect>& rectArray) {
+ int16 rx = MIN<int16>(_width, surface.w - x);
+ int16 ry = MIN<int16>(_height, surface.h - y);
if (rx < 0 || ry < 0)
return;
@@ -202,16 +201,16 @@ void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int
Common::Rect rect = rectArray[i];
- int32 fillRx = MIN<int32>(rx, rect.right - rect.left);
- int32 fillRy = MIN<int32>(ry, rect.bottom - rect.top);
+ int16 fillRx = MIN<int32>(rx, rect.right - rect.left);
+ int16 fillRy = MIN<int32>(ry, rect.bottom - rect.top);
uint8 *c = _data + _width * (dy + rect.top) + (dx + rect.left);
uint8 *curRow = (uint8 *)surface.pixels + (y + rect.top) * destPitch + (x + rect.left);
- for (int32 yy = 0; yy < fillRy; yy++) {
+ for (int16 yy = 0; yy < fillRy; yy++) {
uint8 *curSrc = c;
uint8 *cur = curRow;
- for (int32 xx = 0; xx < fillRx; xx++) {
+ for (int16 xx = 0; xx < fillRx; xx++) {
*cur = *curSrc;
curSrc++;
cur++;
@@ -222,11 +221,11 @@ void Picture::drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int
}
}
-void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy) {
+void Picture::draw(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy) {
debugC(6, kDebugPicture, "draw(surface, %d, %d, %d, %d)", x, y, dx, dy);
- int32 rx = MIN(_width, surface.w - x);
- int32 ry = MIN(_height, surface.h - y);
+ int16 rx = MIN<int16>(_width, surface.w - x);
+ int16 ry = MIN<int16>(_height, surface.h - y);
if (rx < 0 || ry < 0)
return;
@@ -236,10 +235,10 @@ void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32
uint8 *c = _data + _width * dy + dx;
uint8 *curRow = (uint8 *)surface.pixels + y * destPitch + x;
- for (int32 yy = 0; yy < ry; yy++) {
+ for (int16 yy = 0; yy < ry; yy++) {
uint8 *curSrc = c;
uint8 *cur = curRow;
- for (int32 xx = 0; xx < rx; xx++) {
+ for (int16 xx = 0; xx < rx; xx++) {
*cur = *curSrc;
curSrc++;
cur++;
@@ -249,7 +248,7 @@ void Picture::draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32
}
}
-uint8 Picture::getData(int32 x, int32 y) {
+uint8 Picture::getData(int16 x, int16 y) {
debugC(6, kDebugPicture, "getData(%d, %d)", x, y);
if (!_data)
@@ -259,7 +258,7 @@ uint8 Picture::getData(int32 x, int32 y) {
}
// use original work from johndoe
-void Picture::floodFillNotWalkableOnMask(int32 x, int32 y) {
+void Picture::floodFillNotWalkableOnMask(int16 x, int16 y) {
debugC(1, kDebugPicture, "floodFillNotWalkableOnMask(%d, %d)", x, y);
// Stack-based floodFill algorithm based on
// http://student.kuleuven.be/~m0216922/CG/files/floodfill.cpp
@@ -292,10 +291,10 @@ void Picture::floodFillNotWalkableOnMask(int32 x, int32 y) {
}
}
-void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable) {
+void Picture::drawLineOnMask(int16 x, int16 y, int16 x2, int16 y2, bool walkable) {
debugC(1, kDebugPicture, "drawLineOnMask(%d, %d, %d, %d, %d)", x, y, x2, y2, (walkable) ? 1 : 0);
- static int32 lastX = 0;
- static int32 lastY = 0;
+ static int16 lastX = 0;
+ static int16 lastY = 0;
if (x == -1) {
x = lastX;
@@ -303,12 +302,12 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable
}
uint32 bx = x << 16;
- int32 dx = x2 - x;
+ int16 dx = x2 - x;
uint32 by = y << 16;
- int32 dy = y2 - y;
- uint32 adx = abs(dx);
- uint32 ady = abs(dy);
- int32 t = 0;
+ int16 dy = y2 - y;
+ uint16 adx = abs(dx);
+ uint16 ady = abs(dy);
+ int16 t = 0;
if (adx <= ady)
t = ady;
else
@@ -317,9 +316,7 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable
int32 cdx = (dx << 16) / t;
int32 cdy = (dy << 16) / t;
- int32 i = t;
- while (i) {
-
+ for (int16 i = t; i > 0; i--) {
int32 rx = bx >> 16;
int32 ry = by >> 16;
@@ -337,7 +334,6 @@ void Picture::drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable
bx += cdx;
by += cdy;
- i--;
}
}
} // End of namespace Toon
diff --git a/engines/toon/picture.h b/engines/toon/picture.h
index 460c5b58a2..5e79612a39 100644
--- a/engines/toon/picture.h
+++ b/engines/toon/picture.h
@@ -33,25 +33,27 @@
namespace Toon {
class ToonEngine;
-class Picture {
+class Picture {
public:
Picture(ToonEngine *vm);
~Picture();
+
bool loadPicture(const Common::String &file);
void setupPalette();
- void draw(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy);
- void drawWithRectList(Graphics::Surface& surface, int32 x, int32 y, int32 dx, int32 dy, Common::Array<Common::Rect>& rectArray);
- void drawMask(Graphics::Surface &surface, int32 x, int32 y, int32 dx, int32 dy);
- void drawLineOnMask(int32 x, int32 y, int32 x2, int32 y2, bool walkable);
- void floodFillNotWalkableOnMask(int32 x, int32 y);
- uint8 getData(int32 x, int32 y);
+ void draw(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy);
+ void drawWithRectList(Graphics::Surface& surface, int16 x, int16 y, int16 dx, int16 dy, Common::Array<Common::Rect>& rectArray);
+ void drawMask(Graphics::Surface &surface, int16 x, int16 y, int16 dx, int16 dy);
+ void drawLineOnMask(int16 x, int16 y, int16 x2, int16 y2, bool walkable);
+ void floodFillNotWalkableOnMask(int16 x, int16 y);
+ uint8 getData(int16 x, int16 y);
uint8 *getDataPtr() { return _data; }
- int32 getWidth() const { return _width; }
- int32 getHeight() const { return _height; }
+ int16 getWidth() const { return _width; }
+ int16 getHeight() const { return _height; }
+
protected:
- int32 _width;
- int32 _height;
+ int16 _width;
+ int16 _height;
uint8 *_data;
uint8 *_palette; // need to be copied at 3-387
int32 _paletteEntries;
diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp
index e9b7534198..1fa4058114 100644
--- a/engines/toon/script_func.cpp
+++ b/engines/toon/script_func.cpp
@@ -564,9 +564,9 @@ int32 ScriptFunc::sys_Cmd_Exit_Conversation(EMCState *state) {
int32 ScriptFunc::sys_Cmd_Set_Mouse_Pos(EMCState *state) {
if (_vm->state()->_inCloseUp) {
- _vm->getSystem()->warpMouse(stackPos(0), stackPos(1));
+ _vm->_system->warpMouse(stackPos(0), stackPos(1));
} else {
- _vm->getSystem()->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1));
+ _vm->_system->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1));
}
return 0;
}
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 657e18635f..9fd8415676 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -51,7 +51,7 @@ void ToonEngine::init() {
_currentScriptRegion = 0;
_resources = new Resources(this);
_animationManager = new AnimationManager(this);
- _moviePlayer = new Movie(this, new ToonstruckSmackerDecoder(_mixer));
+ _moviePlayer = new Movie(this, new ToonstruckSmackerDecoder());
_hotspots = new Hotspots(this);
_mainSurface = new Graphics::Surface();
@@ -100,7 +100,7 @@ void ToonEngine::init() {
syncSoundSettings();
- _pathFinding = new PathFinding(this);
+ _pathFinding = new PathFinding();
resources()->openPackage("LOCAL.PAK");
resources()->openPackage("ONETIME.PAK");
@@ -168,7 +168,7 @@ void ToonEngine::waitForScriptStep() {
// Wait after a specified number of script steps when executing a script
// to lower CPU usage
if (++_scriptStep >= 40) {
- g_system->delayMillis(1);
+ _system->delayMillis(1);
_scriptStep = 0;
}
}
@@ -820,7 +820,6 @@ Common::Error ToonEngine::run() {
ToonEngine::ToonEngine(OSystem *syst, const ADGameDescription *gameDescription)
: Engine(syst), _gameDescription(gameDescription),
_language(gameDescription->language), _rnd("toon") {
- _system = syst;
_tickLength = 16;
_currentPicture = NULL;
_inventoryPicture = NULL;
@@ -1224,7 +1223,7 @@ void ToonEngine::loadScene(int32 SceneId, bool forGameLoad) {
_script->init(&_sceneAnimationScripts[i]._state, _sceneAnimationScripts[i]._data);
if (!forGameLoad) {
_script->start(&_sceneAnimationScripts[i]._state, 9 + i);
- _sceneAnimationScripts[i]._lastTimer = getSystem()->getMillis();
+ _sceneAnimationScripts[i]._lastTimer = _system->getMillis();
_sceneAnimationScripts[i]._frozen = false;
_sceneAnimationScripts[i]._frozenForConversation = false;
}
@@ -1488,7 +1487,7 @@ void ToonEngine::clickEvent() {
}
if (!currentHot) {
- int32 xx, yy;
+ int16 xx, yy;
if (_gameState->_inCutaway || _gameState->_inInventory || _gameState->_inCloseUp)
return;
@@ -1588,12 +1587,12 @@ void ToonEngine::clickEvent() {
}
void ToonEngine::selectHotspot() {
- int32 x1 = 0;
- int32 x2 = 0;
- int32 y1 = 0;
- int32 y2 = 0;
+ int16 x1 = 0;
+ int16 x2 = 0;
+ int16 y1 = 0;
+ int16 y2 = 0;
- int32 mouseX = _mouseX;
+ int16 mouseX = _mouseX;
if (_gameState->_inCutaway)
mouseX += TOON_BACKBUFFER_WIDTH;
@@ -1693,7 +1692,6 @@ void ToonEngine::selectHotspot() {
}
void ToonEngine::exitScene() {
-
fadeOut(5);
// disable all scene animation
@@ -2831,7 +2829,6 @@ void ToonEngine::playSoundWrong() {
}
void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) {
-
if (characterId < 0)
characterId = 0;
@@ -2852,8 +2849,8 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) {
}
} else if (characterId == 1) {
// flux
- int32 x = _flux->getX();
- int32 y = _flux->getY();
+ int16 x = _flux->getX();
+ int16 y = _flux->getY();
if (x >= _gameState->_currentScrollValue && x <= _gameState->_currentScrollValue + TOON_SCREEN_WIDTH) {
if (!_gameState->_inCutaway) {
*retX = x;
@@ -2885,7 +2882,7 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) {
if (character && !_gameState->_inCutaway) {
if (character->getAnimationInstance()) {
if (character->getX() >= _gameState->_currentScrollValue && character->getX() <= _gameState->_currentScrollValue + TOON_SCREEN_WIDTH) {
- int32 x1, y1, x2, y2;
+ int16 x1, y1, x2, y2;
character->getAnimationInstance()->getRect(&x1, &y1, &x2, &y2);
*retX = (x1 + x2) / 2;
*retY = y1;
@@ -2896,7 +2893,6 @@ void ToonEngine::getTextPosition(int32 characterId, int32 *retX, int32 *retY) {
}
Character *ToonEngine::getCharacterById(int32 charId) {
-
for (int32 i = 0; i < 8; i++) {
if (_characters[i] && _characters[i]->getId() == charId)
return _characters[i];
@@ -2955,15 +2951,12 @@ Common::String ToonEngine::getSavegameName(int nr) {
}
bool ToonEngine::saveGame(int32 slot, const Common::String &saveGameDesc) {
- const EnginePlugin *plugin = NULL;
int16 savegameId;
Common::String savegameDescription;
- EngineMan.findGame(_gameDescription->gameid, &plugin);
if (slot == -1) {
- GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save");
- dialog->setSaveMode(true);
- savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Save game:", "Save", true);
+ savegameId = dialog->runModalWithCurrentTarget();
savegameDescription = dialog->getResultString();
delete dialog;
} else {
@@ -2979,8 +2972,7 @@ bool ToonEngine::saveGame(int32 slot, const Common::String &saveGameDesc) {
return false; // dialog aborted
Common::String savegameFile = getSavegameName(savegameId);
- Common::SaveFileManager *saveMan = g_system->getSavefileManager();
- Common::OutSaveFile *saveFile = saveMan->openForSaving(savegameFile);
+ Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(savegameFile);
if (!saveFile)
return false;
@@ -3052,14 +3044,11 @@ bool ToonEngine::saveGame(int32 slot, const Common::String &saveGameDesc) {
}
bool ToonEngine::loadGame(int32 slot) {
- const EnginePlugin *plugin = NULL;
int16 savegameId;
- EngineMan.findGame(_gameDescription->gameid, &plugin);
if (slot == -1) {
- GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore");
- dialog->setSaveMode(false);
- savegameId = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+ GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser("Restore game:", "Restore", false);
+ savegameId = dialog->runModalWithCurrentTarget();
delete dialog;
} else {
savegameId = slot;
@@ -3068,8 +3057,7 @@ bool ToonEngine::loadGame(int32 slot) {
return false; // dialog aborted
Common::String savegameFile = getSavegameName(savegameId);
- Common::SaveFileManager *saveMan = g_system->getSavefileManager();
- Common::InSaveFile *loadFile = saveMan->openForLoading(savegameFile);
+ Common::InSaveFile *loadFile = _saveFileMan->openForLoading(savegameFile);
if (!loadFile)
return false;
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index 540f3e403b..d40c489011 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -289,10 +289,6 @@ public:
return _oldTimer2;
}
- OSystem *getSystem() {
- return _system;
- }
-
AudioManager *getAudioManager() {
return _audioManager;
}
@@ -340,7 +336,6 @@ public:
void clearDirtyRects();
protected:
- OSystem *_system;
int32 _tickLength;
Resources *_resources;
TextResource *_genericTexts;