Implement part of chapter selection panel.

svn-id: r18643
This commit is contained in:
Eugene Sandulenko 2005-08-10 13:56:51 +00:00
parent 603a5e4d6f
commit 67b4b2c0d4
4 changed files with 90 additions and 26 deletions

View File

@ -27,6 +27,7 @@
#include "saga/gfx.h"
#include "saga/actor.h"
#include "saga/console.h"
#include "saga/events.h"
#include "saga/font.h"
#include "saga/objectmap.h"
#include "saga/isomap.h"
@ -264,7 +265,7 @@ void Interface::setMode(int mode) {
switch (_panelMode) {
case kPanelMain:
if (_vm->getGameType() == GType_IHNM)
warning("FIXME: Implement IHNM differences from ExecuteInvontoryPanel");
warning("FIXME: Implement IHNM differences from ExecuteInventoryPanel");
_mainPanel.currentButton = NULL;
break;
@ -301,6 +302,8 @@ void Interface::setMode(int mode) {
_vm->_render->setFlag(RF_DEMO_SUBST);
_vm->_gfx->getCurrentPal(_mapSavedPal);
break;
case kPanelChapterSelection:
break;
}
draw();
@ -1169,6 +1172,56 @@ void Interface::handleOptionClick(const Point& mousePoint) {
}
}
void Interface::handleChapterSelectionUpdate(const Point& mousePoint) {
}
void Interface::handleChapterSelectionClick(const Point& mousePoint) {
int obj = _vm->_script->_pointerObject;
_vm->_actor->abortSpeech();
if (obj) {
int script = 0;
HitZone *hitZone;
ActorData *a;
ObjectData *o;
EVENT event;
switch (objectTypeId(obj)) {
case kGameObjectHitZone:
hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(obj));
if (hitZone->getFlags() & kHitZoneExit)
script = hitZone->getScriptNumber();
break;
case kGameObjectActor:
a = _vm->_actor->getActor(obj);
script = a->scriptEntrypointNumber;
break;
case kGameObjectObject:
o = _vm->_actor->getObj(obj);
script = o->scriptEntrypointNumber;
break;
}
if (script > 0) {
event.type = ONESHOT_EVENT;
event.code = SCRIPT_EVENT;
event.op = EVENT_EXEC_NONBLOCKING;
event.time = 0;
event.param = _vm->_scene->getScriptModuleNumber();
event.param2 = script;
event.param3 = kVerbIHNMUse; // Action
event.param4 = obj; // Object
event.param5 = 0; // With Object
event.param6 = obj; // Actor
_vm->_events->queue(&event);
}
}
}
void Interface::setOption(PanelButton *panelButton) {
char * fileName;
@ -1210,7 +1263,8 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
return;
}
if (_panelMode == kPanelMain) {
switch (_panelMode) {
case kPanelMain:
if (updateFlag & UPDATE_MOUSEMOVE) {
bool lastWasPlayfield = _lastMousePoint.y < _vm->getSceneHeight();
if (mousePoint.y < _vm->getSceneHeight()) {
@ -1235,13 +1289,11 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
}
}
}
}
break;
if (_panelMode == kPanelConverse) {
case kPanelConverse:
if (updateFlag & UPDATE_MOUSEMOVE) {
handleConverseUpdate(mousePoint);
} else {
if (updateFlag & UPDATE_MOUSECLICK) {
handleConverseClick(mousePoint);
@ -1257,13 +1309,11 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
_vm->_puzzle->handleClick(mousePoint);
}
}
}
break;
if (_panelMode == kPanelOption) {
case kPanelOption:
if (updateFlag & UPDATE_MOUSEMOVE) {
handleOptionUpdate(mousePoint);
} else {
if (updateFlag & UPDATE_MOUSECLICK) {
handleOptionClick(mousePoint);
@ -1279,21 +1329,19 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
calcOptionSaveSlider();
}
}
}
break;
if (_panelMode == kPanelQuit) {
case kPanelQuit:
if (updateFlag & UPDATE_MOUSEMOVE) {
handleQuitUpdate(mousePoint);
} else {
if (updateFlag & UPDATE_MOUSECLICK) {
handleQuitClick(mousePoint);
}
}
}
break;
if (_panelMode == kPanelLoad) {
case kPanelLoad:
if (updateFlag & UPDATE_MOUSEMOVE) {
handleLoadUpdate(mousePoint);
@ -1303,9 +1351,9 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
handleLoadClick(mousePoint);
}
}
}
break;
if (_panelMode == kPanelSave) {
case kPanelSave:
if (updateFlag & UPDATE_MOUSEMOVE) {
handleSaveUpdate(mousePoint);
@ -1315,20 +1363,31 @@ void Interface::update(const Point& mousePoint, int updateFlag) {
handleSaveClick(mousePoint);
}
}
}
break;
if (_panelMode == kPanelMap) {
case kPanelMap:
if (updateFlag & UPDATE_MOUSECLICK)
mapPanelClean();
}
break;
if (_panelMode == kPanelSceneSubstitute) {
case kPanelSceneSubstitute:
if (updateFlag & UPDATE_MOUSECLICK) {
_vm->_render->clearFlag(RF_DEMO_SUBST);
_vm->_gfx->setPalette(_mapSavedPal);
setMode(kPanelMain);
_vm->_script->setNoPendingVerb();
}
break;
case kPanelChapterSelection:
// TODO: panel has silent button
if (updateFlag & UPDATE_MOUSEMOVE) {
handleChapterSelectionUpdate(mousePoint);
} else {
if (updateFlag & UPDATE_MOUSECLICK)
handleChapterSelectionClick(mousePoint);
}
break;
}
_lastMousePoint = mousePoint;

View File

@ -70,7 +70,7 @@ enum PanelModes {
kPanelPlacard,
kPanelMap,
kPanelSceneSubstitute,
kPanelUnknown
kPanelChapterSelection
// kPanelInventory
};
@ -313,6 +313,9 @@ private:
void handleSaveUpdate(const Point& mousePoint); // save panel update
void handleSaveClick(const Point& mousePoint); // save panel click
void handleChapterSelectionUpdate(const Point& mousePoint);
void handleChapterSelectionClick(const Point& mousePoint);
void mapPanelShow();
void mapPanelClean();

View File

@ -620,7 +620,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) {
_vm->_interface->activate();
if (loadSceneParams->chapter == 8 || loadSceneParams->chapter == -1)
_vm->_interface->setMode(kPanelUnknown);
_vm->_interface->setMode(kPanelChapterSelection);
else
_vm->_interface->setMode(kPanelMain);

View File

@ -649,9 +649,11 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
}
}
if (sampleResourceId < 0 || sampleResourceId > 4000) {
if (sampleResourceId < 0 || sampleResourceId > 4000)
sampleResourceId = -1;
if (_vm->getGameType() == GType_ITE && !sampleResourceId)
sampleResourceId = -1;
}
_vm->_actor->actorSpeech(actorId, strings, stringsCount, sampleResourceId, speechFlags);