完善客户端功能并同步差距文档
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user