#include "stdafx.h" #include #ifndef _RYL_GAME_CLIENT_ #include "./Character/CharacterClass.h" #endif #include "CreatureStructure.h" #include "./Character/CharacterStructure.h" #include "../Item/Item.h" MotionInfo::MotionInfo() : m_fDirection(0.0f), m_fVelocity(0.0f), m_wAction(0), m_dwFrame(0) { } StatusInfo::StatusInfo() : m_nCriticalType(0), m_nCriticalPercentage(0), m_nMinDamage(0), m_nMaxDamage(0), m_fDRC(0.0f), m_nOffenceRevision(0), m_nDefence(0), m_nDefenceRevision(0), m_nMagicResistance(0), m_nBlockingPercentage(0), m_nAttackSpeed(0), m_nMoveSpeed(0), m_nAttackRange(0), m_nRangeAttackDistance(0), m_nMaxHP(0), m_nMaxMP(0), m_nHPRegenAmount(0), m_nMPRegenAmount(0) { int nMaxAttributeNum = MAX_ATTRIBUTE_NUM; std::fill_n(m_nWeaponAttributeLevel, nMaxAttributeNum, 0); std::fill_n(m_nAttributeResistance, nMaxAttributeNum, 0); } #ifndef _RYL_GAME_CLIENT_ bool StatusInfo::CalculateStatus(const CharacterStatus& characterStatus, const unsigned short nLevel, const unsigned short nClass, unsigned char cUsingWeaponType) { switch (nClass) { // ÆÄÀÌÅÍ case CClass::Fighter: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ·Î±× case CClass::Rouge: { m_nOffenceRevision = characterStatus.m_nDEX / 4; m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ¸ÞÀÌÁö case CClass::Mage: { m_nOffenceRevision = characterStatus.m_nINT / 4; m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ¾îÄݶóÀÌÆ® case CClass::Acolyte: { m_nOffenceRevision = characterStatus.m_nWIS / 2; m_nDefenceRevision = characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300; } break; // µðÆæ´õ case CClass::Defender: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ¿ö¸®¾î case CClass::Warrior: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550; } break; // ¾î½Ø½Å case CClass::Assasin: { m_nOffenceRevision = characterStatus.m_nDEX / 4; m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800; } break; // ¾ÆÃ³ case CClass::Archer: { m_nOffenceRevision = characterStatus.m_nDEX / 4; m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550; } break; // ¼Ò¼­·¯ case CClass::Sorcerer: { m_nOffenceRevision = characterStatus.m_nINT / 4; m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800; } break; // ¿£ÂùÅÍ case CClass::Enchanter: { m_nOffenceRevision = characterStatus.m_nINT / 4; m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550; } break; // ÇÁ¸®½ºÆ® case CClass::Priest: { m_nOffenceRevision = characterStatus.m_nWIS / 2; m_nDefenceRevision = characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300; } break; // Ŭ·¹¸¯ case CClass::Cleric: { m_nOffenceRevision = characterStatus.m_nWIS / 2; m_nDefenceRevision = characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 550; } break; // ÄĹèÅÏÆ® case CClass::Combatant: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ¿ÀÇǼ¼ÀÌÅÍ case CClass::Officetor: { m_nOffenceRevision = characterStatus.m_nDEX / 4; m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300; } break; // ÅÛÇ÷¯ case CClass::Templar: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 800; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 300; } break; // ¾îÅÂÄ¿ case CClass::Attacker: { m_nOffenceRevision = characterStatus.m_nSTR / 4; m_nDefenceRevision = characterStatus.m_nSTR / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 550; } break; // °Å³Ê case CClass::Gunner: { m_nOffenceRevision = characterStatus.m_nDEX / 2; m_nDefenceRevision = characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800; } break; // ·é¿ÀÇÁ case CClass::RuneOff: { m_nOffenceRevision = characterStatus.m_nINT / 4; m_nDefenceRevision = characterStatus.m_nINT / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 300; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel, (characterStatus.m_nWIS - 20) * nLevel / 2) + nLevel * 40 + 800; } break; // ¶óÀÌÇÁ¿ÀÇÁ case CClass::LifeOff: { m_nOffenceRevision = characterStatus.m_nWIS / 2; m_nDefenceRevision = characterStatus.m_nWIS / 2 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 550; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 550; } break; // ½¦µµ¿ì¿ÀÇÁ case CClass::ShadowOff: { m_nOffenceRevision = characterStatus.m_nDEX / 4; m_nDefenceRevision = characterStatus.m_nDEX / 4 + characterStatus.m_nDEX / 5; m_nMaxHP = (characterStatus.m_nCON - 20) * nLevel / 2 + nLevel * 40 + 800; m_nMaxMP = max((characterStatus.m_nINT - 20) * nLevel / 2, (characterStatus.m_nWIS - 20) * nLevel) + nLevel * 40 + 300; } break; default: { #ifdef ERRLOG0 ERRLOG0(g_Log, "Ŭ·¡½º°¡ NoneÀΠij¸¯ÅÍÀÔ´Ï´Ù."); #endif return false; } break; } // Ȱ, ¼®±Ã if (cUsingWeaponType == Item::CItemType::BOW || cUsingWeaponType == Item::CItemType::CROSSBOW) { m_nMinDamage = characterStatus.m_nDEX / 2; m_nMaxDamage = characterStatus.m_nDEX / 2; } // ±×¿Ü ±ÙÁ¢ ¹«±â else { m_nMinDamage = characterStatus.m_nSTR / 3; m_nMaxDamage = characterStatus.m_nSTR / 3; // ·Î±×, ¾î½Ø½Å, ¾ÆÃ³, ½¦µµ¿ì ¿ÀÇÁÀÇ °æ¿ì DEX¿¡ ÀÇÇÑ °¡»êÁ¡ÀÌ... if (CClass::Rouge == CClass::GetPreviousJob(static_cast(nClass)) || CClass::ShadowOff == nClass) { m_nMinDamage += characterStatus.m_nDEX / 6; m_nMaxDamage += characterStatus.m_nDEX / 6; } } // °øÅë»çÇ×µé m_nDefence = 0; m_nBlockingPercentage = 0; m_fDRC = 0; m_nCriticalPercentage = characterStatus.m_nDEX / 5; m_nCriticalType = 0; m_nMagicResistance = characterStatus.m_nWIS / 3; m_nAttackSpeed = 0; m_nMoveSpeed = 0; m_nAttackRange = 0; m_nRangeAttackDistance = 0; m_nHPRegenAmount = ((characterStatus.m_nCON - 20) * nLevel + nLevel * 40 + 300) / 50; m_nMPRegenAmount = ((characterStatus.m_nINT + characterStatus.m_nWIS - 40) * nLevel + nLevel * 40 + 300) / 50; for (int nAttribute = 0; nAttribute < MAX_ATTRIBUTE_NUM; ++nAttribute) { m_nWeaponAttributeLevel[nAttribute] = 0; m_nAttributeResistance[nAttribute] = 0; } return true; } #endif CreatureStatus::CreatureStatus() : m_nLevel(0), m_nExp(0), m_nNowHP(0), m_nNowMP(0) { } CreatureStatus::CreatureStatus(CHAR_INFOST& characterDBData) : m_nLevel(characterDBData.Level), m_nExp(characterDBData.Exp), m_nNowHP(characterDBData.HP), m_nNowMP(characterDBData.MP) { } void CreatureStatus::Init(CHAR_INFOST& characterDBData) { m_nLevel = characterDBData.Level; m_nExp = characterDBData.Exp; m_nNowHP = characterDBData.HP; m_nNowMP = characterDBData.MP; }