Code:
'Bervini Raffaello Switzerland 'PowerBasic PBWin 'www.bervini.net/raffaello/ for all the bmp #COMPILE EXE #DIM ALL #INCLUDE "win32api.inc" '------------------------------------------------------------------------------ %id_fondo = 100 %id_info = 110 %id_rullo = 110 %id_start = 120 %id_quick = 130 %id_timer1 = 200 $radice="carta" '$radice="dado" GLOBAL hDlg AS DWORD '------------------------------------------------------------------------------ GLOBAL iter,larghezza_finestra,altezza_finestra,id_bmp(),id_tmp,id_cil(),continuo AS LONG GLOBAL fondo_bmp AS STRING GLOBAL figure,rulli AS LONG '------------------------------------------------------------------------------ FUNCTION PBMAIN () AS LONG LOCAL ff,j,Count,px,py,la,al AS LONG RANDOMIZE TIMER IF COMMAND$<>"" THEN figure=VAL(PARSE$(COMMAND$," ",2)):rulli=VAL(PARSE$(COMMAND$," ",1)) IF figure=0 THEN figure=3 IF rulli=0 THEN rulli=3 ff=FREEFILE:OPEN $radice+"1.bmp" FOR BINARY AS ff:GET #ff,19,larghezza_finestra:GET #ff,23,altezza_finestra:CLOSE ff IF larghezza_finestra=0 THEN larghezza_finestra=150 IF altezza_finestra=0 THEN altezza_finestra=98 px=10:py=50:la=larghezza_finestra*rulli+px*2:al=altezza_finestra*3+py*2 DIALOG NEW PIXELS,0,"Versione 0.1 Bervini Soft",,,la,al,%WS_CAPTION OR %WS_SYSMENU,0*%WS_EX_TOOLWINDOW OR %WS_EX_TOPMOST TO hDlg CONTROL ADD GRAPHIC,hDlg,%id_fondo,"",0,0,la,al GRAPHIC ATTACH hDlg,%id_fondo,REDRAW GRAPHIC RENDER "slot.bmp",(0,0)-(la,al) GRAPHIC GET BITS TO fondo_bmp CONTROL ADD GRAPHIC,hDlg,%id_info,"",10,10,la-20,py-20 FOR j=1 TO rulli CONTROL ADD GRAPHIC,hDlg,%id_rullo+j,"x",px+(j-1)*larghezza_finestra,py,larghezza_finestra,altezza_finestra*3,%ss_notify NEXT px=10:la=(la-2*px)/2 CONTROL ADD GRAPHIC,hDlg,%id_start,"play" ,px,al-py/2-10,la,30,%ss_notify:px=px+la GRAPHIC ATTACH hDlg,%id_start:GRAPHIC SET BITS fondo_bmp CALL scrivi(%id_start,"PLAY","arial",3,%YELLOW) CONTROL ADD GRAPHIC,hDlg,%id_quick,"quick",px,al-py/2-10,la,30,%ss_notify:px=px+la CALL scrivi(%id_quick,"QUICK","arial",3,%YELLOW) DIALOG SHOW MODAL hDlg,CALL DlgProc END FUNCTION '------------------------------------------------------------------------------ CALLBACK FUNCTION DlgProc () AS LONG LOCAL j AS LONG STATIC idEvent AS LONG SELECT CASE CBMSG CASE %WM_INITDIALOG idEvent=SetTimer(CBHNDL,%ID_TIMER1,10,BYVAL %NULL) CALL inizializza CASE %WM_TIMER IF CBWPARAM = %ID_TIMER1 THEN IF continuo=1 THEN CALL quick(altezza_finestra) END IF CASE %WM_DESTROY IF idEvent THEN KillTimer CBHNDL,idEvent CASE %WM_COMMAND SELECT CASE CBCTL CASE %id_start:continuo=0:CALL playwave("cashtill.wav",%SND_aSYNC):SLEEP 100:CALL slot(altezza_finestra):SLEEP 1000 CASE %id_quick:IF continuo=0 THEN continuo=1 ELSE continuo=0 CASE %IDCANCEL DIALOG END CBHNDL,0 END SELECT END SELECT END FUNCTION '----------------------------------------------------------------------------- SUB PlayWave(BYVAL File AS STRING,modo AS LONG) LOCAL zWav AS ASCIIZ*256 zWav = File$ PlaySound zWav,BYVAL %NULL,modo END SUB '------------------------------------------------------------------------------ SUB color2rgb(colore AS LONG,red AS LONG,green AS LONG,blue AS LONG) Red=colore AND &H000000FF SHIFT RIGHT colore,8 Green=colore AND &H000000FF SHIFT RIGHT colore,8 Blue=colore AND &H000000FF END SUB '------------------------------------------------------------------------------ SUB muovi(id_mem AS LONG,id AS LONG,py AS SINGLE) LOCAL la_win,al_win,id_tmp,j AS LONG STATIC al_bmp,la_bmp AS LONG GRAPHIC ATTACH hDlg,id,REDRAW GRAPHIC GET CLIENT TO la_win,al_win IF la_bmp=0 OR al_bmp=0 THEN GRAPHIC ATTACH id_mem,0,REDRAW:GRAPHIC GET CLIENT TO la_bmp,al_bmp GRAPHIC BITMAP NEW la_bmp,al_bmp TO id_tmp:GRAPHIC ATTACH id_tmp,0,REDRAW IF py>0 THEN GRAPHIC COPY id_mem,0,(0,0)-(la_bmp-1,al_bmp-py) TO (0,py) GRAPHIC COPY id_mem,0,(0,al_bmp-py)-(la_bmp,al_bmp) TO (0,0) GRAPHIC ATTACH id_mem,0,REDRAW:GRAPHIC COPY id_tmp,0,(0,0)-(la_bmp-0,al_bmp-0) TO (0,0):GRAPHIC ATTACH id_tmp,0,REDRAW END IF GRAPHIC BITMAP END GRAPHIC ATTACH hDlg,id,REDRAW GRAPHIC COPY id_mem,id,(0,0)-(la_win,al_win) TO (0,0) FOR j=3 TO 1 STEP -1 GRAPHIC LINE (0,al_win/2+j)-(la_win/6,al_win/2+j),RGB(255-j*20,25,25) GRAPHIC LINE (5*la_win/6,al_win/2+j)-(la_win,al_win/2+j),RGB(255-j*20,25,25) NEXT 'scurisce parte sopra LOCAL PixelPtr AS LONG PTR,xsize,ysize,red,green,blue AS LONG,bmp AS STRING,soglia AS SINGLE GRAPHIC GET BITS TO bmp:xsize=CVL(bmp,1):ysize=CVL(bmp,5) PixelPtr=STRPTR(bmp)+8:soglia=0 FOR j=1 TO .04*xsize*ysize:INCR PixelPtr:NEXT FOR j=.04*xsize*ysize TO xsize*ysize/3:soglia=soglia+.00009:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):INCR PixelPtr:NEXT FOR j=xsize*ysize/3 TO xsize*ysize:INCR PixelPtr:NEXT 'scurisce parte sotto PixelPtr=STRPTR(bmp)+8:soglia=1 FOR j=1 TO 2*xsize*ysize/3:INCR PixelPtr:NEXT FOR j=2*xsize*ysize/3 TO .96*xsize*ysize:soglia=soglia-.0001:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):INCR PixelPtr:NEXT FOR j=.96*xsize*ysize TO xsize*ysize:INCR PixelPtr:NEXT GRAPHIC SET BITS bmp 'linee orizzontali GRAPHIC LINE (0,al_win/3-1)-(la_win,al_win/3-1),RGB(255,205,205) GRAPHIC LINE (0,2*al_win/3)-(la_win,2*al_win/3),RGB(255,205,205) 'bordi in alto e basso FOR j=0 TO .04*al_win :GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j+6),1255/(j+6),1255/(j+60)):NEXT FOR j=0.96*al_win TO al_win:GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j-.96*al_win+6),1255/(j-.96*al_win+6),1255/(j-.96*al_win+60)):NEXT GRAPHIC REDRAW END SUB '------------------------------------------------------------------------------ SUB caricaimmagine(nomefile AS STRING,id_bmp AS LONG) LOCAL ff,la,al,id_bmp_tmp AS LONG IF DIR$(nomefile)="" THEN GRAPHIC BITMAP NEW larghezza_finestra,altezza_finestra TO id_bmp GRAPHIC ATTACH id_bmp,0,REDRAW GRAPHIC CLEAR RGB(RND*255,RND*255,RND*255) GRAPHIC COLOR RGB(RND*255,RND*255,RND*255),-2 GRAPHIC PRINT "qui ci va bmp 150x98" GRAPHIC COLOR RGB(RND*255,RND*255,RND*255),-2 GRAPHIC FONT "arial",16,1 GRAPHIC PRINT nomefile GRAPHIC COPY id_bmp,0 GRAPHIC WINDOW END ELSE ff=FREEFILE:OPEN nomefile FOR BINARY AS ff:GET #ff,19,la:GET #ff,23,al:CLOSE ff GRAPHIC BITMAP LOAD nomefile,la,al TO id_bmp_tmp GRAPHIC BITMAP NEW larghezza_finestra,altezza_finestra TO id_bmp GRAPHIC ATTACH id_bmp,0,REDRAW ' GRAPHIC COPY id_bmp_tmp,0 GRAPHIC STRETCH id_bmp_tmp,0,(0,0)-(la,al) TO (0,0)-(larghezza_finestra,altezza_finestra) GRAPHIC WINDOW END END IF END SUB '------------------------------------------------------------------------------ SUB creacilindro(id() AS LONG,item AS LONG,id_cil AS LONG) LOCAL j,la,al,r AS LONG IF id_cil<>0 THEN GRAPHIC ATTACH id_cil,0:GRAPHIC WINDOW END GRAPHIC ATTACH id(1),0,REDRAW:GRAPHIC GET CLIENT TO la,al GRAPHIC BITMAP NEW la,al*item TO id_cil GRAPHIC ATTACH id_cil,0,REDRAW FOR j=0 TO item-1 GRAPHIC COPY id(j+1),0 TO (0,al*j) GRAPHIC COLOR %GREEN,-2:GRAPHIC SET POS(0,al*j):GRAPHIC PRINT j+1 GRAPHIC SET PIXEL (1,1+al*j),RGB(j+1,0,0) NEXT GRAPHIC REDRAW 'salva l'immagine del rullo 'GRAPHIC SAVE "cil"+TRIM$(STR$(%figure))+".bmp" END SUB '------------------------------------------------------------------------------ SUB slot(af AS LONG) LOCAL y() AS SINGLE LOCAL i,j,maxk,k(),finale(),colore_tmp,tot AS LONG,colore AS STRING DIM k(0 TO rulli),y(0 TO rulli),finale(0 TO rulli) %velocita=24'12 INCR iter 'randomizza la posizione iniziale del cilindro FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,RND(1,figure)*af):NEXT FOR j=1 TO rulli k(j)=RND(5,figure*12)*af:IF maxk<k(j) THEN maxk=k(j) NEXT FOR j=1 TO maxk FOR i=1 TO rulli IF k(i)=>1 THEN y(i)=1+k(i)\%velocita:CALL muovi(id_cil(i),%id_rullo+i,MIN(af,y(i))):k(i)=k(i)-MIN(af,y(i)) ELSE finale(i)=1 NEXT tot=0:FOR i=1 TO rulli:tot=tot+finale(i):NEXT IF tot=rulli THEN playwave("Whop.wav",%SND_aSYNC):EXIT FOR NEXT FOR j=1 TO rulli GRAPHIC ATTACH hDlg,%id_rullo+j,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore_tmp colore=colore+CHR$(64+colore_tmp) NEXT CALL esaminavincite(colore) END SUB '------------------------------------------------------------------------------ SUB esaminavincite(c AS STRING) LOCAL j,colore AS LONG STATIC vincita AS LONG vincita=vincita-1 FOR j=1 TO LEN(c) IF TALLY(c,CHR$(64+j))=rulli THEN vincita=vincita+10:EXIT FOR ' IF TALLY(c,CHR$(64+j))=rulli-1 THEN vincita=vincita+2:EXIT FOR NEXT IF vincita>=0 THEN colore=%GREEN ELSE colore=%RED CALL scrivi(%id_info,STR$(iter)+" giocate"+" : "+c+" Saldo "+STR$(vincita)+" fr","times new roman",3,colore) END SUB '------------------------------------------------------------------------------ SUB scrivi(id AS LONG,testo AS STRING,fonte AS STRING,posizione AS LONG,colore AS LONG) LOCAL la,al,l,a AS LONG GRAPHIC ATTACH hDlg,id,REDRAW GRAPHIC GET CLIENT TO la,al GRAPHIC CLEAR RGB(80,20,20) GRAPHIC SET BITS fondo_bmp GRAPHIC FONT fonte,18,0 GRAPHIC TEXT SIZE testo TO l,a IF posizione<0 THEN posizione=al+posizione GRAPHIC SET POS((la-l)/2+1,posizione+1):GRAPHIC COLOR %BLACK,-2:GRAPHIC PRINT testo GRAPHIC SET POS((la-l)/2,posizione):GRAPHIC COLOR colore,-2:GRAPHIC PRINT testo GRAPHIC REDRAW END SUB '------------------------------------------------------------------------------ SUB quick(af AS LONG) LOCAL i,j,colore_tmp AS LONG,colore AS STRING INCR iter 'randomizza la posizione iniziale del cilindro FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,RND(1,figure)*af):NEXT FOR j=1 TO rulli GRAPHIC ATTACH hDlg,%id_rullo+j,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore_tmp colore=colore+CHR$(64+colore_tmp) NEXT CALL esaminavincite(colore) END SUB '------------------------------------------------------------------------------ SUB inizializza LOCAL j AS LONG GRAPHIC ATTACH hDlg,%id_fondo,REDRAW GRAPHIC SET BITS fondo_bmp DIM id_bmp(0 TO figure),id_cil(0 TO rulli) FOR j=1 TO figure:CALL caricaimmagine($radice+TRIM$(STR$(j))+".bmp",id_tmp):id_bmp(j)=id_tmp:NEXT FOR j=1 TO rulli:CALL creacilindro(id_bmp(),figure,id_cil(j)):NEXT FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,BYCOPY altezza_finestra):NEXT CALL scrivi(%id_info,"Slot Machine ("+STR$(rulli)+" rulli e"+STR$(figure)+" figure)"+STR$(figure^rulli),"times new roman",3,%MAGENTA) END SUB '------------------------------------------------------------------------------