Microsoft Small Basic

Program Listing: GRT732-1
' Bowling Anime
' Version 0.3
' Copyright © 2017 Nonki Takahashi. The MIT License.
' Last update 2017-03-08
' Program ID GRT732-1

GraphicsWindow.Title = "Bowling Anime 0.3 - Hit arrow keys."
Init()
path = "http://www.nonkit.com/smallbasic.files/Ball.png"
GraphicsWindow.KeyDown = OnKeyDown
While "True"
x = gw / 2
y = gh + 120
a = 120
DrawBall()
positioning = "True"
While positioning
If keyDown Then
If GraphicsWindow.LastKey = "Up" Then
positioning = "False"
ElseIf GraphicsWindow.LastKey = "Left" Then
If 0 <= x - 10 Then
x = x - 10
DrawBall()
EndIf
ElseIf GraphicsWindow.LastKey = "Right" Then
If x + 10 <= gw Then
x = x + 10
DrawBall()
EndIf
EndIf
keyDown = "False"
EndIf
EndWhile
x0 = x
For y = gh - 1 To 212 Step -1
x = (gw / 2) * (1 - y / gh) + x0 * y / gh
a = a - 2
DrawBall()
Program.Delay(10)
EndFor
For i = 1 To 10
If Math.Remainder(Math.GetRandomNumber(2), 2) = 0 Then
fell[i] = "True"
Else
fell[i] = "False"
EndIf
y0[i] = Shapes.GetTop(pin[i])
x0[i] = Shapes.GetLeft(pin[i])
x[i] = x0[i]
y[i] = y0[i]
a[i] = 0
EndFor
For t = 0 To 1000 Step 20
For i = 1 To 10
If fell[i] Then
x[i] = x[i] + dx[i]
y[i] = y[i] - 5
a[i] = a[i] + da[i]
Shapes.Move(pin[i], x[i], y[i])
Shapes.Rotate(pin[i], a[i])
EndIf
EndFor
Shapes.HideShape(pin[i])
Program.Delay(20)
EndFor
For i = 1 To 10
If fell[i] Then
Shapes.ShowShape(pin[i])
Shapes.Move(pin[i], x0[i], y0[i])
Shapes.Rotate(pin[i], 0)
EndIf
EndFor
EndWhile

Sub DrawBall
scale = y / 212
If shadow = "" Then
GraphicsWindow.BrushColor = "Black"
shadow = Shapes.AddEllipse(78, 20)
Shapes.SetOpacity(shadow, 50)
EndIf
Shapes.Move(shadow, x - 39, y - 10)
Shapes.Zoom(shadow, scale, scale)
If ball = "" Then
ball = Shapes.AddImage(path)
EndIf
Shapes.Move(ball, x - 39, y - 33 * scale - 39)
Shapes.Zoom(ball, scale, scale)
Shapes.Rotate(ball, a)
EndSub

Sub Init
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
da = "1=-10;2=-8;3=8;4=-6;5=-6;6=6;7=-4;8=-4;9=4;10=4;"
dx = "1=-3;2=-4;3=4;4=-5;5=-3;6=5;7=-5;8=-4;9=4;10=5;"
GraphicsWindow.BackgroundColor = "LightGray"
' draw gutter
GraphicsWindow.BrushColor = "SaddleBrown"
color = GraphicsWindow.BrushColor
rate = 0.5
Color_Blacken()
GraphicsWindow.BrushColor = color
GraphicsWindow.FillTriangle(gw / 2, 0, -70, gh, gw + 70, gh)
' draw lane
GraphicsWindow.BrushColor = "SaddleBrown"
GraphicsWindow.FillTriangle(gw / 2, 0, 0, gh, gw, gh)
GraphicsWindow.BrushColor = "LightGray"
GraphicsWindow.FillRectangle(0, 0, gw, 140)
GraphicsWindow.BrushColor = "Black"
path = "http://www.nonkit.com/smallbasic.files/Pin.png"
i = 6
d = 3
For row = 4 To 1 Step -1
y = 100 - row * 10
For col = 1 To row
i = i + 1
pin[i] = Shapes.AddImage(path)
x = 249 + col * 60 - row * 30
Shapes.Move(pin[i], x, y)
EndFor
i = i - row - d
d = d - 1
shadow = Shapes.AddRectangle(366, 160)
Shapes.SetOpacity(shadow, 15)
Shapes.Move(shadow, 116, 52)
EndFor
shadow = ""
' draw wall
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "GreenYellow"
wall = Shapes.AddRectangle(gw, 52)
Shapes.Move(wall, 0, 0)
wall = Shapes.AddRectangle(116,160)
Shapes.Move(wall, 0, 52)
wall = Shapes.AddRectangle(149, 160)
Shapes.Move(wall, gw - 116, 52)
EndSub

Sub OnKeyDown
keyDown = "True"
EndSub

Sub Color_Blacken
' Color | Blacken given color
' param color - given color
' param rate - 0..1
' return color - color blackened
Color_NameToColor()
Color_ColorToRGB()
r = Math.Floor(r * (1 - rate))
g = Math.Floor(g * (1 - rate))
b = Math.Floor(b * (1 - rate))
color = GraphicsWindow.GetColorFromRGB(r, g, b)
EndSub

Sub Color_ColorToRGB
' Color | Convert color to RGB values
' param color - "#rrggbb" (hexadecimal values)
' return r, g, b - RGB values 0..255
sR = Text.GetSubText(color, 2, 2)
sG = Text.GetSubText(color, 4, 2)
sB = Text.GetSubText(color, 6, 2)
hex = sR
Math_Hex2Dec()
r = dec
hex = sG
Math_Hex2Dec()
g = dec
hex = sB
Math_Hex2Dec()
b = dec
EndSub

Sub Color_NameToColor
' Color | Convert color name to color
' param color - color name
' returns color -"#rrggbb"
If Text.StartsWith(color, "#") Then
color = Text.ConvertToUpperCase(color)
Else
color = Text.ConvertToLowerCase(color)
color = colors[color]
EndIf
EndSub

Sub Colors_Init
colors["aliceblue"]="#F0F8FF"
colors["antiquewhite"]="#FAEBD7"
colors["aqua"]="#00FFFF"
colors["aquamarine"]="#7FFFD4"
colors["azure"]="#F0FFFF"
colors["beige"]="#F5F5DC"
colors["bisque"]="#FFE4C4"
colors["black"]="#000000"
colors["blanchedalmond"]="#FFEBCD"
colors["blue"]="#0000FF"
colors["blueviolet"]="#8A2BE2"
colors["brown"]="#A52A2A"
colors["burlywood"]="#DEB887"
colors["cadetblue"]="#5F9EA0"
colors["chartreuse"]="#7FFF00"
colors["chocolate"]="#D2691E"
colors["coral"]="#FF7F50"
colors["cornflowerblue"]="#6495ED"
colors["cornsilk"]="#FFF8DC"
colors["crimson"]="#DC143C"
colors["cyan"]="#00FFFF"
colors["darkblue"]="#00008B"
colors["darkcyan"]="#008B8B"
colors["darkgoldenrod"]="#B8860B"
colors["darkgray"]="#A9A9A9"
colors["darkgreen"]="#006400"
colors["darkkhaki"]="#BDB76B"
colors["darkmagenta"]="#8B008B"
colors["darkolivegreen"]="#556B2F"
colors["darkorange"]="#FF8C00"
colors["darkorchid"]="#9932CC"
colors["darkred"]="#8B0000"
colors["darksalmon"]="#E9967A"
colors["darkseagreen"]="#8FBC8F"
colors["darkslateblue"]="#483D8B"
colors["darkslategray"]="#2F4F4F"
colors["darkturquoise"]="#00CED1"
colors["darkviolet"]="#9400D3"
colors["deeppink"]="#FF1493"
colors["deepskyblue"]="#00BFFF"
colors["dimgray"]="#696969"
colors["dodgerblue"]="#1E90FF"
colors["firebrick"]="#B22222"
colors["floralwhite"]="#FFFAF0"
colors["forestgreen"]="#228B22"
colors["fuchsia"]="#FF00FF"
colors["gainsboro"]="#DCDCDC"
colors["ghostwhite"]="#F8F8FF"
colors["gold"]="#FFD700"
colors["goldenrod"]="#DAA520"
colors["gray"]="#808080"
colors["green"]="#008000"
colors["greenyellow"]="#ADFF2F"
colors["honeydew"]="#F0FFF0"
colors["hotpink"]="#FF69B4"
colors["indianred"]="#CD5C5C"
colors["indigo"]="#4B0082"
colors["ivory"]="#FFFFF0"
colors["khaki"]="#F0E68C"
colors["lavender"]="#E6E6FA"
colors["lavenderblush"]="#FFF0F5"
colors["lawngreen"]="#7CFC00"
colors["lemonchiffon"]="#FFFACD"
colors["lightblue"]="#ADD8E6"
colors["lightcoral"]="#F08080"
colors["lightcyan"]="#E0FFFF"
colors["lightgoldenrodyellow"]="#FAFAD2"
colors["lightgray"]="#D3D3D3"
colors["lightgreen"]="#90EE90"
colors["lightpink"]="#FFB6C1"
colors["lightsalmon"]="#FFA07A"
colors["lightseagreen"]="#20B2AA"
colors["lightskyblue"]="#87CEFA"
colors["lightslategray"]="#778899"
colors["lightsteelblue"]="#B0C4DE"
colors["lightyellow"]="#FFFFE0"
colors["lime"]="#00FF00"
colors["limegreen"]="#32CD32"
colors["linen"]="#FAF0E6"
colors["magenta"]="#FF00FF"
colors["maroon"]="#800000"
colors["mediumaquamarine"]="#66CDAA"
colors["mediumblue"]="#0000CD"
colors["mediumorchid"]="#BA55D3"
colors["mediumpurple"]="#9370DB"
colors["mediumseagreen"]="#3CB371"
colors["mediumslateblue"]="#7B68EE"
colors["mediumspringgreen"]="#00FA9A"
colors["mediumturquoise"]="#48D1CC"
colors["mediumvioletred"]="#C71585"
colors["midnightblue"]="#191970"
colors["mintcream"]="#F5FFFA"
colors["mistyrose"]="#FFE4E1"
colors["moccasin"]="#FFE4B5"
colors["navajowhite"]="#FFDEAD"
colors["navy"]="#000080"
colors["oldlace"]="#FDF5E6"
colors["olive"]="#808000"
colors["olivedrab"]="#6B8E23"
colors["orange"]="#FFA500"
colors["orangered"]="#FF4500"
colors["orchid"]="#DA70D6"
colors["palegoldenrod"]="#EEE8AA"
colors["palegreen"]="#98FB98"
colors["paleturquoise"]="#AFEEEE"
colors["palevioletred"]="#DB7093"
colors["papayawhip"]="#FFEFD5"
colors["peachpuff"]="#FFDAB9"
colors["peru"]="#CD853F"
colors["pink"]="#FFC0CB"
colors["plum"]="#DDA0DD"
colors["powderblue"]="#B0E0E6"
colors["purple"]="#800080"
colors["red"]="#FF0000"
colors["rosybrown"]="#BC8F8F"
colors["royalblue"]="#4169E1"
colors["saddlebrown"]="#8B4513"
colors["salmon"]="#FA8072"
colors["sandybrown"]="#F4A460"
colors["seagreen"]="#2E8B57"
colors["seashell"]="#FFF5EE"
colors["sienna"]="#A0522D"
colors["silver"]="#C0C0C0"
colors["skyblue"]="#87CEEB"
colors["slateblue"]="#6A5ACD"
colors["slategray"]="#708090"
colors["snow"]="#FFFAFA"
colors["springgreen"]="#00FF7F"
colors["steelblue"]="#4682B4"
colors["tan"]="#D2B48C"
colors["teal"]="#008080"
colors["thistle"]="#D8BFD8"
colors["tomato"]="#FF6347"
colors["turquoise"]="#40E0D0"
colors["violet"]="#EE82EE"
colors["wheat"]="#F5DEB3"
colors["white"]="#FFFFFF"
colors["whitesmoke"]="#F5F5F5"
colors["yellow"]="#FFFF00"
colors["yellowgreen"]="#9ACD32"
EndSub

Sub Math_Hex2Dec
' Math | Convert hexadecimal to decimal
' param hex
' return dec
dec = 0
len = Text.GetLength(hex)
For ptr = 1 To len
dec = dec * 16 + Text.GetIndexOf("123456789ABCDEF", Text.GetSubText(hex, ptr, 1))
EndFor
EndSub