port: PythonItem + item module (batch 2 P3-b)

Verbatim 40250 CPythonItem and the item Python module replace the
pending stand-in and the module stub; CPythonApplication::Create calls
m_pyItem.Create() in 40250 order. itemGetIconImage returns its handle
through Py_BuildPointer (the ILP32 int truncated it and wndMgr.SetSlot
crashed on the live inventory). CMapManager::GetNormal evaluates
CTerrain::CalculateNormal on the native height tile; the item text-tail
members stay stubs, Pick answering -1 like an empty tail map.

The fake server drops vnum 19 next to the actor at entergame and answers
CG_ITEM_PICKUP with GC_ITEM_GROUND_DEL; login_flow picks it up through
player.PickCloseItem and checks item.SelectItem(19).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-24 00:50:16 +09:00
co-authored by Claude Opus 5.5
parent f0564a7f12
commit 9298500df9
19 changed files with 2178 additions and 454 deletions
@@ -0,0 +1,194 @@
{
"reference": "UserInterface/PythonItem.cpp",
"reference_sha256": "8917e3780091f01c584e180677000fa971c2d8d12a6d2da5a6f9e1588d567937",
"priority": "P3",
"contracts": [],
"functions": {
"CPythonItem::GetInfo": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetInfo"
]
},
"CPythonItem::TGroundItemInstance::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::TGroundItemInstance::Clear"
]
},
"CPythonItem::TGroundItemInstance::__PlayDropSound": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::TGroundItemInstance::__PlayDropSound"
]
},
"CPythonItem::TGroundItemInstance::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::TGroundItemInstance::Update"
]
},
"CPythonItem::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::Update"
]
},
"CPythonItem::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::Render"
]
},
"CPythonItem::SetUseSoundFileName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::SetUseSoundFileName"
]
},
"CPythonItem::SetDropSoundFileName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::SetDropSoundFileName"
]
},
"CPythonItem::PlayUseSound": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::PlayUseSound"
]
},
"CPythonItem::PlayDropSound": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::PlayDropSound"
]
},
"CPythonItem::PlayUsePotionSound": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::PlayUsePotionSound"
]
},
"CPythonItem::__GetDropSoundType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::__GetDropSoundType"
]
},
"CPythonItem::__GetUseSoundType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::__GetUseSoundType"
]
},
"CPythonItem::CreateItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::CreateItem"
]
},
"CPythonItem::SetOwnership": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::SetOwnership"
]
},
"CPythonItem::GetOwnership": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetOwnership"
]
},
"CPythonItem::DeleteAllItems": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::DeleteAllItems"
]
},
"CPythonItem::DeleteItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::DeleteItem"
]
},
"CPythonItem::GetCloseMoney": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetCloseMoney"
]
},
"CPythonItem::GetCloseItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetCloseItem"
]
},
"CPythonItem::GetGroundItemPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetGroundItemPosition"
]
},
"CPythonItem::__Pick": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::__Pick"
]
},
"CPythonItem::GetPickedItemID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetPickedItemID"
]
},
"CPythonItem::GetVirtualNumberOfGroundItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetVirtualNumberOfGroundItem"
]
},
"CPythonItem::BuildNoGradeNameData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::BuildNoGradeNameData"
]
},
"CPythonItem::GetNoGradeNameDataCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetNoGradeNameDataCount"
]
},
"CPythonItem::GetNoGradeNameDataPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::GetNoGradeNameDataPtr"
]
},
"CPythonItem::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::Destroy"
]
},
"CPythonItem::Create": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::Create"
]
},
"CPythonItem::CPythonItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::CPythonItem"
]
},
"CPythonItem::~CPythonItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonItem.cpp:CPythonItem::~CPythonItem"
]
}
}
}