Ok folks,
here's my effort.
It's now got some functionality.
Rem Project: 007Terrain
Rem Created: 23/05/2006 01:02:57
Rem ***** Main Source File *****
rem **************************************************
Gosub INIT_VariablesAndDatastructures
InitDisplay()
CreateMain()
CreateButtons()
CreateBrushTexture()
DefaultTerrain()
rem **************************************************
rem **************************************************
rem **************************************************
set current bitmap 0
do
rem **************************************************
rem Refresh main GUI to enable menu change
rem **************************************************
paste image 1,0,0,1
rem **************************************************
rem Check for new action
rem **************************************************
MseBtn = mouseclick()
if mousex() >= 24 and mousex() <=1000 and mousey() >= 24 and mousey() <=640
rem Actions when mouse in viewport
select OD(0).MainAction
case 1
MoveCamera( MseBtn )
endcase
case 2
if controlkey() then MoveCamera( MseBtn )
CalcBrushCentrePoint()
CalcBrushPosition()
if MseBtn
if not controlkey() then RaiseLower( MseBtn )
endif
endcase
endselect
else
rem Check for a menu button press
if MseBtn
Button = CheckMainButtons()
if Button <> -1
Buttons(Button).State = 1
ClearButtonGroup( "MAIN", Button )
OD(0).Menu = Buttons(Button).Action
OD(0).Group = Buttons(Button).Title
else
if OD(0).Menu <> -1
Button = CheckSubButtons( OD(0).Group )
if Button <> - 1
rem **************************************************
rem Instigate a repeat delay
rem **************************************************
if OD(0).LastButton = Button
Buttons(Button).State = 1
OD(0).Action = Buttons(Button).Action
if OD(0).RepeatCount = -1
OD(0).RepeatCount = 1
else
inc OD(0).RepeatCount
if OD(0).RepeatCount >= OD(0).RepeatDelay
OD(0).RepeatCount = 0
OD(0).RepeatDelay = 10
endif
endif
else
if OD(0).RepeatCount = -1
Buttons(Button).State = 1
OD(0).Action = Buttons(Button).Action
OD(0).LastButton = Button
endif
endif
endif
endif
endif
else
OD(0).Action = -1
OD(0).RepeatCount = -1
OD(0).LastButton = -1
OD(0).RepeatDelay = 100
endif
endif
rem **************************************************
rem Display menu's and buttons in current state
rem **************************************************
ShowButtons( "MAIN" )
if OD(0).Menu <> -1
DisplaySubMenu()
endif
rem **************************************************
rem Perform current action if any
rem **************************************************
if OD(0).Action <> -1
PerformCurrentAction()
endif
rem **************************************************
rem **************************************************
sync
loop
rem **************************************************
rem **************************************************
rem **************************************************
function RaiseLower( UpDown )
Adjust# = BD(0).Magnitude / 10.0
if UpDown = 2 then Adjust# = Adjust# * -1
off# = TD(0).SegSize / -2
boffx# = (BD(0).Width * off# ) + off#
boffz# = (BD(0).Length * off# ) + off#
if IsEven( BD(0).Width ) then boffx# = boffx# + off#
if IsEven( BD(0).Length ) then boffz# = boffz# + off#
obj = 10
lock vertexdata for limb 1,0,2
for z = 1 to BD(0).Length
for x = 1 to BD(0).Width
if object exist(obj) then delete object obj
mrkx# = BD(0).Xpos + boffx# + ( x * TD(0).SegSize )
mrkz# = BD(0).Zpos + boffz# + ( z * TD(0).SegSize )
vert_x = int(mrkx# - ( TD(0).Segments * off# ) ) / TD(0).SegSize
vert_z = int(mrkz# - ( TD(0).Segments * off# ) ) / TD(0).SegSize
TWidth_Offset = ( TD(0).Segments * 6 )
if vert_x >= 0 and vert_x < TD(0).Segments and vert_z >=0 and vert_z < TD(0).Segments
rem 1st vertex
prime_index = ( vert_x * 6 ) + ( vert_z * TWidth_Offset )
ChangeVertexHeight( prime_index, Adjust# )
if vert_x > 0
rem 2nd vertex
vert_index = prime_index - 1
if vert_index >=0 then ChangeVertexHeight( vert_index, Adjust# )
rem 3rd vertex
vert_index = prime_index - 4
if vert_index >=0 then ChangeVertexHeight( vert_index, Adjust# )
endif
if vert_z > 0
rem 4th vertex
vert_index = prime_index - ( TWidth_Offset + 2 )
if vert_index >=0 then ChangeVertexHeight( vert_index, Adjust# )
rem 5th vertex
vert_index = prime_index - ( TWidth_Offset - 1 )
if vert_index >=0 then ChangeVertexHeight( vert_index, Adjust# )
rem 6th vertex
vert_index = prime_index - ( TWidth_Offset - 3 )
if vert_index >=0 then ChangeVertexHeight( vert_index, Adjust# )
endif
clone object obj, 3
position object obj, mrkx#,0,mrkz#
endif
inc obj
next x
next z
unlock vertexdata
endfunction
function ChangeVertexHeight( vert_index, Adjust# )
vx# = get vertexdata position x( vert_index )
vy# = get vertexdata position y( vert_index )
vz# = get vertexdata position z( vert_index )
set vertexdata position vert_index, vx#, vy# + Adjust#, vz#
endfunction
function CircleFill( cx,cy,rad )
radsq = rad^2
for x = 0 to rad
y = sqrt( radsq - ( x^2 ) )
line cx+x, cy+y, cx+x, cy-1-y
line cx-1-x, cy+y, cx-1-x, cy-1-y
next x
endfunction
function IsEven( CheckNum# )
if CheckNum# / 2 = Int(CheckNum# / 2)
Result = 1
else
Result = 0
endif
endfunction Result
function CalcBrushPosition()
off# = TD(0).SegSize / -2
boffx# = BD(0).Width * off#
boffz# = BD(0).Length * off#
if IsEven( BD(0).Width ) then boffx# = boffx# + off#
if IsEven( BD(0).Length ) then boffz# = boffz# + off#
msecntrx# = object screen x(3)
msecntry# = object screen y(3)
msedx# = mousex()-msecntrx#
msedy# = msecntry# - mousey()
Ypos# = camera position y()
msed# = sqrt( ( msedx#^2 ) + (msedy#^2) )
hma# = atanfull( msedx#, msedy# )
hma#=wrapvalue(hma#+camera angle y())
hmx# = newxvalue( BD(0).CentreX, hma#, msed# )
hmz# = newzvalue( BD(0).CentreZ, hma#, msed# )
BD(0).Xpos = int( hmx# / TD(0).SegSize ) * TD(0).SegSize
BD(0).Zpos = int( hmz# / TD(0).SegSize ) * TD(0).SegSize
position object 2, BD(0).Xpos + boffx#, 1, BD(0).Zpos + boffz#
endfunction
function CalcBrushCentrePoint()
cya# = camera angle y()
cxa# = wrapvalue(camera angle x())
cht# = camera position y()
if cxa# = 90 or cxa#=270
zd#=0
else
zd# = cht# / tan( cxa# )
endif
hmcx# = newxvalue( camera position x(), cya#, zd# )
hmcz# = newzvalue( camera position z(), cya#, zd# )
BD(0).CentreX = int( hmcx# / TD(0).SegSize ) * TD(0).SegSize
BD(0).CentreZ = int( hmcz# / TD(0).SegSize ) * TD(0).SegSize
position object 3,BD(0).CentreX, 0, BD(0).CentreZ
endfunction
function MoveCamera( MoveType )
Xpos# = camera position x()
Ypos# = camera position y()
Zpos# = camera position z()
Xang# = camera angle x()
Yang# = camera angle y()
Zang# = camera angle z()
XSpeed# = mousemovex()
YSpeed# = mousemovez() / - 10.0
ZSpeed# = mousemovey()
rem Also need zoom keys incase no mouse wheel
if YSpeed# = 0
YSpeed# = ( keystate(31) - keystate(17) )
YSpeed#=YSpeed# / 5.0
endif
SpeedScale# = ( Ypos# / 100 )
if SpeedScale# > 1.0 then SpeedScale# = 1.0
if SpeedScale# < 0.05 then SpeedScale# = 0.05
select MoveType
case 1
XSpeed# = XSpeed# * SpeedScale#
ZSpeed# = ZSpeed# * SpeedScale#
Xpos# = newxvalue( Xpos#, Yang#, ZSpeed# )
Zpos# = newzvalue( Zpos#, Yang#, ZSpeed# )
Xpos# = newxvalue( Xpos#, wrapvalue( Yang# + 90 ), -XSpeed# )
Zpos# = newzvalue( Zpos#, wrapvalue( Yang# + 90 ), -XSpeed# )
endcase
case 2
inc YAng#, XSpeed#
inc Xang#, ZSpeed#
if wrapvalue(XAng#) >85 then XAng# = 85
if wrapvalue(XAng#) <10 then XAng# = 10
endcase
endselect
if YSpeed# <0 then YSpeed# = YSpeed# * SpeedScale#
Ypos# = Ypos# + YSpeed#
position camera Xpos#, Ypos#, Zpos#
rotate camera XAng#, YAng#, ZAng#
endfunction
function DefaultTerrain()
TD(0).Name = "Default"
TD(0).Segments = 50
TD(0).SegSize = 10
TD(0).Saved = 0
CreateTerrain()
BD(0).Width = 1
BD(0).Length = 1
BD(0).Magnitude = 1
OD(0).Menu = 4
OD(0).MainAction = 1
endfunction
function CreateBrush( Shape )
w# = BD(0).Width * TD(0).SegSize
l# = BD(0).Length * TD(0).SegSize
wseg = BD(0).Width * 2
lseg = BD(0).Length * 2
so# = TD(0).SegSize / -2
if object exist(2) then delete object 2
CreateFlatMesh( wseg, lseg, (TD(0).SegSize / 2) )
make object 2, 1, 0
delete mesh 1
set object texture 2,0,8
texture object 2,Shape
ghost object on 2
fade object 2, 50
rem set object texture 2,0,4
rem scale object texture 2,.5,.5
Position object 2, so#,1,so#
rem if matrix exist(2) then delete matrix 2
rem make matrix 2, w#, l#, wseg, lseg
rem ghost matrix on 2
rem prepare matrix texture 2,100,2,1
rem fill matrix 2,0,2
rem position matrix 2, so#,1,so#
endfunction
function CreateBrushTexture()
create bitmap 2,256,256
ink rgb(200,200,255),rgb(200,200,255)
box 0,0,256,256
get image 2,0,0,256,256,1
cls 0
CircleFill( 128,128,127 )
get image 3,0,0,256,256,1
endfunction
function CreateTerrain()
TSize = TD(0).Segments*TD(0).SegSize
offset# = TSize / -2
if object exist(1) then delete object 1
CreateFlatMesh( TD(0).Segments, TD(0).Segments, TD(0).SegSize )
make object 1, 1, 0
delete mesh 1
set object wireframe 1,1
set object cull 1,1
position object 1, offset#,0,offset#
position camera 0,100,0
xrotate camera 10
endfunction
function WriteVertexToMemblock( Memblock, PTR, X#, Y#, Z#, NX#, NY#, NZ#, COL, U#, V# )
Rem Vertex Xpos
write memblock float Memblock, PTR, X#
inc PTR,4
Rem Vertex Ypos
write memblock float Memblock, PTR, Y#
inc PTR,4
Rem Vertex Zpos
write memblock float Memblock, PTR, Z#
inc PTR,4
rem Vertex Normal X
write memblock float Memblock, PTR, NX#
inc PTR,4
rem Vertex Normal Y
write memblock float Memblock, PTR, NY#
inc PTR,4
rem Vertex Normal Z
write memblock float Memblock, PTR, NZ#
inc PTR,4
rem Vertex Colour
write memblock dword Memblock, PTR, COL
inc PTR,4
rem Vertex Texture U Co-ord
write memblock float Memblock, PTR, U#
inc PTR,4
rem Vertex Texture V Co-ord
write memblock float Memblock, PTR, V#
inc PTR,4
endfunction PTR
function CreateFlatMesh( Segx#, Segz#, SegSize# )
Memblock=1
VertexCount = (Segx#*Segz#)*6
make memblock Memblock, (VertexCount * 36) + 12
write memblock dword Memblock, 0, 338
write memblock dword Memblock, 4, 36
write memblock dword Memblock, 8, VertexCount
PTR=12
for z = 0 to Segz#-1
for x = 0 to Segx#-1
x#=x
z#=z
lft# = x#*SegSize#
rgt# = (x#+1)*SegSize#
btm# = z#*SegSize#
top# = (z#+1)*SegSize#
lftU# = x# / Segx#
rgtU# = (x#+1) / Segx#
btmV# = z# / Segz#
topV# = (z#+1) / Segz#
col = rgb(rnd(50),rnd(100)+60,rnd(50))
rem First triangle
PTR = WriteVertexToMemblock( Memblock, PTR, lft#, 0, btm#, 0, 1, 0, col , lftU#, btmV# )
PTR = WriteVertexToMemblock( Memblock, PTR, lft#, 0, top#, 0, 1, 0, col, lftU#, topV# )
PTR = WriteVertexToMemblock( Memblock, PTR, rgt#, 0, btm#, 0, 1, 0, col, rgtU#, btmV# )
rem Second Triangle
PTR = WriteVertexToMemblock( Memblock, PTR, lft#, 0, top#, 0, 1, 0, col, lftU#, topV# )
PTR = WriteVertexToMemblock( Memblock, PTR, rgt#, 0, top#, 0, 1, 0, col, rgtU#, topV# )
PTR = WriteVertexToMemblock( Memblock, PTR, rgt#, 0, btm#, 0, 1, 0, col, rgtU#, btmV# )
next x
next z
make mesh from memblock 1, 1
delete memblock 1
endfunction
function CreateButtons()
sync
restore ButtonData
for l = 0 to ButtonCount(0)
read Buttons( l ).Group
read Buttons( l ).SubGroup
read Buttons( l ).Title
read Buttons( l ).Action
read Buttons( l ).Xpos
read Buttons( l ).Ypos
read Buttons( l ).Width
read Buttons( l ).Height
Buttons( l ).State = -1
if bitmap exist(2) = 1
delete bitmap 2
endif
create bitmap 2, Buttons( l ).Width, Buttons( l ).Height
Buttons( l ).UpImage = CreateButton( l, (l*2)+4, 0, rgb( 100,50,50), rgb(255,255,0) )
Buttons( l ).DnImage = CreateButton( l, (l*2)+5, 1, rgb( 100,50,50), rgb(255,255,0) )
delete bitmap 2
next l
endfunction
function CreateButton( BI, ImageNum, State, BackColour, TextColour )
cls BackColour
set text font "Arial"
set text to bold
set text size 14
x = ( Buttons( BI ).Width / 2 )
y = ( Buttons( BI ).Height / 2 ) - 7
Width = Buttons( BI ).Width
Height = Buttons( BI ).Height
ink 0,0
center text x, y, Buttons( BI ).Title
blur bitmap 2,6
if state = 0
ink rgb(255,255,255),0
else
ink 0,0
endif
line 1,1,1,Height-1
line 1,1,Width-1,1
if state = 0
ink 0,0
else
ink rgb(255,255,255),0
endif
line Width-3,Height-3,Width-3,1
line Width-3,Height-3,1,Height-3
ink rgb(1,1,1),0
center text x, y, Buttons( BI ).Title
blur bitmap 2,6
line 0,0,Width,0
line 0,0,0,Height
line 0,Height,Width,Height
line Width,Height,Width,0
ink TextColour,0
center text x, y, Buttons( BI ).Title
get image ImageNum, 0, 0, Width, Height
endfunction ImageNum
function CheckMainButtons()
ButtonPressed = -1
for l = 0 to 2
xmin = Buttons( l ).Xpos
ymin = Buttons( l ).Ypos
xmax = xmin + Buttons( l ).Width
ymax = ymin + Buttons( l ).Height
if mousex() >= xmin and mousex() <= xmax and mousey() >= ymin and mousey() <= ymax
ButtonPressed = l
endif
next l
endfunction ButtonPressed
function CheckSubButtons( Group$ )
ButtonPressed = -1
for l = 3 to ButtonCount(0)
if Buttons(l).Group = Group$
xmin = Buttons( l ).Xpos
ymin = Buttons( l ).Ypos
xmax = xmin + Buttons( l ).Width
ymax = ymin + Buttons( l ).Height
if mousex() >= xmin and mousex() <= xmax and mousey() >= ymin and mousey() <= ymax
ButtonPressed = l
endif
endif
next l
endfunction ButtonPressed
function ClearButtonGroup( Group$, Selected )
for l = 0 to ButtonCount(0)
if Buttons(l).Group = Group$
if l <> Selected then Buttons(l).State = -1
endif
next l
endfunction
function ClearButtonSubGroup( SubGroup$, Selected )
for l = 0 to ButtonCount(0)
if Buttons(l).SubGroup = SubGroup$
if l <> Selected then Buttons(l).State = -1
endif
next l
endfunction
function ShowButtons( Group$ )
for l = 0 to ButtonCount(0)
if Buttons( l ).Group = Group$
if Buttons( l ).State = 1
img = Buttons( l ).DnImage
else
img = Buttons( l ).UpImage
endif
paste image img, Buttons( l ).Xpos, Buttons( l ).Ypos
endif
next l
endfunction
function InitDisplay()
set display mode 1024,768,32
autocam off
sync on
sync rate 0
set camera view 24,24,1000,640
set ambient light 15
fog on
fog color 100,100,200
fog distance 2000
backdrop on
color backdrop rgb(100,100,125)
endfunction
function CreateMain()
create bitmap 1,1024,768
cls rgb(100,100,100)
ink rgb(1,1,1),0
box 3,3,1021,765
ink rgb(100,150,100),0
box 4,4,1020,764
rem Viewport
ink rgb(1,1,1),0
box 22,22,1002,642
ink 0,0
box 24,24,1000,640
rem sub action panel
ink rgb(1,1,1),0
box 254,654,1002,746
ink rgb(90,110,90),0
box 256,656,1000,744
get image 1,0,0,1024,768
delete bitmap 1
endfunction
function DisplaySubMenu()
ink rgb(10,40,10),0
select OD(0).Menu
rem File Menu
case 1
if object exist(2) then delete object 2
text 270,666, "Filename"
text 340,666, ": " + TD(0).Name
text 270,692, "Segments"
text 340,692, ": " + str$( TD(0).Segments )
text 270,718, "Seg Size"
text 340,718, ": " + str$( TD(0).SegSize )
OD(0).MainAction = 1
endcase
rem Mold Menu
case 2
text 270,666, "Brush Width"
text 360,666, ": " + str$( BD(0).Width )
text 270,692, "Brush Length"
text 360,692, ": " + str$( BD(0).Length )
text 270,718, "Magnitude"
text 360,718, ": " + str$( BD(0).Magnitude )
if OD(0).MainAction <>2
if Buttons(12).State = 1 then BD(0).MBShape = 2
if Buttons(13).State = 1 then BD(0).MBShape = 3
if BD(0).MBShape = 0
Buttons(12).State = 1
BD(0).MBShape = 2
endif
if object exist(3) then delete object 3
make object sphere 3,2
color object 3, rgb(255,0,0)
CreateBrush( BD(0).MBShape )
CalcBrushCentrePoint()
CalcBrushPosition()
OD(0).MainAction = 2
endif
endcase
rem Paint Menu
case 3
text 270,666, "Brush Width"
text 360,666, ": " + str$( BD(0).Width )
text 270,692, "Brush Length"
text 360,692, ": " + str$( BD(0).Length )
text 270,718, "Magnitude"
text 360,718, ": " + str$( BD(0).Magnitude )
OD(0).MainAction = 3
endcase
case 4
text 270,660, "Welcome to the 007 Terrain Editor by McLaine."
text 270,676, "In 'FILE' mode, move and turn by clicking and dragging in the viewport. 'W' & 'S' or mousewheel to zoom."
text 270,692, "In 'MOLD' mode, Left Click in viewport to raise ground. Right Click to lower ground."
text 270,708, "In 'MOLD' mode, hold control to allow camera movement as in 'FILE' mode."
text 270,724, "There are some bugs, most notably 'NORM' and 'SMOOTH'. They work but are slow and unpredictable."
endcase
endselect
ShowButtons( OD(0).Group )
endfunction
function PerformCurrentAction()
select OD(0).Menu
case 1
FileAction()
endcase
case 2
MoldAction()
endcase
case 3
PaintAction()
endcase
endselect
endfunction
function FileAction()
if OD(0).RepeatCount <= 0
select OD(0).Action
rem Load Terrain
case 1
set cursor 550,666
input "Load file: ", fn$
endcase
rem Save Terrain
case 2
set cursor 550,666
input "Save as: ", fn$
endcase
rem New Terrain
case 3
set cursor 550,666
input "New filename: ", TD(0).Name
set cursor 550,692
input "Segments: ", TD(0).Segments
set cursor 550,718
input "Segment Size: ", TD(0).SegSize
CreateTerrain()
endcase
endselect
endif
ClearButtonGroup( "FILE", -1 )
OD(0).Action = -1
endfunction
function MoldAction()
if OD(0).Action >=1 and OD(0).Action <=6
if OD(0).RepeatCount <=0
ChangeBrushSize()
CreateBrush( BD(0).MBShape )
endif
ClearButtonSubGroup( "MBSIZE", -1 )
endif
if OD(0).Action = 7 or OD(0).Action = 8
if OD(0).RepeatCount <=0
ChangeBrushShape()
CreateBrush( BD(0).MBShape )
endif
ClearButtonSubGroup( "MBSHAPE", OD(0).LastButton )
endif
if OD(0).Action >= 9 and OD(0).Action <=12
ClearButtonSubGroup( "MBTYPE1", OD(0).LastButton )
endif
if OD(0).Action = 13
if OD(0).RepeatCount <=0
if TD(0).Solid = 0
TD(0).Solid = 1
set object wireframe 1, 0
else
TD(0).Solid = 0
set object wireframe 1, 1
endif
else
rem No Repeat
OD(0).RepeatCount = 1
endif
if TD(0).Solid = 0 then ClearButtonSubGroup( "TTYPE", -1 )
endif
if OD(0).Action >= 13 and OD(0).Action <=15
if OD(0).RepeatCount <=0
select OD(0).Action
case 14
lock vertexdata for limb 1,0
set object normals 1
unlock vertexdata
endcase
case 15
set object smoothing 1, 50
endcase
endselect
else
rem No Repeat
OD(0).RepeatCount = 1
endif
ClearButtonSubGroup( "TEROP", -1 )
endif
OD(0).Action = -1
endfunction
function PaintAction()
endfunction
function ChangeBrushShape()
select OD(0).Action
case 7
BD(0).MBShape = 2
endcase
case 8
BD(0).MBShape = 3
endcase
endselect
endfunction
function ChangeBrushSize()
select OD(0).Action
rem Decrease Brush Width
case 1
if BD(0).Width > 1 then dec BD(0).Width
endcase
rem Increase Brush Width
case 2
if BD(0).Width < TD(0).Segments then inc BD(0).Width
endcase
rem Decrease Brush Length
case 3
if BD(0).Length > 1 then dec BD(0).Length
endcase
rem Increase Brush Length
case 4
if BD(0).Length < TD(0).Segments then inc BD(0).Length
endcase
rem Decrease Brush Magnitude
case 5
if BD(0).Magnitude > 1 then dec BD(0).Magnitude
endcase
rem Increase Brush Magnitude
case 6
if BD(0).Magnitude < 100 then inc BD(0).Magnitude
endcase
endselect
endfunction
rem **************************************************
INIT_VariablesAndDatastructures:
type Camera
XPos# as float
YPos# as float
ZPos# as float
XAng# as float
YAng# as float
ZAng# as float
Pitch# as float
Yaw# as float
Roll# as float
Slide# as float
Speed# as float
endtype
type Button
Group as string
SubGroup as string
Title as string
Action as integer
Xpos as integer
Ypos as integer
Width as integer
Height as integer
State as integer
UpImage as integer
DnImage as integer
endtype
type Terrain
Name as String
Segments as integer
SegSize as float
Saved as integer
Solid as integer
endtype
type Operation
Menu as integer
Group as string
MainAction as integer
Action as integer
LastButton as integer
RepeatCount as integer
RepeatDelay as integer
endtype
type Brush
Width as integer
Length as integer
Magnitude as integer
MBShape as integer
CentreX as float
CentreZ as float
Xpos as float
Zpos as float
endtype
dim PD(0) as Camera
dim TD(0) as Terrain
dim OD(0) as Operation
dim BD(0) as Brush
dim ButtonCount(0) as integer
ButtonCount(0)= 22
dim Buttons( ButtonCount(0) ) as Button
return
rem **************************************************
ButtonData:
data "MAIN", "MAIN", "FILE", 1, 28, 656, 64, 24
data "MAIN", "MAIN", "MOLD", 2, 102, 656, 64, 24
data "MAIN", "MAIN", "PAINT", 3, 176, 656, 64, 24
data "FILE", "FILE", "LOAD", 1, 450, 660, 64, 24
data "FILE", "FILE", "SAVE", 2, 450, 688, 64, 24
data "FILE", "FILE", "NEW", 3, 450, 716, 64, 24
data "MOLD", "MBSIZE", "-", 1, 400, 660, 24, 24
data "MOLD", "MBSIZE", "+", 2, 430, 660, 24, 24
data "MOLD", "MBSIZE", "-", 3, 400, 688, 24, 24
data "MOLD", "MBSIZE", "+", 4, 430, 688, 24, 24
data "MOLD", "MBSIZE", "-", 5, 400, 716, 24, 24
data "MOLD", "MBSIZE", "+", 6, 430, 716, 24, 24
data "MOLD", "MBSHAPE", "SQUARE", 7, 500, 660, 64, 24
data "MOLD", "MBSHAPE", "ROUND", 8, 500, 688, 64, 24
data "MOLD", "MBTYPE1", "HILL", 9, 600, 674, 64, 24
data "MOLD", "MBTYPE1", "MOUND", 10, 600, 702, 64, 24
data "MOLD", "MBTYPE1", "PLATEAU", 11, 670, 674, 64, 24
data "MOLD", "MBTYPE1", "PEAK", 12, 670, 702, 64, 24
data "MOLD", "TTYPE", "SOLID", 13, 770, 660, 64, 24
data "MOLD", "TEROP", "NORM", 14, 770, 688, 64, 24
data "MOLD", "TEROP", "SMOOTH", 15, 770, 716, 64, 24
data "PAINT", "PBSIZE", "-", 1, 400, 660, 24, 24
data "PAINT", "PBSIZE", "+", 2, 430, 660, 24, 24
data "PAINT", "PBSIZE", "-", 3, 400, 688, 24, 24
data "PAINT", "PBSIZE", "+", 4, 430, 688, 24, 24
I'll be unlocking the save and load functionality soon, but while there's still time I'm going to try and get normalising, smoothing, and the different raising functions operating.
Feedback is welcome
It's not my fault!