implement IHNM verb mapper

svn-id: r20003
This commit is contained in:
Andrew Kurushin 2006-01-13 20:20:01 +00:00
parent 641caf7e73
commit 3a7a7b3291
10 changed files with 240 additions and 145 deletions

View file

@ -650,7 +650,7 @@ void Actor::stepZoneAction(ActorData *actor, const HitZone *hitZone, bool exit,
event.time = 0; event.time = 0;
event.param = _vm->_scene->getScriptModuleNumber(); // module number event.param = _vm->_scene->getScriptModuleNumber(); // module number
event.param2 = hitZone->getScriptNumber(); // script entry point number event.param2 = hitZone->getScriptNumber(); // script entry point number
event.param3 = kVerbEnter; // Action event.param3 = _vm->_script->getVerbType(kVerbEnter); // Action
event.param4 = ID_NOTHING; // Object event.param4 = ID_NOTHING; // Object
event.param5 = ID_NOTHING; // With Object event.param5 = ID_NOTHING; // With Object
event.param6 = ID_PROTAG; // Actor event.param6 = ID_PROTAG; // Actor
@ -1972,7 +1972,7 @@ bool Actor::actorEndWalk(uint16 actorId, bool recurse) {
if (actor == _protagonist) { if (actor == _protagonist) {
_vm->_script->wakeUpActorThread(kWaitTypeWalk, actor); _vm->_script->wakeUpActorThread(kWaitTypeWalk, actor);
if (_vm->_script->_pendingVerb == kVerbWalkTo) { if (_vm->_script->_pendingVerb == _vm->_script->getVerbType(kVerbWalkTo)) {
actor->_location.toScreenPointUV(testPoint); actor->_location.toScreenPointUV(testPoint);
hitZoneIndex = _vm->_scene->_actionMap->hitTest(testPoint); hitZoneIndex = _vm->_scene->_actionMap->hitTest(testPoint);
if (hitZoneIndex != -1) { if (hitZoneIndex != -1) {
@ -1981,7 +1981,7 @@ bool Actor::actorEndWalk(uint16 actorId, bool recurse) {
} else { } else {
_vm->_script->setNoPendingVerb(); _vm->_script->setNoPendingVerb();
} }
} else if (_vm->_script->_pendingVerb != kVerbNone) { } else if (_vm->_script->_pendingVerb != _vm->_script->getVerbType(kVerbNone)) {
_vm->_script->doVerb(); _vm->_script->doVerb();
} }
} else { } else {

View file

@ -53,14 +53,14 @@ static int detectGame(const FSList &fslist, bool mode = false, int start = -1);
// ITE section // ITE section
static PanelButton ITE_MainPanelButtons[] = { static PanelButton ITE_MainPanelButtons[] = {
{kPanelButtonVerb, 52,4, 57,10, kVerbWalkTo,'w',0, 0,1,0}, {kPanelButtonVerb, 52,4, 57,10, kVerbITEWalkTo,'w',0, 0,1,0},
{kPanelButtonVerb, 52,15, 57,10, kVerbLookAt,'l',0, 2,3,0}, {kPanelButtonVerb, 52,15, 57,10, kVerbITELookAt,'l',0, 2,3,0},
{kPanelButtonVerb, 52,26, 57,10, kVerbPickUp,'p',0, 4,5,0}, {kPanelButtonVerb, 52,26, 57,10, kVerbITEPickUp,'p',0, 4,5,0},
{kPanelButtonVerb, 52,37, 57,10, kVerbTalkTo,'t',0, 0,1,0}, {kPanelButtonVerb, 52,37, 57,10, kVerbITETalkTo,'t',0, 0,1,0},
{kPanelButtonVerb, 110,4, 56,10, kVerbOpen,'o',0, 6,7,0}, {kPanelButtonVerb, 110,4, 56,10, kVerbITEOpen,'o',0, 6,7,0},
{kPanelButtonVerb, 110,15, 56,10, kVerbClose,'c',0, 8,9,0}, {kPanelButtonVerb, 110,15, 56,10, kVerbITEClose,'c',0, 8,9,0},
{kPanelButtonVerb, 110,26, 56,10, kVerbUse,'u',0, 10,11,0}, {kPanelButtonVerb, 110,26, 56,10, kVerbITEUse,'u',0, 10,11,0},
{kPanelButtonVerb, 110,37, 56,10, kVerbGive,'g',0, 12,13,0}, {kPanelButtonVerb, 110,37, 56,10, kVerbITEGive,'g',0, 12,13,0},
{kPanelButtonArrow, 306,6, 8,5, -1,'U',0, 0,4,2}, {kPanelButtonArrow, 306,6, 8,5, -1,'U',0, 0,4,2},
{kPanelButtonArrow, 306,41, 8,5, 1,'D',0, 1,5,3}, {kPanelButtonArrow, 306,41, 8,5, 1,'D',0, 1,5,3},
@ -533,14 +533,14 @@ static GamePatchDescription ITELinPatch_Files[] = {
// IHNM section // IHNM section
static PanelButton IHNM_MainPanelButtons[] = { static PanelButton IHNM_MainPanelButtons[] = {
{kPanelButtonVerb, 106,12, 114,30, kVerbWalkTo,'w',0, 0,1,0}, {kPanelButtonVerb, 106,12, 114,30, kVerbIHNMWalk,'w',0, 0,1,0},
{kPanelButtonVerb, 106,44, 114,30, kVerbLookAt,'l',0, 2,3,0}, {kPanelButtonVerb, 106,44, 114,30, kVerbIHNMLookAt,'l',0, 2,3,0},
{kPanelButtonVerb, 106,76, 114,30, kVerbTake,'k',0, 4,5,0}, {kPanelButtonVerb, 106,76, 114,30, kVerbIHNMTake,'k',0, 4,5,0},
{kPanelButtonVerb, 106,108, 114,30, kVerbUse,'u',0, 6,7,0}, {kPanelButtonVerb, 106,108, 114,30, kVerbIHNMUse,'u',0, 6,7,0},
{kPanelButtonVerb, 223,12, 114,30, kVerbTalkTo,'t',0, 8,9,0}, {kPanelButtonVerb, 223,12, 114,30, kVerbIHNMTalkTo,'t',0, 8,9,0},
{kPanelButtonVerb, 223,44, 114,30, kVerbSwallow,'s',0, 10,11,0}, {kPanelButtonVerb, 223,44, 114,30, kVerbIHNMSwallow,'s',0, 10,11,0},
{kPanelButtonVerb, 223,76, 114,30, kVerbGive,'g',0, 12,13,0}, {kPanelButtonVerb, 223,76, 114,30, kVerbIHNMGive,'g',0, 12,13,0},
{kPanelButtonVerb, 223,108, 114,30, kVerbPush,'p',0, 14,15,0}, {kPanelButtonVerb, 223,108, 114,30, kVerbIHNMPush,'p',0, 14,15,0},
{kPanelButtonArrow, 606,22, 20,25, -1,'[',0, 0,0,0}, //TODO: arrow Sprite Numbers {kPanelButtonArrow, 606,22, 20,25, -1,'[',0, 0,0,0}, //TODO: arrow Sprite Numbers
{kPanelButtonArrow, 606,108, 20,25, 1,']',0, 0,0,0}, {kPanelButtonArrow, 606,108, 20,25, 1,']',0, 0,0,0},

View file

@ -97,6 +97,7 @@ int SagaEngine::processInput() {
_render->toggleFlag(RF_ACTOR_PATH_TEST); _render->toggleFlag(RF_ACTOR_PATH_TEST);
break; break;
case 288: // F7 case 288: // F7
//_actor->frameTest();
break; break;
case 289: // F8 case 289: // F8
break; break;

View file

@ -50,7 +50,7 @@
namespace Saga { namespace Saga {
static int verbTypeToTextStringsIdLUT[2][kVerbTypesMax] = { static int verbTypeToTextStringsIdLUT[2][kVerbTypeIdsMax] = {
{-1, {-1,
kTextPickUp, kTextPickUp,
kTextLookAt, kTextLookAt,
@ -64,12 +64,17 @@ static int verbTypeToTextStringsIdLUT[2][kVerbTypesMax] = {
-1, -1,
-1, -1,
-1, -1,
-1,
-1,
-1,
-1, -1,
-1}, -1},
{-1, -1, 2, 1, 5, -1, -1, 7, 4, -1, -1, -1, -1, -1, -1, 3, 6, 8} {-1,
3, //TODO:check
2,
1,
5,
6, //TODO:check
8, //TODO:check
7,
4}
}; };
Interface::Interface(SagaEngine *vm) : _vm(vm) { Interface::Interface(SagaEngine *vm) : _vm(vm) {
@ -86,7 +91,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) {
_mainPanel.buttons = _vm->getDisplayInfo().mainPanelButtons; _mainPanel.buttons = _vm->getDisplayInfo().mainPanelButtons;
_mainPanel.buttonsCount = _vm->getDisplayInfo().mainPanelButtonsCount; _mainPanel.buttonsCount = _vm->getDisplayInfo().mainPanelButtonsCount;
for (i = 0; i < kVerbTypesMax; i++) { for (i = 0; i < kVerbTypeIdsMax; i++) {
_verbTypeToPanelButton[i] = NULL; _verbTypeToPanelButton[i] = NULL;
} }
@ -632,7 +637,7 @@ void Interface::draw() {
_mainPanel.getRect(rect); _mainPanel.getRect(rect);
backBuffer->blit(rect, _mainPanel.image); backBuffer->blit(rect, _mainPanel.image);
for (i = 0; i < kVerbTypesMax; i++) { for (i = 0; i < kVerbTypeIdsMax; i++) {
if (_verbTypeToPanelButton[i] != NULL) { if (_verbTypeToPanelButton[i] != NULL) {
drawVerbPanel(backBuffer, _verbTypeToPanelButton[i]); drawVerbPanel(backBuffer, _verbTypeToPanelButton[i]);
} }
@ -681,6 +686,7 @@ void Interface::draw() {
void Interface::calcOptionSaveSlider() { void Interface::calcOptionSaveSlider() {
int totalFiles = _vm->getSaveFilesCount(); int totalFiles = _vm->getSaveFilesCount();
int visibleFiles = _vm->getDisplayInfo().optionSaveFileVisible; int visibleFiles = _vm->getDisplayInfo().optionSaveFileVisible;
if (_optionSaveFileSlider == NULL) return; //TODO:REMOVE
int height = _optionSaveFileSlider->height; int height = _optionSaveFileSlider->height;
int sliderHeight; int sliderHeight;
int pos; int pos;
@ -750,6 +756,7 @@ void Interface::drawOption() {
Rect rect2; Rect rect2;
PanelButton *panelButton; PanelButton *panelButton;
Point textPoint; Point textPoint;
if (_optionSaveFileSlider == NULL) return;//TODO:REMOVE
backBuffer = _vm->_gfx->getBackBuffer(); backBuffer = _vm->_gfx->getBackBuffer();
@ -1186,6 +1193,7 @@ void Interface::handleOptionUpdate(const Point& mousePoint) {
bool releasedButton; bool releasedButton;
if (_vm->mouseButtonPressed()) { if (_vm->mouseButtonPressed()) {
if (_optionSaveFileSlider != NULL) //TODO:REMOVE
if (_optionSaveFileSlider->state > 0) { if (_optionSaveFileSlider->state > 0) {
_optionPanel.calcPanelButtonRect(_optionSaveFileSlider, rect); _optionPanel.calcPanelButtonRect(_optionSaveFileSlider, rect);
@ -1314,7 +1322,7 @@ void Interface::handleChapterSelectionClick(const Point& mousePoint) {
event.time = 0; event.time = 0;
event.param = _vm->_scene->getScriptModuleNumber(); event.param = _vm->_scene->getScriptModuleNumber();
event.param2 = script; event.param2 = script;
event.param3 = kVerbUse; // Action event.param3 = _vm->_script->getVerbType(kVerbUse); // Action
event.param4 = obj; // Object event.param4 = obj; // Object
event.param5 = 0; // With Object event.param5 = 0; // With Object
event.param6 = obj; // Actor event.param6 = obj; // Actor
@ -1782,6 +1790,7 @@ void Interface::drawInventory(Surface *backBuffer) {
void Interface::setVerbState(int verb, int state) { void Interface::setVerbState(int verb, int state) {
PanelButton * panelButton = getPanelButtonByVerbType(verb); PanelButton * panelButton = getPanelButtonByVerbType(verb);
if (panelButton == NULL) return;
if (state == 2) { if (state == 2) {
state = (_mainPanel.currentButton == panelButton) ? 1 : 0; state = (_mainPanel.currentButton == panelButton) ? 1 : 0;
} }

View file

@ -358,7 +358,7 @@ public:
private: private:
void converseDisplayTextLines(Surface *ds); void converseDisplayTextLines(Surface *ds);
PanelButton *getPanelButtonByVerbType(int verb) { PanelButton *getPanelButtonByVerbType(int verb) {
if ((verb < 0) || (verb >= kVerbTypesMax)) { if ((verb < 0) || (verb >= kVerbTypeIdsMax)) {
error("Interface::getPanelButtonByVerbType wrong verb"); error("Interface::getPanelButtonByVerbType wrong verb");
} }
return _verbTypeToPanelButton[verb]; return _verbTypeToPanelButton[verb];
@ -393,7 +393,7 @@ private:
PanelButton *_converseUpButton; PanelButton *_converseUpButton;
PanelButton *_converseDownButton; PanelButton *_converseDownButton;
SpriteList _scenePortraits; SpriteList _scenePortraits;
PanelButton *_verbTypeToPanelButton[kVerbTypesMax]; PanelButton *_verbTypeToPanelButton[kVerbTypeIdsMax];
InterfacePanel _optionPanel; InterfacePanel _optionPanel;
PanelButton * _optionSaveFileSlider; PanelButton * _optionSaveFileSlider;
PanelButton * _optionSaveFilePanel; PanelButton * _optionSaveFilePanel;

View file

@ -260,7 +260,7 @@ int SagaEngine::init(GameDetector &detector) {
} }
_interface->converseInit(); _interface->converseInit();
_script->setVerb(kVerbWalkTo); _script->setVerb(_script->getVerbType(kVerbWalkTo));
_music->setVolume(-1, 1); _music->setVolume(-1, 1);
@ -417,27 +417,26 @@ const char *SagaEngine::getTextString(int textStringId) {
void SagaEngine::getExcuseInfo(int verb, const char *&textString, int &soundResourceId) { void SagaEngine::getExcuseInfo(int verb, const char *&textString, int &soundResourceId) {
textString = NULL; textString = NULL;
switch (verb) {
case kVerbPickUp: if (verb == _script->getVerbType(kVerbPickUp)) {
textString = getTextString(kTextICantPickup); textString = getTextString(kTextICantPickup);
soundResourceId = RID_BOAR_VOICE_007; soundResourceId = RID_BOAR_VOICE_007;
break; } else
case kVerbLookAt: if (verb == _script->getVerbType(kVerbLookAt)) {
textString = getTextString(kTextNothingSpecial); textString = getTextString(kTextNothingSpecial);
soundResourceId = RID_BOAR_VOICE_006; soundResourceId = RID_BOAR_VOICE_006;
break; }
case kVerbOpen: if (verb == _script->getVerbType(kVerbOpen)) {
textString = getTextString(kTextNoPlaceToOpen); textString = getTextString(kTextNoPlaceToOpen);
soundResourceId = RID_BOAR_VOICE_000; soundResourceId = RID_BOAR_VOICE_000;
break; }
case kVerbClose: if (verb == _script->getVerbType(kVerbClose)) {
textString = getTextString(kTextNoOpening); textString = getTextString(kTextNoOpening);
soundResourceId = RID_BOAR_VOICE_002; soundResourceId = RID_BOAR_VOICE_002;
break; }
case kVerbUse: if (verb == _script->getVerbType(kVerbUse)) {
textString = getTextString(kTextDontKnow); textString = getTextString(kTextDontKnow);
soundResourceId = RID_BOAR_VOICE_005; soundResourceId = RID_BOAR_VOICE_005;
break;
} }
} }

View file

@ -620,7 +620,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) {
_inGame = true; _inGame = true;
_vm->_script->setVerb(kVerbWalkTo); _vm->_script->setVerb(_vm->_script->getVerbType(kVerbWalkTo));
if (loadSceneParams->sceneDescriptor == -2) { if (loadSceneParams->sceneDescriptor == -2) {
return; return;
@ -859,7 +859,7 @@ void Scene::loadScene(LoadSceneParams *loadSceneParams) {
event.time = 0; event.time = 0;
event.param = _sceneDescription.scriptModuleNumber; event.param = _sceneDescription.scriptModuleNumber;
event.param2 = _sceneDescription.sceneScriptEntrypointNumber; event.param2 = _sceneDescription.sceneScriptEntrypointNumber;
event.param3 = kVerbEnter; // Action event.param3 = _vm->_script->getVerbType(kVerbEnter); // Action
event.param4 = _sceneNumber; // Object event.param4 = _sceneNumber; // Object
event.param5 = loadSceneParams->actorsEntrance; // With Object event.param5 = loadSceneParams->actorsEntrance; // With Object
event.param6 = 0; // Actor event.param6 = 0; // Actor

View file

@ -40,6 +40,8 @@
namespace Saga { namespace Saga {
// Initializes the scripting module. // Initializes the scripting module.
// Loads script resource look-up table, initializes script data system // Loads script resource look-up table, initializes script data system
Script::Script(SagaEngine *vm) : _vm(vm) { Script::Script(SagaEngine *vm) : _vm(vm) {
@ -58,11 +60,11 @@ Script::Script(SagaEngine *vm) : _vm(vm) {
_firstObjectSet = false; _firstObjectSet = false;
_secondObjectNeeded = false; _secondObjectNeeded = false;
_pendingVerb = kVerbNone; _pendingVerb = getVerbType(kVerbNone);
_currentVerb = kVerbNone; _currentVerb = getVerbType(kVerbNone);
_stickyVerb = kVerbWalkTo; _stickyVerb = getVerbType(kVerbWalkTo);
_leftButtonVerb = kVerbNone; _leftButtonVerb = getVerbType(kVerbNone);
_rightButtonVerb = kVerbNone; _rightButtonVerb = getVerbType(kVerbNone);
_pointerObject = ID_NOTHING; _pointerObject = ID_NOTHING;
_staticSize = 0; _staticSize = 0;
@ -279,7 +281,7 @@ void Script::showVerb(int statusColor) {
const char *object2Name; const char *object2Name;
char statusString[STATUS_TEXT_LEN]; char statusString[STATUS_TEXT_LEN];
if (_leftButtonVerb == kVerbNone) { if (_leftButtonVerb == getVerbType(kVerbNone)) {
_vm->_interface->setStatusText(""); _vm->_interface->setStatusText("");
return; return;
} }
@ -306,11 +308,11 @@ void Script::showVerb(int statusColor) {
object2Name = ""; object2Name = "";
} }
if (_leftButtonVerb == kVerbGive) { if (_leftButtonVerb == getVerbType(kVerbGive)) {
snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextGiveTo), object1Name, object2Name); snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextGiveTo), object1Name, object2Name);
_vm->_interface->setStatusText(statusString, statusColor); _vm->_interface->setStatusText(statusString, statusColor);
} else { } else {
if (_leftButtonVerb == kVerbUse) { if (_leftButtonVerb == getVerbType(kVerbUse)) {
snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextUseWidth), object1Name, object2Name); snprintf(statusString, STATUS_TEXT_LEN, _vm->getTextString(kTextUseWidth), object1Name, object2Name);
_vm->_interface->setStatusText(statusString, statusColor); _vm->_interface->setStatusText(statusString, statusColor);
} else { } else {
@ -320,6 +322,70 @@ void Script::showVerb(int statusColor) {
} }
} }
int Script::getVerbType(VerbTypes verbType) {
if (_vm->getGameType() == GType_ITE) {
switch (verbType) {
case kVerbNone:
return kVerbITENone;
case kVerbWalkTo:
return kVerbITEWalkTo;
case kVerbGive:
return kVerbITEGive;
case kVerbUse:
return kVerbITEUse;
case kVerbEnter:
return kVerbITEEnter;
case kVerbLookAt:
return kVerbITELookAt;
case kVerbPickUp:
return kVerbITEPickUp;
case kVerbOpen:
return kVerbITEOpen;
case kVerbClose:
return kVerbITEClose;
case kVerbTalkTo:
return kVerbITETalkTo;
case kVerbWalkOnly:
return kVerbITEWalkOnly;
case kVerbLookOnly:
return kVerbITELookOnly;
case kVerbOptions:
return kVerbITEOptions;
}
}
else {
switch (verbType) {
case kVerbNone:
return kVerbIHNMNone;
case kVerbWalkTo:
return kVerbIHNMWalk;
case kVerbGive:
return kVerbIHNMGive;
case kVerbUse:
return kVerbIHNMUse;
case kVerbEnter:
return kVerbIHNMEnter;
case kVerbLookAt:
return kVerbIHNMLookAt;
case kVerbPickUp:
return kVerbIHNMTake;
case kVerbOpen:
return -2;
case kVerbClose:
return -2;
case kVerbTalkTo:
return kVerbIHNMTalkTo;
case kVerbWalkOnly:
return kVerbIHNMWalkOnly;
case kVerbLookOnly:
return kVerbIHNMLookOnly;
case kVerbOptions:
return kVerbIHNMOptions;
}
}
error("Script::getVerbType() unknown verb type %d", verbType);
}
void Script::setVerb(int verb) { void Script::setVerb(int verb) {
_pendingObject[0] = ID_NOTHING; _pendingObject[0] = ID_NOTHING;
_currentObject[0] = ID_NOTHING; _currentObject[0] = ID_NOTHING;
@ -343,10 +409,10 @@ void Script::setLeftButtonVerb(int verb) {
_currentVerb = _leftButtonVerb = verb; _currentVerb = _leftButtonVerb = verb;
if ((_currentVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){ if ((_currentVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
if (oldVerb > kVerbNone) if (oldVerb > getVerbType(kVerbNone))
_vm->_interface->setVerbState(oldVerb, 2); _vm->_interface->setVerbState(oldVerb, 2);
if (_currentVerb > kVerbNone) if (_currentVerb > getVerbType(kVerbNone))
_vm->_interface->setVerbState(_currentVerb, 2); _vm->_interface->setVerbState(_currentVerb, 2);
} }
} }
@ -357,10 +423,10 @@ void Script::setRightButtonVerb(int verb) {
_rightButtonVerb = verb; _rightButtonVerb = verb;
if ((_rightButtonVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){ if ((_rightButtonVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
if (oldVerb > kVerbNone) if (oldVerb > getVerbType(kVerbNone))
_vm->_interface->setVerbState(oldVerb, 2); _vm->_interface->setVerbState(oldVerb, 2);
if (_rightButtonVerb > kVerbNone) if (_rightButtonVerb > getVerbType(kVerbNone))
_vm->_interface->setVerbState(_rightButtonVerb, 2); _vm->_interface->setVerbState(_rightButtonVerb, 2);
} }
} }
@ -376,7 +442,7 @@ void Script::doVerb() {
objectType = objectTypeId(_pendingObject[0]); objectType = objectTypeId(_pendingObject[0]);
if (_pendingVerb == kVerbGive) { if (_pendingVerb == getVerbType(kVerbGive)) {
scriptEntrypointNumber = _vm->_actor->getObjectScriptEntrypointNumber(_pendingObject[1]); scriptEntrypointNumber = _vm->_actor->getObjectScriptEntrypointNumber(_pendingObject[1]);
if (_vm->_actor->getObjectFlags(_pendingObject[1]) & (kFollower|kProtagonist|kExtended)) { if (_vm->_actor->getObjectFlags(_pendingObject[1]) & (kFollower|kProtagonist|kExtended)) {
scriptModuleNumber = 0; scriptModuleNumber = 0;
@ -384,7 +450,7 @@ void Script::doVerb() {
scriptModuleNumber = _vm->_scene->getScriptModuleNumber(); scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
} }
} else { } else {
if (_pendingVerb == kVerbUse) { if (_pendingVerb == getVerbType(kVerbUse)) {
if ((objectTypeId(_pendingObject[1]) > kGameObjectNone) && (objectType < objectTypeId(_pendingObject[1]))) { if ((objectTypeId(_pendingObject[1]) > kGameObjectNone) && (objectType < objectTypeId(_pendingObject[1]))) {
SWAP(_pendingObject[0], _pendingObject[1]); SWAP(_pendingObject[0], _pendingObject[1]);
objectType = objectTypeId(_pendingObject[0]); objectType = objectTypeId(_pendingObject[0]);
@ -436,11 +502,11 @@ void Script::doVerb() {
} }
} }
if ((_currentVerb == kVerbWalkTo) || (_currentVerb == kVerbLookAt)) { if ((_currentVerb == getVerbType(kVerbWalkTo)) || (_currentVerb == getVerbType(kVerbLookAt))) {
_stickyVerb = _currentVerb; _stickyVerb = _currentVerb;
} }
_pendingVerb = kVerbNone; _pendingVerb = getVerbType(kVerbNone);
_currentObject[0] = _currentObject[1] = ID_NOTHING; _currentObject[0] = _currentObject[1] = ID_NOTHING;
setLeftButtonVerb(_stickyVerb); setLeftButtonVerb(_stickyVerb);
@ -458,7 +524,7 @@ void Script::hitObject(bool leftButton) {
int verb; int verb;
verb = leftButton ? _leftButtonVerb : _rightButtonVerb; verb = leftButton ? _leftButtonVerb : _rightButtonVerb;
if (verb > kVerbNone) { if (verb > getVerbType(kVerbNone)) {
if (_firstObjectSet) { if (_firstObjectSet) {
if (_secondObjectNeeded) { if (_secondObjectNeeded) {
_pendingObject[0] = _currentObject[0]; _pendingObject[0] = _currentObject[0];
@ -466,7 +532,7 @@ void Script::hitObject(bool leftButton) {
_pendingVerb = verb; _pendingVerb = verb;
_leftButtonVerb = verb; _leftButtonVerb = verb;
if (_pendingVerb > kVerbNone) if (_pendingVerb > getVerbType(kVerbNone))
showVerb(kITEColorBrightWhite); showVerb(kITEColorBrightWhite);
else else
showVerb(); showVerb();
@ -476,10 +542,10 @@ void Script::hitObject(bool leftButton) {
return; return;
} }
} else { } else {
if (verb == kVerbGive) { if (verb == getVerbType(kVerbGive)) {
_secondObjectNeeded = true; _secondObjectNeeded = true;
} else { } else {
if (verb == kVerbUse) { if (verb == getVerbType(kVerbUse)) {
if (_currentObjectFlags[0] & kObjUseWith) { if (_currentObjectFlags[0] & kObjUseWith) {
_secondObjectNeeded = true; _secondObjectNeeded = true;
@ -500,7 +566,7 @@ void Script::hitObject(bool leftButton) {
} }
_leftButtonVerb = verb; _leftButtonVerb = verb;
if (_pendingVerb > kVerbNone) if (_pendingVerb > getVerbType(kVerbNone))
showVerb(kITEColorBrightWhite); showVerb(kITEColorBrightWhite);
else else
showVerb(); showVerb();
@ -521,8 +587,8 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
(_vm->_actor->_protagonist->_currentAction != kActionWalkToPoint)) { (_vm->_actor->_protagonist->_currentAction != kActionWalkToPoint)) {
return; return;
} }
if (_pendingVerb > kVerbNone) { if (_pendingVerb > getVerbType(kVerbNone)) {
setLeftButtonVerb(kVerbWalkTo); setLeftButtonVerb(getVerbType(kVerbWalkTo));
} }
if (_pointerObject != ID_NOTHING) { if (_pointerObject != ID_NOTHING) {
@ -530,7 +596,7 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
} else { } else {
_pendingObject[0] = ID_NOTHING; _pendingObject[0] = ID_NOTHING;
_pendingObject[1] = ID_NOTHING; _pendingObject[1] = ID_NOTHING;
_pendingVerb = kVerbWalkTo; _pendingVerb = getVerbType(kVerbWalkTo);
} }
@ -547,7 +613,7 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
if (objectTypeId(_pendingObject[0]) == kGameObjectHitZone) { if (objectTypeId(_pendingObject[0]) == kGameObjectHitZone) {
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0])); hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
} else { } else {
if ((_pendingVerb == kVerbUse) && (objectTypeId(_pendingObject[1]) == kGameObjectHitZone)) { if ((_pendingVerb == getVerbType(kVerbUse)) && (objectTypeId(_pendingObject[1]) == kGameObjectHitZone)) {
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[1])); hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[1]));
} }
} }
@ -577,27 +643,25 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
} }
} }
switch (_pendingVerb) { if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
case kVerbWalkTo: (_pendingVerb == getVerbType(kVerbPickUp)) ||
case kVerbPickUp: (_pendingVerb == getVerbType(kVerbOpen)) ||
case kVerbOpen: (_pendingVerb == getVerbType(kVerbClose)) ||
case kVerbClose: (_pendingVerb == getVerbType(kVerbUse))) {
case kVerbUse:
_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation); _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
break; } else {
if (_pendingVerb == getVerbType(kVerbLookAt)) {
case kVerbLookAt:
if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) { if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation); _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
} else { } else {
doVerb(); doVerb();
} }
break; } else {
if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
case kVerbTalkTo: (_pendingVerb == getVerbType(kVerbGive))) {
case kVerbGive:
doVerb(); doVerb();
break; }
}
} }
} }
@ -617,7 +681,7 @@ void Script::whichObject(const Point& mousePoint) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
objectFlags = 0; objectFlags = 0;
_leftButtonVerb = _currentVerb; _leftButtonVerb = _currentVerb;
newRightButtonVerb = kVerbNone; newRightButtonVerb = getVerbType(kVerbNone);
if (_vm->_actor->_protagonist->_currentAction != kActionWalkDir) { if (_vm->_actor->_protagonist->_currentAction != kActionWalkDir) {
if (_vm->_scene->getHeight() >= mousePoint.y) { if (_vm->_scene->getHeight() >= mousePoint.y) {
@ -627,9 +691,9 @@ void Script::whichObject(const Point& mousePoint) {
if (objectTypeId(newObjectId) == kGameObjectObject) { if (objectTypeId(newObjectId) == kGameObjectObject) {
objectId = newObjectId; objectId = newObjectId;
objectFlags = 0; objectFlags = 0;
newRightButtonVerb = kVerbLookAt; newRightButtonVerb = getVerbType(kVerbLookAt);
if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) { if ((_currentVerb == getVerbType(kVerbTalkTo)) || ((_currentVerb == getVerbType(kVerbGive)) && _firstObjectSet)) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
newObjectId = ID_NOTHING; newObjectId = ID_NOTHING;
} }
@ -637,13 +701,13 @@ void Script::whichObject(const Point& mousePoint) {
actor = _vm->_actor->getActor(newObjectId); actor = _vm->_actor->getActor(newObjectId);
objectId = newObjectId; objectId = newObjectId;
objectFlags = kObjUseWith; objectFlags = kObjUseWith;
newRightButtonVerb = kVerbTalkTo; newRightButtonVerb = getVerbType(kVerbTalkTo);
if ((_currentVerb == kVerbPickUp) || if ((_currentVerb == getVerbType(kVerbPickUp)) ||
(_currentVerb == kVerbOpen) || (_currentVerb == getVerbType(kVerbOpen)) ||
(_currentVerb == kVerbClose) || (_currentVerb == getVerbType(kVerbClose)) ||
((_currentVerb == kVerbGive) && !_firstObjectSet) || ((_currentVerb == getVerbType(kVerbGive)) && !_firstObjectSet) ||
((_currentVerb == kVerbUse) && !(actor->_flags & kFollower))) { ((_currentVerb == getVerbType(kVerbUse)) && !(actor->_flags & kFollower))) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
newObjectId = ID_NOTHING; newObjectId = ID_NOTHING;
} }
@ -668,38 +732,41 @@ void Script::whichObject(const Point& mousePoint) {
objectFlags = 0; objectFlags = 0;
newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f; newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
if (newRightButtonVerb == kVerbWalkOnly) { if (_vm->getGameType() == GType_ITE) {
if (newRightButtonVerb == getVerbType(kVerbWalkOnly)) {
if (_firstObjectSet) { if (_firstObjectSet) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
} else { } else {
newRightButtonVerb = _leftButtonVerb = kVerbWalkTo; newRightButtonVerb = _leftButtonVerb = getVerbType(kVerbWalkTo);
} }
} else { } else {
if (newRightButtonVerb == kVerbLookOnly) { if (newRightButtonVerb == getVerbType(kVerbLookOnly)) {
if (_firstObjectSet) { if (_firstObjectSet) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
} else { } else {
newRightButtonVerb = _leftButtonVerb = kVerbLookAt; newRightButtonVerb = _leftButtonVerb = getVerbType(kVerbLookAt);
} }
} }
} }
if (newRightButtonVerb >= kVerbOptions) { if (newRightButtonVerb >= getVerbType(kVerbOptions)) {
newRightButtonVerb = kVerbNone; newRightButtonVerb = getVerbType(kVerbNone);
}
} }
if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) { if ((_currentVerb == getVerbType(kVerbTalkTo)) || ((_currentVerb == getVerbType(kVerbGive)) && _firstObjectSet)) {
objectId = ID_NOTHING; objectId = ID_NOTHING;
newObjectId = ID_NOTHING; newObjectId = ID_NOTHING;
} }
if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) { if ((_leftButtonVerb == getVerbType(kVerbUse)) && (hitZone->getRightButtonVerb() & 0x80)) {
objectFlags = kObjUseWith; objectFlags = kObjUseWith;
} }
} }
} }
} else { } else {
if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) { if ((_currentVerb == getVerbType(kVerbTalkTo)) || ((_currentVerb == getVerbType(kVerbGive)) && _firstObjectSet)) {
// no way // no way
} else { } else {
panelButton = _vm->_interface->inventoryHitTest(mousePoint); panelButton = _vm->_interface->inventoryHitTest(mousePoint);
@ -707,7 +774,7 @@ void Script::whichObject(const Point& mousePoint) {
objectId = _vm->_interface->getInventoryContentByPanelButton(panelButton); objectId = _vm->_interface->getInventoryContentByPanelButton(panelButton);
if (objectId != 0) { if (objectId != 0) {
obj = _vm->_actor->getObj(objectId); obj = _vm->_actor->getObj(objectId);
newRightButtonVerb = kVerbLookAt; newRightButtonVerb = getVerbType(kVerbLookAt);
if (obj->_interactBits & kObjUseWith) { if (obj->_interactBits & kObjUseWith) {
objectFlags = kObjUseWith; objectFlags = kObjUseWith;
} }
@ -715,8 +782,8 @@ void Script::whichObject(const Point& mousePoint) {
} }
} }
if ((_currentVerb == kVerbPickUp) || (_currentVerb == kVerbTalkTo) || (_currentVerb == kVerbWalkTo)) { if ((_currentVerb == getVerbType(kVerbPickUp)) || (_currentVerb == getVerbType(kVerbTalkTo)) || (_currentVerb == getVerbType(kVerbWalkTo))) {
_leftButtonVerb = kVerbLookAt; _leftButtonVerb = getVerbType(kVerbLookAt);
} }
} }
} }
@ -725,7 +792,7 @@ void Script::whichObject(const Point& mousePoint) {
_pointerObject = objectId; _pointerObject = objectId;
_currentObject[_firstObjectSet ? 1 : 0] = objectId; _currentObject[_firstObjectSet ? 1 : 0] = objectId;
_currentObjectFlags[_firstObjectSet ? 1 : 0] = objectFlags; _currentObjectFlags[_firstObjectSet ? 1 : 0] = objectFlags;
if (_pendingVerb == kVerbNone) { if (_pendingVerb == getVerbType(kVerbNone)) {
showVerb(); showVerb();
} }
} }

View file

@ -55,30 +55,26 @@ enum AddressTypes {
kAddressIndex = 7 // index from id*/ kAddressIndex = 7 // index from id*/
}; };
enum VerbTypes { enum VerbTypeIds {
kVerbNone = 0, kVerbITENone = 0,
kVerbPickUp = 1, kVerbITEPickUp = 1,
kVerbLookAt = 2, kVerbITELookAt = 2,
kVerbWalkTo = 3, kVerbITEWalkTo = 3,
kVerbTalkTo = 4, kVerbITETalkTo = 4,
kVerbOpen = 5, kVerbITEOpen = 5,
kVerbClose = 6, kVerbITEClose = 6,
kVerbGive = 7, kVerbITEGive = 7,
kVerbUse = 8, kVerbITEUse = 8,
kVerbOptions = 9, kVerbITEOptions = 9,
kVerbEnter = 10, kVerbITEEnter = 10,
kVerbLeave = 11, kVerbITELeave = 11,
kVerbBegin = 12, kVerbITEBegin = 12,
kVerbWalkOnly = 13, kVerbITEWalkOnly = 13,
kVerbLookOnly = 14, kVerbITELookOnly = 14,
//additional IHNM
kVerbTake = 15,
kVerbSwallow = 16,
kVerbPush = 17,
/*
kVerbIHNMNone = 0, kVerbIHNMNone = 0,
kVerbIHNMWalkTo = 1, kVerbIHNMWalk = 1,
kVerbIHNMLookAt = 2, kVerbIHNMLookAt = 2,
kVerbIHNMTake = 3, kVerbIHNMTake = 3,
kVerbIHNMUse = 4, kVerbIHNMUse = 4,
@ -86,8 +82,30 @@ enum VerbTypes {
kVerbIHNMSwallow = 6, kVerbIHNMSwallow = 6,
kVerbIHNMGive = 7, kVerbIHNMGive = 7,
kVerbIHNMPush = 8, kVerbIHNMPush = 8,
*/ kVerbIHNMOptions = 9,
kVerbTypesMax = kVerbPush + 1 kVerbIHNMEnter = 10,
kVerbIHNMLeave = 11,
kVerbIHNMBegin = 12,
kVerbIHNMWalkOnly = 13,
kVerbIHNMLookOnly = 14,
kVerbTypeIdsMax = kVerbITELookOnly + 1
};
enum VerbTypes {
kVerbNone,
kVerbWalkTo,
kVerbGive,
kVerbUse,
kVerbEnter,
kVerbLookAt,
kVerbPickUp,
kVerbOpen,
kVerbClose,
kVerbTalkTo,
kVerbWalkOnly,
kVerbLookOnly,
kVerbOptions
}; };
#define STHREAD_TIMESLICE 8 #define STHREAD_TIMESLICE 8
@ -379,15 +397,16 @@ public:
void setRightButtonVerb(int verb); void setRightButtonVerb(int verb);
int getRightButtonVerb() const { return _rightButtonVerb; } int getRightButtonVerb() const { return _rightButtonVerb; }
void setNonPlayfieldVerb() { void setNonPlayfieldVerb() {
setRightButtonVerb(kVerbNone); setRightButtonVerb(getVerbType(kVerbNone));
_pointerObject = ID_NOTHING; _pointerObject = ID_NOTHING;
_currentObject[_firstObjectSet ? 1 : 0] = ID_NOTHING; _currentObject[_firstObjectSet ? 1 : 0] = ID_NOTHING;
} }
void setNoPendingVerb() { void setNoPendingVerb() {
_pendingVerb = kVerbNone; _pendingVerb = getVerbType(kVerbNone);
_currentObject[0] = _currentObject[0] = ID_NOTHING; _currentObject[0] = _currentObject[0] = ID_NOTHING;
setPointerVerb(); setPointerVerb();
} }
int getVerbType(VerbTypes verbType);
private: private:
// When reading or writing data to the common buffer, we have to use a // When reading or writing data to the common buffer, we have to use a

View file

@ -566,7 +566,7 @@ void Script::sfScriptGotoScene(SCRIPTFUNC_PARAMS) {
_vm->_scene->changeScene(sceneNumber, entrance, (sceneNumber == ITE_SCENE_ENDCREDIT1) ? kTransitionFade : kTransitionNoFade); _vm->_scene->changeScene(sceneNumber, entrance, (sceneNumber == ITE_SCENE_ENDCREDIT1) ? kTransitionFade : kTransitionNoFade);
//TODO: placard stuff //TODO: placard stuff
_pendingVerb = kVerbNone; _pendingVerb = _vm->_script->getVerbType(kVerbNone);
_currentObject[0] = _currentObject[1] = ID_NOTHING; _currentObject[0] = _currentObject[1] = ID_NOTHING;
showVerb(); showVerb();
} }
@ -1108,7 +1108,7 @@ void Script::sfPlaceActor(SCRIPTFUNC_PARAMS) {
actor->_facingDirection = actor->_actionDirection = actorDirection; actor->_facingDirection = actor->_actionDirection = actorDirection;
if (!actor->_frames) if (!actor->_frames)
_vm->_actor->loadActorResources(actor); _vm->_actor->loadActorResources(actor); //? is not it already loaded ?
if (frameType >= 0) { if (frameType >= 0) {
frameRange = _vm->_actor->getActorFrameRange(actorId, frameType); frameRange = _vm->_actor->getActorFrameRange(actorId, frameType);