Refactor Godot architecture into AppShell, modular menus and game domains

This commit is contained in:
enne2
2026-09-06 17:07:05 +02:00
parent a73fb4b55f
commit f4a9da6bc3
209 changed files with 2726 additions and 2072 deletions
+61
View File
@@ -0,0 +1,61 @@
class_name P1HomeScreen
extends Control
## P1: home con i due tendoni/percorsi.
signal juggle_requested(focal: Control)
signal gym_requested(focal: Control)
signal exit_requested
const HOME_BG := preload("res://menus/assets/common/1_sfondo.png")
const CLOUDS := preload("res://menus/assets/common/1_nuvole.png")
const BLUE_TENT := preload("res://menus/assets/p1/1_tendone_1.png")
const RED_TENT := preload("res://menus/assets/p1/1_tendone_2.png")
const BACK_BUTTON := preload("res://menus/assets/common/pulsante_indietro.png")
const SETTINGS_BUTTON := preload("res://menus/assets/common/pulsante_rotellina.png")
const CIRCUS_SIGN := preload("res://menus/assets/p1/upendi_circus_sign.svg")
func _ready() -> void:
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
_build()
func _build() -> void:
MenuUI.add_full_texture(self, HOME_BG)
MenuUI.add_full_texture(self, CLOUDS, MenuUI.ambient_material(1.0, 0.16))
_add_sign()
var blue := MenuUI.add_image_button(self, BLUE_TENT, Vector2(0.29, 0.64), Vector2(0.36, 0.59))
blue.material = MenuUI.ambient_material(0.65, 0.20)
blue.pressed.connect(func(): juggle_requested.emit(blue))
var red := MenuUI.add_image_button(self, RED_TENT, Vector2(0.71, 0.64), Vector2(0.36, 0.59))
red.material = MenuUI.ambient_material(0.65, 0.20)
red.pressed.connect(func(): gym_requested.emit(red))
_add_star(Vector2(0.28, 0.18), "1", func(): juggle_requested.emit(blue))
_add_star(Vector2(0.72, 0.18), "2", func(): gym_requested.emit(red))
MenuUI.add_label(self, "Tocca un tendone e scopri il gioco!", Vector2(0.50, 0.91), Vector2(0.55, 0.07), 24)
MenuUI.add_image(self, SETTINGS_BUTTON, Vector2(0.91, 0.13), Vector2(0.09, 0.14))
if not OS.has_feature("web"):
var exit_button := MenuUI.add_image_button(self, BACK_BUTTON, Vector2(0.075, 0.13), Vector2(0.09, 0.14))
exit_button.pressed.connect(func(): exit_requested.emit())
func _add_sign() -> void:
MenuUI.add_image(self, CIRCUS_SIGN, Vector2(0.50, 0.14), Vector2(0.33, 0.22))
var brand := MenuUI.add_label(self, "Upendi", Vector2(0.50, 0.125), Vector2(0.25, 0.08), 42)
brand.add_theme_color_override("font_color", Color("#f8f0d3"))
brand.add_theme_color_override("font_outline_color", Color("#283f49"))
brand.add_theme_constant_override("outline_size", 3)
var circus := MenuUI.add_label(self, "C I R C U S", Vector2(0.50, 0.175), Vector2(0.20, 0.05), 17)
circus.add_theme_color_override("font_color", Color("#f8f0d3"))
circus.add_theme_color_override("font_outline_color", Color("#283f49"))
func _add_star(center: Vector2, number: String, action: Callable) -> void:
var label := MenuUI.add_label(self, "★\n" + number, center, Vector2(0.08, 0.13), 27)
label.add_theme_color_override("font_color", Color("#f6d45f"))
label.add_theme_color_override("font_outline_color", Color("#4e3423"))
label.add_theme_constant_override("outline_size", 5)
var hotspot := MenuUI.add_hotspot(self, center, Vector2(0.10, 0.16))
hotspot.pressed.connect(func(): action.call())
@@ -0,0 +1 @@
uid://d3iwd73jo7uw
@@ -0,0 +1,70 @@
class_name P2AJuggleMenuScreen
extends Control
## P2a: configurazione visuale del percorso JuggleBoard.
## Il numero palline è deliberatamente locale al menu e non modifica il gioco.
signal back_requested
signal mode_requested
signal feedback_requested(frequency: float)
const BG := preload("res://menus/assets/p2a/2a_sfondo.png")
const CLOUDS := preload("res://menus/assets/common/1_nuvole.png")
const TENT := preload("res://menus/assets/p2a/2a_tendone.png")
const TITLE := preload("res://menus/assets/p2a/2a_titolo.png")
const LEFT_ARROW := preload("res://menus/assets/common/freccina_sx.png")
const RIGHT_ARROW := preload("res://menus/assets/common/freccina_dx.png")
const BACK_BUTTON := preload("res://menus/assets/common/pulsante_indietro.png")
const SETTINGS_BUTTON := preload("res://menus/assets/common/pulsante_rotellina.png")
const PLAY_BUTTON := preload("res://menus/assets/common/pulsante_gioca.png")
var balls_count := 5
var count_label: Label
var left_button: TextureButton
var right_button: TextureButton
func _ready() -> void:
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
_build()
func _build() -> void:
MenuUI.add_full_texture(self, BG)
MenuUI.add_full_texture(self, CLOUDS, MenuUI.ambient_material(1.0, 0.16))
MenuUI.add_image(self, TENT, Vector2(0.28, 0.59), Vector2(0.56, 0.78), MenuUI.ambient_material(0.60, 0.20))
MenuUI.add_image(self, TITLE, Vector2(0.68, 0.22), Vector2(0.34, 0.28))
var back := MenuUI.add_image_button(self, BACK_BUTTON, Vector2(0.075, 0.13), Vector2(0.09, 0.14))
back.pressed.connect(func(): back_requested.emit())
MenuUI.add_image(self, SETTINGS_BUTTON, Vector2(0.91, 0.13), Vector2(0.09, 0.14))
_build_selector()
var play := MenuUI.add_image_button(self, PLAY_BUTTON, Vector2(0.79, 0.83), Vector2(0.30, 0.115))
play.pressed.connect(func():
feedback_requested.emit(784.0)
mode_requested.emit()
)
func _build_selector() -> void:
MenuUI.add_label(self, "N° palline", Vector2(0.68, 0.57), Vector2(0.23, 0.06), 22)
left_button = MenuUI.add_image_button(self, LEFT_ARROW, Vector2(0.68, 0.67), Vector2(0.055, 0.075))
left_button.pressed.connect(func(): _change_balls(-1))
right_button = MenuUI.add_image_button(self, RIGHT_ARROW, Vector2(0.87, 0.67), Vector2(0.055, 0.075))
right_button.pressed.connect(func(): _change_balls(1))
count_label = MenuUI.add_label(self, str(balls_count), Vector2(0.775, 0.67), Vector2(0.10, 0.09), 32)
_update_arrow_state()
func _change_balls(delta: int) -> void:
balls_count = clampi(balls_count + delta, 1, 5)
count_label.text = str(balls_count)
feedback_requested.emit(440.0 + 45.0 * balls_count)
_update_arrow_state()
func _update_arrow_state() -> void:
left_button.disabled = balls_count <= 1
right_button.disabled = balls_count >= 5
left_button.modulate.a = 0.35 if left_button.disabled else 1.0
right_button.modulate.a = 0.35 if right_button.disabled else 1.0
@@ -0,0 +1 @@
uid://1mk8nvjs8r1g
@@ -0,0 +1,49 @@
class_name P3AGymMenuScreen
extends Control
## P3a: anteprima della futura Palestra di Giocoleria.
signal back_requested
signal feedback_requested(frequency: float)
const BG := preload("res://menus/assets/common/1_sfondo.png")
const CLOUDS := preload("res://menus/assets/common/1_nuvole.png")
const TENT := preload("res://menus/assets/p3a/3a_tendone.png")
const TITLE := preload("res://menus/assets/p3a/3a_titolo.png")
const BACK_BUTTON := preload("res://menus/assets/common/pulsante_indietro.png")
const SETTINGS_BUTTON := preload("res://menus/assets/common/pulsante_rotellina.png")
const PLAY_BUTTON := preload("res://menus/assets/common/pulsante_gioca.png")
func _ready() -> void:
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
_build()
func _build() -> void:
MenuUI.add_full_texture(self, BG)
MenuUI.add_full_texture(self, CLOUDS, MenuUI.ambient_material(1.0, 0.16))
MenuUI.add_image(self, TENT, Vector2(0.28, 0.59), Vector2(0.56, 0.78), MenuUI.ambient_material(0.60, 0.20))
MenuUI.add_image(self, TITLE, Vector2(0.68, 0.22), Vector2(0.34, 0.34))
var back := MenuUI.add_image_button(self, BACK_BUTTON, Vector2(0.075, 0.13), Vector2(0.09, 0.14))
back.pressed.connect(func(): back_requested.emit())
MenuUI.add_image(self, SETTINGS_BUTTON, Vector2(0.91, 0.13), Vector2(0.09, 0.14))
MenuUI.add_label(self, "N° giocolieri", Vector2(0.77, 0.57), Vector2(0.28, 0.06), 22)
MenuUI.add_label(self, "3", Vector2(0.88, 0.57), Vector2(0.08, 0.08), 30)
var play := MenuUI.add_image_button(self, PLAY_BUTTON, Vector2(0.79, 0.83), Vector2(0.30, 0.115))
play.pressed.connect(_show_coming_soon)
func _show_coming_soon() -> void:
feedback_requested.emit(260.0)
var note := MenuUI.add_label(self, "Presto disponibile", Vector2(0.79, 0.72), Vector2(0.28, 0.09), 24)
note.add_theme_color_override("font_color", Color("#4c2917"))
note.add_theme_stylebox_override("normal", MenuUI.note_style())
note.modulate.a = 0.0
var tween := create_tween()
tween.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS)
tween.tween_property(note, "modulate:a", 1.0, 0.16)
tween.tween_interval(1.6)
tween.tween_property(note, "modulate:a", 0.0, 0.28)
tween.tween_callback(note.queue_free)
@@ -0,0 +1 @@
uid://y6t4mu5wh602