`Rpg challenge by Ric
 
`display settings
if check display mode(1024,768,32)=1 then set display mode 1024,768,32
sync on
sync rate 30
hide mouse
 
global name$
titles()
 
`camera and light settings
autocam off
set camera range 0.01,10000
color backdrop 0
hide light 0
set ambient light 20
make light 1
 
 
`creat sounds
 
createsound("wave",1,6200,10000,2000,30,0.01,10,5,0,0,0.05)
createsound("foot steps",2,200,20,8000,.1,4.0,2.1,10,9.2,9.2,10)
createsound("ding",3,800,1000,6000,0,0.2,0.1,.5,1.2,0.2,10)
createsound("vibrato1",4,500,8000,8000,-0.0001,0.03,0.1,0.4,0,0,.1)
createsound("vibrato2",5,400,8000,8000,-0.0002,0.03,0.1,0.4,0,0,.1)
createsound("vibrato3",6,600,8000,8000,-0.0003,0.03,0.1,0.4,0,0,.1)
 
 
 
`set the randomize seed to the timer, so random events are different each time
randomize timer()
 
`set size of terrain
global matrixsize
matrixsize=100
 
`fog settings
fog on
fog color rgb(180,180,250)
fog distance matrixsize*0.6
 
`set initial value for object numbers
global object_seed
object_seed=1000000
 
`set initial value for image numbers
global image_seed
image_seed=1000000
 
create bitmap 1,screen width(),screen height()
set current bitmap 1
 
`function calls for creating world
global wallpaper
global light
make_wallpaper()
global internaldoor
global dim table(2000000)
global dim collisiondummy(2000000)
global room
global safe
make_room()
 
 
`position light for world illumination
position light 1,200,100,200
set light range 1,100000
 
global grassimage
create_grass()
global doortexture
make_door_texture()
global housetexture
make_house_texture()
global skyimage
create_sky()
global waterimage
global water
global water2
global theta#
create_water_image()
create_water()
global terrainimage
terraform()
global sphere1
global sphere2
global sphere3
create_skysphere()
global boat
global inboat
global jetty
make_boat()
 
 
 
`set house variables
global inroom
global numberofhouseentered
global number_of_houses
number_of_houses=15
`set up an array to store house numbers
global dim house(number_of_houses)
global dim door(number_of_houses)
global dim roof(number_of_houses)
 
 
global internaltowerdoor
global tower
global towerdoor
global key
global keyshaft
global navigator
global safeunlocked
global bomb
global bombdummy
global bomboutofhouse
global bombcollected
global bombwet
global boatunlocked
global runningshoes
global flippers
 
make_tower()
`make houses with numbers from 1 to max number of houses
for house_number=1 to number_of_houses
  make_house(house_number)
next house_number
 
make_tower_room()
make_bomb()
 
`make dummy for camera to follow
make object cube 1,0.01
hide object 1
make object collision box 1,-0.05,-0.05,-0.05,0.05,0.05,0.05,0
 
global collision
global flying
global introover
global footsteptimer
global info
global unlocked
global blob
global sealevel#
global inwater
global loopnumber
 
 
ink 0,0
set text size 20
 
set current bitmap 0
 
`set initial player position
position object 1,matrixsize/2,get ground height(1,50,50)+2,matrixsize/2
 
`set initial camera position before intro
position camera object position x(1),1.5,-100
 
global map
global mapimage
global pointer
setup_navigator()
 
gosub beginning
 
loop sound 1
 
`****************************************
 
`main program loop
do
 
`if returnkey()=1 then flying=1
 
`message subroutines
gosub display_message
 
 
`function calls for continuous events
if introover=0 then intro()
if introover=1 then move_camera()
if introover=1 then collision()
move_boat()
move_water()
 
if gotnavigator=1 then navigate()
 
`text 0,0,str$(screen fps())
`text 0,100,"house number: "+str$(numberofhouseentered)
`text 0,500,str$(table(tower))
sync
loop
 
`****************************************
 
`functions
 
function terraform
 
`set size of terrain
rows=60
columns=60
 
`create terrain
make matrix 1,matrixsize,matrixsize,columns,rows
 
`set mountain peaks
number_of_peaks=rnd(35)+10
max_height=15
 
dim peakx(number_of_peaks)
dim peakz(number_of_peaks)
dim height(number_of_peaks)
for peak=1 to number_of_peaks
  `set x,z coordinates for peak
  peakx(peak)=rnd(columns-10)+5
  peakz(peak)=rnd(rows-10)+5
  `set height of peak
  height(peak)=rnd(max_height)+10
  `create peak
  set matrix height 1,peakx(peak),peakz(peak),height(peak)
next peak
 
num=rows*columns
dim obnum(rows+1,columns+1)
dim v#(rows,columns)
 
`give each tile an x,z coordinate for use later
for x=1 to rows
for z=1 to columns
obnum(x,z)=ob
ob=ob+1
next z
next x
 
`texture matrix
prepare matrix texture 1,grassimage,rows,columns
tile=1
for x=rows-1 to 0 step -1
for z=0 to columns-1
set matrix tile 1,z,x,tile
inc tile
next z
next x
 
 
`adjust height of points between peaks
elasticity#=0.3
damping#=0
 
for time=1 to 100
 
for peak=1 to number_of_peaks
  set matrix height 1,peakx(peak),peakz(peak),height(peak)
next peak
 
for x=1+1 to rows-1
for z=1+1 to columns-1
if x<rows
distxp1#=get matrix height(1,x+1,z)-get matrix height (1,x,z)
endif
if x>1
distxm1#=get matrix height(1,x-1,z)-get matrix height (1,x,z)
endif
if z<columns
distzp1#=get matrix height(1,x,z+1)-get matrix height (1,x,z)
endif
if z>1
distzm1#=get matrix height(1,x,z-1)-get matrix height (1,x,z)
endif
vectorsum#=distxp1#+distxm1#+distzp1#+distzm1#
a#=vectorsum#*elasticity#
v#(obnum(x,z))=v#(obnum(x,z))+a#
set matrix height 1,x,z,get matrix height(1,x,z)+v#(obnum(x,z))
v#(obnum(x,z))=v#(obnum(x,z))*damping#
next z
next x
update matrix 1
next time
 
 
 
endfunction
 
 
 
 
function check_free_object_number
 
`this handy function means that you never have to worry about
`remembering object numbers.  You just give them names you can remember,
`and this function will find the next available number to assosciate
`with that name.  Just call the function by, for example, writing:
`
`ball=check_free_object_number
`make object sphere ball,1
 
object=object_seed
repeat
inc object
until object exist(object)=0
 
endfunction object
 
function check_free_image_number()
 
`this functionworks in the same way as the check_free_object function,
`except it works for images.
 
image=image_seed
repeat
inc image
until image exist(image)=0
 
endfunction image
 
function create_grass
 
`make a shaded box
box 0,0,100,100,rgb(100,150,100),rgb(50,200,20),rgb(80,0,10),rgb(150,200,0)
 
`and speckle it with random dots
for x=0 to 100
  for y=0 to 100
    if rnd(5)=0
      r=rnd(150)
      g=rnd(250)
      b=rnd(100)
      ink rgb(r,g,b),0
      dot x,y
    endif
  next x
next y
 
 
grassimage=check_free_image_number()
get image grassimage,0,0,100,100
 
endfunction
 
function create_skysphere
 
`get image for sphere by taking snapshot of terrain
terrainimage=check_free_image_number()
set camera fov 90
position camera matrixsize/2.0,3,-matrixsize*0.3
sync
get image terrainimage,0,0,screen width(),screen height()
set camera fov 60
 
`sphere 1 (mountains near) - just a sphere textured with the captured image
sphere1=check_free_object_number()
make object sphere sphere1,matrixsize*4
set object collision off sphere1
set object cull sphere1,0
texture object sphere1,terrainimage
set object texture sphere1,2,1
scale object texture sphere1,3,1
set object fog sphere1,0
set object light sphere1,0
set object transparency sphere1,4
position object sphere1,matrixsize/2,0,matrixsize/2
 
`sphere 2 (mountains far) - and another one further out. The inner sphere must be
`transparent, though, to see this one.
sphere2=check_free_object_number()
make object sphere sphere2,matrixsize*5
set object collision off sphere2
yrotate object sphere2,30
set object cull sphere2,0
texture object sphere2,terrainimage
set object texture sphere2,2,1
scale object texture sphere2,3,1
set object fog sphere2,0
set object transparency sphere2,4
ghost object on sphere2,4
set object emissive sphere2,rgb(180,150,250)
fade object sphere2,70
position object sphere2,matrixsize/2,0,matrixsize/2
 
`sphere 3 (sky) - a third, outer sphere for the sky
sphere3=check_free_object_number()
make object sphere sphere3,matrixsize*6
set object collision off sphere3
set object cull sphere3,0
texture object sphere3,skyimage
scale object texture sphere3,1,1.8
set object light sphere3,0
set object fog sphere3,0
position object sphere3,matrixsize/2,0,matrixsize/2
 
endfunction
 
function create_sky()
`creates a dark to light bluish gradient
cls
for n=0 to 250
  ink rgb(n,n,250),0
  line 0,n,250,n
next n
 
skyimage=check_free_image_number()
get image skyimage,0,0,250,250
 
endfunction
 
 
function create_water_image
 
`creates a shaded box
box 0,0,100,100,rgb(150,150,200),rgb(50,200,200),rgb(80,0,200),rgb(150,100,200)
 
`and speckles with white bits
for x=0 to 100
  for y=0 to 100
    if rnd(5)=0
      r=(250)
      g=(250)
      b=(250)
      ink rgb(r,g,b),0
      dot x,y
    endif
  next x
next y
 
 
waterimage=check_free_image_number()
get image waterimage,0,0,100,100
 
 
 
endfunction
 
 
function create_water
 
`just 2 planes textured with the water image
`top layer
water=check_free_object_number()
make object plain water,matrixsize*8,matrixsize*8
set object collision off water
texture object water,waterimage
set object texture water,2,1
scale object texture water,8,8
xrotate object water,90
set object fog water,0
set object emissive water,rgb(220,220,200)
ghost object on water
set alpha mapping on water,20
`bottom layer
water2=check_free_object_number()
make object plain water2,matrixsize*8,matrixsize*8
set object collision off water2
texture object water2,waterimage
xrotate object water2,90
position object water2,0,1,0
set object texture water2,2,1
scale object texture water2,8,8
set object light water2,0
set object fog water2,0
 
endfunction
 
function move_water
 
`moves the texture along a bit
scroll object texture water,0.001,0
scroll object texture water2,-0.001,0
`and moves the water up and down according to a sine wave
position object water,0,0.5*sin(theta#)+3+sealevel#,0
inc theta#,1
 
position object water2,0,sealevel#,0
inc sealevel#,0.0003
 
`position object jetty,object position x(jetty),sealevel#+3.3,object position z(jetty)
 
`adjust wave volume according to height above water
volume#=600/(object position y(1)+1)
if volume#>100 then volume#=100
if volume#<80 then volume#=80
set sound volume 1,volume#
 
endfunction
 
function move_camera
 
if returnkey()=1 then move object 1,-2
 
walkmode=1
if shiftkey()=1 and runningshoes=0 and inwater=0 then walkmode=2
if runningshoes=1 and inwater=0 then walkmode=4
if flippers=1 and inwater=1 then walkmode=3
if inboat=1 then walkmode=5
speed#=0
if upkey()=1 then speed#=0.05*walkmode
if downkey()=1 then speed#=-0.05
if rightkey()=1 then yrotate object 1,object angle y(1)+2
if leftkey()=1 then yrotate object 1,object angle y(1)-2
`if inkey$()="a" then position object 1,object position x(1),object position y(1)+0.1,object position z(1)
`if inkey$()="z" then position object 1,object position x(1),object position y(1)-0.11,object position z(1)
 
`reposition dummy object
position object 1,object position x(1)+speed#*sin(object angle y(1)),object position y(1),object position z(1)+speed#*cos(object angle y(1))
 
`set camera to dummy object's position and orientation
position camera object position x(1),object position y(1),object position z(1)
yrotate camera object angle y(1)
 
`play footstep sound
if inwater=0
  if speed#<>0 and footsteptimer=0 then play sound 2
  inc footsteptimer
  if  footsteptimer>20/walkmode then footsteptimer=0
endif
 
`move bomb with player if collected
if inroom=0
if bombcollected=1
  position object bomb,object position x(1),100,object position z(1)
  yrotate object bomb,object angle y(1)
  move object bomb,1
  position object bomb,object position x(bomb),get ground height(1,object position x(bomb),object position z(bomb)),object position z(bomb)
  position object bombdummy,object position x(bomb),object position y(bomb),object position z(bomb)
  if inkey$()="d" then bombcollected=0:move object 1,-0.5
endif
endif
 
endfunction
 
function make_house(house)
 
`give each house a numbered variable ( eg. house(1),house(2), etc,)
` and store the actual object number in that variable
house(house)=check_free_object_number()
make object box house(house),2,2,1
set object collision on house(house)
set object cull house(house),0
texture object house(house),housetexture
scale object texture house(house),20,40
roof(house)=check_free_object_number()
make object box roof(house),1.98,1,1
color object roof(house),rgb(130,130,130)
position object roof(house),0,1,0
xrotate object roof(house),45
glue object to limb roof(house),house(house),0
door(house)=check_free_object_number()
make object box door(house),0.2,0.4,0.02
texture object door(house),doortexture
position object door(house),0,0,0
glue object to limb door(house),house(house),0
 
repeat
x=rnd(matrixsize)
z=rnd(matrixsize)
goodlocation=1
position object house(house),x,get ground height(1,x,z),z
if object position y (house(house))<5 then goodlocation=5
if get ground height(1,object position x(house(house))+1,object position z(house(house)))>object position y(house(house))+0.4 or get ground height(1,object position x(house(house))+1,object position z(house(house)))<object position y(house(house))-0.4 then goodlocation=0
if get ground height(1,object position x(house(house)),object position z(house(house))+1)>object position y(house(house))+0.4 or get ground height(1,object position x(house(house))+1,object position z(house(house)))<object position y(house(house))-0.4 then goodlocation=0
if house>1
  for checkprevioushouses=1 to house-1
    if x<object position x(house(checkprevioushouses))+4 and x>object position x(house(checkprevioushouses))-4 and z<object position z(house(checkprevioushouses))+4 and z>object position z(house(checkprevioushouses))-4 then goodlocation=0
  next checkprevioushouses
endif
until goodlocation=1
 
`glue object to limb door(house),house(house),0
yrotate object house(house),rnd(360)
position object door(house),object position x(door(house)),get ground height(1,object position x(house(house))-0.5*sin(object angle y(house(house))),object position z(house(house))-0.5*cos(object angle y(house(house))))+0.2-object position y(house(house)),object position z(door(house))
position object door(house),object position x(door(house)),object position y(door(house)),object position z(door(house))-0.492
 
endfunction
 
function make_house_texture
 
cls
ink rgb(200,200,180),0
box 0,0,5,15
ink rgb(100,60,40),0
box 0,0,4,14
housetexture=check_free_image_number()
get image housetexture,0,0,5,15
 
endfunction
 
function make_door_texture
 
cls
colour=rgb(rnd(250),rnd(250),rnd(250))
ink colour,0
box 0,0,8,8
ink 0,0
box 1,1,3,3
box 5,1,7,3
ink colour-100,0
box 1,4,7,7
doortexture=check_free_image_number()
get image doortexture,0,0,8,8,1
 
endfunction
 
function make_wallpaper
 
cls
ink rgb(185,205,255),0
box 0,0,100,100
for x=0 to 100
  for y=0 to 100
    if rnd(5)=0
      ink rgb(rnd(200),rnd(200),rnd(200)),0
      dot x,y
    endif
  next y
next x
 
wallpaper=check_free_image_number()
get image wallpaper,0,0,100,100
 
endfunction
 
function make_room
 
`room is 20x10
 
wall1=check_free_object_number()
make object box wall1,20,10,0.1
position object wall1,0,1004.8,-5
texture object wall1,wallpaper
scale object texture wall1,10,10
 
wall2=check_free_object_number()
make object box wall2,20,10,0.1
position object wall2,0,1004.8,5
texture object wall2,wallpaper
scale object texture wall2,10,10
 
wall3=check_free_object_number()
make object box wall3,10,10,0.1
yrotate object wall3,90
position object wall3,-10,1004.8,0
texture object wall3,wallpaper
scale object texture wall3,10,10
 
wall4=check_free_object_number()
make object box wall4,10,10,0.1
yrotate object wall4,90
position object wall4,10,1004.8,0
texture object wall4,wallpaper
scale object texture wall4,10,10
 
floor=check_free_object_number()
make object box floor,20,10,0.1
xrotate object floor,90
position object floor,0,999.8,0
color object floor,rgb(200,10,20)
 
ceiling=check_free_object_number()
make object box ceiling,20,10,0.1
xrotate object ceiling,90
position object ceiling,0,1006,0
 
make light 2
position light 2,9,1004,4
set light range 2,15
lamp=check_free_object_number()
make object plain lamp,0.5,0.5
position object lamp,8.4,1004,3.4
yrotate object lamp,45
texture object lamp,light_image()
set object transparency lamp,5
lampshade=check_free_object_number()
make object cone lampshade,1
position object lampshade,8.4,1004,3.4
ghost object on lampshade,3
lampwire=check_free_object_number()
make object plain lampwire,0.02,4
yrotate object lampwire,45
position object lampwire,8.41,1006,3.41
 
make_table(room)
position object table(room),7,1002,3
 
entity=check_free_object_number()
make object cube entity,0.5
color object entity,rgb(0,250,50)
position object entity,7,1002.3,3
 
internaldoor=check_free_object_number()
make object plain internaldoor,2,4
position object internaldoor,0,1001.8,-4.89
color object internaldoor,rgb(220,20,50)
 
safe=check_free_object_number()
make object box safe,1,5,1
hide object safe
set object collision off safe
position object safe,-4,1003,4
color object safe,rgb(55,200,0)
 
endfunction
 
function enter_house(number)
if unlocked=1
  inroom=1
  show light 2
  hide light 1
  hide light 3
  if numberofhouseentered=1
    show object safe
    set object collision on safe
  else
    hide object safe
    set object collision off safe
  endif
  position object 1,0,1003,-4
  point object 1,0,1003,5
else
  play sound 3
  ink rgb(0,255,0),0
  text 0,20,"Door is locked"
  sync
  wait 1000
  ink 0,0
endif
endfunction
 
function exit_house()
 
position object 1,object position x(house(numberofhouseentered)),object position y(1),object position z(house(numberofhouseentered))
set object to object orientation 1,house(numberofhouseentered)
move object 1,-1
yrotate object 1,180
show light 1
inroom=0
 
endfunction
 
function light_image()
 
 
ink rgb(255,255,0),0
box 0,0,1,1
image=check_free_image_number()
get image image,0,0,1,1
cls
sphere1=check_free_object_number()
make object sphere sphere1,1,30,30
ghost object on sphere1
set object specular power sphere1,50
set object specular sphere1,rgb(200,200,200)
position light 1,0,-1,2
position object sphere1,0,0,3
texture object sphere1,image
a=int(screen width()/3.0)
b=int(screen height()/3.0)
c=int(screen width()*2/3.0)
d=int(screen height()*2/3.0)
sphere2=check_free_object_number()
make object sphere sphere2,0.3
position object sphere2,0,-0.2,3
ghost object on sphere2
sync
light=check_free_image_number()
get image light,a,b,c,d
delete object sphere1
delete object sphere2
 
endfunction light
 
function collision
 
 
collision=object collision(1,0)
 
`check collision with external doors
for number=1 to number_of_houses
  if collision=door(number)
    numberofhouseentered=number
    enter_house(number)
  endif
next number
 
`check collision between player and various objects
if collision=collisiondummy(room) then info=3
if collision=boat and boatunlocked=1 then inboat=1
if collision=boat and boatunlocked=1 and bombcollected=1 then info=7
if collision=boat and boatunlocked=0 then info=6
if collision=towerdoor then enter_tower()
if collision=safe and safeunlocked=1 then info=5
if collision=safe and safeunlocked=0 then info=4
if collision=bombdummy and bombcollected=0 then bombcollected=1
 
 
 
`check collision with internal door
if collision=internaldoor then exit_house()
if collision=internaltowerdoor then exit_tower()
 
`apply sliding collision
if collision>1
position object 1,object position x(1)-get object collision x(),object position y(1),object position z(1)-get object collision z()
endif
 
if collision=collisiondummy(tower)
  hide object key
  hide object keyshaft
  hide object navigator
  info=2
endif
 
`set dummy position to ground level
if inroom=0 and flying=0
  position object 1,object position x(1),get ground height(1,object position x(1),object position z(1))+0.2,object position z(1)
endif
 
`if in water, set dummy to water level and bob up and down
if object position y(1)<object position y(water)+0.25
  position object 1,object position x(1),object position y(water)+0.2,object position z(1)
  zrotate object 1,5*sin(theta#*4)
  inwater=1
else inwater=0
  zrotate object 1,0
endif
 
`check bomb isn't in the water
bombwet=0
if inroom=0
if object position y(bomb)<object position y(water) then bombwet=1:info=8
if object position y(house(1))<object position y(water) and bomboutofhouse=0 then bombwet=1:info=8
endif
 
endfunction
 
function intro
 
`camera zoom effect
position camera object position x(1),curvevalue(object position y(1),camera position y(),80),curvevalue(object position z(1),camera position z(),80)
camy#=get ground height(1,camera position x(),camera position z())+0.2
if camy#<object position y(water)+0.2 then camy#=object position y(water)+0.2
position camera camera position x(),camy#,camera position z()
if camera position z()>object position z(1)-0.2
  introover=1:info=1
  position camera object position x(1),object position y(1),object position z(1)
endif
 
endfunction
 
`subroutine for setting character options etc.
beginning:
play sound 4:play sound 5:play sound 6
fog color 0
fadein#=0
repeat
fog color rgb(fadein#*0.01*180,fadein#*0.01*180,fadein#*0.01*250)
for object=water to sphere3
set alpha mapping on object,fadein#
next object
inc fadein#,0.5
sync
until fadein#=>100
wait 1000
play sound 3
repeat
text 0,20,"This is an automated message from the Blue Island Central Information System."
text 0,40,"Please enter your user name:"
if keydown=0
  letter$=inkey$()
  name$=name$+letter$
  if keystate(14)=1 then name$=left$(name$,len(name$)-2)
  keydown=1
endif
if inkey$()="" and keystate(14)=0 then keydown=0
text 0,80,name$
sync
until returnkey()=1
 
repeat
ink 0,0
text 0,20,"Greetings, "+name$+". You are being scanned. Please wait......"
ink rgb(0,255,0),0
line 0,y,screen width(),y
line 0,screen height()-y,screen width(),screen height()-y
inc y,4
sync
until y>=screen height()
ink 0,0
text 0,20,"You have been cleared for access."
text 0,40,"Press any key to transport to shore."
sync
wait key
return
 
function createsound(name$,soundnumber,frequency#,length#,loudness#,bend#,decay#,vibratospeed#,vibratodepth#,tremelospeed#,tremelodepth#,attack#)
 
outWord as word
dword1 as dword: dword2 as dword: dword3 as dword: dword4 as dword
dword5 as dword: dword6 as dword: dword7 as dword
 
samples=int((length#/1000)*44100)
 
if memblock exist(1) then delete memblock 1
make memblock 1,samples*2+28
 
` write 28 memblock header bytes
dword1=1      ` gg query: is this the number of channels?
dword2=2      ` gg query: is this the number of bytes per sample?
dword3=22050  ` gg query: seems to be half the number of samples per second - why?
dword4=88200  ` gg query: is this the number of bytes per second?
dword5=4      ` gg query: what does this represent?
dword6=16     ` gg query:     (ditto)            ?
dword7=0      ` gg query:     (ditto)            ?
 
position=0
write memblock dword 1, position, dword1 : inc position,4
write memblock dword 1, position, dword2 : inc position,4
write memblock dword 1, position, dword3 : inc position,4
write memblock dword 1, position, dword4 : inc position,4
write memblock dword 1, position, dword5 : inc position,4
write memblock dword 1, position, dword6 : inc position,4
write memblock dword 1, position, dword7 : inc position,4
 
rem generate and write wave
riseinloudness#=loudness#
for x=1 to samples
  outInteger=int(sin((x/122.5)*(frequency#+vibratodepth#*sin(theta#)))*(loudness#-fallinloudness#-riseinloudness#+tremelodepth#*sin(phi#)))*3.0
  if outInteger <-32767 then outInteger=-32767  ` gg query: is this the valid range?
  if outInteger>32767 then outInteger=32767     ` gg query:       (ditto)          ?
  outWord=outInteger
  inc theta#,vibratospeed#
  inc phi#,tremelospeed#
  dec frequency#,bend#
 
  if fallinloudness#<loudness#
    inc fallinloudness#,decay#
  endif
 
  if riseinloudness#>0
    dec riseinloudness#,attack#
  endif
 
  write memblock word 1, position, outWord : inc position,2
next x
 
if sound exist(soundnumber)=1 then delete sound soundnumber
 
make sound from memblock 999, 1 ` assumes you won't need sound number 999!
clone sound soundnumber, 999
delete sound 999
 
` memblock no longer required
delete memblock 1
 
endfunction
 
display_message:
 
if info=1
if dingplayed=0 then play sound 3:dingplayed=1
text 0,20,"Transport complete.  Please proceed to the Information Building (the tallest building on the island)"
text 0,40,"to receive further instructions.  Use arrowkeys to move.  Shift key will make you walk faster"
text 0,60,"Note: If you get lodged anywhere, hit return to jump backwards."
inc messagetime
if messagetime>300 then info=0:messagetime=0:dingplayed=0
endif
 
if info=2
if dingplayed=0 then play sound 3:dingplayed=1:unlocked=1:gotnavigator=1
text 0,20,"We're glad you finally made it, "+name$+".  Your task is to find the weapon, and"
text 0,40,"move it clear of the rising water.  Unfortunately, it's location is unknown."
text 0,60,"This key will enable you to unlock the doors of all buildings on the island."
text 0,80,"And you might find this electronic navigation system useful too."
text 0,100,"One tip - check the buildings most liable to flooding first, before it's too late."
text 0,120,"Get searching, "+name$+", and good luck."
inc messagetime
if messagetime>800 then info=0:messagetime=0:dingplayed=0
endif
 
`message for collision with entity
if info=3
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
if numberofhouseentered=1
  text 0,20,"There is a safe in this room."
endif
if numberofhouseentered>8
  text 0,20,"Nothing in this box - try another building."
endif
if numberofhouseentered=2
  text 0,20,"You have collected a safe key"
  safeunlocked=1
endif
if numberofhouseentered=3
  text 0,20,"You have collected a boat key"
  boatunlocked=1
endif
if numberofhouseentered=4
  text 0,20,"You have collected some running shoes"
  runningshoes=1
endif
if numberofhouseentered=5
  text 0,20,"You have found an ice cream.  Yum yum."
endif
if numberofhouseentered=6
  text 0,20,"You have found radioisotope detection goggles.  Any building"
  text 0,40,"containing radioactive material will glow."
  color object roof(1),rgb(255,155,0)
endif
if numberofhouseentered=7
  text 0,20,"You have found a message.  It reads as follows:"
  text 0,40,"'There is a boat moored offshore to the north of the island."
  text 0,60,"You may use it to keep the weapon dry when the water rises."
  text 0,80,"You will need to swim out to it to bring it to shore.'"
endif
if numberofhouseentered=8
  text 0,20,"You have found some swimming flippers"
  flippers=1
endif
inc messagetime
if messagetime>200 then info=0:messagetime=0:dingplayed=0
endif
 
if info=4
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
text 0,20,"Safe is locked."
inc messagetime
if messagetime>100 then info=0:messagetime=0:dingplayed=0
endif
 
if info=5
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
if bombcollected=0
  show object bomb
  bombcollected=1
  bomboutofhouse=1
endif
text 0,20,"You have collected the nuclear weapon ......."
text 0,40,"Don't let it get wet! Press d to drop the bomb at any time."
inc messagetime
if messagetime>1000 then info=0:messagetime=0:dingplayed=0
endif
 
if info=6
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
text 0,20,"Boat is locked."
inc messagetime
if messagetime>100 then info=0:messagetime=0:dingplayed=0
endif
 
if info=7
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
text 0,20,"Congratulations - you have got the bomb to safety.  You are a National Hero!"
text 0,40,"Please come back to Blue Island when it's dried out a bit."
text 0,60,"Goodbye, "+name$
sync
wait 2000
wait key
end
endif
 
 
 
if info=8
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
text 0,20,"The bomb is underwater.  Get it out quick....."
if bombwet=1 then text 0,40,str$(200-messagetime)
inc messagetime
if messagetime>200 and bombwet=0 then info=0:messagetime=0:dingplayed=0
if messagetime>200 and bombwet=1 then info=9:messagetime=0:dingplayed=0
endif
 
if info=9
if dingplayed=0 then play sound 3:dingplayed=1:ink rgb(0,255,0),0
cls
sync
text 0,20,"Blue Island has been destroyed.  Your mission has failed."
text 0,40,"Oh, and you're dead too, by the way."
text 0,60,"Goodbye, "+name$
sync
wait 2000
wait key
end
endif
 
return
 
function titles()
 
sync
set text font "arial"
set text size 60
ink rgb(120,120,250),0
text 300,50,"Blue Island"
set text size 20
text 200,200,"Attention:  Blue Island is in trouble."
text 200,220,"A massive tectonic shift has caused a surge in sea water, which"
text 200,240,"will almost completely submerge the island within 3 hours."
text 200,280,"All citizens have been evacuated, but one vital item remains"
text 200,300,"left on the island - a nuclear weapon.  Unfortunately, it is set"
text 200,320,"to detonate upon contact with water.  This would result in the "
text 200,340,"complete annihilation of Blue Island.  Your job is to make sure this"
text 200,360,"this doesn't happen."
text 200,400,"Press any key to continue"
sync
wait key
cls
text 0,20,"Please wait...."
sync
 
endfunction
 
function make_tower()
 
tower=check_free_object_number()
make object box tower,2,10,2
texture object tower,housetexture
set object cull tower,0
scale object texture tower,20,40
roof=check_free_object_number()
make object box roof,2.5,2,2.5
color object roof,rgb(80,80,80)
position object roof,0,5,0
glue object to limb roof,tower,0
spire=check_free_object_number()
make object cone spire,2
color object spire,rgb(80,80,80)
position object spire,0,6,0
glue object to limb spire,tower,0
 
towerdoor=check_free_object_number()
make object box towerdoor,0.2,0.4,0.02
texture object towerdoor,doortexture
 
repeat
goodlocation=1
x=rnd(matrixsize)
z=rnd(matrixsize)
position object tower,x,get ground height(1,x,z),z
if get ground height(1,object position x(tower)+1,object position z(tower))>object position y(tower)+0.4 or get ground height(1,object position x(tower)+1,object position z(tower))<object position y(tower)-0.4 then goodlocation=0
if get ground height(1,object position x(tower),object position z(tower)+1)>object position y(tower)+0.4 or get ground height(1,object position x(tower)+1,object position z(tower))<object position y(tower)-0.4 then goodlocation=0
if object position y(tower)<3 then goodlocation=0
until goodlocation=1
position object towerdoor,object position x(tower),get ground height(1,object position x(tower),object position z(tower)-0.991)+0.2,object position z(tower)-0.992
 
 
endfunction
 
function enter_tower
 
  inroom=1
  hide light 1
  hide light 2
  show light 3
  position object 1,0,2003,-4
  point object 1,0,2003,5
 
endfunction
 
function make_table(number)
 
table(number)=check_free_object_number()
make object box table(number),4,0.1,2
color object table(number),rgb(200,100,60)
leg1=check_free_object_number()
make object box leg1,0.1,2,0.1
position object leg1,-1.95,-1,-0.95
glue object to limb leg1,table(number),0
leg2=check_free_object_number()
make object box leg2,0.1,2,0.1
position object leg2,1.95,-1,-0.95
glue object to limb leg2,table(number),0
leg3=check_free_object_number()
make object box leg3,0.1,2,0.1
position object leg3,-1.95,-1,0.95
glue object to limb leg3,table(number),0
leg4=check_free_object_number()
make object box leg4,0.1,2,0.1
position object leg4,1.95,-1,0.95
glue object to limb leg4,table(number),0
collisiondummy(number)=check_free_object_number()
make object box collisiondummy(number),4,4,2
hide object collisiondummy(number)
glue object to limb collisiondummy(number),table(number),0
 
endfunction
 
function make_tower_room()
 
wall1=check_free_object_number()
make object box wall1,20,10,0.1
position object wall1,0,2004.8,-10
texture object wall1,wallpaper
scale object texture wall1,10,10
 
wall2=check_free_object_number()
make object box wall2,20,10,0.1
position object wall2,0,2004.8,10
texture object wall2,wallpaper
scale object texture wall2,10,10
 
wall3=check_free_object_number()
make object box wall3,20,10,0.1
yrotate object wall3,90
position object wall3,-10,2004.8,0
texture object wall3,wallpaper
scale object texture wall3,10,10
 
wall4=check_free_object_number()
make object box wall4,20,10,0.1
yrotate object wall4,90
position object wall4,10,2004.8,0
texture object wall4,wallpaper
scale object texture wall4,10,10
 
floor=check_free_object_number()
make object box floor,20,20,0.1
xrotate object floor,90
position object floor,0,1999.8,0
color object floor,rgb(100,10,200)
 
ceiling=check_free_object_number()
make object box ceiling,20,20,0.1
xrotate object ceiling,90
position object ceiling,0,2006,0
 
make_table(tower)
position object table(tower),0,2002,0
 
make light 3
position light 3,0,2004,-0.1
set light range 3,5
lamp=check_free_object_number()
make object plain lamp,0.5,0.5
position object lamp,0,2004,0
texture object lamp,light
set object transparency lamp,5
lampshade=check_free_object_number()
make object cone lampshade,1
position object lampshade,0,2004,0
ghost object on lampshade,3
lampwire=check_free_object_number()
make object plain lampwire,0.02,4
position object lampwire,0,2006,0.01
 
key=check_free_object_number()
make object sphere key,0.2
color object key,rgb(255,255,0)
position object key,0,2002.15,0
keyshaft=check_free_object_number()
make object box keyshaft,0.5,0.1,0.1
color object keyshaft,rgb(255,255,0)
position object keyshaft,0.25,2002.15,0
navigator=check_free_object_number()
make object box navigator,0.5,0.2,0.3
color object navigator,rgb(255,0,50)
position object navigator,-1,2002.15,0
 
 
 
internaltowerdoor=check_free_object_number()
make object plain internaltowerdoor,2,4
position object internaltowerdoor,0,2001.8,-9.89
color object internaltowerdoor,rgb(220,20,50)
 
endfunction
 
function exit_tower
 
position object 1,object position x(tower),object position y(1),object position z(tower)
set object to object orientation 1,tower
move object 1,-2
yrotate object 1,180
show light 1
inroom=0
 
endfunction
 
function setup_navigator
 
 
fog off
set ambient light 80
set current bitmap 1
cls
cx#=camera position x()
cy#=camera position y()
cz#=camera position z()
position camera matrixsize/2.0,100,matrixsize/2.0
xrotate camera 90
mapimage=check_free_image_number()
sync
get image mapimage,0,0,screen width(),screen height(),1
set current bitmap 0
xrotate camera 0
position camera cx#,cy#,cz#
map=check_free_object_number()
make object plain map,1,1
texture object map,mapimage
position object map,2,-1.5,4
set object light map,0
lock object on map
hide object map
fog on
fog color rgb(180,180,250)
fog distance matrixsize*0.6
set ambient light 20
 
pointer=check_free_object_number()
make object cone pointer,0.05
color object pointer,rgb(255,0,0)
position object pointer,2,-1.5,3.9
set object emissive pointer,rgb(250,0,0)
lock object on pointer
hide object pointer
 
endfunction
 
function navigate
 
show object pointer
show object map
if inroom=0
  position object pointer,1.95+(object position x(1)-matrixsize/2.0)/matrixsize*0.55,-1.5+(object position z(1)-matrixsize/2.0)/matrixsize*1.1,3.9
  zrotate object pointer,-object angle y(1)
endif
 
endfunction
 
 
function make_boat
 
`boat
boat=check_free_object_number()
make object box boat,0.6,0.4,1
color object boat,rgb(50,250,255)
front=check_free_object_number()
make object cone front,0.5
xrotate object front,90
color object front,rgb(0,0,255)
position object front,0,0,0.8
glue object to limb front,boat,0
back=check_free_object_number()
make object box back,0.5,0.5,0.1
color object back,rgb(255,0,0)
position object back,0,0,-0.5
glue object to limb back,boat,0
position object boat,50,0,120
 
`jetty
remstart
jetty=check_free_object_number()
make object box jetty,1,0.5,40
color object jetty,rgb(50,120,10)
position object jetty,50,0,80
remend
 
 
endfunction
 
function move_boat
 
if inboat=1
position object 1,object position x(1),object position y(water)+1,object position z(1)
position object boat,object position x(1),object position y(water),object position z(1)
yrotate object boat,object angle y(1)
move object boat,1.5
`position object 1,object position x(boat),object position y(boat),object position z(boat)
`move object up 1,1
`move object 1,-2
endif
 
`if boat hits ground then leave boat
if object position y(boat)<get ground height(1,object position x(boat),object position z(boat))
  if inboat=1 then leave_boat()
endif
 
position object boat,object position x(boat),object position y(water),object position z(boat)
if object position y(boat)<get ground height(1,object position x(boat),object position z(boat)) thenposition object boat,object position x(boat),get ground height(1,object position x(boat),object position z(boat)),object position z(boat)
 
endfunction
 
function leave_boat
 
position object boat,object position x(boat),get ground height(1,object position x(boat),object position z(boat)),object position z(boat)
inboat=0
move object 1,2
 
endfunction
 
function make_bomb
 
  bomb=check_free_object_number()
  make object sphere bomb,0.1,20,20
  position object bomb,0,100,0
  bombdummy=check_free_object_number()
  make object sphere bombdummy,1
  hide object bombdummy
  color object bomb,rgb(50,10,10)
 
 
endfunction