896 lines
20 KiB
BlitzBasic
896 lines
20 KiB
BlitzBasic
; Tunnel Run
|
|
; (c)2001 David Bird
|
|
; dave@birdie72.freeserve.co.uk
|
|
; www.birdie72.freeserve.co.uk
|
|
; Main Program
|
|
|
|
;
|
|
Global Cheater=False
|
|
|
|
Graphics3D 640,480
|
|
SetBuffer BackBuffer()
|
|
Include "globs.bb"
|
|
Include "functions.bb"
|
|
|
|
ChangeDir "Media"
|
|
;
|
|
;Set Up collision Constants here.
|
|
;
|
|
Const TYPE_CAM=1
|
|
Const TYPE_PLAYER=2
|
|
Const TYPE_SHOT1=3
|
|
Const TYPE_TUNNEL=50
|
|
Const TYPE_ASTER=51
|
|
Const TYPE_ASTERPOLY=52
|
|
Const TYPE_CLAW=53
|
|
|
|
|
|
;
|
|
;
|
|
Load_Media()
|
|
Get_GFX_Modes()
|
|
Load_Highscores()
|
|
Set_GFXMode()
|
|
Resize_Images(GraphicsWidth(),GraphicsHeight())
|
|
|
|
;
|
|
Goto MainMenu
|
|
End
|
|
|
|
.Game_Start_Loop
|
|
;
|
|
FlushMouse
|
|
|
|
Create_Tunnel()
|
|
lit=CreateLight()
|
|
TurnEntity lit,45,0,0
|
|
|
|
;
|
|
Select Gametype
|
|
Case 1 ;One Player Game
|
|
this.play=Add_Player(player1type,255,255,255,False,0,"Player1")
|
|
Num_Players=1
|
|
Case 2 ;Two Player Game
|
|
this.play=Add_Player(player1type,255,255,255,True,0,"")
|
|
other.play=Add_Player(player2type,255,255,0,True,1,"")
|
|
Num_Players=2
|
|
If Player2type>=5 Then Num_Players=2
|
|
End Select
|
|
|
|
Exited=False
|
|
Go1_timer=0
|
|
Go2_timer=0
|
|
Game_Counter=0
|
|
|
|
dummy=CreatePivot()
|
|
Listen=CreateListener(dummy,.001,10,5)
|
|
While Exited=False
|
|
Game_Counter=Game_Counter+1
|
|
Cls
|
|
TurnEntity lit,1,1,0
|
|
Update_Flash()
|
|
Do_Tunnel_Scroll(Tunnel_tex,1)
|
|
Do_Tunnel_Scroll(tex0,-2)
|
|
Update_Shield_Texture()
|
|
Do_Control()
|
|
|
|
Update_Players()
|
|
Update_Shots()
|
|
Update_Objects()
|
|
Update_Smoke()
|
|
Change_Tunnel_Colors()
|
|
If (Game_Counter Mod 100)=0 Then Alter_Tunnel_Colors()
|
|
;
|
|
If cnt=0 Then
|
|
cnt=10+(10*(3-G_Diff))
|
|
Add_Object(Rnd(-300,300),Rnd(-300,300),9000,-1,Rnd(10,70),Rnd(50,150),Rand(1,3))
|
|
; Add_Object(ppop,0,10000,-1,50,4,1000)
|
|
ppop=ppop+20
|
|
End If
|
|
;
|
|
If KeyHit(1) Then Num_Players=0:Exited=True
|
|
;
|
|
cnt=cnt-1
|
|
;
|
|
UpdateWorld
|
|
RenderWorld
|
|
|
|
lastplayer=Do_GameOver_Overlay()
|
|
If lastplayer>=5 Then ppp=100
|
|
If ppp>0 Then
|
|
ppp=ppp-1
|
|
If ppp=2 Then Exited=True
|
|
End If
|
|
Update_Players_Views()
|
|
Flip
|
|
Wend
|
|
FreeEntity dummy
|
|
;Check High Scores
|
|
Select gametype
|
|
Case 1 ;One player Game
|
|
Check_Highs(score(0),1)
|
|
Case 2 ;two player Game
|
|
If player1type<=4 Then
|
|
Check_Highs(score(0),1)
|
|
End If
|
|
If player2type<=4 Then
|
|
Check_Highs(score(1),2)
|
|
End If
|
|
End Select
|
|
FreeEntity lit
|
|
FreeEntity Tunnel_Mesh
|
|
FreeEntity Background
|
|
Free_Smoke()
|
|
Free_Shots()
|
|
Delete_Objects()
|
|
Delete_Players()
|
|
FlushMouse
|
|
VWait 50
|
|
Goto MainMenu
|
|
;
|
|
;
|
|
Function Do_GameOver_Overlay()
|
|
If Go1_Timer>0 Then
|
|
Go1_Timer=Go1_timer-1
|
|
If Go1_Timer>2 Then
|
|
If Num_Players=1 Then pos=0 Else pos=GraphicsHeight()/4
|
|
If Go2_Timer>2 Then pos=0
|
|
DrawImage gover_image,0,pos
|
|
Else
|
|
If Num_Players=0 Then
|
|
Exited=True
|
|
Else
|
|
lastplayer=Resize_Last_Player()
|
|
End If
|
|
End If
|
|
End If
|
|
If Go2_Timer>0 Then
|
|
Go2_Timer=Go2_timer-1
|
|
If Go2_Timer>2 Then
|
|
If Num_Players=1 Then pos=GraphicsHeight()/2 Else pos=GraphicsHeight()/4
|
|
If Go1_Timer>2 Then pos=GraphicsHeight()/2
|
|
DrawImage gover_image,0,pos
|
|
Else
|
|
If Num_Players=0 Then
|
|
Exited=True
|
|
Else
|
|
lastplayer=Resize_Last_Player()
|
|
End If
|
|
End If
|
|
End If
|
|
Return lastplayer
|
|
End Function
|
|
;
|
|
;
|
|
Function Update_Shield_Texture()
|
|
shield_tex_pos=shield_tex_pos+.01
|
|
If shield_tex_pos>1 Then shield_tex_pos=shield_tex_pos-1
|
|
PositionTexture shield_tex,shield_tex_pos,shield_tex_pos
|
|
End Function
|
|
; Create Scrolling tunnel No entity movement done
|
|
; at all. Texture scrolling screates the effect
|
|
; Makes controling bad guys a whole lot easier..
|
|
;
|
|
Function Create_Tunnel()
|
|
Tunnel_mesh=CreateCylinder(12)
|
|
FlipMesh Tunnel_mesh
|
|
ScaleMesh Tunnel_mesh,500,12000,500
|
|
RotateEntity Tunnel_mesh,90,0,0
|
|
EntityTexture Tunnel_mesh,Tunnel_tex,0,0
|
|
EntityType tunnel_mesh,TYPE_TUNNEL
|
|
PositionEntity tunnel_mesh,0,0,11400
|
|
EntityColor tunnel_mesh,255,100,0
|
|
t_r1=255:ta_r1=t_r1
|
|
t_g1=100:ta_g1=t_g1
|
|
t_b1=0:ta_b1=t_b1
|
|
|
|
BackGround=CreateCylinder(12)
|
|
FlipMesh BackGround
|
|
ScaleMesh BackGround,510,12000,510
|
|
RotateEntity BackGround,90,0,0
|
|
EntityTexture BackGround,tex0,0,0
|
|
PositionEntity BackGround,0,0,11400
|
|
EntityColor BackGround,0,255,255
|
|
t_r2=0:ta_r2=t_r2
|
|
t_g2=255:ta_g2=t_g2
|
|
t_b2=255:ta_b2=t_b2
|
|
End Function
|
|
|
|
Function Change_Tunnel_Colors()
|
|
If t_r1>ta_r1 Then t_r1=t_r1-1
|
|
If t_g1>ta_g1 Then t_g1=t_g1-1
|
|
If t_b1>ta_b1 Then t_b1=t_b1-1
|
|
If t_r2>ta_r2 Then t_r2=t_r2-1
|
|
If t_g2>ta_g2 Then t_g2=t_g2-1
|
|
If t_b2>ta_b2 Then t_b2=t_b2-1
|
|
|
|
If t_r1<ta_r1 Then t_r1=t_r1+1
|
|
If t_g1<ta_g1 Then t_g1=t_g1+1
|
|
If t_b1<ta_b1 Then t_b1=t_b1+1
|
|
If t_r2<ta_r2 Then t_r2=t_r2+1
|
|
If t_g2<ta_g2 Then t_g2=t_g2+1
|
|
If t_b2<ta_b2 Then t_b2=t_b2+1
|
|
EntityColor Tunnel_mesh,t_r1,t_g1,t_b1
|
|
EntityColor Background,t_r2,t_g2,t_b2
|
|
End Function
|
|
|
|
Function Alter_Tunnel_Colors()
|
|
ta_r1=Rand(10,255):ta_g1=Rand(10,255):ta_b1=Rand(10,255)
|
|
ta_r2=Rand(10,255):ta_g2=Rand(10,255):ta_b2=Rand(10,255)
|
|
End Function
|
|
|
|
Function Resize_Images(Width,Height)
|
|
ResizeImage TitleScreen1,Width,Height
|
|
ResizeImage gover_image,Width,Height/2
|
|
End Function
|
|
;
|
|
;
|
|
;
|
|
Function Load_media()
|
|
Tunnel_tex=LoadTexture("tex0.bmp",6):ScaleTexture Tunnel_tex,1,2
|
|
tex0=LoadTexture("tex0.bmp"):ScaleTexture tex0,.5,.5
|
|
Shield_tex=LoadTexture("tex1.bmp",3)
|
|
Rock_Tex=LoadTexture("stone04.bmp")
|
|
;
|
|
; Global Meshes
|
|
;
|
|
Aster_mesh=LoadMesh("asteroid.3ds"):EntityTexture Aster_Mesh,Rock_tex
|
|
ScaleMesh Aster_mesh,.005,.005,.005
|
|
HideEntity Aster_Mesh
|
|
;
|
|
player_mesh=LoadMesh("hfighter.3ds")
|
|
ScaleEntity player_mesh,8,9,11
|
|
HideEntity player_mesh
|
|
;
|
|
shield_mesh=CreateSphere()
|
|
ScaleEntity shield_mesh,55,35,60
|
|
EntityTexture shield_mesh,shield_tex
|
|
HideEntity shield_mesh
|
|
;
|
|
missile1_mesh=LoadMesh("missile1.3ds")
|
|
RotateMesh missile1_mesh,Pi,0,0
|
|
ScaleMesh missile1_mesh,2,2,2
|
|
temptex=LoadTexture("tex2.bmp")
|
|
EntityTexture missile1_mesh,temptex
|
|
HideEntity missile1_mesh
|
|
FreeTexture temptex
|
|
;
|
|
Bad01_mesh=CreateSphere()
|
|
HideEntity bad01_mesh
|
|
|
|
claw_anim_mesh=LoadAnimMesh("claw.3ds")
|
|
HideEntity claw_anim_mesh
|
|
;
|
|
;
|
|
; Sprites
|
|
;
|
|
shot1_spr=LoadSprite("shot1.bmp")
|
|
HideEntity shot1_spr
|
|
ScaleSprite shot1_spr,32,16
|
|
;
|
|
For a=1 To 4
|
|
b$="smoke"+a+".bmp"
|
|
smoke_spr(a)=LoadSprite(b$)
|
|
HideEntity smoke_spr(a)
|
|
Next
|
|
target_spr=LoadSprite("target.bmp"):HideEntity target_spr
|
|
|
|
|
|
;
|
|
; 2DImages
|
|
Titlescreen1=LoadImage("title.bmp")
|
|
Mousepointer=LoadImage("mouse.bmp"):MaskImage MousePointer,255,255,0
|
|
Lives_Image=LoadImage("lives.bmp")
|
|
Gover_Image=LoadImage("go.bmp")
|
|
;
|
|
|
|
;
|
|
;Sounds
|
|
Shoot1_wave=LoadSound("shoot.wav")
|
|
Explode_Wave=LoadSound("boom.wav")
|
|
End Function
|
|
|
|
Function Free_media()
|
|
If Tunnel_tex<>0 Then FreeTexture tunnel_tex:tunnel_tex=0
|
|
If tex0<>0 Then FreeTexture tex0:tex0=0
|
|
If Shield_tex<>0 Then FreeTexture Shield_Tex:Shield_Tex=0
|
|
If Rock_Tex<>0 Then FreeTexture Rock_Tex:Rock_Tex=0
|
|
If temptex<>0 Then FreeTexture temptex:temptex=0
|
|
|
|
;
|
|
; Global Meshes
|
|
;
|
|
If Aster_mesh<>0 Then FreeEntity Aster_mesh:Aster_Mesh=0
|
|
If player_mesh<>0 Then FreeEntity player_mesh:player_mesh=0
|
|
If shield_mesh<>0 Then FreeEntity shield_mesh:shield_mesh=0
|
|
If missile1_mesh<>0 Then FreeEntity missile1_mesh:missile1_mesh=0
|
|
;
|
|
If Bad01_mesh<>0 Then FreeEntity bad01_mesh:Bad01_mesh=0
|
|
If Claw_Anim_Mesh<>0 Then FreeEntity Claw_Anim_Mesh:Claw_Anim_Mesh=0
|
|
;
|
|
;
|
|
; Sprites
|
|
;
|
|
If shot1_spr<>0 Then FreeEntity shot1_spr:shot1_spr=0
|
|
;
|
|
For a=1 To 4
|
|
If smoke_spr(a)<>0 Then FreeEntity smoke_spr(a):smoke_spr(a)=0
|
|
Next
|
|
If target_spr<>0 Then FreeEntity target_spr:Target_Spr=0
|
|
;
|
|
; 2DImages
|
|
If Titlescreen1<>0 Then FreeImage Titlescreen1:Titlescreen1=0
|
|
If Mousepointe<>0 Then FreeImage MousePointer:MousePointer=0
|
|
If Lives_Image<>0 Then FreeImage Lives_image:Lives_image=0
|
|
If Gover_Image<>0 Then FreeImage Gover_Image:Gover_Image=0
|
|
;
|
|
;Sounds
|
|
If Shoot1_wave<>0 Then FreeSound Shoot1_wave:Shoot1_wave=0
|
|
If Explode_Wave<>0 Then FreeSound Explode_Wave:Explode_Wave=0
|
|
End Function
|
|
|
|
|
|
;
|
|
; Trick scrolling
|
|
; Move the texture
|
|
Function Do_Tunnel_Scroll(texture,div#)
|
|
Tunnel_Texture_Coord=Tunnel_Texture_Coord+Scroll_speed
|
|
If Tunnel_Texture_Coord>1 Then Tunnel_Texture_Coord=Tunnel_Texture_Coord-1
|
|
PositionTexture texture,Tunnel_Texture_Coord/div,Tunnel_Texture_Coord
|
|
End Function
|
|
|
|
;
|
|
; Control an entity
|
|
;
|
|
; Player functions
|
|
; typ = 1 Mouse controled player
|
|
; 2 ana Joy Controlled player
|
|
; 3 dig Joy controlled player
|
|
; 4 keyboard controlled player
|
|
; 5 CPU Controlled player
|
|
; 6 internet player ** TO DO **
|
|
Function Do_Control()
|
|
For a.play=Each play
|
|
If a\dead=False Then
|
|
Select a\con
|
|
Case 1 ;Mouse Controlled
|
|
Do_MouseMove(a)
|
|
Case 2 ;analog controlled
|
|
Do_JoyMove(a)
|
|
Case 3 ;directional joy controlled
|
|
Do_JoyDirMove(a)
|
|
Case 4 ;keyboard controlled
|
|
Do_KeyMove(a)
|
|
Case 5 ;CPU Controlled
|
|
CPU_Move(a)
|
|
Case 6 ;Internet controlled
|
|
End Select
|
|
End If
|
|
Next
|
|
End Function
|
|
|
|
Function Do_MouseMove(a.play)
|
|
dx#=MouseXSpeed()/2
|
|
dy#=MouseYSpeed()/2
|
|
If dx>0 Then a\roll=a\roll-4
|
|
If dx<0 Then a\roll=a\roll+4
|
|
If dy>0 Then a\pich=a\pich-4
|
|
If dy<0 Then a\pich=a\pich+4
|
|
If a\pich<>0 Then a\pich=a\pich*.85
|
|
If a\roll<>0 Then a\roll=a\roll*.85
|
|
RotateEntity a\piv,a\pich,0,a\roll
|
|
TranslateEntity a\piv,dx,dy,0
|
|
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
|
|
If MouseDown(1) Then Add_Shot(a\piv,1,10,a)
|
|
End Function
|
|
|
|
Function Do_JoyMove(a.play)
|
|
dx#=JoyX()
|
|
dy#=JoyY()
|
|
If dx>-Dead_BandX And dx<Dead_BandX Then dx=0
|
|
If dy>-Dead_BandY And dy<Dead_BandY Then dy=0
|
|
dx=dx*5
|
|
dy=dy*5
|
|
If dx>0 Then a\roll=a\roll-4
|
|
If dx<0 Then a\roll=a\roll+4
|
|
If dy>0 Then a\pich=a\pich-4
|
|
If dy<0 Then a\pich=a\pich+4
|
|
If a\pich<>0 Then a\pich=a\pich*.85
|
|
If a\roll<>0 Then a\roll=a\roll*.85
|
|
RotateEntity a\piv,a\pich,0,a\roll
|
|
TranslateEntity a\piv,dx,dy,0
|
|
If JoyDown(1) Then Add_Shot(a\piv,1,10,a)
|
|
End Function
|
|
|
|
Function Do_JoyDirMove(a.play)
|
|
dx#=JoyXDir()*5
|
|
dy#=JoyYDir()*5
|
|
If dx>0 Then a\roll=a\roll-4
|
|
If dx<0 Then a\roll=a\roll+4
|
|
If dy>0 Then a\pich=a\pich-4
|
|
If dy<0 Then a\pich=a\pich+4
|
|
If a\pich<>0 Then a\pich=a\pich*.85
|
|
If a\roll<>0 Then a\roll=a\roll*.85
|
|
RotateEntity a\piv,a\pich,0,a\roll
|
|
TranslateEntity a\piv,dx,dy,0
|
|
If JoyDown(1) Then Add_Shot(a\piv,1,10,a)
|
|
End Function
|
|
|
|
Function Do_KeyMove(a.play)
|
|
If KeyDown(Keys(1)) Then dx#=-5
|
|
If KeyDown(Keys(2)) Then dx#=5
|
|
If KeyDown(Keys(3)) Then dy#=-5
|
|
If KeyDown(Keys(4)) Then dy#=5
|
|
If dx>0 Then a\roll=a\roll-4
|
|
If dx<0 Then a\roll=a\roll+4
|
|
If dy>0 Then a\pich=a\pich-4
|
|
If dy<0 Then a\pich=a\pich+4
|
|
If a\pich<>0 Then a\pich=a\pich*.85
|
|
If a\roll<>0 Then a\roll=a\roll*.85
|
|
RotateEntity a\piv,a\pich,0,a\roll
|
|
TranslateEntity a\piv,dx,dy,0
|
|
If KeyDown(keys(5)) Then Add_Shot(a\piv,1,10,a)
|
|
End Function
|
|
|
|
Function CPU_Move(a.play)
|
|
b.Obj=Find_Closest_Target()
|
|
If b<>Null Then
|
|
dx#=(EntityX(b\piv)-EntityX(a\piv))/60
|
|
dy#=(EntityY(b\piv)-EntityY(a\piv))/60
|
|
If dx>0 Then a\roll=a\roll-2
|
|
If dx<0 Then a\roll=a\roll+2
|
|
If dy>0 Then a\pich=a\pich-2
|
|
If dy<0 Then a\pich=a\pich+2
|
|
If a\pich<>0 Then a\pich=a\pich*.85
|
|
If a\roll<>0 Then a\roll=a\roll*.85
|
|
RotateEntity a\piv,a\pich,0,a\roll
|
|
TranslateEntity a\piv,dx,dy,0
|
|
ent=LinePick(EntityX(a\piv),EntityY(a\piv),EntityZ(a\piv)+50,0,0,5000)
|
|
If dx>-2.5 And dx<2.5 Then
|
|
If dy>-2.5 And dy<2.5 Then
|
|
Add_Shot(a\piv,1,10,a)
|
|
End If
|
|
End If
|
|
End If
|
|
End Function
|
|
|
|
Function Find_Obj_From_Ent.Obj(ent)
|
|
For a.obj=Each obj
|
|
If a\piv=ent Or a\ent=ent Then Return a
|
|
Next
|
|
Return Null
|
|
End Function
|
|
|
|
Function Find_Closest_Target.Obj()
|
|
z#=1000000
|
|
minz#=100
|
|
For a.Obj=Each Obj
|
|
If EntityZ(a\piv,True)>0 Then
|
|
If EntityZ(a\piv,True)<z And EntityZ(a\piv,True)>minz Then target.Obj=a:z=EntityZ(a\piv,True)
|
|
End If
|
|
Next
|
|
Return target
|
|
End Function
|
|
;
|
|
Type play
|
|
Field name$
|
|
Field rate
|
|
Field ox#
|
|
Field cam
|
|
Field con
|
|
Field piv
|
|
Field ent
|
|
Field shield_ent
|
|
Field glow#
|
|
Field dead
|
|
Field pich#
|
|
Field roll#
|
|
Field shield#
|
|
Field score
|
|
Field waiting
|
|
Field id
|
|
;
|
|
Field tlx
|
|
Field tly
|
|
Field brx
|
|
Field bry
|
|
Field lives
|
|
End Type
|
|
|
|
;
|
|
;
|
|
;
|
|
Type shot
|
|
Field typ
|
|
Field ent
|
|
Field life#
|
|
Field dx#
|
|
Field dy#
|
|
Field dz#
|
|
Field speed#
|
|
Field ang#
|
|
Field firer.play
|
|
Field target.Obj
|
|
End Type
|
|
|
|
;
|
|
; Object
|
|
;
|
|
; 1-3 are asteroids
|
|
Type Obj
|
|
Field typ
|
|
Field piv
|
|
Field ent
|
|
Field val
|
|
Field col
|
|
Field cd
|
|
Field speed#
|
|
Field dx#
|
|
Field dy#
|
|
Field ds#
|
|
Field fx
|
|
Field fy
|
|
Field dir
|
|
Field st
|
|
Field cnt
|
|
End Type
|
|
|
|
;
|
|
; Smoke Effect
|
|
;
|
|
Type smoke
|
|
Field alpha#
|
|
Field reduct#
|
|
Field ent
|
|
Field size#
|
|
Field rot#
|
|
Field disp#
|
|
End Type
|
|
|
|
.MainMenu
|
|
SetBuffer BackBuffer()
|
|
Cls
|
|
FlushMouse:FlushKeys
|
|
|
|
Game_Start=False
|
|
Exit_Game=False
|
|
Options=False
|
|
|
|
While Not Game_Start=True
|
|
cntr=cntr+1
|
|
If MouseXSpeed()+MouseYSpeed()<>0 Then cntr=0
|
|
|
|
Cls
|
|
DrawImage TitleScreen1,0,0
|
|
|
|
sel=0
|
|
If cntr<500 Then
|
|
Draw_Menu(True,0,0)
|
|
sel=Draw_Menu(False,-2,-2)
|
|
If MouseHit(1) Then
|
|
Select sel
|
|
Case 1
|
|
If gametype=1 Then gametype=2 Else gametype=1
|
|
Case 2
|
|
player1type=player1type+1
|
|
If player1type>6 Then player1type=1
|
|
If player2type=player1type Then player1type=player1type+1
|
|
Case 3
|
|
player2type=player2type+1
|
|
If player2type>6 Then player2type=1
|
|
If player2type=player1type Then player2type=player2type+1
|
|
Case 4
|
|
Game_Start=True
|
|
Options=True
|
|
Case 5
|
|
Case 6
|
|
If player1type<>6 And player2type<>6 Then
|
|
Game_Start=True
|
|
End If
|
|
Case 7
|
|
Exit_Game=True
|
|
Game_Start=True
|
|
End Select
|
|
End If
|
|
Else
|
|
If cntr>1000 Then cntr=0
|
|
Draw_Highs(True,0,0)
|
|
Draw_Highs(False,-2,-2)
|
|
End If
|
|
DrawImage MousePointer,MouseX(),MouseY()
|
|
Flip
|
|
Wend
|
|
cntr=0
|
|
If Options=True Then Goto Options
|
|
If Exit_Game=True Then Goto Exit_Game_Sub
|
|
If Game_Start=True Then Goto Game_Start_Loop
|
|
RuntimeError "Game Ended Abnormally"
|
|
EndGraphics
|
|
End
|
|
|
|
|
|
;
|
|
; Exit Game / Save Highs etc
|
|
; Do Credits
|
|
.Exit_Game_Sub
|
|
Save_Highscores()
|
|
ChangeDir ".."
|
|
EndGraphics
|
|
End
|
|
;
|
|
;
|
|
;Save Highscores and options
|
|
Function Load_Highscores()
|
|
p=0
|
|
file=ReadFile("../Highs/Highs.Hsr")
|
|
For a=1 To 10
|
|
Hn$(a)=ReadLine$(file)
|
|
Hs(a)=ReadInt(file)
|
|
Next
|
|
G_Brightness=ReadInt(file)
|
|
G_StartLives=ReadInt(file)
|
|
G_Diff=ReadInt(file)
|
|
G_CurrentGFX=ReadInt(file)
|
|
End Function
|
|
|
|
Function Save_Highscores()
|
|
p=0
|
|
file=WriteFile("../Highs/Highs.Hsr")
|
|
For a=1 To 10
|
|
WriteLine file,Hn$(a)
|
|
WriteInt file,Hs(a)
|
|
Next
|
|
WriteInt file,G_Brightness
|
|
WriteInt file,G_StartLives
|
|
WriteInt file,G_Diff
|
|
WriteInt file,G_CurrentGFX
|
|
End Function
|
|
|
|
Function Draw_Menu(col,ox,oy)
|
|
sel=0
|
|
For a=1 To 7
|
|
b$=""
|
|
If col=True Then Color 0,0,0 Else Color 255,255,255
|
|
p=0
|
|
Select a
|
|
Case 1
|
|
b$=Menu$(a)+GM_TYPE(gametype)
|
|
Case 2
|
|
b$=Menu$(a)+CN_TYPE(player1type)
|
|
Case 3
|
|
If gametype=2 Then
|
|
b$=Menu$(a)+CN_TYPE(player2type)
|
|
End If
|
|
Default
|
|
b$=Menu(a)
|
|
End Select
|
|
c#=(Float(a)*32)/2
|
|
w=Len(b$)*8
|
|
y=GraphicsHeight()/2
|
|
y=((y-c)+a*32)-oy
|
|
x=(GraphicsWidth()/2)-ox-(w/2)
|
|
h=16
|
|
If RectsOverlap(x,y,w,h,MouseX(),MouseY(),1,1) Then sel=a:p=1
|
|
If p<>0 And col=False Then Color Rnd(255),Rnd(255),Rnd(255)
|
|
Text x,y,b$
|
|
Next
|
|
Return sel
|
|
End Function
|
|
|
|
|
|
;
|
|
;Draw High's
|
|
Function Draw_Highs(col,ox,oy)
|
|
For a=1 To 10
|
|
If col=True Then Color 0,0,0 Else Color 255,255,255
|
|
b$=a+" "+hn$(a)+" "+hs(a)
|
|
c#=(Float(a)*32)/2
|
|
w=Len(b$)*8
|
|
y=GraphicsHeight()/2
|
|
y=((y-c)+a*32)-oy
|
|
x=(GraphicsWidth()/2)-ox-(w/2)
|
|
h=16
|
|
Text x,y,b$
|
|
Next
|
|
End Function
|
|
|
|
Function Check_Highs(score,id)
|
|
If score>hs(10) Then ; Got a high Score
|
|
ps=0
|
|
For a=10 To 1 Step -1
|
|
If score>hs(a) Then
|
|
ps=a
|
|
hs(a+1)=hs(a)
|
|
hn(a+1)=hn(a)
|
|
End If
|
|
Next
|
|
If ps<>0 Then
|
|
hs(ps)=score
|
|
SetBuffer FrontBuffer()
|
|
Cls
|
|
DrawImage TitleScreen1,0,0
|
|
Color 0,0,0
|
|
Text 0,GraphicsHeight()/2,"Well Done Player "+id+". Your On the High Score Table",0,1
|
|
Color 255,255,255
|
|
Text 2,2+GraphicsHeight()/2,"Well Done Player "+id+". Your On the High Score Table",0,1
|
|
Locate GraphicsWidth/2,GraphicsHeight()/2+16
|
|
hn(ps)=Input$("Enter Your Name ?")
|
|
SetBuffer BackBuffer()
|
|
cntr=1000
|
|
End If
|
|
End If
|
|
End Function
|
|
|
|
.dats
|
|
;Game Type
|
|
Data "One Player Game"
|
|
Data "Two Player Game"
|
|
|
|
;Control Type
|
|
Data "Mouse Control"
|
|
Data "Analog Joystick"
|
|
Data "Digital Joystick"
|
|
Data "Keyboard (Not Recommended)"
|
|
Data "CPU"
|
|
Data "Network Game(Not Availible)"
|
|
|
|
;Menus
|
|
Data "Game Type:"
|
|
Data "Player One Control:"
|
|
Data "Player Two Control:"
|
|
Data "Options"
|
|
Data ""
|
|
Data "START GAME"
|
|
Data "QUIT GAME"
|
|
|
|
.highs
|
|
Data "David Bird",100000
|
|
Data "Made With",90000
|
|
Data "The Great",80000
|
|
Data "Blitz Basic3D",70000
|
|
Data "(c)2001 David Bird",60000
|
|
Data "Donna Bird",50000
|
|
Data "Jessica Bird",40000
|
|
Data "Rebecca Bird",30000
|
|
Data "Daniel Bird",20000
|
|
Data "David Bird",10000
|
|
Data "",0
|
|
|
|
.Options
|
|
Create_Tunnel()
|
|
OptTunnel=CopyEntity(Tunnel_Mesh):FreeEntity Tunnel_Mesh
|
|
OptBackground=CopyEntity(Background):FreeEntity Background
|
|
|
|
Optlight=CreateLight()
|
|
TurnEntity OptLight,45,0,0
|
|
OptCamera=CreateCamera()
|
|
CameraRange Optcamera,1,25000
|
|
|
|
While Not KeyDown(1)
|
|
|
|
|
|
AmbientLight G_Brightness,G_Brightness,G_Brightness
|
|
UpdateWorld
|
|
RenderWorld
|
|
G_Brightness=Draw_slider("Brightness",50,50,300,16,G_Brightness,255,5,50)
|
|
G_StartLives=Draw_slider("Number of Lives",50,75,300,16,G_StartLives,5,1,150)
|
|
If G_StartLives<1 Then G_StartLives=1
|
|
G_Diff=Draw_slider("Difficulty",50,100,300,16,G_Diff,3,1,150)
|
|
G_CurrentGFX=Draw_GFX_Selector(G_CurrentGFX,50,130)
|
|
DrawImage MousePointer,MouseX(),MouseY()
|
|
|
|
Text GraphicsWidth()/2,GraphicsHeight()-16,"Press Escape to Return to Main Menu",1,0
|
|
Flip
|
|
Wend
|
|
|
|
If OptLight<>0 Then FreeEntity OptLight:OptLight=0
|
|
If OptTunnel<>0 Then FreeEntity OptTunnel:OptTunnel=0
|
|
If OptBackground<>0 Then FreeEntity OptBackground:OptBackground=0
|
|
If OptCamera<>0 Then FreeEntity OptCamera:OptCamera=0
|
|
Goto MainMenu
|
|
|
|
Function Draw_slider(txt$,x,y,Ln#,hg,pos#,scale#,Stp,dely)
|
|
sel=0
|
|
Rect x,y,ln,hg,0
|
|
Rect x+ln,y,16,hg,0:Text x+ln+8,y+(hg/2)-1,"-",1,1
|
|
If RectsOverlap(x+ln,y,16,16,MouseX(),MouseY(),1,1) Then sel=1
|
|
Rect x+ln+16,y,16,hg,0:Text x+ln+24,y+(hg/2)-1,"+",1,1
|
|
If RectsOverlap(x+ln+16,y+(hg/2)-1,16,16,MouseX(),MouseY(),1,1) Then sel=2
|
|
ps=(ln/scale)*pos
|
|
Rect ps+x,y,2,hg,1
|
|
Text x+ln+38,y,txt+" "+Int(Pos)
|
|
newval=pos
|
|
If MouseDown(1) And sel<>0 Then
|
|
Delay dely
|
|
If sel=1 And newval>0 Then newval=newval-stp
|
|
If sel=2 And newval<scale Then newval=newval+stp
|
|
End If
|
|
If newval<0 Then newval=0
|
|
If newval>scale Then newval=scale
|
|
Return newval
|
|
End Function
|
|
|
|
Function Draw_GFX_Selector(current,x,y)
|
|
Rect x-4,y-4,150,24,0
|
|
sel=0
|
|
Rect x+150,y-4,16,24,0:Text x+158,y+6,"-",1,1
|
|
If RectsOverlap(x+150,y-4,16,24,MouseX(),MouseY(),1,1) Then sel=1
|
|
Rect x+166,y-4,16,24,0:Text x+172,y+6,"+",1,1
|
|
If RectsOverlap(x+166,y-4,16,24,MouseX(),MouseY(),1,1) Then sel=2
|
|
Rect x+182,y-4,24,24,0:Text x+194,y+6,"GO",1,1
|
|
If RectsOverlap(x+182,y-4,24,24,MouseX(),MouseY(),1,1) Then sel=3
|
|
|
|
p.GfxMode=First GfxMode
|
|
For r=1 To current
|
|
p=After p
|
|
Next
|
|
Text x,y,p\t$
|
|
|
|
If MouseDown(1) And sel<>0 Then
|
|
Delay 100
|
|
If sel=1 And current>1 Then current=current-1
|
|
If sel=2 And current<Max_GFXModes Then current=current+1
|
|
If sel=3 Then ;Reset GFXMODE
|
|
If OptLight<>0 Then FreeEntity OptLight:OptLight=0
|
|
If OptTunnel<>0 Then FreeEntity OptTunnel:OptTunnel=0
|
|
If OptBackground<>0 Then FreeEntity OptBackground:OptBackground=0
|
|
If OptCamera<>0 Then FreeEntity OptCamera:OptCamera=0
|
|
Set_GFXMode()
|
|
Create_Tunnel()
|
|
OptTunnel=CopyEntity(Tunnel_Mesh):FreeEntity Tunnel_Mesh
|
|
OptBackground=CopyEntity(Background):FreeEntity Background
|
|
|
|
Optlight=CreateLight()
|
|
TurnEntity OptLight,45,0,0
|
|
OptCamera=CreateCamera()
|
|
CameraRange Optcamera,1,25000
|
|
End If
|
|
End If
|
|
Return current
|
|
End Function
|
|
|
|
Type GfxMode
|
|
Field width,height,depth
|
|
Field t$
|
|
End Type
|
|
|
|
Function Get_GFX_Modes()
|
|
cnt=0
|
|
For k=1 To CountGfxModes()
|
|
If GfxMode3D(k)
|
|
t.GfxMode=New GfxMode
|
|
t\width=GfxModeWidth(k)
|
|
t\height=GfxModeHeight(k)
|
|
t\depth=GfxModeDepth(k)
|
|
t\t$=t\width+","+t\height+","+t\Depth
|
|
cnt=cnt+1
|
|
EndIf
|
|
Next
|
|
Max_GFXModes=cnt-1
|
|
End Function
|
|
|
|
Function Set_GFXMode()
|
|
m.GfxMode=First GfxMode
|
|
For r=1 To G_CurrentGFX
|
|
m=After m
|
|
Next
|
|
Free_Media()
|
|
ClearCollisions
|
|
Graphics3D m\width,m\height,m\depth,1
|
|
SetBuffer BackBuffer()
|
|
Load_Media()
|
|
Text GraphicsWidth()/2,GraphicsHeight()/2,"Please Wait Initialising Graphics",1,1
|
|
Flip
|
|
Resize_Images(GraphicsWidth(),GraphicsHeight())
|
|
;Do Collision Table Here
|
|
Collisions TYPE_CAM,TYPE_TUNNEL,2,2
|
|
Collisions TYPE_PLAYER,TYPE_TUNNEL,2,2
|
|
Collisions TYPE_ASTER,TYPE_PLAYER,1,2
|
|
|
|
Collisions TYPE_PLAYER,TYPE_ASTER,1,2
|
|
|
|
Collisions TYPE_SHOT1,TYPE_ASTER,1,1
|
|
Collisions TYPE_PLAYER,TYPE_PLAYER,1,1
|
|
Collisions TYPE_PLAYER,TYPE_CLAW,2,2
|
|
|
|
End Function |