1. #include "StdAfx.h"
  2. #include "PythonSkill.h"
  3. #include "../EterBase/Poly/Poly.h"
  4. #include "../EterPack/EterPackManager.h"
  5. #include "InstanceBase.h"
  6. #include "PythonPlayer.h"
  7. std::map<std::string, DWORD> CPythonSkill::SSkillData::ms_StatusNameMap;
  8. std::map<std::string, DWORD> CPythonSkill::SSkillData::ms_NewMinStatusNameMap;
  9. std::map<std::string, DWORD> CPythonSkill::SSkillData::ms_NewMaxStatusNameMap;
  10. DWORD CPythonSkill::SSkillData::ms_dwTimeIncreaseSkillNumber = 0;
  11. BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE;
  12. int SplitLine(const char * c_szText, CTokenVector* pstTokenVector, const char * c_szDelimeter)
  13. {
  14. pstTokenVector->reserve(10);
  15. pstTokenVector->clear();
  16. std::string stToken;
  17. std::string stLine = c_szText;
  18. DWORD basePos = 0;
  19. do
  20. {
  21. int beginPos = stLine.find_first_not_of(c_szDelimeter, basePos);
  22. if (beginPos < 0)
  23. return -1;
  24. int endPos;
  25. if (stLine[beginPos] == '"')
  26. {
  27. ++beginPos;
  28. endPos = stLine.find_first_of("\"", beginPos);
  29. if (endPos < 0)
  30. return -2;
  31. basePos = endPos + 1;
  32. }
  33. else
  34. {
  35. endPos = stLine.find_first_of(c_szDelimeter, beginPos);
  36. basePos = endPos;
  37. }
  38. pstTokenVector->push_back(stLine.substr(beginPos, endPos - beginPos));
  39. // Ãß°¡ ÄÚµå. ¸ÇµÚ¿¡ ÅÇÀÌ ÀÖ´Â °æ¿ì¸¦ üũÇÑ´Ù. - [levites]
  40. if (int(stLine.find_first_not_of(c_szDelimeter, basePos)) < 0)
  41. break;
  42. } while (basePos < stLine.length());
  43. return 0;
  44. }
  45. // OVERWRITE_SKILLPROTO_POLY
  46. void string_replace_word(const char* base, int base_len, const char* src, int src_len, const char* dst, int dst_len, std::string& result)
  47. {
  48. result.resize(0);
  49. if (base_len > 0 && dst_len > src_len)
  50. result.reserve(base_len + (dst_len-src_len) * (base_len/src_len));
  51. else
  52. result.reserve(base_len);
  53. int prev = 0;
  54. int cur = 0;
  55. while (cur < base_len)
  56. {
  57. if (memcmp(base + cur, src, src_len) == 0)
  58. {
  59. result.append(base + prev, cur - prev);
  60. result.append(dst, dst_len);
  61. cur += src_len;
  62. prev = cur;
  63. }
  64. else
  65. {
  66. ++cur;
  67. }
  68. }
  69. result.append(base + prev, cur - prev);
  70. }
  71. // END_OF_OVERWRITE_SKILLPROTO_POLY
  72. bool CPythonSkill::RegisterSkillTable(const char * c_szFileName)
  73. {
  74. const VOID* pvData;
  75. CMappedFile kFile;
  76. if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
  77. return false;
  78. CMemoryTextFileLoader textFileLoader;
  79. textFileLoader.Bind(kFile.Size(), pvData);
  80. // OVERWRITE_SKILLPROTO_POLY
  81. string src_poly_rand;
  82. string src_poly_atk;
  83. string src_poly_mwep;
  84. // END_OF_OVERWRITE_SKILLPROTO_POLY
  85. CTokenVector TokenVector;
  86. for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
  87. {
  88. if (!textFileLoader.SplitLineByTab(i, &TokenVector))
  89. continue;
  90. std::string strLine = textFileLoader.GetLineString(i);
  91. if (TABLE_TOKEN_TYPE_MAX_NUM != TokenVector.size())
  92. {
  93. Tracef("CPythonSkill::RegisterSkillTable(%s) - Strange Token Count [Line:%d / TokenCount:%d]\n", c_szFileName, i, TokenVector.size());
  94. continue;
  95. }
  96. int iVnum = atoi(TokenVector[TABLE_TOKEN_TYPE_VNUM].c_str());
  97. TSkillDataMap::iterator itor = m_SkillDataMap.find(iVnum);
  98. if (m_SkillDataMap.end() == itor)
  99. {
  100. Tracef("CPythonSkill::RegisterSkillTable(%s) - NOT EXIST SkillDesc [Vnum:%d Line:%d]\n", c_szFileName, iVnum, i);
  101. continue;
  102. }
  103. TSkillData & rSkillData = itor->second;
  104. const std::string & c_strSPCostPoly = TokenVector[TABLE_TOKEN_TYPE_SP_COST_POLY];
  105. if (!c_strSPCostPoly.empty())
  106. {
  107. rSkillData.strNeedSPFormula = c_strSPCostPoly;
  108. }
  109. const std::string & c_strCooldownPoly = TokenVector[TABLE_TOKEN_TYPE_COOLDOWN_POLY];
  110. if (!c_strCooldownPoly.empty())
  111. {
  112. rSkillData.strCoolTimeFormula = c_strCooldownPoly;
  113. }
  114. const std::string & c_strDurationSPCostPoly = TokenVector[TABLE_TOKEN_TYPE_DURATION_SP_COST_POLY];
  115. if (!c_strDurationSPCostPoly.empty())
  116. {
  117. rSkillData.strContinuationSPFormula = c_strDurationSPCostPoly;
  118. }
  119. const std::string & c_strTargetRange = TokenVector[TABLE_TOKEN_TYPE_TARGET_RANGE];
  120. if (!c_strTargetRange.empty())
  121. {
  122. rSkillData.dwTargetRange = atoi(c_strTargetRange.c_str());
  123. }
  124. rSkillData.strDuration = TokenVector[TABLE_TOKEN_TYPE_DURATION_POLY];
  125. const DWORD LevelEmpty = 1;
  126. const std::string & c_strMaxLevel = TokenVector[TABLE_TOKEN_TYPE_MAX_LEVEL];
  127. if (!c_strMaxLevel.empty())
  128. {
  129. int maxLevel = atoi(c_strMaxLevel.c_str());
  130. if(maxLevel > LevelEmpty)
  131. rSkillData.byMaxLevel = maxLevel;
  132. }
  133. const std::string & c_strLevelLimit = TokenVector[TABLE_TOKEN_TYPE_LEVEL_LIMIT];
  134. if (!c_strLevelLimit.empty())
  135. {
  136. int levelLimit = atoi(c_strLevelLimit.c_str());
  137. if(rSkillData.byLevelLimit > LevelEmpty)
  138. rSkillData.byLevelLimit = levelLimit;
  139. }
  140. const std::string & c_strPointPoly = TokenVector[TABLE_TOKEN_TYPE_POINT_POLY];
  141. // OVERWRITE_SKILLPROTO_POLY
  142. bool USE_SKILL_PROTO = LocaleService_IsCHEONMA() ? false : true;
  143. switch (iVnum)
  144. {
  145. case 34:
  146. // GUILD_SKILL_DISPLAY_BUG_FIX
  147. case 151:
  148. case 152:
  149. case 153:
  150. case 154:
  151. case 155:
  152. case 156:
  153. case 157:
  154. // END_OF_GUILD_SKILL_DISPLAY_BUG_FIX
  155. USE_SKILL_PROTO = false;
  156. break;
  157. }
  158. if (!rSkillData.AffectDataVector.empty() && USE_SKILL_PROTO)
  159. {
  160. TAffectData& affect = rSkillData.AffectDataVector[0];
  161. if (strstr(c_strPointPoly.c_str(), "atk") != NULL ||
  162. strstr(c_strPointPoly.c_str(), "mwep") != NULL ||
  163. strstr(c_strPointPoly.c_str(), "number") != NULL)
  164. {
  165. src_poly_rand = "";
  166. src_poly_atk = "";
  167. src_poly_mwep = "";
  168. // MIN
  169. string_replace_word(c_strPointPoly.c_str(), c_strPointPoly.length(),
  170. "number", 6, "min", 3, src_poly_rand);
  171. string_replace_word(src_poly_rand.c_str(), src_poly_rand.length(),
  172. "atk", 3, "minatk", 6, src_poly_atk);
  173. string_replace_word(src_poly_atk.c_str(), src_poly_atk.length(),
  174. "mwep", 4, "minmwep", 7, affect.strAffectMinFormula);
  175. // END_OF_MIN
  176. // MAX
  177. string_replace_word(c_strPointPoly.c_str(), c_strPointPoly.length(),
  178. "number", 6, "max", 3, src_poly_rand);
  179. string_replace_word(src_poly_rand.c_str(), src_poly_rand.length(),
  180. "atk", 3, "maxatk", 6, src_poly_atk);
  181. string_replace_word(src_poly_atk.c_str(), src_poly_atk.length(),
  182. "mwep", 4, "maxmwep", 7, affect.strAffectMaxFormula);
  183. // END_OF_MAX
  184. switch (iVnum)
  185. {
  186. case 1: // »ï¿¬Âü
  187. affect.strAffectMinFormula += "* 3";
  188. affect.strAffectMaxFormula += "* 3";
  189. break;
  190. }
  191. }
  192. else
  193. {
  194. affect.strAffectMinFormula = c_strPointPoly;
  195. affect.strAffectMaxFormula = "";
  196. }
  197. }
  198. // END_OF_OVERWRITE_SKILLPROTO_POLY
  199. }
  200. return true;
  201. }
  202. void CPythonSkill::__RegisterGradeIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName)
  203. {
  204. for (int j = 0; j < SKILL_GRADE_COUNT; ++j)
  205. {
  206. TGradeData & rGradeData = rData.GradeData[j];
  207. char szCount[8+1];
  208. _snprintf_s(szCount, sizeof(szCount), "_%02d", j+1);
  209. std::string strFileName = "";
  210. strFileName += c_szHeader;
  211. strFileName += c_szImageName;
  212. strFileName += szCount;
  213. strFileName += ".sub";
  214. rGradeData.pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strFileName.c_str());
  215. }
  216. }
  217. void CPythonSkill::__RegisterNormalIconImage(TSkillData & rData, const char * c_szHeader, const char * c_szImageName)
  218. {
  219. std::string strFileName = "";
  220. strFileName += c_szHeader;
  221. strFileName += c_szImageName;
  222. strFileName += ".sub";
  223. rData.pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strFileName.c_str());
  224. for (int j = 0; j < SKILL_GRADE_COUNT; ++j)
  225. {
  226. TGradeData & rGradeData = rData.GradeData[j];
  227. rGradeData.pImage = rData.pImage;
  228. }
  229. }
  230. extern const DWORD c_iSkillIndex_Riding;
  231. bool CPythonSkill::RegisterSkillDesc(const char * c_szFileName)
  232. {
  233. const VOID* pvData;
  234. CMappedFile kFile;
  235. if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
  236. return false;
  237. CMemoryTextFileLoader textFileLoader;
  238. textFileLoader.Bind(kFile.Size(), pvData);
  239. CTokenVector TokenVector;
  240. for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
  241. {
  242. if (!textFileLoader.SplitLineByTab(i, &TokenVector))
  243. continue;
  244. if (DESC_TOKEN_TYPE_VNUM >= TokenVector.size())
  245. {
  246. TraceError("SkillDesc.line(%d).NO_VNUM_ERROR\n", i + 1);
  247. continue;
  248. }
  249. DWORD iSkillIndex = atoi(TokenVector[DESC_TOKEN_TYPE_VNUM].c_str());
  250. if (iSkillIndex == 0)
  251. {
  252. TraceError("SkillDesc.line(%d).NO_INDEX_ERROR\n", i + 1);
  253. continue;
  254. }
  255. if (DESC_TOKEN_TYPE_JOB >= TokenVector.size())
  256. {
  257. TraceError("SkillDesc.line(%d).NO_JOB_ERROR\n", i + 1);
  258. continue;
  259. }
  260. m_SkillDataMap.insert(make_pair(iSkillIndex, TSkillData()));
  261. TSkillData & rSkillData = m_SkillDataMap[iSkillIndex];
  262. // Vnum
  263. rSkillData.dwSkillIndex = iSkillIndex;
  264. // Type
  265. {
  266. std::string strJob = TokenVector[DESC_TOKEN_TYPE_JOB];
  267. stl_lowers(strJob);
  268. std::map<std::string, DWORD>::iterator it = m_SkillTypeIndexMap.find(strJob.c_str());
  269. if (m_SkillTypeIndexMap.end() == it)
  270. {
  271. TraceError("CPythonSkill::RegisterSkillDesc(dwSkillIndex=%d, strType=%s).STRANGE_SKILL_TYPE", iSkillIndex, strJob.c_str());
  272. continue;
  273. }
  274. rSkillData.byType = BYTE(it->second);
  275. }
  276. // Name
  277. {
  278. rSkillData.strName = TokenVector[DESC_TOKEN_TYPE_NAME1];
  279. rSkillData.GradeData[0].strName = TokenVector[DESC_TOKEN_TYPE_NAME1];
  280. rSkillData.GradeData[1].strName = TokenVector[DESC_TOKEN_TYPE_NAME2];
  281. rSkillData.GradeData[2].strName = TokenVector[DESC_TOKEN_TYPE_NAME3];
  282. if (rSkillData.GradeData[1].strName.empty())
  283. rSkillData.GradeData[1].strName = TokenVector[DESC_TOKEN_TYPE_NAME1];
  284. if (rSkillData.GradeData[2].strName.empty())
  285. rSkillData.GradeData[2].strName = TokenVector[DESC_TOKEN_TYPE_NAME1];
  286. }
  287. // Description
  288. {
  289. rSkillData.strDescription = TokenVector[DESC_TOKEN_TYPE_DESCRIPTION];
  290. }
  291. // Condition
  292. {
  293. rSkillData.ConditionDataVector.clear();
  294. for (int j = 0; j < CONDITION_COLUMN_COUNT; ++j)
  295. {
  296. const std::string & c_rstrCondition = TokenVector[DESC_TOKEN_TYPE_CONDITION1+j];
  297. if (!c_rstrCondition.empty())
  298. rSkillData.ConditionDataVector.push_back(c_rstrCondition);
  299. }
  300. }
  301. // Attribute
  302. {
  303. const std::string & c_rstrAttribute = TokenVector[DESC_TOKEN_TYPE_ATTRIBUTE];
  304. CTokenVector AttributeTokenVector;
  305. SplitLine(c_rstrAttribute.c_str(), &AttributeTokenVector, "|");
  306. for (CTokenVector::iterator it = AttributeTokenVector.begin(); it != AttributeTokenVector.end(); ++it)
  307. {
  308. std::string & rstrToken = *it;
  309. std::map<std::string, DWORD>::iterator it2 = m_SkillAttributeIndexMap.find(rstrToken);
  310. if (m_SkillAttributeIndexMap.end() == it2)
  311. {
  312. TraceError("CPythonSkill::RegisterSkillDesc(dwSkillIndex=%d) - Strange Skill Attribute(%s)", iSkillIndex, rstrToken.c_str());
  313. continue;
  314. }
  315. rSkillData.dwSkillAttribute |= it2->second;
  316. }
  317. }
  318. // Weapon
  319. {
  320. const std::string & c_rstrWeapon = TokenVector[DESC_TOKEN_TYPE_WEAPON];
  321. CTokenVector WeaponTokenVector;
  322. SplitLine(c_rstrWeapon.c_str(), &WeaponTokenVector, "|");
  323. for (CTokenVector::iterator it = WeaponTokenVector.begin(); it != WeaponTokenVector.end(); ++it)
  324. {
  325. std::string & rstrToken = *it;
  326. std::map<std::string, DWORD>::iterator it2 = m_SkillNeedWeaponIndexMap.find(rstrToken);
  327. if (m_SkillNeedWeaponIndexMap.end() == it2)
  328. {
  329. TraceError("CPythonSkill::RegisterSkillDesc(dwSkillIndex=%d) - Strange Skill Need Weapon(%s)", iSkillIndex, rstrToken.c_str());
  330. continue;
  331. }
  332. rSkillData.dwNeedWeapon |= it2->second;
  333. }
  334. }
  335. // Icon Name
  336. {
  337. const std::string & c_rstrJob = TokenVector[DESC_TOKEN_TYPE_JOB];
  338. const std::string & c_rstrIconName = TokenVector[DESC_TOKEN_TYPE_ICON_NAME];
  339. // NOTE : Support ½ºÅ³ÀÓ¿¡µµ 3´Ü°è¸¦ Áö¿øÇØ¾ß ÇØ¼­ ¿¹¿Ü ó¸® - [levites]
  340. if (c_iSkillIndex_Riding == iSkillIndex)
  341. {
  342. char szIconFileNameHeader[64+1];
  343. _snprintf_s(szIconFileNameHeader, sizeof(szIconFileNameHeader), "%sskill/common/support/", g_strImagePath.c_str());
  344. __RegisterGradeIconImage(rSkillData, szIconFileNameHeader, c_rstrIconName.c_str());
  345. }
  346. else if (m_PathNameMap.end() != m_PathNameMap.find(c_rstrJob))
  347. {
  348. char szIconFileNameHeader[64+1];
  349. _snprintf_s(szIconFileNameHeader, sizeof(szIconFileNameHeader), "%sskill/%s/", g_strImagePath.c_str(), m_PathNameMap[c_rstrJob].c_str());
  350. switch (rSkillData.byType)
  351. {
  352. case SKILL_TYPE_ACTIVE:
  353. {
  354. __RegisterGradeIconImage(rSkillData, szIconFileNameHeader, c_rstrIconName.c_str());
  355. break;
  356. }
  357. case SKILL_TYPE_SUPPORT:
  358. case SKILL_TYPE_GUILD:
  359. case SKILL_TYPE_HORSE:
  360. {
  361. __RegisterNormalIconImage(rSkillData, szIconFileNameHeader, c_rstrIconName.c_str());
  362. break;
  363. }
  364. }
  365. }
  366. }
  367. // Motion Index
  368. if (TokenVector.size() > DESC_TOKEN_TYPE_MOTION_INDEX)
  369. {
  370. const std::string & c_rstrMotionIndex = TokenVector[DESC_TOKEN_TYPE_MOTION_INDEX];
  371. if (c_rstrMotionIndex.empty())
  372. {
  373. rSkillData.bNoMotion = TRUE;
  374. rSkillData.wMotionIndex = 0;
  375. }
  376. else
  377. {
  378. rSkillData.bNoMotion = FALSE;
  379. rSkillData.wMotionIndex = (WORD)atoi(c_rstrMotionIndex.c_str());
  380. }
  381. }
  382. else
  383. {
  384. rSkillData.wMotionIndex = 0;
  385. }
  386. if (TokenVector.size() > DESC_TOKEN_TYPE_TARGET_COUNT_FORMULA)
  387. rSkillData.strTargetCountFormula = TokenVector[DESC_TOKEN_TYPE_TARGET_COUNT_FORMULA].c_str();
  388. if (TokenVector.size() > DESC_TOKEN_TYPE_MOTION_LOOP_COUNT_FORMULA)
  389. rSkillData.strMotionLoopCountFormula = TokenVector[DESC_TOKEN_TYPE_MOTION_LOOP_COUNT_FORMULA].c_str();
  390. rSkillData.AffectDataNewVector.clear();
  391. rSkillData.AffectDataNewVector.reserve(3);
  392. // Affect
  393. for (int j = 0; j < AFFECT_COLUMN_COUNT; ++j)
  394. {
  395. int iDescriptionSlotIndex = DESC_TOKEN_TYPE_AFFECT_DESCRIPTION_1 + j*AFFECT_STEP_COUNT;
  396. int iMinSlotIndex = DESC_TOKEN_TYPE_AFFECT_MIN_1 + j*AFFECT_STEP_COUNT;
  397. int iMaxSlotIndex = DESC_TOKEN_TYPE_AFFECT_MAX_1 + j*AFFECT_STEP_COUNT;
  398. if (TokenVector.size() > iDescriptionSlotIndex)
  399. if (!TokenVector[iDescriptionSlotIndex].empty())
  400. {
  401. rSkillData.AffectDataVector.push_back(TAffectData());
  402. TAffectData & rAffectData = *rSkillData.AffectDataVector.rbegin();
  403. rAffectData.strAffectDescription = "";
  404. rAffectData.strAffectMinFormula = "";
  405. rAffectData.strAffectMaxFormula = "";
  406. rAffectData.strAffectDescription = TokenVector[iDescriptionSlotIndex];
  407. if (TokenVector.size() > iMinSlotIndex)
  408. if (!TokenVector[iMinSlotIndex].empty())
  409. rAffectData.strAffectMinFormula = TokenVector[iMinSlotIndex];
  410. if (TokenVector.size() > iMaxSlotIndex)
  411. if (!TokenVector[iMaxSlotIndex].empty())
  412. rAffectData.strAffectMaxFormula = TokenVector[iMaxSlotIndex];
  413. }
  414. }
  415. if (TokenVector.size() > DESC_TOKEN_TYPE_MOTION_INDEX_GRADE_NUM)
  416. {
  417. int numGrade = atoi(TokenVector[DESC_TOKEN_TYPE_MOTION_INDEX_GRADE_NUM].c_str());
  418. if (SKILL_EFFECT_COUNT < numGrade)
  419. {
  420. TraceError("%s[%s] °¡ µî±Ş Á¦ÇÑ[%d]À» ³Ñ¾î°¬½À´Ï´Ù.",rSkillData.strName.c_str(), TokenVector[DESC_TOKEN_TYPE_MOTION_INDEX_GRADE_NUM].c_str(), SKILL_EFFECT_COUNT);
  421. return false;
  422. }
  423. for (int iGrade = 0; iGrade < numGrade; iGrade++)
  424. {
  425. //if (iGrade == SKILL_GRADE_COUNT)
  426. // rSkillData.GradeData[iGrade] = rSkillData.GradeData[iGrade-1];
  427. rSkillData.GradeData[iGrade].wMotionIndex = rSkillData.wMotionIndex+iGrade*SKILL_GRADEGAP;
  428. }
  429. for(int iSpace = numGrade; iSpace < SKILL_EFFECT_COUNT; iSpace++)
  430. {
  431. rSkillData.GradeData[iSpace].wMotionIndex = rSkillData.wMotionIndex;
  432. }
  433. }
  434. if (TokenVector.size() > DESC_TOKEN_TYPE_LEVEL_LIMIT)
  435. {
  436. const std::string & c_rstrLevelLimit = TokenVector[DESC_TOKEN_TYPE_LEVEL_LIMIT];
  437. if (c_rstrLevelLimit.empty())
  438. rSkillData.byLevelLimit = 0;
  439. else
  440. rSkillData.byLevelLimit = (WORD)atoi(c_rstrLevelLimit.c_str());
  441. }
  442. if (TokenVector.size() > DESC_TOKEN_TYPE_MAX_LEVEL)
  443. {
  444. const std::string & c_rstrMaxLevel = TokenVector[DESC_TOKEN_TYPE_MAX_LEVEL];
  445. const DWORD LevelLimitEmpty = 1;
  446. if (c_rstrMaxLevel.empty())
  447. {
  448. if(rSkillData.byLevelLimit > LevelLimitEmpty)
  449. rSkillData.byMaxLevel = rSkillData.byLevelLimit;
  450. else
  451. rSkillData.byMaxLevel = 20;
  452. }
  453. else
  454. rSkillData.byMaxLevel = (BYTE)atoi(c_rstrMaxLevel.c_str());
  455. }
  456. }
  457. return true;
  458. }
  459. void CPythonSkill::Destroy()
  460. {
  461. m_SkillDataMap.clear();
  462. }
  463. bool CPythonSkill::RegisterSkill(DWORD dwSkillIndex, const char * c_szFileName)
  464. {
  465. CTextFileLoader TextFileLoader;
  466. if (!TextFileLoader.Load(c_szFileName))
  467. {
  468. TraceError("CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s) - Failed to find file", dwSkillIndex, c_szFileName);
  469. return false;
  470. }
  471. TextFileLoader.SetTop();
  472. TSkillData SkillData;
  473. SkillData.dwSkillIndex = dwSkillIndex;
  474. std::string strTypeName;
  475. if (TextFileLoader.GetTokenString("type", &strTypeName))
  476. {
  477. stl_lowers(strTypeName);
  478. std::map<std::string, DWORD>::iterator it = m_SkillTypeIndexMap.find(strTypeName.c_str());
  479. if (m_SkillTypeIndexMap.end() == it)
  480. {
  481. TraceError("Strange Skill Type - CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s)", dwSkillIndex, c_szFileName);
  482. return false;
  483. }
  484. SkillData.byType = (BYTE)it->second;
  485. }
  486. else
  487. {
  488. TraceError("CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s) - Failed to find key [type]", dwSkillIndex, c_szFileName);
  489. return false;
  490. }
  491. CTokenVector * pAttributeTokenVector;
  492. if (TextFileLoader.GetTokenVector("attribute", &pAttributeTokenVector))
  493. {
  494. for (CTokenVector::iterator it = pAttributeTokenVector->begin(); it != pAttributeTokenVector->end(); ++it)
  495. {
  496. std::string & rstrToken = *it;
  497. std::map<std::string, DWORD>::iterator it2 = m_SkillAttributeIndexMap.find(rstrToken.c_str());
  498. if (m_SkillAttributeIndexMap.end() == it2)
  499. {
  500. TraceError("Strange Skill Attribute - CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s)", dwSkillIndex, c_szFileName);
  501. continue;
  502. }
  503. SkillData.dwSkillAttribute |= it2->second;
  504. }
  505. }
  506. CTokenVector * pNeedWeaponVector;
  507. if (TextFileLoader.GetTokenVector("needweapon", &pNeedWeaponVector))
  508. {
  509. for (CTokenVector::iterator it = pNeedWeaponVector->begin(); it != pNeedWeaponVector->end(); ++it)
  510. {
  511. std::string & rstrToken = *it;
  512. std::map<std::string, DWORD>::iterator it2 = m_SkillNeedWeaponIndexMap.find(rstrToken.c_str());
  513. if (m_SkillNeedWeaponIndexMap.end() == it2)
  514. {
  515. TraceError("Strange Skill Need Weapon - CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s)", dwSkillIndex, c_szFileName);
  516. continue;
  517. }
  518. SkillData.dwNeedWeapon |= it2->second;
  519. }
  520. }
  521. {
  522. char szName[256];
  523. snprintf_s(szName, "%dname", LocaleService_GetCodePage());
  524. if (!TextFileLoader.GetTokenString(szName, &SkillData.strName))
  525. if (!TextFileLoader.GetTokenString("name", &SkillData.strName))
  526. {
  527. TraceError("CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s) - Failed to find [%s]", dwSkillIndex, c_szFileName, szName);
  528. return false;
  529. }
  530. }
  531. {
  532. char szName[256];
  533. snprintf_s(szName, "%ddescription", LocaleService_GetCodePage());
  534. if (!TextFileLoader.GetTokenString(szName, &SkillData.strDescription))
  535. TextFileLoader.GetTokenString("description", &SkillData.strDescription);
  536. }
  537. if (!TextFileLoader.GetTokenString("iconfilename", &SkillData.strIconFileName))
  538. {
  539. TraceError("CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s) - Failed to find [iconfilename]", dwSkillIndex, c_szFileName);
  540. return false;
  541. }
  542. {
  543. CTokenVector * pConditionDataVector;
  544. char szConditionData[256];
  545. snprintf_s(szConditionData, "%dconditiondata", LocaleService_GetCodePage());
  546. bool isConditionData=true;
  547. if (!TextFileLoader.GetTokenVector(szConditionData, &pConditionDataVector))
  548. if (!TextFileLoader.GetTokenVector("conditiondata", &pConditionDataVector))
  549. isConditionData=false;
  550. if (isConditionData)
  551. {
  552. DWORD dwSize = pConditionDataVector->size();
  553. SkillData.ConditionDataVector.clear();
  554. SkillData.ConditionDataVector.resize(dwSize);
  555. for (DWORD i = 0; i < dwSize; ++i)
  556. {
  557. SkillData.ConditionDataVector[i] = pConditionDataVector->at(i);
  558. }
  559. }
  560. }
  561. {
  562. CTokenVector * pAffectDataVector;
  563. char szAffectData[256];
  564. snprintf_s(szAffectData, "%daffectdata", LocaleService_GetCodePage());
  565. bool isAffectData=true;
  566. if (!TextFileLoader.GetTokenVector(szAffectData, &pAffectDataVector))
  567. if (!TextFileLoader.GetTokenVector("affectdata", &pAffectDataVector))
  568. isAffectData=false;
  569. if (isAffectData)
  570. {
  571. DWORD dwSize = pAffectDataVector->size()/3;
  572. SkillData.AffectDataVector.clear();
  573. SkillData.AffectDataVector.resize(dwSize);
  574. for (DWORD i = 0; i < dwSize; ++i)
  575. {
  576. SkillData.AffectDataVector[i].strAffectDescription = pAffectDataVector->at(i*3+0);
  577. SkillData.AffectDataVector[i].strAffectMinFormula = pAffectDataVector->at(i*3+1);
  578. SkillData.AffectDataVector[i].strAffectMaxFormula = pAffectDataVector->at(i*3+2);
  579. }
  580. }
  581. }
  582. {
  583. CTokenVector * pGradeDataVector;
  584. char szGradeData[256];
  585. snprintf_s(szGradeData, "%dgradedata", LocaleService_GetCodePage());
  586. if (TextFileLoader.GetTokenVector(szGradeData, &pGradeDataVector))
  587. {
  588. if (SKILL_GRADE_COUNT*2 != pGradeDataVector->size())
  589. TraceError("CPythonSkill::RegisterSkill(dwSkillIndex=%d, c_szFileName=%s) - Strange Grade Data Count", dwSkillIndex, c_szFileName);
  590. for (DWORD i = 0; i < min(SKILL_GRADE_COUNT, pGradeDataVector->size()/2); ++i)
  591. {
  592. SkillData.GradeData[i].strName = pGradeDataVector->at(i*2+0);
  593. std::string strIconFileName = g_strImagePath + pGradeDataVector->at(i*2+1);
  594. SkillData.GradeData[i].pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str());
  595. }
  596. }
  597. }
  598. TextFileLoader.GetTokenString("cooltimeformula", &SkillData.strCoolTimeFormula);
  599. TextFileLoader.GetTokenString("targetcountformula", &SkillData.strTargetCountFormula);
  600. TextFileLoader.GetTokenString("motionloopcountformula", &SkillData.strMotionLoopCountFormula);
  601. TextFileLoader.GetTokenString("needspformula", &SkillData.strNeedSPFormula);
  602. TextFileLoader.GetTokenString("continuationspformula", &SkillData.strContinuationSPFormula);
  603. TextFileLoader.GetTokenDoubleWord("range", &SkillData.dwTargetRange);
  604. TextFileLoader.GetTokenByte("maxlevel", &SkillData.byMaxLevel);
  605. TextFileLoader.GetTokenByte("leveluppoint", &SkillData.byLevelUpPoint);
  606. WORD wMotionIndex;
  607. if (TextFileLoader.GetTokenWord("motionindex", &wMotionIndex))
  608. {
  609. SkillData.wMotionIndex = wMotionIndex;
  610. }
  611. else
  612. {
  613. SkillData.wMotionIndex = 0;
  614. }
  615. WORD wMotionIndexForMe;
  616. if (TextFileLoader.GetTokenWord("motionindexforme", &wMotionIndexForMe))
  617. {
  618. SkillData.wMotionIndexForMe = wMotionIndexForMe;
  619. }
  620. else
  621. {
  622. SkillData.wMotionIndexForMe = 0;
  623. }
  624. SkillData.strIconFileName = g_strImagePath + SkillData.strIconFileName;
  625. SkillData.pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(SkillData.strIconFileName.c_str());
  626. m_SkillDataMap.insert(TSkillDataMap::value_type(dwSkillIndex, SkillData));
  627. /////
  628. if (SkillData.IsTimeIncreaseSkill())
  629. {
  630. CPythonSkill::SSkillData::ms_dwTimeIncreaseSkillNumber = SkillData.dwSkillIndex;
  631. }
  632. return true;
  633. }
  634. BOOL CPythonSkill::GetSkillData(DWORD dwSkillIndex, TSkillData ** ppSkillData)
  635. {
  636. TSkillDataMap::iterator it = m_SkillDataMap.find(dwSkillIndex);
  637. if (m_SkillDataMap.end() == it)
  638. return FALSE;
  639. *ppSkillData = &(it->second);
  640. return TRUE;
  641. }
  642. bool CPythonSkill::GetSkillDataByName(const char * c_szName, TSkillData ** ppSkillData)
  643. {
  644. TSkillDataMap::iterator itor = m_SkillDataMap.begin();
  645. for (; itor != m_SkillDataMap.end(); ++itor)
  646. {
  647. TSkillData * pData = &(itor->second);
  648. if (0 == pData->strName.compare(c_szName))
  649. {
  650. *ppSkillData = &(itor->second);
  651. return true;
  652. }
  653. }
  654. return false;
  655. }
  656. void CPythonSkill::SetPathName(const char * c_szFileName)
  657. {
  658. m_strPathName = c_szFileName;
  659. }
  660. const char * CPythonSkill::GetPathName()
  661. {
  662. return m_strPathName.c_str();
  663. }
  664. void CPythonSkill::TEST()
  665. {
  666. BOOL isFirst;
  667. std::map<std::string, DWORD>::iterator itorSub;
  668. FILE * File = fopen("test.txt", "w");
  669. for (TSkillDataMap::iterator itor = m_SkillDataMap.begin(); itor != m_SkillDataMap.end(); ++itor)
  670. {
  671. TSkillData & rSkillData = itor->second;
  672. std::string strLine = "";
  673. strLine += rSkillData.strName.c_str();
  674. strLine += "\t";
  675. // Name2
  676. strLine += "\t";
  677. // Name3
  678. strLine += "\t";
  679. strLine += rSkillData.strDescription;
  680. strLine += "\t";
  681. if (rSkillData.ConditionDataVector.size() > 0)
  682. strLine += rSkillData.ConditionDataVector[0];
  683. strLine += "\t";
  684. if (rSkillData.ConditionDataVector.size() > 1)
  685. strLine += rSkillData.ConditionDataVector[1];
  686. strLine += "\t";
  687. if (rSkillData.ConditionDataVector.size() > 2)
  688. strLine += rSkillData.ConditionDataVector[2];
  689. strLine += "\t";
  690. if (rSkillData.ConditionDataVector.size() > 3)
  691. strLine += rSkillData.ConditionDataVector[3];
  692. strLine += "\t";
  693. isFirst = TRUE;
  694. for (itorSub = m_SkillAttributeIndexMap.begin(); itorSub != m_SkillAttributeIndexMap.end(); ++itorSub)
  695. {
  696. if (itorSub->second & rSkillData.dwSkillAttribute)
  697. {
  698. if (isFirst)
  699. {
  700. isFirst = FALSE;
  701. }
  702. else
  703. {
  704. strLine += "|";
  705. }
  706. strLine += itorSub->first.c_str();
  707. }
  708. }
  709. strLine += "\t";
  710. isFirst = TRUE;
  711. for (itorSub = m_SkillNeedWeaponIndexMap.begin(); itorSub != m_SkillNeedWeaponIndexMap.end(); ++itorSub)
  712. {
  713. if (itorSub->second & rSkillData.dwNeedWeapon)
  714. {
  715. if (isFirst)
  716. {
  717. isFirst = FALSE;
  718. }
  719. else
  720. {
  721. strLine += "|";
  722. }
  723. strLine += itorSub->first.c_str();
  724. }
  725. }
  726. strLine += "\t";
  727. std::string strFileName = rSkillData.strIconFileName;
  728. int iPos = strFileName.find_last_of("/", rSkillData.strIconFileName.length());
  729. if (iPos > 0)
  730. strFileName = strFileName.substr(iPos+1, strFileName.length() - iPos - 4 - 1);
  731. strLine += strFileName;
  732. strLine += "\t";
  733. char szMotionIndex[32+1];
  734. _snprintf_s(szMotionIndex, sizeof(szMotionIndex), "%d", rSkillData.wMotionIndex);
  735. strLine += szMotionIndex;
  736. strLine += "\t";
  737. if (rSkillData.wMotionIndexForMe > 1)
  738. {
  739. char szMotionIndexForMe[32+1];
  740. _snprintf_s(szMotionIndexForMe, sizeof(szMotionIndexForMe), "%d", rSkillData.wMotionIndexForMe);
  741. strLine += szMotionIndexForMe;
  742. }
  743. assert(rSkillData.AffectDataVector.size() <= 3);
  744. strLine += "\t";
  745. if (rSkillData.AffectDataVector.size() > 0)
  746. {
  747. strLine += rSkillData.AffectDataVector[0].strAffectDescription;
  748. strLine += "\t";
  749. strLine += rSkillData.AffectDataVector[0].strAffectMinFormula;
  750. strLine += "\t";
  751. strLine += rSkillData.AffectDataVector[0].strAffectMaxFormula;
  752. }
  753. strLine += "\t";
  754. if (rSkillData.AffectDataVector.size() > 1)
  755. {
  756. strLine += rSkillData.AffectDataVector[1].strAffectDescription;
  757. strLine += "\t";
  758. strLine += rSkillData.AffectDataVector[1].strAffectMinFormula;
  759. strLine += "\t";
  760. strLine += rSkillData.AffectDataVector[1].strAffectMaxFormula;
  761. }
  762. strLine += "\t";
  763. if (rSkillData.AffectDataVector.size() > 2)
  764. {
  765. strLine += rSkillData.AffectDataVector[2].strAffectDescription;
  766. strLine += "\t";
  767. strLine += rSkillData.AffectDataVector[2].strAffectMinFormula;
  768. strLine += "\t";
  769. strLine += rSkillData.AffectDataVector[2].strAffectMaxFormula;
  770. }
  771. fprintf(File, "%s\n", strLine.c_str());
  772. }
  773. fclose(File);
  774. }
  775. CPythonSkill::CPythonSkill()
  776. {
  777. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("none", SKILL_TYPE_NONE));
  778. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("active", SKILL_TYPE_ACTIVE));
  779. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("support", SKILL_TYPE_SUPPORT));
  780. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("guild", SKILL_TYPE_GUILD));
  781. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("horse", SKILL_TYPE_HORSE));
  782. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("warrior", SKILL_TYPE_ACTIVE));
  783. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("assassin", SKILL_TYPE_ACTIVE));
  784. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("sura", SKILL_TYPE_ACTIVE));
  785. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("shaman", SKILL_TYPE_ACTIVE));
  786. m_SkillTypeIndexMap.insert(std::map<std::string, DWORD>::value_type("passive", SKILL_TYPE_ACTIVE));
  787. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("NEED_POISON_BOTTLE", SKILL_ATTRIBUTE_NEED_POISON_BOTTLE));
  788. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("NEED_EMPTY_BOTTLE", SKILL_ATTRIBUTE_NEED_EMPTY_BOTTLE));
  789. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CAN_USE_IF_NOT_ENOUGH", SKILL_ATTRIBUTE_CAN_USE_IF_NOT_ENOUGH));
  790. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("FAN_RANGE", SKILL_ATTRIBUTE_FAN_RANGE));
  791. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("NEED_CORPSE", SKILL_ATTRIBUTE_NEED_CORPSE));
  792. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("NEED_TARGET", SKILL_ATTRIBUTE_NEED_TARGET));
  793. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("TOGGLE", SKILL_ATTRIBUTE_TOGGLE));
  794. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("WEAPON_LIMITATION", SKILL_ATTRIBUTE_WEAPON_LIMITATION));
  795. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("MELEE_ATTACK", SKILL_ATTRIBUTE_MELEE_ATTACK));
  796. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CHARGE_ATTACK", SKILL_ATTRIBUTE_CHARGE_ATTACK));
  797. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("USE_HP", SKILL_ATTRIBUTE_USE_HP));
  798. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CAN_CHANGE_DIRECTION", SKILL_ATTRIBUTE_CAN_CHANGE_DIRECTION));
  799. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("STANDING_SKILL", SKILL_ATTRIBUTE_STANDING_SKILL));
  800. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("ONLY_FOR_ALLIANCE", SKILL_ATTRIBUTE_ONLY_FOR_ALLIANCE));
  801. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CAN_USE_FOR_ME", SKILL_ATTRIBUTE_CAN_USE_FOR_ME));
  802. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("ATTACK_SKILL", SKILL_ATTRIBUTE_ATTACK_SKILL));
  803. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("MOVING_SKILL", SKILL_ATTRIBUTE_MOVING_SKILL));
  804. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("HORSE_SKILL", SKILL_ATTRIBUTE_HORSE_SKILL));
  805. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("TIME_INCREASE_SKILL", SKILL_ATTRIBUTE_TIME_INCREASE_SKILL));
  806. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("PASSIVE", SKILL_ATTRIBUTE_PASSIVE));
  807. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CANNOT_LEVEL_UP", SKILL_ATTRIBUTE_CANNOT_LEVEL_UP));
  808. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("ONLY_FOR_GUILD_WAR", SKILL_ATTRIBUTE_ONLY_FOR_GUILD_WAR));
  809. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("CIRCLE_RANGE", SKILL_ATTRIBUTE_CIRCLE_RANGE));
  810. m_SkillAttributeIndexMap.insert(std::map<std::string, DWORD>::value_type("SEARCH_TARGET", SKILL_ATTRIBUTE_SEARCH_TARGET));
  811. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("SWORD", SKILL_NEED_WEAPON_SWORD));
  812. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("DAGGER", SKILL_NEED_WEAPON_DAGGER));
  813. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("BOW", SKILL_NEED_WEAPON_BOW));
  814. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("TWO_HANDED", SKILL_NEED_WEAPON_TWO_HANDED));
  815. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("DOUBLE_SWORD", SKILL_NEED_WEAPON_DOUBLE_SWORD));
  816. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("BELL", SKILL_NEED_WEAPON_BELL));
  817. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("FAN", SKILL_NEED_WEAPON_FAN));
  818. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("ARROW", SKILL_NEED_WEAPON_ARROW));
  819. m_SkillNeedWeaponIndexMap.insert(std::map<std::string, DWORD>::value_type("EMPTY_HAND", SKILL_NEED_WEAPON_EMPTY_HAND));
  820. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("SWORD"), CItemData::WEAPON_SWORD));
  821. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("DAGGER"), CItemData::WEAPON_DAGGER));
  822. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("BOW"), CItemData::WEAPON_BOW));
  823. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("TWO_HANDED"), CItemData::WEAPON_TWO_HANDED));
  824. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("DOUBLE_SWORD"), CItemData::WEAPON_DAGGER));
  825. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("BELL"), CItemData::WEAPON_BELL));
  826. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("FAN"), CItemData::WEAPON_FAN));
  827. m_SkillWeaponTypeIndexMap.insert(make_pair(std::string("ARROW"), CItemData::WEAPON_ARROW));
  828. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("chain"), POINT_NONE));
  829. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("HR"), POINT_HIT_RATE));
  830. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("LV"), POINT_LEVEL));
  831. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("Level"), POINT_LEVEL));
  832. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxHP"), POINT_MAX_HP));
  833. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxSP"), POINT_MAX_SP));
  834. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinMWEP"), POINT_MIN_WEP));
  835. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxMWEP"), POINT_MAX_WEP));
  836. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinWEP"), POINT_MIN_WEP));
  837. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxWEP"), POINT_MAX_WEP));
  838. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MinATK"), POINT_MIN_ATK));
  839. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MaxATK"), POINT_MAX_ATK));
  840. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ATKSPD"), POINT_ATT_SPEED));
  841. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AttackPower"), POINT_MIN_ATK));
  842. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMin"), POINT_MIN_ATK));
  843. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("AtkMax"), POINT_MAX_ATK));
  844. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DefencePower"), POINT_DEF_GRADE));
  845. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEF"), POINT_DEF_GRADE));
  846. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MWEP"), POINT_MAGIC_ATT_GRADE));
  847. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("MagicAttackPower"), POINT_MAGIC_ATT_GRADE));
  848. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("INT"), POINT_IQ));
  849. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("STR"), POINT_ST));
  850. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("DEX"), POINT_DX));
  851. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("CON"), POINT_HT));
  852. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minatk"), POINT_MIN_ATK));
  853. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxatk"), POINT_MAX_ATK));
  854. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmtk"), POINT_MIN_WEP));
  855. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmtk"), POINT_MAX_WEP));
  856. // GUILD_SKILL_DISPLAY_BUG_FIX
  857. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxhp"), POINT_MAX_HP));
  858. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxsp"), POINT_MAX_SP));
  859. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("odef"), POINT_DEF_GRADE));
  860. // END_OF_GUILD_SKILL_DISPLAY_BUG_FIX
  861. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minwep"), POINT_MIN_WEP));
  862. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxwep"), POINT_MAX_WEP));
  863. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("minmwep"), POINT_MIN_MAGIC_WEP));
  864. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("maxmwep"), POINT_MAX_MAGIC_WEP));
  865. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
  866. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
  867. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
  868. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
  869. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
  870. SSkillData::ms_StatusNameMap.insert(make_pair(std::string("con"), POINT_HT));
  871. /////
  872. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("atk"), POINT_MIN_ATK));
  873. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MIN_WEP));
  874. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MIN_WEP));
  875. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
  876. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
  877. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
  878. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
  879. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
  880. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));
  881. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("atk"), POINT_MAX_ATK));
  882. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("mtk"), POINT_MAX_WEP));
  883. SSkillData::ms_NewMinStatusNameMap.insert(make_pair(std::string("wep"), POINT_MAX_WEP));
  884. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("lv"), POINT_LEVEL));
  885. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("ar"), POINT_HIT_RATE));
  886. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("iq"), POINT_IQ));
  887. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("str"), POINT_ST));
  888. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("dex"), POINT_DX));
  889. SSkillData::ms_NewMaxStatusNameMap.insert(make_pair(std::string("con"), POINT_HT));
  890. m_PathNameMap.insert(make_pair(std::string("WARRIOR"), std::string("warrior")));
  891. m_PathNameMap.insert(make_pair(std::string("ASSASSIN"), std::string("assassin")));
  892. m_PathNameMap.insert(make_pair(std::string("SURA"), std::string("sura")));
  893. m_PathNameMap.insert(make_pair(std::string("SHAMAN"), std::string("shaman")));
  894. m_PathNameMap.insert(make_pair(std::string("PASSIVE"), std::string("passive")));
  895. m_PathNameMap.insert(make_pair(std::string("SUPPORT"), std::string("common/support")));
  896. m_PathNameMap.insert(make_pair(std::string("GUILD"), std::string("common/guild")));
  897. m_PathNameMap.insert(make_pair(std::string("HORSE"), std::string("common/horse")));
  898. }
  899. CPythonSkill::~CPythonSkill()
  900. {
  901. }
  902. ///////////////////////////////////////////////////////////////////////////////////////////////////
  903. ///////////////////////////////////////////////////////////////////////////////////////////////////
  904. ///////////////////////////////////////////////////////////////////////////////////////////////////
  905. DWORD CPythonSkill::SSkillData::MELEE_SKILL_TARGET_RANGE=170;
  906. const std::string CPythonSkill::SSkillData::GetName() const
  907. {
  908. return strName;
  909. }
  910. BYTE CPythonSkill::SSkillData::GetType() const
  911. {
  912. return byType;
  913. }
  914. BOOL CPythonSkill::SSkillData::IsMeleeSkill()
  915. {
  916. if (dwSkillAttribute & SKILL_ATTRIBUTE_MELEE_ATTACK)
  917. return TRUE;
  918. return FALSE;
  919. }
  920. BOOL CPythonSkill::SSkillData::IsChargeSkill()
  921. {
  922. if (dwSkillAttribute & SKILL_ATTRIBUTE_CHARGE_ATTACK)
  923. return TRUE;
  924. return FALSE;
  925. }
  926. BOOL CPythonSkill::SSkillData::IsOnlyForGuildWar()
  927. {
  928. if (dwSkillAttribute & SKILL_ATTRIBUTE_ONLY_FOR_GUILD_WAR)
  929. return TRUE;
  930. return FALSE;
  931. }
  932. DWORD CPythonSkill::SSkillData::GetTargetRange() const
  933. {
  934. if (dwSkillAttribute & SKILL_ATTRIBUTE_MELEE_ATTACK)
  935. return MELEE_SKILL_TARGET_RANGE;
  936. if (dwSkillAttribute & SKILL_ATTRIBUTE_CHARGE_ATTACK)
  937. return MELEE_SKILL_TARGET_RANGE;
  938. return dwTargetRange;
  939. }
  940. BOOL CPythonSkill::SSkillData::CanChangeDirection()
  941. {
  942. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_CAN_CHANGE_DIRECTION);
  943. }
  944. BOOL CPythonSkill::SSkillData::IsFanRange()
  945. {
  946. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_FAN_RANGE);
  947. }
  948. BOOL CPythonSkill::SSkillData::IsCircleRange()
  949. {
  950. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_CIRCLE_RANGE);
  951. }
  952. BOOL CPythonSkill::SSkillData::IsAutoSearchTarget()
  953. {
  954. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_SEARCH_TARGET);
  955. }
  956. BOOL CPythonSkill::SSkillData::IsNeedCorpse()
  957. {
  958. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_NEED_CORPSE);
  959. }
  960. BOOL CPythonSkill::SSkillData::IsNeedTarget()
  961. {
  962. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_NEED_TARGET);
  963. }
  964. BOOL CPythonSkill::SSkillData::IsToggleSkill()
  965. {
  966. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_TOGGLE);
  967. }
  968. BOOL CPythonSkill::SSkillData::IsUseHPSkill()
  969. {
  970. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_USE_HP);
  971. }
  972. BOOL CPythonSkill::SSkillData::IsStandingSkill()
  973. {
  974. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_STANDING_SKILL);
  975. }
  976. BOOL CPythonSkill::SSkillData::CanUseWeaponType(DWORD dwWeaponType)
  977. {
  978. if (!(dwSkillAttribute & SKILL_ATTRIBUTE_WEAPON_LIMITATION))
  979. return TRUE;
  980. return 0 != (dwNeedWeapon & (1 << dwWeaponType));
  981. }
  982. BOOL CPythonSkill::SSkillData::IsOnlyForAlliance()
  983. {
  984. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_ONLY_FOR_ALLIANCE);
  985. }
  986. BOOL CPythonSkill::SSkillData::CanUseForMe()
  987. {
  988. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_CAN_USE_FOR_ME);
  989. }
  990. BOOL CPythonSkill::SSkillData::CanUseIfNotEnough()
  991. {
  992. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_CAN_USE_IF_NOT_ENOUGH);
  993. }
  994. BOOL CPythonSkill::SSkillData::IsNeedEmptyBottle()
  995. {
  996. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_NEED_EMPTY_BOTTLE);
  997. }
  998. BOOL CPythonSkill::SSkillData::IsNeedPoisonBottle()
  999. {
  1000. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_NEED_POISON_BOTTLE);
  1001. }
  1002. BOOL CPythonSkill::SSkillData::IsNeedBow()
  1003. {
  1004. if (!(dwSkillAttribute & SKILL_ATTRIBUTE_WEAPON_LIMITATION))
  1005. return FALSE;
  1006. return 0 != (dwNeedWeapon & SKILL_NEED_WEAPON_BOW);
  1007. }
  1008. BOOL CPythonSkill::SSkillData::IsHorseSkill()
  1009. {
  1010. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_HORSE_SKILL);
  1011. }
  1012. BOOL CPythonSkill::SSkillData::IsMovingSkill()
  1013. {
  1014. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_MOVING_SKILL);
  1015. }
  1016. BOOL CPythonSkill::SSkillData::IsAttackSkill()
  1017. {
  1018. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_ATTACK_SKILL);
  1019. }
  1020. BOOL CPythonSkill::SSkillData::IsTimeIncreaseSkill()
  1021. {
  1022. return 0 != (dwSkillAttribute & SKILL_ATTRIBUTE_TIME_INCREASE_SKILL);
  1023. }
  1024. bool CPythonSkill::SSkillData::GetState(const char * c_szStateName, int * piState, int iMinMaxType)
  1025. {
  1026. std::map<std::string, DWORD> * pStatusNameMap = NULL;
  1027. switch (iMinMaxType)
  1028. {
  1029. case VALUE_TYPE_FREE:
  1030. pStatusNameMap = &ms_StatusNameMap;
  1031. break;
  1032. case VALUE_TYPE_MIN:
  1033. pStatusNameMap = &ms_NewMinStatusNameMap;
  1034. break;
  1035. case VALUE_TYPE_MAX:
  1036. pStatusNameMap = &ms_NewMaxStatusNameMap;
  1037. break;
  1038. default:
  1039. return false;
  1040. break;
  1041. }
  1042. std::map<std::string, DWORD>::iterator it = pStatusNameMap->find(c_szStateName);
  1043. if (it != pStatusNameMap->end())
  1044. {
  1045. *piState = CPythonPlayer::Instance().GetStatus(it->second);
  1046. }
  1047. else if (0 == strncmp(c_szStateName, "JeungJi", 7))
  1048. {
  1049. *piState = 0;
  1050. // ÁõÁö¼ú Àӽà Á¦¿Ü
  1051. /*
  1052. if (0 != ms_dwTimeIncreaseSkillNumber)
  1053. {
  1054. DWORD dwSkillSlotIndex;
  1055. if (!CPythonPlayer::Instance().FindSkillSlotIndexBySkillIndex(ms_dwTimeIncreaseSkillNumber, &dwSkillSlotIndex))
  1056. return false;
  1057. *piState = CPythonPlayer::Instance().GetSkillLevel(dwSkillSlotIndex);
  1058. }
  1059. */
  1060. }
  1061. return true;
  1062. }
  1063. float CPythonSkill::SSkillData::ProcessFormula(CPoly * pPoly, float fSkillLevel, int iMinMaxType)
  1064. {
  1065. if (pPoly->Analyze())
  1066. {
  1067. for (DWORD i = 0; i < pPoly->GetVarCount(); ++i)
  1068. {
  1069. const char * c_szVarName = pPoly->GetVarName(i);
  1070. float fState;
  1071. if (!strcmp("SkillPoint", c_szVarName) || !strcmp("k", c_szVarName))
  1072. {
  1073. fState = fSkillLevel;
  1074. }
  1075. else
  1076. {
  1077. int iState;
  1078. if (!GetState(c_szVarName, &iState, iMinMaxType))
  1079. return 0.0f;
  1080. fState = float(iState);
  1081. if (!strcmp("ar", c_szVarName))
  1082. fState /= 100.0f;
  1083. }
  1084. pPoly->SetVar(c_szVarName, fState);
  1085. }
  1086. }
  1087. else
  1088. {
  1089. TraceError("skillGetAffect - Strange Formula [%s]", strName.c_str());
  1090. return 0.0f;
  1091. }
  1092. return pPoly->Eval();
  1093. }
  1094. const char * CPythonSkill::SSkillData::GetAffectDescription(DWORD dwIndex, float fSkillLevel)
  1095. {
  1096. if (dwIndex >= AffectDataVector.size())
  1097. return NULL;
  1098. const std::string & c_rstrAffectDescription = AffectDataVector[dwIndex].strAffectDescription;
  1099. const std::string & c_rstrAffectMinFormula = AffectDataVector[dwIndex].strAffectMinFormula;
  1100. const std::string & c_rstrAffectMaxFormula = AffectDataVector[dwIndex].strAffectMaxFormula;
  1101. CPoly minPoly;
  1102. CPoly maxPoly;
  1103. minPoly.SetStr(c_rstrAffectMinFormula.c_str());
  1104. maxPoly.SetStr(c_rstrAffectMaxFormula.c_str());
  1105. // OVERWRITE_SKILLPROTO_POLY
  1106. float fMinValue = ProcessFormula(&minPoly, fSkillLevel);
  1107. float fMaxValue = ProcessFormula(&maxPoly, fSkillLevel);
  1108. if (fMinValue < 0.0)
  1109. fMinValue = - fMinValue;
  1110. if (fMaxValue < 0.0)
  1111. fMaxValue = - fMaxValue;
  1112. if (CP_ARABIC == ::GetDefaultCodePage())
  1113. {
  1114. // #0000870: [M2AE] Çѱ¹¾î ¸ğµåÀ϶§ ƯÁ¤ ¾Æ¶ø¾î ¹®Àå¿¡¼­ Å©·¡½¬ ¹ß»ı
  1115. static std::string strDescription;
  1116. strDescription = c_rstrAffectDescription;
  1117. int first = strDescription.find("%.0f");
  1118. if (first >= 0)
  1119. {
  1120. fMinValue = floorf(fMinValue);
  1121. char szMinValue[256];
  1122. _snprintf_s(szMinValue, sizeof(szMinValue), "%.0f", fMinValue);
  1123. strDescription.replace(first, 4, szMinValue);
  1124. int second = strDescription.find("%.0f", first);
  1125. if (second >= 0)
  1126. {
  1127. fMaxValue = floorf(fMaxValue);
  1128. char szMaxValue[256];
  1129. _snprintf_s(szMaxValue, sizeof(szMaxValue), "%.0f", fMaxValue);
  1130. strDescription.replace(second, 4, szMaxValue);
  1131. }
  1132. }
  1133. return strDescription.c_str();
  1134. }
  1135. else
  1136. {
  1137. if (strstr(c_rstrAffectDescription.c_str(), "%.0f"))
  1138. {
  1139. fMinValue = floorf(fMinValue);
  1140. fMaxValue = floorf(fMaxValue);
  1141. }
  1142. static char szDescription[64+1];
  1143. _snprintf_s(szDescription, sizeof(szDescription), c_rstrAffectDescription.c_str(), fMinValue, fMaxValue);
  1144. return szDescription;
  1145. }
  1146. }
  1147. DWORD CPythonSkill::SSkillData::GetSkillCoolTime(float fSkillPoint)
  1148. {
  1149. if (strCoolTimeFormula.empty())
  1150. return 0;
  1151. CPoly poly;
  1152. poly.SetStr(strCoolTimeFormula.c_str());
  1153. return DWORD(ProcessFormula(&poly, fSkillPoint));
  1154. }
  1155. DWORD CPythonSkill::SSkillData::GetTargetCount(float fSkillPoint)
  1156. {
  1157. if (strTargetCountFormula.empty())
  1158. return 0;
  1159. CPoly poly;
  1160. poly.SetStr(strTargetCountFormula.c_str());
  1161. return DWORD(ProcessFormula(&poly, fSkillPoint));
  1162. }
  1163. DWORD CPythonSkill::SSkillData::GetSkillMotionIndex(int iGrade)
  1164. {
  1165. if (-1 != iGrade && SKILL_EFFECT_UPGRADE_ENABLE)
  1166. {
  1167. assert(iGrade >= 0 && iGrade < SKILL_EFFECT_COUNT);
  1168. /*
  1169. if (SKILL_GRADE_COUNT == iGrade)
  1170. {
  1171. return GradeData[SKILL_GRADE_COUNT-1].wMotionIndex;
  1172. }
  1173. else */
  1174. if (iGrade >= 0 && iGrade < SKILL_EFFECT_COUNT)
  1175. {
  1176. return GradeData[iGrade].wMotionIndex;
  1177. }
  1178. }
  1179. return wMotionIndex;
  1180. }
  1181. BYTE CPythonSkill::SSkillData::GetMaxLevel()
  1182. {
  1183. return byMaxLevel;
  1184. }
  1185. BYTE CPythonSkill::SSkillData::GetLevelUpPoint()
  1186. {
  1187. return byLevelUpPoint;
  1188. }
  1189. BOOL CPythonSkill::SSkillData::IsNoMotion()
  1190. {
  1191. return bNoMotion;
  1192. }
  1193. bool CPythonSkill::SSkillData::IsCanUseSkill()
  1194. {
  1195. if (0 != (dwSkillAttribute & SKILL_ATTRIBUTE_PASSIVE))
  1196. return false;
  1197. return true;
  1198. }
  1199. DWORD CPythonSkill::SSkillData::GetMotionLoopCount(float fSkillPoint)
  1200. {
  1201. if (strMotionLoopCountFormula.empty())
  1202. return 0;
  1203. CPoly poly;
  1204. poly.SetStr(strMotionLoopCountFormula.c_str());
  1205. return DWORD(ProcessFormula(&poly, fSkillPoint));
  1206. }
  1207. int CPythonSkill::SSkillData::GetNeedSP(float fSkillPoint)
  1208. {
  1209. if (strNeedSPFormula.empty())
  1210. return 0;
  1211. CPoly poly;
  1212. poly.SetStr(strNeedSPFormula.c_str());
  1213. return int(ProcessFormula(&poly, fSkillPoint));
  1214. }
  1215. DWORD CPythonSkill::SSkillData::GetContinuationSP(float fSkillPoint)
  1216. {
  1217. if (strContinuationSPFormula.empty())
  1218. return 0;
  1219. CPoly poly;
  1220. poly.SetStr(strContinuationSPFormula.c_str());
  1221. return DWORD(ProcessFormula(&poly, fSkillPoint));
  1222. }
  1223. DWORD CPythonSkill::SSkillData::GetDuration(float fSkillPoint)
  1224. {
  1225. if (strDuration.empty())
  1226. return 0;
  1227. CPoly poly;
  1228. poly.SetStr(strDuration.c_str());
  1229. return DWORD(ProcessFormula(&poly, fSkillPoint));
  1230. }
  1231. CPythonSkill::SSkillData::SSkillData()
  1232. {
  1233. byType = SKILL_TYPE_ACTIVE;
  1234. byMaxLevel = 20;
  1235. byLevelUpPoint = 1;
  1236. dwSkillAttribute = 0;
  1237. dwNeedWeapon = 0;
  1238. dwTargetRange = 0;
  1239. strCoolTimeFormula = "";
  1240. strMotionLoopCountFormula = "";
  1241. strNeedSPFormula = "";
  1242. strContinuationSPFormula = "";
  1243. isRequirement = FALSE;
  1244. strRequireSkillName = "";
  1245. byRequireSkillLevel = 0;
  1246. strDuration = "";
  1247. byLevelLimit = 0;
  1248. bNoMotion = FALSE;
  1249. strName = "";
  1250. pImage = NULL;
  1251. for (int j = 0; j < SKILL_GRADE_COUNT; ++j)
  1252. {
  1253. TGradeData & rGradeData = GradeData[j];
  1254. rGradeData.strName = "";
  1255. rGradeData.pImage = NULL;
  1256. rGradeData.wMotionIndex = 0;
  1257. }
  1258. }
  1259. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1260. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1261. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1262. PyObject * skillSetPathName(PyObject * poSelf, PyObject * poArgs)
  1263. {
  1264. char * szPathName;
  1265. if (!PyTuple_GetString(poArgs, 0, &szPathName))
  1266. return Py_BadArgument();
  1267. CPythonSkill::Instance().SetPathName(szPathName);
  1268. return Py_BuildNone();
  1269. }
  1270. PyObject * skillRegisterSkill(PyObject * poSelf, PyObject * poArgs)
  1271. {
  1272. int iSkillIndex;
  1273. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1274. return Py_BadArgument();
  1275. char * szFileName;
  1276. if (!PyTuple_GetString(poArgs, 1, &szFileName))
  1277. return Py_BadArgument();
  1278. std::string strFullFileName;
  1279. strFullFileName = CPythonSkill::Instance().GetPathName();
  1280. strFullFileName += szFileName;
  1281. if (!CPythonSkill::Instance().RegisterSkill(iSkillIndex, strFullFileName.c_str()))
  1282. return Py_BuildException("skill.RegisterSkill - Failed to find skill data file : %d, %s", iSkillIndex, strFullFileName.c_str());
  1283. return Py_BuildNone();
  1284. }
  1285. PyObject * skillLoadSkillData(PyObject * poSelf, PyObject * poArgs)
  1286. {
  1287. return Py_BuildNone();
  1288. }
  1289. PyObject * skillRegisterSkillDesc(PyObject * poSelf, PyObject * poArgs)
  1290. {
  1291. char * szFileName;
  1292. if (!PyTuple_GetString(poArgs, 0, &szFileName))
  1293. return Py_BadArgument();
  1294. if (!CPythonSkill::Instance().RegisterSkillDesc(szFileName))
  1295. return Py_BuildException("Failed to load Skill Desc");
  1296. return Py_BuildNone();
  1297. }
  1298. PyObject * skillClearSkillData(PyObject * poSelf, PyObject * poArgs)
  1299. {
  1300. CPythonSkill::SSkillData::ms_dwTimeIncreaseSkillNumber = 0;
  1301. return Py_BuildNone();
  1302. }
  1303. PyObject * skillGetSkillName(PyObject * poSelf, PyObject * poArgs)
  1304. {
  1305. int iSkillIndex;
  1306. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1307. return Py_BadArgument();
  1308. int iSkillGrade = -1;
  1309. PyTuple_GetInteger(poArgs, 1, &iSkillGrade);
  1310. CPythonSkill::SSkillData * c_pSkillData;
  1311. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1312. return Py_BuildException("skill.GetSkillName - Failed to find skill by %d", iSkillIndex);
  1313. if (-1 != iSkillGrade)
  1314. if (iSkillGrade >= 0 && iSkillGrade < CPythonSkill::SKILL_GRADE_COUNT)
  1315. {
  1316. return Py_BuildValue("s", c_pSkillData->GradeData[iSkillGrade].strName.c_str());
  1317. }
  1318. return Py_BuildValue("s", c_pSkillData->strName.c_str());
  1319. }
  1320. PyObject * skillGetSkillDescription(PyObject * poSelf, PyObject * poArgs)
  1321. {
  1322. int iSkillIndex;
  1323. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1324. return Py_BadArgument();
  1325. CPythonSkill::SSkillData * c_pSkillData;
  1326. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1327. return Py_BuildException("skill.GetSkillDescription - Failed to find skill by %d", iSkillIndex);
  1328. return Py_BuildValue("s", c_pSkillData->strDescription.c_str());
  1329. }
  1330. PyObject * skillGetSkillType(PyObject * poSelf, PyObject * poArgs)
  1331. {
  1332. int iSkillIndex;
  1333. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1334. return Py_BadArgument();
  1335. CPythonSkill::SSkillData * c_pSkillData;
  1336. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1337. return Py_BuildException("skill.GetSkillType - Failed to find skill by %d", iSkillIndex);
  1338. return Py_BuildValue("i", c_pSkillData->byType);
  1339. }
  1340. PyObject * skillGetSkillConditionDescriptionCount(PyObject * poSelf, PyObject * poArgs)
  1341. {
  1342. int iSkillIndex;
  1343. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1344. return Py_BadArgument();
  1345. CPythonSkill::SSkillData * c_pSkillData;
  1346. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1347. return Py_BuildException("skill.GetSkillConditionDescriptionCount - Failed to find skill by %d", iSkillIndex);
  1348. return Py_BuildValue("i", c_pSkillData->ConditionDataVector.size());
  1349. }
  1350. PyObject * skillGetSkillConditionDescription(PyObject * poSelf, PyObject * poArgs)
  1351. {
  1352. int iSkillIndex;
  1353. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1354. return Py_BadArgument();
  1355. int iConditionIndex;
  1356. if (!PyTuple_GetInteger(poArgs, 1, &iConditionIndex))
  1357. return Py_BadArgument();
  1358. CPythonSkill::SSkillData * c_pSkillData;
  1359. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1360. return Py_BuildException("skill.GetSkillConditionDescription() - Failed to find skill by %d", iSkillIndex);
  1361. if (iConditionIndex >= c_pSkillData->ConditionDataVector.size())
  1362. return Py_BuildValue("None");
  1363. return Py_BuildValue("s", c_pSkillData->ConditionDataVector[iConditionIndex].c_str());
  1364. }
  1365. PyObject * skillGetSkillAffectDescriptionCount(PyObject * poSelf, PyObject * poArgs)
  1366. {
  1367. int iSkillIndex;
  1368. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1369. return Py_BadArgument();
  1370. CPythonSkill::SSkillData * c_pSkillData;
  1371. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1372. return Py_BuildException("skill.GetSkillAffectDescriptionCount - Failed to find skill by %d", iSkillIndex);
  1373. return Py_BuildValue("i", c_pSkillData->AffectDataVector.size());
  1374. }
  1375. PyObject * skillGetSkillAffectDescription(PyObject * poSelf, PyObject * poArgs)
  1376. {
  1377. int iSkillIndex;
  1378. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1379. return Py_BadArgument();
  1380. int iAffectIndex;
  1381. if (!PyTuple_GetInteger(poArgs, 1, &iAffectIndex))
  1382. return Py_BadArgument();
  1383. float fSkillPoint;
  1384. if (!PyTuple_GetFloat(poArgs, 2, &fSkillPoint))
  1385. return Py_BadArgument();
  1386. CPythonSkill::SSkillData * c_pSkillData;
  1387. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1388. return Py_BuildException("skill.GetSkillAffectDescription - Failed to find skill by %d", iSkillIndex);
  1389. return Py_BuildValue("s", c_pSkillData->GetAffectDescription(iAffectIndex, fSkillPoint));
  1390. }
  1391. PyObject * skillGetSkillCoolTime(PyObject * poSelf, PyObject * poArgs)
  1392. {
  1393. int iSkillIndex;
  1394. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1395. return Py_BadArgument();
  1396. float fSkillPoint;
  1397. if (!PyTuple_GetFloat(poArgs, 1, &fSkillPoint))
  1398. return Py_BadArgument();
  1399. CPythonSkill::SSkillData * c_pSkillData;
  1400. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1401. return Py_BuildException("skill.GetSkillCoolTime - Failed to find skill by %d", iSkillIndex);
  1402. return Py_BuildValue("i", c_pSkillData->GetSkillCoolTime(fSkillPoint));
  1403. }
  1404. PyObject * skillGetSkillNeedSP(PyObject * poSelf, PyObject * poArgs)
  1405. {
  1406. int iSkillIndex;
  1407. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1408. return Py_BadArgument();
  1409. float fSkillPoint;
  1410. if (!PyTuple_GetFloat(poArgs, 1, &fSkillPoint))
  1411. return Py_BadArgument();
  1412. CPythonSkill::SSkillData * c_pSkillData;
  1413. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1414. return Py_BuildException("skill.GetSkillNeedSP Failed to find skill by %d", iSkillIndex);
  1415. return Py_BuildValue("i", c_pSkillData->GetNeedSP(fSkillPoint));
  1416. }
  1417. PyObject * skillGetSkillContinuationSP(PyObject * poSelf, PyObject * poArgs)
  1418. {
  1419. int iSkillIndex;
  1420. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1421. return Py_BadArgument();
  1422. float fSkillPoint;
  1423. if (!PyTuple_GetFloat(poArgs, 1, &fSkillPoint))
  1424. return Py_BadArgument();
  1425. CPythonSkill::SSkillData * c_pSkillData;
  1426. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1427. return Py_BuildException("skill.GetSkillContinuationSP - Failed to find skill by %d", iSkillIndex);
  1428. return Py_BuildValue("i", c_pSkillData->GetContinuationSP(fSkillPoint));
  1429. }
  1430. PyObject * skillGetSkillMaxLevel(PyObject * poSelf, PyObject * poArgs)
  1431. {
  1432. int iSkillIndex;
  1433. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1434. return Py_BadArgument();
  1435. CPythonSkill::SSkillData * c_pSkillData;
  1436. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1437. return Py_BuildException("skill.GetSkillMaxLevel - Failed to find skill by %d", iSkillIndex);
  1438. return Py_BuildValue("i", c_pSkillData->GetMaxLevel());
  1439. }
  1440. PyObject * skillGetSkillLevelUpPoint(PyObject * poSelf, PyObject * poArgs)
  1441. {
  1442. int iSkillIndex;
  1443. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1444. return Py_BadArgument();
  1445. CPythonSkill::SSkillData * c_pSkillData;
  1446. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1447. return Py_BuildException("skill.GetSkillLevelUpPoint - Failed to find skill by %d", iSkillIndex);
  1448. return Py_BuildValue("i", c_pSkillData->GetLevelUpPoint());
  1449. }
  1450. PyObject * skillGetSkillLevelLimit(PyObject * poSelf, PyObject * poArgs)
  1451. {
  1452. int iSkillIndex;
  1453. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1454. return Py_BadArgument();
  1455. CPythonSkill::SSkillData * c_pSkillData;
  1456. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1457. return Py_BuildException("skill.GetSkillLevelLimit - Failed to find skill by %d", iSkillIndex);
  1458. return Py_BuildValue("i", c_pSkillData->byLevelLimit);
  1459. }
  1460. PyObject * skillIsSkillRequirement(PyObject * poSelf, PyObject * poArgs)
  1461. {
  1462. int iSkillIndex;
  1463. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1464. return Py_BadArgument();
  1465. CPythonSkill::SSkillData * c_pSkillData;
  1466. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1467. return Py_BuildException("skill.IsSkillRequirement - Failed to find skill by %d", iSkillIndex);
  1468. if (c_pSkillData->isRequirement)
  1469. {
  1470. CPythonSkill::SSkillData * pRequireSkillData;
  1471. if (!CPythonSkill::Instance().GetSkillDataByName(c_pSkillData->strRequireSkillName.c_str(), &pRequireSkillData))
  1472. {
  1473. TraceError("skill.IsSkillRequirement - Failed to find skill : [%d/%s] can't find [%s]\n", c_pSkillData->dwSkillIndex, c_pSkillData->strName.c_str(), c_pSkillData->strRequireSkillName.c_str());
  1474. return Py_BuildValue("i", FALSE);
  1475. }
  1476. DWORD dwRequireSkillSlotIndex;
  1477. if (!CPythonPlayer::Instance().FindSkillSlotIndexBySkillIndex(pRequireSkillData->dwSkillIndex, &dwRequireSkillSlotIndex))
  1478. return Py_BuildValue("i", FALSE);
  1479. }
  1480. return Py_BuildValue("i", c_pSkillData->isRequirement);
  1481. }
  1482. PyObject * skillGetSkillRequirementData(PyObject * poSelf, PyObject * poArgs)
  1483. {
  1484. int iSkillIndex;
  1485. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1486. return Py_BadArgument();
  1487. CPythonSkill::SSkillData * c_pSkillData;
  1488. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1489. return Py_BuildException("skill.GetSkillRequirementData - Failed to find skill by %d", iSkillIndex);
  1490. CPythonSkill::SSkillData * pRequireSkillData;
  1491. if (!CPythonSkill::Instance().GetSkillDataByName(c_pSkillData->strRequireSkillName.c_str(), &pRequireSkillData))
  1492. return Py_BuildValue("si", 0, "None", 0);
  1493. int ireqLevel = (int)ceil(float(c_pSkillData->byRequireSkillLevel)/float(max(1, pRequireSkillData->byLevelUpPoint)));
  1494. return Py_BuildValue("si", c_pSkillData->strRequireSkillName.c_str(), ireqLevel);
  1495. }
  1496. PyObject * skillGetSkillRequireStatCount(PyObject * poSelf, PyObject * poArgs)
  1497. {
  1498. int iSkillIndex;
  1499. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1500. return Py_BadArgument();
  1501. CPythonSkill::SSkillData * c_pSkillData;
  1502. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1503. return Py_BuildException("skill.GetSkillRequireStatCount - Failed to find skill by %d", iSkillIndex);
  1504. return Py_BuildValue("i", c_pSkillData->RequireStatDataVector.size());
  1505. }
  1506. PyObject * skillGetSkillRequireStatData(PyObject * poSelf, PyObject * poArgs)
  1507. {
  1508. int iSkillIndex;
  1509. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1510. return Py_BadArgument();
  1511. int iStatIndex;
  1512. if (!PyTuple_GetInteger(poArgs, 1, &iStatIndex))
  1513. return Py_BadArgument();
  1514. CPythonSkill::SSkillData * c_pSkillData;
  1515. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1516. return Py_BuildException("skill.GetSkillRequireStatData - Failed to find skill by %d", iSkillIndex);
  1517. if (iStatIndex >= c_pSkillData->RequireStatDataVector.size())
  1518. return Py_BuildValue("ii", 0, 0);
  1519. const CPythonSkill::TRequireStatData & c_rRequireStatData = c_pSkillData->RequireStatDataVector[iStatIndex];
  1520. return Py_BuildValue("ii", c_rRequireStatData.byPoint, c_rRequireStatData.byLevel);
  1521. }
  1522. PyObject * skillCanLevelUpSkill(PyObject * poSelf, PyObject * poArgs)
  1523. {
  1524. int iSkillIndex;
  1525. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1526. return Py_BadArgument();
  1527. int iSkillLevel;
  1528. if (!PyTuple_GetInteger(poArgs, 1, &iSkillLevel))
  1529. return Py_BadArgument();
  1530. CPythonSkill::SSkillData * c_pSkillData;
  1531. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1532. return Py_BuildException("skill.CanLevelUpSkill - Failed to find skill by %d", iSkillIndex);
  1533. if (iSkillLevel >= c_pSkillData->GetMaxLevel())
  1534. return Py_BuildValue("i", FALSE);
  1535. if (c_pSkillData->isRequirement)
  1536. {
  1537. CPythonSkill::SSkillData * pRequireSkillData;
  1538. if (CPythonSkill::Instance().GetSkillDataByName(c_pSkillData->strRequireSkillName.c_str(), &pRequireSkillData))
  1539. {
  1540. DWORD dwRequireSkillSlotIndex;
  1541. if (CPythonPlayer::Instance().FindSkillSlotIndexBySkillIndex(pRequireSkillData->dwSkillIndex, &dwRequireSkillSlotIndex))
  1542. {
  1543. int iSkillGrade = CPythonPlayer::Instance().GetSkillGrade(dwRequireSkillSlotIndex);
  1544. int iSkillLevel = CPythonPlayer::Instance().GetSkillLevel(dwRequireSkillSlotIndex);
  1545. if (iSkillGrade <= 0)
  1546. if (iSkillLevel < c_pSkillData->byRequireSkillLevel)
  1547. return Py_BuildValue("i", FALSE);
  1548. }
  1549. }
  1550. }
  1551. for (DWORD i = 0; i < c_pSkillData->RequireStatDataVector.size(); ++i)
  1552. {
  1553. const CPythonSkill::TRequireStatData & c_rRequireStatData = c_pSkillData->RequireStatDataVector[i];
  1554. if (CPythonPlayer::Instance().GetStatus(c_rRequireStatData.byPoint) < c_rRequireStatData.byLevel)
  1555. return Py_BuildValue("i", FALSE);
  1556. }
  1557. if (0 != (c_pSkillData->dwSkillAttribute & CPythonSkill::SKILL_ATTRIBUTE_CANNOT_LEVEL_UP))
  1558. return Py_BuildValue("i", FALSE);
  1559. return Py_BuildValue("i", TRUE);
  1560. }
  1561. PyObject * skillCheckRequirementSueccess(PyObject * poSelf, PyObject * poArgs)
  1562. {
  1563. int iSkillIndex;
  1564. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1565. return Py_BadArgument();
  1566. CPythonSkill::SSkillData * c_pSkillData;
  1567. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1568. return Py_BuildException("skill.CheckRequirementSueccess - Failed to find skill by %d", iSkillIndex);
  1569. if (c_pSkillData->isRequirement)
  1570. {
  1571. CPythonSkill::SSkillData * pRequireSkillData;
  1572. if (CPythonSkill::Instance().GetSkillDataByName(c_pSkillData->strRequireSkillName.c_str(), &pRequireSkillData))
  1573. {
  1574. DWORD dwRequireSkillSlotIndex;
  1575. if (CPythonPlayer::Instance().FindSkillSlotIndexBySkillIndex(pRequireSkillData->dwSkillIndex, &dwRequireSkillSlotIndex))
  1576. {
  1577. int iSkillGrade = CPythonPlayer::Instance().GetSkillGrade(dwRequireSkillSlotIndex);
  1578. int iSkillLevel = CPythonPlayer::Instance().GetSkillLevel(dwRequireSkillSlotIndex);
  1579. if (iSkillGrade <= 0)
  1580. if (iSkillLevel < c_pSkillData->byRequireSkillLevel)
  1581. return Py_BuildValue("i", FALSE);
  1582. }
  1583. }
  1584. }
  1585. return Py_BuildValue("i", TRUE);
  1586. }
  1587. PyObject * skillGetNeedCharacterLevel(PyObject * poSelf, PyObject * poArgs)
  1588. {
  1589. int iSkillIndex;
  1590. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1591. return Py_BadArgument();
  1592. CPythonSkill::SSkillData * c_pSkillData;
  1593. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1594. return Py_BuildException("skill.GetNeedCharacterLevel - Failed to find skill by %d", iSkillIndex);
  1595. std::vector<CPythonSkill::TRequireStatData>::iterator itor = c_pSkillData->RequireStatDataVector.begin();
  1596. for (; itor != c_pSkillData->RequireStatDataVector.end(); ++itor)
  1597. {
  1598. const CPythonSkill::TRequireStatData & c_rRequireStatData = *itor;
  1599. if (POINT_LEVEL == c_rRequireStatData.byPoint)
  1600. return Py_BuildValue("i", c_rRequireStatData.byLevel);
  1601. }
  1602. return Py_BuildValue("i", 0);
  1603. }
  1604. PyObject * skillIsToggleSkill(PyObject * poSelf, PyObject * poArgs)
  1605. {
  1606. int iSkillIndex;
  1607. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1608. return Py_BadArgument();
  1609. CPythonSkill::SSkillData * c_pSkillData;
  1610. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1611. return Py_BuildException("skill.IsToggleSkill - Failed to find skill by %d", iSkillIndex);
  1612. return Py_BuildValue("i", c_pSkillData->IsToggleSkill());
  1613. }
  1614. PyObject * skillIsUseHPSkill(PyObject * poSelf, PyObject * poArgs)
  1615. {
  1616. int iSkillIndex;
  1617. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1618. return Py_BadArgument();
  1619. CPythonSkill::SSkillData * c_pSkillData;
  1620. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1621. return Py_BuildException("skill.IsUseHPSkill - Failed to find skill by %d", iSkillIndex);
  1622. return Py_BuildValue("i", c_pSkillData->IsUseHPSkill());
  1623. }
  1624. PyObject * skillIsStandingSkill(PyObject * poSelf, PyObject * poArgs)
  1625. {
  1626. int iSkillIndex;
  1627. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1628. return Py_BadArgument();
  1629. CPythonSkill::SSkillData * c_pSkillData;
  1630. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1631. return Py_BuildException("skill.IsStandingSkill - Failed to find skill by %d", iSkillIndex);
  1632. return Py_BuildValue("i", c_pSkillData->IsStandingSkill());
  1633. }
  1634. PyObject * skillCanUseSkill(PyObject * poSelf, PyObject * poArgs)
  1635. {
  1636. int iSkillIndex;
  1637. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1638. return Py_BadArgument();
  1639. CPythonSkill::SSkillData * c_pSkillData;
  1640. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1641. return Py_BuildException("skill.CanUseSkill - Failed to find skill by %d", iSkillIndex);
  1642. return Py_BuildValue("i", c_pSkillData->IsCanUseSkill());
  1643. }
  1644. PyObject * skillIsLevelUpSkill(PyObject * poSelf, PyObject * poArgs)
  1645. {
  1646. int iSkillIndex;
  1647. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1648. return Py_BadArgument();
  1649. CPythonSkill::SSkillData * c_pSkillData;
  1650. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1651. return Py_BuildException("skill.IsLevelUpSkill - Failed to find skill by %d", iSkillIndex);
  1652. // ¸ğµÎ ·¹º§¾÷ °¡´É
  1653. return Py_BuildValue("i", TRUE);
  1654. }
  1655. PyObject * skillGetIconName(PyObject * poSelf, PyObject * poArgs)
  1656. {
  1657. int iSkillIndex;
  1658. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1659. return Py_BadArgument();
  1660. CPythonSkill::SSkillData * c_pSkillData;
  1661. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1662. return Py_BuildValue("s", "");
  1663. return Py_BuildValue("s", c_pSkillData->strIconFileName.c_str());
  1664. }
  1665. PyObject * skillGetIconImage(PyObject * poSelf, PyObject * poArgs)
  1666. {
  1667. int iSkillIndex;
  1668. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1669. return Py_BadArgument();
  1670. CPythonSkill::SSkillData * c_pSkillData;
  1671. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1672. return Py_BuildValue("i", 0); // ÀͼÁ¼ÇÀ» ³»´Â ´ë½Å 0À» ¸®ÅÏÇÑ´Ù.
  1673. return Py_BuildValue("i", c_pSkillData->pImage);
  1674. }
  1675. PyObject * skillGetIconInstance(PyObject * poSelf, PyObject * poArgs)
  1676. {
  1677. int iSkillIndex;
  1678. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1679. return Py_BadArgument();
  1680. CPythonSkill::SSkillData * c_pSkillData;
  1681. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1682. return Py_BuildException("skill.GetIconInstance - Failed to find skill by %d", iSkillIndex);
  1683. CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New();
  1684. pImageInstance->SetImagePointer(c_pSkillData->pImage);
  1685. return Py_BuildValue("i", pImageInstance);
  1686. }
  1687. PyObject * skillGetIconImageNew(PyObject * poSelf, PyObject * poArgs)
  1688. {
  1689. int iSkillIndex;
  1690. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1691. return Py_BadArgument();
  1692. int iGradeIndex;
  1693. if (!PyTuple_GetInteger(poArgs, 1, &iGradeIndex))
  1694. return Py_BadArgument();
  1695. CPythonSkill::SSkillData * c_pSkillData;
  1696. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1697. return Py_BuildValue("i", 0); // ÀͼÁ¼ÇÀ» ³»´Â ´ë½Å 0À» ¸®ÅÏÇÑ´Ù.
  1698. if (iGradeIndex < 0)
  1699. iGradeIndex = 0;
  1700. if (iGradeIndex >= CPythonSkill::SKILL_GRADE_COUNT)
  1701. iGradeIndex = CPythonSkill::SKILL_GRADE_COUNT-1;
  1702. return Py_BuildValue("i", c_pSkillData->GradeData[iGradeIndex].pImage);
  1703. }
  1704. PyObject * skillGetIconInstanceNew(PyObject * poSelf, PyObject * poArgs)
  1705. {
  1706. int iSkillIndex;
  1707. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1708. return Py_BadArgument();
  1709. int iGradeIndex;
  1710. if (!PyTuple_GetInteger(poArgs, 1, &iGradeIndex))
  1711. return Py_BadArgument();
  1712. CPythonSkill::SSkillData * c_pSkillData;
  1713. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1714. return Py_BuildException("skill.GetIconInstanceNew - Failed to find skill by %d", iSkillIndex);
  1715. //CGraphicImage * pImage = c_pSkillData->pImage;
  1716. if (iGradeIndex < 0)
  1717. iGradeIndex = 0;
  1718. if (iGradeIndex >= CPythonSkill::SKILL_GRADE_COUNT)
  1719. iGradeIndex = CPythonSkill::SKILL_GRADE_COUNT-1;
  1720. CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New();
  1721. pImageInstance->SetImagePointer(c_pSkillData->GradeData[iGradeIndex].pImage);
  1722. return Py_BuildValue("i", pImageInstance);
  1723. }
  1724. PyObject * skillDeleteIconInstance(PyObject * poSelf, PyObject * poArgs)
  1725. {
  1726. int iHandle;
  1727. if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
  1728. return Py_BadArgument();
  1729. CGraphicImageInstance::Delete((CGraphicImageInstance *) iHandle);
  1730. return Py_BuildNone();
  1731. }
  1732. PyObject * skillGetGradeData(PyObject * poSelf, PyObject * poArgs)
  1733. {
  1734. int iSkillIndex;
  1735. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1736. return Py_BadArgument();
  1737. int iGradeIndex;
  1738. if (!PyTuple_GetInteger(poArgs, 1, &iGradeIndex))
  1739. return Py_BadArgument();
  1740. CPythonSkill::SSkillData * c_pSkillData;
  1741. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1742. return Py_BuildException("skill.GetGradeData - Failed to find skill by %d", iSkillIndex);
  1743. if (iGradeIndex < 0 || iGradeIndex >= CPythonSkill::SKILL_GRADE_COUNT)
  1744. return Py_BuildException("Strange grade index [%d]", iSkillIndex, iGradeIndex);
  1745. return Py_BuildValue("i", c_pSkillData->GradeData[iGradeIndex]);
  1746. }
  1747. PyObject * skillGetNewAffectDataCount(PyObject * poSelf, PyObject * poArgs)
  1748. {
  1749. int iSkillIndex;
  1750. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1751. return Py_BadArgument();
  1752. CPythonSkill::SSkillData * c_pSkillData;
  1753. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1754. return Py_BuildException("skill.GetNewAffectDataCount - Failed to find skill by %d", iSkillIndex);
  1755. return Py_BuildValue("i", c_pSkillData->AffectDataNewVector.size());
  1756. }
  1757. PyObject * skillGetNewAffectData(PyObject * poSelf, PyObject * poArgs)
  1758. {
  1759. int iSkillIndex;
  1760. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1761. return Py_BadArgument();
  1762. int iAffectIndex;
  1763. if (!PyTuple_GetInteger(poArgs, 1, &iAffectIndex))
  1764. return Py_BadArgument();
  1765. float fSkillLevel;
  1766. if (!PyTuple_GetFloat(poArgs, 2, &fSkillLevel))
  1767. return Py_BadArgument();
  1768. CPythonSkill::SSkillData * pSkillData;
  1769. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &pSkillData))
  1770. return Py_BuildException("skill.GetNewAffectData - Failed to find skill by %d", iSkillIndex);
  1771. if (iAffectIndex < 0 || iAffectIndex >= pSkillData->AffectDataNewVector.size())
  1772. return Py_BuildException(" skill.GetNewAffectData - Strange AffectIndex %d", iAffectIndex);
  1773. CPythonSkill::TAffectDataNew & rAffectData = pSkillData->AffectDataNewVector[iAffectIndex];
  1774. CPoly minPoly;
  1775. CPoly maxPoly;
  1776. minPoly.SetRandom(CPoly::RANDOM_TYPE_FORCE_MIN);
  1777. maxPoly.SetRandom(CPoly::RANDOM_TYPE_FORCE_MAX);
  1778. minPoly.SetStr(rAffectData.strPointPoly.c_str());
  1779. maxPoly.SetStr(rAffectData.strPointPoly.c_str());
  1780. float fMinValue = pSkillData->ProcessFormula(&minPoly, fSkillLevel, CPythonSkill::VALUE_TYPE_MIN);
  1781. float fMaxValue = pSkillData->ProcessFormula(&maxPoly, fSkillLevel, CPythonSkill::VALUE_TYPE_MAX);
  1782. return Py_BuildValue("sff", rAffectData.strPointType.c_str(), fMinValue, fMaxValue);
  1783. }
  1784. PyObject * skillGetDuration(PyObject * poSelf, PyObject * poArgs)
  1785. {
  1786. int iSkillIndex;
  1787. if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex))
  1788. return Py_BadArgument();
  1789. float fSkillLevel;
  1790. if (!PyTuple_GetFloat(poArgs, 1, &fSkillLevel))
  1791. return Py_BadArgument();
  1792. CPythonSkill::SSkillData * c_pSkillData;
  1793. if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData))
  1794. return Py_BuildException("skill.GetDuration - Failed to find skill by %d", iSkillIndex);
  1795. return Py_BuildValue("i", c_pSkillData->GetDuration(fSkillLevel));
  1796. }
  1797. PyObject * skillTEST(PyObject * poSelf, PyObject * poArgs)
  1798. {
  1799. CPythonSkill::Instance().TEST();
  1800. return Py_BuildNone();
  1801. }
  1802. void initskill()
  1803. {
  1804. static PyMethodDef s_methods[] =
  1805. {
  1806. { "SetPathName", skillSetPathName, METH_VARARGS },
  1807. { "RegisterSkill", skillRegisterSkill, METH_VARARGS },
  1808. { "LoadSkillData", skillLoadSkillData, METH_VARARGS },
  1809. { "ClearSkillData", skillClearSkillData, METH_VARARGS },
  1810. /////
  1811. { "GetSkillName", skillGetSkillName, METH_VARARGS },
  1812. { "GetSkillDescription", skillGetSkillDescription, METH_VARARGS },
  1813. { "GetSkillType", skillGetSkillType, METH_VARARGS },
  1814. { "GetSkillConditionDescriptionCount", skillGetSkillConditionDescriptionCount, METH_VARARGS },
  1815. { "GetSkillConditionDescription", skillGetSkillConditionDescription, METH_VARARGS },
  1816. { "GetSkillAffectDescriptionCount", skillGetSkillAffectDescriptionCount, METH_VARARGS },
  1817. { "GetSkillAffectDescription", skillGetSkillAffectDescription, METH_VARARGS },
  1818. { "GetSkillCoolTime", skillGetSkillCoolTime, METH_VARARGS },
  1819. { "GetSkillNeedSP", skillGetSkillNeedSP, METH_VARARGS },
  1820. { "GetSkillContinuationSP", skillGetSkillContinuationSP, METH_VARARGS },
  1821. { "GetSkillMaxLevel", skillGetSkillMaxLevel, METH_VARARGS },
  1822. { "GetSkillLevelUpPoint", skillGetSkillLevelUpPoint, METH_VARARGS },
  1823. { "GetSkillLevelLimit", skillGetSkillLevelLimit, METH_VARARGS },
  1824. { "IsSkillRequirement", skillIsSkillRequirement, METH_VARARGS },
  1825. { "GetSkillRequirementData", skillGetSkillRequirementData, METH_VARARGS },
  1826. { "GetSkillRequireStatCount", skillGetSkillRequireStatCount, METH_VARARGS },
  1827. { "GetSkillRequireStatData", skillGetSkillRequireStatData, METH_VARARGS },
  1828. { "CanLevelUpSkill", skillCanLevelUpSkill, METH_VARARGS },
  1829. { "IsLevelUpSkill", skillIsLevelUpSkill, METH_VARARGS },
  1830. { "CheckRequirementSueccess", skillCheckRequirementSueccess, METH_VARARGS },
  1831. { "GetNeedCharacterLevel", skillGetNeedCharacterLevel, METH_VARARGS },
  1832. { "IsToggleSkill", skillIsToggleSkill, METH_VARARGS },
  1833. { "IsUseHPSkill", skillIsUseHPSkill, METH_VARARGS },
  1834. { "IsStandingSkill", skillIsStandingSkill, METH_VARARGS },
  1835. { "CanUseSkill", skillCanUseSkill, METH_VARARGS },
  1836. { "GetIconName", skillGetIconName, METH_VARARGS },
  1837. { "GetIconImage", skillGetIconImage, METH_VARARGS },
  1838. { "GetIconImageNew", skillGetIconImageNew, METH_VARARGS },
  1839. { "GetIconInstance", skillGetIconInstance, METH_VARARGS },
  1840. { "GetIconInstanceNew", skillGetIconInstanceNew, METH_VARARGS },
  1841. { "DeleteIconInstance", skillDeleteIconInstance, METH_VARARGS },
  1842. { "GetGradeData", skillGetGradeData, METH_VARARGS },
  1843. { "GetNewAffectDataCount", skillGetNewAffectDataCount, METH_VARARGS },
  1844. { "GetNewAffectData", skillGetNewAffectData, METH_VARARGS },
  1845. { "GetDuration", skillGetDuration, METH_VARARGS },
  1846. { "TEST", skillTEST, METH_VARARGS },
  1847. { NULL, NULL, NULL },
  1848. };
  1849. PyObject * poModule = Py_InitModule("skill", s_methods);
  1850. PyModule_AddIntConstant(poModule, "SKILL_TYPE_NONE", CPythonSkill::SKILL_TYPE_NONE);
  1851. PyModule_AddIntConstant(poModule, "SKILL_TYPE_ACTIVE", CPythonSkill::SKILL_TYPE_ACTIVE);
  1852. PyModule_AddIntConstant(poModule, "SKILL_TYPE_SUPPORT", CPythonSkill::SKILL_TYPE_SUPPORT);
  1853. PyModule_AddIntConstant(poModule, "SKILL_TYPE_GUILD", CPythonSkill::SKILL_TYPE_GUILD);
  1854. PyModule_AddIntConstant(poModule, "SKILL_TYPE_HORSE", CPythonSkill::SKILL_TYPE_HORSE);
  1855. PyModule_AddIntConstant(poModule, "SKILL_TYPE_MAX_NUM", CPythonSkill::SKILL_TYPE_MAX_NUM);
  1856. PyModule_AddIntConstant(poModule, "SKILL_GRADE_COUNT", CPythonSkill::SKILL_GRADE_COUNT);
  1857. PyModule_AddIntConstant(poModule, "SKILL_GRADE_STEP_COUNT", CPythonSkill::SKILL_GRADE_STEP_COUNT);
  1858. PyModule_AddIntConstant(poModule, "SKILL_GRADEGAP", CPythonSkill::SKILL_GRADEGAP);
  1859. PyModule_AddIntConstant(poModule, "SKILL_EFFECT_COUNT", CPythonSkill::SKILL_EFFECT_COUNT);
  1860. }

PythonSkill.cpp