aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/actor.cpp5
-rw-r--r--saga/interface.cpp79
-rw-r--r--saga/interface.h14
-rw-r--r--saga/scene.cpp3
-rw-r--r--saga/script.cpp1
-rw-r--r--saga/script.h4
-rw-r--r--saga/sfuncs.cpp29
-rw-r--r--saga/sthread.cpp2
8 files changed, 100 insertions, 37 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 950f23c958..5001151f47 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -928,7 +928,10 @@ int Actor::handleWalkIntent(R_ACTOR *actor, R_WALKINTENT *a_walkint, int *comple
endpoint.x = (int)new_a_x / R_ACTOR_LMULT;
endpoint.y = (int)new_a_y / R_ACTOR_LMULT;
if ((exitNum = _vm->_scene->_actionMap->hitTest(endpoint)) != -1) {
- _vm->_scene->changeScene(_vm->_scene->_actionMap->getExitScene(exitNum));
+ // WORKAROUND: Only change room if the actor is Rif
+ // himself. We need to fix this properly later.
+ if (actor->id == 0)
+ _vm->_scene->changeScene(_vm->_scene->_actionMap->getExitScene(exitNum));
}
*complete_p = 1;
return R_FAILURE;
diff --git a/saga/interface.cpp b/saga/interface.cpp
index 942264ceca..fc633353c5 100644
--- a/saga/interface.cpp
+++ b/saga/interface.cpp
@@ -67,7 +67,9 @@ static R_INTERFACE_DESC ITE_interface = {
COMMAND_DEFAULT_BUTTON,
ITE_LPORTRAIT_X,
- ITE_LPORTRAIT_Y
+ ITE_LPORTRAIT_Y,
+ ITE_RPORTRAIT_X,
+ ITE_RPORTRAIT_Y
};
static R_INTERFACE_BUTTON ITE_c_buttons[] = {
@@ -109,7 +111,9 @@ static R_INTERFACE_DESC IHNM_interface = {
COMMAND_DEFAULT_BUTTON,
IHNM_LPORTRAIT_X,
- IHNM_LPORTRAIT_Y
+ IHNM_LPORTRAIT_Y,
+ IHNM_RPORTRAIT_X,
+ IHNM_RPORTRAIT_Y
};
static R_INTERFACE_BUTTON IHNM_c_buttons[] = {
@@ -207,7 +211,9 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
_dPanel.y = 149;
_cPanel.set_button = COMMAND_DEFAULT_BUTTON;
- _activePortrait = 0;
+ _scenePortraits = 0;
+ _leftPortrait = 0;
+ _rightPortrait = 0;
_activeVerb = I_VERB_WALKTO;
@@ -235,6 +241,15 @@ int Interface::deactivate() {
return R_SUCCESS;
}
+int Interface::setMode(R_PANEL_MODES mode) {
+ // TODO: Is this where we should hide/show the mouse cursor?
+
+ _panelMode = mode;
+ draw();
+
+ return R_SUCCESS;
+}
+
int Interface::setStatusText(const char *new_txt) {
assert(new_txt != NULL);
@@ -243,6 +258,27 @@ int Interface::setStatusText(const char *new_txt) {
return R_SUCCESS;
}
+int Interface::loadScenePortraits(int res) {
+ if (_scenePortraits)
+ _vm->_sprite->freeSprite(_scenePortraits);
+
+ return _vm->_sprite->loadList(res, &_scenePortraits);
+}
+
+int Interface::setLeftPortrait(int portrait) {
+ _leftPortrait = portrait;
+ draw();
+
+ return R_SUCCESS;
+}
+
+int Interface::setRightPortrait(int portrait) {
+ _rightPortrait = portrait;
+ draw();
+
+ return R_SUCCESS;
+}
+
int Interface::draw() {
R_GAME_DISPLAYINFO g_di;
R_SURFACE *back_buf;
@@ -251,6 +287,8 @@ int Interface::draw() {
int ybase;
int lportrait_x;
int lportrait_y;
+ int rportrait_x;
+ int rportrait_y;
Rect rect;
Point origin;
@@ -298,7 +336,14 @@ int Interface::draw() {
lportrait_x = xbase + _iDesc.lportrait_x;
lportrait_y = ybase + _iDesc.lportrait_y;
- _vm->_sprite->draw(back_buf, _defPortraits, _activePortrait, lportrait_x, lportrait_y);
+ _vm->_sprite->draw(back_buf, _defPortraits, _leftPortrait, lportrait_x, lportrait_y);
+
+ if (_panelMode == PANEL_DIALOGUE && _iDesc.rportrait_x >= 0) {
+ rportrait_x = xbase + _iDesc.rportrait_x;
+ rportrait_y = ybase + _iDesc.rportrait_y;
+
+ _vm->_sprite->draw(back_buf, _scenePortraits, _rightPortrait, rportrait_x, rportrait_y);
+ }
return R_SUCCESS;
}
@@ -322,23 +367,25 @@ int Interface::update(const Point& imousePt, int update_flag) {
// Get game display info
GAME_GetDisplayInfo(&g_di);
- // Update playfield space ( only if cursor is inside )
- if (imouse_y < g_di.scene_h) {
- // Mouse is in playfield space
+ if (_panelMode == PANEL_COMMAND) {
+ // Update playfield space ( only if cursor is inside )
+ if (imouse_y < g_di.scene_h) {
+ // Mouse is in playfield space
+ if (update_flag == UPDATE_MOUSEMOVE) {
+ handlePlayfieldUpdate(back_buf, imousePt);
+ } else if (update_flag == UPDATE_MOUSECLICK) {
+ handlePlayfieldClick(back_buf, imousePt);
+ }
+ }
+
+ // Update command space
if (update_flag == UPDATE_MOUSEMOVE) {
- handlePlayfieldUpdate(back_buf, imousePt);
+ handleCommandUpdate(back_buf, imousePt);
} else if (update_flag == UPDATE_MOUSECLICK) {
- handlePlayfieldClick(back_buf, imousePt);
+ handleCommandClick(back_buf, imousePt);
}
}
- // Update command space
- if (update_flag == UPDATE_MOUSEMOVE) {
- handleCommandUpdate(back_buf, imousePt);
- } else if (update_flag == UPDATE_MOUSECLICK) {
- handleCommandClick(back_buf, imousePt);
- }
-
drawStatusBar(back_buf);
return R_SUCCESS;
diff --git a/saga/interface.h b/saga/interface.h
index 16ef258615..4b87bfbdd6 100644
--- a/saga/interface.h
+++ b/saga/interface.h
@@ -56,6 +56,8 @@ enum INTERFACE_UPDATE_FLAGS {
#define ITE_LPORTRAIT_X 5
#define ITE_LPORTRAIT_Y 4
+#define ITE_RPORTRAIT_X 274
+#define ITE_RPORTRAIT_Y 4
// IHNMAIMS interface values
#define IHNM_STATUS_Y 304
@@ -71,6 +73,8 @@ enum INTERFACE_UPDATE_FLAGS {
#define IHNM_LPORTRAIT_X 5
#define IHNM_LPORTRAIT_Y 4
+#define IHNM_RPORTRAIT_X -1
+#define IHNM_RPORTRAIT_Y -1
enum R_PANEL_MODES {
PANEL_COMMAND,
@@ -127,6 +131,8 @@ struct R_INTERFACE_DESC {
int cmd_defaultbutton;
int lportrait_x;
int lportrait_y;
+ int rportrait_x;
+ int rportrait_y;
};
struct R_INTERFACE_MODULE {
@@ -158,7 +164,11 @@ class Interface {
int registerLang();
int activate();
int deactivate();
+ int setMode(R_PANEL_MODES mode);
int setStatusText(const char *new_txt);
+ int loadScenePortraits(int res);
+ int setLeftPortrait(int portrait);
+ int setRightPortrait(int portrait);
int draw();
int update(const Point& imousePt, int update_flag);
@@ -182,8 +192,10 @@ class Interface {
R_INTERFACE_PANEL _cPanel;
R_INTERFACE_PANEL _dPanel;
char _statusText[R_STATUS_TEXT_LEN];
- int _activePortrait;
+ int _leftPortrait;
+ int _rightPortrait;
R_SPRITELIST *_defPortraits;
+ R_SPRITELIST *_scenePortraits;
int _activeVerb;
R_SCRIPT_THREAD *_iThread;
};
diff --git a/saga/scene.cpp b/saga/scene.cpp
index e104b8e7f4..cd581d055f 100644
--- a/saga/scene.cpp
+++ b/saga/scene.cpp
@@ -30,6 +30,7 @@
#include "saga/animation.h"
#include "saga/console.h"
#include "saga/cvar_mod.h"
+#include "saga/interface.h"
#include "saga/events.h"
#include "saga/actionmap.h"
#include "saga/isomap.h"
@@ -789,7 +790,7 @@ int Scene::processSceneResources() {
warning("Scene::ProcessSceneResources(): Loading scene entries is not implemented");
break;
case SAGA_FACES:
- warning("Scene::ProcessSceneResources(): Loading scene faces is not implemented");
+ _vm->_interface->loadScenePortraits(_resList[i].res_number);
break;
default:
warning("Scene::ProcessSceneResources(): Encountered unknown resource type: %d", _resList[i].res_type);
diff --git a/saga/script.cpp b/saga/script.cpp
index 6d4f11f6b8..1f6731bd48 100644
--- a/saga/script.cpp
+++ b/saga/script.cpp
@@ -58,6 +58,7 @@ Script::Script() {
int i, j;
//initialize member variables
+ _dbg_thread = 0;
_scriptContext = 0;
_voiceLUTPresent = false;
_scriptLUTEntryLen = 0;
diff --git a/saga/script.h b/saga/script.h
index c5b666339e..5bbde08f4d 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -236,8 +236,8 @@ private:
int SF_sleep(R_SCRIPTFUNC_PARAMS);
int SF_takeObject(R_SCRIPTFUNC_PARAMS);
int SF_objectIsCarried(R_SCRIPTFUNC_PARAMS);
- int SF_setCommandText(R_SCRIPTFUNC_PARAMS);
- int SF_mainMode(R_SCRIPTFUNC_PARAMS);
+ int SF_setStatusText(R_SCRIPTFUNC_PARAMS);
+ int SF_commandMode(R_SCRIPTFUNC_PARAMS);
int SF_actorWalkTo(R_SCRIPTFUNC_PARAMS);
int SF_setFacing(R_SCRIPTFUNC_PARAMS);
int SF_startBgdAnim(R_SCRIPTFUNC_PARAMS);
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index 84daf5b547..bb8f462c0f 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -47,8 +47,8 @@ void Script::setupScriptFuncList(void) {
{1, 1, OPCODE(SF_sleep)},
{2, 1, OPCODE(SF_takeObject)},
{3, 1, OPCODE(SF_objectIsCarried)},
- {4, 1, OPCODE(SF_setCommandText)},
- {5, 0, OPCODE(SF_mainMode)},
+ {4, 1, OPCODE(SF_setStatusText)},
+ {5, 0, OPCODE(SF_commandMode)},
{6, 3, OPCODE(SF_actorWalkTo)},
{7, 4, OPCODE(SF_doAction)},
{8, 2, OPCODE(SF_setFacing)},
@@ -163,18 +163,15 @@ int Script::SF_objectIsCarried(R_SCRIPTFUNC_PARAMS) {
// Script function #4 (0x04) nonblocking
// Set the command display to the specified text string
// Param1: dialogue index of string
-int Script::SF_setCommandText(R_SCRIPTFUNC_PARAMS) {
- SDataWord_T s_idx_parm;
+int Script::SF_setStatusText(R_SCRIPTFUNC_PARAMS) {
+ SDataWord_T param = thread->pop();
- s_idx_parm = thread->pop();
- // INCOMPLETE
-
- return R_SUCCESS;
+ return _vm->_interface->setStatusText(currentScript()->diag->str[param]);
}
// Script function #5 (0x05)
-int Script::SF_mainMode(R_SCRIPTFUNC_PARAMS) {
- return R_SUCCESS;
+int Script::SF_commandMode(R_SCRIPTFUNC_PARAMS) {
+ return _vm->_interface->setMode(PANEL_COMMAND);
}
// Script function #6 (0x06) blocking
@@ -279,7 +276,7 @@ int Script::SF_freezeInterface(R_SCRIPTFUNC_PARAMS) {
// Script function #12 (0x0C)
// Disables mouse input, etc.
int Script::SF_dialogMode(R_SCRIPTFUNC_PARAMS) {
- return R_SUCCESS;
+ return _vm->_interface->setMode(PANEL_DIALOGUE);
}
// Script function #14 (0x0E)
@@ -533,15 +530,17 @@ int Script::SF_setFrame(R_SCRIPTFUNC_PARAMS) {
// Script function #39 (0x27)
// Sets the right-hand portrait
int Script::SF_setRightPortrait(R_SCRIPTFUNC_PARAMS) {
- thread->pop();
- return R_SUCCESS;
+ SDataWord_T param = thread->pop();
+
+ return _vm->_interface->setRightPortrait(param);
}
// Script function #40 (0x28)
// Sets the left-hand portrait
int Script::SF_setLeftPortrait(R_SCRIPTFUNC_PARAMS) {
- thread->pop();
- return R_SUCCESS;
+ SDataWord_T param = thread->pop();
+
+ return _vm->_interface->setLeftPortrait(param);
}
// Script function #41 (0x29) nonblocking
diff --git a/saga/sthread.cpp b/saga/sthread.cpp
index 5bfe1e22b4..5e9cc785bf 100644
--- a/saga/sthread.cpp
+++ b/saga/sthread.cpp
@@ -726,7 +726,7 @@ int Script::SThreadRun(R_SCRIPT_THREAD *thread, int instr_limit, int msec) {
} else {
voice_rn = currentScript()->voice->voices[data];
}
- _vm->_actor->speak(a_index, currentScript()->diag-> str[data], voice_rn, &thread->sem);
+ _vm->_actor->speak(a_index, currentScript()->diag->str[data], voice_rn, &thread->sem);
}
}
break;