2 This file is part of Generic Block Game
4 Generic Block Game is free software
: you can redistribute it
and/or modify
5 it under the terms of the GNU General
Public License
as published by
6 the Free Software Foundation
, either version
3 of the License
, or
7 (at your
option) any later version
.
9 Generic Block Game is distributed
in the hope that it will be useful
,
10 but WITHOUT ANY WARRANTY
; without even the implied warranty of
11 MERCHANTABILITY
or FITNESS
FOR A PARTICULAR PURPOSE
. See the
12 GNU General
Public License
for more details
.
14 You should have received a copy of the GNU General
Public License
15 along
with this program
. If not, see
<https
://www
.gnu
.org
/licenses
/>.
20 As Byte row
, column
, border
22 keypress
As String * 2
31 Function isin(xx
As Short
,yy
As Short
,x
As Short
,y
As Short
,w
As UShort
=50,h
As UShort
=50) As Byte
33 in=in And xx
>=x
And xx
<=x
+w
34 in=in And yy
>=y
And yy
<=y
+h
40 Function readtitle(filename
As String) As String
41 Dim As String l
, result
42 Open filename
For Input
As #
1
43 If Err
>0 Then Print
"Error opening the file":End
56 Function drawbutton(text
As String, keypress
As String = "", row
As Byte, column
As Byte = -1, border
As Byte = True, filled
As Byte = False) As button
57 'Draws a button. If column (0 to 4) is present, draws a smaller button in that column
58 Const MAXW
= 309, H
= 40, MARGIN
= 10, PL
= 20, FH
= 8, FW
= 8
59 Dim as Short w
= MAXW
, ox
= 0
61 w
= MAXW
/ 4 - MARGIN
* 0.75
62 ox
= (w
+ MARGIN
) * column
65 Line (ox
, H
*row
+ MARGIN
*row
)-(ox
+ w
, H
*row
+MARGIN
*row
+H
), RGB(0,0,127), bf
67 Line (ox
, H
*row
+ MARGIN
*row
)-(ox
+ w
, H
*row
+MARGIN
*row
+H
), RGB(11,11,11), bf
69 If border
Then Line (ox
, H
*row
+ MARGIN
*row
)-(ox
+ w
, H
*row
+MARGIN
*row
+H
), RGB(127,127,127), b
70 If (Not border
) Or (column
>= 0) Then
71 Draw
String (ox
+ w
/2-Len(text
)*FW
/2, H
*row
+MARGIN
*row
+ H
/2-FH
/2), text
73 Draw
String (ox
+ PL
, H
*row
+MARGIN
*row
+ H
/2-FH
/2), text
75 Return Type(text
, row
, column
, border
, ox
, H
*row
+ MARGIN
*row
, w
, H
, keypress
)
79 Function menumouse(buttons() As button
) As String
81 Dim As Integer mousex
, mousey
, pressed
83 If (ScreenEvent(@e
)) Then
85 Case EVENT_MOUSE_BUTTON_PRESS
87 If e
.button
=2 Then Return Chr(27)
89 GetMouse(mousex
,mousey
)
91 For a
= 0 to UBound(buttons
)
92 If isin(mousex
,mousey
,buttons(a
).x
, buttons(a
).y
,buttons(a
).w
,buttons(a
).h
) Then Return buttons(a
).keypress
95 Case EVENT_MOUSE_BUTTON_RELEASE
99 ScreenControl GET_WINDOW_POS
, mousex
, mousey
100 ScreenControl SET_WINDOW_POS
, mousex
+ e
.dx
, mousey
+ e
.dy
107 Function drawmenu(title
As String, options() As String, selected_button
As Byte = 0) As Byte
108 'Draws a menu with 4 options from options array
109 Dim keypress
As String
110 Dim buttons(6) As button
112 page
= selected_button \
4
113 selected_button
= selected_button Mod
4 + 1
114 Dim maxpage
As UByte
= (UBound(options
)) \
4 + 1
116 resizewindow(310, 300, title
) 'resize or cls
117 drawbutton(title
,,0,,False)
120 Dim As Byte row
= 1, fn
= page
* 4
121 Do While row
<= 4 And fn
<= UBound(options
)
122 buttons(row
) = drawbutton(row
& ". " + options(fn
), Str(row
), row
,,,row
= selected_button
)
126 buttons(5) = drawbutton("prev", "p", 5, 0)
127 buttons(6) = drawbutton("next", "n", 5, 1)
128 drawbutton(page
+ 1 & "/" & maxpage
, , 5, 2, False)
129 buttons(0) = drawbutton("exit", "x", 5, 3)
130 'wait for key or click
133 If keypress
= "" Then keypress
= menumouse(buttons())
134 Loop Until keypress
<> ""
139 If selected_button
> row
- 1 Then selected_button
= 1
140 Case Chr(255)+"M", "n" 'down or right or n
141 page
= (page
+ 1) Mod maxpage
145 If selected_button
< 1 Then selected_button
= row
- 1
146 Case Chr(255)+"K" , "p" 'up or left or p
147 page
= (page
- 1 + maxpage
) Mod maxpage
150 If selected_button
> 0 Then keypress
= Str(selected_button
)
156 'return selected option + page*4 - 1
157 If Val(keypress
) >= 1 And Val(keypress
) <= 4 And Len(options(Val(keypress
) + page
*4 - 1)) Then Return Val(keypress
) + page
*4 - 1
162 Function onoff(what
As Byte) As String
163 If what
Then Return ": on"
168 Sub opentilesettings()
174 Dim selected
As Byte = 0
175 Dim title
As String = "Settings"
176 Dim options(5) As String
178 options(0) = "Show shadow" + onoff(settings
.show_shadow
)
179 options(1) = "Show speed" + onoff(settings
.show_speed
)
180 options(2) = "Show score" + onoff(settings
.show_score
)
181 options(3) = "Play with mouse" + onoff(settings
.play_mouse
)
182 options(4) = "1st button turning" + onoff(settings
.first_button_turning
)
183 options(5) = "Curent tileset: " + tilesfiles(settings
.tileset
)
184 selected
= drawmenu(title
, options(), selected
)
187 settings
.show_shadow
= Not settings
.show_shadow
189 settings
.show_speed
= Not settings
.show_speed
191 settings
.show_score
= Not settings
.show_score
193 settings
.play_mouse
= Not settings
.play_mouse
195 settings
.first_button_turning
= Not settings
.first_button_turning
197 loadTiles(drawmenu("Select tileset", tilesfiles(), settings
.tileset
))
206 Function openloader(directory
As String) As String
207 Dim title
As String = "Load Variation"
209 ReDim filenames (0) As String
210 filenames(0) = Dir(directory
+ "/*")
211 Do While Len(filenames(UBound(filenames
)))
212 ReDim Preserve filenames(UBound(filenames
) + 1)
213 filenames(UBound(filenames
)) = Dir()
215 ReDim Preserve filenames(UBound(filenames
) - 1) 'last one was empty
217 Dim titles(UBound(filenames
)) As String
218 Dim As Byte row
= 1, fn
= 0
219 Do While fn
<= UBound(filenames
)
220 titles(fn
) = readtitle(directory
+ "/" + filenames(fn
))
223 'draw menu and return a variation (if any)
224 fn
= drawmenu(title
, titles())
225 If fn
> -1 Then Return directory
+ "/" + filenames(fn
)
230 resizewindow(310,300, "Help")
232 Color
RGB(127,127,127)
233 Print
"Generic Block Game"
235 Print
"This game is free software (GPL3+)."
236 Print
"See fbc.bas for source and details."
238 Color
RGB(255,255,255)
240 Print
"Use left and right arrows to move,"
241 Print
"Up arrow or space to rotate"
242 Print
"Down arrow to lower, Enter to drop,"
244 Print
"Use arrows to move,"
245 Print
"Space to rotate, Enter to fix,"
248 Print
"F1 for help, T to change tileset,"
249 Print
"S to toggle score, O for options,"
250 Print
"+ to increase speed, ESC for menu"
252 Color
RGB(127,127,127)
253 Print
"Help for " + game
.title
254 Color
RGB(255,255,255)
258 For a
= 0 To UBound(help
)
267 Loop Until keypress
<> "" Or e
.type = EVENT_MOUSE_BUTTON_PRESS
275 Dim selected
As Byte = 0
276 Dim title
As String = "Menu"
277 Dim options(4) As String
279 options(0) = "Show help"
280 options(1) = "Restart game"
281 options(2) = "Load game"
282 options(3) = "Quit game"
283 options(4) = "Settings"
284 selected
= drawmenu(title
, options(), selected
)
293 If loadgame(openloader(VARPATH
)) Then Exit Sub 'Don't restore window size