11using System ;
2+ using System . Linq ;
23using FunkEngine ;
34using Godot ;
45using Melanchall . DryWetMidi . Interaction ;
@@ -12,7 +13,10 @@ public partial class BattleDirector : Node2D
1213 public static readonly string LoadPath = "res://Scenes/BattleDirector/BattleScene.tscn" ;
1314
1415 public PlayerPuppet Player ;
15- public EnemyPuppet Enemy ;
16+ private EnemyPuppet [ ] _enemies ;
17+
18+ [ Export ]
19+ public Marker2D [ ] PuppetMarkers = new Marker2D [ 4 ] ; //[0] is always player
1620
1721 [ Export ]
1822 private Conductor CD ;
@@ -49,14 +53,31 @@ private bool PlayerAddNote(ArrowType type, Beat beat)
4953 return true ;
5054 }
5155
52- public PuppetTemplate GetTarget ( Note note )
56+ public PuppetTemplate [ ] GetTargets ( Note note )
57+ {
58+ if ( ! note . IsPlayerNote ( ) )
59+ return [ Player ] ;
60+ switch ( note . TargetType )
61+ {
62+ case Targetting . First :
63+ if ( GetFirstEnemy ( ) != null )
64+ return [ GetFirstEnemy ( ) ] ;
65+ return [ ] ;
66+ case Targetting . All :
67+ return _enemies . Where ( x => x . GetCurrentHealth ( ) > 0 ) . ToArray ( ) ;
68+ }
69+ return null ;
70+ }
71+
72+ public PuppetTemplate GetFirstEnemy ( )
5373 {
54- if ( note . Owner == Player )
74+ foreach ( var enemy in _enemies )
5575 {
56- return Enemy ;
76+ if ( enemy . GetCurrentHealth ( ) > 0 )
77+ return enemy ;
5778 }
5879
59- return Player ;
80+ return null ;
6081 }
6182 #endregion
6283
@@ -99,7 +120,7 @@ public override void _Ready()
99120 private void InitPlayer ( )
100121 {
101122 Player = GD . Load < PackedScene > ( PlayerPuppet . LoadPath ) . Instantiate < PlayerPuppet > ( ) ;
102- AddChild ( Player ) ;
123+ PuppetMarkers [ 0 ] . AddChild ( Player ) ;
103124 Player . Defeated += CheckBattleStatus ;
104125 EventizeRelics ( ) ;
105126 NPB . Setup ( StageProducer . PlayerStats ) ;
@@ -108,11 +129,19 @@ private void InitPlayer()
108129 private void InitEnemies ( )
109130 {
110131 //TODO: Refine
111- Enemy = GD . Load < PackedScene > ( StageProducer . Config . EnemyScenePath )
112- . Instantiate < EnemyPuppet > ( ) ;
113- AddChild ( Enemy ) ;
114- Enemy . Defeated += CheckBattleStatus ;
115- AddEnemyEffects ( ) ;
132+ _enemies = new EnemyPuppet [ StageProducer . Config . EnemyScenePath . Length ] ;
133+ for ( int i = 0 ; i < StageProducer . Config . EnemyScenePath . Length ; i ++ )
134+ {
135+ EnemyPuppet enemy = GD . Load < PackedScene > ( StageProducer . Config . EnemyScenePath [ 0 ] )
136+ . Instantiate < EnemyPuppet > ( ) ;
137+ if ( _enemies . Length == 1 )
138+ PuppetMarkers [ 2 ] . AddChild ( enemy ) ;
139+ else
140+ PuppetMarkers [ i + 1 ] . AddChild ( enemy ) ;
141+ enemy . Defeated += CheckBattleStatus ;
142+ _enemies [ i ] = enemy ;
143+ AddEnemyEffects ( enemy ) ;
144+ }
116145 }
117146
118147 public override void _Process ( double delta )
@@ -207,10 +236,15 @@ private void CheckBattleStatus(PuppetTemplate puppet) //Called when a puppet die
207236 OnBattleLost ( ) ;
208237 return ;
209238 }
210- if ( puppet == Enemy )
239+ if ( puppet is EnemyPuppet && IsBattleWon ( ) )
211240 OnBattleWon ( ) ; //will have to adjust this to account for when we have multiple enemies at once
212241 }
213242
243+ private bool IsBattleWon ( )
244+ {
245+ return GetFirstEnemy ( ) == null ;
246+ }
247+
214248 private void OnBattleWon ( )
215249 {
216250 Audio . StreamPaused = true ;
@@ -258,9 +292,9 @@ private void AddEvent(IBattleEvent bEvent)
258292 }
259293 }
260294
261- private void AddEnemyEffects ( )
295+ private void AddEnemyEffects ( EnemyPuppet enemy )
262296 {
263- foreach ( var effect in Enemy . GetBattleEvents ( ) )
297+ foreach ( var effect in enemy . GetBattleEvents ( ) )
264298 {
265299 AddEvent ( effect ) ;
266300 }
@@ -347,6 +381,9 @@ public void InvokeChartLoop(int incLoop)
347381
348382 private void DebugKillEnemy ( )
349383 {
350- Enemy . TakeDamage ( 1000 ) ;
384+ foreach ( EnemyPuppet enemy in _enemies )
385+ {
386+ enemy . TakeDamage ( 1000 ) ;
387+ }
351388 }
352389}
0 commit comments