X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=spades.awk;h=2ca0e376e7fbe7e975ca67d5a78defe5c1ccddff;hb=c6a935c7f7fe2d6ce72268f9ecfe5e9469302d0a;hp=a68db4a5a0e52f23557e3552f08561ea6d196059;hpb=6eac07af1ef9ef8c977778e0209e74a6d8f1f267;p=~andy%2Frhawk diff --git a/spades.awk b/spades.awk index a68db4a..2ca0e37 100644 --- a/spades.awk +++ b/spades.awk @@ -57,6 +57,11 @@ function sp_reset(type) delete sp_order # [i] Player order order[i] -> "name" delete sp_scores # [i] Teams score } + + # Persistent + if (type >= 3) { + delete sp_notify # [p] E-mail notification address + } } function sp_acopy(dst, src, key) @@ -98,6 +103,7 @@ function sp_save(file, game) json_copy(game, "share", sp_share); json_copy(game, "order", sp_order); json_copy(game, "scores", sp_scores); + json_copy(game, "notify", sp_notify); # Save json_save(file, game); @@ -137,6 +143,7 @@ function sp_load(file, game) sp_acopy(sp_share, game["share"]); sp_acopy(sp_order, game["order"]); sp_acopy(sp_scores, game["scores"]); + sp_acopy(sp_notify, game["notify"]); } function sp_pretty(cards, who) @@ -182,7 +189,7 @@ function sp_deal( shuf) sp_dealer = (sp_dealer+1)%4 sp_turn = sp_dealer sp_player = sp_order[sp_turn] - say("Bidding starts with " sp_player "!") + say(sp_player ": you bid first!") } function sp_hand(to, who, sort, str) @@ -299,9 +306,9 @@ function sp_score( bids, times, tricks) (sp_tricks[i] == 0 ? 1 : -1) } if (sp_scores[0] > sp_scores[1]) - say(sp_team(0) " lead " sp_scores[0] " to " sp_scores[1]) + say(sp_team(0) " lead " sp_scores[0] " to " sp_scores[1] " of " sp_playto) else if (sp_scores[1] > sp_scores[0]) - say(sp_team(1) " lead " sp_scores[1] " to " sp_scores[0]) + say(sp_team(1) " lead " sp_scores[1] " to " sp_scores[0] " of " sp_playto) else say("tied at " sp_scores[0]) } @@ -395,6 +402,10 @@ AUTH == OWNER && } # Help +/^\.help$/ { + say(".help spades -- play a game of spades") +} + /^\.help [Ss]pades$/ { say("Spades -- play a game of spades") say(".help game -- setup and administer the game") @@ -429,6 +440,7 @@ AUTH == OWNER && say(".allow [who] -- allow another person to play on your behalf") say(".deny [who] -- prevent a previously allowed user from playing") say(".show -- display which users can play for which players") + say(".notify [addr] -- email user when it is their turn") next } @@ -461,12 +473,12 @@ sp_state == "play" && # Setup -match($0, /^\.newgame ?([0-9]+) *- *([0-9]+)$/, _arr) { +match($0, /^\.newgame ?([1-9][0-9]*) *- *([1-9][0-9]*)$/, _arr) { if (_arr[2] > _arr[1]) $0 = $1 " " int(rand() * (_arr[2]-_arr[1])+_arr[1]) } -/^\.newgame ?([0-9]+)?$/ { +/^\.newgame ?([1-9][0-9]*)?$/ { if (sp_state != "new") { reply("There is already a game in progress.") } else { @@ -559,6 +571,29 @@ match($0, /^\.newgame ?([0-9]+) *- *([0-9]+)$/, _arr) { } } +/^\.notify$/ { + if (sp_from in sp_notify) + reply("Your address is " sp_notify[sp_from]) + else + reply("Your address is not set") +} + +/^\.notify clear$/ { + if (sp_from in sp_notify) { + reply("Removing address " sp_notify[sp_from]) + delete sp_notify[sp_from] + } else { + reply("Your address is not set") + } +} + +/^\.notify \S+@\S+.\S+$/ { + _addr = $2 + gsub(/[^a-zA-Z0-9_+@.-]/, "", _addr) + sp_notify[sp_from] = _addr + reply("Notifying you at " _addr) +} + sp_state ~ "(bid|pass|play)" && /^\.show/ { delete _lines @@ -579,9 +614,9 @@ sp_state ~ "(bid|pass|play)" && sp_valid && sp_state == "bid" && -/^\.bid [0-9]+$/ { +/^\.bid (0|[1-9][0-9]*)$/ { if ($2 < 0 || $2 > 13) { - say("You can only bid from 0 to 13") + reply("You can only bid from 0 to 13") } else { i = sp_next() sp_bids[i] = $2 @@ -595,7 +630,7 @@ sp_state == "bid" && sp_nil[i] = 0 } if (sp_turn != sp_dealer) { - say("Bidding goes to " sp_player "!") + say(sp_player ": it is your bid! (" sp_bidders() ")") } else { for (p in sp_players) say(p, "You have: " sp_hand(p, p)) @@ -608,7 +643,7 @@ sp_state == "bid" && } } if (sp_state == "play") - say("Play starts with " sp_player "!") + say(sp_player ": you have the opening lead!") } } } @@ -648,7 +683,8 @@ sp_state == "pass" && delete sp_hands[sp_order[i]][_card] sp_hands[sp_order[_partner]][_card] = 1 } - say(sp_channel, "Cards have been passed, play starts with " sp_player "!") + say(sp_channel, "Cards have been passed!") + say(sp_channel, sp_player ": you have the opening lead!") for (p in sp_players) say(p, "You have: " sp_hand(p, p)) sp_state = "play" @@ -701,19 +737,40 @@ sp_state == "play" && /^\.bids/ && sp_state == "bid" || /^\.turn/ && sp_state ~ "(bid|pass|play)" { - _bids = sp_bidders() - _pile = sp_pretty(sp_piles, FROM) + _bids = sp_bidders() + _pile = sp_pretty(sp_piles, FROM) + _extra = "" + + for (_i in sp_share) + if (/!/ && sp_share[_i] == sp_player) + _extra = _extra " " _i "!" + if (sp_state == "bid" && !_bids) - say("It is " sp_player "'s bid!") + say("It is " sp_player "'s bid!" _extra) if (sp_state == "bid" && _bids) - say("It is " sp_player "'s bid! (" _bids ")") + say("It is " sp_player "'s bid!" _extra " (" _bids ")") if (sp_state == "play" && !_pile) - say("It is " sp_player "'s turn!") + say("It is " sp_player "'s turn!" _extra) if (sp_state == "play" && _pile) - say("It is " sp_player "'s turn! (" _pile ")") + say("It is " sp_player "'s turn!" _extra " (" _pile ")") + for (_i=0; sp_state == "pass" && _i<4; _i++) if (sp_passer(_i) && !sp_pass[_i]) say("Waiting for " sp_order[_i] " to pass a card!") + + if (/!!/ && (sp_state == "bid" || sp_state == "play")) { + if (sp_player in sp_notify) { + _bids = _bids ? _bids : "none" + _pile = _pile ? sp_piles : "none" + mail_send(sp_notify[sp_player], \ + "It is your " sp_state "!", \ + "Bids so far: " _bids "\n" \ + "Cards played: " _pile) + say("Notified " sp_player " at " sp_notify[sp_player]) + } else { + say("No email address for " sp_player) + } + } } /^\.bids$/ && sp_state ~ "(pass|play)" { @@ -757,6 +814,6 @@ sp_state == "play" && } } -/^\.((new|end|load)game|join|look|bid|pass|play)/ { +/^\.((new|end|load)game|join|look|bid|pass|play|notify)/ { sp_save("var/sp_cur.json"); }