One problem with Magic World is that it only works with DBC (but with some tweaking it'll work in DBPro, I included my modified loader below).
rem * Title : Load World function
rem * Author : Robin King
FUNCTION MagicLoadPro(terrain$,firstimage,firstmatrix,firstobject)
path$=GET DIR$()
if RIGHT$(terrain$,5)<>".mwdb" AND RIGHT$(terrain$,5)<>".mwpr"
if FILE EXIST(terrain$+".mwpr")
terrain$=terrain$+".mwpr"
ELSE
terrain$=terrain$+".mwdb"
endif
endif
if FILE EXIST(terrain$)
`get rid of previous matrices, objects, lights,
`images and objects before calling the function
OPEN TO READ 1,terrain$
`number of matrices
READ WORD 1,mat
`number of texture images
READ WORD 1,textures
`texture filenames
for a=firstimage TO (firstimage+textures)-1
READ STRING 1,tex$
READ STRING 1,tex2$
if PATH EXIST(tex2$)=0 THEN tex2$=path$
if FILE EXIST(tex2$+"\"+tex$)
CD tex2$
LOAD IMAGE tex$,a
ELSE
GET IMAGE a,0,0,16,16
endif
next a
CD path$
`for each matrix, twelve dimensions
for a=firstmatrix TO (firstmatrix+mat)-1
READ WORD 1,m1
READ WORD 1,m2
READ WORD 1,m3
READ WORD 1,m4
READ BYTE 1,sgn
READ WORD 1,m5
if sgn=1 THEN m5=0-m5
READ BYTE 1,sgn
READ WORD 1,m6
if sgn=1 THEN m6=0-m6
READ WORD 1,m7
READ WORD 1,m8
READ WORD 1,m9
READ BYTE 1,m10
READ BYTE 1,m11
READ BYTE 1,m12
`create each matrix not filtered out
if MATRIX EXIST(a) THEN DELETE MATRIX a
MAKE MATRIX a,m1,m2,m3,m4
POSITION MATRIX a,m5,0,m6
if m9>0 THEN PREPARE MATRIX TEXTURE a,(m9-101)+firstimage,m7,m8
`for each grid point in each matrix, a height and tile number
for b=0 TO m3
for c=0 TO m4
READ FLOAT 1,height#
SET MATRIX HEIGHT a,b,c,height#
if b<m3 AND c<m4
READ WORD 1,tile
if m9>0 THEN SET MATRIX TILE a,b,c,tile
endif
next c
next b
UPDATE MATRIX a
for c=0 TO m4
for b=0 TO m3
`no normals
if m12=0
SET MATRIX NORMAL a,b,c,0,1,0
endif
`floor or roof normals
if m12>0
`Get matrix heights
h#=GET MATRIX HEIGHT(a,b,c)
h2#=GET MATRIX HEIGHT(a,b,c)
if c=0 THEN h8#=GET MATRIX HEIGHT(a,b,c+1) ELSE h8#=GET MATRIX HEIGHT(a,b,c-1)
if b=0 THEN h4#=GET MATRIX HEIGHT(a,b+1,c) ELSE h4#=GET MATRIX HEIGHT(a,b-1,c)
`Calculate projected angle X using heights
x1#=(b-1)*25.0 : y1#=h#
x2#=(b+0)*25.0 : y2#=h4#
dx#=x2#-x1#
dy#=y2#-y1#
ax#=ATANFULL(dx#,dy#)
ax#=WRAPVALUE(90-ax#)
`Calculate projected angle Z using heights
z1#=(c-1)*25.0 : y1#=h2#
z2#=(c+0)*25.0 : y2#=h8#
dz#=z2#-z1#
dy#=y2#-y1#
az#=ATANFULL(dz#,dy#)
az#=WRAPVALUE(90-az#)
`Make normal from projected angle
if b=0 THEN nx#=SIN(0-ax#) ELSE nx#=SIN(ax#)
ny#=COS(ax#)
if c=0 THEN nz#=SIN(0-az#) ELSE nz#=SIN(az#)
`Setting matrix normal for smoothness
if m12=1
SET MATRIX NORMAL a,b,c,nx#,ny#,nz#
endif
if m12=2
SET MATRIX NORMAL a,b,c,0-nx#,0-ny#,0-nz#
endif
endif
next b
next c
UPDATE MATRIX a
if m10=1 THEN SET MATRIX WIREFRAME OFF a ELSE SET MATRIX WIREFRAME ON a
if m11=1 THEN GHOST MATRIX OFF a ELSE GHOST MATRIX ON a
next a
`OBJECTS
READ WORD 1,numobj
for a=firstobject TO (firstobject+numobj)-1
if OBJECT EXIST(a) THEN DELETE OBJECT a
READ BYTE 1,OBJECT
READ STRING 1,OBJFILE$
READ STRING 1,OBJFILE2$
READ FLOAT 1,ox#
READ FLOAT 1,oy#
READ FLOAT 1,oz#
READ FLOAT 1,oxa#
READ FLOAT 1,oya#
READ FLOAT 1,oza#
if OBJECT=1 THEN MAKE OBJECT CUBE a,100
if OBJECT=2 THEN MAKE OBJECT SPHERE a,100
if OBJECT=3 THEN MAKE OBJECT CYLINDER a,100
if OBJECT=4 THEN MAKE OBJECT CONE a,100
if OBJECT=5 THEN MAKE OBJECT PLAIN a,100,100
if OBJECT=6
if PATH EXIST(objfile2$)=0 THEN objfile2$=PATH$
if FILE EXIST(objfile$) THEN objfile2$=PATH$
if FILE EXIST(objfile2$+"\"+objfile$)
CD objfile2$
LOAD OBJECT OBJFILE$,a
ELSE
```substitute a cube!!!
MAKE OBJECT CUBE a,100
endif
CD PATH$
endif
POSITION OBJECT a,ox#,oy#,oz#
ROTATE OBJECT a,oxa#,oya#,oza#
READ FLOAT 1,scx#
READ FLOAT 1,scy#
READ FLOAT 1,scz#
SCALE OBJECT a,scx#,scy#,scz#
`object texture or color
READ BYTE 1,red
READ BYTE 1,green
READ BYTE 1,blue
READ BYTE 1,op1
READ BYTE 1,op2
READ BYTE 1,op3
READ BYTE 1,op4
READ BYTE 1,op5
READ BYTE 1,op6
READ BYTE 1,op7
READ BYTE 1,op8
READ WORD 1,objtex
for b=1 TO 4
READ FLOAT 1,redundant#
next b
if op1=0 THEN GHOST OBJECT ON a ELSE GHOST OBJECT OFF a
SET OBJECT a,op2,op3,op4,op5,op6,op7,op8
if OBJTEX=0
COLOR OBJECT a,RGB(red,green,blue)
endif
if OBJTEX>100
TEXTURE OBJECT a,(objtex-101)+firstimage
endif
READ BYTE 1,OBJHISTCOUNT
for b=1 TO OBJHISTCOUNT
READ FLOAT 1,objhist#
READ FLOAT 1,objhistU#
READ FLOAT 1,objhistV#
if objhist#=1.0
SCROLL OBJECT TEXTURE a,objhistU#,objhistV#
ELSE
SCALE OBJECT TEXTURE a,objhistU#,objhistV#
endif
next b
next a
`STATIC OBJECTS aren't used in DBPro, this area skips them.
static=firstobject+numobj
READ WORD 1,numstat
for a=1 TO numstat
READ BYTE 1,STATOBJ
READ STRING 1,STATFILE$
READ STRING 1,STATFILE2$
READ FLOAT 1,sx#
READ FLOAT 1,sy#
READ FLOAT 1,sz#
READ FLOAT 1,asx#
READ FLOAT 1,asy#
READ FLOAT 1,asz#
READ FLOAT 1,sxsc#
READ FLOAT 1,sysc#
READ FLOAT 1,szsc#
READ BYTE 1,sred
READ BYTE 1,sgreen
READ BYTE 1,sblue
READ WORD 1,stattex
READ BYTE 1,stathistcount
for b=1 TO stathistcount
READ FLOAT 1,stathist#
READ FLOAT 1,stathistU#
READ FLOAT 1,stathistV#
next b
next a
`LIGHTS
READ WORD 1,numlight
for a=0 TO numlight-1
READ BYTE 1,light
READ BYTE 1,showhide
READ FLOAT 1,lightposX#
READ FLOAT 1,lightposY#
READ FLOAT 1,lightposZ#
READ FLOAT 1,lightposAX#
READ FLOAT 1,lightposAY#
READ FLOAT 1,lightposAZ#
READ FLOAT 1,lightposI#
READ FLOAT 1,lightposO#
READ BYTE 1,lred
READ BYTE 1,lgreen
READ BYTE 1,lblue
`make the light
if a>0 THEN MAKE LIGHT a ELSE SHOW LIGHT 0
if light=1
SET POINT LIGHT a,lightposX#,lightposY#,lightposZ#
endif
if light=2
SET SPOT LIGHT a,lightposI#,lightposO#
POSITION LIGHT a,lightposX#,lightposY#,lightposZ#
ROTATE LIGHT a,lightposAX#,lightposAY#,lightposAZ#
endif
if light=3
dix#=NEWXVALUE(0,lightposAY#,100)*COS(lightposAX#)
diy#=NEWYVALUE(0,lightposAX#,100)
diz#=NEWZVALUE(0,lightposAY#,100)*COS(lightposAX#)
SET DIRECTIONAL LIGHT a,dix#,diy#,diz#
endif
`color
COLOR LIGHT a,lred,lgreen,lblue
next a
`camera details
READ FLOAT 1,CAMX#
READ FLOAT 1,CAMY#
READ FLOAT 1,CAMZ#
READ FLOAT 1,CAMDX#
READ FLOAT 1,CAMDY#
READ FLOAT 1,CAMDZ#
POSITION CAMERA CAMX#,CAMY#,CAMZ#
ROTATE CAMERA WRAPVALUE(CAMDX#),WRAPVALUE(CAMDY#),WRAPVALUE(CAMDZ#)
`redundant
READ BYTE 1,WIRE
`fog and backdrop
READ BYTE 1,fog
if fog=1 THEN FOG ON ELSE FOG OFF
READ FLOAT 1,fogdist#
FOG DISTANCE fogdist#
READ BYTE 1,fred
READ BYTE 1,fgreen
READ BYTE 1,fblue
FOG COLOR RGB(fred,fgreen,fblue)
READ WORD 1,back
READ BYTE 1,backX
READ BYTE 1,backY
READ BYTE 1,bred
READ BYTE 1,bgreen
READ BYTE 1,bblue
if back=0
COLOR BACKDROP RGB(bred,bgreen,bblue)
ELSE
`backdrop texture
TEXTURE BACKDROP (back-101)+firstimage
SCROLL BACKDROP backX,backY
endif
READ BYTE 1,ambient
SET AMBIENT LIGHT AMBIENT
`redundant
READ BYTE 1,seas
READ FLOAT 1,world#
CLOSE FILE 1
endif
ENDFUNCTION
Hope I helped! ~Underhill
"You don't need a reason to help people."-Zidane (FFIX)
Jade Phoenix Software is on the way! Get ready for the rebirth of gaming!