diff --git a/common/inventory/scripts/item.gd b/common/inventory/scripts/item.gd index 0842e2b..6c956de 100644 --- a/common/inventory/scripts/item.gd +++ b/common/inventory/scripts/item.gd @@ -11,8 +11,14 @@ func is_one_time_use(): func can_use(_player : Player) -> bool: return false +func use_text(_player) -> String: + return "" + func use_requirement_text() -> String: return "" func use(_player : Player): - return false \ No newline at end of file + return false + +func generate_action_area(_player) -> ActionArea: + return null diff --git a/common/inventory/scripts/items/seed.gd b/common/inventory/scripts/items/seed.gd index 3d065ca..6feea97 100644 --- a/common/inventory/scripts/items/seed.gd +++ b/common/inventory/scripts/items/seed.gd @@ -13,14 +13,23 @@ class_name Seed func _init(_plant_type : PlantType = null): plant_type = _plant_type +func generate_action_area(player : Player) -> ActionArea: + return ActionArea.new( + player, + 10 + ) + +func use_text(_player) -> String: + return "Plant " + plant_type.name + func is_one_time_use(): return true func can_use(player : Player) -> bool: - return not player.planet.is_there_contamination(player.global_position) + return not player.planet.is_there_contamination(player.action_area.global_position) func use(player : Player) -> bool: if not can_use(player): return false player.play_sfx("dig") - return player.planet.plant(plant_type, player.global_position) + return player.planet.plant(plant_type, player.action_area.global_position) diff --git a/common/inventory/scripts/items/shovel.gd b/common/inventory/scripts/items/shovel.gd index ba6089e..51cfff7 100644 --- a/common/inventory/scripts/items/shovel.gd +++ b/common/inventory/scripts/items/shovel.gd @@ -3,6 +3,9 @@ class_name Shovel const USE_INTERVAL = 0.15 +func use_text(_player) -> String: + return "Dig" + func can_use(player : Player) -> bool: var areas = player.action_area.get_overlapping_areas() for area in areas : diff --git a/common/inventory/scripts/tool_item.gd b/common/inventory/scripts/tool_item.gd index 5a9ab3f..6184131 100644 --- a/common/inventory/scripts/tool_item.gd +++ b/common/inventory/scripts/tool_item.gd @@ -2,10 +2,9 @@ extends Item class_name ToolItem @export var area_width: float = 50 -@export var area_distance: float = 50 -func generate_action_area(): +func generate_action_area(player : Player) -> ActionArea: return ActionArea.new( - area_width, - area_distance + player, + area_width ) \ No newline at end of file diff --git a/entities/interactables/compost/scripts/compost.gd b/entities/interactables/compost/scripts/compost.gd index 22c389d..c07d57a 100644 --- a/entities/interactables/compost/scripts/compost.gd +++ b/entities/interactables/compost/scripts/compost.gd @@ -12,6 +12,9 @@ func _process(_delta): func inspected_text(): return "Compost" +func interact_text(): + return "Put a seed" + func can_interact(p : Player) -> bool: return p.inventory.get_item() and p.inventory.get_item() is Seed diff --git a/entities/interactables/item_object/script/item_object.gd b/entities/interactables/item_object/script/item_object.gd index 7898f7c..340bf19 100644 --- a/entities/interactables/item_object/script/item_object.gd +++ b/entities/interactables/item_object/script/item_object.gd @@ -24,6 +24,9 @@ func _ready(): func inspected_text(): return item.name + (" Seed" if item is Seed else "") +func interact_text(): + return "Take" + func interact(player : Player) -> bool: var swapped_item = player.inventory.get_item() diff --git a/entities/interactables/scripts/interactable.gd b/entities/interactables/scripts/interactable.gd index 69dc33c..60eb75b 100644 --- a/entities/interactables/scripts/interactable.gd +++ b/entities/interactables/scripts/interactable.gd @@ -4,19 +4,22 @@ class_name Interactable var available : bool = true func can_interact(_p : Player) -> bool: - return true + return true func interact_requirement_text() -> String: - return "" + return "" -func interact(_p : Player) -> bool: - printerr("Interact function called on abstract Interactable class") - return false +func interact(_p : Player) -> bool: + printerr("Interact function called on abstract Interactable class") + return false func generate_collision(area_width : float): - var collision = CollisionShape2D.new() - var collision_shape = CircleShape2D.new() - collision_shape.radius = area_width + var collision = CollisionShape2D.new() + var collision_shape = CircleShape2D.new() + collision_shape.radius = area_width - collision.shape = collision_shape - add_child(collision) \ No newline at end of file + collision.shape = collision_shape + add_child(collision) + +func interact_text(): + return "" diff --git a/entities/plants/resources/plants/default.tres b/entities/plants/resources/plants/default.tres index 88c9a95..e204786 100644 --- a/entities/plants/resources/plants/default.tres +++ b/entities/plants/resources/plants/default.tres @@ -2,7 +2,7 @@ [ext_resource type="Texture2D" uid="uid://c7mp7tkkkk6o5" path="res://entities/plants/assets/sprites/default/growing.png" id="1_fp5j6"] [ext_resource type="Script" uid="uid://jnye5pe1bgqw" path="res://entities/plants/scripts/plant_type.gd" id="1_moyj3"] -[ext_resource type="Script" uid="uid://cgscbuxe4dawb" path="res://entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd" id="2_cky1j"] +[ext_resource type="Script" path="res://entities/plants/scripts/plant_effects/decontaminate_terrain_effect.gd" id="2_cky1j"] [ext_resource type="Texture2D" uid="uid://bupl1y0cfj21q" path="res://entities/plants/assets/sprites/default/mature.png" id="3_ffarr"] [ext_resource type="Texture2D" uid="uid://ba413oun7ry78" path="res://entities/plants/assets/sprites/default/planted.png" id="4_2s6re"] [ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="6_cky1j"] diff --git a/entities/player/scripts/action_area.gd b/entities/player/scripts/action_area.gd index 25cfc81..9c4f267 100644 --- a/entities/player/scripts/action_area.gd +++ b/entities/player/scripts/action_area.gd @@ -1,44 +1,41 @@ extends Area2D class_name ActionArea -const OPACITY = 0.3 +const OPACITY = 0.4 const ACTIVATED_COLOR = Color.TURQUOISE const DEACTIVATED_COLOR = Color.REBECCA_PURPLE var collision_shape : CollisionShape2D = null -var area_width : float = 40 -var area_distance : float = 80 +var area_width : float +var area_max_distance : float +var player : Player -var activated : bool = false : - set(v): - var old = activated - activated = v - if old != activated: - queue_redraw() +var activated : bool = false func _init( + _player: Player, _area_width : float = 40, - _area_distance : float = 80 ): + player = _player area_width = _area_width - area_distance = _area_distance func _ready(): collision_shape = CollisionShape2D.new() - collision_shape.position.x = area_distance collision_shape.shape = CircleShape2D.new() collision_shape.shape.radius = area_width add_child(collision_shape) func _process(_delta): - look_at(get_global_mouse_position()) + var target_position = get_global_mouse_position() - player.global_position + if Vector2.ONE.distance_to(target_position) > player.max_reach: + target_position = Vector2.ZERO.direction_to(target_position)*player.max_reach + + position = target_position + queue_redraw() func _draw(): draw_circle( - Vector2( - area_distance, - 0 - ), + Vector2.ZERO, area_width, Color((ACTIVATED_COLOR if activated else DEACTIVATED_COLOR), OPACITY) ) diff --git a/entities/player/scripts/player.gd b/entities/player/scripts/player.gd index 018478b..a834871 100644 --- a/entities/player/scripts/player.gd +++ b/entities/player/scripts/player.gd @@ -1,8 +1,11 @@ extends CharacterBody2D class_name Player +const MAX_REACH_CIRCLE_OPACITY = 0.1 + signal player_updated(player: Player) signal action_tried_without_energy +signal action_not_permitted signal upgraded var planet : Planet # mis à jour par la classe Planet @@ -11,48 +14,47 @@ var planet : Planet # mis à jour par la classe Planet @onready var inventory : Inventory = Inventory.new() var max_energy : int = 3 +var max_reach : int = 100 : + set(v): + max_reach = v + queue_redraw() var controlling_player : bool = true : set(v): controlling_player = v velocity = Vector2.ZERO -var closest_interactable : Interactable = null : - set(v): - var old = closest_interactable - closest_interactable = v - if old != closest_interactable: - player_updated.emit(self) +var target_interactable : Interactable = null # mis à jour par la classe Interactable + var can_use_item : bool = false : set(v): var old = can_use_item can_use_item = v if old != can_use_item: - player_updated.emit(self) -var can_interact : bool = false : - set(v): - var old = can_interact - can_interact = v - if old != can_interact: + print("emit") player_updated.emit(self) var energy : int = max_energy : set(v): energy = v - emit_signal("player_updated", self) -var action_area : ActionArea = null + player_updated.emit(self) +var action_area : ActionArea = null : + set(v): + action_area = v + queue_redraw() func _ready(): - emit_signal("player_updated", self) + player_updated.emit(self) inventory.inventory_changed.connect(_on_inventory_updated) + Pointer.player = self # Méthode déclenchée par la classe planet func _pass_day(): energy = max_energy + target_interactable = null func _process(_delta): get_input() move_and_slide() - detect_closest_interactable() func _on_root_gui_day_pass_pressed(): controlling_player = false @@ -66,19 +68,33 @@ func _on_root_gui_game_click(): func _on_inventory_updated(_inventory: Inventory): emit_signal("player_updated", self) +func _draw(): + if action_area: + draw_arc( + Vector2.ZERO, + max_reach, + 0., + 2*PI, + 30, + Color(Color.WHITE,MAX_REACH_CIRCLE_OPACITY), + 1 + ) + func get_input(): if controlling_player: var old_velocity=velocity calculate_direction() can_use_item = inventory.get_item() and inventory.get_item().can_use(self) - can_interact = closest_interactable and closest_interactable.can_interact(self) if action_area: action_area.activated = can_use_item + if target_interactable and target_interactable in $InteractArea2D.get_overlapping_areas(): + if target_interactable.can_interact(self): + Pointer.stop_inspect_entity(target_interactable) + target_interactable.interact(self) + target_interactable = null if Input.is_action_just_pressed("action"): try_use_item() - if Input.is_action_just_pressed("interact") and closest_interactable and can_interact: - closest_interactable.interact(self) if Input.is_action_just_pressed("drop") and inventory.get_item(): drop_item() if old_velocity.length()==0 and velocity.length()!=0: @@ -86,21 +102,31 @@ func get_input(): func calculate_direction(): var input_direction: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down") + + if input_direction.length() != 0: + target_interactable = null + + if target_interactable: + input_direction = self.global_position.direction_to(target_interactable.global_position) + velocity = input_direction * speed if input_direction.x: $Sprite.flip_h = (input_direction.x < 0) func try_use_item(): - if energy == 0 and inventory.get_item(): + if energy == 0: action_tried_without_energy.emit() + elif not can_use_item: + action_not_permitted.emit() if energy > 0 and can_use_item: use_item() func get_item(item : Item): remove_action_area() inventory.set_item(item) - if item is ToolItem: - add_action_area(item.generate_action_area()) + var new_action_area = item.generate_action_area(self) + if new_action_area != null : + add_action_area(new_action_area) play_sfx("pick") func drop_item(): @@ -121,22 +147,6 @@ func use_item(): if item.is_one_time_use(): delete_item() -func detect_closest_interactable(): - var in_range_interactables : Array[Interactable] = [] - for area in $InteractArea2D.get_overlapping_areas(): - if area is Interactable and area.available: - in_range_interactables.append(area) - - in_range_interactables.sort_custom( - func(a : Node2D, b : Node2D) : - return a.global_position.distance_to(global_position) < b.global_position.distance_to(global_position) - ) - - if len(in_range_interactables) > 0: - closest_interactable = in_range_interactables[0] - else : - closest_interactable = null - func add_action_area(area : ActionArea): action_area = area add_child(action_area) @@ -144,6 +154,8 @@ func add_action_area(area : ActionArea): func remove_action_area(): if (action_area): remove_child(action_area) + action_area.queue_free() + action_area = null func upgrade(): max_energy += 1 diff --git a/entities/scripts/inspectable_entity.gd b/entities/scripts/inspectable_entity.gd index 4d3ca2d..8a5fbd0 100644 --- a/entities/scripts/inspectable_entity.gd +++ b/entities/scripts/inspectable_entity.gd @@ -4,15 +4,14 @@ class_name InspectableEntity const MODULATE_INSPECTED_COLOR = Color.GRAY @onready var default_modulate : Color = modulate -@onready var mouse_signals_setuped : bool = setup_mouse_signals() +@onready var inspectable_signals_setuped : bool = setup_inspectable_signals() var inspected : bool = false : set(v): - print(v) inspected = v modulate = MODULATE_INSPECTED_COLOR if inspected else default_modulate -func setup_mouse_signals() -> bool: +func setup_inspectable_signals() -> bool: mouse_entered.connect(_on_mouse_entered) mouse_exited.connect(_on_mouse_excited) return true diff --git a/game.tscn b/game.tscn index d36f919..b81f209 100644 --- a/game.tscn +++ b/game.tscn @@ -90,6 +90,7 @@ following = NodePath("../Entities/Player") [connection signal="day_pass_proceed" from="CanvasLayer/RootGui" to="Planet" method="_on_root_gui_day_pass_proceed"] [connection signal="game_click" from="CanvasLayer/RootGui" to="Entities/Player" method="_on_root_gui_game_click"] [connection signal="pause_asked" from="CanvasLayer/RootGui" to="CanvasLayer/Pause" method="_on_root_gui_pause_asked"] +[connection signal="action_not_permitted" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_action_not_permitted"] [connection signal="action_tried_without_energy" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_action_tried_without_energy"] [connection signal="player_updated" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_updated"] [connection signal="upgraded" from="Entities/Player" to="CanvasLayer/RootGui" method="_on_player_upgraded"] diff --git a/gui/game/game_gui.tscn b/gui/game/game_gui.tscn index 8b7fa7f..572e5c6 100644 --- a/gui/game/game_gui.tscn +++ b/gui/game/game_gui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=3 uid="uid://12nak7amd1uq"] +[gd_scene load_steps=22 format=3 uid="uid://12nak7amd1uq"] [ext_resource type="Script" uid="uid://cqao7n800qy40" path="res://gui/game/scripts/game_gui.gd" id="1_udau0"] [ext_resource type="Theme" uid="uid://bgcmd213j6gk1" path="res://gui/game/ressources/default_theme.tres" id="2_nq5i2"] @@ -136,6 +136,34 @@ tracks/2/keys = { "values": [Color(0.866667, 0.152941, 0.337255, 0), Color(0.866667, 0.152941, 0.337255, 0.392157), Color(0.866667, 0.152941, 0.337255, 0)] } +[sub_resource type="Animation" id="Animation_id0t5"] +resource_name = "not_permitted" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Effect:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Effect:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.266667), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.866667, 0.152941, 0.337255, 0), Color(0.866667, 0.152941, 0.337255, 0.392157), Color(0.866667, 0.152941, 0.337255, 0)] +} + [sub_resource type="Animation" id="Animation_k4juk"] resource_name = "recharge_fade_in" tracks/0/type = "value" @@ -234,6 +262,7 @@ tracks/2/keys = { _data = { &"RESET": SubResource("Animation_iyvkh"), &"no_energy_left": SubResource("Animation_n4kem"), +&"not_permitted": SubResource("Animation_id0t5"), &"recharge_fade_in": SubResource("Animation_k4juk"), &"recharge_fade_out": SubResource("Animation_fovlv"), &"upgrade": SubResource("Animation_2wykm") @@ -260,15 +289,6 @@ size_flags_vertical = 3 mouse_filter = 1 script = ExtResource("1_udau0") -[node name="GameAction" type="TextureButton" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 1 - [node name="MarginContainer" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = 15 @@ -401,43 +421,6 @@ label_settings = SubResource("LabelSettings_n4kem") autowrap_mode = 3 clip_text = true -[node name="AvailableActions" type="HBoxContainer" parent="MarginContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -size_flags_vertical = 8 -theme = ExtResource("2_nq5i2") - -[node name="Plant" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "Space/Click - Plant Seed" - -[node name="Interact" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "E - Interact" - -[node name="GetItem" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "E - Take Item" - -[node name="SwapItem" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "E - Swap Item" - -[node name="DropItem" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "W - Drop Item" - -[node name="UseItem" type="Label" parent="MarginContainer/AvailableActions"] -visible = false -layout_mode = 2 -text = "Space/Click - Use Item" - [node name="TopRightContent" type="HBoxContainer" parent="MarginContainer"] layout_mode = 2 size_flags_horizontal = 8 @@ -493,6 +476,5 @@ grow_vertical = 2 mouse_filter = 2 texture = SubResource("GradientTexture2D_id0t5") -[connection signal="button_down" from="GameAction" to="." method="_on_game_action_button_down"] [connection signal="pressed" from="MarginContainer/DayPass" to="." method="_on_day_pass_pressed"] [connection signal="pressed" from="MarginContainer/TopRightContent/Pause" to="." method="_on_pause_pressed"] diff --git a/gui/game/pause/pause.tscn b/gui/game/pause/pause.tscn index 2723d62..c6d16d2 100644 --- a/gui/game/pause/pause.tscn +++ b/gui/game/pause/pause.tscn @@ -76,8 +76,8 @@ horizontal_alignment = 1 [node name="ControlsText" type="Label" parent="Tutorial/VBoxContainer"] layout_mode = 2 text = "QWERTY/AZERTY/Directional Arrows : Move -E : Interact/Pickup Items -Space/Click : Use Item +Left Click : Interact/Pickup Items +Right Click/Space : Use Item W : Drop Item " horizontal_alignment = 1 diff --git a/gui/game/scripts/game_gui.gd b/gui/game/scripts/game_gui.gd index e650e77..4877df7 100644 --- a/gui/game/scripts/game_gui.gd +++ b/gui/game/scripts/game_gui.gd @@ -11,14 +11,6 @@ func _on_player_updated(player:Player): %EnergyCount.text = str(player.energy) + "/" + str(player.max_energy) %EnergyInfo.modulate = Color.WHITE if player.energy > 0 else Color.RED - %AvailableActions/GetItem.visible = player.closest_interactable is ItemObject and player.inventory.get_item() == null - %AvailableActions/Interact.visible = not player.closest_interactable is ItemObject and player.can_interact - %AvailableActions/SwapItem.visible = player.closest_interactable is ItemObject and player.inventory.get_item() != null - %AvailableActions/DropItem.visible = player.inventory.get_item() != null - %AvailableActions/UseItem.visible = player.inventory.get_item() and player.can_use_item and not player.inventory.get_item() is Seed - %AvailableActions/Plant.visible = player.inventory.get_item() and player.can_use_item and player.inventory.get_item() is Seed - - %ItemInfo.visible = player.inventory.get_item() != null if player.inventory.get_item(): var item : Item = player.inventory.get_item() @@ -53,3 +45,7 @@ func _on_pause_pressed(): func _on_player_upgraded(): $AnimationPlayer.play("upgrade") + + +func _on_player_action_not_permitted(): + $AnimationPlayer.play("not_permitted") diff --git a/gui/pointer/assets/icons/left_click.svg b/gui/pointer/assets/icons/left_click.svg new file mode 100644 index 0000000..557a1e1 --- /dev/null +++ b/gui/pointer/assets/icons/left_click.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/gui/pointer/assets/icons/left_click.svg.import b/gui/pointer/assets/icons/left_click.svg.import new file mode 100644 index 0000000..2963be5 --- /dev/null +++ b/gui/pointer/assets/icons/left_click.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djb52fosgmv4j" +path="res://.godot/imported/left_click.svg-163ab642e0d1ce655b5b40384b3f1392.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://gui/pointer/assets/icons/left_click.svg" +dest_files=["res://.godot/imported/left_click.svg-163ab642e0d1ce655b5b40384b3f1392.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/gui/pointer/assets/icons/right_click.svg b/gui/pointer/assets/icons/right_click.svg new file mode 100644 index 0000000..ca84e04 --- /dev/null +++ b/gui/pointer/assets/icons/right_click.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/gui/pointer/assets/icons/right_click.svg.import b/gui/pointer/assets/icons/right_click.svg.import new file mode 100644 index 0000000..2c0c48e --- /dev/null +++ b/gui/pointer/assets/icons/right_click.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://y3083o1fhgn0" +path="res://.godot/imported/right_click.svg-89ed358ede3244ca5dababdd0f091dae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://gui/pointer/assets/icons/right_click.svg" +dest_files=["res://.godot/imported/right_click.svg-89ed358ede3244ca5dababdd0f091dae.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/gui/pointer/assets/sounds/click.wav b/gui/pointer/assets/sounds/click.wav new file mode 100644 index 0000000..8f57211 Binary files /dev/null and b/gui/pointer/assets/sounds/click.wav differ diff --git a/gui/pointer/assets/sounds/click.wav.import b/gui/pointer/assets/sounds/click.wav.import new file mode 100644 index 0000000..04d84b3 --- /dev/null +++ b/gui/pointer/assets/sounds/click.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bym03qp4n6vep" +path="res://.godot/imported/click.wav-fdd6eee7149fdb4e39d8aa55063ce4ff.sample" + +[deps] + +source_file="res://gui/pointer/assets/sounds/click.wav" +dest_files=["res://.godot/imported/click.wav-fdd6eee7149fdb4e39d8aa55063ce4ff.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/gui/pointer/pointer.tscn b/gui/pointer/pointer.tscn index 7d27114..2d24ba2 100644 --- a/gui/pointer/pointer.tscn +++ b/gui/pointer/pointer.tscn @@ -1,8 +1,10 @@ -[gd_scene load_steps=4 format=3 uid="uid://0yr6b2jtuttm"] +[gd_scene load_steps=6 format=3 uid="uid://0yr6b2jtuttm"] [ext_resource type="Script" uid="uid://vhumsfntpqcl" path="res://gui/pointer/scripts/pointer.gd" id="1_1pe2k"] [ext_resource type="Texture2D" uid="uid://bspffyprdywgc" path="res://gui/pointer/assets/cursors/pointer.svg" id="2_q4bvb"] [ext_resource type="AudioStream" uid="uid://bym03qp4n6vep" path="res://gui/pointer/assets/sounds/click.wav" id="3_kj0cm"] +[ext_resource type="Texture2D" uid="uid://djb52fosgmv4j" path="res://gui/pointer/assets/icons/left_click.svg" id="3_pshoq"] +[ext_resource type="Texture2D" uid="uid://y3083o1fhgn0" path="res://gui/pointer/assets/icons/right_click.svg" id="4_b4uwv"] [node name="Pointer" type="Node"] process_mode = 3 @@ -18,17 +20,54 @@ layout_mode = 3 anchors_preset = 0 offset_right = 40.0 offset_bottom = 40.0 +mouse_filter = 2 + +[node name="Container" type="VBoxContainer" parent="CanvasLayer/Inspector"] +layout_mode = 0 +offset_left = 40.0 +offset_right = 137.0 +offset_bottom = 79.0 size_flags_horizontal = 0 size_flags_vertical = 0 mouse_filter = 2 -[node name="InspectorText" type="Label" parent="CanvasLayer/Inspector"] +[node name="InspectorText" type="Label" parent="CanvasLayer/Inspector/Container"] unique_name_in_owner = true z_index = 1 -layout_mode = 1 -offset_left = 26.0 -offset_right = 66.0 -offset_bottom = 23.0 +layout_mode = 2 +text = "Item" + +[node name="Interact" type="HBoxContainer" parent="CanvasLayer/Inspector/Container"] +unique_name_in_owner = true +modulate = Color(1, 1, 0.168627, 1) +layout_mode = 2 + +[node name="TextureRect" type="TextureRect" parent="CanvasLayer/Inspector/Container/Interact"] +layout_mode = 2 +texture = ExtResource("3_pshoq") + +[node name="InspectorInteractionText" type="Label" parent="CanvasLayer/Inspector/Container/Interact"] +unique_name_in_owner = true +z_index = 1 +layout_mode = 2 +text = "Take" +horizontal_alignment = 1 + +[node name="Use" type="HBoxContainer" parent="CanvasLayer/Inspector/Container"] +unique_name_in_owner = true +modulate = Color(1, 1, 0.168627, 1) +layout_mode = 2 + +[node name="TextureRect" type="TextureRect" parent="CanvasLayer/Inspector/Container/Use"] +layout_mode = 2 +texture = ExtResource("4_b4uwv") + +[node name="InspectorUseText" type="Label" parent="CanvasLayer/Inspector/Container/Use"] +unique_name_in_owner = true +z_index = 1 +layout_mode = 2 +text = "Gloubi" +horizontal_alignment = 1 [node name="Audio" type="Node" parent="."] diff --git a/gui/pointer/scripts/pointer.gd b/gui/pointer/scripts/pointer.gd index 572cefe..be01ea8 100644 --- a/gui/pointer/scripts/pointer.gd +++ b/gui/pointer/scripts/pointer.gd @@ -3,14 +3,32 @@ extends Node @export var default_cursor : Texture2D var inspected_entity : InspectableEntity = null -var player : Player # renseigné par Player +var player : Player :# renseigné par Player + set(v): + # if player: + # player.player_updated.disconnect(update_inspector) + player = v + player.player_updated.connect( + func(p): update_inspector() + ) func _ready(): Input.set_custom_mouse_cursor(default_cursor) + %InspectorText.visible = false + %Interact.visible = false + %Use.visible = false func _input(_event): if Input.is_action_just_pressed("interact"): $Audio/Click.play() + if ( + player != null + and inspected_entity + and inspected_entity is Interactable + ): + var interactable = inspected_entity as Interactable + if interactable.can_interact(player): + player.target_interactable = interactable func _process(_delta): %Inspector.position = get_viewport().get_mouse_position() @@ -18,14 +36,32 @@ func _process(_delta): func inspect_entity(entity : InspectableEntity): if inspected_entity and inspected_entity != entity: inspected_entity.inspected = false - %InspectorText.text = entity.inspected_text() - %InspectorText.visible = true inspected_entity = entity inspected_entity.inspected = true + update_inspector() + +func update_inspector(): + print("updated") + + %InspectorText.visible = inspected_entity != null + if inspected_entity: + %InspectorText.text = inspected_entity.inspected_text() + + if player: + %Interact.visible = inspected_entity and inspected_entity is Interactable and inspected_entity.can_interact(player) + if inspected_entity and inspected_entity is Interactable and inspected_entity.can_interact(player): + %InspectorInteractionText.text = inspected_entity.interact_text() + + %Use.visible = player.can_use_item + if player.inventory.get_item() and player.can_use_item: + %InspectorUseText.text = player.inventory.get_item().use_text(player) + else: + %Interact.visible = false + %Use.visible = false + func stop_inspect_entity(entity : InspectableEntity): entity.inspected = false if inspected_entity == entity: - %InspectorText.visible = false inspected_entity = null - + update_inspector() diff --git a/project.godot b/project.godot index a5943fa..61f7fe9 100644 --- a/project.godot +++ b/project.godot @@ -50,12 +50,13 @@ move_down={ } interact={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(190, 22),"global_position":Vector2(199, 70),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } action={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(76, 12),"global_position":Vector2(85, 60),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } drop={