extends Node2D ## Two elevated cloud decks, with weather-driven coverage, color and moving shadows. const TEXTURE := preload("res://assets/planets/cloud_mist.png") var seed_value := 0 var _banks: Array[Dictionary] = [] var _time := 0.0 var clouds: Node2D var shadows: Node2D var coverage := 0.8 var darkness := 0.0 var weather_wind := Vector2(18,6) var _coverage := 0.8 var _darkness := 0.0 func _ready() -> void: texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS shadows = Node2D.new() shadows.name = "CloudShadows" shadows.z_index = 5 add_child(shadows) clouds = Node2D.new() clouds.name = "AboveLander" clouds.z_index = 70 add_child(clouds) var rng := RandomNumberGenerator.new() rng.seed = seed_value ^ 0x434c4f55 var mist_material := ShaderMaterial.new() mist_material.shader = preload("res://resources/effects/cloud_mist.gdshader") for layer in range(2): var radius := 3 if layer == 0 else 2 for y in range(-radius,radius+1): for x in range(-radius,radius+1): var mist := Sprite2D.new() mist.texture = TEXTURE mist.material = mist_material mist.scale = Vector2.ONE*rng.randf_range(1250,1750)/TEXTURE.get_width() * (1.25 if layer == 1 else 1.0) mist.rotation = rng.randf_range(-PI,PI) clouds.add_child(mist) var shadow := Sprite2D.new() shadow.texture = TEXTURE shadow.material = mist_material shadow.scale = mist.scale shadow.rotation = mist.rotation shadows.add_child(shadow) _banks.append({"mist":mist,"shadow":shadow,"origin":Vector2(x*750,y*750)+Vector2(rng.randf_range(-200,200),rng.randf_range(-200,200)),"parallax":1.22 if layer == 0 else 1.38,"speed":rng.randf_range(0.25,0.55),"layer":layer,"alpha":rng.randf_range(0.21,0.30)}) _process(0) func set_weather(cloud_cover: float, dark: float, wind: Vector2) -> void: coverage = clampf(cloud_cover,0.0,1.8) darkness = clampf(dark,0.0,1.0) weather_wind = wind func _process(delta: float) -> void: _time += delta _coverage = move_toward(_coverage,coverage,delta*0.22) _darkness = move_toward(_darkness,darkness,delta*0.12) var camera := get_viewport().get_camera_2d() var center := camera.get_screen_center_position() if camera != null else Vector2.ZERO for bank in _banks: bank.origin += weather_wind*float(bank.speed)*delta var location := Vector2(wrapf(bank.origin.x,-2800,2800),wrapf(bank.origin.y,-2800,2800))+center*(1.0-float(bank.parallax)) bank.mist.position = location bank.shadow.position = location+Vector2(45,60) var color := Color("d6e0e8").lerp(Color("060b14"),_darkness*0.98) var amount := _coverage if int(bank.layer) == 0 else _coverage*smoothstep(0.20,0.85,_darkness)*0.55 color.a = float(bank.alpha)*amount bank.mist.modulate = color bank.shadow.modulate = Color(0.02,0.035,0.06,amount*(0.025+_darkness*0.055))