diff --git a/assets/textures/gui/pictograms.png b/assets/textures/gui/pictograms.png index 92860d1..aa9fd8c 100644 --- a/assets/textures/gui/pictograms.png +++ b/assets/textures/gui/pictograms.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5d6800d5e2328b06ab5bff91ee44a090db0bf29de29e4b1282289d1f95b62fe -size 79770 +oid sha256:d078a21f105315a48cb29df4b54109be720cb3b70e74b7423e7d9d1cdd8ee555 +size 94676 diff --git a/assets/textures/gui/think_bubble.png b/assets/textures/gui/think_bubble.png new file mode 100644 index 0000000..3639243 --- /dev/null +++ b/assets/textures/gui/think_bubble.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:436b2ace3036c184c7f00ca62bd5a2b8919f0e567c7966690f4b07cea02b39fc +size 3946 diff --git a/assets/textures/gui/think_bubble.png.import b/assets/textures/gui/think_bubble.png.import new file mode 100644 index 0000000..d7fdb1d --- /dev/null +++ b/assets/textures/gui/think_bubble.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc40vkh4nc6pk" +path="res://.godot/imported/think_bubble.png-57fcf04de07e72c3db7be0179d1c2e28.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/gui/think_bubble.png" +dest_files=["res://.godot/imported/think_bubble.png-57fcf04de07e72c3db7be0179d1c2e28.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/test_world.tscn b/scenes/test_world.tscn index 3b7d66b..f5e8960 100644 --- a/scenes/test_world.tscn +++ b/scenes/test_world.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=16 format=3 uid="uid://ceru75se7ifkb"] +[gd_scene load_steps=17 format=3 uid="uid://ceru75se7ifkb"] [ext_resource type="Script" path="res://scripts/main_camera.gd" id="1_gnxhh"] [ext_resource type="PackedScene" uid="uid://d4c6ujs1ra1ob" path="res://scenes/units/aphid.tscn" id="3_eh22j"] [ext_resource type="PackedScene" uid="uid://c70rhvk2okkcu" path="res://scenes/ui/buy_ants.tscn" id="4_irvxk"] +[ext_resource type="PackedScene" uid="uid://dhtofjn8dnuw3" path="res://scenes/ui/unit_info.tscn" id="5_asam3"] [ext_resource type="PackedScene" uid="uid://davys5ol18oyo" path="res://scenes/ui/pause_menu.tscn" id="5_ljrsn"] [ext_resource type="Script" path="res://scripts/ambient_audio.gd" id="7_413eh"] [ext_resource type="PackedScene" uid="uid://clftjlaotf2g2" path="res://scenes/structures/anthill.tscn" id="7_f30w3"] @@ -101,6 +102,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.79455, 0, 1.78811) [node name="BuyAnts" parent="UI" instance=ExtResource("4_irvxk")] +[node name="UnitInfo" parent="UI" instance=ExtResource("5_asam3")] + [node name="PauseMenu" parent="UI" instance=ExtResource("5_ljrsn")] [node name="MainCamera" type="Camera3D" parent="."] diff --git a/scenes/ui/pause_menu.tscn b/scenes/ui/pause_menu.tscn index 259d8a8..eedc7f8 100644 --- a/scenes/ui/pause_menu.tscn +++ b/scenes/ui/pause_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://davys5ol18oyo"] +[gd_scene load_steps=11 format=3 uid="uid://davys5ol18oyo"] [ext_resource type="StyleBox" uid="uid://do5c5v5kvgv0s" path="res://resources/styles/panel_small_style.tres" id="1_06xpe"] [ext_resource type="Script" path="res://scripts/ui/pause_menu.gd" id="1_kcif0"] @@ -9,6 +9,10 @@ [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4k086"] bg_color = Color(0, 0, 0, 0.25098) +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_k576p"] +texture = ExtResource("2_e7opb") +modulate_color = Color(0.664997, 0.596536, 0.412061, 1) + [sub_resource type="AtlasTexture" id="AtlasTexture_td4xc"] atlas = ExtResource("4_dmywd") region = Rect2(376.638, 15.8875, 58.3096, 53.2115) @@ -44,10 +48,11 @@ offset_right = 80.0 offset_bottom = 55.5 grow_horizontal = 2 grow_vertical = 2 -theme_override_styles/panel = ExtResource("1_06xpe") +theme_override_styles/panel = SubResource("StyleBoxTexture_k576p") [node name="QuitButton" type="TextureButton" parent="Panel"] modulate = Color(0.843007, 0.282913, 0.299802, 1) +layout_mode = 0 offset_left = 38.0 offset_top = 24.0 offset_right = 117.0 @@ -75,6 +80,7 @@ texture = SubResource("AtlasTexture_td4xc") [node name="CancelButton" type="TextureButton" parent="Panel"] modulate = Color(0.81, 0.748035, 0.5913, 1) +layout_mode = 0 offset_left = 117.0 offset_top = -25.0 offset_right = 182.0 diff --git a/scenes/ui/unit_info.tscn b/scenes/ui/unit_info.tscn new file mode 100644 index 0000000..8dd0d0c --- /dev/null +++ b/scenes/ui/unit_info.tscn @@ -0,0 +1,151 @@ +[gd_scene load_steps=12 format=3 uid="uid://dhtofjn8dnuw3"] + +[ext_resource type="Texture2D" uid="uid://cc40vkh4nc6pk" path="res://assets/textures/gui/think_bubble.png" id="1_hsifm"] +[ext_resource type="Script" path="res://scripts/ui/unit_info.gd" id="2_b6c6l"] +[ext_resource type="Texture2D" uid="uid://slraulfmk8c0" path="res://assets/textures/gui/pictograms.png" id="6_vrqjx"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_wrdqv"] +texture = ExtResource("1_hsifm") +modulate_color = Color(0.664997, 0.596536, 0.412061, 1) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7modd"] +atlas = ExtResource("6_vrqjx") +region = Rect2(404.555, 93.7849, 67.5499, 53.8488) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2jq3t"] +atlas = ExtResource("6_vrqjx") +region = Rect2(476.79, 88.6228, 77.4275, 53.8488) + +[sub_resource type="AtlasTexture" id="AtlasTexture_beuyo"] +atlas = ExtResource("6_vrqjx") +region = Rect2(572.197, 83.8424, 60.0876, 64.636) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o8jta"] +atlas = ExtResource("6_vrqjx") +region = Rect2(654.844, 86.7453, 91.2445, 50.4017) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ndwb1"] +atlas = ExtResource("6_vrqjx") +region = Rect2(405.682, 154.985, 69.6633, 48.5967) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fh2cu"] +atlas = ExtResource("6_vrqjx") +region = Rect2(493.617, 151.821, 88.0582, 58.802) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q6lpn"] +atlas = ExtResource("6_vrqjx") +region = Rect2(605.33, 162.323, 47.3997, 44.5031) + +[node name="UnitInfo" type="Panel"] +offset_right = 128.0 +offset_bottom = 128.0 +pivot_offset = Vector2(63, 130) +size_flags_horizontal = 4 +size_flags_vertical = 8 +theme_override_styles/panel = SubResource("StyleBoxTexture_wrdqv") +script = ExtResource("2_b6c6l") + +[node name="AntIdle" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -26.0 +offset_top = -40.0 +offset_right = 41.0 +offset_bottom = 13.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_7modd") + +[node name="AntMoving" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -39.0 +offset_top = -41.0 +offset_right = 38.0 +offset_bottom = 12.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_2jq3t") + +[node name="AntPickingUp" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -29.0 +offset_top = -48.0 +offset_right = 31.0 +offset_bottom = 16.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_beuyo") + +[node name="AntDepositing" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -45.0 +offset_top = -38.0 +offset_right = 46.0 +offset_bottom = 12.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_o8jta") + +[node name="AphidIdle" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -37.0 +offset_right = 37.0 +offset_bottom = 11.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_ndwb1") + +[node name="AphidPanic" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -43.0 +offset_top = -41.0 +offset_right = 45.0 +offset_bottom = 17.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_fh2cu") + +[node name="AphidEat" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -19.0 +offset_top = -24.0 +offset_right = 28.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = SubResource("AtlasTexture_q6lpn") diff --git a/scenes/units/ant_gatherer.tscn b/scenes/units/ant_gatherer.tscn index 1d65d06..14c5074 100644 --- a/scenes/units/ant_gatherer.tscn +++ b/scenes/units/ant_gatherer.tscn @@ -77,3 +77,6 @@ neighbor_distance = 10.0 aabb = AABB(-0.5, 0, -0.5, 1, 0.5, 1) [node name="Gathering" parent="." index="8" instance=ExtResource("5_wwnxg")] + +[node name="UiOrigin" type="Marker3D" parent="." index="9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.58746, 0) diff --git a/scenes/units/ant_nitwit.tscn b/scenes/units/ant_nitwit.tscn index c0fb8fa..161c455 100644 --- a/scenes/units/ant_nitwit.tscn +++ b/scenes/units/ant_nitwit.tscn @@ -77,3 +77,6 @@ neighbor_distance = 10.0 aabb = AABB(-0.5, 0, -0.5, 1, 0.5, 1) [node name="Gathering" parent="." index="8" instance=ExtResource("5_j8w6w")] + +[node name="UiOrigin" type="Marker3D" parent="." index="9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.58746, 0) diff --git a/scenes/units/aphid.tscn b/scenes/units/aphid.tscn index d8e13e7..321798f 100644 --- a/scenes/units/aphid.tscn +++ b/scenes/units/aphid.tscn @@ -68,3 +68,6 @@ neighbor_distance = 10.0 [node name="VisibleOnScreenNotifier3D" type="VisibleOnScreenNotifier3D" parent="." index="6"] aabb = AABB(-0.5, 0, -0.5, 1, 0.5, 1) + +[node name="UiOrigin" type="Marker3D" parent="." index="7"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.58746, 0) diff --git a/scenes/units/test_unit.tscn b/scenes/units/test_unit.tscn index 7be6c66..29dd075 100644 --- a/scenes/units/test_unit.tscn +++ b/scenes/units/test_unit.tscn @@ -68,3 +68,6 @@ neighbor_distance = 10.0 [node name="VisibleOnScreenNotifier3D" type="VisibleOnScreenNotifier3D" parent="." index="7"] aabb = AABB(-0.5, 0, -0.5, 1, 0.5, 1) + +[node name="UiOrigin" type="Marker3D" parent="." index="8"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.58746, 0) diff --git a/scripts/globals/ui_manager.gd b/scripts/globals/ui_manager.gd index 8851fa4..f213a62 100644 --- a/scripts/globals/ui_manager.gd +++ b/scripts/globals/ui_manager.gd @@ -2,8 +2,10 @@ extends Node @onready var anthill_info: AnthillInfo = $/root/World/UI/AnthillInfo @onready var buy_ants: BuyAnts = $/root/World/UI/BuyAnts +@onready var unit_info: UnitInfo = $/root/World/UI/UnitInfo func _ready() -> void: assert(anthill_info != null, "anthill_info missing!") assert(buy_ants != null, "buy_ants missing!") + assert(unit_info != null, "unit_info missing!") diff --git a/scripts/ui/closeable_ui.gd b/scripts/ui/closeable_ui.gd index fc75829..1314d72 100644 --- a/scripts/ui/closeable_ui.gd +++ b/scripts/ui/closeable_ui.gd @@ -16,10 +16,7 @@ func _input(event: InputEvent) -> void: var button_event := event as InputEventMouseButton if not button_event.pressed: return - if ( - button_event.button_index == MOUSE_BUTTON_RIGHT - or button_event.button_index == MOUSE_BUTTON_LEFT - ): + if button_event.button_index == MOUSE_BUTTON_LEFT: close() if event is InputEventMouseMotion: diff --git a/scripts/ui/unit_info.gd b/scripts/ui/unit_info.gd new file mode 100644 index 0000000..0d33bc8 --- /dev/null +++ b/scripts/ui/unit_info.gd @@ -0,0 +1,107 @@ +extends FollowingUI +class_name UnitInfo + +enum InfoState { + NONE, + ANT_IDLE, + ANT_MOVING, + ANT_PICKING_UP, + ANT_DEPOSITING, + APHID_IDLE, + APHID_PANIC, + APHID_EAT, +} + +var unit: Unit +var state: InfoState = InfoState.NONE + +@onready var ant_idle: Control = $AntIdle +@onready var ant_moving: Control = $AntMoving +@onready var ant_picking_up: Control = $AntPickingUp +@onready var ant_depositing: Control = $AntDepositing +@onready var aphid_idle: Control = $AphidIdle +@onready var aphid_panic: Control = $AphidPanic +@onready var aphid_eat: Control = $AphidEat + + +func _ready() -> void: + assert(ant_idle != null, "ant_idle missing!") + assert(ant_moving != null, "ant_moving missing!") + assert(ant_picking_up != null, "ant_picking_up missing!") + assert(ant_depositing != null, "ant_depositing missing!") + assert(aphid_idle != null, "aphid_idle missing!") + assert(aphid_panic != null, "aphid_panic missing!") + assert(aphid_eat != null, "aphid_eat missing!") + super._ready() + +func _process(delta: float) -> void: + super._process(delta) + if unit == null or not visible: + return + + _get_state() + _set_image() + + +func open(who: Unit) -> void: + visible = true + unit = who + set_target(unit.ui_origin) + + +func _set_image()->void: + for child:Control in get_children(): + child.visible = false + + match state: + InfoState.ANT_IDLE: + ant_idle.visible = true + InfoState.ANT_MOVING: + ant_moving.visible = true + InfoState.ANT_PICKING_UP: + ant_picking_up.visible = true + InfoState.ANT_DEPOSITING: + ant_depositing.visible = true + InfoState.APHID_IDLE: + aphid_idle.visible = true + InfoState.APHID_PANIC: + aphid_panic.visible = true + InfoState.APHID_EAT: + aphid_eat.visible = true + + +func _get_state() -> void: + if unit is Aphid: + match (unit as Aphid).state: + Aphid.AphidState.WANDERING: + state = InfoState.APHID_IDLE + + if unit is AntNitwit: + match (unit as AntNitwit).state: + AntNitwit.AntNitwitState.WANDERING: + state = InfoState.ANT_IDLE + AntNitwit.AntNitwitState.MOVING: + state = InfoState.ANT_MOVING + AntNitwit.AntNitwitState.GATHERING: + match (unit as AntNitwit).gathering.state: + Gathering.GatherState.PICKING_UP: + state = InfoState.ANT_PICKING_UP + Gathering.GatherState.DEPOSITING: + state = InfoState.ANT_DEPOSITING + Gathering.GatherState.STOP: + state = InfoState.NONE + + if unit is AntGatherer: + match (unit as AntGatherer).state: + AntGatherer.AntGathererState.WANDERING: + state = InfoState.ANT_IDLE + AntGatherer.AntGathererState.MOVING: + state = InfoState.ANT_MOVING + AntGatherer.AntGathererState.GATHERING: + match (unit as AntGatherer).gathering.state: + Gathering.GatherState.PICKING_UP: + state = InfoState.ANT_PICKING_UP + Gathering.GatherState.DEPOSITING: + state = InfoState.ANT_DEPOSITING + Gathering.GatherState.STOP: + state = InfoState.NONE \ No newline at end of file diff --git a/scripts/units/unit.gd b/scripts/units/unit.gd index 08b27e2..78c19fe 100644 --- a/scripts/units/unit.gd +++ b/scripts/units/unit.gd @@ -13,6 +13,7 @@ var wandering_timer: float = 0 var wandering_center: Vector3 = Vector3.ZERO @onready var nav_agent: NavigationAgent3D = $NavigationAgent3D +@onready var ui_origin: Node3D = $UiOrigin @onready var animation_tree: AnimationTree = $AnimationTree @onready var visibility_notifier: VisibleOnScreenNotifier3D = ( $VisibleOnScreenNotifier3D @@ -23,6 +24,7 @@ func _ready() -> void: assert(nav_agent != null, "nav_agent missing!") assert(animation_tree != null, "animation_tree missing!") assert(visibility_notifier != null, "visibility_notifier missing!") + assert(ui_origin != null, "ui_origin missing!") super._ready() wandering_center = global_position @@ -46,6 +48,10 @@ func _physics_process(_delta: float) -> void: _navigate() +func _click() ->void: + UiManager.unit_info.open(self) + + func _navigate() -> void: if nav_agent.is_navigation_finished(): velocity = Vector3.ZERO