summaryrefslogtreecommitdiff
path: root/src/progs
diff options
context:
space:
mode:
Diffstat (limited to 'src/progs')
-rw-r--r--src/progs/dyecmd/actions/actions.cpp120
-rw-r--r--src/progs/dyecmd/actions/chat.cpp69
-rw-r--r--src/progs/dyecmd/actions/commands.cpp167
-rw-r--r--src/progs/dyecmd/actions/move.cpp44
-rw-r--r--src/progs/dyecmd/actions/pets.cpp49
-rw-r--r--src/progs/dyecmd/actions/statusbar.cpp49
-rw-r--r--src/progs/dyecmd/actions/tabs.cpp39
-rw-r--r--src/progs/dyecmd/actions/target.cpp39
-rw-r--r--src/progs/dyecmd/actions/windows.cpp60
-rw-r--r--src/progs/dyecmd/client.cpp813
-rw-r--r--src/progs/dyecmd/client.h119
-rw-r--r--src/progs/dyecmd/dyemain.cpp119
-rw-r--r--src/progs/dyecmd/gui/viewport.cpp272
-rw-r--r--src/progs/dyecmd/gui/viewport.h213
14 files changed, 2172 insertions, 0 deletions
diff --git a/src/progs/dyecmd/actions/actions.cpp b/src/progs/dyecmd/actions/actions.cpp
new file mode 100644
index 000000000..58353b699
--- /dev/null
+++ b/src/progs/dyecmd/actions/actions.cpp
@@ -0,0 +1,120 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/actions.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(emote)
+impHandlerVoid(outfit)
+impHandlerVoid(mouseClick)
+impHandlerVoid(ok)
+impHandlerVoid(shortcut)
+impHandlerVoid(quit)
+impHandlerVoid(dropItem0)
+impHandlerVoid(dropItem)
+impHandlerVoid(dropItemId)
+impHandlerVoid(dropItemInv)
+impHandlerVoid(dropItemIdAll)
+impHandlerVoid(dropItemInvAll)
+impHandlerVoid(heal)
+impHandlerVoid(healmd)
+impHandlerVoid(itenplz)
+impHandlerVoid(setHome)
+impHandlerVoid(magicAttack)
+impHandlerVoid(copyEquippedToOutfit)
+impHandlerVoid(pickup)
+impHandlerVoid(sit)
+impHandlerVoid(screenshot)
+impHandlerVoid(ignoreInput)
+impHandlerVoid(buy)
+impHandlerVoid(sell)
+impHandlerVoid(talk)
+impHandlerVoid(stopAttack)
+impHandlerVoid(untarget)
+impHandlerVoid(attack)
+impHandlerVoid(targetAttack)
+impHandlerVoid(attackHuman)
+impHandlerVoid(safeVideoMode)
+impHandlerVoid(stopSit)
+impHandlerVoid(showKeyboard)
+impHandlerVoid(showWindows)
+impHandlerVoid(openTrade)
+impHandlerVoid(ipcToggle)
+impHandlerVoid(where)
+impHandlerVoid(who)
+impHandlerVoid(cleanGraphics)
+impHandlerVoid(cleanFonts)
+impHandlerVoid(trade)
+impHandlerVoid(priceLoad)
+impHandlerVoid(priceSave)
+impHandlerVoid(cacheInfo)
+impHandlerVoid(disconnect)
+impHandlerVoid(undress)
+impHandlerVoid(dirs)
+impHandlerVoid(uptime)
+impHandlerVoid(dump)
+impHandlerVoid(serverIgnoreAll)
+impHandlerVoid(serverUnIgnoreAll)
+impHandler0(error)
+{
+ exit(0);
+}
+impHandlerVoid(dumpGraphics)
+impHandlerVoid(dumpEnvironment)
+impHandlerVoid(dumpTests)
+impHandlerVoid(dumpOGL)
+impHandlerVoid(dumpGL)
+impHandlerVoid(dumpMods)
+#if defined USE_OPENGL && defined DEBUG_SDLFONT
+impHandlerVoid(testSdlFont)
+#endif // defined USE_OPENGL && defined DEBUG_SDLFONT
+impHandlerVoid(createItems)
+impHandlerVoid(createItem)
+impHandlerVoid(uploadConfig)
+impHandlerVoid(uploadServerConfig)
+impHandlerVoid(uploadLog)
+impHandlerVoid(mercenaryFire)
+impHandlerVoid(mercenaryToMaster)
+impHandlerVoid(homunculusToMaster)
+impHandlerVoid(homunculusFeed)
+impHandlerVoid(useItem)
+impHandlerVoid(useItemInv)
+impHandlerVoid(invToStorage)
+impHandlerVoid(tradeAdd)
+impHandlerVoid(storageToInv)
+impHandlerVoid(protectItem)
+impHandlerVoid(unprotectItem)
+impHandlerVoid(kick)
+impHandlerVoid(clearDrop)
+impHandlerVoid(testInfo)
+impHandlerVoid(craftKey)
+impHandlerVoid(resetGameModifiers)
+impHandlerVoid(barToChat)
+impHandlerVoid(seen)
+impHandlerVoid(dumpMemoryUsage)
+impHandlerVoid(setEmoteType)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/chat.cpp b/src/progs/dyecmd/actions/chat.cpp
new file mode 100644
index 000000000..ece0e42b9
--- /dev/null
+++ b/src/progs/dyecmd/actions/chat.cpp
@@ -0,0 +1,69 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/chat.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(toggleChat)
+impHandlerVoid(prevChatTab)
+impHandlerVoid(nextChatTab)
+impHandlerVoid(closeChatTab)
+impHandlerVoid(closeAllChatTabs)
+impHandlerVoid(ignoreAllWhispers)
+impHandlerVoid(scrollChatUp)
+impHandlerVoid(scrollChatDown)
+impHandlerVoid(msg)
+impHandlerVoid(msgText)
+impHandlerVoid(msg2)
+impHandlerVoid(query)
+impHandlerVoid(clearChatTab)
+impHandlerVoid(createParty)
+impHandlerVoid(createGuild)
+impHandlerVoid(party)
+impHandlerVoid(guild)
+impHandlerVoid(me)
+impHandlerVoid(toggle)
+impHandlerVoid(kickParty)
+impHandlerVoid(kickGuild)
+impHandlerVoid(addText)
+impHandlerVoid(clearChat)
+impHandlerVoid(chatGeneralTab)
+impHandlerVoid(chatDebugTab)
+impHandlerVoid(chatBattleTab)
+impHandlerVoid(chatTradeTab)
+impHandlerVoid(chatLangTab)
+impHandlerVoid(chatGmTab)
+impHandlerVoid(chatPartyTab)
+impHandlerVoid(chatGuildTab)
+impHandlerVoid(hat)
+impHandlerVoid(chatClipboard)
+impHandlerVoid(guildNotice)
+impHandlerVoid(translate)
+impHandlerVoid(sendGuiKey)
+impHandlerVoid(sendMouseKey)
+impHandlerVoid(sendChars)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/commands.cpp b/src/progs/dyecmd/actions/commands.cpp
new file mode 100644
index 000000000..7f50ab20c
--- /dev/null
+++ b/src/progs/dyecmd/actions/commands.cpp
@@ -0,0 +1,167 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/commands.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(chatAnnounce)
+impHandlerVoid(chatIgnore)
+impHandlerVoid(chatUnignore)
+impHandlerVoid(chatErase)
+impHandlerVoid(chatFriend)
+impHandlerVoid(chatDisregard)
+impHandlerVoid(chatNeutral)
+impHandlerVoid(chatBlackList)
+impHandlerVoid(chatEnemy)
+impHandlerVoid(chatNuke)
+impHandlerVoid(chatAdd)
+impHandlerVoid(present)
+impHandlerVoid(printAll)
+impHandlerVoid(move)
+impHandlerVoid(setTarget)
+impHandlerVoid(commandOutfit)
+impHandlerVoid(commandEmote)
+impHandlerVoid(awayMessage)
+impHandlerVoid(pseudoAway)
+impHandlerVoid(follow)
+impHandlerVoid(navigate)
+impHandlerVoid(navigateTo)
+impHandlerVoid(moveCamera)
+impHandlerVoid(restoreCamera)
+impHandlerVoid(imitation)
+impHandlerVoid(sendMail)
+impHandlerVoid(info)
+impHandlerVoid(wait)
+impHandlerVoid(addPriorityAttack)
+impHandlerVoid(addAttack)
+impHandlerVoid(removeAttack)
+impHandlerVoid(addIgnoreAttack)
+impHandlerVoid(setDrop)
+impHandlerVoid(url)
+impHandlerVoid(openUrl)
+impHandlerVoid(execute)
+impHandlerVoid(enableHighlight)
+impHandlerVoid(disableHighlight)
+impHandlerVoid(dontRemoveName)
+impHandlerVoid(removeName)
+impHandlerVoid(disableAway)
+impHandlerVoid(enableAway)
+impHandlerVoid(testParticle)
+impHandlerVoid(talkRaw)
+impHandlerVoid(gm)
+impHandlerVoid(hack)
+impHandlerVoid(debugSpawn)
+impHandlerVoid(serverIgnoreWhisper)
+impHandlerVoid(serverUnIgnoreWhisper)
+impHandlerVoid(setHomunculusName)
+impHandlerVoid(fireHomunculus)
+impHandlerVoid(leaveParty)
+impHandlerVoid(leaveGuild)
+impHandlerVoid(warp)
+impHandlerVoid(homunTalk)
+impHandlerVoid(homunEmote)
+impHandlerVoid(commandHomunEmote)
+impHandlerVoid(createPublicChatRoom)
+impHandlerVoid(joinChatRoom)
+impHandlerVoid(leaveChatRoom)
+impHandlerVoid(confSet)
+impHandlerVoid(serverConfSet)
+impHandlerVoid(confGet)
+impHandlerVoid(serverConfGet)
+impHandlerVoid(slide)
+impHandlerVoid(selectSkillLevel)
+impHandlerVoid(skill)
+impHandlerVoid(craft)
+impHandlerVoid(npcClipboard)
+impHandlerVoid(clipboardCopy)
+impHandlerVoid(addPickup)
+impHandlerVoid(removePickup)
+impHandlerVoid(ignorePickup)
+impHandlerVoid(monsterInfo)
+impHandlerVoid(itemInfo)
+impHandlerVoid(whoDrops)
+impHandlerVoid(mobSearch)
+impHandlerVoid(mobSpawnSearch)
+impHandlerVoid(playerGmCommands)
+impHandlerVoid(playerCharGmCommands)
+impHandlerVoid(commandShowLevel)
+impHandlerVoid(commandShowStats)
+impHandlerVoid(commandShowStorage)
+impHandlerVoid(commandShowCart)
+impHandlerVoid(commandShowInventory)
+impHandlerVoid(locatePlayer)
+impHandlerVoid(commandShowAccountInfo)
+impHandlerVoid(commandSpawn)
+impHandlerVoid(commandSpawnSlave)
+impHandlerVoid(commandSpawnClone)
+impHandlerVoid(commandSpawnSlaveClone)
+impHandlerVoid(commandSpawnEvilClone)
+impHandlerVoid(commandSavePosition)
+impHandlerVoid(commandLoadPosition)
+impHandlerVoid(commandRandomWarp)
+impHandlerVoid(commandGotoNpc)
+impHandlerVoid(commandGotoPc)
+impHandlerVoid(commandRecallPc)
+impHandlerVoid(commandIpCheck)
+impHandlerVoid(commandKiller)
+impHandlerVoid(commandKillable)
+impHandlerVoid(commandHeal)
+impHandlerVoid(commandAlive)
+impHandlerVoid(commandDisguise)
+impHandlerVoid(commandImmortal)
+impHandlerVoid(commandHide)
+impHandlerVoid(commandNuke)
+impHandlerVoid(commandKill)
+impHandlerVoid(commandJail)
+impHandlerVoid(commandUnjail)
+impHandlerVoid(commandNpcMove)
+impHandlerVoid(commandNpcHide)
+impHandlerVoid(commandNpcShow)
+impHandlerVoid(commandChangePartyLeader)
+impHandlerVoid(commandPartyRecall)
+impHandlerVoid(commandBreakGuild)
+impHandlerVoid(commandGuildRecall)
+impHandlerVoid(mailTo)
+impHandlerVoid(adoptChild)
+impHandlerVoid(showSkillLevels)
+impHandlerVoid(showSkillType)
+impHandlerVoid(selectSkillType)
+impHandlerVoid(showSkillOffsetX)
+impHandlerVoid(showSkillOffsetY)
+impHandlerVoid(setSkillOffsetX)
+impHandlerVoid(setSkillOffsetY)
+impHandlerVoid(partyItemShare)
+impHandlerVoid(partyExpShare)
+impHandlerVoid(partyAutoItemShare)
+impHandlerVoid(outfitToChat)
+impHandlerVoid(outfitClear)
+impHandlerVoid(moveAttackUp)
+impHandlerVoid(moveAttackDown)
+impHandlerVoid(movePriorityAttackUp)
+impHandlerVoid(movePriorityAttackDown)
+impHandlerVoid(addSkillShortcut)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/move.cpp b/src/progs/dyecmd/actions/move.cpp
new file mode 100644
index 000000000..c3f82cd3a
--- /dev/null
+++ b/src/progs/dyecmd/actions/move.cpp
@@ -0,0 +1,44 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/move.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(moveUp)
+impHandlerVoid(moveDown)
+impHandlerVoid(moveLeft)
+impHandlerVoid(moveRight)
+impHandlerVoid(moveForward)
+impHandlerVoid(moveToPoint)
+impHandlerVoid(crazyMoves)
+impHandlerVoid(moveToTarget)
+impHandlerVoid(moveToHome)
+impHandlerVoid(directUp)
+impHandlerVoid(directDown)
+impHandlerVoid(directLeft)
+impHandlerVoid(directRight)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/pets.cpp b/src/progs/dyecmd/actions/pets.cpp
new file mode 100644
index 000000000..96a7e5393
--- /dev/null
+++ b/src/progs/dyecmd/actions/pets.cpp
@@ -0,0 +1,49 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/pets.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(commandEmotePet)
+impHandlerVoid(talkPet)
+impHandlerVoid(setPetName)
+impHandlerVoid(petEmote)
+impHandlerVoid(catchPet)
+impHandlerVoid(petMoveUp)
+impHandlerVoid(petMoveDown)
+impHandlerVoid(petMoveLeft)
+impHandlerVoid(petMoveRight)
+impHandlerVoid(petDirectUp)
+impHandlerVoid(petDirectDown)
+impHandlerVoid(petDirectLeft)
+impHandlerVoid(petDirectRight)
+impHandlerVoid(petMove)
+impHandlerVoid(petFeed)
+impHandlerVoid(petDropLoot)
+impHandlerVoid(petReturnToEgg)
+impHandlerVoid(petUnequip)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/statusbar.cpp b/src/progs/dyecmd/actions/statusbar.cpp
new file mode 100644
index 000000000..ed53ef8b0
--- /dev/null
+++ b/src/progs/dyecmd/actions/statusbar.cpp
@@ -0,0 +1,49 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/statusbar.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(switchQuickDrop)
+impHandlerVoid(changeCrazyMove)
+impHandlerVoid(changePickupType)
+impHandlerVoid(changeMoveType)
+impHandlerVoid(changeAttackWeaponType)
+impHandlerVoid(changeAttackType)
+impHandlerVoid(changeTargetingType)
+impHandlerVoid(changeFollowMode)
+impHandlerVoid(changeImitationMode)
+impHandlerVoid(changeMagicAttackType)
+impHandlerVoid(changePvpMode)
+impHandlerVoid(changeMoveToTarget)
+impHandlerVoid(changeGameModifier)
+impHandlerVoid(changeAudio)
+impHandlerVoid(away)
+impHandlerVoid(camera)
+impHandlerVoid(changeMapMode)
+impHandlerVoid(changeTrade)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/tabs.cpp b/src/progs/dyecmd/actions/tabs.cpp
new file mode 100644
index 000000000..3c795c2ab
--- /dev/null
+++ b/src/progs/dyecmd/actions/tabs.cpp
@@ -0,0 +1,39 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/tabs.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(prevSocialTab)
+impHandlerVoid(nextSocialTab)
+impHandlerVoid(nextShortcutsTab)
+impHandlerVoid(prevShortcutsTab)
+impHandlerVoid(nextCommandsTab)
+impHandlerVoid(prevCommandsTab)
+impHandlerVoid(nextInvTab)
+impHandlerVoid(prevInvTab)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/target.cpp b/src/progs/dyecmd/actions/target.cpp
new file mode 100644
index 000000000..80b34a7fb
--- /dev/null
+++ b/src/progs/dyecmd/actions/target.cpp
@@ -0,0 +1,39 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/target.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(targetPlayer)
+impHandlerVoid(targetMonster)
+impHandlerVoid(targetClosestMonster)
+impHandlerVoid(targetNPC)
+impHandlerVoid(targetMercenary)
+impHandlerVoid(targetPet)
+impHandlerVoid(targetSkillUnit)
+impHandlerVoid(contextMenu)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/actions/windows.cpp b/src/progs/dyecmd/actions/windows.cpp
new file mode 100644
index 000000000..ce5c72ce2
--- /dev/null
+++ b/src/progs/dyecmd/actions/windows.cpp
@@ -0,0 +1,60 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2012-2017 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 "actions/windows.h"
+
+#include "actions/actiondef.h"
+
+#include "debug.h"
+
+namespace Actions
+{
+
+impHandlerVoid(setupWindowShow)
+impHandlerVoid(hideWindows)
+impHandlerVoid(helpWindowShow)
+impHandlerVoid(aboutWindowShow)
+impHandlerVoid(statusWindowShow)
+impHandlerVoid(inventoryWindowShow)
+impHandlerVoid(equipmentWindowShow)
+impHandlerVoid(skillDialogShow)
+impHandlerVoid(minimapWindowShow)
+impHandlerVoid(chatWindowShow)
+impHandlerVoid(shortcutWindowShow)
+impHandlerVoid(debugWindowShow)
+impHandlerVoid(socialWindowShow)
+impHandlerVoid(emoteShortcutWindowShow)
+impHandlerVoid(outfitWindowShow)
+impHandlerVoid(shopWindowShow)
+impHandlerVoid(dropShortcutWindowShow)
+impHandlerVoid(killStatsWindowShow)
+impHandlerVoid(spellShortcutWindowShow)
+impHandlerVoid(whoIsOnlineWindowShow)
+impHandlerVoid(didYouKnowWindowShow)
+impHandlerVoid(questsWindowShow)
+impHandlerVoid(bankWindowShow)
+impHandlerVoid(cartWindowShow)
+impHandlerVoid(updaterWindowShow)
+impHandlerVoid(quickWindowShow)
+impHandlerVoid(mailWindowShow)
+impHandlerVoid(serverInfoWindowShow)
+impHandlerVoid(showItems)
+
+} // namespace Actions
diff --git a/src/progs/dyecmd/client.cpp b/src/progs/dyecmd/client.cpp
new file mode 100644
index 000000000..42b570a6b
--- /dev/null
+++ b/src/progs/dyecmd/client.cpp
@@ -0,0 +1,813 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2017 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 "client.h"
+
+#include "configmanager.h"
+#include "dirs.h"
+#include "eventsmanager.h"
+#include "graphicsmanager.h"
+#include "main.h"
+#include "settings.h"
+#include "soundmanager.h"
+
+#include "fs/virtfs/fs.h"
+#include "fs/virtfs/tools.h"
+
+#include "gui/dialogsmanager.h"
+#include "gui/gui.h"
+#include "gui/skin.h"
+#include "gui/popupmanager.h"
+#include "gui/windowmanager.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/createwidget.h"
+#include "gui/widgets/desktop.h"
+#include "gui/widgets/window.h"
+#include "gui/widgets/windowcontainer.h"
+
+#include "input/inputmanager.h"
+#include "input/joystick.h"
+#include "input/keyboardconfig.h"
+
+#include "input/touch/touchmanager.h"
+
+#include "resources/imagehelper.h"
+
+#include "resources/dye/dyepalette.h"
+
+#include "resources/resourcemanager/resourcemanager.h"
+
+#include "utils/cpu.h"
+#include "utils/delete2.h"
+#include "utils/env.h"
+#include "utils/fuzzer.h"
+#include "utils/gettext.h"
+#include "utils/gettexthelper.h"
+#include "utils/mrand.h"
+#ifdef ANDROID
+#include "fs/paths.h"
+#endif // ANDROID
+
+#include "utils/sdlcheckutils.h"
+#include "utils/timer.h"
+
+#include "utils/translation/translationmanager.h"
+
+#include "configuration.h"
+
+#include "net/ipc.h"
+
+#ifdef WIN32
+PRAGMA48(GCC diagnostic push)
+PRAGMA48(GCC diagnostic ignored "-Wshadow")
+#include <SDL_syswm.h>
+PRAGMA48(GCC diagnostic pop)
+#include <sys/time.h>
+#include "fs/specialfolder.h"
+#undef ERROR
+#endif // WIN32
+
+#ifdef ANDROID
+#ifndef USE_SDL2
+PRAGMA48(GCC diagnostic push)
+PRAGMA48(GCC diagnostic ignored "-Wshadow")
+#include <SDL_screenkeyboard.h>
+PRAGMA48(GCC diagnostic pop)
+#include <fstream>
+#endif // USE_SDL2
+#endif // ANDROID
+
+PRAGMA48(GCC diagnostic push)
+PRAGMA48(GCC diagnostic ignored "-Wshadow")
+#ifdef USE_SDL2
+#include <SDL2_framerate.h>
+#else // USE_SDL2
+#include <SDL_framerate.h>
+#endif // USE_SDL2
+PRAGMA48(GCC diagnostic pop)
+
+#include "debug.h"
+
+std::string errorMessage;
+
+Client *client = nullptr;
+
+extern FPSmanager fpsManager;
+
+volatile bool runCounters;
+bool isSafeMode = false;
+int serverVersion = 0;
+int packetVersion = 0;
+unsigned int tmwServerVersion = 0;
+time_t start_time;
+unsigned int mLastHost = 0;
+unsigned long mSearchHash = 0;
+int textures_count = 0;
+
+Client::Client() :
+ ActionListener(),
+ mCurrentDialog(nullptr),
+ mSetupButton(nullptr),
+ mVideoButton(nullptr),
+ mHelpButton(nullptr),
+ mAboutButton(nullptr),
+ mThemesButton(nullptr),
+ mPerfomanceButton(nullptr),
+#ifdef ANDROID
+ mCloseButton(nullptr),
+#endif // ANDROID
+ mState(State::GAME),
+ mOldState(State::START),
+ mSkin(nullptr),
+ mButtonPadding(1),
+ mButtonSpacing(3)
+{
+ WindowManager::init();
+}
+
+void Client::testsInit()
+{
+}
+
+void Client::testsClear()
+{
+}
+
+// +++ need remove duplicate from here
+void Client::gameInit()
+{
+ logger = new Logger;
+
+ initRand();
+
+ // Load branding information
+ if (!settings.options.brandingPath.empty())
+ branding.init(settings.options.brandingPath);
+ setBrandingDefaults(branding);
+
+ Dirs::initRootDir();
+ Dirs::initHomeDir();
+
+ // Configure logger
+ if (!settings.options.logFileName.empty())
+ {
+ settings.logFileName = settings.options.logFileName;
+ }
+ else
+ {
+ settings.logFileName = pathJoin(settings.localDataDir,
+ "manaplus.log");
+ }
+ logger->setLogFile(settings.logFileName);
+
+#ifdef USE_FUZZER
+ Fuzzer::init();
+#endif // USE_FUZZER
+
+ if (settings.options.test.empty())
+ ConfigManager::backupConfig("config.xml");
+ ConfigManager::initConfiguration();
+ setPathsDefaults(paths);
+ initPaths();
+ logger->log("init 4");
+ logger->setDebugLog(config.getBoolValue("debugLog"));
+ logger->setReportUnimplemented(config.getBoolValue("unimplimentedLog"));
+
+ config.incValue("runcount");
+
+#ifndef ANDROID
+ if (settings.options.test.empty())
+ ConfigManager::storeSafeParameters();
+#endif // ANDROID
+
+ if (!VirtFs::setWriteDir(settings.localDataDir))
+ {
+ logger->error(strprintf("%s couldn't be set as home directory! "
+ "Exiting.", settings.localDataDir.c_str()));
+ }
+
+ GettextHelper::initLang();
+
+/*
+ chatLogger = new ChatLogger;
+ if (settings.options.chatLogDir.empty())
+ {
+ chatLogger->setBaseLogDir(settings.localDataDir
+ + std::string("/logs/"));
+ }
+ else
+ {
+ chatLogger->setBaseLogDir(settings.options.chatLogDir);
+ }
+*/
+ logger->setLogToStandardOut(config.getBoolValue("logToStandardOut"));
+
+ // Log the client version
+ logger->log1(FULL_VERSION);
+ logger->log("Start configPath: " + config.getConfigPath());
+
+ Dirs::initScreenshotDir();
+
+ // Initialize SDL
+ logger->log1("Initializing SDL...");
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
+ {
+ logger->safeError(strprintf("Could not initialize SDL: %s",
+ SDL_GetError()));
+ }
+ atexit(SDL_Quit);
+
+#ifndef USE_SDL2
+ SDL_EnableUNICODE(1);
+#endif // USE_SDL2
+
+ WindowManager::applyKeyRepeat();
+
+ // disable unused SDL events
+#ifndef USE_SDL2
+ SDL_EventState(SDL_VIDEOEXPOSE, SDL_IGNORE);
+#endif // USE_SDL2
+
+ SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
+ SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
+
+#ifdef WIN32
+ Dirs::extractDataDir();
+ Dirs::mountDataDir();
+#endif // WIN32
+
+ WindowManager::setIcon();
+ ConfigManager::checkConfigVersion();
+ logVars();
+ Cpu::detect();
+ DyePalette::initFunctions();
+#if defined(USE_OPENGL)
+#if !defined(ANDROID) && !defined(__APPLE__) && !defined(__native_client__)
+ if (!settings.options.safeMode && settings.options.test.empty()
+ && !config.getBoolValue("videodetected"))
+ {
+ graphicsManager.detectVideoSettings();
+ }
+#endif // !defined(ANDROID) && !defined(__APPLE__) &&
+ // !defined(__native_client__)
+#endif // defined(USE_OPENGL)
+
+ updateEnv();
+ initGraphics();
+
+#ifndef WIN32
+ Dirs::extractDataDir();
+ Dirs::mountDataDir();
+#endif // WIN32
+
+ Dirs::updateDataPath();
+
+ // Add the main data directories to our PhysicsFS search path
+ if (!settings.options.dataPath.empty())
+ {
+ VirtFs::mountDir(settings.options.dataPath,
+ Append_false);
+ }
+
+ // Add the local data directory to PhysicsFS search path
+ VirtFs::mountDir(settings.localDataDir,
+ Append_false);
+ TranslationManager::loadCurrentLang();
+ TranslationManager::loadDictionaryLang();
+#ifdef ENABLE_CUSTOMNLS
+ TranslationManager::loadGettextLang();
+#endif // ENABLE_CUSTOMNLS
+
+ WindowManager::initTitle();
+
+ mainGraphics->postInit();
+
+ theme = new Theme;
+ Theme::selectSkin();
+ touchManager.init();
+
+ // Initialize the item and emote shortcuts.
+// for (size_t f = 0; f < SHORTCUT_TABS; f ++)
+// itemShortcut[f] = new ItemShortcut(f);
+// emoteShortcut = new EmoteShortcut;
+// dropShortcut = new DropShortcut;
+
+ gui = new Gui;
+ gui->postInit(mainGraphics);
+ dialogsManager = new DialogsManager;
+ popupManager = new PopupManager;
+
+ initSoundManager();
+ eventsManager.init();
+
+ // Initialize keyboard
+ keyboard.init();
+ inputManager.init();
+
+ // Initialise player relations
+ Joystick::init();
+ WindowManager::createWindows();
+
+ keyboard.update();
+ if (joystick != nullptr)
+ joystick->update();
+
+// if (mState != State::ERROR)
+// mState = State::CHOOSE_SERVER;
+
+ startTimers();
+
+ const int fpsLimit = config.getIntValue("fpslimit");
+ settings.limitFps = fpsLimit > 0;
+
+ SDL_initFramerate(&fpsManager);
+ WindowManager::setFramerate(fpsLimit);
+
+ start_time = time(nullptr);
+
+// PlayerInfo::init();
+
+#ifdef ANDROID
+#ifndef USE_SDL2
+ WindowManager::updateScreenKeyboard(SDL_GetScreenKeyboardHeight(nullptr));
+#endif // USE_SDL2
+#endif // ANDROID
+
+ mSkin = theme->load("windowmenu.xml", "");
+ if (mSkin != nullptr)
+ {
+ mButtonPadding = mSkin->getPadding();
+ mButtonSpacing = mSkin->getOption("spacing", 3);
+ }
+}
+
+Client::~Client()
+{
+ if (!settings.options.testMode)
+ gameClear();
+ else
+ testsClear();
+}
+
+void Client::initSoundManager()
+{
+ // Initialize sound engine
+ try
+ {
+ if (config.getBoolValue("sound"))
+ soundManager.init();
+
+ soundManager.setSfxVolume(config.getIntValue("sfxVolume"));
+ soundManager.setMusicVolume(config.getIntValue("musicVolume"));
+ }
+ catch (const char *const err)
+ {
+ mState = State::ERROR;
+ errorMessage = err;
+ logger->log("Warning: %s", err);
+ }
+ soundManager.playMusic(branding.getValue(
+ "loginMusic",
+ "Magick - Real.ogg"),
+ SkipError_true);
+}
+
+void Client::initGraphics()
+{
+ WindowManager::applyVSync();
+ runCounters = config.getBoolValue("packetcounters");
+
+ graphicsManager.initGraphics();
+
+ imageHelper->postInit();
+ setConfigDefaults2(config);
+ WindowManager::applyGrabMode();
+ WindowManager::applyGamma();
+
+ mainGraphics->beginDraw();
+}
+
+void Client::gameClear()
+{
+ if (logger != nullptr)
+ logger->log1("Quitting1");
+
+ eventsManager.shutdown();
+ WindowManager::deleteWindows();
+ if (windowContainer != nullptr)
+ windowContainer->slowLogic();
+
+ stopTimers();
+
+ delete2(ipc);
+
+ if (logger != nullptr)
+ logger->log1("Quitting2");
+
+ delete2(mCurrentDialog);
+ delete2(popupManager);
+ delete2(dialogsManager);
+ delete2(gui);
+
+ if (logger != nullptr)
+ logger->log1("Quitting3");
+
+ GraphicsManager::deleteRenderers();
+
+ if (logger != nullptr)
+ logger->log1("Quitting4");
+
+ XML::cleanupXML();
+
+ if (logger != nullptr)
+ logger->log1("Quitting5");
+
+ // Shutdown sound
+ soundManager.close();
+
+ if (logger != nullptr)
+ logger->log1("Quitting6");
+
+ touchManager.clear();
+ ResourceManager::deleteInstance();
+
+ if (logger != nullptr)
+ logger->log1("Quitting8");
+
+ WindowManager::deleteIcon();
+
+ if (logger != nullptr)
+ logger->log1("Quitting9");
+
+ delete2(joystick);
+
+ keyboard.deinit();
+
+ if (logger != nullptr)
+ logger->log1("Quitting10");
+
+ soundManager.shutdown();
+ touchManager.shutdown();
+
+#ifdef DEBUG_CONFIG
+ config.enableKeyLogging();
+#endif // DEBUG_CONFIG
+
+ config.removeOldKeys();
+ config.write();
+ serverConfig.write();
+
+ config.clear();
+ serverConfig.clear();
+
+ if (logger != nullptr)
+ logger->log1("Quitting11");
+
+#ifdef USE_PROFILER
+ Perfomance::clear();
+#endif // USE_PROFILER
+
+#ifdef DEBUG_OPENGL_LEAKS
+ if (logger)
+ logger->log("textures left: %d", textures_count);
+#endif // DEBUG_OPENGL_LEAKS
+
+ Graphics::cleanUp();
+
+ if (logger != nullptr)
+ logger->log1("Quitting12");
+
+// delete2(chatLogger);
+ TranslationManager::close();
+ VirtFs::deinit();
+}
+
+#define ADDBUTTON(var, object) var = object; \
+ x -= var->getWidth() + mButtonSpacing; \
+ var->setPosition(x, mButtonPadding); \
+ top->add(var);
+
+void Client::stateGame()
+{
+ if (gui == nullptr)
+ return;
+
+ BasicContainer2 *const top = static_cast<BasicContainer2*>(
+ gui->getTop());
+
+ if (top == nullptr)
+ return;
+
+ CREATEWIDGETV(desktop, Desktop, nullptr);
+ top->add(desktop);
+ int x = top->getWidth() - mButtonPadding;
+ ADDBUTTON(mSetupButton, new Button(desktop,
+ // TRANSLATORS: setup tab quick button
+ _("Setup"), "Setup", this))
+ ADDBUTTON(mPerfomanceButton, new Button(desktop,
+ // TRANSLATORS: perfoamance tab quick button
+ _("Performance"), "Perfomance", this))
+ ADDBUTTON(mVideoButton, new Button(desktop,
+ // TRANSLATORS: video tab quick button
+ _("Video"), "Video", this))
+ ADDBUTTON(mThemesButton, new Button(desktop,
+ // TRANSLATORS: theme tab quick button
+ _("Theme"), "Themes", this))
+ ADDBUTTON(mAboutButton, new Button(desktop,
+ // TRANSLATORS: theme tab quick button
+ _("About"), "about", this))
+ ADDBUTTON(mHelpButton, new Button(desktop,
+ // TRANSLATORS: theme tab quick button
+ _("Help"), "help", this))
+#ifdef ANDROID
+ ADDBUTTON(mCloseButton, new Button(desktop,
+ // TRANSLATORS: close quick button
+ _("Close"), "close", this))
+#endif // ANDROID
+
+ desktop->setSize(mainGraphics->getWidth(),
+ mainGraphics->getHeight());
+}
+
+int Client::gameExec()
+{
+ int lastTickTime = tick_time;
+
+ while (mState != State::EXIT)
+ {
+ PROFILER_START();
+ if (eventsManager.handleEvents())
+ continue;
+
+ BLOCK_START("Client::gameExec 4")
+ if (gui != nullptr)
+ gui->logic();
+ cur_time = time(nullptr);
+ int k = 0;
+ while (lastTickTime != tick_time && k < 40)
+ {
+// if (mGame)
+// mGame->logic();
+// else
+ if (gui != nullptr)
+ gui->handleInput();
+
+ ++lastTickTime;
+ k ++;
+ }
+ soundManager.logic();
+
+ logic_count += k;
+ if (gui != nullptr)
+ gui->slowLogic();
+// if (mGame)
+// mGame->slowLogic();
+ slowLogic();
+ BLOCK_END("Client::gameExec 4")
+
+ // This is done because at some point tick_time will wrap.
+ lastTickTime = tick_time;
+
+ // Update the screen when application is visible, delay otherwise.
+ if (!WindowManager::getIsMinimized())
+ {
+ frame_count++;
+ if (gui != nullptr)
+ gui->draw();
+ mainGraphics->updateScreen();
+ }
+ else
+ {
+ SDL_Delay(100);
+ }
+
+ BLOCK_START("~Client::SDL_framerateDelay")
+ if (settings.limitFps)
+ SDL_framerateDelay(&fpsManager);
+ BLOCK_END("~Client::SDL_framerateDelay")
+
+ BLOCK_START("Client::gameExec 6")
+/*
+ if (mState == State::CONNECT_GAME)
+ {
+ stateConnectGame1();
+ }
+*/
+ BLOCK_END("Client::gameExec 6")
+
+ if (mState != mOldState)
+ {
+ BLOCK_START("Client::gameExec 7")
+
+ mOldState = mState;
+
+ // Get rid of the dialog of the previous state
+ delete2(mCurrentDialog);
+
+ // State has changed, while the quitDialog was active, it might
+ // not be correct anymore
+/*
+ if (mQuitDialog)
+ {
+ mQuitDialog->scheduleDelete();
+ mQuitDialog = nullptr;
+ }
+*/
+ BLOCK_END("Client::gameExec 7")
+
+ BLOCK_START("Client::gameExec 8")
+ PRAGMA45(GCC diagnostic push)
+ PRAGMA45(GCC diagnostic ignored "-Wswitch-enum")
+ switch (mState)
+ {
+ case State::GAME:
+ stateGame();
+ break;
+
+ case State::LOAD_DATA:
+ {
+ BLOCK_START("Client::gameExec State::LOAD_DATA")
+ logger->log1("State: LOAD DATA");
+
+ // If another data path has been set,
+ // we don't load any other files...
+ if (settings.options.dataPath.empty())
+ {
+ // Add customdata directory
+ VirtFs::searchAndAddArchives(
+ "customdata/",
+ "zip",
+ Append_false);
+ }
+
+ if (!settings.options.skipUpdate)
+ {
+ VirtFs::searchAndAddArchives(pathJoin(
+ settings.updatesDir, "local/"),
+ "zip",
+ Append_false);
+
+ VirtFs::mountDir(pathJoin(
+ settings.localDataDir,
+ settings.updatesDir,
+ "local/"),
+ Append_false);
+ }
+
+ logger->log("Init paths");
+ paths.init("paths.xml", UseVirtFs_true);
+ setPathsDefaults(paths);
+ initPaths();
+ TranslationManager::loadCurrentLang();
+ TranslationManager::loadDictionaryLang();
+
+ if (desktop != nullptr)
+ desktop->reloadWallpaper();
+
+ mState = State::GET_CHARACTERS;
+ BLOCK_END("Client::gameExec State::LOAD_DATA")
+ break;
+ }
+ case State::START:
+ default:
+ mState = State::FORCE_QUIT;
+ break;
+ }
+ PRAGMA45(GCC diagnostic pop)
+ BLOCK_END("Client::gameExec 8")
+ }
+ PROFILER_END();
+ }
+
+ return 0;
+}
+
+void Client::action(const ActionEvent &event)
+{
+ std::string tab;
+ const std::string &eventId = event.getId();
+
+ if (eventId == "close")
+ {
+ setState(State::FORCE_QUIT);
+ return;
+ }
+ if (eventId == "Setup")
+ {
+ tab.clear();
+ }
+ else if (eventId == "help")
+ {
+ inputManager.executeAction(InputAction::WINDOW_HELP);
+ return;
+ }
+ else if (eventId == "about")
+ {
+ inputManager.executeAction(InputAction::WINDOW_ABOUT);
+ return;
+ }
+ else if (eventId == "Video")
+ {
+ tab = "Video";
+ }
+ else if (eventId == "Themes")
+ {
+ tab = "Theme";
+ }
+ else if (eventId == "Perfomance")
+ {
+ tab = "Perfomance";
+ }
+ else
+ {
+ return;
+ }
+}
+
+void Client::moveButtons(const int width)
+{
+ if (mSetupButton != nullptr)
+ {
+ int x = width - mSetupButton->getWidth() - mButtonPadding;
+ mSetupButton->setPosition(x, mButtonPadding);
+#ifndef WIN32
+ x -= mPerfomanceButton->getWidth() + mButtonSpacing;
+ mPerfomanceButton->setPosition(x, mButtonPadding);
+
+ x -= mVideoButton->getWidth() + mButtonSpacing;
+ mVideoButton->setPosition(x, mButtonPadding);
+
+ x -= mThemesButton->getWidth() + mButtonSpacing;
+ mThemesButton->setPosition(x, mButtonPadding);
+
+ x -= mAboutButton->getWidth() + mButtonSpacing;
+ mAboutButton->setPosition(x, mButtonPadding);
+
+ x -= mHelpButton->getWidth() + mButtonSpacing;
+ mHelpButton->setPosition(x, mButtonPadding);
+#ifdef ANDROID
+ x -= mCloseButton->getWidth() + mButtonSpacing;
+ mCloseButton->setPosition(x, mButtonPadding);
+#endif // ANDROID
+#endif // WIN32
+ }
+}
+
+void Client::windowRemoved(const Window *const window)
+{
+ if (mCurrentDialog == window)
+ mCurrentDialog = nullptr;
+}
+
+void Client::logVars()
+{
+#ifdef ANDROID
+ logger->log("APPDIR: %s", getenv("APPDIR"));
+ logger->log("DATADIR2: %s", getSdStoragePath().c_str());
+#endif // ANDROID
+}
+
+void Client::slowLogic()
+{
+}
+
+int Client::testsExec()
+{
+ return 0;
+}
+
+bool Client::isTmw()
+{
+ const std::string &name = settings.serverName;
+ if (name == "server.themanaworld.org"
+ || name == "themanaworld.org"
+ || name == "167.114.185.71")
+ {
+ return true;
+ }
+ return false;
+}
+
+void Client::initPaths()
+{
+}
diff --git a/src/progs/dyecmd/client.h b/src/progs/dyecmd/client.h
new file mode 100644
index 000000000..96d230c60
--- /dev/null
+++ b/src/progs/dyecmd/client.h
@@ -0,0 +1,119 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2017 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 PROGS_DYECMD_CLIENT_H
+#define PROGS_DYECMD_CLIENT_H
+
+#include "enums/state.h"
+
+#include "listeners/actionlistener.h"
+
+#include "localconsts.h"
+
+class Button;
+class Skin;
+class Window;
+
+extern bool isSafeMode;
+extern int serverVersion;
+extern unsigned int tmwServerVersion;
+extern time_t start_time;
+extern int textures_count;
+
+extern std::string errorMessage;
+
+/**
+ * The core part of the client. This class initializes all subsystems, runs
+ * the event loop, and shuts everything down again.
+ */
+class Client final : public ActionListener
+{
+ public:
+ Client();
+
+ A_DELETE_COPY(Client)
+
+ ~Client();
+
+ void gameInit();
+
+ void testsInit();
+
+ int gameExec();
+
+ static int testsExec();
+
+ void setState(const StateT state)
+ { mState = state; }
+
+ StateT getState() const noexcept2 A_WARN_UNUSED
+ { return mState; }
+
+ void action(const ActionEvent &event) override final;
+
+ void moveButtons(const int width);
+
+ void windowRemoved(const Window *const window);
+
+ void slowLogic();
+
+ static bool isTmw();
+
+ private:
+ void stateGame();
+
+ void initSoundManager();
+
+ static void initGraphics();
+
+ static void initPaths();
+
+ void gameClear();
+
+ void testsClear();
+
+ static void logVars();
+
+ Window *mCurrentDialog;
+ Button *mSetupButton;
+ Button *mVideoButton;
+ Button *mHelpButton;
+ Button *mAboutButton;
+ Button *mThemesButton;
+ Button *mPerfomanceButton;
+#ifdef ANDROID
+ Button *mCloseButton;
+#endif // ANDROID
+
+ StateT mState;
+ StateT mOldState;
+
+ Skin *mSkin;
+ int mButtonPadding;
+ int mButtonSpacing;
+};
+
+extern Client *client;
+extern unsigned int mLastHost;
+extern unsigned long mSearchHash;
+
+#endif // PROGS_DYECMD_CLIENT_H
diff --git a/src/progs/dyecmd/dyemain.cpp b/src/progs/dyecmd/dyemain.cpp
new file mode 100644
index 000000000..2217508cc
--- /dev/null
+++ b/src/progs/dyecmd/dyemain.cpp
@@ -0,0 +1,119 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2013-2017 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 "logger.h"
+
+#include "graphicsmanager.h"
+#include "maingui.h"
+#include "sdlshared.h"
+
+#include "fs/virtfs/fs.h"
+
+#include "resources/imagewriter.h"
+
+#include "resources/image/image.h"
+
+#ifdef USE_SDL2
+#include "resources/surfaceimagehelper.h"
+#endif // USE_SDL2
+
+#include "resources/loaders/imageloader.h"
+
+#include "utils/gettext.h"
+
+#include <iostream>
+
+#ifndef USE_SDL2
+#include "resources/sdlimagehelper.h"
+#endif // USE_SDL2
+
+PRAGMA48(GCC diagnostic push)
+PRAGMA48(GCC diagnostic ignored "-Wshadow")
+#include <SDL.h>
+PRAGMA48(GCC diagnostic pop)
+
+#include "debug.h"
+
+static void printHelp()
+{
+ // TRANSLATORS: command line help
+ std::cout << _("dyecmd srcfile dyestring dstfile") << std::endl;
+ // TRANSLATORS: command line help
+ std::cout << _("or") << std::endl;
+ // TRANSLATORS: command line help
+ std::cout << _("dyecmd srcdyestring dstfile") << std::endl;
+}
+
+int main(int argc, char **argv)
+{
+ if (argc == 2 && (strcmp(argv[1], "--help") != 0))
+ {
+ return mainGui(argc, argv);
+ }
+ if (argc < 3 || argc > 4)
+ {
+ printHelp();
+ return 1;
+ }
+
+ logger = new Logger;
+ logger->setLogToStandardOut(false);
+
+ VirtFs::init(argv[0]);
+ SDL_Init(SDL_INIT_VIDEO);
+
+ graphicsManager.createWindow(10, 10, 0, SDL_ANYFORMAT);
+
+#ifdef USE_SDL2
+ imageHelper = new SurfaceImageHelper;
+#else // USE_SDL2
+
+ imageHelper = new SDLImageHelper;
+#endif // USE_SDL2
+
+ VirtFs::setWriteDir(".");
+ VirtFs::mountDir(".", Append_false);
+ VirtFs::mountDir("/", Append_false);
+ std::string src = argv[1];
+ std::string dst;
+ if (argc == 4)
+ {
+ src.append("|").append(argv[2]);
+ dst = argv[3];
+ }
+ else
+ {
+ dst = argv[2];
+ }
+
+ Image *image = Loader::getImage(src);
+ if (image == nullptr)
+ {
+ printf("Error loading image\n");
+ VirtFs::deinit();
+ return 1;
+ }
+ SDL_Surface *const surface = ImageHelper::convertTo32Bit(
+ image->getSDLSurface());
+ ImageWriter::writePNG(surface, dst);
+ SDL_FreeSurface(surface);
+ VirtFs::deinit();
+ return 0;
+}
diff --git a/src/progs/dyecmd/gui/viewport.cpp b/src/progs/dyecmd/gui/viewport.cpp
new file mode 100644
index 000000000..30e89518e
--- /dev/null
+++ b/src/progs/dyecmd/gui/viewport.cpp
@@ -0,0 +1,272 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2017 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 "progs/dyecmd/gui/viewport.h"
+
+#include "configuration.h"
+#include "sdlshared.h"
+
+#include "gui/gui.h"
+#include "gui/popupmanager.h"
+
+#include "render/graphics.h"
+
+#include "debug.h"
+
+Viewport *viewport = nullptr;
+
+extern volatile int tick_time;
+
+Viewport::Viewport() :
+ WindowContainer(nullptr),
+ MouseListener(),
+ ConfigListener(),
+ mMouseX(0),
+ mMouseY(0),
+ mMap(nullptr),
+ mHoverBeing(nullptr),
+ mHoverItem(nullptr),
+ mHoverSign(nullptr),
+ mScrollRadius(config.getIntValue("ScrollRadius")),
+ mScrollLaziness(config.getIntValue("ScrollLaziness")),
+ mScrollCenterOffsetX(config.getIntValue("ScrollCenterOffsetX")),
+ mScrollCenterOffsetY(config.getIntValue("ScrollCenterOffsetY")),
+ mMousePressX(0),
+ mMousePressY(0),
+ mPixelViewX(0),
+ mPixelViewY(0),
+ mLocalWalkTime(-1),
+ mCameraRelativeX(0),
+ mCameraRelativeY(0),
+ mShowBeingPopup(config.getBoolValue("showBeingPopup")),
+ mSelfMouseHeal(config.getBoolValue("selfMouseHeal")),
+ mEnableLazyScrolling(config.getBoolValue("enableLazyScrolling")),
+ mMouseDirectionMove(config.getBoolValue("mouseDirectionMove")),
+ mLongMouseClick(config.getBoolValue("longmouseclick")),
+ mMouseClicked(false),
+ mPlayerFollowMouse(false)
+{
+ setOpaque(Opaque_false);
+ addMouseListener(this);
+
+ config.addListener("ScrollLaziness", this);
+ config.addListener("ScrollRadius", this);
+ config.addListener("showBeingPopup", this);
+ config.addListener("selfMouseHeal", this);
+ config.addListener("enableLazyScrolling", this);
+ config.addListener("mouseDirectionMove", this);
+ config.addListener("longmouseclick", this);
+
+ setFocusable(true);
+}
+
+Viewport::~Viewport()
+{
+ config.removeListeners(this);
+ CHECKLISTENERS
+}
+
+void Viewport::setMap(Map *const map A_UNUSED)
+{
+}
+
+void Viewport::draw(Graphics *const graphics)
+{
+ BLOCK_START("Viewport::draw 1")
+ static int lastTick = tick_time;
+
+ graphics->setColor(Color(64, 64, 64));
+ graphics->fillRectangle(
+ Rect(0, 0, getWidth(), getHeight()));
+
+ // Avoid freaking out when tick_time overflows
+ if (tick_time < lastTick)
+ lastTick = tick_time;
+
+ // Draw contained widgets
+ WindowContainer::draw(graphics);
+ BLOCK_END("Viewport::draw 1")
+}
+
+void Viewport::safeDraw(Graphics *const graphics)
+{
+ Viewport::draw(graphics);
+}
+
+void Viewport::logic()
+{
+ BLOCK_START("Viewport::logic")
+ // Make the player follow the mouse position
+ // if the mouse is dragged elsewhere than in a window.
+ Gui::getMouseState(mMouseX, mMouseY);
+ BLOCK_END("Viewport::logic")
+}
+
+void Viewport::followMouse()
+{
+}
+
+void Viewport::drawDebugPath(Graphics *const graphics A_UNUSED)
+{
+}
+
+bool Viewport::openContextMenu(const MouseEvent &event A_UNUSED)
+{
+ return false;
+}
+
+void Viewport::mousePressed(MouseEvent &event)
+{
+ if (event.getSource() != this || event.isConsumed())
+ return;
+
+ mMouseClicked = true;
+
+ mMousePressX = event.getX();
+ mMousePressY = event.getY();
+ const MouseButtonT eventButton = event.getButton();
+
+ // Right click might open a popup
+ if (eventButton == MouseButton::RIGHT)
+ {
+ if (openContextMenu(event))
+ return;
+ }
+
+ // If a popup is active, just remove it
+ if (PopupManager::isPopupMenuVisible())
+ {
+ mPlayerFollowMouse = false;
+ PopupManager::hidePopupMenu();
+ return;
+ }
+
+ // Left click can cause different actions
+ if (!mLongMouseClick && eventButton == MouseButton::LEFT)
+ {
+ if (leftMouseAction())
+ {
+ mPlayerFollowMouse = false;
+ return;
+ }
+ }
+}
+
+void Viewport::walkByMouse(const MouseEvent &event A_UNUSED)
+{
+}
+
+void Viewport::mouseDragged(MouseEvent &event)
+{
+ if (event.getSource() != this || event.isConsumed())
+ {
+ mPlayerFollowMouse = false;
+ return;
+ }
+ if (mMouseClicked)
+ {
+ if (abs(event.getX() - mMousePressX) > 32
+ || abs(event.getY() - mMousePressY) > 32)
+ {
+ mPlayerFollowMouse = true;
+ }
+ }
+
+ walkByMouse(event);
+}
+
+void Viewport::mouseReleased(MouseEvent &event)
+{
+ mPlayerFollowMouse = false;
+ mLocalWalkTime = -1;
+ if (mLongMouseClick && mMouseClicked)
+ {
+ mMouseClicked = false;
+ if (event.getSource() != this || event.isConsumed())
+ return;
+ const MouseButtonT eventButton = event.getButton();
+ if (eventButton == MouseButton::LEFT)
+ {
+ // long button press
+ if ((gui != nullptr) && gui->isLongPress())
+ {
+ if (openContextMenu(event))
+ {
+ gui->resetClickCount();
+ return;
+ }
+ }
+ else
+ {
+ if (leftMouseAction())
+ return;
+ }
+ walkByMouse(event);
+ }
+ }
+}
+
+void Viewport::optionChanged(const std::string &name)
+{
+ if (name == "ScrollLaziness")
+ mScrollLaziness = config.getIntValue("ScrollLaziness");
+ else if (name == "ScrollRadius")
+ mScrollRadius = config.getIntValue("ScrollRadius");
+ else if (name == "showBeingPopup")
+ mShowBeingPopup = config.getBoolValue("showBeingPopup");
+ else if (name == "selfMouseHeal")
+ mSelfMouseHeal = config.getBoolValue("selfMouseHeal");
+ else if (name == "enableLazyScrolling")
+ mEnableLazyScrolling = config.getBoolValue("enableLazyScrolling");
+ else if (name == "mouseDirectionMove")
+ mMouseDirectionMove = config.getBoolValue("mouseDirectionMove");
+ else if (name == "longmouseclick")
+ mLongMouseClick = config.getBoolValue("longmouseclick");
+}
+
+void Viewport::mouseMoved(MouseEvent &event A_UNUSED)
+{
+}
+
+void Viewport::toggleMapDrawType()
+{
+}
+
+void Viewport::toggleCameraMode()
+{
+}
+
+void Viewport::cleanHoverItems()
+{
+ mHoverBeing = nullptr;
+ mHoverItem = nullptr;
+ mHoverSign = nullptr;
+}
+
+bool Viewport::leftMouseAction()
+{
+ return false;
+}
+
+void Viewport::videoResized()
+{
+}
diff --git a/src/progs/dyecmd/gui/viewport.h b/src/progs/dyecmd/gui/viewport.h
new file mode 100644
index 000000000..4b69a607c
--- /dev/null
+++ b/src/progs/dyecmd/gui/viewport.h
@@ -0,0 +1,213 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2017 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 PROGS_DYECMD_GUI_VIEWPORT_H
+#define PROGS_DYECMD_GUI_VIEWPORT_H
+
+#include "position.h"
+
+#include "gui/widgets/windowcontainer.h"
+
+#include "listeners/mouselistener.h"
+
+class ActorSprite;
+class Being;
+class FloorItem;
+class Graphics;
+class Map;
+class MapItem;
+
+/**
+ * The viewport on the map. Displays the current map and handles mouse input
+ * and the popup menu.
+ */
+class Viewport final : public WindowContainer,
+ public MouseListener,
+ public ConfigListener
+{
+ public:
+ /**
+ * Constructor.
+ */
+ Viewport();
+
+ A_DELETE_COPY(Viewport)
+
+ /**
+ * Destructor.
+ */
+ ~Viewport();
+
+ /**
+ * Sets the map displayed by the viewport.
+ */
+ void setMap(Map *const map);
+
+ /**
+ * Draws the viewport.
+ */
+ void draw(Graphics *const graphics) override final A_NONNULL(2);
+
+ void safeDraw(Graphics *const graphics) override final A_NONNULL(2);
+
+ /**
+ * Implements player to keep following mouse.
+ */
+ void logic() override final;
+
+ /**
+ * Toggles whether the path debug graphics are shown. normal,
+ * debug with all images and grid, debug with out big images
+ * and with out grid.
+ */
+ void toggleMapDrawType();
+
+ void toggleCameraMode();
+
+ /**
+ * Handles mouse press on map.
+ */
+ void mousePressed(MouseEvent &event) override final;
+
+ /**
+ * Handles mouse move on map
+ */
+ void mouseDragged(MouseEvent &event) override final;
+
+ /**
+ * Handles mouse button release on map.
+ */
+ void mouseReleased(MouseEvent &event) override final;
+
+ /**
+ * Handles mouse move on map.
+ */
+ void mouseMoved(MouseEvent &event) override final;
+
+ /**
+ * A relevant config option changed.
+ */
+ void optionChanged(const std::string &name) override final;
+
+ /**
+ * Returns camera x offset in pixels.
+ */
+ int getCameraX() const noexcept2 A_WARN_UNUSED
+ { return mPixelViewX; }
+
+ /**
+ * Returns camera y offset in pixels.
+ */
+ int getCameraY() const noexcept2 A_WARN_UNUSED
+ { return mPixelViewY; }
+
+ /**
+ * Changes viewpoint by relative pixel coordinates.
+ */
+ void scrollBy(const int x, const int y)
+ { mPixelViewX += x; mPixelViewY += y; }
+
+ /**
+ * Clear all hover item, being etc
+ */
+ void cleanHoverItems();
+
+ Map *getMap() const noexcept2 A_WARN_UNUSED
+ { return mMap; }
+
+ void moveCamera(const int dx, const int dy);
+
+ int getCameraRelativeX() const noexcept2 A_WARN_UNUSED
+ { return mCameraRelativeX; }
+
+ int getCameraRelativeY() const noexcept2 A_WARN_UNUSED
+ { return mCameraRelativeY; }
+
+ void setCameraRelativeX(const int n) noexcept2
+ { mCameraRelativeX = n; }
+
+ void setCameraRelativeY(const int n) noexcept2
+ { mCameraRelativeY = n; }
+
+ void videoResized();
+
+ int mMouseX; /**< Current mouse position in pixels. */
+ int mMouseY; /**< Current mouse position in pixels. */
+
+ private:
+ /**
+ * Finds a path from the player to the mouse, and draws it. This is for
+ * debug purposes.
+ */
+ void drawDebugPath(Graphics *const graphics) A_NONNULL(2);
+
+ /**
+ * Draws the given path.
+ */
+ void drawPath(Graphics *const graphics,
+ const Path &path,
+ const Color &color = Color(255, 0, 0))
+ const A_NONNULL(2);
+
+ bool leftMouseAction();
+
+ bool openContextMenu(const MouseEvent &event);
+
+ void walkByMouse(const MouseEvent &event);
+
+ /**
+ * Make the player go to the mouse position.
+ */
+ void followMouse();
+
+ Map *mMap; /**< The current map. */
+
+ Being *mHoverBeing; /**< Being mouse is currently over. */
+ FloorItem *mHoverItem; /**< FloorItem mouse is currently over. */
+ MapItem *mHoverSign; /**< Map sign mouse is currently over. */
+
+ int mScrollRadius;
+ int mScrollLaziness;
+ int mScrollCenterOffsetX;
+ int mScrollCenterOffsetY;
+ int mMousePressX;
+ int mMousePressY;
+ int mPixelViewX; /**< Current viewpoint in pixels. */
+ int mPixelViewY; /**< Current viewpoint in pixels. */
+
+ int mLocalWalkTime; /**< Timestamp before the next walk can be sent. */
+
+ int mCameraRelativeX;
+ int mCameraRelativeY;
+
+ bool mShowBeingPopup;
+ bool mSelfMouseHeal;
+ bool mEnableLazyScrolling;
+ bool mMouseDirectionMove;
+ bool mLongMouseClick;
+ bool mMouseClicked;
+ bool mPlayerFollowMouse;
+};
+
+extern Viewport *viewport; /**< The viewport. */
+
+#endif // PROGS_DYECMD_GUI_VIEWPORT_H