Peashooters

This commit is contained in:
Rendo 2025-08-09 21:35:02 +05:00
commit 68cfe89f1d
47 changed files with 1571 additions and 279 deletions

Binary file not shown.

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bf7vjtufjc8kt"]
[ext_resource type="Texture2D" uid="uid://d4btl7vqi4v0q" path="res://assets/sprites/plants/aloe.tres" id="1_t4137"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_vw2kg"]
[ext_resource type="PackedScene" uid="uid://bw1w8jp0yeypy" path="res://scenes/entities/plants/aloe.tscn" id="2_6a4ia"]
[resource]
script = ExtResource("1_vw2kg")
Layer = 1
DontRegister = false
NameKey = "aloe"
DescriptionKey = "aloe_desc"
Cost = 75.0
Scene = ExtResource("2_6a4ia")
ReloadTime = 15.0
ReloadProgress = 0.0
Preview = ExtResource("1_t4137")
Order = 6

View file

@ -1,23 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://ciewunnfalrbb"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_jrx81"]
[ext_resource type="Texture2D" uid="uid://bt76iudw2qgnv" path="res://assets/sprites/atlases/plants/cumbucer.png" id="1_tdg4d"]
[ext_resource type="PackedScene" uid="uid://cjoyh54cpjla7" path="res://scenes/entities/plants/cucumber.tscn" id="2_0mr6r"]
[sub_resource type="AtlasTexture" id="AtlasTexture_3gogt"]
atlas = ExtResource("1_tdg4d")
region = Rect2(2, 1, 41, 65)
[resource]
script = ExtResource("1_jrx81")
Layer = 1
DontRegister = false
NameKey = "cucumber"
DescriptionKey = "cucumber_desc"
Cost = 75.0
Scene = ExtResource("2_0mr6r")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = SubResource("AtlasTexture_3gogt")
Order = 8
metadata/_custom_type_script = "uid://cyenlko1knygw"

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://btkkaow4tyw55"]
[ext_resource type="Texture2D" uid="uid://m8e84blnx7yu" path="res://assets/sprites/plants/garlic.tres" id="1_datic"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_e15gf"]
[ext_resource type="PackedScene" uid="uid://qq0cw8xtcoj3" path="res://scenes/entities/plants/garlic.tscn" id="2_81n0p"]
[resource]
script = ExtResource("1_e15gf")
Layer = 1
DontRegister = false
NameKey = "garlic"
DescriptionKey = "garlic_desc"
Cost = 50.0
Scene = ExtResource("2_81n0p")
ReloadTime = 7.5
ReloadProgress = 0.0
Preview = ExtResource("1_datic")
Order = 7

View file

@ -1,23 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://8edvnmwu4tyn"]
[ext_resource type="Texture2D" uid="uid://b06e8xhdy77d1" path="res://assets/sprites/atlases/plants/nerdus.png" id="1_of51r"]
[ext_resource type="PackedScene" uid="uid://k5aj2slxar7w" path="res://scenes/entities/plants/nerdus.tscn" id="2_0i6qf"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_30qd0"]
[sub_resource type="AtlasTexture" id="AtlasTexture_ivp5w"]
atlas = ExtResource("1_of51r")
region = Rect2(477, 9, 60, 59)
[resource]
script = ExtResource("3_30qd0")
Layer = 1
DontRegister = false
NameKey = "nerdus"
DescriptionKey = "nerdus_desc"
Cost = 125.0
Scene = ExtResource("2_0i6qf")
ReloadTime = 10.0
ReloadProgress = 0.0
Preview = SubResource("AtlasTexture_ivp5w")
Order = 10
metadata/_custom_type_script = "uid://cyenlko1knygw"

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://c8rr1dc7mjr3d"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_amvh8"]
[ext_resource type="Texture2D" uid="uid://ot1n4nval86w" path="res://assets/sprites/plants/peashooter.tres" id="1_rnq6r"]
[ext_resource type="PackedScene" uid="uid://dy41q1kxray5t" path="res://scenes/entities/plants/peashooter.tscn" id="1_rqf2x"]
[resource]
script = ExtResource("1_amvh8")
Layer = 1
DontRegister = false
NameKey = "peashooter"
DescriptionKey = "peashooter_desc"
Cost = 75.0
Scene = ExtResource("1_rqf2x")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = ExtResource("1_rnq6r")
Order = 0

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bu25xgjd68gv8"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_33j6b"]
[ext_resource type="Texture2D" uid="uid://bhmnt3x5aj1l8" path="res://assets/sprites/plants/potatomine.tres" id="1_xk2pg"]
[ext_resource type="PackedScene" uid="uid://b5x35v3w2u8dx" path="res://scenes/entities/plants/potato_mine.tscn" id="2_ig2ti"]
[resource]
script = ExtResource("1_33j6b")
Layer = 1
DontRegister = false
NameKey = "potatomine"
DescriptionKey = "potatomine_desc"
Cost = 25.0
Scene = ExtResource("2_ig2ti")
ReloadTime = 25.0
ReloadProgress = 0.0
Preview = ExtResource("1_xk2pg")
Order = 3

View file

@ -1,35 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=10 format=3 uid="uid://b4r1687hg0rf5"]
[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_6km43"]
[ext_resource type="Texture2D" uid="uid://dhf2opi0brx23" path="res://assets/sprites/gui/almanach/premium_field.tres" id="1_ormja"]
[ext_resource type="PackedScene" uid="uid://bb4ya5qx224ca" path="res://scenes/entities/plants/repeater.tscn" id="2_6km43"]
[ext_resource type="Texture2D" uid="uid://31jc2e7dijas" path="res://assets/sprites/gui/PremiumPlantCard.tres" id="2_8djti"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_e606l"]
[ext_resource type="Script" uid="uid://3m7xks3xq3hl" path="res://scripts/gui/seedpackets/CustomSeedpacketFrame.cs" id="3_qnhmj"]
[sub_resource type="LabelSettings" id="LabelSettings_2f3e1"]
[sub_resource type="Resource" id="Resource_87lkl"]
script = ExtResource("3_qnhmj")
frame = ExtResource("2_8djti")
font = SubResource("LabelSettings_2f3e1")
almanachField = ExtResource("1_ormja")
metadata/_custom_type_script = "uid://3m7xks3xq3hl"
[sub_resource type="AtlasTexture" id="AtlasTexture_qnsfo"]
atlas = ExtResource("1_6km43")
region = Rect2(604, 241, 45, 51)
[resource]
script = ExtResource("3_e606l")
Layer = 1
DontRegister = false
NameKey = "repeater"
DescriptionKey = "repeater_desc"
Cost = 175.0
Scene = ExtResource("2_6km43")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = SubResource("AtlasTexture_qnsfo")
CustomFrame = SubResource("Resource_87lkl")
Order = 12

View file

@ -1,23 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://drb8nk0i3oyyl"]
[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_1eecn"]
[ext_resource type="PackedScene" uid="uid://bmk41n57j7hgx" path="res://scenes/entities/plants/snipach.tscn" id="1_h5ln5"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_u5a4p"]
[sub_resource type="AtlasTexture" id="AtlasTexture_dgfdr"]
atlas = ExtResource("1_1eecn")
region = Rect2(525, 241, 79, 72)
[resource]
script = ExtResource("1_u5a4p")
Layer = 1
DontRegister = false
NameKey = "snipach"
DescriptionKey = "snipach_desc"
Cost = 400.0
Scene = ExtResource("1_h5ln5")
ReloadTime = 7.5
ReloadProgress = 0.0
Preview = SubResource("AtlasTexture_dgfdr")
Order = 11
metadata/_custom_type_script = "uid://cyenlko1knygw"

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://duflq3eexs6m"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_0cpi0"]
[ext_resource type="Texture2D" uid="uid://cu7h8bot6jlug" path="res://assets/sprites/plants/snowpea.tres" id="1_7fyy2"]
[ext_resource type="PackedScene" uid="uid://b7innrovtmf5u" path="res://scenes/entities/plants/snowpea.tscn" id="2_k47h0"]
[resource]
script = ExtResource("1_0cpi0")
Layer = 1
DontRegister = false
NameKey = "snowpea"
DescriptionKey = "snowpea_desc"
Cost = 175.0
Scene = ExtResource("2_k47h0")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = ExtResource("1_7fyy2")
Order = 5

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://cas11tg6chiu4"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_0bymo"]
[ext_resource type="Texture2D" uid="uid://baqfahxkcvfe1" path="res://assets/sprites/plants/Spikeweed.tres" id="1_2ol2i"]
[ext_resource type="PackedScene" uid="uid://bdhod5c6o53ha" path="res://scenes/entities/plants/spikeweed.tscn" id="2_iv8de"]
[resource]
script = ExtResource("1_0bymo")
Layer = 1
DontRegister = false
NameKey = "spikeweed"
DescriptionKey = "spikeweed_desc"
Cost = 100.0
Scene = ExtResource("2_iv8de")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = ExtResource("1_2ol2i")
Order = 4

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://drm42f48urvc4"]
[ext_resource type="Texture2D" uid="uid://iw75j816gbc" path="res://assets/sprites/plants/sunflower.tres" id="1_8rd5i"]
[ext_resource type="PackedScene" uid="uid://bg7lomiorxo2c" path="res://scenes/entities/plants/sunflower.tscn" id="2_gcyr5"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_vt4jc"]
[resource]
script = ExtResource("3_vt4jc")
Layer = 1
DontRegister = false
NameKey = "sunflower"
DescriptionKey = "sunflower_desc"
Cost = 50.0
Scene = ExtResource("2_gcyr5")
ReloadTime = 5.0
ReloadProgress = 1.0
Preview = ExtResource("1_8rd5i")
Order = 1

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bnhwg57euiyf5"]
[ext_resource type="Texture2D" uid="uid://8se1nscal0em" path="res://assets/sprites/plants/threepeater.tres" id="1_hinp6"]
[ext_resource type="PackedScene" uid="uid://eegv1qihfv2q" path="res://scenes/entities/plants/threepeater.tscn" id="2_uqpu0"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_3lugi"]
[resource]
script = ExtResource("3_3lugi")
Layer = 1
DontRegister = false
NameKey = "threepeater"
DescriptionKey = "threepeater_desc"
Cost = 275.0
Scene = ExtResource("2_uqpu0")
ReloadTime = 5.0
ReloadProgress = 0.0
Preview = ExtResource("1_hinp6")
Order = 9

View file

@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://c2e2yj7rgoswi"]
[ext_resource type="Texture2D" uid="uid://g2oppl54efja" path="res://assets/sprites/plants/Wallnut.tres" id="1_2akap"]
[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_27l0t"]
[ext_resource type="PackedScene" uid="uid://bq7imkpr2yqyr" path="res://scenes/entities/plants/wallnut.tscn" id="2_rkn3h"]
[resource]
script = ExtResource("1_27l0t")
Layer = 1
DontRegister = false
NameKey = "wallnut"
DescriptionKey = "wallnut_desc"
Cost = 50.0
Scene = ExtResource("2_rkn3h")
ReloadTime = 20.0
ReloadProgress = 0.0
Preview = ExtResource("1_2akap")
Order = 2

View file

@ -1,7 +1,7 @@
[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bwwbkybryi6k0"]
[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_f3kba"]
[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="1_g1iew"]
[resource]
atlas = ExtResource("1_f3kba")
atlas = ExtResource("1_g1iew")
region = Rect2(129, 104, 45, 88)

View file

@ -181,6 +181,15 @@ cursor_right={
locale/translations=PackedStringArray("res://translations/plants.en.translation", "res://translations/plants.ru.translation", "res://translations/zombies.en.translation", "res://translations/zombies.ru.translation", "res://translations/gui.en.translation", "res://translations/gui.ru.translation", "res://translations/rewards.en.translation", "res://translations/rewards.ru.translation")
[layer_names]
2d_physics/layer_1="Structures"
2d_physics/layer_2="Plants"
2d_physics/layer_3="Zombies"
2d_physics/layer_4="Projectiles"
[rendering]
textures/canvas_textures/default_texture_filter=0
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"

View file

@ -1,7 +1,8 @@
[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=3 format=3 uid="uid://bf8u3nwwn5e1d"]
[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=4 format=3 uid="uid://bf8u3nwwn5e1d"]
[ext_resource type="Texture2D" uid="uid://ot1n4nval86w" path="res://assets/sprites/plants/peashooter.tres" id="1_o0b0s"]
[ext_resource type="Script" uid="uid://dtjdfji87kybn" path="res://scripts/resources/entity_resource.gd" id="2_jwk2v"]
[ext_resource type="PackedScene" uid="uid://bxs34adppsh5e" path="res://scenes/plants/peashooter.tscn" id="2_n78qv"]
[resource]
script = ExtResource("2_jwk2v")
@ -9,5 +10,6 @@ preview = ExtResource("1_o0b0s")
cost = 75.0
recharge_time = 5.0
initial_recharge_percent = 1.0
scene = ExtResource("2_n78qv")
order = 0
metadata/_custom_type_script = "uid://dtjdfji87kybn"

View file

@ -0,0 +1,15 @@
[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=4 format=3 uid="uid://cbooo6i1rifb7"]
[ext_resource type="Texture2D" uid="uid://dunlsp8tx7a4w" path="res://assets/sprites/zombies/Зондби.png" id="1_c2mq3"]
[ext_resource type="Script" uid="uid://dtjdfji87kybn" path="res://scripts/resources/entity_resource.gd" id="1_k277m"]
[ext_resource type="PackedScene" uid="uid://dunih4xhnupy5" path="res://scenes/zombies/basic.tscn" id="2_l6de4"]
[resource]
script = ExtResource("1_k277m")
preview = ExtResource("1_c2mq3")
cost = 1.0
recharge_time = 5.0
initial_recharge_percent = 1.0
scene = ExtResource("2_l6de4")
order = 0
metadata/_custom_type_script = "uid://dtjdfji87kybn"

View file

@ -25,13 +25,16 @@ position = Vector2(305, 76)
script = ExtResource("1_4dbyi")
metadata/_edit_lock_ = true
[node name="SeedpacketPlacer" type="CanvasGroup" parent="Game" node_paths=PackedStringArray("entity_container")]
[node name="SeedpacketPlacer" type="Node2D" parent="Game" node_paths=PackedStringArray("entity_container")]
script = ExtResource("4_5r585")
entity_container = NodePath("../../LayeredEntityContainer")
[node name="Plants" type="Node2D" parent="Game"]
unique_name_in_owner = true
[node name="Projectiles" type="Node2D" parent="Game"]
unique_name_in_owner = true
[node name="Background" type="CanvasLayer" parent="Game"]
layer = -10
follow_viewport_enabled = true

View file

@ -0,0 +1,186 @@
[gd_scene load_steps=23 format=3 uid="uid://bxs34adppsh5e"]
[ext_resource type="Texture2D" uid="uid://cksryh4w5dbbx" path="res://assets/sprites/atlases/plants/peashooter.png" id="2_4l0yo"]
[ext_resource type="Script" uid="uid://bwdvaov8sse4k" path="res://scripts/entities/entity.gd" id="2_pk084"]
[ext_resource type="Script" uid="uid://be5rfbbl5xgeh" path="res://scripts/components/generic_collider.gd" id="3_2lnl7"]
[ext_resource type="Script" uid="uid://cbmavbe4xd0j2" path="res://scripts/speed_controlled/speed_controlled_animation_tree.gd" id="3_gkdjr"]
[ext_resource type="Script" uid="uid://cbudgx741oxtc" path="res://scripts/components/generic_hurtbox.gd" id="5_gkdjr"]
[ext_resource type="Script" uid="uid://cjulv0bt6deps" path="res://scripts/components/field_segment_shape.gd" id="6_tf8ra"]
[ext_resource type="Script" uid="uid://b0ka8lb5kl1fd" path="res://scripts/components/controllers/plants/peashooter_controller.gd" id="8_0ridr"]
[ext_resource type="Script" uid="uid://d17rkta3k73jx" path="res://scripts/components/plant_death_handler.gd" id="8_6jrfv"]
[sub_resource type="Animation" id="Animation_tf8ra"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_gkdjr"]
resource_name = "idle"
length = 0.833342
loop_mode = 1
step = 0.0833333
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.166667, 0.25, 0.333333, 0.416667, 0.5, 0.583333, 0.666667, 0.75),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
[sub_resource type="Animation" id="Animation_4l0yo"]
resource_name = "shoot"
length = 0.666675
step = 0.0833333
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Sprite2D:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.0833333, 0.166667, 0.25, 0.333333, 0.416667, 0.5, 0.583333),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [10, 11, 12, 13, 14, 15, 16, 17]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Controller")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.333333),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"shoot"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0ridr"]
_data = {
&"RESET": SubResource("Animation_tf8ra"),
&"idle": SubResource("Animation_gkdjr"),
&"shoot": SubResource("Animation_4l0yo")
}
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0ridr"]
animation = &"idle"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6jrfv"]
animation = &"shoot"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_0l7qe"]
advance_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_3wvhk"]
advance_mode = 2
advance_expression = "is_shooting()"
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_hlvcn"]
switch_mode = 2
advance_mode = 2
advance_expression = "is_shooting() == false"
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_1h4ri"]
states/idle/node = SubResource("AnimationNodeAnimation_0ridr")
states/idle/position = Vector2(415, 106)
states/shoot/node = SubResource("AnimationNodeAnimation_6jrfv")
states/shoot/position = Vector2(649, 107)
transitions = ["Start", "idle", SubResource("AnimationNodeStateMachineTransition_0l7qe"), "idle", "shoot", SubResource("AnimationNodeStateMachineTransition_3wvhk"), "shoot", "idle", SubResource("AnimationNodeStateMachineTransition_hlvcn")]
[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_0l7qe"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_3wvhk"]
graph_offset = Vector2(-541.787, 73.4125)
nodes/main/node = SubResource("AnimationNodeStateMachine_1h4ri")
nodes/main/position = Vector2(-140, 160)
nodes/speed/node = SubResource("AnimationNodeTimeScale_0l7qe")
nodes/speed/position = Vector2(140, 140)
node_connections = [&"output", 0, &"speed", &"speed", 0, &"main"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_6jrfv"]
size = Vector2(26, 40)
[sub_resource type="SegmentShape2D" id="SegmentShape2D_gkdjr"]
b = Vector2(0, 0)
[node name="Peashooter" type="Node2D" groups=["Plants"]]
script = ExtResource("2_pk084")
max_hp = 30.0
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("2_4l0yo")
hframes = 10
vframes = 2
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_0ridr")
}
[node name="AnimationTree" type="AnimationTree" parent="."]
tree_root = SubResource("AnimationNodeBlendTree_3wvhk")
advance_expression_base_node = NodePath("../Controller")
anim_player = NodePath("../AnimationPlayer")
parameters/speed/scale = 1.0
script = ExtResource("3_gkdjr")
[node name="GenericCollider" type="Area2D" parent="."]
collision_layer = 2
collision_mask = 0
monitoring = false
script = ExtResource("3_2lnl7")
metadata/_custom_type_script = "uid://be5rfbbl5xgeh"
[node name="CollisionShape2D" type="CollisionShape2D" parent="GenericCollider"]
position = Vector2(0, 6)
shape = SubResource("RectangleShape2D_6jrfv")
[node name="GenericHurtbox" type="Area2D" parent="."]
position = Vector2(17, -4)
collision_layer = 0
collision_mask = 4
monitorable = false
script = ExtResource("5_gkdjr")
lookup_layers = 1
metadata/_custom_type_script = "uid://cbudgx741oxtc"
[node name="CollisionShape2D" type="CollisionShape2D" parent="GenericHurtbox"]
shape = SubResource("SegmentShape2D_gkdjr")
script = ExtResource("6_tf8ra")
[node name="Controller" type="Node" parent="." node_paths=PackedStringArray("projectile_transform")]
script = ExtResource("8_0ridr")
projectile_transform = NodePath("../ShootMarker")
[node name="Timer" type="Timer" parent="Controller"]
wait_time = 1.5
one_shot = true
[node name="ShootMarker" type="Marker2D" parent="."]
position = Vector2(17, -4)
[node name="DeathHandler" type="Node" parent="."]
script = ExtResource("8_6jrfv")
[connection signal="killed" from="." to="DeathHandler" method="_on_killed"]
[connection signal="collision_end" from="GenericHurtbox" to="Controller" method="_on_generic_hurtbox_collision_end"]
[connection signal="collision_start" from="GenericHurtbox" to="Controller" method="_on_generic_hurtbox_collision_start"]
[connection signal="timeout" from="Controller/Timer" to="Controller" method="_on_timer_timeout"]

View file

@ -0,0 +1,20 @@
[gd_scene load_steps=4 format=3 uid="uid://ciqhjwh4sfe3u"]
[ext_resource type="Script" uid="uid://fgdhvaq4dek2" path="res://scripts/projectiles/linear_projectile.gd" id="1_qt432"]
[ext_resource type="Texture2D" uid="uid://dq0mul65hevtt" path="res://assets/sprites/plants/pea.tres" id="2_inkwd"]
[sub_resource type="CircleShape2D" id="CircleShape2D_osqrk"]
radius = 6.0
[node name="Pea" type="Area2D"]
collision_layer = 8
collision_mask = 4
script = ExtResource("1_qt432")
speed = 300.0
damage = 10.0
[node name="Sprite2D" type="Sprite2D" parent="."]
texture = ExtResource("2_inkwd")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("CircleShape2D_osqrk")

1113
scenes/zombies/basic.tscn Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,33 @@
extends Node
const projectile := preload("uid://ciqhjwh4sfe3u")
@export var projectile_transform : Marker2D
var detected : bool = false
var can_shoot : bool = true
@onready var timer := $Timer
@onready var entity : Entity = get_parent()
func is_shooting():
return detected and can_shoot and entity.disabled == false
func _on_generic_hurtbox_collision_start() -> void:
detected = true
func _on_generic_hurtbox_collision_end() -> void:
detected = false
func shoot():
if can_shoot == false:
return
can_shoot = false
timer.start()
var proj = projectile.instantiate()
get_tree().current_scene.get_node("%Projectiles").add_child(proj)
proj.global_transform = projectile_transform.global_transform
proj.source = entity
func _on_timer_timeout() -> void:
can_shoot = true

View file

@ -0,0 +1 @@
uid://b0ka8lb5kl1fd

View file

@ -0,0 +1,29 @@
extends Node
var eating:
get:
return is_eating()
var walking:
get:
return is_walking()
@export var hurtbox : GenericHurtbox
@export var damage : float
@onready var disablable := get_parent()
var killed := false
func _on_entity_killed(_context: RefCounted) -> void:
if killed: return
$"../AnimationTree"["parameters/main/playback"].travel("death")
killed = true
func is_eating() -> bool:
return hurtbox.is_colliding() and disablable.disabled == false
func is_walking() -> bool:
return disablable.disabled == false
func bite() -> void:
if hurtbox.is_colliding() == false: return
hurtbox.get_colliding_entity().deal_damage(damage,get_parent())

View file

@ -0,0 +1 @@
uid://bg88vb74hinkj

View file

@ -0,0 +1,4 @@
extends CollisionShape2D
func _process(_delta: float) -> void:
shape.b = Vector2(FieldParams.field_rect.end.x-global_position.x+FieldParams.TILE.x,0)

View file

@ -0,0 +1 @@
uid://cjulv0bt6deps

View file

@ -0,0 +1,15 @@
extends Area2D
## Base class for generic colliders.
class_name GenericCollider
## Contact layer. Used to check
enum Layers
{
NORMAL = 1,
LOW = 2,
HIGH = 4
}
@export var layer : Layers = Layers.NORMAL

View file

@ -0,0 +1 @@
uid://be5rfbbl5xgeh

View file

@ -0,0 +1,45 @@
extends Area2D
class_name GenericHurtbox
@export_flags("NORMAL:1","LOW:2","HIGH:4") var lookup_layers : int = 0
var entities : Array[Entity] = []
signal entity_added(entity : Entity)
signal entity_removed(entity : Entity)
signal collision_start
signal collision_end
func _ready() -> void:
area_entered.connect(on_area_entered)
area_exited.connect(on_area_exited)
func on_area_entered(area: Area2D):
if area is GenericCollider:
if lookup_layers & area.layer != 0:
add_entity(area.get_parent())
func on_area_exited(area: Area2D):
if area is GenericCollider:
if lookup_layers & area.layer != 0:
remove_entity(area.get_parent())
func add_entity(entity : Entity):
entities.append(entity)
entity_added.emit(entity)
if entities.size() == 1:
collision_start.emit()
func remove_entity(entity : Entity):
entities.erase(entity)
entity_removed.emit(entity)
if entities.size() == 0:
collision_end.emit()
func get_colliding_entity() -> Entity:
if entities.size() == 0:
return null
return entities[0]
func is_colliding() -> bool:
return entities.size() > 0

View file

@ -0,0 +1 @@
uid://cbudgx741oxtc

View file

@ -0,0 +1,10 @@
extends Node
@export_range(0,2,0.001,"or_greater","hide_slider","suffix:tiles/second") var speed : float = 0.2
# Used by animation players to control zombie's movement
@export var speed_control : float = 0.0
@onready var parent : Node2D = get_parent()
func _physics_process(delta: float) -> void:
parent.global_position += -parent.global_transform.x * speed_control * speed * delta * FieldParams.TILE.x

View file

@ -0,0 +1 @@
uid://bdacurei5fp02

View file

@ -0,0 +1,5 @@
extends Node
func _on_killed(context: RefCounted) -> void:
get_parent().deconstruct()

View file

@ -0,0 +1 @@
uid://d17rkta3k73jx

View file

@ -0,0 +1,5 @@
extends Node
func _on_animation_tree_animation_finished(anim_name: StringName) -> void:
if anim_name.split("/")[1] == "death":
get_parent().deconstruct()

View file

@ -0,0 +1 @@
uid://dfnyam1pvkb73

View file

@ -8,8 +8,9 @@ class_name Entity
## Optional spawn layer for grid interactions
@export var layer : StringName = ""
## Current amount of health points of an entity. Cannot be below 0 or [code]max_hp[/code]
var hp : float = max_hp
@onready var hp : float = max_hp
##
var disabled : bool = false
signal damaged
## Emitted when damage is taken
@ -20,6 +21,21 @@ signal healed(context : HealedContext)
signal hp_changed(context : HPChangedContext)
## Emitted when kill is requested
signal killed(context : KilledContext)
##
signal toggled(disabled : bool)
##
func disable():
if disabled: return
disabled = true
toggled.emit(disabled)
##
func enable():
if disabled == false: return
disabled = false
toggled.emit(disabled)
## Properly deal damage to entity
func deal_damage(amount : float, source : Entity):
@ -42,7 +58,6 @@ func deal_damage(amount : float, source : Entity):
hp = 0
kill(source)
## Properly heal entity
func heal(amount : float, source : Entity):
var context = HealedContext.new()
@ -61,7 +76,6 @@ func heal(amount : float, source : Entity):
if hp > max_hp:
hp = max_hp
## Invoked when an entity is killed by damage.
func kill(source : Entity):
var context = KilledContext.new()
@ -72,9 +86,6 @@ func kill(source : Entity):
LevelEventBus.entity_killed.emit(context)
if not layer.is_empty():
LevelEventBus.layer_entity_killed.emit(context)
deconstruct()
## Method used to properly deconstruct entity
func deconstruct():

View file

@ -1,4 +1,4 @@
extends CanvasGroup
extends Node2D
@export var entity_container : LayeredEntityContainer
var can_plant : bool = false
@ -24,13 +24,16 @@ func _input(event: InputEvent) -> void:
if held_packet != null and can_plant and event.is_action_pressed("primary_action"):
for child in get_children():
child.enable()
child.reparent(get_tree().current_scene.get_node("%Plants"))
LevelEventBus.packet_placed.emit(held_packet)
held_packet = null
visible = false
func on_seedpacket_selected(packet : SeedpacketResource) -> void:
add_child(packet.scene.instantiate())
var instantiated = packet.scene.instantiate()
add_child(instantiated)
instantiated.disable()
held_packet = packet
visible = true

View file

@ -0,0 +1,18 @@
extends Area2D
var source : Entity
@export var speed : float
@export var damage : float
func _ready() -> void:
area_entered.connect(on_area_entered)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta: float) -> void:
global_position += global_transform.x * speed * delta
func on_area_entered(area : Area2D):
if area.get_parent() != null:
area.get_parent().deal_damage(damage, source)
queue_free()

View file

@ -0,0 +1 @@
uid://fgdhvaq4dek2

View file

@ -0,0 +1,5 @@
extends AnimationTree
func on_speed_changed(speed : float):
set("parameters/speed/scale",speed)

View file

@ -0,0 +1 @@
uid://cbmavbe4xd0j2

View file

@ -0,0 +1,16 @@
extends Timer
var old_speed : float
func on_speed_changed(speed : float):
var ratio = speed / old_speed
var old_wait_time = wait_time
var old_time_left = time_left
if old_time_left > 0:
start(old_time_left * ratio)
wait_time = old_wait_time * ratio
old_speed = speed

View file

@ -0,0 +1 @@
uid://bk1twclmpvalk