101 lines
4.1 KiB
GDScript
101 lines
4.1 KiB
GDScript
extends Control
|
||
|
||
signal ship_selected
|
||
signal close_requested
|
||
const CATALOG := preload("res://scripts/game/ship_catalog.gd")
|
||
|
||
@onready var ship_grid: GridContainer = %ShipGrid
|
||
@onready var close_button: Button = %CloseButton
|
||
var button_group := ButtonGroup.new()
|
||
|
||
func _ready() -> void:
|
||
button_group.allow_unpress = false
|
||
close_button.pressed.connect(func() -> void: close_requested.emit())
|
||
_load_ships()
|
||
|
||
func _frame(accent: Color, highlighted: bool) -> StyleBoxFlat:
|
||
var style := StyleBoxFlat.new()
|
||
style.bg_color = Color("142b42") if highlighted else Color("0b192a")
|
||
style.border_color = accent if highlighted else Color("29435a")
|
||
style.set_border_width_all(2 if highlighted else 1)
|
||
style.set_corner_radius_all(10)
|
||
style.shadow_color = Color(0, 0, 0, 0.3)
|
||
style.shadow_size = 5
|
||
return style
|
||
|
||
func _label(text: String, font_size: int, color: Color) -> Label:
|
||
var label := Label.new()
|
||
label.text = text
|
||
label.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
label.add_theme_font_size_override("font_size", font_size)
|
||
label.add_theme_color_override("font_color", color)
|
||
return label
|
||
|
||
func _load_ships() -> void:
|
||
var selected_ship := CATALOG.for_path(GameState.selected_ship_path)
|
||
for chassis in CATALOG.SHIPS:
|
||
var texture := load(CATALOG.texture_path(chassis)) as Texture2D
|
||
if texture == null:
|
||
continue
|
||
var accent: Color = chassis["accent"]
|
||
var button := Button.new()
|
||
button.name = "Ship%d" % int(chassis["number"])
|
||
button.custom_minimum_size = Vector2(250, 258)
|
||
button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||
button.toggle_mode = true
|
||
button.button_group = button_group
|
||
button.add_theme_stylebox_override("normal", _frame(accent, false))
|
||
for state in ["hover", "pressed", "hover_pressed", "focus"]:
|
||
button.add_theme_stylebox_override(state, _frame(accent, true))
|
||
var contents := VBoxContainer.new()
|
||
contents.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
button.add_child(contents)
|
||
contents.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||
contents.offset_left = 16
|
||
contents.offset_right = -16
|
||
contents.offset_top = 12
|
||
contents.offset_bottom = -12
|
||
contents.add_theme_constant_override("separation", 5)
|
||
contents.add_child(_label(chassis["name"].to_upper(), 22, Color("edf6ff")))
|
||
contents.add_child(_label(chassis["role"], 11, accent))
|
||
var preview := TextureRect.new()
|
||
preview.custom_minimum_size.y = 128
|
||
preview.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||
preview.texture = texture
|
||
preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
||
preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
||
preview.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
preview.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR
|
||
contents.add_child(preview)
|
||
var stats := GridContainer.new()
|
||
stats.columns = 2
|
||
stats.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
stats.add_theme_constant_override("h_separation", 14)
|
||
stats.add_theme_constant_override("v_separation", 4)
|
||
for stat in [["Kadłub", "hull", ""], ["Tarcze", "shields", ""], ["Energia", "energy", ""], ["Prędkość", "speed", " px/s"]]:
|
||
var value := _label("%s %d%s" % [stat[0], chassis[stat[1]], stat[2]], 13, Color("bfd4e5"))
|
||
value.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||
stats.add_child(value)
|
||
contents.add_child(stats)
|
||
var launch := _label("WYBIERZ I WYSTARTUJ ›", 11, accent)
|
||
launch.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
|
||
contents.add_child(launch)
|
||
button.tooltip_text = "%s\nStatystyki bazowe przed bonusami modułów.\n%s" % [chassis["name"], CATALOG.stats_text(chassis)]
|
||
button.pressed.connect(_choose_ship.bind(chassis, button))
|
||
ship_grid.add_child(button)
|
||
if chassis["number"] == selected_ship["number"]:
|
||
_select_ship(chassis, button)
|
||
|
||
func _select_ship(chassis: Dictionary, button: Button) -> void:
|
||
GameState.selected_ship_path = CATALOG.texture_path(chassis)
|
||
button.button_pressed = true
|
||
|
||
func _choose_ship(chassis: Dictionary, button: Button) -> void:
|
||
_select_ship(chassis, button)
|
||
ship_selected.emit()
|
||
|
||
func _unhandled_input(event: InputEvent) -> void:
|
||
if visible and event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE:
|
||
close_requested.emit()
|
||
get_viewport().set_input_as_handled()
|