fix snow and exposure
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
extends Path3D
|
extends Path3D
|
||||||
|
|
||||||
const STEAM_DISTANCE_STAT: String = "stat_distance_km"
|
const STEAM_DISTANCE_STAT: String = "stat_distance_km"
|
||||||
const DISTANCE_KM_PER_UNIT: float = 0.001
|
const DISTANCE_KM_PER_UNIT: float = 0.01
|
||||||
|
|
||||||
@export_group("Train")
|
@export_group("Train")
|
||||||
##train speed
|
##train speed
|
||||||
@@ -83,17 +83,20 @@ var environment_config: EnvironmentConfig
|
|||||||
var wagon_instances: Array[Node3D] = []
|
var wagon_instances: Array[Node3D] = []
|
||||||
var wagon_progress_offsets: Array[float] = []
|
var wagon_progress_offsets: Array[float] = []
|
||||||
var _pending_steam_distance_km: float = 0.0
|
var _pending_steam_distance_km: float = 0.0
|
||||||
|
var _initial_is_inmotion: bool = true
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
randomize()
|
randomize()
|
||||||
|
|
||||||
_cache_environment_config()
|
_cache_environment_config()
|
||||||
|
_initial_is_inmotion = is_inmotion
|
||||||
|
|
||||||
if curve != null and curve.get_baked_length() > 0:
|
if curve != null and curve.get_baked_length() > 0:
|
||||||
build_rails()
|
build_rails()
|
||||||
build_train()
|
build_train()
|
||||||
_plan_stops()
|
_plan_stops()
|
||||||
_apply_initial_train_start()
|
_apply_initial_train_start()
|
||||||
|
_apply_train_start_delay()
|
||||||
else:
|
else:
|
||||||
print("WARNING: Draw Path3D for rails!")
|
print("WARNING: Draw Path3D for rails!")
|
||||||
|
|
||||||
@@ -138,6 +141,23 @@ func _apply_initial_train_start() -> void:
|
|||||||
|
|
||||||
_snap_train_to_progress()
|
_snap_train_to_progress()
|
||||||
|
|
||||||
|
func _apply_train_start_delay() -> void:
|
||||||
|
if not _initial_is_inmotion:
|
||||||
|
return
|
||||||
|
|
||||||
|
var start_delay_seconds: float = 0.0
|
||||||
|
if environment_config != null:
|
||||||
|
start_delay_seconds = maxf(environment_config.train_start_delay_seconds, 0.0)
|
||||||
|
if start_delay_seconds <= 0.0:
|
||||||
|
return
|
||||||
|
|
||||||
|
is_inmotion = false
|
||||||
|
await get_tree().create_timer(start_delay_seconds).timeout
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
is_inmotion = _initial_is_inmotion
|
||||||
|
|
||||||
func _set_next_stop_index_from_current(current_stop_index: int) -> void:
|
func _set_next_stop_index_from_current(current_stop_index: int) -> void:
|
||||||
if stop_offset.is_empty():
|
if stop_offset.is_empty():
|
||||||
next_stop_index = 0
|
next_stop_index = 0
|
||||||
|
|||||||
@@ -139,10 +139,10 @@ func _apply_dynamic_environment_materials(node: Node) -> void:
|
|||||||
if node.is_in_group("wind_node"):
|
if node.is_in_group("wind_node"):
|
||||||
_apply_wind_noise_to_node(node, NOISE_TEXTURE)
|
_apply_wind_noise_to_node(node, NOISE_TEXTURE)
|
||||||
|
|
||||||
if node.is_in_group("weather_node"):
|
if node.is_in_group("weather_node") or node.is_in_group("weather_vegetables_node"):
|
||||||
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
||||||
|
|
||||||
if _should_clear_weather_overlay(node):
|
if _should_ignore_weather_overlay(node):
|
||||||
_clear_weather_overlay_from_node(node)
|
_clear_weather_overlay_from_node(node)
|
||||||
|
|
||||||
func ApplyWindNoiseToMaterials():
|
func ApplyWindNoiseToMaterials():
|
||||||
@@ -169,8 +169,7 @@ func ApplyWeatherShaderToMaterials():
|
|||||||
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
||||||
|
|
||||||
for node in get_tree().get_nodes_in_group("weather_vegetables_node"):
|
for node in get_tree().get_nodes_in_group("weather_vegetables_node"):
|
||||||
if _should_clear_weather_overlay(node):
|
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
||||||
_clear_weather_overlay_from_node(node)
|
|
||||||
|
|
||||||
func _get_weather_overlay_material(node: Node) -> Material:
|
func _get_weather_overlay_material(node: Node) -> Material:
|
||||||
if not node.is_in_group("weather_overlay_no_noise"):
|
if not node.is_in_group("weather_overlay_no_noise"):
|
||||||
@@ -185,12 +184,12 @@ func _get_weather_overlay_material(node: Node) -> Material:
|
|||||||
return weather_shader_no_noise
|
return weather_shader_no_noise
|
||||||
|
|
||||||
func _apply_weather_overlay_to_node(node: Node, material: Material) -> void:
|
func _apply_weather_overlay_to_node(node: Node, material: Material) -> void:
|
||||||
if _should_clear_weather_overlay(node):
|
if _should_ignore_weather_overlay(node):
|
||||||
_clear_weather_overlay_from_node(node)
|
_clear_weather_overlay_from_node(node)
|
||||||
return
|
return
|
||||||
|
|
||||||
if node is GeometryInstance3D:
|
if node is GeometryInstance3D:
|
||||||
if _geometry_uses_alpha_texture(node):
|
if _should_clear_weather_overlay(node) or _geometry_uses_alpha_texture(node):
|
||||||
node.material_overlay = null
|
node.material_overlay = null
|
||||||
else:
|
else:
|
||||||
node.material_overlay = material
|
node.material_overlay = material
|
||||||
@@ -230,8 +229,11 @@ func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool:
|
|||||||
|
|
||||||
return material.shader.code.find("alpha_texture") != -1
|
return material.shader.code.find("alpha_texture") != -1
|
||||||
|
|
||||||
|
func _should_ignore_weather_overlay(node: Node) -> bool:
|
||||||
|
return node.is_in_group("weather_overlay_ignore")
|
||||||
|
|
||||||
func _should_clear_weather_overlay(node: Node) -> bool:
|
func _should_clear_weather_overlay(node: Node) -> bool:
|
||||||
return node.is_in_group("weather_vegetables_node") or node.is_in_group("weather_overlay_ignore")
|
return node.is_in_group("weather_vegetables_node")
|
||||||
|
|
||||||
func select_day_time(normalized_time: float) -> void:
|
func select_day_time(normalized_time: float) -> void:
|
||||||
#set show_day_time_debug = true to show debug on screen
|
#set show_day_time_debug = true to show debug on screen
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ extends Resource
|
|||||||
@export_group("Train Start")
|
@export_group("Train Start")
|
||||||
@export var train_start_from_random_position: bool = true #When enabled the train starts from a random offset on the rail curve instead of a stop
|
@export var train_start_from_random_position: bool = true #When enabled the train starts from a random offset on the rail curve instead of a stop
|
||||||
@export_range(0, 64, 1, "or_greater") var train_start_stop_index: int = 1 #Stop index used for the train start when random start is disabled
|
@export_range(0, 64, 1, "or_greater") var train_start_stop_index: int = 1 #Stop index used for the train start when random start is disabled
|
||||||
|
@export var train_start_delay_seconds: float = 3.0 #Seconds the train waits before starting at game launch
|
||||||
|
@export var train_start_acceleration_seconds: float = 4.0 #Seconds used to progressively reach normal train speed after launch
|
||||||
|
|
||||||
#Snow settings
|
#Snow settings
|
||||||
@export_group("Snow")
|
@export_group("Snow")
|
||||||
|
|||||||
@@ -1,20 +1,47 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
|
const TRAIN_WHISTLE_STREAM: AudioStream = preload("res://tgcc/train/sounds/train_whistle2.mp3")
|
||||||
|
|
||||||
@onready var play_button: Button = $%PlayButton
|
@onready var play_button: Button = $%PlayButton
|
||||||
@onready var resume_button: Button = $%ResumeButton
|
@onready var resume_button: Button = $%ResumeButton
|
||||||
@onready var settings_button: Button = $%SettingsButton
|
@onready var settings_button: Button = $%SettingsButton
|
||||||
@onready var save_button: Button = $%SaveButton
|
@onready var save_button: Button = $%SaveButton
|
||||||
@onready var quit_button: Button = $%QuitButton
|
@onready var quit_button: Button = $%QuitButton
|
||||||
|
@export var fade_time: float = 0.5
|
||||||
|
@export var menu_whistle_volume_db: float = -12.0
|
||||||
|
|
||||||
|
var _fallback_whistle_player: AudioStreamPlayer
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
_create_fallback_whistle_player()
|
||||||
play_button.pressed.connect(_on_play_button_pressed)
|
play_button.pressed.connect(_on_play_button_pressed)
|
||||||
save_button.pressed.connect(_on_save_button_pressed)
|
save_button.pressed.connect(_on_save_button_pressed)
|
||||||
quit_button.pressed.connect(_on_quit_button_pressed)
|
quit_button.pressed.connect(_on_quit_button_pressed)
|
||||||
|
|
||||||
func _on_play_button_pressed() -> void:
|
func _on_play_button_pressed() -> void:
|
||||||
|
_play_train_horn()
|
||||||
|
await get_tree().create_timer(fade_time).timeout
|
||||||
SceneManager.change_scene(SceneConfig.SceneName.GAME)
|
SceneManager.change_scene(SceneConfig.SceneName.GAME)
|
||||||
|
|
||||||
|
func _create_fallback_whistle_player() -> void:
|
||||||
|
_fallback_whistle_player = AudioStreamPlayer.new()
|
||||||
|
_fallback_whistle_player.name = "FallbackTrainWhistlePlayer"
|
||||||
|
_fallback_whistle_player.bus = &"SFX"
|
||||||
|
_fallback_whistle_player.volume_db = menu_whistle_volume_db
|
||||||
|
_fallback_whistle_player.stream = TRAIN_WHISTLE_STREAM
|
||||||
|
add_child(_fallback_whistle_player)
|
||||||
|
|
||||||
|
func _play_train_horn() -> void:
|
||||||
|
if not UIEvents.toot_toot.get_connections().is_empty():
|
||||||
|
UIEvents.toot_toot.emit(false)
|
||||||
|
return
|
||||||
|
|
||||||
|
if _fallback_whistle_player == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
_fallback_whistle_player.stop()
|
||||||
|
_fallback_whistle_player.play()
|
||||||
|
|
||||||
func _on_save_button_pressed() -> void:
|
func _on_save_button_pressed() -> void:
|
||||||
GameState.save_game()
|
GameState.save_game()
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ func _set_selected_color(index: int, material_index: int) -> void:
|
|||||||
else:
|
else:
|
||||||
color_pickers[i].deselect()
|
color_pickers[i].deselect()
|
||||||
|
|
||||||
AchievementManager.is_unlocked("ACH_CHANGE_TRAIN_COLOR")
|
|
||||||
|
|
||||||
func _on_color_selected(selected_color_picker: TrainColorPicker, material_index: int) -> void:
|
func _on_color_selected(selected_color_picker: TrainColorPicker, material_index: int) -> void:
|
||||||
var color_pickers = color_pickers_1 if material_index == 0 else color_pickers_2
|
var color_pickers = color_pickers_1 if material_index == 0 else color_pickers_2
|
||||||
for i in range(color_pickers.size()):
|
for i in range(color_pickers.size()):
|
||||||
|
|||||||
@@ -196,8 +196,8 @@ func _on_photo_taken_finished() -> void:
|
|||||||
StatsManager.store()
|
StatsManager.store()
|
||||||
|
|
||||||
func _on_choo_choo_button_pressed() -> void:
|
func _on_choo_choo_button_pressed() -> void:
|
||||||
#play sfx
|
UIEvents.toot_toot.emit(true)
|
||||||
pass
|
AchievementManager.is_unlocked("ACH_CHANGE_TRAIN_COLOR")
|
||||||
|
|
||||||
func _set_buttons_mouse_filter(ignore: bool) -> void:
|
func _set_buttons_mouse_filter(ignore: bool) -> void:
|
||||||
var filter = Control.MOUSE_FILTER_IGNORE if ignore else Control.MOUSE_FILTER_STOP
|
var filter = Control.MOUSE_FILTER_IGNORE if ignore else Control.MOUSE_FILTER_STOP
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ func _on_global_percentages_ready(_game: int, _result: int) -> void:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
func unlock(api_name: String) -> void:
|
func unlock(api_name: String) -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
if not KNOWN.has(api_name):
|
if not KNOWN.has(api_name):
|
||||||
push_warning("Achievement unknown: %s" % api_name)
|
push_warning("Achievement unknown: %s" % api_name)
|
||||||
return
|
return
|
||||||
@@ -47,17 +49,25 @@ func unlock(api_name: String) -> void:
|
|||||||
unlocked.emit(api_name)
|
unlocked.emit(api_name)
|
||||||
|
|
||||||
func is_unlocked(api_name: String) -> bool:
|
func is_unlocked(api_name: String) -> bool:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return false
|
||||||
var data: Dictionary = Steam.getAchievement(api_name)
|
var data: Dictionary = Steam.getAchievement(api_name)
|
||||||
return data.get("achieved", false)
|
return data.get("achieved", false)
|
||||||
|
|
||||||
func get_display_name(api_name: String) -> String:
|
func get_display_name(api_name: String) -> String:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return ""
|
||||||
return Steam.getAchievementDisplayAttribute(api_name, "name")
|
return Steam.getAchievementDisplayAttribute(api_name, "name")
|
||||||
|
|
||||||
func get_description(api_name: String) -> String:
|
func get_description(api_name: String) -> String:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return ""
|
||||||
return Steam.getAchievementDisplayAttribute(api_name, "desc")
|
return Steam.getAchievementDisplayAttribute(api_name, "desc")
|
||||||
|
|
||||||
#Global percentage of player who have unlocked the achievement
|
#Global percentage of player who have unlocked the achievement
|
||||||
func get_global_percent(api_name: String) -> float:
|
func get_global_percent(api_name: String) -> float:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return 0.0
|
||||||
var data: Dictionary = Steam.getAchievementAchievedPercent(api_name)
|
var data: Dictionary = Steam.getAchievementAchievedPercent(api_name)
|
||||||
if not data.get("ret", false):
|
if not data.get("ret", false):
|
||||||
return -1.0 #global percentage not yet available
|
return -1.0 #global percentage not yet available
|
||||||
@@ -65,9 +75,10 @@ func get_global_percent(api_name: String) -> float:
|
|||||||
|
|
||||||
#for development only: reset an achievement
|
#for development only: reset an achievement
|
||||||
func clear(api_name: String) -> void:
|
func clear(api_name: String) -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
Steam.clearAchievement(api_name)
|
Steam.clearAchievement(api_name)
|
||||||
Steam.storeStats()
|
Steam.storeStats()
|
||||||
|
|
||||||
func _on_achievement_stored(_game: int, _group: bool, api_name: String,
|
func _on_achievement_stored(_game: int, _group: bool, api_name: String, current: int, maximum: int) -> void:
|
||||||
current: int, maximum: int) -> void:
|
|
||||||
print("Achievement confirmed by server: %s (%d/%d)" % [api_name, current, maximum])
|
print("Achievement confirmed by server: %s (%d/%d)" % [api_name, current, maximum])
|
||||||
|
|||||||
@@ -30,15 +30,21 @@ func _ready() -> void:
|
|||||||
Steam.user_stats_stored.connect(_on_stats_stored)
|
Steam.user_stats_stored.connect(_on_stats_stored)
|
||||||
|
|
||||||
func get_int(stat: String) -> int:
|
func get_int(stat: String) -> int:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return 0
|
||||||
return Steam.getStatInt(stat)
|
return Steam.getStatInt(stat)
|
||||||
|
|
||||||
func get_float(stat: String) -> float:
|
func get_float(stat: String) -> float:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return 0.0
|
||||||
return Steam.getStatFloat(stat)
|
return Steam.getStatFloat(stat)
|
||||||
|
|
||||||
func set_int(stat: String, value: int) -> void:
|
func set_int(stat: String, value: int) -> void:
|
||||||
if not KNOWN.has(stat):
|
if not KNOWN.has(stat):
|
||||||
push_warning("Stat not found: %s" % stat)
|
push_warning("Stat not found: %s" % stat)
|
||||||
return
|
return
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
|
|
||||||
if not Steam.setStatInt(stat, value):
|
if not Steam.setStatInt(stat, value):
|
||||||
push_error("setStatInt failed (incremental with value less than current value? is published on steam?): %s" % stat)
|
push_error("setStatInt failed (incremental with value less than current value? is published on steam?): %s" % stat)
|
||||||
@@ -52,18 +58,26 @@ func set_float(stat: String, value: float) -> void:
|
|||||||
push_error("setStatFloat failed: %s" % stat)
|
push_error("setStatFloat failed: %s" % stat)
|
||||||
|
|
||||||
func add_int(stat: String, amount: int = 1) -> void:
|
func add_int(stat: String, amount: int = 1) -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
set_int(stat, get_int(stat) + amount)
|
set_int(stat, get_int(stat) + amount)
|
||||||
|
|
||||||
func update_avg_rate(stat: String, count_this_session: float, session_length: float) -> void:
|
func update_avg_rate(stat: String, count_this_session: float, session_length: float) -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
Steam.updateAvgRateStat(stat, count_this_session, session_length)
|
Steam.updateAvgRateStat(stat, count_this_session, session_length)
|
||||||
|
|
||||||
#Send all data to server; call it at the end of the game of when exit
|
#Send all data to server; call it at the end of the game of when exit
|
||||||
func store() -> void:
|
func store() -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
if not Steam.storeStats():
|
if not Steam.storeStats():
|
||||||
push_error("storeStats failed; data saved locally")
|
push_error("storeStats failed; data saved locally")
|
||||||
|
|
||||||
#Development only: reset stats
|
#Development only: reset stats
|
||||||
func reset_all(include_achievements: bool = false) -> void:
|
func reset_all(include_achievements: bool = false) -> void:
|
||||||
|
if not SteamManager.is_on_steam:
|
||||||
|
return
|
||||||
if !Steam.resetAllStats(include_achievements):
|
if !Steam.resetAllStats(include_achievements):
|
||||||
push_error("resetAllStats failed")
|
push_error("resetAllStats failed")
|
||||||
|
|
||||||
|
|||||||
@@ -46,4 +46,4 @@ signal day_time_option_changed(index: int)
|
|||||||
|
|
||||||
#train signals
|
#train signals
|
||||||
@warning_ignore("unused_signal")
|
@warning_ignore("unused_signal")
|
||||||
signal toot_toot()
|
signal toot_toot(update_stats: bool)
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ func _on_update_rails_pressed() -> void:
|
|||||||
UIEvents.update_rail_chunks.emit()
|
UIEvents.update_rail_chunks.emit()
|
||||||
|
|
||||||
func _on_toot_toot_pressed() -> void:
|
func _on_toot_toot_pressed() -> void:
|
||||||
UIEvents.toot_toot.emit()
|
UIEvents.toot_toot.emit(true)
|
||||||
|
|
||||||
func _on_reset_stats_ach_pressed() -> void:
|
func _on_reset_stats_ach_pressed() -> void:
|
||||||
StatsManager.reset_all(true)
|
StatsManager.reset_all(true)
|
||||||
|
|||||||
@@ -189,9 +189,9 @@ data = PackedByteArray("//vQZAAOhpd2PgtGR7JsJPfgYSYSJ6387g9rgIGKF+EZgxxoAM4TYIWm
|
|||||||
|
|
||||||
[sub_resource type="Curve3D" id="Curve3D_ndco5"]
|
[sub_resource type="Curve3D" id="Curve3D_ndco5"]
|
||||||
closed = true
|
closed = true
|
||||||
bake_interval = 30.0
|
bake_interval = 60.0
|
||||||
_data = {
|
_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.25493, 7.6293945e-06, 199.082, 0, 0, 0, 0, 0, 0, -159.74689, 7.6293945e-06, 219.73068, 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, 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, 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),
|
||||||
"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)
|
"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
|
point_count = 93
|
||||||
@@ -207,7 +207,8 @@ compositor = SubResource("Compositor_mb5yv")
|
|||||||
rail_path = NodePath("../rail")
|
rail_path = NodePath("../rail")
|
||||||
biome_list = Array[ExtResource("6_jfe74")]([SubResource("Resource_3qrd0")])
|
biome_list = Array[ExtResource("6_jfe74")]([SubResource("Resource_3qrd0")])
|
||||||
entity_pool = ExtResource("34_a2cst")
|
entity_pool = ExtResource("34_a2cst")
|
||||||
max_entities_per_chunk = 6
|
entity_spawn_probability = 1.0
|
||||||
|
max_entities_per_chunk = 5
|
||||||
eye_line = 4
|
eye_line = 4
|
||||||
|
|
||||||
[node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561]
|
[node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561]
|
||||||
@@ -255,13 +256,22 @@ wagon_pool = ExtResource("46_exdk1")
|
|||||||
wagon_count = 5
|
wagon_count = 5
|
||||||
wagon_gap = 0.8
|
wagon_gap = 0.8
|
||||||
wagon_spacing_scale = 0.9
|
wagon_spacing_scale = 0.9
|
||||||
rail_distance = 1.0
|
|
||||||
cameras = NodePath("../cameras")
|
cameras = NodePath("../cameras")
|
||||||
basic_swing = 0.2
|
|
||||||
sleepers_distance = 1.6
|
|
||||||
sleepers_model = ExtResource("46_lbmv2")
|
sleepers_model = ExtResource("46_lbmv2")
|
||||||
fireworks_scene = ExtResource("47_q7p65")
|
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]
|
[node name="Control" type="Control" parent="." unique_id=630650980]
|
||||||
visible = false
|
visible = false
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
|
|||||||
578
tgcc/main_scene.tscn24503391028.tmp
Normal file
578
tgcc/main_scene.tscn24503391028.tmp
Normal file
File diff suppressed because one or more lines are too long
@@ -16,13 +16,11 @@ func _ready() -> void:
|
|||||||
|
|
||||||
if not UIEvents.toot_toot.is_connected(_on_toot_toot):
|
if not UIEvents.toot_toot.is_connected(_on_toot_toot):
|
||||||
UIEvents.toot_toot.connect(_on_toot_toot)
|
UIEvents.toot_toot.connect(_on_toot_toot)
|
||||||
|
|
||||||
|
|
||||||
func _exit_tree() -> void:
|
func _exit_tree() -> void:
|
||||||
if UIEvents.toot_toot.is_connected(_on_toot_toot):
|
if UIEvents.toot_toot.is_connected(_on_toot_toot):
|
||||||
UIEvents.toot_toot.disconnect(_on_toot_toot)
|
UIEvents.toot_toot.disconnect(_on_toot_toot)
|
||||||
|
|
||||||
|
|
||||||
func _create_whistle_player() -> void:
|
func _create_whistle_player() -> void:
|
||||||
_whistle_player = AudioStreamPlayer3D.new()
|
_whistle_player = AudioStreamPlayer3D.new()
|
||||||
_whistle_player.name = "TrainWhistlePlayer"
|
_whistle_player.name = "TrainWhistlePlayer"
|
||||||
@@ -33,14 +31,13 @@ func _create_whistle_player() -> void:
|
|||||||
_whistle_player.stream = TRAIN_WHISTLE_STREAM
|
_whistle_player.stream = TRAIN_WHISTLE_STREAM
|
||||||
add_child(_whistle_player)
|
add_child(_whistle_player)
|
||||||
|
|
||||||
|
func _on_toot_toot(update_stats: bool = true) -> void:
|
||||||
func _on_toot_toot() -> void:
|
|
||||||
if _whistle_player == null:
|
if _whistle_player == null:
|
||||||
return
|
return
|
||||||
|
|
||||||
print("stat_toottoot_number")
|
if update_stats:
|
||||||
StatsManager.add_int("stat_toottoot_number", 1)
|
StatsManager.add_int("stat_toottoot_number", 1)
|
||||||
StatsManager.store()
|
StatsManager.store()
|
||||||
|
|
||||||
_whistle_player.stop()
|
_whistle_player.stop()
|
||||||
_whistle_player.play()
|
_whistle_player.play()
|
||||||
|
|||||||
Reference in New Issue
Block a user