Add first support tactic

This commit is contained in:
2026-06-18 03:11:35 +09:00
parent b0d26530f2
commit 618a780796
9 changed files with 263 additions and 23 deletions

View File

@@ -202,12 +202,12 @@ func _create_hud() -> void:
selected_label = Label.new()
selected_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
selected_label.custom_minimum_size = Vector2(420, 72)
selected_label.custom_minimum_size = Vector2(420, 92)
side_column.add_child(selected_label)
cell_info_label = Label.new()
cell_info_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
cell_info_label.custom_minimum_size = Vector2(420, 90)
cell_info_label.custom_minimum_size = Vector2(420, 106)
side_column.add_child(cell_info_label)
forecast_label = Label.new()
@@ -567,7 +567,7 @@ func _play_log_sfx(message: String) -> void:
if message.contains(" for "):
_play_sfx("hit_heavy")
elif message.contains(" casts "):
if message.contains("restoring"):
if message.contains("restoring") or message.contains(" until "):
_play_sfx("skill_cast")
else:
_play_sfx("fire_skill")
@@ -882,6 +882,9 @@ func _update_hud() -> void:
selected.get("min_range", 1),
selected["range"]
]
var selected_effects := state.get_status_effect_summary(selected["id"])
if not selected_effects.is_empty():
selected_label.text += "\nEffects: %s" % selected_effects
wait_button.disabled = selected.get("acted", false) or not state.can_player_act() or _is_input_locked()
_update_tactic_button(selected)
_update_item_button(selected)
@@ -933,6 +936,9 @@ func _update_cell_info() -> void:
unit.get("min_range", 1),
unit["range"]
]
var status_effects := state.get_status_effect_summary(unit["id"])
if not status_effects.is_empty():
text += "\nEffects: %s" % status_effects
cell_info_label.text = text
@@ -1011,6 +1017,16 @@ func _update_skill_forecast(selected: Dictionary) -> void:
preview["target_hp_after"],
target["max_hp"]
]
elif preview["kind"] == "support":
var refresh_text := " Refresh." if bool(preview.get("already_active", false)) else ""
forecast_label.text = "%s: %s, %d MP.%s\n%s.%s" % [
preview["skill_name"],
range_text,
preview["mp_cost"],
mp_text,
preview.get("effect_text", "Support effect"),
refresh_text
]
else:
var defeat_text := " Defeat" if preview["would_defeat"] else ""
forecast_label.text = "%s: %s, %d MP.%s\n%d damage, target HP %d/%d.%s" % [
@@ -2277,9 +2293,27 @@ func _format_tactic_button_text(skill_id: String, skill: Dictionary, selected: D
var mp_cost := int(skill.get("mp_cost", 0))
var kind := str(skill.get("kind", "skill")).capitalize()
var range_text := _format_tactic_range_text(skill)
var power_text := int(skill.get("power", 0))
var effect_text := _format_tactic_effect_text(skill)
var disabled_text := " - MP" if int(selected.get("mp", 0)) < mp_cost else ""
return "%s%s %dMP %s R%s P%d%s" % [marker, skill_name, mp_cost, kind, range_text, power_text, disabled_text]
return "%s%s %dMP %s R%s %s%s" % [marker, skill_name, mp_cost, kind, range_text, effect_text, disabled_text]
func _format_tactic_effect_text(skill: Dictionary) -> String:
if str(skill.get("kind", "")) == "support":
var parts := []
for effect in skill.get("effects", []):
if typeof(effect) != TYPE_DICTIONARY:
continue
if str(effect.get("type", "")) != "stat_bonus":
continue
var amount := int(effect.get("amount", 0))
if amount == 0:
continue
var sign := "+" if amount > 0 else ""
parts.append("%s %s%d" % [str(effect.get("stat", "")).to_upper(), sign, amount])
if not parts.is_empty():
return _join_strings(parts, ", ")
return "P%d" % int(skill.get("power", 0))
func _format_tactic_range_text(skill: Dictionary) -> String: