summaryrefslogtreecommitdiff
path: root/src/game-server/character.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/character.cpp')
-rw-r--r--src/game-server/character.cpp121
1 files changed, 56 insertions, 65 deletions
diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp
index a053cd83..90a261fc 100644
--- a/src/game-server/character.cpp
+++ b/src/game-server/character.cpp
@@ -48,10 +48,10 @@
#include <limits.h>
// Experience curve related values
-const float Character::EXPCURVE_EXPONENT = 3.0f;
-const float Character::EXPCURVE_FACTOR = 10.0f;
-const float Character::LEVEL_SKILL_PRECEDENCE_FACTOR = 0.75f;
-const float Character::EXP_LEVEL_FLEXIBILITY = 1.0f;
+const float Character::EXPCURVE_EXPONENT = 2.5f;
+const float Character::EXPCURVE_FACTOR = 20.0f;
+const float Character::LEVEL_SKILL_PRECEDENCE_FACTOR = 0.85f;
+const float Character::EXP_LEVEL_FLEXIBILITY = 3.0f;
Script::Ref Character::mDeathCallback;
Script::Ref Character::mDeathAcceptedCallback;
@@ -87,7 +87,8 @@ Character::Character(MessageIn &msg):
mParty(0),
mTransaction(TRANS_NONE),
mTalkNpcId(0),
- mNpcThread(0)
+ mNpcThread(0),
+ mKnuckleAttackInfo(0)
{
const AttributeManager::AttributeScope &attr =
attributeManager->getAttributeScope(CharacterScope);
@@ -97,7 +98,7 @@ Character::Character(MessageIn &msg):
it1_end = attr.end(); it1 != it1_end; ++it1)
mAttributes.insert(std::make_pair(it1->first, Attribute(*it1->second)));
- setWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_MONSTER);
+ setWalkMask(Map::BLOCKMASK_WALL);
// Get character data.
mDatabaseID = msg.readInt32();
@@ -107,11 +108,27 @@ Character::Character(MessageIn &msg):
Inventory(this).initialize();
modifiedAllAttribute();
setSize(16);
+
+ // Default knuckle attack
+ int damageBase = this->getModifiedAttribute(ATTR_STR);
+ int damageDelta = damageBase / 2;
+ Damage knuckleDamage;
+ knuckleDamage.skill = skillManager->getDefaultSkillId();
+ knuckleDamage.base = damageBase;
+ knuckleDamage.delta = damageDelta;
+ knuckleDamage.cth = 2;
+ knuckleDamage.element = ELEMENT_NEUTRAL;
+ knuckleDamage.type = DAMAGE_PHYSICAL;
+ knuckleDamage.range = DEFAULT_TILE_LENGTH;
+
+ mKnuckleAttackInfo = new AttackInfo(0, knuckleDamage, 7, 3, 0);
+ addAttack(mKnuckleAttackInfo);
}
Character::~Character()
{
delete mNpcThread;
+ delete mKnuckleAttackInfo;
}
void Character::update()
@@ -163,58 +180,6 @@ void Character::update()
mStatusEffects[it->first] = it->second.time;
it++;
}
-
- processAttacks();
-}
-
-void Character::processAttacks()
-{
- // Ticks attacks even when not attacking to permit cooldowns and warmups.
- std::list<AutoAttack> attacksReady;
- mAutoAttacks.tick(&attacksReady);
-
- if (mAction != ATTACK || !mTarget)
- {
- mAutoAttacks.stop();
- return;
- }
-
- // Deal with the ATTACK action.
-
- // Install default bare knuckle attack if no attacks were added from config.
- // TODO: Get this from configuration.
- if (!mAutoAttacks.getAutoAttacksNumber())
- {
- int damageBase = getModifiedAttribute(ATTR_STR);
- int damageDelta = damageBase / 2;
- Damage knuckleDamage;
- knuckleDamage.skill = skillManager->getDefaultSkillId();
- knuckleDamage.base = damageBase;
- knuckleDamage.delta = damageDelta;
- knuckleDamage.cth = 2;
- knuckleDamage.element = ELEMENT_NEUTRAL;
- knuckleDamage.type = DAMAGE_PHYSICAL;
- knuckleDamage.range = (getSize() < DEFAULT_TILE_LENGTH) ?
- DEFAULT_TILE_LENGTH : getSize();
-
- AutoAttack knuckleAttack(knuckleDamage, 7, 3);
- mAutoAttacks.add(knuckleAttack);
- }
-
- if (attacksReady.empty())
- {
- if (!mAutoAttacks.areActive())
- mAutoAttacks.start();
- }
- else
- {
- // Performs all ready attacks.
- for (std::list<AutoAttack>::iterator it = attacksReady.begin();
- it != attacksReady.end(); ++it)
- {
- performAttack(mTarget, it->getDamage());
- }
- }
}
void Character::died()
@@ -537,6 +502,14 @@ bool Character::recalculateBaseAttribute(unsigned int attr)
newBase = 0.0;
// TODO
break;
+ case ATTR_STR:
+ if (mKnuckleAttackInfo)
+ {
+ Damage &knuckleDamage = mKnuckleAttackInfo->getDamage();
+ knuckleDamage.base = getModifiedAttribute(ATTR_STR);
+ knuckleDamage.delta = knuckleDamage.base / 2;
+ }
+ break;
default:
return Being::recalculateBaseAttribute(attr);
}
@@ -561,22 +534,22 @@ void Character::updateDerivedAttributes(unsigned int attr)
switch(attr)
{
case ATTR_STR:
- updateDerivedAttributes(ATTR_INV_CAPACITY);
+ recalculateBaseAttribute(ATTR_INV_CAPACITY);
break;
case ATTR_AGI:
- updateDerivedAttributes(ATTR_DODGE);
- updateDerivedAttributes(ATTR_MOVE_SPEED_TPS);
+ recalculateBaseAttribute(ATTR_DODGE);
+ recalculateBaseAttribute(ATTR_MOVE_SPEED_TPS);
break;
case ATTR_VIT:
- updateDerivedAttributes(ATTR_MAX_HP);
- updateDerivedAttributes(ATTR_HP_REGEN);
- updateDerivedAttributes(ATTR_DEFENSE);
+ recalculateBaseAttribute(ATTR_MAX_HP);
+ recalculateBaseAttribute(ATTR_HP_REGEN);
+ recalculateBaseAttribute(ATTR_DEFENSE);
break;
case ATTR_INT:
// TODO
break;
case ATTR_DEX:
- updateDerivedAttributes(ATTR_ACCURACY);
+ recalculateBaseAttribute(ATTR_ACCURACY);
break;
case ATTR_WIL:
// TODO
@@ -794,6 +767,24 @@ void Character::resumeNpcThread()
}
}
+void Character::addAttack(AttackInfo *attackInfo)
+{
+ // Remove knuckle attack
+ Being::addAttack(attackInfo);
+ Being::removeAttack(mKnuckleAttackInfo);
+}
+
+void Character::removeAttack(AttackInfo *attackInfo)
+{
+ // Add knuckle attack
+ if (mAttacks.getNumber() == 1)
+ {
+ Being::addAttack(mKnuckleAttackInfo);
+ }
+ Being::removeAttack(attackInfo);
+}
+
+
void Character::disconnected()
{
mConnected = false;