Microsoft Small Basic
Program Listing:
Embed this in your website
<object id='sbapp' data='data:application/x-silverlight-2,' type='application/x-silverlight-2' width='640' height='480'> <param name='source' value='http://smallbasic.com/program/ClientBin/SBWeb.xap'/> <param name='onError' value='onSilverlightError' /> <param name='background' value='white' /> <param name='minRuntimeVersion' value='3.0.40624.0' /> <param name='autoUpgrade' value='true' /> <param name='initParams' value='programId=MLK734' /> </object>
'Tank Rampage
'Copyright (c) 2012
'Art by Timo Sö; Programming by Math Man
Initialize
(
)
TankData
(
)
TowerData
(
)
LevelData
(
)
ToolBar
(
)
Sub
OnTick
For
h
=
1
To
Amount_Tanks
+
3
tX
[
h
]
=
tX
[
h
]
+
tSpeed
[
h
]
If
tX
[
h
]
+
35
>
Width
Then
tTank
[
h
]
=
tTank
[
Amount_Tanks
]
tX
[
h
]
=
tX
[
Amount_Tanks
]
tY
[
h
]
=
tY
[
Amount_Tanks
]
tType
[
h
]
=
tType
[
Amount_Tanks
]
tHP
[
h
]
=
tHP
[
Amount_Tanks
]
tSpeed
[
h
]
=
tSpeed
[
Amount_Tanks
]
tMoney
[
h
]
=
tMoney
[
Amount_Tanks
]
tTank
[
Amount_Tanks
]
=
""
tX
[
Amount_Tanks
]
=
""
tY
[
Amount_Tanks
]
=
""
tType
[
Amount_Tanks
]
=
""
tHP
[
Amount_Tanks
]
=
""
tSpeed
[
Amount_Tanks
]
=
""
tMoney
[
Amount_Tanks
]
=
""
Amount_Tanks
=
Amount_Tanks
-
1
For
o
=
1
To
index
If
aTarget
[
o
]
=
Target
Then
aTarget
[
o
]
=
""
notFiring
[
o
]
=
"True"
Shapes
.
Remove
(
aAmmo
[
o
]
)
EndIf
EndFor
Lives
=
Lives
-
1
Hearts
=
""
For
i
=
1
To
Lives
Hearts
=
Hearts
+
"♥ "
EndFor
Shapes
.
SetText
(
txtLives
,
"Your lives:"
+
Text
.
GetCharacter
(
10
)
+
Hearts
)
If
Lives
<=
0
Then
GraphicsWindow
.
ShowMessage
(
"You have been shot down by tanks!"
,
"GAME OVER!"
)
Program
.
End
(
)
EndIf
EndIf
Shapes
.
Move
(
tTank
[
h
]
,
tX
[
h
]
,
tY
[
h
]
)
EndFor
For
h
=
1
To
index
If
notFiring
[
h
]
Then
notFiring
[
h
]
=
"False"
DetermineTarget
(
)
DetermineAngle
(
)
If
Target
<>
""
Then
GraphicsWindow
.
BrushColor
=
GraphicsWindow
.
GetRandomColor
(
)
GraphicsWindow
.
PenColor
=
GraphicsWindow
.
BrushColor
aAmmo
[
h
]
=
Shapes
.
AddEllipse
(
8
,
8
)
Shapes
.
SetOpacity
(
aAmmo
[
h
]
,
60
)
aTarget
[
h
]
=
Target
aX
[
h
]
=
twX
[
h
]
aY
[
h
]
=
twY
[
h
]
aAngle
[
h
]
=
angle
aDist
[
h
]
=
0
EndIf
EndIf
Target
=
aTarget
[
h
]
DetermineAngle
(
)
aAngle
[
h
]
=
angle
aDist
[
h
]
=
aDist
[
h
]
+
twSpeed
[
h
]
aX
[
h
]
=
aX
[
h
]
+
Math
.
Cos
(
aAngle
[
h
]
)
*
1
/
5
*
twSpeed
[
h
]
aY
[
h
]
=
aY
[
h
]
+
Math
.
Sin
(
aAngle
[
h
]
)
*
1
/
5
*
twSpeed
[
h
]
Shapes
.
Move
(
aAmmo
[
h
]
,
aX
[
h
]
-
4
,
aY
[
h
]
-
4
)
If
aDist
[
h
]
>
twRange
[
h
]
Then
notFiring
[
h
]
=
"True"
Shapes
.
Remove
(
aAmmo
[
h
]
)
EndIf
If
aY
[
h
]
-
tY
[
Target
]
<
20
And
aY
[
h
]
-
tY
[
Target
]
>
-
20
And
aX
[
h
]
-
tX
[
Target
]
<
20
And
aX
[
h
]
-
tX
[
Target
]
>
-
20
Then
tHP
[
Target
]
=
tHP
[
Target
]
-
(
twDamage
[
h
]
-
tArmor
[
Target
]
)
notFiring
[
h
]
=
"True"
Shapes
.
Remove
(
aAmmo
[
h
]
)
If
twType
[
h
]
=
3
Then
tSpeed
[
Target
]
=
tSpeed
[
Target
]
/
2
EndIf
If
tHP
[
Target
]
<=
0
Then
aTarget
[
h
]
=
""
Shapes
.
Remove
(
tTank
[
Target
]
)
Money
=
Money
+
tMoney
[
Target
]
tTank
[
Target
]
=
tTank
[
Amount_Tanks
]
tX
[
Target
]
=
tX
[
Amount_Tanks
]
tY
[
Target
]
=
tY
[
Amount_Tanks
]
tType
[
Target
]
=
tType
[
Amount_Tanks
]
tHP
[
Target
]
=
tHP
[
Amount_Tanks
]
tSpeed
[
Target
]
=
tSpeed
[
Amount_Tanks
]
tMoney
[
Target
]
=
tMoney
[
Amount_Tanks
]
tTank
[
Amount_Tanks
]
=
""
tX
[
Amount_Tanks
]
=
""
tY
[
Amount_Tanks
]
=
""
tType
[
Amount_Tanks
]
=
""
tHP
[
Amount_Tanks
]
=
""
tSpeed
[
Amount_Tanks
]
=
""
tMoney
[
Amount_Tanks
]
=
""
Amount_Tanks
=
Amount_Tanks
-
1
Shapes
.
SetText
(
txtMoney
,
"Your money:"
+
Text
.
GetCharacter
(
10
)
+
" $ "
+
Money
)
For
o
=
1
To
index
If
aTarget
[
o
]
=
Target
Then
aTarget
[
o
]
=
""
notFiring
[
o
]
=
"True"
Shapes
.
Remove
(
aAmmo
[
o
]
)
EndIf
EndFor
EndIf
EndIf
EndFor
EndSub
Sub
Initialize
Amount_Tanks
=
0
GraphicsWindow
.
CanResize
=
0
Width
=
GraphicsWindow
.
Width
Height
=
GraphicsWindow
.
Height
GraphicsWindow
.
BrushColor
=
"DarkGray"
GraphicsWindow
.
PenColor
=
"DarkGray"
Road
=
Shapes
.
AddRectangle
(
Width
,
45
)
Shapes
.
Move
(
Road
,
0
,
Height
/
2
-
22
)
GraphicsWindow
.
BackgroundColor
=
"Green"
GraphicsWindow
.
Title
=
"Tank Rampage"
GraphicsWindow
.
MouseMove
=
MouseMove
GraphicsWindow
.
MouseUp
=
MouseUp
Controls
.
ButtonClicked
=
ButtonClick
GameInterval
=
30
OnTick
=
""
Money
=
550
GraphicsWindow
.
ShowMessage
(
"Welcome to Tank Rampage! It is a TD game that is simple."
+
Text
.
GetCharacter
(
10
)
+
"Grab towers from the right side."
+
Text
.
GetCharacter
(
10
)
+
"Press start when you're ready to start the rampage! "
,
"Tank Rampage"
)
Timer
.
Interval
=
GameInterval
Lives
=
5
EndSub
Sub
TowerData
Dir
=
Program
.
Directory
+
"\Pictures\"
For
i
=
1
To
3
TowerImage
[
i
]
=
ImageList
.
LoadImage
(
Dir
+
"Tower "
+
i
+
".gif"
)
EndFor
TowerDamage
[
1
]
=
35
TowerRange
[
1
]
=
250
TowerSpeed
[
1
]
=
60
TowerCost
[
1
]
=
250
TowerDamage
[
2
]
=
75
TowerRange
[
2
]
=
270
TowerSpeed
[
2
]
=
45
TowerCost
[
2
]
=
300
TowerDamage
[
3
]
=
0
TowerRange
[
3
]
=
270
TowerSpeed
[
3
]
=
40
TowerCost
[
3
]
=
350
TowerNum
=
Array
.
GetItemCount
(
TowerImage
)
EndSub
Sub
TankData
Dir
=
Program
.
Directory
+
"\Pictures\"
For
i
=
1
To
4
TankImage
[
i
]
=
ImageList
.
LoadImage
(
Dir
+
"Tank "
+
i
+
".gif"
)
EndFor
TankImage
[
5
]
=
ImageList
.
LoadImage
(
Dir
+
"Boss.gif"
)
TankSpeed
[
1
]
=
3
'speed he goes per about ?? milliseconds
TankHP
[
1
]
=
50
'hit points
TankArmor
[
1
]
=
1
'damage reduction
TankMoney
[
1
]
=
50
'money for killing
TankProb
[
1
]
=
35
'probability of it appearing in percent
TankSpeed
[
2
]
=
6
TankHP
[
2
]
=
20
TankArmor
[
2
]
=
1
TankMoney
[
2
]
=
40
TankProb
[
2
]
=
30
TankSpeed
[
3
]
=
3
TankHP
[
3
]
=
70
TankArmor
[
3
]
=
2
TankMoney
[
3
]
=
80
TankProb
[
3
]
=
20
TankSpeed
[
4
]
=
5
TankHP
[
4
]
=
80
TankArmor
[
4
]
=
3
TankMoney
[
4
]
=
140
TankProb
[
4
]
=
15
TankSpeed
[
5
]
=
4
TankHP
[
5
]
=
200
TankArmor
[
5
]
=
4
TankMoney
[
5
]
=
450
TankProb
[
5
]
=
0
EndSub
Sub
LevelData
For
i
=
1
To
50
Level_AmountTanks
[
i
]
=
Math
.
Power
(
i
*
2
,
2
)
EndFor
EndSub
Sub
ToolBar
GraphicsWindow
.
Width
=
Width
+
100
GraphicsWindow
.
BrushColor
=
"LightGray"
GraphicsWindow
.
PenColor
=
"LightGray"
Bar
=
Shapes
.
AddRectangle
(
100
,
Height
)
Shapes
.
Move
(
Bar
,
Width
,
0
)
GraphicsWindow
.
BrushColor
=
"Gray"
GraphicsWindow
.
PenColor
=
"Gray"
txtMoney
=
Shapes
.
AddText
(
"Your money:"
+
Text
.
GetCharacter
(
10
)
+
" $ "
+
Money
)
Hearts
=
""
For
i
=
1
To
Lives
Hearts
=
Hearts
+
"♥ "
EndFor
txtLives
=
Shapes
.
AddText
(
"Your lives:"
+
Text
.
GetCharacter
(
10
)
+
Hearts
)
Shapes
.
Move
(
txtMoney
,
Width
+
20
,
10
)
Shapes
.
Move
(
txtLives
,
Width
+
20
,
50
)
For
i
=
1
To
TowerNum
BackSquare
[
i
]
=
Shapes
.
AddRectangle
(
30
,
30
)
Icon
[
i
]
=
Shapes
.
AddImage
(
TowerImage
[
i
]
)
CostDisplay
[
i
]
=
Shapes
.
AddText
(
"$ "
+
TowerCost
[
i
]
)
Shapes
.
Move
(
BackSquare
[
i
]
,
Width
+
50
-
15
,
i
*
80
)
Shapes
.
Move
(
Icon
[
i
]
,
Width
+
50
-
13
,
i
*
80
+
3
)
Shapes
.
Move
(
CostDisplay
[
i
]
,
Width
+
50
-
25
,
i
*
80
+
40
)
Shapes
.
SetOpacity
(
BackSquare
[
i
]
,
20
)
EndFor
btnStart
=
Controls
.
AddButton
(
"Start!"
,
Width
+
50
-
30
,
i
*
80
+
30
)
btnPause
=
Controls
.
AddButton
(
"Pause"
,
Width
+
50
-
30
,
i
*
80
+
60
)
EndSub
Sub
StartTanksComing
Lives
=
Lives
+
1
Hearts
=
""
For
i
=
1
To
Lives
Hearts
=
Hearts
+
"♥ "
EndFor
Shapes
.
SetText
(
txtLives
,
"Your lives:"
+
Text
.
GetCharacter
(
10
)
+
Hearts
)
LevelNum
=
LevelNum
+
1
For
g
=
1
To
Level_AmountTanks
[
LevelNum
]
NumOfTank
=
Math
.
GetRandomNumber
(
100
)
If
NumOfTank
<=
TankProb
[
1
]
Then
nowTank
=
1
ElseIf
NumOfTank
<=
TankProb
[
2
]
+
TankProb
[
1
]
Then
nowTank
=
2
ElseIf
NumOfTank
<=
TankProb
[
3
]
+
TankProb
[
2
]
+
TankProb
[
1
]
Then
nowTank
=
3
ElseIf
NumOfTank
<=
TankProb
[
4
]
+
TankProb
[
3
]
+
TankProb
[
2
]
+
TankProb
[
1
]
Then
nowTank
=
4
EndIf
tTank
[
g
]
=
Shapes
.
AddImage
(
TankImage
[
nowTank
]
)
tX
[
g
]
=
-
g
*
80
tY
[
g
]
=
Height
/
2
-
20
+
Math
.
GetRandomNumber
(
20
)
tType
[
g
]
=
nowTank
tHP
[
g
]
=
TankHP
[
nowTank
]
tArmor
[
g
]
=
TankArmor
[
nowTank
]
tMoney
[
g
]
=
TankMoney
[
nowTank
]
tSpeed
[
g
]
=
TankSpeed
[
nowTank
]
Amount_Tanks
=
Amount_Tanks
+
1
EndFor
EndSub
Sub
MouseMove
MX
=
GraphicsWindow
.
MouseX
MY
=
GraphicsWindow
.
MouseY
If
waitingToBePlaced
Then
Shapes
.
Move
(
twTower
[
index
]
,
MX
-
13
,
MY
-
13
)
Else
For
q
=
1
To
TowerNum
If
MX
>
Width
+
50
-
15
And
MX
<
Width
+
50
+
15
And
MY
>
q
*
80
And
MY
<
q
*
80
+
30
Then
If
Money
>=
TowerCost
[
q
]
Then
Shapes
.
SetOpacity
(
BackSquare
[
q
]
,
90
)
Else
Shapes
.
SetOpacity
(
BackSquare
[
q
]
,
20
)
EndIf
Else
Shapes
.
SetOpacity
(
BackSquare
[
q
]
,
20
)
EndIf
EndFor
EndIf
EndSub
Sub
MouseUp
If
waitingToBePlaced
And
MY
<
Height
/
2
-
32
Or
MY
>
Height
/
2
+
32
Then
twX
[
index
]
=
MX
-
13
twY
[
index
]
=
MY
-
13
notFiring
[
index
]
=
"True"
waitingToBePlaced
=
"False"
Else
For
q
=
1
To
TowerNum
If
MX
>
Width
+
50
-
15
And
MX
<
Width
+
50
+
15
And
MY
>
q
*
80
And
MY
<
q
*
80
+
30
Then
If
Money
>=
TowerCost
[
q
]
Then
index
=
index
+
1
waitingToBePlaced
=
"True"
twTower
[
index
]
=
Shapes
.
AddImage
(
TowerImage
[
q
]
)
twType
[
index
]
=
q
twDamage
[
index
]
=
TowerDamage
[
q
]
twRange
[
index
]
=
TowerRange
[
q
]
twSpeed
[
index
]
=
TowerSpeed
[
q
]
Shapes
.
Move
(
twTower
[
index
]
,
MX
-
12
,
MY
-
12
)
Money
=
Money
-
TowerCost
[
q
]
Shapes
.
SetText
(
txtMoney
,
"Your money:"
+
Text
.
GetCharacter
(
10
)
+
" $ "
+
Money
)
EndIf
EndIf
EndFor
EndIf
EndSub
Sub
ButtonClick
Button
=
Controls
.
LastClickedButton
If
Button
=
btnStart
Then
Timer
.
Tick
=
OnTick
StartTanksComing
(
)
ElseIf
Button
=
btnPause
Then
Pause
(
)
ElseIf
Button
=
btnCancel
Then
Controls
.
Remove
(
btnCancel
)
Controls
.
Remove
(
btnNewSaveSlot
)
For
i
=
1
To
Array
.
GetItemCount
(
SavedGames
)
Controls
.
Remove
(
btnSaveGame
[
i
]
)
EndFor
Shapes
.
Remove
(
PauseScreen
)
Pause
(
)
ElseIf
Button
=
btnUnpause
Then
Timer
.
Tick
=
OnTick
Shapes
.
Remove
(
PauseScreen
)
Controls
.
Remove
(
btnUnpause
)
Controls
.
Remove
(
btnSaveGame
)
Controls
.
Remove
(
btnLoadGame
)
Controls
.
Remove
(
btnQuit
)
ElseIf
Button
=
btnSaveGame
Then
SaveGame
(
)
ElseIf
Array
.
ContainsValue
(
btnSaveGame
,
Button
)
Then
OverwriteFile
(
)
ElseIf
Button
=
btnNewSaveSlot
Then
AskForFileName
(
)
ElseIf
Button
=
btnLoadGame
Then
LoadGame
(
)
ElseIf
Array
.
ContainsValue
(
btnLoadGame
,
Button
)
Then
LoadFile
(
)
ElseIf
Button
=
btnQuit
Then
Quit
(
)
EndIf
EndSub
Sub
Pause
Timer
.
Tick
=
Nothing
GraphicsWindow
.
BrushColor
=
"DarkGray"
GraphicsWindow
.
PenColor
=
"Gray"
temp
=
GraphicsWindow
.
FontSize
GraphicsWindow
.
FontSize
=
50
Amount_Buttons
=
4
PauseScreen
=
Shapes
.
AddRectangle
(
Width
+
100
,
Height
)
btnUnpause
=
Controls
.
AddButton
(
"Resume"
,
10
,
10
)
Controls
.
SetSize
(
btnUnpause
,
Width
+
80
,
(
Height
-
20
)
/
Amount_Buttons
)
btnSaveGame
=
Controls
.
AddButton
(
"Save Game"
,
10
,
10
+
(
Height
-
20
)
/
Amount_Buttons
)
Controls
.
SetSize
(
btnSaveGame
,
Width
+
80
,
(
Height
-
20
)
/
Amount_Buttons
)
btnLoadGame
=
Controls
.
AddButton
(
"Load Game"
,
10
,
10
+
(
Height
-
20
)
/
Amount_Buttons
*
2
)
Controls
.
SetSize
(
btnLoadGame
,
Width
+
80
,
(
Height
-
20
)
/
Amount_Buttons
)
btnQuit
=
Controls
.
AddButton
(
"Quit"
,
10
,
10
+
(
Height
-
20
)
/
Amount_Buttons
*
3
)
Controls
.
SetSize
(
btnQuit
,
Width
+
80
,
(
Height
-
20
)
/
Amount_Buttons
)
GraphicsWindow
.
FontSize
=
temp
EndSub
Sub
SaveGame
Controls
.
Remove
(
btnUnpause
)
Controls
.
Remove
(
btnSaveGame
)
Controls
.
Remove
(
btnLoadGame
)
Controls
.
Remove
(
btnQuit
)
' The following line could be harmful and has been automatically commented.
' SavedGames = File.GetFiles(Program.Directory+"\Saved games\")
btnCancel
=
Controls
.
AddButton
(
"Cancel"
,
10
,
10
)
Controls
.
SetSize
(
btnCancel
,
Width
+
80
,
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
2
)
)
For
i
=
1
To
Array
.
GetItemCount
(
SavedGames
)
btnSaveGame
[
i
]
=
Controls
.
AddButton
(
Text
.
GetSubTextToEnd
(
Text
.
GetSubText
(
SavedGames
[
i
]
,
1
,
Text
.
GetLength
(
SavedGames
[
i
]
)
-
4
)
,
Text
.
GetLength
(
Program
.
Directory
+
"\Saved games\"
)
+
1
)
,
10
,
i
*
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
2
)
+
10
)
Controls
.
SetSize
(
btnSaveGame
[
i
]
,
Width
+
80
,
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
2
)
)
EndFor
btnNewSaveSlot
=
Controls
.
AddButton
(
"New save slot"
,
10
,
(
i
)
*
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
2
)
+
10
)
Controls
.
SetSize
(
btnNewSaveSlot
,
Width
+
80
,
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
2
)
)
EndSub
Sub
OverwriteFile
EndSub
Sub
AskForFileName
EndSub
Sub
LoadGame
Controls
.
Remove
(
btnUnpause
)
Controls
.
Remove
(
btnSaveGame
)
Controls
.
Remove
(
btnLoadGame
)
Controls
.
Remove
(
btnQuit
)
' The following line could be harmful and has been automatically commented.
' SavedGames = File.GetFiles(Program.Directory+"\Saved games\")
btnCancel
=
Controls
.
AddButton
(
"Cancel"
,
10
,
10
)
Controls
.
SetSize
(
btnCancel
,
Width
+
80
,
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
1
)
)
For
i
=
1
To
Array
.
GetItemCount
(
SavedGames
)
btnLoadGame
[
i
]
=
Controls
.
AddButton
(
Text
.
GetSubTextToEnd
(
Text
.
GetSubText
(
SavedGames
[
i
]
,
1
,
Text
.
GetLength
(
SavedGames
[
i
]
)
-
4
)
,
Text
.
GetLength
(
Program
.
Directory
+
"\Saved games\"
)
+
1
)
,
10
,
i
*
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
1
)
+
10
)
Controls
.
SetSize
(
btnLoadGame
[
i
]
,
Width
+
80
,
(
Height
-
20
)
/
(
Array
.
GetItemCount
(
SavedGames
)
+
1
)
)
EndFor
EndSub
Sub
LoadFile
EndSub
Sub
Nothing
EndSub
Sub
Quit
Program
.
End
(
)
EndSub
Sub
DetermineTarget
Target
=
""
Greatest
=
""
For
r
=
1
To
Amount_Tanks
If
tX
[
r
]
>
Greatest
And
Math
.
SquareRoot
(
Math
.
Power
(
tX
[
r
]
-
twX
[
h
]
,
2
)
+
Math
.
Power
(
tY
[
r
]
-
twY
[
h
]
,
2
)
)
<
twRange
[
h
]
Then
Greatest
=
tX
[
r
]
Target
=
r
EndIf
EndFor
If
Math
.
SquareRoot
(
Math
.
Power
(
tX
[
Target
]
-
twX
[
h
]
,
2
)
+
Math
.
Power
(
tY
[
Target
]
-
twY
[
h
]
,
2
)
)
>
twRange
[
h
]
Then
notFiring
[
h
]
=
"True"
EndIf
EndSub
Sub
DetermineAngle
dx
=
twX
[
h
]
-
tX
[
Target
]
dy
=
twY
[
h
]
-
tY
[
Target
]
If
(
dx
=
0
)
Then
angle
=
Math
.
Pi
/
2
If
(
dy
<
0
)
Then
angle
=
-
angle
EndIf
Else
angle
=
Math
.
ArcTan
(
dy
/
dx
)
EndIf
If
(
dx
<
0
)
Then
angle
=
angle
+
Math
.
Pi
EndIf
angle
=
angle
+
Math
.
Pi
EndSub
Copyright (c) Microsoft Corporation. All rights reserved.