Files
mtgodot-poc/project/forest_map_render_test.gd
T

97 lines
4.6 KiB
GDScript

extends Node
## 离线加载实际鬼木林/赤鬼木林地图,并把树怪放进生产 GameScene 的实体挂载点。
## 服务器刷新、选中、战斗和掉落仍由 playable_live_test 负责。
const GameScene = preload("res://game_scene.gd")
const Fixtures = preload("res://gamescene_test.gd")
const MobView = preload("res://ui/mob_view.gd")
const Config = preload("res://testing/playable_config.gd")
const PlayableReport = preload("res://testing/playable_report.gd")
var failures := 0
func _ready() -> void:
call_deferred("run")
func _fail(message: String) -> void:
failures += 1
printerr("FOREST MAP FAIL: " + message)
func run() -> void:
var map_key := OS.get_environment("MT_FOREST_MAP")
var config_path := OS.get_environment("MT_PLAYABLE_CONFIG")
var loaded_config := Config.load_file(config_path) if not config_path.is_empty() else {"ok": false, "config": {}}
if map_key.is_empty() and loaded_config.ok:
map_key = String(loaded_config.config.get("map_key", ""))
if map_key.is_empty():
map_key = "outdoortrent/metin2_map_trent"
var race := int(OS.get_environment("MT_FOREST_MOB_RACE")) if not OS.get_environment("MT_FOREST_MOB_RACE").is_empty() else 2301
var output := OS.get_environment("MT_TEST_OUTPUT")
if output.is_empty():
output = ProjectSettings.globalize_path("res://../build/rendering/forest-map-%d" % Time.get_unix_time_from_system())
DirAccess.make_dir_recursive_absolute(output)
var playable_report := PlayableReport.new()
playable_report.begin(OS.get_environment("MT_PLAYABLE_RUN_ID"), "playable", loaded_config.config if loaded_config.ok else {})
get_tree().root.size = Vector2i(1280, 720)
print("FOREST MAP: loading %s" % map_key)
var client := Fixtures.FakeClient.new()
# Server-space values chosen inside the corresponding local map rectangle.
# GameScene/MapCoord performs the actual base-position conversion.
var base_x := 0.0 if map_key == "outdoortrent/metin2_map_trent" else 1049600.0
var server_x := base_x + 12800.0
var server_y := 12800.0
client.spawn(1000, "ForestRender", Vector3(server_x * 0.01, 0.0, -server_y * 0.01), true)
var scene := GameScene.new()
get_tree().root.add_child(scene)
await scene.setup(client, AssetRoot.path(), map_key)
print("FOREST MAP: GameScene setup complete")
if not scene._map_loaded():
_fail("map did not load: %s" % map_key)
if not scene._model_built or scene.player == null:
_fail("local player model is not ready")
var entities := scene.get_node_or_null("Entities")
if entities == null:
_fail("GameScene entity mount is missing")
var positions := [Vector3(12.0, 0.0, 18.0), Vector3(15.0, 0.0, 21.0)]
var monster := MobView.new()
monster.name = "ForestTreeMonster_%d" % race
if not monster.build(AssetRoot.path(), null, race):
_fail("tree monster build failed race=%d" % race)
else:
entities.add_child(monster)
monster.position = positions[0]
monster.set_anim_state("wait")
client.spawn(23001, "TreeMonster", Vector3(positions[0].x * 100.0, 0.0, -positions[0].z * 100.0))
await get_tree().process_frame
if monster.model == null or monster.model.call("get_visual_aabb").size.length() <= 0.0:
_fail("tree monster has no visible geometry")
if scene.cam and scene.cam.has_method("snap_to_target"):
scene.cam.snap_to_target()
await get_tree().process_frame
await get_tree().process_frame
var image_name := "forest-map-%s.png" % map_key.get_file()
if DisplayServer.get_name() != "headless":
await RenderingServer.frame_post_draw
if get_tree().root.get_texture().get_image().save_png(output.path_join(image_name)) != OK:
_fail("map screenshot could not be saved")
var report := {"passed": failures == 0, "failures": failures, "map": map_key,
"tree_monster_race": race, "tree_monster_model": monster.model != null,
"map_loaded": scene._map_loaded(), "screenshot": image_name if DisplayServer.get_name() != "headless" else "",
"assets": AssetRoot.path(), "headless": DisplayServer.get_name() == "headless",
"scope": "production GameScene map load plus offline tree-monster placement; no server spawn"}
var file := FileAccess.open(output.path_join("report.json"), FileAccess.WRITE)
if file:
file.store_string(JSON.stringify(report, "\t"))
file.close()
var client_report_path := OS.get_environment("MT_TEST_REPORT")
if not client_report_path.is_empty():
playable_report.add_case("MAP-FOREST-01", "PASS" if failures == 0 else "FAIL",
"map=%s tree_monster_race=%d" % [map_key, race])
playable_report.write(client_report_path)
print("FOREST MAP RENDER: ", JSON.stringify(report))
scene.queue_free()
client.queue_free()
await get_tree().process_frame
get_tree().quit(1 if failures else 0)