From 029128c8b88699ce51ced77fe90172e56fdf2530 Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Sat, 15 Mar 2025 17:17:30 +0100 Subject: [PATCH] Remade resource script system --- Resources/BossPhases/Rumia_NS2.tres | 135 +++------- .../Basic_Enemy_Emitter_Spiral_Bullets.tres | 25 ++ .../Boss/Rumia/Rumia_Red_Chase_Bullet.tres | 2 +- Scenes/Activable/FloorEmitter.tscn | 5 +- Scenes/Maps/Level2.tscn | 70 +++--- Scenes/Maps/PlayerFSMTest.tscn | 55 +++- Scripts/Actors/ScriptableBulletsEmitter.cs | 44 +++- Scripts/AttackPatterns/IPatternMachine.cs | 15 ++ Scripts/AttackPatterns/MovementPattern.cs | 96 ++++--- Scripts/AttackPatterns/PatternTest.cs | 60 +++-- Scripts/AttackPatterns/SpiralPattern.cs | 235 ++++++++++++------ Scripts/AttackPatterns/TargetedPattern.cs | 52 ++-- Scripts/Resources/AttackPattern.cs | 10 +- Scripts/Resources/BossPhase.cs | 16 +- Scripts/Resources/BulletScript.cs | 51 ++-- Scripts/Resources/PatternGroup.cs | 48 ++-- Scripts/Resources/SimpleMovementPattern.cs | 67 ++--- 17 files changed, 588 insertions(+), 398 deletions(-) create mode 100644 Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres create mode 100644 Scripts/AttackPatterns/IPatternMachine.cs diff --git a/Resources/BossPhases/Rumia_NS2.tres b/Resources/BossPhases/Rumia_NS2.tres index b9ea58c4..ede62e2b 100644 --- a/Resources/BossPhases/Rumia_NS2.tres +++ b/Resources/BossPhases/Rumia_NS2.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="BossPhase" load_steps=43 format=3 uid="uid://ddb5dqocmk6x7"] +[gd_resource type="Resource" script_class="BossPhase" load_steps=41 format=3 uid="uid://ddb5dqocmk6x7"] [ext_resource type="PackedScene" uid="uid://dh81snen2f6bf" path="res://Scenes/Weapons/Bullets/enemyBullet_rice_blue_small.tscn" id="1_as8n2"] [ext_resource type="Script" uid="uid://cdd6q2h0t1hhq" path="res://Scripts/Resources/BossPhase.cs" id="1_fdlxv"] @@ -9,7 +9,6 @@ [ext_resource type="PackedScene" uid="uid://chowj81jsdvcx" path="res://Scenes/Weapons/Bullets/enemyBullet_rice_red_small.tscn" id="5_n4xqo"] [ext_resource type="Script" uid="uid://bhc7rbcico4kp" path="res://Scripts/Resources/SimpleMovementPattern.cs" id="6_bw7cj"] [ext_resource type="PackedScene" uid="uid://dohakkayqj4w2" path="res://Scenes/Weapons/Bullets/enemyBullet_green.tscn" id="7_gsnyb"] -[ext_resource type="Script" uid="uid://b17xowb38dngv" path="res://Scripts/Resources/SpeedModifier.cs" id="8_6ya1v"] [ext_resource type="Script" uid="uid://c6kkaq6j4thug" path="res://Scripts/Resources/Modifiers/DelayedPlayerFacingModifier.cs" id="9_mfo5a"] [ext_resource type="Script" uid="uid://cq7pfooyqayc4" path="res://Scripts/Resources/Modifiers/DelayedSpeedModifier.cs" id="10_nuha6"] @@ -36,20 +35,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_cj86d")]) [sub_resource type="Resource" id="Resource_puvpt"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_jtuih") -BulletScene = ExtResource("1_as8n2") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 0.0 duration = 1.0 -burstInterval = 2.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_cj86d")]) +burstInterval = 2.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = false @@ -76,20 +69,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_pbgtt")]) [sub_resource type="Resource" id="Resource_44j24"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_axlrq") -BulletScene = ExtResource("1_as8n2") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 180.0 duration = 2.0 -burstInterval = 6.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_pbgtt")]) +burstInterval = 6.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true @@ -109,20 +96,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_cj86d")]) [sub_resource type="Resource" id="Resource_wkxow"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_w7b0n") -BulletScene = ExtResource("4_tek7n") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 0.0 duration = 1.0 -burstInterval = 2.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_cj86d")]) +burstInterval = 2.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = false @@ -142,20 +123,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_pbgtt")]) [sub_resource type="Resource" id="Resource_gcqck"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_3iv0j") -BulletScene = ExtResource("4_tek7n") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 180.0 duration = 2.0 -burstInterval = 6.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_pbgtt")]) +burstInterval = 6.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true @@ -175,20 +150,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_cj86d")]) [sub_resource type="Resource" id="Resource_bxbto"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_5jr31") -BulletScene = ExtResource("5_n4xqo") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 0.0 duration = 1.0 -burstInterval = 2.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_cj86d")]) +burstInterval = 2.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = false @@ -208,20 +177,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_pbgtt")]) [sub_resource type="Resource" id="Resource_q48s1"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_mg2qy") -BulletScene = ExtResource("5_n4xqo") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 20.0 bulletCount = 20 rotationSpeed = 0.0 _rotationOffset = 180.0 duration = 2.0 -burstInterval = 6.0 spread = 360.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_timeModifiers = Array[Resource]([SubResource("Resource_pbgtt")]) +burstInterval = 6.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true @@ -260,32 +223,17 @@ DamageType = 0 Controllable = false TimeModifiers = Array[Object]([SubResource("Resource_ln27r"), SubResource("Resource_nal31")]) -[sub_resource type="Resource" id="Resource_80ngy"] -script = ExtResource("8_6ya1v") -ModifierType = 1 -Easing = 0 -Invert = true -MinimumSpeed = 10.0 -ScalingFactor = 10.0 - [sub_resource type="Resource" id="Resource_mpjrl"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_gfhkm") -BulletScene = ExtResource("7_gsnyb") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 80.0 bulletCount = 12 rotationSpeed = 0.0 _rotationOffset = 45.0 duration = 0.8 -burstInterval = 1.0 spread = 180.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_modifier = SubResource("Resource_80ngy") -_timeModifiers = Array[Resource]([SubResource("Resource_ln27r"), SubResource("Resource_nal31")]) +burstInterval = 1.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = true WaitForCompletion = true @@ -313,21 +261,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_ln27r"), SubResource("Resou [sub_resource type="Resource" id="Resource_ncfnl"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_4r74g") -BulletScene = ExtResource("7_gsnyb") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 80.0 bulletCount = 12 rotationSpeed = 0.0 _rotationOffset = 45.0 duration = 0.8 -burstInterval = 1.0 spread = 180.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_modifier = SubResource("Resource_80ngy") -_timeModifiers = Array[Resource]([SubResource("Resource_ln27r"), SubResource("Resource_nal31")]) +burstInterval = 1.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true @@ -355,21 +296,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_ln27r"), SubResource("Resou [sub_resource type="Resource" id="Resource_vkthc"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_vgg5n") -BulletScene = ExtResource("7_gsnyb") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 80.0 bulletCount = 12 rotationSpeed = 0.0 _rotationOffset = 45.0 duration = 0.8 -burstInterval = 1.0 spread = 180.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_modifier = SubResource("Resource_80ngy") -_timeModifiers = Array[Resource]([SubResource("Resource_ln27r"), SubResource("Resource_nal31")]) +burstInterval = 1.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true @@ -397,21 +331,14 @@ TimeModifiers = Array[Object]([SubResource("Resource_ln27r"), SubResource("Resou [sub_resource type="Resource" id="Resource_n2gn4"] script = ExtResource("2_wkmhk") BulletResource = SubResource("Resource_wlhxp") -BulletScene = ExtResource("7_gsnyb") -_bulletLifeTime = 20.0 -_destroyOnCollision = false -bulletSpeed = 80.0 bulletCount = 12 rotationSpeed = 0.0 _rotationOffset = 45.0 duration = 0.8 -burstInterval = 1.0 spread = 180.0 -owner = 2 -_damageType = 0 -_bulletDamage = 1.0 -_modifier = SubResource("Resource_80ngy") -_timeModifiers = Array[Resource]([SubResource("Resource_ln27r"), SubResource("Resource_nal31")]) +burstInterval = 1.0 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true diff --git a/Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres b/Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres new file mode 100644 index 00000000..5e2d70bf --- /dev/null +++ b/Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="BulletScript" load_steps=5 format=3 uid="uid://cmra7n6so1x4u"] + +[ext_resource type="Resource" uid="uid://dqnvesdj0dk3v" path="res://Resources/Bullets/simple_enemy_bullet.tres" id="1_lkipe"] +[ext_resource type="Script" uid="uid://c0ndqalsc4jve" path="res://Scripts/AttackPatterns/SpiralPattern.cs" id="2_v7d4m"] +[ext_resource type="Script" uid="uid://bngko08ho85p6" path="res://Scripts/Resources/BulletScript.cs" id="3_omk5v"] + +[sub_resource type="Resource" id="Resource_lkipe"] +script = ExtResource("2_v7d4m") +BulletResource = ExtResource("1_lkipe") +bulletCount = 16 +rotationSpeed = 20.0 +_rotationOffset = 0.0 +duration = 60.0 +spread = 360.0 +burstInterval = 0.2 +ShotsPerBurst = 4 +BurstRate = 0.8 +_targetPlayer = false +WaitForCompletion = true +metadata/_custom_type_script = "uid://c0ndqalsc4jve" + +[resource] +script = ExtResource("3_omk5v") +Patterns = Array[Object]([SubResource("Resource_lkipe")]) +metadata/_custom_type_script = "uid://bngko08ho85p6" diff --git a/Resources/Bullets/Boss/Rumia/Rumia_Red_Chase_Bullet.tres b/Resources/Bullets/Boss/Rumia/Rumia_Red_Chase_Bullet.tres index 06d3f127..3a78cf67 100644 --- a/Resources/Bullets/Boss/Rumia/Rumia_Red_Chase_Bullet.tres +++ b/Resources/Bullets/Boss/Rumia/Rumia_Red_Chase_Bullet.tres @@ -23,7 +23,7 @@ BulletSpeed = 70.0 Direction = Vector2(1, 0) BulletDamage = 20.0 LifeTime = 20.0 -DestroyOnCollision = false +DestroyOnCollision = true Owner = 2 DamageType = 0 Controllable = false diff --git a/Scenes/Activable/FloorEmitter.tscn b/Scenes/Activable/FloorEmitter.tscn index a0fe0e4f..a7932f1d 100644 --- a/Scenes/Activable/FloorEmitter.tscn +++ b/Scenes/Activable/FloorEmitter.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=9 format=3 uid="uid://b7gkxlll3b1eg"] -[ext_resource type="Script" uid="uid://uq50svtj2muh" path="res://Scripts/Activables/BulletEmitter.cs" id="1_g5ki3"] +[ext_resource type="Script" uid="uid://c1gu44a1kkmt1" path="res://Scripts/Actors/ScriptableBulletsEmitter.cs" id="1_vgtpa"] [ext_resource type="Script" uid="uid://c6467d6yx50qh" path="res://Scripts/Components/BulletSpawner.cs" id="2_uhbyd"] [ext_resource type="Texture2D" uid="uid://ck8e4ngk8wy0m" path="res://Sprites/Actors/Floor_Emitter.png" id="3_g5ki3"] [ext_resource type="Script" uid="uid://cq3hkweplldbr" path="res://Scripts/Components/Actors/GenericDamageReceiver.cs" id="4_bbtu4"] @@ -12,8 +12,7 @@ radius = 5.0 [node name="FloorEmitter" type="Node2D"] -script = ExtResource("1_g5ki3") -EmissionRotation = 90.0 +script = ExtResource("1_vgtpa") [node name="BulletSpawner" type="Node2D" parent="."] script = ExtResource("2_uhbyd") diff --git a/Scenes/Maps/Level2.tscn b/Scenes/Maps/Level2.tscn index 312a6421..0cef2fe7 100644 --- a/Scenes/Maps/Level2.tscn +++ b/Scenes/Maps/Level2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=81 format=4 uid="uid://6a6tjohypmmb"] +[gd_scene load_steps=80 format=4 uid="uid://6a6tjohypmmb"] [ext_resource type="Script" uid="uid://doxmbokehw8ci" path="res://Scripts/GameManager.cs" id="1_t2k72"] [ext_resource type="PackedScene" uid="uid://c4pr2707hbeph" path="res://Scenes/Actors/fsm_player.tscn" id="2_2jsgm"] @@ -40,9 +40,9 @@ [ext_resource type="AudioStream" uid="uid://blohh20jktoyo" path="res://SFX/270641__phantastonia__alarm2.wav" id="31_nb1db"] [ext_resource type="PackedScene" uid="uid://b7gkxlll3b1eg" path="res://Scenes/Activable/FloorEmitter.tscn" id="33_6h3t3"] [ext_resource type="Texture2D" uid="uid://r2bdhalt8sih" path="res://Sprites/Items/ofudagun_test.png" id="33_v8wj6"] -[ext_resource type="PackedScene" uid="uid://dre2wvw4pa3hc" path="res://Scenes/Weapons/Bullets/enemyBullet_mid_blue.tscn" id="35_owyq0"] -[ext_resource type="Script" uid="uid://dslyrfcej3g2n" path="res://Scripts/Resources/BulletResource.cs" id="36_qo7ri"] +[ext_resource type="Resource" uid="uid://cmra7n6so1x4u" path="res://Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres" id="35_imrxd"] [ext_resource type="PackedScene" uid="uid://b0k2grrc8xp1l" path="res://Scenes/Props/BigTank.tscn" id="37_47klv"] +[ext_resource type="PackedScene" uid="uid://dfat0erkvb513" path="res://Scenes/Actors/Fairy_New.tscn" id="37_sb7g3"] [sub_resource type="Resource" id="Resource_6wo78"] script = ExtResource("4_s1vkf") @@ -291,20 +291,6 @@ animations = [{ "speed": 5.0 }] -[sub_resource type="Resource" id="Resource_5j8ks"] -script = ExtResource("36_qo7ri") -BulletScene = ExtResource("35_owyq0") -BulletSpeed = 100.0 -Direction = Vector2(1, 0) -BulletDamage = 4.0 -LifeTime = 10.0 -DestroyOnCollision = true -Owner = 2 -DamageType = 0 -Controllable = false -TimeModifiers = null -metadata/_custom_type_script = "uid://dslyrfcej3g2n" - [node name="GameScene" type="Node2D"] script = ExtResource("1_t2k72") PlayerTemplate = ExtResource("2_2jsgm") @@ -477,7 +463,7 @@ Targets = [NodePath("../HorizontalForceField"), NodePath("../FloorEmitter"), Nod position = Vector2(-48, 480) [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Tilemaps/Actors"] -position = Vector2(291.904, 324.654) +position = Vector2(-48, 375) sprite_frames = SubResource("SpriteFrames_qco45") autoplay = "default" frame = 22 @@ -485,33 +471,45 @@ frame_progress = 0.83544 [node name="FloorEmitter" parent="Tilemaps/Actors" instance=ExtResource("33_6h3t3")] position = Vector2(-97, 661) -BulletResource = SubResource("Resource_5j8ks") +Script = ExtResource("35_imrxd") InvertSignal = true -BurstCoolDown = 0.7 -Spread = 360.0 -Count = 8 -RotationSpeed = 5.0 -BulletsPerBurst = 4 [node name="FloorEmitter2" parent="Tilemaps/Actors" instance=ExtResource("33_6h3t3")] position = Vector2(-170.149, 591.864) -BulletResource = SubResource("Resource_5j8ks") +Script = ExtResource("35_imrxd") InvertSignal = true -BurstCoolDown = 0.7 -Spread = 360.0 -Count = 8 -RotationSpeed = 5.0 -BulletsPerBurst = 4 [node name="FloorEmitter3" parent="Tilemaps/Actors" instance=ExtResource("33_6h3t3")] position = Vector2(-282.728, 648.41) -BulletResource = SubResource("Resource_5j8ks") +Script = ExtResource("35_imrxd") InvertSignal = true -BurstCoolDown = 0.7 -Spread = 360.0 -Count = 8 -RotationSpeed = 5.0 -BulletsPerBurst = 4 + +[node name="FairyGuard" parent="Tilemaps/Actors" instance=ExtResource("25_nb1db")] +position = Vector2(99, 311) + +[node name="FairyGuard2" parent="Tilemaps/Actors" instance=ExtResource("25_nb1db")] +position = Vector2(96, 523) + +[node name="Fairy" parent="Tilemaps/Actors" instance=ExtResource("37_sb7g3")] +position = Vector2(159, 349) + +[node name="FairyGuard3" parent="Tilemaps/Actors" instance=ExtResource("25_nb1db")] +position = Vector2(-34, 566) + +[node name="FairyGuard4" parent="Tilemaps/Actors" instance=ExtResource("25_nb1db")] +position = Vector2(-202, 610) + +[node name="Fairy2" parent="Tilemaps/Actors" instance=ExtResource("37_sb7g3")] +position = Vector2(-103, 505) + +[node name="Fairy3" parent="Tilemaps/Actors" instance=ExtResource("37_sb7g3")] +position = Vector2(-64, 642) + +[node name="Fairy4" parent="Tilemaps/Actors" instance=ExtResource("37_sb7g3")] +position = Vector2(-123, 594) + +[node name="Fairy5" parent="Tilemaps/Actors" instance=ExtResource("37_sb7g3")] +position = Vector2(287, 515) [node name="CameraController" type="Camera2D" parent="."] script = ExtResource("7_lxkiw") diff --git a/Scenes/Maps/PlayerFSMTest.tscn b/Scenes/Maps/PlayerFSMTest.tscn index b70baf80..096b2dda 100644 --- a/Scenes/Maps/PlayerFSMTest.tscn +++ b/Scenes/Maps/PlayerFSMTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=68 format=4 uid="uid://dqyfnby0t7gu1"] +[gd_scene load_steps=71 format=4 uid="uid://dqyfnby0t7gu1"] [ext_resource type="Script" uid="uid://doxmbokehw8ci" path="res://Scripts/GameManager.cs" id="1_c3v4x"] [ext_resource type="Resource" uid="uid://cs3ihltcn2166" path="res://Resources/Items/IcicleGun.tres" id="3_6314l"] @@ -55,6 +55,8 @@ [ext_resource type="Resource" uid="uid://dqnvesdj0dk3v" path="res://Resources/Bullets/simple_enemy_bullet.tres" id="39_b0wyy"] [ext_resource type="Script" uid="uid://c0ndqalsc4jve" path="res://Scripts/AttackPatterns/SpiralPattern.cs" id="40_o56je"] [ext_resource type="Script" uid="uid://c6467d6yx50qh" path="res://Scripts/Components/BulletSpawner.cs" id="43_b8ffn"] +[ext_resource type="PackedScene" uid="uid://b7gkxlll3b1eg" path="res://Scenes/Activable/FloorEmitter.tscn" id="44_b8ffn"] +[ext_resource type="Resource" uid="uid://cmra7n6so1x4u" path="res://Resources/BulletScripts/Basic_Enemy_Emitter_Spiral_Bullets.tres" id="45_4mkc6"] [sub_resource type="Resource" id="Resource_6wo78"] script = ExtResource("4_u1i8n") @@ -89,9 +91,10 @@ bulletCount = 16 rotationSpeed = 0.0 _rotationOffset = 0.0 duration = 5.0 -burstInterval = 0.5 spread = 360.0 -_timeModifiers = null +burstInterval = 0.5 +ShotsPerBurst = 100 +BurstRate = 0.0 _targetPlayer = false WaitForCompletion = true metadata/_custom_type_script = "uid://c0ndqalsc4jve" @@ -101,7 +104,26 @@ script = ExtResource("39_83jc5") Patterns = Array[Object]([SubResource("Resource_4mkc6")]) metadata/_custom_type_script = "uid://bngko08ho85p6" -[sub_resource type="CircleShape2D" id="CircleShape2D_b0wyy"] +[sub_resource type="Resource" id="Resource_kuo18"] +script = ExtResource("40_o56je") +BulletResource = ExtResource("39_b0wyy") +bulletCount = 16 +rotationSpeed = 10.0 +_rotationOffset = 0.0 +duration = 5.0 +spread = 360.0 +burstInterval = 0.5 +ShotsPerBurst = 100 +BurstRate = 0.0 +_targetPlayer = false +WaitForCompletion = true +metadata/_custom_type_script = "uid://c0ndqalsc4jve" + +[sub_resource type="Resource" id="Resource_b8ffn"] +resource_local_to_scene = true +script = ExtResource("39_83jc5") +Patterns = Array[Object]([SubResource("Resource_kuo18")]) +metadata/_custom_type_script = "uid://bngko08ho85p6" [sub_resource type="Resource" id="Resource_pgobb"] script = ExtResource("29_3ll5g") @@ -303,7 +325,7 @@ ExplosionData = ExtResource("36_m2siw") position = Vector2(466, 113) ExplosionData = ExtResource("36_m2siw") -[node name="ScriptableEmitter" type="Area2D" parent="Tilemaps/Actors"] +[node name="ScriptableEmitter" type="Node2D" parent="Tilemaps/Actors"] position = Vector2(480.462, 167.331) script = ExtResource("38_m2f1m") Script = SubResource("Resource_g5r8k") @@ -314,15 +336,30 @@ texture = ExtResource("38_kc3i0") hframes = 3 frame = 1 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Tilemaps/Actors/ScriptableEmitter"] -shape = SubResource("CircleShape2D_b0wyy") - [node name="BulletSpawner" type="Node2D" parent="Tilemaps/Actors/ScriptableEmitter"] script = ExtResource("43_b8ffn") [node name="ControlPad3" parent="Tilemaps/Actors" node_paths=PackedStringArray("Target") instance=ExtResource("20_0knpf")] position = Vector2(436, 161) -Target = NodePath("../ScriptableEmitter") +Target = NodePath("") + +[node name="FloorEmitter" parent="Tilemaps/Actors" instance=ExtResource("44_b8ffn")] +position = Vector2(639.074, 158.001) +Script = ExtResource("45_4mkc6") +InvertSignal = true +EmitOnStart = true + +[node name="FloorEmitter3" parent="Tilemaps/Actors" instance=ExtResource("44_b8ffn")] +position = Vector2(613, 186) +Script = ExtResource("45_4mkc6") +InvertSignal = true +EmitOnStart = true + +[node name="FloorEmitter2" parent="Tilemaps/Actors" instance=ExtResource("44_b8ffn")] +position = Vector2(601, 147) +Script = SubResource("Resource_b8ffn") +InvertSignal = true +EmitOnStart = true [node name="ScriptableAreaTrigger" parent="Tilemaps" instance=ExtResource("28_fuxq3")] position = Vector2(230, 250) diff --git a/Scripts/Actors/ScriptableBulletsEmitter.cs b/Scripts/Actors/ScriptableBulletsEmitter.cs index fdd488d1..045efd5d 100644 --- a/Scripts/Actors/ScriptableBulletsEmitter.cs +++ b/Scripts/Actors/ScriptableBulletsEmitter.cs @@ -5,17 +5,40 @@ using Godot; namespace Cirno.Scripts.Actors; -public partial class ScriptableBulletsEmitter : Area2D, IActivable, IScriptHost +public partial class ScriptableBulletsEmitter : Node2D, IActivable, IScriptHost { [Export] public BulletScript Script { get; private set; } + [Export] + public bool InvertSignal { get; private set; } = false; + + [Export] + public bool EmitOnStart { get; set; } = false; + + [Signal] + public delegate void StateChangedEventHandler(bool isEmitting); private bool _isActive = false; + //private BulletScript _scriptInstance; + + protected BulletScript.BulletScriptMachine ScriptMachine; + public override void _Ready() { + //_scriptInstance = Script.Duplicate(true) as BulletScript; + + ScriptMachine = Script.Make(this); + _homePosition = this.GlobalPosition; + + if (EmitOnStart) + { + _isActive = true; + ScriptMachine.Start(); + } + EmitSignal(SignalName.StateChanged, _isActive); } public bool Activate(ActivationType activationType = ActivationType.Toggle) @@ -26,23 +49,26 @@ public partial class ScriptableBulletsEmitter : Area2D, IActivable, IScriptHost case ActivationType.Toggle: _isActive = !_isActive; break; - case ActivationType.Close: - case ActivationType.Enable: - _isActive = true; - break; case ActivationType.Open: + case ActivationType.Enable: + _isActive = !InvertSignal; + break; + case ActivationType.Close: case ActivationType.Disable: - _isActive = false; + _isActive = InvertSignal; break; case ActivationType.Destroy: - _isActive = false; + _isActive = InvertSignal; + // TODO: Explode break; } if (_isActive) { - Script.Start(this); + ScriptMachine.Start(); } + + EmitSignal(SignalName.StateChanged, _isActive); return true; } @@ -51,7 +77,7 @@ public partial class ScriptableBulletsEmitter : Area2D, IActivable, IScriptHost { if (!_isActive) return; - Script.UpdatePhase(delta); + ScriptMachine.UpdatePhase(delta); } private Vector2 _homePosition; diff --git a/Scripts/AttackPatterns/IPatternMachine.cs b/Scripts/AttackPatterns/IPatternMachine.cs new file mode 100644 index 00000000..f5efff9a --- /dev/null +++ b/Scripts/AttackPatterns/IPatternMachine.cs @@ -0,0 +1,15 @@ +using Cirno.Scripts.Resources; +using Godot; + +namespace Cirno.Scripts.AttackPatterns; + +public interface IPatternMachine +{ + public Node2D Parent { get; } + + public void Start(); + + public void UpdatePattern(double delta); + public bool IsComplete(); + +} \ No newline at end of file diff --git a/Scripts/AttackPatterns/MovementPattern.cs b/Scripts/AttackPatterns/MovementPattern.cs index 46b99409..b2a9c7b5 100644 --- a/Scripts/AttackPatterns/MovementPattern.cs +++ b/Scripts/AttackPatterns/MovementPattern.cs @@ -7,52 +7,66 @@ namespace Cirno.Scripts.AttackPatterns; [GlobalClass] public partial class MovementPattern : AttackPattern { - [Export] private Vector2 relativeTargetPosition; - [Export] private float moveDuration = 2f; - [Export] private Tween.TransitionType transitionType = Tween.TransitionType.Linear; - [Export] private Tween.EaseType easeType = Tween.EaseType.InOut; - [Export] private AttackPattern shootingPattern; + [Export] public Vector2 relativeTargetPosition; + [Export] public float moveDuration = 2f; + [Export] public Tween.TransitionType transitionType = Tween.TransitionType.Linear; + [Export] public Tween.EaseType easeType = Tween.EaseType.InOut; + [Export] public AttackPattern shootingPattern; - - private Tween tween; - private bool isComplete = false; - - protected IScriptHost Boss; - - public override void Start(Node2D parent) + public override IPatternMachine MakeMachine(Node2D parent) { - if (parent is not IScriptHost boss) - return; - - Boss = boss; - tween = parent.CreateTween(); - isComplete = false; - - Vector2 targetPosition = (Boss?.HomePosition ?? parent.GlobalPosition) + this.relativeTargetPosition; - - tween.TweenProperty(Parent, "position", targetPosition, moveDuration) - .SetTrans(transitionType) - .SetEase(easeType) - .Finished += () => isComplete = true; - - if (shootingPattern != null && !WaitForCompletion) - { - shootingPattern.Start(Parent); - } + return new MovementPatternMachine(this, parent); } - public override void UpdatePattern(double delta) + public class MovementPatternMachine(MovementPattern pattern, Node2D parent) : IPatternMachine { - if (shootingPattern != null && !WaitForCompletion) - { - shootingPattern.UpdatePattern(delta); - } - } + public Node2D Parent => parent; + public MovementPattern Pattern { get; } = pattern; + + private IPatternMachine _machine; - public override bool IsComplete() - { - if (WaitForCompletion && shootingPattern != null) - return isComplete && shootingPattern.IsComplete(); - return isComplete; + private Tween tween; + private bool isComplete = false; + + protected IScriptHost Boss; + + public void Start() + { + if (parent is not IScriptHost boss) + return; + + Boss = boss; + tween = parent.CreateTween(); + isComplete = false; + + Vector2 targetPosition = (Boss?.HomePosition ?? parent.GlobalPosition) + Pattern.relativeTargetPosition; + + tween.TweenProperty(Parent, "position", targetPosition, Pattern.moveDuration) + .SetTrans(Pattern.transitionType) + .SetEase(Pattern.easeType) + .Finished += () => isComplete = true; + + if (Pattern.shootingPattern != null && !Pattern.WaitForCompletion) + { + _machine = Pattern.shootingPattern.MakeMachine(parent); + _machine.Start(); + } + } + + public void UpdatePattern(double delta) + { + if (_machine is not null && !Pattern.WaitForCompletion) + { + _machine.UpdatePattern(delta); + //shootingPattern.UpdatePattern(delta); + } + } + + public bool IsComplete() + { + if (Pattern.WaitForCompletion && _machine is not null) + return isComplete && _machine.IsComplete(); + return isComplete; + } } } \ No newline at end of file diff --git a/Scripts/AttackPatterns/PatternTest.cs b/Scripts/AttackPatterns/PatternTest.cs index 891152e7..a82a2c03 100644 --- a/Scripts/AttackPatterns/PatternTest.cs +++ b/Scripts/AttackPatterns/PatternTest.cs @@ -9,37 +9,47 @@ namespace Cirno.Scripts.AttackPatterns; public partial class PatternTest : AttackPattern { [Export] public PackedScene BulletScene; - [Export] private float bulletSpeed = 5f; - [Export] private int bulletCount = 12; - [Export] private float duration = 3f; - [Export] private float burstInterval = 0.5f; - [Export] private BulletOwner owner = BulletOwner.Enemy; - - private double timer; - private double burstTimer; - private BulletSpawner spawner; - - public override void Start(Node2D parent) + [Export] public float bulletSpeed = 5f; + [Export] public int bulletCount = 12; + [Export] public float duration = 3f; + [Export] public float burstInterval = 0.5f; + [Export] public BulletOwner owner = BulletOwner.Enemy; + + public override IPatternMachine MakeMachine(Node2D parent) { - Parent = parent; - timer = 0; - burstTimer = 0; - spawner = Parent.GetNode("BulletSpawner"); + return new PatternTestMachine(this, parent); } - - public override void UpdatePattern(double delta) + + public class PatternTestMachine(PatternTest pattern, Node2D parent) : IPatternMachine { - timer += delta; - burstTimer += delta; - if (timer < duration && burstTimer >= burstInterval) + public Node2D Parent => parent; + private double timer; + private double burstTimer; + private BulletSpawner spawner; + + public void Start() { - spawner.SpawnBullet(Parent.GlobalPosition, Vector2.Right, bulletSpeed, owner, bulletCount, bulletScene: BulletScene); + timer = 0; burstTimer = 0; + spawner = Parent.GetNode("BulletSpawner"); + } + + public void UpdatePattern(double delta) + { + timer += delta; + burstTimer += delta; + if (timer < pattern.duration && burstTimer >= pattern.burstInterval) + { + spawner.SpawnBullet(Parent.GlobalPosition, Vector2.Right, pattern.bulletSpeed, pattern.owner, pattern.bulletCount, bulletScene: pattern.BulletScene); + burstTimer = 0; + } + } + + public bool IsComplete() + { + return timer >= pattern.duration; } } - public override bool IsComplete() - { - return timer >= duration; - } + } \ No newline at end of file diff --git a/Scripts/AttackPatterns/SpiralPattern.cs b/Scripts/AttackPatterns/SpiralPattern.cs index 91441216..fb1483a4 100644 --- a/Scripts/AttackPatterns/SpiralPattern.cs +++ b/Scripts/AttackPatterns/SpiralPattern.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Cirno.Scripts.Actors; using Cirno.Scripts.Components; @@ -13,82 +14,28 @@ namespace Cirno.Scripts.AttackPatterns; public partial class SpiralPattern : AttackPattern { [Export] public BulletResource BulletResource { get; set; } + //Export] public PackedScene BulletScene; //[Export] private float _bulletLifeTime = 20f; // Switch to res //[Export] private bool _destroyOnCollision = false; // Switch to res //[Export] private float bulletSpeed = 5f; // Switch to res - [Export] private int bulletCount = 16; - [Export] private float rotationSpeed = 0f; - [Export] private float _rotationOffset = 0f; - [Export] private float duration = 5f; - [Export] private float burstInterval = 0.5f; - [Export] private float spread = 360f; + [Export] public int bulletCount = 16; + [Export] public float rotationSpeed = 0f; + [Export] public float _rotationOffset = 0f; + [Export] public float duration = 5f; + [Export] public float spread = 360f; + [Export] public float burstInterval = 0.5f; + + [ExportCategory("Burst")] [Export] public int ShotsPerBurst { get; private set; } = 100; + + [Export] public float BurstRate { get; private set; } = 0f; + //[Export] private BulletOwner owner = BulletOwner.Enemy; // Switch to res //[Export] private DamageType _damageType = DamageType.Neutral; // Switch to res //[Export] private float _bulletDamage = 1f; // Switch to res - [ExportGroup("Modifiers")] - [Export] private BulletCreationModifier _modifier; - [ExportGroup("Modifiers")] - [Export] private Array _timeModifiers; - - [Export] private bool _targetPlayer = false; - - private double timer; - private double burstTimer; - private BulletSpawner spawner; - - public override void Start(Node2D parent) - { - Parent = parent; - timer = 0; - burstTimer = burstInterval; // start immediately - spawner = parent.GetNode("BulletSpawner"); - } - - public override void UpdatePattern(double delta) - { - timer += delta; - burstTimer += delta; - if (timer < duration && burstTimer >= burstInterval) - { - float angleOffset = _rotationOffset + (float)(rotationSpeed * timer); - - Vector2 direction = BulletResource.Direction; - - if (_targetPlayer && GameManager.Instance.PlayerPosition.HasValue) - { - direction = (GameManager.Instance.PlayerPosition.Value - Parent.GlobalPosition).Normalized(); - } - - var bullet = BulletResource.MakeBullet(Parent.GlobalPosition, bulletCount, spread, angleOffset); - bullet.Direction = direction; - - //spawner.SpawnBullet(MakeBullet(Boss.GlobalPosition, direction, angleOffset)); - spawner.SpawnBullet(bullet); - - // spawner.SpawnBullet(new BulletInfo() - // { - // Position = Boss.GlobalPosition, - // Direction = direction, - // Speed = bulletSpeed, - // Owner = owner, - // DamageType = _damageType, - // Damage = _bulletDamage, - // BulletCount = bulletCount, - // Spread = spread, - // BulletScene = BulletScene, - // RotationOffset = angleOffset, - // Modifier = _modifier, - // TimeModifiers = ((_timeModifiers?.Where(mod => mod != null)) ?? Array.Empty()).Select(m => new ModifierWrapper() - // { - // TimeModifier = m, - // Applied = false - // }).ToList() - // }); - - burstTimer = 0; - } - } + // [ExportGroup("Modifiers")] [Export] private BulletCreationModifier _modifier; + // [ExportGroup("Modifiers")] [Export] private Array _timeModifiers; + [ExportCategory("Other")] [Export] public bool _targetPlayer = false; protected virtual BulletInfo MakeBullet(Vector2 position, Vector2 direction, float angleOffset) { @@ -96,7 +43,7 @@ public partial class SpiralPattern : AttackPattern bl.Direction = direction; return bl; - + // return new BulletInfo() // { // Position = position, @@ -117,8 +64,148 @@ public partial class SpiralPattern : AttackPattern // }; } - public override bool IsComplete() + public override IPatternMachine MakeMachine(Node2D parent) { - return timer >= duration; + return new SpiralPatternMachine(this, parent); } -} + + public class SpiralPatternMachine(SpiralPattern pattern, Node2D parent) : IPatternMachine + { + public Node2D Parent => parent; + private double timer; + private double burstTimer; + //private double _burstRateTimer; + private BulletSpawner spawner; + + private ShootStatus _state = ShootStatus.Idle; + + private int _burstBullets; + + public void Start() + { + timer = 0; + _burstBullets = pattern.ShotsPerBurst; + burstTimer = pattern.burstInterval; // start immediately + //_burstRateTimer = pattern.burstInterval; + spawner = parent.GetNode("BulletSpawner"); + + _state = ShootStatus.Shooting; + } + + private void WaitingBurstUpdate(double delta) + { + timer += delta; + burstTimer += delta; + + if (burstTimer >= pattern.burstInterval) + { + _state = ShootStatus.Shooting; + } + } + + private void WaitingReloadUpdate(double delta) + { + timer += delta; + burstTimer += delta; + + if (burstTimer >= pattern.BurstRate) + { + _burstBullets = pattern.ShotsPerBurst; + _state = ShootStatus.Shooting; + } + } + + private void ShootingUpdate(double delta) + { + timer += delta; + burstTimer = 0; + Shoot(); + _burstBullets--; + + if (_burstBullets <= 0) + { + _state = ShootStatus.WaitingReload; + } + else + { + _state = ShootStatus.WaitingBurst; + } + } + + public void UpdatePattern(double delta) + { + switch (_state) + { + case ShootStatus.Idle: + case ShootStatus.Done: + return; + case ShootStatus.Shooting: + ShootingUpdate(delta); + break; + case ShootStatus.WaitingBurst: + WaitingBurstUpdate(delta); + break; + case ShootStatus.WaitingReload: + WaitingReloadUpdate(delta); + break; + } + + if (timer >= pattern.duration) + { + _state = ShootStatus.Done; + } + + // timer += delta; + // burstTimer += delta; + // //_burstRateTimer += delta; + // + // if (timer > pattern.duration) + // { + // return; + // } + // + // if (burstTimer < pattern.burstInterval) return; + // + // Shoot(); + // + // + // + // burstTimer = 0; + } + + private void Shoot() + { + float angleOffset = pattern._rotationOffset + (float)(pattern.rotationSpeed * timer); + + Vector2 direction = pattern.BulletResource.Direction; + + if (pattern._targetPlayer && GameManager.Instance.PlayerPosition.HasValue) + { + direction = (GameManager.Instance.PlayerPosition.Value - Parent.GlobalPosition).Normalized(); + } + + var bullet = pattern.BulletResource.MakeBullet(Parent.GlobalPosition, pattern.bulletCount, + pattern.spread, angleOffset); + bullet.Direction = direction; + + //spawner.SpawnBullet(MakeBullet(Boss.GlobalPosition, direction, angleOffset)); + spawner.SpawnBullet(bullet); + } + + + public bool IsComplete() + { + //return timer >= pattern.duration; + return _state is ShootStatus.Done; + } + + private enum ShootStatus + { + Idle, + Shooting, + WaitingBurst, + WaitingReload, + Done + } + } +} \ No newline at end of file diff --git a/Scripts/AttackPatterns/TargetedPattern.cs b/Scripts/AttackPatterns/TargetedPattern.cs index 8ac31b75..763acc46 100644 --- a/Scripts/AttackPatterns/TargetedPattern.cs +++ b/Scripts/AttackPatterns/TargetedPattern.cs @@ -19,34 +19,42 @@ public partial class TargetedPattern : AttackPattern [Export] private BulletOwner owner = BulletOwner.Enemy; [Export] private BulletCreationModifier modifier; - private double timer; - private double burstTimer; - private BulletSpawner spawner; - //private Node2D player; - - public override void Start(Node2D parent) + public override IPatternMachine MakeMachine(Node2D parent) { - - Parent = parent; - timer = 0; - burstTimer = 0; - spawner = Parent.GetNode("BulletSpawner"); - + return new TargetedPatternMachine(this, parent); } - public override void UpdatePattern(double delta) + public class TargetedPatternMachine(TargetedPattern pattern, Node2D parent) : IPatternMachine { - timer += delta; - burstTimer += delta; - if (timer < duration && burstTimer >= burstInterval && GameManager.Instance.PlayerPosition.HasValue) + public Node2D Parent => parent; + + private double timer; + private double burstTimer; + private BulletSpawner spawner; + //private Node2D player; + + public void Start() { - spawner.SpawnTargetedBullet(Parent.GlobalPosition, GameManager.Instance.PlayerPosition.Value, bulletSpeed, owner, BulletScene, bulletsPerShot, spread, modifier); + timer = 0; burstTimer = 0; + spawner = Parent.GetNode("BulletSpawner"); + + } + + public void UpdatePattern(double delta) + { + timer += delta; + burstTimer += delta; + if (timer < pattern.duration && burstTimer >= pattern.burstInterval && GameManager.Instance.PlayerPosition.HasValue) + { + spawner.SpawnTargetedBullet(Parent.GlobalPosition, GameManager.Instance.PlayerPosition.Value, pattern.bulletSpeed, pattern.owner, pattern.BulletScene, pattern.bulletsPerShot, pattern.spread, pattern.modifier); + burstTimer = 0; + } + } + + public bool IsComplete() + { + return timer >= pattern.duration; } } - - public override bool IsComplete() - { - return timer >= duration; - } } \ No newline at end of file diff --git a/Scripts/Resources/AttackPattern.cs b/Scripts/Resources/AttackPattern.cs index e691f0ed..24330459 100644 --- a/Scripts/Resources/AttackPattern.cs +++ b/Scripts/Resources/AttackPattern.cs @@ -1,4 +1,5 @@ using Cirno.Scripts.Actors; +using Cirno.Scripts.AttackPatterns; using Godot; namespace Cirno.Scripts.Resources; @@ -6,9 +7,10 @@ namespace Cirno.Scripts.Resources; [GlobalClass] public abstract partial class AttackPattern : Resource { - public Node2D Parent; + //public Node2D Parent; [Export] public bool WaitForCompletion = true; - public abstract void Start(Node2D parent); - public abstract void UpdatePattern(double delta); - public abstract bool IsComplete(); + //public abstract void Start(Node2D parent); + //public abstract void UpdatePattern(double delta); + //public abstract bool IsComplete(); + public abstract IPatternMachine MakeMachine(Node2D parent); } \ No newline at end of file diff --git a/Scripts/Resources/BossPhase.cs b/Scripts/Resources/BossPhase.cs index a548cccc..c420cdfc 100644 --- a/Scripts/Resources/BossPhase.cs +++ b/Scripts/Resources/BossPhase.cs @@ -1,4 +1,5 @@ using Cirno.Scripts.Actors; +using Cirno.Scripts.AttackPatterns; using Godot; using Godot.Collections; @@ -15,10 +16,14 @@ public partial class BossPhase : Resource private int currentPatternIndex = 0; private double patternTimer; + private IPatternMachine _patternMachine; + public void Start(Boss boss) { currentPatternIndex = 0; - Patterns[currentPatternIndex].Start(boss); + _patternMachine = Patterns[currentPatternIndex].MakeMachine(boss); + _patternMachine.Start(); + //Patterns[currentPatternIndex].Start(boss); } public void UpdatePhase(double delta) @@ -26,12 +31,15 @@ public partial class BossPhase : Resource patternTimer += delta; var currentPattern = Patterns[currentPatternIndex]; - currentPattern.UpdatePattern(delta); + _patternMachine.UpdatePattern(delta); - if (!currentPattern.WaitForCompletion || currentPattern.IsComplete()) + if (!currentPattern.WaitForCompletion || _patternMachine.IsComplete()) { currentPatternIndex = (currentPatternIndex + 1) % Patterns.Count; - Patterns[currentPatternIndex].Start(currentPattern.Parent); + var oldParent = _patternMachine.Parent; + _patternMachine = Patterns[currentPatternIndex].MakeMachine(oldParent); + _patternMachine.Start(); + //_patternMachine.Start(currentPattern.Parent); } } } \ No newline at end of file diff --git a/Scripts/Resources/BulletScript.cs b/Scripts/Resources/BulletScript.cs index 9c9c782b..f1c4d6aa 100644 --- a/Scripts/Resources/BulletScript.cs +++ b/Scripts/Resources/BulletScript.cs @@ -1,4 +1,5 @@ using System.Linq; +using Cirno.Scripts.AttackPatterns; using Godot; using Godot.Collections; @@ -9,33 +10,43 @@ public partial class BulletScript : Resource { [Export] public Array Patterns { get; private set; } - - private Node2D _parent; - private int _currentPatternIndex = 0; - private double _patternTimer; - - private AttackPattern CurrentPattern => Patterns[_currentPatternIndex]; - - public void Start(Node2D parent) + public BulletScriptMachine Make(Node2D parent) { - _parent = parent; - if (Patterns.Count == 0) return; - _currentPatternIndex = 0; - - CurrentPattern.Start(parent); + return new BulletScriptMachine(parent, Patterns); } - public void UpdatePhase(double delta) + public class BulletScriptMachine(Node2D parent, Array patterns) { - _patternTimer += delta; - - CurrentPattern.UpdatePattern(delta); + private int _currentPatternIndex = 0; + //private double _patternTimer; + + private AttackPattern CurrentPattern => patterns[_currentPatternIndex]; - if (!CurrentPattern.WaitForCompletion || CurrentPattern.IsComplete()) + private IPatternMachine _currentPatternMachine; + + public void Start() { - _currentPatternIndex = (_currentPatternIndex + 1) % Patterns.Count; - CurrentPattern.Start(_parent); + if (patterns.Count == 0) return; + _currentPatternIndex = 0; + + _currentPatternMachine = CurrentPattern.MakeMachine(parent); + _currentPatternMachine.Start(); + } + + public void UpdatePhase(double delta) + { + //_patternTimer += delta; + + _currentPatternMachine.UpdatePattern(delta); + //CurrentPattern.UpdatePattern(delta); + + if (!CurrentPattern.WaitForCompletion || _currentPatternMachine.IsComplete()) + { + _currentPatternIndex = (_currentPatternIndex + 1) % patterns.Count; + _currentPatternMachine = CurrentPattern.MakeMachine(parent); + _currentPatternMachine.Start(); + } } } } \ No newline at end of file diff --git a/Scripts/Resources/PatternGroup.cs b/Scripts/Resources/PatternGroup.cs index d9a1dd89..5298c0ca 100644 --- a/Scripts/Resources/PatternGroup.cs +++ b/Scripts/Resources/PatternGroup.cs @@ -1,6 +1,7 @@ using Godot; using System.Collections.Generic; using Cirno.Scripts.Actors; +using Cirno.Scripts.AttackPatterns; using Godot.Collections; namespace Cirno.Scripts.Resources; @@ -9,34 +10,47 @@ namespace Cirno.Scripts.Resources; public partial class PatternGroup : AttackPattern { [Export] private Array patterns; - private int currentPatternIndex = 0; - - public override void Start(Node2D parent) + + public override IPatternMachine MakeMachine(Node2D parent) { - Parent = parent; - currentPatternIndex = 0; - patterns[currentPatternIndex].Start(parent); + return new PatternGroupMachine(this, parent); } - public override void UpdatePattern(double delta) + public class PatternGroupMachine(PatternGroup pattern, Node2D parent) : IPatternMachine { - if (currentPatternIndex < patterns.Count) + public Node2D Parent => parent; + private int currentPatternIndex = 0; + + IPatternMachine _patternMachine; + + public void Start() { - patterns[currentPatternIndex].UpdatePattern(delta); + currentPatternIndex = 0; + _patternMachine = pattern.patterns[currentPatternIndex].MakeMachine(parent); + _patternMachine.Start(); + } - if (!patterns[currentPatternIndex].WaitForCompletion || patterns[currentPatternIndex].IsComplete()) + public void UpdatePattern(double delta) + { + if (currentPatternIndex < pattern.patterns.Count) { - currentPatternIndex++; - if (currentPatternIndex < patterns.Count) + _patternMachine.UpdatePattern(delta); + + if (!pattern.patterns[currentPatternIndex].WaitForCompletion || _patternMachine.IsComplete()) { - patterns[currentPatternIndex].Start(Parent); + currentPatternIndex++; + if (currentPatternIndex < pattern.patterns.Count) + { + _patternMachine.Start(); + } } } } - } - public override bool IsComplete() - { - return currentPatternIndex >= patterns.Count; + public bool IsComplete() + { + return currentPatternIndex >= pattern.patterns.Count; + } + } } diff --git a/Scripts/Resources/SimpleMovementPattern.cs b/Scripts/Resources/SimpleMovementPattern.cs index f725ca78..75b7ea9e 100644 --- a/Scripts/Resources/SimpleMovementPattern.cs +++ b/Scripts/Resources/SimpleMovementPattern.cs @@ -12,38 +12,47 @@ public partial class SimpleMovementPattern : AttackPattern [Export] private Tween.TransitionType transitionType = Tween.TransitionType.Linear; [Export] private Tween.EaseType easeType = Tween.EaseType.InOut; - private Tween tween; - private bool isComplete = false; - - protected IScriptHost Boss; - - public override void Start(Node2D parent) + public override IPatternMachine MakeMachine(Node2D parent) { - Parent = parent; - if (parent is not IScriptHost boss) - return; - - Boss = boss; - tween = Parent.CreateTween(); - isComplete = false; - - Vector2 targetPosition = (Boss?.HomePosition ?? Parent.GlobalPosition) + relativeTargetPosition; - - boss.ChangeSpriteDirection(-(Parent.GlobalPosition - targetPosition)); - tween.TweenProperty(Parent, "global_position", targetPosition, moveDuration) - .SetTrans(transitionType) - .SetEase(easeType) - .Finished += () => - { - isComplete = true; - boss.ChangeSpriteDirection(Vector2.Zero); - }; + return new SimpleMovementPatternMachine(this, parent); } - public override void UpdatePattern(double delta) { } - - public override bool IsComplete() + public class SimpleMovementPatternMachine(SimpleMovementPattern pattern, Node2D parent) : IPatternMachine { - return isComplete; + public Node2D Parent => parent; + + private Tween tween; + private bool isComplete = false; + + protected IScriptHost Boss; + + public void Start() + { + if (parent is not IScriptHost boss) + return; + + Boss = boss; + tween = Parent.CreateTween(); + isComplete = false; + + Vector2 targetPosition = (Boss?.HomePosition ?? Parent.GlobalPosition) + pattern.relativeTargetPosition; + + boss.ChangeSpriteDirection(-(Parent.GlobalPosition - targetPosition)); + tween.TweenProperty(Parent, "global_position", targetPosition, pattern.moveDuration) + .SetTrans(pattern.transitionType) + .SetEase(pattern.easeType) + .Finished += () => + { + isComplete = true; + boss.ChangeSpriteDirection(Vector2.Zero); + }; + } + + public void UpdatePattern(double delta) { } + + public bool IsComplete() + { + return isComplete; + } } }