server/game/src/skill.cpp

352 lines
9.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include <common/stl.h>
#include "constants.h"
#include "skill.h"
#include "char.h"
void CSkillProto::SetPointVar(const std::string& strName, double dVar)
{
kPointPoly.SetVar(strName, dVar);
kPointPoly2.SetVar(strName, dVar);
kPointPoly3.SetVar(strName, dVar);
kMasterBonusPoly.SetVar(strName, dVar);
}
void CSkillProto::SetDurationVar(const std::string& strName, double dVar)
{
kDurationPoly.SetVar(strName, dVar);
kDurationPoly2.SetVar(strName, dVar);
kDurationPoly3.SetVar(strName, dVar);
}
void CSkillProto::SetSPCostVar(const std::string& strName, double dVar)
{
kSPCostPoly.SetVar(strName, dVar);
kGrandMasterAddSPCostPoly.SetVar(strName, dVar);
}
CSkillManager::CSkillManager()
{
}
CSkillManager::~CSkillManager()
{
itertype(m_map_pkSkillProto) it = m_map_pkSkillProto.begin();
for ( ; it != m_map_pkSkillProto.end(); ++it) {
M2_DELETE(it->second);
}
}
struct SPointOnType
{
const char * c_pszName;
int iPointOn;
} kPointOnTypes[] = {
{ "NONE", POINT_NONE },
{ "MAX_HP", POINT_MAX_HP },
{ "MAX_SP", POINT_MAX_SP },
{ "HP_REGEN", POINT_HP_REGEN },
{ "SP_REGEN", POINT_SP_REGEN },
{ "BLOCK", POINT_BLOCK },
{ "HP", POINT_HP },
{ "SP", POINT_SP },
{ "ATT_GRADE", POINT_ATT_GRADE_BONUS },
{ "DEF_GRADE", POINT_DEF_GRADE_BONUS },
{ "MAGIC_ATT_GRADE",POINT_MAGIC_ATT_GRADE_BONUS },
{ "MAGIC_DEF_GRADE",POINT_MAGIC_DEF_GRADE_BONUS },
{ "BOW_DISTANCE", POINT_BOW_DISTANCE },
{ "MOV_SPEED", POINT_MOV_SPEED },
{ "ATT_SPEED", POINT_ATT_SPEED },
{ "POISON_PCT", POINT_POISON_PCT },
{ "RESIST_RANGE", POINT_RESIST_BOW },
//{ "RESIST_MELEE", POINT_RESIST_MELEE },
{ "CASTING_SPEED", POINT_CASTING_SPEED },
{ "REFLECT_MELEE", POINT_REFLECT_MELEE },
{ "ATT_BONUS", POINT_ATT_BONUS },
{ "DEF_BONUS", POINT_DEF_BONUS },
{ "RESIST_NORMAL", POINT_RESIST_NORMAL_DAMAGE },
{ "DODGE", POINT_DODGE },
{ "KILL_HP_RECOVER",POINT_KILL_HP_RECOVERY },
{ "KILL_SP_RECOVER",POINT_KILL_SP_RECOVER },
{ "HIT_HP_RECOVER", POINT_HIT_HP_RECOVERY },
{ "HIT_SP_RECOVER", POINT_HIT_SP_RECOVERY },
{ "CRITICAL", POINT_CRITICAL_PCT },
{ "MANASHIELD", POINT_MANASHIELD },
{ "SKILL_DAMAGE_BONUS", POINT_SKILL_DAMAGE_BONUS },
{ "NORMAL_HIT_DAMAGE_BONUS", POINT_NORMAL_HIT_DAMAGE_BONUS },
{ "\n", POINT_NONE },
};
int FindPointType(const char * c_sz)
{
for (int i = 0; *kPointOnTypes[i].c_pszName != '\n'; ++i)
{
if (!strcasecmp(c_sz, kPointOnTypes[i].c_pszName))
return kPointOnTypes[i].iPointOn;
}
return -1;
}
bool CSkillManager::Initialize(TSkillTable * pTab, int iSize)
{
char buf[1024];
std::map<DWORD, CSkillProto *> map_pkSkillProto;
TSkillTable * t = pTab;
bool bError = false;
for (int i = 0; i < iSize; ++i, ++t)
{
CSkillProto * pkProto = M2_NEW CSkillProto;
pkProto->dwVnum = t->dwVnum;
strncpy(pkProto->szName, t->szName, sizeof(pkProto->szName));
pkProto->dwType = t->bType;
pkProto->bMaxLevel = t->bMaxLevel;
pkProto->dwFlag = t->dwFlag;
pkProto->dwAffectFlag = t->dwAffectFlag;
pkProto->dwAffectFlag2 = t->dwAffectFlag2;
pkProto->bLevelStep = t->bLevelStep;
pkProto->bLevelLimit = t->bLevelLimit;
pkProto->iSplashRange = t->dwSplashRange;
pkProto->dwTargetRange = t->dwTargetRange;
pkProto->preSkillVnum = t->preSkillVnum;
pkProto->preSkillLevel = t->preSkillLevel;
pkProto->lMaxHit = t->lMaxHit;
pkProto->bSkillAttrType = t->bSkillAttrType;
int iIdx = FindPointType(t->szPointOn);
if (iIdx < 0)
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : cannot find point type on skill: %s szPointOn: %s", t->szName, t->szPointOn);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
pkProto->bPointOn = iIdx;
int iIdx2 = FindPointType(t->szPointOn2);
if (iIdx2 < 0)
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : cannot find point type on skill: %s szPointOn2: %s", t->szName, t->szPointOn2);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
pkProto->bPointOn2 = iIdx2;
int iIdx3 = FindPointType(t->szPointOn3);
if (iIdx3 < 0)
{
if (t->szPointOn3[0] == 0)
{
iIdx3 = POINT_NONE;
}
else
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : cannot find point type on skill: %s szPointOn3: %s", t->szName, t->szPointOn3);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
}
pkProto->bPointOn3 = iIdx3;
if (!pkProto->kSplashAroundDamageAdjustPoly.Analyze(t->szSplashAroundDamageAdjustPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szSplashAroundDamageAdjustPoly: %s", t->szName, t->szSplashAroundDamageAdjustPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kPointPoly.Analyze(t->szPointPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szPointPoly: %s", t->szName, t->szPointPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kPointPoly2.Analyze(t->szPointPoly2))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szPointPoly2: %s", t->szName, t->szPointPoly2);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kPointPoly3.Analyze(t->szPointPoly3))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szPointPoly3: %s", t->szName, t->szPointPoly3);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kSPCostPoly.Analyze(t->szSPCostPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szSPCostPoly: %s", t->szName, t->szSPCostPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kGrandMasterAddSPCostPoly.Analyze(t->szGrandMasterAddSPCostPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szGrandMasterAddSPCostPoly: %s", t->szName, t->szGrandMasterAddSPCostPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kDurationPoly.Analyze(t->szDurationPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szDurationPoly: %s", t->szName, t->szDurationPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kDurationPoly2.Analyze(t->szDurationPoly2))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szDurationPoly2: %s", t->szName, t->szDurationPoly2);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kDurationPoly3.Analyze(t->szDurationPoly3))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szDurationPoly3: %s", t->szName, t->szDurationPoly3);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kDurationSPCostPoly.Analyze(t->szDurationSPCostPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szDurationSPCostPoly: %s", t->szName, t->szDurationSPCostPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
if (!pkProto->kCooldownPoly.Analyze(t->szCooldownPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szCooldownPoly: %s", t->szName, t->szCooldownPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
sys_log(0, "Master %s", t->szMasterBonusPoly);
if (!pkProto->kMasterBonusPoly.Analyze(t->szMasterBonusPoly))
{
snprintf(buf, sizeof(buf), "SkillManager::Initialize : syntax error skill: %s szMasterBonusPoly: %s", t->szName, t->szMasterBonusPoly);
sys_err("%s", buf);
SendLog(buf);
bError = true;
M2_DELETE(pkProto);
continue;
}
sys_log(0, "#%-3d %-24s type %u flag %u affect %u point_poly: %s",
pkProto->dwVnum, pkProto->szName, pkProto->dwType, pkProto->dwFlag, pkProto->dwAffectFlag, t->szPointPoly);
map_pkSkillProto.insert(std::map<DWORD, CSkillProto *>::value_type(pkProto->dwVnum, pkProto));
}
if (!bError)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
itertype(m_map_pkSkillProto) it = m_map_pkSkillProto.begin();
while (it != m_map_pkSkillProto.end()) {
M2_DELETE(it->second);
++it;
}
m_map_pkSkillProto.clear();
// <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
it = map_pkSkillProto.begin();
while (it != map_pkSkillProto.end())
{
m_map_pkSkillProto.insert(std::map<DWORD, CSkillProto *>::value_type(it->first, it->second));
++it;
}
SendLog("Skill Prototype reloaded!");
}
else
SendLog("There were erros when loading skill table");
return !bError;
}
CSkillProto * CSkillManager::Get(DWORD dwVnum)
{
std::map<DWORD, CSkillProto *>::iterator it = m_map_pkSkillProto.find(dwVnum);
if (it == m_map_pkSkillProto.end())
return NULL;
return it->second;
}
CSkillProto * CSkillManager::Get(const char * c_pszSkillName)
{
std::map<DWORD, CSkillProto *>::iterator it = m_map_pkSkillProto.begin();
while (it != m_map_pkSkillProto.end())
{
if (!strcasecmp(it->second->szName, c_pszSkillName))
return it->second;
it++;
}
return NULL;
}