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

📄 rltsvr.pas

📁 一般的数据库管理系统 uses Classes, SConnectEx, TltConst, ExtCtrls, MMSystem, Types, windows, TltLogic , Sy
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      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 + -