2V3-a: walk with the keyboard through the ported player chain

PythonPlayer, PythonPlayerInput{,Keyboard,Mouse}, PythonPlayerEventHandler,
PythonPlayerSkill, PythonPlayerModule and GameType are verbatim copies; the
`player` stub module and the pending PythonPlayer/GameType stand-ins are gone.
Unported callees (CPythonSkill, CItemData, CItemManager, CPythonItem, ...) are
pending stubs. 64-bit fixes: emotion icon handles use Py_BuildPointer, and
PyDict_Next takes Py_ssize_t.

The actor did not move because GrannyUpdateModelMatrix passed the model matrix
through. Walk/run motions use constant root-motion extraction
(AccumulationFlags=AccumulationExtracted, LoopTranslation e.g. (0,-300,0) for
the warrior run, same as the .msa Accumulation). libgr2 now reads both fields
from TrackGroups[0], and the runtime moves by LoopTranslation over each
control's local-clock span, blended by control weight. VDA extraction is not
implemented.

port.login_flow presses DIK_UP; the actor walks more than 100 cm, and the fake
server parses CG packets and sees CG_MOVE FUNC_MOVE, then FUNC_WAIT at the new
position. port.login_live against the real server walked 132 cm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 23:41:31 +09:00
co-authored by Claude Opus 5.5
parent 157f7c3bb4
commit ff0983d3c8
39 changed files with 10170 additions and 2039 deletions
@@ -0,0 +1,302 @@
{
"reference": "UserInterface/PythonPlayerInput.cpp",
"reference_sha256": "a1967697f9d0b96bbcdaab5b73c9fc6473739e29281cd96d1d87d0a7af496ea8",
"priority": "P0",
"contracts": [],
"functions": {
"CPythonPlayer::__GetPickableDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetPickableDistance"
]
},
"CPythonPlayer::PickCloseMoney": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::PickCloseMoney"
]
},
"CPythonPlayer::PickCloseItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::PickCloseItem"
]
},
"CPythonPlayer::__IsTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsTarget"
]
},
"CPythonPlayer::__IsSameTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsSameTargetVID"
]
},
"CPythonPlayer::__GetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetTargetVID"
]
},
"CPythonPlayer::GetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::GetTargetVID"
]
},
"CPythonPlayer::__GetTargetActorPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetTargetActorPtr"
]
},
"CPythonPlayer::__SetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__SetTargetVID"
]
},
"CPythonPlayer::__ClearTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearTarget"
]
},
"CPythonPlayer::SetTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::SetTarget"
]
},
"CPythonPlayer::__ChangeTargetToPickedInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ChangeTargetToPickedInstance"
]
},
"CPythonPlayer::__GetSkillTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetSkillTargetInstancePtr"
]
},
"CPythonPlayer::__GetDeadTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetDeadTargetInstancePtr"
]
},
"CPythonPlayer::__GetAliveTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetAliveTargetInstancePtr"
]
},
"CPythonPlayer::OpenCharacterMenu": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::OpenCharacterMenu"
]
},
"CPythonPlayer::__OnClickItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickItem"
]
},
"CPythonPlayer::__OnClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickActor"
]
},
"CPythonPlayer::__OnPressActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressActor"
]
},
"CPythonPlayer::__OnPressItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressItem"
]
},
"CPythonPlayer::__OnClickGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickGround"
]
},
"CPythonPlayer::SetMovableGroundDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::SetMovableGroundDistance"
]
},
"CPythonPlayer::__IsMovableGroundDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsMovableGroundDistance"
]
},
"CPythonPlayer::__OnPressGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressGround"
]
},
"CPythonPlayer::__OnPressScreen": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressScreen"
]
},
"CPythonPlayer::NEW_MoveToDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_MoveToDirection"
]
},
"CPythonPlayer::NEW_Stop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Stop"
]
},
"CPythonPlayer::NEW_CancelFishing": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_CancelFishing"
]
},
"CPythonPlayer::NEW_Fishing": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Fishing"
]
},
"CPythonPlayer::NEW_Attack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Attack"
]
},
"CPythonPlayer::NEW_IsEmptyReservedDelayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_IsEmptyReservedDelayTime"
]
},
"CPythonPlayer::NEW_SetAutoCameraRotationSpeed": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_SetAutoCameraRotationSpeed"
]
},
"CPythonPlayer::NEW_ResetCameraRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_ResetCameraRotation"
]
},
"CPythonPlayer::__CanShot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanShot"
]
},
"CPythonPlayer::__CanChangeTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanChangeTarget"
]
},
"CPythonPlayer::__CanMove": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanMove"
]
},
"CPythonPlayer::__CanAttack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanAttack"
]
},
"CPythonPlayer::NEW_GetMultiKeyDirRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_GetMultiKeyDirRotation"
]
},
"CPythonPlayer::NEW_GetMouseDirRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_GetMouseDirRotation"
]
},
"CPythonPlayer::GetDegreeFromPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::GetDegreeFromPosition"
]
},
"CPythonPlayer::__ClearReservedAction": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearReservedAction"
]
},
"CPythonPlayer::__ReserveClickItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickItem"
]
},
"CPythonPlayer::__ReserveClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickActor"
]
},
"CPythonPlayer::__ReserveClickGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickGround"
]
},
"CPythonPlayer::__IsReservedUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsReservedUseSkill"
]
},
"CPythonPlayer::__ReserveUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveUseSkill"
]
},
"CPythonPlayer::__ClearAutoAttackTargetActorID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearAutoAttackTargetActorID"
]
},
"CPythonPlayer::__SetAutoAttackTargetActorID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__SetAutoAttackTargetActorID"
]
},
"CPythonPlayer::__ReserveProcess_ClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveProcess_ClickActor"
]
}
}
}