Files
BlitzNext/_release/samples/Hi-Toro/Death Island/deathisland.bb
T
2014-02-26 16:09:18 +13:00

440 lines
10 KiB
BlitzBasic

; ---------------------------------------------------------------
; An exercise in atmosphere...
; ---------------------------------------------------------------
; Run it at night with the lights off (NOT during the day!).
; Use MOUSE and CURSORS, QIII-style...
; DO NOT try to learn anything from this program, apart from the effects
; of tweaking various parameters, perhaps. This is a serious hack-job!
; ---------------------------------------------------------------
; It's ugly down there, men...
; ---------------------------------------------------------------
Type Timer
Field start
Field timeOut
End Type
Function SetTimer.Timer (timeOut)
t.Timer = New Timer
t\start = MilliSecs ()
t\timeOut = t\start + timeOut
Return t
End Function
Function TimeOut (test.Timer)
If test <> Null
If test\timeOut < MilliSecs ()
Delete test
Return 1
EndIf
EndIf
End Function
; ---------------------------------------------------------------
; Lens stuff...
; ---------------------------------------------------------------
Global lensDiameter = 25
Include "incs/lensIncs.bb"
; ---------------------------------------------------------------
; Graphics/light...
; ---------------------------------------------------------------
Global dWidth = 640
Global dHeight = 480
Graphics3D dWidth, dHeight
SetBuffer BackBuffer ()
AmbientLight 0, 0, 0
wind = LoadSound ("snd/seawind2.wav")
sea = LoadSound ("snd/wavdance.wav")
rain = LoadSound ("snd/rainroof.wav")
thunder1 = LoadSound ("snd/thunder.wav")
thunder2 = LoadSound ("snd/txstorm.wav")
run = LoadSound ("snd/gravel.wav")
wade = LoadSound ("snd/water2.wav")
; ---------------------------------------------------------------
; 747...
; ---------------------------------------------------------------
Function CenterPivot (model)
FitMesh model, 0, 0, 0, MeshWidth (model), MeshHeight (model), MeshDepth (model)
modelPivot = CreatePivot ()
PositionEntity modelPivot, MeshWidth (model) / 2, MeshHeight (model) / 2, MeshDepth (model) / 2
EntityParent model, modelPivot
Return modelPivot
End Function
gimme747 = 1;0
; ---------------------------------------------------------------
; Don't ask...
; ---------------------------------------------------------------
If gimme747
b747Model = LoadMesh ("msh/747.x")
EntityShininess b747Model, 0.1
b747 = CenterPivot (b747Model)
ScaleEntity b747, 600, 600, 600 ; 500
PositionEntity b747, 3750, 400, 1300
RotateEntity b747, 3, 45, -1
scaler = 2
EndIf
; ---------------------------------------------------------------
; Terrain...
; ---------------------------------------------------------------
terrain = LoadTerrain ("gfx/height.bmp")
ScaleEntity terrain, 5, 150, 5
TerrainShading terrain, True
TerrainDetail terrain, 2500, True
grass = LoadTexture ("gfx/greygrass.bmp")
ScaleTexture grass, 20, 20
EntityTexture terrain, grass, 0, 1
MoveEntity terrain, 0, -4, 0
seabed = CreatePlane ()
EntityTexture seabed, grass
MoveEntity seabed, 0, -3.9, 0
; ---------------------------------------------------------------
; Water...
; ---------------------------------------------------------------
water = CreatePlane ()
h20 = LoadTexture ("gfx/greywater.bmp")
EntityAlpha water, 0.75
PositionEntity water, 0, 2.5, 0
ScaleTexture h20, 200, 200
EntityTexture water, h20
EntityColor water, 64, 64, 64
EntityShininess water, 0.05
; ---------------------------------------------------------------
; Camera and fog...
; ---------------------------------------------------------------
cam = CreatePivot ()
EntityRadius cam, 2
camera = CreateCamera (cam)
CameraViewport camera, 0, 0, dWidth, dHeight
CameraFogMode camera, 1
CameraFogRange camera, 1, 1600; * scaler
CameraFogColor camera, 0, 0, 0;75, 75, 75
CameraRange camera, 1, 1600 * scaler
PositionEntity cam, 2340, 0, 2390 ; 1394, 0, 4660 ;1298, 0, 4653 ; 3750, 45, 1370
dome = CreateSphere (12)
clouds = LoadTexture ("gfx/realsky.bmp")
;ScaleEntity dome, 1300 * scaler, 1300 * scaler, 1300 * scaler
ScaleEntity dome, 1600 * scaler, 1600 * scaler, 1600 * scaler
EntityTexture dome, clouds
ScaleTexture clouds, 0.25, 0.25
EntityOrder dome, 1
FlipMesh dome
EntityAlpha dome, 0.25
EntityFX dome, 8
flash = CreateLight ()
LightColor flash, 0, 0, 0
PositionEntity flash, 1900, 100, 0
RotateEntity flash, 90, 0, 0
; ---------------------------------------------------------------
; Collisions...
; ---------------------------------------------------------------
Const ENTITY_TERRAIN = 1
Const ENTITY_CAM = 2
Const ENTITY_PLANE = 3
EntityType terrain, ENTITY_TERRAIN
EntityType cam, ENTITY_CAM
If gimme747
EntityType b747Model, ENTITY_PLANE
EndIf
Collisions ENTITY_CAM, ENTITY_TERRAIN, 2, 2
Collisions ENTITY_CAM, ENTITY_PLANE, 2, 2
Function CurveValue#(current#,destination#,curve)
current#=current#+((destination#-current#)/curve)
Return current#
End Function
; ---------------------------------------------------------------
; Main loop...
; ---------------------------------------------------------------
FPS = 50
period = 1000 / FPS
time = MilliSecs () - period
SoundVolume wind, 0.25
SoundVolume sea, 0.65
SoundVolume rain, 0.75
SoundVolume run, 0
SoundVolume wade, 0
LoopSound wind
LoopSound sea
LoopSound rain
LoopSound run
LoopSound wade
PlaySound wind
PlaySound sea
PlaySound rain
runChannel = PlaySound (run)
wadeChannel = PlaySound (wade)
; ---------------------------------------------------------------
; Lens stuff...
; ---------------------------------------------------------------
diameter = lensDiameter
magnification = 5
CreateLens (diameter, magnification)
dropx# = 0
dropy# = 0
dropx2# = 0
dropy2# = 0
sky# = 0
startlite# = 0
foglite# = 0
sunlite# = 0
;CameraFogColor camera, 36, 36, 36
; Titles...
horror = LoadSprite ("gfx/di.bmp", 48, camera)
ScaleSprite horror, 9, 5
PositionEntity horror, 0, 0, 10
horrorAlpha# = 0
EntityAlpha horror, horrorAlpha
showHorror = 1
steps# = 1.5
HidePointer
;chapel = LoadMesh ("G:\My Documents\Temp\chapel.x")
;RotateEntity chapel, -90, 0, 0
;PositionEntity chapel, 0, 400, 0
;EntityShininess chapel, 0
disclaimer$ = "Run it at night or you won't see a thing :)"
SetFont LoadFont ("arial")
Repeat
If startlite < 40
startlite = startlite + 0.5
AmbientLight startlite, startlite, startlite
EndIf
If makesun = 0
sun = CreateLight ()
LightColor sun, 0, 0, 0
PositionEntity sun, 3000, 500, 3000
RotateEntity sun, 45, 0, 0
makesun = 1
Else
; Titles... requesting the services of Major Hack... Major Hack, you're needed for some titles...
If Not noMoreHorror
EntityAlpha horror, horrorAlpha
If Not reduce
If horrorAlpha <= 1
horrorAlpha = horrorAlpha + 0.05
Else
reduce = 1
EndIf
Else
If horrorAlpha => 0
horrorAlpha = horrorAlpha - 0.005
EndIf
EndIf
If horrorAlpha <= 0
FreeEntity horror
noMoreHorror = 1
EndIf
EndIf
EndIf
If sunlite < 70
sunlite = sunlite + 0.5
If sun
LightColor sun, sunlite, sunlite, sunlite
EndIf
EndIf
If foglite < 20
foglite = foglite + 0.5
CameraFogColor camera, foglite, foglite, foglite
CameraClsColor camera, foglite, foglite, foglite
EndIf
Repeat
elapsed = MilliSecs () - time
Until elapsed
ticks = elapsed / period
tween# = Float (elapsed Mod period) / Float (period)
For framelimit = 1 To ticks
If framelimit = ticks Then CaptureWorld
time = time + period
PositionEntity cam, EntityX (cam), TerrainY (terrain, EntityX (cam), EntityY (cam), EntityZ (cam)) + 25, EntityZ (cam)
mxs = MouseXSpeed()
mys = MouseYSpeed()
dest_xang# = dest_xang + mys
dest_yang# = dest_yang - mxs
xang# = CurveValue (xang, dest_xang, 5)
yang# = CurveValue (yang, dest_yang, 5)
RotateEntity camera, xang, 0, 0
RotateEntity cam, 0, yang, 0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
running# = 0
If KeyDown (200)
MoveEntity cam, 0, 0, steps
running = Rnd (0.35, 0.75)
EndIf
If KeyDown (208)
MoveEntity cam, 0, 0, -steps
running = Rnd (0.55, 0.95)
EndIf
If running > 0
ChannelPitch runChannel, Rnd (8000, 14000)
ChannelPitch wadeChannel, Rnd (7000, 9000)
EndIf
wading# = 0
If running
If EntityY (cam) < EntityY (water) + 24
wading = Rnd (0.5, 1)
running = 0
EndIf
EndIf
ChannelVolume wadeChannel, wading
ChannelVolume runChannel, running
PositionEntity dome, EntityX (cam), EntityY (cam), EntityZ (cam)
TurnEntity dome, 0.005, 0.025, 0.005
UpdateWorld
; Mark's code, hacked cluelessly...
PositionEntity water, Sin (time * 0.01) * 10, (EntityY (water) + (Sin (time * 0.05) * 0.2) * 0.25), Cos (time * 0.02) * 10
If (Rnd (1000) > 998.8) Or (KeyDown (28))
startlite = 0
sunlite = 40;255;10
sky = 255
foglite = 255
thunderGo = 1
thunderTimer.Timer = SetTimer (Rnd (500, 1500))
EndIf
If thunderGo
If TimeOut (thunderTimer)
If Rnd (0, 2) > 1
thunder = thunder1
Else thunder = thunder2
EndIf
SoundPitch thunder, Rnd (9000, 14000)
PlaySound thunder
thunderGo = 0
Delete thunderTimer
EndIf
EndIf
If sky > 10
sky = sky - Rnd (5, 20)
EndIf
LightColor flash, sky, sky, sky
If foglite > 20
foglite = foglite - 10
If foglite < 20 Then foglite = 20
EndIf
CameraClsColor camera, foglite, foglite, foglite
; CameraFogColor camera, foglite, foglite, foglite
Next
; W is for Wireframe...
If KeyHit (17)
w = 1 - w
WireFrame w
EndIf
RenderWorld tween
If Not nomorehorror
Text (GraphicsWidth () / 2) - (StringWidth (disclaimer$) / 2), GraphicsHeight () - (StringHeight (disclaimer$) * 2), disclaimer$
EndIf
; Raindrops on lens...
If dropy <= GraphicsHeight () - diameter - 2
DrawLens (dropx, dropy, diameter)
dropy = dropy + 2
Else
dropx = Rnd (0, GraphicsWidth () - diameter)
dropy = 0
EndIf
If dropy2 <= GraphicsHeight () - diameter - 7
DrawLens (dropx2, dropy2, diameter)
dropy2 = dropy2 + 7
Else
dropx2 = Rnd (0, GraphicsWidth () - diameter)
dropy2 = 0
EndIf
; Text 20, 20, EntityX (cam)
; Text 20, 40, EntityY (cam)
; Text 20, 60, EntityZ (cam)
Flip
; If KeyDown (57)
; SaveBuffer FrontBuffer (), "grab" + grab + ".bmp"
; grab = grab + 1
; EndIf
Until KeyDown (1)
End