I have this code from Sprite Candy that includes delta timing but I am having trouble understanding it and taking out just the parts I need to use it in my own game.
Here`s the code, I hope the author won`t mind as it is freely availble from his site.
Hopefully someone can explain to me what I need to use from this at a minimum to get it working in my code, also a little explaination would be most welcome. Here`s the code...
Thanks for any help.
Here`s the code, I hope the author won`t mind as it is freely availble from his site.
Hopefully someone can explain to me what I need to use from this at a minimum to get it working in my code, also a little explaination would be most welcome. Here`s the code...
Thanks for any help.
; ------------------------------------------------------------------------ ; BLASTEROIDS ; AUTHOR: MIKE DOGAN ; COPYRIGHT: (c)2004/2005 MIKE DOGAN / X-PRESSIVE.COM ; ------------------------------------------------------------------------ SeedRnd MilliSecs()+ScanLine() : HidePointer() ; ------------------------------------------------------------------------ ; GLOBALS ; ------------------------------------------------------------------------ ; SOUNDS Global Snd_Unfreeze = LoadSound ("Media\snd_unfreeze.mp3") Global Snd_Freeze% = LoadSound ("Media\snd_freeze.mp3") Global Snd_NextStage% = LoadSound ("Media\snd_next_stage.mp3") Global Snd_Collide% = LoadSound ("Media\snd_collide.mp3") Global Snd_Shot1% = LoadSound ("Media\snd_shot.mp3") Global Snd_Shot2% = LoadSound ("Media\snd_powershot.mp3") Global Snd_Missile% = LoadSound ("Media\snd_missile.mp3") Global Snd_CExplode% = LoadSound ("Media\snd_comet_explode.mp3") Global Snd_CHit% = LoadSound ("Media\snd_comet_hit.mp3") Global Snd_Pickup% = LoadSound ("Media\snd_pickup.mp3") Global Snd_Shield_Off% = LoadSound ("Media\snd_shield_off.mp3") Global Snd_Cannon_On% = LoadSound ("Media\snd_turbofire_on.mp3") Global Snd_Cannon_Off% = LoadSound ("Media\snd_turbofire_off.mp3") Global Snd_GameOver% = LoadSound ("Media\snd_game_over.ogg") Global Snd_ButtonC% = LoadSound ("Media\snd_button_click.mp3") Global Snd_ButtonH% = LoadSound ("Media\snd_button_hover.mp3") Global Snd_Warning% = LoadSound ("Media\snd_warning.ogg") Global Snd_LaserHit% = LoadSound ("Media\snd_laser_hit.ogg") Global Snd_Laser% = LoadSound ("Media\snd_laser.ogg") : LoopSound Snd_Laser Global Chn_Laser% Global Snd_Enemy% = LoadSound ("Media\snd_enemy.ogg") : LoopSound Snd_Enemy Global Chn_Enemy% Global Snd_Title% = LoadSound ("Media\snd_title.mp3") : LoopSound Snd_Title Global Chn_Title% Global Snd_Shield% = LoadSound ("Media\snd_shield.mp3") : LoopSound Snd_Shield Global Chn_Shield% Global Snd_Mace% = LoadSound ("Media\snd_mace.ogg") : LoopSound Snd_Mace Global Chn_Mace% Global Snd_MaceHit% = LoadSound ("Media\snd_mace_hit.mp3") Global Chn_MaceHit% Global Snd_GameMusic% = LoadSound ("Media\snd_ingame_loop.mp3") : LoopSound Snd_GameMusic Global Chn_GameMusic% Global Snd_Thrust% = LoadSound ("Media\snd_thrust.mp3") : LoopSound Snd_Thrust Global Chn_Thrust% Global Snd_Highscore% = LoadSound ("Media\snd_highscore.mp3") : LoopSound Snd_Highscore Global Chn_Highscore% ; DEFAULT SAVE SETTINGS Global center_player% = False ; RESET PLAYER TO SCREEN CENTER AFTER HIT Global show_bars% = True ; DISPLAY COMET ENERGY Global show_backstage% = True ; DISPLAY 3D PLANET Global pickups_enabled% = True ; PLAY WITH OR WITHOUT PICKUPS Global use_shadows% = True ; DRAW OBJECT SHADOWS IF > 0 Global difficulty% = 2 ; 1 = EASY, 2 = NORMAL, 3 = HARD Global fullscreen% = 0 : If Windowed3D() Then fullscreen = 2 Global screen_width% = 800 ; SCREEN RESOLUTION X Global screen_height% = 600 ; SCREEN RESOLUTION Y Dim scores%(10) ; HIGHSCORES Dim names$ (10) ; HIGHSCORES (NAMES) For i% = 1 To 10 scores(i) = 110000 - (i*10000) names$(i) = "X-PRESSIVE.COM" Next ; OVERRIDE WITH SAVED SETTINGS, IF ANY Include "include - settings.bb" : LoadSettings() ; DELTA TIME Const FPS# = 60.0 Global delta# = 1.0 ; GAME VARIABLES Global second_frame% ; SET TO TRUE EVERY 2ND FRAME (FOR STUFF THAT DOESN'T NEED TO BE DONE ON EVERY FRAME) Global prev% = MilliSecs() ; LAST FRAME TIME Global now% = MilliSecs() ; HOLDS ACTUAL TIME (MILLISECS) Global ship_rotspeed# = 4.0 ; SHIP ROTATION SPEED Global ship_radius# ; REMEMBER SHIP RADIUS (FOR COLLISION CHECK) Global ship_angle# ; HOLDS CURRENT SHIP ROTATION (GLOBAL) Global ship_x% ; CURRENT SHIP X-POS (GLOBAL) Global ship_y% ; CURRENT SHIP Y-POS (GLOBAL) Global ship_accel# = 5.0 ; SHIP ACCELERATION POWER Global ship_velx# ; CURRENT SHIP X-VELOCITY Global ship_vely# ; CURRENT SHIP Y-VELOCITY Global stage% ; CURRENT STAGE (LEVEL) Global score% ; SCORE Global fuel# ; FUEL (0 - 100) Global energy# ; ENERGY (0 - 100) Global num_comets% ; NUMBER OF COMETS TO CREATE FOR CURRENT STAGE Global comet_speed% ; COMET TRAVEL SPEED Global refuel_per_stage% ; BONUS FUEL PER STAGE Global comet_type% ; COMET VISUAL TYPE Global game_over% ; INDICATES IF GAME IS OVER Global pickup_speed% ; PICKUP ITEMS TRAVEL SPEED Global pickup_chance% ; CHANCE TO GIVE A PICKUP (0 - 100) Global trails_pause% = 50 ; PAUSE (MILLISECS) BETWEEN PLACING TRAIL OBJECTS (SMOKE) Global trails_last% ; LAST TRAIL SET TIME (MILLISECS) Global last_moved% ; LAST TIME PLAYER MOVED (SEND ENEMY SHIP IF PLAYER DOES NOT MOVE) Global enemy_wait% ; TIME TO WAIT UNTIL ENEMY SHIP APPEARS Global enemy_radius# ; REMEMBER ENEMY RADIUS (FOR COLLISION CHECK) Global enemy_energy% ; ENEMY SHIP'S ENERGY Global enemy_speed% ; ENEMY SHIP'S TRAVEL SPEED Global bar_height# = screen_height-172 ; HEIGHT OF FUEL / ENERGY BARS ; WEAPON SETTINGS Global missile_pause = 1000 ; PAUSE (MILLISECS) BETWEEN MISSILE LAUNCHES Global missile_last% ; LAST MISSILE LAUNCH TIME Global shot_speed% ; SHOT TRAVEL SPEED Global shot_power% ; IMPACT POWER OF NORMAL BULLETS Global missile_power% ; IMPACT POWER OF MISSILES Global power_shots% ; NUMBER OF POWER SHOTS LEFT Global double_shots% ; NUMBER OF DOUBLE SHOTS LEFT Global missiles% ; NUMBER OF MISSILES LEFT Global turboFire% ; TURBO FIRE ACTIVE WHILE > 0 Global turboFireMax% = 500 ; TURBO FIRE MAXIMUM (SHOTS) Global turbo_pause% = 15 ; PAUSE (MILLISECS) BETWEEN TURBO FIRE SHOTS Global turbo_last% ; LAST TURBO FIRE SHOT (MILLISECS) Global time_freeze% ; TIME OF LAST TIME FREEZE Global freeze_duration% ; TIME FREEZE DURATION Global time_shield% ; TIME OF SHIELD ACTIVATION Global shield_duration% ; SHIELD DURATION Global mace_radius# ; RADIUS (SIZE) OF MACE WEAPON Global time_mace% ; TIME OF MACE ACTIVATION Global mace_duration% ; MACE WEAPON DURATION Global time_laser% ; TIME OF LASER ACTIVATION Global laser_duration% ; LASER WEAPON DURATION Global laser_last% ; LAST LASER HIT Global laser_power% ; LASER KILLING POWER Global bombs% ; NUMBER OF BOMBS LEFT ; DIFFICULTY TEXTS Dim txt_difficulty$(3) txt_difficulty(1) = "EASY" txt_difficulty(2) = "NORMAL" txt_difficulty(3) = "HARD" ; TITLE ENTITIES Dim Layers% (6,10) Dim Flares% (10) Dim Buttons%(10,10) ; (HUD-PAGE, BUTTON-NUMMER) Global Title% Global Flash% ; GAME ENTITIES Global Ship% Global Burst% Global Shield% Global Enemy% Global Mace% Global MaceLine% Global Laser% Global LaserFlare% Global Bar_Energy% Global Bar_Fuel% Global Bar_Cannon% Global Bar_Enemy% Global Txt_Score% Global Txt_Bombs% Global Txt_Missiles% Global Txt_Stage% Global Txt_FPS% Global Fader% Global Lyr_Objects% Global Lyr_Shots% Global Lyr_Bright% Global Lyr_Bars% Global Lyr_Text1% Global Lyr_Text2% Global Lyr_Fader% Global Lyr_Top% ; PICKUPS Dim pickup_types$(11) pickup_types$(0) = "ENERGY+" pickup_types$(1) = "POWER SHOT" pickup_types$(2) = "FUEL+" pickup_types$(3) = "TIME FREEZE" pickup_types$(4) = "BOMB+" pickup_types$(5) = "DOUBLE SHOT" pickup_types$(6) = "INSTANT BOMB" pickup_types$(7) = "KILLER SHIELD" pickup_types$(8) = "HYPER CANNON" pickup_types$(9) = "MISSILES+" pickup_types$(10)= "IRON MACE" pickup_types$(11)= "POWER LASER" ; TYPES Type TComet Field ObjectID% Field size% Field radius% Field shield% Field angle# Field typ% Field Bar% Field aimed% ; BY MISSILE End Type Type TShot Field ObjectID% Field powershot% End Type Type TMissile Field ObjectID% Field TargetID% Field CometID% Field radius% End Type Type TPickup Field ObjectID% Field radius% Field typ$ End Type ; ------------------------------------------------------------------------ ; INCLUDE SPRITE CANDY ; ------------------------------------------------------------------------ Include "..\..\sprite candy.bb" .INITGRAPHICS Graphics3D screen_width, screen_height, 0, fullscreen : SetBuffer BackBuffer() ; ------------------------------------------------------------------------ ; CREATE HUDS, LOAD RESOURCES ; ------------------------------------------------------------------------ ; CREATE HUDs Global Cam = CreateCamera() Global HUD1% = HUD_Create (Cam) Global HUD2% = HUD_Create (Cam) Global HUD3% = HUD_Create (Cam) Global HUD4% = HUD_Create (Cam) Global HUD5% = HUD_Create (Cam) Global HUD6% = HUD_Create (Cam) ; LOAD FONTS & IMAGE RESOURCES Global Font1% = HUD_LoadFont ("Media\font1.png", "Media\font1.dat",4+256) Global Font2% = HUD_LoadFont ("Media\font2.png", "Media\font2.dat",4+256) Global Resource1% = HUD_LoadImageResource ("Media\graphics.png", 4+256) Global Resource2% = HUD_LoadImageResource ("Media\spiral.png", 4) Global Resource3% = HUD_LoadImageResource ("Media\logo.png", 4) ; ------------------------------------------------------------------------ ; INTRO ; ------------------------------------------------------------------------ Include "include - intro.bb" ; ------------------------------------------------------------------------ ; TITLE LOOP ; ------------------------------------------------------------------------ ; CREATE 3D BACKGROUND SCENE Include "include - 3D scene.bb" .TITLE FlushKeys() ShowEntity FighterPivot RotateEntity Cam,-65,0,0 EntityTexture Planet,PlanetTex(Rand(1,4)) If show_backstage = 0 Then ShowBackground() Include "include - title screen.bb" ; ------------------------------------------------------------------------ ; GAME LOOP ; ------------------------------------------------------------------------ .GAME ; CREATE LAYERS Lyr_Objects = HUD_CreateLayer(HUD1, Resource1) ; SHIP, COMETS, PICK-UPS Lyr_Shots = HUD_CreateLayer(HUD1, Resource1) ; SHOTS Lyr_Bright = HUD_CreateLayer(HUD1, Resource1) ; BRIGHT - EXPLOSIONS, SHIELD, THRUST Lyr_Bars = HUD_CreateLayer(HUD1) ; BRIGHT - ENERGY BARS Lyr_Text1 = HUD_CreateLayer(HUD1, Font1) ; HUD TEXT SMALL Lyr_Text2 = HUD_CreateLayer(HUD1, Font2) ; HUD TEXT BIG Lyr_Fader = HUD_CreateLayer(HUD1) ; BRIGHT - SCREEN FADER Lyr_Top = HUD_CreateLayer(HUD1, Resource1) ; PAUSE NOISE LAYER HUD_SetLayerShadow Lyr_Objects,use_shadows, 6 HUD_SetLayerShadow Lyr_Text2 , True, 4 HUD_SetLayerBlend Lyr_Bright , 3 HUD_SetLayerBlend Lyr_Bars , 3 HUD_SetLayerBlend Lyr_Fader , 3 FlushKeys() : HideEntity FighterPivot : If show_backstage = 0 Then HideBackground() StartGame() Repeat If GameOverStuff() = True Then Exit GetDeltaTime second_frame = Not second_frame ship_angle = HUD_GetObjectRotation (Ship) ship_x = HUD_GetObjectX(Ship) ship_y = HUD_GetObjectY(Ship) If game_over = 0 Then ; -------------------------------------------------------- ; KEY CONTROLS ; -------------------------------------------------------- ; ESC (PAUSE GAME) If KeyHit(1) Then PauseGame() ; Q (QUIT GAME) If KeyHit(16) Then game_over = 1 ; SPACE (FIRE BOMB) If KeyHit(57) And bombs > 0 Then FireBomb() ; LEFT / RIGHT (ROTATE) If KeyDown(203) Then HUD_TurnObject Ship, -(ship_rotspeed * delta) If KeyDown(205) Then HUD_TurnObject Ship, (ship_rotspeed * delta) ; UP / DOWN (ACCELERATE) If KeyDown(200) And fuel > 0 Then Thrust (1) : last_moved = now Else If KeyDown(208) And fuel > 0 Then Thrust (0) : last_moved = now Else ; SHIP SLOW-DOWN ship_velx = ship_velx - (ship_velx / 198) * delta ship_vely = ship_vely - (ship_vely / 198) * delta HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False End If ; HIDE BURST? If KeyDown(200) = False And KeyDown(208) = False Or fuel <= 0 Then HUD_SetObjectVisibility Burst, False StopChannel Chn_Thrust End If ; L-STRG (FIRE SHOT) If KeyHit(29) Or turboFire > 0 And KeyDown(29) Then If power_shots > 0 Then p% = 1 Else p% = 0 ; TURBO FIRE OFF If turboFire < 1 Then If double_shots > 0 Then double_shots = double_shots - 1 CreateShot( ship_angle-7, p ) CreateShot( ship_angle+7, p ) Else power_shots = power_shots - 1 : If power_shots < 0 Then power_shots = 0 CreateShot( ship_angle , p ) End If ; TURBO FIRE ON Else If turboFire > 0 And now-turbo_last > turbo_pause Then turbo_last = now turboFire = turboFire - 1 power_shots = power_shots - 1 : If power_shots < 0 Then power_shots = 0 If turboFire < 1 Then HUD_SetObjectVisibility Bar_Cannon, False : PlaySound Snd_Cannon_Off HUD_UpdateShape(Bar_Cannon, "PERCENTBAR", turboFire / (turboFireMax / 100),1, 0,0, ship_radius*2,7) CreateShot( ship_angle , p ) End If If missiles >= 2 And now-missile_last > missile_pause Then missile_last = now missiles = missiles - 2 CreateMissiles() End If End If ; L-CTRL End If ; NOT GAME OVER ; ---------------------------------------------------------------- ; UPDATE STUFF ; ---------------------------------------------------------------- DrawTrails UpdateShots UpdateEnemy UpdatePickups UpdateMissiles UpdateActiveWeapons ; CHECK COLLISIONS EVERY 2ND FRAME ONLY If second_frame Then CheckCollisions ; SHOW FPS HUD_SetText Txt_FPS, "FPS: " + SC_FPS ; TURN CAMERA TO FACE PLANET AlignToVector Cam,0,65,0,2,.01 * delta ; UPDATE HUD, 3D-BACKGROUND, RENDER HUD_Update : If time_freeze = 0 Then AnimateBackground() RenderWorld : Flip 0 Forever Goto TITLE ; ------------------------------------------------------------------------ ; FUNCTION: RESET VARIABLES, CREATE GAME SPRITES AND GAME HUD ; ------------------------------------------------------------------------ Function StartGame() ; RESET GAME SETTINGS last_moved = MilliSecs() ship_velx = 0.0 ship_vely = 0.0 shot_speed = 5 score = 0 fuel = 100 energy = 100 pickup_speed = 20 enemy_speed = 100 stage = 0 time_freeze = 0 time_shield = 0 power_shots = 0 double_shots = 0 missiles = 0 game_over = 0 comet_type = -1 turboFire = 0 ; DIFFICULTY SETTINGS Select difficulty Case 1 num_comets = 1 comet_speed = 25 shot_power = 25 missile_power = 50 laser_power = 10 bombs = 2 pickup_chance = 40 freeze_duration = 5000 shield_duration = 5000 mace_duration = 15000 laser_duration = 15000 refuel_per_stage = 75 enemy_wait = 30000 Case 2 num_comets = 2 comet_speed = 30 shot_power = 20 missile_power = 40 laser_power = 5 bombs = 1 pickup_chance = 25 freeze_duration = 5000 shield_duration = 5000 mace_duration = 15000 laser_duration = 15000 refuel_per_stage = 50 enemy_wait = 20000 Case 3 num_comets = 3 comet_speed = 35 shot_power = 15 laser_power = 5 missile_power = 25 bombs = 1 pickup_chance = 25 freeze_duration = 5000 shield_duration = 5000 mace_duration = 10000 laser_duration = 10000 refuel_per_stage = 25 enemy_wait = 10000 End Select Local Tmp% ; CREATE PLAYER SHIP Ship% = HUD_CreateImage (Lyr_Objects, 400,300 , 72,41, 80,79) ship_radius = (HUD_GetObjectWidth(Ship) / 2) - 10 ; GIVE A TOLERANCE OF 10 PIXELS FOR COLLISIONS HUD_SetObjectAlpha Ship, 0 HUD_SetObjectScale Ship, 3.5,3.5 HUD_FX_Scale Ship, .8, .8, 2000 HUD_FX_AlphaFade Ship, 1,1000 ; CREATE ENEMY SHIP Enemy = HUD_CreateImage (Lyr_Objects, -500,-500 , 1,943, 78,78) HUD_SetObjectScale Enemy, .8, .8 enemy_radius = HUD_GetObjectWidth(Enemy) / 2 ; CREATE MACE Mace = HUD_CreateImage (Lyr_Objects, 400,300 , 1,368, 87,89) HUD_SetObjectScale Mace, .6, .6 mace_radius = HUD_GetObjectWidth(Mace) / 2 HUD_SetObjectVisibility Mace, False ; HIDE ; CREATE MACE LINE MaceLine = HUD_CreateShape (Lyr_Objects,"LINE" , 2,0, 320,280, 330,290) HUD_SetObjectColor MaceLine, 200,200,200 HUD_SetObjectVisibility MaceLine, False ; HIDE ; CREATE LASER Laser = HUD_CreateShape (Lyr_Bright,"RECTANGLE" , 1,0, 320, 240, 4,1500) ; FILLED HUD_SetObjectOrigin Laser, 0,1 HUD_SetObjectGradient Laser, 50,50,255, 100,255,100, 1 HUD_SetObjectVisibility Laser, False ; HIDE LaserFlare = HUD_CreateImage (Lyr_Bright, 320,240 , 212,68, 62,62) HUD_SetObjectColor LaserFlare, 200,200,255, .75 HUD_SetObjectVisibility LaserFlare, False ; HIDE ; DISPLAY ENEMY ENERGY BAR? If show_bars Then Bar_Enemy = HUD_CreateShape(Lyr_Bars, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7) HUD_SetObjectColor Bar_Enemy, 0,100,0 HUD_FX_FollowObject Bar_Enemy, Enemy, 0,-(enemy_radius*1.25 + 5) End If ; CREATE HYPER CANNON PERCENTAGE BAR Bar_Cannon% = HUD_CreateShape(Lyr_Bars,"PERCENTBAR", 100,1, 0,0, ship_radius*2,7) HUD_FX_FollowObject Bar_Cannon, Ship, 0, ship_radius + 5 HUD_SetObjectVisibility Bar_Cannon, False ; HIDE ; CREATE PLAYER SHIP BURST Burst% = HUD_CreateImage (Lyr_Bright, 400,300 , 286,40, 42,25) HUD_SetObjectScale Burst,.80,1 HUD_FX_SmoothBlink Burst, 1, 0, 50 ; CREATE PLAYER SHIELD Shield% = HUD_CreateImage (Lyr_Bright, 400,300 , 330,39, 64,64) HUD_SetObjectScale Shield,1.3,1.3 HUD_SetObjectColor Shield,200,200,255,.7 HUD_SetObjectVisibility Shield,False ; HIDE ; ENERGY & FUEL BAR Tmp% = HUD_CreateShape (Lyr_Bars,"RECTANGLE" , 0,1, 10,0, 10,bar_height, "","BOTTOM-90") Bar_Energy = HUD_CreateShape (Lyr_Bars,"RECTANGLE", 1,0, 0,0, 0,0) HUD_SetObjectColor Bar_Energy, 255,100,0,.75 Tmp% = HUD_CreateShape (Lyr_Bars,"RECTANGLE" , 0,1, 22,0, 10,bar_height, "","BOTTOM-90") Bar_Fuel = HUD_CreateShape (Lyr_Bars,"RECTANGLE", 1,0, 0,0, 0,0) HUD_SetObjectColor Bar_Fuel, 100,255,100,.75 ; ENERGY & FUEL BAR TEXTS Tmp% = HUD_CreateText (Lyr_Text1, 0,0, "FUEL","LEFT",0,"LEFT+23","BOTTOM-15") HUD_SetObjectRotation Tmp,-90 Tmp% = HUD_CreateText (Lyr_Text1, 0,0, "ENERGY","LEFT",0,"LEFT+10","BOTTOM-15") HUD_SetObjectRotation Tmp,-90 ; HUD TEXTS Local scr$ = Str(score) : While Len(scr$) < 6 : scr$ = "0" + scr$ : Wend Txt_Score% = HUD_CreateText (Lyr_Text2, 5,0, "SCORE: " + scr$, "LEFT",0, "","TOP+10") Txt_Bombs% = HUD_CreateText (Lyr_Text2, 220,0, "BOMBS: " + bombs,"LEFT",0, "","TOP+10") Txt_Missiles% = HUD_CreateText (Lyr_Text2, 360,0, "MISSILES: " + missiles,"LEFT",0, "","TOP+10") Txt_Stage% = HUD_CreateText (Lyr_Text2, 530,0, "STAGE: " + stage,"LEFT",0, "","TOP+10") Txt_FPS% = HUD_CreateText (Lyr_Text1, 0,0, "FPS: ","RIGHT",0, "RIGHT","TOP+10") ; FADER Fader% = HUD_CreateShape (Lyr_Fader,"RECTANGLE" , 1,0, 0,0, screen_width,screen_height, "CENTER","CENTER") HUD_SetObjectColor Fader, 255,255,255,0 ; INGAME MUSIC Chn_GameMusic = PlaySound (Snd_GameMusic) ; NEXT STAGE MESSAGE NextStage() End Function ; ------------------------------------------------------------------------ ; FUNCTION: NEXT STAGE ; ------------------------------------------------------------------------ Function NextStage() PlaySound Snd_NextStage stage = stage + 1 fuel = fuel + refuel_per_stage : If fuel > 100 Then fuel = 100 UpdateDisplay() ; EVERY THIRD STAGE: If stage > 1 And stage Mod 3 Then num_comets = num_comets + 1 ; CHANGE COMETS LOOK comet_type = comet_type + 1 : If comet_type > 4 Then comet_type = 0 ; MAKE COMETS A LITTLE FASTER comet_speed = comet_speed + 3 ; CREATE COMETS AT SCREEN CORNERS For i% = 1 To num_comets : CreateComet(Rand(0,1)*screen_width,Rand(0,1)*screen_height,5) : Next ; GIVE MESSAGE Local Tmp% = HUD_CreateText (Lyr_Text2, 5,0, "APPROACHING STAGE " + stage, "CENTER",0, "CENTER","CENTER") HUD_FX_Blink Tmp, 100,100,2000 HUD_FX_AlphaFade Tmp, 0,2000,4000 HUD_FX_AutoRemove Tmp, 6000 End Function ; ------------------------------------------------------------------------ ; FUNCTION: UPDATE BARS & SCORE TEXT ; ------------------------------------------------------------------------ Function UpdateDisplay() ; ENERGY BAR HUD_UpdateShape (Bar_Energy,"RECTANGLE" , 1,0, 10,0, 8,energy * (bar_height/100), "","BOTTOM-90") ; FUEL BAR HUD_UpdateShape (Bar_Fuel,"RECTANGLE" , 1,0, 22,0, 8,fuel * (bar_height/100), "","BOTTOM-90") ; ENERGY OR FUEL LOW? If energy <= 25 Then HUD_FX_Blink Bar_Energy,250,250 Else HUD_ClearEffects Bar_Energy If fuel <= 25 Then HUD_FX_Blink Bar_Fuel ,250,250 Else HUD_ClearEffects Bar_Fuel ; HUD TEXTS Local scr$ = Str(score) : While Len(scr$) < 6 : scr$ = "0" + scr$ : Wend HUD_SetText Txt_Score, "SCORE: " + scr$ HUD_SetText Txt_Bombs, "BOMBS: " + bombs HUD_SetText Txt_Missiles,"MISSILES: " + missiles HUD_SetText Txt_Stage, "STAGE: " + stage End Function ; ------------------------------------------------------------------------ ; FUNCTION: PAUSE GAME ; ------------------------------------------------------------------------ Function PauseGame() Local time% = now : FlushKeys PauseChannel Chn_Thrust PauseChannel Chn_Enemy PauseChannel Chn_Thrust PauseChannel Chn_Shield PauseChannel Chn_GameMusic PauseChannel Chn_Mace PauseChannel Chn_Laser ; PAUSE EXISTING EFFECTS & ANIMATIONS HUD_PauseEffects ; ALL HUD_PauseImageAnimations ; ALL ; TEXT Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ MADNESS PAUSED +|ANY KEY TO CONTINUE", "CENTER",0, "CENTER","CENTER-50") HUD_FX_Blink Txt,1000,500 ; SHOW STATIC NOISE Local Noise% = HUD_CreateTiledImage (Lyr_Top, 0,0 , screen_width, screen_height, 156,434, 117,58, "CENTER","CENTER") HUD_AnimateImage Noise, 156,434, 3,3, "NORMAL", 0, 75 HUD_SetObjectColor Noise,255,150,0,0 HUD_FX_AlphaFade Noise,.4,2000 ; WAIT LOOP Repeat : HUD_Update : RenderWorld : Flip 1 : Until GetKey() ; UPDATE FREEZE OR SHIELD TIME If time_freeze > 0 Then time_freeze = time_freeze + (MilliSecs()-time) If time_shield > 0 Then time_shield = time_shield + (MilliSecs()-time) If time_mace > 0 Then time_mace = time_mace + (MilliSecs()-time) ; CONTINUE FlushKeys ResumeChannel Chn_Thrust ResumeChannel Chn_Enemy ResumeChannel Chn_Thrust ResumeChannel Chn_Shield ResumeChannel Chn_GameMusic ResumeChannel Chn_Mace ResumeChannel Chn_Laser HUD_FX_AlphaFade Noise,0,1000 HUD_FX_AutoRemove Noise,1000 HUD_RemoveObject Txt HUD_ResumeEffects HUD_PlayImageAnimations End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE RANDOM PARTICLES ; ------------------------------------------------------------------------ Function CreateParticles(x%, y%, num%) Local i%, Tmp% For i = 1 To num Tmp = HUD_CreateImage (Lyr_Bright, x,y, 344,180, 30,30) HUD_SetObjectRotation Tmp, Rand(0,360) HUD_SetObjectScale Tmp, .1, .1 HUD_FX_SteadyMove Tmp, 0,Rand(50,150),True,True HUD_FX_AlphaFade Tmp, 0,500,500 HUD_FX_AutoRemove Tmp, 1000 Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE A COMET ; ------------------------------------------------------------------------ Function CreateComet(x%, y%, size%, typ%=0) ; DON'T PLACE SMALL ONES TOO FAR OUTSIDE If size < 4 Then If x < 25 Then x = 25 If y < 25 Then y = 25 If x > screen_width - 25 Then x = screen_width - 25 If y > screen_height - 25 Then y = screen_height - 25 End If ; NEW COMET Local Comet.TComet Comet.TComet = New TComet Comet\size = size Comet\shield = size * 25 Comet\ObjectID = HUD_CreateImage (Lyr_Objects, x,y, comet_type*96,512, 96,96) Comet\angle = Rnd(25,335) ; LET BIGGEST COMETS FLY TO CENTER FIRST If size = 5 Then Comet\angle = 90 + ATan2((screen_height/2)-y, (screen_width/2)-x) If Comet\angle < 0 Comet\angle = Comet\angle + 360 End If HUD_SetObjectScale Comet\ObjectID , size * .20, size * .20 HUD_FX_SteadyRotate Comet\ObjectID , Rand (-90,90) HUD_FX_SteadyMove Comet\ObjectID , Cos(-90 + Comet\angle) * comet_speed , Sin(-90 + Comet\angle) * comet_speed, False ; COMET RADIUS (FOR COLLISION CHECK) Comet\radius = HUD_GetObjectWidth(Comet\ObjectID, True) / 2 ; DISPLAY ENERGY BARS? If show_bars Then Comet\Bar = HUD_CreateShape(Lyr_Bars, "PERCENTBAR", Comet\shield,1, 0,0, Comet\radius*2,7) HUD_SetObjectColor Comet\Bar, 0,100,0 HUD_FX_FollowObject Comet\Bar, Comet\ObjectID, 0,-(Comet\radius*1.25 + 5) End If ; TIME-FREEZE ACTIVE? If time_freeze > 0 Then HUD_PauseEffects Comet\ObjectID If Comet\Bar Then HUD_PauseEffects Comet\Bar End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: COMET HAS BEEN HIT ; ------------------------------------------------------------------------ Function CometHit (CometID, shot_type%=0) ; 0 = NORMAL, 1 = POWERSHOT, 2 = MISSILE, 3 = LASER Local Comet.TComet = Object.TComet(CometID) Local cx% = HUD_GetObjectX(Comet\ObjectID) Local cy% = HUD_GetObjectY(Comet\ObjectID) Local a# If shot_type = 3 Then Comet\shield = Comet\shield - laser_power If shot_type = 2 Then Comet\shield = Comet\shield - missile_power If shot_type = 1 Then Comet\shield = 0 If shot_type = 0 Then Comet\shield = Comet\shield - shot_power ; COMET NOT DESTROYED YET? If Comet\shield > 0 Then ; HIT BY LASER If shot_type = 3 Then PlaySound Snd_LaserHit ; OTHER WEAPON If shot_type <> 3 Then PlaySound Snd_CHit : HUD_FX_Rumble Comet\ObjectID, 5,500 ; UPDATE ENERGY BAR If Comet\Bar Then HUD_UpdateShape Comet\Bar, "PERCENTBAR", Comet\shield,1, 0,0, Comet\radius*2,7 ; COMET WRECKED Else ; EXPLOSION PlaySound Snd_CExplode CreateExplosion (cx, cy, .5 + Comet\size * .5) HUD_FX_Rumble HUD1, 10,500 ; PARTICLES (DEPENDS ON CURRENT FPS) If SC_FPS > 80 Then CreateParticles (cx,cy, 20) If SC_FPS > 130 Then CreateParticles (cx,cy, 30) If SC_FPS > 150 Then CreateParticles (cx,cy, 40) ; SPLIT INTO SMALLER COMETS? If Comet\size > 1 Then score = score + 25 CreateComet ( cx + Rand(-25,25), cy + Rand(-25,25), Comet\size-1) CreateComet ( cx + Rand(-25,25), cy + Rand(-25,25), Comet\size-1) ; DESTROYED COMPLETELY Else score = score + 75 If pickup_chance > Rand(1,100) Then CreatePickup (cx, cy) End If ; REMOVE THIS COMET HUD_RemoveObject Comet\ObjectID If Comet\Bar Then HUD_RemoveObject Comet\Bar Delete Comet ; COUNT COMETS (NEXT STAGE?) Local comets% = 0 For Comet.TComet = Each TComet : comets = comets + 1 : Exit : Next If comets = 0 And game_over = 0 Then NextStage() ; SCORE ETC. UpdateDisplay() End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: PLAYER HAS BEEN HIT ; ------------------------------------------------------------------------ Function PlayerHit(damage%) ; SHIELD ACTIVE? If HUD_GetObjectVisibility(Shield) = True Then Return PlaySound Snd_Collide HUD_FX_Rumble HUD1, 10,500 CreateExplosion (HUD_GetObjectX(Ship), HUD_GetObjectY(Ship), 1.5) ; RESET TO SCREEN CENTER? If center_player Then ship_velx = Cos(-90 + ship_angle) * (10 * ship_accel) ship_vely = Sin(-90 + ship_angle) * (10 * ship_accel) HUD_PositionObject Ship, Int(screen_width/2), Int(screen_height/2) ; REVERSE PLAYER DIRECTION Else ship_velx = ship_velx * -1 ship_vely = ship_vely * -1 End If HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False HUD_FX_Blink Ship, 50,50,2000 ; MAKE INVULNERABLE (BLINK) Local e# = energy : energy = energy - damage If energy <= 0 Then ; GAME OVER? energy = 0 : game_over = 1 ; ENERGY WARNING Else If e > 25 And energy < 25 Then Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ ENERGY LOW +", "CENTER",0, "CENTER","CENTER") HUD_FX_Blink Txt,250,250 HUD_FX_AutoRemove Txt,3000 PlaySound Snd_Warning End If UpdateDisplay () End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE A SHOT ; ------------------------------------------------------------------------ Function CreateShot(dir%, powershot% = 0, isBomb% = False ) Local Shot.TShot Shot.TShot = New TShot Shot\powershot = powershot If powershot < 1 Then ; CREATE NORMAL SHOT PlaySound Snd_Shot1 Shot\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 207,40, 8,8) Else ; CREATE POWER SHOT (BOMB) If isBomb = False Then PlaySound Snd_Shot2 Shot\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 227,40, 8,15) End If HUD_PositionObject Shot\ObjectID, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship) HUD_SetObjectRotation Shot\ObjectID, dir HUD_MoveObject Shot\ObjectID, 0,-20,True ; PLACE AT SHIP NOSE End Function ; ------------------------------------------------------------------------ ; FUNCTION: MOVE SHOTS ; ------------------------------------------------------------------------ Function UpdateShots() Local Shot.TShot For Shot.TShot = Each TShot HUD_MoveObject Shot\ObjectID, 0,-(shot_speed * delta),True ; REMOVE IF OUTSIDE SCREEN Local x% = HUD_GetObjectX(Shot\ObjectID) Local y% = HUD_GetObjectY(Shot\ObjectID) If x < 0 Or x > screen_width Or y < 0 Or y > screen_height HUD_RemoveObject Shot\ObjectID Delete Shot End If Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE A MISSILE ; ------------------------------------------------------------------------ Function CreateMissiles( ) Local Missile.TMissile, i%, a% = -1 For i = 1 To 2 Missile.TMissile = New TMissile Missile\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 233,181, 36,42) HUD_SetObjectScale Missile\ObjectID, .6,.6 Missile\radius = HUD_GetObjectHeight(Missile\ObjectID) / 2 ; PLACE MISSILE HUD_PositionObject Missile\ObjectID, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship) HUD_SetObjectRotation Missile\ObjectID, ship_angle HUD_MoveObject Missile\ObjectID, a*30,0, True ; PLACE LEFT OR RIGHT a = Abs(a) HUD_FX_SteadyMove Missile\ObjectID, 0,-350, True GetMissileTarget Missile Next PlaySound Snd_Missile End Function ; ------------------------------------------------------------------------ ; FUNCTION: FIND MISSILE TARGET ; ------------------------------------------------------------------------ Function GetMissileTarget( Missile.TMissile ) Local Comet.TComet For Comet = Each TComet If Comet\aimed = 0 Then Exit Next ; NONE FOUND? GET FIRST If Comet = Null Then Comet = First TComet If Comet <> Null Then Comet\aimed = 1 Missile\CometID = Handle(Comet) Missile\TargetID = Comet\ObjectID HUD_FX_FaceObject Missile\ObjectID, Missile\TargetID, 3 End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: UPDATE MISSILES ; ------------------------------------------------------------------------ Function UpdateMissiles() Local Comet.TComet Local Missile.TMissile For Missile.TMissile = Each TMissile ; NEEDS NEW TARGET? Comet = Null Comet = Object.TComet(Missile\CometID) If Comet = Null Then GetMissileTarget Missile Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: DRAW SMOKE TRAILS ETC. ; ------------------------------------------------------------------------ Function DrawTrails() ; IT'S TIME FOR TRAILS? If now - trails_last < trails_pause Then Return Else trails_last = now Local Tmp% ; DRAW MISSILE SMOKE TRAIL? Local Missile.TMissile For Missile.TMissile = Each TMissile If trails_last = now Then Tmp = HUD_CreateImage (Lyr_Bright, 0,0, 274,181, 30,30) HUD_PositionObject Tmp, HUD_GetObjectX(Missile\ObjectID), HUD_GetObjectY(Missile\ObjectID) HUD_SetObjectRotation Tmp, Rand(0,360) HUD_SetObjectScale Tmp, .5,.5 HUD_SetObjectColor Tmp, 175,175,255,.75 HUD_FX_Scale Tmp, 2,2,1500 HUD_FX_AlphaFade Tmp, 0,2000 HUD_FX_AutoRemove Tmp, 2000 End If Next ; DRAW MACE WEAPON TRAIL If time_mace > 0 Then Tmp = HUD_CreateImage (Lyr_Objects, 400,300 , 1,368, 87,89) HUD_PositionObject Tmp, HUD_GetObjectX(Mace), HUD_GetObjectY(Mace) HUD_SetObjectScale Tmp, HUD_GetObjectScaleX(Mace), HUD_GetObjectScaleY(Mace) HUD_SetObjectAlpha Tmp, .4 HUD_FX_AlphaFade Tmp, 0,500 HUD_FX_AutoRemove Tmp, 500 End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE A PICK-UP ITEM ; ------------------------------------------------------------------------ Function CreatePickup(x%, y%) If pickups_enabled = False Then Return Local Pickup.TPickup Pickup.TPickup = New TPickup ; SET PICKUP TYPE Local typ% = Rand(0,11) Pickup\typ$ = pickup_types$( typ% ) Pickup\ObjectID= HUD_CreateImage (Lyr_Objects, x,y, typ*37,141, 37,37) If Pickup\typ$ = "ENERGY+" Then HUD_SetObjectColor Pickup\ObjectID, 255,150,150 If Pickup\typ$ = "POWER SHOT" Then HUD_SetObjectColor Pickup\ObjectID, 150,150,255 If Pickup\typ$ = "FUEL+" Then HUD_SetObjectColor Pickup\ObjectID, 150,255,150 If Pickup\typ$ = "TIME FREEZE" Then HUD_SetObjectColor Pickup\ObjectID, 255,255,150 If Pickup\typ$ = "DOUBLE SHOT" Then HUD_SetObjectColor Pickup\ObjectID, 150,255,255 If Pickup\typ$ = "KILLER SHIELD" Then HUD_SetObjectColor Pickup\ObjectID, 255,200,100 If Pickup\typ$ = "HYPER CANNON" Then HUD_SetObjectColor Pickup\ObjectID, 255,155,75 If Pickup\typ$ = "MISSILES+" Then HUD_SetObjectColor Pickup\ObjectID, 150,150,150 If Pickup\typ$ = "IRON MACE" Then HUD_SetObjectColor Pickup\ObjectID, 230,180,0 If Pickup\typ$ = "POWER LASER" Then HUD_SetObjectColor Pickup\ObjectID, 200,200,255 If Instr (Pickup\typ$, "BOMB") Then HUD_SetObjectColor Pickup\ObjectID, 255,150,255 HUD_SetObjectScale Pickup\ObjectID, .8, .8 ; REMEMBER PICKUP RADIUS (COLLISION CHECK) Pickup\radius = HUD_GetObjectWidth(Pickup\ObjectID) / 2 HUD_FX_SteadyRotate Pickup\ObjectID, Rand(-180,180) HUD_FX_SteadyMove Pickup\ObjectID, Cos (Rand(0,360) ) * pickup_speed , Sin( Rand(0,360) ) * pickup_speed, False ; LET PICKUP FLASH AFTER A WHILE, THEN ZOOM OUT HUD_FX_SmoothBlink Pickup\ObjectID, 1,.25, 100, 4000,6000 HUD_FX_Scale Pickup\ObjectID, 0,0, 2000, 0,0, 10000 ; TIME FREEZE ACTIVE? -DON'T MOVE If time_freeze > 0 Then HUD_PauseEffects Pickup\ObjectID End Function ; ------------------------------------------------------------------------ ; FUNCTION: REMOVE EXPIRED PICKUPS, CHECK PLAYER-PICKUP COLLISION ; ------------------------------------------------------------------------ Function UpdatePickups() Local Pickup.TPickup, px% Local sx% = HUD_GetObjectX(Ship) Local sy% = HUD_GetObjectY(Ship) Local Txt%, Tmp% For Pickup.TPickup = Each TPickup ; REMOVE PICKUP? If HUD_CountEffects (Pickup\ObjectID, "Scale") = 0 HUD_RemoveObject Pickup\ObjectID Delete Pickup : Return End If ; GRABBED BY PLAYER? px% = HUD_GetObjectX(Pickup\ObjectID) py% = HUD_GetObjectY(Pickup\ObjectID) If px > sx - 50 And px < sx + 50 If HUD_GetObjectDistance (Pickup\ObjectID, Ship) < Pickup\radius + ship_radius Then CreateExplosion (px, py, 1.0, True) ; RING PlaySound Snd_Pickup ; GIVE WHAT? If Pickup\typ$ = "POWER SHOT" Then power_shots = 20 If Pickup\typ$ = "BOMB+" Then bombs = bombs + 1 If Pickup\typ$ = "DOUBLE SHOT" Then double_shots = 20 If Pickup\typ$ = "FUEL+" Then fuel = fuel + 25 : If fuel > 100 Then fuel = 100 If Pickup\typ$ = "ENERGY+" Then energy = energy + 25 : If energy > 100 Then energy = 100 If Pickup\typ$ = "TIME FREEZE" Then Freeze() If Pickup\typ$ = "HYPER CANNON" Then ActivateHyperCannon() If Pickup\typ$ = "INSTANT BOMB" Then bombs = bombs + 1 : FireBomb() If Pickup\typ$ = "KILLER SHIELD" Then ActivateShield() If Pickup\typ$ = "MISSILES+" Then missiles = missiles + 50 If Pickup\typ$ = "IRON MACE" Then ActivateMace() If Pickup\typ$ = "POWER LASER" Then ActivateLaser() UpdateDisplay () ; SHOW PICKUP TEXT Txt = HUD_CreateText (Lyr_Text2, sx,sy, Pickup\typ$,"CENTER",0) HUD_FX_SteadyMove Txt,0,-50 HUD_SetObjectScale Txt,.25,.25 HUD_FX_Scale Txt,1.5,1.5, 450, 14 HUD_FX_AlphaFade Txt,0,1000,1000 HUD_FX_AutoRemove Txt,2000 ; REMOVE PICKUP HUD_RemoveObject Pickup\ObjectID Delete Pickup : Return End If End If Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: CREATE AN EXPLOSION ; ------------------------------------------------------------------------ Function CreateExplosion(x%, y%, scale%, pickup% = False) Local Tmp% ; PICKUP RING If pickup Then Tmp = HUD_CreateImage (Lyr_Bright, x,y, 396,40, 95,95) HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180) HUD_SetObjectColor Tmp, 150,150,255,1 HUD_SetObjectScale Tmp, .1,.1 HUD_FX_Scale Tmp, 1.75,1.75, 500 HUD_FX_AlphaFade Tmp, 0,400 ; FADE OUT HUD_FX_AutoRemove Tmp, 400 ; REMOVE AUTOMATICALLY Return End If ; SMOKE Tmp% = HUD_CreateImage (Lyr_Bright, x,y, 274,181, 30,30) HUD_SetObjectRotation Tmp, Rand(0,360) HUD_SetObjectScale Tmp, 1,1 HUD_SetObjectColor Tmp, 150,150,255,.75 HUD_FX_Scale Tmp, 3,3,2000 HUD_FX_AlphaFade Tmp, 0,2500 HUD_FX_AutoRemove Tmp, 2500 ; DARK CLOUD Tmp = HUD_CreateImage (Lyr_Objects, x,y, 0,614, 71,92) HUD_SetObjectScale Tmp, scale + .20, scale + .20 HUD_AnimateImage Tmp, 0,614, 14,7, "NORMAL", 1, 65 HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180) HUD_SetObjectColor Tmp, 50,50,50,.5 HUD_FX_AlphaFade Tmp, 0,900,300 ; FADE OUT HUD_FX_AutoRemove Tmp, 1105 ; REMOVE AUTOMATICALLY ; RED CLOUD Tmp = HUD_CreateImage (Lyr_Bright, x+Rand(-15,15),y+Rand(-15,15), 0,614, 71,92) HUD_SetObjectScale Tmp, scale + .25, scale + .25 HUD_AnimateImage Tmp, 0,614, 14,7, "NORMAL", 1, 65 HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180) HUD_SetObjectColor Tmp, 125,25,0,.75 HUD_FX_AutoRemove Tmp, 1105 ; REMOVE AUTOMATICALLY ; BRIGHT CLOUD Tmp = HUD_CreateImage (Lyr_Bright, x,y, 0,614, 71,92) HUD_SetObjectScale Tmp, scale, scale HUD_AnimateImage Tmp, 0,614, 14,7, "NORMAL", 1, 55 HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180) HUD_FX_AutoRemove Tmp, 935 ; REMOVE AUTOMATICALLY End Function ; ------------------------------------------------------------------------ ; FUNCTION: ALL THE ENEMY SHIP STUFF IS HERE: ; ------------------------------------------------------------------------ Function UpdateEnemy() Local ex% = HUD_GetObjectX(Enemy) Local ey% = HUD_GetObjectY(Enemy) Local en% = enemy_energy ; DO NOTHING? If game_over > 0 Then Return Else If ex = -500 And now-last_moved < enemy_wait Then Return last_moved = now ; ACTIVATE NOW? If ex = -500 Then enemy_energy = 100 Chn_Enemy = PlaySound(Snd_Enemy) If Bar_Enemy Then HUD_UpdateShape Bar_Enemy, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7 HUD_SetObjectVisibility Enemy, True HUD_PositionObject Enemy, Rand(0,1)*screen_width,Rand(0,1)*screen_height HUD_FX_FaceObject Enemy, Ship, 6 HUD_FX_SteadyMove Enemy, 0,-enemy_speed, True Return ; ALREADY IN ACTION? Else ; CHECK SHOTS Local Shot.TShot, sx%, sy% For Shot.TShot = Each TShot sx = HUD_GetObjectX(Shot\ObjectID) sy = HUD_GetObjectY(Shot\ObjectID) If sx > ex - 50 And sx < ex + 50 If HUD_GetObjectDistance (Enemy, Shot\ObjectID) < enemy_radius + 4 Then ; 4 = SHOT WIDTH / 2 (THE RADIUS) ; DECREASE ENERGY enemy_energy = enemy_energy - shot_power/3 ; REMOVE SHOT (IF NOT POWER-SHOT) If Shot\powershot < 1 Then HUD_RemoveObject Shot\ObjectID : Delete Shot Exit End If End If Next ; CHECK MISSILES Local Comet.TComet Local Missile.TMissile For Missile.TMissile = Each TMissile sx% = HUD_GetObjectX(Missile\ObjectID) sy% = HUD_GetObjectY(Missile\ObjectID) If sx > ex - 50 And sx < ex + 50 If HUD_GetObjectDistance (Enemy, Missile\ObjectID) < enemy_radius + Missile\radius Then ; DECREASE ENERGY enemy_energy = enemy_energy - missile_power/3 ; RESET TARGET COMET, IF ANY Comet = Object.TComet (Missile\CometID) : If Comet <> Null Then Comet\aimed = 0 ; REMOVE MISSILE HUD_RemoveObject Missile\ObjectID : Delete Missile Exit End If End If Next ; CHECK PLAYER If HUD_CountEffects (Ship, "Blink") = 0 If HUD_GetObjectDistance (Enemy, Ship) < enemy_radius + ship_radius Then enemy_energy = enemy_energy - 25 PlayerHit(10) End If End If ; CHECK MACE WEAPON If time_mace > 0 Then If HUD_GetObjectDistance (Enemy, Mace) < enemy_radius + mace_radius Then enemy_energy = enemy_energy - 1 StopChannel Chn_MaceHit Chn_MaceHit = PlaySound (Snd_MaceHit) End If End If ; CHECK LASER If time_laser > 0 Then If HUD_ObjectHitsObject (Laser, Enemy) Then enemy_energy = 0 End If End If ; HIT? If enemy_energy <> en Then If enemy_energy > 0 Then PlaySound Snd_CHit CreateExplosion (ex, ey, 1) If Bar_Enemy <> 0 Then HUD_UpdateShape Bar_Enemy, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7 Else StopChannel Chn_Enemy PlaySound Snd_CExplode CreateExplosion (ex, ey, 2) HUD_ClearEffects Enemy HUD_SetObjectVisibility Enemy, False HUD_PositionObject Enemy, -500,-500 End If End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: FREEZE OBJECTS (TIME FREEZE PICKUP) ; ------------------------------------------------------------------------ Function Freeze() Local Comet.TComet, Pickup.TPickup time_freeze = now : PlaySound Snd_Freeze For Comet.TComet = Each TComet : HUD_PauseEffects Comet\ObjectID : Next For Pickup.TPickup = Each TPickup : HUD_PauseEffects Pickup\ObjectID : Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: UNFREEZE OBJECTS (TIME FREEZE PICKUP) ; ------------------------------------------------------------------------ Function UnFreeze() Local Comet.TComet, Pickup.TPickup time_freeze = 0 : PlaySound Snd_Unfreeze For Comet.TComet = Each TComet : HUD_ResumeEffects Comet\ObjectID : Next For Pickup.TPickup = Each TPickup : HUD_ResumeEffects Pickup\ObjectID : Next End Function ; ------------------------------------------------------------------------ ; FUNCTION: ACTIVATE PLAYER SHIELD ; ------------------------------------------------------------------------ Function ActivateShield() time_shield = now StopChannel Chn_Shield Chn_Shield = PlaySound(Snd_Shield) HUD_SetObjectVisibility Shield, True HUD_FX_SmoothBlink Shield,.7,.2,150, shield_duration End Function ; ------------------------------------------------------------------------ ; FUNCTION: DEACTIVATE PLAYER SHIELD ; ------------------------------------------------------------------------ Function DeactivateShield() time_shield = 0 PlaySound Snd_Shield_Off StopChannel Chn_Shield HUD_SetObjectVisibility Shield, False End Function ; ------------------------------------------------------------------------ ; FUNCTION: ACTIVATE IRON MACE WEAPON ; ------------------------------------------------------------------------ Function ActivateMace() time_mace = now StopChannel Chn_Mace Chn_Mace = PlaySound(Snd_Mace) HUD_SetObjectVisibility MaceLine, True HUD_SetObjectVisibility Mace, True HUD_FX_Orbit Mace, Ship, 90, 1.0, 0, mace_duration End Function ; ------------------------------------------------------------------------ ; FUNCTION: DEACTIVATE MACE ; ------------------------------------------------------------------------ Function DeactivateMace() time_mace = 0 StopChannel Chn_Mace PlaySound Snd_Shield_Off HUD_ClearEffects Mace HUD_SetObjectVisibility Mace, False HUD_SetObjectVisibility MaceLine, False End Function ; ------------------------------------------------------------------------ ; FUNCTION: ACTIVATE LASER WEAPON ; ------------------------------------------------------------------------ Function ActivateLaser() time_laser = now StopChannel Chn_Laser Chn_Laser = PlaySound(Snd_Laser) HUD_SetObjectVisibility Laser, True HUD_FX_SmoothBlink Laser, 0.0, 1.0, 50 HUD_FX_SteadyScale LaserFlare, 1,1, .2,.2, 50 End Function ; ------------------------------------------------------------------------ ; FUNCTION: DEACTIVATE LASER ; ------------------------------------------------------------------------ Function DeactivateLaser() time_laser = 0 StopChannel Chn_Laser PlaySound Snd_Shield_Off HUD_ClearEffects Laser HUD_ClearEffects LaserFlare HUD_SetObjectVisibility Laser, False HUD_SetObjectVisibility LaserFlare, False End Function ; ------------------------------------------------------------------------ ; FUNCTION: ACTIVATE HYPER CANNON ; ------------------------------------------------------------------------ Function ActivateHyperCannon() PlaySound Snd_Cannon_On turboFire = turboFireMax HUD_SetObjectVisibility Bar_Cannon, True HUD_UpdateShape(Bar_Cannon, "PERCENTBAR", 100,1, 0,0, ship_radius*2,7) End Function ; ------------------------------------------------------------------------ ; FUNCTION: UPDATE / DEACTIVATE ACTIVE WEAPONS ; ------------------------------------------------------------------------ Function UpdateActiveWeapons() Local x%, y% ; FREEZE ACTIVE? If time_freeze > 0 And now - time_freeze >= freeze_duration Then UnFreeze() ; SHIELD ACTIVE? If time_shield > 0 HUD_PositionObject Shield, ship_x, ship_y If now - time_shield > shield_duration Then DeactivateShield() End If ; MACE WEAPON ACTIVE? If time_mace > 0 x = HUD_GetObjectX(Mace) y = HUD_GetObjectY(Mace) If HUD_GetDistance(ship_x,ship_y, x,y) > 100 Then HUD_SetObjectVisibility MaceLine, False Else HUD_UpdateShape MaceLine, "LINE" , 2,0, ship_x,ship_y, x,y HUD_SetObjectVisibility MaceLine, True End If If now - time_mace > mace_duration Then DeactivateMace() End If ; LASER ACTIVE? If time_laser > 0 HUD_PositionObject Laser, ship_x, ship_y HUD_SetObjectRotation Laser, ship_angle HUD_MoveObject Laser, 0, -ship_radius/2, True If now - time_laser > laser_duration Then DeactivateLaser() End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: SCREEN BOMB ; ------------------------------------------------------------------------ Function FireBomb() bombs = bombs - 1 UpdateDisplay() PlaySound Snd_Shot2 Local i% : For i = 0 To 360 Step 15 : CreateShot (i, 1, True) : Next ; SCREEN FLASH HUD_SetObjectAlpha Fader,1 HUD_FX_AlphaFade Fader,0,500 End Function ; ------------------------------------------------------------------------ ; FUNCTION: ACCELERATE SHIP ; ------------------------------------------------------------------------ Function Thrust( upkey% ) Local f# = fuel fuel = fuel - (.1 * delta) : UpdateDisplay() ; SHOW FUEL WARNING? If f > 25 And fuel < 25 Then Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ FUEL WARNING +", "CENTER",0, "CENTER","CENTER") HUD_FX_Blink Txt,250,250 HUD_FX_AutoRemove Txt,3000 PlaySound Snd_Warning End If If ChannelPlaying(Chn_Thrust) = False Then Chn_Thrust = PlaySound (Snd_Thrust) HUD_SetObjectVisibility Burst, True HUD_PositionObject Burst, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship) HUD_SetObjectRotation Burst, ship_angle If upkey Then ship_velx = ship_velx + Cos(-90 + ship_angle) * (ship_accel * delta) ship_vely = ship_vely + Sin(-90 + ship_angle) * (ship_accel * delta) ; SHIP BURST HUD_MoveObject Burst, 0,40,True HUD_FlipImage Burst, False Else ship_velx = ship_velx - Cos(-90 + ship_angle) * (ship_accel * delta) ship_vely = ship_vely - Sin(-90 + ship_angle) * (ship_accel * delta) ; SHIP BURST HUD_MoveObject Burst, 0,-40,True HUD_FlipImage Burst, True End If HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False End Function ; ------------------------------------------------------------------------ ; FUNCTION: CHECK COLLISIONS ; ------------------------------------------------------------------------ Function CheckCollisions() Local cx%, cy%, sx% Local Shot.TShot Local Comet.TComet Local Comet2.TComet Local Missile.TMissile ; FOR COMET - LASER CHECK Local ClosestComet.TComet, closestDistance% = 10000 Local d%, a#, line_ex%, line_ey% If time_laser > 0 Then a = ship_angle-90 : If a < 0 Then a = a + 360 line_ex = ship_x + SC_Cos(a)*1500 line_ey = ship_y + SC_Sin(a)*1500 HUD_SetObjectSize Laser, HUD_GetObjectWidth(Laser), 1500 HUD_SetObjectVisibility LaserFlare, False End If ; LOOP THROUGH COMETS For Comet.TComet = Each TComet cx% = HUD_GetObjectX(Comet\ObjectID) cy% = HUD_GetObjectY(Comet\ObjectID) ; COMET - PLAYER ----------------------------------------- If game_over = 0 And HUD_CountEffects (Ship, "Blink") = 0 If HUD_GetObjectDistance (Comet\ObjectID, Ship) < Comet\radius + ship_radius Then PlayerHit(10) : CometHit ( Handle(Comet) ) Return End If End If ; COMET - MACE ------------------------------------------- If time_mace > 0 If HUD_GetObjectDistance (Comet\ObjectID, Mace) < Comet\radius + mace_radius Then StopChannel Chn_MaceHit Chn_MaceHit = PlaySound (Snd_MaceHit) CometHit ( Handle(Comet), 1 ) Return End If End If ; COMET - LASER ------------------------------------------ If time_laser > 0 If HUD_GetPointLineDistance (cx,cy, ship_x,ship_y,line_ex,line_ey) < Comet\radius Then ; GET THE NEAREST COMET ONLY d = HUD_GetDistance (cx,cy, ship_x,ship_y) If d <= closestDistance Then closestDistance = d ClosestComet = Comet End If End If End If ; COMET - SHOTS ------------------------------------------ For Shot.TShot = Each TShot sx% = HUD_GetObjectX(Shot\ObjectID) sy% = HUD_GetObjectY(Shot\ObjectID) If sx > cx - 50 And sx < cx + 50 If HUD_GetObjectDistance (Comet\ObjectID, Shot\ObjectID) < Comet\radius + 4 Then ; 4 = SHOT WIDTH / 2 (THE RADIUS) ; COMET HIT CreateExplosion (sx, sy, .51) CometHit ( Handle(Comet), Shot\powershot) ; REMOVE SHOT (IF NOT POWER-SHOT) If Shot\powershot < 1 Then HUD_RemoveObject Shot\ObjectID : Delete Shot Return End If End If Next ; COMET - MISSILES --------------------------------------- For Missile.TMissile = Each TMissile sx% = HUD_GetObjectX(Missile\ObjectID) sy% = HUD_GetObjectY(Missile\ObjectID) If sx > cx - 50 And sx < cx + 50 If HUD_GetObjectDistance (Comet\ObjectID, Missile\ObjectID) < Comet\radius + Missile\radius Then ; RESET TARGET COMET, IF ANY Comet2 = Object.TComet (Missile\CometID) If Comet2 <> Null Then Comet2\aimed = 0 ; REMOVE MISSILE HUD_RemoveObject Missile\ObjectID Delete Missile ; COMET HIT CreateExplosion (sx, sy, .51) CometHit ( Handle(Comet), 2 ) Return End If End If Next Next ; COMET HIT BY LASER? If ClosestComet <> Null Then ; SET LASER SIZE HUD_SetObjectSize Laser, HUD_GetObjectWidth(Laser), closestDistance - ClosestComet\radius - ship_radius/2 ; SOME PARTICLES cx% = ship_x + SC_Cos(a) * (closestDistance - ClosestComet\radius) cy% = ship_y + SC_Sin(a) * (closestDistance - ClosestComet\radius) CreateParticles (cx, cy, 4) ; SHOW FLARE HUD_PositionObject LaserFlare, cx, cy HUD_SetObjectVisibility LaserFlare, True ; DAMAGE INVERALL? If now - laser_last > 50 Then laser_last = now : CometHit (Handle(ClosestComet), 3 ) End If End If End Function ; ------------------------------------------------------------------------ ; FUNCTION: GAME OVER ; ------------------------------------------------------------------------ Function GameOverStuff%() If game_over = 0 Then Return ; START GAME OVER SEQUENCE If game_over = 1 Then game_over = now StopChannel Chn_Enemy StopChannel Chn_Thrust StopChannel Chn_GameMusic PlaySound (Snd_GameOver) DeactivateShield() DeactivateMace () HUD_SetObjectVisibility Burst, False HUD_SetObjectVisibility Bar_Cannon, False HUD_ClearEffects Ship HUD_FX_AlphaFade Ship,0,2000 HUD_FX_ColorFade Ship,0,0,0,2000 ; GAME OVER IMAGE Local Img% = HUD_CreateImage (Lyr_Top, 0,0, 0,819, 512,120, "CENTER","CENTER") HUD_SetObjectColor Img,225,225,255,0 HUD_SetObjectShadow Img, True, 6 HUD_SetObjectScale Img,7,7 HUD_FX_Scale Img,1,1,3000, 14 HUD_FX_AlphaFade Img,1,3000 HUD_FX_AlphaFade Img,0,3000,7000 ; FADE SCREEN HUD_SetObjectAlpha Fader,0 HUD_FX_AlphaFade Fader,1,3000,7000 ; WHILE GAME OVER... Else If now-game_over < 10000 ; CREATE EXPLOSIONS If Rand(0,10) = 1 x = HUD_GetObjectX(Ship) + Rand(-45,45) y = HUD_GetObjectY(Ship) + Rand(-45,45) CreateExplosion (x,y, Rnd (.5,2.5) ) End If ; FINAL QUIT & TIDY UP Else Delete Each TShot Delete Each TComet Delete Each TMissile Delete Each TPickup HUD_RemoveLayers Return True End If Return False End Function ; ------------------------------------------------------------------------ ; FUNCTION: CALCULATE DELTA-TIME ; ------------------------------------------------------------------------ Function GetDeltaTime() Local delta_last# = delta Local delta_step# = 0.004 now = MilliSecs() delta = (now - prev) / (1000.0 / FPS) ;If delta <= 0 Then delta = 0.001 Else If delta > 5.0 Then delta = 5.0 If delta > delta_last + delta_step Then delta = delta_last + delta_step Else If delta < delta_last - delta_step Then delta = delta_last - delta_step End If prev = now End Function