summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--data/graphics/images/EquipBackground.pngbin0 -> 18901 bytes
-rw-r--r--src/equipment.h2
-rw-r--r--src/gui/equipmentwindow.cpp127
-rw-r--r--src/gui/equipmentwindow.h40
-rw-r--r--src/localplayer.cpp6
-rw-r--r--src/net/gameserver/player.cpp7
-rw-r--r--src/net/gameserver/player.h1
8 files changed, 155 insertions, 34 deletions
diff --git a/ChangeLog b/ChangeLog
index a25c81b6..e229fe5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-08-08 Josh Langley <joshlangley[at]optusnet.com.au>
+ * src/equipment.h, src/gui/equipmentwindow.cpp, src/gui/equipmentwindow.h,
+ src/localplayer.cpp, src/net/gameserver/player.cpp,
+ src/net/gameserver/player.h, data/graphics/images/EquipBackground.png:
+ Re-designed equipment window, un-equip created.
+
2007-08-07 Guillaume Melquiond <guillaume.melquiond@gmail.com>
* po/Makevars, src/main.cpp: Replaced PACKAGE by tmw to reduce
diff --git a/data/graphics/images/EquipBackground.png b/data/graphics/images/EquipBackground.png
new file mode 100644
index 00000000..77ac63d8
--- /dev/null
+++ b/data/graphics/images/EquipBackground.png
Binary files differ
diff --git a/src/equipment.h b/src/equipment.h
index f178e0ca..bac5a028 100644
--- a/src/equipment.h
+++ b/src/equipment.h
@@ -26,7 +26,7 @@
class Item;
-#define EQUIPMENT_SIZE 10
+#define EQUIPMENT_SIZE 11
class Equipment
{
diff --git a/src/gui/equipmentwindow.cpp b/src/gui/equipmentwindow.cpp
index 0ffba5a2..fb8da493 100644
--- a/src/gui/equipmentwindow.cpp
+++ b/src/gui/equipmentwindow.cpp
@@ -21,27 +21,66 @@
* $Id$
*/
+#define BOX_WIDTH 36
+#define BOX_HEIGHT 36
+
#include "equipmentwindow.h"
-#include "../equipment.h"
+#include "button.h"
+
#include "../graphics.h"
#include "../item.h"
-#include "../log.h"
+#include "../localplayer.h"
-#include "../resources/iteminfo.h"
+#include "../resources/image.h"
#include "../resources/resourcemanager.h"
#include "../utils/gettext.h"
+// Positions of the boxes, 2nd dimension is X and Y respectively.
+const int boxPosition[][2] = {
+ {90, 100}, // EQUIP_TORSO_SLOT
+ {135, 60}, // EQUIP_ARMS_SLOT
+ {90, 10}, // EQUIP_HEAD_SLOT
+ {90, 145}, // EQUIP_LEGS_SLOT
+ {90, 190}, // EQUIP_FEET_SLOT
+ {35, 105}, // EQUIP_RING1_SLOT
+ {145, 105}, // EQUIP_RING2_SLOT
+ {90, 55}, // EQUIP_NECKLACE_SLOT
+ {20, 150}, // EQUIP_FIGHT1_SLOT
+ {160, 150}, // EQUIP_FIGHT2_SLOT
+ {45, 60} // EQUIP_PROJECTILE_SLOT
+};
+
EquipmentWindow::EquipmentWindow(Equipment *equipment):
- Window(_("Equipment")), mEquipment(equipment)
+
+ Window(_("Equipment")),
+ mEquipment(equipment),
+ mBackground(NULL),
+ mSelected(-1)
{
- setDefaultSize(5, 230, 200, 120);
+ setDefaultSize(5, 195, 216, 260);
loadWindowState("Equipment");
+
+ mUnequip = new Button(_("Unequip"), "unequip", this);
+ mUnequip->setPosition(150,235);
+ add(mUnequip);
+
+ for (int i = 0; i < EQUIPMENT_SIZE; i++)
+ {
+ mEquipBox[i].posX = boxPosition[i][0] + getPadding();
+ mEquipBox[i].posY = boxPosition[i][1] + getTitleBarHeight();
+ }
+
+ ResourceManager *resman = ResourceManager::getInstance();
+ mBackground = resman->getImage("graphics/images/equipBackground.png");
+ mBackground->setAlpha(0.3);
}
EquipmentWindow::~EquipmentWindow()
{
+ mBackground->decRef();
+ delete mUnequip;
}
void EquipmentWindow::draw(gcn::Graphics *graphics)
@@ -49,33 +88,69 @@ void EquipmentWindow::draw(gcn::Graphics *graphics)
// Draw window graphics
Window::draw(graphics);
- // Rectangles around items are black
- graphics->setColor(gcn::Color(0, 0, 0));
+ Graphics *g = static_cast<Graphics*>(graphics);
- for (int i = 0; i < EQUIPMENT_SIZE; i++) {
- graphics->drawRectangle(gcn::Rectangle(10 + 36 * (i % 4),
- 36 * (i / 4) + 25, 32, 32));
+ if (mBackground)
+ {
+ g->drawImage(mBackground, getPadding() + 10, 0);
+ }
- int item = mEquipment->getEquipment(i);
- if (!item) continue;
+ Window::drawChildren(graphics);
- Image *image = Item(item).getInfo().getImage();
- static_cast<Graphics*>(graphics)->
- drawImage(image, 36 * (i % 4) + 10, 36 * (i / 4) + 25);
- }
+ for (int i = 0; i < EQUIPMENT_SIZE; i++)
+ {
+ int itemId = mEquipment->getEquipment(i);
+ if (itemId)
+ {
+ // Draw Item.
+ Image *image = Item(itemId).getInfo().getImage();
+ g->drawImage(image, mEquipBox[i].posX, mEquipBox[i].posY);
+ }
- graphics->drawRectangle(gcn::Rectangle(160, 25, 32, 32));
+ if (i == mSelected)
+ {
+ // Set color red.
+ g->setColor(gcn::Color(255, 0, 0));
+ }
+ else
+ {
+ // Set color black.
+ g->setColor(gcn::Color(0, 0, 0));
+ }
+ // Draw box border.
+ g->drawRectangle(gcn::Rectangle(mEquipBox[i].posX, mEquipBox[i].posY,
+ BOX_WIDTH, BOX_HEIGHT));
+ }
+}
- /*
- if (!(item = mEquipment->getArrows())) {
- return;
+void EquipmentWindow::action(const gcn::ActionEvent &event)
+{
+ if (event.getId() == "unequip" && mSelected > -1)
+ {
+ player_node->unequipItem(mSelected);
+ mSelected = -1;
}
+}
+
+void EquipmentWindow::mousePressed(gcn::MouseEvent& mouseEvent)
+{
+ Window::mousePressed(mouseEvent);
- image = item->getInfo().getImage();
+ const int x = mouseEvent.getX();
+ const int y = mouseEvent.getY();
- static_cast<Graphics*>(graphics)->drawImage(image, 160, 25);
- graphics->drawText(toString(item->getQuantity()), 170, 62,
- gcn::Graphics::CENTER);
- */
- return;
+ // Checks if any of the presses were in the equip boxes.
+ for (int i = 0; i < EQUIPMENT_SIZE; i++)
+ {
+ gcn::Rectangle tRect(mEquipBox[i].posX, mEquipBox[i].posY,
+ BOX_WIDTH, BOX_HEIGHT);
+ if (tRect.isPointInRect(x, y))
+ {
+ int itemId = mEquipment->getEquipment(i);
+ if (itemId)
+ {
+ mSelected = i;
+ }
+ }
+ }
}
diff --git a/src/gui/equipmentwindow.h b/src/gui/equipmentwindow.h
index 99a3cc60..e42e7b59 100644
--- a/src/gui/equipmentwindow.h
+++ b/src/gui/equipmentwindow.h
@@ -26,14 +26,28 @@
#include "window.h"
+#include <guichan/actionlistener.hpp>
+
+#include "../equipment.h"
+
class Equipment;
+class Image;
+
+/**
+ * Equipment box.
+ */
+struct EquipBox
+{
+ int posX;
+ int posY;
+};
/**
* Equipment dialog.
*
* \ingroup Interface
*/
-class EquipmentWindow : public Window
+class EquipmentWindow : public Window, public gcn::ActionListener
{
public:
/**
@@ -51,10 +65,32 @@ class EquipmentWindow : public Window
*/
void draw(gcn::Graphics *graphics);
+ void action(const gcn::ActionEvent &event);
+
+ void mousePressed(gcn::MouseEvent& mouseEvent);
+
+ enum{
+ // Equipment rules:
+ EQUIP_TORSO_SLOT = 0,
+ EQUIP_ARMS_SLOT = 1,
+ EQUIP_HEAD_SLOT = 2,
+ EQUIP_LEGS_SLOT = 3,
+ EQUIP_FEET_SLOT = 4,
+ EQUIP_RING1_SLOT = 5,
+ EQUIP_RING2_SLOT = 6,
+ EQUIP_NECKLACE_SLOT = 7,
+ EQUIP_FIGHT1_SLOT = 8,
+ EQUIP_FIGHT2_SLOT = 9,
+ EQUIP_PROJECTILE_SLOT = 10
+ };
private:
Equipment *mEquipment;
-};
+ gcn::Button *mUnequip; /**< Button for unequipping. */
+ Image *mBackground; /**< Background Image. */
+ EquipBox mEquipBox[EQUIPMENT_SIZE]; /**< Equipment Boxes. */
+ int mSelected; /**< Index of selected item. */
+};
extern EquipmentWindow *equipmentWindow;
#endif
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index b4fc5957..23d4c99b 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -107,11 +107,7 @@ void LocalPlayer::equipItem(Item *item)
void LocalPlayer::unequipItem(int slot)
{
- // XXX Convert for new server
- /*
- MessageOut outMsg(CMSG_PLAYER_UNEQUIP);
- outMsg.writeShort(item->getInvIndex());
- */
+ Net::GameServer::Player::unequip(slot);
// Tidy equipment directly to avoid weapon still shown bug, by instance
mEquipment->setEquipment(slot, 0);
diff --git a/src/net/gameserver/player.cpp b/src/net/gameserver/player.cpp
index c91923d8..e93fff46 100644
--- a/src/net/gameserver/player.cpp
+++ b/src/net/gameserver/player.cpp
@@ -67,6 +67,13 @@ void Net::GameServer::Player::equip(int slot)
Net::GameServer::connection->send(msg);
}
+void Net::GameServer::Player::unequip(int slot)
+{
+ MessageOut msg(PGMSG_UNEQUIP);
+ msg.writeByte(slot);
+ Net::GameServer::connection->send(msg);
+}
+
void Net::GameServer::Player::attack(int direction)
{
MessageOut msg(PGMSG_ATTACK);
diff --git a/src/net/gameserver/player.h b/src/net/gameserver/player.h
index 8b4cde5b..4c27d4d0 100644
--- a/src/net/gameserver/player.h
+++ b/src/net/gameserver/player.h
@@ -39,6 +39,7 @@ namespace Net
void pickUp(int x, int y);
void drop(int slot, int amount);
void equip(int slot);
+ void unequip(int slot);
void attack(int direction);
void changeAction(Being::Action action);
void talkToNPC(int id, bool restart);