?? pmain.pas
字號(hào):
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('通過驗(yàn)證');
//產(chǎn)生player的記錄
New(ltep);
LTep^.Name := GBuffLogin.Acc;
LTep^.Contenting := AThread;
LTep^.TotMoney := 100;
AThread.Data := Pointer(ltep);
WaitePlayerLIst.Add(AThread.Data);
AddShow('生成管理對(duì)象');
//給用戶發(fā)送現(xiàn)有桌子列表
AddShow('向客戶端發(fā)送空閑桌子情況');
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('沒有通過應(yīng)證 斷開連接');
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) + '號(hào)桌子');
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); //告訴用戶他已經(jīng)成功離開了
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('創(chuàng)建名為' + 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上將狀態(tài)設(shè)置為%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.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -