extends Control @export var radial_stamina : bool = false ## VIEWPORT var viewportWidth var viewportHeight var viewportCenter var stam_bar_visible : bool = false var interact_visible : bool = false var health_bar_start_pos var money_count : int = 0 var crosshair_target @onready var level_control = get_tree().current_scene @onready var player = level_control.player @onready var health_bar: ProgressBar = $WobbleItems/HealthBar @onready var ammo_counter: HBoxContainer = $WobbleItems/GunInfo/VBoxContainer/AmmoCounter @onready var gun_name: Label = $"WobbleItems/GunInfo/VBoxContainer/Gun Name" @onready var ammo_current: Label = $WobbleItems/GunInfo/VBoxContainer/AmmoCounter/AmmoCurrent @onready var ammo_reserve: Label = $WobbleItems/GunInfo/VBoxContainer/AmmoCounter/AmmoReserve @onready var gun_info: MarginContainer = $WobbleItems/GunInfo @onready var money: Label = $WobbleItems/Money @onready var crosshair_center: TextureRect = $StaticItems/CrosshairCenter @onready var pickup_item_indicator = preload("res://assets/pickup_item_indicator.tscn") @onready var wobble_items: Control = $WobbleItems @onready var timer_counter: Label = $WobbleItems/Timer_counter const STAM_BAR_MAX_OPACITY = 1.0 const CROSSHAIR_SIZE = Vector2(40,40) var pickup_notifs = [] var can_spawn = true #HUD WOBBLE var offset_dir = Vector2.ZERO # Called when the node enters the scene tree for the first time. func _ready() -> void: # Get Viewport size viewportWidth = get_viewport().size.x viewportHeight = get_viewport().size.y viewportCenter = Vector2(viewportWidth/2,viewportHeight/2) SignalBus.player_hit.connect(player_hit) SignalBus.ui_timer_update.connect(update_timer) money_count = GameGlobals.money health_bar.max_value = level_control.gamemode.start_health health_bar_start_pos = health_bar.position crosshair_target = CROSSHAIR_SIZE timer_counter.visible = false # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: player = level_control.player if player != null: #HEALTH health_bar.value = GameGlobals.health if GameGlobals.health <= 2: change_color(health_bar,ColorSwatch.RED_COLOR,10,delta) health_bar.position = health_bar_start_pos + shake_element(15) elif GameGlobals.health < ((level_control.gamemode.start_health / 2) + 1): change_color(health_bar,ColorSwatch.ORANGE_COLOR,10,delta) else: change_color(health_bar,ColorSwatch.FULL_WHITE,10,delta) #MONEY if money_count < int(GameGlobals.money): money_count += 1 change_color(money,ColorSwatch.GREEN_COLOR,10,delta) elif money_count > int(GameGlobals.money): change_color(money,ColorSwatch.RED_COLOR,10,delta) money_count -= 1 else: change_color(money,ColorSwatch.FULL_WHITE,10,delta) money.text = "$" + str(money_count) if player.gun != null and player.gun.weapon_info.weapon_type == 0: if GameGlobals.gun_ammo.has(player.gun.weapon_info.gun_name) and GameGlobals.gun_ammo[player.gun.weapon_info.gun_name] != null: ammo_counter.visible = true ammo_current.text = str(GameGlobals.gun_ammo[player.gun.weapon_info.gun_name]).pad_zeros(2) lerp_color(ammo_current,ColorSwatch.RED_COLOR,ColorSwatch.FULL_WHITE,GameGlobals.gun_ammo[player.gun.weapon_info.gun_name],player.gun.weapon_info.max_ammo,.5) else: ammo_counter.visible = false if GameGlobals.ammo_reserve.has(str(player.gun.weapon_info.bullet.ammo_type)): ammo_reserve.text = str(GameGlobals.ammo_reserve[str(player.gun.weapon_info.bullet.ammo_type)]).pad_zeros(3) lerp_color(ammo_reserve,ColorSwatch.RED_COLOR,ColorSwatch.FULL_WHITE,GameGlobals.ammo_reserve[str(player.gun.weapon_info.bullet.ammo_type)],player.gun.weapon_info.max_ammo*2,.5) else: ammo_reserve.text = "-" else: fade_in_out(ammo_current,1,false,10,delta) fade_in_out(ammo_reserve,1,false,10,delta) if player.gun != null: gun_name.text = player.gun.weapon_info.gun_name gun_name.visible = true else: gun_name.visible = false if player.interact_ray.is_colliding(): if player.interact_ray.get_collider() != null: if player.interact_ray.get_collider().is_in_group("interact"): interact_visible = true else: interact_visible = false else: interact_visible = false ## SPAWN NOTIFICATIONS spawn_notifs() wobble_items.position = hud_wobble(delta/Engine.time_scale) func update_timer(label,timer): if timer_counter.visible == false: timer_counter.visible = true timer_counter.text = str(label,"\n", timer) func shake_element(amount): var rand_x = randf_range(-amount,amount) var rand_y = randf_range(-amount,amount) return Vector2(rand_x,rand_y) func lerp_color(element,colorA,colorB,cur_value,max_value,active_percent): var value : float = float(cur_value)/float(max_value) if value <= active_percent: element.modulate = lerp(colorA,colorB,value) else: element.modulate = colorB func change_color(element,color,speed,delta): element.modulate = lerp(element.modulate, Color(color.r,color.g,color.b,element.modulate.a), (delta * speed)/Engine.time_scale) func fade_in_out(element,MAX_OPACITY,visible,speed,delta): var element_color = element.modulate if visible: element.modulate = lerp(element_color, Color(element_color.r,element_color.g,element_color.b,MAX_OPACITY),(delta * speed)/Engine.time_scale) else: element.modulate = lerp(element_color, Color(element_color.r,element_color.g,element_color.b,0),(delta * speed)/Engine.time_scale) func pick_up_notif(type,ammo_type,value): var pickup_notif = pickup_item_indicator.instantiate() pickup_notif.pickup_type = type pickup_notif.ammo_type = ammo_type pickup_notif.value = value pickup_notif.position = money.position + Vector2(150,-50) pickup_notif.scale = Vector2(1,1) pickup_notifs.append(pickup_notif) func spawn_notifs(): if pickup_notifs.size() > 0 and can_spawn: can_spawn = false var msg = pickup_notifs.pop_front() add_child(msg) await get_tree().create_timer(.2).timeout can_spawn = true func player_hit(): pass func hud_wobble(delta): var viewport_height_adj = (get_viewport().size.y/1080) var HUD_WOBBLE_MAX : float = 40 * viewport_height_adj var MOUSE_AMT = 1 * viewport_height_adj var VELOCITY_AMT = 100 * viewport_height_adj var HUD_MOVE_SPEED = 1 * viewport_height_adj var HUD_RETURN_SPEED = 10 * viewport_height_adj var dir_mouse = Vector2(-player.mouse_input.x * MOUSE_AMT,-player.mouse_input.y * MOUSE_AMT) var velocity_dir_transformed = player.velocity.normalized() * player.global_basis var velocity_lengh_clamped = clamp(player.velocity.length(),-VELOCITY_AMT,VELOCITY_AMT) var dir_velocity = Vector2(-velocity_dir_transformed.x * velocity_lengh_clamped,velocity_dir_transformed.y * velocity_lengh_clamped) #add movement offset_dir += dir_mouse + dir_velocity #return to zero over time offset_dir = lerp(offset_dir,Vector2.ZERO,delta * HUD_RETURN_SPEED) #apply offset return offset_dir