diff --git a/components/Abstracts/EntityBase.tscn b/components/Abstracts/EntityBase.tscn index ff3ede3..52a1619 100644 --- a/components/Abstracts/EntityBase.tscn +++ b/components/Abstracts/EntityBase.tscn @@ -121,4 +121,9 @@ unique_name_in_owner = true shape = SubResource("RectangleShape2D_ce3to") [node name="statebar" parent="." instance=ExtResource("2_uje1g")] +unique_name_in_owner = true position = Vector2(0, -100) + +[node name="damageAnchor" type="Node2D" parent="statebar"] +unique_name_in_owner = true +position = Vector2(0, -20) diff --git a/components/Bullets/PurpleCrystal.tscn b/components/Bullets/PurpleCrystal.tscn index 9664231..5ef4f6c 100644 --- a/components/Bullets/PurpleCrystal.tscn +++ b/components/Bullets/PurpleCrystal.tscn @@ -19,12 +19,12 @@ animations = [{ [node name="PurpleCrystal" instance=ExtResource("1_45mh7")] script = ExtResource("2_4lnlm") -speed = 5.0 lifeDistance = 700.0 [node name="texture" parent="." index="0"] +position = Vector2(22, 0) sprite_frames = SubResource("SpriteFrames_r86b3") [node name="hitbox" parent="." index="1"] -position = Vector2(12, 0) +position = Vector2(36, 0) shape = SubResource("CircleShape2D_ty1as") diff --git a/components/Characters/Chick.tscn b/components/Characters/Chick.tscn index 26db075..b2a2bbe 100644 --- a/components/Characters/Chick.tscn +++ b/components/Characters/Chick.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://b0ncrvm8u4pox"] +[gd_scene load_steps=7 format=3 uid="uid://b0ncrvm8u4pox"] [ext_resource type="PackedScene" uid="uid://cvogxi7mktumf" path="res://components/Abstracts/EntityBase.tscn" id="1_goqmy"] +[ext_resource type="Script" path="res://scripts/Contents/Characters/Chick.gd" id="2_r6bub"] [ext_resource type="Texture2D" uid="uid://7pkplcqqxvnp" path="res://resources/characters/chick/chick-a.svg" id="2_syddq"] [ext_resource type="Texture2D" uid="uid://dj5dvqb8gsedr" path="res://resources/characters/chick/chick-b.svg" id="3_064jv"] @@ -26,11 +27,20 @@ animations = [{ "speed": 5.0 }] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_rn84j"] +size = Vector2(19.5, 14) + [node name="Chick" instance=ExtResource("1_goqmy")] +script = ExtResource("2_r6bub") [node name="texture" parent="." index="0"] +position = Vector2(0, -37) sprite_frames = SubResource("SpriteFrames_xji3d") animation = &"walk" +[node name="movebox" parent="." index="1"] +shape = SubResource("RectangleShape2D_rn84j") + [node name="statebar" parent="." index="2" node_paths=PackedStringArray("entity")] +position = Vector2(0, -82) entity = NodePath("..") diff --git a/components/Characters/Rooster.tscn b/components/Characters/Rooster.tscn index fc44457..e7172cd 100644 --- a/components/Characters/Rooster.tscn +++ b/components/Characters/Rooster.tscn @@ -32,7 +32,6 @@ radius = 41.0122 [node name="Rooster" instance=ExtResource("1_e5pl8")] script = ExtResource("2_oqdqd") -cooldownUnit = 200.0 [node name="texture" parent="." index="0"] position = Vector2(0, -70) diff --git a/components/Scenes/UI.tscn b/components/Scenes/UI.tscn new file mode 100644 index 0000000..537e330 --- /dev/null +++ b/components/Scenes/UI.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://dfwg750a47ggx"] + +[ext_resource type="PackedScene" uid="uid://ofpg5s3j7esv" path="res://components/UI/BossBar.tscn" id="1_2pe58"] +[ext_resource type="Script" path="res://scripts/Statemachine/UIState.gd" id="1_f00a6"] + +[node name="UI" type="CanvasLayer"] +script = ExtResource("1_f00a6") + +[node name="root" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="bossbar" parent="root" instance=ExtResource("1_2pe58")] +unique_name_in_owner = true +layout_mode = 1 diff --git a/components/Scenes/World.tscn b/components/Scenes/World.tscn new file mode 100644 index 0000000..b3c5018 --- /dev/null +++ b/components/Scenes/World.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=5 format=3 uid="uid://dmxi1ikn6avig"] + +[ext_resource type="Script" path="res://scripts/Tools/WorldTool.gd" id="1_t2xvy"] +[ext_resource type="PackedScene" uid="uid://dfwg750a47ggx" path="res://components/Scenes/UI.tscn" id="2_04cdd"] +[ext_resource type="PackedScene" uid="uid://bm7ymrri6pykb" path="res://components/Characters/Rooster.tscn" id="3_5ui6q"] +[ext_resource type="PackedScene" uid="uid://b0ncrvm8u4pox" path="res://components/Characters/Chick.tscn" id="4_tnil0"] + +[node name="world" type="Node2D"] +script = ExtResource("1_t2xvy") + +[node name="UI" parent="." instance=ExtResource("2_04cdd")] + +[node name="rooster" parent="." groups=["players"] instance=ExtResource("3_5ui6q")] +position = Vector2(394, 274) + +[node name="chick" parent="." groups=["mobs"] instance=ExtResource("4_tnil0")] +position = Vector2(644, 391) +isBoss = true + +[node name="Chick" parent="." instance=ExtResource("4_tnil0")] +position = Vector2(261, 468) + +[node name="Chick2" parent="." instance=ExtResource("4_tnil0")] +position = Vector2(837, 492) + +[node name="Chick3" parent="." instance=ExtResource("4_tnil0")] +position = Vector2(897, 185) diff --git a/components/UI/BossBar.tscn b/components/UI/BossBar.tscn new file mode 100644 index 0000000..333930c --- /dev/null +++ b/components/UI/BossBar.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=3 format=3 uid="uid://ofpg5s3j7esv"] + +[ext_resource type="Script" path="res://scripts/Statemachine/EntityStateBar.gd" id="1_q4vrr"] +[ext_resource type="PackedScene" uid="uid://d1ulrvupa76ap" path="res://components/UI/ColorBar.tscn" id="1_uxey7"] + +[node name="BossBar" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_q4vrr") + +[node name="health" parent="." instance=ExtResource("1_uxey7")] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.2 +anchor_top = 1.0 +anchor_right = 0.8 +anchor_bottom = 1.0 +offset_top = -40.0 +offset_right = 0.0 +offset_bottom = -20.0 +grow_horizontal = 2 +grow_vertical = 0 diff --git a/components/UI/DamageLabel.tscn b/components/UI/DamageLabel.tscn new file mode 100644 index 0000000..e955546 --- /dev/null +++ b/components/UI/DamageLabel.tscn @@ -0,0 +1,130 @@ +[gd_scene load_steps=6 format=3 uid="uid://ccuucmpdsjgb3"] + +[ext_resource type="Script" path="res://scripts/Statemachine/DamageLabel.gd" id="1_0q15u"] + +[sub_resource type="LabelSettings" id="LabelSettings_valp2"] +font_color = Color(1, 0, 0, 1) + +[sub_resource type="Animation" id="Animation_32dxy"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("anchor:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("anchor:scale:x") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("anchor:scale:y") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("anchor:modulate:r") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_8y66m"] +resource_name = "show" +step = 0.05 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("anchor:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(20, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0, 20, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.25, 0.75, 1) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("anchor:scale:x") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(1e-05, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 1e-05, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.25, 0.75, 1) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("anchor:scale:y") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(1e-05, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 1e-05, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.25, 0.75, 1) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("anchor:modulate:a") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.25, 0.75, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_8a1bh"] +_data = { +"RESET": SubResource("Animation_32dxy"), +"show": SubResource("Animation_8y66m") +} + +[node name="DamageLabel" type="Node2D"] +script = ExtResource("1_0q15u") + +[node name="anchor" type="Node2D" parent="."] +modulate = Color(1, 1, 1, 0) + +[node name="label" type="Label" parent="anchor"] +unique_name_in_owner = true +offset_left = -100.0 +offset_top = -100.0 +offset_right = 100.0 +offset_bottom = 100.0 +text = "114514" +label_settings = SubResource("LabelSettings_valp2") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="animator" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_8a1bh") +} diff --git a/project.godot b/project.godot index 02b55fe..8c17c7f 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="ChickenVSBear" -run/main_scene="res://world.tscn" +run/main_scene="res://components/Scenes/World.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") config/icon="res://icon.svg" @@ -46,6 +46,11 @@ attack={ "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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } +sprint={ +"deadzone": 0.5, +"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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} [rendering] diff --git a/scripts/Contents/Characters/Chick.gd b/scripts/Contents/Characters/Chick.gd new file mode 100644 index 0000000..6d28a8a --- /dev/null +++ b/scripts/Contents/Characters/Chick.gd @@ -0,0 +1,6 @@ +extends EntityBase +class_name Chick + +func _ready(): + fields[FieldStore.Entity.MAX_HEALTH] = 1000 + super._ready() diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index 4b6e9ef..64cab05 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -1,8 +1,11 @@ extends Area2D class_name BulletBase -@export var speed: float = 1 -@export var damage: float = 10 +@export var fields = { + FieldStore.Bullet.SPEED: 10, + FieldStore.Bullet.DAMAGE: 10, + FieldStore.Bullet.PENERATE: 0 +} @export var lifeDistance: float = -1 # -1表示无限距离 @export var lifeTime: float = -1 # -1表示无限时间 @@ -30,9 +33,13 @@ func hit(target: Node): if entity == launcher: return if GameRule.allowFriendlyFire: if entity.isPlayer() == launcher.isPlayer(): return - entity.takeDamage(self) + entity.takeDamage(self, MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE))) + if !MathTool.rate(fullPenerate()): + destroy() func forward(direction: Vector2): - position += direction.normalized() * speed * GameRule.bulletSpeedMultiplier + position += direction.normalized() * fields.get(FieldStore.Bullet.SPEED) * GameRule.bulletSpeedMultiplier +func fullPenerate(): + return fields.get(FieldStore.Bullet.PENERATE) * (1 + launcher.fields.get(FieldStore.Entity.PENERATE)) func ai(): pass diff --git a/scripts/Statemachine/DamageLabel.gd b/scripts/Statemachine/DamageLabel.gd new file mode 100644 index 0000000..274137e --- /dev/null +++ b/scripts/Statemachine/DamageLabel.gd @@ -0,0 +1,18 @@ +extends Node2D +class_name DamageLabel + +@export var damage: float = 0 +@export var crit: bool = false +func _ready(): + $"%label".text = str(round(damage)) + ("!!!" if crit else "") + $"%animator".play("show") + await $"%animator".animation_finished + +static func create(spawnDamage: float, spawnCrit: bool, spawnPosition: Vector2, addToWorld: bool = true) -> DamageLabel: + var instance = preload("res://components/UI/DamageLabel.tscn").instantiate() + instance.damage = spawnDamage + instance.crit = spawnCrit + instance.position = spawnPosition + if addToWorld: + WorldTool.rootNode.add_child(instance) + return instance diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 796e5a2..3e9b775 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -1,28 +1,34 @@ extends CharacterBody2D class_name EntityBase # 这是个抽象类 -@export var fields: Dictionary = { +var fields = { FieldStore.Entity.MAX_HEALTH: 100, FieldStore.Entity.DAMAGE_MULTIPILER: 1, FieldStore.Entity.MOVEMENT_SPEED: 1, FieldStore.Entity.ATTACK_SPEED: 1, - FieldStore.Entity.CRIT_RATE: 0.05, # 0.05 = 5% - FieldStore.Entity.CRIT_DAMAGE: 2 # 2 = 200% -} # 存一下词条 + FieldStore.Entity.CRIT_RATE: 0.05, + FieldStore.Entity.CRIT_DAMAGE: 1, + FieldStore.Entity.PENERATE: 0, +} +var cooldownUnit: float = 100 # 100毫秒每次攻击 + @export var isBoss: bool = false -@export var cooldownUnit: float = 100 # 100毫秒每次攻击 @onready var animatree: AnimationTree = $"%animatree" @onready var texture: AnimatedSprite2D = $"%texture" @onready var hurtbox: Area2D = $"%hurtbox" +@onready var statebar: EntityStateBar = $"%statebar" var health: float = 0 var lastDirection: int = 1 var lastAttack: int = 0 +var currentFocusedBoss: EntityBase = null +var sprinting: bool = false func _ready(): health = fields.get(FieldStore.Entity.MAX_HEALTH) + statebar.visible = !isBoss func _process(_delta): health = clamp(health, 0, fields.get(FieldStore.Entity.MAX_HEALTH)) animatree.set("parameters/blend_position", lerpf(animatree.get("parameters/blend_position"), lastDirection, 0.1)) @@ -37,12 +43,19 @@ func move(direction: Vector2): var currentDirection = sign(direction.x) if currentDirection != 0: lastDirection = currentDirection -func takeDamage(bullet: BulletBase): - health -= bullet.damage +func takeDamage(bullet: BulletBase, crit: bool): + var baseDamage: float = bullet.fields.get(FieldStore.Bullet.DAMAGE) * randf_range(1 - GameRule.damageOffset, 1 + GameRule.damageOffset) + var damage = baseDamage + baseDamage * int(crit) * fields.get(FieldStore.Entity.CRIT_DAMAGE) + health -= damage + DamageLabel.create(damage, crit, $"%damageAnchor".global_position + MathTool.randv2_range(GameRule.damageLabelSpawnOffset)) + if isBoss: + bullet.launcher.setBoss(self) if health <= 0: + if isBoss: + bullet.launcher.setBoss(null) die() func isCooldowned(): - return Time.get_ticks_msec() - lastAttack >= cooldownUnit + return Time.get_ticks_msec() - lastAttack >= cooldownUnit / fields.get(FieldStore.Entity.ATTACK_SPEED) func startCooldown(): var state = isCooldowned() if state: @@ -54,9 +67,13 @@ func tryAttack(type: int): func findWeaponAnchor(weaponName: String): var anchor = $"%weapons".get_node(weaponName) if anchor is Node2D: - return (anchor.position + texture.position) * Vector2(animatree.get("parameters/blend_position"), 1) + position + return anchor.global_position else: return Vector2.ZERO +func setBoss(boss: EntityBase): + currentFocusedBoss = boss + if isPlayer(): + UIState.bossbar.entity = boss # 关于分组 func isPlayer(): @@ -75,11 +92,13 @@ static func generate( spawnPosition: Vector2, spawnRotation: float, isMob: bool = true, + spawnAsBoss: bool = false, addtoWorld: bool = true ): var instance: EntityBase = entity.instance() instance.position = spawnPosition instance.rotation = spawnRotation + instance.isBoss = spawnAsBoss if isMob: instance.add_to_group("mobs") if addtoWorld: diff --git a/scripts/Statemachine/EntityStateBar.gd b/scripts/Statemachine/EntityStateBar.gd index a9de469..5d85233 100644 --- a/scripts/Statemachine/EntityStateBar.gd +++ b/scripts/Statemachine/EntityStateBar.gd @@ -1,4 +1,5 @@ -extends Node2D +extends Node +class_name EntityStateBar @export var entity: EntityBase @@ -6,5 +7,5 @@ extends Node2D func _process(_delta): if entity: - healthBar.maxValue = entity.maxHealth + healthBar.maxValue = entity.fields.get(FieldStore.Entity.MAX_HEALTH) healthBar.setCurrent(entity.health) diff --git a/scripts/Statemachine/UIState.gd b/scripts/Statemachine/UIState.gd new file mode 100644 index 0000000..ff910f1 --- /dev/null +++ b/scripts/Statemachine/UIState.gd @@ -0,0 +1,9 @@ +extends CanvasLayer +class_name UIState + +static var bossbar: EntityStateBar + +func _ready(): + bossbar = $"%bossbar" +func _process(_delta): + bossbar.visible = !!bossbar.entity diff --git a/scripts/Tools/FieldStore.gd b/scripts/Tools/FieldStore.gd index 35d4015..290d80a 100644 --- a/scripts/Tools/FieldStore.gd +++ b/scripts/Tools/FieldStore.gd @@ -7,4 +7,25 @@ enum Entity { ATTACK_SPEED, CRIT_RATE, CRIT_DAMAGE, + PENERATE +} +static var entityMap = { + Entity.MAX_HEALTH: "最大生命值", + Entity.DAMAGE_MULTIPILER: "伤害倍率", + Entity.MOVEMENT_SPEED: "移动速度", + Entity.ATTACK_SPEED: "攻击速度", + Entity.CRIT_RATE: "暴击率", + Entity.CRIT_DAMAGE: "暴击伤害", + Entity.PENERATE: "穿透" +} + +enum Bullet { + SPEED, + DAMAGE, + PENERATE +} +static var bulletMap = { + Bullet.SPEED: "速度", + Bullet.DAMAGE: "伤害", + Bullet.PENERATE: "穿透" } \ No newline at end of file diff --git a/scripts/Tools/GameRule.gd b/scripts/Tools/GameRule.gd index c4a082b..2379874 100644 --- a/scripts/Tools/GameRule.gd +++ b/scripts/Tools/GameRule.gd @@ -1,4 +1,6 @@ class_name GameRule static var allowFriendlyFire: bool = false # 是否允许友军伤害 -static var bulletSpeedMultiplier: float = 1 # 子弹速度倍率 \ No newline at end of file +static var bulletSpeedMultiplier: float = 1 # 子弹速度倍率 +static var damageOffset: float = 0.2 # 伤害随机浮动比例,默认20%,即10的基础伤害会应用为8~12 +static var damageLabelSpawnOffset: float = 10 # 伤害标签生成位置的随机偏移 \ No newline at end of file diff --git a/scripts/Tools/MathTool.gd b/scripts/Tools/MathTool.gd new file mode 100644 index 0000000..264f15c --- /dev/null +++ b/scripts/Tools/MathTool.gd @@ -0,0 +1,9 @@ +class_name MathTool + +static func rate(value: float): + return randf() < value +static func randv2_range(offset: float): + return Vector2( + randf_range(-offset, offset), + randf_range(-offset, offset) + ) \ No newline at end of file diff --git a/world.tscn b/world.tscn deleted file mode 100644 index 0d5bc6e..0000000 --- a/world.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dmxi1ikn6avig"] - -[ext_resource type="PackedScene" uid="uid://bm7ymrri6pykb" path="res://components/Characters/Rooster.tscn" id="1_7jr0n"] -[ext_resource type="Script" path="res://scripts/Tools/WorldTool.gd" id="1_ei0ch"] -[ext_resource type="PackedScene" uid="uid://b0ncrvm8u4pox" path="res://components/Characters/Chick.tscn" id="3_jho84"] - -[node name="world" type="Node2D"] -script = ExtResource("1_ei0ch") - -[node name="rooster" parent="." groups=["players"] instance=ExtResource("1_7jr0n")] -position = Vector2(394, 274) - -[node name="chick" parent="." groups=["mobs"] instance=ExtResource("3_jho84")] -position = Vector2(644, 391) - -[node name="Chick" parent="." instance=ExtResource("3_jho84")] -position = Vector2(366, 547) - -[node name="Chick2" parent="." instance=ExtResource("3_jho84")] -position = Vector2(686, 551) - -[node name="Chick3" parent="." instance=ExtResource("3_jho84")] -position = Vector2(760, 200)