aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gui/gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gui/gui.cpp')
-rw-r--r--engines/sci/gui/gui.cpp91
1 files changed, 66 insertions, 25 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp
index 2022c9c06c..33189cd015 100644
--- a/engines/sci/gui/gui.cpp
+++ b/engines/sci/gui/gui.cpp
@@ -23,6 +23,7 @@
*
*/
+#include "common/timer.h"
#include "common/util.h"
#include "sci/sci.h"
@@ -30,6 +31,7 @@
#include "sci/tools.h"
#include "sci/gui/gui.h"
#include "sci/gui/gui_screen.h"
+#include "sci/gui/gui_palette.h"
#include "sci/gui/gui_gfx.h"
#include "sci/gui/gui_windowmgr.h"
#include "sci/gui/gui_view.h"
@@ -40,7 +42,11 @@ namespace Sci {
SciGui::SciGui(OSystem *system, EngineState *state, SciGuiScreen *screen)
: _system(system), _s(state), _screen(screen) {
- _gfx = new SciGuiGfx(_system, _s, _screen);
+ _picNotValid = 0;
+ _sysTicks = 0;
+
+ _palette = new SciGuiPalette(_system, _s, this, _screen);
+ _gfx = new SciGuiGfx(_system, _s, _screen, _palette);
_windowMgr = new SciGuiWindowMgr(_s, _gfx);
}
@@ -48,22 +54,30 @@ SciGui::SciGui() {
}
SciGui::~SciGui() {
+ _system->getTimerManager()->removeTimerProc(&timerHandler);
+}
+
+void SciGui::init(bool usesOldGfxFunctions) {
+ _sysSpeed = 1000000 / 60;
+ Common::TimerManager *tm = _system->getTimerManager();
+ tm->removeTimerProc(&timerHandler);
+ tm->installTimerProc(&timerHandler, _sysSpeed, this);
}
-void SciGui::init(bool oldGfxFunctions) {
- _usesOldGfxFunctions = oldGfxFunctions;
+void SciGui::timerHandler(void *ref) {
+ ((SciGui *)ref)->_sysTicks++;
}
int16 SciGui::getTimeTicks() {
- return _gfx->_sysTicks;
+ return _sysTicks;
}
void SciGui::wait(int16 ticks) {
- uint32 waitto = _gfx->_sysTicks + ticks;
+ uint32 waitto = _sysTicks + ticks;
do {
//eventMgr->pollEvents();
- _system->delayMillis(_gfx->_sysSpeed >> 11);
- } while (_gfx->_sysTicks < waitto);
+ _system->delayMillis(_sysSpeed >> 11);
+ } while (_sysTicks < waitto);
}
void SciGui::setPort(uint16 portPtr) {
@@ -256,12 +270,12 @@ void SciGui::drawPicture(GuiResourceId pictureId, uint16 style, uint16 flags, in
_screen->copyToScreen();
_gfx->SetPort(oldPort);
- _gfx->_picNotValid = true;
+ _picNotValid = true;
}
void SciGui::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo) {
_gfx->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo);
- _gfx->setScreenPalette(&_screen->_sysPalette);
+ _palette->setOnScreen();
_screen->copyToScreen();
}
@@ -329,22 +343,22 @@ void SciGui::graphRestoreBox(reg_t handle) {
}
void SciGui::paletteSet(int resourceNo, int flags) {
- _gfx->SetResPalette(resourceNo, flags);
+ _palette->setFromResource(resourceNo, flags);
}
int16 SciGui::paletteFind(int r, int g, int b) {
- return _gfx->MatchColor(&_screen->_sysPalette, r, g, b) & 0xFF;
+ return _palette->matchColor(&_palette->_sysPalette, r, g, b) & 0xFF;
}
void SciGui::paletteSetIntensity(int fromColor, int toColor, int intensity, bool setPalette) {
- _gfx->PaletteSetIntensity(fromColor, toColor, intensity, &_screen->_sysPalette);
+ _palette->setIntensity(fromColor, toColor, intensity, &_palette->_sysPalette);
if (setPalette) {
- _gfx->setScreenPalette(&_screen->_sysPalette);
+ _palette->setOnScreen();
}
}
void SciGui::paletteAnimate(int fromColor, int toColor, int speed) {
- _gfx->PaletteAnimate(fromColor, toColor, speed);
+ _palette->animate(fromColor, toColor, speed);
}
int16 SciGui::onControl(byte screenMask, Common::Rect rect) {
@@ -357,41 +371,39 @@ int16 SciGui::onControl(byte screenMask, Common::Rect rect) {
}
void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
- bool old_picNotValid = _gfx->_picNotValid;
+ bool old_picNotValid = _picNotValid;
if (listReference.isNull()) {
_gfx->AnimateDisposeLastCast();
- if (_gfx->_picNotValid) {
+ if (_picNotValid) {
//(this->*ShowPic)(_showMap, _showStyle);
- _gfx->_picNotValid = false;
+ _picNotValid = 0;
}
return;
}
List *list = lookup_list(_s, listReference);
- if (!list) {
+ if (!list)
error("kAnimate called with non-list as parameter");
- }
- if (cycle) {
+ if (cycle)
_gfx->AnimateInvoke(list, argc, argv);
- }
GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind);
_gfx->AnimateDisposeLastCast();
_gfx->AnimateFill();
- _gfx->AnimateSort();
+ // _gfx->AnimateSort();
if (old_picNotValid) {
_gfx->AnimateUpdate();
}
_gfx->AnimateDrawCels();
- if (_gfx->_picNotValid) {
+ if (_picNotValid) {
//(this->*ShowPic)(_showMap, _showStyle);
- _gfx->_picNotValid = false;
+ _picNotValid = 0;
}
//_gfx->AnimateUpdateScreen();
@@ -402,7 +414,36 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
}
void SciGui::addToPicList(reg_t listReference, int argc, reg_t *argv) {
- // FIXME: port over from gregs engine
+ List *list;
+ Common::List<GuiAnimateList> *sortedList;
+
+ _gfx->SetPort((GuiPort *)_windowMgr->_picWind);
+
+ list = lookup_list(_s, listReference);
+ if (!list)
+ error("kAddToPic called with non-list as parameter");
+
+ sortedList = _gfx->AnimateMakeSortedList(list);
+
+// uint16 szList = list.getSize();
+// HEAPHANDLE*arrObj = new HEAPHANDLE[szList];
+// int16*arrY = new int16[szList];
+// HEAPHANDLE hnode = list.getFirst();
+// sciNode1*pnode;
+//
+// for (int i = 0; i < szList; i++) {
+// pnode = (sciNode1*)heap2Ptr(hnode);
+// obj.set(pnode->value);
+// arrY[i] = obj.getProperty(3);
+//arrZ[i] = obj.getProperty(
+// arrObj[i] = pnode->value;
+// hnode = pnode->next;
+// }
+// animSort(arrObj, arrY, szList);
+
+ _picNotValid = 2;
+
+ delete sortedList;
}
void SciGui::addToPicView(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, int16 leftPos, int16 topPos, int16 priority, int16 control) {