8 Commits

Author SHA1 Message Date
Matteo Sonaglioni
d58c31ac65 fix path 2026-07-07 21:21:21 +02:00
m.cirafisi
48ba1761e0 Merge branch 'main' into polish10 2026-07-07 21:18:23 +02:00
Matteo Sonaglioni
0ce2cc6b04 fix path 2026-07-07 19:02:41 +02:00
8ff14f3455 show snow on grass 2026-07-07 18:00:12 +02:00
6da7021a58 manage stats and achievements 2026-07-07 10:03:12 +02:00
b87be91521 fix comprenetration train-wagons 2026-07-07 09:42:23 +02:00
Matteo Sonaglioni
9f3acbccf9 Merge branch 'main' into polish10 2026-07-06 22:49:28 +02:00
Matteo Sonaglioni
cc7f819628 polish godrays 2026-07-01 14:39:17 +02:00
44 changed files with 276 additions and 531 deletions

View File

@@ -1,10 +1,16 @@
extends Path3D
const STEAM_DISTANCE_STAT: String = "stat_distance_km"
const DISTANCE_KM_PER_UNIT: float = 0.01
const STATION_STOP_GROUP: StringName = &"railway_station"
const TRACK_ZERO_SPACING_FIX_DISTANCE: float = 45.0
const TRACK_ZERO_SPACING_BLEND_DISTANCE: float = 18.0
const TRACK_ZERO_SPACING_SEARCH_EXTRA: float = 35.0
const TRACK_ZERO_SPACING_SEARCH_STEP: float = 0.5
const TRACK_ZERO_SPACING_TARGET_RATIO: float = 0.97
const TRACK_ZERO_SPACING_MIN_DISTANCE: float = 1.0
enum TrainStartMode { RANDOM_POSITION, SPECIFIED_STATION, SPECIFIED_POSITION }
enum TrainFacingDirection { KEEP_PATH_DIRECTION, LOCOMOTIVE_LEFT, LOCOMOTIVE_RIGHT }
@export_group("Train")
##train speed
@@ -41,6 +47,7 @@ enum TrainStartMode { RANDOM_POSITION, SPECIFIED_STATION, SPECIFIED_POSITION }
@export var train_start_delay_seconds: float = 0.0
@export var train_start_after_delay: bool = true
@export var train_start_acceleration_seconds: float = 4.0
@export_enum("keep_path_direction", "locomotive_left", "locomotive_right") var train_facing_direction: int = TrainFacingDirection.KEEP_PATH_DIRECTION
@export_group("Rails Bulding")
##distance between sleepers of the rails
@@ -96,9 +103,9 @@ var is_restarting: bool = false
var tween_restart: Tween
var wagon_instances: Array[Node3D] = []
var wagon_progress_offsets: Array[float] = []
var _pending_steam_distance_km: float = 0.0
var _initial_is_inmotion: bool = true
var _is_photo_mode_active: bool = false
var _train_direction_sign: float = 1.0
func _ready() -> void:
randomize()
@@ -140,8 +147,32 @@ func _apply_initial_train_start() -> void:
train_progress = wrapf(train_start_position, 0.0, total_length)
_update_next_stop_index_from_progress()
_apply_train_facing_direction(total_length)
_update_next_stop_index_from_progress()
_snap_train_to_progress()
func _apply_train_facing_direction(total_length: float) -> void:
_train_direction_sign = 1.0
if train_facing_direction == TrainFacingDirection.KEEP_PATH_DIRECTION or curve == null:
return
if total_length <= 0.0:
return
var center_progress: float = wrapf(train_progress, 0.0, total_length)
var center_position: Vector3 = to_global(curve.sample_baked(center_progress, true))
var forward_progress: float = wrapf(center_progress + 2.0, 0.0, total_length)
var forward_position: Vector3 = to_global(curve.sample_baked(forward_progress, true))
var forward_direction: Vector3 = forward_position - center_position
if forward_direction.length_squared() <= 0.0001 or is_zero_approx(forward_direction.x):
return
var desired_x_sign: float = -1.0 if train_facing_direction == TrainFacingDirection.LOCOMOTIVE_LEFT else 1.0
if forward_direction.x * desired_x_sign < 0.0:
_train_direction_sign = -1.0
if not is_zero_approx(train_speed):
train_speed = absf(train_speed) * _train_direction_sign
func _apply_train_start_delay() -> void:
if not _initial_is_inmotion:
return
@@ -203,13 +234,9 @@ func _snap_train_to_progress() -> void:
train_progress = wrapf(train_progress, 0.0, total_length)
var center_position: Vector3 = to_global(curve.sample_baked(train_progress, true))
var prog_forward: float = wrapf(train_progress + 2.0, 0.0, total_length)
var forward_position: Vector3 = to_global(curve.sample_baked(prog_forward, true))
train_instance.global_position = center_position
if center_position.distance_to(forward_position) > 0.01:
train_instance.look_at(forward_position, Vector3.UP)
train_instance.rotate_y(PI)
_orient_vehicle_to_track(train_instance, train_progress, total_length)
if cameras:
cameras.global_position = center_position
@@ -420,7 +447,10 @@ func train_move(delta: float) -> void:
stop_multiply = 1.0
var current_speed = train_speed * stop_multiply
train_progress += current_speed * delta
var next_progress: float = train_progress + current_speed * delta
var wrapped_forward: bool = current_speed > 0.0 and next_progress >= total_length
var wrapped_back: bool = current_speed < 0.0 and next_progress < 0.0
train_progress = wrapf(next_progress, 0.0, total_length)
_track_steam_distance(abs(current_speed) * delta)
if enable_stops and stop_offset.size() > 0 and has_valid_stop:
@@ -432,11 +462,9 @@ func train_move(delta: float) -> void:
train_progress = target_offset
_execute_stop(current_speed > 0)
if train_progress > total_length:
train_progress -= total_length
if wrapped_forward:
if stop_offset.size() > 0: next_stop_index = 0
elif train_progress < 0:
train_progress += total_length
elif wrapped_back:
if stop_offset.size() > 0: next_stop_index = stop_offset.size() - 1
var center_position = to_global(curve.sample_baked(train_progress, true))
@@ -447,8 +475,7 @@ func train_move(delta: float) -> void:
if center_position.distance_to(forward_position) > 0.01:
train_instance.global_position = center_position
train_instance.look_at(forward_position, Vector3.UP)
train_instance.rotate_y(PI)
_orient_vehicle_to_track(train_instance, train_progress, total_length)
if cameras:
cameras.global_position = center_position
@@ -486,28 +513,7 @@ func _track_steam_distance(distance_units: float) -> void:
# Always track the global distance in our save file (for UI and persistency)
GameState.save_data.total_distance_km += distance_units * DISTANCE_KM_PER_UNIT
# Steam specific logic
if not SteamManager.is_on_steam:
return
_pending_steam_distance_km += distance_units * DISTANCE_KM_PER_UNIT
var whole_km: int = int(floor(_pending_steam_distance_km))
if whole_km <= 0:
return
_pending_steam_distance_km -= float(whole_km)
var total_distance_km: int = StatsManager.get_int(STEAM_DISTANCE_STAT) + whole_km
StatsManager.set_int(STEAM_DISTANCE_STAT, total_distance_km)
_check_distance_achievements(total_distance_km)
StatsManager.store()
#Check achievements
func _check_distance_achievements(total_distance_km: int) -> void:
if total_distance_km >= 100:
AchievementManager.unlock("ACH_DISTANCE_100")
if total_distance_km >= 200:
AchievementManager.unlock("ACH_DISTANCE_200")
StatsManager.add_distance_km(distance_units * DISTANCE_KM_PER_UNIT)
func _execute_stop(go_forward: bool = true) -> void:
if not _find_next_valid_stop(go_forward):
@@ -515,12 +521,14 @@ func _execute_stop(go_forward: bool = true) -> void:
return
stop_ongoing = true
stop_multiply = 0.0
stop_multiply = 0.0
var current_stop_index = next_stop_index
StatsManager.add_int("stat_stop_number", 1)
StatsManager.store()
_advance_next_stop_index(go_forward)
if fireworks_scene != null:
var marker_position = stops_position[current_stop_index]
var firework_number = randi_range(5, 8)
@@ -659,6 +667,10 @@ func _snap_wagons_to_progress(total_length: float = 0.0) -> void:
if total_length <= 0.0:
return
var previous_progress: float = wrapf(train_progress, 0.0, total_length)
var previous_position: Vector3 = to_global(curve.sample_baked(previous_progress, true))
var previous_wagon_offset: float = 0.0
for i in range(wagon_instances.size()):
var wagon: Node3D = wagon_instances[i]
if not is_instance_valid(wagon):
@@ -668,17 +680,101 @@ func _snap_wagons_to_progress(total_length: float = 0.0) -> void:
if i < wagon_progress_offsets.size():
wagon_offset = wagon_progress_offsets[i]
var wagon_progress: float = train_progress - wagon_offset
var wagon_progress: float = train_progress - wagon_offset * _train_direction_sign
var segment_spacing: float = maxf(wagon_offset - previous_wagon_offset, 0.1)
var vehicle_progress: float = wrapf(wagon_progress, 0.0, total_length)
var center_position: Vector3 = to_global(curve.sample_baked(vehicle_progress, true))
var prog_forward: float = wrapf(vehicle_progress + 2.0, 0.0, total_length)
var forward_position: Vector3 = to_global(curve.sample_baked(prog_forward, true))
var zero_spacing_fix_weight: float = _get_zero_spacing_fix_weight(previous_progress, vehicle_progress, total_length)
if zero_spacing_fix_weight > 0.0:
var target_distance: float = _get_zero_spacing_target_distance(segment_spacing)
var corrected_progress: float = _find_zero_spacing_progress(previous_progress, previous_position, segment_spacing, target_distance, total_length)
vehicle_progress = _lerp_progress_on_track(vehicle_progress, corrected_progress, zero_spacing_fix_weight, total_length)
center_position = to_global(curve.sample_baked(vehicle_progress, true))
wagon.global_position = center_position
if center_position.distance_to(forward_position) > 0.01:
wagon.look_at(forward_position, Vector3.UP)
wagon.rotate_y(PI)
_orient_vehicle_to_track(wagon, vehicle_progress, total_length)
previous_progress = vehicle_progress
previous_position = center_position
previous_wagon_offset = wagon_offset
func _orient_vehicle_to_track(vehicle: Node3D, progress: float, total_length: float) -> void:
if vehicle == null or curve == null or total_length <= 0.0:
return
var center_progress: float = wrapf(progress, 0.0, total_length)
var center_position: Vector3 = to_global(curve.sample_baked(center_progress, true))
var forward_progress: float = wrapf(center_progress + 2.0 * _train_direction_sign, 0.0, total_length)
var forward_position: Vector3 = to_global(curve.sample_baked(forward_progress, true))
if center_position.distance_to(forward_position) <= 0.01:
return
vehicle.look_at(forward_position, Vector3.UP)
vehicle.rotate_y(PI)
func _get_zero_spacing_fix_weight(previous_progress: float, vehicle_progress: float, total_length: float) -> float:
var distance_to_zero: float = minf(
_get_progress_distance_to_zero(previous_progress, total_length),
_get_progress_distance_to_zero(vehicle_progress, total_length)
)
var full_fix_distance: float = maxf(TRACK_ZERO_SPACING_FIX_DISTANCE - TRACK_ZERO_SPACING_BLEND_DISTANCE, 0.0)
return 1.0 - smoothstep(full_fix_distance, TRACK_ZERO_SPACING_FIX_DISTANCE, distance_to_zero)
func _get_progress_distance_to_zero(progress: float, total_length: float) -> float:
var wrapped_progress: float = wrapf(progress, 0.0, total_length)
return minf(wrapped_progress, total_length - wrapped_progress)
func _get_zero_spacing_target_distance(segment_spacing: float) -> float:
return minf(maxf(segment_spacing * TRACK_ZERO_SPACING_TARGET_RATIO, TRACK_ZERO_SPACING_MIN_DISTANCE), segment_spacing)
func _find_zero_spacing_progress(previous_progress: float, previous_position: Vector3, segment_spacing: float, minimum_distance: float, total_length: float) -> float:
var start_distance: float = minf(minimum_distance, segment_spacing)
var best_progress: float = wrapf(previous_progress - start_distance * _train_direction_sign, 0.0, total_length)
var search_limit: float = minf(maxf(segment_spacing, minimum_distance) + TRACK_ZERO_SPACING_SEARCH_EXTRA, total_length)
var search_distance: float = start_distance
var previous_search_distance: float = start_distance
while search_distance <= search_limit:
var candidate_progress: float = wrapf(previous_progress - search_distance * _train_direction_sign, 0.0, total_length)
var candidate_position: Vector3 = to_global(curve.sample_baked(candidate_progress, true))
best_progress = candidate_progress
if previous_position.distance_to(candidate_position) >= minimum_distance:
if is_equal_approx(search_distance, start_distance):
return candidate_progress
return _refine_zero_spacing_progress(
previous_progress,
previous_position,
previous_search_distance,
search_distance,
minimum_distance,
total_length
)
previous_search_distance = search_distance
search_distance += TRACK_ZERO_SPACING_SEARCH_STEP
return best_progress
func _refine_zero_spacing_progress(previous_progress: float, previous_position: Vector3, min_search_distance: float, max_search_distance: float, minimum_distance: float, total_length: float) -> float:
var low_distance: float = min_search_distance
var high_distance: float = max_search_distance
for i in range(8):
var mid_distance: float = (low_distance + high_distance) * 0.5
var mid_progress: float = wrapf(previous_progress - mid_distance, 0.0, total_length)
var mid_position: Vector3 = to_global(curve.sample_baked(mid_progress, true))
if previous_position.distance_to(mid_position) >= minimum_distance:
high_distance = mid_distance
else:
low_distance = mid_distance
return wrapf(previous_progress - high_distance, 0.0, total_length)
func _lerp_progress_on_track(from_progress: float, to_progress: float, weight: float, total_length: float) -> float:
var wrapped_delta: float = wrapf(to_progress - from_progress + total_length * 0.5, 0.0, total_length) - total_length * 0.5
return wrapf(from_progress + wrapped_delta * clampf(weight, 0.0, 1.0), 0.0, total_length)
func _get_vehicle_length(vehicle: Node3D) -> float:
var bounds: AABB = _get_node_local_bounds(vehicle, vehicle)

View File

@@ -115,21 +115,21 @@ func on_change_camera_request(camera_index: int) -> void:
var next_cam = array_camera[camera_index]
set_camera(next_cam)
#func _unhandled_input(event: InputEvent) -> void:
#var current_cam = get_viewport().get_camera_3d()
#var is_photo_mode = current_cam != null and not current_cam in array_camera
#if is_photo_mode:
#return
#
#if event is InputEventKey and event.pressed and not event.echo:
#match event.keycode:
#KEY_1:
#if array_camera.size() > 0: set_camera(array_camera[0])
#KEY_2:
#if array_camera.size() > 1: set_camera(array_camera[1])
#KEY_3:
#if array_camera.size() > 2: set_camera(array_camera[2])
#KEY_4:
#if array_camera.size() > 3: set_camera(array_camera[3])
#KEY_5:
#if array_camera.size() > 4: set_camera(array_camera[4])
func _unhandled_input(event: InputEvent) -> void:
var current_cam = get_viewport().get_camera_3d()
var is_photo_mode = current_cam != null and not current_cam in array_camera
if is_photo_mode:
return
if event is InputEventKey and event.pressed and not event.echo:
match event.keycode:
KEY_1:
if array_camera.size() > 0: set_camera(array_camera[0])
KEY_2:
if array_camera.size() > 1: set_camera(array_camera[1])
KEY_3:
if array_camera.size() > 2: set_camera(array_camera[2])
KEY_4:
if array_camera.size() > 3: set_camera(array_camera[3])
KEY_5:
if array_camera.size() > 4: set_camera(array_camera[4])

View File

@@ -15,6 +15,8 @@ global uniform float global_snow_melt_speed = 0.1;
global uniform float global_snow_amount = 0.0;
global uniform vec4 global_snow_color = vec4(0.92, 0.96, 1.0, 1.0);
global uniform float global_rain_intensity;
const float GRASS_FULL_SNOW_START = 0.58;
const float GRASS_FULL_SNOW_END = 0.86;
// --- PARAMETRI ESTETICI ---
uniform bool billboard_enabled = true;
@@ -141,7 +143,7 @@ void fragment() {
float snow_mask = smoothstep(snow_start, 1.0, top_mask) * snow_amount * snow_visibility;
snow_mask *= step(0.01, snow_amount);
snow_mask = clamp(snow_mask, 0.0, 1.0);
float full_snow_mask = smoothstep(0.72, 1.0, snow_amount) * step(0.01, snow_visibility);
float full_snow_mask = smoothstep(GRASS_FULL_SNOW_START, GRASS_FULL_SNOW_END, snow_amount) * step(0.01, snow_visibility);
float final_snow_mask = max(snow_mask, full_snow_mask);
vec3 snow_base_color = max(snow_color.rgb, global_snow_color.rgb);

View File

@@ -13,6 +13,8 @@ global uniform float global_snow_melt_speed = 0.1;
global uniform float global_snow_amount = 0.0;
global uniform vec4 global_snow_color;
global uniform float global_rain_intensity;
const float LEAVES_FULL_SNOW_START = 0.58;
const float LEAVES_FULL_SNOW_END = 0.86;
uniform sampler2D wind_noise : filter_linear_mipmap;
uniform bool billboard_enabled = true;
@@ -110,7 +112,7 @@ void fragment() {
float top_mask = 1.0 - shifted_uv.y;
float snow_mask = smoothstep(1.0 - snow_amount * 1.35, 1.08 - snow_amount * 1.35, top_mask) * snow_visibility;
snow_mask *= step(0.01, snow_amount);
float full_snow_mask = smoothstep(0.78, 1.0, snow_amount) * clamp(snow_visibility, 0.0, 1.0);
float full_snow_mask = smoothstep(LEAVES_FULL_SNOW_START, LEAVES_FULL_SNOW_END, snow_amount) * clamp(snow_visibility, 0.0, 1.0);
float final_snow_mask = max(snow_mask, full_snow_mask);
float snow_light = mix(0.82, 1.0, max(v_shade_factor, 0.35));

View File

@@ -17,6 +17,8 @@ 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;
const float FULL_SNOW_VISUAL_START = 0.82;
const float FULL_SNOW_VISUAL_END = 0.98;
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;
@@ -156,6 +158,8 @@ void fragment() {
float snow_factor = max(snow_edge * snow_coverage, flat_accumulation);
float snow_opacity = clamp(snow_factor, 0.0, 1.0);
snow_opacity = max(snow_opacity, flat_accumulation * mix(0.45, 0.9, snow_noise_mask));
float full_snow_opacity = snow_edge * smoothstep(FULL_SNOW_VISUAL_START, FULL_SNOW_VISUAL_END, snow_progress);
snow_opacity = max(snow_opacity, full_snow_opacity);
float shade = mix(-snow_color_variation, snow_color_variation, noise_val);
vec3 snow_albedo = clamp(global_snow_color.rgb + vec3(shade), 0.0, 1.0);

Binary file not shown.

View File

@@ -1,36 +0,0 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://d08lffa62cwe4"
path="res://.godot/imported/DePixelSchmal.ttf-8ac33b7cef810a277bf67f13d849d16b.fontdata"
[deps]
source_file="res://core/font/DePixelSchmal.ttf"
dest_files=["res://.godot/imported/DePixelSchmal.ttf-8ac33b7cef810a277bf67f13d849d16b.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
modulate_color_glyphs=false
hinting=1
subpixel_positioning=4
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@@ -1,6 +0,0 @@
[gd_resource type="Theme" format=3 uid="uid://dib2yjsuiyhl"]
[ext_resource type="FontFile" uid="uid://d08lffa62cwe4" path="res://core/font/DePixelSchmal.ttf" id="1_svhk7"]
[resource]
default_font = ExtResource("1_svhk7")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpsyqpi74dnvu"
path="res://.godot/imported/pg_3.png-03cc0909b35fe8817a39820d5cb898ba.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_2/pg_3.png"
dest_files=["res://.godot/imported/pg_3.png-03cc0909b35fe8817a39820d5cb898ba.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://decvm18okiuxw"
path="res://.godot/imported/pg_3_vertical.png-c2c3e741e77873e5b55455c2f973c775.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_2/pg_3_vertical.png"
dest_files=["res://.godot/imported/pg_3_vertical.png-c2c3e741e77873e5b55455c2f973c775.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nqkwsl05pj6t"
path="res://.godot/imported/pg_3_vertical_2.png-733981bb73bbd5adfc0b985312448a48.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_2/pg_3_vertical_2.png"
dest_files=["res://.godot/imported/pg_3_vertical_2.png-733981bb73bbd5adfc0b985312448a48.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nw420tkucw5p"
path="res://.godot/imported/pg_3_vertical_cs.png-2d42ea13986f9679ddedd33b2e463769.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_2/pg_3_vertical_cs.png"
dest_files=["res://.godot/imported/pg_3_vertical_cs.png-2d42ea13986f9679ddedd33b2e463769.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://culspkef43qfd"
path="res://.godot/imported/barretta_regular.png-004551bd2a59af046ec6f59b14c511df.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_3/barretta_regular.png"
dest_files=["res://.godot/imported/barretta_regular.png-004551bd2a59af046ec6f59b14c511df.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://od0hlvkpilqt"
path="res://.godot/imported/button_1_texture.png-c83d07b1c1d4bd7bb3af0cf5e59324e0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_3/button_1_texture.png"
dest_files=["res://.godot/imported/button_1_texture.png-c83d07b1c1d4bd7bb3af0cf5e59324e0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bfy6ju4p5uu2t"
path="res://.godot/imported/button_2_texture.png-05acc1cdd8e1a7438677073a53d6fc60.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_3/button_2_texture.png"
dest_files=["res://.godot/imported/button_2_texture.png-05acc1cdd8e1a7438677073a53d6fc60.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dxms3ts0qh2t5"
path="res://.godot/imported/button_3_texture.png-68d6211a327c46ea2d6803fe08d2ca24.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://core/game_menu/assets/page_3/button_3_texture.png"
dest_files=["res://.godot/imported/button_3_texture.png-68d6211a327c46ea2d6803fe08d2ca24.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -2,23 +2,21 @@
[ext_resource type="Script" uid="uid://bnh1y560h55vc" path="res://core/game_menu/audio_option.gd" id="1_orafl"]
[ext_resource type="Texture2D" uid="uid://dirbxw8ii87nv" path="res://core/game_menu/assets/page_3/main_volume_button.png" id="2_vudub"]
[ext_resource type="Texture2D" uid="uid://dxms3ts0qh2t5" path="res://core/game_menu/assets/page_3/button_3_texture.png" id="3_f3y2u"]
[ext_resource type="Texture2D" uid="uid://bfy6ju4p5uu2t" path="res://core/game_menu/assets/page_3/button_2_texture.png" id="4_tj25j"]
[ext_resource type="Texture2D" uid="uid://od0hlvkpilqt" path="res://core/game_menu/assets/page_3/button_1_texture.png" id="5_4fmty"]
[ext_resource type="Texture2D" uid="uid://culspkef43qfd" path="res://core/game_menu/assets/page_3/barretta_regular.png" id="6_aax0b"]
[ext_resource type="Texture2D" uid="uid://s33pbfshxhb5" path="res://core/game_menu/assets/page_3/button_-1.png" id="3_vf41c"]
[ext_resource type="Texture2D" uid="uid://c6kgm3fq8521h" path="res://core/game_menu/assets/page_3/barretta.png" id="4_hduhm"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_f3y2u"]
content_margin_left = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
texture = ExtResource("6_aax0b")
texture = ExtResource("4_hduhm")
texture_margin_top = 23.0
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tj25j"]
texture = ExtResource("6_aax0b")
texture = ExtResource("4_hduhm")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_4fmty"]
texture = ExtResource("6_aax0b")
texture = ExtResource("4_hduhm")
[node name="AudioOption" type="VBoxContainer" unique_id=1509773712]
custom_minimum_size = Vector2(280, 117)
@@ -42,9 +40,9 @@ stretch_mode = 5
[node name="HSlider" type="HSlider" parent="." unique_id=1286896253]
process_mode = 3
layout_mode = 2
theme_override_icons/grabber = ExtResource("3_f3y2u")
theme_override_icons/grabber_highlight = ExtResource("4_tj25j")
theme_override_icons/grabber_disabled = ExtResource("5_4fmty")
theme_override_icons/grabber = ExtResource("3_vf41c")
theme_override_icons/grabber_highlight = ExtResource("3_vf41c")
theme_override_icons/grabber_disabled = ExtResource("3_vf41c")
theme_override_styles/slider = SubResource("StyleBoxTexture_f3y2u")
theme_override_styles/grabber_area = SubResource("StyleBoxTexture_tj25j")
theme_override_styles/grabber_area_highlight = SubResource("StyleBoxTexture_4fmty")

View File

@@ -33,10 +33,7 @@ flip_h = true
layout_mode = 1
anchors_preset = 9
anchor_bottom = 1.0
offset_left = 2.0
offset_top = 13.0
offset_right = 762.0
offset_bottom = 13.0
offset_right = 760.0
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("3_sfb5f")

View File

@@ -4,7 +4,6 @@
[ext_resource type="Texture2D" uid="uid://xfl3ks4dbfaw" path="res://core/game_menu/assets/page_2/achievements_text.png" id="3_4uwhd"]
[ext_resource type="Texture2D" uid="uid://drwe2xcnp8vs1" path="res://core/game_menu/assets/page_2/2_dx.png" id="3_msl27"]
[ext_resource type="PackedScene" uid="uid://bvw086glfpcba" path="res://core/game_menu/collectible_gallery.tscn" id="5_w0bcg"]
[ext_resource type="Texture2D" uid="uid://nw420tkucw5p" path="res://core/game_menu/assets/page_2/pg_3_vertical_cs.png" id="7_71v1w"]
[ext_resource type="Texture2D" uid="uid://bx6gsh5uchkge" path="res://core/game_menu/assets/lock.png" id="8_48jk0"]
[ext_resource type="Texture2D" uid="uid://vg5y4qgc26ko" path="res://core/game_menu/assets/page_3/coming_soon_01.png" id="8_71v1w"]
[ext_resource type="Texture2D" uid="uid://bmatlcouch6jm" path="res://core/game_menu/assets/page_3/coming_soon_02.png" id="9_g7kul"]
@@ -57,10 +56,7 @@ anchors_preset = 11
anchor_left = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -149.695
offset_top = 22.855
offset_right = 610.3054
offset_bottom = 22.85498
offset_left = -760.0
grow_horizontal = 0
grow_vertical = 2
mouse_filter = 2
@@ -69,9 +65,9 @@ stretch_mode = 2
[node name="AchievementsText" type="TextureRect" parent="." unique_id=766898810]
layout_mode = 0
offset_left = 184.0
offset_left = 261.0
offset_top = 34.5
offset_right = 579.0
offset_right = 656.0
offset_bottom = 105.5
mouse_filter = 2
texture = ExtResource("3_4uwhd")
@@ -86,7 +82,6 @@ offset_right = 767.0
offset_bottom = 539.5
[node name="LockTexture" type="TextureRect" parent="." unique_id=535700029]
visible = false
layout_mode = 0
offset_left = 342.0
offset_top = 153.5
@@ -97,24 +92,12 @@ texture = ExtResource("8_48jk0")
expand_mode = 1
stretch_mode = 5
[node name="LockTexture2" type="TextureRect" parent="." unique_id=997767159]
layout_mode = 0
offset_left = 129.0
offset_top = 122.0
offset_right = 643.0
offset_bottom = 482.7
mouse_filter = 2
texture = ExtResource("7_71v1w")
expand_mode = 1
stretch_mode = 5
[node name="TextureRect" type="TextureRect" parent="." unique_id=1942592146]
layout_mode = 0
offset_left = 387.99997
offset_top = 224.00002
offset_right = 708.0
offset_bottom = 567.0
rotation = -0.05235988
offset_left = 596.0
offset_top = 86.0
offset_right = 743.0
offset_bottom = 233.0
texture = SubResource("AnimatedTexture_0x02d")
expand_mode = 1
stretch_mode = 5

View File

@@ -32,21 +32,17 @@ flip_h = true
layout_mode = 1
anchors_preset = 9
anchor_bottom = 1.0
offset_left = 5.3050003
offset_top = 78.795
offset_right = 765.305
offset_bottom = 78.79498
offset_right = 760.0
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("3_jdqrf")
stretch_mode = 2
[node name="SettingsMenu" parent="." unique_id=1402645746 instance=ExtResource("2_settings")]
layout_mode = 1
anchor_left = 0.034210525
anchor_top = 0.034843206
anchor_right = 0.034210525
anchor_bottom = 0.034843206
layout_mode = 0
anchors_preset = 0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 68.0
offset_top = 24.5
offset_right = 692.0

View File

@@ -36,10 +36,7 @@ anchors_preset = 11
anchor_left = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -235.0
offset_top = 398.0
offset_right = 525.0
offset_bottom = 398.0
offset_left = -760.0
grow_horizontal = 0
grow_vertical = 2
mouse_filter = 2
@@ -53,10 +50,10 @@ anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -193.5
offset_top = -217.0
offset_right = 236.5
offset_bottom = 207.0
offset_left = -181.5
offset_top = -212.0
offset_right = 248.5
offset_bottom = 212.0
[node name="PlayButton" parent="OptionMenu/VBoxContainer" parent_id_path=PackedInt32Array(537721615, 508055524) index="0" unique_id=1990327704]
visible = false

View File

@@ -40,6 +40,7 @@ func _on_color_selected(selected_color_picker: TrainColorPicker, material_index:
for i in range(color_pickers.size()):
if color_pickers[i] == selected_color_picker:
_set_selected_color(i, material_index)
AchievementManager.unlock("ACH_CHANGE_TRAIN_COLOR")
break
func _apply_train_color(color: Color, material_index: int, color_index: int = 0) -> void:

View File

@@ -1,9 +1,9 @@
[gd_scene format=3 uid="uid://dg4f3v0ukpmay"]
[ext_resource type="Script" uid="uid://c4kekqicrv4m8" path="res://core/main_scene_ui/audio_player.gd" id="1_i2mrl"]
[ext_resource type="Theme" uid="uid://bg8megpn77mod" path="res://core/font/main_theme.tres" id="2_0koyu"]
[ext_resource type="Texture2D" uid="uid://dlp62v48tori0" path="res://core/main_scene_ui/assets/audio_player_background.png" id="3_e87kc"]
[ext_resource type="Texture2D" uid="uid://s8pp2i6bjkps" path="res://core/main_scene_ui/assets/audio_player_wheel.png" id="4_n5r1o"]
[ext_resource type="Theme" uid="uid://dib2yjsuiyhl" path="res://core/font/audio_player_theme.tres" id="5_e87kc"]
[ext_resource type="Texture2D" uid="uid://bgrmy57xhg2gj" path="res://core/main_scene_ui/assets/audio_player_empty.png" id="10_xv7rp"]
[node name="AudioPlayer" type="Control" unique_id=425192018]
@@ -104,7 +104,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("5_e87kc")
theme = ExtResource("2_0koyu")
theme_override_font_sizes/font_size = 12
text = "Uknown Track"
horizontal_alignment = 1

View File

@@ -10,7 +10,7 @@ extends Control
@onready var collectible_icon_button: Button = $%CollectibleIconButton
@onready var weather_row: HBoxContainer = $%WeatherRow
@onready var time_of_day_row: HBoxContainer = $%TimeOfDayRow
#@onready var cameras_row: HBoxContainer = $%CamerasRow
@onready var cameras_row: HBoxContainer = $%CamerasRow
@onready var photo_mode_texture_panel: Panel = $%PhotoModeTexturePanel
@onready var photo_mode_texture_mask: TextureRect = $%PhotoModeTextureMask
@onready var photo_mode_black_screen: ColorRect = $%PhotoModeBlackScreen
@@ -113,6 +113,7 @@ func _on_time_of_day_row_on_option_changed(data: String) -> void:
pass
func _on_weather_row_on_option_changed(data: String) -> void:
var weather_changed: bool = true
match data:
"Snow":
_snow = !_snow
@@ -129,9 +130,10 @@ func _on_weather_row_on_option_changed(data: String) -> void:
"Random":
pick_random_weather()
_:
pass
weather_changed = false
AchievementManager.is_unlocked("ACH_CHANGE_METEO")
if weather_changed:
AchievementManager.unlock("ACH_CHANGE_METEO")
func pick_random_weather() -> void:
var valid_buttons = []
@@ -214,7 +216,6 @@ func _on_photo_taken_finished() -> void:
func _on_choo_choo_button_pressed() -> void:
UIEvents.toot_toot.emit(true)
AchievementManager.is_unlocked("ACH_CHANGE_TRAIN_COLOR")
func _set_buttons_mouse_filter(ignore: bool) -> void:
var filter = Control.MOUSE_FILTER_IGNORE if ignore else Control.MOUSE_FILTER_STOP
@@ -223,8 +224,8 @@ func _set_buttons_mouse_filter(ignore: bool) -> void:
buttons.append_array(weather_row.options_icon_buttons)
if time_of_day_row and "options_icon_buttons" in time_of_day_row:
buttons.append_array(time_of_day_row.options_icon_buttons)
#if cameras_row and "options_icon_buttons" in cameras_row:
#buttons.append_array(cameras_row.options_icon_buttons)
if cameras_row and "options_icon_buttons" in cameras_row:
buttons.append_array(cameras_row.options_icon_buttons)
for btn in buttons:
if btn is Control:
@@ -233,17 +234,16 @@ func _set_buttons_mouse_filter(ignore: bool) -> void:
func hide_ui() -> void:
_ui_hidden = true
_set_buttons_mouse_filter(true)
var hud_elements = [hide_ui_button, weather_row, time_of_day_row, customize_train_button, collectible_icon_button, menu_icon_button, photo_icon_button, audio_player, choo_choo_button, time_label, dist_label]
var hud_elements = [hide_ui_button, weather_row, time_of_day_row, cameras_row, customize_train_button, collectible_icon_button, menu_icon_button, photo_icon_button, audio_player, choo_choo_button, time_label, dist_label]
for element in hud_elements:
element.visible = false
element.visible = true
TweenFX.fade_out(element, 0.25)
func show_ui() -> void:
UIEvents.on_show_ui_requested.emit()
_ui_hidden = false
_set_buttons_mouse_filter(false)
var hud_elements = [hide_ui_button, weather_row, time_of_day_row, customize_train_button, collectible_icon_button, menu_icon_button, photo_icon_button, audio_player, choo_choo_button, time_label, dist_label, tooltips]
var hud_elements = [hide_ui_button, weather_row, time_of_day_row, cameras_row, customize_train_button, collectible_icon_button, menu_icon_button, photo_icon_button, audio_player, choo_choo_button, time_label, dist_label, tooltips]
for element in hud_elements:
element.show()
TweenFX.fade_in(element, 0.25)

View File

@@ -233,7 +233,6 @@ offset_bottom = 220.0
[node name="CamerasRow" parent="InfoLabels" unique_id=1233961141 instance=ExtResource("2_4cc8f")]
unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_vertical = 1

View File

@@ -31,15 +31,11 @@ var initial_local_basis: Basis
var is_making_photo = false
var captured_image: Image
var _ui_is_visible = true
func _ready() -> void:
GameState.on_enable_photo_mode_request.connect(enable_photo_mode)
GameState.on_disable_photo_mode_request.connect(disable_photo_mode)
GameState.on_photo_taken_making.connect(take_photo_async)
GameState.on_photo_mode_black_screen_disappeared.connect(_on_photo_mode_black_screen_disappeared)
UIEvents.on_show_ui_requested.connect(update_ui_visibility.bind(true))
UIEvents.on_hide_ui_requested.connect(update_ui_visibility.bind(false))
initial_local_pos = position
initial_local_basis = basis
@@ -135,8 +131,6 @@ func _input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_photo_mode"):
if get_tree().paused:
return
if !_ui_is_visible:
return
if not is_active:
GameState.on_enable_photo_mode_request.emit()
else:
@@ -198,6 +192,3 @@ func take_photo_async() -> void:
func _on_photo_mode_black_screen_disappeared() -> void:
is_making_photo = false
func update_ui_visibility(ui_is_visible) -> void:
_ui_is_visible = ui_is_visible

View File

@@ -6,6 +6,11 @@ extends Node
const KNOWN := [
"ACH_CHANGE_METEO",
"ACH_CHANGE_TRAIN_COLOR",
"ACH_DISTANCE_100",
"ACH_DISTANCE_200",
"ACH_10_PHOTOS",
"ACH_10_TOOTTOOT",
"ACH_DISTANCE_1000"
]
#how it works:

View File

@@ -13,6 +13,13 @@ const KNOWN := [
"stat_photo_number",
"stat_toottoot_number",
]
const TIME_PLAYED_STAT: String = "stat_time_played"
const DISTANCE_KM_STAT: String = "stat_distance_km"
const STATS_STORE_INTERVAL_SECONDS: int = 60
var _pending_time_played_seconds: float = 0.0
var _pending_distance_km: float = 0.0
var _stats_store_timer: float = 0.0
#how it works:
#func _on_match_finished(score: int) -> void:
@@ -25,10 +32,20 @@ const KNOWN := [
func _ready() -> void:
if not SteamManager.is_on_steam:
set_process(false)
return
Steam.user_stats_stored.connect(_on_stats_stored)
func _process(delta: float) -> void:
_pending_time_played_seconds += delta
_stats_store_timer += delta
if _stats_store_timer >= STATS_STORE_INTERVAL_SECONDS:
_flush_periodic_stats(false)
func _exit_tree() -> void:
_flush_periodic_stats(true)
func get_int(stat: String) -> int:
if not SteamManager.is_on_steam:
return 0
@@ -62,6 +79,14 @@ func add_int(stat: String, amount: int = 1) -> void:
return
set_int(stat, get_int(stat) + amount)
func add_distance_km(distance_km: float) -> void:
if not SteamManager.is_on_steam:
return
if distance_km <= 0.0:
return
_pending_distance_km += distance_km
func update_avg_rate(stat: String, count_this_session: float, session_length: float) -> void:
if not SteamManager.is_on_steam:
return
@@ -74,6 +99,32 @@ func store() -> void:
if not Steam.storeStats():
push_error("storeStats failed; data saved locally")
#periodic stats incrementation; store data every 60 secs
func _flush_periodic_stats(force_store: bool) -> void:
if not SteamManager.is_on_steam:
_pending_time_played_seconds = 0.0
_pending_distance_km = 0.0
_stats_store_timer = 0.0
return
var has_changes: bool = false
var whole_seconds: int = int(floor(_pending_time_played_seconds))
if whole_seconds > 0:
_pending_time_played_seconds -= float(whole_seconds)
add_int(TIME_PLAYED_STAT, whole_seconds)
has_changes = true
var whole_km: int = int(floor(_pending_distance_km))
if whole_km > 0:
_pending_distance_km -= float(whole_km)
add_int(DISTANCE_KM_STAT, whole_km)
has_changes = true
_stats_store_timer = 0.0
if has_changes and (force_store or whole_seconds > 0 or whole_km > 0):
store()
#Development only: reset stats
func reset_all(include_achievements: bool = false) -> void:
if not SteamManager.is_on_steam:

View File

@@ -52,8 +52,6 @@ signal toot_toot(update_stats: bool)
@warning_ignore("unused_signal")
signal resume_game_requested
@warning_ignore("unused_signal")
signal on_show_ui_requested
@warning_ignore("unused_signal")
signal on_hide_ui_requested
@warning_ignore("unused_signal")
signal change_camera_request(camera_index: int)

View File

@@ -154,8 +154,6 @@ buffer = PackedFloat32Array(0.09478149, -0.4699982, -0.8787032, -19.27537, -0.99
[node name="chunk_railway_station_hero" unique_id=1726311377 node_paths=PackedStringArray("connection_left", "connection_right") groups=["railway_station", "weather_node"] instance=ExtResource("1_c8ljj")]
script = ExtResource("9_5ow1i")
chunk_type = 1
est = true
west = true
have_lamppost = true
connection_left = [NodePath("PaloLuce3/sx"), NodePath("PaloLuce2/sx"), NodePath("PaloLuce/sx")]
connection_right = [NodePath("PaloLuce/dx"), NodePath("PaloLuce2/dx"), NodePath("PaloLuce3/dx")]

View File

@@ -324,6 +324,7 @@ train_start_mode = 2
train_start_stop_index = 0
train_start_position = 540.0
train_start_after_delay = false
train_facing_direction = 2
sleepers_model = ExtResource("10_00nq7")
fireworks_scene = ExtResource("11_aylkj")
@@ -361,7 +362,7 @@ biome_list = Array[ExtResource("15_3blen")]([SubResource("Resource_n3osn")])
entity_pool = ExtResource("78_xg6nk")
entity_spawn_probability = 0.0
max_entities_per_chunk = 0
eye_line = 6
eye_line = 7
lamppost_max_wire_distance = 0.0
lamppost_rail_clearance_distance = 3.0
@@ -374,14 +375,14 @@ transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488
[node name="Fuji4" parent="." unique_id=930179001 instance=ExtResource("99_61psf")]
transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488, 0, -0.23751618, 239.46135, 1.7057877, 224.6928)
[node name="Landscape" parent="Fuji4" index="0" unique_id=581950846]
[node name="Landscape" parent="Fuji4" index="0" unique_id=244602034]
transform = Transform3D(28.638817, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638834, -10.786804, 5.0069, 17.382736)
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
[node name="Fuji5" parent="." unique_id=1070037082 instance=ExtResource("99_61psf")]
transform = Transform3D(0.0935979, 0, 0.9713791, 0, 0.56225973, 0, -0.38276324, 0, 0.23753339, -275.95566, -3.4616928, 232.02234)
[node name="Landscape" parent="Fuji5" index="0" unique_id=581950846]
[node name="Landscape" parent="Fuji5" index="0" unique_id=244602034]
transform = Transform3D(28.638819, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638836, -10.786743, 6.703195, 17.382767)
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
@@ -391,7 +392,7 @@ transform = Transform3D(-4.88843, -0.020050459, 0.86837775, -0.010355438, 4.9646
[node name="Fuji6" parent="." unique_id=150126281 instance=ExtResource("100_0aqpp")]
transform = Transform3D(-5.287449, -0.020231497, 0.22351237, -0.011200703, 5.009496, 0.014500697, -0.9394429, 0.05414178, -1.2581636, 32.446022, 15.848213, 525.54346)
[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=65404928]
[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=1389340781]
transform = Transform3D(0.5151193, -0.011206273, -0.07264297, 0.077138014, 0.07483422, 0.48510167, 3.5762787e-07, -0.4938935, 0.07515043, 6.299696, 12.244916, 3.004303)
surface_material_override/0 = SubResource("ShaderMaterial_vvb5q")

View File

@@ -190,7 +190,7 @@ data = PackedByteArray("//vQZAAOhpd2PgtGR7JsJPfgYSYSJ6387g9rgIGKF+EZgxxoAM4TYIWm
closed = true
bake_interval = 60.0
_data = {
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, -4.372, 0, 140, 0, 0, 0, 0, 0, 0, -20.963, 0, 160, 0, 0, 0, 0, 0, 0, -40.62518, 0, 168.52754, 0, 0, 0, 0, 0, 0, -60, 0, 170, 0, 0, 0, 0, 0, 0, -80, 0, 170, 0, 0, 0, 0, 0, 0, -100, 0, 170, 0, 0, 0, 0, 0, 0, -120.42937, 0, 171.50279, 0, 0, 0, 0, 0, 0, -141.41747, 7.6293945e-06, 180.5982, 0, 0, 0, 0, 0, 0, -155.77005, 7.6293945e-06, 198.35184, 0, 0, 0, 0, 0, 0, -160.14105, 7.6293945e-06, 219.80951, 0, 0, 0, 0, 0, 0, -163.99007, 7.6293945e-06, 239.36005, 0, 0, 0, 0, 0, 0, -175.77509, 7.6293945e-06, 256.16028, 0, 0, 0, 0, 0, 0, -195.62283, 7.6293945e-06, 267.46912, 0, 0, 0, 0, 0, 0, -219.9999, 7.6293945e-06, 270.11758, 0, 0, 0, 0, 0, 0, -240, 0, 270.118, 0, 0, 0, 0, 0, 0, -260, 0, 270.118, 0, 0, 0, 0, 0, 0, -275.19666, 7.6293945e-06, 270.55228, 0, 0, 0, 0, 0, 0, -294.2925, 7.6293945e-06, 276.05307, 0, 0, 0, 0, 0, 0, -307.19006, 7.6293945e-06, 286.9095, 0, 0, 0, 0, 0, 0, -317.32443, 7.6293945e-06, 303.14682, 0, 0, 0, 0, 0, 0, -320, 0, 320, 0, 0, 0, 0, 0, 0, -320, 0, 340, 0, 0, 0, 0, 0, 0, -320, 0, 360, 0, 0, 0, 0, 0, 0, -320, 0, 380, 0, 0, 0, 0, 0, 0, -316.78876, 7.6293945e-06, 396.91193, 0, 0, 0, 0, 0, 0, -307.68207, 7.6293945e-06, 412.70596, 0, 0, 0, 0, 0, 0, -291.08273, 7.6293945e-06, 424.7491, 0, 0, 0, 0, 0, 0, -270, 0, 429.994, 0, 0, 0, 0, 0, 0, -250, 0, 429.994, 0, 0, 0, 0, 0, 0, -229.90146, 7.6293945e-06, 433.90823, 0, 0, 0, 0, 0, 0, -217.15442, 7.6293945e-06, 442.98242, 0, 0, 0, 0, 0, 0, -204.60803, 7.6293945e-06, 459.93704, 0, 0, 0, 0, 0, 0, -200, 0, 480, 0, 0, 0, 0, 0, 0, -200, 0, 500, 0, 0, 0, 0, 0, 0, -195.5338, 7.6293945e-06, 520.0368, 0, 0, 0, 0, 0, 0, -184.9173, 7.6293945e-06, 535.07776, 0, 0, 0, 0, 0, 0, -170.36423, 7.6293945e-06, 545.0799, 0, 0, 0, 0, 0, 0, -150.56184, 0, 549.8127, 0, 0, 0, 0, 0, 0, -130, 0, 550, 0, 0, 0, 0, 0, 0, -110, 0, 550, 0, 0, 0, 0, 0, 0, -90, 0, 550, 0, 0, 0, 0, 0, 0, -70, 0, 550, 0, 0, 0, 0, 0, 0, -50, 0, 550, 0, 0, 0, 0, 0, 0, -29.862535, 7.6293945e-06, 545.3371, 0, 0, 0, 0, 0, 0, -13.215244, 7.6293945e-06, 533.0626, 0, 0, 0, 0, 0, 0, -4.098665, 7.6293945e-06, 519.6814, 0, 0, 0, 0, 0, 0, -0.048213482, 7.6293945e-06, 500.107, 0, 0, 0, 0, 0, 0, 3.7920675, 7.6293945e-06, 480.64902, 0, 0, 0, 0, 0, 0, 13.513225, 7.6293945e-06, 465.9133, 0, 0, 0, 0, 0, 0, 29.76715, 7.6293945e-06, 454.41486, 0, 0, 0, 0, 0, 0, 49.711926, 7.6293945e-06, 450.12488, 0, 0, 0, 0, 0, 0, 70, 0, 450, 0, 0, 0, 0, 0, 0, 90, 0, 450, 0, 0, 0, 0, 0, 0, 110.055405, 7.6293945e-06, 445.42627, 0, 0, 0, 0, 0, 0, 126.975784, 7.6293945e-06, 432.8683, 0, 0, 0, 0, 0, 0, 136.95703, 7.6293945e-06, 417.5506, 0, 0, 0, 0, 0, 0, 140, 0, 400, 0, 0, 0, 0, 0, 0, 140, 0, 380, 0, 0, 0, 0, 0, 0, 140, 0, 360, 0, 0, 0, 0, 0, 0, 140, 0, 340, 0, 0, 0, 0, 0, 0, 140, 0, 320, 0, 0, 0, 0, 0, 0, 140, 0, 300, 0, 0, 0, 0, 0, 0, 140, 0, 280, 0, 0, 0, 0, 0, 0, 140, 0, 260, 0, 0, 0, 0, 0, 0, 140, 0, 240, 0, 0, 0, 0, 0, 0, 140, 0, 220, 0, 0, 0, 0, 0, 0, 140, 0, 200, 0, 0, 0, 0, 0, 0, 140, 0, 180, 0, 0, 0, 0, 0, 0, 140, 0, 160, 0, 0, 0, 0, 0, 0, 140, 0, 140, 0, 0, 0, 0, 0, 0, 140, 0, 120, 0, 0, 0, 0, 0, 0, 140, 0, 100, 0, 0, 0, 0, 0, 0, 140, 0, 80, 0, 0, 0, 0, 0, 0, 140, 0, 60, 0, 0, 0, 0, 0, 0, 140, 0, 40, 0, 0, 0, 0, 0, 0, 140.26848, 0, 20, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 136.2151, 7.6293945e-06, -18.930761, 0, 0, 0, 0, 0, 0, 124.47424, 7.6293945e-06, -35.771675, 0, 0, 0, 0, 0, 0, 109.556854, 7.6293945e-06, -45.911987, 0, 0, 0, 0, 0, 0, 90, 0, -50, 0, 0, 0, 0, 0, 0, 70, 0, -50, 0, 0, 0, 0, 0, 0, 50, 0, -50, 0, 0, 0, 0, 0, 0, 30.626865, 7.6293945e-06, -46.35706, 0, 0, 0, 0, 0, 0, 14.519331, 7.6293945e-06, -35.468895, 0, 0, 0, 0, 0, 0, 3.52941, 7.6293945e-06, -19.590664),
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, -4.1409535, 0, 140, 0, 0, 0, 0, 0, 0, -20.385382, 0, 160.4621, 0, 0, 0, 0, 0, 0, -40.62518, 0, 168.52754, 0, 0, 0, 0, 0, 0, -60, 0, 170, 0, 0, 0, 0, 0, 0, -80, 0, 170, 0, 0, 0, 0, 0, 0, -100, 0, 170, 0, 0, 0, 0, 0, 0, -120.42937, 0, 171.50279, 0, 0, 0, 0, 0, 0, -141.41747, 7.6293945e-06, 180.5982, 0, 0, 0, 0, 0, 0, -155.77005, 7.6293945e-06, 198.35184, 0, 0, 0, 0, 0, 0, -160.14105, 7.6293945e-06, 219.80951, 0, 0, 0, 0, 0, 0, -163.99007, 7.6293945e-06, 239.36005, 0, 0, 0, 0, 0, 0, -175.77509, 7.6293945e-06, 256.16028, 0, 0, 0, 0, 0, 0, -195.62283, 7.6293945e-06, 267.46912, 0, 0, 0, 0, 0, 0, -219.9999, 7.6293945e-06, 270.11758, 0, 0, 0, 0, 0, 0, -240, 0, 270.118, 0, 0, 0, 0, 0, 0, -260, 0, 270.118, 0, 0, 0, 0, 0, 0, -275.19666, 7.6293945e-06, 270.55228, 0, 0, 0, 0, 0, 0, -294.2925, 7.6293945e-06, 276.05307, 0, 0, 0, 0, 0, 0, -307.19006, 7.6293945e-06, 286.9095, 0, 0, 0, 0, 0, 0, -317.32443, 7.6293945e-06, 303.14682, 0, 0, 0, 0, 0, 0, -320, 0, 320, 0, 0, 0, 0, 0, 0, -320, 0, 340, 0, 0, 0, 0, 0, 0, -320, 0, 360, 0, 0, 0, 0, 0, 0, -320, 0, 380, 0, 0, 0, 0, 0, 0, -316.78876, 7.6293945e-06, 396.91193, 0, 0, 0, 0, 0, 0, -307.68207, 7.6293945e-06, 412.70596, 0, 0, 0, 0, 0, 0, -291.08273, 7.6293945e-06, 424.7491, 0, 0, 0, 0, 0, 0, -270, 0, 429.994, 0, 0, 0, 0, 0, 0, -250, 0, 429.994, 0, 0, 0, 0, 0, 0, -229.90146, 7.6293945e-06, 433.90823, 0, 0, 0, 0, 0, 0, -217.15442, 7.6293945e-06, 442.98242, 0, 0, 0, 0, 0, 0, -203.97934, 7.6293945e-06, 459.7799, 0, 0, 0, 0, 0, 0, -200, 0, 480, 0, 0, 0, 0, 0, 0, -200, 0, 500, 0, 0, 0, 0, 0, 0, -195.5338, 7.6293945e-06, 520.0368, 0, 0, 0, 0, 0, 0, -184.9173, 7.6293945e-06, 535.07776, 0, 0, 0, 0, 0, 0, -170.36423, 7.6293945e-06, 545.0799, 0, 0, 0, 0, 0, 0, -150.56184, 0, 549.8127, 0, 0, 0, 0, 0, 0, -130, 0, 550, 0, 0, 0, 0, 0, 0, -110, 0, 550, 0, 0, 0, 0, 0, 0, -90, 0, 550, 0, 0, 0, 0, 0, 0, -70, 0, 550, 0, 0, 0, 0, 0, 0, -50, 0, 550, 0, 0, 0, 0, 0, 0, -29.862535, 7.6293945e-06, 545.3371, 0, 0, 0, 0, 0, 0, -12.945752, 7.6293945e-06, 534.1406, 0, 0, 0, 0, 0, 0, -4.098665, 7.6293945e-06, 519.6814, 0, 0, 0, 0, 0, 0, -0.048213482, 7.6293945e-06, 500.107, 0, 0, 0, 0, 0, 0, 3.7920675, 7.6293945e-06, 480.64902, 0, 0, 0, 0, 0, 0, 13.513225, 7.6293945e-06, 465.9133, 0, 0, 0, 0, 0, 0, 29.76715, 7.6293945e-06, 454.41486, 0, 0, 0, 0, 0, 0, 49.711926, 7.6293945e-06, 450.12488, 0, 0, 0, 0, 0, 0, 70, 0, 450, 0, 0, 0, 0, 0, 0, 90, 0, 450, 0, 0, 0, 0, 0, 0, 110.055405, 7.6293945e-06, 445.42627, 0, 0, 0, 0, 0, 0, 127.27293, 7.6293945e-06, 433.46255, 0, 0, 0, 0, 0, 0, 136.95703, 7.6293945e-06, 417.5506, 0, 0, 0, 0, 0, 0, 140, 0, 400, 0, 0, 0, 0, 0, 0, 140, 0, 380, 0, 0, 0, 0, 0, 0, 140, 0, 360, 0, 0, 0, 0, 0, 0, 140, 0, 340, 0, 0, 0, 0, 0, 0, 140, 0, 320, 0, 0, 0, 0, 0, 0, 140, 0, 300, 0, 0, 0, 0, 0, 0, 140, 0, 280, 0, 0, 0, 0, 0, 0, 140, 0, 260, 0, 0, 0, 0, 0, 0, 140, 0, 240, 0, 0, 0, 0, 0, 0, 140, 0, 220, 0, 0, 0, 0, 0, 0, 140, 0, 200, 0, 0, 0, 0, 0, 0, 140, 0, 180, 0, 0, 0, 0, 0, 0, 140, 0, 160, 0, 0, 0, 0, 0, 0, 140, 0, 140, 0, 0, 0, 0, 0, 0, 140, 0, 120, 0, 0, 0, 0, 0, 0, 140, 0, 100, 0, 0, 0, 0, 0, 0, 140, 0, 80, 0, 0, 0, 0, 0, 0, 140, 0, 60, 0, 0, 0, 0, 0, 0, 140, 0, 40, 0, 0, 0, 0, 0, 0, 140.26848, 0, 20, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 136.2151, 7.6293945e-06, -18.930761, 0, 0, 0, 0, 0, 0, 124.47424, 7.6293945e-06, -35.771675, 0, 0, 0, 0, 0, 0, 109.556854, 7.6293945e-06, -45.911987, 0, 0, 0, 0, 0, 0, 90, 0, -50, 0, 0, 0, 0, 0, 0, 70, 0, -50, 0, 0, 0, 0, 0, 0, 50, 0, -50, 0, 0, 0, 0, 0, 0, 30.626865, 7.6293945e-06, -46.35706, 0, 0, 0, 0, 0, 0, 14.519331, 7.6293945e-06, -35.468895, 0, 0, 0, 0, 0, 0, 3.5, 0, -17.9, 0, 0, 0, 0, 0, 0, 0.2006703, 0, 0.20440674, 0, 0, 0, 0, 0, 0, 0.06303978, 0, 20.431122),
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
}
point_count = 93
@@ -205,7 +205,7 @@ compositor = SubResource("Compositor_mb5yv")
rail_path = NodePath("../rail")
biome_list = Array[ExtResource("6_jfe74")]([SubResource("Resource_3qrd0")])
entity_pool = ExtResource("34_a2cst")
entity_spawn_probability = 1.0
entity_spawn_probability = 0.4
max_entities_per_chunk = 5
eye_line = 4
@@ -253,18 +253,6 @@ cameras = NodePath("../cameras")
sleepers_model = ExtResource("46_lbmv2")
fireworks_scene = ExtResource("47_q7p65")
[node name="Marker3D" type="Marker3D" parent="rail" unique_id=1460318018]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.7581053, -1.6046681, 59.658325)
[node name="Marker3D2" type="Marker3D" parent="rail" unique_id=131965864]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 127.14737, 0, 169.44846)
[node name="Marker3D3" type="Marker3D" parent="rail" unique_id=492991547]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -91.191925, 0, 539.03174)
[node name="Marker3D4" type="Marker3D" parent="rail" unique_id=1550097358]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -312.19193, 0, 349.03174)
[node name="Control" type="Control" parent="." unique_id=630650980]
visible = false
layout_mode = 3

View File

@@ -64,9 +64,9 @@ grad_intensity_night = 0.5
fog_color_morning = Color(0.7490196, 0.8509804, 0.9490196, 1)
fog_color_afternoon = Color(0.9823975, 0.8034449, 0.8778439, 1)
fog_color_night = Color(0.18375358, 0.16627002, 0.3588226, 1)
fog_density_morning = 0.01
fog_density_afternoon = 0.01
fog_density_night = 0.03
fog_density_morning = 0.02
fog_density_afternoon = 0.02
fog_density_night = 0.02
glow_morning = 0.4
glow_night = 0.8
enable_fog = true
@@ -78,8 +78,8 @@ lightning_min = 2
lightning_max = 4
lightning_scale_min = 2.0
lightning_scale_max = 5.0
godray_max_rain = 30
godray_spawn_radius = 100.0
godray_max_rain = 15
godray_spawn_radius = 200.0
godray_spawn_offset = Vector3(20, 80, 20)
godray_rotation_degrees = Vector3(50, 30, 0)
godray_scale = Vector3(2, 25, 50)