From 4599dadf6ebab1c5684f27e3aaf45b02d20111a9 Mon Sep 17 00:00:00 2001 From: freewu32 <2217332562@qq.com> Date: Sat, 5 Sep 2020 13:25:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BE=E9=89=B4npc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Main.gd | 6 ++ Main.tscn | 8 +- src/hud/HUD.gd | 3 + src/level/LevelsManager.gd | 1 - src/levels/Level1.tscn | 13 +--- src/levels/Level2.tscn | 129 ++------------------------------ src/levels/Level3.tscn | 16 ++-- src/monster/Monster.tscn | 3 +- src/npc/BookNpc.tscn | 22 ++++++ src/npc/GiveBook.gd | 6 ++ src/npc/ThiefNpc.tscn | 137 +++++++++++++++++++++++----------- src/npc/npc_spriteframes.tres | 32 ++++++++ src/player/Player.gd | 16 +++- 13 files changed, 196 insertions(+), 196 deletions(-) create mode 100644 src/npc/BookNpc.tscn create mode 100644 src/npc/GiveBook.gd create mode 100644 src/npc/npc_spriteframes.tres diff --git a/Main.gd b/Main.gd index 1f5c8c4..ad62c05 100644 --- a/Main.gd +++ b/Main.gd @@ -17,6 +17,7 @@ func connect_player_properties_update(): player.connect("yellow_key_changed",self,"on_yellow_key_changed") player.connect("blue_key_changed",self,"on_blue_key_changed") player.connect("red_key_changed",self,"on_red_key_changed") + player.connect("prop_added",self,"on_prop_added") func connect_button(): $"/root/Main/HUD/BottomBackground/VBoxContainer/SaveButton".connect("pressed",self,"on_save_button_clicked") @@ -56,6 +57,11 @@ func on_level_changed(level): connect_player_properties_update() get_hud().get_level_view().text = "%s层" % level +func on_prop_added(name): + match name: + "book": + get_hud().get_book_button_view().visible = true + func on_save_button_clicked(): get_level_manager().save_persistent(0) diff --git a/Main.tscn b/Main.tscn index 99300f2..45c1321 100644 --- a/Main.tscn +++ b/Main.tscn @@ -302,6 +302,7 @@ __meta__ = { } [node name="BookButton" type="TextureButton" parent="HUD/BottomBackground/VBoxContainer"] +visible = false margin_right = 36.0 margin_bottom = 32.0 size_flags_horizontal = 3 @@ -336,15 +337,14 @@ size_flags_horizontal = 3 texture_normal = SubResource( 11 ) [node name="SaveButton" type="TextureButton" parent="HUD/BottomBackground/VBoxContainer"] -margin_left = 44.0 -margin_right = 80.0 +margin_right = 36.0 margin_bottom = 32.0 size_flags_horizontal = 3 texture_normal = SubResource( 12 ) [node name="LoadButton" type="TextureButton" parent="HUD/BottomBackground/VBoxContainer"] -margin_left = 88.0 -margin_right = 124.0 +margin_left = 44.0 +margin_right = 80.0 margin_bottom = 32.0 size_flags_horizontal = 3 texture_normal = SubResource( 13 ) diff --git a/src/hud/HUD.gd b/src/hud/HUD.gd index 8a33b90..12f85e1 100644 --- a/src/hud/HUD.gd +++ b/src/hud/HUD.gd @@ -32,6 +32,9 @@ func get_save_button_view() -> TextureButton: func get_load_button_view() -> TextureButton: return $"BottomBackground/VBoxContainer/Loadutton" as TextureButton +func get_book_button_view() -> TextureButton: + return $"BottomBackground/VBoxContainer/BookButton" as TextureButton + func get_book_dialog_view() -> PopupDialog: return $"BookDialog" as PopupDialog diff --git a/src/level/LevelsManager.gd b/src/level/LevelsManager.gd index b588d03..a38a07c 100644 --- a/src/level/LevelsManager.gd +++ b/src/level/LevelsManager.gd @@ -40,7 +40,6 @@ func load_data(next_level:int): load_data_from_local(next_level) #设置数据 level = next_level - #emit_signal("level_changed",next_level) # 设置楼层和位置 func set_level_and_position(next_level:int,position:Vector2): diff --git a/src/levels/Level1.tscn b/src/levels/Level1.tscn index b1a490e..7232795 100644 --- a/src/levels/Level1.tscn +++ b/src/levels/Level1.tscn @@ -87,54 +87,43 @@ position = Vector2( 114.1, 432 ) [node name="Monster" parent="Items" instance=ExtResource( 6 )] position = Vector2( 112, 144 ) -frame = 1 [node name="Monster2" parent="Items" instance=ExtResource( 6 )] position = Vector2( 144, 144 ) animation = "redSlime" -frame = 1 [node name="Monster4" parent="Items" instance=ExtResource( 6 )] position = Vector2( 336, 432 ) animation = "bat" -frame = 1 [node name="Monster9" parent="Items" instance=ExtResource( 6 )] position = Vector2( 240, 304 ) animation = "bat" -frame = 1 [node name="Monster10" parent="Items" instance=ExtResource( 6 )] position = Vector2( 272, 304 ) animation = "bluePriest" -frame = 1 [node name="Monster11" parent="Items" instance=ExtResource( 6 )] position = Vector2( 304, 304 ) animation = "bat" -frame = 1 [node name="Monster7" parent="Items" instance=ExtResource( 6 )] position = Vector2( 80, 240 ) animation = "skeleton" -frame = 1 [node name="Monster8" parent="Items" instance=ExtResource( 6 )] position = Vector2( 80, 336 ) animation = "skeletonSoilder" -frame = 1 [node name="Monster5" parent="Items" instance=ExtResource( 6 )] -position = Vector2( 306.1, 464 ) -frame = 1 +position = Vector2( 304, 464 ) [node name="Monster6" parent="Items" instance=ExtResource( 6 )] position = Vector2( 368, 464 ) -frame = 1 [node name="Monster3" parent="Items" instance=ExtResource( 6 )] position = Vector2( 176, 144 ) -frame = 1 [node name="Stairs" parent="Items" instance=ExtResource( 3 )] position = Vector2( 48, 144 ) diff --git a/src/levels/Level2.tscn b/src/levels/Level2.tscn index b745b84..8dfb614 100644 --- a/src/levels/Level2.tscn +++ b/src/levels/Level2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=2] +[gd_scene load_steps=14 format=2] [ext_resource path="res://src/player/Player.tscn" type="PackedScene" id=1] [ext_resource path="res://src/level/LevelInstance.gd" type="Script" id=2] @@ -11,113 +11,9 @@ [ext_resource path="res://src/props/YellowKey.tscn" type="PackedScene" id=9] [ext_resource path="res://src/stairs/StairsUp.tscn" type="PackedScene" id=10] [ext_resource path="res://src/props/BlueDrug.tscn" type="PackedScene" id=11] -[ext_resource path="res://assets/images/npcs.png" type="Texture" id=12] -[ext_resource path="res://src/npc/HelpEscape.gd" type="Script" id=13] +[ext_resource path="res://src/npc/ThiefNpc.tscn" type="PackedScene" id=12] [ext_resource path="res://src/monster/Monster.tscn" type="PackedScene" id=14] -[sub_resource type="RectangleShape2D" id=1] -extents = Vector2( 16, 16 ) - -[sub_resource type="AtlasTexture" id=2] -atlas = ExtResource( 12 ) -region = Rect2( 0, 64, 32, 32 ) - -[sub_resource type="AtlasTexture" id=3] -atlas = ExtResource( 12 ) -region = Rect2( 32, 64, 32, 32 ) - -[sub_resource type="SpriteFrames" id=4] -animations = [ { -"frames": [ SubResource( 2 ), SubResource( 3 ) ], -"loop": true, -"name": "thief", -"speed": 5.0 -} ] - -[sub_resource type="Animation" id=5] -resource_name = "leave" -tracks/0/type = "value" -tracks/0/path = NodePath(".:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 0.5 ), -"transitions": PoolRealArray( 1, 1 ), -"update": 0, -"values": [ Vector2( 48, 400 ), Vector2( 48, 464 ) ] -} -tracks/1/type = "value" -tracks/1/path = NodePath(".:modulate") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0.5, 1 ), -"transitions": PoolRealArray( 1, 1 ), -"update": 0, -"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] -} -tracks/2/type = "method" -tracks/2/path = NodePath("../Player") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/keys = { -"times": PoolRealArray( 1 ), -"transitions": PoolRealArray( 1 ), -"values": [ { -"args": [ ], -"method": "resume" -} ] -} - -[sub_resource type="Animation" id=6] -length = 1.5 -tracks/0/type = "value" -tracks/0/path = NodePath(".:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0.5, 1, 1.5 ), -"transitions": PoolRealArray( 1, 1, 1 ), -"update": 0, -"values": [ Vector2( 112, 336 ), Vector2( 48, 336 ), Vector2( 48, 400 ) ] -} -tracks/1/type = "method" -tracks/1/path = NodePath("../Items/HiddenDoor") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"values": [ { -"args": [ ], -"method": "open" -} ] -} -tracks/2/type = "method" -tracks/2/path = NodePath("../Player") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/keys = { -"times": PoolRealArray( 1.5 ), -"transitions": PoolRealArray( 1 ), -"values": [ { -"args": [ ], -"method": "resume" -} ] -} - [node name="Level2" type="Node2D"] script = ExtResource( 2 ) @@ -186,29 +82,14 @@ position = Vector2( 48, 464 ) [node name="MonsterSprite" parent="Items" instance=ExtResource( 14 )] position = Vector2( 208, 176 ) animation = "blueGuard" +frame = 0 [node name="MonsterSprite2" parent="Items" instance=ExtResource( 14 )] position = Vector2( 272, 176 ) animation = "blueGuard" +frame = 0 -[node name="Thief" type="StaticBody2D" parent="."] -position = Vector2( 112, 336 ) -script = ExtResource( 13 ) -__meta__ = { -"_edit_group_": true -} - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Thief"] -shape = SubResource( 1 ) - -[node name="AnimatedSprite" type="AnimatedSprite" parent="Thief"] -frames = SubResource( 4 ) -animation = "thief" -playing = true - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Thief"] -anims/leave = SubResource( 5 ) -anims/open_door = SubResource( 6 ) +[node name="Thief" parent="." instance=ExtResource( 12 )] [node name="Player" parent="." instance=ExtResource( 1 )] position = Vector2( 48, 176 ) diff --git a/src/levels/Level3.tscn b/src/levels/Level3.tscn index 47aff88..e8274aa 100644 --- a/src/levels/Level3.tscn +++ b/src/levels/Level3.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=2] +[gd_scene load_steps=19 format=2] [ext_resource path="res://src/level/LevelInstance.gd" type="Script" id=1] [ext_resource path="res://src/navigation/NavigationTileMap.gd" type="Script" id=2] @@ -16,6 +16,7 @@ [ext_resource path="res://src/props/BlueGemstone.tscn" type="PackedScene" id=14] [ext_resource path="res://src/props/RedGemstone.tscn" type="PackedScene" id=15] [ext_resource path="res://src/monster/Monster.tscn" type="PackedScene" id=16] +[ext_resource path="res://src/npc/BookNpc.tscn" type="PackedScene" id=17] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 0, 0.1 ) @@ -92,31 +93,32 @@ position = Vector2( 368, 464 ) [node name="MonsterSprite" parent="Items" instance=ExtResource( 16 )] position = Vector2( 240, 272 ) +frame = 1 [node name="MonsterSprite2" parent="Items" instance=ExtResource( 16 )] position = Vector2( 112, 272 ) animation = "bat" -frame = 0 +frame = 1 [node name="MonsterSprite6" parent="Items" instance=ExtResource( 16 )] position = Vector2( 336, 176 ) animation = "bat" -frame = 0 +frame = 1 [node name="MonsterSprite3" parent="Items" instance=ExtResource( 16 )] position = Vector2( 48, 208 ) animation = "bluePriest" -frame = 0 +frame = 1 [node name="MonsterSprite5" parent="Items" instance=ExtResource( 16 )] position = Vector2( 336, 368 ) animation = "bluePriest" -frame = 0 +frame = 1 [node name="MonsterSprite4" parent="Items" instance=ExtResource( 16 )] position = Vector2( 48, 336 ) animation = "skeleton" -frame = 0 +frame = 1 [node name="YellowDoor5" parent="Items" instance=ExtResource( 8 )] position = Vector2( 304, 464 ) @@ -139,6 +141,8 @@ position = Vector2( 80, 176 ) [node name="RedGemstone" parent="Items" instance=ExtResource( 15 )] position = Vector2( 80, 400 ) +[node name="BookNpc" parent="Items" instance=ExtResource( 17 )] + [node name="Player" parent="." instance=ExtResource( 4 )] position = Vector2( 80, 464 ) diff --git a/src/monster/Monster.tscn b/src/monster/Monster.tscn index ce57b13..e8419db 100644 --- a/src/monster/Monster.tscn +++ b/src/monster/Monster.tscn @@ -10,7 +10,7 @@ [ext_resource path="res://src/monster/monster_spriteframes.tres" type="SpriteFrames" id=8] [sub_resource type="RectangleShape2D" id=1] -extents = Vector2( 8, 8 ) +extents = Vector2( 15.9, 15.9 ) [sub_resource type="SpriteFrames" id=2] animations = [ { @@ -25,7 +25,6 @@ animations = [ { ]] frames = ExtResource( 8 ) animation = "greenSlime" -frame = 1 playing = true [node name="Monster" type="StaticBody2D" parent="."] diff --git a/src/npc/BookNpc.tscn b/src/npc/BookNpc.tscn new file mode 100644 index 0000000..a5a2b54 --- /dev/null +++ b/src/npc/BookNpc.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://src/npc/GiveBook.gd" type="Script" id=1] +[ext_resource path="res://src/npc/npc_spriteframes.tres" type="SpriteFrames" id=2] + +[sub_resource type="RectangleShape2D" id=2] +extents = Vector2( 16, 16 ) + +[node name="BookNpc" type="StaticBody2D"] +position = Vector2( 368, 240 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_group_": true +} + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = ExtResource( 2 ) +animation = "old_man" +playing = true diff --git a/src/npc/GiveBook.gd b/src/npc/GiveBook.gd new file mode 100644 index 0000000..f85e05e --- /dev/null +++ b/src/npc/GiveBook.gd @@ -0,0 +1,6 @@ +extends StaticBody2D + +func on_player_touched(player): + yield(Messages.showDialog("我给你怪物手册 它能预测出当前楼层各类怪物对你的伤害"),"hide") + player.add_prop("book") + queue_free() diff --git a/src/npc/ThiefNpc.tscn b/src/npc/ThiefNpc.tscn index 767b0ea..14984d9 100644 --- a/src/npc/ThiefNpc.tscn +++ b/src/npc/ThiefNpc.tscn @@ -1,54 +1,98 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=6 format=2] -[ext_resource path="res://assets/images/npcs.png" type="Texture" id=1] +[ext_resource path="res://src/npc/npc_spriteframes.tres" type="SpriteFrames" id=1] +[ext_resource path="res://src/npc/HelpEscape.gd" type="Script" id=2] [sub_resource type="RectangleShape2D" id=1] extents = Vector2( 16, 16 ) -[sub_resource type="AtlasTexture" id=2] -atlas = ExtResource( 1 ) -region = Rect2( 0, 64, 32, 32 ) - -[sub_resource type="AtlasTexture" id=3] -atlas = ExtResource( 1 ) -region = Rect2( 32, 64, 32, 32 ) - -[sub_resource type="AtlasTexture" id=4] -atlas = ExtResource( 1 ) -region = Rect2( 0, 0, 32, 32 ) - -[sub_resource type="AtlasTexture" id=5] -atlas = ExtResource( 1 ) -region = Rect2( 32, 0, 32, 32 ) - -[sub_resource type="AtlasTexture" id=6] -atlas = ExtResource( 1 ) -region = Rect2( 0, 32, 32, 32 ) - -[sub_resource type="AtlasTexture" id=7] -atlas = ExtResource( 1 ) -region = Rect2( 32, 32, 32, 32 ) - -[sub_resource type="SpriteFrames" id=8] -animations = [ { -"frames": [ SubResource( 2 ), SubResource( 3 ) ], -"loop": true, -"name": "thief", -"speed": 5.0 -}, { -"frames": [ SubResource( 4 ), SubResource( 5 ) ], -"loop": true, -"name": "old_man", -"speed": 5.0 -}, { -"frames": [ SubResource( 6 ), SubResource( 7 ) ], -"loop": true, -"name": "business_man", -"speed": 5.0 +[sub_resource type="Animation" id=2] +resource_name = "leave" +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 48, 400 ), Vector2( 48, 464 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0.5, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} +tracks/2/type = "method" +tracks/2/path = NodePath("../Player") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 1 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "resume" } ] +} -[node name="ThiefNpc" type="StaticBody2D"] +[sub_resource type="Animation" id=3] +length = 1.5 +tracks/0/type = "value" +tracks/0/path = NodePath(".:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0.5, 1, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 112, 336 ), Vector2( 48, 336 ), Vector2( 48, 400 ) ] +} +tracks/1/type = "method" +tracks/1/path = NodePath("../Items/HiddenDoor") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "open" +} ] +} +tracks/2/type = "method" +tracks/2/path = NodePath("../Player") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 1.5 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "resume" +} ] +} + +[node name="Thief" type="StaticBody2D"] position = Vector2( 112, 336 ) +script = ExtResource( 2 ) __meta__ = { "_edit_group_": true } @@ -57,7 +101,10 @@ __meta__ = { shape = SubResource( 1 ) [node name="AnimatedSprite" type="AnimatedSprite" parent="."] -frames = SubResource( 8 ) +frames = ExtResource( 1 ) animation = "thief" -frame = 1 playing = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/leave = SubResource( 2 ) +anims/open_door = SubResource( 3 ) diff --git a/src/npc/npc_spriteframes.tres b/src/npc/npc_spriteframes.tres new file mode 100644 index 0000000..166746f --- /dev/null +++ b/src/npc/npc_spriteframes.tres @@ -0,0 +1,32 @@ +[gd_resource type="SpriteFrames" load_steps=6 format=2] + +[ext_resource path="res://assets/images/npcs.png" type="Texture" id=1] + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 32, 32 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 1 ) +region = Rect2( 32, 0, 32, 32 ) + +[sub_resource type="AtlasTexture" id=1] +atlas = ExtResource( 1 ) +region = Rect2( 0, 64, 32, 32 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 32, 64, 32, 32 ) + +[resource] +animations = [ { +"frames": [ SubResource( 3 ), SubResource( 4 ) ], +"loop": true, +"name": "old_man", +"speed": 5.0 +}, { +"frames": [ SubResource( 1 ), SubResource( 2 ) ], +"loop": true, +"name": "thief", +"speed": 5.0 +} ] diff --git a/src/player/Player.gd b/src/player/Player.gd index 913ab71..8903060 100644 --- a/src/player/Player.gd +++ b/src/player/Player.gd @@ -19,6 +19,8 @@ export var yellow_key : int = 0 setget set_yellow_key export var blue_key : int = 0 setget set_blue_key export var red_key : int = 0 setget set_red_key +# 拥有的道具 +export var props : Array = [] var navigation_tile_map : NavigationTileMap @@ -35,6 +37,7 @@ signal money_changed(money) signal yellow_key_changed(yellow_key) signal blue_key_changed(blue_key) signal red_key_changed(red_key) +signal prop_added(prop_name) func _ready(): self.add_to_group("serializable") @@ -98,7 +101,8 @@ func save_data(data:Dictionary,global:Dictionary): global.player.money = money global.player.yellow_key = yellow_key global.player.blue_key = blue_key - global.player.red_key = red_key + global.player.red_key = red_key + global.player.props = props data.player_position = position # 还原游戏数据 @@ -112,6 +116,10 @@ func load_data(data:Dictionary,global:Dictionary): self.yellow_key = global.player.yellow_key self.blue_key = global.player.blue_key self.red_key = global.player.red_key + self.props = global.player.props + #通知 + for prop in self.props: + emit_signal("prop_added",prop) func set_hp(value): hp = value @@ -140,4 +148,8 @@ func set_blue_key(value): func set_red_key(value): red_key = value emit_signal("red_key_changed",value) - + +# 增加道具 +func add_prop(name:String)->void: + self.props.append(name) + emit_signal("prop_added",name)