00001 ; File = AvsH_SourceCode.bb
00002 ; written by Sebastian Roll, October 2003
00003
00004
00005 ;Constants
00006 Const SCR_X = 800
00007 Const SCR_Y = 600
00008 Const MAX_SHOTS = 5
00009 Const MAX_LIVES = 3
00010 Const DIRECTION_LEFT = 1
00011 Const DIRECTION_RIGHT = 2
00012
00013
00014 ;Globals
00015 Global imgAlien1 ; Images
00016 Global imgAlien2
00017 Global imgAlien3
00018 Global imgAlienHead
00019 Global imgAlienHeadBase
00020 Global imgExplode1
00021 Global imgExplode2
00022 Global imgExplode3
00023 Global imgHero
00024 Global imgShot
00025 Global imgBomb
00026 Global imgMisile
00027 Global imgBonus
00028 Global imgBonusShip
00029 Global imgCruiser
00030 Global imgBubbleSmall
00031 Global imgBubbleMid
00032 Global imgBubbleBig
00033 Global imgSpider
00034 Global imgTitle
00035 Global imgBack1
00036 Global imgBack2
00037 Global imgBack3
00038 Global imgSnapShot
00039 Global sndExplode1 ; Sounds
00040 Global sndExplode2
00041 Global sndExplode3
00042 Global sndSpeed
00043 Global sndRapidFire
00044 Global sndMisile
00045 Global sndExtraLive
00046 Global sndPoints
00047 Global sndLoopNormal
00048 Global sndLoopWater
00049 Global chnLoop ; Channel for countinues playing a sound-loop
00050 Global fntStyleBig ; Font to write on screen
00051 Global fntStyleSmall
00052 Global fntStyleMid
00053 Global fntStyleCourier
00054 Global nAliens ; Number of living Aliens
00055 Global heroInSaveMode ; Set to True, if Hero can't be destroyed
00056 Global insertIndex ; HiScore-Insert-Position
00057 Global waterShore ; Border from Water to Space in Underwater-Levels
00058 Global demoTime ; Go into Demo-Mode after some time without User-Input
00059 Global backroundMusic ; Different Levels -> Different Music
00060
00061
00062
00063 ;TypeDefs
00064 Type Alien
00065 Field xPos = 0
00066 Field yPos = 0
00067 Field img = 0
00068 Field frame = 0
00069 Field direction = 0
00070 Field speed# = 0
00071 Field mode = 0
00072 Field freqX = 0
00073 Field freqY = 0
00074 Field angel# = 0
00075 End Type
00076
00077 Type Hero
00078 Field xPos = 0
00079 Field yPos = 0
00080 Field img = 0
00081 Field frame = 0
00082 Field score = 0
00083 Field nShots = 0 ; Maximum of Shots displayed on Screen
00084 Field shotTimeDelta = 0 ; Minimum of delay between two Shots
00085 Field nLives = 0
00086 Field haveBonusSpeed = 0
00087 Field haveBonusRapidFire = 0
00088 Field haveBonusMisile = 0
00089 Field haveBonusExtraLive = 0
00090 End Type
00091
00092 Type Explode1
00093 Field xPos = 0
00094 Field yPos = 0
00095 Field img = 0
00096 Field Frame = 0
00097 End Type
00098
00099 Type Explode2
00100 Field xPos# = 0.0
00101 Field yPos# = 0.0
00102 Field xs# = 0
00103 Field ys# = 0
00104 Field colorR = 0
00105 Field colorG = 0
00106 Field colorB = 0
00107 End Type
00108
00109 Type Explode3
00110 Field xPos = 0
00111 Field yPos = 0
00112 Field img = 0
00113 Field Frame = 0
00114 End Type
00115
00116 Type Shot
00117 Field xPos = 0
00118 Field yPos = 0
00119 Field img = 0
00120 End Type
00121
00122 Type Bomb
00123 Field xPos# = 0
00124 Field yPos = 0
00125 Field img = 0
00126 Field speed = 0
00127 Field angel# = 0
00128 End Type
00129
00130 Type Bonus
00131 Field xPos = 0
00132 Field yPos = 0
00133 Field img = 0
00134 End Type
00135
00136 Type Misile
00137 Field xPos# = 0
00138 Field yPos = 0
00139 Field xDelta# = 0
00140 Field img = 0
00141 Field frame = 0
00142 End Type
00143
00144 Type BonusShip
00145 Field xPos = 0
00146 Field yPos = 0
00147 Field img = 0
00148 End Type
00149
00150 Type Cruiser
00151 Field xPos = 0
00152 Field yPos = 0
00153 Field img = 0
00154 Field frame = 0
00155 End Type
00156
00157 Type BackroundStar
00158 Field xPos = 0
00159 Field yPos = 0
00160 Field colorR = 0
00161 Field colorG = 0
00162 Field colorB = 0
00163 End Type
00164
00165 Type Bubble
00166 Field xPos = 0
00167 Field yPos = 0
00168 Field img = 0
00169 Field speed = 0
00170 End Type
00171
00172 Type BunkerFragment
00173 Field xPos = 0
00174 Field yPos = 0
00175 End Type
00176
00177 Type HiScore
00178 Field name$ = ""
00179 Field points = 0
00180 Field date$ = 0
00181 End Type
00182
00183 Type InputName
00184 Field hiLightIndex = 0
00185 Field name$ = ""
00186 Field inTimeDelta = 0 ; Minimum of delay between two Inputs
00187 End Type
00188
00189 Type Message
00190 Field Text$ = ""
00191 Field timeToDisplay = 0
00192 End Type
00193
00194 Type Spider
00195 Field xPos = 0
00196 Field yPos# = 0
00197 Field swing1 = 0
00198 Field swing2# = 0
00199 Field destReached = 0
00200 Field img = 0
00201 Field hits = 0
00202 Field bombTime = 0
00203 Field bombAngelOffset# = 0.0
00204 Field bombTimeCount = 0
00205 End Type
00206
00207
00208
00209 ;Init
00210 Graphics SCR_X, SCR_Y
00211 Text SCR_X/2, 280, "PREPARE ALIEN-DESASTER:", True
00212 imgTemp1 = LoadImage("screenshot3.jpg")
00213 If imgTemp1 <> 0
00214 DrawImage imgTemp1, 150, 320
00215 EndIf
00216 imgTemp2 = LoadImage("screenshot4.jpg")
00217 If imgTemp2 <> 0
00218 DrawImage imgTemp2, 450, 320
00219 EndIf
00220 SeedRnd MilliSecs()
00221 AppTitle "Aliens vs Hero"
00222 Text 0, 0, "Loading Sounds."
00223 If -1 = loadSounds() Then RuntimeError "Can't Load Sounds"
00224 Text 0, 20, "Loading Graphics."
00225 If -1 = loadGraphics() Then RuntimeError "Can't Load Graphics"
00226 SetBuffer BackBuffer() ; All Graphics will be Double-Buffered
00227 FlushKeys
00228 demoTime = MilliSecs()
00229 imgSnapShot = CreateImage(SCR_X, SCR_Y) ; Used by UnderWater-Effect
00230 FreeImage imgTemp1
00231 FreeImage imgTemp2
00232
00233
00234 ; Start Game
00235 doMainLoop()
00236
00237
00238
00239 Function doMainLoop()
00240
00241 Local gameState = 0
00242 Local nLevel = 1
00243 Local doBomb = True
00244 Local frameTimer = CreateTimer(50)
00245 Local soundIsOn = True
00246 Local demoIsOn = False
00247
00248 Local oldTime = 0 ; Sometimes we don't allow User-Input
00249 Local newTime = 0
00250 Local dieTime = 0
00251
00252 Local startFreq = 1 ; Used for UnderWaterEffect
00253 Local shoreFreq = 1
00254
00255 Local uState = 0 ; UnDokumented... :)
00256
00257 ResumeChannel(chnLoop)
00258
00259 ; Do all drawing. Watch exit and new Levels.
00260 Repeat
00261
00262 Cls
00263
00264 Select gameState
00265
00266 ; Initial State
00267 Case 0
00268
00269 drawTitleScreen()
00270 oldTime = MilliSecs()
00271
00272 ; Don't draw Hero.
00273 heroInSaveMode = True
00274
00275 If KeyHit(57)
00276 initHero()
00277 nLevel = 1
00278 insertIndex = 1
00279 gameState = 1
00280 EndIf
00281
00282 If (demoTime + 10000 < oldTime) And (demoIsOn = False)
00283 demoIsOn = True
00284 nLevel = 3
00285 initHero()
00286 gameState = 1
00287 EndIf
00288
00289 ; Inform User abaut current Level, prepare it.
00290 Case 1
00291
00292 ; Don't draw Hero.
00293 heroInSaveMode = True
00294 For h.Hero = Each Hero
00295 h\xPos = SCR_X / 2
00296 Next
00297
00298 demoTime = MilliSecs()
00299 drawLevelChange(nLevel, soundIsOn)
00300 initLevel(nLevel)
00301 gameState = 2
00302 FlushKeys
00303
00304 ; Normal Game-State
00305 Case 2
00306
00307 newTime = MilliSecs()
00308
00309 b.Bomb = First Bomb
00310 If b = Null
00311 If newTime > oldTime + 500
00312 ; No more Bombs on Screen -> draw Hero
00313 heroInSaveMode = False
00314 EndIf
00315 Else
00316 oldTime = MilliSecs()
00317 EndIf
00318
00319 If nAliens = 10
00320 makeBonusShip()
00321 EndIf
00322
00323 If nAliens <= 0
00324 gameState = 3
00325 oldTime = MilliSecs()
00326 ElseIf (nAliens = 1) And ((nLevel Mod 4) = 0)
00327 ; Each 4th Level a Spider as End-SuperAlien
00328 For a.Alien = Each Alien
00329 explodeAlien(a)
00330 Next
00331 makeSpider()
00332 EndIf
00333
00334
00335 ; Next Level reached
00336 Case 3
00337
00338 newTime = MilliSecs()
00339 If newTime > oldTime + 1000
00340 nLevel = nLevel + 1
00341 ; Each third Level is UnderWater
00342 If (nLevel Mod 3) = 0
00343 Delete Each Message
00344 msg.Message = New Message
00345 msg\Text$ = "UNDERWATER STAGE"
00346 msg\timeToDisplay = MilliSecs() + 5000
00347 EndIf
00348 gameState = 1
00349 EndIf
00350
00351 ; Load HiScore-Table
00352 Case 4
00353
00354 dieTime = MilliSecs()
00355 If oldTime + 500 < dieTime
00356 gameState = 5
00357 If readHiScore() < 0
00358 ; No File found, so create new one.
00359 If writeNewHiScore() < 0
00360 ; Can't do any File-operations, so exit this HiScore-stuff.
00361 gameState = 7
00362 EndIf
00363 EndIf
00364 FlushKeys
00365 EndIf
00366
00367 ; Show HiScore-Table
00368 Case 5
00369
00370 ; Is Score great enough to store it in HiScore-Table?
00371 h.Hero = First Hero
00372 For table.HiScore = Each HiScore
00373 If h\score < table\points
00374 insertIndex = insertIndex + 1
00375 EndIf
00376 Next
00377
00378 If insertIndex < 11
00379 in.InputName = New InputName
00380 in\hiLightIndex = 65
00381 in\name$ = ""
00382 in\inTimeDelta = MilliSecs()
00383 FlushKeys
00384 gameState = 6
00385 Else
00386 ; Don't let User input his Name.
00387 FlushKeys
00388 gameState = 7
00389 EndIf
00390
00391 ; Input new HiScore and save
00392 Case 6
00393
00394 in.InputName = First InputName
00395
00396 ; Be sure that Hero isn't drawn.
00397 h.Hero = First Hero
00398 h\xPos = -100
00399
00400 If Len(in\name$) >= 3 ; User entered three Chars
00401
00402 hs.HiScore = New HiScore
00403 hs\name$ = in\name$
00404 hs\points = h\score
00405 hs\date$ = CurrentDate$()
00406
00407 For table.HiScore = Each HiScore
00408 If h\score >= table\points
00409 Insert hs Before table
00410 Exit
00411 EndIf
00412 Next
00413
00414 table.HiScore = Last HiScore
00415 Delete table
00416
00417 writeHiScore()
00418 insertIndex = 11
00419 gameState = 7
00420 EndIf
00421
00422 ; Game Over. Prepare next start.
00423 Case 7
00424
00425 newTime = MilliSecs()
00426 If newTime > oldTime + 2000
00427 If KeyHit(57)
00428 ; Clean up Memory
00429 disposeObjects()
00430 h.Hero = First Hero
00431 If h <> Null
00432 Delete h
00433 EndIf
00434 demoTime = MilliSecs()
00435 FlushKeys
00436 gameState = 0
00437 EndIf
00438 EndIf
00439
00440 End Select
00441
00442 For bs.BackroundStar = Each BackroundStar
00443 drawBackroundStar(bs)
00444 Next
00445
00446 For bu.Bubble = Each Bubble
00447 drawBubble(bu)
00448 Next
00449
00450 For sp.Spider = Each Spider
00451 drawSpider(sp)
00452 Next
00453
00454 For a.Alien = Each Alien
00455 ; Should Alien drop a Bomb?
00456 If heroInSaveMode = False And a\mode <> 2
00457 doBomb = Rnd(150/nLevel)
00458 If doBomb = 0
00459 makeBomb(a)
00460 EndIf
00461 EndIf
00462 drawAlien(a)
00463 Next
00464
00465 For b.Bomb = Each Bomb
00466 drawBomb(b)
00467 Next
00468
00469 For e1.Explode1 = Each Explode1
00470 drawExplode1(e1)
00471 Next
00472
00473 For e2.Explode2 = Each Explode2
00474 drawExplode2(e2)
00475 Next
00476
00477 For e3.Explode3 = Each Explode3
00478 drawExplode3(e3)
00479 Next
00480
00481 For s.Shot = Each Shot
00482 drawShot(s)
00483 Next
00484
00485 For m.Misile = Each Misile
00486 drawMisile(m)
00487 Next
00488
00489 For bos.BonusShip = Each BonusShip
00490 drawBonusShip(bos)
00491 Next
00492
00493 For bon.Bonus = Each Bonus
00494 drawBonus(bon)
00495 Next
00496
00497 For bf.BunkerFragment= Each BunkerFragment
00498 drawBunkerFragment(bf)
00499 Next
00500
00501 For h.Hero = Each Hero
00502 drawHero(h)
00503 Color 255, 255, 0
00504 SetFont(fntStyleSmall)
00505 Text 0, 0, "Ships " + h\nLives
00506 Text SCR_X - 120, 0, "Score " + h\score
00507 If h\nLives <= 0 And gameState = 2
00508 gameState = 4
00509 oldTime = MilliSecs()
00510 EndIf
00511 Next
00512
00513 ; UnderWater-Effect at each third Level
00514 If (nLevel Mod 3) = 0 And gameState > 1
00515 doUnderWaterEffect(startFreq, shoreFreq)
00516 startFreq = (startFreq + 1) Mod 359
00517 shoreFreq = (shoreFreq + 2) Mod 359
00518 If nAliens = 6
00519 makeCruiser()
00520 EndIf
00521 EndIf
00522
00523 For msg.Message = Each Message
00524 drawMessage(msg)
00525 Next
00526
00527 ; Handle Demo-State
00528 If demoIsOn = True
00529 For h.Hero = Each Hero
00530 Color 255, 255, 0
00531 SetFont(fntStyleBig)
00532 Text SCR_X/2, SCR_Y/2-80, "DEMO", True, True
00533 For a.Alien = Each Alien
00534 If (a\xPos > 350) And (a\xPos < 360) And (heroInSaveMode = False)
00535 ; Do some stupid Shots
00536 s.Shot = New Shot
00537 s\xPos = h\xPos - 1
00538 s\yPos = h\yPos - 37
00539 s\img = imgShot
00540 EndIf
00541 Next
00542 ; Watch for Demo-Exit
00543 If KeyHit(57) Or nAlien = 1 Or h\nLives <= 0
00544 demoIsOn = False
00545 disposeObjects()
00546 Delete Each Hero
00547 demoTime = MilliSecs()
00548 FlushKeys
00549 gameState = 0
00550 EndIf
00551 Next
00552 EndIf
00553
00554 If gameState > 3
00555 newTime = MilliSecs()
00556 If newTime > oldTime + 1000
00557 Color 255, 255, 0
00558 SetFont(fntStyleBig)
00559 Text SCR_X/2, SCR_Y/4, "GAME OVER", True, True
00560 drawHiScore()
00561 EndIf
00562 EndIf
00563
00564 For in.InputName = Each InputName
00565 drawInputName(in)
00566 Next
00567
00568 ; 'p' will pause and resume Game.
00569 If KeyHit(25)
00570 Delete Each Message
00571 msg.Message = New Message
00572 msg\Text$ = "PAUSE"
00573 msg\timeToDisplay = MilliSecs() + 1000
00574 drawMessage(msg)
00575 Flip
00576 While Not KeyHit(25)
00577 Delay(200)
00578 Wend
00579 FlushKeys
00580 EndIf
00581
00582
00583 ; Due To the Double-Buffering of Graphics, we have To Flip BackScreen To FrontScreen.
00584 Flip
00585 ; Now all Graphics will be drawn on a blank BackScreen. Until the next Flip.
00586
00587
00588 ; 's' will toggle Sound on/off
00589 If KeyHit(31)
00590 soundIsOn = Not soundIsOn
00591 If soundIsOn = True
00592 ResumeChannel(chnLoop)
00593 Delete Each Message
00594 msg.Message = New Message
00595 msg\Text$ = "SOUND ON"
00596 msg\timeToDisplay = MilliSecs() + 2000
00597 Else
00598 PauseChannel(chnLoop)
00599 Delete Each Message
00600 msg.Message = New Message
00601 msg\Text$ = "SOUND OFF"
00602 msg\timeToDisplay = MilliSecs() + 2000
00603 EndIf
00604 EndIf
00605
00606 ; 'F12' will save a ScreenShot to 'avshScreenShot.bmp'
00607 If KeyHit(88)
00608 GrabImage imgSnapShot, 0, 0
00609 SaveImage(imgSnapShot, "avshScreenShot.bmp")
00610 EndIf
00611
00612 If KeyHit(48) And uState = 0 Then uState = 1
00613 If uState > 0
00614 If KeyHit(38) And uState = 1 Then uState = 2
00615 If KeyHit(23) And uState = 2 Then uState = 3
00616 If KeyHit(20) And uState = 3 Then uState = 4
00617 If (KeyHit(44) Or KeyHit(21)) And uState = 4 Then uState = 5
00618 If uState = 5
00619 SetFont(fntStyleBig)
00620 Color 255, 255, 0
00621 heroInSaveMode = False
00622 While Not KeyHit(57)
00623 Cls
00624 For a.Alien = Each Alien
00625 drawAlien(a)
00626 Next
00627 initAliens(1, Rnd(2), Rnd(1,3))
00628 Text 180, 500, "ALIEN-COUNT: " + nAliens
00629 Flip
00630 Wend
00631 disposeObjects()
00632 FlushKeys
00633 heroInSaveMode = True
00634 uState = 0
00635 Delete Each Hero
00636 demoTime = MilliSecs()
00637 gameState = 0
00638 EndIf
00639 EndIf
00640
00641 ; Set FrameRate to 50 ms on every machine, running this application.
00642 WaitTimer(frameTimer)
00643
00644 Until KeyHit(1)
00645
00646 FreeTimer(frameTimer)
00647 disposeObjects()
00648
00649 End Function
00650
00651
00652
00653 Function doUnderWaterEffect(startFreq, shoreFreq)
00654
00655 Local lineCount = 0
00656
00657 ; Set global Border of WaterShore (WaterShore goes up and down).
00658 waterShore = 80 + Sin(shoreFreq) * 30
00659
00660 ; Save SnapShot
00661 GrabImage imgSnapShot, 0, 0
00662
00663 ; Clear Screen with WaterColor
00664 Color 0, 50, 120
00665 Rect 0, waterShore, SCR_X, SCR_Y, True
00666
00667 ; Draw back SnapShot (up to WaterShore) Line for Line with Sinus-xPos-Offset.
00668 For lineCount = waterShore To SCR_Y-1
00669 DrawImageRect imgSnapShot, Sin(lineCount + startFreq) * 20, lineCount, 0, lineCount, SCR_X-1, 1
00670 Next
00671
00672 For cr.Cruiser = Each Cruiser
00673 drawCruiser(cr, waterShore)
00674 Next
00675
00676 End Function
00677
00678
00679
00680 Function initLevel(level)
00681
00682 disposeObjects()
00683
00684 Select level
00685
00686 Case 1
00687 initAliens(10, 1, 1)
00688 initBackroundStars()
00689
00690 Case 2
00691 initAliens(10, 2, 1)
00692 initBackroundStars()
00693
00694 Case 3
00695 initAliens(15, 0, 1)
00696 initBubbles()
00697
00698 Case 4
00699 initAliens(10, 1, 2)
00700 initAliens(5, 1, 1)
00701 initBackroundStars()
00702
00703 Case 5
00704 initAliens(10, 2, 1)
00705 initAliens(5, 2, 2)
00706 initBackroundStars()
00707
00708 Case 6
00709 initAliens(10, 0, 1)
00710 initAliens(10, 2, 1)
00711 initBubbles()
00712
00713 Case 7
00714 initAliens(10, 0, 3)
00715 initAliens(4, 2, 2)
00716 initBackroundStars()
00717
00718 Case 8
00719 initAliens(10, 1, 1)
00720 initAliens(5, 2, 1)
00721 initBackroundStars()
00722
00723 Case 9
00724 initAliens(40, 0, 1)
00725 initBubbles()
00726
00727 Case 10
00728 initAliens(10, 1, 2)
00729 initAliens(10, 2, 2)
00730 initBackroundStars()
00731
00732 Case 11
00733 initAliens(20, 1, 1)
00734 initAliens(10, 2, 1)
00735 initBackroundStars()
00736
00737 Default
00738 initAliens(10, 0, 1)
00739 initAliens(10, 1, 1)
00740 initAliens(5, 2, 2)
00741 initBackroundStars()
00742
00743 End Select
00744
00745 initBunkerFragments()
00746
00747 End Function
00748
00749
00750
00751 Function initHero()
00752
00753 h.Hero = New Hero
00754 resetHero(h)
00755 h\score = 0
00756 h\nLives = MAX_LIVES
00757 h\nShots = 0
00758
00759 End Function
00760
00761
00762
00763 Function initAliens(count, mode, speed)
00764
00765 ; mode = 0 -> AlienLeftRight
00766 ; mode = 1 -> AlienSinus
00767 ; mode = 2 -> AlienFalling
00768
00769 For i=1 To count
00770
00771 a.Alien = New Alien
00772
00773 a\xPos = Rnd(50, SCR_X-50)
00774 a\yPos = Rnd(40, SCR_Y/4)
00775 a\frame = Rnd(5)
00776 a\speed# = speed
00777 a\mode = mode
00778 a\angel# = Rnd(178,182)
00779
00780 If mode = 2
00781 a\direction = DIRECTION_RIGHT
00782 a\freqX = Rnd(359)
00783 a\freqY = Rnd(SCR_Y/2)
00784 a\img = imgAlien3
00785 Else
00786 a\direction = Rnd(0,1)
00787 a\freqX = Rnd(20)
00788 a\freqY = Rnd(20)
00789 If mode = 1
00790 a\img = imgAlien2
00791 Else
00792 a\img = imgAlien1
00793 EndIf
00794 EndIf
00795
00796 Next
00797
00798 nAliens = nAliens + count
00799
00800 End Function
00801
00802
00803
00804 Function initBackroundStars()
00805
00806 ; Set x- and y-Pos and color per random
00807 For i=1 To 100
00808
00809 bs.BackroundStar= New BackroundStar
00810
00811 bs\xPos = Rnd(SCR_X)
00812 bs\yPos = Rnd(SCR_Y)
00813 bs\colorR = Rnd(255)
00814 bs\colorG = Rnd(255)
00815 bs\colorB = Rnd(255)
00816
00817 Next
00818
00819 End Function
00820
00821
00822
00823 Function initBubbles()
00824
00825 Local i = 0
00826
00827 For i=1 To 50
00828 bu.Bubble = New Bubble
00829 bu\xPos = Rnd(SCR_X)
00830 bu\yPos = Rnd(SCR_Y)
00831 bu\img = imgBubbleSmall
00832 bu\speed = Rnd(3,4)
00833 Next
00834
00835 For i=1 To 30
00836 bu.Bubble = New Bubble
00837 bu\xPos = Rnd(SCR_X)
00838 bu\yPos = Rnd(SCR_Y)
00839 bu\img = imgBubbleMid
00840 bu\speed = Rnd(2,3)
00841 Next
00842
00843 For i=1 To 10
00844 bu.Bubble = New Bubble
00845 bu\xPos = Rnd(SCR_X)
00846 bu\yPos = Rnd(SCR_Y)
00847 bu\img = imgBubbleBig
00848 bu\speed = Rnd(1,2)
00849 Next
00850
00851 End Function
00852
00853
00854
00855 Function initBunkerFragments()
00856
00857 ; Each BunkerFragment has a width and hight of 15 Pixel
00858 ; We want 3 bunkers
00859 For a=SCR_X/9 To SCR_X Step SCR_X/3
00860 ; Each Bunker is 5 BunkerFragments width
00861 For b=1 To 5*15 Step 15
00862 ; Each Bunker is 5 BunkerFragments hight
00863 For c=1 To 5*15 Step 15
00864
00865 bf.BunkerFragment = New BunkerFragment
00866
00867 bf\xPos = a + b
00868 bf\yPos = SCR_Y - 155 + c
00869
00870 Next
00871 Next
00872 Next
00873
00874 End Function
00875
00876
00877
00878 Function resetHero(h.Hero)
00879
00880 h\xPos = SCR_X / 2
00881 h\yPos = SCR_Y - 38
00882 h\img = imgHero
00883 h\frame = 0
00884 h\shotTimeDelta = 0
00885 h\haveBonusSpeed = False
00886 h\haveBonusRapidFire= False
00887 h\haveBonusMisile = False
00888 h\haveBonusExtraLive= False
00889
00890 End Function
00891
00892
00893
00894 Function moveAlienLeftRight(a.Alien)
00895
00896 If a\xPos > SCR_X - 50
00897 a\direction = DIRECTION_LEFT
00898 If a\yPos < SCR_Y - 220
00899 a\yPos = a\yPos + 50
00900 EndIf
00901 EndIf
00902
00903 If a\xPos < 50
00904 a\direction = DIRECTION_RIGHT
00905 If a\yPos < SCR_Y - 220
00906 a\yPos = a\yPos + 50
00907 EndIf
00908 EndIf
00909
00910 If a\direction = DIRECTION_LEFT
00911 a\xPos = a\xPos - 3 * a\speed#
00912 Else
00913 a\xPos = a\xPos + 3 * a\speed#
00914 EndIf
00915
00916 End Function
00917
00918
00919
00920 Function moveAlienSinus(a.Alien)
00921
00922 Local centerX = SCR_X / 2 - 50
00923 Local centerY = SCR_Y / 2 - 150
00924
00925 a\xPos = 50 + centerX + centerX * Sin(a\angel# * a\freqX)
00926 a\yPos = 50 + centerY + centerY * Sin(a\angel# * a\freqY + a\mode)
00927
00928 a\angel# = (a\angel + 0.1 * a\speed#) Mod 360
00929
00930 End Function
00931
00932
00933
00934 Function moveAlienFalling(a.Alien)
00935
00936 Local centerX = SCR_X / 2
00937
00938 a\xPos = centerX + Sin(a\freqX) * (centerX-25)
00939 a\freqX = (a\freqX + a\speed) Mod 359
00940
00941 For h.Hero = Each Hero
00942
00943 ; Alien out of Range?
00944 If (a\yPos > SCR_Y) Or ((heroInSaveMode = True) And h\nLives > 0)
00945 a\yPos = -20
00946 a\direction = DIRECTION_RIGHT
00947 EndIf
00948
00949 ; Slightly scroll Alien into Screen.
00950 If a\yPos <= a\freqY
00951 a\yPos = a\yPos + a\speed
00952 EndIf
00953
00954 ; Start falling
00955 If (a\yPos >= a\freqY)
00956 a\yPos = a\yPos + 6 + a\speed
00957 EndIf
00958
00959 Next
00960
00961 End Function
00962
00963
00964
00965 Function drawHero(h.Hero)
00966
00967 If heroInSaveMode = False
00968
00969 Local time = MilliSecs()
00970
00971 ; User-Input
00972 If KeyDown(203) And h\xPos > 30
00973 h\xPos = h\xPos - 3 - h\haveBonusSpeed * 3
00974 EndIf
00975
00976 If KeyDown(205) And h\xPos < SCR_X - 30
00977 h\xPos = h\xPos + 3 + h\haveBonusSpeed * 3
00978 EndIf
00979
00980 ; Don't allow too many and too fast shootings
00981 If h\haveBonusRapidFire = True
00982 If KeyDown(57) And h\nShots < (3 * MAX_SHOTS) And h\shotTimeDelta < time - 200
00983 s.Shot = New Shot
00984 s\xPos = h\xPos - 1
00985 s\yPos = h\yPos - 37
00986 s\img = imgShot
00987 h\nShots = h\nShots + 1
00988 h\shotTimeDelta = time
00989 EndIf
00990 Else
00991 If KeyDown(57) And h\nShots < MAX_SHOTS And h\shotTimeDelta < time - 80
00992 s.Shot = New Shot
00993 s\xPos = h\xPos - 1
00994 s\yPos = h\yPos - 37
00995 s\img = imgShot
00996 h\nShots = h\nShots + 1
00997 h\shotTimeDelta = time
00998 EndIf
00999 EndIf
01000
01001 ; Drop Misile
01002 If h\haveBonusMisile = True
01003 If KeyDown(57)
01004 makeMisile(h)
01005 EndIf
01006 EndIf
01007
01008 DrawImage h\img, h\xPos, h\yPos, h\frame / 10
01009 h\frame = (h\frame + 1) Mod 39
01010
01011 EndIf
01012
01013 End Function
01014
01015
01016
01017 Function drawAlien(a.Alien)
01018
01019 Select a\mode
01020
01021 Case 0
01022 moveAlienLeftRight(a)
01023
01024 Case 1
01025 moveAlienSinus(a)
01026
01027 Case 2
01028 moveAlienFalling(a)
01029
01030 End Select
01031
01032 ; Alien hit Hero?
01033 For h.Hero = Each Hero
01034
01035 If ImagesOverlap(h\img, h\xPos, h\yPos, a\img, a\xPos, a\yPos) And (heroInSaveMode = False)
01036 ; Throw a Bomb (outside the Screen) -> So Hero stays in Save-Mode. (obscure Quick-Hack). :(
01037 b.Bomb = New Bomb
01038 b\xPos = -30
01039 b\yPos = SCR_Y - 50
01040 b\img = imgBomb
01041 b\speed = 1
01042 b\angel = 0
01043
01044 explodeAlien(a)
01045 explodeHero(h)
01046 Return
01047 EndIf
01048
01049 Next
01050
01051 DrawImage a\img, a\xPos, a\yPos, a\frame / 10
01052 a\frame = (a\frame + 1) Mod 49
01053
01054 End Function
01055
01056
01057
01058 Function drawShot(s.Shot)
01059
01060 For h.Hero = Each Hero
01061
01062 ; Shot out of range?
01063 If s\yPos < 0
01064 Delete s
01065 h\nShots = h\nShots - 1
01066 Return
01067 EndIf
01068
01069 For a.Alien = Each Alien
01070 ; Shot hit Alien?
01071 If ImagesOverlap(s\img, s\xPos, s\yPos, a\img, a\xPos, a\yPos)
01072 explodeAlien(a)
01073 h\nShots = h\nShots - 1
01074 Delete s
01075 Return
01076 EndIf
01077 Next
01078
01079 For bos.BonusShip = Each BonusShip
01080 ; Shot hit BonusShip?
01081 If ImagesOverlap(s\img, s\xPos, s\yPos, bos\img, bos\xPos, bos\yPos)
01082 explodeBonusShip(bos)
01083 h\nShots = h\nShots - 1
01084 Delete s
01085 Return
01086 EndIf
01087 Next
01088
01089 Next
01090
01091 DrawImage s\img, s\xPos, s\yPos
01092 s\yPos = s\yPos - 10
01093
01094 End Function
01095
01096
01097
01098 Function drawBomb(b.Bomb)
01099
01100 For h.Hero = Each Hero
01101
01102 ; Bomb out of range?
01103 If (b\yPos > SCR_Y) Or (b\xPos > SCR_X) Or (b\xPos < 0)
01104 Delete b
01105 Return
01106 EndIf
01107
01108 ; Bomb hit Hero?
01109 If heroInSaveMode = False
01110 If ImagesCollide(b\img, b\xPos, b\yPos, 0, h\img, h\xPos, h\yPos, 0)
01111 explodeHero(h)
01112 Delete b
01113 Return
01114 EndIf
01115 EndIf
01116
01117 Next
01118
01119 DrawImage b\img, b\xPos, b\yPos
01120
01121 b\yPos = b\yPos + b\speed
01122 b\xPos = b\xPos + b\angel
01123
01124 End Function
01125
01126
01127
01128 Function drawMisile(m.Misile)
01129
01130 Local xDelta
01131
01132 ; Misile out of range? (The only way a Misile dies)
01133 If m\yPos < 0 Or m\xPos# < 0 Or m\xPos# > SCR_X
01134 Delete m
01135 Return
01136 EndIf
01137
01138 For a.Alien = Each Alien
01139 ; Misile hit Alien?
01140 If ImagesOverlap(m\img, m\xPos#, m\yPos, a\img, a\xPos, a\yPos)
01141 explodeAlien(a)
01142 EndIf
01143 Next
01144
01145 For bos.BonusShip = Each BonusShip
01146 ; Misile hit BonusShip?
01147 If ImagesOverlap(m\img, m\xPos#, m\yPos, bos\img, bos\xPos, bos\yPos)
01148 explodeBonusShip(bos)
01149 EndIf
01150 Next
01151
01152 DrawImage m\img, m\xPos#, m\yPos, m\frame
01153 m\yPos = m\yPos - 1
01154 m\xPos = m\xPos# + m\xDelta#
01155 m\frame = (m\frame + 1) Mod 5
01156
01157 End Function
01158
01159
01160
01161 Function drawBonus(bon.Bonus)
01162
01163 For h.Hero = Each Hero
01164
01165 ; Bonus out of range?
01166 If bon\yPos > SCR_Y
01167 Delete bon
01168 Return
01169 EndIf
01170
01171 ; Bonus hit Hero?
01172 If ImagesCollide(bon\img, bon\xPos, bon\yPos, 0, h\img, h\xPos, h\yPos, 0)
01173
01174 Delete Each Message
01175
01176 ; Give Hero something usefull
01177 If h\haveBonusSpeed = False
01178 h\haveBonusSpeed = True
01179 PlaySound(sndSpeed)
01180 msg.Message = New Message
01181 msg\Text$ = "SPEED"
01182 msg\timeToDisplay = MilliSecs() + 2000
01183 ElseIf h\haveBonusRapidFire = False
01184 h\haveBonusRapidFire = True
01185 PlaySound(sndRapidFire)
01186 msg.Message = New Message
01187 msg\Text$ = "RAPID FIRE"
01188 msg\timeToDisplay = MilliSecs() + 2000
01189 ElseIf h\haveBonusMisile = False
01190 h\haveBonusMisile = True
01191 PlaySound(sndMisile)
01192 msg.Message = New Message
01193 msg\Text$ = "MISILE"
01194 msg\timeToDisplay = MilliSecs() + 2000
01195 ElseIf h\haveBonusExtraLive = False
01196 h\haveBonusExtraLive = True
01197 h\nLives = h\nLives + 1
01198 PlaySound(sndExtraLive)
01199 msg.Message = New Message
01200 msg\Text$ = "EXTRA LIVE"
01201 msg\timeToDisplay = MilliSecs() + 2000
01202 Else
01203 h\score = h\score + 1000
01204 PlaySound(sndPoints)
01205 msg.Message = New Message
01206 msg\Text$ = "+1000 Points"
01207 msg\timeToDisplay = MilliSecs() + 2000
01208 EndIf
01209
01210 Delete bon
01211 Return
01212 EndIf
01213
01214 Next
01215
01216 DrawImage bon\img, bon\xPos, bon\yPos
01217 bon\yPos = bon\yPos + 5
01218 bon\xPos = bon\xPos + Cos(bon\yPos Mod 360) * 3
01219
01220 End Function
01221
01222
01223
01224 Function drawBonusShip(bos.BonusShip)
01225
01226 ; BonusShip out of range?
01227 If bos\xPos > SCR_X + 20
01228 Delete bos
01229 Return
01230 EndIf
01231
01232 DrawImage bos\img, bos\xPos, bos\yPos
01233 bos\xPos = bos\xPos + 1
01234
01235 End Function
01236
01237
01238
01239 Function drawCruiser(cr.Cruiser, y)
01240
01241 ; Cruiser out of range?
01242 If cr\xPos < -100
01243 Delete cr
01244 Return
01245 EndIf
01246
01247 DrawImage cr\img, cr\xPos, y, cr\frame
01248 cr\xPos = cr\xPos -4
01249 cr\frame = (cr\frame + 1) Mod 4
01250
01251 For h.Hero = Each Hero
01252 ; Shot hit Cruiser?
01253 For s.Shot = Each Shot
01254 If ImagesOverlap(cr\img, cr\xPos, cr\yPos, s\img, s\xPos, s\yPos)
01255 h\nShots = h\nShots - 1
01256 h\score = h\Score + 2000
01257 Delete s
01258 Delete cr
01259 msg.Message = New Message
01260 msg\Text$ = "+2000 Points"
01261 msg\timeToDisplay = MilliSecs() + 2000
01262 Return
01263 EndIf
01264 Next
01265 Next
01266
01267 ; Misile hit Cruiser?
01268 For m.Misile = Each Misile
01269 If ImagesOverlap(cr\img, cr\xPos, cr\yPos, m\img, m\xPos, m\yPos)
01270 h\score = h\Score + 2000
01271 Delete cr
01272 msg.Message = New Message
01273 msg\Text$ = "+2000 Points"
01274 msg\timeToDisplay = MilliSecs() + 2000
01275 EndIf
01276 Next
01277
01278 End Function
01279
01280
01281
01282 Function drawExplode1(e1.Explode1)
01283
01284 If e1\frame > 32
01285 Delete e1
01286 Return
01287 EndIf
01288
01289 DrawImage e1\img, e1\xPos, e1\yPos, e1\frame / 3
01290 e1\frame = e1\frame + 1
01291
01292 End Function
01293
01294
01295
01296 Function drawExplode2(e2.Explode2)
01297
01298 e2\xPos = e2\xPos + e2\xs
01299 e2\yPos = e2\yPos + e2\ys
01300 e2\ys = e2\ys + 0.1
01301
01302 ; Fragment out of range?
01303 If (e2\xPos < 0) Or (e2\xPos > SCR_X) Or (e2\yPos > SCR_Y)
01304 Delete e2
01305 Return
01306 ; Update Fragment-Colors
01307 Else If e2\colorB > 0
01308 e2\colorB = e2\colorB - 5
01309 Else If e2\colorG > 0
01310 e2\colorG = e2\colorG - 3
01311 Else If e2\colorR > 0
01312 e2\colorR = e2\colorR - 1
01313 If e2\colorR = 0
01314 Delete e2
01315 Return
01316 EndIf
01317 EndIf
01318
01319 Color e2\colorR, e2\colorG, e2\colorB
01320 Rect e2\xPos-1, e2\yPos-1, 3, 3
01321
01322 End Function
01323
01324
01325
01326 Function drawExplode3(e3.Explode3)
01327
01328 If e3\frame > 4
01329 Delete e3
01330 Return
01331 EndIf
01332
01333 DrawImage e3\img, e3\xPos, e3\yPos, e3\frame
01334 e3\frame = e3\frame + 1
01335
01336 End Function
01337
01338
01339
01340 Function drawBackroundStar(bs.BackroundStar)
01341
01342 ; BackroundStar out of range?
01343 If bs\yPos > SCR_Y
01344 bs\yPos = 0
01345 EndIf
01346
01347 Color bs\colorR, bs\colorG, bs\colorB
01348
01349 ; Should we draw a big BackroundStar?
01350 doBigStar = Rnd(500)
01351 If doBigStar = 0
01352 Oval bs\xPos, bs\yPos, 5, 5, True
01353 Else
01354 Plot bs\xPos, bs\yPos
01355 EndIf
01356
01357 bs\yPos = bs\yPos + 1
01358
01359 End Function
01360
01361
01362
01363 Function drawBunkerFragment(bf.BunkerFragment)
01364
01365 Local bfColor = ((bf\yPos - 50) Mod 255) * 2
01366
01367 For h.Hero = Each Hero
01368 For s.Shot = Each Shot
01369 ; Shot hit BunkerFragment?
01370 If ImageRectOverlap(s\img, s\xPos, s\yPos, bf\xPos, bf\yPos, 15, 15)
01371 Delete bf
01372 Delete s
01373 h\nShots = h\nShots - 1
01374 Return
01375 EndIf
01376 Next
01377 Next
01378
01379 For b.Bomb = Each Bomb
01380 ; Bomb hit BunkerFragment?
01381 If ImageRectOverlap(b\img, b\xPos, b\yPos, bf\xPos, bf\yPos, 15, 15)
01382 Delete bf
01383 Delete b
01384 Return
01385 EndIf
01386 Next
01387
01388 For m.Misile = Each Misile
01389 ; Misile hit BunkerFragment?
01390 If ImageRectOverlap(m\img, m\xPos, m\yPos, bf\xPos, bf\yPos, 15, 15)
01391 Delete bf
01392 Return
01393 EndIf
01394 Next
01395
01396 Color bfColor, bfColor, bfColor
01397 Rect bf\xPos, bf\yPos, 14, 14, True
01398
01399 End Function
01400
01401
01402
01403 Function drawBubble(bu.Bubble)
01404
01405 ; Bubble out of range?
01406 If bu\yPos < waterShore
01407 makeExplode3(bu)
01408 bu\yPos = SCR_Y + waterShore
01409 EndIf
01410
01411 DrawImage bu\img, bu\xPos, bu\yPos
01412 bu\yPos = bu\yPos - bu\speed
01413
01414 End Function
01415
01416
01417
01418 Function drawHiScore()
01419
01420 Local yOffset = SCR_Y / 20
01421 Local yPos = SCR_Y / 2 - 50
01422 Local index = 1
01423
01424 Color 255, 255, 0
01425 SetFont(fntStyleMid)
01426
01427 For table.HiScore = Each HiScore
01428
01429 If index < 11
01430 ; Leave new HiScore-Entry as blank line.
01431 If insertIndex = index
01432 Text SCR_X/2 - 240, yPos, "" + index + ".", True, True
01433 yPos = yPos + yOffset
01434 index = index + 1
01435 EndIf
01436
01437 Text SCR_X/2 - 240, yPos, "" + index + ".", True, True
01438 Text SCR_X/2 - 140, yPos, table\name$, True, True
01439 Text SCR_X/2 - 0, yPos, table\points, True, True
01440 Text SCR_X/2 + 180, yPos, table\date, True, True
01441 yPos = yPos + yOffset
01442 index = index + 1
01443 EndIf
01444 Next
01445
01446 End Function
01447
01448
01449
01450 Function drawInputName(in.InputName)
01451
01452 Local index = 1
01453 Local xPos = SCR_X / 2 - 13 * 20
01454 Local time = MilliSecs()
01455 Local yOffset = SCR_Y / 20
01456 Local yPos = (SCR_Y / 2 - 50) + ((insertIndex-1) * yOffset)
01457
01458
01459 If Len(in\name$) < 3
01460
01461 ; Draw Input-Chars
01462 For index=65 To 90
01463 If index = in\hiLightIndex
01464 SetFont(fntStyleBig)
01465 Text xPos, 50, Chr$(index)
01466 Else
01467 SetFont(fntStyleSmall)
01468 Text xPos, 50, Chr$(index)
01469 EndIf
01470
01471 xPos = xPos + 20
01472 Next
01473
01474
01475 ; Get input
01476 If in\inTimeDelta < time - 100
01477
01478 If KeyDown(203) And in\hiLightIndex > 65
01479 in\hiLightIndex = in\hiLightIndex - 1
01480 EndIf
01481
01482 If KeyDown(205) And in\hiLightIndex < 90
01483 in\hiLightIndex = in\hiLightIndex + 1
01484 EndIf
01485
01486 If KeyHit(57)
01487 in\name$ = in\name$ + Chr$(in\hiLightIndex)
01488 EndIf
01489
01490 in\inTimeDelta = MilliSecs()
01491
01492 EndIf
01493
01494 ; Display Input, so far done.
01495 SetFont(fntStyleMid)
01496 Text SCR_X/2 - 140, yPos, in\name$, True, True
01497
01498 EndIf
01499
01500 End Function
01501
01502
01503
01504 Function drawLevelChange(newLevel, soundOn)
01505
01506 Local imgIndex = newLevel Mod 4
01507 Local sndIndex = newLevel Mod 3
01508 Local alienHeadFrame = 0
01509 Local now = 0
01510 Local i# = 1.0
01511
01512 Cls
01513
01514 Select imgIndex
01515
01516 Case 3
01517 DrawImage imgBack1, SCR_X/2, SCR_Y/2
01518 Case 2
01519 DrawImage imgBack2, SCR_X/2, SCR_Y/2
01520 Case 1
01521 DrawImage imgBack3, SCR_X/2, SCR_Y/2
01522 Case 0
01523 ; Each 4th Level display AlienHead-Movie
01524 FlushKeys
01525 While Not KeyHit(57)
01526 Cls
01527 now = MilliSecs()
01528 DrawImage imgAlienHeadBase, SCR_X/2, SCR_Y/2
01529 DrawImage imgAlienHead, SCR_X/2 - 2, SCR_Y/2 + 58, alienHeadFrame
01530 alienHeadFrame = (alienHeadFrame + 1) Mod 13
01531 SetFont(fntStyleMid)
01532 Color 100, 100, 200
01533 Text SCR_X/2, 80, "W E W I L L W I N", True, True
01534 Flip
01535 If (now - 8000) > demoTime
01536 Exit
01537 EndIf
01538
01539 ; Decrease Volume
01540 If (backroundMusic <> 1) And (i > 0.0) And (soundOn = True)
01541 i = i - 0.1
01542 ChannelVolume chnLoop, i
01543 EndIf
01544
01545 ; Play new Music
01546 If (i >= 0.0) And (i < 0.1) And (soundOn = True)
01547 i = -1
01548 StopChannel(chnLoop)
01549 LoopSound sndLoopNormal
01550 ChannelVolume chnLoop, 1.0
01551 chnLoop = PlaySound(sndLoopNormal)
01552 backroundMusic = 1
01553 EndIf
01554 Delay(400 - alienHeadFrame * 20)
01555 Wend
01556
01557 ; User canceled Alien-Movie? -> Play new Music
01558 If (backroundMusic <> 1) And (i > -1) And (soundOn = True)
01559 StopChannel(chnLoop)
01560 LoopSound sndLoopNormal
01561 ChannelVolume chnLoop, 1.0
01562 chnLoop = PlaySound(sndLoopNormal)
01563 backroundMusic = 1
01564 EndIf
01565
01566 Return
01567
01568 End Select
01569
01570 SetFont(fntStyleBig)
01571 Color 255, 255, 0
01572 Text SCR_X/2, SCR_Y/2, "Level " + newLevel, True, True
01573
01574 Flip
01575
01576 If soundOn = True
01577 If sndIndex = 0
01578 ; Setup new LoopSound.
01579 For i=1.0 To 0.0 Step -0.01
01580 ChannelVolume chnLoop, i
01581 Delay(10)
01582 Next
01583 StopChannel(chnLoop)
01584 LoopSound sndLoopWater
01585 ChannelVolume chnLoop, 1.0
01586 chnLoop = PlaySound(sndLoopWater)
01587 backroundMusic = 2
01588 Else
01589 If backroundMusic <> 1
01590 ; Setup new LoopSound.
01591 For i=1.0 To 0.0 Step -0.01
01592 ChannelVolume chnLoop, i
01593 Delay(10)
01594 Next
01595 StopChannel(chnLoop)
01596 LoopSound sndLoopNormal
01597 ChannelVolume chnLoop, 1.0
01598 chnLoop = PlaySound(sndLoopNormal)
01599 backroundMusic = 1
01600 EndIf
01601 EndIf
01602 EndIf
01603
01604 Delay(2000)
01605
01606 End Function
01607
01608
01609
01610 Function drawMessage(msg.Message)
01611
01612 Local now = MilliSecs()
01613
01614 ;Time to destroy this Message?
01615 If msg\timeToDisplay < now
01616 Delete msg
01617 Return
01618 EndIf
01619
01620 SetFont(fntStyleSmall)
01621 Color 255, 255, 0
01622 Text SCR_X / 2, 0, msg\Text$, True
01623
01624 End Function
01625
01626
01627
01628 Function drawTitleScreen()
01629
01630 DrawImage imgTitle, SCR_X/2, 220
01631 ;drawGfxDriverInfo()
01632 Color 255, 255, 255
01633 SetFont(fntStyleCourier)
01634 Text SCR_X / 2, 450, "[SPACE] -> Shot / Start", True
01635 Text SCR_X / 2, 465, "[LEFT][RIGHT] -> Move Hero ", True
01636 Text SCR_X / 2, 480, "[ESC] -> Exit ", True
01637 Text SCR_X / 2, 495, "[P] -> Pause ", True
01638 Text SCR_X / 2, 510, "[S] -> Sound on/off", True
01639 Text SCR_X / 2, SCR_Y - 30, "written by s_roll . max respect to MosFAT-Crew . October 2003", True
01640
01641 End Function
01642
01643
01644
01645 Function drawGfxDriverInfo()
01646
01647 Local nModes = 0
01648 Local i = 0
01649
01650 SetFont(fntStyleSmall)
01651 Color 255, 255, 0
01652
01653 nModes = CountGfxDrivers()
01654
01655 For i=1 To nModes
01656 Text 50, 400 + i*20, "" + i + "." + GfxDriverName$(i)
01657 Next
01658
01659 i = i + 1
01660 Text 50, 400 + i*20, "Total Graphics-Memory: " + TotalVidMem()/1024 + " kBytes"
01661
01662 i = i + 1
01663 Text 50, 400 + i*20, "Available Graphics-Memory: " + AvailVidMem()/1024 + " kBytes"
01664
01665 End Function
01666
01667
01668
01669 Function drawSpider(sp.Spider)
01670
01671 Local now = MilliSecs()
01672 Local i = 0
01673 Local k = 0
01674
01675 DrawImage sp\img, sp\xPos, sp\yPos
01676 Color 200, 200, 200
01677 Line sp\xPos + 35, 0, sp\xPos + 35, sp\yPos - 135
01678
01679 ; Move Spider slightly into Screen
01680 sp\yPos = sp\yPos + Sin(sp\swing1) + Sin(sp\swing2)
01681 sp\swing1 = (sp\swing1 + 1) Mod 360
01682 sp\swing2 = (sp\swing2 + 0.3) Mod 360
01683
01684 If (sp\yPos > 150)
01685 sp\destReached = True
01686 EndIf
01687
01688 If (sp\destReached = False)
01689 sp\yPos = sp\yPos + 0.1
01690 Else
01691 ; Make some Bombs (spreeding from his hand) as Spider-Weapon
01692 If (now > sp\bombTime + 1500) And (heroInSaveMode = False)
01693 If (sp\bombTimeCount = 0) And (sp\yPos > 25)
01694 For k=1 To 3
01695 For i = sp\xPos-200 To sp\xPos+200 Step 40
01696 b.Bomb = New Bomb
01697 b\xPos = i
01698 b\yPos = sp\yPos + 100 + k*5
01699 b\img = imgBomb
01700 b\speed = 2
01701 b\angel = 0
01702 Next
01703 Next
01704 Else
01705 For i = -5 To 5
01706 b.Bomb = New Bomb
01707 b\xPos = sp\xPos + 100
01708 b\yPos = sp\yPos + 25
01709 b\img = imgBomb
01710 b\speed = 3
01711 b\angel = i + sp\bombAngelOffset
01712 Next
01713 EndIf
01714 sp\bombTime = now
01715 sp\bombTimeCount = (sp\bombTimeCount + 1) Mod 3
01716 ; Rotate Bomb-Spreed-Angel so Hero can't stay at fix Position
01717 sp\bombAngelOffset = sp\bombAngelOffset + 0.3
01718 If sp\bombAngelOffset >= 2
01719 sp\bombAngelOffset = 0.0
01720 EndIf
01721 EndIf
01722 EndIf
01723
01724 For h.Hero = Each Hero
01725 ; Shot hit Spider?
01726 For s.Shot = Each Shot
01727 If ImagesCollide(sp\img, sp\xPos, sp\yPos, 0, s\img, s\xPos, s\yPos, 0)
01728 If sp\destReached = True
01729 sp\hits = sp\hits + 2
01730 EndIf
01731 makeExplode2(s\xPos, s\yPos)
01732 h\nShots = h\nShots - 1
01733 Delete s
01734 EndIf
01735 Next
01736 Next
01737
01738 ; Misile hit Spider?
01739 For m.Misile = Each Misile
01740 If ImagesCollide(sp\img, sp\xPos, sp\yPos, 0, m\img, m\xPos, m\yPos, 0)
01741 If sp\destReached = True
01742 sp\hits = sp\hits + 1
01743 EndIf
01744 makeExplode2(m\xPos, m\yPos)
01745 EndIf
01746 Next
01747
01748 ; Draw Spider-PowerMeter
01749 Color 255, 255, 0
01750 For i=0 To 100-sp\hits Step 10
01751 Rect (SCR_X / 2 - 60) + i, 0, 8, 20
01752 Next
01753
01754 If sp\hits > 100
01755 explodeSpider(sp)
01756 EndIf
01757
01758 End Function
01759
01760
01761
01762 Function explodeHero(h.Hero)
01763
01764 If heroInSaveMode = False
01765
01766 PlaySound(sndExplode2)
01767
01768 e.Explode1 = New Explode1
01769 e\xPos = h\xPos
01770 e\yPos = h\yPos
01771 e\img = imgExplode2
01772 e\frame = 0
01773
01774 If h\nLives > 0
01775 h\nLives = h\nLives - 1
01776 EndIf
01777
01778 resetHero(h)
01779 heroInSaveMode = True
01780
01781 ; Give Hero all Bunkers again
01782 Delete Each BunkerFragment
01783 initBunkerFragments()
01784 EndIf
01785
01786 End Function
01787
01788
01789
01790 Function explodeAlien(a.Alien)
01791
01792 makeExplode1(a\xPos, a\yPos)
01793
01794 nAliens = nAliens - 1
01795
01796 h.Hero = First Hero
01797 If h <> Null
01798 h\score = h\score + 100
01799 EndIf
01800
01801 Delete a
01802
01803 End Function
01804
01805
01806
01807 Function explodeBonusShip(bos.BonusShip)
01808
01809 makeExplode1(bos\xPos, bos\yPos)
01810
01811 makeBonus(bos)
01812
01813 h.Hero = First Hero
01814 If h <> Null
01815 h\score = h\score + 200
01816 EndIf
01817
01818 Delete bos
01819
01820 End Function
01821
01822
01823
01824 Function explodeSpider(sp.Spider)
01825
01826 Local i = 0
01827
01828 makeExplode1(sp\xPos, sp\yPos)
01829
01830 For i = 1 To 10
01831 makeExplode2(sp\xPos-Rnd(10*i), sp\yPos-Rnd(10*i))
01832 makeExplode2(sp\xPos-Rnd(10*i), sp\yPos-Rnd(10*i))
01833 Next
01834
01835 h.Hero = First Hero
01836 If h <> Null
01837 h\score = h\score + 500
01838 EndIf
01839
01840 Delete sp
01841 nAliens = nAliens - 1
01842
01843 End Function
01844
01845
01846
01847 Function makeBonus(bos.BonusShip)
01848
01849 bon.Bonus = New Bonus
01850 bon\xPos = bos\xPos
01851 bon\yPos = bos\yPos
01852 bon\img = imgBonus
01853
01854 End Function
01855
01856
01857
01858 Function makeBomb(a.Alien)
01859
01860 For h.Hero = Each Hero
01861
01862 If a\xPos - 100 < h\xPos And a\xPos + 100 > h\xPos
01863
01864 b.Bomb = New Bomb
01865 b\xPos = a\xPos
01866 b\yPos = a\yPos + 10
01867 b\img = imgBomb
01868 b\speed = Rnd(4, 8)
01869 b\angel = 0
01870
01871 EndIf
01872
01873 Next
01874
01875 End Function
01876
01877
01878
01879 Function makeMisile(h.Hero)
01880
01881 ; Allow only one Misile on Screen (Singelton)
01882 temp.Misile = First Misile
01883 If temp = Null
01884
01885 m.Misile = New Misile
01886 m\xPos# = h\xPos
01887 m\yPos = h\yPos + 18
01888 m\img = imgMisile
01889 m\xDelta# = Rnd(-30,30) / 100
01890 m\frame = 0
01891
01892 EndIf
01893
01894 End Function
01895
01896
01897
01898 Function makeBonusShip()
01899
01900 ; Allow only one BonusShip on Screen (Singelton)
01901 bos.BonusShip = First BonusShip
01902 If bos = Null
01903 bs.BonusShip = New BonusShip
01904 bs\xPos = -20
01905 bs\yPos = 30
01906 bs\img = imgBonusShip
01907 EndIf
01908
01909 End Function
01910
01911
01912
01913 Function makeCruiser()
01914
01915 ; Allow only one Cruiser on Screen (Singelton)
01916 cr.Cruiser = First Cruiser
01917 If cr = Null
01918 cr.Cruiser = New Cruiser
01919 cr\xPos = SCR_X + 20
01920 cr\yPos = 95
01921 cr\img = imgCruiser
01922 cr\frame = 0
01923 EndIf
01924
01925 End Function
01926
01927
01928
01929 Function makeSpider()
01930
01931 ; Allow only one Spider on Screen (Singelton)
01932 sp.Spider = First Spider
01933 If sp = Null
01934 sp.Spider = New Spider
01935 sp\xPos = Rnd(124, SCR_X - 124)
01936 sp\yPos = -135
01937 sp\swing1 = 0
01938 sp\swing2 = 70
01939 sp\destReached = False
01940 sp\img = imgSpider
01941 sp\hits = 0
01942 sp\bombTime = MilliSecs()
01943 sp\bombAngelOffset = 0.0
01944 sp\bombTimeCount = 0
01945
01946 nAliens = nAliens + 1
01947 EndIf
01948
01949 End Function
01950
01951
01952
01953 Function makeExplode1(x, y)
01954
01955 PlaySound(sndExplode1)
01956
01957 e1.Explode1 = New Explode1
01958 e1\xPos = x
01959 e1\yPos = y
01960 e1\img = imgExplode1
01961 e1\frame = 0
01962
01963 End Function
01964
01965
01966
01967 Function makeExplode2(x, y)
01968
01969 Local fragCount = 0
01970 Local anstep# = 0.0
01971 Local an# = 0.0
01972 Local i = 0
01973 Local intensity = 20
01974
01975 PlaySound(sndExplode3)
01976
01977 fragCount = Rnd(intensity) + intensity
01978 anstep = 360.0 / fragCount
01979 an = Rnd(anstep)
01980
01981 For i=1 To fragCount
01982 e2.Explode2 = New Explode2
01983 e2\xPos = x
01984 e2\yPos = y
01985 e2\xs = Cos(an) * Rnd(3, 4)
01986 e2\ys = Sin(an) * Rnd(3, 4)
01987 e2\colorR = 255
01988 e2\colorG = 255
01989 e2\colorB = 255
01990
01991 an = an + anstep
01992 Next
01993
01994
01995 End Function
01996
01997
01998
01999 Function makeExplode3(bu.Bubble)
02000
02001 e3.Explode3 = New Explode3
02002 e3\xPos = bu\xPos
02003 e3\yPos = bu\yPos
02004 e3\img = imgExplode3
02005 e3\frame = 0
02006
02007 End Function
02008
02009
02010
02011 Function loadGraphics()
02012
02013 ; Set Handles of Images to their center
02014 AutoMidHandle True
02015
02016 imgAlien1 = LoadAnimImage("alien1.png", 20, 17, 0, 5)
02017 If imgAlien1 = 0 Then Return -1
02018
02019 imgAlien2 = LoadAnimImage("alien2.png", 10, 14, 0, 5)
02020 If imgAlien2 = 0 Then Return -1
02021
02022 imgAlien3 = LoadAnimImage("alien3.png", 14, 15, 0, 5)
02023 If imgAlien3 = 0 Then Return -1
02024
02025 imgExplode1 = LoadAnimImage("explode1.png",20, 20, 0, 11)
02026 If imgExplode1 = 0 Then Return -1
02027
02028 imgExplode2 = LoadAnimImage("explode2.png",18, 20, 0, 11)
02029 If imgExplode2 = 0 Then Return -1
02030
02031 imgExplode3 = LoadAnimImage("explode3.png",10, 10, 0, 5)
02032 If imgExplode3 = 0 Then Return -1
02033
02034 imgHero = LoadAnimImage("hero.png", 18, 20, 0, 4)
02035 If imgHero = 0 Then Return -1
02036
02037 imgShot = LoadImage("shot.png")
02038 If imgShot = 0 Then Return -1
02039
02040 imgBomb = LoadImage("bomb.png")
02041 If imgBomb = 0 Then Return -1
02042
02043 imgMisile = LoadAnimImage("misile.png", 9, 9, 0, 5)
02044 If imgMisile = 0 Then Return -1
02045
02046 imgBonus = LoadImage("bonus.png")
02047 If imgBonus = 0 Then Return -1
02048
02049 imgBonusShip = LoadImage("bonusship.png")
02050 If imgBonusShip = 0 Then Return -1
02051
02052 imgCruiser = LoadAnimImage("cruiser.png", 11, 15, 0, 4)
02053 If imgCruiser = 0 Then Return -1
02054
02055 imgBubbleSmall = LoadImage("bubblesmall.png")
02056 If imgBubbleSmall = 0 Then Return -1
02057
02058 imgBubbleMid = LoadImage("bubblemid.png")
02059 If imgBubbleMid = 0 Then Return -1
02060
02061 imgBubbleBig = LoadImage("bubblebig.png")
02062 If imgBubbleBig = 0 Then Return -1
02063
02064 imgTitle = LoadImage("title.png")
02065 If imgTitle = 0 Then Return -1
02066
02067 imgBack1 = LoadImage("back1.png")
02068 If imgBack1 = 0 Then Return -1
02069
02070 imgBack2 = LoadImage("back2.png")
02071 If imgBack2 = 0 Then Return -1
02072
02073 imgBack3 = LoadImage("back3.png")
02074 If imgBack3 = 0 Then Return -1
02075
02076 imgAlienHeadBase = LoadImage("headbase.png")
02077 If imgAlienHeadBase = 0 Then Return -1
02078
02079 imgAlienHead = LoadAnimImage("heads.png", 75, 70, 0, 13)
02080 If imgAlienHead = 0 Then Return -1
02081
02082 imgSpider = LoadImage("spider.png")
02083 If imgSpider = 0 Then Return -1
02084
02085 fntStyleBig = LoadFont("Arial Black", 50, True, False, False)
02086 If fntStyleBig = 0 Then Return -1
02087
02088 fntStyleMid = LoadFont("Arial Black", 30, True, False, False)
02089 If fntStyleMid = 0 Then Return -1
02090
02091 fntStyleSmall = LoadFont("Arial Black", 18, True, False, False)
02092 If fntStyleSmall = 0 Then Return -1
02093
02094 fntStyleCourier = LoadFont("Courier", 10, False, False, False)
02095 If fntStyleSmall = 0 Then Return -1
02096
02097 Text 0, 40, "Rescaling Graphics."
02098
02099 ScaleImage imgAlien1, 2.0, 2.0
02100 ScaleImage imgAlien2, 3.0, 3.0
02101 ScaleImage imgAlien3, 3.0, 3.0
02102 ScaleImage imgExplode1, 3.0, 3.0
02103 ScaleImage imgExplode2, 3.0, 3.0
02104 ScaleImage imgHero, 3.0, 3.0
02105 ScaleImage imgShot, 2.0, 2.0
02106 ScaleImage imgBomb, 2.0, 2.0
02107 ScaleImage imgMisile, 2.0, 2.0
02108 ScaleImage imgBonusShip, 2.0, 2.0
02109 ScaleImage imgCruiser, 3.0, 3.0
02110 ScaleImage imgAlienHeadBase, 2.0, 2.0
02111 ScaleImage imgAlienHead, 2.0, 2.0
02112 ResizeImage imgTitle, SCR_X, SCR_Y
02113 ResizeImage imgBack1, SCR_X, SCR_Y
02114 Text 0, 60, "Done."
02115 ResizeImage imgBack2, SCR_X, SCR_Y
02116 Text 0, 80, "Starting mainLoop()."
02117 ResizeImage imgBack3, SCR_X, SCR_Y
02118
02119 AutoMidHandle False
02120
02121 Return 0
02122
02123 End Function
02124
02125
02126
02127 Function loadSounds()
02128
02129 ; Get a Sound. Playing when Alien explode.
02130 sndExplode1 = LoadSound("explode1.wav")
02131 If sndExplode1 = 0 Then Return -1
02132
02133 ; Get a Sound. Playing when Hero explode.
02134 sndExplode2 = LoadSound("explode2.wav")
02135 If sndExplode2 = 0 Then Return -1
02136
02137 ; Get a Sound. Playing when Spider is hit.
02138 sndExplode3 = LoadSound("explode3.wav")
02139 If sndExplode3 = 0 Then Return -1
02140
02141 ; Get a Sound. Playing when Hero get Bonus-Speed.
02142 sndSpeed = LoadSound("speed.wav")
02143 If sndSpeed = 0 Then Return -1
02144
02145 ; Get a Sound. Playing when Hero get Bonus-RapidFire.
02146 sndRapidFire = LoadSound("rapidfire2.wav")
02147 If sndRapidFire = 0 Then Return -1
02148
02149 ; Get a Sound. Playing when Hero get Bonus-Misile.
02150 sndMisile = LoadSound("misile.wav")
02151 If sndMisile = 0 Then Return -1
02152
02153 ; Get a Sound. Playing when Hero get Bonus-ExtraLive.
02154 sndExtraLive = LoadSound("extralive.wav")
02155 If sndExtraLive = 0 Then Return -1
02156
02157 ; Get a Sound. Playing when Hero get Bonus-Points.
02158 sndPoints = LoadSound("points.wav")
02159 If sndPoints = 0 Then Return -1
02160
02161 ; Get a LoopSound. Playing at backround.
02162 sndLoopNormal = LoadSound("loop.mp3")
02163 If sndLoopNormal = 0 Then Return -1
02164
02165 ; Get a LoopSound. Playing at backround in UnderWater-Level.
02166 sndLoopWater = LoadSound("loopwater.mp3")
02167 If sndLoopWater = 0 Then Return -1
02168
02169 ; Setup LoopSound.
02170 LoopSound sndLoopNormal
02171 chnLoop = PlaySound(sndLoopNormal)
02172 backroundMusic = 1
02173 PauseChannel(chnLoop)
02174
02175 Return 0
02176
02177 End Function
02178
02179
02180
02181 Function disposeObjects()
02182
02183 For h.Hero = Each Hero
02184 h\nShots = 0
02185 Next
02186
02187 nAliens = 0
02188
02189 Delete Each Alien
02190 Delete Each Shot
02191 Delete Each Bomb
02192 Delete Each Misile
02193 Delete Each Bonus
02194 Delete Each BonusShip
02195 Delete Each Cruiser
02196 Delete Each Explode1
02197 Delete Each Explode2
02198 Delete Each Explode3
02199 Delete Each BackroundStar
02200 Delete Each Bubble
02201 Delete Each Spider
02202 Delete Each BunkerFragment
02203 Delete Each InputName
02204 Delete Each HiScore
02205
02206 End Function
02207
02208
02209
02210 Function readHiScore()
02211
02212 Local fHandle = 0
02213
02214 fHandle = ReadFile("avshscore.txt")
02215 If fHandle <= 0
02216 Return -1
02217 Else
02218
02219 SeekFile(fHandle, 0)
02220
02221 For i=1 To 10
02222 table.HiScore = New HiScore
02223 table\name$ = ReadString$(fHandle)
02224 table\points = ReadInt(fHandle)
02225 table\date$ = ReadString$(fHandle)
02226 Next
02227
02228 EndIf
02229
02230 CloseFile(fHandle)
02231
02232 Return 0
02233
02234 End Function
02235
02236
02237
02238 Function writeHiScore()
02239
02240 Local fHandle = 0
02241
02242 fHandle = WriteFile("avshscore.txt")
02243 If fHandle <= 0
02244 Return -1
02245 Else
02246
02247 SeekFile(fHandle, 0)
02248
02249 For table.HiScore = Each HiScore
02250 WriteString(fHandle, table\name)
02251 WriteInt(fHandle, table\points)
02252 WriteString(fHandle, table\date)
02253 Next
02254
02255 EndIf
02256
02257 CloseFile(fHandle)
02258
02259 Return 0
02260
02261 End Function
02262
02263
02264
02265 Function writeNewHiScore()
02266
02267 Local fHandle = 0
02268
02269 fHandle = WriteFile("avshscore.txt")
02270 If fHandle <= 0
02271 Return -1
02272 Else
02273
02274 SeekFile(fHandle, 0)
02275
02276 ; Ensure only 10 entries.
02277 For table.HiScore = Each HiScore
02278 Delete table
02279 Next
02280
02281 For i=1 To 10
02282 table.HiScore = New HiScore
02283 table\name$ = "FAT"
02284 table\points = 10000 - i*800
02285 table\date$ = "18 May 1974"
02286 Next
02287
02288 For table.HiScore = Each HiScore
02289 WriteString(fHandle, table\name$)
02290 WriteInt(fHandle, table\points)
02291 WriteString(fHandle, table\date$)
02292 Next
02293
02294 EndIf
02295
02296 Return 0
02297
02298 End Function
02299
02300
02301
02302 End