Skip to content

Commit

Permalink
Added a mana indicator to the stats panel
Browse files Browse the repository at this point in the history
  • Loading branch information
Red Queen committed Oct 30, 2011
1 parent ba77794 commit 1c127af
Show file tree
Hide file tree
Showing 5 changed files with 215 additions and 0 deletions.
Binary file added data/gui/mana_scale.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/games/stendhal/client/UserController.java
Expand Up @@ -14,6 +14,7 @@

import games.stendhal.client.gui.buddies.BuddyPanelController;
import games.stendhal.client.gui.stats.KarmaIndicator;
import games.stendhal.client.gui.stats.ManaIndicator;
import games.stendhal.client.gui.stats.StatsPanelController;

import java.beans.PropertyChangeListener;
Expand All @@ -34,6 +35,7 @@ public class UserController implements ObjectChangeListener {
public UserController() {
pcs.addPropertyChangeListener("buddies", BuddyPanelController.get());
pcs.addPropertyChangeListener("features", KarmaIndicator.get());
pcs.addPropertyChangeListener("features", ManaIndicator.get());

StatsPanelController stats = StatsPanelController.get();
stats.registerListeners(pcs);
Expand Down
159 changes: 159 additions & 0 deletions src/games/stendhal/client/gui/stats/ManaIndicator.java
@@ -0,0 +1,159 @@
/***************************************************************************
* (C) Copyright 2003-2010 - Stendhal *
***************************************************************************
***************************************************************************
* *
* 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 *
* (at your option) any later version. *
* *
***************************************************************************/
package games.stendhal.client.gui.stats;

import games.stendhal.client.sprite.Sprite;
import games.stendhal.client.sprite.SpriteStore;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Map;

import javax.swing.JComponent;
import javax.swing.SwingUtilities;

/**
* A bar indicator component for mana.
*/
public class ManaIndicator extends JComponent implements PropertyChangeListener {
private static final long serialVersionUID = 3462088641737184898L;

private static ManaIndicator instance;

private static final String IMAGE_FILE_NAME = "data/gui/mana_scale.png";

/** Mana scaled to pixels */
private double mana;
private double base_mana;
private final Sprite image;

/**
* Create a new mana indicator.
*/
public ManaIndicator() {
instance = this;
setVisible(false);
final SpriteStore store = SpriteStore.get();
image = store.getSprite(IMAGE_FILE_NAME);

// We don't draw the background
setOpaque(false);
}

/**
* gets the instance
*
* @return ManaIndicator
*/
public static ManaIndicator get() {
return instance;
}

/**
* Set the mana value. This method may be called outside the event dispatch
* thread.
*
* @param mana
*/
public void setMana(double mana) {
this.mana = mana;
repaint();
}

/**
* Set the base_mana value. This method may be called outside the event dispatch
* thread.
*
* @param mana
*/
public void setBaseMana(double base_mana) {
this.base_mana = (int) Math.floor(base_mana);
repaint();
}

@Override
public Dimension getPreferredSize() {
Dimension pref = new Dimension(image.getWidth(), image.getHeight());

Insets insets = getInsets();
pref.width += insets.left + insets.right;
pref.height += insets.top + insets.bottom;

return pref;
}

@Override
public Dimension getMinimumSize() {
// Preferred is also the minimum size where the bar can be drawn properly
return getPreferredSize();
}

/**
* Scale a mana value to bar length.
*
* @param mana player mana
* @return length of the drawn bar in pixels
*/
private int scale(double mana) {
if(base_mana == 0) {
return 0;
} else {
return (int) (image.getWidth() * mana / base_mana);
}
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
// Paint black what is not covered by the colored bar
g.setColor(Color.BLACK);
g.fillRect(insets.left, insets.top, image.getWidth(), image.getHeight());
// Draw appropriate length of the image
g.clipRect(insets.left, insets.top, scale(mana), getHeight());
image.draw(g, insets.left, insets.top);
this.setToolTipText("Mana: " + (int) mana + "/" + (int) base_mana);
}


public void propertyChange(PropertyChangeEvent evt) {
if (evt == null) {
return;
}

// disable
Map<?, ?> oldMap = (Map<?, ?>) evt.getOldValue();
if ((oldMap != null) && oldMap.containsKey("spells")) {
// Feature changes are triggered from outside the EDT.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(false);
}
});
}

// enable
Map<?, ?> newMap = (Map<?, ?>) evt.getNewValue();
if ((newMap != null) && newMap.containsKey("spells")) {
// Feature changes are triggered from outside the EDT.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(true);
}
});
}
}
}
24 changes: 24 additions & 0 deletions src/games/stendhal/client/gui/stats/StatsPanel.java
Expand Up @@ -34,6 +34,7 @@ public class StatsPanel extends JPanel {
private final StatLabel hpLabel, atkLabel, defLabel, xpLabel, levelLabel, moneyLabel;
private final StatusIconPanel statusIcons;
private final KarmaIndicator karmaIndicator;
private final ManaIndicator manaIndicator;

StatsPanel() {
super();
Expand All @@ -47,6 +48,11 @@ public class StatsPanel extends JPanel {
karmaIndicator.setToolTipText("Karma");
add(karmaIndicator);

manaIndicator = new ManaIndicator();
manaIndicator.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
manaIndicator.setToolTipText("Mana");
add(manaIndicator);

hpLabel = new StatLabel();
add(hpLabel);

Expand Down Expand Up @@ -110,6 +116,24 @@ void setXP(String xp) {
void setKarma(double karma) {
karmaIndicator.setValue(karma);
}

/**
* Set player mana.
*
* @param mana
*/
void setMana(double mana) {
manaIndicator.setMana(mana);
}

/**
* Set player mana.
*
* @param mana
*/
void setBaseMana(double base_mana) {
manaIndicator.setBaseMana(base_mana);
}

/**
* Set the level description.
Expand Down
30 changes: 30 additions & 0 deletions src/games/stendhal/client/gui/stats/StatsPanelController.java
Expand Up @@ -54,6 +54,9 @@ public class StatsPanelController {
private int defxp;
private int itemDef;

private int mana;
private int base_mana;

/**
* Create a new <code>StatsPanelController</code>. There
* should be only one, so the constructor is hidden.
Expand Down Expand Up @@ -134,6 +137,10 @@ public void registerListeners(PropertyChangeSupport pcs) {

listener = new KarmaChangeListener();
pcs.addPropertyChangeListener("karma", listener);

listener = new ManaChangeListener();
pcs.addPropertyChangeListener("mana", listener);
pcs.addPropertyChangeListener("base_mana", listener);
}

/**
Expand Down Expand Up @@ -462,6 +469,29 @@ public void propertyChange(final PropertyChangeEvent event) {
}
}

/**
* Listener for mana changes.
*/
private class ManaChangeListener implements PropertyChangeListener {
public void propertyChange(final PropertyChangeEvent event) {
if (event == null) {
return;
}

try {
if (event.getPropertyName().equals("mana")) {
mana = Integer.parseInt((String) event.getNewValue());
panel.setMana(mana);
} else {
base_mana = Integer.parseInt((String) event.getNewValue());
panel.setBaseMana(base_mana);
}
} catch (NumberFormatException e) {
Logger.getLogger(StatsPanelController.class).error("Invalid mana value", e);
}
}
}

/**
* Listener for grumpy status changes.
*/
Expand Down

0 comments on commit 1c127af

Please sign in to comment.