Compare commits

..
2 Commits
6 changed files with 382 additions and 0 deletions

No files matched your search

+60
View File
@@ -0,0 +1,60 @@
mod_ff_battle_name = FFBattle
mod_ff_battle_desc = Sistema de combate al estilo Final Fantasy sobre turn_battle_base: órdenes por menú (atacar, defender, objeto, aturdir), paneles de enemigos y del grupo, animaciones y ejecutores por acción, HUD y registro de combate.
ff_battle/menu_attack = Atacar
ff_battle/menu_items = Objetos
ff_battle/menu_defend = Defender
ff_battle/menu_escape = Huir
ff_battle/end_turn = Terminar turno
ff_battle/back = Atrás
ff_battle/no_items = No hay objetos
ff_battle/select_target = Elige un objetivo
ff_battle/escape_fail = ¡No has podido huir!
ff_battle/escape_success = ¡Has huido!
ff_battle/no_actions = No hay acciones
ff_battle/hud_title = Combate
ff_battle/round = Ronda
ff_battle/enemies = Enemigos
ff_battle/allies = Grupo
ff_battle/phase_player = Turno del jugador
ff_battle/phase_enemy = Turno del enemigo
ff_battle/banner_player = Turno del jugador
ff_battle/banner_enemy = Turno del enemigo
ff_battle/hint_target = Elige un objetivo · clic derecho / Esc: cancelar
ff_battle/hint_ally = Elige un aliado · clic derecho / Esc: cancelar
ff_battle/menu_caption = {0} · PA {1}/{2}
ff_battle/menu_actions = Acciones
ff_battle/log_title = Registro de combate
ff_battle/log_round = ronda {0}
ff_battle/log_battle_start = Comienza el combate
ff_battle/log_turn_player = — Turno del jugador · ronda {0} —
ff_battle/log_turn_enemy = — Turno del enemigo · ronda {0} —
ff_battle/log_action = {0}: {1} → {2}
ff_battle/log_action_self = {0}: {1}
ff_battle/log_damage = {0}: {1} → {2} · -{3} PV
ff_battle/log_shield = El escudo de {0} absorbió {1} · quedan {2}
ff_battle/log_defence = Defensa: {0} · +{1} DEF (total {2})
ff_battle/log_stun = Aturdido: {0} · {1} turnos
ff_battle/log_stun_skip = {0} está aturdido: pierde el turno
ff_battle/log_heal = {0}: {1} restauró {2} PV
ff_battle/log_death = {0} derrotado
ff_battle/log_escape_success = Huida con éxito
ff_battle/log_escape_failed = ¡No has podido huir! {0} pierde 1 PA
ff_battle/log_no_points = Al grupo no le quedan PA
ff_battle/detail_attack = Submenú de acciones del personaje. El coste en PA aparece junto al nombre.
ff_battle/detail_items = 1 PA por objeto. Los objetos con objetivo requieren un aliado.
ff_battle/detail_defend = Atajo: la acción sobre un aliado se aplica a uno mismo. Escudo +4 DEF.
ff_battle/detail_escape = 70 % de probabilidad de éxito. Si falla, el personaje pierde 1 PA.
ff_battle/detail_back = Volver al menú principal de órdenes.
ff_battle/detail_action = Acción especial sin parámetros numéricos.
ff_battle/detail_item = Un objeto del inventario compartido.
ff_battle/detail_damage = Daño {0} (ATQ {1} × {2}) · coste {3} PA
ff_battle/detail_stun = Aturde {0} turnos · coste {1} PA
ff_battle/detail_defence = Escudo del objetivo +{0} · coste {1} PA
ff_battle/status_stun = Aturdido {0}
ff_battle/badge_turns = {0} turnos
ff_battle/badge_self = A sí mismo
+60
View File
@@ -0,0 +1,60 @@
mod_ff_battle_name = FFBattle
mod_ff_battle_desc = turn_battle_base 上の Final Fantasy 風バトルシステム:メニュー式のコマンド(攻撃/防御/アイテム/スタン)、敵とパーティのパネル、アクションごとのアニメーションと実行器、バトル HUD とログ。
ff_battle/menu_attack = たたかう
ff_battle/menu_items = アイテム
ff_battle/menu_defend = ぼうぎょ
ff_battle/menu_escape = にげる
ff_battle/end_turn = ターン終了
ff_battle/back = 戻る
ff_battle/no_items = アイテムがない
ff_battle/select_target = 対象を選択
ff_battle/escape_fail = 逃げられなかった!
ff_battle/escape_success = うまく逃げきった!
ff_battle/no_actions = アクションがない
ff_battle/hud_title = バトル
ff_battle/round = ラウンド
ff_battle/enemies = 敵
ff_battle/allies = パーティ
ff_battle/phase_player = プレイヤーのターン
ff_battle/phase_enemy = 敵のターン
ff_battle/banner_player = プレイヤーのターン
ff_battle/banner_enemy = 敵のターン
ff_battle/hint_target = 対象を選択 · 右クリック / Esc——キャンセル
ff_battle/hint_ally = 味方を選択 · 右クリック / Esc——キャンセル
ff_battle/menu_caption = {0} · AP {1}/{2}
ff_battle/menu_actions = アクション
ff_battle/log_title = バトルログ
ff_battle/log_round = ラウンド {0}
ff_battle/log_battle_start = バトル開始
ff_battle/log_turn_player = — プレイヤーのターン · ラウンド {0} —
ff_battle/log_turn_enemy = — 敵のターン · ラウンド {0} —
ff_battle/log_action = {0}:{1} → {2}
ff_battle/log_action_self = {0}:{1}
ff_battle/log_damage = {0}:{1} → {2} · -{3} HP
ff_battle/log_shield = {0} のシールドが {1} を吸収 · 残り {2}
ff_battle/log_defence = 防御:{0} · +{1} DEF(合計 {2})
ff_battle/log_stun = スタン:{0} · {1} ターン
ff_battle/log_stun_skip = {0} はスタン中——ターンを飛ばす
ff_battle/log_heal = {0}:{1} が HP を {2} 回復
ff_battle/log_death = {0} を倒した
ff_battle/log_escape_success = 逃走成功
ff_battle/log_escape_failed = 逃げられなかった! {0} は AP を 1 失う
ff_battle/log_no_points = パーティの AP が尽きた
ff_battle/detail_attack = キャラクターのアクションのサブメニュー。名前の横に AP コストを表示。
ff_battle/detail_items = アイテム 1 つにつき 1 AP。対象付きのアイテムには味方が必要。
ff_battle/detail_defend = ショートカット:味方対象のアクションを自分に使う。シールド +4 DEF。
ff_battle/detail_escape = 成功率 70%。失敗するとキャラクターは AP を 1 失う。
ff_battle/detail_back = メインのコマンドメニューに戻る。
ff_battle/detail_action = 数値パラメーターのない特殊アクション。
ff_battle/detail_item = 共有インベントリのアイテム。
ff_battle/detail_damage = ダメージ {0}(攻撃 {1} × {2})· コスト {3} AP
ff_battle/detail_stun = {0} ターンのスタン · コスト {1} AP
ff_battle/detail_defence = 対象のシールド +{0} · コスト {1} AP
ff_battle/status_stun = スタン {0}
ff_battle/badge_turns = {0} ターン
ff_battle/badge_self = 自分
+60
View File
@@ -0,0 +1,60 @@
mod_ff_battle_name = FFBattle
mod_ff_battle_desc = turn_battle_base 위의 Final Fantasy 스타일 전투 시스템: 메뉴식 명령(공격/방어/아이템/기절), 적과 파티 패널, 액션별 애니메이션과 실행기, 전투 HUD와 로그.
ff_battle/menu_attack = 공격
ff_battle/menu_items = 아이템
ff_battle/menu_defend = 방어
ff_battle/menu_escape = 도망
ff_battle/end_turn = 턴 종료
ff_battle/back = 뒤로
ff_battle/no_items = 아이템 없음
ff_battle/select_target = 대상 선택
ff_battle/escape_fail = 도망치지 못했다!
ff_battle/escape_success = 도망쳤다!
ff_battle/no_actions = 액션 없음
ff_battle/hud_title = 전투
ff_battle/round = 라운드
ff_battle/enemies = 적
ff_battle/allies = 파티
ff_battle/phase_player = 플레이어 턴
ff_battle/phase_enemy = 적 턴
ff_battle/banner_player = 플레이어 턴
ff_battle/banner_enemy = 적 턴
ff_battle/hint_target = 대상 선택 · 우클릭 / Esc — 취소
ff_battle/hint_ally = 아군 선택 · 우클릭 / Esc — 취소
ff_battle/menu_caption = {0} · AP {1}/{2}
ff_battle/menu_actions = 액션
ff_battle/log_title = 전투 로그
ff_battle/log_round = {0}라운드
ff_battle/log_battle_start = 전투 시작
ff_battle/log_turn_player = — 플레이어 턴 · {0}라운드 —
ff_battle/log_turn_enemy = — 적 턴 · {0}라운드 —
ff_battle/log_action = {0}: {1} → {2}
ff_battle/log_action_self = {0}: {1}
ff_battle/log_damage = {0}: {1} → {2} · -{3} HP
ff_battle/log_shield = {0}의 보호막이 {1}을(를) 흡수 · 남은 양 {2}
ff_battle/log_defence = 방어: {0} · +{1} DEF (합계 {2})
ff_battle/log_stun = 기절: {0} · {1}턴
ff_battle/log_stun_skip = {0}은(는) 기절 — 턴을 건너뜀
ff_battle/log_heal = {0}: {1}이(가) HP {2} 회복
ff_battle/log_death = {0} 쓰러짐
ff_battle/log_escape_success = 도망 성공
ff_battle/log_escape_failed = 도망 실패! {0}은(는) AP를 1 잃는다
ff_battle/log_no_points = 파티의 AP가 바닥났다
ff_battle/detail_attack = 캐릭터의 액션 하위 메뉴. 이름 옆에 AP 비용이 표시됩니다.
ff_battle/detail_items = 아이템 하나에 1 AP. 대상이 있는 아이템은 아군이 필요합니다.
ff_battle/detail_defend = 단축키: 아군 대상 액션을 자신에게 사용. 보호막 +4 DEF.
ff_battle/detail_escape = 성공 확률 70%. 실패하면 캐릭터가 AP를 1 잃습니다.
ff_battle/detail_back = 메인 명령 메뉴로 돌아갑니다.
ff_battle/detail_action = 수치 매개변수가 없는 특수 액션.
ff_battle/detail_item = 공용 인벤토리의 아이템.
ff_battle/detail_damage = 피해 {0} (공격 {1} × {2}) · 비용 {3} AP
ff_battle/detail_stun = {0}턴 기절 · 비용 {1} AP
ff_battle/detail_defence = 대상 보호막 +{0} · 비용 {1} AP
ff_battle/status_stun = 기절 {0}
ff_battle/badge_turns = {0}턴
ff_battle/badge_self = 자신
+60
View File
@@ -0,0 +1,60 @@
mod_ff_battle_name = FFBattle
mod_ff_battle_desc = Hệ thống chiến đấu phong cách Final Fantasy trên nền turn_battle_base: lệnh qua menu (tấn công/phòng thủ/vật phẩm/choáng), bảng kẻ địch và tổ đội, hoạt ảnh và bộ thực thi cho từng hành động, HUD và nhật ký chiến đấu.
ff_battle/menu_attack = Tấn công
ff_battle/menu_items = Vật phẩm
ff_battle/menu_defend = Phòng thủ
ff_battle/menu_escape = Bỏ chạy
ff_battle/end_turn = Kết thúc lượt
ff_battle/back = Quay lại
ff_battle/no_items = Không có vật phẩm
ff_battle/select_target = Chọn mục tiêu
ff_battle/escape_fail = Bỏ chạy thất bại!
ff_battle/escape_success = Bạn đã chạy thoát!
ff_battle/no_actions = Không có hành động
ff_battle/hud_title = Trận đấu
ff_battle/round = Vòng
ff_battle/enemies = Kẻ địch
ff_battle/allies = Tổ đội
ff_battle/phase_player = Lượt người chơi
ff_battle/phase_enemy = Lượt kẻ địch
ff_battle/banner_player = Lượt người chơi
ff_battle/banner_enemy = Lượt kẻ địch
ff_battle/hint_target = Chọn mục tiêu · chuột phải / Esc — hủy
ff_battle/hint_ally = Chọn đồng đội · chuột phải / Esc — hủy
ff_battle/menu_caption = {0} · AP {1}/{2}
ff_battle/menu_actions = Hành động
ff_battle/log_title = Nhật ký trận đấu
ff_battle/log_round = vòng {0}
ff_battle/log_battle_start = Trận đấu bắt đầu
ff_battle/log_turn_player = — Lượt người chơi · vòng {0} —
ff_battle/log_turn_enemy = — Lượt kẻ địch · vòng {0} —
ff_battle/log_action = {0}: {1} → {2}
ff_battle/log_action_self = {0}: {1}
ff_battle/log_damage = {0}: {1} → {2} · -{3} HP
ff_battle/log_shield = Khiên của {0} hấp thụ {1} · còn {2}
ff_battle/log_defence = Phòng thủ: {0} · +{1} DEF (tổng {2})
ff_battle/log_stun = Bị choáng: {0} · {1} lượt
ff_battle/log_stun_skip = {0} bị choáng — mất lượt
ff_battle/log_heal = {0}: {1} hồi {2} HP
ff_battle/log_death = {0} đã bị hạ
ff_battle/log_escape_success = Bỏ chạy thành công
ff_battle/log_escape_failed = Bỏ chạy thất bại! {0} mất 1 AP
ff_battle/log_no_points = Tổ đội đã hết AP
ff_battle/detail_attack = Menu con hành động của nhân vật. Chi phí AP hiển thị cạnh tên.
ff_battle/detail_items = 1 AP cho mỗi vật phẩm. Vật phẩm có mục tiêu cần một đồng đội.
ff_battle/detail_defend = Phím tắt: hành động nhắm đồng đội được áp dụng cho bản thân. Khiên +4 DEF.
ff_battle/detail_escape = Tỉ lệ thành công 70%. Nếu thất bại, nhân vật mất 1 AP.
ff_battle/detail_back = Quay lại menu lệnh chính.
ff_battle/detail_action = Hành động đặc biệt không có tham số số.
ff_battle/detail_item = Một vật phẩm trong túi đồ chung.
ff_battle/detail_damage = Sát thương {0} (ATK {1} × {2}) · tốn {3} AP
ff_battle/detail_stun = Choáng {0} lượt · tốn {1} AP
ff_battle/detail_defence = Khiên mục tiêu +{0} · tốn {1} AP
ff_battle/status_stun = Bị choáng {0}
ff_battle/badge_turns = {0} lượt
ff_battle/badge_self = Bản thân
+60
View File
@@ -0,0 +1,60 @@
mod_ff_battle_name = FFBattle
mod_ff_battle_desc = 基于 turn_battle_base 的 Final Fantasy 风格战斗系统:菜单式指令(攻击/防御/物品/眩晕)、敌方和队伍面板、每个动作的动画与执行器、战斗 HUD 和日志。
ff_battle/menu_attack = 攻击
ff_battle/menu_items = 物品
ff_battle/menu_defend = 防御
ff_battle/menu_escape = 逃跑
ff_battle/end_turn = 结束回合
ff_battle/back = 返回
ff_battle/no_items = 没有物品
ff_battle/select_target = 选择目标
ff_battle/escape_fail = 逃跑失败!
ff_battle/escape_success = 你逃走了!
ff_battle/no_actions = 没有行动
ff_battle/hud_title = 战斗
ff_battle/round = 回合
ff_battle/enemies = 敌人
ff_battle/allies = 队伍
ff_battle/phase_player = 玩家回合
ff_battle/phase_enemy = 敌方回合
ff_battle/banner_player = 玩家回合
ff_battle/banner_enemy = 敌方回合
ff_battle/hint_target = 选择目标 · 右键 / Esc——取消
ff_battle/hint_ally = 选择队友 · 右键 / Esc——取消
ff_battle/menu_caption = {0} · AP {1}/{2}
ff_battle/menu_actions = 行动
ff_battle/log_title = 战斗日志
ff_battle/log_round = 第 {0} 回合
ff_battle/log_battle_start = 战斗开始
ff_battle/log_turn_player = — 玩家回合 · 第 {0} 回合 —
ff_battle/log_turn_enemy = — 敌方回合 · 第 {0} 回合 —
ff_battle/log_action = {0}:{1} → {2}
ff_battle/log_action_self = {0}:{1}
ff_battle/log_damage = {0}:{1} → {2} · -{3} HP
ff_battle/log_shield = {0} 的护盾吸收了 {1} · 剩余 {2}
ff_battle/log_defence = 防御:{0} · +{1} 防御(共 {2})
ff_battle/log_stun = 眩晕:{0} · {1} 回合
ff_battle/log_stun_skip = {0} 处于眩晕——跳过回合
ff_battle/log_heal = {0}:{1} 恢复了 {2} HP
ff_battle/log_death = {0} 被击败
ff_battle/log_escape_success = 逃跑成功
ff_battle/log_escape_failed = 逃跑失败!{0} 失去 1 AP
ff_battle/log_no_points = 队伍的 AP 用完了
ff_battle/detail_attack = 角色的行动子菜单。名称旁显示 AP 消耗。
ff_battle/detail_items = 每个物品消耗 1 AP。需要目标的物品要选择队友。
ff_battle/detail_defend = 快捷方式:对队友的行动作用于自己。护盾 +4 防御。
ff_battle/detail_escape = 成功率 70%。失败时角色失去 1 AP。
ff_battle/detail_back = 返回主指令菜单。
ff_battle/detail_action = 没有数值参数的特殊行动。
ff_battle/detail_item = 共享背包中的物品。
ff_battle/detail_damage = 伤害 {0}(攻击 {1} × {2})· 消耗 {3} AP
ff_battle/detail_stun = 眩晕 {0} 回合 · 消耗 {1} AP
ff_battle/detail_defence = 目标护盾 +{0} · 消耗 {1} AP
ff_battle/status_stun = 眩晕 {0}
ff_battle/badge_turns = {0} 回合
ff_battle/badge_self = 自己
+82
View File
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Cthangover.Core.Battle;
using Cthangover.Core.Cards.StatusEffect;
using Cthangover.Core.Characters;
using Cthangover.Core.Mods.Resolvers;
@@ -54,6 +56,8 @@ namespace Cthangover.FFBattle.UI
private TextureRect _stunIcon;
private Label _stunLabel;
private Tween _animTween;
private VBoxContainer _gaugesBox;
private bool _gaugesSubscribed;
private static Shader _dissolveShader;
/// <summary>Whether this widget belongs to the player party (affects highlight/targeting logic).</summary>
@@ -89,6 +93,13 @@ namespace Cthangover.FFBattle.UI
_stunLabel = GetNode<Label>("StatusBox/StunBadge/StunRow/StunLabel");
_selection = GetNode<Panel>("Selection");
// Extra bars of other mods (mana of battle_formulas…) go under the health bar.
var column = GetNode<VBoxContainer>("Info/Column");
_gaugesBox = new VBoxContainer { Name = "Gauges", MouseFilter = MouseFilterEnum.Ignore, Visible = false };
_gaugesBox.AddThemeConstantOverride("separation", 1);
column.AddChild(_gaugesBox);
column.MoveChild(_gaugesBox, GetNode<Control>("Info/Column/HpBarStack").GetIndex() + 1);
ApplyStyles();
}
@@ -119,6 +130,13 @@ namespace Cthangover.FFBattle.UI
if (_atkLabel != null)
_atkLabel.Visible = !IsPlayer;
if (!_gaugesSubscribed)
{
_gaugesSubscribed = true;
BattleUnitGauges.Changed += OnGaugesChanged;
TreeExiting += () => BattleUnitGauges.Changed -= OnGaugesChanged;
}
UpdateInfo();
}
@@ -172,6 +190,70 @@ namespace Cthangover.FFBattle.UI
}
RefreshStun();
RefreshGauges();
}
private void OnGaugesChanged(string unitId)
{
if (unitId == null || unitId == Card?.ID)
RefreshGauges();
}
/// <summary>
/// Draws the <see cref="BattleUnitGauges"/> of a party member, one thin bar with its label
/// and numbers per gauge; rows are reused by position.
/// </summary>
private void RefreshGauges()
{
if (_gaugesBox == null || !IsInstanceValid(this) || IsQueuedForDeletion())
return;
var gauges = IsPlayer && Card != null ? BattleUnitGauges.Read(Card) : new List<BattleGauge>();
_gaugesBox.Visible = gauges.Count > 0;
while (_gaugesBox.GetChildCount() > gauges.Count)
{
var extra = _gaugesBox.GetChild(_gaugesBox.GetChildCount() - 1);
_gaugesBox.RemoveChild(extra);
extra.QueueFree();
}
for (var i = 0; i < gauges.Count; i++)
{
var row = i < _gaugesBox.GetChildCount() ? (HBoxContainer)_gaugesBox.GetChild(i) : CreateGaugeRow();
var gauge = gauges[i];
row.GetNode<Label>("Key").Text = TranslationServer.Translate(gauge.Label ?? gauge.Id ?? string.Empty).ToString();
var bar = row.GetNode<ProgressBar>("Bar");
bar.Value = Mathf.Clamp(gauge.Current / (float)gauge.Max, 0f, 1f) * 100f;
var color = string.IsNullOrWhiteSpace(gauge.Color) ? UiTokens.Info : Color.FromString(gauge.Color, UiTokens.Info);
bar.AddThemeStyleboxOverride("fill", UiKit.Frame(UiTokens.RadiusSm, color));
row.GetNode<Label>("Value").Text = $"{gauge.Current}/{gauge.Max}";
}
}
private HBoxContainer CreateGaugeRow()
{
var row = new HBoxContainer { MouseFilter = MouseFilterEnum.Ignore };
row.AddThemeConstantOverride("separation", 4);
var key = new Label { Name = "Key", MouseFilter = MouseFilterEnum.Ignore };
key.AddThemeFontSizeOverride("font_size", UiTokens.FontTiny);
key.AddThemeColorOverride("font_color", UiTokens.Muted);
var bar = new ProgressBar
{
Name = "Bar",
ShowPercentage = false,
MaxValue = 100,
CustomMinimumSize = new Vector2(0, 5),
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ShrinkCenter,
MouseFilter = MouseFilterEnum.Ignore,
};
bar.AddThemeStyleboxOverride("background", UiKit.Frame(UiTokens.RadiusSm, UiTokens.StatBg));
var value = new Label { Name = "Value", MouseFilter = MouseFilterEnum.Ignore };
value.AddThemeFontSizeOverride("font_size", UiTokens.FontTiny);
value.AddThemeColorOverride("font_color", UiTokens.Info);
row.AddChild(key);
row.AddChild(bar);
row.AddChild(value);
_gaugesBox.AddChild(row);
return row;
}
/// <summary>Shows a coloured selection frame over the card with a 0.15s fade.</summary>