完善客户端功能并同步差距文档

This commit is contained in:
shenlei
2026-09-03 18:40:01 +09:00
parent f93a172296
commit 13ccb8d02d
135 changed files with 21881 additions and 1259 deletions
+27 -8
View File
@@ -31,6 +31,12 @@ const JOB_BASE_STATS := {
2: {"con": 3, "int": 5, "str": 5, "dex": 3}, # sura
3: {"con": 4, "int": 6, "str": 3, "dex": 3}, # shaman
}
# §1.10 名称长度校验统一:与 wire 契约 CHARACTER_NAME_MAX_LEN(=24, name[25])
# 对齐。角色名可含多字节字符,wire 缓冲是定长 25 字节,故按 UTF-8 字节长度设限,
# 与 guild_ui.gd 的公会名校验(非空 / 超长 / 控制字符)保持同一形状。
const CHAR_NAME_MAX_BYTES := 24
const CHAR_NAME_MIN_CHARS := 2
const EMPIRE_KEY := {1: "EMPIRE_A", 2: "EMPIRE_B", 3: "EMPIRE_C"}
const EMPIRE_FALLBACK := {0: "", 1: "神獸王國", 2: "天朝王國", 3: "眞魔王國"}
const EMPIRE_FLAG := {1: "a", 2: "b", 3: "c"}
@@ -93,6 +99,17 @@ func _first_occupied() -> int:
return i
return 0
# §1.10:角色名校验("" = 合法)。创建与改名共用同一实现。
func _validate_char_name(nm: String) -> String:
if nm.length() < CHAR_NAME_MIN_CHARS:
return "名称太短"
if nm.to_utf8_buffer().size() > CHAR_NAME_MAX_BYTES:
return "名称太长(最多 %d 字节)" % CHAR_NAME_MAX_BYTES
for ch in nm:
if ch.unicode_at(0) < 32:
return "名称包含非法字符"
return ""
# 由 app_flow 在收到新的 char_list(建/删号后 M2Client 重发)时调用,保持当前选中槽。
func set_chars(chars: Array) -> void:
var keep := _slot_index()
@@ -560,9 +577,9 @@ func _open_create_dialog() -> void:
nrow.add_child(_plain("名称", 13, Color(0.72, 0.78, 0.85)))
var name_edit := LineEdit.new()
name_edit.name = "Name"
name_edit.max_length = 12
name_edit.max_length = CHAR_NAME_MAX_BYTES
name_edit.custom_minimum_size = Vector2(240, 0)
name_edit.placeholder_text = "角色名(最多 12"
name_edit.placeholder_text = "角色名(最多 24 字节"
nrow.add_child(name_edit)
# 四维(起始属性,只读,随职业变)
@@ -589,8 +606,9 @@ func _open_create_dialog() -> void:
var ok := Button.new(); ok.text = "创建"; ok.custom_minimum_size = Vector2(120, 34)
ok.pressed.connect(func():
var nm := name_edit.text.strip_edges()
if nm.length() < 2:
_set_status("名称太短")
var err := _validate_char_name(nm)
if err != "":
_set_status(err)
return
var j := jopt.get_selected_id()
var bs: Dictionary = JOB_BASE_STATS.get(j, JOB_BASE_STATS[0])
@@ -620,9 +638,9 @@ func _open_change_name_dialog() -> void:
nrow.add_child(_plain("新名称", 13, Color(0.72, 0.78, 0.85)))
var name_edit := LineEdit.new()
name_edit.name = "Name"
name_edit.max_length = 12
name_edit.max_length = CHAR_NAME_MAX_BYTES
name_edit.custom_minimum_size = Vector2(220, 0)
name_edit.placeholder_text = "角色名(最多 12"
name_edit.placeholder_text = "角色名(最多 24 字节"
nrow.add_child(name_edit)
box.add_child(_sep())
var brow := HBoxContainer.new()
@@ -634,8 +652,9 @@ func _open_change_name_dialog() -> void:
ok.custom_minimum_size = Vector2(120, 34)
ok.pressed.connect(func():
var nm := name_edit.text.strip_edges()
if nm.length() < 2:
_set_status("名称太短")
var err := _validate_char_name(nm)
if err != "":
_set_status(err)
return
_rename_pending = true
_close_dialog()