📄 rltsvr.pas
字号:
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//基本匀速
with Result.Params[3] do
begin
FrameTime := Result.Params[2].FrameTime + Result.Params[2].TimeDuration;
TimeDuration := 7;
WheelTheta := FWheelTheta;
WheelV := Result.Params[2].WheelV + Result.Params[2].WheelA
* Result.Params[2].TimeDuration;
BallV := Result.Params[2].BallV + Result.Params[2].BallA
* Result.Params[2].TimeDuration;
BallA := 0.5;
i := 0;
repeat
WheelA := (-NumOfAngle[Round.WheelResult]+2* pi*i - (FWheelTheta- FBallTheta)-(WheelV-BallV)*Result.Params[3].TimeDuration)
/ Result.Params[3].TimeDuration / Result.Params[3].TimeDuration*2 + BallA;
inc(i);
until WheelA>-0.3;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//结果 ball to stop
with Result.Params[4] do
begin
FrameTime := Result.Params[3].FrameTime + Result.Params[3].TimeDuration;
TimeDuration := 5;
WheelTheta := FWheelTheta;
WheelV := Result.Params[3].WheelV + Result.Params[3].WheelA
* Result.Params[3].TimeDuration;
BallV := WheelV;
WheelA := -WheelV / TimeDuration;
BallA := WheelA;
BallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
BallHeight := 0;
BallR := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
end;
end;
rsScore:
begin
Result.ParamsCount := 1;
with Result.Params[0] do
begin
FrameTime := TimeSetting.WheelingTimeSet;
TimeDuration := FScoreTimeSetting ;
WheelTheta := FWheelTheta;
WheelA := 0;
WheelV :=0;//0.1;//no change
BallV := 0;//0.1;
BallTheta := WheelTheta + NumOfAngle[Round.WheelResult];
BallHeight := 0;
BallR := 0;
BallA := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
end;
end;
rsPaused:
begin
Result.ParamsCount := 1;
with Result.Params[0] do
begin
FrameTime := 0;
TimeDuration := 0;
WheelTheta := FWheelTheta;
WheelA := 0;
WheelV :=0.00;
BallV := 0.00;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
BallA := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
end;
end;
end;
procedure TTltManager.UpDateWheelParams;
begin
WheelParams.WheelStartTickCount :=GetTickCount - FWheelStartTickCount;
end;
function TTltManager.DoPlayerEdit(APlayerEditInfo : TPlayerEditInfo): TPlayerEditInfo;
var
CPlayer, DPlayer : TPlayer;
I : integer;
APlayerBetInfo : TPlayerBetInfo;
begin
Result := APlayerEditInfo;
case APlayerEditInfo.EditFlag of
efNewID:Result.PlayerInfo.ID := DAGetNewPlayerID;
efCreatePlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
CPlayer.Password := APlayerEditInfo.PlayerInfo.Password;
CPlayer.LastActiveTime := Now;
DACreatePlayer(CPlayer);
CPlayer.Free;
end;
efAddMoney:
begin
APlayerEditInfo.PlayerInfo.money := DAReadPlayer(APlayerEditInfo.PlayerInfo.ID).money
+ APlayerEditInfo.PlayerInfo.money;
APlayerEditInfo.EditFlag := efEditPlayer;
DoPlayerEdit(APlayerEditInfo);
end;
efEditPlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
CPlayer.Password := APlayerEditInfo.PlayerInfo.Password;
CPlayer.LastActiveTime := Now;
//有金钱设置变动
//记录日志,并发布变动
FillChar(APlayerBetInfo, Sizeof(APlayerBetInfo), #0);
APlayerBetInfo.PreMoney := DAReadPlayer(CPlayer.ID).money;
if APlayerBetInfo.PreMoney <> CPlayer.Money then
begin
APlayerBetInfo.PlayerID := APlayerEditInfo.PlayerInfo.ID;
APlayerBetInfo.Settlement := APlayerEditInfo.PlayerInfo.money;
APlayerBetInfo.RoundNo := Round.No;
APlayerBetInfo.WheelNo := Round.WheelNo;
APlayerBetInfo.Result := -1;
APlayerBetInfo.ResultColor := 0;
APlayerBetInfo.RoundMain := Round.Main;
DASavePlayerBetInfo(APlayerBetInfo);
end;
DAEditPlayer(CPlayer);
CPlayer.Free;
for I := 0 to FPlayerList.Count -1 do
begin
if TPlayer(FPlayerList[i]).ID = APlayerEditInfo.PlayerInfo.ID then
begin
CPlayer := TPlayer(FPlayerList[i]);
DALoadPlayer(CPlayer);
if (CPlayer.Client<>nil) and
(CPlayer.Client.Interpreter<>nil) then
begin
try
CPlayer.Client.Interpreter.CallSetPlayerInfo(CPlayer);
except
end;
end;
end;
end;
end;
efDeletePlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
DADeletePlayer(CPlayer);
CPlayer.Free;
for I := 0 to FPlayerList.Count -1 do
begin
if TPlayer(FPlayerList[i]).ID = APlayerEditInfo.PlayerInfo.ID then
begin
CPlayer := TPlayer(FPlayerList[i]);
LogoffPlayer(CPlayer.ID);
end;
end;
end;
end;
end;
function TTltManager.GetPlayerList(APlayerList: TPlayerList): TPlayerList;
var
I : integer;
begin
FillChar(Result, sizeof(Result), #0);
Result.Flag := APlayerList.Flag;
case APlayerList.Flag of
PLFCountOnly:
begin
Result.PlayerCount := GetPlayerCount;
end;
PLFAllPlayer:
begin
Result.PlayerCount := GetPlayerCount;
Result.Size := Result.PlayerCount * sizeof(tplayerinfo);
GetMem(Result.Data, Result.Size);
DAReadPlayers(Result.Data, 0, Result.PlayerCount);
end;
PLFSelectPlayer:
begin
Result.PlayerCount := APlayerList.PlayerCount;
Result.Size := Result.PlayerCount * sizeof(tplayerinfo);
Result.Data := AllocMem(Result.Size);
for i := 0 to Result.PlayerCount-1 do
begin
Result.Data^[i] := DAReadPlayer(APlayerList.Data^[i].ID);
end;
end;
PLFLastChangePlayer:
begin
Result.PlayerCount := GetPlayerCount;
Result.Size := Result.PlayerCount * sizeof(tplayerinfo);
GetMem(Result.Data, Result.Size);
Result.LastUpdate := APlayerList.LastUpdate;
Result.PlayerCount := DAReadLastChangePlayer(Result.Data, Result.LastUpdate);
Result.Size := Result.PlayerCount * sizeof(tplayerinfo);
end;
PLFRoundLength:
begin
end;
end;
end;
function TTltManager.SetOpenColorIndex(AColorIndex : integer): boolean;
var
Num : integer;
begin
Result := State = rsBeforeWheel;
if not Result then Exit;
Num := GetRandomNumByColor(AColorIndex);
SetOpenNumber(Num);
FSpecialNum := true;
Round.Auto := false;
Level2 := 1;
// DoBeforeWheel;
end;
function TTltManager.GetGameParams: TGameParams;
begin
with Result do
begin
BelTime := FBetTimeSetting;
BeforeWheelTime := FBeforeWheelTimeSetting;
TotalValue := self.TotalValue;//总彩池值;
ObjectValue := self.ObjectValue;//期望
Rate := self.Rate; //提成比,游戏难度
Bleed := self.Bleed; //阀值
end;
end;
function TTltManager.SetGameParams(AGameParams: TGameParams): boolean;
begin
Result := false;
DASaveGameParams(AGameParams);
with AGameParams do
begin
FBetTimeSetting := BelTime;
FBeforeWheelTimeSetting := BeforeWheelTime;
FRoundMain := RoundMain;
// Self.TotalValue := TotalValue;
// Self.ObjectValue := ObjectValue;
self.Rate := Rate;
// self.Bleed := Bleed;
end;
FTimeSettingModified := true;
Result := True;
end;
procedure TTltManager.ResetPlayerBet();
var
I : integer;
rltInterpreter : TrltServerInterpreter;
begin
for I :=0 to FPlayerList.Count-1 do
begin
try
with TPlayer(FPlayerList[i]) do
begin
FillChar(Bet, sizeof(Bet), #0);
rltInterpreter := Client.Interpreter;
rltInterpreter.CallSetPlayerInfo(TPlayer(FPlayerList[i]));
end;
except
end;
end;
NeedResetPlayerBet := false;
end;
function TTltManager.SetRoundState(const Value: TRoundState) : boolean;
begin
Result := true;
if Value <> Round.State then
begin
//如果是切换游戏中的状态,则无效
if (Round.State in [rsBeting..rsScore{分数}])
and (Value in [rsBeting..rsScore{分数}]) then
begin
Result := false;
end else
if Value = rsBeting then
begin
NeedResetPlayerBet := true;
InitRound; //重新开始游戏
end else
if Value = rsPaused then
begin
Round.State := rsPaused;//游戏暂停了;
end else
if Value = rsStop then
begin
// do nothing. not support;
Round.State := rsStop;
end else
if Value = rsPauseAtRoundEnd then
begin
FPauseAtRoundEnd := true;
end else
if Value = rsReset then
begin
NeedResetPlayerBet := true;
ResetRound;
end else
Result := false;
end;
end;
procedure TTltManager.ResetRound;
begin
FillChar(Round, Sizeof(Round), #0);
FillChar(RoundScords, Sizeof(RoundScords), #0);
Round.State := rsPaused;
Round.No := 1;
Round.WheelNo := 0;
Level2 := 1;
end;
procedure TTltManager.DoInit;
var
GameParams : TGameParams;
begin
if DAReadGameParams(GameParams) then
SetGameParams(GameParams);
end;
function TTltManager.GetRoundScordInfo(RoundID: integer): TRoundScordInfos;
var
I : integer;
begin
if (RoundID >0) and (RoundID<=Round.No) then
begin
Result := RoundScordInfosArray[RoundID];
end;
end;
function TTltManager.SetPlayerList(APlayerList: TPlayerList): TPlayerList;
var
CPlayer : TPlayer;
I, J : integer;
begin
Result := APlayerList;
CPlayer := TPlayer.Create;
try
for I :=0 to APlayerList.PlayerCount-1 do
begin
CPlayer.SetPlayerInfo(APlayerList.Data^[I]);
CPlayer.Password := APlayerList.Data^[I].Password;
CPlayer.LastActiveTime := APlayerList.Data^[I].LastActiveTime;
if DAEditPlayer(CPlayer)<0 then
DACreatePlayer(CPlayer);
for J := 0 to FPlayerList.Count -1 do
begin
if TPlayer(FPlayerList[j]).ID = APlayerList.Data^[I].ID then
begin
DALoadPlayer(TPlayer(FPlayerList[J]));
end;
end;
end;
finally
CPlayer.Free;
end;
end;
function TTltManager.GetRoundInfoLog(
var AArrayofRoundInfo: TArrayofRoundInfo): integer;
begin
Result := DAGetRoundInfoLog(AArrayofRoundInfo);
end;
function TTltManager.GetPlayerBetInfoLog(
var AArrayofPlayerBetInfo: TArrayofPlayerBetInfo): integer;
begin
Result := DAGetPlayerBetInfoLog(AArrayofPlayerBetInfo);
end;
function TTltManager.ClearPlayerBetInfoLog: boolean;
begin
Result := DAClearPlayerBetInfoLog;
end;
function TTltManager.ClearRoundInfoLog: boolean;
begin
Result := DAClearRoundInfoLog;
TotalValue := 0;
ObjectValue := 0;
end;
function TTltManager.ClearPlayerList: boolean;
begin
Result := DAClearPlayerList;
end;
procedure TTltManager.DoStop;
var
I : integer;
rltInterpreter : TrltServerInterpreter;
begin
//通知所有以连接终端,服务器已经停止,并注销用户;
for i := 0 to FPlayerList.Count -1 do
begin
LogoffPlayer(TPlayer(FPlayerList[0]).ID);
end;
for I := 0 to SocketForm.ConnectionList.Items.Count -1 do
begin
rltInterpreter := SocketForm.GetrltInterpreter(I);
rltInterpreter.CallSetRound;
end;
end;
procedure TTltManager.DoPaused;
var
I : integer;
rltInterpreter : TrltServerInterpreter;
begin
for I := 0 to SocketForm.ConnectionList.Items.Count -1 do
begin
try
rltInterpreter := SocketForm.GetrltInterpreter(I);
rltInterpreter.CallSetRound;
except
end;
end;
end;
function TTltManager.CheckAdmin(Tag :integer; AdminStr: String): boolean;
var
GameParams : TGameParams;
begin
Result := false;
case Tag of
1 : begin
//修改密码
DAReadGameParams(GameParams);
GameParams.AdminStr := AdminStr;
Result := true;
end;
0: begin
//校验密码
DAReadGameParams(GameParams);
Result := Trim(GameParams.AdminStr) = Trim(AdminStr);
end;
end;
end;
{ TPlayer }
constructor TPlayer.Create;
begin
State := psNoBody;
end;
function TPlayer.GetPlayerInfo: TPlayerInfo;
begin
with Result do
begin
ID := Self.ID;
password := Self.Password;
UserName := Self.UserName;
Memo := Self.Memo;
money := Self.Money;
State := Self.State;
Move(self.Bet, Bet, sizeof(bet));
// Password := Self.Password;
end;
end;
procedure TPlayer.SetPlayerInfo(PlayerInfo: TPlayerInfo);
begin
ID := PlayerInfo.ID;
Password := PlayerInfo.password;
Memo := PlayerInfo.Memo;
UserName := PlayerInfo.UserName;
Money := PlayerInfo.money;
State := PlayerInfo.State;
end;
{ TTltClient }
procedure TTltClient.AddPlayer(Player: TPlayer);
begin
if PlayerList.IndexOf(Player)>=0 then Exit;
PlayerList.Add(Player);
Player.Client := Self;
end;
constructor TTltClient.Create(manager : TTltManager);
begin
FManager := manager;
PlayerList := TList.Create;
FManager.AddClient(Self);
end;
destructor TTltClient.Destroy;
begin
FManager.RemoveClient(Self);
PlayerList.Free;
inherited;
end;
function TTltClient.HasPlayer(Player: TPlayer): boolean;
begin
Result := PlayerList.IndexOf(Player) >=0;
end;
procedure TTltClient.RemovePlayer(Player: TPlayer);
begin
PlayerList.Remove(Player);
Interpreter.CallLogout(Player.ID);
end;
initialization
DAUInit();
rltManager := TTltManager.Create(nil);
finalization
rltManager.Free;
DAUFinit;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -