Refactored ScummEngine*::checkExecVerbs method
svn-id: r29284
This commit is contained in:
parent
61c96353cf
commit
3f958711a2
6 changed files with 73 additions and 18 deletions
|
@ -279,6 +279,7 @@ protected:
|
||||||
virtual void readMAXS(int blockSize);
|
virtual void readMAXS(int blockSize);
|
||||||
|
|
||||||
virtual void redrawBGAreas();
|
virtual void redrawBGAreas();
|
||||||
|
virtual void checkExecVerbs();
|
||||||
|
|
||||||
byte *defineArray(int array, int type, int dim2start, int dim2end, int dim1start, int dim1end);
|
byte *defineArray(int array, int type, int dim2start, int dim2end, int dim1start, int dim1end);
|
||||||
virtual int readArray(int array, int idx2, int idx1);
|
virtual int readArray(int array, int idx2, int idx1);
|
||||||
|
@ -359,6 +360,8 @@ protected:
|
||||||
byte VAR_NUM_CHARSETS;
|
byte VAR_NUM_CHARSETS;
|
||||||
|
|
||||||
byte VAR_POLYGONS_ONLY;
|
byte VAR_POLYGONS_ONLY;
|
||||||
|
|
||||||
|
byte VAR_MOUSE_STATE; // Used in checkExecVerbs();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ScummEngine_v80he : public ScummEngine_v72he {
|
class ScummEngine_v80he : public ScummEngine_v72he {
|
||||||
|
|
|
@ -90,6 +90,8 @@ void ScummEngine::parseEvents() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_game.heversion >= 80) {
|
if (_game.heversion >= 80) {
|
||||||
|
// FIXME: Move this code & VAR_KEY_STATE to class ScummEngine_v80he
|
||||||
|
|
||||||
// Keyboard is controlled via variable
|
// Keyboard is controlled via variable
|
||||||
int keyState = 0;
|
int keyState = 0;
|
||||||
|
|
||||||
|
|
|
@ -332,6 +332,7 @@ protected:
|
||||||
void setUserState(byte state);
|
void setUserState(byte state);
|
||||||
|
|
||||||
virtual void handleMouseOver(bool updateInventory);
|
virtual void handleMouseOver(bool updateInventory);
|
||||||
|
virtual void checkExecVerbs();
|
||||||
void initV2MouseOver();
|
void initV2MouseOver();
|
||||||
void initNESMouseOver();
|
void initNESMouseOver();
|
||||||
|
|
||||||
|
|
|
@ -443,7 +443,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
|
||||||
|
|
||||||
VAR_NUM_GLOBAL_OBJS = 0xFF;
|
VAR_NUM_GLOBAL_OBJS = 0xFF;
|
||||||
VAR_KEY_STATE = 0xFF;
|
VAR_KEY_STATE = 0xFF;
|
||||||
VAR_MOUSE_STATE = 0xFF;
|
|
||||||
|
|
||||||
// Use g_scumm from error() ONLY
|
// Use g_scumm from error() ONLY
|
||||||
g_scumm = this;
|
g_scumm = this;
|
||||||
|
@ -780,6 +779,7 @@ ScummEngine_v72he::ScummEngine_v72he(OSystem *syst, const DetectorResult &dr)
|
||||||
VAR_NUM_IMAGES = 0xFF;
|
VAR_NUM_IMAGES = 0xFF;
|
||||||
VAR_NUM_CHARSETS = 0xFF;
|
VAR_NUM_CHARSETS = 0xFF;
|
||||||
VAR_POLYGONS_ONLY = 0xFF;
|
VAR_POLYGONS_ONLY = 0xFF;
|
||||||
|
VAR_MOUSE_STATE = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScummEngine_v80he::ScummEngine_v80he(OSystem *syst, const DetectorResult &dr)
|
ScummEngine_v80he::ScummEngine_v80he(OSystem *syst, const DetectorResult &dr)
|
||||||
|
|
|
@ -1342,7 +1342,6 @@ public:
|
||||||
byte VAR_NUM_SCRIPT_CYCLES; // Used in runAllScripts()
|
byte VAR_NUM_SCRIPT_CYCLES; // Used in runAllScripts()
|
||||||
|
|
||||||
byte VAR_KEY_STATE; // Used in parseEvents()
|
byte VAR_KEY_STATE; // Used in parseEvents()
|
||||||
byte VAR_MOUSE_STATE; // Used in checkExecVerbs();
|
|
||||||
|
|
||||||
// Exists both in V7 and in V72HE:
|
// Exists both in V7 and in V72HE:
|
||||||
byte VAR_NUM_GLOBAL_OBJS;
|
byte VAR_NUM_GLOBAL_OBJS;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "scumm/actor.h"
|
#include "scumm/actor.h"
|
||||||
#include "scumm/charset.h"
|
#include "scumm/charset.h"
|
||||||
|
#include "scumm/he/intern_he.h"
|
||||||
#include "scumm/intern.h"
|
#include "scumm/intern.h"
|
||||||
#include "scumm/object.h"
|
#include "scumm/object.h"
|
||||||
#include "scumm/resource.h"
|
#include "scumm/resource.h"
|
||||||
|
@ -513,18 +514,25 @@ void ScummEngine_v0::handleMouseOver(bool updateInventory) {
|
||||||
drawSentence();
|
drawSentence();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine::checkExecVerbs() {
|
#ifndef DISABLE_HE
|
||||||
int i, over;
|
void ScummEngine_v72he::checkExecVerbs() {
|
||||||
VerbSlot *vs;
|
VAR(VAR_MOUSE_STATE) = 0;
|
||||||
|
|
||||||
if (VAR_MOUSE_STATE != 0xFF)
|
|
||||||
VAR(VAR_MOUSE_STATE) = 0;
|
|
||||||
|
|
||||||
if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
|
if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (VAR_MOUSE_STATE != 0xFF)
|
VAR(VAR_MOUSE_STATE) = _mouseAndKeyboardStat;
|
||||||
VAR(VAR_MOUSE_STATE) = _mouseAndKeyboardStat;
|
|
||||||
|
ScummEngine::checkExecVerbs();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ScummEngine::checkExecVerbs() {
|
||||||
|
int i, over;
|
||||||
|
VerbSlot *vs;
|
||||||
|
|
||||||
|
if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (_mouseAndKeyboardStat < MBS_MAX_KEY) {
|
if (_mouseAndKeyboardStat < MBS_MAX_KEY) {
|
||||||
/* Check keypresses */
|
/* Check keypresses */
|
||||||
|
@ -572,7 +580,7 @@ void ScummEngine::checkExecVerbs() {
|
||||||
if ((_game.platform == Common::kPlatformFMTowns && _game.id == GID_ZAK) &&
|
if ((_game.platform == Common::kPlatformFMTowns && _game.id == GID_ZAK) &&
|
||||||
(_mouseAndKeyboardStat >= 315 && _mouseAndKeyboardStat <= 318)) {
|
(_mouseAndKeyboardStat >= 315 && _mouseAndKeyboardStat <= 318)) {
|
||||||
// Hack: Handle switching to a person via F1-F4 keys.
|
// Hack: Handle switching to a person via F1-F4 keys.
|
||||||
// This feature isn't available in the scripts of the FM-TOWNS verison.
|
// This feature isn't available in the scripts of the FM-TOWNS version.
|
||||||
int fKey = _mouseAndKeyboardStat - 314;
|
int fKey = _mouseAndKeyboardStat - 314;
|
||||||
int switchSlot = getVerbSlot(36, 0);
|
int switchSlot = getVerbSlot(36, 0);
|
||||||
// check if switch-verb is enabled
|
// check if switch-verb is enabled
|
||||||
|
@ -590,25 +598,67 @@ void ScummEngine::checkExecVerbs() {
|
||||||
runInputScript(kKeyClickArea, _mouseAndKeyboardStat, 1);
|
runInputScript(kKeyClickArea, _mouseAndKeyboardStat, 1);
|
||||||
} else if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
|
} else if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
|
||||||
VirtScreen *zone = findVirtScreen(_mouse.y);
|
VirtScreen *zone = findVirtScreen(_mouse.y);
|
||||||
byte code = _mouseAndKeyboardStat & MBS_LEFT_CLICK ? 1 : 2;
|
const byte code = _mouseAndKeyboardStat & MBS_LEFT_CLICK ? 1 : 2;
|
||||||
int inventoryArea = (_game.platform == Common::kPlatformNES) ? 48: 32;
|
|
||||||
|
|
||||||
// This could be kUnkVirtScreen.
|
// This could be kUnkVirtScreen.
|
||||||
// Fixes bug #1536932: "MANIACNES: Crash on click in speechtext-area"
|
// Fixes bug #1536932: "MANIACNES: Crash on click in speechtext-area"
|
||||||
if (!zone)
|
if (!zone)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_game.version <= 2 && zone->number == kVerbVirtScreen && _mouse.y <= zone->topline + 8) {
|
over = findVerbAtPos(_mouse.x, _mouse.y);
|
||||||
|
if (over != 0) {
|
||||||
|
// Verb was clicked
|
||||||
|
runInputScript(kVerbClickArea, _verbs[over].verbid, code);
|
||||||
|
} else {
|
||||||
|
// Scene was clicked
|
||||||
|
runInputScript((zone->number == kMainVirtScreen) ? kSceneClickArea : kVerbClickArea, 0, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v2::checkExecVerbs() {
|
||||||
|
int i, over;
|
||||||
|
VerbSlot *vs;
|
||||||
|
|
||||||
|
if (_userPut <= 0 || _mouseAndKeyboardStat == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_mouseAndKeyboardStat < MBS_MAX_KEY) {
|
||||||
|
/* Check keypresses */
|
||||||
|
vs = &_verbs[1];
|
||||||
|
for (i = 1; i < _numVerbs; i++, vs++) {
|
||||||
|
if (vs->verbid && vs->saveid == 0 && vs->curmode == 1) {
|
||||||
|
if (_mouseAndKeyboardStat == vs->key) {
|
||||||
|
// Trigger verb as if the user clicked it
|
||||||
|
runInputScript(1, vs->verbid, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic keyboard input
|
||||||
|
runInputScript(4, _mouseAndKeyboardStat, 1);
|
||||||
|
} else if (_mouseAndKeyboardStat & MBS_MOUSE_MASK) {
|
||||||
|
VirtScreen *zone = findVirtScreen(_mouse.y);
|
||||||
|
const byte code = _mouseAndKeyboardStat & MBS_LEFT_CLICK ? 1 : 2;
|
||||||
|
const int inventoryArea = (_game.platform == Common::kPlatformNES) ? 48: 32;
|
||||||
|
|
||||||
|
// This could be kUnkVirtScreen.
|
||||||
|
// Fixes bug #1536932: "MANIACNES: Crash on click in speechtext-area"
|
||||||
|
if (!zone)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (zone->number == kVerbVirtScreen && _mouse.y <= zone->topline + 8) {
|
||||||
// Click into V2 sentence line
|
// Click into V2 sentence line
|
||||||
runInputScript(kSentenceClickArea, 0, 0);
|
runInputScript(5, 0, 0);
|
||||||
} else if (_game.version <= 2 && zone->number == kVerbVirtScreen && _mouse.y > zone->topline + inventoryArea) {
|
} else if (zone->number == kVerbVirtScreen && _mouse.y > zone->topline + inventoryArea) {
|
||||||
// Click into V2 inventory
|
// Click into V2 inventory
|
||||||
((ScummEngine_v2 *)this)->checkV2Inventory(_mouse.x, _mouse.y);
|
checkV2Inventory(_mouse.x, _mouse.y);
|
||||||
} else {
|
} else {
|
||||||
over = findVerbAtPos(_mouse.x, _mouse.y);
|
over = findVerbAtPos(_mouse.x, _mouse.y);
|
||||||
if (over != 0) {
|
if (over != 0) {
|
||||||
// Verb was clicked
|
// Verb was clicked
|
||||||
runInputScript(kVerbClickArea, _verbs[over].verbid, code);
|
runInputScript(1, _verbs[over].verbid, code);
|
||||||
} else {
|
} else {
|
||||||
// Scene was clicked
|
// Scene was clicked
|
||||||
runInputScript((zone->number == kMainVirtScreen) ? kSceneClickArea : kVerbClickArea, 0, code);
|
runInputScript((zone->number == kMainVirtScreen) ? kSceneClickArea : kVerbClickArea, 0, code);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue