diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-04-19 15:36:18 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-05-08 14:02:51 +0200 |
commit | ec473d0d76e89e606122187ceab61df8a0ab17cf (patch) | |
tree | b873b90f233025aaacbb327614779df05e139e6b /src/game-server | |
parent | 7b289c333a6c5735dffa504c8482aee3b648b6cd (diff) | |
download | manaserv-ec473d0d76e89e606122187ceab61df8a0ab17cf.tar.gz manaserv-ec473d0d76e89e606122187ceab61df8a0ab17cf.tar.xz manaserv-ec473d0d76e89e606122187ceab61df8a0ab17cf.zip |
[Abilities] Made the rechargespeed depending on attributes
This allows a lot more flexibility and makes stuff like magical items a
lot easier to implement. We will also use this for the attack system in
the future. So a attack (abilitiy) would simply depend on some value
like Agility (or a derived attribute from it). Which sets the recharge
speed.
The recharge speed is the modified value of the attribute per game tick.
Diffstat (limited to 'src/game-server')
-rw-r--r-- | src/game-server/abilitymanager.cpp | 6 | ||||
-rw-r--r-- | src/game-server/abilitymanager.h | 4 | ||||
-rw-r--r-- | src/game-server/character.cpp | 33 | ||||
-rw-r--r-- | src/game-server/character.h | 10 |
4 files changed, 24 insertions, 29 deletions
diff --git a/src/game-server/abilitymanager.cpp b/src/game-server/abilitymanager.cpp index eb89829..b492f65 100644 --- a/src/game-server/abilitymanager.cpp +++ b/src/game-server/abilitymanager.cpp @@ -98,8 +98,8 @@ void AbilityManager::readAbilityNode(xmlNodePtr abilityNode, bool rechargeable = XML::getBoolProperty(abilityNode, "rechargeable", true); int neededMana = XML::getProperty(abilityNode, "needed", 0); - int defaultRechargeSpeed = XML::getProperty(abilityNode, - "rechargespeed", 0); + int rechargeAttribute = XML::getProperty(abilityNode, + "rechargeattribute", 0); if (rechargeable && neededMana <= 0) { @@ -116,7 +116,7 @@ void AbilityManager::readAbilityNode(xmlNodePtr abilityNode, newInfo->id = id; newInfo->rechargeable = rechargeable; newInfo->neededPoints = neededMana; - newInfo->defaultRechargeSpeed = defaultRechargeSpeed; + newInfo->rechargeAttribute = rechargeAttribute; newInfo->target = getTargetByString(XML::getProperty(abilityNode, "target", std::string())); diff --git a/src/game-server/abilitymanager.h b/src/game-server/abilitymanager.h index 07bf4c3..b363d1f 100644 --- a/src/game-server/abilitymanager.h +++ b/src/game-server/abilitymanager.h @@ -43,7 +43,7 @@ public: AbilityInfo() : id(0), rechargeable(false), - defaultRechargeSpeed(0), + rechargeAttribute(0), neededPoints(0), target(TARGET_BEING) {} @@ -52,7 +52,7 @@ public: std::string name; std::string categoryName; bool rechargeable; - int defaultRechargeSpeed; + unsigned rechargeAttribute; unsigned neededPoints; TargetMode target; Script::Ref rechargedCallback; diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp index 9299f71..1e0a0b7 100644 --- a/src/game-server/character.cpp +++ b/src/game-server/character.cpp @@ -170,7 +170,10 @@ void CharacterComponent::update(Entity &entity) if (s.abilityInfo->rechargeable && s.currentPoints < s.abilityInfo->neededPoints) { - s.currentPoints += s.rechargeSpeed; + auto *beingComponent = entity.getComponent<BeingComponent>(); + const double rechargeSpeed = beingComponent->getModifiedAttribute( + s.abilityInfo->rechargeAttribute); + s.currentPoints += (int)rechargeSpeed; if (s.currentPoints >= s.abilityInfo->neededPoints && s.abilityInfo->rechargedCallback.isValid()) { @@ -184,7 +187,7 @@ void CharacterComponent::update(Entity &entity) } if (!mModifiedAbilities.empty()) - sendAbilityUpdate(); + sendAbilityUpdate(entity); } void CharacterComponent::characterDied(Entity *being) @@ -326,20 +329,10 @@ bool CharacterComponent::setAbilityMana(int id, int mana) return false; } -bool CharacterComponent::setAbilityRechargeSpeed(int id, int speed) +void CharacterComponent::sendAbilityUpdate(Entity &entity) { - AbilityMap::iterator it = mAbilities.find(id); - if (it != mAbilities.end()) - { - it->second.rechargeSpeed = speed; - mModifiedAbilities.insert(id); - return true; - } - return false; -} + auto *beingComponent = entity.getComponent<BeingComponent>(); -void CharacterComponent::sendAbilityUpdate() -{ MessageOut msg(GPMSG_ABILITY_STATUS); for (unsigned id : mModifiedAbilities) { @@ -347,10 +340,13 @@ void CharacterComponent::sendAbilityUpdate() if (it == mAbilities.end()) continue; // got deleted + const double rechargeSpeed = beingComponent->getModifiedAttribute( + it->second.abilityInfo->rechargeAttribute); + msg.writeInt8(id); msg.writeInt32(it->second.currentPoints); msg.writeInt32(it->second.abilityInfo->neededPoints); - msg.writeInt32(it->second.rechargeSpeed); + msg.writeInt32((int)rechargeSpeed); } mModifiedAbilities.clear(); @@ -483,6 +479,13 @@ void CharacterComponent::attributeChanged(Entity *entity, unsigned attr) knuckleDamage.base = beingComponent->getModifiedAttribute(ATTR_STR); knuckleDamage.delta = knuckleDamage.base / 2; } + + for (auto &abilityIt : mAbilities) + { + // Inform the client about rechargespeed changes + if (abilityIt.second.abilityInfo->rechargeAttribute == attr) + mModifiedAbilities.insert(abilityIt.first); + } } int CharacterComponent::expForLevel(int level) diff --git a/src/game-server/character.h b/src/game-server/character.h index 9b17969..6c2e31e 100644 --- a/src/game-server/character.h +++ b/src/game-server/character.h @@ -51,12 +51,10 @@ struct AbilityValue AbilityValue(unsigned currentMana, const AbilityManager::AbilityInfo *abilityInfo) : currentPoints(currentMana) - , rechargeSpeed(abilityInfo->defaultRechargeSpeed) , abilityInfo(abilityInfo) {} unsigned currentPoints; - unsigned rechargeSpeed; const AbilityManager::AbilityInfo *abilityInfo; }; @@ -188,12 +186,6 @@ class CharacterComponent : public Component */ AbilityMap::iterator findAbility(int id) { return mAbilities.find(id); } - - /** - * Sets recharge speed of a ability - */ - bool setAbilityRechargeSpeed(int id, int speed); - /** * Removes all abilities from character */ @@ -511,7 +503,7 @@ class CharacterComponent : public Component /** * Informs the client about his characters abilities charge status */ - void sendAbilityUpdate(); + void sendAbilityUpdate(Entity &entity); enum TransactionType { TRANS_NONE, TRANS_TRADE, TRANS_BUYSELL }; |