port: FlyingData/Instance/ObjectManager/FlyTrace + effect/fly modules (batch 2 P1)

Verbatim copies of the 40250 flying-object units and the effect/fly
Python modules replace the pending CFlyingManager stand-in and the two
module stubs; initeffect/initfly run after initnet as in 40250 and the
flying manager gets the background as its map manager.
CMapManager::GetTerrainHeight is added over the native height tiles.
login_flow checks playersettingmodule registered the indexed fly data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-24 00:12:19 +09:00
co-authored by Claude Opus 5.5
parent 05de621199
commit 9dcf34dffc
25 changed files with 2312 additions and 182 deletions
+1
View File
@@ -527,3 +527,4 @@
{"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"]}
{"time": "2026-09-24T03:00:00Z", "event": "port_round", "unit": "PORT-PLAN batch 2 P1: flying objects + effect/fly Python modules", "ported": ["GameLib/FlyingData.cpp (12)", "GameLib/FlyingInstance.cpp (20)", "GameLib/FlyingObjectManager.cpp (12)", "GameLib/FlyTrace.cpp (11)", "GameLib/ActorInstanceData.cpp (12)", "UserInterface/PythonEffectModule.cpp (8)", "UserInterface/PythonFlyModule.cpp (3)"], "adapted": ["CMapManager::GetTerrainHeight over native height tiles; GetHeight forwards to it"], "divergent": [], "needs_live": [], "tests": ["port.login_flow: indexed fly .msf registered by playersettingmodule and parses", "ctest all: 19/19 incl. port.login_live 192.168.21.203", "script/python_game_render_test.sh offline: PASS", "port_map.py check: 0 errors"], "todo": ["CEffectManager is a platform stub: fly effects are not rendered", "P2 network units already copied into port/ need verification and marking"]}
@@ -5,40 +5,76 @@
"contracts": [],
"functions": {
"CActorInstance::GetVirtualID": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::GetVirtualID"
]
},
"CActorInstance::SetVirtualID": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetVirtualID"
]
},
"CActorInstance::UpdateAttribute": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::UpdateAttribute"
]
},
"CActorInstance::__CreateAttributeInstance": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::__CreateAttributeInstance"
]
},
"CActorInstance::GetRace": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::GetRace"
]
},
"CActorInstance::SetRace": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetRace"
]
},
"CActorInstance::SetHair": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetHair"
]
},
"CActorInstance::SetShape": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetShape"
]
},
"CActorInstance::ChangeMaterial": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::ChangeMaterial"
]
},
"CActorInstance::GetPartItemID": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::GetPartItemID"
]
},
"CActorInstance::SetSpecularInfo": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetSpecularInfo"
]
},
"CActorInstance::SetSpecularInfoForce": {
"status": "TODO"
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/ActorInstanceData.cpp:CActorInstance::SetSpecularInfoForce"
]
}
}
}
+74
View File
@@ -0,0 +1,74 @@
{
"reference": "GameLib/FlyTrace.cpp",
"reference_sha256": "4ab3192d471aa6db4f96db5df73a0598e9f273fd9712ed1df6fa37f74517ffb4",
"priority": "P1",
"contracts": [],
"functions": {
"CFlyTrace::DestroySystem": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::DestroySystem"
]
},
"CFlyTrace::New": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::New"
]
},
"CFlyTrace::Delete": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::Delete"
]
},
"CFlyTrace::CFlyTrace": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::CFlyTrace"
]
},
"CFlyTrace::~CFlyTrace": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::~CFlyTrace"
]
},
"CFlyTrace::__Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::__Initialize"
]
},
"CFlyTrace::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::Destroy"
]
},
"CFlyTrace::UpdateNewPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::UpdateNewPosition"
]
},
"CFlyTrace::Create": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::Create"
]
},
"CFlyTrace::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::Update"
]
},
"CFlyTrace::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyTrace.cpp:CFlyTrace::Render"
]
}
}
}
@@ -0,0 +1,80 @@
{
"reference": "GameLib/FlyingData.cpp",
"reference_sha256": "2486eff11e613a658e4d5f3a1b212fe9933f1c092d3bc12f561923f181b81512",
"priority": "P4",
"contracts": [],
"functions": {
"CFlyingData::CFlyingData": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::CFlyingData"
]
},
"CFlyingData::__Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::__Initialize"
]
},
"CFlyingData::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::Destroy"
]
},
"CFlyingData::~CFlyingData": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::~CFlyingData"
]
},
"CFlyingData::SetBombEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::SetBombEffect"
]
},
"CFlyingData::GetAttachDataReference": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::GetAttachDataReference"
]
},
"CFlyingData::AttachFlyEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::AttachFlyEffect"
]
},
"CFlyingData::RemoveAttach": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::RemoveAttach"
]
},
"CFlyingData::RemoveAllAttach": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::RemoveAllAttach"
]
},
"CFlyingData::DuplicateAttach": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::DuplicateAttach"
]
},
"CFlyingData::LoadScriptFile": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::LoadScriptFile"
]
},
"CFlyingData::SaveScriptFile": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingData.cpp:CFlyingData::SaveScriptFile"
]
}
}
}
@@ -0,0 +1,128 @@
{
"reference": "GameLib/FlyingInstance.cpp",
"reference_sha256": "b58a421b74fa57b56710e5666728e7e8b16a2e2b073eeb2b349b3c20b8d00bff",
"priority": "P1",
"contracts": [],
"functions": {
"CFlyingInstance::CFlyingInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::CFlyingInstance"
]
},
"CFlyingInstance::~CFlyingInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::~CFlyingInstance"
]
},
"CFlyingInstance::__Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__Initialize"
]
},
"CFlyingInstance::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::Clear"
]
},
"CFlyingInstance::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::Destroy"
]
},
"CFlyingInstance::BuildAttachInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::BuildAttachInstance"
]
},
"CFlyingInstance::Create": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::Create"
]
},
"CFlyingInstance::__SetTargetDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__SetTargetDirection"
]
},
"CFlyingInstance::__SetTargetNormalizedDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__SetTargetNormalizedDirection"
]
},
"CFlyingInstance::SetFlyTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::SetFlyTarget"
]
},
"CFlyingInstance::AdjustDirectionForHoming": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::AdjustDirectionForHoming"
]
},
"CFlyingInstance::UpdateAttachInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::UpdateAttachInstance"
]
},
"CFlyingInstance::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::Update"
]
},
"CFlyingInstance::ClearAttachInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::ClearAttachInstance"
]
},
"CFlyingInstance::__Explode": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__Explode"
]
},
"CFlyingInstance::__Bomb": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__Bomb"
]
},
"CFlyingInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::Render"
]
},
"CFlyingInstance::RenderAttachInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::RenderAttachInstance"
]
},
"CFlyingInstance::SetDataPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::SetDataPointer"
]
},
"CFlyingInstance::__SetDataPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingInstance.cpp:CFlyingInstance::__SetDataPointer"
]
}
}
}
@@ -0,0 +1,80 @@
{
"reference": "GameLib/FlyingObjectManager.cpp",
"reference_sha256": "9b6ce94579bd3b536d12bf163175c171214250e4f88abbd03f5ebe076416b4e6",
"priority": "P1",
"contracts": [],
"functions": {
"CFlyingManager::CFlyingManager": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::CFlyingManager"
]
},
"CFlyingManager::~CFlyingManager": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::~CFlyingManager"
]
},
"CFlyingManager::__DestroyFlyingInstanceList": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::__DestroyFlyingInstanceList"
]
},
"CFlyingManager::__DestroyFlyingDataMap": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::__DestroyFlyingDataMap"
]
},
"CFlyingManager::DeleteAllInstances": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::DeleteAllInstances"
]
},
"CFlyingManager::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::Destroy"
]
},
"CFlyingManager::RegisterFlyingData": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::RegisterFlyingData"
]
},
"CFlyingManager::CreateFlyingInstanceFlyTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::CreateFlyingInstanceFlyTarget"
]
},
"CFlyingManager::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::Update"
]
},
"CFlyingManager::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::Render"
]
},
"CFlyingManager::RegisterIndexedFlyData": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::RegisterIndexedFlyData"
]
},
"CFlyingManager::CreateIndexedFly": {
"status": "PORTED",
"impl": [
"extension/src/port/GameLib/FlyingObjectManager.cpp:CFlyingManager::CreateIndexedFly"
]
}
}
}
+6 -1
View File
@@ -104,7 +104,12 @@
"test": "project/python_game_render_test.gd"
},
"CMapManager::GetTerrainHeight": {
"status": "TODO"
"status": "ADAPTED",
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::GetTerrainHeight"
],
"note": "CMapOutdoor::GetTerrainHeight: 40250 terrain triangle interpolation on packed height.raw. GetHeight forwards here until map objects are registered (CMapOutdoor::GetHeight's object half).",
"test": "extension/tests/port_login_flow_test.cpp"
},
"CMapManager::GetWaterHeight": {
"status": "TODO"
@@ -0,0 +1,56 @@
{
"reference": "UserInterface/PythonEffectModule.cpp",
"reference_sha256": "303f2a312bede11c7258f8d61b79e19643e62f7aa7afb057d566315536b88a1b",
"priority": "P4",
"contracts": [],
"functions": {
"effectRegisterEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectRegisterEffect"
]
},
"effectUpdate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectUpdate"
]
},
"effectRender": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectRender"
]
},
"effectCreateEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectCreateEffect"
]
},
"effectDeleteEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectDeleteEffect"
]
},
"effectSetPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectSetPosition"
]
},
"effectRegisterIndexedFlyData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:effectRegisterIndexedFlyData"
]
},
"initeffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonEffectModule.cpp:initeffect"
]
}
}
}
@@ -0,0 +1,26 @@
{
"reference": "UserInterface/PythonFlyModule.cpp",
"reference_sha256": "3afa92192ab630875c922b1901f1c3ea2aa9e82390121c426a74079a455841f7",
"priority": "P4",
"contracts": [],
"functions": {
"flyUpdate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonFlyModule.cpp:flyUpdate"
]
},
"flyRender": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonFlyModule.cpp:flyRender"
]
},
"initfly": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonFlyModule.cpp:initfly"
]
}
}
}