AGI: change how menus are triggered on Non-PC

This commit is contained in:
Martin Kiewitz 2016-02-01 19:08:22 +01:00
parent 9fff1686fc
commit 2a4a290d31
5 changed files with 36 additions and 115 deletions

View file

@ -280,37 +280,6 @@ int AgiEngine::doPollKeyboard() {
return key;
}
int16 AgiEngine::getSpecialMenuControllerSlot() {
int16 controllerSlotESC = -1;
int16 controllerSlotSpecial = -1;
for (uint16 curMapping = 0; curMapping < MAX_CONTROLLER_KEYMAPPINGS; curMapping++) {
if (_game.controllerKeyMapping[curMapping].keycode == _game.specialMenuTriggerKey) {
if (controllerSlotSpecial < 0) {
controllerSlotSpecial = _game.controllerKeyMapping[curMapping].controllerSlot;
}
}
if (_game.controllerKeyMapping[curMapping].keycode == AGI_MENU_TRIGGER_PC) {
if (controllerSlotESC < 0) {
controllerSlotESC = _game.controllerKeyMapping[curMapping].controllerSlot;
}
}
}
if (controllerSlotSpecial >= 0) {
// special menu controller slot found
if (controllerSlotSpecial != controllerSlotESC) {
// not the same as the ESC slot (is the same in Manhunter AppleIIgs, we need to replace "pause"
if (controllerSlotSpecial >= 10) {
// slot needs to be at least 10
// Atari ST SQ1 maps the special key, but doesn't trigger any menu with it
// the controller slot in this case is 8.
return controllerSlotSpecial;
}
}
}
return -1;
}
bool AgiEngine::handleMouseClicks(uint16 &key) {
// No mouse click? -> exit
if (key != AGI_MOUSE_BUTTON_LEFT)
@ -322,7 +291,7 @@ bool AgiEngine::handleMouseClicks(uint16 &key) {
displayLineRect.moveTo(0, statusRow * FONT_DISPLAY_HEIGHT);
if (displayLineRect.contains(_mouse.pos)) {
if (getFlag(VM_FLAG_MENUS_WORK) && _menu->isAvailable()) {
if (getFlag(VM_FLAG_MENUS_ACCESSIBLE) && _menu->isAvailable()) {
warning("click on status line -> menu TODO");
// TODO: menu
// This should be done in a better way as in simulate ESC key
@ -406,28 +375,31 @@ bool AgiEngine::handleController(uint16 key) {
// Escape pressed, user probably wants to trigger the menu
// For PC, just passing ASCII code for ESC will normally trigger a controller
// and the scripts will then trigger the menu
// For other platforms, ESC was handled by platforms to trigger "pause game" instead
// We need to change ESC to a platform specific code to make it work properly.
//
// There are exceptions though. Mixed Up Mother Goose on AppleIIgs for example actually sets up
// ESC for pause only. That's why we also check, if the key is actually mapped to a controller.
// For this special case, we actually replace the pause function with a menu trigger.
// Replacing "pause" all the time wouldn't work out as well, becaue games like KQ1 on Apple IIgs
// actually disable "pause" when ego has been killed, which means we wouldn't be able to access
// the menu anymore in that case.
if (_menu->isAvailable()) {
// menu is actually available
if (_game.specialMenuTriggerKey) {
int16 specialMenuControllerSlot = getSpecialMenuControllerSlot();
if (specialMenuControllerSlot >= 0) {
// menu trigger found, trigger it now
_game.controllerOccured[specialMenuControllerSlot] = true;
return true;
}
switch (getPlatform()) {
case Common::kPlatformAmiga:
case Common::kPlatformApple2GS:
case Common::kPlatformAtariST:
// For these platforms, the button ESC normally triggered "pause"
// But users could at the same time trigger the menu by clicking on the status line
// We check, if menu is currently available and supposed to be accessible.
// If yes, we do a delayed trigger now, otherwise we continue processing the key just like normal.
//
// This is probably the solution with the highest compatibility.
// Several games also look for special keys see AGI_MENU_TRIGGER_*
// And then there's also Mixed Up Mother Goose, which actually hooks the ESC key for the regular menu
//
// We risk in here of course, that we let the user access the menu, when it shouldn't be possible.
// I'm not 100% sure if those other interpreters really only check VM_FLAG_MENUS_ACCESSIBLE
// Needs further investigation.
if (getFlag(VM_FLAG_MENUS_ACCESSIBLE) && _menu->isAvailable()) {
// menu is supposed to be accessible and is also available
_menu->delayedExecute();
return true;
}
// Otherwise go on and look for the ESC controller
default:
break;
}
// Otherwise go on and look for the ESC controller
}