diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2008-10-31 23:01:23 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2008-10-31 23:01:23 +0000 |
commit | 052cdbd8fce689b64371da82409bfd4e0f189f45 (patch) | |
tree | 316c8a69defc2a9ca69d9e3a4840de44db8d2382 /src | |
parent | 6d928722369bc1db7f17d3fb0d0cb69ce304d39b (diff) | |
download | mana-client-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.gz mana-client-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.bz2 mana-client-052cdbd8fce689b64371da82409bfd4e0f189f45.tar.xz mana-client-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.cpp | 22 | ||||
-rw-r--r-- | src/beingmanager.h | 1 | ||||
-rw-r--r-- | src/effectmanager.cpp | 14 | ||||
-rw-r--r-- | src/gui/viewport.cpp | 8 | ||||
-rw-r--r-- | src/localplayer.cpp | 43 | ||||
-rw-r--r-- | src/localplayer.h | 11 | ||||
-rw-r--r-- | src/resources/iteminfo.h | 2 |
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 }; |