📄 clientinterpreter.pas
字号:
unit ClientInterpreter;
{Tlt logic layer}
interface
uses Classes, SConnect, TltConst, ExtCtrls, rltgame;
type
TrltClientInterpreter = class(TDataBlockInterpreter)
function DoCustomAction(Action: Integer; const Data: IDataBlock): Boolean; override;
private
function CallGetCurrentRoundNo: integer;
public
{Receiving Calls}
//do game round
procedure DoSetCountDown(const Data: IDataBlock);
//do player manage
procedure DoLoginPlayer(const Data: IDataBlock) ;
// procedure DoLogoffPlayer(const Data: IDataBlock);
// procedure DoResetRound(const Data: IDataBlock);
procedure DoSetRound(const Data: IDataBlock);
procedure DoTimeSetting(const Data: IDataBlock);
procedure DoBet(const Data: IDataBlock);
procedure DoPlayerInfo(const Data: IDataBlock);
procedure DoWheelParams(const Data: IDataBlock);
procedure DoLogout(const Data: IDataBlock);
// procedure DoResetRound(const Data: IDataBlock);
{Sending Calls}
//get info
function CallGetServerInfo : TServerInfo;
function CallGetCurrentRound : TRound;
function CallGetTimeSetting :TTimeSetting;
function CallLoginPlayer(PlayerID, Password : String): boolean;
function CallLogoffPlayer(PlayerID : String): boolean;
function CallGetPlayerInfo(PlayerID : String) : TPlayerInfo;
function CallGetScore(RoundNo, WheelNo: integer) : TRoundScord;
function CallGetWheelParams : TWheelParams ;
//player
// function LoginPlayer(APlayer : TPlayer): boolean;
// procedure LogoffPlayer(APlayer : TPlayer);
function CallBet(APlayer : TPlayer): boolean;
// function LoginPlayer
end;
TrltSocketConnection = class(TSocketConnection)
private
FInterpreter : TrltClientInterpreter;
protected
function GetInterpreter: TCustomDataBlockInterpreter; override;
end;
implementation
uses ScktCnst, rltClient;
{ TTltInterpreter }
function TrltClientInterpreter.CallGetServerInfo: TServerInfo;
var
Data: IDataBlock;
Size : integer;
s : TServerInfo;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asGetServerInfo;
Data := FSendDataBlock.Send(Data, True);
Data.Read(size, sizeof(size));
Data.Read(s,Size);
Result := s;
// Result := ReadVariant(Flags, Data);
end;
function TrltClientInterpreter.CallGetCurrentRoundNo: integer;
var
Data: IDataBlock;
Size : integer;
s : integer;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asGetCurrentRound;
Data := FSendDataBlock.Send(Data, True);
Data.Read(size, sizeof(size));
Data.Read(s,Size);
Result := s;
// Result := ReadVariant(Flags, Data);
end;
function TrltClientInterpreter.DoCustomAction(Action: Integer;
const Data: IDataBlock): Boolean;
begin
inherited DoCustomAction(Action, Data);
case (Action and asMask) of
//client
asSetCountDown : DoSetCountDown(Data);
asSetRound : DoSetRound(Data);
asTimeSetting : DoTimeSetting(Data);
asBet : DoBet(Data);
asPlayerInfo : DoPlayerInfo(Data);
asWheelParams : DoWheelParams(Data);
asLogoffPlayer : DoLogout(Data);
else
Result := false;
end;
end;
procedure TrltClientInterpreter.DoSetCountDown(const Data: IDataBlock);
var
VarSize : integer;
VarFlag : TVarFlags;
begin
rlt.Round.CountDown := ReadVariant(VarFlag, Data);
end;
{ TrltSocketConnetion }
function TrltSocketConnection.GetInterpreter: TCustomDataBlockInterpreter;
begin
if not Assigned(FInterpreter) then
FInterpreter := TrltClientInterpreter.Create(Self, SSockets);
Result := FInterpreter;
end;
function TrltClientInterpreter.CallBet(APlayer: TPlayer): boolean;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asBet;
WriteVariant(APlayer.UserID, Data);
WriteVariant(APlayer.RBet, Data);
WriteVariant(APlayer.BBet, Data);
WriteVariant(APlayer.GBet, Data);
Data := FSendDataBlock.Send(Data, false);
end;
procedure TrltClientInterpreter.DoLoginPlayer(const Data: IDataBlock);
var
IsLogined : boolean;
VarFlag : TVarFlags;
VarSize : integer;
begin
//check is logined
IsLogined := ReadVariant(VarFlag, Data);
//active player
//
end;
function TrltClientInterpreter.CallGetCurrentRound: TRound;
var
Data: IDataBlock;
VarSize : integer;
VarFlag : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asGetCurrentRound;
Data := FSendDataBlock.Send(Data, True);
Data.Read(VarSize, sizeof(VarSize));
Data.Read(Result, VarSize);
end;
procedure TrltClientInterpreter.DoTimeSetting(const Data: IDataBlock);
var
VarSize : integer;
VarFlag : TVarFlags;
begin
Data.Read(VarSize, sizeof(VarSize));
Data.Read(rlt.TimeSetting, VarSize);
end;
function TrltClientInterpreter.CallGetTimeSetting: TTimeSetting;
var
Data: IDataBlock;
Size : integer;
s : TTimeSetting;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asTimeSetting;
Data := FSendDataBlock.Send(Data, True);
Data.Read(size, sizeof(size));
Data.Read(s,Size);
Result := s;
end;
function TrltClientInterpreter.CallLoginPlayer(PlayerID, Password : String): boolean;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asLoginPlayer;
WriteVariant(PlayerID, Data);
WriteVariant(Password, Data);
Data := FSendDataBlock.Send(Data, True);
Result := ReadVariant(Flays, Data);
end;
function TrltClientInterpreter.CallGetPlayerInfo(
PlayerID: String): TPlayerInfo;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asPlayerInfo;
WriteVariant(PlayerID, Data);
Data := FSendDataBlock.Send(Data, True);
Data.Read(Size, sizeof(Size));
if Size< sizeof(Result) then
begin
FillChar(Result, sizeof(Result), #0);
Exit;
end;
Data.Read(Result, Size);
end;
procedure TrltClientInterpreter.DoBet(const Data: IDataBlock);
var
VarSize : integer;
VarFlag : TVarFlags;
RBet, BBet, GBet : longint;
Result : boolean;
PlayerID : String;
APlayer : TPlayer;
I : integer;
begin
PlayerID := ReadVariant(VarFlag, Data);
Result := ReadVariant(VarFlag, Data);
RBet := ReadVariant(VarFlag, Data);
BBet := ReadVariant(VarFlag, Data);
GBet := ReadVariant(VarFlag, Data);
APlayer := nil;
for i := low(Players) to High(Players) do
begin
if PlayerID = Players[i].UserID then APlayer := Players[I];
if APlayer <> nil then
if not Result then
begin
APlayer.RBet := RBet;
APlayer.GBet := GBet;
APlayer.BBet := BBet;
APlayer.Modified := false;
end;
end;
end;
function TrltClientInterpreter.CallLogoffPlayer(PlayerID : String): boolean;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asLogoffPlayer;
WriteVariant(PlayerID, Data);
Data := FSendDataBlock.Send(Data, True);
Result := ReadVariant(Flays, Data);
end;
procedure TrltClientInterpreter.DoPlayerInfo(const Data: IDataBlock);
var
PlayInfo : TPlayerInfo;
Size : integer;
APlayer : TPlayer;
I : integer;
begin
Data.Read(Size, sizeof(Size));
Data.Read(PlayInfo, Size);
APlayer := nil;
for i := low(Players) to High(Players) do
begin
if PlayInfo.ID = Players[i].UserID then
begin
APlayer := Players[I];
if APlayer <> nil then
with PlayInfo do
begin
APlayer.money := money;
APlayer.RBet := Bet[btRed];
APlayer.GBet := Bet[btBlack];
APlayer.BBet := Bet[btGreen];
APlayer.State := State;
APlayer.Modified := false;
end;
end;
end;
end;
function TrltClientInterpreter.CallGetScore(RoundNo,
WheelNo: integer): TRoundScord;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asGetRoundScord;
WriteVariant(RoundNo, Data);
WriteVariant(WheelNo, Data);
Data := FSendDataBlock.Send(Data, True);
Data.Read(Size, sizeof(Size));
Data.Read(Result, Size);
end;
function TrltClientInterpreter.CallGetWheelParams: TWheelParams;
var
Data: IDataBlock;
Size : integer;
s : boolean;
Flays : TVarFlags;
begin
Data := TDataBlock.Create as IDataBlock;
Data.Signature := CallSig or asWheelParams;
Data := FSendDataBlock.Send(Data, True);
Data.Read(Size, sizeof(Size));
Data.Read(Result, Size);
end;
procedure TrltClientInterpreter.DoWheelParams(const Data: IDataBlock);
var
Size : integer;
I : integer;
begin
Data.Read(Size, sizeof(Size));
Data.Read(rlt.WheelParams, Size);
rlt.UpdateWheelParams;
end;
procedure TrltClientInterpreter.DoLogout(const Data: IDataBlock);
var
CPlayerID : String;
Flags : TVarFlags;
I : integer;
begin
CPlayerID := ReadVariant(Flags, Data);
for i := 0 to 3 do
begin
if Players[i].UserID = CPlayerID then
begin
PlayerPanel[i].State := ppsLoginOtherWay;
PlayerPanel[i].UserName := '';
with Players[i] do
begin
Password := '';
UserID := '';
money := 0;
end;
end;
end;
end;
procedure TrltClientInterpreter.DoSetRound(const Data: IDataBlock);
var
VarSize : integer;
VarFlag : TVarFlags;
Round : TRound;
begin
Data.Read(VarSize, sizeof(VarSize));
Data.Read(Round, VarSize);
rlt.SetRound(Round);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -