home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / PKISS77.LHA / PlayKiss / src / k.e < prev    next >
Encoding:
Text File  |  1994-11-09  |  49.8 KB  |  1,728 lines

  1.  
  2. /* Play KiSS v 0.77 */
  3.  
  4. /*
  5.     No copyright is claimed for *any* material within.
  6.   This source is *currently* Public Domain, and therefore open to free exploitation. */
  7.  
  8. /* Use at your own risk, and watch for hairy palms. */
  9.  
  10.  
  11. /*  November 9, 1994
  12.                                              Chad Randall 
  13.                                                         - mbissaymssiK Software, broken spork division
  14.                         Internet:  crandall@garnet.msen.com
  15.                             USNail:  229 S.Washington St.
  16.                                              Manchester, Michigan, 48158-9680 USA */
  17.  
  18. /* This sucker's not been tested but on my machine.  So let me know about any probs, 'kay? */
  19.  
  20. OPT LARGE
  21.  
  22. MODULE    'graphics/rastport','graphics/gfx','graphics/text','graphics/scale','graphics/view',
  23.                 'graphics/gfxbase','graphics/clip','graphics/layers','graphics/displayinfo'
  24. MODULE    'layers'
  25. MODULE    'intuition/intuition','intuition/screens','intuition/gadgetclass','intuition/screens',
  26.                 'intuition/pointerclass'
  27. MODULE    'libraries/gadtools','gadtools'
  28. MODULE    'dos/dos'
  29. MODULE    'libraries/asl','asl'
  30. MODULE    'tools/async'
  31. MODULE    'wb','workbench/workbench','workbench/startup'
  32. MODULE    'icon'
  33. MODULE    'exec/memory'
  34.  
  35. CONST    GS1_SIZE_X=640,GS2_SIZE_X=640,GS3_SIZE_X=640,GS4_SIZE_X=768
  36. CONST    GS1_SIZE_Y=400,GS2_SIZE_Y=400,GS3_SIZE_Y=480,GS4_SIZE_Y=512
  37. CONST    GS1_MAX_COLOR=16,GS2_MAX_COLOR=256,GS3_MAX_COLOR=256,GS4_MAX_COLOR=256
  38. CONST    GS1_MAX_CELL=128,GS2_MAX_CELL=192,GS3_MAX_CELL=256,GS4_MAX_CELL=256
  39. CONST SIZE_X_218=448,SIZE_Y_218=320,SIZE_X_224C=640,SIZE_Y_224C=400
  40. CONST FILE_MARK_CELL=$20,FILE_MARK_PALET=$10
  41. CONST DEFAULT_SIKII_DITHER=36
  42. CONST DEFAULT_SIKII_GOSA=1300
  43. CONST DEFAULT_COEF_GOSA=25
  44. CONST MAX_CELL=GS4_MAX_CELL
  45. CONST MAX_SET=10,MAX_PAL=10,MAX_COLOR=GS4_MAX_COLOR
  46. CONST MAX_SIZE_X=GS4_SIZE_X,MAX_SIZE_Y=GS4_SIZE_Y
  47. CONST DEFAULT_SIZE_X=SIZE_X_218,DEFAULT_SIZE_Y=SIZE_Y_218
  48. CONST FILENAME_LENGTH=64
  49.  
  50. ENUM OLD_,NEW_
  51. ENUM    DRAG_TOP,DRAG_PAUSE,DRAG_DIRTY,DRAG_BUFFER,DRAG_SMART
  52.  
  53. OBJECT gcmap
  54.     red[256]:ARRAY OF CHAR
  55.     grn[256]:ARRAY OF CHAR
  56.     blu[256]:ARRAY OF CHAR
  57. ENDOBJECT
  58.  
  59. OBJECT cello
  60.     format:CHAR
  61.     bit_per_pixel:INT
  62.     xsize,ysize:INT
  63.     xoffset,yoffset:INT
  64.     mark:INT
  65.     init_fix,fix:INT
  66.     palet_num:INT
  67.     set[MAX_SET]:ARRAY OF CHAR
  68.     buf:PTR TO CHAR
  69.     mono_buf:PTR TO CHAR
  70.     x[MAX_SET]:ARRAY OF INT
  71.     y[MAX_SET]:ARRAY OF INT
  72.     pix:PTR TO bitmap
  73.     pix_rp:PTR TO rastport
  74.     pixdummy:PTR TO bitmap
  75.     clip_pix:PTR TO bitmap
  76.     clip_pix_rp:PTR TO rastport
  77.     clip_pixdummy:PTR TO bitmap
  78.     
  79. ->    gc:PTR TO gcmap
  80. ->    GC            gc,*paint_gc[MAX_PAL],gc_bw[2];
  81.   pal:INT
  82.     name:LONG
  83. ENDOBJECT
  84.  
  85. OBJECT paleto
  86.     name[FILENAME_LENGTH]:ARRAY OF CHAR
  87.     format:CHAR
  88.     color_num:CHAR
  89.     palet_num:CHAR
  90.     bit_per_pixel:CHAR
  91.     pb[MAX_PAL]:ARRAY OF INT
  92.     color[18]:ARRAY OF LONG
  93. ENDOBJECT
  94.  
  95. OBJECT color
  96.     red:LONG
  97.     green:LONG
  98.     blue:LONG
  99. ENDOBJECT
  100.  
  101. ENUM SCAN_NORMAL, SCAN_EOL, SCAN_SETDATA, SCAN_IBM, SCAN_CEL, SCAN_CELNUM, SCAN_CELNAME, SCAN_CELNEXT
  102.  
  103. DEF filename[500]:STRING
  104.  
  105. DEF vp:PTR TO viewport,cm,depth,scrw,scrh,menu,vis
  106. DEF rp:PTR TO rastport,winw,winh
  107.  
  108. DEF quit=FALSE,newproj=FALSE
  109. DEF mode=0
  110. DEF config_size_x,config_size_y
  111. DEF cell[MAX_CELL]:ARRAY OF cello
  112. DEF palet[20]:ARRAY OF paleto
  113.  
  114. DEF barh=8
  115. DEF pb[MAX_SET]:LIST
  116. DEF current_palet=0
  117. DEF current_set=0
  118. DEF disp:PTR TO rastport
  119. DEF scr:PTR TO screen
  120. DEF win:PTR TO window,outwin:PTR TO window
  121. DEF fixxed=FALSE,rtdrag=DRAG_TOP,waittof=TRUE,hand=FALSE,bound=TRUE
  122. DEF string[500]:STRING
  123. DEF iconbmap=0:PTR TO bitmap,iconwidth,iconheight,oldx,oldy
  124. DEF copybmap=0:PTR TO bitmap,copyrast:PTR TO rastport
  125. DEF backbmap=0:PTR TO bitmap,backrast:PTR TO rastport
  126. DEF maskbmap=0:PTR TO bitmap
  127. DEF blankbmap=0:PTR TO bitmap,maximumw=1,maximumh=1
  128. DEF hand1=0,hand2=0,hand3=0
  129. DEF curobj=0,offx,offy,dragmode=0
  130. DEF filereq=0:PTR TO filerequester
  131. ENUM OFF=FALSE,ON=TRUE
  132. DEF outputmode=0
  133. DEF pauseflag=FALSE
  134. RAISE "CHIP" IF AllocBitMap()=FALSE
  135. RAISE "MEM" IF AllocMem()=FALSE
  136. RAISE "MEM" IF New()=FALSE
  137. RAISE "^C" IF CtrlC()=TRUE
  138.  
  139. PROC check_str(str)
  140.     DEF p
  141.     p:=str;WHILE (Char(p)<>0)
  142.         IF ((Char(p)=10) OR (Char(p)=13) OR (Char(p)=9)) THEN PutChar(p," ")
  143.         IF (Char(p)=";")
  144.             PutChar(p,0)
  145.         ENDIF
  146.         EXIT (Char(p)=";")
  147.     p:=p+1;ENDWHILE
  148. ENDPROC
  149.  
  150. versionstring:
  151. CHAR    '\0$VER: kiss player 0.77 (9.11.94) \tPUBLIC DOMAIN --- NOT FOR RESALE\0\0'
  152.  
  153. /*PROC skip_str(str) ->char *skip_str(char *str)
  154.     DEF p                                                                                        ->       char *p;
  155.     p:=str;WHILE (Char(p)=" ");p:=p+1;ENDWHILE             ->        for (p=str;*p==' ';p++);
  156.   WHILE (Char(p)<>" ")                                                        ->        for (;*p!=' ';p++)
  157.         IF (Char(p)=0) THEN RETURN p                                    ->    if (*p=='\0') return(p);
  158.     p:=p+1;ENDWHILE
  159.     WHILE (Char(p)=" ");p:=p+1;ENDWHILE                            ->    for (;*p==' ';p++);
  160.   RETURN p
  161. ENDPROC*/
  162.  
  163. PROC check_kiss_header(fp)
  164.     DEF buf
  165.     buf:=[0,0,0,0]:LONG
  166.     Read(fp,buf,4)
  167.     Seek(fp,0,OFFSET_BEGINNING)
  168.     IF Long(buf)="KiSS" THEN RETURN 1
  169. ENDPROC FALSE
  170.  
  171.  
  172. PROC load_data_cell(fn,num) HANDLE
  173.     DEF fh=0
  174.     DEF buf[64]:ARRAY OF CHAR,tmp_buf
  175.     DEF i,t,j,x,y,flag
  176.     DEF b[MAX_SIZE_X]:ARRAY OF CHAR
  177.     DEF dir[500]:STRING,oldfile[100]:STRING
  178.     DEF nx,p,nrp
  179.  
  180.     DEF temprp=0:PTR TO rastport
  181.     DEF array=0
  182.     DEF tempbitmap=0:PTR TO bitmap
  183.  
  184.     splitname(filename,dir,oldfile)
  185.     AddPart(dir,fn,490)
  186.     fh:=as_Open(dir,MODE_OLDFILE,6,4000)
  187.     IF fh
  188.         as_Read(fh,buf,4)
  189.         IF Long(buf)="KiSS"
  190.             as_Read(fh,buf,28)
  191.             IF Char(buf)<>FILE_MARK_CELL THEN Raise("|cel")
  192.             cell[num].xsize:=((Char(buf+ 5)*256)+Char(buf+ 4))
  193.             cell[num].ysize:=(Char(buf+7)*256)+Char(buf+6)
  194.             cell[num].xoffset:=Char(buf+9)*256+Char(buf+8)
  195.             cell[num].yoffset:=Char(buf+11)*256+Char(buf+10)
  196.             cell[num].bit_per_pixel:=smaller(bigger(Char(buf+1),4),8)
  197.             cell[num].format:=NEW_
  198.         ELSE
  199.             cell[num].xsize:=(Char(buf+1)*256+Char(buf))
  200.             cell[num].ysize:=Char(buf+3)*256+Char(buf+2)
  201.             cell[num].xoffset:=0
  202.             cell[num].yoffset:=0
  203.             cell[num].bit_per_pixel:=4
  204.             cell[num].format:=OLD_
  205.         ENDIF
  206.  
  207.         IF cell[num].bit_per_pixel=8
  208.             cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,8,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
  209.             cell[num].pix_rp:=New(SIZEOF rastport)
  210.             InitRastPort(cell[num].pix_rp)
  211.             cell[num].pix_rp.bitmap:=cell[num].pix
  212.  
  213.             cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
  214.             cell[num].clip_pix_rp:=New(SIZEOF rastport)
  215.             InitRastPort(cell[num].clip_pix_rp)
  216.             cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
  217.         ELSE
  218.             cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,4,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
  219.             cell[num].pix_rp:=New(SIZEOF rastport)
  220.             InitRastPort(cell[num].pix_rp)
  221.             cell[num].pix_rp.bitmap:=cell[num].pix
  222.  
  223.             cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
  224.             cell[num].clip_pix_rp:=New(SIZEOF rastport)
  225.             InitRastPort(cell[num].clip_pix_rp)
  226.             cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
  227.         ENDIF
  228.  
  229.         temprp:=New(SIZEOF rastport)
  230.         InitRastPort(temprp)
  231.         CopyMem(cell[num].pix_rp,temprp,SIZEOF rastport)
  232.         tempbitmap:=AllocBitMap(cell[num].xsize,1,8,BMF_CLEAR,NIL)
  233.         temprp.bitmap:=tempbitmap
  234.         array:=New(cell[num].xsize+100)
  235.  
  236.  
  237. -> NEED TO OPTIMIZE THE FOLLOWING:::
  238.  
  239.         IF cell[num].bit_per_pixel=8
  240.             nx:=cell[num].xsize
  241.             nrp:=cell[num].pix_rp
  242.             FOR i:=0 TO cell[num].ysize-1
  243.  
  244.                 as_Read(fh,b,nx)
  245.  
  246.                 FOR t:=0 TO nx-1
  247.                     IF (p:=Char(b+t))
  248.                         SetAPen(nrp,Char(b+t))
  249.                         WritePixel(nrp,t,i)
  250.                     ENDIF
  251.                 ENDFOR
  252.             ENDFOR
  253.         ENDIF
  254.  
  255.         IF cell[num].bit_per_pixel=4
  256.             nx:=cell[num].xsize
  257.             nrp:=cell[num].pix_rp
  258.             FOR i:=0 TO cell[num].ysize-1
  259.  
  260.                 as_Read(fh,b,nx/2)
  261.  
  262.                 FOR t:=0 TO (nx-1) STEP 2
  263. /*                IF (p:= (Shr(Char(b+(t/2)),4) AND $0F))
  264.                     SetAPen(nrp,p)
  265.                     WritePixel(nrp,t,i)
  266.                 ENDIF
  267.                 IF (p:= (Char(b+(t/2)) AND $0F))
  268.                     SetAPen(nrp,p)
  269.                     WritePixel(nrp,t+1,i)
  270.                 ENDIF*/
  271.  
  272.                     PutChar(array+(t),(Shr(Char(b+(t/2)),4) AND $0F))
  273.                     PutChar(array+(t)+1,((Char(b+(t/2))) AND $0F))
  274.                 ENDFOR
  275.                 IF (nrp<>0) THEN WritePixelLine8(nrp,0,i,nx,array,temprp)
  276.             ENDFOR
  277.         ENDIF
  278.  
  279.         maximumw:=bigger(maximumw,nx)
  280.         maximumh:=bigger(maximumh,cell[num].ysize)
  281.  
  282.         IF ((cell[num].pix<>0) AND (cell[num].clip_pix<>0))
  283.             planesclip(cell[num].pix,cell[num].clip_pix,cell[num].xsize,cell[num].ysize)
  284.             FOR i:=1 TO 7;PutLong(cell[num].clip_pix+8+(i*4),Long(cell[num].clip_pix+8));ENDFOR
  285.             PutChar(cell[num].clip_pix+5,8)
  286.         ENDIF
  287.     ENDIF
  288. EXCEPT DO
  289.     IF fh;as_Close(fh);ELSE
  290.         IF outwin
  291.             StringF(string,'Object not found:"\s" ',fn)
  292.             SetWindowTitles(outwin,string,-1)
  293.             DisplayBeep(0)
  294.             Delay(30)
  295.         ENDIF
  296.     ENDIF
  297.     
  298.     IF temprp THEN Dispose(temprp)
  299.     IF array THEN Dispose(array)
  300.     IF tempbitmap THEN FreeBitMap(tempbitmap)
  301.     IF exception="CHIP"
  302.         WriteF('Not enough CHIP memory.\n')
  303.         DisplayBeep(0)
  304.     ENDIF
  305.     IF exception="^C" THEN ReThrow()
  306. ENDPROC
  307.  
  308. PROC disposesaveback()
  309.     DEF i
  310.     IF iconbmap THEN FreeBitMap(iconbmap)
  311.     IF copybmap THEN FreeBitMap(copybmap)
  312.     IF backbmap THEN FreeBitMap(backbmap)
  313.     IF backrast THEN Dispose(backrast)
  314.     IF copyrast THEN Dispose(copyrast)
  315.     IF maskbmap
  316.         PutChar(maskbmap+5,1)
  317.         FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),0);ENDFOR
  318.         FreeBitMap(maskbmap)
  319.     ENDIF
  320.     iconbmap:=0;backbmap:=0;maskbmap:=0;copybmap:=0;backrast:=0;copyrast:=0
  321. ENDPROC
  322.  
  323. PROC createsaveback(obj)
  324.     DEF i,minw=16,minh=8,dummy,mask
  325.     disposesaveback()
  326.     FOR i:=0 TO MAX_CELL-1
  327.         IF cell[i].mark=obj
  328.             minw:=bigger(minw,cell[i].xoffset+cell[i].xsize+1)
  329.             minh:=bigger(minh,cell[i].yoffset+cell[i].ysize+1)
  330.         ENDIF
  331.     ENDFOR
  332.     iconwidth:=minw
  333.     iconheight:=minh
  334.     iconbmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_CLEAR OR BMF_DISPLAYABLE OR IF (rtdrag<DRAG_DIRTY) THEN BMF_INTERLEAVED ELSE 0,NIL)
  335.     IF ((rtdrag=DRAG_BUFFER) OR (rtdrag=DRAG_SMART))
  336.         IF (((rtdrag=DRAG_SMART) AND (minw<160) AND (minh<280)) OR (rtdrag=DRAG_BUFFER))
  337.             copybmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_DISPLAYABLE OR BMF_INTERLEAVED,NIL)
  338.             copyrast:=New(SIZEOF rastport)
  339.             InitRastPort(copyrast)
  340.             copyrast.bitmap:=copybmap
  341.         ENDIF
  342.     ENDIF
  343.     backbmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_INTERLEAVED OR BMF_DISPLAYABLE,NIL)
  344.     backrast:=New(SIZEOF rastport)
  345.     InitRastPort(backrast)
  346.     backrast.bitmap:=backbmap
  347.     maskbmap:=AllocBitMap(minw,minh,1,BMF_DISPLAYABLE OR IF (rtdrag=FALSE) THEN BMF_INTERLEAVED ELSE 0,NIL)
  348.  
  349.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  350.         IF (cell[i].mark=obj)
  351.             IF (cell[i].set[current_set]<10)
  352.                 IF ((cell[i].clip_pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].clip_pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20,$FFFFFFFF,0)
  353.                 IF ((cell[i].pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,$FFFFFFFF,0)
  354.                 dummy:=cell[i].palet_num
  355.                 SELECT dummy
  356.                     CASE 0 ;mask:=%00000000
  357.                     CASE 1 ;mask:=%00010000
  358.                     CASE 2 ;mask:=%00100000
  359.                     CASE 3 ;mask:=%00110000
  360.                     CASE 4 ;mask:=%01000000
  361.                     CASE 5 ;mask:=%01010000
  362.                     CASE 6 ;mask:=%01100000
  363.                     CASE 7 ;mask:=%01110000
  364.                     CASE 8 ;mask:=%10000000
  365.                     CASE 9 ;mask:=%10010000
  366.                     CASE 10;mask:=%10100000
  367.                     CASE 11;mask:=%10110000
  368.                     CASE 12;mask:=%11000000
  369.                     CASE 13;mask:=%11010000
  370.                     CASE 14;mask:=%11100000
  371.                     CASE 15;mask:=%11110000
  372.                 ENDSELECT
  373.                 dummy:=retdepth(mode)
  374.                 SELECT dummy
  375.                     CASE 4;mask:=(mask AND %00000000)
  376.                     CASE 5;mask:=(mask AND %00010000)
  377.                     CASE 6;mask:=(mask AND %00110000)
  378.                     CASE 7;mask:=(mask AND %01110000)
  379.                     CASE 8;mask:=(mask AND %11110000)
  380.                 ENDSELECT
  381.                 IF ((cell[i].clip_pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].clip_pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,mask,0)
  382.             ENDIF
  383.         ENDIF            
  384.     ENDFOR
  385.  
  386.     planesclip(iconbmap,maskbmap,iconwidth,iconheight)
  387.     PutChar(maskbmap+5,8)
  388.     FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),Long(maskbmap+8));ENDFOR
  389.  
  390. ENDPROC
  391.  
  392. PROC reportmousemoves(win:PTR TO window)
  393.     Forbid()
  394.     win.flags:=win.flags OR WFLG_REPORTMOUSE
  395.     Permit()
  396. ENDPROC
  397. PROC noreportmousemoves(win:PTR TO window);DEF flag
  398.     Forbid()
  399.     flag:=win.flags
  400.     IF (flag AND WFLG_REPORTMOUSE) THEN flag:=flag-WFLG_REPORTMOUSE
  401.     win.flags:=flag
  402.     Permit()
  403. ENDPROC
  404.  
  405.  
  406. PROC main() HANDLE
  407.     DEF i,ii,t,zz,tt,zzz
  408.     DEF mes:PTR TO intuimessage
  409.     DEF hit,hitflag=0,iadd:PTR TO menuitem,drawx,drawy
  410.     DEF dir[500]:STRING,file[250]:STRING,buffer
  411.     DEF args:PTR TO wbarg,wstr[250]:STRING,toolobject=NIL:PTR TO diskobject
  412.     DEF region1,rectangle:PTR TO rectangle
  413.     DEF olddir,dirrr,wb:PTR TO wbstartup
  414.     DEF argarray[32]:LIST,rdarg=0,gotme=0,check,code=0,du=0
  415.     DEF zx,zy,zw,zh,zox,zoy
  416.     DEF oldfh=0,newfh=0,filebuf=0,bufptr,filelen=1
  417.     DEF menuverify=FALSE
  418.  
  419.     IF (KickVersion(39)=0)
  420.         Raise("Kick")
  421.     ENDIF
  422.  
  423.     buffer:=New(260*12)
  424.     IF (iconbase:=OpenLibrary('icon.library', 37))=NIL THEN Raise("LIB")
  425.     IF (aslbase:=OpenLibrary('asl.library', 37))=NIL THEN Raise("LIB")
  426.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise("LIB")
  427.     IF (layersbase:=OpenLibrary('layers.library',37))=NIL THEN Raise("LIB")
  428.  
  429.     NEW cell[MAX_CELL]
  430.     NEW palet[16]
  431.     NEW rectangle
  432.  
  433.     IF wbmessage<>NIL
  434.         outputmode:=TRUE
  435.         wb:=wbmessage;args:=wb.arglist
  436.         olddir:=CurrentDir(args.lock)
  437.         IF args.name>0
  438.             GetCurrentDirName(wstr,250)
  439.             StrCopy(filename,wstr,ALL);AddPart(filename,'',490)
  440.             StrAdd(wstr,args.name,ALL)
  441.             IF (toolobject:=GetDiskObjectNew(wstr))
  442.                 IF (du:=FindToolType(toolobject.tooltypes,'FIXED'))
  443.                     IF MatchToolValue(du,'yes');fixxed:=FALSE;ELSE;fixxed:=TRUE;ENDIF
  444.                 ENDIF
  445.                 IF (du:=FindToolType(toolobject.tooltypes,'KISS_DIRECTORY'))
  446.                     StrCopy(filename,du,ALL)
  447.                     AddPart(filename,'',490)
  448.                 ENDIF
  449.                 IF (du:=FindToolType(toolobject.tooltypes,'HANDPOINTER'))
  450.                     IF MatchToolValue(du,'yes');hand:=TRUE;ELSE;hand:=FALSE;ENDIF
  451.                 ENDIF
  452.                 IF (du:=FindToolType(toolobject.tooltypes,'BLANKPOINTER'))
  453.                     IF MatchToolValue(du,'yes');hand:=3;ENDIF
  454.                 ENDIF
  455.                 IF (du:=FindToolType(toolobject.tooltypes,'BOUNDS'))
  456.                     IF MatchToolValue(du,'no');bound:=FALSE;ELSE;bound:=TRUE;ENDIF
  457.                 ENDIF
  458.                 IF (du:=FindToolType(toolobject.tooltypes,'DRAGTYPE'))
  459.                     StrToLong(du,{rtdrag})
  460.                     du:=limit(du,DRAG_TOP,DRAG_SMART)
  461.                 ENDIF
  462.                 IF (du:=FindToolType(toolobject.tooltypes,'WAITBLITTER'))
  463.                     IF MatchToolValue(du,'no');waittof:=FALSE;ELSE;waittof:=TRUE;ENDIF
  464.                 ENDIF
  465.                 FreeDiskObject(toolobject)
  466.             ENDIF
  467.         ENDIF
  468.         CurrentDir(olddir)
  469.  
  470. ->        StrCopy(filename,wstr,ALL)
  471.         IF wb.numargs>1
  472.             olddir:=args[].lock++ ->skip our lock! olddir is meaningless at this point
  473.             IF args.lock
  474.                 olddir:=CurrentDir(args.lock)
  475.                 GetCurrentDirName(filename,490)
  476.                 NameFromLock(args.lock,wstr,240)
  477.                 CurrentDir(olddir)
  478.                 AddPart(filename,args.name,490)
  479.                 gotme:=TRUE
  480.             ENDIF
  481.         ENDIF
  482.     ELSE
  483.         FOR i:=0 TO 30
  484.             argarray[i]:=NIL
  485.         ENDFOR
  486.         rdarg:=ReadArgs('FILE,DRAGMODE=D/N,NOFIX=X/S,HAND=H/S,BLANKPTR=BP/S,NOWAITBLIT=NWB/S,NOBOUNDS=NOB/S',argarray,0)
  487.         IF rdarg
  488.             IF argarray[0]
  489.                 StrCopy(filename,argarray[0],ALL)
  490.                 gotme:=TRUE
  491.             ENDIF
  492.             IF argarray[1]
  493.                 rtdrag:=argarray[1]
  494.                 rtdrag:=^rtdrag
  495.                 rtdrag:=limit(rtdrag,DRAG_TOP,DRAG_SMART)
  496.             ENDIF
  497.             IF argarray[2]
  498.                 fixxed:=TRUE
  499.             ENDIF
  500.             IF argarray[3] THEN hand:=TRUE
  501.             IF argarray[4] THEN hand:=3
  502.             IF argarray[5] THEN waittof:=FALSE
  503.             IF argarray[6] THEN bound:=FALSE
  504.             FreeArgs(rdarg)
  505.         ENDIF
  506.     ENDIF
  507.  
  508.     FOR i:=0 TO MAX_CELL-1
  509.         cell[i].name:=String(FILENAME_LENGTH)
  510.         cell[i].mark:=-66
  511.     ENDFOR
  512.     FOR i:=0 TO 15
  513.         FOR ii:=0 TO 15
  514.             palet[i].color[ii]:=0
  515.         ENDFOR
  516.     ENDFOR
  517.  
  518.     PutLong({hand1bm}+8,{hand1dataa})
  519.     PutLong({hand1bm}+12,{hand1datab})
  520.     PutLong({hand2bm}+8,{hand2dataa})
  521.     PutLong({hand2bm}+12,{hand2datab})
  522.     PutLong({hand3bm}+8,{hand3dataa})
  523.     PutLong({hand3bm}+12,{hand3datab})
  524.     hand1:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand1bm},
  525.                             POINTERA_XOFFSET,-7,
  526.                             POINTERA_YOFFSET,0,
  527.                             POINTERA_XRESOLUTION,POINTERXRESN_HIRES,
  528.                             POINTERA_YRESOLUTION,POINTERYRESN_HIGHASPECT,
  529.                             NIL,NIL])
  530.     hand2:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand2bm},
  531.                             POINTERA_XOFFSET,-7,
  532.                             POINTERA_YOFFSET,1,
  533.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  534.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  535.                             NIL,NIL])
  536.     hand3:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand3bm},
  537.                             POINTERA_XOFFSET,0,
  538.                             POINTERA_YOFFSET,0,
  539.                             NIL,NIL])
  540.  
  541.  
  542.     filereq:=AllocAslRequest(ASL_FILEREQUEST,[ASLFR_INITIALPATTERN,'#?.CNF',NIL,NIL])
  543.  
  544.     region1:=NewRegion()
  545.  
  546.     WHILE quit=FALSE
  547.         IF (gotme<>TRUE)
  548.             splitname(filename,dir,file)
  549.             WbenchToFront()
  550.             ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
  551.                                 ASL_OKTEXT,'_Open',ASL_FILE,file,ASL_DIR,dir,
  552.                                 ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,FALSE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  553.             IF ii
  554.                 StrCopy(filename,filereq.drawer,ALL)
  555.                 AddPart(filename,filereq.file,490)
  556.             ELSE
  557.                 quit:=TRUE;StrCopy(filename,'',ALL)
  558.             ENDIF
  559.         ENDIF    ;gotme:=FALSE
  560.         mode:=0
  561.         maximumw:=1;maximumh:=1
  562.         scr:=LockPubScreen('Workbench')
  563.         config_size_x:=scr.width
  564.         config_size_y:=(scr.height)
  565.         barh:=scr.barheight
  566.         UnlockPubScreen(0,scr);scr:=0
  567.         IF openproj(filename)
  568.             openscreen(retdepth(mode))
  569.             ->blankbmap:=AllocBitMap(maximumw,maximumh,1,BMF_CLEAR OR BMF_DISPLAYABLE,NIL)
  570.             GetRGB32(cm,0,256,buffer)
  571.             current_set:=0
  572.             current_palet:=pb[current_set]
  573.             updatecolors()
  574.             updatelist()
  575.             newproj:=FALSE
  576.             WHILE ((quit=FALSE) AND (newproj=FALSE))
  577.                 IF ((hand<>0) AND (hand1<>0) AND (hand2<>0) AND (menuverify=FALSE))
  578.                     IF (retdepth(mode)<5)
  579.                         SetRGB32(vp,17,$FFFFFFFF,$DDDDDDDD,$88888888)
  580.                         SetRGB32(vp,18,$99999999,$66666666,$33333333)
  581.                         SetRGB32(vp,19,0,0,0)
  582.                     ENDIF
  583.                     IF (hand<>3)
  584.                         IF (dragmode=FALSE)
  585.                             SetWindowPointerA(win,[WA_POINTER,hand1,WA_POINTERDELAY,FALSE,NIL,NIL])
  586.                         ELSE
  587.                             SetWindowPointerA(win,[WA_POINTER,hand2,WA_POINTERDELAY,FALSE,NIL,NIL])
  588.                         ENDIF
  589.                     ELSE
  590.                         IF (dragmode<>FALSE)
  591.                             SetWindowPointerA(win,[WA_POINTER,hand3,WA_POINTERDELAY,FALSE,NIL,NIL])
  592.                         ELSE
  593.                             ClearPointer(win)
  594.                         ENDIF
  595.                     ENDIF                        
  596.                 ELSE
  597.                     ClearPointer(win)
  598.                 ENDIF
  599.                 Wait(-1)
  600.                 CtrlC()
  601.                 hitflag:=0
  602.                 WHILE (mes:=Gt_GetIMsg(win.userport))
  603.                     IF (mes.class=IDCMP_MENUVERIFY)
  604.                         IF dragmode
  605.                             mes.code:=MENUCANCEL
  606.                         ELSE
  607.                             menucolors(buffer)
  608.                             ClearPointer(win);menuverify:=TRUE
  609.                         ENDIF
  610.                     ENDIF
  611.                     IF (mes.class=IDCMP_MENUPICK)
  612.                         ClearPointer(win);menuverify:=FALSE
  613.                         code:=mes.code
  614.                         WHILE (code<>MENUNULL)
  615.                             iadd:=ItemAddress(menu,code)
  616.                             IF iadd
  617.                                 hit:=Long(iadd+34)
  618.                                 check:=(Int(iadd+12) AND CHECKED)
  619.                                 IF hit=75 THEN fixxed:=IF check THEN FALSE ELSE TRUE
  620.                                 IF hit=76 THEN IF check THEN hand:=0
  621.                                 IF hit=78 THEN IF check THEN hand:=TRUE
  622.                                 IF hit=79 THEN IF check THEN hand:=3
  623.                                 IF hit=77
  624.                                     bound:=IF check THEN TRUE ELSE FALSE
  625.                                 ENDIF
  626.                                 IF hit=89 THEN waittof:=IF check THEN TRUE ELSE FALSE
  627.                                 IF ((hit>=80) AND (hit<=84))
  628.                                     rtdrag:=hit-80
  629.                                 ENDIF
  630.                                 IF hit=66 THEN quit:=TRUE
  631.                                 IF hit=3 THEN hitflag:=3
  632.                                 IF hit=2 THEN hitflag:=2
  633.                                 IF hit=1 THEN newproj:=TRUE
  634.                                 IF ((hit>=30) AND (hit<=39))
  635.                                     IF current_set<>(hit-30)
  636.                                         current_set:=hit-30
  637.                                         current_palet:=pb[current_set]
  638.                                         updatecolors()
  639.                                         updatelist()
  640.                                     ENDIF
  641.                                 ENDIF
  642.                                 IF ((hit>=20) AND (hit<=29))
  643.                                     current_palet:=hit-20
  644.                                     updatecolors()
  645.                                 ENDIF
  646.                                 code:=iadd.nextselect
  647.                             ELSE
  648.                                 code:=MENUNULL
  649.                             ENDIF
  650.                         ENDWHILE
  651.                         updatecolors()
  652.                     ENDIF
  653.                     IF (mes.class=IDCMP_INTUITICKS) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
  654.                     IF (mes.class=IDCMP_MOUSEMOVE) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
  655.                     IF (mes.class=IDCMP_MOUSEBUTTONS)
  656.                         pauseflag:=FALSE
  657.                         IF mes.code=SELECTDOWN
  658.                             menuverify:=FALSE
  659.                             curobj,offx,offy:=findobj(mes.mousex,mes.mousey)
  660.                             IF (curobj>-1)
  661.                                 dragmode:=TRUE;reportmousemoves(win)
  662.                                 removeobj(curobj)
  663.                                 createsaveback(curobj)
  664.                                 oldx:=-5000;oldy:=-5000
  665.                                 ii:=0
  666.                                 FOR i:=0 TO MAX_CELL-1
  667.                                     IF cell[i].mark=curobj THEN ii:=ii+1
  668.                                 ENDFOR
  669. StringF(string,'Object #\d has \d cells. @(\d[3],\d[3]) CHIP:$\d',curobj,ii,mes.mousex-offx,mes.mousey-offy,AvailMem(MEMF_CHIP))
  670. SetWindowTitles(win,-1,string)
  671.                             ENDIF
  672.                         ENDIF
  673.                         IF mes.code=SELECTUP
  674.                             IF ((curobj>-1) AND (dragmode=TRUE))
  675.                                 IF backrast THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  676.                                 placeobj(curobj,mes.mousex-offx,mes.mousey-offy);pauseflag:=TRUE
  677.                                 disposesaveback()
  678.                                 dragmode:=FALSE;curobj:=-1;noreportmousemoves(win)
  679.                                 SetWindowTitles(win,-1,'KiSS Player 0.77')
  680.                             ENDIF
  681.                         ENDIF
  682.                     ENDIF
  683.               Gt_ReplyIMsg(mes)
  684.                 ENDWHILE
  685.                 SELECT hitflag
  686.                 CASE 2
  687.                     WbenchToFront()
  688.                     splitname(filename,dir,file)
  689.                     ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
  690.                             ASL_OKTEXT,'_Save',ASL_FILE,file,ASL_DIR,dir,
  691.                             ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  692.                     WbenchToBack()
  693.                     IF ii
  694.                         StrCopy(string,filename,ALL)
  695.                         StrCopy(filename,filereq.drawer,ALL)
  696.                         AddPart(filename,filereq.file,490)
  697.                         oldfh:=Open(filename,MODE_OLDFILE)
  698.                         newfh:=1
  699.                         IF oldfh
  700.                             Close(oldfh)
  701.                             menucolors(buffer)
  702.                             newfh:=EasyRequestArgs(win,[20,0,'Confirm overwrite!',
  703.                                 'File exists.\nDo you wish to overwrite?',
  704.                                 'Overwrite|Cancel'],0,0)
  705.                             updatecolors()
  706.                         ENDIF
  707.                         IF newfh
  708.                             SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  709.                             filelen:=FileLength(string)
  710.                             IF (filelen>0)
  711.                                 filebuf:=New(filelen)
  712.                                 oldfh:=Open(string,MODE_OLDFILE)
  713.                                 IF oldfh
  714.                                     Read(oldfh,filebuf,filelen)
  715.                                     Close(oldfh)
  716.                                     bufptr:=filebuf
  717.                                     WHILE ((((Char(bufptr)<>10) OR (Char(bufptr)<>13)) AND (Char(bufptr+1)<>"$")) AND (bufptr<=(filebuf+filelen)))
  718.                                         bufptr:=bufptr+1
  719.                                     ENDWHILE
  720.                                     newfh:=Open(filename,MODE_NEWFILE)
  721.                                     IF newfh
  722.                                         Write(newfh,filebuf,(bufptr-filebuf+1))
  723.                                         FOR i:=0 TO 9
  724.                                             StringF(string,'\n$\d[1]',pb[i]);Write(newfh,string,StrLen(string))
  725.                                             ii:=0
  726.                                             FOR t:=0 TO MAX_CELL-1
  727.                                                 IF (cell[t].set[i]<10)
  728.                                                     ii:=bigger(ii,cell[t].mark)
  729.                                                 ENDIF
  730.                                             ENDFOR
  731.                                             FOR t:=0 TO ii STEP 16
  732.                                                 FOR tt:=t TO smaller(t+15,ii)
  733.                                                     zz:=-11
  734.                                                     FOR zzz:=0 TO MAX_CELL-1
  735.                                                         IF (cell[zzz].set[i]<10)
  736.                                                             IF (cell[zzz].mark=tt)
  737.                                                                 zz:=zzz
  738.                                                             ENDIF
  739.                                                         ENDIF
  740.                                                     ENDFOR
  741.                                                     IF zz>=0
  742.                                                         StringF(string,' \d,\d',cell[zz].x[i],cell[zz].y[i])
  743.                                                         Write(newfh,string,StrLen(string))
  744.                                                     ELSE
  745.                                                         Write(newfh,' *',2)
  746.                                                     ENDIF
  747.                                                 ENDFOR
  748.                                                 Write(newfh,'\n',1)
  749.                                             ENDFOR
  750.                                             Write(newfh,'\n',1)
  751.                                         ENDFOR
  752.                                         Write(newfh,'\n;save file written by - Play KiSS v0.77 for Amiga computers\n\n\n',61)
  753.                                         Close(newfh)
  754.                                     ENDIF
  755.                                 ENDIF
  756.                                 Dispose(filebuf)
  757.                             ENDIF
  758.                             ClearPointer(win)
  759.                         ENDIF
  760.                     ENDIF
  761.                 CASE 3
  762.                     menucolors(buffer)
  763.                     EasyRequestArgs(win,[20,0,'About "Play KiSS"',
  764.                             'Play KiSS v0.77 - November 9, 1994\nwritten by Chad Randall\n(crandall@garnet.msen.com)\n---\nKISS/GS4 compatibility:\n256 colors\n256 cells\nUnlimited screen size\n(All limits affected by\nCHIP memory availability.)---\n\nReleased as\nPUBLIC DOMAIN',
  765.                             'Ok'],0,0)
  766.                     updatecolors()
  767.                 ENDSELECT
  768.  
  769.                 IF ((dragmode=TRUE) AND (curobj>=0))
  770.                     IF ((oldx<>drawx) OR (oldy<>drawy))
  771.                         IF (oldx<>-5000) THEN IF (backrast<>0) THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  772.                         IF (backrast<>0) THEN ClipBlit(rp,drawx-offx,drawy-offy,backrast,0,0,iconwidth,iconheight,$C0)
  773.                         IF (rtdrag>=DRAG_DIRTY)
  774.                             IF ((maskbmap<>0) AND (iconbmap<>0))
  775.                                 BltBitMap(iconbmap,0,0,maskbmap,0,0,iconwidth,iconheight,1,1,0)
  776.                                 FOR i:=MAX_CELL-1 TO 0 STEP -1
  777.                                     IF (cell[i].set[current_set]<10)
  778.                                         IF (cell[i].clip_pix<>0)
  779.                                             IF (cell[i].mark=curobj)
  780.                                                 BltBitMap(cell[i].clip_pix,0,0,maskbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,%00000001,0)
  781.                                             ELSE
  782.                                                 IF (((cell[i].x[current_set]+cell[i].xoffset)<(drawx-offx+iconwidth)) AND ((cell[i].x[current_set]+cell[i].xsize+cell[i].xoffset)>(drawx-offx)))
  783.                                                     IF (((cell[i].y[current_set]+cell[i].yoffset)<(drawy-offy+iconheight)) AND ((cell[i].y[current_set]+cell[i].ysize+cell[i].yoffset)>(drawy-offy)))
  784.                                                         zox:=0;zoy:=0
  785.                                                         zx:=(drawx-offx)-(cell[i].x[current_set]+cell[i].xoffset)
  786.                                                         zy:=(drawy-offy)-(cell[i].y[current_set]+cell[i].yoffset)
  787.                                                         IF (zx<=0)
  788.                                                             zox:=0
  789.                                                             zx:=Abs(zx)
  790.                                                         ELSE
  791.                                                             zox:=zx
  792.                                                             zx:=0
  793.                                                         ENDIF
  794.                                                         IF (zy<=0)
  795.                                                             zoy:=0
  796.                                                             zy:=Abs(zy)
  797.                                                         ELSE
  798.                                                             zoy:=zy
  799.                                                             zy:=0
  800.                                                         ENDIF
  801.                                                         zw:=limit(cell[i].xsize-zox,0,iconwidth-zx)
  802.                                                         zh:=limit(cell[i].ysize-zoy,0,iconheight-zy)
  803. ->    WriteF('\nBltBitMap($\h,\d,\d,$\h,\d,\d->\d,\d)',cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh)
  804.                                                         BltBitMap(cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh,$20,%00000001,0)
  805.                                                     ENDIF
  806.                                                 ENDIF
  807.                                             ENDIF
  808.                                         ENDIF
  809.                                     ENDIF
  810.                                 ENDFOR
  811.                                 IF ((rtdrag=DRAG_DIRTY) OR ((rtdrag=DRAG_SMART) AND (copybmap=0)))
  812.                                     BltMaskBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,%11100000,Long(maskbmap+8))
  813.                                 ELSE
  814.                                     IF ((copyrast<>0) AND (copybmap<>0))
  815.                                         BltBitMap(iconbmap,0,0,copybmap,0,0,iconwidth,iconheight,$C0,$FF,0)
  816.                                         BltBitMap(maskbmap,0,0,copybmap,0,0,iconwidth,iconheight,$80,$FF,0)
  817.                                         BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
  818.                                         BltBitMapRastPort(copybmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
  819.                                     ENDIF
  820.                                 ENDIF
  821.                             ENDIF
  822.                         ENDIF
  823.                         IF ((rtdrag=DRAG_TOP) OR (rtdrag=DRAG_PAUSE))
  824.                             IF (maskbmap<>0) THEN BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
  825.                             IF (iconbmap<>0) THEN BltBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
  826.                         ENDIF
  827.  
  828.                         IF waittof
  829.                             WaitBlit()
  830.                             FOR i:=0 TO 2
  831.                                 WaitTOF()
  832.                                 WaitBOVP(vp)
  833.                             ENDFOR
  834.                         ENDIF
  835.                         oldx:=drawx;oldy:=drawy;pauseflag:=FALSE
  836.                     ELSE
  837.                         IF pauseflag=FALSE
  838.                             IF (rtdrag=DRAG_PAUSE)
  839.                                 drawobj(curobj,drawx-offx,drawy-offy)
  840.                                 pauseflag:=TRUE
  841.                             ENDIF
  842.                         ENDIF
  843.                     ENDIF
  844.                 ENDIF
  845.             ENDWHILE
  846.             disposesaveback()
  847.             flushproj()
  848. ->            IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
  849.             closescreen()
  850.         ENDIF
  851.     ENDWHILE    
  852.  
  853. EXCEPT DO
  854.     FOR i:=0 TO MAX_CELL-1
  855.         DisposeLink(cell[i].name)
  856.     ENDFOR
  857.     IF hand1 THEN DisposeObject(hand1)
  858.     IF hand2 THEN DisposeObject(hand2)
  859.     flushproj()
  860.     END cell[MAX_CELL]
  861.     END palet[16]
  862.     END rectangle
  863. ->    IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
  864.     closescreen()
  865.     Dispose(buffer)
  866.     Dispose(region1)
  867.     IF ((exception="^C") AND (outputmode=0)) THEN WriteF('***BREAK\n')
  868.     IF ((exception="Kick"))
  869.         WriteF('You need at least OS 3.0 (Kickstart 39) to "Play KiSS"!!!\n')
  870.         DisplayBeep(0)
  871.     ENDIF
  872.     IF filereq THEN FreeAslRequest(filereq)
  873.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  874.     IF layersbase THEN CloseLibrary(layersbase)
  875.     IF aslbase THEN CloseLibrary(aslbase)
  876.     IF iconbase THEN CloseLibrary(iconbase)
  877. ENDPROC
  878.  
  879. PROC boundize(dx,dy)
  880.     IF bound
  881.         dx:=limit(dx,offx,config_size_x-iconwidth+offx)
  882.         dy:=limit(dy,offy,config_size_y-iconheight+offy-scr.barheight-1)
  883.     ENDIF
  884. ENDPROC dx,dy
  885.  
  886. PROC menucolors(buffer)
  887.     DEF i
  888.     FOR i:=0 TO 3
  889.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  890.     ENDFOR
  891.     FOR i:=17 TO 19
  892.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  893.     ENDFOR
  894.     FOR i:=(Shl(1,retdepth(mode))-4) TO (Shl(1,retdepth(mode))-1)
  895.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  896.     ENDFOR
  897. ENDPROC
  898.  
  899. PROC placeobj(obj,x,y,flag=FALSE)
  900.     DEF i,w=0,h=0
  901.     IF flag THEN removeobj(obj)
  902.     IF bound
  903.         FOR i:=0 TO MAX_CELL-1
  904.             IF (cell[i].mark=obj)
  905.                 w:=bigger(w,cell[i].xoffset+cell[i].xsize)
  906.                 h:=bigger(h,cell[i].yoffset+cell[i].ysize)
  907.             ENDIF
  908.         ENDFOR
  909.         x:=limit(x,0,config_size_x-w)
  910.         y:=limit(y,0,config_size_y-h-scr.barheight-1)
  911.     ENDIF
  912.     FOR i:=0 TO MAX_CELL-1
  913.         IF (cell[i].mark=obj)
  914.             cell[i].x[current_set]:=x
  915.             cell[i].y[current_set]:=y
  916.         ENDIF
  917.     ENDFOR
  918.     drawobj(obj)
  919. ENDPROC
  920.  
  921. PROC findobj(x,y)
  922.     DEF i
  923.     FOR i:=0 TO MAX_CELL-1
  924.         IF ((cell[i].fix<1) OR (fixxed=TRUE))
  925.         IF (cell[i].set[current_set]<10)
  926.         IF (x>=(cell[i].xoffset+cell[i].x[current_set]))
  927.             IF (y>=(cell[i].yoffset+cell[i].y[current_set]))
  928.                 IF (x<(cell[i].xoffset+cell[i].x[current_set]+cell[i].xsize))
  929.                     IF (y<(cell[i].yoffset+cell[i].y[current_set]+cell[i].ysize))
  930.                         IF ReadPixel(cell[i].pix_rp,(x-(cell[i].xoffset+cell[i].x[current_set])),y-(cell[i].yoffset+cell[i].y[current_set]))>0
  931.                             RETURN cell[i].mark,(x-cell[i].x[current_set]),(y-cell[i].y[current_set])
  932.                         ENDIF
  933.                     ENDIF
  934.                 ENDIF
  935.             ENDIF
  936.         ENDIF
  937.         ENDIF
  938.         ENDIF
  939.     ENDFOR
  940. ENDPROC -1,-1,-1
  941.  
  942.  
  943. PROC updatecolors()
  944.     DEF i,pn=0,t
  945.     FOR i:=0 TO 15
  946.         IF (palet[i].color[current_palet]<>0)
  947.             FOR t:=0 TO smaller(palet[i].color_num,15)
  948.                 SetRGB32(vp,pn,(Long(palet[i].color[current_palet]+(t*SIZEOF color))),(Long(palet[i].color[current_palet]+(t*SIZEOF color)+4)),(Long(palet[i].color[current_palet]+(t*SIZEOF color)+8)))
  949.                 pn:=pn+1;IF pn=256 THEN pn:=255
  950.             ENDFOR
  951.             pn:=(pn+15)/16*16
  952.         ENDIF
  953.     ENDFOR
  954. ENDPROC
  955.  
  956. /*PROC oldmaskobj(obj,x,y)
  957.     DEF sp[8]:LIST,i,t,sd
  958.  
  959.     FOR i:=0 TO 7
  960.         sp[i]:=Long(cell[obj].pix+8+(i*8))
  961.     ENDFOR
  962.     sd:=cell[obj].pix.depth
  963.  
  964.     cell[obj].pix.depth:=depth
  965.     IF cell[obj].bit_per_pixel=4
  966.         FOR i:=0 TO 3
  967.             IF (cell[obj].palet_num AND Shl(1,i))
  968.                 PutLong(cell[obj].pix+8+((i+4)*4),Long(cell[obj].clip_pix+8))
  969.             ELSE
  970.                 PutLong(cell[obj].pix+8+((i+4)*4),Long(blankbmap+8))
  971.             ENDIF
  972.         ENDFOR
  973.     ENDIF
  974.  
  975.     BltMaskBitMapRastPort(cell[obj].pix,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,(cell[obj].pix.bytesperrow)*8,cell[obj].ysize,
  976.         %11100000,Long(cell[obj].clip_pix+8))
  977.  
  978.     cell[obj].pix.depth:=sd
  979.     FOR i:=0 TO 7
  980.         PutLong(cell[obj].pix+8+(i*8),sp[i])
  981.     ENDFOR
  982. ENDPROC
  983. */
  984. PROC maskobj(obj,x,y)
  985.     DEF dummy
  986.  
  987.     IF (cell[obj].clip_pix_rp<>0) THEN ClipBlit(cell[obj].clip_pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$20)
  988.     IF (cell[obj].pix_rp<>0) THEN ClipBlit(cell[obj].pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$E0)
  989.     dummy:=cell[obj].palet_num
  990.     SELECT dummy
  991.         CASE 0 ;rp.mask:=%00000000
  992.         CASE 1 ;rp.mask:=%00010000
  993.         CASE 2 ;rp.mask:=%00100000
  994.         CASE 3 ;rp.mask:=%00110000
  995.         CASE 4 ;rp.mask:=%01000000
  996.         CASE 5 ;rp.mask:=%01010000
  997.         CASE 6 ;rp.mask:=%01100000
  998.         CASE 7 ;rp.mask:=%01110000
  999.         CASE 8 ;rp.mask:=%10000000
  1000.         CASE 9 ;rp.mask:=%10010000
  1001.         CASE 10;rp.mask:=%10100000
  1002.         CASE 11;rp.mask:=%10110000
  1003.         CASE 12;rp.mask:=%11000000
  1004.         CASE 13;rp.mask:=%11010000
  1005.         CASE 14;rp.mask:=%11100000
  1006.         CASE 15;rp.mask:=%11110000
  1007.     ENDSELECT
  1008.     dummy:=retdepth(mode)
  1009.     SELECT dummy
  1010.         CASE 4;rp.mask:=(rp.mask AND %00000000)
  1011.         CASE 5;rp.mask:=(rp.mask AND %00010000)
  1012.         CASE 6;rp.mask:=(rp.mask AND %00110000)
  1013.         CASE 7;rp.mask:=(rp.mask AND %01110000)
  1014.         CASE 8;rp.mask:=(rp.mask AND %11110000)
  1015.     ENDSELECT
  1016.     IF (cell[obj].clip_pix_rp<>0) THEN ClipBlit(cell[obj].clip_pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$E0)
  1017.     rp.mask:=%11111111
  1018. ENDPROC
  1019.  
  1020. PROC updatelist()
  1021.     DEF i,t
  1022.     SetRast(rp,0)
  1023.  
  1024.     SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  1025.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1026.         IF (cell[i].mark>=0)
  1027.             IF (cell[i].set[current_set]<10)
  1028.                 maskobj(i,cell[i].x[current_set],cell[i].y[current_set])
  1029.             ENDIF
  1030.         ENDIF            
  1031.     ENDFOR
  1032.     ClearPointer(win)
  1033. ENDPROC
  1034.  
  1035. PROC removeobj(obj)
  1036.     DEF i,t
  1037.     DEF minx=10000,miny=10000
  1038.     DEF region,oldregion=0,rectangle:PTR TO rectangle
  1039.  
  1040.     region:=NewRegion()
  1041.     NEW rectangle
  1042.     rectangle.minx:=10000
  1043.     rectangle.miny:=10000
  1044.  
  1045.     FOR i:=0 TO MAX_CELL-1
  1046.         IF cell[i].mark=obj
  1047.             rectangle.minx:=smaller(rectangle.minx,cell[i].x[current_set]+cell[i].xoffset)
  1048.             rectangle.miny:=smaller(rectangle.miny,cell[i].y[current_set]+cell[i].yoffset)
  1049.             rectangle.maxx:=bigger(rectangle.maxx,cell[i].x[current_set]+cell[i].xoffset+cell[i].xsize)
  1050.             rectangle.maxy:=bigger(rectangle.maxy,cell[i].y[current_set]+cell[i].yoffset+cell[i].ysize)
  1051.         ENDIF
  1052.     ENDFOR
  1053.     OrRectRegion(region,rectangle)
  1054.  
  1055.  
  1056.     oldregion:=InstallClipRegion(win.wlayer,region)
  1057.  
  1058.     SetRast(rp,0)
  1059.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1060.         IF ((cell[i].mark>=0) AND (cell[i].mark<>obj))
  1061.             IF (cell[i].set[current_set]<10)
  1062.  
  1063.                 maskobj(i,cell[i].x[current_set],cell[i].y[current_set])
  1064.  
  1065. /*                IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,cell[i].x[current_set]+cell[i].xoffset,cell[i].y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20)
  1066.                 IF (cell[i].pix_rp<>0) THEN ClipBlit(cell[i].pix_rp,0,0,rp,cell[i].x[current_set]+cell[i].xoffset,cell[i].y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1067.                 dummy:=cell[i].palet_num
  1068.                 SELECT dummy
  1069.                     CASE 0 ;rp.mask:=%00000000
  1070.                     CASE 1 ;rp.mask:=%00010000
  1071.                     CASE 2 ;rp.mask:=%00100000
  1072.                     CASE 3 ;rp.mask:=%00110000
  1073.                     CASE 4 ;rp.mask:=%01000000
  1074.                     CASE 5 ;rp.mask:=%01010000
  1075.                     CASE 6 ;rp.mask:=%01100000
  1076.                     CASE 7 ;rp.mask:=%01110000
  1077.                     CASE 8 ;rp.mask:=%10000000
  1078.                     CASE 9 ;rp.mask:=%10010000
  1079.                     CASE 10;rp.mask:=%10100000
  1080.                     CASE 11;rp.mask:=%10110000
  1081.                     CASE 12;rp.mask:=%11000000
  1082.                     CASE 13;rp.mask:=%11010000
  1083.                     CASE 14;rp.mask:=%11100000
  1084.                     CASE 15;rp.mask:=%11110000
  1085.                 ENDSELECT
  1086.                 dummy:=retdepth(mode)
  1087.                 SELECT dummy
  1088.                     CASE 4;rp.mask:=(rp.mask AND %00000000)
  1089.                     CASE 5;rp.mask:=(rp.mask AND %00010000)
  1090.                     CASE 6;rp.mask:=(rp.mask AND %00110000)
  1091.                     CASE 7;rp.mask:=(rp.mask AND %01110000)
  1092.                     CASE 8;rp.mask:=(rp.mask AND %11110000)
  1093.                 ENDSELECT
  1094.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,cell[i].x[current_set]+cell[i].xoffset,cell[i].y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1095.                 rp.mask:=%11111111*/
  1096.             ENDIF
  1097.         ENDIF            
  1098.     ENDFOR
  1099.     InstallClipRegion(win.wlayer,oldregion)
  1100.     END rectangle
  1101.     IF region
  1102.         DisposeRegion(region)
  1103.     ENDIF
  1104. ENDPROC
  1105.  
  1106. PROC drawobj(obj,xxxx=-500,yyyy=-500)
  1107.     DEF i,t
  1108.     DEF minx=10000,miny=10000
  1109.     DEF region,oldregion=0,rectangle:PTR TO rectangle
  1110.     DEF xx,yy
  1111.  
  1112.     region:=NewRegion()
  1113.     NEW rectangle
  1114.  
  1115.     rectangle.minx:=10000
  1116.     rectangle.miny:=10000
  1117.  
  1118.     FOR i:=0 TO MAX_CELL-1
  1119.         IF cell[i].mark=obj
  1120.             xx:=IF (xxxx=-500) THEN cell[i].x[current_set] ELSE xxxx
  1121.             yy:=IF (yyyy=-500) THEN cell[i].y[current_set] ELSE yyyy
  1122.             rectangle.minx:=smaller(rectangle.minx,xx+cell[i].xoffset)
  1123.             rectangle.miny:=smaller(rectangle.miny,yy+cell[i].yoffset)
  1124.             rectangle.maxx:=bigger(rectangle.maxx,xx+cell[i].xoffset+cell[i].xsize)
  1125.             rectangle.maxy:=bigger(rectangle.maxy,yy+cell[i].yoffset+cell[i].ysize)
  1126.         ENDIF
  1127.     ENDFOR
  1128.     OrRectRegion(region,rectangle)
  1129.  
  1130.     oldregion:=InstallClipRegion(win.wlayer,region)
  1131.  
  1132.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1133.         IF ((cell[i].mark>=0))
  1134.             IF (cell[i].set[current_set]<10)
  1135.                 
  1136. xx:=cell[i].x[current_set]
  1137. yy:=cell[i].y[current_set]
  1138.  
  1139.                 IF (cell[i].mark=obj)
  1140.                     IF (xxxx>-500)
  1141.                         IF (yyyy>-500)
  1142.                             xx:=xxxx
  1143.                             yy:=yyyy
  1144.                         ENDIF
  1145.                     ENDIF
  1146.                 ENDIF
  1147.  
  1148.                 maskobj(i,xx,yy)
  1149.  
  1150. /*
  1151. ->                xx:=IF ((x<>-50000) AND (cell[i].mark=obj)) THEN y ELSE cell[i].x[current_set]
  1152. ->                yy:=IF ((y<>-50000) AND (cell[i].mark=obj)) THEN x ELSE cell[i].y[current_set]
  1153.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20)
  1154.                 IF (cell[i].pix_rp<>0) THEN ClipBlit(cell[i].pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1155.                 dummy:=cell[i].palet_num
  1156.                 SELECT dummy
  1157.                     CASE 0 ;rp.mask:=%00000000
  1158.                     CASE 1 ;rp.mask:=%00010000
  1159.                     CASE 2 ;rp.mask:=%00100000
  1160.                     CASE 3 ;rp.mask:=%00110000
  1161.                     CASE 4 ;rp.mask:=%01000000
  1162.                     CASE 5 ;rp.mask:=%01010000
  1163.                     CASE 6 ;rp.mask:=%01100000
  1164.                     CASE 7 ;rp.mask:=%01110000
  1165.                     CASE 8 ;rp.mask:=%10000000
  1166.                     CASE 9 ;rp.mask:=%10010000
  1167.                     CASE 10;rp.mask:=%10100000
  1168.                     CASE 11;rp.mask:=%10110000
  1169.                     CASE 12;rp.mask:=%11000000
  1170.                     CASE 13;rp.mask:=%11010000
  1171.                     CASE 14;rp.mask:=%11100000
  1172.                     CASE 15;rp.mask:=%11110000
  1173.                 ENDSELECT
  1174.                 dummy:=retdepth(mode)
  1175.                 SELECT dummy
  1176.                     CASE 4;rp.mask:=(rp.mask AND %00000000)
  1177.                     CASE 5;rp.mask:=(rp.mask AND %00010000)
  1178.                     CASE 6;rp.mask:=(rp.mask AND %00110000)
  1179.                     CASE 7;rp.mask:=(rp.mask AND %01110000)
  1180.                     CASE 8;rp.mask:=(rp.mask AND %11110000)
  1181.                 ENDSELECT
  1182.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1183.                 rp.mask:=%11111111
  1184. */
  1185.             ENDIF
  1186.         ENDIF            
  1187.     ENDFOR
  1188.     InstallClipRegion(win.wlayer,oldregion)
  1189.     END rectangle
  1190.     IF region
  1191.         DisposeRegion(region)
  1192.     ENDIF
  1193. ENDPROC
  1194.  
  1195. /*PROC scanstring(fh,flag=FALSE)
  1196.     DEF l=-1,res=1
  1197.     DEF buf,str
  1198.     buf:=[0,0]:LONG
  1199.     str:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]:LONG
  1200.     PutLong(buf,0)
  1201.     WHILE ((res>0) AND ((Char(buf)<>32) AND (Char(buf)<>10) AND (Char(buf)<>13) AND (Char(buf)<>9) AND (Char(buf)<>":") AND (Char(buf)<>"*") AND (Char(buf)<>",")))
  1202.         res:=Read(fh,buf,1)
  1203.         l:=l+1
  1204.         IF l<120
  1205.             PutChar(str+l,Char(buf))
  1206.         ENDIF
  1207.     ENDWHILE
  1208.     PutChar(str+l+1,0)
  1209.     IF flag THEN PutChar(str+l,0)
  1210. ENDPROC str,l*/
  1211.  
  1212. PROC openproj(str) HANDLE
  1213.     DEF fh=0
  1214.     DEF fib:PTR TO fileinfoblock
  1215.     DEF i,buf,f
  1216.     DEF newbuf=0
  1217.     DEF num=0,set=-1
  1218.     DEF set_str[MAX_SET]:LIST
  1219.     DEF palset
  1220.     DEF wbscr
  1221.  
  1222.     NEW fib;newbuf:=New(2000);buf:=[0,0,0]
  1223.     FOR i:=0 TO MAX_SET-1
  1224.         set_str[i]:=String(4096)
  1225.     ENDFOR
  1226.  
  1227.     StrCopy(filename,str,ALL)
  1228.     
  1229.     IF (fh:=Open(filename,MODE_OLDFILE))
  1230.  
  1231.         WbenchToFront()
  1232.         wbscr:=LockPubScreen('Workbench')
  1233.         outwin:=OpenWindowTagList(0,[WA_INNERWIDTH,480,WA_INNERHEIGHT,1,
  1234.             WA_TOP,32,WA_LEFT,80,
  1235.             WA_AUTOADJUST,TRUE,
  1236.             WA_TITLE,'KiSS Player 0.77 - Broken Spork Technologies',
  1237.             WA_FLAGS,WFLG_DEPTHGADGET OR WFLG_DRAGBAR OR WFLG_NOCAREREFRESH,
  1238.             WA_CUSTOMSCREEN,wbscr,
  1239.             NIL,NIL])
  1240.         IF wbscr THEN UnlockPubScreen(0,wbscr)
  1241.  
  1242.         palset:=0
  1243.         Delay(100)
  1244.         WHILE (Fgets(fh,newbuf,1024))
  1245.             i:=Char(newbuf)
  1246.             SELECT i
  1247.             CASE "%";load_palet(newbuf+1,palset);
  1248.                 palset:=palset+1;mode:=mode+1
  1249. ->            CASE "["
  1250.             CASE "("
  1251.                 load_config_size(newbuf+1)
  1252.             CASE "#"
  1253.                 load_config_cell(num,newbuf+1);num:=num+1
  1254.             CASE "$"
  1255.                 set:=set+1
  1256.                 StrCopy(set_str[set],newbuf+1,ALL)
  1257.             CASE " "
  1258.                 IF set>=0 THEN StrAdd(set_str[set],newbuf+1,ALL)
  1259.             ENDSELECT
  1260.         ENDWHILE
  1261.         FOR i:=0 TO set STEP 1
  1262.             load_config_set(i,set_str[i])
  1263.         ENDFOR
  1264.     ELSE
  1265.         Raise("DOS")
  1266.     ENDIF
  1267. EXCEPT DO
  1268.     IF outwin THEN CloseWindow(outwin);outwin:=0
  1269.     IF fh THEN Close(fh);fh:=0
  1270.     IF newbuf THEN Dispose(newbuf)
  1271.     END fib
  1272.     FOR i:=0 TO MAX_SET-1
  1273.         DisposeLink(set_str[i])
  1274.     ENDFOR
  1275.     IF exception="^C" THEN ReThrow()
  1276.     IF exception THEN RETURN FALSE
  1277. ENDPROC TRUE
  1278.  
  1279. PROC isdigit(s);IF (((s>="0") AND (s<="9")) OR (s=".") OR (s="-")) THEN RETURN TRUE;ENDPROC FALSE
  1280. PROC isalpha(s);IF (((s>="a") AND (s<="z")) OR ((s>="A") AND (s<="Z"))) THEN RETURN TRUE;ENDPROC FALSE
  1281. PROC ispunc(s);IF ((s=".") OR (s="-") OR (s="_")) THEN RETURN TRUE;ENDPROC FALSE
  1282.  
  1283. PROC scanforvalue(str)
  1284.     DEF l=0,i,s[100]:STRING,ins,iii=0
  1285.     WHILE (isdigit(Char(str+l)));l:=l+1;ENDWHILE
  1286.     StrCopy(s,str,l)
  1287.     ins:=InStr(str,'.')
  1288.     IF ((ins>0) AND (ins<=l))
  1289.         StrToLong(s,{i})
  1290.         StrToLong(s+ins+1,{iii})
  1291.     ELSE
  1292.         StrToLong(s,{i})
  1293.     ENDIF
  1294. ENDPROC i,l,iii
  1295.  
  1296. PROC scanforstring(str)
  1297.     DEF l=0
  1298.     WHILE (isdigit(Char(str+l)) OR isalpha(Char(str+l)) OR ispunc(Char(str+l)));l:=l+1;ENDWHILE
  1299. ENDPROC l
  1300.  
  1301. PROC load_config_cell(num,str)
  1302.     DEF p,c,i,j,n,secval
  1303.     DEF buf,mark,len
  1304.     buf:=[0,0,0,0,0,0,0,0,0,0,0,0,0]
  1305.     p:=str
  1306.     check_str(p)
  1307.     mark,len,secval:=scanforvalue(p)
  1308.     cell[num].mark:=mark
  1309.     cell[num].fix:=secval
  1310.     p:=p+len+1
  1311.  
  1312.     WHILE ((Char(p)=" ") OR (Char(p)=9));p:=p+1;ENDWHILE
  1313.     len:=scanforstring(p)
  1314.     StrCopy(cell[num].name,p,len)
  1315.     p:=p+len
  1316.  
  1317.     load_data_cell(cell[num].name,num)
  1318.     IF outwin
  1319.         StringF(string,'MEM:\d[9] OBJ #:\d[3] CEL #\d[3] (\d[3]x\d[3]) "\s" ',AvailMem(MEMF_CHIP),cell[num].mark,num,cell[num].xsize,cell[num].ysize,cell[num].name)
  1320.         SetWindowTitles(outwin,string,-1)
  1321.     ENDIF
  1322.     WHILE (Char(p)<>0)
  1323.         IF Char(p)="*"
  1324.             mark,len:=scanforvalue(p+1)
  1325.             cell[num].palet_num:=mark
  1326.             p:=p+1+len
  1327.         ENDIF
  1328.         IF Char(p)=":"
  1329.             p:=p+1
  1330.             FOR i:=0 TO MAX_SET-1;cell[num].set[i]:=50;ENDFOR
  1331.             WHILE (TRUE=TRUE)
  1332.                 mark:=(Char(p)-"0")
  1333.                 IF ((0<=mark) AND (mark<MAX_SET))
  1334.                     cell[num].set[mark]:=1
  1335.                 ENDIF
  1336.                 p:=p+1
  1337.                 EXIT (Char(p)=0)
  1338.             ENDWHILE
  1339.             RETURN
  1340.         ENDIF
  1341.     p:=p+1;ENDWHILE
  1342.     FOR i:=0 TO MAX_SET-1
  1343.         cell[num].set[i]:=1
  1344.     ENDFOR
  1345. ENDPROC
  1346.  
  1347. PROC load_palet(fn,num)
  1348.     DEF fh
  1349.     DEF buf
  1350.     DEF p,c,r,g,b,len
  1351.     DEF dir[500]:STRING,oldfile[100]:STRING
  1352.     DEF byte_l,byte_h
  1353.  
  1354.     buf:=[0,0,0,0,0,0,0,0,0,0]
  1355.     check_str(fn)
  1356.     len:=scanforstring(fn)
  1357.     PutChar(fn+len,0)
  1358.     IF outwin
  1359.         StringF(string,'PALETTE #\d:\s ',num,fn)
  1360.         SetWindowTitles(outwin,string,-1);Delay(15)
  1361.     ENDIF
  1362.     splitname(filename,dir,oldfile)
  1363.     AddPart(dir,fn,490)
  1364.     fh:=Open(dir,MODE_OLDFILE)
  1365.     IF fh
  1366.         StrCopy(palet[num],dir,ALL)
  1367.         IF (check_kiss_header(fh)=1)
  1368.             Read(fh,buf,32)
  1369.             IF Char(buf+4)=FILE_MARK_PALET
  1370.                 palet[num].color_num:=Char(buf+ 9)*256+Char(buf+ 8)
  1371.                 palet[num].palet_num:=Char(buf+11)*256+Char(buf+10)
  1372.                 palet[num].bit_per_pixel:=Char(buf+5)
  1373.                 palet[num].format:=NEW_
  1374.             ENDIF
  1375.         ELSE
  1376.             palet[num].color_num:=GS1_MAX_COLOR
  1377.             palet[num].palet_num:=MAX_PAL
  1378.             palet[num].bit_per_pixel:=12
  1379.             palet[num].format:=OLD_
  1380.         ENDIF
  1381.         p:=0;WHILE (p<palet[num].palet_num)
  1382.             palet[num].color[p]:=New(SIZEOF color*palet[num].color_num+50)
  1383.             c:=0;WHILE (c<palet[num].color_num)
  1384.                 IF palet[num].bit_per_pixel=12
  1385.                     Read(fh,buf,2)
  1386.                     byte_l:=Char(buf)
  1387.                     byte_h:=Char(buf+1)
  1388.                     r:=(Shr(byte_l,4) AND $F)*$1111
  1389.                     g:=(byte_h AND $F)*$1111
  1390.                     b:=(byte_l AND $F)*$1111
  1391.                     r:=(Shl(Shl(r,8),8) OR r)
  1392.                     g:=(Shl(Shl(g,8),8) OR g)
  1393.                     b:=(Shl(Shl(b,8),8) OR b)
  1394.                 ENDIF
  1395.                 IF palet[num].bit_per_pixel=24
  1396.                     Read(fh,buf,1);r:=Char(buf)
  1397.                     Read(fh,buf,1);g:=Char(buf)
  1398.                     Read(fh,buf,1);b:=Char(buf)
  1399.                     r:=(Shl(Shl(r,8),8) OR r)
  1400.                     g:=(Shl(Shl(g,8),8) OR g)
  1401.                     b:=(Shl(Shl(b,8),8) OR b)
  1402.                 ENDIF
  1403.                 PutLong(palet[num].color[p]+(12*c),r)
  1404.                 PutLong(palet[num].color[p]+(12*c)+4,g)
  1405.                 PutLong(palet[num].color[p]+(12*c)+8,b)
  1406.             c:=c+1;ENDWHILE
  1407.         p:=p+1;ENDWHILE
  1408.         Close(fh)
  1409.     ENDIF
  1410.     
  1411. ENDPROC
  1412.  
  1413. PROC load_config_size(str)
  1414.     DEF p,mark,len
  1415.     check_str(str)
  1416.     p:=str
  1417.     mark,len:=scanforvalue(p)
  1418.     config_size_x:=bigger(mark,config_size_x)
  1419.     p:=p+len+1
  1420.     mark,len:=scanforvalue(p)
  1421.     config_size_y:=bigger(mark+barh+1,config_size_y)
  1422.     IF outwin
  1423.         StringF(string,'Environment (\d,\d)',config_size_x,config_size_y)
  1424.         SetWindowTitles(outwin,string,-1);Delay(60)
  1425.     ENDIF
  1426. ENDPROC
  1427.  
  1428. PROC load_config_set(num,str)
  1429.     DEF n,p,mark,len,x,y,i
  1430.     check_str(str)
  1431.     p:=str
  1432.     mark,len:=scanforvalue(p)
  1433.     p:=p+len+1
  1434.  
  1435.     pb[num]:=mark
  1436.  
  1437.     IF outwin
  1438.         StringF(string,'SET #\d uses Palette #\d ',num,mark)
  1439.         SetWindowTitles(outwin,string,-1)
  1440.     ENDIF
  1441.  
  1442.     n:=0;WHILE(n<MAX_CELL)
  1443.         IF Char(p)<>"*"
  1444.             mark,len:=scanforvalue(p)
  1445.             p:=p+len+1
  1446.             x:=mark
  1447.             mark,len:=scanforvalue(p)
  1448.             p:=p+len+1
  1449.             y:=mark
  1450.             FOR i:=0 TO MAX_CELL-1
  1451.                 IF cell[i].mark=n
  1452.                     cell[i].x[num]:=x
  1453.                     cell[i].y[num]:=y
  1454.                 ENDIF
  1455.             ENDFOR
  1456.             WHILE ((Char(p)=32) OR (Char(p)=9));p:=p+1;ENDWHILE
  1457.         ELSE
  1458.             p:=p+1
  1459.             WHILE ((Char(p)=32) OR (Char(p)=9));p:=p+1;ENDWHILE
  1460.         ENDIF
  1461.     n:=n+1;ENDWHILE
  1462. ENDPROC
  1463.  
  1464. PROC planesclip(bm1,bm2,maxiw,maxih)
  1465.     DEF hap,hap2,sp1[8]:LIST
  1466.     IF ((bm1=0) OR (bm2=0)) THEN RETURN
  1467.     FOR hap:=0 TO 7
  1468.         sp1[hap]:=Long(bm1+8+(hap*4))
  1469.     ENDFOR
  1470.  
  1471.     FOR hap:=0 TO 7
  1472.         PutLong((bm1+8),sp1[hap])
  1473.         IF (((sp1[hap]>0)) AND ((hap+1)<=Char(bm1+5)))
  1474.             BltBitMap(bm1,0,0,bm2,0,0,maxiw,maxih,IF hap=0 THEN 192 ELSE 224,$1,0)
  1475.         ENDIF
  1476.     ENDFOR    
  1477.     FOR hap:=0 TO 7
  1478.         PutLong(bm1+8+(hap*4),sp1[hap])
  1479.     ENDFOR
  1480. ->    BltBitMap(bm2,0,0,bm2,0,0,maxiw,maxih,$50,$1,0)
  1481. ENDPROC
  1482.  
  1483. PROC flushproj()
  1484.     DEF i,t
  1485.     FOR i:=0 TO MAX_CELL-1
  1486.         IF ((cell[i].clip_pix<>0))
  1487.             PutChar(cell[i].clip_pix+5,1)
  1488.             FOR t:=1 TO 7;PutLong(cell[i].clip_pix+8+(t*4),0);ENDFOR
  1489.         ENDIF
  1490.         IF cell[i].pix
  1491.             FreeBitMap(cell[i].pix)
  1492.             cell[i].pix:=0
  1493.         ENDIF
  1494.         IF cell[i].clip_pix
  1495.             FreeBitMap(cell[i].clip_pix)
  1496.             cell[i].clip_pix:=0
  1497.         ENDIF
  1498.         IF (cell[i].pix_rp)
  1499.             Dispose(cell[i].pix_rp)
  1500.             cell[i].pix_rp:=0
  1501.         ENDIF
  1502.         IF (cell[i].clip_pix_rp)
  1503.             Dispose(cell[i].clip_pix_rp)
  1504.             cell[i].clip_pix_rp:=0
  1505.         ENDIF
  1506.         cell[i].mark:=-2
  1507.         FOR t:=0 TO MAX_SET-1
  1508.             cell[i].x[t]:=0
  1509.             cell[i].y[t]:=0
  1510.             cell[i].set[t]:=50
  1511.         ENDFOR
  1512.         cell[i].mark:=-66
  1513.         cell[i].fix:=0
  1514.         cell[i].xoffset:=0
  1515.         cell[i].yoffset:=0
  1516.         cell[i].xsize:=0
  1517.         cell[i].ysize:=0
  1518.     ENDFOR
  1519.     FOR i:=0 TO MAX_PAL-1
  1520.         FOR t:=0 TO MAX_SET-1
  1521.             IF palet[i].color[t]
  1522.                 Dispose(palet[i].color[t])
  1523.                 palet[i].color[t]:=0
  1524.             ENDIF
  1525.         ENDFOR
  1526.     ENDFOR
  1527.     FOR i:=0 TO MAX_SET-1
  1528.         pb[i]:=0
  1529.     ENDFOR
  1530. ENDPROC
  1531.  
  1532. PROC splitname(str1,str2,str3)
  1533.   DEF filestart,pathlen,stt[5]:STRING
  1534.     filestart:=FilePart(str1)
  1535.     pathlen:=filestart-str1
  1536.     IF pathlen
  1537.         StrCopy(str2,str1,pathlen)
  1538.         MidStr(stt,str2,StrLen(str2)-1,1)
  1539.         IF StrCmp(stt,'/',ALL)
  1540.             MidStr(str2,str2,0,StrLen(str2)-1)
  1541.         ENDIF        
  1542.         StrCopy(str3,filestart,ALL)
  1543.     ELSE
  1544.         StrCopy(str2,'',ALL)
  1545.         StrCopy(str3,str1,ALL)
  1546.     ENDIF
  1547. ENDPROC
  1548.  
  1549. PROC openscreen(d)
  1550.     DEF cflag,lflag1=CHECKIT,lflag2=CHECKIT,lflag3=CHECKIT,lflag4=CHECKIT,lflag5=CHECKIT,lflag=CHECKIT
  1551.     DEF hflag1=CHECKIT,hflag2=CHECKIT,hflag3=CHECKIT,bflag=CHECKIT
  1552.     depth:=d
  1553.     scr:=OpenScreenTagList(NIL,[SA_LIKEWORKBENCH,TRUE,
  1554.         SA_DEPTH,depth,
  1555.         SA_TITLE,'KiSS Player 0.77',
  1556.         SA_COLORMAPENTRIES,256,
  1557.         SA_FULLPALETTE,TRUE,
  1558.         SA_WIDTH,config_size_x,
  1559.         SA_HEIGHT,config_size_y,
  1560.         SA_INTERLEAVED,TRUE,
  1561.         SA_AUTOSCROLL,TRUE,
  1562.         SA_PENS,[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]:INT,
  1563.         NIL,NIL])
  1564.     IF scr=0 THEN Raise("SCR")
  1565.     IF (vis:=GetVisualInfoA(scr,NIL))=0 THEN RETURN "VIS"
  1566.     win:=OpenWindowTagList(0,[WA_WIDTH,scr.width,WA_HEIGHT,scr.height-scr.barheight-1,
  1567.         WA_TOP,scr.barheight+1,WA_LEFT,0,
  1568.         WA_FLAGS,WFLG_ACTIVATE OR WFLG_SMART_REFRESH,
  1569.         WA_BORDERLESS,TRUE,
  1570.         WA_BACKDROP,TRUE,
  1571.         WA_CUSTOMSCREEN,scr,
  1572.         WA_NEWLOOKMENUS,TRUE,
  1573.         WA_IDCMP,IDCMP_MENUPICK OR IDCMP_MOUSEBUTTONS OR IDCMP_INTUITICKS OR IDCMP_MENUVERIFY OR IDCMP_MOUSEMOVE,
  1574.         NIL,NIL])
  1575.     IF win=0 THEN Raise("WIN")
  1576.     vp:=scr.viewport
  1577.     cm:=vp.colormap
  1578.     rp:=win.rport
  1579.  
  1580.     cflag:=CHECKIT
  1581.     IF (fixxed=0) THEN cflag:=cflag OR CHECKED
  1582.     IF (hand=TRUE)     THEN hflag2:=hflag2 OR CHECKED
  1583.     IF (hand=0)         THEN hflag1:=hflag1 OR CHECKED
  1584.     IF (hand=3)         THEN hflag3:=hflag3 OR CHECKED
  1585.     IF (waittof) THEN lflag:=lflag OR CHECKED
  1586.     IF (bound) THEN bflag:=bflag OR CHECKED
  1587.     SELECT rtdrag
  1588.     CASE DRAG_TOP;         lflag1:=lflag1 OR CHECKED
  1589.     CASE DRAG_PAUSE;    lflag2:=lflag2 OR CHECKED
  1590.     CASE DRAG_DIRTY;    lflag3:=lflag3 OR CHECKED
  1591.     CASE DRAG_BUFFER;    lflag4:=lflag4 OR CHECKED
  1592.     CASE DRAG_SMART;    lflag5:=lflag5 OR CHECKED
  1593.     ENDSELECT
  1594.   IF (menu:=CreateMenusA([NM_TITLE,0,'Project','P',0,0,0,
  1595.                                                     NM_ITEM,0,'Open','O',0,0,1,
  1596.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  1597.                                                     NM_ITEM,0,'Save As...','S',0,0,2,
  1598.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  1599.                                                     NM_ITEM,0,'About','?',0,0,3,
  1600.                                                     NM_ITEM,0,'Quit','Q',0,0,66,
  1601.  
  1602.                                                     NM_TITLE,0,'Item',0,0,0,0,
  1603.                                                     NM_ITEM,0,'Sets',0,0,0,0,
  1604.                                                     NM_SUB,0,'Set 0','A',CHECKIT OR CHECKED,%1111111110,30,
  1605.                                                     NM_SUB,0,'Set 1','B',CHECKIT,%1111111101,31,
  1606.                                                     NM_SUB,0,'Set 2','C',CHECKIT,%1111111011,32,
  1607.                                                     NM_SUB,0,'Set 3','D',CHECKIT,%1111110111,33,
  1608.                                                     NM_SUB,0,'Set 4','E',CHECKIT,%1111101111,34,
  1609.                                                     NM_SUB,0,'Set 5','F',CHECKIT,%1111011111,35,
  1610.                                                     NM_SUB,0,'Set 6','G',CHECKIT,%1110111111,36,
  1611.                                                     NM_SUB,0,'Set 7','H',CHECKIT,%1101111111,37,
  1612.                                                     NM_SUB,0,'Set 8','I',CHECKIT,%1011111111,38,
  1613.                                                     NM_SUB,0,'Set 9','J',CHECKIT,%0111111111,39,
  1614.  
  1615.                                                     NM_ITEM,0,'Palettes',0,0,0,0,
  1616.                                                     NM_SUB,0,'Palette 0','0',CHECKIT OR CHECKED,%1111111110,20,
  1617.                                                     NM_SUB,0,'Palette 1','1',CHECKIT,%1111111101,21,
  1618.                                                     NM_SUB,0,'Palette 2','2',CHECKIT,%1111111011,22,
  1619.                                                     NM_SUB,0,'Palette 3','3',CHECKIT,%1111110111,23,
  1620.                                                     NM_SUB,0,'Palette 4','4',CHECKIT,%1111101111,24,
  1621.                                                     NM_SUB,0,'Palette 5','5',CHECKIT,%1111011111,25,
  1622.                                                     NM_SUB,0,'Palette 6','6',CHECKIT,%1110111111,26,
  1623.                                                     NM_SUB,0,'Palette 7','7',CHECKIT,%1101111111,27,
  1624.                                                     NM_SUB,0,'Palette 8','8',CHECKIT,%1011111111,28,
  1625.                                                     NM_SUB,0,'Palette 9','9',CHECKIT,%0111111111,29,
  1626.  
  1627.                                                     NM_TITLE,0,'Settings',0,0,0,0,
  1628.                                                     NM_ITEM,0,'Fixed Cells?','X',cflag,0,75,
  1629.                                                     NM_ITEM,0,'Screen Boundaries?',0,bflag,0,77,
  1630.                                                     NM_ITEM,0,'Pointer',0,0,0,0,
  1631.                                                     NM_SUB,0,'Normal',0,hflag1,    %110,76,
  1632.                                                     NM_SUB,0,'Hand',0,hflag2,        %101,78,
  1633.                                                     NM_SUB,0,'Blank',0,hflag3,    %011,79,
  1634.                                                     NM_ITEM,0,'Dragging',0,0,0,0,
  1635.  
  1636.                                                     NM_SUB,0,'Always on top',                        0,lflag1,%11110,80,
  1637.                                                     NM_SUB,0,'Layered, on pause',                0,lflag2,%11101,81,
  1638.                                                     NM_SUB,0,'Layered, quick&dirty',        0,lflag3,%11011,82,
  1639.                                                     NM_SUB,0,'Layered, buffered',                0,lflag4,%10111,83,
  1640.                                                     NM_SUB,0,'Layered, smart buffered',    0,lflag5,%01111,84,
  1641.                                                     NM_SUB,0,NM_BARLABEL,0,0,0,0,
  1642.                                                     NM_SUB,0,'Wait for blitter?',0,lflag,0,89,
  1643.  
  1644.                                                     NM_END,0,'End','x',0,0,0]:newmenu,NIL))=NIL THEN Raise("MENU")
  1645.     LayoutMenusA(menu,vis,[GTMN_NEWLOOKMENUS,TRUE,NIL,NIL])
  1646.     SetMenuStrip(win,menu)
  1647. ENDPROC
  1648.  
  1649. PROC closescreen()
  1650.     IF win
  1651.         CloseWindow(win)
  1652.         win:=0
  1653.     ENDIF
  1654.     IF menu
  1655.         FreeMenus(menu)
  1656.         menu:=0
  1657.     ENDIF
  1658.     IF vis
  1659.         FreeVisualInfo(vis)
  1660.         vis:=0
  1661.     ENDIF
  1662.     IF scr
  1663.         CloseScreen(scr)
  1664.         scr:=0
  1665.     ENDIF
  1666.  
  1667. ENDPROC
  1668.  
  1669. PROC retdepth(m)
  1670.     SELECT m
  1671.     CASE 0;RETURN 4
  1672.     CASE 1;RETURN 4
  1673.     CASE 2;RETURN 5
  1674.     CASE 3;RETURN 6
  1675.     CASE 4;RETURN 6
  1676.     CASE 5;RETURN 7
  1677.     CASE 6;RETURN 7
  1678.     CASE 7;RETURN 7
  1679.     CASE 8;RETURN 7
  1680.     ENDSELECT
  1681. ENDPROC 8
  1682.  
  1683. PROC smaller(val1,val2);IF val1<val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  1684. PROC bigger(val1,val2);IF val1>val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  1685. PROC limit(val1,val2,val3);IF val1<val2 THEN RETURN val2
  1686.             IF val1>val3 THEN RETURN val3;ENDPROC val1
  1687.  
  1688.  
  1689. hand1bm:
  1690.     INT    2,22
  1691.     CHAR    0,2
  1692.     INT    0
  1693.     LONG    0,0,0,0,0,0,0,0
  1694.  
  1695. hand2bm:
  1696.     INT    2,22
  1697.     CHAR    0,2
  1698.     INT    0
  1699.     LONG    0,0,0,0,0,0,0,0
  1700.  
  1701. hand3bm:
  1702.     INT    2,1
  1703.     CHAR    0,2
  1704.     INT    0
  1705.     LONG    0,0,0,0,0,0,0,0
  1706.  
  1707.  
  1708. hand1dataa:
  1709.     LONG    $03000380,$03800380,$038003e0,$03f00368,$c37ae3ef,$73fb3fff
  1710.     LONG    $1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
  1711. hand1datab:
  1712.     LONG    $00000080,$00800080,$00800080,$00900090,$00840011,$00050001
  1713.     LONG    $00010001,$00010003,$0002000e,$00080008,$01f80000
  1714.  
  1715. hand2dataa:
  1716.     LONG    $00000000,$00000300,$038003e0,$03f00b68,$1f7a1bef,$1ffb1fff
  1717.     LONG    $1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
  1718. hand2datab:
  1719.     LONG    $00000000,$00000000,$00800080,$04900490,$00840411,$00050001
  1720.     LONG    $00010001,$00010003,$0002000e,$00080008,$01f80000
  1721.  
  1722. hand3dataa:
  1723.     LONG %10000000000000000000000000000000
  1724.     LONG %00000000000000000000000000000000
  1725. hand3datab:
  1726.     LONG %10000000000000000000000000000000
  1727.     LONG %00000000000000000000000000000000
  1728.