- New turn order: produce -> transfer -> move -> collision resolution - Collisions now destroy weaker pieces (status > level > mutual destruction) instead of halting the simulation. SimPhase.Collision removed. - Add piece Level property (all level 1 in proto, prepared for future) - Production fires every turn (interval concept removed), buffer = Amount (default 1, future 2-4), leftovers overwritten each turn - Transfer tiebreaker: status > level > clockwise direction (alternating even/odd turns in y-up coords), replaces distance-to-production - Demands always accept matching cargo even when already satisfied - TurnNumber added to all turn events for animation grouping - Simultaneous animations: produce flash, cargo slide, parallel piece moves - Camera centering fix + middle-click pan - GDD updated with new rules + lore section added Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
44 lines
1.9 KiB
C#
44 lines
1.9 KiB
C#
namespace Chessistics.Engine.Model;
|
|
|
|
public class BoardSnapshot
|
|
{
|
|
public int Width { get; }
|
|
public int Height { get; }
|
|
public CellType[,] Grid { get; }
|
|
public IReadOnlyList<ProductionSnapshot> Productions { get; }
|
|
public IReadOnlyList<DemandSnapshot> Demands { get; }
|
|
public IReadOnlyList<PieceSnapshot> Pieces { get; }
|
|
public SimPhase Phase { get; }
|
|
public int TurnNumber { get; }
|
|
public IReadOnlyDictionary<PieceKind, int> RemainingStock { get; }
|
|
|
|
public BoardSnapshot(BoardState state)
|
|
{
|
|
Width = state.Width;
|
|
Height = state.Height;
|
|
Phase = state.Phase;
|
|
TurnNumber = state.TurnNumber;
|
|
|
|
// Deep copy grid
|
|
Grid = new CellType[Width, Height];
|
|
Array.Copy(state.Grid, Grid, state.Grid.Length);
|
|
|
|
Productions = state.Productions.Values
|
|
.Select(p => new ProductionSnapshot(p.Position, p.Name, p.Cargo, p.Amount, state.ProductionBuffers[p.Position]))
|
|
.ToList();
|
|
|
|
Demands = state.Demands.Values
|
|
.Select(d => new DemandSnapshot(d.Position, d.Name, d.Cargo, d.Required, d.Deadline, d.ReceivedCount, d.IsSatisfied))
|
|
.ToList();
|
|
|
|
Pieces = state.Pieces
|
|
.Select(p => new PieceSnapshot(p.Id, p.Kind, p.Level, p.StartCell, p.EndCell, p.CurrentCell, p.Cargo, p.CargoFilter, p.SocialStatus))
|
|
.ToList();
|
|
|
|
RemainingStock = new Dictionary<PieceKind, int>(state.RemainingStock);
|
|
}
|
|
}
|
|
|
|
public record ProductionSnapshot(Coords Position, string Name, CargoType Cargo, int Amount, int BufferCount);
|
|
public record DemandSnapshot(Coords Position, string Name, CargoType Cargo, int Required, int Deadline, int ReceivedCount, bool IsSatisfied);
|
|
public record PieceSnapshot(int Id, PieceKind Kind, int Level, Coords StartCell, Coords EndCell, Coords CurrentCell, CargoType? Cargo, CargoType? CargoFilter, int SocialStatus);
|