summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2008-10-31 23:01:23 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2008-10-31 23:01:23 +0000
commit052cdbd8fce689b64371da82409bfd4e0f189f45 (patch)
tree316c8a69defc2a9ca69d9e3a4840de44db8d2382 /src
parent6d928722369bc1db7f17d3fb0d0cb69ce304d39b (diff)
downloadmana-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.gz
mana-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.bz2
mana-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.xz
mana-052cdbd8fce689b64371da82409bfd4e0f189f45.zip
Merged revisions 4071,4093,4100,4363 via svnmerge from
https://themanaworld.svn.sourceforge.net/svnroot/themanaworld/tmw/branches/0.0 ........ r4071 | the_enemy | 2008-04-11 16:12:30 +0200 (Fri, 11 Apr 2008) | 3 lines Players now need to click on the monster sprites rather than the tile. Players will now move to the target before attacking it. ........ r4093 | the_enemy | 2008-04-15 18:10:32 +0200 (Tue, 15 Apr 2008) | 1 line Fixed clicking near player. ........ r4100 | peaveydk | 2008-04-16 13:59:36 +0200 (Wed, 16 Apr 2008) | 1 line Cancel walking to a clicked monster if the target is lost while getting to it (killed or otherwise removed). ........ r4363 | crush_tmw | 2008-06-24 14:42:04 +0200 (Tue, 24 Jun 2008) | 1 line corrected date in changelog ........
Diffstat (limited to 'src')
-rw-r--r--src/beingmanager.cpp22
-rw-r--r--src/beingmanager.h1
-rw-r--r--src/effectmanager.cpp14
-rw-r--r--src/gui/viewport.cpp8
-rw-r--r--src/localplayer.cpp43
-rw-r--r--src/localplayer.h11
-rw-r--r--src/resources/iteminfo.h2
7 files changed, 84 insertions, 17 deletions
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp
index 2ab29fd2..40f438df 100644
--- a/src/beingmanager.cpp
+++ b/src/beingmanager.cpp
@@ -117,6 +117,28 @@ Being* BeingManager::findBeing(Uint16 x, Uint16 y, Being::Type type)
return (i == mBeings.end()) ? NULL : *i;
}
+Being* BeingManager::findBeingByPixel(Uint16 x, Uint16 y)
+{
+ BeingIterator itr = mBeings.begin();
+ BeingIterator itr_end = mBeings.end();
+
+ for (; itr != itr_end; ++itr)
+ {
+ Being *being = (*itr);
+ if ((being->mAction != Being::DEAD) &&
+ (being != player_node) &&
+ (being->getPixelX() <= x) &&
+ (being->getPixelX() + being->getWidth() >= x) &&
+ (being->getPixelY() <= y) &&
+ (being->getPixelY() + being->getHeight() >= y))
+ {
+ return being;
+ }
+ }
+
+ return NULL;
+}
+
Beings& BeingManager::getAll()
{
return mBeings;
diff --git a/src/beingmanager.h b/src/beingmanager.h
index 6792ed0e..f7a3b8f0 100644
--- a/src/beingmanager.h
+++ b/src/beingmanager.h
@@ -64,6 +64,7 @@ class BeingManager
* Returns a being at specific coordinates.
*/
Being* findBeing(Uint16 x, Uint16 y, Being::Type type = Being::UNKNOWN);
+ Being* findBeingByPixel(Uint16 x, Uint16 y);
/**
* Returns a being nearest to specific coordinates.
diff --git a/src/effectmanager.cpp b/src/effectmanager.cpp
index bb8b5733..87d98834 100644
--- a/src/effectmanager.cpp
+++ b/src/effectmanager.cpp
@@ -42,12 +42,10 @@ EffectManager::EffectManager()
else
{
logger->log("Effects are now loading");
- }
+ }
for_each_xml_child_node(node, root)
{
- int id;
-
if (xmlStrEqual(node->name, BAD_CAST "effect"))
{
EffectDescription ed;
@@ -61,22 +59,22 @@ EffectManager::EffectManager()
EffectManager::~EffectManager()
{
-
}
bool EffectManager::trigger(int id, int x, int y)
{
bool rValue = false;
- for (std::list<EffectDescription>::iterator i = mEffects.begin(); i != mEffects.end(); ++i)
+ for (std::list<EffectDescription>::iterator i = mEffects.begin();
+ i != mEffects.end(); ++i)
{
if ((*i).id == id)
{
rValue = true;
- if((*i).GFX != "")
+ if ((*i).GFX != "")
particleEngine->addEffect((*i).GFX, x, y);
- if((*i).SFX != "")
+ if ((*i).SFX != "")
sound.playSfx((*i).SFX);
- break;
+ break;
}
}
return rValue;
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp
index d086418f..9671e34f 100644
--- a/src/gui/viewport.cpp
+++ b/src/gui/viewport.cpp
@@ -370,8 +370,10 @@ void Viewport::mousePressed(gcn::MouseEvent &event)
mPlayerFollowMouse = false;
- const int tilex = (event.getX() + (int) mViewX) / 32;
- const int tiley = (event.getY() + (int) mViewY) / 32;
+ const int pixelx = event.getX() + (int) mViewX;
+ const int pixely = event.getY() + (int) mViewY;
+ const int tilex = pixelx / mMap->getTileWidth();
+ const int tiley = pixely / mMap->getTileHeight();
// Right click might open a popup
if (event.getButton() == gcn::MouseEvent::RIGHT)
@@ -379,7 +381,7 @@ void Viewport::mousePressed(gcn::MouseEvent &event)
Being *being;
FloorItem *floorItem;
- if ((being = beingManager->findBeing(tilex, tiley)) &&
+ if ((being = beingManager->findBeingByPixel(tilex, tiley)) &&
being != player_node)
{
mPopupMenu->showPopup(event.getX(), event.getY(), being);
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index fce9506a..fe3f1f45 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -66,8 +66,9 @@ LocalPlayer::LocalPlayer():
mTotalWeight(1), mMaxWeight(1),
mHP(1), mMaxHP(1),
mTarget(NULL), mPickUpTarget(NULL),
- mTrading(false),
- mLastAction(-1), mWalkingDir(0),
+ mTrading(false), mGoingToTarget(false),
+ mLastAction(-1),
+ mWalkingDir(0),
mDestX(0), mDestY(0),
mLocalWalkTime(-1),
mExpMessageTime(0)
@@ -122,6 +123,21 @@ void LocalPlayer::nextStep()
walk(mWalkingDir);
}
}
+
+ // TODO: Fix automatically walking within range of target, when wanted
+ if (mGoingToTarget && mTarget && withinAttackRange(mTarget))
+ {
+ mAction = Being::STAND;
+ //attack(mTarget, true);
+ mGoingToTarget = false;
+ mPath.clear();
+ return;
+ }
+ else if (mGoingToTarget && !mTarget)
+ {
+ mGoingToTarget = false;
+ mPath.clear();
+ }
}
bool LocalPlayer::checkInviteRights(const std::string &guildName)
@@ -541,12 +557,29 @@ std::pair<int, int> LocalPlayer::getExperience(int skill)
int LocalPlayer::getAttackRange()
{
Item *weapon = mEquipment->getEquipment(EQUIP_FIGHT1_SLOT);
- if(weapon)
+ if (weapon)
{
const ItemInfo info = weapon->getInfo();
return info.getAttackRange();
}
- return 32; //unarmed range
-
+ return 32; // unarmed range
}
+bool LocalPlayer::withinAttackRange(Being *target)
+{
+ const Vector &targetPos = target->getPosition();
+ const Vector &pos = getPosition();
+ const int dx = abs(targetPos.x - pos.x);
+ const int dy = abs(targetPos.y - pos.y);
+ const int range = getAttackRange();
+
+ return !(dx > range || dy > range);
+}
+
+void LocalPlayer::setGotoTarget(Being *target)
+{
+ mTarget = target;
+ mGoingToTarget = true;
+ const Vector &targetPos = target->getPosition();
+ setDestination(targetPos.x, targetPos.y);
+}
diff --git a/src/localplayer.h b/src/localplayer.h
index 7a5158cc..b44ac14a 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -258,6 +258,16 @@ class LocalPlayer : public Player
{ return mWalkingDir; }
/**
+ * Sets going to being to attack
+ */
+ void setGotoTarget(Being *target);
+
+ /**
+ * Returns whether the target is in range to attack
+ */
+ bool withinAttackRange(Being *target);
+
+ /**
* Stops the player dead in his tracks
*/
void stopWalking(bool sendToServer = true);
@@ -377,6 +387,7 @@ class LocalPlayer : public Player
FloorItem *mPickUpTarget;
bool mTrading;
+ bool mGoingToTarget;
int mLastAction; /**< Time stamp of the last action, -1 if none. */
int mWalkingDir; /**< The direction the player is walking in. */
int mDestX; /**< X coordinate of destination. */
diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h
index a8e9f2e4..5b500dcf 100644
--- a/src/resources/iteminfo.h
+++ b/src/resources/iteminfo.h
@@ -64,7 +64,7 @@ enum EquipmentSlot
EQUIP_FIGHT2_SLOT = 9,
// Projectile:
// this item does not amount to one, it only indicates the chosen projectile.
- EQUIP_PROJECTILE_SLOT = 10,
+ EQUIP_PROJECTILE_SLOT = 10
};