siegel@booga.Eng.Sun.COM (Josh Siegel) (04/18/91)
[I logged in and didn't see any TNT code!] Here is a game I whipped together a while back after visiting grasshopper. --josh P.S. Needs a option where you can hit a key and a spread sheet pops up... :-) #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: MANIFEST TODO mahjongg # Wrapped by siegel@booga on Wed Apr 17 14:30:48 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'MANIFEST' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MANIFEST'\" else echo shar: Extracting \"'MANIFEST'\" \(207 characters\) sed "s/^X//" >'MANIFEST' <<'END_OF_FILE' X File Name Archive # Description X----------------------------------------------------------- X MANIFEST 1 This shipping list X TODO 1 X mahjongg 1 END_OF_FILE if test 207 -ne `wc -c <'MANIFEST'`; then echo shar: \"'MANIFEST'\" unpacked with wrong size! fi # end of 'MANIFEST' fi if test -f 'TODO' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'TODO'\" else echo shar: Extracting \"'TODO'\" \(1835 characters\) sed "s/^X//" >'TODO' <<'END_OF_FILE' XThanks to Hugh Daniels for whining alot... X X% X% TODO list... X% X% Bugs & Todo list X% why do the tiles try to display themselvs where they were first X% created? (you see them flicker away when you quit or newgame) X% About box needs to be better, Make the box scale fulley! X% Everything needs to scale... (So I can do the whole screen when I am X% very tired!) X% Visual balance of tiles needs work: X%* Tiles ought to be on off white background X% Dots have to be de-empthasized so the dont swamp the others X% The corners and intersetions are black, somehow not right... X% Maybe rounded corners would fix edges problem (what unfun!) X% The horizontal lines of the 1,2, & 3 craks are too week X% Color background ought to be a picture or a mahongy pattern X% or maroon color X% Many of the single character kanji tiles need to be bigger X% Soffen cracks to yellow or outline them in black like dots X% Tile chooser (Just Kanji, english also, etc.) X% ?Save/Load a game (what fun, it gets a droped file from file-munger...) X% Tiles need to go away quicker after they have been clicked X% Tiles map window, a window where we are intoduced to the different X% tiles, also part of the help system. Lets us see the tiles! X% ?Middle button lights up all of this tile that are visable X% Play this game again option X% When tiles are going away moses gets locked, X% could we fix this with pauses in our code? X% When window size changes tiles stay in the middle X% (This all changes with scroll bars I know) X% When game over or whatever shift select to remove any tile X% Icont ought to look like a tile (maybe a random one!) Xd Is there reson to keep sending /Color messages insted of defining X% /isColor? in our localdict? X% Set up a dict with all the different colors in it, so that we can X% tell different games apart, different users etc. X END_OF_FILE if test 1835 -ne `wc -c <'TODO'`; then echo shar: \"'TODO'\" unpacked with wrong size! fi # end of 'TODO' fi if test -f 'mahjongg' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mahjongg'\" else echo shar: Extracting \"'mahjongg'\" \(24253 characters\) sed "s/^X//" >'mahjongg' <<'END_OF_FILE' X#!/usr/local/openwin/bin/psh X X% X% By Josh Siegel X% X% It isn't pretty but it gets the job done... :-) X% X Xtrue setpacking X X/drag_and_drop true def % Accept dragged canvases X X/forfit false def X X/AboutPanel ClassPanel [] Xclassbegin X /minsize {356 256} def X /Paint { X /Paint super send X X /ZapfChancery-MediumItalic findfont 20 scalefont setfont X X 0 0 0 rgbcolor setcolor X 50 230 moveto (Mahjongg version 1.0) show X 10 200 moveto (Written by Josh Siegel) show X 50 170 moveto (with help from:) show X 10 140 moveto (Keiko Ohkawa (She knew japanese!)) show X 10 110 moveto (Kira Siegel (UI design and documentation)) show X 10 20 moveto (Copyright (c) 1991, Sun Microsystems, Inc) show X } def Xclassend def X X/about_panel /Calculated framebuffer /new AboutPanel send def X X/buttons /Spaced about_panel /new ClassButtons send def X[(How to play Mahjongg)] /setitemlist buttons send X/buttons buttons [ /Center { /South PARENT POSITION 60 add} ] X /addclient about_panel send X{ X pop pop X /pin help_win send X /map help_win send X /totop help_win send X} /setnotifier buttons send X X/about_popup about_panel framebuffer /new ClassPopupWindow send def X(About mahjongg...) /setlabel about_popup send X/place about_popup send X X X/about_list framebuffer /new ClassScrollList send def X[ X (The goal of the game is to clear the entire table of) X (mahjongg pieces. This is accomplished by removing ) X (pairs of matching pieces from the game board. Each) X (piece has 3 other tiles it can be paired with.) X () X (Flowers and Seasons are the exception to the rule in ) X (that there are only 4 pieces total of each type and) X (they are matched against each other. For example,) X (a bamboo can be matched against orchid or a mum.) X () X (Mahjongg pieces can only be removed if they are) X (currently not blocked on the top or on the left or the) X (right. Clicking on a blocked piece will generate) X (a beep as a warning message.) X () X (Please note, not all boards are winable.) X] /setitemlist about_list send X X/minsize about_list send pop X5 /heightfromrows about_list send 2 array astore cvx X/preferredsize exch /promote about_list send X X% instantiate a vertical scrollbar X/scrollbar framebuffer /new ClassVScrollbar send def X X% ensure that the scrollbar notifies the scrolling list Xabout_list /settarget scrollbar send X/scroll /setnotifier scrollbar send X/scroll /setpreviewer scrollbar send X X% ensure that the scrolling list can move the scrollbar Xscrollbar /setscrollbar about_list send X X% instantiate a window and insert the list X/help_win about_list framebuffer /new ClassPopupWindow send def X(How to play) /setlabel help_win send X/West scrollbar /addclient help_win send X0 0 0 5 /setgaps help_win send X X/place help_win send X X/main_menu /Grid framebuffer /new ClassMenu send def X X[ X [ (New Game) X { finish_old_game new_game } X ] X [(About Mahjongg...) X { X /reshaped? about_popup send not { X /place about_popup send X } if X /pin about_popup send X /totop about_popup send X /map about_popup send X } X ] X [ (Find Matches) { X pop pop X forfit false eq { X [currentcursorlocation] /open notice send X } { X locate_match X } ifelse X } X ] X] /setitemlist main_menu send X X(Mahjongg) /setlabel main_menu send X Xtrue /setpinnable main_menu send X X% Create a window and the notice X/notice null framebuffer /new ClassNotice send def X X(When scoring is implemented, selecting this\ X will invalidate your score. You sure?) X /settext notice send X X% Create the buttongroup that will appear in the notice X/noticebuttons /Spaced framebuffer /new ClassButtons send def X[(Yes) (No)] /setitemlist noticebuttons send X1 /setdefault noticebuttons send X{ X /close notice send X pause % to let the savebehind repair X pop 0 eq { X /forfit true store X locate_match X } if X} /setnotifier noticebuttons send X10 0 /setgaps noticebuttons send X Xnoticebuttons /setbuttons notice send X X/locate_match { X 144 dict begin X tiles { X dup /Mapped exch send { X dup /Blocked? exch send { X pop X } { X dup /whoami exch send currentdict 1 index known { X currentdict exch get X { X 2 copy /invert exch send /invert exch send X 1 60 div X sleep /invert exch send /invert exch send X } fork pop pop pop X 20 X exit X } { X special_matches 1 index known { X special_matches exch get X { X pop 1 index def X } forall X pop X } { X exch def X } ifelse X } ifelse X } ifelse X } { X pop X } ifelse X } forall X dup 20 ne { X pop X (Sorry, no matches left) (Game over.) /setfooter win send pause X } if X end X} def X X/ClassTile ClassCanvas [/whoami /whereami] Xclassbegin X /x_size 54 def X /y_size 64 def X /ts 15 def X X /Transparent false def X /Trackable? true def X X /setwhereiam { X /whereami exch def X } def X X /special_cases 50 dict dup begin X /1-3-0 { X /Mapped /ClientDict panel send /0-3.5-0 get send X } def X /1-4-0 { X /Mapped /ClientDict panel send /0-3.5-0 get send X } def X /12-3-0 { X /Mapped /ClientDict panel send /13-3.5-0 get send X } def X /12-4-0 { X /Mapped /ClientDict panel send /13-3.5-0 get send X } def X /13-3.5-0 { X /Mapped /ClientDict panel send /14-3.5-0 get send X } def X end def X X /Blocked? { X whereami 2 get 4 eq { % the top piece is simple X false X } { X whereami 2 get 3 eq { % similerly the second from top pieces X /Mapped /ClientDict panel send /6.5-3.5-4 get send X } { X /Mapped /ClientDict panel send X whereami aload pop 1 add exch 3 -1 roll (%-%-%) sprintf cvn X 2 copy known { X get send X } { X pop pop pop false X } ifelse X dup false eq { X pop X /special_cases self send (%-%-%) whereami sprintf cvn 2 copy known { X get exec X } { X pop pop X /Mapped /ClientDict panel send X (%-%-%) [ whereami aload pop 3 -1 roll 1 add 3 1 roll ] sprintf cvn X 2 copy known { X get send X dup true eq { X pop X /Mapped /ClientDict panel send X (%-%-%) [ whereami aload pop 3 -1 roll 1 sub 3 1 roll ] X sprintf cvn X 2 copy known { X get send X } { X pop pop pop false X } ifelse X } if X } { X pop pop pop false X } ifelse X } ifelse X } if X } ifelse X } ifelse X } def X X /invert { X self setcanvas X currentrasteropcode X 5 setrasteropcode X clippath fill X setrasteropcode X } def X X /TrackStart { X pop /Default true X /Blocked? self send { X beep X } { X piece1 null eq { X /piece1 self store X /invert piece1 send X } { X piece1 self eq { X /invert piece1 send X /piece1 null store X } { X /piece2 self store X pieces_match? { X /unmap piece1 send X /unmap piece2 send X /tile_count tile_count 2 sub store X tile_count 0 ne { X (Tiles left: %) [tile_count] sprintf () X /setfooter win send X } { X % Note, the game has been won! X (Have a Cow Man! You WON!)(Next time though...) X /setfooter win send X % Do neet things here ,sevral sets thereof! X } ifelse X /piece1 null store X /piece2 null store X } { X beep X } ifelse X } ifelse X } ifelse X } ifelse X } def X X /new { X /new super send X dup /whoami 4 -1 roll put X } def X X /minsize { 65 75 } def X X /path { % x y w h X pop pop moveto X x_size 1 add 0 rlineto X 10 10 rlineto X 0 y_size rlineto X x_size neg 1 sub 0 rlineto X -10 -10 rlineto X closepath X } def X X /Paint { X whoami draw_piece pause X } def X X /draw_dot { % r X /Color self send { X 0 .5 .7 rgbcolor setcolor X } { X .8 setgray X } ifelse X X currentpoint newpath 3 -1 roll 0 360 5 copy arc fill X 0 setgray arc stroke X } def X X /draw_bam { % X 2 0 rlineto X 2 2 rlineto X 0 2 rlineto X -2 2 rlineto X X 0 2 rlineto X 2 2 rlineto X 0 2 rlineto X -2 2 rlineto X X 0 2 rlineto X 2 2 rlineto X 0 2 rlineto X -2 2 rlineto X X -4 0 rlineto X X -2 -2 rlineto X 0 -2 rlineto X X 2 -2 rlineto X 0 -2 rlineto X -2 -2 rlineto X 0 -2 rlineto X X 2 -2 rlineto X 0 -2 rlineto X -2 -2 rlineto X 0 -2 rlineto X X closepath X X /Color self send { X .7 .35 0 rgbcolor setcolor X } if X fill X } def X X X /upper_right { % c X /Courier findfont ts scalefont setfont X x_size 1 index stringwidth pop sub y_size currentfont fontascent sub moveto X show X } def X X /special_images X dictbegin X dictend def X X /pieces dictbegin X /red_dragon { X (C) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\303\346) show X } def X /white_dragon { X /Courier findfont ts scalefont setfont X x_size (P) stringwidth pop sub 2 div y_size currentfont fontascent sub 2 div moveto X (P) show X } def X /green_dragon { X (F) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\342\244) show X } def X /north_wind { X (N) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\313\314) show X } def X /east_wind { X (E) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\305\354) show X } def X /south_wind { X (S) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\306\356) show X } def X /west_wind { X (W) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\300\276) show X } def X /1st_dot { X (1) upper_right X x_size 2 div y_size 2 div moveto 20 draw_dot X } def X /2nd_dot { X (2) upper_right X x_size 2 div dup X 19 moveto 13 draw_dot X 47 moveto 13 draw_dot X } def X /3rd_dot { X (3) upper_right X x_size 2 div y_size 2 div moveto 10 draw_dot X 12 y_size 12 sub moveto 10 draw_dot X x_size 12 sub 12 moveto 10 draw_dot X } def X /4th_dot { X x_size (4) stringwidth pop sub 2 div y_size currentfont fontascent sub X moveto (4) show X 12 y_size 18 sub moveto 10 draw_dot X 12 12 moveto 10 draw_dot X x_size 12 sub y_size 18 sub moveto 10 draw_dot X x_size 12 sub 12 moveto 10 draw_dot X } def X X /5th_dot { X x_size (5) stringwidth pop sub 2 div y_size currentfont fontascent sub X moveto (5) show X 12 y_size 18 sub moveto 10 draw_dot X 12 12 moveto 10 draw_dot X x_size 12 sub y_size 18 sub moveto 10 draw_dot X x_size 12 sub 12 moveto 10 draw_dot X x_size 2 div y_size 2 div 3 sub moveto 10 draw_dot X } def X /6th_dot { X (6) upper_right X 15 10 moveto 8 draw_dot X 15 30 moveto 8 draw_dot X 15 50 moveto 8 draw_dot X 35 10 moveto 8 draw_dot X 35 30 moveto 8 draw_dot X 35 50 moveto 8 draw_dot X } def X X /7th_dot { X (7) upper_right X 15 10 moveto 7 draw_dot X 15 27 moveto 7 draw_dot X 35 10 moveto 7 draw_dot X 35 27 moveto 7 draw_dot X 38 44 moveto 7 draw_dot X 24 49 moveto 7 draw_dot X 10 54 moveto 7 draw_dot X } def X X /8th_dot { X (8) upper_right X 15 10 moveto 7 draw_dot X 15 25 moveto 7 draw_dot X 15 40 moveto 7 draw_dot X 15 55 moveto 7 draw_dot X 35 10 moveto 7 draw_dot X 35 25 moveto 7 draw_dot X 35 40 moveto 7 draw_dot X 35 55 moveto 7 draw_dot X } def X X /9th_dot { X x_size (9) stringwidth pop sub 14 add 2 div y_size 31 sub moveto (9) show X 10 10 moveto 7 draw_dot X 27 10 moveto 7 draw_dot X 44 10 moveto 7 draw_dot X X 10 26 moveto 7 draw_dot X 27 26 moveto 7 draw_dot X 44 26 moveto 7 draw_dot X X 10 52 moveto 7 draw_dot X 27 52 moveto 7 draw_dot X 44 52 moveto 7 draw_dot X } def X /1st_bam { X (1) upper_right X 28 20 moveto draw_bam X } def X X /2nd_bam { X (2) upper_right X 0 setgray X 28 6 moveto draw_bam X 28 36 moveto draw_bam X } def X X /3rd_bam { X (3) upper_right X 0 setgray X 28 6 moveto draw_bam X 18 36 moveto draw_bam X 38 36 moveto draw_bam X } def X X /4th_bam { X (4) upper_right X 0 setgray X 18 36 moveto draw_bam X 38 36 moveto draw_bam X 18 6 moveto draw_bam X 38 6 moveto draw_bam X } def X /5th_bam { X (5) upper_right X 0 setgray X 18 36 moveto draw_bam X 38 36 moveto draw_bam X 18 6 moveto draw_bam X 38 6 moveto draw_bam X 28 22 moveto draw_bam X } def X X /6th_bam { X (6) upper_right X 0 setgray X 18 36 moveto draw_bam X 38 36 moveto draw_bam X 28 36 moveto draw_bam X X 18 10 moveto draw_bam X 38 10 moveto draw_bam X 28 10 moveto draw_bam X } def X /7th_bam { X (7) upper_right X 0 setgray X 1 .9 scale X 28 47 moveto draw_bam X X 18 24 moveto draw_bam X 38 24 moveto draw_bam X 28 24 moveto draw_bam X X 18 1 moveto draw_bam X 38 1 moveto draw_bam X 28 1 moveto draw_bam X } def X /8th_bam { X x_size (8) stringwidth pop sub 2 div y_size currentfont fontascent sub 2 div moveto X (8) show X X 0 setgray X X 10 40 moveto draw_bam X 46 40 moveto draw_bam X 10 1 moveto draw_bam X 46 1 moveto draw_bam X X 12 28 moveto -135 rotate draw_bam 135 rotate X 44 28 moveto 135 rotate draw_bam -135 rotate X X 12 34 moveto -45 rotate draw_bam 45 rotate X 44 34 moveto 45 rotate draw_bam -45 rotate X } def X X /9th_bam { X (9) upper_right X 0 setgray X 1 .9 scale X X 18 47 moveto draw_bam X 38 47 moveto draw_bam X 28 47 moveto draw_bam X X 18 24 moveto draw_bam X 38 24 moveto draw_bam X 28 24 moveto draw_bam X X 18 1 moveto draw_bam X 38 1 moveto draw_bam X 28 1 moveto draw_bam X } def X X /1st_crak { X (1) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\260\354) show X } def X /2nd_crak { X (2) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\306\363) show X } def X /3rd_crak { X (3) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\273\260) show X } def X /4th_crak { X (4) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\273\315) show X } def X /5th_crak { X (5) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\270\336) show X } def X /6th_crak { X (6) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\317\273) show X } def X /7th_crak { X (7) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\274\267) show X } def X /8th_crak { X (8) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\310\254) show X } def X /9th_crak { X (9) upper_right /Kanji findfont 24 scalefont setfont X 18 5 moveto (\350\337) show X /Color self send { X 0 .7 0 rgbcolor setcolor X } if X 18 32 moveto (\266\345) show X } def X X /winter { X (winter) upper_right X /Kanji findfont 24 scalefont setfont X X 17 20 moveto (\305\337) show X } def X /summer { X (summer) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\262\306) show X } def X /fall { X (fall) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\275\251) show X } def X /spring { X (spring) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\275\325) show X } def X X /plum { X (plum) upper_right X } def X /bamboo { X (bamboo) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\303\335) show X } def X /orchid { X (orchid) upper_right X } def X /mum { X (mum) upper_right X /Kanji findfont 24 scalefont setfont X 17 20 moveto (\265\306) show X } def X dictend def X X X /draw_piece { X /Courier findfont 12 scalefont setfont X .6 setgray X {0 0 moveto 10 10 rlineto 0 y_size rlineto -10 -10 rlineto closepath} dup exec fill X 0 setgray exec stroke X X .6 setgray X {0 0 moveto 10 10 rlineto x_size 0 rlineto -10 -10 rlineto closepath} dup exec fill X 0 setgray exec stroke X X 10 10 translate X /Color self send {.2 .15 .95 hsbcolor setcolor } X { 1 setgray } ifelse X 0 0 moveto x_size 0 rlineto 0 y_size rlineto x_size neg 0 rlineto closepath fill X 0 setgray X 0 0 moveto x_size 0 rlineto 0 y_size rlineto x_size neg 0 rlineto closepath stroke X dup special_images exch known { X special_images exch get X x_size y_size scale X imagecanvas X } { X pieces exch get exec X } ifelse X } def X X drag_and_drop { X /Receptible? true def X X /HandleReception { % event selection => bool X exch /begintransfer 2 index send % sel event X X 10 dict dup begin % sel event requestdict X /Canvas dup def X /ContentsAscii dup def X end X /request 3 index send % sel event replydict X begin % sel event X ContentsAscii type /stringtype eq { X ContentsAscii /AsciiReception self send % sel bool X } { % sel event X Canvas type /canvastype eq { X Canvas /CanvasReception self send % sel bool X } { pop false } ifelse X } ifelse X end X dup /endtransfer 4 -1 roll % bool bool /et sel X send % bool X } def X X /AsciiReception { % event string => bool X (\n) search { % Clear off any returns! X 3 1 roll pop pop X } if X { X readcanvas X } stopped { X pop pop beep false X } { X /CanvasReception self send X } ifelse X } def X X /CanvasReception { % event canvas => bool X exch pop X special_images /whoami self send 3 -1 roll put X tiles { X dup /whoami exch send /whoami self send eq { X /paint exch send X } { X pop X } ifelse X } forall X true X } def X } if Xclassend def X X/MyPanel ClassPanel [] Xclassbegin X /minsize {846 612} def Xclassend def X X/deck [ X /1st_bam /1st_bam /1st_bam /1st_bam X /1st_crak /1st_crak /1st_crak /1st_crak X /1st_dot /1st_dot /1st_dot /1st_dot X /2nd_bam /2nd_bam /2nd_bam /2nd_bam X /2nd_crak /2nd_crak /2nd_crak /2nd_crak X /2nd_dot /2nd_dot /2nd_dot /2nd_dot X /3rd_bam /3rd_bam /3rd_bam /3rd_bam X /3rd_crak /3rd_crak /3rd_crak /3rd_crak X /3rd_dot /3rd_dot /3rd_dot /3rd_dot X /4th_bam /4th_bam /4th_bam /4th_bam X /4th_crak /4th_crak /4th_crak /4th_crak X /4th_dot /4th_dot /4th_dot /4th_dot X /5th_bam /5th_bam /5th_bam /5th_bam X /5th_crak /5th_crak /5th_crak /5th_crak X /5th_dot /5th_dot /5th_dot /5th_dot X /6th_bam /6th_bam /6th_bam /6th_bam X /6th_crak /6th_crak /6th_crak /6th_crak X /6th_dot /6th_dot /6th_dot /6th_dot X /7th_bam /7th_bam /7th_bam /7th_bam X /7th_crak /7th_crak /7th_crak /7th_crak X /7th_dot /7th_dot /7th_dot /7th_dot X /8th_bam /8th_bam /8th_bam /8th_bam X /8th_crak /8th_crak /8th_crak /8th_crak X /8th_dot /8th_dot /8th_dot /8th_dot X /9th_bam /9th_bam /9th_bam /9th_bam X /9th_crak /9th_crak /9th_crak /9th_crak X /9th_dot /9th_dot /9th_dot /9th_dot X X /spring /winter /summer /fall X /bamboo /mum /orchid /plum X X /green_dragon /green_dragon /green_dragon /green_dragon X /red_dragon /red_dragon /red_dragon /red_dragon X /white_dragon /white_dragon /white_dragon /white_dragon X X /east_wind /east_wind /east_wind /east_wind X /north_wind /north_wind /north_wind /north_wind X /south_wind /south_wind /south_wind /south_wind X /west_wind /west_wind /west_wind /west_wind X] def X X% Try to get more random layouts X currenttime dup truncate sub 10000 mul truncate cvi srand X X/random_tiles { % - => tiles'array X [ X 144 dict dup begin X deck { X { X rand dup currentdict exch known not { X exit X } if X } loop X exch panel /new ClassTile send def X } forall X end X { exch pop } forall X ] X} def X X/init_tiles { X /tiles random_tiles def X /tiles_off 0 def X} def X X/get_tile { X tiles tiles_off get X /tiles_off tiles_off 1 add store X} def X X/fill_row { % x1 x2 y1 z X pause X 10 dict begin X /z exch def X /z1 z 10 mul def X /y exch def X /y1 520 y 64 mul sub def X /x2 exch def X /x1 exch def X /prev null def X X x2 -1 x1 { X /x exch def X /ti get_tile def X [x y z] /setwhereiam ti send X (%-%-%) [x y z] sprintf ti [x 54 mul z1 add y1 z1 add] /addclient panel send X /totop ti send X pause X } for X end X} def X X/MyBaseWindow ClassBaseWindow [] Xclassbegin X /QuitFromUser { X { X /unmap self send X /ClientDict panel send { X pop /removeclient panel send { X pop X } if X pause X } forall X /QuitFromUser super send X } fork pop X } def Xclassend Xdef X X/panel /Absolute framebuffer /new MyPanel send def X X/win panel framebuffer /new MyBaseWindow send def X X/place win send X/new ClassEventMgr send dup /activate win send X/activate notice send X Xwin /setbasewindow notice send X X(Mahjongg) /setlabel win send X[(\313\343\277\375) /Kanji findfont 24 scalefont] /seticonlabel win send X X/map win send X Xabout_popup /addsubwindow win send Xhelp_win /addsubwindow about_popup send X Xmain_menu /setmenu panel send Xtrue /setmenuable panel send X Xwin /Colormap get /Installed true put X X/seasons 4 dict dup begin X [ /spring /winter /summer /fall ] { dup def } forall Xend def X/flowers 4 dict dup begin X [ /bamboo /mum /orchid /plum ] { dup def } forall Xend def X X/special_matches 8 dict dup begin X seasons { X pop seasons def X } forall X X flowers { X pop flowers def X } forall Xend def X X/pieces_match? { % X special_matches /whoami piece1 send known { X special_matches /whoami piece1 send get /whoami piece2 send known X } { X /whoami piece1 send /whoami piece2 send eq X } ifelse X} def X X/piece1 null def X/piece2 null def X X/tile_count 0 def X X/setup_board { X /Busy /setvisualstate win send X X () (Getting tiles) /setfooter win send X pause X init_tiles X pause X X % Ground floor X (Right most tile) (Building pile) /setfooter win send pause X X % Here is where a second game breaks... bet its the addclient... X /ti get_tile def X (14-3.5-0) ti [ 14 54 mul 520 3.5 64 mul sub ] /addclient panel send X [14 3.5 0] /setwhereiam ti send X /totop ti send X X (Right side tile) (Building pile) /setfooter win send pause X /ti get_tile def X (13-3.5-0) ti [ 13 54 mul 520 3.5 64 mul sub ] /addclient panel send X [13 3.5 0] /setwhereiam ti send X /totop ti send X X (Ground floor) (Building pile) /setfooter win send pause X 1 12 0 0 fill_row X 3 10 1 0 fill_row X 2 11 2 0 fill_row X 1 12 3 0 fill_row X 1 12 4 0 fill_row X 2 11 5 0 fill_row X 3 10 6 0 fill_row X 1 12 7 0 fill_row X X % First floor X (First floor) (Building pile) /setfooter win send pause X X 4 9 1 1 fill_row X 4 9 2 1 fill_row X 4 9 3 1 fill_row X 4 9 4 1 fill_row X 4 9 5 1 fill_row X 4 9 6 1 fill_row X X % Second floor X (Second floor) (Building pile) /setfooter win send pause X X 5 8 2 2 fill_row X 5 8 3 2 fill_row X 5 8 4 2 fill_row X 5 8 5 2 fill_row X X % Third floor X (Third floor) (Building pile) /setfooter win send pause X X 6 7 3 3 fill_row X 6 7 4 3 fill_row X X (Left Blocker) (Building pile) /setfooter win send pause X /ti get_tile def X (0-3.5-0) ti [ 0 520 3.5 64 mul sub ] /addclient panel send X [0 3.5 0] /setwhereiam ti send X /totop ti send X X (Top Tile) (Building pile) /setfooter win send pause X /ti get_tile def X (6.5-3.5-4) ti [ X 6.5 54 mul 40 add 520 3.5 65 mul sub 40 add X ] /addclient panel send X [6.5 3.5 4] /setwhereiam ti send X /totop ti send X pause X X () (Laying tiles out) /setfooter win send pause X X /validate panel send X pause X () (Displaying tiles) /setfooter win send pause X tiles { X /map exch send X } forall X /Active /setvisualstate win send X (Tiles left: 144) () /setfooter win send pause X} def X X X% Remove all the tiles as clients X/finish_old_game { X /Busy /setvisualstate win send X (Cleaning up old game...) () /setfooter win send pause X /ClientDict panel send { X pop /removeclient panel send { X pop X } if X pause X } forall X /Active /setvisualstate win send X} def X X/new_game { X /tile_count 144 def X /forfit false def X setup_board X} def Xnew_game Xnewprocessgroup currentfile closefile X X X END_OF_FILE if test 24253 -ne `wc -c <'mahjongg'`; then echo shar: \"'mahjongg'\" unpacked with wrong size! fi chmod +x 'mahjongg' # end of 'mahjongg' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0