diff --git a/assets/graphics/player/death/Player Death 64x64.png b/assets/graphics/player/death/Player Death 64x64.png new file mode 100644 index 0000000..2e6a1ae Binary files /dev/null and b/assets/graphics/player/death/Player Death 64x64.png differ diff --git a/assets/graphics/player/death/Player Death 64x64.png.import b/assets/graphics/player/death/Player Death 64x64.png.import new file mode 100644 index 0000000..b118302 --- /dev/null +++ b/assets/graphics/player/death/Player Death 64x64.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dht4cd2u7dkrb" +path="res://.godot/imported/Player Death 64x64.png-0c6ff54e7d9aad74b66dce47376541f8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/player/death/Player Death 64x64.png" +dest_files=["res://.godot/imported/Player Death 64x64.png-0c6ff54e7d9aad74b66dce47376541f8.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/graphics/player/hurt/Player Hurt 48x48.png b/assets/graphics/player/hurt/Player Hurt 48x48.png new file mode 100644 index 0000000..57d8783 Binary files /dev/null and b/assets/graphics/player/hurt/Player Hurt 48x48.png differ diff --git a/assets/graphics/player/hurt/Player Hurt 48x48.png.import b/assets/graphics/player/hurt/Player Hurt 48x48.png.import new file mode 100644 index 0000000..2f20f91 --- /dev/null +++ b/assets/graphics/player/hurt/Player Hurt 48x48.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://37of41hhcw7h" +path="res://.godot/imported/Player Hurt 48x48.png-a720e51cb19103e76b22ab6c1b81302d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/player/hurt/Player Hurt 48x48.png" +dest_files=["res://.godot/imported/Player Hurt 48x48.png-a720e51cb19103e76b22ab6c1b81302d.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/scenes/bullet.tscn b/scenes/bullet.tscn index 15d087f..cc0ba2c 100644 --- a/scenes/bullet.tscn +++ b/scenes/bullet.tscn @@ -21,4 +21,5 @@ rotation = 3.1415927 scale = Vector2(0.11, 0.11) texture = ExtResource("2_y25gk") +[connection signal="area_entered" from="." to="." method="_on_area_entered"] [connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/scenes/game.tscn b/scenes/game.tscn index f719ddb..6dde63b 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -431,12 +431,23 @@ texture_filter = 1 texture = ExtResource("4_kvpfn") offset = Vector2(200, 350) +[node name="Player" parent="." unique_id=735255374 instance=ExtResource("4_iywne")] +position = Vector2(594, 390) + +[node name="foreground" type="Parallax2D" parent="." unique_id=246559660] +scroll_scale = Vector2(1.3, 1) +repeat_size = Vector2(400, 0) + +[node name="Sprite2D" type="Sprite2D" parent="foreground" unique_id=1690720392] +texture = ExtResource("5_dinhu") +offset = Vector2(200, 340) + [node name="SceneManager" type="Node2D" parent="." unique_id=1778809182] script = ExtResource("2_lbhrr") [node name="TileMapLayer" type="TileMapLayer" parent="." unique_id=374407051] texture_filter = 1 -tile_map_data = PackedByteArray("AAASAA0AAAAEAAAAAAAVAA0AAAAAAAAAAAAWAA0AAAABAAAAAAAXAA0AAAABAAAAAAAYAA0AAAAHAAQAAAAYAAwAAAAGAAMAAAAYAAsAAAAAAAAAAAAZAAsAAAABAAAAAAAZAAwAAAABAAIAAAAaAAwAAAACAAIAAAAaAAsAAAACAAAAAAAWAAkAAAACAAQAAAAVAAkAAAAAAAQAAAANABIAAAABAAAAAAAOABIAAAABAAAAAAAPABIAAAABAAAAAAAQABIAAAABAAAAAAARABIAAAABAAAAAAASABIAAAABAAAAAAATABIAAAABAAAAAAAUABIAAAABAAAAAAAVABIAAAABAAAAAAAWABIAAAABAAAAAAAXABIAAAABAAAAAAAYABIAAAABAAAAAAAZABIAAAABAAAAAAAaABIAAAABAAAAAAAbABIAAAAHAAEAAAAbABEAAAAAAAAAAAAcABEAAAACAAAAAAAcABIAAAACAAEAAAANABMAAAAHAAAAAAAOABMAAAAGAAEAAAAPABMAAAAHAAEAAAAQABMAAAAHAAAAAAAQABQAAAAKAAQAAAAPABQAAAAJAAQAAAAOABQAAAABAAIAAAANABQAAAAAAAIAAAARABMAAAAGAAAAAAASABMAAAAGAAAAAAATABMAAAAHAAAAAAASABQAAAAJAAQAAAARABQAAAAJAAQAAAAYABMAAAAGAAAAAAAZABMAAAAGAAAAAAAaABMAAAAGAAAAAAAaABQAAAABAAIAAAAbABMAAAAGAAAAAAAcABMAAAACAAIAAAAbABQAAAACAAIAAAAYABQAAAABAAIAAAAXABMAAAAHAAAAAAAWABMAAAAGAAAAAAAVABMAAAAGAAAAAAAVABQAAAABAAIAAAAUABMAAAAGAAAAAAAUABQAAAAJAAQAAAATABQAAAAKAAQAAAAWABQAAAABAAIAAAAXABQAAAABAAIAAAAZABQAAAABAAIAAAALABMAAAABAAIAAAAMABMAAAABAAIAAAAMABIAAAABAAAAAAALABIAAAABAAAAAAAKABIAAAABAAAAAAAKABMAAAABAAIAAAAJABMAAAAAAAIAAAAJABIAAAAQAAEAAAAIABIAAAAAAAIAAAAIABEAAAAAAAEAAAAJABEAAAACAAEAAAAIABAAAAAAAAEAAAAIAA8AAAAHAAAAAAAJAA8AAAACAAEAAAAJABAAAAACAAEAAAAIAA4AAAABAAAAAAAHAA8AAAAAAAIAAAAHAA4AAAAGAAQAAAAHAA0AAAAQAAMAAAAGAA0AAAAPAAQAAAAGAAwAAAAEAAEAAAAGAAsAAAAPAAMAAAAHAAsAAAABAAQAAAAIAAsAAAABAAQAAAAJAAsAAAAKAAQAAAAKAAsAAAACAAIAAAAKAAoAAAACAAAAAAAJAAoAAAAAAAAAAAANABAAAAACAAQAAAAMABAAAAABAAQAAAALABAAAAAAAAQAAAAVAAwAAQAAAAAAAAAYAAoAAQAAAAAAAAAZAAoAAQAAAAAAAAAIAA0AAQAAAAAAAAAJAAkAAQAAAAAAAAAWAAwAAgAAAAEAAAAWAAsAAgAAAAAAAAAbABAAAgAAAAEAAAAbAA8AAgAAAAAAAAAaABEAAQAAAAAAAAAYAA4AAAACAAIAAAAXAA4AAAABAAIAAAAWAA4AAAABAAIAAAAVAA4AAAAKAAQAAAAUAA4AAAABAAQAAAATAA4AAAABAAQAAAASAA4AAAAMAAQAAAARAA4AAAABAAQAAAAQAA4AAAABAAQAAAAPAA4AAAABAAQAAAAOAA4AAAABAAQAAAANAA4AAAABAAQAAAAMAA4AAAABAAQAAAALAA4AAAABAAQAAAAKAA4AAAABAAQAAAAJAA4AAAAJAAMAAAA=") +tile_map_data = PackedByteArray("AAASAA0AAAAEAAAAAAAVAA0AAAAAAAAAAAAWAA0AAAABAAAAAAAXAA0AAAABAAAAAAAYAA0AAAAHAAQAAAAYAAwAAAAGAAMAAAAYAAsAAAAAAAAAAAAZAAsAAAABAAAAAAAZAAwAAAABAAIAAAAaAAwAAAACAAIAAAAaAAsAAAACAAAAAAAWAAkAAAACAAQAAAAVAAkAAAAAAAQAAAANABIAAAABAAAAAAAOABIAAAABAAAAAAAPABIAAAABAAAAAAAQABIAAAABAAAAAAARABIAAAABAAAAAAASABIAAAABAAAAAAATABIAAAABAAAAAAAUABIAAAABAAAAAAAVABIAAAABAAAAAAAWABIAAAABAAAAAAAXABIAAAABAAAAAAAYABIAAAABAAAAAAAZABIAAAABAAAAAAAaABIAAAABAAAAAAAbABIAAAAHAAEAAAAbABEAAAAAAAAAAAAcABEAAAACAAAAAAAcABIAAAACAAEAAAANABMAAAAHAAAAAAAOABMAAAAGAAEAAAAPABMAAAAHAAEAAAAQABMAAAAHAAAAAAAQABQAAAAKAAQAAAAPABQAAAAJAAQAAAAOABQAAAABAAIAAAANABQAAAAAAAIAAAARABMAAAAGAAAAAAASABMAAAAGAAAAAAATABMAAAAHAAAAAAASABQAAAAJAAQAAAARABQAAAAJAAQAAAAYABMAAAAGAAAAAAAZABMAAAAGAAAAAAAaABMAAAAGAAAAAAAaABQAAAABAAIAAAAbABMAAAAGAAAAAAAcABMAAAACAAIAAAAbABQAAAACAAIAAAAYABQAAAABAAIAAAAXABMAAAAHAAAAAAAWABMAAAAGAAAAAAAVABMAAAAGAAAAAAAVABQAAAABAAIAAAAUABMAAAAGAAAAAAAUABQAAAAJAAQAAAATABQAAAAKAAQAAAAWABQAAAABAAIAAAAXABQAAAABAAIAAAAZABQAAAABAAIAAAALABMAAAABAAIAAAAMABMAAAABAAIAAAAMABIAAAABAAAAAAALABIAAAABAAAAAAAKABIAAAABAAAAAAAKABMAAAABAAIAAAAJABMAAAAAAAIAAAAJABIAAAAQAAEAAAAIABIAAAAAAAIAAAAIABEAAAAAAAEAAAAJABEAAAACAAEAAAAIABAAAAAAAAEAAAAIAA8AAAAHAAAAAAAJAA8AAAACAAEAAAAJABAAAAACAAEAAAAIAA4AAAABAAAAAAAHAA8AAAAAAAIAAAAHAA4AAAAQAAEAAAAHAA0AAAACAAAAAAAGAA0AAAAGAAQAAAAGAAwAAAAEAAEAAAAGAAsAAAAPAAMAAAAHAAsAAAABAAQAAAAIAAsAAAABAAQAAAAJAAsAAAAKAAQAAAAKAAsAAAACAAIAAAAKAAoAAAACAAAAAAAJAAoAAAAAAAAAAAANABAAAAACAAQAAAAMABAAAAABAAQAAAALABAAAAAAAAQAAAAVAAwAAQAAAAAAAAAYAAoAAQAAAAAAAAAZAAoAAQAAAAAAAAAIAA0AAQAAAAAAAAAJAAkAAQAAAAAAAAAWAAwAAgAAAAEAAAAWAAsAAgAAAAAAAAAbABAAAgAAAAEAAAAbAA8AAgAAAAAAAAAaABEAAQAAAAAAAAAYAA4AAAAJAAQAAAAXAA4AAAABAAIAAAAWAA4AAAABAAIAAAAVAA4AAAAKAAQAAAAUAA4AAAABAAQAAAATAA4AAAABAAQAAAASAA4AAAAMAAQAAAARAA4AAAABAAQAAAAQAA4AAAABAAQAAAAPAA4AAAABAAQAAAAOAA4AAAABAAQAAAANAA4AAAABAAQAAAAMAA4AAAABAAQAAAALAA4AAAABAAQAAAAKAA4AAAABAAQAAAAJAA4AAAAJAAMAAAAZAA4AAAABAAQAAAAaAA4AAAABAAQAAAAbAA4AAAABAAQAAAAcAA4AAAABAAQAAAAdAA4AAAAKAAQAAAAdAA0AAAAAAAAAAAAeAA0AAAAPAAEAAAAeAAwAAAAAAAEAAAAeAAsAAAAAAAAAAAAfAAwAAAACAAEAAAAeAA4AAAACAAIAAAAfAA0AAAACAAIAAAAfAAsAAAAHAAQAAAAfAAoAAAAEAAEAAAAfAAkAAAAEAAAAAAAGAA4AAAAKAAQAAAAFAA4AAAABAAQAAAAEAA4AAAABAAQAAAADAA4AAAAJAAQAAAACAA4AAAABAAIAAAABAA4AAAAKAAQAAAAAAA4AAAAAAAQAAAADAA0AAAACAAEAAAACAA0AAAAGAAAAAAABAA0AAAAAAAEAAAABAAwAAAAAAAAAAAACAAwAAAAHAAEAAAACAAsAAAAAAAAAAAADAAsAAAACAAAAAAADAAwAAAACAAEAAAAPAAsAAAACAAQAAAAOAAsAAAABAAQAAAANAAsAAAAAAAQAAAA=") tile_set = SubResource("TileSet_mvphy") [node name="StaticBody2D" type="StaticBody2D" parent="." unique_id=1148293182] @@ -446,9 +457,6 @@ metadata/_edit_group_ = true [node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D" unique_id=1634682333] shape = SubResource("RectangleShape2D_mvphy") -[node name="Player" parent="." unique_id=735255374 instance=ExtResource("4_iywne")] -position = Vector2(594, 390) - [node name="StaticBody2D2" type="StaticBody2D" parent="." unique_id=958110307] position = Vector2(538, 582) metadata/_edit_group_ = true @@ -465,14 +473,6 @@ position = Vector2(390, 541) position = Vector2(514, 502) effect = "teleport" -[node name="foreground" type="Parallax2D" parent="." unique_id=246559660] -scroll_scale = Vector2(1.3, 1) -repeat_size = Vector2(400, 0) - -[node name="Sprite2D" type="Sprite2D" parent="foreground" unique_id=1690720392] -texture = ExtResource("5_dinhu") -offset = Vector2(200, 340) - [node name="Crates" type="Node2D" parent="." unique_id=104104750] [node name="Crate" parent="Crates" unique_id=1367266345 instance=ExtResource("3_iywne")] diff --git a/scenes/player.tscn b/scenes/player.tscn index 3314295..449bb1c 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -3,14 +3,72 @@ [ext_resource type="Script" uid="uid://ct34rf6jscqmo" path="res://scripts/player.gd" id="1_3vyb7"] [ext_resource type="Texture2D" uid="uid://dq1io4uxs544h" path="res://assets/graphics/player/jump_fall/player jump 48x48.png" id="2_dqkch"] [ext_resource type="Texture2D" uid="uid://cv1an7bix4lg4" path="res://assets/graphics/player/idle/Player Idle 48x48.png" id="2_g2els"] +[ext_resource type="Texture2D" uid="uid://dht4cd2u7dkrb" path="res://assets/graphics/player/death/Player Death 64x64.png" id="2_tuyoq"] [ext_resource type="Texture2D" uid="uid://rdkrvqncrci5" path="res://assets/graphics/player/run/player run 48x48.png" id="3_qhqgy"] +[ext_resource type="Texture2D" uid="uid://37of41hhcw7h" path="res://assets/graphics/player/hurt/Player Hurt 48x48.png" id="3_qlg0r"] [sub_resource type="CircleShape2D" id="CircleShape2D_o7s7a"] +[sub_resource type="AtlasTexture" id="AtlasTexture_pf23h"] +atlas = ExtResource("2_tuyoq") +region = Rect2(0, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dt7fs"] +atlas = ExtResource("2_tuyoq") +region = Rect2(48, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wqfne"] +atlas = ExtResource("2_tuyoq") +region = Rect2(96, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wnwbv"] +atlas = ExtResource("2_tuyoq") +region = Rect2(144, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gl8cc"] +atlas = ExtResource("2_tuyoq") +region = Rect2(192, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_487ah"] +atlas = ExtResource("2_tuyoq") +region = Rect2(240, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_md1ol"] +atlas = ExtResource("2_tuyoq") +region = Rect2(288, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bj30b"] +atlas = ExtResource("2_tuyoq") +region = Rect2(336, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jc3p3"] +atlas = ExtResource("2_tuyoq") +region = Rect2(384, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hax0n"] +atlas = ExtResource("2_tuyoq") +region = Rect2(432, 0, 48, 48) + [sub_resource type="AtlasTexture" id="AtlasTexture_i4ail"] atlas = ExtResource("2_dqkch") region = Rect2(96, 0, 48, 48) +[sub_resource type="AtlasTexture" id="AtlasTexture_l71n6"] +atlas = ExtResource("3_qlg0r") +region = Rect2(0, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ke2ow"] +atlas = ExtResource("3_qlg0r") +region = Rect2(48, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ujl30"] +atlas = ExtResource("3_qlg0r") +region = Rect2(96, 0, 48, 48) + +[sub_resource type="AtlasTexture" id="AtlasTexture_31cv2"] +atlas = ExtResource("3_qlg0r") +region = Rect2(144, 0, 48, 48) + [sub_resource type="AtlasTexture" id="AtlasTexture_qhqgy"] atlas = ExtResource("2_g2els") region = Rect2(0, 0, 48, 48) @@ -95,6 +153,41 @@ region = Rect2(336, 0, 48, 48) animations = [{ "frames": [{ "duration": 1.0, +"texture": SubResource("AtlasTexture_pf23h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dt7fs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wqfne") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wnwbv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gl8cc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_487ah") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_md1ol") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bj30b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jc3p3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hax0n") +}], +"loop": 0, +"name": &"death", +"speed": 12.0 +}, { +"frames": [{ +"duration": 1.0, "texture": SubResource("AtlasTexture_i4ail") }], "loop": 2, @@ -103,6 +196,23 @@ animations = [{ }, { "frames": [{ "duration": 1.0, +"texture": SubResource("AtlasTexture_l71n6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ke2ow") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ujl30") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_31cv2") +}], +"loop": 0, +"name": &"hurt", +"speed": 12.0 +}, { +"frames": [{ +"duration": 1.0, "texture": SubResource("AtlasTexture_qhqgy") }, { "duration": 1.0, @@ -192,16 +302,16 @@ target_position = Vector2(16, 0) target_position = Vector2(-16, 0) [node name="RightSpawn" type="Marker2D" parent="." unique_id=1276129807] -position = Vector2(14, -6) +position = Vector2(17, 0) [node name="LeftSpawn" type="Marker2D" parent="." unique_id=522145742] -position = Vector2(-15, -6) +position = Vector2(-18, 0) [node name="PlayerGraphic" type="AnimatedSprite2D" parent="." unique_id=1106134562] texture_filter = 1 position = Vector2(0, -6) sprite_frames = SubResource("SpriteFrames_mvphy") -animation = &"fall" +animation = &"death" autoplay = "idle" [node name="Camera2D" type="Camera2D" parent="." unique_id=2099904623] diff --git a/scripts/bullet.gd b/scripts/bullet.gd index 796fd93..e1b55fa 100644 --- a/scripts/bullet.gd +++ b/scripts/bullet.gd @@ -19,3 +19,7 @@ func _on_body_entered(body: Node2D) -> void: func setSpeed(value)->void: speed = value + + +func _on_area_entered(area: Area2D) -> void: + bulletDamageSignal.emit(area, self) diff --git a/scripts/gamecontroller.gd b/scripts/gamecontroller.gd index 4b455dc..640dcc3 100644 --- a/scripts/gamecontroller.gd +++ b/scripts/gamecontroller.gd @@ -2,12 +2,20 @@ class_name GameController extends Node2D signal teleportSignal(body:RigidBody2D) signal destroySignal(body) +signal damageSignal(body) var numberOfCrates = 2 var totalCoins = 0 var coinsRemaining = 0 var coinsCollected = 0 +var enemiesDict={} +var playerStats={ + "health": 100, + "meleeDamage": 20, + "rangeDamage": 20 +} + # Called when the node enters the scene tree for the first time. func _ready() -> void: get_window().grab_focus() @@ -29,11 +37,22 @@ func _on_trigger(effect: Variant, Object: Variant) -> void: if Object is Crate: teleportSignal.emit(Object) -func _on_bullet_hit(body, bullet) -> void: - print("GC knows bullet hit") +func _on_bullet_hit(body, bullet) -> void: if body is Crate: destroySignal.emit(body) destroySignal.emit(bullet) + if body is Slime: + #damage the slime + enemiesDict[body]["health"] -= playerStats.rangeDamage + if(enemiesDict[body]["health"] <=0): + print("enemy dead") + destroySignal.emit(body) + destroySignal.emit(bullet) + removeEnemyFromLevel(body) + else: + print("enemy damaged") + destroySignal.emit(bullet) + damageSignal.emit(body) func crateTotal(amount)->void: @@ -50,3 +69,27 @@ func coinCollected(body, coin)->void: #give them a coin coinsCollected +=1 destroySignal.emit(coin) +func slimeAttack(body, slime)->void: + print("GC knows slime attacked player for "+str(enemiesDict[slime].meleeDamage)) + playerStats.health -= enemiesDict[slime].meleeDamage + if playerStats.health <=0: + #kill the player + destroySignal.emit(body) + else: + #damage the player + print("you took damage") + damageSignal.emit(body) +func addEnemyToLevel(enemy:Slime)->void: + #make some stats for the bad guy + var stats = { + "health": 100, + "meleeDamage": 10 + } + #add em to a dictionary of enemies + enemiesDict[enemy]=stats +func removeEnemyFromLevel(enemy)->void: + enemiesDict.erase(enemy) + +func levelChange()->void: + print("change levels (reload)") + get_tree().reload_current_scene() diff --git a/scripts/player.gd b/scripts/player.gd index 01d4963..c821838 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -11,10 +11,11 @@ class_name Player extends CharacterBody2D var direction signal bulletSignal(pos, speed) +signal deathCompleteSignal enum FaceDirection {LEFT,RIGHT} var facing:FaceDirection = FaceDirection.RIGHT -enum PlayerStates {IDLE,RUNNING,JUMPING,FALLING} +enum PlayerStates {IDLE,RUNNING,JUMPING,FALLING, HURT, DEAD} var current_player_state:PlayerStates = PlayerStates.IDLE var upJump:bool = false @@ -31,8 +32,8 @@ func _physics_process(delta: float) -> void: # Add the gravity. if not is_on_floor(): velocity += get_gravity() * delta - - handle_input() + if not current_player_state == PlayerStates.DEAD: + handle_input() handle_movement() handle_states() handle_animations() @@ -40,7 +41,11 @@ func _physics_process(delta: float) -> void: handle_collisions() - +func takeDamage()->void: + current_player_state = PlayerStates.HURT +func kill()->void: + current_player_state = PlayerStates.DEAD + func handle_input()->void: # Handle shoot if Input.is_action_just_pressed("shoot"): @@ -91,7 +96,6 @@ func handle_collisions()->void: c.get_collider().apply_central_impulse(-c.get_normal() * bump_power ) if right_cast.is_colliding(): - print("Something on my right") #get the thing I can shove var collider = right_cast.get_collider() if collider is RigidBody2D: @@ -101,7 +105,6 @@ func handle_collisions()->void: pushRightEnabled = false if left_cast.is_colliding(): - print("Something on my left") var collider = left_cast.get_collider() if collider is RigidBody2D: pushLeftEnabled = true @@ -133,9 +136,18 @@ func handle_animations()->void: player_graphic.play("jump") PlayerStates.FALLING: player_graphic.play("fall") + PlayerStates.HURT: + player_graphic.play("hurt") + PlayerStates.DEAD: + player_graphic.play("death") func _animation_finished() -> void: match current_player_state: PlayerStates.JUMPING: upJump = false + PlayerStates.HURT: + current_player_state = PlayerStates.IDLE + PlayerStates.DEAD: + #death animation complete + deathCompleteSignal.emit() diff --git a/scripts/scene_manager.gd b/scripts/scene_manager.gd index 993ef1b..e359f4e 100644 --- a/scripts/scene_manager.gd +++ b/scripts/scene_manager.gd @@ -5,6 +5,7 @@ class_name SceneManager extends Node2D @onready var player: Player = $"../Player" @onready var crates: Node2D = $"../Crates" @onready var coins: Node2D = $"../Coins" +@onready var enemies: Node2D = $"../Enemies" #recipe for bullets var bullet = preload("res://scenes/bullet.tscn") @@ -17,9 +18,12 @@ func _ready() -> void: buildLevel() game.teleportSignal.connect(teleport) game.destroySignal.connect(destroy) + game.damageSignal.connect(damage) player.bulletSignal.connect(makeBullet) + player.deathCompleteSignal.connect(game.levelChange) updateCrates() updateCoins() + updateEnemies() # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -50,6 +54,15 @@ func updateCoins()->void: totalCoins +=1 game.coinTotal(totalCoins) +func updateEnemies()->void: + if enemies: + for obj in enemies.get_children(): + var enemy = obj as Slime + if enemy: + game.addEnemyToLevel(enemy) + if not enemy.enemyAttackSignal.is_connected(game.slimeAttack): + enemy.enemyAttackSignal.connect(game.slimeAttack) + func buildLevel()->void: if triggers: for obj in triggers.get_children(): @@ -97,7 +110,17 @@ func destroy(target)->void: target.queue_free() if target is Coin: target.queue_free() - + if target is Slime: + target.queue_free() + if target is Player: + target.kill() + +func damage(target)->void: + if target is Slime: + target.takeDamage() + if target is Player: + target.takeDamage() + func stash(target:Bullet)->void: print("stash a bullet") #hide the bullet off-screen diff --git a/scripts/slime.gd b/scripts/slime.gd index 6896a91..bd62186 100644 --- a/scripts/slime.gd +++ b/scripts/slime.gd @@ -14,7 +14,7 @@ var facing:FaceDirection = FaceDirection.RIGHT #direction 1 move to right, 0 no movement, -1 to the left var direction = 1 -enum EnemyStates {RUN, ATTACK, SPAWN} +enum EnemyStates {RUN, ATTACK, SPAWN, HURT} var currentEnemyState:EnemyStates = EnemyStates.SPAWN @@ -29,6 +29,9 @@ func _process(delta: float) -> void: handleStates() handleAnimation() handleCollisions() + +func takeDamage()->void: + currentEnemyState = EnemyStates.HURT func handleMovement(delta)->void: position.x += direction*speed*delta @@ -51,6 +54,9 @@ func handleAnimation()->void: slime_graphic.play("run") EnemyStates.ATTACK: slime_graphic.play("attack") + EnemyStates.HURT: + #swap for a hurt animation + slime_graphic.play("attack") func handleCollisions()->void: if not right_down_cast.is_colliding(): @@ -84,3 +90,5 @@ func _on_animation_finished() -> void: EnemyStates.ATTACK: currentEnemyState = EnemyStates.RUN direction = (randi() % 2) *2 -1 + EnemyStates.HURT: + currentEnemyState = EnemyStates.RUN