2V3-b: click on the ground to walk; read the terrain attribute map

CScreen::SetCursorPosition and CPythonGraphic::SetCursorPosition are the 40250
bodies, so RenderGame builds the pick ray under the cursor each frame.
CPythonBackground::GetPickingPoint* march that ray as
CMapOutdoor::__PickTerrainHeight does, against the native CMapManager height
(PR_FLOAT_TO_INT's x87 rounding becomes floor); object picking waits for
CMapOutdoor. CMapManager::isAttrOn reads the packed <map>/<xxxyyy>/attr.atr
as CMapOutdoor::isAttrOn + CTerrain::isAttrOn do, and CheckAdvancing with its
collision checkers is verbatim (no map objects are registered yet). All of
this stays in the pending/platform layer and is marked ADAPTED.

port.login_flow clicks the ground below the actor after the key walk. The
actor walks to the picked point (334 cm offline), and the fake server sees
FUNC_MOVE, then FUNC_WAIT. It also checks that the actor's cell is free and
that its terrain block has blocked cells. port.login_live against the real
server passed (key 133 cm, click 296 cm), and python_game_render_test.sh
passes offline. MT_TEST_MODE=python_ui now adds the 3D surface, so the port
route can be played by hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 23:57:34 +09:00
co-authored by Claude Opus 5.5
parent ff0983d3c8
commit 8b4700f008
12 changed files with 627 additions and 46 deletions
+42 -13
View File
@@ -12,13 +12,17 @@
},
"CMapManager::CMapManager": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::CMapManager"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::CMapManager"
],
"note": "Constructor matches 40250; kept in pending file until CMapOutdoor is ported.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::~CMapManager": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::~CMapManager"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::~CMapManager"
],
"note": "Calls transition adapter Destroy, which frees pack-backed map state.",
"test": "project/python_game_render_test.gd"
},
@@ -30,25 +34,33 @@
},
"CMapManager::Initialize": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Initialize"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Initialize"
],
"note": "40250 AtlasInfo loading order; pack text parsed in transition adapter.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::Create": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Create"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Create"
],
"note": "No CMapOutdoor allocation yet; Metin2World renders terrain.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::Destroy": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Destroy"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Destroy"
],
"note": "Frees transition map and environment data; CMapOutdoor cleanup remains TODO.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::Clear": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Clear"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::Clear"
],
"note": "Clears pack-backed terrain state, not CMapOutdoor.",
"test": "project/python_game_render_test.gd"
},
@@ -60,13 +72,17 @@
},
"CMapManager::LoadMap": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::LoadMap"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::LoadMap"
],
"note": "Loads Setting.txt, initial height tile and .msenv from 40250 packs for reachable Warp chain; outdoor scene lifecycle remains TODO.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::IsMapReady": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::IsMapReady"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::IsMapReady"
],
"note": "Reports pack-backed transition map readiness instead of CMapOutdoor::IsReady.",
"test": "project/python_game_render_test.gd"
},
@@ -81,7 +97,9 @@
},
"CMapManager::GetHeight": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::GetHeight"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::GetHeight"
],
"note": "Uses the 40250 terrain triangle interpolation on packed height.raw; placed-object height remains TODO.",
"test": "project/python_game_render_test.gd"
},
@@ -93,13 +111,17 @@
},
"CMapManager::BeginEnvironment": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::BeginEnvironment"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::BeginEnvironment"
],
"note": "Applies .msenv material/background light through RecordingDevice; fog and full CMapOutdoor environment remain TODO.",
"test": "project/python_game_render_test.gd"
},
"CMapManager::EndEnvironment": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::EndEnvironment"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::EndEnvironment"
],
"note": "Restores recorded lighting state; full environment state restoration remains TODO.",
"test": "project/python_game_render_test.gd"
},
@@ -158,7 +180,12 @@
"status": "TODO"
},
"CMapManager::isAttrOn": {
"status": "TODO"
"status": "ADAPTED",
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::isAttrOn"
],
"test": "extension/tests/port_login_flow_test.cpp",
"note": "CMapOutdoor::isAttrOn + CTerrain::isAttrOn verbatim over native attr.atr tiles (Setting.txt map size instead of the CTerrain list)."
},
"CMapManager::GetAttr": {
"status": "TODO"
@@ -177,7 +204,9 @@
},
"CMapManager::__LoadMapInfoVector": {
"status": "ADAPTED",
"impl": ["extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::__LoadMapInfoVector"],
"impl": [
"extension/src/platform/pending/GameLib/MapManager.cpp:CMapManager::__LoadMapInfoVector"
],
"note": "Reads packed AtlasInfo bounds with 40250 terrain tile size; parser is transitional.",
"test": "project/python_game_render_test.gd"
}