texture_builder + growing sprites

This commit is contained in:
Altaezio
2026-02-13 16:49:14 +01:00
parent e6d34a50a5
commit e305e3213d
10 changed files with 239 additions and 218 deletions

View File

@@ -0,0 +1,85 @@
[gd_scene format=3 uid="uid://b8gqdgabrjaml"]
[ext_resource type="Script" uid="uid://dt2ip3pw2cboy" path="res://entities/plants/scripts/texture_builder/texture_builder.gd" id="1_s8rsj"]
[ext_resource type="Script" uid="uid://b3jwglylqdqtw" path="res://entities/plants/scripts/texture_builder/plant_part.gd" id="2_cfiqo"]
[ext_resource type="Resource" uid="uid://bfyafiewcrjln" path="res://entities/plants/resources/plant_parts/Base1.tres" id="3_coupj"]
[ext_resource type="Resource" uid="uid://d2vdf2sth2xjm" path="res://entities/plants/resources/plant_parts/Base3.tres" id="4_coupj"]
[ext_resource type="Resource" uid="uid://7hrdkl6bf3o4" path="res://entities/plants/resources/plant_parts/Branch1.tres" id="4_ggud5"]
[ext_resource type="Resource" uid="uid://clruuysx80pnn" path="res://entities/plants/resources/plant_parts/Base4.tres" id="5_ggud5"]
[ext_resource type="Resource" uid="uid://ceisi5yyie7to" path="res://entities/plants/resources/plant_parts/Branch2.tres" id="5_ufbqh"]
[ext_resource type="Resource" uid="uid://cxiu8frk04b5i" path="res://entities/plants/resources/plant_parts/Branch3.tres" id="6_jbu3q"]
[ext_resource type="Resource" uid="uid://53p5g07e3pb4" path="res://entities/plants/resources/plant_parts/Branch4.tres" id="7_21cjy"]
[ext_resource type="Resource" uid="uid://d2y7o2hc6ffei" path="res://entities/plants/resources/plant_parts/Branch11.tres" id="8_rs2ow"]
[ext_resource type="Resource" uid="uid://civ4gr1c2pq7g" path="res://entities/plants/resources/plant_parts/Branch12.tres" id="9_5job5"]
[ext_resource type="Resource" uid="uid://bqfocs6f0iypo" path="res://entities/plants/resources/plant_parts/Branch13.tres" id="10_cynqk"]
[ext_resource type="Resource" uid="uid://drml5dm8i3j3a" path="res://entities/plants/resources/plant_parts/Branch14.tres" id="11_b21au"]
[ext_resource type="Resource" uid="uid://b1t5nfwcln5vo" path="res://entities/plants/resources/plant_parts/Branch15.tres" id="12_17ac3"]
[ext_resource type="Resource" uid="uid://b4s58a600q2rn" path="res://entities/plants/resources/plant_parts/Branch16.tres" id="13_fuh2b"]
[ext_resource type="Resource" uid="uid://dspugxsjw2aea" path="res://entities/plants/resources/plant_parts/Branch17.tres" id="14_28gvc"]
[ext_resource type="Resource" uid="uid://cnt38l2fmg8d7" path="res://entities/plants/resources/plant_parts/Branch18.tres" id="15_1cwvj"]
[ext_resource type="Script" uid="uid://cfjd8jelpm8dt" path="res://entities/plants/scripts/texture_builder/part_mutation_association.gd" id="16_c3tk3"]
[ext_resource type="Resource" uid="uid://wxqxm6d5twdh" path="res://entities/plants/resources/plant_parts/Leaf8.tres" id="17_q0jli"]
[ext_resource type="Resource" uid="uid://uoikjpno37bi" path="res://entities/plants/resources/plant_parts/Leaf9.tres" id="18_rplk6"]
[ext_resource type="Resource" uid="uid://c5gqwck2p5h5n" path="res://entities/plants/resources/plant_parts/Leaf10.tres" id="19_mcckl"]
[ext_resource type="Resource" uid="uid://c5fj1cw0f4mu6" path="res://entities/plants/resources/plant_parts/Leaf11.tres" id="20_3hcun"]
[ext_resource type="Resource" uid="uid://dce788f0adauv" path="res://entities/plants/resources/plant_parts/Leaf12.tres" id="21_kvmj5"]
[ext_resource type="Resource" uid="uid://dd34dikqoynp3" path="res://entities/plants/resources/plant_parts/Leaf13.tres" id="22_ocu7e"]
[ext_resource type="Resource" uid="uid://bynje6g2wvuvl" path="res://entities/plants/resources/plant_parts/Leaf14.tres" id="23_q771y"]
[ext_resource type="Resource" uid="uid://bd2op6q1masjt" path="res://entities/plants/resources/plant_parts/Leaf15.tres" id="24_5fbyu"]
[ext_resource type="Resource" uid="uid://bvajuw0r47edw" path="res://entities/plants/resources/plant_parts/Leaf16.tres" id="25_2plsj"]
[ext_resource type="Resource" uid="uid://cxgw1vgket0fw" path="res://entities/plants/resources/plant_parts/Leaf1.tres" id="26_yjh7s"]
[ext_resource type="Resource" uid="uid://qb6bftgq0n6y" path="res://entities/plants/resources/plant_parts/Leaf2.tres" id="27_abtbh"]
[ext_resource type="Resource" uid="uid://ft112n57di0e" path="res://entities/plants/resources/plant_parts/Leaf3.tres" id="28_j5s6w"]
[ext_resource type="Resource" uid="uid://dwjj6qmcjhn68" path="res://entities/plants/resources/plant_parts/Leaf4.tres" id="29_p21mk"]
[ext_resource type="Resource" uid="uid://bkr70mstyf8pp" path="res://entities/plants/resources/plant_parts/Leaf5.tres" id="30_wmcor"]
[ext_resource type="Resource" uid="uid://dcuwupmqt34ju" path="res://entities/plants/resources/plant_parts/Leaf6.tres" id="31_dx2ud"]
[ext_resource type="Resource" uid="uid://djmidq7yq452i" path="res://entities/plants/resources/plant_parts/Leaf7.tres" id="32_fpktn"]
[ext_resource type="Resource" uid="uid://crmvc77bqax1y" path="res://entities/plants/resources/plant_parts/Flower1.tres" id="33_7b70u"]
[ext_resource type="Resource" uid="uid://c0hr7icfkjkoi" path="res://entities/plants/resources/plant_parts/Flower2.tres" id="34_q8uyx"]
[ext_resource type="Resource" uid="uid://clkoc1iccts2w" path="res://entities/plants/resources/plant_parts/Flower3.tres" id="35_r166b"]
[ext_resource type="Resource" uid="uid://bd8yapi1pokj6" path="res://entities/plants/resources/plant_parts/Flower4.tres" id="36_78dq1"]
[ext_resource type="Resource" uid="uid://brmd6d3l8trqs" path="res://entities/plants/resources/plant_parts/BottomLeaf1.tres" id="37_kyre2"]
[ext_resource type="Resource" uid="uid://cfr33014u7ig5" path="res://entities/plants/resources/plant_parts/BottomLeaf2.tres" id="38_hwp0s"]
[ext_resource type="Resource" uid="uid://cf70m1us8mfqp" path="res://entities/plants/resources/plant_parts/BottomLeaf3.tres" id="39_wjthp"]
[ext_resource type="Resource" uid="uid://ctlmah4ohqp25" path="res://entities/plants/resources/plant_parts/BottomLeaf4.tres" id="40_rf72b"]
[ext_resource type="Resource" uid="uid://b8o4q0hsm84ov" path="res://entities/plants/resources/plant_parts/BottomLeaf5.tres" id="41_fnybh"]
[ext_resource type="Resource" uid="uid://bb33v756anesy" path="res://entities/plants/resources/plant_parts/BottomLeaf6.tres" id="42_6o0xq"]
[ext_resource type="Resource" uid="uid://cbqrl72y0d1yg" path="res://entities/plants/resources/plant_parts/BottomLeaf7.tres" id="43_h02jx"]
[ext_resource type="Resource" uid="uid://dwppani7gyjl5" path="res://entities/plants/resources/plant_parts/BottomLeaf8.tres" id="44_1v1v5"]
[ext_resource type="Resource" uid="uid://dkta1u1u0efxk" path="res://entities/plants/resources/plant_parts/BottomLeaf9.tres" id="45_yha2t"]
[sub_resource type="Resource" id="Resource_x75j3"]
script = ExtResource("16_c3tk3")
parts = Array[ExtResource("2_cfiqo")]([ExtResource("17_q0jli"), ExtResource("18_rplk6"), ExtResource("19_mcckl"), ExtResource("20_3hcun"), ExtResource("21_kvmj5"), ExtResource("22_ocu7e"), ExtResource("23_q771y"), ExtResource("24_5fbyu"), ExtResource("25_2plsj")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_setyo"]
script = ExtResource("16_c3tk3")
parts = Array[ExtResource("2_cfiqo")]([ExtResource("26_yjh7s"), ExtResource("27_abtbh"), ExtResource("28_j5s6w"), ExtResource("29_p21mk"), ExtResource("30_wmcor"), ExtResource("31_dx2ud"), ExtResource("32_fpktn")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_n40r1"]
script = ExtResource("16_c3tk3")
parts = Array[ExtResource("2_cfiqo")]([ExtResource("33_7b70u"), ExtResource("34_q8uyx"), ExtResource("35_r166b"), ExtResource("36_78dq1")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_pw6ot"]
script = ExtResource("16_c3tk3")
parts = Array[ExtResource("2_cfiqo")]([ExtResource("37_kyre2"), ExtResource("38_hwp0s"), ExtResource("39_wjthp"), ExtResource("40_rf72b"), ExtResource("41_fnybh"), ExtResource("42_6o0xq"), ExtResource("43_h02jx"), ExtResource("44_1v1v5"), ExtResource("45_yha2t")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[node name="TextureBuilder" type="Node" unique_id=79184097]
script = ExtResource("1_s8rsj")
bases = Array[ExtResource("2_cfiqo")]([ExtResource("3_coupj")])
baby_bases = Array[ExtResource("2_cfiqo")]([ExtResource("4_coupj"), ExtResource("5_ggud5")])
branches = Array[ExtResource("2_cfiqo")]([ExtResource("4_ggud5"), ExtResource("5_ufbqh"), ExtResource("6_jbu3q"), ExtResource("7_21cjy"), ExtResource("8_rs2ow"), ExtResource("9_5job5"), ExtResource("10_cynqk"), ExtResource("11_b21au"), ExtResource("12_17ac3"), ExtResource("13_fuh2b"), ExtResource("14_28gvc"), ExtResource("15_1cwvj")])
parts_mutation_associations = Dictionary[String, ExtResource("16_c3tk3")]({
"ANCIENT": SubResource("Resource_x75j3"),
"PRECOCIOUS": SubResource("Resource_setyo"),
"QUALITY": SubResource("Resource_n40r1"),
"QUICK": SubResource("Resource_pw6ot")
})

View File

@@ -5,26 +5,37 @@
[sub_resource type="AtlasTexture" id="AtlasTexture_mypt2"]
atlas = ExtResource("1_8nppj")
region = Rect2(450, 1656, 194, 235)
region = Rect2(46, 30, 308, 671)
[node name="Base1" type="Sprite2D" unique_id=1642167049 node_paths=PackedStringArray("root", "attaches", "bottom_attaches")]
texture = SubResource("AtlasTexture_mypt2")
script = ExtResource("2_a5yje")
part_name = "Branch15"
part_name = "Base1"
root = NodePath("Root")
attaches = NodePath("Attaches")
bottom_attaches = NodePath("BottomAttaches")
type = 1
[node name="Root" type="Node2D" parent="." unique_id=1974108401]
position = Vector2(33, 85)
position = Vector2(14, 263)
[node name="Attaches" type="Node" parent="." unique_id=2082226435]
[node name="attach0" type="Node2D" parent="Attaches" unique_id=43079773]
position = Vector2(-6, 19)
[node name="attach1" type="Node2D" parent="Attaches" unique_id=808392694]
position = Vector2(0, -251)
[node name="attach1" type="Node2D" parent="Attaches" unique_id=950516844]
position = Vector2(-33, -25)
[node name="attach2" type="Node2D" parent="Attaches" unique_id=1951230244]
position = Vector2(10, -85)
[node name="attach3" type="Node2D" parent="Attaches" unique_id=1491711670]
position = Vector2(81, 80)
[node name="BottomAttaches" type="Node" parent="." unique_id=456407982]
[node name="battom_attach0" type="Node2D" parent="BottomAttaches" unique_id=885194661]
position = Vector2(-17, 293)
[node name="battom_attach1" type="Node2D" parent="BottomAttaches" unique_id=1362515589]
position = Vector2(27, 295)
[node name="battom_attach2" type="Node2D" parent="BottomAttaches" unique_id=1546335762]
position = Vector2(52, 300)

View File

@@ -2,51 +2,6 @@
[ext_resource type="Script" uid="uid://bmjjpk4lvijws" path="res://entities/plants/scripts/plant_sprite.gd" id="1_pq8o7"]
[ext_resource type="Texture2D" uid="uid://pltmnkqd5ut2" path="res://entities/plants/assets/sprites/seeds/grille_seeds.png" id="3_j6jm5"]
[ext_resource type="Script" uid="uid://dt2ip3pw2cboy" path="res://entities/plants/scripts/texture_builder/texture_builder.gd" id="3_rbgiq"]
[ext_resource type="Script" uid="uid://b3jwglylqdqtw" path="res://entities/plants/scripts/texture_builder/plant_part.gd" id="4_mielr"]
[ext_resource type="Texture2D" uid="uid://doo2cxxa2p70a" path="res://entities/plants/assets/sprites/plante-teste.png" id="5_qp2py"]
[ext_resource type="Resource" uid="uid://7hrdkl6bf3o4" path="res://entities/plants/resources/plant_parts/Branch1.tres" id="8_i5o73"]
[ext_resource type="Resource" uid="uid://ceisi5yyie7to" path="res://entities/plants/resources/plant_parts/Branch2.tres" id="9_mlxcy"]
[ext_resource type="Resource" uid="uid://cxiu8frk04b5i" path="res://entities/plants/resources/plant_parts/Branch3.tres" id="10_n3d4s"]
[ext_resource type="Resource" uid="uid://53p5g07e3pb4" path="res://entities/plants/resources/plant_parts/Branch4.tres" id="11_pggx4"]
[ext_resource type="Resource" uid="uid://d2y7o2hc6ffei" path="res://entities/plants/resources/plant_parts/Branch11.tres" id="14_2krt4"]
[ext_resource type="Resource" uid="uid://civ4gr1c2pq7g" path="res://entities/plants/resources/plant_parts/Branch12.tres" id="15_qkfpr"]
[ext_resource type="Resource" uid="uid://bqfocs6f0iypo" path="res://entities/plants/resources/plant_parts/Branch13.tres" id="16_jm13q"]
[ext_resource type="Resource" uid="uid://drml5dm8i3j3a" path="res://entities/plants/resources/plant_parts/Branch14.tres" id="17_5vody"]
[ext_resource type="Resource" uid="uid://b1t5nfwcln5vo" path="res://entities/plants/resources/plant_parts/Branch15.tres" id="18_tp5s5"]
[ext_resource type="Resource" uid="uid://b4s58a600q2rn" path="res://entities/plants/resources/plant_parts/Branch16.tres" id="19_httlt"]
[ext_resource type="Resource" uid="uid://dspugxsjw2aea" path="res://entities/plants/resources/plant_parts/Branch17.tres" id="20_y3j8r"]
[ext_resource type="Resource" uid="uid://cnt38l2fmg8d7" path="res://entities/plants/resources/plant_parts/Branch18.tres" id="21_yl2lr"]
[ext_resource type="Script" uid="uid://cfjd8jelpm8dt" path="res://entities/plants/scripts/texture_builder/part_mutation_association.gd" id="23_5ma63"]
[ext_resource type="Resource" uid="uid://wxqxm6d5twdh" path="res://entities/plants/resources/plant_parts/Leaf8.tres" id="25_ago21"]
[ext_resource type="Resource" uid="uid://uoikjpno37bi" path="res://entities/plants/resources/plant_parts/Leaf9.tres" id="26_yy0xk"]
[ext_resource type="Resource" uid="uid://c5gqwck2p5h5n" path="res://entities/plants/resources/plant_parts/Leaf10.tres" id="27_xa5is"]
[ext_resource type="Resource" uid="uid://c5fj1cw0f4mu6" path="res://entities/plants/resources/plant_parts/Leaf11.tres" id="28_4tlyl"]
[ext_resource type="Resource" uid="uid://dce788f0adauv" path="res://entities/plants/resources/plant_parts/Leaf12.tres" id="29_33ad2"]
[ext_resource type="Resource" uid="uid://dd34dikqoynp3" path="res://entities/plants/resources/plant_parts/Leaf13.tres" id="30_1yhpj"]
[ext_resource type="Resource" uid="uid://bynje6g2wvuvl" path="res://entities/plants/resources/plant_parts/Leaf14.tres" id="31_x644d"]
[ext_resource type="Resource" uid="uid://bd2op6q1masjt" path="res://entities/plants/resources/plant_parts/Leaf15.tres" id="32_xm2g6"]
[ext_resource type="Resource" uid="uid://bvajuw0r47edw" path="res://entities/plants/resources/plant_parts/Leaf16.tres" id="33_3odm8"]
[ext_resource type="Resource" uid="uid://cxgw1vgket0fw" path="res://entities/plants/resources/plant_parts/Leaf1.tres" id="35_6wvjn"]
[ext_resource type="Resource" uid="uid://qb6bftgq0n6y" path="res://entities/plants/resources/plant_parts/Leaf2.tres" id="36_4rw8q"]
[ext_resource type="Resource" uid="uid://ft112n57di0e" path="res://entities/plants/resources/plant_parts/Leaf3.tres" id="37_xa5pt"]
[ext_resource type="Resource" uid="uid://dwjj6qmcjhn68" path="res://entities/plants/resources/plant_parts/Leaf4.tres" id="38_os6x4"]
[ext_resource type="Resource" uid="uid://bkr70mstyf8pp" path="res://entities/plants/resources/plant_parts/Leaf5.tres" id="39_xqcyr"]
[ext_resource type="Resource" uid="uid://dcuwupmqt34ju" path="res://entities/plants/resources/plant_parts/Leaf6.tres" id="40_rb075"]
[ext_resource type="Resource" uid="uid://djmidq7yq452i" path="res://entities/plants/resources/plant_parts/Leaf7.tres" id="41_hjug4"]
[ext_resource type="Resource" uid="uid://brmd6d3l8trqs" path="res://entities/plants/resources/plant_parts/BottomLeaf1.tres" id="43_8s0i3"]
[ext_resource type="Resource" uid="uid://cfr33014u7ig5" path="res://entities/plants/resources/plant_parts/BottomLeaf2.tres" id="44_4htm6"]
[ext_resource type="Resource" uid="uid://cf70m1us8mfqp" path="res://entities/plants/resources/plant_parts/BottomLeaf3.tres" id="45_qqvi0"]
[ext_resource type="Resource" uid="uid://ctlmah4ohqp25" path="res://entities/plants/resources/plant_parts/BottomLeaf4.tres" id="46_nv5ww"]
[ext_resource type="Resource" uid="uid://b8o4q0hsm84ov" path="res://entities/plants/resources/plant_parts/BottomLeaf5.tres" id="47_qtimw"]
[ext_resource type="Resource" uid="uid://bb33v756anesy" path="res://entities/plants/resources/plant_parts/BottomLeaf6.tres" id="48_17fv1"]
[ext_resource type="Resource" uid="uid://cbqrl72y0d1yg" path="res://entities/plants/resources/plant_parts/BottomLeaf7.tres" id="49_4ca6c"]
[ext_resource type="Resource" uid="uid://dwppani7gyjl5" path="res://entities/plants/resources/plant_parts/BottomLeaf8.tres" id="50_y0q20"]
[ext_resource type="Resource" uid="uid://dkta1u1u0efxk" path="res://entities/plants/resources/plant_parts/BottomLeaf9.tres" id="51_xqh3x"]
[ext_resource type="Resource" uid="uid://crmvc77bqax1y" path="res://entities/plants/resources/plant_parts/Flower1.tres" id="53_noro7"]
[ext_resource type="Resource" uid="uid://c0hr7icfkjkoi" path="res://entities/plants/resources/plant_parts/Flower2.tres" id="54_gum4r"]
[ext_resource type="Resource" uid="uid://clkoc1iccts2w" path="res://entities/plants/resources/plant_parts/Flower3.tres" id="55_rpf60"]
[ext_resource type="Resource" uid="uid://bd8yapi1pokj6" path="res://entities/plants/resources/plant_parts/Flower4.tres" id="56_4uud5"]
[sub_resource type="AtlasTexture" id="AtlasTexture_wyuub"]
atlas = ExtResource("3_j6jm5")
@@ -142,63 +97,6 @@ _data = {
&"harvest": SubResource("Animation_rbgiq")
}
[sub_resource type="AtlasTexture" id="AtlasTexture_mypt2"]
atlas = ExtResource("5_qp2py")
region = Rect2(46, 30, 308, 671)
[sub_resource type="Resource" id="Resource_rxp60"]
script = ExtResource("4_mielr")
texture = SubResource("AtlasTexture_mypt2")
root = Vector2(14, 263)
attaches = Array[Vector2]([Vector2(79, 83), Vector2(0, -251)])
bottom_attaches = Array[Vector2]([Vector2(48, 293), Vector2(-13, 287)])
[sub_resource type="AtlasTexture" id="AtlasTexture_qq0j0"]
atlas = ExtResource("5_qp2py")
region = Rect2(58, 1268, 141, 393)
[sub_resource type="Resource" id="Resource_qp2py"]
script = ExtResource("4_mielr")
texture = SubResource("AtlasTexture_qq0j0")
root = Vector2(7, 156)
attaches = Array[Vector2]([Vector2(0, 52), Vector2(19, -149)])
bottom_attaches = Array[Vector2]([Vector2(21, 161), Vector2(-7, 162)])
[sub_resource type="AtlasTexture" id="AtlasTexture_krt02"]
atlas = ExtResource("5_qp2py")
region = Rect2(223, 1265, 200, 386)
[sub_resource type="Resource" id="Resource_lxgri"]
script = ExtResource("4_mielr")
texture = SubResource("AtlasTexture_krt02")
root = Vector2(31, 158)
attaches = Array[Vector2]([Vector2(0, 31), Vector2(-42, -156)])
bottom_attaches = Array[Vector2]([Vector2(49, 165), Vector2(19, 169)])
[sub_resource type="Resource" id="Resource_x75j3"]
script = ExtResource("23_5ma63")
parts = Array[ExtResource("4_mielr")]([ExtResource("25_ago21"), ExtResource("26_yy0xk"), ExtResource("27_xa5is"), ExtResource("28_4tlyl"), ExtResource("29_33ad2"), ExtResource("30_1yhpj"), ExtResource("31_x644d"), ExtResource("32_xm2g6"), ExtResource("33_3odm8")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_setyo"]
script = ExtResource("23_5ma63")
parts = Array[ExtResource("4_mielr")]([ExtResource("35_6wvjn"), ExtResource("36_4rw8q"), ExtResource("37_xa5pt"), ExtResource("38_os6x4"), ExtResource("39_xqcyr"), ExtResource("40_rb075"), ExtResource("41_hjug4")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_n40r1"]
script = ExtResource("23_5ma63")
parts = Array[ExtResource("4_mielr")]([ExtResource("53_noro7"), ExtResource("54_gum4r"), ExtResource("55_rpf60"), ExtResource("56_4uud5")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[sub_resource type="Resource" id="Resource_pw6ot"]
script = ExtResource("23_5ma63")
parts = Array[ExtResource("4_mielr")]([ExtResource("43_8s0i3"), ExtResource("44_4htm6"), ExtResource("45_qqvi0"), ExtResource("46_nv5ww"), ExtResource("47_qtimw"), ExtResource("48_17fv1"), ExtResource("49_4ca6c"), ExtResource("50_y0q20"), ExtResource("51_xqh3x")])
part_amount = 2
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
[node name="PlantSprite" type="Node2D" unique_id=1274989778]
script = ExtResource("1_pq8o7")
@@ -217,16 +115,3 @@ region_filter_clip_enabled = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1793068152]
unique_name_in_owner = true
libraries/ = SubResource("AnimationLibrary_8eofq")
[node name="TextureBuilder" type="Node" parent="." unique_id=1481590638]
unique_name_in_owner = true
script = ExtResource("3_rbgiq")
bases = Array[ExtResource("4_mielr")]([SubResource("Resource_rxp60"), SubResource("Resource_qp2py"), SubResource("Resource_lxgri")])
branches = Array[ExtResource("4_mielr")]([ExtResource("8_i5o73"), ExtResource("9_mlxcy"), ExtResource("10_n3d4s"), ExtResource("11_pggx4"), ExtResource("14_2krt4"), ExtResource("15_qkfpr"), ExtResource("16_jm13q"), ExtResource("17_5vody"), ExtResource("18_tp5s5"), ExtResource("19_httlt"), ExtResource("20_y3j8r"), ExtResource("21_yl2lr")])
n_branches = 1
parts_mutation_associations = Dictionary[String, ExtResource("23_5ma63")]({
"ANCIENT": SubResource("Resource_x75j3"),
"PRECOCIOUS": SubResource("Resource_setyo"),
"QUALITY": SubResource("Resource_n40r1"),
"QUICK": SubResource("Resource_pw6ot")
})

View File

@@ -11,5 +11,5 @@ region = Rect2(46, 30, 308, 671)
script = ExtResource("1_enq8o")
texture = SubResource("AtlasTexture_mypt2")
root = Vector2(14, 263)
attaches = Array[Vector2]([Vector2(79, 83), Vector2(0, -251), Vector2(10, -85)])
bottom_attaches = Array[Vector2]([Vector2(48, 293), Vector2(-13, 287)])
attaches = Array[Vector2]([Vector2(0, -251), Vector2(10, -85), Vector2(81, 80)])
bottom_attaches = Array[Vector2]([Vector2(-17, 293), Vector2(27, 295), Vector2(52, 300)])

View File

@@ -16,9 +16,9 @@ func update_plant_sprite(plant_data : PlantData, with_animation = false):
await %AnimationPlayer.animation_finished
%Sprite.flip_h = true if plant_data.random_seed%2 == 0 else false
%Sprite.texture = %TextureBuilder.build_plant_texture(plant_data)
%Sprite.texture = PlantTextureBuilder.build_plant_texture(plant_data)
%PlantedSeed.texture = %TextureBuilder.build_seed_texture(plant_data.random_seed)
%PlantedSeed.texture = PlantTextureBuilder.build_seed_texture(plant_data.random_seed)
%PlantedSeed.visible = plant_data.get_state() == PlantData.State.PLANTED
# %PlantedSeed.region_rect = Rect2(

View File

@@ -76,7 +76,8 @@ func save_as_resource():
var plant_part = PlantPart.new()
plant_part.init(texture, root.position, attaches_vec2, bottom_attaches_vec2, type, is_back, base_attachable, bottom_attachable, branch_attachable)
plant_part.take_over_path(destination)
var err := ResourceSaver.save(plant_part, destination)
if err != OK:
printerr("Error saving resource: ", error_string(err))
else:
plant_part.take_over_path(destination)

View File

@@ -1,5 +1,4 @@
extends Node
class_name TextureBuilder
const IMAGE_WIDTH := 1000
const IMAGE_HEIGHT := 2000
@@ -10,126 +9,150 @@ const PLACEHOLDER_GROWING_TEXTURE: Texture = preload("res://entities/plants/asse
# @export var parts_archetype_associations: Dictionary[PlantArchetype, PartArchetypeAssociation] TODO:: have the archetypes
@export var bases: Array[PlantPart]
@export var baby_bases: Array[PlantPart]
@export var branches: Array[PlantPart]
@export var n_branches: int = 2
@export var parts_mutation_associations: Dictionary[String, PartMutationAssociation]
var rng := RandomNumberGenerator.new()
func build_seed_texture(_random_seed: int) -> Texture:
return PLACEHOLDER_SEED_TEXTURE
func build_plant_texture(plant_data: PlantData) -> Texture:
rng.seed = plant_data.random_seed
var mature_texture: Texture = PLACEHOLDER_MATURE_TEXTURE
var mature_image: Image = Image.create_empty(IMAGE_WIDTH, IMAGE_HEIGHT, false, Image.FORMAT_RGBA8)
var mature_image_center: Vector2i = 0.5 * mature_image.get_size()
var branch_parts: Array[PlantPart]
var base_part: PlantPart
var available_base_attaches: Array[Vector2]
var available_base_bottom_attach: Array[Vector2]
var branch_attaches: Array[Vector2]
var branch_root: Array[Vector2]
var branch_parent_attach: Array[Vector2]
var parts_to_place: Array[PlantPart]
match plant_data.get_state():
PlantData.State.MATURE:
var mature_texture: Texture = PLACEHOLDER_MATURE_TEXTURE
var mature_image: Image
print("Build mature texture")
# var plant_archetype := plant_data.archetype
if bases.size() == 0:
printerr("No base in archetype")
return mature_texture
# var base_part: PlantPart = parts_archetype_associations[plant_archetype].bases.pick_random()
var base_part: PlantPart = bases.pick_random()
# var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].bases)
base_part = pick_random(bases)
var base_image = base_part.texture.get_image()
mature_image = Image.create_empty(IMAGE_WIDTH, IMAGE_HEIGHT, false, Image.FORMAT_RGBA8)
var base_image_center: Vector2i = 0.5 * base_image.get_size()
var mature_image_center: Vector2i = 0.5 * mature_image.get_size()
mature_image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), mature_image_center - base_image_center - Vector2i(base_part.root))
if branches.size() == 0:
printerr("No branches in archetype")
# var branch_parts: Array[PlantPart] = parts_archetype_associations[plant_archetype].branches
var branch_parts: Array[PlantPart]
for i in n_branches:
branch_parts.append(branches.pick_random())
branch_parts.append(pick_random(branches))
var parts_to_place: Array[PlantPart]
for m in plant_data.mutations:
print("mutations: ", m.id)
var association: PartMutationAssociation = parts_mutation_associations[m.id]
var mutation_possible_parts := association.parts
for p in association.part_amount:
parts_to_place.append(mutation_possible_parts.pick_random())
var available_base_attaches: Array[Vector2] = base_part.attaches.duplicate()
var available_base_bottom_attach: Array[Vector2] = base_part.bottom_attaches.duplicate()
var branch_attaches: Array[Vector2]
var branch_root: Array[Vector2]
var branch_parent_attach: Array[Vector2]
assert(branch_parts.size() <= base_part.attaches.size(),
str("More branches (", branch_parts.size(), ") than base attaches (", base_part.attaches.size(), ")"))
for branch in branch_parts:
if available_base_attaches.size() == 0:
break
var ind: int = randi_range(0, available_base_attaches.size() - 1)
var attach: Vector2 = available_base_attaches.pop_at(ind)
var branch_image: Image = branch.texture.get_image()
var branch_image_center: Vector2i = 0.5 * branch_image.get_size()
mature_image.blend_rect(branch_image, Rect2i(Vector2i.ZERO, branch.texture.get_size()), mature_image_center - branch_image_center + Vector2i(attach - branch.root - base_part.root))
for branch_attach in branch.attaches:
branch_attaches.append(branch_attach)
branch_root.append(branch.root)
branch_parent_attach.append(attach)
assert(parts_to_place.size() <= branch_attaches.size() + base_part.attaches.size() - branch_parts.size(),
str("Parts to place : ", parts_to_place.size(),
"; Branch Attaches : ", branch_attaches.size(),
"; Base attaches : ", base_part.attaches.size(),
"; Branch parts : ", branch_parts.size()))
for part: PlantPart in parts_to_place:
print("create part")
var attach: Vector2
var parent_root: Vector2
var chosen_attach_type: int = 0
var attachables: Array[int]
if part.base_attachable && available_base_attaches.size() > 0:
attachables.append(1)
if part.bottom_attachable && available_base_bottom_attach.size() > 0:
attachables.append(2)
if part.branch_attachable && branch_attaches.size() > 0:
attachables.append(3)
# assert(attachables.size() > 0)
if attachables.size() == 0:
print("No attach available")
continue
chosen_attach_type = attachables.pick_random()
if chosen_attach_type == 1: # base attach
var ind := randi_range(0, available_base_attaches.size() - 1)
attach = available_base_attaches.pop_at(ind)
parent_root = base_part.root
elif chosen_attach_type == 2: # bottom
var ind := randi_range(0, available_base_bottom_attach.size() - 1)
attach = available_base_bottom_attach.pop_at(ind)
parent_root = base_part.root
elif chosen_attach_type == 3: # branch
var ind := randi_range(0, branch_attaches.size() - 1)
attach = branch_attaches.pop_at(ind) - branch_root.pop_at(ind) + branch_parent_attach.pop_at(ind)
parent_root = base_part.root
var part_image: Image = part.texture.get_image()
var part_image_center: Vector2i = 0.5 * part_image.get_size()
var relative_root_centered_pos: Vector2 = Vector2(mature_image_center - part_image_center) - part.root
mature_image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part.texture.get_size()), relative_root_centered_pos + attach - parent_root)
if plant_data.random_seed % 2 == 0:
mature_image.flip_x()
mature_texture = ImageTexture.create_from_image(mature_image)
return mature_texture
parts_to_place.append(pick_random(mutation_possible_parts))
PlantData.State.GROWING:
print("Build growing texture")
return PLACEHOLDER_GROWING_TEXTURE
# var plant_archetype := plant_data.archetype
if baby_bases.size() == 0:
printerr("No baby base in archetype")
return mature_texture
# var base_part: PlantPart = pick_random(parts_archetype_associations[plant_archetype].baby_bases)
base_part = pick_random(baby_bases)
var base_image = base_part.texture.get_image()
var base_image_center: Vector2i = 0.5 * base_image.get_size()
mature_image.blend_rect(base_image, Rect2i(Vector2i.ZERO, base_image.get_size()), mature_image_center - base_image_center - Vector2i(base_part.root))
for m in plant_data.mutations:
print("mutations: ", m.id)
var association: PartMutationAssociation = parts_mutation_associations[m.id]
var mutation_possible_parts := association.parts
for p in ceil(0.5 * association.part_amount):
parts_to_place.append(pick_random(mutation_possible_parts))
_:
print("Not handled state")
return null
available_base_attaches = base_part.attaches.duplicate()
available_base_bottom_attach = base_part.bottom_attaches.duplicate()
assert(branch_parts.size() <= base_part.attaches.size(),
str("More branches (", branch_parts.size(), ") than base attaches (", base_part.attaches.size(), ")"))
for branch in branch_parts:
if available_base_attaches.size() == 0:
break
var ind: int = rng.randi_range(0, available_base_attaches.size() - 1)
var attach: Vector2 = available_base_attaches.pop_at(ind)
var branch_image: Image = branch.texture.get_image()
var branch_image_center: Vector2i = 0.5 * branch_image.get_size()
mature_image.blend_rect(branch_image, Rect2i(Vector2i.ZERO, branch.texture.get_size()), mature_image_center - branch_image_center + Vector2i(attach - branch.root - base_part.root))
for branch_attach in branch.attaches:
branch_attaches.append(branch_attach)
branch_root.append(branch.root)
branch_parent_attach.append(attach)
if parts_to_place.size() > branch_attaches.size() + base_part.attaches.size() - branch_parts.size():
printerr("ERROR generating : Parts to place : ", parts_to_place.size(),
"; Branch Attaches : ", branch_attaches.size(),
"; Base attaches : ", base_part.attaches.size(),
"; Branch parts : ", branch_parts.size())
for part: PlantPart in parts_to_place:
print("create part")
var attach: Vector2
var parent_root: Vector2
var chosen_attach_type: int = 0
var attachables: Array[int]
if part.base_attachable && available_base_attaches.size() > 0:
attachables.append(1)
if part.bottom_attachable && available_base_bottom_attach.size() > 0:
attachables.append(2)
if part.branch_attachable && branch_attaches.size() > 0:
attachables.append(3)
# assert(attachables.size() > 0)
if attachables.size() == 0:
print("No attach available")
continue
chosen_attach_type = pick_random(attachables)
if chosen_attach_type == 1: # base attach
var ind := rng.randi_range(0, available_base_attaches.size() - 1)
attach = available_base_attaches.pop_at(ind)
parent_root = base_part.root
elif chosen_attach_type == 2: # bottom
var ind := rng.randi_range(0, available_base_bottom_attach.size() - 1)
attach = available_base_bottom_attach.pop_at(ind)
parent_root = base_part.root
elif chosen_attach_type == 3: # branch
var ind := rng.randi_range(0, branch_attaches.size() - 1)
attach = branch_attaches.pop_at(ind) - branch_root.pop_at(ind) + branch_parent_attach.pop_at(ind)
parent_root = base_part.root
var part_image: Image = part.texture.get_image()
var part_image_center: Vector2i = 0.5 * part_image.get_size()
var relative_root_centered_pos: Vector2 = Vector2(mature_image_center - part_image_center) - part.root
mature_image.blend_rect(part_image, Rect2i(Vector2i.ZERO, part.texture.get_size()), relative_root_centered_pos + attach - parent_root)
if rng.randi() % 2 == 0:
mature_image.flip_x()
mature_texture = ImageTexture.create_from_image(mature_image)
return mature_texture
func pick_random(array: Array):
return array[rng.randi_range(0, array.size() - 1)]

View File

@@ -1,6 +1,11 @@
[gd_scene format=3 uid="uid://cfsq3hma8djk3"]
[ext_resource type="Script" uid="uid://daod4korkrm2r" path="res://entities/plants/scripts/texture_builder/part_assembler.gd" id="1_wqioj"]
[ext_resource type="Texture2D" uid="uid://dr72xhc07i56e" path="res://stages/terrain/region/assets/textures/moss_biome/moss_contamination_atlas_texture.png" id="2_jldtq"]
[sub_resource type="AtlasTexture" id="AtlasTexture_jldtq"]
atlas = ExtResource("2_jldtq")
region = Rect2(536, 22.5, 210, 210)
[node name="TestSprites" type="Node2D" unique_id=1624731692]
script = ExtResource("1_wqioj")
@@ -9,4 +14,14 @@ space_between_plants = 125.0
[node name="Camera2D" type="Camera2D" parent="." unique_id=628954249]
position = Vector2(123, -46)
zoom = Vector2(3.665, 3.665)
[node name="MossContaminationAtlasTexture" type="Sprite2D" parent="." unique_id=1497811487]
position = Vector2(255, -66)
texture = SubResource("AtlasTexture_jldtq")
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=143026861]
texture_repeat = 2
position = Vector2(46, -67)
texture = SubResource("AtlasTexture_jldtq")
region_enabled = true
region_rect = Rect2(0, 0, 210, 210)

View File

@@ -55,7 +55,7 @@ func get_description() -> String:
return tr("PLANT_%s_MUST_BE_USED_IN_DECONTAMINATED_ZONE") % plant_name
func get_icon() -> Texture2D:
return plant_archetype.texture_builder.build_seed_texture(random_seed)
return PlantTextureBuilder.build_seed_texture(random_seed)
func get_energy_used() -> int:
return 1

View File

@@ -28,6 +28,7 @@ buses/default_bus_layout=""
[autoload]
Pointer="*res://gui/pointer/pointer.tscn"
PlantTextureBuilder="*uid://b8gqdgabrjaml"
AudioManager="*res://common/audio_manager/audio_manager.tscn"
GameInfo="*res://common/game_info/game_info.gd"
Pause="*res://gui/pause/pause.tscn"