X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=spades.awk;h=cf21935f8240ccc025b24e714829942d852ee5b1;hb=refs%2Fheads%2Flast;hp=a010c0f0d610fd6ff31b863996d136ce2c50a427;hpb=e2d9de9f6dd3333bef7e3ca7c3dec94e8032f54f;p=~andy%2Frhawk diff --git a/spades.awk b/spades.awk index a010c0f..cf21935 100644 --- a/spades.awk +++ b/spades.awk @@ -33,6 +33,7 @@ function sp_reset(type) if (type >= 1) { sp_state = "bid" # {new,join,bid,pass,play} sp_broken = 0 # Whether spades are broken + delete sp_last # [x] The result of the last hand delete sp_hands # [p] Each players cards delete sp_looked # [i] Whether a player has looked a their cards delete sp_bids # [i] Each players bid @@ -57,6 +58,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) @@ -78,6 +84,7 @@ function sp_save(file, game) # Per round game["state"] = sp_state; game["broken"] = sp_broken; + json_copy(game, "last", sp_last); json_copy(game, "looked", sp_looked); json_copy(game, "bids", sp_bids); json_copy(game, "nil", sp_nil); @@ -98,6 +105,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); @@ -117,6 +125,7 @@ function sp_load(file, game) # Per round sp_state = game["state"]; sp_broken = game["broken"]; + sp_acopy(sp_last, game["last"]); sp_acopy(sp_looked, game["looked"]); sp_acopy(sp_bids, game["bids"]); sp_acopy(sp_nil, game["nil"]); @@ -137,6 +146,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) @@ -327,6 +337,8 @@ function sp_play(card, winner, pi) sp_tricks[pi]++ say(sp_pile[winner] " wins with " sp_pretty(winner, FROM) \ " (" sp_pretty(sp_piles, FROM) ")") + sp_last["player"] = sp_pile[winner]; + sp_last["pile"] = sp_piles; sp_next(sp_pile[winner]) sp_reset(0) } @@ -421,6 +433,7 @@ AUTH == OWNER && say(".bid [n] -- bid for tricks") say(".pass [card] -- pass a card to your partner") say(".play [card] -- play a card") + say(".last -- show who took the previous trick") say(".turn -- check whose turn it is") say(".bids -- check what everyone bid") say(".tricks -- check how many trick have been taken") @@ -433,6 +446,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 } @@ -563,6 +577,29 @@ match($0, /^\.newgame ?([1-9][0-9]*) *- *([1-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 @@ -678,9 +715,6 @@ sp_state == "play" && if (!(_card in sp_deck)) { reply("Invalid card") } - else if (!(_card in sp_hands[sp_from])) { - reply("You do not have that card") - } else if (sp_suit && _card !~ sp_suit && sp_hasa(sp_from, sp_suit)) { reply("You must follow suit (" sp_suit ")") } @@ -690,6 +724,9 @@ sp_state == "play" && else if (_card ~ /s/ && length(sp_pile) == 0 && sp_hasa(sp_from, "[^s]$") && !sp_broken) { reply("Spades have not been broken") } + else if (!(_card in sp_hands[sp_from])) { + reply("You do not have that card") + } else { sp_play(_card) if (sp_state == "play") { @@ -704,6 +741,14 @@ sp_state == "play" && } } +/^\.last/ && sp_state == "play" { + if (!isarray(sp_last)) + say("No tricks have been taken!"); + else + say(sp_last["player"] " took " \ + sp_pretty(sp_last["hand"], FROM)); +} + /^\.bids/ && sp_state == "bid" || /^\.turn/ && sp_state ~ "(bid|pass|play)" { _bids = sp_bidders() @@ -726,6 +771,20 @@ sp_state == "play" && 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)" { @@ -769,6 +828,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"); }