.slot should now show correct messages if multipliers are changed in the config

This commit is contained in:
Kwoth
2022-07-13 04:01:56 +02:00
parent 251d5a4df4
commit f3ed14de5b
6 changed files with 53 additions and 55 deletions

View File

@@ -8,21 +8,44 @@ public class SlotGame
{ {
var rolls = new[] { _rng.Next(0, 6), _rng.Next(0, 6), _rng.Next(0, 6) }; var rolls = new[] { _rng.Next(0, 6), _rng.Next(0, 6), _rng.Next(0, 6) };
var multi = 0; var multi = 0;
var winType = SlotWinType.None;
if (rolls.All(x => x == 5)) if (rolls.All(x => x == 5))
{
winType = SlotWinType.TrippleJoker;
multi = 30; multi = 30;
}
else if (rolls.All(x => x == rolls[0])) else if (rolls.All(x => x == rolls[0]))
{
winType = SlotWinType.TrippleNormal;
multi = 10; multi = 10;
}
else if (rolls.Count(x => x == 5) == 2) else if (rolls.Count(x => x == 5) == 2)
{
winType = SlotWinType.DoubleJoker;
multi = 4; multi = 4;
}
else if (rolls.Any(x => x == 5)) else if (rolls.Any(x => x == 5))
{
winType = SlotWinType.SingleJoker;
multi = 1; multi = 1;
}
return new() return new()
{ {
Won = bet * multi, Won = bet * multi,
WinType = winType,
Multiplier = multi, Multiplier = multi,
Rolls = rolls, Rolls = rolls,
}; };
} }
} }
public enum SlotWinType : byte
{
None,
SingleJoker,
DoubleJoker,
TrippleNormal,
TrippleJoker,
}

View File

@@ -5,4 +5,5 @@ public readonly struct SlotResult
public decimal Multiplier { get; init; } public decimal Multiplier { get; init; }
public int[] Rolls { get; init; } public int[] Rolls { get; init; }
public decimal Won { get; init; } public decimal Won { get; init; }
public SlotWinType WinType { get; init; }
} }

View File

@@ -13,31 +13,11 @@ using NadekoBot.Services.Database.Models;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
using Nadeko.Common;
namespace NadekoBot.Modules.Gambling; namespace NadekoBot.Modules.Gambling;
public partial class Gambling : GamblingModule<GamblingService> public partial class Gambling : GamblingModule<GamblingService>
{ {
public enum RpsPick
{
R = 0,
Rock = 0,
Rocket = 0,
P = 1,
Paper = 1,
Paperclip = 1,
S = 2,
Scissors = 2
}
public enum RpsResult
{
Win,
Loss,
Draw
}
private readonly IGamblingService _gs; private readonly IGamblingService _gs;
private readonly DbService _db; private readonly DbService _db;
private readonly ICurrencyService _cs; private readonly ICurrencyService _cs;
@@ -668,17 +648,13 @@ public partial class Gambling : GamblingModule<GamblingService>
return; return;
} }
var result = await _gs.BetRollAsync() var maybeResult = await _gs.BetRollAsync(ctx.User.Id, amount);
if (!) if (!maybeResult.TryPickT0(out var result, out _))
{ {
await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign)); await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign));
return; return;
} }
var br = new BetrollGame(Config.BetRoll);
var result = br.Roll();
var win = (long)result.Won; var win = (long)result.Won;
var str = Format.Bold(ctx.User.ToString()) + Format.Code(GetText(strs.roll(result.Roll))); var str = Format.Bold(ctx.User.ToString()) + Format.Code(GetText(strs.roll(result.Roll)));
if (win > 0) if (win > 0)
@@ -776,6 +752,7 @@ public partial class Gambling : GamblingModule<GamblingService>
opts.Clean); opts.Clean);
} }
// todo check if trivia is being disposed
[Cmd] [Cmd]
public async partial Task Rps(RpsPick pick, ShmartNumber amount = default) public async partial Task Rps(RpsPick pick, ShmartNumber amount = default)
{ {
@@ -803,7 +780,7 @@ public partial class Gambling : GamblingModule<GamblingService>
if (amount > 0) if (amount > 0)
{ {
if (!await _cs.RemoveAsync(ctx.User.Id, amount, new("rps", "bet", ""))) if (!await _cs.RemoveAsync(ctx.User.Id, amount, new("rps", "bet")))
{ {
await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign)); await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign));
return; return;
@@ -847,16 +824,15 @@ public partial class Gambling : GamblingModule<GamblingService>
if (!await CheckBetMandatory(amount)) if (!await CheckBetMandatory(amount))
return; return;
if (!await _cs.RemoveAsync(ctx.User.Id, amount, new("wheel", "bet"))) var res = await _gs.WofAsync(ctx.User.Id, amount);
if (!res.TryPickT0(out var result, out _))
{ {
await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign)); await ReplyErrorLocalizedAsync(strs.not_enough(CurrencySign));
return; return;
} }
var result = await _service.WheelOfFortuneSpinAsync(ctx.User.Id, amount);
var wofMultipliers = Config.WheelOfFortune.Multipliers; var wofMultipliers = Config.WheelOfFortune.Multipliers;
await SendConfirmAsync(Format.Bold($@"{ctx.User} won: {N(result.Amount)} await SendConfirmAsync(Format.Bold($@"{ctx.User} won: {N(result.Won)}
『{wofMultipliers[1]}』 『{wofMultipliers[0]}』 『{wofMultipliers[7]}』 『{wofMultipliers[1]}』 『{wofMultipliers[0]}』 『{wofMultipliers[7]}』

View File

@@ -0,0 +1,14 @@
#nullable disable
namespace NadekoBot.Modules.Gambling;
public enum RpsPick
{
R = 0,
Rock = 0,
Rocket = 0,
P = 1,
Paper = 1,
Paperclip = 1,
S = 2,
Scissors = 2
}

View File

@@ -19,11 +19,6 @@ public enum GamblingError
InsufficientFunds, InsufficientFunds,
} }
// public interface ISlotService
// {
// ValueTask<OneOf<SlotResult, SlotError>> PullAsync(ulong userId, long amount);
// }
public partial class Gambling public partial class Gambling
{ {
[Group] [Group]
@@ -204,18 +199,15 @@ public partial class Gambling
bgImage.Mutate(x => x.DrawImage(img, new Point(148 + (105 * i), 217), 1f)); bgImage.Mutate(x => x.DrawImage(img, new Point(148 + (105 * i), 217), 1f));
} }
var msg = GetText(strs.better_luck); var multi = result.Multiplier.ToString("0.##");
if (result.Multiplier > 0) var msg = result.WinType switch
{ {
if (Math.Abs(result.Multiplier - 1M) <= decimal.) SlotWinType.SingleJoker => GetText(strs.slot_single(CurrencySign, multi)),
msg = GetText(strs.slot_single(CurrencySign, 1)); SlotWinType.DoubleJoker => GetText(strs.slot_two(CurrencySign, multi)),
else if (Math.Abs(result.Multiplier - 4M) < float.Epsilon) SlotWinType.TrippleNormal => GetText(strs.slot_three(multi)),
msg = GetText(strs.slot_two(CurrencySign, 4)); SlotWinType.TrippleJoker => GetText(strs.slot_jackpot(multi)),
else if (Math.Abs(result.Multiplier - 10M) <= float.Epsilon) _ => GetText(strs.better_luck),
msg = GetText(strs.slot_three(10)); };
else if (Math.Abs(result.Multiplier - 30M) <= float.Epsilon)
msg = GetText(strs.slot_jackpot(30));
}
await using (var imgStream = await bgImage.ToStreamAsync()) await using (var imgStream = await bgImage.ToStreamAsync())
{ {

View File

@@ -1,8 +0,0 @@
#nullable disable
namespace NadekoBot.Modules.Gambling;
public enum OldGamblingError
{
None,
NotEnough
}