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
= 299, 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, page
As UByte Pointer
) As String
108 'Draws a menu with 4 options from options array
109 Dim keypress
As String
110 Dim buttons(6) As button
111 Dim newpage
As Short
= *page
112 Dim maxpage
As UByte
= (UBound(options
)) \
4 + 1
114 resizewindow(300, 300, title
) 'resize or cls
115 drawbutton(title
,,0,,False)
118 Dim As Byte row
= 1, fn
= *page
* 4
119 Do While row
<= 4 And fn
<= UBound(options
)
120 buttons(row
) = drawbutton(row
& ". " + options(fn
), Str(row
), row
)
124 buttons(5) = drawbutton("prev", "p", 5, 0)
125 buttons(6) = drawbutton("next", "n", 5, 1)
126 drawbutton(*page
+ 1 & "/" & maxpage
, , 5, 2, False)
127 buttons(0) = drawbutton("exit", "x", 5, 3)
128 'wait for key or click
132 If keypress
= "" Then keypress
= menumouse(buttons())
133 Loop Until keypress
<> ""
135 If keypress
=Chr(255)+"P" Or keypress
=Chr(255)+"M" Or keypress
="n" Then 'down or right or n
136 newpage
= (*page
+ 1) Mod maxpage
137 ElseIf keypress
=Chr(255)+"H" Or keypress
=Chr(255)+"K" Or keypress
="p" Then 'up or left or p
138 newpage
= (*page
- 1 + maxpage
) Mod maxpage
142 Loop While newpage
<> -1
148 Dim title
As String = "Settings"
149 Dim options(2) As String = {"aaaa", "bbbb", "cccc"}
150 Dim page
As UByte
= 0
151 keypress
= drawmenu(title
, options(), @page
)
155 Function openloader(directory
As String) As String
156 Dim title
As String = "Load Variation"
157 Dim page
As UByte
= 0
159 ReDim filenames (0) As String
160 filenames(0) = Dir(directory
+ "/*")
161 Do While Len(filenames(UBound(filenames
)))
162 ReDim Preserve filenames(UBound(filenames
) + 1)
163 filenames(UBound(filenames
)) = Dir()
165 ReDim Preserve filenames(UBound(filenames
) - 1) 'last one was empty
167 Dim titles(UBound(filenames
)) As String
168 Dim As Byte row
= 1, fn
= 0
169 Do While Len(filenames(fn
))
170 titles(fn
) = readtitle(directory
+ "/" + filenames(fn
))
173 'draw menu and get key (or click)
174 Dim As String keypress
= drawmenu(title
, titles(), @page
)
175 'run a variation (if any)
176 If Val(keypress
) >= 1 And Val(keypress
) <= 4 And Len(filenames(Val(keypress
) + page
*4 - 1)) Then Return directory
+ "/" + filenames(Val(keypress
) + page
*4 - 1)
181 resizewindow(300,300, "Help")
183 Color
RGB(127,127,127)
184 Print
"Generic Block Game"
186 Print
"This game is free software (GPL3+)."
187 Print
"See fbc.bas for source and details."
190 Color
RGB(255,255,255)
192 Print
"Use left and right arrows to move,"
193 Print
"Up arrow or space to rotate"
194 Print
"Down arrow to lower, Enter to drop."
196 Print
"Use arrows to move,"
197 Print
"Space to rotate, Enter to fix."
201 Color
RGB(127,127,127)
202 Print
"Help for " + game
.title
203 Color
RGB(255,255,255)
207 For a
= 0 To UBound(help
)
215 Loop Until keypress
<> "" Or e
.type = EVENT_MOUSE_BUTTON_PRESS
227 Dim As Integer x
, y
, pressed
229 Dim menuimg
As Any Ptr
230 resizewindow(150,150, "Menu")
231 menuimg
= ImageCreate(150,150)
232 BLoad GFXPATH
+"/menu.bmp", menuimg
233 Put(0,0),menuimg
,PSet
237 If (ScreenEvent(@e
)) Then
239 Case EVENT_MOUSE_BUTTON_PRESS
241 If e
.button
>=2 Then Exit Do
244 If isin(x
,y
,0,0) Then 'help
245 keypress
= Chr(255)+";" 'F1
246 ElseIf isin(x
,y
,100,0) Then 'quit
247 keypress
= Chr(27) 'Esc
248 ElseIf isin(x
,y
,50,50) Then 'tiles
250 ElseIf isin(x
,y
,0,50) Then 'speed
252 ElseIf isin(x
,y
,100,50) Then 'score
254 ElseIf isin(x
,y
,50,0) Then 'restart
255 keypress
= Chr(255)+"<" 'F2
256 ElseIf isin(x
,y
,0,100) Then 'load
260 Case EVENT_MOUSE_BUTTON_RELEASE
262 Case EVENT_MOUSE_MOVE
264 ScreenControl GET_WINDOW_POS
, x
, y
265 ScreenControl SET_WINDOW_POS
, x
+ e
.dx
, y
+ e
.dy
267 Case EVENT_WINDOW_CLOSE
275 ImageDestroy(menuimg
)
282 ImageDestroy(menuimg
)
284 Case Chr(255)+";" 'F1
287 Case Chr(255)+"<" 'F2
291 If loadgame(openloader(VARPATH
)) Then
292 ImageDestroy(menuimg
)
293 Exit Sub 'Don't restore window size
296 ImageDestroy(menuimg
)
300 Loop Until keypress
<> ""
301 ImageDestroy(menuimg
)