🐛 Fixed fighters keep fighting at 0 hp #24

Merged
Jonathan merged 1 commits from bug/enemy_die into develop 2 months ago

@ -192,6 +192,8 @@ public partial class FightHappening : Node
HappeningData.actionStaging = null;
HappeningData.fightersEnterStaging = null;
RemoveDeadFighters();
if (!FightWorld.Instance.allyFighters.IsAlive())
{
ChangeState(FightState.EnemyWin);
@ -346,6 +348,17 @@ public partial class FightHappening : Node
GD.Print("Vesna has been revived. This is for the current prototype only");
}
private void RemoveDeadFighters()
{
foreach (var f in HappeningData.fighterTurn)
{
if (f.IsDead())
{
HappeningData.fighterTurn.Remove(f);
Review

Ich gehe zwar davon aus, dass du das getestet hast und es keine Fehler wirft, aber zur Sicherheit, weil ich mich gewundert habe: Wenn fighterTurn ein IEnumerable ist und du in der foreach-Schleife etwas daraus entfernst, kann das nicht zu exceptions führen? Hätte ich jetzt erwartet.

Ich gehe zwar davon aus, dass du das getestet hast und es keine Fehler wirft, aber zur Sicherheit, weil ich mich gewundert habe: Wenn fighterTurn ein IEnumerable ist und du in der foreach-Schleife etwas daraus entfernst, kann das nicht zu exceptions führen? Hätte ich jetzt erwartet.
Review

Ist auch oft so. Deshalb habe ich GetEnumerator so implementiert, dass er erst eine List aus den Einträgen erstellt und dann den Enumerator der Liste zurückgibt

Ist auch oft so. Deshalb habe ich `GetEnumerator` so implementiert, dass er erst eine `List` aus den Einträgen erstellt und dann den Enumerator der Liste zurückgibt
}
}
}
#endregion // Game Logic
#region Utility

@ -1,9 +1,12 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace Babushka.scripts.CSharp.Common.Fight;
public class FighterTurn
public class FighterTurn : IEnumerable<FightWorld.Fighter>
{
private class Node
{
@ -13,7 +16,8 @@ public class FighterTurn
private Node? _currentNode;
public FightWorld.Fighter Current => _currentNode?.fighter ?? throw new InvalidOperationException("No current fighter");
public FightWorld.Fighter Current =>
_currentNode?.fighter ?? throw new InvalidOperationException("No current fighter");
public void Next()
{
@ -94,4 +98,26 @@ public class FighterTurn
return false;
}
public IEnumerator<FightWorld.Fighter> GetEnumerator()
{
if (_currentNode == null) return Enumerable.Empty<FightWorld.Fighter>().GetEnumerator();
Review

Sehe ich da was falsch oder ist das ein Loop?

Wenn currentnode == null, dann wird Enumerable.GetEnumerator ( Zeile 119) und darin dann wieder GetEnumerator (Zeile 102) aufgerufen und so weiter. Oder ist das noch ein anderer Overload, der da aufgerufen wird?

Again, ich gehe schon davon aus, dass du das getestet hast und ich da irgendwas übersehe, aber ich frage lieber zur Sicherheit immer nach.

Sehe ich da was falsch oder ist das ein Loop? Wenn currentnode == null, dann wird Enumerable.GetEnumerator ( Zeile 119) und darin dann wieder GetEnumerator (Zeile 102) aufgerufen und so weiter. Oder ist das noch ein anderer Overload, der da aufgerufen wird? Again, ich gehe schon davon aus, dass du das getestet hast und ich da irgendwas übersehe, aber ich frage lieber zur Sicherheit immer nach.
Review

Hier wird Enumerable.Empty<...>.GetEnumerator() aufgerufen. Das Empty ist nen Statischer member von der Enumerable Klasse. (Nicht IEnumerable)

Hier wird `Enumerable.`**`Empty<...>`**`.GetEnumerator()` aufgerufen. Das `Empty` ist nen Statischer member von der `Enumerable` Klasse. (Nicht `IEnumerable`)
var list = new List<FightWorld.Fighter>();
var n = _currentNode;
while (true)
{
list.Add(n.fighter);
if (n.next == _currentNode)
break;
n = n.next;
}
return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Loading…
Cancel
Save