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

📄 pmain.pas

📁 网络对站平台
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  Lbuff: RSTC_GiveBeginPlayerIdx;
begin
  Lbuff.Index := Iidx;
  for I := 0 to FPlayerArr.Count - 1 do begin // Iterate
    FMain.SendHead(PRplayer(FPlayerArr.Items[i]).Contenting, Cmid_STC_GiveBeginPlayerIdx);
    PRplayer(FPlayerArr.Items[i]).Contenting.Connection.WriteBuffer(Lbuff, Sizeof(Lbuff));
  end; // for
end;

procedure TTab.PlayerCards(IBuff: RSTC_PlayerSendCards);
var
  I: Integer;
begin
  PRplayer(FPlayerArr[IBuff.PlayerIdx]).TotMoney:=PRplayer(FPlayerArr[IBuff.PlayerIdx]).TotMoney-IBuff.Scores;
  for I := 0 to FPlayerArr.Count - 1 do begin // Iterate
    FMain.SendHead(PRplayer(FPlayerArr.Items[i]).Contenting, Cmid_STC_UserSendCards);
    PRplayer(FPlayerArr.Items[i]).Contenting.Connection.WriteBuffer(IBuff, Sizeof(IBuff));
  end; // for
end;

procedure TTab.PlayerPass(Ibuff: RSTC_PlayerPass);
var
  I: Integer;
begin
  for I := 0 to FPlayerArr.Count - 1 do begin // Iterate
    FMain.SendHead(PRplayer(FPlayerArr.Items[i]).Contenting, Cmid_STC_UserPass);
    PRplayer(FPlayerArr.Items[i]).Contenting.Connection.WriteBuffer(IBuff, Sizeof(IBuff));
  end; // for
end;

procedure TTab.PlayerChat(Ibuff: RCTS_Chat);
var
  I: Integer;
begin
  for I := 0 to FPlayerArr.Count - 1 do begin // Iterate
    FMain.SendHead(PRplayer(FPlayerArr.Items[i]).Contenting, Cmid_CTS_Chat);
    PRplayer(FPlayerArr.Items[i]).Contenting.Connection.WriteBuffer(IBuff, Sizeof(IBuff));
  end; // for
end;



procedure TTab.PlayerWin(Ibuff: RCTS_UseWin);
var
  I: Integer;
begin
  for I := 0 to  FPlayerArr.Count-1 do    // Iterate
    PRplayer(FPlayerArr[i]).ReadGame:=False;
  prPlayer(FPlayerArr.Items[Ibuff.PlayIdx]).TotMoney:=
    prPlayer(FPlayerArr.Items[Ibuff.PlayIdx]).TotMoney+Ibuff.AddScore;
end;

{ TFMain }

function TFMain.CanLoginIn(ILogin: RCTS_login): Boolean;
begin
  Result := True;
end;

procedure TFMain.GameServerConnect(AThread: TIdPeerThread);
var
  I: Integer;
  LTep: PRPlayer;
  LEntry: Pointer;
begin
  if AppState <> CappstateNormal then AThread.Connection.Disconnect;
  AddShow('客户端试图登录...');
  Athread.Connection.ReadBuffer(GbuffHead, sizeof(GBuffHead));
  if GBuffHead.Cmid = Cmid_CTS_Login then
    Athread.Connection.ReadBuffer(Gbufflogin, Sizeof(GBuffLogin));
  if CanLoginIn(GBuffLogin) then begin
    AddShow('通过验证');
      //产生player的记录
    New(ltep);
    LTep^.Name := GBuffLogin.Acc;
    LTep^.Contenting := AThread;
    LTep^.TotMoney := 100;
    AThread.Data := Pointer(ltep);
    WaitePlayerLIst.Add(AThread.Data);
    AddShow('生成管理对象');
      //给用户发送现有桌子列表
    AddShow('向客户端发送空闲桌子情况');
    LEntry := GetWaiteTabArrEntry(LBuffCount);
    GiveUserTabList(AThread, LEntry, LBuffCount * sizeof(RWaiteTab));
    OnlinesUserCount:=OnlinesUserCount+1;
    if WaitePlayerLIst.Count>0 then      
      For I := 0 To WaitePlayerLIst.Count - 1 Do     // Iterate
        GetOnlineUsersCount(PrPlayer(waitePlayerList.Items[i]).Contenting);
  end
  else begin
    AddShow('没有通过应证 断开连接');
    Athread.Connection.Disconnect;
  end;
end;

procedure TFMain.GameServerExecute(AThread: TIdPeerThread);
var
  LHead: RHead;
  Ltep: pointer;
begin
  if AppState <> CappstateNormal then Exit;
  with AThread do begin
    Connection.ReadBuffer(LHead, SizeOf(LHead));
    case LHead.Cmid of //
      CMid_CTS_JoinTab: JoinTab(AThread); //加入桌子
      CMID_CTS_LeaveTab: LeaveTab(AThread);
      CMid_CTS_DisConn: begin
          SendHead(AThread, CMid_CTS_DisConn);
          AThread.Terminate;
        end;
      CMID_CTS_CreateTab: CreateTab(AThread);
      Cmid_CTS_ReadyGame: ReadyGame(AThread);
      Cmid_STC_GiveWaiteTabList: begin
          Ltep := GetWaiteTabArrEntry(LBuffCount);
          GiveUserTabList(AThread, Ltep, LBuffCount * sizeof(RWaiteTab))
        end;
      Cmid_STC_UserSendCards: PlayerSendCard(AThread);
      Cmid_STC_UserPass: PlayerPass(AThread);
      Cmid_CTS_Chat: PlayerChat(AThread);
      Cmid_CTS_GetOnlinesUser:GetOnlineUsersCount(AThread);
      Cmid_CTS_Userwin:PlayerWinMoney(AThread);
    end; // case
  end; // with
end;


procedure TFMain.JoinTab(Athread: TIdPeerThread);
var
  LBuff: RCTS_JoinTab;
  LTep: TTab;
begin
  with Athread do begin
    Connection.ReadBuffer(LBuff, SIZEOf(LBuff));
    LTep := GameManage.GetTab(LBuff.TabID);
    if LTep.PlayerCount + 1 <= LTep.MaxCount then begin
      LTep.InPlayer(Prplayer(Athread.Data));
      AddShow('用户' + Prplayer(Athread.Data).Name + '加入了' + inttostr(LBuff.TabID) + '号桌子');
    end;
  end; // with
end;

procedure TFMain.LeaveTab(athread: TIdPeerThread);
var
  Lbuff: RCTS_LeaveTab;
begin
  with Athread do begin
    Connection.ReadBuffer(LBuff, SIZEOf(LBuff));
    AddShow(Format('用户%s在离开了桌子%d',
      [Prplayer(Athread.Data).Name, Lbuff.TabID]));
    GameManage.GetTab(LBuff.TabID).LeavePlayer(Lbuff.PlayerID);
    FMain.SendHead(athread, CMID_CTS_LeaveTab); //告诉用户他已经成功离开了
  end; // with
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
  GameManage := TGameTabMana.Create;
  WaitePlayerLIst := TList.Create;
  AppState := CappstateNormal;
end;

procedure TFMain.FormDestroy(Sender: TObject);
begin
  GameServer.Free;
  WaitePlayerLIst.Free;
  GameManage.Free;
end;

procedure TFMain.GiveCards(aThread: TIdPeerThread; TENtryPointer: Pointer; IRandomsArrSize: Integer; ICount: Byte);
var
  Lbuff: RSTC_GiveCards;
begin
  FMain.SendHead(aThread, Cmid_STC_GiveCards);
  Lbuff.CardsSize := IRandomsArrSize;
  Lbuff.Count := ICount;
  aThread.Connection.WriteBuffer(lbuff, SIZEOF(Lbuff));
  aThread.Connection.WriteBuffer(tenTryPointer^, Lbuff.CardsSize);
end;

procedure TFMain.CreateTab(athread: TIdPeerThread);
var
  Lbuff: RCTS_CreateTab;
  LResp: RCTS_CreateTab_RESP;
begin
  with athread do begin
    athread.Connection.ReadBuffer(Lbuff, Sizeof(Lbuff));
    LResp.tabid := GameManage.NewTab(Lbuff.TabName, Lbuff.TabKind);
    AddShow('创建名为' + Lbuff.TabName + '的桌子');
    GameManage.GetTab(LResp.tabid).InPlayer(PRplayer(athread.Data));
    SendHead(athread, CMID_CTS_CreateTab);
    Connection.WriteBuffer(lresp, sizeof(LResp));
  end; // with
end;

procedure TFMain.GiveUserTabList(athread: TIdPeerThread;
  TENtryPointer: Pointer; ISize: Integer);
var
  Lbuff: RSTC_GiveWaiteTabList;
begin
  SendHead(athread, Cmid_STC_GiveWaiteTabList);
  Lbuff.ListSize := ISize;
  aThread.Connection.WriteBuffer(lbuff, SIZEOF(Lbuff));
  aThread.Connection.WriteBuffer(tenTryPointer^, ISize);
end;

function TFMain.GetWaiteTabArrEntry(var Icount: Cardinal): Pointer;
var
  I: Integer;
begin
  if GameManage.FGameTabArr.Count = 0 then begin Result := nil; Exit; end;
  icount := 0;
  for I := 0 to GameManage.FGameTabArr.Count - 1 do begin // Iterate
    if not tTab(GameManage.FGameTabArr.Items[i]).gameing then begin
      inc(icount);
      SetLength(Lbuff, icount);
      Lbuff[icount - 1].TabID := tTab(GameManage.FGameTabArr.Items[i]).id;
      Lbuff[icount - 1].TabKind := tTab(GameManage.FGameTabArr.Items[i]).GameKind;
      Lbuff[icount - 1].TabName := tTab(GameManage.FGameTabArr.Items[i]).TabName;
      Lbuff[icount - 1].TabPlayerCount := tTab(GameManage.FGameTabArr.Items[i]).PlayerCount;
      Lbuff[icount - 1].TabMaxCount := tTab(GameManage.FGameTabArr.Items[i]).MaxCount;
    end;
  end; // for
  Result := Pointer(Lbuff);
end;

procedure TFMain.SendHead(AThread: TIdPeerThread; Iheadcmid: Smallint);
begin
  if not Assigned(AThread) then exit;
  GBuffHead.Cmid := Iheadcmid;
  AThread.Connection.WriteBuffer(GbuffHead, sizeof(GBuffHead));
end;

procedure TFMain.TabChanged(athread: TIdPeerThread; Ikind: sTabChange;
  Iparam: Cardinal; IWaiteTab: PRWaiteTab);
var
  Lbuff: RSTC_TabChange;
begin
  SendHead(athread, Cmid_STC_TabChange);
  Lbuff.Kind := Ikind;
  Lbuff.Param := Iparam;
  if Assigned(IWaiteTab) then
    Lbuff.WaiteTab := IwaiteTab^;
  athread.Connection.WriteBuffer(Lbuff, Sizeof(Lbuff));
end;

procedure TFMain.AddShow(IStr: string);
begin
  if Memo1.Lines.Add(datetimetostr(now) + ' :' + IStr) > 500 then
    Memo1.Clear;
end;

procedure TFMain.TabChanged(Ikind: sTabChange; Iparam: Cardinal; IWaiteTab: PRWaiteTab);
var
  I: Integer;
  Lbuff: RSTC_TabChange;
begin
  for I := 0 to WaitePlayerLIst.Count - 1 do begin // Iterate
    SendHead(PRPlayer(WaitePlayerLIst.Items[I]).Contenting, Cmid_STC_TabChange);
    Lbuff.Kind := Ikind;
    Lbuff.Param := Iparam;
    if Assigned(IWaiteTab) then
      Lbuff.WaiteTab := IwaiteTab^;
    PRPlayer(WaitePlayerLIst.Items[I]).Contenting.Connection.WriteBuffer(Lbuff, Sizeof(Lbuff));
  end; // for
end;

procedure TFMain.ReadyGame(Athread: TIdPeerThread);
var
  Lbuff: RCTS_ReadyGame;
begin
  Athread.Connection.ReadBuffer(Lbuff, Sizeof(Lbuff));
  GameManage.GetTab(Lbuff.TabID).ReadyGame(Lbuff.PlayerINDEX, Lbuff.STate);
  AddShow(Format('用户%s在桌子%d上将状态设置为%s', [Prplayer(Athread.Data).Name,
    Lbuff.TabID, inttostr(Ord(Lbuff.STate))]));
end;

procedure TFMain.GameServerListenException(AThread: TIdListenerThread;
  AException: Exception);
begin
  AddShow(AException.Message);
end;

procedure TFMain.DisConn(Athread: TIdPeerThread);
var
  I: Integer;
begin
  OnlinesUserCount:=OnlinesUserCount-1;
  AddShow('用户' + Prplayer(Athread.Data).Name + '退出连接了');
  i := WaitePlayerLIst.IndexOf(Athread.Data);
  if i > -1 then
    WaitePlayerLIst.Delete(i)
  else begin
    GameManage.GetTab(Prplayer(Athread.Data).Index).LeavePlayer(Prplayer(Athread.Data).ID, True);
  end;
  For I := 0 To WaitePlayerLIst.Count - 1 Do   // Iterate
  GetOnlineUsersCount(pRplayer(WaitePlayerLIst.Items[i]).Contenting);
  Dispose(Pointer(AThread.Data));
end;

procedure TFMain.GameServerDisconnect(AThread: TIdPeerThread);
begin
  DisConn(AThread);
end;

procedure TFMain.GameServerException(AThread: TIdPeerThread;
  AException: Exception);
begin
  if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;

procedure TFMain.PlayerPass(Athread: TIdPeerThread);
var
  Lbuff: RSTC_PlayerPass;
begin
  Athread.Connection.ReadBuffer(Lbuff, sizeof(Lbuff));
  GameManage.GetTab(Lbuff.TabID).PlayerPass(Lbuff);
end;

procedure TFMain.PlayerSendCard(Athread: TIdPeerThread);
var
  Lbuff: RSTC_PlayerSendCards;
begin
  Athread.Connection.ReadBuffer(Lbuff, sizeof(Lbuff));
  GameManage.GetTab(Lbuff.TabID).PlayerCards(Lbuff);
end;

procedure TFMain.PlayerChat(Athread: TIdPeerThread);
var
  Lbuff: RCTS_Chat;
begin
  Athread.Connection.ReadBuffer(Lbuff, Sizeof(Lbuff));
  GameManage.GetTab(Lbuff.TabID).PlayerChat(Lbuff);
end;

procedure TFMain.GetOnlineUsersCount(Athread: TIdPeerThread);
Var
  Lbuff:RCTS_GetOnlinesUser;
begin
  Lbuff.Count:=OnlinesUserCount;
  SendHead(Athread,Cmid_CTS_GetOnlinesUser);
  Athread.Connection.WriteBuffer(Lbuff,Sizeof(Lbuff));
end;

procedure TFMain.PlayerWinMoney(Athread: TIdPeerThread);
var
  LBuff:RCTS_UseWin;
begin
  Athread.Connection.ReadBuffer(LBuff,Sizeof(LBuff));
  GameManage.GetTab(LBuff.TabId).PlayerWin(LBuff);
end;

end.

⌨️ 快捷键说明

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