Anyone fancy adding some bad guys to this?

Miscellaneous Forums/Blitz Showcase/Anyone fancy adding some bad guys to this?

Couldn't resist! Added audio, a few meshes, a particle sprite and a few other odds and ends.

http://www.headpile.com/stuff/shootermedia.zip

Graphics3D 800,600,32,0

SetBuffer BackBuffer()
SeedRnd MilliSecs()


light = CreateLight()

AmbientLight 100,100,100

Global timer# = MilliSecs()
Global score
Global madnum
Global wavenum = 1
Global intermission = False
Global ecount = 0
Global level = 0
Global health = 100
Global wavemax
Global gameover = 1
Global launchtimer

Global shot1 = LoadSound("shot1.ogg")
SoundVolume shot1,.4
Global explosion1 = LoadSound("explosion1.ogg")
SoundVolume explosion1,.6
tune1 = LoadSound("shooter1.ogg")
SoundVolume tune1,.3
LoopSound tune1
PlaySound tune1

Global explsprite = LoadSprite("particle.png",1)
HideEntity explsprite

Global enemy1mesh = LoadMesh("enemy1.3ds")
Global enemy1tex = LoadTexture("enemy1tex.jpg")
EntityTexture enemy1mesh,enemy1tex
HideEntity enemy1mesh

Global proj1 = LoadMesh("proj1.3ds")
EntityTexture proj1,enemy1tex
HideEntity proj1

FreeTexture enemy1tex

Type enemy
	Field mesh
	Field id
	Field angry = False
	Field angerspeed#
	Field xrot#
	Field yrot#
	Field mov#
End Type

;Spacesphere

;Create the Texture
sptex = CreateTexture(1024,1024,1+8)
SetBuffer TextureBuffer(sptex)
For a = 1 To 200
	Plot Rand(0,1023),Rand(0,1023)
Next
SetBuffer BackBuffer()
TextureBlend sptex,5

;Create the Sphere
Global spbox = CreateSphere(5)
ScaleEntity spbox,1000,1000,1000
EntityTexture spbox,sptex
ScaleTexture sptex,.25,.5
EntityFX spbox,1
FlipMesh spbox
EntityOrder spbox,99999

camera = CreateCamera()
MoveEntity camera,0,12,-20

; create cannon
Global base = LoadMesh("weap_plat.3ds")
basetex = LoadTexture("weap_plat.png")
EntityTexture base,basetex
ScaleMesh base,.3,.3,.3
EntityFX base,1
EntityAlpha base,.6
PositionEntity base,0,4,0

barrel = LoadMesh("weap_trigun.3ds")
barreltex = LoadTexture("weap_trigun.png")
EntityTexture barrel,barreltex
ScaleEntity barrel,3,3,3
RotateMesh barrel,0,180,0

Muzzle = CreatePivot(Barrel)
PositionEntity Muzzle,0,0,1

PositionEntity barrel,0,8,0
EntityParent barrel,base

; Make Ground
Global Ground = CreatePlane()
i = CreateImage(64,64)
SetBuffer(ImageBuffer(i))
Color 0,0,0:Rect 0,0,32,32:Rect 32,32,32,32
Color 100,100,100:Rect 32,0,32,32:Rect 0,32,32,32
checker = CreateTexture(64,64)
CopyRect 0,0,64,64,0,0,ImageBuffer(i),TextureBuffer(checker)
FreeImage i
ScaleTexture checker ,50,50
EntityTexture ground,checker

Color 0,200,0

xspin# = 0
yspin# = 0

Repeat
	xspin = xspin - (MouseXSpeed()/15.0) ; make Float
	yspin = yspin - (MouseYSpeed()/15.0) ; make Float
	
	If xspin < -55 Then xspin = -55
	If xspin > 55 Then xspin = 55
	
	If yspin > 10 Then yspin = 10
	If yspin < -75 Then yspin = -75
	
	MoveMouse 320,240
	
	RotateEntity base,0,xspin/12,0
	RotateEntity barrel,yspin,xspin,0
	
	RotateEntity camera,yspin/2,xspin/2,0
	
	updategrenade
	updatepoof
	updateanger
		
	If gameover = 0

		If MouseHit(1) Then
			NewGrenade(Muzzle)
			PlaySound shot1
		EndIf
		
		For e.enemy = Each enemy
			If e\angry = False
				TurnEntity e\mesh,e\xrot,e\yrot,0
				MoveEntity e\mesh,0,0,e\mov
				RotateMesh e\mesh,0,.02,0
			Else
				PointEntity e\mesh,base
				MoveEntity e\mesh,0,0,e\angerspeed#
			EndIf
		Next
		
		TurnEntity spbox,.004,0,0
	Else
		mainmenu()
	EndIf
	
RenderWorld

Text GraphicsWidth()/2,60,"SCORE: "+score,1,1
Text GraphicsWidth()/2,80,"LEVEL: "+level+" WAVES: "+wavemax,1,1

Select True
	Case level = 1
		wavemax = 1
	Case level = 2
		wavemax = 2
	Case level = 3
		wavemax = 3
	Case level = 4
		wavemax = 4
	Case level = 5
		wavemax = 5
	Case level = 6
		level = 1
End Select

If intermission = False 
	If MilliSecs() > timer + 6000
		If wavenum < wavemax
			wavenum = wavenum + 1
			CreateEnemies()
		EndIf
	EndIf
Else
If MilliSecs() < timer
		Text GraphicsWidth()/2,220,"GET READY FOR LEVEL "+(level+1),1,1
		wavenum = 1
	Else
		intermission = False
		level = level + 1
		CreateEnemies()
	EndIf
EndIf

HidePointer()

Flip

Until KeyHit(1)

Type Grenade
	Field Mesh
	Field Phys
	Field Life
	Field Explode
End Type

Type poof
	Field Mesh
	Field Phys
	Field Life
	Field Explode
End Type

Function MainMenu()
		Text GraphicsWidth()/2,200,"GAME OVER",1,1
		Text GraphicsWidth()/2,240,"PRESS SPACE TO START",1,1
		If KeyHit(57)
			FlushMouse()
			gameover = 0
			score = 0
			timer = MilliSecs() + 6000
			intermission = True
		EndIf
		For e.enemy = Each enemy
			FreeEntity e\mesh
			Delete e
		Next
End Function

Function NewGrenade(Launcher)
	C.Grenade = New Grenade
	C\Mesh = CopyEntity (proj1) ;CreateSphere(8)
	ScaleEntity c\mesh,.4,.4,.4
	C\Phys = CreatePivot()
	PositionEntity C\Mesh,EntityX(Launcher,True),EntityY(Launcher,True),EntityZ(Launcher,True)
	RotateEntity c\Phys,EntityPitch(Launcher,True),EntityYaw(Launcher,True),EntityRoll(Launcher,True)
	MoveEntity c\phys,0,0,2
	EntityShininess c\mesh,1
	c\Life = 150
	c\explode = True
End Function

Function Clip(x)
	If x>255 Then x=255
	Return x
End Function

Function NewExplode(Launcher)
	For n=1 To 100
		C.Grenade = New Grenade
		C\Mesh = CopyEntity (explsprite)
		EntityColor C\Mesh,Rand(100,255),Rand(100,255),0
		C\Phys = CreatePivot()
		PositionEntity C\Mesh,EntityX(Launcher,True),EntityY(Launcher,True),EntityZ(Launcher,True)
		ScaleEntity c\mesh,Rnd(.1,.4),Rnd(.1,.4),Rnd(.1,.4)
		PositionEntity c\Phys,Rnd(-.5,.5),Rnd(-1,1),Rnd(-.5,.5)
		EntityBlend c\mesh,3
		c\Life = Rand(5,40)
		c\explode = False
	Next
		PlaySound explosion1
		
End Function

Function EnemyExplode(e.enemy)
	For n=1 To 50
		p.poof = New poof
		p\Mesh = CopyEntity (explsprite)
		EntityColor p\Mesh,0,Rand(10,255),Rand(10,255)
		p\Phys = CreatePivot()
		PositionEntity p\Mesh,EntityX(e\mesh,True),EntityY(e\mesh,True),EntityZ(e\mesh,True)
		ScaleEntity p\mesh,Rnd(.1,.4),Rnd(.1,.4),Rnd(.1,.4)
		PositionEntity p\Phys,Rnd(-.5,.5),Rnd(-1,1),Rnd(-.5,.5)
		EntityBlend p\mesh,3
		p\Life = Rand(5,20)
		p\explode = False
	Next
End Function

Function UpdateGrenade()
	For c.Grenade = Each Grenade
		TranslateEntity c\Mesh,EntityX(c\phys),EntityY(c\phys),EntityZ(c\phys)
		
		TranslateEntity c\phys,0,-.01,0
		
		If EntityY(c\mesh)<.5 Then
			PositionEntity c\mesh,EntityX(c\mesh),.5,EntityZ(c\mesh)
			TranslateEntity c\phys,0,-EntityY(c\phys)*1.5,0			
		EndIf
		
		TurnEntity c\mesh,1,2,4
		
		c\life = c\life - 1 
		
		If c\life = 0 Or MouseHit(2) Then
			CheckEnemy(c) ;time to kill?
			If c\explode Then NewExplode(c\mesh)
			FreeEntity c\mesh
			FreeEntity c\phys
			Delete c
		EndIf
	Next
End Function

Function UpdatePoof()
	For p.poof = Each poof
		TranslateEntity p\Mesh,EntityX(p\phys)*.4,EntityY(p\phys)*.2,EntityZ(p\phys)*.4

		p\life = p\life - 1 
		
		If p\life = 0
			FreeEntity p\mesh
			FreeEntity p\phys
			Delete p
		EndIf
	Next
End Function

Function CheckEnemy(c.grenade)
	For e.enemy = Each enemy
		If EntityDistance (c\mesh,e\mesh) < 10
			If e\angry = False
				score = score + 5
			Else 
				score = score + 10
			EndIf
			EnemyExplode(e)
			ecount = ecount - 1
				If ecount = 0
					intermission = True
					timer = MilliSecs() + 6000
				EndIf
			FreeEntity e\mesh
			Delete e
		EndIf
	Next
End Function

Function CreateEnemies()
	x=-45
	y=10
	z=100
		For i = 1 To 72
		e.enemy = New enemy
		ecount = ecount + 1
		e\id = i
		e\mesh = CopyEntity(enemy1mesh)
		EntityShininess e\mesh,1
		Select True
			Case wavenum = 1
				EntityColor e\mesh,255,255,0
				e\angerspeed = Rnd(.2,.4)
				e\xrot = .8
				e\yrot = 0
				e\mov = -1
			Case wavenum = 2
				EntityColor e\mesh,0,255,255
				e\angerspeed = Rnd(.2,.6)
				e\xrot = .8
				e\yrot = 0
				e\mov = -1
			Case wavenum = 3
				EntityColor e\mesh,255,255,255
				e\angerspeed = Rnd(.4,.7)
				e\xrot = .8
				e\yrot = 0
				e\mov = -1
			Case wavenum = 4
				EntityColor e\mesh,255,0,255
				e\angerspeed = Rnd(.6,.8)
				e\xrot = .8
				e\yrot = 0
				e\mov = -1
			Case wavenum = 5
				EntityColor e\mesh,0,100,255
				e\angerspeed = Rnd(.6,1)
				e\xrot = .8
				e\yrot = 0
				e\mov = -1
		End Select
		
		ScaleEntity e\mesh,.6,.6,.6
		PositionEntity e\mesh,x,y,z
		x=x+5
			If x = 45
				y = y + 10
				x = -45
			EndIf
		Next
	timer = MilliSecs()
End Function

Function updateanger()
	
	For e.enemy = Each enemy
		madnum = Rand(1,3000)
			If e\id = madnum And EntityDistance(e\mesh,base) > 140 And EntityY(e\mesh) < 100
				e\angry = True
				EntityColor e\mesh,255,0,0
			EndIf
			If EntityDistance (e\mesh,base) < 4
				EnemyExplode(e)
				FreeEntity e\mesh
				level = 0				
				gameover = 1
				ecount = ecount - 1
				If ecount = 0
					intermission = True
					timer = MilliSecs() + 6000
				EndIf
				Delete e
			EndIf
	Next
	
End Function