diff --git a/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll b/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..2d345af Binary files /dev/null and b/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll differ diff --git a/core/biome_generator/biome_generator.gd b/core/biome_generator/biome_generator.gd index e35e13e..1b57198 100644 --- a/core/biome_generator/biome_generator.gd +++ b/core/biome_generator/biome_generator.gd @@ -86,7 +86,7 @@ const RIVER_NEIGHBOUR_OFFSETS: Dictionary = { ##max cells to search around a lamppost chunk @export_range(1, 6, 1) var lamppost_search_radius_cells: int = 3 ##max allowed distance between lamppost pairs -@export var lamppost_max_wire_distance: float = 60.0 +@export var lamppost_max_wire_distance: float = 35.0 ##if true wire connections blocked by colliders are discarded @export var lamppost_obstacle_check_enabled: bool = true diff --git a/core/daynight/environment_manager.gd b/core/daynight/environment_manager.gd index e93489a..c831518 100644 --- a/core/daynight/environment_manager.gd +++ b/core/daynight/environment_manager.gd @@ -39,6 +39,7 @@ var weather_controller: WeatherController var day_tween: Tween var day_time: float = 0.0 var pending_environment_nodes: Dictionary = {} +var weather_shader_no_noise: Material func _ready() -> void: @@ -80,6 +81,9 @@ func _ready() -> void: weather_controller.name = "WeatherController" add_child(weather_controller) + if day_night_controller != null: + select_day_time(day_night_controller.current_time) + func _process(_delta: float) -> void: _process_pending_environment_nodes() @@ -136,7 +140,7 @@ func _apply_dynamic_environment_materials(node: Node) -> void: _apply_wind_noise_to_node(node, NOISE_TEXTURE) if node.is_in_group("weather_node"): - _apply_weather_overlay_to_node(node, WEATHER_SHADER) + _apply_weather_overlay_to_node(node, _get_weather_overlay_material(node)) if _should_clear_weather_overlay(node): _clear_weather_overlay_from_node(node) @@ -162,12 +166,24 @@ func _apply_wind_noise_to_node(node: Node, noise_tex: Texture2D) -> void: func ApplyWeatherShaderToMaterials(): for node in get_tree().get_nodes_in_group("weather_node"): - _apply_weather_overlay_to_node(node, WEATHER_SHADER) + _apply_weather_overlay_to_node(node, _get_weather_overlay_material(node)) for node in get_tree().get_nodes_in_group("weather_vegetables_node"): if _should_clear_weather_overlay(node): _clear_weather_overlay_from_node(node) +func _get_weather_overlay_material(node: Node) -> Material: + if not node.is_in_group("weather_overlay_no_noise"): + return WEATHER_SHADER + + if weather_shader_no_noise == null: + weather_shader_no_noise = WEATHER_SHADER.duplicate() as Material + var shader_material := weather_shader_no_noise as ShaderMaterial + if shader_material: + shader_material.set_shader_parameter("snow_noise_enabled", false) + + return weather_shader_no_noise + func _apply_weather_overlay_to_node(node: Node, material: Material) -> void: if _should_clear_weather_overlay(node): _clear_weather_overlay_from_node(node) @@ -215,7 +231,7 @@ func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool: return material.shader.code.find("alpha_texture") != -1 func _should_clear_weather_overlay(node: Node) -> bool: - return node.is_in_group("weather_vegetables_node") + return node.is_in_group("weather_vegetables_node") or node.is_in_group("weather_overlay_ignore") func select_day_time(normalized_time: float) -> void: #set show_day_time_debug = true to show debug on screen diff --git a/core/daynight/weather_controller.gd b/core/daynight/weather_controller.gd index c427a76..68a4b79 100644 --- a/core/daynight/weather_controller.gd +++ b/core/daynight/weather_controller.gd @@ -53,7 +53,7 @@ var is_storm: bool = false var cold_tween: Tween var wind_tween: Tween var is_windy: bool = false -var thereare_fireflies: bool = false +var thereare_fireflies: bool = true var current_wind_speed: float = 0.0 var current_wind_strength: float = 0.0 var current_wind_fade: float = 0.0 @@ -128,10 +128,8 @@ func _process(delta: float) -> void: _follow_camera() - var is_night = day_time >= 2.5 - if particles_fireflies: - particles_fireflies.emitting = thereare_fireflies and is_night and not is_raining and not is_snowing and not is_storm - + _update_fireflies_visibility() + var base_tint: Color var base_sky_top: Color var base_sky_horizon: Color @@ -197,11 +195,9 @@ func _process(delta: float) -> void: var final_fog_color = base_fog_color.lerp(base_fog_color * weather_color, clamp(rain_intensity, 0.0, 1.0)) var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, clamp(rain_intensity, 0.0, 1.0)) var final_water_color = base_water_color.darkened(clamp(environment_config.water_darkening_rain, 0.0, 1.0) * clamp(rain_intensity, 0.0, 1.0)) - var rain_weather_amount: float = 0.0 - if is_raining: - rain_weather_amount = clamp(rain_intensity, 0.0, 1.0) + var rain_weather_amount: float = clamp(rain_intensity, 0.0, 1.0) var storm_weather_amount: float = 0.0 - if is_raining and is_storm: + if is_storm: if environment_config.storm_rain_intensity_multiplier > 1.0: storm_weather_amount = clamp((rain_intensity - 1.0) / (environment_config.storm_rain_intensity_multiplier - 1.0), 0.0, 1.0) else: @@ -389,9 +385,7 @@ func _follow_camera() -> void: func toggle_fireflies(value: bool): thereare_fireflies = value - var is_night = day_time >= 2.5 - if particles_fireflies: - particles_fireflies.emitting = thereare_fireflies and is_night and not is_raining + _update_fireflies_visibility() #disable fireflies and set default values and materials func init_fireflies(): @@ -402,7 +396,16 @@ func init_fireflies(): var proc_mat = particles_fireflies.process_material as ParticleProcessMaterial if proc_mat: proc_mat.emission_box_extents = Vector3(environment_config.fireflies_spawn_ray, environment_config.fireflies_spawn_height, environment_config.fireflies_spawn_ray) - + _update_fireflies_visibility() + +func _should_show_fireflies() -> bool: + var is_night: bool = day_time >= 2.5 + return thereare_fireflies and is_night and not is_raining and not is_snowing and not is_storm + +func _update_fireflies_visibility() -> void: + if particles_fireflies: + particles_fireflies.emitting = _should_show_fireflies() + #endregion #region Wind @@ -410,7 +413,7 @@ func init_fireflies(): func toggle_wind(value: bool): is_windy = value if particles_wind: - particles_wind.emitting = is_windy + particles_wind.emitting = true _apply_wind_state() _emit_weather_event_label() @@ -420,7 +423,7 @@ func init_wind(): _update_wind_amount_from_strength(environment_config.wind_strength) if particles_wind: particles_wind.visible = true - particles_wind.emitting = false + particles_wind.emitting = true particles_wind.amount = environment_config.wind_amount var proc_mat_wind = particles_wind.process_material as ParticleProcessMaterial if proc_mat_wind: @@ -451,6 +454,11 @@ func _apply_wind_config() -> void: _apply_wind_state(true) +func _get_target_wind_strength() -> float: + if is_windy: + return environment_config.wind_boost_strength + return environment_config.wind_strength + func _apply_wind_state(immediate: bool = false) -> void: if environment_config == null: return @@ -458,20 +466,23 @@ func _apply_wind_state(immediate: bool = false) -> void: if wind_tween and wind_tween.is_valid(): wind_tween.kill() - var active_wind_speed := environment_config.wind_speed if is_windy else 0.0 - var active_wind_strength := environment_config.wind_strength if is_windy else 0.0 - var active_wind_fade := 1.0 if is_windy else 0.0 + if particles_wind: + particles_wind.emitting = true + + var active_wind_speed := environment_config.wind_speed + var active_wind_strength := _get_target_wind_strength() + var active_wind_fade := 1.0 if immediate: _set_current_wind_speed(active_wind_speed) _set_current_wind_strength(active_wind_strength) _set_current_wind_fade(active_wind_fade) return - _set_current_wind_speed(environment_config.wind_speed) - _set_current_wind_strength(environment_config.wind_strength) + _set_current_wind_speed(active_wind_speed) + _set_current_wind_fade(active_wind_fade) wind_tween = create_tween() - wind_tween.tween_method(_set_current_wind_fade, current_wind_fade, active_wind_fade, environment_config.wind_fade_in_out_time) - wind_tween.tween_callback(_finish_wind_fade_out) + wind_tween.tween_method(_set_current_wind_strength, current_wind_strength, active_wind_strength, environment_config.wind_fade_in_out_time) + wind_tween.tween_callback(_finish_wind_transition) func _set_current_wind_speed(value: float) -> void: current_wind_speed = value @@ -481,6 +492,7 @@ func _set_current_wind_speed(value: float) -> void: func _set_current_wind_strength(value: float) -> void: current_wind_strength = value RenderingServer.global_shader_parameter_set("global_wind_strength", value) + _set_wind_particles_amount_from_strength(value) _sync_wind_event_state() func _set_current_wind_fade(value: float) -> void: @@ -494,13 +506,10 @@ func _sync_wind_event_state() -> void: #used to notify wind_decoration when wind change state wind_parameters_changed.emit(current_wind_speed, current_wind_strength, current_wind_fade, environment_config.wind_direction) -func _finish_wind_fade_out() -> void: - if is_windy: - return - - _set_current_wind_speed(0.0) - _set_current_wind_strength(0.0) - _set_current_wind_fade(0.0) +func _finish_wind_transition() -> void: + _set_current_wind_speed(environment_config.wind_speed) + _set_current_wind_strength(_get_target_wind_strength()) + _set_current_wind_fade(1.0) func change_wind_strength(value: float) -> void: if environment_config == null: @@ -508,10 +517,11 @@ func change_wind_strength(value: float) -> void: environment_config.wind_strength = value _update_wind_amount_from_strength(value) - if is_windy or current_wind_fade > 0.0: + if current_wind_fade > 0.0 and not is_windy: _set_current_wind_strength(value) if particles_wind: particles_wind.amount = environment_config.wind_amount + _apply_wind_state() func _update_wind_amount_from_strength(value: float) -> void: if environment_config == null: @@ -519,12 +529,22 @@ func _update_wind_amount_from_strength(value: float) -> void: if max_wind_amount <= 0: max_wind_amount = max(environment_config.wind_amount, 1) + environment_config.wind_amount = _get_wind_particles_amount_from_strength(value) + +func _get_wind_particles_amount_from_strength(value: float) -> int: + if max_wind_amount <= 0: + max_wind_amount = 1 + var normalized_strength: float = clamp(value, 0.0, 1.0) var amount_ratio: float = normalized_strength if normalized_strength > 0.0 and normalized_strength < 0.3: amount_ratio = lerp(0.08, 0.25, normalized_strength / 0.3) - environment_config.wind_amount = roundi(max_wind_amount * amount_ratio) + return roundi(max_wind_amount * amount_ratio) + +func _set_wind_particles_amount_from_strength(value: float) -> void: + if particles_wind: + particles_wind.amount = _get_wind_particles_amount_from_strength(value) func trigger_random_weather_event(duration: float = 0.0) -> void: if random_weather_restore_tween and random_weather_restore_tween.is_valid(): diff --git a/core/daynight/weather_overlay.gdshader b/core/daynight/weather_overlay.gdshader index 212be0e..2a47e23 100644 --- a/core/daynight/weather_overlay.gdshader +++ b/core/daynight/weather_overlay.gdshader @@ -17,6 +17,7 @@ global uniform float global_snow_cap_flatness_end = 0.96; global uniform float global_snow_cap_noise_scale = 0.22; global uniform float global_snow_cap_noise_strength = 0.18; const float SNOW_VISUAL_RESPONSE = 0.55; +uniform bool snow_noise_enabled = true; uniform float snow_noise_scale : hint_range(0.01, 1.0) = 0.15; uniform float snow_edge_softness : hint_range(0.01, 0.5) = 0.2; uniform float snow_roughness_variation : hint_range(0.0, 0.3) = 0.15; @@ -92,6 +93,10 @@ float get_visual_snow_progress(float snow_progress) { } float get_snow_noise_mask(vec3 world_pos, float snow_progress) { + if (!snow_noise_enabled) { + return 1.0; + } + float detail_noise = texture(noise_texture, world_pos.xz * snow_noise_scale).r; float broad_noise = texture(noise_texture, world_pos.xz * snow_noise_scale * 0.35 + vec2(19.1, 7.4)).r; float combined_noise = mix(detail_noise, broad_noise, 0.35); @@ -118,7 +123,7 @@ void vertex() { world_normal.y ); float accumulation_growth = smoothstep(0.02, 0.45, snow_progress); - float cap_noise = fbm(world_pos.xz * global_snow_cap_noise_scale + vec2(11.3, 4.7)); + float cap_noise = snow_noise_enabled ? fbm(world_pos.xz * global_snow_cap_noise_scale + vec2(11.3, 4.7)) : 0.5; float cap_variation = mix(1.0 - global_snow_cap_noise_strength, 1.0 + global_snow_cap_noise_strength, cap_noise); v_snow_amount = snow_progress; @@ -133,7 +138,7 @@ void fragment() { float facing_up = clamp(world_normal.y, 0.0, 1.0); vec3 geometric_normal = normalize(cross(dFdx(world_pos), dFdy(world_pos))); float snow_facing_up = max(facing_up, abs(geometric_normal.y)); - float noise_val = texture(noise_texture, world_pos.xz * snow_noise_scale).r; + float noise_val = snow_noise_enabled ? texture(noise_texture, world_pos.xz * snow_noise_scale).r : 0.5; //Snow float snow_progress = v_snow_amount; diff --git a/core/environment_config.gd b/core/environment_config.gd index fdaeb17..53974f5 100644 --- a/core/environment_config.gd +++ b/core/environment_config.gd @@ -185,7 +185,8 @@ extends Resource @export var wind_direction: Vector2 = Vector2(0.5, 0.4) #Global wind direction (XZ) @export var wind_speed: float = 0.2 #Global wind animation speed @export var wind_scale: float = 0.025 #Global wind noise scale -@export var wind_strength: float = 0.3 #Global wind displacement strength +@export var wind_strength: float = 0.12 #Low ambient wind displacement strength +@export var wind_boost_strength: float = 1.0 #Wind displacement strength while wind event is active @export var cloud_scale: float = 0.5 #Cloud noise scale in sky shader @export var cloud_speed: float = 0.05 #Cloud movement speed in sky shader @export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.01 #Cloud scale multiplier for environment shadows diff --git a/core/scene_manager/scene_manager.gd b/core/scene_manager/scene_manager.gd index 86ff43c..9dc8a9b 100644 --- a/core/scene_manager/scene_manager.gd +++ b/core/scene_manager/scene_manager.gd @@ -3,8 +3,9 @@ extends CanvasLayer @export var config: SceneConfig @onready var color_rect = $ColorRect @onready var loading_screen = $LoadingScreen -@export var transition_duration: float = 1 +@export var transition_duration: float = 3 const SHADER_PATH := "res://core/transition.gdshader" +var transaction_material: ShaderMaterial func _ready() -> void: _build_material() @@ -14,10 +15,10 @@ func _ready() -> void: color_rect.visible = false func _build_material() -> void: - var mat := ShaderMaterial.new() - mat.shader = load(SHADER_PATH) + transaction_material = ShaderMaterial.new() + transaction_material.shader = load(SHADER_PATH) - #directional gradient: botto-left-> black; top-right -> white + #directional gradient: bottom-left-> black; top-right -> white var g := Gradient.new() g.set_color(0, Color.BLACK) g.set_color(1, Color.WHITE) @@ -41,25 +42,27 @@ func _build_material() -> void: shape_tex.width = 64 shape_tex.height = 64 - mat.set_shader_parameter("base_color", Color.BLACK) - mat.set_shader_parameter("gradient_texture", grad_tex) - mat.set_shader_parameter("gradient_fixed", false) - mat.set_shader_parameter("shape_texture", shape_tex) - mat.set_shader_parameter("shape_tiling", 16.0) - mat.set_shader_parameter("shape_rotation", 0.0) - mat.set_shader_parameter("shape_scroll", Vector2.ZERO) - mat.set_shader_parameter("shape_feathering", 0.05) - mat.set_shader_parameter("shape_treshold", 1.0) # >=1 -> full at the end of the transation - mat.set_shader_parameter("width", 0.5) + transaction_material.set_shader_parameter("base_color", Color.BLACK) + transaction_material.set_shader_parameter("gradient_texture", grad_tex) + transaction_material.set_shader_parameter("gradient_fixed", false) + transaction_material.set_shader_parameter("shape_texture", shape_tex) + transaction_material.set_shader_parameter("shape_tiling", 16.0) + transaction_material.set_shader_parameter("shape_rotation", 0.0) + transaction_material.set_shader_parameter("shape_scroll", Vector2.ZERO) + transaction_material.set_shader_parameter("shape_feathering", 0.05) + transaction_material.set_shader_parameter("shape_treshold", 1.0) # >=1 -> full at the end of the transation + transaction_material.set_shader_parameter("width", 0.5) - color_rect.material = mat + color_rect.material = transaction_material func _update_resolution() -> void: var s := get_viewport().get_visible_rect().size - color_rect.material.set_shader_parameter("node_resolution", s) + if color_rect.material: + color_rect.material.set_shader_parameter("node_resolution", s) func _set_factor(v: float) -> void: - color_rect.material.set_shader_parameter("factor", v) + if color_rect.material: + color_rect.material.set_shader_parameter("factor", v) func cover(duration := 0.5) -> void: color_rect.visible = true @@ -73,20 +76,44 @@ func reveal(duration := 0.5) -> void: await t.finished color_rect.visible = false -func change_scene(scene_enum: SceneConfig.SceneName) -> void: +func change_scene_with_standard_fade(scene_enum: SceneConfig.SceneName, duration: float = transition_duration, show_loading_label: bool = false) -> void: if not config or not config.scenes.has(scene_enum): return + color_rect.material = null + color_rect.color = Color(0,0,0) var target_scene: PackedScene = config.scenes[scene_enum] color_rect.mouse_filter = Control.MOUSE_FILTER_STOP - loading_screen.visible = true + if show_loading_label: + loading_screen.visible = true - await cover(transition_duration) + await cover(duration) get_tree().change_scene_to_packed(target_scene) - await reveal(transition_duration) + await reveal(duration) - loading_screen.visible = false + if show_loading_label: + loading_screen.visible = false + color_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + +func change_scene(scene_enum: SceneConfig.SceneName, duration: float = transition_duration, show_loading_label: bool = false) -> void: + if not config or not config.scenes.has(scene_enum): + return + + color_rect.material = transaction_material + color_rect.color = Color(0,0,0,0) + var target_scene: PackedScene = config.scenes[scene_enum] + + color_rect.mouse_filter = Control.MOUSE_FILTER_STOP + if show_loading_label: + loading_screen.visible = true + + await cover(duration) + get_tree().change_scene_to_packed(target_scene) + await reveal(duration) + + if show_loading_label: + loading_screen.visible = false color_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE func quit_game() -> void: diff --git a/core/scene_manager/scene_manager.tscn b/core/scene_manager/scene_manager.tscn index b62f530..b2efd4b 100644 --- a/core/scene_manager/scene_manager.tscn +++ b/core/scene_manager/scene_manager.tscn @@ -20,6 +20,7 @@ mouse_filter = 2 color = Color(0, 0, 0, 0) [node name="LoadingScreen" type="Control" parent="." unique_id=1075176512] +visible = false layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 diff --git a/core/splash_screen/splash_screen.gd b/core/splash_screen/splash_screen.gd index 2ee4dcb..8480df0 100644 --- a/core/splash_screen/splash_screen.gd +++ b/core/splash_screen/splash_screen.gd @@ -1,8 +1,17 @@ extends Control - @export var main_menu_scene: PackedScene -@export var display_time: float = 3.0 +@export var display_time: float = 2.0 +@export var fade_in_time: float = 0.5 +@onready var logo: Sprite2D = $ColorRect/JMPLogo func _ready() -> void: + logo.modulate.a = 0.0 + await get_tree().create_timer(fade_in_time).timeout + + var tween := create_tween() + tween.tween_property(logo, "modulate:a", 1.0, fade_in_time).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) + await get_tree().create_timer(display_time).timeout - SceneManager.change_scene(SceneConfig.SceneName.MAIN_MENU) + #tween = create_tween() + #tween.tween_property(logo, "modulate:a", 0.0, fade_in_time).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) + SceneManager.change_scene_with_standard_fade(SceneConfig.SceneName.MAIN_MENU, 0.5) diff --git a/core/splash_screen/splash_screen.tscn b/core/splash_screen/splash_screen.tscn index b72d63d..abc093e 100644 --- a/core/splash_screen/splash_screen.tscn +++ b/core/splash_screen/splash_screen.tscn @@ -12,7 +12,16 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_elsnp") -[node name="JMPLogo" type="Sprite2D" parent="." unique_id=1244888940] +[node name="ColorRect" type="ColorRect" parent="." unique_id=1599828641] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="JMPLogo" type="Sprite2D" parent="ColorRect" unique_id=1244888940] position = Vector2(980.99994, 556) scale = Vector2(0.37799045, 0.37799042) texture = ExtResource("1_jkpgl") diff --git a/tgcc/chunk/prop/fields/carrot/carrot.res b/tgcc/chunk/prop/fields/carrot/carrot.res index 7ff895c..61a46da 100644 Binary files a/tgcc/chunk/prop/fields/carrot/carrot.res and b/tgcc/chunk/prop/fields/carrot/carrot.res differ diff --git a/tgcc/train/train.tscn b/tgcc/train/train.tscn index 55bfcc6..31dbc1d 100644 --- a/tgcc/train/train.tscn +++ b/tgcc/train/train.tscn @@ -52,7 +52,7 @@ shader_parameter/glint_sharpness = 32.0 shader_parameter/emission_color = Color(0.26628578, 0.030174213, 0.015801903, 1) shader_parameter/emission_energy = 10.000000475 -[node name="Treno" unique_id=1182090923 groups=["weather_node"] instance=ExtResource("1_33mei")] +[node name="Treno" unique_id=1182090923 groups=["weather_node", "weather_overlay_no_noise"] instance=ExtResource("1_33mei")] script = ExtResource("9_4qk3b") [node name="Finestrini" parent="." index="0" unique_id=755457549] diff --git a/tgcc/train/wagon.tscn b/tgcc/train/wagon.tscn index 19247ad..96c58f1 100644 --- a/tgcc/train/wagon.tscn +++ b/tgcc/train/wagon.tscn @@ -30,7 +30,7 @@ shader_parameter/glint_sharpness = 32.0 shader_parameter/emission_color = Color(0.5882353, 0.06666667, 0.10980392, 1) shader_parameter/emission_energy = 6.50000030875 -[node name="wagon" unique_id=14655460 groups=["weather_node"] instance=ExtResource("1_ud2nc")] +[node name="wagon" unique_id=14655460 groups=["weather_node", "weather_overlay_no_noise"] instance=ExtResource("1_ud2nc")] [node name="Finestrini_001" parent="." index="0" unique_id=1279718063] surface_material_override/0 = ExtResource("2_upuw2")