home *** CD-ROM | disk | FTP | other *** search
- unit GameTask;
-
- {$W-}
-
- interface
-
- const
- tmFindMove = 1;
- tmThinkAhead = 2;
- tmResume = 3;
- tmComplete = 4;
- tmEnterMove = 5;
- tmTimeExpired = 6;
- tmTerminate = $FFFF;
-
- procedure DoGameTask;
-
- implementation
-
- uses GameRec, LMoves, LMoveGen, LOpenLib, LEval, TaskMgr;
-
- procedure EnterOppMove;
- begin
- AdjustMoves;
- EnterKeyMove;
- StoreMoves;
- Exclude(CC.State, MovePending);
- end;
-
- procedure RecordFindMove;
- begin
- with CC do
- begin
- MovTab[0] := MainLine[0]; { Copy the MainLine to HintLine }
- Move(MainLine[1], HintLine[0], Sizeof(MainLine) - Sizeof(MoveType));
- HintEvalu := MainEvalu;
- if MovTab[0].MovPiece = Empty then
- begin
- HintLine[0] := ZeroMove; { No Possible Move }
- Include(State, GameOver);
- Exit;
- end; { if }
-
- EnterMove(MovTab[Depth + 1]);
- StoreMoves;
- PlayerMove := ZeroMove;
- Exclude(State, Analysis);
- end;
- end;
-
- procedure StartMove;
- { The program moves }
- var
- Result: Integer;
- Dep: DepthType;
- begin
- Include(CC.State, Analysis);
- Exclude(CC.State, OppAnalysis);
-
- { Wait for a Think }
- repeat until Message(tmComplete) = tmResume;
-
- AdjustMoves;
- CalcLibNo; { Try to find a Move in }
- with CC do { the opening library }
- begin
- Depth := 0;
- if LibNo > 0 then
- begin
- {! OpeningLibMsg;}
- Include(State, InLibrary);
- FindOpeningMove;
- end
- else
- begin
- Exclude(State, InLibrary);
- FindMove(MaxLevel); { Perform the Search }
- end;
- Depth := -1;
- RecordFindMove;
- end; { with }
- end; { StartMove }
-
- procedure ThinkAhead;
- begin
- { Perform analysis in the opponents time of reflection.
- The program assumes that the Opponent will Perform the
- Hint Move, and starts analysing On it counter Move }
-
- with CC do
- begin
- if HintLine[0].MovPiece = Empty then
- Exit;
-
- Exclude(State, Analysis);
- Include(State, OppAnalysis);
-
- { Wait for a Think }
- repeat until Message(tmComplete) = tmResume;
-
- AdjustMoves; { Setup surroundings as if the }
- MovTab[Depth + 1] := HintLine[0]; { Opponent had performed }
- MakeMove(MovTab[Depth + 1]); { the hint move }
- StoreMoves;
- AdjustMoves;
- Depth := 0; { Analyse until something is }
- FindMove(MaxLevel); { entered from the keyboard }
-
- Depth := -1;
- Exclude(State, OppAnalysis);
-
- if MovePending in State then
- begin
- { Here if we received a tmEnterMove and the opponent did not make
- the hint move. Find the move the old fashioned way }
- TakeBackMove(MovTab[Depth]);
-
- { Enter opponents move }
- EnterOppMove;
-
- { Only legal message to receive now is tmFindMove }
- repeat until Message(tmFindMove) = tmFindMove;
-
- { Start the move }
- StartMove;
- end
- else
- RecordFindMove;
- end;
- end; { ThinkAwhile }
-
- { Game background task's main loop }
-
- procedure DoGameTask;
- begin
- repeat
- case Message(tmComplete) of
- tmEnterMove: EnterOppMove;
- tmFindMove: StartMove;
- tmThinkAhead: ThinkAhead;
- tmTerminate: Exit;
- end;
- until False;
- end;
-
- end.