summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2006-09-02 12:50:40 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2006-09-02 12:50:40 +0000
commit3213f41daeed034c8aa9b8be9e86796737a38a78 (patch)
tree5441dd101209774d6e7c6612281b3ef12bd941a5
parentf5fc009543a0a189bcde5acf91ff315dd9cd05e9 (diff)
downloadmana-3213f41daeed034c8aa9b8be9e86796737a38a78.tar.gz
mana-3213f41daeed034c8aa9b8be9e86796737a38a78.tar.bz2
mana-3213f41daeed034c8aa9b8be9e86796737a38a78.tar.xz
mana-3213f41daeed034c8aa9b8be9e86796737a38a78.zip
Applied patch by Bernard Lidicky, adding targetting nearest monster with either
keyboard or mouse. Also made clicking beings in general a bit easier (patch applied by Bjørn Lindeijer).
-rw-r--r--ChangeLog8
-rw-r--r--NEWS1
-rw-r--r--README1
-rw-r--r--data/help/commands.txt1
-rw-r--r--src/beingmanager.cpp25
-rw-r--r--src/beingmanager.h17
-rw-r--r--src/game.cpp12
-rw-r--r--src/gui/gui.cpp16
-rw-r--r--src/localplayer.h7
9 files changed, 82 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 5dfe3577..f8f30af7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-09-02 Bernard Lidicky <bernard@matfyz.cz>
+
+ * src/game.cpp, src/beingmanager.h, src/gui/gui.cpp,
+ src/beingmanager.cpp, src/localplayer.h, README,
+ data/help/commands.txt, NEWS: Added targetting nearest monster with
+ either keyboard or mouse. Also made clicking beings in general a bit
+ easier (patch applied by Bjørn Lindeijer).
+
2006-09-01 Eugenio Favalli <elvenprogrammer@gmail.com>
* data/graphics/sprites/monster19.png,
diff --git a/NEWS b/NEWS
index 0c42084b..43f8fe73 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@
- Added option to turn off the joystick
- Added --playername option for automatic character picking
- Added --configfile option for specifying which configuration file to use
+- Added shortcut and middle mouse button for targetting nearest monster
- Fixed updating system on Windows
- Fixed player animations going out of sync on changing equipment or hairstyle
- Fixed SDL_image configure check on some systems by first checking for libpng
diff --git a/README b/README
index 5fad4312..55d65e1d 100644
--- a/README
+++ b/README
@@ -53,6 +53,7 @@ Use arrow keys to move around. Other keys:
- Alt + S sit down / stand up
- Alt + F toggle debug pathfinding feature
- Alt + P take screenshot
+- A target nearest monster
- H hide all non-sticky windows
- G or Z pick up item
- Enter focus chat window / send message
diff --git a/data/help/commands.txt b/data/help/commands.txt
index 37c77df2..ab93b54e 100644
--- a/data/help/commands.txt
+++ b/data/help/commands.txt
@@ -23,6 +23,7 @@
##2Alt + S##P sit down / stand up
##2Alt + F##P toggle debug pathfinding feature
##2Alt + P##P take screenshot
+ ##2A##P target nearest monster
##2H##P hide all non-sticky windows
##2G or Z##P pick up item
##2Enter##P focus chat window / send message
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp
index 25edeb24..027e08d3 100644
--- a/src/beingmanager.cpp
+++ b/src/beingmanager.cpp
@@ -159,3 +159,28 @@ void BeingManager::clear()
mBeings.push_back(player_node);
}
}
+
+Being* BeingManager::findNearestLivingBeing(Uint16 x, Uint16 y, int maxdist,
+ Being::Type type)
+{
+ Being *closestBeing = NULL;
+ int dist = 0;
+
+ for (BeingIterator i = mBeings.begin(); i != mBeings.end(); i++)
+ {
+ Being *being = (*i);
+ int d = abs(being->mX - x) + abs(being->mY - y);
+
+ if ((being->getType() == type || type == Being::UNKNOWN)
+ && (d < dist || closestBeing == NULL) // it is closer
+ && being->mAction != Being::DEAD // no dead beings
+ && being->mAction != Being::MONSTER_DEAD
+ )
+ {
+ dist = d;
+ closestBeing = being;
+ }
+ }
+
+ return (maxdist >= dist) ? closestBeing : NULL;
+}
diff --git a/src/beingmanager.h b/src/beingmanager.h
index cfaf7fbf..152fb640 100644
--- a/src/beingmanager.h
+++ b/src/beingmanager.h
@@ -49,26 +49,35 @@ class BeingManager
void setPlayer(LocalPlayer *player);
/**
- * Create a being and add it to the list of beings
+ * Create a being and add it to the list of beings.
*/
Being* createBeing(Uint32 id, Uint16 job);
/**
- * Remove a Being
+ * Remove a Being.
*/
void destroyBeing(Being *being);
/**
- * Return a specific id Being
+ * Return a specific id Being.
*/
Being* findBeing(Uint32 id);
/**
- * Return a being at specific coordinates
+ * Return a being at specific coordinates.
*/
Being* findBeing(Uint16 x, Uint16 y, Being::Type type = Being::UNKNOWN);
/**
+ * Return a being nearest to specific coordinates.
+ *
+ * \param maxdist maximal distance. If minimal distance is larger,
+ * no being is returned
+ */
+ Being* findNearestLivingBeing(Uint16 x, Uint16 y, int maxdist,
+ Being::Type type = Being::UNKNOWN);
+
+ /**
* Returns the whole list of beings
*/
Beings& getAll();
diff --git a/src/game.cpp b/src/game.cpp
index ed8ad827..7921c388 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -686,6 +686,18 @@ void Game::handleInput()
player_node->attack(target, newTarget);
}
+ // Target the nearest monster if 'a' pressed
+ if (keys[SDLK_a])
+ {
+ Being *target =
+ beingManager->findNearestLivingBeing(x, y, 20, Being::MONSTER);
+
+ if (target)
+ {
+ player_node->setTarget(target);
+ }
+ }
+
if (joystick)
{
if (joystick->buttonPressed(1))
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp
index a0548e9c..6c46d636 100644
--- a/src/gui/gui.cpp
+++ b/src/gui/gui.cpp
@@ -280,7 +280,7 @@ Gui::mousePress(int mx, int my, int button)
FloorItem *item;
// Interact with some being
- if ((being = beingManager->findBeing(tilex, tiley)))
+ if ((being = beingManager->findNearestLivingBeing(tilex, tiley, 1)))
{
switch (being->getType())
{
@@ -317,6 +317,20 @@ Gui::mousePress(int mx, int my, int button)
}
}
}
+
+ if (button == gcn::MouseInput::MIDDLE)
+ {
+ // Find the being nearest to the clicked position
+ Being *target = beingManager->findNearestLivingBeing(
+ player_node->mX,
+ player_node->mY,
+ 20, Being::MONSTER);
+
+ if (target)
+ {
+ player_node->setTarget(target);
+ }
+ }
}
void
diff --git a/src/localplayer.h b/src/localplayer.h
index 1f8c836f..a3fe91f7 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -99,12 +99,17 @@ class LocalPlayer : public Player
* Sets the trading state of the player, i.e. whether or not he is
* currently involved into some trade.
*/
- void setTrading(bool trading) { mTrading = trading; };
+ void setTrading(bool trading) { mTrading = trading; }
void attack(Being *target=NULL, bool keep=false);
void stopAttack();
Being* getTarget() const;
+ /**
+ * Sets the target being of the player.
+ */
+ void setTarget(Being* target) { mTarget = target; }
+
void walk(unsigned char dir);
/**