Challenge: 
Version: 
Invalid Entry - Reason: Missed the deadline
Winner?: 
No
Code Snippet: 
Rem Project: Island
Rem Created: 17/05/2006 15:25:06

Rem ***** Main Source File *****

gosub INIT_VariablesAndDatastructures

gosub INIT_3DEnvironment

gosub INIT_SkyBox

gosub INIT_LandMatrix

gosub INIT_WaterMatrix

rem **************************************************
rem **************************************************
rem **************************************************

k#=0.999:invk#=1-k#

gosub Set_Params

do

    gosub HUD_DisplayGameStats

    if rnd(20)>19 or max=0 or increase#=0 then gosub Set_Params

    gosub RaiseLand

    gosub MOVE_GetPlayerInput

    gosub MOVE_UpdateCamera

    gosub MOVE_Sun

    sync

loop

rem **************************************************
rem **************************************************
rem **************************************************

Set_Params:

    increase# = (rnd(15)-5)
    if increase#>0 then increase#=increase#/5

    cx=rnd(49)+10
    cy=rnd(49)+10

    if cx>25
        maxx=47-cx
    else
        maxx=cx-1
    endif

    if cx=25 then maxx=0

    if cy>25
        maxy=47-cy
    else
        maxy=cy-1
    endif

    if cy=25 then maxy=0

    if maxx>maxy
        max=maxy
    else
        max=maxx
    endif

    max=rnd(max)

return

MOVE_Sun:

   angle# = wrapvalue(angle#+.1)
   lx# = sin(angle#)*3000
   ly# = cos(angle#)*1000
   set point light 1, lx#,ly#-300,0
   position object 2,lx#,ly#-300,0

return

MOVE_GetPlayerInput:

    PD(0).Pitch# = mousemovey()
    PD(0).Yaw# = mousemovex()

    PD(0).Speed# = (keystate(17) - keystate(31))*5

return

rem **************************************************

MOVE_UpdateCamera:

    inc PD(0).Xang#, PD(0).Pitch#
    inc PD(0).Yang#, PD(0).Yaw#

    rotate camera PD(0).Xang#, PD(0).Yang#, PD(0).Zang#

    move camera PD(0).Speed#

    if camera position x() >= -3000 and camera position x() <= 3000
        PD(0).Xpos# = camera position x()
    endif

    if camera position y() >= get ground height( 1, camera position x() + 3000, camera position z() + 3000 )
        PD(0).Ypos# = camera position y()
    else
        PD(0).Ypos# = get ground height( 1, camera position x() + 3000, camera position z() + 3000 )
    endif

    if camera position z() >= -3000 and camera position z() <= 3000
        PD(0).Zpos# = camera position z()
    endif

    position camera PD(0).Xpos#,PD(0).Ypos#,PD(0).Zpos#

return

rem **************************************************

HUD_DisplayGameStats:

    text 10,10, "Co-Ords :  " + str$( int(PD(0).Xpos#) ) + ", " + str$( int(PD(0).Ypos#) ) + ", " + str$( int(PD(0).Zpos#) )

    text 10,30, "FPS     :  " + str$( screen fps() )

return

rem **************************************************

INIT_VariablesAndDatastructures:

    ViewLimit#=1000
    DeepestDepth# = -100

    type Player_Data

        Xpos#
        Ypos#
        Zpos#

        XAng#
        YAng#
        ZAng#

        Pitch#
        Yaw#

        Speed#

    endtype

    dim PD(0) as Player_Data

    #constant N1 = 3
    #constant N2 = 4
    #constant N3 = 5
    #constant N4 = 6

    for t = 1 to 6
       null = make vector3(t)
    next t

return

rem **************************************************

INIT_3DEnvironment:

    hide mouse
    autocam off

    sync on
    sync rate 0

    set ambient light 5

    rem fog on
    fog color 100,100,200
    fog distance 1900

    backdrop on
    color backdrop 0

    set camera range 1, ViewLimit# * 10

    make light 1
    set light range 1, ViewLimit# * 10

    make object sphere 2,10
    set object fog 2,0
    set object light 2,0

return

rem **************************************************

INIT_SkyBox:

    make object cube 1, (ViewLimit# * -8)

        create bitmap 1, 256,256
        cls rgb(100,100,200)

        get image 1,0,0,255,255
        delete bitmap 1

    texture object 1, 1

    set object light 1,0
    set object fog 1,0

    Position object 1,0,0,0

return

rem **************************************************

INIT_LandMatrix:

    make matrix 1, 6000,6000,69,69

        create bitmap 1, 256,256
        cls rgb(100,200,0)

        for l = 1 to 5000

            dot rnd(255), rnd(255), 0

        next l

        blur bitmap 1,6
        blur bitmap 1,6

        get image 2,0,0,255,255
        delete bitmap 1

    prepare matrix texture 1,2,1,1
    fill matrix 1,0,1

    position matrix 1, -3000, DeepestDepth#, -3000

    LandCellSize# = 6000.0/69.0

return

rem **************************************************

INIT_WaterMatrix:

    make matrix 2, 8000,8000,40,40

        create bitmap 1, 256,256
        cls rgb(0,50,200)

        for l = 1 to 5000

            dot rnd(255), rnd(255), rgb(255,255,255)

        next l

        blur bitmap 1,6
        blur bitmap 1,6

        get image 3,0,0,255,255
        delete bitmap 1

    prepare matrix texture 2,3,1,1
    fill matrix 2,0,1

    ghost matrix on 2
    set matrix 2,0,0,0,2,1,1,1

    position matrix 2, -4000,0,-4000

return

rem **************************************************

RaiseLand:

    for l = cx-max to cx+max

        for m = cy-max to cy+max

            xsq#=(cx-l)*(cx-l)
            ysq#=(cy-m)*(cy-m)
            d#=sqrt(xsq#+ysq#)

            hi#=rnd(max-d#)
            if hi#<0 then hi#=0

            div#=rnd(int(d#)+5)
            div#=(div#^2)*(increase#)

            set matrix height 1,l,m,get matrix height(1,l,m) + (hi#/div#)

        next m

    next l

    update matrix 1

    for x = cx-max-1 to cx+max+1
        for z = cy-max-1 to cy+max+1

            nh#=(get matrix height(1,x,z) * k#) + (get matrix height(1,x+1,z) * invk#)
            set matrix height 1,x,z,nh#

        next z
    next x

    for x = cx+max+1 to cx-max-1 step -1
        for z = cy-max-1 to cy+max+1

            nh#=(get matrix height(1,x,z) * k#) + (get matrix height(1,x+1,z) * invk#)
            set matrix height 1,x,z,nh#

        next z
    next x

    for x = cx-max-1 to cx+max+1
        for z = cy-max-1 to cy+max+1

            nh#=(get matrix height(1,x,z) * k#) + (get matrix height(1,x,z+1) * invk#)
            set matrix height 1,x,z,nh#

        next z
    next x

    for x = cx-max-1 to cx+max+1
        for z = cy+max+1 to cy-max-1 step -1

            nh#=(get matrix height(1,x,z) * k#) + (get matrix height(1,x,z+1) * invk#)
            set matrix height 1,x,z,nh#

        next z
    next x

    update matrix 1

    CheapNormals( 1, cx, cy, max, (6000.0/69.0) )

return

function createNormal(v, SIZE#, hUp#, hRight#, hDown#, hLeft#)
   set vector3 v, hLeft#-hRight#, SIZE#, hUp#-hDown#
   normalize vector3 v, v
endfunction

function CheapNormals( Matrix, cx, cy, max, CellSize# )

    null = make vector3(1)
    for x = cx-max to cx+max
      for z = cy-max to cy+max
         createNormal(1, 40, get matrix height(Matrix,x,z-1), get matrix height(Matrix,x+1,z), get matrix height(Matrix,x,z+1), get matrix height(Matrix,x-1,z))
         set matrix normal 1, x, z, x vector3(1), y vector3(1), z vector3(1)
      next z
    next x
    null = delete vector3(1)

    update matrix 1

endfunction

function Set_Normals( Matrix, Lx, Tz, Range, CellSize# )

   for z = Tz-Range to Tz+Range

      for x = Lx-Range to Lx+Range

         rem upper right
         set vector3 1,x*CellSize#,get matrix height(Matrix,x,z+1),(z+1)*CellSize#

         set vector3 2,(x+1)*CellSize#,get matrix height(Matrix,x+1,z),z*CellSize#

         cross product vector3 N1,2,1
         normalize vector3 N1, 1

         rem upper left
         set vector3 1,x*CellSize#,get matrix height(Matrix,x,z+1),(z+1)*CellSize#

         set vector3 2,(x-1)*CellSize#,get matrix height(Matrix,x-1,z),z*CellSize#

         cross product vector3 N2,2,1
         normalize vector3 N2, 1

         rem lower left
         set vector3 1,x*CellSize#,get matrix height(Matrix,x,z-1),(z-1)*CellSize#

         set vector3 2,(x-1)*CellSize#,get matrix height(Matrix,x-1,z),z*CellSize#

         cross product vector3 N3,2,1
         normalize vector3 N3, 1

         rem lower right
         set vector3 1,x*CellSize#,get matrix height(Matrix,x,z-1),(z-1)*CellSize#

         set vector3 2,(x+1)*CellSize#,get matrix height(Matrix,x+1,z),z*CellSize#

         cross product vector3 N4,2,1
         normalize vector3 N4, 1

         rem average 4 normals
         add vector3 N1,N1,N2
         add vector3 N1,N1,N3
         add vector3 N1,N1,N4

         divide vector3 N1,4
         normalize vector3 N1, N1

         nx# = x vector3(N1)
         ny# = y vector3(N1)
         nz# = z vector3(N1)

         set matrix normal Matrix, x, z, nx#, ny#, nz#

      next x

   next z

   update matrix 1

endfunction