Reduce fog and suppress weather indoors
This commit is contained in:
parent
6029eb29b8
commit
134ece4a10
6 changed files with 105 additions and 10 deletions
|
|
@ -28,6 +28,10 @@ const WEATHER_SEGMENT_COUNT: int = (
|
|||
)
|
||||
const LEGACY_WEATHER_SEGMENT_HOURS: float = 2.0
|
||||
const LEGACY_WEATHER_SEGMENT_COUNT: int = 12
|
||||
const SUNNY_WEATHER_WEIGHT: float = 0.48
|
||||
const CLOUDY_WEATHER_WEIGHT: float = 0.29
|
||||
const RAINY_WEATHER_WEIGHT: float = 0.19
|
||||
const FOGGY_WEATHER_WEIGHT: float = 0.04
|
||||
const MAX_JOB_REWARD_COINS: int = 100000
|
||||
const MAX_JOB_REWARD_EXPERIENCE: int = 10000
|
||||
|
||||
|
|
@ -159,13 +163,21 @@ static func generate_weather_schedule(
|
|||
rng.seed = plan_id.hash() ^ 0x57454154
|
||||
var weather_values: Array[int] = []
|
||||
for index: int in WEATHER_SEGMENT_COUNT:
|
||||
var roll: float = rng.randf()
|
||||
var total_weight: float = (
|
||||
SUNNY_WEATHER_WEIGHT
|
||||
+ CLOUDY_WEATHER_WEIGHT
|
||||
+ RAINY_WEATHER_WEIGHT
|
||||
+ FOGGY_WEATHER_WEIGHT
|
||||
)
|
||||
var roll: float = rng.randf() * total_weight
|
||||
var weather: int = int(WorldWeatherService.Weather.SUNNY)
|
||||
if roll >= 0.42 and roll < 0.70:
|
||||
var cloudy_end: float = SUNNY_WEATHER_WEIGHT + CLOUDY_WEATHER_WEIGHT
|
||||
var rainy_end: float = cloudy_end + RAINY_WEATHER_WEIGHT
|
||||
if roll >= SUNNY_WEATHER_WEIGHT and roll < cloudy_end:
|
||||
weather = int(WorldWeatherService.Weather.CLOUDY)
|
||||
elif roll >= 0.70 and roll < 0.88:
|
||||
elif roll >= cloudy_end and roll < rainy_end:
|
||||
weather = int(WorldWeatherService.Weather.RAINY)
|
||||
elif roll >= 0.88:
|
||||
elif roll >= rainy_end:
|
||||
weather = int(WorldWeatherService.Weather.FOGGY)
|
||||
weather_values.append(weather)
|
||||
for requirement_index: int in required.size():
|
||||
|
|
|
|||
|
|
@ -39,6 +39,16 @@ func _run() -> void:
|
|||
|
||||
|
||||
func _validate_weather_scheduler() -> void:
|
||||
assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.SUNNY_WEATHER_WEIGHT)
|
||||
assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.CLOUDY_WEATHER_WEIGHT)
|
||||
assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.RAINY_WEATHER_WEIGHT)
|
||||
assert(is_equal_approx(
|
||||
JobCatalog.SUNNY_WEATHER_WEIGHT
|
||||
+ JobCatalog.CLOUDY_WEATHER_WEIGHT
|
||||
+ JobCatalog.RAINY_WEATHER_WEIGHT
|
||||
+ JobCatalog.FOGGY_WEATHER_WEIGHT,
|
||||
1.0,
|
||||
))
|
||||
var weather := WorldWeatherServiceType.new()
|
||||
root.add_child(weather)
|
||||
weather.begin_authoritative_session(20260802)
|
||||
|
|
@ -526,6 +536,18 @@ func _validate_weather_presentation() -> void:
|
|||
assert(rain.emitting)
|
||||
assert(rain.amount_ratio > 0.99)
|
||||
assert(rain.amount == WorldTimeVisualControllerType.RAIN_PARTICLE_AMOUNT)
|
||||
visuals.set_local_home_interior_active(true)
|
||||
assert(not rain.visible)
|
||||
assert(not rain.emitting)
|
||||
assert(is_zero_approx(rain.amount_ratio))
|
||||
assert(not runtime_environment.fog_enabled)
|
||||
assert(not storm_clouds.visible)
|
||||
assert(is_zero_approx(float(storm_clouds.call("get_storm_amount"))))
|
||||
visuals.set_local_home_interior_active(false)
|
||||
assert(rain.visible)
|
||||
assert(rain.emitting)
|
||||
assert(rain.amount_ratio > 0.99)
|
||||
assert(storm_clouds.visible)
|
||||
var rain_emitter_offset: Vector3 = (
|
||||
WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET
|
||||
)
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ var _weather_service: WorldWeatherService
|
|||
var _fade_tween: Tween
|
||||
var _is_active: bool = false
|
||||
var _audio_enabled: bool = false
|
||||
var _suppressed: bool = false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
|
|
@ -77,6 +78,18 @@ func set_active(active: bool) -> void:
|
|||
)
|
||||
|
||||
|
||||
func set_suppressed(suppressed: bool) -> void:
|
||||
if _suppressed == suppressed:
|
||||
return
|
||||
_suppressed = suppressed
|
||||
if suppressed:
|
||||
_silence_immediately()
|
||||
return
|
||||
_transition_to_rain(
|
||||
_weather_service != null and _weather_service.is_raining()
|
||||
)
|
||||
|
||||
|
||||
func _on_weather_changed(
|
||||
weather: WorldWeatherService.Weather,
|
||||
_seconds_remaining: float,
|
||||
|
|
@ -85,7 +98,7 @@ func _on_weather_changed(
|
|||
|
||||
|
||||
func _transition_to_rain(is_raining: bool) -> void:
|
||||
if not _is_active or not _audio_enabled:
|
||||
if not _is_active or not _audio_enabled or _suppressed:
|
||||
return
|
||||
_stop_fade()
|
||||
if is_raining:
|
||||
|
|
@ -120,7 +133,11 @@ func _fade_volume_to(target_volume_db: float, stop_after_fade: bool) -> void:
|
|||
|
||||
|
||||
func _finish_fade_out() -> void:
|
||||
if _weather_service != null and _weather_service.is_raining():
|
||||
if (
|
||||
not _suppressed
|
||||
and _weather_service != null
|
||||
and _weather_service.is_raining()
|
||||
):
|
||||
return
|
||||
stop()
|
||||
volume_db = SILENT_VOLUME_DB
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ var _distance_update_remaining: float = 0.0
|
|||
var _target_volume_db: float = -80.0
|
||||
var _is_active := false
|
||||
var _audio_enabled: bool = false
|
||||
var _suppressed: bool = false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
|
|
@ -58,8 +59,8 @@ func configure(listener: Node3D, shoreline_mesh: MeshInstance3D) -> void:
|
|||
|
||||
func set_active(active: bool) -> void:
|
||||
_is_active = active
|
||||
set_process(active and _audio_enabled)
|
||||
if active:
|
||||
set_process(active and _audio_enabled and not _suppressed)
|
||||
if active and not _suppressed:
|
||||
if not _audio_enabled:
|
||||
return
|
||||
_distance_update_remaining = 0.0
|
||||
|
|
@ -72,6 +73,22 @@ func set_active(active: bool) -> void:
|
|||
_waves_audio.volume_db = -80.0
|
||||
|
||||
|
||||
func set_suppressed(suppressed: bool) -> void:
|
||||
if _suppressed == suppressed:
|
||||
return
|
||||
_suppressed = suppressed
|
||||
set_process(_is_active and _audio_enabled and not suppressed)
|
||||
if suppressed:
|
||||
_waves_audio.stop()
|
||||
_waves_audio.volume_db = -80.0
|
||||
elif _is_active and _audio_enabled:
|
||||
_distance_update_remaining = 0.0
|
||||
_update_target_volume()
|
||||
_waves_audio.volume_db = _target_volume_db
|
||||
if _waves_audio.stream != null:
|
||||
_waves_audio.play()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if not _is_active:
|
||||
return
|
||||
|
|
|
|||
|
|
@ -115,6 +115,7 @@ var _weather_to: WorldWeatherService.Weather = (
|
|||
)
|
||||
var _weather_transition: float = 1.0
|
||||
var _light_performance_profile: bool = false
|
||||
var _local_home_interior_active: bool = false
|
||||
|
||||
|
||||
func setup(
|
||||
|
|
@ -185,6 +186,28 @@ func apply_weather_immediately(
|
|||
_apply_time(_time_service.get_time_hours())
|
||||
|
||||
|
||||
func set_local_home_interior_active(active: bool) -> void:
|
||||
if _local_home_interior_active == active:
|
||||
return
|
||||
_local_home_interior_active = active
|
||||
if _rain != null:
|
||||
_rain.visible = not active
|
||||
_rain.process_mode = (
|
||||
Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT
|
||||
)
|
||||
if _rain_collision != null:
|
||||
_rain_collision.visible = not active
|
||||
_rain_collision.process_mode = (
|
||||
Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT
|
||||
)
|
||||
if _storm_clouds != null:
|
||||
_storm_clouds.process_mode = (
|
||||
Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT
|
||||
)
|
||||
if _time_service != null:
|
||||
_apply_time(_time_service.get_time_hours())
|
||||
|
||||
|
||||
func _prepare_runtime_environment() -> bool:
|
||||
if (
|
||||
_time_service == null
|
||||
|
|
@ -700,6 +723,8 @@ func _weather_value(
|
|||
rainy: float,
|
||||
foggy: float,
|
||||
) -> float:
|
||||
if _local_home_interior_active:
|
||||
return sunny
|
||||
return lerpf(
|
||||
_weather_state_value(_weather_from, sunny, cloudy, rainy, foggy),
|
||||
_weather_state_value(_weather_to, sunny, cloudy, rainy, foggy),
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ const FOGGY_DURATION_RANGE := Vector2(
|
|||
const MAX_PERSISTED_SECONDS: float = WEATHER_PERIOD_SECONDS
|
||||
const DAILY_PLAN_SEGMENT_HOURS: float = 1.0
|
||||
const DAILY_PLAN_SEGMENT_COUNT: int = 24
|
||||
const CLOUDY_TO_SUNNY_THRESHOLD: float = 0.50
|
||||
const CLOUDY_TO_RAINY_THRESHOLD: float = 0.95
|
||||
|
||||
var _weather: Weather = DEFAULT_WEATHER
|
||||
var _seconds_remaining: float = SUNNY_DURATION_RANGE.x
|
||||
|
|
@ -328,9 +330,9 @@ func _choose_next_weather() -> Weather:
|
|||
return Weather.CLOUDY
|
||||
Weather.CLOUDY:
|
||||
var roll: float = _rng.randf()
|
||||
if roll < 0.45:
|
||||
if roll < CLOUDY_TO_SUNNY_THRESHOLD:
|
||||
return Weather.SUNNY
|
||||
if roll < 0.80:
|
||||
if roll < CLOUDY_TO_RAINY_THRESHOLD:
|
||||
return Weather.RAINY
|
||||
return Weather.FOGGY
|
||||
return Weather.SUNNY
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue