diff --git a/exec/ircbots/poker/poker_commands.js b/exec/ircbots/poker/poker_commands.js index 4f4207b48b6439642bb1114e565bee3a5579e0fe..4f4924e6312221bc240d8c3ddb08892e6919b9df 100644 --- a/exec/ircbots/poker/poker_commands.js +++ b/exec/ircbots/poker/poker_commands.js @@ -44,18 +44,14 @@ Bot_Commands["GO"].command = function (target,onick,ouh,srv,lvl,cmd) { Bot_Commands["FOLD"] = new Bot_Command(0,false,false); Bot_Commands["FOLD"].command = function (target,onick,ouh,srv,lvl,cmd) { - if(!poker_verify_game_status(target,srv,onick)) return; - - poker_games[target].bet+=poker_games[target].users[onick].bet; - poker_games[target].users[onick].active=false; - srv.o(target, onick + " folded their hand."); - poker_next_turn(target,srv); + if(!poker_verify_user_status(target,srv,onick)) return; + poker_fold_player(target,srv,onick); return; } Bot_Commands["CHECK"] = new Bot_Command(0,false,false); Bot_Commands["CHECK"].command = function (target,onick,ouh,srv,lvl,cmd) { - if(!poker_verify_game_status(target,srv,onick)) return; + if(!poker_verify_user_status(target,srv,onick)) return; var poker=poker_games[target]; var current_player=poker.users[onick]; if(poker.current_bet>current_player.bet) { @@ -70,7 +66,7 @@ Bot_Commands["CHECK"].command = function (target,onick,ouh,srv,lvl,cmd) { Bot_Commands["BET"] = new Bot_Command(0,false,false); Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) { - if(!poker_verify_game_status(target,srv,onick)) return; + if(!poker_verify_user_status(target,srv,onick)) return; if(!cmd[1]) { srv.o(onick,"You must specify an amount to bet!","NOTICE"); return; @@ -88,8 +84,8 @@ Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) { srv.o(onick,"You don't have that much money! Balance: $" + poker.users[onick].money,"NOTICE"); return; } - if(cmd[1]<poker.current_bet) { - srv.o(onick,"You must meet the minimum bet! Minimum bet: $" + poker.current_bet,"NOTICE"); + if(cmd[1]<poker.min_bet) { + srv.o(onick,"Your bet must meet the minimum! Minimum bet: $" + poker.min_bet,"NOTICE"); return; } srv.o(target,onick + " bets $" + cmd[1]); @@ -103,20 +99,21 @@ Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) { Bot_Commands["CALL"] = new Bot_Command(0,false,false); Bot_Commands["CALL"].command = function (target,onick,ouh,srv,lvl,cmd) { - if(!poker_verify_game_status(target,srv,onick)) return; + if(!poker_verify_user_status(target,srv,onick)) return; var poker=poker_games[target]; var current_player=poker.users[onick]; - if(poker.current_bet<=current_player.bet) { + if(poker.current_bet==current_player.bet) { srv.o(target,onick + " checks."); } else if(poker.current_bet>current_player.money+current_player.bet) { srv.o(onick,"You don't have enough to call!","NOTICE"); srv.o(onick,"Balance: $" + current_player.money,"NOTICE"); return; } else { + var difference=poker.current_bet-current_player.bet; srv.o(target,onick + " calls the bet: $" + poker.current_bet); - current_player.money-=poker.current_bet; - current_player.bet+=poker.current_bet; + current_player.money-=difference; + current_player.bet+=difference; srv.o(onick,"Balance: $" + current_player.money,"NOTICE"); } poker_next_turn(target,srv); @@ -125,7 +122,7 @@ Bot_Commands["CALL"].command = function (target,onick,ouh,srv,lvl,cmd) { Bot_Commands["RAISE"] = new Bot_Command(0,false,false); Bot_Commands["RAISE"].command = function (target,onick,ouh,srv,lvl,cmd) { - if(!poker_verify_game_status(target,srv,onick)) return; + if(!poker_verify_user_status(target,srv,onick)) return; var bet=Number(cmd[1]); if(!bet) { srv.o(onick,"You must specify an amount to raise!","NOTICE"); @@ -140,14 +137,16 @@ Bot_Commands["RAISE"].command = function (target,onick,ouh,srv,lvl,cmd) { return; } var poker=poker_games[target]; - if(poker.current_bet+bet>poker.users[onick].money) { + var difference=poker.current_bet-poker.users[onick].bet; + if(difference+bet>poker.users[onick].money) { srv.o(onick,"You don't have that much money! Balance: $" + poker.users[onick].money,"NOTICE"); return; } - srv.o(target,onick + " raises the bet to $" + (poker.current_bet+bet)); poker.users[onick].money-=bet; + poker.users[onick].bet+=difference; poker.users[onick].bet+=bet; poker.current_bet+=bet; + srv.o(target,onick + " raises the bet to $" + (poker.current_bet)); srv.o(onick,"Balance: $" + poker.users[onick].money,"NOTICE"); poker_next_turn(target,srv); return; @@ -217,3 +216,14 @@ Bot_Commands["HOLE"].command = function (target,onick,ouh,srv,lvl,cmd) { ,"NOTICE"); } +Bot_Commands["INVITE"] = new Bot_Command(0,1,false); +Bot_Commands["INVITE"].command = function (target,onick,ouh,srv,lvl,cmd) { + cmd.shift(); + if(srv.users[cmd[0].toUpperCase()]) { + srv.o(target,cmd[0] + " is already here!"); + return; + } + srv.o(cmd[0],onick + " invited you to play poker in " + target + + "! /J " + target + " to join."); + return; +} diff --git a/exec/ircbots/poker/poker_functions.js b/exec/ircbots/poker/poker_functions.js index d32e393afa6623c2fc5cee1614fd207fff7ab693..a4cc1f7da06f80a3efa2ef68a57fab1cea803548 100644 --- a/exec/ircbots/poker/poker_functions.js +++ b/exec/ircbots/poker/poker_functions.js @@ -15,8 +15,17 @@ function poker_deal_hole_cards(target,srv) { function poker_next_turn(target,srv) { var poker=poker_games[target]; - poker.turn=get_next_player(poker.users_map,poker.turn); + var current_turn=poker.turn; + poker.users[poker.users_map[current_turn]].has_bet=true; + poker.turn=get_next_player(poker,poker.turn); + var next_turn_user=poker.users[poker.users_map[poker.turn]]; + if(poker_count_active_players(poker)==1) { + poker.round=3; + poker.deal_next=true; + } else if(poker.current_bet==next_turn_user.bet && next_turn_user.has_bet) { + poker.deal_next=true; + } if(poker.deal_next) { poker_load_pot(poker); switch(++poker.round) { @@ -36,20 +45,53 @@ function poker_next_turn(target,srv) { poker.current_bet=0; poker.deal_next=false; if(poker.round<4) { + poker.turn=get_next_player(poker,poker.dealer); poker_game_status(target,srv); } - } else { - var turn_user=poker.users[poker.users_map[poker.turn]]; - if(poker.current_bet==turn_user.bet) poker.deal_next=true; } if(poker.round<4) { poker_prompt_player(target,srv); } } -function get_next_player(map,turn) { +function poker_count_active_players(poker_game) { + var count=0; + for(var u in poker_game.users) { + if(poker_game.users[u].active) count++; + } + return count; +} + +function poker_verify_game_status(poker_game) { + var active_users=false; + for(var u in srv.users) { + if(poker.users[u] && poker.users[u].active) { + if(time()-srv.users[u].last_spoke<activity_timeout){ + active_users=true; + break; + } else { + delete poker.users[u]; + srv.o(u,"You have been idle too long. " + + "Type 'DEAL' here to resume playing poker.", "NOTICE"); + } + } + } + if(!active_users) return; +} + +function poker_fold_player(target,srv,onick) { + poker_games[target].pot+=poker_games[target].users[onick].bet; + poker_games[target].users[onick].active=false; + srv.o(target, onick + " folded their hand."); + poker_next_turn(target,srv); +} + +function get_next_player(poker_game,turn) { turn++; - if(turn==map.length) turn=0; + if(turn==poker_game.users_map.length) turn=0; + if(!poker_game.users[poker_game.users_map[turn]].active) { + turn=get_next_player(poker_game,turn); + } return turn; } @@ -59,14 +101,16 @@ function poker_compare_hands(target,srv) { var winning_player=-1; for(var p in poker.users) { var player=poker.users[p]; - var hand=poker.community_cards.concat(player.cards) - var rank=Rank(hand); - if(rank>winning_hand) { - winning_hand=rank; - winning_player=p; + if(player.active) { + var hand=poker.community_cards.concat(player.cards) + var rank=Rank(hand); + if(rank>winning_hand) { + winning_hand=rank; + winning_player=p; + } } } - srv.o(target,winning_player + " won this hand with " + RANKS[winning_hand]); + srv.o(target,winning_player + " won this hand! Winnings: $" + poker.pot); poker.users[winning_player].money+=poker.pot; poker.winner=winning_player; @@ -97,6 +141,7 @@ function poker_load_pot(poker_game) { for(var p in poker_game.users) { poker_game.pot+=poker_game.users[p].bet; poker_game.users[p].bet=0; + poker_game.users[p].has_bet=false; } return; } @@ -109,7 +154,7 @@ function poker_prompt_player(target,srv) { srv.o(turn,"It is your turn. Minimum bet to call: $" + min_bet,"NOTICE"); } -function poker_verify_game_status(target,srv,onick) { +function poker_verify_user_status(target,srv,onick) { var poker=poker_games[target]; if (!poker) { srv.o(target, "No poker game in progress. Type '" + get_cmd_prefix() @@ -138,15 +183,15 @@ function poker_init_hand(target,srv) { for(var u in poker.users) { poker.users_map.push(u); } - var small_blind=get_next_player(poker.users_map,poker.dealer); - var large_blind=get_next_player(poker.users_map,small_blind); + var small_blind=get_next_player(poker,poker.dealer); + var large_blind=get_next_player(poker,small_blind); srv.o(target,poker.users_map[poker.dealer] + " is the dealer for this hand."); poker.users[poker.users_map[small_blind]].bet+=poker.sm_blind; srv.o(target,"Small blind: " + poker.users_map[small_blind] + " $" + poker.sm_blind); poker.users[poker.users_map[large_blind]].bet+=poker.lg_blind; srv.o(target,"Large blind: " + poker.users_map[large_blind] + " $" + poker.lg_blind); - + poker.turn=get_next_player(poker,large_blind); poker.min_bet=poker.lg_blind; } @@ -168,6 +213,9 @@ function poker_game_status(target,srv) { var state=""; var cards=""; + for(var c in poker.community_cards) { + if(poker.community_cards[c]) cards+=poker_show_card(poker.community_cards[c]); + } switch(poker.round) { case -1: state="Status: waiting for players"; @@ -176,13 +224,13 @@ function poker_game_status(target,srv) { state="Status: First round betting"; break; case 1: - state="The Flop: "; + state="The Flop: " + cards; break; case 2: - state="The Turn: "; + state="The Turn: " + cards; break; case 3: - state="The River: "; + state="The River: " + cards; break; case 4: state="Hand complete. Winner: " + poker.winner; @@ -190,15 +238,12 @@ function poker_game_status(target,srv) { default: break; } - for(var c in poker.community_cards) { - if(poker.community_cards[c]) cards+=poker_show_card(poker.community_cards[c]); - } - if(poker.round>=0) { + if(poker.round>=0 && poker.round<4) { srv.o(target,"Current pot: $" + poker.pot); srv.o(target,"Current bet: $" + poker.current_bet); srv.o(target,"Current turn: " + poker.users_map[poker.turn]); } - srv.o(target,state + cards); + srv.o(target,state); } function poker_reset_game(target,srv) { @@ -207,9 +252,11 @@ function poker_reset_game(target,srv) { poker.users[u].cards=[]; poker.users[u].bet=0; poker.users[u].active=true; + poker.users[u].has_bet=false; } - poker.dealer=get_next_player(poker.users_map,poker.dealer); + poker.dealer=get_next_player(poker,poker.dealer); poker.round=-1; + poker.current_bet=poker.min_bet/2; poker.pot=0; } diff --git a/exec/ircbots/poker/pokerbot.js b/exec/ircbots/poker/pokerbot.js index 33c6acd4accbf37de49665606fabc29087c06338..d5e11fd2ed9556420d826d42bdbecfd805ec8cef 100644 --- a/exec/ircbots/poker/pokerbot.js +++ b/exec/ircbots/poker/pokerbot.js @@ -19,23 +19,15 @@ function main(srv,target) { var poker=poker_games[target]; if(!poker || poker.paused) return; - var active_users=false; for(var u in srv.users) { - if(poker.users[u]) { - if(time()-srv.users[u].last_spoke<activity_timeout){ - active_users=true; - break; - } else { - delete poker.users[u]; + if(poker.users[u] && poker.users[u].active) { + if(time()-srv.users[u].last_spoke>=activity_timeout){ + poker_fold_player(target,srv,u); srv.o(u,"You have been idle too long. " + "Type 'DEAL' here to resume playing poker.", "NOTICE"); } } } - if(!active_users) return; - - if(poker.cycle()) { - } } // Game objects @@ -44,11 +36,11 @@ function Poker_Game() this.last_update=0; this.turn=0; this.pot=0; - this.lg_blind=10; - this.sm_blind=5; this.dealer=0; - this.min_bet=this.sm_blind; + this.min_bet=10; this.current_bet=this.min_bet; + this.lg_blind=this.min_bet; + this.sm_blind=this.min_bet/2; this.round=-1; this.deck=new Deck(); this.community_cards=new Array(); @@ -71,6 +63,7 @@ function Poker_Player() this.cards=[]; this.money=100; this.bet=0; + this.has_bet=false; this.active=true; }