⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 noterm.pas

📁 类似文明的游戏源代码。
💻 PAS
字号:
{$INCLUDE switches}

unit NoTerm;

interface

uses
  ScreenTools,Protocol,

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  ButtonBase, ButtonB;

type
  TNoTermDlg = class(TForm)
    QuitBtn: TButtonB;
    GoBtn: TButtonB;
    procedure GoBtnClick(Sender: TObject);
    procedure QuitBtnClick(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: word;
      Shift: TShiftState);
    procedure FormShow(Sender: TObject);
  public
    procedure Client(Command, Player: integer; var Data);
  private
    me, Active, ToldAlive, Round: integer;
    G: TNewGameData;
    Server: TServerCall;
    Shade, State: TBitmap;
    WinStat, ExtStat: array[0..nPl-1] of integer;
    Mode: (Stop, Stopped, Running, Quit);
    procedure NewStat;
    procedure EndPlaying;
    procedure ShowActive(p: integer; Active: boolean);
    procedure ShowYear;
    procedure OnEraseBkgnd(var m:TMessage); message WM_ERASEBKGND;
    procedure OnHitTest(var Msg:TMessage); message WM_NCHITTEST;
  end;

var
  NoTermDlg: TNoTermDlg;

procedure Client(Command,Player:integer;var Data); stdcall;

implementation

uses OuterCore, log, Start, Messg;

{$R *.DFM}

const
nPlOffered=9;
x0Brain=109; y0Brain=124;
dxBrain=80; dyBrain=80;
xBrain: array[0..nPlOffered-1] of integer =
  (x0Brain,x0Brain,x0Brain+dxBrain,x0Brain+dxBrain,x0Brain+dxBrain,x0Brain,
  x0Brain-dxBrain,x0Brain-dxBrain,x0Brain-dxBrain);
yBrain: array[0..nPlOffered-1] of integer =
  (y0Brain,y0Brain-dyBrain,y0Brain-dyBrain,y0Brain,y0Brain+dyBrain,
  y0Brain+dyBrain,y0Brain+dyBrain,y0Brain,y0Brain-dyBrain);
xActive: array[0..nPlOffered-1] of integer = (0,0,24,34,24,0,-24,-34,-24);
yActive: array[0..nPlOffered-1] of integer = (0,-34,-24,0,24,34,24,0,-24);

var
FormsCreated: boolean;

procedure TNoTermDlg.OnEraseBkgnd(var m:TMessage);
begin
end;

procedure TNoTermDlg.OnHitTest(var Msg:TMessage);
begin
if (Msg.LParamHi>=Top+36) or (Msg.LParamLo>=Left+QuitBtn.Left)
  {or (Msg.LParamLo<Left+StatBtn.Left+StatBtn.Width)} then Msg.result:=HTCLIENT
else Msg.result:=HTCAPTION
end;

procedure TNoTermDlg.FormCreate(Sender: TObject);
begin
Left:=Screen.Width-Width-8; Top:=8;
Caption:=Phrases.Lookup('AIT');
Canvas.Brush.Style:=bsClear;
Canvas.Font.Assign(UniFont[ftSmall]);
InitButtons(self);
end;

procedure TNoTermDlg.NewStat;
begin
Round:=0;
FillChar(WinStat,SizeOf(WinStat),0);
FillChar(ExtStat,SizeOf(ExtStat),0);
Mode:=Stop;
end;

procedure TNoTermDlg.EndPlaying;
var
EndCommand: integer;
begin
NewStat;
if G.RO[me].Turn>0 then with MessgDlg do
  begin
  MessgText:=Phrases.Lookup('ENDTOUR');
  Kind:=mkYesNo;
  ShowModal;
  if ModalResult=mrIgnore then EndCommand:=sResign
  else EndCommand:=sBreak
  end
else EndCommand:=sResign;
Server(EndCommand,me,0,nil^)
end;

procedure TNoTermDlg.ShowActive(p: integer; Active: boolean);
begin
if p>=nPlOffered then exit;
BitBlt(Canvas.Handle,x0Brain+28+xActive[p],y0Brain+28+yActive[p],8,8,
  GrExt[HGrSystem].Mask.Canvas.Handle,81+9*Byte(Active),16,SRCAND);
BitBlt(Canvas.Handle,x0Brain+28+xActive[p],y0Brain+28+yActive[p],8,8,
  GrExt[HGrSystem].Data.Canvas.Handle,81+9*Byte(Active),16,SRCPAINT);
end;

procedure TNoTermDlg.ShowYear;
begin
Fill(State.Canvas,0,0,192,20,64,290,StartTex);
RisedTextOut(State.Canvas,0,0,Format(Phrases.Lookup('AIT_ROUND'),[Round])+' '
  +TurnToString(G.RO[me].Turn));
BitBlt(Canvas.Handle,64,290,192,20,State.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TNoTermDlg.Client(Command, Player: integer; var Data);
var
x,y,p: integer;
r: TRect;
begin
case Command of
  cDebugMessage:
    LogDlg.Add(Player, G.RO[0].Turn, pchar(@Data));

  cInitModule:
    begin
    Server:=TInitModuleData(Data).Server;
    Shade:=TBitmap.Create;
    Shade.Width:=64; Shade.Height:=64;
    for x:=0 to 63 do for y:=0 to 63 do
      if Odd(x+y) then Shade.Canvas.Pixels[x,y]:=$FFFFFF
      else Shade.Canvas.Pixels[x,y]:=$000000;
    State:=TBitmap.Create;
    State.Width:=192; State.Height:=20;
    State.Canvas.Brush.Style:=bsClear;
    State.Canvas.Font.Assign(UniFont[ftSmall]);
    NewStat;
    end;

  cReleaseModule:
    begin
    Shade.Free;
    State.Free
    end;

  cNewGame,cLoadGame:
    begin
    inc(Round);
    if Mode=Running then
      begin Invalidate; Update end
    else Show;
    G:=TNewGameData(Data);
    LogDlg.mSlot.Visible:=false;
    LogDlg.Host:=self;
    ToldAlive:=G.RO[me].Alive;
    Active:=-1;
    end;

  cBreakGame:
    begin
    LogDlg.List.Clear;
    if Mode<>Running then
      begin
      if LogDlg.Visible then LogDlg.Close;
      Close;
      end
    end;

  cTurn,cResume,cContinue:
    begin
    me:=Player;
    if Active>=0 then
      begin ShowActive(Active,false); Active:=-1 end;
    ShowYear;
    if (G.RO[me].Alive<>ToldAlive) then
      begin
      for p:=1 to nPlOffered-1 do
        if 1 shl p and (G.RO[me].Alive xor ToldAlive)<>0 then
          begin
          r:=Rect(xBrain[p],yBrain[p],xBrain[p]+67,yBrain[p]+71);
          InvalidateRect(Handle,@r,false);
          end;
      ToldAlive:=G.RO[me].Alive;
      end;
    Application.ProcessMessages;
    if Mode=Quit then EndPlaying
    else if G.RO[me].Happened and phGameEnd<>0 then
      begin // game ended, update statistics
      if G.RO[me].Happened and phShipComplete<>0 then
        begin
        p:=G.RO[me].Happened shr 16 and $f; // winner
        inc(WinStat[p])
        end;
      for p:=1 to nPlOffered-1 do
        if (bixView[p]>=0) and (1 shl p and G.RO[me].Alive=0) then
          inc(ExtStat[p]);
      if Mode=Running then Server(sNextRound,me,0,nil^)
      end
    else if Mode=Running then Server(sTurn,me,0,nil^);
    if Mode=Stop then
      begin
      GoBtn.ButtonIndex:=22;
      Mode:=Stopped
      end
    end;

  cShowTurnChange:
    begin
    if Active>=0 then
      begin ShowActive(Active,false); Active:=-1 end;
    Active:=integer(Data);
    ShowActive(Active,true);
    end

  end
end;

procedure TNoTermDlg.GoBtnClick(Sender: TObject);
begin
if Mode=Running then Mode:=Stop
else if Mode=Stopped then
  begin
  Mode:=Running;
  GoBtn.ButtonIndex:=23;
  GoBtn.Update;
  Server(sTurn,me,0,nil^);
  end
end;

procedure TNoTermDlg.QuitBtnClick(Sender: TObject);
begin
if Mode=Stopped then EndPlaying
else Mode:=Quit
end;

procedure TNoTermDlg.FormPaint(Sender: TObject);
var
i: integer;
begin
Fill(Canvas,3,3,ClientWidth-6, ClientHeight-6, 0,0, StartTex);
Frame(Canvas,0,0,ClientWidth-1,ClientHeight-1, $000000,$000000);
Frame(Canvas,1,1,ClientWidth-2,ClientHeight-2,
  StartTex.clBevelLight,StartTex.clBevelShade);
Frame(Canvas,2,2,ClientWidth-3,ClientHeight-3,
  StartTex.clBevelLight,StartTex.clBevelShade);
Corner(Canvas,1,1,0,StartTex);
Corner(Canvas,ClientWidth-9,1,1,StartTex);
Corner(Canvas,1,ClientHeight-9,2,StartTex);
Corner(Canvas,ClientWidth-9,ClientHeight-9,3,StartTex);
Canvas.Font.Assign(UniFont[ftCaption]);
RisedTextOut(Canvas,(ClientWidth-Canvas.TextWidth(Caption)) div 2,7,Caption);
Canvas.Font.Assign(UniFont[ftSmall]);
for i:=1 to nPlOffered-1 do if bixView[i]>=0 then
  begin
  FrameImage(Canvas,StartDlg.BrainPicture[bixView[i]],xBrain[i],yBrain[i],64,64,0,0,);
  if 1 shl i and G.RO[me].Alive=0 then
    BitBlt(Canvas.Handle,xBrain[i],yBrain[i],64,64,
      Shade.Canvas.Handle,0,0,SRCAND);
  with Canvas do
    begin
    DarkGradient(Canvas,xBrain[i]+4,yBrain[i]+53,56,1);
    Font.Color:=$3FBBDF;
    Textout(xBrain[i]+8,yBrain[i]+52,IntToStr(WinStat[i]));
    Font.Color:=$0000FF;
    Textout(xBrain[i]+34,yBrain[i]+52,IntToStr(ExtStat[i]));
    end;
  ShowActive(i, i=Active);
  end;
BitBlt(Canvas.Handle,x0Brain+32-20,y0Brain+32-20,40,40,
  GrExt[HGrSystem2].Mask.Canvas.Handle,115,1,SRCAND);
BitBlt(Canvas.Handle,x0Brain+32-20,y0Brain+32-20,40,40,
  GrExt[HGrSystem2].Data.Canvas.Handle,115,1,SRCPAINT);
ShowYear;
BtnFrame(Canvas,GoBtn.BoundsRect,StartTex);
BtnFrame(Canvas,QuitBtn.BoundsRect,StartTex);
//BtnFrame(Canvas,StatBtn.BoundsRect,StartTex);
end;

procedure Client;
begin
if not FormsCreated then
  begin
  FormsCreated:=true;
  Application.CreateForm(TNoTermDlg, NoTermDlg);
  end;
NoTermDlg.Client(Command,Player,Data);
end;

procedure TNoTermDlg.FormKeyDown(Sender: TObject; var Key: word;
  Shift: TShiftState);
begin
if (char(Key)='M') and (ssCtrl in Shift) then
  if LogDlg.Visible then LogDlg.Close else LogDlg.Show;
end;

procedure TNoTermDlg.FormShow(Sender: TObject);
begin
MessgDlg.Tex:=StartTex;
end;

initialization
FormsCreated:=false;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -