'Marblez by Paul Love - additions by Brian D. Pugh, May 30, 2002 'Updated for no other reason than my Grandson loves it! 'Version number changed to 1.1 to reflect updates 'Added an icon for exe creation 'Added statusbar to show accumulated points and countdown of marbles removed 'Sounds added: Creation of new window, successful removal of marbles and illegal removal of marbles 'Set icon for "About Marblez" message to show information icon 'Changed 'Quit' to 'Exit' (pedantic or what!) 'Inserted menu separator into 'Game' menu 'Window size adjustment to remove white space AUTODEFINE "off" WINDOW win INT left,top,width,height,panes[2],marbles,run DIALOG d1,d2 UINT bitmap0,bitmapb0,bitmapr0,bitmapy0 INT i,j,k,l,ii,jj,kk,count,rmax,cmax INT x,y,w,h,mi,mj,pi,pj,xi,xj,red,blue,yellow,starti,startj INT xx,hi,hj,score,answer ISTRING path$[260] 'cellcolor: color (0=blue,1=red,2=yellow,3=blank) cellstate: state(0=unmarked,1=marked,2=removed) INT cellcolor[12,18],cellstate[12,18],oldcolor[12,18] FILE helpfile CREATEDIALOG d1,20,20,500,300,@CAPTION|@SYSMENU,0,"Marblez Help File",&dhandler1 CONTROL d1,@RICHEDIT,"Marblez 1.1",5,5,250,25,@CTEDITRO,10 CONTROL d1,@RICHEDIT,"",15,30,470,260,@CTEDITMULTI,20 CREATEDIALOG d2,50,50,400,250,@CAPTION|@SYSMENU,0,"Marblez 1.1",&dhandler2 CONTROL d2,@RICHEDIT,"",65,60,300,25,@CTEDITRO,10 CONTROL d2,@RICHEDIT,"",25,140,350,25,@CTEDITRO,20 path$=GETSTARTPATH bitmap0= LOADIMAGE(path$+"blank.bmp",@IMGBITMAP) bitmapb0=LOADIMAGE(path$+"bstone.bmp",@IMGBITMAP) bitmapr0=LOADIMAGE(path$+"rstone.bmp",@IMGBITMAP) bitmapy0=LOADIMAGE(path$+"ystone.bmp",@IMGBITMAP) OPENWINDOW win,0,0,644,464,@CAPTION|@SYSMENU,0,"Marblez 1.1",&mainwindow BEGINMENU win MENUTITLE "&Game" MENUITEM "&New game",0,1 SEPARATOR MENUITEM "E&xit",0,3 ENDMENU BEGININSERTMENU win,1 MENUTITLE "&Help" MENUITEM "&Contents",0,11 SEPARATOR MENUITEM "&About Marblez",0,12 ENDMENU CONTROL win,@STATUS,"Status",0,0,0,0,0,2 GETCLIENTSIZE win,left,top,width,height panes=width/2,-1 CONTROLCMD win,2,@SWSETPANES,2,panes UINT hIcon1=LOADIMAGE(path$+"marblez.ico",@IMGICON) SETICON win,hIcon1 SHOWWINDOW win,@SWHIDE answer = DOMODAL d2 SHOWWINDOW win,@SWRESTORE initialize() 'build game window FOR i = 0 TO 9 FOR j = 0 TO 15 x = j * 40 y = i * 40 k = RND(3) cellstate[i,j]=0 SELECT k CASE 0 SHOWIMAGE win,bitmapb0,4,x,y 'blue, stationary cellcolor[i,j]=0 CASE 1 SHOWIMAGE win,bitmapr0,4,x,y 'red, stationary cellcolor[i,j]=1 CASE 2 SHOWIMAGE win,bitmapy0,4,x,y 'yellow, stationary cellcolor[i,j]=2 ENDSELECT NEXT j NEXT i run=1 WAITUNTIL run=0 CLOSEWINDOW win END SUB mainwindow(),INT SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW win cASE @IDCLOSEWINDOW DELETEIMAGE bitmap0,@IMGBITMAP DELETEIMAGE bitmapb0,@IMGBITMAP DELETEIMAGE bitmapr0,@IMGBITMAP DELETEIMAGE bitmapy0,@IMGBITMAP DELETEIMAGE hIcon1,@IMGICON run=0 CASE @IDMENUPICK SELECT @MENUNUM CASE 1 initialize() showit() CASE 3 DELETEIMAGE bitmap0,@IMGBITMAP DELETEIMAGE bitmapb0,@IMGBITMAP DELETEIMAGE bitmapr0,@IMGBITMAP DELETEIMAGE bitmapy0,@IMGBITMAP DELETEIMAGE hIcon1,@IMGICON run = 0 CASE 11 SHOWWINDOW win,@SWHIDE answer = DOMODAL d1 SHOWWINDOW win,@SWRESTORE CASE 12 MESSAGEBOX win,"This is a (rough) adaption of David Cuny's 'Stones' game","Marblez",64 ENDSELECT CASE @IDCONTROL SELECT @CONTROLID CASE @IDLBUTTONDN mi = @MOUSEY mj = @MOUSEX i = CEIL(mi / 40)-1 j = CEIL(mj / 40)-1 count = 0 IF (i>=0) & (i<=9) & (j>=0) & (j<=15) hi = i hj = j xx = cellcolor[i,j] FOR ii = 0 TO rmax FOR jj = 0 TO cmax 'set all marbles to 'unmarked' cellstate[ii,jj]=0 oldcolor[ii,jj]=cellcolor[ii,jj] NEXT jj NEXT ii 'mark origin stone and all adjacent stones cellstate[i,j]=1 count+=1 ii = i+1 jj = j WHILE ii < rmax+1 IF cellcolor[ii,jj]<>xx ii = rmax+1 ELSE cellstate[ii,jj]=1 count+=1 ENDIF ii+=1 ENDWHILE ii = i-1 jj = j WHILE ii >=0 IF cellcolor[ii,jj]<>xx ii = -1 ELSE cellstate[ii,jj]=1 count+=1 ENDIF ii-=1 ENDWHILE ii = i jj = j + 1 WHILE jj < cmax+1 IF cellcolor[ii,jj]<>xx jj = cmax+1 ELSE cellstate[ii,jj]=1 count+=1 ENDIF jj+=1 ENDWHILE ii = i jj = j - 1 WHILE jj >= 0 IF cellcolor[ii,jj]<>xx jj = -1 ELSE cellstate[ii,jj]=1 count+=1 ENDIF jj-=1 ENDWHILE 'cannot remove a marble IF count < 2 PLAYWAVE path$+"ohoh.wav",@SNDASYNC marbles+=1 cellstate[i,j]=0 ELSE score = score + (count * count) PLAYWAVE path$+"inplace.wav",@SNDASYNC CONTROLCMD win,2,@SWSETPANETEXT,0,"Score: " + STR$(score) ENDIF 'remove marked stones IF count > 1 FOR ii = 0 TO rmax FOR jj = 0 TO cmax IF cellstate[ii,jj]=1 cellstate[ii,jj]=2 cellcolor[ii,jj]=3 ENDIF NEXT jj NEXT ii 'compress columns FOR jj = 0 TO cmax FOR kk = 0 TO rmax cellstate[kk,cmax+2]=2 cellcolor[kk,cmax+2]=3 NEXT kk kk = rmax+1 FOR ii = rmax TO 0 STEP -1 IF cellstate[ii,jj]<>2 kk-=1 cellstate[kk,cmax+2]=cellstate[ii,jj] cellcolor[kk,cmax+2]=cellcolor[ii,jj] ENDIF NEXT ii FOR ii = 0 TO rmax cellstate[ii,jj]=cellstate[ii,cmax+2] cellcolor[ii,jj]=cellcolor[ii,cmax+2] NEXT ii NEXT jj 'Move empty columns xj = cmax+1 jj = 0 WHILE jj < xj - 1 IF cellcolor[rmax,jj]=3 xj = xj - 1 FOR ii = 0 TO rmax FOR hj = jj TO xj-1 cellstate[ii,hj]=cellstate[ii,hj+1] cellcolor[ii,hj]=cellcolor[ii,hj+1] NEXT hj cellstate[ii,xj]=2 cellcolor[ii,xj]=3 NEXT ii jj-=1 ENDIF jj+=1 ENDWHILE 'repaint screen FOR i = 0 TO 9 FOR j = 0 TO 15 x = j * 40 y = i * 40 k = cellcolor[i,j] SELECT k CASE 0 IF oldcolor[i,j]<>cellcolor[i,j] SHOWIMAGE win,bitmapb0,4,x,y ENDIF CASE 1 IF oldcolor[i,j]<>cellcolor[i,j] SHOWIMAGE win,bitmapr0,4,x,y ENDIF CASE 2 IF oldcolor[i,j]<>cellcolor[i,j] SHOWIMAGE win,bitmapy0,4,x,y ENDIF CASE 3 IF oldcolor[i,j]<>cellcolor[i,j] SHOWIMAGE win,bitmap0,4,x,y ENDIF ENDSELECT NEXT j NEXT i ENDIF ' show count of remaining marbles marbles = marbles - count IF marbles < 1 THEN marbles = 0 CONTROLCMD win,2,@SWSETPANETEXT,1,"Marblez left: " + STR$(marbles) endif endselect ENDSELECT RETURN 0 ENDSUB SUB showit() FOR i = 0 TO 9 FOR j = 0 TO 15 x = j * 40 y = i * 40 k = INT(RND(3)) cellstate[i,j]=0 SELECT k CASE 0 SHOWIMAGE win,bitmapb0,4,x,y 'blue, stationary cellcolor[i,j]=0 CASE 1 SHOWIMAGE win,bitmapr0,4,x,y ' red, stationary cellcolor[i,j]=1 CASE 2 SHOWIMAGE win,bitmapy0,4,x,y ' yellow, stationary cellcolor[i,j]=2 ENDSELECT NEXT j NEXT i ENDSUB SUB initialize() PLAYWAVE path$+"laser.wav",@SNDASYNC w = 40 h = 40 rmax = 9 cmax = 15 score = 0 int running = 1 red = -1 blue = -1 yellow = -1 i = -1 j = -1 marbles = 160 CONTROLCMD win,2,@SWSETPANETEXT,0,"Score: " + STR$(score) CONTROLCMD win,2,@SWSETPANETEXT,1,"Marblez: " + STR$(marbles) ENDSUB SUB dhandler1(),INT SELECT @MESSAGE CASE @IDINITDIALOG SETICON d1,hIcon1 CENTERWINDOW d1 SETCONTROLCOLOR d1,10,0,RGB(192,192,192) CONTROLCMD d1,10,@RTSETDEFAULTFONT,"Times New Roman",11,1,@SFITALIC CONTROLCMD d1,10,@RTSETDEFAULTCOLOR,RGB(0,0,255) IF(OPENFILE(helpfile,path$+"marblez.txt","R") = 0) int err = CONTROLCMD(d1,20,@RTLOAD,helpfile,0) CLOSEFILE helpfile ENDIF CASE @IDCLOSEWINDOW CLOSEDIALOG d1,@IDCANCEL ENDSELECT RETURN 0 ENDSUB SUB dhandler2(),INT SELECT @MESSAGE CASE @IDINITDIALOG SETICON d2,hIcon1 CENTERWINDOW d2 SETCONTROLCOLOR d2,10,0,RGB(192,192,192) CONTROLCMD d2,10,@RTSETDEFAULTFONT,"Times New Roman",14,1,@SFITALIC|@SFUNDERLINE CONTROLCMD d2,20,@RTSETDEFAULTFONT,"Times New Roman",11,1,@SFITALIC CONTROLCMD d2,10,@RTSETDEFAULTCOLOR,RGB(0,0,255) SETCONTROLTEXT d2,10,"Marblez 1.1 - powered by IWBasic" SETCONTROLTEXT d2,20,"\""+"Basic limited only by the power of your imagination"+"\"" CASE @IDCLOSEWINDOW CLOSEDIALOG d2,@IDCANCEL ENDSELECT RETURN 0 ENDSUB