first commit
This commit is contained in:
253
Scripts/Day_night_Cycle.gd
Normal file
253
Scripts/Day_night_Cycle.gd
Normal file
@@ -0,0 +1,253 @@
|
||||
extends Node3D
|
||||
|
||||
@export_group("Luce Direzionale e Ambiente")
|
||||
@export var color_mattina: Color = Color(1.0, 0.9, 0.8, 1.0)
|
||||
@export var color_pomeriggio: Color = Color(1.0, 0.6, 0.2, 1.0)
|
||||
@export var color_notte: Color = Color(0.1, 0.1, 0.3, 1.0)
|
||||
|
||||
@export_group("Colori Cielo - Alto (Top)")
|
||||
@export var sky_top_mattina: Color = Color(0.35, 0.65, 0.9, 1.0)
|
||||
@export var sky_top_pomeriggio: Color = Color(0.7, 0.45, 0.2, 1.0)
|
||||
@export var sky_top_notte: Color = Color(0.05, 0.05, 0.15, 1.0)
|
||||
|
||||
@export_group("Colori Cielo - Orizzonte (Horizon)")
|
||||
@export var sky_horizon_mattina: Color = Color(0.75, 0.85, 0.95, 1.0)
|
||||
@export var sky_horizon_pomeriggio: Color = Color(0.95, 0.65, 0.35, 1.0)
|
||||
@export var sky_horizon_notte: Color = Color(0.15, 0.1, 0.25, 1.0)
|
||||
|
||||
@export_group("Ciclo Temporale")
|
||||
@export_range(1.0, 3.0) var tempo_giorno: float = 1.0
|
||||
@export var durata_transizione: float = 3.0
|
||||
@export_range(0.0, 1.0) var energia_luce_notte: float = 0.3
|
||||
|
||||
@export_group("Materiali Extra")
|
||||
@export var materiale_nebbia: ShaderMaterial
|
||||
@export var materiale_pioggia_gocce: StandardMaterial3D
|
||||
|
||||
@export_group("Meteo (Pioggia & Fulmini)")
|
||||
@export var colore_mood_pioggia: Color = Color(0.5, 0.6, 0.7, 1.0)
|
||||
@export var tempo_min_fulmine: float = 5.0
|
||||
@export var tempo_max_fulmine: float = 15.0
|
||||
@export var colore_fulmine: Color = Color(1.0, 1.0, 0.8, 1.0)
|
||||
@export var fulmini_min: int = 1
|
||||
@export var fulmini_max: int = 3
|
||||
@export var scala_min_fulmine: float = 1.0
|
||||
@export var scala_max_fulmine: float = 3.0
|
||||
|
||||
# --- NUOVI PARAMETRI CINEMATIC MODE ---
|
||||
@export_group("Cinematic Mode Ambiente")
|
||||
@export var intervallo_eventi_meteo: float = 8.0 # Ogni quanti secondi cambia qualcosa da solo
|
||||
|
||||
@onready var sole: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var ambiente: WorldEnvironment = $WorldEnvironment
|
||||
@onready var menu_giornata: OptionButton = $CanvasLayer/OptionButton
|
||||
@onready var bottone_pioggia: CheckButton = $CanvasLayer/CheckButtonPioggia
|
||||
@onready var particelle_pioggia: GPUParticles3D = $SubViewportContainer/SubViewport/World/Camere/PioggiaCadente
|
||||
|
||||
# --- NODI FULMINE ---
|
||||
@onready var luce_lampo: DirectionalLight3D = $LuceLampo
|
||||
@onready var sprite_fulmine: Sprite3D = $SpriteFulmine
|
||||
|
||||
var tween_giorno: Tween
|
||||
var is_raining: bool = false
|
||||
var intensita_pioggia: float = 0.0
|
||||
var timer_prossimo_fulmine: float = 0.0
|
||||
|
||||
# Variabili Cinematic Mode
|
||||
var is_cinematic_mode: bool = false
|
||||
var timer_cinematic_env: float = 0.0
|
||||
var sto_cambiando_in_cinematic: bool = false # Serve per non disattivare la modalità quando lo script clicca i bottoni da solo
|
||||
|
||||
func _ready() -> void:
|
||||
if menu_giornata:
|
||||
menu_giornata.clear()
|
||||
menu_giornata.add_item("1 - Mattina")
|
||||
menu_giornata.add_item("2 - Pomeriggio")
|
||||
menu_giornata.add_item("3 - Notte")
|
||||
menu_giornata.selected = int(tempo_giorno) - 1
|
||||
menu_giornata.item_selected.connect(_on_giornata_selezionata)
|
||||
|
||||
if bottone_pioggia:
|
||||
bottone_pioggia.toggled.connect(_on_pioggia_toggled)
|
||||
|
||||
if particelle_pioggia:
|
||||
particelle_pioggia.emitting = false
|
||||
|
||||
_resetta_timer_fulmine()
|
||||
|
||||
# --- ASCOLTO TASTIERA PER CINEMATIC MODE ---
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event is InputEventKey and event.pressed and not event.echo:
|
||||
|
||||
# Attiva/Disattiva con C
|
||||
if event.keycode == KEY_C:
|
||||
is_cinematic_mode = !is_cinematic_mode
|
||||
if is_cinematic_mode:
|
||||
timer_cinematic_env = intervallo_eventi_meteo # Fa scattare un evento quasi subito
|
||||
print("Ambiente Cinematic: ATTIVATA")
|
||||
else:
|
||||
print("Ambiente Cinematic: DISATTIVATA")
|
||||
return
|
||||
|
||||
# Se premi le camere, si ferma la cinematic mode
|
||||
if event.keycode in [KEY_1, KEY_2, KEY_3, KEY_4, KEY_5]:
|
||||
if is_cinematic_mode:
|
||||
is_cinematic_mode = false
|
||||
print("Ambiente Cinematic: DISATTIVATA (Cambio camera manuale)")
|
||||
|
||||
func _on_giornata_selezionata(index: int) -> void:
|
||||
# Se l'utente clicca la tendina a mano, spegni la cinematic mode
|
||||
if not sto_cambiando_in_cinematic and is_cinematic_mode:
|
||||
is_cinematic_mode = false
|
||||
print("Ambiente Cinematic: DISATTIVATA (Orario cambiato manualmente)")
|
||||
|
||||
var target_tempo = float(index + 1)
|
||||
if tween_giorno and tween_giorno.is_valid():
|
||||
tween_giorno.kill()
|
||||
tween_giorno = create_tween()
|
||||
tween_giorno.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||
tween_giorno.tween_property(self, "tempo_giorno", target_tempo, durata_transizione)
|
||||
|
||||
func _on_pioggia_toggled(toggled_on: bool) -> void:
|
||||
# Se l'utente clicca il bottone della pioggia a mano, spegni la cinematic mode
|
||||
if not sto_cambiando_in_cinematic and is_cinematic_mode:
|
||||
is_cinematic_mode = false
|
||||
print("Ambiente Cinematic: DISATTIVATA (Pioggia cambiata manualmente)")
|
||||
|
||||
is_raining = toggled_on
|
||||
if particelle_pioggia:
|
||||
particelle_pioggia.emitting = is_raining
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
# --- LOGICA EVENTI CASUALI CINEMATIC MODE ---
|
||||
if is_cinematic_mode:
|
||||
timer_cinematic_env -= delta
|
||||
if timer_cinematic_env <= 0.0:
|
||||
_genera_evento_meteo_casuale()
|
||||
# Reset timer con un po' di casualità per non renderlo troppo robotico
|
||||
timer_cinematic_env = randf_range(intervallo_eventi_meteo * 0.8, intervallo_eventi_meteo * 1.5)
|
||||
|
||||
# --- LOGICA NORMALE AMBIENTE ---
|
||||
var base_tint: Color
|
||||
var base_sky_top: Color
|
||||
var base_sky_horizon: Color
|
||||
|
||||
if is_raining:
|
||||
intensita_pioggia = move_toward(intensita_pioggia, 1.0, delta * 0.5)
|
||||
|
||||
timer_prossimo_fulmine -= delta
|
||||
if timer_prossimo_fulmine <= 0.0:
|
||||
_scatena_fulmine()
|
||||
_resetta_timer_fulmine()
|
||||
else:
|
||||
intensita_pioggia = move_toward(intensita_pioggia, 0.0, delta * 0.5)
|
||||
|
||||
if tempo_giorno <= 2.0:
|
||||
var t = tempo_giorno - 1.0
|
||||
base_tint = color_mattina.lerp(color_pomeriggio, t)
|
||||
base_sky_top = sky_top_mattina.lerp(sky_top_pomeriggio, t)
|
||||
base_sky_horizon = sky_horizon_mattina.lerp(sky_horizon_pomeriggio, t)
|
||||
else:
|
||||
var t = tempo_giorno - 2.0
|
||||
base_tint = color_pomeriggio.lerp(color_notte, t)
|
||||
base_sky_top = sky_top_pomeriggio.lerp(sky_top_notte, t)
|
||||
base_sky_horizon = sky_horizon_pomeriggio.lerp(sky_horizon_notte, t)
|
||||
|
||||
var final_tint = base_tint.lerp(base_tint * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_sky_top = base_sky_top.lerp(base_sky_top * colore_mood_pioggia, intensita_pioggia)
|
||||
var final_sky_horizon = base_sky_horizon.lerp(base_sky_horizon * colore_mood_pioggia, intensita_pioggia)
|
||||
|
||||
var night_val = clamp(tempo_giorno - 2.0, 0.0, 1.0)
|
||||
var colore_riflesso = Color(0.4, 0.5, 0.6, 1.0)
|
||||
var colore_gocce = final_sky_horizon.lerp(colore_riflesso, 0.15)
|
||||
colore_gocce = colore_gocce.lerp(colore_gocce * 0.4, night_val)
|
||||
|
||||
if materiale_pioggia_gocce:
|
||||
materiale_pioggia_gocce.albedo_color = colore_gocce
|
||||
|
||||
if sole:
|
||||
sole.light_color = final_tint
|
||||
var target_energy = lerp(1.0, energia_luce_notte, night_val)
|
||||
sole.light_energy = lerp(target_energy, target_energy * 0.4, intensita_pioggia)
|
||||
|
||||
if ambiente and ambiente.environment:
|
||||
ambiente.environment.ambient_light_color = final_tint
|
||||
ambiente.environment.fog_light_color = final_sky_horizon
|
||||
|
||||
var sky_mat = ambiente.environment.sky.sky_material as ShaderMaterial
|
||||
if sky_mat:
|
||||
sky_mat.set_shader_parameter("sky_top_color", final_sky_top)
|
||||
sky_mat.set_shader_parameter("sky_horizon_color", final_sky_horizon)
|
||||
sky_mat.set_shader_parameter("sun_color", final_tint)
|
||||
sky_mat.set_shader_parameter("night_intensity", night_val)
|
||||
|
||||
if materiale_nebbia:
|
||||
materiale_nebbia.set_shader_parameter("night_intensity", night_val)
|
||||
materiale_nebbia.set_shader_parameter("sun_color", final_tint)
|
||||
|
||||
# --- FUNZIONE GENERATORE CASUALE ---
|
||||
func _genera_evento_meteo_casuale() -> void:
|
||||
sto_cambiando_in_cinematic = true # Avvisiamo il codice che stiamo facendo modifiche "automatiche"
|
||||
|
||||
var scelta = randi() % 3
|
||||
|
||||
if scelta == 0:
|
||||
# Cambia orario
|
||||
var nuovo_orario = randi() % 3
|
||||
if menu_giornata:
|
||||
menu_giornata.selected = nuovo_orario
|
||||
_on_giornata_selezionata(nuovo_orario)
|
||||
|
||||
elif scelta == 1:
|
||||
# Cambia meteo (accende o spegne la pioggia)
|
||||
var piove = randf() > 0.5
|
||||
if bottone_pioggia:
|
||||
bottone_pioggia.set_pressed_no_signal(piove)
|
||||
_on_pioggia_toggled(piove)
|
||||
|
||||
elif scelta == 2:
|
||||
# Forza un fulmine (se non piove, fa iniziare a piovere per dare senso al fulmine!)
|
||||
if not is_raining:
|
||||
if bottone_pioggia:
|
||||
bottone_pioggia.set_pressed_no_signal(true)
|
||||
_on_pioggia_toggled(true)
|
||||
_scatena_fulmine()
|
||||
|
||||
sto_cambiando_in_cinematic = false # Fine modifiche automatiche
|
||||
|
||||
# --- FUNZIONI FULMINI ---
|
||||
|
||||
func _resetta_timer_fulmine() -> void:
|
||||
timer_prossimo_fulmine = randf_range(tempo_min_fulmine, tempo_max_fulmine)
|
||||
|
||||
func _scatena_fulmine() -> void:
|
||||
if luce_lampo:
|
||||
var tween_luce = create_tween()
|
||||
luce_lampo.light_energy = 5.0
|
||||
|
||||
tween_luce.tween_interval(0.05)
|
||||
tween_luce.tween_callback(func(): luce_lampo.light_energy = 0.0)
|
||||
tween_luce.tween_interval(0.05)
|
||||
tween_luce.tween_callback(func(): luce_lampo.light_energy = 2.0)
|
||||
tween_luce.tween_method(func(val): luce_lampo.light_energy = val, 2.0, 0.0, 0.2)
|
||||
|
||||
var numero_scariche = randi_range(fulmini_min, fulmini_max)
|
||||
|
||||
for i in numero_scariche:
|
||||
if sprite_fulmine:
|
||||
var angolo_casuale = randf() * PI * 2.0
|
||||
var distanza = 20.0
|
||||
sprite_fulmine.position = Vector3(cos(angolo_casuale) * distanza, 20.0, sin(angolo_casuale) * distanza)
|
||||
|
||||
sprite_fulmine.modulate = colore_fulmine
|
||||
sprite_fulmine.modulate.a = 1.0
|
||||
|
||||
var s = randf_range(scala_min_fulmine, scala_max_fulmine)
|
||||
sprite_fulmine.scale = Vector3(s, s, s)
|
||||
|
||||
var tween_sprite = create_tween()
|
||||
tween_sprite.tween_interval(0.1)
|
||||
tween_sprite.tween_property(sprite_fulmine, "modulate:a", 0.0, 0.2)
|
||||
|
||||
if numero_scariche > 1:
|
||||
await get_tree().create_timer(randf_range(0.05, 0.15)).timeout
|
||||
Reference in New Issue
Block a user