
/* Play KiSS v 0.77 */

/*
	No copyright is claimed for *any* material within.
  This source is *currently* Public Domain, and therefore open to free exploitation. */

/* Use at your own risk, and watch for hairy palms. */


/*  November 9, 1994
											 Chad Randall 
														- mbissaymssiK Software, broken spork division
						Internet:  crandall@garnet.msen.com
							USNail:  229 S.Washington St.
											 Manchester, Michigan, 48158-9680 USA */

/* This sucker's not been tested but on my machine.  So let me know about any probs, 'kay? */

OPT LARGE

MODULE	'graphics/rastport','graphics/gfx','graphics/text','graphics/scale','graphics/view',
				'graphics/gfxbase','graphics/clip','graphics/layers','graphics/displayinfo'
MODULE	'layers'
MODULE	'intuition/intuition','intuition/screens','intuition/gadgetclass','intuition/screens',
				'intuition/pointerclass'
MODULE	'libraries/gadtools','gadtools'
MODULE	'dos/dos'
MODULE	'libraries/asl','asl'
MODULE	'tools/async'
MODULE	'wb','workbench/workbench','workbench/startup'
MODULE	'icon'
MODULE	'exec/memory'

CONST	GS1_SIZE_X=640,GS2_SIZE_X=640,GS3_SIZE_X=640,GS4_SIZE_X=768
CONST	GS1_SIZE_Y=400,GS2_SIZE_Y=400,GS3_SIZE_Y=480,GS4_SIZE_Y=512
CONST	GS1_MAX_COLOR=16,GS2_MAX_COLOR=256,GS3_MAX_COLOR=256,GS4_MAX_COLOR=256
CONST	GS1_MAX_CELL=128,GS2_MAX_CELL=192,GS3_MAX_CELL=256,GS4_MAX_CELL=256
CONST SIZE_X_218=448,SIZE_Y_218=320,SIZE_X_224C=640,SIZE_Y_224C=400
CONST FILE_MARK_CELL=$20,FILE_MARK_PALET=$10
CONST DEFAULT_SIKII_DITHER=36
CONST DEFAULT_SIKII_GOSA=1300
CONST DEFAULT_COEF_GOSA=25
CONST MAX_CELL=GS4_MAX_CELL
CONST MAX_SET=10,MAX_PAL=10,MAX_COLOR=GS4_MAX_COLOR
CONST MAX_SIZE_X=GS4_SIZE_X,MAX_SIZE_Y=GS4_SIZE_Y
CONST DEFAULT_SIZE_X=SIZE_X_218,DEFAULT_SIZE_Y=SIZE_Y_218
CONST FILENAME_LENGTH=64

ENUM OLD_,NEW_
ENUM	DRAG_TOP,DRAG_PAUSE,DRAG_DIRTY,DRAG_BUFFER,DRAG_SMART

OBJECT gcmap
	red[256]:ARRAY OF CHAR
	grn[256]:ARRAY OF CHAR
	blu[256]:ARRAY OF CHAR
ENDOBJECT

OBJECT cello
	format:CHAR
	bit_per_pixel:INT
	xsize,ysize:INT
	xoffset,yoffset:INT
	mark:INT
	init_fix,fix:INT
	palet_num:INT
	set[MAX_SET]:ARRAY OF CHAR
	buf:PTR TO CHAR
	mono_buf:PTR TO CHAR
	x[MAX_SET]:ARRAY OF INT
	y[MAX_SET]:ARRAY OF INT
	pix:PTR TO bitmap
	pix_rp:PTR TO rastport
	pixdummy:PTR TO bitmap
	clip_pix:PTR TO bitmap
	clip_pix_rp:PTR TO rastport
	clip_pixdummy:PTR TO bitmap
	
->	gc:PTR TO gcmap
->	GC			gc,*paint_gc[MAX_PAL],gc_bw[2];
  pal:INT
	name:LONG
ENDOBJECT

OBJECT paleto
	name[FILENAME_LENGTH]:ARRAY OF CHAR
	format:CHAR
	color_num:CHAR
	palet_num:CHAR
	bit_per_pixel:CHAR
	pb[MAX_PAL]:ARRAY OF INT
	color[18]:ARRAY OF LONG
ENDOBJECT

OBJECT color
	red:LONG
	green:LONG
	blue:LONG
ENDOBJECT

ENUM SCAN_NORMAL, SCAN_EOL, SCAN_SETDATA, SCAN_IBM, SCAN_CEL, SCAN_CELNUM, SCAN_CELNAME, SCAN_CELNEXT

DEF filename[500]:STRING

DEF vp:PTR TO viewport,cm,depth,scrw,scrh,menu,vis
DEF rp:PTR TO rastport,winw,winh

DEF quit=FALSE,newproj=FALSE
DEF mode=0
DEF config_size_x,config_size_y
DEF cell[MAX_CELL]:ARRAY OF cello
DEF palet[20]:ARRAY OF paleto

DEF barh=8
DEF pb[MAX_SET]:LIST
DEF current_palet=0
DEF current_set=0
DEF disp:PTR TO rastport
DEF scr:PTR TO screen
DEF win:PTR TO window,outwin:PTR TO window
DEF fixxed=FALSE,rtdrag=DRAG_TOP,waittof=TRUE,hand=FALSE,bound=TRUE
DEF string[500]:STRING
DEF iconbmap=0:PTR TO bitmap,iconwidth,iconheight,oldx,oldy
DEF copybmap=0:PTR TO bitmap,copyrast:PTR TO rastport
DEF backbmap=0:PTR TO bitmap,backrast:PTR TO rastport
DEF maskbmap=0:PTR TO bitmap
DEF blankbmap=0:PTR TO bitmap,maximumw=1,maximumh=1
DEF hand1=0,hand2=0,hand3=0
DEF curobj=0,offx,offy,dragmode=0
DEF filereq=0:PTR TO filerequester
ENUM OFF=FALSE,ON=TRUE
DEF outputmode=0
DEF pauseflag=FALSE
RAISE "CHIP" IF AllocBitMap()=FALSE
RAISE "MEM" IF AllocMem()=FALSE
RAISE "MEM" IF New()=FALSE
RAISE "^C" IF CtrlC()=TRUE

PROC check_str(str)
	DEF p
	p:=str;WHILE (Char(p)<>0)
		IF ((Char(p)=10) OR (Char(p)=13) OR (Char(p)=9)) THEN PutChar(p," ")
		IF (Char(p)=";")
			PutChar(p,0)
		ENDIF
		EXIT (Char(p)=";")
	p:=p+1;ENDWHILE
ENDPROC

versionstring:
CHAR	'\0$VER: kiss player 0.77 (9.11.94) \tPUBLIC DOMAIN --- NOT FOR RESALE\0\0'

/*PROC skip_str(str) ->char *skip_str(char *str)
	DEF p																						->   	char *p;
	p:=str;WHILE (Char(p)=" ");p:=p+1;ENDWHILE 			->		for (p=str;*p==' ';p++);
  WHILE (Char(p)<>" ")														->		for (;*p!=' ';p++)
		IF (Char(p)=0) THEN RETURN p									->	if (*p=='\0') return(p);
	p:=p+1;ENDWHILE
	WHILE (Char(p)=" ");p:=p+1;ENDWHILE							->    for (;*p==' ';p++);
  RETURN p
ENDPROC*/

PROC check_kiss_header(fp)
	DEF buf
	buf:=[0,0,0,0]:LONG
	Read(fp,buf,4)
	Seek(fp,0,OFFSET_BEGINNING)
	IF Long(buf)="KiSS" THEN RETURN 1
ENDPROC FALSE


PROC load_data_cell(fn,num) HANDLE
	DEF fh=0
	DEF buf[64]:ARRAY OF CHAR,tmp_buf
	DEF i,t,j,x,y,flag
	DEF b[MAX_SIZE_X]:ARRAY OF CHAR
	DEF dir[500]:STRING,oldfile[100]:STRING
	DEF nx,p,nrp

	DEF temprp=0:PTR TO rastport
	DEF array=0
	DEF tempbitmap=0:PTR TO bitmap

	splitname(filename,dir,oldfile)
	AddPart(dir,fn,490)
	fh:=as_Open(dir,MODE_OLDFILE,6,4000)
	IF fh
		as_Read(fh,buf,4)
		IF Long(buf)="KiSS"
			as_Read(fh,buf,28)
			IF Char(buf)<>FILE_MARK_CELL THEN Raise("|cel")
			cell[num].xsize:=((Char(buf+ 5)*256)+Char(buf+ 4))
			cell[num].ysize:=(Char(buf+7)*256)+Char(buf+6)
			cell[num].xoffset:=Char(buf+9)*256+Char(buf+8)
			cell[num].yoffset:=Char(buf+11)*256+Char(buf+10)
			cell[num].bit_per_pixel:=smaller(bigger(Char(buf+1),4),8)
			cell[num].format:=NEW_
		ELSE
			cell[num].xsize:=(Char(buf+1)*256+Char(buf))
			cell[num].ysize:=Char(buf+3)*256+Char(buf+2)
			cell[num].xoffset:=0
			cell[num].yoffset:=0
			cell[num].bit_per_pixel:=4
			cell[num].format:=OLD_
		ENDIF

		IF cell[num].bit_per_pixel=8
			cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,8,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
			cell[num].pix_rp:=New(SIZEOF rastport)
			InitRastPort(cell[num].pix_rp)
			cell[num].pix_rp.bitmap:=cell[num].pix

			cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
			cell[num].clip_pix_rp:=New(SIZEOF rastport)
			InitRastPort(cell[num].clip_pix_rp)
			cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
		ELSE
			cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,4,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
			cell[num].pix_rp:=New(SIZEOF rastport)
			InitRastPort(cell[num].pix_rp)
			cell[num].pix_rp.bitmap:=cell[num].pix

			cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1,BMF_INTERLEAVED OR BMF_CLEAR OR BMF_DISPLAYABLE, NIL)
			cell[num].clip_pix_rp:=New(SIZEOF rastport)
			InitRastPort(cell[num].clip_pix_rp)
			cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
		ENDIF

		temprp:=New(SIZEOF rastport)
		InitRastPort(temprp)
		CopyMem(cell[num].pix_rp,temprp,SIZEOF rastport)
		tempbitmap:=AllocBitMap(cell[num].xsize,1,8,BMF_CLEAR,NIL)
		temprp.bitmap:=tempbitmap
		array:=New(cell[num].xsize+100)


-> NEED TO OPTIMIZE THE FOLLOWING:::

		IF cell[num].bit_per_pixel=8
			nx:=cell[num].xsize
			nrp:=cell[num].pix_rp
			FOR i:=0 TO cell[num].ysize-1

				as_Read(fh,b,nx)

				FOR t:=0 TO nx-1
					IF (p:=Char(b+t))
						SetAPen(nrp,Char(b+t))
						WritePixel(nrp,t,i)
					ENDIF
				ENDFOR
			ENDFOR
		ENDIF

		IF cell[num].bit_per_pixel=4
			nx:=cell[num].xsize
			nrp:=cell[num].pix_rp
			FOR i:=0 TO cell[num].ysize-1

				as_Read(fh,b,nx/2)

				FOR t:=0 TO (nx-1) STEP 2
/*				IF (p:= (Shr(Char(b+(t/2)),4) AND $0F))
					SetAPen(nrp,p)
					WritePixel(nrp,t,i)
				ENDIF
				IF (p:= (Char(b+(t/2)) AND $0F))
					SetAPen(nrp,p)
					WritePixel(nrp,t+1,i)
				ENDIF*/

					PutChar(array+(t),(Shr(Char(b+(t/2)),4) AND $0F))
					PutChar(array+(t)+1,((Char(b+(t/2))) AND $0F))
				ENDFOR
				IF (nrp<>0) THEN WritePixelLine8(nrp,0,i,nx,array,temprp)
			ENDFOR
		ENDIF

		maximumw:=bigger(maximumw,nx)
		maximumh:=bigger(maximumh,cell[num].ysize)

		IF ((cell[num].pix<>0) AND (cell[num].clip_pix<>0))
			planesclip(cell[num].pix,cell[num].clip_pix,cell[num].xsize,cell[num].ysize)
			FOR i:=1 TO 7;PutLong(cell[num].clip_pix+8+(i*4),Long(cell[num].clip_pix+8));ENDFOR
			PutChar(cell[num].clip_pix+5,8)
		ENDIF
	ENDIF
EXCEPT DO
	IF fh;as_Close(fh);ELSE
		IF outwin
			StringF(string,'Object not found:"\s" ',fn)
			SetWindowTitles(outwin,string,-1)
			DisplayBeep(0)
			Delay(30)
		ENDIF
	ENDIF
	
	IF temprp THEN Dispose(temprp)
	IF array THEN Dispose(array)
	IF tempbitmap THEN FreeBitMap(tempbitmap)
	IF exception="CHIP"
		WriteF('Not enough CHIP memory.\n')
		DisplayBeep(0)
	ENDIF
	IF exception="^C" THEN ReThrow()
ENDPROC

PROC disposesaveback()
	DEF i
	IF iconbmap THEN FreeBitMap(iconbmap)
	IF copybmap THEN FreeBitMap(copybmap)
	IF backbmap THEN FreeBitMap(backbmap)
	IF backrast THEN Dispose(backrast)
	IF copyrast THEN Dispose(copyrast)
	IF maskbmap
		PutChar(maskbmap+5,1)
		FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),0);ENDFOR
		FreeBitMap(maskbmap)
	ENDIF
	iconbmap:=0;backbmap:=0;maskbmap:=0;copybmap:=0;backrast:=0;copyrast:=0
ENDPROC

PROC createsaveback(obj)
	DEF i,minw=16,minh=8,dummy,mask
	disposesaveback()
	FOR i:=0 TO MAX_CELL-1
		IF cell[i].mark=obj
			minw:=bigger(minw,cell[i].xoffset+cell[i].xsize+1)
			minh:=bigger(minh,cell[i].yoffset+cell[i].ysize+1)
		ENDIF
	ENDFOR
	iconwidth:=minw
	iconheight:=minh
	iconbmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_CLEAR OR BMF_DISPLAYABLE OR IF (rtdrag<DRAG_DIRTY) THEN BMF_INTERLEAVED ELSE 0,NIL)
	IF ((rtdrag=DRAG_BUFFER) OR (rtdrag=DRAG_SMART))
		IF (((rtdrag=DRAG_SMART) AND (minw<160) AND (minh<280)) OR (rtdrag=DRAG_BUFFER))
			copybmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_DISPLAYABLE OR BMF_INTERLEAVED,NIL)
			copyrast:=New(SIZEOF rastport)
			InitRastPort(copyrast)
			copyrast.bitmap:=copybmap
		ENDIF
	ENDIF
	backbmap:=AllocBitMap(minw,minh,retdepth(mode),BMF_INTERLEAVED OR BMF_DISPLAYABLE,NIL)
	backrast:=New(SIZEOF rastport)
	InitRastPort(backrast)
	backrast.bitmap:=backbmap
	maskbmap:=AllocBitMap(minw,minh,1,BMF_DISPLAYABLE OR IF (rtdrag=FALSE) THEN BMF_INTERLEAVED ELSE 0,NIL)

	FOR i:=MAX_CELL-1 TO 0 STEP -1
		IF (cell[i].mark=obj)
			IF (cell[i].set[current_set]<10)
				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)
				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)
				dummy:=cell[i].palet_num
				SELECT dummy
					CASE 0 ;mask:=%00000000
					CASE 1 ;mask:=%00010000
					CASE 2 ;mask:=%00100000
					CASE 3 ;mask:=%00110000
					CASE 4 ;mask:=%01000000
					CASE 5 ;mask:=%01010000
					CASE 6 ;mask:=%01100000
					CASE 7 ;mask:=%01110000
					CASE 8 ;mask:=%10000000
					CASE 9 ;mask:=%10010000
					CASE 10;mask:=%10100000
					CASE 11;mask:=%10110000
					CASE 12;mask:=%11000000
					CASE 13;mask:=%11010000
					CASE 14;mask:=%11100000
					CASE 15;mask:=%11110000
				ENDSELECT
				dummy:=retdepth(mode)
				SELECT dummy
					CASE 4;mask:=(mask AND %00000000)
					CASE 5;mask:=(mask AND %00010000)
					CASE 6;mask:=(mask AND %00110000)
					CASE 7;mask:=(mask AND %01110000)
					CASE 8;mask:=(mask AND %11110000)
				ENDSELECT
				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)
			ENDIF
		ENDIF			
	ENDFOR

	planesclip(iconbmap,maskbmap,iconwidth,iconheight)
	PutChar(maskbmap+5,8)
	FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),Long(maskbmap+8));ENDFOR

ENDPROC

PROC reportmousemoves(win:PTR TO window)
	Forbid()
	win.flags:=win.flags OR WFLG_REPORTMOUSE
	Permit()
ENDPROC
PROC noreportmousemoves(win:PTR TO window);DEF flag
	Forbid()
	flag:=win.flags
	IF (flag AND WFLG_REPORTMOUSE) THEN flag:=flag-WFLG_REPORTMOUSE
	win.flags:=flag
	Permit()
ENDPROC


PROC main() HANDLE
	DEF i,ii,t,zz,tt,zzz
	DEF mes:PTR TO intuimessage
	DEF hit,hitflag=0,iadd:PTR TO menuitem,drawx,drawy
	DEF dir[500]:STRING,file[250]:STRING,buffer
	DEF args:PTR TO wbarg,wstr[250]:STRING,toolobject=NIL:PTR TO diskobject
	DEF region1,rectangle:PTR TO rectangle
	DEF olddir,dirrr,wb:PTR TO wbstartup
	DEF argarray[32]:LIST,rdarg=0,gotme=0,check,code=0,du=0
	DEF zx,zy,zw,zh,zox,zoy
	DEF oldfh=0,newfh=0,filebuf=0,bufptr,filelen=1
	DEF menuverify=FALSE

	IF (KickVersion(39)=0)
		Raise("Kick")
	ENDIF

	buffer:=New(260*12)
	IF (iconbase:=OpenLibrary('icon.library', 37))=NIL THEN Raise("LIB")
	IF (aslbase:=OpenLibrary('asl.library', 37))=NIL THEN Raise("LIB")
	IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise("LIB")
	IF (layersbase:=OpenLibrary('layers.library',37))=NIL THEN Raise("LIB")

	NEW cell[MAX_CELL]
	NEW palet[16]
	NEW rectangle

	IF wbmessage<>NIL
		outputmode:=TRUE
		wb:=wbmessage;args:=wb.arglist
		olddir:=CurrentDir(args.lock)
		IF args.name>0
			GetCurrentDirName(wstr,250)
			StrCopy(filename,wstr,ALL);AddPart(filename,'',490)
			StrAdd(wstr,args.name,ALL)
			IF (toolobject:=GetDiskObjectNew(wstr))
				IF (du:=FindToolType(toolobject.tooltypes,'FIXED'))
					IF MatchToolValue(du,'yes');fixxed:=FALSE;ELSE;fixxed:=TRUE;ENDIF
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'KISS_DIRECTORY'))
					StrCopy(filename,du,ALL)
					AddPart(filename,'',490)
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'HANDPOINTER'))
					IF MatchToolValue(du,'yes');hand:=TRUE;ELSE;hand:=FALSE;ENDIF
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'BLANKPOINTER'))
					IF MatchToolValue(du,'yes');hand:=3;ENDIF
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'BOUNDS'))
					IF MatchToolValue(du,'no');bound:=FALSE;ELSE;bound:=TRUE;ENDIF
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'DRAGTYPE'))
					StrToLong(du,{rtdrag})
					du:=limit(du,DRAG_TOP,DRAG_SMART)
				ENDIF
				IF (du:=FindToolType(toolobject.tooltypes,'WAITBLITTER'))
					IF MatchToolValue(du,'no');waittof:=FALSE;ELSE;waittof:=TRUE;ENDIF
				ENDIF
				FreeDiskObject(toolobject)
			ENDIF
		ENDIF
		CurrentDir(olddir)

->		StrCopy(filename,wstr,ALL)
		IF wb.numargs>1
			olddir:=args[].lock++ ->skip our lock! olddir is meaningless at this point
			IF args.lock
				olddir:=CurrentDir(args.lock)
				GetCurrentDirName(filename,490)
				NameFromLock(args.lock,wstr,240)
				CurrentDir(olddir)
				AddPart(filename,args.name,490)
				gotme:=TRUE
			ENDIF
		ENDIF
	ELSE
		FOR i:=0 TO 30
			argarray[i]:=NIL
		ENDFOR
		rdarg:=ReadArgs('FILE,DRAGMODE=D/N,NOFIX=X/S,HAND=H/S,BLANKPTR=BP/S,NOWAITBLIT=NWB/S,NOBOUNDS=NOB/S',argarray,0)
		IF rdarg
			IF argarray[0]
				StrCopy(filename,argarray[0],ALL)
				gotme:=TRUE
			ENDIF
			IF argarray[1]
				rtdrag:=argarray[1]
				rtdrag:=^rtdrag
				rtdrag:=limit(rtdrag,DRAG_TOP,DRAG_SMART)
			ENDIF
			IF argarray[2]
				fixxed:=TRUE
			ENDIF
			IF argarray[3] THEN hand:=TRUE
			IF argarray[4] THEN hand:=3
			IF argarray[5] THEN waittof:=FALSE
			IF argarray[6] THEN bound:=FALSE
			FreeArgs(rdarg)
		ENDIF
	ENDIF

	FOR i:=0 TO MAX_CELL-1
		cell[i].name:=String(FILENAME_LENGTH)
		cell[i].mark:=-66
	ENDFOR
	FOR i:=0 TO 15
		FOR ii:=0 TO 15
			palet[i].color[ii]:=0
		ENDFOR
	ENDFOR

	PutLong({hand1bm}+8,{hand1dataa})
	PutLong({hand1bm}+12,{hand1datab})
	PutLong({hand2bm}+8,{hand2dataa})
	PutLong({hand2bm}+12,{hand2datab})
	PutLong({hand3bm}+8,{hand3dataa})
	PutLong({hand3bm}+12,{hand3datab})
	hand1:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand1bm},
							POINTERA_XOFFSET,-7,
							POINTERA_YOFFSET,0,
							POINTERA_XRESOLUTION,POINTERXRESN_HIRES,
							POINTERA_YRESOLUTION,POINTERYRESN_HIGHASPECT,
							NIL,NIL])
	hand2:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand2bm},
							POINTERA_XOFFSET,-7,
							POINTERA_YOFFSET,1,
							POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
							POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
							NIL,NIL])
	hand3:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand3bm},
							POINTERA_XOFFSET,0,
							POINTERA_YOFFSET,0,
							NIL,NIL])


	filereq:=AllocAslRequest(ASL_FILEREQUEST,[ASLFR_INITIALPATTERN,'#?.CNF',NIL,NIL])

	region1:=NewRegion()

	WHILE quit=FALSE
		IF (gotme<>TRUE)
			splitname(filename,dir,file)
			WbenchToFront()
			ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
								ASL_OKTEXT,'_Open',ASL_FILE,file,ASL_DIR,dir,
								ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,FALSE,FILF_NEWIDCMP,TRUE,NIL,NIL])
			IF ii
				StrCopy(filename,filereq.drawer,ALL)
				AddPart(filename,filereq.file,490)
			ELSE
				quit:=TRUE;StrCopy(filename,'',ALL)
			ENDIF
		ENDIF	;gotme:=FALSE
		mode:=0
		maximumw:=1;maximumh:=1
		scr:=LockPubScreen('Workbench')
		config_size_x:=scr.width
		config_size_y:=(scr.height)
		barh:=scr.barheight
		UnlockPubScreen(0,scr);scr:=0
		IF openproj(filename)
			openscreen(retdepth(mode))
			->blankbmap:=AllocBitMap(maximumw,maximumh,1,BMF_CLEAR OR BMF_DISPLAYABLE,NIL)
			GetRGB32(cm,0,256,buffer)
			current_set:=0
			current_palet:=pb[current_set]
			updatecolors()
			updatelist()
			newproj:=FALSE
			WHILE ((quit=FALSE) AND (newproj=FALSE))
				IF ((hand<>0) AND (hand1<>0) AND (hand2<>0) AND (menuverify=FALSE))
					IF (retdepth(mode)<5)
						SetRGB32(vp,17,$FFFFFFFF,$DDDDDDDD,$88888888)
						SetRGB32(vp,18,$99999999,$66666666,$33333333)
						SetRGB32(vp,19,0,0,0)
					ENDIF
					IF (hand<>3)
						IF (dragmode=FALSE)
							SetWindowPointerA(win,[WA_POINTER,hand1,WA_POINTERDELAY,FALSE,NIL,NIL])
						ELSE
							SetWindowPointerA(win,[WA_POINTER,hand2,WA_POINTERDELAY,FALSE,NIL,NIL])
						ENDIF
					ELSE
						IF (dragmode<>FALSE)
							SetWindowPointerA(win,[WA_POINTER,hand3,WA_POINTERDELAY,FALSE,NIL,NIL])
						ELSE
							ClearPointer(win)
						ENDIF
					ENDIF						
				ELSE
					ClearPointer(win)
				ENDIF
				Wait(-1)
				CtrlC()
				hitflag:=0
				WHILE (mes:=Gt_GetIMsg(win.userport))
					IF (mes.class=IDCMP_MENUVERIFY)
						IF dragmode
							mes.code:=MENUCANCEL
						ELSE
							menucolors(buffer)
							ClearPointer(win);menuverify:=TRUE
						ENDIF
					ENDIF
					IF (mes.class=IDCMP_MENUPICK)
						ClearPointer(win);menuverify:=FALSE
						code:=mes.code
						WHILE (code<>MENUNULL)
							iadd:=ItemAddress(menu,code)
							IF iadd
								hit:=Long(iadd+34)
								check:=(Int(iadd+12) AND CHECKED)
								IF hit=75 THEN fixxed:=IF check THEN FALSE ELSE TRUE
								IF hit=76 THEN IF check THEN hand:=0
								IF hit=78 THEN IF check THEN hand:=TRUE
								IF hit=79 THEN IF check THEN hand:=3
								IF hit=77
									bound:=IF check THEN TRUE ELSE FALSE
								ENDIF
								IF hit=89 THEN waittof:=IF check THEN TRUE ELSE FALSE
								IF ((hit>=80) AND (hit<=84))
									rtdrag:=hit-80
								ENDIF
								IF hit=66 THEN quit:=TRUE
								IF hit=3 THEN hitflag:=3
								IF hit=2 THEN hitflag:=2
								IF hit=1 THEN newproj:=TRUE
								IF ((hit>=30) AND (hit<=39))
									IF current_set<>(hit-30)
										current_set:=hit-30
										current_palet:=pb[current_set]
										updatecolors()
										updatelist()
									ENDIF
								ENDIF
								IF ((hit>=20) AND (hit<=29))
									current_palet:=hit-20
									updatecolors()
								ENDIF
								code:=iadd.nextselect
							ELSE
								code:=MENUNULL
							ENDIF
						ENDWHILE
						updatecolors()
					ENDIF
					IF (mes.class=IDCMP_INTUITICKS) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
					IF (mes.class=IDCMP_MOUSEMOVE) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
					IF (mes.class=IDCMP_MOUSEBUTTONS)
						pauseflag:=FALSE
						IF mes.code=SELECTDOWN
							menuverify:=FALSE
							curobj,offx,offy:=findobj(mes.mousex,mes.mousey)
							IF (curobj>-1)
								dragmode:=TRUE;reportmousemoves(win)
								removeobj(curobj)
								createsaveback(curobj)
								oldx:=-5000;oldy:=-5000
								ii:=0
								FOR i:=0 TO MAX_CELL-1
									IF cell[i].mark=curobj THEN ii:=ii+1
								ENDFOR
StringF(string,'Object #\d has \d cells. @(\d[3],\d[3]) CHIP:$\d',curobj,ii,mes.mousex-offx,mes.mousey-offy,AvailMem(MEMF_CHIP))
SetWindowTitles(win,-1,string)
							ENDIF
						ENDIF
						IF mes.code=SELECTUP
							IF ((curobj>-1) AND (dragmode=TRUE))
								IF backrast THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
								placeobj(curobj,mes.mousex-offx,mes.mousey-offy);pauseflag:=TRUE
								disposesaveback()
								dragmode:=FALSE;curobj:=-1;noreportmousemoves(win)
								SetWindowTitles(win,-1,'KiSS Player 0.77')
							ENDIF
						ENDIF
					ENDIF
		      Gt_ReplyIMsg(mes)
				ENDWHILE
				SELECT hitflag
				CASE 2
					WbenchToFront()
					splitname(filename,dir,file)
					ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
							ASL_OKTEXT,'_Save',ASL_FILE,file,ASL_DIR,dir,
							ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
					WbenchToBack()
					IF ii
						StrCopy(string,filename,ALL)
						StrCopy(filename,filereq.drawer,ALL)
						AddPart(filename,filereq.file,490)
						oldfh:=Open(filename,MODE_OLDFILE)
						newfh:=1
						IF oldfh
							Close(oldfh)
							menucolors(buffer)
							newfh:=EasyRequestArgs(win,[20,0,'Confirm overwrite!',
								'File exists.\nDo you wish to overwrite?',
								'Overwrite|Cancel'],0,0)
							updatecolors()
						ENDIF
						IF newfh
							SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
							filelen:=FileLength(string)
							IF (filelen>0)
								filebuf:=New(filelen)
								oldfh:=Open(string,MODE_OLDFILE)
								IF oldfh
									Read(oldfh,filebuf,filelen)
									Close(oldfh)
									bufptr:=filebuf
									WHILE ((((Char(bufptr)<>10) OR (Char(bufptr)<>13)) AND (Char(bufptr+1)<>"$")) AND (bufptr<=(filebuf+filelen)))
										bufptr:=bufptr+1
									ENDWHILE
									newfh:=Open(filename,MODE_NEWFILE)
									IF newfh
										Write(newfh,filebuf,(bufptr-filebuf+1))
										FOR i:=0 TO 9
											StringF(string,'\n$\d[1]',pb[i]);Write(newfh,string,StrLen(string))
											ii:=0
											FOR t:=0 TO MAX_CELL-1
												IF (cell[t].set[i]<10)
													ii:=bigger(ii,cell[t].mark)
												ENDIF
											ENDFOR
											FOR t:=0 TO ii STEP 16
												FOR tt:=t TO smaller(t+15,ii)
													zz:=-11
													FOR zzz:=0 TO MAX_CELL-1
														IF (cell[zzz].set[i]<10)
															IF (cell[zzz].mark=tt)
																zz:=zzz
															ENDIF
														ENDIF
													ENDFOR
													IF zz>=0
														StringF(string,' \d,\d',cell[zz].x[i],cell[zz].y[i])
														Write(newfh,string,StrLen(string))
													ELSE
														Write(newfh,' *',2)
													ENDIF
												ENDFOR
												Write(newfh,'\n',1)
											ENDFOR
											Write(newfh,'\n',1)
										ENDFOR
										Write(newfh,'\n;save file written by - Play KiSS v0.77 for Amiga computers\n\n\n',61)
										Close(newfh)
									ENDIF
								ENDIF
								Dispose(filebuf)
							ENDIF
							ClearPointer(win)
						ENDIF
					ENDIF
				CASE 3
					menucolors(buffer)
					EasyRequestArgs(win,[20,0,'About "Play KiSS"',
							'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',
							'Ok'],0,0)
					updatecolors()
				ENDSELECT

				IF ((dragmode=TRUE) AND (curobj>=0))
					IF ((oldx<>drawx) OR (oldy<>drawy))
						IF (oldx<>-5000) THEN IF (backrast<>0) THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
						IF (backrast<>0) THEN ClipBlit(rp,drawx-offx,drawy-offy,backrast,0,0,iconwidth,iconheight,$C0)
						IF (rtdrag>=DRAG_DIRTY)
							IF ((maskbmap<>0) AND (iconbmap<>0))
								BltBitMap(iconbmap,0,0,maskbmap,0,0,iconwidth,iconheight,1,1,0)
								FOR i:=MAX_CELL-1 TO 0 STEP -1
									IF (cell[i].set[current_set]<10)
										IF (cell[i].clip_pix<>0)
											IF (cell[i].mark=curobj)
												BltBitMap(cell[i].clip_pix,0,0,maskbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,%00000001,0)
											ELSE
												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)))
													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)))
														zox:=0;zoy:=0
														zx:=(drawx-offx)-(cell[i].x[current_set]+cell[i].xoffset)
														zy:=(drawy-offy)-(cell[i].y[current_set]+cell[i].yoffset)
														IF (zx<=0)
															zox:=0
															zx:=Abs(zx)
														ELSE
															zox:=zx
															zx:=0
														ENDIF
														IF (zy<=0)
															zoy:=0
															zy:=Abs(zy)
														ELSE
															zoy:=zy
															zy:=0
														ENDIF
														zw:=limit(cell[i].xsize-zox,0,iconwidth-zx)
														zh:=limit(cell[i].ysize-zoy,0,iconheight-zy)
->	WriteF('\nBltBitMap($\h,\d,\d,$\h,\d,\d->\d,\d)',cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh)
														BltBitMap(cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh,$20,%00000001,0)
													ENDIF
												ENDIF
											ENDIF
										ENDIF
									ENDIF
								ENDFOR
								IF ((rtdrag=DRAG_DIRTY) OR ((rtdrag=DRAG_SMART) AND (copybmap=0)))
									BltMaskBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,%11100000,Long(maskbmap+8))
								ELSE
									IF ((copyrast<>0) AND (copybmap<>0))
										BltBitMap(iconbmap,0,0,copybmap,0,0,iconwidth,iconheight,$C0,$FF,0)
										BltBitMap(maskbmap,0,0,copybmap,0,0,iconwidth,iconheight,$80,$FF,0)
										BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
										BltBitMapRastPort(copybmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
									ENDIF
								ENDIF
							ENDIF
						ENDIF
						IF ((rtdrag=DRAG_TOP) OR (rtdrag=DRAG_PAUSE))
							IF (maskbmap<>0) THEN BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
							IF (iconbmap<>0) THEN BltBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
						ENDIF

						IF waittof
							WaitBlit()
							FOR i:=0 TO 2
								WaitTOF()
								WaitBOVP(vp)
							ENDFOR
						ENDIF
						oldx:=drawx;oldy:=drawy;pauseflag:=FALSE
					ELSE
						IF pauseflag=FALSE
							IF (rtdrag=DRAG_PAUSE)
								drawobj(curobj,drawx-offx,drawy-offy)
								pauseflag:=TRUE
							ENDIF
						ENDIF
					ENDIF
				ENDIF
			ENDWHILE
			disposesaveback()
			flushproj()
->			IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
			closescreen()
		ENDIF
	ENDWHILE	

EXCEPT DO
	FOR i:=0 TO MAX_CELL-1
		DisposeLink(cell[i].name)
	ENDFOR
	IF hand1 THEN DisposeObject(hand1)
	IF hand2 THEN DisposeObject(hand2)
	flushproj()
	END cell[MAX_CELL]
	END palet[16]
	END rectangle
->	IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
	closescreen()
	Dispose(buffer)
	Dispose(region1)
	IF ((exception="^C") AND (outputmode=0)) THEN WriteF('***BREAK\n')
	IF ((exception="Kick"))
		WriteF('You need at least OS 3.0 (Kickstart 39) to "Play KiSS"!!!\n')
		DisplayBeep(0)
	ENDIF
	IF filereq THEN FreeAslRequest(filereq)
	IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
	IF layersbase THEN CloseLibrary(layersbase)
	IF aslbase THEN CloseLibrary(aslbase)
	IF iconbase THEN CloseLibrary(iconbase)
ENDPROC

PROC boundize(dx,dy)
	IF bound
		dx:=limit(dx,offx,config_size_x-iconwidth+offx)
		dy:=limit(dy,offy,config_size_y-iconheight+offy-scr.barheight-1)
	ENDIF
ENDPROC dx,dy

PROC menucolors(buffer)
	DEF i
	FOR i:=0 TO 3
		SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
	ENDFOR
	FOR i:=17 TO 19
		SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
	ENDFOR
	FOR i:=(Shl(1,retdepth(mode))-4) TO (Shl(1,retdepth(mode))-1)
		SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
	ENDFOR
ENDPROC

PROC placeobj(obj,x,y,flag=FALSE)
	DEF i,w=0,h=0
	IF flag THEN removeobj(obj)
	IF bound
		FOR i:=0 TO MAX_CELL-1
			IF (cell[i].mark=obj)
				w:=bigger(w,cell[i].xoffset+cell[i].xsize)
				h:=bigger(h,cell[i].yoffset+cell[i].ysize)
			ENDIF
		ENDFOR
		x:=limit(x,0,config_size_x-w)
		y:=limit(y,0,config_size_y-h-scr.barheight-1)
	ENDIF
	FOR i:=0 TO MAX_CELL-1
		IF (cell[i].mark=obj)
			cell[i].x[current_set]:=x
			cell[i].y[current_set]:=y
		ENDIF
	ENDFOR
	drawobj(obj)
ENDPROC

PROC findobj(x,y)
	DEF i
	FOR i:=0 TO MAX_CELL-1
		IF ((cell[i].fix<1) OR (fixxed=TRUE))
		IF (cell[i].set[current_set]<10)
		IF (x>=(cell[i].xoffset+cell[i].x[current_set]))
			IF (y>=(cell[i].yoffset+cell[i].y[current_set]))
				IF (x<(cell[i].xoffset+cell[i].x[current_set]+cell[i].xsize))
					IF (y<(cell[i].yoffset+cell[i].y[current_set]+cell[i].ysize))
						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
							RETURN cell[i].mark,(x-cell[i].x[current_set]),(y-cell[i].y[current_set])
						ENDIF
					ENDIF
				ENDIF
			ENDIF
		ENDIF
		ENDIF
		ENDIF
	ENDFOR
ENDPROC -1,-1,-1


PROC updatecolors()
	DEF i,pn=0,t
	FOR i:=0 TO 15
		IF (palet[i].color[current_palet]<>0)
			FOR t:=0 TO smaller(palet[i].color_num,15)
				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)))
				pn:=pn+1;IF pn=256 THEN pn:=255
			ENDFOR
			pn:=(pn+15)/16*16
		ENDIF
	ENDFOR
ENDPROC

/*PROC oldmaskobj(obj,x,y)
	DEF sp[8]:LIST,i,t,sd

	FOR i:=0 TO 7
		sp[i]:=Long(cell[obj].pix+8+(i*8))
	ENDFOR
	sd:=cell[obj].pix.depth

	cell[obj].pix.depth:=depth
	IF cell[obj].bit_per_pixel=4
		FOR i:=0 TO 3
			IF (cell[obj].palet_num AND Shl(1,i))
				PutLong(cell[obj].pix+8+((i+4)*4),Long(cell[obj].clip_pix+8))
			ELSE
				PutLong(cell[obj].pix+8+((i+4)*4),Long(blankbmap+8))
			ENDIF
		ENDFOR
	ENDIF

	BltMaskBitMapRastPort(cell[obj].pix,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,(cell[obj].pix.bytesperrow)*8,cell[obj].ysize,
		%11100000,Long(cell[obj].clip_pix+8))

	cell[obj].pix.depth:=sd
	FOR i:=0 TO 7
		PutLong(cell[obj].pix+8+(i*8),sp[i])
	ENDFOR
ENDPROC
*/
PROC maskobj(obj,x,y)
	DEF dummy

	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)
	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)
	dummy:=cell[obj].palet_num
	SELECT dummy
		CASE 0 ;rp.mask:=%00000000
		CASE 1 ;rp.mask:=%00010000
		CASE 2 ;rp.mask:=%00100000
		CASE 3 ;rp.mask:=%00110000
		CASE 4 ;rp.mask:=%01000000
		CASE 5 ;rp.mask:=%01010000
		CASE 6 ;rp.mask:=%01100000
		CASE 7 ;rp.mask:=%01110000
		CASE 8 ;rp.mask:=%10000000
		CASE 9 ;rp.mask:=%10010000
		CASE 10;rp.mask:=%10100000
		CASE 11;rp.mask:=%10110000
		CASE 12;rp.mask:=%11000000
		CASE 13;rp.mask:=%11010000
		CASE 14;rp.mask:=%11100000
		CASE 15;rp.mask:=%11110000
	ENDSELECT
	dummy:=retdepth(mode)
	SELECT dummy
		CASE 4;rp.mask:=(rp.mask AND %00000000)
		CASE 5;rp.mask:=(rp.mask AND %00010000)
		CASE 6;rp.mask:=(rp.mask AND %00110000)
		CASE 7;rp.mask:=(rp.mask AND %01110000)
		CASE 8;rp.mask:=(rp.mask AND %11110000)
	ENDSELECT
	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)
	rp.mask:=%11111111
ENDPROC

PROC updatelist()
	DEF i,t
	SetRast(rp,0)

	SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
	FOR i:=MAX_CELL-1 TO 0 STEP -1
		IF (cell[i].mark>=0)
			IF (cell[i].set[current_set]<10)
				maskobj(i,cell[i].x[current_set],cell[i].y[current_set])
			ENDIF
		ENDIF			
	ENDFOR
	ClearPointer(win)
ENDPROC

PROC removeobj(obj)
	DEF i,t
	DEF minx=10000,miny=10000
	DEF region,oldregion=0,rectangle:PTR TO rectangle

	region:=NewRegion()
	NEW rectangle
	rectangle.minx:=10000
	rectangle.miny:=10000

	FOR i:=0 TO MAX_CELL-1
		IF cell[i].mark=obj
			rectangle.minx:=smaller(rectangle.minx,cell[i].x[current_set]+cell[i].xoffset)
			rectangle.miny:=smaller(rectangle.miny,cell[i].y[current_set]+cell[i].yoffset)
			rectangle.maxx:=bigger(rectangle.maxx,cell[i].x[current_set]+cell[i].xoffset+cell[i].xsize)
			rectangle.maxy:=bigger(rectangle.maxy,cell[i].y[current_set]+cell[i].yoffset+cell[i].ysize)
		ENDIF
	ENDFOR
	OrRectRegion(region,rectangle)


	oldregion:=InstallClipRegion(win.wlayer,region)

	SetRast(rp,0)
	FOR i:=MAX_CELL-1 TO 0 STEP -1
		IF ((cell[i].mark>=0) AND (cell[i].mark<>obj))
			IF (cell[i].set[current_set]<10)

				maskobj(i,cell[i].x[current_set],cell[i].y[current_set])

/*				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)
				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)
				dummy:=cell[i].palet_num
				SELECT dummy
					CASE 0 ;rp.mask:=%00000000
					CASE 1 ;rp.mask:=%00010000
					CASE 2 ;rp.mask:=%00100000
					CASE 3 ;rp.mask:=%00110000
					CASE 4 ;rp.mask:=%01000000
					CASE 5 ;rp.mask:=%01010000
					CASE 6 ;rp.mask:=%01100000
					CASE 7 ;rp.mask:=%01110000
					CASE 8 ;rp.mask:=%10000000
					CASE 9 ;rp.mask:=%10010000
					CASE 10;rp.mask:=%10100000
					CASE 11;rp.mask:=%10110000
					CASE 12;rp.mask:=%11000000
					CASE 13;rp.mask:=%11010000
					CASE 14;rp.mask:=%11100000
					CASE 15;rp.mask:=%11110000
				ENDSELECT
				dummy:=retdepth(mode)
				SELECT dummy
					CASE 4;rp.mask:=(rp.mask AND %00000000)
					CASE 5;rp.mask:=(rp.mask AND %00010000)
					CASE 6;rp.mask:=(rp.mask AND %00110000)
					CASE 7;rp.mask:=(rp.mask AND %01110000)
					CASE 8;rp.mask:=(rp.mask AND %11110000)
				ENDSELECT
				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)
				rp.mask:=%11111111*/
			ENDIF
		ENDIF			
	ENDFOR
	InstallClipRegion(win.wlayer,oldregion)
	END rectangle
	IF region
		DisposeRegion(region)
	ENDIF
ENDPROC

PROC drawobj(obj,xxxx=-500,yyyy=-500)
	DEF i,t
	DEF minx=10000,miny=10000
	DEF region,oldregion=0,rectangle:PTR TO rectangle
	DEF xx,yy

	region:=NewRegion()
	NEW rectangle

	rectangle.minx:=10000
	rectangle.miny:=10000

	FOR i:=0 TO MAX_CELL-1
		IF cell[i].mark=obj
			xx:=IF (xxxx=-500) THEN cell[i].x[current_set] ELSE xxxx
			yy:=IF (yyyy=-500) THEN cell[i].y[current_set] ELSE yyyy
			rectangle.minx:=smaller(rectangle.minx,xx+cell[i].xoffset)
			rectangle.miny:=smaller(rectangle.miny,yy+cell[i].yoffset)
			rectangle.maxx:=bigger(rectangle.maxx,xx+cell[i].xoffset+cell[i].xsize)
			rectangle.maxy:=bigger(rectangle.maxy,yy+cell[i].yoffset+cell[i].ysize)
		ENDIF
	ENDFOR
	OrRectRegion(region,rectangle)

	oldregion:=InstallClipRegion(win.wlayer,region)

	FOR i:=MAX_CELL-1 TO 0 STEP -1
		IF ((cell[i].mark>=0))
			IF (cell[i].set[current_set]<10)
				
xx:=cell[i].x[current_set]
yy:=cell[i].y[current_set]

				IF (cell[i].mark=obj)
					IF (xxxx>-500)
						IF (yyyy>-500)
							xx:=xxxx
							yy:=yyyy
						ENDIF
					ENDIF
				ENDIF

				maskobj(i,xx,yy)

/*
->				xx:=IF ((x<>-50000) AND (cell[i].mark=obj)) THEN y ELSE cell[i].x[current_set]
->				yy:=IF ((y<>-50000) AND (cell[i].mark=obj)) THEN x ELSE cell[i].y[current_set]
				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)
				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)
				dummy:=cell[i].palet_num
				SELECT dummy
					CASE 0 ;rp.mask:=%00000000
					CASE 1 ;rp.mask:=%00010000
					CASE 2 ;rp.mask:=%00100000
					CASE 3 ;rp.mask:=%00110000
					CASE 4 ;rp.mask:=%01000000
					CASE 5 ;rp.mask:=%01010000
					CASE 6 ;rp.mask:=%01100000
					CASE 7 ;rp.mask:=%01110000
					CASE 8 ;rp.mask:=%10000000
					CASE 9 ;rp.mask:=%10010000
					CASE 10;rp.mask:=%10100000
					CASE 11;rp.mask:=%10110000
					CASE 12;rp.mask:=%11000000
					CASE 13;rp.mask:=%11010000
					CASE 14;rp.mask:=%11100000
					CASE 15;rp.mask:=%11110000
				ENDSELECT
				dummy:=retdepth(mode)
				SELECT dummy
					CASE 4;rp.mask:=(rp.mask AND %00000000)
					CASE 5;rp.mask:=(rp.mask AND %00010000)
					CASE 6;rp.mask:=(rp.mask AND %00110000)
					CASE 7;rp.mask:=(rp.mask AND %01110000)
					CASE 8;rp.mask:=(rp.mask AND %11110000)
				ENDSELECT
				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)
				rp.mask:=%11111111
*/
			ENDIF
		ENDIF			
	ENDFOR
	InstallClipRegion(win.wlayer,oldregion)
	END rectangle
	IF region
		DisposeRegion(region)
	ENDIF
ENDPROC

/*PROC scanstring(fh,flag=FALSE)
	DEF l=-1,res=1
	DEF buf,str
	buf:=[0,0]:LONG
	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
	PutLong(buf,0)
	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)<>",")))
		res:=Read(fh,buf,1)
		l:=l+1
		IF l<120
			PutChar(str+l,Char(buf))
		ENDIF
	ENDWHILE
	PutChar(str+l+1,0)
	IF flag THEN PutChar(str+l,0)
ENDPROC str,l*/

PROC openproj(str) HANDLE
	DEF fh=0
	DEF fib:PTR TO fileinfoblock
	DEF i,buf,f
	DEF newbuf=0
	DEF num=0,set=-1
	DEF set_str[MAX_SET]:LIST
	DEF palset
	DEF wbscr

	NEW fib;newbuf:=New(2000);buf:=[0,0,0]
	FOR i:=0 TO MAX_SET-1
		set_str[i]:=String(4096)
	ENDFOR

	StrCopy(filename,str,ALL)
	
	IF (fh:=Open(filename,MODE_OLDFILE))

		WbenchToFront()
		wbscr:=LockPubScreen('Workbench')
		outwin:=OpenWindowTagList(0,[WA_INNERWIDTH,480,WA_INNERHEIGHT,1,
			WA_TOP,32,WA_LEFT,80,
			WA_AUTOADJUST,TRUE,
			WA_TITLE,'KiSS Player 0.77 - Broken Spork Technologies',
			WA_FLAGS,WFLG_DEPTHGADGET OR WFLG_DRAGBAR OR WFLG_NOCAREREFRESH,
			WA_CUSTOMSCREEN,wbscr,
			NIL,NIL])
		IF wbscr THEN UnlockPubScreen(0,wbscr)

		palset:=0
		Delay(100)
		WHILE (Fgets(fh,newbuf,1024))
			i:=Char(newbuf)
			SELECT i
			CASE "%";load_palet(newbuf+1,palset);
				palset:=palset+1;mode:=mode+1
->			CASE "["
			CASE "("
				load_config_size(newbuf+1)
			CASE "#"
				load_config_cell(num,newbuf+1);num:=num+1
			CASE "$"
				set:=set+1
				StrCopy(set_str[set],newbuf+1,ALL)
			CASE " "
				IF set>=0 THEN StrAdd(set_str[set],newbuf+1,ALL)
			ENDSELECT
		ENDWHILE
		FOR i:=0 TO set STEP 1
			load_config_set(i,set_str[i])
		ENDFOR
	ELSE
		Raise("DOS")
	ENDIF
EXCEPT DO
	IF outwin THEN CloseWindow(outwin);outwin:=0
	IF fh THEN Close(fh);fh:=0
	IF newbuf THEN Dispose(newbuf)
	END fib
	FOR i:=0 TO MAX_SET-1
		DisposeLink(set_str[i])
	ENDFOR
	IF exception="^C" THEN ReThrow()
	IF exception THEN RETURN FALSE
ENDPROC TRUE

PROC isdigit(s);IF (((s>="0") AND (s<="9")) OR (s=".") OR (s="-")) THEN RETURN TRUE;ENDPROC FALSE
PROC isalpha(s);IF (((s>="a") AND (s<="z")) OR ((s>="A") AND (s<="Z"))) THEN RETURN TRUE;ENDPROC FALSE
PROC ispunc(s);IF ((s=".") OR (s="-") OR (s="_")) THEN RETURN TRUE;ENDPROC FALSE

PROC scanforvalue(str)
	DEF l=0,i,s[100]:STRING,ins,iii=0
	WHILE (isdigit(Char(str+l)));l:=l+1;ENDWHILE
	StrCopy(s,str,l)
	ins:=InStr(str,'.')
	IF ((ins>0) AND (ins<=l))
		StrToLong(s,{i})
		StrToLong(s+ins+1,{iii})
	ELSE
		StrToLong(s,{i})
	ENDIF
ENDPROC i,l,iii

PROC scanforstring(str)
	DEF l=0
	WHILE (isdigit(Char(str+l)) OR isalpha(Char(str+l)) OR ispunc(Char(str+l)));l:=l+1;ENDWHILE
ENDPROC l

PROC load_config_cell(num,str)
	DEF p,c,i,j,n,secval
	DEF buf,mark,len
	buf:=[0,0,0,0,0,0,0,0,0,0,0,0,0]
	p:=str
	check_str(p)
	mark,len,secval:=scanforvalue(p)
	cell[num].mark:=mark
	cell[num].fix:=secval
	p:=p+len+1

	WHILE ((Char(p)=" ") OR (Char(p)=9));p:=p+1;ENDWHILE
	len:=scanforstring(p)
	StrCopy(cell[num].name,p,len)
	p:=p+len

	load_data_cell(cell[num].name,num)
	IF outwin
		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)
		SetWindowTitles(outwin,string,-1)
	ENDIF
	WHILE (Char(p)<>0)
		IF Char(p)="*"
			mark,len:=scanforvalue(p+1)
			cell[num].palet_num:=mark
			p:=p+1+len
		ENDIF
		IF Char(p)=":"
			p:=p+1
			FOR i:=0 TO MAX_SET-1;cell[num].set[i]:=50;ENDFOR
			WHILE (TRUE=TRUE)
				mark:=(Char(p)-"0")
				IF ((0<=mark) AND (mark<MAX_SET))
					cell[num].set[mark]:=1
				ENDIF
				p:=p+1
				EXIT (Char(p)=0)
			ENDWHILE
			RETURN
		ENDIF
	p:=p+1;ENDWHILE
	FOR i:=0 TO MAX_SET-1
		cell[num].set[i]:=1
	ENDFOR
ENDPROC

PROC load_palet(fn,num)
	DEF fh
	DEF buf
	DEF p,c,r,g,b,len
	DEF dir[500]:STRING,oldfile[100]:STRING
	DEF byte_l,byte_h

	buf:=[0,0,0,0,0,0,0,0,0,0]
	check_str(fn)
	len:=scanforstring(fn)
	PutChar(fn+len,0)
	IF outwin
		StringF(string,'PALETTE #\d:\s ',num,fn)
		SetWindowTitles(outwin,string,-1);Delay(15)
	ENDIF
	splitname(filename,dir,oldfile)
	AddPart(dir,fn,490)
	fh:=Open(dir,MODE_OLDFILE)
	IF fh
		StrCopy(palet[num],dir,ALL)
		IF (check_kiss_header(fh)=1)
			Read(fh,buf,32)
			IF Char(buf+4)=FILE_MARK_PALET
				palet[num].color_num:=Char(buf+ 9)*256+Char(buf+ 8)
				palet[num].palet_num:=Char(buf+11)*256+Char(buf+10)
				palet[num].bit_per_pixel:=Char(buf+5)
				palet[num].format:=NEW_
			ENDIF
		ELSE
			palet[num].color_num:=GS1_MAX_COLOR
			palet[num].palet_num:=MAX_PAL
			palet[num].bit_per_pixel:=12
			palet[num].format:=OLD_
		ENDIF
		p:=0;WHILE (p<palet[num].palet_num)
			palet[num].color[p]:=New(SIZEOF color*palet[num].color_num+50)
			c:=0;WHILE (c<palet[num].color_num)
				IF palet[num].bit_per_pixel=12
					Read(fh,buf,2)
					byte_l:=Char(buf)
					byte_h:=Char(buf+1)
					r:=(Shr(byte_l,4) AND $F)*$1111
					g:=(byte_h AND $F)*$1111
					b:=(byte_l AND $F)*$1111
					r:=(Shl(Shl(r,8),8) OR r)
					g:=(Shl(Shl(g,8),8) OR g)
					b:=(Shl(Shl(b,8),8) OR b)
				ENDIF
				IF palet[num].bit_per_pixel=24
					Read(fh,buf,1);r:=Char(buf)
					Read(fh,buf,1);g:=Char(buf)
					Read(fh,buf,1);b:=Char(buf)
					r:=(Shl(Shl(r,8),8) OR r)
					g:=(Shl(Shl(g,8),8) OR g)
					b:=(Shl(Shl(b,8),8) OR b)
				ENDIF
				PutLong(palet[num].color[p]+(12*c),r)
				PutLong(palet[num].color[p]+(12*c)+4,g)
				PutLong(palet[num].color[p]+(12*c)+8,b)
			c:=c+1;ENDWHILE
		p:=p+1;ENDWHILE
		Close(fh)
	ENDIF
	
ENDPROC

PROC load_config_size(str)
	DEF p,mark,len
	check_str(str)
	p:=str
	mark,len:=scanforvalue(p)
	config_size_x:=bigger(mark,config_size_x)
	p:=p+len+1
	mark,len:=scanforvalue(p)
	config_size_y:=bigger(mark+barh+1,config_size_y)
	IF outwin
		StringF(string,'Environment (\d,\d)',config_size_x,config_size_y)
		SetWindowTitles(outwin,string,-1);Delay(60)
	ENDIF
ENDPROC

PROC load_config_set(num,str)
	DEF n,p,mark,len,x,y,i
	check_str(str)
	p:=str
	mark,len:=scanforvalue(p)
	p:=p+len+1

	pb[num]:=mark

	IF outwin
		StringF(string,'SET #\d uses Palette #\d ',num,mark)
		SetWindowTitles(outwin,string,-1)
	ENDIF

	n:=0;WHILE(n<MAX_CELL)
		IF Char(p)<>"*"
			mark,len:=scanforvalue(p)
			p:=p+len+1
			x:=mark
			mark,len:=scanforvalue(p)
			p:=p+len+1
			y:=mark
			FOR i:=0 TO MAX_CELL-1
				IF cell[i].mark=n
					cell[i].x[num]:=x
					cell[i].y[num]:=y
				ENDIF
			ENDFOR
			WHILE ((Char(p)=32) OR (Char(p)=9));p:=p+1;ENDWHILE
		ELSE
			p:=p+1
			WHILE ((Char(p)=32) OR (Char(p)=9));p:=p+1;ENDWHILE
		ENDIF
	n:=n+1;ENDWHILE
ENDPROC

PROC planesclip(bm1,bm2,maxiw,maxih)
	DEF hap,hap2,sp1[8]:LIST
	IF ((bm1=0) OR (bm2=0)) THEN RETURN
	FOR hap:=0 TO 7
		sp1[hap]:=Long(bm1+8+(hap*4))
	ENDFOR

	FOR hap:=0 TO 7
		PutLong((bm1+8),sp1[hap])
		IF (((sp1[hap]>0)) AND ((hap+1)<=Char(bm1+5)))
			BltBitMap(bm1,0,0,bm2,0,0,maxiw,maxih,IF hap=0 THEN 192 ELSE 224,$1,0)
		ENDIF
	ENDFOR	
	FOR hap:=0 TO 7
		PutLong(bm1+8+(hap*4),sp1[hap])
	ENDFOR
->	BltBitMap(bm2,0,0,bm2,0,0,maxiw,maxih,$50,$1,0)
ENDPROC

PROC flushproj()
	DEF i,t
	FOR i:=0 TO MAX_CELL-1
		IF ((cell[i].clip_pix<>0))
			PutChar(cell[i].clip_pix+5,1)
			FOR t:=1 TO 7;PutLong(cell[i].clip_pix+8+(t*4),0);ENDFOR
		ENDIF
		IF cell[i].pix
			FreeBitMap(cell[i].pix)
			cell[i].pix:=0
		ENDIF
		IF cell[i].clip_pix
			FreeBitMap(cell[i].clip_pix)
			cell[i].clip_pix:=0
		ENDIF
		IF (cell[i].pix_rp)
			Dispose(cell[i].pix_rp)
			cell[i].pix_rp:=0
		ENDIF
		IF (cell[i].clip_pix_rp)
			Dispose(cell[i].clip_pix_rp)
			cell[i].clip_pix_rp:=0
		ENDIF
		cell[i].mark:=-2
		FOR t:=0 TO MAX_SET-1
			cell[i].x[t]:=0
			cell[i].y[t]:=0
			cell[i].set[t]:=50
		ENDFOR
		cell[i].mark:=-66
		cell[i].fix:=0
		cell[i].xoffset:=0
		cell[i].yoffset:=0
		cell[i].xsize:=0
		cell[i].ysize:=0
	ENDFOR
	FOR i:=0 TO MAX_PAL-1
		FOR t:=0 TO MAX_SET-1
			IF palet[i].color[t]
				Dispose(palet[i].color[t])
				palet[i].color[t]:=0
			ENDIF
		ENDFOR
	ENDFOR
	FOR i:=0 TO MAX_SET-1
		pb[i]:=0
	ENDFOR
ENDPROC

PROC splitname(str1,str2,str3)
  DEF filestart,pathlen,stt[5]:STRING
	filestart:=FilePart(str1)
	pathlen:=filestart-str1
	IF pathlen
		StrCopy(str2,str1,pathlen)
		MidStr(stt,str2,StrLen(str2)-1,1)
		IF StrCmp(stt,'/',ALL)
			MidStr(str2,str2,0,StrLen(str2)-1)
		ENDIF		
		StrCopy(str3,filestart,ALL)
	ELSE
		StrCopy(str2,'',ALL)
		StrCopy(str3,str1,ALL)
	ENDIF
ENDPROC

PROC openscreen(d)
	DEF cflag,lflag1=CHECKIT,lflag2=CHECKIT,lflag3=CHECKIT,lflag4=CHECKIT,lflag5=CHECKIT,lflag=CHECKIT
	DEF hflag1=CHECKIT,hflag2=CHECKIT,hflag3=CHECKIT,bflag=CHECKIT
	depth:=d
	scr:=OpenScreenTagList(NIL,[SA_LIKEWORKBENCH,TRUE,
		SA_DEPTH,depth,
		SA_TITLE,'KiSS Player 0.77',
		SA_COLORMAPENTRIES,256,
		SA_FULLPALETTE,TRUE,
		SA_WIDTH,config_size_x,
		SA_HEIGHT,config_size_y,
		SA_INTERLEAVED,TRUE,
		SA_AUTOSCROLL,TRUE,
		SA_PENS,[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]:INT,
		NIL,NIL])
	IF scr=0 THEN Raise("SCR")
	IF (vis:=GetVisualInfoA(scr,NIL))=0 THEN RETURN "VIS"
	win:=OpenWindowTagList(0,[WA_WIDTH,scr.width,WA_HEIGHT,scr.height-scr.barheight-1,
		WA_TOP,scr.barheight+1,WA_LEFT,0,
		WA_FLAGS,WFLG_ACTIVATE OR WFLG_SMART_REFRESH,
		WA_BORDERLESS,TRUE,
		WA_BACKDROP,TRUE,
		WA_CUSTOMSCREEN,scr,
		WA_NEWLOOKMENUS,TRUE,
		WA_IDCMP,IDCMP_MENUPICK OR IDCMP_MOUSEBUTTONS OR IDCMP_INTUITICKS OR IDCMP_MENUVERIFY OR IDCMP_MOUSEMOVE,
		NIL,NIL])
	IF win=0 THEN Raise("WIN")
	vp:=scr.viewport
	cm:=vp.colormap
	rp:=win.rport

	cflag:=CHECKIT
	IF (fixxed=0) THEN cflag:=cflag OR CHECKED
	IF (hand=TRUE) 	THEN hflag2:=hflag2 OR CHECKED
	IF (hand=0) 		THEN hflag1:=hflag1 OR CHECKED
	IF (hand=3) 		THEN hflag3:=hflag3 OR CHECKED
	IF (waittof) THEN lflag:=lflag OR CHECKED
	IF (bound) THEN bflag:=bflag OR CHECKED
	SELECT rtdrag
	CASE DRAG_TOP; 		lflag1:=lflag1 OR CHECKED
	CASE DRAG_PAUSE;	lflag2:=lflag2 OR CHECKED
	CASE DRAG_DIRTY;	lflag3:=lflag3 OR CHECKED
	CASE DRAG_BUFFER;	lflag4:=lflag4 OR CHECKED
	CASE DRAG_SMART;	lflag5:=lflag5 OR CHECKED
	ENDSELECT
  IF (menu:=CreateMenusA([NM_TITLE,0,'Project','P',0,0,0,
													NM_ITEM,0,'Open','O',0,0,1,
													NM_ITEM,0,NM_BARLABEL,0,0,0,0,
													NM_ITEM,0,'Save As...','S',0,0,2,
													NM_ITEM,0,NM_BARLABEL,0,0,0,0,
													NM_ITEM,0,'About','?',0,0,3,
													NM_ITEM,0,'Quit','Q',0,0,66,

													NM_TITLE,0,'Item',0,0,0,0,
													NM_ITEM,0,'Sets',0,0,0,0,
													NM_SUB,0,'Set 0','A',CHECKIT OR CHECKED,%1111111110,30,
													NM_SUB,0,'Set 1','B',CHECKIT,%1111111101,31,
													NM_SUB,0,'Set 2','C',CHECKIT,%1111111011,32,
													NM_SUB,0,'Set 3','D',CHECKIT,%1111110111,33,
													NM_SUB,0,'Set 4','E',CHECKIT,%1111101111,34,
													NM_SUB,0,'Set 5','F',CHECKIT,%1111011111,35,
													NM_SUB,0,'Set 6','G',CHECKIT,%1110111111,36,
													NM_SUB,0,'Set 7','H',CHECKIT,%1101111111,37,
													NM_SUB,0,'Set 8','I',CHECKIT,%1011111111,38,
													NM_SUB,0,'Set 9','J',CHECKIT,%0111111111,39,

													NM_ITEM,0,'Palettes',0,0,0,0,
													NM_SUB,0,'Palette 0','0',CHECKIT OR CHECKED,%1111111110,20,
													NM_SUB,0,'Palette 1','1',CHECKIT,%1111111101,21,
													NM_SUB,0,'Palette 2','2',CHECKIT,%1111111011,22,
													NM_SUB,0,'Palette 3','3',CHECKIT,%1111110111,23,
													NM_SUB,0,'Palette 4','4',CHECKIT,%1111101111,24,
													NM_SUB,0,'Palette 5','5',CHECKIT,%1111011111,25,
													NM_SUB,0,'Palette 6','6',CHECKIT,%1110111111,26,
													NM_SUB,0,'Palette 7','7',CHECKIT,%1101111111,27,
													NM_SUB,0,'Palette 8','8',CHECKIT,%1011111111,28,
													NM_SUB,0,'Palette 9','9',CHECKIT,%0111111111,29,

													NM_TITLE,0,'Settings',0,0,0,0,
													NM_ITEM,0,'Fixed Cells?','X',cflag,0,75,
													NM_ITEM,0,'Screen Boundaries?',0,bflag,0,77,
													NM_ITEM,0,'Pointer',0,0,0,0,
													NM_SUB,0,'Normal',0,hflag1,	%110,76,
													NM_SUB,0,'Hand',0,hflag2,		%101,78,
													NM_SUB,0,'Blank',0,hflag3,	%011,79,
													NM_ITEM,0,'Dragging',0,0,0,0,

													NM_SUB,0,'Always on top',						0,lflag1,%11110,80,
													NM_SUB,0,'Layered, on pause',				0,lflag2,%11101,81,
													NM_SUB,0,'Layered, quick&dirty',		0,lflag3,%11011,82,
													NM_SUB,0,'Layered, buffered',				0,lflag4,%10111,83,
													NM_SUB,0,'Layered, smart buffered',	0,lflag5,%01111,84,
													NM_SUB,0,NM_BARLABEL,0,0,0,0,
													NM_SUB,0,'Wait for blitter?',0,lflag,0,89,

													NM_END,0,'End','x',0,0,0]:newmenu,NIL))=NIL THEN Raise("MENU")
	LayoutMenusA(menu,vis,[GTMN_NEWLOOKMENUS,TRUE,NIL,NIL])
	SetMenuStrip(win,menu)
ENDPROC

PROC closescreen()
	IF win
		CloseWindow(win)
		win:=0
	ENDIF
	IF menu
		FreeMenus(menu)
		menu:=0
	ENDIF
	IF vis
		FreeVisualInfo(vis)
		vis:=0
	ENDIF
	IF scr
		CloseScreen(scr)
		scr:=0
	ENDIF

ENDPROC

PROC retdepth(m)
	SELECT m
	CASE 0;RETURN 4
	CASE 1;RETURN 4
	CASE 2;RETURN 5
	CASE 3;RETURN 6
	CASE 4;RETURN 6
	CASE 5;RETURN 7
	CASE 6;RETURN 7
	CASE 7;RETURN 7
	CASE 8;RETURN 7
	ENDSELECT
ENDPROC 8

PROC smaller(val1,val2);IF val1<val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
PROC bigger(val1,val2);IF val1>val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
PROC limit(val1,val2,val3);IF val1<val2 THEN RETURN val2
	        IF val1>val3 THEN RETURN val3;ENDPROC val1


hand1bm:
	INT	2,22
	CHAR	0,2
	INT	0
	LONG	0,0,0,0,0,0,0,0

hand2bm:
	INT	2,22
	CHAR	0,2
	INT	0
	LONG	0,0,0,0,0,0,0,0

hand3bm:
	INT	2,1
	CHAR	0,2
	INT	0
	LONG	0,0,0,0,0,0,0,0


hand1dataa:
	LONG	$03000380,$03800380,$038003e0,$03f00368,$c37ae3ef,$73fb3fff
	LONG	$1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
hand1datab:
	LONG	$00000080,$00800080,$00800080,$00900090,$00840011,$00050001
	LONG	$00010001,$00010003,$0002000e,$00080008,$01f80000

hand2dataa:
	LONG	$00000000,$00000300,$038003e0,$03f00b68,$1f7a1bef,$1ffb1fff
	LONG	$1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
hand2datab:
	LONG	$00000000,$00000000,$00800080,$04900490,$00840411,$00050001
	LONG	$00010001,$00010003,$0002000e,$00080008,$01f80000

hand3dataa:
	LONG %10000000000000000000000000000000
	LONG %00000000000000000000000000000000
hand3datab:
	LONG %10000000000000000000000000000000
	LONG %00000000000000000000000000000000
