67 lines
2.3 KiB
GDScript
67 lines
2.3 KiB
GDScript
extends Control
|
|
|
|
@export var hud : Node
|
|
@export var redraw_time : float = 1.0
|
|
@export var show_vertical_difference : bool = true
|
|
|
|
## SETTINGS
|
|
const MINIMAP_POINT_RADIUS :float = 10.0
|
|
const MINIMAP_DISPLAY_RADIUS : float = 200.0
|
|
const MINIMAP_MAX_OPACITY : float = .75
|
|
const ERASE_BUFFER_TIME = -10.0
|
|
const MAX_PRIORITY_SIZE = 4
|
|
const MAX_VERTICAL_TICK_LENGTH = 20
|
|
|
|
var redraw_timer = redraw_time
|
|
var draw_delta_time
|
|
|
|
func _process(delta: float) -> void:
|
|
position = hud.viewportCenter
|
|
draw_delta_time = delta #this workaround sucks, fix it later
|
|
queue_redraw()
|
|
|
|
func _draw() -> void:
|
|
update_minimap()
|
|
|
|
func update_minimap():
|
|
var minimap_points = hud.minimap_points
|
|
var player = hud.player
|
|
|
|
for key in minimap_points:
|
|
var point = minimap_points[key]
|
|
if point["timer"] > 0:
|
|
point["timer"] -= draw_delta_time
|
|
var player_pos_h = Vector2(player.global_position.x,player.global_position.z)
|
|
var point_pos_h = Vector2(point["position"].x,point["position"].z)
|
|
var h_direction = player.global_transform.looking_at(point["position"],Vector3.UP).basis.get_euler().y
|
|
var v_direction = player.global_position.y - point["position"].y
|
|
|
|
|
|
var alpha_fade = clamp(MINIMAP_MAX_OPACITY * clamp(point["timer"],0,1),0,MINIMAP_MAX_OPACITY)
|
|
var color_modified = Color(point["color"].r,point["color"].g,point["color"].b,alpha_fade)
|
|
|
|
var offset = player.global_rotation.y - (TAU * .25)
|
|
|
|
var x = MINIMAP_DISPLAY_RADIUS * cos(-h_direction + offset)
|
|
var y = MINIMAP_DISPLAY_RADIUS * sin(-h_direction + offset)
|
|
var point_pos = Vector2(x,y)
|
|
|
|
var priority_clamped = clamp(point["priority"],1,MAX_PRIORITY_SIZE)
|
|
var v_indicator_clamped = Vector2(0,clamp(v_direction * 5,-MAX_VERTICAL_TICK_LENGTH * priority_clamped,MAX_VERTICAL_TICK_LENGTH * priority_clamped))
|
|
var line_offset_dir
|
|
if v_indicator_clamped.y > 0:
|
|
line_offset_dir = 1
|
|
else:
|
|
line_offset_dir = -1
|
|
|
|
draw_circle(point_pos,MINIMAP_POINT_RADIUS * priority_clamped,color_modified,true)
|
|
var line_offset = Vector2(0,line_offset_dir * MINIMAP_POINT_RADIUS * priority_clamped)
|
|
if show_vertical_difference:
|
|
draw_line(point_pos + line_offset,point_pos + v_indicator_clamped,color_modified,4)
|
|
|
|
else:
|
|
if point["timer"] > ERASE_BUFFER_TIME:
|
|
point["timer"] -= draw_delta_time
|
|
else:
|
|
minimap_points.erase(key)
|