diff --git a/assets/sprites/engrenage.png b/assets/sprites/engrenage.png new file mode 100755 index 0000000..8289d5d Binary files /dev/null and b/assets/sprites/engrenage.png differ diff --git a/assets/sprites/engrenage.png.import b/assets/sprites/engrenage.png.import new file mode 100644 index 0000000..afc56d0 --- /dev/null +++ b/assets/sprites/engrenage.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1f05yx168iat" +path="res://.godot/imported/engrenage.png-2ce1a5bc92d8e78e0457c705b66e279b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/engrenage.png" +dest_files=["res://.godot/imported/engrenage.png-2ce1a5bc92d8e78e0457c705b66e279b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/assets/tilesets/etagere.png b/assets/tilesets/etagere.png new file mode 100755 index 0000000..6e525ed Binary files /dev/null and b/assets/tilesets/etagere.png differ diff --git a/assets/tilesets/etagere.png.import b/assets/tilesets/etagere.png.import new file mode 100644 index 0000000..e9d366c --- /dev/null +++ b/assets/tilesets/etagere.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4v24viojafdc" +path="res://.godot/imported/etagere.png-3620d806973b22e12bed1ed23045cd00.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/tilesets/etagere.png" +dest_files=["res://.godot/imported/etagere.png-3620d806973b22e12bed1ed23045cd00.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/entities/items/engrenage/engrenage.gd b/entities/items/engrenage/engrenage.gd new file mode 100644 index 0000000..c82518a --- /dev/null +++ b/entities/items/engrenage/engrenage.gd @@ -0,0 +1,10 @@ +extends Area2D + +@export var item_id : String = "engrenage" +@export var item_name : String = "Engrenage" +@export var prompt_text : String = "[E] Take" + +func interact() -> void: + GameState.add_item(item_id) + print("Ramassé : ", item_name) + queue_free() # supprime l'item de la scène diff --git a/entities/items/engrenage/engrenage.gd.uid b/entities/items/engrenage/engrenage.gd.uid new file mode 100644 index 0000000..a76d508 --- /dev/null +++ b/entities/items/engrenage/engrenage.gd.uid @@ -0,0 +1 @@ +uid://dqijs5dhcpahu diff --git a/entities/items/engrenage/engrenage.tscn b/entities/items/engrenage/engrenage.tscn new file mode 100644 index 0000000..972809e --- /dev/null +++ b/entities/items/engrenage/engrenage.tscn @@ -0,0 +1,23 @@ +[gd_scene format=3 uid="uid://cge56ob5tt4o6"] + +[ext_resource type="Script" uid="uid://ps4bl4k552ia" path="res://entities/items/item.gd" id="1_m0k53"] +[ext_resource type="Texture2D" uid="uid://b1f05yx168iat" path="res://assets/sprites/engrenage.png" id="2_0b3f0"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_l3fek"] +radius = 8.0 + +[node name="Item" type="Node2D" unique_id=1691516870] + +[node name="Area2D" type="Area2D" parent="." unique_id=260230698] +collision_layer = 8 +collision_mask = 0 +script = ExtResource("1_m0k53") + +[node name="Sprite2D" type="Sprite2D" parent="Area2D" unique_id=1835094462] +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_0b3f0") +region_enabled = true +region_rect = Rect2(0, 0, 32, 32) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D" unique_id=1351590810] +shape = SubResource("CircleShape2D_l3fek") diff --git a/entities/items/item.gd b/entities/items/item.gd index c82518a..5657c7b 100644 --- a/entities/items/item.gd +++ b/entities/items/item.gd @@ -7,4 +7,4 @@ extends Area2D func interact() -> void: GameState.add_item(item_id) print("Ramassé : ", item_name) - queue_free() # supprime l'item de la scène + queue_free() diff --git a/entities/items/pushable box/pushable_box.gd b/entities/items/pushable box/pushable_box.gd new file mode 100644 index 0000000..c66cf4d --- /dev/null +++ b/entities/items/pushable box/pushable_box.gd @@ -0,0 +1,13 @@ +class_name PushableBox +extends CharacterBody2D + +func _ready() -> void: + add_to_group("pushable") + +func try_push(direction: Vector2, tile_size: float) -> bool: + var motion := direction * tile_size + var collision := move_and_collide(motion) + if collision: + move_and_collide(-motion) + return false + return true diff --git a/entities/items/pushable box/pushable_box.gd.uid b/entities/items/pushable box/pushable_box.gd.uid new file mode 100644 index 0000000..3dae953 --- /dev/null +++ b/entities/items/pushable box/pushable_box.gd.uid @@ -0,0 +1 @@ +uid://ghp173k2ioey diff --git a/entities/items/pushable box/pushable_box.tscn b/entities/items/pushable box/pushable_box.tscn new file mode 100644 index 0000000..ecfd7c3 --- /dev/null +++ b/entities/items/pushable box/pushable_box.tscn @@ -0,0 +1,21 @@ +[gd_scene format=3 uid="uid://1x65ioo8tdro"] + +[ext_resource type="Texture2D" uid="uid://bbr6t3088svah" path="res://assets/tilesets/entrepot-tilesets.png" id="1_1rdxk"] +[ext_resource type="Script" uid="uid://ghp173k2ioey" path="res://entities/items/pushable box/pushable_box.gd" id="1_cwr2g"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cwr2g"] +size = Vector2(26, 28) + +[node name="PushableBox" type="CharacterBody2D" unique_id=418482729] +collision_layer = 32 +collision_mask = 33 +script = ExtResource("1_cwr2g") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=1829584255] +texture = ExtResource("1_1rdxk") +region_enabled = true +region_rect = Rect2(128, 64, 32, 32) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=330974052] +position = Vector2(0, -2) +shape = SubResource("RectangleShape2D_cwr2g") diff --git a/entities/npcs/vrac7/vrac7.gd b/entities/npcs/vrac7/vrac7.gd index 025c0da..d855a89 100644 --- a/entities/npcs/vrac7/vrac7.gd +++ b/entities/npcs/vrac7/vrac7.gd @@ -118,7 +118,7 @@ func _on_repair_done() -> void: var hud: HUD = get_tree().get_first_node_in_group("hud") if hud: hud.show_log("Unité VRAC-7 : réparation complète. Statut : opérationnel.") - await get_tree().create_timer(0.5).timeout + await get_tree().create_timer(3).timeout hud.show_log("Clé magnétique obtenue. Accès atelier déverrouillé.") # Dialogue post-réparation diff --git a/entities/player/player.gd b/entities/player/player.gd index d5fe6e0..ad33b07 100644 --- a/entities/player/player.gd +++ b/entities/player/player.gd @@ -1,9 +1,11 @@ extends CharacterBody2D const SPEED := 120 +const TILE_SIZE := 16 @onready var sprite := $AnimatedSprite2D @onready var interaction_area := $InteractionArea +@onready var push_ray := $PushRay @onready var hud : HUD = get_tree().get_first_node_in_group("hud") @@ -20,16 +22,40 @@ func _ready() -> void: add_to_group("player") interaction_area.area_entered.connect(_on_interaction_area_area_entered) interaction_area.area_exited.connect(_on_interaction_area_area_exited) + if push_ray: + push_ray.target_position = Vector2(17, 0) func _physics_process(_delta: float) -> void: + if is_locked: + velocity = Vector2.ZERO + move_and_slide() + return + var direction := Input.get_vector( "move_left", "move_right", "move_up", "move_down" ) + + if push_ray and direction != Vector2.ZERO: + var dominant := _dominant_direction(direction) + push_ray.target_position = dominant * (TILE_SIZE / 2.0 + 1) + push_ray.force_raycast_update() + + if push_ray.is_colliding(): + var collider = push_ray.get_collider() + if collider is PushableBox: + collider.try_push(dominant, TILE_SIZE) + velocity = direction * SPEED move_and_slide() position = position.round() _update_animation(direction) +func _dominant_direction(dir: Vector2) -> Vector2: + if abs(dir.x) > abs(dir.y): + return Vector2(sign(dir.x), 0) + else: + return Vector2(0, sign(dir.y)) + func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("interact") and interactable: interactable.interact() diff --git a/entities/player/player.tscn b/entities/player/player.tscn index 6dd9a42..97274ef 100644 --- a/entities/player/player.tscn +++ b/entities/player/player.tscn @@ -509,7 +509,8 @@ animations = [{ size = Vector2(45.375, 42.84375) [node name="CharacterBody2D" type="CharacterBody2D" unique_id=1424887591] -collision_layer = 3 +collision_layer = 2 +collision_mask = 33 script = ExtResource("1_fkugw") [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=2097287881] @@ -534,3 +535,7 @@ collision_mask = 12 position = Vector2(1, 9) shape = SubResource("RectangleShape2D_bectd") debug_color = Color(0.9411765, 0, 0.29411766, 0.19607843) + +[node name="PushRay" type="RayCast2D" parent="." unique_id=121926408] +target_position = Vector2(32, 0) +collision_mask = 32 diff --git a/levels/entrepot/entrepot.tscn b/levels/entrepot/entrepot.tscn index 0e7c310..7a9d8af 100644 --- a/levels/entrepot/entrepot.tscn +++ b/levels/entrepot/entrepot.tscn @@ -6,7 +6,9 @@ [ext_resource type="PackedScene" uid="uid://bb3olg2rlygdc" path="res://entities/npcs/vrac7/vrac7.tscn" id="3_jr8qv"] [ext_resource type="PackedScene" uid="uid://jrjxu1xfx0ud" path="res://ui/dialogue_box.tscn" id="5_s155k"] [ext_resource type="PackedScene" uid="uid://o7qrmpywwhu8" path="res://ui/hud.tscn" id="6_kejd5"] -[ext_resource type="PackedScene" uid="uid://grs5ypwkxv3x" path="res://entities/items/item.tscn" id="6_srx2q"] +[ext_resource type="PackedScene" uid="uid://cge56ob5tt4o6" path="res://entities/items/engrenage/engrenage.tscn" id="7_1p1pm"] +[ext_resource type="PackedScene" uid="uid://1x65ioo8tdro" path="res://entities/items/pushable box/pushable_box.tscn" id="7_dm063"] +[ext_resource type="PackedScene" uid="uid://c52luh50w8hi2" path="res://levels/unlock_zone.tscn" id="8_dm063"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_n70cd"] texture = ExtResource("1_qvgxo") @@ -149,7 +151,6 @@ sources/0 = SubResource("TileSetAtlasSource_n70cd") script = ExtResource("1_ptc2q") [node name="Hud" parent="." unique_id=1774402684 instance=ExtResource("6_kejd5")] -position = Vector2(199, 301) [node name="DialogueBox" parent="." unique_id=1374394268 instance=ExtResource("5_s155k")] position = Vector2(-118, 137) @@ -196,8 +197,20 @@ tile_set = SubResource("TileSet_jr8qv") [node name="Other" type="TileMapLayer" parent="Map" unique_id=985720640] tile_set = SubResource("TileSet_jr8qv") -[node name="Item" parent="Map" unique_id=1691516870 instance=ExtResource("6_srx2q")] -position = Vector2(136, 263) +[node name="Engrenage" parent="Map" unique_id=46489013 instance=ExtResource("7_1p1pm")] +position = Vector2(167, 263) + +[node name="HiddenEngrenage" parent="Map" unique_id=1691516870 instance=ExtResource("7_1p1pm")] +visible = false +position = Vector2(455, 328) + +[node name="PushableBox" parent="Map" unique_id=418482729 instance=ExtResource("7_dm063")] +position = Vector2(392, 420) + +[node name="UnlockZone" parent="Map" unique_id=448954065 instance=ExtResource("8_dm063")] +position = Vector2(458, 376) +scale = Vector2(5, 6.5) +node_to_reveal = NodePath("../HiddenEngrenage") [node name="Player" parent="." unique_id=628518902 instance=ExtResource("2_n70cd")] z_index = 1 diff --git a/levels/unlock_zone.gd b/levels/unlock_zone.gd new file mode 100644 index 0000000..a1db370 --- /dev/null +++ b/levels/unlock_zone.gd @@ -0,0 +1,26 @@ +class_name UnlockZone +extends Area2D + +@export var flag_to_set: String = "" +@export var node_to_reveal: NodePath = NodePath("") + +var _triggered := false + +func _ready() -> void: + body_entered.connect(_on_body_entered) + +func _on_body_entered(body: Node) -> void: + if _triggered: + return + if not body.is_in_group("pushable"): + return + + _triggered = true + + if flag_to_set != "": + GameState.set_flag(flag_to_set, true) + + if not node_to_reveal.is_empty(): + var node = get_node_or_null(node_to_reveal) + if node: + node.show() diff --git a/levels/unlock_zone.gd.uid b/levels/unlock_zone.gd.uid new file mode 100644 index 0000000..838120e --- /dev/null +++ b/levels/unlock_zone.gd.uid @@ -0,0 +1 @@ +uid://bp7xyba18cvpj diff --git a/levels/unlock_zone.tscn b/levels/unlock_zone.tscn new file mode 100644 index 0000000..88a7220 --- /dev/null +++ b/levels/unlock_zone.tscn @@ -0,0 +1,13 @@ +[gd_scene format=3 uid="uid://c52luh50w8hi2"] + +[ext_resource type="Script" uid="uid://bp7xyba18cvpj" path="res://levels/unlock_zone.gd" id="1_s6vo7"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ucfsg"] + +[node name="UnlockZone" type="Area2D" unique_id=448954065] +collision_layer = 16 +collision_mask = 32 +script = ExtResource("1_s6vo7") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1908169056] +shape = SubResource("RectangleShape2D_ucfsg") diff --git a/ui/hud.tscn b/ui/hud.tscn index be12a01..3981c94 100644 --- a/ui/hud.tscn +++ b/ui/hud.tscn @@ -1,6 +1,7 @@ [gd_scene format=3 uid="uid://o7qrmpywwhu8"] [ext_resource type="Script" uid="uid://bmqknwqr5mtd6" path="res://ui/hud.gd" id="1_rbyyf"] +[ext_resource type="Texture2D" uid="uid://b1f05yx168iat" path="res://assets/sprites/engrenage.png" id="2_276te"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rbyyf"] bg_color = Color(0.101960786, 0.101960786, 0.101960786, 0.84705883) @@ -37,6 +38,7 @@ layout_mode = 2 [node name="Icon" type="TextureRect" parent="InventoryBar/ItemRow/EngrenageSlot" unique_id=1231030010] layout_mode = 2 +texture = ExtResource("2_276te") [node name="Count" type="Label" parent="InventoryBar/ItemRow/EngrenageSlot" unique_id=1232241990] layout_mode = 2