summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--The Mana World.dev60
-rw-r--r--src/game.cpp148
-rw-r--r--src/gui/button.cpp20
-rw-r--r--src/gui/button.h3
-rw-r--r--src/gui/setup.cpp11
-rw-r--r--src/gui/setup_keyboard.cpp145
-rw-r--r--src/gui/setup_keyboard.h74
-rw-r--r--src/keyboardconfig.cpp129
-rw-r--r--src/keyboardconfig.h208
-rw-r--r--src/main.cpp10
11 files changed, 729 insertions, 93 deletions
diff --git a/ChangeLog b/ChangeLog
index cdfaaa5b..15ba409c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,16 @@
-2007-07-16 Eugenio Favalli <elvenprogrammer@gmail.com>
+2007-07-17 Joshua Langley <joshlangley[at]optusnet.com.au>
+
+ * src/game.cpp: only one key per function.
+ * src/main.cpp: keyboard configuration included.
+ * src/gui/button.cpp, src/gui/button.h: default constructor and
+ init function added.
+ * src/gui/setup.cpp: keyboard setup tab added.
+ * src/gui/setup_keyboard.cpp, src/gui/setup_keyboard.h:
+ Add to project file, it is the keyboard setup tab.
+ * src/keyboardconfig.cpp, src/keyboardconfig.h: Add to project file,
+ the main keyboard config operations.
+
+2007-07-16 Eugenio Favalli <elvenprogrammer@gmail.com>
* tmw.cbp: Fixed description of silk headband.
diff --git a/The Mana World.dev b/The Mana World.dev
index 963e5c7c..b2fa556a 100644
--- a/The Mana World.dev
+++ b/The Mana World.dev
@@ -1,7 +1,7 @@
[Project]
FileName=The Mana World.dev
Name=tmw
-UnitCount=278
+UnitCount=281
Type=0
Ver=1
ObjFiles=
@@ -2550,7 +2550,7 @@ BuildCmd=
[Unit250]
FileName=src\animationparticle.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2560,7 +2560,7 @@ BuildCmd=
[Unit251]
FileName=src\animationparticle.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2570,7 +2570,7 @@ BuildCmd=
[Unit252]
FileName=src\imageparticle.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2580,7 +2580,7 @@ BuildCmd=
[Unit253]
FileName=src\imageparticle.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2590,7 +2590,7 @@ BuildCmd=
[Unit254]
FileName=src\particle.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2600,7 +2600,7 @@ BuildCmd=
[Unit255]
FileName=src\particle.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2610,7 +2610,7 @@ BuildCmd=
[Unit256]
FileName=src\particleemitter.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2620,7 +2620,7 @@ BuildCmd=
[Unit257]
FileName=src\particleemitter.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2630,7 +2630,7 @@ BuildCmd=
[Unit258]
FileName=src\simpleanimation.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2640,7 +2640,7 @@ BuildCmd=
[Unit259]
FileName=src\simpleanimation.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2650,7 +2650,7 @@ BuildCmd=
[Unit260]
FileName=src\textparticle.cpp
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2660,7 +2660,7 @@ BuildCmd=
[Unit261]
FileName=src\textparticle.h
CompileCpp=1
-Folder=tmw
+Folder=
Compile=1
Link=1
Priority=1000
@@ -2828,9 +2828,39 @@ OverrideBuildCmd=0
BuildCmd=
[Unit278]
-FileName=src\resources\equipmentinfo.cpp
+FileName=..\tmw_3367_CR0000016\src\keyboardconfig.cpp
CompileCpp=1
-Folder=tmw
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit279]
+FileName=..\tmw_3367_CR0000016\src\keyboardconfig.h
+CompileCpp=1
+Folder=header
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit280]
+FileName=..\tmw_3367_CR0000016\src\gui\setup_keyboard.cpp
+CompileCpp=1
+Folder=gui/source
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit281]
+FileName=..\tmw_3367_CR0000016\src\gui\setup_keyboard.h
+CompileCpp=1
+Folder=gui/header
Compile=1
Link=1
Priority=1000
diff --git a/src/game.cpp b/src/game.cpp
index 54474b1c..eb990e1b 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -37,6 +37,7 @@
#include "flooritemmanager.h"
#include "graphics.h"
#include "joystick.h"
+#include "keyboardconfig.h"
#include "localplayer.h"
#include "log.h"
#include "npc.h"
@@ -426,6 +427,14 @@ void Game::handleInput()
{
gcn::Window *requestedWindow = NULL;
+ if (//setupWindow->isVisible() &&
+ keyboard.getNewKeyIndex() > keyboard.KEY_NO_VALUE)
+ {
+ keyboard.setNewKey((int) event.key.keysym.sym);
+ keyboard.callbackNewKey();
+ keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE);
+ return;
+ }
switch (event.key.keysym.sym)
{
case SDLK_F1:
@@ -484,54 +493,7 @@ void Game::handleInput()
used = true;
}
break;
-
- // Hide certain windows
- case SDLK_h:
- if (!chatWindow->isFocused())
- {
- statusWindow->setVisible(false);
- inventoryWindow->setVisible(false);
- skillDialog->setVisible(false);
- setupWindow->setVisible(false);
- equipmentWindow->setVisible(false);
- helpWindow->setVisible(false);
- debugWindow->setVisible(false);
- }
- break;
-
- // Picking up items on the floor
- case SDLK_g:
- case SDLK_z:
- if (!chatWindow->isFocused())
- {
- FloorItem *item = floorItemManager->findByCoordinates(
- player_node->mX, player_node->mY);
-
- // If none below the player, try the tile in front of
- // the player
- if (!item) {
- Uint16 x = player_node->mX;
- Uint16 y = player_node->mY;
- if (player_node->getDirection() & Being::UP)
- y--;
- if (player_node->getDirection() & Being::DOWN)
- y++;
- if (player_node->getDirection() & Being::LEFT)
- x--;
- if (player_node->getDirection() & Being::RIGHT)
- x++;
-
- item = floorItemManager->findByCoordinates(x, y);
- }
-
- if (item)
- player_node->pickUp(item);
-
- used = true;
- }
- break;
-
- // Quitting confirmation dialog
+ // Quitting confirmation dialog
case SDLK_ESCAPE:
if (!exitConfirm) {
exitConfirm = new ConfirmDialog(
@@ -545,6 +507,58 @@ void Game::handleInput()
break;
}
+ if (keyboard.isEnabled() && !chatWindow->isFocused())
+ {
+ switch (keyboard.getKeyIndex(event.key.keysym.sym)) {
+ case KeyboardConfig::KEY_PICKUP:
+ {
+ FloorItem *item = floorItemManager->findByCoordinates(
+ player_node->mX, player_node->mY);
+
+ // If none below the player, try the tile in front of
+ // the player
+ if (!item) {
+ Uint16 x = player_node->mX;
+ Uint16 y = player_node->mY;
+ if (player_node->getDirection() & Being::UP)
+ y--;
+ if (player_node->getDirection() & Being::DOWN)
+ y++;
+ if (player_node->getDirection() & Being::LEFT)
+ x--;
+ if (player_node->getDirection() & Being::RIGHT)
+ x++;
+
+ item = floorItemManager->findByCoordinates(x, y);
+ }
+
+ if (item)
+ player_node->pickUp(item);
+
+ used = true;
+ }
+ break;
+ case KeyboardConfig::KEY_SIT:
+ // Player sit action
+ player_node->toggleSit();
+ used = true;
+ break;
+ case KeyboardConfig::KEY_HIDE_WINDOWS:
+ // Hide certain windows
+ if (!chatWindow->isFocused())
+ {
+ statusWindow->setVisible(false);
+ inventoryWindow->setVisible(false);
+ skillDialog->setVisible(false);
+ setupWindow->setVisible(false);
+ equipmentWindow->setVisible(false);
+ helpWindow->setVisible(false);
+ debugWindow->setVisible(false);
+ }
+ break;
+ }
+ }
+
if (requestedWindow)
{
requestedWindow->setVisible(!requestedWindow->isVisible());
@@ -555,18 +569,13 @@ void Game::handleInput()
used = true;
}
+
// Keys pressed together with Alt/Meta
// Emotions and some internal gui windows
if (event.key.keysym.mod & KMOD_ALT)
{
switch (event.key.keysym.sym)
{
- case SDLK_s:
- // Player sit action
- player_node->toggleSit();
- used = true;
- break;
-
case SDLK_p:
// Screenshot (picture, hence the p)
{
@@ -636,41 +645,42 @@ void Game::handleInput()
}
} // End while
-
+ // If the user is configuring the keys then don't respond.
+ if (!keyboard.isEnabled())
+ {
+ return;
+ }
// Moving player around
if (player_node->mAction != Being::DEAD &&
current_npc == 0 &&
!chatWindow->isFocused())
{
// Get the state of the keyboard keys
- Uint8* keys;
- keys = SDL_GetKeyState(NULL);
+ keyboard.refreshActiveKeys();
Uint16 x = player_node->mX;
Uint16 y = player_node->mY;
unsigned char direction = 0;
// Translate pressed keys to movement and direction
- if (keys[SDLK_UP] || keys[SDLK_KP8] ||
- keys[SDLK_KP7] || keys[SDLK_KP9] ||
+ if ( keyboard.isKeyActive(keyboard.KEY_MOVE_UP) ||
joystick && joystick->isUp())
{
direction |= Being::UP;
}
- else if (keys[SDLK_DOWN] || keys[SDLK_KP2] ||
- keys[SDLK_KP1] || keys[SDLK_KP3] ||
+
+ else if ( keyboard.isKeyActive(keyboard.KEY_MOVE_DOWN) ||
joystick && joystick->isDown())
{
direction |= Being::DOWN;
}
- if (keys[SDLK_LEFT] || keys[SDLK_KP4] ||
- keys[SDLK_KP1] || keys[SDLK_KP7] ||
+
+ if ( keyboard.isKeyActive(keyboard.KEY_MOVE_LEFT) ||
joystick && joystick->isLeft())
{
direction |= Being::LEFT;
}
- else if (keys[SDLK_RIGHT] || keys[SDLK_KP6] ||
- keys[SDLK_KP3] || keys[SDLK_KP9] ||
+ else if ( keyboard.isKeyActive(keyboard.KEY_MOVE_RIGHT) ||
joystick && joystick->isRight())
{
direction |= Being::RIGHT;
@@ -679,12 +689,11 @@ void Game::handleInput()
player_node->setWalkingDir(direction);
// Attacking monsters
- if (keys[SDLK_LCTRL] || keys[SDLK_RCTRL] ||
+ if ( keyboard.isKeyActive(keyboard.KEY_ATTACK) ||
joystick && joystick->buttonPressed(0))
{
Being *target = NULL;
- bool newTarget = keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT];
-
+ bool newTarget = keyboard.isKeyActive(keyboard.KEY_TARGET);
// A set target has highest priority
if (newTarget || !player_node->getTarget())
{
@@ -711,7 +720,8 @@ void Game::handleInput()
}
// Target the nearest monster if 'a' pressed
- if (keys[SDLK_a])
+ if ( keyboard.isKeyActive(keyboard.KEY_TARGET_CLOSEST) )
+ //if (keys[SDLK_a])
{
Being *target =
beingManager->findNearestLivingBeing(x, y, 20, Being::MONSTER);
diff --git a/src/gui/button.cpp b/src/gui/button.cpp
index e607b66a..a9212e83 100644
--- a/src/gui/button.cpp
+++ b/src/gui/button.cpp
@@ -37,11 +37,26 @@
ImageRect Button::button[4];
int Button::mInstances = 0;
+Button::Button():
+ mIsLogged(false)
+{
+ init();
+}
+
Button::Button(const std::string& caption, const std::string &actionEventId,
gcn::ActionListener *listener):
gcn::Button(caption),
mIsLogged(false)
{
+ init();
+ setActionEventId(actionEventId);
+ if (listener) {
+ addActionListener(listener);
+ }
+}
+
+void Button::init()
+{
setBorderSize(0);
if (mInstances == 0)
@@ -72,12 +87,7 @@ Button::Button(const std::string& caption, const std::string &actionEventId,
btn[mode]->decRef();
}
}
-
mInstances++;
- setActionEventId(actionEventId);
- if (listener) {
- addActionListener(listener);
- }
}
Button::~Button()
diff --git a/src/gui/button.h b/src/gui/button.h
index eb73e311..68831d5a 100644
--- a/src/gui/button.h
+++ b/src/gui/button.h
@@ -37,6 +37,7 @@ class ImageRect;
*/
class Button : public gcn::Button {
public:
+ Button();
/**
* Constructor, sets the caption of the button to the given string.
*/
@@ -60,6 +61,8 @@ class Button : public gcn::Button {
{ mIsLogged = enable; }
private:
+ void init();
+
static ImageRect button[4]; /**< Button state graphics */
static int mInstances; /**< Number of button instances */
bool mIsLogged; /**< Makes the button appear pressed all the time */
diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp
index 3add3a18..b936f688 100644
--- a/src/gui/setup.cpp
+++ b/src/gui/setup.cpp
@@ -27,6 +27,7 @@
#include "setup_audio.h"
#include "setup_joystick.h"
#include "setup_video.h"
+#include "setup_keyboard.h"
#include "tabbedcontainer.h"
#include "../utils/dtor.h"
@@ -42,8 +43,8 @@ extern Window *skillDialog;
Setup::Setup():
Window("Setup")
{
- int width = 230;
- int height = 245;
+ int width = 260;
+ int height = 305;
setContentSize(width, height);
const char *buttonNames[] = {
@@ -58,7 +59,7 @@ Setup::Setup():
}
TabbedContainer *panel = new TabbedContainer();
- panel->setDimension(gcn::Rectangle(5, 5, 220, 205));
+ panel->setDimension(gcn::Rectangle(5, 5, 250, 265));
panel->setOpaque(false);
SetupTab *tab;
@@ -75,6 +76,10 @@ Setup::Setup():
panel->addTab(tab, "Joystick");
mTabs.push_back(tab);
+ tab = new Setup_Keyboard();
+ panel->addTab(tab, "Keyboard");
+ mTabs.push_back(tab);
+
add(panel);
setLocationRelativeTo(getParent());
diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp
new file mode 100644
index 00000000..6ca149a5
--- /dev/null
+++ b/src/gui/setup_keyboard.cpp
@@ -0,0 +1,145 @@
+/*
+ * The Mana World
+ * Copyright 2007 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "setup_keyboard.h"
+
+#include <guichan/widgets/label.hpp>
+
+#include "button.h"
+#include "ok_dialog.h"
+
+#include "../configuration.h"
+#include "../keyboardconfig.h"
+#include "../log.h"
+
+#include "../utils/tostring.h"
+
+#include <SDL_keyboard.h>
+
+Setup_Keyboard::Setup_Keyboard()
+{
+ setOpaque(false);
+
+ keyboard.setSetupKeyboard(this);
+
+ mKeyLabel = new gcn::Label[keyboard.KEY_TOTAL];
+ mKeyButton = new Button[keyboard.KEY_TOTAL];
+
+ for (int i=0; i < keyboard.KEY_TOTAL; i++)
+ {
+ refreshAssignedKey(i);
+ mKeyLabel[i].setPosition(10, 10+(i*20));
+ add(&mKeyLabel[i]);
+
+ mKeyButton[i].setCaption("Set");
+ mKeyButton[i].adjustSize();
+ mKeyButton[i].addActionListener(this);
+ mKeyButton[i].setActionEventId("sk"+toString(i));
+ mKeyButton[i].setPosition(150,5+(i*20));
+ add(&mKeyButton[i]);
+ }
+ mMakeDefaultButton = new Button("Default", "makeDefault", this);
+ mMakeDefaultButton->setPosition(200, 5);
+ mMakeDefaultButton->addActionListener(this);
+ add(mMakeDefaultButton);
+}
+
+Setup_Keyboard::~Setup_Keyboard()
+{
+ delete [] mKeyLabel;
+ delete [] mKeyButton;
+ delete mMakeDefaultButton;
+}
+
+void Setup_Keyboard::apply()
+{
+ if (keyboard.hasConflicts())
+ {
+ new OkDialog("Key Conflict(s) Detected.",
+ "One or more key conflicts has been detected. "
+ "Resolve them immediately, "
+ "or gameplay might result in unpredictable behaviour");
+ }
+ keyboard.setEnabled(true);
+ keyboard.store();
+}
+
+void Setup_Keyboard::cancel()
+{
+ keyboard.retrieve();
+ keyboard.setEnabled(true);
+ refreshKeys();
+}
+
+void Setup_Keyboard::action(const gcn::ActionEvent &event)
+{
+ if (event.getId() == "makeDefault")
+ {
+ keyboard.makeDefault();
+ refreshKeys();
+ return;
+ }
+ for (int i=0; i < keyboard.KEY_TOTAL; i++)
+ {
+ if (event.getId() == "sk"+toString(i))
+ {
+ keyboard.setEnabled(false);
+ keyboard.setNewKeyIndex(i);
+ enableButtons(false);
+ mKeyLabel[i].setCaption(keyboard.getKeyCaption(i) + ": ?");
+ }
+ }
+}
+
+
+void Setup_Keyboard::enableButtons(bool bValue)
+{
+ for (int i=0; i < keyboard.KEY_TOTAL; i++)
+ {
+ mKeyButton[i].setEnabled(bValue);
+ }
+}
+
+void Setup_Keyboard::refreshAssignedKey(const int index)
+{
+ char *temp = SDL_GetKeyName(
+ (SDLKey) keyboard.getKeyValue(index));
+ mKeyLabel[index].setCaption(
+ keyboard.getKeyCaption(index) + ": " + toString(temp));
+ mKeyLabel[index].adjustSize();
+}
+
+void Setup_Keyboard::newKeyCallback(const int index)
+{
+ refreshAssignedKey(index);
+ enableButtons(true);
+}
+
+void Setup_Keyboard::refreshKeys()
+{
+ for(int i=0; i < keyboard.KEY_TOTAL; i++)
+ {
+ refreshAssignedKey(i);
+ }
+}
+
+
diff --git a/src/gui/setup_keyboard.h b/src/gui/setup_keyboard.h
new file mode 100644
index 00000000..0430b040
--- /dev/null
+++ b/src/gui/setup_keyboard.h
@@ -0,0 +1,74 @@
+/*
+ * The Mana World
+ * Copyright 2007 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef _TMW_GUI_SETUP_KEYBOARD_H
+#define _TMW_GUI_SETUP_KEYBOARD_H
+
+#include "setuptab.h"
+#include "button.h"
+#include "../guichanfwd.h"
+
+#include <guichan/actionlistener.hpp>
+
+
+#include <string>
+
+class Setup_Keyboard : public SetupTab, public gcn::ActionListener
+{
+ public:
+ Setup_Keyboard();
+ ~Setup_Keyboard();
+
+ void apply();
+ void cancel();
+
+ void action(const gcn::ActionEvent &event);
+
+ /**
+ * easy way to disable/enable all the set buttons.
+ */
+ void enableButtons(bool bValue);
+
+ /**
+ * get an update on the assigned key.
+ */
+ void refreshAssignedKey(const int index);
+
+ /**
+ * the callback function when a new key has been pressed.
+ */
+ void newKeyCallback(const int index);
+
+ /**
+ * shorthand method to update all the keys.
+ */
+ void refreshKeys();
+
+ private:
+ gcn::Label *mKeyLabel;
+
+ Button *mKeyButton;
+
+ gcn::Button *mMakeDefaultButton;
+};
+
+#endif
diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp
new file mode 100644
index 00000000..3185a58a
--- /dev/null
+++ b/src/keyboardconfig.cpp
@@ -0,0 +1,129 @@
+/*
+ * The Mana World
+ * Copyright 2007 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "keyboardconfig.h"
+#include "configuration.h"
+#include "log.h"
+
+#include <guichan/sdl/sdlinput.hpp>
+
+#include "gui/setup_keyboard.h"
+
+void KeyboardConfig::destroy()
+{
+
+}
+
+void KeyboardConfig::init()
+{
+ mKey[KEY_MOVE_UP] = KeyFunction("keyMoveUp", SDLK_UP, "Move Up");
+ mKey[KEY_MOVE_DOWN] = KeyFunction("keyMoveDown", SDLK_DOWN, "Move Down");
+ mKey[KEY_MOVE_LEFT] = KeyFunction("keyMoveLeft", SDLK_LEFT, "Move Left");
+ mKey[KEY_MOVE_RIGHT] =
+ KeyFunction("keyMoveRight", SDLK_RIGHT, "Move Right");
+
+ mKey[KEY_ATTACK] = KeyFunction("keyAttack", SDLK_LCTRL, "Attack");
+ mKey[KEY_TARGET] = KeyFunction("keyTarget", SDLK_LSHIFT, "Target");
+ mKey[KEY_TARGET_CLOSEST] =
+ KeyFunction("mKeyTargetClosest", SDLK_a, "Target Closest");
+ mKey[KEY_PICKUP] = KeyFunction("keyPickup", SDLK_z, "Pickup");
+ mKey[KEY_HIDE_WINDOWS] =
+ KeyFunction("keyHideWindows", SDLK_h, "Hide Windows");
+ mKey[KEY_SIT] = KeyFunction("keyBeingSit", SDLK_g, "Sit");
+
+ for (int i = 0; i < KEY_TOTAL; i++)
+ {
+ mKey[i].value = KEY_NO_VALUE;
+ }
+ mNewKeyIndex = KEY_NO_VALUE;
+ mEnabled = true;
+
+ retrieve();
+}
+
+void KeyboardConfig::retrieve()
+{
+ for (int i = 0; i < KEY_TOTAL; i++)
+ {
+ mKey[i].value = (int) config.getValue(
+ mKey[i].configField, mKey[i].defaultValue);
+ }
+}
+
+void KeyboardConfig::store()
+{
+ for (int i = 0; i < KEY_TOTAL; i++)
+ {
+ config.setValue(mKey[i].configField, mKey[i].value);
+ }
+}
+
+void KeyboardConfig::makeDefault()
+{
+ for (int i = 0; i < KEY_TOTAL; i++)
+ {
+ mKey[i].value = mKey[i].defaultValue;
+ }
+}
+
+bool KeyboardConfig::hasConflicts()
+{
+ int i, j;
+ for (i = 0; i < KEY_TOTAL; i++)
+ {
+ for (j = 0; j < KEY_TOTAL; j++)
+ {
+ if (i != j && mKey[i].value == mKey[j].value)
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void KeyboardConfig::callbackNewKey()
+{
+ mSetupKey->newKeyCallback((const int) mNewKeyIndex);
+}
+
+int KeyboardConfig::getKeyIndex(const int keyValue) const
+{
+ for (int i = 0; i < KEY_TOTAL; i++)
+ {
+ if(keyValue == mKey[i].value)
+ {
+ return i;
+ }
+ }
+ return KEY_NO_VALUE;
+}
+
+bool KeyboardConfig::isKeyActive(int index)
+{
+ return mActiveKeys[mKey[index].value];
+}
+
+void KeyboardConfig::refreshActiveKeys()
+{
+ mActiveKeys = SDL_GetKeyState(NULL);
+}
diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h
new file mode 100644
index 00000000..73e08730
--- /dev/null
+++ b/src/keyboardconfig.h
@@ -0,0 +1,208 @@
+/*
+ * The Mana World
+ * Copyright 2007 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef _TMW_KEYBOARDCONFIG_H
+#define _TMW_KEYBOARDCONFIG_H
+
+#include <string>
+
+#include "gui/setup_keyboard.h"
+
+#include <guichan/sdl/sdlinput.hpp>
+
+#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
+
+/**
+ * Each key represents a key function. Such as 'Move up', 'Attack' etc.
+ */
+struct KeyFunction
+{
+ KeyFunction(){}
+ KeyFunction(std::string configField, int defaultValue, std::string caption):
+ configField(configField),
+ defaultValue(defaultValue),
+ caption(caption)
+ { }
+
+ std::string configField;
+ std::string caption;
+ int defaultValue;
+ int value;
+};
+
+class KeyboardConfig
+{
+ public:
+ /**
+ * initialize the keyboard config.
+ */
+ void init();
+
+ /**
+ * destroy the object by releasing any memory.
+ */
+ void destroy();
+
+ /**
+ * retrieve the key values from config file.
+ */
+ void retrieve();
+
+ /**
+ * store the key values to config file.
+ */
+ void store();
+
+ /**
+ * make the keys their default values.
+ */
+ void makeDefault();
+
+ /**
+ * determines if any key assignments are the same as each other.
+ */
+ bool hasConflicts();
+
+ /**
+ * calls a function back so the key re-assignment(s) can be seen.
+ */
+ void callbackNewKey();
+
+ /**
+ * obtain the value stored in memory.
+ */
+ int getKeyValue(int index) const
+ {
+ return mKey[index].value;
+ };
+
+ /**
+ * get the index of the new key to be assigned.
+ */
+ int getNewKeyIndex() const
+ {
+ return mNewKeyIndex;
+ };
+
+ /**
+ * get the enable flag, which will stop the user from doing actions.
+ */
+ bool isEnabled() const
+ {
+ return mEnabled;
+ };
+
+ /**
+ * get the key caption, providing more meaning to the user.
+ */
+ std::string& getKeyCaption(int index)
+ {
+ return mKey[index].caption;
+ };
+
+ /**
+ * get the key function index by providing the keys value.
+ */
+ int getKeyIndex(int keyValue) const;
+
+ /**
+ * set the enable flag, which will stop the user from doing actions.
+ */
+ void setEnabled(bool flag)
+ {
+ mEnabled = flag;
+ };
+
+ /**
+ * set the index of the new key to be assigned.
+ */
+ void setNewKeyIndex(int value)
+ {
+ mNewKeyIndex = value;
+ };
+
+ /**
+ * set the value of the new key.
+ */
+ void setNewKey(int value)
+ {
+ mKey[mNewKeyIndex].value = value;
+ };
+
+ /**
+ * set a reference to the key setup window.
+ */
+ void setSetupKeyboard(Setup_Keyboard *setupKey)
+ {
+ mSetupKey = setupKey;
+ };
+
+ /**
+ * checks if the key is active, by providing the key function index.
+ */
+ bool isKeyActive(const int index);
+
+ /**
+ * takes a snapshot of all the active keys.
+ */
+ void refreshActiveKeys();
+
+ /**
+ * All the key functions.
+ * KEY_NO_VALUE is used in initialization, and should be unchanged.
+ * KEY_MIN and KEY_TOTAL should always be first and last respectively,
+ * the bare used in control loops.
+ * The third element (after KEY_NO_VALUE and KEY_MIN),
+ * should always equal KEY_MIN.
+ * The key assignment view gets arranged according to the order of
+ * these values.
+ */
+ enum KeyAction {
+ KEY_NO_VALUE = -1,
+ KEY_MOVE_UP,
+ KEY_MOVE_DOWN,
+ KEY_MOVE_LEFT,
+ KEY_MOVE_RIGHT,
+ KEY_ATTACK,
+ KEY_TARGET,
+ KEY_TARGET_CLOSEST,
+ KEY_PICKUP,
+ KEY_SIT,
+ KEY_HIDE_WINDOWS,
+ KEY_TOTAL
+ };
+ private:
+ int mNewKeyIndex; /** index of new key to be assigned */
+ bool mEnabled; /** flag to determine respond to key input */
+
+ Setup_Keyboard *mSetupKey; /** reference to setup window */
+
+ KeyFunction mKey[KEY_TOTAL]; /** pointer to all the key data */
+
+ Uint8 *mActiveKeys; /** stores a list of all the keys */
+
+};
+extern KeyboardConfig keyboard;
+
+#endif
+
+
diff --git a/src/main.cpp b/src/main.cpp
index 1a6aea4c..e147f760 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -45,6 +45,7 @@
#endif
#include "configuration.h"
+#include "keyboardconfig.h"
#include "game.h"
#include "graphics.h"
#include "lockedarray.h"
@@ -103,6 +104,7 @@ Music *bgm;
Configuration config; /**< XML file configuration reader */
Logger *logger; /**< Log object */
+KeyboardConfig keyboard;
/**
* A structure holding the values of various options that can be passed from
@@ -318,12 +320,20 @@ void init_engine(const Options &options)
errorMessage = err;
logger->log("Warning: %s", err);
}
+
+ //Initialize keyboard
+ keyboard.init();
}
/** Clear the engine */
void exit_engine()
{
+ // Store keys and Remove Keyboard configuration.
+ keyboard.store();
+ keyboard.destroy();
+
config.write();
+
delete gui;
delete graphics;