Files

97 lines
2.3 KiB
C#
Raw Permalink Normal View History

2025-10-07 15:29:39 +02:00
using System;
using System.Diagnostics;
2025-09-21 14:54:55 +02:00
namespace Babushka.scripts.CSharp.Common.Fight;
public class FighterTurn
2025-09-21 14:54:55 +02:00
{
private class Node
{
2025-10-07 15:29:39 +02:00
public required Node next;
public required FightWorld.Fighter fighter;
2025-09-21 14:54:55 +02:00
}
2025-10-07 15:29:39 +02:00
private Node? _currentNode;
2025-09-21 14:54:55 +02:00
2025-10-07 15:29:39 +02:00
public FightWorld.Fighter Current => _currentNode?.fighter ?? throw new InvalidOperationException("No current fighter");
2025-09-21 14:54:55 +02:00
public void Next()
{
2025-10-07 15:29:39 +02:00
Debug.Assert(_currentNode != null, "currentNode!=null");
_currentNode = _currentNode.next;
2025-09-21 14:54:55 +02:00
}
public FightWorld.Fighter PeekNext()
{
2025-10-07 15:29:39 +02:00
Debug.Assert(_currentNode != null, "currentNode!=null");
return _currentNode.next.fighter;
2025-09-21 14:54:55 +02:00
}
public void AddAsLast(FightWorld.Fighter value)
{
// if first node
2025-10-07 15:29:39 +02:00
if (_currentNode == null)
2025-09-21 14:54:55 +02:00
{
2025-10-07 15:29:39 +02:00
_currentNode = new Node { fighter = value, next = null! };
_currentNode.next = _currentNode;
2025-09-21 14:54:55 +02:00
return;
}
2025-10-07 15:29:39 +02:00
var newNode = new Node { fighter = value, next = _currentNode };
var node = _currentNode;
while (node.next != _currentNode)
2025-09-21 14:54:55 +02:00
{
node = node.next;
}
node.next = newNode;
}
public void AddAsNext(FightWorld.Fighter value)
{
// if first node
2025-10-07 15:29:39 +02:00
if (_currentNode == null)
2025-09-21 14:54:55 +02:00
{
AddAsLast(value);
return;
}
2025-10-07 15:29:39 +02:00
var newNode = new Node { fighter = value, next = _currentNode.next };
_currentNode.next = newNode;
2025-09-21 14:54:55 +02:00
}
public bool Remove(FightWorld.Fighter value)
{
2025-10-07 15:29:39 +02:00
if (_currentNode == null) return false;
2025-09-21 14:54:55 +02:00
// if only one node
2025-10-07 15:29:39 +02:00
if (_currentNode.next == _currentNode)
2025-09-21 14:54:55 +02:00
{
2025-10-07 15:29:39 +02:00
if (_currentNode.fighter == value)
2025-09-21 14:54:55 +02:00
{
2025-10-07 15:29:39 +02:00
_currentNode = null;
2025-09-21 14:54:55 +02:00
return true;
}
return false;
}
2025-10-07 15:29:39 +02:00
var node = _currentNode;
2025-09-21 14:54:55 +02:00
do
{
// next is the fighter to remove
if (node.next.fighter == value)
{
// if removing current, keep current
2025-10-07 15:29:39 +02:00
// it will be implicitly deleted by loss of reference on the next Next() call
2025-09-21 14:54:55 +02:00
node.next = node.next.next;
return true;
}
node = node.next;
2025-10-07 15:29:39 +02:00
} while (node != _currentNode);
2025-09-21 14:54:55 +02:00
return false;
}
}