;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; zen UNO script verson 1.0 ;; ;; - by skauert © 2007 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Setup stuff ; ----------- alias uno_setup { ; Enable script? set %uno_opt_enable 1 ; Command character set %uno_opt_cmd . ; Colors set %uno_opt_c1 7 set %uno_opt_c2 14 ; Who's the super user? set %uno_opt_sop skauert ; Minimum amount of players set %uno_opt_minplayers 2 ; Show color letter in cards? set %uno_opt_showletter 0 ; Allow only the game starter to stop the game set %uno_opt_gamelock 1 ; Allow players to leave? set %uno_opt_allowleave 1 ; Make players who falsely call UNO draw 2 cards? set %uno_opt_penalize 1 ; Force players to play a card if they can? set %uno_opt_mustplay 1 ; Allow combos? set %uno_opt_combos 1 ; Allow cuts? set %uno_opt_cuts 1 ; How many full idle turns to allow before the player is kicked (0 to disable) set %uno_opt_forcekick 3 ; Time limit for playing a card? (Set to 0 to disable and any other value to adjust the time period) set %uno_opt_playtime 60 ; Time limit for game signups? (Set to 0 to disable and any other value to adjust the time period) set %uno_opt_signuptime 120 ; Just some cards (You probably don't want to change this) set %uno_opt_regcards 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 S S S D2 D2 D2 R R R set %uno_opt_speccards W W W W WD4 WD4 WD4 WD4 } ; Remotes ; ------- on *:text:$(%uno_opt_cmd $+ *):#: { if (%uno_opt_enable == 1) { var %command = $mid($$1, 2) if (%command == colortest) { uno_colortest $nick $chan } if (%command == config) { uno_config $nick $2- } if (%command == commands) { uno_commands $nick $chan } if (%command == startuno) { uno_start $nick $chan } if (%command == stopuno) { uno_stop $nick } if (%command == beginuno) { uno_begin $nick } if (%command == join) { uno_join $nick } if (%command == leave) { uno_leave $nick } if (%command == play) { uno_play $nick $2- } if (%command == uno) { uno_play $nick uno $2- } if (%command == draw) { uno_draw $nick } if (%command == pass) { uno_pass $nick } if (%command == turn) { uno_turn $nick } if (%command == showcards) { uno_showcards $nick } if (%command == count) { uno_count $nick } } } on *:nick: { if ($uno_findplayer($nick) != $null) { hadd $+(uno.players.,$hget(uno.players,$uno_findplayer($nick))) name $newnick } } ; System aliases ; -------------- alias uno_tablesize { var %name = $$1, %i = 1, %j = 0 while (%i <= $hget(%name).size) { if ($hget(%name,%i) == $null) { break } inc %i inc %j } return %j } alias uno_unsetvars { unset %uno_game_starter unset %uno_game_chan unset %uno_game unset %pid_uid unset %uno_cards_drawn unset %uno_cards_played unset %uno_current_player unset %uno_drawn unset %uno_reverse unset %uno_game_signup } alias uno_freetables { hfree -w uno.* } alias uno_findplayer { var %player = $$1, %i = 1 while (%i <= $uno_playercount) { if ($hget($+(uno.players.,$hget(uno.players,%i)),name) == %player) { return %i } inc %i } return $null } alias uno_addplayer { var %pid = $$1 hadd uno.players $calc($uno_playercount + 1) %pid } alias uno_delplayer { var %pid = $$1, %upid if ($hget(uno.players,%pid) != $null) { %upid = $hget(uno.players,%pid) hdel uno.players %pid hfree uno.players. $+ %upid } uno_ordertable } alias uno_ordertable { var %i = 1, %j = 1 hfree -w temp hmake temp while (%i <= $hget(uno.players).size) { if ($hget(uno.players,%i) != $null) { hadd temp %j $hget(uno.players,%i) inc %j } inc %i } hfree uno.players hmake uno.players %i = 1 while (%i <= $hget(temp).size) { hadd uno.players %i $hget(temp,%i) inc %i } } alias uno_playercount { var %i = 1 while ($hget(uno.players,%i) != $null) { inc %i } return $iif(%i == 1, 0, $calc(%i - 1)) } alias uno_makedeck { var %t = 1, %d = 1, %i hfree -w uno.cards hmake uno.cards 200 while (%d <= 4) { %i = 1 while (%i <= $gettok(%uno_opt_regcards,0,32)) { hadd uno.cards %t $iif(%d == 1, R_, $iif(%d == 2, G_, $iif(%d == 3, B_, $iif(%d == 4, Y_, 0_)))) $+ $gettok(%uno_opt_regcards,%i,32) inc %i inc %t } inc %d } %i = 1 while (%i <= $gettok(%uno_opt_speccards,0,32)) { hadd uno.cards %t $+(X_,$gettok(%uno_opt_speccards,%i,32)) inc %i inc %t } } alias uno_getplayerinfo { var %pid = $$1, %info = $$2 return $hget($+(uno.players.,$hget(uno.players,%pid)),%info) } alias uno_translatecard { var %card = $$1, %c, %n if (%card == X_WD4) { return 14[4W12D08414] } else { %c = $gettok(%card, 1, 95) %n = $gettok(%card, 2, 95) return  $+ $replace(%c,R,4,G,3,B,12,Y,8,X,14) $+ $chr(91) $+ $iif(%uno_opt_showletter == 1, $lower(%c), $null) $+ %n $+ $chr(93) $+  } } alias uno_drawcard { var %pid = $$1, %i = 1, %j, %card, %cstr var %amount = $iif($2 == $null, 1, $2) %cstr = $+(,%uno_opt_c1) $+ You receive card $+ $iif(%amount == 1, $null, s) $+ : $+ $chr(160) while (%i <= %amount) { :docard %card = $rand(1, $uno_tablesize(uno.cards)) %j = 1 while (%j <= $gettok(%uno_cards_drawn, 0, 59)) { if (%card == $gettok(%uno_cards_drawn, %j, 59)) { goto docard } inc %j } if (%uno_cards_drawn != $null) { %uno_cards_drawn = %uno_cards_drawn $+ ; } %uno_cards_drawn = %uno_cards_drawn $+ %card hadd uno.players. $+ $hget(uno.players,%pid) cards $hget($+(uno.players.,$hget(uno.players,%pid)), cards) $+ $iif($hget($+(uno.players.,$hget(uno.players,%pid)), cards) != $null, $chr(59), $null) $+ %card %cstr = %cstr $+ $uno_translatecard($hget(uno.cards,%card)) $+ $chr(160) inc %i } .notice $uno_getplayerinfo(%pid, name) %cstr } alias uno_playcard { var %nick = $$1, %card = $$2 if (%uno_cards_played == $null) { %uno_cards_played = %card } } alias uno_allowcard { var %c1 = $$1, %c2 = $$2 var %cut = $3 var %c1c = $gettok($hget(uno.cards,%c1),1,95) var %c2c = $gettok($hget(uno.cards,%c2),1,95) var %c1n = $gettok($hget(uno.cards,%c1),2,95) var %c2n = $gettok($hget(uno.cards,%c2),2,95) if (%cut != 1) { if ($3 > 1) { if (%c1n == %c2n && %uno_opt_combos == 1) { if (%c1n != W && %c1n != WD4) { return 1 } } } else { if (%c1c == %c2c) { return 1 } if (%c1n == %c2n) { return 1 } if (%c1n == W || %c1n == WD4) { return 1 } } } else { if ((%c1c == %c2c && %c1n == %c2n) || (%c1n == WD4 && %c2n == WD4) || (%c1n == W && %c2n == W)) { return 1 } } return 0 } alias uno_findcardbyalias { var %i = 1 while (%i <= $uno_tablesize(uno.cards)) { if ($hget(uno.cards,%i) == $upper($$1)) { return %i } inc %i } return 0 } alias uno_next_player { $iif(%uno_reverse == 0, inc, dec) %uno_current_player if (%uno_reverse == 0) { if (%uno_current_player > $uno_playercount) { set %uno_current_player 1 } } else { if (%uno_current_player < 1) { set %uno_current_player $uno_playercount } } } alias uno_checksignuptime { var %time = $calc($ctime - 5) if (%time == $calc(%uno_game_signup - 300)) { msg %uno_game_chan $+(,%uno_opt_c2) $+ 5 $+(,%uno_opt_c1) $+ minutes until game start. } if (%time == $calc(%uno_game_signup - 120)) { msg %uno_game_chan $+(,%uno_opt_c2) $+ 2 $+(,%uno_opt_c1) $+ minutes until game start. } if (%time == $calc(%uno_game_signup - 60)) { msg %uno_game_chan $+(,%uno_opt_c2) $+ 60 $+(,%uno_opt_c1) $+ seconds until game start. } if (%time == $calc(%uno_game_signup - 30)) { msg %uno_game_chan $+(,%uno_opt_c2) $+ 30 $+(,%uno_opt_c1) $+ seconds until game start. } if (%time == $calc(%uno_game_signup - 15)) { msg %uno_game_chan $+(,%uno_opt_c2) $+ 15 $+(,%uno_opt_c1) $+ seconds until game start. } if (%time >= %uno_game_signup) { .timer45525 off if ($uno_playercount < %uno_opt_minplayers) { msg %uno_game_chan $+(,%uno_opt_c1) $+ Not enough players signed up. Terminating game. uno_unsetvars uno_freetables } else { uno_begin %uno_opt_sop } } } alias uno_force_pass { if (%uno_game == 2 && %uno_opt_playtime != 0) { var %p = %uno_current_player var %pn = $uno_getplayerinfo(%p, name) hinc uno.players. $+ $hget(uno.players,%p) forcepass uno_pass $uno_getplayerinfo(%p, name) 1 if (%uno_opt_forcekick != 0) { if ($uno_getplayerinfo(%p, forcepass) > %uno_opt_forcekick) { uno_delplayer %p if (%nick == %uno_game_starter && $uno_playercount > 0) { set %uno_game_starter $uno_getplayerinfo($rand(1, $uno_playercount), name) %newstr = ( $+ $+(,%uno_opt_c2) $+ %uno_game_starter $+(,%uno_opt_c1) $+ is now the new game leader) } msg %uno_game_chan $+(,%uno_opt_c2) $+ %pn $+(,%uno_opt_c1) $+ has been kicked out of the game due to inactivity. $iif($len(%newstr) > 0, %newstr, $null) if ($uno_playercount == 1) { uno_stop %uno_opt_sop NOPL } } } } } alias uno_reshuffle { if ($gettok(%uno_cards_played,0,59) > 50) { msg %uno_game_chan $+(,%uno_opt_c1) $+ Reshuffling deck. set %uno_cards_played $gettok(%uno_cards_played,-1,59) var %i = 101 while (%i <= 108) { if ($upper($gettok($hget(uno.cards,%i),1,95)) != X) { hadd uno.cards %i X_ $+ $upper($gettok($hget(uno.cards,%i),2,95)) } inc %i } } } ; DEBUG aliases ; ------------- alias uno_printdeck { var %t = 1, %d = 1, %i, %str while (%d <= 4) { %i = 1 %str =  $+ $iif(%d == 1, 4, $iif(%d == 2, 3, $iif(%d == 3, 12, $iif(%d == 4, 8, 0)))) while (%i <= $gettok(%uno_opt_regcards,0,32)) { %str = %str $+ $hget(uno.cards,%t) $+ $chr(160) inc %i inc %t } echo -a %str inc %d } %i = 1 %str = 14 while (%i <= $gettok(%uno_opt_speccards,0,32)) { %str = %str $+ $hget(uno.cards,%t) $+ $chr(160) inc %i } echo -a %str } alias uno_printplayers { var %i = 1 while (%i <= $uno_playercount) { echo -a %i $+ . $uno_getplayerinfo(%i, name) $chr(91) $+ $hget(uno.players,%i) $+ $chr(93) ( $+ $uno_getplayerinfo(%i, forcepass) $+ ) - $uno_getplayerinfo(%i, cards) inc %i } } alias uno_colortest { if ($$1 == %uno_opt_sop) { msg $$2 $+(,%uno_opt_c1) $+ A color test was requested by $+(,%uno_opt_c2) $+ $$1 $+ $+(,%uno_opt_c1) $+ ! } } alias uno_cardsplayed { echo -a Cards played: $gettok(%uno_cards_played,0,59) } ; UNO aliases ; ----------- alias uno_config { var %nick = $$1, %i = 1 if (%nick == %uno_opt_sop || %nick == %uno_game_starter) { if ($2 == list) { .notice %nick  $+ $+(,%uno_opt_c1) $+ Configuration list: while (%i <= $var(%uno_opt_*,0)) { .notice %nick $chr(160) $chr(160) $chr(160) $+(,%uno_opt_c2) $+ $var(%uno_opt_*,%i) - $eval($var(%uno_opt_*,%i),2) inc %i } .notice %nick $+(,%uno_opt_c1) $+ End of list. } if ($2 == set) { if ($var($3) == 1 && uno_opt isin $3) { if ($4 != $null) { set $iif($mid($3,1,1) != $chr(37), $chr(37), $null) $+ $3 $4- .notice %nick $+(,%uno_opt_c1) $+ Successfully set $+(,%uno_opt_c2) $+ $iif($mid($3,1,1) != $chr(37), $chr(37), $null) $+ $3 $+ $+(,%uno_opt_c1) to: $+(,%uno_opt_c2) $+ $4- if ($lower($replace($3,$chr(37),$null)) == uno_opt_playtime) { if ($4 == 0) { .timer45524 off } } } else { .notice %nick $+(,%uno_opt_c1) $+ No value specified. } } else { .notice %nick $+(,%uno_opt_c1) $+ Variable $+(,%uno_opt_c2) $+ $iif($mid($3,1,1) != $chr(37), $chr(37), $null) $+ $3 $+(,%uno_opt_c1) $+ does not exist. } } } } alias uno_commands { msg $2  $+ $+(,%uno_opt_c1) $+ UNO commands: $+ $+(,%uno_opt_c2) $+(%uno_opt_cmd,startuno) $+(%uno_opt_cmd,stopuno) $+(%uno_opt_cmd,join) $+(%uno_opt_cmd,leave) $+(%uno_opt_cmd,play) $+(%uno_opt_cmd,uno) $+(%uno_opt_cmd,draw) $+(%uno_opt_cmd,turn) $+(%uno_opt_cmd,pass) $+(%uno_opt_cmd,showcards) $+(%uno_opt_cmd,count) } alias uno_start { var %nick = $$1, %chan = $$2 if (%uno_game != 1) { uno_setup set %uno_game 1 set %uno_game_starter %nick set %uno_game_chan %chan set %pid_uid 1 uno_freetables hmake uno.players msg %chan $+(,%uno_opt_c1) $+ A game of UNO has been started by $+ $+(,%uno_opt_c2) %nick $+ $+(,%uno_opt_c1) $+ ! To join, type $+ $+(,%uno_opt_c2) $+(%uno_opt_cmd,join) $+(,%uno_opt_c1) $+ and wait for the game to start. uno_join %nick if (%uno_opt_signuptime != 0) { set %uno_game_signup $calc($ctime + %uno_opt_signuptime) .timer45525 $calc(%uno_opt_signuptime + 5) 1 uno_checksignuptime } } else { msg %chan $+(,%uno_opt_c1) $+ A game of UNO is already in progress. } } alias uno_stop { var %nick = $$1, %okstop if ($2 == NOPL) { msg %uno_game_chan $+(,%uno_opt_c1) $+ The game has been stopped due to all players leaving. uno_unsetvars uno_freetables halt } if (%uno_game == 1) { if (%uno_opt_gamelock == 1) { if (%nick == %uno_game_starter || %nick == %uno_opt_sop) { %okstop = 1 } } else { %okstop = 1 } } else if (%uno_game == 2 && %nick == %uno_opt_sop) { %okstop = 1 } if (%okstop == 1) { msg %uno_game_chan $+(,%uno_opt_c1) $+ The UNO game has been stopped by $+ $+(,%uno_opt_c2) %nick $+ 7! uno_unsetvars uno_freetables } } alias uno_begin { var %nick = $$1, %i = 1 if ($uno_playercount < %uno_opt_minplayers) { msg %uno_game_chan $+(,%uno_opt_c1) $+ The game needs at least $+(,%uno_opt_c2) $+ %uno_opt_minplayers $+ $+(,%uno_opt_c1) players to start. halt } if ((%uno_game == 1 && (%uno_game_starter == %nick || %nick == %uno_opt_sop)) || $2 == TIMEUP) { set %uno_game 2 uno_makedeck uno_playcard Dealer $rand(1, 100) msg %uno_game_chan $+(,%uno_opt_c1) $+ The game of UNO is now starting. Players are being handed their cards. while (%i <= $uno_playercount) { uno_drawcard %i 7 inc %i } set %uno_current_player $rand(1, $uno_playercount) set %uno_drawn 0 set %uno_reverse 0 msg %uno_game_chan $+(,%uno_opt_c1) $+ Top card: $uno_translatecard($hget(uno.cards,%uno_cards_played)) msg %uno_game_chan $+(,%uno_opt_c1) $+ Current player: $+(,%uno_opt_c2) $+ $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) .timer45525 off if (%uno_opt_playtime != 0) { .timer45524 1 %uno_opt_playtime uno_force_pass } } } alias uno_join { var %nick = $$1, %pid = %pid_uid if (%uno_game == 2) { .notice %nick $+(,%uno_opt_c1) $+ The game has already started. } else { if ($uno_findplayer(%nick) != $null) { .notice %nick $+(,%uno_opt_c1) $+ You're already in the game. } else { uno_addplayer %pid hmake uno.players. $+ %pid hadd uno.players. $+ %pid name %nick hadd uno.players. $+ %pid ingame 1 hadd uno.players. $+ %pid cards $null hadd uno.players. $+ %pid forcepass 0 msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ has joined the game. } } inc %pid_uid } alias uno_leave { if ($uno_findplayer($$1) != $null) { var %nick = $$1, %pid = $uno_findplayer($$1), %newstr, %leaveok = 0 if (%uno_game == 1) { if ($hget(uno.players,%pid) != $null) { %leaveok = 1 } } else if (%uno_game == 2) { if (%uno_opt_allowleave == 1) { %leaveok = 1 } } if (%leaveok == 1) { uno_delplayer %pid if (%nick == %uno_game_starter && $uno_playercount > 0) { set %uno_game_starter $uno_getplayerinfo($rand(1, $uno_playercount), name) %newstr = ( $+ $+(,%uno_opt_c2) $+ %uno_game_starter $+(,%uno_opt_c1) $+ is now the new game leader) } msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ has left the game. $iif($len(%newstr) > 0, %newstr, $null) if (%uno_game == 1) { if ($uno_playercount == 0) { uno_stop %nick NOPL } } else if (%uno_game == 2) { if ($uno_playercount == 1) { uno_stop %nick NOPL } } } } } alias uno_play { if (%uno_game == 2) { if ($uno_findplayer($$1) != $null && ($uno_findplayer($$1) == %uno_current_player || %uno_opt_cuts == 1)) { var %nick = $$1, %fcard, %str, %foundcard, %playok = 1, %uno = $iif($2 == uno, 1, 0), %pid = $uno_findplayer(%nick) var %cards = $lower($iif($2 == uno, $$3-, $$2-)) var %ctopc = $iif($chr(59) isin %uno_cards_played, $gettok(%uno_cards_played,$gettok(%uno_cards_played,0,59),59), %uno_cards_played) var %fstring = a, %fstr, %w = 0, %wcok = 1, %cut = 0 if ($uno_findplayer($$1) != %uno_current_player) { %uno_current_player = %pid %cut = 1 } else { %cut = 0 } if (%nick != $uno_getplayerinfo(%uno_current_player, name)) { .notice %nick $+(,%uno_opt_c1) $+ It's not your turn! halt } var %i = 1, %j while (%i <= $gettok(%cards,0,32)) { %fcard = $iif($mid($gettok(%cards,%i,32),1,1) == w, X_, $+($upper($mid($gettok(%cards,%i,32),1,1)),_)) $+ $upper($iif($mid($gettok(%cards,%i,32),1,1) == w, $gettok(%cards,%i,32), $mid($gettok(%cards,%i,32),2))) if ($uno_allowcard(%ctopc, $uno_findcardbyalias(%fcard), %cut) == 0 && ($lower($gettok(%cards,1,32)) != w && $mid($lower($gettok(%cards,1,32)),1,3) != wd4)) { %playok = 0 } else { %j = 1 %foundcard = 0 while (%j <= $gettok($uno_getplayerinfo(%pid, cards),0,59)) { if (%fcard == $hget(uno.cards, $gettok($uno_getplayerinfo(%pid, cards),%j,59)) && $findtok(%fstring,$gettok($uno_getplayerinfo(%pid, cards),%j,59),0,59) == 0) { %foundcard = $gettok($uno_getplayerinfo(%pid, cards),%j,59) break } inc %j } if (%foundcard == 0 && ($lower($gettok(%cards,1,32)) != w && $lower($gettok(%cards,1,32)) != wd4)) { %playok = 0 } else { if ($gettok($hget(uno.cards,%foundcard),1,95) == X) { if ($lower($gettok($1-,$gettok($1-,0,32),32)) != r && $lower($gettok($1-,$gettok($1-,0,32),32)) != g && $lower($gettok($1-,$gettok($1-,0,32),32)) != b && $lower($gettok($1-,$gettok($1-,0,32),32)) != y) { %wcok = 0 } else { %w = $upper($gettok($1-,$gettok($1-,0,32),32)) } } } if (%foundcard != 0) { %ctopc = %foundcard if (%fstring == a) { %fstring = $null } %fstring = %fstring $+ $iif($len(%fstring) < 1, $null, $chr(59)) $+ %foundcard } } inc %i } if (%playok == 0) { .notice %nick $+(,%uno_opt_c1) $+ You cannot play that card $+ $iif($gettok(%cards,0,32) == 1, $null, -combination) $+ . } else { if (%wcok != 1) { .notice %nick $+(,%uno_opt_c1) $+ You need to specify what color to change into. } else { if (%cut == 1) { msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ has performed a cut!! } %i = 1 while (%i <= $gettok(%fstring, 0, 59)) { %fstr = %fstr $+ $iif($len(%fstr) < 1, $null, $chr(160)) $+ $uno_translatecard($hget(uno.cards,$gettok(%fstring,%i,59))) inc %i } msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ played card $+ $iif(%i == 2, $null, s) $+ : %fstr %i = 1 while (%i <= $gettok(%fstring, 0, 59)) { %uno_cards_played = %uno_cards_played $+ ; $+ $gettok(%fstring,%i,59) hadd $+(uno.players.,$hget(uno.players,$uno_findplayer(%nick))) cards $deltok($uno_getplayerinfo($uno_findplayer(%nick), cards), $findtok($uno_getplayerinfo($uno_findplayer(%nick), cards), $gettok(%fstring,%i,59), 1, 59), 59) if ($upper($gettok($hget(uno.cards,$gettok(%fstring,%i,59)),2,95)) == S) { uno_next_player msg %uno_game_chan $+(,%uno_opt_c2) $+ $uno_getplayerinfo(%uno_current_player, name) $+ 's $+(,%uno_opt_c1) $+ turn was skipped! } if ($upper($gettok($hget(uno.cards,$gettok(%fstring,%i,59)),2,95)) == D2) { uno_next_player msg %uno_game_chan $+(,%uno_opt_c2) $+ $uno_getplayerinfo(%uno_current_player, name) $+(,%uno_opt_c1) $+ was forced to draw 2 cards. In addition, their turn was skipped! uno_drawcard %uno_current_player 2 } if ($upper($gettok($hget(uno.cards,$gettok(%fstring,%i,59)),2,95)) == R) { msg %uno_game_chan $+(,%uno_opt_c1) $+ Order is now reversed! set %uno_reverse $iif(%uno_reverse == 1, 0, 1) } if ($upper($gettok($hget(uno.cards,$gettok(%fstring,%i,59)),2,95)) == WD4) { uno_next_player msg %uno_game_chan 4W3i12l8d 4D3r12a8w 4F3o12u8r $+ $+(,%uno_opt_c1) $+ !! $+(,%uno_opt_c2) $+ $uno_getplayerinfo(%uno_current_player, name) $+ $+(,%uno_opt_c1) was forced to draw 4 cards. In addition, their turn was skipped! hadd uno.cards $gettok(%fstring,%i,59) %w $+ _WD4 uno_drawcard %uno_current_player 4 } if ($upper($gettok($hget(uno.cards,$gettok(%fstring,%i,59)),2,95)) == W) { hadd uno.cards $gettok(%fstring,%i,59) %w $+ _W } inc %i } if ($gettok($uno_getplayerinfo($uno_findplayer(%nick), cards),0,59) == 1) { if ($len($gettok($uno_getplayerinfo($uno_findplayer(%nick), cards),1,59)) > 0) { if (%uno != 1) { msg %uno_game_chan $+(,%uno_opt_c1) $+ Unfortunately, $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ forgot to call UNO and is forced to draw 2 cards. uno_drawcard $uno_findplayer(%nick) 2 } else { msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ called UNO! } } else { uno_wingame %nick } } if ($gettok($uno_getplayerinfo($uno_findplayer(%nick), cards),0,59) == $null) { uno_wingame %nick } if (%uno == 1 && $gettok($uno_playerinfo(%pid, cards),0,59) > 2) { if (%uno_opt_penalize == 1) { msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ called UNO, but doesn't have 1 card left. $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ is forced to draw 2 cards. uno_drawcard $uno_findplayer(%nick) 2 } } uno_next_player msg %uno_game_chan $+(,%uno_opt_c1) $+ Top card: $uno_translatecard($hget(uno.cards,$gettok(%uno_cards_played,$gettok(%uno_cards_played,0,59),59))) msg %uno_game_chan $+(,%uno_opt_c1) $+ Current player: $+(,%uno_opt_c2) $+ $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) uno_showcards $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) set %uno_drawn 0 uno_reshuffle if (%uno_opt_playtime != 0) { .timer45524 1 %uno_opt_playtime uno_force_pass } } } } } } alias uno_draw { if (%uno_game == 2) { var %nick = $$1 if ($uno_findplayer(%nick) != $null && $uno_findplayer(%nick) == %uno_current_player) { if (%uno_drawn == 0) { set %uno_drawn 1 uno_drawcard $uno_findplayer(%nick) 1 .timer45524 off } else { .notice %nick $+(,%uno_opt_c1) $+ You cannot draw another card this turn. } } } } alias uno_pass { if (%uno_game == 2) { var %nick = $$1, %i = 1, %passok = 1, %forced = $iif($2 == $null, 0, 1) var %ctopc = $iif($chr(59) isin %uno_cards_played, $gettok(%uno_cards_played,$gettok(%uno_cards_played,0,59),59), %uno_cards_played) if ($uno_findplayer(%nick) != $null && $uno_findplayer(%nick) == %uno_current_player) { if (%uno_opt_mustplay == 1 && %forced != 1) { while (%i <= $gettok($uno_getplayerinfo($uno_findplayer(%nick), cards),0,59)) { if ($uno_allowcard(%ctopc, $gettok($uno_getplayerinfo($uno_findplayer(%nick), cards),%i,59)) == 1, 0) { %passok = 0 } inc %i } } if (%passok == 0) { msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ is trying to cheat!! Play your card, fool! } else { msg %uno_game_chan $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ passes. uno_next_player msg %uno_game_chan $+(,%uno_opt_c1) $+ Top card: $uno_translatecard($hget(uno.cards,$gettok(%uno_cards_played,$gettok(%uno_cards_played,0,59),59))) msg %uno_game_chan $+(,%uno_opt_c1) $+ Current player: $+(,%uno_opt_c2) $+ $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) uno_showcards $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) set %uno_drawn 0 if (%uno_opt_playtime != 0) { .timer45524 1 %uno_opt_playtime uno_force_pass } } } } } alias uno_showcards { if (%uno_game == 2) { var %nick = $$1, %pid, %cstr, %i = 1 if ($uno_findplayer(%nick) != $null) { %pid = $uno_findplayer(%nick) %cstr = 7Your card $+ $iif($gettok($uno_getplayerinfo(%pid, cards),0,59) != 1, s, $null) $+ : $+ $chr(160) while (%i <= $gettok($uno_getplayerinfo(%pid, cards),0,59)) { %cstr = %cstr $+ $uno_translatecard($hget(uno.cards,$gettok($uno_getplayerinfo(%pid, cards),%i,59))) $+ $chr(160) inc %i } .notice %nick %cstr } } } alias uno_count { if (%uno_game == 2) { var %nick = $$1, %i = 1, %str %str = $+(,%uno_opt_c1) $+ Player cards: $+(,%uno_opt_c2) while (%i <= $uno_playercount) { if (%i != 1) { %str = %str $+ , $+ $chr(160) } %str = %str $+ $uno_getplayerinfo(%i, name) ( $+ $gettok($uno_getplayerinfo(%i, cards),0,59) $+ ) inc %i } .notice %nick %str } } alias uno_wingame { var %nick = $$1 msg %uno_game_chan $+(,%uno_opt_c1) $+ Victory!! $+(,%uno_opt_c2) $+ %nick $+(,%uno_opt_c1) $+ has won the game! uno_unsetvars uno_freetables } alias uno_turn { msg %uno_game_chan $+(,%uno_opt_c1) $+ Top card: $uno_translatecard($hget(uno.cards,$gettok(%uno_cards_played,$gettok(%uno_cards_played,0,59),59))) msg %uno_game_chan $+(,%uno_opt_c1) $+ Current player: $+(,%uno_opt_c2) $+ $uno_getplayerinfo($hget(uno.players,%uno_current_player), name) }