seed queue + seed card + distant spawn + reproduction

This commit is contained in:
2024-09-01 03:33:38 +02:00
parent 6faa06f036
commit 0a5af3879d
16 changed files with 311 additions and 58 deletions

View File

@@ -6,9 +6,10 @@
[ext_resource type="Resource" uid="uid://dnahox31xqy6l" path="res://objects/plant_types/peuplier.tres" id="4_tmfl1"]
[ext_resource type="Resource" uid="uid://b6ufxuqdcgwmx" path="res://objects/plant_types/chene.tres" id="5_j34av"]
[node name="Planter" type="Node"]
[node name="Planter" type="Node2D"]
y_sort_enabled = true
script = ExtResource("1_l7lry")
plants = Array[ExtResource("2_7h3ga")]([ExtResource("3_lgbrc"), ExtResource("5_j34av"), ExtResource("4_tmfl1")])
plants = Array[ExtResource("2_7h3ga")]([ExtResource("3_lgbrc"), ExtResource("4_tmfl1"), ExtResource("5_j34av")])
[node name="Timer" type="Timer" parent="."]
wait_time = 0.2

View File

@@ -1,4 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://iaf4md4cbwqh"]
[gd_scene load_steps=5 format=3 uid="uid://iaf4md4cbwqh"]
[ext_resource type="Script" path="res://scripts/gui/seed_card.gd" id="1_ecgsq"]
[sub_resource type="Gradient" id="Gradient_lissx"]
offsets = PackedFloat32Array(1)
@@ -14,6 +16,7 @@ layout_mode = 3
anchors_preset = 0
size_flags_horizontal = 8
size_flags_vertical = 8
script = ExtResource("1_ecgsq")
[node name="Card" type="PanelContainer" parent="."]
layout_mode = 1

View File

@@ -1,4 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bm8nlb7kmaa6k"]
[gd_scene load_steps=3 format=3 uid="uid://bm8nlb7kmaa6k"]
[ext_resource type="Script" path="res://scripts/gui/seed_queue.gd" id="1_6lrhe"]
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_reedq"]
@@ -9,6 +11,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_6lrhe")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 1
@@ -20,12 +23,6 @@ grow_horizontal = 2
grow_vertical = 0
theme_override_constants/separation = 10
[node name="NextSeed" type="TextureRect" parent="HBoxContainer"]
custom_minimum_size = Vector2(80, 80)
layout_mode = 2
texture = SubResource("NoiseTexture2D_reedq")
expand_mode = 2
[node name="Queue" type="HBoxContainer" parent="HBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 10
@@ -70,3 +67,9 @@ size_flags_horizontal = 4
size_flags_vertical = 8
texture = SubResource("NoiseTexture2D_reedq")
expand_mode = 2
[node name="NextSeed" type="TextureRect" parent="HBoxContainer"]
custom_minimum_size = Vector2(80, 80)
layout_mode = 2
texture = SubResource("NoiseTexture2D_reedq")
expand_mode = 2

View File

@@ -1,4 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://x4kv2y5f52cm"]
[gd_scene load_steps=6 format=3 uid="uid://x4kv2y5f52cm"]
[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="1_n5onq"]
[sub_resource type="GDScript" id="GDScript_x3g5o"]
script/source = "class_name Plant
@@ -11,24 +13,31 @@ signal grown
signal died
@onready var growing_timer: Timer = $Growing
@onready var sprite_node: AnimatedSprite2D = $AnimatedSprite2D
@onready var need_checker: Timer = $NeedChecker
@onready var sapling_count_down: Timer = $SaplingCountDown
@onready var reproduction: Timer = $Reproduction
@onready var sprite_node: AnimatedSprite2D = $AnimatedSprite2D
const NEEDCHECKPERIOD := 1.0
const NEED_CHECK_PERIOD := 0.5
const SAPLING_LIFETIME_MULT := 2.0 # this multiplies the time to grow to tell the time it can stay as a sapling
const OFFSET_REPRODUCTION_PERCT_DIST := 0.5
var parameter: PlantType
var state := PlantState.SAPLING
var sapling_time_left: float
var can_grow := true
func init(plant_parameter: PlantType):
parameter = plant_parameter
sapling_count_down.start(SAPLING_LIFETIME_MULT * parameter.growing_time)
sprite_node.sprite_frames = parameter.sprite_frames
need_checker.start(NEEDCHECKPERIOD)
need_checker.start(NEED_CHECK_PERIOD)
func _on_need_checker_timeout() -> void:
can_grow = check_terrain_viability()
growing_timer.paused = not can_grow
growing_timer.paused = not can_grow and state == PlantState.SAPLING
reproduction.paused = not can_grow
func check_terrain_viability() -> bool:
var water := GameTerrain.get_stat(position, GameTerrain.Stats.WATER)
@@ -41,20 +50,26 @@ func check_terrain_viability() -> bool:
var presence := GameTerrain.get_stat(position, GameTerrain.Stats.PRESENCE)
presence += GameTerrain.LEVELS_NUMBER / 2
if presence < parameter.presence_need[0] or parameter.presence_need[1]:
if presence < parameter.presence_need[0] or presence > parameter.presence_need[1]:
return false
return true
func _on_growing_timeout() -> void:
if state == PlantState.SAPLING:
can_grow = check_terrain_viability()
if not can_grow:
growing_timer.start()
return
match state:
PlantState.SAPLING:
grow()
PlantState.GROWN:
die()
PlantState.DEAD:
push_error(\"Already dead\")
remove()
func plant(new_position: Vector2):
@@ -69,6 +84,7 @@ func grow():
push_error(\"Tried to grow \" + parameter.type + \", but was not at sapling state\")
return
state = PlantState.GROWN
sapling_count_down.stop()
growing_timer.start(parameter.dying_time)
GameTerrain.modify_zone(position,
parameter.distance_prod,
@@ -82,25 +98,87 @@ func grow():
parameter.distance_prod,
GameTerrain.Stats.PRESENCE,
parameter.presence_prod)
reproduction.start(parameter.dying_time / (parameter.offspring_per_lifetime + 1) + 0.1)
grown.emit()
sprite_node.play(\"GROWN\")
func die():
state = PlantState.DEAD
# remove alive prod and add dead prod
GameTerrain.modify_zone(position,
parameter.distance_prod,
GameTerrain.Stats.WATER,
-parameter.water_prod + parameter.dead_water_prod)
GameTerrain.modify_zone(position,
parameter.distance_prod,
GameTerrain.Stats.FERTILITY,
-parameter.fertility_prod + parameter.dead_fertility_prod)
GameTerrain.modify_zone(position,
parameter.distance_prod,
GameTerrain.Stats.PRESENCE,
-parameter.presence_prod)
growing_timer.start(parameter.dead_time)
died.emit()
sprite_node.play(\"DEAD\")
func remove(was_dead: bool = true):
if was_dead:
GameTerrain.modify_zone(position,
parameter.distance_prod,
GameTerrain.Stats.WATER,
-parameter.dead_water_prod)
GameTerrain.modify_zone(position,
parameter.distance_prod,
GameTerrain.Stats.FERTILITY,
-parameter.dead_fertility_prod)
queue_free()
func _on_sapling_count_down_timeout() -> void:
remove(false)
func _on_reproduction_timeout() -> void:
var min_dist := parameter.distance_prod - parameter.distance_prod * OFFSET_REPRODUCTION_PERCT_DIST
var max_dist := parameter.distance_prod + parameter.distance_prod * OFFSET_REPRODUCTION_PERCT_DIST
var plant_pos = position + (Vector2.RIGHT * randf_range(min_dist, max_dist)).rotated(randf_range(0, PI))
var space := get_world_2d().direct_space_state
var parameters = PhysicsPointQueryParameters2D.new()
parameters.position = plant_pos
parameters.collide_with_areas = true
parameters.collide_with_bodies = false
var result := space.intersect_point(parameters, 1)
if result.size() > 0:
return
var offspring = self.duplicate()
self.get_parent().add_child(offspring)
offspring.init(parameter)
offspring.plant(plant_pos)
"
[sub_resource type="AtlasTexture" id="AtlasTexture_5did5"]
atlas = ExtResource("1_n5onq")
region = Rect2(810, 540, 270, 270)
[sub_resource type="SpriteFrames" id="SpriteFrames_667un"]
animations = [{
"frames": [],
"frames": [{
"duration": 1.0,
"texture": SubResource("AtlasTexture_5did5")
}],
"loop": true,
"name": &"SEED",
"speed": 5.0
}]
[sub_resource type="CircleShape2D" id="CircleShape2D_jksuk"]
radius = 36.0
[node name="Plant" type="Node2D"]
script = SubResource("GDScript_x3g5o")
@@ -109,10 +187,23 @@ one_shot = true
[node name="NeedChecker" type="Timer" parent="."]
[node name="SaplingCountDown" type="Timer" parent="."]
one_shot = true
[node name="Reproduction" type="Timer" parent="."]
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
scale = Vector2(0.2, 0.2)
sprite_frames = SubResource("SpriteFrames_667un")
animation = &"SEED"
offset = Vector2(0, -250)
[node name="Area2D" type="Area2D" parent="."]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("CircleShape2D_jksuk")
[connection signal="timeout" from="Growing" to="." method="_on_growing_timeout"]
[connection signal="timeout" from="NeedChecker" to="." method="_on_need_checker_timeout"]
[connection signal="timeout" from="SaplingCountDown" to="." method="_on_sapling_count_down_timeout"]
[connection signal="timeout" from="Reproduction" to="." method="_on_reproduction_timeout"]

View File

@@ -1,8 +1,13 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://bgi2lo7kb3d2v"]
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://bgi2lo7kb3d2v"]
[ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_i8xe4"]
[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_4rpny"]
[ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_gaemm"]
[sub_resource type="AtlasTexture" id="AtlasTexture_1lwna"]
atlas = ExtResource("2_4rpny")
region = Rect2(0, 0, 270, 270)
[sub_resource type="AtlasTexture" id="AtlasTexture_fxqnu"]
atlas = ExtResource("2_gaemm")
region = Rect2(1920, 1620, 320, 540)
@@ -45,15 +50,18 @@ animations = [{
[resource]
script = ExtResource("1_i8xe4")
type = "Chardon"
seed_sprite = SubResource("AtlasTexture_1lwna")
sprite_frames = SubResource("SpriteFrames_fxtnk")
growing_time = 0.5
dying_time = 10.0
water_need = [0, 0]
fertility_need = [0, 0]
presence_need = [0, 0]
water_prod = 1
fertility_prod = -1
presence_prod = 1
growing_time = 1.0
offspring_per_lifetime = 1
dying_time = 30.0
dead_time = 10.0
water_need = [-5, 5]
fertility_need = [-5, 5]
presence_need = [0, 5]
water_prod = 2
fertility_prod = 0
presence_prod = 2
dead_water_prod = 0
dead_fertility_prod = 1
distance_prod = 50
distance_prod = 150

View File

@@ -1,7 +1,12 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://b6ufxuqdcgwmx"]
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://b6ufxuqdcgwmx"]
[ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_meppe"]
[ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_jkmk8"]
[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_m81be"]
[sub_resource type="AtlasTexture" id="AtlasTexture_bqj8q"]
atlas = ExtResource("2_m81be")
region = Rect2(270, 0, 270, 270)
[sub_resource type="AtlasTexture" id="AtlasTexture_vmgwa"]
atlas = ExtResource("2_jkmk8")
@@ -45,15 +50,18 @@ animations = [{
[resource]
script = ExtResource("1_meppe")
type = "Chene"
seed_sprite = SubResource("AtlasTexture_bqj8q")
sprite_frames = SubResource("SpriteFrames_shufc")
growing_time = 50.0
growing_time = 20.0
offspring_per_lifetime = 3
dying_time = 100.0
water_need = [0, 0]
fertility_need = [0, 0]
presence_need = [0, 0]
water_prod = 1
fertility_prod = 2
presence_prod = 1
dead_time = 200.0
water_need = [1, 5]
fertility_need = [1, 5]
presence_need = [3, 7]
water_prod = 3
fertility_prod = 0
presence_prod = 5
dead_water_prod = 0
dead_fertility_prod = 1
distance_prod = 50
dead_fertility_prod = 5
distance_prod = 400

View File

@@ -1,7 +1,12 @@
[gd_resource type="Resource" script_class="PlantType" load_steps=7 format=3 uid="uid://dnahox31xqy6l"]
[gd_resource type="Resource" script_class="PlantType" load_steps=9 format=3 uid="uid://dnahox31xqy6l"]
[ext_resource type="Script" path="res://scripts/plant_type.gd" id="1_mhtmv"]
[ext_resource type="Texture2D" uid="uid://r1bq2tgt1yxf" path="res://assets/gamejam_plantes_props1.png" id="2_gcjog"]
[ext_resource type="Texture2D" uid="uid://b3kjaw1hajc6s" path="res://assets/grille_seeds.png" id="2_od2qm"]
[sub_resource type="AtlasTexture" id="AtlasTexture_dkacp"]
atlas = ExtResource("2_od2qm")
region = Rect2(540, 0, 270, 270)
[sub_resource type="AtlasTexture" id="AtlasTexture_ncq3n"]
atlas = ExtResource("2_gcjog")
@@ -44,16 +49,19 @@ animations = [{
[resource]
script = ExtResource("1_mhtmv")
type = "Peuplier"
type = "Buisson"
seed_sprite = SubResource("AtlasTexture_dkacp")
sprite_frames = SubResource("SpriteFrames_d15np")
growing_time = 2.0
dying_time = 2.0
water_need = [0, 0]
fertility_need = [0, 0]
presence_need = [0, 0]
water_prod = 2
offspring_per_lifetime = 1
dying_time = 45.0
dead_time = 15.0
water_need = [1, 5]
fertility_need = [-5, 5]
presence_need = [1, 10]
water_prod = 0
fertility_prod = 2
presence_prod = 1
presence_prod = 3
dead_water_prod = 0
dead_fertility_prod = 1
distance_prod = 25.0
distance_prod = 250