From 4c6378b94a264dfa540b27b96d45fe2fcb3fbcd4 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sun, 31 Jul 2011 16:08:01 +0300
Subject: Extract shared logic from specialhandler netcode to ea namespace.

---
 src/CMakeLists.txt              |   2 +
 src/Makefile.am                 |   2 +
 src/net/ea/specialhandler.cpp   | 238 ++++++++++++++++++++++++++++++++++++++++
 src/net/ea/specialhandler.h     |  57 ++++++++++
 src/net/tmwa/specialhandler.cpp | 200 +--------------------------------
 src/net/tmwa/specialhandler.h   |   6 +-
 6 files changed, 306 insertions(+), 199 deletions(-)
 create mode 100644 src/net/ea/specialhandler.cpp
 create mode 100644 src/net/ea/specialhandler.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6ed15974e..36127c5f3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -707,6 +707,8 @@ SET(SRCS_EVOL
     net/ea/partyhandler.h
     net/ea/playerhandler.cpp
     net/ea/playerhandler.h
+    net/ea/specialhandler.cpp
+    net/ea/specialhandler.h
     net/ea/token.h
     )
 
diff --git a/src/Makefile.am b/src/Makefile.am
index de2024a0d..b4c42472b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -691,6 +691,8 @@ manaplus_SOURCES += \
 	      net/ea/partyhandler.h \
 	      net/ea/playerhandler.cpp \
 	      net/ea/playerhandler.h \
+	      net/ea/specialhandler.cpp \
+	      net/ewa/specialhandler.h \
 	      net/ea/token.h \
 	      net/tmwa/gui/guildtab.cpp \
 	      net/tmwa/gui/guildtab.h \
diff --git a/src/net/ea/specialhandler.cpp b/src/net/ea/specialhandler.cpp
new file mode 100644
index 000000000..33fea3b27
--- /dev/null
+++ b/src/net/ea/specialhandler.cpp
@@ -0,0 +1,238 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2004-2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *  Copyright (C) 2011  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 "net/ea/specialhandler.h"
+
+#include "log.h"
+#include "localplayer.h"
+#include "playerinfo.h"
+
+#include "gui/skilldialog.h"
+
+#include "gui/widgets/chattab.h"
+
+#include "net/messagein.h"
+#include "net/messageout.h"
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+/** job dependend identifiers (?)  */
+#define SKILL_BASIC       0x0001
+#define SKILL_WARP        0x001b
+#define SKILL_STEAL       0x0032
+#define SKILL_ENVENOM     0x0034
+
+/** basic skills identifiers       */
+#define BSKILL_TRADE      0x0000
+#define BSKILL_EMOTE      0x0001
+#define BSKILL_SIT        0x0002
+#define BSKILL_CREATECHAT 0x0003
+#define BSKILL_JOINPARTY  0x0004
+#define BSKILL_SHOUT      0x0005
+#define BSKILL_PK         0x0006 // ??
+#define BSKILL_SETALLIGN  0x0007 // ??
+
+/** reasons why action failed      */
+#define RFAIL_SKILLDEP    0x00
+#define RFAIL_INSUFSP     0x01
+#define RFAIL_INSUFHP     0x02
+#define RFAIL_NOMEMO      0x03
+#define RFAIL_SKILLDELAY  0x04
+#define RFAIL_ZENY        0x05
+#define RFAIL_WEAPON      0x06
+#define RFAIL_REDGEM      0x07
+#define RFAIL_BLUEGEM     0x08
+#define RFAIL_OVERWEIGHT  0x09
+#define RFAIL_GENERIC     0x0a
+
+/** should always be zero if failed */
+#define SKILL_FAILED      0x00
+
+namespace Ea
+{
+
+SpecialHandler::SpecialHandler()
+{
+}
+
+void SpecialHandler::use(int id A_UNUSED)
+{
+    // TODO
+}
+
+void SpecialHandler::processPlayerSkills(Net::MessageIn &msg)
+{
+    msg.readInt16();  // length
+    const int skillCount = (msg.getLength() - 4) / 37;
+
+    for (int k = 0; k < skillCount; k++)
+    {
+        int skillId = msg.readInt16();
+        msg.readInt16();  // target type
+        msg.skip(2);  // unused
+        int level = msg.readInt16();
+        msg.readInt16(); // sp
+        msg.readInt16(); // range
+        msg.skip(24); // unused
+        int up = msg.readInt8();
+
+        PlayerInfo::setStatBase(skillId, level);
+        if (skillDialog)
+        {
+            if (!skillDialog->setModifiable(skillId, up))
+                skillDialog->addSkill(skillId, level, up);
+        }
+    }
+}
+
+void SpecialHandler::processPlayerSkillUp(Net::MessageIn &msg)
+{
+    const int skillId = msg.readInt16();
+    const int level = msg.readInt16();
+    msg.readInt16(); // sp
+    msg.readInt16(); // range
+    int up = msg.readInt8();
+
+    PlayerInfo::setStatBase(skillId, level);
+    if (skillDialog)
+    {
+        if (!skillDialog->setModifiable(skillId, up))
+            skillDialog->addSkill(skillId, level, up);
+    }
+}
+
+void SpecialHandler::processSkillFailed(Net::MessageIn &msg)
+{
+    // Action failed (ex. sit because you have not reached the
+    // right level)
+    const int skillId   = msg.readInt16();
+    const short bskill  = msg.readInt16();
+    msg.readInt16(); // btype
+    char success = msg.readInt8();
+    char reason  = msg.readInt8();
+    if (success != SKILL_FAILED && bskill == BSKILL_EMOTE)
+        logger->log("Action: %d/%d", bskill, success);
+
+    std::string txt;
+    if (success == SKILL_FAILED && skillId == SKILL_BASIC)
+    {
+        if (player_node && bskill == BSKILL_EMOTE
+            && reason == RFAIL_SKILLDEP)
+        {
+            player_node->stopAdvert();
+        }
+
+        switch (bskill)
+        {
+            case BSKILL_TRADE:
+                txt = _("Trade failed!");
+                break;
+            case BSKILL_EMOTE:
+                txt = _("Emote failed!");
+                break;
+            case BSKILL_SIT:
+                txt = _("Sit failed!");
+                break;
+            case BSKILL_CREATECHAT:
+                txt = _("Chat creating failed!");
+                break;
+            case BSKILL_JOINPARTY:
+                txt = _("Could not join party!");
+                break;
+            case BSKILL_SHOUT:
+                txt = _("Cannot shout!");
+                break;
+            default:
+                logger->log("QQQ SMSG_SKILL_FAILED: bskill "
+                            + toString(bskill));
+                break;
+        }
+
+        txt += " ";
+
+        switch (reason)
+        {
+            case RFAIL_SKILLDEP:
+                txt += _("You have not yet reached a high enough "
+                    "lvl!");
+                break;
+            case RFAIL_INSUFHP:
+                txt += _("Insufficient HP!");
+                break;
+            case RFAIL_INSUFSP:
+                txt += _("Insufficient SP!");
+                break;
+            case RFAIL_NOMEMO:
+                txt += _("You have no memos!");
+                break;
+            case RFAIL_SKILLDELAY:
+                txt += _("You cannot do that right now!");
+                break;
+            case RFAIL_ZENY:
+                txt += _("Seems you need more money... ;-)");
+                break;
+            case RFAIL_WEAPON:
+                txt += _("You cannot use this skill with that "
+                    "kind of weapon!");
+                break;
+            case RFAIL_REDGEM:
+                txt += _("You need another red gem!");
+                break;
+            case RFAIL_BLUEGEM:
+                txt += _("You need another blue gem!");
+                break;
+            case RFAIL_OVERWEIGHT:
+                txt += _("You're carrying to much to do this!");
+                break;
+            default:
+                txt += _("Huh? What's that?");
+                logger->log("QQQ SMSG_SKILL_FAILED: reason "
+                            + toString(reason));
+                break;
+        }
+    }
+    else
+    {
+        switch (skillId)
+        {
+            case SKILL_WARP :
+                txt = _("Warp failed...");
+                break;
+            case SKILL_STEAL :
+                txt = _("Could not steal anything...");
+                break;
+            case SKILL_ENVENOM :
+                txt = _("Poison had no effect...");
+                break;
+            default:
+                logger->log("QQQ SMSG_SKILL_FAILED: skillId "
+                            + toString(skillId));
+                break;
+        }
+    }
+
+    if (localChatTab)
+        localChatTab->chatLog(txt);
+}
+} // namespace Ea
diff --git a/src/net/ea/specialhandler.h b/src/net/ea/specialhandler.h
new file mode 100644
index 000000000..06e8f8893
--- /dev/null
+++ b/src/net/ea/specialhandler.h
@@ -0,0 +1,57 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2004-2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *  Copyright (C) 2011  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/>.
+ */
+
+#ifndef NET_EA_SKILLHANDLER_H
+#define NET_EA_SKILLHANDLER_H
+
+#include "net/messagein.h"
+#include "net/net.h"
+#include "net/specialhandler.h"
+
+#ifdef __GNUC__
+#define A_UNUSED  __attribute__ ((unused))
+#else
+#define A_UNUSED
+#endif
+
+namespace Ea
+{
+
+class SpecialHandler : public Net::SpecialHandler
+{
+    public:
+        SpecialHandler();
+
+        void handleMessage(Net::MessageIn &msg);
+
+        void use(int id);
+
+        void processPlayerSkills(Net::MessageIn &msg);
+
+        void processPlayerSkillUp(Net::MessageIn &msg);
+
+        void processSkillFailed(Net::MessageIn &msg);
+};
+
+} // namespace Ea
+
+#endif // NET_EA_SKILLHANDLER_H
diff --git a/src/net/tmwa/specialhandler.cpp b/src/net/tmwa/specialhandler.cpp
index a2a2f3fb2..b175368bd 100644
--- a/src/net/tmwa/specialhandler.cpp
+++ b/src/net/tmwa/specialhandler.cpp
@@ -23,54 +23,13 @@
 #include "net/tmwa/specialhandler.h"
 
 #include "log.h"
-#include "localplayer.h"
-#include "playerinfo.h"
-
-#include "gui/skilldialog.h"
-
-#include "gui/widgets/chattab.h"
 
 #include "net/messagein.h"
-#include "net/messageout.h"
 
 #include "net/tmwa/protocol.h"
 
-#include "utils/gettext.h"
-
 #include "debug.h"
 
-/** job dependend identifiers (?)  */
-#define SKILL_BASIC       0x0001
-#define SKILL_WARP        0x001b
-#define SKILL_STEAL       0x0032
-#define SKILL_ENVENOM     0x0034
-
-/** basic skills identifiers       */
-#define BSKILL_TRADE      0x0000
-#define BSKILL_EMOTE      0x0001
-#define BSKILL_SIT        0x0002
-#define BSKILL_CREATECHAT 0x0003
-#define BSKILL_JOINPARTY  0x0004
-#define BSKILL_SHOUT      0x0005
-#define BSKILL_PK         0x0006 // ??
-#define BSKILL_SETALLIGN  0x0007 // ??
-
-/** reasons why action failed      */
-#define RFAIL_SKILLDEP    0x00
-#define RFAIL_INSUFSP     0x01
-#define RFAIL_INSUFHP     0x02
-#define RFAIL_NOMEMO      0x03
-#define RFAIL_SKILLDELAY  0x04
-#define RFAIL_ZENY        0x05
-#define RFAIL_WEAPON      0x06
-#define RFAIL_REDGEM      0x07
-#define RFAIL_BLUEGEM     0x08
-#define RFAIL_OVERWEIGHT  0x09
-#define RFAIL_GENERIC     0x0a
-
-/** should always be zero if failed */
-#define SKILL_FAILED      0x00
-
 extern Net::SpecialHandler *specialHandler;
 
 namespace TmwAthena
@@ -91,177 +50,26 @@ SpecialHandler::SpecialHandler()
 
 void SpecialHandler::handleMessage(Net::MessageIn &msg)
 {
-    int skillCount;
-    int skillId;
-
     switch (msg.getId())
     {
         case SMSG_PLAYER_SKILLS:
         {
-            msg.readInt16();  // length
-            skillCount = (msg.getLength() - 4) / 37;
-
-            for (int k = 0; k < skillCount; k++)
-            {
-                skillId = msg.readInt16();
-                msg.readInt16();  // target type
-                msg.skip(2);  // unused
-                int level = msg.readInt16();
-                msg.readInt16(); // sp
-                msg.readInt16(); // range
-                msg.skip(24); // unused
-                int up = msg.readInt8();
-
-                PlayerInfo::setStatBase(skillId, level);
-                if (skillDialog)
-                {
-                    if (!skillDialog->setModifiable(skillId, up))
-                        skillDialog->addSkill(skillId, level, up);
-                }
-            }
+            processPlayerSkills(msg);
             break;
         }
         case SMSG_PLAYER_SKILL_UP:
-            {
-                skillId = msg.readInt16();
-                int level = msg.readInt16();
-                msg.readInt16(); // sp
-                msg.readInt16(); // range
-                int up = msg.readInt8();
-
-                PlayerInfo::setStatBase(skillId, level);
-                if (skillDialog)
-                {
-                    if (!skillDialog->setModifiable(skillId, up))
-                        skillDialog->addSkill(skillId, level, up);
-                }
-            }
+            processPlayerSkillUp(msg);
             break;
 
         case SMSG_SKILL_FAILED:
-        {
-            // Action failed (ex. sit because you have not reached the
-            // right level)
-            skillId   = msg.readInt16();
-            short bskill  = msg.readInt16();
-            msg.readInt16(); // btype
-            char success = msg.readInt8();
-            char reason  = msg.readInt8();
-            if (success != SKILL_FAILED && bskill == BSKILL_EMOTE)
-                logger->log("Action: %d/%d", bskill, success);
-
-            std::string msg;
-            if (success == SKILL_FAILED && skillId == SKILL_BASIC)
-            {
-                if (player_node && bskill == BSKILL_EMOTE
-                    && reason == RFAIL_SKILLDEP)
-                {
-                    player_node->stopAdvert();
-                }
-
-                switch (bskill)
-                {
-                    case BSKILL_TRADE:
-                        msg = _("Trade failed!");
-                        break;
-                    case BSKILL_EMOTE:
-                        msg = _("Emote failed!");
-                        break;
-                    case BSKILL_SIT:
-                        msg = _("Sit failed!");
-                        break;
-                    case BSKILL_CREATECHAT:
-                        msg = _("Chat creating failed!");
-                        break;
-                    case BSKILL_JOINPARTY:
-                        msg = _("Could not join party!");
-                        break;
-                    case BSKILL_SHOUT:
-                        msg = _("Cannot shout!");
-                        break;
-                    default:
-                        logger->log("QQQ SMSG_SKILL_FAILED: bskill "
-                                    + toString(bskill));
-                        break;
-                }
-
-                msg += " ";
-
-                switch (reason)
-                {
-                    case RFAIL_SKILLDEP:
-                        msg += _("You have not yet reached a high enough "
-                            "lvl!");
-                        break;
-                    case RFAIL_INSUFHP:
-                        msg += _("Insufficient HP!");
-                        break;
-                    case RFAIL_INSUFSP:
-                        msg += _("Insufficient SP!");
-                        break;
-                    case RFAIL_NOMEMO:
-                        msg += _("You have no memos!");
-                        break;
-                    case RFAIL_SKILLDELAY:
-                        msg += _("You cannot do that right now!");
-                        break;
-                    case RFAIL_ZENY:
-                        msg += _("Seems you need more money... ;-)");
-                        break;
-                    case RFAIL_WEAPON:
-                        msg += _("You cannot use this skill with that "
-                            "kind of weapon!");
-                        break;
-                    case RFAIL_REDGEM:
-                        msg += _("You need another red gem!");
-                        break;
-                    case RFAIL_BLUEGEM:
-                        msg += _("You need another blue gem!");
-                        break;
-                    case RFAIL_OVERWEIGHT:
-                        msg += _("You're carrying to much to do this!");
-                        break;
-                    default:
-                        msg += _("Huh? What's that?");
-                        logger->log("QQQ SMSG_SKILL_FAILED: reason "
-                                    + toString(reason));
-                        break;
-                }
-            }
-            else
-            {
-                switch (skillId)
-                {
-                    case SKILL_WARP :
-                        msg = _("Warp failed...");
-                        break;
-                    case SKILL_STEAL :
-                        msg = _("Could not steal anything...");
-                        break;
-                    case SKILL_ENVENOM :
-                        msg = _("Poison had no effect...");
-                        break;
-                    default:
-                        logger->log("QQQ SMSG_SKILL_FAILED: skillId "
-                                    + toString(skillId));
-                        break;
-                }
-            }
-
-            if (localChatTab)
-                localChatTab->chatLog(msg);
-        }
+            processSkillFailed(msg);
             break;
+
         default:
             break;
     }
 }
 
-void SpecialHandler::use(int id A_UNUSED)
-{
-    // TODO
-}
-
 void SpecialHandler::use(int id, int level, int beingId)
 {
     MessageOut outMsg(CMSG_SKILL_USE_BEING);
diff --git a/src/net/tmwa/specialhandler.h b/src/net/tmwa/specialhandler.h
index 6f1e53aa0..21c1b9026 100644
--- a/src/net/tmwa/specialhandler.h
+++ b/src/net/tmwa/specialhandler.h
@@ -26,6 +26,8 @@
 #include "net/net.h"
 #include "net/specialhandler.h"
 
+#include "net/ea/specialhandler.h"
+
 #include "net/tmwa/messagehandler.h"
 
 #ifdef __GNUC__
@@ -37,15 +39,13 @@
 namespace TmwAthena
 {
 
-class SpecialHandler : public MessageHandler, public Net::SpecialHandler
+class SpecialHandler : public MessageHandler, public Ea::SpecialHandler
 {
     public:
         SpecialHandler();
 
         void handleMessage(Net::MessageIn &msg);
 
-        void use(int id);
-
         void use(int id, int level, int beingId);
 
         void use(int id, int level, int x, int y);
-- 
cgit v1.2.3-70-g09d2