aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/interface.cpp176
-rw-r--r--saga/interface.h8
-rw-r--r--saga/render.cpp5
-rw-r--r--saga/render.h19
-rw-r--r--saga/resnames.h4
-rw-r--r--saga/script.h2
-rw-r--r--saga/sfuncs.cpp9
7 files changed, 175 insertions, 48 deletions
diff --git a/saga/interface.cpp b/saga/interface.cpp
index a803a116ba..e0ef3c5232 100644
--- a/saga/interface.cpp
+++ b/saga/interface.cpp
@@ -29,8 +29,10 @@
#include "saga/console.h"
#include "saga/font.h"
#include "saga/objectmap.h"
+#include "saga/isomap.h"
#include "saga/itedata.h"
#include "saga/puzzle.h"
+#include "saga/render.h"
#include "saga/rscfile_mod.h"
#include "saga/scene.h"
#include "saga/script.h"
@@ -38,6 +40,7 @@
#include "saga/interface.h"
+#include "common/system.h"
#include "common/timer.h"
namespace Saga {
@@ -265,8 +268,7 @@ void Interface::restoreMode() {
}
void Interface::setMode(int mode) {
- // TODO: Is this where we should hide/show the mouse cursor?
- debug(0, "Interface::setMode %i", mode);
+ debug(5, "Interface::setMode %i", mode);
if (mode == kPanelMain) {
_inMainMode = true;
_saveReminderState = 1; //TODO: blinking timeout
@@ -280,35 +282,38 @@ void Interface::setMode(int mode) {
_panelMode = mode;
switch (_panelMode) {
- case kPanelMain:
- _mainPanel.currentButton = NULL;
- break;
- case kPanelConverse:
- _conversePanel.currentButton = NULL;
- converseDisplayText();
- break;
- case kPanelOption:
- _optionPanel.currentButton = NULL;
- _vm->fillSaveList();
- calcOptionSaveSlider();
- if (_optionSaveFileTitleNumber >= _vm->getDisplayInfo().optionSaveFileVisible) {
- _optionSaveFileTitleNumber = _vm->getDisplayInfo().optionSaveFileVisible - 1;
- }
- break;
- case kPanelLoad:
- _loadPanel.currentButton = NULL;
- break;
- case kPanelQuit:
- _quitPanel.currentButton = NULL;
- break;
- case kPanelSave:
- _savePanel.currentButton = NULL;
- _textInputMaxWidth = _saveEdit->width - 10;
- _textInput = true;
- _textInputStringLength = strlen(_textInputString);
- _textInputPos = _textInputStringLength + 1;
- _textInputRepeatPhase = 0;
- break;
+ case kPanelMain:
+ _mainPanel.currentButton = NULL;
+ break;
+ case kPanelConverse:
+ _conversePanel.currentButton = NULL;
+ converseDisplayText();
+ break;
+ case kPanelOption:
+ _optionPanel.currentButton = NULL;
+ _vm->fillSaveList();
+ calcOptionSaveSlider();
+ if (_optionSaveFileTitleNumber >= _vm->getDisplayInfo().optionSaveFileVisible) {
+ _optionSaveFileTitleNumber = _vm->getDisplayInfo().optionSaveFileVisible - 1;
+ }
+ break;
+ case kPanelLoad:
+ _loadPanel.currentButton = NULL;
+ break;
+ case kPanelQuit:
+ _quitPanel.currentButton = NULL;
+ break;
+ case kPanelSave:
+ _savePanel.currentButton = NULL;
+ _textInputMaxWidth = _saveEdit->width - 10;
+ _textInput = true;
+ _textInputStringLength = strlen(_textInputString);
+ _textInputPos = _textInputStringLength + 1;
+ _textInputRepeatPhase = 0;
+ break;
+ case kPanelMap:
+ mapPanelShow();
+ break;
}
draw();
@@ -438,6 +443,9 @@ bool Interface::processAscii(uint16 ascii, bool synthetic) {
break;
}
+ case kPanelMap:
+ mapPanelClean();
+ break;
}
return false;
}
@@ -1287,6 +1295,11 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
}
}
+ if (_panelMode == kPanelMap) {
+ if (updateFlag & UPDATE_MOUSECLICK)
+ mapPanelClean();
+ }
+
_lastMousePoint = mousePoint;
}
@@ -2006,5 +2019,106 @@ void Interface::loadState(Common::InSaveFile *in) {
updateInventory(0);
}
+void Interface::mapPanelShow() {
+ byte *resource;
+ size_t resourceLength, imageLength;
+ SURFACE *backBuffer;
+ Point origin;
+ byte *image;
+ int imageWidth, imageHeight;
+ int result;
+ const byte *pal;
+ PALENTRY cPal[PAL_ENTRIES];
+
+ _vm->_gfx->showCursor(false);
+
+ backBuffer = _vm->_gfx->getBackBuffer();
+
+ origin.x = 0;
+ origin.y = 0;
+
+ result = RSC_LoadResource(_interfaceContext, RID_ITE_TYCHO_MAP, &resource, &resourceLength);
+ if ((result != SUCCESS) || (resourceLength == 0)) {
+ error("Interface::mapPanelShow(): unable to load Tycho map resource");
+ }
+
+ _vm->_gfx->getCurrentPal(_mapSavedPal);
+
+ for (int i = 0; i < 6 ; i++) {
+ _vm->_gfx->palToBlack(backBuffer, _mapSavedPal, 0.2 * i);
+ _vm->_render->drawScene();
+ _vm->_system->delayMillis(5);
+ }
+
+ _vm->_render->setFlag(RF_MAP);
+
+ _vm->decodeBGImage(resource, resourceLength, &image, &imageLength, &imageWidth, &imageHeight);
+ pal = _vm->getImagePal(resource, resourceLength);
+
+ for (int i = 0; i < PAL_ENTRIES; i++) {
+ cPal[i].red = *pal++;
+ cPal[i].green = *pal++;
+ cPal[i].blue = *pal++;
+ }
+
+ bufToSurface(backBuffer, image, imageWidth, imageHeight, NULL, &origin);
+
+ // Evil Evil
+ for (int i = 0; i < 6 ; i++) {
+ _vm->_gfx->blackToPal(backBuffer, cPal, 0.2 * i);
+ _vm->_render->drawScene();
+ _vm->_system->delayMillis(5);
+ }
+
+ RSC_FreeResource(resource);
+ free(image);
+
+ setSaveReminderState(false);
+
+ _mapPanelCrossHairState = true;
+}
+
+void Interface::mapPanelClean() {
+ SURFACE *backBuffer;
+ PALENTRY pal[PAL_ENTRIES];
+
+ backBuffer = _vm->_gfx->getBackBuffer();
+
+ _vm->_gfx->getCurrentPal(pal);
+
+ for (int i = 0; i < 6 ; i++) {
+ _vm->_gfx->palToBlack(backBuffer, pal, 0.2 * i);
+ _vm->_render->drawScene();
+ _vm->_system->delayMillis(5);
+ }
+
+ _vm->_render->clearFlag(RF_MAP);
+ setMode(kPanelMain);
+
+ _vm->_gfx->showCursor(true);
+ _vm->_render->drawScene();
+
+ for (int i = 0; i < 6 ; i++) {
+ _vm->_gfx->blackToPal(backBuffer, _mapSavedPal, 0.2 * i);
+ _vm->_render->drawScene();
+ _vm->_system->delayMillis(5);
+ }
+}
+
+void Interface::mapPanelDrawCrossHair() {
+ SURFACE *backBuffer;
+
+ backBuffer = _vm->_gfx->getBackBuffer();
+ _mapPanelCrossHairState = !_mapPanelCrossHairState;
+
+ Point mapPosition = _vm->_isoMap->getMapPosition();
+ Rect screen(_vm->getDisplayWidth(), _vm->getSceneHeight());
+
+ if (screen.contains(mapPosition)) {
+ _vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites,
+ _mapPanelCrossHairState? RID_ITE_SPR_XHAIR1 : RID_ITE_SPR_XHAIR2,
+ mapPosition, 256);
+ }
+}
} // End of namespace Saga
diff --git a/saga/interface.h b/saga/interface.h
index 32f6884e22..fc3c89821f 100644
--- a/saga/interface.h
+++ b/saga/interface.h
@@ -275,6 +275,8 @@ public:
void saveState(Common::OutSaveFile *out);
void loadState(Common::InSaveFile *in);
+ void mapPanelDrawCrossHair();
+
private:
void handleMainUpdate(const Point& mousePoint); // main panel update
void handleMainClick(const Point& mousePoint); // main panel click
@@ -309,6 +311,9 @@ private:
void handleSaveUpdate(const Point& mousePoint); // save panel update
void handleSaveClick(const Point& mousePoint); // save panel click
+ void mapPanelShow();
+ void mapPanelClean();
+
void lockMode() { _lockedMode = _panelMode; }
void unlockMode() { _panelMode = _lockedMode; }
@@ -436,6 +441,9 @@ private:
int _textInputRepeatPhase;
uint16 _textInputRepeatChar;
+
+ PALENTRY _mapSavedPal[PAL_ENTRIES];
+ bool _mapPanelCrossHairState;
};
} // End of namespace Saga
diff --git a/saga/render.cpp b/saga/render.cpp
index 8270c5939e..f93dadbf72 100644
--- a/saga/render.cpp
+++ b/saga/render.cpp
@@ -111,7 +111,7 @@ int Render::drawScene() {
// Get mouse coordinates
mouse_pt = _vm->mousePos();
- if (/*_vm->_interface->getMode() != kPanelPlacard*/!(_flags & RF_PLACARD)) {
+ if (/*_vm->_interface->getMode() != kPanelPlacard*/!(_flags & (RF_PLACARD | RF_MAP))) {
// Display scene background
_vm->_scene->draw();
@@ -136,6 +136,9 @@ int Render::drawScene() {
}
}
+ if (_flags & RF_MAP)
+ _vm->_interface->mapPanelDrawCrossHair();
+
if ((_vm->_interface->getMode() == kPanelOption) ||
(_vm->_interface->getMode() == kPanelQuit) ||
(_vm->_interface->getMode() == kPanelLoad) ||
diff --git a/saga/render.h b/saga/render.h
index 2fca248868..939e4bf9ea 100644
--- a/saga/render.h
+++ b/saga/render.h
@@ -32,14 +32,15 @@ namespace Saga {
#define PAUSEGAME_MSG "PAWS GAME"
enum RENDER_FLAGS {
- RF_SHOW_FPS = 0x01,
- RF_PALETTE_TEST = 0x02,
- RF_TEXT_TEST = 0x04,
- RF_OBJECTMAP_TEST = 0x08,
- RF_RENDERPAUSE = 0x10,
- RF_GAMEPAUSE = 0x20,
- RF_PLACARD = 0x40,
- RF_ACTOR_PATH_TEST = 0x80
+ RF_SHOW_FPS = (1 << 0),
+ RF_PALETTE_TEST = (1 << 1),
+ RF_TEXT_TEST = (1 << 2),
+ RF_OBJECTMAP_TEST = (1 << 3),
+ RF_RENDERPAUSE = (1 << 4),
+ RF_GAMEPAUSE = (1 << 5),
+ RF_PLACARD = (1 << 6),
+ RF_ACTOR_PATH_TEST = (1 << 7),
+ RF_MAP = (1 << 8)
};
struct BUFFER_INFO {
@@ -87,7 +88,7 @@ private:
unsigned int _fps;
unsigned int _framecount;
- unsigned int _flags;
+ uint32 _flags;
};
} // End of namespace Saga
diff --git a/saga/resnames.h b/saga/resnames.h
index cd362d7ea3..02d2af24d2 100644
--- a/saga/resnames.h
+++ b/saga/resnames.h
@@ -71,6 +71,10 @@ namespace Saga {
#define RID_ITE_ACTOR_NAMES 36 //actors names
#define RID_ITE_DEFAULT_PORTRAITS 125
+#define RID_ITE_TYCHO_MAP 1686
+#define RID_ITE_SPR_XHAIR1 (73 + 9)
+#define RID_ITE_SPR_XHAIR2 (74 + 9)
+
#define RID_IHNM_MAIN_PANEL 9
#define RID_IHNM_CONVERSE_PANEL 10
#define RID_IHNM_OPTION_PANEL 11 // TODO: verify this
diff --git a/saga/script.h b/saga/script.h
index 006bf7312d..80cfc78ab5 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -530,7 +530,7 @@ private:
void sfPickClimbOutPos(SCRIPTFUNC_PARAMS);
void sfTossRif(SCRIPTFUNC_PARAMS);
void sfShowControls(SCRIPTFUNC_PARAMS);
- void SF_showMap(SCRIPTFUNC_PARAMS);
+ void sfShowMap(SCRIPTFUNC_PARAMS);
void sfPuzzleWon(SCRIPTFUNC_PARAMS);
void sfEnableEscape(SCRIPTFUNC_PARAMS);
void sfPlaySound(SCRIPTFUNC_PARAMS);
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index 42c5a4282d..56ec2f69c3 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -120,7 +120,7 @@ void Script::setupScriptFuncList(void) {
OPCODE(sfPickClimbOutPos),
OPCODE(sfTossRif),
OPCODE(sfShowControls),
- OPCODE(SF_showMap),
+ OPCODE(sfShowMap),
OPCODE(sfPuzzleWon),
OPCODE(sfEnableEscape),
OPCODE(sfPlaySound),
@@ -1643,11 +1643,8 @@ void Script::sfShowControls(SCRIPTFUNC_PARAMS) {
}
// Script function #67 (0x43)
-void Script::SF_showMap(SCRIPTFUNC_PARAMS) {
- for (int i = 0; i < nArgs; i++)
- thread->pop();
-
- debug(0, "STUB: SF_showMap(), %d args", nArgs);
+void Script::sfShowMap(SCRIPTFUNC_PARAMS) {
+ _vm->_interface->setMode(kPanelMap);
}
// Script function #68 (0x44)