- 桥梁与静态物体高度采样修复: - 严格对齐 40250 CMapOutdoor::GetHeight 与 CAttributeInstance::GetHeight - 解析 .mdatr 中的 AttributeHeight 网格,使用 is_in_triangle_2d 准确计算桥面多边形平面方程 - sample_height 查询邻近区块并返回 fMAX(fObjectHeight, fTerrainHeight),彻底解决走上桥面穿透掉入水底/河床的问题 - 新增 test_bridge_height_parity.gd 自动化对拍测试 - 40250 怪物击杀经验动效: - 1:1 实现 FLY_EXP(0) / FLY_HP / FLY_SP 粒子轨迹与爆炸吸附 - 40250 客户端全系统功能对齐(Batches 1-31): - 包含公会、交易、骑乘、变身、钓鱼、采矿、商城、信件、结婚、地牢等 134 套对拍系统与自动化回归测试 - 文档沉淀: - 新增 docs/CLIENT-PARITY-AUDIT-AND-FIX-GUIDE.md 客户端对拍缺陷发现与修复工程指南
85 lines
3.2 KiB
GDScript
85 lines
3.2 KiB
GDScript
# test_guild_mark_uploader_parity.gd —— 40250 行会图标与战旗上传回归测试
|
|
extends SceneTree
|
|
|
|
const SystemClass = preload("res://guild_mark_uploader_system.gd")
|
|
|
|
var _passed: int = 0
|
|
var _failed: int = 0
|
|
|
|
func _assert(cond: bool, msg: String) -> void:
|
|
if cond:
|
|
_passed += 1
|
|
print(" [PASS] %s" % msg)
|
|
else:
|
|
_failed += 1
|
|
printerr(" [FAIL] %s" % msg)
|
|
|
|
func _init() -> void:
|
|
print("\n=== Running test_guild_mark_uploader_parity (Batch 30 Direction 1) ===")
|
|
_test_authority_and_format_validation()
|
|
_test_mark_dimension_checks()
|
|
_test_symbol_dimension_checks()
|
|
_test_successful_mark_and_symbol_upload()
|
|
|
|
print("\n=== Result: %d Passed, %d Failed ===" % [_passed, _failed])
|
|
if _failed == 0:
|
|
print("ALL TESTS PASSED!\n")
|
|
else:
|
|
printerr("SOME TESTS FAILED!\n")
|
|
quit(0 if _failed == 0 else 1)
|
|
|
|
func _test_authority_and_format_validation() -> void:
|
|
print("\n--- Test 1: Authority & Format Verification ---")
|
|
var up = SystemClass.new()
|
|
|
|
# 1. Non-guild master rejected
|
|
var r_auth = up.upload_guild_mark(101, false, 16, 12, "bmp")
|
|
_assert(r_auth["error_code"] == SystemClass.UploadError.ERROR_NOT_GUILD_MASTER, "Reject upload if not guild master")
|
|
|
|
# 2. Unsupported format (PNG/JPG)
|
|
var r_fmt = up.upload_guild_mark(101, true, 16, 12, "png")
|
|
_assert(r_fmt["error_code"] == SystemClass.UploadError.ERROR_UNSUPPORTED_FORMAT, "Reject non-BMP formats")
|
|
|
|
func _test_mark_dimension_checks() -> void:
|
|
print("\n--- Test 2: Mark (16x12) Dimensions Checking ---")
|
|
var up = SystemClass.new()
|
|
|
|
# Wrong width (20 != 16)
|
|
var r_w = up.upload_guild_mark(101, true, 20, 12, "bmp")
|
|
_assert(r_w["error_code"] == SystemClass.UploadError.ERROR_WIDTH, "Reject mark width != 16")
|
|
|
|
# Wrong height (16 != 12)
|
|
var r_h = up.upload_guild_mark(101, true, 16, 16, "bmp")
|
|
_assert(r_h["error_code"] == SystemClass.UploadError.ERROR_HEIGHT, "Reject mark height != 12")
|
|
|
|
func _test_symbol_dimension_checks() -> void:
|
|
print("\n--- Test 3: Symbol (64x128) Dimensions Checking ---")
|
|
var up = SystemClass.new()
|
|
|
|
# Wrong symbol width (32 != 64)
|
|
var r_w = up.upload_guild_symbol(101, true, 32, 128, "bmp")
|
|
_assert(r_w["error_code"] == SystemClass.UploadError.ERROR_WIDTH, "Reject symbol width != 64")
|
|
|
|
# Wrong symbol height (64 != 128)
|
|
var r_h = up.upload_guild_symbol(101, true, 64, 64, "bmp")
|
|
_assert(r_h["error_code"] == SystemClass.UploadError.ERROR_HEIGHT, "Reject symbol height != 128")
|
|
|
|
func _test_successful_mark_and_symbol_upload() -> void:
|
|
print("\n--- Test 4: Successful Upload & Cache Retrieval ---")
|
|
var up = SystemClass.new()
|
|
var dummy_pixels = PackedByteArray([0xFF, 0x00, 0xFF, 0x00])
|
|
|
|
# Upload 16x12 Mark
|
|
var r_mark = up.upload_guild_mark(101, true, 16, 12, "bmp", dummy_pixels)
|
|
_assert(r_mark["success"] == true, "Uploaded 16x12 mark successfully")
|
|
var m = up.get_guild_mark(101)
|
|
_assert(m != null, "Mark cached in manager")
|
|
_assert(m.width == 16 and m.height == 12, "Cached mark dimensions match 16x12")
|
|
|
|
# Upload 64x128 Symbol
|
|
var r_sym = up.upload_guild_symbol(101, true, 64, 128, "bmp", dummy_pixels)
|
|
_assert(r_sym["success"] == true, "Uploaded 64x128 symbol successfully")
|
|
var s = up.get_guild_symbol(101)
|
|
_assert(s != null, "Symbol cached in manager")
|
|
_assert(s.width == 64 and s.height == 128, "Cached symbol dimensions match 64x128")
|