EdzUpAsteroids.bb 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. ;EdzUp Asteroids
  2. ;Written by EdzUp of Stonegoat Software
  3. Graphics3D 640,480,16
  4. SetBuffer BackBuffer()
  5. SeedRnd MilliSecs() ;setup random numbers
  6. Global ArialLarge=LoadFont("arial",72,1,0,0)
  7. Global ArialMid=LoadFont("arial",48,1,0,0)
  8. Global Arial=LoadFont("arial",14,0,0,0)
  9. Global Explode = LoadSound("Explode.wav") ;Asteroid Explosion
  10. Global ShipExplode = LoadSound("Explode1.wav") ;ship Explosion
  11. Global UFOSound = LoadSound("ufo.wav") ;UFO Engine sound
  12. Global Lazer = LoadSound("Lasergun.wav") ;Lazer Sound
  13. Global PlayerHit = LoadSound("hit.wav") ;Player ship hit
  14. Global as#=0
  15. Global UfoSoundChannel=-1 ;ufo sound channel ;)
  16. SetFont Arial
  17. Type AsteroidInfo
  18. Field x,y,z ;Asteroid position in 3d world
  19. Field Model ;handle to Asteroid model
  20. Field speed ;speed asteroid moving
  21. End Type
  22. Type Shots
  23. Field x,y,z ;position in 3d world
  24. Field Model ;Shot Model
  25. Field Timer ;Shot Timer
  26. Field Speed
  27. End Type
  28. Type UFOShots
  29. Field x,y,z ;position in 3d world
  30. Field Model ;Shot Model
  31. Field Timer ;Shot Timer
  32. Field Speed
  33. End Type
  34. Type UFOInfo
  35. Field x,y,z ;position in 3d world
  36. Field Model ;UFO Model
  37. End Type
  38. Type Fragment ;Explosion Fragment
  39. Field x,y,z ;position in 3d world
  40. Field speed
  41. Field timer
  42. Field model
  43. End Type
  44. Type Explode
  45. Field Model ;Entity attached to it
  46. Field Size ;current size
  47. Field mode ;1 it increases in size
  48. Field timer ;explosion timer
  49. End Type
  50. ;************ TRACERS FLAME CODE **************
  51. Global flam = LoadSprite("flame2.bmp")
  52. ScaleSprite flam,50,50
  53. HideEntity flam
  54. Global flam2 = LoadSprite("flame3.bmp") ;UFO Shot
  55. ScaleSprite flam2,50,50
  56. HideEntity flam2
  57. ;**********************************************
  58. Global B3DLogo = LoadImage("b3dlogo.png")
  59. MidHandle B3DLogo
  60. Global TitleTex = LoadImage("Title.png")
  61. MidHandle TitleTex
  62. ;enemy UFO Mesh
  63. Global UFOMesh=LoadMesh("UFO.3ds")
  64. ScaleMesh UFOMesh,50,50,50
  65. HideEntity UFOMesh
  66. ;Load Asteroid Model (Large)
  67. Global LargeAsteroidMesh=LoadMesh("asteroid.3ds")
  68. ScaleMesh LargeAsteroidMesh,60,60,60
  69. HideEntity LargeAsteroidMesh
  70. ;Load Asteroid Model (medium)
  71. Global MediumAsteroidMesh=LoadMesh("asteroid.3ds")
  72. ScaleMesh MediumAsteroidMesh,30,30,30
  73. HideEntity MediumAsteroidMesh
  74. ;Load Asteroid Model (small)
  75. Global SmallAsteroidMesh=LoadMesh("asteroid.3ds")
  76. ScaleMesh SmallAsteroidMesh,15,15,15
  77. HideEntity SmallAsteroidMesh
  78. ;Load Player Model
  79. Global PlayerMesh=LoadMesh("hfighter.3ds")
  80. ScaleMesh PlayerMesh,1,1,1
  81. HideEntity PlayerMesh
  82. ;create backdrop
  83. Global Stary=CreateBrush()
  84. BrushColor Stary,155,155,155
  85. StarTex=LoadTexture("Stars.bmp")
  86. ScaleTexture startex,.1,.1
  87. BrushTexture Stary,StarTex
  88. Global BackdropSphere=CreateSphere()
  89. EntityTexture BackDropsphere,startex
  90. HideEntity BackdropSphere
  91. ScaleMesh BackdropSphere,-30000,-30000,-30000 ;negative value so player can be put inside
  92. ;and still see the texture ;)
  93. ;setup entity types
  94. Const PLAYER_TYPE =1
  95. Const CAMERA_TYPE =2
  96. Const UFOSHOT_TYPE =3
  97. Const PLAYERSHOT_TYPE =5
  98. Const UFO_TYPE =6
  99. Const ASTEROID_TYPE =10
  100. ;setup collision system
  101. ;1 is player
  102. ;3 UFO Shots
  103. ;5 player shots
  104. ;6 is UFO's
  105. ;10 are asteroids
  106. Collisions PLAYER_TYPE, ASTEROID_TYPE,1,2
  107. Collisions CAMERA_TYPE, UFOSHOT_TYPE,1,2
  108. Collisions PLAYERSHOT_TYPE, ASTEROID_TYPE,1,2
  109. Collisions UFOSHOT_TYPE, PLAYER_TYPE,1,2
  110. Collisions PLAYER_TYPE, UFOSHOT_TYPE,1,2
  111. Collisions PLAYER_TYPE, UFO_TYPE,1,2
  112. Collisions PLAYERSHOT_TYPE, UFO_TYPE,1,2
  113. Light=CreateLight(1)
  114. Global Pivot=CreatePivot()
  115. EntityType Pivot,PLAYER_TYPE
  116. EntityRadius pivot,7
  117. ;create camera
  118. Global camera=CreateCamera(pivot) ;Or nothing will be drawn
  119. CameraRange camera,1,45000 ;were in space ;)
  120. ;CameraFogRange camera,44500,45000
  121. ;CameraFogColor camera,0,0,0
  122. EntityType camera,PLAYER_TYPE
  123. EntityRadius camera,7
  124. Global Backing=CopyEntity(BackDropsphere)
  125. Global PlayShip=CopyEntity(PlayerMesh,0)
  126. EntityType PlayShip,1
  127. EntityRadius playship,150
  128. PositionEntity PlayShip,EntityX#(pivot),EntityY#(pivot),EntityZ#(pivot)
  129. RotateEntity PlayShip,EntityPitch#(pivot),EntityYaw#(pivot),EntityRoll#(pivot)
  130. MoveEntity PlayShip,0,0,-3.5
  131. .restart
  132. ;declare a few globals
  133. Global UFOCount=0 ;number of UFO's in local area
  134. Global PlayerScore=0
  135. Global HighScore=10000
  136. Global PlayerLives=3
  137. Global PX,PY,PZ ;player position
  138. Global FX,FY,FZ ;player facing
  139. Global AsteroidCount=5 ;number of asteroids in this level
  140. Global Level=1 ;level player is on
  141. Global ExtraLife=10000 ;Extra Life at 10000 points
  142. Global Damage=100 ;how many damage points player has
  143. Global Speed=0 ;current players ship speed
  144. Global Actual=0 ;Actual speed
  145. Global Roll#=0 ;Ships Rolling
  146. Global Hits=0 ;Shots hit
  147. Global Fired=0 ;Shots fired
  148. Global Accuracy=0 ;Accuracy
  149. Global Asteroids=0 ;Current Asteroid number
  150. Global TextTimer=0 ;Text Timer for messages
  151. Global BonusTextTimer=0;Timer for Bonuses
  152. Global BonusText$="" ;message
  153. Global BonusTime=0 ;Timer for Bonus (0 means its run out ;) )
  154. Global Bonus=0 ;Bonus Active
  155. Global GodMode=0 ;1 if godmode active
  156. Global ShotTime=0 ;Shot Timer
  157. Global MaxTime=10 ;Max Shot Timer
  158. Global UFOShotTime=0 ;UFO Firing Timer
  159. Global OldDamage=0 ;Old damage for God Mode
  160. Global Endgame=0 ;1 if player has been killed (and all his lives have run out)
  161. CameraClsColor camera,0,0,0 ;set camera refresh color to black
  162. AmbientLight 255,255,255
  163. Title()
  164. CreateLevel(1)
  165. texttimer=100
  166. Repeat
  167. If GodMode=1 Then OldDamage=Damage
  168. Cls
  169. mxs=MouseXSpeed() ;get mouse speed
  170. mys=MouseYSpeed()
  171. MoveMouse 320,240 ;reset mouse to center of screen (so mousex speed doesnt stop)
  172. TurnEntity Pivot,mys,-mxs,0
  173. If KeyDown(200)=1 Then Speed=Speed+2 ;up
  174. If KeyDown(208)=1 Then Speed=Speed-2 ;down
  175. If KeyDown(203)=1 Then Roll#=Roll#-0.5;left
  176. If KeyDown(205)=1 Then Roll#=Roll#+0.5;right
  177. If Speed<0 Then Speed=0
  178. If Speed>100 Then Speed=100
  179. If Actual>Speed Then Actual=Actual-1
  180. If Actual<Speed Then Actual=Actual+1
  181. MoveEntity pivot,0,0,Actual
  182. TurnEntity pivot,0,0,Roll#
  183. PositionEntity PlayShip,EntityX#(pivot),EntityY#(pivot),EntityZ#(pivot)
  184. RotateEntity PlayShip,EntityPitch#(pivot),EntityYaw#(pivot),EntityRoll#(pivot)
  185. MoveEntity PlayShip,0,0,-3.5
  186. If MouseDown(1)=1 And shottime<=0 Then FireShot(Pivot)
  187. If ShotTime>0 Then ShotTime=ShotTime-1
  188. Roll=0
  189. UpdateLevel()
  190. updateExplosions()
  191. UFOAppear=Rnd(100000)
  192. If UFOAppear<50
  193. PlaceUFO()
  194. EndIf
  195. If Damage<1
  196. PlaySound shipexplode
  197. ClearLevel()
  198. CreateLevel(Level)
  199. PositionEntity camera,0,0,0
  200. texttimer=100
  201. Damage=100
  202. PlayerLives=PlayerLives-1
  203. EndIf
  204. If PlayerLives<0 And texttime<1
  205. Repeat
  206. Until MouseDown(1)=0 And MouseDown(2)=0
  207. ClearLevel()
  208. Goto restart
  209. EndIf
  210. If PlayerLives<0
  211. Endgame=1
  212. texttime=200
  213. EndIf
  214. If Asteroids<1
  215. EndOfLevelAnim()
  216. AccuracyBonus()
  217. ClearLevel()
  218. Level=Level+1
  219. CreateLevel(Level)
  220. PositionEntity camera,0,0,0
  221. texttimer=100
  222. EndIf
  223. PositionEntity PlayShip,EntityX#(pivot),EntityY#(pivot),EntityZ#(pivot)
  224. RotateEntity PlayShip,EntityPitch#(pivot),EntityYaw#(pivot),EntityRoll#(pivot)
  225. MoveEntity PlayShip,0,0,-4.5
  226. UpdateWorld
  227. RenderWorld
  228. If Texttimer>0
  229. SetFont ariallarge
  230. Color 255,255,255
  231. If endgame=0 Then Text 320,240,"LEVEL "+Level,1,1
  232. If endgame=1 Then Text 320,240,"GAME OVER",1,1
  233. SetFont arial
  234. TextTimer=TextTimer-1
  235. EndIf
  236. If BonusTexttimer>0
  237. SetFont arialMid
  238. Color 255,255,255
  239. Text 320,420,BonusText$,1,1
  240. SetFont arial
  241. BonusTextTimer=BonusTextTimer-1
  242. EndIf
  243. BonusTime=BonusTime-5
  244. If BonusTime<1
  245. MaxTime=10
  246. GodMode=0
  247. BonusTime=-2
  248. EndIf
  249. If PlayerScore>=HighScore
  250. HighScore=PlayerScore
  251. SetFont arial
  252. Text 320,60,"YOU HAVE A HIGH SCORE",1,1
  253. EndIf
  254. If PlayerScore>ExtraLife
  255. BonusText$="Extra Life"
  256. BonusTextTimer=100
  257. PlayerLives=PlayerLives+1
  258. ExtraLife=ExtraLife*2
  259. EndIf
  260. ShowStats()
  261. Flip
  262. TestCollisions()
  263. If GodMode=1 Then Damage=OldDamage
  264. Until KeyDown(1)=1
  265. End
  266. Function AccuracyBonus()
  267. a=0
  268. If (Hits>Fired/4)*3 Then a=75
  269. If Hits=Fired Then a=100
  270. Select a
  271. Case 100:BonusText$="Accuracy Bonus"
  272. BonusTextTimer=100
  273. PlayerScore=PlayerScore+1000
  274. Case 75 :BonusText$="Accuracy Bonus"
  275. BonusTextTimer=100
  276. PlayerScore=PlayerScore+500
  277. End Select
  278. Hits=0
  279. Fired=0
  280. Accuracy=-1
  281. End Function
  282. Function PlaceUFO()
  283. UFO.UFOInfo = New UFOInfo
  284. UFO\x=Rnd(-10000,10000)
  285. UFO\y=Rnd(-10000,10000)
  286. UFO\z=-10000
  287. UFO\Model=CopyEntity(UFOMesh,0)
  288. EntityType UFO\Model,6 ;Set UFO Type to 6
  289. EntityRadius UFO\Model,150
  290. PositionEntity UFO\Model,UFO\x,UFO\y,UFO\z
  291. UFOCount=UFOCount+1
  292. End Function
  293. Function explosion(entity)
  294. Boom.Explode = New explode
  295. Boom\Model = CopyEntity(flam)
  296. PositionEntity boom\Model,EntityX#(entity),EntityY#(entity),EntityZ#(entity)
  297. PointEntity Boom\Model,pivot
  298. Boom\Size=5
  299. Boom\Mode=1
  300. Boom\Timer=0
  301. Fragments=Rnd(20)+10
  302. For a=0 To Fragments
  303. Frag.Fragment = New Fragment
  304. Frag\Model = CopyEntity(Flam)
  305. PositionEntity Frag\Model,EntityX#(entity),EntityY#(entity),EntityZ#(entity)
  306. TurnEntity Frag\Model,Rnd(360),Rnd(360),Rnd(360)
  307. Frag\Speed = (Rnd(5)+1)*5
  308. Frag\Timer = 0
  309. Next
  310. End Function
  311. Function UpdateExplosions()
  312. For Boom.Explode=Each explode
  313. If Boom<>Null
  314. If Boom\mode=1
  315. Boom\Size=5+(Boom\Timer)
  316. Else
  317. Boom\Size=5+(25-(Boom\Timer-25))
  318. EndIf
  319. ScaleSprite Boom\Model,Boom\size*25,Boom\size*25
  320. Boom\Timer=Boom\Timer+1
  321. If Boom\Timer>25 Then Boom\Mode=0
  322. If Boom\Timer>50
  323. FreeEntity Boom\Model
  324. Delete Boom
  325. EndIf
  326. EndIf
  327. Next
  328. For Frag.Fragment = Each fragment
  329. If Frag<>Null
  330. MoveEntity Frag\Model,0,0,Frag\Speed
  331. Frag\Timer = Frag\Timer + 1
  332. If Frag\Timer>50
  333. FreeEntity Frag\Model
  334. Delete Frag
  335. EndIf
  336. EndIf
  337. Next
  338. End Function
  339. Function UFOFire(entity)
  340. ;ufo firing function
  341. PlaySound Lazer
  342. UFOShot.UFOShots = New UFOShots ;create another Shot
  343. UFOShot\Model = CopyEntity(flam2)
  344. EntityType UFOShot\Model,3
  345. UFOShot\Speed=50
  346. PositionEntity UFOShot\Model,EntityX#(entity),EntityY#(entity),EntityZ#(entity)
  347. TurnEntity UFOShot\Model,EntityPitch#(entity),EntityYaw#(entity),EntityRoll#(entity)
  348. PointEntity UFOShot\Model,Pivot ;make shot face player (so shot moves towards player)
  349. End Function
  350. Function EndOfLevelAnim()
  351. ;remember old cam position
  352. ox#=EntityX#(pivot)
  353. oy#=EntityY#(pivot)
  354. oz#=EntityZ#(pivot)
  355. ofx#=EntityPitch#(pivot)
  356. ofy#=EntityYaw#(pivot)
  357. ofz#=EntityRoll#(pivot)
  358. ;create a player ship
  359. Ship=CopyEntity(PlayerMesh,0)
  360. PositionEntity Ship,0,0,0
  361. PositionEntity pivot,250,120,250 ;position camera to get a good view ;)
  362. PointEntity pivot,ship ;point camera (attached to pivot) at ship
  363. ScaleEntity ship,3,3,3 ;scale ship so it looks better
  364. timer=50
  365. xm=0
  366. ;move ship
  367. Repeat
  368. MoveEntity ship,0,0,1
  369. UpdateWorld
  370. RenderWorld
  371. Flip
  372. timer=timer-1
  373. If KeyDown(1)=1 Then End
  374. Until timer<1
  375. timer=25
  376. ScaleEntity ship,3,3,12 ;scale ship to make it look like its jumping
  377. ;move ship forwards
  378. Repeat
  379. MoveEntity ship,0,0,-50
  380. UpdateWorld
  381. RenderWorld
  382. Flip
  383. timer=timer-1
  384. If KeyDown(1)=1 Then End
  385. Until timer<1
  386. jumpstar=CopyEntity(flam2)
  387. PositionEntity jumpstar,EntityX#(ship),EntityY#(ship),EntityZ#(ship)
  388. FreeEntity ship
  389. For a=1 To 10
  390. ScaleSprite jumpstar,50*a,50*a
  391. UpdateWorld
  392. RenderWorld
  393. Flip
  394. Next
  395. For a=10 To 1 Step -1
  396. ScaleSprite jumpstar,50*a,50*a
  397. UpdateWorld
  398. RenderWorld
  399. Flip
  400. Next
  401. FreeEntity jumpstar
  402. UpdateWorld
  403. RenderWorld
  404. Flip
  405. ;restore camera position (attached to the pivot)
  406. PositionEntity pivot,ox#,oy#,oz#
  407. RotateEntity pivot,ofx#,ofy#,ofz#
  408. End Function
  409. Function FireShot(entity)
  410. PlaySound Lazer
  411. Shot.Shots = New Shots ;create another Shot
  412. Shot\Model = CopyEntity(flam) ;copy Tracers Sprite Entity ;)
  413. EntityType Shot\Model,5
  414. PositionEntity Shot\Model,EntityX#(Pivot),EntityY#(Pivot),EntityZ#(Pivot)
  415. TurnEntity Shot\Model,EntityPitch#(Pivot),EntityYaw#(Pivot),EntityRoll#(Pivot)
  416. Shot\Speed = 50+(Actual+5)
  417. ShotTime=MaxTime
  418. Fired=Fired+1
  419. End Function
  420. Function NewAsteroid(Entity,speed)
  421. ;when something hits an asteroid this function creates new asteroids
  422. If speed=5 Then count=Rnd(3,5)
  423. If speed=10 Then count=Rnd(2,4)
  424. Asteroids=Asteroids+count
  425. For a=1 To count
  426. Asteroid.AsteroidInfo=New AsteroidInfo
  427. Asteroid\x=EntityX#(entity)
  428. Asteroid\y=EntityY#(entity)
  429. Asteroid\z=EntityZ#(entity)
  430. If speed=5 Then Asteroid\Speed=10
  431. If speed=10 Then Asteroid\Speed=20
  432. If speed=5 Then Asteroid\Model=CopyEntity(MediumAsteroidMesh,0)
  433. If speed=10 Then Asteroid\Model=CopyEntity(SmallAsteroidMesh,0)
  434. If speed=5 Then EntityRadius Asteroid\Model,200
  435. If speed=10 Then EntityRadius Asteroid\Model,150
  436. If speed=5 Or speed=10
  437. PositionEntity Asteroid\Model,Asteroid\x,Asteroid\y,Asteroid\z
  438. RotateEntity Asteroid\Model,Rnd(360),Rnd(360),Rnd(360)
  439. EntityType Asteroid\Model,10
  440. Else
  441. FreeEntity Asteroid\Model
  442. Delete Asteroid
  443. Asteroids=Asteroids-1
  444. EndIf
  445. Next
  446. FreeEntity entity
  447. Asteroids=Asteroids-1
  448. End Function
  449. Function TestCollisions()
  450. ;function to check collisions
  451. For Asteroid.AsteroidInfo=Each AsteroidInfo
  452. If Asteroid<>Null
  453. ;if player has collided with asteroid
  454. If EntityCollided(Asteroid\Model,1)
  455. Actual=0
  456. If speed>0
  457. damage=damage-(speed/2)
  458. Else
  459. damage=damage-5
  460. EndIf
  461. Speed=0
  462. EndIf
  463. If EntityCollided(Asteroid\Model,5) ;if asteroid and player shot collides
  464. Hits=Hits+1
  465. PlaySound Explode
  466. Explosion(Asteroid\Model)
  467. If asteroid\Speed=5 Or asteroid\speed=10 Then NewAsteroid(Asteroid\Model,Asteroid\Speed)
  468. If asteroid\speed=5 Then PlayerScore=PlayerScore+10
  469. If asteroid\speed=10 Then PlayerScore=PlayerScore+20
  470. If asteroid\Speed=20
  471. PlayerScore=PlayerScore+50
  472. FreeEntity Asteroid\Model
  473. Asteroids=Asteroids-1
  474. EndIf
  475. Delete Asteroid
  476. EndIf
  477. EndIf
  478. Next
  479. For UFO.UFOInfo = Each UFOInfo
  480. If UFO<>Null
  481. If EntityCollided(Ufo\Model,1)
  482. Actual=0
  483. Speed=0
  484. EndIf
  485. If EntityCollided(Ufo\Model,5)
  486. Hits=Hits+1
  487. PlaySound ShipExplode
  488. Explosion(UFO\Model)
  489. PlayerScore=PlayerScore+200
  490. Bonus=Rnd(50)
  491. If Bonus<10
  492. BonusTextTimer=100
  493. Bonus=Rnd(7)
  494. If Bonus<0 Then Bonus=0
  495. If Bonus>5 Then Bonus=5
  496. If Bonus=0
  497. BonusText$="Rapid Fire"
  498. MaxTime=1
  499. BonusTime=10000
  500. EndIf
  501. If Bonus=1
  502. BonusText$="Extra Life"
  503. PlayerLives=PlayerLives+1
  504. BonusTime=0
  505. EndIf
  506. If Bonus=2
  507. BonusText$="Full Repair"
  508. Damage=100
  509. OldDamage=100
  510. BonusTime=0
  511. EndIf
  512. If Bonus=3
  513. BonusText$="Extra Score"
  514. PlayerScore=PlayerScore+1000
  515. BonusTime=0
  516. EndIf
  517. If Bonus=4
  518. BonusText$="Level Skip"
  519. Asteroids=0
  520. BonusTime=0
  521. EndIf
  522. If Bonus=5
  523. BonusText$="God Mode"
  524. GodMode=1
  525. BonusTime=10000
  526. OldDamage=Damage
  527. EndIf
  528. EndIf
  529. UFOCount=UFOCount-1
  530. FreeEntity UFO\Model
  531. Delete UFO
  532. EndIf
  533. EndIf
  534. Next
  535. ;ufo shots collide with player (type 1) damageing them
  536. For UFOShot.UFOShots = Each UFOShots
  537. If UFOShot<>Null
  538. If EntityCollided(UFOShot\Model,1) ;if shot hits pivot
  539. PlaySound PlayerHit
  540. Damage=Damage-10
  541. FreeEntity UFOShot\Model
  542. Delete UFOShot
  543. EndIf
  544. If UFOShot<>Null
  545. If EntityCollided(UFOShot\Model,2) ;if shot hits cam
  546. PlaySound PlayerHit
  547. Damage=Damage-10
  548. FreeEntity UFOShot\Model
  549. Delete UFOShot
  550. EndIf
  551. EndIf
  552. EndIf
  553. Next
  554. For Shot.Shots = Each Shots
  555. If Shot<>Null
  556. del=0
  557. If EntityCollided(Shot\Model,10)
  558. del=1
  559. EndIf
  560. If EntityCollided(Shot\Model,6)
  561. del=1
  562. EndIf
  563. If del=1
  564. FreeEntity Shot\Model
  565. Delete Shot
  566. EndIf
  567. EndIf
  568. Next
  569. End Function
  570. Function ShowStats()
  571. ;player information
  572. Color 255,255,255
  573. SetFont Arialmid
  574. Text 320,20,PlayerScore,1,1
  575. SetFont arial
  576. If PlayerLives>-1
  577. Text 10,10,"LIVES "+PlayerLives,0,0
  578. Else
  579. Text 10,10,"LIVES 0"
  580. EndIf
  581. If BonusTime>0
  582. Rect 519,9,102,22,0
  583. Color 255,0,0
  584. Rect 520,10,BonusTime/100,20,1
  585. Color 255,255,255
  586. Text 570,20,"BONUS",1,1
  587. EndIf
  588. If UFOCount>0
  589. Color 255,0,0
  590. Text 320,280,"-UFO ALERT-",1,1
  591. EndIf
  592. Color 255,255,255
  593. Rect 9,449,102,22,0
  594. Color 0,255,0
  595. Rect 10,450,Damage,20,1
  596. Color 255,0,0
  597. Text 60,460,"DAMAGE",1,1
  598. Color 255,255,255
  599. Rect 519,449,102,22,0
  600. Color 0,255,0
  601. If speed>0 Then Rect 520,450,Speed,10,1
  602. Color 0,0,255
  603. If Actual>0 Then Rect 520,460,Actual,10,1
  604. Color 255,0,0
  605. Text 570,460,"THRUST",1,1
  606. Color 255,255,255
  607. Line 310,240,315,240
  608. Line 325,240,330,240
  609. Line 320,230,320,235
  610. Line 320,245,320,250
  611. End Function
  612. Function Title()
  613. Repeat
  614. Until MouseDown(1)=0 And MouseDown(2)=0
  615. CreateLevel(20)
  616. While MouseDown(1)=0 And MouseDown(2)=0
  617. Cls
  618. PositionEntity backing,0,0,0
  619. UpdateLevel()
  620. di=0
  621. If KeyDown(1)=1 Then End
  622. UpdateWorld
  623. RenderWorld
  624. SetFont ArialLarge
  625. DrawImage TitleTex,320,260
  626. Color 0,0,0
  627. Rect 120,30,400,180
  628. DrawImage B3dLogo,320,120
  629. SetFont Arial
  630. Color 255,255,255
  631. Text 320,10,"Hi Score : "+HighScore,1,1
  632. Text 320,300,"Coded by EdzUp of Stonegoat Software",1,1
  633. Text 320,320,"Controls are as follows:",1
  634. Text 320,340,"Mouse - Move around",1
  635. Text 320,360,"Cursor Up - Speed Up",1
  636. Text 320,380,"Cursor Down - Slow Down",1
  637. Text 320,400,"Mouse Left Button - Fire weapons",1
  638. Text 320,460,"Click mouse to start game",1,1
  639. Flip
  640. Wend
  641. Repeat
  642. Until MouseDown(1)=0 And MouseDown(2)=0
  643. ClearLevel()
  644. End Function
  645. Function ClearLevel()
  646. Hits=0
  647. Fired=0
  648. Accuracy=0
  649. UFOCount=0
  650. ;clear out old level info
  651. ;Free up all the entities and types allocated (so level can restart afresh)
  652. For Asteroid.AsteroidInfo = Each AsteroidInfo
  653. If Asteroid<>Null
  654. FreeEntity Asteroid\Model
  655. Delete Asteroid
  656. EndIf
  657. Next
  658. For Shot.Shots = Each shots
  659. If Shot<>Null
  660. FreeEntity shot\model
  661. Delete shot
  662. EndIf
  663. Next
  664. For UFOShot.UFOShots = Each UFOshots
  665. If UFOShot<>Null
  666. FreeEntity UFOShot\model
  667. Delete UFOShot
  668. EndIf
  669. Next
  670. For Frag.Fragment = Each Fragment
  671. If Frag<>Null
  672. FreeEntity frag\model
  673. Delete Frag
  674. EndIf
  675. Next
  676. For UFO.UFOinfo = Each UFOInfo
  677. If UFO<>Null
  678. FreeEntity UFO\Model
  679. Delete UFO
  680. EndIf
  681. Next
  682. For Boom.Explode = Each Explode
  683. If Boom<>Null
  684. FreeEntity Boom\Model
  685. Delete Boom
  686. EndIf
  687. Next
  688. End Function
  689. Function fade(model,val#)
  690. vl#=val
  691. as#=((vl#+0.001)-9000)/1000
  692. ax=-1
  693. For asteroid.asteroidinfo = Each asteroidinfo
  694. ax=ax+1
  695. If ax=model Then EntityAlpha asteroid\model,1-as#
  696. Next
  697. End Function
  698. Function UpdateLevel()
  699. si=-1
  700. For Asteroid.AsteroidInfo = Each AsteroidInfo
  701. si=si+1
  702. MoveEntity Asteroid\Model,0,0,Asteroid\Speed
  703. x#=EntityX#(asteroid\Model)
  704. y#=EntityY#(asteroid\Model)
  705. z#=EntityZ#(asteroid\Model)
  706. min=0
  707. max=0
  708. If x#<0 Then min=x#
  709. If y#<0 And y#<min Then min=y#
  710. If z#<0 And z#<min Then min=z#
  711. If x#>0 Then max=x#
  712. If y#>0 And y#>max Then max=y#
  713. If z#>0 And z#>max Then max=z#
  714. If max>Abs(min)
  715. a=max
  716. fade(si,a)
  717. ; If a>9000 Then EntityAlpha Asteroid\Model,.9
  718. ; If a>9100 Then EntityAlpha Asteroid\Model,.8
  719. ; If a>9200 Then EntityAlpha Asteroid\Model,.7
  720. ; If a>9300 Then EntityAlpha Asteroid\Model,.6
  721. ; If a>9400 Then EntityAlpha Asteroid\Model,.5
  722. ; If a>9500 Then EntityAlpha Asteroid\Model,.4
  723. ; If a>9600 Then EntityAlpha Asteroid\Model,.3
  724. ; If a>9700 Then EntityAlpha Asteroid\Model,.2
  725. ; If a>9800 Then EntityAlpha Asteroid\Model,.1
  726. ; If a>9900 Then EntityAlpha Asteroid\Model,.0
  727. Else
  728. a=Abs(min)
  729. fade(si,a)
  730. ; If a>9000 Then EntityAlpha Asteroid\Model,.9
  731. ; If a>9100 Then EntityAlpha Asteroid\Model,.8
  732. ; If a>9200 Then EntityAlpha Asteroid\Model,.7
  733. ; If a>9300 Then EntityAlpha Asteroid\Model,.6
  734. ; If a>9400 Then EntityAlpha Asteroid\Model,.5
  735. ; If a>9500 Then EntityAlpha Asteroid\Model,.4
  736. ; If a>9600 Then EntityAlpha Asteroid\Model,.3
  737. ; If a>9700 Then EntityAlpha Asteroid\Model,.2
  738. ; If a>9800 Then EntityAlpha Asteroid\Model,.1
  739. ; If a>9900 Then EntityAlpha Asteroid\Model,.0
  740. EndIf
  741. If EntityX#(Asteroid\Model)>10000
  742. PositionEntity Asteroid\Model,-10000,EntityY#(Asteroid\Model),EntityZ#(Asteroid\Model)
  743. EndIf
  744. If EntityX#(Asteroid\Model)<-10000
  745. PositionEntity Asteroid\Model,10000,EntityY#(Asteroid\Model),EntityZ#(Asteroid\Model)
  746. EndIf
  747. If EntityY#(Asteroid\Model)>10000
  748. PositionEntity Asteroid\Model,EntityX#(Asteroid\Model),-10000,EntityZ#(Asteroid\Model)
  749. EndIf
  750. If EntityY#(Asteroid\Model)<-10000
  751. PositionEntity Asteroid\Model,EntityX#(Asteroid\Model),10000,EntityZ#(Asteroid\Model)
  752. EndIf
  753. If EntityZ#(Asteroid\Model)>10000
  754. PositionEntity Asteroid\Model,EntityX#(Asteroid\Model),EntityY#(Asteroid\Model),-10000
  755. EndIf
  756. If EntityZ#(Asteroid\Model)<-10000
  757. PositionEntity Asteroid\Model,EntityX#(Asteroid\Model),EntityY#(Asteroid\Model),10000
  758. EndIf
  759. Next
  760. For Shot.Shots=Each Shots
  761. If Shot<>Null
  762. MoveEntity Shot\Model,0,0,Shot\Speed
  763. Shot\Timer=Shot\Timer+50
  764. del=0
  765. If Shot\Timer>10000
  766. FreeEntity Shot\Model
  767. Del=1
  768. EndIf
  769. If del=1 Then Delete Shot
  770. EndIf
  771. Next
  772. For UFOShot.UFOShots=Each UFOShots
  773. If UFOShot<>Null
  774. MoveEntity UFOShot\Model,0,0,UFOShot\Speed
  775. UFOShot\Timer=UFOShot\Timer+10
  776. del=0
  777. If UFOShot\Timer>40000
  778. FreeEntity UFOShot\Model
  779. Del=1
  780. EndIf
  781. If del=1 Then Delete UFOShot
  782. EndIf
  783. Next
  784. For UFO.UFOInfo = Each UFOInfo
  785. If UFO<>Null
  786. If UFOSoundChannel=-1 Then UFOSoundChannel=PlaySound(UFOSound)
  787. If UFOSoundChannel<>-1 And ChannelPlaying(UFOSoundChannel)=0
  788. UFOSoundChannel=PlaySound(UFOSound)
  789. EndIf
  790. MoveEntity UFO\Model,0,0,20
  791. UFOFire=Rnd(1000)
  792. If UFOFire<20
  793. UFOFire(UFO\Model)
  794. EndIf
  795. If EntityZ#(UFO\Model)>10000
  796. UFOCount=UFOCount-1
  797. FreeEntity UFO\Model
  798. Delete UFO
  799. EndIf
  800. EndIf
  801. Next
  802. End Function
  803. Function CreateLevel(Lev)
  804. AsteroidCount=1+(Lev-1)
  805. If AsteroidCount>20 Then AsteroidCount=20
  806. Asteroids=AsteroidCount
  807. For a=1 To AsteroidCount
  808. Asteroid.AsteroidInfo = New AsteroidInfo
  809. Asteroid\Model=CopyEntity(LargeAsteroidMesh,0) ;create asteroid
  810. EntityRadius Asteroid\Model,450
  811. Repeat
  812. Asteroid\x=Rnd(-10000,10000) ;position asteroid
  813. Asteroid\y=Rnd(-10000,10000)
  814. Asteroid\z=Rnd(-10000,10000)
  815. ok=0
  816. If Asteroid\x>EntityX(Camera)-1000 And asteroid\x<EntityX(Camera)+1000 Then ok=1 ;make sure asteroid wont be where player
  817. If Asteroid\y>EntityY(Camera)-1000 And asteroid\y<EntityY(Camera)+1000 Then ok=1 ;starts on level
  818. If Asteroid\z>EntityZ(Camera)-1000 And asteroid\z<EntityZ(Camera)+1000 Then ok=1
  819. Until ok=0
  820. PositionEntity Asteroid\Model,Asteroid\x,Asteroid\y,Asteroid\z
  821. RotateEntity Asteroid\Model,Rnd(360),Rnd(360),Rnd(360)
  822. EntityType Asteroid\Model,10
  823. Asteroid\speed=5 ;slow asteroid
  824. Next
  825. End Function