;_/^^^^^^^^^^^^^\_______________________________________________________________________________________________________ ;-[ Information ]------------------------------------------------------------------------------------------------1-2-0-- ;^\_____________/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; Project Z: One (Opt) ; Created by: TheChange ; Date: 16 Jun 2002 ; This is the optimized version of Project Z: One. ; For game information, please run the game, there's an introduction screen with clarification. ; There's also the unoptimized 'Demo' version of this code, which contains lots of comments. ; If you desire to learn how this game works internally, please consult that version first. ; There are many differences between these versions, like the major speed difference. ; Note: This game is resolution dependent (time saving) -> 800x600. ; Include "Lib\Keyboard.BB" ;_/^^^^^^^^^^^^^^^^^^^^^^\______________________________________________________________________________________________ ;-[ Key code definitions ]---------------------------------------------------------------------------------------1-2-0-- ;^\______________________/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;-( Numerical )------------------------------------------; Const Key1% = 2 Const Key2% = 3 Const Key3% = 4 Const Key4% = 5 Const Key5% = 6 Const Key6% = 7 Const Key7% = 8 Const Key8% = 9 Const Key9% = 10 Const Key0% = 11 Dim KeyNumeric% ( 9 ) KeyNumeric ( 0 ) = Key0 KeyNumeric ( 1 ) = Key1 KeyNumeric ( 2 ) = Key2 KeyNumeric ( 3 ) = Key3 KeyNumeric ( 4 ) = Key4 KeyNumeric ( 5 ) = Key5 KeyNumeric ( 6 ) = Key6 KeyNumeric ( 7 ) = Key7 KeyNumeric ( 8 ) = Key8 KeyNumeric ( 9 ) = Key9 ;-( Alphabetic )-----------------------------------------; Const KeyQ% = 16 Const KeyW% = 17 Const KeyE% = 18 Const KeyR% = 19 Const KeyT% = 20 Const KeyY% = 21 Const KeyU% = 22 Const KeyI% = 23 Const KeyO% = 24 Const KeyP% = 25 Const KeyA% = 30 Const KeyS% = 31 Const KeyD% = 32 Const KeyF% = 33 Const KeyG% = 34 Const KeyH% = 35 Const KeyJ% = 36 Const KeyK% = 37 Const KeyL% = 38 Const KeyZ% = 44 Const KeyX% = 45 Const KeyC% = 46 Const KeyV% = 47 Const KeyB% = 48 Const KeyN% = 49 Const KeyM% = 50 Dim KeyAlpha% ( 26 ) KeyAlpha ( 1 ) = KeyA KeyAlpha ( 2 ) = KeyB KeyAlpha ( 3 ) = KeyC KeyAlpha ( 4 ) = KeyD KeyAlpha ( 5 ) = KeyE KeyAlpha ( 6 ) = KeyF KeyAlpha ( 7 ) = KeyG KeyAlpha ( 8 ) = KeyH KeyAlpha ( 9 ) = KeyI KeyAlpha ( 10 ) = KeyJ KeyAlpha ( 11 ) = KeyK KeyAlpha ( 12 ) = KeyL KeyAlpha ( 13 ) = KeyM KeyAlpha ( 14 ) = KeyN KeyAlpha ( 15 ) = KeyO KeyAlpha ( 16 ) = KeyP KeyAlpha ( 17 ) = KeyQ KeyAlpha ( 18 ) = KeyR KeyAlpha ( 19 ) = KeyS KeyAlpha ( 20 ) = KeyT KeyAlpha ( 21 ) = KeyU KeyAlpha ( 22 ) = KeyV KeyAlpha ( 23 ) = KeyW KeyAlpha ( 24 ) = KeyX KeyAlpha ( 25 ) = KeyY KeyAlpha ( 26 ) = KeyZ ;-( Numeric keypad )-------------------------------------; Const KeyPad7% = 71 Const KeyPad8% = 72 Const KeyPad9% = 73 Const KeyPad4% = 75 Const KeyPad5% = 76 Const KeyPad6% = 77 Const KeyPad1% = 79 Const KeyPad2% = 80 Const KeyPad3% = 81 Const KeyPad0% = 82 Dim KeyPadNumeric% ( 9 ) KeyPadNumeric ( 0 ) = KeyPad0 KeyPadNumeric ( 1 ) = KeyPad1 KeyPadNumeric ( 2 ) = KeyPad2 KeyPadNumeric ( 3 ) = KeyPad3 KeyPadNumeric ( 4 ) = KeyPad4 KeyPadNumeric ( 5 ) = KeyPad5 KeyPadNumeric ( 6 ) = KeyPad6 KeyPadNumeric ( 7 ) = KeyPad7 KeyPadNumeric ( 8 ) = KeyPad8 KeyPadNumeric ( 9 ) = KeyPad9 ;-( Function keys )--------------------------------------; Const KeyFunction1% = 59 Const KeyFunction2% = 60 Const KeyFunction3% = 61 Const KeyFunction4% = 62 Const KeyFunction5% = 63 Const KeyFunction6% = 64 Const KeyFunction7% = 65 Const KeyFunction8% = 66 Const KeyFunction9% = 67 Const KeyFunction10% = 68 Const KeyFunction11% = 87 Const KeyFunction12% = 88 Dim KeyFunction% ( 12 ) KeyFunction ( 1 ) = KeyFunction1 KeyFunction ( 2 ) = KeyFunction2 KeyFunction ( 3 ) = KeyFunction3 KeyFunction ( 4 ) = KeyFunction4 KeyFunction ( 5 ) = KeyFunction5 KeyFunction ( 6 ) = KeyFunction6 KeyFunction ( 7 ) = KeyFunction7 KeyFunction ( 8 ) = KeyFunction8 KeyFunction ( 9 ) = KeyFunction9 KeyFunction ( 10 ) = KeyFunction10 KeyFunction ( 11 ) = KeyFunction11 KeyFunction ( 12 ) = KeyFunction12 ;-( Shiftstate )-----------------------------------------; Const KeyLeftShift% = 42 Const KeyRightShift% = 54 Const KeyLeftAlt% = 56 Const KeyRightAlt% = 184 Const KeyLeftCtrl% = 29 Const KeyRightCtrl% = 157 Const KeyCapsLock% = 58 Const KeyNumLock% = 69 ; Disfunctional Const KeyScrollLock% = 70 Const KeyLeftAlternate% = 56 Const KeyRightAlternate% = 184 Const KeyLeftControl% = 29 Const KeyRightControl% = 157 ;-( Control keys )---------------------------------------; Const KeySpace% = 57 Const KeyEnter% = 28 Const KeyTab% = 15 Const KeyBackSpace% = 14 Const KeyInsert% = 210 Const KeyDelete% = 211 Const KeyHome% = 199 Const KeyEnd% = 207 Const KeyPageUp% = 201 Const KeyPageDown% = 209 Const KeyEscape% = 1 Const KeyPause% = 197 ; Numlock Const KeyLeftWindows% = 219 Const KeyRightWindows% = 220 Const KeyApps% = 221 Const KeyPower% = 222 Const KeySleep% = 223 Const KeyWake% = 227 ;-( Signs )----------------------------------------------; Const KeyBackQuote% = 41 Const KeyMinus% = 12 Const KeyEquals% = 13 Const KeyLeftBracket% = 26 Const KeyRightBracket% = 27 Const KeyBackSlash% = 43 Const KeySemiColon% = 39 Const KeyQuote% = 40 Const KeyComma% = 51 Const KeyPeriod% = 52 Const KeySlash% = 53 ;-( Keypad controls )------------------------------------; Const KeyPadSlash% = 181 Const KeyPadAsterisk% = 55 Const KeyPadMinus% = 74 Const KeyPadPlus% = 78 Const KeyPadEnter% = 156 Const KeyPadPeriod% = 83 ;-( Cursors )--------------------------------------------; Const KeyCursorUp% = 200 Const KeyCursorDown% = 208 Const KeyCursorLeft% = 203 Const KeyCursorRight% = 205 ;_/^^^^^^^^^^^^^^^^^^^^^^\______________________________________________________________________________________________ ;-[ Key name definitions ]---------------------------------------------------------------------------------------1-2-0-- ;^\______________________/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dim KeyName$ ( 255 ) ;-( Numerical )------------------------------------------; KeyName ( Key1 ) = "1" KeyName ( Key2 ) = "2" KeyName ( Key3 ) = "3" KeyName ( Key4 ) = "4" KeyName ( Key5 ) = "5" KeyName ( Key6 ) = "6" KeyName ( Key7 ) = "7" KeyName ( Key8 ) = "8" KeyName ( Key9 ) = "9" KeyName ( Key0 ) = "0" ;-( Alphabetic )-----------------------------------------; KeyName ( KeyQ ) = "Q" KeyName ( KeyW ) = "W" KeyName ( KeyE ) = "E" KeyName ( KeyR ) = "R" KeyName ( KeyT ) = "T" KeyName ( KeyY ) = "Y" KeyName ( KeyU ) = "U" KeyName ( KeyI ) = "I" KeyName ( KeyO ) = "O" KeyName ( KeyP ) = "P" KeyName ( KeyA ) = "A" KeyName ( KeyS ) = "S" KeyName ( KeyD ) = "D" KeyName ( KeyF ) = "F" KeyName ( KeyG ) = "G" KeyName ( KeyH ) = "H" KeyName ( KeyJ ) = "J" KeyName ( KeyK ) = "K" KeyName ( KeyL ) = "L" KeyName ( KeyZ ) = "Z" KeyName ( KeyX ) = "X" KeyName ( KeyC ) = "C" KeyName ( KeyV ) = "V" KeyName ( KeyB ) = "B" KeyName ( KeyN ) = "N" KeyName ( KeyM ) = "M" ;-( Numeric keypad )-------------------------------------; KeyName ( KeyPad7 ) = "Pad 7" KeyName ( KeyPad8 ) = "Pad 8" KeyName ( KeyPad9 ) = "Pad 9" KeyName ( KeyPad4 ) = "Pad 4" KeyName ( KeyPad5 ) = "Pad 5" KeyName ( KeyPad6 ) = "Pad 6" KeyName ( KeyPad1 ) = "Pad 1" KeyName ( KeyPad2 ) = "Pad 2" KeyName ( KeyPad3 ) = "Pad 3" KeyName ( KeyPad0 ) = "Pad 0" ;-( Function keys )--------------------------------------; KeyName ( KeyFunction1 ) = "F1" KeyName ( KeyFunction2 ) = "F2" KeyName ( KeyFunction3 ) = "F3" KeyName ( KeyFunction4 ) = "F4" KeyName ( KeyFunction5 ) = "F5" KeyName ( KeyFunction6 ) = "F6" KeyName ( KeyFunction7 ) = "F7" KeyName ( KeyFunction8 ) = "F8" KeyName ( KeyFunction9 ) = "F9" KeyName ( KeyFunction10 ) = "F10" KeyName ( KeyFunction11 ) = "F11" KeyName ( KeyFunction12 ) = "F12" ;-( Shiftstate )-----------------------------------------; KeyName ( KeyLeftShift ) = "Left Shift" KeyName ( KeyRightShift ) = "Right Shift" KeyName ( KeyLeftAlt ) = "Left Alt" KeyName ( KeyRightAlt ) = "Right Alt" KeyName ( KeyLeftCtrl ) = "Left Control" KeyName ( KeyRightCtrl ) = "Right Control" KeyName ( KeyCapsLock ) = "CapsLock" KeyName ( KeyNumLock ) = "NumLock" KeyName ( KeyScrollLock ) = "ScrollLock" ;-( Control keys )---------------------------------------; KeyName ( KeySpace ) = "SpaceBar" KeyName ( KeyEnter ) = "Enter" KeyName ( KeyTab ) = "Tab" KeyName ( KeyBackSpace ) = "BackSpace" KeyName ( KeyInsert ) = "Insert" KeyName ( KeyDelete ) = "Delete" KeyName ( KeyHome ) = "Home" KeyName ( KeyEnd ) = "End" KeyName ( KeyPageUp ) = "PageUp" KeyName ( KeyPageDown ) = "PageDown" KeyName ( KeyEscape ) = "Escape" KeyName ( KeyPause ) = "Pause" KeyName ( KeyLeftWindows ) = "Left Windows" KeyName ( KeyRightWindows ) = "Right Windows" KeyName ( KeyApps ) = "Apps" KeyName ( KeyPower ) = "Power" KeyName ( KeySleep ) = "Sleep" KeyName ( KeyWake ) = "Wake" ;-( Signs )----------------------------------------------; KeyName ( KeyBackQuote ) = "BackQuote" KeyName ( KeyMinus ) = "Minus" KeyName ( KeyEquals ) = "Equals" KeyName ( KeyLeftBracket ) = "Left Bracket" KeyName ( KeyRightBracket ) = "Right Bracket" KeyName ( KeyBackSlash ) = "BackSlash" KeyName ( KeySemiColon ) = "SemiColon" KeyName ( KeyQuote ) = "Quote" KeyName ( KeyComma ) = "Comma" KeyName ( KeyPeriod ) = "Period" KeyName ( KeySlash ) = "Slash" ;-( Keypad controls )------------------------------------; KeyName ( KeyPadSlash ) = "Pad Slash" KeyName ( KeyPadAsterisk ) = "Pad Asterisk" KeyName ( KeyPadMinus ) = "Pad Minus" KeyName ( KeyPadPlus ) = "Pad Plus" KeyName ( KeyPadEnter ) = "Pad Enter" KeyName ( KeyPadPeriod ) = "Pad Period" ;-( Cursors )--------------------------------------------; KeyName ( KeyCursorUp ) = "Cursor Up" KeyName ( KeyCursorDown ) = "Cursor Down" KeyName ( KeyCursorLeft ) = "Cursor Left" KeyName ( KeyCursorRight ) = "Cursor Right" ;_/^^^^^^^^^^^^^^^^^^^^\________________________________________________________________________________________________ ;-[ Key initialization ]-----------------------------------------------------------------------------------------1-2-0-- ;^\____________________/^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FlushKeys () ;--> ; Include "Lib\Vector.BB" ; *------------------------------------* ; | | ; | Vector Matrix Conversion - VXII | ; | | ; *------------------------------------* ;-[ Sub ]--------------------------------------------------------------------------------------------------------1-2-0-- Function GetVectorX# ( Distance# , Angle# ) ; Get horizontal size of vector using distance and angle. Return Sin ( Angle ) * Distance End Function Function GetVectorY# ( Distance# , Angle# ) ; Get vertical size of vector using distance and angle. Return Sin ( Angle - 90 ) * Distance End Function ;<-- Function GetLength# ( X# , Y# ) ; Get true length of a vector (not used in this game). Return Sqr ( X * X + Y * Y ) End Function Function GetAngle% ( X# , Y# ) ; Get true angle of a vector. Result% = ATan2 ( Y , X ) + 90 If Result < 0 Result = Result + 360 Return Result End Function ;--> If Not GfxModeExists ( 800 , 600 , 16 ) e1$ = "I'm sorry, " e2$ = "your graphics card does not support " e3$ = "the required graphics mode: " e4$ = "800 x 600. " RuntimeError e1$ + e2$ + e3$ + e4$ EndIf Graphics 800 , 600 ClsColor 0 , 0 , 0 Color 255 , 255 , 255 Print "Starting up manually..." SmallFont = LoadFont ( "Blitz" ) Font = LoadFont ( "Blitz" , 20 , True ) SetFont Font PlayerBitmap = CreateImage ( 32 , 32 ) MidHandle PlayerBitmap SetBuffer ImageBuffer ( PlayerBitmap ) Color 0 , 63 , 127 Oval 0 , 0 , 32 , 32 , False Color 0 , 127 , 191 Oval 3 , 3 , 26 , 26 , False Color 0 , 95 , 159 Oval 6 , 6 , 20 , 20 , True Color 0 , 0 , 0 Oval 11 , 11 , 10 , 10 , True Color 159 , 159 , 159 Oval 12 , 12 , 8 , 8 , False Color 255 , 255 , 255 Oval 14 , 14 , 4 , 4 , True PlayerX = 400 PlayerY = 300 TargetBitmap = CreateImage ( 15 , 15 ) MidHandle TargetBitmap SetBuffer ImageBuffer ( TargetBitmap ) Color 255 , 0 , 0 Oval 0 , 0 , 15 , 15 , False Plot 7 , 7 EnemyBitmap = CreateImage ( 25 , 25 ) MidHandle EnemyBitmap SetBuffer ImageBuffer ( EnemyBitmap ) Color 95 , 127 , 0 Rect 0 , 0 , 25 , 25 , False Color 191 , 255 , 0 Oval 2 , 2 , 10 , 10 , False Oval 2 , 13 , 10 , 10 , False Oval 13 , 2 , 10 , 10 , False Oval 13 , 13 , 10 , 10 , False Type Enemy Field X# Field Y# Field Class End Type Local Enemy.Enemy BulletBitmap = CreateImage ( 3 , 3 ) MidHandle BulletBitmap SetBuffer ImageBuffer ( BulletBitmap ) Color 255 , 255 , 255 Plot 1 , 1 Color 127 , 127 , 127 Plot 0 , 1 Plot 1 , 0 Plot 2 , 1 Plot 1 , 2 Color 63 , 63 , 63 Plot 0 , 0 Plot 0 , 2 Plot 2 , 0 Plot 2 , 2 Type Bullet Field Owner ; 1 for Player , 2 for Enemy Field X# Field Y# Field Angle# End Type Local Bullet.Bullet ShrapnelBitmap = CreateImage ( 12 , 12 ) MidHandle ShrapnelBitmap SetBuffer ImageBuffer ( ShrapnelBitmap ) Color 95 , 127 , 0 Oval 0 , 0 , 12 , 12 , False Color 191 , 255 , 0 Oval 2 , 2 , 8 , 8 , False Type Shrapnel Field X# Field Y# Field Angle# Field Distance Field TotalDistance End Type Local Shrapnel.Shrapnel SeedRnd MilliSecs () Timer = CreateTimer ( 60 ) FrameLimit = True MaxEnemy = 25 HighScore = 1000000 ;------------------------------------------------------------------------------- Repeat ;------------------------------------------------------------------------------- Score = 0 SpawningTime# = 100 Level = 0 BulletCost = 1 ShootDelay = 140 EnemyClass = 1 EnemySpeed = 1 EnemyShots = 0 EnemyShooting = False SpawningWait = 0 ShootingWait = 0 Shooting = False ScoreWait = 0 ;------------------------------------------------------------------------------- InformationBitmap = CreateImage ( 800 , 600 ) SetBuffer ImageBuffer ( InformationBitmap ) Color 0 , 191 , 255 Text 400 , 22 , "Project Z: One" , True , True SetFont SmallFont y = 48 Color 0 , 127 , 255 Text 400 , y + 00 , "In this game, you cannot die. Instead, there is another type of agony: Score." , True , True Text 400 , y + 12 , "The game's primary objective is to beat the HighScore, which you see at the bottom of the screen." , True , True Text 400 , y + 24 , "This game also contains a secret objective, which can be completed by getting a very high score." , True , True Text 400 , y + 36 , "These controls are at your disposal:" , True , True x = 30 y = y + 60 Color 127 , 127 , 127 Rect x + 20 , y - 2 , 20 , 20 , True Rect x - 2 , y + 20 , 20 , 20 , True Rect x + 20 , y + 20 , 20 , 20 , True Rect x + 40 + 2 , y + 20 , 20 , 20 , True Color 095 , 095 , 095 Rect x + 20 , y - 2 , 20 , 20 , False Rect x - 2 , y + 20 , 20 , 20 , False Rect x + 20 , y + 20 , 20 , 20 , False Rect x + 40 + 2 , y + 20 , 20 , 20 , False Color 5 , 5 , 5 s = 3 a = x + 20 + 10 -4 b = y - 2 + 10 -7 For i = 0 To s Line a - i , b + i , a + i , b + i Next a = x - 2 + 10 -7 b = y + 20 + 10 -4 For i = 0 To s Line a + i , b - i , a + i , b + i Next a = x + 20 + 10 -4 b = y + 20 + 10 -1 For i = 0 To s Line a - i , b - i , a + i , b - i Next a = x + 40 + 2 + 10 -1 b = y + 20 + 10 -4 For i = 0 To s Line a - i , b - i , a - i , b + i Next a = 140 b = 30 s = 10 e = 40 DrawImage PlayerBitmap , x + a , y + b Color 0 , 0 , 127 c = x + a d = y + b - e For i = 0 To s Line c - i , d + i , c + i , d + i Next c = x + a d = y + b + e For i = 0 To s Line c - i , d - i , c + i , d - i Next c = x + a - e d = y + b For i = 0 To s Line c + i , d - i , c + i , d + i Next c = x + a + e d = y + b For i = 0 To s Line c - i , d - i , c - i , d + i Next tx = 450 Color 0 , 127 , 255 Text tx , y + b , "Use the cursor-keys to move the player." , True , True s = 8 c = x + a + 90 d = y + b Color 63 , 63 , 0 For i = 0 To s Line c + i , d - i , c + i , d + i Next y = y + 68 a = 800 - 30 - 30 - 80 Color 127 , 127 , 127 Rect x + a , y - 25 , 20 , 20 , True Rect x + 25 + a , y , 20 , 20 , True Rect x + 50 + a , y + 25 , 20 , 20 , True Color 095 , 095 , 095 Rect x + a , y - 25 , 20 , 20 , False Rect x + 25 + a , y , 20 , 20 , False Rect x + 50 + a , y + 25 , 20 , 20 , False c = x + a + 3 d = y - 25 + 3 Color 5 , 5 , 5 Plot c + 00 , d + 00 Plot c + 00 , d + 01 Plot c + 00 , d + 02 Plot c + 00 , d + 03 Plot c + 00 , d + 04 Plot c + 01 , d + 00 Plot c + 01 , d + 02 Plot c + 01 , d + 04 Plot c + 02 , d + 00 Plot c + 02 , d + 04 ;<-- Plot c + 04 , d + 01 Plot c + 04 , d + 04 Plot c + 05 , d + 00 Plot c + 05 , d + 02 Plot c + 05 , d + 04 Plot c + 06 , d + 00 Plot c + 06 , d + 03 ;<-- Plot c + 08 , d + 01 Plot c + 08 , d + 02 Plot c + 08 , d + 03 Plot c + 09 , d + 00 Plot c + 09 , d + 04 Plot c + 10 , d + 00 Plot c + 10 , d + 04 c = x + a + 25 + 3 d = y + 3 Plot c + 00 , d + 00 Plot c + 00 , d + 01 Plot c + 00 , d + 02 Plot c + 00 , d + 03 Plot c + 00 , d + 04 Plot c + 01 , d + 00 Plot c + 01 , d + 01 Plot c + 01 , d + 02 Plot c + 01 , d + 03 Plot c + 01 , d + 04 Plot c + 02 , d + 00 Plot c + 02 , d + 02 Plot c + 03 , d + 00 Plot c + 03 , d + 02 Plot c + 04 , d + 00 Plot c + 04 , d + 01 Plot c + 04 , d + 02 Plot c + 05 , d + 01 c = x + a + 50 + 3 d = y + 25 + 3 Plot c + 00 , d + 00 Plot c + 00 , d + 01 Plot c + 00 , d + 02 Plot c + 00 , d + 03 Plot c + 00 , d + 04 Plot c + 01 , d + 00 Plot c + 01 , d + 01 Plot c + 01 , d + 02 Plot c + 01 , d + 03 Plot c + 01 , d + 04 Plot c + 02 , d + 00 Plot c + 02 , d + 02 Plot c + 03 , d + 00 Plot c + 03 , d + 02 Plot c + 04 , d + 00 Plot c + 05 , d + 00 Color 0 , 127 , 255 Text tx , y - 09 , "Press Esc during the game to return here." , True , True Text tx , y + 03 , "Press P to pause the game." , True , True Text tx , y + 15 , "And press F to toggle between" , True , True Text tx , y + 27 , "hardware or software frame-limiting." , True , True s = 8 c = x + a - 50 d = y + 9 Color 63 , 63 , 0 For i = 0 To s Line c - i , d - i , c - i , d + i Next x = x + 5 y = y + 22 Color 63 , 63 , 63 Rect x , y , 51 , 80 , False Line x , y + 25 , x + 50 , y + 25 Line x + 25 , y , x + 25 , y + 25 Color 127 , 127 , 127 Rect x + 2 , y + 2 , 22 , 22 Rect x + 27 , y + 2 , 22 , 22 Rect x + 2 , y + 27 , 47 , 51 Color 95 , 95 , 95 Rect x + 2 -1, y + 2 -1, 22 +2, 22 +2, False Rect x + 27 -1, y + 2 -1, 22 +2, 22 +2, False Rect x + 2 -1, y + 27 -1, 47 +2, 51 +2, False a = x b = y x = a + 5 y = b + 10 Color 5 , 5 , 5 Plot x + 00 , y + 00 Plot x + 00 , y + 01 Plot x + 00 , y + 02 Plot x + 00 , y + 03 Plot x + 00 , y + 04 Plot x + 01 , y + 00 Plot x + 01 , y + 02 Plot x + 02 , y + 00 ;<-- Plot x + 04 , y + 00 Plot x + 04 , y + 04 Plot x + 05 , y + 00 Plot x + 05 , y + 01 Plot x + 05 , y + 02 Plot x + 05 , y + 03 Plot x + 05 , y + 04 Plot x + 06 , y + 00 Plot x + 06 , y + 04 ;<-- Plot x + 08 , y + 00 Plot x + 08 , y + 01 Plot x + 08 , y + 02 Plot x + 08 , y + 03 Plot x + 08 , y + 04 Plot x + 09 , y + 00 Plot x + 09 , y + 02 Plot x + 10 , y + 01 Plot x + 10 , y + 03 Plot x + 10 , y + 04 ;<-- Plot x + 12 , y + 00 Plot x + 12 , y + 01 Plot x + 12 , y + 02 Plot x + 12 , y + 03 Plot x + 12 , y + 04 Plot x + 13 , y + 00 Plot x + 13 , y + 02 Plot x + 13 , y + 04 Plot x + 14 , y + 00 Plot x + 14 , y + 04 x = a y = b a = 25 b = 40 s = 8 e = 45 f = 60 Color 63 , 63 , 63 c = x + a d = y + b - f For i = 0 To s Line c - i , d + i , c + i , d + i Next c = x + a d = y + b + f For i = 0 To s Line c - i , d - i , c + i , d - i Next c = x + a - e d = y + b For i = 0 To s Line c + i , d - i , c + i , d + i Next c = x + a + e d = y + b For i = 0 To s Line c - i , d - i , c - i , d + i Next a = 135 b = 40 s = 8 e = 35 DrawImage TargetBitmap , x + a , y + b Color 95 , 0 , 0 c = x + a d = y + b - e For i = 0 To s Line c - i , d + i , c + i , d + i Next c = x + a d = y + b + e For i = 0 To s Line c - i , d - i , c + i , d - i Next c = x + a - e d = y + b For i = 0 To s Line c + i , d - i , c + i , d + i Next c = x + a + e d = y + b For i = 0 To s Line c - i , d - i , c - i , d + i Next Color 0 , 127 , 255 Text tx , y + b - 6 , "Use the mouse to move the target." , True , True Text tx , y + b + 6 , "Press the primary mouse button to fire." , True , True s = 8 c = x + a + 90 d = y + b Color 63 , 63 , 0 For i = 0 To s Line c + i , d - i , c + i , d + i Next x = x + 50 a = 85 y = y + 112 DrawImage EnemyBitmap , x + a , y s = 8 c = x + a + 10 + ImageWidth ( EnemyBitmap ) / 2 d = y Color 63 , 63 , 0 For i = 0 To s Line c + i , d - i , c + i , d + i Next Color 0 , 127 , 255 Text tx , y - 12 , "The enemy comes in 5 different flavors." , True , True Text tx , y + 00 , "Shooting an enemy can give you up to 500 points." , True , True Text tx , y + 12 , "But when an enemy bumps into you, you lose 1000 points." , True , True y = y + 66 DrawImage BulletBitmap , x + a , y s = 8 c = x + a + 10 + ImageWidth ( BulletBitmap ) / 2 d = y Color 63 , 63 , 0 For i = 0 To s Line c + i , d - i , c + i , d + i Next Color 0 , 127 , 255 Text tx , y - 24 , "Both you and ememies can fire bullets which cost points." , True , True Text tx , y - 12 , "The higher the firing-rate, the higher the cost." , True , True Text tx , y + 00 , "The higher the score, the higher the firing-rate." , True , True Text tx , y + 12 , "An enemy is always instantly killed by a bullet." , True , True Text tx , y + 24 , "But when a bullet hits you, you lose 100 points." , True , True y = y + 60 DrawImage ShrapnelBitmap , x + a , y s = 8 c = x + a + 10 + ImageWidth ( ShrapnelBitmap ) / 2 d = y Color 63 , 63 , 0 For i = 0 To s Line c + i , d - i , c + i , d + i Next Color 0 , 127 , 255 Text tx , y - 6 , "When you kill an enemy, it leaves behind shrapnel." , True , True Text tx , y + 6 , "Shrapnel, in this game, is completely harmless." , True , True y = y + 36 Text 400 , y + 00 , "The game progresses slowly, so you can easily familiarize yourself with the environment." , True , True Text 400 , y + 12 , "But please be aware that at a certain point in the game, the enemies" , True , True Text 400 , y + 24 , "will start looking like a green virus from outer space gone mad." , True , True Text 400 , y + 36 , "At that point you will know you're not inside a dull shooter but a virus wrecking mayhem." , True , True y = y + 66 Color 127 , 191 , 255 Text 200 , y , "Press Fire to start" , True , True Text 600 , y , "Press Esc to stop" , True , True SetFont Font Color 0 , 127 , 255 Text 200 , 590 , "Score: " + WithComma ( Score ) , True , True Text 600 , 590 , "High: " + WithComma ( HighScore ) , True , True Color 47 , 95 , 0 Rect 298 , 594 , 200 + 2 , 6 , False For Enemies = 1 To MaxEnemy Enemy = New Enemy Enemy\X = Int ( Rnd ( 800 ) ) Enemy\Y = Int ( Rnd ( 600 ) ) Enemy\Class = Int ( Rnd ( 360 ) ) ; Class temporarily used as Angle Next ;------------------------------------------------------------------------------- SpawnTimer = 0 Shaking# = 20 SetBuffer BackBuffer () ExitLoop = False Repeat If SpawnTimer < 10 SpawnTimer = SpawnTimer + 1 Else SpawnTimer = 0 If Enemies > MaxEnemy Enemy = First Enemy For x = 0 To 3 Shrapnel = New Shrapnel Shrapnel\X = Enemy\X Shrapnel\Y = Enemy\Y Shrapnel\Angle = x * 90 + Rnd ( 90 ) Shrapnel\Distance = 0 Shrapnel\TotalDistance = 9 + Rnd ( 20 ) Next Delete Enemy EndIf Enemy = New Enemy Enemy\X = Int ( Rnd ( 800 ) ) Enemy\Y = Int ( Rnd ( 600 ) ) Enemy\Class = Int ( Rnd ( 360 ) ) EndIf For Enemy = Each Enemy Enemy\Class = Enemy\Class + Rnd ( -15 , 15 ) Enemy\X = Enemy\X + GetVectorX ( 3 , Enemy\Class ) + GetVectorX ( 2 , Rnd ( 360 ) ) Enemy\Y = Enemy\Y + GetVectorY ( 3 , Enemy\Class ) + GetVectorY ( 2 , Rnd ( 360 ) ) If Enemy\X < 0 Then Enemy\X = Enemy\X + 800 If Enemy\X > 799 Then Enemy\X = Enemy\X - 800 If Enemy\Y < 0 Then Enemy\Y = Enemy\Y + 600 If Enemy\Y > 599 Then Enemy\Y = Enemy\Y - 600 DrawImage EnemyBitmap , Enemy\X , Enemy\Y Next For Shrapnel = Each Shrapnel Shrapnel\X = Shrapnel\X + GetVectorX ( 1 , Shrapnel\Angle ) Shrapnel\Y = Shrapnel\Y + GetVectorY ( 1 , Shrapnel\Angle ) If Shrapnel\Distance >= Shrapnel\TotalDistance Delete Shrapnel Shrapnel = After Shrapnel If Shrapnel = Null Then Exit Else Shrapnel\Distance = Shrapnel\Distance + 1 EndIf If Shrapnel\X < 0 Then Shrapnel\X = Shrapnel\X + 800 If Shrapnel\X > 799 Then Shrapnel\X = Shrapnel\X - 800 If Shrapnel\Y < 0 Then Shrapnel\Y = Shrapnel\Y + 600 If Shrapnel\Y > 599 Then Shrapnel\Y = Shrapnel\Y - 600 DrawImage ShrapnelBitmap , Shrapnel\X , Shrapnel\Y Next If Shaking > 0.1 Shaking = Shaking / 1.03 DrawImage InformationBitmap , Rnd ( -Shaking , Shaking ) , Rnd ( -Shaking , Shaking ) Else Shaking = 0 DrawImage InformationBitmap , Rnd ( -Shaking , Shaking ) , Rnd ( -Shaking , Shaking ) EndIf Flip True Cls If MouseDown ( 1 ) Then ExitLoop = True If KeyHit ( KeyEscape ) QuitGame = True ExitLoop = True EndIf Until ExitLoop FreeImage InformationBitmap ;------------------------------------------------------------------------------- If Not QuitGame ;------------------------------------------------------------------------------- ClsColor 255 , 255 , 255 Cls Flip True ClsColor 0 , 0 , 0 For Enemy = Each Enemy For x = 0 To 3 Shrapnel = New Shrapnel Shrapnel\X = Enemy\X Shrapnel\Y = Enemy\Y Shrapnel\Angle = x * 90 + Rnd ( 90 ) Shrapnel\Distance = 0 Shrapnel\TotalDistance = 9 + Rnd ( 20 ) Next Delete Enemy Next Enemies = 0 FlushKeys () ;------------------------------------------------------------------------------- SetBuffer BackBuffer () ExitLoop = False Repeat WaitTimer ( Timer ) If Score < 1000 BulletCost = 1 ShootDelay = 140 Level = 0 EnemyClass = 1 EnemySpeed = 1 ElseIf Score < 2000 BulletCost = 1 ShootDelay = 120 EnemySpeed = 2 EnemyShooting = True EnemyShots = 1 ElseIf Score < 4000 BulletCost = 1 ShootDelay = 100 EnemyShots = 2 ElseIf Score < 6000 BulletCost = 1 ShootDelay = 80 EnemyShots = 5 ElseIf Score < 8000 EnemyShots = 10 ElseIf Score < 10000 BulletCost = 2 ShootDelay = 60 Level = 1 EnemyClass = 2 ElseIf Score < 20000 BulletCost = 3 ShootDelay = 40 Level = 2 EnemySpeed = 3 ElseIf Score < 30000 BulletCost = 4 ShootDelay = 24 EnemyClass = 3 ElseIf Score < 40000 BulletCost = 5 ShootDelay = 12 EnemyShots = 20 ElseIf Score < 60000 BulletCost = 6 ShootDelay = 6 Level = 3 EnemyClass = 4 ElseIf Score < 80000 EnemyShots = 50 ElseIf Score < 100000 BulletCost = 12 ShootDelay = 4 Level = 4 EnemyClass = 5 ElseIf Score < 200000 BulletCost = 24 ShootDelay = 2 Level = 5 ElseIf Score < 300000 EnemyShots = 100 ElseIf Score < 400000 BulletCost = 48 ShootDelay = 1 Level = 6 ElseIf Score < 500000 BulletCost = 96 ShootDelay = 0 Level = 7 EnemySpeed = 4 ElseIf Score < 600000 EnemyShots = 200 ElseIf Score < 700000 Level = 8 EnemySpeed = 6 ElseIf Score < 800000 EnemyShots = 300 ElseIf Score < 900000 EnemyShots = 400 ElseIf Score < 1000000 Level = 9 EnemySpeed = 8 EnemyShots = 500 ElseIf Score < 2000000 Level = 10 EnemySpeed = 10 EnemyShots = 1000 Else BulletCost = 0 Level = 10 GodMode = True EndIf If Score > HighScore HighScore = Score EndIf If ScoreWait > 9 ScoreWait = 0 Score = Score + 1 Else ScoreWait = ScoreWait + 1 EndIf If Shooting If ShootingWait >= ShootDelay Shooting = False ShootingWait = 0 Else ShootingWait = ShootingWait + 1 EndIf Else If MouseDown ( 1 ) If Score >= BulletCost Score = Score - BulletCost Shooting = True Bullet = New Bullet Bullet\Owner = 1 Bullet\X = PlayerX Bullet\Y = PlayerY Bullet\Angle = GetAngle ( MouseX () - PlayerX , MouseY () - PlayerY ) EndIf EndIf EndIf If SpawningTime > 1 SpawningTime = SpawningTime / 1.00015 EndIf If SpawningWait > SpawningTime SpawningWait = 0 If Enemies >= MaxEnemy Enemy = First Enemy For x = 0 To 3 Shrapnel = New Shrapnel Shrapnel\X = Enemy\X Shrapnel\Y = Enemy\Y Shrapnel\Angle = x * 90 + Rnd ( 90 ) Shrapnel\Distance = 0 Shrapnel\TotalDistance = 9 + Rnd ( 20 ) Next Delete Enemy Enemies = Enemies - 1 EndIf Repeat x = Rnd ( 800 ) y = Rnd ( 600 ) Until Not ( x > PlayerX - 149 ) And ( x < PlayerX + 149 ) And ( y > PlayerY - 149 ) And ( y < PlayerY + 149 ) Enemy = New Enemy Enemies = Enemies + 1 Enemy\X = x Enemy\Y = y Enemy\Class = Rnd ( 1 , EnemyClass ) Else SpawningWait = SpawningWait + 1 EndIf If KeyDown ( KeyCursorUp ) PlayerY = PlayerY - 2 MovementY = True EndIf If KeyDown ( KeyCursorDown ) PlayerY = PlayerY + 2 MovementY = True EndIf If KeyDown ( KeyCursorLeft ) PlayerX = PlayerX - 2 MovementX = True EndIf If KeyDown ( KeyCursorRight ) PlayerX = PlayerX + 2 MovementX = True EndIf If MovementY MovementY = False If PlayerY < 0 Then PlayerY = 0 If PlayerY > 599 Then PlayerY = 599 EndIf If MovementX MovementX = False If PlayerX < 0 Then PlayerX = 0 If PlayerX > 799 Then PlayerX = 799 EndIf For Shrapnel = Each Shrapnel Shrapnel\X = Shrapnel\X + GetVectorX ( 1 , Shrapnel\Angle ) Shrapnel\Y = Shrapnel\Y + GetVectorY ( 1 , Shrapnel\Angle ) If Shrapnel\Distance >= Shrapnel\TotalDistance Delete Shrapnel Shrapnel = After Shrapnel If Shrapnel = Null Then Exit Else Shrapnel\Distance = Shrapnel\Distance + 1 If ( Shrapnel\X < 0 ) Or ( Shrapnel\X > 799 ) Or ( Shrapnel\Y < 0 ) Or ( Shrapnel\Y > 599 ) Delete Shrapnel Shrapnel = After Shrapnel If Shrapnel = Null Then Exit EndIf EndIf DrawImage ShrapnelBitmap , Shrapnel\X , Shrapnel\Y Next For Enemy = Each Enemy x = Rnd ( -1 , 1 ) y = Rnd ( -1 , 1 ) Select Enemy\Class Case 1 If EnemyShooting If Int ( Rnd ( 10000 / EnemyShots ) ) = 0 Blt.Bullet = New Bullet Blt\Owner = 2 Blt\X = Enemy\X Blt\Y = Enemy\Y Blt\Angle = GetAngle ( PlayerX - Enemy\X , PlayerY - Enemy\Y ) + Rnd ( -5 , 5 ) If Blt\Angle < 0 Then Blt\Angle = Blt\Angle + 360 If Blt\Angle > 359 Then Blt\Angle = Blt\Angle - 360 EndIf EndIf Enemy\X = Enemy\X + x * EnemySpeed Enemy\Y = Enemy\Y + y * EnemySpeed Case 2 If EnemyShooting If Int ( Rnd ( 20000 / EnemyShots ) ) = 0 Blt.Bullet = New Bullet Blt\Owner = 2 Blt\X = Enemy\X Blt\Y = Enemy\Y Blt\Angle = GetAngle ( PlayerX - Enemy\X , PlayerY - Enemy\Y ) + Rnd ( -10 , 10 ) If Blt\Angle < 0 Then Blt\Angle = Blt\Angle + 360 If Blt\Angle > 359 Then Blt\Angle = Blt\Angle - 360 EndIf EndIf z = EnemySpeed/2 Enemy\X = Enemy\X + x * z Enemy\Y = Enemy\Y + y * z If MouseX () > Enemy\X Then Enemy\X = Enemy\X - z If MouseX () < Enemy\X Then Enemy\X = Enemy\X + z If MouseY () > Enemy\Y Then Enemy\Y = Enemy\Y - z If MouseY () < Enemy\Y Then Enemy\Y = Enemy\Y + z Case 3 If EnemyShooting If Int ( Rnd ( 30000 / EnemyShots ) ) = 0 Blt.Bullet = New Bullet Blt\Owner = 2 Blt\X = Enemy\X Blt\Y = Enemy\Y Blt\Angle = GetAngle ( PlayerX - Enemy\X , PlayerY - Enemy\Y ) + Rnd ( -15 , 15 ) If Blt\Angle < 0 Then Blt\Angle = Blt\Angle + 360 If Blt\Angle > 359 Then Blt\Angle = Blt\Angle - 360 EndIf EndIf z = EnemySpeed/3 Enemy\X = Enemy\X + x * z Enemy\Y = Enemy\Y + y * z If PlayerX < Enemy\X Then Enemy\X = Enemy\X - z If PlayerX > Enemy\X Then Enemy\X = Enemy\X + z If PlayerY < Enemy\Y Then Enemy\Y = Enemy\Y - z If PlayerY > Enemy\Y Then Enemy\Y = Enemy\Y + z If MouseX () > Enemy\X Then Enemy\X = Enemy\X - z If MouseX () < Enemy\X Then Enemy\X = Enemy\X + z If MouseY () > Enemy\Y Then Enemy\Y = Enemy\Y - z If MouseY () < Enemy\Y Then Enemy\Y = Enemy\Y + z Case 4 z = EnemySpeed/2 Enemy\X = Enemy\X + x * z Enemy\Y = Enemy\Y + y * z If PlayerX < Enemy\X Then Enemy\X = Enemy\X - z If PlayerX > Enemy\X Then Enemy\X = Enemy\X + z If PlayerY < Enemy\Y Then Enemy\Y = Enemy\Y - z If PlayerY > Enemy\Y Then Enemy\Y = Enemy\Y + z Case 5 z = EnemySpeed/2 a = GetAngle ( PlayerX - Enemy\X , PlayerY - Enemy\Y ) Enemy\X = Enemy\X + GetVectorX ( z , a ) + GetVectorX ( z , x*180+180 ) Enemy\Y = Enemy\Y + GetVectorY ( z , a ) + GetVectorY ( z , y*180+180 ) End Select If Enemy\X < 0 Then Enemy\X = 0 If Enemy\X > 799 Then Enemy\X = 799 If Enemy\Y < 0 Then Enemy\Y = 0 If Enemy\Y > 599 Then Enemy\Y = 599 If ImagesOverlap ( EnemyBitmap , Enemy\X , Enemy\Y , PlayerBitmap , PlayerX , PlayerY ) If ImagesCollide ( EnemyBitmap , Enemy\X , Enemy\Y , 0 , PlayerBitmap , PlayerX , PlayerY , 0 ) For x = 0 To 3 Shrapnel = New Shrapnel Shrapnel\X = Enemy\X Shrapnel\Y = Enemy\Y Shrapnel\Angle = x * 90 + Rnd ( 90 ) Shrapnel\Distance = 0 Shrapnel\TotalDistance = 9 + Rnd ( 20 ) Next Delete Enemy Enemies = Enemies - 1 If Not GodMode Then Score = Score - 1000 Enemy = After Enemy If Enemy = Null Then Exit EndIf EndIf DrawImage EnemyBitmap , Enemy\X , Enemy\Y For Bullet = Each Bullet If Bullet\Owner = 1 If ImagesOverlap ( EnemyBitmap , Enemy\X , Enemy\Y , BulletBitmap , Bullet\X , Bullet\Y ) If ImagesCollide ( EnemyBitmap , Enemy\X , Enemy\Y , 0 , BulletBitmap , Bullet\X , Bullet\Y , 0 ) Score = Score + ( 100 * Enemy\Class ) If EnemyShooting Select Enemy\Class Case 1 Score = Score + 300 Case 2 Score = Score + 200 Case 3 Score = Score + 100 End Select EndIf For x = 0 To 3 Shrapnel = New Shrapnel Shrapnel\X = Enemy\X Shrapnel\Y = Enemy\Y Shrapnel\Angle = x * 90 + Rnd ( 90 ) Shrapnel\Distance = 0 Shrapnel\TotalDistance = 9 + Rnd ( 20 ) Next Delete Bullet Delete Enemy Enemies = Enemies - 1 Exit EndIf EndIf EndIf Next Next For Bullet = Each Bullet Bullet\X = Bullet\X + GetVectorX ( 5 , Bullet\Angle ) Bullet\Y = Bullet\Y + GetVectorY ( 5 , Bullet\Angle ) If ( Bullet\X < 0 ) Or ( BulletX > 799 ) Or ( Bullet\Y < 0 ) Or ( Bullet\Y > 599 ) Delete Bullet Bullet = After Bullet If Bullet = Null Then Exit EndIf If Bullet\Owner = 2 If ImagesOverlap ( PlayerBitmap , PlayerX , PlayerY , BulletBitmap , Bullet\X , Bullet\Y ) If ImagesCollide ( PlayerBitmap , PlayerX , PlayerY , 0 , BulletBitmap , Bullet\X , Bullet\Y , 0 ) Delete Bullet If Not GodMode Then Score = Score - 100 Bullet = After Bullet If Bullet = Null Then Exit EndIf EndIf EndIf DrawImage BulletBitmap , Bullet\X , Bullet\Y Next If Score < 0 Then Score = 0 DrawImage PlayerBitmap , PlayerX , PlayerY DrawImage TargetBitmap , MouseX () , MouseY () Color 0 , 127 , 255 Text 200 , 590 , "Score: " + WithComma ( Score ) , True , True Text 600 , 590 , "High: " + WithComma ( HighScore ) , True , True If Not GodMode Color 255 , 0 , 0 Else Color 255 , 191 , 0 EndIf Text 400 , 590 , String ( "¤" , Level ) , True , True Color 63 , 127 , 0 Rect 300 , 596 , ( 100 - SpawningTime ) * 2 , 2 , False Color 47 , 95 , 0 Rect 298 , 594 , 200 + 2 , 6 , False If ShootDelay > 40 If Shooting Color 63 , 127 , 0 Rect 10 , 10 , ShootingWait * 780 / ShootDelay , 10 , True Color 47 , 95 , 0 Rect 8 , 8 , 780 + 4 , 14 , False Color 95 , 191 , 0 Text 400 , 15 , "RECHARGING" , True , True EndIf EndIf If FrameLimit Then Flip True Else Flip False EndIf Cls If KeyHit ( KeyF ) FrameLimit = Not FrameLimit EndIf If KeyHit ( KeyP ) SetBuffer FrontBuffer () Color 0 , 63 , 127 Rect 400 - 100 - 2 , 300 - 30 - 2 , 100 * 2 + 4 , 30 * 2 + 4 , False Color 0 , 47 , 95 Rect 400 - 100 , 300 - 30 , 100 * 2 , 30 * 2 , True Color 0 , 127 , 255 Text 400 , 300 , "PAUSED" , True , True SetBuffer BackBuffer () Repeat Until KeyHit ( KeyP ) FlushKeys () EndIf If KeyHit ( KeyEscape ) ExitLoop = True EndIf Until ExitLoop Delete Each Bullet ;------------------------------------------------------------------------------- EndIf ;------------------------------------------------------------------------------- Until QuitGame Delete Each Shrapnel Delete Each Bullet Delete Each Enemy FreeImage ShrapnelBitmap FreeImage BulletBitmap FreeImage EnemyBitmap FreeImage PlayerBitmap FreeFont Font FreeFont SmallFont FreeTimer Timer EndGraphics Color 255 , 255 , 255 Print "Shutting down automatically..." End ;------------------------------------------------------------------------------- Function WithComma$ ( Number$ ) Local Reverse$ Local Comma$ For x = 1 To Len ( Number ) Reverse = Reverse + Mid ( Number , Len ( Number ) - x + 1 , 1 ) Counter = Counter + 1 If Counter = 3 Counter = 0 Reverse = Reverse + "," EndIf Next For x = 1 To Len ( Reverse ) Comma = Comma + Mid ( Reverse , Len ( Reverse ) - x + 1 , 1 ) Next If Left ( Comma , 1 ) = "," Then Comma = Mid ( Comma , 2 , Len ( Comma ) - 1 ) Return Comma End Function ;-------------------------------------------------------------------------------