summaryrefslogtreecommitdiff
path: root/src/actionmanager.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-03-24 04:26:57 +0300
committerAndrei Karas <akaras@inbox.ru>2012-03-26 21:45:24 +0300
commit36e5d21fe06709ba4d12a8619af07b86a676cf8c (patch)
treea9209e16e6f31cd74047f86ef1e642f467e128e2 /src/actionmanager.cpp
parent0921a130f0241a17ffcedf92d602808e18f1614b (diff)
downloadplus-36e5d21fe06709ba4d12a8619af07b86a676cf8c.tar.gz
plus-36e5d21fe06709ba4d12a8619af07b86a676cf8c.tar.bz2
plus-36e5d21fe06709ba4d12a8619af07b86a676cf8c.tar.xz
plus-36e5d21fe06709ba4d12a8619af07b86a676cf8c.zip
Redesign input handling.
Diffstat (limited to 'src/actionmanager.cpp')
-rw-r--r--src/actionmanager.cpp932
1 files changed, 932 insertions, 0 deletions
diff --git a/src/actionmanager.cpp b/src/actionmanager.cpp
new file mode 100644
index 000000000..9718ec9dd
--- /dev/null
+++ b/src/actionmanager.cpp
@@ -0,0 +1,932 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "actionmanager.h"
+
+#include "dropshortcut.h"
+#include "emoteshortcut.h"
+#include "game.h"
+#include "inputevent.h"
+#include "itemshortcut.h"
+#include "keyboardconfig.h"
+#include "localplayer.h"
+#include "logger.h"
+#include "playerinfo.h"
+#include "playerrelations.h"
+#include "sound.h"
+
+#include "gui/botcheckerwindow.h"
+#include "gui/buyselldialog.h"
+#include "gui/chatwindow.h"
+#include "gui/debugwindow.h"
+#include "gui/didyouknowwindow.h"
+#include "gui/equipmentwindow.h"
+#include "gui/helpwindow.h"
+#include "gui/inventorywindow.h"
+#include "gui/killstats.h"
+#include "gui/minimap.h"
+#include "gui/ministatuswindow.h"
+#include "gui/npcdialog.h"
+#include "gui/outfitwindow.h"
+#include "gui/setup.h"
+#include "gui/shopwindow.h"
+#include "gui/shortcutwindow.h"
+#include "gui/skilldialog.h"
+#include "gui/socialwindow.h"
+#include "gui/statuswindow.h"
+#include "gui/viewport.h"
+#include "gui/quitdialog.h"
+#include "gui/whoisonline.h"
+
+#include "gui/widgets/chattab.h"
+#include "gui/widgets/window.h"
+
+#include "net/net.h"
+#include "net/playerhandler.h"
+
+#include "utils/gettext.h"
+
+#include <guichan/actionlistener.hpp>
+
+#include "debug.h"
+
+#define impHandler(name) bool name(InputEvent &event)
+#define impHandler0(name) bool name(InputEvent &event A_UNUSED)
+
+extern ShortcutWindow *spellShortcutWindow;
+extern QuitDialog *quitDialog;
+
+namespace ActionManager
+{
+
+void showHideWindow(Window *window);
+
+impHandler0(moveUp)
+{
+ if (NpcDialog *dialog = NpcDialog::getActive())
+ {
+ dialog->refocus();
+ return true;
+ }
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ return directUp(event);
+ return false;
+}
+
+impHandler0(moveDown)
+{
+ if (NpcDialog *dialog = NpcDialog::getActive())
+ {
+ dialog->refocus();
+ return true;
+ }
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ return directDown(event);
+ return false;
+}
+
+impHandler0(moveLeft)
+{
+ if (outfitWindow && keyboard.isActionActive(keyboard.KEY_WEAR_OUTFIT))
+ {
+ outfitWindow->wearPreviousOutfit();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ return directLeft(event);
+ return false;
+}
+
+impHandler0(moveRight)
+{
+ if (outfitWindow && keyboard.isActionActive(keyboard.KEY_WEAR_OUTFIT))
+ {
+ outfitWindow->wearNextOutfit();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ return directRight(event);
+ return false;
+}
+
+impHandler(emote)
+{
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ {
+ // emote keys
+ int emotion = 1 + event.action - KeyboardConfig::KEY_EMOTE_1;
+ if (emotion > 0)
+ {
+ if (emoteShortcut)
+ emoteShortcut->useEmote(emotion);
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ }
+ else if (keyboard.isActionActive(keyboard.KEY_MOVE_TO_POINT))
+ {
+ // move to point keys
+ int num = event.action - KeyboardConfig::KEY_EMOTE_1;
+ if (socialWindow && num >= 0)
+ {
+ socialWindow->selectPortal(num);
+ return true;
+ }
+ }
+ else if (keyboard.isActionActive(keyboard.KEY_WEAR_OUTFIT))
+ {
+ int num = event.action - KeyboardConfig::KEY_EMOTE_1;
+ if (outfitWindow && num >= 0)
+ {
+ outfitWindow->wearOutfit(num);
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ }
+ else if (keyboard.isActionActive(keyboard.KEY_COPY_OUTFIT))
+ {
+ int num = event.action - KeyboardConfig::KEY_EMOTE_1;
+ if (outfitWindow && num >= 0)
+ {
+ outfitWindow->copyOutfit(num);
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+impHandler0(mouseClick)
+{
+ if (!viewport)
+ return false;
+
+ int mouseX, mouseY;
+ SDL_GetMouseState(&mouseX, &mouseY);
+
+ gcn::MouseEvent event2(viewport, false, false, false, false,
+ 0, gcn::MouseEvent::RIGHT, mouseX, mouseY, 1);
+
+ viewport->mousePressed(event2);
+ return true;
+}
+
+impHandler0(ok)
+{
+ // Close the Browser if opened
+ if (helpWindow && helpWindow->isVisible())
+ {
+ helpWindow->setVisible(false);
+ return true;
+ }
+ // Close the config window, cancelling changes if opened
+ else if (setupWindow->isVisible())
+ {
+ setupWindow->action(gcn::ActionEvent(nullptr, "cancel"));
+ return true;
+ }
+ else if (NpcDialog *dialog = NpcDialog::getActive())
+ {
+ dialog->action(gcn::ActionEvent(nullptr, "ok"));
+ return true;
+ }
+ return false;
+}
+
+impHandler(shortcut)
+{
+ if (itemShortcutWindow)
+ {
+ int num = itemShortcutWindow->getTabIndex();
+ if (num >= 0 && num < SHORTCUT_TABS)
+ {
+ itemShortcut[num]->useItem(event.action
+ - KeyboardConfig::KEY_SHORTCUT_1);
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(toggleChat)
+{
+ return chatWindow->requestChatFocus();
+}
+
+impHandler0(prevChatTab)
+{
+ if (chatWindow)
+ {
+ chatWindow->prevTab();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(nextChatTab)
+{
+ if (chatWindow)
+ {
+ chatWindow->nextTab();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(closeChatTab)
+{
+ if (chatWindow)
+ {
+ chatWindow->closeTab();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(prevSocialTab)
+{
+ if (socialWindow)
+ {
+ socialWindow->prevTab();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(nextSocialTab)
+{
+ if (socialWindow)
+ {
+ socialWindow->nextTab();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(scrollChatUp)
+{
+ if (chatWindow && chatWindow->isVisible())
+ {
+ chatWindow->scroll(-DEFAULT_CHAT_WINDOW_SCROLL);
+ return true;
+ }
+ return false;
+}
+
+impHandler0(scrollChatDown)
+{
+ if (chatWindow && chatWindow->isVisible())
+ {
+ chatWindow->scroll(DEFAULT_CHAT_WINDOW_SCROLL);
+ return true;
+ }
+ return false;
+}
+
+impHandler0(quit)
+{
+ if (viewport && viewport->isPopupMenuVisible())
+ {
+ viewport->closePopupMenu();
+ return true;
+ }
+ else if (!quitDialog)
+ {
+ quitDialog = new QuitDialog(&quitDialog);
+ quitDialog->requestMoveToTop();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(dropItem0)
+{
+ if (dropShortcut)
+ {
+ dropShortcut->dropFirst();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(dropItem)
+{
+ if (dropShortcut)
+ {
+ dropShortcut->dropItems();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(switchQuickDrop)
+{
+ if (player_node && !player_node->getDisableGameModifiers())
+ {
+ player_node->changeQuickDropCounter();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(heal)
+{
+ if (actorSpriteManager)
+ {
+ actorSpriteManager->healTarget();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(crazyMoves)
+{
+ if (player_node)
+ {
+ player_node->crazyMove();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(itenplz)
+{
+ if (actorSpriteManager)
+ {
+ if (Net::getPlayerHandler()->canUseMagic()
+ && PlayerInfo::getAttribute(MP) >= 3)
+ {
+ actorSpriteManager->itenplz();
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeCrazyMove)
+{
+ if (player_node)
+ {
+ player_node->changeCrazyMoveType();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changePickupType)
+{
+ if (player_node)
+ {
+ player_node->changePickUpType();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(moveToTarget)
+{
+ if (player_node && !keyboard.isActionActive(keyboard.KEY_TARGET_ATTACK)
+ && !keyboard.isActionActive(keyboard.KEY_ATTACK))
+ {
+ player_node->moveToTarget();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(moveToHome)
+{
+ if (player_node && !keyboard.isActionActive(keyboard.KEY_TARGET_ATTACK)
+ && !keyboard.isActionActive(keyboard.KEY_ATTACK))
+ {
+ player_node->moveToHome();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(setHome)
+{
+ if (player_node)
+ {
+ player_node->setHome();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeMoveType)
+{
+ if (player_node)
+ {
+ player_node->invertDirection();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeAttackWeaponType)
+{
+ if (player_node)
+ {
+ player_node->changeAttackWeaponType();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeAttackType)
+{
+ if (player_node)
+ {
+ player_node->changeAttackType();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeFollowMode)
+{
+ if (player_node)
+ {
+ player_node->changeFollowMode();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeImitationMode)
+{
+ if (player_node)
+ {
+ player_node->changeImitationMode();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(magicAttack)
+{
+ if (player_node)
+ {
+ player_node->magicAttack();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeMagicAttack)
+{
+ if (player_node)
+ {
+ player_node->switchMagicAttack();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changePvpMode)
+{
+ if (player_node)
+ {
+ player_node->switchPvpAttack();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeMoveToTarget)
+{
+ if (player_node)
+ {
+ player_node->changeMoveToTargetType();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(copyEquippedToOutfit)
+{
+ if (outfitWindow)
+ {
+ outfitWindow->copyFromEquiped();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeGameModifier)
+{
+ if (player_node)
+ {
+ player_node->switchGameModifiers();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(changeAudio)
+{
+ sound.changeAudio();
+ return true;
+}
+
+impHandler0(away)
+{
+ if (player_node)
+ {
+ player_node->changeAwayMode();
+ player_node->updateStatus();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(camera)
+{
+ if (viewport)
+ {
+ viewport->toggleCameraMode();
+ if (Game::instance())
+ Game::instance()->setValidSpeed();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(setupWindowShow)
+{
+ if (setupWindow)
+ {
+ if (setupWindow->isVisible())
+ {
+ setupWindow->doCancel();
+ }
+ else
+ {
+ setupWindow->setVisible(true);
+ setupWindow->requestMoveToTop();
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(pickup)
+{
+ if (player_node)
+ {
+ player_node->pickUpItems();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(sit)
+{
+ if (player_node)
+ {
+ if (keyboard.isActionActive(keyboard.KEY_EMOTE))
+ player_node->updateSit();
+ else
+ player_node->toggleSit();
+ return true;
+ }
+ return false;
+}
+
+impHandler0(hideWindows)
+{
+ if (statusWindow)
+ statusWindow->setVisible(false);
+ if (inventoryWindow)
+ inventoryWindow->setVisible(false);
+ if (shopWindow)
+ shopWindow->setVisible(false);
+ if (skillDialog)
+ skillDialog->setVisible(false);
+ if (setupWindow)
+ setupWindow->setVisible(false);
+ if (equipmentWindow)
+ equipmentWindow->setVisible(false);
+ if (helpWindow)
+ helpWindow->setVisible(false);
+ if (debugWindow)
+ debugWindow->setVisible(false);
+ if (outfitWindow)
+ outfitWindow->setVisible(false);
+ if (dropShortcutWindow)
+ dropShortcutWindow->setVisible(false);
+ if (spellShortcutWindow)
+ spellShortcutWindow->setVisible(false);
+ if (botCheckerWindow)
+ botCheckerWindow->setVisible(false);
+ if (socialWindow)
+ socialWindow->setVisible(false);
+ return true;
+}
+
+impHandler0(helpWindowShow)
+{
+ if (helpWindow)
+ {
+ if (helpWindow->isVisible())
+ {
+ helpWindow->setVisible(false);
+ }
+ else
+ {
+ helpWindow->loadHelp("index");
+ helpWindow->requestMoveToTop();
+ }
+ return true;
+ }
+ return false;
+}
+
+void showHideWindow(Window *window)
+{
+ if (window)
+ {
+ window->setVisible(!window->isVisible());
+ if (window->isVisible())
+ window->requestMoveToTop();
+ }
+}
+
+impHandler0(statusWindowShow)
+{
+ showHideWindow(statusWindow);
+ return true;
+}
+
+impHandler0(inventoryWindowShow)
+{
+ showHideWindow(inventoryWindow);
+ return true;
+}
+
+impHandler0(equipmentWindowShow)
+{
+ showHideWindow(equipmentWindow);
+ return true;
+}
+
+impHandler0(skillDialogShow)
+{
+ showHideWindow(skillDialog);
+ return true;
+}
+
+impHandler0(minimapWindowShow)
+{
+ showHideWindow(minimap);
+ return true;
+}
+
+impHandler0(chatWindowShow)
+{
+ showHideWindow(chatWindow);
+ return true;
+}
+
+impHandler0(shortcutWindowShow)
+{
+ showHideWindow(itemShortcutWindow);
+ return true;
+}
+
+impHandler0(debugWindowShow)
+{
+ showHideWindow(debugWindow);
+ return true;
+}
+
+impHandler0(socialWindowShow)
+{
+ showHideWindow(socialWindow);
+ return true;
+}
+
+impHandler0(emoteShortcutWindowShow)
+{
+ showHideWindow(emoteShortcutWindow);
+ return true;
+}
+
+impHandler0(outfitWindowShow)
+{
+ showHideWindow(outfitWindow);
+ return true;
+}
+
+impHandler0(shopWindowShow)
+{
+ showHideWindow(shopWindow);
+ return true;
+}
+
+impHandler0(dropShortcutWindowShow)
+{
+ showHideWindow(dropShortcutWindow);
+ return true;
+}
+
+impHandler0(killStatsWindowShow)
+{
+ showHideWindow(killStats);
+ return true;
+}
+
+impHandler0(spellShortcutWindowShow)
+{
+ showHideWindow(spellShortcutWindow);
+ return true;
+}
+
+impHandler0(botcheckerWindowShow)
+{
+ showHideWindow(botCheckerWindow);
+ return true;
+}
+
+impHandler0(whoIsOnlineWindowShow)
+{
+ showHideWindow(whoIsOnline);
+ return true;
+}
+
+impHandler0(didYouKnowWindowShow)
+{
+ showHideWindow(didYouKnowWindow);
+ return true;
+}
+
+impHandler0(changeMapMode)
+{
+ if (viewport)
+ viewport->toggleDebugPath();
+ if (miniStatusWindow)
+ miniStatusWindow->updateStatus();
+ if (Game::instance())
+ {
+ if (Map *map = Game::instance()->getCurrentMap())
+ map->redrawMap();
+ }
+ return true;
+}
+
+impHandler0(changeTrade)
+{
+ unsigned int deflt = player_relations.getDefault();
+ if (deflt & PlayerRelation::TRADE)
+ {
+ if (localChatTab)
+ {
+ localChatTab->chatLog(_("Ignoring incoming trade requests"),
+ BY_SERVER);
+ }
+ deflt &= ~PlayerRelation::TRADE;
+ }
+ else
+ {
+ if (localChatTab)
+ {
+ localChatTab->chatLog(_("Accepting incoming trade requests"),
+ BY_SERVER);
+ }
+ deflt |= PlayerRelation::TRADE;
+ }
+
+ player_relations.setDefault(deflt);
+ return true;
+}
+
+impHandler0(screenshot)
+{
+ Game::saveScreenshot();
+ return true;
+}
+
+impHandler0(ignoreInput)
+{
+ return true;
+}
+
+impHandler0(directUp)
+{
+ if (player_node)
+ {
+ if (player_node->getDirection() != Being::UP)
+ {
+ if (Client::limitPackets(PACKET_DIRECTION))
+ {
+ player_node->setDirection(Being::UP);
+ Net::getPlayerHandler()->setDirection(Being::UP);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(directDown)
+{
+ if (player_node)
+ {
+ if (player_node->getDirection() != Being::DOWN)
+ {
+ if (Client::limitPackets(PACKET_DIRECTION))
+ {
+ player_node->setDirection(Being::DOWN);
+ Net::getPlayerHandler()->setDirection(Being::DOWN);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(directLeft)
+{
+ if (player_node)
+ {
+ if (player_node->getDirection() != Being::LEFT)
+ {
+ if (Client::limitPackets(PACKET_DIRECTION))
+ {
+ player_node->setDirection(Being::LEFT);
+ Net::getPlayerHandler()->setDirection(Being::LEFT);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(directRight)
+{
+ if (player_node)
+ {
+ if (player_node->getDirection() != Being::RIGHT)
+ {
+ if (Client::limitPackets(PACKET_DIRECTION))
+ {
+ player_node->setDirection(Being::RIGHT);
+ Net::getPlayerHandler()->setDirection(Being::RIGHT);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+impHandler0(talk)
+{
+ if (player_node)
+ {
+ Being *target = player_node->getTarget();
+ if (target)
+ {
+ if (target->canTalk())
+ target->talkTo();
+ else if (target->getType() == Being::PLAYER)
+ new BuySellDialog(target->getName());
+ }
+ return true;
+ }
+ return false;
+}
+
+}