Add weapon move-type effectiveness

This commit is contained in:
2026-06-18 11:20:55 +09:00
parent 47d02e1537
commit 6ca276082e
9 changed files with 173 additions and 10 deletions

View File

@@ -1535,19 +1535,23 @@ func _update_forecast() -> void:
var range_text := "ready" if preview["in_range"] else "out of range"
var defeat_text := " Defeat" if preview["would_defeat"] else ""
var effective_text := _format_effective_forecast_text(preview, "effective_bonus", "effective_target_type")
var counter_text := ""
if preview["counter_in_range"]:
var counter_defeat := " Defeat" if preview["counter_would_defeat"] else ""
counter_text = "\nCounter %d, Hit %d%%, your HP %d/%d.%s" % [
var counter_effective_text := _format_effective_forecast_text(preview, "counter_effective_bonus", "counter_effective_target_type")
counter_text = "\nCounter %d%s, Hit %d%%, your HP %d/%d.%s" % [
preview["counter_damage"],
counter_effective_text,
preview.get("counter_hit_chance", 0),
preview["attacker_hp_after"],
selected["max_hp"],
counter_defeat
]
forecast_label.text = "Forecast: %s\n%d damage, Hit %d%%, target HP %d/%d.%s%s" % [
forecast_label.text = "Forecast: %s\n%d damage%s, Hit %d%%, target HP %d/%d.%s%s" % [
range_text,
preview["damage"],
effective_text,
preview.get("hit_chance", 100),
preview["target_hp_after"],
target["max_hp"],
@@ -1556,6 +1560,16 @@ func _update_forecast() -> void:
]
func _format_effective_forecast_text(preview: Dictionary, bonus_key: String, type_key: String) -> String:
var bonus := int(preview.get(bonus_key, 0))
if bonus <= 0:
return ""
var move_type := _format_move_type(str(preview.get(type_key, "")))
if move_type.is_empty():
move_type = "Target"
return " (Effective +%d vs %s)" % [bonus, move_type]
func _update_skill_forecast(selected: Dictionary) -> void:
var preview := state.get_skill_preview(selected["id"], selected_skill_id, hover_cell)
if preview.is_empty():
@@ -3763,11 +3777,37 @@ func _format_equipment_bonus_text(item: Dictionary) -> String:
continue
var sign := "+" if amount > 0 else ""
parts.append("%s %s%d" % [stat.to_upper(), 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 _join_strings(parts, ", ")
func _format_equipment_effectiveness_text(item: Dictionary) -> String:
if str(item.get("kind", "")) != "weapon":
return ""
var bonus := int(item.get("effective_bonus_damage", 0))
if bonus <= 0:
return ""
var move_types = item.get("effective_vs_move_types", [])
if typeof(move_types) != TYPE_ARRAY or move_types.is_empty():
return ""
var labels := []
for move_type in move_types:
var label := _format_move_type(str(move_type))
if not label.is_empty():
labels.append(label)
if labels.is_empty():
return ""
return "Effective +%d vs %s" % [bonus, _join_strings(labels, "/")]
func _format_move_type(move_type: String) -> String:
return move_type.strip_edges().replace("_", " ").capitalize()
func _on_equip_item_pressed(item_id: String) -> void:
var selected := state.get_selected_unit()
if selected.is_empty():