port: CPythonSkill + skill module + EterBase/Poly (1:1 40250)

Copy PythonSkill.cpp and the EterBase/Poly formula parser verbatim, drop the
pending stand-in and the skill module stub, register initskill() after
initfly() and build CPythonSkill in m_pySkill's place. LoadLocaleData now
loads skilldesc/skilltable. Skill and item icon handles go through
Py_BuildPointer/PyTuple_GetPointer (ILP32 ints truncate 64-bit pointers).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-24 03:07:15 +09:00
co-authored by Claude Opus 5.5
parent 7358bf444a
commit 03de3f314a
25 changed files with 3944 additions and 328 deletions
@@ -136,21 +136,6 @@ void AddStubConstants_shop(PyObject* poModule)
}
// 40250 UserInterface/PythonSkill.cpp
void AddStubConstants_skill(PyObject* poModule)
{
(void) poModule;
PyModule_AddIntConstant(poModule, "SKILL_TYPE_NONE", CPythonSkill::SKILL_TYPE_NONE);
PyModule_AddIntConstant(poModule, "SKILL_TYPE_ACTIVE", CPythonSkill::SKILL_TYPE_ACTIVE);
PyModule_AddIntConstant(poModule, "SKILL_TYPE_SUPPORT", CPythonSkill::SKILL_TYPE_SUPPORT);
PyModule_AddIntConstant(poModule, "SKILL_TYPE_GUILD", CPythonSkill::SKILL_TYPE_GUILD);
PyModule_AddIntConstant(poModule, "SKILL_TYPE_HORSE", CPythonSkill::SKILL_TYPE_HORSE);
PyModule_AddIntConstant(poModule, "SKILL_TYPE_MAX_NUM", CPythonSkill::SKILL_TYPE_MAX_NUM);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_COUNT", CPythonSkill::SKILL_GRADE_COUNT);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_STEP_COUNT", CPythonSkill::SKILL_GRADE_STEP_COUNT);
PyModule_AddIntConstant(poModule, "SKILL_GRADEGAP", CPythonSkill::SKILL_GRADEGAP);
PyModule_AddIntConstant(poModule, "SKILL_EFFECT_COUNT", CPythonSkill::SKILL_EFFECT_COUNT);
}
// 40250 UserInterface/PythonSoundManagerModule.cpp
void AddStubConstants_snd(PyObject* poModule)
{
@@ -15,7 +15,6 @@ void AddStubConstants_profiler(PyObject* poModule);
void AddStubConstants_quest(PyObject* poModule);
void AddStubConstants_safebox(PyObject* poModule);
void AddStubConstants_shop(PyObject* poModule);
void AddStubConstants_skill(PyObject* poModule);
void AddStubConstants_snd(PyObject* poModule);
void AddStubConstants_systemSetting(PyObject* poModule);
void AddStubConstants_udp(PyObject* poModule);
@@ -430,90 +429,6 @@ PyMethodDef methods_shop[] = {
{ "BuildPrivateShop", stub_shop_BuildPrivateShop, METH_VARARGS },
{ NULL, NULL }
};
// 40250 UserInterface/PythonSkill.cpp: skill export names.
PyObject* stub_skill_SetPathName(PyObject*, PyObject*) { return stub_call_named("skill.SetPathName", Py_BuildNone()); }
PyObject* stub_skill_RegisterSkill(PyObject*, PyObject*) { return stub_call_named("skill.RegisterSkill", Py_BuildNone()); }
PyObject* stub_skill_LoadSkillData(PyObject*, PyObject*) { return stub_call_named("skill.LoadSkillData", Py_BuildNone()); }
PyObject* stub_skill_ClearSkillData(PyObject*, PyObject*) { return stub_call_named("skill.ClearSkillData", Py_BuildNone()); }
PyObject* stub_skill_GetSkillName(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillName", Py_BuildValue("s", "")); }
PyObject* stub_skill_GetSkillDescription(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillDescription", Py_BuildValue("s", "")); }
PyObject* stub_skill_GetSkillType(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillType", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillConditionDescriptionCount(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillConditionDescriptionCount", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillConditionDescription(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillConditionDescription", Py_BuildValue("s", "")); }
PyObject* stub_skill_GetSkillAffectDescriptionCount(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillAffectDescriptionCount", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillAffectDescription(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillAffectDescription", Py_BuildValue("s", "")); }
PyObject* stub_skill_GetSkillCoolTime(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillCoolTime", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillNeedSP(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillNeedSP", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillContinuationSP(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillContinuationSP", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillMaxLevel(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillMaxLevel", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillLevelUpPoint(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillLevelUpPoint", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillLevelLimit(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillLevelLimit", Py_BuildValue("i", 0)); }
PyObject* stub_skill_IsSkillRequirement(PyObject*, PyObject*) { return stub_call_named("skill.IsSkillRequirement", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillRequirementData(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillRequirementData", Py_BuildValue("si", "", 0)); }
PyObject* stub_skill_GetSkillRequireStatCount(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillRequireStatCount", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetSkillRequireStatData(PyObject*, PyObject*) { return stub_call_named("skill.GetSkillRequireStatData", Py_BuildValue("ii", 0, 0)); }
PyObject* stub_skill_CanLevelUpSkill(PyObject*, PyObject*) { return stub_call_named("skill.CanLevelUpSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_IsLevelUpSkill(PyObject*, PyObject*) { return stub_call_named("skill.IsLevelUpSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_CheckRequirementSueccess(PyObject*, PyObject*) { return stub_call_named("skill.CheckRequirementSueccess", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetNeedCharacterLevel(PyObject*, PyObject*) { return stub_call_named("skill.GetNeedCharacterLevel", Py_BuildValue("i", 0)); }
PyObject* stub_skill_IsToggleSkill(PyObject*, PyObject*) { return stub_call_named("skill.IsToggleSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_IsUseHPSkill(PyObject*, PyObject*) { return stub_call_named("skill.IsUseHPSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_IsStandingSkill(PyObject*, PyObject*) { return stub_call_named("skill.IsStandingSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_CanUseSkill(PyObject*, PyObject*) { return stub_call_named("skill.CanUseSkill", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetIconName(PyObject*, PyObject*) { return stub_call_named("skill.GetIconName", Py_BuildValue("s", "")); }
PyObject* stub_skill_GetIconImage(PyObject*, PyObject*) { return stub_call_named("skill.GetIconImage", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetIconImageNew(PyObject*, PyObject*) { return stub_call_named("skill.GetIconImageNew", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetIconInstance(PyObject*, PyObject*) { return stub_call_named("skill.GetIconInstance", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetIconInstanceNew(PyObject*, PyObject*) { return stub_call_named("skill.GetIconInstanceNew", Py_BuildValue("i", 0)); }
PyObject* stub_skill_DeleteIconInstance(PyObject*, PyObject*) { return stub_call_named("skill.DeleteIconInstance", Py_BuildNone()); }
PyObject* stub_skill_GetGradeData(PyObject*, PyObject*) { return stub_call_named("skill.GetGradeData", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetNewAffectDataCount(PyObject*, PyObject*) { return stub_call_named("skill.GetNewAffectDataCount", Py_BuildValue("i", 0)); }
PyObject* stub_skill_GetNewAffectData(PyObject*, PyObject*) { return stub_call_named("skill.GetNewAffectData", Py_BuildValue("sff", "", 0.0, 0.0)); }
PyObject* stub_skill_GetDuration(PyObject*, PyObject*) { return stub_call_named("skill.GetDuration", Py_BuildValue("i", 0)); }
PyObject* stub_skill_TEST(PyObject*, PyObject*) { return stub_call_named("skill.TEST", Py_BuildNone()); }
PyMethodDef methods_skill[] = {
{ "SetPathName", stub_skill_SetPathName, METH_VARARGS },
{ "RegisterSkill", stub_skill_RegisterSkill, METH_VARARGS },
{ "LoadSkillData", stub_skill_LoadSkillData, METH_VARARGS },
{ "ClearSkillData", stub_skill_ClearSkillData, METH_VARARGS },
{ "GetSkillName", stub_skill_GetSkillName, METH_VARARGS },
{ "GetSkillDescription", stub_skill_GetSkillDescription, METH_VARARGS },
{ "GetSkillType", stub_skill_GetSkillType, METH_VARARGS },
{ "GetSkillConditionDescriptionCount", stub_skill_GetSkillConditionDescriptionCount, METH_VARARGS },
{ "GetSkillConditionDescription", stub_skill_GetSkillConditionDescription, METH_VARARGS },
{ "GetSkillAffectDescriptionCount", stub_skill_GetSkillAffectDescriptionCount, METH_VARARGS },
{ "GetSkillAffectDescription", stub_skill_GetSkillAffectDescription, METH_VARARGS },
{ "GetSkillCoolTime", stub_skill_GetSkillCoolTime, METH_VARARGS },
{ "GetSkillNeedSP", stub_skill_GetSkillNeedSP, METH_VARARGS },
{ "GetSkillContinuationSP", stub_skill_GetSkillContinuationSP, METH_VARARGS },
{ "GetSkillMaxLevel", stub_skill_GetSkillMaxLevel, METH_VARARGS },
{ "GetSkillLevelUpPoint", stub_skill_GetSkillLevelUpPoint, METH_VARARGS },
{ "GetSkillLevelLimit", stub_skill_GetSkillLevelLimit, METH_VARARGS },
{ "IsSkillRequirement", stub_skill_IsSkillRequirement, METH_VARARGS },
{ "GetSkillRequirementData", stub_skill_GetSkillRequirementData, METH_VARARGS },
{ "GetSkillRequireStatCount", stub_skill_GetSkillRequireStatCount, METH_VARARGS },
{ "GetSkillRequireStatData", stub_skill_GetSkillRequireStatData, METH_VARARGS },
{ "CanLevelUpSkill", stub_skill_CanLevelUpSkill, METH_VARARGS },
{ "IsLevelUpSkill", stub_skill_IsLevelUpSkill, METH_VARARGS },
{ "CheckRequirementSueccess", stub_skill_CheckRequirementSueccess, METH_VARARGS },
{ "GetNeedCharacterLevel", stub_skill_GetNeedCharacterLevel, METH_VARARGS },
{ "IsToggleSkill", stub_skill_IsToggleSkill, METH_VARARGS },
{ "IsUseHPSkill", stub_skill_IsUseHPSkill, METH_VARARGS },
{ "IsStandingSkill", stub_skill_IsStandingSkill, METH_VARARGS },
{ "CanUseSkill", stub_skill_CanUseSkill, METH_VARARGS },
{ "GetIconName", stub_skill_GetIconName, METH_VARARGS },
{ "GetIconImage", stub_skill_GetIconImage, METH_VARARGS },
{ "GetIconImageNew", stub_skill_GetIconImageNew, METH_VARARGS },
{ "GetIconInstance", stub_skill_GetIconInstance, METH_VARARGS },
{ "GetIconInstanceNew", stub_skill_GetIconInstanceNew, METH_VARARGS },
{ "DeleteIconInstance", stub_skill_DeleteIconInstance, METH_VARARGS },
{ "GetGradeData", stub_skill_GetGradeData, METH_VARARGS },
{ "GetNewAffectDataCount", stub_skill_GetNewAffectDataCount, METH_VARARGS },
{ "GetNewAffectData", stub_skill_GetNewAffectData, METH_VARARGS },
{ "GetDuration", stub_skill_GetDuration, METH_VARARGS },
{ "TEST", stub_skill_TEST, METH_VARARGS },
{ NULL, NULL }
};
// 40250 UserInterface/PythonSoundManagerModule.cpp: snd export names.
PyObject* stub_snd_PlaySound(PyObject*, PyObject*) { return stub_call_named("snd.PlaySound", Py_BuildNone()); }
PyObject* stub_snd_PlaySound3D(PyObject*, PyObject*) { return stub_call_named("snd.PlaySound3D", Py_BuildNone()); }
@@ -692,11 +607,6 @@ void init_2v0_gameplay_stubs() {
PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_shop(module);
}
{
PyObject* module = Py_InitModule("skill", methods_skill);
PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_skill(module);
}
{
PyObject* module = Py_InitModule("snd", methods_snd);
PyModule_AddIntConstant(module, "__port_stub__", 1);
@@ -27,6 +27,7 @@
#include "UserInterface/PythonMiniMap.h"
#include "UserInterface/PythonEventManager.h"
#include "UserInterface/PythonBackground.h"
#include "UserInterface/PythonSkill.h"
#include "UserInterface/PythonQuest.h"
#include "UserInterface/PythonMessenger.h"
#include "UserInterface/PythonSafeBox.h"
@@ -117,6 +118,7 @@ struct GameSingletons
CPythonMiniMap pyMiniMap;
CPythonEventManager pyEventManager;
CPythonBackground pyBackground;
CPythonSkill pySkill;
CPythonQuest pyQuest;
CPythonMessenger pyManager;
CPythonSafeBox pySafeBox;
@@ -356,6 +358,7 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error)
initMiniMap();
initeffect();
initfly();
initskill();
initServerStateChecker();
init_2v0_gameplay_stubs();
@@ -320,11 +320,9 @@ void CPythonApplication::SetForceSightRange(int) { MT_PLATFORM_STUB(); }
void CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); }
BOOL PERF_CHECKER_RENDER_GAME = FALSE;
BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE;
double g_specularSpd = 0;
// 40250 UserInterface/PythonApplication.cpp, verbatim. PORT: CPythonSkill is still a stand-in, so
// RegisterSkillDesc fails and the function returns false after the item and mob tables load.
// 40250 UserInterface/PythonApplication.cpp, verbatim.
// SUPPORT_NEW_KOREA_SERVER
bool LoadLocaleData(const char* localePath)
{
@@ -1,210 +0,0 @@
// Stand-in for the 40250 logic unit UserInterface/PythonSkill.cpp, not ported yet: the members the ported units
// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/
// (docs/PORT-PLAN.md).
#include "UserInterface/StdAfx.h"
#include "UserInterface/PythonSkill.h"
#include "../../PlatformStub.h"
auto CPythonSkill::SSkillData::IsNeedCorpse() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsToggleSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsChargeSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::GetSkillData(DWORD, TSkillData **) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetTargetRange() const -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::CanChangeDirection() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsFanRange() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsCircleRange() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsAutoSearchTarget() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedTarget() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsUseHPSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsStandingSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseWeaponType(DWORD) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsOnlyForAlliance() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseForMe() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseIfNotEnough() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedEmptyBottle() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedPoisonBottle() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedBow() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsAttackSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsHorseSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsMovingSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsOnlyForGuildWar() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetSkillCoolTime(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetNeedSP(float) -> int
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
}
auto CPythonSkill::SSkillData::GetMotionLoopCount(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetTargetCount(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetSkillMotionIndex(int) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::IsCanUseSkill() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonSkill::SSkillData::IsNoMotion() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetType() const -> BYTE
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BYTE>();
}
auto CPythonSkill::Destroy() -> void
{
MT_PLATFORM_STUB();
}
auto CPythonSkill::RegisterSkillTable(const char *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonSkill::RegisterSkillDesc(const char *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}