diff --git a/Core/Rooms/GameRooms/Lottso2Room.cs b/Core/Rooms/GameRooms/Lottso2Room.cs new file mode 100644 index 0000000..d139094 --- /dev/null +++ b/Core/Rooms/GameRooms/Lottso2Room.cs @@ -0,0 +1,65 @@ +namespace NotPogo.Core.Rooms.GameRooms +{ + [GameRoom("lottso2")] + public class Lottso2Room : IGameRoom + { + public Task OnGameJoinAsync(Room room, Player player) + { + // TODO - implement multiplayer + return Task.CompletedTask; + } + + public Task OnMessageAsync(Room room, Player player, string op, Dictionary msg) + { + return op switch + { + "ext.over" => HandleResults(player, msg), + _ => Task.FromResult(false), + }; + } + + private static async Task HandleResults(Player player, Dictionary msg) + { + // determine jackpot win + msg.TryGetValue("gm.won", out var won); + bool isJackpot = won == "true"; + + // send ext.rslt + await player.SendAsync( + ("msg.op", "ext.rslt"), + ("tokb", "9999"), + ("tokn.won", TCPProtocol.ParseInlineMap(msg["tokn.won"])["allt"].ToString()), + ("spin.rslt", isJackpot ? "2" : "0"), + ("spin.tokn", isJackpot ? Random.Shared.Next(0, 500).ToString() : "0"), + ("inst.desc", ""), + ("jpot", "0"), + ("pzpm", ""), + ("bmlt", "1"), + ("bspo", "0"), + ("xpup", "0") + ); + + // CDL games require more for the results screen + + await player.SendAsync( + ("msg.op", "ext.rank"), + ("rank.ord", "1"), ("rank.nam", "Rookie"), ("rank.pts", "0"), + ("rank.nord", "2"), ("rank.nnam", "Novice"), ("rank.npts", "100"), + ("rank.ppts", "0"), ("rank.incr", "0"), ("rank.new", "false") + ); + + await player.SendAsync( + ("msg.op", "cdl.awar"), + ("nava", "false"), ("ilvl", "0"), + ("nbad", "false"), ("badg", "0"), + ("ainf", "") + ); + + return true; + } + + public Task OnPlayerJoinedAsync(Room room, Player player) => Task.CompletedTask; + + public Task OnPlayerLeftAsync(Room room, Player player) => Task.CompletedTask; + } +} diff --git a/NotPogo.csproj b/NotPogo.csproj index d4914a8..ac5b2b4 100644 --- a/NotPogo.csproj +++ b/NotPogo.csproj @@ -7,7 +7,6 @@ - diff --git a/TCPGameServer.cs b/TCPGameServer.cs index 2236d38..2911e3a 100644 --- a/TCPGameServer.cs +++ b/TCPGameServer.cs @@ -142,23 +142,6 @@ namespace NotPogo return TCPProtocol.WriteMessageAsync(stream, msg); } - static Dictionary ParseInlineMap(string raw) - { - var result = new Dictionary(); - if (string.IsNullOrEmpty(raw)) return result; - - var trimmed = raw.Trim('{', '}'); - foreach(var pair in trimmed.Split(',')) - { - var kv = pair.Split('='); - if(kv.Length != 2) continue; - var key = kv[0].Trim(); - if (int.TryParse(kv[1].Trim(), out int value)) - result[key] = value; - } - return result; - } - public override Task StopAsync(CancellationToken cancellationToken) { if(!cancellationToken.IsCancellationRequested) diff --git a/TCPProtocol.cs b/TCPProtocol.cs index 6b8e8f1..03741df 100644 --- a/TCPProtocol.cs +++ b/TCPProtocol.cs @@ -55,6 +55,23 @@ namespace NotPogo await stream.FlushAsync(); } + public static Dictionary ParseInlineMap(string raw) + { + var result = new Dictionary(); + if (string.IsNullOrEmpty(raw)) return result; + + var trimmed = raw.Trim('{', '}'); + foreach (var pair in trimmed.Split(',')) + { + var kv = pair.Split('='); + if (kv.Length != 2) continue; + var key = kv[0].Trim(); + if (int.TryParse(kv[1].Trim(), out int value)) + result[key] = value; + } + return result; + } + private static async Task ReadUInt16BEAsync(NetworkStream stream) { byte[] buf = await ReadExactAsync(stream, 2);