Add icon chips to top battle HUD

This commit is contained in:
2026-06-19 22:27:25 +09:00
parent b5dceea848
commit 4b22c13ca9
2 changed files with 134 additions and 16 deletions

View File

@@ -107,6 +107,7 @@ const HUD_UNIT_SUMMARY_SIZE := Vector2(320, 42)
const HUD_UNIT_BADGE_ROW_SIZE := Vector2(320, 22)
const HUD_UNIT_BADGE_SIZE := Vector2(26, 22)
const HUD_UNIT_BAR_SIZE := Vector2(252, 12)
const TOP_HUD_CHIP_ICON_SIZE := Vector2(28, 28)
const HUD_COMMAND_GRID_SIZE := Vector2(420, 46)
const HUD_COMMAND_BUTTON_SIZE := Vector2(72, 42)
const HUD_COMMAND_GRID_COLUMNS := 4
@@ -310,6 +311,9 @@ var battle_result_summary := {}
var post_battle_dialogue_started := false
var campaign_complete_screen := false
var top_status_chip: PanelContainer
var top_objective_chip: PanelContainer
var top_campaign_chip: PanelContainer
var status_label: Label
var objective_label: Label
var campaign_status_label: Label
@@ -1104,6 +1108,50 @@ func _format_local_command_tooltip(label: String, hint: String) -> String:
return "%s\n%s" % [normalized_label, normalized_hint]
func _make_top_hud_chip(node_name: String, icon_kind: String, chip_size: Vector2, variant: String) -> Dictionary:
var chip := PanelContainer.new()
chip.name = node_name
chip.custom_minimum_size = chip_size
chip.size_flags_vertical = Control.SIZE_SHRINK_CENTER
_apply_panel_style(chip, variant)
var row := HBoxContainer.new()
row.add_theme_constant_override("separation", 6)
chip.add_child(row)
row.add_child(_make_top_hud_chip_icon(icon_kind))
return {
"chip": chip,
"row": row
}
func _make_top_hud_chip_icon(icon_kind: String) -> TextureRect:
var icon := TextureRect.new()
icon.name = "TopHudChipIcon"
icon.custom_minimum_size = TOP_HUD_CHIP_ICON_SIZE
icon.size_flags_vertical = Control.SIZE_SHRINK_CENTER
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
icon.texture = _make_toolbar_icon(icon_kind)
return icon
func _set_top_hud_chip_tooltip(chip: PanelContainer, tooltip: String) -> void:
if chip == null:
return
_set_control_tree_tooltip(chip, tooltip)
func _set_control_tree_tooltip(node: Node, tooltip: String) -> void:
if node == null:
return
if node is Control:
(node as Control).tooltip_text = tooltip
for child in node.get_children():
_set_control_tree_tooltip(child, tooltip)
func _make_toolbar_icon(kind: String) -> Texture2D:
var image := Image.create(32, 32, false, Image.FORMAT_RGBA8)
image.fill(Color(0, 0, 0, 0))
@@ -1111,6 +1159,30 @@ func _make_toolbar_icon(kind: String) -> Texture2D:
var shadow := Color(0.07, 0.028, 0.012, 0.82)
var red := Color(UI_SEAL_RED.r, UI_SEAL_RED.g, UI_SEAL_RED.b, 1.0)
match kind:
"status":
_icon_circle_outline(image, Vector2i(16, 16), 10, shadow, 4)
_icon_circle_outline(image, Vector2i(16, 16), 10, ink, 2)
_icon_line(image, Vector2i(16, 8), Vector2i(16, 16), red, 3)
_icon_line(image, Vector2i(16, 16), Vector2i(22, 20), red, 3)
_icon_circle(image, Vector2i(16, 16), 2, ink)
"objective":
_icon_line(image, Vector2i(16, 6), Vector2i(26, 16), shadow, 4)
_icon_line(image, Vector2i(26, 16), Vector2i(16, 26), shadow, 4)
_icon_line(image, Vector2i(16, 26), Vector2i(6, 16), shadow, 4)
_icon_line(image, Vector2i(6, 16), Vector2i(16, 6), shadow, 4)
_icon_line(image, Vector2i(16, 6), Vector2i(26, 16), ink, 2)
_icon_line(image, Vector2i(26, 16), Vector2i(16, 26), ink, 2)
_icon_line(image, Vector2i(16, 26), Vector2i(6, 16), ink, 2)
_icon_line(image, Vector2i(6, 16), Vector2i(16, 6), ink, 2)
_icon_circle(image, Vector2i(16, 16), 5, red)
_icon_circle(image, Vector2i(16, 16), 2, ink)
"campaign":
_icon_rect(image, Rect2i(8, 7, 17, 20), shadow)
_icon_rect(image, Rect2i(7, 6, 17, 20), ink)
_icon_rect(image, Rect2i(10, 10, 11, 2), Color(0.16, 0.07, 0.03, 1.0))
_icon_rect(image, Rect2i(10, 15, 10, 2), Color(0.16, 0.07, 0.03, 1.0))
_icon_rect(image, Rect2i(10, 20, 8, 2), Color(0.16, 0.07, 0.03, 1.0))
_icon_circle(image, Vector2i(24, 9), 3, red)
"move":
_icon_line(image, Vector2i(8, 22), Vector2i(16, 9), shadow, 5)
_icon_line(image, Vector2i(16, 9), Vector2i(24, 22), shadow, 5)
@@ -1705,37 +1777,47 @@ func _create_hud() -> void:
top_row.add_theme_constant_override("separation", 8)
top_bar.add_child(top_row)
var status_chip_data := _make_top_hud_chip("TopStatusChip", "status", Vector2(138, 54), "hud_info")
top_status_chip = status_chip_data["chip"] as PanelContainer
top_row.add_child(top_status_chip)
status_label = Label.new()
status_label.custom_minimum_size = Vector2(118, 48)
status_label.custom_minimum_size = Vector2(74, 36)
status_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
status_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
_apply_label_style(status_label, UI_PARCHMENT_TEXT)
top_row.add_child(status_label)
(status_chip_data["row"] as HBoxContainer).add_child(status_label)
var objective_top_panel := PanelContainer.new()
objective_top_panel.custom_minimum_size = Vector2(396, 54)
_apply_panel_style(objective_top_panel, "edict_compact")
top_row.add_child(objective_top_panel)
top_objective_chip = PanelContainer.new()
top_objective_chip.name = "TopObjectiveChip"
top_objective_chip.custom_minimum_size = Vector2(396, 54)
_apply_panel_style(top_objective_chip, "edict_compact")
top_row.add_child(top_objective_chip)
var objective_top_row := HBoxContainer.new()
objective_top_row.add_theme_constant_override("separation", 7)
objective_top_panel.add_child(objective_top_row)
objective_top_row.add_child(_make_bamboo_gutter(14, 36))
objective_top_row.add_theme_constant_override("separation", 6)
top_objective_chip.add_child(objective_top_row)
objective_top_row.add_child(_make_bamboo_gutter(10, 36))
objective_top_row.add_child(_make_top_hud_chip_icon("objective"))
objective_label = Label.new()
objective_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
objective_label.custom_minimum_size = Vector2(318, 36)
objective_label.custom_minimum_size = Vector2(274, 36)
objective_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_apply_label_style(objective_label, UI_AGED_INK, OBJECTIVE_HUD_FONT_SIZE)
objective_top_row.add_child(objective_label)
objective_top_row.add_child(_make_bamboo_gutter(14, 36))
objective_top_row.add_child(_make_bamboo_gutter(10, 36))
var campaign_chip_data := _make_top_hud_chip("TopCampaignChip", "campaign", Vector2(156, 54), "hud_info")
top_campaign_chip = campaign_chip_data["chip"] as PanelContainer
top_row.add_child(top_campaign_chip)
campaign_status_label = Label.new()
campaign_status_label.custom_minimum_size = Vector2(144, 48)
campaign_status_label.custom_minimum_size = Vector2(88, 36)
campaign_status_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
campaign_status_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
_apply_label_style(campaign_status_label, UI_PARCHMENT_TEXT)
top_row.add_child(campaign_status_label)
(campaign_chip_data["row"] as HBoxContainer).add_child(campaign_status_label)
var top_tool_row := HBoxContainer.new()
top_tool_row.name = "TopToolBar"
@@ -6327,18 +6409,24 @@ func _refresh_ranges() -> void:
func _update_hud() -> void:
var status_detail := _format_status_hud_detail_text()
status_label.text = _format_status_hud_text()
status_label.tooltip_text = _format_status_hud_detail_text()
status_label.tooltip_text = status_detail
_set_top_hud_chip_tooltip(top_status_chip, status_detail)
var objective_detail := _format_objective_hud_detail_text()
objective_label.text = _format_objective_hud_text()
objective_label.tooltip_text = _format_objective_hud_detail_text()
objective_label.tooltip_text = objective_detail
_set_top_hud_chip_tooltip(top_objective_chip, objective_detail)
_fit_label_font_size_to_text(
objective_label,
objective_label.text,
OBJECTIVE_HUD_FONT_SIZE,
OBJECTIVE_HUD_MIN_FONT_SIZE
)
var campaign_detail := campaign_state.get_progress_text()
campaign_status_label.text = _format_campaign_hud_summary_text()
campaign_status_label.tooltip_text = campaign_state.get_progress_text()
campaign_status_label.tooltip_text = campaign_detail
_set_top_hud_chip_tooltip(top_campaign_chip, campaign_detail)
_update_mission_panel()
_update_cell_info()
_update_forecast()