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
@@ -0,0 +1,608 @@
{
"reference": "UserInterface/PythonSkill.cpp",
"reference_sha256": "c3c5d946aa801cbcc2a42c32e1c77ae59113a263f5618faaa8e15fc77b903fac",
"priority": "P1",
"contracts": [],
"functions": {
"SplitLine": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:SplitLine"
]
},
"string_replace_word": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:string_replace_word"
]
},
"CPythonSkill::RegisterSkillTable": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::RegisterSkillTable"
]
},
"CPythonSkill::__RegisterGradeIconImage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::__RegisterGradeIconImage"
]
},
"CPythonSkill::__RegisterNormalIconImage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::__RegisterNormalIconImage"
]
},
"CPythonSkill::RegisterSkillDesc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::RegisterSkillDesc"
]
},
"CPythonSkill::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::Destroy"
]
},
"CPythonSkill::RegisterSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::RegisterSkill"
]
},
"CPythonSkill::GetSkillData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::GetSkillData"
]
},
"CPythonSkill::GetSkillDataByName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::GetSkillDataByName"
]
},
"CPythonSkill::SetPathName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SetPathName"
]
},
"CPythonSkill::GetPathName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::GetPathName"
]
},
"CPythonSkill::TEST": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::TEST"
]
},
"CPythonSkill::CPythonSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::CPythonSkill"
]
},
"CPythonSkill::~CPythonSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::~CPythonSkill"
]
},
"CPythonSkill::SSkillData::GetName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetName"
]
},
"CPythonSkill::SSkillData::GetType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetType"
]
},
"CPythonSkill::SSkillData::IsMeleeSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsMeleeSkill"
]
},
"CPythonSkill::SSkillData::IsChargeSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsChargeSkill"
]
},
"CPythonSkill::SSkillData::IsOnlyForGuildWar": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsOnlyForGuildWar"
]
},
"CPythonSkill::SSkillData::GetTargetRange": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetTargetRange"
]
},
"CPythonSkill::SSkillData::CanChangeDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::CanChangeDirection"
]
},
"CPythonSkill::SSkillData::IsFanRange": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsFanRange"
]
},
"CPythonSkill::SSkillData::IsCircleRange": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsCircleRange"
]
},
"CPythonSkill::SSkillData::IsAutoSearchTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsAutoSearchTarget"
]
},
"CPythonSkill::SSkillData::IsNeedCorpse": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNeedCorpse"
]
},
"CPythonSkill::SSkillData::IsNeedTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNeedTarget"
]
},
"CPythonSkill::SSkillData::IsToggleSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsToggleSkill"
]
},
"CPythonSkill::SSkillData::IsUseHPSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsUseHPSkill"
]
},
"CPythonSkill::SSkillData::IsStandingSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsStandingSkill"
]
},
"CPythonSkill::SSkillData::CanUseWeaponType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::CanUseWeaponType"
]
},
"CPythonSkill::SSkillData::IsOnlyForAlliance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsOnlyForAlliance"
]
},
"CPythonSkill::SSkillData::CanUseForMe": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::CanUseForMe"
]
},
"CPythonSkill::SSkillData::CanUseIfNotEnough": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::CanUseIfNotEnough"
]
},
"CPythonSkill::SSkillData::IsNeedEmptyBottle": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNeedEmptyBottle"
]
},
"CPythonSkill::SSkillData::IsNeedPoisonBottle": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNeedPoisonBottle"
]
},
"CPythonSkill::SSkillData::IsNeedBow": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNeedBow"
]
},
"CPythonSkill::SSkillData::IsHorseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsHorseSkill"
]
},
"CPythonSkill::SSkillData::IsMovingSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsMovingSkill"
]
},
"CPythonSkill::SSkillData::IsAttackSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsAttackSkill"
]
},
"CPythonSkill::SSkillData::IsTimeIncreaseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsTimeIncreaseSkill"
]
},
"CPythonSkill::SSkillData::GetState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetState"
]
},
"CPythonSkill::SSkillData::ProcessFormula": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::ProcessFormula"
]
},
"CPythonSkill::SSkillData::GetAffectDescription": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetAffectDescription"
]
},
"CPythonSkill::SSkillData::GetSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetSkillCoolTime"
]
},
"CPythonSkill::SSkillData::GetTargetCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetTargetCount"
]
},
"CPythonSkill::SSkillData::GetSkillMotionIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetSkillMotionIndex"
]
},
"CPythonSkill::SSkillData::GetMaxLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetMaxLevel"
]
},
"CPythonSkill::SSkillData::GetLevelUpPoint": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetLevelUpPoint"
]
},
"CPythonSkill::SSkillData::IsNoMotion": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsNoMotion"
]
},
"CPythonSkill::SSkillData::IsCanUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::IsCanUseSkill"
]
},
"CPythonSkill::SSkillData::GetMotionLoopCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetMotionLoopCount"
]
},
"CPythonSkill::SSkillData::GetNeedSP": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetNeedSP"
]
},
"CPythonSkill::SSkillData::GetContinuationSP": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetContinuationSP"
]
},
"CPythonSkill::SSkillData::GetDuration": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::GetDuration"
]
},
"CPythonSkill::SSkillData::SSkillData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:CPythonSkill::SSkillData::SSkillData"
]
},
"skillSetPathName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillSetPathName"
]
},
"skillRegisterSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillRegisterSkill"
]
},
"skillLoadSkillData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillLoadSkillData"
]
},
"skillRegisterSkillDesc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillRegisterSkillDesc"
]
},
"skillClearSkillData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillClearSkillData"
]
},
"skillGetSkillName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillName"
]
},
"skillGetSkillDescription": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillDescription"
]
},
"skillGetSkillType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillType"
]
},
"skillGetSkillConditionDescriptionCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillConditionDescriptionCount"
]
},
"skillGetSkillConditionDescription": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillConditionDescription"
]
},
"skillGetSkillAffectDescriptionCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillAffectDescriptionCount"
]
},
"skillGetSkillAffectDescription": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillAffectDescription"
]
},
"skillGetSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillCoolTime"
]
},
"skillGetSkillNeedSP": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillNeedSP"
]
},
"skillGetSkillContinuationSP": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillContinuationSP"
]
},
"skillGetSkillMaxLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillMaxLevel"
]
},
"skillGetSkillLevelUpPoint": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillLevelUpPoint"
]
},
"skillGetSkillLevelLimit": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillLevelLimit"
]
},
"skillIsSkillRequirement": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillIsSkillRequirement"
]
},
"skillGetSkillRequirementData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillRequirementData"
]
},
"skillGetSkillRequireStatCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillRequireStatCount"
]
},
"skillGetSkillRequireStatData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetSkillRequireStatData"
]
},
"skillCanLevelUpSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillCanLevelUpSkill"
]
},
"skillCheckRequirementSueccess": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillCheckRequirementSueccess"
]
},
"skillGetNeedCharacterLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetNeedCharacterLevel"
]
},
"skillIsToggleSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillIsToggleSkill"
]
},
"skillIsUseHPSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillIsUseHPSkill"
]
},
"skillIsStandingSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillIsStandingSkill"
]
},
"skillCanUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillCanUseSkill"
]
},
"skillIsLevelUpSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillIsLevelUpSkill"
]
},
"skillGetIconName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetIconName"
]
},
"skillGetIconImage": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetIconImage"
],
"note": "Returns/reads the pointer through Py_BuildPointer/PyTuple_GetPointer instead of Py_BuildValue(\"i\")/PyTuple_GetInteger: 40250 is ILP32, a 64-bit pointer truncated in \"i\" crashed wndMgr.SetSlot.",
"test": "extension/tests/port_login_flow_test.cpp (port.login_flow in-game step: grade icon image + icon instance round trip)"
},
"skillGetIconInstance": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetIconInstance"
],
"note": "Returns/reads the pointer through Py_BuildPointer/PyTuple_GetPointer instead of Py_BuildValue(\"i\")/PyTuple_GetInteger: 40250 is ILP32, a 64-bit pointer truncated in \"i\" crashed wndMgr.SetSlot.",
"test": "extension/tests/port_login_flow_test.cpp (port.login_flow in-game step: grade icon image + icon instance round trip)"
},
"skillGetIconImageNew": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetIconImageNew"
],
"note": "Returns/reads the pointer through Py_BuildPointer/PyTuple_GetPointer instead of Py_BuildValue(\"i\")/PyTuple_GetInteger: 40250 is ILP32, a 64-bit pointer truncated in \"i\" crashed wndMgr.SetSlot.",
"test": "extension/tests/port_login_flow_test.cpp (port.login_flow in-game step: grade icon image + icon instance round trip)"
},
"skillGetIconInstanceNew": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetIconInstanceNew"
],
"note": "Returns/reads the pointer through Py_BuildPointer/PyTuple_GetPointer instead of Py_BuildValue(\"i\")/PyTuple_GetInteger: 40250 is ILP32, a 64-bit pointer truncated in \"i\" crashed wndMgr.SetSlot.",
"test": "extension/tests/port_login_flow_test.cpp (port.login_flow in-game step: grade icon image + icon instance round trip)"
},
"skillDeleteIconInstance": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillDeleteIconInstance"
],
"note": "Returns/reads the pointer through Py_BuildPointer/PyTuple_GetPointer instead of Py_BuildValue(\"i\")/PyTuple_GetInteger: 40250 is ILP32, a 64-bit pointer truncated in \"i\" crashed wndMgr.SetSlot.",
"test": "extension/tests/port_login_flow_test.cpp (port.login_flow in-game step: grade icon image + icon instance round trip)"
},
"skillGetGradeData": {
"status": "ADAPTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetGradeData"
],
"note": "40250 passes the non-trivial TGradeData through varargs (\"i\" reads its first 4 bytes); clang rejects that, so the same first 4 bytes are read explicitly. No root script calls skill.GetGradeData.",
"test": "extension/tests/port_login_flow_test.cpp (module imports; function unused by root scripts)"
},
"skillGetNewAffectDataCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetNewAffectDataCount"
]
},
"skillGetNewAffectData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetNewAffectData"
]
},
"skillGetDuration": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillGetDuration"
]
},
"skillTEST": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:skillTEST"
]
},
"initskill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonSkill.cpp:initskill"
]
}
}
}