FormBW.frm
上传用户:life_sale
上传日期:2021-07-23
资源大小:805k
文件大小:394k
源码类别:

射击游戏

开发平台:

Visual Basic

  1.     Kind As Integer         'Image List Index Number
  2.     Bul_Kind As Integer     'Bullet Kind
  3.     Frame As Integer        'Image Index
  4.     BullType As Integer     'Bullets Shot
  5.     PosX As Integer         'Current X Coordinate
  6.     PosY As Integer         'Current Y Coordinate
  7.     DestX As Integer        'Destination X Coordiante
  8.     DestY As Integer        'Destination Y Coordiante
  9.     Span As Integer         'For Event counter
  10.     Patt As Integer         'Movement Pattern
  11.     Spd As Integer          'Move Speed
  12.     Life As Integer         'Hit Points
  13.     Max_Life As Integer     'For BOSS's Life Bar Calculation
  14.     Score As Integer        'Worth of Points
  15.     Has_Bonus As Boolean    'Whether Ship has BoNUS =)
  16.     Firing_Patt As Integer  'Firing Pattern
  17.     Boss As Boolean         'Whether it's a boss or not
  18. End Type
  19. Dim EBull(200) As EBullet
  20. Dim EShip(40) As EnemyShip      '38,39,40 for BOSS
  21. Private Sub Form_GotFocus()         'Returns Focus to picboxes
  22. 'If the player accidentally clicked the mouse on the form,
  23. 'focus is returned to the current layer, so that keydown events
  24. 'are still acknowledged.
  25. If MenuMode_Enabled = True Then
  26.     Menu_Layer.SetFocus
  27. End If
  28. If RemapMode_Enabled = True Then
  29.     Remap_Layer.SetFocus
  30. End If
  31. If GameMode_Enabled = True Then
  32.     Game_Layer.SetFocus
  33. End If
  34. If PlayMode_Enabled = True Then
  35.     Play_Layer.SetFocus
  36. End If
  37. If PauseMode_Enabled = True Then
  38.     Pause_Layer.SetFocus
  39. End If
  40. End Sub
  41. Private Sub Form_Load()
  42. 'This sub basically set's the layers, menus, labels, bars,
  43. 'to their correct position. Dun mess this part.
  44. Dim i As Integer
  45.     Wait_label2.Visible = True
  46.     Wait_label2.Top = 4320
  47.     Wait_label2.Left = 2520
  48.     
  49.     FormBW.BackColor = &H80000012
  50.     
  51.     FormBW.Width = 5010         'Set Form Size
  52.     FormBW.Height = 6990        '
  53.     Menu_Layer.Width = 4920     '
  54.     Menu_Layer.Height = 6490    '
  55.     Menu_Layer.Left = 0         '
  56.     Menu_Layer.Top = 0          '
  57.     Remap_Layer.Width = 4920    '
  58.     Remap_Layer.Height = 6490   '
  59.     Remap_Layer.Left = 0        '
  60.     Remap_Layer.Top = 0         '
  61.     Game_Layer.Width = 4920     '
  62.     Game_Layer.Height = 6490    '
  63.     Game_Layer.Left = 0         '
  64.     Game_Layer.Top = 0          '
  65.     Play_Layer.Width = 6375     '
  66.     Play_Layer.Height = 8655    '
  67.     Play_Layer.Left = -720      '
  68.     Play_Layer.Top = -1440      '
  69.     Pause_Layer.Width = 2895    '
  70.     Pause_Layer.Height = 2055   '
  71.     Pause_Layer.Left = 1080     '
  72.     Pause_Layer.Top = 2040      '
  73.     
  74.     'Set the speed optimization
  75.     tmMenu.Interval = FormOptimize.Sldr_ms.Value
  76.     tmOneFrame.Interval = FormOptimize.Sldr_ms.Value
  77.     tmIntro.Interval = FormOptimize.Sldr_ms.Value * 10
  78.     tmMenu.Interval = FormOptimize.Sldr_ms.Value
  79.     If FormOptimize.Opt_Detail(0).Value = True Then Detail_Level = 50
  80.     If FormOptimize.Opt_Detail(1).Value = True Then Detail_Level = 400
  81.     If FormOptimize.Opt_Detail(2).Value = True Then Detail_Level = 1000
  82.     
  83.     'Sets the currently enabled mode to MENU
  84.     MenuMode_Enabled = True
  85.     GameMode_Enabled = False
  86.     RemapMode_Enabled = False
  87.     PlayMode_Enabled = False
  88.     PauseMode_Enabled = False
  89.     
  90.     For i = 0 To 5              'Initialize ship's Configuration
  91.         SHP(i) = 0
  92.         Call LoadWbox(i, 0)
  93.     Next i
  94.     
  95.     Call Load_Keys
  96.     Call Load_Sounds
  97.     Call Load_Graphics
  98.     Call Wait(1, 1)           'Call main menu
  99.     Call Load_Intro
  100. End Sub
  101. Private Sub MainMenu()          '>>>MAIN MENU<<<
  102. Dim i As Integer
  103.     
  104.     'Aligns all the cursor to recognize the options available
  105.     'on the main menu. there are 3 items (start, options, quit),
  106.     'so the array begins with 0 and end with 2.
  107.     'The third number is the cursor's current position,
  108.     'which is default on 'Start Game' (0)
  109.     'There are six coloured cursors, so the last 2 number
  110.     'represents the start index(0) and end index(5)
  111.     'also related to tracking sub later.
  112.     Call Set_Curr(0, 2, 0, 0, 5)
  113.     
  114.     'Positions the menu in the correct places.
  115.     For i = Curr_Start To Curr_End      'Align menus
  116.         menu(i).Left = 1370
  117.         menu(i).Top = 4840 + (i * 400)
  118.     Next i
  119.     
  120.     Call Align_Curr
  121.     
  122.     Wait_Label.Visible = False
  123.     
  124.     tmMenu.Enabled = True
  125.     Call PLAY(2)                           'Load BGM
  126. End Sub
  127. Private Sub RemapMenu()             '>>>REMAP MENU<<<
  128.     WaitForRemap = False
  129.     
  130.     'Same as above, 10 options available (9-18)
  131.     'Default on 9
  132.     'Another six coloured cursor (6-11)
  133.     Call Set_Curr(9, 18, 9, 6, 11)
  134.     Call Align_Curr
  135.     Call Load_Keys
  136. End Sub
  137. Private Sub GameMenu()             '>>>GAME MENU<<<
  138.     'Left and right selection not available
  139.     'Default only recognize up and down
  140.     MenuSelectLR = False
  141.         
  142.     Call Set_Curr(19, 26, 19, 12, 17)
  143.     Call Align_Curr
  144.     
  145.     'Aligns weapon display boxes
  146.     Weapon_Box.Width = 2255
  147.     Weapon_Box.Height = 2175
  148.     Weapon_Box.Left = 2480
  149.     Weapon_Box.Top = 3375
  150.     Weapon_Box.BorderStyle = 0
  151. End Sub
  152. Private Sub PlayMenu()              '>>>PLAY MENU<<<
  153. 'This is a large sub here. Basically when a new game starts,
  154. 'all the bars and HUDs needs to be realigned.
  155. 'The following codes basically sets their top, left, width, height...
  156. Dim i As Integer
  157. Const LH = 255      'Label Height
  158. Const LW = 615      'Label Width
  159.     
  160.     'A new game ...
  161.     If GameStarted = False Then
  162.         Elasped = 0
  163.         TotFPS = 0
  164.     
  165.         BossBar.Top = 1080
  166.         Stats_Bar.Top = 7920
  167.         Stats_Bar.Left = 720
  168.         Stats_Bar.Height = 975
  169.         Stats_Bar.Width = 4935
  170.         Stats_Bar.Visible = False
  171.         
  172.         Stt_SHD_Lbl.Top = 0
  173.         Stt_SHD_Lbl.Left = 0
  174.         Stt_SHD_Lbl.Height = LH
  175.         Stt_SHD_Lbl.Width = 495
  176.         Stt_SHD_Lbl.BackColor = &H0&
  177.         Stt_SHD_Lbl.ForeColor = &HFF00&
  178.         Stt_SPE_Lbl.Top = 240
  179.         Stt_SPE_Lbl.Left = 0
  180.         Stt_SPE_Lbl.Height = LH
  181.         Stt_SPE_Lbl.Width = 495
  182.         Stt_SPE_Lbl.BackColor = &H0&
  183.         Stt_SPE_Lbl.ForeColor = &HFF00&
  184.         Stt_LVL_MG.Top = 0
  185.         Stt_LVL_MG.Left = 2880
  186.         Stt_LVL_MG.Height = LH
  187.         Stt_LVL_MG.Width = 855
  188.         Stt_LVL_SG.Top = 240
  189.         Stt_LVL_SG.Left = 2880
  190.         Stt_LVL_SG.Height = LH
  191.         Stt_LVL_SG.Width = 855
  192.         
  193.         Stt_MGUN_F.Top = 0
  194.         Stt_MGUN_F.Left = 3720
  195.         Stt_MGUN_F.Height = LH
  196.         Stt_MGUN_F.Width = LW
  197.         Stt_SGUN_F.Top = 240
  198.         Stt_SGUN_F.Left = 3720
  199.         Stt_SGUN_F.Height = LH
  200.         Stt_SGUN_F.Width = LW
  201.         Stt_ENG_F.Top = 0
  202.         Stt_ENG_F.Left = 4320
  203.         Stt_ENG_F.Height = LH
  204.         Stt_ENG_F.Width = LW
  205.         Stt_PWR_F.Top = 240
  206.         Stt_PWR_F.Left = 4320
  207.         Stt_PWR_F.Height = LH
  208.         Stt_PWR_F.Width = LW
  209.   
  210.         Stt_MGUN_R.Top = 0
  211.         Stt_MGUN_R.Left = 3720
  212.         Stt_MGUN_R.Height = LH
  213.         Stt_MGUN_R.Width = LW
  214.         Stt_SGUN_R.Top = 240
  215.         Stt_SGUN_R.Left = 3720
  216.         Stt_SGUN_R.Height = LH
  217.         Stt_SGUN_R.Width = LW
  218.         Stt_ENG_R.Top = 0
  219.         Stt_ENG_R.Left = 4320
  220.         Stt_ENG_R.Height = LH
  221.         Stt_ENG_R.Width = LW
  222.         Stt_PWR_R.Top = 240
  223.         Stt_PWR_R.Left = 4320
  224.         Stt_PWR_R.Height = LH
  225.         Stt_PWR_R.Width = LW
  226.   
  227.         BAR_SHD_C.Top = 30
  228.         BAR_SHD_C.Left = 540
  229.         BAR_SHD_C.Height = 75
  230.         BAR_SHD_C.Width = 2175
  231.         BAR_SHD_R.Top = 90
  232.         BAR_SHD_R.Left = 540
  233.         BAR_SHD_R.Height = 75
  234.         BAR_SHD_R.Width = 2175
  235.         BAR_SPE_C.Top = 270
  236.         BAR_SPE_C.Left = 540
  237.         BAR_SPE_C.Height = 75
  238.         BAR_SPE_C.Width = 2175
  239.         BAR_SPE_R.Top = 330
  240.         BAR_SPE_R.Left = 540
  241.         BAR_SPE_R.Height = 75
  242.         BAR_SPE_R.Width = 2175
  243.     
  244.         For i = 1 To 4
  245.             Bufferbox(i).Top = 2880 + ((i - 1) * 360)
  246.             Bufferbox(i).Left = 1080
  247.             Bufferbox(i).Width = 15
  248.             BufferText(i).Caption = ""
  249.         Next i
  250.         
  251.         Bufferbox(0).Top = Bufferbox(1).Top
  252.         Bufferbox(0).Left = Bufferbox(1).Left
  253.         Bufferbox(0).Width = Bufferbox(1).Width
  254.         BufferText(0).Caption = BufferText(1).Caption
  255.         Bufferbox(6).Top = 1080
  256.         Bufferbox(6).Left = 3840
  257.         Bufferbox(5).Top = 1080
  258.         Bufferbox(5).Left = 840
  259.         BufferText(6).Caption = "000000"
  260.         
  261.         Buffer_Count = 0
  262.         
  263.         Lock_All = True
  264.         Lock_Engine = False
  265.         Lock_Generator = False
  266.         Lock_MainGun = False
  267.         Lock_SideGun = False
  268.         
  269.         ShipX = 2720
  270.         ShipY = 8440
  271.         Ship_Dir = 0
  272.         
  273.         For i = 0 To 3
  274.             Ship_Moving(i) = False  'All directions null
  275.         Next i
  276.         
  277.         For i = 0 To 300
  278.             Bull(i).Used = False    'Initialized bullets to unused
  279.         Next i
  280.         
  281.         For i = 0 To 200
  282.             EBull(i).Used = False   'Initialize bullets to unused
  283.         Next i
  284.         
  285.         MG_Lvl = 1
  286.         SG_Lvl = 1
  287.         SHD_Avail = True
  288.         SPE_Avail = True
  289.         
  290.         Select Case (SHP(2))        'Setting Special
  291.         Case 0:
  292.             SPE_Width = 435
  293.             BAR_SPE_C.Width = 435
  294.             BAR_SPE_R.Width = 435
  295.         Case 1:
  296.             SPE_Width = 870
  297.             BAR_SPE_C.Width = 870
  298.             BAR_SPE_R.Width = 870
  299.         Case 2:
  300.             SPE_Width = 1305
  301.             BAR_SPE_C.Width = 1305
  302.             BAR_SPE_R.Width = 1305
  303.         Case 3:
  304.             SPE_Width = 1740
  305.             BAR_SPE_C.Width = 1740
  306.             BAR_SPE_R.Width = 1740
  307.         Case 4:
  308.             SPE_Width = 2175
  309.             BAR_SPE_C.Width = 2175
  310.             BAR_SPE_R.Width = 2175
  311.         End Select
  312.         
  313.         Select Case (SHP(3))        'Setting Shields
  314.         Case 0:
  315.             SHD_Width = 435
  316.             BAR_SHD_C.Width = 435
  317.             BAR_SHD_R.Width = 435
  318.             SHD_Charge_Base = 7
  319.         Case 1:
  320.             SHD_Width = 870
  321.             BAR_SHD_C.Width = 870
  322.             BAR_SHD_R.Width = 870
  323.             SHD_Charge_Base = 6
  324.         Case 2:
  325.             SHD_Width = 1305
  326.             BAR_SHD_C.Width = 1305
  327.             BAR_SHD_R.Width = 1305
  328.             SHD_Charge_Base = 5
  329.         Case 3:
  330.             SHD_Width = 1740
  331.             BAR_SHD_C.Width = 1740
  332.             BAR_SHD_R.Width = 1740
  333.             SHD_Charge_Base = 4
  334.         Case 4:
  335.             SHD_Width = 2175
  336.             BAR_SHD_C.Width = 2175
  337.             BAR_SHD_R.Width = 2175
  338.             SHD_Charge_Base = 3
  339.         End Select
  340.         
  341.         Repair_Speed = 2                'BASE VALUE
  342.         SHD_Charging = False
  343.         SPE_Charging = False
  344.         
  345.         'Sets the speed of the ship based on the engines chosen
  346.         Select Case (SHP(5))            'ENGINE - Affects Repair
  347.         Case 0:
  348.             Ship_Speed = 80
  349.             Repair_Speed = Repair_Speed + 10
  350.         Case 1:
  351.             Ship_Speed = 100
  352.             Repair_Speed = Repair_Speed + 8
  353.         Case 2:
  354.             Ship_Speed = 130
  355.             Repair_Speed = Repair_Speed + 6
  356.         Case 3:
  357.             Ship_Speed = 160
  358.             Repair_Speed = Repair_Speed + 4
  359.         End Select
  360.   
  361.         For i = 1 To 40
  362.             EShip(i).Used = False
  363.         Next i
  364.         
  365.         Stt_LVL_MG.Caption = "MG  1.0"
  366.         Stt_LVL_SG.Caption = "SG   1.0"
  367.   
  368.         'This is for initialization of the stars in the background
  369.         For i = 0 To Detail_Level     'For stars
  370.             Star(i).PosX = (Rnd * 4920 + 720)
  371.             Star(i).PosY = (Rnd * 6480 + 1440)
  372.             Star(i).Spd = (Rnd * 40 + 10)
  373.             Star(i).Color = (Rnd * 2 + 1)
  374.         Next i
  375.         
  376.         For i = 0 To 2
  377.             PowerUp(i).Used = False
  378.         Next i
  379.         
  380.         'This are all (mostly) the variables that will be used
  381.         'during playing mode. Description is above in the
  382.         'declaration section
  383.         Play_Layer.BackColor = &H0&
  384.         MG_Lvl = 1
  385.         SG_Lvl = 1
  386.         Bull_Delay = 0
  387.         Bull_Delay2 = 0
  388.         Ship_Firing = False
  389.         GameStarted = True
  390.         GameScore = 0
  391.         SHIELD_ON_OFF = 0
  392.         ShakeIT = 0
  393.         Wait_label2.Visible = False
  394.         Moving_StatsBar = 0
  395.         Moving_SpecialBar = 0
  396.         Moving_BossBar = 0
  397.         Special_Running = False
  398.         Special_Delay = 0
  399.         GEC = 0
  400.         KillCount = 0
  401.         KilledBoss = False
  402.         
  403.         Giga_Count = 0
  404.         'Resets all stage counters to 0
  405.         For i = 0 To 4
  406.             C_GEC(i) = 0
  407.         Next i
  408.         'Load explosion sounds into media players
  409.         For i = 0 To 3
  410.             MPS(i).Open (App.Path & "soundsplode.wav")
  411.         Next i
  412.         'Load explosion sounds into media players
  413.         For i = 4 To 7
  414.             MPS(i).Open (App.Path & "soundbplode.wav")
  415.         Next i
  416.     End If
  417.     
  418.     TotFPS = 0
  419.     Elasped = 0
  420.     tmOneFrame.Enabled = True       'Officially Starts the Game!
  421.     tmOneSecond = True              'This is for FPS counting
  422. End Sub
  423. Private Sub PauseMenu()             '>>>PAUSE MENU<<<
  424. Dim i As Integer
  425.     Call Set_Curr(27, 29, 27, 18, 23)
  426.     Call Align_Curr
  427.     
  428.     'HALTS the ship during pause
  429.     For i = 0 To 3
  430.         Ship_Moving(i) = False
  431.     Next i
  432.     
  433.     'Halts firing too.
  434.     Ship_Firing = False
  435. End Sub
  436. Private Sub Set_Curr(C_Start As Integer, C_End As Integer, C_Pos As Integer, C_From As Integer, C_To As Integer)
  437.     'This basically tells the tmMenu_Timer what
  438.     'are the menus that will be used in the current layer.
  439.     'Explained above during the first call of Set_Curr
  440.     Curr_Start = C_Start
  441.     Curr_End = C_End
  442.     Curr_Pos = C_Pos
  443.     Curr_From = C_From
  444.     Curr_To = C_To
  445. End Sub
  446. Private Sub Align_Curr()                'Aligns Cursor
  447. 'Aligns the cursors to the option selection boxes
  448. Dim i As Integer
  449.     For i = Curr_From To Curr_To
  450.         Curr(i).Left = menu(Curr_Start).Left
  451.         Curr(i).Width = menu(Curr_Start).Width
  452.     Next i
  453.     
  454.     'Call the cursor to move to the top selection box
  455.     Call TrackMenu(menu(Curr_Start).Top, Curr_From, Curr_From)  'Track to 1st item
  456.     'Changes color of the text
  457.     Call Change_Text(Curr_Start)                                'Change color of 1st item
  458. End Sub
  459. Private Sub I_Box_GotFocus(Index As Integer)
  460.     Menu_Layer.SetFocus
  461. End Sub
  462. Private Sub Bufferbox_GotFocus(Index As Integer)
  463.     Play_Layer.SetFocus
  464. End Sub
  465. Private Sub Stats_Bar_GotFocus()
  466.     Play_Layer.SetFocus
  467. End Sub
  468. Private Sub tmMenu_Timer()  'Highlight Selected Menu
  469. 'REFERENCE: For a more theoritical tutorial on tracking,
  470. '           refer to my submission titled 'Sprite Tracking' on
  471. '           Planet Source Code
  472. Dim i As Integer
  473.    For i = Curr_From To Curr_To
  474.             Curr(i).Top = Curr(i).Top - Bal(i)
  475.             If i = Curr_From Then
  476.                 Call TrackMenu(menu(Curr_Pos).Top, i, Curr_From)
  477.             Else
  478.                 Call TrackMenu(Curr(i - 1).Top, i, Curr_From)
  479.             End If
  480.     Next i
  481. End Sub
  482. Private Sub TrackMenu(Dest As Single, i As Integer, Init As Integer)
  483. 'REFERENCE: For a more theoritical tutorial on tracking,
  484. '           refer to my submission titled 'Sprite Tracking' on
  485. '           Planet Source Code
  486. Const SP = 1    'Move Speed
  487. Const TK = 1    'Track Speed
  488.     If i = Init Then
  489.         Bal(i) = (Curr(i).Top - Dest) / SP
  490.     Else:
  491.         Bal(i) = (Curr(i).Top - Dest) / TK
  492.     End If
  493. End Sub
  494. Private Sub Change_Text(Choice As Integer)  'Change Highlighted Text Color
  495. 'This is a simple sub that changes the colour of the text
  496. 'when it is the currently selected
  497. Dim i As Integer
  498. Dim x As Integer
  499.     For i = Curr_Start To Curr_End
  500.         If i = Choice Then
  501.             If i = 19 Or i = 20 Then        'Start/Abort Color
  502.                 menu(i).ForeColor = &HFFFF&
  503.             Else:
  504.                 menu(i).ForeColor = &HFF00&
  505.             End If
  506.             If i >= 19 And i <= 26 Then
  507.                 For x = 21 To 26            'Wbox Color
  508.                     If x = i Then
  509.                         WBox(x - 21).ForeColor = &HFFFF80
  510.                     Else:
  511.                         WBox(x - 21).ForeColor = &HC0C0FF
  512.                     End If
  513.                 Next x
  514.             End If
  515.         Else:
  516.             menu(i).ForeColor = &HFFFFFF
  517.         End If
  518.     Next i
  519. End Sub
  520. Private Sub Menu_Layer_KeyDown(Key As Integer, Shift As Integer)
  521.     
  522.     'Detects the keypresses that the user made in the Menu Layer
  523.     If MenuMode_Enabled = True And Wait_Label.Visible = False Then
  524.         Select Case (Key)
  525.         Case 27:                                'ESC
  526.             Call Quit
  527.         Case 38:                                'Menu KEYS
  528.             Curr_Pos = Curr_Pos - 1     'UP BUTTON
  529.             If Curr_Pos < Curr_Start Then Curr_Pos = Curr_End
  530.             Call PLAY(1)            'Play the 'beep' sound =)
  531.         Case 40:
  532.             Curr_Pos = Curr_Pos + 1     'DOWN BUTTON
  533.             If Curr_Pos > Curr_End Then Curr_Pos = Curr_Start
  534.             Call PLAY(1)
  535.         Case 13:
  536.             Select Case (Curr_Pos)
  537.             Case 0:                     'START
  538.                 Call Show_Hide(3, 1, 0.01, 3)
  539.             Case 1:                     'REMAP
  540.                 Call Show_Hide(2, 1, 0.01, 2)
  541.             Case 2:                     'QUIT
  542.                 Call Quit
  543.             End Select
  544.             Call PLAY(1)
  545.         End Select
  546.     Call Change_Text(Curr_Pos)
  547.     End If
  548.     If Key = 115 And Shift = 2 Then Call Quit  '(Alt + F4)
  549. End Sub
  550. Private Sub Remap_Layer_KeyDown(Key As Integer, Shift As Integer)
  551.     
  552.     'Detects the keypresses that the user made in the Option Layer
  553.     If WaitForRemap = True Then     'See if it is waiting for user to enter a new remap button
  554.         Call LoadList(Key, (Curr_Pos - 6))  'Load the Keyboard button Name
  555.         KYB(Curr_Pos - 9) = Key        'Sets the saved button position to memory
  556.         Call PLAY(1)
  557.         WaitForRemap = False        'Program no longer waiting for user to enter a new keyboard button for remap
  558.     Else:
  559.         If RemapMode_Enabled = True Then
  560.             Select Case (Key)
  561.             Case 27:                                'ESC
  562.                 Call PLAY(1)
  563.                 Call Show_Hide(1, 2, 0.01, 1)
  564.             Case 38:                                'Menu KEYS
  565.                 Curr_Pos = Curr_Pos - 1 'UP
  566.                 If Curr_Pos < Curr_Start Then Curr_Pos = Curr_End
  567.                 Call PLAY(1)
  568.             Case 40:
  569.                 Curr_Pos = Curr_Pos + 1 'DOWN
  570.                 If Curr_Pos > Curr_End Then Curr_Pos = Curr_Start
  571.                 Call PLAY(1)
  572.             
  573.             'VOLUME CONTROLS
  574.             Case 39:                        'INCREASE
  575.                 If Curr_Pos = 15 Then   'RIGHT
  576.                     Vol(0) = Vol(0) + 1
  577.                     If Vol(0) > 100 Then
  578.                         Vol(0) = 100
  579.                     End If
  580.                     LabelSE.Caption = Str(Vol(0))
  581.                     Call PLAY(1)
  582.                 End If
  583.                 If Curr_Pos = 16 Then   'LEFT
  584.                     Vol(1) = Vol(1) + 1
  585.                     If Vol(1) > 100 Then
  586.                         Vol(1) = 100
  587.                     End If
  588.                     LabelBGM.Caption = Str(Vol(1))
  589.                 End If
  590.                 Call Set_Volumes
  591.             Case 37:                'DECREASE
  592.                 If Curr_Pos = 15 Then
  593.                     Vol(0) = Vol(0) - 1
  594.                     If Vol(0) < 0 Then
  595.                         Vol(0) = 0
  596.                     End If
  597.                     LabelSE.Caption = Str(Vol(0))
  598.                     Call PLAY(1)
  599.                 End If
  600.                 If Curr_Pos = 16 Then
  601.                     Vol(1) = Vol(1) - 1
  602.                     If Vol(1) < 0 Then
  603.                         Vol(1) = 0
  604.                     End If
  605.                     LabelBGM.Caption = Str(Vol(1))
  606.                 End If
  607.                 Call Set_Volumes
  608.             
  609.             'Remap new keyboard buttons
  610.             Case 13:    'ENTER KEY
  611.                 Select Case (Curr_Pos)
  612.                 Case 9:                     'REMAP UP
  613.                     Call Remap_Keys
  614.                 Case 10:                    'REMAP DOWN
  615.                     Call Remap_Keys
  616.                 Case 11:                    'REMAP LEFT
  617.                     Call Remap_Keys
  618.                 Case 12:                    'REMAP RIGHT
  619.                     Call Remap_Keys
  620.                 Case 13:                    'REMAP FIRE
  621.                     Call Remap_Keys
  622.                 Case 14:                    'REMAP SPECIAL
  623.                     Call Remap_Keys
  624.                 Case 17:                     'ACCEPT
  625.                     Call Show_Hide(1, 2, 0.1, 1)
  626.                     Call Save_Keys  'Saved new keys
  627.                 Case 18:                      'CANCEL
  628.                     Call Show_Hide(1, 2, 0.1, 1)
  629.                     Call Load_Keys  '  Restore default keys
  630.                 End Select
  631.                 Call PLAY(1)
  632.             End Select
  633.         Call Change_Text(Curr_Pos)
  634.         End If
  635.     End If
  636.     If Key = 115 And Shift = 2 Then Call Quit  '(Alt + F4)
  637. End Sub
  638. Private Sub Remap_Keys()
  639.     'Sets the program to wait for the user to key in a button
  640.     WaitForRemap = True
  641.     menu(Curr_Pos - 6).Caption = "Press a Key"
  642. End Sub
  643. Private Sub Game_Layer_KeyDown(Key As Integer, Shift As Integer)
  644.     'This is for ship configuration before u start the game
  645.     If GameMode_Enabled = True Then
  646.         Select Case (Key)
  647.         Case 27:                                'ESC
  648.             Call Show_Hide(1, 3, 0.1, 1)
  649.             Call PLAY(1)
  650.         Case 38:                                'Menu KEYS
  651.             Curr_Pos = Curr_Pos - 1     'SCROLL through options
  652.             If Curr_Pos < Curr_Start Then Curr_Pos = Curr_End
  653.             If Curr_Pos >= 21 And Curr_Pos <= 26 Then
  654.                 MenuSelectLR = True     'Selected menu can scroll left and right
  655.             Else:
  656.                 MenuSelectLR = False    'Selected menu is dormant
  657.             End If
  658.             Call PLAY(1)
  659.         Case 40:
  660.             Curr_Pos = Curr_Pos + 1     'SCROLL through options
  661.             If Curr_Pos > Curr_End Then Curr_Pos = Curr_Start
  662.             If Curr_Pos >= 21 And Curr_Pos <= 26 Then
  663.                 MenuSelectLR = True
  664.             Else:
  665.                 MenuSelectLR = False
  666.             End If
  667.             Call PLAY(1)
  668.         Case 39:                    'INCREASE WEAPON
  669.            If MenuSelectLR = True Then
  670.             If Curr_Pos >= 21 And Curr_Pos <= 26 Then
  671.                 'Scrolls through the ship's configurations
  672.                 SHP(Curr_Pos - 21) = SHP(Curr_Pos - 21) + 1
  673.                 Select Case (Curr_Pos - 21)
  674.                 Case 0:
  675.                     If SHP(0) > 4 Then SHP(0) = 0   'After last option, returns to first option
  676.                 Case 1:
  677.                     If SHP(1) > 3 Then SHP(1) = 0
  678.                 Case 2:
  679.                     If SHP(2) > 4 Then SHP(2) = 0
  680.                 Case 3:
  681.                     If SHP(3) > 4 Then SHP(3) = 0
  682.                 Case 4:
  683.                     If SHP(4) > 2 Then SHP(4) = 0
  684.                 Case 5:
  685.                     If SHP(5) > 3 Then SHP(5) = 0
  686.                 End Select
  687.                 'Put the name of the item selected in the wbox text
  688.                 Call LoadWbox(Curr_Pos - 21, SHP(Curr_Pos - 21))
  689.             End If
  690.             Call PLAY(3)
  691.            End If
  692.         Case 37:                    'DECREASE WEAPON
  693.            If MenuSelectLR = True Then
  694.             'Same as above...
  695.             If Curr_Pos >= 21 And Curr_Pos <= 26 Then
  696.                 SHP(Curr_Pos - 21) = SHP(Curr_Pos - 21) - 1
  697.                 Select Case (Curr_Pos - 21)
  698.                 Case 0:
  699.                     If SHP(0) < 0 Then SHP(0) = 4
  700.                 Case 1:
  701.                     If SHP(1) < 0 Then SHP(1) = 3
  702.                 Case 2:
  703.                     If SHP(2) < 0 Then SHP(2) = 4
  704.                 Case 3:
  705.                     If SHP(3) < 0 Then SHP(3) = 4
  706.                 Case 4:
  707.                     If SHP(4) < 0 Then SHP(4) = 2
  708.                 Case 5:
  709.                     If SHP(5) < 0 Then SHP(5) = 3
  710.                 End Select
  711.                 Call LoadWbox(Curr_Pos - 21, SHP(Curr_Pos - 21))
  712.             End If
  713.             Call PLAY(3)
  714.            End If
  715.         Case 13:
  716.             Select Case (Curr_Pos)
  717.             Case 19:                     'START MISSION
  718.                 Call PLAY(1)
  719.                 MP2.Mute = True
  720.                 Play_Layer.Cls
  721.                 Wait_label2.Visible = True
  722.                 Call Show_Hide(4, 3, 0.3, 4)    '>goto play menu
  723.             Case 20:                      'ABORT
  724.                 Call PLAY(1)
  725.                 Call Show_Hide(1, 3, 0.1, 1)    '>goto main menu
  726.             End Select
  727.             Call PLAY(1)
  728.         End Select
  729.         Call Change_Text(Curr_Pos)
  730.     End If
  731.     If Key = 115 And Shift = 2 Then Call Quit  '(Alt + F4)
  732. End Sub
  733. Private Sub Play_Layer_KeyDown(Key As Integer, Shift As Integer)
  734.     
  735.     'These buttons follows the buttons customly remapped by the player.
  736.     If PlayMode_Enabled = True Then
  737.         Select Case (Key)
  738.         Case 27:                                'ESC
  739.             Call Show_Hide(5, 4, 0.01, 5)       'Shows the PAUSE Menu
  740.             Call PLAY(1)
  741.         End Select
  742.     
  743.         If OVERIDE = False Then 'Lost control of ship
  744.             If Lock_All = False Then
  745.                 Select Case (Key)
  746.                 'Ship moving in a certain direction is true
  747.                 Case KYB(0):                                'UP
  748.                     If Lock_Engine = False Then Ship_Moving(1) = True
  749.                 Case KYB(1):                                'DOWN
  750.                     If Lock_Engine = False Then Ship_Moving(3) = True
  751.                 Case KYB(2):                                'LEFT
  752.                     If Lock_Engine = False Then Ship_Moving(0) = True
  753.                 Case KYB(3):                                'RIGHT
  754.                     If Lock_Engine = False Then Ship_Moving(2) = True
  755.                 Case KYB(4):                                'FIRE
  756.                     Ship_Firing = True
  757.                 Case KYB(5):                                'SPECIAL
  758.                     Call Use_Special(SHP(2))
  759.                 End Select
  760.             End If
  761.         End If
  762.     End If
  763. End Sub
  764. Private Sub Play_Layer_KeyUp(Key As Integer, Shift As Integer)
  765.     'The ship stops performing that action if button is depressed
  766.     If OVERIDE = False Then
  767.             Select Case (Key)
  768.             Case KYB(0):                                'UP
  769.                 Ship_Moving(1) = False
  770.             Case KYB(1):                                'DOWN
  771.                 Ship_Moving(3) = False
  772.             Case KYB(2):                                'LEFT
  773.                 Ship_Moving(0) = False
  774.             Case KYB(3):                                'RIGHT
  775.                 Ship_Moving(2) = False
  776.             Case KYB(4):                                'FIRE
  777.                 Ship_Firing = False
  778.             End Select
  779.     End If
  780. End Sub
  781. Private Sub Pause_Layer_KeyDown(Key As Integer, Shift As Integer)
  782.         If PauseMode_Enabled = True Then
  783.             Select Case (Key)
  784.             Case 27:                                'ESC
  785.                 Call Show_Hide(4, 5, 0.01, 4)
  786.             Case 38:                                'Menu KEYS
  787.                 Curr_Pos = Curr_Pos - 1
  788.                 If Curr_Pos < Curr_Start Then Curr_Pos = Curr_End
  789.                 Call PLAY(1)
  790.             Case 40:
  791.                 Curr_Pos = Curr_Pos + 1
  792.                 If Curr_Pos > Curr_End Then Curr_Pos = Curr_Start
  793.                 Call PLAY(1)
  794.             Case 13:
  795.                 Select Case (Curr_Pos)
  796.                 Case 27:                   'RESUME
  797.                     Call Show_Hide(4, 5, 0.1, 4)
  798.                 Case 28:                   'ABORT
  799.                     GameStarted = False
  800.                     Call Show_Hide(1, 5, 0.2, 1)
  801.                 Case 29:                   'QUIT
  802.                     Call Quit
  803.                 End Select
  804.             End Select
  805.         Call Change_Text(Curr_Pos)
  806.         End If
  807.     If Key = 115 And Shift = 2 Then Call Quit  '(Alt + F4)
  808. End Sub
  809. Private Sub Quit()      'END PROGRAM
  810.     tmMenu.Enabled = False          'Kill Timers
  811.     tmDelay.Enabled = False
  812.     tmOneFrame.Enabled = False
  813.     tmOneSecond = False
  814.     tmIntro.Enabled = False
  815.     Set FormBW = Nothing            'Kill Variables
  816.     Unload Me                       'Kill Form
  817.     End                             'Kill Program
  818. End Sub
  819. Private Sub Show_Hide(Show As Integer, Hide As Integer, Del_A As Single, Del_E As Integer)
  820. 'This sub performs 3 function, in the parameter list,
  821. 'the 1st number represents which Layer to show,
  822. 'the 2nd number represents which Layer to hide,
  823. 'the 3rd is the time to delay an event if there's an event after the show/hide is done.
  824. 'the 4th is the event number, each event bearing different outcome
  825. Dim i As Integer
  826.     Select Case (Show)      'Shows and enables the selected Layer
  827.     Case 1:
  828.         MenuMode_Enabled = True
  829.         For i = 0 To 5
  830.             Curr(i).Top = 120
  831.         Next i
  832.         Menu_Layer.Visible = True
  833.         Menu_Layer.SetFocus
  834.     Case 2:
  835.         RemapMode_Enabled = True
  836.         Remap_Layer.Visible = True
  837.         Remap_Layer.SetFocus
  838.     Case 3:
  839.         GameMode_Enabled = True
  840.         Game_Layer.Visible = True
  841.         Game_Layer.SetFocus
  842.     Case 4:
  843.         PlayMode_Enabled = True
  844.         Play_Layer.Visible = True
  845.         Play_Layer.Enabled = True
  846.         Play_Layer.SetFocus
  847.         tmMenu.Enabled = False
  848.     Case 5:
  849.         PauseMode_Enabled = True
  850.         Pause_Layer.Visible = True
  851.         Pause_Layer.SetFocus
  852.     End Select
  853.     
  854.     Select Case (Hide)      'Hides and disable the selected Layer
  855.     Case 1:
  856.         MenuMode_Enabled = False
  857.         Menu_Layer.Visible = False
  858.     Case 2:
  859.         RemapMode_Enabled = False
  860.         Remap_Layer.Visible = False
  861.     Case 3:
  862.         GameMode_Enabled = False
  863.         Game_Layer.Visible = False
  864.     Case 4:
  865.         PlayMode_Enabled = False
  866.         Play_Layer.Enabled = False
  867.         tmOneFrame.Enabled = False
  868.         tmOneSecond = False
  869.         tmMenu.Enabled = True
  870.     Case 5:
  871.         PauseMode_Enabled = False
  872.         Pause_Layer.Visible = False
  873.     End Select
  874.     
  875.     Call Wait(Del_A, Del_E)     'Call an event to happen
  876.     
  877. End Sub
  878. Private Sub Load_Sounds()
  879.     'Sounds loaded that will not be changed anymore after loaded
  880.     MP1.Open (App.Path & "soundmenu.wav")
  881.     MP3.Open (App.Path & "soundconfig.wav")
  882.     MP4.Open (App.Path & "soundpowerup.wav")
  883.     Call Set_Volumes
  884. End Sub
  885. Private Sub PLAY(i As Integer)
  886. 'This sub performs nothing more that calling the
  887. 'media player with the loaded sound to play their files
  888. If FormOptimize.Chk_Mute.Value = 1 Then Exit Sub
  889. Static Curr_Player As Integer
  890. On Error Resume Next
  891.     Select Case (i)
  892.     Case 1:                         'Menu Beep
  893.         MP1.PLAY
  894.     Case 2:                         'Intro BG
  895.         MP2.Mute = False
  896.         MP2.Open (App.Path & "soundbgmenu.mid")
  897.     Case 3:                         'Config Ship
  898.         MP3.PLAY
  899.     Case 4:
  900.         MP2.Stop
  901.         MP2.Mute = False
  902.         MP2.Open (App.Path & "soundbgplay.mid")
  903.     Case 5:
  904.         MP5.Open (App.Path & "soundwarning.wav")
  905.     Case 6:
  906.         MP5.Open (App.Path & "soundstartup.wav")
  907.     Case 7:
  908.         MP4.PLAY
  909.     Case 99:
  910.         MP2.PLAY
  911.     Case Else:
  912.         
  913.             Curr_Player = Curr_Player + 1
  914.             If Curr_Player > 3 Then Curr_Player = 0
  915.             
  916.             Select Case (i)
  917.             Case 100:
  918.                 MPS(Curr_Player).PLAY
  919.             Case 101:
  920.                 MPS(Curr_Player + 4).PLAY
  921.             End Select
  922.         
  923.     End Select
  924. End Sub
  925. Private Sub Set_Volumes()
  926. 'Set the volume levels of the media players
  927. Dim i As Integer
  928.     MP1.Volume = (1 - (Vol(0) / 100)) * -3100
  929.     MP2.Volume = (1 - (Vol(1) / 100)) * -3100
  930.     MP3.Volume = (1 - (Vol(0) / 100)) * -3100
  931.     MP5.Volume = (1 - (Vol(1) / 100)) * -3100
  932.     For i = 0 To 7
  933.         MPS(i).Volume = (1 - (Vol(0) / 100)) * -3100
  934.     Next i
  935. End Sub
  936. Private Sub Save_Keys()
  937. 'If the user selects Accept in the options layer, the
  938. 'keys are saved into a file.
  939. Dim File1
  940.     File1 = FreeFile
  941. Dim Filename As String
  942.     Filename = App.Path & "" & "custom.cfg"
  943. Open (Filename) For Output As File1
  944.     Write #File1, KYB(0)
  945.     Write #File1, KYB(1)
  946.     Write #File1, KYB(2)
  947.     Write #File1, KYB(3)
  948.     Write #File1, KYB(4)
  949.     Write #File1, KYB(5)
  950.     Write #File1, Vol(0)
  951.     Write #File1, Vol(1)
  952. Close File1
  953. End Sub
  954. Private Sub Load_Keys()
  955. 'When the game loads of the user select cancel from the options layer, then the default keys are loaded
  956. Dim i As Integer
  957. Dim File1
  958.     File1 = FreeFile
  959. Dim Filename As String
  960.     Filename = App.Path & "" & "custom.cfg"
  961. Open (Filename) For Input As File1
  962.     Input #File1, KYB(0)
  963.     Input #File1, KYB(1)
  964.     Input #File1, KYB(2)
  965.     Input #File1, KYB(3)
  966.     Input #File1, KYB(4)
  967.     Input #File1, KYB(5)
  968.     Input #File1, Vol(0)
  969.     Input #File1, Vol(1)
  970. Close File1
  971.     For i = 0 To 5
  972.         Call LoadList(KYB(i), (i + 3))
  973.         LabelSE.Caption = Str(Vol(0))
  974.         LabelBGM.Caption = Str(Vol(1))
  975.     Next i
  976. End Sub
  977. Private Sub Load_Graphics()
  978.     Menu_Layer.Picture = LoadPicture(App.Path & "graphicmenubg.gif")
  979.     Remap_Layer.Picture = LoadPicture(App.Path & "graphicmenubg.gif")
  980.     Game_Layer.Picture = LoadPicture(App.Path & "graphicmenubg.gif")
  981. End Sub
  982. Private Sub Wait(MiliSecs As Single, Event_No As Integer)  'Wait Function
  983. 'This sub delays the computer for a number of seconds and
  984. 'calls an even to happen.
  985.     tmDelay.Interval = MiliSecs * 1000
  986.     tmDelay.Enabled = True
  987.     Delay_Counter = 0
  988.     Delay_Occasion = Event_No
  989. End Sub
  990. Private Sub Load_Intro()
  991. 'This sub just moves the titles around during the title screen startup.
  992. Dim i As Integer
  993.     Intro_Counter = 0
  994.     tmIntro.Enabled = True
  995.     
  996.     For i = 0 To 2
  997.         Title(i).ForeColor = RGB(5, 5, 5)
  998.     Next i
  999.     
  1000.     Title(3).Top = 3000
  1001.     Title(3).Left = 960
  1002.     
  1003.     I_Box(0).Top = 0
  1004.     I_Box(0).Left = 960
  1005.     I_Box(2).Top = 3000
  1006.     I_Box(2).Left = 480
  1007.     I_Box(1).Top = 1200
  1008.     I_Box(1).Left = 3840
  1009.     I_Box(3).Top = 1220
  1010.     I_Box(3).Left = -4460
  1011.     I_Box(4).Top = 2600
  1012.     I_Box(4).Left = 5140
  1013.     
  1014.     R_Color = 5
  1015.     G_Color = 5
  1016.     B_Color = 5
  1017. End Sub
  1018. Private Sub tmIntro_Timer()     'INTRODUCTION
  1019. 'As the title screen loads...
  1020. Dim i As Integer
  1021.     Intro_Counter = Intro_Counter + 1
  1022.    
  1023.     '... title words are being moved around ...
  1024.     If Intro_Counter < 68 Then
  1025.         I_Box(0).Top = I_Box(0).Top + 18
  1026.         I_Box(2).Top = I_Box(2).Top - 18
  1027.     End If
  1028.     '... more title words are being moved around ...
  1029.     If Intro_Counter > 60 And Intro_Counter <= 100 Then
  1030.         I_Box(3).Left = I_Box(3).Left + 120
  1031.         I_Box(4).Left = I_Box(4).Left - 120
  1032.     End If
  1033.     '... and their text if fading black to white ...
  1034.     R_Color = R_Color + 5
  1035.     G_Color = G_Color + 5
  1036.     B_Color = B_Color + 5
  1037.     
  1038.     For i = 0 To 2
  1039.         Title(i).ForeColor = RGB(R_Color, G_Color, B_Color)
  1040.     Next i
  1041.     '... until they all are nicely set, then timer is killed.
  1042.     If Intro_Counter = 100 Then
  1043.         Title(3).Visible = True
  1044.         Title(4).Visible = True
  1045.         tmIntro.Enabled = False
  1046.     End If
  1047. End Sub
  1048. Private Sub tmDelay_Timer()         'Delay Counter + Occasions
  1049. Dim i As Integer
  1050.     'Pauses the game for a short period and make a call to intialize
  1051.     'a layer's variables and settings
  1052.     Delay_Counter = Delay_Counter + 1
  1053.     If Delay_Counter = 2 Then
  1054.         tmDelay.Enabled = False
  1055.         
  1056.         Select Case (Delay_Occasion)
  1057.         Case 1:
  1058.             Call MainMenu
  1059.         Case 2:
  1060.             Call RemapMenu
  1061.         Case 3:
  1062.             Call GameMenu
  1063.         Case 4:
  1064.             Call PlayMenu
  1065.         Case 5:
  1066.             Call PauseMenu
  1067.         End Select
  1068.     Delay_Counter = 0
  1069.     End If
  1070. End Sub
  1071. Private Sub LoadWbox(Weapon_Slot As Integer, Weapon_Name As Integer)
  1072.     
  1073.     'As you scroll around the ship's configurations, this sub
  1074.     'changes the text of the weapons selected.
  1075.     Select Case (Weapon_Slot)
  1076.     Case 0:
  1077.         Select Case (Weapon_Name)       'MAIN GUN
  1078.         Case 0:
  1079.             WBox(Weapon_Slot).Caption = "Vulcan-X"
  1080.         Case 1:
  1081.             WBox(Weapon_Slot).Caption = "Light Beam"
  1082.         Case 2:
  1083.             WBox(Weapon_Slot).Caption = "Particle Burst"
  1084.         Case 3:
  1085.             WBox(Weapon_Slot).Caption = "Plasma Wave"
  1086.         Case 4:
  1087.             WBox(Weapon_Slot).Caption = "Vulcan Blue"
  1088.         End Select
  1089.     Case 1:                             'SIDE GUN
  1090.         Select Case (Weapon_Name)
  1091.         Case 0:
  1092.             WBox(Weapon_Slot).Caption = "Micro Missiles"
  1093.         Case 1:
  1094.             WBox(Weapon_Slot).Caption = "Pulse Ring"
  1095.         Case 2:
  1096.             WBox(Weapon_Slot).Caption = "Crescent Blades"
  1097.         Case 3:
  1098.             WBox(Weapon_Slot).Caption = "Creep Mine"
  1099.         End Select
  1100.     Case 2:                             'SPECIAL
  1101.         Select Case (Weapon_Name)
  1102.         Case 0:
  1103.             WBox(Weapon_Slot).Caption = "Inferno Disc"
  1104.         Case 1:
  1105.             WBox(Weapon_Slot).Caption = "Matrix Globe"
  1106.         Case 2:
  1107.             WBox(Weapon_Slot).Caption = "Giga Storm"
  1108.         Case 3:
  1109.             WBox(Weapon_Slot).Caption = "Proximity Burn"
  1110.         Case 4:
  1111.             WBox(Weapon_Slot).Caption = "Armageddon"
  1112.         End Select
  1113.     Case 3:                             'SHIELD
  1114.         Select Case (Weapon_Name)
  1115.         Case 0:
  1116.             WBox(Weapon_Slot).Caption = "Matrix SHD MK I"
  1117.         Case 1:
  1118.             WBox(Weapon_Slot).Caption = "Matrix SHD MK II"
  1119.         Case 2:
  1120.             WBox(Weapon_Slot).Caption = "Matrix SHD MK III"
  1121.         Case 3:
  1122.             WBox(Weapon_Slot).Caption = "Matrix SHD MK IV"
  1123.         Case 4:
  1124.             WBox(Weapon_Slot).Caption = "Matrix SHD MK V"
  1125.         End Select
  1126.     Case 4:                             'GENERATOR
  1127.         Select Case (Weapon_Name)
  1128.         Case 0:
  1129.             WBox(Weapon_Slot).Caption = "Dual-Core Charger"
  1130.         Case 1:
  1131.             WBox(Weapon_Slot).Caption = "Fusion Charger"
  1132.         Case 2:
  1133.             WBox(Weapon_Slot).Caption = "Matrix Charger"
  1134.         End Select
  1135.     Case 5:                             'ENGINE
  1136.         Select Case (Weapon_Name)
  1137.         Case 0:
  1138.             WBox(Weapon_Slot).Caption = "4 Cylinders"
  1139.         Case 1:
  1140.             WBox(Weapon_Slot).Caption = "6 Cylinders"
  1141.         Case 2:
  1142.             WBox(Weapon_Slot).Caption = "8 Cylinders"
  1143.         Case 3:
  1144.             WBox(Weapon_Slot).Caption = "12 Cylinders"
  1145.         End Select
  1146.     End Select
  1147.     
  1148. End Sub
  1149. Private Sub LoadList(Key As Integer, Label As Integer)
  1150.     'Similar to above, as a new Keyboard button is being remapped,
  1151.     'it will be displayed to the user the selected button
  1152.     Select Case (Key)
  1153.     Case 8:
  1154.         menu(Label).Caption = "Backspace"
  1155.     Case 13:
  1156.         menu(Label).Caption = "Enter"
  1157.     Case 16:
  1158.         menu(Label).Caption = "Shift"
  1159.     Case 17:
  1160.         menu(Label).Caption = "Ctrl"
  1161.     Case 18:
  1162.         menu(Label).Caption = "Alt"
  1163.     Case 19:
  1164.         menu(Label).Caption = "Pause"
  1165.     Case 20:
  1166.         menu(Label).Caption = "Caps Lock"
  1167.     Case 32:
  1168.         menu(Label).Caption = "Spacebar"
  1169.     Case 33:
  1170.         menu(Label).Caption = "Page Up"
  1171.     Case 34:
  1172.         menu(Label).Caption = "Page Down"
  1173.     Case 35:
  1174.         menu(Label).Caption = "End"
  1175.     Case 36:
  1176.         menu(Label).Caption = "Home"
  1177.     Case 37:
  1178.         menu(Label).Caption = "Left"
  1179.     Case 38:
  1180.         menu(Label).Caption = "Up"
  1181.     Case 39:
  1182.         menu(Label).Caption = "Right"
  1183.     Case 40:
  1184.         menu(Label).Caption = "Down"
  1185.     Case 45:
  1186.         menu(Label).Caption = "Insert"
  1187.     Case 46:
  1188.         menu(Label).Caption = "Delete"
  1189.     Case 48:
  1190.         menu(Label).Caption = "0"
  1191.     Case 49:
  1192.         menu(Label).Caption = "1"
  1193.     Case 50:
  1194.         menu(Label).Caption = "2"
  1195.     Case 51:
  1196.         menu(Label).Caption = "3"
  1197.     Case 52:
  1198.         menu(Label).Caption = "4"
  1199.     Case 53:
  1200.         menu(Label).Caption = "5"
  1201.     Case 54:
  1202.         menu(Label).Caption = "6"
  1203.     Case 55:
  1204.         menu(Label).Caption = "7"
  1205.     Case 56:
  1206.         menu(Label).Caption = "8"
  1207.     Case 57:
  1208.         menu(Label).Caption = "9"
  1209.     Case 65:
  1210.         menu(Label).Caption = "A"
  1211.     Case 66:
  1212.         menu(Label).Caption = "B"
  1213.     Case 67:
  1214.         menu(Label).Caption = "C"
  1215.     Case 68:
  1216.         menu(Label).Caption = "D"
  1217.     Case 69:
  1218.         menu(Label).Caption = "E"
  1219.     Case 70:
  1220.         menu(Label).Caption = "F"
  1221.     Case 71:
  1222.         menu(Label).Caption = "G"
  1223.     Case 72:
  1224.         menu(Label).Caption = "H"
  1225.     Case 73:
  1226.         menu(Label).Caption = "I"
  1227.     Case 74:
  1228.         menu(Label).Caption = "J"
  1229.     Case 75:
  1230.         menu(Label).Caption = "K"
  1231.     Case 76:
  1232.         menu(Label).Caption = "L"
  1233.     Case 77:
  1234.         menu(Label).Caption = "M"
  1235.     Case 78:
  1236.         menu(Label).Caption = "N"
  1237.     Case 79:
  1238.         menu(Label).Caption = "O"
  1239.     Case 80:
  1240.         menu(Label).Caption = "P"
  1241.     Case 81:
  1242.         menu(Label).Caption = "Q"
  1243.     Case 82:
  1244.         menu(Label).Caption = "R"
  1245.     Case 83:
  1246.         menu(Label).Caption = "S"
  1247.     Case 84:
  1248.         menu(Label).Caption = "T"
  1249.     Case 85:
  1250.         menu(Label).Caption = "U"
  1251.     Case 86:
  1252.         menu(Label).Caption = "V"
  1253.     Case 87:
  1254.         menu(Label).Caption = "W"
  1255.     Case 88:
  1256.         menu(Label).Caption = "X"
  1257.     Case 89:
  1258.         menu(Label).Caption = "Y"
  1259.     Case 90:
  1260.         menu(Label).Caption = "Z"
  1261.     Case 96:
  1262.         menu(Label).Caption = "Numpad 0"
  1263.     Case 97:
  1264.         menu(Label).Caption = "Numpad 1"
  1265.     Case 98:
  1266.         menu(Label).Caption = "Numpad 2"
  1267.     Case 99:
  1268.         menu(Label).Caption = "Numpad 3"
  1269.     Case 100:
  1270.         menu(Label).Caption = "Numpad 4"
  1271.     Case 101:
  1272.         menu(Label).Caption = "Numpad 5"
  1273.     Case 102:
  1274.         menu(Label).Caption = "Numpad 6"
  1275.     Case 103:
  1276.         menu(Label).Caption = "Numpad 7"
  1277.     Case 104:
  1278.         menu(Label).Caption = "Numpad 8"
  1279.     Case 105:
  1280.         menu(Label).Caption = "Numpad 9"
  1281.     Case 106:
  1282.         menu(Label).Caption = "Numpad *"
  1283.     Case 107:
  1284.         menu(Label).Caption = "Numpad +"
  1285.     Case 109:
  1286.         menu(Label).Caption = "Numpad -"
  1287.     Case 110:
  1288.         menu(Label).Caption = "Numpad ."
  1289.     Case 111:
  1290.         menu(Label).Caption = "Numpad /"
  1291.     Case 112:
  1292.         menu(Label).Caption = "F1"
  1293.     Case 113:
  1294.         menu(Label).Caption = "F2"
  1295.     Case 114:
  1296.         menu(Label).Caption = "F3"
  1297.     Case 115:
  1298.         menu(Label).Caption = "F4"
  1299.     Case 116:
  1300.         menu(Label).Caption = "F5"
  1301.     Case 117:
  1302.         menu(Label).Caption = "F6"
  1303.     Case 118:
  1304.         menu(Label).Caption = "F7"
  1305.     Case 119:
  1306.         menu(Label).Caption = "F8"
  1307.     Case 120:
  1308.         menu(Label).Caption = "F9"
  1309.     Case 121:
  1310.         menu(Label).Caption = "F10"
  1311.     Case 144:
  1312.         menu(Label).Caption = "Num Lock"
  1313.     Case 145:
  1314.         menu(Label).Caption = "Scroll Lock"
  1315.     Case 186:
  1316.         menu(Label).Caption = ";"
  1317.     Case 187:
  1318.         menu(Label).Caption = "-"
  1319.     Case 188:
  1320.         menu(Label).Caption = ","
  1321.     Case 189:
  1322.         menu(Label).Caption = "="
  1323.     Case 190:
  1324.         menu(Label).Caption = "."
  1325.     Case 191:
  1326.         menu(Label).Caption = "/"
  1327.     Case 192:
  1328.         menu(Label).Caption = "`"
  1329.     Case 219:
  1330.         menu(Label).Caption = "["
  1331.     Case 220:
  1332.         menu(Label).Caption = ""
  1333.     Case 221:
  1334.         menu(Label).Caption = "]"
  1335.     Case 222:
  1336.         menu(Label).Caption = "'"
  1337.     Case Else:
  1338.         menu(Label).Caption = "Undefined"
  1339.     End Select
  1340. End Sub
  1341. Private Sub EXPLODE(x As Integer, y As Integer, Style As Integer)
  1342. 'This sub creates an explosion at a fixed point, determines
  1343. 'how many frames are there in the explosion sequence,
  1344. 'and set's the explosions X-offset and Y-offset to make
  1345. 'their explosion point more correct
  1346. Dim i As Integer
  1347.     For i = 0 To 40     'Locates an unsed explosion object and create a new explosion
  1348.         If Explo(i).Used = False Then
  1349.             Explo(i).Used = True
  1350.             Explo(i).Kind = Style
  1351.             Explo(i).PosX = x       'Axis coordinates for explosion point
  1352.             Explo(i).PosY = y
  1353.             Explo(i).Current_Frame = 1  'Sets to first frame of imagelist
  1354.             Select Case (Style)
  1355.                 Case 1:
  1356.                     Explo(i).Last_Frame = 16    'Determine how many frame in an explosion
  1357.                     Explo(i).PosX = Explo(i).PosX - 1065 / 2    'X Offset
  1358.                     Explo(i).PosY = Explo(i).PosY - 1500 / 2    'Y Offset
  1359.                 Case 2:
  1360.                     Explo(i).Last_Frame = 30
  1361.                     Explo(i).PosX = Explo(i).PosX - 3840 / 2    'X Offset
  1362.                     Explo(i).PosY = Explo(i).PosY - 2880 / 2    'Y Offset
  1363.                 Case 3:
  1364.                     Explo(i).Last_Frame = 22
  1365.                     Explo(i).PosX = Explo(i).PosX - 3840 / 2    'X Offset
  1366.                     Explo(i).PosY = Explo(i).PosY - 2880 / 2    'Y Offset
  1367.                 Case 17:
  1368.                     Explo(i).Last_Frame = 5
  1369.                     Explo(i).PosX = Explo(i).PosX - 840 / 2    'X Offset
  1370.                     Explo(i).PosY = Explo(i).PosY - 880 / 2    'Y Offset
  1371.                 Case 13:
  1372.                     Explo(i).Last_Frame = 5
  1373.                     Explo(i).PosX = Explo(i).PosX - 200 / 2    'X Offset
  1374.                     Explo(i).PosY = Explo(i).PosY - 200 / 2    'Y Offset
  1375.             End Select
  1376.             Exit For
  1377.         End If
  1378.     Next i
  1379. End Sub
  1380. Private Sub Use_Special(Kind As Integer)
  1381. 'When a player uses a Special ...
  1382. Dim i As Integer
  1383. Dim x As Integer
  1384.     'Bar reaches zero, chargin starts again
  1385.     If SPE_Charging = False Then
  1386.         BAR_SPE_R.Width = 0
  1387.     End If
  1388.     If SPE_Avail = True Then
  1389.         Moving_SpecialBar = True    'Moves the special weapon textbar to appear briefly
  1390.         BufferText(7).Caption = UCase(WBox(2).Caption)
  1391.         BAR_SPE_C.Width = 0
  1392.         Stt_SPE_Lbl.BackColor = &HC0&
  1393.         Stt_SPE_Lbl.ForeColor = &HFFFFFF
  1394.         SPE_Avail = False
  1395.         Special_Running = True
  1396.         Moving_SpecialBar = 2
  1397.         
  1398.         Select Case (Kind)
  1399.         Case 0:     'Inferno Disc
  1400.             For i = 290 To 300
  1401.                 'Creates a bullet
  1402.                 If Bull(i).Used = False Then
  1403.                     Bull(i).Used = True
  1404.                     Bull(i).Kind = 1
  1405.                     Bull(i).Dire = 8
  1406.                     Bull(i).Span = 0
  1407.                     Bull(i).Dama = 50
  1408.                     Bull(i).PosX = ShipX - 90
  1409.                     Bull(i).PosY = ShipY - 0
  1410.                     Exit For
  1411.                 End If
  1412.             Next i
  1413.         Case 1:     'Matrix Globe
  1414.             For i = 290 To 300
  1415.                 'Creates a bullet
  1416.                 If Bull(i).Used = False Then
  1417.                     Bull(i).Used = True
  1418.                     Bull(i).Kind = 1
  1419.                     Bull(i).Dire = 8
  1420.                     Bull(i).Span = 0
  1421.                     Bull(i).Dama = 1
  1422.                     Bull(i).PosX = ShipX - 90
  1423.                     Bull(i).PosY = ShipY - 0
  1424.                     Bull(i).Spd = 40
  1425.                     Exit For
  1426.                 End If
  1427.             Next i
  1428.         Case 2:     'Giga Storm
  1429.             Giga_Count = 1
  1430.             'Mass Damage
  1431.             Img(27).ListImages(1).Draw Play_Layer.hDC, 1000, 2000, 1
  1432.             Img(27).ListImages(1).Draw Play_Layer.hDC, 3000, 2000, 1
  1433.             
  1434.             For i = 0 To 40
  1435.                 If EShip(i).Used = True Then EShip(i).Life = EShip(i).Life - 500
  1436.                 If EShip(i).Life < 0 Then EShip(i).Life = 0
  1437.                 If EShip(i).Boss = True Then Boss_Bar_Top.Width = EShip(i).Life / EShip(i).Max_Life * Boss_Bar_Bottom.Width
  1438.                 Call Check_EDeath(i)
  1439.                 Call EXPLODE(EShip(i).PosX + (Img(EShip(i).Kind).ImageWidth * 15) / 2, EShip(i).PosY + (Img(EShip(i).Kind).ImageWidth * 15) / 2, 1)
  1440.             Next i
  1441.             
  1442.         Case 3:     'Proximity Burn
  1443.             For i = 290 To 300
  1444.                 'Create a bullet
  1445.                 If Bull(i).Used = False Then
  1446.                     Bull(i).Used = True
  1447.                     Bull(i).Kind = 0
  1448.                     Bull(i).Dire = 8
  1449.                     Bull(i).Span = 0
  1450.                     Bull(i).Dama = 100
  1451.                     Bull(i).PosX = ShipX - 3840 / 2
  1452.                     Bull(i).PosY = ShipY - 2880 / 2
  1453.                     Bull(i).Spd = 1
  1454.                     Exit For
  1455.                 End If
  1456.             Next i
  1457.         Case 4:     'Armageddon
  1458.             For i = 2000 To 4000 Step 1000
  1459.                 For x = 2000 To 6000 Step 2000
  1460.                     Call EXPLODE(i, x, 2)
  1461.                 Next x
  1462.             Next i
  1463.             For i = 0 To 40
  1464.                 'Mass Damage
  1465.                 If EShip(i).Used = True Then EShip(i).Life = EShip(i).Life - 4000
  1466.                 If EShip(i).Life < 0 Then EShip(i).Life = 0
  1467.                 If EShip(i).Boss = True Then Boss_Bar_Top.Width = EShip(i).Life / EShip(i).Max_Life * Boss_Bar_Bottom.Width
  1468.                 Call Check_EDeath(i)
  1469.                 Call EXPLODE(EShip(i).PosX + (Img(EShip(i).Kind).ImageWidth * 15) / 2, EShip(i).PosY + (Img(EShip(i).Kind).ImageWidth * 15) / 2, 1)
  1470.                 Call PLAY(101)
  1471.                 Call PLAY(101)
  1472.                 Call PLAY(101)
  1473.                 Call PLAY(101)
  1474.             Next i
  1475.         End Select
  1476.     End If
  1477.     SPE_Charging = True
  1478. End Sub
  1479. Private Sub Send_MSG(Message As String, Color_0White_1Green_2Red_3Yellow As Integer, BColor_0Black_1Red_2Yellow As Integer)
  1480. 'By calling this sub, u can send a message text to the player
  1481. 'on the screen.
  1482. 'Parameter list: The message to be sent, the forecolor, the backcolor
  1483.     Buffering = True
  1484.     BufferText(0).Caption = Message
  1485.     Select Case (Color_0White_1Green_2Red_3Yellow)
  1486.     Case 0:  'Friendly Units(BLUE)
  1487.         BufferText(0).ForeColor = &HFFFFFF
  1488.     Case 1:  'Power-ups     (GREEN)
  1489.         BufferText(0).ForeColor = &HFF00&
  1490.     Case 2:  'Enemy Comm    (RED)
  1491.         BufferText(0).ForeColor = &HFF&
  1492.     Case 3:  'Ship Reports  (YELLOW)
  1493.         BufferText(0).ForeColor = &HFFFF&
  1494.     End Select
  1495.     Select Case (BColor_0Black_1Red_2Yellow)
  1496.     Case 1:                 '(RED)
  1497.         BufferText(0).BackColor = &HFF&
  1498.     Case 2:                 '(YELLOW)
  1499.         BufferText(0).BackColor = &HFFFF&
  1500.     Case Else:              '(BLACK)
  1501.         BufferText(0).BackColor = &H0&
  1502.     End Select
  1503.     Bufferbox(0).Width = BufferText(0).Width
  1504. End Sub
  1505. Private Sub Critical_HIT()
  1506. 'When a ship is critically shot and destroyed...
  1507. Dim i As Integer
  1508. ShakeIT = 1 'Shakes the screen
  1509. 'Create an explosion at the ship's coordinates
  1510. Call EXPLODE(ShipX + (Img(0).ImageWidth * 15) / 2, ShipY + (Img(0).ImageHeight * 15) / 2, 1)
  1511. Call Send_MSG("> Your Ship has been DESTROYED ", 0, 0)
  1512. Call PLAY(101)
  1513. Moving_StatsBar = 1 'Hides all the bars
  1514. Lock_All = True     'Lock all controls
  1515. OVERIDE = True      'Program overtake controls
  1516. Ship_Moving(0) = False
  1517. Ship_Moving(1) = False
  1518. Ship_Moving(2) = False
  1519. Ship_Moving(3) = False
  1520. Ship_Firing = False
  1521. ShipX = 0   'Hides the ship
  1522. ShipY = 0   'Hides the ship
  1523. Call Check_Score
  1524. GEC = -300  'Playmode enters the death sequence before going back to main menu
  1525. End Sub
  1526. Private Sub Check_Score()
  1527. Dim i As Integer
  1528. '   High Score file Creation
  1529. Dim file2
  1530.     file2 = FreeFile
  1531. Dim Filename As String
  1532.     Filename = App.Path & "" & "HiScore.txt"
  1533. Dim Hiscore As String
  1534. 'Opens the Hiscore.txt file to retrieve existing hiscore
  1535. Open (Filename) For Input As file2
  1536.     For i = 1 To 3
  1537.         Input #file2, Hiscore       'Loads hiscore from file
  1538.     Next i
  1539. Close file2
  1540. 'Extract highscore from sentence
  1541. Hiscore = Right(Hiscore, Len(Hiscore) - 13)
  1542. 'Process storing of highscore if new score exceeds the old score
  1543.     If GameScore > Val(Hiscore) Then    'Checks if current score is higher than the saved hiscore
  1544.     Dim Temp_String As String
  1545.         
  1546.         Open (Filename) For Output As file2 'Store all the player records into the file
  1547.             Temp_String = "Send this file along with your name to:  ruby@starpulse.com"
  1548.             Write #file2, Temp_String
  1549.             
  1550.             Temp_String = "View Top 10 Pilots on http://www.planet-source-code.com/vb"
  1551.             Write #file2, Temp_String
  1552.             
  1553.             Temp_String = "High Score : " & GameScore
  1554.             Write #file2, Temp_String
  1555.             
  1556.             Temp_String = "Main Gun   : " & WBox(0).Caption
  1557.             Write #file2, Temp_String
  1558.             
  1559.             Temp_String = "Side Gun   : " & WBox(1).Caption
  1560.             Write #file2, Temp_String
  1561.             
  1562.             Temp_String = "Special    : " & WBox(2).Caption
  1563.             Write #file2, Temp_String
  1564.         
  1565.             Temp_String = "Shield     : " & WBox(3).Caption
  1566.             Write #file2, Temp_String
  1567.             
  1568.             Temp_String = "Generator  : " & WBox(4).Caption
  1569.             Write #file2, Temp_String
  1570.             
  1571.             Temp_String = "Engine     : " & WBox(5).Caption
  1572.             Write #file2, Temp_String
  1573.         
  1574.             Temp_String = "Duration   : " & GEC & " Frame(s)"
  1575.             Write #file2, Temp_String
  1576.     
  1577.             Temp_String = "Total Kill : " & KillCount & " Ship(s)"
  1578.             Write #file2, Temp_String
  1579.     
  1580.             If KilledBoss = True Then
  1581.                 Temp_String = "Last Boss  : Destroyed"
  1582.             Else:
  1583.                 Temp_String = "Last Boss  : Failed"
  1584.             End If
  1585.             Write #file2, Temp_String
  1586.     
  1587.             If Elasped = 0 Then Elasped = 1
  1588.             Temp_String = "Ave. FPS   : " & Trim(Str(Round(TotFPS / Elasped, 2)))
  1589.             Write #file2, Temp_String
  1590.                    
  1591.         Close file2
  1592.     End If
  1593. End Sub
  1594. Private Sub Major_HIT()
  1595. 'Ship is hit without any shields
  1596. Dim i As Integer
  1597. Dim All_Gone As Boolean
  1598. Dim Dam_Inflicted As Boolean
  1599.     
  1600.     'Randomly lowers the sidegun/maingun weapon level by 1
  1601.     If GEC Mod 2 = 1 Then Call Alter_G(0, 0)
  1602.     If GEC Mod 2 = 0 Then Call Alter_G(1, 0)
  1603.     
  1604.     Call Send_MSG(" DANGER! ", 2, 2)
  1605.     ShakeIT = 1
  1606.     All_Gone = True     'All parts of the ship has been damaged
  1607.     Dam_Inflicted = False
  1608.     
  1609.     Select Case (FPS Mod 10)
  1610.     Case 9:                     '10% Chance of Direct HIT and get destroyed
  1611.         Call Critical_HIT
  1612.     Case Else:
  1613.         'If any of the ship's components are still intact, the all_gone is false
  1614.         If Lock_MainGun = False Then
  1615.             All_Gone = False
  1616.         End If
  1617.         If Lock_SideGun = False Then
  1618.             All_Gone = False
  1619.         End If
  1620.         If Lock_Engine = False Then
  1621.             All_Gone = False
  1622.         End If
  1623.         If Lock_Generator = False Then
  1624.             All_Gone = False
  1625.         End If
  1626.         
  1627.         'If all of the ship's components is damaged, then ship destroyed (death).
  1628.         If All_Gone = True Then
  1629.             Call Critical_HIT
  1630.         End If
  1631.         
  1632.         'If any part of the ship is still intact, perform
  1633.         'component failure on a random part.
  1634.         i = Int(FPS) Mod 4
  1635.         Do While Dam_Inflicted = False
  1636.             Select Case (i)
  1637.             Case 0:     'Fail Main Guns
  1638.                 If Lock_MainGun = False Then
  1639.                     Lock_MainGun = True
  1640.                     Stt_MGUN_R.Width = 0
  1641.                     Dam_Inflicted = True
  1642.                 End If
  1643.             Case 1:     'Fail Side Guns
  1644.                 If Lock_SideGun = False Then
  1645.                     Lock_SideGun = True
  1646.                     Stt_SGUN_R.Width = 0
  1647.                     Dam_Inflicted = True
  1648.                 End If
  1649.             Case 2:     'Fail Engines (cannot move)
  1650.                 If Lock_Engine = False Then
  1651.                     Lock_Engine = True
  1652.                     Stt_ENG_R.Width = 0
  1653.                     Dam_Inflicted = True
  1654.                 End If
  1655.             Case 3:     'Fail generator (stops charging)
  1656.                 If Lock_Generator = False Then
  1657.                     Lock_Generator = True
  1658.                     Stt_PWR_R.Width = 0
  1659.                     Dam_Inflicted = True
  1660.                 End If
  1661.             End Select
  1662.             
  1663.             'If component of the ship is already destroyed,
  1664.             'perform check on the component
  1665.             i = i + 1
  1666.             If i > 3 Then
  1667.                 i = 0
  1668.             End If
  1669.             
  1670.             'If ship is already destroyed...
  1671.             If GEC < 0 Then Exit Do
  1672.         Loop
  1673.     End Select
  1674. End Sub
  1675. Private Sub Minor_HIT()
  1676. 'Minor hit occur when the ship is inflicted damage
  1677. 'while the shield is still intact. A bar of shiled will
  1678. 'be deducted and shield charging will increase, if not already started
  1679.     If SHD_Charging = False Then
  1680.         BAR_SHD_R.Width = 0
  1681.     End If
  1682.     
  1683.     'If no more shields left, a major hit occurs
  1684.     If SHD_Avail = False Then
  1685.         Call Major_HIT
  1686.     Else
  1687.         'Minus one bar of shield
  1688.         BAR_SHD_C.Width = BAR_SHD_C.Width - 435
  1689.         SHIELD_ON_OFF = 1
  1690.         If BAR_SHD_C.Width <= 15 Then
  1691.             BAR_SHD_C.Width = 15
  1692.             Stt_SHD_Lbl.BackColor = &HC0&
  1693.             Stt_SHD_Lbl.ForeColor = &HFFFFFF
  1694.             SHD_Avail = False
  1695.         End If
  1696.     End If
  1697.     
  1698.     'Continue to charge shield
  1699.     SHD_Charging = True
  1700. End Sub
  1701. Private Sub Alter_G(MG_SG As Integer, Plus_Minus As Integer)
  1702. 'This sub alter the Maingun and Sidegun levels.
  1703. 'Parameterlist : 0/1 = Maingun/Sidegun
  1704. '                0/1 = Minus/Add Level
  1705.     If MG_SG = 0 Then
  1706.         If Plus_Minus = 0 Then
  1707.             MG_Lvl = MG_Lvl - 1
  1708.             If MG_Lvl <= 1 Then MG_Lvl = 1
  1709.         Else:
  1710.             MG_Lvl = MG_Lvl + 1
  1711.             If MG_Lvl >= 10 Then
  1712.                 MG_Lvl = 10
  1713.                 GameScore = GameScore + 2000    'Bonus points
  1714.             End If
  1715.             Call Send_MSG("MainGun Upgrade", 1, 0)
  1716.         End If
  1717.     Else:
  1718.         If Plus_Minus = 0 Then
  1719.             SG_Lvl = SG_Lvl - 1
  1720.             If SG_Lvl <= 1 Then SG_Lvl = 1
  1721.         Else:
  1722.             SG_Lvl = SG_Lvl + 1
  1723.             If SG_Lvl > 5 Then
  1724.                 SG_Lvl = 5
  1725.                 GameScore = GameScore + 2000    'Bonus points
  1726.                 Call Alter_G(0, 1)      'Surplus sideguns goes to maingun
  1727.             Else:
  1728.                 Call Send_MSG("SideGun Upgrade", 1, 0)
  1729.             End If
  1730.         End If
  1731.     End If
  1732.     
  1733.     'Changes the statsbar captions
  1734.     Stt_LVL_MG.Caption = "MG  " & MG_Lvl & ".0"
  1735.     Stt_LVL_SG.Caption = "SG   " & SG_Lvl & ".0"
  1736. End Sub
  1737. Private Sub Check_EDeath(x As Integer)
  1738. 'This sub checks the lifepoints of an enemy after being
  1739. 'inflicted damage. If the lifepoints is 0 or lower, then
  1740. 'it will be destroyed.
  1741. Dim y As Integer
  1742. Dim temp As String
  1743.     If EShip(x).Life <= 0 And EShip(x).Used = True Then
  1744.         EShip(x).Used = False           'Destroyed
  1745.         KillCount = KillCount + 1       'Add to total kills
  1746.         If EShip(x).Has_Bonus = True Then Call Create_Bonus(EShip(x).PosX + (Img(EShip(x).Kind).ImageWidth * 15) / 2, EShip(x).PosY + (Img(EShip(x).Kind).ImageWidth * 15) / 2)     'If the ship has a powerup...
  1747.         Call PLAY(100)
  1748.         
  1749.         'If the ship destroyed was a BOSS
  1750.         If EShip(x).Boss = True And EShip(x).Life <= 0 Then
  1751.             Call PLAY(101)
  1752.             Call PLAY(101)
  1753.             Call PLAY(101)
  1754.             Call PLAY(101)
  1755.             
  1756.             'Proceed to next stage
  1757.             For y = 0 To 4
  1758.                 If C_GEC(y) = 0 Then        'Next Level GEC counter initialized
  1759.                     C_GEC(y) = GEC
  1760.                     Exit For
  1761.                 End If
  1762.             Next y
  1763.             If EShip(x).Boss = True Then
  1764.                 Moving_BossBar = 2      'Hides bossbar
  1765.                 Call EXPLODE(EShip(x).PosX + (Img(EShip(x).Kind).ImageWidth * 15) / 2, EShip(x).PosY + (Img(EShip(x).Kind).ImageHeight * 15) / 2, 2)
  1766.             End If
  1767.             EShip(x).Boss = False
  1768.         End If
  1769.         
  1770.         GameScore = GameScore + EShip(x).Score
  1771.         temp = ""
  1772.                                 
  1773.         'Adds the score to the display on screen
  1774.         For y = 0 To ((6 - Len(Trim(Str(GameScore)))) - 1)
  1775.             temp = temp & "0"
  1776.         Next y
  1777.         temp = temp & Trim(Str(GameScore))
  1778.         BufferText(6).Caption = temp
  1779.         
  1780.         Call EXPLODE(EShip(x).PosX + (Img(EShip(x).Kind).ImageWidth * 15) / 2, EShip(x).PosY + (Img(EShip(x).Kind).ImageHeight * 15) / 2, 1)
  1781.     End If
  1782. End Sub
  1783. Private Sub tmOneSecond_Timer()     'Frames Per Second Indicator
  1784. 'This sub is used to keep track of the player's average
  1785. 'FRAME per second. It just merely shows the performance of the
  1786. 'game on the player's PC
  1787.     Elasped = Elasped + 1
  1788.     TotFPS = TotFPS + FPS
  1789.     FPS = 0
  1790.     FormBW.Caption = "太空大战游戏 "           ' "Black Winter II : Final Assault" & "    Fps : " & Str(Round(TotFPS / Elasped, 2))
  1791. End Sub
  1792. Private Sub tmOneFrame_Timer()
  1793. 'This is the Most important sub, where every single
  1794. 'frame of gameplay is drawn and animated frame by frame here.
  1795. 'We'll go through this bit by bit ...
  1796. Dim B_Speed As Integer  'Bullet Speed
  1797. Dim x As Integer
  1798. Dim i As Integer
  1799. Dim y As Integer
  1800.     'This is to supply the information needed in the
  1801.     'previous sub to calculate the frames per second
  1802.     If PlayMode_Enabled = True Then
  1803.         Play_Layer.Cls  'CLS + FPS
  1804.         FPS = FPS + 1
  1805.         GEC = GEC + 1
  1806.         
  1807.         'If the background music is stopped, then is replayed
  1808.         If GEC Mod 10 = 1 Then Call PLAY(99)
  1809.         
  1810.         '-----------------------------------------
  1811.                                     'DEATH
  1812.     'If the ship is destroyed, the following messages will be displayed
  1813.     If GEC = -380 Then Call Send_MSG(" > Command Base: Congratulations, Black Winter.", 0, 0)
  1814.     If GEC = -330 Then Call Send_MSG(" MISSION COMPLETED ", 2, 2)
  1815.     If GEC = -260 Then Call Send_MSG(" > Check HiScore.txt ", 0, 0)
  1816.     If GEC = -220 Then Call Send_MSG(" > Compete with the BEST Pilots Worldwide!", 0, 0)
  1817.     If GEC = -180 Then Call Send_MSG(" > Send your HiScore files to: ", 0, 0)
  1818.     If GEC = -140 Then Call Send_MSG(" > ruby@starpulse.com ", 3, 0)
  1819.     If GEC = -100 Then Call Send_MSG(" GAME OVER ", 0, 1)
  1820.     If GEC = -1 Then
  1821.         'Game no longer running, returns to main menu
  1822.         GameStarted = False
  1823.         Call Show_Hide(1, 4, 0.2, 1)
  1824.     End If
  1825.         '-----------------------------------------
  1826.                                     'DRAWING A STARFIELD
  1827.         'This part of the code is modified from
  1828.         'Johnathan Roach's starfield codes.
  1829.         'Refer to his submission Project Space Demo
  1830.         'on planet source code
  1831.         For i = 0 To Detail_Level
  1832.             Star(i).PosY = Star(i).PosY + Star(i).Spd
  1833.             If Star(i).PosY > 7920 Then
  1834.                 Star(i).PosY = 1440
  1835.                 Star(i).PosX = (Rnd * 4920 + 720)
  1836.                 Star(i).Spd = (Rnd * 40 + 20)
  1837.                 Star(i).Color = (Rnd * 2 + 1)
  1838.             End If
  1839.             Select Case (Star(i).Color)
  1840.             Case 1:
  1841.                 Play_Layer.PSet (Star(i).PosX, Star(i).PosY), &HFFFFFF
  1842.             Case 1:
  1843.                 Play_Layer.PSet (Star(i).PosX, Star(i).PosY), &HE0E0E0
  1844.             Case Else:
  1845.                 Play_Layer.PSet (Star(i).PosX, Star(i).PosY), &HC0C0C0
  1846.             End Select
  1847.         Next i
  1848.         
  1849.         '-----------------------------------------
  1850.                                     'CREATING BULLET OBJECT
  1851.         'If gun is firing, a new bullet is created
  1852.         If Lock_MainGun = False And Lock_All = False And Ship_Firing = True Then
  1853.         
  1854.         'The following codes are for weapons.
  1855.         'Most of the have common variables.
  1856.         'Bull_Delay is the delay between 2 bullets
  1857.         '   fired in succession
  1858.         'B_Speed is the speed of the bullet moving
  1859.         '   across their X and Y corrdinates
  1860.         'Bull_Type_Limit is the maximum number of
  1861.         '   bullets that can appear on the screen.
  1862.         '   Old bullets need to be 'hit' or flies
  1863.         '   out of the playing area before new ones can be
  1864.         '   created.
  1865.         'As you'll notice, as the MG_Lvl (Maingun Level)
  1866.         '   and SG_Lvl (Sideguun Level) increases, the
  1867.         '   number of bullets, bull_delay, b_speed,
  1868.         '   bull_type_limit all changes to increase
  1869.         '   the weapons' efficiency.
  1870.         '   Certain weapons have their own custom
  1871.         '   variables to define their custom pattern.
  1872.         '   Most of these are self-explainary and can
  1873.         '   be understood by studying the weapon's code.
  1874.         
  1875.             If SHP(0) = 0 Then          'VULCAN
  1876.                 Const Vulcan_Red_Damage = 15
  1877.                 If Bull_Delay = 0 Then
  1878.                     B_Speed = 340
  1879.                     If MG_Lvl >= 1 Then '----
  1880.                         Bull_Delay = 7
  1881.                         Bull_Type_Limit = 2
  1882.                         If MG_Lvl >= 2 Then '----
  1883.                             Bull_Type_Limit = 5
  1884.                             If MG_Lvl >= 3 Then '----
  1885.                                 Bull_Delay = 6
  1886.                                 Bull_Type_Limit = 19
  1887.                                 If MG_Lvl >= 4 Then '----
  1888.                                     If MG_Lvl >= 5 Then '----
  1889.                                         Bull_Delay = 5
  1890.                                         Bull_Type_Limit = 29
  1891.                                         If MG_Lvl >= 6 Then '----
  1892.                                             If MG_Lvl >= 7 Then '----
  1893.                                                 Bull_Type_Limit = 39
  1894.                                                 If MG_Lvl >= 8 Then '----
  1895.                                                     Bull_Delay = 4
  1896.                                                     Bull_Type_Limit = 49
  1897.                                                     If MG_Lvl >= 9 Then '----
  1898.                                                         Bull_Type_Limit = 59
  1899.                                                         If MG_Lvl >= 10 Then
  1900.                                                             Bull_Delay = 3
  1901.                                                             Bull_Type_Limit = 99
  1902.                                                         End If '-End 10
  1903.                                                         For i = 0 To Bull_Type_Limit
  1904.                                                             If Bull(i).Used = False Then
  1905.                                                                 Bull(i).Used = True
  1906.                                                                 Bull(i).Kind = 1
  1907.                                                                 Bull(i).Dire = 8
  1908.                                                                 Bull(i).Span = 0
  1909.                                                                 Bull(i).Dama = Vulcan_Red_Damage
  1910.                                                                 Bull(i).PosX = ShipX + -100
  1911.                                                                 Bull(i).PosY = ShipY + 320
  1912.                                                                 Bull(i).Spd = B_Speed
  1913.                                                                 Exit For
  1914.                                                             End If
  1915.                                                         Next i
  1916.                                                         For i = 0 To Bull_Type_Limit
  1917.                                                             If Bull(i).Used = False Then
  1918.                                                                 Bull(i).Used = True
  1919.                                                                 Bull(i).Kind = 1
  1920.                                                                 Bull(i).Dire = 8
  1921.                                                                 Bull(i).Span = 0
  1922.                                                                 Bull(i).Dama = Vulcan_Red_Damage
  1923.                                                                 Bull(i).PosX = ShipX + 620
  1924.                                                                 Bull(i).PosY = ShipY + 320
  1925.                                                                 Bull(i).Spd = B_Speed
  1926.                                                                 Exit For
  1927.                                                             End If
  1928.                                                         Next i
  1929.                                                     End If '-End 9
  1930.                                                 End If
  1931.                                                 For i = 0 To Bull_Type_Limit
  1932.                                                     If Bull(i).Used = False Then
  1933.                                                         Bull(i).Used = True
  1934.                                                         Bull(i).Kind = 6
  1935.                                                         Bull(i).Dire = 73
  1936.                                                         Bull(i).Span = 0
  1937.                                                         Bull(i).Dama = Vulcan_Red_Damage
  1938.                                                         Bull(i).PosX = ShipX + 100
  1939.                                                         Bull(i).PosY = ShipY + 220
  1940.                                                         Bull(i).Spd = B_Speed
  1941.                                                         Exit For
  1942.                                                     End If
  1943.                                                 Next i
  1944.                                                 For i = 0 To Bull_Type_Limit
  1945.                                                     If Bull(i).Used = False Then
  1946.                                                         Bull(i).Used = True
  1947.                                                         Bull(i).Kind = 7
  1948.                                                         Bull(i).Dire = 93
  1949.                                                         Bull(i).Span = 0
  1950.                                                         Bull(i).Dama = Vulcan_Red_Damage
  1951.                                                         Bull(i).PosX = ShipX + 420
  1952.                                                         Bull(i).PosY = ShipY + 220
  1953.                                                         Bull(i).Spd = B_Speed
  1954.                                                         Exit For
  1955.                                                     End If
  1956.                                                 Next i
  1957.                                             End If  '-End 7
  1958.                                             For i = 0 To Bull_Type_Limit
  1959.                                                 If Bull(i).Used = False Then
  1960.                                                     Bull(i).Used = True
  1961.                                                     Bull(i).Kind = 4
  1962.                                                     Bull(i).Dire = 72
  1963.                                                     Bull(i).Span = 0
  1964.                                                     Bull(i).Dama = Vulcan_Red_Damage
  1965.                                                     Bull(i).PosX = ShipX + 50
  1966.                                                     Bull(i).PosY = ShipY + 320
  1967.                                                     Bull(i).Spd = B_Speed
  1968.                                                     Exit For
  1969.                                                 End If
  1970.                                             Next i
  1971.                                             For i = 0 To Bull_Type_Limit
  1972.                                                 If Bull(i).Used = False Then
  1973.                                                     Bull(i).Used = True
  1974.                                                     Bull(i).Kind = 5
  1975.                                                     Bull(i).Dire = 92
  1976.                                                     Bull(i).Span = 0
  1977.                                                     Bull(i).Dama = Vulcan_Red_Damage
  1978.                                                     Bull(i).PosX = ShipX + 470
  1979.                                                     Bull(i).PosY = ShipY + 320
  1980.                                                     Bull(i).Spd = B_Speed
  1981.                                                     Exit For
  1982.                                                 End If
  1983.                                             Next i
  1984.                                         End If  '-End 6
  1985.                                     End If  '-End 5
  1986.                                     For i = 0 To Bull_Type_Limit
  1987.                                         If Bull(i).Used = False Then
  1988.                                             Bull(i).Used = True
  1989.                                             Bull(i).Kind = 3
  1990.                                             Bull(i).Dire = 7
  1991.                                             Bull(i).Span = 0
  1992.                                             Bull(i).Dama = Vulcan_Red_Damage
  1993.                                             Bull(i).PosX = ShipX + 50
  1994.                                             Bull(i).PosY = ShipY + 320
  1995.                                             Bull(i).Spd = B_Speed
  1996.                                             Exit For
  1997.                                         End If
  1998.                                     Next i
  1999.                                     For i = 0 To Bull_Type_Limit
  2000.                                         If Bull(i).Used = False Then
  2001.                                             Bull(i).Used = True
  2002.                                             Bull(i).Kind = 2
  2003.                                             Bull(i).Dire = 9
  2004.                                             Bull(i).Span = 0
  2005.                                             Bull(i).Dama = Vulcan_Red_Damage
  2006.                                             Bull(i).PosX = ShipX + 470
  2007.                                             Bull(i).PosY = ShipY + 320
  2008.                                             Bull(i).Spd = B_Speed
  2009.                                             Exit For
  2010.                                         End If
  2011.                                     Next i
  2012.                                 End If      '-End 4
  2013.                             End If          '-End 3
  2014.                             For i = 0 To Bull_Type_Limit
  2015.                                 If Bull(i).Used = False Then
  2016.                                     Bull(i).Used = True
  2017.                                     Bull(i).Kind = 1
  2018.                                     Bull(i).Dire = 8
  2019.                                     Bull(i).Span = 0
  2020.                                     Bull(i).Dama = Vulcan_Red_Damage
  2021.                                     Bull(i).PosX = ShipX + 400
  2022.                                     Bull(i).PosY = ShipY + 120
  2023.                                     Bull(i).Spd = B_Speed
  2024.                                     Exit For
  2025.                                 End If
  2026.                             Next i
  2027.                         End If              '-End 2
  2028.                         For i = 0 To Bull_Type_Limit
  2029.                             If Bull(i).Used = False Then
  2030.                                 Bull(i).Used = True
  2031.                                 Bull(i).Kind = 1
  2032.                                 Bull(i).Dire = 8
  2033.                                 Bull(i).Span = 0
  2034.                                 Bull(i).Dama = Vulcan_Red_Damage
  2035.                                 If MG_Lvl = 1 Then
  2036.                                     Bull(i).PosX = ShipX + 260
  2037.                                 Else:
  2038.                                     Bull(i).PosX = ShipX + 140
  2039.                                 End If
  2040.                                 Bull(i).PosY = ShipY + 120
  2041.                                 Bull(i).Spd = B_Speed
  2042.                                 Exit For
  2043.                             End If
  2044.                         Next i
  2045.                     End If                  '-End 1
  2046.                 End If
  2047.             End If  '-END VULCAN
  2048.             
  2049.                
  2050.             If SHP(0) = 1 Then                  'LIGHT BEAM
  2051.             Dim Laser_OffSet As Integer
  2052.             Dim Laser_Style As Integer
  2053.             Dim Laser_Damage As Integer
  2054.             Dim Laser_PosX As Integer
  2055.                 If Bull_Delay = 0 Then
  2056.                     If MG_Lvl >= 1 Then '----
  2057.                         B_Speed = 650
  2058.                         Laser_Style = 1
  2059.                         Laser_OffSet = 200
  2060.                         Laser_Damage = 3
  2061.                         Bull_Delay = 1
  2062.                         Bull_Type_Limit = 10
  2063.                         If MG_Lvl >= 2 Then '----
  2064.                             Laser_Style = 2
  2065.                             Laser_Damage = 5
  2066.                         End If
  2067.                         If MG_Lvl >= 3 Then '----
  2068.                             Laser_Style = 3
  2069.                             Laser_Damage = 7
  2070.                         End If
  2071.                         If MG_Lvl >= 4 Then '----
  2072.                             Laser_Style = 4
  2073.                             Laser_Damage = 10
  2074.                         End If
  2075.                         If MG_Lvl >= 5 Then '----
  2076.                             Laser_Style = 5
  2077.                             Laser_Damage = 12
  2078.                         End If
  2079.                         If MG_Lvl >= 6 Then '----
  2080.                             Laser_Style = 6
  2081.                             Laser_Damage = 15
  2082.                         End If
  2083.                         If MG_Lvl >= 7 Then '----
  2084.                             Laser_Style = 7
  2085.                             Laser_Damage = 18
  2086.                         End If
  2087.                         If MG_Lvl >= 8 Then '----
  2088.                             Laser_Style = 8
  2089.                             Laser_Damage = 20
  2090.                         End If
  2091.                         If MG_Lvl >= 9 Then '----
  2092.                             Laser_Style = 9
  2093.                             Laser_Damage = 25
  2094.                         End If
  2095.                         If MG_Lvl >= 10 Then '----
  2096.                             Laser_Style = 10
  2097.                             Laser_Damage = 35
  2098.                         End If
  2099.                         For i = 0 To Bull_Type_Limit
  2100.                             If Bull(i).Used = False Then
  2101.                                 Bull(i).Used = True
  2102.                                 Bull(i).Kind = Laser_Style
  2103.                                 Bull(i).Dire = 8
  2104.                                 Bull(i).Span = 0
  2105.                                 Bull(i).Dama = Laser_Damage
  2106.                                 Bull(i).PosX = ShipX + Laser_OffSet
  2107.                                 Bull(i).PosY = ShipY + 0
  2108.                                 Bull(i).Spd = B_Speed
  2109.                                 
  2110.                                 Laser_PosX = Bull(i).PosX
  2111.                                 Exit For
  2112.                             End If
  2113.                         Next i
  2114.                     End If  '-End 1
  2115.                 End If
  2116.             End If  '-END LIGHT BEAM
  2117.             
  2118.             If SHP(0) = 2 Then                  'PARTICLE BURST
  2119.                 Static Random_Bound As Integer
  2120.                 Static Particle_StartX(150) As Integer 'Start posX of particle weapon
  2121.                 Static Particle_StartY(150) As Integer 'Start posY
  2122.                 Static Particle_EndX(150) As Integer   'Destination PosX
  2123.                 Static Particle_EndY(150) As Integer   'Destination PosY
  2124.                 Static Particle_Range As Integer       'Determine Span of particle weapons
  2125.                 If Bull_Delay = 0 Then
  2126.                     Random_Bound = 3
  2127.                     If MG_Lvl >= 1 Then '----
  2128.                         B_Speed = 0 'Not Used
  2129.                         Bull_Delay = 3
  2130.                         Bull_Type_Limit = 150
  2131.                         Particle_Range = 13
  2132.                         If MG_Lvl >= 2 Then '----
  2133.                             Random_Bound = 9
  2134.                         End If
  2135.                         If MG_Lvl >= 3 Then '----
  2136.                             Bull_Delay = 2
  2137.                         End If
  2138.                         If MG_Lvl >= 4 Then '----
  2139.                             For i = 0 To Bull_Type_Limit
  2140.                                 If Bull(i).Used = False Then
  2141.                                     Bull(i).Used = True
  2142.                                     Bull(i).Kind = (Rnd * Random_Bound) + 1 + (23 - Random_Bound)
  2143.                                     Bull(i).Dire = 79
  2144.                                     Bull(i).Span = 0
  2145.                                     If Bull(i).Kind >= 20 Then Bull(i).Dama = 6
  2146.                                     If Bull(i).Kind >= 16 And Bull(i).Kind <= 19 Then Bull(i).Dama = 8
  2147.                                     If Bull(i).Kind >= 11 And Bull(i).Kind <= 15 Then Bull(i).Dama = 12
  2148.                                     If Bull(i).Kind >= 5 And Bull(i).Kind <= 10 Then Bull(i).Dama = 16
  2149.                                     If Bull(i).Kind >= 1 And Bull(i).Kind <= 4 Then Bull(i).Dama = 24
  2150.                                     Bull(i).PosX = ShipX + 270
  2151.                                     Bull(i).PosY = ShipY + 120
  2152.                                     Bull(i).Spd = B_Speed
  2153.                                 
  2154.                                     Particle_StartX(i) = Bull(i).PosX
  2155.                                     Particle_StartY(i) = Bull(i).PosY
  2156.                                     Particle_EndX(i) = Bull(i).PosX - 1500 + (Rnd * 3000)
  2157.                                     Particle_EndY(i) = Bull(i).PosY - 6200 + (Rnd * 2000)
  2158.                                 
  2159.                                     Exit For
  2160.                                 End If
  2161.                             Next i
  2162.                         End If  '-End 3
  2163.                         If MG_Lvl >= 5 Then '----
  2164.                             Random_Bound = 14
  2165.                         End If
  2166.                         If MG_Lvl >= 6 Then '----
  2167.                             For i = 0 To Bull_Type_Limit
  2168.                                 If Bull(i).Used = False Then
  2169.                                     Bull(i).Used = True
  2170.                                     Bull(i).Kind = (Rnd * Random_Bound) + 1 + (23 - Random_Bound)
  2171.                                     Bull(i).Dire = 79
  2172.                                     Bull(i).Span = 0
  2173.                                     If Bull(i).Kind >= 20 Then Bull(i).Dama = 6
  2174.                                     If Bull(i).Kind >= 16 And Bull(i).Kind <= 19 Then Bull(i).Dama = 8
  2175.                                     If Bull(i).Kind >= 11 And Bull(i).Kind <= 15 Then Bull(i).Dama = 12
  2176.                                     If Bull(i).Kind >= 5 And Bull(i).Kind <= 10 Then Bull(i).Dama = 16
  2177.                                     If Bull(i).Kind >= 1 And Bull(i).Kind <= 4 Then Bull(i).Dama = 24
  2178.                                     Bull(i).PosX = ShipX + 270
  2179.                                     Bull(i).PosY = ShipY + 120
  2180.                                     Bull(i).Spd = B_Speed
  2181.                                 
  2182.                                     Particle_StartX(i) = Bull(i).PosX
  2183.                                     Particle_StartY(i) = Bull(i).PosY
  2184.                                     Particle_EndX(i) = Bull(i).PosX - 1500 + (Rnd * 3000)
  2185.                                     Particle_EndY(i) = Bull(i).PosY - 6200 + (Rnd * 2000)
  2186.                                 
  2187.                                     Exit For
  2188.                                 End If
  2189.                             Next i
  2190.                         End If      '-End 6
  2191.                         If MG_Lvl >= 7 Then '----
  2192.                             Random_Bound = 19
  2193.                         End If
  2194.                         If MG_Lvl >= 8 Then '----
  2195.                             For i = 0 To Bull_Type_Limit
  2196.                                 If Bull(i).Used = False Then
  2197.                                     Bull(i).Used = True
  2198.                                     Bull(i).Kind = (Rnd * Random_Bound) + 1 + (23 - Random_Bound)
  2199.                                     Bull(i).Dire = 79
  2200.                                     Bull(i).Span = 0
  2201.                                     If Bull(i).Kind >= 20 Then Bull(i).Dama = 6
  2202.                                     If Bull(i).Kind >= 16 And Bull(i).Kind <= 19 Then Bull(i).Dama = 8
  2203.                                     If Bull(i).Kind >= 11 And Bull(i).Kind <= 15 Then Bull(i).Dama = 12
  2204.                                     If Bull(i).Kind >= 5 And Bull(i).Kind <= 10 Then Bull(i).Dama = 16
  2205.                                     If Bull(i).Kind >= 1 And Bull(i).Kind <= 4 Then Bull(i).Dama = 24
  2206.                                     Bull(i).PosX = ShipX + 270
  2207.                                     Bull(i).PosY = ShipY + 120
  2208.                                     Bull(i).Spd = B_Speed
  2209.                                 
  2210.                                     Particle_StartX(i) = Bull(i).PosX
  2211.                                     Particle_StartY(i) = Bull(i).PosY
  2212.                                     Particle_EndX(i) = Bull(i).PosX - 1500 + (Rnd * 3000)
  2213.                                     Particle_EndY(i) = Bull(i).PosY - 6200 + (Rnd * 2000)
  2214.                                 
  2215.                                     Exit For
  2216.                                 End If
  2217.                             Next i
  2218.                         End If  '-End 8
  2219.                         If MG_Lvl >= 9 Then '----
  2220.                             Random_Bound = 23
  2221.                             Bull_Delay = 1
  2222.                         End If
  2223.                         If MG_Lvl >= 10 Then '----
  2224.                             For i = 0 To Bull_Type_Limit
  2225.                                 If Bull(i).Used = False Then
  2226.                                     Bull(i).Used = True
  2227.                                     Bull(i).Kind = (Rnd * Random_Bound) + 1 + (23 - Random_Bound)
  2228.                                     Bull(i).Dire = 79
  2229.                                     Bull(i).Span = 0
  2230.                                     If Bull(i).Kind >= 20 Then Bull(i).Dama = 6
  2231.                                     If Bull(i).Kind >= 16 And Bull(i).Kind <= 19 Then Bull(i).Dama = 8
  2232.                                     If Bull(i).Kind >= 11 And Bull(i).Kind <= 15 Then Bull(i).Dama = 12
  2233.                                     If Bull(i).Kind >= 5 And Bull(i).Kind <= 10 Then Bull(i).Dama = 16
  2234.                                     If Bull(i).Kind >= 1 And Bull(i).Kind <= 4 Then Bull(i).Dama = 24
  2235.                                     Bull(i).PosX = ShipX + 270
  2236.                                     Bull(i).PosY = ShipY + 120
  2237.                                     Bull(i).Spd = B_Speed
  2238.                                 
  2239.                                     Particle_StartX(i) = Bull(i).PosX
  2240.                                     Particle_StartY(i) = Bull(i).PosY
  2241.                                     Particle_EndX(i) = Bull(i).PosX - 1500 + (Rnd * 3000)
  2242.                                     Particle_EndY(i) = Bull(i).PosY - 6200 + (Rnd * 2000)
  2243.                                 
  2244.                                     Exit For
  2245.                                 End If
  2246.                             Next i
  2247.                         End If  '-End 10
  2248.                         For i = 0 To Bull_Type_Limit
  2249.                             If Bull(i).Used = False Then
  2250.                                 Bull(i).Used = True
  2251.                                 Bull(i).Kind = (Rnd * Random_Bound) + 1 + (23 - Random_Bound)
  2252.                                 Bull(i).Dire = 79
  2253.                                 Bull(i).Span = 0
  2254.                                 If Bull(i).Kind >= 20 Then Bull(i).Dama = 6
  2255.                                 If Bull(i).Kind >= 16 And Bull(i).Kind <= 19 Then Bull(i).Dama = 8
  2256.                                 If Bull(i).Kind >= 11 And Bull(i).Kind <= 15 Then Bull(i).Dama = 12
  2257.                                 If Bull(i).Kind >= 5 And Bull(i).Kind <= 10 Then Bull(i).Dama = 16
  2258.                                 If Bull(i).Kind >= 1 And Bull(i).Kind <= 4 Then Bull(i).Dama = 24
  2259.                                 Bull(i).PosX = ShipX + 270
  2260.                                 Bull(i).PosY = ShipY + 120
  2261.                                 Bull(i).Spd = B_Speed
  2262.                                 
  2263.                                 Particle_StartX(i) = Bull(i).PosX
  2264.                                 Particle_StartY(i) = Bull(i).PosY
  2265.                                 Particle_EndX(i) = Bull(i).PosX - 1500 + (Rnd * 3000)
  2266.                                 Particle_EndY(i) = Bull(i).PosY - 6200 + (Rnd * 2000)
  2267.                                 
  2268.                                 Exit For
  2269.                             End If
  2270.                         Next i
  2271.                     End If  '-End 1
  2272.                 End If
  2273.             End If  '-END PARTICLE BURST
  2274.             
  2275.             If SHP(0) = 3 Then                  'PLASMA WAVE
  2276.             Dim Wave_Pattern As Integer
  2277.                 If Bull_Delay = 0 Then
  2278.                     If MG_Lvl >= 1 Then '----
  2279.                         B_Speed = 0 'Not Used
  2280.                         Bull_Delay = 6
  2281.                         Bull_Type_Limit = 2
  2282.                         Wave_Pattern = 1
  2283.                         If MG_Lvl >= 2 Then
  2284.                             Wave_Pattern = 2
  2285.                         End If
  2286.                         If MG_Lvl >= 3 Then
  2287.                             Wave_Pattern = 3
  2288.                             Bull_Delay = 5