From 05de62119961a6daaec118b231a1fc6a473e0a1f Mon Sep 17 00:00:00 2001 From: shenlei Date: Thu, 24 Sep 2026 00:02:17 +0900 Subject: [PATCH] port: mark PythonCharacterManager + InstanceBaseMovement PORTED (batch 2 P0) Both units were copied verbatim in 2V2-b and are on the running path since 2V3; diffed against 40250 (only include case, comment encoding and two PORT edits) and no duplicate definitions outside port/. P0 queue is empty. Co-Authored-By: Claude Opus 5.5 --- audit/history.jsonl | 1 + .../InstanceBaseMovement.cpp.json | 161 ++++++++--- .../PythonCharacterManager.cpp.json | 271 ++++++++++++++---- docs/PORT-PLAN.md | 1 + 4 files changed, 348 insertions(+), 86 deletions(-) diff --git a/audit/history.jsonl b/audit/history.jsonl index bb3bb3b8..ef0f3029 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -526,3 +526,4 @@ {"time":"2026-09-23T13:09:00Z","event":"test_run","id":"PORT-PLAN 2V2-e.5","result":"PASS","tests":["script/port_gate.sh macos: PASS (12 port tests; port.login_live skipped without MT_LIVE_*)","script/python_game_render_test.sh: PASS (4/4 native light0, finite camera matrix, 0.1 cm foot-ground difference, 559 terrain texture contrasts)","port_map.py check: 0 errors","git diff --check: PASS"],"reason":"The first sandboxed port gate run denied localhost sockets; loopback-enabled rerun passed. Full CMapOutdoor and live/cross-map evidence remain outstanding."} {"time": "2026-09-23T14:45:00Z", "event": "port_round", "unit": "PORT-PLAN 2V3-a: player/input/event handler chain and Granny root motion", "ported": ["UserInterface/PythonPlayer.cpp", "UserInterface/PythonPlayerInput.cpp", "UserInterface/PythonPlayerInputKeyboard.cpp", "UserInterface/PythonPlayerInputMouse.cpp", "UserInterface/PythonPlayerEventHandler.cpp", "UserInterface/PythonPlayerSkill.cpp", "UserInterface/PythonPlayerModule.cpp", "UserInterface/GameType.cpp"], "adapted": ["GrannyUpdateModelMatrix constant-extraction root motion from TrackGroups[0] AccumulationFlags/LoopTranslation (libgr2)"], "divergent": ["VDA accumulation not implemented", "CPythonSkill/CItemData/CItemManager/CPythonItem callees remain pending stubs"], "needs_live": [], "tests": ["port.login_flow: DIK_UP walked 108 cm; fake server got CG_MOVE FUNC_MOVE then FUNC_WAIT at moved y", "port.login_live 192.168.21.203: PASS, walked 132 cm", "ctest all: PASS (login_live skipped without MT_LIVE_*)", "port_map.py check: 0 errors"], "todo": ["mouse click-to-move and attack", "CheckAdvancing/map attribute stubs", "delete legacy movement when default route switches to port"]} {"time": "2026-09-23T15:00:00Z", "event": "port_round", "unit": "PORT-PLAN 2V3-b: click-to-move, terrain picking and attribute map", "ported": [], "adapted": ["CScreen::SetCursorPosition / CPythonGraphic::SetCursorPosition verbatim in platform layer", "CPythonBackground::GetPickingPoint* terrain half via CMapOutdoor::__PickTerrainHeight over native height", "CMapManager::isAttrOn via CMapOutdoor/CTerrain::isAttrOn over packed attr.atr", "CPythonBackground::CheckAdvancing + collision checkers verbatim (no map objects registered yet)"], "divergent": ["object picking and object collision wait for CMapOutdoor"], "needs_live": [], "tests": ["port.login_flow: click walked 334 cm, FUNC_MOVE..FUNC_WAIT; 17814 blocked cells", "port.login_live 192.168.21.203: PASS (key 133 cm, click 296 cm, 11406 blocked cells)", "script/python_game_render_test.sh offline: PASS", "ctest all: 19/19 (login_live skipped without env)", "port_map.py check: 0 errors"], "todo": ["switch client_main default to the port route and delete the legacy GDScript client"]} +{"time": "2026-09-24T02:00:00Z", "event": "port_round", "unit": "PORT-PLAN batch 2 P0: UserInterface/PythonCharacterManager.cpp + InstanceBaseMovement.cpp", "ported": ["UserInterface/PythonCharacterManager.cpp (54)", "UserInterface/InstanceBaseMovement.cpp (32)"], "adapted": [], "divergent": [], "needs_live": [], "tests": ["diff vs 40250: include case, comment encoding, 2 PORT edits only", "ctest all: 19/19 incl. port.login_live 192.168.21.203", "port_map.py check: 0 errors"], "todo": ["P1 queue: FlyingInstance, ActorInstanceData, FlyingObjectManager, FlyTrace"]} diff --git a/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json b/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json index dbebc745..2d2d28a1 100644 --- a/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json +++ b/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json @@ -5,100 +5,197 @@ "contracts": [], "functions": { "CInstanceBase::SetAttackSpeed": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetAttackSpeed" + ] }, "CInstanceBase::SetMoveSpeed": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetMoveSpeed" + ] }, "CInstanceBase::SetRotationSpeed": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetRotationSpeed" + ] }, "CInstanceBase::NEW_Stop": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_Stop" + ] }, "CInstanceBase::NEW_SyncPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_SyncPixelPosition" + ], + "note": "verbatim apart from the signature: 40250 Win32 long is 32-bit, so the references are LONG & to keep the header's 32-bit type on LP64." }, "CInstanceBase::NEW_CanMoveToDestPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_CanMoveToDestPixelPosition" + ] }, "CInstanceBase_GetDegreeFromPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase_GetDegreeFromPosition" + ] }, "CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition" + ] }, "CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition" + ] }, "CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition" + ] }, "CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition" + ] }, "CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition" + ] }, "CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition" + ] }, "CInstanceBase::SetAdvancingRotation": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetAdvancingRotation" + ] }, "CInstanceBase::StartWalking": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::StartWalking" + ] }, "CInstanceBase::EndWalking": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::EndWalking" + ] }, "CInstanceBase::EndWalkingWithoutBlending": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::EndWalkingWithoutBlending" + ] }, "CInstanceBase::IsWaiting": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsWaiting" + ] }, "CInstanceBase::IsWalking": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsWalking" + ] }, "CInstanceBase::IsPushing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsPushing" + ] }, "CInstanceBase::IsAttacked": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsAttacked" + ] }, "CInstanceBase::IsKnockDown": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsKnockDown" + ] }, "CInstanceBase::IsAttacking": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsAttacking" + ] }, "CInstanceBase::IsActingEmotion": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsActingEmotion" + ] }, "CInstanceBase::IsGoing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::IsGoing" + ] }, "CInstanceBase::NEW_MoveToDestInstanceDirection": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_MoveToDestInstanceDirection" + ] }, "CInstanceBase::NEW_MoveToDestPixelPositionDirection": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_MoveToDestPixelPositionDirection" + ] }, "CInstanceBase::NEW_Goto": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_Goto" + ] }, "CInstanceBase::NEW_MoveToDirection": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::NEW_MoveToDirection" + ] }, "CInstanceBase::EndGoing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::EndGoing" + ] }, "CInstanceBase::SetRunMode": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetRunMode" + ] }, "CInstanceBase::SetWalkMode": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/InstanceBaseMovement.cpp:CInstanceBase::SetWalkMode" + ] } } } diff --git a/audit/port-map/UserInterface/PythonCharacterManager.cpp.json b/audit/port-map/UserInterface/PythonCharacterManager.cpp.json index 3ed393a2..bb31eee6 100644 --- a/audit/port-map/UserInterface/PythonCharacterManager.cpp.json +++ b/audit/port-map/UserInterface/PythonCharacterManager.cpp.json @@ -5,166 +5,329 @@ "contracts": [], "functions": { "CPythonCharacterManager::AdjustCollisionWithOtherObjects": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::AdjustCollisionWithOtherObjects" + ] }, "CPythonCharacterManager::EnableSortRendering": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::EnableSortRendering" + ] }, "CPythonCharacterManager::InsertPVPKey": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::InsertPVPKey" + ] }, "CPythonCharacterManager::RemovePVPKey": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RemovePVPKey" + ] }, "CPythonCharacterManager::ChangeGVG": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::ChangeGVG" + ] }, "CPythonCharacterManager::ClearMainInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::ClearMainInstance" + ] }, "CPythonCharacterManager::SetMainInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::SetMainInstance" + ] }, "CPythonCharacterManager::GetMainInstancePtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetMainInstancePtr" + ] }, "CPythonCharacterManager::GetInfo": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetInfo" + ] }, "CPythonCharacterManager::IsCacheMode": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::IsCacheMode" + ] }, "CPythonCharacterManager::Update": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::Update" + ] }, "CPythonCharacterManager::ShowPointEffect": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::ShowPointEffect" + ] }, "CPythonCharacterManager::RegisterPointEffect": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RegisterPointEffect" + ] }, "CPythonCharacterManager::UpdateTransform": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::UpdateTransform" + ] }, "CPythonCharacterManager::UpdateDeleting": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::UpdateDeleting" + ] }, "CPythonCharacterManager::Deform": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::Deform" + ] }, "CPythonCharacterManager::OLD_GetPickedInstanceVID": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::OLD_GetPickedInstanceVID" + ] }, "CPythonCharacterManager::OLD_GetPickedInstancePtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::OLD_GetPickedInstancePtr" + ] }, "CPythonCharacterManager::OLD_GetPickedInstPosReference": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::OLD_GetPickedInstPosReference" + ] }, "CPythonCharacterManager::IsRegisteredVID": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::IsRegisteredVID" + ] }, "CPythonCharacterManager::IsAliveVID": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::IsAliveVID" + ] }, "CPythonCharacterManager::IsDeadVID": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::IsDeadVID" + ] }, "CPythonCharacterManager::__RenderSortedAliveActorList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__RenderSortedAliveActorList" + ] }, "CPythonCharacterManager::__RenderSortedDeadActorList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__RenderSortedDeadActorList" + ] }, "CPythonCharacterManager::Render": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::Render" + ] }, "CPythonCharacterManager::RenderShadowMainInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RenderShadowMainInstance" + ] }, "CPythonCharacterManager::RenderShadowAllInstances": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RenderShadowAllInstances" + ] }, "CPythonCharacterManager::RenderCollision": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RenderCollision" + ] }, "CPythonCharacterManager::CreateInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::CreateInstance" + ], + "note": "verbatim apart from one PORT fix: the ALREADY EXIST TraceError passed the whole SCreateData struct through varargs (MSVC tolerated it); it now passes c_rkCreateData.m_dwVID." }, "CPythonCharacterManager::RegisterInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RegisterInstance" + ] }, "CPythonCharacterManager::DeleteInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::DeleteInstance" + ] }, "CPythonCharacterManager::__DeleteBlendOutInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__DeleteBlendOutInstance" + ] }, "CPythonCharacterManager::DeleteInstanceByFade": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::DeleteInstanceByFade" + ] }, "CPythonCharacterManager::SelectInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::SelectInstance" + ] }, "CPythonCharacterManager::GetInstancePtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetInstancePtr" + ] }, "CPythonCharacterManager::GetInstancePtrByName": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetInstancePtrByName" + ] }, "CPythonCharacterManager::GetSelectedInstancePtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetSelectedInstancePtr" + ] }, "CPythonCharacterManager::FindClickableInstancePtr": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::FindClickableInstancePtr" + ] }, "CPythonCharacterManager::__UpdateSortPickedActorList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__UpdateSortPickedActorList" + ] }, "CPythonCharacterManager::__UpdatePickedActorList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__UpdatePickedActorList" + ] }, "CPythonCharacterManager::__SortPickedActorList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__SortPickedActorList" + ] }, "CPythonCharacterManager::__NEW_Pick": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__NEW_Pick" + ] }, "CPythonCharacterManager::__OLD_Pick": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__OLD_Pick" + ] }, "CPythonCharacterManager::PickAll": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::PickAll" + ] }, "CPythonCharacterManager::GetCloseInstance": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::GetCloseInstance" + ] }, "CPythonCharacterManager::RefreshAllPCTextTail": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RefreshAllPCTextTail" + ] }, "CPythonCharacterManager::RefreshAllGuildMark": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::RefreshAllGuildMark" + ] }, "CPythonCharacterManager::DeleteAllInstances": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::DeleteAllInstances" + ] }, "CPythonCharacterManager::DestroyAliveInstanceMap": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::DestroyAliveInstanceMap" + ] }, "CPythonCharacterManager::DestroyDeadInstanceList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::DestroyDeadInstanceList" + ] }, "CPythonCharacterManager::Destroy": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::Destroy" + ] }, "CPythonCharacterManager::__Initialize": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::__Initialize" + ] }, "CPythonCharacterManager::CPythonCharacterManager": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::CPythonCharacterManager" + ] }, "CPythonCharacterManager::~CPythonCharacterManager": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonCharacterManager.cpp:CPythonCharacterManager::~CPythonCharacterManager" + ] } } } diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 80bd40e5..593c2540 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -431,6 +431,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 改变位置/朝向、发送与 40250 相同的移动封包,并在离线边界测试和真服 smoke 中通过。接通时删除对应 legacy 玩法逻辑。 2V3-a(2026-09-23):`PythonPlayer`、`PythonPlayerInput`/`InputKeyboard`/`InputMouse`、`PythonPlayerEventHandler`、`PythonPlayerSkill`、`PythonPlayerModule`、`GameType` 原样移植(port-map 标 PORTED),`GameplayModules.cpp` 的 `player` 桩删除,`initPlayer()` 按 40250 顺序在 `initchrmgr()` 后调用;`pending/UserInterface/{PythonPlayer,GameType}.cpp` 替身删除,其余被调方(`CPythonSkill`、`CItemData`、`CItemManager`、`CPythonItem` 等)进 `pending`。64 位修正:`playerGetEmotionIconImage` 用 `Py_BuildPointer`,`PyDict_Next` 用 `Py_ssize_t`。根运动:Granny 运行时的 `GrannyUpdateModelMatrix` 原为直通,按 TrackGroups[0] 的 `AccumulationFlags`(AccumulationExtracted)/`LoopTranslation`(libgr2 新读出,战士 run = (0,-300,0),同 .msa `Accumulation`)按控制器本地时钟推进与权重累加位移(Delta × ModelMatrix);VDA 抽取未实现。`port.login_flow` 按 DIK_UP 经 `game.GameWindow` → `player.SetSingleDIKKeyState` 行走 >100 cm,假服解析 CG 包,收到 `CG_MOVE` FUNC_MOVE 后 FUNC_WAIT 且坐标变化;`port.login_live` 2026-09-23 对 192.168.21.203 走 132 cm 通过。(2V3-a 的待办见 2V3-b。) 2V3-b(2026-09-23):鼠标点地移动。`CScreen::SetCursorPosition`(GrpScreen.cpp:487)与 `CPythonGraphic::SetCursorPosition` 原样实现,`RenderGame` 每帧用光标建拾取射线;`CPythonBackground::GetPickingPoint`/`GetPickingPointWithRay`/`GetPickingPointWithRayOnlyTerrain` 按 `CMapOutdoor::__PickTerrainHeight` 原样沿射线步进,地形高度取 native `CMapManager::GetHeight`(`PR_FLOAT_TO_INT` 的 x87 取整按 floor),物件拾取随 `CMapOutdoor` 移植再接。`CMapManager::isAttrOn` 按 `CMapOutdoor::isAttrOn`+`CTerrain::isAttrOn` 读包内 `//attr.atr`(阻挡/水/禁 PK),`CheckAdvancing` 及两个碰撞检查器原样(地图物件未注册到 `CCullingManager` 前不会阻挡)。以上在 pending/platform 层,port-map 标 ADAPTED。`port.login_flow` 在按键行走后左键点击角色下方地面:`game.GameWindow.OnMouseLeftButtonDown` → `player.SetMouseState` → 角色走到拾取点(离线 334 cm),假服收到 FUNC_MOVE … FUNC_WAIT;另断言角色所在格不阻挡、所在地形块有阻挡格(离线 17814 格)。`port.login_live` 2026-09-23 对 192.168.21.203 通过(按键 133 cm、点地 296 cm、11406 阻挡格),`python_game_render_test.sh` 离线通过。`client_main` 的 `MT_TEST_MODE=python_ui` 加上 `python_3d_surface.gd`,新路径可手动登录进游戏走动。待办:默认路由切到 `port`(当前 `client_main` 默认仍走 GDScript `AppFlow`)后整体删除 legacy;攻击/拾取物品等 P1 战斗交互属批次 2 之后。 + 批次 2 P0 收尾(2026-09-24):`UserInterface/PythonCharacterManager.cpp`(54 函数)与 `InstanceBaseMovement.cpp`(32 函数)在 2V2-b 已原样拷入 `port/`,2V3 起即是运行路径(行走、点地移动、远程角色同步都经它们),本轮逐行比对 40250(仅 include 大小写、注释编码和两处 `// PORT:` 修正:`CreateInstance` 的 TraceError 传 `m_dwVID`,`NEW_SyncPixelPosition` 用 32 位 `LONG &`),确认 pending/platform 无重复定义后标 PORTED。P0 队列已清空;下一步按队列做 P1(`FlyingInstance`、`ActorInstanceData`、`FlyingObjectManager`、`FlyTrace`)。 每个切片都必须同时跑 legacy/port 双路回归;只有 2V3 稳定并把默认路由切到 `port` 后,才能删除总开关和剩余 legacy 宿主。