  | 
				Castle Paradox
    
				 | 
			 
		 
		 
	
		| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		chronoboy Into the past with a splash
 
 
  
  Joined: 04 Jun 2010 Posts: 162 Location: Canada
  | 
		
			
				 Posted: Sun Dec 05, 2010 8:00 pm    Post subject: UNLUMP.EXE remade in sdlBasic | 
				     | 
			 
			
				
  | 
			 
			
				Just as a proof of concept which may grow further into something else, here is unlump re-made in sdlBasic, a popular cross-platform Basic language.  I going to see if I can read the various files in the lumps as well and render them on an SDL surface.  sdlBasic has been ported to the ARM processor, and is used on the open source gaming platform: GP2X.
 
 
Using lumpfiles in sdlBasic is really easy, as it has support for memory mapping an entire file at once... less coding overall.
 
 
 	  | Code: | 	 		  
 
function getbyte(bnk,ptr)
 
  dat = peek(bnk,ptr)
 
  ptr=ptr+1
 
  return dat
 
end function
 
 
function getdata(bnk,ptr)
 
  tmp$=""
 
  do
 
    byte=getbyte(bnk,ptr)
 
    if byte = 0 then
 
      exit do
 
    end if
 
    tmp$=tmp$+chr$(byte)
 
  loop
 
  return tmp$
 
end function
 
 
function getlong(bnk,ptr)
 
  dat = getbyte(bnk,ptr)
 
  size = (dat shl 16)
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,(dat shl 24))
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,dat)
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,(dat shl 8))
 
  return size
 
end function
 
 
ptr=0
 
loadBank("test.rpg",0)
 
if not direxists("unlumped") then
 
  mkdir("unlumped")
 
end if
 
do
 
  fi$=lCase(getdata(0,ptr))
 
  size=getlong(0,ptr)
 
  print "Lump file: "+fi$
 
  print "Lump size: "+str$(size)
 
  reserveBank(1,size)
 
  memCopy(0,ptr,1,0,size-1)
 
  saveBank("unlumped/"+fi$,1)
 
  freeBank(1)
 
  ptr=ptr+size
 
  if ptr > bankSize(0)-1 then
 
    exit do
 
  end if
 
loop
 
freeBank(0)
 
 | 	  
 
 
Since there is no internal tracking on the file position, like GET and PUT in traditional BASIC, I needed to use a special variable that points to the current position in memory in the data bank.
 
 
This program does not do any password checking before unlumping, however even though it is able to unlump, I am sure CUSTOM will ask for the password even on unlumped directories.  My goal would be to read the lumps in directly from the RPG file.  Unfortunately, the RPG file does not have a FAT, so I'll need to implement this(which is easy). _________________ Current project:  Chronoboy Adventures
 
 
Website: http://www.chronoboy.com/ | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		chronoboy Into the past with a splash
 
 
  
  Joined: 04 Jun 2010 Posts: 162 Location: Canada
  | 
		
			
				 Posted: Sun Dec 05, 2010 10:05 pm    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Got the code to load an MXS to work perfectly.  I added autoback(0) and screenSwap as it showed the image being drawn pixel by pixel.
 
 
It successfully loads the first master palette and displays the first image in the MXS file.
 
 
 	  | Code: | 	 		  
 
setDisplay(320,200,8,1)
 
enablePalette(1)
 
autoback(0)
 
 
ptr=0
 
loadBank("unlumped/palettes.bin",0)
 
hdrsize=deek(0,0)
 
recsize=deek(0,2)
 
reserveBank(1,recsize)
 
memCopy(0,hdrsize,1,0,recsize-1)
 
for i = 0 to 255
 
  r = peek(1,i*3)
 
  g = peek(1,i*3+1)
 
  b = peek(1,i*3+2)
 
  color(i,rgb(r,g,b))
 
next
 
freeBank(1)
 
freeBank(0)
 
 
loadBank("unlumped/ohrrpgce.mxs",0)
 
i=0
 
for j = 0 to 3
 
  for y = 0 to 199
 
    for x = j to 319 step 4
 
     l=peek(0,i)
 
     ink(color(l))
 
     setPixel(x,y)
 
     i=i+1
 
   next
 
  next
 
next
 
freeBank(0)
 
screenSwap
 
waitkey
 
 | 	  
 
 
I'm not sure what to read next, perhaps the maptiles and then code a way to easily access and display them.  Since I got MXS images read, this would only be my next obvious task.  Camera and sprite support is basically already built into sdlBasic, all I need to do is code the animations.  For the most part, I believe plot-scripting would be most difficult task.  I'll post the next bit of code for map displaying next. _________________ Current project:  Chronoboy Adventures
 
 
Website: http://www.chronoboy.com/ | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		chronoboy Into the past with a splash
 
 
  
  Joined: 04 Jun 2010 Posts: 162 Location: Canada
  | 
		
			
				 Posted: Mon Dec 06, 2010 12:05 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 
 
 
Can you guess what this is?
 
 
I managed to display an entire map, without the animated tiles or additional layers.  It's pretty basic right now, but perhaps I might make a custom map editor in high resolution for those out there who don't like editing their maps in the small space that is currently provided.
 
 
 	  | Code: | 	 		  
 
function getbyte(bnk,ptr)
 
  dat = peek(bnk,ptr)
 
  ptr=ptr+1
 
  return dat
 
end function
 
 
function getdata(bnk,ptr)
 
  tmp$=""
 
  do
 
    byte=getbyte(bnk,ptr)
 
    if byte = 0 then
 
      exit do
 
    end if
 
    tmp$=tmp$+chr$(byte)
 
  loop
 
  return tmp$
 
end function
 
 
function getlong(bnk,ptr)
 
  dat = getbyte(bnk,ptr)
 
  size = (dat shl 16)
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,(dat shl 24))
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,dat)
 
  dat = getbyte(bnk,ptr)
 
  size = orBit(size,(dat shl 8))
 
  return size
 
end function
 
 | 	  
 
 
 	  | Code: | 	 		  
 
include "dataops.sdllib"
 
 
sub viewpalette()
 
x=0
 
y=0
 
for i = 0 to 255
 
  ink(color(i))
 
  setPixel(x,y)
 
  x=x+1
 
  if x>15 then
 
    y=y+1
 
    x=0
 
  end if
 
next
 
end sub
 
 
sub unlump(fi$,rpgdir$)
 
ptr=0
 
loadBank(fi$,0)
 
if not direxists(rpgdir$) then
 
  mkdir(rpgdir$)
 
end if
 
do
 
  fi$=lCase(getdata(0,ptr))
 
  size=getlong(0,ptr)
 
  print "Lump file: "+fi$
 
  print "Lump size: "+str$(size)
 
  reserveBank(1,size)
 
  memCopy(0,ptr,1,0,size-1)
 
  ffi$=rpgdir$+"/"+fi$
 
  saveBank(ffi$,1)
 
  freeBank(1)
 
  ptr=ptr+size
 
  if ptr > bankSize(0)-1 then
 
    exit do
 
  end if
 
loop
 
freeBank(0)
 
end sub
 
 
sub loadpal(rpgdir$)
 
ptr=0
 
loadBank(rpgdir$+"/palettes.bin",0)
 
hdrsize=deek(0,0)
 
recsize=deek(0,2)
 
reserveBank(1,recsize)
 
memCopy(0,hdrsize,1,0,recsize-1)
 
for i = 0 to 255
 
  r = peek(1,i*3)
 
  g = peek(1,i*3+1)
 
  b = peek(1,i*3+2)
 
  color(i,rgb(r,g,b))
 
next
 
freeBank(1)
 
freeBank(0)
 
end sub
 
 
sub loadmxs(fi$,rec,slot)
 
autoback(0)
 
loadBank(fi$,0)
 
i=(rec*64000)
 
for j = 0 to 3
 
  for y = 0 to 199
 
    for x = j to 319 step 4
 
     l=peek(0,i)
 
     ink(color(l))
 
     setPixel(x,y)
 
     i=i+1
 
   next
 
  next
 
next
 
freeBank(0)
 
grab(slot,0,0,320,200)
 
cls
 
autoback(1)
 
end sub
 
 | 	  
 
 
 	  | Code: | 	 		  
 
include "ohr.sdllib"
 
setDisplay(320*4,200*4,8,1)
 
enablePalette(1)
 
 
sub putTile(x,y,til)
 
  tilx=0
 
  tily=0
 
  do
 
    if til<16 then
 
     tilx=til
 
     exit do
 
    end if
 
    if til>15 then
 
      tily=tily+1
 
      til=til-16
 
    end if
 
  loop
 
  blt(1,tilx*20,tily*20,20,20,x*20,y*20)
 
end sub
 
 
loadpal("unlumped")
 
loadmxs("unlumped/viking.til",1,1)
 
loadBank("unlumped/viking.t00",0)
 
width=peek(0,7)
 
height=peek(0,9)
 
reserveBank(1,width*height)
 
memCopy(0,11,1,0,(width*height)-1)
 
screenOpen(1,width*20,height*20,0,0,320*4,200*4,0)
 
screen(1)
 
'autoback(0)
 
i=0
 
for y = 0 to height-1
 
  for x = 0 to width-1
 
    til=peek(1,i)
 
    if til>159 then
 
     til=0
 
    end if
 
    putTile(x,y,til)
 
    i=i+1
 
  next
 
next
 
'grab(2,0,0,320,200)
 
'zoomImage(2,2,2)
 
'pasteIcon(0,0,2)
 
'screenSwap
 
waitkey
 
 | 	  
 
 
There is all the code needed for sdlBasic in order to render the map in that resolution, which is 4X the normal resolution.  Scaling does work, just uncomment the zoomImage and change grab accordingly.  Enjoy![/img] _________________ Current project:  Chronoboy Adventures
 
 
Website: http://www.chronoboy.com/ | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		chronoboy Into the past with a splash
 
 
  
  Joined: 04 Jun 2010 Posts: 162 Location: Canada
  | 
		
			
				 Posted: Mon Dec 06, 2010 1:19 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Basic mouse map editing WORKS!!!!
 
 
 	  | Code: | 	 		  
 
include "ohr.sdllib"
 
setDisplay(320*4,200*4,8,1)
 
setCaption("Vikings High-Def map")
 
enablePalette(1)
 
 
sub putTile(x,y,til)
 
  tilx=0
 
  tily=0
 
  do
 
    if til<16 then
 
     tilx=til
 
     exit do
 
    end if
 
    if til>15 then
 
      tily=tily+1
 
      til=til-16
 
    end if
 
  loop
 
  blt(1,tilx*20,tily*20,20,20,x*20,y*20)
 
end sub
 
 
sub loadmap(map,tset)
 
mp$=str$(map)
 
if len(mp$)=1 then
 
  mp$="0"+mp$
 
end if
 
loadmxs("unlumped/viking.til",tset,1)
 
loadBank("unlumped/viking.t"+mp$,0)
 
width=peek(0,7)
 
height=peek(0,9)
 
reserveBank(1,width*height)
 
memCopy(0,11,1,0,(width*height)-1)
 
screenOpen(1,width*20,height*20,0,0,320*4,200*4,0)
 
screen(1)
 
autoback(0)
 
i=0
 
for y = 0 to height-1
 
  for x = 0 to width-1
 
    til=peek(1,i)
 
    if til>159 then
 
     til=0
 
    end if
 
    putTile(x,y,til)
 
    i=i+1
 
  next
 
next
 
'grab(2,0,0,width*20,height*20)
 
'zoomImage(2,2,2)
 
'pasteIcon(0,0,2)
 
screenSwap
 
autoback(1)
 
freeBank(1)
 
freeBank(0)
 
end sub
 
 
loadpal("unlumped")
 
map=0
 
tset=0
 
loadmap(map,tset)
 
x=0
 
y=0
 
while not key(k_esc)
 
  if key(k_up) then
 
    y=y-20
 
  end if
 
  if key(k_down) then
 
    y=y+20
 
  end if
 
  if key(k_left) then
 
    x=x-20
 
  end if
 
  if key(k_right) then
 
    x=x+20
 
  end if
 
  if key(k_comma) then
 
    map=map-1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_period) then
 
    map=map+1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_leftbracket) then
 
    tset=tset-1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_rightbracket) then
 
    tset=tset+1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if mouseButton = 1 then
 
    x=mouseScreenX(1)
 
    y=mouseScreenY(1)
 
    x=int(x/20)
 
    y=int(y/20)
 
    putTile(x,y,0)
 
  end if
 
  screenOffset(x,y)
 
  waitVBL
 
wend
 
 | 	  
 
 
You cannot save the map(yet), and it only supports placing a single tile type, tile index 0.  This will change soon, but I can happily say that I am able to draw tile index 0 on the map using my mouse.  This version also supports map and tileset changing.  Beware, that I did not put any checks, so you can load a negative map or tileset to crash the program.
 
 
As soon as I make it able to save back maps, auto-detect the tileset, and choose which tile to place... I'll upload a YouTube video displaying this feat. _________________ Current project:  Chronoboy Adventures
 
 
Website: http://www.chronoboy.com/ | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		chronoboy Into the past with a splash
 
 
  
  Joined: 04 Jun 2010 Posts: 162 Location: Canada
  | 
		
			
				 Posted: Mon Dec 06, 2010 3:39 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				YouTube video of the tile editor in action: http://www.youtube.com/watch?v=0eg6TeCO3nM
 
 
Latest code:
 
 	  | Code: | 	 		  
 
include "ohr.sdllib"
 
setDisplay(320*4,200*4,8,1)
 
setCaption("Vikings High-Def map")
 
enablePalette(1)
 
 
common width
 
 
sub putTile(x,y,til)
 
  tilx=0
 
  tily=0
 
  tmp=til
 
  do
 
    if tmp<16 then
 
     tilx=tmp
 
     exit do
 
    end if
 
    if tmp>15 then
 
      tily=tily+1
 
      tmp=tmp-16
 
    end if
 
  loop
 
  blt(1,tilx*20,tily*20,20,20,x*20,y*20)
 
end sub
 
 
sub savemap(map)
 
mp$=str$(map)
 
if len(mp$)=1 then
 
  mp$="0"+mp$
 
end if
 
loadBank("unlumped/viking.t"+mp$,0)
 
width=peek(0,7)
 
height=peek(0,9)
 
memCopy(1,0,0,11,(width*height)-1)
 
saveBank("unlumped/viking.t"+mp$,0)
 
freeBank(0)
 
end sub
 
 
sub loadmap(map,tset)
 
mp$=str$(map)
 
if len(mp$)=1 then
 
  mp$="0"+mp$
 
end if
 
sngrec=32*2*map+2
 
sng=deek(4,sngrec)
 
mus$="unlumped/song"+str$(sng)+".mid"
 
if fileExists(mus$) then
 
  loadMusic(mus$)
 
  playmusic(1)
 
end if
 
trec=32*2*map
 
tset=deek(4,trec)
 
loadmxs("unlumped/viking.til",tset,1)
 
loadBank("unlumped/viking.t"+mp$,0)
 
width=peek(0,7)
 
height=peek(0,9)
 
reserveBank(1,width*height)
 
memCopy(0,11,1,0,(width*height)-1)
 
screenOpen(1,width*20,height*20,0,0,320*4,200*4,0)
 
screen(1)
 
autoback(0)
 
i=0
 
for y = 0 to height-1
 
  for x = 0 to width-1
 
    til=peek(1,i)
 
    if til>159 then
 
     til=0
 
    end if
 
    putTile(x,y,til)
 
    i=i+1
 
  next
 
next
 
'grab(2,0,0,width*20,height*20)
 
'zoomImage(2,2,2)
 
'pasteIcon(0,0,2)
 
screenSwap
 
autoback(1)
 
freeBank(0)
 
end sub
 
 
function tilechooser()
 
screenOpen(2,320,200,640,400,320,200,0)
 
screenFadein(2,1,1)
 
while screenFadein(2) = 1
 
  wait (40)
 
wend
 
while mouseButton <> 1
 
  waitVBL
 
wend
 
x=mouseScreenX(2)
 
y=mouseScreenY(2)
 
x=int(x/20)
 
y=int(y/20)
 
til=(16*y)+x
 
screenClose(2)
 
return til
 
end function
 
 
loadBank("unlumped/binsize.bin",0)
 
maprec=deek(0,4)
 
print maprec
 
freeBank(0)
 
loadBank("unlumped/viking.map",4)
 
 
loadpal("unlumped")
 
map=0
 
tset=0
 
loadmap(map,tset)
 
x=0
 
y=0
 
til=0
 
while not key(k_esc)
 
  if key(k_up) then
 
    y=y-20
 
  end if
 
  if key(k_down) then
 
    y=y+20
 
  end if
 
  if key(k_left) then
 
    x=x-20
 
  end if
 
  if key(k_right) then
 
    x=x+20
 
  end if
 
  if key(k_comma) then
 
    savemap(map)
 
    map=map-1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_period) then
 
    savemap(map)
 
    map=map+1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_leftbracket) then
 
    tset=tset-1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if key(k_rightbracket) then
 
    tset=tset+1
 
    screenClose(1)
 
    loadmap(map,tset)
 
  end if
 
  if mouseButton = 1 then
 
    x=mouseScreenX(1)
 
    y=mouseScreenY(1)
 
    x=int(x/20)
 
    y=int(y/20)
 
    putTile(x,y,til)
 
    l=(width*y)+x
 
    poke(1,l,til)
 
  end if
 
  if mouseButton = 2 then
 
    x=mouseScreenX(1)
 
    y=mouseScreenY(1)
 
    x=int(x/10)
 
    y=int(y/10)
 
  end if
 
  if mouseButton = 3 then
 
    til=tilechooser
 
    screen(1)
 
  end if
 
  screenOffset(x,y)
 
  waitVBL
 
wend
 
savemap(map)
 
freeBank(1)
 
 | 	 
  _________________ Current project:  Chronoboy Adventures
 
 
Website: http://www.chronoboy.com/ | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
You can post new topics in this forum You can reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
  | 
   
 
  
Powered by phpBB © 2001, 2005 phpBB Group
 
  
		 |