'
' ####################
' #####  PROLOG  #####
' ####################
'
' A console program template
'
VERSION "0.0001"
CONSOLE
'
	IMPORT "xst"				' Standard library : required by most programs
'	IMPORT "xsx"				' Extended standard library
'	IMPORT "xio"				' Console input/ouput library

	IMPORT "xfree"

'	IMPORT "xst_s.lib"
' IMPORT "xsx_s.lib"
' IMPORT "xio_s.lib"

' IMPORT "gdi32"			' gdi32.dll
'	IMPORT "user32"		  ' user32.dll
'	IMPORT "kernel32"	  ' kernel32.dll
'	IMPORT "shell32"		' shell32.dll
'	IMPORT "msvcrt"		  ' msvcrt.dll

$$DEF_COLOR1 = 0x0000FFFF
'$$DEF_COLOR1 = 0x000000FF
$$DEF_COLOR2 = 0x0000FF00
$$DEF_COLOR3 = 0x00FFFFFF

DECLARE FUNCTION Entry ()
DECLARE FUNCTION ExtractSprite (adr)
'
'
' ######################
' #####  Entry ()  #####
' ######################
'
FUNCTION Entry ()
SHARED UBYTE data[]
SHARED s_count

	Xfree_Init ()
	a$=FreeImage_GetCopyrightMessage()
	PRINT a$

DIM data[0xFFFF]

fl=OPEN("rstate_l1.sna",$$RD)

SEEK(fl,0x100)

READ [fl],data[]

CLOSE (fl)

adr=0xBC67 'basic sprites

'adr=data[0xC4BA]+(data[0xC4BB]*256) 'unquote to read level sprites

PRINT HEXX$(adr)

s_count=0

DO
	
	adr=adr+4	
	
	IF data[adr]<128 THEN
		INC s_count
		 ExtractSprite (adr)
	ENDIF
	
LOOP UNTIL data[adr]>=128

PRINT s_count;" sprites processed"

a$=INLINE$("...")

END FUNCTION
'
' ###########################
' #####  ExtractSprite  #####
' ###########################
'
FUNCTION ExtractSprite (adr)
SHARED UBYTE data[]
SHARED s_count

larg=data[adr+0]
haut=data[adr+1]

ptr=data[adr+2]+(data[adr+3]*256)

PRINT s_count;" ";larg;haut;" ";HEXX$(ptr,4)
IF larg=0 THEN RETURN
IF haut=0 THEN RETURN

i_larg=larg*8
i_haut=haut*8

img=FreeImage_Allocate (i_larg,i_haut,8,$$FI_RGBA_RED_MASK,$$FI_RGBA_GREEN_MASK,$$FI_RGBA_BLUE_MASK)

p_bits=FreeImage_GetBits(img)
p_pal=FreeImage_GetPalette(img)
larg_line=FreeImage_GetPitch(img)

'default pal

FOR i=0 TO 255
	XLONGAT(p_pal+(i*4))=i
NEXT

XLONGAT(p_pal+4)=$$DEF_COLOR1
XLONGAT(p_pal+8)=$$DEF_COLOR2
XLONGAT(p_pal+12)=$$DEF_COLOR3

	

FOR y=0 TO haut-1
	FOR x=0 TO larg-1
		
	adr_i=p_bits+(larg_line*8*y)+(x*8)
	attr=data[ptr]
	INC ptr
	
	IF attr<>0x36 THEN
		attr=attr AND 3
		
			SELECT CASE attr
				CASE 2
					color=1
				CASE 3
					color=3
				CASE ELSE
					color=2
			END SELECT
		
		FOR j=0 TO 7
			mask=128
			char=data[ptr]
			FOR i=0 TO 7
				t_adr=adr_i+i+(j*larg_line)
				
				IF char AND mask THEN
					UBYTEAT(t_adr)=color
				ELSE
					UBYTEAT(t_adr)=0
				ENDIF
				
				mask=mask\2
			NEXT
			INC ptr
		NEXT
		
	ENDIF
			
	NEXT	
NEXT

'flip for BMP
FreeImage_FlipVertical(img)

'done save
s$=STRING$(s_count)
fname$="gfx/spr_"+FORMAT$(s$,"####")+".bmp"
FreeImage_Save($$FIF_BMP,img,&fname$,0)

'free image
FreeImage_Unload(img)

END FUNCTION
END PROGRAM