Microsoft Small Basic

Program Listing: NLQ667-1
'Small Basic Gorilla 1.1

'setup subroutines to handle key events
GraphicsWindow.KeyDown = DoKeyDown
GraphicsWindow.MouseDown = OnMouseDown

GraphicsWindow.Title = "Small Basic Gorillas version 1.1"

GetPath()
GameInit()
Intro()
PlayGame()
DoGameOver()

'---------------------------------------------------------------------------
Sub GetPath
'Be sure you store the images in the same directory as the program
Path = Program.Directory
'array to store filenames of the program directory.
'we can then check for the image files & if needed throw an error if we cannot find them.
'we could do the same for sound files, but if the sound is not found, the program ignores the sound.play command without major error

FileArray = 0

'check for images and load them
' The following line could be harmful and has been automatically commented.
' File.GetFiles(Path, FileArray)

FileArmsDown = "NotFound"
FileLeftUp = "NotFound"
FileRightUp = "NotFound"
FileVictory = "NotFound"

For I = 1 to Array.GetItemCount(FileArray)
If (FileArmsDown = "NotFound") Then
If (Array.GetValue(FileArray,I) = Path + "\GorillaArmsDown.bmp") Then
FileArmsDown = "Found"
EndIf
EndIf
If (FileLeftUp = "NotFound") Then
If (Array.GetValue(FileArray,I) = Path + "\GorillaLeftUp.bmp") Then
FileLeftUp = "Found"
EndIf
EndIf
If (FileRightUp = "NotFound") Then
If (Array.GetValue(FileArray,I) = Path + "\GorillaRightUp.bmp") Then
FileRightUp = "Found"
EndIf
EndIf
If (FileVictory = "NotFound") Then
If (Array.GetValue(FileArray,I) = Path + "\GorillaVictory.bmp") Then
FileVictory = "Found"
EndIf
EndIf
EndFor
If (FileArmsDown = "NotFound" Or FileLeftUp = "NotFound" Or FileRightUp = "NotFound" Or FileVictory = "NotFound") Then
GraphicsWindow.ShowMessage("Could not find image files. Please place image files in the same directory as the Gorilla.exe program", "Error:")
Program.End()
EndIf

'load gorilla images
GorillaArmsDown = ImageList.LoadImage(Path + "\GorillaArmsDown.bmp")
GorillaLeftUp = ImageList.LoadImage(Path + "\GorillaLeftUp.bmp")
GorillaRightUp = ImageList.LoadImage(Path + "\GorillaRightUp.bmp")
GorillaVictory = ImageList.LoadImage(Path + "\GorillaVictory.bmp")
EndSub

'---------------------------------------------------------------------------
Sub GameInit
'used to set a decimal color to hex color, see FadeIn()
HexaDecimal = "0123456789ABCDEF"

'graphics window stuff
GraphicsWindow.Width = 700
GraphicsWindow.Height = 500

'get the width and height so they are easier to type
ScrX = GraphicsWindow.Width
ScrY = GraphicsWindow.Height

'find middle of window
MidScrX = ScrX / 2
MidScrY = ScrY / 2

'sound
SoundOnOff = "On"

'city stuff
Gravity = 9.8
GroundLevel = ScrY - 20
CityOffset = 20

'each building has 5 to 20 floors with windows, each with a height of 15
FloorHeight = 15

'size of the building's windows
WindowWidth = 4
WindowHeight = 6

'offsets to correctly position the windows on the building
WindowWidthOffset = 3
WindowHeightOffset = 4

'initiate arrays for the buildings
BuildingHeight = "BHeight"
BuildingWidth = "BWidth"
BuildingX = "X" 'this is a marker pointing to where the building is on the screen

'these are the width and height of the gorilla images
GorillaWidth = 28
GorillaHeight = 29

'banana stuff
BananaSize = 4
'bananastate is a counter used to animate the banana
BananaState = 0

'explosion stuff
'this is the number of ellipses the explosion makes when blowing up the gorilla
NumExplosions = 24

'Game stuff
'how many rounds to play
NumRounds = 3

EndSub

'---------------------------------------------------------------------------
Sub RoundInit

BuildingInit()
'place the gorillas on the rooftop
'gorilla 1
Placement = Math.GetRandomNumber(3) + 1
G1X = Array.GetValue(BuildingX, Placement) - CityOffset + (Placement * 2) + (Array.GetValue(BuildingWidth, Placement) / 2 - GorillaWidth / 2)
G1Y = GroundLevel - (FloorHeight * Array.GetValue(BuildingHeight, Placement)) - GorillaHeight - 1

'gorilla 2
Placement = Math.GetRandomNumber(3)
G2X = Array.GetValue(BuildingX, NumBuildings - Placement) - CityOffset + (NumBuildings - Placement) * 2 + (Array.GetValue(BuildingWidth, NumBuildings - Placement) / 2 - GorillaWidth / 2)
G2Y = GroundLevel - (FloorHeight * Array.GetValue(BuildingHeight,(NumBuildings - Placement))) - GorillaHeight - 1

' 1 = gorilla 1 is throwing 2 = gorilla 2 is throwing 0 = no one is throwing
Throwing = 0
'reset sun
SunMouth = "Smile"

'banana stuff
'BananaState is a flag to what frame the banana animation is on
BananaState = 0

EndSub

'---------------------------------------------------------------------------
Sub BuildingInit
'I seperated the BuildingInit from RoundInit() to add a nice graphic to Intro()

'there are 15 different heights, pick one and multipy it by size of each floor
'CitySize is a counter of the number of pixels used to draw the screen
'if CitySize is greater than the screensize then screen is full
CitySize = 0

'how many buildings were we able to fit on the screen
'used also to place gorilla 2
NumBuildings = 0
While (CitySize <= ScrX - 10)
'this varies the size of the buildings from sizes 40, 50, 60
NewBuilding = Math.GetRandomNumber(9)
NumBuildings = NumBuildings + 1
If (NewBuilding < 2) Then
Array.SetValue(BuildingWidth, NumBuildings, 40)
Array.SetValue(BuildingX, NumBuildings, CitySize)
'the extra 2 is a offset so the buildings are not so close together
CitySize = CitySize + 42
ElseIf (NewBuilding >= 2 And NewBuilding <= 7) Then
Array.SetValue(BuildingWidth, NumBuildings, 50)
Array.SetValue(BuildingX, NumBuildings, CitySize)
'the extra 2 is a offset so the buildings are not so close together
CitySize = CitySize + 52
ElseIf (NewBuilding > 7) Then
Array.SetValue(BuildingWidth, NumBuildings, 60)
Array.SetValue(BuildingX, NumBuildings, CitySize)
'the extra 2 is a offset so the buildings are not so close together
CitySize = CitySize + 62
EndIf

'the original game made V slopes and peaks, I didn't bother with that yet
'add nice landscape later, until then
Array.SetValue(BuildingHeight, NumBuildings, Math.GetRandomNumber(15)+5)
'if the game is over, make a row of buildings to announce winner
If (GameOver = 1) Then
Array.SetValue(BuildingHeight, NumBuildings, 13)
EndIf
EndWhile
EndSub

'---------------------------------------------------------------------------
Sub DrawCity
'CitySize is now just used as a counter to draw the actual landscape
'I offset it by -20 so both sides of the screen would look similar
CitySize = 0 - CityOffset
For DC = 1 To NumBuildings
BW = Array.GetValue(BuildingWidth, DC)
BH = Array.GetValue(BuildingHeight, DC)

'add a little color so everything doesn't look the same
BuildingColor = Math.GetRandomNumber(3)
If (BuildingColor = 1) Then
GraphicsWindow.BrushColor = "IndianRed"
ElseIf (BuildingColor = 2) Then
GraphicsWindow.BrushColor = "SpringGreen"
ElseIf (BuildingColor = 3) Then
GraphicsWindow.BrushColor = "Cyan"
EndIf

'Draw the building
GraphicsWindow.FillRectangle(CitySize, GroundLevel - (FloorHeight * BH), BW, (FloorHeight * BH))

'I added an outline to make the buildings look better
GraphicsWindow.PenColor = "RoyalBlue"
GraphicsWindow.DrawRectangle(CitySize, GroundLevel - (FloorHeight * BH), BW, (FloorHeight * BH))

'as we draw each building we also draw the windows
'the size of the building determines how many windows it has
WW = 0
WH = 0
For WH = 1 To BH - 1
For WW = 1 To BW / 10
'some lights are on and some are off
If (Math.GetRandomNumber(2) = 2) Then
GraphicsWindow.BrushColor = "Khaki"
Else
GraphicsWindow.BrushColor = "Grey"
EndIf
'draw the window
GraphicsWindow.FillRectangle(CitySize - 5 + (WW * WindowWidthOffset * 3), GroundLevel - 4 - (FloorHeight * WH), WindowWidth, WindowHeight)
EndFor
EndFor
CitySize = CitySize + 4 + Array.GetValue(BuildingWidth, DC)
EndFor
SetWind()
EndSub

'---------------------------------------------------------------------------
Sub SetWind
'this code is very similar to the original
'create wind
Wind = Math.GetRandomNumber(10) - 5
If (Math.GetRandomNumber(3) = 2) Then
If (Wind > 0) Then
Wind = Wind + Math.GetRandomNumber(10)
Else
Wind = Wind - Math.GetRandomNumber(10)
EndIf
EndIf

'draw wind speed arrow below the city
GraphicsWindow.PenColor = "Red"
If (Wind <> 0) Then
WindLine = Wind * 3 * (ScrX / 320)
GraphicsWindow.DrawLine(MidScrX, ScrY - 10, MidScrX + WindLine, ScrY - 10)
If (Wind > 0) Then
ArrowDir = -4
Else
ArrowDir = 4
EndIf
GraphicsWindow.DrawLine(MidScrX + WindLine, ScrY - 10, MidScrX + WindLine + ArrowDir, ScrY - 10 - 4)
GraphicsWindow.DrawLine(MidScrX + WindLine, ScrY - 10, MidScrX + WindLine + ArrowDir, ScrY - 10 + 4)
Else
'if there's no wind tell them
GraphicsWindow.FontSize = 12
GraphicsWindow.BrushColor = "Red"
GraphicsWindow.DrawText(MidScrX - 24, ScrY - 18, "No Wind")
EndIf
EndSub

'---------------------------------------------------------------------------
Sub DrawBanana
'go to the next frame in the animation
BananaState = BananaState + 1
GraphicsWindow.BrushColor = "#FFFF00"
' left pointing ( banana
If (BananaState = 1 ) Then
GraphicsWindow.FillRectangle(BananaX, BananaY, 2, 4)
GraphicsWindow.FillRectangle(BananaX + 2, BananaY - 2, 2, 8)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 4, 2, 4)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 2, 4)
EndIf
'upward pointing ^ banana
If (BananaState = 2) Then
'rotate the banana the right way
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(BananaX - 4, BananaY + 4, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 2, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 4, 2)
Else
GraphicsWindow.FillRectangle(BananaX - 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY + 2, 4, 2)
EndIf
EndIf
'right pointing ) banana
If (BananaState = 3) Then
GraphicsWindow.FillRectangle(BananaX - 2, BananaY - 4, 2, 4)
GraphicsWindow.FillRectangle(BananaX, BananaY - 2, 2, 8)
GraphicsWindow.FillRectangle(BananaX + 2, BananaY, 2, 4)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 4, 2, 4)
EndIf
'downward pointing V banana
If (BananaState = 4) Then
'rotate the banana the right way
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(BananaX - 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY + 2, 4, 2)
Else
GraphicsWindow.FillRectangle(BananaX - 4, BananaY + 4, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 2, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 4, 2)
EndIf
EndIf
EndSub

'---------------------------------------------------------------------------
Sub EraseBanana
GraphicsWindow.BrushColor = GraphicsWindow.BackgroundColor
If (BananaState = 1 ) Then
GraphicsWindow.FillRectangle(BananaX, BananaY, 2, 4)
GraphicsWindow.FillRectangle(BananaX + 2, BananaY - 2, 2, 8)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 4, 2, 4)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 2, 4)
EndIf
'upward pointing ^ banana
If (BananaState = 2) Then
'rotate the banana the right way
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(BananaX - 4, BananaY + 4, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 2, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 4, 2)
Else
GraphicsWindow.FillRectangle(BananaX - 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY + 2, 4, 2)
EndIf
EndIf
'right pointing ) banana
If (BananaState = 3) Then
GraphicsWindow.FillRectangle(BananaX - 2, BananaY - 4, 2, 4)
GraphicsWindow.FillRectangle(BananaX, BananaY - 2, 2, 8)
GraphicsWindow.FillRectangle(BananaX + 2, BananaY, 2, 4)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 4, 2, 4)
EndIf
'downward pointing V banana
If (BananaState = 4) Then
'rotate the banana the right way
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(BananaX - 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY - 2, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY + 2, 4, 2)
Else
GraphicsWindow.FillRectangle(BananaX - 4, BananaY + 4, 4, 2)
GraphicsWindow.FillRectangle(BananaX - 2, BananaY + 2, 8, 2)
GraphicsWindow.FillRectangle(BananaX, BananaY, 4, 2)
GraphicsWindow.FillRectangle(BananaX + 4, BananaY + 4, 4, 2)
EndIf
'the draw-erase cycle of the banana is complete so reset state to startover
BananaState = 0
EndIf

'if banana is in the sun's air space then redraw sun
If (BananaUnderSun = "True") Then
DoSun()
EndIf
EndSub

'---------------------------------------------------------------------------
Sub DoMiniExplosion
'if the banana hits something other than the gorilla, just make a small explosion

If (SoundOnOff = "On") Then
Sound.Play(Path + "\Explo Classic.wav")
EndIf
'erase the Banana
EraseBanana()
GraphicsWindow.BrushColor = "#B22222"
For C = 1 To NumExplosions - 5
GraphicsWindow.FillEllipse(BananaX - C / 4, BananaY - C / 4, C , C)
Program.Delay(25)
EndFor
GraphicsWindow.BrushColor = "#0000FF"
'add 1 to cleanup explosion
For C = 1 To NumExplosions - 4
GraphicsWindow.FillEllipse(BananaX - C / 4, BananaY - C / 4, C, C)
Program.Delay(25)
EndFor
Sound.Stop(Path + "\Explo Classic.wav")
If (ShatterGlass = "True" And SoundOnOff = "On") Then
Sound.Play(Path + "\glass_shatter_c.wav")
Program.Delay(1100)
Sound.Stop(Path + "\glass_shatter_c.wav")
ShatterGlass = "False"
EndIf

EndSub

'---------------------------------------------------------------------------
Sub DoExplosion
If (SoundOnOff = "On") Then
Sound.Play(Path + "\bigboom.wav")
EndIf
GraphicsWindow.BrushColor = "#B22222"
For C = 1 To NumExplosions
GraphicsWindow.FillEllipse(BananaX - C , BananaY - C , C * 3 , C * 2)
Program.Delay(25)
EndFor
GraphicsWindow.BrushColor = "#0000FF"
'add 1 to cleanup explosion
For C = 1 To NumExplosions + 1
GraphicsWindow.FillEllipse(BananaX - C , BananaY - C , C * 3 , C * 2)
Program.Delay(25)
EndFor
Sound.Stop(Path + "\bigboom.wav")
EndSub

'---------------------------------------------------------------------------
Sub DrawGorillas
'throwing is a flag that properly shows the gorilla images

If (Throwing = 0) Then
'no one is throwing
GraphicsWindow.DrawImage(GorillaArmsDown, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaArmsDown, G2X, G2Y)
ElseIf (Throwing = 1) Then
'gorilla 1 is throwing
GraphicsWindow.DrawImage(GorillaRightUp, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaArmsDown, G2X, G2Y)
ElseIf (Throwing = 2) Then
'gorilla 2 is throwing
GraphicsWindow.DrawImage(GorillaArmsDown, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaLeftUp, G2X, G2Y)
ElseIf (Throwing = 3) Then
'gorilla 1 won, raise his arms in victory
GraphicsWindow.DrawImage(GorillaVictory, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaArmsDown, G2X, G2Y)
ElseIf (Throwing = 4) Then
'gorilla 2 won, raise his arms in victory
GraphicsWindow.DrawImage(GorillaArmsDown, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaVictory, G2X, G2Y)
ElseIf (Throwing = 5) Then
'its a tie, raise one arm of each gorilla
GraphicsWindow.DrawImage(GorillaLeftUp, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaRightUp, G2X, G2Y)
EndIf
EndSub

'---------------------------------------------------------------------------
Sub DoSun
'set position of sun
SunX = ScrX / 2
SunY = 60

'clear old sun
GraphicsWindow.BrushColor = "#0000FF"
GraphicsWindow.FillRectangle(SunX - 20, SunY - 20, 40, 40)

'draw new sun
'body
GraphicsWindow.BrushColor = "#FFFF00"
GraphicsWindow.FillEllipse(SunX -15, SunY -15, 30, 30)

'rays
GraphicsWindow.PenColor = "#FFFF00"
GraphicsWindow.DrawLine(SunX, SunY - 20, SunX, SunY + 20)
GraphicsWindow.DrawLine(SunX - 20, SunY, SunX + 20, SunY)

GraphicsWindow.DrawLine(SunX - 14, SunY - 14, SunX + 14, SunY + 14)
GraphicsWindow.DrawLine(SunX - 14, SunY + 14, SunX + 14 , SunY - 14)

GraphicsWindow.DrawLine(SunX - 8, SunY - 18, SunX + 8, SunY + 18)
GraphicsWindow.DrawLine(SunX - 8, SunY + 18, SunX + 8 , SunY - 18)
GraphicsWindow.DrawLine(SunX - 18, SunY - 8, SunX + 18, SunY + 8)
GraphicsWindow.DrawLine(SunX - 18, SunY + 8, SunX + 18 , SunY - 8)

'mouth
If (SunMouth = "Smile") Then
GraphicsWindow.PenColor = "#000000"
GraphicsWindow.DrawLine(SunX -6, SunY +4, SunX -5, SunY +7)
GraphicsWindow.DrawLine(SunX -4, SunY +7, SunX +4, SunY +7)
GraphicsWindow.DrawLine(SunX +5, SunY +7, SunX +6, SunY +4)
Else
'O mouth
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillEllipse(SunX -3, SunY + 3, 6, 6)
EndIf

'eyes
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillEllipse(SunX -6, SunY -5, 3, 3)
GraphicsWindow.FillEllipse(SunX +4, SunY -5, 3, 3)
EndSub

'---------------------------------------------------------------------------
Sub Intro
'black background
GraphicsWindow.BackgroundColor = "#000000"

'display text
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "#FFFFFF"

'When a key is pressed fade the text to the background color
ColorDown = 100
For T = 1 To 9
GraphicsWindow.DrawText(MidScrX - 100, Y + 28, "Small Basic G O R I L L A S")
ColorDown = ColorDown - 10
String = "#" + ColorDown + ColorDown + ColorDown
GraphicsWindow.BrushColor = String
GraphicsWindow.DrawText(MidScrX - 220, Y + 56, "Your mission is to hit your opponent with the exploding")
GraphicsWindow.DrawText(MidScrX - 238, Y + 72, "banana by varing the angle and power of your throw, taking")
GraphicsWindow.DrawText(MidScrX - 215, Y + 88, "into account wind speed, gravity, and the city skyline.")
GraphicsWindow.DrawText(MidScrX - 245, Y + 104, "The wind speed is shown by a directional arrow at the bottom")
GraphicsWindow.DrawText(MidScrX - 210, Y + 120, "of the playing field, its length relative to its strength.")
GraphicsWindow.DrawText(MidScrX - 95, Y + 150, "To start, press any key")
If (T = 1) Then
BuildingInit()
DrawCity()
If (SoundOnOff = "On") Then
Sound.PlayAndWait(Path + "\computer_any_key.wav")
Endif
WaitForKeypress()
EndIf
Program.Delay(50)
EndFor
GraphicsWindow.Clear()
Options()
FadeIn()
EndSub

'---------------------------------------------------------------------------
Sub FadeIn
'fade in blue background
'background color should be black
For T = 1 To 15
HexColor = Text.GetSubText(HexaDecimal, T, 1) + "0"
String = "#0000" + HexColor
GraphicsWindow.BackgroundColor = String
Program.Delay(150)
EndFor
'we're not quite at the background color, just set it
GraphicsWindow.BackgroundColor = "#0000FF"
EndSub

'---------------------------------------------------------------------------
Sub UpdateGravityNumRounds
'clear old values
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillRectangle(X + 200, Y + 104, 170, 20)
GraphicsWindow.FillRectangle(X + 100, Y + 150, 270, 20)

'draw new values
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(X + 200, Y + 104, "Set Gravity (" + Gravity + ")")
GraphicsWindow.DrawText(X + 100, Y + 150, "Number of rounds to play (" + NumRounds + ")")
EndSub

'---------------------------------------------------------------------------
Sub DrawSoundButtons
'on
GraphicsWindow.DrawRectangle(380, 191, 50, 30)
If (SoundOnOff = "On") Then
GraphicsWindow.BrushColor = "#00FF00"
Else
GraphicsWindow.BrushColor = "#FFFFFF"
EndIf
GraphicsWindow.DrawText(393, 195, "On")

'off
GraphicsWindow.DrawRectangle(450, 191, 50, 30)
If (SoundOnOff = "Off") Then
GraphicsWindow.BrushColor = "#00FF00"
Else
GraphicsWindow.BrushColor = "#FFFFFF"
EndIf
GraphicsWindow.DrawText(462, 195, "Off")
EndSub

'---------------------------------------------------------------------------
Sub Options
'flag for mouseclicks
SetOptions = "True"

'print some options
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(X + 115, Y + 56, "Use the arrow buttons to change the value for each option.")
UpdateGravityNumRounds()
GraphicsWindow.DrawText(X + 280, Y + 195, "Sound")
GraphicsWindow.DrawText(X + 218, Y + 320, "Press ESC while playing to exit.")
GraphicsWindow.DrawText(X + 130, Y + 370, "Sound files - wavsource.com - shockwave-sound.com")
GraphicsWindow.DrawText(X + 220, Y + 420, "Press any key to begin playing.")

'draw boxes and arrows
GraphicsWindow.PenColor = "#FFFFFF"
GraphicsWindow.DrawRectangle(380, 99, 50, 30)
GraphicsWindow.DrawTriangle(405, 104, 425, 124, 385, 124)

GraphicsWindow.DrawRectangle(450, 99, 50, 30)
GraphicsWindow.DrawTriangle(475, 124, 455, 104, 495, 104)

GraphicsWindow.DrawRectangle(380, 145, 50, 30)
GraphicsWindow.DrawTriangle(405, 149, 425, 170, 385, 170)

GraphicsWindow.DrawRectangle(450, 145, 50, 30)
GraphicsWindow.DrawTriangle(475, 170, 455, 149, 495, 149)

'draw boxes for sound
DrawSoundButtons()
WaitForKeypress()
GraphicsWindow.Clear()
SetOptions = "False"
EndSub

'---------------------------------------------------------------------------
Sub UpdateAngleVelocity
If (Thrower = 1) Then
If (GetNumberVariable = "Angle") Then
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillRectangle(70, 40, 55, 20)
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(70, 40, UserNumber)
Else
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillRectangle(90, 60, 35, 20)
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(90, 60, UserNumber)
EndIf
Else
If (GetNumberVariable = "Angle") Then
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillRectangle(ScrX - 70, 40, 55, 20)
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(ScrX - 70, 40, UserNumber)
Else
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.FillRectangle(ScrX - 50, 60, 35, 20)
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(ScrX - 50, 60, UserNumber)
EndIf
EndIf
EndSub

'---------------------------------------------------------------------------
Sub GetNumber
'set oldkey variable to "" to allow input from user
Key = ""
'reset usernumber to avoid errors
UserNumber = 0
While (Key <> "RETURN")
WaitForKeypress()
If (Key = "D0" Or Key = "NUMPAD0") Then
UserNumber = UserNumber * 10 + 0
ElseIf (Key = "D1" Or Key = "NUMPAD1") Then
UserNumber = UserNumber * 10 + 1
ElseIf (Key = "D2" Or Key = "NUMPAD2") Then
UserNumber = UserNumber * 10 + 2
ElseIf (Key = "D3" Or Key = "NUMPAD3") Then
UserNumber = UserNumber * 10 + 3
ElseIf (Key = "D4" Or Key = "NUMPAD4") Then
UserNumber = UserNumber * 10 + 4
ElseIf (Key = "D5" Or Key = "NUMPAD5") Then
UserNumber = UserNumber * 10 + 5
ElseIf (Key = "D6" Or Key = "NUMPAD6") Then
UserNumber = UserNumber * 10 + 6
ElseIf (Key = "D7" Or Key = "NUMPAD7") Then
UserNumber = UserNumber * 10 + 7
ElseIf (Key = "D8" Or Key = "NUMPAD8") Then
UserNumber = UserNumber * 10 + 8
ElseIf (Key = "D9" Or Key = "NUMPAD9") Then
UserNumber = UserNumber * 10 + 9
ElseIf (Key = "S") Then
ToggleSound()
ElseIf (Key = "ESCAPE") Then
ConfirmQuit()
ElseIf (Key = "BACK") Then
UserNumber = Math.Floor(UserNumber / 10)
EndIf
UpdateAngleVelocity()
EndWhile
If (GetNumberVariable = "Angle") Then
Angle = UserNumber
ElseIf (GetNumberVariable = "Velocity") Then
Velocity = UserNumber
EndIf
EndSub

'---------------------------------------------------------------------------
Sub GetInputT
'get inputs from textwindow --- used prior to getnumber code -- no longer used
TextWindow.WriteLine("Player " + Thrower + ":")
TextWindow.Write("Angle> ")
Angle = TextWindow.ReadNumber()
TextWindow.Write("Velocity> ")
Velocity = TextWindow.ReadNumber()
TextWindow.WriteLine("")
EndSub

'---------------------------------------------------------------------------
Sub GetInput
'draw a box above the gorilla who is throwing
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.PenColor = "RoyalBlue"
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(10, 15, 120, 72)
GraphicsWindow.DrawRectangle(10, 15, 120, 72)
Else
GraphicsWindow.FillRectangle(ScrX - 130, 15, 120, 72)
GraphicsWindow.drawRectangle(ScrX - 130, 15, 120, 72)
EndIf

GraphicsWindow.BrushColor = "#FFFFFF"
If (Thrower = 1) Then
GraphicsWindow.DrawText(16, 20, "Player 1")
GraphicsWindow.DrawText(16, 40, "Angle:")
GetNumberVariable = "Angle"
GetNumber()
GraphicsWindow.DrawText(70, 40, Angle)
GraphicsWindow.DrawText(16, 60, "Velocity:")
GetNumberVariable = "Velocity"
GetNumber()
GraphicsWindow.DrawText(90, 60, Velocity)
Else
GraphicsWindow.DrawText(ScrX - 124, 20, "Player 2")
GraphicsWindow.DrawText(ScrX - 124, 40, "Angle:")
GetNumberVariable = "Angle"
GetNumber()
GraphicsWindow.DrawText(ScrX - 70, 40, Angle)
GraphicsWindow.DrawText(ScrX - 124, 60, "Velocity:")
GetNumberVariable = "Velocity"
GetNumber()
GraphicsWindow.DrawText(ScrX - 50, 60, Velocity)
EndIf
Program.Delay(500)
GraphicsWindow.BrushColor = "#0000FF"
If (Thrower = 1) Then
GraphicsWindow.FillRectangle(9, 14, 122, 74)
Else
GraphicsWindow.FillRectangle(ScrX - 131, 14, 122, 74)
EndIf
EndSub

'---------------------------------------------------------------------------
Sub MoveShot
RadianAngle = Math.GetRadians(Angle)
InitXVel = Math.Round(Math.Cos(RadianAngle) * Velocity)
InitYVel = Math.Round(Math.Sin(RadianAngle) * Velocity)
If (Thrower = 1) Then
BananaStartX = G1X + GorillaWidth / 2
BananaStartY = G1Y - GorillaHeight - 15
Else
BananaStartX = G2X + GorillaWidth / 2
BananaStartY = G2Y - GorillaHeight - 15
EndIf
BananaX = Math.Round(BananaStartX + (InitXVel * T) + (0.5 * (Wind / 5) * (T *T)))
BananaY = Math.Round(BananaStartY + ((-1 * (InitYVel * T)) + (0.5 * Gravity * (T *T)) + (ScrY / 35 )))
If (BananaY < 1) Then
BananaY = 0
EndIf
EndSub

'---------------------------------------------------------------------------
Sub DoShot
'GetInputT() 'old subroutine to accept input from a text window
GetInput()

'change gorilla 2 angle so its throw goes left and not right
If (Thrower = 2) Then
Angle = 90 + (90 - Angle)
EndIf
OnScreen = "True"
WhatWasHit = "Nothing"
'time variable used in MoveShot()
T = 0.0
'Draw the Gorilla Throwing the Banana
If (Thrower = 1 ) Then
GraphicsWindow.DrawImage(GorillaRightUp, G1X, G1Y)
Else
GraphicsWindow.DrawImage(GorillaLeftUp, G2X, G2Y)
EndIf
Program.Delay(500)
'draw both gorillas with arms down
GraphicsWindow.DrawImage(GorillaArmsDown, G1X, G1Y)
GraphicsWindow.DrawImage(GorillaArmsDown, G2X, G2Y)
' loop until we hit something or go off screen(left, right)
While (WhatWasHit = "Nothing")
'erase the old banana before we move it to a new position
If (OnScreen = "True") Then
EraseBanana()
EndIf
'advance time
T = T + 0.1
'move the banana to a new position
MoveShot()
'did we go off screen left or right
If (BananaX < 10 Or BananaX > ScrX - 10) Then
WhatWasHit = "OutOfBounds"
OnScreen = "False"
Goto ContactMade
EndIf
'did we throw the banana too high
If (BananaY < 10) Then
OnScreen = "False"
Else
OnScreen = "True"
EndIf

'is the banana below the groundlevel
If (BananaY > GroundLevel) Then
WhatWasHit = "OutOfBounds"
OnScreen = "False"
EndIf

'if banana is not too high, draw it
If (OnScreen = "True" And BananaY >= 20) Then
DrawBanana()
EndIf

'delay the program to see the banana movement
Program.Delay(15)

'check if banana is onscreen and goto Offscreen label if it is not to avoid targetinvocation errors
If (OnScreen = "False") Then
Goto OffScreen
EndIf

'check for collisions

'did we hit the sun
BananaUnderSun = "False"
'SunHit <> "True" And
If (BananaX >= SunX - 25 And BananaX <= SunX + 25 And BananaY >= SunY - 25 And BananaY <= SunY + 25) Then
If (SunMouth = "Smile" And SoundOnOff = "On") Then
Sound.Play(Path + "\ouch.wav")
Endif
'the sun is shocked it got hit
SunMouth = "O"
'DoSun() 'Sun is redrawn in erasebanana subroutine
SunHit = "True"

BananaUnderSun = "True"
'contact made, but continue
'Goto ContactMade
EndIf

'did we hit a gorilla
'g1 location
If (BananaX + BananaSize >= G1X And BananaX - BananaSize <= G1X + GorillaWidth And BananaY + BananaSize >= G1Y And BananaY - BananaSize <= G1Y + GorillaHeight) Then
'if g2 hit g1 or g1 hit itself - g2 scores point
WhatWasHit = "Gorilla1"
GorillaHit = "True"
Dancer = 2
EraseBanana()
'center the explosion on the gorilla
BananaX = G1X + GorillaWidth / 3 - 1
BananaY = G1Y + GorillaHeight / 2
DoExplosion()
G2Score = G2Score + 1
VictoryDance()
Goto ContactMade
EndIf

'g2 location
If (BananaX + BananaSize >= G2X And BananaX - BananaSize <= G2X + GorillaWidth / 2 And BananaY + BananaSize >= G2Y And BananaY - BananaSize <= G2Y + GorillaHeight / 2) Then
'if g1 hit g2 or g2 hit itself - g1 scores point
WhatWasHit = "Gorilla2"
GorillaHit = "True"
Dancer = 1
EraseBanana()
'center the explosion on the gorilla
BananaX = G2X + GorillaWidth / 2
BananaY = G2Y + GorillaHeight / 2
DoExplosion()
G1Score = G1Score + 1
VictoryDance()
Goto ContactMade
EndIf

'did we hit anything else - ground, building
'Grab the colors under banana and check for colors that will cause the banana to explode
'BananaPX1, BananaPY1, BananaPX2, BananaPY2 are used to capture a square directly under the banana, otherwise the bounding box would give false positives
If (BananaState = 1) Then
BananaPX1 = 0
BananaPY1 = -4
BananaPX2 = 5
BananaPY2 = 7
EndIf
If (BananaState = 2) Then
BananaPX1 = -4
BananaPY1 = 0
BananaPX2 = 7
BananaPY2 = -5
EndIf
If (BananaState = 3) Then
BananaPX1 = -2
BananaPY1 = -4
BananaPX2 = 3
BananaPY2 = 7
EndIf
If (BananaState = 4) Then
BananaPX1 = -4
BananaPY1 = -2
BananaPX2 = 7
BananaPY2 = 3
EndIf
For GUY = BananaY + BananaPY1 To BananaY + BananaPY2
For GUX = BananaX + BananaPX1 To BananaX + BananaPX2
CheckColor = GraphicsWindow.GetPixel(GUX, GUY)
If (CheckColor = "#00FFFF" Or CheckColor = "#CD5C5C" Or CheckColor = "#00FF7F" Or CheckColor = "#4169E1" Or CheckColor = "#F0E68C") Then
WhatWasHit = "Object"
DoMiniExplosion()
If (CheckColor = "Khaki" Or CheckColor = "Grey") Then
'shatter glass
ShatterGlass = "True"
EndIf
Goto ContactMade
EndIf
EndFor
EndFor
OffScreen:
EndWhile
ContactMade:
Sound.Stop(Path + "\ouch.wav")
EndSub

'---------------------------------------------------------------------------
Sub PlayGame
'don't always let player 1 throw first
Thrower = Math.GetRandomNumber(2)
G1Score = 0
G2Score = 0
For NR = 1 To NumRounds
GraphicsWindow.Clear()
RoundInit()
DrawCity()
DrawGorillas()
SunMouth = "Smile"
DoSun()
UpdateScore()
GorillaHit = "False"
While (GorillaHit = "False")
'since 3 - 1 = 2 and 3 - 2 = 1, this will swap the thrower and target
Thrower = 3 - Thrower
TargetGorilla = 3 - Thrower

DoShot()

'if the sun was hit on the previous shot reset to smile
'if sunhit then dosunhappy
If (SunMouth = "O") Then
SunMouth = "Smile"
SunHit = "False"
DoSun()
EndIf
EndWhile
EndFor
'wait a second before we clear the screen (in dogameover)
Program.Delay(1000)
DoGameOver()
EndSub

'---------------------------------------------------------------------------
Sub UpdateScore
GraphicsWindow.FontSize = 12
GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(20, ScrY - 17, "Player 1")
GraphicsWindow.DrawText(Scrx - 70, ScrY - 17, "Player 2")
'drawtext score
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "#0000FF"
GraphicsWindow.FillRectangle(MidScrX - 55, ScrY - 60, 125, 20)
GraphicsWindow.PenColor = "#4169E1"
GraphicsWindow.DrawRectangle(MidScrX - 55, ScrY - 60, 125, 20)
GraphicsWindow.BrushColor = "#FFFFFF"
ScoreLength = Text.GetLength(G1Score + "> Score <" + G2Score)
GraphicsWindow.DrawText(MidScrX - (ScoreLength * 4.5) + 5, ScrY - 60, G1Score + "> Score <" + G2Score)
EndSub

'---------------------------------------------------------------------------
Sub VictoryDance

UpdateScore()

'Dancer = who does victory dance
If (Dancer = 1) Then
VX = G1X
VY = G1Y
Else
VX = G2X
VY = G2Y
EndIf
If (SoundOnOff = "On") Then
Sound.Play(Path + "\monkey2.wav")
EndIf
For VD = 1 To 6
GraphicsWindow.DrawImage(GorillaLeftUp, VX, VY)
Program.Delay(200)
GraphicsWindow.DrawImage(GorillaRightUp, VX, VY)
Program.Delay(200)
EndFor
Sound.Stop(Path + "\monkey2.wav")
EndSub

'---------------------------------------------------------------------------
Sub DoGameOver

If (Key <> "Y" And SoundOnOff = "On") Then
Sound.Play(Path + "\multi_ending.wav")
EndIf

'clear screen to blue
GraphicsWindow.BackgroundColor = "#0000FF"
GraphicsWindow.Clear()

'set gameover to 1, so that when we redraw the city, all the buildings are the same height
GameOver = 1
BuildingInit()
DrawCity()

'place gorillas
G1X = MidScrX - 100
G2X = MidScrX + 100
G1Y = MidScrY + 5
G2Y = MidScrY + 5

'both gorillas arms down
Throwing = 0
DrawGorillas()

'announce a winner
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "#FFFFFF"

GraphicsWindow.DrawText(MidScrX - 60, MidScrY - 100, "And the Winner is...")
Program.Delay(1500)
If (G1Score > G2Score) Then
GraphicsWindow.DrawText(MidScrX - 35, MidScrY - 75, "Player One!")
Throwing = 3
EndIf
If (G1Score < G2Score) Then
GraphicsWindow.DrawText(MidScrX - 34, MidScrY - 80, "Player Two!")
Throwing = 4
EndIf
If (G1Score = G2Score) Then
GraphicsWindow.DrawText(MidScrX - 30, MidScrY - 80, "Its a Tie!!")
Throwing = 5
EndIf
'draw the victorious gorilla
DrawGorillas()
If (SoundOnOff = "On") Then
Program.Delay(2000)
Sound.Stop(Path + "\multi_ending.wav")
Sound.Play(Path + "\monkey2.wav")
EndIf

Program.Delay(1500)
GraphicsWindow.DrawText(MidScrX - 34, MidScrY - 40, "Game Over")
Program.Delay(1500)
GraphicsWindow.DrawText(MidScrX - 75, MidScrY - 20, "Press any key to exit")
Sound.Stop(Path + "\monkey2.wav")
WaitForKeypress()

Program.End()
EndSub

'---------------------------------------------------------------------------
Sub ToggleSound
If (SoundOnOff = "On") Then
SoundOnOff = "Off"
Else
SoundOnOff = "On"
EndIf

'announce change
'GraphicsWindow.BrushColor = "#000000"
'GraphicsWindow.PenColor = "RoyalBlue"

'GraphicsWindow.FillRectangle(MidScrX - 50, 80, 100, 20)
'GraphicsWindow.DrawRectangle(MidScrX - 50, 80, 100, 20)

'GraphicsWindow.BrushColor = "#FFFFFF"
'GraphicsWindow.DrawText(MidScrX - 40, 80, "Sound " + SoundOnOff)

'erase box and continue playing
'GraphicsWindow.BrushColor = GraphicsWindow.BackgroundColor
'make a box slightly bigger to erase question
'GraphicsWindow.FillRectangle(MidScrX - 51, 79, 102, 22)

EndSub

'---------------------------------------------------------------------------
Sub ConfirmQuit

'ask user to confirm they want to quit

'display question just under sun so we don't mess up any other graphics
GraphicsWindow.BrushColor = "#000000"
GraphicsWindow.PenColor = "RoyalBlue"

GraphicsWindow.FillRectangle(MidScrX - 100, 80, 200, 40)
GraphicsWindow.DrawRectangle(MidScrX - 100, 80, 200, 40)

GraphicsWindow.BrushColor = "#FFFFFF"
GraphicsWindow.DrawText(MidScrX - 20, 80, "Quit")
GraphicsWindow.DrawText(MidScrX - 75, 100, "Are you sure? Y/N")
If (SoundOnOff = "On") Then
'Sound.PlayAndWait(Path + "\homerquit.wav")
Sound.Play(Path + "\homerquit.wav")
Program.Delay(1)
EndIf
WaitForKeypress()
If (Key = "Y") Then
DoGameOver()
Else
'erase box and continue playing
GraphicsWindow.BrushColor = GraphicsWindow.BackgroundColor
'make a box slightly bigger to erase question
GraphicsWindow.FillRectangle(MidScrX - 101, 79, 202, 42)
EndIf
Sound.Stop(Path + "\homerquit.wav")
EndSub

'---------------------------------------------------------------------------
Sub Rect
'takes variable mousebox containing four arguements, left top right & bottom (in string format "################" - 4 four digit numbers together)
'and sets status variable mouseinside to true if mousex and mousey are inside
If (Text.GetLength(MouseBox) = 16) Then
Left = Text.GetSubText(MouseBox,1,4)
Top = Text.GetSubText(MouseBox,5,4)
Right = Text.GetSubText(MouseBox,9,4)
Bottom = Text.GetSubText(MouseBox,13,4)

If (MouseX >= Left And MouseY >= Top And MouseX <= Right And MouseY <= Bottom) Then
MouseInside = "True"
Else
MouseInside = "False"
EndIf
Else
'mousebox string incorrect length
MouseInside = "False"
EndIf
EndSub

'---------------------------------------------------------------------------
Sub OnMouseDown
If (SetOptions = "True") Then
MouseX = GraphicsWindow.MouseX
MouseY = GraphicsWindow.MouseY
'gravity up .1
MouseBox = "0380009904300129"
Rect()
If (MouseInside = "True") Then
Gravity = Gravity + 0.1
EndIf
'gravity down .1
MouseBox = "0450009905000129"
Rect()
If (MouseInside = "True" And Gravity > 0.1) Then
Gravity = Gravity - 0.1
EndIf
'number of rounds up 1
MouseBox = "0380014504300175"
Rect()
If (MouseInside = "True" And NumRounds < 18) Then
NumRounds = NumRounds + 1
EndIf
'number of rounds down 1
MouseBox = "0450014505000175"
Rect()
If (MouseInside = "True" And NumRounds > 1) Then
NumRounds = NumRounds - 1
EndIf
'sound on
MouseBox = "0380019104300221"
Rect()
If (MouseInside = "True") Then
SoundOnOff = "On"
EndIf
'sound off
MouseBox = "0450019105000221"
Rect()
If (MouseInside = "True") Then
SoundOnOff = "Off"
EndIf
DrawSoundButtons()
UpdateGravityNumRounds()
EndIf
EndSub

'---------------------------------------------------------------------------
Sub WaitForKeypress
'wait for the user to press a key
WaitingForKeypress = "Yes"
While (WaitingForKeypress = "Yes")
'do nothing
'the checkkey subroutine will change waitingforkeypress to "no" when an event is triggered
EndWhile
EndSub

'---------------------------------------------------------------------------
Sub DoKeyDown
Key = GraphicsWindow.LastKey
'in case a user has caps lock on
Key = Text.ConvertToUpperCase(Key)
If (WaitingForKeypress = "Yes") Then
WaitingForKeypress = "No"
Else
'the sound can be changed at any time
If (Key = "S") Then
ToggleSound()
EndIf
EndIf
EndSub