moved to new understanding of what a wave is

This commit is contained in:
2026-02-07 10:35:03 +11:00
parent 8f14012fff
commit fd9b62faba
41 changed files with 131 additions and 474 deletions

View File

@@ -1,22 +1,17 @@
[gd_resource type="Resource" script_class="LevelSpecs" format=3 uid="uid://b67b70x1uf2el"] [gd_resource type="Resource" script_class="LevelConfig" format=3 uid="uid://b67b70x1uf2el"]
[ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_yuhm2"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_yuhm2"]
[ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_specs.gd" id="2_52rgn"] [ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_config.gd" id="2_52rgn"]
[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_vvycy"] [ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_vvycy"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_5cjqa"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_5cjqa"]
[ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="3_ksxj8"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="3_ksxj8"]
[ext_resource type="Resource" uid="uid://cygfdfqhk2vhw" path="res://Levels/Level1/wave1.tres" id="6_xm2iu"] [ext_resource type="Resource" uid="uid://cygfdfqhk2vhw" path="res://Levels/Level1/wave1.tres" id="6_xm2iu"]
[ext_resource type="Resource" uid="uid://bdqng70bpcvp8" path="res://Levels/Level1/wave2.tres" id="7_ginir"]
[ext_resource type="Resource" uid="uid://dasqxcoenje00" path="res://Levels/Level1/wave3.tres" id="8_heo8u"]
[ext_resource type="Resource" uid="uid://c0ln1sfxmvhaf" path="res://Levels/Level1/wave4.tres" id="9_5mf8a"]
[ext_resource type="Resource" uid="uid://b8e1xvwr2f4pf" path="res://Levels/Level1/wave5.tres" id="10_skwnu"]
[ext_resource type="Resource" uid="uid://bsmpkojn7bmqq" path="res://Levels/Level1/wave6.tres" id="11_rusuq"]
[ext_resource type="Resource" uid="uid://cqm54pu03l510" path="res://Zones/Moat/zc_moat.tres" id="12_qh4uj"] [ext_resource type="Resource" uid="uid://cqm54pu03l510" path="res://Zones/Moat/zc_moat.tres" id="12_qh4uj"]
[resource] [resource]
script = ExtResource("2_52rgn") script = ExtResource("2_52rgn")
hero_class = ExtResource("3_ksxj8") hero_class = ExtResource("3_ksxj8")
allowed_cards = Array[ExtResource("1_yuhm2")]([ExtResource("2_vvycy")]) allowed_cards = Array[ExtResource("1_yuhm2")]([ExtResource("2_vvycy")])
waves = Array[ExtResource("3_5cjqa")]([ExtResource("6_xm2iu"), ExtResource("7_ginir"), ExtResource("8_heo8u"), ExtResource("9_5mf8a"), ExtResource("10_skwnu"), ExtResource("11_rusuq")]) waves = Array[ExtResource("3_5cjqa")]([ExtResource("6_xm2iu")])
zone = ExtResource("12_qh4uj") zone = ExtResource("12_qh4uj")
metadata/_custom_type_script = "uid://dalgif6huggwg" metadata/_custom_type_script = "uid://dalgif6huggwg"

View File

@@ -1,13 +1,33 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cygfdfqhk2vhw"] [gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cygfdfqhk2vhw"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_ijigs"] [ext_resource type="Script" uid="uid://3grc2j4bjrnw" path="res://enemy_group.gd" id="1_wj13r"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_tihwe"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_tihwe"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_ywnes"] [ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_ywnes"]
[sub_resource type="Resource" id="Resource_wug4u"]
script = ExtResource("1_wj13r")
enemy = ExtResource("2_ywnes")
count = 4
metadata/_custom_type_script = "uid://3grc2j4bjrnw"
[sub_resource type="Resource" id="Resource_1qdvn"]
script = ExtResource("1_wj13r")
enemy = ExtResource("2_ywnes")
count = 4
metadata/_custom_type_script = "uid://3grc2j4bjrnw"
[sub_resource type="Resource" id="Resource_pwamm"]
script = ExtResource("1_wj13r")
enemy = ExtResource("2_ywnes")
count = 2
metadata/_custom_type_script = "uid://3grc2j4bjrnw"
[resource] [resource]
script = ExtResource("2_tihwe") script = ExtResource("2_tihwe")
enemies = Dictionary[ExtResource("1_ijigs"), int]({ enemy_groups = Dictionary[ExtResource("1_wj13r"), int]({
ExtResource("2_ywnes"): 10 SubResource("Resource_wug4u"): 0,
SubResource("Resource_1qdvn"): 1,
SubResource("Resource_pwamm"): 4
}) })
rewards_blank_cassette = true rewards_blank_cassette = true
metadata/_custom_type_script = "uid://bp6q371iypd06" metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,12 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://bdqng70bpcvp8"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_ddbxs"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_mjqnu"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_yby3c"]
[resource]
script = ExtResource("2_yby3c")
enemies = Dictionary[ExtResource("1_ddbxs"), int]({
ExtResource("2_mjqnu"): 25
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,15 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://dasqxcoenje00"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_8j1mh"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_cyr3d"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_mvtl1"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="3_6mlj7"]
[resource]
script = ExtResource("2_mvtl1")
enemies = Dictionary[ExtResource("1_8j1mh"), int]({
ExtResource("2_cyr3d"): 15,
ExtResource("3_6mlj7"): 5
})
rewards_blank_cassette = true
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://c0ln1sfxmvhaf"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_k10uy"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_6kjfn"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_htd28"]
[resource]
script = ExtResource("2_6kjfn")
enemies = Dictionary[ExtResource("1_k10uy"), int]({
ExtResource("2_htd28"): 40
})
new_shop = true
bonus_cash = 20
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://b8e1xvwr2f4pf"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_evs1i"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_38p3i"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_gexw5"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="3_8y41r"]
[resource]
script = ExtResource("2_gexw5")
enemies = Dictionary[ExtResource("1_evs1i"), int]({
ExtResource("2_38p3i"): 20,
ExtResource("3_8y41r"): 15
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,12 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://bsmpkojn7bmqq"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_asx4x"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_ltlqs"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_u1tse"]
[resource]
script = ExtResource("2_ltlqs")
enemies = Dictionary[ExtResource("1_asx4x"), int]({
ExtResource("2_u1tse"): 40
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,26 +1,19 @@
[gd_resource type="Resource" script_class="LevelSpecs" format=3 uid="uid://dffoufw4bnfn7"] [gd_resource type="Resource" script_class="LevelConfig" format=3 uid="uid://dffoufw4bnfn7"]
[ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_rchhl"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_rchhl"]
[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_geygk"] [ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_geygk"]
[ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_specs.gd" id="2_y3kr2"] [ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_config.gd" id="2_y3kr2"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_05rhi"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_05rhi"]
[ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://Cards/rocket_launcher.tres" id="3_xdjpy"] [ext_resource type="Resource" uid="uid://b37r54q84vqoi" path="res://Cards/rocket_launcher.tres" id="3_xdjpy"]
[ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="4_ldc6i"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="4_ldc6i"]
[ext_resource type="Resource" uid="uid://7dqtd1owl7g3" path="res://Levels/Level2/wave1.tres" id="7_siv73"] [ext_resource type="Resource" uid="uid://7dqtd1owl7g3" path="res://Levels/Level2/wave1.tres" id="7_siv73"]
[ext_resource type="Resource" uid="uid://dafixx8vfmr3h" path="res://Levels/Level2/wave2.tres" id="8_kee6w"]
[ext_resource type="Resource" uid="uid://cricfym5wcf3w" path="res://Levels/Level2/wave3.tres" id="9_k6fmx"]
[ext_resource type="Resource" uid="uid://cky3wcbc3kob0" path="res://Levels/Level2/wave4.tres" id="10_dd7gv"]
[ext_resource type="Resource" uid="uid://b5wbmohc1ryla" path="res://Levels/Level2/wave5.tres" id="11_nmbqu"]
[ext_resource type="Resource" uid="uid://11e6ak5jg2pn" path="res://Levels/Level2/wave6.tres" id="12_p0fmg"]
[ext_resource type="Resource" uid="uid://cvtuui3grpslm" path="res://Levels/Level2/wave7.tres" id="13_alfsy"]
[ext_resource type="Resource" uid="uid://7t61us4e01bb" path="res://Levels/Level2/wave8.tres" id="14_jyonc"]
[ext_resource type="Resource" uid="uid://cqm54pu03l510" path="res://Zones/Moat/zc_moat.tres" id="15_movdo"] [ext_resource type="Resource" uid="uid://cqm54pu03l510" path="res://Zones/Moat/zc_moat.tres" id="15_movdo"]
[resource] [resource]
script = ExtResource("2_y3kr2") script = ExtResource("2_y3kr2")
hero_class = ExtResource("4_ldc6i") hero_class = ExtResource("4_ldc6i")
allowed_cards = Array[ExtResource("1_rchhl")]([ExtResource("2_geygk"), ExtResource("3_xdjpy")]) allowed_cards = Array[ExtResource("1_rchhl")]([ExtResource("2_geygk"), ExtResource("3_xdjpy")])
waves = Array[ExtResource("3_05rhi")]([ExtResource("7_siv73"), ExtResource("8_kee6w"), ExtResource("9_k6fmx"), ExtResource("10_dd7gv"), ExtResource("11_nmbqu"), ExtResource("12_p0fmg"), ExtResource("13_alfsy"), ExtResource("14_jyonc")]) waves = Array[ExtResource("3_05rhi")]([ExtResource("7_siv73")])
points_blocked = Array[int]([34, 33, 41, 40, 39, 47, 79, 86, 85, 78, 91, 84]) points_blocked = Array[int]([34, 33, 41, 40, 39, 47, 79, 86, 85, 78, 91, 84])
zone = ExtResource("15_movdo") zone = ExtResource("15_movdo")
metadata/_custom_type_script = "uid://dalgif6huggwg" metadata/_custom_type_script = "uid://dalgif6huggwg"

View File

@@ -1,13 +1,19 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://7dqtd1owl7g3"] [gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://7dqtd1owl7g3"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_dhlut"] [ext_resource type="Script" uid="uid://3grc2j4bjrnw" path="res://enemy_group.gd" id="1_t312x"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_50dab"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_50dab"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_iaotk"] [ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_juva6"]
[sub_resource type="Resource" id="Resource_76qlp"]
script = ExtResource("1_t312x")
enemy = ExtResource("2_juva6")
count = 15
metadata/_custom_type_script = "uid://3grc2j4bjrnw"
[resource] [resource]
script = ExtResource("2_50dab") script = ExtResource("2_50dab")
enemies = Dictionary[ExtResource("1_dhlut"), int]({ enemy_groups = Dictionary[ExtResource("1_t312x"), int]({
ExtResource("2_iaotk"): 5 SubResource("Resource_76qlp"): 2
}) })
rewards_blank_cassette = true rewards_blank_cassette = true
metadata/_custom_type_script = "uid://bp6q371iypd06" metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,13 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://dafixx8vfmr3h"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_rhace"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_l5n6q"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="2_n5glm"]
[resource]
script = ExtResource("2_l5n6q")
enemies = Dictionary[ExtResource("1_rhace"), int]({
ExtResource("2_n5glm"): 6
})
new_shop = true
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,13 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cricfym5wcf3w"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_a61ug"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_3ov7j"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_47xps"]
[resource]
script = ExtResource("2_47xps")
enemies = Dictionary[ExtResource("1_a61ug"), int]({
ExtResource("2_3ov7j"): 10
})
rewards_blank_cassette = true
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,16 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cky3wcbc3kob0"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_7c1qm"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_6m45b"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_n286l"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="3_qjnea"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="4_8uy8t"]
[resource]
script = ExtResource("2_n286l")
enemies = Dictionary[ExtResource("1_7c1qm"), int]({
ExtResource("2_6m45b"): 6,
ExtResource("3_qjnea"): 2,
ExtResource("4_8uy8t"): 8
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,15 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://b5wbmohc1ryla"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_yfa3k"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_84e3q"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_ugnlg"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="3_3e1qp"]
[resource]
script = ExtResource("2_84e3q")
enemies = Dictionary[ExtResource("1_yfa3k"), int]({
ExtResource("2_ugnlg"): 10,
ExtResource("3_3e1qp"): 10
})
rewards_blank_cassette = true
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,18 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://11e6ak5jg2pn"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_n1yiu"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_f752f"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="3_uomax"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="4_mu3r3"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="4_wrrsl"]
[resource]
script = ExtResource("2_f752f")
enemies = Dictionary[ExtResource("1_n1yiu"), int]({
ExtResource("3_uomax"): 6,
ExtResource("4_mu3r3"): 3,
ExtResource("4_wrrsl"): 8
})
new_shop = true
bonus_cash = 3
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cvtuui3grpslm"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_j1606"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="2_6r48e"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_uttqy"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="3_ptl2k"]
[resource]
script = ExtResource("2_uttqy")
enemies = Dictionary[ExtResource("1_j1606"), int]({
ExtResource("2_6r48e"): 35,
ExtResource("3_ptl2k"): 5
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,14 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://7t61us4e01bb"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_f4qev"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="2_3trsl"]
[ext_resource type="Resource" uid="uid://cvehqh4tt28g7" path="res://Enemies/BabyEyeDog/baby_eye_dog.tres" id="2_r8dsv"]
[ext_resource type="Resource" uid="uid://bffhb5krs5elm" path="res://Enemies/Crystalisk/crystalisk.tres" id="3_o75u5"]
[resource]
script = ExtResource("2_3trsl")
enemies = Dictionary[ExtResource("1_f4qev"), int]({
ExtResource("2_r8dsv"): 25,
ExtResource("3_o75u5"): 5
})
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -1,19 +1,18 @@
[gd_resource type="Resource" script_class="LevelSpecs" format=3 uid="uid://dgrcneuv4fut"] [gd_resource type="Resource" script_class="LevelConfig" format=3 uid="uid://dgrcneuv4fut"]
[ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_ldkvi"] [ext_resource type="Script" uid="uid://d40isem6w5d8" path="res://Scripts/Resources/card.gd" id="1_ldkvi"]
[ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_0atj5"] [ext_resource type="Resource" uid="uid://deer0awg4d18o" path="res://Cards/assault.tres" id="2_0atj5"]
[ext_resource type="Resource" uid="uid://cvto66tp7rrst" path="res://Cards/gatling.tres" id="3_sbxeq"] [ext_resource type="Resource" uid="uid://cvto66tp7rrst" path="res://Cards/gatling.tres" id="3_sbxeq"]
[ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="4_5rrxx"] [ext_resource type="Resource" uid="uid://b5pc3frhx467q" path="res://Classes/Engineer/class.tres" id="4_5rrxx"]
[ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_specs.gd" id="5_kje1i"] [ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_config.gd" id="5_kje1i"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="6_gmv8c"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="6_gmv8c"]
[ext_resource type="Resource" uid="uid://cwy6wxuujgqbq" path="res://Levels/Level3/wave1.tres" id="7_43tyk"] [ext_resource type="Resource" uid="uid://cwy6wxuujgqbq" path="res://Levels/Level3/wave1.tres" id="7_43tyk"]
[ext_resource type="Resource" uid="uid://c0jg2k4igwt7y" path="res://Levels/Level3/wave2.tres" id="8_mblpn"]
[ext_resource type="Resource" uid="uid://dicfpbrig37m8" path="res://Zones/Cave/zc_cave.tres" id="9_sbxeq"] [ext_resource type="Resource" uid="uid://dicfpbrig37m8" path="res://Zones/Cave/zc_cave.tres" id="9_sbxeq"]
[resource] [resource]
script = ExtResource("5_kje1i") script = ExtResource("5_kje1i")
hero_class = ExtResource("4_5rrxx") hero_class = ExtResource("4_5rrxx")
allowed_cards = Array[ExtResource("1_ldkvi")]([ExtResource("2_0atj5"), ExtResource("3_sbxeq")]) allowed_cards = Array[ExtResource("1_ldkvi")]([ExtResource("2_0atj5"), ExtResource("3_sbxeq")])
waves = Array[ExtResource("6_gmv8c")]([ExtResource("7_43tyk"), ExtResource("8_mblpn")]) waves = Array[ExtResource("6_gmv8c")]([ExtResource("7_43tyk")])
zone = ExtResource("9_sbxeq") zone = ExtResource("9_sbxeq")
metadata/_custom_type_script = "uid://dalgif6huggwg" metadata/_custom_type_script = "uid://dalgif6huggwg"

View File

@@ -1,13 +1,19 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cwy6wxuujgqbq"] [gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://cwy6wxuujgqbq"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_b6olw"] [ext_resource type="Script" uid="uid://3grc2j4bjrnw" path="res://enemy_group.gd" id="1_6ssfe"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="2_b51i4"] [ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="2_lvtoc"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_frc10"] [ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_frc10"]
[sub_resource type="Resource" id="Resource_hrsx4"]
script = ExtResource("1_6ssfe")
enemy = ExtResource("2_lvtoc")
count = 4
metadata/_custom_type_script = "uid://3grc2j4bjrnw"
[resource] [resource]
script = ExtResource("3_frc10") script = ExtResource("3_frc10")
enemies = Dictionary[ExtResource("1_b6olw"), int]({ enemy_groups = Dictionary[ExtResource("1_6ssfe"), int]({
ExtResource("2_b51i4"): 10 SubResource("Resource_hrsx4"): 0
}) })
rewards_blank_cassette = true rewards_blank_cassette = true
bonus_cash = 3 bonus_cash = 3

View File

@@ -1,17 +0,0 @@
[gd_resource type="Resource" script_class="WaveConfig" format=3 uid="uid://c0jg2k4igwt7y"]
[ext_resource type="Script" uid="uid://cbwxa2a4hfcy4" path="res://Scripts/Resources/enemy.gd" id="1_8x0w6"]
[ext_resource type="Resource" uid="uid://dxi17xvdlhkvc" path="res://Enemies/ElderEyeDog/elder_eye_dog.tres" id="2_0iv0c"]
[ext_resource type="Script" uid="uid://bp6q371iypd06" path="res://Scripts/wave_config.gd" id="3_pap4a"]
[ext_resource type="Resource" uid="uid://8eba45hql7bo" path="res://Enemies/EyeDog/eye_dog.tres" id="3_t4518"]
[resource]
script = ExtResource("3_pap4a")
enemies = Dictionary[ExtResource("1_8x0w6"), int]({
ExtResource("2_0iv0c"): 3,
ExtResource("3_t4518"): 10
})
new_shop = true
rewards_blank_cassette = true
bonus_cash = 19
metadata/_custom_type_script = "uid://bp6q371iypd06"

View File

@@ -36,7 +36,6 @@ extends CanvasLayer
var last_lives_count: int = Data.starting_lives var last_lives_count: int = Data.starting_lives
var enemy_names: Array[String] var enemy_names: Array[String]
var map_anchor: Node3D var map_anchor: Node3D
var cards: Array[EnemyCardUI] = []
var feature_preview_tween: Tween var feature_preview_tween: Tween
var enemy_count: int = 0 var enemy_count: int = 0
@@ -90,38 +89,6 @@ func set_blank_cassette_count(value: int) -> void:
blank_cassette_label.text = str(value) blank_cassette_label.text = str(value)
func show_wave_generation_anim(wave: Wave) -> void:
for card: EnemyCardUI in cards:
card.queue_free()
cards = []
var x: int = 0
var final_x_coords: Array[int] = [-550, -275, 0, 275, 550]
for card: EnemyCard in wave.enemy_groups:
var card_ui: EnemyCardUI = enemy_card_scene.instantiate()
card_ui.set_enemy(card)
add_child(card_ui)
cards.append(card_ui)
#$Control.add_child(card_ui)
card_ui.position = $Control2.position
var i: int = 0
var j: int = 0
for card: EnemyCardUI in cards:
var anchor: Vector2 = $Control3.position
anchor -= Vector2(int(card.get_child(0).size.x / 2.0), int(card.get_child(0).size.y / 2.0))
anchor.x += final_x_coords[i]
var tween: Tween = create_tween()
tween.tween_interval((0.3 * j) + (1.4 * int(j / 5.0)))
tween.tween_property(card, "position", anchor, 0.3)
tween.tween_interval(3.0)
tween.tween_property(card, "position", anchor + Vector2.UP * 700, 0.5)
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_QUINT)
i += 1
if i >= final_x_coords.size():
i = 0
j += 1
func set_energy_visible(value: bool) -> void: func set_energy_visible(value: bool) -> void:
energy_pips.visible = value energy_pips.visible = value
@@ -222,7 +189,8 @@ func enemy_count_down(enemy: Enemy) -> void:
enemy_count_label.text = str(enemy_count) enemy_count_label.text = str(enemy_count)
func set_upcoming_wave(value: Dictionary) -> void: #the value dictionary should be enemy titles matched to how many of that enemy
func set_upcoming_wave(value: Dictionary[String, int]) -> void:
enemy_count = 0 enemy_count = 0
var frame_count: int = 0 var frame_count: int = 0
enemy_names = [] enemy_names = []

View File

@@ -128,9 +128,9 @@ func _on_static_body_3d_button_interacted(_value: int, reply: Hero) -> void:
button_collider.disabled = true button_collider.disabled = true
$StaticBody3D/AudioStreamPlayer3D.play() $StaticBody3D/AudioStreamPlayer3D.play()
#print("button pressed") #print("button pressed")
#print(reply.game_manager.level_specs.waves) #print(reply.game_manager.level_config.waves)
#print(reply.game_manager.level_specs.waves[0].station) #print(reply.game_manager.level_config.waves[0].station)
#print(reply.game_manager.level_specs.waves[1].station) #print(reply.game_manager.level_config.waves[1].station)
#for spec: WaveConfig in reply.game_manager.level_specs.waves: #for spec: WaveConfig in reply.game_manager.level_config.waves:
# print(Data.Rarity.keys()[spec.station]) # print(Data.Rarity.keys()[spec.station])
find_cards(reply.hero_class.faction, reply.game_manager.level_specs.waves[reply.game_manager.wave - 1].station, reply.game_manager.level_specs.allowed_cards) find_cards(reply.hero_class.faction, reply.game_manager.level_config.waves[reply.game_manager.wave - 1].station, reply.game_manager.level_config.allowed_cards)

View File

@@ -1,4 +1,5 @@
class_name LevelSpecs extends Resource class_name LevelConfig
extends Resource
@export var hero_class: HeroClass @export var hero_class: HeroClass
@export var allowed_cards: Array[Card] @export var allowed_cards: Array[Card]

View File

@@ -1,6 +0,0 @@
class_name EnemyCard
extends RefCounted
var enemy: Enemy = null
var count: int

View File

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

View File

@@ -14,7 +14,7 @@ signal enemy_spawned()
var enemy_died_callback: Callable var enemy_died_callback: Callable
var enemy_reached_goal_callback: Callable var enemy_reached_goal_callback: Callable
var current_wave: Array[EnemyCard] var current_wave: Array[EnemyGroup]
var enemy_types_to_spawn: Dictionary = {} var enemy_types_to_spawn: Dictionary = {}
var enemy_spawn_timers: Dictionary = {} var enemy_spawn_timers: Dictionary = {}
var enemies_spawned: Dictionary = {} var enemies_spawned: Dictionary = {}
@@ -125,7 +125,7 @@ func networked_spawn_air_enemy(enemy_num: int, pos: Vector3, id1: int, id2: int)
func spawn_wave() -> void: func spawn_wave() -> void:
enemies_to_spawn = 0 enemies_to_spawn = 0
enemy_spawn_timers = {} enemy_spawn_timers = {}
for card: EnemyCard in current_wave: for card: EnemyGroup in current_wave:
enemy_types_to_spawn[card.enemy] += card.count enemy_types_to_spawn[card.enemy] += card.count
enemies_to_spawn += card.count enemies_to_spawn += card.count
#print(card.enemy.title + ": " + str(card.count)) #print(card.enemy.title + ": " + str(card.count))
@@ -135,6 +135,6 @@ func spawn_wave() -> void:
done_spawning = false done_spawning = false
func add_card(new_card: EnemyCard) -> void: func add_card(new_card: EnemyGroup) -> void:
current_wave.append(new_card) current_wave.append(new_card)
enemy_types_to_spawn[new_card.enemy] = 0 enemy_types_to_spawn[new_card.enemy] = 0

View File

@@ -31,7 +31,7 @@ var shop_chance: float = 0.0
var stats: RoundStats var stats: RoundStats
var card_gameplay: bool = false var card_gameplay: bool = false
var level_layout: FlowFieldData var level_layout: FlowFieldData
var level_specs: LevelSpecs var level_config: LevelConfig
#TODO: Create a reference to some generic Lobby object that wraps the multiplayer players list stuff #TODO: Create a reference to some generic Lobby object that wraps the multiplayer players list stuff
@@ -92,23 +92,14 @@ func networked_set_wave(wave_number: int) -> void:
##wave_count is number of upcoming waves this function should return ##wave_count is number of upcoming waves this function should return
func get_upcoming_waves(wave_count: int) -> Array[Wave]: func get_upcoming_waves(wave_count: int) -> Array[WaveConfig]:
var waves: Array[Wave] = [] var waves: Array[WaveConfig] = []
var i: int = -1 waves.append_array(level_config.waves.slice(wave - 1))
for wave_config: WaveConfig in level_specs.waves.slice(wave - 1):
i += 1
var new_wave: Wave = Wave.new()
for enemy: Enemy in level_specs.waves[wave - 1 + i].enemies.keys():
var enemy_card: EnemyCard = EnemyCard.new()
enemy_card.enemy = enemy
enemy_card.count = level_specs.waves[wave - 1 + i].enemies[enemy]
new_wave.enemy_groups.append(enemy_card)
waves.append(new_wave)
if waves.size() < wave_count: if waves.size() < wave_count:
var starting_wave: int = wave var starting_wave: int = wave
for x: int in wave_count - waves.size(): for x: int in wave_count - waves.size():
var spawn_power: int = WaveManager.calculate_spawn_power(starting_wave + x, connected_players_nodes.size()) var spawn_power: int = WaveManager.calculate_spawn_power(starting_wave + x, connected_players_nodes.size())
var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) var new_wave: WaveConfig = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns.size())
waves.append(new_wave) waves.append(new_wave)
return waves return waves
@@ -118,7 +109,7 @@ func spawn_level(scene: PackedScene) -> void:
var flow_field: FlowField = FlowField.new() var flow_field: FlowField = FlowField.new()
level.flow_field = flow_field level.flow_field = flow_field
level.add_child(flow_field) level.add_child(flow_field)
flow_field.load_from_data(FlowFieldTool.load_flow_field_from_disc(level_specs.zone.flow_field_data_path)) flow_field.load_from_data(FlowFieldTool.load_flow_field_from_disc(level_config.zone.flow_field_data_path))
level.load_flow_field() level.load_flow_field()
level.game_manager = self level.game_manager = self
for x: EnemySpawner in level.enemy_spawns: for x: EnemySpawner in level.enemy_spawns:
@@ -130,7 +121,7 @@ func spawn_level(scene: PackedScene) -> void:
root_scene.add_child(level) root_scene.add_child(level)
for spawner: EnemySpawner in level.enemy_spawns: for spawner: EnemySpawner in level.enemy_spawns:
spawner.create_path() spawner.create_path()
level.generate_obstacle(level_specs.points_blocked) level.generate_obstacle(level_config.points_blocked)
func spawn_players() -> void: func spawn_players() -> void:
@@ -186,16 +177,7 @@ func spawn_enemy_wave() -> void:
wave_started.emit() wave_started.emit()
func pre_generate_waves() -> Array[Wave]: func set_wave_to_spawners(wave_thing: WaveConfig, wave_number: int) -> void:
var wave_list: Array[Wave] = []
for i: int in range(wave, wave_limit + 1):
var spawn_power: int = WaveManager.calculate_spawn_power(i, connected_players_nodes.size())
var generated_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool)
wave_list.append(generated_wave)
return wave_list
func set_wave_to_spawners(wave_thing: Wave, wave_number: int) -> void:
var spawners: Array[EnemySpawner] = level.enemy_spawns var spawners: Array[EnemySpawner] = level.enemy_spawns
var ground_spawners: Array[EnemySpawner] = [] var ground_spawners: Array[EnemySpawner] = []
var air_spawners: Array[EnemySpawner] = [] var air_spawners: Array[EnemySpawner] = []
@@ -205,37 +187,35 @@ func set_wave_to_spawners(wave_thing: Wave, wave_number: int) -> void:
else: else:
air_spawners.append(spawner) air_spawners.append(spawner)
var assignment_salt: int = 0 var assignment_salt: int = 0
for card: EnemyCard in wave_thing.enemy_groups: for enemy_group: EnemyGroup in wave_thing.enemy_groups.keys():
assignment_salt += 1 assignment_salt += 1
if card.enemy.target_type == Data.EnemyType.LAND: if enemy_group.enemy.target_type == Data.EnemyType.LAND:
ground_spawners[NoiseRandom.randi_in_range((wave_number * assignment_salt) - assignment_salt, 0, ground_spawners.size() - 1)].add_card(card) ground_spawners[NoiseRandom.randi_in_range((wave_number * assignment_salt) - assignment_salt, 0, ground_spawners.size() - 1)].add_card(enemy_group)
else: else:
air_spawners[NoiseRandom.randi_in_range((wave_number * assignment_salt) + assignment_salt, 0, air_spawners.size() - 1)].add_card(card) air_spawners[NoiseRandom.randi_in_range((wave_number * assignment_salt) + assignment_salt, 0, air_spawners.size() - 1)].add_card(enemy_group)
func set_upcoming_wave() -> void: func set_upcoming_wave() -> void:
if is_multiplayer_authority(): if is_multiplayer_authority():
if level_specs.waves.size() == 0: if level_config.waves.size() == 0:
var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size()) var spawn_power: int = WaveManager.calculate_spawn_power(wave, connected_players_nodes.size())
#var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool) #var new_wave: Dictionary = WaveManager.generate_wave(spawn_power, level.enemy_pool)
var new_wave: Wave = WaveManager.generate_wave(spawn_power, level.enemy_pool) var new_wave: WaveConfig = WaveManager.generate_wave(spawn_power, level.enemy_pool, level.enemy_spawns.size())
set_wave_to_spawners(new_wave, wave) set_wave_to_spawners(new_wave, wave)
temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size()))
#networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0)) #networked_set_upcoming_wave.rpc(new_wave, 6 + floori(spawn_power / 70.0))
else: else:
var new_wave: Wave = Wave.new() var new_wave: WaveConfig = get_upcoming_waves(1)[0]
for enemy: Enemy in level_specs.waves[wave - 1].enemies.keys():
var enemy_card: EnemyCard = EnemyCard.new()
enemy_card.enemy = enemy
enemy_card.count = level_specs.waves[wave - 1].enemies[enemy]
new_wave.enemy_groups.append(enemy_card)
set_wave_to_spawners(new_wave, wave) set_wave_to_spawners(new_wave, wave)
temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size())) temp_set_upcoming_wave(new_wave, WaveManager.calculate_pot(wave, connected_players_nodes.size()))
func temp_set_upcoming_wave(new_wave: Wave, coins: int) -> void: func temp_set_upcoming_wave(new_wave: WaveConfig, coins: int) -> void:
pot = coins pot = coins
connected_players_nodes[multiplayer.get_unique_id()].hud.set_upcoming_wave(new_wave.to_dict()) var dict: Dictionary[String, int] = {}
for enemy_group: EnemyGroup in new_wave.enemy_groups.keys():
dict[enemy_group.enemy.title] = enemy_group.count
connected_players_nodes[multiplayer.get_unique_id()].hud.set_upcoming_wave(dict)
@rpc("reliable", "call_local") @rpc("reliable", "call_local")
@@ -285,9 +265,9 @@ func end_wave() -> void:
var player: Hero = connected_players_nodes[peer_id] as Hero var player: Hero = connected_players_nodes[peer_id] as Hero
player.hud.set_wave_count(wave) player.hud.set_wave_count(wave)
player.currency += ceili(pot / connected_players_nodes.size()) player.currency += ceili(pot / connected_players_nodes.size())
player.currency += level_specs.waves[wave - 2].bonus_cash player.currency += level_config.waves[wave - 2].bonus_cash
player.energy = Data.player_energy player.energy = Data.player_energy
player.blank_cassettes += 1 if level_specs.waves[wave - 2].rewards_blank_cassette else 0 player.blank_cassettes += 1 if level_config.waves[wave - 2].rewards_blank_cassette else 0
#if wave % 2 == 0: #if wave % 2 == 0:
# player.blank_cassettes += 1 # player.blank_cassettes += 1
if card_gameplay: if card_gameplay:
@@ -301,7 +281,7 @@ func end_wave() -> void:
#tower_base.enable_duration_sprites() #tower_base.enable_duration_sprites()
tower_base.iterate_duration() tower_base.iterate_duration()
if is_multiplayer_authority(): if is_multiplayer_authority():
if level_specs.waves[wave - 2].new_shop: if level_config.waves[wave - 2].new_shop:
networked_spawn_shop.rpc() networked_spawn_shop.rpc()
#if NoiseRandom.randf_in_range(23 * wave, 0.0, 1.0) <= shop_chance: #if NoiseRandom.randf_in_range(23 * wave, 0.0, 1.0) <= shop_chance:
#networked_spawn_shop.rpc() #networked_spawn_shop.rpc()
@@ -334,7 +314,7 @@ func setup() -> void:
connected_players_nodes.clear() connected_players_nodes.clear()
#Spawn new stuff #Spawn new stuff
spawn_level(level_specs.zone.scene) spawn_level(level_config.zone.scene)
#Set starting parameters #Set starting parameters
game_active = false game_active = false
@@ -342,7 +322,7 @@ func setup() -> void:
objective_health = Data.starting_lives objective_health = Data.starting_lives
wave = 1 wave = 1
stats = RoundStats.new() stats = RoundStats.new()
wave_limit = level_specs.waves.size() wave_limit = level_config.waves.size()
game_setup.emit() game_setup.emit()
@@ -407,8 +387,10 @@ func continue_with_game() -> void:
gamemode.endless = true gamemode.endless = true
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
connected_players_nodes[multiplayer.get_unique_id()].unpause() connected_players_nodes[multiplayer.get_unique_id()].unpause()
#TODO: This shouldn't happen. instead, the wave generator should generate level_specs waves #TODO: This shouldn't happen. instead, the wave generator should generate level_config waves
level_specs.waves = [] #FIXME: this really needs to be changed because otherwise endless mode cant have shit like
#stations and shop respawns. it all needs to be part of the one system u know
level_config.waves = []
set_upcoming_wave() set_upcoming_wave()

View File

@@ -1,16 +0,0 @@
class_name Wave
extends RefCounted
var enemy_groups: Array[EnemyCard]
func to_dict() -> Dictionary:
var dict: Dictionary = {}
for group: EnemyCard in enemy_groups:
var enemy_count: int = 0
enemy_count = group.count
if !dict.has(group.enemy.title):
dict[group.enemy.title] = 0
dict[group.enemy.title] += enemy_count
return dict

View File

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

View File

@@ -1,6 +1,7 @@
class_name WaveConfig extends Resource class_name WaveConfig
extends Resource
@export var enemies: Dictionary[Enemy, int] @export var enemy_groups: Dictionary[EnemyGroup, int]
@export var station: Data.Rarity @export var station: Data.Rarity
@export var new_shop: bool @export var new_shop: bool
@export var rewards_blank_cassette: bool @export var rewards_blank_cassette: bool

View File

@@ -23,28 +23,26 @@ static func calculate_pot(wave_number: int, number_of_players: int) -> int:
return ceili((3.0 * number_of_players) + (2.5 * wave_number)) return ceili((3.0 * number_of_players) + (2.5 * wave_number))
static func get_test_wave(spawn_pool: Array[Enemy]) -> Wave: static func get_test_wave(spawn_pool: Array[Enemy]) -> WaveConfig:
var wave: Wave = Wave.new() var wave: WaveConfig = WaveConfig.new()
for x: int in 3: for x: int in 3:
var new_card: EnemyCard = EnemyCard.new() wave.enemies[spawn_pool[0]] = 1
new_card.enemy = spawn_pool[0]
new_card.rarity = Data.Rarity.COMMON
wave.enemy_groups.append(new_card)
return wave return wave
## Uses a spawn power budget to "buy" cards of enemies at random selection from ## Uses a spawn power budget to "buy" cards of enemies at random selection from
## the given spawn pool, returns the resulting wave but also assigns the cards ## the given spawn pool, returns the resulting wave but also assigns the cards
## among the given set of enemy spawners ## among the given set of enemy spawners
static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy]) -> Wave: static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy], spawners: int) -> WaveConfig:
var wave: Wave = Wave.new() var wave: WaveConfig = WaveConfig.new()
#print("Generating wave with " + str(points) + " points to spend") #print("Generating wave with " + str(points) + " points to spend")
while spawn_power > 0: while spawn_power > 0:
var new_card: EnemyCard = EnemyCard.new()
#First, choose an enemy at random #First, choose an enemy at random
new_card.enemy = spawn_pool[NoiseRandom.randi_in_range(spawn_power, 0, spawn_pool.size() - 1)] var enemy: Enemy = spawn_pool[NoiseRandom.randi_in_range(spawn_power, 0, spawn_pool.size() - 1)]
var enemy_group: EnemyGroup = EnemyGroup.new()
enemy_group.enemy = enemy
#Next, we have to figure out if we can actually buy that enemy #Next, we have to figure out if we can actually buy that enemy
#and, if not, then we have to pick a different enemy, repeat until #and, if not, then we have to pick a different enemy, repeat until
@@ -54,29 +52,29 @@ static func generate_wave(spawn_power: int, spawn_pool: Array[Enemy]) -> Wave:
var first_enemy_id: int = -1 var first_enemy_id: int = -1
while !enemy_chosen: while !enemy_chosen:
#Next, determine what is the most groups we can afford #Next, determine what is the most groups we can afford
most_enemies_afforded = int(spawn_power / new_card.enemy.spawn_power) most_enemies_afforded = int(spawn_power / enemy.spawn_power)
if most_enemies_afforded > 0: if most_enemies_afforded > 0:
enemy_chosen = true enemy_chosen = true
else: else:
#Even 1 group was too expensive, so we have to choose #Even 1 group was too expensive, so we have to choose
#a different enemy and try this process again #a different enemy and try this process again
var enemy_id: int = spawn_pool.find(new_card.enemy) var enemy_id: int = spawn_pool.find(enemy)
enemy_id -= 1 enemy_id -= 1
if first_enemy_id == -1: if first_enemy_id == -1:
first_enemy_id = enemy_id first_enemy_id = enemy_id
if enemy_id < 0: if enemy_id < 0:
new_card.enemy = spawn_pool[spawn_pool.size() - 1] enemy = spawn_pool[spawn_pool.size() - 1]
else: else:
new_card.enemy = spawn_pool[enemy_id] enemy = spawn_pool[enemy_id]
most_enemies_afforded = 0 most_enemies_afforded = 0
if enemy_id == first_enemy_id: if enemy_id == first_enemy_id:
return wave return wave
#Now that we know how many we could afford, lets just choose a #Now that we know how many we could afford, lets just choose a
#random number of groups #random number of groups
var chosen_groups: int = NoiseRandom.randi_in_range(spawn_power, 1, most_enemies_afforded) var chosen_groups: int = NoiseRandom.randi_in_range(spawn_power, 1, most_enemies_afforded)
new_card.count = chosen_groups * new_card.enemy.group_size
#Add that new enemy to the wave and spend the points! #Add that new enemy to the wave and spend the points!
wave.enemy_groups.append(new_card) enemy_group.count = chosen_groups * enemy.group_size
spawn_power -= chosen_groups * new_card.enemy.spawn_power wave.enemy_groups[enemy_group] = NoiseRandom.randi_in_range(spawn_power, 0, spawners - 1)
spawn_power -= chosen_groups * enemy.spawn_power
return wave return wave

View File

@@ -1,23 +0,0 @@
class_name EnemyCardUI
extends Control
@export var enemy_name: Label
@export var enemy_rarity: TextureRect
@export var enemy_tex: TextureRect
@export var enemy_count: Label
func set_enemy(enemy: EnemyCard) -> void:
enemy_name.text = tr(enemy.enemy.title)
enemy_rarity.texture.region = Rect2(0.0, 92.0 - (23.0 * int(enemy.rarity)), 124.0, 23.0)
enemy_tex.texture = enemy.enemy.icon
if enemy.rarity == Data.Rarity.COMMON:
enemy_count.text = str(enemy.enemy.common_group)
elif enemy.rarity == Data.Rarity.UNCOMMON:
enemy_count.text = str(enemy.enemy.uncommon_group)
elif enemy.rarity == Data.Rarity.RARE:
enemy_count.text = str(enemy.enemy.rare_group)
elif enemy.rarity == Data.Rarity.EPIC:
enemy_count.text = str(enemy.enemy.epic_group)
elif enemy.rarity == Data.Rarity.LEGENDARY:
enemy_count.text = str(enemy.enemy.legendary_group)

View File

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

View File

@@ -1,76 +0,0 @@
[gd_scene format=3 uid="uid://d17c77pqsi8oy"]
[ext_resource type="Script" uid="uid://b8j7mw1xwisi" path="res://UI/EnemyCard/enemy_card_ui.gd" id="1_i1ei4"]
[ext_resource type="Texture2D" uid="uid://g00wwrlxxdc5" path="res://Assets/Textures/icon_eye_dog.png" id="2_3r04h"]
[ext_resource type="Texture2D" uid="uid://c7tnda7he8u5l" path="res://Assets/Textures/stars_legendary-Sheet.png" id="3_uu1bb"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uu1bb"]
bg_color = Color(0.691357, 0.691357, 0.691357, 1)
corner_radius_top_left = 15
corner_radius_top_right = 15
corner_radius_bottom_right = 15
corner_radius_bottom_left = 15
expand_margin_left = 5.0
expand_margin_top = 5.0
expand_margin_right = 5.0
expand_margin_bottom = 5.0
[sub_resource type="AtlasTexture" id="AtlasTexture_4b8gd"]
resource_local_to_scene = true
atlas = ExtResource("3_uu1bb")
region = Rect2(0, 0, 124, 23)
[node name="EnemyCardUI" type="Control" unique_id=478697806 node_paths=PackedStringArray("enemy_name", "enemy_rarity", "enemy_tex", "enemy_count")]
layout_mode = 3
anchors_preset = 0
mouse_filter = 2
script = ExtResource("1_i1ei4")
enemy_name = NodePath("PanelContainer/HBoxContainer/EnemyName")
enemy_rarity = NodePath("PanelContainer/HBoxContainer/HBoxContainer/TextureRect")
enemy_tex = NodePath("PanelContainer/HBoxContainer/TextureRect")
enemy_count = NodePath("PanelContainer/HBoxContainer/HBoxContainer/Amount")
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=1907664316]
custom_minimum_size = Vector2(0, 300)
layout_mode = 0
offset_right = 241.0
offset_bottom = 138.0
mouse_filter = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_uu1bb")
[node name="HBoxContainer" type="VBoxContainer" parent="PanelContainer" unique_id=1742421495]
layout_mode = 2
mouse_filter = 2
[node name="EnemyName" type="Label" parent="PanelContainer/HBoxContainer" unique_id=1041834460]
layout_mode = 2
size_flags_vertical = 0
theme_override_colors/font_color = Color(0, 0, 0, 1)
text = "enemy name"
horizontal_alignment = 1
vertical_alignment = 1
[node name="TextureRect" type="TextureRect" parent="PanelContainer/HBoxContainer" unique_id=799830247]
layout_mode = 2
size_flags_vertical = 3
mouse_filter = 2
texture = ExtResource("2_3r04h")
expand_mode = 1
stretch_mode = 5
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/HBoxContainer" unique_id=763649452]
layout_mode = 2
size_flags_vertical = 8
[node name="Amount" type="Label" parent="PanelContainer/HBoxContainer/HBoxContainer" unique_id=987748659]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0, 0, 0, 1)
text = "15"
horizontal_alignment = 1
vertical_alignment = 1
[node name="TextureRect" type="TextureRect" parent="PanelContainer/HBoxContainer/HBoxContainer" unique_id=1523958658]
layout_mode = 2
texture = SubResource("AtlasTexture_4b8gd")
stretch_mode = 5

View File

@@ -1,10 +1,10 @@
class_name MainMenuLevelSelector extends PanelContainer class_name MainMenuLevelSelector extends PanelContainer
signal level_selected(specs: LevelSpecs, side_chosen: int) signal level_selected(specs: LevelConfig, side_chosen: int)
var side: int = 0 var side: int = 0
@export var levels: Array[LevelSpecs] = [] @export var levels: Array[LevelConfig] = []
func _on_button_pressed() -> void: func _on_button_pressed() -> void:
side = 0 side = 0
@@ -18,7 +18,7 @@ func _on_button_2_pressed() -> void:
func _ready() -> void: func _ready() -> void:
var i: int = 0 var i: int = 0
for level: LevelSpecs in levels: for level: LevelConfig in levels:
i += 1 i += 1
var button: Button = Button.new() var button: Button = Button.new()
button.text = "Level " + str(i) button.text = "Level " + str(i)

View File

@@ -118,11 +118,11 @@ func generate_seed() -> void:
gamemode.rng_seed = randi() gamemode.rng_seed = randi()
func level_selected(level: LevelSpecs, side: int) -> void: func level_selected(level: LevelConfig, side: int) -> void:
generate_seed() generate_seed()
gamemode.endless = true if side == 1 else false gamemode.endless = true if side == 1 else false
gamemode.daily = false gamemode.daily = false
game.level_specs = level game.level_config = level
start_game() start_game()

View File

@@ -4,7 +4,7 @@
[ext_resource type="Script" uid="uid://ci8vq73u23viy" path="res://UI/Menus/MainMenu/main_menu.gd" id="2_ivytu"] [ext_resource type="Script" uid="uid://ci8vq73u23viy" path="res://UI/Menus/MainMenu/main_menu.gd" id="2_ivytu"]
[ext_resource type="AudioStream" uid="uid://cp6ph4ra7u5rk" path="res://UI/drop_003.ogg" id="5_cwn2i"] [ext_resource type="AudioStream" uid="uid://cp6ph4ra7u5rk" path="res://UI/drop_003.ogg" id="5_cwn2i"]
[ext_resource type="Script" uid="uid://bwsw4oq150v3p" path="res://UI/Menus/MainMenu/level_selecter_main_menu.gd" id="8_qshe4"] [ext_resource type="Script" uid="uid://bwsw4oq150v3p" path="res://UI/Menus/MainMenu/level_selecter_main_menu.gd" id="8_qshe4"]
[ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_specs.gd" id="9_nt3t4"] [ext_resource type="Script" uid="uid://dalgif6huggwg" path="res://Scripts/Resources/level_config.gd" id="9_nt3t4"]
[ext_resource type="Resource" uid="uid://b67b70x1uf2el" path="res://Levels/Level1/specs.tres" id="10_kjkav"] [ext_resource type="Resource" uid="uid://b67b70x1uf2el" path="res://Levels/Level1/specs.tres" id="10_kjkav"]
[ext_resource type="Resource" uid="uid://dffoufw4bnfn7" path="res://Levels/Level2/specs.tres" id="11_kjkav"] [ext_resource type="Resource" uid="uid://dffoufw4bnfn7" path="res://Levels/Level2/specs.tres" id="11_kjkav"]
[ext_resource type="Resource" uid="uid://dgrcneuv4fut" path="res://Levels/Level3/specs.tres" id="12_eonxx"] [ext_resource type="Resource" uid="uid://dgrcneuv4fut" path="res://Levels/Level3/specs.tres" id="12_eonxx"]

5
enemy_group.gd Normal file
View File

@@ -0,0 +1,5 @@
class_name EnemyGroup
extends Resource
@export var enemy: Enemy
@export var count: int

1
enemy_group.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://3grc2j4bjrnw

View File

@@ -39,7 +39,7 @@ export/convert_text_resources_to_binary=false
[editor_plugins] [editor_plugins]
enabled=PackedStringArray("res://addons/proton_scatter/plugin.cfg") enabled=PackedStringArray()
[file_customization] [file_customization]

View File

@@ -10,9 +10,9 @@ signal closed()
@export var enemy_desc_label: RichTextLabel @export var enemy_desc_label: RichTextLabel
func set_waves(waves: Array[Wave], starting_wave_number: int) -> void: func set_waves(waves: Array[WaveConfig], starting_wave_number: int) -> void:
var i: int = starting_wave_number var i: int = starting_wave_number
for wave: Wave in waves: for wave: WaveConfig in waves:
var enemy_row: EnemyRow = enemy_row_scene.instantiate() as EnemyRow var enemy_row: EnemyRow = enemy_row_scene.instantiate() as EnemyRow
enemy_row.enemy_clicked.connect(set_enemy_desc) enemy_row.enemy_clicked.connect(set_enemy_desc)
wave_vbox.add_child(enemy_row) wave_vbox.add_child(enemy_row)
@@ -21,21 +21,14 @@ func set_waves(waves: Array[Wave], starting_wave_number: int) -> void:
var enemy_dict: Dictionary[Enemy, int] = {} var enemy_dict: Dictionary[Enemy, int] = {}
for group: EnemyCard in wave.enemy_groups: for enemy_group: EnemyGroup in wave.enemy_groups:
if enemy_dict.has(group.enemy): if !enemy_dict.has(enemy_group.enemy):
enemy_dict[group.enemy] += group_to_count(group) enemy_dict[enemy_group.enemy] = 0
else: enemy_dict[enemy_group.enemy] += enemy_group.count
enemy_dict[group.enemy] = group_to_count(group)
for enemy: Enemy in enemy_dict.keys(): for enemy: Enemy in enemy_dict.keys():
enemy_row.add_enemy_tag(enemy, enemy_dict[enemy]) enemy_row.add_enemy_tag(enemy, enemy_dict[enemy])
set_enemy_desc(waves[0].enemy_groups[0].enemy) set_enemy_desc(waves[0].enemy_groups.keys()[0].enemy)
func group_to_count(group: EnemyCard) -> int:
var count: int = 0
count = group.count
return count
func set_enemy_desc(enemy: Enemy) -> void: func set_enemy_desc(enemy: Enemy) -> void: