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 = 40 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)