home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 10.ddi / CHESS.ZIP / MOVELIST.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-10-27  |  3.3 KB  |  156 lines

  1. {************************************************}
  2. {                                                }
  3. {   Chess Demo                                   }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. unit MoveList;
  9.  
  10. interface
  11.  
  12. {$IFDEF DPMI}
  13. uses Objects, ChessDLL;
  14. {$ELSE}
  15. {$IFDEF WINDOWS}
  16. uses Objects, ChessDLL;
  17. {$ELSE}
  18. uses Objects, ChessInf;
  19. {$ENDIF}
  20. {$ENDIF}
  21.  
  22. type
  23.   PMoveList = ^TMoveList;
  24.   TMoveList = object(TCollection)
  25.     UndoPos: Integer;
  26.     constructor Init(ALimit, ADelta: Integer);
  27.     constructor Load(var S: TStream);
  28.     procedure AddMove(Move: TMove);
  29.     procedure FreeItem(Item: Pointer); virtual;
  30.     function GetItem(var S: TStream): Pointer; virtual;
  31.     function GetNumMoves: Integer;
  32.     procedure Purge;
  33.     procedure PutItem(var S: TStream; Item: Pointer); virtual;
  34.     procedure Redo(var Move: TMove);
  35.     function RedoAvail: Boolean;
  36.     procedure Store(var S: TStream);
  37.     procedure Undo(var Move: TMove);
  38.     function UndoAvail: Boolean;
  39.   end;
  40.  
  41. const
  42.   RMoveList: TStreamRec = (
  43.     ObjType: 5000;
  44.     VmtLink: Ofs(TypeOf(TMoveList)^);
  45.     Load:    @TMoveList.Load;
  46.     Store:   @TMoveList.Store);
  47.  
  48. function NewMove(Move: TMove): PMove;
  49. procedure DisposeMove(Move: PMove);
  50.  
  51. implementation
  52.  
  53. constructor TMoveList.Init(ALimit, ADelta: Integer);
  54. begin
  55.   inherited Init(ALimit, ADelta);
  56.   UndoPos := 0;
  57. end;
  58.  
  59. constructor TMoveList.Load(var S: TStream);
  60. begin
  61.   inherited Load(S);
  62.   S.Read(UndoPos, SizeOf(UndoPos));
  63. end;
  64.  
  65. procedure TMoveList.AddMove(Move: TMove);
  66. var
  67.   I: Integer;
  68. begin
  69.   if UndoPos < Count - 1 then
  70.     while UndoPos < Count - 1 do
  71.       AtFree(UndoPos + 1);
  72.   AtInsert(Count, NewMove(Move));
  73.   UndoPos := Count - 1;
  74. end;
  75.  
  76. procedure TMoveList.FreeItem(Item: Pointer);
  77. begin
  78.   DisposeMove(PMove(Item));
  79. end;
  80.  
  81. function TMoveList.GetItem(var S: TStream): Pointer;
  82. var
  83.   Move: TMove;
  84. begin
  85.   S.Read(Move, SizeOf(Move));
  86.   GetItem := NewMove(Move);
  87. end;
  88.  
  89. function TMoveList.GetNumMoves: Integer;
  90. begin
  91.   GetNumMoves := (UndoPos + 1) div 2;
  92. end;
  93.  
  94. procedure TMoveList.Purge;
  95. begin
  96.   FreeAll;
  97.   UndoPos := 0;
  98. end;
  99.  
  100. procedure TMoveList.PutItem(var S: TStream; Item: Pointer);
  101. begin
  102.   S.Write(PMove(Item)^, SizeOf(TMove));
  103. end;
  104.  
  105. procedure TMoveList.Redo(var Move: TMove);
  106. begin
  107.   if RedoAvail then
  108.   begin
  109.     Inc(UndoPos);
  110.     Move := PMove(At(UndoPos))^;
  111.   end
  112.   else FillChar(Move, SizeOf(Move), 0);
  113. end;
  114.  
  115. function TMoveList.RedoAvail: Boolean;
  116. begin
  117.   RedoAvail := (Count > 0) and (UndoPos < Count - 1);
  118. end;
  119.  
  120. procedure TMoveList.Store(var S: TStream);
  121. begin
  122.   inherited Store(S);
  123.   S.Write(UndoPos, SizeOf(UndoPos));
  124. end;
  125.  
  126. procedure TMoveList.Undo(var Move: TMove);
  127. begin
  128.   if UndoAvail then
  129.   begin
  130.     Move := PMove(At(UndoPos))^;
  131.     Dec(UndoPos);
  132.   end
  133.   else FillChar(Move, SizeOf(Move), 0);
  134. end;
  135.  
  136. function TMoveList.UndoAvail: Boolean;
  137. begin
  138.   UndoAvail := (Count > 0) and (UndoPos >= 0);
  139. end;
  140.  
  141. function NewMove(Move: TMove): PMove;
  142. var
  143.   AMove: PMove;
  144. begin
  145.   GetMem(AMove, SizeOf(TMove));
  146.   AMove^ := Move;
  147.   NewMove := AMove;
  148. end;
  149.  
  150. procedure DisposeMove(Move: PMove);
  151. begin
  152.   FreeMem(Move, SizeOf(TMove));
  153. end;
  154.  
  155. end.
  156.