diff options
Diffstat (limited to 'src/game-server/character.cpp')
-rw-r--r-- | src/game-server/character.cpp | 121 |
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; |