Beispiel #1
0
 public void AddMovementFinishedEntry(CMovementFinishedEntry movementFinishedEntry)
 {
     lock (_movementFinishedEntries)
     {
         _movementFinishedEntries.Add(movementFinishedEntry);
     }
 }
Beispiel #2
0
        public CBoardRecordData GetBoardRecordData(CBoardSynchronizer board)
        {
            List <CSerializedRecordAtom> record = new List <CSerializedRecordAtom>();
            DateTime previousEntryTime          = default;

            lock (_entries)
            {
                foreach (CRecordEntry recordEntry in _entries)
                {
                    if (previousEntryTime != default)
                    {
                        AddWaitData(recordEntry);
                    }
                    previousEntryTime = recordEntry.EntryCreated;
                    switch (recordEntry)
                    {
                    case CMovementBeganEntry movementBeganEntry:
                        AddMovementData(movementBeganEntry);
                        break;

                    case CPieceRemovedEntry pieceRemovedEntry:
                        AddPieceRemovedData(pieceRemovedEntry);
                        break;

                    case CPawnTransformedEntry pawnTransformedEntry:
                        AddPawnTransformedData(pawnTransformedEntry);
                        break;

                    default:
                        throw new ArgumentException($"Unknown type: {recordEntry.GetType()}");
                    }
                }
            }

            void AddMovementData(CMovementBeganEntry current)
            {
                lock (_movementFinishedEntries)
                {
                    CMovementFinishedEntry correspondingMovementFinishedEntry =
                        _movementFinishedEntries.FirstOrDefault(entry => entry.PieceId == current.PieceId && entry.EntryCreated > current.EntryCreated);
                    CPoint        toPoint      = correspondingMovementFinishedEntry?.To ?? board.GetPieceById(current.PieceId).Position;
                    CMovementData movementData = new CMovementData(current.PieceId, current.From, toPoint);
                    record.Add(new CSerializedRecordAtom(EAtomType.Movement, JsonConvert.SerializeObject(movementData)));
                }
            }

            void AddPieceRemovedData(CPieceRemovedEntry current)
            {
                record.Add(new CSerializedRecordAtom(EAtomType.PieceRemoved,
                                                     JsonConvert.SerializeObject(new CPieceRemovedData(current.PieceId))));
            }

            void AddPawnTransformedData(CPawnTransformedEntry current)
            {
                record.Add(new CSerializedRecordAtom(EAtomType.PawnTransformed,
                                                     JsonConvert.SerializeObject(new CPawnTransformedData(current.PieceId, current.IsWhite))));
            }

            void AddWaitData(CRecordEntry current)
            {
                record.Add(new CSerializedRecordAtom(EAtomType.Wait,
                                                     JsonConvert.SerializeObject(new CWaitData((current.EntryCreated - previousEntryTime).Duration()))));
            }

            return(new CBoardRecordData(record));
        }