private void AddBet(ClientUser user, string[] cmds) { decimal betAmount; if (timeToRoll <= 0) { this.room.UserInform(user, $"You cant bet right now"); return; } var o = bets.Where(b => b.User == user); if (o.Count() != 0) { this.room.UserInform(user, "You already placed your bet"); return; } if (cmds.Length == 3 && (cmds[1] == "red" || cmds[1] == "black") && decimal.TryParse(cmds[2], out betAmount)) { if (!EnoughBalance(user, betAmount)) { this.room.UserInform(user, $"You dont have enough money"); return; } RouletteColor c = (cmds[1] == "red") ? RouletteColor.Red : RouletteColor.Black; Bet bet = new Bet(user, c, betAmount); bets.Add(bet); Database.Query($"update Users set Balance = Balance - {betAmount} where id = {user.Id};"); this.room.UserInform(user, $"Bet for {betAmount}$ placed on {cmds[1]}"); } }
void ITimerService.Process(double time) { if (currentbets.Count > 0) { int index = RNG.XORShift64.NextInt(numbers.Length); int number = numbers[index]; RouletteColor color = colors[index]; lock (historylock) { history.Enqueue(new RouletteField(number, color)); while (history.Count > 10) { history.Dequeue(); } } RPGMessageBuilder builder = context.GetModule <RPGMessageModule>().Create(); builder.Text("The ball fell to field ").Text($"{number} {color}", GetColor(color), FontWeight.Bold).Text(". "); Dictionary <long, int> winnings = new Dictionary <long, int>(); lock (betlock) { foreach (RouletteBet bet in currentbets) { int factor = GetFactor(bet, number, color); if (factor > 0) { if (!winnings.ContainsKey(bet.UserID)) { winnings[bet.UserID] = 0; } winnings[bet.UserID] += bet.Gold * factor; } } currentbets.Clear(); } foreach (KeyValuePair <long, int> win in winnings) { builder.User(win.Key).Text(" won ").Gold(win.Value); context.GetModule <PlayerModule>().UpdateGold(win.Key, win.Value); } builder.Send(); } else { if (nextbets.Count > 0) { lock (betlock) { currentbets.AddRange(nextbets); nextbets.Clear(); } context.GetModule <RPGMessageModule>().Create().Text("A new roulette round has started.").Send(); } } }
Color GetColor(RouletteColor color) { switch (color) { case RouletteColor.Black: return(Color.LightGray); case RouletteColor.Green: return(Color.LawnGreen); case RouletteColor.Red: return(Color.OrangeRed); default: return(Color.White); } }
/// <summary> /// creates a new <see cref="RouletteField"/> /// </summary> /// <param name="number"></param> /// <param name="color"></param> public RouletteField(int number, RouletteColor color) { Number = number; Color = color; }
public RouletteRoll(int number) { this.Number = number; this.Color = (number > 50) ? RouletteColor.Red : RouletteColor.Black; }
public Bet(ClientUser u, RouletteColor c, decimal a) { this.User = u; this.Color = c; this.Amount = a; }
int GetFactor(RouletteBet bet, int number, RouletteColor color) { switch (bet.Type) { case BetType.Plein: if (number == bet.BetParameter) { return(36); } break; case BetType.Color: if ((color == RouletteColor.Red && bet.BetParameter == 0) || (color == RouletteColor.Black && bet.BetParameter == 1)) { return(2); } break; case BetType.OddEven: if (number != 0 && ((number & 1) == bet.BetParameter)) { return(2); } break; case BetType.HalfBoard: if (number > 18 * bet.BetParameter && number <= 18 * (bet.BetParameter + 1)) { return(2); } break; case BetType.Douzaines: if (number != 0 && ((number - 1) / 12) == bet.BetParameter) { return(3); } break; case BetType.Colonnes: if (number != 0 && ((number - 1) % 3) == bet.BetParameter) { return(3); } break; case BetType.TransversalePlein: if (number != 0 && ((number - 1) / 3) == bet.BetParameter) { return(12); } break; case BetType.TransversaleSimple: if (number != 0 && (((number - 1) / 3) == bet.BetParameter || ((number - 1) / 3) == bet.BetParameter + 1)) { return(6); } break; case BetType.LesQuatre: if (number > 0 && number < 5) { return(9); } break; case BetType.LesCinq: if (number > 0 && number < 6) { return(7); } break; } return(0); }