From bcf45b029ec4b0b184ebdd24201cb59c12e1815a Mon Sep 17 00:00:00 2001 From: ChickenStorm Date: Thu, 22 Oct 2020 17:33:45 +0200 Subject: [PATCH 1/2] avatar on system --- audio/audio_scene_singleton.gd | 3 +- game/map/player_avatar.gd | 29 ++++++ game/map/player_avatar.tscn | 84 ++++++++++++++++++ game/map/system.gd | 33 +++++-- game/map/system.tscn | 86 +++++++++++++++--- gui/circular_frame.gd | 88 +++++++++++++++++++ gui/frame.gd | 74 ++++++++++++++++ project.godot | 18 ++++ resources/assets/2d/faction/faction.gd | 5 +- .../remote_resources/cached_resource.gd | 2 +- .../definitions/remote_resources/faction.gd | 2 +- resources/definitions/store/selected_state.gd | 2 +- test/test_avatar.gd | 35 ++++++++ test/test_avatar.tscn | 7 ++ 14 files changed, 446 insertions(+), 22 deletions(-) create mode 100644 game/map/player_avatar.gd create mode 100644 game/map/player_avatar.tscn create mode 100644 gui/circular_frame.gd create mode 100644 gui/frame.gd create mode 100644 test/test_avatar.gd create mode 100644 test/test_avatar.tscn diff --git a/audio/audio_scene_singleton.gd b/audio/audio_scene_singleton.gd index f1cba739..5df745ec 100644 --- a/audio/audio_scene_singleton.gd +++ b/audio/audio_scene_singleton.gd @@ -1,8 +1,9 @@ +class_name AudioSceneSingleton extends Node - onready var click_sound = $AudioStackingClick + func play_click(): if click_sound != null: click_sound.play_sound() diff --git a/game/map/player_avatar.gd b/game/map/player_avatar.gd new file mode 100644 index 00000000..0b5ec2e2 --- /dev/null +++ b/game/map/player_avatar.gd @@ -0,0 +1,29 @@ +extends PanelContainer + +const ASSETS = preload("res://resources/assets.tres") + +export(Resource) var player setget set_player + +onready var label = $MarginContainer/VBoxContainer/PanelContainer/Label +onready var texture = $MarginContainer/VBoxContainer/HBoxContainer/CircularFrame/TextureRect +onready var frame = $MarginContainer/VBoxContainer/HBoxContainer/CircularFrame +onready var margin_container = $MarginContainer + + +func _ready(): + _update_player_element() + + +func set_player(new_player): + player = new_player + _update_player_element() + + +func _update_player_element(): + if label == null or texture == null or frame == null: + return + margin_container.visible = player != null + if player != null: + label.text = player.username + #texture.texture = player.avatar + frame.color = player.faction.get_color() diff --git a/game/map/player_avatar.tscn b/game/map/player_avatar.tscn new file mode 100644 index 00000000..4c1599a4 --- /dev/null +++ b/game/map/player_avatar.tscn @@ -0,0 +1,84 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://game/map/player_avatar.gd" type="Script" id=1] +[ext_resource path="res://gui/circular_frame.gd" type="Script" id=3] + +[sub_resource type="StyleBoxEmpty" id=1] + +[sub_resource type="StreamTexture" id=2] +flags = 4 +load_path = "res://.import/user_64px.png-787f84595703aca1f0dbfca3c34673cc.stex" + +[node name="PlayerAvatar" type="PanelContainer"] +mouse_filter = 2 +custom_styles/panel = SubResource( 1 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_right = 143.0 +margin_bottom = 61.0 +mouse_filter = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_right = 143.0 +margin_bottom = 61.0 +mouse_filter = 2 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +margin_right = 143.0 +margin_bottom = 29.0 +mouse_filter = 2 +alignment = 1 + +[node name="CircularFrame" type="MarginContainer" parent="MarginContainer/VBoxContainer/HBoxContainer"] +margin_left = 57.0 +margin_right = 86.0 +margin_bottom = 29.0 +mouse_filter = 2 +custom_constants/margin_right = 6 +custom_constants/margin_top = 6 +custom_constants/margin_left = 6 +custom_constants/margin_bottom = 6 +script = ExtResource( 3 ) +color = Color( 1, 0.0235294, 0, 1 ) +background_color = Color( 1, 1, 1, 0.784314 ) +line_width = 2 +number_of_edges = 14 +blend = true +advance_blend = true + +[node name="TextureRect" type="TextureRect" parent="MarginContainer/VBoxContainer/HBoxContainer/CircularFrame"] +margin_left = 6.0 +margin_top = 6.0 +margin_right = 23.0 +margin_bottom = 23.0 +rect_min_size = Vector2( 17, 17 ) +mouse_filter = 2 +size_flags_horizontal = 5 +size_flags_vertical = 5 +texture = SubResource( 2 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 33.0 +margin_right = 143.0 +margin_bottom = 61.0 +mouse_filter = 2 +size_flags_horizontal = 4 + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/PanelContainer"] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 136.0 +margin_bottom = 21.0 +text = "no_translate.pseudo" +align = 1 +valign = 1 diff --git a/game/map/system.gd b/game/map/system.gd index 2bca0b5b..3140aff0 100644 --- a/game/map/system.gd +++ b/game/map/system.gd @@ -24,13 +24,17 @@ var _target_scale = scale_ratio var _current_scale = scale_ratio var _lock_fleet_pin_refresh = Utils.Lock.new() -onready var light_glow_bg = $Star/Light2DGlowBG +onready var light_glow_bg = $Star/DisplayElements/Light2DGlowBG onready var star = $Star -onready var crown = $Star/Crown -onready var spot = $Star/Spot +onready var crown = $Star/DisplayElements/Crown +onready var spot = $Star/DisplayElements/Spot onready var fleet_pins = $FleetPins onready var range_draw_node = $Range onready var building_pins = $BuildingPins +onready var timer = $Star/PlayerAvatar/Timer +onready var avatar = $Star/PlayerAvatar +onready var animation_avatar = $Star/PlayerAvatar/AnimationPlayer +onready var display_element = $Star/DisplayElements func _ready(): @@ -40,6 +44,7 @@ func _ready(): star.connect("mouse_input", self, "_on_mouse_input") star.connect("mouse_entered", self, "_on_mouse_entered") star.connect("mouse_exited", self, "_on_mouse_exited") + timer.connect("timeout", self, "_on_timer_animation_avatar_timeout") _game_data.selected_state.connect("fleet_selected", self, "_on_fleet_selected") _game_data.selected_state.connect("fleet_unselected", self, "_on_fleet_unselected") var scale_factor = (1.0 / scale.x) if scale.x != 0 else 0.0 @@ -49,6 +54,7 @@ func _ready(): _set_system_texture() _set_glow_effet() _modulate_color(1.0) + _set_player_avatar() if _game_data.does_belong_to_current_player(system): _game_data.selected_state.select_system(system) refresh_scale() @@ -67,6 +73,7 @@ func set_system(new_system): _disconnect_system() system = new_system _connect_system() + _set_player_avatar() func unselect(): @@ -141,6 +148,7 @@ func refresh(): range_draw_node.visible = false crown.visible = _game_data.does_belong_to_current_player(system) refresh_scale() + _set_player_avatar() func refresh_building_pins(): @@ -192,7 +200,7 @@ func _set_glow_effet(): func _set_system_texture(): - var faction = ASSETS.factions[0.0] + var faction = ASSETS.factions[0] if system.player: faction = _game_data.get_player(system.player).faction spot.texture = faction.picto.system_by_kind(system.kind) @@ -224,7 +232,7 @@ func _on_fleet_unselected(_old_fleet): func _modulate_color(alpha): var color = get_color_of_system() color.a = alpha - star.set_modulate(color) + display_element.set_modulate(color) func _on_mouse_input(event): @@ -264,12 +272,17 @@ func _on_mouse_entered(): is_hover = true refresh_scale() is_in_range_sailing_fleet = _game_data.is_in_range(_game_data.selected_state.selected_fleet, system) + timer.start() func _on_mouse_exited(): is_hover = false is_in_range_sailing_fleet = false refresh_scale() + if not timer.is_stopped(): + timer.stop() + else: + animation_avatar.play("fade", -1 , -1.0, not animation_avatar.is_playing()) func refresh_scale(): @@ -340,3 +353,13 @@ func _on_hangar_updated(_ship_group_hangar): func _on_building_updated(): refresh_building_pins() + + +func _on_timer_animation_avatar_timeout(): + animation_avatar.play("fade", -1 , 1.0, false) + + +func _set_player_avatar(): + if avatar == null: + return + avatar.player = _game_data.get_player(system.player) diff --git a/game/map/system.tscn b/game/map/system.tscn index e3f07ff2..8c98f762 100644 --- a/game/map/system.tscn +++ b/game/map/system.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://game/map/system.gd" type="Script" id=1] [ext_resource path="res://gui/transparent_circle_button.gd" type="Script" id=2] [ext_resource path="res://game/map/system_range_draw.gd" type="Script" id=3] +[ext_resource path="res://game/map/player_avatar.tscn" type="PackedScene" id=4] [sub_resource type="StreamTexture" id=1] flags = 4 @@ -16,6 +17,35 @@ load_path = "res://.import/crown_top.png-9a695ae7baae47aa3950a2279fbca96e.stex" flags = 4 load_path = "res://.import/spot.png-5693d467b7986fd6fc70ca36bb0c242c.stex" +[sub_resource type="Animation" id=4] +resource_name = "fade" +length = 0.3 +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.04, 0.05, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ false, false, true, true ] +} + [node name="System" type="Node2D"] scale = Vector2( 0.4, 0.4 ) script = ExtResource( 1 ) @@ -46,32 +76,42 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -margin_left = -16.1 -margin_top = -16.1 -margin_right = 15.1 -margin_bottom = 15.1 +margin_left = -15.6 +margin_top = -15.6 +margin_right = 15.6 +margin_bottom = 15.6 grow_horizontal = 2 grow_vertical = 2 -rect_pivot_offset = Vector2( 16.1, 16.1 ) +rect_pivot_offset = Vector2( 15.6, 15.6 ) script = ExtResource( 2 ) __meta__ = { "_edit_use_anchors_": false } -[node name="Spot" type="Sprite" parent="Star"] +[node name="DisplayElements" type="Control" parent="Star"] +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +rect_pivot_offset = Vector2( 15.6, 15.6 ) +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Spot" type="Sprite" parent="Star/DisplayElements"] light_mask = 3 +position = Vector2( 15.6, 15.6 ) scale = Vector2( 0.15, 0.15 ) texture = SubResource( 1 ) -centered = false -[node name="Crown" type="Sprite" parent="Star"] +[node name="Crown" type="Sprite" parent="Star/DisplayElements"] light_mask = 3 -position = Vector2( 0, -20 ) +position = Vector2( 15.6, -4 ) scale = Vector2( 0.15, 0.15 ) texture = SubResource( 2 ) -centered = false -[node name="Light2DGlowBG" type="Light2D" parent="Star"] +[node name="Light2DGlowBG" type="Light2D" parent="Star/DisplayElements"] visible = false position = Vector2( 0, 0.165539 ) texture = SubResource( 3 ) @@ -82,6 +122,28 @@ mode = 2 range_layer_min = -10 range_item_cull_mask = 4 +[node name="PlayerAvatar" parent="Star" instance=ExtResource( 4 )] +visible = false +modulate = Color( 1, 1, 1, 0 ) +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -71.5 +margin_top = -30.0 +margin_right = 71.5 +margin_bottom = 62.0 +grow_horizontal = 2 +rect_scale = Vector2( 0.9, 0.9 ) +rect_pivot_offset = Vector2( 71.5, 30 ) + +[node name="Timer" type="Timer" parent="Star/PlayerAvatar"] +wait_time = 0.7 +one_shot = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Star/PlayerAvatar"] +anims/fade = SubResource( 4 ) + [node name="Range" type="Node2D" parent="."] visible = false script = ExtResource( 3 ) diff --git a/gui/circular_frame.gd b/gui/circular_frame.gd new file mode 100644 index 00000000..c2d744e1 --- /dev/null +++ b/gui/circular_frame.gd @@ -0,0 +1,88 @@ +tool +class_name CircularFrame +extends MarginContainer + +export(Color) var color = Color.black setget set_color +export(Color) var background_color = Color.transparent setget set_background_color +export(int) var line_width = 1 setget set_line_width +export(int) var number_of_edges = 32 setget set_number_of_edges +export(bool) var blend = false setget set_blend +export(bool) var advance_blend = false setget set_advance_blend +export(float, 0.0, 1.0) var blend_factor = 0.5 setget set_blend_factor + + +func _draw(): + var points_1 = PoolVector2Array([]) + var center = rect_size / 2.0 + var colors = PoolColorArray([]) + var mid_color = color.linear_interpolate(background_color, blend_factor) + for i in range(number_of_edges + 1): + var angle = float(i) * 2.0 * PI / float(number_of_edges) + points_1.push_back(Vector2(cos(angle) * rect_size.x / 2.0, sin(angle) * rect_size.y / 2.0) + center) + colors.push_back(color) + var points_2 = PoolVector2Array([]) + var colors_2 = PoolColorArray([]) + for i in range(number_of_edges + 1): + var angle = float(number_of_edges - i) * 2.0 * PI / float(number_of_edges) + points_2.push_back(Vector2(cos(angle) * (rect_size.x / 2.0 - line_width as float), \ + sin(angle) * (rect_size.y / 2.0 - line_width as float)) + center) + if blend: + colors_2.push_back(mid_color if advance_blend else background_color) + else: + colors_2.push_back(color) + points_1.append_array(points_2) + colors.append_array(colors_2) + draw_polygon(points_1, colors) + if advance_blend: + var points_3 = PoolVector2Array([]) + var colors_3 = PoolColorArray([]) + for i in range(number_of_edges + 1): + var angle = float(i) * 2.0 * PI / float(number_of_edges) + points_3.push_back(Vector2(cos(angle) * (rect_size.x / 2.0 - line_width as float - 1.0), \ + sin(angle) * (rect_size.y / 2.0 - line_width as float - 1.0)) + center) + colors_3.push_back(background_color if blend else mid_color) + points_2.append_array(points_3) + colors_2.append_array(colors_3) + draw_polygon(points_2, colors_2) + draw_polygon(points_3, PoolColorArray([background_color])) + else: + draw_polygon(points_2, PoolColorArray([background_color])) + + +func set_number_of_edges(new_var): + if new_var < 4: + return + number_of_edges = new_var + update() + + +func set_line_width(width): + if width < 1: + return + line_width = width + update() + + +func set_color(new_color): + color = new_color + update() + + +func set_background_color(new_color): + background_color = new_color + update() + + +func set_blend(blend_new): + blend = blend_new + update() + + +func set_advance_blend(blend_new): + advance_blend = blend_new + update() + + +func set_blend_factor(blend_new): + blend_factor = blend_new + update() diff --git a/gui/frame.gd b/gui/frame.gd new file mode 100644 index 00000000..1b9134d8 --- /dev/null +++ b/gui/frame.gd @@ -0,0 +1,74 @@ +tool +class_name Frame +extends MarginContainer + +export(Color) var color = Color.black setget set_color +export(Color) var background_color = Color.transparent setget set_background_color +export(int) var line_width = 1 setget set_line_width +export(bool) var blend = false setget set_blend + + +func _ready(): + pass + + +func _draw(): + var colors_array = PoolColorArray([color, color, background_color, background_color]) \ + if blend else PoolColorArray([color]) + var points_top = PoolVector2Array([ + Vector2.ZERO, + Vector2(rect_size.x,0), + Vector2(rect_size.x - line_width, line_width), + Vector2(line_width, line_width) + ]) + draw_polygon(points_top, colors_array) + var points_left = PoolVector2Array([ + Vector2(rect_size.x,0), + Vector2(rect_size.x, rect_size.y), + Vector2(rect_size.x - line_width, rect_size.y - line_width), + Vector2(rect_size.x - line_width, line_width) + ]) + draw_polygon(points_left, colors_array) + var points_bottom = PoolVector2Array([ + Vector2(0, rect_size.y), + Vector2(rect_size.x, rect_size.y), + Vector2(rect_size.x - line_width, rect_size.y - line_width), + Vector2(line_width, rect_size.y - line_width) + ]) + draw_polygon(points_bottom, colors_array) + var points_right = PoolVector2Array([ + Vector2(0 ,0), + Vector2(0, rect_size.y), + Vector2(line_width, rect_size.y - line_width), + Vector2(line_width, line_width) + ]) + draw_polygon(points_right, colors_array) + var points_center = PoolVector2Array([ + Vector2(line_width, line_width), + Vector2(line_width, rect_size.y - line_width), + Vector2(rect_size.x - line_width, rect_size.y - line_width), + Vector2(rect_size.x - line_width, line_width), + ]) + draw_polygon(points_center, PoolColorArray([ background_color ])) + + +func set_line_width(width): + if width < 1: + return + line_width = width + update() + + +func set_color(new_color): + color = new_color + update() + + +func set_background_color(new_color): + background_color = new_color + update() + + +func set_blend(blend_new): + blend = blend_new + update() diff --git a/project.godot b/project.godot index c990c737..f0a4c915 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,11 @@ _global_script_classes=[ { "path": "res://audio/audio_resource.gd" }, { "base": "Node", +"class": "AudioSceneSingleton", +"language": "GDScript", +"path": "res://audio/audio_scene_singleton.gd" +}, { +"base": "Node", "class": "AudioStacking", "language": "GDScript", "path": "res://audio/audio_stacking.gd" @@ -69,6 +74,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://gui/container_circular.gd" }, { +"base": "MarginContainer", +"class": "CircularFrame", +"language": "GDScript", +"path": "res://gui/circular_frame.gd" +}, { "base": "RemoteDictResource", "class": "ConstanteRemoteResource", "language": "GDScript", @@ -134,6 +144,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://resources/definitions/store/fleet_squadron.gd" }, { +"base": "MarginContainer", +"class": "Frame", +"language": "GDScript", +"path": "res://gui/frame.gd" +}, { "base": "Resource", "class": "GameData", "language": "GDScript", @@ -296,6 +311,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "AudioResource": "", +"AudioSceneSingleton": "", "AudioStacking": "res://resources/editor/audio_stacking.svg", "AudioStacking2D": "res://resources/editor/audio_stacking_2d.svg", "AudioStacking3D": "res://resources/editor/audio_stacking_3d.svg", @@ -307,6 +323,7 @@ _global_script_class_icons={ "CachedResource": "", "CircularButton": "res://resources/editor/custom_circular_button.svg", "CircularContainer": "res://resources/editor/circular_container.svg", +"CircularFrame": "", "ConstanteRemoteResource": "", "ConstructionBuildingItem": "", "CrownSprite": "res://resources/assets/2d/map/kalankar/crown_bottom.png", @@ -320,6 +337,7 @@ _global_script_class_icons={ "FleetItem": "res://resources/editor/fleet_item.svg", "FleetSprite": "res://resources/assets/2d/map/picto_flotte_2.png", "FleetSquadron": "", +"Frame": "", "GameData": "", "KalaxiaAssets": "res://resources/assets/2d/white_logo.png", "KalaxiaBuilding": "", diff --git a/resources/assets/2d/faction/faction.gd b/resources/assets/2d/faction/faction.gd index c290ecdf..ea1a2dc5 100644 --- a/resources/assets/2d/faction/faction.gd +++ b/resources/assets/2d/faction/faction.gd @@ -21,7 +21,10 @@ func get_color(is_victory_system = false, is_current_player = false) -> Color: func update_info_form_dict(dict): - self.display_color = dict.display_color + if dict.display_color is Color: + self.display_color = dict.display_color + else: + self.display_color = Color8(dict.display_color[0], dict.display_color[1], dict.display_color[2], dict.display_color[3]) self.display_name = dict.name self.id = dict.id diff --git a/resources/definitions/remote_resources/cached_resource.gd b/resources/definitions/remote_resources/cached_resource.gd index 8be49500..6647f614 100644 --- a/resources/definitions/remote_resources/cached_resource.gd +++ b/resources/definitions/remote_resources/cached_resource.gd @@ -137,7 +137,7 @@ func _on_factions_loaded(err, response_code, _header, body): var result = JSON.parse(body.get_string_from_utf8()).result factions = {} for faction in result: - factions[faction.id] = (FactionRemote.new(faction)) + factions[faction.id] = FactionRemote.new(faction) dict_loaded[Resource_elements.FACTIONS] = true _verify_finished_loading() emit_signal("loaded", Resource_elements.FACTIONS) diff --git a/resources/definitions/remote_resources/faction.gd b/resources/definitions/remote_resources/faction.gd index d715c168..5d20deea 100644 --- a/resources/definitions/remote_resources/faction.gd +++ b/resources/definitions/remote_resources/faction.gd @@ -1,7 +1,7 @@ extends DictResource class_name FactionRemote -export(Array, int) var display_color +export(Color) var display_color export(String) var name export(float) var id diff --git a/resources/definitions/store/selected_state.gd b/resources/definitions/store/selected_state.gd index a8107f53..5fabd7bf 100644 --- a/resources/definitions/store/selected_state.gd +++ b/resources/definitions/store/selected_state.gd @@ -72,7 +72,7 @@ func unselect_fleet(): func is_selected_system(system : System): - return system.id == selected_system.id + return system.id == selected_system.id if selected_system != null else false func _disconnect_fleet(fleet : Fleet): diff --git a/test/test_avatar.gd b/test/test_avatar.gd new file mode 100644 index 00000000..3a5e878a --- /dev/null +++ b/test/test_avatar.gd @@ -0,0 +1,35 @@ +extends Node2D + +const ID = "super secrete id" +var ASSETS = load("res://resources/assets.tres") +const SYSTEM_SECENE = preload("res://game/map/system.tscn") +const CACHE = preload("res://cache.tres") + +func _ready(): + ASSETS.constants = CACHE.constants + var me = Player.new() + me.username = "Chicken" + me.id = ID + me.faction = ASSETS.factions[1] + var kern = Player.new() + kern.username = "Kern" + kern.id = "kern" + kern.faction = ASSETS.factions[2] + Store.game_data = GameData.new("uuid", me, null) + Store.game_data.players["kern"] = kern + var my_system = System.new() + my_system.id = "id1" + my_system.kind = "BaseSystem" + my_system.player = ID + my_system.coordinates = Vector2(5,5) + var system = SYSTEM_SECENE.instance() + system.system = my_system + add_child(system) + var my_system_2 = System.new() + my_system_2.id = "id2" + my_system_2.kind = "VictorySystem" + my_system_2.player = "kern" + my_system_2.coordinates = Vector2(10,5) + var system_2 = SYSTEM_SECENE.instance() + system_2.system = my_system_2 + add_child(system_2) diff --git a/test/test_avatar.tscn b/test/test_avatar.tscn new file mode 100644 index 00000000..f2805274 --- /dev/null +++ b/test/test_avatar.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://test/test_avatar.gd" type="Script" id=2] + +[node name="Node2D" type="Node2D"] +scale = Vector2( 3, 3 ) +script = ExtResource( 2 ) From 68f678ae17a2282c372a528cc40da70b2a9297c3 Mon Sep 17 00:00:00 2001 From: ChickenStorm Date: Sun, 25 Oct 2020 10:59:35 +0100 Subject: [PATCH 2/2] add avatar on fleet --- config/development.tres | 1 + config/environment_config.gd | 10 ++++++ config/environment_config.tres | 1 + game/fade_animation.tres | 30 ++++++++++++++++ game/map/fleet_sailing.gd | 62 ++++++++++++++++++++++++++++++---- game/map/fleet_sailing.tscn | 62 ++++++++++++++++++++++++++++++---- game/map/system.gd | 8 +++++ game/map/system.tscn | 46 ++++++++----------------- global/debug/debug_panel.gd | 17 +++++++++- global/debug/debug_panel.tscn | 15 +++++--- gui/circular_frame.gd | 9 ++++- test/test_avatar.gd | 38 +++++++++++++++++++-- test/test_avatar.tscn | 9 ++++- 13 files changed, 255 insertions(+), 53 deletions(-) create mode 100644 game/fade_animation.tres diff --git a/config/development.tres b/config/development.tres index cc3f06e2..75c55def 100644 --- a/config/development.tres +++ b/config/development.tres @@ -10,3 +10,4 @@ api_scheme = "http" ws_scheme = "ws" debug_activated = true debug_auto_fill_lobby = true +show_debug_frame = false diff --git a/config/environment_config.gd b/config/environment_config.gd index 927d18c7..f060a026 100644 --- a/config/environment_config.gd +++ b/config/environment_config.gd @@ -2,6 +2,8 @@ tool class_name EnvironmentConfig extends Resource +signal show_debug_frame_changed() + export(String) var api_dns = "127.0.0.1" export(int, 0, 65535) var api_port = 8080 export(String, "http", "https") var api_scheme = "http" @@ -9,3 +11,11 @@ export(String, "ws", "wss") var ws_scheme = "ws" export(bool) var debug_activated = false export(bool) var debug_auto_fill_lobby = false + +export(bool) var show_debug_frame = false setget set_show_debug_frame + + +func set_show_debug_frame(new_boolean): + show_debug_frame = new_boolean + emit_signal("changed") + emit_signal("show_debug_frame_changed") diff --git a/config/environment_config.tres b/config/environment_config.tres index cc3f06e2..75c55def 100644 --- a/config/environment_config.tres +++ b/config/environment_config.tres @@ -10,3 +10,4 @@ api_scheme = "http" ws_scheme = "ws" debug_activated = true debug_auto_fill_lobby = true +show_debug_frame = false diff --git a/game/fade_animation.tres b/game/fade_animation.tres new file mode 100644 index 00000000..91f3f24d --- /dev/null +++ b/game/fade_animation.tres @@ -0,0 +1,30 @@ +[gd_resource type="Animation" format=2] + +[resource] +resource_name = "fade" +length = 0.3 +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.04, 0.05, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ false, false, true, true ] +} diff --git a/game/map/fleet_sailing.gd b/game/map/fleet_sailing.gd index 3c9c2bf8..b080596f 100644 --- a/game/map/fleet_sailing.gd +++ b/game/map/fleet_sailing.gd @@ -8,22 +8,41 @@ var destination_position = Vector2.ZERO var fleet : Fleet = null setget set_fleet var _game_data : GameData = Store.game_data -onready var sprite_container = $FleetPath/Follower/SpritesContainer -onready var sprite_crown = $FleetPath/Follower/SpritesContainer/CrownSprite -onready var fleet_sprite = $FleetPath/Follower/SpritesContainer/FleetIcon +onready var rotation_conatiner = $FleetPath/Follower/RotationContainer +onready var sprite_container = $FleetPath/Follower/RotationContainer/SpritesContainer +onready var sprite_crown = $FleetPath/Follower/RotationContainer/SpritesContainer/CrownSprite +onready var fleet_sprite = $FleetPath/Follower/RotationContainer/SpritesContainer/FleetIcon +onready var avatar = $FleetPath/Follower/PlayerAvatar +onready var timer_avatar = $FleetPath/Follower/PlayerAvatar/Timer +onready var animation_avatar = $FleetPath/Follower/PlayerAvatar/AnimationPlayer +onready var controle_hover = $FleetPath/Follower/RotationContainer/ControlHover +onready var reference_frame_hover = $FleetPath/Follower/RotationContainer/ControlHover/ReferenceRect onready var _time_departure = OS.get_system_time_msecs() func _ready(): + timer_avatar.connect("timeout", self, "_on_timeout_avatar") + controle_hover.connect("mouse_entered", self, "_on_mouse_enter") + controle_hover.connect("mouse_exited", self, "_on_mouse_exited") + Config.config_environment.connect("show_debug_frame_changed", self, "_on_show_debug_frame_changed") var curve = Curve2D.new() curve.add_point(origin_position) curve.add_point(destination_position) + rotation_conatiner.rotation = (destination_position - origin_position).angle() + PI / 2.0 $FleetPath.curve = curve var color = _game_data.get_player_color(_game_data.get_player(fleet.player)) sprite_container.set_modulate(color) _set_size_sprite() _set_icone_texture() _set_crown_state() + _set_avatar() + _update_show_frame() + update() + + +func _draw(): + if Config.config_environment.show_debug_frame: + draw_polyline($FleetPath.curve.get_baked_points(), Color(0.0, 1.0, 0.0), 1.0) func _process(_delta): @@ -33,12 +52,13 @@ func _process(_delta): func set_fleet(new_fleet): fleet = new_fleet _set_size_sprite() + _set_avatar() func _set_size_sprite(): - if fleet != null and sprite_container != null: + if fleet != null and rotation_conatiner != null: var scale_sprite = _SCALE_CURRENT_PLAYER_FACTOR if _game_data.does_belong_to_current_player(fleet) else 1.0 - sprite_container.scale = Vector2(BASE_SCALE * scale_sprite, BASE_SCALE * scale_sprite) + rotation_conatiner.scale = Vector2(BASE_SCALE * scale_sprite, BASE_SCALE * scale_sprite) func _get_flight_time_ms(): @@ -47,7 +67,7 @@ func _get_flight_time_ms(): func _get_flight_ratio(): - return ((OS.get_system_time_msecs () - _time_departure) as float / _get_flight_time_ms() as float) if _get_flight_time_ms() != 0 else 1.0 + return ((OS.get_system_time_msecs() - _time_departure) as float / _get_flight_time_ms() as float) if _get_flight_time_ms() != 0 else 1.0 func _set_icone_texture(): @@ -59,3 +79,33 @@ func _set_crown_state(): sprite_crown.visible = is_current_player if is_current_player: sprite_crown.faction = _game_data.get_player(fleet.player).faction + + +func _on_timeout_avatar(): + animation_avatar.play("fade", -1 , -1.0, not animation_avatar.is_playing()) + + +func _on_mouse_enter(): + if timer_avatar.is_stopped(): + animation_avatar.play("fade", -1 , 1.0, false) + else: + timer_avatar.stop() + + +func _on_mouse_exited(): + timer_avatar.start() + + +func _set_avatar(): + if avatar != null: + avatar.player = _game_data.get_player(fleet.player) + + +func _update_show_frame(): + if reference_frame_hover != null: + reference_frame_hover.editor_only = not Config.config_environment.show_debug_frame + + +func _on_show_debug_frame_changed(): + _update_show_frame() + update() diff --git a/game/map/fleet_sailing.tscn b/game/map/fleet_sailing.tscn index e3a76db2..0aa366f3 100644 --- a/game/map/fleet_sailing.tscn +++ b/game/map/fleet_sailing.tscn @@ -1,32 +1,80 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://game/map/fleet_sailing.gd" type="Script" id=1] [ext_resource path="res://game/map/sprites/fleet_sprite.tscn" type="PackedScene" id=2] [ext_resource path="res://game/map/sprites/crown_sprite.tscn" type="PackedScene" id=3] [ext_resource path="res://resources/assets/2d/map/kalankar/crown_bottom.png" type="Texture" id=4] +[ext_resource path="res://game/map/player_avatar.tscn" type="PackedScene" id=5] +[ext_resource path="res://game/fade_animation.tres" type="Animation" id=6] [sub_resource type="Curve2D" id=1] _data = { "points": PoolVector2Array( ) } -[node name="fleetSailing" type="Node2D"] +[node name="FleetSailing" type="Node2D"] script = ExtResource( 1 ) [node name="FleetPath" type="Path2D" parent="."] curve = SubResource( 1 ) [node name="Follower" type="PathFollow2D" parent="FleetPath"] +rotate = false loop = false -[node name="SpritesContainer" type="Node2D" parent="FleetPath/Follower"] +[node name="RotationContainer" type="Node2D" parent="FleetPath/Follower"] rotation = 1.5708 scale = Vector2( 0.75, 0.75 ) -[node name="FleetIcon" parent="FleetPath/Follower/SpritesContainer" instance=ExtResource( 2 )] -faction = null +[node name="SpritesContainer" type="Node2D" parent="FleetPath/Follower/RotationContainer"] -[node name="CrownSprite" parent="FleetPath/Follower/SpritesContainer" instance=ExtResource( 3 )] +[node name="FleetIcon" parent="FleetPath/Follower/RotationContainer/SpritesContainer" instance=ExtResource( 2 )] + +[node name="CrownSprite" parent="FleetPath/Follower/RotationContainer/SpritesContainer" instance=ExtResource( 3 )] position = Vector2( 0, 9 ) texture = ExtResource( 4 ) -faction = null + +[node name="ControlHover" type="Control" parent="FleetPath/Follower/RotationContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -8.0 +margin_top = -7.0 +margin_right = 8.0 +margin_bottom = 9.0 +rect_min_size = Vector2( 16, 16 ) +mouse_filter = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ReferenceRect" type="ReferenceRect" parent="FleetPath/Follower/RotationContainer/ControlHover"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +border_color = Color( 0, 0.713726, 0.992157, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PlayerAvatar" parent="FleetPath/Follower" instance=ExtResource( 5 )] +visible = false +modulate = Color( 1, 1, 1, 0 ) +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -71.5 +margin_top = -24.0 +margin_right = 71.5 +margin_bottom = 37.0 +rect_scale = Vector2( 0.4, 0.4 ) +rect_pivot_offset = Vector2( 71.5, 30.5 ) + +[node name="Timer" type="Timer" parent="FleetPath/Follower/PlayerAvatar"] +wait_time = 1.5 +one_shot = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="FleetPath/Follower/PlayerAvatar"] +anims/fade = ExtResource( 6 ) diff --git a/game/map/system.gd b/game/map/system.gd index 3140aff0..4a9d2da6 100644 --- a/game/map/system.gd +++ b/game/map/system.gd @@ -35,6 +35,7 @@ onready var timer = $Star/PlayerAvatar/Timer onready var avatar = $Star/PlayerAvatar onready var animation_avatar = $Star/PlayerAvatar/AnimationPlayer onready var display_element = $Star/DisplayElements +onready var reference_frame = $Star/ReferenceRect func _ready(): @@ -45,6 +46,7 @@ func _ready(): star.connect("mouse_entered", self, "_on_mouse_entered") star.connect("mouse_exited", self, "_on_mouse_exited") timer.connect("timeout", self, "_on_timer_animation_avatar_timeout") + Config.config_environment.connect("show_debug_frame_changed", self, "_update_show_frame") _game_data.selected_state.connect("fleet_selected", self, "_on_fleet_selected") _game_data.selected_state.connect("fleet_unselected", self, "_on_fleet_unselected") var scale_factor = (1.0 / scale.x) if scale.x != 0 else 0.0 @@ -61,6 +63,7 @@ func _ready(): else : _set_target_scale(1.0) refresh_building_pins() + _update_show_frame() func _process(delta): @@ -363,3 +366,8 @@ func _set_player_avatar(): if avatar == null: return avatar.player = _game_data.get_player(system.player) + + +func _update_show_frame(): + if reference_frame != null: + reference_frame.editor_only = not Config.config_environment.show_debug_frame diff --git a/game/map/system.tscn b/game/map/system.tscn index 8c98f762..f3b57ff0 100644 --- a/game/map/system.tscn +++ b/game/map/system.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=10 format=2] [ext_resource path="res://game/map/system.gd" type="Script" id=1] [ext_resource path="res://gui/transparent_circle_button.gd" type="Script" id=2] [ext_resource path="res://game/map/system_range_draw.gd" type="Script" id=3] [ext_resource path="res://game/map/player_avatar.tscn" type="PackedScene" id=4] +[ext_resource path="res://game/fade_animation.tres" type="Animation" id=5] +[ext_resource path="res://gui/circular_frame.gd" type="Script" id=6] [sub_resource type="StreamTexture" id=1] flags = 4 @@ -17,35 +19,6 @@ load_path = "res://.import/crown_top.png-9a695ae7baae47aa3950a2279fbca96e.stex" flags = 4 load_path = "res://.import/spot.png-5693d467b7986fd6fc70ca36bb0c242c.stex" -[sub_resource type="Animation" id=4] -resource_name = "fade" -length = 0.3 -step = 0.01 -tracks/0/type = "value" -tracks/0/path = NodePath(".:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 0.05, 0.3 ), -"transitions": PoolRealArray( 1, 1, 1 ), -"update": 0, -"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:visible") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0, 0.04, 0.05, 0.3 ), -"transitions": PoolRealArray( 1, 1, 1, 1 ), -"update": 1, -"values": [ false, false, true, true ] -} - [node name="System" type="Node2D"] scale = Vector2( 0.4, 0.4 ) script = ExtResource( 1 ) @@ -142,7 +115,18 @@ wait_time = 0.7 one_shot = true [node name="AnimationPlayer" type="AnimationPlayer" parent="Star/PlayerAvatar"] -anims/fade = SubResource( 4 ) +anims/fade = ExtResource( 5 ) + +[node name="ReferenceRect" type="MarginContainer" parent="Star"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} +color = Color( 1, 0, 0, 1 ) +editor_only = true [node name="Range" type="Node2D" parent="."] visible = false diff --git a/global/debug/debug_panel.gd b/global/debug/debug_panel.gd index 52c20277..50cd394f 100644 --- a/global/debug/debug_panel.gd +++ b/global/debug/debug_panel.gd @@ -9,12 +9,15 @@ onready var button_container_animation = $Layer/ButtonContainer/AnimationPlayer onready var button = $Layer/ButtonContainer/Button onready var menu_header = $Layer/MenuContainer/MenuHeader onready var menu_container = $Layer/MenuContainer - +onready var button_debug_frame = $Layer/MenuContainer/MenuBody/Body/MarginContainer/VBoxContainer/CheckBox func _ready(): button.connect("pressed", self, "_on_pressed") menu_header.connect("close_request", self , "_on_close_request") menu_container.visible = false + _update_debug_frame_buton() + Config.config_environment.connect("show_debug_frame_changed", self, "_on_show_debug_frame_changed") + button_debug_frame.connect("pressed", self, "_on_button_debug_frame_pressed") func _input(event): @@ -36,3 +39,15 @@ func _on_pressed(): func _on_close_request(): menu_container.visible = false button.pressed = false + + +func _on_show_debug_frame_changed(): + _update_debug_frame_buton() + + +func _update_debug_frame_buton(): + button_debug_frame.pressed = Config.config_environment.show_debug_frame + + +func _on_button_debug_frame_pressed(): + Config.config_environment.show_debug_frame = button_debug_frame.pressed diff --git a/global/debug/debug_panel.tscn b/global/debug/debug_panel.tscn index c7548a7a..924286f7 100644 --- a/global/debug/debug_panel.tscn +++ b/global/debug/debug_panel.tscn @@ -95,7 +95,7 @@ minimisable = false show_behind_parent = true margin_top = 31.0 margin_right = 218.0 -margin_bottom = 80.0 +margin_bottom = 120.0 size_flags_vertical = 3 script = ExtResource( 4 ) @@ -103,13 +103,13 @@ script = ExtResource( 4 ) margin_left = 3.0 margin_top = 2.0 margin_right = 215.0 -margin_bottom = 47.0 +margin_bottom = 87.0 size_flags_vertical = 3 script = ExtResource( 6 ) [node name="MarginContainer" type="MarginContainer" parent="Layer/MenuContainer/MenuBody/Body"] margin_right = 212.0 -margin_bottom = 45.0 +margin_bottom = 85.0 custom_constants/margin_right = 10 custom_constants/margin_top = 10 custom_constants/margin_left = 10 @@ -119,9 +119,16 @@ custom_constants/margin_bottom = 10 margin_left = 10.0 margin_top = 10.0 margin_right = 202.0 -margin_bottom = 35.0 +margin_bottom = 75.0 +custom_constants/separation = 15 [node name="Button" type="Button" parent="Layer/MenuContainer/MenuBody/Body/MarginContainer/VBoxContainer"] margin_right = 192.0 margin_bottom = 25.0 text = "debug.dump_game_data" + +[node name="CheckBox" type="CheckBox" parent="Layer/MenuContainer/MenuBody/Body/MarginContainer/VBoxContainer"] +margin_top = 40.0 +margin_right = 192.0 +margin_bottom = 65.0 +text = "debug.show_frame" diff --git a/gui/circular_frame.gd b/gui/circular_frame.gd index c2d744e1..197709a3 100644 --- a/gui/circular_frame.gd +++ b/gui/circular_frame.gd @@ -9,9 +9,11 @@ export(int) var number_of_edges = 32 setget set_number_of_edges export(bool) var blend = false setget set_blend export(bool) var advance_blend = false setget set_advance_blend export(float, 0.0, 1.0) var blend_factor = 0.5 setget set_blend_factor - +export(bool) var editor_only = false setget set_editor_only func _draw(): + if editor_only and not Engine.editor_hint: + return var points_1 = PoolVector2Array([]) var center = rect_size / 2.0 var colors = PoolColorArray([]) @@ -86,3 +88,8 @@ func set_advance_blend(blend_new): func set_blend_factor(blend_new): blend_factor = blend_new update() + + +func set_editor_only(new_boolean): + editor_only = new_boolean + update() diff --git a/test/test_avatar.gd b/test/test_avatar.gd index 3a5e878a..b66994d3 100644 --- a/test/test_avatar.gd +++ b/test/test_avatar.gd @@ -4,8 +4,15 @@ const ID = "super secrete id" var ASSETS = load("res://resources/assets.tres") const SYSTEM_SECENE = preload("res://game/map/system.tscn") const CACHE = preload("res://cache.tres") +const FLEET_SAILING = preload("res://game/map/fleet_sailing.tscn") + +var fleet_saling +var fleet_saling_2 + +onready var timer = $Timer func _ready(): + timer.connect("timeout", self, "_on_timeout") ASSETS.constants = CACHE.constants var me = Player.new() me.username = "Chicken" @@ -21,7 +28,7 @@ func _ready(): my_system.id = "id1" my_system.kind = "BaseSystem" my_system.player = ID - my_system.coordinates = Vector2(5,5) + my_system.coordinates = Vector2(5, 5) var system = SYSTEM_SECENE.instance() system.system = my_system add_child(system) @@ -29,7 +36,34 @@ func _ready(): my_system_2.id = "id2" my_system_2.kind = "VictorySystem" my_system_2.player = "kern" - my_system_2.coordinates = Vector2(10,5) + my_system_2.coordinates = Vector2(10, 5) var system_2 = SYSTEM_SECENE.instance() system_2.system = my_system_2 add_child(system_2) + var fleet = Fleet.new() + fleet.player = ID + fleet.destination_arrival_date = OS.get_system_time_msecs() + 6 * 1000 + fleet_saling = FLEET_SAILING.instance() + fleet_saling.fleet = fleet + fleet_saling.origin_position = Vector2(5,5) * Utils.SCALE_SYSTEMS_COORDS + fleet_saling.destination_position = Vector2(10, 5) * Utils.SCALE_SYSTEMS_COORDS + add_child(fleet_saling) + var fleet_2 = Fleet.new() + fleet_2.player = "kern" + fleet_2.destination_arrival_date = OS.get_system_time_msecs() + 6 * 1000 + fleet_saling_2 = FLEET_SAILING.instance() + fleet_saling_2.fleet = fleet_2 + randomize() + fleet_saling_2.origin_position = Vector2(rand_range(0, 20), rand_range(0, 15)) * Utils.SCALE_SYSTEMS_COORDS + fleet_saling_2.destination_position = Vector2(rand_range(0, 20), rand_range(0, 15)) * Utils.SCALE_SYSTEMS_COORDS + add_child(fleet_saling_2) + + +func _on_timeout(): + fleet_saling._time_departure = OS.get_system_time_msecs() + fleet_saling.fleet.destination_arrival_date = OS.get_system_time_msecs() + 6 * 1000 + fleet_saling_2._time_departure = OS.get_system_time_msecs() + fleet_saling_2.fleet.destination_arrival_date = OS.get_system_time_msecs() + 6 * 1000 + fleet_saling_2.origin_position = fleet_saling_2.destination_position + fleet_saling_2.destination_position = Vector2(rand_range(0, 20), rand_range(0, 15)) * Utils.SCALE_SYSTEMS_COORDS + fleet_saling_2._ready() diff --git a/test/test_avatar.tscn b/test/test_avatar.tscn index f2805274..17da169f 100644 --- a/test/test_avatar.tscn +++ b/test/test_avatar.tscn @@ -1,7 +1,14 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] +[ext_resource path="res://global/debug/debug_panel.tscn" type="PackedScene" id=1] [ext_resource path="res://test/test_avatar.gd" type="Script" id=2] [node name="Node2D" type="Node2D"] scale = Vector2( 3, 3 ) script = ExtResource( 2 ) + +[node name="Timer" type="Timer" parent="."] +wait_time = 6.0 +autostart = true + +[node name="DebugPanel" parent="." instance=ExtResource( 1 )]