Refactor betting logic and game state handling (#109)

scales bets if user doesn't have enough balance unless they're below 1KKK
fix for the ability to krash after the game is over guaranteeing a win
This commit is contained in:
alogindtractor
2026-04-18 20:31:12 -07:00
committed by GitHub
parent b4cd21da41
commit 3ab46bb4c7

View File

@@ -156,6 +156,7 @@ public class KasinoKrash : IDisposable
//any bets placed after this point will be cancelled, must wait until the last game finishes to start a new one. //any bets placed after this point will be cancelled, must wait until the last game finishes to start a new one.
TheGame.BetsAccepted = false; TheGame.BetsAccepted = false;
TheGame.KrashAccepted = true;
await SaveKrashState(TheGame); await SaveKrashState(TheGame);
//start the display of the game //start the display of the game
@@ -166,7 +167,7 @@ public class KasinoKrash : IDisposable
await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageUuid!); await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageUuid!);
var green = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KiwiFarmsGreenColor)).Value; var green = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KiwiFarmsGreenColor)).Value;
var red = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KiwiFarmsRedColor)).Value; var red = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KiwiFarmsRedColor)).Value;
msg = await _kfChatBot.SendChatMessageAsync($"[center][b][size=200][color=limegreen]{TheGame.CurrentMulti}x"); msg = await _kfChatBot.SendChatMessageAsync($"[center][b][size=200][color=limegreen]{Math.Truncate(TheGame.CurrentMulti*100)/100.0m}x");
var defaultGrowth = 0.01m; var defaultGrowth = 0.01m;
interval = TimeSpan.FromSeconds(0.1); interval = TimeSpan.FromSeconds(0.1);
timer = new PeriodicTimer(interval); timer = new PeriodicTimer(interval);
@@ -181,17 +182,31 @@ public class KasinoKrash : IDisposable
} }
//at this point the game crashes and everybody who did not cash out or pre bet on a multi will have balance subtracted, winners will be paid out. //at this point the game crashes and everybody who did not cash out or pre bet on a multi will have balance subtracted, winners will be paid out.
await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, $"[center][b][size=200][color={red}]{TheGame.FinalMulti}x"); await _kfChatBot.KfClient.EditMessageAsync(msg.ChatMessageUuid!, $"[center][b][size=200][color={red}]{TheGame.FinalMulti}x");
foreach (var bet in TheGame.Bets) TheGame.KrashAccepted = false;
while (TheGame.Bets.Count >= 1)
{ {
var freshBalance = await Money.GetGamblerEntityAsync(bet.Gambler.User.Id, ct: _ct); var bet = TheGame.Bets[0];
if (freshBalance?.Balance < bet.Wager) var freshBalance = (await Money.GetGamblerEntityAsync(bet.Gambler.User.Id, ct: _ct))!.Balance;
if (freshBalance < bet.Wager)
{ {
await _kfChatBot.SendChatMessageAsync( if (freshBalance < 1)
$"Forfeited {bet.Gambler.User.FormatUsername()} as they no longer have a sufficient balance for their wager", {
true, autoDeleteAfter: TimeSpan.FromSeconds(10)); await _kfChatBot.SendChatMessageAsync(
continue; $"{bet.Gambler.User.FormatUsername()}, bet nullified due to lack of balance.",
true, autoDeleteAfter: TimeSpan.FromSeconds(10));
}
else
{
//scale the bet
var ratio = freshBalance / bet.Wager;
bet.Wager *= ratio;
await _kfChatBot.SendChatMessageAsync(
$"{bet.Gambler.User.FormatUsername()}, due to your poor gambling skills, your bet was scaled down to {await bet.Wager.FormatKasinoCurrencyAsync()} to match your remaining balance.",
true, autoDeleteAfter: TimeSpan.FromSeconds(10));
continue;
}
} }
if (bet.Multi <= TheGame.FinalMulti && bet.Multi != -1) else if (bet.Multi <= TheGame.FinalMulti && bet.Multi != -1)
{ {
//you win //you win
var payout = bet.Multi * bet.Wager - bet.Wager; var payout = bet.Multi * bet.Wager - bet.Wager;
@@ -218,11 +233,12 @@ public class KasinoKrash : IDisposable
-bet.Wager, newBalance); -bet.Wager, newBalance);
} }
} }
TheGame.Bets.RemoveAt(0);
} }
HOUSE_EDGE = 0.98m; HOUSE_EDGE = 0.98m;
//now close the game //now close the game
await Task.Delay(5000, _ct); await Task.Delay(10000, _ct);
await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageUuid!); await _kfChatBot.KfClient.DeleteMessageAsync(msg.ChatMessageUuid!);
await RemoveKrashState(); await RemoveKrashState();
} }
@@ -265,6 +281,7 @@ public class KasinoKrash : IDisposable
public required GamblerDbModel Gambler{ get; set;} public required GamblerDbModel Gambler{ get; set;}
public required decimal Wager { get; set; } public required decimal Wager { get; set; }
public required decimal Multi { get; set; } public required decimal Multi { get; set; }
} }
public void Dispose() public void Dispose()
{ {