rem Tutorial 7

rem Initial settings
sync on : sync rate 100
backdrop off : hide mouse

rem Select font
set text font "arial" : set text size 16
set text to bold : set text transparent

rem Loading prompt
sync : center text screen width()/2,screen height()/2,"LOADING" : sync

rem Load all media for game
gosub _load_game

rem Setup all objects for game
gosub _setup_game

rem Game loop
do

 rem Control game elements
 gosub _control_player
 gosub _control_gunandbullet
 gosub _control_enemies

 rem Update screen
 sync

rem End loop
loop

rem End program
end

_control_player:

rem Control player direction
rotate camera camera angle x(0)+(mousemovey()/2.0),camera angle y(0)+(mousemovex()/2.0),0

rem Control player movement
cx#=camera angle x(0) : cy#=camera angle y(0)
if upkey()=1 then xrotate camera 0,0 : move camera 0,0.2 : xrotate camera 0,cx#
if downkey()=1 then xrotate camera 0,0 : move camera 0,-0.2 : xrotate camera 0,cx#
if leftkey()=1 then yrotate camera 0,cy#-90 : move camera 0.2 : yrotate camera 0,cy#
if rightkey()=1 then yrotate camera 0,cy#+90 : move camera 0.2 : yrotate camera 0,cy#
if wrapvalue(camera angle x(0))>40 and wrapvalue(camera angle x(0))<180 then xrotate camera 0,40
if wrapvalue(camera angle x(0))>180 and wrapvalue(camera angle x(0))<280 then xrotate camera 0,280

rem Apply simple gravity to player
position camera camera position x(),camera position y()-0.1,camera position z()

rem Player is always focal point of sky
position object SkyObj,camera position x(),camera position y(),camera position z()

rem Position listener at player for 3D sound
position listener camera position x(),camera position y(),camera position z()
rotate listener camera angle x(),camera angle y(),camera angle z()

rem In case of restart
if restart=1
   restart=0
   set bsp collision off 1
   rotate camera 0,0,0
   position camera 2,2,2
   set bsp camera collision 1,0,0.75,0
endif

return

_control_gunandbullet:

 rem Control gun firing
 if mouseclick()=1 and bullet=-50
  bullet=100
  play sound GunSnd
  position object BulletObj,camera position x(0),camera position y(0),camera position z(0)
  rotate object BulletObj,camera angle x(0),camera angle y(0),0
  set bsp object collision 2,BulletObj,0.1,1
  move object BulletObj,0.2
 endif

 rem Control life of bullet
 if bullet>0

  rem If bullet collides with BSP world
  if bsp collision hit(2)=1 or bulletimpact=1
   rem End bullet on wall
   position sound ImpactSnd,object position x(BulletObj), object position y(BulletObj), object position z(BulletObj)
   play sound ImpactSnd
   bulletimpact=0
   bullet=0
  else
   rem Move bullet
   dec bullet
   move object BulletObj,0.5
  endif

  rem Bullet dies
  if bullet=0
   set bsp collision off 2
  endif

 else
  rem Gun recharge phase
  if bullet>-50 then dec bullet
 endif

return

_control_enemies:
 rem *ADDCODE* TUT7C
return

_control_stats:
return

_setup_game:

 rem Setup camera
 set camera range 0.1,5000
 autocam off

 rem Setup sky model
 set object SkyObj,1,0,0,0,0,0,0
 scale object SkyObj,20,20,20

 rem Setup gun for player
 lock object on GunObj
 scale object GunObj,2,2,4
 rotate object GunObj,270,0,0
 position object GunObj,0.5,-1,2
 disable object zdepth GunObj

 rem Create object for bullet
 BulletObj=3 : make object cube BulletObj,0.1

 rem Create simple sprite based crosshair
 sprite 1,320-16,240-16,CrossHairImg
 set sprite 1,0,1

 rem *ADDCODE* TUT7D

 rem Trigger player initialisation
 restart=1

return

_load_game:

 rem Load BSP world and sky model
 load bsp "world\ikzdm1.pk3","ikzdm1.bsp"
 SkyObj=1 : load object "models\sky\am.x",SkyObj

 rem Load model for gun
 GunObj=2 : load object "models\gun\gun.x",GunObj

 rem *ADDCODE* TUT7A

 rem Load all sounds
 GunSnd=1 : load sound "sounds\gun.wav",GunSnd
 ImpactSnd=2 : load 3dsound "sounds\impact.wav",ImpactSnd
 DieSnd=3 : load sound "sounds\die.wav",DieSnd

 rem *ADDCODE* TUT7B

 rem Load music (WAV best for looping)
 MusicSnd=101 : load sound "sounds\ingame.wav",MusicSnd
 loop sound MusicSnd : set sound volume MusicSnd,80

 rem Load images
 FireImg=1 : load image "images\fire.bmp",FireImg
 CrossHairImg=2 : load image "images\crosshair.bmp",CrossHairImg

return

