Localize Sishui gate and battle log tone

This commit is contained in:
2026-06-19 06:06:14 +09:00
parent 30ac2479c4
commit 0b599b39be
12 changed files with 314 additions and 190 deletions

View File

@@ -1645,25 +1645,25 @@ func _play_ui_cancel() -> void:
func _play_log_sfx(message: String) -> void:
if message.contains(" but misses."):
if message.contains(" but misses.") or message.contains("헛쳤다"):
_play_sfx("guard_block")
elif message.begins_with("Objective updated:") or message.begins_with("Defeat condition updated:"):
elif message.begins_with("Objective updated:") or message.begins_with("Defeat condition updated:") or message.begins_with("군령 갱신:") or message.begins_with("패전 군령 갱신:"):
_play_ui_confirm()
elif message.ends_with(" withdraws from the battlefield."):
elif message.ends_with(" withdraws from the battlefield.") or message.ends_with("전장을 물러났다."):
_play_ui_confirm()
elif message.contains(" attacks ") or message.contains(" counterattacks "):
if message.contains(" for "):
elif message.contains(" attacks ") or message.contains(" counterattacks ") or message.contains(" 공격 ") or message.contains(" 반격 "):
if message.contains(" for ") or message.contains("피해"):
_play_sfx("hit_heavy")
elif message.contains(" casts "):
if message.contains("restoring") or message.contains(" until "):
elif message.contains(" casts ") or message.contains(" 시전 "):
if message.contains("restoring") or message.contains(" until ") or message.contains("회복") or message.contains("지원"):
_play_sfx("skill_cast")
else:
_play_sfx("fire_skill")
elif message.contains(" moved to ") or message.contains(" advances to ") or message.contains(" takes formation at ") or message.contains(" arrives at "):
_play_sfx("footstep")
elif message.contains(" uses ") or message.contains(" equips ") or message.contains(" 매입:") or message.contains(" 매각:") or message.begins_with("Received "):
elif message.contains(" uses ") or message.contains(" equips ") or message.contains(" 사용:") or message.contains(" 장착:") or message.contains(" 매입:") or message.contains(" 매각:") or message.begins_with("Received ") or message.begins_with("전리품:") or message.begins_with("군자금:"):
_play_sfx("item_pickup")
elif message.contains(" reaches Lv.") or message.contains(" promotes to "):
elif message.contains(" reaches Lv.") or message.contains(" promotes to ") or message.contains("공적") or message.contains("승급"):
_play_sfx("menu_confirm")
@@ -3056,9 +3056,9 @@ func _skill_target_preview_badge_for_cell(selected: Dictionary, target: Dictiona
return _make_target_preview_badge_at("가득", "invalid", cell)
if bool(preview.get("has_area", false)):
return _make_target_preview_badge_at("+%d x%d" % [total_heal, target_count], "heal", cell)
return _make_target_preview_badge_at("+%d HP" % heal, "heal", cell)
return _make_target_preview_badge_at("+%d 병력" % heal, "heal", cell)
if kind == "support":
var effect_text := str(preview.get("effect_text", "Support"))
var effect_text := str(preview.get("effect_text", "지원"))
var badge_kind := _support_preview_badge_kind(effect_text)
if bool(preview.get("has_area", false)):
return _make_target_preview_badge_at("%s x%d" % [_compact_support_preview_text(effect_text), target_count], badge_kind, cell)
@@ -3099,8 +3099,8 @@ func _item_target_preview_badge_for_cell(selected: Dictionary, target: Dictionar
if hp_heal > 0 and mp_heal > 0:
return _make_target_preview_badge_at("+%d/%d" % [hp_heal, mp_heal], "heal", cell)
if hp_heal > 0:
return _make_target_preview_badge_at("+%d HP" % hp_heal, "heal", cell)
return _make_target_preview_badge_at("+%d MP" % mp_heal, "mp", cell)
return _make_target_preview_badge_at("+%d 병력" % hp_heal, "heal", cell)
return _make_target_preview_badge_at("+%d 기력" % mp_heal, "mp", cell)
func _hover_intent_preview_badge(selected: Dictionary, target: Dictionary) -> Dictionary:
@@ -3145,7 +3145,10 @@ func _compact_support_preview_text(effect_text: String) -> String:
var for_index := part.find(" for ")
if for_index >= 0:
part = part.substr(0, for_index)
if not part.is_empty() and part != "No support effect.":
var duration_index := part.find(", ")
if duration_index >= 0:
part = part.substr(0, duration_index)
if not part.is_empty() and part != "No support effect." and part != "효험 없음":
parts.append(_compact_support_badge_text(part))
if parts.is_empty():
return "지원"
@@ -3155,27 +3158,27 @@ func _compact_support_preview_text(effect_text: String) -> String:
func _compact_support_badge_text(text: String) -> String:
if text.contains("Disarm"):
if text.contains("Disarm") or text.contains("무장해제"):
return "무장해제"
if text.contains("Snare"):
if text.contains("Snare") or text.contains("발묶임"):
return "속박"
if text.contains("Seal"):
if text.contains("Seal") or text.contains("봉인"):
return "봉인"
if text.contains("Poison"):
if text.contains("Poison") or text.contains(""):
return ""
if text.contains("Cleanse"):
if text.contains("Cleanse") or text.contains("해소"):
return "해소"
return text
func _support_preview_badge_kind(effect_text: String) -> String:
if effect_text.contains("Disarm"):
if effect_text.contains("Disarm") or effect_text.contains("무장해제"):
return "disarm"
if effect_text.contains("Snare"):
if effect_text.contains("Snare") or effect_text.contains("발묶임"):
return "snare"
if effect_text.contains("Seal"):
if effect_text.contains("Seal") or effect_text.contains("봉인"):
return "seal"
if effect_text.contains("Poison"):
if effect_text.contains("Poison") or effect_text.contains(""):
return "poison"
if effect_text.contains("-"):
return "debuff"
@@ -3805,7 +3808,7 @@ func _update_skill_forecast(selected: Dictionary) -> void:
preview["mp_cost"],
mp_text,
area_text,
preview.get("effect_text", "Support effect"),
preview.get("effect_text", "지원"),
refresh_text
]
else:
@@ -4617,7 +4620,7 @@ func _load_pending_post_battle_choice() -> void:
if briefing_panel != null:
briefing_panel.visible = false
if log_box != null:
log_box.append_text("Campaign choice pending.\n")
log_box.append_text("군의 논의가 이어지고 있다.\n")
func _load_scenario(scenario_id: String) -> void:
@@ -6426,10 +6429,10 @@ func _on_post_battle_choice_pressed(choice: Dictionary) -> void:
_append_result_items(choice.get("items", []))
_append_unique_result_values("joined_officers", choice.get("join_officers", []))
_append_unique_result_values("left_officers", choice.get("leave_officers", []))
_on_log_added("Campaign choice saved: %s." % battle_result_summary["choice_label"])
_on_log_added("군령 채택: %s." % battle_result_summary["choice_label"])
else:
_play_ui_cancel()
_on_log_added("Could not save campaign choice.")
_on_log_added("군령을 봉하지 못했다.")
_rebuild_result_choices()
_update_result_next_button_visibility()
if result_label != null and state.battle_status == BattleState.STATUS_VICTORY:
@@ -6825,7 +6828,7 @@ func _show_campaign_complete() -> void:
if briefing_panel != null:
briefing_panel.visible = false
if log_box != null:
log_box.append_text("Campaign complete.\n")
log_box.append_text("전기가 여기서 매듭지어졌다.\n")
func _on_new_campaign_pressed() -> void:
@@ -7109,7 +7112,7 @@ func _format_post_move_tactic_button_text(skill_id: String, skill: Dictionary, s
func _format_post_move_item_button_text(item_id: String, item: Dictionary, count: int) -> String:
var marker := "> " if selected_item_id == item_id else ""
var item_name := str(item.get("name", item_id))
var item_name := _item_display_name(item_id)
return "%s%s x%d %s" % [marker, item_name, count, _format_post_move_item_effect_text(item)]
@@ -7545,13 +7548,13 @@ func _format_tactic_effect_text(skill: Dictionary) -> String:
if amount == 0:
continue
var sign := "+" if amount > 0 else ""
parts.append("%s %s%d" % [str(effect.get("stat", "")).to_upper(), sign, amount])
parts.append("%s %s%d" % [_battle_stat_display_name(str(effect.get("stat", ""))), sign, amount])
elif effect_type == "damage_over_time" and amount > 0:
var status_name := str(effect.get("status", "status")).replace("_", " ").capitalize()
var status_name := _battle_status_display_name(str(effect.get("status", "status")))
parts.append("%s -%d" % [status_name, amount])
elif effect_type == "action_lock":
parts.append("%s %s" % [
str(effect.get("status", "status")).replace("_", " ").capitalize(),
_battle_status_display_name(str(effect.get("status", "status"))),
_action_lock_effect_label(str(effect.get("action", "")))
])
if not parts.is_empty():
@@ -7592,6 +7595,42 @@ func _action_lock_effect_label(action: String) -> String:
return "군령 봉인"
func _battle_stat_display_name(stat: String) -> String:
var normalized := stat.strip_edges().to_lower()
if normalized == "hp":
return "병력"
if normalized == "mp":
return "기력"
if normalized == "atk":
return "무력"
if normalized == "def":
return "방비"
if normalized == "int":
return "지략"
if normalized == "agi":
return "순발"
if normalized == "move":
return "행군"
return _format_identifier_label(stat)
func _battle_status_display_name(status: String) -> String:
var normalized := status.strip_edges().to_lower()
if normalized == "poison":
return ""
if normalized == "seal":
return "봉인"
if normalized == "snare":
return "발묶임"
if normalized == "disarm":
return "무장해제"
if normalized == "debuff":
return "약화"
if normalized.is_empty():
return "상태"
return _format_identifier_label(status)
func _skill_kind_text(kind: String) -> String:
var normalized := kind.strip_edges().to_lower()
if normalized == "damage":
@@ -7714,7 +7753,7 @@ func _clear_item_list() -> void:
func _format_item_button_text(item_id: String, item: Dictionary, count: int) -> String:
var marker := "> " if selected_item_id == item_id else ""
var item_name := str(item.get("name", item_id))
var item_name := _item_display_name(item_id)
return "%s%s x%d %s" % [marker, item_name, count, _format_item_effect_text(item)]
@@ -7728,7 +7767,7 @@ func _format_item_effect_text(item: Dictionary) -> String:
elif str(effect.get("type", "")) == "heal_mp":
parts.append("기력 +%d" % int(effect.get("amount", 0)))
elif str(effect.get("type", "")) == "cure_status":
parts.append("치료 %s" % str(effect.get("status", "status")).replace("_", " ").capitalize())
parts.append("치료 %s" % _battle_status_display_name(str(effect.get("status", "status"))))
elif str(effect.get("type", "")) == "cleanse_debuffs":
parts.append("약화 해소")
if parts.is_empty():
@@ -7872,9 +7911,9 @@ func _format_unit_equipment(unit: Dictionary) -> String:
for slot in ["weapon", "armor", "accessory"]:
var item_id := _equipment_item_id(equipment, slot)
if item_id.is_empty():
parts.append("%s -" % slot.capitalize())
parts.append("%s -" % _equipment_slot_display_name(slot))
else:
parts.append("%s %s" % [slot.capitalize(), _item_display_name(item_id)])
parts.append("%s %s" % [_equipment_slot_display_name(slot), _item_display_name(item_id)])
return _join_strings(parts, ", ")
@@ -7911,7 +7950,7 @@ func _format_equipment_option_text(unit: Dictionary, item_id: String, item: Dict
func _format_equipment_unequip_text(unit: Dictionary, slot: String, item_id: String, item: Dictionary) -> String:
var parts := [
"%s 해제:" % slot.capitalize(),
"%s 해제:" % _equipment_slot_display_name(slot),
_item_display_name(item_id)
]
var change_text := _format_equipment_unequip_change_text(unit, slot, item)
@@ -7929,7 +7968,7 @@ func _format_equipment_unequip_change_text(unit: Dictionary, slot: String, item:
var delta := -int(current_bonuses.get(stat, 0))
if delta == 0:
continue
parts.append("%s %d" % [stat.to_upper(), delta])
parts.append("%s %d" % [_battle_stat_display_name(stat), delta])
if slot == "weapon":
var current_range := _format_equipment_item_range_text(item)
if not current_range.is_empty():
@@ -7960,7 +7999,7 @@ func _format_equipment_change_text(unit: Dictionary, item: Dictionary) -> String
if delta == 0:
continue
var sign := "+" if delta > 0 else ""
parts.append("%s %s%d" % [stat.to_upper(), sign, delta])
parts.append("%s %s%d" % [_battle_stat_display_name(stat), sign, delta])
var range_text := _format_equipment_range_change_text(current_item, item)
if not range_text.is_empty():
@@ -7980,6 +8019,17 @@ func _equipment_slot_for_display(item: Dictionary) -> String:
return ""
func _equipment_slot_display_name(slot: String) -> String:
var normalized := slot.strip_edges().to_lower()
if normalized == "weapon":
return "병장"
if normalized == "armor":
return "갑주"
if normalized == "accessory":
return "보물"
return _format_identifier_label(slot)
func _equipment_bonus_map(item: Dictionary) -> Dictionary:
if item.is_empty() or typeof(item.get("bonuses", {})) != TYPE_DICTIONARY:
return {}
@@ -7995,7 +8045,7 @@ func _format_equipment_range_change_text(current_item: Dictionary, candidate_ite
return ""
if current_range.is_empty():
current_range = "-"
return "RNG %s->%s" % [current_range, candidate_range]
return "사거리 %s->%s" % [current_range, candidate_range]
func _format_equipment_item_range_text(item: Dictionary) -> String:
@@ -8021,10 +8071,10 @@ func _format_equipment_effectiveness_change_text(current_item: Dictionary, candi
if candidate_text == current_text:
return ""
if current_text.is_empty():
return "Gains %s" % candidate_text
return "특효 획득 %s" % candidate_text
if candidate_text.is_empty():
return "Loses %s" % current_text
return "Effect changes"
return "특효 상실 %s" % current_text
return "특효 변화"
func _format_equipment_bonus_text(item: Dictionary) -> String:
@@ -8038,12 +8088,12 @@ func _format_equipment_bonus_text(item: Dictionary) -> String:
if amount == 0:
continue
var sign := "+" if amount > 0 else ""
parts.append("%s %s%d" % [stat.to_upper(), sign, amount])
parts.append("%s %s%d" % [_battle_stat_display_name(stat), sign, amount])
var effective_text := _format_equipment_effectiveness_text(item)
if not effective_text.is_empty():
parts.append(effective_text)
if parts.is_empty():
return str(item.get("kind", "equipment")).capitalize()
return _item_kind_text(str(item.get("kind", "item")))
return _join_strings(parts, ", ")
@@ -8054,7 +8104,7 @@ func _format_equipment_rarity_text(item: Dictionary) -> String:
func _format_item_rarity_text(item: Dictionary) -> String:
var rarity := str(item.get("rarity", ""))
if rarity == "named":
return "Named"
return "명품"
return ""
@@ -8074,7 +8124,7 @@ func _format_equipment_effectiveness_text(item: Dictionary) -> String:
labels.append(label)
if labels.is_empty():
return ""
return "Effective +%d vs %s" % [bonus, _join_strings(labels, "/")]
return "%s 특효 +%d" % [_join_strings(labels, "/"), bonus]
func _format_move_type(move_type: String) -> String: