484 lines
9.9 KiB
BlitzBasic
484 lines
9.9 KiB
BlitzBasic
;
|
|
;
|
|
; Game Functions
|
|
|
|
;
|
|
; EFX functions smoke first
|
|
;
|
|
|
|
Function Update_Smoke()
|
|
For a.smoke=Each smoke
|
|
TranslateEntity a\ent,0,0,-EFX_SPEED
|
|
ScaleSprite a\ent,a\size,a\size
|
|
EntityAlpha a\ent,a\alpha
|
|
a\size=a\size+a\disp
|
|
a\alpha=a\alpha-a\reduct
|
|
a\rot=a\rot+1
|
|
RotateSprite a\ent,a\rot
|
|
If a\alpha<.1 Or EntityZ(a\ent)<CameraZpos Then
|
|
FreeEntity a\ent
|
|
Delete a
|
|
smk=smk-1
|
|
End If
|
|
Next
|
|
End Function
|
|
|
|
Function Add_Smoke_puff(size#,dis#,rduct#,x#,y#,z#,r,g,b)
|
|
smk=smk+1
|
|
a.smoke=New smoke
|
|
a\size=size
|
|
a\disp=dis
|
|
a\alpha=.6
|
|
a\reduct=rduct
|
|
a\ent=CopyEntity(smoke_spr(Rand(1,4)))
|
|
EntityColor a\ent,r,g,b
|
|
ScaleSprite a\ent,size,size
|
|
PositionEntity a\ent,x,y,z
|
|
Return a\ent
|
|
End Function
|
|
|
|
Function Add_White_Smoke(size#,x#,y#,z#)
|
|
ent=Add_Smoke_puff(size,.2,.04,x,y,z,255,255,255)
|
|
Return ent
|
|
End Function
|
|
|
|
Function Add_Color_Smoke(size,x#,y#,z#,r,g,b)
|
|
ent=Add_Smoke_puff(size,.2,.04,x,y,z,r,g,b)
|
|
Return ent
|
|
End Function
|
|
|
|
;
|
|
;Delete all smoke
|
|
Function Free_Smoke()
|
|
For a.smoke=Each smoke
|
|
If a\ent FreeEntity a\ent
|
|
Next
|
|
Delete Each smoke
|
|
End Function
|
|
|
|
;
|
|
;Asteroid functions
|
|
Function Add_Object(x#,y#,z#,dir,speed#,size#,typ)
|
|
a.Obj=New Obj
|
|
a\speed=speed
|
|
a\dir=dir
|
|
a\typ=typ
|
|
a\st=False
|
|
a\piv=CreatePivot()
|
|
|
|
Select a\typ
|
|
Case 1 ;Normal asteroid
|
|
a\ent=CopyEntity(Aster_mesh,a\piv)
|
|
ScaleEntity a\ent,size,size,size
|
|
RotateEntity a\ent,Rnd(360),Rnd(360),Rnd(360)
|
|
PositionEntity a\piv,x,y,z
|
|
EntityType a\piv,TYPE_ASTER
|
|
EntityPickMode a\ent,2
|
|
EntityRadius a\piv,size
|
|
a\val=100
|
|
Case 2 ;Double Points
|
|
a\ent=CopyEntity(Aster_mesh,a\piv)
|
|
ScaleEntity a\ent,size,size,size
|
|
RotateEntity a\ent,Rnd(360),Rnd(360),Rnd(360)
|
|
PositionEntity a\piv,x,y,z
|
|
EntityType a\piv,TYPE_ASTER
|
|
EntityPickMode a\ent,2
|
|
EntityRadius a\piv,size
|
|
a\val=200
|
|
EntityColor a\ent,255,255,0
|
|
Case 3
|
|
a\ent=CopyEntity(Aster_mesh,a\piv)
|
|
ScaleEntity a\ent,size,size,size
|
|
RotateEntity a\ent,Rnd(360),Rnd(360),Rnd(360)
|
|
PositionEntity a\piv,x,y,z
|
|
EntityType a\piv,TYPE_ASTER
|
|
EntityPickMode a\ent,2
|
|
EntityRadius a\piv,size
|
|
a\val=500
|
|
EntityColor a\ent,255,0,0
|
|
a\col=240
|
|
a\cd=10
|
|
Case 10
|
|
a\ent=CopyEntity(Bad01_mesh,a\piv)
|
|
ScaleEntity a\ent,size,size,size
|
|
PositionEntity a\piv,x,y,z
|
|
a\dx=0
|
|
a\dy=0
|
|
EntityType a\piv,TYPE_ASTER
|
|
EntityPickMode a\ent,2
|
|
EntityRadius a\piv,size
|
|
a\val=1500
|
|
EntityColor a\ent,255,0,0
|
|
a\ds=100
|
|
a\fx=x
|
|
a\fy=y
|
|
Case 1000 ;Claw
|
|
a\ent=CopyEntity(Claw_Anim_Mesh,a\piv)
|
|
ScaleEntity a\ent,size,size,size
|
|
PositionEntity a\piv,800*Cos(x),800*Sin(x),z
|
|
RotateEntity a\piv,0,0,x-180
|
|
a\dx=0
|
|
a\dy=0
|
|
EntityType GetChild(a\ent,1),TYPE_CLAW
|
|
a\ds=100
|
|
a\fx=x
|
|
a\fy=y
|
|
Animate a\ent,3,Rnd(.3,3)
|
|
End Select
|
|
End Function
|
|
|
|
;Update Asteroids
|
|
Function Update_Objects()
|
|
For a.Obj=Each Obj
|
|
Select a\typ
|
|
Case 1
|
|
Control_Asteroid(a,1)
|
|
Case 2
|
|
Control_Asteroid(a,2)
|
|
Case 3
|
|
Control_Asteroid(a,3)
|
|
Case 1000
|
|
If EntityZ(a\piv)>CameraZpos Then
|
|
TranslateEntity a\piv,0,0,a\speed*a\dir
|
|
Else
|
|
FreeEntity a\ent
|
|
FreeEntity a\piv
|
|
Delete a
|
|
End If
|
|
End Select
|
|
|
|
Next
|
|
End Function
|
|
|
|
Function Control_Asteroid(a.Obj,typ)
|
|
Select a\typ
|
|
Case 3
|
|
EntityColor a\ent,a\col,255-a\col,0
|
|
a\col=a\col-a\cd
|
|
If a\col<140 Or a\col>250 Then a\cd=-a\cd
|
|
End Select
|
|
If EntityZ(a\piv)>CameraZpos Then
|
|
TurnEntity a\piv,2,0,0.5
|
|
TranslateEntity a\piv,-a\dx,-a\dy,a\speed*a\dir
|
|
Else
|
|
FreeEntity a\ent
|
|
FreeEntity a\piv
|
|
Delete a
|
|
End If
|
|
End Function
|
|
|
|
;Delete all objects
|
|
Function Delete_Objects()
|
|
For a.Obj=Each Obj
|
|
If a\ent FreeEntity a\ent
|
|
If a\piv FreeEntity a\piv
|
|
Delete a
|
|
Next
|
|
End Function
|
|
|
|
;
|
|
; Shooting funcitons
|
|
;
|
|
Function Add_Shot.shot(ent,typ,dir,firer.play)
|
|
If firer<>Null Then
|
|
If firer\rate>0 Then Return
|
|
End If
|
|
a.shot=New shot
|
|
a\typ=typ
|
|
a\firer=firer
|
|
Select typ
|
|
Case 1
|
|
If firer<>Null Then
|
|
a\firer\rate=6
|
|
End If
|
|
a\speed=8
|
|
a\dx=0
|
|
a\dy=0
|
|
a\dz=dir
|
|
a\life=125
|
|
a\ent=CopyEntity(shot1_spr,ent)
|
|
If firer<>Null Then
|
|
PositionEntity a\ent,a\firer\ox,0,10
|
|
a\firer\ox=-a\firer\ox
|
|
End If
|
|
EntityParent a\ent,0
|
|
EntityRadius a\ent,8
|
|
EntityType a\ent,TYPE_SHOT1
|
|
EmitSound Shoot1_wave,a\ent
|
|
End Select
|
|
Return a
|
|
End Function
|
|
|
|
;
|
|
;Update all players shots
|
|
Function Update_Shots()
|
|
For a.shot=Each shot
|
|
a\life=a\life-1
|
|
Select a\typ
|
|
Case 1
|
|
TranslateEntity a\ent,a\dx,a\dy,a\dz*a\speed
|
|
a\ang=a\ang+5
|
|
RotateSprite a\ent,a\ang
|
|
End Select
|
|
If a\life<100 Then
|
|
EntityAlpha a\ent,a\life/10
|
|
End If
|
|
If a\life<1 Then
|
|
FreeEntity a\ent
|
|
Delete a
|
|
Else
|
|
If CountCollisions(a\ent)>0
|
|
For b=1 To CountCollisions(a\ent)
|
|
ent=CollisionEntity(a\ent,b)
|
|
x#=EntityX(ent)
|
|
y#=EntityY(ent)
|
|
z#=EntityZ(ent)
|
|
Set_Flash()
|
|
For c=1 To 2
|
|
add_color_smoke(275,x+Rnd(-2,2),y+Rnd(-2,2),z,255,10,0)
|
|
add_color_smoke(170,x+Rnd(-2,2),y+Rnd(-2,2),z,255,200,0)
|
|
ent2=add_white_smoke(140,x+Rnd(-2,2),y+Rnd(-2,2),z)
|
|
Next
|
|
PositionEntity ent,EntityX(ent),EntityY(ent),-1000
|
|
EmitSound Explode_wave,ent2
|
|
Next
|
|
FreeEntity a\ent
|
|
If a\firer<>Null Then
|
|
a\firer\score=a\firer\score+150
|
|
End If
|
|
Delete a
|
|
End If
|
|
End If
|
|
Next
|
|
End Function
|
|
|
|
;Delete all shots
|
|
Function Free_Shots()
|
|
For a.shot=Each shot
|
|
If a\ent FreeEntity a\ent
|
|
Delete a
|
|
Next
|
|
End Function
|
|
;
|
|
; 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 Add_Player.play(typ,r,g,b,split,id,n$)
|
|
a.play=New play
|
|
a\dead=False
|
|
a\con=typ
|
|
a\id=id
|
|
a\name=n
|
|
a\lives=G_StartLives
|
|
a\tlx=0
|
|
a\tly=0
|
|
a\score=0
|
|
a\ox=15
|
|
a\brx=GraphicsWidth()
|
|
a\bry=GraphicsHeight()
|
|
a\piv=CreatePivot()
|
|
EntityRadius a\piv,40
|
|
EntityType a\piv,TYPE_PLAYER
|
|
a\ent=CopyEntity(player_mesh,a\piv)
|
|
EntityColor a\ent,r,g,b
|
|
a\shield=100
|
|
a\shield_ent=CopyEntity(shield_mesh,a\piv)
|
|
;
|
|
a\cam=CreateCamera()
|
|
CameraRange a\cam,1,24000
|
|
CameraFogRange a\cam,12000,24000
|
|
CameraFogMode a\cam,1
|
|
PositionEntity a\cam,0,0,CameraZpos
|
|
EntityType a\cam,TYPE_CAM
|
|
EntityRadius a\cam,40
|
|
If split=True Then
|
|
Select id
|
|
Case 0
|
|
CameraViewport a\cam,0,0,GraphicsWidth(),GraphicsHeight()/2
|
|
a\tlx=0
|
|
a\tly=0
|
|
a\brx=GraphicsWidth()
|
|
a\bry=GraphicsHeight()/2
|
|
Case 1
|
|
CameraViewport a\cam,0,GraphicsHeight()/2,GraphicsWidth(),GraphicsHeight()/2
|
|
a\tlx=0
|
|
a\tly=GraphicsHeight()/2
|
|
a\brx=GraphicsWidth()
|
|
a\bry=GraphicsHeight()
|
|
End Select
|
|
End If
|
|
;
|
|
Return a
|
|
End Function
|
|
|
|
;
|
|
;Main players update
|
|
Function Update_Players()
|
|
For a.play=Each play
|
|
|
|
;
|
|
;
|
|
If a\rate>0 Then a\rate=a\rate-1
|
|
score(a\id)=a\score
|
|
EntityAlpha a\shield_ent,a\glow
|
|
If a\dead=False
|
|
If a\glow>0 Then a\glow=a\glow-.05
|
|
PositionEntity a\piv,EntityX(a\piv),EntityY(a\piv),0
|
|
PositionEntity a\cam,EntityX(a\cam),EntityY(a\cam),CameraZpos
|
|
If Cheater=False Then ;Cheat Mode
|
|
cnt=CountCollisions(a\piv)
|
|
If cnt>0 Then
|
|
For b=1 To cnt
|
|
te=CollisionEntity(a\piv,cnt)
|
|
add_color_Smoke(25,CollisionX(a\piv,b),CollisionY(a\piv,b),CollisionZ(a\piv,b),255,Rnd(100,200),Rnd(100,200))
|
|
If te<>Tunnel_Mesh Then
|
|
a\shield=a\shield-10
|
|
Else
|
|
a\shield=a\shield-.5
|
|
End If
|
|
a\glow=1
|
|
Next
|
|
End If
|
|
End If
|
|
;
|
|
; Do Camera Code
|
|
;
|
|
dx#=EntityX(a\piv,True)-EntityX(a\cam,True)
|
|
dy#=EntityY(a\piv,True)-(EntityY(a\cam,True)-30)
|
|
TranslateEntity a\cam,dx*.05,dy*.05,0
|
|
;
|
|
If a\shield<20 And a\shield>0 Then
|
|
add_color_Smoke(15,EntityX(a\piv)+Rnd(-1,1),EntityY(a\piv),EntityZ(a\piv),255,Rnd(50,140),Rnd(50,140))
|
|
End If
|
|
If a\shield<100 And a\shield>0 Then
|
|
a\shield=a\shield+.01
|
|
End If
|
|
If a\shield<0 Then
|
|
a\dead=True
|
|
a\lives=a\lives-1
|
|
End If
|
|
|
|
If a\dead=True Then
|
|
PositionEntity a\piv,0,0,CameraZpos-100
|
|
a\waiting=(CameraZpos-100)
|
|
a\shield=100
|
|
End If
|
|
Else ;If dead the do dead routene
|
|
If a\waiting<0 Then
|
|
ResetEntity a\piv
|
|
PositionEntity a\piv,EntityX(a\piv),EntityY(a\piv),a\waiting
|
|
a\waiting=a\waiting+1
|
|
ResetEntity a\piv
|
|
Update_PLCam(a)
|
|
RotateEntity a\piv,0,0,0
|
|
Else
|
|
a\dead=False
|
|
End If
|
|
End If
|
|
If a\lives=0 Then
|
|
score(a\id)=a\score
|
|
Cls
|
|
Num_Players=Num_Players-1
|
|
Select a\id
|
|
Case 0
|
|
Go1_timer=300
|
|
Case 1
|
|
Go2_timer=300
|
|
End Select
|
|
Free_Player(a)
|
|
End If
|
|
Next
|
|
End Function
|
|
|
|
Function Resize_Last_Player()
|
|
For a.play=Each play
|
|
CameraViewport a\cam,0,0,GraphicsWidth(),GraphicsHeight()
|
|
a\tlx=0
|
|
a\tly=0
|
|
a\brx=GraphicsWidth()
|
|
a\bry=GraphicsHeight()
|
|
cont=a\con
|
|
Next
|
|
Return cont
|
|
End Function
|
|
|
|
Function Free_Player(a.play)
|
|
If a\shield_ent FreeEntity a\shield_ent
|
|
If a\ent FreeEntity a\ent
|
|
If a\piv FreeEntity a\piv
|
|
If a\cam FreeEntity a\cam
|
|
Delete a
|
|
End Function
|
|
|
|
;
|
|
;Manual update of players camera
|
|
Function Update_PLCam(a.play)
|
|
;
|
|
; Do Camera Code
|
|
;
|
|
dx#=EntityX(a\piv,True)-EntityX(a\cam,True)
|
|
dy#=EntityY(a\piv,True)-(EntityY(a\cam,True)-30)
|
|
TranslateEntity a\cam,dx*.05,dy*.05,0
|
|
End Function
|
|
|
|
;Delete all players in memory
|
|
Function delete_Players()
|
|
For a.play=Each play
|
|
If a\shield_ent FreeEntity a\shield_ent
|
|
If a\ent FreeEntity a\ent
|
|
If a\piv FreeEntity a\piv
|
|
If a\cam FreeEntity a\cam
|
|
Delete a
|
|
Next
|
|
End Function
|
|
|
|
;View Update (players)
|
|
Function Update_Players_Views()
|
|
For a.play=Each play
|
|
Color 255,255,255
|
|
Text a\tlx,a\tly,a\score
|
|
If a\shield<40 Then
|
|
Color 255,255,0
|
|
End If
|
|
If a\shield<20 Then
|
|
Color 255,0,0
|
|
End If
|
|
Rect a\tlx,a\tly+16,a\shield,10
|
|
Color 255,255,255
|
|
Text a\brx-100,a\bry-16,a\name
|
|
Text a\brx-176,a\tly,"Lives:"
|
|
For x=0 To a\lives-1
|
|
DrawImage Lives_image,a\brx-80+(x*16),a\tly
|
|
Next
|
|
Next
|
|
End Function
|
|
|
|
;Find a player from id
|
|
Function Get_Player_id.play(id)
|
|
For a.play=Each play
|
|
If a\id=id Then Return a
|
|
Next
|
|
Return Null
|
|
End Function
|
|
|
|
;
|
|
;Update explosion Flash
|
|
Function Update_Flash()
|
|
AmbientLight Flash_Cnt,Flash_Cnt,Flash_Cnt
|
|
If Flash_Cnt>G_Brightness Then Flash_Cnt=Flash_Cnt-5
|
|
End Function
|
|
|
|
Function Set_Flash()
|
|
Flash_Cnt=255
|
|
End Function
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; |