From e7d5d9eacc21476d1a0c11681e38cfcb02c9a394 Mon Sep 17 00:00:00 2001 From: Jonas Mucke Date: Sat, 18 Apr 2020 21:17:13 +0200 Subject: [PATCH] setup for ai --- src/Boss/Boss_template.gd | 94 ++++++++++++ src/Boss/Boss_template.tscn | 67 +++++++++ src/Objects/Barrel/Barrel.gd | 2 +- src/Objects/Torch/Torch.gd | 23 +++ src/Objects/Torch/Torch.tscn | 28 ++++ src/Player/Player.gd | 17 ++- src/Player/Player.tscn | 2 +- src/World.tscn | 166 +++++++++++----------- src/project.godot | 6 + src/testSprites/white_boss_dog.png | Bin 0 -> 16191 bytes src/testSprites/white_boss_dog.png.import | 34 +++++ 11 files changed, 345 insertions(+), 94 deletions(-) create mode 100644 src/Boss/Boss_template.gd create mode 100644 src/Boss/Boss_template.tscn create mode 100644 src/Objects/Torch/Torch.gd create mode 100644 src/Objects/Torch/Torch.tscn create mode 100644 src/testSprites/white_boss_dog.png create mode 100644 src/testSprites/white_boss_dog.png.import diff --git a/src/Boss/Boss_template.gd b/src/Boss/Boss_template.gd new file mode 100644 index 0000000..c5fef6b --- /dev/null +++ b/src/Boss/Boss_template.gd @@ -0,0 +1,94 @@ +extends KinematicBody2D +class_name Boss +""" +This is an example player controller script created by Paul +""" +var velocity := Vector2.ZERO +# This is how you export variables with ranges to the editor window +export(bool) var debug := false +export(int, 0, 500) var ACCELERATION := 450 +# Reference for the current player + +onready var player_stats := $Stats +onready var debug_label := $DebugLabel +#onready var animation_player := $AnimationPlayer +#var animation_tree := $AnimationTree +#onready var animation_state = animation_tree.get("parameters/playback") + +enum moveState{ + MOVE, + HIT +} + +var movementState = moveState.MOVE + +var damage_per_second := 0.0 +var totaldamage := 0.0 + +func _debug_update(): + debug_label.text = str(player_stats.health) + "/" + str(player_stats.max_health) + " HP\n" + + +func _physics_process(delta): + totaldamage+=damage_per_second*delta + player_stats.speed+=10*delta + while(totaldamage>1): + totaldamage-=1 + player_stats.health-=1 + while(totaldamage<-1): + totaldamage+=1 + player_stats.health+=1 + _debug_update() + if debug == true: + match movementState: + moveState.MOVE: + movement_move(delta) + moveState.HIT: + movement_hit() + + move() + +# IMPORTANT: If you are using move_and_slide don't multiply by delta +# Godots physics system does that internally +# In move_and_collide(...) you have to multiply by delta. +func move(): + move_and_slide(velocity) + +func movement_move(delta): + var input_vector = Vector2.ZERO + # This is a clever way to handle directional input + # Input.get_action_strength(...) returns a value between 0 and 1 depending + # on how strong the controller direction is pressed + # For keyboards it always returns 1 if pressed and 0 if not + # The actions are custom and defined in the project settings + input_vector.x = Input.get_action_strength("right") - Input.get_action_strength("left") + input_vector.y = Input.get_action_strength("down") - Input.get_action_strength("up") + input_vector = input_vector.normalized() + + if input_vector == Vector2.ZERO: + #animation_state.travel("idle") + velocity = Vector2.ZERO + else: + velocity = velocity.move_toward(player_stats.speed * input_vector, ACCELERATION * delta) + if Input.is_action_just_pressed("roll"): + pass + elif Input.is_action_just_pressed("attack"): + pass + +func movement_hit(): + velocity = Vector2.ZERO + +func hit_finished(): + movementState = moveState.MOVE + +func _on_Stats_no_health(): + queue_free() + + +func _on_Hurtbox_area_entered(area): + player_stats.health-=area.damage + damage_per_second = damage_per_second + area.damage + + +func _on_Hurtbox_area_exited(area): + damage_per_second = damage_per_second - area.damage diff --git a/src/Boss/Boss_template.tscn b/src/Boss/Boss_template.tscn new file mode 100644 index 0000000..93a4a11 --- /dev/null +++ b/src/Boss/Boss_template.tscn @@ -0,0 +1,67 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://Overlap/HurtHit_Box/Hurtbox.tscn" type="PackedScene" id=1] +[ext_resource path="res://Overlap/HurtHit_Box/Hitbox.tscn" type="PackedScene" id=2] +[ext_resource path="res://Overlap/Stats/Stats.tscn" type="PackedScene" id=3] +[ext_resource path="res://Boss/Boss_template.gd" type="Script" id=4] +[ext_resource path="res://testSprites/white_boss_dog.png" type="Texture" id=5] + +[sub_resource type="CapsuleShape2D" id=1] +radius = 18.0 +height = 18.0 + +[sub_resource type="CapsuleShape2D" id=2] +radius = 18.0 +height = 18.0 + +[sub_resource type="CapsuleShape2D" id=3] +radius = 8.0 +height = 15.0 + +[node name="Boss_template" type="KinematicBody2D"] +script = ExtResource( 4 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 3.13451, -20.1418 ) +scale = Vector2( 2, 2 ) +texture = ExtResource( 5 ) +hframes = 60 + +[node name="Stats" parent="." instance=ExtResource( 3 )] + +[node name="Hitbox" parent="." instance=ExtResource( 2 )] +collision_layer = 0 + +[node name="CollisionShape2D" parent="Hitbox" index="0"] +position = Vector2( 0, -15 ) +shape = SubResource( 1 ) + +[node name="Hurtbox" parent="." instance=ExtResource( 1 )] +collision_layer = 4 +collision_mask = 0 + +[node name="CollisionShape2D" parent="Hurtbox" index="0"] +position = Vector2( 0, -15 ) +shape = SubResource( 2 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( -1.52588e-05, 0 ) +rotation = 1.5708 +shape = SubResource( 3 ) + +[node name="DebugLabel" type="Label" parent="."] +margin_left = -42.2456 +margin_top = -65.04 +margin_right = 42.7544 +margin_bottom = -48.04 +text = "Obermufti" +__meta__ = { +"_edit_use_anchors_": false +} +[connection signal="no_health" from="Stats" to="." method="_on_Stats_no_health"] +[connection signal="area_entered" from="Hurtbox" to="." method="_on_Hurtbox_area_entered"] +[connection signal="area_exited" from="Hurtbox" to="." method="_on_Hurtbox_area_exited"] + +[editable path="Hitbox"] + +[editable path="Hurtbox"] diff --git a/src/Objects/Barrel/Barrel.gd b/src/Objects/Barrel/Barrel.gd index 11934b1..9dad71c 100644 --- a/src/Objects/Barrel/Barrel.gd +++ b/src/Objects/Barrel/Barrel.gd @@ -17,7 +17,7 @@ func _on_Hurtbox_area_entered(area): var Hearts = load("res://Objects/Heart/Heart.tscn") #index of ysort - var world = get_tree().current_scene.get_child(4) + var world = get_tree().current_scene.get_child(2) if(randf()=spawnRate): + elapsedTime-=spawnRate + var Minion = load("") + var world = get_tree().current_scene.get_child(2) + var minion = Minion.instance() + world.add_child(minion) + minion.global_position = global_position + + +func _on_Hurtbox_area_entered(area): + lifePoints -= area.damage + if(lifePoints<0): + queue_free() + pass diff --git a/src/Objects/Torch/Torch.tscn b/src/Objects/Torch/Torch.tscn new file mode 100644 index 0000000..e07f98e --- /dev/null +++ b/src/Objects/Torch/Torch.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://Overlap/HurtHit_Box/Hurtbox.tscn" type="PackedScene" id=1] +[ext_resource path="res://testSprites/fackel.png" type="Texture" id=2] +[ext_resource path="res://Objects/Torch/Torch.gd" type="Script" id=3] + +[sub_resource type="CapsuleShape2D" id=1] +radius = 8.0 +height = 12.0 + +[node name="Torch" type="StaticBody2D"] +script = ExtResource( 3 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 0, -8 ) +texture = ExtResource( 2 ) + +[node name="Hurtbox" parent="." instance=ExtResource( 1 )] +collision_layer = 8 +collision_mask = 0 +script = null + +[node name="CollisionShape2D" parent="Hurtbox" index="0"] +position = Vector2( 0, -8 ) +shape = SubResource( 1 ) +[connection signal="area_entered" from="Hurtbox" to="." method="_on_Hurtbox_area_entered"] + +[editable path="Hurtbox"] diff --git a/src/Player/Player.gd b/src/Player/Player.gd index 70031c6..1b529bb 100644 --- a/src/Player/Player.gd +++ b/src/Player/Player.gd @@ -6,6 +6,7 @@ This is an example player controller script created by Paul var velocity := Vector2.ZERO var rollvector := Vector2.ZERO # This is how you export variables with ranges to the editor window +export(bool) var debug := false export(int, 0, 500) var ROLL_SPEED := 150 export(int, 0, 500) var FRICTION := 200 # Speed at which the player deaccelarates export(int, 0, 500) var ACCELERATION := 450 @@ -45,13 +46,14 @@ func _physics_process(delta): totaldamage+=1 player_stats.health+=1 _debug_update() - match movementState: - moveState.MOVE: - movement_move(delta) - moveState.ROLL: - movement_roll() - moveState.HIT: - movement_hit() + if debug == true: + match movementState: + moveState.MOVE: + movement_move(delta) + moveState.ROLL: + movement_roll() + moveState.HIT: + movement_hit() move() @@ -104,6 +106,7 @@ func roll_finished(): func _on_Hurtbox_area_entered(area): + print("Hallo") player_stats.health-=area.damage damage_per_second = damage_per_second + area.damage diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index 5c33152..42b3231 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -700,7 +700,7 @@ margin_top = -21.2223 margin_right = 8.98804 margin_bottom = -9.22228 custom_fonts/font = SubResource( 49 ) -text = "Ahh" +text = "Held" __meta__ = { "_edit_use_anchors_": false } diff --git a/src/World.tscn b/src/World.tscn index 7ae7bf2..358231f 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -1,130 +1,126 @@ -[gd_scene load_steps=17 format=2] +[gd_scene load_steps=18 format=2] [ext_resource path="res://Player/Player.tscn" type="PackedScene" id=1] [ext_resource path="res://World.gd" type="Script" id=2] [ext_resource path="res://Maps/Tilesets/Room/tileset_room.tres" type="TileSet" id=3] [ext_resource path="res://testSprites/dark.png" type="Texture" id=4] -[ext_resource path="res://Objects/Barrel/Barrel.tscn" type="PackedScene" id=5] +[ext_resource path="res://Objects/Traps/bear.tscn" type="PackedScene" id=5] [ext_resource path="res://Objects/Banana/Banana.tscn" type="PackedScene" id=6] [ext_resource path="res://Objects/Bonfire/Bonfire.tscn" type="PackedScene" id=7] [ext_resource path="res://Objects/Traps/Sting.tscn" type="PackedScene" id=8] [ext_resource path="res://Objects/Rubies/Blue.tscn" type="PackedScene" id=9] -[ext_resource path="res://Objects/Traps/Bear.tscn" type="PackedScene" id=10] +[ext_resource path="res://Objects/Barrel/Barrel.tscn" type="PackedScene" id=10] [ext_resource path="res://Objects/Heart/Heart.tscn" type="PackedScene" id=11] [ext_resource path="res://Objects/Rubies/Red.tscn" type="PackedScene" id=12] [ext_resource path="res://Objects/Rubies/Green.tscn" type="PackedScene" id=13] [ext_resource path="res://Objects/Traps/Flame.tscn" type="PackedScene" id=14] [ext_resource path="res://Objects/Traps/Spike.tscn" type="PackedScene" id=15] [ext_resource path="res://Objects/Slime/Slime.tscn" type="PackedScene" id=16] +[ext_resource path="res://Boss/Boss_template.tscn" type="PackedScene" id=17] [node name="World" type="Node2D"] script = ExtResource( 2 ) [node name="WallSprite" type="Sprite" parent="."] -position = Vector2( 112.785, 148.267 ) +position = Vector2( 336, 160 ) texture = ExtResource( 4 ) region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) [node name="FloorTileMap" type="TileMap" parent="."] +position = Vector2( -16, 24 ) tile_set = ExtResource( 3 ) cell_size = Vector2( 32, 32 ) format = 1 -tile_data = PoolIntArray( -131063, 47, 0, -131062, 47, 2, -65536, 47, 4, -65535, 47, 196609, -65534, 47, 196609, -65533, 47, 196609, -65532, 47, 196609, -65531, 47, 196609, -65530, 47, 196609, -65529, 47, 6, -65528, 47, 5, -65527, 47, 196614, -65526, 47, 196613, -65525, 47, 6, -65524, 47, 5, -65523, 47, 196609, -65522, 47, 7, 0, 47, 65539, 7, 47, 131072, 8, 47, 65543, 11, 47, 131072, 12, 47, 65543, 14, 47, 196612, 15, 47, 196610, 65536, 47, 65539, 65544, 47, 196612, 65545, 47, 7, 65548, 47, 65539, 131072, 47, 262148, 131073, 47, 196610, 131081, 47, 65539, 131084, 47, 65539, 131087, 47, 3, 196608, 47, 65539, 196615, 47, 196611, 196617, 47, 131075, 196619, 47, 4, 196620, 47, 196615, 196622, 47, 4, 196623, 47, 196615, 262144, 47, 65539, 262146, 47, 3, 262155, 47, 65539, 262158, 47, 65539, 327680, 47, 262148, 327681, 47, 196609, 327682, 47, 196616, 327683, 47, 196609, 327684, 47, 196609, 327685, 47, 196609, 327686, 47, 196609, 327687, 47, 7, 327691, 47, 131075, 327694, 47, 65539, 393216, 47, 65539, 393223, 47, 196612, 393224, 47, 196610, 393230, 47, 65539, 458752, 47, 196612, 458753, 47, 196609, 458754, 47, 7, 458766, 47, 65539, 524290, 47, 196612, 524291, 47, 196609, 524292, 47, 196609, 524293, 47, 196609, 524294, 47, 196609, 524295, 47, 196609, 524296, 47, 196609, 524297, 47, 196609, 524298, 47, 196609, 524299, 47, 196609, 524300, 47, 196609, 524301, 47, 196609, 524302, 47, 196615 ) - -[node name="Slime" parent="." instance=ExtResource( 16 )] -position = Vector2( 272.823, 72.281 ) - -[node name="Slime2" parent="." instance=ExtResource( 16 )] -position = Vector2( 239.993, 144.355 ) +tile_data = PoolIntArray( -65537, 47, 0, -131072, 47, 1, -131071, 47, 1, -131070, 47, 1, -131069, 47, 1, -131068, 47, 1, -131067, 47, 1, -131066, 47, 1, -131065, 47, 1, -131064, 47, 1, -131063, 47, 1, -131062, 47, 1, -131061, 47, 1, -131060, 47, 1, -131059, 47, 1, -131058, 47, 1, -131057, 47, 1, -131056, 47, 2, -1, 47, 65536, -65536, 47, 65541, -65535, 47, 131073, -65534, 47, 131073, -65533, 47, 131073, -65532, 47, 131073, -65531, 47, 131073, -65530, 47, 131073, -65529, 47, 131073, -65528, 47, 131073, -65527, 47, 131073, -65526, 47, 65544, -65525, 47, 131073, -65524, 47, 131073, -65523, 47, 131073, -65522, 47, 131073, -65521, 47, 65542, -65520, 47, 65538, 65535, 47, 65536, 0, 47, 65538, 10, 47, 65539, 15, 47, 65536, 16, 47, 65538, 131071, 47, 65536, 65536, 47, 65538, 65546, 47, 65539, 65549, 47, 3, 65551, 47, 65536, 65552, 47, 65538, 196607, 47, 65536, 131072, 47, 65538, 131077, 47, 3, 131082, 47, 65539, 131085, 47, 65539, 131087, 47, 65536, 131088, 47, 65538, 262143, 47, 65536, 196608, 47, 65538, 196612, 47, 196608, 196613, 47, 262152, 196614, 47, 196610, 196618, 47, 65539, 196621, 47, 196612, 196622, 47, 196609, 196623, 47, 262150, 196624, 47, 65538, 327679, 47, 65536, 262144, 47, 65538, 262149, 47, 131075, 262154, 47, 65539, 262159, 47, 65536, 262160, 47, 65538, 393215, 47, 65536, 327680, 47, 65538, 327690, 47, 196612, 327691, 47, 196610, 327695, 47, 65536, 327696, 47, 65538, 458751, 47, 65536, 393216, 47, 65538, 393231, 47, 65536, 393232, 47, 65538, 524287, 47, 65536, 458752, 47, 131077, 458753, 47, 1, 458754, 47, 1, 458755, 47, 1, 458756, 47, 1, 458757, 47, 1, 458758, 47, 1, 458759, 47, 1, 458760, 47, 1, 458761, 47, 1, 458762, 47, 1, 458763, 47, 1, 458764, 47, 1, 458765, 47, 1, 458766, 47, 1, 458767, 47, 131078, 458768, 47, 65538, 589823, 47, 131072, 524288, 47, 131073, 524289, 47, 131073, 524290, 47, 131073, 524291, 47, 131073, 524292, 47, 131073, 524293, 47, 131073, 524294, 47, 131073, 524295, 47, 131073, 524296, 47, 131073, 524297, 47, 131073, 524298, 47, 131073, 524299, 47, 131073, 524300, 47, 131073, 524301, 47, 131073, 524302, 47, 131073, 524303, 47, 131073, 524304, 47, 131074 ) +__meta__ = { +"_edit_group_": true +} [node name="YSort" type="YSort" parent="."] -position = Vector2( 170.007, 112.118 ) +position = Vector2( 152, 120 ) -[node name="Barrel2" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -124.864, -87.4505 ) - -[node name="Barrel3" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -119.425, -59.8735 ) - -[node name="Barrel" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -57.3565, -65.1137 ) - -[node name="Barrel4" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -95.4691, -97.9434 ) - -[node name="Barrel5" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -88.6768, -25.4916 ) - -[node name="Barrel6" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -61.13, -36.8122 ) - -[node name="Barrel7" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -62.6394, -90.019 ) - -[node name="Barrel8" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -87.9221, -57.944 ) - -[node name="Barrel9" parent="YSort" instance=ExtResource( 5 )] -position = Vector2( -81.8844, -74.1702 ) +[node name="Boss_template" parent="YSort" instance=ExtResource( 17 )] +position = Vector2( -107.855, -54.5179 ) +debug = true [node name="Player" parent="YSort" instance=ExtResource( 1 )] -position = Vector2( -1.15936, -79.3532 ) +position = Vector2( 296, -32 ) scale = Vector2( 2, 2 ) +FRICTION = 200 -[node name="Banana" parent="YSort" instance=ExtResource( 6 )] -position = Vector2( -122.709, 34.7666 ) +[node name="minion" parent="YSort" instance=ExtResource( 17 )] +position = Vector2( 88, 24 ) +scale = Vector2( 0.3, 0.3 ) +collision_layer = 8 +debug = true -[node name="Bonfire" parent="YSort" instance=ExtResource( 7 )] -position = Vector2( 283.515, -47.7461 ) +[node name="Bear_trap" parent="YSort" instance=ExtResource( 5 )] +position = Vector2( 68.1447, -38.5179 ) -[node name="Sting" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 68.6066, -28.1109 ) - -[node name="Sting2" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 68.6066, -18.9158 ) - -[node name="Sting3" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 108.936, 2.03768 ) - -[node name="Sting4" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 92.0694, 1.87637 ) - -[node name="Sting5" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 101.981, 2.46786 ) - -[node name="Flame2" parent="YSort" instance=ExtResource( 14 )] -position = Vector2( -31.1322, 103.722 ) - -[node name="Bear_trap" parent="YSort" instance=ExtResource( 10 )] -position = Vector2( 197.579, -28.4036 ) +[node name="Slime" parent="YSort" instance=ExtResource( 16 )] +position = Vector2( 68.1447, 57.4821 ) [node name="Flame" parent="YSort" instance=ExtResource( 14 )] -position = Vector2( -30.7141, 88.6697 ) +position = Vector2( 124.145, 65.4821 ) [node name="Spike" parent="YSort" instance=ExtResource( 15 )] -position = Vector2( 225.593, 102.049 ) +position = Vector2( 272, 88 ) -[node name="Red" parent="YSort" instance=ExtResource( 12 )] -position = Vector2( -128.136, 91.1784 ) - -[node name="Green" parent="YSort" instance=ExtResource( 13 )] -position = Vector2( -105.975, 105.394 ) - -[node name="Blue" parent="YSort" instance=ExtResource( 9 )] -position = Vector2( -89.2507, 105.394 ) - -[node name="Green2" parent="YSort" instance=ExtResource( 13 )] -position = Vector2( -95.5225, 89.5059 ) - -[node name="Green3" parent="YSort" instance=ExtResource( 13 )] -position = Vector2( -127.718, 103.722 ) - -[node name="Green4" parent="YSort" instance=ExtResource( 13 )] -position = Vector2( -116.428, 91.5965 ) +[node name="Sting" parent="YSort" instance=ExtResource( 8 )] +position = Vector2( 132.145, 17.4821 ) [node name="Heart" parent="YSort" instance=ExtResource( 11 )] -position = Vector2( 201.342, -60.5988 ) +position = Vector2( -43.8553, 65.4821 ) -[node name="Blue2" parent="YSort" instance=ExtResource( 9 )] -position = Vector2( 66.0861, -56.9466 ) +[node name="Blue" parent="YSort" instance=ExtResource( 9 )] +position = Vector2( -3.8553, 81.4821 ) + +[node name="Red" parent="YSort" instance=ExtResource( 12 )] +position = Vector2( -51.8553, 41.4821 ) + +[node name="Green" parent="YSort" instance=ExtResource( 13 )] +position = Vector2( -19.8553, 73.4821 ) + +[node name="Barrel" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( 8.00002, -32 ) + +[node name="Barrel5" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -40, 16 ) + +[node name="Barrel6" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -40, 16 ) + +[node name="Barrel7" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -56, 16 ) + +[node name="Barrel8" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -72, 16 ) + +[node name="Barrel9" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -88, 16 ) + +[node name="Barrel10" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -104, 16 ) + +[node name="Barrel11" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( -120, 16 ) + +[node name="Barrel2" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( 8.00002, -48 ) + +[node name="Barrel3" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( 8.00002, -64 ) + +[node name="Barrel4" parent="YSort" instance=ExtResource( 10 )] +position = Vector2( 8.00002, -72 ) + +[node name="Banana" parent="YSort" instance=ExtResource( 6 )] +position = Vector2( -107.855, 73.4821 ) + +[node name="Bonfire" parent="." instance=ExtResource( 7 )] +position = Vector2( 448, 104 ) + +[editable path="YSort/minion"] + +[editable path="YSort/minion/Hurtbox"] diff --git a/src/project.godot b/src/project.godot index 2d61bd0..69d0a35 100644 --- a/src/project.godot +++ b/src/project.godot @@ -10,6 +10,11 @@ config_version=4 _global_script_classes=[ { "base": "KinematicBody2D", +"class": "Boss", +"language": "GDScript", +"path": "res://Boss/Boss_template.gd" +}, { +"base": "KinematicBody2D", "class": "Player", "language": "GDScript", "path": "res://Player/Player.gd" @@ -25,6 +30,7 @@ _global_script_classes=[ { "path": "res://Menus/TitleScreen/TitleScreen.gd" } ] _global_script_class_icons={ +"Boss": "", "Player": "", "TitleSceenButton": "", "TitleScreen": "" diff --git a/src/testSprites/white_boss_dog.png b/src/testSprites/white_boss_dog.png new file mode 100644 index 0000000000000000000000000000000000000000..e47caa05e22392662fce9dfde64513a6bbfb9577 GIT binary patch literal 16191 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