; +--------------------------------------+ ; | Picwin boxes game | ; | Created by Urza - Urza23@hotmail.com | ; | Created and tested in mIRC 6.31 | ; +--------------------------------------+ alias helpwin { ; close the window if it's already open if ($window(@Boxes_help)) window - @Boxes_help ; re-open the window window -adpfk @Boxes_help -1 -1 225 200 ; Make sure the bg is black drawfill -s @Boxes_help 1 $color(background) 1 1 ; draw the help text drawtext @Boxes_help 0 verdana 10 5 10 The rules of Boxes are very simple. drawtext @Boxes_help 0 verdana 10 5 30 Players take turns placing a line to drawtext @Boxes_help 0 verdana 10 15 42 connect 2 dots on the board. drawtext @Boxes_help 0 verdana 10 5 62 The goal is to create Boxes bordered drawtext @Boxes_help 0 verdana 10 15 74 entirely by your colour. drawtext @Boxes_help 0 verdana 10 5 94 The player with the most Boxes at the drawtext @Boxes_help 0 verdana 10 15 106 end of the game i the winner. drawtext @Boxes_help 0 verdana 10 5 126 If you successfully create a box you drawtext @Boxes_help 0 verdana 10 15 138 get another turn drawtext @Boxes_help 0 verdana 10 5 158 You can change the direction of your drawtext @Boxes_help 0 verdana 10 15 170 lines by right clicking or by clicking drawtext @Boxes_help 0 verdata 10 15 182 the radio boxes } ; Menu to open boxes game menu channel,status,query { Play Boxes:boxes } ; Main alias to create the boxes window alias Boxes { ; clear the Boxes hash table if it exists if ($hget(Boxes)) hfree Boxes ; if the window is open and the new game variable is not set - close it if ($window(@Boxes)) && (!%BOXES_NEWGAME) window -c @Boxes ; open the window - only if the new game variable is not set if (!%BOXES_NEWGAME) window -dpfk +bf @Boxes -1 -1 342 215 ; Make sure the bg is black drawfill -s @Boxes 1 $color(background) 1 1 drawrect -f @Boxes 1 1 0 0 342 215 ; Draw seperator lines drawline -n @Boxes 0 1 210 0 210 $window(@Boxes).bh drawline -n @Boxes 0 1 210 70 342 70 ; Draw line type text and box drawrect -n @Boxes 0 1 235 5 65 14 drawline -n @Boxes 0 1 235 12 225 12 225 60 325 60 325 12 299 12 drawtext -n @Boxes 0 verdana 10 240 5 Line Type ; Draw line type radio Boxes drawdot -n @Boxes 0 6 240 30 drawdot -n @Boxes 0 6 240 50 drawdot -n @Boxes 1 4 240 30 drawtext -n @Boxes 0 verdana 10 247 22 Vertical drawtext -n @Boxes 0 verdana 10 247 42 Horizontal ; Draw current player text and create hash table entry drawtext -n @Boxes 3 verdana 20 230 75 Player 1 hadd -m Boxes Player 1 ; Draw scores text and box drawrect -n @Boxes 0 1 235 105 47 14 drawline -n @Boxes 0 1 235 112 225 112 225 160 325 160 325 112 281 112 drawtext -n @Boxes 0 verdana 10 240 105 Scores drawtext -n @Boxes 3 verdana 10 235 123 Player 1: 0 drawtext -n @Boxes 4 verdana 10 235 141 Player 2: 0 ; draw the help button drawrect -n @Boxes 0 1 247 190 60 20 drawtext -n @Boxes 0 verdana 10 263 193 Help ; Draw the grid lines grid ; create hash table to represent which lines in the grid have been drawn var %x 1 while (%x <= 11) { hadd -m Boxes H $+ %x $str(0.,11) hadd -m Boxes V $+ %x $str(0.,11) inc %x } ; Create hash table entry to track the number of moves remaining hadd -m Boxes moves 220 drawtext -n @boxes 0 verdana 10 215 166 Moves remaining: $hget(boxes,moves) ; Update all the drawing drawline @Boxes } ; draw the grid alias -l grid { ; calculate size of the playing grid var %h = $window(@Boxes).bh - 5,%w = $window(@Boxes).bw - 135,%x 5,%y 5 ; loop through rows and columns drawing the dots every 20 pixels while (%y <= %h) { %x = 5 while (%x <= %w) { drawdot -n @Boxes 14 2 %x %y inc %x 20 } inc %y 20 } } ; find the current line type alias -l linetype return $iif($getdot(@Boxes,240,30),Horizontal,Vertical) ; Menu to handle all requred mouse events menu @Boxes { ; mouse movements mouse: if ($hget(boxes,moves)) hilightLine ; single clicks sclick:processClick ; right clicks - switch the line type rclick: { if ($getdot(@Boxes,240,30)) { drawdot @Boxes 1 4 240 30 drawdot @Boxes 0 4 240 50 } else { drawdot @Boxes 0 4 240 30 drawdot @Boxes 1 4 240 50 } } ; released clicks - redraw appropriate buttons uclick: { if ($mouse.x isnum 240-300 && $mouse.y isnum 190-210) { drawrect -f @Boxes 1 1 247 190 60 20 drawrect @Boxes 0 1 247 190 60 20 drawtext @Boxes 0 verdana 10 263 193 Help helpwin } if ($mouse.x isnum 70-140 && $mouse.y isnum 140-160 && !$hget(boxes,moves)) { drawrect -f @boxes 1 1 70 140 70 20 drawrect @boxes 0 1 70 140 70 20 drawtext @boxes 0 verdana 10 76 143 New Game boxes } } } ; alias to check whether a new line has created any boxes - and to fill them in with the players olour if so alias -l boxmade { var %box,%player = $hget(Boxes,player),%col = $iif(%player == 1,3,4) if (h* iswm $1) { ; check if the new line creats the TOP of a finished box var %t = $getline(h,$2,$3),%b = $getline(h,$calc($2 + 1),$3),%l = $getline(v,$2,$3),%r = $getline(v,$2,$calc($3 + 1)) if ($count(%t %b %l %r,%t) == 4) { inc %box drawrect -f @Boxes %col 1 $calc($3 * 20 - 17) $calc($2 * 20 - 17) 20 20 } ; check if the new line creates the BOTTOM of a finished box var %b = $getline(h,$2,$3),%t = $getline(h,$calc($2 -1),$3),%l = $getline(v,$calc($2 -1),$3),%r = $getline(v,$calc($2 -1),$calc($3 + 1)) if ($count(%t %b %l %r,%t) == 4) { inc %box drawrect -f @Boxes %col 1 $calc($3 * 20 - 17) $calc($({,$2) * 20 - 17) 20 20 } } else { ; check if the new line creates the LEFT of a finished box var %l = $getline(v,$2,$3),%r = $getline(v,$2,$calc($3 + 1)),%t = $getline(h,$2,$3),%b = $getline(h,$calc($2 + 1),$3) if ($count(%t %b %l %r,%t) == 4) { inc %box drawrect -f @Boxes %col 1 $calc($3 * 20 - 17) $calc($2 * 20 - 17) 20 20 } ; check if the new line creates the RIGHT of a finished box var %r = $getline(v,$2,$3),%l = $getline(v,$2,$calc($3 -1)),%t = $getline(h,$2,$calc($3 -1)),%b = $getline(h,$calc($2 +1),$calc($3 - 1)) if ($count(%t %b %l %r,%t) == 4) { inc %box drawrect -f @Boxes %col 1 $calc($({,$3) * 20 - 17) $calc($2 * 20 - 17) 20 20 } } ; if any boxes have been made update the players score in the hash table, and the score panel if (%box) { hinc Boxes score_ $+ %player %box if (%player == 1) { drawrect -f @Boxes 1 1 290 120 25 18 drawtext @Boxes 3 verdana 10 290 123 $hget(Boxes,score_1) } else { drawrect -f @Boxes 1 1 290 140 25 18 drawtext @Boxes 4 verdana 10 290 141 $hget(Boxes,score_2) } } return %box } ; alias to check which player - if any - has filled in a given line based on its direction, x position, and y position in the grid ; $getline([vh],x-pos,y-pos) alias getline { var %type = $left($1,1),%row = $2,%col = $3,%info = $hget(Boxes,%type $+ %row),%token = $token(%info,%col,46) return %token } ; alias to process all mouse clicks alias -l processClick { ; if the mouse is in the game board area and there are moves remaining if ($mouse.x isnum 5-215 && $mouse.y isnum 5-215 && $hget(boxes,moves)) { ; only proceed if no line has been drawn in this location var %entry = $left($linetype,1) $+ $hget(Boxes,line_row) if (!$token($hget(Boxes,%entry),$hget(Boxes,line_col),46)) { ; draw the players line in bold drawline @Boxes $iif($hget(Boxes,player) == 1,3,4) 3 $hget(Boxes,line_coords) ; update the hash table hadd -m Boxes %entry $puttok($hget(Boxes,%entry),$hget(Boxes,player),$hget(Boxes,line_col),46) ; Check if a box has been created since palyers are not changed if a box is made if (!$boxmade($linetype,$hget(Boxes,line_row),$hget(Boxes,line_col))) { ; Switch the player in the hash table and the panel to the right hadd -m Boxes player $iif($hget(Boxes,player) == 1,2,1) drawrect -f @Boxes 1 1 230 77 100 25 drawtext @Boxes $iif($hget(Boxes,player) == 1,3,4) verdana 20 230 75 Player $hget(Boxes,player) } ; Decrease the number of moves remaining hdec boxes moves drawrect -f @Boxes 1 1 215 166 150 10 drawtext @boxes 0 verdana 10 215 166 Moves remaining: $hget(boxes,moves) ; If there are no moves remaining end the game if (!$hget(boxes,moves)) endgame } } ; process line type changes when radio buttons are clicked if ($mouse.x isnum 225-325) { if ($mouse.y isnum 20-38) { drawdot @Boxes 1 4 240 30 drawdot @Boxes 0 4 240 50 } elseif ($mouse.y isnum 38-55) { drawdot @Boxes 0 4 240 30 drawdot @Boxes 1 4 240 50 } } ; Process help button click if ($mouse.x isnum 240-300 && $mouse.y isnum 190-210) { ; redraw the help button in clicked state drawrect -f @Boxes 14 1 247 190 60 20 drawrect @Boxes 0 1 247 190 60 20 drawtext @Boxes 0 verdana 10 263 193 Help } ; Process New Game button click if ($mouse.x isnum 70-140 && $mouse.y isnum 140-160 && !$hget(boxes,moves)) { drawrect -f @boxes 14 1 70 140 70 20 drawrect @boxes 0 1 70 140 70 20 drawtext @boxes 0 verdana 10 76 143 New Game } } alias -l hilightLine { ; if the mouse position is within the play grid if ($mouse.x isnum 5-215 && $mouse.y isnum 5-215) { ; calculate the x and y positions of start point of the line var %x_temp = $int($calc(($mouse.x - 5) / 20)),%y_temp = $int($calc(($mouse.y - 5) / 20)) var %x = $calc(%x_temp * 20 + 3),%y = $calc(%y_temp * 20 + 3) if (%y_temp > 9) && ($linetype == vertical) %y_temp = 9 if (%x_temp > 9) && ($linetype == horizontal) %x_temp = 9 ; check the line type and use it to calculate the end position of the line if ($linetype == Vertical) var %x_end = %x,%y_end = %y $iif(%y > 200,-,+) 20 else var %x_end = %x $iif(%x > 200,-,+) 20,%y_end = %y ; Update line info in hash table hadd -m Boxes Line_coords %x %y %x_end %y_end hadd -m Boxes Line_row $calc(%y_temp + 1) hadd -m Boxes line_col $calc(%x_temp + 1) ; update grid and draw the current line if there isnt already a locked line in the current position if ($hget(boxes,moves)) update if (!$token($hget(Boxes,$left($linetype,1) $+ $hget(Boxes,line_row)),$hget(Boxes,line_col),46)) { drawline @Boxes $iif($hget(Boxes,player) == 1,3,4) 1 %x %y %x_end %y_end } } } ; alias to update the grid and remove previous position hilight lines alias -l update { var %y 1 ; loop through each row and column drawing black lines over each part of the grid that has not yet been locked in while (%y <= 11) { var %x = 1,%h_row = $hget(Boxes,h $+ %y),%v_row = $hget(Boxes,v $+ %y) while (%x <= 11) { ; check if the current position has been locked in var %h_tok = $token(%h_row,%x,46),%v_tok = $token(%v_row,%x,46) var %x_start = $calc(20 * %x - 17),%y_start = $calc(20 * %y - 17) ; check horizontal line at current position and draw black if required if (%h_tok) drawline -n @Boxes $iif($v1 == 1,3,4) 3 %x_start %y_start $calc(%x_start + 20) %y_start else drawline -n @Boxes 1 3 %x_start %y_start $calc(%x_start + 20) %y_start ; check vertical line at current position and draw black if required if (%v_tok) drawline -n @Boxes $iif($v1 == 1,3,4) 3 %x_start %y_start %x_start $calc(%y_start + 20) else drawline -n @Boxes 1 3 %x_start %y_start %x_start $calc(%y_start + 20) inc %x } inc %y } ; redraw the grid positions that were wiped out by the black lines grid ; redraw the line seperating the grid from the right panel drawline -n @Boxes 0 1 210 0 210 $window(@Boxes).bh ; update all drawing drawdot @Boxes } alias endgame { ; draw the Game over box and new game button drawrect -nf @Boxes 0 1 24 44 160 130 drawrect -nf @Boxes 14 1 29 49 150 120 drawrect -nf @Boxes 1 1 34 54 140 110 drawtext -n @Boxes 0 verdana 20 43 60 GAME OVER drawtext -n @boxes 3 verdana 15 53 90 Player 1: $hget(boxes,score_1) drawtext -n @boxes 4 verdana 15 53 110 Player 1: $hget(boxes,score_2) drawrect -n @boxes 0 1 70 140 70 20 drawtext -n @boxes 0 verdana 10 76 143 New Game ; Update the drawing drawdot @Boxes ; set temporary new game variable set -u10 %BOXES_NEWGAME 1 }