190 lines
6.5 KiB
GDScript
190 lines
6.5 KiB
GDScript
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
|
|
|
|
|
|
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)
|
|
|
|
money_count = GameGlobals.money
|
|
|
|
health_bar.max_value = level_control.gamemode.start_health
|
|
|
|
health_bar_start_pos = health_bar.position
|
|
|
|
crosshair_target = CROSSHAIR_SIZE
|
|
|
|
|
|
# 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 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
|