aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTobias Gunkel2012-01-10 23:17:40 +0100
committerTobias Gunkel2012-02-11 08:28:33 +0100
commite14bc5fd6d9df5157c841683e6e02f8d25cd8a2c (patch)
tree97dffac49a01e965c73c76e7863d3b1c396798eb /engines
parent8392d23e6bf740fb336cc98e0bbee8882108503a (diff)
downloadscummvm-rg350-e14bc5fd6d9df5157c841683e6e02f8d25cd8a2c.tar.gz
scummvm-rg350-e14bc5fd6d9df5157c841683e6e02f8d25cd8a2c.tar.bz2
scummvm-rg350-e14bc5fd6d9df5157c841683e6e02f8d25cd8a2c.zip
SCUMM: improve verb and sentence handling
- execute sentence if verb was clicked twice - reuse the first object if a new verb is selected (but no preposition is used yet)
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/scumm_v0.h1
-rw-r--r--engines/scumm/verbs.cpp52
2 files changed, 38 insertions, 15 deletions
diff --git a/engines/scumm/scumm_v0.h b/engines/scumm/scumm_v0.h
index 78449eaa57..c2af6d4c5f 100644
--- a/engines/scumm/scumm_v0.h
+++ b/engines/scumm/scumm_v0.h
@@ -97,6 +97,7 @@ protected:
virtual void runSentenceScript();
virtual void checkAndRunSentenceScript();
+ bool checkSentenceComplete();
virtual void checkExecVerbs();
virtual void handleMouseOver(bool updateInventory);
int verbPrepIdType(int verbid);
diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp
index cb8148d81b..74ff27c483 100644
--- a/engines/scumm/verbs.cpp
+++ b/engines/scumm/verbs.cpp
@@ -731,6 +731,14 @@ void ScummEngine_v0::verbExec() {
a->startWalkActor(VAR(6), VAR(7), -1);
}
+bool ScummEngine_v0::checkSentenceComplete() {
+ if (_activeVerb && _activeVerb != kVerbWalkTo && _activeVerb != kVerbWhatIs) {
+ if (_activeObjectNr && (!activeVerbPrep() || _activeObject2Nr))
+ return true;
+ }
+ return false;
+}
+
void ScummEngine_v0::checkExecVerbs() {
ActorC64 *a = (ActorC64 *)derefActor(VAR(VAR_EGO), "checkExecVerbs");
VirtScreen *zone = findVirtScreen(_mouse.y);
@@ -738,21 +746,28 @@ void ScummEngine_v0::checkExecVerbs() {
int sentenceLineChanged = false;
bool execute = false;
- /*
- if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
- return;
- */
+ //if (_userPut <= 0)
+ // return;
- // Check if mouse click
if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
int over = findVerbAtPos(_mouse.x, _mouse.y);
- if (over && _activeVerb != over) {
- _activeVerb = over;
- _activeObjectNr = 0;
- _activeObjectType = 0;
- _activeObject2Nr = 0;
- _activeObject2Type = 0;
- sentenceLineChanged = true;
+ // click region: verbs
+ if (over) {
+ if (_activeVerb != over) { // new verb
+ // keep first object if no preposition is used yet
+ if (activeVerbPrep()) {
+ _activeObjectNr = 0;
+ _activeObjectType = 0;
+ }
+ _activeObject2Nr = 0;
+ _activeObject2Type = 0;
+ _activeVerb = over;
+ sentenceLineChanged = true;
+ } else {
+ // execute sentence if complete
+ if (checkSentenceComplete())
+ execute = true;
+ }
}
}
@@ -770,6 +785,7 @@ void ScummEngine_v0::checkExecVerbs() {
if (_mouseAndKeyboardStat < MBS_MAX_KEY) {
// TODO: check keypresses
} else if ((_mouseAndKeyboardStat & MBS_MOUSE_MASK) || _activeVerb == kVerbWhatIs) {
+ // click region: sentence line
if (zone->number == kVerbVirtScreen && _mouse.y <= zone->topline + 8) {
if (_activeVerb == kVerbNewKid) {
if (_currentMode == kModeNormal) {
@@ -787,13 +803,18 @@ void ScummEngine_v0::checkExecVerbs() {
}
_activeVerb = kVerbWalkTo;
return;
- } else if (_activeVerb && _activeVerb != kVerbWalkTo && _activeVerb != kVerbWhatIs) {
- if (_activeObjectNr && (!activeVerbPrep() || _activeObject2Nr))
+ } else {
+ // execute sentence if complete
+ if (checkSentenceComplete())
execute = true;
}
- } else {
+ // click region: inventory or main screen
+ } else if ((zone->number == kVerbVirtScreen && _mouse.y > zone->topline + 32) ||
+ (zone->number == kMainVirtScreen))
+ {
int obj = 0;
+ // click region: inventory
if (zone->number == kVerbVirtScreen && _mouse.y > zone->topline + 32) {
// click into inventory
int invOff = _inventoryOffset;
@@ -802,6 +823,7 @@ void ScummEngine_v0::checkExecVerbs() {
// inventory position changed (arrows pressed, do nothing)
return;
}
+ // click region: main screen
} else if (zone->number == kMainVirtScreen) {
// click into main screen
if (_activeVerb == kVerbGive && _activeObjectNr) {