KSkillManager.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1.  
  2. #include "KCore.h"
  3. #include "KSkillManager.h"
  4. #include "MyAssert.H"
  5. #include "KThiefSkill.h"
  6. unsigned long g_ulSkillCount = 0;
  7. KSkillManager g_SkillManager;
  8. KSkillManager::KSkillManager()
  9. {
  10. }
  11. // Add By Freeway Chen in 2003.6.6
  12. KSkillManager::~KSkillManager()
  13. {
  14.     unsigned long i = 0;
  15.     unsigned long j = 0;
  16.     
  17.     for (i = 0; i < MAX_SKILL; i++)
  18.     {
  19.         for (j = 0; j < MAX_SKILLLEVEL; j++)
  20.         {
  21.             if (m_pOrdinSkill[i][j])
  22.             {
  23.                 delete m_pOrdinSkill[i][j];
  24.                 m_pOrdinSkill[i][j] = NULL;
  25.             }
  26.         }
  27.     }
  28. }
  29. BOOL KSkillManager::Init()
  30. {
  31.     int i = 0;
  32.     int j = 0;
  33.     for (i = 0; i < MAX_SKILL; i++)
  34.     {
  35.         for (j = 0; j < MAX_SKILLLEVEL; j++)
  36.         {
  37.             m_pOrdinSkill[i][j] = NULL;
  38.         }
  39.     }
  40. memset(m_SkillInfo, 0,  sizeof(m_SkillInfo));
  41. // Load OrdinSkill Info 
  42. int nSkillNum = g_OrdinSkillsSetting.GetHeight() - 1;
  43. if (nSkillNum <= 0 ) return FALSE;
  44. for (i = 0; i < nSkillNum; i ++)
  45. {
  46. int nSkillId = -1;
  47. int nSkillStyle = -1;
  48. int nSkillMaxLevel = 0;
  49. g_OrdinSkillsSetting.GetInteger(i + 2, "SkillId", -1, &nSkillId);
  50. g_OrdinSkillsSetting.GetInteger(i + 2, "SkillStyle", -1, &nSkillStyle);
  51. g_OrdinSkillsSetting.GetInteger(i + 2, "MaxLevel", 20, &nSkillMaxLevel);
  52. _ASSERT(nSkillMaxLevel >= 0);
  53. if (nSkillId > 0 && nSkillStyle >= 0)
  54. {
  55. m_SkillInfo[nSkillId - 1].m_nSkillStyle = nSkillStyle;
  56. m_SkillInfo[nSkillId - 1].m_nTabFileRowId = i + 2;
  57. m_SkillInfo[nSkillId - 1].m_ulMaxSkillLevel = nSkillMaxLevel;
  58. }
  59. else
  60. {
  61. m_SkillInfo[nSkillId - 1].m_nSkillStyle = -1;
  62. m_SkillInfo[nSkillId - 1].m_nTabFileRowId = 0;
  63. m_SkillInfo[nSkillId - 1].m_ulMaxSkillLevel = 0;
  64. }
  65. }
  66. KTabFile ThiefSkillTab;
  67. if (ThiefSkillTab.Load(THIEFSKILL_SETTINGFILE))
  68. {
  69. int nSkillId = 0;
  70. ThiefSkillTab.GetInteger(2, "SkillId", 400, &nSkillId);
  71. _ASSERT(nSkillId > 0);
  72. m_SkillInfo[nSkillId - 1].m_nSkillStyle = SKILL_SS_Thief;
  73. m_SkillInfo[nSkillId - 1].m_nTabFileRowId = 2;
  74. m_SkillInfo[nSkillId - 1].m_ulMaxSkillLevel = 1;
  75. }
  76. return TRUE;
  77. }
  78. ISkill* KSkillManager::InstanceSkill( unsigned long ulSkillID, unsigned long ulSkillLevel)
  79. {
  80. ISkill *pRetSkill = NULL;
  81.     int nStyle = GetSkillStyle(ulSkillID);
  82. switch (nStyle) // eSkillStyle
  83. {
  84. case SKILL_SS_Missles:         // 子弹类 本技能用于发送子弹类
  85. case SKILL_SS_Melee:
  86. case SKILL_SS_InitiativeNpcState:     // 主动类 本技能用于改变当前Npc的主动状态
  87. case SKILL_SS_PassivityNpcState: // 被动类 本技能用于改变Npc的被动状态
  88. {
  89.             KSkill * pNewOrdinSkill = NULL;
  90. unsigned long ulFirstLoadLevel = 0;
  91.             if (m_pOrdinSkill[ulSkillID - 1][ulSkillLevel - 1])
  92.             { 
  93.                 pRetSkill = m_pOrdinSkill[ulSkillID - 1][ulSkillLevel - 1];
  94.                 goto Exit1;
  95.             }
  96. pNewOrdinSkill = new KSkill;
  97. ulFirstLoadLevel = m_SkillInfo[ulSkillID - 1].m_ulFirstLoadLevel;
  98. if (!ulFirstLoadLevel)
  99. {
  100. pNewOrdinSkill->GetInfoFromTabFile(m_SkillInfo[ulSkillID - 1].m_nTabFileRowId);
  101. pNewOrdinSkill->LoadSkillLevelData(ulSkillLevel, m_SkillInfo[ulSkillID - 1].m_nTabFileRowId);
  102. m_SkillInfo[ulSkillID - 1].m_ulFirstLoadLevel = ulSkillLevel;
  103. }
  104. else
  105. {
  106. _ASSERT(m_pOrdinSkill[ulSkillID - 1][ulFirstLoadLevel - 1]);
  107. *pNewOrdinSkill = *(KSkill*)m_pOrdinSkill[ulSkillID - 1][ulFirstLoadLevel - 1];
  108. pNewOrdinSkill->LoadSkillLevelData(ulSkillLevel, m_SkillInfo[ulSkillID - 1].m_nTabFileRowId);
  109. }
  110. pNewOrdinSkill->SetSkillId(ulSkillID);
  111. pNewOrdinSkill->SetSkillLevel(ulSkillLevel);
  112. m_pOrdinSkill[ulSkillID - 1][ulSkillLevel - 1] = pNewOrdinSkill;
  113. pRetSkill = pNewOrdinSkill;
  114.             pNewOrdinSkill = NULL;
  115.         }    break;
  116. case SKILL_SS_Thief:
  117. {
  118. if (!m_pOrdinSkill[ulSkillID - 1][0])
  119. {
  120. m_pOrdinSkill[ulSkillID - 1][0] = (ISkill*)new KThiefSkill;
  121. }
  122. pRetSkill = m_pOrdinSkill[ulSkillID - 1][0];
  123. ((KThiefSkill*)pRetSkill)->LoadSetting(THIEFSKILL_SETTINGFILE);
  124. }break;
  125. default:
  126. goto Exit0;
  127. }
  128.     
  129. Exit1:
  130. Exit0:
  131. return pRetSkill;
  132. }