aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/console.cpp3
-rw-r--r--engines/sci/engine/kgraphics.cpp6
-rw-r--r--engines/sci/engine/state.h6
-rw-r--r--engines/sci/graphics/animate.cpp122
-rw-r--r--engines/sci/graphics/animate.h15
-rw-r--r--engines/sci/graphics/gui.cpp93
-rw-r--r--engines/sci/graphics/gui.h7
-rw-r--r--engines/sci/sci.cpp2
8 files changed, 134 insertions, 120 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index ab4d13e630..ab6daa2847 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -45,6 +45,7 @@
#include "sci/graphics/gui.h"
#include "sci/graphics/gui32.h"
#include "sci/graphics/cursor.h"
+#include "sci/graphics/screen.h"
#include "sci/parser/vocabulary.h"
@@ -1073,7 +1074,7 @@ bool Console::cmdDrawPic(int argc, const char **argv) {
uint16 resourceId = atoi(argv[1]);
_vm->_gamestate->_gui->drawPicture(resourceId, 100, false, false, false, 0);
- _vm->_gamestate->_gui->animateShowPic();
+ _vm->_gamestate->_screen->copyToScreen();
return true;
}
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 782072a229..3b99a9b870 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -973,7 +973,7 @@ reg_t kAddToPic(EngineState *s, int argc, reg_t *argv) {
case 1:
if (argv[0].isNull())
return s->r_acc;
- s->_gui->addToPicList(argv[0], argc, argv);
+ s->_gfxAnimate->kernelAddToPicList(argv[0], argc, argv);
break;
case 7:
viewId = argv[0].toUint16();
@@ -983,7 +983,7 @@ reg_t kAddToPic(EngineState *s, int argc, reg_t *argv) {
topPos = argv[4].toSint16();
priority = argv[5].toSint16();
control = argv[6].toSint16();
- s->_gui->addToPicView(viewId, loopNo, celNo, leftPos, topPos, priority, control);
+ s->_gfxAnimate->kernelAddToPicView(viewId, loopNo, celNo, leftPos, topPos, priority, control);
break;
default:
error("kAddToPic with unsupported parameter count %d", argc);
@@ -1102,7 +1102,7 @@ reg_t kAnimate(EngineState *s, int argc, reg_t *argv) {
// Take care of incoming events (kAnimate is called semi-regularly)
process_sound_events(s);
#endif
- s->_gui->animate(castListReference, cycle, argc, argv);
+ s->_gfxAnimate->kernelAnimate(castListReference, cycle, argc, argv);
return s->r_acc;
}
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index 31c46c4447..ad70669f7f 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -51,7 +51,9 @@ namespace Sci {
class SciEvent;
class Menubar;
+class GfxAnimate;
class GfxPorts;
+class Screen;
class SciGui;
class Cursor;
class MessageState;
@@ -148,7 +150,9 @@ public:
/* Non-VM information */
- GfxPorts *_gfxPorts; // Port managment for 16-bit gui
+ GfxAnimate *_gfxAnimate; // Animate for 16-bit gfx
+ GfxPorts *_gfxPorts; // Port managment for 16-bit gfx
+ Screen *_screen; // gfx screen
SciGui *_gui; /* Currently active Gui */
#ifdef ENABLE_SCI32
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp
index 55cccdc3a7..57b9226c02 100644
--- a/engines/sci/graphics/animate.cpp
+++ b/engines/sci/graphics/animate.cpp
@@ -32,6 +32,7 @@
#include "sci/engine/selector.h"
#include "sci/engine/vm.h"
#include "sci/graphics/cache.h"
+#include "sci/graphics/cursor.h"
#include "sci/graphics/ports.h"
#include "sci/graphics/paint16.h"
#include "sci/graphics/view.h"
@@ -41,17 +42,17 @@
namespace Sci {
-SciGuiAnimate::SciGuiAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, Screen *screen, SciPalette *palette)
- : _s(state), _cache(cache), _ports(ports), _paint16(paint16), _screen(screen), _palette(palette) {
+GfxAnimate::GfxAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, Screen *screen, SciPalette *palette, Cursor *cursor, Transitions *transitions)
+ : _s(state), _cache(cache), _ports(ports), _paint16(paint16), _screen(screen), _palette(palette), _cursor(cursor), _transitions(transitions) {
init();
}
-SciGuiAnimate::~SciGuiAnimate() {
+GfxAnimate::~GfxAnimate() {
free(_listData);
free(_lastCastData);
}
-void SciGuiAnimate::init() {
+void GfxAnimate::init() {
_listData = NULL;
_listCount = 0;
_lastCastData = NULL;
@@ -67,11 +68,11 @@ void SciGuiAnimate::init() {
_ignoreFastCast = true;
}
-void SciGuiAnimate::disposeLastCast() {
+void GfxAnimate::disposeLastCast() {
_lastCastCount = 0;
}
-bool SciGuiAnimate::invoke(List *list, int argc, reg_t *argv) {
+bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) {
reg_t curAddress = list->first;
Node *curNode = _s->_segMan->lookupNode(curAddress);
reg_t curObject;
@@ -108,7 +109,7 @@ bool sortHelper(const AnimateEntry* entry1, const AnimateEntry* entry2) {
return (entry1->y == entry2->y) ? (entry1->z < entry2->z) : (entry1->y < entry2->y);
}
-void SciGuiAnimate::makeSortedList(List *list) {
+void GfxAnimate::makeSortedList(List *list) {
reg_t curAddress = list->first;
Node *curNode = _s->_segMan->lookupNode(curAddress);
reg_t curObject;
@@ -199,7 +200,7 @@ void SciGuiAnimate::makeSortedList(List *list) {
Common::sort(_list.begin(), _list.end(), sortHelper);
}
-void SciGuiAnimate::fill(byte &old_picNotValid) {
+void GfxAnimate::fill(byte &old_picNotValid) {
reg_t curObject;
AnimateEntry *listEntry;
uint16 signal;
@@ -262,7 +263,7 @@ void SciGuiAnimate::fill(byte &old_picNotValid) {
}
}
-void SciGuiAnimate::update() {
+void GfxAnimate::update() {
reg_t curObject;
AnimateEntry *listEntry;
uint16 signal;
@@ -367,7 +368,7 @@ void SciGuiAnimate::update() {
}
}
-void SciGuiAnimate::drawCels() {
+void GfxAnimate::drawCels() {
reg_t curObject;
AnimateEntry *listEntry;
AnimateEntry *lastCastEntry = _lastCastData;
@@ -405,7 +406,7 @@ void SciGuiAnimate::drawCels() {
}
}
-void SciGuiAnimate::updateScreen(byte oldPicNotValid) {
+void GfxAnimate::updateScreen(byte oldPicNotValid) {
reg_t curObject;
AnimateEntry *listEntry;
uint16 signal;
@@ -454,7 +455,7 @@ void SciGuiAnimate::updateScreen(byte oldPicNotValid) {
// _screen->copyToScreen();
}
-void SciGuiAnimate::restoreAndDelete(int argc, reg_t *argv) {
+void GfxAnimate::restoreAndDelete(int argc, reg_t *argv) {
reg_t curObject;
AnimateEntry *listEntry;
uint16 signal;
@@ -495,7 +496,7 @@ void SciGuiAnimate::restoreAndDelete(int argc, reg_t *argv) {
}
}
-void SciGuiAnimate::reAnimate(Common::Rect rect) {
+void GfxAnimate::reAnimate(Common::Rect rect) {
AnimateEntry *lastCastEntry;
uint16 lastCastCount;
@@ -542,7 +543,7 @@ void SciGuiAnimate::reAnimate(Common::Rect rect) {
*/
}
-void SciGuiAnimate::addToPicDrawCels() {
+void GfxAnimate::addToPicDrawCels() {
reg_t curObject;
AnimateEntry *listEntry;
View *view = NULL;
@@ -574,7 +575,7 @@ void SciGuiAnimate::addToPicDrawCels() {
}
}
-void SciGuiAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) {
+void GfxAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) {
View *view = _cache->getView(viewId);
Common::Rect celRect;
@@ -583,4 +584,95 @@ void SciGuiAnimate::addToPicDrawView(GuiResourceId viewId, int16 loopNo, int16 c
_paint16->drawCel(view, loopNo, celNo, celRect, priority, 0);
}
+
+void GfxAnimate::animateShowPic() {
+ Port *picPort = _ports->_picWind;
+ Common::Rect picRect = picPort->rect;
+ bool previousCursorState = _cursor->isVisible();
+
+ if (previousCursorState)
+ _cursor->hide();
+ // Adjust picRect to become relative to screen
+ picRect.translate(picPort->left, picPort->top);
+ _transitions->doit(picRect);
+ if (previousCursorState)
+ _cursor->show();
+
+ // We set SCI1.1 priority band information here
+ _ports->priorityBandsRecall();
+}
+
+void GfxAnimate::kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
+ byte old_picNotValid = _screen->_picNotValid;
+
+ if (listReference.isNull()) {
+ disposeLastCast();
+ if (_screen->_picNotValid)
+ animateShowPic();
+ return;
+ }
+
+ List *list = _s->_segMan->lookupList(listReference);
+ if (!list)
+ error("kAnimate called with non-list as parameter");
+
+ if (cycle) {
+ if (!invoke(list, argc, argv))
+ return;
+ }
+
+ Port *oldPort = _ports->setPort((Port *)_ports->_picWind);
+ disposeLastCast();
+
+ makeSortedList(list);
+ fill(old_picNotValid);
+
+ if (old_picNotValid) {
+ _ports->beginUpdate(_ports->_picWind);
+ update();
+ _ports->endUpdate(_ports->_picWind);
+ }
+
+ drawCels();
+
+ if (_screen->_picNotValid)
+ animateShowPic();
+
+ updateScreen(old_picNotValid);
+ restoreAndDelete(argc, argv);
+
+ if (getLastCastCount() > 1)
+ _s->_throttleTrigger = true;
+
+ _ports->setPort(oldPort);
+}
+
+void GfxAnimate::addToPicSetPicNotValid() {
+ if (getSciVersion() <= SCI_VERSION_1_EARLY)
+ _screen->_picNotValid = 1;
+ else
+ _screen->_picNotValid = 2;
+}
+
+void GfxAnimate::kernelAddToPicList(reg_t listReference, int argc, reg_t *argv) {
+ List *list;
+
+ _ports->setPort((Port *)_ports->_picWind);
+
+ list = _s->_segMan->lookupList(listReference);
+ if (!list)
+ error("kAddToPic called with non-list as parameter");
+
+ makeSortedList(list);
+ addToPicDrawCels();
+
+ addToPicSetPicNotValid();
+}
+
+void GfxAnimate::kernelAddToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) {
+ _ports->setPort((Port *)_ports->_picWind);
+ addToPicDrawView(viewId, loopNo, celNo, leftPos, topPos, priority, control);
+ addToPicSetPicNotValid();
+}
+
} // End of namespace Sci
diff --git a/engines/sci/graphics/animate.h b/engines/sci/graphics/animate.h
index 8dae1a6d46..fccd96391c 100644
--- a/engines/sci/graphics/animate.h
+++ b/engines/sci/graphics/animate.h
@@ -62,10 +62,10 @@ class GfxPaint16;
class Screen;
class SciPalette;
class Transitions;
-class SciGuiAnimate {
+class GfxAnimate {
public:
- SciGuiAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, Screen *screen, SciPalette *palette);
- ~SciGuiAnimate();
+ GfxAnimate(EngineState *state, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, Screen *screen, SciPalette *palette, Cursor *cursor, Transitions *transitions);
+ ~GfxAnimate();
// FIXME: Don't store EngineState
void resetEngineState(EngineState *newState) { _s = newState; }
@@ -84,15 +84,24 @@ public:
uint16 getLastCastCount() { return _lastCastCount; };
+ virtual void kernelAnimate(reg_t listReference, bool cycle, int argc, reg_t *argv);
+ virtual void kernelAddToPicList(reg_t listReference, int argc, reg_t *argv);
+ virtual void kernelAddToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control);
+
private:
void init();
+ void addToPicSetPicNotValid();
+ void animateShowPic();
+
EngineState *_s;
GfxCache *_cache;
GfxPorts *_ports;
GfxPaint16 *_paint16;
Screen *_screen;
SciPalette *_palette;
+ Cursor *_cursor;
+ Transitions *_transitions;
uint16 _listCount;
AnimateEntry *_listData;
diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp
index 633617eead..a122e2180a 100644
--- a/engines/sci/graphics/gui.cpp
+++ b/engines/sci/graphics/gui.cpp
@@ -57,7 +57,8 @@ SciGui::SciGui(EngineState *state, Screen *screen, SciPalette *palette, Cursor *
_compare = new GfxCompare(_s->_segMan, _s->_kernel, _cache, _screen);
_paint16 = new GfxPaint16(_s->resMan, _s->_segMan, _s->_kernel, _cache, _ports, _screen, _palette);
_transitions = new Transitions(this, _screen, _palette, _s->resMan->isVGA());
- _animate = new SciGuiAnimate(_s, _cache, _ports, _paint16, _screen, _palette);
+ _animate = new GfxAnimate(_s, _cache, _ports, _paint16, _screen, _palette, _cursor, _transitions);
+ _s->_gfxAnimate = _animate;
_text = new Text(_s->resMan, _ports, _paint16, _screen);
_controls = new Controls(_s->_segMan, _ports, _paint16, _text);
_menu = new Menu(_s->_event, _s->_segMan, this, _ports, _paint16, _text, _screen, _cursor);
@@ -572,96 +573,6 @@ uint16 SciGui::onControl(byte screenMask, Common::Rect rect) {
return result;
}
-void SciGui::animateShowPic() {
- Port *picPort = _ports->_picWind;
- Common::Rect picRect = picPort->rect;
- bool previousCursorState = _cursor->isVisible();
-
- if (previousCursorState)
- _cursor->hide();
- // Adjust picRect to become relative to screen
- picRect.translate(picPort->left, picPort->top);
- _transitions->doit(picRect);
- if (previousCursorState)
- _cursor->show();
-
- // We set SCI1.1 priority band information here
- _ports->priorityBandsRecall();
-}
-
-void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
- byte old_picNotValid = _screen->_picNotValid;
-
- if (listReference.isNull()) {
- _animate->disposeLastCast();
- if (_screen->_picNotValid)
- animateShowPic();
- return;
- }
-
- List *list = _s->_segMan->lookupList(listReference);
- if (!list)
- error("kAnimate called with non-list as parameter");
-
- if (cycle) {
- if (!_animate->invoke(list, argc, argv))
- return;
- }
-
- Port *oldPort = _ports->setPort((Port *)_ports->_picWind);
- _animate->disposeLastCast();
-
- _animate->makeSortedList(list);
- _animate->fill(old_picNotValid);
-
- if (old_picNotValid) {
- _ports->beginUpdate(_ports->_picWind);
- _animate->update();
- _ports->endUpdate(_ports->_picWind);
- }
-
- _animate->drawCels();
-
- if (_screen->_picNotValid)
- animateShowPic();
-
- _animate->updateScreen(old_picNotValid);
- _animate->restoreAndDelete(argc, argv);
-
- if (_animate->getLastCastCount() > 1)
- _s->_throttleTrigger = true;
-
- _ports->setPort(oldPort);
-}
-
-void SciGui::addToPicSetPicNotValid() {
- if (getSciVersion() <= SCI_VERSION_1_EARLY)
- _screen->_picNotValid = 1;
- else
- _screen->_picNotValid = 2;
-}
-
-void SciGui::addToPicList(reg_t listReference, int argc, reg_t *argv) {
- List *list;
-
- _ports->setPort((Port *)_ports->_picWind);
-
- list = _s->_segMan->lookupList(listReference);
- if (!list)
- error("kAddToPic called with non-list as parameter");
-
- _animate->makeSortedList(list);
- _animate->addToPicDrawCels();
-
- addToPicSetPicNotValid();
-}
-
-void SciGui::addToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) {
- _ports->setPort((Port *)_ports->_picWind);
- _animate->addToPicDrawView(viewId, loopNo, celNo, leftPos, topPos, priority, control);
- addToPicSetPicNotValid();
-}
-
void SciGui::setNowSeen(reg_t objectReference) {
_compare->SetNowSeen(objectReference);
}
diff --git a/engines/sci/graphics/gui.h b/engines/sci/graphics/gui.h
index a92af7a99b..184e2607d7 100644
--- a/engines/sci/graphics/gui.h
+++ b/engines/sci/graphics/gui.h
@@ -123,10 +123,6 @@ public:
virtual void shakeScreen(uint16 shakeCount, uint16 directions);
virtual uint16 onControl(byte screenMask, Common::Rect rect);
- virtual void animateShowPic();
- virtual void animate(reg_t listReference, bool cycle, int argc, reg_t *argv);
- virtual void addToPicList(reg_t listReference, int argc, reg_t *argv);
- virtual void addToPicView(GuiResourceId viewId, int16 loopNo, int16 celNo, int16 leftPos, int16 topPos, int16 priority, int16 control);
virtual void setNowSeen(reg_t objectReference);
virtual bool canBeHere(reg_t curObject, reg_t listReference);
virtual bool isItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position);
@@ -177,13 +173,12 @@ protected:
private:
virtual void initPriorityBands();
- virtual void addToPicSetPicNotValid();
virtual int getControlPicNotValid();
static void palVaryCallback(void *refCon);
void doPalVary();
AudioPlayer *_audio;
- SciGuiAnimate *_animate;
+ GfxAnimate *_animate;
Controls *_controls;
Menu *_menu;
Text *_text;
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index 81fc492ac5..4419ab6149 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -172,6 +172,7 @@ Common::Error SciEngine::run() {
#ifdef ENABLE_SCI32
if (getSciVersion() >= SCI_VERSION_2) {
_gamestate->_gfxPorts = 0;
+ _gamestate->_gfxAnimate = 0;
_gamestate->_gui = 0;
_gamestate->_gui32 = new SciGui32(_gamestate, screen, palette, cursor);
} else {
@@ -183,6 +184,7 @@ Common::Error SciEngine::run() {
_gamestate->_ports = new GfxPorts(_segMan, _screen);
_gamestate->_gui = new SciGui(_gamestate, screen, palette, cursor, _audio);
#endif
+ _gamestate->_screen = screen;
if (game_init(_gamestate)) { /* Initialize */
warning("Game initialization failed: Aborting...");