diff --git a/game/audio_manager.gd b/game/audio_manager.gd index abfee68f..31de5f01 100644 --- a/game/audio_manager.gd +++ b/game/audio_manager.gd @@ -7,12 +7,14 @@ func _ready(): func _on_building_finished_audio(building): - var system = Store.game_data.get_system(building.system) - if Store.game_data.does_belong_to_current_player(system): - $AudioStackingBuildingFinished.play_sound_positioned(system.coordinates * Utils.SCALE_SYSTEMS_COORDS) + play_system_sound(building.system) func _on_ship_queue_finished_audio(ship_queue): - var system = Store.game_data.get_system(ship_queue.system) + play_system_sound(ship_queue.system) + + +func play_system_sound(system_id): + var system = Store.game_data.get_system(system_id) if Store.game_data.does_belong_to_current_player(system): $AudioStackingShipQueueFinished.play_sound_positioned(system.coordinates * Utils.SCALE_SYSTEMS_COORDS) diff --git a/game/game.gd b/game/game.gd index ddef67f1..ebc15f64 100644 --- a/game/game.gd +++ b/game/game.gd @@ -99,18 +99,26 @@ func _process(delta): new_zoom.y = min(new_zoom.y, _target_zoom.y) if sign_vector.y > 0 else max(new_zoom.y, _target_zoom.y) camera2D.zoom = new_zoom +func get_directions(): + return { + "left": Vector2.LEFT, + "right": Vector2.RIGHT, + "up": Vector2.UP, + "down": Vector2.DOWN + } + + +func direct_camera(event, value): + var directions = get_directions() + for d in directions: + if event.is_action_released("ui_move_map_" + d): + _motion_camera[directions[d]] = value + func _input(event): # mouse event has priority on the GUI if event is InputEventKey or event is InputEventMouseButton: - if event.is_action_released("ui_move_map_left"): - _motion_camera[Vector2.LEFT] = false - if event.is_action_released("ui_move_map_right"): - _motion_camera[Vector2.RIGHT] = false - if event.is_action_released("ui_move_map_up"): - _motion_camera[Vector2.UP] = false - if event.is_action_released("ui_move_map_down"): - _motion_camera[Vector2.DOWN] = false + direct_camera(event, false) if event.is_action_released("ui_drag_map"): _is_map_being_dragged = false elif event is InputEventMouseMotion: @@ -122,14 +130,7 @@ func _input(event): func _unhandled_input(event): # key events has not priority over gui if event is InputEventKey or event is InputEventMouseButton: - if event.is_action_pressed("ui_move_map_left"): - _motion_camera[Vector2.LEFT] = true - if event.is_action_pressed("ui_move_map_right"): - _motion_camera[Vector2.RIGHT] = true - if event.is_action_pressed("ui_move_map_up"): - _motion_camera[Vector2.UP] = true - if event.is_action_pressed("ui_move_map_down"): - _motion_camera[Vector2.DOWN] = true + direct_camera(event, true) if event.is_action("ui_map_center_system"): center_on_selected_system() @@ -209,14 +210,17 @@ func _on_fleet_sailed(fleet): fleet_container.add_child(sailing_fleet) +func _get_camera_zoom(axis, factor, max_zoom_factor_fit): + return clamp(axis * factor, pow(_ZOOM_FACTOR, _MIN_ZOOM_FACTOR), \ + pow(_ZOOM_FACTOR, min(_MAX_ZOOM_FACTOR, max_zoom_factor_fit))) + + func _zoom_camera(factor): var max_screen_size = Vector2(camera2D.limit_right - camera2D.limit_left, camera2D.limit_bottom - camera2D.limit_top) var max_zoom_factor_fit = floor(min(log(max_screen_size.x / OS.window_size.x), \ log(max_screen_size.y / OS.window_size.y)) / log(_ZOOM_FACTOR)) - _target_zoom.x = clamp(camera2D.zoom.x * factor, pow(_ZOOM_FACTOR, _MIN_ZOOM_FACTOR), \ - pow(_ZOOM_FACTOR, min(_MAX_ZOOM_FACTOR, max_zoom_factor_fit))) - _target_zoom.y = clamp(camera2D.zoom.y * factor, pow(_ZOOM_FACTOR, _MIN_ZOOM_FACTOR), \ - pow(_ZOOM_FACTOR, min(_MAX_ZOOM_FACTOR, max_zoom_factor_fit))) + _target_zoom.x = _get_camera_zoom(camera2D.zoom.x, factor, max_zoom_factor_fit) + _target_zoom.y = _get_camera_zoom(camera2D.zoom.y, factor, max_zoom_factor_fit) func _move_camera(vector): diff --git a/game/map/system.gd b/game/map/system.gd index 2bca0b5b..39e816d6 100644 --- a/game/map/system.gd +++ b/game/map/system.gd @@ -230,7 +230,6 @@ func _modulate_color(alpha): func _on_mouse_input(event): if event is InputEventMouseButton and event.is_pressed(): if event.get_button_index() == BUTTON_LEFT: - _game_data.selected_state.select_system(system) # no need to add sound because it is alreay played in the element _game_data.selected_state.select_system(system) elif event.get_button_index() == BUTTON_RIGHT \ @@ -291,35 +290,28 @@ func get_color_of_system(): else _game_data.get_player_color(_game_data.get_player(system.player), is_victory_system) +func _get_events(): + return [ + "fleet_added", + "hangar_updated", + "building_updated", + "building_contructed", + "fleet_owner_updated", + ] + + func _connect_system(system_p = system): if system_p == null: return - if not system_p.is_connected("fleet_added", self, "_on_fleet_created"): - system_p.connect("fleet_added", self, "_on_fleet_created") - if not system_p.is_connected("hangar_updated", self, "_on_hangar_updated"): - system_p.connect("hangar_updated", self, "_on_hangar_updated") - if not system_p.is_connected("building_updated", self, "_on_building_updated"): - system_p.connect("building_updated", self, "_on_building_updated") - if not system_p.is_connected("building_contructed", self, "_on_building_contructed"): - system_p.connect("building_contructed", self, "_on_building_contructed") - if not system_p.is_connected("fleet_owner_updated", self, "_on_fleet_owner_updated"): - system_p.connect("fleet_owner_updated", self, "_on_fleet_owner_updated") - + for e in _get_events(): + Utils.unique_external_connect(system_p, e, self, "_on_" + e) func _disconnect_system(system_p = system): if system_p == null: return - if system_p.is_connected("fleet_added", self, "_on_fleet_created"): - system_p.disconnect("fleet_added", self, "_on_fleet_created") - if system_p.is_connected("hangar_updated", self, "_on_hangar_updated"): - system_p.disconnect("hangar_updated", self, "_on_hangar_updated") - if system_p.is_connected("building_updated", self, "_on_building_updated"): - system_p.disconnect("building_updated", self, "_on_building_updated") - if system_p.is_connected("building_contructed", self, "_on_building_contructed"): - system_p.disconnect("building_contructed", self, "_on_building_contructed") - if system_p.is_connected("fleet_owner_updated", self, "_on_fleet_owner_updated"): - system_p.disconnect("fleet_owner_updated", self, "_on_fleet_owner_updated") + for e in _get_events(): + system_p.disconnect(e, self, "_on_" + e) func _on_building_contructed(building): @@ -330,7 +322,7 @@ func _on_fleet_owner_updated(_fleet): refresh_fleet_pins() -func _on_fleet_created(_fleet : Fleet): +func _on_fleet_added(_fleet : Fleet): refresh_fleet_pins() diff --git a/global/loading_screen.gd b/global/loading_screen.gd index e2d9df2c..3f727d28 100644 --- a/global/loading_screen.gd +++ b/global/loading_screen.gd @@ -100,23 +100,22 @@ func _on_notification_added(notif): set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_building_status) quit_button.visible = true +func set_error_label(label): + set_state_label(STATE_NETWORK_ELEMENT.ERROR, label) + quit_button.visible = true func _on_timeout_auth(): if Network.token == null: - set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_network_status) - quit_button.visible = true - if not cached_data.dict_loaded[CachedResource.Resource_elements.FACTIONS]: - set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_faction_status) - quit_button.visible = true - if not cached_data.dict_loaded[CachedResource.Resource_elements.SHIP_MODELS]: - set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_ship_status) - quit_button.visible = true - if not cached_data.dict_loaded[CachedResource.Resource_elements.CONSTANTS]: - set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_constant_status) - quit_button.visible = true - if not cached_data.dict_loaded[CachedResource.Resource_elements.BUILDING]: - set_state_label(STATE_NETWORK_ELEMENT.ERROR, label_building_status) - quit_button.visible = true + set_error_label(label_network_status) + var resources = { + "FACTIONS": label_faction_status, + "SHIP_MODELS": label_ship_status, + "CONSTANTS": label_constant_status, + "BUILDING": label_building_status + } + for r in resources: + if not cached_data.dict_loaded[r]: + set_error_label(resources[r]) func _on_resource_loaded(res_name): diff --git a/global/utils.gd b/global/utils.gd index a8e51205..c4057028 100644 --- a/global/utils.gd +++ b/global/utils.gd @@ -119,3 +119,13 @@ static func int_max(a: int, b: int) -> int: return a else: return b + + +static func unique_connect(event, node, callback): + unique_external_connect(node, event, node, callback) + + +static func unique_external_connect(node, event, callback_node, callback): + if not node.is_connected(event, callback_node, callback): + node.connect(event, callback_node, callback) + diff --git a/gui/button_panel_container.gd b/gui/button_panel_container.gd index 94205d52..521a73ef 100644 --- a/gui/button_panel_container.gd +++ b/gui/button_panel_container.gd @@ -20,10 +20,8 @@ var _is_pressed = false func _ready(): - if not is_connected("mouse_entered", self, "_on_mouse_entered"): - connect("mouse_entered", self, "_on_mouse_entered") - if not is_connected("mouse_exited", self, "_on_mouse_exited"): - connect("mouse_exited", self, "_on_mouse_exited") + Utils.unique_connect("mouse_entered", self, "_on_mouse_entered") + Utils.unique_connect("mouse_exited", self, "_on_mouse_exited") update_style() diff --git a/gui/circular_button.gd b/gui/circular_button.gd index 43f88fdd..27b46b03 100644 --- a/gui/circular_button.gd +++ b/gui/circular_button.gd @@ -24,30 +24,23 @@ export(Vector2) var texture_size setget set_texture_size func _ready(): # we ned to do this verifiaction because of the this is a tool and the editor can call _ready multiple time - if base_style != null and not base_style.is_connected("changed", self, "_on_changed"): - base_style.connect("changed", self, "_on_changed") - if selected_style != null and not selected_style.is_connected("changed", self, "_on_changed"): - selected_style.connect("changed", self, "_on_changed") - if hover_style != null and not hover_style.is_connected("changed", self, "_on_changed"): - hover_style.connect("changed", self, "_on_changed") - if focus_style != null and not focus_style.is_connected("changed", self, "_on_changed"): - focus_style.connect("changed", self, "_on_changed") - if texture != null and not texture.is_connected("changed", self, "_on_changed"): - texture.connect("changed", self, "_on_changed") + for s in [base_style, selected_style, hover_style, focus_style, texture]: + if s != null: + Utils.unique_external_connect(s, "changed", self, "_on_changed") func _draw(): if rect_size.x == 0.0 or rect_size.y == 0.0: return # style setup - var colors_bg - var color_border + var bg_color + var border_color var border_width var corner_detail = 8 var shadow_color = Color(0.0, 0.0, 0.0, 0.0) var shadow_size = 0 var shadow_offseet = Vector2(0,0) - var anti_alaising = true + var anti_aliasing = true var draw_center = true var style_active if selected: @@ -60,38 +53,37 @@ func _draw(): var theme_style = get_stylebox("base_style", "CircularButton") style_active = base_style if base_style != null else theme_style if style_active == null or not style_active is StyleBoxFlat: - colors_bg = Color(0.5,0.5,0.5) if (_hover or selected) else Color(0.7,0.7,0.7) - color_border = Color(0.0, 0.0, 0.0) + bg_color = Color(0.5,0.5,0.5) if (_hover or selected) else Color(0.7,0.7,0.7) + border_color = Color(0.0, 0.0, 0.0) border_width = [1,1,1,1] else: - colors_bg = style_active.bg_color - color_border = style_active.border_color + bg_color = style_active.bg_color + border_color = style_active.border_color border_width = [style_active.border_width_left, style_active.border_width_top, style_active.border_width_right, style_active.border_width_bottom] corner_detail = style_active.corner_detail shadow_color = style_active.shadow_color shadow_size = style_active.shadow_size shadow_offseet = style_active.shadow_offset - anti_alaising = style_active.anti_aliasing + anti_aliasing = style_active.anti_aliasing draw_center = style_active.draw_center # draw var center = rect_size / 2.0 var points = _get_array_points() # draw shadow (todo improve) if shadow_size > 0: - var point_shadow = _get_shadow_poly(points, shadow_size, shadow_offseet, center) - draw_polygon(point_shadow, PoolColorArray([ shadow_color ]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(shadow_color, anti_aliasing, _get_shadow_poly(points, shadow_size, shadow_offseet, center)) # darw inner if draw_center: - draw_polygon(points, PoolColorArray([ colors_bg ]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(bg_color, anti_aliasing, points) # draw border if border_width[0] > 0: - draw_polygon(_get_left_border(border_width[0], corner_detail, does_border_scale), PoolColorArray([color_border]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(border_color, anti_aliasing, _get_border(true, border_width[0], corner_detail, does_border_scale)) if border_width[2] > 0: - draw_polygon(_get_right_border(border_width[2], corner_detail, does_border_scale), PoolColorArray([color_border]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(border_color, anti_aliasing, _get_border(false, border_width[2], corner_detail, does_border_scale)) if border_width[1] > 0: - draw_polygon(_get_outer_arc_border(border_width[1]), PoolColorArray([color_border]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(border_color, anti_aliasing, _get_arc("outer", true, border_width[1])) if border_width[3] > 0: - draw_polygon(_get_inner_arc_border(border_width[3]), PoolColorArray([color_border]), PoolVector2Array(), null, null, anti_alaising) + _draw_polygon(border_color, anti_aliasing, _get_arc("inner", true, border_width[3])) # draw texture if texture != null: _draw_texture() @@ -106,20 +98,24 @@ func _draw_focus(): return var points = _get_array_points() if style.draw_center: - draw_polygon(points, PoolColorArray([ style.bg_color ]), PoolVector2Array(), null, null, style.anti_aliasing) + _draw_polygon(style.bg_color, style.anti_aliasing, points) # draw border if style.border_width_left > 0: - draw_polygon(_get_left_border(style.border_width_left, style.corner_detail, does_border_scale), PoolColorArray([style.border_color]), PoolVector2Array(), null, null, style.anti_aliasing) + _draw_polygon(style.border_color, style.anti_aliasing, _get_border(true, style.border_width_left, style.corner_detail, does_border_scale)) if style.border_width_right > 0: - draw_polygon(_get_right_border(style.border_width_right, style.corner_detail, does_border_scale), PoolColorArray([style.border_color]), PoolVector2Array(), null, null, style.anti_aliasing) + _draw_polygon(style.border_color, style.anti_aliasing, _get_border(false, style.border_width_right, style.corner_detail, does_border_scale)) if style.border_width_top > 0: - draw_polygon(_get_outer_arc_border(style.border_width_top),PoolColorArray([style.border_color]), PoolVector2Array(), null, null, style.anti_aliasing) + _draw_polygon(style.border_color, style.anti_aliasing, _get_arc("outer", true, style.border_width_top)) if style.border_width_bottom > 0: - draw_polygon(_get_inner_arc_border(style.border_width_bottom),PoolColorArray([style.border_color]), PoolVector2Array(), null, null, style.anti_aliasing) + _draw_polygon(style.border_color, style.anti_aliasing, _get_arc("inner", true, style.border_width_bottom)) + + +func _draw_polygon(color, anti_aliasing, points): + draw_polygon(points, PoolColorArray([color]), PoolVector2Array(), null, null, anti_aliasing) func _is_inside(position): - var rel_to_center = position - get_rect().size / 2.0 + var rel_to_center = position - _get_center() if rect_size.x == 0.0 or rect_size.y == 0.0: return false # this is the vector corrected with the aspect ration of the box size @@ -127,10 +123,11 @@ func _is_inside(position): var vector_to_compute_angle = rel_to_center * (get_rect().size).tangent().abs().normalized() # we need to take -angle because when we convert deg to rad we chnage the orientation # degrees grows in the anti trigo orientation (clockwise) - var angle = fposmod(-vector_to_compute_angle.angle_to(Vector2.RIGHT), 2.0 * PI) - var angle_1 = fposmod(deg2rad(min(angle_start, angle_end)), 2.0 * PI) - var angle_2 = fposmod(deg2rad(max(angle_start, angle_end)), 2.0 * PI) - var radius = rel_to_center.length() / (get_rect().size * get_vector_radial(angle) / 2.0).length() + var full_angle = 2.0 * PI + var angle = fposmod(-vector_to_compute_angle.angle_to(Vector2.RIGHT), full_angle) + var angle_1 = fposmod(deg2rad(min(angle_start, angle_end)), full_angle) + var angle_2 = fposmod(deg2rad(max(angle_start, angle_end)), full_angle) + var radius = rel_to_center.length() / (_get_center() * get_vector_radial(angle)).length() # as we take the mod of the angle angle_1 can be greater angle_2 # in that case we need to check that angle is not between [angle_2, angle_1] return radius <= radius_out and radius >= radius_in and ((angle_1 <= angle_2 and angle >= angle_1 and angle <= angle_2) or (angle_1 > angle_2 and not (angle >= angle_2 and angle <= angle_1) ) ) @@ -229,14 +226,14 @@ func set_does_border_scale(new_bool): func _draw_texture(): - var center = rect_size / 2.0 + var center = _get_center() var middle_angle = deg2rad(angle_start + angle_end) / 2.0 - var position = get_vector_radial(middle_angle, (radius_out + radius_in) / 2.0 * rect_size / 2.0) + var position = get_vector_radial(middle_angle, (radius_out + radius_in) / 2.0 * center) var rect_rexture = Rect2(center - texture_size / 2.0 + position,texture_size) draw_texture_rect(texture,rect_rexture,false) -func _get_shadow_poly(points, shadow_size, shadow_offseet, center = rect_size / 2.0): +func _get_shadow_poly(points, shadow_size, shadow_offseet, center = _get_center()): var point_shadow = PoolVector2Array() for i in range(points.size()): var point = (points[i] - center) * (Vector2(1.0, 1.0) + radius_out * shadow_size * Vector2(1.0 / rect_size.x, 1.0 /rect_size.y)/ 2.0) + shadow_offseet @@ -245,89 +242,44 @@ func _get_shadow_poly(points, shadow_size, shadow_offseet, center = rect_size / func _get_array_points(): - var points_arc = _get_outer_arc() - points_arc.append_array(_get_inner_arc()) - return points_arc - - -func _get_outer_arc(): - var center = rect_size / 2.0 - var points_arc = PoolVector2Array() - for i in range(_NUMBER_OF_POINT_ARC + 1): - var angle_point = deg2rad(angle_start + i * (angle_end - angle_start) / _NUMBER_OF_POINT_ARC) - points_arc.push_back(center + get_vector_radial(angle_point, radius_out * rect_size / 2.0)) - return points_arc - - -func _get_inner_arc(): - var center = rect_size / 2.0 - var points_arc = PoolVector2Array() - for i in range(_NUMBER_OF_POINT_ARC + 1): - var angle_point = deg2rad(angle_start + (_NUMBER_OF_POINT_ARC - i) * (angle_end - angle_start) / _NUMBER_OF_POINT_ARC) - points_arc.push_back(center + get_vector_radial(angle_point, radius_in * rect_size / 2.0)) + var points_arc = _get_arc("outer") + points_arc.append_array(_get_arc("inner")) return points_arc -func _get_outer_arc_border(width = 1.0, details = _NUMBER_OF_POINT_ARC): - var center = rect_size / 2.0 - var points_arc = _get_outer_arc() - for i in range(details + 1): - var angle_point = deg2rad(angle_start + (details-i) * (angle_end - angle_start) / details) - points_arc.push_back(center + get_vector_radial(angle_point, radius_out * rect_size / 2.0 - Vector2(1.0, 1.0) * width)) - return points_arc +func _get_center(): + return rect_size / 2.0 -func _get_inner_arc_border(width = 1.0, details = _NUMBER_OF_POINT_ARC): - var center = rect_size / 2.0 - var points_arc = _get_inner_arc() +func _get_arc(is_outer, is_border = false, width = 1.0, details = _NUMBER_OF_POINT_ARC): + var center = _get_center() + var points_arc = _get_arc(is_outer, false, 0) if is_border else PoolVector2Array() + var radius = radius_out if is_outer else radius_in for i in range(details + 1): - var angle_point = deg2rad(angle_start + (i) * (angle_end - angle_start) / details) - points_arc.push_back(center + get_vector_radial(angle_point, radius_in * rect_size / 2.0 + Vector2(1.0, 1.0) * width)) + var coeff = i if (not is_border and is_outer) or (is_border and not is_outer) else (details - i) + var angle_point = deg2rad(angle_start + coeff * (angle_end - angle_start) / details) + points_arc.push_back(center + get_vector_radial(angle_point, radius * center - Vector2(1.0, 1.0) * width)) return points_arc -func _get_left_border(width = 1.0, details = 8, border_scale = false): - var center = rect_size / 2.0 - var sign_inner = sign (- angle_start + angle_end) # direction of angle inside the shape +func _get_border(is_left, width = 1.0, details = 8, border_scale = false): + var center = _get_center() + var angle = angle_start if is_left else angle_end + var sign_coeff = -1 if is_left else 1 + # direction of angle inside the shape + var sign_inner = sign (sign_coeff * angle_start - sign_coeff * angle_end) var points_arc = PoolVector2Array() var angle_diff_outer = float(width) * 2.0 / (rect_size.x * radius_out) # this is the angle to generante a border of size width on the outer edge - for i in range(details+1): # arc outter - var unit_vect_angle = get_vector_radial(deg2rad(angle_start) + sign_inner * i * angle_diff_outer / details) - points_arc.push_back(center + unit_vect_angle * radius_out * rect_size / 2.0) - var angle_diff_inner - if not border_scale: - if radius_in != 0.0: - angle_diff_inner = float(width) * 2.0 / (rect_size.x * radius_in) - else: - angle_diff_inner = 0.0 - else: - angle_diff_inner = angle_diff_outer # if we scale the border then the angle_diff should be the same - # we choose to take the outer one, meaning the border will nerver be greater than width - for i in range(details+1): # arc inner - var unit_vect_angle = get_vector_radial(deg2rad(angle_start) + sign_inner * (details-i) * angle_diff_inner / details) - points_arc.push_back(center + unit_vect_angle * radius_in * rect_size / 2.0) - return points_arc - - -func _get_right_border(width = 1.0, details = 8, border_scale = false): - var center = rect_size / 2.0 - var sign_inner = sign (angle_start - angle_end) - var points_arc = PoolVector2Array() - var angle_diff_outer = float(width) * 2.0 / (rect_size.x * radius_out) # see _get_left_border - for i in range(details+1): # arc outter - var unit_vect_angle = get_vector_radial(deg2rad(angle_end) + sign_inner * i * angle_diff_outer / details) - points_arc.push_back(center + unit_vect_angle * radius_out * rect_size / 2.0) - var angle_diff_inner - if not border_scale: - if radius_in != 0.0: - angle_diff_inner = float(width) * 2.0 / (rect_size.x * radius_in) - else: - angle_diff_inner = 0.0 - else: - angle_diff_inner = angle_diff_outer # see _get_left_border + for i in range(details + 1): # arc outter + var unit_vect_angle = get_vector_radial(deg2rad(angle) + sign_inner * i * angle_diff_outer / details) + points_arc.push_back(center + unit_vect_angle * radius_out * center) + # if we scale the border then the angle_diff should be the same + # we choose to take the outer one, meaning the border will nerver be greater than width + var angle_diff_inner = angle_diff_outer if border_scale else 0.0 if radius_in == 0.0 else float(width) * 2.0 / (rect_size.x * radius_in) + for i in range(details + 1): # arc inner - var unit_vect_angle = get_vector_radial(deg2rad(angle_end) + sign_inner * (details-i) * angle_diff_inner / details) - points_arc.push_back(center + unit_vect_angle * radius_in * rect_size/2.0) + var unit_vect_angle = get_vector_radial(deg2rad(angle) + sign_inner * (details-i) * angle_diff_inner / details) + points_arc.push_back(center + unit_vect_angle * radius_in * center) return points_arc diff --git a/gui/custom_shape_button.gd b/gui/custom_shape_button.gd index e4b6f680..7e4895a4 100644 --- a/gui/custom_shape_button.gd +++ b/gui/custom_shape_button.gd @@ -9,10 +9,8 @@ var _hover = false func _ready(): - if not is_connected("mouse_exited", self, "_mouse_exited_area"): - connect("mouse_exited", self, "_mouse_exited_area") - if not is_connected("mouse_entered", self, "_mouse_entered_area"): - connect("mouse_entered", self, "_mouse_entered_area") + for e in ["mouse_exited", "mouse_entered"]: + Utils.unique_connect(e, self, "_" + e + "_area") func _gui_input(event): diff --git a/gui/menu/menu_header.gd b/gui/menu/menu_header.gd index 8ecfd161..6ca6f65b 100644 --- a/gui/menu/menu_header.gd +++ b/gui/menu/menu_header.gd @@ -77,11 +77,7 @@ func set_custom_style(new_style): func _update_theme(): - if custom_style != null: - set("custom_styles/panel", custom_style) - else: - var style = get_stylebox("panel", "MenuHeader") - set("custom_styles/panel", style) + set("custom_styles/panel", custom_style if custom_style != null else get_stylebox("panel", "MenuHeader")) func _unhandled_input(event): diff --git a/gui/selectable_panel_container.gd b/gui/selectable_panel_container.gd index 7c0085b2..20d5acab 100644 --- a/gui/selectable_panel_container.gd +++ b/gui/selectable_panel_container.gd @@ -15,10 +15,8 @@ var _hover = false func _ready(): - if not is_connected("mouse_entered", self, "_on_mouse_entered"): - connect("mouse_entered", self, "_on_mouse_entered") - if not is_connected("mouse_exited", self, "_on_mouse_exited"): - connect("mouse_exited", self, "_on_mouse_exited") + for e in ["mouse_entered", "mouse_exited"]: + Utils.unique_connect(e, self, "_on_" + e) update_style() diff --git a/hud/menu_layer.gd b/hud/menu_layer.gd index 19c779df..0ec62efc 100644 --- a/hud/menu_layer.gd +++ b/hud/menu_layer.gd @@ -88,9 +88,7 @@ func toogle_menu(menu_toogled): func get_menu(menu): - if menus.has(menu): - return menus[menu] - return null + return menus[menu] if menus.has(menu) else null func _remove_menu(node): diff --git a/hud/system/buildings/hangar.gd b/hud/system/buildings/hangar.gd index e5d23acc..14d5479a 100644 --- a/hud/system/buildings/hangar.gd +++ b/hud/system/buildings/hangar.gd @@ -104,13 +104,12 @@ func _on_ship_construction_started(ship_queue : ShipQueue): func select_group(category): - if hangar_element.has_node(category.category): - for node in hangar_element.get_children(): - if node.name != category.category: - node.is_selected = false - else: - node.is_selected = true - ship_order_element.ship_category = category + if not hangar_element.has_node(category.category): + return + for node in hangar_element.get_children(): + node.is_selected = node.name == category.category + if node.is_selected: + ship_order_element.ship_category = category func set_ship_queue_array(new_array): diff --git a/hud/system/fleet/fleet_item.gd b/hud/system/fleet/fleet_item.gd index 44bf5acb..1411a2ef 100644 --- a/hud/system/fleet/fleet_item.gd +++ b/hud/system/fleet/fleet_item.gd @@ -33,19 +33,13 @@ func update_owner(): _update_composition_button_visibility() update_quantity() if _game_data.does_belong_to_current_player(fleet): - if not is_connected("pressed", self, "_on_pressed"): - connect("pressed", self, "_on_pressed") - if not is_connected("focus_entered", self, "_on_focus_entered"): - connect("focus_entered", self, "_on_focus_entered") - if not is_connected("focus_exited", self, "_on_focus_exited"): - connect("focus_exited", self, "_on_focus_exited") + Utils.unique_connect("pressed", self, "_on_pressed") + Utils.unique_connect("focus_entered", self, "_on_focus_entered") + Utils.unique_connect("focus_exited", self, "_on_focus_exited") else: - if is_connected("pressed", self, "_on_pressed"): - disconnect("pressed", self, "_on_pressed") - if is_connected("focus_entered", self, "_on_focus_entered"): - disconnect("focus_entered", self, "_on_focus_entered") - if is_connected("focus_exited", self, "_on_focus_exited"): - disconnect("focus_exited", self, "_on_focus_exited") + disconnect("pressed", self, "_on_pressed") + disconnect("focus_entered", self, "_on_focus_entered") + disconnect("focus_exited", self, "_on_focus_exited") func set_key_binding_number(position_of_event): diff --git a/hud/system/fleet/menu_fleet.gd b/hud/system/fleet/menu_fleet.gd index f6414dea..d6c78c3d 100644 --- a/hud/system/fleet/menu_fleet.gd +++ b/hud/system/fleet/menu_fleet.gd @@ -82,9 +82,8 @@ func update_element_fleet(): func set_fleet(new_fleet): - if fleet != null and fleet.is_connected("fleet_update_nb_ships", self, "_on_fleet_update_nb_ships"): + if fleet != null: fleet.disconnect("fleet_update_nb_ships", self, "_on_fleet_update_nb_ships") - if fleet != null and fleet.is_connected("fleet_erased", self, "_on_fleet_erased"): fleet.disconnect("fleet_erased", self, "_on_fleet_erased") fleet = new_fleet _connect_fleet() @@ -96,12 +95,9 @@ func set_fleet(new_fleet): func _connect_fleet(): - if fleet == null: - return - if not fleet.is_connected("fleet_update_nb_ships", self, "_on_fleet_update_nb_ships"): - fleet.connect("fleet_update_nb_ships", self, "_on_fleet_update_nb_ships") - if not fleet.is_connected("fleet_erased", self, "_on_fleet_erased"): - fleet.connect("fleet_erased", self, "_on_fleet_erased") + if fleet != null: + Utils.unique_connect("fleet_update_nb_ships", self, "_on_fleet_update_nb_ships") + Utils.unique_connect("fleet_erased", self, "_on_fleet_erased") func _on_fleet_erased(): @@ -126,14 +122,15 @@ func _on_fleet_update_nb_ships(): func _on_ship_group_pressed(formation_param): for node in grid_formation_container.get_children(): - if node is ShipGroupCard: - if node.formation_position != formation_param: - node.is_selected = false + if not node is ShipGroupCard: + continue + if node.formation_position != formation_param: + node.is_selected = false + else: + if node.is_selected: + show_details(formation_param) else: - if node.is_selected: - show_details(formation_param) - else: - hide_details() + hide_details() func show_details(formation_param): diff --git a/hud/system/system_building_details.gd b/hud/system/system_building_details.gd index 71354cd4..7ee07138 100644 --- a/hud/system/system_building_details.gd +++ b/hud/system/system_building_details.gd @@ -18,15 +18,14 @@ onready var building_container = $ScrollContainer/HBoxContainer func _ready(): _building_panel_list = [] - _game_data.selected_state.connect("system_selected", self, "_on_system_selected") - _game_data.selected_state.connect("system_updated", self, "_on_system_updated") - _game_data.selected_state.connect("building_updated", self, "_on_building_updated") + for e in ["system_selected", "system_updated", "building_updated"]: + _game_data.selected_state.connect(e, self, "_on_" + e) update_building_panels() update_visibility() func set_menu_layer(node): - if menu_layer != null and menu_layer.is_connected("menu_closed", self, "_on_menu_layer_menu_closed"): + if menu_layer != null: menu_layer.disconnect("menu_closed", self, "_on_menu_layer_menu_closed") menu_layer = node menu_layer.connect("menu_closed", self, "_on_menu_layer_menu_closed") diff --git a/main.gd b/main.gd index bc53e235..8ff96629 100644 --- a/main.gd +++ b/main.gd @@ -54,10 +54,8 @@ func change_scene_loading(load_queue_param): change_level(scenes.loading.scene) var loading_node = $Level.get_child(0) loading_node.load_queue = load_queue_param - if not loading_node.is_connected("ressource_loaded", self, "_on_ressource_loaded"): - loading_node.connect("ressource_loaded", self, "_on_ressource_loaded") - if not loading_node.is_connected("finished", self, "_on_load_finished"): - loading_node.connect("finished", self, "_on_load_finished") + for e in ["ressource_loaded", "finished"]: + Utils.unique_external_connect(loading_node, e, self, "_on_" + e) func _on_ressource_loaded(ressource_name, ressource): @@ -95,6 +93,5 @@ func _on_locale_reloaded(): func _set_is_in_game(is_in_game_new): - if is_in_game_new == _is_in_game: - return - _is_in_game = is_in_game_new + if _is_in_game != is_in_game_new: + _is_in_game = is_in_game_new