diff --git a/src/client/index.html b/src/client/index.html index 27918b7..fed2437 100644 --- a/src/client/index.html +++ b/src/client/index.html @@ -5,6 +5,10 @@ -

Hello, world

+

Poor Man's Blind Man's Poker

+ + + +
diff --git a/src/client/js.js b/src/client/js.js index fa2782c..a993044 100644 --- a/src/client/js.js +++ b/src/client/js.js @@ -6,7 +6,7 @@ class DB { } get(key) { - b = localStorage.getItem(key); + var b = localStorage.getItem(key); if (b) { b = JSON.parse(b); } else { @@ -16,7 +16,7 @@ class DB { } set(key, value) { - b = JSON.stringify(value); + var b = JSON.stringify(value); localStorage.setItem(key, b); } @@ -66,6 +66,17 @@ class Games { }); } + forUser(id, uid, cb) { + this.get(id, (game) => { + game.Players.forEach((player, idx) => { + if (player.ID == uid) { + cb(game.Players[idx]); + } + }); + games.update(id, game, (game) => {ui.drawGame(game)}); + }); + } + get(id, cb) { this.requests.get("/api/games/"+id, (text, status) => { if (status != 200) { @@ -97,11 +108,194 @@ class Games { } } -games = new Games() -games.create("id", console.log); -games.list((ids) => { - console.log(ids); - ids.forEach((id) => { - games.get(id, console.log); +class UI { + constructor(games) { + this.games = games; + this.ts = 0; + this.threshold = 2; + setInterval(() => { this.refresh() }, 2000); + } + + now() { + return new Date() / 1000; + } + + refresh() { + if (this.now() - this.ts < this.threshold) { + return; + } + this.games.get("id", (game) => { + this.drawGame(game); + }); + } + + drawGame(game) { + this.ts = this.now(); + var state = ` + ${game.Pot} + + `; + game.Players.forEach((player, seatnum) => { + if (player.ID != "") { + state += ``; + state += ` + ${player.Name} + ${player.Balance} + ${this.me(player) ? "?" : player.Card} + `; + if (this.me(player)) { + var myturn = seatnum == game.Turn + var disabled = (!player.Active || !myturn) ? "disabled" : ""; + state += ` +
+ + + + +
+ `; + } + state += `
`; + } + }); + state += "
"; + this.ele().innerHTML = state; + } + + me(player) { + return new DB().get("id") == player.ID + } + + clear() { + this.ele().innerHTML = ""; + } + + ele() { + return document.getElementById("game"); + } +} + +function uuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +class Deck { + constructor() { + this.cards = new Array(52); + } + + draw() { + while (true) { + var idx = Math.floor(Math.random() * 52); + if (!this.cards[idx]) { + this.cards[idx] = 1; + return idx; + } + } + } + + card(idx) { + var suit = idx % 4; + switch (suit) { + case 0: suit = "hearts"; break; + case 1: suit = "clubs"; break; + case 2: suit = "diamonds"; break; + case 3: suit = "spades"; break; + } + var num = idx % 13; + num += 2 + switch (num) { + case 10: num = "jack"; break; + case 11: num = "queen"; break; + case 12: num = "king"; break; + case 13: num = "ace"; break; + } + return `${num} of ${suit}`; + } +} + +function init() { + var db = new DB(); + if (!db.get("id")) { + db.set("id", uuid()); + } + if (!db.get("name")) { + var name = prompt("who are you?"); + db.set("name", name); + } + var id = db.get("id"); + var name = db.get("name"); + + games.create("id", () => { + games.update("id", { + Pot: "$0", + Players: [ + {ID: id, Name: name}, + ], + }, (game) => ui.drawGame(game)); }); -}); + + games.get("id", (game) => { + ui.drawGame(game); + }); +} + +function start() { + var db = new DB(); + var deck = new Deck() + var id = db.get("id"); + games.get("id", (game) => { + var myturn = 0; + var n = 0; + game.Players.forEach((player, idx) => { + myturn = player.ID == id ? idx : myturn; + if (player.Participating) { + n += 1; + game.Players[idx].Active = true; + game.Players[idx].Card = deck.draw(); + } + }); + if (n == 0) { + throw new Error("will not start game with no participants"); + } + game.Turn = myturn; + while (!game.Players[game.Turn].Participating) { + game.Turn = (game.Turn+1) % game.Players.length; + } + games.update("id", game, (game) => {ui.drawGame(game)}); + }); +} + +function join() { + var db = new DB(); + var id = db.get("id"); + games.forUser("id", id, (player) => { + player.Participating = true; + player.Active = false; + }); +} + +function drop() { + var db = new DB(); + var id = db.get("id"); + games.forUser("id", id, (player) => { + player.Participating = false; + player.Active = false; + }); +} + +function fold(ele) { +} + +function check(ele) { +} + +function raise(ele) { +} + +var games = new Games(); +var ui = new UI(games); +init() diff --git a/src/server/game.go b/src/server/game.go index 43458f4..c0fb8c6 100644 --- a/src/server/game.go +++ b/src/server/game.go @@ -12,14 +12,17 @@ type Players [16]Player type Game struct { Pot Currency + Turn int Players Players } type Player struct { - ID string - Name string - Card string - Balance Currency + ID string + Name string + Card int + Balance Currency + Active bool + Participating bool } type Currency int