#@tool extends Control @export var line_width : int = 4 @onready var player: CharacterBody3D = $"../../../.." @onready var level_control = get_tree().current_scene var selecting var options = [] const outer_radius : int = 500 const inner_radius : int = 100 const bkg_color : Color = Color(1, 1, 1, .5) const line_color : Color = Color(1,1,1) const select_color = Color(1, 1, 1, .5) const IMAGE_SIZE = Vector2(512,512) var selection func open(): Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) selecting = true show() update_weapon_list() func close(): selecting = false hide() return selection # Called when the node enters the scene tree for the first time. func _ready() -> void: update_weapon_list() SignalBus.weapon_list_changed.connect(update_weapon_list) func _input(event: InputEvent) -> void: if selecting: const MOUSE_DEADZONE = .01 if event is InputEventMouseMotion: if abs(event.relative.x) > MOUSE_DEADZONE or abs(event.relative.x) > MOUSE_DEADZONE: Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: if selecting: var mouse_pos = get_local_mouse_position() var mouse_radius = mouse_pos.length() if mouse_radius < inner_radius: selection = null else: var mouse_rads = fposmod(mouse_pos.angle() * -1, TAU) selection = ceil((mouse_rads / TAU) * (len(options))) var joy_input = joypad_select() if abs(joy_input) > Vector2.ZERO: var joy_rads = fposmod(joypad_select().angle() * -1, TAU) selection = ceil((joy_rads / TAU) * (len(options))) queue_redraw() func _draw(): var offset = IMAGE_SIZE/ -2 if selection == null: draw_circle(Vector2.ZERO,inner_radius,select_color) draw_circle(Vector2.ZERO, outer_radius, bkg_color) draw_arc(Vector2.ZERO,inner_radius,0, TAU, 128,line_color,line_width,true) if len(options) >= 1: # draw separator lines for i in range(len(options)): var rads = TAU * i / (len(options)) var point = Vector2.from_angle(rads) draw_line( point * inner_radius, point * outer_radius, line_color, line_width, true ) for i in range(0,len(options)): var start_rads = (TAU * (i-1)) / (len(options)) var end_rads = (TAU * i) / (len(options)) var mid_rads = (start_rads + end_rads)/2.0 * -1 var radius_mid = (inner_radius + outer_radius) / 2 var draw_pos = radius_mid * Vector2.from_angle(mid_rads) + offset var object = options[i].instantiate() var texture = object.weapon_info.gun_icon if selection == i: var points_per_arc = 32 var points_inner = PackedVector2Array() var points_outer = PackedVector2Array() for j in range(points_per_arc + 1): var angle = start_rads + j * (end_rads - start_rads) / points_per_arc points_inner.append(inner_radius * Vector2.from_angle(TAU-angle)) points_outer.append(outer_radius * Vector2.from_angle(TAU-angle)) points_outer.reverse() draw_polygon( points_inner + points_outer, PackedColorArray([select_color]) ) draw_texture( texture, Vector2(draw_pos) ) func update_weapon_list(): options = GameGlobals.held_guns func joypad_select(): var joy_out = Vector2.ZERO # Joypad right stick look control var xAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_X) var yAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_Y) if abs(xAxis) > player.R_JOYSTICK_DEADZONE: joy_out.x = xAxis if abs(yAxis) > player.R_JOYSTICK_DEADZONE: joy_out.y = yAxis return joy_out