Codebase list lbreakout2 / 9f08202
Import Upstream version 2.5.2 Andreas Tille 5 years ago
606 changed file(s) with 102489 addition(s) and 19681 deletion(s). Raw diff Collapse all Expand all
00 Michael Speck <kulkanie@gmx.net>
11
22 **** Contributions ****
3
4 Patch to add a very easy difficulty level for kids. - Zooko
5
6 Patch to fix the insane speedup of balls after a SLOW/FAST
7 bonus expired that came up in 2.5beta. - Mark Tomich
8
9 Patch to load all themes from installation path. - Michal Cihar
10
11 Fixes to make LBreakout run on FreeBSD. - Sammy Mannaert
12
13 Option for playing with balls above debris and
14 explosions. - Jochen Striepe
15
16 Fix for input bug in Win32, a better installation
17 system and blinking cursor for editable menu items. - Lee Read
318
419 Modifications to make LBreakout2 compileable on
520 Win32 with MinGW. - Claudio Chimera
1934 ****
2035
2136 Also thanks to all guys that made suggestions to
22 improve LBreakout2!!!
37 improve LBreakout2!!!
0 2.5.2:
1 - added a different sound for balls reflected from the paddle
2 (05/01/13 M.S.)
3 - bugfix: acceleration of balls by middle mouse button now works in
4 the testing mode of the editor (previously the balls got stuck in
5 mid-air) (05/01/13 M.S.)
6 - the game will be paused if the input focus is lost or the
7 application is iconfied (05/01/13 M.S.)
8 - when the 'sticky' bonus runs out, all attached balls will be
9 detached (05/01/13 M.S.)
10 - when pressing either left or right shift, the name and score of
11 the first chart entry of this set will be displayed at the upper
12 right-hand side display of the frame instead of your name and
13 score (05/01/12 M.S.)
14 - if a paddle is frozen and the mouse is moved, the paddle will no
15 longer jump after thawing (05/01/12 M.S.)
16 - when a paddle turns invisible due to the 'ghost paddle'-malus, all
17 attached balls will be detached (05/01/12 M.S.)
18 - re-implemented explosion animation for bricks directly hit by an
19 explosive ball (05/01/12 M.S.)
20
21 2.5.1:
22 - only levelsets from the install directory are used for
23 Freakout (04/06/25 M.S.)
24 - order of Freakout levels is saved (04/09/22 M.S.)
25 - bugfix: balls will not start in next level with max speed when
26 the middle mouse button was pressed while clearing the last
27 brick of a level (04/09/22 M.S.)
28 - bonus floor uses proper brick image (blue energy wall instead
29 of normal wall) (04/09/22 M.S.)
30 - replaced chaos bricks in level 7 of N_Snapshots with normal
31 wall bricks (04/09/22 M.S.)
32 - to continue when viewing final network stats only SPACE is
33 allowed (04/09/22 M.S.)
34 - re-added continue option for single player mode, however
35 with 100% score loss this time (04/09/22 M.S.)
36
37 2.5:
38 - added additional network support via SDL_net for portability
39 (04/08/07 M.S.)
40 - bug fixed: game crashed when quitting testing mode in the
41 editor (04/08/06 M.S.)
42 - removed 5000 points bonus for completing a level. instead
43 the score of the remaining destructible bricks is substracted
44 as a penalty when warping to the next level (04/08/06 M.S.)
45 - generation of bug message is disabled (04/06/24 M.S.)
46 - sounds are played stereo in a local game and partially stereo
47 in a network game (04/06/24 Greg, M.S.)
48
49 2.5beta-8:
50 - admin bot commands are documented in the help (04/06/19 M.S.)
51 - number of online users is displayed when logging in to server
52 (04/06/19 M.S.)
53 - the number of bricks to be cleared for warp is not re-computed
54 when a ball is lost but always based on the initial number
55 of normal bricks (04/06/17 M.S.)
56 - saved game is removed when game is over (either all lives lost
57 or all levels completed) (04/06/17 M.S.)
58 - game cannot be quit by 'q' or ESCAPE when all lives are lost
59 (the player would get an extra life this way) (04/06/17 M.S.)
60 - new server option to add some paddle bots (04/06/17 M.S.)
61 - message about continue is not displayed in network game
62 (04/06/16 M.S.)
63 - network bot with variable paddle speed (04/06/16 M.S.)
64 - missing include added to gui.c (04/06/15 M.S.)
65
66 2.5beta-7:
67 - configure option --with-hiscore-path has been replaced with
68 autoconf option --localstatedir (04/06/14 M.S.)
69 - data files will be installed to $datadir/lbreakout2 instead
70 of $datadir/games/lbreakout2 (04/06/14 M.S.)
71 - renamed configure option --with-doc-path to --with-docdir
72 (04/06/14 M.S.)
73 - bugfix: test mode of editor crashed when trying to get the total
74 number of levels; there were none at all (04/06/14 M.S.)
75
76 2.5beta-6:
77 - network usernames must be alphanumerical (04/06/12 M.S.)
78 - fixed the 'snprintf'-bug that made the server exploitable to
79 formatted shellcode (04/06/12 M.S.)
80 - credits show total number of levels (04/06/12 M.S.)
81 - animations are now built directly from the brick graphics, using
82 their color key, and not from the screen; thus animations are now
83 transparent where the bricks are transparent, e.g. in theme
84 'Aquarium' (04/06/12 M.S.)
85
86 2.5beta-5:
87 - changed URL from www.lgames.org to lgames.sf.net in the README
88 (04/05/15 M.S.)
89 - if a game has been quit before it was over, it can now be resumed
90 (04/05/15 M.S.)
91 - default key 'd' is now blocked instead of normal key 'c'
92 (04/05/14 M.S.)
93 - pressing the middle mouse button or the speedup key will
94 accelerate all balls to maximum velocity until button/key
95 is released again (04/05/13 M.S.)
96 - a 5000 points bonus is added if a level was completely
97 cleared (not finished by warp) (04/05/13 M.S.)
98 - warp option is disabled in network game (04/05/13 M.S.)
99 - added hint on how to switch between the bricks/bonus set when
100 starting the editor (04/05/13 M.S.)
101
102 2.5beta-4:
103 - changed URL from www.lgames.org to lgames.sf.net (04/01/31 M.S.)
104
105 2.5beta-3:
106 - updated the quick hint of menu option 'Difficulty' (03/06/28 M.S.)
107 - added a VERY easy difficulty level for young kids (03/06/28 Zooko)
108 - invisible bricks do not vanish after being hit if the player
109 dies then (03/06/27 M.S.)
110 - speedup_level initiated correctly (03/06/27 M.T.)
111
112 2.5beta-2:
113 - fixed a bug in masking of ball speed vector which had the balls
114 stopped in midair not moving any further (03/06/18 M.S.)
115 - minimum keyboard input speed is now 100 (03/06/16 M.S.)
116 - missing inclusion for FreeBSD added (03/06/16 S.M.)
117
118 2.5beta:
119 - complete rewrite of network code (03/05/.. M.S.)
120 - added 8 new levels to 'Original' for a total of 25 levels and
121 renamed it to 'LBreakout2' (03/05/25 M.S.)
122 - correct size of temporary string buffer in write_text_with_cursor()
123 which fixes crash while editing author/title in the level editor
124 (03/05/25 M.S.)
125 - 'warp' and 'disintegrate' do not apply for the levelsets
126 'Original' and 'LBreakout1' (03/05/22 M.S.)
127 - separated levelset 'Original' from the other sets (03/05/22 M.S.)
128 - added the levelset of LBreakout1 as first add-on (03/05/22 M.S.)
129 - melted 'Original', 'AddOn-1', 'AddOn-2' into a tighter levelset
130 'Original' (03/05/22 M.S.)
131 - the option of buying a continue has been removed (03/05/20 M.S.)
132 - paddle can drop to 'middle size' 0 (03/05/20 M.S.)
133 - paddle size in medium difficulty decreased by one (03/05/20 M.S.)
134 - plasma weapon can fire permanently at a slower fire rate
135 (03/05/20 M.S.)
136 - modified bonus times to reflect the original values (03/05/20 M.S.)
137 - close button of window manager works in level editor (03/05/18 M.S.)
138 - reduced multiplayer ball respawn time to 5 seconds (03/05/17 M.S.)
139 - backgrounds have no colorkey (03/05/17 M.S.)
140 - multiplayer score table is also displayed if only one player remains
141 or the game is broken up (03/04/27 M.S.)
142 - on entering editor effects of extras are reset (03/04/27 M.S.)
143 - menu option 'key speed' is now in pixels per seconds and has moved
144 to the submenu 'controls' (03/04/23 M.S.)
145 - input is always grabbed and relative mouse motion is always used,
146 therefore their menu options were removed (03/04/23 M.S.)
147 - simplified internal handling of paddle fire buttons (03/04/23 M.S.)
148 - after 10 seconds penalty a player gets a new ball in a non-pingpong
149 multiplayer level when it has lost its (03/04/23 M.S.)
150 - balls no longer 'sink' into the sticky paddle (03/04/23 M.S.)
151 - description of menu options removed from documentation as each
152 has a context-sensitive helpbox at runtime (03/04/23 M.S.)
153 - simplified input handling by dropping all the stupid stuff and
154 sticking directly to SDL's functions (03/04/23 M.S.)
155 - added a 'loading' graphic at the beginning (03/04/08 M.S.)
156
157 2.4.1:
158 - unlimited number of backgrounds for themes (03/03/08 M.S.)
159 - if a levelset is selected its highscore chart is shown (03/02/27 M.S.)
160 - the warp icon gets static after it blinked four times (03/02/27 M.S.)
161 - the official levelsets 'Original', 'AddOn-1' and 'AddOn-2' became the
162 first entries in the levelset list (03/02/27 M.S.)
163 - default warp limit is now 80% of bricks (03/02/27 M.S.)
164 - scores are displayed while player changes (03/02/23 M.S.)
165 - loading themes from installation path no longer restricted to the
166 default ones (03/02/23 M.C.)
167 - added an explanation of the 'Warp' feature to the documenation
168 (03/02/07 M.S.)
169
170 2.4:
171 - fixed a bug were balls could get caught within the paddle if the
172 'bonus floor' was active and the paddle wasn't moved (02/12/16 M.S.)
173 - extra balls of upper paddle (multiplayer) are created at proper position
174 (02/12/16 M.S.)
175 - shadows of extras are clipped to the playing field (02/12/15 M.S.)
176 - lost/gained lives are refreshed correctly (02/12/15 M.S.)
177 - decreased corner sensitivity and improved corner reflection (no longer
178 reflected at 45° but at the real perpendicular which makes it much
179 easier for balls to enter narrow passages) (02/12/14 M.S.)
180 - simplified range check for ball velocity vector (02/12/14 M.S.)
181 - the frame's shadow is not drawn twice (thus darker) when a brick close to
182 the frame is removed (02/12/13 M.S.)
183 - difficulty 'Hard' gives 30% score bonus (02/12/13 M.S.)
184 - increased ball speed for 'Medium' and 'Hard' (02/12/13 M.S.)
185 - added a missing check concering the reset position of reflected balls
186 to the target computation (without this they could get into bricks which
187 resulted in a corrupted next target) (02/12/13 M.S.)
188 - extra balls (random initial direction) can no longer move straight up
189 (when they did so they simply left the screen as no target could be computed
190 for them) (02/12/13 M.S.)
191 - reduced number of get_target() calls for balls and shots (02/12/11 M.S.)
192 - improved handling of scrollbars (02/12/11 M.S.)
193 - fixed color key bugs occuring at depth >=24 (02/12/10 M.S.)
194 - when bricks regenerate they are refreshed correctly (02/12/08 M.S.)
195 - player can disintegrate single bricks by pressing 'd' and spending
196 5% of his/her score (02/12/08 M.S.)
197
198 2.4beta-3:
199 - continues always cost 50% of the current score but fully restore the
200 initial amount of lives (02/12/07 M.S.)
201 - fixed a bug in the 'restart' code that could accidently cause the
202 game to quit if you hadn't paid the continue cost twice (02/12/07 M.S.)
203 - updated Jurgen De Backers theme AbsoluteB (02/12/07 M.S.)
204 - shadow creation for surfaces with no color key now works correctly
205 (02/12/07 M.S.)
206
207 2.4beta-2:
208 - fixed security holes created by improper use of sprintf (02/11/24 D.B.)
209
210 2.4beta:
211 - added a quick help for network game (02/11/03 M.S.)
212 - optimized drawing of balls/extras/shots/shrapnells (02/11/01 M.S.)
213 - removed config option shadow (is always enabled) (02/11/01 M.S.)
214 - 'paddle.png' may provide an additional paddle set for a different
215 upper paddle (02/11/01 M.S.)
216 - audio buffer size became config option (02/11/01 M.S.)
217 - network statistics are sent in one go after game is finished
218 (02/10/30 M.S.)
219 - code clean-ups in establishing direct connection (02/10/30 M.S.)
220 - in the highscore chart the level index is no longer 0 after
221 completing a levelset (02/10/29 M.S.)
222 - levelset transfer improved (02/10/27 M.S.)
223 - fading time decreased (02/10/26 M.S.)
224 - SDL >= 1.1.5 is now required (02/10/25 M.S.)
225 - invalid users are properly removed from server (02/10/25 M.S.)
226 - code clean-ups and performance enhancements (02/10/21 M.S.)
227 - improved chatroom GUI (02/10/19 M.S.)
228 - fixed a network leak that caused 500% more latency in 'Deathmatch'
229 and 900% more latency in 'Normal Multiplayer' (02/10/08 M.S.)
230
231 2.3.5:
232 - added pseudo levelset !FREAKOUT! that lets you play all levels (~600)
233 in a random order (02/09/21 M.S.)
234 - moved 'Select Theme' option from 'Advanced Options' to 'Graphics'
235 (02/09/21 M.S.)
236 - bonus stack is cleared at beginning of new level (02/09/21 M.S.)
237 - replaced 'wontgiveup.wav' with 'verygood.wav' (02/09/20 M.S.)
238 - implemented 'warp' option to switch to next level before all bricks
239 where cleared (02/09/19 M.S.)
240 - bricks/bonuses/maluses may have transparency (02/09/17 M.S.)
241 - optional bonus floor graphic (02/09/17 M.S.)
242
243 2.3.4:
244 - fixed a crash in 'Classic' theme (02/09/12 M.S.)
245
246 2.3.3:
247 - added winning themes AbsoluteB, Oz, Moiree from theming contest and
248 the previous default theme has been renamed to Classic (02/09/10 M.S.)
249 - fixed a bug that crashed LBreakout when there where two alternating
250 players left in the last level and one finished it (02/09/05 M.S.)
251 - modifications to make LBreakout run on FreeBSD (02/09/05 S.M.)
252 - option to display balls above debris and explosions (02/09/05 J.S.)
253 - input bug fixes for win32 (02/09/05 L.R.)
254 - blinking cursor for editable menu items to distinguish them from
255 switches (02/09/05 L.R.)
256
257 2.3.2:
258 - added all existing levelsets (27 sets, ~440 levels) (02/08/16 L.R.)
259 - quick help can be opened in game by pressing F1 or 'h' (02/08/16 M.S.)
260 - the 'select theme' hint bubble will show information on a theme (author,
261 version, description) if it provides an ABOUT file (02/08/16 M.S.)
262 - menu graphics and sounds are now themeable (02/08/16 M.S.)
263 - added information about version and author of levelset to the hint
264 bubble in the menu (02/08/16 M.S.)
265 - menu item added to modify challengers game port (02/08/16 M.S.)
266 - ip buffers resized to cover AF_INET6 addresses (02/08/16 M.S.)
267 - bugfix in net talk (02/08/15 M.S.)
268 - levelsets MP_Arenas and MP_Snapshots now have the correct contents
269 (02/08/14 M.S.)
270
271 2.3.1:
272 - multiplayer levelsets MP_Arenas and MP_Snapshots are now installed
273 correctly (02/08/14 M.S.)
274 - configure option --disable-network now works correctly (02/08/14 M.S.)
275 - if your challenge is invalid an error message is displayed
276 (02/08/14 M.S.)
277
278 2.3:
279 - no warnings when loading a theme (02/08/13 M.S.)
280 - two network levelsets MP_Arenas (deathmatch) and MP_Snapshots (normal)
281 added (02/08/13 M.S.)
282 - added version for levelsets (02/08/13 M.S.)
283 - added commands '/version', '/idletime' and '/userlimit (02/08/12 M.S.)
284 - 'turbo' key that temporarily doubles the paddle speed added
285 (02/08/10 D.B.)
286 - command '/transfer' implemented (02/08/10 M.S.)
287 - bonus info displayed at the right side of the screen is now optional
288 (02/08/10 M.S.)
289 - chatroom commands implemented (02/08/09 M.S.)
290 - chatroom channels implemented (02/08/08 M.S.)
291 - added configure option --disable-network (02/08/06 M.S.)
292 - network statistics implemented (02/08/06 M.S.)
293 - bugfix for networked weapon fire (02/08/06 M.S.)
294 - PNG loading routine updated (02/08/06 M.S.)
295 - fixed an aweful lot of bugs in normal network game (02/08/05 M.S.)
296 - implemented info about running games to chatroom (02/08/05 M.S.)
297 - users are properly unlinked after playing a network game (02/08/05 M.S.)
298 - pause chatroom implemented (02/08/04 M.S.)
299 - normal networking implemented /02/08/04 M.S.)
300 - network bugfixes (02/08/03 M.S.)
301 - screen is grayed for paused games (02/08/02 M.S.)
302 - deathmatch networking implemented (02/08/02 M.S.)
303 - bugfix for shooting bricks (02/08/02 M.S.)
304 - welcome message when entering chatroom and the user name is colored white
305 (02/08/02 M.S.)
306 - score modification for difficulty level is directly added (02/07/31 M.S.)
307 - each level gets a background assigned instead of simply changing
308 the background when the player changes (02/07/31 M.S.)
309 - plain text config (02/07/31 M.S.)
310 - restored compatibility with old layout (02/07/31 M.S.)
311 - for win32: (02/07/18 L.R.)
312 - edit bug fixed
313 - installation details added to README
314 - muched improved installation system
315 - files are always opened in binary mode
316 - added missing screen.jpg in the docs (02/07/18 L.R.)
317 - implemented network enviroment with chatroom
318 - implemented second fire key
319 - added check for libz to configure as this is required for PNG
320 - option to modify audio buffer size to fix sound problems
321
0322 2.2.2:
1323 -LBreakout2 is now compileable with MinGW for Win32
2324 (thanks to Claudio Chimera)
0 # Anjuta Version 0.1.7
1 Compatibility Level: 1
2
3 <PROJECT_DESCRIPTION_START>
4 <PROJECT_DESCRIPTION_END>
5 <CONFIG_PROGS_START>
6 <CONFIG_PROGS_END>
7 <CONFIG_LIBS_START>
8 <CONFIG_LIBS_END>
9 <CONFIG_HEADERS_START>
10 <CONFIG_HEADERS_END>
11 <CONFIG_CHARACTERISTICS_START>
12 <CONFIG_CHARACTERISTICS_END>
13 <CONFIG_LIB_FUNCS_START>
14 <CONFIG_LIB_FUNCS_END>
15 <CONFIG_ADDITIONAL_START>
16 <CONFIG_ADDITIONAL_END>
17 <CONFIG_FILES_START>
18 <CONFIG_FILES_END>
19 <MAKEFILE_AM_START>
20 <MAKEFILE_AM_END>
21
22 props.file.type=project
23
24 anjuta.version=0.1.7
25 anjuta.compatibility.level=1
26
27 project.name=LBreakout2
28 project.type=GENERIC
29 project.target.type=EXECUTABLE
30 project.version=2.0alpha-2
31 project.author=Michael Speck
32 project.source.target=lbreakout2
33
34 project.has.gettext=0
35
36 project.programming.language=C
37
38 project.menu.entry=LBreakout2 Version (null)
39 project.menu.group=Applications
40 project.menu.comment=LBreakout2 Version (null)
41 project.menu.icon=lbreakout2_icon.(null)
42 project.menu.need.terminal=0
43
44 project.configure.options=
45
46 anjuta.program.arguments=
47
48 project.config.disable.overwriting=1 1 1 1 1 1 1 1 1
49 project.config.extra.modules.before=
50 project.config.extra.modules.after=
51
52 module.incude.name=include
53 module.incude.type=
54 module.incude.expanded=0
55 module.incude.files=
56
57 module.source.name=src
58 module.source.type=
59 module.source.expanded=1
60 module.source.files=\
61 credit.c shine.c extras.c balls.c shrapnells.c \
62 shots.c event.c paddle.c frame.c misc.c bricks.c difficulty.c \
63 player.c game.c file.c levels.c config.c \
64 item.c menu.c manager.c value.c chart.c \
65 editor.c help.c \
66 main.c \
67 credit.h shine.h extras.h balls.h shrapnells.h \
68 shots.h event.h paddle.h frame.h misc.h bricks.h difficulty.h \
69 player.h game.h file.h levels.h config.h \
70 item.h menu.h manager.h value.h chart.h \
71 editor.h lbreakout.h help.h \
72 hint.c hint.h client.c client.h comm.c comm.h \
73 client_recv.c client_data.h client_data.c \
74 client_handlers.h client_handlers.c client_game.c \
75 slot.h \
76 theme.c theme.h\
77 display.c display.h \
78 input.c input.h \
79 ../common/net.h ../common/net.c \
80 ../common/list.h ../common/list.c \
81 ../common/tools.h ../common/tools.c \
82 ../common/parser.h ../common/parser.c \
83 ../common/messages.h \
84 ../gui/stk.h ../gui/stk.c \
85 ../gui/gui.h ../gui/gui.c \
86 ../gui/gui_widget.h ../gui/gui_widget.c \
87 ../gui/gui_box.h ../gui/gui_box.c \
88 ../gui/gui_button.h ../gui/gui_button.c \
89 ../gui/gui_label.h ../gui/gui_label.c \
90 ../gui/gui_icon.h ../gui/gui_icon.c \
91 ../gui/gui_progressbar.h ../gui/gui_progressbar.c \
92 ../gui/gui_scrollbar.h ../gui/gui_scrollbar.c \
93 ../gui/gui_list.h ../gui/gui_list.c \
94 ../gui/gui_edit.h ../gui/gui_edit.c \
95 ../gui/gui_radiogroup.h ../gui/gui_radiogroup.c \
96 ../gui/gui_spinbutton.h ../gui/gui_spinbutton.c \
97 ../server/server.h ../server/server.c \
98 ../server/server_game.c ../server/server_game.h \
99 ../game/balls.h ../game/comm.h ../game/game.h \
100 ../game/levels.h ../game/paddle.h ../game/bricks.h \
101 ../game/extras.h ../game/gamedefs.h ../game/mathfuncs.h \
102 ../game/shots.h \
103 ../game/balls.c ../game/comm.c ../game/game.c ../game/mathfuncs.c \
104 ../game/shots.c ../game/bricks.c ../game/extras.c \
105 ../game/levels.c ../game/paddle.c
106
107 module.pixmap.name=pixmaps
108 module.pixmap.type=
109 module.pixmap.expanded=0
110 module.pixmap.files=
111
112 module.data.name=data
113 module.data.type=
114 module.data.expanded=0
115 module.data.files=
116
117 module.help.name=help
118 module.help.type=
119 module.help.expanded=0
120 module.help.files=
121
122 module.doc.name=doc
123 module.doc.type=
124 module.doc.expanded=0
125 module.doc.files=
126
127 module.po.expanded=0
128 module.po.files=
129
130 compiler.options.supports=
131
132 compiler.options.include.paths=
133
134 compiler.options.library.paths=
135
136 compiler.options.libraries=
137 compiler.options.libraries.selected=
138
139 compiler.options.defines=
140
141 compiler.options.warning.buttons=0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1
142
143 compiler.options.optimize.buttons=0 1 0 0
144
145 compiler.options.other.buttons=1 0
146
147 compiler.options.other.c.options=
148
149 compiler.options.other.l.options=
150
151 project.source.paths=
152
0 SUBDIRS = src
0 SUBDIRS = common gui game server client docs
11
2 EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO lbreakout2.spec touchall comp.bat
2 EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README README-SDL.txt \
3 TODO lbreakout2.spec touchall lbreakout32.gif lbreakout48.gif \
4 LBreakout2.prj win32_mancomp win32_preparchive
5 WIN32_TEXT = AUTHORS COPYING ChangeLog INSTALL README README-SDL.txt \
6 TODO lbreakout2.spec
7 WIN32_LOCAL_DLL = SDL.dll SDL_mixer.dll zlib.dll libpng.dll
8 WIN32_SYS_DLL = msvcrt.dll
39
410 AUTOMAKE_OPTIONS = foreign
11
12 win32text: $(WIN32_TEXT)
13 @echo Converting text files for win32 installer
14 @-rm -rf ./win32text
15 @mkdir ./win32text
16 @for textfile in $(WIN32_TEXT); do \
17 $(AWK) '{printf "%s\r\n",$$0}' $$textfile > ./win32text/$$textfile ; \
18 done
19
20 win32-installer-script: @win32_inst_script@
21
22 @win32_inst_script@: win32text
23 @echo Generating win32 installer script
24 @echo "[Setup]" > $@
25 @echo "AppName=@appname@" >> $@
26 @echo "AppVerName=@appname@ $(VERSION)" >> $@
27 @echo "AppPublisher=Michael Speck" >> $@
28 @echo "AppPublisherURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
29 @echo "AppSupportURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
30 @echo "AppUpdatesURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
31 @echo "DefaultDirName={pf}\\$(PACKAGE)" >> $@
32 @echo "DefaultGroupName=@appname@" >> $@
33 @echo "OutputDir=." >> $@
34 @echo "Uninstallable=yes" >> $@
35 @echo "AlwaysCreateUninstallIcon=yes" >> $@
36 @echo "AdminPrivilegesRequired=1" >> $@
37 @echo "[Tasks]" >> $@
38 @echo "Name: \"desktopicon\"; Description: \"Create a &desktop icon\"; GroupDescription: \"Additional icons:\"" >> $@
39 @echo "[Files]" >> $@
40 @(cd win32dlls; for file in $(WIN32_LOCAL_DLL); do \
41 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> $@; \
42 done)
43 @(cd win32dlls; for file in $(WIN32_SYS_DLL); do \
44 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{sys}\"; CopyMode: alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall" >> $@; \
45 done)
46 @echo "Source: \"win32text\\*.*\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> $@;
47 @list='$(SUBDIRS)'; for subdir in $$list; do \
48 (cd $$subdir \
49 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
50 done
51 @echo "[Icons]" >> $@
52 @echo "Name: \"{group}\\@appname@\"; Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; WorkingDir: \"{app}\"" >> $@
53 @echo "Name: \"{group}\\@appname@ Manual\"; Filename: \"{app}\\docs\\index.html\"" >> $@
54 @echo "Name: \"{userdesktop}\\@appname@\"; Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; WorkingDir: \"{app}\"; Tasks: \"desktopicon\"" >> $@
55 @echo "[Run]" >> $@
56 @echo "Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; Description: \"Launch @appname@\"; Flags: nowait postinstall skipifsilent" >> $@
57
58 @$(AWK) '{printf "%s\r\n",$$0}' $@ > installer.iss.w32
59 @mv installer.iss.w32 $@
60
61 win32-installer: win32-installer-script
62 $(ISCC) @win32_inst_script@
63 @mv setup.exe $(PACKAGE)-$(VERSION)-win32.exe
64 @-rm -rf win32text
65 @echo "Installer created: $(PACKAGE)-$(VERSION)-win32.exe"
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
11
22 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
33 # This Makefile.in is free software; the Free Software Foundation
5656 NORMAL_UNINSTALL = :
5757 PRE_UNINSTALL = :
5858 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
5962 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
6065 MAKEINFO = @MAKEINFO@
6166 PACKAGE = @PACKAGE@
6267 RANLIB = @RANLIB@
6368 SDL_CFLAGS = @SDL_CFLAGS@
6469 SDL_CONFIG = @SDL_CONFIG@
6570 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
6672 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
6777 doc_dir = @doc_dir@
6878 hi_dir = @hi_dir@
6979 hi_inst_flag = @hi_inst_flag@
7080 inst_dir = @inst_dir@
7181 inst_flag = @inst_flag@
7282 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
7487 warp_flag = @warp_flag@
75
76 SUBDIRS = src
77
78 EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO lbreakout2.spec touchall comp.bat
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 SUBDIRS = common gui game server client docs
92
93 EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README README-SDL.txt TODO lbreakout2.spec touchall lbreakout32.gif lbreakout48.gif LBreakout2.prj win32_mancomp win32_preparchive
94
95 WIN32_TEXT = AUTHORS COPYING ChangeLog INSTALL README README-SDL.txt TODO lbreakout2.spec
96
97 WIN32_LOCAL_DLL = SDL.dll SDL_mixer.dll zlib.dll libpng.dll
98 WIN32_SYS_DLL = msvcrt.dll
7999
80100 AUTOMAKE_OPTIONS = foreign
81101 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
84104 CONFIG_CLEAN_FILES =
85105 DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
86106 Makefile.am Makefile.in NEWS TODO acconfig.h acinclude.m4 aclocal.m4 \
87 config.h.in configure configure.in install-sh missing mkinstalldirs
107 config.guess config.h.in config.sub configure configure.in install-sh \
108 missing mkinstalldirs
88109
89110
90111 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
91112
92 TAR = gtar
113 TAR = tar
93114 GZIP_ENV = --best
94115 all: all-redirect
95116 .SUFFIXES:
103124 $(ACLOCAL_M4): configure.in acinclude.m4
104125 cd $(srcdir) && $(ACLOCAL)
105126
106 config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
127 config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
107128 $(SHELL) ./config.status --recheck
108129 $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
109130 cd $(srcdir) && $(AUTOCONF)
266287 @for file in $(DISTFILES); do \
267288 d=$(srcdir); \
268289 if test -d $$d/$$file; then \
269 cp -pr $$/$$file $(distdir)/$$file; \
290 cp -pr $$d/$$file $(distdir)/$$file; \
270291 else \
271292 test -f $(distdir)/$$file \
272293 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
357378 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
358379
359380
381 win32text: $(WIN32_TEXT)
382 @echo Converting text files for win32 installer
383 @-rm -rf ./win32text
384 @mkdir ./win32text
385 @for textfile in $(WIN32_TEXT); do \
386 $(AWK) '{printf "%s\r\n",$$0}' $$textfile > ./win32text/$$textfile ; \
387 done
388
389 win32-installer-script: @win32_inst_script@
390
391 @win32_inst_script@: win32text
392 @echo Generating win32 installer script
393 @echo "[Setup]" > $@
394 @echo "AppName=@appname@" >> $@
395 @echo "AppVerName=@appname@ $(VERSION)" >> $@
396 @echo "AppPublisher=Michael Speck" >> $@
397 @echo "AppPublisherURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
398 @echo "AppSupportURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
399 @echo "AppUpdatesURL=http://lgames.sourceforge.net/index.php?project=LBreakout2" >> $@
400 @echo "DefaultDirName={pf}\\$(PACKAGE)" >> $@
401 @echo "DefaultGroupName=@appname@" >> $@
402 @echo "OutputDir=." >> $@
403 @echo "Uninstallable=yes" >> $@
404 @echo "AlwaysCreateUninstallIcon=yes" >> $@
405 @echo "AdminPrivilegesRequired=1" >> $@
406 @echo "[Tasks]" >> $@
407 @echo "Name: \"desktopicon\"; Description: \"Create a &desktop icon\"; GroupDescription: \"Additional icons:\"" >> $@
408 @echo "[Files]" >> $@
409 @(cd win32dlls; for file in $(WIN32_LOCAL_DLL); do \
410 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> $@; \
411 done)
412 @(cd win32dlls; for file in $(WIN32_SYS_DLL); do \
413 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{sys}\"; CopyMode: alwaysskipifsameorolder; Flags: restartreplace uninsneveruninstall" >> $@; \
414 done)
415 @echo "Source: \"win32text\\*.*\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> $@;
416 @list='$(SUBDIRS)'; for subdir in $$list; do \
417 (cd $$subdir \
418 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
419 done
420 @echo "[Icons]" >> $@
421 @echo "Name: \"{group}\\@appname@\"; Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; WorkingDir: \"{app}\"" >> $@
422 @echo "Name: \"{group}\\@appname@ Manual\"; Filename: \"{app}\\docs\\index.html\"" >> $@
423 @echo "Name: \"{userdesktop}\\@appname@\"; Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; WorkingDir: \"{app}\"; Tasks: \"desktopicon\"" >> $@
424 @echo "[Run]" >> $@
425 @echo "Filename: \"{app}\\$(PACKAGE)$(EXEEXT)\"; Description: \"Launch @appname@\"; Flags: nowait postinstall skipifsilent" >> $@
426
427 @$(AWK) '{printf "%s\r\n",$$0}' $@ > installer.iss.w32
428 @mv installer.iss.w32 $@
429
430 win32-installer: win32-installer-script
431 $(ISCC) @win32_inst_script@
432 @mv setup.exe $(PACKAGE)-$(VERSION)-win32.exe
433 @-rm -rf win32text
434 @echo "Installer created: $(PACKAGE)-$(VERSION)-win32.exe"
435
360436 # Tell versions [3.59,3.63) of GNU make to not export all variables.
361437 # Otherwise a system limit (for SysV at least) may be exceeded.
362438 .NOEXPORT:
+111
-29
README less more
66 ********************
77 I. Requirements
88 II. Installation
9 III. Documentation
10 IV. Troubleshooting
11 V. Resources
12 VI. Feedback
9 III. Network Server
10 IV. Documentation
11 V. Troubleshooting
12 VI. Resources
13 VII. Feedback
1314 ********************
1415
1516 ********************
1617 I. Requirements
1718 ********************
1819 LBreakout runs in X and uses SDL (any version though >= 1.1.4
19 is recommended) and SDL_mixer (optional for sound). Both libraries
20 is recommended), SDL_mixer (optional for sound) and SDL_net
21 (optional for networking on non-Unices). These libraries
2022 can be found at http://libsdl.org. The graphical stuff requires PNG
2123 which is usually included to a distro. If not check out
2224 http://www.libpng.org/pub/png/libpng.html.
2628 ********************
2729 Enter your favorite shell and type in the following stuff (in the
2830 directory you extracted the LBreakout source)
29 > ./configure [--disable-sound] [--disable-install] [--enable-warp]
30 [--with-highscore-path=HPATH] [--with-doc-path=DPATH]
31 --disable-sound: no sound
31 > ./configure [--disable-audio] [--disable-install] [--enable-warp]
32 [--with-docdir=DOCDIR] [--disable-network]
33 [--enable-sdl-net] [--localstatedir=HIDIR]
34 --disable-audio: no sound
3235 --disable-install: no installation; play from source directory
3336 --enable-warp: nescessary for non-Unices to use relative
3437 mouse motion for inverting or modify mouse
3538 speed
36 --with-highscore-path: write global highscore chart lbreakout.hscr
37 to the specified directory
38 DEFAULT: /var/lib/games
39 --with-doc-path: install documentation to $DPATH/lbreakout2
39 --with-docdir: install documentation to $DOCDIR/lbreakout2
4040 DEFAULT: /usr/doc
41 --disable-network: compile LBreakout2 without any network
42 support
43 --enable-sdl-net: use SDL_net for networking (required if
44 platform is not Unix-like)
45 --localstatedir: install global highscores to this directory
46 REPLACES --with-highscore-path TO COMPLY
47 WITH AUTOCONF; THE DEFAULT LOCATION NOW
48 DEPENDS ON YOUR DISTRIBUTION: PREVIOUSLY
49 IT WAS /var/lib/games. USE
50 --localstatedir=/var/lib/games
51 FOR EXISTING HIGHSCORES.
4152 > make
4253 > su (become root)
4354 > make install (if install wasn't disabled)
4455 > exit (become user again)
45 > lbreakout2 (run game)
56 > lbreakout2 (run client/non-network game)
4657
47 !!! NOTE: Since 2.1.2 the config directory is ~/.lgames instead
48 of ~/.lbreakout2. If you created levelsets with a previous version
49 you'll have to copy these sets from ~/.lbreakout2/levels to
50 ~/.lgames/lbreakout2-levels !!!
51 The directory ~/.lbreakout2 is obsolete and may be deleted.
58 Building on Win32
59 -----------------
60 There might be an easier way to get things to work but at least
61 the following worked for me. Simplifications are welcome.
5262
63 1) Get MinGW, Msys, MsysDTK from http://mingw.sf.net
64 The following uses michael as the Msys home directory, naturally
65 you'll have to substitute your windows user name for this.
66 2) Get SDL, SDL_mixer, SDL_net from http://libsdl.org as tar.gz's
67 and put them to c:\msys\1.0\home\michael (or whereever you
68 installed Msys to)
69 3) Get libpng and zlib from http://libpng.org and put them to the
70 same directory as above.
71 4) Same with the latest and greatest LBreakout2 package, which you
72 already have, I assume. :)
73 5) Start Msys and enter the commands
74 tar -xzf *.tar.gz (extract the above archives)
75 cd SDL-1.2.7; (your version might differ, of course)
76 configure; make; make install;
77 cd ..
78 [do the same with SDL_net, SDL_mixer, zlib]
79 ln -s libpng-1.2.5 libpng (your version might differ, of course)
80 ln -s zlib-1.1.3 zlib (your version might differ, of course)
81 cd libpng-1.2.5
82 cp scripts/makefile.gcc Makefile; make
83 cp png.h pngconf.h /usr/local/include
84 cp libpng.a /usr/local/lib (manual install as the linux makefile
85 caused problems)
86 cd ..
87 cd lbreakout2-2.5
88 export LDFLAGS="-L/usr/local/lib"
89 export CFLAGS="-I/usr/local/include"
90 echo '' > depcomp (why this is required is again a mystery to me)
91 configure --disable-install --enable-sdl-net
92 win32_mancomp (this is a hack required for unknown reasons here.
93 make works but it just states the gcc commands but does
94 not execute them, in this little script they work however,
95 dunno why... a fix for this would be most welcome. if you
96 change any configure or install settings the hardcoded
97 compile command in win32_mancomp will probably not work so
98 you should check it for such a case)
99 make
100 6) Get the dll's of SDL, SDL_mixer, SDL_net, libpng, zlib and put
101 them to c:\msys\1.0\home\michael\lbreakout2-2.5\win32dlls as well
102 as msvcrt.dll (freely available from Microsoft)
103 7) run win32_preparchive (this will copy all required files to
104 the directory lbreakout2)
105 8) copy c:\msys\1.0\home\michael\lbreakout2-2.5\lbreakout2 to
106 c:\games or whereever you want to and run the game from there.
107 NOTE: The server does not open any display and in windows a message
108 overwrites all old messages in stdout.txt. Also the command line options
109 do not work, at least it seems so. All I managed was to run the server
110 without any options but at least I could connect to it successfully.
111
112 Lee Read added some scripting to create a standalone installer. This
113 scripting is broken right now, but hopefully fixed soon.
53114
54115 ********************
55 III. Documentation
116 III. Network Server
117 ********************
118 To run a server start lbreakout2server with any of the following
119 options:
120 -p <PORT> server port (default 2002)
121 -l <LIMIT> maximum number of users that may connect to the server
122 (default is 30)
123 -i <IDLETIME> a user will be kicked if he didn't communicate with the
124 server for this amount of seconds (default is 1200)
125 -n <MESSAGE> this message is displayed to welcome a user
126 -a <PASSWORD> a user that logs in with this name will become
127 administrator named admin (default is no admin)
128 -b <BOTNUM> number of bots with strength 800 and 1000 (paddle speed
129 in pixels, default is none)
130 After that you'll have to query your IP (e.g. with
131 /sbin/ifconfig) and pass it to your friends as there is no permanent
132 internet server yet. Note, that you shouldn't use localhost as you
133 won't be able to challenge others then.
134 Check the online documentation at http://lgames.sf.net
135 for information on how to play.
136 When updating this README the last time, petersdtp.net:8000 has been
137 the current internet test server.
138
139 ********************
140 IV. Documentation
56141 ********************
57142 If you have any questions about options, game play or editor
58143 please check the documentation and see if you
62147 bug please contact me: kulkanie@gmx.net
63148
64149 ********************
65 IV. Troubleshooting
150 V. Troubleshooting
66151 ********************
67152 The solution for relative mouse motion (nescessary when inverting or
68153 slowing down mouse by motion modifier) works fine for Linux and
75160 ---
76161 Disabling sound while playing seems to result in loosing various
77162 sound channels when some sounds were actually mixed.
78 ---
79 For my system 1.4 is 1.399978 instad of 1.4 so wrong score
80 is added in the end. Sorry, not my fault. If anyone got a cool idea
81 to tell gcc this obvious point let me know.
82163 ---
83164 Someone reported that he had problems with PNG (configure script
84165 didn't find it) if it was installed to /usr/local/lib.
95176 not change the solution make sure that you have 640x480 available
96177 as resolution in your Xconfig.
97178 ---
98 If the SDL sound seems to be out of sync set
99 SDL_AUDIODRIVER to dma (export SDL_AUDIODRIVER=dma).
179 If the SDL sound seems to be out of sync first try
180 to modify the audio buffer size in ~/.lgames/lbreakout2.conf.
181 If this fails set SDL_AUDIODRIVER to dma (export SDL_AUDIODRIVER=dma).
100182
101183 ********************
102 V. Resources
184 VI. Resources
103185 ********************
104186 Some graphics and sounds has been taken and modified from other
105187 non-copyrighted resources:
108190 Thanks to all of these guys for there free stuff!
109191
110192 ********************
111 VI. Feedback
193 VII. Feedback
112194 ********************
113 LGames URL: http://www.lgames.org
195 LGames URL: http://www.lgames.sf.net
114196 e-Mail: kulkanie@gmx.net
115197
0
1 Please distribute this file with the SDL runtime environment:
2
3 The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library
4 designed to make it easy to write multi-media software, such as games and
5 emulators.
6
7 The Simple DirectMedia Layer library source code is available from:
8 http://www.libsdl.org/
9
10 This library is distributed under the terms of the GNU LGPL license:
11 http://www.gnu.org/copyleft/lesser.html
12
0 -shadow surface for zoom
1 -lower corner sensitivity
0 - allow themes to have several 'between level' screens
1 - udp flooding after game finished
2 - allow additional weapon graphic/animation planted on top
3 of the paddle
4 - improve pre-calculation of networked ball movement (dummy reflect)
5 - joystick as input
6 - shadow surface for zoom
7
0 dnl SDL Stuff
1
02 # Configure paths for SDL
13 # Sam Lantinga 9/21/99
24 # stolen from Manish Singh
159161 AC_SUBST(SDL_LIBS)
160162 rm -f conf.sdltest
161163 ])
164
165 dnl
166 dnl Search for specific programs
167 dnl
168
169 dnl zip to pakcage win32 installer
170 AC_DEFUN(AC_PROG_ZIP,[
171 AC_CHECK_PROG(ZIP, zip, zip)
172 test -z "${ZIP}" && AC_MSG_ERROR(zip was not found on this system)
173 ])
174
175 dnl strip reduces executable size by getting rid of extreneous symbols
176 AC_DEFUN(AC_PROG_STRIP,[
177 AC_CHECK_PROG(STRIP, strip, strip)
178 test -z "${STRIP}" && AC_MSG_ERROR(strip was not found on this system)
179 ])
180
181 dnl Inno Setup 2 iscc is the win32 installer script compiler
182 AC_DEFUN(AC_PROG_ISCC,[
183 AC_CHECK_PROG(ISCC, iscc, iscc)
184 test -z "${ISCC}" && AC_MSG_ERROR(Inno Setup 2 iscc was not found on this system)
185 ])
186
0 dnl aclocal.m4 generated automatically by aclocal 1.4
0 dnl aclocal.m4 generated automatically by aclocal 1.4-p4
11
22 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
33 dnl This file is free software; the Free Software Foundation
88 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
99 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
1010 dnl PARTICULAR PURPOSE.
11
12 dnl SDL Stuff
1113
1214 # Configure paths for SDL
1315 # Sam Lantinga 9/21/99
172174 rm -f conf.sdltest
173175 ])
174176
177 dnl
178 dnl Search for specific programs
179 dnl
180
181 dnl zip to pakcage win32 installer
182 AC_DEFUN(AC_PROG_ZIP,[
183 AC_CHECK_PROG(ZIP, zip, zip)
184 test -z "${ZIP}" && AC_MSG_ERROR(zip was not found on this system)
185 ])
186
187 dnl strip reduces executable size by getting rid of extreneous symbols
188 AC_DEFUN(AC_PROG_STRIP,[
189 AC_CHECK_PROG(STRIP, strip, strip)
190 test -z "${STRIP}" && AC_MSG_ERROR(strip was not found on this system)
191 ])
192
193 dnl Inno Setup 2 iscc is the win32 installer script compiler
194 AC_DEFUN(AC_PROG_ISCC,[
195 AC_CHECK_PROG(ISCC, iscc, iscc)
196 test -z "${ISCC}" && AC_MSG_ERROR(Inno Setup 2 iscc was not found on this system)
197 ])
198
199
175200 # Like AC_CONFIG_HEADER, but automatically create stamp file.
176201
177202 AC_DEFUN(AM_CONFIG_HEADER,
0 DEFS = @network_flag@ @sdlnet_flag@ @arch_flag@ @warp_flag@ @audio_flag@ @inst_flag@ @hi_inst_flag@ @DEFS@
1
2 lbreakout2res.o: win32.ico
3 @echo "1 VERSIONINFO" > $(PACKAGE).rc
4 @echo "FILEVERSION `echo $(VERSION) | $(AWK) 'ORS=""; { subs = gsub(/\./,","); print $0; for (ndx=subs; ndx < 3; ndx++) print ",0"; }'`" >> $(PACKAGE).rc
5 @echo "PRODUCTVERSION `echo $(VERSION) | $(AWK) 'ORS=""; { subs = gsub(/\./,","); print $0; for (ndx=subs; ndx < 3; ndx++) print ",0"; }'`" >> $(PACKAGE).rc
6 @echo "FILEFLAGSMASK 0" >> $(PACKAGE).rc
7 @echo "FILEOS 0x40000" >> $(PACKAGE).rc
8 @echo "FILETYPE 1" >> $(PACKAGE).rc
9 @echo "{" >> $(PACKAGE).rc
10 @echo " BLOCK \"StringFileInfo\"" >> $(PACKAGE).rc
11 @echo " {" >> $(PACKAGE).rc
12 @echo " BLOCK \"040904E4\"" >> $(PACKAGE).rc
13 @echo " {" >> $(PACKAGE).rc
14 @echo " VALUE \"CompanyName\", \"LGames - Michael Speck\"" >> $(PACKAGE).rc
15 @echo " VALUE \"FileDescription\", \"@appname@\"" >> $(PACKAGE).rc
16 @echo " VALUE \"FileVersion\", \"$(VERSION)\"" >> $(PACKAGE).rc
17 @echo " VALUE \"InternalName\", \"$(PACKAGE)\"" >> $(PACKAGE).rc
18 @echo " VALUE \"LegalCopyright\", \"GNU Public License\"" >> $(PACKAGE).rc
19 @echo " VALUE \"OriginalFilename\", \"$(PACKAGE)$(EXEEXT)\"" >> $(PACKAGE).rc
20 @echo " VALUE \"ProductName\", \"@appname@\"" >> $(PACKAGE).rc
21 @echo " VALUE \"ProductVersion\", \"$(VERSION)\"" >> $(PACKAGE).rc
22 @echo " }" >> $(PACKAGE).rc
23 @echo " }" >> $(PACKAGE).rc
24 @echo "}" >> $(PACKAGE).rc
25 @echo "0 ICON win32.ico" >> $(PACKAGE).rc
26 @windres -o $@ -i $(PACKAGE).rc
27
28 bin_PROGRAMS = lbreakout2
29 lbreakout2_SOURCES = credit.c shine.c extras.c balls.c shrapnells.c \
30 shots.c event.c paddle.c frame.c misc.c bricks.c player.c \
31 file.c config.c \
32 item.c menu.c manager.c value.c chart.c \
33 editor.c help.c hint.c theme.c client.c client_recv.c \
34 client_data.c client_handlers.c game.c comm.c slot.c \
35 display.c main.c win32.ico
36 lbreakout2_DEPENDENCIES = @win32_deps@
37 lbreakout2_LDADD = @win32_deps@ ../common/libcommon.a ../gui/libGui.a ../game/libgame.a @mixer_flag@ @sdlnet_lib_flag@
38
39 EXTRA_DIST = credit.h shine.h extras.h balls.h shrapnells.h \
40 shots.h event.h paddle.h frame.h misc.h bricks.h player.h \
41 file.h config.h lbreakout.h \
42 item.h menu.h manager.h value.h chart.h \
43 editor.h help.h hint.h theme.h client.h client_data.h \
44 client_handlers.h game.h comm.h slot.h \
45 display.h empty.hscr
46
47 SUBDIRS = gfx sounds levels gui_theme
48
49 install-data-local:
50 $(mkinstalldirs) $(DESTDIR)$(inst_dir)
51 $(mkinstalldirs) $(DESTDIR)$(hi_dir)
52 if ! test -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr; then \
53 $(INSTALL_DATA) -m 666 empty.hscr $(DESTDIR)$(hi_dir)/lbreakout2.hscr; \
54 fi;
55
56 uninstall-local:
57 rm -rf $(DESTDIR)$(inst_dir)
58 rm -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr
59 rm -rf $(DESTDIR)$(doc_dir)/lbreakout2
60
61 win32-install-script:
62 @$(STRIP) $(PACKAGE)$(EXEEXT)
63 @echo "Source: \"`pwd -W`\\$(PACKAGE)$(EXEEXT)\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@
64 @list='$(SUBDIRS)'; for subdir in $$list; do \
65 (cd $$subdir \
66 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
67 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 DEFS = @network_flag@ @sdlnet_flag@ @arch_flag@ @warp_flag@ @audio_flag@ @inst_flag@ @hi_inst_flag@ @DEFS@
92
93 bin_PROGRAMS = lbreakout2
94 lbreakout2_SOURCES = credit.c shine.c extras.c balls.c shrapnells.c shots.c event.c paddle.c frame.c misc.c bricks.c player.c file.c config.c item.c menu.c manager.c value.c chart.c editor.c help.c hint.c theme.c client.c client_recv.c client_data.c client_handlers.c game.c comm.c slot.c display.c main.c win32.ico
95
96 lbreakout2_DEPENDENCIES = @win32_deps@
97 lbreakout2_LDADD = @win32_deps@ ../common/libcommon.a ../gui/libGui.a ../game/libgame.a @mixer_flag@ @sdlnet_lib_flag@
98
99 EXTRA_DIST = credit.h shine.h extras.h balls.h shrapnells.h shots.h event.h paddle.h frame.h misc.h bricks.h player.h file.h config.h lbreakout.h item.h menu.h manager.h value.h chart.h editor.h help.h hint.h theme.h client.h client_data.h client_handlers.h game.h comm.h slot.h display.h empty.hscr
100
101
102 SUBDIRS = gfx sounds levels gui_theme
103 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
104 CONFIG_HEADER = ../config.h
105 CONFIG_CLEAN_FILES =
106 bin_PROGRAMS = lbreakout2$(EXEEXT)
107 PROGRAMS = $(bin_PROGRAMS)
108
109 CPPFLAGS = @CPPFLAGS@
110 LDFLAGS = @LDFLAGS@
111 LIBS = @LIBS@
112 lbreakout2_OBJECTS = credit.o shine.o extras.o balls.o shrapnells.o \
113 shots.o event.o paddle.o frame.o misc.o bricks.o player.o file.o \
114 config.o item.o menu.o manager.o value.o chart.o editor.o help.o hint.o \
115 theme.o client.o client_recv.o client_data.o client_handlers.o game.o \
116 comm.o slot.o display.o main.o
117 lbreakout2_LDFLAGS =
118 CFLAGS = @CFLAGS@
119 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
120 CCLD = $(CC)
121 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
122 DIST_COMMON = Makefile.am Makefile.in
123
124
125 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
126
127 TAR = tar
128 GZIP_ENV = --best
129 SOURCES = $(lbreakout2_SOURCES)
130 OBJECTS = $(lbreakout2_OBJECTS)
131
132 all: all-redirect
133 .SUFFIXES:
134 .SUFFIXES: .S .c .o .s
135 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
136 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/Makefile
137
138 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
139 cd $(top_builddir) \
140 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
141
142
143 mostlyclean-binPROGRAMS:
144
145 clean-binPROGRAMS:
146 -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
147
148 distclean-binPROGRAMS:
149
150 maintainer-clean-binPROGRAMS:
151
152 install-binPROGRAMS: $(bin_PROGRAMS)
153 @$(NORMAL_INSTALL)
154 $(mkinstalldirs) $(DESTDIR)$(bindir)
155 @list='$(bin_PROGRAMS)'; for p in $$list; do \
156 if test -f $$p; then \
157 echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
158 $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
159 else :; fi; \
160 done
161
162 uninstall-binPROGRAMS:
163 @$(NORMAL_UNINSTALL)
164 list='$(bin_PROGRAMS)'; for p in $$list; do \
165 rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
166 done
167
168 .c.o:
169 $(COMPILE) -c $<
170
171 .s.o:
172 $(COMPILE) -c $<
173
174 .S.o:
175 $(COMPILE) -c $<
176
177 mostlyclean-compile:
178 -rm -f *.o core *.core
179
180 clean-compile:
181
182 distclean-compile:
183 -rm -f *.tab.c
184
185 maintainer-clean-compile:
186
187 lbreakout2$(EXEEXT): $(lbreakout2_OBJECTS) $(lbreakout2_DEPENDENCIES)
188 @rm -f lbreakout2$(EXEEXT)
189 $(LINK) $(lbreakout2_LDFLAGS) $(lbreakout2_OBJECTS) $(lbreakout2_LDADD) $(LIBS)
190
191 # This directory's subdirectories are mostly independent; you can cd
192 # into them and run `make' without going through this Makefile.
193 # To change the values of `make' variables: instead of editing Makefiles,
194 # (1) if the variable is set in `config.status', edit `config.status'
195 # (which will cause the Makefiles to be regenerated when you run `make');
196 # (2) otherwise, pass the desired values on the `make' command line.
197
198 @SET_MAKE@
199
200 all-recursive install-data-recursive install-exec-recursive \
201 installdirs-recursive install-recursive uninstall-recursive \
202 check-recursive installcheck-recursive info-recursive dvi-recursive:
203 @set fnord $(MAKEFLAGS); amf=$$2; \
204 dot_seen=no; \
205 target=`echo $@ | sed s/-recursive//`; \
206 list='$(SUBDIRS)'; for subdir in $$list; do \
207 echo "Making $$target in $$subdir"; \
208 if test "$$subdir" = "."; then \
209 dot_seen=yes; \
210 local_target="$$target-am"; \
211 else \
212 local_target="$$target"; \
213 fi; \
214 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
215 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
216 done; \
217 if test "$$dot_seen" = "no"; then \
218 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
219 fi; test -z "$$fail"
220
221 mostlyclean-recursive clean-recursive distclean-recursive \
222 maintainer-clean-recursive:
223 @set fnord $(MAKEFLAGS); amf=$$2; \
224 dot_seen=no; \
225 rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
226 rev="$$subdir $$rev"; \
227 test "$$subdir" = "." && dot_seen=yes; \
228 done; \
229 test "$$dot_seen" = "no" && rev=". $$rev"; \
230 target=`echo $@ | sed s/-recursive//`; \
231 for subdir in $$rev; do \
232 echo "Making $$target in $$subdir"; \
233 if test "$$subdir" = "."; then \
234 local_target="$$target-am"; \
235 else \
236 local_target="$$target"; \
237 fi; \
238 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
239 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
240 done && test -z "$$fail"
241 tags-recursive:
242 list='$(SUBDIRS)'; for subdir in $$list; do \
243 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
244 done
245
246 tags: TAGS
247
248 ID: $(HEADERS) $(SOURCES) $(LISP)
249 list='$(SOURCES) $(HEADERS)'; \
250 unique=`for i in $$list; do echo $$i; done | \
251 awk ' { files[$$0] = 1; } \
252 END { for (i in files) print i; }'`; \
253 here=`pwd` && cd $(srcdir) \
254 && mkid -f$$here/ID $$unique $(LISP)
255
256 TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
257 tags=; \
258 here=`pwd`; \
259 list='$(SUBDIRS)'; for subdir in $$list; do \
260 if test "$$subdir" = .; then :; else \
261 test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
262 fi; \
263 done; \
264 list='$(SOURCES) $(HEADERS)'; \
265 unique=`for i in $$list; do echo $$i; done | \
266 awk ' { files[$$0] = 1; } \
267 END { for (i in files) print i; }'`; \
268 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
269 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
270
271 mostlyclean-tags:
272
273 clean-tags:
274
275 distclean-tags:
276 -rm -f TAGS ID
277
278 maintainer-clean-tags:
279
280 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
281
282 subdir = client
283
284 distdir: $(DISTFILES)
285 @for file in $(DISTFILES); do \
286 d=$(srcdir); \
287 if test -d $$d/$$file; then \
288 cp -pr $$d/$$file $(distdir)/$$file; \
289 else \
290 test -f $(distdir)/$$file \
291 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
292 || cp -p $$d/$$file $(distdir)/$$file || :; \
293 fi; \
294 done
295 for subdir in $(SUBDIRS); do \
296 if test "$$subdir" = .; then :; else \
297 test -d $(distdir)/$$subdir \
298 || mkdir $(distdir)/$$subdir \
299 || exit 1; \
300 chmod 777 $(distdir)/$$subdir; \
301 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
302 || exit 1; \
303 fi; \
304 done
305 audio.o: audio.c lbreakout.h sdl.h ../common/tools.h ../common/list.h \
306 ../common/net.h ../server/server.h misc.h audio.h
307 balls.o: balls.c lbreakout.h ../gui/stk.h ../common/tools.h \
308 ../common/list.h ../common/net.h ../common/messages.h \
309 ../game/gamedefs.h misc.h ../game/game.h \
310 ../game/../client/lbreakout.h ../game/mathfuncs.h \
311 ../game/levels.h ../game/extras.h ../game/balls.h \
312 ../game/shots.h ../game/bricks.h ../game/paddle.h \
313 ../game/comm.h bricks.h
314 bricks.o: bricks.c ../game/game.h ../game/../client/lbreakout.h \
315 ../game/../client/../gui/stk.h \
316 ../game/../client/../common/tools.h \
317 ../game/../client/../common/list.h \
318 ../game/../client/../common/net.h \
319 ../game/../client/../common/messages.h \
320 ../game/../client/../game/gamedefs.h ../game/../client/misc.h \
321 ../game/mathfuncs.h ../game/levels.h ../game/extras.h \
322 ../game/balls.h ../game/shots.h ../game/bricks.h \
323 ../game/paddle.h ../game/comm.h lbreakout.h shrapnells.h \
324 bricks.h
325 chart.o: chart.c lbreakout.h ../gui/stk.h ../common/tools.h \
326 ../common/list.h ../common/net.h ../common/messages.h \
327 ../game/gamedefs.h misc.h config.h chart.h
328 client.o: client.c lbreakout.h ../gui/stk.h ../common/tools.h \
329 ../common/list.h ../common/net.h ../common/messages.h \
330 ../game/gamedefs.h misc.h config.h event.h ../gui/gui.h \
331 ../gui/gui_widget.h ../gui/list.h ../gui/gui_theme.h \
332 ../gui/gui_box.h ../gui/gui_label.h ../gui/gui_icon.h \
333 ../gui/gui_button.h ../gui/gui_radiogroup.h \
334 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
335 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h \
336 client_data.h client_handlers.h client.h
337 client_data.o: client_data.c client_data.h lbreakout.h ../gui/stk.h \
338 ../common/tools.h ../common/list.h ../common/net.h \
339 ../common/messages.h ../game/gamedefs.h misc.h ../gui/gui.h \
340 ../gui/gui_widget.h ../gui/list.h ../gui/gui_theme.h \
341 ../gui/gui_box.h ../gui/gui_label.h ../gui/gui_icon.h \
342 ../gui/gui_button.h ../gui/gui_radiogroup.h \
343 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
344 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h
345 client_game.o: client_game.c lbreakout.h ../gui/stk.h ../common/tools.h \
346 ../common/list.h ../common/net.h ../common/messages.h misc.h \
347 config.h event.h ../gui/gui.h ../gui/gui_widget.h ../gui/list.h \
348 ../gui/gui_theme.h ../gui/gui_box.h ../gui/gui_label.h \
349 ../gui/gui_icon.h ../gui/gui_button.h ../gui/gui_radiogroup.h \
350 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
351 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h \
352 client_data.h levels.h player.h paddle.h game.h
353 client_handlers.o: client_handlers.c lbreakout.h ../gui/stk.h \
354 ../common/tools.h ../common/list.h ../common/net.h \
355 ../common/messages.h ../game/gamedefs.h misc.h config.h \
356 ../gui/gui.h ../gui/gui_widget.h ../gui/list.h \
357 ../gui/gui_theme.h ../gui/gui_box.h ../gui/gui_label.h \
358 ../gui/gui_icon.h ../gui/gui_button.h ../gui/gui_radiogroup.h \
359 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
360 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h \
361 client_data.h client_handlers.h comm.h game.h
362 client_recv.o: client_recv.c lbreakout.h ../gui/stk.h ../common/tools.h \
363 ../common/list.h ../common/net.h ../common/messages.h \
364 ../game/gamedefs.h misc.h client_data.h game.h ../game/game.h \
365 ../game/../client/lbreakout.h ../game/mathfuncs.h \
366 ../game/levels.h ../game/extras.h ../game/balls.h \
367 ../game/shots.h ../game/bricks.h ../game/paddle.h \
368 ../game/comm.h ../gui/gui.h ../gui/gui_widget.h ../gui/list.h \
369 ../gui/gui_theme.h ../gui/gui_box.h ../gui/gui_label.h \
370 ../gui/gui_icon.h ../gui/gui_button.h ../gui/gui_radiogroup.h \
371 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
372 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h
373 comm.o: comm.c lbreakout.h ../gui/stk.h ../common/tools.h \
374 ../common/list.h ../common/net.h ../common/messages.h \
375 ../game/gamedefs.h misc.h ../gui/gui.h ../gui/gui_widget.h \
376 ../gui/list.h ../gui/gui_theme.h ../gui/gui_box.h \
377 ../gui/gui_label.h ../gui/gui_icon.h ../gui/gui_button.h \
378 ../gui/gui_radiogroup.h ../gui/gui_progressbar.h \
379 ../gui/gui_scrollbar.h ../gui/gui_edit.h ../gui/gui_list.h \
380 ../gui/gui_spinbutton.h ../game/game.h \
381 ../game/../client/lbreakout.h ../game/mathfuncs.h \
382 ../game/levels.h ../game/extras.h ../game/balls.h \
383 ../game/shots.h ../game/bricks.h ../game/paddle.h \
384 ../game/comm.h game.h client_data.h bricks.h extras.h comm.h
385 config.o: config.c lbreakout.h ../gui/stk.h ../common/tools.h \
386 ../common/list.h ../common/net.h ../common/messages.h \
387 ../game/gamedefs.h misc.h config.h ../common/parser.h
388 credit.o: credit.c lbreakout.h ../gui/stk.h ../common/tools.h \
389 ../common/list.h ../common/net.h ../common/messages.h \
390 ../game/gamedefs.h misc.h credit.h
391 difficulty.o: difficulty.c lbreakout.h ../gui/stk.h ../common/tools.h \
392 ../common/list.h ../common/net.h ../common/messages.h \
393 ../game/gamedefs.h misc.h difficulty.h
394 display.o: display.c lbreakout.h ../gui/stk.h ../common/tools.h \
395 ../common/list.h ../common/net.h ../common/messages.h \
396 ../game/gamedefs.h misc.h display.h
397 editor.o: editor.c lbreakout.h ../gui/stk.h ../common/tools.h \
398 ../common/list.h ../common/net.h ../common/messages.h \
399 ../game/gamedefs.h misc.h ../game/game.h \
400 ../game/../client/lbreakout.h ../game/mathfuncs.h \
401 ../game/levels.h ../game/extras.h ../game/balls.h \
402 ../game/shots.h ../game/bricks.h ../game/paddle.h \
403 ../game/comm.h game.h config.h bricks.h frame.h editor.h
404 event.o: event.c lbreakout.h ../gui/stk.h ../common/tools.h \
405 ../common/list.h ../common/net.h ../common/messages.h \
406 ../game/gamedefs.h misc.h event.h
407 extras.o: extras.c lbreakout.h ../gui/stk.h ../common/tools.h \
408 ../common/list.h ../common/net.h ../common/messages.h \
409 ../game/gamedefs.h misc.h ../game/game.h \
410 ../game/../client/lbreakout.h ../game/mathfuncs.h \
411 ../game/levels.h ../game/extras.h ../game/balls.h \
412 ../game/shots.h ../game/bricks.h ../game/paddle.h \
413 ../game/comm.h bricks.h shrapnells.h player.h paddle.h frame.h
414 file.o: file.c ../common/list.h ../common/tools.h file.h
415 frame.o: frame.c lbreakout.h ../gui/stk.h ../common/tools.h \
416 ../common/list.h ../common/net.h ../common/messages.h \
417 ../game/gamedefs.h misc.h config.h player.h display.h frame.h
418 game.o: game.c lbreakout.h ../gui/stk.h ../common/tools.h \
419 ../common/list.h ../common/net.h ../common/messages.h \
420 ../game/gamedefs.h misc.h ../game/game.h \
421 ../game/../client/lbreakout.h ../game/mathfuncs.h \
422 ../game/levels.h ../game/extras.h ../game/balls.h \
423 ../game/shots.h ../game/bricks.h ../game/paddle.h \
424 ../game/comm.h ../gui/gui.h ../gui/gui_widget.h ../gui/list.h \
425 ../gui/gui_theme.h ../gui/gui_box.h ../gui/gui_label.h \
426 ../gui/gui_icon.h ../gui/gui_button.h ../gui/gui_radiogroup.h \
427 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
428 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h \
429 client_data.h event.h config.h shrapnells.h player.h display.h \
430 paddle.h chart.h shine.h credit.h bricks.h shots.h frame.h \
431 balls.h extras.h help.h game.h comm.h slot.h hint.h manager.h \
432 value.h item.h menu.h
433 gui.o: gui.c lbreakout.h sdl.h ../common/tools.h ../common/list.h \
434 ../common/net.h ../server/server.h misc.h config.h manager.h \
435 value.h item.h hint.h menu.h windows.h image.h gui.h levels.h
436 help.o: help.c lbreakout.h ../gui/stk.h ../common/tools.h \
437 ../common/list.h ../common/net.h ../common/messages.h \
438 ../game/gamedefs.h misc.h event.h
439 hint.o: hint.c lbreakout.h ../gui/stk.h ../common/tools.h \
440 ../common/list.h ../common/net.h ../common/messages.h \
441 ../game/gamedefs.h misc.h hint.h config.h
442 image.o: image.c sdl.h image.h
443 item.o: item.c manager.h lbreakout.h ../gui/stk.h ../common/tools.h \
444 ../common/list.h ../common/net.h ../common/messages.h \
445 ../game/gamedefs.h misc.h value.h item.h hint.h menu.h
446 levels.o: levels.c lbreakout.h ../gui/stk.h ../common/tools.h \
447 ../common/list.h ../common/net.h ../common/messages.h misc.h \
448 config.h file.h levels.h
449 list.o: list.c list.h
450 main.o: main.c ../config.h lbreakout.h ../gui/stk.h ../common/tools.h \
451 ../common/list.h ../common/net.h ../common/messages.h \
452 ../game/gamedefs.h misc.h ../game/game.h \
453 ../game/../client/lbreakout.h ../game/mathfuncs.h \
454 ../game/levels.h ../game/extras.h ../game/balls.h \
455 ../game/shots.h ../game/bricks.h ../game/paddle.h \
456 ../game/comm.h file.h chart.h config.h shrapnells.h event.h \
457 game.h manager.h value.h item.h hint.h menu.h editor.h help.h \
458 theme.h client.h ../gui/gui.h ../gui/gui_widget.h ../gui/list.h \
459 ../gui/gui_theme.h ../gui/gui_box.h ../gui/gui_label.h \
460 ../gui/gui_icon.h ../gui/gui_button.h ../gui/gui_radiogroup.h \
461 ../gui/gui_progressbar.h ../gui/gui_scrollbar.h \
462 ../gui/gui_edit.h ../gui/gui_list.h ../gui/gui_spinbutton.h
463 manager.o: manager.c manager.h lbreakout.h ../gui/stk.h \
464 ../common/tools.h ../common/list.h ../common/net.h \
465 ../common/messages.h ../game/gamedefs.h misc.h value.h item.h \
466 hint.h menu.h ../game/game.h ../game/../client/lbreakout.h \
467 ../game/mathfuncs.h ../game/levels.h ../game/extras.h \
468 ../game/balls.h ../game/shots.h ../game/bricks.h \
469 ../game/paddle.h ../game/comm.h file.h chart.h event.h config.h \
470 theme.h slot.h
471 menu.o: menu.c manager.h lbreakout.h ../gui/stk.h ../common/tools.h \
472 ../common/list.h ../common/net.h ../common/messages.h \
473 ../game/gamedefs.h misc.h value.h item.h hint.h menu.h
474 misc.o: misc.c lbreakout.h ../gui/stk.h ../common/tools.h \
475 ../common/list.h ../common/net.h ../common/messages.h \
476 ../game/gamedefs.h misc.h ../game/game.h \
477 ../game/../client/lbreakout.h ../game/mathfuncs.h \
478 ../game/levels.h ../game/extras.h ../game/balls.h \
479 ../game/shots.h ../game/bricks.h ../game/paddle.h \
480 ../game/comm.h config.h event.h
481 paddle.o: paddle.c lbreakout.h ../gui/stk.h ../common/tools.h \
482 ../common/list.h ../common/net.h ../common/messages.h \
483 ../game/gamedefs.h misc.h config.h paddle.h ../game/game.h \
484 ../game/../client/lbreakout.h ../game/mathfuncs.h \
485 ../game/levels.h ../game/extras.h ../game/balls.h \
486 ../game/shots.h ../game/bricks.h ../game/paddle.h \
487 ../game/comm.h
488 player.o: player.c lbreakout.h ../gui/stk.h ../common/tools.h \
489 ../common/list.h ../common/net.h ../common/messages.h \
490 ../game/gamedefs.h misc.h ../game/levels.h \
491 ../game/../client/lbreakout.h player.h
492 png.o: png.c
493 sdl.o: sdl.c sdl.h png.h
494 shine.o: shine.c lbreakout.h ../gui/stk.h ../common/tools.h \
495 ../common/list.h ../common/net.h ../common/messages.h \
496 ../game/gamedefs.h misc.h config.h
497 shots.o: shots.c lbreakout.h ../gui/stk.h ../common/tools.h \
498 ../common/list.h ../common/net.h ../common/messages.h \
499 ../game/gamedefs.h misc.h ../game/game.h \
500 ../game/../client/lbreakout.h ../game/mathfuncs.h \
501 ../game/levels.h ../game/extras.h ../game/balls.h \
502 ../game/shots.h ../game/bricks.h ../game/paddle.h \
503 ../game/comm.h
504 shrapnells.o: shrapnells.c lbreakout.h ../gui/stk.h ../common/tools.h \
505 ../common/list.h ../common/net.h ../common/messages.h \
506 ../game/gamedefs.h misc.h ../game/mathfuncs.h config.h \
507 shrapnells.h
508 slot.o: slot.c lbreakout.h ../gui/stk.h ../common/tools.h \
509 ../common/list.h ../common/net.h ../common/messages.h \
510 ../game/gamedefs.h misc.h slot.h hint.h
511 theme.o: theme.c ../config.h lbreakout.h ../gui/stk.h ../common/tools.h \
512 ../common/list.h ../common/net.h ../common/messages.h \
513 ../game/gamedefs.h misc.h config.h theme.h
514 tools.o: tools.c tools.h
515 value.o: value.c manager.h lbreakout.h ../gui/stk.h ../common/tools.h \
516 ../common/list.h ../common/net.h ../common/messages.h \
517 ../game/gamedefs.h misc.h value.h item.h hint.h menu.h
518 windows.o: windows.c lbreakout.h ../gui/stk.h sdl.h ../common/tools.h \
519 ../common/list.h ../common/net.h ../server/server.h misc.h \
520 file.h event.h windows.h image.h
521
522 info-am:
523 info: info-recursive
524 dvi-am:
525 dvi: dvi-recursive
526 check-am: all-am
527 check: check-recursive
528 installcheck-am:
529 installcheck: installcheck-recursive
530 install-exec-am: install-binPROGRAMS
531 install-exec: install-exec-recursive
532
533 install-data-am: install-data-local
534 install-data: install-data-recursive
535
536 install-am: all-am
537 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
538 install: install-recursive
539 uninstall-am: uninstall-binPROGRAMS uninstall-local
540 uninstall: uninstall-recursive
541 all-am: Makefile $(PROGRAMS)
542 all-redirect: all-recursive
543 install-strip:
544 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
545 installdirs: installdirs-recursive
546 installdirs-am:
547 $(mkinstalldirs) $(DESTDIR)$(bindir)
548
549
550 mostlyclean-generic:
551
552 clean-generic:
553
554 distclean-generic:
555 -rm -f Makefile $(CONFIG_CLEAN_FILES)
556 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
557
558 maintainer-clean-generic:
559 mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
560 mostlyclean-tags mostlyclean-generic
561
562 mostlyclean: mostlyclean-recursive
563
564 clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \
565 mostlyclean-am
566
567 clean: clean-recursive
568
569 distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \
570 distclean-generic clean-am
571
572 distclean: distclean-recursive
573
574 maintainer-clean-am: maintainer-clean-binPROGRAMS \
575 maintainer-clean-compile maintainer-clean-tags \
576 maintainer-clean-generic distclean-am
577 @echo "This command is intended for maintainers to use;"
578 @echo "it deletes files that may require special tools to rebuild."
579
580 maintainer-clean: maintainer-clean-recursive
581
582 .PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
583 maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
584 mostlyclean-compile distclean-compile clean-compile \
585 maintainer-clean-compile install-data-recursive \
586 uninstall-data-recursive install-exec-recursive \
587 uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
588 all-recursive check-recursive installcheck-recursive info-recursive \
589 dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
590 maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
591 distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
592 dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
593 install-exec install-data-local install-data-am install-data install-am \
594 install uninstall-local uninstall-am uninstall all-redirect all-am all \
595 installdirs-am installdirs mostlyclean-generic distclean-generic \
596 clean-generic maintainer-clean-generic clean mostlyclean distclean \
597 maintainer-clean
598
599
600 lbreakout2res.o: win32.ico
601 @echo "1 VERSIONINFO" > $(PACKAGE).rc
602 @echo "FILEVERSION `echo $(VERSION) | $(AWK) 'ORS=""; { subs = gsub(/\./,","); print $0; for (ndx=subs; ndx < 3; ndx++) print ",0"; }'`" >> $(PACKAGE).rc
603 @echo "PRODUCTVERSION `echo $(VERSION) | $(AWK) 'ORS=""; { subs = gsub(/\./,","); print $0; for (ndx=subs; ndx < 3; ndx++) print ",0"; }'`" >> $(PACKAGE).rc
604 @echo "FILEFLAGSMASK 0" >> $(PACKAGE).rc
605 @echo "FILEOS 0x40000" >> $(PACKAGE).rc
606 @echo "FILETYPE 1" >> $(PACKAGE).rc
607 @echo "{" >> $(PACKAGE).rc
608 @echo " BLOCK \"StringFileInfo\"" >> $(PACKAGE).rc
609 @echo " {" >> $(PACKAGE).rc
610 @echo " BLOCK \"040904E4\"" >> $(PACKAGE).rc
611 @echo " {" >> $(PACKAGE).rc
612 @echo " VALUE \"CompanyName\", \"LGames - Michael Speck\"" >> $(PACKAGE).rc
613 @echo " VALUE \"FileDescription\", \"@appname@\"" >> $(PACKAGE).rc
614 @echo " VALUE \"FileVersion\", \"$(VERSION)\"" >> $(PACKAGE).rc
615 @echo " VALUE \"InternalName\", \"$(PACKAGE)\"" >> $(PACKAGE).rc
616 @echo " VALUE \"LegalCopyright\", \"GNU Public License\"" >> $(PACKAGE).rc
617 @echo " VALUE \"OriginalFilename\", \"$(PACKAGE)$(EXEEXT)\"" >> $(PACKAGE).rc
618 @echo " VALUE \"ProductName\", \"@appname@\"" >> $(PACKAGE).rc
619 @echo " VALUE \"ProductVersion\", \"$(VERSION)\"" >> $(PACKAGE).rc
620 @echo " }" >> $(PACKAGE).rc
621 @echo " }" >> $(PACKAGE).rc
622 @echo "}" >> $(PACKAGE).rc
623 @echo "0 ICON win32.ico" >> $(PACKAGE).rc
624 @windres -o $@ -i $(PACKAGE).rc
625
626 install-data-local:
627 $(mkinstalldirs) $(DESTDIR)$(inst_dir)
628 $(mkinstalldirs) $(DESTDIR)$(hi_dir)
629 if ! test -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr; then \
630 $(INSTALL_DATA) -m 666 empty.hscr $(DESTDIR)$(hi_dir)/lbreakout2.hscr; \
631 fi;
632
633 uninstall-local:
634 rm -rf $(DESTDIR)$(inst_dir)
635 rm -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr
636 rm -rf $(DESTDIR)$(doc_dir)/lbreakout2
637
638 win32-install-script:
639 @$(STRIP) $(PACKAGE)$(EXEEXT)
640 @echo "Source: \"`pwd -W`\\$(PACKAGE)$(EXEEXT)\"; DestDir: \"{app}\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@
641 @list='$(SUBDIRS)'; for subdir in $$list; do \
642 (cd $$subdir \
643 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
644 done
645
646 # Tell versions [3.59,3.63) of GNU make to not export all variables.
647 # Otherwise a system limit (for SysV at least) may be exceeded.
648 .NOEXPORT:
0 /***************************************************************************
1 balls.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/game.h"
19 #include "bricks.h"
20
21 extern SDL_Surface *ball_pic; /* ball pictures */
22 extern SDL_Surface *ball_shadow;
23 int ball_pic_x_offset = 0; /* display ball at this position */
24 extern int ball_w, ball_h;
25 float ball_metal_alpha_change = 1.2; /* pulse factor */
26 float ball_metal_alpha = 0; /* alpha of ball when blue */
27 extern SDL_Surface *offscreen;
28 extern SDL_Surface *stk_display;
29 extern int shadow_size;
30 extern Game *game;
31
32 /*
33 ====================================================================
34 Locals
35 ====================================================================
36 */
37
38 /*
39 ====================================================================
40 Show/hide all balls
41 ====================================================================
42 */
43 void balls_hide()
44 {
45 ListEntry *entry = game->balls->head->next;
46 Ball *ball;
47 int bx, by, bw, bh;
48 while ( entry != game->balls->tail ) {
49 ball = (Ball*)entry->item;
50 entry = entry->next;
51 /* balls position; add paddle pos if attached */
52 bx = ball->x; by = ball->y;
53 bw = ball_w + shadow_size;
54 bh = ball_h + shadow_size;
55 if (ball->attached) {
56 bx += ball->paddle->x;
57 by += ball->paddle->y;
58 }
59 /* blit background */
60 stk_surface_blit( offscreen,
61 bx, by, bw,bh,
62 stk_display, bx, by );
63 stk_display_store_drect();
64 }
65 }
66 void balls_show_shadow()
67 {
68 ListEntry *entry = game->balls->head->next;
69 int bx, by;
70 int mx, my;
71 Ball *ball;
72 if ( game->extra_active[EX_DARKNESS] ) return;
73 while ( entry != game->balls->tail ) {
74 ball = entry->item;
75 entry = entry->next;
76 /* balls position; add paddle pos if attached */
77 bx = ball->x;
78 by = ball->y;
79 if (ball->attached) {
80 bx += ball->paddle->x;
81 by += ball->paddle->y;
82 }
83 /* show ball -- no shadow if darkness -- no shadow if going back home */
84 if ( !ball->moving_back ) {
85 stk_surface_clip( stk_display, 0, 0, stk_display->w - BRICK_WIDTH, stk_display->h );
86 stk_surface_alpha_blit( ball_shadow, 0, 0, ball_w, ball_h,
87 stk_display, bx + shadow_size, by + shadow_size,
88 (game->extra_active[EX_METAL])?(((int)ball_metal_alpha)>>1):SHADOW_ALPHA );
89 stk_display_store_drect();
90 /* redraw nearby bricks */
91 stk_surface_clip( stk_display, bx + shadow_size, by + shadow_size, ball_w, ball_h );
92 /* check the three outer ocrners of the shadow if there's a brick */
93 mx = ( bx + shadow_size + ball_w ) / BRICK_WIDTH;
94 my = ( by + shadow_size ) / BRICK_HEIGHT;
95 if ( my < MAP_HEIGHT - 1 )
96 if ( mx < MAP_WIDTH - 1 && game->bricks[mx][my].type != MAP_EMPTY )
97 brick_draw( stk_display, mx, my, 0 );
98 mx = ( bx + shadow_size + ball_w ) / BRICK_WIDTH;
99 my = ( by + shadow_size + ball_h ) / BRICK_HEIGHT;
100 if ( my < MAP_HEIGHT - 1 )
101 if ( mx < MAP_WIDTH - 1 && game->bricks[mx][my].type != MAP_EMPTY )
102 brick_draw( stk_display, mx, my, 0 );
103 mx = ( bx + shadow_size ) / BRICK_WIDTH;
104 my = ( by + shadow_size + ball_h ) / BRICK_HEIGHT;
105 if ( my < MAP_HEIGHT - 1 )
106 if ( mx < MAP_WIDTH - 1 && game->bricks[mx][my].type != MAP_EMPTY )
107 brick_draw( stk_display, mx, my, 0 );
108 stk_surface_clip( stk_display, 0, 0, 0, 0 );
109 }
110 }
111 }
112 void balls_show()
113 {
114 ListEntry *entry = game->balls->head->next;
115 Ball *ball;
116 int bx, by;
117 while ( entry != game->balls->tail ) {
118 ball = entry->item;
119 entry = entry->next;
120 /* balls position; add paddle pos if attached */
121 bx = ball->x;
122 by = ball->y;
123 if (ball->attached) {
124 bx += ball->paddle->x;
125 by += ball->paddle->y;
126 }
127 if ( game->extra_active[EX_METAL] )
128 stk_surface_alpha_blit( ball_pic, ball_pic_x_offset, 0,
129 ball_w, ball_h, stk_display, bx, by,
130 ball_metal_alpha );
131 else
132 stk_surface_blit( ball_pic, ball_pic_x_offset, 0,
133 ball_w, ball_h, stk_display, bx, by );
134 stk_display_store_drect();
135 }
136 }
137 void balls_alphashow( int alpha )
138 {
139 ListEntry *entry = game->balls->head->next;
140 Ball *b;
141 int bx, by;
142 while ( entry != game->balls->tail ) {
143 b = entry->item;
144 /* balls position; add paddle pos if attached */
145 bx = b->x;
146 by = b->y;
147 if (b->attached) {
148 bx += b->paddle->x;
149 by += b->paddle->y;
150 }
151 /* show ball */
152 stk_surface_alpha_blit( ball_pic, ball_pic_x_offset, 0,
153 ball_w, ball_h, stk_display, bx, by, alpha );
154 entry = entry->next;
155 }
156 }
157
158 /* reflect ball at brick but destroy nothing */
159 void client_brick_reflect( Ball *b )
160 {
161 float old_vx;
162 Vector n;
163 int reflect;
164 int chaos_reflect;
165
166 /* time left? */
167 if (b->target.cur_tm < b->target.time) return;
168
169 /* will reflect? */
170 reflect = 1;
171 if ( game->extra_active[EX_METAL] )
172 if ( game->bricks[b->target.mx][b->target.my].type != MAP_WALL )
173 reflect = 0;
174
175 /* will reflect chaotic? */
176 chaos_reflect = 0;
177 if ( game->extra_active[EX_CHAOS] ||
178 game->bricks[b->target.mx][b->target.my].type == MAP_BRICK_CHAOS )
179 chaos_reflect = 1;
180
181 /* we have a target and so we have a reset position and even if the ball's
182 not reflected the position must be reset */
183 b->cur.x = b->target.x; b->x = (int)b->cur.x;
184 b->cur.y = b->target.y; b->y = (int)b->cur.y;
185
186 if ( reflect ) {
187 game->mod.paddle_reflected_ball_count++;
188 old_vx = b->vel.x;
189 if ( !chaos_reflect ) {
190 /* normal reflection */
191 n.x = (1-2*b->target.perp_vector.x*b->target.perp_vector.x)*b->vel.x +
192 ( -2*b->target.perp_vector.x*b->target.perp_vector.y)*b->vel.y;
193 n.y = ( -2*b->target.perp_vector.x*b->target.perp_vector.y)*b->vel.x +
194 (1-2*b->target.perp_vector.y*b->target.perp_vector.y)*b->vel.y;
195 b->vel.x = n.x;
196 b->vel.y = n.y;
197 }
198 else {
199 b->vel.x = ((float)RANDOM( -10000, 10000 )) / 10000;
200 b->vel.y = (float)(RANDOM( -10000, 10000 )) / 10000;
201 }
202 /* only use 2 degree steps */
203 b->angle = vec2angle( &b->vel );
204 angle2vec( b->angle, &b->vel );
205 if ( b->target.side >= CORNER_UPPER_LEFT && !chaos_reflect )
206 ball_mask_vel( b, old_vx, BALL_ADD_ENTROPY );
207 else
208 ball_mask_vel( b, old_vx, BALL_NO_ENTROPY );
209 }
210
211 /* mark target as disabled so it won't get stuck at the
212 bottom of the screen but keep the target position so
213 that we know what needs an update. */
214 b->target.exists = 0;
215 }
216
217 /* update energy ball animation */
218 void client_balls_update( int ms )
219 {
220 Vector old; /* old position of ball before update */
221 Ball *ball;
222
223 /* modify alpha when metal */
224 if ( game->extra_active[EX_METAL] ) {
225 ball_metal_alpha += ball_metal_alpha_change * ms;
226 if ( ball_metal_alpha >= 255 || ball_metal_alpha <= 0 ) {
227 ball_metal_alpha_change = -ball_metal_alpha_change;
228 if ( ball_metal_alpha < 0 ) ball_metal_alpha = 0;
229 if ( ball_metal_alpha > 255 ) ball_metal_alpha = 255;
230 }
231 }
232
233 /* new position if NOT attached. the communicator has set the velocity
234 * 0 if a ball is inanimated */
235 if ( game->game_type == GT_NETWORK ) {
236 list_reset( game->balls );
237 while ( (ball = list_next( game->balls )) ) {
238 if ( ball->attached ) continue;
239 if ( ball->vel.x == 0 && ball->vel.y == 0 ) continue;
240
241 old.x = ball->cur.x;
242 old.y = ball->cur.y;
243
244 ball->cur.x += ball->vel.x * ms;
245 ball->cur.y += ball->vel.y * ms;
246 ball->x = (int)ball->cur.x;
247 ball->y = (int)ball->cur.y;
248 }
249 }
250 }
251
0 /***************************************************************************
1 balls.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Show/hide all balls
20 ====================================================================
21 */
22 void balls_hide();
23 void balls_show_shadow();
24 void balls_show();
25 void balls_alphashow( int alpha );
26
27 /* update energy ball animation */
28 void client_balls_update( int ms );
29
0 /***************************************************************************
1 bricks.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <math.h>
18 #include "../game/game.h"
19 #include "lbreakout.h"
20 #include "shrapnells.h"
21 #include "bricks.h"
22
23 extern SDL_Surface *stk_display;
24 extern SDL_Surface *offscreen; /* offscreen with bricks, background, frame */
25 extern SDL_Surface *bkgnd; /* background picture (includes frame) */
26 extern SDL_Surface *warp_pic;
27 extern SDL_Surface *brick_pic; /* brick graphics in a horizontal order */
28 extern int shadow_size;
29 extern SDL_Surface *brick_shadow; /* shadow mask */
30 extern int shine_x, shine_y, shine_recreate;
31 #ifdef AUDIO_ENABLED
32 extern StkSound *wav_boom;
33 #endif
34 extern Game *game;
35
36 /*
37 ====================================================================
38 Locals
39 ====================================================================
40 */
41
42 /* remove a brick and release the extra (which will have no effect
43 * on collection) update the graphics. no growth or explosions
44 * of other bricks are initiated as these are send by network */
45 void client_brick_remove( int mx, int my, int type, Vector imp, Paddle *paddle )
46 {
47 int px, py, w, h, i, j, shadow, anim_brick_id;
48 int dir;
49
50 /* add explosion animation */
51 if ( type == SHR_BY_EXPL_WITH_EXPL ) {
52 exp_create( mx * BRICK_WIDTH + ( BRICK_WIDTH >> 1 ),
53 my * BRICK_HEIGHT + ( BRICK_HEIGHT >> 1 ) );
54 #ifdef AUDIO_ENABLED
55 stk_sound_play_x( mx * BRICK_WIDTH + ( BRICK_WIDTH >> 1 ), wav_boom );
56 #endif
57 type = SHR_BY_EXPL; /* WITH_EXPL is not known */
58 }
59
60 /* decrease brick count if no indestructible brick was destroyed */
61 if ( game->bricks[mx][my].dur != -1 )
62 game->bricks_left--;
63
64 /* before removing the brick, store the brick id for animation */
65 anim_brick_id = game->bricks[mx][my].id;
66
67 /* remove brick from map */
68 game->bricks[mx][my].brick_c = ' ';
69 game->bricks[mx][my].id = -1;
70 game->bricks[mx][my].dur = -1;
71 game->bricks[mx][my].exp_time = -1;
72 game->bricks[mx][my].heal_time = -1;
73 game->bricks[mx][my].type = MAP_EMPTY;
74
75 /* get screen position */
76 px = mx * BRICK_WIDTH;
77 py = my * BRICK_HEIGHT;
78
79 /* release extra if one exists. in opposite to the server the goldshower
80 * 1000P is not released here but in the hit handle function if the gold_shower
81 * flag is set to avoid releasing 'ghost' extras due to latency. */
82 dir = ( paddle->type == PADDLE_TOP ) ? -1 : 1;
83 if ( game->bricks[mx][my].extra != EX_NONE ) {
84 if ( game->diff->allow_maluses ||
85 !extra_is_malus( game->bricks[mx][my].extra ) )
86 list_add( game->extras,
87 extra_create( game->bricks[mx][my].extra, px, py, dir ) );
88 }
89 game->bricks[mx][my].extra = EX_NONE;
90 game->bricks[mx][my].extra_c = ' ';
91
92 /* in case of darkness no (graphical) remove nescessary */
93 if ( game->extra_active[EX_DARKNESS] ) {
94 #ifdef AUDIO_ENABLED
95 stk_sound_play_x( px, wav_boom );
96 #endif
97 return;
98 }
99
100 shrapnells_create( brick_pic, anim_brick_id * BRICK_WIDTH, 0,
101 BRICK_WIDTH, BRICK_HEIGHT,
102 px, py, type, imp );
103 /* recreate shine if needed */
104 if (px == shine_x && py == shine_y) shine_recreate = 1;
105 /* clear offscreen */
106 w = BRICK_WIDTH + shadow_size; h = BRICK_HEIGHT + shadow_size;
107 if ( px + w > stk_display->w - BRICK_WIDTH )
108 w = stk_display->w - BRICK_WIDTH - px;
109 stk_surface_clip( offscreen, px, py, w, h );
110 stk_surface_blit( bkgnd, px, py, w, h, offscreen, px, py );
111 /* if shadow redraw close bricks */
112 for ( i = mx - 1; i <= mx + 1; i++ )
113 for ( j = my - 1; j <= my + 1; j++ ) {
114 if ( i > 0 && j > 0 && i < MAP_WIDTH - 1 ) {
115 if ( game->bricks[i][j].type != MAP_EMPTY ) {
116 if ( i <= mx && j <= my ) shadow = 1; else shadow = 0;
117 brick_draw( offscreen, i, j, shadow );
118 }
119 }
120 }
121 stk_surface_clip( offscreen, 0, 0, 0, 0 );
122 /* update screen */
123 stk_surface_blit( offscreen, px, py, w, h, stk_display, px, py );
124 stk_display_store_drect();
125 #ifdef AUDIO_ENABLED
126 stk_sound_play_x( px, wav_boom );
127 #endif
128 }
129
130 static void client_brick_heal( int x, int y )
131 {
132 game->bricks[x][y].dur++;
133 game->bricks[x][y].id++;
134 if ( !game->extra_active[EX_DARKNESS] ) {
135 brick_draw( offscreen, x, y, 0 );
136 brick_draw( stk_display, x, y, 0 );
137 stk_display_store_drect();
138 }
139 }
140
141 static void client_brick_grow( int x, int y )
142 {
143 Brick *brick = &game->bricks[x][y];
144 int px, py;
145
146 /* add brick */
147 brick->id = RANDOM( BRICK_GROW_FIRST, BRICK_GROW_LAST );
148 brick->brick_c = brick_get_char( brick->id );
149 brick->type = MAP_BRICK;
150 brick->score = game->diff->score_mod * BRICK_SCORE / 10;
151 brick->dur = 1;
152 /* keep the extra that is already assigned to this position */
153 brick->exp_time = -1;
154 brick->heal_time = -1;
155 game->bricks_left++;
156
157 if ( !game->extra_active[EX_DARKNESS] ) {
158 px = x * BRICK_WIDTH;
159 py = y * BRICK_HEIGHT;
160 brick_draw_complex( x, y, px, py );
161 stk_surface_blit( offscreen, px, py,
162 BRICK_WIDTH + shadow_size,
163 BRICK_HEIGHT + shadow_size,
164 stk_display, px, py );
165 stk_display_store_drect();
166 }
167 }
168
169 /*
170 ====================================================================
171 Publics
172 ====================================================================
173 */
174
175 /*
176 ====================================================================
177 Draw all bricks to offscreen surface.
178 ====================================================================
179 */
180 void bricks_draw()
181 {
182 int i, j;
183 if ( offscreen == 0 ) return;
184 stk_surface_clip( offscreen, 0, 0, stk_display->w - BRICK_WIDTH, stk_display->h );
185 for ( j = 1; j < MAP_HEIGHT - 1; j++ )
186 for ( i = 1; i < MAP_WIDTH - 1; i++ )
187 if ( game->bricks[i][j].id >= 0 )
188 brick_draw( offscreen, i, j, 1 );
189 stk_surface_clip( offscreen, 0,0,0,0 );
190 }
191 /*
192 ====================================================================
193 Draw brick to passed surface
194 ====================================================================
195 */
196 void brick_draw( SDL_Surface *surf, int map_x, int map_y, int shadow )
197 {
198 int x = map_x * BRICK_WIDTH, y = map_y * BRICK_HEIGHT;
199 /* dont draw invisible bricks */
200 if ( game->bricks[map_x][map_y].id == INVIS_BRICK_ID ) return;
201 /* add shadow */
202 if ( shadow ) {
203 stk_surface_alpha_blit( brick_shadow,
204 game->bricks[map_x][map_y].id * BRICK_WIDTH, 0,
205 BRICK_WIDTH, BRICK_HEIGHT,
206 surf, x + shadow_size, y + shadow_size, SHADOW_ALPHA );
207 }
208 /* brick if not frame brick */
209 if ( map_x == 0 || map_y == 0 || map_x == MAP_WIDTH - 1 ) return;
210 stk_surface_blit( brick_pic,
211 game->bricks[map_x][map_y].id * BRICK_WIDTH, 0,
212 BRICK_WIDTH, BRICK_HEIGHT, surf, x,y );
213 }
214 /*
215 ====================================================================
216 Add brick with clipped shadow to offscreen. To draw a brick without
217 shadow check use brick_draw().
218 ====================================================================
219 */
220 void brick_draw_complex( int mx, int my, int px, int py )
221 {
222 brick_draw( offscreen, mx, my, 1 );
223 /* redraw surrounding bricks */
224 stk_surface_clip( offscreen, px + shadow_size, py + shadow_size, BRICK_WIDTH, BRICK_HEIGHT );
225 if ( mx + 1 == MAP_WIDTH - 1 ) {
226 /* right frame part */
227 stk_surface_blit( bkgnd, px + BRICK_WIDTH, py,
228 BRICK_WIDTH, ( BRICK_HEIGHT << 1 ),
229 offscreen, px + BRICK_WIDTH, py );
230 }
231 else {
232 brick_draw( offscreen, mx + 1, my, 0 );
233 brick_draw( offscreen, mx + 1, my + 1, 0 );
234 }
235 if ( game->bricks[mx][my + 1].type != MAP_EMPTY )
236 brick_draw( offscreen, mx, my + 1, 0 );
237 stk_surface_clip( offscreen, 0, 0, 0, 0 );
238 }
239 /*
240 ====================================================================
241 Make brick at mx,my loose 'points' duration. It must have been
242 previously checked that this operation is completely valid.
243 It does not update net_bricks or the player's duration reference.
244 ====================================================================
245 */
246 void client_brick_loose_dur( int mx, int my, int points )
247 {
248 int px, py;
249 int refresh_h, refresh_w;
250 while ( points-- > 0 ) {
251 game->bricks[mx][my].dur--;
252 game->bricks[mx][my].id--;
253 /* adjust brick character:
254 * a,b,c - multiple hits
255 * v - invisible */
256 if ( game->bricks[mx][my].brick_c == 'v' )
257 game->bricks[mx][my].brick_c = 'c';
258 else
259 game->bricks[mx][my].brick_c--; /* successive order */
260 if ( !game->extra_active[EX_DARKNESS]) {
261 px = mx * BRICK_WIDTH;
262 py = my * BRICK_HEIGHT;
263 refresh_w = BRICK_WIDTH+shadow_size;
264 refresh_h = BRICK_HEIGHT+shadow_size;
265 /* copy background as old brick may have different transparency
266 do this in three parts to save computation */
267 stk_surface_blit( bkgnd, px, py,
268 shadow_size, BRICK_HEIGHT,
269 offscreen, px, py );
270 stk_surface_blit( bkgnd, px + shadow_size, py,
271 BRICK_WIDTH - shadow_size, BRICK_HEIGHT + shadow_size,
272 offscreen, px + shadow_size, py );
273 stk_surface_blit( bkgnd, px + BRICK_WIDTH, py + shadow_size,
274 shadow_size, BRICK_HEIGHT,
275 offscreen, px + BRICK_WIDTH, py + shadow_size );
276 /* draw brick + surrounding */
277 brick_draw_complex( mx, my, px, py );
278 /* udpate screen */
279 stk_surface_blit( offscreen, px, py,
280 refresh_w, refresh_h, stk_display, px, py );
281 stk_display_store_drect();
282 }
283 }
284 }
285
286 /* handle a received brick action */
287 void client_handle_brick_hit( BrickHit *hit )
288 {
289 Paddle *paddle;
290 Vector imp;
291
292 paddle = (hit->paddle==PADDLE_BOTTOM)?game->paddles[PADDLE_BOTTOM]:game->paddles[PADDLE_TOP];
293 angle2vec( hit->degrees, &imp );
294
295 switch ( hit->type )
296 {
297 case HT_HIT:
298 client_brick_loose_dur( hit->x, hit->y, 1 );
299 break;
300 case HT_REMOVE:
301 if (hit->draw_explosion)
302 hit->dest_type = SHR_BY_EXPL_WITH_EXPL;
303 client_brick_remove( hit->x, hit->y, hit->dest_type, imp, paddle );
304 /* gold shower extra */
305 if ( hit->gold_shower )
306 list_add( game->extras,
307 extra_create( EX_SCORE1000,
308 hit->x*BRICK_WIDTH, hit->y*BRICK_HEIGHT,
309 (hit->paddle==PADDLE_TOP)?-1:1 ) );
310 break;
311 case HT_HEAL:
312 client_brick_heal( hit->x, hit->y );
313 break;
314 case HT_GROW:
315 client_brick_grow( hit->x, hit->y );
316 break;
317 }
318 }
319
0 /***************************************************************************
1 bricks.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Draw all bricks to offscreen surface.
20 ====================================================================
21 */
22 void bricks_draw();
23 /*
24 ====================================================================
25 Add brick with clipped shadow to offscreen. To draw a brick without
26 shadow check use brick_draw().
27 ====================================================================
28 */
29 void brick_draw_complex( int mx, int my, int px, int py );
30 /*
31 ====================================================================
32 Draw brick to passed surface
33 ====================================================================
34 */
35 void brick_draw( SDL_Surface *surf, int map_x, int map_y, int shadow );
36
37 /* handle a received brick action */
38 void client_handle_brick_hit( BrickHit *hit );
39
0 /***************************************************************************
1 chart.c - description
2 -------------------
3 begin : Mon Sep 24 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "chart.h"
20
21 #define CHART_FILE_NAME "lbreakout2.hscr"
22
23 List *charts = 0; /* list of all loaded level set charts */
24
25 char chart_path[512]; /* path charts where actually loaded/created from */
26 int chart_loaded = 0; /* true if highscore succesfully loaded */
27 SDL_Rect chart_pos; /* used to store size. x,y is set when drawing */
28 int chart_gap = 10;
29 int chart_level_offset = 0; /* level offset (name's left aligned, score's right aligned) */
30 char *cheader = "Name Level Score";
31 extern SDL_Surface *stk_display;
32 extern Config config;
33 extern StkFont *cfont, *chfont, *ccfont; /* normal, highlight and caption font */
34
35 /*
36 ====================================================================
37 Local
38 ====================================================================
39 */
40
41 /*
42 ====================================================================
43 Reset charts
44 ====================================================================
45 */
46 void chart_reset( Set_Chart *chart )
47 {
48 int i;
49 memset( chart->entries, 0, sizeof( Chart_Entry ) * CHART_ENTRY_COUNT );
50 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
51 chart_add( chart, "............", i + 1, 10000 * ( i + 1 ) );
52 chart->entries[0].score = 300000;
53 chart->entries[1].score = 200000;
54 chart->entries[2].score = 150000;
55 chart->entries[3].score = 100000;
56 chart->entries[4].score = 70000;
57 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
58 chart->entries[i].new_entry = 0;
59 }
60
61 /*
62 ====================================================================
63 Create/delete set chart.
64 ====================================================================
65 */
66 Set_Chart* chart_set_create( char *name )
67 {
68 Set_Chart *chart = calloc( 1, sizeof( Set_Chart ) );
69 chart->name = strdup( name );
70 chart_reset( chart );
71 return chart;
72 }
73 void chart_set_delete( void *ptr )
74 {
75 Set_Chart *chart = (Set_Chart*)ptr;
76 if ( !chart ) return;
77 if ( chart->name ) free( chart->name );
78 free( chart );
79 }
80
81 /*
82 ====================================================================
83 Read entries of a chart from file position.
84 ====================================================================
85 */
86 void chart_read_entries( FILE *file, char *file_name, Set_Chart *chart )
87 {
88 char buffer[128];
89 int i;
90
91 for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) {
92 if ( feof( file ) ) {
93 fprintf( stderr, "Unexpected EOF in '%s' in entry %i... reading of highscore aborted.\n",
94 file_name, i );
95 break;
96 }
97 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
98 strcpy( chart->entries[i].name, buffer );
99 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
100 chart->entries[i].level = atoi( buffer );
101 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
102 chart->entries[i].score = atoi( buffer );
103 }
104 }
105
106 /*
107 ====================================================================
108 Load all highscores from path. If not found create chart with
109 one set 'Original'.
110 ReturnValue: True if successful
111 ====================================================================
112 */
113 int chart_load_from_path( char *path )
114 {
115 FILE *file = 0;
116 char file_name[512];
117 char setname[1024];
118 char aux[4];
119 Set_Chart *chart = 0;
120 /* full file name */
121 sprintf( file_name, "%s/%s", path, CHART_FILE_NAME );
122 /* clear chart list */
123 list_clear( charts );
124 /* open file */
125 file = fopen( file_name, "rb" );
126 if ( file ) {
127 /* test if it's new format or old one. */
128 fread( aux, sizeof( char ), 3, file ); aux[3] = 0;
129 fseek( file, 0, SEEK_SET );
130 if ( strequal( ">>>", aux ) ) {
131 /* new format: load all set charts */
132 while( !feof( file ) ) {
133 /* check if next sign is an '>' else skip reading */
134 aux[0] = 0;
135 fread( aux, sizeof( char ), 1, file );
136 fseek( file, -1, SEEK_CUR );
137 if ( aux[0] != '>' ) break;
138 chart = calloc( 1, sizeof( Set_Chart ) );
139 /* get name: >>>name */
140 fscanf( file, ">>>%s\n", setname );
141 chart->name = strdup( setname );
142 /* entries */
143 chart_read_entries( file, file_name, chart );
144 /* add */
145 list_add( charts, chart );
146 }
147 }
148 else {
149 /* old format: load single chart as 'Original' */
150 fprintf( stderr, "Converting highscore chart as format changed.\n" );
151 chart = chart_set_create( "LBreakout2" );
152 chart_read_entries( file, file_name, chart );
153 list_add( charts, chart );
154 }
155 fclose( file );
156 }
157 else {
158 fprintf( stderr, "Highscore chart doesn't exist in '%s'... creating new one.\n", path );
159 chart = chart_set_create( "LBreakout2" );
160 list_add( charts, chart );
161 }
162 /* test if writing is allowed without changing actual contents */
163 if ( ( file = fopen( file_name, "a" ) ) == 0 ) {
164 fprintf( stderr, "Write permission for '%s' denied.\n", file_name );
165 return 0;
166 }
167 else
168 fclose( file );
169 strcpy( chart_path, path );
170 chart_loaded = 1;
171 return 1;
172 }
173
174 /*
175 ====================================================================
176 Publics
177 ====================================================================
178 */
179
180 /*
181 ====================================================================
182 Load highscore. If it doesn't exist try to create it in HI_DIR if
183 this fails fall back to ~/.lbreakout and create highscore there.
184 ====================================================================
185 */
186 void chart_load()
187 {
188 /* create list */
189 if ( charts ) list_delete( charts ); charts = 0;
190 charts = list_create( LIST_AUTO_DELETE, chart_set_delete );
191 /* load highscore */
192 if ( !chart_load_from_path( HI_DIR ) ) {
193 fprintf( stderr, "Unable to access highscore chart in '%s'.\n", HI_DIR );
194 fprintf( stderr, "Trying to use config directory '%s'.\n", config.dir_name );
195 if ( !chart_load_from_path( config.dir_name ) ) {
196 fprintf( stderr, "Unable to access highscore chart in config directory... won't be "
197 "able to save any results. Sorry.\n" );
198 return;
199 }
200 }
201 printf( "Saving highscore chart in: %s\n", chart_path );
202 /* compute size and position stuff of highscore */
203 chart_pos.w = stk_font_string_width( ccfont, cheader );
204 chart_pos.h = ccfont->height + chart_gap + /* title + gap */
205 cfont->height * CHART_ENTRY_COUNT + /* entries */
206 chart_gap + /*gap between caption and entries */
207 ccfont->height; /* caption size */
208 chart_level_offset = stk_font_string_width( ccfont, "name.-----" ) + stk_font_string_width( ccfont, "Level" ) / 2; /* level offset centered */
209 }
210 /*
211 ====================================================================
212 Delete resources
213 ====================================================================
214 */
215 void chart_delete()
216 {
217 if ( charts ) list_delete( charts ); charts = 0;
218 }
219 /*
220 ====================================================================
221 Save chart in directory it was loaded from.
222 ====================================================================
223 */
224 void chart_save()
225 {
226 char file_name[512];
227 int i;
228 Set_Chart *chart = 0;
229 FILE *file = 0;
230 if ( !chart_loaded ) return;
231 /* full file name */
232 sprintf( file_name, "%s/%s", chart_path, CHART_FILE_NAME );
233 /* open file */
234 file = fopen( file_name, "w" );
235 if ( !file ) {
236 fprintf( stderr, "??? Highscore chart loaded properly but cannot save?\n" );
237 return;
238 }
239 /* save all charts */
240 list_reset( charts );
241 while ( ( chart = list_next( charts ) ) != 0 ) {
242 fprintf( file, ">>>%s\n", chart->name );
243 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
244 fprintf( file, "%s\n%i\n%i\n", chart->entries[i].name, chart->entries[i].level, chart->entries[i].score );
245 }
246 fclose( file );
247 }
248 /*
249 ====================================================================
250 Check if this player entered the highscore chart and update it.
251 ====================================================================
252 */
253 void chart_add( Set_Chart *chart, char *name, int level, int score )
254 {
255 /* add new entry at blind end of chart */
256 strcpy( chart->entries[CHART_ENTRY_COUNT].name, name );
257 chart->entries[CHART_ENTRY_COUNT].level = level;
258 chart->entries[CHART_ENTRY_COUNT].score = score;
259 chart->entries[CHART_ENTRY_COUNT].new_entry = 1;
260 /* sort algorithm is stable so first sort levels then score */
261 chart_sort( chart, SORT_BY_LEVEL );
262 chart_sort( chart, SORT_BY_SCORE );
263 }
264 /*
265 ====================================================================
266 Sort chart with stable algorithm (bubble sort's ok) by wanted
267 value.
268 ====================================================================
269 */
270 void chart_swap( Chart_Entry *entry1, Chart_Entry *entry2 )
271 {
272 Chart_Entry dummy;
273 dummy = *entry1;
274 *entry1 = *entry2;
275 *entry2 = dummy;
276 }
277 void chart_sort( Set_Chart *chart, int type )
278 {
279 int j;
280 int changed = 0;
281 /* use entry dummy as well so count is CHART_ENTRY_COUNT + 1 */
282 do {
283 changed = 0;
284 for ( j = 0; j < CHART_ENTRY_COUNT; j++ )
285 switch ( type ) {
286 case SORT_BY_LEVEL:
287 if ( chart->entries[j].level < chart->entries[j + 1].level ) {
288 chart_swap( &chart->entries[j], &chart->entries[j + 1] );
289 changed = 1;
290 }
291 break;
292 case SORT_BY_SCORE:
293 if ( chart->entries[j].score < chart->entries[j + 1].score ) {
294 chart_swap( &chart->entries[j], &chart->entries[j + 1] );
295 changed = 1;
296 }
297 break;
298 }
299 } while ( changed );
300 }
301 /*
302 ====================================================================
303 Draw highscores centered in regio x,y,w,h
304 ====================================================================
305 */
306 void chart_show( Set_Chart *chart, int x, int y, int w, int h )
307 {
308 char number_buffer[24];
309 int entry_offset; /* y offset of entries */
310 StkFont *font;
311 int i;
312 /* adjust x,y so it's centered */
313 chart_pos.x = x + ( w - chart_pos.w ) / 2;
314 chart_pos.y = y + ( h - chart_pos.h ) / 2;
315 /* title = name of levelset */
316 ccfont->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
317 stk_font_write( ccfont, stk_display,
318 chart_pos.x + ( chart_pos.w >> 1 ), chart_pos.y, -1,
319 chart->name );
320 /* caption */
321 ccfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
322 stk_font_write( ccfont, stk_display,
323 chart_pos.x, chart_pos.y + ccfont->height + chart_gap, -1,
324 cheader );
325 /* get entry offset */
326 entry_offset = ( ccfont->height + chart_gap ) * 2 + chart_pos.y;
327 /* entries */
328 for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) {
329 font = cfont;
330 if ( chart->entries[i].new_entry ) font = chfont;
331 /* name */
332 font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
333 stk_font_write( font, stk_display,
334 chart_pos.x, entry_offset, -1, chart->entries[i].name );
335 /* level */
336 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
337 sprintf( number_buffer, "%i", chart->entries[i].level );
338 stk_font_write( font, stk_display,
339 chart_pos.x + chart_level_offset, entry_offset, -1, number_buffer );
340 /* score */
341 font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_TOP;
342 sprintf( number_buffer, "%i", chart->entries[i].score );
343 stk_font_write( font, stk_display,
344 chart_pos.x + chart_pos.w, entry_offset, -1, number_buffer );
345 /* change offset */
346 entry_offset += font->height;
347 }
348 stk_display_store_rect( &chart_pos );
349 }
350 /*
351 ====================================================================
352 Clear all new_entry flags (done before new players are added
353 to chart when game over).
354 ====================================================================
355 */
356 void chart_clear_new_entries()
357 {
358 int i;
359 Set_Chart *chart;
360 list_reset( charts );
361 while ( ( chart = list_next( charts ) ) != 0 ) {
362 chart->entries[CHART_ENTRY_COUNT].score = chart->entries[CHART_ENTRY_COUNT].level = 0;
363 for ( i = 0; i < CHART_ENTRY_COUNT + 1; i++ )
364 chart->entries[i].new_entry = 0;
365 }
366 }
367 /*
368 ====================================================================
369 Query set chart by this name or if not found create a new one
370 by this name.
371 ====================================================================
372 */
373 Set_Chart* chart_set_query( char *name )
374 {
375 Set_Chart *chart = 0;
376 list_reset( charts );
377 while ( ( chart = list_next( charts ) ) != 0 )
378 if ( strequal( name, chart->name ) )
379 return chart;
380 /* not found so create it */
381 fprintf( stderr, "First chart query for '%s'. Creating this chart.\n", name );
382 chart = chart_set_create( name );
383 list_add( charts, chart );
384 return chart;
385 }
386 /*
387 ====================================================================
388 Query chart by id. If id is invalid return 0.
389 ====================================================================
390 */
391 Set_Chart* chart_set_query_id( int id )
392 {
393 if ( id >= charts->count ) {
394 fprintf( stderr, "Chart index '%i' is out of range!\n", id );
395 return 0;
396 }
397 return (Set_Chart*)list_get( charts, id );
398 }
0 /***************************************************************************
1 chart.h - description
2 -------------------
3 begin : Mon Sep 24 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Highscore chart entry
20 ====================================================================
21 */
22 typedef struct {
23 char name[32];
24 int level;
25 int score;
26 int new_entry; /* newly entered the highscore */
27 } Chart_Entry;
28 /*
29 ====================================================================
30 Levelset highscore chart.
31 ====================================================================
32 */
33 enum { CHART_ENTRY_COUNT = 10 };
34 typedef struct {
35 Chart_Entry entries[CHART_ENTRY_COUNT + 1]; /* last entry is space holder for new entry */
36 char *name;
37 } Set_Chart;
38
39 /*
40 ====================================================================
41 Load highscore. If it doesn't exist try to create it in HI_DIR if
42 this fails fall back to ~/.lbreakout and create highscore there.
43 ====================================================================
44 */
45 void chart_load();
46 /*
47 ====================================================================
48 Delete resources
49 ====================================================================
50 */
51 void chart_delete();
52 /*
53 ====================================================================
54 Save chart in directory it was loaded from.
55 ====================================================================
56 */
57 void chart_save();
58 /*
59 ====================================================================
60 Check if this player entered the highscore chart and update it.
61 ====================================================================
62 */
63 void chart_add( Set_Chart *chart, char *name, int level, int score );
64 /*
65 ====================================================================
66 Sort chart with stable algorithm (bubble sort's ok) by wanted
67 value.
68 ====================================================================
69 */
70 enum { SORT_BY_LEVEL = 0, SORT_BY_SCORE };
71 void chart_sort( Set_Chart *chart, int type );
72 /*
73 ====================================================================
74 Draw highscores centered in regio x,y,w,h
75 ====================================================================
76 */
77 void chart_show( Set_Chart *chart, int x, int y, int w, int h );
78 /*
79 ====================================================================
80 Clear all new_entry flags (done before new players are added
81 to chart when game over).
82 ====================================================================
83 */
84 void chart_clear_new_entries();
85 /*
86 ====================================================================
87 Query set chart by this name or if not found create a new one
88 by this name.
89 ====================================================================
90 */
91 Set_Chart* chart_set_query( char *name );
92 /*
93 ====================================================================
94 Query chart by id. If id is invalid return 0.
95 ====================================================================
96 */
97 Set_Chart* chart_set_query_id( int id );
0 /***************************************************************************
1 client.c - description
2 -------------------
3 begin : Sun Oct 20 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "event.h"
20 #include "../gui/gui.h"
21 #include "client_data.h"
22 #include "client_handlers.h"
23 #include "client.h"
24
25 /*
26 ====================================================================
27 Externals
28 ====================================================================
29 */
30 extern SDL_Surface *cr_wallpaper;
31 extern Config config;
32 extern SDL_Surface **bkgnds;
33 extern StkFont *chat_font_error;
34 extern StkFont *chat_font_name;
35 extern StkFont *chat_font_normal;
36 extern char chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
37 extern char pause_chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
38 extern List *client_levelsets;
39 extern List *client_users;
40 extern List *client_games;
41 extern List *client_channels;
42 extern void client_recv_packet( GuiWidget *widget, GuiEvent *event );
43 extern int client_id;
44 extern int client_topic_count;
45 extern char *client_topics[];
46 extern Text *client_help_text;
47 extern NetSocket client;
48 extern int client_is_connected;
49 extern int client_state;
50 extern int client_recv_limit;
51 extern int (*sys_printf)(const char *format, ...);
52
53 /*
54 ====================================================================
55 Client GUI
56 ====================================================================
57 */
58 GuiWidget *dlg_connect = 0;
59 GuiWidget *dlg_info = 0;
60 GuiWidget *dlg_confirm = 0;
61 GuiWidget *dlg_chatroom = 0;
62 GuiWidget *dlg_channels = 0;
63 GuiWidget *dlg_stats = 0;
64 GuiWidget *dlg_pauseroom = 0;
65 GuiWidget *dlg_help = 0;
66 /* important children */
67 GuiWidget *label_channel;
68 GuiWidget *label_info;
69 GuiWidget *label_confirm;
70 GuiWidget *label_winner;
71 GuiWidget *label_stats;
72 GuiWidget *edit_server;
73 GuiWidget *edit_username;
74 GuiWidget *list_chatter;
75 GuiWidget *edit_chatter;
76 GuiWidget *list_levels;
77 GuiWidget *list_users;
78 GuiWidget *list_channels;
79 GuiWidget *edit_channel;
80 GuiWidget *list_pausechatter;
81 GuiWidget *edit_pausechatter;
82 GuiWidget *list_topic;
83 GuiWidget *list_help;
84
85 #define HINT_CONNECT "Specify the game server as address:port where "\
86 "the address can be a name or a dotted IP.#If the connection fails have a look "\
87 "at the messages in the chat window to see the reason."
88
89 /*
90 ====================================================================
91 LOCALS
92 ====================================================================
93 */
94
95 #ifdef NETWORK_ENABLED
96 /*
97 ====================================================================
98 Render help topic.
99 ====================================================================
100 */
101 static int client_render_help(
102 int x, int y, SDL_Surface *buffer )
103 {
104 if ( !client_help_text ) return 0;
105 if ( y >= client_help_text->count ) return 0;
106 chat_font_normal->align = STK_FONT_ALIGN_LEFT;
107 stk_font_write( chat_font_normal,
108 buffer, 2,0, STK_OPAQUE,
109 client_help_text->lines[y] );
110 return 1;
111 }
112 /*
113 ====================================================================
114 Render help topic.
115 ====================================================================
116 */
117 static int client_render_topic(
118 int x, int y, SDL_Surface *buffer )
119 {
120 if ( y >= client_topic_count ) return 0;
121 chat_font_normal->align = STK_FONT_ALIGN_LEFT;
122 stk_font_write( chat_font_normal,
123 buffer, 2,0, STK_OPAQUE,
124 client_topics[y] );
125 return 1;
126 }
127 /*
128 ====================================================================
129 Render chat line.
130 ====================================================================
131 */
132 static int client_render_chatter(
133 int x, int y, SDL_Surface *buffer )
134 {
135 char *ptr = 0, *name_end = 0;
136 StkFont *font = 0;
137 if ( y < 0 || y >= CHAT_LINE_COUNT ) return 0;
138 if ( chatter[y][0] == '!' ) {
139 font = chat_font_error;
140 ptr = chatter[y] + 1;
141 }
142 else {
143 ptr = chatter[y];
144 font = chat_font_normal;
145 }
146 font->align = STK_FONT_ALIGN_LEFT;
147 stk_font_write( font, buffer, 2,0, STK_OPAQUE, ptr );
148 if ( chatter[y][0] == '<' )
149 if ( ( name_end = strchr( chatter[y], '>' ) ) ) {
150 name_end[1] = 0;
151 stk_font_write(
152 chat_font_name, buffer, 2,0, STK_OPAQUE, chatter[y] );
153 name_end[1] = ' ';
154 }
155 return 1;
156 }
157 static int client_render_pause_chatter(
158 int x, int y, SDL_Surface *buffer )
159 {
160 char *ptr = 0, *name_end = 0;
161 StkFont *font = 0;
162 if ( y < 0 || y >= CHAT_LINE_COUNT ) return 0;
163 if ( pause_chatter[y][0] == '!' ) {
164 font = chat_font_error;
165 ptr = pause_chatter[y] + 1;
166 }
167 else {
168 ptr = pause_chatter[y];
169 font = chat_font_normal;
170 }
171 font->align = STK_FONT_ALIGN_LEFT;
172 stk_font_write( font, buffer, 2,0, STK_OPAQUE, ptr );
173 if ( pause_chatter[y][0] == '<' )
174 if ( ( name_end = strchr( pause_chatter[y], '>' ) ) ) {
175 name_end[1] = 0;
176 stk_font_write(
177 chat_font_name, buffer, 2,0, STK_OPAQUE, pause_chatter[y] );
178 name_end[1] = ' ';
179 }
180 return 1;
181 }
182 /*
183 ====================================================================
184 Render levelsets.
185 ====================================================================
186 */
187 static int client_render_levelset(
188 int x, int y, SDL_Surface *buffer )
189 {
190 if ( y >= client_levelsets->count ) return 0;
191 chat_font_normal->align = STK_FONT_ALIGN_LEFT;
192 stk_font_write( chat_font_normal,
193 buffer, 2,0, STK_OPAQUE,
194 list_get( client_levelsets, y ) );
195 return 1;
196 }
197 /*
198 ====================================================================
199 Render user
200 ====================================================================
201 */
202 static int client_render_user(
203 int x, int y, SDL_Surface *buffer )
204 {
205 ClientUser *user;
206 StkFont *font;
207 if ( y >= client_users->count ) return 0;
208 if ( ( user = list_get( client_users, y ) ) == 0 ) return 0;
209 if ( user->id == client_id )
210 font = chat_font_name;
211 else
212 font = chat_font_normal;
213 font->align = STK_FONT_ALIGN_LEFT;
214 stk_font_write( font, buffer, 2,0, STK_OPAQUE, user->name );
215 return 1;
216 }
217 /*
218 ====================================================================
219 Render channel.
220 ====================================================================
221 */
222 static int client_render_channel(
223 int x, int y, SDL_Surface *buffer )
224 {
225 if ( y >= client_channels->count ) return 0;
226 chat_font_normal->align = STK_FONT_ALIGN_LEFT;
227 stk_font_write( chat_font_normal,
228 buffer, 2,0, STK_OPAQUE,
229 (char*)list_get( client_channels, y ) );
230 return 1;
231 }
232 #endif
233
234 /*
235 ====================================================================
236 PUBLICS
237 ====================================================================
238 */
239
240 /*
241 ====================================================================
242 Build the GUI and everything nescessary for the client chatroom.
243 client_create() installs client_delete() as exit function.
244 ====================================================================
245 */
246 void client_create( void )
247 {
248 #ifdef NETWORK_ENABLED
249 GuiWidget *parent;
250 SDL_Surface *surface;
251 /* users, channels, games */
252 client_data_create();
253 /* CONNECT WINDOW */
254 dlg_connect = gui_box_create( 0, -1,-1, 400, 224, 0, 0 );
255 parent = dlg_connect;
256 /* hint label */
257 gui_label_create(
258 parent, 10, 10, parent->width - 20, 100, 1,
259 0, 4, 0, STK_FONT_ALIGN_LEFT, HINT_CONNECT );
260 /* server edit */
261 gui_label_create(
262 parent, 10, 120, 180, 20, 0,
263 0, 2, 0, STK_FONT_ALIGN_RIGHT, "Server:" );
264 edit_server = gui_edit_create(
265 parent, parent->width - 190, 120, 180, 20,
266 0, 2, 0, 22, config.server );
267 /* user name */
268 gui_label_create(
269 parent, 10, 150, 180, 20, 0,
270 0, 2, 0, STK_FONT_ALIGN_RIGHT, "Username:" );
271 edit_username = gui_edit_create(
272 parent, parent->width - 190, 150, 180, 20,
273 0, 2, 0, 13, config.username );
274 /* cancel, connect buttons */
275 gui_button_create(
276 parent, parent->width/2 -160, 180,
277 140, 24, client_connect, 0,0,0,0,0, "Connect" );
278 gui_button_create(
279 parent, parent->width/2 +20, 180,
280 140, 24, client_close_connect_window, 0,0,0,0,0, "Cancel" );
281 /* INFO */
282 dlg_info = gui_box_create( 0, -1,-1, 300, 114, 0, 1 );
283 label_info = gui_label_create( dlg_info, -1,10,276,60,0, 0,
284 2, 0, STK_FONT_ALIGN_LEFT, "no info" );
285 gui_button_create( dlg_info,
286 -1, dlg_info->height - 34,
287 100, 24, client_close_info, 0,0,0,0,0,
288 "Close" );
289 /* CONFIRM */
290 dlg_confirm = gui_box_create( 0, -1,-1, 300, 160, 0, 1 );
291 label_confirm = gui_label_create( dlg_confirm, -1,10,276,110,0, 0,
292 2, 0, STK_FONT_ALIGN_LEFT, "no info" );
293 gui_button_create( dlg_confirm,
294 dlg_confirm->width/2-110, dlg_confirm->height - 30,
295 100, 20, client_confirm, 0,0,0,0,0,
296 "OK" );
297 gui_button_create( dlg_confirm,
298 dlg_confirm->width/2+10, dlg_confirm->height - 30,
299 100, 20, client_cancel, 0,0,0,0,0,
300 "Cancel" );
301 /* CHATROOM */
302 dlg_chatroom = gui_box_create( 0, 0,0,640,480,
303 client_recv_packet, 1 );
304 gui_widget_enable_event( dlg_chatroom, GUI_TIME_PASSED );
305 surface = gui_widget_get_surface( dlg_chatroom );
306 stk_surface_apply_wallpaper(
307 surface, 0,0,-1,-1, cr_wallpaper, STK_OPAQUE );
308 /* chat window */
309 list_chatter = gui_list_create( dlg_chatroom, 0,0,470,444, NULL,
310 0, 1, 14, 20, client_render_chatter, GUI_LIST_NO_SELECT );
311 /* edit + send/whisper buttons */
312 gui_button_create( dlg_chatroom, 330,448,70,24,
313 client_send_chatter, 0,0,0,0,0, "Send" );
314 gui_button_create( dlg_chatroom, 400,448,70,24,
315 client_whisper_chatter, 0,0,0,0,0, "Whisper" );
316 edit_chatter = gui_edit_create( dlg_chatroom, 0,448,327,24,
317 client_send_chatter, 2, 0, MAX_CHATTER_SIZE, "" );
318 gui_widget_enable_event( edit_chatter, GUI_KEY_RELEASED );
319 gui_widget_set_default_key_widget( dlg_chatroom, edit_chatter );
320 /* channel button + users in channel */
321 label_channel = gui_label_create( dlg_chatroom,
322 474,0,142,18,1, NULL,
323 2, 0, STK_FONT_ALIGN_CENTER_X, "MAIN" );
324 gui_button_create( dlg_chatroom, 616,0,18,18,
325 client_select_channel,
326 0,0,0,0,0, "C" );
327 list_users = gui_list_create( dlg_chatroom,
328 474,20,160,142, client_handle_user_list,
329 1, 1, 14, 20, client_render_user,
330 GUI_LIST_SINGLE_SELECT );
331 /* levels label, levels, transfer button */
332 gui_label_create( dlg_chatroom, 474,164,160,18,1, NULL,
333 2, 0, STK_FONT_ALIGN_CENTER_X, "Levelsets" );
334 list_levels = gui_list_create( dlg_chatroom,
335 474,184,160,120, client_handle_levelset_list,
336 1, 1, 14, 20, client_render_levelset,
337 GUI_LIST_SINGLE_SELECT );
338 /* box with level settings */
339 parent = gui_box_create( dlg_chatroom,
340 474,306,160,94, NULL, 0 );
341 gui_label_create( parent, 2,2,102,20,0, NULL,
342 2, NULL, STK_FONT_ALIGN_LEFT, "Difficulty:" );
343 gui_spinbutton_create( parent, 102,2,50,20,
344 client_update_difficulty,
345 1, 3, 1, config.mp_diff+1 );
346 gui_label_create( parent, 2,2+22,102,20,0, NULL,
347 2, NULL, STK_FONT_ALIGN_LEFT, "Rounds:" );
348 gui_spinbutton_create( parent, 102,2+22,50,20,
349 client_update_rounds,
350 1, 3, 1, config.mp_rounds );
351 gui_label_create( parent, 2,2+44,102,20,0, NULL,
352 2, NULL, STK_FONT_ALIGN_LEFT, "Frags:" );
353 gui_spinbutton_create( parent, 102,2+44,50,20,
354 client_update_frags,
355 5, 30, 5, config.mp_frags );
356 gui_label_create( parent, 2,2+66,102,20,0, NULL,
357 2, NULL, STK_FONT_ALIGN_LEFT, "Balls:" );
358 gui_spinbutton_create( parent, 102,2+66,50,20,
359 client_update_balls,
360 1, 6, 1, config.mp_balls );
361 /* challenge & disconnect */
362 gui_button_create( dlg_chatroom,
363 474,402,160,20, client_challenge,
364 0,0,0,0,0, "Challenge" );
365 gui_button_create( dlg_chatroom,
366 474,dlg_chatroom->height-44,160,20,
367 client_open_connect_window,
368 0,0,0,0,0, "Connect" );
369 gui_button_create( dlg_chatroom,
370 534,dlg_chatroom->height-20,100,20,
371 client_quit,
372 0,0,0,0,0, "Quit" );
373 gui_button_create( dlg_chatroom,
374 474,dlg_chatroom->height-20,50,20,
375 client_popup_help,
376 0,0,0,0,0, "Help" );
377 /* CHANNELS selector */
378 dlg_channels = gui_box_create( 0, -1,-1, 200, 244, NULL, 1 );
379 list_channels = gui_list_create( dlg_channels, -1,10, 176,150,
380 client_handle_channel_list, 0, 1, 14, 20,
381 client_render_channel, GUI_LIST_SINGLE_SELECT );
382 gui_label_create( dlg_channels, -1,160, 176,20,0, NULL,
383 2, 0, STK_FONT_ALIGN_LEFT, "Channel:" );
384 edit_channel = gui_edit_create( dlg_channels,
385 -1,180, 176,20, NULL,
386 2, 0, 12, "" );
387 gui_widget_set_default_key_widget( dlg_channels, edit_channel );
388 gui_edit_set_filter( edit_channel, GUI_EDIT_ALPHANUMERICAL2 );
389 gui_button_create( dlg_channels,
390 dlg_channels->width/2-90,210,80,20,
391 client_enter_channel, 0,0,0,0,0, "Enter" );
392 gui_button_create( dlg_channels,
393 dlg_channels->width/2+10,210,80,20,
394 client_cancel_channel, 0,0,0,0,0, "Cancel" );
395 /* STATISTICS */
396 dlg_stats = gui_box_create( 0, -1,-1,386,260, NULL, 1 );
397 gui_label_create( dlg_stats, -1,10,360,20,1, NULL,
398 0, 0, STK_FONT_ALIGN_CENTER_X, "Statistics" );
399 label_winner = gui_label_create( dlg_stats,
400 -1,40,360,16,0, NULL,
401 0, 0, STK_FONT_ALIGN_CENTER_X, "..." );
402 label_stats = gui_label_create( dlg_stats,
403 -1,62,360,150,0, NULL,
404 0, 0, STK_FONT_ALIGN_LEFT, "Awaiting stats..." );
405 gui_button_create( dlg_stats, -1,220,160,20,
406 client_close_stats, 0,0,0,0,0, "Close" );
407 /* PAUSEROOM */
408 dlg_pauseroom = gui_box_create( 0, -1,-1,480,366, NULL, 1 );
409 list_pausechatter = gui_list_create(
410 dlg_pauseroom, 0,0,470,300, NULL,
411 0, 1, 14, 20, client_render_pause_chatter,
412 GUI_LIST_NO_SELECT );
413 edit_pausechatter = gui_edit_create(
414 dlg_pauseroom, 0,303,470,24,
415 client_send_pausechatter, 2, 0, MAX_CHATTER_SIZE, "" );
416 gui_widget_enable_event( edit_pausechatter, GUI_KEY_RELEASED );
417 gui_widget_set_default_key_widget( dlg_pauseroom, edit_pausechatter );
418 gui_button_create( dlg_pauseroom, -1,334,100,20,
419 client_close_pauseroom, 0,0,0,0,0, "Close" );
420 /* HELP */
421 dlg_help = gui_box_create( 0, -1,-1,548,358, NULL, 1 );
422 gui_label_create( dlg_help, -1,10,470,20,1, NULL,
423 0, 0, STK_FONT_ALIGN_CENTER_X, "Network Quick Help" );
424 list_topic = gui_list_create(
425 dlg_help, 10,40,160,270, client_handle_topic_list,
426 0, 1, 14, 20, client_render_topic,
427 GUI_LIST_SINGLE_SELECT );
428 list_help = gui_list_create(
429 dlg_help, 180,40,350,300, NULL,
430 0, 1, 14, 20, client_render_help,
431 GUI_LIST_NO_SELECT );
432 gui_button_create( dlg_help, 10,320,160,20, client_close_help,
433 0,0,0,0,0, "Close" );
434 /* INITS */
435 /* empty chatter */
436 memset( chatter, 0, sizeof( chatter ) );
437 /* update chatboxes */
438 gui_list_update( list_chatter, CHAT_LINE_COUNT );
439 gui_list_update( list_pausechatter, CHAT_LINE_COUNT );
440 gui_list_goto( list_chatter, -1 );
441 gui_list_goto( list_pausechatter, -1 );
442 /* set help topics */
443 gui_list_update( list_topic, client_topic_count );
444 /* call client_delete at exit */
445 atexit( client_delete );
446 #endif
447 }
448
449 /*
450 ====================================================================
451 Free memory allocated by client_create( void )
452 ====================================================================
453 */
454 void client_delete( void )
455 {
456 #ifdef NETWORK_ENABLED
457 client_data_delete();
458 printf( "Client finalized\n" );
459 #endif
460 }
461
462 /*
463 ====================================================================
464 Run the connect dialogue & chatroom until user closes the connect
465 dialogue.
466 ====================================================================
467 */
468 #ifdef NETWORK_ENABLED
469 static int client_printf_info( const char *format, ... )
470 {
471 va_list args;
472 char string[MAX_CHATTER_SIZE];
473
474 va_start( args, format );
475 vsnprintf( string, MAX_CHATTER_SIZE, format, args );
476 va_end( args );
477
478 client_add_chatter( string, 1 );
479 return strlen(string);
480 }
481 #endif
482 void client_run( void )
483 {
484 #ifdef NETWORK_ENABLED
485 /* init UDP socket */
486 sys_printf = client_printf_info;
487 net_init( atoi(config.local_port) );
488 sys_printf = printf;
489 client_add_chatter( "Press 'Connect' to connect to a game server.", 1 );
490
491 client_state = CLIENT_NONE;
492 client_recv_limit = config.recv_limit;
493
494 gui_enable_event_filter();
495 gui_widget_show( dlg_chatroom );
496 stk_display_fade( STK_FADE_IN, STK_FADE_DEFAULT_TIME );
497 gui_run( dlg_chatroom );
498 stk_display_fade( STK_FADE_OUT, STK_FADE_DEFAULT_TIME );
499 gui_disable_event_filter();
500
501 if ( client_is_connected ) {
502 /* tell server we are off */
503 client_disconnect();
504 /* finalize UDP socket */
505 socket_print_stats( &client );
506 }
507 net_shutdown();
508 #endif
509 }
0 /***************************************************************************
1 client.h - description
2 -------------------
3 begin : Sun Oct 20 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __CLIENT_H
18 #define __CLIENT_H
19
20 /*
21 ====================================================================
22 This module provides the client GUI (connect dialogue & chatroom)
23 which is run by calling client_run()
24 ====================================================================
25 */
26
27 /*
28 ====================================================================
29 Build the GUI and everything nescessary for the client chatroom.
30 client_create() installs client_delete() as exit function.
31 ====================================================================
32 */
33 void client_create( void );
34
35 /*
36 ====================================================================
37 Free memory allocated by client_create( void )
38 ====================================================================
39 */
40 void client_delete( void );
41
42 /*
43 ====================================================================
44 Run the connect dialogue & chatroom until user closes the connect
45 dialogue.
46 ====================================================================
47 */
48 void client_run( void );
49
50 #endif
0 /***************************************************************************
1 client_data.c - description
2 -------------------
3 begin : Sat Oct 26 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "client_data.h"
18 #include "lbreakout.h"
19 #include "../gui/gui.h"
20
21 /*
22 ====================================================================
23 Externals
24 ====================================================================
25 */
26 extern GuiWidget *list_levels;
27 extern GuiWidget *list_chatter;
28 extern GuiWidget *list_games;
29 extern GuiWidget *list_users;
30 extern GuiWidget *list_channels;
31 extern GuiWidget *list_pausechatter;
32
33 List *client_users = 0; /* users of channel known to client */
34 List *client_channels = 0; /* list of default channels (strings) */
35 List *client_levelsets = 0; /* list of MP set names */
36
37 ClientUser *client_user = 0; /* selected user */
38 char *client_levelset = 0; /* selected levelset */
39 char chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
40 char pause_chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
41 extern NetSocket client;
42 extern int client_is_connected;
43
44 int client_topic_count = 4;
45 char *client_topics[] = {
46 "Challenges",
47 "Channels",
48 "Console Commands",
49 "Game Rules",
50 "Transfers"
51 };
52 char *client_helps[] = {
53 "To challenge a user you first have to select him/her in the "
54 "upper right list and the levelset you want to play "
55 "from the list below. Then you adjust the game settings to your "
56 "likings and hit the 'Challenge' button which will send your "
57 "challenge to the other user who will either accept or decline. "
58 "If (s)he accepts a direct connection will be established and the "
59 "game will start.##"
60 "DIFFICULTY: This influences ball speed, paddle size and score as for "
61 "single player modus. (1 = Easy, 2 = Medium, 3 = Hard)##"
62 "ROUNDS: This is the number of rounds played per level. Winning a "
63 "round scores one point and the player with the most points wins "
64 "the match.##"
65 "FRAGS: In a pingpong level (no bricks) a player gains a frag everytime "
66 "the opponent looses a ball. 'frag' is a bad name for this, should be "
67 "pingpong winning score or something but 'frags' is simply shorter. "
68 "The player who hits this limit first "
69 "wins the round.#In levels with bricks this option is ignored "
70 "and the level is over after all bricks were cleared.##"
71 "BALLS: In a pingpong level (no bricks) each player may fire multiple "
72 "balls up to this number. If a player looses a ball he may fire it again.#"
73 "In normal levels (with bricks) this option is ignored and a gets a new ball "
74 "after five seconds penalty time.",
75 "To switch a channel hit the 'C' button above the user list. "
76 "You can enter either an existing or a new channel. You "
77 "can only talk to and challenge users in the same channel.",
78 "User Console Commands:##"
79 "/search <USER>#"
80 "Search for a user in all channels.##"
81 "/version#"
82 "Display version of transmission protocol.##"
83 "/info#"
84 "Display current userlimit and frame rate.##"
85 "Admin Console Commands:##"
86 "/admin_says <MSG>#"
87 "Broadcast a message to all chatting users.##"
88 "/kick <USER>#"
89 "Kick user by that name.##"
90 "/addbot <NAME> <SPEED>#"
91 "Add a paddle bot. The speed is defined in pixels per second. 800 to 1000 is a good value.##"
92 "/delbot <NAME>#"
93 "Delete paddle bot.##"
94 "/set <VAR> <VALUE>#"
95 "Set a variable to a new value:#"
96 " userlimit: is the number of users that may login. If decreased with too many users online"
97 " no one is kicked. This limit does not matter for admin login.#"
98 " fps: is how many times a second the server calls up the communication and sends/receives"
99 " packets. This should not be too high to prevent network flooding. 40 is a good value.#"
100 " packetlimit: if not -1 this is the number of packets parsed in one communication step. -1"
101 " which is the default means the queue is parsed until empty##"
102 "/addset <NAME>#"
103 "Load a new levelset that has been copied to the levels directory and make it available "
104 "to the users.##"
105 "/halt#"
106 "Halt server after 5 seconds and inform all users, even the playing ones, about this.",
107 "Basically you play the game as in single player mode but their "
108 "are some special things you might find useful to know.##"
109 "PINGPONG:#"
110 "The point here is to play it fast and to use all of your balls. "
111 "Use the right and left mouse button to fire the balls "
112 "while moving the paddle. Your opponent "
113 "will have trouble to reflect all balls if you do it right. "
114 "If you are not sure wether you got balls left click anyway. "
115 "Keep the button pressed for a while! The fire rate is restricted "
116 "to one ball every 500 milliseconds.##"
117 "NORMAL:#"
118 "Your goal here is too gain more score than your opponent to win a "
119 "round. Basically you do this by clearing bricks and collecting extras "
120 "but there are some other ways as well:#"
121 "1) To loose a ball means to loose 10% score. After five seconds penalty "
122 "a new ball is created and you can continue playing.#"
123 "2) Hitting your opponents paddle with the plasma weapon will give you "
124 "1000 points while stealing him/her the same amount.#"
125 "3) Bonus/malus magnet will attract _all_ bonuses/maluses even those "
126 "released by your opponent.##"
127 "Note: If you pause the game by pressing 'p' a chat will pop up and you "
128 "can talk to your opponent.",
129 "You cannot offer someone your levelset unless this user "
130 "wants to receive your set which requires the following steps:#"
131 "1) select the user to whom you want to listen#"
132 "2) press the 'L' button above the levelset list#"
133 "3) wait for offer or cancel 'listening'#"
134 "The receiver is now ready and the sender has to:#"
135 "1) select the listening user#"
136 "2) select the levelset (s)he wants to transfer#"
137 "3) hit the 'T' button above the levelset list#"
138 "If the receiver has this levelset already located in "
139 "~/.lgames/lbreakout2-levels and it is up-to-date the transfer "
140 "does not take place otherwise the receiver is asked to confirm "
141 "and if (s)he does so the set is transferred to the home "
142 "directory and directly available if intended for network. (starts with 'MP_')#"
143 "NOTE: Only the challenger is required to have the levelset so you "
144 "don not have to transfer sets to play with someone. However if your opponent "
145 "likes your set and wants to challenge others with it both can engage into "
146 "a transfer."
147 };
148 Text *client_help_text = 0;
149
150 /*
151 ====================================================================
152 LOCALS
153 ====================================================================
154 */
155
156 static void client_add_chatter_intern(
157 GuiWidget *list, char *string, int info )
158 {
159 int i, j;
160 static Text *text;
161 /* build new text */
162 text = create_text( string, 52 );
163 /* move old lines up */
164 for ( i = 0; i < CHAT_LINE_COUNT - text->count; i++ )
165 strcpy( chatter[i], chatter[i + text->count] );
166 /* copy new lines */
167 for ( j = 0, i = CHAT_LINE_COUNT - text->count;
168 i < CHAT_LINE_COUNT; i++, j++ ) {
169 if ( info ) {
170 strcpy( chatter[i] + 1, text->lines[j] );
171 chatter[i][0] = '!';
172 }
173 else if ( j > 0 ) {
174 strcpy( chatter[i] + 3 + info, text->lines[j] );
175 chatter[i][0] = ' ';
176 chatter[i][1] = ' ';
177 chatter[i][2] = ' ';
178 }
179 else
180 strcpy( chatter[i], text->lines[j] );
181 }
182 /* free memory */
183 delete_text( text );
184 /* update gui */
185 gui_list_update( list, CHAT_LINE_COUNT );
186 }
187 static void client_add_pause_chatter_intern(
188 GuiWidget *list, char *string, int info )
189 {
190 int i, j;
191 static Text *text;
192 /* build new text */
193 text = create_text( string, 52 );
194 /* move old lines up */
195 for ( i = 0; i < CHAT_LINE_COUNT - text->count; i++ )
196 strcpy( pause_chatter[i], pause_chatter[i + text->count] );
197 /* copy new lines */
198 for ( j = 0, i = CHAT_LINE_COUNT - text->count;
199 i < CHAT_LINE_COUNT; i++, j++ ) {
200 if ( info ) {
201 strcpy( pause_chatter[i] + 1, text->lines[j] );
202 pause_chatter[i][0] = '!';
203 }
204 else if ( j > 0 ) {
205 strcpy( pause_chatter[i] + 3 + info, text->lines[j] );
206 pause_chatter[i][0] = ' ';
207 pause_chatter[i][1] = ' ';
208 pause_chatter[i][2] = ' ';
209 }
210 else
211 strcpy( pause_chatter[i], text->lines[j] );
212 }
213 /* free memory */
214 delete_text( text );
215 /* update gui */
216 gui_list_update( list, CHAT_LINE_COUNT );
217 }
218
219 /*
220 ====================================================================
221 PUBLICS
222 ====================================================================
223 */
224
225 /* transmit via client's socket if client_is_connected is True */
226 void client_transmit( int type, int len, char *data )
227 {
228 #ifdef NETWORK_ENABLED
229 if ( client_is_connected )
230 socket_transmit( &client, type, len, data );
231 #endif
232 }
233
234 /*
235 ====================================================================
236 Create/delete client's data structs.
237 ====================================================================
238 */
239 void client_data_create( void )
240 {
241 client_channels = list_create( LIST_AUTO_DELETE, 0 /*just strings*/ );
242 client_users = list_create( LIST_AUTO_DELETE, 0 );
243 client_levelsets = list_create( LIST_AUTO_DELETE, 0 );
244 }
245 void client_data_delete( void )
246 {
247 if ( client_channels ) list_delete( client_channels );
248 client_channels = 0;
249 if ( client_users ) list_delete( client_users );
250 client_users = 0;
251 if ( client_levelsets ) list_delete( client_levelsets );
252 client_levelsets = 0;
253 if ( client_help_text ) delete_text( client_help_text );
254 client_help_text = 0;
255 }
256
257 /*
258 ====================================================================
259 Clear all client data.
260 ====================================================================
261 */
262 void client_data_clear( void )
263 {
264 list_clear( client_users );
265 client_user = 0;
266 list_clear( client_channels );
267 list_clear( client_levelsets );
268 client_levelset = 0;
269 gui_list_update( list_users, 0 );
270 gui_list_update( list_channels, 0 );
271 gui_list_update( list_levels, 0 );
272 }
273
274 /*
275 ====================================================================
276 Add/remove/find users. Do not update the GUI.
277 ====================================================================
278 */
279 void client_add_user( int id, char *name )
280 {
281 ClientUser *user;
282 if ( client_find_user( id ) ) return;
283 user = calloc( 1, sizeof( ClientUser ) );
284 if ( user ) {
285 strcpy_lt( user->name, name, 12 );
286 user->id = id;
287 list_add( client_users, user );
288 }
289 }
290 void client_remove_user( int id )
291 {
292 ClientUser *entry = 0;
293 if ( ( entry = client_find_user( id ) ) ) {
294 if ( entry == client_user )
295 client_user = 0;
296 list_delete_item( client_users, entry );
297 }
298 }
299 ClientUser* client_find_user( int id )
300 {
301 ClientUser *entry;
302 list_reset( client_users );
303 while ( ( entry = list_next( client_users ) ) )
304 if ( entry->id == id )
305 return entry;
306 return 0;
307 }
308
309 /*
310 ====================================================================
311 Add chatter to chat window. If 'info' is true the text is
312 displayed red and without indention.
313 ====================================================================
314 */
315 void client_add_chatter( char *string, int info )
316 {
317 client_add_chatter_intern( list_chatter, string, info );
318 }
319
320 /*
321 ====================================================================
322 Add chatter to chat window. If 'info' is true the text is
323 displayed red and without indention.
324 ====================================================================
325 */
326 void client_printf_chatter( int info, char *format, ... )
327 {
328 va_list args;
329 char string[MAX_CHATTER_SIZE];
330
331 va_start( args, format );
332 vsnprintf( string, MAX_CHATTER_SIZE, format, args );
333 va_end( args );
334
335 client_add_chatter_intern( list_chatter, string, info );
336 }
337 /*
338 ====================================================================
339 Add chatter to pause chat window. If 'info' is true the text is
340 displayed red and without indention.
341 ====================================================================
342 */
343 void client_add_pausechatter( char *string, int info )
344 {
345 client_add_pause_chatter_intern( list_pausechatter, string, info );
346 }
347
348
0 /***************************************************************************
1 client_data.h - description
2 -------------------
3 begin : Sat Oct 26 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __CLIENT_DATA_H
18 #define __CLIENT_DATA_H
19
20 /*
21 ====================================================================
22 Client states
23 ====================================================================
24 */
25 enum {
26 CLIENT_NONE = 0,
27
28 /* ingame stats lie in between */
29
30 CLIENT_INFO = 1000, /* not open to any challenges/transfers */
31 CLIENT_AWAIT_ANSWER, /* wait for answer to a challenge */
32 CLIENT_ANSWER, /* answer to a challenge */
33 CLIENT_CONFIRM_TRANSFER, /* say yes or no to transfer */
34 CLIENT_AWAIT_TRANSFER_CONFIRMATION, /* wait for answer on
35 transfer offer */
36 CLIENT_RECEIVE, /* receive level data */
37 CLIENT_LISTEN, /* listen to user for a levelset */
38 CLIENT_SELECT_CHANNEL, /* selecting a channel */
39 CLIENT_STATS, /* looking at game stats */
40 CLIENT_PLAY, /* playing game */
41 CLIENT_HELP /* looking at help */
42 };
43
44 /*
45 ====================================================================
46 Chatter definitions.
47 ====================================================================
48 */
49 enum {
50 CHAT_LINE_COUNT = 200,
51 CHAT_LINE_WIDTH = 64, /* includes \0 */
52 MAX_CHATTER_SIZE = 100
53
54 };
55
56 /*
57 ====================================================================
58 Client data structs
59 ====================================================================
60 */
61 typedef struct {
62 int id;
63 char name[16];
64 } ClientUser;
65
66 /* transmit via client's socket if client_is_connected is True */
67 void client_transmit( int type, int len, char *data );
68
69 /*
70 ====================================================================
71 Create/delete client's data structs.
72 ====================================================================
73 */
74 void client_data_create( void );
75 void client_data_delete( void );
76
77 /*
78 ====================================================================
79 Clear all data structs
80 ====================================================================
81 */
82 void client_data_clear( void );
83
84 /*
85 ====================================================================
86 Add/remove/find users/games/channels. Do not update the GUI.
87 ====================================================================
88 */
89 void client_add_user( int id, char *name );
90 void client_remove_user( int id );
91 ClientUser* client_find_user( int id );
92
93 /*
94 ====================================================================
95 Add chatter to chat window. If 'info' is true the text is
96 displayed red and without indention.
97 ====================================================================
98 */
99 void client_add_chatter( char *string, int info );
100
101 /*
102 ====================================================================
103 Add chatter to chat window. If 'info' is true the text is
104 displayed red and without indention.
105 ====================================================================
106 */
107 void client_printf_chatter( int info, char *format, ... );
108
109 /*
110 ====================================================================
111 Add chatter to pause chat window. If 'info' is true the text is
112 displayed red and without indention.
113 ====================================================================
114 */
115 void client_add_pausechatter( char *string, int info );
116
117 #endif
0 /***************************************************************************
1 client_handlers.c - description
2 -------------------
3 begin : Sat Oct 26 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "../gui/gui.h"
20 #include "client_data.h"
21 #include "client_handlers.h"
22 #include "comm.h"
23 #include "game.h"
24
25 /*
26 ====================================================================
27 Externals
28 ====================================================================
29 */
30 extern Config config;
31 extern List *client_users;
32 extern List *client_games;
33 extern List *client_channels;
34 extern List *client_levelsets;
35 extern char *client_levelset;
36 extern ClientUser *client_user;
37 extern char chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
38 extern GuiWidget *dlg_connect;
39 extern GuiWidget *dlg_info;
40 extern GuiWidget *dlg_confirm;
41 extern GuiWidget *dlg_chatroom;
42 extern GuiWidget *dlg_channels;
43 extern GuiWidget *dlg_stats;
44 extern GuiWidget *dlg_pauseroom;
45 extern GuiWidget *dlg_help;
46 extern GuiWidget *label_info;
47 extern GuiWidget *label_stats;
48 extern GuiWidget *label_winner;
49 extern GuiWidget *label_channel;
50 extern GuiWidget *edit_server;
51 extern GuiWidget *edit_username;
52 extern GuiWidget *list_chatter;
53 extern GuiWidget *edit_chatter;
54 extern GuiWidget *list_levels;
55 extern GuiWidget *list_users;
56 extern GuiWidget *list_channels;
57 extern GuiWidget *edit_channel;
58 extern GuiWidget *edit_pausechatter;
59 extern GuiWidget *list_help;
60 extern int levelset_version, levelset_update;
61 extern List *levels;
62 extern void client_popup_info( char *format, ... );
63 extern void client_run_game( int challenger );
64 extern int client_topic_count;
65 extern char *client_helps[];
66 extern Text *client_help_text;
67
68 /*
69 ====================================================================
70 Client
71 ====================================================================
72 */
73 #ifdef NETWORK_ENABLED
74 NetSocket client; /* client socket to the game server */
75 #endif
76 int client_is_connected; /* wether 'client' is a valid uplink */
77 char client_error[128]; /* error message */
78 int client_id; /* id assigned by server */
79 char client_name[16]; /* our local username */
80 int client_state = CLIENT_NONE;
81 int client_recv_limit;
82
83 /*
84 ====================================================================
85 Challenge data
86 ====================================================================
87 */
88 char *mp_diff_names[] = { "Easy", "Medium", "Hard" };
89 char mp_levelset[16]; /* name of levelset we play */
90 int mp_peer_id;
91 char mp_peer_name[16]; /* remote player we want to play with */
92 int mp_levelset_version;
93 int mp_levelset_update; /* version of levelset */
94 int mp_level_count; /* number of levels in set */
95 int mp_diff, mp_rounds, mp_frags, mp_balls; /* game configuration */
96
97 extern void close_pause_chat( void );
98
99 /*
100 ====================================================================
101 Disconnect from current server if any.
102 ====================================================================
103 */
104 void client_disconnect()
105 {
106 #ifdef NETWORK_ENABLED
107 char buf[128];
108
109 if ( !client_is_connected ) return;
110
111 /* disconnect */
112 socket_print_stats( &client );
113 sprintf( buf, "disconnected from %s",
114 net_addr_to_string(&client.remote_addr) );
115 client_add_chatter( buf, 1 );
116 buf[0] = MSG_DISCONNECT;
117 client_transmit( CODE_BLUE, 1, buf );
118 client_is_connected = 0;
119 client_data_clear();
120 gui_label_set_text( label_channel, "MAIN" );
121 #endif
122 }
123
124 /*
125 ====================================================================
126 Try to connect to a game server. Retry twice every second
127 or quit then.
128 ====================================================================
129 */
130 void client_connect( GuiWidget *widget, GuiEvent *event )
131 {
132 #ifdef NETWORK_ENABLED
133 NetAddr newaddr;
134 int attempt = 0;
135 int type;
136 char server[128];
137
138 if ( event->type != GUI_CLICKED ) return;
139
140 /* close the connect window */
141 gui_widget_hide( dlg_connect );
142
143 /* disconnect from current server */
144 client_disconnect();
145
146 /* extract ip and port and build a new socket out of it */
147 gui_edit_get_text( edit_server, server, 128, 0, -1 );
148 snprintf( config.server, 64, server );
149 if ( !net_build_addr( &newaddr, server, 0 ) ) {
150 client_printf_chatter( 1, "ERROR: address %s does not resolve", config.server );
151 return;
152 }
153 socket_init( &client, &newaddr );
154
155 /* get username */
156 gui_edit_get_text( edit_username,
157 config.username, 16, 0,-1 );
158
159 /* build connect message */
160 msg_begin_writing( msgbuf, &msglen, 64 );
161 msg_write_int8( MSG_CONNECT );
162 msg_write_int8( PROTOCOL );
163 msg_write_string( config.username );
164 msg_write_string( "unused" ); /* passwd */
165
166 while ( attempt < 3 ) {
167 client_printf_chatter( 1, "%s: %s...",
168 config.server,
169 attempt==0?"connecting":"retry" );
170 stk_display_update( STK_UPDATE_ALL );
171 net_transmit_connectionless( &newaddr, msglen, msgbuf );
172
173 SDL_Delay( 1000 );
174
175 while ( net_recv_packet() ) {
176 if ( msg_is_connectionless() )
177 msg_begin_connectionless_reading();
178 else
179 if ( !socket_process_header( &client ) )
180 continue;
181
182 type = msg_read_int8();
183 switch ( type ) {
184 case MSG_LOGIN_OKAY:
185 client_id = msg_read_int32();
186 strcpy( client_name, msg_read_string() );
187 client_printf_chatter( 1, "%s: connected!", config.server );
188 client_is_connected = 1;
189 return;
190 case MSG_ERROR:
191 client_printf_chatter( 1, "ERROR: connection refused: %s",
192 msg_read_string() );
193 return;
194 }
195 }
196
197 attempt++;
198 }
199 client_add_chatter( "ERROR: server does not respond", 1 );
200 #endif
201 }
202
203 /*
204 ====================================================================
205 Open/close the connection window.
206 ====================================================================
207 */
208 void client_open_connect_window(
209 GuiWidget *widget, GuiEvent *event )
210 {
211 if ( event->type == GUI_CLICKED )
212 gui_widget_show( dlg_connect );
213 }
214 void client_close_connect_window(
215 GuiWidget *widget, GuiEvent *event )
216 {
217 if ( event->type == GUI_CLICKED )
218 gui_widget_hide( dlg_connect );
219 }
220
221 /*
222 ====================================================================
223 Close chatroom and return to LBreakout's menu.
224 ====================================================================
225 */
226 void client_quit( GuiWidget *widget, GuiEvent *event )
227 {
228 if ( event->type == GUI_CLICKED )
229 gui_widget_hide( dlg_chatroom );
230 /* disconnect is handled in client_run to cover
231 * stk_quit_requests as well */
232 }
233
234 /*
235 ====================================================================
236 Close the info window and clear state.
237 ====================================================================
238 */
239 void client_close_info( GuiWidget *widget, GuiEvent *event )
240 {
241 #ifdef NETWORK_ENABLED
242 if ( event->type == GUI_CLICKED ) {
243 gui_widget_hide( dlg_info );
244 msg_begin_writing( msgbuf, &msglen, 128 );
245 switch ( client_state ) {
246 case CLIENT_AWAIT_ANSWER:
247 msg_write_int8( MSG_CANCEL_GAME );
248 break;
249 }
250 client_transmit( CODE_BLUE, msglen, msgbuf );
251 client_state = CLIENT_NONE;
252 }
253 #endif
254 }
255
256 /*
257 ====================================================================
258 Send chatter this function is either called by the send button
259 or by the edit.
260 ====================================================================
261 */
262 void client_send_chatter(
263 GuiWidget *widget, GuiEvent *event )
264 {
265 #ifdef NETWORK_ENABLED
266 char buf[MAX_CHATTER_SIZE + 1];
267 if ( ( widget->type == GUI_EDIT &&
268 event->type == GUI_KEY_RELEASED &&
269 event->key.keysym == SDLK_RETURN ) ||
270 ( widget->type == GUI_BUTTON &&
271 event->type == GUI_CLICKED ) ) {
272 /* get message */
273 gui_edit_get_text( edit_chatter,
274 buf, MAX_CHATTER_SIZE + 1, 0,-1 );
275 /* clear chat edit */
276 gui_edit_set_text( edit_chatter, "" );
277
278 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
279 /* a prepended '/' means this is a command */
280 if ( buf[0] == '/' ) {
281 msg_write_int8( MSG_COMMAND );
282 msg_write_string( buf+1 );
283 }
284 else {
285 msg_write_int8( MSG_CHATTER );
286 msg_write_string( buf );
287 }
288 client_transmit( CODE_BLUE, msglen, msgbuf );
289 }
290 #endif
291 }
292 /*
293 ====================================================================
294 Whisper chatter if a user is selected.
295 ====================================================================
296 */
297 void client_whisper_chatter(
298 GuiWidget *widget, GuiEvent *event )
299 {
300 #ifdef NETWORK_ENABLED
301 char buf[MAX_CHATTER_SIZE + 1];
302
303 if ( event->type != GUI_CLICKED ) return;
304
305 /* get message */
306 gui_edit_get_text( edit_chatter,
307 buf, MAX_CHATTER_SIZE + 1, 0,-1 );
308
309 /* send to selected user */
310 if ( client_user ) {
311 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
312 msg_write_int8( MSG_WHISPER );
313 msg_write_int32( client_user->id );
314 msg_write_string( buf );
315 client_transmit( CODE_BLUE, msglen, msgbuf );
316
317 /* clear chat edit */
318 gui_edit_set_text( edit_chatter, "" );
319 }
320 else
321 client_add_chatter( "You must select a user to whisper!", 1 );
322 #endif
323 }
324
325 /*
326 ====================================================================
327 Update selected peer and levelset.
328 ====================================================================
329 */
330 void client_handle_user_list(
331 GuiWidget *widget, GuiEvent *event )
332 {
333 if ( event->type == GUI_ITEM_SELECTED )
334 client_user = list_get( client_users, event->item.y );
335 else
336 if ( event->type == GUI_ITEM_UNSELECTED )
337 client_user = 0;
338 }
339 void client_handle_levelset_list(
340 GuiWidget *widget, GuiEvent *event )
341 {
342 if ( event->type == GUI_ITEM_SELECTED )
343 client_levelset = list_get( client_levelsets,
344 event->item.y );
345 else
346 if ( event->type == GUI_ITEM_UNSELECTED )
347 client_levelset = 0;
348 }
349
350 /*
351 ====================================================================
352 Handle confirmation/cancelling of confirmation dialogue.
353 ====================================================================
354 */
355 void client_confirm( GuiWidget *widget, GuiEvent *event )
356 {
357 #ifdef NETWORK_ENABLED
358 if ( event->type != GUI_CLICKED ) return;
359 gui_widget_hide( dlg_confirm );
360 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
361 switch ( client_state ) {
362 case CLIENT_ANSWER:
363 msg_write_int8( MSG_ACCEPT_CHALLENGE );
364 client_transmit( CODE_BLUE, msglen, msgbuf );
365
366 /* play */
367 gui_disable_event_filter();
368 if ( client_game_init_network( mp_peer_name, mp_diff ) )
369 client_game_run();
370 client_game_finalize();
371 gui_enable_event_filter();
372
373 gui_widget_draw( dlg_chatroom );
374 stk_display_fade( STK_FADE_IN, STK_FADE_DEFAULT_TIME );
375 break;
376 }
377 #endif
378 }
379 void client_cancel( GuiWidget *widget, GuiEvent *event )
380 {
381 #ifdef NETWORK_ENABLED
382 if ( event->type != GUI_CLICKED ) return;
383 gui_widget_hide( dlg_confirm );
384 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
385 switch ( client_state ) {
386 case CLIENT_ANSWER:
387 msg_write_int8( MSG_REJECT_CHALLENGE );
388 break;
389 }
390 client_transmit( CODE_BLUE, msglen, msgbuf );
391 client_state = CLIENT_NONE;
392 #endif
393 }
394
395 /*
396 ====================================================================
397 Challenge selected user.
398 ====================================================================
399 */
400 void client_challenge( GuiWidget *widget, GuiEvent *event )
401 {
402 #ifdef NETWORK_ENABLED
403 if ( event->type != GUI_CLICKED ) return;
404
405 /* everything valid? */
406 if ( client_user == 0 ) {
407 client_popup_info( "You must select a user for a challenge." );
408 return;
409 }
410 if ( client_levelset == 0 ) {
411 client_popup_info( "You must select a levelset for a challenge." );
412 return;
413 }
414 if ( client_user->id == client_id ) {
415 client_popup_info( "You can't challenge yourself." );
416 return;
417 }
418
419 strcpy( mp_peer_name, client_user->name );
420 mp_peer_id = client_user->id;
421 strcpy( mp_levelset, client_levelset );
422 mp_diff = config.mp_diff;
423 mp_rounds = config.mp_rounds;
424 mp_balls = config.mp_balls;
425 mp_frags = config.mp_frags;
426
427 /* challenger, challenged, levelset, diff, rounds, frags, balls */
428 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
429 msg_write_int8( MSG_OPEN_GAME );
430 msg_write_int32( mp_peer_id );
431 msg_write_string( mp_levelset );
432 msg_write_int8( mp_diff );
433 msg_write_int8( mp_rounds );
434 msg_write_int8( mp_frags );
435 msg_write_int8( mp_balls );
436 client_transmit( CODE_BLUE, msglen, msgbuf );
437
438 client_popup_info( "You have challenged %s. Let's see what (s)he says...", mp_peer_name );
439 client_state = CLIENT_AWAIT_ANSWER;
440 #endif
441 }
442
443 /*
444 ====================================================================
445 Update multiplayer network configuration.
446 ====================================================================
447 */
448 void client_update_difficulty( GuiWidget *widget, GuiEvent *event )
449 {
450 if ( event->type != GUI_CHANGED ) return;
451 gui_spinbutton_get_value( widget, &config.mp_diff );
452 config.mp_diff--;
453 }
454 void client_update_rounds( GuiWidget *widget, GuiEvent *event )
455 {
456 if ( event->type != GUI_CHANGED ) return;
457 gui_spinbutton_get_value( widget, &config.mp_rounds );
458 }
459 void client_update_frags( GuiWidget *widget, GuiEvent *event )
460 {
461 if ( event->type != GUI_CHANGED ) return;
462 gui_spinbutton_get_value( widget, &config.mp_frags );
463 }
464 void client_update_balls( GuiWidget *widget, GuiEvent *event )
465 {
466 if ( event->type != GUI_CHANGED ) return;
467 gui_spinbutton_get_value( widget, &config.mp_balls );
468 }
469
470 /*
471 ====================================================================
472 Open channel selector
473 ====================================================================
474 */
475 void client_select_channel( GuiWidget *widget, GuiEvent *event )
476 {
477 if ( event->type != GUI_CLICKED ) return;
478 /* select first channel (we always have MAIN) */
479 gui_list_update( list_channels, client_channels->count );
480 if ( client_channels->count > 0 ) {
481 gui_edit_set_text( edit_channel, list_first( client_channels ) );
482 gui_list_select( list_channels, 0,0, 1 );
483 }
484 gui_widget_show( dlg_channels );
485 client_state = CLIENT_SELECT_CHANNEL;
486 }
487 /*
488 ====================================================================
489 Handle channel (un)selection.
490 ====================================================================
491 */
492 void client_handle_channel_list(
493 GuiWidget *widget, GuiEvent *event )
494 {
495 char *name;
496 /* if a channel is selected the name is copied into the edit.
497 unselecting does not change anything. the channel by the
498 caption in the edit is opened on enter_channel() */
499 if ( event->type == GUI_ITEM_SELECTED ) {
500 name = list_get( client_channels, event->item.y );
501 if ( name ) gui_edit_set_text( edit_channel, name );
502 }
503 }
504 /*
505 ====================================================================
506 Close channel selector or enter new channel.
507 ====================================================================
508 */
509 void client_enter_channel( GuiWidget *widget, GuiEvent *event )
510 {
511 #ifdef NETWORK_ENABLED
512 char buf[16];
513
514 if ( event->type != GUI_CLICKED ) return;
515
516 gui_widget_hide( dlg_channels );
517 client_state = CLIENT_NONE;
518
519 /* retreive name of channel we want to enter */
520 buf[0] = 0;
521 gui_edit_get_text( edit_channel, buf, 16, 0,-1 );
522
523 /* send it */
524 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
525 msg_write_int8( MSG_ENTER_CHANNEL );
526 msg_write_string( buf );
527 client_transmit( CODE_BLUE, msglen, msgbuf );
528 #endif
529 }
530 void client_cancel_channel( GuiWidget *widget, GuiEvent *event )
531 {
532 if ( event->type != GUI_CLICKED ) return;
533 gui_widget_hide( dlg_channels );
534 client_state = CLIENT_NONE;
535 }
536
537 /*
538 ====================================================================
539 Close statistics
540 ====================================================================
541 */
542 void client_close_stats( GuiWidget *widget, GuiEvent *event )
543 {
544 if ( event->type != GUI_CLICKED ) return;
545 gui_widget_hide( dlg_stats );
546 client_state = CLIENT_NONE;
547 gui_label_set_text( label_stats, "Awaiting stats..." );
548 gui_label_set_text( label_winner, "..." );
549 }
550
551 /*
552 ====================================================================
553 Send chatter to gamepeer in pauseroom when ENTER was pressed.
554 ====================================================================
555 */
556 void client_send_pausechatter( GuiWidget *widget, GuiEvent *event )
557 {
558 #ifdef NETWORK_ENABLED
559 char buf[MAX_CHATTER_SIZE + 1];
560 if ( widget->type == GUI_EDIT &&
561 event->type == GUI_KEY_RELEASED &&
562 event->key.keysym == SDLK_RETURN ) {
563 /* get message */
564 sprintf( buf, "<%s> ", client_name );
565 gui_edit_get_text( edit_pausechatter,
566 buf+strlen(buf), MAX_CHATTER_SIZE + 1, 0,-1 );
567 /* clear chat edit */
568 gui_edit_set_text( edit_pausechatter, "" );
569 /* deliver message to remote ... */
570 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
571 msg_write_int8( MSG_CHATTER );
572 msg_write_string( buf );
573 client_transmit( CODE_BLUE, msglen, msgbuf );
574 client_add_pausechatter( buf, 0 );
575 }
576 #endif
577 }
578
579 /*
580 ====================================================================
581 Close pauseroom.
582 ====================================================================
583 */
584 void client_close_pauseroom( GuiWidget *widget, GuiEvent *event )
585 {
586 if ( event->type != GUI_CLICKED ) return;
587 close_pause_chat();
588 comm_send_short( MSG_UNPAUSE );
589 }
590
591 /*
592 ====================================================================
593 Popup help dialogue.
594 ====================================================================
595 */
596 void client_popup_help( GuiWidget *widget, GuiEvent *event )
597 {
598 if ( event->type != GUI_CLICKED ) return;
599 gui_widget_show( dlg_help );
600 client_state = CLIENT_HELP;
601 }
602 /*
603 ====================================================================
604 Close help dialogue.
605 ====================================================================
606 */
607 void client_close_help( GuiWidget *widget, GuiEvent *event )
608 {
609 if ( event->type != GUI_CLICKED ) return;
610 gui_widget_hide( dlg_help );
611 }
612 /*
613 ====================================================================
614 Select topic and display help text.
615 ====================================================================
616 */
617 void client_handle_topic_list( GuiWidget *widget, GuiEvent *event )
618 {
619 if ( event->type != GUI_ITEM_SELECTED ) return;
620 if ( event->item.y >= client_topic_count ) return;
621 gui_list_goto( list_help, 0 );
622 if ( client_help_text ) delete_text( client_help_text );
623 client_help_text = create_text( client_helps[event->item.y], 41 );
624 gui_list_update( list_help, client_help_text->count );
625 }
0 /***************************************************************************
1 client_handlers.h - description
2 -------------------
3 begin : Sat Oct 26 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __CLIENT_HANDLERS_H
18 #define __CLIENT_HANDLERS_H
19
20 /*
21 ====================================================================
22 Disconnect from current server if any.
23 ====================================================================
24 */
25 void client_disconnect();
26
27 /*
28 ====================================================================
29 Try to connect to a game server. Retry twice every three seconds
30 or quit then.
31 ====================================================================
32 */
33 void client_connect( GuiWidget *widget, GuiEvent *event );
34
35 /*
36 ====================================================================
37 Open/close the connection window.
38 ====================================================================
39 */
40 void client_open_connect_window( GuiWidget *widget, GuiEvent *event );
41 void client_close_connect_window( GuiWidget *widget, GuiEvent *event );
42
43 /*
44 ====================================================================
45 Close chatroom and return to LBreakout's menu.
46 ====================================================================
47 */
48 void client_quit( GuiWidget *widget, GuiEvent *event );
49
50 /*
51 ====================================================================
52 Close the info window and clear state.
53 ====================================================================
54 */
55 void client_close_info( GuiWidget *widget, GuiEvent *event );
56
57 /*
58 ====================================================================
59 Send chatter this function is either called by the send button
60 or by the edit.
61 ====================================================================
62 */
63 void client_send_chatter(
64 GuiWidget *widget, GuiEvent *event );
65 /*
66 ====================================================================
67 Whisper chatter if a user is selected.
68 ====================================================================
69 */
70 void client_whisper_chatter(
71 GuiWidget *widget, GuiEvent *event );
72
73 /*
74 ====================================================================
75 Update selected peer and levelset.
76 ====================================================================
77 */
78 void client_handle_user_list(
79 GuiWidget *widget, GuiEvent *event );
80 void client_handle_levelset_list(
81 GuiWidget *widget, GuiEvent *event );
82
83 /*
84 ====================================================================
85 Handle confirmation/cancelling of confirmation dialogue.
86 ====================================================================
87 */
88 void client_confirm( GuiWidget *widget, GuiEvent *event );
89 void client_cancel( GuiWidget *widget, GuiEvent *event );
90
91 /*
92 ====================================================================
93 Challenge selected user.
94 ====================================================================
95 */
96 void client_challenge( GuiWidget *widget, GuiEvent *event );
97
98 /*
99 ====================================================================
100 Update multiplayer network configuration.
101 ====================================================================
102 */
103 void client_update_difficulty( GuiWidget *widget, GuiEvent *event );
104 void client_update_rounds( GuiWidget *widget, GuiEvent *event );
105 void client_update_frags( GuiWidget *widget, GuiEvent *event );
106 void client_update_balls( GuiWidget *widget, GuiEvent *event );
107 void client_update_port( GuiWidget *widget, GuiEvent *event );
108
109 /*
110 ====================================================================
111 Allow user to transfer a levelset.
112 ====================================================================
113 */
114 void client_listen( GuiWidget *widget, GuiEvent *event );
115
116 /*
117 ====================================================================
118 Initiate levelset transfer.
119 ====================================================================
120 */
121 void client_transfer( GuiWidget *widget, GuiEvent *event );
122
123 /*
124 ====================================================================
125 Open channel selector
126 ====================================================================
127 */
128 void client_select_channel( GuiWidget *widget, GuiEvent *event );
129 /*
130 ====================================================================
131 Handle channel (un)selection.
132 ====================================================================
133 */
134 void client_handle_channel_list(
135 GuiWidget *widget, GuiEvent *event );
136 /*
137 ====================================================================
138 Close channel selector or enter new channel.
139 ====================================================================
140 */
141 void client_enter_channel( GuiWidget *widget, GuiEvent *event );
142 void client_cancel_channel( GuiWidget *widget, GuiEvent *event );
143
144 /*
145 ====================================================================
146 Close statistics
147 ====================================================================
148 */
149 void client_close_stats( GuiWidget *widget, GuiEvent *event );
150
151 /*
152 ====================================================================
153 Send chatter to gamepeer in pauseroom when ENTER was pressed.
154 ====================================================================
155 */
156 void client_send_pausechatter( GuiWidget *widget, GuiEvent *event );
157
158 /*
159 ====================================================================
160 Close pauseroom.
161 ====================================================================
162 */
163 void client_close_pauseroom( GuiWidget *widget, GuiEvent *event );
164
165 /*
166 ====================================================================
167 Popup help dialogue.
168 ====================================================================
169 */
170 void client_popup_help( GuiWidget *widget, GuiEvent *event );
171 /*
172 ====================================================================
173 Close help dialogue.
174 ====================================================================
175 */
176 void client_close_help( GuiWidget *widget, GuiEvent *event );
177 /*
178 ====================================================================
179 Select topic and display help text.
180 ====================================================================
181 */
182 void client_handle_topic_list( GuiWidget *widget, GuiEvent *event );
183
184 #endif
185
0 /***************************************************************************
1 client_recv.c - description
2 -------------------
3 begin : Sat Oct 26 12:02:57 CEST 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdarg.h>
18 #include "lbreakout.h"
19 #include "client_data.h"
20 #include "game.h"
21 #include "../game/game.h"
22 #include "../gui/gui.h"
23
24 /*
25 ====================================================================
26 Externals
27 ====================================================================
28 */
29 #ifdef NETWORK_ENABLED
30 extern NetSocket client;
31 extern int client_is_connected;
32 #endif
33 extern GuiWidget *dlg_info;
34 extern GuiWidget *dlg_confirm;
35 extern GuiWidget *dlg_chatroom;
36 extern GuiWidget *label_channel;
37 extern GuiWidget *label_info;
38 extern GuiWidget *label_confirm;
39 extern GuiWidget *label_stats;
40 extern GuiWidget *label_winner;
41 extern GuiWidget *list_chatter;
42 extern GuiWidget *list_levels;
43 extern GuiWidget *list_users;
44 extern GuiWidget *list_games;
45 extern List *client_users;
46 extern List *client_channels;
47 extern List *client_levelsets;
48 extern int client_state;
49 extern List *levels;
50 extern int net_buffer_cur_size, msg_read_pos;
51 extern char net_buffer[MAX_MSG_SIZE + PACKET_HEADER_SIZE];
52 /* CHALLENGE */
53 extern char client_name[16];
54 extern int client_recv_limit;
55 extern char *mp_diff_names[];
56 extern char mp_levelset[16];
57 extern int mp_peer_id;
58 extern char mp_peer_name[16];
59 extern int mp_levelset_version;
60 extern int mp_levelset_update;
61 extern int mp_level_count;
62 extern int levelset_version, levelset_update;
63 extern int mp_diff, mp_rounds, mp_frags, mp_balls;
64 extern ClientUser *client_user;
65 extern void client_run_game( int challenger );
66 extern void client_disconnect(); /* from client.c */
67 extern int client_comm_delay;
68
69 /*
70 ====================================================================
71 Popup info dialogue and set status to INFO.
72 ====================================================================
73 */
74 void client_popup_info( char *format, ... )
75 {
76 char buffer[256];
77 va_list args;
78 va_start( args, format );
79 vsnprintf( buffer, 256, format, args );
80 va_end( args );
81 gui_label_set_text( label_info, buffer );
82 gui_widget_show( dlg_info );
83 client_state = CLIENT_INFO;
84 }
85 /*
86 ====================================================================
87 Popup confirm dialogue and _keep_ status.
88 ====================================================================
89 */
90 void client_popup_confirm( char *format, ... )
91 {
92 char buffer[256];
93 va_list args;
94 va_start( args, format );
95 vsnprintf( buffer, 256, format, args );
96 va_end( args );
97 gui_label_set_text( label_confirm, buffer );
98 gui_widget_show( dlg_confirm );
99 }
100
101 /*
102 ====================================================================
103 Parse all messages in net_packet.
104 ====================================================================
105 */
106 #ifdef NETWORK_ENABLED
107 static void client_parse_packet()
108 {
109 int i, num;
110 char name[16];
111 unsigned char type;
112 int handled;
113
114 while ( 1 ) {
115 type = (unsigned)msg_read_int8(); handled = 0;
116
117 if ( msg_read_failed() ) break; /* no more messages */
118
119 switch ( type ) {
120 case MSG_PREPARE_FULL_UPDATE:
121 /* do only clear users as channels and
122 * levelsets are fixed */
123 list_clear( client_users ); client_user = 0;
124 handled = 1;
125 break;
126 case MSG_ERROR:
127 client_printf_chatter( 1, "ERROR: %s", msg_read_string() );
128 handled = 1;
129 break;
130 case MSG_BUSY:
131 if ( client_state == CLIENT_AWAIT_ANSWER ||
132 client_state == CLIENT_AWAIT_TRANSFER_CONFIRMATION )
133 client_popup_info(
134 "%s is busy at the moment.",
135 mp_peer_name );
136 handled = 1;
137 break;
138 case MSG_DISCONNECT:
139 client_disconnect();
140 handled = 1;
141 break;
142 case MSG_SET_COMM_DELAY:
143 client_comm_delay = msg_read_int16();
144 printf( "comm_delay set to %i\n", client_comm_delay );
145 handled = 1;
146 break;
147 /* chatter */
148 case MSG_SERVER_INFO:
149 client_add_chatter( msg_read_string(), 1 );
150 handled = 1;
151 break;
152 case MSG_CHATTER:
153 client_add_chatter( msg_read_string(), 0 );
154 handled = 1;
155 break;
156 /* users */
157 case MSG_ADD_USER:
158 num = msg_read_int32();
159 snprintf( name, 16, msg_read_string() ); name[15] = 0;
160 if ( msg_read_failed() ) break;
161 client_add_user( num, name );
162 gui_list_update(
163 list_users,
164 client_users->count );
165 /* re-select current entry */
166 if ( client_user ) {
167 num = list_check( client_users, client_user );
168 if ( num != -1 )
169 gui_list_select( list_users, 0, num, 1 );
170 }
171 handled = 1;
172 break;
173 case MSG_REMOVE_USER:
174 num = msg_read_int32();
175 if ( msg_read_failed() ) break;
176 client_remove_user( num );
177 gui_list_update(
178 list_users,
179 client_users->count );
180 /* re-select current entry */
181 if ( client_user ) {
182 num = list_check( client_users, client_user );
183 if ( num != -1 )
184 gui_list_select( list_users, 0, num, 1 );
185 }
186 handled = 1;
187 break;
188 case MSG_CHANNEL_LIST:
189 list_clear( client_channels );
190 num = msg_read_int8();
191 for ( i = 0; i < num; i++ )
192 list_add( client_channels, strdup(msg_read_string()) );
193 handled = 1;
194 break;
195 case MSG_LEVELSET_LIST:
196 list_clear( client_levelsets );
197 num = msg_read_int8();
198 for ( i = 0; i < num; i++ )
199 list_add( client_levelsets, strdup(msg_read_string()) );
200 gui_list_update( list_levels, client_levelsets->count );
201 handled = 1;
202 break;
203 case MSG_ADD_LEVELSET:
204 list_add( client_levelsets, strdup(msg_read_string()) );
205 gui_list_update( list_levels, client_levelsets->count );
206 handled = 1;
207 break;
208 case MSG_SET_CHANNEL:
209 /* we only need to update the name */
210 gui_label_set_text( label_channel, msg_read_string() );
211 handled = 1;
212 break;
213 /* challenge */
214 case MSG_CHALLENGE:
215 /* the user may only be challenged if client state is NONE
216 because otherwise he is doing something that shouldn't be
217 interrupted */
218 if ( client_state != CLIENT_NONE ) {
219 msg_begin_writing( msgbuf, &msglen, 128 );
220 msg_write_int8( MSG_BUSY );
221 msg_write_int32( msg_read_int32() );
222 client_transmit( CODE_BLUE, msglen, msgbuf );
223 break;
224 }
225 snprintf( mp_peer_name, 15, msg_read_string() );
226 snprintf( mp_levelset, 16, msg_read_string() );
227 mp_diff = msg_read_int8();
228 mp_rounds = msg_read_int8();
229 mp_frags = msg_read_int8();
230 mp_balls = msg_read_int8();
231 if ( msg_read_failed() ) break;
232 client_popup_confirm( " You have been challenged!##"\
233 " Challenger: %13s#"\
234 " Levelset: %13s#"\
235 " Difficulty: %13s#"\
236 " Rounds: %13i#"\
237 " Frag Limit: %13i#"\
238 " Balls: %13i",
239 mp_peer_name, mp_levelset, mp_diff_names[mp_diff],
240 mp_rounds, mp_frags, mp_balls );
241 client_state = CLIENT_ANSWER;
242 handled = 1;
243 break;
244 case MSG_REJECT_CHALLENGE:
245 handled = 1;
246 if ( client_state != CLIENT_AWAIT_ANSWER ) break;
247 client_popup_info(
248 "%s is too scared to accept your challenge.",
249 mp_peer_name );
250 break;
251 case MSG_CANCEL_GAME:
252 handled = 1;
253 if ( client_state != CLIENT_ANSWER ) break;
254 gui_widget_hide( dlg_confirm );
255 client_popup_info( "%s got cold feet.", mp_peer_name );
256 break;
257 case MSG_ACCEPT_CHALLENGE:
258 handled = 1;
259 if ( client_state != CLIENT_AWAIT_ANSWER ) break;
260 gui_widget_hide( dlg_info );
261
262 /* play */
263 gui_disable_event_filter();
264 if ( client_game_init_network( mp_peer_name, mp_diff ) )
265 client_game_run();
266 client_game_finalize();
267 gui_enable_event_filter();
268
269 gui_widget_draw( dlg_chatroom );
270 stk_display_fade( STK_FADE_IN, STK_FADE_DEFAULT_TIME );
271 break;
272
273 /* dummy parse game packets that may arrive after the QUIT_GAME
274 * message was sent because ADD_USER commands may be in the
275 * package and these we should get. */
276 case MSG_PADDLE_STATE:
277 comm_unpack_paddle_dummy( net_buffer, &msg_read_pos );
278 handled = 1;
279 break;
280 case MSG_SHOT_POSITIONS:
281 comm_unpack_shots_dummy( net_buffer, &msg_read_pos );
282 handled = 1;
283 break;
284 case MSG_BALL_POSITIONS:
285 comm_unpack_balls_dummy( net_buffer, &msg_read_pos );
286 handled = 1;
287 break;
288 case MSG_SCORES:
289 comm_unpack_scores_dummy( net_buffer, &msg_read_pos );
290 handled = 1;
291 break;
292 case MSG_BRICK_HITS:
293 comm_unpack_brick_hits_dummy( net_buffer, &msg_read_pos );
294 handled = 1;
295 break;
296 case MSG_NEW_EXTRAS:
297 comm_unpack_collected_extras_dummy( net_buffer, &msg_read_pos );
298 handled = 1;
299 break;
300 case MSG_ROUND_OVER:
301 i = msg_read_int8();
302 handled = 1;
303 break;
304 case MSG_LAST_ROUND_OVER:
305 i = msg_read_int8();
306 handled = 1;
307 break;
308
309 }
310
311 if ( !handled ) {
312 printf( "chat: state %i: invalid message %x: skipping %i bytes\n",
313 client_state, type, net_buffer_cur_size - msg_read_pos );
314 msg_read_pos = net_buffer_cur_size;
315 }
316 }
317 }
318 #endif
319
320 /*
321 ====================================================================
322 Receive packets from server. Use the TIME_PASSED event therefore.
323 Send a heartbeat every three seconds as well.
324 ====================================================================
325 */
326 void client_recv_packet( GuiWidget *widget, GuiEvent *event )
327 {
328 #ifdef NETWORK_ENABLED
329 int recv_limit;
330 static int last_heartbeat = 0;
331
332 if ( !client_is_connected ) return;
333 if ( event->type != GUI_TIME_PASSED ) return;
334
335 /* heartbeat? */
336 if ( time(0) >= last_heartbeat + 10 ) {
337 last_heartbeat = time(0);
338 msgbuf[0] = MSG_HEARTBEAT;
339 client_transmit( CODE_BLUE, 1, msgbuf );
340 }
341
342 recv_limit = client_recv_limit; /* limited number of packets if not -1 */
343 while ( net_recv_packet() && ( recv_limit==-1 || recv_limit > 0) ) {
344
345 /* check if this is a valid packet and update the socket */
346 if ( msg_is_connectionless() )
347 msg_begin_connectionless_reading();
348 else
349 if ( !socket_process_header( &client ) )
350 continue;
351 client_parse_packet();
352
353 if ( recv_limit != -1 ) recv_limit--;
354 }
355 #endif
356 }
357
0 /***************************************************************************
1 comm.c - description
2 -------------------
3 begin : Fri Aug 2 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../gui/gui.h"
19 #include "../game/game.h"
20 #include "game.h"
21 #include "client_data.h"
22 #include "bricks.h"
23 #include "extras.h"
24 #include "comm.h"
25
26 extern char net_buffer[MAX_MSG_SIZE + PACKET_HEADER_SIZE];
27 extern int net_buffer_cur_size;
28 extern int msg_read_pos;
29 extern char msgbuf[MAX_MSG_SIZE];
30 extern int msglen;
31 extern NetSocket client;
32 extern StkFont *chat_font_error;
33 extern int client_is_connected;
34 extern int client_state;
35 extern Game *game, *local_game;
36 extern Player *cur_player;
37 extern Paddle *r_paddle;
38 #ifdef AUDIO_ENABLED
39 extern StkSound *wav_shot, *wav_reflect_paddle, *wav_reflect_brick, *wav_attach;
40 #endif
41 extern int game_stats[2][7];
42 extern int game_over;
43 extern int client_comm_delay;
44 extern int stats_received;
45 extern GuiWidget *dlg_pauseroom;
46 extern List *client_levelsets;
47 extern int client_recv_limit;
48
49 extern void set_state( int newstate );
50 extern void init_next_round( void );
51 extern void display_final_stats( void );
52 extern void open_pause_chat( char *text );
53 extern void close_pause_chat( void);
54
55 extern int last_ball_brick_reflect_x; /* HACK: used to play local sound */
56 extern int last_ball_paddle_reflect_x; /* HACK: used to play local sound */
57 extern int last_ball_attach_x; /* HACK: used to play local sound */
58 extern int last_shot_fire_x; /* HACK: used to play local sound */
59
60 /* handle modifications game::mod_* which were either copied
61 * from local_game or received via network, apply the changes to
62 * game and clear these entries. the current game entry must've
63 * been set to 'game'. Ball and shot updates have already been
64 * applied to the game context. */
65 #ifdef NETWORK_ENABLED
66 static void handle_mods()
67 {
68 BrickHit *brickhits;
69 int *extras, count;
70 int i, j;
71
72 #ifdef AUDIO_ENABLED
73 /* play sounds for attached, reflected balls or fired shots */
74 /* HACK: in a local game use externals from game/balls.c
75 * last_ball_*_x to play sound stereo. this cannot be used for
76 * network games */
77 if ( local_game == 0 )
78 {
79 if ( game_get_fired_shot_count() )
80 stk_sound_play( wav_shot );
81 if ( game_get_brick_reflected_ball_count() )
82 stk_sound_play( wav_reflect_brick );
83 if ( game_get_paddle_reflected_ball_count() )
84 stk_sound_play( wav_reflect_paddle );
85 if ( game_get_attached_ball_count() )
86 stk_sound_play( wav_attach );
87 }
88 else
89 {
90 if ( last_ball_brick_reflect_x != -1 )
91 stk_sound_play_x( last_ball_brick_reflect_x, wav_reflect_brick );
92 if ( last_ball_paddle_reflect_x != -1 )
93 stk_sound_play_x( last_ball_paddle_reflect_x, wav_reflect_paddle );
94 if ( last_ball_attach_x != -1 )
95 stk_sound_play_x( last_ball_attach_x, wav_attach );
96 if ( last_shot_fire_x != -1 )
97 stk_sound_play_x( last_shot_fire_x, wav_shot );
98 last_ball_brick_reflect_x = -1;
99 last_ball_paddle_reflect_x = -1;
100 last_ball_attach_x = -1;
101 last_shot_fire_x = -1;
102 }
103 #endif
104 /* handle brick hits and create new extras. the extras
105 * are moved independently by the client and destroyed on
106 * collection but DO NOT TAKE EFFECT */
107 brickhits = game_get_brick_hits( &count );
108 for ( i = 0; i < count; i++ )
109 client_handle_brick_hit( &brickhits[i] );
110
111 /* these collected extras take effect */
112 for ( i = 0; i < game->paddle_count; i++ ) {
113 extras = game_get_collected_extras( i, &count );
114 for ( j = 0; j < count; j++ )
115 client_handle_collected_extra( game->paddles[i], extras[j] );
116 }
117
118 game_reset_mods();
119 }
120 #endif
121
122 #ifdef NETWORK_ENABLED
123 /* copy stuff from local_game to game */
124 static void comm_recv_local( void )
125 {
126 Ball *ball, *ballcopy;
127 Shot *shot, *shotcopy;
128
129 /* copy balls */
130 list_clear( game->balls );
131 list_reset( local_game->balls );
132 while ( (ball = list_next(local_game->balls)) ) {
133 ballcopy = salloc( 1, sizeof(Ball) );
134 ballcopy->x = ball->x;
135 ballcopy->y = ball->y;
136 ballcopy->attached = ball->attached;
137 if ( ball->attached ) {
138 if ( ball->paddle == local_game->paddles[0] )
139 ballcopy->paddle = game->paddles[0];
140 else
141 ballcopy->paddle = game->paddles[1];
142 }
143 list_add( game->balls, ballcopy );
144 }
145
146 /* copy shots */
147 list_clear( game->shots );
148 list_reset( local_game->shots );
149 while ( (shot = list_next(local_game->shots)) ) {
150 shotcopy = salloc( 1, sizeof(Shot) );
151 shotcopy->x = shot->x;
152 shotcopy->y = shot->y;
153 list_add( game->shots, shotcopy );
154 }
155
156 /* copy score */
157 game->paddles[0]->score = local_game->paddles[0]->score;
158
159 /* copy level_over */
160 game->level_over = local_game->level_over;
161 game->winner = local_game->winner;
162
163 /* modifications are transferred to game::mod
164 * and handled by the same function that does this
165 * for net updates below. while handle_mods()
166 * resets the mods in the game struct, the
167 * local_game mods must be cleared as well */
168 game->mod = local_game->mod;
169 handle_mods();
170 local_game->mod = game->mod;
171
172 return;
173 }
174
175 /* parse incoming packets and handle them according to the client's
176 * state */
177 static void comm_parse_packet()
178 {
179 BrickHit *brickhits;
180 unsigned char type;
181 int *extras, count;
182 int i, j;
183 char name[16];
184 int handled;
185
186 /* the list of shots is reset before as shot_positions
187 * will not be send when no shots are available */
188 list_clear( game->shots );
189
190 while ( 1 ) {
191 type = (unsigned)msg_read_int8(); handled = 0;
192
193 if ( msg_read_failed() ) break; /* no more messages */
194
195 msglen = 0; /* game unpack functions require a position pointer which
196 is always 0 at the moment */
197
198 switch ( type ) {
199 case MSG_SET_COMM_DELAY:
200 client_comm_delay = msg_read_int16();
201 printf( "comm_delay set to %i\n", client_comm_delay );
202 handled = 1;
203 break;
204 case MSG_DISCONNECT:
205 /* close the pause chatroom window if open */
206 if ( client_state == CS_PAUSE )
207 close_pause_chat();
208
209 set_state( CS_FATAL_ERROR );
210 display_text( chat_font_error, "You've been disconnected." );
211 client_data_clear();
212 client_is_connected = 0;
213 handled = 1;
214 break;
215 case MSG_ERROR:
216 /* close the pause chatroom window if open */
217 if ( client_state == CS_PAUSE )
218 close_pause_chat();
219 /* break up game but wait for the stats */
220 set_state( CS_FATAL_ERROR );
221 display_text( chat_font_error, msg_read_string() );
222 handled = 1;
223 break;
224 case MSG_LEVEL_DATA:
225 cur_player->next_paddle_id = msg_read_int8(); /* top or bottom? */
226 msg_read( 536, msgbuf );
227 if ( !msg_read_failed() ) {
228 comm_unpack_level( &cur_player->snapshot, msgbuf, &msglen );
229 cur_player->next_level_received = 1;
230 handled = 1;
231 }
232 else {
233 set_state( CS_FATAL_ERROR );
234 display_text( chat_font_error, "corrupted level data" );
235 }
236 break;
237 case MSG_ADD_USER:
238 i = msg_read_int32();
239 snprintf( name, 16, msg_read_string() ); name[15] = 0;
240 if ( msg_read_failed() ) break;
241 client_add_user( i, name );
242 handled = 1;
243 break;
244 case MSG_REMOVE_USER:
245 i = msg_read_int32();
246 if ( msg_read_failed() ) break;
247 client_remove_user( i );
248 handled = 1;
249 break;
250 case MSG_ADD_LEVELSET:
251 list_add( client_levelsets, strdup(msg_read_string()) );
252 handled = 1;
253 break;
254 case MSG_PAUSE:
255 open_pause_chat( "Remote player has paused the game." );
256 handled = 1;
257 break;
258 case MSG_UNPAUSE:
259 close_pause_chat();
260 handled = 1;
261 break;
262 case MSG_CHATTER:
263 client_add_pausechatter( msg_read_string(), 0 );
264 handled = 1;
265 break;
266 }
267
268 /* game_only packets but received any time */
269 //if ( client_state == CS_PLAY )
270 switch ( type ) {
271 case MSG_PADDLE_STATE:
272 comm_unpack_paddle( r_paddle, net_buffer, &msg_read_pos );
273 handled = 1;
274 break;
275 case MSG_SHOT_POSITIONS:
276 comm_unpack_shots( net_buffer, &msg_read_pos );
277 handled = 1;
278 break;
279 case MSG_BALL_POSITIONS:
280 comm_unpack_balls( net_buffer, &msg_read_pos );
281
282 #ifdef AUDIO_ENABLED
283 /* play sounds for attached, reflected balls or fired shots */
284 if ( game_get_fired_shot_count() )
285 stk_sound_play( wav_shot );
286 if ( game_get_brick_reflected_ball_count() )
287 stk_sound_play( wav_reflect_brick );
288 if ( game_get_paddle_reflected_ball_count() )
289 stk_sound_play( wav_reflect_paddle );
290 if ( game_get_attached_ball_count() )
291 stk_sound_play( wav_attach );
292 game->mod.fired_shot_count = 0;
293 game->mod.attached_ball_count = 0;
294 game->mod.brick_reflected_ball_count = 0;
295 game->mod.paddle_reflected_ball_count = 0;
296 #endif
297 handled = 1;
298 break;
299 case MSG_SCORES:
300 comm_unpack_scores( net_buffer, &msg_read_pos );
301 handled = 1;
302 break;
303 case MSG_BRICK_HITS:
304 comm_unpack_brick_hits( net_buffer, &msg_read_pos );
305
306 /* handle brick hits and create new extras. the extras
307 * are moved independently by the client and destroyed on
308 * collection but DO NOT TAKE EFFECT */
309 brickhits = game_get_brick_hits( &count );
310 for ( i = 0; i < count; i++ )
311 client_handle_brick_hit( &brickhits[i] );
312 game->mod.brick_hit_count = 0;
313 handled = 1;
314 break;
315 case MSG_NEW_EXTRAS:
316 comm_unpack_collected_extras( net_buffer, &msg_read_pos );
317
318 /* these collected extras take effect */
319 for ( i = 0; i < game->paddle_count; i++ ) {
320 extras = game_get_collected_extras( i, &count );
321 for ( j = 0; j < count; j++ )
322 client_handle_collected_extra(
323 game->paddles[i], extras[j] );
324 }
325 game->mod.collected_extra_count[0] = 0;
326 game->mod.collected_extra_count[1] = 0;
327 handled = 1;
328 break;
329 case MSG_ROUND_OVER:
330 game->level_over = 1;
331 game->winner = msg_read_int8();
332 handled = 1;
333 break;
334 case MSG_LAST_ROUND_OVER:
335 game->level_over = 1;
336 game->winner = msg_read_int8();
337 game_over = 1;
338 handled = 1;
339 break;
340 }
341
342 /* stats may arrive anywhere */
343 switch ( type ) {
344 case MSG_GAME_STATS:
345 memset( game_stats, 0, sizeof( game_stats ) );
346 game_stats[0][0] = msg_read_int8();
347 game_stats[1][0] = msg_read_int8();
348 game_stats[0][1] = msg_read_int8();
349 game_stats[1][1] = msg_read_int8();
350 game_stats[0][2] = msg_read_int8();
351 game_stats[1][2] = msg_read_int8();
352 game_stats[0][3] = msg_read_int32();
353 game_stats[1][3] = msg_read_int32();
354 game_stats[0][4] = msg_read_int8();
355 game_stats[1][4] = msg_read_int8();
356 game_stats[0][5] = msg_read_int8();
357 game_stats[1][5] = msg_read_int8();
358 game_stats[0][6] = msg_read_int8();
359 game_stats[1][6] = msg_read_int8();
360 stats_received = 1;
361 handled = 1;
362 break;
363 }
364
365 if ( !handled ) {
366 printf( "game: state %i: invalid message %x: skipping %i bytes\n",
367 client_state, type, net_buffer_cur_size - msg_read_pos );
368 msg_read_pos = net_buffer_cur_size;
369 }
370 }
371 }
372 #endif
373
374 /* send state of local paddle */
375 void comm_send_paddle( Paddle *paddle )
376 {
377 if ( game->game_type == GT_LOCAL ) {
378 /* simply copy the data */
379 if ( local_game->paddles[PADDLE_BOTTOM]->x != paddle->x )
380 local_game->paddles[PADDLE_BOTTOM]->invis_delay = PADDLE_INVIS_DELAY;
381 local_game->paddles[PADDLE_BOTTOM]->x = paddle->x;
382 local_game->paddles[PADDLE_BOTTOM]->fire_left = paddle->fire_left;
383 local_game->paddles[PADDLE_BOTTOM]->fire_right = paddle->fire_right;
384 local_game->paddles[PADDLE_BOTTOM]->ball_return_key_pressed =
385 paddle->ball_return_key_pressed;
386 local_game->paddles[PADDLE_BOTTOM]->maxballspeed_request =
387 paddle->maxballspeed_request;
388 local_game->paddles[PADDLE_BOTTOM]->maxballspeed_request_old =
389 paddle->maxballspeed_request_old;
390 return;
391 }
392
393 msgbuf[0] = MSG_PADDLE_STATE; msglen = 1;
394 comm_pack_paddle( paddle, msgbuf, &msglen );
395 client_transmit( CODE_BLUE, msglen, msgbuf );
396 }
397
398 void comm_send_short( int msg )
399 {
400 if ( game->game_type == GT_LOCAL ) return;
401
402 /* send these messages as code blue. if they are dropped
403 * the player and server will notice as nothing happens */
404 msgbuf[0] = msg;
405 client_transmit( CODE_BLUE, 1, msgbuf );
406 }
407
408 /* receive any data but only handle such messages valid
409 * in the current state. */
410 void comm_recv( void )
411 {
412 #ifdef NETWORK_ENABLED
413 int recv_limit;
414
415 /* fake communication in local game */
416 if ( game->game_type == GT_LOCAL ) {
417 comm_recv_local();
418 return;
419 }
420
421 if ( !client_is_connected ) return;
422
423 recv_limit = client_recv_limit; /* limited number of packets if not -1 */
424 while ( net_recv_packet() && ( recv_limit==-1 || recv_limit > 0) ) {
425 /* check if this is a valid packet and update the socket */
426 if ( msg_is_connectionless() )
427 msg_begin_connectionless_reading();
428 else
429 if ( !socket_process_header( &client ) )
430 continue;
431 comm_parse_packet();
432
433 if ( recv_limit != -1 ) recv_limit--;
434 }
435 #endif
436 }
437
438 /* send a heartbeat every 2 seconds except in the actual game as we
439 * send paddle updates there */
440 void comm_send_heartbeat( void )
441 {
442 static int last_heartbeat = 0;
443
444 if ( client_state != CS_PLAY )
445 if ( time(0) >= last_heartbeat + 3 ) {
446 last_heartbeat = time(0);
447 msgbuf[0] = MSG_HEARTBEAT;
448 client_transmit( CODE_BLUE, 1, msgbuf );
449 }
450
451 }
452
0 /***************************************************************************
1 comm.h - description
2 -------------------
3 begin : Fri Aug 2 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __COMM_CLIENT_H
18 #define __COMM_CLIENT_H
19
20 void comm_send_paddle( Paddle *paddle );
21 void comm_send_short( int msg ); /* single byte messages */
22
23 /* receive any data but only handle such messages valid
24 * in the current state */
25 void comm_recv( void );
26
27 /* send a heartbeat every 2 seconds except in the actual game as we
28 * send paddle updates there */
29 void comm_send_heartbeat( void );
30
31 #endif
0 /***************************************************************************
1 config.c - description
2 -------------------
3 begin : Tue Feb 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18
19 #include <dirent.h>
20 #include <sys/types.h>
21 #include <sys/stat.h>
22
23 #include "config.h"
24 #include "../common/parser.h"
25
26 #ifdef _WIN32
27 #define MKDIR(d, p) mkdir(d)
28 #else
29 #define MKDIR mkdir
30 #endif
31
32 Config config;
33
34 #define CONFIG_FILE_NAME "lbreakout2.conf"
35
36 /* check if config directory exists; if not create it and set config_dir */
37 void config_check_dir()
38 {
39 char level_dir[512];
40 snprintf( config.dir_name, sizeof(config.dir_name)-1, "%s/%s", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
41 /* test and create .lgames */
42 if ( opendir( config.dir_name ) == 0 ) {
43 fprintf( stderr, "couldn't find/open config directory '%s'\n", config.dir_name );
44 fprintf( stderr, "attempting to create it... " );
45 MKDIR( config.dir_name, S_IRWXU );
46 if ( opendir( config.dir_name ) == 0 )
47 fprintf( stderr, "failed\n" );
48 else
49 fprintf( stderr, "ok\n" );
50 }
51 /* create levels directory */
52 sprintf( level_dir, "%s/lbreakout2-levels", config.dir_name );
53 MKDIR( level_dir, S_IRWXU );
54 /* create themes directory */
55 sprintf( level_dir, "%s/lbreakout2-themes", config.dir_name );
56 MKDIR( level_dir, S_IRWXU );
57 }
58
59 /* set config to default */
60 void config_reset()
61 {
62 /* levels */
63 config.levelset_id_local = 0;
64 config.levelset_count_local = 0;
65 config.levelset_id_home = 0;
66 config.levelset_count_home = 0;
67 /* player */
68 config.player_count = 1;
69 strcpy( config.player_names[0], "Michael" );
70 strcpy( config.player_names[1], "Mr.X" );
71 strcpy( config.player_names[2], "Mr.Y" );
72 strcpy( config.player_names[3], "Mr.Z" );
73 /* game */
74 config.diff = 2;
75 config.startlevel = 0;
76 config.rel_warp_limit = 80;
77 /* controls */
78 config.k_left = SDLK_LEFT;
79 config.k_right = SDLK_RIGHT;
80 config.k_rfire = SDLK_SPACE;
81 config.k_lfire = SDLK_y;
82 config.k_return = SDLK_BACKSPACE;
83 config.k_turbo = SDLK_x;
84 config.k_warp = SDLK_w;
85 config.k_maxballspeed = SDLK_c;
86 config.grab = 1;
87 config.rel_motion = 1;
88 config.i_motion_mod = 120;
89 config.motion_mod = 1.2;
90 config.convex = 1;
91 config.linear_corner = 0;
92 config.invert = 0;
93 config.i_key_speed = 500;
94 config.key_speed = 0.5;
95 config.random_angle = 1;
96 config.maxballspeed_int1000 = 700;
97 config.maxballspeed_float = 0.7;
98 /* sounds */
99 config.sound = 1;
100 config.volume = 8;
101 config.speech = 1;
102 config.audio_buffer_size = 512;
103 /* graphics */
104 config.anim = 2;
105 config.fullscreen = 0;
106 config.fade = 1;
107 config.bonus_info = 1;
108 config.fps = 0;
109 config.ball_level = BALL_BELOW_BONUS;
110 config.debris_level = DEBRIS_ABOVE_BALL;
111 /* various */
112 config.use_hints = 1;
113 config.return_on_click = 0;
114 config.theme_id = 0;
115 config.theme_count = 4;
116 /* multiplayer */
117 strcpy( config.server, "217.160.141.22:8000" );
118 strcpy( config.local_port, "8001" );
119 strcpy( config.username, "player" );
120 config.mp_diff = 1;
121 config.mp_rounds = 1;
122 config.mp_balls = 3;
123 config.mp_frags = 10;
124 config.recv_limit = 500;
125 }
126
127 /* load config */
128 void config_load( )
129 {
130 char *str;
131 char file_name[512];
132 PData *pd;
133 /* set to defaults */
134 config_check_dir();
135 config_reset();
136 /* load config */
137 sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME );
138 if ( ( pd = parser_read_file( "config", file_name ) ) == 0 ) {
139 fprintf( stderr, "%s\n", parser_get_error() );
140 return;
141 }
142 /* assign */
143 parser_get_int( pd, "set_id_local", &config.levelset_id_local );
144 parser_get_int( pd, "set_count_local", &config.levelset_count_local );
145 parser_get_int( pd, "set_id_home", &config.levelset_id_home );
146 parser_get_int( pd, "set_count_home", &config.levelset_count_home );
147 parser_get_int( pd, "player_count", &config.player_count );
148 if ( parser_get_value( pd, "player0", &str, 0 ) )
149 strcpy_lt( config.player_names[0], str, 31 );
150 if ( parser_get_value( pd, "player1", &str, 0 ) )
151 strcpy_lt( config.player_names[1], str, 31 );
152 if ( parser_get_value( pd, "player2", &str, 0 ) )
153 strcpy_lt( config.player_names[2], str, 31 );
154 if ( parser_get_value( pd, "player3", &str, 0 ) )
155 strcpy_lt( config.player_names[3], str, 31 );
156 parser_get_int( pd, "diff", &config.diff );
157 parser_get_int( pd, "starting_level", &config.startlevel );
158 parser_get_int( pd, "rel_warp_limit", &config.rel_warp_limit );
159 parser_get_int( pd, "left", &config.k_left );
160 parser_get_int( pd, "right", &config.k_right );
161 parser_get_int( pd, "fire_left", &config.k_lfire );
162 parser_get_int( pd, "fire_right", &config.k_rfire );
163 parser_get_int( pd, "return", &config.k_return );
164 parser_get_int( pd, "turbo", &config.k_turbo );
165 parser_get_int( pd, "rel_motion", &config.rel_motion );
166 parser_get_int( pd, "grab", &config.grab );
167 parser_get_int( pd, "motion_mod", &config.i_motion_mod );
168 config.motion_mod = 0.01 * config.i_motion_mod;
169 parser_get_int( pd, "convex", &config.convex );
170 parser_get_int( pd, "linear_corner", &config.linear_corner );
171 parser_get_int( pd, "random_angle", &config.random_angle );
172 parser_get_int( pd, "maxballspeed", &config.maxballspeed_int1000 );
173 config.maxballspeed_float = (float)config.maxballspeed_int1000 / 1000;
174 parser_get_int( pd, "invert", &config.invert );
175 parser_get_int( pd, "sound", &config.sound );
176 parser_get_int( pd, "volume", &config.volume );
177 parser_get_int( pd, "speech", &config.speech );
178 parser_get_int( pd, "audio_buffer_size", &config.audio_buffer_size );
179 parser_get_int( pd, "anim", &config.anim );
180 parser_get_int( pd, "fullscreen", &config.fullscreen );
181 parser_get_int( pd, "fade", &config.fade );
182 parser_get_int( pd, "bonus_info", &config.bonus_info );
183 parser_get_int( pd, "fps", &config.fps );
184 parser_get_int( pd, "ball_level", &config.ball_level );
185 parser_get_int( pd, "debris_level", &config.debris_level );
186 parser_get_int( pd, "i_key_speed", &config.i_key_speed );
187 config.key_speed = 0.001 * config.i_key_speed;
188 parser_get_int( pd, "use_hints", &config.use_hints );
189 parser_get_int( pd, "return_on_click", &config.return_on_click );
190 parser_get_int( pd, "theme_id", &config.theme_id );
191 parser_get_int( pd, "theme_count", &config.theme_count );
192 if ( parser_get_value( pd, "server", &str, 0 ) )
193 strcpy_lt( config.server, str, 64 );
194 if ( parser_get_value( pd, "local_port", &str, 0 ) )
195 strcpy_lt( config.local_port, str, 6 );
196 if ( parser_get_value( pd, "username", &str, 0 ) )
197 strcpy_lt( config.username, str, 15 );
198 parser_get_int( pd, "mp_diff", &config.mp_diff );
199 parser_get_int( pd, "mp_rounds", &config.mp_rounds );
200 parser_get_int( pd, "mp_frags", &config.mp_frags );
201 parser_get_int( pd, "mp_balls", &config.mp_balls );
202 parser_free( &pd );
203 }
204
205 /* save config */
206 void config_save( )
207 {
208 FILE *file = 0;
209 char file_name[512];
210
211 sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME );
212 if ( ( file = fopen( file_name, "w" ) ) == 0 )
213 fprintf( stderr, "Cannot access config file '%s' to save settings\n", file_name );
214 else {
215 fprintf( file, "@\n" );
216 fprintf( file, "set_id_local»%i\n", config.levelset_id_local );
217 fprintf( file, "set_count_local»%i\n", config.levelset_count_local );
218 fprintf( file, "set_id_home»%i\n", config.levelset_id_home );
219 fprintf( file, "set_count_home»%i\n", config.levelset_count_home );
220 fprintf( file, "player_count»%i\n", config.player_count );
221 fprintf( file, "player0»%s\n", config.player_names[0] );
222 fprintf( file, "player1»%s\n", config.player_names[1] );
223 fprintf( file, "player2»%s\n", config.player_names[2] );
224 fprintf( file, "player3»%s\n", config.player_names[3] );
225 fprintf( file, "diff»%i\n", config.diff );
226 fprintf( file, "starting_level»%i\n", config.startlevel );
227 fprintf( file, "rel_warp_limit»%i\n", config.rel_warp_limit );
228 fprintf( file, "left»%i\n", config.k_left );
229 fprintf( file, "right»%i\n", config.k_right );
230 fprintf( file, "fire_left»%i\n", config.k_lfire );
231 fprintf( file, "fire_right»%i\n", config.k_rfire );
232 fprintf( file, "return»%i\n", config.k_return );
233 fprintf( file, "turbo»%i\n", config.k_turbo );
234 fprintf( file, "rel_motion»%i\n", config.rel_motion );
235 fprintf( file, "grab»%i\n", config.grab );
236 fprintf( file, "motion_mod»%i\n", config.i_motion_mod);
237 fprintf( file, "convex»%i\n", config.convex );
238 fprintf( file, "linear_corner»%i\n", config.linear_corner );
239 fprintf( file, "random_angle»%i\n", config.random_angle );
240 fprintf( file, "maxballspeed»%i\n", config.maxballspeed_int1000 );
241 fprintf( file, "invert»%i\n", config.invert );
242 fprintf( file, "sound»%i\n", config.sound );
243 fprintf( file, "volume»%i\n", config.volume );
244 fprintf( file, "speech»%i\n", config.speech );
245 fprintf( file, "audio_buffer_size»%i\n", config.audio_buffer_size );
246 fprintf( file, "anim»%i\n", config.anim );
247 fprintf( file, "fullscreen»%i\n", config.fullscreen );
248 fprintf( file, "fade»%i\n", config.fade );
249 fprintf( file, "bonus_info»%i\n", config.bonus_info );
250 fprintf( file, "fps»%i\n", config.fps );
251 fprintf( file, "ball_level»%i\n", config.ball_level );
252 fprintf( file, "debris_level»%i\n", config.debris_level );
253 fprintf( file, "i_key_speed»%i\n", config.i_key_speed );
254 fprintf( file, "use_hints»%i\n", config.use_hints );
255 fprintf( file, "return_on_click»%i\n", config.return_on_click );
256 fprintf( file, "theme_id»%i\n", config.theme_id );
257 fprintf( file, "theme_count»%i\n", config.theme_count );
258 fprintf( file, "server»%s\n", config.server );
259 fprintf( file, "local_port»%s\n", config.local_port );
260 fprintf( file, "username»%s\n", config.username );
261 fprintf( file, "mp_diff»%i\n", config.mp_diff );
262 fprintf( file, "mp_rounds»%i\n", config.mp_rounds );
263 fprintf( file, "mp_frags»%i\n", config.mp_frags );
264 fprintf( file, "mp_balls»%i\n", config.mp_balls );
265 }
266 }
267
0 /***************************************************************************
1 config.h - description
2 -------------------
3 begin : Tue Feb 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __CONFIG_H
18 #define __CONFIG_H
19
20 /* configure struct */
21 enum { BALL_BELOW_BONUS = 0, BALL_ABOVE_BONUS };
22 enum { DEBRIS_BELOW_BALL = 0, DEBRIS_ABOVE_BALL };
23 typedef struct {
24 /* directory to save config and saved games */
25 char dir_name[512];
26 /* levels */
27 int levelset_id_local;
28 int levelset_count_local; /* save number of local game levelsets
29 for safety (to reset id if count changed) */
30 int levelset_id_home;
31 int levelset_count_home; /* save number of levelsets for safety
32 (to reset id if count changed) */
33 /* players */
34 int player_count;
35 char player_names[4][32];
36 /* game */
37 int diff; /* diffculty */
38 int startlevel;
39 int rel_warp_limit; /* percentage of bricks required to be destroyed
40 before player may proceed to next level */
41 /* controls */
42 int k_left;
43 int k_right;
44 int k_lfire;
45 int k_rfire;
46 int k_return; /* return ball on click on this key */
47 int k_turbo; /* double paddle speed while this key is pressed */
48 int k_warp; /* warp to next level */
49 int k_maxballspeed; /* go to maximum ball speed (while pressed) */
50 int rel_motion; /* use relative mouse motion; motion_mod and invert need this enabled */
51 int grab; /* keep mouse in window */
52 int i_motion_mod; /* motion_mod * 100 used to modify in the menu */
53 double motion_mod; /* multiplied with relative motion */
54 int convex;
55 int invert;
56 double key_speed; /* move with key_speed pix per sec when keys are used */
57 int linear_corner; /* assume a 45° line for corner? */
58 int random_angle;
59 int maxballspeed_int1000; /* max ball speed in pixels/second */
60 float maxballspeed_float; /* per millisecond */
61 /* sound */
62 int sound;
63 int volume; /* 1 - 8 */
64 int speech; /* enable speech? */
65 int audio_buffer_size;
66 /* graphics */
67 int anim;
68 int fullscreen;
69 int fade;
70 int bonus_info;
71 int fps; /* frames per second: 0 - no limit, 1 - 50, 2 - 100, 3 - 200 */
72 int ball_level;
73 int debris_level;
74 int i_key_speed; /* integer value that is devided by 100 to get real key_speed */
75 /* various */
76 int use_hints;
77 int return_on_click; /* autoreturn on click if true else automatically */
78 int theme_id; /* 0 == default theme */
79 int theme_count; /* to check and properly reset id if number of themes changed */
80 /* multiplayer */
81 char server[64]; /* ip:port */
82 char local_port[8]; /* where to bind local UDP socket */
83 char username[16]; /* username at server */
84 int mp_diff; /* difficulty */
85 int mp_rounds; /* rounds per level in a levelset */
86 int mp_frags; /* points a player needs to win a round */
87 int mp_balls; /* maximum number of balls a player may fire */
88 int recv_limit; /* number of packets parsed in one go */
89 } Config;
90
91 /* set config to default */
92 void config_reset();
93
94 /* load config */
95 void config_load( );
96
97 /* save config */
98 void config_save( );
99
100 #endif
0 /***************************************************************************
1 credit.c - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "credit.h"
19
20 extern SDL_Surface *stk_display;
21 extern StkFont *font;
22 extern SDL_Surface *offscreen;
23
24 SDL_Surface *credit_bkgnd = 0;
25 float credit_alpha;
26 float credit_pms = 0.5;
27 int credit_cur;
28 int credit_time = 2000;
29 int credit_x, credit_y, credit_w, credit_h;
30 char credit_str[64];
31 int credit_status;
32
33 /*
34 ====================================================================
35 Initiate credit.
36 ====================================================================
37 */
38 void credit_init( char *name, char *author, int level, int level_count )
39 {
40 credit_cur = 0; credit_alpha = 0; credit_status = 0;
41
42 /* string */
43 if ( level_count > 0 )
44 sprintf( credit_str, "%s (%i/%i) - %s", name,
45 level + 1, level_count, author );
46 else
47 sprintf( credit_str, "%s (%i) - %s", name, level + 1, author );
48
49 /* position */
50 credit_w = stk_font_string_width( font, credit_str ) + 4;
51 credit_h = font->height + 4;
52 credit_x = (stk_display->w - credit_w) / 2;
53 credit_y = (stk_display->h - credit_h) / 2;
54
55 /* background */
56 if ( credit_bkgnd ) SDL_FreeSurface( credit_bkgnd );
57 credit_bkgnd = stk_surface_create( SDL_SWSURFACE, credit_w, credit_h );
58 SDL_SetColorKey( credit_bkgnd, 0, 0 );
59 stk_surface_fill( credit_bkgnd, 0,0,-1,-1, 0x0 );
60 }
61 void credit_clear()
62 {
63 stk_surface_free( &credit_bkgnd );
64 }
65 /*
66 ====================================================================
67 Show/Hide credits
68 ====================================================================
69 */
70 void credit_hide()
71 {
72 if (credit_status == 3) return;
73 stk_surface_blit( offscreen,
74 credit_x, credit_y, credit_w, credit_h,
75 stk_display, credit_x, credit_y );
76 stk_display_store_drect();
77 }
78 void credit_show( )
79 {
80 if (credit_status == 3) return;
81 if ( credit_bkgnd )
82 stk_surface_alpha_blit( credit_bkgnd, 0, 0,
83 credit_w, credit_h, stk_display,
84 credit_x, credit_y, credit_alpha / 2 );
85 font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
86 stk_font_write(font, stk_display, credit_x + 2, credit_y + 2,
87 (int)credit_alpha, credit_str );
88 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
89 }
90 void credit_alphashow( int alpha )
91 {
92 if (credit_status == 3) return;
93 font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
94 stk_font_write(font, stk_display, credit_x + 2, credit_y + 2,
95 (int)alpha, credit_str );
96 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
97 }
98 void credit_update( int ms )
99 {
100 /* appearing */
101 if (credit_status == 0) {
102 credit_alpha += credit_pms * ms;
103 if (credit_alpha >= 255 ) {
104 credit_status = 1;
105 credit_alpha = 255;
106 }
107 }
108 else
109 /* visible */
110 if (credit_status == 1) {
111 credit_cur += ms;
112 if (credit_cur > credit_time)
113 credit_status = 2;
114 }
115 else
116 /* disappearing */
117 if (credit_status == 2) {
118 credit_alpha -= credit_pms * ms;
119 if (credit_alpha <= 0)
120 credit_status = 3;
121 }
122 /* credit_status == 3 means credit disappeared */
123 }
0 /***************************************************************************
1 credit.h - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Initiate credit.
20 ====================================================================
21 */
22 void credit_init( char *name, char *author, int level, int level_count );
23 void credit_clear();
24 /*
25 ====================================================================
26 Show/Hide credits
27 ====================================================================
28 */
29 void credit_hide();
30 void credit_show();
31 void credit_alphashow( int alpha );
32 void credit_update( int ms );
0 /***************************************************************************
1 display.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "display.h"
19
20 extern SDL_Surface *offscreen;
21 extern SDL_Surface *stk_display;
22 extern StkFont *display_font;
23 extern StkFont *display_highlight_font;
24
25 List *displays = 0;
26
27 /*
28 ====================================================================
29 Locals
30 ====================================================================
31 */
32
33 /*
34 ====================================================================
35 Delete a display
36 ====================================================================
37 */
38 void display_delete( void *ptr )
39 {
40 Display *display = ptr;
41 if ( display ) {
42 stk_surface_free( &display->surf );
43 free( display );
44 }
45 }
46
47 /*
48 ====================================================================
49 Publics
50 ====================================================================
51 */
52
53 /*
54 ====================================================================
55 Add a display. The display is cleared by displays_clear() so
56 the returned display is just a pointer.
57 The contents of the display is 'text'+'value'. Both may be changed
58 with the display_set_text/value() functions.
59 'digits' is the maxium size of 'value'
60 ====================================================================
61 */
62 Display* displays_add( int x, int y, int w, int h, char *text, int value, int digits )
63 {
64 Display *display = 0;
65 if ( displays == 0 )
66 displays = list_create( LIST_AUTO_DELETE, display_delete );
67 display = calloc( 1, sizeof( Display ) );
68 if ( display == 0 ) return 0;
69 if ( ( display->surf = stk_surface_create( SDL_SWSURFACE,w,h ) ) == 0 ) {
70 free( display );
71 return 0;
72 }
73 SDL_SetColorKey( display->surf, 0, 0 );
74 display->use_alpha = 1;
75 display->x = x;
76 display->y = y;
77 display->w = w;
78 display->h = h;
79 display->digits = digits;
80 strcpy( display->text, text );
81 display->value = value;
82 display->cur_value = value;
83 list_add( displays, display );
84 return display;
85 }
86 /*
87 ====================================================================
88 Remove all displays
89 ====================================================================
90 */
91 void displays_clear()
92 {
93 if ( displays ) {
94 list_delete( displays );
95 displays = 0;
96 }
97 }
98
99 /*
100 ====================================================================
101 Draw displays
102 ====================================================================
103 */
104 void displays_hide()
105 {
106 Display *display;
107 if ( displays == 0 ) return;
108 list_reset( displays );
109 while ( ( display = list_next( displays ) ) ) {
110 stk_surface_blit(offscreen, display->x, display->y,
111 display->w, display->h,
112 stk_display, display->x, display->y );
113 stk_display_store_drect();
114 }
115 }
116 void displays_show()
117 {
118 int i;
119 char str[64], numstr[10];
120 StkFont *font;
121 Display *display;
122 if ( displays == 0 ) return;
123 list_reset( displays );
124 display_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
125 display_highlight_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
126 while ( ( display = list_next( displays ) ) ) {
127 if (display->is_highlighted)
128 font = display_highlight_font;
129 else
130 font = display_font;
131 strcpy( str, display->text );
132 if ( display->digits > 0 ) {
133 sprintf( numstr, "%i", (int)display->cur_value );
134 for ( i = 0; i < display->digits - strlen( numstr ); i++ )
135 strcat( str, " " );
136 strcat( str, numstr );
137 }
138 if ( display->use_alpha ) {
139 stk_surface_alpha_blit( display->surf, 0,0,
140 display->w, display->h,
141 stk_display, display->x, display->y, 128 );
142 }
143 stk_font_write( font, stk_display,
144 display->x + 2, display->y + 1, -1, str );
145 }
146 }
147
148 /*
149 ====================================================================
150 Update displays
151 ====================================================================
152 */
153 void displays_update( int ms )
154 {
155 float change;
156 Display *display;
157 if ( displays == 0 ) return;
158 list_reset( displays );
159 while ( ( display = list_next( displays ) ) ) {
160 if ( (int)display->cur_value == display->value ) continue;
161 /* change relative as for big display->cur_values we must count faster */
162 change = ( display->value - display->cur_value ) / 200;
163 if ( change > 0 && change < 0.6 ) change = 0.6;
164 if ( change < 0 && change > -0.6 ) change = -0.6;
165 display->cur_value += change * ms;
166 if ( change > 0 && display->cur_value > display->value )
167 display->cur_value = display->value;
168 if ( change < 0 && display->cur_value < display->value )
169 display->cur_value = display->value;
170 }
171 }
172 /*
173 ====================================================================
174 Modify display
175 ====================================================================
176 */
177 void display_set_text( Display *display, char *text )
178 {
179 strcpy( display->text, text );
180 }
181 void display_set_value( Display *display, int value )
182 {
183 display->value = value;
184 }
185 void display_set_value_directly( Display *display, int value )
186 {
187 display->cur_value = value; /* no smooth approaching of the dest value */
188 display->value = value;
189 }
190 void display_set_highlight( Display *display, int on )
191 {
192 display->is_highlighted = on;
193 }
0 /***************************************************************************
1 display.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __DISPLAY_H
18 #define __DISPLAY_H
19
20 typedef struct {
21 SDL_Surface *surf;
22 int x, y, w, h;
23 char text[32];
24 int digits;
25 int value;
26 float cur_value; /* smoothly approximates destination 'value' */
27 int use_alpha; /* if true we darken the background a bit. this
28 is true by default */
29 int is_highlighted; /* use highlight font */
30 } Display;
31
32 /*
33 ====================================================================
34 Add a display. The display is cleared by displays_clear() so
35 the returned display is just a pointer.
36 The contents of the display is 'text'+'value'. Both may be changed
37 with the display_set_text/value() functions.
38 'digits' is the maxium size of 'value'
39 ====================================================================
40 */
41 Display* displays_add( int x, int y, int w, int h, char *text, int value, int digits );
42 /*
43 ====================================================================
44 Remove all displays
45 ====================================================================
46 */
47 void displays_clear();
48
49 /*
50 ====================================================================
51 Draw displays
52 ====================================================================
53 */
54 void displays_hide();
55 void displays_show();
56
57 /*
58 ====================================================================
59 Update displays
60 ====================================================================
61 */
62 void displays_update( int ms );
63
64 /*
65 ====================================================================
66 Modify display
67 ====================================================================
68 */
69 void display_set_text( Display *display, char *text );
70 void display_set_value( Display *display, int value );
71 void display_set_value_directly( Display *display, int value );
72 void display_set_highlight( Display *display, int on );
73
74 #endif
0 /***************************************************************************
1 editor.c - description
2 -------------------
3 begin : Fri Oct 12 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/game.h"
19 #include "game.h"
20 #include "config.h"
21 #include "bricks.h"
22 #include "frame.h"
23 #include "editor.h"
24
25 SDL_Surface *sel_frame = 0, *buttons = 0;
26 SDL_Surface *editor_bkgnd = 0; /* background (black with frame) of editor */
27 char edit_file_name[512]; /* full path of edited file */
28 Level *edit_levels[MAX_LEVELS]; /* editor levels */
29 char edit_version[16]; /* version of edited set */
30 int edit_level_count; /* how many levels currently used? */
31 int edit_cur_level_id;
32 Level *edit_cur_level; /* current level modified */
33 enum { EDITOR_BRICK, EDITOR_EXTRA };
34 int edit_sel_type; /* type of selected tile */
35 int edit_sel_id; /* brick or extra id */
36 int edit_sel_x, edit_sel_y; /* position in map of selected tile */
37 int edit_tile_x = 1, edit_tile_y = 20, edit_tile_w = MAP_WIDTH - 2, edit_tile_h = 3; /* part where either bricks ro bonuses
38 are displayed */
39 int extra_vis; /* extras currently shown? blinks. */
40 int first_swap_level = -1; /* if not -1 this and the current level will be swapped
41 next time the button is pressed */
42 enum {
43 /* tiles */
44 BUTTON_NONE = 0,
45 BUTTON_FIRST_BRICK,
46 BUTTON_LAST_BRICK = BUTTON_FIRST_BRICK + ( BRICK_COUNT ),
47 BUTTON_FIRST_EXTRA,
48 BUTTON_LAST_EXTRA = BUTTON_FIRST_EXTRA + ( EX_NUMBER -1 ),
49 BUTTON_EDIT,
50 BUTTON_EDIT_AUTHOR,
51 BUTTON_EDIT_NAME,
52 /* buttons */
53 BUTTON_FIRST,
54 BUTTON_NEXT,
55 BUTTON_PREV,
56 BUTTON_CLEAR,
57 BUTTON_SWAP,
58 BUTTON_ADD,
59 BUTTON_INSERT,
60 BUTTON_DELETE,
61 BUTTON_VERSION,
62 BUTTON_LOAD,
63 BUTTON_SAVE,
64 BUTTON_PLAY
65 };
66 int edit_buttons[MAP_WIDTH][MAP_HEIGHT]; /* an action is assigned to each map tile */
67 /* externals */
68 extern SDL_Surface *stk_display;
69 extern SDL_Surface *frame;
70 extern SDL_Surface *extra_pic;
71 extern SDL_Surface *brick_pic;
72 extern StkFont *mfont; /* use menu's font to draw status */
73 extern StkFont *font; /* use game's font to confirm */
74 extern Config config;
75 extern int stk_quit_request;
76
77 /* extra conversion table may be found in bricks.c */
78 extern Extra_Conv extra_conv_table[EX_NUMBER];
79 extern Brick_Conv brick_conv_table[BRICK_COUNT];
80
81 /*
82 ====================================================================
83 Locals
84 ====================================================================
85 */
86
87 /*
88 ====================================================================
89 We had a right click into the tile region so check and change the
90 bricks displayed there. We select the first new tile and set
91 edit_sel_id, edit_sel_x, edit_sel_y. The full update is initated
92 by editor_handle_click().
93 ====================================================================
94 */
95 void editor_switch_tiles()
96 {
97 int x_off = 2, y_off = 20, len = MAP_WIDTH - x_off * 2; /* offset in map of tiles, len is the number of tiles in one line */
98 int i, j;
99 /* clear edit buttons */
100 for ( i = edit_tile_x; i < edit_tile_x + edit_tile_w; i++ )
101 for ( j = edit_tile_y; j < edit_tile_y + edit_tile_h; j++ )
102 edit_buttons[i][j] = BUTTON_NONE;
103 /* clear this part of the editor bkjgnd */
104 stk_surface_fill( editor_bkgnd,
105 edit_tile_x * BRICK_WIDTH, edit_tile_y * BRICK_HEIGHT,
106 edit_tile_w * BRICK_WIDTH, edit_tile_h * BRICK_HEIGHT, 0x0 );
107 /* switch */
108 if ( edit_sel_type == EDITOR_BRICK ) {
109 /* flag */
110 edit_sel_type = EDITOR_EXTRA;
111 /* button map & background */
112 i = 0; j = 0;
113 while ( i + j * len < EX_NUMBER ) {
114 edit_buttons[x_off + i][y_off + j] = BUTTON_FIRST_EXTRA + i + j * len;
115 stk_surface_blit( extra_pic, ( i + j * len ) * BRICK_WIDTH, 0,
116 BRICK_WIDTH, BRICK_HEIGHT,
117 editor_bkgnd, ( i + x_off ) * BRICK_WIDTH, ( j + y_off ) * BRICK_HEIGHT );
118 i++;
119 if ( i == len ) {
120 i = 0;
121 j++;
122 }
123 }
124 /* select first tile */
125 edit_sel_id = 0;
126 edit_sel_x = x_off;
127 edit_sel_y = y_off;
128 }
129 else {
130 /* flag */
131 edit_sel_type = EDITOR_BRICK;
132 /* button map & background */
133 i = 0; j = 0;
134 while ( i + j * len < BRICK_COUNT ) {
135 edit_buttons[x_off + i][y_off + j] = BUTTON_FIRST_BRICK + i + j * len;
136 stk_surface_blit( brick_pic, ( i + j * len ) * BRICK_WIDTH, 0,
137 BRICK_WIDTH, BRICK_HEIGHT,
138 editor_bkgnd, ( i + x_off ) * BRICK_WIDTH, ( j + y_off ) * BRICK_HEIGHT );
139 i++;
140 if ( i == len ) {
141 i = 0;
142 j++;
143 }
144 }
145 /* select first tile */
146 edit_sel_id = 0;
147 edit_sel_x = x_off;
148 edit_sel_y = y_off;
149 }
150 }
151
152 /*
153 ====================================================================
154 Draw a helping grid.
155 ====================================================================
156 */
157 void editor_draw_grid()
158 {
159 SDL_Surface *buffer;
160 int i, alpha;
161 buffer = stk_surface_create( SDL_SWSURFACE, EDIT_WIDTH * BRICK_WIDTH, 1 );
162 stk_surface_fill( buffer, 0,0,-1,-1, 0xffffff );
163 stk_surface_blit( buffer, 0,0,-1,-1, editor_bkgnd, BRICK_WIDTH, BRICK_HEIGHT );
164 stk_surface_blit( buffer, 0,0,-1,-1, editor_bkgnd, BRICK_WIDTH,
165 ( EDIT_HEIGHT + 1 ) * BRICK_HEIGHT - 1 );
166 for ( i = 0; i < EDIT_HEIGHT - 1; i++ ) {
167 if ( i == EDIT_HEIGHT / 2 - 1 )
168 alpha = 192;
169 else
170 if ( i % (EDIT_HEIGHT/4) == 0 )
171 alpha = 128;
172 else
173 alpha = 64;
174 stk_surface_alpha_blit( buffer, 0,0,-1,-1, editor_bkgnd,
175 BRICK_WIDTH, ( i + 1 ) * BRICK_HEIGHT + BRICK_HEIGHT - 1,
176 alpha );
177 }
178 SDL_FreeSurface( buffer );
179 buffer = stk_surface_create( SDL_SWSURFACE, 1, EDIT_HEIGHT * BRICK_HEIGHT );
180 stk_surface_fill( buffer, 0,0,-1,-1, 0xffffff );
181 stk_surface_blit( buffer, 0,0,-1,-1, editor_bkgnd, BRICK_WIDTH, BRICK_HEIGHT );
182 stk_surface_blit( buffer, 0,0,-1,-1, editor_bkgnd,
183 ( EDIT_WIDTH + 1 ) * BRICK_WIDTH - 1, BRICK_HEIGHT );
184 for ( i = 0; i < EDIT_WIDTH - 1; i++ ) {
185 if ( i == EDIT_WIDTH / 2 - 1 )
186 alpha = 192;
187 else
188 if ( i % (EDIT_WIDTH/4) == 0 )
189 alpha = 128;
190 else
191 alpha = 64;
192 stk_surface_alpha_blit( buffer, 0,0,-1,-1, editor_bkgnd,
193 ( i + 1 ) * BRICK_WIDTH + BRICK_WIDTH- 1, BRICK_HEIGHT,
194 alpha );
195 }
196 SDL_FreeSurface( buffer );
197 }
198
199 /*
200 ====================================================================
201 Translate the saved character strings into extra and brick indices
202 for the editor.
203 ====================================================================
204 */
205 enum { INDICES_2_CHAR, CHAR_2_INDICES };
206 void editor_translate_level( Level *level, int type )
207 {
208 int i, j, k;
209 if ( type == CHAR_2_INDICES ) {
210 for ( i = 0; i < EDIT_WIDTH; i++ )
211 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
212 /* bricks */
213 for ( k = 0; k < BRICK_COUNT; k++ )
214 if ( brick_conv_table[k].c == level->bricks[i][j] ) {
215 level->bricks[i][j] = brick_conv_table[k].id;
216 break;
217 }
218 if ( k == BRICK_COUNT ) level->bricks[i][j] = -1;
219 /* extras */
220 for ( k = 0; k < EX_NUMBER; k++ )
221 if ( extra_conv_table[k].c == level->extras[i][j] ) {
222 level->extras[i][j] = extra_conv_table[k].type;
223 break;
224 }
225 if ( k == EX_NUMBER ) level->extras[i][j] = EX_NONE;
226 }
227 }
228 else {
229 /* indices to characters */
230 for ( i = 0; i < EDIT_WIDTH; i++ )
231 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
232 /* bricks */
233 if ( level->bricks[i][j] == -1 )
234 level->bricks[i][j] = '.';
235 else
236 for ( k = 0; k < BRICK_COUNT; k++ )
237 if ( level->bricks[i][j] == brick_conv_table[k].id ) {
238 level->bricks[i][j] = brick_conv_table[k].c;
239 break;
240 }
241 /* extras */
242 if ( level->extras[i][j] == EX_NONE )
243 level->extras[i][j] = '.';
244 else
245 for ( k = 0; k < EX_NUMBER; k++ )
246 if ( level->extras[i][j] == extra_conv_table[k].type ) {
247 level->extras[i][j] = extra_conv_table[k].c;
248 break;
249 }
250 }
251 }
252 }
253 /*
254 ====================================================================
255 Draw name of set file, current level, current count, remaining
256 levels, and other info stuff.
257 ====================================================================
258 */
259 void editor_draw_status()
260 {
261 char str[512];
262 int x = BRICK_WIDTH, y = ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT - 2;
263 int height = 10;
264 /* locartion */
265 sprintf( str, "Location: %s", edit_file_name );
266 mfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
267 stk_font_write( mfont, stk_display, x, y, STK_OPAQUE, str );
268 /* current level */
269 sprintf( str, "Current Level: %i/%i (Free: %i)", edit_cur_level_id + 1, edit_level_count, MAX_LEVELS - edit_level_count );
270 mfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
271 stk_font_write( mfont, stk_display, x, y + height, STK_OPAQUE, str );
272 /* swap */
273 mfont->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_TOP;
274 if ( first_swap_level != -1 ) {
275 sprintf( str, "*** Level %i Marked For Swap ***", first_swap_level + 1 );
276 stk_font_write( mfont, stk_display, stk_display->w - BRICK_WIDTH, y + height, STK_OPAQUE, str );
277 }
278 else {
279 /* version */
280 sprintf( str, "Version: %s ", edit_version );
281 stk_font_write( mfont, stk_display, stk_display->w - BRICK_WIDTH, y + height, STK_OPAQUE, str );
282 }
283 /* name and author */
284 mfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
285 sprintf( str, "Title: %s", edit_cur_level->name );
286 stk_font_write( mfont, stk_display, BRICK_WIDTH + 2, ( MAP_HEIGHT - 5 ) * BRICK_HEIGHT + 5, STK_OPAQUE, str );
287 mfont->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_TOP;
288 sprintf( str, "Author: %s", edit_cur_level->author );
289 stk_font_write( mfont, stk_display, stk_display->w - BRICK_WIDTH - 2, ( MAP_HEIGHT - 5 ) * BRICK_HEIGHT + 5, STK_OPAQUE, str );
290 }
291 /*
292 ====================================================================
293 Draw brick and extra (if any) from screen map pos
294 so it fits the editable field (no frame, no bottom).
295 ====================================================================
296 */
297 void editor_draw_brick( int edit_map_x, int edit_map_y )
298 {
299 /* brick */
300 if ( edit_cur_level->bricks[edit_map_x][edit_map_y] != -1 ) {
301 if ( edit_cur_level->bricks[edit_map_x][edit_map_y] != INVIS_BRICK_ID )
302 stk_surface_blit( brick_pic,
303 edit_cur_level->bricks[edit_map_x][edit_map_y] * BRICK_WIDTH, 0,
304 BRICK_WIDTH, BRICK_HEIGHT,
305 stk_display, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT );
306 else
307 stk_surface_fill( stk_display,
308 (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT,
309 BRICK_WIDTH, BRICK_HEIGHT, 0x777777 );
310 }
311 else {
312 stk_surface_blit( editor_bkgnd,
313 (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT,
314 BRICK_WIDTH, BRICK_HEIGHT, stk_display,
315 (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT );
316 }
317 /* extra */
318 if ( ( extra_vis || edit_sel_type == EDITOR_EXTRA ) && edit_cur_level->extras[edit_map_x][edit_map_y] != EX_NONE) {
319 stk_surface_blit( extra_pic,
320 ( edit_cur_level->extras[edit_map_x][edit_map_y] ) * BRICK_WIDTH, 0,
321 BRICK_WIDTH, BRICK_HEIGHT,
322 stk_display, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT );
323 }
324 stk_display_store_drect();
325 }
326 /*
327 ====================================================================
328 Redraw and refresh full screen
329 ====================================================================
330 */
331 void editor_full_update()
332 {
333 int i, j;
334 /* background */
335 stk_surface_blit( editor_bkgnd, 0,0,-1,-1, stk_display, 0,0 );
336 /* bricks&extras */
337 for ( i = 0; i < EDIT_WIDTH; i++ )
338 for ( j = 0; j < EDIT_HEIGHT; j++ )
339 editor_draw_brick( i, j );
340 /* selection frame */
341 stk_surface_blit( sel_frame, 0,0,-1,-1,
342 stk_display, edit_sel_x * BRICK_WIDTH, edit_sel_y * BRICK_HEIGHT );
343 /* status */
344 editor_draw_status();
345 /* refresh */
346 stk_display_update( STK_UPDATE_ALL );
347 }
348 /*
349 ====================================================================
350 Do only redraw and refresh those bricks with an extra
351 ====================================================================
352 */
353 void editor_update_extra_bricks()
354 {
355 int i, j;
356 for ( i = 0; i < EDIT_WIDTH; i++ )
357 for ( j = 0; j < EDIT_HEIGHT; j++ )
358 if ( edit_cur_level->extras[i][j] != EX_NONE )
359 editor_draw_brick( i, j );
360 stk_display_update( STK_UPDATE_RECTS );
361 }
362 /*
363 ====================================================================
364 Free all editor levels
365 ====================================================================
366 */
367 void editor_clear_levels()
368 {
369 int i;
370 for ( i = 0; i < MAX_LEVELS; i++ )
371 if ( edit_levels[i] ) level_delete( edit_levels[i] );
372 memset( edit_levels, 0, sizeof( Level* ) * MAX_LEVELS );
373 edit_level_count = 0;
374 }
375 /*
376 ====================================================================
377 Save/load levels to/from editor file.
378 ====================================================================
379 */
380 void editor_load_levels()
381 {
382 int i, version, update;
383 Level *level;
384 FILE *file = 0;
385 /* clear levels first */
386 editor_clear_levels();
387 /* read levels while there are some in it */
388 edit_level_count = 0;
389 if ( ( file = fopen( edit_file_name, "rb" ) ) != 0 ) {
390 levelset_get_version( file, &version, &update );
391 sprintf( edit_version, "%i.%02i", version, update );
392 while ( ( level = level_load( file ) ) != 0 )
393 edit_levels[edit_level_count++] = level;
394 fclose( file );
395 }
396 /* if we got no level at all create an empty one */
397 if ( edit_level_count == 0 ) {
398 edit_level_count = 1;
399 edit_levels[0] = level_create_empty( "noname", "untitled" );
400 }
401 /* translate the character strings to editor info */
402 for ( i = 0; i < edit_level_count; i++ )
403 editor_translate_level( edit_levels[i], CHAR_2_INDICES );
404 }
405 void editor_save_levels()
406 {
407 FILE *file = 0;
408 int i, j, k;
409 Level *level = 0;
410 /* convert */
411 for ( i = 0; i < edit_level_count; i++ )
412 editor_translate_level( edit_levels[i], INDICES_2_CHAR );
413 /* save */
414 if ( ( file = fopen( edit_file_name, "w" ) ) != 0 ) {
415 fprintf( file, "Version: %s\n", edit_version );
416 for ( i = 0; i < edit_level_count; i++ ) {
417 level = edit_levels[i];
418 /* save level */
419 fprintf( file, "Level:\n%s\n%s\nBricks:\n", level->author, level->name );
420 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
421 for ( k = 0; k < EDIT_WIDTH; k++ )
422 fprintf( file, "%c", level->bricks[k][j] );
423 fprintf( file, "\n" );
424 }
425 fprintf( file, "Bonus:\n" );
426 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
427 for ( k = 0; k < EDIT_WIDTH; k++ )
428 fprintf( file, "%c", level->extras[k][j] );
429 fprintf( file, "\n" );
430 }
431 }
432 fclose( file );
433 }
434 /* convert back */
435 for ( i = 0; i < edit_level_count; i++ )
436 editor_translate_level( edit_levels[i], CHAR_2_INDICES );
437 }
438 /*
439 ====================================================================
440 Handle button action
441 ====================================================================
442 */
443 void editor_handle_button( int type, int *full_update ) {
444 Level *dummy_ptr;
445 int old_pos;
446 int version, update;
447 char *name, *author;
448 int i;
449 switch ( type ) {
450 case BUTTON_FIRST:
451 edit_cur_level_id = 0;
452 edit_cur_level = edit_levels[0];
453 *full_update = 1;
454 break;
455 case BUTTON_NEXT:
456 edit_cur_level_id++;
457 if ( edit_cur_level_id == edit_level_count ) edit_cur_level_id = 0;
458 edit_cur_level = edit_levels[edit_cur_level_id];
459 *full_update = 1;
460 break;
461 case BUTTON_PREV:
462 edit_cur_level_id--;
463 if ( edit_cur_level_id == -1 ) edit_cur_level_id = edit_level_count - 1;
464 edit_cur_level = edit_levels[edit_cur_level_id];
465 *full_update = 1;
466 break;
467 case BUTTON_SWAP:
468 if ( first_swap_level == -1 ) {
469 first_swap_level = edit_cur_level_id;
470 *full_update = 1;
471 }
472 else {
473 /* swap current and marked level */
474 dummy_ptr = edit_levels[first_swap_level];
475 edit_levels[first_swap_level] = edit_levels[edit_cur_level_id];
476 edit_levels[edit_cur_level_id] = dummy_ptr;
477 edit_cur_level = edit_levels[edit_cur_level_id];
478 first_swap_level = -1;
479 *full_update = 1;
480 }
481 break;
482 case BUTTON_LOAD:
483 if ( !confirm( font, "Discard All Changes? y/n", CONFIRM_YES_NO ) ) break;
484 /* load levels and reset position if level doesn't exist */
485 old_pos = edit_cur_level_id;
486 editor_load_levels();
487 if ( old_pos >= edit_level_count ) edit_cur_level_id = 0;
488 edit_cur_level = edit_levels[edit_cur_level_id];
489 first_swap_level = -1;
490 *full_update = 1;
491 break;
492 case BUTTON_SAVE:
493 if ( !confirm( font, "Save Changes? y/n", CONFIRM_YES_NO ) ) break;
494 editor_save_levels();
495 break;
496 case BUTTON_CLEAR:
497 if ( !confirm( font, "Clear Level? y/n", CONFIRM_YES_NO ) ) break;
498 author = strdup( edit_cur_level->author );
499 name = strdup( edit_cur_level->name );
500 level_delete( edit_levels[edit_cur_level_id] );
501 edit_levels[edit_cur_level_id] = level_create_empty( author, name );
502 edit_cur_level = edit_levels[edit_cur_level_id];
503 free( name ); free( author );
504 *full_update = 1;
505 break;
506 case BUTTON_ADD:
507 if ( edit_level_count == MAX_LEVELS ) break;
508 if ( !confirm( font, "Add Level? y/n", CONFIRM_YES_NO ) ) break;
509 edit_levels[edit_level_count] = level_create_empty( edit_levels[edit_level_count - 1]->author, edit_levels[edit_level_count - 1]->name );
510 edit_level_count++;
511 *full_update = 1;
512 break;
513 case BUTTON_INSERT:
514 if ( edit_level_count == MAX_LEVELS ) break;
515 if ( !confirm( font, "Insert Level? y/n", CONFIRM_YES_NO ) ) break;
516 for ( i = edit_level_count; i > edit_cur_level_id; i-- )
517 edit_levels[i] = edit_levels[i - 1];
518 edit_level_count++;
519 edit_levels[edit_cur_level_id] = level_create_empty( edit_cur_level->author, edit_cur_level->name );
520 edit_cur_level = edit_levels[edit_cur_level_id];
521 *full_update = 1;
522 break;
523 case BUTTON_DELETE:
524 if ( edit_level_count == 1 ) break; /* last level may not be removed */
525 if ( !confirm( font, "Delete Level? y/n", CONFIRM_YES_NO ) ) break;
526 level_delete( edit_levels[edit_cur_level_id] );
527 for ( i = edit_cur_level_id; i < edit_level_count - 1; i++ )
528 edit_levels[i] = edit_levels[i + 1];
529 edit_levels[i] = 0;
530 edit_level_count--;
531 if ( edit_cur_level_id >= edit_level_count )
532 edit_cur_level_id = edit_level_count - 1;
533 edit_cur_level = edit_levels[edit_cur_level_id];
534 *full_update = 1;
535 break;
536 case BUTTON_PLAY:
537 stk_display_fade( STK_FADE_OUT, STK_FADE_DEFAULT_TIME );
538 /* translate */
539 editor_translate_level( edit_cur_level, INDICES_2_CHAR );
540 /* run */
541 client_game_test_level( edit_cur_level );
542 /* translate back */
543 editor_translate_level( edit_cur_level, CHAR_2_INDICES );
544 *full_update = 1;
545 break;
546 case BUTTON_VERSION:
547 if ( enter_string( font, "Levelset Version:", edit_version, 8 ) ) {
548 parse_version( edit_version, &version, &update );
549 sprintf( edit_version, "%i.%02i", version, update );
550 *full_update = 1;
551 }
552 break;
553 }
554 }
555 /*
556 ====================================================================
557 Handle a click on a map tile.
558 If set is False a remove action was requested (only for
559 editing)
560 ====================================================================
561 */
562 int near_grow_brick( int x, int y ) {
563 int i, j;
564 for ( i = x - 1; i <= x + 1; i++ )
565 for ( j = y - 1; j <= y + 1; j++ )
566 if ( i != x || j != y )
567 if ( i >= 0 && j >= 0 && i < EDIT_WIDTH && j < EDIT_HEIGHT )
568 if ( edit_cur_level->bricks[i][j] == GROW_BRICK_ID )
569 return 1;
570 return 0;
571 }
572 void editor_handle_click( int x, int y, int set, int *full_update )
573 {
574 int sel = 0;
575 int edit_x, edit_y;
576 char str[32];
577 /* if !set and within the tile field we perform a switch */
578 if ( !set ) {
579 if ( x >= edit_tile_x && y >= edit_tile_y && x < edit_tile_x + edit_tile_w && y < edit_tile_y + edit_tile_h ) {
580 editor_switch_tiles();
581 *full_update = 1;
582 return;
583 }
584 }
585 /* the remaining stuff requires a tile at the position */
586 if ( edit_buttons[x][y] == BUTTON_NONE ) return; /* no action */
587 /* bricks */
588 if ( edit_buttons[x][y] >= BUTTON_FIRST_BRICK && edit_buttons[x][y] <= BUTTON_LAST_BRICK ) {
589 sel = 1;
590 edit_sel_type = EDITOR_BRICK;
591 edit_sel_id = edit_buttons[x][y] - BUTTON_FIRST_BRICK;
592 }
593 /* extras */
594 if ( edit_buttons[x][y] >= BUTTON_FIRST_EXTRA && edit_buttons[x][y] <= BUTTON_LAST_EXTRA ) {
595 sel = 1;
596 edit_sel_type = EDITOR_EXTRA;
597 edit_sel_id = edit_buttons[x][y] - BUTTON_FIRST_EXTRA;
598 }
599 /* edit field */
600 if ( edit_buttons[x][y] == BUTTON_EDIT ) {
601 edit_x = x - 1;
602 edit_y = y - 1;
603 if ( edit_sel_type == EDITOR_BRICK ) {
604 if ( set ) {
605 /* set brick */
606 edit_cur_level->bricks[edit_x][edit_y] = edit_sel_id;
607 *full_update = 1;
608 }
609 else {
610 /* remove brick and extra if any */
611 if ( edit_cur_level->bricks[edit_x][edit_y] != -1 ) {
612 edit_cur_level->bricks[edit_x][edit_y] = -1;
613 edit_cur_level->extras[edit_x][edit_y] = EX_NONE;
614 *full_update = 1;
615 }
616 }
617 }
618 else {
619 if ( set ) {
620 /* set extra - must be on a brick or beside a grow brick */
621 if ( edit_cur_level->bricks[edit_x][edit_y] != -1 || near_grow_brick( edit_x, edit_y ) ) {
622 edit_cur_level->extras[edit_x][edit_y] = edit_sel_id;
623 *full_update = 1;
624 }
625 }
626 else {
627 /* remove extra */
628 if ( edit_cur_level->extras[edit_x][edit_y] != EX_NONE ) {
629 edit_cur_level->extras[edit_x][edit_y] = EX_NONE;
630 *full_update = 1;
631 }
632 }
633 }
634 }
635 /* buttons */
636 editor_handle_button( edit_buttons[x][y], full_update );
637 /* name&author */
638 strcpy( str, "" );
639 if ( edit_buttons[x][y] == BUTTON_EDIT_AUTHOR )
640 if ( enter_string( font, "Author's Name:", str, 24 ) ) {
641 snprintf( edit_cur_level->author, 31, str );
642 *full_update = 1;
643 }
644 if ( edit_buttons[x][y] == BUTTON_EDIT_NAME )
645 if ( enter_string( font, "Title:", str, 24 ) ) {
646 snprintf( edit_cur_level->name, 31, str );
647 *full_update = 1;
648 }
649 /* sel frame tile position */
650 if ( sel ) {
651 edit_sel_x = x;
652 edit_sel_y = y;
653 *full_update = 1;
654 }
655 }
656
657 /*
658 ====================================================================
659 Publics
660 ====================================================================
661 */
662 /*
663 ====================================================================
664 Create/delete editor resources
665 ====================================================================
666 */
667 void editor_create()
668 {
669 int i, j;
670 /* clear all level pointers */
671 memset( edit_levels, 0, sizeof( Level* ) * MAX_LEVELS );
672 /* load sel frame */
673 sel_frame = stk_surface_load( SDL_SWSURFACE, "sel_frame.png" );
674 /* load buttons */
675 buttons = stk_surface_load( SDL_SWSURFACE, "buttons.png" );
676 /* background is black + frame */
677 editor_bkgnd = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
678 SDL_SetColorKey( editor_bkgnd, 0, 0 );
679 stk_surface_fill( editor_bkgnd, 0,0,-1,-1, 0x0 );
680 /* add helping grid */
681 editor_draw_grid();
682 /* set actions */
683 /* editable part */
684 for ( i = 0; i < EDIT_WIDTH; i++ )
685 for ( j = 0; j < EDIT_HEIGHT; j++ )
686 edit_buttons[i + 1][j + 1] = BUTTON_EDIT;
687 /* buttons */
688 for ( i = 0; i < 11; i++ )
689 edit_buttons[0][MAP_HEIGHT - 11 + i] = BUTTON_FIRST + i;
690 edit_buttons[MAP_WIDTH - 1][MAP_HEIGHT - 1] = BUTTON_PLAY;
691 /* name&author */
692 for ( i = 1; i < MAP_WIDTH / 2; i++ )
693 edit_buttons[i][MAP_HEIGHT - 5] = BUTTON_EDIT_NAME;
694 for ( i = MAP_WIDTH / 2; i < MAP_WIDTH - 1; i++ )
695 edit_buttons[i][MAP_HEIGHT - 5] = BUTTON_EDIT_AUTHOR;
696 /* draw buttons */
697 for ( i = 0; i < 11; i++ ) {
698 stk_surface_blit( buttons, i * BRICK_WIDTH, 0,
699 BRICK_WIDTH, BRICK_HEIGHT,
700 editor_bkgnd, 0, ( MAP_HEIGHT - 11 + i ) * BRICK_HEIGHT );
701 }
702 stk_surface_blit( buttons, 11 * BRICK_WIDTH, 0,
703 BRICK_WIDTH, BRICK_HEIGHT,
704 editor_bkgnd,
705 ( MAP_WIDTH - 1 ) * BRICK_WIDTH,
706 ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT );
707 }
708 void editor_delete()
709 {
710 stk_surface_free( &editor_bkgnd );
711 stk_surface_free( &sel_frame );
712 stk_surface_free( &buttons );
713 }
714 /*
715 ====================================================================
716 Initiate and clear stuff for each editor call.
717 file_name is the name of the edited file in home directory.
718 ====================================================================
719 */
720 int editor_init( char *file_name )
721 {
722 FILE *file = 0;
723 /* set full file name */
724 snprintf( edit_file_name, sizeof(edit_file_name)-1, "%s/%s/lbreakout2-levels/%s", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME, file_name );
725 /* test this file for write access. use append to keep contents */
726 if ( ( file = fopen( edit_file_name, "a" ) ) == 0 ) {
727 fprintf( stderr, "Permission to write to file '%s' denied.\n", edit_file_name );
728 return 0;
729 }
730 else
731 fclose( file );
732 /* load levels */
733 editor_load_levels();
734 /* select first level */
735 edit_cur_level_id = 0;
736 edit_cur_level = edit_levels[0];
737 /* select first brick */
738 edit_sel_type = EDITOR_EXTRA;
739 editor_switch_tiles();
740 /* clear other flags */
741 extra_vis = 0;
742 first_swap_level = -1;
743 return 1;
744 }
745 void editor_clear()
746 {
747 /* free all levels */
748 editor_clear_levels();
749 }
750 /*
751 ====================================================================
752 Run the editor
753 ====================================================================
754 */
755 void editor_run()
756 {
757 SDL_Event event;
758 int leave = 0;
759 int ms;
760 int last_switch_time = 0;
761 int full_update = 0, set;
762 int x, y, xoff,yoff;
763 Uint8 buttonstate;
764
765 /* reset any alpha keys */
766 SDL_SetAlpha( extra_pic, 0,0 );
767 /* draw first time */
768 editor_full_update();
769 /* main loop */
770 stk_timer_reset();
771 while ( !leave && !stk_quit_request ) {
772 if ( SDL_PollEvent( &event ) ) {
773 switch ( event.type ) {
774 case SDL_QUIT: leave = 1; stk_quit_request = 1; break;
775 case SDL_MOUSEBUTTONDOWN:
776 editor_handle_click( event.button.x / BRICK_WIDTH,
777 event.button.y / BRICK_HEIGHT,
778 (event.button.button == STK_BUTTON_LEFT),
779 &full_update );
780 break;
781 case SDL_KEYDOWN:
782 switch ( event.key.keysym.sym ) {
783 case SDLK_ESCAPE:
784 if ( confirm( font, "Quit Editor? y/n", CONFIRM_YES_NO ) ) leave = 1;
785 break;
786 case SDLK_LEFT: editor_handle_button( BUTTON_PREV, &full_update ); break;
787 case SDLK_RIGHT: editor_handle_button( BUTTON_NEXT, &full_update ); break;
788 case SDLK_UP: editor_handle_button( BUTTON_FIRST, &full_update ); break;
789 case SDLK_f:
790 config.fullscreen = !config.fullscreen;
791 stk_display_apply_fullscreen( config.fullscreen );
792 full_update = 1;
793 break;
794 default: break;
795 }
796 break;
797 default: break;
798 }
799 }
800 /* mouse motion is handled directly */
801 buttonstate = SDL_GetRelativeMouseState( &xoff, &yoff );
802 if ( (xoff || yoff) && buttonstate ) {
803 buttonstate = SDL_GetMouseState( &x, &y );
804 set = 0; if ( buttonstate & SDL_BUTTON(1) ) set = 1;
805 editor_handle_click( x / BRICK_WIDTH, y / BRICK_HEIGHT, set, &full_update );
806 }
807 ms = stk_timer_get_time();
808 if ( ( last_switch_time -= ms ) <= 0 ) {
809 extra_vis = !extra_vis;
810 last_switch_time = 500;
811 editor_update_extra_bricks();
812 }
813 /* full update? */
814 if ( full_update ) {
815 editor_full_update();
816 full_update = 0;
817 }
818 /* don't consume all CPU time */
819 SDL_Delay( 5 );
820 }
821 }
0 /***************************************************************************
1 editor.h - description
2 -------------------
3 begin : Fri Oct 12 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Create/delete editor resources
20 ====================================================================
21 */
22 void editor_create();
23 void editor_delete();
24 /*
25 ====================================================================
26 Initiate and clear stuff for each editor call.
27 file_name is the name of the edited file in home directory.
28 ====================================================================
29 */
30 int editor_init( char *file_name );
31 void editor_clear();
32 /*
33 ====================================================================
34 Run the editor
35 ====================================================================
36 */
37 void editor_run();
0 >>>LBreakout2
1 ............
2 10
3 300000
4 ............
5 9
6 200000
7 ............
8 8
9 150000
10 ............
11 7
12 100000
13 ............
14 6
15 70000
16 ............
17 5
18 50000
19 ............
20 4
21 40000
22 ............
23 3
24 30000
25 ............
26 2
27 20000
28 ............
29 1
30 10000
0 /***************************************************************************
1 event.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "event.h"
19
20 extern int stk_quit_request;
21
22 /*
23 ====================================================================
24 Event filter that blocks all events. Used to clear the SDL
25 event queue.
26 ====================================================================
27 */
28 static int all_filter( const SDL_Event *event ) { return 0; }
29
30 /*
31 ====================================================================
32 Handle SDL_QUIT events directly and kill all motion events.
33 ====================================================================
34 */
35 int event_filter( const SDL_Event *event )
36 {
37 if ( event->type == SDL_QUIT ) {
38 stk_quit_request = 1;
39 return 0;
40 }
41 if ( event->type == SDL_MOUSEMOTION )
42 return 0;
43 return 1;
44 }
45
46 /*
47 ====================================================================
48 Clear the SDL event key (keydown events)
49 ====================================================================
50 */
51 void event_clear_sdl_queue()
52 {
53 SDL_EventFilter old_filter;
54 SDL_Event event;
55 old_filter = SDL_GetEventFilter();
56 SDL_SetEventFilter( all_filter );
57 while ( SDL_PollEvent( &event ) );
58 SDL_SetEventFilter( old_filter );
59 }
0 /***************************************************************************
1 event.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Event filter used to get motion x.
20 ====================================================================
21 */
22 int event_filter( const SDL_Event *event );
23 /*
24 ====================================================================
25 Reset event states
26 ====================================================================
27 */
28 void event_reset();
29 /*
30 ====================================================================
31 Grab or release input. Hide cursor if events are kept in window.
32 Use relative mouse motion and grab if config tells so.
33 ====================================================================
34 */
35 void event_grab_input();
36 void event_ungrab_input();
37 /*
38 ====================================================================
39 Poll next event and set key and mousestate.
40 Return Value: True if event occured
41 ====================================================================
42 */
43 int event_poll( SDL_Event *event );
44 /*
45 ====================================================================
46 Block/unblock motion event
47 ====================================================================
48 */
49 void event_block_motion( int block );
50 /*
51 ====================================================================
52 Clear the SDL event key (keydown events)
53 ====================================================================
54 */
55 void event_clear_sdl_queue();
0 /***************************************************************************
1 extras.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/game.h"
19 #include "bricks.h"
20 #include "shrapnells.h"
21 #include "player.h"
22 #include "paddle.h"
23 #include "frame.h"
24
25 extern Player *cur_player;
26 extern SDL_Surface *stk_display;
27 extern SDL_Rect stk_drect;
28 extern SDL_Surface *offscreen;
29 extern SDL_Surface *bkgnd; /* background + frame */
30 extern SDL_Surface *offscreen_backup;
31 extern int ball_w, ball_dia;
32 extern SDL_Surface *brick_pic;
33 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
34 extern SDL_Surface *extra_pic; /* graphics */
35 extern SDL_Surface *extra_shadow;
36 extern SDL_Surface *paddle_pic, *weapon_pic;
37 extern SDL_Surface *ball_pic;
38 extern SDL_Surface *shot_pic;
39 extern StkFont *display_font;
40 extern SDL_Surface *wall_pic;
41 extern int shadow_size;
42 #ifdef AUDIO_ENABLED
43 extern StkSound *wav_score, *wav_metal, *wav_std, *wav_wall, *wav_joker;
44 extern StkSound *wav_goldshower, *wav_life_up;
45 extern StkSound *wav_speedup, *wav_speeddown;
46 extern StkSound *wav_chaos, *wav_darkness, *wav_ghost;
47 extern StkSound *wav_timeadd, *wav_expl_ball, *wav_weak_ball;
48 extern StkSound *wav_bonus_magnet, *wav_malus_magnet, *wav_disable;
49 extern StkSound *wav_attach; /* handled by balls.c */
50 extern StkSound *wav_expand, *wav_shrink, *wav_frozen;
51 #endif
52 extern Game *game; /* client game context */
53 extern int paddle_ch;
54 extern int ball_pic_x_offset;
55
56 /*
57 ====================================================================
58 Locals
59 ====================================================================
60 */
61
62 /*
63 ====================================================================
64 Public
65 ====================================================================
66 */
67
68 /* Play sounds and handle graphical effects. */
69 void client_handle_collected_extra( Paddle *paddle, int extra_type )
70 {
71 int i, j;
72 #ifdef AUDIO_ENABLED
73 int px = paddle->x+(paddle->w>>1);
74 #endif
75 Extra *ex;
76
77 switch (extra_type) {
78 case EX_JOKER:
79 #ifdef AUDIO_ENABLED
80 stk_sound_play_x( px, wav_joker );
81 #endif
82 list_reset( game->extras );
83 while ( ( ex = list_next( game->extras ) ) ) {
84 stk_display_store_rect( &ex->update_rect );
85 list_delete_current( game->extras );
86 }
87 break;
88 case EX_SCORE200:
89 case EX_SCORE500:
90 case EX_SCORE1000:
91 case EX_SCORE2000:
92 case EX_SCORE5000:
93 case EX_SCORE10000:
94 #ifdef AUDIO_ENABLED
95 stk_sound_play_x( px, wav_score );
96 #endif
97 break;
98 case EX_GOLDSHOWER:
99 paddle->extra_time[EX_GOLDSHOWER] += TIME_GOLDSHOWER;
100 paddle->extra_active[EX_GOLDSHOWER] = 1;
101 #ifdef AUDIO_ENABLED
102 stk_sound_play_x( px, wav_goldshower );
103 #endif
104 break;
105 case EX_LIFE:
106 if ( game->game_type == GT_LOCAL ) {
107 if ( paddle->player->lives < game->diff->max_lives ) {
108 paddle->player->lives++;
109 frame_add_life();
110 }
111 }
112 break;
113 case EX_SHORTEN:
114 #ifdef AUDIO_ENABLED
115 stk_sound_play_x( px, wav_shrink );
116 #endif
117 paddle_init_resize( paddle, -1);
118 break;
119 case EX_LENGTHEN:
120 #ifdef AUDIO_ENABLED
121 stk_sound_play_x( px, wav_expand );
122 #endif
123 paddle_init_resize( paddle, 1);
124 break;
125 case EX_BALL:
126 #ifdef AUDIO_ENABLED
127 stk_sound_play_x( px, wav_std );
128 #endif
129 break;
130 case EX_WALL:
131 paddle->extra_time[EX_WALL] += TIME_WALL;
132 if ( paddle->extra_active[EX_WALL] ) {
133 #ifdef AUDIO_ENABLED
134 stk_sound_play_x( px, wav_std );
135 #endif
136 break;
137 }
138 paddle->extra_active[extra_type] = 1;
139 paddle->wall_alpha = 0;
140 #ifdef AUDIO_ENABLED
141 stk_sound_play_x( px, wav_wall );
142 #endif
143 break;
144 case EX_METAL:
145 game->extra_time[EX_METAL] += TIME_METAL;
146 game->extra_active[extra_type] = 1;
147 ball_pic_x_offset = ball_w;
148 #ifdef AUDIO_ENABLED
149 stk_sound_play_x( px, wav_metal );
150 #endif
151 /* other ball extras are disabled */
152 if ( game->extra_active[EX_EXPL_BALL] ) {
153 game->extra_active[EX_EXPL_BALL] = 0;
154 game->extra_time[EX_EXPL_BALL] = 0;
155 }
156 if ( game->extra_active[EX_WEAK_BALL] ) {
157 game->extra_active[EX_WEAK_BALL] = 0;
158 game->extra_time[EX_WEAK_BALL] = 0;
159 }
160 break;
161 case EX_FROZEN:
162 paddle->extra_time[EX_FROZEN] = TIME_FROZEN;
163 paddle->extra_active[extra_type] = 1;
164 paddle->pic_y_offset = paddle_ch*2;
165 paddle->frozen = 1; /* the server sided paddle is blocked
166 so does the same with the local copy */
167 #ifdef AUDIO_ENABLED
168 stk_sound_play_x( px, wav_frozen );
169 #endif
170 break;
171 case EX_WEAPON:
172 paddle->extra_time[EX_WEAPON] += TIME_WEAPON;
173 paddle->extra_active[extra_type] = 1;
174 weapon_install( paddle, 1 );
175 #ifdef AUDIO_ENABLED
176 stk_sound_play_x( px, wav_std );
177 #endif
178 break;
179 case EX_SLIME:
180 paddle->extra_time[EX_SLIME] += TIME_SLIME;
181 paddle->extra_active[extra_type] = 1;
182 if ( !paddle->frozen )
183 paddle->pic_y_offset = paddle_ch;
184 #ifdef AUDIO_ENABLED
185 stk_sound_play_x( px, wav_attach );
186 #endif
187 break;
188 case EX_FAST:
189 #ifdef AUDIO_ENABLED
190 stk_sound_play_x( px, wav_speedup );
191 #endif
192 if ( game->extra_active[EX_SLOW] ) {
193 game->extra_time[EX_SLOW] = 0;
194 game->extra_active[EX_SLOW] = 0;
195 }
196 game->extra_time[EX_FAST] += TIME_FAST;
197 game->extra_active[extra_type] = 1;
198 break;
199 case EX_SLOW:
200 #ifdef AUDIO_ENABLED
201 stk_sound_play_x( px, wav_speeddown );
202 #endif
203 if ( game->extra_active[EX_FAST] ) {
204 game->extra_time[EX_FAST] = 0;
205 game->extra_active[EX_FAST] = 0;
206 }
207 game->extra_time[EX_SLOW] += TIME_SLOW;
208 game->extra_active[extra_type] = 1;
209 break;
210 case EX_CHAOS:
211 #ifdef AUDIO_ENABLED
212 stk_sound_play_x( px, wav_chaos );
213 #endif
214 game->extra_time[EX_CHAOS] += TIME_CHAOS;
215 game->extra_active[extra_type] = 1;
216 break;
217 case EX_DARKNESS:
218 #ifdef AUDIO_ENABLED
219 stk_sound_play_x( px, wav_darkness );
220 #endif
221 game->extra_time[EX_DARKNESS] += TIME_DARKNESS;
222 if ( game->extra_active[EX_DARKNESS] ) break;
223 /* backup offscreen and turn it black */
224 stk_surface_fill( offscreen, 0,0,-1,-1, 0x0 );
225 stk_surface_fill( stk_display, 0,0,-1,-1, 0x0 );
226 stk_display_store_rect( 0 );
227 /* set alpha keys to 128 */
228 SDL_SetAlpha( paddle_pic, SDL_SRCALPHA, 128 );
229 SDL_SetAlpha( weapon_pic, SDL_SRCALPHA, 128 );
230 SDL_SetAlpha( extra_pic, SDL_SRCALPHA, 128 );
231 SDL_SetAlpha( ball_pic, SDL_SRCALPHA, 128 );
232 SDL_SetAlpha( shot_pic, SDL_SRCALPHA, 128 );
233 SDL_SetAlpha( display_font->surface, SDL_SRCALPHA, 128 );
234 /* use dark explosions */
235 exps_set_dark( 1 );
236 game->extra_active[extra_type] = 1;
237 break;
238 case EX_GHOST_PADDLE:
239 #ifdef AUDIO_ENABLED
240 stk_sound_play_x( px, wav_ghost );
241 #endif
242 paddle->extra_time[EX_GHOST_PADDLE] += TIME_GHOST_PADDLE;
243 paddle->extra_active[extra_type] = 1;
244 paddle_set_invis( paddle, 1 );
245 break;
246 case EX_TIME_ADD:
247 #ifdef AUDIO_ENABLED
248 stk_sound_play_x( px, wav_timeadd );
249 #endif
250 for ( i = 0; i < EX_NUMBER; i++ )
251 if ( game->extra_time[i] )
252 game->extra_time[i] += 7000;
253 for ( i = 0; i < EX_NUMBER; i++ ) {
254 for ( j = 0; j < game->paddle_count; j++ )
255 if ( game->paddles[j]->extra_time[i] )
256 game->paddles[j]->extra_time[i] += 7000;
257 }
258 break;
259 case EX_EXPL_BALL:
260 #ifdef AUDIO_ENABLED
261 stk_sound_play_x( px, wav_expl_ball );
262 #endif
263 ball_pic_x_offset = ball_w*2;
264 game->extra_time[EX_EXPL_BALL] += TIME_EXPL_BALL;
265 game->extra_active[extra_type] = 1;
266 /* other ball extras are disabled */
267 if ( game->extra_active[EX_METAL] ) {
268 game->extra_active[EX_METAL] = 0;
269 game->extra_time[EX_METAL] = 0;
270 }
271 if ( game->extra_active[EX_WEAK_BALL] ) {
272 game->extra_active[EX_WEAK_BALL] = 0;
273 game->extra_time[EX_WEAK_BALL] = 0;
274 }
275 break;
276 case EX_WEAK_BALL:
277 #ifdef AUDIO_ENABLED
278 stk_sound_play_x( px, wav_weak_ball );
279 #endif
280 ball_pic_x_offset = ball_w*3;
281 game->extra_time[EX_WEAK_BALL] += TIME_WEAK_BALL;
282 game->extra_active[extra_type] = 1;
283 /* other ball extras are disabled */
284 if ( game->extra_active[EX_METAL] ) {
285 game->extra_active[EX_METAL] = 0;
286 game->extra_time[EX_METAL] = 0;
287 }
288 if ( game->extra_active[EX_EXPL_BALL] ) {
289 game->extra_active[EX_EXPL_BALL] = 0;
290 game->extra_time[EX_EXPL_BALL] = 0;
291 }
292 break;
293 case EX_BONUS_MAGNET:
294 #ifdef AUDIO_ENABLED
295 stk_sound_play_x( px, wav_bonus_magnet );
296 #endif
297 paddle_set_attract( paddle, ATTRACT_BONUS );
298 paddle->extra_time[EX_BONUS_MAGNET] += TIME_BONUS_MAGNET;
299 paddle->extra_active[extra_type] = 1;
300 if ( paddle->extra_active[EX_MALUS_MAGNET] ) {
301 paddle->extra_active[EX_MALUS_MAGNET] = 0;
302 paddle->extra_time[EX_MALUS_MAGNET] = 0;
303 }
304 break;
305 case EX_MALUS_MAGNET:
306 #ifdef AUDIO_ENABLED
307 stk_sound_play_x( px, wav_malus_magnet );
308 #endif
309 paddle_set_attract( paddle, ATTRACT_MALUS );
310 paddle->extra_time[EX_MALUS_MAGNET] += TIME_MALUS_MAGNET;
311 paddle->extra_active[extra_type] = 1;
312 if ( paddle->extra_active[EX_BONUS_MAGNET] ) {
313 paddle->extra_active[EX_BONUS_MAGNET] = 0;
314 paddle->extra_time[EX_BONUS_MAGNET] = 0;
315 }
316 break;
317 case EX_DISABLE:
318 #ifdef AUDIO_ENABLED
319 stk_sound_play_x( px, wav_disable );
320 #endif
321 /* set all active extra times to 1 so they will expire next
322 prog cycle */
323 for ( i = 0; i < EX_NUMBER; i++ )
324 if ( game->extra_time[i] )
325 game->extra_time[i] = 1;
326 for ( i = 0; i < EX_NUMBER; i++ ) {
327 for ( j = 0; j < game->paddle_count; j++ )
328 if ( game->paddles[j]->extra_time[i] )
329 game->paddles[j]->extra_time[i] = 1;
330 }
331 break;
332 }
333 }
334 /*
335 ====================================================================
336 Show, hide extras
337 ====================================================================
338 */
339 void extras_hide()
340 {
341 ListEntry *entry = game->extras->head->next;
342 Extra *ex;
343 while ( entry != game->extras->tail ) {
344 ex = entry->item;
345 entry = entry->next;
346 stk_surface_blit( offscreen,
347 (int)ex->x, (int)ex->y,
348 BRICK_WIDTH + shadow_size, BRICK_HEIGHT + shadow_size,
349 stk_display, (int)ex->x, (int)ex->y );
350 ex->update_rect = stk_drect;
351 stk_display_store_rect( &ex->update_rect );
352 }
353 }
354 void extras_show_shadow()
355 {
356 ListEntry *entry = game->extras->head->next;
357 Extra *extra;
358 while ( entry != game->extras->tail ) {
359 extra = entry->item;
360 stk_surface_clip( stk_display, 0,0,
361 stk_display->w - BRICK_WIDTH, stk_display->h );
362 stk_surface_alpha_blit(
363 extra_shadow, extra->type * BRICK_WIDTH, 0,
364 BRICK_WIDTH, BRICK_HEIGHT,
365 stk_display, (int)extra->x + shadow_size, (int)extra->y + shadow_size,
366 ((int)extra->alpha)>>1 );
367 stk_surface_clip( stk_display, 0,0,-1,-1 );
368 entry = entry->next;
369 }
370 }
371 void extras_show()
372 {
373 ListEntry *entry = game->extras->head->next;
374 Extra *ex;
375 int x, y;
376 while ( entry != game->extras->tail ) {
377 ex = entry->item;
378 entry = entry->next;
379 x = (int)ex->x; y = (int)ex->y;
380 stk_surface_alpha_blit( extra_pic, ex->offset, 0,
381 BRICK_WIDTH, BRICK_HEIGHT, stk_display, x, y, ex->alpha );
382 #if 0
383 if ( x < ex->update_rect.x ) {
384 /* movement to left */
385 ex->update_rect.w += ex->update_rect.x - x;
386 ex->update_rect.x = x;
387 }
388 else
389 /* movement to right */
390 ex->update_rect.w += x - ex->update_rect.x;
391 if ( ex->dir == -1 ) {
392 /* movement up */
393 ex->update_rect.h += ex->update_rect.y - y;
394 ex->update_rect.y = y;
395 if ( ex->update_rect.y < 0 ) {
396 ex->update_rect.h += ex->update_rect.y;
397 ex->update_rect.y = 0;
398 }
399 }
400 else {
401 /* movement down */
402 ex->update_rect.h += y - ex->update_rect.y;
403 if ( ex->update_rect.y + ex->update_rect.h >= stk_display->h )
404 ex->update_rect.h = stk_display->h - ex->update_rect.y;
405 }
406 stk_display_store_rect( &ex->update_rect );
407 #endif
408 ex->update_rect.x = x;
409 ex->update_rect.y = y;
410 ex->update_rect.w = BRICK_WIDTH + shadow_size;
411 ex->update_rect.h = BRICK_HEIGHT + shadow_size;
412 stk_display_store_rect( &ex->update_rect );
413 }
414 }
415 void extras_alphashow( int alpha )
416 {
417 ListEntry *entry = game->extras->head->next;
418 Extra *ex;
419 int x, y;
420 while ( entry != game->extras->tail ) {
421 ex = entry->item;
422 x = (int)ex->x;
423 y = (int)ex->y;
424 stk_surface_alpha_blit( extra_pic, ex->type * BRICK_WIDTH, 0,
425 BRICK_WIDTH, BRICK_HEIGHT, stk_display, x, y, alpha );
426 stk_display_store_rect( &ex->update_rect );
427 entry = entry->next;
428 }
429 }
430
431 /* move the extras as in extras_update but do not collect them */
432 void client_extras_update( int ms )
433 {
434 Extra *ex;
435 int i, j;
436 int magnets;
437 Paddle *magnet;
438
439 /* check extra_time of limited extras */
440 /* general extras */
441 for ( i = 0; i < EX_NUMBER; i++ )
442 if ( game->extra_time[i] ) {
443 if ( (game->extra_time[i] -= ms) <= 0 ) {
444 game->extra_time[i] = 0;
445 /* expired */
446 switch ( i ) {
447 case EX_EXPL_BALL:
448 case EX_WEAK_BALL:
449 case EX_METAL:
450 ball_pic_x_offset = 0;
451 break;
452 case EX_DARKNESS:
453 /* restore offscreen */
454 stk_surface_blit( bkgnd, 0,0,-1,-1, offscreen, 0,0 );
455 bricks_draw();
456 if ( game->game_type == GT_LOCAL )
457 frame_draw_lives( cur_player->lives,
458 game->diff->max_lives );
459 /* back to screen */
460 stk_surface_blit(
461 offscreen, 0,0,-1,-1,
462 stk_display, 0,0 );
463 stk_display_store_rect( 0 );
464 /* set alpha keys to OPAQUE */
465 SDL_SetAlpha( paddle_pic, 0,0 );
466 SDL_SetAlpha( extra_pic, 0,0 );
467 SDL_SetAlpha( ball_pic, 0,0 );
468 SDL_SetAlpha( shot_pic, 0,0 );
469 SDL_SetAlpha( display_font->surface, 0,0 );
470 /* use bright explosions */
471 exps_set_dark( 0 );
472 break;
473 }
474 /* set deactivated */
475 game->extra_active[i] = 0;
476 }
477 }
478 /* paddlized extras */
479 for ( j = 0; j < game->paddle_count; j++ )
480 for ( i = 0; i < EX_NUMBER; i++ )
481 /* extra_time of wall is updated in client_walls_update() */
482 if ( game->paddles[j]->extra_time[i] && i != EX_WALL )
483 if ( (game->paddles[j]->extra_time[i] -= ms) <= 0 ) {
484 game->paddles[j]->extra_time[i] = 0;
485 /* expired */
486 switch ( i ) {
487 case EX_FROZEN:
488 case EX_SLIME:
489 if ( game->paddles[j]->extra_time[EX_SLIME] > 0 )
490 game->paddles[j]->pic_y_offset = paddle_ch;
491 else
492 game->paddles[j]->pic_y_offset = 0;
493 game->paddles[j]->frozen = 0;
494 break;
495 case EX_WEAPON:
496 weapon_install( game->paddles[j], 0 );
497 break;
498 case EX_GHOST_PADDLE:
499 paddle_set_invis( game->paddles[j], 0 );
500 break;
501 case EX_BONUS_MAGNET:
502 case EX_MALUS_MAGNET:
503 paddle_set_attract( game->paddles[j], ATTRACT_NONE );
504 break;
505 }
506 /* set deactivated */
507 game->paddles[j]->extra_active[i] = 0; /* wall is handled in wall_...() */
508 }
509
510 /* move extras and check if paddle was hit */
511 list_reset( game->extras );
512 while ( ( ex = list_next( game->extras ) ) ) {
513 /* if only one paddle has a magnet active all extras will
514 * be attracted by this paddle else the extras 'dir' is used
515 */
516 magnets = 0; magnet = 0;
517 for ( i = 0; i < game->paddle_count; i++ )
518 if ( paddle_check_attract( game->paddles[i], ex->type ) ) {
519 magnets++;
520 magnet = game->paddles[i]; /* last magnet */
521 }
522 if ( magnets != 1 ) {
523 /* either no or more than one magnet so use default */
524 if ( ex->dir > 0 )
525 ex->y += 0.05 * ms;
526 else
527 ex->y -= 0.05 * ms;
528 }
529 else {
530 /* 'magnet' is the paddle that will attract this extra */
531 if ( magnet->type == PADDLE_TOP )
532 ex->y -= 0.05 * ms;
533 else
534 ex->y += 0.05 * ms;
535 if ( ex->x + ( BRICK_WIDTH >> 1 ) < magnet->x + ( magnet->w >> 1 ) ) {
536 ex->x += 0.05 * ms;
537 if ( ex->x + ( BRICK_WIDTH >> 1 ) > magnet->x + ( magnet->w >> 1 ) )
538 ex->x = magnet->x + ( magnet->w >> 1 ) - ( BRICK_WIDTH >> 1 );
539 }
540 else {
541 ex->x -= 0.05 * ms;
542 if ( ex->x + ( BRICK_WIDTH >> 1 ) < magnet->x + ( magnet->w >> 1 ) )
543 ex->x = magnet->x + ( magnet->w >> 1 ) - ( BRICK_WIDTH >> 1 );
544 }
545 }
546 if ( !game->extra_active[EX_DARKNESS] ) {
547 if ( ex->alpha < 255 ) {
548 ex->alpha += 0.25 * ms;
549 if (ex->alpha > 255)
550 ex->alpha = 255;
551 }
552 }
553 else {
554 if ( ex->alpha < 128 ) {
555 ex->alpha += 0.25 * ms;
556 if (ex->alpha > 128)
557 ex->alpha = 128;
558 }
559 }
560 /* if out of screen forget this extra */
561 if ( ex->y >= stk_display->h || ex->y + BRICK_HEIGHT < 0 ) {
562 stk_display_store_rect( &ex->update_rect );
563 list_delete_current( game->extras );
564 continue;
565 }
566 for ( j = 0; j < game->paddle_count; j++ ) {
567 /* contact with paddle core ? */
568 if ( paddle_solid( game->paddles[j] ) )
569 if ( ex->x + BRICK_WIDTH > game->paddles[j]->x )
570 if ( ex->x < game->paddles[j]->x + game->paddles[j]->w - 1 )
571 if ( ex->y + BRICK_HEIGHT > game->paddles[j]->y )
572 if ( ex->y < game->paddles[j]->y + game->paddles[j]->h ) {
573 /* remove extra but don't handle it */
574 stk_display_store_rect( &ex->update_rect );
575 list_delete_current( game->extras );
576 }
577 }
578 }
579 }
580
581 /* wall */
582 void walls_hide()
583 {
584 int j;
585 for ( j = 0; j < game->paddle_count; j++ )
586 if ( game->paddles[j]->extra_active[EX_WALL] ) {
587 stk_surface_blit( offscreen, BRICK_WIDTH, game->paddles[j]->wall_y,
588 wall_pic->w, wall_pic->h,
589 stk_display, BRICK_WIDTH, game->paddles[j]->wall_y );
590 stk_display_store_drect();
591 }
592 }
593 void walls_show()
594 {
595 int j;
596 for ( j = 0; j < game->paddle_count; j++ )
597 if ( game->paddles[j]->extra_active[EX_WALL] )
598 stk_surface_alpha_blit( wall_pic, 0,0,
599 wall_pic->w, wall_pic->h,
600 stk_display, BRICK_WIDTH, game->paddles[j]->wall_y,
601 (int)game->paddles[j]->wall_alpha );
602 }
603 void walls_alphashow( int alpha )
604 {
605 int j;
606 for ( j = 0; j < game->paddle_count; j++ )
607 if ( game->paddles[j]->extra_active[EX_WALL] )
608 stk_surface_alpha_blit( wall_pic, 0,0,
609 wall_pic->w, wall_pic->h,
610 stk_display, BRICK_WIDTH, game->paddles[j]->wall_y,
611 alpha );
612 }
613 void client_walls_update( int ms )
614 {
615 int j;
616
617 for ( j = 0; j < game->paddle_count; j++ )
618 if ( game->paddles[j]->extra_active[EX_WALL] ) {
619 if ( game->paddles[j]->extra_time[EX_WALL] > 0 ) {
620 if ( (game->paddles[j]->extra_time[EX_WALL] -= ms) < 0 )
621 game->paddles[j]->extra_time[EX_WALL] = 0;
622 /* still appearing? */
623 if (game->paddles[j]->wall_alpha < 255)
624 if ( (game->paddles[j]->wall_alpha += 0.25 * ms) > 255 )
625 game->paddles[j]->wall_alpha = 255;
626 }
627 else
628 if ( (game->paddles[j]->wall_alpha -= 0.25 * ms) < 0 ) {
629 game->paddles[j]->wall_alpha = 0;
630 game->paddles[j]->extra_active[EX_WALL] = 0;
631 }
632 }
633 }
634
0 /***************************************************************************
1 extras.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /* Play sounds and handle graphical effects. */
18 void client_handle_collected_extra( Paddle *paddle, int extra_type );
19
20 /* move the extras as in extras_update but do not collect them */
21 void client_extras_update( int ms );
22
23 /*
24 ====================================================================
25 Show, hide extras
26 ====================================================================
27 */
28 void extras_hide();
29 void extras_show_shadow();
30 void extras_show();
31 void extras_alphashow( int alpha );
32 /*
33 ====================================================================
34 Wall
35 ====================================================================
36 */
37 void walls_hide();
38 void walls_show();
39 void walls_alphashow( int alpha );
40 void client_walls_update( int ms );
41
0
1 /***************************************************************************
2 file.c - description
3 -------------------
4 begin : Thu Jan 18 2001
5 copyright : (C) 2001 by Michael Speck
6 email : kulkanie@gmx.net
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <dirent.h>
22 #include <sys/stat.h>
23
24 #include "../common/list.h"
25 #include "../common/tools.h"
26 #include "file.h"
27
28 //#define FILE_DEBUG
29
30 /*
31 ====================================================================
32 Test file in path as mode.
33 Return Value: True if sucessful
34 ====================================================================
35 */
36 int file_check( char *path, char *fname, char *mode )
37 {
38 char *full_path;
39 FILE *file = 0;
40 int ok = 0;
41
42 full_path = calloc( strlen( path ) + strlen( fname ) + 2, sizeof( char ) );
43 sprintf( full_path, "%s/%s", path, fname );
44
45 if ( ( file = fopen( full_path, mode ) ) != 0 ) {
46 fclose( file );
47 ok = 1;
48 }
49 free( full_path );
50 return ok;
51 }
52 /*
53 ====================================================================
54 Open file in path according to type (write, read, append)
55 Return Value: File handle if successful else Null
56 ====================================================================
57 */
58 FILE *file_open( char *path, char *fname, int type )
59 {
60 FILE *file = 0;
61 char *full_path;
62 char mode[3] = "a";
63
64 full_path = calloc( strlen( path ) + strlen( fname ) + 2, sizeof( char ) );
65 sprintf( full_path, "%s/%s", path, fname );
66
67 switch ( type ) {
68 case FILE_READ:
69 if ( ( file = fopen( full_path, "rb" ) ) == 0 )
70 fprintf( stderr, "file_open: cannot open file '%s' for reading: permission denied or non-existent\n", full_path );
71 break;
72 case FILE_WRITE:
73 sprintf( mode, "w" );
74 case FILE_APPEND:
75 if ( ( file = fopen( full_path, mode ) ) == 0 )
76 fprintf( stderr, "file_open: cannot open file '%s': permission denied\n", full_path );
77 break;
78 }
79 return file;
80 }
81
82 /*
83 ====================================================================
84 Read all lines from file pointer and return as static array.
85 Resets the file pointer. Should only be used when reading a whole
86 file.
87 ====================================================================
88 */
89 char** file_read_lines( FILE *file, int *count )
90 {
91 int nl_count = 0;
92 char c;
93 char **lines;
94 char buffer[1024];
95
96 if ( !file ) return 0;
97
98 /* count new_lines */
99 fseek( file, 0, SEEK_SET );
100 while ( !feof( file ) ) {
101 fread( &c, sizeof( char ), 1, file );
102 if ( c == 10 ) nl_count++;
103 }
104 fseek( file, 0, SEEK_SET );
105 nl_count++; /* maybe last lines wasn't terminated */
106
107 /* get mem */
108 lines = calloc( nl_count, sizeof( char* ) );
109
110 /* read lines */
111 *count = 0;
112 while( !feof( file ) ) {
113 if ( !fgets( buffer, 1023, file ) ) break;
114 if ( buffer[0] == 10 ) continue; /* empty line */
115 buffer[strlen( buffer ) - 1] = 0; /* cancel newline */
116 lines[*count] = strdup( buffer );
117 (*count)++;
118 }
119
120 return lines;
121 }
122
123 /* check consistence of file (all brackets/comments closed).
124 will reset the file pos to the very beginning */
125 int check_file_cons( FILE *file )
126 {
127 int brac = 0, comm = 0;
128 char c;
129 int ok = 1;
130
131 fseek( file, 0, SEEK_SET );
132
133 while ( !feof( file ) ) {
134
135 fread( &c, 1, 1, file );
136 switch ( c ) {
137
138 case '(': brac++; break;
139 case ')': brac--; break;
140 case '#': comm++; break;
141
142 }
143
144 }
145
146 fseek( file, 0, SEEK_SET );
147
148 if ( brac != 0 || ( comm % 2) != 0 ) {
149
150 #ifdef FILE_DEBUG
151 if ( brac != 0 )
152 printf("the number of opening and closing brackets does not fit!...\n");
153 else
154 printf("the number of opening and closing comment hashes does not fit!...\n");
155 #endif
156 ok = 0;
157
158 }
159
160 return ok;
161 }
162
163 /* return line number; keeps current file pos */
164 int get_line_number( FILE *file ) {
165 int count = 0;
166 char c;
167 int pos = ftell( file );
168
169 fseek( file, 0, SEEK_SET );
170 while ( ftell( file ) < pos - 1 ) {
171 fread( &c, sizeof( char ), 1, file );
172 if ( c == 10 ) count++;
173 }
174 fseek( file, pos, SEEK_SET );
175 return count + 1;
176 }
177
178 /* ignore all blanks and jump to next none-blank */
179 void ignore_blanks( FILE *file )
180 {
181 char c;
182 do {
183 fread( &c, sizeof( char ), 1, file );
184 } while ( c <= 32 && !feof( file ) );
185 if ( !feof( file ) )
186 fseek( file, -1, SEEK_CUR ); /* restore last none-blank */
187 }
188
189 /* add character to token and check max length; return true if below max length */
190 int add_char( char *token, int c )
191 {
192 int length = strlen( token );
193 /* check token length */
194 if ( length == MAX_TOKEN_LENGTH - 1 ) {
195 fprintf( stderr,
196 "read_token: token '%s' reached maximum length of %i, reading skipped\n",
197 token, length );
198 return 0;
199 }
200 token[length++] = c;
201 token[length] = 0;
202 return 1;
203 }
204 /* read token from current file position; ignore spaces;
205 tokes are:
206 (
207 )
208 =
209 # comment #
210 " string "
211 normal_token
212 save token in token and check that MAX_TOKEN_LENGTH is not exceeded
213 return true if not end of file */
214 int read_token( FILE *file, char *token )
215 {
216 int length = 0; /* token length */
217 char c;
218 int read_str = 0; /* if this is set token is a string "..." */
219 int i;
220
221 /* clear token */
222 token[0] = 0;
223
224 /* ignore all blanks before token */
225 ignore_blanks( file );
226
227 while( !feof( file ) ) {
228 fread( &c, sizeof( char ), 1, file );
229 /* treat new_lines as blanks */
230 if ( c == 10 ) c = 32;
231 /* check if this is a comment; if so ignore all characters in between */
232 if ( c == '#' && !read_str ) {
233 /* read all characters until '#' occurs */
234 do {
235 fread( &c, sizeof( char ), 1, file );
236 } while ( c != '#' );
237 /* ignore all blanks after comment */
238 ignore_blanks( file );
239 continue; /* start reading again */
240 }
241 /* add char */
242 if ( !add_char( token, c ) ) {
243 /* in this case restore last char as it belongs to next token */
244 fseek( file, -1, SEEK_CUR );
245 break;
246 }
247 else
248 length++;
249 /* check if token ends with a special single-character assignment token */
250 if ( !read_str )
251 if ( c == '(' || c == ')' || c == '=' ) {
252 /* if this wasn't the first character it already belongs to a new token, so skip it */
253 if ( length > 1 ) {
254 fseek( file, -1, SEEK_CUR );
255 token[--length] = 0;
256 }
257 break;
258 }
259 /* check if this char is a blank */
260 if ( c <= 32 && !read_str ) {
261 /* remvoe this blank from token */
262 token[--length] = 0;
263 break;
264 }
265 /* check if this is a long string embraced by "..." */
266 if ( c == '"' ) {
267 if ( length > 1 ) {
268 if ( read_str )
269 /* termination of string; stop reading */
270 break;
271 else {
272 /* token read and this " belongs to next token */
273 /* in this case restore last char */
274 fseek( file, -1, SEEK_CUR );
275 token[--length] = 0;
276 break;
277 }
278 }
279 else
280 read_str = 1;
281 }
282 }
283 if ( read_str ) {
284 /* delete brackets from token */
285 for ( i = 1; i < strlen( token ); i++ )
286 token[i - 1] = token[i];
287 token[strlen( token ) - 2] = 0;
288 }
289 if ( feof( file ) ) return 0;
290 return 1;
291 }
292
293 /* find a string in the file and set file stream to this position */
294 int find_token( FILE *file, char *name, int type, int warning )
295 {
296 char token[MAX_TOKEN_LENGTH];
297
298 if ( type == RESET_FILE_POS )
299 fseek( file, 0, SEEK_SET );
300 while( read_token( file, token ) )
301 if ( strequal( name, token ) ) {
302 /* adjust position this token must be read */
303 fseek( file, -strlen( token ) -1, SEEK_CUR );
304 return 1;
305 }
306 if ( warning == WARNING )
307 fprintf( stderr, "find_token: warning: token '%s' not found\n", name );
308 return 0;
309 }
310
311 /* read argument string of a single assignment */
312 char* get_arg( FILE *file, char *name, int type )
313 {
314 char token[MAX_TOKEN_LENGTH];
315 char *arg = 0;
316
317 /* search entry_name */
318 if ( !find_token( file, name, type, WARNING ) ) return 0;
319
320 /* token was found so read it */
321 read_token( file, token );
322 /* next token must be an equation */
323 read_token( file, token );
324 if ( token[0] != '=' ) {
325 fprintf( stderr,
326 "get_arg: line %i: '=' expected after token '%s' but found '%s' instead\n", get_line_number( file ), name, token );
327 return 0;
328 }
329 /* get argument */
330 read_token( file, token );
331 if ( token[0] == 0 )
332 fprintf( stderr, "get_arg: line %i: warning: argument for '%s' is empty\n", get_line_number( file ), name );
333 arg = strdup( token );
334 #ifdef FILE_DEBUG
335 printf( "get_arg: %s = %s\n", name, arg );
336 #endif
337 return arg;
338 }
339
340 /* read a cluster of arguments and return as static list */
341 char** get_arg_cluster( FILE *file, char *name, int *count, int type, int warning )
342 {
343 List *args;
344 char token[MAX_TOKEN_LENGTH];
345 char **arg_list = 0;
346 int i;
347
348 *count = 0;
349
350 /* search entry_name */
351 if ( !find_token( file, name, type, warning ) ) return 0;
352
353 /* init list */
354 args = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
355
356 /* read entry_name */
357 read_token( file, token );
358 /* next token must be an '(' */
359 read_token( file, token );
360 if ( token[0] != '(' ) {
361 fprintf( stderr, "get_arg_cluster: line %i: '(' expected after token '%s' but found '%s' instead\n", get_line_number( file ), name, token );
362 return 0;
363 }
364
365 /* read tokens and add to dynamic list until ')' occurs; if an '=' or '(' is read instead something
366 gone wrong */
367 while ( 1 ) {
368 read_token( file, token );
369 if ( token[0] == ')' ) break;
370 if ( token[0] == '(' || token[0] == '=' ) {
371 fprintf( stderr, "get_arg_cluster: line %i: ')' expected to terminate argument list of entry '%s' but found '%c' instead\n", get_line_number( file ), name, token[0] );
372 list_clear( args );
373 return 0;
374 }
375 /* everything's ok; add to list */
376 list_add( args, strdup( token ) );
377 }
378
379 /* static argument list */
380 arg_list = calloc( args->count, sizeof( char* ) );
381 for ( i = 0; i < args->count; i++ )
382 arg_list[i] = strdup( (char*)list_get( args, i ) );
383 *count = args->count;
384
385 list_delete( args );
386
387 return arg_list;
388 }
389
390 /* free arg cluster */
391 void delete_arg_cluster( char **cluster, int count )
392 {
393 int i;
394 if ( cluster ) {
395 for ( i = 0; i < count; i++ )
396 if ( cluster[i] )
397 FREE( cluster[i] );
398 FREE( cluster );
399 }
400 }
401
402 /* count number of entries */
403 int count_arg( FILE *file, char *name )
404 {
405 char token[MAX_TOKEN_LENGTH];
406 int count = 0;
407
408 fseek( file, 0, SEEK_SET );
409 while ( read_token( file, token ) ) {
410 if ( strequal( name, token ) )
411 count++;
412 }
413 return count;
414 }
415
416 /*
417 ====================================================================
418 Swap these two pointers.
419 ====================================================================
420 */
421 void swap( char **str1, char **str2 )
422 {
423 char *dummy;
424 dummy = *str1;
425 *str1 = *str2;
426 *str2 = dummy;
427 }
428
429 /*
430 ====================================================================
431 Return a list with all accessible files and directories in path
432 with the extension ext (if != 0). Don't show hidden files.
433 Root is the name of the parent directory that can't be left. If this
434 is next directory up '..' is not added.
435 ====================================================================
436 */
437 Text* get_file_list( char *path, char *ext, char *root )
438 {
439 Text *text = 0;
440 int i, j;
441 DIR *dir;
442 DIR *test_dir;
443 struct dirent *dirent = 0;
444 List *list = 0;
445 struct stat fstat;
446 char file_name[512];
447 FILE *file;
448 int len;
449
450 /* open this directory */
451 if ( ( dir = opendir( path ) ) == 0 ) {
452 fprintf( stderr, "get_file_list: can't open parent directory '%s'\n", path );
453 return 0;
454 }
455
456 text = calloc( 1, sizeof( Text ) );
457
458 /* use dynamic list to gather all valid entries */
459 list = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
460 /* read each entry and check if its a valid entry, then add it to the dynamic list */
461 while ( ( dirent = readdir( dir ) ) != 0 ) {
462 /* hiden stuff is not displayed */
463 if ( dirent->d_name[0] == '.' && dirent->d_name[1] != '.' ) continue;
464 /* check if it's the root directory */
465 if ( root )
466 if ( dirent->d_name[0] == '.' )
467 if ( strlen( path ) > strlen( root ) )
468 if ( !strncmp( path + strlen( path ) - strlen( root ), root, strlen( root ) ) )
469 continue;
470 /* get stats */
471 sprintf( file_name, "%s/%s", path, dirent->d_name );
472 if ( stat( file_name, &fstat ) == -1 ) continue;
473 /* check directory */
474 if ( S_ISDIR( fstat.st_mode ) ) {
475 if ( ( test_dir = opendir( file_name ) ) == 0 ) continue;
476 closedir( test_dir );
477 sprintf( file_name, "*%s", dirent->d_name );
478 list_add( list, strdup( file_name ) );
479 }
480 else
481 /* check regular file */
482 if ( S_ISREG( fstat.st_mode ) ) {
483 /* test it */
484 if ( ( file = fopen( file_name, "r" ) ) == 0 ) continue;
485 fclose( file );
486 /* check if this file has the proper extension */
487 if ( ext )
488 if ( !strequal( dirent->d_name + ( strlen( dirent->d_name ) - strlen( ext ) ), ext ) )
489 continue;
490 list_add( list, strdup( dirent->d_name ) );
491 }
492 }
493 /* close dir */
494 closedir( dir );
495
496 /* convert to static list */
497 text->count = list->count;
498 text->lines = calloc( list->count, sizeof( char* ));
499 for ( i = 0; i < text->count; i++ )
500 text->lines[i] = strdup( (char*)list_get( list, i ) );
501 list_delete( list );
502
503 /* sort this list: directories at top and everything in alphabetical order */
504 if ( text->count > 0 )
505 for ( i = 0; i < text->count - 1; i++ )
506 for ( j = i + 1; j < text->count; j++ ) {
507 /* directory comes first */
508 if ( text->lines[j][0] == '*' ) {
509 if ( text->lines[i][0] != '*' )
510 swap( &text->lines[i], &text->lines[j] );
511 else {
512 /* do not exceed buffer size of smaller buffer */
513 len = strlen( text->lines[i] );
514 if ( strlen( text->lines[j] ) < len ) len = strlen( text->lines[j] );
515 if ( strncmp( text->lines[j], text->lines[i], len ) < 0 )
516 swap( &text->lines[i], &text->lines[j] );
517 }
518 }
519 else {
520 /* do not exceed buffer size of smaller buffer */
521 len = strlen( text->lines[i] );
522 if ( strlen( text->lines[j] ) < len ) len = strlen( text->lines[j] );
523 if ( strncmp( text->lines[j], text->lines[i], len ) < 0 )
524 swap( &text->lines[i], &text->lines[j] );
525 }
526 }
527
528 return text;
529 }
0 /***************************************************************************
1 file.h - description
2 -------------------
3 begin : Thu Jan 18 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17
18 #ifndef __FILE_H
19 #define __FILE_H
20
21 /*
22 this file contains function to work with files like
23 open,close,read/write binary/ascii data...
24 */
25
26 /* maximum length of a token */
27 enum {
28 MAX_TOKEN_LENGTH = 1024
29 };
30
31 /* shall find_arg reset to beginning of file or use current position? */
32 enum {
33 RESET_FILE_POS = 0,
34 FROM_CURRENT_FILE_POS
35 };
36
37 /* shall read_file_token go to next token or stay at end of current one */
38 enum {
39 GO_TO_NEXT_TOKEN = 0,
40 STAY_AT_TOKEN
41 };
42
43 /* display warning if find_arg failed */
44 enum {
45 NO_WARNING = 0,
46 WARNING
47 };
48
49 /*
50 ====================================================================
51 Test file in path as mode.
52 Return Value: True if sucessful
53 ====================================================================
54 */
55 int file_check( char *path, char *file, char *mode );
56 /*
57 ====================================================================
58 Open file in path according to type (write, read, append)
59 Return Value: File handle if successful else Null
60 ====================================================================
61 */
62 enum {
63 FILE_WRITE,
64 FILE_READ,
65 FILE_APPEND
66 };
67 FILE *file_open( char *path, char *fname, int type );
68 /*
69 ====================================================================
70 Read all lines from file pointer and return as static array.
71 Resets the file pointer. Should only be used when reading a whole
72 file.
73 ====================================================================
74 */
75 char** file_read_lines( FILE *file, int *count );
76
77 /* check consistence of file (all brackets/comments closed).
78 will reset the file pos to the very beginning */
79 int check_file_cons( FILE *file );
80
81 /* find a string in the file and set file stream to this position */
82 int find_token( FILE *file, char *name, int type, int warning );
83
84 /* read argument string of a single assignment */
85 char* get_arg( FILE *file, char *name, int type );
86
87 /* read a cluster of arguments and return as static list */
88 char** get_arg_cluster( FILE *file, char *name, int *count, int type, int warning );
89
90 /* free arg cluster */
91 void delete_arg_cluster( char **cluster, int count );
92
93 /* count number of entries */
94 int count_arg( FILE *file, char*name );
95
96 /*
97 ====================================================================
98 Return a list with all accessible files and directories in path
99 with the extension ext (if != 0). Don't show hidden files.
100 Root is the name of the parent directory that can't be left. If this
101 is next directory up '..' is not added.
102 ====================================================================
103 */
104 Text* get_file_list( char *path, char *ext, char *root );
105
106 #endif
0 /***************************************************************************
1 frame.c - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "player.h"
20 #include "display.h"
21 #include "frame.h"
22
23 extern SDL_Surface *stk_display;
24 extern SDL_Surface *offscreen;
25 extern SDL_Surface *bkgnd; /* background + frame */
26 extern SDL_Surface *brick_pic; /* brick graphics in a horizontal order */
27 /* parts of the frame: left, top, right */
28 extern SDL_Surface *frame_left, *frame_top, *frame_right;
29 extern SDL_Surface *frame_left_shadow, *frame_top_shadow, *frame_right_shadow;
30 extern SDL_Surface *frame_mp_left, *frame_mp_right;
31 extern SDL_Surface *frame_mp_left_shadow, *frame_mp_right_shadow;
32 extern SDL_Surface *lamps; /* life lamps */
33 float score = 0; /* current score */
34 int dest_score; /* final score */
35 int score_x_offset = 54; /* display score at this position (right align)*/
36 int score_x, score_y = BRICK_HEIGHT / 2 - 2; /* center position where to write score */
37 int new_life_y; /* if new life lamp is drawn do this at this y position */
38 int name_x = 404, name_y = BRICK_HEIGHT / 2 - 2; /* offset (right side of screen) */
39 extern int shadow_size;
40 extern Config config;
41 int info_x;
42 int info_y; /* absolute position is info_y + info_offset */
43 int info_offsets[EX_NUMBER]; /* offset at which extra info is displayed */
44 int paddle_info_y[4];
45 int paddle_info_offsets[EX_NUMBER]; /* specialized extras */
46 extern SDL_Surface *extra_pic;
47 #ifdef AUDIO_ENABLED
48 extern StkSound *wav_life_up, *wav_life_down;
49 #endif
50 extern StkFont *display_font;
51 int warp_blink;
52 Delay warp_delay;
53 int warp_x, warp_y;
54 int warp_blinks;
55 extern SDL_Surface *warp_pic;
56 extern Game *game;
57
58 /*
59 ====================================================================
60 Locals
61 ====================================================================
62 */
63
64 /*
65 ====================================================================
66 Publics
67 ====================================================================
68 */
69
70 /*
71 ====================================================================
72 Create frame by loading and assembling all graphics and loading
73 additional graphics.
74 ====================================================================
75 */
76 void frame_create()
77 {
78 delay_set( &warp_delay, 500 );
79 warp_x = stk_display->w - BRICK_WIDTH + ( BRICK_WIDTH - warp_pic->w ) / 2;
80 warp_y = stk_display->h - warp_pic->h;
81 warp_blink = 0;
82 }
83
84 /*
85 ====================================================================
86 Inititate the frame to the according game type.
87 Set the position of the extras displayed, enable life lamps etc.
88 ====================================================================
89 */
90 void frame_init()
91 {
92 /* setup position of extra info */
93 info_x = stk_display->w - BRICK_WIDTH;
94 if ( game->game_type == GT_NETWORK ) {
95 /* general */
96 info_y = 178;
97 info_offsets[EX_METAL] = 26;
98 info_offsets[EX_WEAK_BALL] = 26;
99 info_offsets[EX_EXPL_BALL] = 26;
100 info_offsets[EX_FAST] = 52;
101 info_offsets[EX_SLOW] = 52;
102 info_offsets[EX_CHAOS] = 78;
103 /* paddles */
104 paddle_info_y[0] = 271;
105 paddle_info_y[1] = 7;
106 paddle_info_offsets[EX_SLIME] = 26;
107 paddle_info_offsets[EX_WEAPON] = 52;
108 paddle_info_offsets[EX_WALL] = 78;
109 paddle_info_offsets[EX_GOLDSHOWER] = 104;
110 paddle_info_offsets[EX_GHOST_PADDLE] = 130;
111 paddle_info_offsets[EX_BONUS_MAGNET] = 156;
112 paddle_info_offsets[EX_MALUS_MAGNET] = 156;
113 }
114 else {
115 /* in single player we ignore the second paddle
116 and model general and paddle0 extras so that
117 they result in the old layout */
118 info_y = 48; paddle_info_y[0] = 48;
119 paddle_info_offsets[EX_GOLDSHOWER] = 30;
120 paddle_info_offsets[EX_SLIME] = 60;
121 info_offsets[EX_METAL] = 90;
122 info_offsets[EX_WEAK_BALL] = 90;
123 info_offsets[EX_EXPL_BALL] = 90;
124 paddle_info_offsets[EX_WALL] = 120;
125 paddle_info_offsets[EX_WEAPON] = 150;
126 info_offsets[EX_FAST] = 180;
127 info_offsets[EX_SLOW] = 180;
128 info_offsets[EX_CHAOS] = 210;
129 paddle_info_offsets[EX_GHOST_PADDLE] = 240;
130 paddle_info_offsets[EX_BONUS_MAGNET] = 270;
131 paddle_info_offsets[EX_MALUS_MAGNET] = 270;
132 }
133 }
134
135 /*
136 ====================================================================
137 Free all resources created by frame_create()
138 ====================================================================
139 */
140 void frame_delete()
141 {
142 }
143 /*
144 ====================================================================
145 Draw frame to offscreen and to bkgnd as frame won't change while
146 playing.
147 ====================================================================
148 */
149 void frame_draw()
150 {
151 SDL_Surface *fr_left = (game->game_type==GT_LOCAL)?frame_left:frame_mp_left;
152 SDL_Surface *fr_right = (game->game_type==GT_LOCAL)?frame_right:frame_mp_right;
153 SDL_Surface *fr_left_shadow =
154 (game->game_type==GT_LOCAL)?frame_left_shadow:frame_mp_left_shadow;
155 SDL_Surface *fr_right_shadow =
156 (game->game_type==GT_LOCAL)?frame_right_shadow:frame_mp_right_shadow;
157 /* left and right part are always drawn */
158 /* left part */
159 stk_surface_alpha_blit( fr_left_shadow, 0,0,-1,-1,
160 offscreen, shadow_size, shadow_size, SHADOW_ALPHA );
161 stk_surface_blit( fr_left, 0,0,-1,-1, offscreen, 0,0 );
162 stk_surface_alpha_blit( fr_left_shadow, 0,0,-1,-1,
163 bkgnd, shadow_size, shadow_size, SHADOW_ALPHA );
164 stk_surface_blit( fr_left, 0,0,-1,-1, bkgnd, 0,0 );
165 if ( game->game_type == GT_LOCAL ) {
166 /* add top */
167 stk_surface_alpha_blit( frame_top_shadow, 0,0,-1,-1,
168 offscreen, fr_left->w + shadow_size, shadow_size, SHADOW_ALPHA );
169 stk_surface_blit(
170 frame_top, 0,0,-1,-1, offscreen, fr_left->w,0 );
171 stk_surface_alpha_blit( frame_top_shadow, 0,0,-1,-1,
172 bkgnd, fr_left->w + shadow_size, shadow_size, SHADOW_ALPHA );
173 stk_surface_blit(
174 frame_top, 0,0,-1,-1, bkgnd, fr_left->w,0 );
175 }
176 /* right part */
177 stk_surface_alpha_blit( fr_right_shadow, 0,0,-1,-1,
178 offscreen, stk_display->w - fr_right_shadow->w + shadow_size,
179 shadow_size, SHADOW_ALPHA );
180 stk_surface_blit( fr_right, 0,0,-1,-1, offscreen,
181 stk_display->w - fr_right->w,0 );
182 stk_surface_alpha_blit( fr_right_shadow, 0,0,-1,-1,
183 bkgnd, stk_display->w - fr_right_shadow->w + shadow_size,
184 shadow_size, SHADOW_ALPHA );
185 stk_surface_blit( fr_right, 0,0,-1,-1, bkgnd,
186 stk_display->w - fr_right->w,0 );
187 }
188 /*
189 ====================================================================
190 Add life lamps at left side of frame in offscreen
191 ====================================================================
192 */
193 void frame_draw_lives( int lives, int max_lives )
194 {
195 int i,y;
196 /* substract one life to have the same result like in old LBreakout */
197 /* at maximum ten lamps may be displayed */
198 for ( i = 0; i < 10; i++ ) {
199 if ( i < lives - 1 )
200 y = BRICK_HEIGHT;
201 else
202 if ( i < max_lives - 1 )
203 y = 0;
204 else
205 y = BRICK_HEIGHT * 2;
206 stk_surface_blit( lamps, 0,y, BRICK_WIDTH, BRICK_HEIGHT,
207 offscreen, 0, ( MAP_HEIGHT - i - 1 ) * BRICK_HEIGHT );
208 }
209 /* get position of next lamp */
210 new_life_y = stk_display->h - lives * BRICK_HEIGHT;
211 }
212 /*
213 ====================================================================
214 Add one new life at offscreen and screen (as this will happen in
215 game )
216 ====================================================================
217 */
218 void frame_add_life()
219 {
220 if ( !game->extra_active[EX_DARKNESS] ) {
221 stk_surface_blit( lamps, 0, BRICK_HEIGHT,
222 BRICK_WIDTH, BRICK_HEIGHT,
223 stk_display, 0, new_life_y );
224 stk_display_store_drect();
225 }
226 new_life_y -= BRICK_HEIGHT;
227 #ifdef AUDIO_ENABLED
228 stk_sound_play_x( 20, wav_life_up );
229 #endif
230 }
231 /*
232 ====================================================================
233 Switch of a life lamp
234 ====================================================================
235 */
236 void frame_remove_life()
237 {
238 new_life_y += BRICK_HEIGHT;
239 if ( new_life_y >= stk_display->h ) return;
240 if ( !game->extra_active[EX_DARKNESS] ) {
241 stk_surface_blit( lamps, 0, 0, BRICK_WIDTH, BRICK_HEIGHT,
242 stk_display, 0, new_life_y );
243 stk_display_store_drect();
244 }
245 #ifdef AUDIO_ENABLED
246 stk_sound_play_x( 20, wav_life_down );
247 #endif
248 }
249 /*
250 ====================================================================
251 Display extra information on right side of screen.
252 ====================================================================
253 */
254 void frame_info_hide()
255 {
256 int i, j;
257 if ( !config.bonus_info ) return;
258 for ( i = 0; i < EX_NUMBER; i++ )
259 if ( info_offsets[i] > 0 && game->extra_active[i] ) {
260 stk_surface_blit( offscreen, info_x, info_y + info_offsets[i],
261 BRICK_WIDTH, BRICK_HEIGHT,
262 stk_display, info_x, info_y + info_offsets[i] );
263 stk_display_store_drect();
264 }
265 for ( i = 0; i < EX_NUMBER; i++ )
266 for ( j = 0; j < game->paddle_count; j++ )
267 if ( paddle_info_offsets[i] > 0 && game->paddles[j]->extra_active[i] ) {
268 stk_surface_blit( offscreen, info_x,
269 paddle_info_y[j] + paddle_info_offsets[i],
270 BRICK_WIDTH, BRICK_HEIGHT,
271 stk_display, info_x, paddle_info_y[j] + paddle_info_offsets[i] );
272 stk_display_store_drect();
273 }
274 }
275 void frame_info_show()
276 {
277 char str[12];
278 int i, j;
279 if ( !config.bonus_info ) return;
280 display_font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
281 for ( i = 0; i < EX_NUMBER; i++ ) {
282 if ( info_offsets[i] > 0 && game->extra_active[i] ) {
283 /* picture */
284 stk_surface_fill(
285 stk_display, info_x, info_y + info_offsets[i],
286 BRICK_WIDTH, BRICK_HEIGHT, 0x0 );
287 stk_surface_alpha_blit( extra_pic, i * BRICK_WIDTH, 0,
288 BRICK_WIDTH, BRICK_HEIGHT,
289 stk_display, info_x, info_y + info_offsets[i], 128 );
290 /* remaining extra_time */
291 sprintf(str, "%i", (game->extra_time[i] / 1000) + 1);
292 /* write text */
293 stk_font_write( display_font, stk_display,
294 info_x + ( BRICK_WIDTH >> 1 ), info_y + info_offsets[i] + ( BRICK_HEIGHT >> 1 ),
295 -1, str );
296 }
297 }
298 for ( i = 0; i < EX_NUMBER; i++ )
299 for ( j = 0; j < game->paddle_count; j++ )
300 if ( paddle_info_offsets[i] > 0 && game->paddles[j]->extra_active[i] ) {
301 if ( i == EX_WALL && game->paddles[j]->extra_time[i] <= 0 ) continue;
302 /* picture */
303 stk_surface_fill(
304 stk_display, info_x, paddle_info_y[j] + paddle_info_offsets[i],
305 BRICK_WIDTH, BRICK_HEIGHT, 0x0 );
306 stk_surface_alpha_blit( extra_pic, i * BRICK_WIDTH, 0,
307 BRICK_WIDTH, BRICK_HEIGHT,
308 stk_display, info_x, paddle_info_y[j] + paddle_info_offsets[i], 128 );
309 /* remaining extra_time */
310 sprintf(str, "%i", (game->paddles[j]->extra_time[i] / 1000) + 1);
311 /* write text */
312 stk_font_write( display_font, stk_display,
313 info_x + ( BRICK_WIDTH >> 1 ),
314 paddle_info_y[j] + paddle_info_offsets[i] + ( BRICK_HEIGHT >> 1 ),
315 -1, str );
316 }
317 }
318
319 /*
320 ====================================================================
321 Blink the warp icon.
322 ====================================================================
323 */
324 void frame_warp_icon_hide()
325 {
326 if ( game->game_type != GT_LOCAL ) return;
327 if ( game->level_type != LT_NORMAL ) return;
328 if ( game->bricks_left > game->warp_limit ) return;
329 stk_surface_blit( offscreen, warp_x,warp_y,-1,-1,
330 stk_display, warp_x, warp_y );
331 stk_display_store_drect();
332 }
333 void frame_warp_icon_show()
334 {
335 if ( game->game_type != GT_LOCAL ) return;
336 if ( game->level_type != LT_NORMAL ) return;
337 if ( game->warp_limit == 0 ) return;
338 if ( game->bricks_left > game->warp_limit ) return;
339 if ( !warp_blink ) return;
340 if ( !game->extra_active[EX_DARKNESS] )
341 stk_surface_blit( warp_pic, 0,0,-1,-1,
342 stk_display, warp_x, warp_y );
343 else
344 stk_surface_alpha_blit( warp_pic, 0,0,-1,-1,
345 stk_display, warp_x, warp_y, 128 );
346 }
347 void frame_warp_icon_update( int ms )
348 {
349 //printf( "%i > %i\n", game->bricks_left, game->warp_limit );
350 if ( game->game_type != GT_LOCAL ) return;
351 if ( game->level_type != LT_NORMAL ) return;
352 if ( game->bricks_left > game->warp_limit ) return;
353 if ( warp_blinks == 0 ) {
354 warp_blink = 1;
355 return;
356 }
357 if ( delay_timed_out( &warp_delay, ms ) ) {
358 warp_blink = !warp_blink;
359 if ( warp_blink )
360 warp_blinks--;
361 }
362 }
0 /***************************************************************************
1 frame.h - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 This file handles all the graphical stuff concering the frame
20 including drawing of score, lifes and bonus info.
21 ====================================================================
22 */
23
24 /*
25 ====================================================================
26 Create frame by loading and assembling all graphics and loading
27 additional graphics.
28 ====================================================================
29 */
30 void frame_create();
31 /*
32 ====================================================================
33 Inititate the frame to the according game type.
34 Set the position of the extras displayed, enable life lamps etc.
35 ====================================================================
36 */
37 void frame_init();
38 /*
39 ====================================================================
40 Free all resources created by frame_create()
41 ====================================================================
42 */
43 void frame_delete();
44 /*
45 ====================================================================
46 Draw frame to offscreen.
47 ====================================================================
48 */
49 void frame_draw();
50 /*
51 ====================================================================
52 Add life lamps at left side of frame in offscreen
53 ====================================================================
54 */
55 void frame_draw_lives( int lives, int max_lives );
56 /*
57 ====================================================================
58 Add one new life at offscreen and screen (as this will happen in
59 game )
60 ====================================================================
61 */
62 void frame_add_life();
63 /*
64 ====================================================================
65 Switch of a life lamp
66 ====================================================================
67 */
68 void frame_remove_life();
69 /*
70 ====================================================================
71 Display extra information on right side of screen.
72 ====================================================================
73 */
74 void frame_info_hide();
75 void frame_info_show();
76
77 /*
78 ====================================================================
79 Blink the warp icon.
80 ====================================================================
81 */
82 void frame_warp_icon_hide();
83 void frame_warp_icon_show();
84 void frame_warp_icon_update( int ms );
0 /***************************************************************************
1 local_game.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/game.h"
19 #include "../gui/gui.h"
20 #include "client_data.h"
21 #include "event.h"
22 #include "config.h"
23 #include "shrapnells.h"
24 #include "player.h"
25 #include "display.h"
26 #include "paddle.h"
27 #include "chart.h"
28 #include "shine.h"
29 #include "credit.h"
30 #include "bricks.h"
31 #include "shots.h"
32 #include "frame.h"
33 #include "balls.h"
34 #include "extras.h"
35 #include "help.h"
36 #include "game.h"
37 #include "comm.h"
38 #include "slot.h"
39 #include "manager.h"
40
41 SDL_Surface *bkgnd = 0; /* current background picture */
42 extern SDL_Surface *nuke_bkgnd; /* nuke background */
43 SDL_Surface *offscreen = 0; /* buffer with frame, background and bricks */
44 extern StkFont *font; /* standard font */
45 extern Config config; /* lbreakout config struct */
46 extern int stk_quit_request; /* terminate game */
47 extern SDL_Surface *stk_display;
48 extern SDL_Surface *brick_pic;
49 extern int player_count;
50 extern Player players[MAX_PLAYERS]; /* player infos */
51 #ifdef AUDIO_ENABLED
52 extern StkSound *wav_click;
53 extern StkSound *wav_damn, *wav_dammit, *wav_wontgiveup, *wav_excellent, *wav_verygood;
54 #endif
55 extern int ball_pic_x_offset;
56 extern int paddle_cw;
57 extern List *client_users;
58 extern ClientUser *client_user;
59 extern GuiWidget *list_users;
60 extern char pause_chatter[CHAT_LINE_COUNT][CHAT_LINE_WIDTH];
61 extern GuiWidget *gui_key_widget;
62 extern GuiWidget *gui_clicked_widget;
63 extern GuiWidget *gui_focused_widget;
64 extern GuiWidget *dlg_pauseroom, *dlg_chatroom;
65
66 extern List *levelset_names;
67 Player *cur_player = 0; /* current player */
68 Paddle *l_paddle = 0; /* locally controlled paddle */
69 Paddle *r_paddle = 0; /* remotely controlled paddle */
70 LevelSet *game_set; /* set that is played */
71 Game *local_game = 0; /* in a local game the remote side is faked in this
72 game context to have just one main loop for both game
73 types */
74 Game *game = 0; /* local/network game context */
75 int game_round; /* id of current round in network game */
76 int game_stats[2][7]; /* network game stats */
77 int stats_received = 0;
78 int game_over = 0; /* network game is over */
79 int allow_disintegrate = 1; /* wether Plane of Inner Stability may be entered */
80 char best_name[32];
81 int best_score; /* result of first place in chart of local set */
82 int showing_best = 0; /* if true best score is shown, thus display should not be updated */
83 Display *display_score[2]; /* either score or frags */
84 Display *display_player[2]; /* player name and lifes or wins */
85 extern int client_state;
86 extern int warp_blinks, warp_blink;
87 extern SDL_Surface *paddle_pic, *weapon_pic, *ball_pic, *extra_pic, *shot_pic;
88 extern StkFont *display_font;
89 extern int bkgnd_count;
90 int bkgnd_ids[MAX_LEVELS]; /* random background ids changed everytime a game is started */
91 int client_comm_delay; /* delay between communications */
92 int no_comm_since; /* time passed this last comm */
93 extern char client_name[16]; /* our local username */
94 int freakout_seed = 0; /* last used seed for freakout game */
95
96 extern int current_player;
97 extern Item *item_resume_0;
98
99 extern void select_chart( char *name, int update );
100
101 /*
102 ====================================================================
103 Locals
104 ====================================================================
105 */
106
107
108 /* initiate the level of the game context by using the player's
109 * snapshot. the snapshot must've been previously set either by
110 * net update or locally. 'l_pos' is either PADDLE_BOTTOM or TOP
111 * indicating which paddle client controls in network game.
112 */
113 static int init_level( Player *player, int l_pos )
114 {
115 int length;
116 char str[32];
117
118 /* init level by replacing with the players snapshot. this will
119 * screw the total brick count thus stats are useless for local
120 * game but they are not used anyway as the remote/local game
121 * context contains the real stats */
122 if ( game->game_type == GT_LOCAL )
123 game_init( local_game, &player->snapshot );
124 game_init( game, &player->snapshot );
125
126 /* initiate frame for game type */
127 frame_init();
128
129 /* create offscreen */
130 offscreen = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
131 SDL_SetColorKey( offscreen, 0, 0 );
132
133 /* add&create background */
134 if ( game->game_type == GT_LOCAL )
135 bkgnd_draw( bkgnd, bkgnd_ids[player->level_id] );
136 else
137 bkgnd_draw( bkgnd, -1 );
138 /* add frame */
139 frame_draw();
140 /* add bricks */
141 bricks_draw();
142 /* draw lives */
143 if ( game->game_type == GT_LOCAL )
144 frame_draw_lives( player->lives, game->diff->max_lives );
145
146 /* determine what is the local and what is the remote paddle and
147 * connect the proper players with each paddle */
148 if ( game->game_type == GT_LOCAL ) {
149 l_paddle = game->paddles[PADDLE_BOTTOM];
150 l_paddle->player = player;
151 r_paddle = 0;
152 } else {
153 if ( l_pos == PADDLE_BOTTOM ) {
154 l_paddle = game->paddles[PADDLE_BOTTOM];
155 r_paddle = game->paddles[PADDLE_TOP];
156 } else {
157 l_paddle = game->paddles[PADDLE_TOP];
158 r_paddle = game->paddles[PADDLE_BOTTOM];
159 }
160 /* player 0 is always the local player */
161 l_paddle->player = &players[0];
162 r_paddle->player = &players[1];
163
164 /* let top paddle use alternative graphics if any */
165 if ( paddle_pic->w > 3*paddle_cw )
166 game->paddles[PADDLE_TOP]->pic_x_offset = 3*paddle_cw;
167 }
168 player->paddle_id = l_pos;
169
170 /* displays */
171 if ( game->game_type == GT_LOCAL ) {
172 /* we put these displays to the old positions
173 at the top of the frame */
174 sprintf( str, "%s", player->name );
175 length = strlen(best_name);
176 if (strlen(player->name)>length )
177 length = strlen(player->name);
178 length *= 8;
179 display_player[0] = displays_add( 402, 0,
180 length + 4, 16, str, player->lives, 0 );
181 display_score[0] = displays_add( stk_display->w - 52 - 76, 0,
182 76, 16, "", player->stats.total_score, 9 );
183 display_player[0]->use_alpha = 0;
184 display_score[0]->use_alpha = 0;
185 } else {
186 /* wins */
187 sprintf( str, "%s ~x%i",
188 game->paddles[0]->player->name,
189 game->paddles[0]->player->stats.wins );
190 length = strlen( str ) * 8;
191 display_player[0] = displays_add(
192 BRICK_WIDTH + 20, ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT + 2,
193 length + 4, 16, str, 0, 0 );
194 sprintf( str, "%s ~x%i",
195 game->paddles[1]->player->name,
196 game->paddles[1]->player->stats.wins );
197 length = strlen( str ) * 8;
198 display_player[1] = displays_add(
199 BRICK_WIDTH + 20, 2, length + 4, 16, str, 0, 0 );
200 /* scores */
201 display_score[0] = displays_add(
202 stk_display->w - BRICK_WIDTH - 20 - 76,
203 ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT + 2,
204 76, 16, "", game->paddles[0]->score, 9 );
205 display_score[1] = displays_add(
206 stk_display->w - BRICK_WIDTH - 20 - 76, 2,
207 76, 16, "", game->paddles[1]->score, 9 );
208 }
209
210 /* initiate credit */
211 if ( game->game_type == GT_LOCAL && game_set )
212 credit_init( player->snapshot.name, player->snapshot.author,
213 player->level_id, game_set->count );
214 else
215 credit_init( player->snapshot.name, player->snapshot.author,
216 player->level_id, 0/*don't display info*/ );
217
218 /* show offscreen */
219 stk_surface_blit( offscreen, 0,0,-1,-1, stk_display, 0,0 );
220
221 /* no refresh rect as we want to use dim effect */
222 return 1;
223 }
224
225 static void finalize_level( void )
226 {
227 /* set alpha keys to OPAQUE */
228 SDL_SetAlpha( paddle_pic, 0,0 );
229 SDL_SetAlpha( weapon_pic, 0,0 );
230 SDL_SetAlpha( extra_pic, 0,0 );
231 SDL_SetAlpha( ball_pic, 0,0 );
232 SDL_SetAlpha( shot_pic, 0,0 );
233 SDL_SetAlpha( display_font->surface, 0,0 );
234
235 /* reset ball graphic */
236 ball_pic_x_offset = 0;
237
238 /* reset shrapnells */
239 shrapnells_reset();
240 /* reset shine */
241 shine_reset();
242 /* reset explosions */
243 exps_clear();
244 exps_set_dark( 0 );
245
246 /* delete offscreen */
247 stk_surface_free( &offscreen );
248
249 /* clear credits */
250 credit_clear();
251
252 /* clear displays */
253 displays_clear();
254
255 /* clear game contexts */
256 if ( game->game_type == GT_LOCAL )
257 game_finalize( local_game );
258 game_finalize( game );
259 }
260
261 /* display formatted info + score table if multiple players */
262 static void display_score_table( char *format, ... )
263 {
264 va_list args;
265 int i;
266 char info[256], buf[32];
267
268 va_start( args, format );
269 vsnprintf( info, 64, format, args );
270 va_end( args );
271
272 if ( player_count > 1 ) {
273 strcat( info, "##" );
274 for ( i = 0; i < player_count; i++ ) {
275 /* add player and score */
276 sprintf( buf, "#%12s %10i", " ",
277 players[i].stats.total_score );
278 strcpy( buf + 1, players[i].name );
279 buf[strlen(players[i].name)+1] = 32;
280 strcat( info, buf );
281 }
282 }
283
284 display_text( font, info );
285 stk_display_update( STK_UPDATE_ALL );
286 }
287
288 /* begin frame by hiding all objects */
289 static void begin_frame( void )
290 {
291 int i;
292
293 displays_hide();
294 frame_info_hide();
295 extras_hide();
296 for ( i = 0; i < game->paddle_count; i++ ) {
297 paddle_hide( game->paddles[i] );
298 paddle_ammo_hide( game->paddles[i] );
299 }
300 balls_hide();
301 shots_hide();
302 shrapnells_hide();
303 walls_hide();
304 frame_warp_icon_hide();
305 shine_hide();
306 exps_hide();
307 credit_hide();
308 }
309
310 /* end frame by drawing all objects and updating the screen */
311 static void end_frame( void )
312 {
313 int i;
314
315 /* show -- some things will be missing if darkness is enabled */
316 balls_show_shadow();
317 extras_show_shadow();
318 for ( i = 0; i < game->paddle_count; i++ )
319 paddle_show_shadow( game->paddles[i] );
320 shots_show();
321 if ( config.debris_level == DEBRIS_BELOW_BALL ) {
322 exps_show();
323 if ( !game->extra_active[EX_DARKNESS] ) {
324 shrapnells_show();
325 frame_info_show();
326 }
327 }
328 if ( config.ball_level == BALL_ABOVE_BONUS )
329 extras_show();
330 balls_show();
331 if ( config.ball_level == BALL_BELOW_BONUS )
332 extras_show();
333 for ( i = 0; i < game->paddle_count; i++ )
334 paddle_show( game->paddles[i] );
335 if ( !game->extra_active[EX_DARKNESS] ) walls_show();
336 shine_show();
337 if ( config.debris_level == DEBRIS_ABOVE_BALL ) {
338 exps_show();
339 if ( !game->extra_active[EX_DARKNESS] ) {
340 shrapnells_show();
341 frame_info_show();
342 }
343 }
344 frame_warp_icon_show();
345 displays_show();
346 for ( i = 0; i < game->paddle_count; i++ )
347 paddle_ammo_show( game->paddles[i] );
348 credit_show();
349 }
350
351 /* grab/ungrab input of actual game */
352 static void grab_input( int grab )
353 {
354 if ( grab ) {
355 SDL_ShowCursor(0);
356 SDL_WM_GrabInput( SDL_GRAB_ON );
357 SDL_GetRelativeMouseState(0,0);
358 } else {
359 SDL_ShowCursor(1);
360 SDL_WM_GrabInput( SDL_GRAB_OFF );
361 }
362 }
363
364 /* switch client to new state */
365 void set_state( int newstate )
366 {
367 if ( client_state == newstate ) return;
368
369 if ( newstate == CS_PLAY )
370 grab_input( 1 );
371 if ( client_state == CS_PLAY )
372 grab_input( 0 );
373 if ( client_state == CS_CONFIRM_WARP ||
374 client_state == CS_CONFIRM_RESTART ||
375 client_state == CS_CONFIRM_QUIT ||
376 client_state == CS_CONFIRM_CONTINUE ||
377 client_state == CS_GET_READY ||
378 client_state == CS_PAUSE ||
379 client_state == CS_FINAL_PLAYER_INFO ||
380 client_state == CS_RECV_LEVEL ||
381 client_state == CS_ROUND_RESULT ||
382 client_state == CS_RECV_STATS ||
383 client_state == CS_FATAL_ERROR ) {
384 /* show offscreen */
385 if ( offscreen ) {
386 stk_surface_blit( offscreen, 0,0,-1,-1, stk_display, 0,0 );
387 end_frame();
388 }
389 /* do not refresh when coming from RECV_LEVEL as a GET_READY
390 * will follow */
391 if ( client_state != CS_RECV_LEVEL )
392 if ( client_state != CS_ROUND_RESULT )
393 if ( client_state != CS_RECV_STATS );
394 stk_display_update( STK_UPDATE_ALL );
395 }
396
397 client_state = newstate;
398 stk_timer_reset();
399 }
400
401 /* Fade all animations until they disappear */
402 static void fade_anims()
403 {
404 float alpha = 255.0;
405 int ms, i;
406 stk_timer_reset();
407 if ( game->game_type == GT_LOCAL && game->winner != PADDLE_BOTTOM )
408 frame_remove_life();
409 while ( alpha > 0 ) {
410 displays_hide();
411 for ( i = 0; i < game->paddle_count; i++ )
412 paddle_hide( game->paddles[i] );
413 balls_hide();
414 extras_hide();
415 shrapnells_hide();
416 shots_hide();
417 walls_hide();
418 credit_hide();
419 ms = stk_timer_get_time();
420 alpha -= 0.3 * ms;
421 if ( alpha < 0 ) alpha = 0;
422 shrapnells_update( ms );
423 for ( i = 0; i < game->paddle_count; i++ )
424 paddle_alphashow( game->paddles[i], alpha );
425 balls_alphashow( alpha );
426 extras_alphashow( alpha );
427 shots_alphashow( alpha );
428 shrapnells_show();
429 walls_alphashow( alpha );
430 displays_show();
431 credit_alphashow( alpha );
432 stk_display_update( STK_UPDATE_RECTS );
433 }
434 }
435
436 void open_pause_chat( char *text )
437 {
438 set_state( CS_PAUSE );
439
440 /* clear pause_chatter */
441 memset( pause_chatter, 0, sizeof( pause_chatter ) );
442 /* clear global gui widgets */
443 gui_focused_widget = 0;
444 gui_clicked_widget = 0;
445 gui_key_widget = 0;
446 /* use 'text' as initial chatter */
447 client_add_pausechatter( text, 1 );
448 /* gray screen */
449 stk_surface_gray( stk_display, 0,0,-1,-1, 1 );
450 /* show pauseroom */
451 gui_widget_show( dlg_pauseroom );
452 stk_display_update( STK_UPDATE_ALL );
453
454 /* disable event filter */
455 SDL_SetEventFilter( 0 );
456 /* disable client_recv which is called as time event */
457 gui_widget_disable_event( dlg_chatroom, GUI_TIME_PASSED );
458 }
459
460 void close_pause_chat( void )
461 {
462 gui_widget_hide( dlg_pauseroom );
463 set_state( CS_PLAY );
464
465 /* enable event filter */
466 SDL_SetEventFilter( event_filter );
467 gui_widget_enable_event( dlg_chatroom, GUI_TIME_PASSED );
468 }
469
470 /* Pause/unpause a local/network game. */
471 static void client_set_pause( int pause )
472 {
473 if (game_set==0) return; /* test level */
474 if (pause&&client_state==CS_PLAY)
475 {
476 /* in local game simply darken the screen, in
477 * network game enter the pausechatroom */
478 if ( game->game_type == GT_LOCAL ) {
479 set_state(CS_PAUSE);
480 display_text( font, "Pause" );
481 }
482 else {
483 open_pause_chat( "You have paused the game." );
484 comm_send_short( MSG_PAUSE );
485 }
486 }
487 else if (!pause&&client_state==CS_PAUSE)
488 {
489 /* unpause (local game only)*/
490 if ( game->game_type == GT_LOCAL )
491 set_state(CS_PLAY);
492 }
493 }
494
495 /* modify the client and its state according to the key pressed */
496 static int handle_default_key( int key, int *abort )
497 {
498 SDL_Surface *buffer;
499
500 switch ( key ) {
501 case SDLK_F1:
502 case SDLK_h:
503 if ( client_state != CS_PLAY ) break;
504 if ( game->game_type == GT_NETWORK ) break; /* only for single player */
505 grab_input(0);
506 help_run();
507 grab_input(1);
508 return 1;
509 case SDLK_q:
510 case SDLK_ESCAPE:
511 /* recv_stats or final_stats means we already broke up
512 * the game so ESC will directly quit */
513 if ( client_state == CS_RECV_STATS || client_state == CS_FINAL_STATS ) {
514 *abort = 1;
515 break;
516 }
517
518 if ( client_state == CS_CONFIRM_QUIT ) break;
519 if ( client_state == CS_PAUSE ) break;
520 if ( players_count() == 0 ) break;
521 set_state(CS_CONFIRM_QUIT);
522 if ( game->game_type == GT_LOCAL && game_set != 0 /*not testing a level*/ )
523 display_text( font, "Quit Game? y/n#(If yes, this game may be resumed later.#No highscore entry is created yet.)" );
524 else
525 display_text( font, "Quit Game? y/n" );
526 return 1;
527 case SDLK_r:
528 if ( client_state != CS_PLAY ) break;
529 if ( game->game_type == GT_NETWORK ) break; /* only for single player */
530 if ( game_set == 0 ) break; /* test level */
531 if ( cur_player->lives < 2 ) break;
532 set_state(CS_CONFIRM_RESTART);
533 display_text( font, "Restart Level? y/n" );
534 return 1;
535 case SDLK_d:
536 if ( client_state != CS_PLAY ) break;
537 if ( game->game_type == GT_NETWORK ) break; /* only for single player */
538 if ( !allow_disintegrate ) break;
539 grab_input(0);
540 game_nuke();
541 grab_input(1);
542 return 1;
543 case SDLK_f:
544 buffer = stk_surface_create( SDL_SWSURFACE, 640, 480 );
545 SDL_BlitSurface( stk_display, 0, buffer, 0 );
546 config.fullscreen = !config.fullscreen;
547 stk_display_apply_fullscreen( config.fullscreen );
548 SDL_BlitSurface( buffer, 0, stk_display, 0 );
549 stk_display_update( STK_UPDATE_ALL);
550 SDL_FreeSurface( buffer );
551 return 1;
552 case SDLK_s:
553 #ifdef AUDIO_ENABLED
554 config.sound = !config.sound;
555 stk_audio_enable_sound( config.sound );
556 #endif
557 return 1;
558 case SDLK_a:
559 config.anim++;
560 if ( config.anim >= 4 ) config.anim = 0;
561 return 1;
562 case SDLK_TAB:
563 stk_display_take_screenshot();
564 return 1;
565 case SDLK_t:
566 return 0;
567 case SDLK_p:
568 if ( client_state == CS_PLAY )
569 client_set_pause(1);
570 else if (client_state==CS_PAUSE)
571 client_set_pause(0);
572 return 1;
573 default:
574 if ( client_state != CS_PLAY ) break;
575 if ( game->game_type != GT_LOCAL ) break;
576 if ( game->bricks_left > game->warp_limit ) break;
577 if ( game_set == 0 ) break; /* test level */
578 if ( key == config.k_warp ) {
579 set_state(CS_CONFIRM_WARP);
580 display_text( font, "Warp to next level? y/n" );
581 return 1;
582 }
583 break;
584 }
585
586 return 0;
587 }
588
589 /* update local objects (shrapnells,extras,explosions...) and communicate
590 * every client_comm_delay seconds either with real or fake server */
591 static void update_game( int ms )
592 {
593 int i;
594
595 /* run the fake server game */
596 if ( game->game_type == GT_LOCAL ) {
597 game_set_current( local_game );
598 game_update( ms );
599 game_set_current( game );
600 }
601
602 /* local animations and movements */
603 for ( i = 0; i < game->paddle_count; i++ )
604 client_paddle_update( game->paddles[i], ms );
605 client_shots_update( ms );
606 client_balls_update( ms );
607 client_extras_update( ms );
608 client_walls_update( ms );
609 shrapnells_update( ms );
610 frame_warp_icon_update( ms );
611 shine_update( ms );
612 exps_update( ms );
613 displays_update( ms );
614 credit_update( ms );
615
616 /* communicate */
617 if ( (no_comm_since+=ms) >= client_comm_delay ) {
618 no_comm_since -= client_comm_delay;
619
620 /* send paddle state */
621 comm_send_paddle( l_paddle );
622
623 /* receive game data from local or remote server and
624 * apply it to the game context. */
625 comm_recv();
626
627 /* update score displays */
628 if (!showing_best)
629 display_set_value(
630 display_score[0],
631 game->paddles[0]->player->stats.total_score +
632 game->paddles[0]->score );
633 if ( game->game_type == GT_NETWORK )
634 display_set_value(
635 display_score[1],
636 game->paddles[1]->player->stats.total_score +
637 game->paddles[1]->score );
638 }
639 }
640
641 /* give us a damn or excellent depending on the outcome of the level.
642 * the result for network game must've been received already so that
643 * game::level_over and game::winner are valid entries. */
644 static void play_speech( void )
645 {
646 #ifdef AUDIO_ENABLED
647 if ( !config.speech ) return;
648 if ( game->winner == -1 ) return; /* draw */
649
650 if ( game->paddles[game->winner] == l_paddle ) {
651 if ( rand() % 2 )
652 stk_sound_play( wav_excellent );
653 else
654 stk_sound_play( wav_verygood );
655 } else {
656 if ( !game->diff->allow_maluses ) return; /* bad speech is bad somehow */
657
658 if ( rand() % 2 )
659 stk_sound_play( wav_damn );
660 else
661 stk_sound_play( wav_dammit );
662 }
663 #endif
664 }
665
666 /* check players of local game wether they entered a highscore */
667 static void check_highscores( void )
668 {
669 int i;
670
671 chart_clear_new_entries();
672 for ( i = 0; i < config.player_count; i++ )
673 chart_add(
674 chart_set_query(game_set->name),
675 players[i].name,
676 players[i].level_id + 1,
677 players[i].stats.total_score );
678 chart_save();
679 }
680
681 /* init next network game round by displaying a message and switching
682 * to GET_READY. */
683 void init_next_round( void )
684 {
685 game_round++;
686 set_state( CS_GET_READY );
687 init_level( cur_player, cur_player->paddle_id );
688 display_text( font,
689 "***** Round %i *****###You control the %s paddle in this level!#"
690 "To fire a ball keep the mouse button PRESSED.#Don't just click.###"
691 "Press any key when you are ready...###(You can pause the game with 'p' any time.)"
692 "###NOTE: Due to latency, bonuses on the server are closer than they "
693 "appear! I'll try to work on that.",
694 game_round, cur_player->paddle_id==0?"BOTTOM":"TOP" );
695 }
696
697 /* display a message about the winner */
698 void finalize_round( void )
699 {
700 if ( (char)game->winner == -1 )
701 display_text( font, "DRAW" );
702 else {
703 game->paddles[game->winner]->player->stats.wins++;
704 if ( game->winner == cur_player->paddle_id )
705 display_text( font, "You have won this round!" );
706 else
707 display_text( font, "You have lost this round." );
708 }
709 finalize_level();
710 set_state( CS_ROUND_RESULT );
711 }
712
713 /* display the final statistics. the first player is always this client
714 * and the second is the remote. */
715 void display_final_stats( void )
716 {
717 int win;
718
719 /* won this match? */
720 if ( game_stats[0][0] > game_stats[1][0] )
721 win = 1;
722 else
723 if ( game_stats[0][0] == game_stats[1][0] )
724 win = -1;
725 else
726 win = 0;
727
728 /* build stats string */
729 display_text( font,
730 " Result: %s ##" \
731 " %12s %12s##" \
732 "Wins: %12i %12i#" \
733 "Losses: %12i %12i#" \
734 "Draws: %12i %12i#" \
735 "#" \
736 "Total Score: %12i %12i#" \
737 "#" \
738 "Balls Kept: %11i%% %11i%%#" \
739 "Bricks Cleared: %11i%% %11i%%#" \
740 "Extras Collected: %11i%% %11i%%##" \
741 "(Press SPACE to continue)",
742 win==1?"VICTORY":win==0?" DEFEAT":" DRAW",
743 players[0].name, players[1].name,
744 game_stats[0][0], game_stats[1][0],
745 game_stats[0][1], game_stats[1][1],
746 game_stats[0][2], game_stats[1][2],
747 game_stats[0][3], game_stats[1][3],
748 game_stats[0][4], game_stats[1][4],
749 game_stats[0][5], game_stats[1][5],
750 game_stats[0][6], game_stats[1][6] );
751 }
752
753 /* save data from local and local_game variables and update
754 * the menu hint. */
755 void save_local_game( int slot_id )
756 {
757 GameSlot gs;
758 int i;
759
760 memset( &gs, 0, sizeof(GameSlot) );
761 strcpy( gs.setname, game_set->name );
762 gs.diff = config.diff;
763 gs.player_count = config.player_count;
764 gs.cur_player = current_player;
765 for ( i = 0; i < MAX_PLAYERS; i++ )
766 {
767 strcpy( gs.player_names[i], config.player_names[i] );
768 gs.player_cur_level_id[i] = players[i].level_id;
769 gs.player_lives[i] = players[i].lives;
770 gs.player_scores[i] = players[i].stats.total_score;
771 }
772 gs.freakout_seed = freakout_seed;
773 if ( !slot_save( slot_id, &gs ) )
774 fprintf( stderr, "ERROR: couldn't save game!\n" );
775 slot_update_hint( slot_id, item_resume_0->hint );
776 }
777
778 /* check whether Shift is pressed to switch between own and highest score */
779 void handle_display_switch()
780 {
781 int modstate = 0;
782 modstate = SDL_GetModState();
783 if (!showing_best)
784 {
785 if (modstate&KMOD_RSHIFT||modstate&KMOD_LSHIFT)
786 {
787 display_set_text( display_player[0], best_name );
788 display_set_value_directly( display_score[0], best_score );
789 display_set_highlight( display_player[0], 1 );
790 display_set_highlight( display_score[0], 1 );
791 showing_best = 1;
792 }
793 }
794 else
795 {
796 if (!(modstate&KMOD_RSHIFT||modstate&KMOD_LSHIFT))
797 {
798 display_set_text( display_player[0], cur_player->name );
799 display_set_value_directly( display_score[0],
800 game->paddles[0]->player->stats.total_score +
801 game->paddles[0]->score );
802 display_set_highlight( display_player[0], 0 );
803 display_set_highlight( display_score[0], 0 );
804 showing_best = 0;
805 }
806 }
807 }
808
809 /*
810 ====================================================================
811 Publics
812 ====================================================================
813 */
814
815 /* create various resources like shrapnells */
816 void client_game_create()
817 {
818 frame_create();
819 shrapnells_init();
820 shine_load();
821 init_angles();
822
823 /* background */
824 bkgnd = stk_surface_create( SDL_SWSURFACE,
825 stk_display->w, stk_display->h );
826 SDL_SetColorKey( bkgnd, 0, 0 );
827 stk_surface_fill( bkgnd, 0,0,-1,-1, 0x0 );
828
829 }
830 void client_game_delete()
831 {
832 stk_surface_free( &bkgnd );
833
834 displays_clear();
835 frame_delete();
836 shrapnells_delete();
837 shine_delete();
838 }
839
840 /* create network/local game context and initiate game state:
841 * network needs to receive the level data and a local game
842 * has to load the next level */
843 int client_game_init_local( char *setname )
844 {
845 Set_Chart *chart;
846 int i, warp_limit;
847
848 warp_limit = config.rel_warp_limit;
849 allow_disintegrate = 1;
850
851 /* the original levelsets do not need these workarounds */
852 if ( STRCMP( setname, "LBreakout2" ) || STRCMP( setname, "LBreakout1" ) ) {
853 warp_limit = 100;
854 allow_disintegrate = 0;
855 }
856
857 /* the approach for a local game is to use the same
858 * settings as a network game. the receiving of packets
859 * is simply faked by a local_game context that
860 * runs the game locally. but to use only one game loop
861 * we do not use it directly but apply its modificiations
862 * to game which is visualized */
863 local_game = game_create( GT_LOCAL, config.diff, warp_limit );
864 game_set_current( local_game );
865 game_set_convex_paddle( config.convex );
866 game_set_ball_auto_return( !config.return_on_click );
867 game_set_ball_random_angle( config.random_angle );
868 game_set_ball_accelerated_speed( config.maxballspeed_float );
869
870 /* load levels:
871 * only required for local games. in network both players
872 * just require a single level that can store the incoming
873 * data that is send by the server via the net.
874 */
875 if ( !strcmp( setname, TOURNAMENT ) )
876 game_set = levelset_load_all( levelset_names, freakout_seed );
877 else
878 game_set = levelset_load( setname );
879 if ( game_set == 0 ) return 0;
880
881 /* load highest score so far if any */
882 chart = chart_set_query(setname);
883 strcpy(best_name,"nobody"); best_score = 0;
884 if (chart)
885 {
886 strcpy(best_name,chart->entries[0].name);
887 best_score = chart->entries[0].score;
888 }
889
890 /* create client game context */
891 game = game_create( GT_LOCAL, config.diff, warp_limit );
892 game_set_current( game );
893
894 /* a local game is not limited in its communication */
895 client_comm_delay = 0;
896 no_comm_since = 0;
897
898 /* prepare warp icon at frame */
899 warp_blinks = 4; warp_blink = 1;
900
901 /* set list of level background ids */
902 for ( i = 0; i < MAX_LEVELS; i++ )
903 bkgnd_ids[i] = rand() % bkgnd_count;
904
905 /* initiate players */
906 players_clear();
907 for ( i = 0; i < config.player_count; i++ )
908 player_add( config.player_names[i],
909 game->diff->lives,
910 levelset_get_first( game_set ) );
911 cur_player = players_get_first();
912
913 /* init first level */
914 init_level( cur_player, PADDLE_BOTTOM );
915
916 /* if only one player don't show score table */
917 client_state = CS_NONE;
918 if ( player_count > 1 )
919 set_state( CS_SCORE_TABLE );
920 else
921 set_state( CS_PLAY ); /* one player starts immediately */
922 return 1;
923 }
924 int client_game_init_network( char *opponent_name, int diff )
925 {
926 /* create an empty one level levelset. the server will send
927 * the data into the level everytime we play. */
928 game_set = levelset_create_empty( 1, "empty", "empty" );
929
930 /* create client game context */
931 game = game_create( GT_NETWORK, diff, 100 );
932 game_set_current( game );
933 game_round = 0; /* will be increased by init_next_round() */
934 game_over = 0;
935
936 /* a network game communicates every 25 ms by default */
937 client_comm_delay = 25;
938 no_comm_since = 0;
939
940 /* initiate players */
941 players_clear();
942 player_add( client_name, game->diff->lives, levelset_get_first( game_set ) );
943 player_add( opponent_name, game->diff->lives, levelset_get_first( game_set ) );
944 cur_player = players_get_first();
945
946 display_text( font, "Receiving level data..." );
947 set_state( CS_RECV_LEVEL );
948 return 1;
949 }
950
951 /* create local game context and initiate game state
952 * as given from slot 'slot_id'. */
953 int client_game_resume_local( int slot_id )
954 {
955 int i;
956 GameSlot gs;
957
958 /* load saved game */
959 if ( !slot_load( slot_id, &gs ) ) return 0;
960
961 /* FIXME: config settings are overwritten for this */
962 config.diff = gs.diff;
963 config.player_count = gs.player_count;
964 for ( i = 0; i < config.player_count; i++ )
965 strcpy( config.player_names[i], gs.player_names[i] );
966 freakout_seed = gs.freakout_seed;
967
968 /* create local game where all players have full lives */
969 if ( !client_game_init_local( gs.setname ) ) return 0;
970
971 /* re-initiate players */
972 players_clear();
973 for ( i = 0; i < config.player_count; i++ )
974 {
975 /* name + lives */
976 player_add( config.player_names[i],
977 gs.player_lives[i],
978 levelset_get_first( game_set ) );
979 /* level */
980 player_init_level( &players[i],
981 game_set->levels[gs.player_cur_level_id[i]],
982 gs.player_cur_level_id[i] );
983 /* score */
984 players[i].stats.total_score = gs.player_scores[i];
985 }
986 cur_player = players_set_current( gs.cur_player );
987
988 /* init first level */
989 init_level( cur_player, PADDLE_BOTTOM );
990
991 return 1;
992 }
993
994 /* create a one level game context for testing a level */
995 int client_game_init_testing( Level *level )
996 {
997 local_game = game_create( GT_LOCAL, config.diff, 100 );
998 game_set_current( local_game );
999 game_set_convex_paddle( config.convex );
1000 game_set_ball_auto_return( !config.return_on_click );
1001 game_set_ball_random_angle( config.random_angle );
1002 game_set_ball_accelerated_speed( config.maxballspeed_float );
1003
1004 game = game_create( GT_LOCAL, config.diff, 100 );
1005 game_set_current( game );
1006
1007 players_clear();
1008 player_add( config.player_names[0], game->diff->lives, level );
1009 cur_player = players_get_first();
1010
1011 bkgnd_ids[0] = 0;
1012
1013 init_level( cur_player, PADDLE_BOTTOM );
1014
1015 client_state = CS_NONE;
1016 set_state( CS_PLAY );
1017
1018 return 1;
1019 }
1020
1021 /* finalize a game and free anything allocated by init process */
1022 void client_game_finalize()
1023 {
1024 players_clear();
1025
1026 if ( game && game->game_type == GT_LOCAL ) {
1027 game_delete( &local_game );
1028 levelset_delete( &game_set );
1029 }
1030 game_delete( &game );
1031 }
1032
1033 /* run the state driven loop until game is broken up or finished */
1034 void client_game_run( void )
1035 {
1036 int ms, frame_delay = config.fps?10:1;
1037 int button_clicked, key_pressed;
1038 SDL_Event event;
1039 int abort = 0, i, j, penalty;
1040 /* frame rate */
1041 int frames = 0;
1042 int frame_time = SDL_GetTicks();
1043
1044 event_clear_sdl_queue();
1045
1046 stk_display_fade( STK_FADE_IN, STK_FADE_DEFAULT_TIME );
1047
1048 stats_received = 0;
1049 stk_timer_reset(); ms = 1;
1050 while ( !abort && !stk_quit_request ) {
1051 /* check wether an event occured */
1052 button_clicked = key_pressed = 0;
1053 if ( SDL_PollEvent( &event ) ) {
1054 if ( client_state == CS_PAUSE && game->game_type == GT_NETWORK )
1055 gui_dispatch_event( &event, ms );
1056 else
1057 if ( event.type == SDL_MOUSEBUTTONDOWN )
1058 button_clicked = event.button.button;
1059 else
1060 if ( event.type == SDL_KEYDOWN ) {
1061 key_pressed = event.key.keysym.sym;
1062 if ( handle_default_key( key_pressed, &abort ) )
1063 key_pressed = 0;
1064 }
1065 else
1066 if (event.type == SDL_ACTIVEEVENT)
1067 {
1068 if (event.active.state == SDL_APPINPUTFOCUS ||
1069 event.active.state == SDL_APPACTIVE )
1070 if (event.active.gain == 0 )
1071 client_set_pause(1);
1072 }
1073 }
1074 else if ( client_state == CS_PAUSE && game->game_type == GT_NETWORK )
1075 gui_dispatch_event( 0, ms );
1076
1077 /* check whether Shift is pressed to switch between own and highest score */
1078 if (game->game_type == GT_LOCAL)
1079 handle_display_switch();
1080
1081 /* let server know we're still alive except
1082 * in CS_PLAY as we send paddle updates there */
1083 if ( game->game_type == GT_NETWORK )
1084 comm_send_heartbeat();
1085
1086 /* handle client */
1087 switch ( client_state ) {
1088
1089 case CS_FINAL_STATS:
1090 if ( key_pressed==SDLK_SPACE ) abort = 1;
1091 break;
1092
1093 case CS_FATAL_ERROR:
1094 /* after game was violently broken up the server
1095 * may still send the stats of the game so far */
1096 if ( button_clicked || key_pressed ) {
1097 SDL_Delay(250); /* give time to release button */
1098 set_state( CS_RECV_STATS );
1099 display_text( font, "Receiving final stats..." );
1100 }
1101 break;
1102
1103 case CS_FINAL_TABLE:
1104 if ( button_clicked || key_pressed ) {
1105 check_highscores();
1106 select_chart( game_set->name, 0 );
1107 /* remove saved game */
1108 slot_delete( 0 );
1109 slot_update_hint( 0, item_resume_0->hint );
1110 /* quit local game */
1111 abort = 1;
1112 }
1113 break;
1114
1115 case CS_SCORE_TABLE:
1116 /* show who's next player and scores in local game */
1117 display_score_table( "Next Player: %s", cur_player->name );
1118 set_state( CS_GET_READY );
1119 break;
1120
1121 case CS_FINAL_PLAYER_INFO:
1122 if ( button_clicked || key_pressed ) {
1123 SDL_Delay(250); /* give time to release button */
1124 set_state( CS_NEXT_PLAYER );
1125 }
1126 break;
1127
1128 case CS_RECV_LEVEL:
1129 comm_recv();
1130 if ( cur_player->next_level_received ) {
1131 cur_player->next_level_received = 0;
1132 cur_player->paddle_id = cur_player->next_paddle_id;
1133 init_next_round();
1134 }
1135 break;
1136
1137 case CS_RECV_STATS:
1138 comm_recv();
1139 if ( stats_received ) {
1140 set_state( CS_FINAL_STATS );
1141 display_final_stats();
1142 }
1143 break;
1144
1145 case CS_ROUND_RESULT:
1146 if ( button_clicked || key_pressed ) {
1147 SDL_Delay(250); /* give time to release button */
1148 if ( game_over ) {
1149 set_state( CS_RECV_STATS );
1150 display_text( font, "Receiving final stats..." );
1151 } else {
1152 set_state( CS_RECV_LEVEL );
1153 display_text( font, "Receiving level data..." );
1154 }
1155 }
1156 break;
1157
1158 case CS_GET_READY:
1159 if ( button_clicked || key_pressed ) {
1160 SDL_Delay(250); /* give time to release button */
1161 comm_send_short( MSG_READY );
1162 set_state( CS_PLAY );
1163 }
1164 break;
1165
1166 case CS_PAUSE:
1167 if ( game->game_type == GT_LOCAL ) break;
1168
1169 /* check wether pause chatroom has been closed
1170 * either by client or remote */
1171 comm_recv();
1172 break;
1173
1174 case CS_PLAY:
1175 /* hide objects */
1176 begin_frame();
1177
1178 /* apply events to local paddle */
1179 paddle_handle_events( l_paddle, ms );
1180
1181 /* update local objects and communicate if
1182 * comm_delay ms have passed */
1183 update_game( ms );
1184
1185 /* show objects */
1186 end_frame();
1187
1188 /* handle local level over */
1189 if ( game->level_over ) {
1190 if ( game->game_type == GT_LOCAL ) {
1191 if ( game_set == 0 ) {
1192 abort = 1; /* was a test level */
1193 grab_input(0);
1194 break;
1195 }
1196 if ( game->winner == PADDLE_BOTTOM )
1197 set_state( CS_NEXT_LEVEL );
1198 else
1199 set_state( CS_LOOSE_LIFE );
1200 } else {
1201 finalize_round();
1202 }
1203 }
1204 break;
1205
1206 case CS_NEXT_LEVEL:
1207 /* apply paddle stats to player */
1208 game_set_current( local_game );
1209 game_update_stats( PADDLE_BOTTOM, &cur_player->stats );
1210 game_set_current( game );
1211 /* init next level for player in local game */
1212 cur_player->level_id++;
1213 if ( cur_player->level_id >= game_set->count ) {
1214 /* deactivate player */
1215 cur_player->lives = 0;
1216 display_text( font,
1217 "You've cleared all levels...#Congratulations!!!" );
1218 set_state( CS_FINAL_PLAYER_INFO );
1219 break;
1220 }
1221 /* get snapshot for next init */
1222 cur_player->snapshot = *game_set->levels[cur_player->level_id];
1223 /* cycle players */
1224 set_state( CS_NEXT_PLAYER );
1225 break;
1226
1227 case CS_RESTART_LEVEL:
1228 /* apply paddle stats to player */
1229 game_set_current( local_game );
1230 game_update_stats( PADDLE_BOTTOM, &cur_player->stats );
1231 game_set_current( game );
1232 /* reset level for next turn */
1233 cur_player->snapshot = *game_set->levels[cur_player->level_id];
1234 /* decrease lives (is checked that this wasn't the last one) */
1235 cur_player->lives--;
1236 /* cycle players */
1237 set_state( CS_NEXT_PLAYER );
1238 break;
1239
1240 case CS_LOOSE_LIFE:
1241 /* apply paddle stats to player */
1242 game_set_current( local_game );
1243 game_update_stats( PADDLE_BOTTOM, &cur_player->stats );
1244 game_set_current( game );
1245
1246 /* remember level for next turn */
1247 game_get_level_snapshot( &cur_player->snapshot );
1248
1249 /* decrease lives */
1250 cur_player->lives--;
1251 if ( cur_player->lives == 0 ) {
1252 display_text( font,
1253 "You've lost all lives...#Do you want to buy a continue#for 100%% of your score? y/n" );
1254 set_state( CS_CONFIRM_CONTINUE );
1255 //set_state( CS_FINAL_PLAYER_INFO );
1256 break;
1257 }
1258 set_state( CS_NEXT_PLAYER );
1259 break;
1260
1261 case CS_NEXT_PLAYER:
1262 /* game over? */
1263 if ( players_count() == 0 ) {
1264 display_score_table( "Game Over!" );
1265 set_state( CS_FINAL_TABLE );
1266 break;
1267 }
1268 /* speak and fade */
1269 play_speech();
1270 fade_anims();
1271 /* finalize current game context */
1272 finalize_level();
1273 /* set next player */
1274 cur_player = players_get_next();
1275 init_level( cur_player, PADDLE_BOTTOM );
1276 if ( player_count > 1 )
1277 set_state( CS_SCORE_TABLE );
1278 else {
1279 set_state( CS_PLAY ); /* one player starts immediately */
1280 stk_display_update( STK_UPDATE_ALL );
1281 }
1282 break;
1283
1284 case CS_CONFIRM_CONTINUE:
1285 case CS_CONFIRM_QUIT:
1286 case CS_CONFIRM_WARP:
1287 case CS_CONFIRM_RESTART:
1288 if ( key_pressed == 0 ) break;
1289 if ( key_pressed==SDLK_n||key_pressed==SDLK_ESCAPE ) {
1290 /* if denying continue... DIE!!! */
1291 if ( client_state == CS_CONFIRM_CONTINUE )
1292 {
1293 SDL_Delay(250); /* give time to release button */
1294 set_state( CS_NEXT_PLAYER );
1295 //set_state( CS_FINAL_PLAYER_INFO );
1296 }
1297 else
1298 set_state( CS_PLAY );
1299 break;
1300 }
1301 if ( key_pressed != SDLK_y && key_pressed != SDLK_z ) break;
1302 /* handle confirmed action */
1303 SDL_Delay(250); /* give time to release button */
1304 switch( client_state ) {
1305 case CS_CONFIRM_CONTINUE:
1306 /* clear score and give full lives again */
1307 cur_player->lives = game->diff->lives;
1308 cur_player->stats.total_score = 0;
1309 set_state( CS_NEXT_PLAYER );
1310 break;
1311 case CS_CONFIRM_QUIT:
1312 comm_send_short( MSG_QUIT_GAME );
1313 if ( game->game_type == GT_LOCAL ) {
1314 /* apply paddle stats to player */
1315 game_set_current( local_game );
1316 game_update_stats( PADDLE_BOTTOM, &cur_player->stats );
1317 game_set_current( game );
1318 /* no higscore check anymore as game is supposed to
1319 * be resumed until normal game over */
1320 /* testing levels don't got for
1321 * high scores ***
1322 if ( game_set ) {
1323 check_highscores();
1324 select_chart( game_set->name, 0 );
1325 }*/
1326 /* save local game */
1327 if ( game_set != 0 /*not testing a level*/ )
1328 save_local_game( 0 );
1329
1330 abort = 1;
1331 }
1332 else {
1333 /* await game stats */
1334 set_state( CS_RECV_STATS );
1335 display_text( font, "Receiving final stats..." );
1336 }
1337 break;
1338 case CS_CONFIRM_WARP:
1339 game->winner = -1; /* no speech */
1340 local_game->winner = -1; /* not counted as win */
1341 /* substract doubled score of remaining bricks */
1342 penalty = 0;
1343 for ( i = 0; i < MAP_WIDTH; i++ )
1344 for ( j = 0; j < MAP_HEIGHT; j++ )
1345 if ( local_game->bricks[i][j].dur != -1 )
1346 penalty += local_game->bricks[i][j].score;
1347 printf( "warp penalty: -%d\n", penalty );
1348 local_game->paddles[0]->score -= penalty;
1349 set_state( CS_NEXT_LEVEL );
1350 break;
1351 case CS_CONFIRM_RESTART:
1352 game->winner = -1; /* no speech */
1353 local_game->winner = -1; /* not counted as win */
1354 local_game->level_over = 1;
1355 set_state( CS_RESTART_LEVEL );
1356 break;
1357 }
1358 break;
1359
1360 }
1361
1362 /* update anything that was changed */
1363 stk_display_update( STK_UPDATE_RECTS );
1364
1365 /* get time since last call and delay if below frame_delay */
1366 ms = stk_timer_get_time();
1367 if ( ms < frame_delay ) {
1368 SDL_Delay( frame_delay - ms );
1369 ms += stk_timer_get_time();
1370 }
1371 frames++;
1372 }
1373 finalize_level();
1374 client_state = CLIENT_NONE;
1375
1376 stk_display_fade( STK_FADE_OUT, STK_FADE_DEFAULT_TIME );
1377 if ( stk_quit_request )
1378 comm_send_short( MSG_DISCONNECT );
1379 else
1380 comm_send_short( MSG_UNHIDE );
1381
1382 /* frame rate */
1383 frame_time = SDL_GetTicks() - frame_time;
1384 printf( "Time: %.2f, Frames: %i -> FPS: %.2f\n",
1385 (double)frame_time / 1000, frames, 1000.0*frames/frame_time );
1386
1387 event_clear_sdl_queue();
1388
1389 /* update the selected user and the user list in network as
1390 * we received ADD/REMOVE_USER messages */
1391 gui_list_update( list_users, client_users->count );
1392 /* re-select current entry */
1393 if ( client_user ) {
1394 i = list_check( client_users, client_user );
1395 if ( i != -1 )
1396 gui_list_select( list_users, 0, i, 1 );
1397 }
1398 }
1399
1400 /* test a level until all balls got lost */
1401 void client_game_test_level( Level *level )
1402 {
1403 stk_display_fade( STK_FADE_IN, STK_FADE_DEFAULT_TIME );
1404 client_game_init_testing( level );
1405 client_game_run();
1406 client_game_finalize();
1407 stk_display_fade( STK_FADE_OUT, STK_FADE_DEFAULT_TIME );
1408 }
1409
1410
0 /***************************************************************************
1 local_game.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /* in game client states */
18 enum {
19 CS_NONE = 0,
20 CS_RECV_LEVEL, /* wait for level data from server */
21 CS_SCORE_TABLE, /* score table in local game */
22 CS_FINAL_TABLE, /* final score table in local game */
23 CS_FINAL_PLAYER_INFO, /* info that player cleared all levels */
24 CS_RECV_STATS, /* wait for server to send stats */
25 CS_FINAL_STATS, /* looking at final network player stats */
26 CS_GET_READY, /* await click from user */
27 CS_PLAY, /* render frame */
28 CS_NEXT_PLAYER, /* cycle to next player in local game */
29 CS_NEXT_LEVEL, /* init next level for player in local game */
30 CS_RESTART_LEVEL, /* player begins at reset level next time */
31 CS_LOOSE_LIFE, /* take a snapshot and decrease lives */
32 CS_ROUND_RESULT,/* await click and start level receive after it */
33 CS_GAME_OVER, /* all levels are played */
34 CS_CONFIRM_WARP,
35 CS_CONFIRM_QUIT,
36 CS_CONFIRM_RESTART,
37 CS_CONFIRM_CONTINUE,
38 CS_FATAL_ERROR, /* display error and quit game after it */
39 CS_PAUSE
40 };
41
42 /* create various resources like shrapnells */
43 void client_game_create();
44 void client_game_delete();
45
46 /* create network/local game context and initiate game state:
47 * network needs to receive the level data and a local game
48 * has to load the next level */
49 int client_game_init_local( char *setname );
50 int client_game_init_network( char *opponent_name, int diff );
51
52 /* create local game context and initiate game state
53 * as given from slot 'slot_id'. */
54 int client_game_resume_local( int slot_id );
55
56 /* finalize a game and free anything allocated by init process */
57 void client_game_finalize();
58
59 /* run the state driven loop until game is broken up or finished */
60 void client_game_run( void );
61
62 /* test a level until all balls got lost */
63 void client_game_test_level( Level *level );
64
0 absolute B v0.8
1 by Jurgen De Backer
2 annejurgen@pandora.be
3
4 New version of the theme, well, it has changed a lot since the previous version,
5 and looks more consistent now.
0 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png \
1 bricks.png extras.png fr_left.png fr_right.png fr_top.png \
2 life.png menuback.png paddle.png shot.png weapon.png \
3 ABOUT README
4
5 install-data-local:
6 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/AbsoluteB
7 @for file in $(EXTRA_DIST); do\
8 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/AbsoluteB/$$file;\
9 done
10
11 win32-install-script:
12 @for file in $(EXTRA_DIST); do \
13 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\AbsoluteB\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
14 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png bricks.png extras.png fr_left.png fr_right.png fr_top.png life.png menuback.png paddle.png shot.png weapon.png ABOUT README
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = README Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gfx/AbsoluteB/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/gfx/AbsoluteB
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/AbsoluteB
194 @for file in $(EXTRA_DIST); do\
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/AbsoluteB/$$file;\
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\AbsoluteB\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
0
1 * Title : absolute B theme for LBreakout 2 by Jurgen De Backer
2
3 * Version number 0.8 created on 6th December 2002
4
5 * Email-address : annejurgen@pandora.be
6
7 * Description
8
9 New version of the theme, well, it has changed a lot since the previous version,
10 and looks more consistent now.
11 The menu background, the in-game frame, the bricks , paddles, weapons, backgrounds and extras have been customized.
12 As you will notice , I modified some of the original backgrounds a bit, and created new ones, all using the Gimp. Hopefully you'll enjoy this theme.
0 Classic v1.00
1 Author: Michael Speck
2
3 Original theme of LBreakout2
0 EXTRA_DIST = ABOUT
1
2 install-data-local:
3 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Classic
4 @for file in $(EXTRA_DIST); do\
5 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Classic/$$file;\
6 done
7
8 win32-install-script:
9 @for file in $(EXTRA_DIST); do \
10 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Classic\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
11 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = ABOUT
92 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
93 CONFIG_HEADER = ../../../config.h
94 CONFIG_CLEAN_FILES =
95 DIST_COMMON = Makefile.am Makefile.in
96
97
98 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
99
100 TAR = tar
101 GZIP_ENV = --best
102 all: all-redirect
103 .SUFFIXES:
104 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
105 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gfx/Classic/Makefile
106
107 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
108 cd $(top_builddir) \
109 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
110
111 tags: TAGS
112 TAGS:
113
114
115 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
116
117 subdir = client/gfx/Classic
118
119 distdir: $(DISTFILES)
120 @for file in $(DISTFILES); do \
121 d=$(srcdir); \
122 if test -d $$d/$$file; then \
123 cp -pr $$d/$$file $(distdir)/$$file; \
124 else \
125 test -f $(distdir)/$$file \
126 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
127 || cp -p $$d/$$file $(distdir)/$$file || :; \
128 fi; \
129 done
130 info-am:
131 info: info-am
132 dvi-am:
133 dvi: dvi-am
134 check-am: all-am
135 check: check-am
136 installcheck-am:
137 installcheck: installcheck-am
138 install-exec-am:
139 install-exec: install-exec-am
140
141 install-data-am: install-data-local
142 install-data: install-data-am
143
144 install-am: all-am
145 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
146 install: install-am
147 uninstall-am:
148 uninstall: uninstall-am
149 all-am: Makefile
150 all-redirect: all-am
151 install-strip:
152 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
153 installdirs:
154
155
156 mostlyclean-generic:
157
158 clean-generic:
159
160 distclean-generic:
161 -rm -f Makefile $(CONFIG_CLEAN_FILES)
162 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
163
164 maintainer-clean-generic:
165 mostlyclean-am: mostlyclean-generic
166
167 mostlyclean: mostlyclean-am
168
169 clean-am: clean-generic mostlyclean-am
170
171 clean: clean-am
172
173 distclean-am: distclean-generic clean-am
174
175 distclean: distclean-am
176
177 maintainer-clean-am: maintainer-clean-generic distclean-am
178 @echo "This command is intended for maintainers to use;"
179 @echo "it deletes files that may require special tools to rebuild."
180
181 maintainer-clean: maintainer-clean-am
182
183 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
184 installcheck-am installcheck install-exec-am install-exec \
185 install-data-local install-data-am install-data install-am install \
186 uninstall-am uninstall all-redirect all-am all installdirs \
187 mostlyclean-generic distclean-generic clean-generic \
188 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
189
190
191 install-data-local:
192 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Classic
193 @for file in $(EXTRA_DIST); do\
194 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Classic/$$file;\
195 done
196
197 win32-install-script:
198 @for file in $(EXTRA_DIST); do \
199 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Classic\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
200 done
201
202 # Tell versions [3.59,3.63) of GNU make to not export all variables.
203 # Otherwise a system limit (for SysV at least) may be exceeded.
204 .NOEXPORT:
0 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png \
1 ball.png bricks.png extras.png \
2 f_small_red.png f_small_white.png f_small_yellow.png \
3 f_white.png f_yellow.png \
4 fr_left.png fr_right.png fr_top.png \
5 fr_mp_left.png fr_mp_right.png \
6 life.png menuback.png paddle.png shine.png shot.png weapon.png \
7 sel_frame.png buttons.png explosions.png explosions_dark.png \
8 f_tiny_black.png balloon.png balloon_peek.png \
9 f_frame.png f_game.png \
10 scroll_up.png scroll_down.png scroll_track.png \
11 fr_hori.png fr_vert.png fr_luc.png \
12 fr_llc.png fr_ruc.png fr_rlc.png confirm_buttons.png \
13 win_icon.png cr_back.png warp.png nukeback.png \
14 loading.png ammo.png
15
16 SUBDIRS = AbsoluteB Oz Moiree Classic
17
18 install-data-local:
19 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx
20 @for file in $(EXTRA_DIST); do\
21 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/$$file;\
22 done
23
24 win32-install-script:
25 @for file in $(EXTRA_DIST); do \
26 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
27 done
28 @list='$(SUBDIRS)'; for subdir in $$list; do \
29 (cd $$subdir \
30 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
31 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png ball.png bricks.png extras.png f_small_red.png f_small_white.png f_small_yellow.png f_white.png f_yellow.png fr_left.png fr_right.png fr_top.png fr_mp_left.png fr_mp_right.png life.png menuback.png paddle.png shine.png shot.png weapon.png sel_frame.png buttons.png explosions.png explosions_dark.png f_tiny_black.png balloon.png balloon_peek.png f_frame.png f_game.png scroll_up.png scroll_down.png scroll_track.png fr_hori.png fr_vert.png fr_luc.png fr_llc.png fr_ruc.png fr_rlc.png confirm_buttons.png win_icon.png cr_back.png warp.png nukeback.png loading.png ammo.png
92
93
94 SUBDIRS = AbsoluteB Oz Moiree Classic
95 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
96 CONFIG_HEADER = ../../config.h
97 CONFIG_CLEAN_FILES =
98 DIST_COMMON = Makefile.am Makefile.in
99
100
101 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
102
103 TAR = tar
104 GZIP_ENV = --best
105 all: all-redirect
106 .SUFFIXES:
107 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
108 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gfx/Makefile
109
110 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
111 cd $(top_builddir) \
112 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
113
114
115 # This directory's subdirectories are mostly independent; you can cd
116 # into them and run `make' without going through this Makefile.
117 # To change the values of `make' variables: instead of editing Makefiles,
118 # (1) if the variable is set in `config.status', edit `config.status'
119 # (which will cause the Makefiles to be regenerated when you run `make');
120 # (2) otherwise, pass the desired values on the `make' command line.
121
122 @SET_MAKE@
123
124 all-recursive install-data-recursive install-exec-recursive \
125 installdirs-recursive install-recursive uninstall-recursive \
126 check-recursive installcheck-recursive info-recursive dvi-recursive:
127 @set fnord $(MAKEFLAGS); amf=$$2; \
128 dot_seen=no; \
129 target=`echo $@ | sed s/-recursive//`; \
130 list='$(SUBDIRS)'; for subdir in $$list; do \
131 echo "Making $$target in $$subdir"; \
132 if test "$$subdir" = "."; then \
133 dot_seen=yes; \
134 local_target="$$target-am"; \
135 else \
136 local_target="$$target"; \
137 fi; \
138 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
139 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
140 done; \
141 if test "$$dot_seen" = "no"; then \
142 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
143 fi; test -z "$$fail"
144
145 mostlyclean-recursive clean-recursive distclean-recursive \
146 maintainer-clean-recursive:
147 @set fnord $(MAKEFLAGS); amf=$$2; \
148 dot_seen=no; \
149 rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
150 rev="$$subdir $$rev"; \
151 test "$$subdir" = "." && dot_seen=yes; \
152 done; \
153 test "$$dot_seen" = "no" && rev=". $$rev"; \
154 target=`echo $@ | sed s/-recursive//`; \
155 for subdir in $$rev; do \
156 echo "Making $$target in $$subdir"; \
157 if test "$$subdir" = "."; then \
158 local_target="$$target-am"; \
159 else \
160 local_target="$$target"; \
161 fi; \
162 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
163 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
164 done && test -z "$$fail"
165 tags-recursive:
166 list='$(SUBDIRS)'; for subdir in $$list; do \
167 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
168 done
169
170 tags: TAGS
171
172 ID: $(HEADERS) $(SOURCES) $(LISP)
173 list='$(SOURCES) $(HEADERS)'; \
174 unique=`for i in $$list; do echo $$i; done | \
175 awk ' { files[$$0] = 1; } \
176 END { for (i in files) print i; }'`; \
177 here=`pwd` && cd $(srcdir) \
178 && mkid -f$$here/ID $$unique $(LISP)
179
180 TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
181 tags=; \
182 here=`pwd`; \
183 list='$(SUBDIRS)'; for subdir in $$list; do \
184 if test "$$subdir" = .; then :; else \
185 test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
186 fi; \
187 done; \
188 list='$(SOURCES) $(HEADERS)'; \
189 unique=`for i in $$list; do echo $$i; done | \
190 awk ' { files[$$0] = 1; } \
191 END { for (i in files) print i; }'`; \
192 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
193 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
194
195 mostlyclean-tags:
196
197 clean-tags:
198
199 distclean-tags:
200 -rm -f TAGS ID
201
202 maintainer-clean-tags:
203
204 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
205
206 subdir = client/gfx
207
208 distdir: $(DISTFILES)
209 @for file in $(DISTFILES); do \
210 d=$(srcdir); \
211 if test -d $$d/$$file; then \
212 cp -pr $$d/$$file $(distdir)/$$file; \
213 else \
214 test -f $(distdir)/$$file \
215 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
216 || cp -p $$d/$$file $(distdir)/$$file || :; \
217 fi; \
218 done
219 for subdir in $(SUBDIRS); do \
220 if test "$$subdir" = .; then :; else \
221 test -d $(distdir)/$$subdir \
222 || mkdir $(distdir)/$$subdir \
223 || exit 1; \
224 chmod 777 $(distdir)/$$subdir; \
225 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
226 || exit 1; \
227 fi; \
228 done
229 info-am:
230 info: info-recursive
231 dvi-am:
232 dvi: dvi-recursive
233 check-am: all-am
234 check: check-recursive
235 installcheck-am:
236 installcheck: installcheck-recursive
237 install-exec-am:
238 install-exec: install-exec-recursive
239
240 install-data-am: install-data-local
241 install-data: install-data-recursive
242
243 install-am: all-am
244 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
245 install: install-recursive
246 uninstall-am:
247 uninstall: uninstall-recursive
248 all-am: Makefile
249 all-redirect: all-recursive
250 install-strip:
251 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
252 installdirs: installdirs-recursive
253 installdirs-am:
254
255
256 mostlyclean-generic:
257
258 clean-generic:
259
260 distclean-generic:
261 -rm -f Makefile $(CONFIG_CLEAN_FILES)
262 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
263
264 maintainer-clean-generic:
265 mostlyclean-am: mostlyclean-tags mostlyclean-generic
266
267 mostlyclean: mostlyclean-recursive
268
269 clean-am: clean-tags clean-generic mostlyclean-am
270
271 clean: clean-recursive
272
273 distclean-am: distclean-tags distclean-generic clean-am
274
275 distclean: distclean-recursive
276
277 maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
278 distclean-am
279 @echo "This command is intended for maintainers to use;"
280 @echo "it deletes files that may require special tools to rebuild."
281
282 maintainer-clean: maintainer-clean-recursive
283
284 .PHONY: install-data-recursive uninstall-data-recursive \
285 install-exec-recursive uninstall-exec-recursive installdirs-recursive \
286 uninstalldirs-recursive all-recursive check-recursive \
287 installcheck-recursive info-recursive dvi-recursive \
288 mostlyclean-recursive distclean-recursive clean-recursive \
289 maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
290 distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
291 dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
292 install-exec install-data-local install-data-am install-data install-am \
293 install uninstall-am uninstall all-redirect all-am all installdirs-am \
294 installdirs mostlyclean-generic distclean-generic clean-generic \
295 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
296
297
298 install-data-local:
299 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx
300 @for file in $(EXTRA_DIST); do\
301 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/$$file;\
302 done
303
304 win32-install-script:
305 @for file in $(EXTRA_DIST); do \
306 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
307 done
308 @list='$(SUBDIRS)'; for subdir in $$list; do \
309 (cd $$subdir \
310 && $(MAKE) $(AM_MAKEFLAGS) win32-install-script); \
311 done
312
313 # Tell versions [3.59,3.63) of GNU make to not export all variables.
314 # Otherwise a system limit (for SysV at least) may be exceeded.
315 .NOEXPORT:
0 Theme: moiree
1 Version: 1.0
2 Author: Astrid
3 Email: astrid-peters@t-online.de
4 Description: If you like ascii quake, you will like this one too.
5
0 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png \
1 bricks.png extras.png fr_left.png fr_right.png fr_top.png \
2 fr_mp_left.png fr_mp_right.png \
3 life.png paddle.png \
4 ABOUT
5
6 install-data-local:
7 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Moiree
8 @for file in $(EXTRA_DIST); do\
9 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Moiree/$$file;\
10 done
11
12 win32-install-script:
13 @for file in $(EXTRA_DIST); do \
14 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Moiree\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
15 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png bricks.png extras.png fr_left.png fr_right.png fr_top.png fr_mp_left.png fr_mp_right.png life.png paddle.png ABOUT
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gfx/Moiree/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/gfx/Moiree
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Moiree
194 @for file in $(EXTRA_DIST); do\
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Moiree/$$file;\
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Moiree\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
Binary diff not shown
0 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png \
1 bricks.png fr_left.png fr_right.png fr_top.png \
2 life.png paddle.png \
3 README
4
5 install-data-local:
6 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Oz
7 @for file in $(EXTRA_DIST); do\
8 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Oz/$$file;\
9 done
10
11 win32-install-script:
12 @for file in $(EXTRA_DIST); do \
13 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Oz\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
14 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png bricks.png fr_left.png fr_right.png fr_top.png life.png paddle.png README
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = README Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gfx/Oz/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/gfx/Oz
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx/Oz
194 @for file in $(EXTRA_DIST); do\
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/Oz/$$file;\
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gfx\\Oz\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
0 Title: Oz
1 Version: 1.0
2 Author: Austin Henry
3 Email: ahenry@alumni.uvic.ca
4 Description: These graphics were all produced from photos taken on a trip to Australia.
5 Primarily from photos of interesting sand and rock formations. I
6 left the backgrounds other than the black ones, because they went
7 so well with the colour scheme.
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 EXTRA_DIST = box_wallpaper.png widget_wallpaper.png \
1 box_frame.png widget_frame.png \
2 button_frame_normal.png button_frame_clicked.png \
3 button_wallpaper_normal.png button_wallpaper_focused.png \
4 scrollbar_arrows.png checkbox.png progress_high.png progress_medium.png \
5 progress_low.png list_item_color.png font.png spinbutton_arrows.png \
6 edit.wav click.wav
7
8 install-data-local:
9 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gui_theme
10 @for file in $(EXTRA_DIST); do \
11 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gui_theme/$$file; \
12 done
13
14 win32-install-script:
15 @for file in $(EXTRA_DIST); do \
16 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gui_theme\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
17 done
18
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = box_wallpaper.png widget_wallpaper.png box_frame.png widget_frame.png button_frame_normal.png button_frame_clicked.png button_wallpaper_normal.png button_wallpaper_focused.png scrollbar_arrows.png checkbox.png progress_high.png progress_medium.png progress_low.png list_item_color.png font.png spinbutton_arrows.png edit.wav click.wav
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/gui_theme/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/gui_theme
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gui_theme
194 @for file in $(EXTRA_DIST); do \
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gui_theme/$$file; \
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\gui_theme\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 /***************************************************************************
1 help.c - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "event.h"
19
20 StkFont *help_caption_font = 0;
21 StkFont *help_font = 0;
22 SDL_Surface *help_bkgnd = 0;
23 int side_count = 4;
24
25 extern SDL_Surface *stk_display;
26 extern SDL_Surface *extra_pic;
27 extern SDL_Surface *brick_pic;
28
29 /*
30 ====================================================================
31 Locals
32 ====================================================================
33 */
34
35 /*
36 ====================================================================
37 Draw title.
38 ====================================================================
39 */
40 void draw_title( )
41 {
42 help_caption_font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
43 stk_font_write( help_caption_font,
44 stk_display, stk_display->w / 2, 20, STK_OPAQUE, "Quick Help" );
45 }
46 /*
47 ====================================================================
48 Add footnote.
49 ====================================================================
50 */
51 void draw_footnote( int side )
52 {
53 char buf[256];
54 help_font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_BOTTOM;
55 sprintf( buf, "%i / %i", side, side_count );
56 stk_font_write( help_font, stk_display,
57 stk_display->w - 2, stk_display->h - 2, STK_OPAQUE, buf );
58 help_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_BOTTOM;
59 sprintf( buf, "<ESCAPE>: Quit <LEFT BUTTON>: Next Page <RIGHT BUTTON>: Previous Page" );
60 stk_font_write( help_font,
61 stk_display, 2, stk_display->h - 2, STK_OPAQUE, buf );
62 }
63
64 /*
65 ====================================================================
66 Draw bonus info
67 ====================================================================
68 */
69 void draw_bonus_info( int x, int y, int id, char *text )
70 {
71 stk_surface_blit(
72 extra_pic, id * BRICK_WIDTH, 0, BRICK_WIDTH, BRICK_HEIGHT,
73 stk_display, x, y );
74 help_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_CENTER_Y;
75 stk_font_write( help_font, stk_display,
76 x + BRICK_WIDTH + 10, y + BRICK_HEIGHT / 2, STK_OPAQUE, text );
77 }
78
79 /*
80 ====================================================================
81 Draw brick info
82 ====================================================================
83 */
84 void draw_brick_info( int x, int y, int id, char *text )
85 {
86 stk_surface_blit(
87 brick_pic, id * BRICK_WIDTH, 0, BRICK_WIDTH, BRICK_HEIGHT,
88 stk_display, x, y );
89 help_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_CENTER_Y;
90 stk_font_write( help_font, stk_display,
91 x + BRICK_WIDTH + 10, y + BRICK_HEIGHT / 2, STK_OPAQUE, text );
92 }
93
94 /*
95 ====================================================================
96 Draw bonus info screen.
97 ====================================================================
98 */
99 void draw_bonus_screen()
100 {
101 int bonus_x = 20, bonus_y = 80, bonus_w = 200, bonus_h = 30;
102 int malus_x = 20, malus_y = 330, malus_w = 200, malus_h = 30;
103
104 stk_surface_blit( help_bkgnd, 0,0,-1,-1, stk_display, 0,0 );
105 draw_title();
106
107 /* bonuses */
108 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
109 stk_font_write( help_caption_font,
110 stk_display, bonus_x, bonus_y - 30, STK_OPAQUE, "Bonuses:" );
111 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 0, 8, "Expand paddle" );
112 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 0, 9, "Extra life" );
113 draw_bonus_info( bonus_x + bonus_w * 2, bonus_y + bonus_h * 0, 10, "Sticky paddle" );
114 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 1, 15, "Plasma weapon" );
115 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 1, 2, "200 - 10,000 points extra score" );
116 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 2, 12, "Extra ball" );
117 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 2, 11, "Energy balls (penetrate bricks)" );
118 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 3, 13, "Bonus floor" );
119 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 3, 18, "Deccelerate balls to minimum speed" );
120 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 4, 6, "1,000 points extra score from bricks with no bonus" );
121 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 5, 19, "Instantly collect all bonuses and destroy all maluses" );
122 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 6, 25, "Explosive balls" );
123 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 6, 26, "Paddle attracts bonuses" );
124
125 /* maluses */
126 stk_font_write( help_caption_font, stk_display,
127 malus_x, malus_y - 30, STK_OPAQUE, "Maluses:" );
128 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 0, 7, "Shrink paddle" );
129 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 3, 17, "Accelerate balls" );
130 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 1, 14, "Freeze paddle" );
131 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 1, 21, "Random ball reflection at bricks" );
132 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 2, 20, "Darkness" );
133 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 2, 27, "Paddle attracts maluses" );
134 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 0, 22, "Paddle disappears when not moving" );
135 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 3, 28, "40% chance that a ball doesn't damage brick" );
136
137 draw_footnote( 1 );
138
139 stk_display_update( STK_UPDATE_ALL );
140 }
141 /*
142 ====================================================================
143 Draw hint
144 ====================================================================
145 */
146 void draw_hint( int x, int y, char *text )
147 {
148 stk_font_write( help_font, stk_display,
149 x, y, STK_OPAQUE, text );
150 }
151 /*
152 ====================================================================
153 Draw hints
154 ====================================================================
155 */
156 void draw_hints_screen()
157 {
158 int hint_x = 20, hint_y = 80, hint_h = 20;
159
160 stk_surface_blit( help_bkgnd, 0,0,-1,-1, stk_display, 0,0 );
161 draw_title();
162
163 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
164 stk_font_write( help_caption_font, stk_display,
165 hint_x, hint_y - 40, STK_OPAQUE, "Hints:" );
166
167 draw_hint( hint_x, hint_y + hint_h * 0, "<<'In Game'-Keys>>" );
168 draw_hint( hint_x, hint_y + hint_h * 1, " p Pause game. (and enter chatroom in network game)" );
169 draw_hint( hint_x, hint_y + hint_h * 2, " s Enable/Disable sound." );
170 draw_hint( hint_x, hint_y + hint_h * 3, " a Change animation level (off/low/high)." );
171 draw_hint( hint_x, hint_y + hint_h * 4, " f Switch fullscreen/windowed mode." );
172 draw_hint( hint_x, hint_y + hint_h * 5, " NOTE: Changing resolution takes a while so this is done best" );
173 draw_hint( hint_x, hint_y + hint_h * 6, " when game's paused." );
174 draw_hint( hint_x, hint_y + hint_h * 7, " r Restart level." );
175 draw_hint( hint_x, hint_y + hint_h * 8, " d Disintegrate single bricks. (AddOn's only)" );
176 draw_hint( hint_x, hint_y + hint_h * 9, " w Warp to next level after enough bricks where cleared. (AddOn's only)" );
177 draw_hint( hint_x, hint_y + hint_h * 10, " Shift Shows highest score of set instead of your score as long as you" );
178 draw_hint( hint_x, hint_y + hint_h * 11, " hold it down." );
179 draw_hint( hint_x, hint_y + hint_h * 12, " Tab Take a screenshot." );
180 draw_hint( hint_x, hint_y + hint_h * 13, " Esc Quit game." );
181
182 draw_hint( hint_x, hint_y + hint_h * 15, "Pressing the left or right mouse button will fire attached balls either" );
183 draw_hint( hint_x, hint_y + hint_h * 16, "to the left or right direction if 'Ball Fire Angle' in 'Advanced Options'" );
184 draw_hint( hint_x, hint_y + hint_h * 17, "is not set to 'Random'." );
185
186 draw_footnote( 3 );
187
188 stk_display_update( STK_UPDATE_ALL );
189 }
190 /*
191 ====================================================================
192 Draw ingame hints
193 ====================================================================
194 */
195 void draw_ingame_hints_screen()
196 {
197 int brick_x = 20, brick_y = 210, brick_h = 30;
198 int extra_x = 20, extra_y = 80, extra_h = 30;
199
200 stk_surface_blit( help_bkgnd, 0,0,-1,-1, stk_display, 0,0 );
201 draw_title();
202
203 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
204 stk_font_write( help_caption_font, stk_display,
205 extra_x, extra_y - 30, STK_OPAQUE, "Neutral Power-Ups:" );
206
207 draw_bonus_info( extra_x, extra_y + extra_h * 0, 16, "Any of the listed bonuses/maluses." );
208 draw_bonus_info( extra_x, extra_y + extra_h * 1, 23, "Resets all active bonuses and maluses." );
209 draw_bonus_info( extra_x, extra_y + extra_h * 2, 24, "Adds 7 seconds to all active bonuses/maluses." );
210
211 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
212 stk_font_write( help_caption_font, stk_display,
213 brick_x, brick_y - 30, STK_OPAQUE, "Special Bricks:" );
214
215 draw_brick_info( brick_x, brick_y + brick_h * 0, 0, "Indestructible." );
216 draw_brick_info( brick_x, brick_y + brick_h * 1, 1, "May only be destroyed by energy ball else it's indestructible." );
217 draw_brick_info( brick_x, brick_y + brick_h * 2, 2, "As above and balls are reflected randomly at this brick." );
218 draw_brick_info( brick_x, brick_y + brick_h * 3, 5, "Needs three hits to be destroyed." );
219 draw_brick_info( brick_x, brick_y + brick_h * 4, 9, "As above and regenerates durability every 4 seconds." );
220 draw_brick_info( brick_x, brick_y + brick_h * 5, 18, "Explodes and destroys all nearby bricks." );
221 draw_brick_info( brick_x, brick_y + brick_h * 6, 19, "Creates up to 8 bricks on destruction." );
222
223 draw_footnote( 2 );
224
225 stk_display_update( STK_UPDATE_ALL );
226 }
227 /*
228 ====================================================================
229 Draw trouble shooting
230 ====================================================================
231 */
232 void draw_trouble( int x, int y, char *text )
233 {
234 draw_hint( x, y, text );
235 }
236 void draw_trouble_screen()
237 {
238 int trouble_x = 20, trouble_y = 90, trouble_h = 20;
239 int manual_x = 20, manual_y = 310, manual_h = 20;
240 stk_surface_blit( help_bkgnd, 0,0,-1,-1, stk_display, 0,0 );
241 draw_title();
242
243 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
244 stk_font_write( help_caption_font, stk_display,
245 trouble_x, trouble_y - 40, STK_OPAQUE, "Troubleshooting:" );
246
247 draw_trouble( trouble_x, trouble_y + trouble_h * 0, "* In fullscreen mode the window keeps it size just adding a black frame?" );
248 draw_trouble( trouble_x, trouble_y + trouble_h * 1, " - Maybe you do not have 640x480 as resolution available? Check your" );
249 draw_trouble( trouble_x, trouble_y + trouble_h * 2, " X configuration." );
250 draw_trouble( trouble_x, trouble_y + trouble_h * 3, "* Sounds seem to be out of sync and are played with some delay?" );
251 draw_trouble( trouble_x, trouble_y + trouble_h * 4, " - Set SDL_AUDIODRIVER to dma (export SDL_AUDIODRIVER=dma). If this results" );
252 draw_trouble( trouble_x, trouble_y + trouble_h * 5, " in a lot of errors killing artsd (or esd) may help." );
253 draw_trouble( trouble_x, trouble_y + trouble_h * 6, "* LBreakout2 gets mute while playing when switching on/off sounds?" );
254 draw_trouble( trouble_x, trouble_y + trouble_h * 7, " - SDL_mixer seems to mute active channels. You shouldn't enable/disable" );
255 draw_trouble( trouble_x, trouble_y + trouble_h * 8, " sounds to often as you'll propably loose all channels then." );
256
257 help_caption_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
258 stk_font_write( help_caption_font, stk_display,
259 manual_x, manual_y - 40, STK_OPAQUE , "Manual:");
260 draw_trouble( manual_x, manual_y + manual_h * 0, "This is just a quick help with the most important facts about LBreakout2." );
261 draw_trouble( manual_x, manual_y + manual_h * 1, "If you want more and better information check out the manual installed to" );
262 draw_trouble( manual_x, manual_y + manual_h * 2, "/usr/doc/lbreakout2 or the online version at http://lgames.sf.net." );
263 draw_trouble( manual_x, manual_y + manual_h * 3, "And if you have questions (not answered by the manual) or you found a bug" );
264 draw_trouble( manual_x, manual_y + manual_h * 4, "or you just want to drop a general note about LBreakout2 just mail to:" );
265 draw_trouble( manual_x, manual_y + manual_h * 5, " kulkanie@gmx.net" );
266 draw_trouble( manual_x, manual_y + manual_h * 6, " Enjoy the game!" );
267 draw_trouble( manual_x, manual_y + manual_h * 6 + 10, " Michael Speck" );
268
269 draw_footnote( 4 );
270
271 stk_display_update( STK_UPDATE_ALL );
272 }
273
274 /*
275 ====================================================================
276 Publics
277 ====================================================================
278 */
279
280 /*
281 ====================================================================
282 Load/delete help resources.
283 ====================================================================
284 */
285 void help_create()
286 {
287 help_font = stk_font_load( SDL_SWSURFACE, "f_small_yellow.png" );
288 help_caption_font = stk_font_load( SDL_SWSURFACE, "f_yellow.png" );
289 /* background -- will be filled when running help */
290 help_bkgnd = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
291 SDL_SetColorKey( help_bkgnd, 0, 0 );
292 }
293 void help_delete()
294 {
295 stk_font_free( &help_font );
296 stk_font_free( &help_caption_font );
297 stk_surface_free( &help_bkgnd );
298 }
299
300 /*
301 ====================================================================
302 Run help.
303 ====================================================================
304 */
305 void help_run()
306 {
307 int leave = 0;
308 SDL_Event event;
309 int cur_side = 0;
310 SDL_Surface *buffer =
311 stk_surface_create(SDL_SWSURFACE,stk_display->w, stk_display->h);
312
313 /* buffer screen */
314 stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 );
315 SDL_SetColorKey(buffer, 0, 0);
316
317 /* gray screen and use as background */
318 stk_surface_gray( stk_display, 0,0,-1,-1, 1 );
319 stk_surface_blit( stk_display, 0,0,-1,-1, help_bkgnd, 0,0 );
320
321 draw_bonus_screen();
322 while ( !leave ) {
323 SDL_WaitEvent( &event );
324 switch ( event.type ) {
325 case SDL_KEYDOWN:
326 switch ( event.key.keysym.sym ) {
327 case SDLK_ESCAPE: leave = 1; break;
328 case SDLK_LEFT:
329 case SDLK_RIGHT:
330 if ( event.key.keysym.sym == SDLK_RIGHT ) {
331 cur_side++;
332 if ( cur_side == side_count ) cur_side = 0;
333 }
334 else {
335 cur_side--;
336 if ( cur_side < 0 ) cur_side = side_count - 1;
337 }
338 switch ( cur_side ) {
339 case 0: draw_bonus_screen(); break;
340 case 2: draw_hints_screen(); break;
341 case 1: draw_ingame_hints_screen(); break;
342 case 3: draw_trouble_screen(); break;
343 }
344 break;
345 default: break;
346 }
347 break;
348 case SDL_MOUSEBUTTONUP:
349 if ( event.button.button == STK_BUTTON_LEFT ) {
350 cur_side++;
351 if ( cur_side == side_count ) cur_side = 0;
352 }
353 else {
354 cur_side--;
355 if ( cur_side < 0 ) cur_side = side_count - 1;
356 }
357 switch ( cur_side ) {
358 case 0: draw_bonus_screen(); break;
359 case 2: draw_hints_screen(); break;
360 case 1: draw_ingame_hints_screen(); break;
361 case 3: draw_trouble_screen(); break;
362 }
363 break;
364 default: break;
365 }
366 }
367
368 /* redraw screen */
369 stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 );
370 stk_display_update( STK_UPDATE_ALL );
371 SDL_FreeSurface( buffer );
372
373 /* reset the relative position so paddle wont jump */
374 SDL_GetRelativeMouseState(0,0);
375
376 }
0 /***************************************************************************
1 item.h - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __HELP_H
18 #define __HELP_H
19
20 /*
21 ====================================================================
22 Load/delete help resources.
23 ====================================================================
24 */
25 void help_create();
26 void help_delete();
27
28 /*
29 ====================================================================
30 Run help.
31 ====================================================================
32 */
33 void help_run();
34
35 #endif
0 /***************************************************************************
1 hint.c - description
2 -------------------
3 begin : Sun Jan 6 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "hint.h"
19 #include "config.h"
20
21 SDL_Surface *hint_balloon = 0;
22 SDL_Surface *hint_bkgnd = 0;
23 SDL_Surface *balloon = 0;
24 SDL_Surface *balloon_peek = 0;
25 int balloon_peek_add_x = 9, balloon_peek_add_y = 9; /* added to actual balloon to display peek */
26 int balloon_tile_size;
27 Hint *cur_hint = 0;
28 StkFont *hint_font = 0;
29 int hint_delay = 0;
30 float hint_alpha;
31 int hint_text_x = 10 + 9, hint_text_y = 10; /* text is drawn at this offset within balloon */
32
33 extern Config config;
34 extern SDL_Surface *stk_display;
35
36 /*
37 ====================================================================
38 Locals
39 ====================================================================
40 */
41
42 /*
43 ====================================================================
44 Create actual hint picture displayed.
45 ====================================================================
46 */
47 void hint_create_pic( Hint *hint )
48 {
49 int x, y, px, py;
50 stk_surface_free( &hint_balloon );
51 /* get screen size and position */
52 hint->rect.w = 240 + balloon_peek_add_x;
53 hint->rect.h = balloon_tile_size * ( 2 + ( hint->text->count + 0 ) * hint_font->height / balloon_tile_size ) + balloon_peek_add_y;
54 hint_set_pos( hint, hint->peek_x, hint->peek_y );
55 /* build surface */
56 hint_balloon = stk_surface_create( SDL_SWSURFACE, cur_hint->rect.w, cur_hint->rect.h );
57 for ( y = 0; y < cur_hint->rect.h - balloon_peek_add_y; y += balloon_tile_size )
58 for ( x = 0; x < cur_hint->rect.w - balloon_peek_add_x; x += balloon_tile_size ) {
59 px = x + balloon_peek_add_x; py = y;
60 /* get proper tile */
61 if ( y == 0 ) {
62 if ( x == 0 )
63 stk_surface_blit( balloon, 0, 0,
64 balloon_tile_size, balloon_tile_size,
65 hint_balloon, px, py );
66 else
67 if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
68 stk_surface_blit( balloon, balloon_tile_size * 2, 0,
69 balloon_tile_size, balloon_tile_size,
70 hint_balloon, px, py );
71 else
72 stk_surface_blit( balloon, balloon_tile_size, 0,
73 balloon_tile_size, balloon_tile_size,
74 hint_balloon, px, py );
75 }
76 else
77 if ( y >= cur_hint->rect.h - balloon_peek_add_y - balloon_tile_size ) {
78 if ( x == 0 )
79 stk_surface_blit( balloon, 0, balloon_tile_size * 2,
80 balloon_tile_size, balloon_tile_size,
81 hint_balloon, px, py );
82 else
83 if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
84 stk_surface_blit( balloon,
85 balloon_tile_size * 2, balloon_tile_size * 2,
86 balloon_tile_size, balloon_tile_size,
87 hint_balloon, px, py );
88 else
89 stk_surface_blit( balloon,
90 balloon_tile_size, balloon_tile_size * 2,
91 balloon_tile_size, balloon_tile_size,
92 hint_balloon, px, py );
93 }
94 else {
95 if ( x == 0 )
96 stk_surface_blit( balloon, 0, balloon_tile_size,
97 balloon_tile_size, balloon_tile_size,
98 hint_balloon, px, py );
99 else
100 if ( x >= cur_hint->rect.w - balloon_peek_add_x - balloon_tile_size )
101 stk_surface_blit( balloon,
102 balloon_tile_size * 2, balloon_tile_size,
103 balloon_tile_size, balloon_tile_size,
104 hint_balloon, px, py );
105 else
106 stk_surface_blit( balloon,
107 balloon_tile_size, balloon_tile_size,
108 balloon_tile_size, balloon_tile_size,
109 hint_balloon, px, py );
110 }
111 }
112 /* peek */
113 stk_surface_blit( balloon_peek, 0, 0, balloon_peek->w, balloon_peek->h,
114 hint_balloon, 0, cur_hint->rect.h - balloon_peek->h );
115 /* text */
116 for ( y = 0, x = 0; x < cur_hint->text->count; y += hint_font->height, x++ )
117 stk_font_write( hint_font,
118 hint_balloon, hint_text_x, hint_text_y + y,
119 -1, cur_hint->text->lines[x] );
120 }
121
122 /*
123 ====================================================================
124 Publics
125 ====================================================================
126 */
127
128 /*
129 ====================================================================
130 Load/delete hint resources.
131 ====================================================================
132 */
133 void hint_load_res()
134 {
135 balloon = stk_surface_load( SDL_SWSURFACE, "balloon.png" );
136 balloon_peek = stk_surface_load( SDL_SWSURFACE, "balloon_peek.png" );
137 balloon_tile_size = balloon->w / 3;
138 hint_font = stk_font_load( SDL_SWSURFACE, "f_tiny_black.png" );
139 }
140 void hint_delete_res()
141 {
142 stk_surface_free( &balloon );
143 stk_surface_free( &balloon_peek );
144 stk_font_free( &hint_font );
145 stk_surface_free( &hint_balloon );
146 }
147
148 /*
149 ====================================================================
150 Create a hint. The passed x,y position is where the end of the
151 Sprechblasenspitze is. Contents is converted to lines (duplicated).
152 ====================================================================
153 */
154 Hint* hint_create( int x, int y, char *contents )
155 {
156 Hint *hint = calloc( 1, sizeof( Hint ) );
157 /* get text and position */
158 hint->text = create_text( contents, 36 );
159 hint->peek_x = x;
160 hint->peek_y = y;
161 return hint;
162 }
163 void hint_delete( Hint *hint )
164 {
165 if ( !hint )
166 return;
167 free( hint );
168 }
169
170 /*
171 ====================================================================
172 Set the background on which the hints will be displayed.
173 ====================================================================
174 */
175 void hint_set_bkgnd( SDL_Surface *bkgnd )
176 {
177 hint_bkgnd = bkgnd;
178 }
179
180 /*
181 ====================================================================
182 Set this hint as actual one. If NULL was passed no hint will be
183 handled.
184 ====================================================================
185 */
186 void hint_set( Hint *hint )
187 {
188 if ( config.use_hints )
189 cur_hint = hint;
190 else
191 cur_hint = 0;
192 if ( cur_hint ) {
193 hint_alpha = 0;
194 hint_delay = 500;
195 hint_create_pic( hint );
196 /* must be in screen */
197 if ( hint->rect.x + hint_balloon->w >= stk_display->w )
198 hint->rect.x = stk_display->w - hint_balloon->w;
199 }
200 }
201
202 /*
203 ====================================================================
204 Set hint to this position.
205 ====================================================================
206 */
207 void hint_set_pos( Hint *hint, int x, int y )
208 {
209 hint->peek_x = x;
210 hint->peek_y = y;
211 /* adjust screen position so that balloon's peek is at x,y */
212 hint->rect.x = x;
213 hint->rect.y = y - hint->rect.h - balloon_peek->h / 2;
214 }
215
216 /*
217 ====================================================================
218 Update the contents of a hint.
219 ====================================================================
220 */
221 void hint_set_contents( Hint *hint, char *contents )
222 {
223 delete_text( hint->text );
224 hint->text = create_text( contents, 36 );
225 }
226
227 /*
228 ====================================================================
229 Show/hide/update _current_ hint.
230 ====================================================================
231 */
232 void hint_hide()
233 {
234 if ( !cur_hint || hint_delay )
235 return;
236 stk_surface_blit( hint_bkgnd, cur_hint->rect.x, cur_hint->rect.y,
237 cur_hint->rect.w, cur_hint->rect.h,
238 stk_display, cur_hint->rect.x, cur_hint->rect.y);
239 stk_display_store_drect();
240 /* peek */
241 stk_surface_blit(
242 hint_bkgnd,
243 cur_hint->rect.x + balloon_peek_add_x,
244 cur_hint->rect.y + cur_hint->rect.h + balloon_peek_add_y,
245 balloon_peek->w, balloon_peek->h,
246 stk_display,
247 cur_hint->rect.x + balloon_peek_add_x,
248 cur_hint->rect.y + cur_hint->rect.h + balloon_peek_add_y );
249 stk_display_store_drect();
250 }
251 void hint_show()
252 {
253 if ( !cur_hint || hint_delay > 0 )
254 return;
255 SDL_SetAlpha( hint_balloon, SDL_SRCALPHA, hint_alpha );
256 stk_surface_blit( hint_balloon, 0, 0,
257 cur_hint->rect.w, cur_hint->rect.h,
258 stk_display, cur_hint->rect.x, cur_hint->rect.y );
259 stk_display_store_drect();
260 }
261 void hint_update( int ms )
262 {
263 /* delay */
264 if ( hint_delay > 0 ) {
265 hint_delay -= ms;
266 if ( hint_delay <= 0 )
267 hint_delay = 0;
268 }
269 /* if delay fade blend if if still alpha */
270 if ( hint_delay == 0 && hint_alpha < 255 ) {
271 hint_alpha += 1.0 * ms;
272 if ( hint_alpha > 255 )
273 hint_alpha = 255;
274 }
275 }
0 /***************************************************************************
1 hint.h - description
2 -------------------
3 begin : Sun Jan 6 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __HINT_H
18 #define __HINT_H
19
20 typedef struct {
21 Text *text; /* contents */
22 int peek_x, peek_y;
23 /* screen geometry -- computed when displaying hint */
24 SDL_Rect rect;
25 } Hint;
26
27 /*
28 ====================================================================
29 Load/delete hint resources.
30 ====================================================================
31 */
32 void hint_load_res();
33 void hint_delete_res();
34
35 /*
36 ====================================================================
37 Create a hint. The passed x,y position is where the end of the
38 Sprechblasenspitze is. Contents is converted to lines (duplicated).
39 ====================================================================
40 */
41 Hint* hint_create( int x, int y, char *contents );
42 void hint_delete( Hint *hint );
43
44 /*
45 ====================================================================
46 Set the background on which the hints will be displayed.
47 ====================================================================
48 */
49 void hint_set_bkgnd( SDL_Surface *bkgnd );
50
51 /*
52 ====================================================================
53 Set this hint as actual one. If NULL was passed no hint will be
54 handled.
55 ====================================================================
56 */
57 void hint_set( Hint *hint );
58
59 /*
60 ====================================================================
61 Set hint to this position.
62 ====================================================================
63 */
64 void hint_set_pos( Hint *hint, int x, int y );
65
66 /*
67 ====================================================================
68 Update the contents of a hint.
69 ====================================================================
70 */
71 void hint_set_contents( Hint *hint, char *contents );
72
73 /*
74 ====================================================================
75 Show/hide/update _current_ hint.
76 ====================================================================
77 */
78 void hint_hide();
79 void hint_show();
80 void hint_update( int ms );
81
82 #endif
0 /***************************************************************************
1 item.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "manager.h"
18
19 extern SDL_Surface *stk_display;
20 extern SDL_Surface *mbkgnd;
21 extern StkFont *mfont, *mhfont;
22
23 /*
24 ====================================================================
25 Locals
26 ====================================================================
27 */
28
29 float alpha_change = 0.4;
30
31 /*
32 ====================================================================
33 Create a basic item.
34 ====================================================================
35 */
36 Item *item_create_basic( int type, char *name, char *hint )
37 {
38 Item *item = calloc( 1, sizeof( Item ) );
39 /* name */
40 item->name = strdup( name );
41 /* id */
42 item->item_id = -1;
43 /* alpha */
44 item->halpha = 0;
45 item->alpha = 255;
46 /* type */
47 item->type = type;
48 /* hint if astring was passed */
49 if ( hint == 0 )
50 item->hint = 0;
51 else
52 item->hint = hint_create( 0, 0, hint ); /* the position will be set when this item is adjusted in menu adjust */
53 /* fonts */
54 item->font = mfont;
55 item->hfont = mhfont;
56 /* background */
57 item->bkgnd = mbkgnd;
58 return item;
59 }
60
61 /*
62 ====================================================================
63 Publics
64 ====================================================================
65 */
66
67 /*
68 ====================================================================
69 Create item.
70 Return Value: item
71 ====================================================================
72 */
73 Item *item_create_separator( char *name )
74 {
75 Item *item = item_create_basic( ITEM_SEPARATOR, name, 0 );
76 return item;
77 }
78 Item *item_create_range( char *name, char *hint, int *val_int, int min, int max, int step )
79 {
80 Item *item = item_create_basic( ITEM_RANGE, name, hint );
81 item->value = value_create_range_int( val_int, min, max, step );
82 return item;
83 }
84 Item *item_create_switch( char *name, char *hint, int *val_int, char *str_off, char *str_on )
85 {
86 char **names = calloc( 2, sizeof( char* ) );
87 Item *item = item_create_basic( ITEM_SWITCH, name, hint );
88 names[0] = strdup( str_off );
89 names[1] = strdup( str_on );
90 item->value = value_create_range_str( val_int, names, 2 );
91 free( names[0] ); free( names[1] ); free( names );
92 return item;
93 }
94 Item *item_create_switch_x( char *name, char *hint, int *val_int, char **strings, int count )
95 {
96 Item *item = item_create_basic( ITEM_SWITCH_X, name, hint );
97 item->value = value_create_range_str( val_int, strings, count );
98 return item;
99 }
100 Item *item_create_key( char *name, char *hint, int *val_int, int *filter )
101 {
102 Item *item = item_create_basic( ITEM_KEY, name, hint );
103 item->value = value_create_key( val_int, filter );
104 return item;
105 }
106 Item *item_create_edit( char *name, char *hint, char *val_str, int limit )
107 {
108 Item *item = item_create_basic( ITEM_EDIT, name, hint );
109 item->value = value_create_edit( val_str, limit );
110 return item;
111 }
112 Item *item_create_link( char *name, char *hint, void *menu )
113 {
114 Item *item = item_create_basic( ITEM_LINK, name, hint );
115 item->link = menu;
116 return item;
117 }
118 Item *item_create_action( char *name, char *hint, int item_id )
119 {
120 Item *item = item_create_basic( ITEM_ACTION, name, hint );
121 item->item_id = item_id;
122 return item;
123 }
124 /*
125 ====================================================================
126 Delete item (void pointer for compatiblity when using with list)
127 ====================================================================
128 */
129 void item_delete( void *pitem )
130 {
131 Item *item = (Item*)pitem;
132 if ( !item ) return;
133 if ( item->name ) free( item->name );
134 if ( item->value ) value_delete( item->value );
135 if ( item->hint ) hint_delete( item->hint );
136 free( item );
137 }
138 /*
139 ====================================================================
140 Adjust alignment of name and value strings
141 ====================================================================
142 */
143 void item_adjust( Item *item )
144 {
145 /* alignment - name */
146 item->nx = 0; item->ny = item->h / 2; item->nalign = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_CENTER_Y;
147 if ( item->type == ITEM_LINK || item->type == ITEM_ACTION || item->type == ITEM_SEPARATOR ) {
148 item->nx = item->w / 2;
149 item->nalign = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
150 }
151 item->vx = item->w - 1; item->vy = item->h / 2; item->valign = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_CENTER_Y;
152 /* hint position */
153 if ( item->hint )
154 hint_set_pos( item->hint, item->x + item->w * 0.6, item->y );
155 }
156 /*
157 ====================================================================
158 Hide/Show item
159 ====================================================================
160 */
161 void item_hide( Item *item )
162 {
163 stk_surface_blit( item->bkgnd,
164 item->x, item->y, item->w, item->h,
165 stk_display, item->x, item->y );
166 stk_display_store_drect();
167 }
168 void item_show( Item *item )
169 {
170 /* name */
171 item->font->align = item->nalign;
172 item->hfont->align = item->nalign;
173 stk_font_write( item->font, stk_display,
174 item->x + item->nx, item->y + item->ny,
175 item->alpha, item->name );
176 if ( item->halpha > 0 )
177 stk_font_write( item->hfont, stk_display,
178 item->x + item->nx, item->y + item->ny,
179 item->halpha, item->name );
180 stk_display_store_drect();
181 /* value string */
182 if ( item->value ) {
183 item->font->align = item->valign;
184 item->hfont->align = item->valign;
185 /* Is this a selected edit item? */
186 if (item->highlighted && (item->type == ITEM_EDIT))
187 {
188 write_text_with_cursor( item->font, stk_display,
189 item->x + item->vx, item->y + item->vy,
190 item->value->val_str, item->alpha );
191 if ( item->halpha > 0 )
192 write_text_with_cursor( item->hfont, stk_display,
193 item->x + item->vx, item->y + item->vy,
194 item->value->val_str, item->halpha );
195 }
196 else
197 {
198 stk_font_write( item->font, stk_display,
199 item->x + item->vx, item->y + item->vy,
200 item->alpha, item->value->val_str );
201 if ( item->halpha > 0 )
202 stk_font_write( item->hfont, stk_display,
203 item->x + item->vx, item->y + item->vy,
204 item->halpha, item->value->val_str );
205 }
206 stk_display_store_drect();
207 }
208 }
209 /*
210 ====================================================================
211 Update alpha of item
212 ====================================================================
213 */
214 void item_update_alpha( Item *item, int ms )
215 {
216 if ( item->highlighted ) {
217 item->halpha = 255;
218 item->alpha = 0;
219 }
220 else {
221 if ( item->halpha > 0 ) {
222 item->halpha -= alpha_change * ms;
223 if ( item->halpha < 0 ) item->halpha = 0;
224 }
225 if ( item->alpha < 255 ) {
226 item->alpha += alpha_change * ms;
227 if ( item->alpha > 255 ) item->alpha = 255;
228 }
229 }
230 }
231 /*
232 ====================================================================
233 Check if position's on item.
234 ====================================================================
235 */
236 int item_focus( Item *item, int x, int y )
237 {
238 if ( item->type == ITEM_SEPARATOR ) return 0; /* may never be focused */
239 return ( x >= item->x && y >= item->y && x < item->x + item->w && y < item->y + item->h );
240 }
0 /***************************************************************************
1 item.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __ITEM_H
18 #define __ITEM_H
19
20 #include "hint.h"
21
22 /*
23 ====================================================================
24 Item of menu
25 ====================================================================
26 */
27 enum {
28 ITEM_SEPARATOR = 0,
29 ITEM_SWITCH,
30 ITEM_SWITCH_X,
31 ITEM_RANGE,
32 ITEM_KEY,
33 ITEM_EDIT,
34 ITEM_LINK,
35 ITEM_ACTION
36 };
37 typedef struct {
38 Value *value; /* value of item */
39 int type; /* type as listed above */
40 char *name; /* name of item -- duplicated */
41 int item_id; /* id of item (returned as action if ITEM_ACTION) */
42 int x, y, w, h; /* position and size in screen */
43 int nx, ny; /* position where name is drawn */
44 int nalign; /* align of name: either left-aligned
45 or centered (only if link to another menu) */
46 int vx, vy; /* position where value string is drawn right-aligned */
47 int valign; /* alignment of value string */
48 float alpha; /* alpha of normal font (which vanishes when selected) */
49 float halpha; /* alpha of highlight font */
50 int highlighted; /* keep alpha at 0 (will raise to 255 if not set) */
51 void (*callback)(); /* if value of item has been modified this functions is called */
52 void *link; /* menu link */
53 StkFont *font, *hfont; /* if set use these fonts instead of standard font */
54 Hint *hint; /* if not NULL this hint is displayed when quick-help's enabled:
55 created by item itself */
56 SDL_Surface *bkgnd; /* background surface for item */
57 } Item;
58
59 /*
60 ====================================================================
61 Create item.
62 Return Value: item
63 ====================================================================
64 */
65 Item *item_create_separator( char *name );
66 Item *item_create_range( char *name, char *hint, int *val_int, int min, int max, int step );
67 Item *item_create_switch( char *name, char *hint, int *val_int, char *str_off, char *str_on );
68 Item *item_create_switch_x( char *name, char *hint, int *val_int, char **strings, int count );
69 Item *item_create_key( char *name, char *hint, int *val_int, int *filter );
70 Item *item_create_edit( char *name, char *hint, char *val_str, int limit );
71 Item *item_create_link( char *name, char *hint, void *menu );
72 Item *item_create_action( char *name, char *hint, int item_id );
73 /*
74 ====================================================================
75 Delete item (void pointer for compatiblity when using with list)
76 ====================================================================
77 */
78 void item_delete( void *item );
79 /*
80 ====================================================================
81 Adjust alignment of name and value strings
82 ====================================================================
83 */
84 void item_adjust( Item *item );
85 /*
86 ====================================================================
87 Hide/Show item
88 ====================================================================
89 */
90 void item_hide( Item *item );
91 void item_show( Item *item );
92 /*
93 ====================================================================
94 Update alpha of item
95 ====================================================================
96 */
97 void item_update_alpha( Item *item, int ms );
98 /*
99 ====================================================================
100 Check if position's on item.
101 ====================================================================
102 */
103 int item_focus( Item *item, int x, int y );
104
105 #endif
0 /***************************************************************************
1 lbreakout.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LBREAKOUT_H
18 #define __LBREAKOUT_H
19
20 //#define WITH_BUG_REPORT
21 #define GAME_DEBUG
22
23 /*
24 ====================================================================
25 Global definitions for LBreakout and general system includes.
26 ====================================================================
27 */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <stdarg.h>
33 #include <math.h>
34 #include <time.h>
35 #include "../gui/stk.h"
36 #include "../common/tools.h"
37 #include "../common/list.h"
38 #include "../common/net.h"
39 #include "../common/messages.h"
40 #include "../game/gamedefs.h"
41 #include "misc.h"
42
43 #ifndef M_PI
44 #define M_PI 3.1415926535897932384626433832795f
45 #endif
46
47 /* config directory name in home directory */
48 #ifdef _WIN32
49 #define CONFIG_DIR_NAME "lgames"
50 #else
51 #define CONFIG_DIR_NAME ".lgames"
52 #endif
53
54 /*
55 ====================================================================
56 Alpha of shadow
57 ====================================================================
58 */
59 enum { SHADOW_ALPHA = 128 };
60 /*
61 ====================================================================
62 Number of original backgrounds.
63 ====================================================================
64 */
65 enum { ORIG_BACK_COUNT = 6 };
66
67 /* used to compile net messages */
68 extern char msgbuf[MAX_MSG_SIZE];
69 extern int msglen;
70
71 #endif
0 Version: 1.00
1 Level:
2 Ademir
3 ABC For Fun
4 Bricks:
5 aaaaaaaaaaaaa.
6 a...aaaaaaaaa.
7 a.a.aaaaaaaaa.
8 a.a.a..aaaaaa.
9 a...a.a.aaaaa.
10 a.a.a.a.a...a.
11 a.a.a..aa.aaa.
12 a.a.a.a.a.aaa.
13 aaaaa.a.a.aaa.
14 aaaaa..aa.aaa.
15 caaaaaaaa.aaa.
16 .caaaaaaa...a.
17 ..caacaaaaaaa.
18 ...ca.caaaaaa.
19 ....c..cacaaa.
20 ........c.caa.
21 ...........ca.
22 ............c.
23 Bonus:
24 ..............
25 ......2..0....
26 ...........1..
27 ..............
28 j.............
29 ..............
30 ....j.........
31 ........+.....
32 +..........5..
33 ..0...........
34 ....2.w.j.....
35 ...b...1......
36 ..........}...
37 ........m.....
38 ...........s..
39 ..............
40 ..............
41 ..............
42 Level:
43 Ademir
44 For Fun
45 Bricks:
46 jjjjjjjjjjjjjj
47 jaaajaaajaaajj
48 jajjjajajajajj
49 jajjjajajajajj
50 jaajjajajaaajj
51 jajjjajajaajjj
52 jajjjajajajajj
53 jajjjaaajajajj
54 jjjjjjjjjjjjjj
55 jajajajaajjaaa
56 jajajajajajajj
57 jajajajajajajj
58 jaajjajajajaaa
59 jajajajajajjja
60 jajajajajajjja
61 jajajajaajjaaa
62 jjjjjjjjjjjjjj
63 ..............
64 Bonus:
65 ..............
66 ..............
67 .j..5..51.....
68 ..............
69 ...?..j.......
70 ....+.........
71 ........l...g.
72 ..+...1.......
73 ..........b...
74 .j....g.....j.
75 ..1.5.........
76 .......?......
77 ..........s...
78 ..}.b..b...j..
79 ..............
80 ....m.?.......
81 .w.......w....
82 ..............
83 Level:
84 Ademir
85 Ade
86 Bricks:
87 hjhhhhhhhhhhjh
88 jh..........hj
89 hj.ffffffff.jh
90 jh.ffffffff.hj
91 hj.ffffffff.jh
92 jh.ff....ff.hj
93 hj.ff....ff.jh
94 jh.ff....ff.hj
95 hj.ff....ff.jh
96 jh.ffffffff.hj
97 hj.ffffffff.jh
98 jh.ffffffff.hj
99 hj.ff....ff.jh
100 jh.ff....ff.hj
101 hj.ff....ff.jh
102 jh.ff....ff.hj
103 hj..........jh
104 jhhhhhhhhhhhhj
105 Bonus:
106 ..............
107 ..............
108 ......0.......
109 ...5...?.l....
110 ..............
111 .5............
112 ....0.........
113 .........0....
114 ...j..........
115 .?..&...4.j...
116 .....+........
117 ......gw.&....
118 ...5}....s....
119 .j............
120 ...bj....b....
121 ..............
122 ..............
123 ..............
124 Level:
125 Ademir
126 Brasil
127 Bricks:
128 ..............
129 .!.jjjjjjjj.!.
130 ...jggggjjj...
131 ..jjgggggjjj..
132 .jjjggjjggjjj.
133 ..jjggjjjgjjjj
134 ...jggjjjgjjj.
135 .!.jggjjggjj..
136 ...jggjggjj...
137 ...jggggjjj..!
138 !..jggjggjjj..
139 ...jggjjggjjj.
140 .!.jggjjjgjjjj
141 ...jggjjjgjjj.
142 ..jjggjjggjj..
143 .jjjgggggjj...
144 ..jjggggjjj..!
145 ...jjjjjjjj...
146 Bonus:
147 ..............
148 ..............
149 .....1..j.....
150 ..............
151 ..2...+.......
152 ....j.....<...
153 .....1.*...1..
154 ......?.......
155 ..............
156 ....b.........
157 ........&.>...
158 .......?......
159 .....}........
160 .......?......
161 .....j1...*...
162 ...2..........
163 ....*..w.b....
164 ..............
165 Level:
166 Ademir
167 C...
168 Bricks:
169 hhhhhhhhhhhhhh
170 hhhhhhhhhhhhhh
171 hhhh......hhhh
172 hhhh......hhhh
173 hhhh......hhhh
174 hhhh..hhhhhhhh
175 hhhh..hhhhhhhh
176 hhhh..hhhhhhhh
177 hhhh..hhhhhhhh
178 hhhh..hhhhhhhh
179 hhhh..hhhhhhhh
180 hhhh..hhhhhhhh
181 hhhh..hhhhhhhh
182 hhhh......hhhh
183 hhhh......hhhh
184 hhhh......hhhh
185 hhhhhhhhhhhhhh
186 hhhhhhhhhhhhhh
187 Bonus:
188 ..............
189 .3...?......?.
190 ..............
191 ...........5..
192 .b?...........
193 ...........j..
194 .........3..3.
195 .j-...........
196 ......5.b.l...
197 ..............
198 .5.3..>.......
199 ........<..g3.
200 ..g...........
201 }..........b.j
202 ...b..........
203 ..............
204 .m.....+..w.m.
205 ..w...........
206 Level:
207 Ademir
208 D...
209 Bricks:
210 .aaaaaaaaaaaa.
211 .aaaaaaaaaaaa.
212 .aaiiiiiaaaaa.
213 .aaiiiiiiaaaa.
214 .aaiiiiiiiaaa.
215 .aaiiaaaiiiaa.
216 .aaiiaaaaiiaa.
217 .aaiiaaaaiiaa.
218 .aaiiaaaaiiaa.
219 .aaiiaaaaiiaa.
220 .aaiiaaaaiiaa.
221 .aaiiaaaaiiaa.
222 .aaiiaaaiiiaa.
223 .aaiiiiiiiaaa.
224 .aaiiiiiiaaaa.
225 .aaiiiiiaaaaa.
226 .aaaaaaaaaaaa.
227 .aaaaaaaaaaaa.
228 Bonus:
229 ..............
230 ..0...........
231 ....5..5..5...
232 ...<..........
233 ..>....b......
234 ..........j...
235 .0...b..g.....
236 .0......g.....
237 ..0.s.........
238 ......?..<.*..
239 .*.......<....
240 .....>.....b..
241 .....>.gj.....
242 ..0?....js....
243 ...?..&...5.b.
244 ..}...m&......
245 ...w&b..b.b...
246 ..............
247 Level:
248 Ademir
249 E...
250 Bricks:
251 jjbbbbbbbbbbjj
252 jbbbbbbbbbbbbj
253 jjbbjjjjjjbbjj
254 jbbbjjjjjjbbbj
255 jjbbjjjjjjbbjj
256 bbbbjjbbbbbbbb
257 jjbbjjbbbbbbjj
258 jbbbjjbbbbbbbj
259 jjbbjjjjbbbbjj
260 jbbbjjjjbbbbbj
261 jjbbjjjjbbbbjj
262 bbbbjjbbbbbbbb
263 jjbbjjbbbbbbjj
264 jbbbjjbbbbbbbj
265 jjbbjjjjjjbbjj
266 jbbbjjjjjjbbbj
267 jjbbjjjjjjbbjj
268 bbbbbbbbbbbbbb
269 Bonus:
270 ..............
271 ..............
272 ..............
273 .....>.5.....0
274 j...3.........
275 ..............
276 ....5.........
277 .............l
278 3...j.........
279 .....+*<......
280 ..............
281 ....}.........
282 ..............
283 ....g.........
284 .*...*..-....0
285 j......+......
286 ....b.&w&.....
287 ..............
288 Level:
289 Ademir
290 F...
291 Bricks:
292 b!b!b!b!b!b!b!
293 b!b!b!b!b!b!b!
294 !b!#eeeeee#b!b
295 !b!#eeeeee#b!b
296 b!b#eeeeee#!b!
297 b!b#ee#####!b!
298 !b!#ee#b!b!b!b
299 !b!#ee#b!b!b!b
300 b!b#ee###!b!b!
301 b!b#eeee#!b!b!
302 !b!#eeee#b!b!b
303 !b!#eeee#b!b!b
304 b!b#ee###!b!b!
305 b!b#ee#!b!b!b!
306 !b!#ee#b!b!b!b
307 !b!#ee#b!b!b!b
308 b!b####!b!b!b!
309 b!b!b!b!b!b!b!
310 Bonus:
311 ..............
312 ..............
313 .*..m.w.m.....
314 .w.....}......
315 b.&..+......b.
316 ....2.......&.
317 .....j........
318 .*..?......*..
319 ..............
320 .....b........
321 .?..2.?....?..
322 ....2.........
323 b....j....b...
324 ..&.........&.
325 ....b.........
326 .*.......&.*..
327 w.........w...
328 ..............
329 Level:
330 Ademir
331 Guilherme
332 Bricks:
333 ..............
334 .jjjjjjjjjjjj.
335 .jjddddddddjj.
336 .jjddddddddjj.
337 .jjddddddddjj.
338 .jjddjjjjjjjj.
339 .jjddjjjjjjjj.
340 .jjddjjjjjjjj.
341 .jjddjjjjjjjj.
342 .jjddjjddddjj.
343 .jjddjjddddjj.
344 .jjddjjddddjj.
345 .jjddjjjjddjj.
346 .jjddjjjjddjj.
347 .jjddddddddjj.
348 .jjddddddddjj.
349 .jjddddddddjj.
350 .jjjjjjjjjjjj.
351 Bonus:
352 ..............
353 ..............
354 ......?...?...
355 ..............
356 ........3j....
357 ...?.j.....<..
358 .....3...1....
359 .......+......
360 ..5.......f~..
361 ....s...&.....
362 ......1...l...
363 .......-.>.<..
364 ..jf..g.......
365 ....+..}.s....
366 .....?..j.....
367 ..5.&.m.......
368 ..b........w..
369 ....w...b.....
370 Level:
371 Ademir
372 Lets Play
373 Bricks:
374 jjjjjjjjjjjjjj
375 j#jjjjjjjjjjjj
376 j#j##jjjjjjjjj
377 j#j#j###jjjjjj
378 j#j##j#j##jjjj
379 j###jj#j#jjjjj
380 jjj##j#j##jjjj
381 jjjjjj#jj#jjjj
382 j###jjjj##jjjj
383 j#j##jjjjjjjjj
384 j####j###jjjjj
385 j#jj#j#j##j#jj
386 j#jj#j######jj
387 jjjj###j#j#jjj
388 jjjjjj#j#j#jjj
389 jjjjjjjjjj#jjj
390 jjjjjjjjjjjjjj
391 jjjjjjjjjjjjjj
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 ..............
402 ..............
403 ..............
404 ..............
405 ..............
406 ..............
407 ...w..........
408 ..............
409 ..mbbbbbbm....
410 .w........w...
411 Level:
412 Ademir
413 H...
414 Bricks:
415 xbbbbbbbbbbbbx
416 bxbbbbbbbbbbxb
417 xbbxxbbbbxxbbx
418 bxbxxbbbbxxbxb
419 xbbxxbbbbxxbbx
420 bxbxxbbbbxxbxb
421 xbbxxbbbbxxbbx
422 bxbxxxxxxxxbxb
423 xbbxxxxxxxxbbx
424 bxbxxxxxxxxbxb
425 xbbxxxxxxxxbbx
426 bxbxxbbbbxxbxb
427 xbbxxbbbbxxbbx
428 bxbxxbbbbxxbxb
429 xbbxxbbbbxxbbx
430 bxbxxbbbbxxbxb
431 xbbbbbbbbbbbbx
432 bbbbbbbbbbbbbb
433 Bonus:
434 ..............
435 .5.....*......
436 ...?.w........
437 ....b.....j...
438 ..............
439 .1.+..&...c...
440 .............1
441 ....b..>.b....
442 ...c.?*....&..
443 ........+j....
444 ....5.........
445 .1.p......}...
446 .............1
447 ...*w.&...*...
448 ..............
449 ..&...........
450 ..w........w..
451 ..............
452 Level:
453 Ademir
454 I...
455 Bricks:
456 .....jjjj.....
457 ....jj!!jj....
458 ...jjjjjjjj...
459 ..jjjjaajjjj..
460 .jjjjjaajjjjj.
461 jjjjjjaajjjjjj
462 jjjjjjaajjjjjj
463 jjjjjjaajjjjjj
464 jjjjjjaajjjjjj
465 jjjjjjaajjjjjj
466 jjjjjjaajjjjjj
467 jjjjjjaajjjjjj
468 jjjjjjaajjjjjj
469 .jjjjjaajjjjj.
470 ..jjjjaajjjj..
471 ...jjjaajjj...
472 ....jjaajj....
473 .....jjjj.....
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ....?.........
479 .....j..1111..
480 ..............
481 ...3..........
482 .....3333...l.
483 >.......&.....
484 ...&...j..j&..
485 ..}.?.......s.
486 ..............
487 ...?bbbbbb....
488 ..............
489 ...g.....m....
490 .....w.w......
491 .....dddd.....
492 ..............
493 Level:
494 Ademir
495 J...
496 Bricks:
497 .jjjjjjjjjgjg.
498 .jjjjjjjjjjgj.
499 .jjjjjggjjgjg.
500 .jjjjjggjjjgj.
501 .jjjjjggjjgjg.
502 .jjjjjggjjjgj.
503 .jjjjjggjjgjg.
504 .jjjjjggjjjgj.
505 .jjjjjggjjgjg.
506 .jjjjjggjjjgj.
507 .jjjjjggjjgjg.
508 .jjjjjggjjjgj.
509 .jjjjjggjjgjg.
510 .jjjjjggjjjgj.
511 .jjjjgggjjgjg.
512 .jjggggjjjjgj.
513 .jjgggjjjjgjg.
514 .jjjjjjjjjjgj.
515 Bonus:
516 ..............
517 .........?....
518 .......b......
519 ...b4...*..5..
520 .....j........
521 .......d?.d...
522 ....{.........
523 .....b...~....
524 ...b...b..c5..
525 ..............
526 ....}..gj..?..
527 ..w.b...j.....
528 ..........b...
529 ....b.4.b.....
530 .........*....
531 ...*...d......
532 .....w..?w....
533 ..............
534 Level:
535 Ademir
536 K...
537 Bricks:
538 ..............
539 .!!!!!!!!!!!!.
540 .!!aa!!!!!a!!.
541 .!!aa!!!!aa!!.
542 .!!aa!!!aaa!!.
543 .!!aa!!aaa!!!.
544 .!!aaaaaa!!!!.
545 .!!aaaaa!!!!!.
546 .!!aaaaa!!!!!.
547 .!!aaaaa!!!!!.
548 .!!aaaaa!!!!!.
549 .!!aaaaaa!!!!.
550 .!!aa!!aaa!!!.
551 .!!aa!!!aaa!!.
552 .!!aa!!!!aa!!.
553 .!!aa!!!!!a!!.
554 .!!!!!!!!!!!!.
555 .!!!!!!!!!!!!.
556 Bonus:
557 ..............
558 ..............
559 ..}...........
560 .......1.3....
561 ..?...........
562 ....b3.....s..
563 ..j...m..&....
564 ....?.........
565 ....?.j.>..l..
566 ....13....?...
567 ..}..g...b....
568 ...j...&.b.s..
569 ..............
570 ..m.b.>.j.....
571 ..............
572 ..............
573 ..w..1.m.ww.m.
574 ..............
575 Level:
576 Ademir
577 L Breakout
578 Bricks:
579 jjjjjjjjjjjjjj
580 jjjjjjjjjjjjjj
581 ajjjaajjjjjjja
582 ajjjaajjjjjjja
583 ajjjaajjjjjjja
584 aajjaajjjjjjaa
585 jjjjaajjjjjjjj
586 ajjjaajjjjjjja
587 ajjjaajjjjjjja
588 ajjjaajjjjjjja
589 aajjaajjjjjjaa
590 jjjjaajjjjjjjj
591 ajjjaajjjjjjja
592 ajjjaaaaaajjja
593 ajjjaaaaaajjja
594 aajjaaaaaajjaa
595 jjjjjjjjjjjjjj
596 ..............
597 Bonus:
598 .......>......
599 .0.*.....0....
600 .0...dj.?.....
601 .d.........++.
602 ....b.....&...
603 .0j...<.b.....
604 ..........+...
605 ..>.&b.j.>....
606 .d...b..*?..0.
607 .dw.d...d.....
608 ...<.g.}..b...
609 ..............
610 g..}b...j.....
611 ..&....?...&d.
612 ........j.*...
613 ..*...w....d..
614 ..............
615 ..............
616 Level:
617 Ademir
618 M...
619 Bricks:
620 ..............
621 aaaaaa..aaaaaa
622 a!!!aaaaaa!!!a
623 a!!!!aaaa!!!!a
624 a!!!!aaaa!!!!a
625 a!!!!!aa!!!!!a
626 a!!a!!aa!!a!!a
627 a!!aa!!!!aa!!a
628 a!!aa!!!!aa!!a
629 a!!aaa!!aaa!!a
630 a!!aaaaaaaa!!a
631 a!!aaaaaaaa!!a
632 a!!aaaaaaaa!!a
633 a!!aaaaaaaa!!a
634 a!!aaa..aaa!!a
635 a!!aa....aa!!a
636 aaaa......aaaa
637 ..............
638 Bonus:
639 ..............
640 d.............
641 ...s........&.
642 ..l...555.....
643 ..........j?..
644 .dj.}.s......1
645 1............1
646 1.........}.j1
647 1..bbbbbb....1
648 1.?.d......l..
649 ...j.g.g.j..s.
650 .d..........&&
651 ...b.md}d.b...
652 .j..........m.
653 ...?}w..w.d...
654 ..............
655 .&............
656 ..............
657 Level:
658 Ademir
659 New York
660 Bricks:
661 yyyyyyyyyyyyyy
662 y............y
663 y.ddd.....dd.y
664 y.ddd.....dd.y
665 y.dddd....dd.y
666 y.dddd....dd.y
667 y.dd.dd...dd.y
668 y.dd.dd...dd.y
669 y.dd..dd..dd.y
670 y.dd..dd..dd.y
671 y.dd...dd.dd.y
672 y.dd...dd.dd.y
673 y.dd....dddd.y
674 y.dd....dddd.y
675 y.dd.....ddd.y
676 y.dd.....ddd.y
677 y............y
678 yyyyyyyyyyyyyy
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..2*......l4..
684 ..............
685 ...4.}....j...
686 ..2........2..
687 ..........*...
688 ..&*..b.......
689 ..........bb..
690 ..............
691 ..b&..........
692 d.......g..b..
693 ..*}......j..d
694 ..............
695 .........b.s..
696 ..............
697 .sw*.b.sb.w...
698 Level:
699 Ademir
700 O...
701 Bricks:
702 ..............
703 ..aaaaaaaaaa..
704 ..aaaaaaaaaa..
705 ..aa******aa..
706 ..aa*....*aa..
707 ..aa*....*aa..
708 ..aa*....*aa..
709 ..aa*....*aa..
710 ..aa*....*aa..
711 ..aa*....*aa..
712 ..aa*....*aa..
713 ..aa*....*aa..
714 ..aa*....*aa..
715 ..aa*....*aa..
716 ..aa******aa..
717 ..aaaaaaaaaa..
718 ..aaaaaaaaaa..
719 ..............
720 Bonus:
721 ..............
722 ..5...55...5..
723 ..............
724 ..............
725 ..............
726 ..jd......dj..
727 ..............
728 ..........0...
729 ...0..........
730 ..?........?..
731 ..............
732 ...&......&...
733 ..0...........
734 ..............
735 ..g.......pg..
736 ....d.}}.d....
737 ..............
738 ..............
739 Level:
740 Ademir
741 P...
742 Bricks:
743 ..............
744 ..............
745 .##gggggggg##.
746 .##gggggggg##.
747 .##gggggggg##.
748 .##gg####gg##.
749 .##gg####gg##.
750 .##gggggggg##.
751 .##gggggggg##.
752 .##gggggggg##.
753 .##gg########.
754 .##gg########.
755 .##gg########.
756 .##gg########.
757 .##gg########.
758 .##gg########.
759 .############.
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ..........w...
765 .......m......
766 ....b....b....
767 ..............
768 ...5.....5....
769 ..............
770 ....?.j.5?....
771 ..............
772 ..............
773 ....1.........
774 ..............
775 ...11.........
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Ademir
782 Q...
783 Bricks:
784 .jjjjjjjjjjjj.
785 .jjjjjjjjjjjj.
786 .jjaaaaaaaajj.
787 .jjaaaaaaaajj.
788 .jjaaaaaaaajj.
789 .jjaajjjjaajj.
790 .jjaajjjjaajj.
791 .jjaajjjjaajj.
792 .jjaajjjjaajj.
793 .jjaajjjjaajj.
794 .jjaajjjjaajj.
795 .jjaajjjjaajj.
796 .jjaaaaaaaajj.
797 .jjaaaaaaaajj.
798 .jjaaaaaaaajj.
799 .jjjjjaajjjjj.
800 .jjjjaajjjjjj.
801 .jjjjjjjjjjjj.
802 Bonus:
803 ..............
804 .........j....
805 ..b.......j...
806 ..b...........
807 ..b.<..+......
808 ..b..j.....>..
809 ..b...........
810 ..m...3.g.....
811 ..........5...
812 .......+......
813 ....3....>&...
814 .w...w.4......
815 ...&..........
816 ......j...-s..
817 .m.w.dj..d....
818 ........?.....
819 ...?.......<..
820 ..............
821 Level:
822 Ademir
823 R...
824 Bricks:
825 ..............
826 ..............
827 ...bbbbbbbb...
828 ...bbbbbbbb...
829 ...bbbbbbbb...
830 ...bb.....b...
831 ...bb.....b...
832 ...bbbbbbbb...
833 ...bbbbbbbb...
834 ...bbbbbbbb...
835 ...bbbb.......
836 ...bbbbb......
837 ...bb.bbb.....
838 ...bb..bbb....
839 ...bb...bbb...
840 ...bb....bb...
841 ..............
842 ..............
843 Bonus:
844 ..............
845 ..............
846 ..............
847 ....b.........
848 .......5..b...
849 ...5..........
850 ..........&...
851 ....3.0.......
852 ....?...j.*...
853 ...&..j.......
854 ....0?........
855 ...b..........
856 .......5......
857 ....}....s....
858 ...*..........
859 ..............
860 ..............
861 ..............
862 Level:
863 Ademir
864 S...
865 Bricks:
866 ..............
867 ..yyyyyyyyyy..
868 ..yiiiiiiiiy..
869 ..yiiiiiiiiy..
870 ..yiiiiiiiiy..
871 ..yiiyyyyyyy..
872 ..yiiyyyyyyy..
873 ..yiiyyyyyyy..
874 ..yiiiiiiiiy..
875 ..yiiiiiiiiy..
876 ..yiiiiiiiiy..
877 ..yyyyyyyiiy..
878 ..yyyyyyyiiy..
879 ..yyyyyyyiiy..
880 ..yiiiiiiiiy..
881 ..yiiiiiiiiy..
882 ..yiiiiiiiiy..
883 ..yyyyyyyyyy..
884 Bonus:
885 ..............
886 ..............
887 ..............
888 .....+.&......
889 ....b....j....
890 ....1.........
891 ...d*&........
892 .........+....
893 ...&1..b......
894 ....1.s.d.....
895 .........?l...
896 ..............
897 ..........<...
898 ...&.+........
899 ...*1....j....
900 ......?.......
901 ....b..w.p....
902 ..............
903 Level:
904 Ademir
905 Tiago
906 Bricks:
907 aaaaaaaaaaaaaa
908 a............a
909 a.!!!!!!!!!!.a
910 a.!!!!!!!!!!.a
911 a.!!!!!!!!!!.a
912 a.....!!.....a
913 aaaaa.!!.aaaaa
914 aaaaa.!!.aaaaa
915 aaaaa.!!.aaaaa
916 aaaaa.!!.aaaaa
917 aaaaa.!!.aaaaa
918 aaaaa.!!.aaaaa
919 aaaaa.!!.aaaaa
920 aaaaa.!!.aaaaa
921 aaaaa.!!.aaaaa
922 aaaaa.!!.aaaaa
923 aaaaa....aaaaa
924 aaaaaaaaaaaaaa
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ............+.
930 d.............
931 ..}.....+.....
932 ........d.....
933 .s........2.2.
934 ..............
935 ..j2dd..d.j.s.
936 g.........+...
937 g..2.}........
938 .....}...w.&&.
939 ..&&..........
940 .b..b...}.b.b.
941 ..m........m..
942 ....}.........
943 ......w.......
944 Level:
945 Ademir
946 U...
947 Bricks:
948 jcjcjcjcjcjcjc
949 cjcjcjcjcjcjcj
950 jcj##cjcj##cjc
951 cjc##jcjc##jcj
952 jcj##cjcj##cjc
953 cjc##jcjc##jcj
954 jcj##cjcj##cjc
955 cjc##jcjc##jcj
956 jcj##cjcj##cjc
957 cjc##jcjc##jcj
958 jcj##cjcj##cjc
959 cjc##jcjc##jcj
960 jcj##cjcj##cjc
961 cjc########jcj
962 jcj########cjc
963 cjc########jcj
964 jcjcjcjcjcjcjc
965 cjcjcjcjcjcjcj
966 Bonus:
967 ..............
968 ..+..5.d...l5.
969 ..............
970 .j....2.2...+.
971 ..............
972 ?.2...b.j.....
973 .....d..j...b.
974 .b............
975 ..2...&5......
976 ............}5
977 .}....d<......
978 ........j..&..
979 ..?...5.......
980 .&...........b
981 }.............
982 .b............
983 ..m.........m.
984 .....w...w....
985 Level:
986 Ademir
987 V...
988 Bricks:
989 dddddddddddddd
990 dddddddddddddd
991 ddhhddddddhhdd
992 ddhhddddddhhdd
993 ddhhddddddhhdd
994 ddhhddddddhhdd
995 ddhhddddddhhdd
996 ddhhddddddhhdd
997 ddhhddddddhhdd
998 ddhhddddddhhdd
999 ddhhddddddhhdd
1000 ddhhddddddhhdd
1001 ddhhhddddhhhdd
1002 dddhhhddhhhddd
1003 ddddhhhhhhdddd
1004 dddddhhhhddddd
1005 ddddddhhdddddd
1006 dddddddddddddd
1007 Bonus:
1008 ..............
1009 ....?.........
1010 ..?...g.j..2..
1011 ...2..........
1012 .2s......db.s.
1013 ....2b.?......
1014 .?......?....2
1015 ...2*......*.2
1016 .d....?2.j....
1017 s.j...?.p.....
1018 ..........4.s.
1019 .+.bbbbbbb....
1020 ...........&..
1021 ..&.......d...
1022 .b...?..+...2.
1023 .......g......
1024 ..*...p....*..
1025 ....w....w....
1026 Level:
1027 Ademir
1028 W...
1029 Bricks:
1030 ..............
1031 ..............
1032 ..............
1033 .bb........bb.
1034 .bb........bb.
1035 .bb........bb.
1036 .bb........bb.
1037 .bb........bb.
1038 .bb........bb.
1039 .bb........bb.
1040 .bb...bb...bb.
1041 .bb..bbbb..bb.
1042 .bb.bbbbbb.bb.
1043 .bbbbb..bbbbb.
1044 ..bbb....bbb..
1045 ...b......b...
1046 ..............
1047 ..............
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 ..p........p..
1054 .3..........3.
1055 ..............
1056 ..j........1..
1057 ..............
1058 .1?.........+.
1059 ......s....j..
1060 .3............
1061 ..&...*g.?..s.
1062 ....&...b.....
1063 ..w......&.w..
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Ademir
1069 X...
1070 Bricks:
1071 a............a
1072 ba..........ab
1073 aba........aba
1074 .aba......aba.
1075 ..aba....aba..
1076 ...abaaaaba...
1077 ....abbbba....
1078 .....aaaa.....
1079 .....abba.....
1080 ....abaaba....
1081 ...aba..aba...
1082 ..aba....aba..
1083 .aba......aba.
1084 aba........aba
1085 ba..........ab
1086 a............a
1087 ..............
1088 ..............
1089 Bonus:
1090 ..............
1091 .3..........b1
1092 ..............
1093 ..?........?..
1094 ...dj.....<...
1095 .......1.s....
1096 .....*5.d.....
1097 .......s......
1098 .....b<.......
1099 .....b.w+.....
1100 ....*....j....
1101 .........?....
1102 ...3.......5..
1103 .b............
1104 ..............
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Ademir
1110 Y...
1111 Bricks:
1112 jjjjjjjjjjjjjj
1113 jjjjjjjjjjjjjj
1114 jjjjjjjjjjjjjj
1115 jj##jjjjjj##jj
1116 jj##jjjjjj##jj
1117 jj###jjjj###jj
1118 jj####jj####jj
1119 jjj########jjj
1120 jjjj######jjjj
1121 jjjjj####jjjjj
1122 jjjjjj##jjjjjj
1123 jjjjjj##jjjjjj
1124 jjjjjj##jjjjjj
1125 jjjjjj##jjjjjj
1126 jjjjjj##jjjjjj
1127 jjjjjj##jjjjjj
1128 jjjjjj##jjjjjj
1129 jjjjjjjjjjjjjj
1130 Bonus:
1131 ..............
1132 ..............
1133 .....5555.....
1134 1............1
1135 1............1
1136 ..............
1137 d............d
1138 d.s........s.d
1139 ..............
1140 ....+....+....
1141 ..............
1142 .jj..g..g..jj.
1143 ...&......&...
1144 .....<..<.....
1145 .bbb.}..}.bbb.
1146 ..............
1147 ..m........m..
1148 ....w....w....
1149 Level:
1150 Ademir
1151 Z...
1152 Bricks:
1153 ..............
1154 ..bbbbbbbbbb..
1155 ..byyyyyyyyb..
1156 ..byyyyyyyyb..
1157 ..byyyyyyyyb..
1158 ..bbbbbbyyyb..
1159 ..bbbbbbyyyb..
1160 ..bbbbbyyyyb..
1161 ..bbbbyyyybb..
1162 ..bbbyyyybbb..
1163 ..bbyyyybbbb..
1164 ..byyyybbbbb..
1165 ..byyybbbbbb..
1166 ..byyybbbbbb..
1167 ..byyyyyyyyb..
1168 ..byyyyyyyyb..
1169 ..byyyyyyyyb..
1170 ..bbbbbbbbbb..
1171 Bonus:
1172 ..............
1173 ..............
1174 ...*.0..0.....
1175 ....05.5......
1176 .........g....
1177 ..............
1178 ........?1b...
1179 ..............
1180 ......0..w....
1181 .......*......
1182 .....1........
1183 ...b..........
1184 ....?.........
1185 ....?.........
1186 ...*.&........
1187 ....b.w.+b....
1188 ...w...b*.w...
1189 ..............
1190 Level:
1191 Ademir
1192 ABC For Fun
1193 Bricks:
1194 ..............
1195 jjj.j.j.jjj...
1196 .j..j.j.j.....
1197 .j..jjj.jj....
1198 .j..j.j.j.....
1199 .j..j.j.jjj...
1200 ..............
1201 jjj.j...j.jj..
1202 j...jj..j.j.j.
1203 jj..j.j.j.j.j.
1204 j...j..jj.j.j.
1205 jjj.j...j.jj..
1206 ..............
1207 ..............
1208 ..............
1209 ..............
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..............
1219 ..............
1220 ..........b...
1221 ..............
1222 ..............
1223 ..............
1224 .b......b.....
1225 ..............
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 ..............
1231 Level:
1232 Ademir
1233 ABC For Fun
1234 Bricks:
1235 cccccc..!..aaa
1236 ###cccc..!..aa
1237 c#cccccc..!..a
1238 c###ccccc..!..
1239 c##ccccccc..!.
1240 c##c#c#cccc..!
1241 cc#c#c#ccccc..
1242 cc########ccc.
1243 .ccc#c##c#cccc
1244 ..cc#c#####c#c
1245 !..cccc#c##c#c
1246 .!..ccc#c##c#c
1247 ..!..ccccc#c#c
1248 a..!..cccc###c
1249 aa..!..ccccccc
1250 aaa..!..cccccc
1251 aaaa..!..ccccc
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ....b.........
1257 .......m......
1258 ..............
1259 ..............
1260 j.............
1261 ..........b...
1262 ..............
1263 ..b...........
1264 .....m........
1265 ..............
1266 ......j.+.....
1267 ..............
1268 ..............
1269 .m.....ww..m..
1270 ..............
1271 ..............
1272 Level:
1273 Ademir
1274 ABC For Fun
1275 Bricks:
1276 ..............
1277 ..............
1278 ..............
1279 ..............
1280 ..............
1281 ..............
1282 ..............
1283 ..............
1284 ..............
1285 ..............
1286 ..............
1287 ..............
1288 ..............
1289 ..............
1290 ..............
1291 ..............
1292 ..............
1293 ..............
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 ..............
1301 ..............
1302 ..............
1303 ..............
1304 ..............
1305 ..............
1306 ..............
1307 ..............
1308 ..............
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Ademir
1315 ABC For Fun
1316 Bricks:
1317 ..............
1318 ..............
1319 ..............
1320 ..............
1321 ..............
1322 ..............
1323 ..............
1324 ..............
1325 ..............
1326 ..............
1327 ..............
1328 ..............
1329 ..............
1330 ..............
1331 ..............
1332 ..............
1333 ..............
1334 ..............
1335 Bonus:
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ..............
1346 ..............
1347 ..............
1348 ..............
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 ..............
0 Level:
1 Latts
2 AFL
3 Bricks:
4 ..............
5 ..............
6 dddd.ggg!.j...
7 dddd.gEEg.j...
8 d..d.g....j...
9 d..d.!....j...
10 d..d.g.vv.j.vv
11 dccd.g....j...
12 dddd.ggg..j...
13 dddd.ggg..j...
14 d..d.gcc..j...
15 d..d.g....j...
16 d..d.g.vv.j!cc
17 d..!.g....jjjj
18 d..d.g....jjjj
19 ..............
20 fzfzfzfzfzfzfz
21 ..............
22 Bonus:
23 ..............
24 ..............
25 b..3..........
26 .....0....0...
27 ..............
28 ..............
29 3..s.1.1....2.
30 ...?......s...
31 *..+..........
32 .10.......3...
33 .....~0.......
34 <....3....?...
35 .....>.2....0.
36 0.............
37 ...<.-....0.>.
38 ..............
39 ..s-f..>..+...
40 ..............
41 Level:
42 Latts
43 Adelaide Crows
44 Bricks:
45 hhggddhhg!ddhh
46 hh!g*dhhgg*dhh
47 hhggddhhggddhh
48 hhgEddhhEgddhh
49 hhggddhhggddhh
50 hhggddhhggddhh
51 hhggddhhggddhh
52 hhEgddhhgEddhh
53 hhggddhhggddhh
54 hhggddhh!gddhh
55 hhggddhhggd*hh
56 hhgEddhhEgddhh
57 hhggddhhggddhh
58 hh!gddhhggddhh
59 hhggddhhggddhh
60 hhEgddhhgEddhh
61 hhggddhhggddhh
62 hhggddhhggddhh
63 Bonus:
64 b...5.*......1
65 ...?.1j.&.....
66 2..3....1..2..
67 ......>.......
68 ..0.1.2..j.?0.
69 .0....f2..2...
70 2wcW......>4.2
71 ....+.1&......
72 0...0.....5.0f
73 p.d......3...1
74 5..3..0..<....
75 .{.....1.d!.?g
76 ......0....0..
77 ~..2}........l
78 40f....?f....1
79 ....1...0..4..
80 .......1.0....
81 ...1>.2.+.....
82 Level:
83 Latts
84 Brisbane Lions
85 Bricks:
86 hgggghgggggggh
87 hggghhhggggggh
88 hgghhhhggggggh
89 hgghhhgggggggh
90 hEEEhhhhhhheEh
91 iiiihhhhhiiiii
92 iiihhhhhhiiiii
93 iiihihihhhiiii
94 iiihihihiihiii
95 iiiihihhihiiii
96 #iiiiiiiiiiii#
97 i#iiiiiiiiii#i
98 ii##iiiiii##ii
99 iiiiiiiiiiiiii
100 iiiiiiiiiiiiii
101 iiiiiiiiiiiiii
102 iiiiiiiiiiiiii
103 iiiiiiiiiiiiii
104 Bonus:
105 ..........s>..
106 .0.?..-.<.3.-.
107 ....Wf........
108 ~.l3.....2&.g.
109 .......1...0..
110 ..+..4....0..~
111 *1.-...2......
112 ...>...W.2.{.?
113 ..2.{.j.......
114 w.2......2...1
115 .0.....5..>.-.
116 ...f.4...f....
117 ........~1....
118 ..01<W........
119 ....3.-..W...5
120 -....2....0...
121 3....2..+.....
122 ..+.<.........
123 Level:
124 Latts
125 Carlton Blues
126 Bricks:
127 aaaaaajjjjcEaa
128 a!aaaajjjjaaa!
129 aaaa!Ejaaaaaaa
130 aaajjjjjjjjaaE
131 Eajjaajaaaajaa
132 acjaaajaaEaaaa
133 aajaajjjjaaaaa
134 aajajajaEja!aa
135 aajaj!jaaaaaaa
136 acjajajjjcaaca
137 !ajcjajaEaaaaa
138 aEjajajcajaEaE
139 aajaajjjjaaaaa
140 aajE!ajaaaaaaa
141 aajjaajEa!aja!
142 aaajjjjjjjjaaa
143 aaaaaajaaaa!aa
144 aaaaaajaaaaaaa
145 Bonus:
146 +..2-...w...2.
147 .....*?1......
148 .1.......3?...
149 ?.......-.....
150 .-.1<....0.0<+
151 ..g..+.>......
152 ......0.......
153 ............g.
154 1.30..51...-0.
155 .0...........0
156 ..>..........-
157 .....j?...0.3.
158 .-..-......s..
159 .....0....~...
160 ..w<.1..-.....
161 .0.+..g....1.-
162 .....1...0....
163 ..............
164 Level:
165 Latts
166 Collingwood Magpies
167 Bricks:
168 jj..jj..jj.vjj
169 jj..jj..jj..jj
170 jj.vjj..jj..jj
171 jj..jjv.jj..jj
172 jj..jj..jj..jj
173 jj..jj..jj..jj
174 jjv.jj.vjjv.jj
175 jj..jj..jj..jj
176 jj..jj..jj..jj
177 jj.vjjv.jj..jj
178 jj..jj..jj.vjj
179 jjv.jj.vjj..jj
180 jj..jj..jj..jj
181 jj..jj..jjv.jj
182 jj.vjj.vjj..jj
183 jj..jj..jjv.jj
184 jjv.jj..jj..jj
185 jj..jjv.jj.vjj
186 Bonus:
187 .....5........
188 4.............
189 ........2.....
190 s....?s.....+.
191 ........+...4.
192 .4......>....0
193 ............m.
194 +-..0....-...>
195 .....c........
196 1.....0.......
197 1...>...{...1.
198 .{......j.....
199 ..............
200 0.......b....0
201 ........-.....
202 .....2...1..-?
203 ..............
204 .>..+-........
205 Level:
206 Latts
207 Essendon Bombers
208 Bricks:
209 ............vd
210 ............dd
211 .vv.......vddd
212 .vv.......dddd
213 .vv.....vddddd
214 .vv.....ddddd#
215 .vv...vddddd##
216 ......ddddd###
217 ....vddddd.vvv
218 vvv.dddddv....
219 ###ddddd......
220 ##dddddv...vv.
221 #ddddd.....vv.
222 dddddv.....vv.
223 dddd.......vv.
224 dddv.......vv.
225 dd............
226 dv............
227 Bonus:
228 .............j
229 ..............
230 ..1.......5...
231 ..>........p.0
232 .1.......~.4..
233 ............l.
234 ..1...c.0.1+..
235 .......W..>...
236 ....34.......g
237 .&...?1f-d....
238 ....0..d......
239 ...3..>3...b..
240 ....{+........
241 ...1........?.
242 -0.<..........
243 ..-........>..
244 ..............
245 m.............
246 Level:
247 Latts
248 Fremantle Dockers
249 Bricks:
250 ffffffvvdddddd
251 ffffff..dddddd
252 ffffff..dddddd
253 ffffffvvdddddd
254 ffffff..dddddd
255 ffffff..dddddd
256 ffffffvvdddddd
257 ffffff..dddddd
258 ...fff..ddd...
259 ..ffffvvdddd..
260 v..fff..ddd..v
261 .v.fff..ddd.v.
262 .iv..fvvd..vi.
263 ii.v.f..d.v.ii
264 iii.v....v.iii
265 iiiivvvvvviiii
266 iiiii....iiiii
267 iiiiii..iiiiii
268 Bonus:
269 ......{...b...
270 ........3..d..
271 -.3......0..+-
272 .....<.-?.....
273 <...+....-.<..
274 ...d1....j..0.
275 .{....5.......
276 ...-....2.....
277 ....0.....>...
278 ..1....s.1....
279 ....>...?0...<
280 .d.......d....
281 ..0...0....-..
282 ...1....0....>
283 0.p.4......1..
284 ...-.2+<-...3.
285 ..>...........
286 .....?..w.....
287 Level:
288 Latts
289 Geelong Cats
290 Bricks:
291 aaaaaaaaaaaaaa
292 aaaaaaaaaaaaaa
293 EaaaaaaaaaaaaE
294 jjjjjjjjjjjjjj
295 jjjjjjjjjjjjjj
296 jjjjjjjjjjjjjj
297 aaaaaaaaaaaaaa
298 aaaaaaaaaaaaaa
299 EEaaaaaaaaaaEE
300 jjjjjjjjjjjjjj
301 jjjjjjjjjjjjjj
302 jjjjjjjjjjjjjj
303 aaaaaaaaaaaaaa
304 aaaaaaaaaaaaaa
305 EEEaaaaaaaaEEE
306 jjjjjjjjjjjjjj
307 jjjjjjjjjjjjjj
308 jjjjjjjjjjjjjj
309 Bonus:
310 ....s..W.....4
311 ?.-...0.~1....
312 .W.3.....-.>..
313 ..........s..*
314 .0.f.g.>...{+.
315 ..+.d.......0.
316 b....c...d0?sj
317 5p..1.41.....l
318 ..-<...!...<..
319 0.>2.....2..W.
320 .....W.....fm2
321 d4.d.f.....d..
322 ...{..0.<..0..
323 .f.+<.~..>f.d5
324 ....W...W.....
325 ....2-...1dw..
326 .1............
327 f..<...3..-...
328 Level:
329 Latts
330 Hawthorn Hawks
331 Bricks:
332 @hh@hh@hh@hh@h
333 @hh@hh@hh@hh@h
334 @hh@hh@hh@hh@h
335 @hh@hh@hh@hh@h
336 @hh@hh@hh@hh@h
337 @hh@hh@hh@hh@h
338 @hh@hh@hh@hh@h
339 @hh@hh@hh@hh@h
340 @hh@hh@hh@hh@h
341 @hh@hh@hh@hh@h
342 @hh@hh@hh@hh@h
343 @hh@hh@hh@hh@h
344 @hh@hh@hh@hh@h
345 @hh@hh@hh@hh@h
346 @hh@hh@hh@hh@h
347 @hh@hh@hh@hh@h
348 @hh@hh@hh@hh@h
349 @hh@hh@hh@hh@h
350 Bonus:
351 .......5......
352 .0......&..+..
353 ....0>..s.-s..
354 ..>....0...2..
355 ..?....2.....+
356 .3<..s.<}.>...
357 ..c.1..w...-.0
358 ....b..>..w0.m
359 .1..0..0..}...
360 ..c.W~..c.14..
361 .lw.<..+...<.1
362 .bj.-3..-..0..
363 .-<.!s..<.g...
364 .0&.2...1..c.c
365 .....?.cW.>..?
366 ..c.{.........
367 .+>.+>..1.....
368 ....w-.~..b+.+
369 Level:
370 Latts
371 Kangaroos
372 Bricks:
373 jjggjjggjjggjj
374 jjggjjggjjggjj
375 jjggjjggjjggjj
376 jjggjjggjjggjj
377 jjggjjggjjggjj
378 jjggjjggjjggjj
379 jjggjjEEjjggjj
380 jjggjj..jjggjj
381 jjggjvvgjjggjj
382 jjggv..gjjggjj
383 jjggjvvgjjggjj
384 jjggjjvvjjggjj
385 jjggjv..vjggjj
386 EEggggg..vggEE
387 ggggggvvvvgggg
388 gggggv.ggvgggg
389 gggg.vggg..vgg
390 ..............
391 Bonus:
392 00000000000000
393 0..<.-..-.<..0
394 0.{........{.0
395 0...?....?...0
396 0..+c>ff..>..0
397 0}!...l+>...}0
398 0>.j~.....g!.0
399 0.......>....0
400 0-..!.......-0
401 0..?....!.?..0
402 0...>......>+0
403 0>.f....>.f..0
404 0............0
405 ..-.>.w....-..
406 ~..<......<>.~
407 ..............
408 ..............
409 ..............
410 Level:
411 Latts
412 Melbourne Demons
413 Bricks:
414 dddddddddddddd
415 dddddddddddddd
416 dddddddddddddd
417 dddddddddddddd
418 dddddddddddddd
419 dddddddddddddd
420 adddddddddddda
421 EEddddddddddEE
422 aaaddddddddaaa
423 aaaaddddddaaaa
424 EEEEEddddEEEEE
425 aaaaaaddaaaaaa
426 aaaaaaaaaaaaaa
427 EEEEEEEEEEEEEa
428 aaaaaaaaaaaaaa
429 aaaaaaaaaaaaaa
430 aaaaaaaaaaaaaa
431 aEEEEEEEEEEEEE
432 Bonus:
433 4...4..-.40..4
434 ...1......fp..
435 .W-.p.0.1...-.
436 ..d.......W..0
437 1..-.s-...-1d.
438 ..?....f......
439 ..0<.2...s<.1.
440 ..............
441 .-.....d.-....
442 1...f.2...0...
443 ..............
444 .p<.s....<?.s.
445 w.f.w0..2.w1..
446 .............1
447 .bbbbbbbbbbbb.
448 1.0.<...2s<...
449 .w.w.w.w.w.w.w
450 w.............
451 Level:
452 Latts
453 Port Adelaide Power
454 Bricks:
455 Egggg!gggggjjE
456 bbgagbbgbgjjj!
457 ggbgagg!gjjjgb
458 gag!gbggjjjaga
459 !gbgbggjjjg!gg
460 EbEaggjjjggEaE
461 ccccccjjcccccc
462 .....jj.jjj...
463 .....jjj.jj...
464 .....jj.jjj...
465 ###.....jj.###
466 .......jj.....
467 ......jj......
468 ......jj......
469 .....jj.......
470 .....jj.......
471 ....jj........
472 ....j.........
473 Bonus:
474 .>..?...W..?..
475 ..-0..+..0..b.
476 ........-.....
477 -.....?p......
478 ..+........-0.
479 ......-..>....
480 .b0.W........0
481 ........0.0...
482 .....>........
483 ......-.......
484 ........-.....
485 ..............
486 ..............
487 ......0.......
488 ..............
489 ..............
490 ..............
491 ....0.........
492 Level:
493 Latts
494 Richmond Tigers
495 Bricks:
496 ............hh
497 ...........hhh
498 .vvv......hhhh
499 .v.......hhhhh
500 .v......hhhhhh
501 .......hhhhhhh
502 ......hhhhhhh.
503 #####hhhhhhhv.
504 .vvvhhhhhhhvv.
505 .vvhhhhhhhvvv.
506 .vhhhhhhh#####
507 .hhhhhhh......
508 hhhhhhh.......
509 hhhhhh......v.
510 hhhhh.......v.
511 hhhh......vvv.
512 hhh...........
513 hh............
514 Bonus:
515 ............m.
516 ..............
517 ..p.......+.?.
518 .w.......<.w..
519 ........20...-
520 ...........b..
521 ......+.?.-...
522 .....-.-.4....
523 .<1...s.....c.
524 ...g..3!j>.2..
525 ...p>...f.....
526 ..s..-<.......
527 0.12.0........
528 +f..Ws........
529 4..>0.........
530 w0........c...
531 .<-...........
532 ..............
533 Level:
534 Latts
535 St Kilda Saints
536 Bricks:
537 dd*ddv..vdd*dd
538 ddddd....ddddd
539 dddddv..vddddd
540 ddddd....ddddd
541 dddddv..vddddd
542 ddddd....ddddd
543 dddddv##vddddd
544 v.v.v.##.v.v.v
545 ....######....
546 ......##......
547 .v.v.v##v.v.v.
548 jjjjjv..vjjjjj
549 jjjjj....jjjjj
550 jjjjjv..vjjjjj
551 jjjjj....jjjjj
552 jjjjjj..jjjjjj
553 jjjjjjvvjjjjjj
554 jjjjjjjjjjjjjj
555 Bonus:
556 *.........1...
557 .+.5..........
558 .>......p.>3W.
559 .-............
560 3.?..c...f....
561 ....1....0-..4
562 W....4.....!..
563 ..............
564 ..............
565 ..............
566 ........4.....
567 ..b01.......?1
568 .4..>.....1...
569 w..d....>....+
570 ..1.......-...
571 f.W.....d....f
572 ...3-......4..
573 ........+.....
574 Level:
575 Latts
576 Sydney Swans
577 Bricks:
578 djjjjjjjjjjjjd
579 ddjjjjjjjjjjdd
580 ddjjjjjjjjjjdd
581 ddjjjjjjjjjjdd
582 dddjjjjjjjjddd
583 dddjjjjjjjjdd*
584 ddddjjjjjjdddd
585 *dddjjjjjjdddd
586 jdddjjjjjjdddj
587 jddddjjjjddddj
588 jddddjjjjddddj
589 jjddddjjddddjj
590 jjddddddddddjj
591 jjjdjddjdjdjjj
592 jjjjddjddjjjjj
593 jjjjjjdjjdjjjj
594 jjjjdjd*jjjjjj
595 jjjjjjdjdjjjjj
596 Bonus:
597 f...4..w.5....
598 .....f.....2..
599 ..-....4..>...
600 3.>.<...+.....
601 ....2..f..-..f
602 {.0........}..
603 ....~.....<...
604 ..<..0&.00..+.
605 +.....!...>2..
606 &~fg......g...
607 .......0......
608 ......>...0f..
609 -0...-.f....l-
610 .>.4..5.~.+...
611 <...........0<
612 .+3<.f+.......
613 ...w.....s...3
614 ...........-..
615 Level:
616 Latts
617 West Coast Eagles
618 Bricks:
619 ggggghhhhggggg
620 ggggghhhhggggg
621 gggghhhhhhgggg
622 gggghhhhhhgggg
623 ggghhhgghhhggg
624 ggghhhgghhhggg
625 gghhhhgghhhhgg
626 gghhhEEEEhhhgg
627 ghhhhgggghhhhg
628 hhhhgggggghhhh
629 hhhgggggggghhh
630 hhgggghEgggghh
631 hgggghEhgggggh
632 gggggEhhhggggg
633 ggggEhhhgggggg
634 gggggghghggggg
635 gggggggggggggg
636 gggggggggggggg
637 Bonus:
638 .....?1...4.+.
639 1.b....{2j?.0.
640 .....0.f......
641 .1<.<.+..W..>5
642 >..W...>..f1..
643 5~..s...0....f
644 ...?.4.l..>..-
645 -.3}......-...
646 .0.g...5..f5.3
647 .>.~..<..{...0
648 .f...0.2!.0...
649 5<.2+.s...~.1.
650 ..W..f.d......
651 .........-.<..
652 .0.....f~.0.W.
653 ...1>0........
654 ...f.<2......s
655 dd-d..?..+.2>.
656 Level:
657 Latts
658 Western Bulldogs
659 Bricks:
660 jjjjjjjjjjjjjj
661 dddddddddddddd
662 dddddddjjjdddd
663 dddddddjjjdddd
664 dddddjjjjjjddd
665 ddddjj@jjjjjdd
666 dddjj@@jjjjjjd
667 gggjjjjjjjjjjg
668 ggggggggggjjjg
669 ggggjjjjjggjjg
670 ggggjgjjjjgjjg
671 ggEgggggjjggjg
672 gEgggggggjgggg
673 EgggjggggjjEgg
674 ggggjgjgggjgEg
675 ggggjjjjgggggE
676 ggggggjjjggggg
677 gggggggggggggg
678 Bonus:
679 +.c.>.gd..W..s
680 .0......0.....
681 }..0-.4.?....-
682 ...W......>W.4
683 ?......-.2.0..
684 ....2b.W......
685 0.d.>...0d4...
686 .-....-.....j.
687 ........{....?
688 ...........<..
689 ....&...20d.0.
690 .~.2W.0..+...d
691 5..d.......f..
692 ..f..4...<..l.
693 ....p.0......5
694 .0.-.>....4...
695 .......W......
696 ...<..........
697 Level:
698 Latts
699 MCG
700 Bricks:
701 ..............
702 ....ffffff....
703 ...ffffffff...
704 ..ffffgdffff..
705 .gffxfgdfxffg.
706 ffgfyffffyfgff
707 jffgffffffgffj
708 fffgffffffgfff
709 jjfgfjjjjfgfjj
710 fffgfjddjfgfff
711 jjfgfjjjjfgfjj
712 fffgffffffgfff
713 jffgffffffgffj
714 ffgfyffffyfgff
715 .gffxfdgfxffg.
716 ..ffffdgffff..
717 ...ffffffff...
718 ....ffffff....
719 Bonus:
720 ..............
721 ....d.5W.d....
722 ......<.......
723 ......2.......
724 ........3.....
725 ..?...........
726 .....j.......?
727 ......0.0.....
728 ....+...<.&.>.
729 4.{.1.bb.1...4
730 .>fl.?....}s..
731 .....0.0......
732 ..............
733 .+..~.>....+..
734 .......W......
735 ..............
736 ...3....2.....
737 ....d.W..d....
738 Level:
739 Latts
740 www.afl.com.au
741 Bricks:
742 vv...djjd...vv
743 v..dddddddd..v
744 ..dddddddddd..
745 .dhhhdhhhdhdd.
746 ddhdhdhdddhddd
747 ddhhhdhhhdhddd
748 ddhdhdhdddhhhd
749 dddddddddddddd
750 ##############
751 dddddddddddddd
752 ddhhhdhhhdhdhd
753 ddhdddhdhdhhhd
754 ddhdddhdhdhdhd
755 hdhhhdhhhdhdhd
756 .dddddddddddd.
757 ..dddddddddd..
758 v..dddddddd..v
759 vv...dddd...vv
760 Bonus:
761 5............5
762 ..............
763 .........1....
764 ..>.0...df....
765 ...f-..>......
766 .0...1..5.-.0.
767 .0.0.12...2...
768 .4.d....0..{..
769 WWWWWWWWWWWWWW
770 .....0.....d.>
771 4.{0...1...1..
772 .....>0m2.>.4.
773 1.>0...-.f....
774 .....5..0..0..
775 ...-..1.d.2...
776 .....2..4.....
777 ...f...f......
778 5.....0......5
779
0 Version: 1.00
1 Level:
2 Daddy
3 Number 1
4 Bricks:
5 **..........**
6 **......**..**
7 ........**....
8 ..v...v....v..
9 ..v...v....v.*
10 ..v...v....v.*
11 ..v...v....v.*
12 ..vvvvvvvvvv.*
13 ..v..........*
14 ..v...........
15 ..v...........
16 ..v...........
17 *.v..vvvvvvvvv
18 *.v..v........
19 *.v..v.......*
20 *.v..v.......*
21 *.v..vvvvvvv.*
22 *.v..........*
23 Bonus:
24 ww..........ww
25 ww......ww..ww
26 ........ww....
27 ..0...0....0..
28 ..0...0....0.+
29 ..0...0....m.+
30 ..0...m....0.+
31 ..0m000000b0.+
32 ..0..........+
33 ..0...........
34 ..0...........
35 ..0...........
36 +.0..1l11111m1
37 +.0..1........
38 +.0..m.......+
39 +.0..1.......+
40 +.b..1l111bb.+
41 +.b..........+
42 Level:
43 Daddy
44 Number 2
45 Bricks:
46 vvvvvvvvvvvvvv
47 vxvvxvvxvvxvvx
48 vvvvvvvvvvvvvv
49 ..............
50 !!!!!!!!!!!!!!
51 **************
52 ..............
53 !!!!!!!!!!!!!!
54 **************
55 ..............
56 !!!!!!!!!!!!!!
57 **************
58 ..............
59 !!!!!!!!!!!!!!
60 **************
61 ..............
62 !!!!!!!!!!!!!!
63 **************
64 Bonus:
65 55555555555555
66 5l55l55l55l55l
67 55555555555555
68 ..............
69 44444444444444
70 wwwwwwwwwwwwww
71 ..............
72 33333333333333
73 ++++++++++++++
74 .dddddddddddd.
75 22222222222222
76 wwwwwwwwwwwwww
77 bbddddddddddbb
78 11111111111111
79 ++++++++++++++
80 bb.dddddddd*bb
81 00000000000000
82 wwwwwwwwwwwwww
83 Level:
84 Daddy
85 Number 3
86 Bricks:
87 ####*####*####
88 #.!#*#vv#*#!.#
89 #..#*#vv#*#..#
90 #..#*#vv#*#..#
91 #!.#*#vv#*#.!#
92 #..#*#vv#*#..#
93 #..#*#vv#*#..#
94 #.!#*#vv#*#!.#
95 #..#*#vv#*#..#
96 #..#*#vv#*#..#
97 #!.#*#vv#*#.!#
98 #..#*#vv#*#..#
99 #..#*#vv#*#..#
100 #.!#*#vv#*#!.#
101 #..#*#vv#*#..#
102 #..#*#vv#*#..#
103 #!.#*#vv#*#.!#
104 #..#*####*#..#
105 Bonus:
106 2222&2222&2222
107 2}&2m2~~2m2&}2
108 2}}2.2}}2.2}}2
109 2{{2.2~~2.2{{2
110 2&{2.2}}2.2{&2
111 2{{2.2~~2.2{{2
112 2}}2.2}}2.2}}2
113 2}&2.2552.2&}2
114 2}}2w2ll2w2}}2
115 2{{2w2ll2w2{{2
116 2&{2w2552w2{&2
117 2{{2w2}}2w2{{2
118 2}}2w2~~2w2}}2
119 2}&2w2}}2w2&}2
120 2}}2w2~~2w2}}2
121 2bb2w2}}2w2bb2
122 2&+2w2~~2w2+&2
123 2++2d++++d2++2
124 Level:
125 Daddy
126 Number 4
127 Bricks:
128 iiivivviivivvi
129 ivivivvivvivvi
130 ivivivvivvivvi
131 ivivivvivvviiv
132 iiivivviivviiv
133 ivivivvivvviiv
134 ivivivvivvivvi
135 ivivivvivvivvi
136 iviviiviivivvi
137 vvvvvvvvvvvvvv
138 ..v..v..v..v..
139 *.v..v..v..v.*
140 *.v..v..v..v.*
141 *.v..v..v..v.*
142 *.v..v..v..v.*
143 *.v..v..v..v.*
144 *.v..v..v..v.*
145 *.v..v..v..v.*
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 .l...l..l...l.
154 --------------
155 g*g*gg*gg*g**g
156 wwgwwgwwgwwgww
157 ..}..}..}..}..
158 +.}..}..}..}.+
159 +............+
160 +.b..}..}..b.+
161 +.b..}..}..b.+
162 +.w..w..w..w.+
163 +.w..w..w..w.+
164 +.w..w..w..w.+
165 Level:
166 Daddy
167 Number 5
168 Bricks:
169 **************
170 **************
171 **************
172 **************
173 **************
174 *****....*****
175 *****.zz.*****
176 *****.zz.*****
177 *****.zz.*****
178 *****.zz.*****
179 *****.zz.*****
180 *****.zz.*****
181 *****....*****
182 **************
183 **************
184 **************
185 **************
186 **************
187 Bonus:
188 0bb00++++00bb0
189 01111111111110
190 0ll22222222ll0
191 01233333333210
192 01234444443210
193 01234....43210
194 01234.ll.43210
195 01234.mm.43210
196 01234.**.43210
197 01234.mm.43210
198 01234.**.43210
199 01234.mm.43210
200 01234....43210
201 01234555543210
202 01234555543210
203 wwwwwwwwwwwwww
204 wwwwwwwwwwwwww
205 +++dddddddd+++
206 Level:
207 Daddy
208 Number 6
209 Bricks:
210 **************
211 *!!!!!!!!!!!!*
212 ****!.......!*
213 EEE*!...!!!!!*
214 **E*!!!.******
215 **E***!.!!!!!*
216 **EEE*!.....!*
217 ****E*!!!...!*
218 *!!*E***!...!*
219 *!!*EEE*!...!*
220 *!!***E*!!!.!*
221 *!!!!*E***!.!*
222 *!..!*EEE*!.!*
223 *!..!***E*!!!*
224 *!..!!!*E***!*
225 *!!!!!!*EEE*!*
226 *****!!***E*!*
227 ######!!!*E*!#
228 Bonus:
229 00000000000000
230 0.....bbb....0
231 ll00.........0
232 ...0.........0
233 00.0.++.000000
234 00.00s+.ll...0
235 00...s.......0
236 0000.sggg....0
237 0pp0.ssmg....0
238 0p.0...mg....0
239 0p.00s.mggg..0
240 0pbbbs.mmmg..0
241 0p..+s...mg..0
242 0p..+sss.mgg+0
243 0p..+++w.mww+0
244 0ppppp+w...w+0
245 mmmmmp+www.w+0
246 l5555l+++w.w+l
247 Level:
248 Daddy
249 Number 7
250 Bricks:
251 hhhvhhhhhhvhhh
252 hihvhihhihvhih
253 hhhvhhhhhhvhhh
254 vfvvvfvvfvvvfv
255 vfv.vfvvfv.vfv
256 vfv.vfvvfv.vfv
257 vfv.vfvvfv.vfv
258 vfv.vfvvfv.vfv
259 vfvvvfvvfvvvfv
260 vvhhhvvvvhhhvv
261 .vhihv..vhihv.
262 .vhhhv..vhhhv.
263 .vvfvv..vvfvv.
264 ..vfv....vfv..
265 ..vfv....vfv..
266 *.vfv.**.vfv.*
267 *.vfv.**.vfv.*
268 *.vfv.**.vfv.*
269 Bonus:
270 &&&5&&&&&&5&&&
271 4*454*44*454*4
272 44454444445444
273 1w151w11w151w1
274 1w1.1w11w1.1w1
275 lw1.1wllw1.1wl
276 1w1.1w11w1.1w1
277 1w1.1w11w1.1w1
278 1w1b1w11w1b1w1
279 134443ll344433
280 .34*43..34*43.
281 .34443..34443.
282 .30w03..30w03.
283 ..0w0....0w0..
284 ..0w+....+w+..
285 +.+w+.++.+w+.+
286 +.+w+.++.+w+.+
287 +.+w+.++.+w+.+
288 Level:
289 Daddy
290 Last One 8
291 Bricks:
292 zzzvzvzvzzvvvv
293 vzvvzvzvzvvvvv
294 vzvvzzzvzzvvvv
295 vzvvzvzvzvvvvv
296 vzvvzvzvzzvvvv
297 vvvvvvvvvvvvvv
298 vvzzvzvvvzvzzz
299 vvzvvzzvvzvzvz
300 vvzzvzvzvzvzvz
301 vvzvvzvvzzvzvz
302 vvzzvzvvvzvzzz
303 vvvvvvvvvvvvvv
304 ##############
305 ..............
306 !!!!!!!!!!!!!!
307 **************
308 ..............
309 !!!!!!!!!!!!!!
310 Bonus:
311 m55.5.5.55...m
312 .5..5.5.5..+..
313 .5..555.55..+.
314 .5..5.5.5.....
315 .5..5.5.55+.jj
316 ..jj....jj....
317 ..55.5...5.555
318 +.5..55..5.5.5
319 ..55.5.5.5.5.5
320 ..5..5..55.5.5
321 .+55+5.+.5.555
322 jj...jj...jj..
323 &&&&&&&&&&&&&&
324 }lll}mm}lllll}
325 ..............
326 wwwff-WW-ffwww
327 ++}+++++++}+++
328 llbbbbbbbbbbll
0 Level:
1 elvis
2 In the beginning
3 Bricks:
4 ..............
5 ..............
6 ....ccc.......
7 ..............
8 ..............
9 ..............
10 ..............
11 ..............
12 ..............
13 ..............
14 ..............
15 ..............
16 f.f.f.f.f.f.f.
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ....222.......
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 elvis
43 when aliens attack
44 Bricks:
45 ............i.
46 ...........iii
47 ............i.
48 .g.g.g.g.g....
49 ..............
50 .f.f.f.f.f....
51 ..............
52 .h.h.h.h.h....
53 ..............
54 .e.e.e.e.e....
55 ..............
56 .d.d.d.d.d....
57 ..............
58 ..............
59 ..............
60 ..aa..aa..aa..
61 ..bb..bb..bb..
62 ..cc..cc..cc..
63 Bonus:
64 ............5.
65 ..............
66 ..............
67 .0.0.0.0.0....
68 ..............
69 .0.0.0.0.0....
70 ..............
71 .0.0.0.0.0....
72 ..............
73 .0.0.0.0.0....
74 ..............
75 .0.0.0.0.0....
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 elvis
84 Command prompt
85 Bricks:
86 ....i.......e.
87 ....i.......e.
88 ....i......h..
89 .....d.....h..
90 .....d....h...
91 .....d....c...
92 ......e.......
93 ......e.......
94 ......e.......
95 .......h......
96 .c.....h......
97 .......h......
98 .......c......
99 ..............
100 ..............
101 g.....g.....g.
102 gg....gg....gg
103 gg.aa.gg.aa.gg
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 ..........4...
111 ..............
112 ..............
113 ..............
114 ..............
115 .4............
116 ..............
117 .......4......
118 ..............
119 ..............
120 ..............
121 >.....f.....-.
122 ..............
123 Level:
124 elvis
125 Flying Ostrich?
126 Bricks:
127 ..............
128 ..............
129 ..............
130 .hhhhhh..c....
131 ..eeeee....c..
132 ....dd........
133 ..............
134 ..............
135 ..............
136 ..............
137 .......f......
138 hh....hhhhhhhh
139 e......eeeeeee
140 ........ddd...
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ..>.f....g....
150 ...........g..
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 .........>.f>.
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 elvis
166 Preparation A
167 Bricks:
168 ..............
169 ...........ff.
170 .fff...f...ff.
171 .fff...f...ff.
172 .fffh.........
173 .fff..........
174 .....h........
175 ..............
176 ......h.......
177 ..............
178 ...f...c......
179 ...f..........
180 ..............
181 ........ff....
182 ........ff....
183 ........ff....
184 ..............
185 ..............
186 Bonus:
187 ..............
188 ...........11.
189 .000...2......
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 ...2..........
198 ..............
199 ..............
200 ........11....
201 ..............
202 ..............
203 ..............
204 ..............
205 Level:
206 elvis
207 Intruder Alert
208 Bricks:
209 .h..h.........
210 dh..hd........
211 .h.dh.........
212 hh..hhhhh..h..
213 ...........h..
214 ...........h..
215 ..d........hd.
216 ...........h..
217 hhhhhh..h..hhh
218 .....h..h.....
219 .....h..h.....
220 ........h.....
221 ........h.....
222 ........h..d..
223 .....h..h.....
224 ....dh..h.....
225 .....h..h.....
226 hhhhhh..hhhhhh
227 Bonus:
228 ..............
229 4....4........
230 ...4..........
231 ..............
232 ..............
233 ..............
234 ..3.........3.
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ...........2..
242 ..............
243 ....2.........
244 ..............
245 ..............
246 Level:
247 elvis
248 Freddy Fender
249 Bricks:
250 ..............
251 c.............
252 ........c.....
253 ........h.....
254 ..............
255 ...f..........
256 ...ff.e.e.c...
257 ..........h...
258 ..............
259 ..............
260 ..............
261 ..............
262 ..............
263 ..............
264 ............gg
265 ..ggggg...ggg.
266 gggh..ghgggh..
267 g.............
268 Bonus:
269 ..............
270 4.............
271 ........4.....
272 ........f.....
273 ..............
274 ..............
275 ..........4...
276 ..........>...
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 ...-...-...-..
286 ..............
287 Level:
288 elvis
289 Temp, temper, ...
290 Bricks:
291 ..............
292 .f..........f.
293 .ff........ff.
294 .f.f......f.f.
295 .f..f....f..f.
296 .f...f..f...f.
297 .f...f..f...f.
298 .f..cf..f...f.
299 .f..ff..ff..f.
300 .f.f..ff..f.f.
301 .ff..f..f..ff.
302 .f...f..fc..f.
303 ..f.f....f.f..
304 ..f.f....f.f..
305 ...f......f...
306 ...f.cc...f...
307 ....fcc..f....
308 .....ffff.....
309 Bonus:
310 ..............
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ....3.........
318 ..............
319 ..............
320 ..............
321 .........3....
322 ..............
323 ..............
324 ..............
325 .....44.......
326 ..............
327 ..............
328 Level:
329 elvis
330 Don Quixote
331 Bricks:
332 .d............
333 .c............
334 ded...........
335 .e.........g..
336 ddd........e..
337 d.d....ii..g..
338 ccc....ii.gg..
339 eeeccc.ii.g.g.
340 ...eeeccc.....
341 ......eeeccc..
342 .........eee..
343 ..............
344 ....ii........
345 ....ii.....ccc
346 ....ii..ccceee
347 .....ccceee...
348 ..ccceee......
349 ..eee.........
350 Bonus:
351 ..............
352 .5............
353 ..............
354 ..............
355 ...........f..
356 ..............
357 .......g......
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 ..............
364 .....g........
365 ..............
366 ..............
367 ..............
368 ..............
369 Level:
370 elvis
371 Sole Posession
372 Bricks:
373 gggggggggggggg
374 ggggggggggghhg
375 ggggggggggghhg
376 gggggggggggggg
377 gggggggggggggg
378 gggggggggggggg
379 gggggggggggggg
380 gggggggggggggg
381 ffffffffffffff
382 fff...ffffffff
383 ffff.....fffff
384 fffff.c...ffff
385 fffff.....ffff
386 fffff..c..ffff
387 ffff.......fff
388 ffff...c...fff
389 ffff.......fff
390 fff....c...fff
391 Bonus:
392 ..............
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 ..............
402 ..............
403 ......m.......
404 ..............
405 .......p......
406 ..............
407 .......s......
408 ..............
409 .......w......
410 Level:
411 elvis
412 Troff
413 Bricks:
414 ..............
415 .hhhhhhhhhhhh.
416 .h..........h.
417 .h.hhhhhhhhhh.
418 .h.h..........
419 .h.h.dddddddd.
420 .h.h.d......d.
421 .h.h.d......d.
422 .h.h.dddddd.d.
423 .h.h......d.d.
424 .h.hhh..ddd.d.
425 .h..........d.
426 .hhh........d.
427 ...h........d.
428 ...h........d.
429 ..ch........d.
430 ............d.
431 .cddddddddddd.
432 Bonus:
433 ..............
434 ..............
435 ..............
436 ..............
437 ..............
438 ..............
439 ..............
440 ..............
441 ..............
442 ..............
443 ..............
444 ..............
445 ..............
446 ..............
447 ..............
448 ..4...........
449 ..............
450 .4............
451 Level:
452 elvis
453 L*Bert
454 Bricks:
455 aaaaaaaaaaaaaa
456 aaaaaaaaaaaaaa
457 aaaaaaaaaaaaaa
458 aaaaaaccaaaaaa
459 aaaaaaccaaaaaa
460 aaaaa....aaaaa
461 aaaaad..haaaaa
462 aaaaaddhhaaaaa
463 aaaaaddhhaaaaa
464 aaaa..dh..aaaa
465 aaa........aaa
466 aaad..hd..haaa
467 aaaddhhddhhaaa
468 aaaddhhddhhaaa
469 aa..dh..dh..aa
470 a............a
471 ad..hd..hd..ha
472 addhhddhhddhha
473 Bonus:
474 g............g
475 ..........0.0.
476 .0..0.........
477 ......44......
478 ..0...mm.0....
479 ...........0..
480 ..............
481 .0.0.........0
482 ..............
483 ...........0..
484 ..............
485 ............0.
486 0.............
487 .............0
488 ..............
489 ..............
490 ..............
491 w............w
492 Level:
493 elvis
494 pinball
495 Bricks:
496 ####.....#####
497 ###..........#
498 ##h..........#
499 ##h.......##.#
500 ##h......###.#
501 ##h..d...#e#.#
502 ##h..d...#.#.#
503 ###......#.#.#
504 ###.d......#.#
505 ##..d......#.#
506 ##......gg.#.#
507 ##.d....gg.#.#
508 ##.d....gg.#.#
509 ##.........#.#
510 ##........##.#
511 ###.......#..#
512 ####.....##..#
513 ####cbabc##..#
514 Bonus:
515 ..............
516 ..............
517 ..4...........
518 ..3...........
519 ..2...........
520 ..1.......5...
521 ..0...........
522 ..............
523 ..............
524 ..............
525 ..............
526 ..............
527 ..............
528 ..............
529 ..............
530 ..............
531 ..............
532 ..............
533
0 Version: 1.00
1 Level:
2 Lelldorin
3 arkanoid
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 kkkkkkkkkkkkkk
10 dddddddddddddd
11 hhhhhhhhhhhhhh
12 gggggggggggggg
13 eeeeeeeeeeeeee
14 ffffffffffffff
15 ..............
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 +...<......l.+
29 ..g..........0
30 .+..>...2.....
31 3......&..-...
32 .............>
33 ..1..-........
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 noname
44 untitled
45 Bricks:
46 ..............
47 j.............
48 jh............
49 jhi...........
50 jhif..........
51 jhife.........
52 jhifeg........
53 jhifegj.......
54 jhifegjh......
55 jhifegjhi.....
56 jhifegjhif....
57 jhifegjhife...
58 ############ee
59 ..............
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 l.............
67 ..............
68 ..-...........
69 ..............
70 &.............
71 .0...s........
72 ..............
73 ..&...........
74 s..s..0.-.....
75 ..............
76 4>...&....3...
77 ............<.
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 noname
85 untitled
86 Bricks:
87 ..............
88 ..............
89 ......kk......
90 ...gggkkfff...
91 ..gggjjjjfff..
92 .gggjjjjjjfff.
93 .gggjjjjjjfff.
94 .gggjjjjjjfff.
95 ......kk......
96 ......kk......
97 ......kk......
98 ......kk......
99 ......kk......
100 ......kk......
101 ...cc.cc......
102 ...cc.cc......
103 ....ccc.......
104 .....c........
105 Bonus:
106 ..............
107 ..............
108 ......-+......
109 ....<...>.....
110 ......p..0.>..
111 ...+.1....<.+.
112 .s0.-.........
113 ...>.....5-...
114 .......-......
115 ..............
116 .......0......
117 ......+.......
118 ..............
119 ......<-......
120 ...>..........
121 ....+..s......
122 ..............
123 ..............
124 Level:
125 noname
126 untitled
127 Bricks:
128 ..............
129 ##############
130 hhhhhh##iiiiii
131 hhhihh##iidiii
132 hhiihh##iiddii
133 hiiiih##iddddi
134 iiiiih##iddddd
135 hiiiih##iddddi
136 hhiihh##iiddii
137 hhhihh##iidiii
138 hhhhhh##iiiiii
139 ###i######d###
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 0....0..0+...0
150 ..............
151 ...>....l...wf
152 ..f..W.....+..
153 &+.w.....l...&
154 ...+.l........
155 l...........W.
156 .............>
157 0....4..4....0
158 ...s......s...
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 noname
167 untitled
168 Bricks:
169 ..............
170 .......hh.....
171 ......ch......
172 .....cc....gg.
173 .....cc...fg..
174 .....cc...fg..
175 ....dcch..f...
176 ....dcchh.f...
177 ...d@cchhff...
178 ...d@cchhff...
179 ...ddcchh.f...
180 ....dcch..f...
181 ....dcchh.f...
182 .....cc...fg..
183 .....cc...fg..
184 .....cc....g..
185 .......h....g.
186 ..............
187 Bonus:
188 ..............
189 ..............
190 .......<......
191 .....0......0.
192 ...........>..
193 .....>1....w..
194 ..........0...
195 ....+s........
196 ......->..&...
197 ...>.&..0.<...
198 ....+1.3......
199 ......w...+...
200 ........-.....
201 .....>1...0s..
202 ..............
203 ......<.......
204 ............-.
205 ..............
206 Level:
207 noname
208 untitled
209 Bricks:
210 ..............
211 ..............
212 .kgkgkddddddd.
213 .gkgkgjjjjjjj.
214 .kgkgkddddddd.
215 .gkgkgjjjjjjj.
216 .kgkgkddddddd.
217 .jjjjjjjjjjjj.
218 .dddddddddddd.
219 .jjjjjjjjjjjj.
220 .dddddddddddd.
221 .jjjjjjjjjjjj.
222 .dddddddddddd.
223 ..............
224 ..............
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..0..>........
232 ....p...{-....
233 ...+.-...<.0..
234 ..3.>..0......
235 .....b.....>..
236 .+.*......+...
237 .....-l.5.b...
238 ...0.......}-.
239 ........>..0..
240 .>-...<.p..3..
241 .......+......
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 noname
249 untitled
250 Bricks:
251 ..............
252 ..............
253 ..............
254 .....jjjj.....
255 .....jjjj.....
256 .....jjjj.....
257 ....jjjjjj....
258 ....jgjjgj....
259 ...jggjjggj...
260 ...gggggggg...
261 ...gggggggg...
262 .gggggggggggg.
263 gggggggggggggg
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 .....0.b......
274 ......pw......
275 ..............
276 ......d4......
277 .....<.-<.....
278 ....+.........
279 ......0.f0....
280 ..............
281 .-.f0.<..+.sf.
282 >...-.>.-...->
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 noname
290 untitled
291 Bricks:
292 ..............
293 ...j......j...
294 ...j......j...
295 ....j....j....
296 ....j....j....
297 ...kkkkkkkk...
298 ...kkkkkkkk...
299 ..kkhkkkkhkk..
300 ..kkhkkkkhkk..
301 .kkkkkkkkkkkk.
302 .kkkkkkkkkkkk.
303 .kkkkkkkkkkkk.
304 .k.kkkkkkkk.k.
305 .k.k......k.k.
306 .k.k......k.k.
307 .k.kkk..kkk.k.
308 ....kk..kk....
309 ..............
310 Bonus:
311 ..............
312 ...+..........
313 ..........2...
314 ..............
315 ..............
316 ....0.p.......
317 ...0...j.+....
318 .........b....
319 ..W.-.+l......
320 ...2?...s2.+..
321 .......0......
322 .2......-.....
323 ....-.f-......
324 .-.2........2.
325 .s........2.f.
326 .....+......-.
327 ....f...-.....
328 ..............
0 Level:
1 neo
2 beos
3 Bricks:
4 ..............
5 ggg......d..d.
6 g.g.....d.dd.d
7 g.g.g...d.dd..
8 g.gg.g..d.dd..
9 gg.g.g..d.dddd
10 g.ggg...d.d..d
11 g.gg....d.d..d
12 g.gg.g..d.dd.d
13 ggg.g....d..d.
14 ..............
15 eeeeeeeeeeeeee
16 ffffffffffffff
17 iiiiiiiiiiiiii
18 hhhhhhhhhhhhhh
19 ccc..cccc..ccc
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 .............l
26 b...>.........
27 ........-..s..
28 5....5....5..5
29 ..............
30 +............0
31 .....<........
32 ..............
33 ..............
34 5.......5.....
35 .s.0.........b
36 ..............
37 ............-.
38 .+....>......5
39 ..............
40 ..............
41 Level:
42 neo
43 rules
44 Bricks:
45 ..............
46 .fefefefefefe.
47 .efefefefefef.
48 .cccccccccccc.
49 ..............
50 .ff.g.gd.eekk.
51 .f.fg.gd.e.k..
52 .f.fg.gd.eek..
53 .ff.g.gd.e..k.
54 .f.fg.gd.e..k.
55 .f.f.g.ddeekk.
56 ..............
57 .cccccccccccc.
58 .gdgdgdgdgdgd.
59 .dgdgdgdgdgdg.
60 .gdgdgdgdgdgd.
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ....-......p..
66 ..f...l..-....
67 ......+.......
68 ..............
69 ...........-..
70 ..............
71 .......-..m...
72 ..............
73 ..............
74 .....f........
75 ..............
76 ......+.......
77 ..-...b..f....
78 ..............
79 ..>...>...>...
80 ..............
81 ..............
82 Level:
83 neo
84 roots
85 Bricks:
86 .e..dd..gk.k..
87 .eeed.dg.kk...
88 .e.edddg.k.k..
89 .eeed.d.gk.k..
90 .....f..h.....
91 ....fffh.h....
92 .....f.h.h....
93 .....f..h.....
94 i.i.g..e..k.dd
95 ii.g.ge.ekkkd.
96 i..g.ge.e.k..d
97 i...g..e..k.dd
98 ..............
99 cccccccccccccc
100 ..............
101 ..............
102 ..............
103 ..............
104 Bonus:
105 .1......f.....
106 ..........5...
107 .....>........
108 ..b........+..
109 ..............
110 .....5...1....
111 ..............
112 ........>.....
113 +............s
114 ..........0...
115 0.............
116 ....f..5......
117 ..............
118 .>...+..b...>.
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 neo
125 beos dano
126 Bricks:
127 ..............
128 ..............
129 .dd...........
130 .d.d..........
131 .d.d..........
132 .d.d..........
133 .d.d.ggff..kk.
134 .d.dg.gf.fk.k.
135 .d.dg.gf.fk.k.
136 .dd.gggf.fkk..
137 ..............
138 .eeeeeeeeeeee.
139 ..............
140 ..............
141 ##..#c..c#..##
142 ...#......#...
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 .-l...........
149 ..............
150 ..............
151 .+.1..........
152 .....-..5...s.
153 .5............
154 .......s..1.5.
155 ....0......+..
156 ..............
157 ..>.5.+...<.-.
158 ..............
159 ..............
160 .....f..-.....
161 ..............
162 ..............
163 ..............
164 Level:
165 neo
166 next generation
167 Bricks:
168 ..............
169 .kk.....g..f..
170 .k#k...g#gf#f.
171 .k#k.d.g#gf#..
172 .kk.d#dg#gff..
173 .k#kdddg#g.#f.
174 .k#kd#.g#g.#f.
175 .k#kd#dg#gf#f.
176 .kk..d..g..f..
177 ..............
178 ....ee..hh....
179 ....e#eh#.....
180 .jj.e#eh#h.jj.
181 ....e#e.hh....
182 ..............
183 #jjjjjjjjjjjj#
184 ..............
185 ..............
186 Bonus:
187 ..............
188 ..-.....5..f..
189 .>............
190 .....g.j.<....
191 ..1........2..
192 .....3...b....
193 .5.....<....5.
194 ..............
195 .....>.....>..
196 ..............
197 .....-..-.....
198 ..............
199 .>..........b.
200 ........5.....
201 ..............
202 ..-...-f...-..
203 ..............
204 ..............
205 Level:
206 neo
207 r6
208 Bricks:
209 ..............
210 .gggggggggggg.
211 .fdddffffddff.
212 .fdffdffdffdf.
213 .fdffdffdffff.
214 .fdffdffdffff.
215 .fdffdffddddf.
216 .fdddfffdffdf.
217 .fdfdfffdffdf.
218 .fdffdffdffdf.
219 .fdfffdffddff.
220 .gggggggggggg.
221 ..............
222 .ccbccbbccbcc.
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ...1.......5..
230 ...>......>...
231 .5..>.........
232 ..-.......+...
233 ....lw..0...<.
234 ...........>..
235 ..c0.f.+..1...
236 .........5.-..
237 ..............
238 ..>.+..5..>...
239 .5............
240 ..............
241 .>..-.>.....-.
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 neo
248 fine logo
249 Bricks:
250 ..............
251 .dddddddddddd.
252 .ddddjjjjdddd.
253 .dddjddddjddd.
254 .ddjddddddjdd.
255 .ddjddddddjdd.
256 .ddddjjjjdjdd.
257 .dddjddddjddd.
258 .dddjddddjddd.
259 .ddddjjjjdjdd.
260 .dddddddddjdd.
261 .dddddddddjdd.
262 .ddddddddjddd.
263 .ddddjddjdddd.
264 .ddddjddjdddd.
265 .dddddjjddddd.
266 .dddddddddddd.
267 ..............
268 Bonus:
269 ..............
270 ...f..........
271 .......j......
272 ..d.5......d5.
273 ..............
274 .5.l..>..+....
275 ....b...4.....
276 ..<........1..
277 .....f.d...<..
278 .+............
279 ..1....5....5.
280 ...d.....b.+..
281 ..5...........
282 ........55....
283 ......f....d..
284 .d.+5.........
285 ..............
286 ..............
287 Level:
288 neo
289 open beos
290 Bricks:
291 ..............
292 ..g..d..k.ee..
293 .gvgdvdkvkeve.
294 .gvgdvdkkkeve.
295 .gvgdvdkvveve.
296 .gvgdd.kvkeve.
297 ..g.d...k.eve.
298 ..............
299 .ff..i..h..jj.
300 .fvfivihvhjvv.
301 .ffviiihvhvjv.
302 .fvfivvhvhvvj.
303 .fvfivihvhjvj.
304 .ff..i..h..j..
305 ..............
306 ..............
307 ..............
308 ..............
309 Bonus:
310 ..............
311 ..0........0..
312 ..+..l..b..-..
313 ..>...........
314 .....<...+.>..
315 ..............
316 ..5.5...5...5.
317 ..............
318 ..............
319 ..p..>.....w..
320 ........b.....
321 ..........-...
322 ..b..+.....>..
323 ..5..5..5..5..
324 ..............
325 ..............
326 ..............
327 ..............
328 Level:
329 neo
330 take me home
331 Bricks:
332 ..............
333 ....e.........
334 ...jje..ee..cv
335 v.ejjjeeee..cv
336 v.eejjjeee..cv
337 v.eeejjeee..cv
338 v.eeejjjee..cv
339 v.eeeejje...cv
340 v.eeeejje...cv
341 v.eeeeeje...cv
342 v.edeeeje...cv
343 v.djdeeje...cv
344 v.jajeejek..cv
345 v.jajeeeekk.cv
346 v.jaj.eekk..cv
347 v.fff..ek...cv
348 ..............
349 ..............
350 Bonus:
351 ..............
352 ....b.........
353 ..............
354 .........+...>
355 .....l..2.....
356 -......>....+.
357 ..-..........5
358 ...+.4......b.
359 p.............
360 ......+.-....~
361 5...w.........
362 ...2........p.
363 ......5+......
364 -..>..........
365 .......b.....-
366 >...........5.
367 ..............
368 ..............
369 Level:
370 neo
371 and the future
372 Bricks:
373 ..............
374 ..............
375 ..........ddd.
376 .........dd.dd
377 vdvv.fvv.dv.vd
378 d....f.......d
379 d...ff......kd
380 dde.efe.eggkkd
381 d.e.efe.eg.k.d
382 d..eef.eeg..kd
383 ............dd
384 ...........dd.
385 ...........d..
386 ...........d..
387 ..............
388 ...........d..
389 vvv.v.v.v.v.vv
390 ..............
391 Bonus:
392 ..............
393 ..............
394 ..........>+..
395 ..............
396 b..5.swp....+l
397 >.............
398 ..............
399 +.2..>...5.3.>
400 ....5.5.......
401 ............s.
402 ..............
403 ..............
404 ...........+..
405 ..............
406 ..............
407 ..............
408 5pw.+.s.b.5.<+
409 ..............
0 Version: 1.00
1 Level:
2 n@body
3 muahaha
4 Bricks:
5 ..............
6 ..............
7 ...E......E...
8 ...EE....EE...
9 ....E....E....
10 ....E....E....
11 ....E....E....
12 ....E....E....
13 .************.
14 ...**aaaa**...
15 ....**aa**....
16 .....****.....
17 ......**......
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 slayer
44 seasons in the abyss
45 Bricks:
46 v.....vv.....v
47 ......vv......
48 ..h..h..h..hh.
49 .h.h.hh.hh.h..
50 .h.h.h..h...h.
51 ..............
52 ....vvvvvv....
53 ....v....v....
54 ...hh....hh...
55 eeeeh....heeee
56 v*ve......ev*v
57 *v*e......e*v*
58 v*ve......ev*v
59 eeee......eeee
60 e............e
61 e............e
62 e............e
63 e............e
64 Bonus:
65 m.....pp.....*
66 ......mm......
67 ..5..?..?..5*.
68 .*.*.**.55.5..
69 .w.*.w..w...w.
70 ..............
71 ..............
72 ..............
73 ...ww....ww...
74 &&bbw....wbb&&
75 ...j......j...
76 ...j......j...
77 ...j......j...
78 jjjj......jjjj
79 j............j
80 j............j
81 j............j
82 j............j
83 Level:
84 cant swim
85 =-wave04!-=
86 Bricks:
87 ............*.
88 .*.........***
89 ***.........*.
90 .*....gggg..*.
91 .*...ggggggg..
92 ....ggggggggg.
93 ....gggg.*.gg.
94 ...ggg...*..gg
95 ...g...*****.g
96 ..g...*..*...g
97 ..g..***.*...g
98 ......*..*...g
99 ....*.*..*..gg
100 ...***...*..gg
101 ....*..*.*.ggg
102 ....*.***ggggg
103 .......*gggggg
104 .......*gggggg
105 Bonus:
106 ............2.
107 .2.........2l2
108 2l2.........2.
109 .2....2222..2.
110 .2...2222222..
111 ....222222222.
112 ....2222.2.22.
113 ...222...2..22
114 ...2...22222.2
115 ..2...2..2...2
116 ..2..222.2...2
117 ......2..2...2
118 ....2.2..2..2b
119 ...222...b..2b
120 ....2..2.2.2b2
121 ....2.b2b22222
122 .......222bb2b
123 .......bbbbbbb
124 Level:
125 1nfl2m3d
126 colony
127 Bricks:
128 **************
129 *****!!!!*****
130 *****!..!*****
131 ****!!dd!!****
132 ***d..aa..d***
133 **d...aa...d**
134 **....aa....**
135 **d...aa...d**
136 *d....dd....d*
137 *.....aa.....*
138 *d....aa....d*
139 d.....aa.....d
140 ......aa......
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ......l~......
149 ..............
150 ......pp......
151 ......jj......
152 ......jj......
153 ......jj......
154 ......jj......
155 ......pp......
156 ......jj......
157 ......jj......
158 ......jj......
159 ......jj......
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 doc
167 entering the laboratory
168 Bricks:
169 vvvvvvvvvvvvvv
170 vvvvvvvvvvvvvv
171 vvvvvvvvvvvvvv
172 vvvvvvvvvvvvvv
173 vvvvvvvvvvvvvv
174 vvvvvxxxxxvvvv
175 vvvvvxvvvxvvvv
176 vvvvvxvvvxvvvv
177 vvvvvxvvvxvvvv
178 vvvvvxvvvxvvvv
179 vvvvvxvvvxvvvv
180 vvvvvxvvvxvvvv
181 vvvvvxevvxvvvv
182 vvvvvxvvvxvvvv
183 vvvvvxvvvxvvvv
184 vvvvvxvvvxvvvv
185 vvvvvxvvvxvvvv
186 vvvvvxvvvxvvvv
187 Bonus:
188 .......5......
189 .1..........1.
190 101........101
191 .1..........1.
192 ..............
193 .....&&&&&....
194 .....&www&....
195 ....5&www&5...
196 bbbbb!www!bbbb
197 >>>>>>>>>>>>>>
198 pppppppppppppp
199 wwwwwwwwwwwwww
200 03333&&&&&3330
201 03333bbbbb3330
202 01111wwwww1110
203 05555ww!ww5550
204 00000w!!!w0000
205 jjjjjwbbbwjjjj
206 Level:
207 doc
208 need some light
209 Bricks:
210 xxxxxxxxxxxxxx
211 x............x
212 x............x
213 x.........cccx
214 x.........cecx
215 x.........c.cx
216 x.........c.cx
217 x.........cccx
218 xxxxxxxxxxxxxx
219 @EEEE@@#EEE@@@
220 @###EE@###E@@#
221 @@@##E@@##EE##
222 **************
223 **************
224 **************
225 aa**a*a*a**aaa
226 **************
227 aaaaaaaaaaaaaa
228 Bonus:
229 ....llllll5555
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ......mm......
238 ..............
239 ..............
240 ..............
241 m............m
242 ..............
243 ..............
244 dddddddddddddd
245 dddddddddddddd
246 dddddddddddddd
247 Level:
248 doc
249 teleport2mars
250 Bricks:
251 ......vv....d.
252 ......c....d*d
253 .....ccc....d.
254 ...c..........
255 ..ccc...c.....
256 .......ccc....
257 ..............
258 vvvvvvvvvvvvvv
259 ##############
260 vvvvvvvvvvvvvv
261 .....x........
262 ....x.........
263 .g.xx*****....
264 aaa.x.........
265 .a...x........
266 .a............
267 .a............
268 .a............
269 Bonus:
270 ............5.
271 ......g....555
272 .....ggg....5.
273 ...g..........
274 ..ggg...g.....
275 .......ggg....
276 ..............
277 ..............
278 ..............
279 &&&&&&&&&&&&&&
280 ..............
281 ..............
282 .m............
283 www...........
284 .w............
285 .w............
286 .w............
287 .w............
288 Level:
289 kern
290 danger!
291 Bricks:
292 a.a.aaa.aa..a.
293 aa..a...a.a.a.
294 aa..aa..aa..aa
295 a.a.a...a.a.aa
296 a.a.aaa.a.a.a.
297 **************
298 ..*.*.*.*.*.*.
299 .!*!*!*!*!*!*!
300 .!.!.!.!.!.!.!
301 .!.!.!.!.!.!.!
302 .!.!.!.!.!.!.!
303 .!.!.!.!.!.!.!
304 *.*.*.*.*.*.*.
305 *.*.*.*.*.*.*.
306 *.*.*.*.*.*.*.
307 *.*.*.*.*.*.*.
308 *.*.*.*.*.*.*.
309 *.*.*.*.*.*.*.
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 l.l...........
316 {{bbbbbbbbbbbb
317 ..2.2.4.4.2.2.
318 ..2.2.4.4.2.2.
319 ..............
320 .p.p.p.p.p.p.p
321 .p.p.p.p.p.p.p
322 .g.g.g.....m..
323 g.g.g.g.-.-.-.
324 +.+.+.+.-.-.-.
325 ........-...-.
326 j.j.j.j.......
327 j.+.j.+...+...
328 j.j.j.j.......
329 Level:
330 {f(c)=0}
331 formula
332 Bricks:
333 Ev..vvvvvv..vE
334 EE#.vvvvvv.#EE
335 ###vvv##vvv###
336 vvvvvvvvvvvvvv
337 EE..EEEEEE..EE
338 @E..........E@
339 EE.@@.EE.@@.EE
340 ev..........vj
341 f############e
342 ev...#vv#...vd
343 d###.#vv#.###f
344 hv.#..**..#.vg
345 i#.#.*vv*.#.#h
346 f#.#..**..#.#k
347 g#..........#j
348 i############i
349 kh..******.ved
350 ######**######
351 Bonus:
352 .l..........l.
353 ..............
354 ....ww..ww....
355 wwwwbbbbbbwwww
356 ..............
357 ..............
358 ..............
359 .m..........m.
360 ..............
361 .m....bb....m.
362 ......mm......
363 .m..........m.
364 b.....55......
365 b............b
366 b............b
367 w............b
368 wb..&wwww&.bbb
369 ......ww......
370 Level:
371 (S,T,d,K)
372 turing
373 Bricks:
374 aaa.aa.aaa.aaa
375 .a..a..a....a.
376 .a..a..a....a.
377 .a..a..a....a.
378 .a..aa.aaa..a.
379 .a..a....a..a.
380 .a..a....a..a.
381 .a..a....a..a.
382 .a..aa.aaa..a.
383 ..............
384 ..............
385 ..............
386 ..............
387 ..............
388 ..............
389 ..............
390 ..............
391 ..............
392 Bonus:
393 mmm.mm.mmm.mmm
394 .m..m..m....m.
395 .m..m..m....m.
396 .m..m..m....m.
397 .m..mm.mmm..m.
398 .m..m....m..m.
399 .m..m....m..m.
400 .m..m....m..m.
401 .w..ww.www..w.
402 ..............
403 ..............
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Congratiolations
413 clear
414 Bricks:
415 vvvvvvvvvvvvvv
416 vvvvvvvvvvvvvv
417 ..vvvvvvvvvv..
418 ..v........v..
419 vvvvvvvvvvvvvv
420 .vv........vv.
421 ..v........v..
422 .vvvvvvvvvvvv.
423 vvvvvvvvvvvvvv
424 vvvvvvvvvvvvvv
425 ..............
426 ..............
427 vvvvvvvvvvvvvv
428 vvvvvvvvvvvvvv
429 vvvvvvvvvvvvvv
430 vvvvvvvvvvvvvv
431 vvvvvvvvvvvvvv
432 aaaaaaaaaaaaaa
433 Bonus:
434 ..............
435 b............b
436 ..............
437 ..............
438 ..............
439 .b..........b.
440 ..............
441 ....b1111b....
442 .11111111111..
443 .11111111111..
444 ..............
445 ..............
446 *****5555*****
447 *****5335*****
448 *****5555*****
449 **************
450 **************
451 wwwwwwwwwwwwww
452 Level:
453 best friend
454 don't give up
455 Bricks:
456 **************
457 **************
458 ......gd......
459 ......gg......
460 aa..aa..xx..xx
461 aa..aa..xx..xx
462 ..dd......gg..
463 ..dd......gg..
464 aa..aa..xx..xx
465 aa..aa..xx..xx
466 ..hh..zz..!!..
467 ..hh..zz..!!..
468 aa..aa..xx..xx
469 aa..aa..xx..xx
470 ..bb......yy..
471 ..bb......yy..
472 aa..aa..xx..xx
473 aa..aa..xx..xx
474 Bonus:
475 55555555555555
476 222222bb222222
477 ......bb......
478 ......bb......
479 ww..........ww
480 ..............
481 ..**......&&..
482 ..**......&&..
483 ..............
484 ..............
485 ..ww..bb..ww..
486 ..ww..bb..ww..
487 ..............
488 ..............
489 ..............
490 ..............
491 ..............
492 ww..pp..pp..ww
493 Level:
494 (google brokenlinks)
495 secret found
496 Bricks:
497 vvvvvvv.v.**..
498 vvvvvvv..v.**.
499 vvvvvvvv..v.**
500 vvvvvvv..vv.**
501 vvvvvv..vv.**.
502 vvvvv..vv.**..
503 vvvvv.vv.**...
504 vvv...v.**....
505 v....v.**.....
506 ....v.**......
507 ..vv.**.......
508 .vv.**........
509 vv.**.........
510 v.**..........
511 .**...........
512 **............
513 *.............
514 ..............
515 Bonus:
516 bbb.......ww..
517 b.bb.c.....cw.
518 b...b.......sw
519 ..c.b........j
520 ...lb......{*.
521 bl.bb.....2*..
522 blbbb.4..2*...
523 bwb...4.4<....
524 w....4.4<.....
525 ....?.4<......
526 ...?..<.......
527 ..?.*b........
528 .?.bb.........
529 ...*..........
530 .*b...........
531 }*............
532 b.............
533 ..............
534 Level:
535 new
536 blackholes
537 Bricks:
538 ..............
539 ..............
540 .v.........v..
541 ..............
542 ...v..v.......
543 ..............
544 ..............
545 ..............
546 ..............
547 ............v.
548 ..v...........
549 ..............
550 ..............
551 ..............
552 ..............
553 ..............
554 ..............
555 aaaaaaaaaaaaaa
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 ..............
562 ..............
563 ..............
564 ..............
565 ..............
566 ..............
567 ..............
568 ..............
569 ..............
570 ..............
571 ..............
572 ..............
573 ..............
574 **************
575 Level:
576 <->
577 Tiefighter
578 Bricks:
579 ..cEcEc..cc..c
580 .c#EcEcc.cc.c#
581 .##Ev#v#.EE.#E
582 vvvvvvvvvvvvvv
583 vvvvvvv.v.vvvv
584 vvvvvvvvvvvvvv
585 d.d.d.d.d.d.d.
586 vdvdvdvdvdvdvd
587 vvvvvvvvvvvvvv
588 vgvgvgvgvgvgvg
589 gvgvgvgvgvgvgv
590 vvvvvvvvvvvvvv
591 avavavavavavav
592 vavavavavavavv
593 vvvvvvvvvvvvvv
594 vavavavavavava
595 avavavavavavav
596 ..............
597 Bonus:
598 ..4.444..44..4
599 .4444444.44.44
600 ...44.44.4..44
601 22224242222222
602 2222222.2.2222
603 44444444444444
604 4.4.4.4.4.4.4.
605 45454545422525
606 44442222242222
607 44442424242222
608 343430000b2232
609 00000000002202
610 252525b52b2222
611 525242b242b2bb
612 111141b1411111
613 bmbm414141bmbm
614 0b0b0b0b0b0b0b
615 ..............
616 Level:
617 abstract
618 new universe
619 Bricks:
620 ...!..!!..!...
621 .!..........!.
622 ..............
623 !............!
624 ......**......
625 ....*....*....
626 ..............
627 ..............
628 !..*..**..*..!
629 !..*..**..*..!
630 ..............
631 ..............
632 ....*....*....
633 ......**......
634 !............!
635 ..............
636 .!..........!.
637 ...!..!!..!...
638 Bonus:
639 ...?..??..?...
640 .?..........?.
641 ..............
642 ?............?
643 ..............
644 ..............
645 ..............
646 ..............
647 w.....44.....w
648 w.....44.....w
649 ..............
650 ..............
651 ..............
652 ..............
653 w............w
654 ..............
655 .w..........w.
656 ...w..ww..w...
657 Level:
658 journey
659 con tiempre
660 Bricks:
661 ##.#.#.#..#..#
662 ##.#.#.##.##.#
663 ..............
664 ..............
665 ..............
666 aa.aaa.a*a.a**
667 a*.a*a.a*a.a**
668 a*.a*a.a*a.a**
669 *a.a*a.a*a.a**
670 *a.a*a.a*a.a**
671 aa.aaa.aaa.aaa
672 ..............
673 ..............
674 ..............
675 ..............
676 ..............
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 !!.!!!.!3!.!44
686 !2.!2!.!3!.!44
687 !2.!2!.!3!.!44
688 2!.!2!.!3!.!44
689 2!.!2!.!3!.!44
690 !!.!!!.!!!.!!!
691 ..............
692 ..............
693 ..............
694 ..............
695 ..............
696 ..............
697 ..............
698 Level:
699 _
700 halfpipe
701 Bricks:
702 ..............
703 ..............
704 ..............
705 ..............
706 ..............
707 ..............
708 ..............
709 ..............
710 ..............
711 ..............
712 ..............
713 ..............
714 ..............
715 aaee......eeaa
716 aavz......zvaa
717 aavvz....zvvaa
718 aavvvz..zvvvaa
719 aavvvvzzvvvvaa
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ..............
727 ..............
728 ..............
729 ..............
730 ..............
731 ..............
732 ..............
733 ..............
734 ..bb......bb..
735 44bb......bb44
736 44wwb....bww44
737 ..wwwb..bwww..
738 ..wwwwbbwwww..
739 Level:
740 bio snakes
741 2k38
742 Bricks:
743 ..............
744 ..............
745 ..............
746 .........zzzzz
747 .......zzzxxxx
748 ......zzxxxyyx
749 ......zxxyyyyx
750 zzzzzzxxyyzzyx
751 zyyyyzzzzyzzyx
752 zyxxxxxxzyzyyx
753 zyxyyyyxyy.yxx
754 yyxz..yxy..yyx
755 yyxz..yxy..zyx
756 xxxz..yxy..zyx
757 zzzz.yyxy..zyx
758 z....yxxy..zyx
759 z....yyyy..zyy
760 ...........zzz
761 Bonus:
762 ..............
763 ..............
764 ..............
765 .........}}}}}
766 .......}}}}}}}
767 ......}}}55555
768 ......}}}55555
769 gggggggggggggg
770 gggggggggggggg
771 gppppppppppppp
772 wppppppppp.ppp
773 wwww..ppp..&&&
774 wwww..bbb..&&&
775 wwww..bbb..&&&
776 wwww.bbbb..bbb
777 }....}}}}..}}}
778 w....bbbb..bbb
779 ...........bbb
780 Level:
781 enjoy it
782 dipheomorph
783 Bricks:
784 ..............
785 ..............
786 ..............
787 ..............
788 ..............
789 ....dddggg....
790 ....dgdggg....
791 ....dgdggg....
792 ....ddddgg....
793 ....ggdddd....
794 ....ggddgd....
795 ....gggdgd....
796 ....gggddd....
797 ..............
798 ..............
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 ....??????....
809 ....??????....
810 ....??????....
811 ....??55??....
812 ....??55??....
813 ....??????....
814 ....??????....
815 ....??????....
816 ..............
817 ..............
818 ..............
819 ..............
820 ..............
0 Level:
1 noname
2 flamable
3 Bricks:
4 **************
5 ******d*******
6 ******d*******
7 ******d*******
8 ******dfffffff
9 ******dfffffff
10 ******dfffffff
11 *****vdfffffff
12 *****v*fffffff
13 *****v*v@@@@@@
14 *****v*v******
15 *****v*v*zzzzz
16 *****v*v*z****
17 *****v*v*z****
18 *****v*v*z****
19 !!!!!!!v*z****
20 *******v*z****
21 ...............
22 Bonus:
23 ...............
24 ...............
25 ...............
26 ...............
27 ...............
28 ........W......
29 ........W.{....
30 ........W.{....
31 ...............
32 ...............
33 ...............
34 .......*.....m.
35 ...............
36 ...............
37 ...............
38 &.............
39 ...}..5W.......
40 ...............
41 Level:
42
43
44 Bricks:
45 *vv*******..v*
46 **v*******..v*
47 ***v******..v*
48 ***vv*****..v*
49 EEE*vv****..v*
50 ...E*vvv***..v*
51 ...E**vvv**..v*
52 ...Ev*vvv**..v*
53 ...Ev*v**v*..v*
54 @@Ev*v*vvv*vv*
55 v@vv**vvvv*vv*
56 v@vvi*vvvv*vv*
57 v@vvvivvvvvvv*
58 v@viiivvvvvvv*
59 v@ivvvvvvvvvv*
60 v@ii@v@vvv@vv*
61 vhiiivvvvvv***
62 @h@vv@jj@***@*
63 Bonus:
64 ..**...........
65 ...*...........
66 ....*..........
67 ....**.........
68 .....**........
69 ......**.......
70 .......**......
71 ........*......
72 .........*.....
73 .........**....
74 ..........*....
75 ..........*....
76 ...........*...
77 ...........*...
78 ...........*...
79 ...............
80 ..m.**.........
81 ..m.mm.mm......
82 Level:
83
84 july 4
85 Bricks:
86 **************
87 *vvvvvvvvvvvv*
88 *v**********v*
89 *v*vvvvvvvv*v*
90 *v*v******v*v*
91 *v*v*vvvv*v*v*
92 *v*v*v**v*v*v*
93 *v*v*v**v*v*v*
94 *v*v*v**v*v*v*
95 *v*v*v**v*v*v*
96 *v*v*v**v*v*v*
97 *v*v*v**v*v*v*
98 *v*v*vvvv*v*v*
99 *v*v******v*v*
100 *v*vvvvvvvv*v*
101 *v**********v*
102 *vvvvvvvvvvvv*
103 **************
104 Bonus:
105 ...............
106 ...............
107 ...............
108 ...............
109 ...............
110 ...............
111 ...............
112 ...............
113 ...............
114 ...............
115 ...............
116 ...............
117 ...............
118 ...............
119 ...............
120 ...............
121 ...............
122 ...............
123 Level:
124
125 checkers
126 Bricks:
127 ggccgg**ggccgg
128 ccggcc**ccggcc
129 **************
130 *cfcfcfcfcfcf*
131 *fcfcfcfcfcfc*
132 *cfcfcfcfcfcf*
133 **************
134 kckckc**kckckc
135 ckckck**ckckck
136 **************
137 *!c!c!c!c!c!c*
138 *c!c!c!c!c!c!*
139 *!c!c!c!c!c!c*
140 **************
141 kckckc**kckckc
142 ckckck**ckckck
143 **************
144 ...............
145 Bonus:
146 ...............
147 ...............
148 ...............
149 ...............
150 ...............
151 ...............
152 ...............
153 ...............
154 ...............
155 ...............
156 ...............
157 ...............
158 ...............
159 ...............
160 ...............
161 ...............
162 .......mm......
163 ...............
164 Level:
165
166 brick
167 Bricks:
168 .....*bbbb*....
169 ...***aaaa***..
170 !.*zzzzzzzz*.!
171 ...*yyyyyyyy*..
172 ...*xxxxxxxx*..
173 ***cccccccc***
174 *bbbbbbbbbbbb*
175 *aaaaaaaaaaaa*
176 *zzzzzzzzzzzz*
177 ***yyyyyyyy***
178 ...*xxxxxxxx*..
179 ...*cccccccc*..
180 !.*bbbbbbbb*.!
181 ...***aaaa***..
182 .....*zzzz*....
183 .....*yyyy*....
184 .....*xxxx*....
185 .....******....
186 Bonus:
187 ...............
188 ...............
189 ...............
190 ...............
191 ...............
192 ...............
193 ...............
194 ...............
195 ...............
196 ...............
197 ...............
198 ...............
199 ...............
200 ..........mm...
201 ..........m....
202 ..........m....
203 ..........m....
204 ......**mmm....
205 Level:
206
207 snow storm
208 Bricks:
209 jjjjjjjjjjjjjj
210 jjjjjjjjjjjjjj
211 jjjjjjjjjjjjjj
212 jjjjjjjjjjjjjj
213 jjjjjjjjjjjjjj
214 ..j.jjj..jjjj..
215 .......j......j
216 j.j.....j..j..
217 ......j.......j
218 ..j.j...j..j...
219 ..............j
220 ..j.j.j..j.....
221 ...........j.j.
222 ..j.j.j.j......
223 ...........j..j
224 ...j..j..j.....
225 ...............
226 ...............
227 Bonus:
228 ...............
229 ...............
230 ...W....*......
231 ...WW...*......
232 ....W...*......
233 .....W.........
234 ...............
235 ...............
236 ......*........
237 ...............
238 ...............
239 ......*........
240 ...............
241 ....W...*......
242 ...............
243 ...W..W..*.....
244 ...............
245 ...............
246 Level:
247
248 the x
249 Bricks:
250 vv*vvv**vvv*vv
251 v*c*vv**vv*c*v
252 *zcb*v**v*bcz*
253 k*cba****abc*k
254 kk*bac**cab*kk
255 kkk*ac**ca*kkk
256 kkkk*c**c*kkkk
257 kkkkk****kkkkk
258 **************
259 **************
260 kkkkk****kkkkk
261 kkkk*c**c*kkkk
262 kkk*bc**cb*kkk
263 kk*abc**cba*kk
264 k*cab****bac*k
265 *zca*v**v*acz*
266 v*c*vv**vv*c*v
267 vv*vvv**vvv*vv
268 Bonus:
269 ...............
270 ...............
271 ...............
272 ...............
273 ...............
274 ...............
275 ...............
276 ...............
277 ...............
278 ...............
279 ........5......
280 ...............
281 ...............
282 ...............
283 ....5..........
284 .......}.......
285 ..5.*...j......
286 .......W.......
287 Level:
288
289
290 Bricks:
291 vvvvvvvvvvvvvv
292 ...............
293 ...............
294 *vvvvvvvvvvvv*
295 v*..........*v
296 v.*........*.v
297 v..*vvvvvv*..v
298 v..v*.**.*v..v
299 v..v.*vv*.v..v
300 v**v.v**v.v**v
301 v**v.v**v.v**v
302 v**v.v**v.v**v
303 v..v.*vv*.v..v
304 v..v*.**.*v..v
305 v..*..**..*..v
306 v.*vvvvvvvv*.v
307 v*..........*v
308 *vvvvvvvvvvvv*
309 Bonus:
310 ...............
311 ...............
312 ...............
313 ...............
314 ...............
315 ...............
316 ...............
317 ...............
318 ...............
319 ...............
320 ...............
321 ...............
322 ...............
323 ...............
324 ...............
325 ...............
326 ...............
327 ...............
328 Level:
329
330
331 Bricks:
332 v.....vv.....v
333 vv....vv....vv
334 ..vv...vv...vv.
335 ...vv..vv..vv..
336 ....vv.vv.vv...
337 .....vvvvvv....
338 ......vvvv.....
339 .....vv..vv....
340 ....vv....vv...
341 ...vv......vv..
342 ..vv........vv.
343 vv..........vv
344 vvv........vvv
345 ...vv......vv..
346 ....vv....vv...
347 ...vvvv..vvvv..
348 ..vv**vvvv**vv.
349 vv****vv****vv
350 Bonus:
351 ...............
352 ...............
353 ...............
354 ...............
355 ...............
356 ...............
357 ...............
358 ...............
359 ...............
360 ...............
361 ...............
362 ...............
363 ...............
364 ...............
365 ...............
366 ...............
367 ...............
368 .........m.....
369 Level:
370
371
372 Bricks:
373 #c**c#cc#c**c#
374 #c**c#cc#c**c#
375 #c**c#cc#c**c#
376 #c**c#cc#c**c#
377 #c**c#cc#c**c#
378 #c**c#cc#c**c#
379 #c**c#cc#c**c#
380 #c**c#cc#c**c#
381 #c**c#cc#c**c#
382 #c**c#cc#c**c#
383 #c**c#cc#c**c#
384 #c**c#cc#c**c#
385 #c**c#cc#c**c#
386 #cccc#cc#cccc#
387 #cccc#cc#cccc#
388 #c**c#**#c**c#
389 #c**c#**#c**c#
390 **************
391 Bonus:
392 ...............
393 ...............
394 ...............
395 ...............
396 ...............
397 ...............
398 ...............
399 ...............
400 ...............
401 ...............
402 ...............
403 ...............
404 ...............
405 ...............
406 ...............
407 ...............
408 ...............
409 .....W.....m...
410 Level:
411
412
413 Bricks:
414 ........*******
415 *******cccccc*
416 *ccccccc****c*
417 *c*******cc*c*
418 *c*cccccccc*c*
419 *c*c******c*c*
420 *c*c*cccc*c*c*
421 *c*c*c**c*c*c*
422 *c*c*c**c*c*c*
423 *c*c*c**c*c*c*
424 *c*c*c**c*c*c*
425 *c*c*cccc*c*c*
426 *c*c******c*c*
427 *c*cccccccc*c*
428 *c*******cc*c*
429 *ccccccc****c*
430 *******cccccc*
431 ........*******
432 Bonus:
433 ...............
434 ...............
435 ...............
436 ...............
437 ...............
438 ...............
439 ...............
440 ...............
441 ...............
442 ...............
443 ...............
444 ...............
445 ...............
446 ...............
447 ...............
448 ...............
449 ...............
450 ...............
451 Level:
452
453
454 Bricks:
455 ...*...*v*...*v
456 ....*.*vvv*.*vv
457 ...*.*vvvvv*vvv
458 ..*...*vvv*.*vv
459 *.....*v*...*v
460 ..*.....*.....*
461 ...*...*v*...*v
462 ....*.*vvv*.*vv
463 ...*.*vvvvv*vvv
464 ..*...*vvv*.*vv
465 *.....*v*...*v
466 ..*.....*.....*
467 ...*...*v*...*v
468 ....*.*vvv*.*vv
469 .....*vvvvv*vvv
470 ....*.*vvv*.*vv
471 *.*...*v*...*v
472 ..*.....*.....*
473 Bonus:
474 ...............
475 ...............
476 ...............
477 ...............
478 ...............
479 ...............
480 ...............
481 ...............
482 ...............
483 ........j......
484 ...............
485 ...............
486 ...............
487 ..............}
488 .....W..c......
489 ...............
490 &.............
491 ........c......
492 Level:
493
494
495 Bricks:
496 ##############
497 **z*******z**#
498 *######z######
499 **z***********
500 #############*
501 **z*******z***
502 *#############
503 **z*******z***
504 #############*
505 **z***********
506 *#############
507 **z***********
508 #############*
509 **********z***
510 *#############
511 **z****z******
512 #############*
513 **************
514 Bonus:
515 ...............
516 ...............
517 ...............
518 ...............
519 ...............
520 ...............
521 ...............
522 ...............
523 ...............
524 ...............
525 ...............
526 ...............
527 ...............
528 ...............
529 ...............
530 ...............
531 ...............
532 ............m..
533 Level:
534
535
536 Bricks:
537 ........*......
538 ........*......
539 vvvvvvv*vvvvvv
540 v......*.....v
541 v.....***....v
542 v....*****...v
543 v...*******..v
544 v..*********.v
545 vc***********c
546 vc***********c
547 v..*********.v
548 v...*******..v
549 vvvvv*****vvvv
550 .......***.....
551 ........*......
552 fffffff*ffffff
553 *g*gggg*ggg*g*
554 **************
555 Bonus:
556 ...............
557 ...............
558 ...............
559 ...............
560 ...............
561 ...............
562 ...............
563 ...............
564 ...............
565 ...............
566 ...............
567 ...............
568 ...............
569 ...............
570 ...............
571 ...............
572 ...............
573 ...............
574 Level:
575
576
577 Bricks:
578 *#*#*#**#*#*#*
579 *#*#*#**#*#*#*
580 *#*#*#**#*#*#*
581 *#*#*#**#*#*#*
582 *#*#*#**#*#*#*
583 *#*#*#**#*#*#*
584 *#*#*#**#*#*#*
585 *#*#*#**#*#*#*
586 *#*#*#**#*#*#*
587 *#*#*#**#*#*#*
588 *#*#*#**#*#*#*
589 *#*#*#**#*#*#*
590 *#*#*#**#*#*#*
591 z#z#z#zz#z#z#z
592 *#*#*#**#*#*#*
593 *#*#*#**#*#*#*
594 *#*#*#**#*#*#*
595 **************
596 Bonus:
597 ...............
598 ...............
599 ...............
600 ...............
601 ...............
602 ...............
603 ...............
604 ...............
605 ...............
606 ...............
607 ...............
608 ...............
609 ...............
610 ...............
611 ...............
612 ...............
613 ...............
614 ...............
615 Level:
616
617
618 Bricks:
619 **************
620 ***.**......**
621 ***....vv..**.
622 *****.....***.
623 **vv********..
624 *vvvv******.vv
625 *vvv*****..vvv
626 **vv*..**..vvv
627 **v*....***.vv
628 **v*.vvv..**..
629 ****.vvv...***
630 *v*.vvvv...**v
631 **.vv....**.*v
632 **vv...**...*v
633 *.v..**.....*v
634 *..**.*.....*v
635 ***...*******v
636 *.....*vvvvvvv
637 Bonus:
638 ...............
639 ...............
640 ...............
641 ...............
642 ...............
643 ...............
644 ...............
645 ...............
646 ...............
647 ...............
648 ...............
649 ...............
650 ...............
651 ...............
652 ...............
653 ...............
654 ...............
655 ...............
656 Level:
657
658
659 Bricks:
660 **************
661 *yiiyz**zyiiy*
662 *yiiyz**zyiiy*
663 *yiiyz**zyiiy*
664 *yiiyz**zyiiy*
665 *yiiyz**zyiiy*
666 *yiiyz**zyiiy*
667 *yiiyz**zyiiy*
668 **************
669 **************
670 *yiiyz**zyiiy*
671 *yiiyz**zyiiy*
672 *yiiyz**zyiiy*
673 *yiiyz**zyiiy*
674 *yiiyz**zyiiy*
675 *yiiyz**zyiiy*
676 *yiiyz**zyiiy*
677 **************
678 Bonus:
679 ...............
680 ...............
681 ...............
682 ...............
683 ...............
684 ...............
685 ...............
686 ...............
687 ...............
688 ...............
689 ...............
690 ...............
691 ...............
692 ...............
693 ...............
694 ...............
695 ...**......**..
696 ...............
697 Level:
698
699
700 Bricks:
701 *............*
702 ..v..........v.
703 ..*v........v*.
704 ...*v......v*..
705 ....*v....v*...
706 .....*v..v*....
707 ......*vv*.....
708 .......vv......
709 .......**......
710 .......**......
711 .......vv......
712 ......*vv*.....
713 .....*v..v*....
714 ....*v....v*...
715 ...*v......v*..
716 ..*v........v*.
717 ..v..........v.
718 *............*
719 Bonus:
720 ...............
721 ...............
722 ...............
723 ...............
724 ...............
725 ...............
726 ...............
727 ...............
728 ...............
729 ...............
730 ...............
731 ...............
732 ...............
733 ...............
734 ...............
735 ...............
736 ...............
737 ...............
738 Level:
739
740
741 Bricks:
742 vvvvvz**zvvvvv
743 *****z**z*****
744 vvvvvz**zvvvvv
745 *****z**z*****
746 vvvvvz**zvvvvv
747 *****z**z*****
748 vvvvvz**zvvvvv
749 *****z**z*****
750 zzzzzz**zzzzzz
751 **************
752 zzzzzz**zzzzzz
753 **************
754 .......**......
755 .......**......
756 .......**......
757 .......**......
758 .......**......
759 .......**......
760 Bonus:
761 ...............
762 ...............
763 ...............
764 ...............
765 ...............
766 ...............
767 ...............
768 ...............
769 ...............
770 ...............
771 ...............
772 ...............
773 ...............
774 ...............
775 ...............
776 ...............
777 ...............
778 ...............
779 Level:
780
781
782 Bricks:
783 **************
784 **************
785 **************
786 **************
787 **************
788 **************
789 **************
790 *****cccc*****
791 *****cccc*****
792 *****cccc*****
793 *****cccc*****
794 *****cccc*****
795 *****cccc*****
796 *****cccc*****
797 *****cccc*****
798 *****cccc*****
799 *****cccc*****
800 *****cccc*****
801 Bonus:
802 ...............
803 ...............
804 ...............
805 ...............
806 ...............
807 ...............
808 ...............
809 ...............
810 ...............
811 ...............
812 ...............
813 ...............
814 ...............
815 ...............
816 ...............
817 ...............
818 ...............
819 ...............
820 Level:
821
822
823 Bricks:
824 !.....cc.....!
825 !.....cc.....!
826 !.....cc.....!
827 !.....cc.....!
828 ..!....cc....!.
829 ...!...cc...!..
830 ....!..cc..!...
831 .....!.cc.!....
832 ......*cc*.....
833 cccccccccccccc
834 ......*cc*.....
835 .....!.cc.!....
836 ....!..cc..!...
837 ...!...cc...!..
838 ..!....cc....!.
839 !.....cc.....!
840 !.....cc.....!
841 !.....cc.....!
842 Bonus:
843 ...............
844 ...............
845 ...............
846 ...............
847 ...............
848 ...............
849 ...............
850 ...............
851 ...............
852 ...............
853 ...............
854 ...............
855 ...............
856 ...............
857 ...............
858 ...............
859 ...............
860 ...............
861 Level:
862
863
864 Bricks:
865 !.!........!.!
866 ..!..........!.
867 !............!
868 ..!..........!.
869 ...!........!..
870 ....!......!...
871 .....!....!....
872 ......!..!.....
873 .......!!......
874 .......!!......
875 ......!..!.....
876 .....!....!....
877 ....!......!...
878 ...!........!..
879 ..!..........!.
880 !............!
881 ..!..........!.
882 !.!........!.!
883 Bonus:
884 ...............
885 ...............
886 ...............
887 ...............
888 ...............
889 ...............
890 ...............
891 ...............
892 ...............
893 .......*.......
894 ...............
895 ...............
896 ...............
897 ...............
898 ...............
899 ...............
900 ...............
901 ...............
902 Level:
903
904
905 Bricks:
906 **************
907 cbbbbbbbbbbbbc
908 ca.**.kk.**.ac
909 cavvvvkkvvvvac
910 ca.**.kk.**.ac
911 cavvvvkkvvvvac
912 ca.**.kk.**.ac
913 cavvvvkkvvvvac
914 ca.**.kk.**.ac
915 cavvvvkkvvvvac
916 ca.**.kk.**.ac
917 cavvvvkkvvvvac
918 ca.**.kk.**.ac
919 cavvvvkkvvvvac
920 ca.**.kk.**.ac
921 cavvvvkkvvvvac
922 cbbbbbbbbbbbbc
923 **************
924 Bonus:
925 ...............
926 ...............
927 ...............
928 ...............
929 ...............
930 ...............
931 ...............
932 ...............
933 ...............
934 ...............
935 ...............
936 ...............
937 ...............
938 ...............
939 ...............
940 ...............
941 ...............
942 ...............
943 Level:
944
945
946 Bricks:
947 v.v.v.v.v.v.v.
948 ..............v
949 v.............
950 ..............v
951 v.............
952 .....#.#####..v
953 v...#gg***#...
954 .....#ggzzz#..v
955 v...#gg***#...
956 .....#zzzzz#..v
957 v...#*****#...
958 .....#zzzzz#..v
959 v...#*****#...
960 .....#######..v
961 v.............
962 ..............v
963 v.............
964 ..v.v.v.v.v.v.v
965 Bonus:
966 ...............
967 ...............
968 ...............
969 ...............
970 ...............
971 ...............
972 ......m........
973 ...............
974 ...............
975 ...............
976 ...............
977 ...............
978 ...............
979 ...............
980 ...............
981 ...............
982 ...............
983 ...............
984 Level:
985
986
987 Bricks:
988 !.!...cc...!.!
989 ..!....cc....!.
990 !.....cc.....!
991 ..!....cc....!.
992 ...!...cc...!..
993 ....!..cc..!...
994 .....!.cc.!....
995 ......!cc!.....
996 cccccccccccccc
997 **************
998 ......!**!.....
999 .....!.**.!....
1000 ....!..**..!...
1001 ...!...**...!..
1002 ..!....**....!.
1003 !.....**.....!
1004 ..!....**....!.
1005 !.!...**...!.!
1006 Bonus:
1007 ...............
1008 ...............
1009 ...............
1010 ...............
1011 ...............
1012 ...............
1013 ...............
1014 ...............
1015 ...............
1016 55555555555555
1017 .......55......
1018 .......55......
1019 .......55......
1020 .......55......
1021 .......55......
1022 .......55......
1023 .......55......
1024 .......55......
0 Version: 2.30
1 Level:
2 Redito
3 Happy New Year!
4 Bricks:
5 j.jj...jjj.jjj
6 j..j...j.j.j.j
7 j..j.j.j.j.j.j
8 j.j....j.j.j.j
9 j.j..j.j.j.j.j
10 j.jj...jjj.jjj
11 @..@.@.@.@.@.@
12 ..............
13 **************
14 !!!!!!!!!!!!!!
15 !!!!!!!!!!!!!!
16 !!!!!!!!!!!!!!
17 **************
18 !!!!!!!!!!!!!!
19 **************
20 **************
21 ..............
22 ..............
23 Bonus:
24 ~.W....W5~.~.W
25 f..f.......5.d
26 5..&.f.f.f...l
27 d.5....d.&.f.f
28 f....5.....d.5
29 W.*~...~5W.W*.
30 ..............
31 ..............
32 ..............
33 f<.j.fwwf.j.<f
34 33333333333333
35 d.f.b<..<b.f.d
36 ..............
37 <W..f.gg.f..W<
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Redito
44 Be My Love
45 Bricks:
46 ..............
47 .vdv.vdv......
48 vdddvdddv.....
49 ddddddddd.....
50 ddddddddd.....
51 vdddddddv.....
52 .ddddddjv.vjv.
53 .vddddjjjvjjjv
54 ..dddjjjjjjjjj
55 ..vddjjjjjjjjj
56 ...dddjjjjjjjv
57 ...vdvjjjjjjj.
58 ......vjjjjjv.
59 .......jjjjj..
60 .......vjjjv..
61 ........jjj...
62 ........vjv...
63 ..............
64 Bonus:
65 ..............
66 .c{...{.......
67 1..202.01.....
68 *.?.c.>.*.....
69 .2..2..2......
70 >.d.d.d.......
71 .{>.l.?Wc..W..
72 ...252~.202.0c
73 ..d..W.?.d.>.W
74 ..c.c.2.c2c.2.
75 ...{0....*...1
76 ....d.W>.l.?W.
77 ......1..5....
78 .......W2.2d..
79 .........c.c..
80 ........W0W...
81 .........d....
82 ..............
83 Level:
84 Redito
85 Luck O' The Irish
86 Bricks:
87 .....ddd......
88 ....dxfxd.....
89 ...dxaaaxd....
90 ...dfaccaxd...
91 ..dxaciicaxd..
92 ..dfaciicafd..
93 .dxaci..icaxd.
94 .dfaci..icafd.
95 @hhhhhh@.icaxd
96 @hhhhhh@.icaxd
97 @hhhhhh@.icafd
98 @hhhhhh@......
99 @hhhhhh@......
100 @hhhhhh@......
101 @hhhhhh@......
102 @hhhhhh@......
103 .@hhhh@.......
104 ..@@@@........
105 Bonus:
106 .....{g.......
107 ......m0{.....
108 ...}.gb..g....
109 ...{?.f.}p....
110 ..g0.0?0.<0{..
111 .......gf..g..
112 .?m0f?....}...
113 .{0<+...0+.p..
114 .5.55.5...f...
115 3}2..2}3.?.b.{
116 .5.55.5...g0-.
117 .j2..2j.......
118 35.55.53......
119 .-2ml2-.......
120 .5.55.5.......
121 3j5555j3......
122 ..-22-........
123 ...33.........
124 Level:
125 Redito
126 Spring Has Sprung!
127 Bricks:
128 !bb...EE...bb!
129 bb!b.!bb!.b!bb
130 .EEb!b!!b!bEE.
131 ..............
132 ..dd......ii..
133 .dddd....iiii.
134 d*dd*d..iiiiii
135 ddhhdd..iihhii
136 d*dd*d..iiiiii
137 .dddd....iiii.
138 ..ff......ff..
139 f.ff.f..f.ff.f
140 .ffff....ffff.
141 ..ff......ff..
142 @.ff.x@@x.ff.@
143 xfxxffxxffxxfx
144 fxffxffffxffxf
145 ..............
146 Bonus:
147 0g..........g0
148 ..15.1gl1.g1..
149 ...g0.00g0....
150 ..............
151 ..............
152 .?22?....c25c.
153 ..............
154 ~.11.~..~.11.~
155 ..............
156 .?{{?....c{{c.
157 ..............
158 >....p..p....>
159 ..}}......}}..
160 ..w?......?w..
161 ..00.3..3.00..
162 >.bb-<s<s-bb.>
163 0f..1.++.1..f0
164 ..............
165 Level:
166 Redito
167 Easter Egg Hunt
168 Bricks:
169 .....vjjv.....
170 ....vj..jv....
171 ...vjvhhvjv...
172 ..vEjffffjEv..
173 .vEjvv@@vvjEv.
174 .vEjedededjEv.
175 .vEjdededejEv.
176 .vEjvv@@vvjEv.
177 .vEj!a!a!ajEv.
178 .vEja!a!a!jEv.
179 .vEjvv@@vvjEv.
180 .vEjdededejEv.
181 .vEjedededjEv.
182 .vEjvv@@vvjEv.
183 ..vEjffffjEv..
184 ...vjvhhvjv...
185 ....vj..jv....
186 ......jj......
187 Bonus:
188 .....1gg1.....
189 ....fW..Wf....
190 ...~..55..~...
191 ..2.pmjjmp.2..
192 .>..0....0l.>.
193 ...s...2..s...
194 .b..2.?.?2..b.
195 .c.>......>.c.
196 .......1.f....
197 .1.-f.1...-.1.
198 .>..........>.
199 ...W2....2W...
200 .1..b.2.2b..1.
201 .f.d.0..0.d.f.
202 ..~...ww...~..
203 ...>..11..>...
204 ....cW..Wc....
205 ......<<......
206 Level:
207 Redito
208 Call Your Mom!
209 Bricks:
210 Ev.vE.........
211 iaEaiv........
212 aiaiav........
213 ivaviEvvE.....
214 avivaiaaiv....
215 ivEviaiiav....
216 av.vai..iEv.vE
217 iv.via..aiaEai
218 av.vaivviaiaia
219 iv.via..aivavi
220 Ev.vEi..iaviva
221 ....vaiiaivEvi
222 ....viaaiav.va
223 .....EvvEiv.vi
224 ........vav.va
225 ........viv.vi
226 .........Ev.vE
227 ..............
228 Bonus:
229 .>.c..........
230 5p.b5.........
231 d.*..f........
232 .}.g..cp......
233 2.5.24*&4.....
234 .>.<...?.f....
235 ~...dW..W.>.c.
236 .-.2.....5b.p5
237 c...cl55l..*.d
238 4{.?4d..d.g.}.
239 .f.+.....2.5.2
240 ....f.?b..2.>.
241 .....4w*4....~
242 ......-+..W.-.
243 ........fc...c
244 ........24?.{4
245 ..........+.f.
246 ..............
247 Level:
248 Redito
249 Call Your Dad!
250 Bricks:
251 #v............
252 akv...........
253 kva#..........
254 avvkv.........
255 kvvav.#.......
256 avvkvvav......
257 kvva#kvk#v....
258 avvkav.va#v...
259 kva#kvvvkakv..
260 akv.akakakva#.
261 #...kv#vkavvkv
262 ....av.vakvvav
263 ....kv.vkavvkv
264 ....av.vakvvav
265 ....#v.v#avvkv
266 .........kva#.
267 .........akv..
268 .........#....
269 Bonus:
270 .0............
271 5~b...........
272 .1?...........
273 <...d.........
274 1!>+0.........
275 f...p0?0......
276 1-0>..f..b....
277 b...3...!.0...
278 .*d..1*1.5.l..
279 2.0.1.w.1.1?..
280 .....d.d.b...d
281 ....s2.2s13>+.
282 .....-.-.f...c
283 ....W...W1-0b.
284 .....>.>.<...*
285 ..........~d..
286 .........2.0..
287 ..............
288 Level:
289 Redito
290 Ice Cream Summer Days
291 Bricks:
292 .!.!.j!jj.!.!.
293 c.c.jjjjdj.c.c
294 .!.jjdjjjj..!.
295 c..djjj!jjj..c
296 ..jjj!djdjdj..
297 !.jjdjjjjjjj.!
298 ..j!jjj!jjjd..
299 c.djjdjjjd!j.c
300 ..jdjj!jjjjj..
301 !.jj!jjjdjj..!
302 ...jjjdjj!j...
303 ...j@@@@@j....
304 ....@@@@@.....
305 ....@@@@@.....
306 ....@@@@@.....
307 .....@@@......
308 .....@@@......
309 .....@@@......
310 Bonus:
311 .j...~fl2.m.j.
312 f.f....~?..f.f
313 .}..~2g..2..}.
314 >..?...f.~...>
315 ..2~.f?.?.?...
316 f...?..~.2.2.f
317 ...f.2&f...?..
318 ..?.~?...?f...
319 ..2?..f~2.....
320 >...f...?.~..>
321 ...~.5w5.f....
322 ...2..4..~....
323 ..............
324 ....4.4.4.....
325 ..............
326 ..............
327 ......4.......
328 ..............
329 Level:
330 Redito
331 Oh, Canada!
332 Bricks:
333 jjjjjjdjjjjjjj
334 jjdjjdddjjdjjj
335 jjddjdddjddjjj
336 jjdddddddddjjj
337 jjdddddddddjjj
338 djjdddddddjjdj
339 ddjjdddddjjddj
340 dddjdddddjdddj
341 dddddddddddddj
342 jdddddddddddjj
343 jjdddddddddjjj
344 jjjdddddddjjjj
345 jjjdddddddjjjj
346 jjdddddddddjjj
347 jdddddddddddjj
348 jdddddddddddjj
349 jjjjjjdjjjjjjj
350 jjjjjjdjjjjjjj
351 Bonus:
352 +d.4.d*d.4.dc+
353 ..-...3...-...
354 W...-?.?-...W4
355 ..2.f0j0f.2...
356 c..{1~.~1{...c
357 ?4..-.0.?..4?.
358 ......*.......
359 f.~d.{l{.d~.fW
360 .2.1?0f0-1.2.0
361 ..{...2...{...
362 d.c1..*..1c.0d
363 .W..-.0.?..W..
364 c4.2.~d~.2.4.c
365 ..d...{...d..0
366 ..{.?...-.{.c.
367 --.>.f3f.>.-.-
368 .W.4.wWw.4..Ww
369 >+.W-+.+-.W.+>
370 Level:
371 Redito
372 America The Beautiful
373 Bricks:
374 a!a!a!dddddddd
375 !a!a!adddddddd
376 a!a!a!jjjjjjjj
377 !a!a!ajjjjjjjj
378 a!a!a!dddddddd
379 !a!a!adddddddd
380 a!a!a!jjjjjjjj
381 !a!a!ajjjjjjjj
382 dddddddddddddd
383 dddddddddddddd
384 jjjjjjjjjjjjjj
385 jjjjjjjjjjjjjj
386 dddddddddddddd
387 dddddddddddddd
388 jjjjjjjjjjjjjj
389 jjjjjjjjjjjjjj
390 dddddddddddddd
391 dddddddddddddd
392 Bonus:
393 f2f2<2*.?..{.*
394 2.2.2....{....
395 .2f2.2....W.&.
396 2.2f2f.W.l..W.
397 f2f2.2~......~
398 2.2f2...~?~...
399 .2.2.2.W..W...
400 2<2f2f.&.....&
401 -.?...{{...?.-
402 ...~.-...-~...
403 W...W.&..W...W
404 ..W..w..w..W..
405 {.?...--...?.{
406 ....{..*.{....
407 w....W..W....w
408 ..W&.......W..
409 ?..-.~..~.-..?
410 -?.{..--..{.?-
411 Level:
412 Redito
413 Leaves are Falling
414 Bricks:
415 akakaka...ee@@
416 kakaka..de@de@
417 akaka..e@.e@d@
418 kaka....@@.@.@
419 akak....e@de@.
420 kak...@@d@@.@.
421 aka...e@.e@e@@
422 ka.....e@d@.d@
423 aa.....d@.@@.@
424 k....e@.@ed@@@
425 a......@@@ed@@
426 ......e.e@@.@@
427 ..e.d...@e@@@@
428 d..........@@@
429 ed...e..e...@@
430 eeede..d....@@
431 edeedee..e..@@
432 deeeedeed..e@@
433 Bonus:
434 mWf.d.f....w.5
435 W3.W3W..*5.0lc
436 d.d.f......-{.
437 .f......5....5
438 W........~5m..
439 .d3...5-5-..5.
440 3W.........b.5
441 .........w5.5-
442 W<.....*...-..
443 .....c5.~.*.c5
444 d......-.-b5-.
445 ......~.5.5..c
446 ..c.........~.
447 ...........5.5
448 c3......c.....
449 .~-.c.......5w
450 c..3..~.......
451 {-0.-.0-...0-5
452 Level:
453 Redito
454 Trick or Treat!
455 Bricks:
456 ......x.......
457 ......x.......
458 .....xxx......
459 ....eeeee.....
460 ...eeeeeee....
461 ..eeeeeeeee...
462 .eevveeevvee..
463 .eevveeevvee..
464 eeeeveeeveeee.
465 eeeeeeveeeeee.
466 eeeeeeveeeeee.
467 eeveeeeeeevee.
468 eevveeeeevvee.
469 .eevvevevvee..
470 .eeevvvvveee..
471 ..eeeveveee...
472 ...eeeeeee....
473 ....eeeee.....
474 Bonus:
475 ......5.......
476 ......5.......
477 ......l.......
478 .....}*}......
479 ...b!.2.!b....
480 ..}c.f<f.c}...
481 .?.dd{5{dd.?..
482 .WfddjpjddfW..
483 w-.0d~.~d0.-w.
484 *.>.{gdg{.>.*.
485 bWf5<.d.<5fWb.
486 !2dc.2f2.cd2!.
487 ?.dd>~w~>dd.?.
488 .b~dd{d{dd~b..
489 .>cfdddddfc>..
490 ..s?Wd0dW?s...
491 ...>.f>f.>....
492 ....-0+0-.....
493 Level:
494 Redito
495 Lest We Forget
496 Bricks:
497 .....v@@@v....
498 .....v@@@v....
499 .....v@@@v....
500 .....v@@@v....
501 .vvvvv@d@vvvvv
502 .v@@@@ddd@@@@v
503 .v@@@ddxdd@@@v
504 .v@@@ddxdd@@@v
505 .v@@@@ddd@@@@v
506 .vvvvv@d@vvvvv
507 .....v@@@v....
508 .j...v@@@v..j.
509 jjj..v@@@v.jjj
510 .j...v@@@v..j.
511 .j...v@@@v..j.
512 .j...v@@@v..j.
513 .j...v@@@v..j.
514 .....v@@@v....
515 Bonus:
516 .....2?.?2....
517 .......2......
518 .....j.2.j....
519 ......?.?.....
520 .2.~.c.d.c.~.2
521 ..?.?..j..?.?.
522 .?.2...l...2.?
523 .j.2..?*?..2.j
524 ..?.?..j..?.?.
525 .2.dm..d..md.2
526 .....c.?.c....
527 ..............
528 .4...~2?2~..4.
529 ..............
530 .d...c.?.c..d.
531 ..............
532 .~...j.?.j..~.
533 .....2...2....
534 Level:
535 Redito
536 Baby It's Cold
537 Bricks:
538 jakcja#cjEkcja
539 cjakcjakcjakcj
540 kcjakcjakcjEkc
541 bkcjakcja#cjak
542 ja#cjakcjakcja
543 cjakcjakcjakcj
544 kcjakcjakcja#c
545 akcjakcjakcjak
546 #akcjakcjEkcja
547 cjakcjakcjakcj
548 kcja#cjakcjakc
549 akcjakc#akcjak
550 jakcjakcjakcja
551 cjakcjakcjakcj
552 kcjEkcjakcjEkc
553 a#cjakcjakcja#
554 jakcjakcjakcja
555 cjakcjakcjakcj
556 Bonus:
557 1f.dWf.dW..dWf
558 <W<f.1<lf.f..1
559 df....W..<1.<d
560 2!d.W.d2!..f!.
561 W1.f1..dWf.dcf
562 ......!...2..2
563 .<c.df.1.m<...
564 f..W..W.W..dfW
565 .m..2!.f2..1..
566 d.!.f.d.<Wf..1
567 .W.1.Wf...2!.<
568 f.d.....f..W.2
569 W.2.f<.W1..<.f
570 21<cd2f..c..fd
571 d.....d..<W..W
572 ..d.f.W!..1d..
573 W!1...2.....!f
574 1.f.Wd<<fdWf.1
575 Level:
576 Redito
577 Be Thankful
578 Bricks:
579 v.v.v.v.v.v.v.
580 .v.v.v.v.v.v.v
581 v.v.v.v.v.v.v.
582 .v.v.v.v.v.v.v
583 v.v.v.v.v.v.v.
584 ..............
585 ...d......h...
586 ..ddd....hhh..
587 .ddddd..hhhhh.
588 cdddddcahhhhha
589 .cdddc..ahhha.
590 ..ccc....aaa..
591 @@@@@@@@@@@@@@
592 @@@@@@@@@@@@@@
593 @vvv@vvvv@vvv@
594 @...@....@...@
595 @...@....@...@
596 ..............
597 Bonus:
598 d.4.W.l.W.3.d.
599 .....3.3.....m
600 W.3.c.g.c.4.W.
601 .>.........>.c
602 c.3.b.d.b.3...
603 ..............
604 ...>......>...
605 ..5.5....-.-..
606 .?.j.?..5.j.5.
607 d.{.{....{.{.d
608 ...?......g...
609 ..f~f....f~f..
610 d.2.>.22.>.2.d
611 2.?.2>dd>2.?.2
612 .m.W.dbbd.W.!.
613 2...2....2...2
614 {...{....{...{
615 ..............
616 Level:
617 Redito
618 Merry Christmas!
619 Bricks:
620 f*f@..v...@f*f
621 **@..vhv...@**
622 **..vh!hv...**
623 f@...vhv....@f
624 @....xjx.....@
625 ....ff*ff.....
626 ....xdedx.....
627 ...ffj*jff....
628 ...x*e!e*x....
629 ..ff!f*f!ff...
630 ..xdfe!efdx...
631 .ffgjf*fjgff..
632 fxdjfe!efjdxf.
633 x*!d!d!d!d!*x.
634 xxxxxx@xxxxxx.
635 ......@.......
636 !!.ff.@.dd.!!.
637 !!.ff.@.dd.!!.
638 Bonus:
639 5.5...f....5.5
640 .....j5j......
641 .5..05l50...5.
642 5....fmf.....5
643 .....212......
644 ....1...1.....
645 .....f0f......
646 ..............
647 ...f.0!0.f....
648 ..1p2...2p1...
649 ....W0?0W.....
650 .1f.1f.f1.f1..
651 <.1..0.0..1.<.
652 d..w2.?.2w..d.
653 0W+>-<.<->+W0.
654 ......5.......
655 .<..c...c..<..
656 0..-.....-..0.
0 Version: 1.01
1 Level:
2 Bjoern Ganslandt
3 Breakthrough
4 Bricks:
5 *h*h*h**h*h*h*
6 h*h*h*hh*h*h*h
7 *h*h*h**h*h*h*
8 ##h*h*hh*h*h##
9 g##h*h**h*h##g
10 gg##h*hh*h##gg
11 fgg##h**h##ggf
12 ffgg##vv##ggff
13 hffgg#vv#ggffh
14 hhffggggggffhh
15 ehhffffffffhhe
16 eeeeeeeeeeeeee
17 eeeeeeeeeeeeee
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 .............p
30 ........0.....
31 m..........c..
32 ....w.........
33 ..............
34 ...+.....<..1.
35 .?...c........
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Bjoern Ganslandt
44 Jump a lot
45 Bricks:
46 ..............
47 ..............
48 .fffffffffffff
49 .iiiiiiiiiiiii
50 ..............
51 ..............
52 #############.
53 ..............
54 ..............
55 .#############
56 ..............
57 ..............
58 #############.
59 ..............
60 ..............
61 iii###########
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ......c.......
68 .2.2.w.2.2f2.2
69 ..............
70 ..............
71 ..............
72 ..............
73 ..............
74 ..............
75 ..............
76 ..............
77 ..............
78 ..............
79 ..............
80 ++............
81 ..............
82 ..............
83 Level:
84 Bjoern Ganslandt
85 Icy
86 Bricks:
87 jjjjjjjjjjjjjj
88 jj.jjj.jjjjjjj
89 jj.jjj.jjjj.jj
90 j..jjj.jjjj..j
91 j..jjj.jjjj..j
92 j..jjj.jjjj...
93 j..jjj.jjjj...
94 j..jj..jjjj...
95 j..jj..jjjj...
96 ....j..jjj....
97 ....j..jjj....
98 ....j..jjj....
99 ....j...jj....
100 ....j...jj....
101 ....j...jj....
102 ........j.....
103 ........j.....
104 ........j.....
105 Bonus:
106 ff.f...f..f.f.
107 ....f....l...f
108 ff.ff.....m.ff
109 .....f..f....f
110 f...f..ff.....
111 ...f.....0f...
112 0....0..f.....
113 ...ff..f..f...
114 f...l...df....
115 ....2..f......
116 ........ff....
117 .........f....
118 ....f...f.....
119 .........f....
120 ........f.....
121 ........f.....
122 ........f.....
123 ..............
124 Level:
125 Bjoern Ganslandt
126 Rock solid
127 Bricks:
128 ..............
129 .c.....c......
130 .#.....#......
131 ....c....c....
132 ....#....#..c.
133 .c..........#.
134 .#.....c......
135 .....c.#....c.
136 .....#......#.
137 ...c..........
138 .c.#..c..c....
139 .#....#..#....
140 .....c.......c
141 .....#..c....#
142 .c......#..c..
143 .#.........#..
144 ..............
145 ..............
146 Bonus:
147 ..............
148 .2.....c......
149 ..............
150 ..............
151 ............+.
152 ..............
153 .......2......
154 ..............
155 ..............
156 ...s..........
157 .........2....
158 ..............
159 ..............
160 ..............
161 ...........f..
162 ..............
163 ..............
164 ..............
165 Level:
166 Bjoern Ganslandt
167
168 Bricks:
169 @............@
170 d@g........g@d
171 dd@g......g@dd
172 ddd@g....g@ddd
173 dddd@ghhg@dddd
174 cdddd@hh@ddddc
175 gcddddhhddddcg
176 .gcdddhhdddcg.
177 ..gcddhhddcg..
178 ...gcdhhdcg...
179 ....gchhcg....
180 .....ghhg.....
181 ..............
182 ..............
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..........w...
191 ?.p.........?.
192 .......f......
193 ..............
194 ....?.........
195 .+............
196 ...........+..
197 ...-..........
198 ..............
199 .....+........
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Bjoern Ganslandt
208 Tux
209 Bricks:
210 .....aaa......
211 ....aaaaa.....
212 ....aaaaaa....
213 ...aaaaaaa....
214 ...ajjaajj....
215 ...ajjaajj....
216 ...aj.aaj.....
217 ...aj.aaj.....
218 ...aaaaaaa....
219 ...aeeeeee....
220 ...aeeeeeee...
221 ...aeaeeeee...
222 ...aeeaaaa....
223 ..aajeeeee....
224 ..aajjeeeja...
225 .aaajjjjjjaa..
226 aaajjjjjjjjaa.
227 aaajjjjjjjjaa.
228 Bonus:
229 ..............
230 ......m.......
231 ..............
232 ....-.........
233 ..............
234 .......j......
235 ..............
236 ..............
237 ..............
238 ..............
239 ...?..........
240 ......+...w...
241 ..............
242 ...0..........
243 .......1.~....
244 ..............
245 ....c.........
246 .-.......f....
247 Level:
248 Bjoern Ganslandt
249 Maze
250 Bricks:
251 hh#.....#.....
252 ..#..gg.#..h..
253 ..#..gg.#.hhh.
254 ..#.....#.hhh.
255 ..#..#..#.hhh.
256 .##..#..#..h..
257 .....#..#.....
258 .....#..####..
259 .ee..#.....#..
260 .ee..#..dd.#..
261 .....#..dd.#..
262 .....#.....#..
263 ###.!####cc#..
264 .f#....#...#..
265 .f#....#...#..
266 ..#..###...#..
267 ..#....#...#..
268 .##....#...#..
269 Bonus:
270 m.............
271 .....-........
272 ...........2..
273 ...........2..
274 ...........2..
275 ..............
276 ..............
277 ..............
278 ..............
279 ..+......f....
280 ........l.....
281 ..............
282 .........?c...
283 .b............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Bjoern Ganslandt
290 Invisible
291 Bricks:
292 .v..........v.
293 .v..........v.
294 .vvvvvvvvvvvv.
295 ..............
296 ..............
297 .vvvvvvvvvvvv.
298 ..............
299 ..............
300 ..............
301 ..v........v..
302 .vvvvvvvvvvvv.
303 ..v........v..
304 vv..........vv
305 .vvv.....vvv..
306 v.v.v...v.v.v.
307 vv.vvv.vvv.vvv
308 v...v...v...v.
309 ..............
310 Bonus:
311 ..............
312 .g..........b.
313 ......22......
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 ..............
320 ..............
321 ......f.......
322 ..m........<..
323 .............p
324 .c............
325 ..........d...
326 }...+...+.....
327 ........-...w.
328 ..............
329 Level:
330 Bjoern Ganslandt
331 CPU-eater
332 Bricks:
333 **************
334 *!!!!!**!!!!!*
335 *!....**....!*
336 *!.!******!.!*
337 *!.!*!!!!*!.!*
338 *!.!*!..!*!.!*
339 *!.!*!..!*!.!*
340 *!.!*!..!*!.!*
341 *!.!*!..!*!.!*
342 *!.!*!..!*!.!*
343 *!.!*!..!*!.!*
344 *!.!*!..!*!.!*
345 *!.!*!..!*!.!*
346 *!.!*hhhh*!.!*
347 *!.!*hhhh*!.!*
348 *!.!*hhhh*!.!*
349 **************
350 ..............
351 Bonus:
352 ..............
353 .?..........?.
354 ..............
355 .?..........?.
356 ..............
357 .?..........?.
358 ..............
359 .?..........?.
360 ..............
361 .?..........?.
362 ..............
363 .?..........?.
364 ..............
365 .?..........?.
366 ......33......
367 .?..........?.
368 ..............
369 ..............
370 Level:
371 Bjoern Ganslandt
372 Waltz
373 Bricks:
374 ..............
375 ......aa......
376 aa...jaaj..aa.
377 aa.a..aa...aa.
378 aa....a....aa.
379 ajjjjjajjjjajj
380 a.....a....a..
381 a.....a....a..
382 ajjjjjaajjjajj
383 a..........a..
384 a..........a..
385 jjjjjjjjjjjajj
386 ..............
387 ..............
388 jjjjjjjjjjjjjj
389 ..............
390 ..............
391 jjjjjjjjjjjjjj
392 Bonus:
393 ..............
394 ..............
395 ......p.......
396 -..3..........
397 ............?.
398 ..............
399 m.....-.......
400 ..............
401 ...........~..
402 ..............
403 ..............
404 b....+..>.....
405 ..............
406 ..............
407 ..w.d...j.-c..
408 ..............
409 ..............
410 -.<...f.-.....
411 Level:
412 Bjoern Ganslandt
413 Do not move!
414 Bricks:
415 ..............
416 ..E.....d.....
417 ..E...........
418 **E...........
419 *dE.........f.
420 eeE...........
421 hhE...........
422 ffE...........
423 ggE....g......
424 EEE.........e.
425 ..............
426 ..............
427 ..E...........
428 ..............
429 ..............
430 EE....EEEEEEEE
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ........1.....
436 ..............
437 ..............
438 ............1.
439 ..............
440 ..............
441 ..............
442 .......1......
443 ............j.
444 ..............
445 ..............
446 ..............
447 ..............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Bjoern Ganslandt
454 Symmetry
455 Bricks:
456 !!!!!!@@!!!!!!
457 ......@@......
458 ......@@......
459 ......@@......
460 ......@@......
461 ......@@......
462 ..cc..@@..cc..
463 ..cc..@@..cc..
464 ......@@......
465 ......@@......
466 ......@@......
467 ......@@......
468 ......@@......
469 ......@@......
470 .....@@@@.....
471 .EEEEEEEEEEEE.
472 .EzzEzEEzEzzE.
473 .E..E....E..E.
474 Bonus:
475 000000..000000
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 ..+*......*+..
482 ..............
483 ..............
484 ..............
485 ..............
486 ..............
487 ..............
488 ..............
489 ..............
490 ..............
491 ..c..f..f..c..
492 ..............
493 Level:
494 Bjoern Ganslandt
495 Multiball
496 Bricks:
497 zzzzzzzzzzzzzz
498 yEyyyyyyyyyyEy
499 zEzzzzzzzzzzEz
500 xExxxxxxxxxxEx
501 zEzzzzzzzzzzEz
502 yEyyyyyyyyyyEy
503 zEzEEEEEEEEzEz
504 xExExxxxxxExEx
505 zEzEzzzzzzEzEz
506 !E!!!!!!!!!!E!
507 zEEEEEEEEEEEEz
508 !!!!!!!!!!!!!!
509 fccccccccccccf
510 fccccccccccccf
511 fccccccccccccf
512 fccccccccccccf
513 fccccccccccccf
514 ffffffffffffff
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..............
523 ..............
524 ..............
525 ..............
526 ..............
527 bbbbbbbbbbbbbb
528 wwwwwwwwwwwwww
529 b00000000000bb
530 bbbbbbbbbbbbbb
531 bbbbbbbbbbbbbb
532 &&&&&&&&&&&&&&
533 wwwwwwwwwwwwww
534
0 Version: 1.00
1 Level:
2 Ade
3 Colorful
4 Bricks:
5 .!.*.EEE###@@@
6 *.!.*.EEE###@@
7 .*.!.*.EEE###@
8 ..*.!.*.EEE###
9 k..*.!.*.EEE##
10 jk..*.!.*.EEE#
11 ijk..*.!.*.EEE
12 hijk..*.!.*.EE
13 ghijk..*.!.*.E
14 fghijk..*.!.*.
15 efghijk..*.!.*
16 defghijk..*.!.
17 adefghijk..*.!
18 badefghijk..*.
19 cbadefghijk..*
20 xcbadefghijk..
21 yxcbadefghijk.
22 zyxcbadefghijk
23 Bonus:
24 }.{...........
25 .}.{..........
26 ..}.{.........
27 ...}.{........
28 }...}.{.......
29 {}...}.{......
30 }{}...}.{.....
31 {}{}...}.{....
32 }{}{}...}.{...
33 }}{}{}...}.{..
34 {}}{}{}...}.{.
35 }5b}{}5}...}.{
36 w}{}j{}{}...}.
37 {?}{}&{}?}...}
38 }{*}{}}*}{}...
39 {}{}+{}}{+{}..
40 }{}{}}{}}{}{}.
41 }}{}{}}{}}{}{}
42 Level:
43 Ade
44 White
45 Bricks:
46 ..............
47 jjjjjjjjjjjjjj
48 jj....jj....jj
49 jjj...jj...jjj
50 j.jj..jj..jj.j
51 j..jj.jj.jj..j
52 j...jjjjjj...j
53 j....jjjj....j
54 jjjjjjjjjjjjjj
55 jjjjjjjjjjjjjj
56 j....jjjj....j
57 j...jjjjjj...j
58 j..jj.jj.jj..j
59 j.jj..jj..jj.j
60 jjj...jj...jjj
61 jj....jj....jj
62 jjjjjjjjjjjjjj
63 ..............
64 Bonus:
65 ..............
66 .....5555.....
67 ..............
68 ..............
69 ......??......
70 ..............
71 ....l....l....
72 ..............
73 ..............
74 ......}}......
75 .....b..b.....
76 .....pw&.p....
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Ade
85 Green
86 Bricks:
87 ##############
88 ###........###
89 ##....ff....##
90 #ffffffffffff#
91 .f..ffffff..f.
92 .f..ffffff..f.
93 .fff#....#fff.
94 ffff.ffff.ffff
95 ffff.f##f.ffff
96 ffff.f##f.ffff
97 ffff.ffff.ffff
98 .fff#....#fff.
99 .f..ffffff..f.
100 .f..ffffff..f.
101 #ffffffffffff#
102 ##....ff....##
103 ###........###
104 ####......####
105 Bonus:
106 ..............
107 ..............
108 ......}}......
109 ..}.}....}.}..
110 ......}}......
111 .}..}....}..}.
112 ..............
113 }}.}.2..2.}.}}
114 ...........m..
115 .}..........}.
116 }..}.cgb}.}..}
117 .}..........}.
118 ....?....?....
119 .}....ss....}.
120 ....+....<....
121 ..............
122 ..............
123 ..............
124 Level:
125 Ade
126 Blue
127 Bricks:
128 EgEgEgEgEgEgEE
129 E.g.g.g.g.g.gE
130 Eg.g.g.g.g.ggE
131 E.g.g.g.g.gg.E
132 Eg.g.g.g.gg.gE
133 E.g.g.g.gg.ggE
134 Eg.g.g.gg.gg.E
135 E.g.g.gg.gg.gE
136 Eg.g.gg.gg.g.E
137 E.g.gg.gg.g.gE
138 Eg.gg.gg.g.g.E
139 E.gg.gg.g.g.gE
140 Egg.gg.g.g.g.E
141 Eg.gg.g.g.g.gE
142 E.gg.g.g.g.g.E
143 Egg.g.g.g.g.gE
144 Eg.g.g.g.g.g.E
145 E.g.g.g.g.g.gE
146 Bonus:
147 ..............
148 ..............
149 .........3..m.
150 ....3.........
151 ..............
152 ....>...>.....
153 ..............
154 ..l...*...l...
155 .........c.?..
156 ..&.....c.....
157 .......c......
158 ......c.......
159 .....c........
160 ....c.....*...
161 ..............
162 ..............
163 ..............
164 ......s.......
165 Level:
166 Ade
167 Yellow
168 Bricks:
169 ...hhhhhhhhhhh
170 h...hhhhhhhhhh
171 hh...hhhhhhhhh
172 hhh...hhhhhhhh
173 hhhh..........
174 hhhhh.........
175 hhhhhh..hhhhhh
176 hhhhhhh.hhhhhh
177 hhhhhhh.hhhhhh
178 hhhhhhh.hhhhhh
179 ........hhhhhh
180 ........hhhhhh
181 hhhhhh...hhhhh
182 hhhhhhh...hhhh
183 hhhhhhhh...hhh
184 hhhhhhhhh...hh
185 hhhhhhhhhh...h
186 hhhhhhhhhhh...
187 Bonus:
188 ....j.j.j.j.j.
189 j....j.j.jdj.j
190 .j....j.j.j.j.
191 j1j....j.j.j.j
192 .j.j..........
193 j.j.j.........
194 .j?j.j...j.m.j
195 j.j.j.j.j.j.j.
196 .-.1.c...j1j.j
197 j.j.j.j.j.j.j.
198 .........jdj>j
199 ........j.j.j.
200 j.j.j....j.j.j
201 .j.j.j>...j.j.
202 j.<.m.j....j.j
203 .j.j.j.j....j.
204 j.j.j.1.j....j
205 .j.j.j.j.j....
206 Level:
207 Ade
208 Pink
209 Bricks:
210 ..............
211 iii.i.i..i.i.i
212 i.i.i.ii.i.i.i
213 iii.i.iiii.ii.
214 i...i.i.ii.i.i
215 i...i.i..i.i.i
216 ..............
217 iii..iiiiiiiii
218 i..i.....iiiii
219 ii.i.iii....ii
220 i..i.i.ii.i...
221 i..i.i.iiiiii.
222 ...iii.i.i.i.i
223 ii...iii.i.i.i
224 iiii.....i.i.i
225 iiiiiiii...ii.
226 iiiiiiiiii....
227 iiiiiiiiiiiiii
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..........l..b
237 ..............
238 ..............
239 ...4.j........
240 b......g.4....
241 ..............
242 ..............
243 ..w...........
244 .-.+..........
245 .....}........
246 ......s.......
247 Level:
248 Ade
249 Gray
250 Bricks:
251 .kkkkkkkkkkkk.
252 ..kkkkkkkkkk..
253 k..kkkkkkkk..k
254 kk..kkkkkk..kk
255 kkk..kkkk..kkk
256 kkkk..kk..kkkk
257 kkkkk....kkkkk
258 kkkkkk..kkkkkk
259 kkkkkk..kkkkkk
260 kkkkkk..kkkkkk
261 kkkkkk..kkkkkk
262 kkkkk....kkkkk
263 kkkk..kk..kkkk
264 kkk..kkkk..kkk
265 kk..kkkkkk..kk
266 k..kkkkkkkk..k
267 ..kkkkkkkkkk..
268 .kkkkkkkkkkkk.
269 Bonus:
270 .!&!&!&!&!&!&.
271 ..............
272 .......b......
273 ......*.l.....
274 ..............
275 .f............
276 ..............
277 ..............
278 3.&f.......3..
279 ..............
280 ..........b..&
281 ....b.....wb..
282 ..b*..><..*...
283 ..w...........
284 ..............
285 ......s.p.....
286 ....W.........
287 ..............
288 Level:
289 Ade
290 Orange
291 Bricks:
292 ......eeeeeeee
293 eeeee........e
294 e......eeeee.e
295 e.eeee.....e.e
296 e.e.....ee.e.e
297 e.e.eee..e.e.e
298 e.e.e....e.e.e
299 e.e.e.ee.e.e.e
300 e.e.e.e..e.e.e
301 e.e.e.e..e.e.e
302 e.e.e.ee.e.e.e
303 e.e.e....e.e.e
304 e.e.eee..e.e.e
305 e.e.....ee.e.e
306 e.eeee.....e.e
307 e......eeeee.e
308 eeeee........e
309 ......eeeeeeee
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 .............5
316 ...........5..
317 ..............
318 &.w.{....5....
319 ..............
320 ..............
321 .........~....
322 &..........!..
323 ..............
324 .............c
325 ...+..........
326 ..............
327 ..............
328 ..............
329 Level:
330 Ade
331 Red
332 Bricks:
333 .ddd.dddd.ddd.
334 ..dd.dddd.dd..
335 d..d.dddd.d..d
336 .d...dddd...d.
337 ..d..dddd..d..
338 ...d.dddd.d...
339 ....d....d....
340 dddd.d..d.dddd
341 dddd..dd..dddd
342 dddd..dd..dddd
343 dddd.d..d.dddd
344 ....d....d....
345 ...d.dddd.d...
346 ..d..dddd..d..
347 .d...dddd...d.
348 d..d.dddd.d..d
349 ..dd.dddd.dd..
350 .ddd.dddd.ddd.
351 Bonus:
352 .{.{..{{..{.{.
353 ...0.{..{.0...
354 {..{..{{..{..{
355 .....{..{.....
356 ..{...{*...{..
357 .....{..{.....
358 ....{....{....
359 {..{......{..{
360 .0{...{{...{0.
361 .0{...{{...{0.
362 {.&{......{&.{
363 ....{....{....
364 .......d..b...
365 ..b..{d.{..{..
366 .....*{{*.....
367 {..{.{w&{.{..{
368 ..{{..{{..{{..
369 .....{..{.....
370 Level:
371 Ade
372 Colored Stars
373 Bricks:
374 ..............
375 ......!!......
376 .....!!!!.....
377 ....!!!!!!....
378 ...!!!..!!!...
379 ..!!!....!!!..
380 .!!!......!!!.
381 !!!........!!!
382 !!....!!....!!
383 !!!........!!!
384 .!!!......!!!.
385 ..!!!....!!!..
386 ...!!!..!!!...
387 ....!!!!!!....
388 .....!!!!.....
389 ......!!......
390 ..............
391 ..............
392 Bonus:
393 .....jjjj.....
394 ....jjp.jj....
395 ...jj....jj...
396 ..jd...0..dj..
397 .jj...jj.c.jj.
398 jj...j..j...jj
399 j.c.j....j...j
400 ...j......j...
401 ..5j......j5p.
402 .0.j......j...
403 ....j....j..0.
404 .....jjjj.....
405 ..&p..j<......
406 ...d......d...
407 ......p.......
408 ..............
409 ..............
410 ..............
411 Level:
412 Ade
413 Red Hot (Chilli Peppers)
414 Bricks:
415 .*v*v****v***.
416 .***v*vv*vv*v.
417 .*v*v****vv*v.
418 ..............
419 .*vvvvvvvvvv*.
420 .*v********v*.
421 .*v*vvvvvv*v*.
422 .*v*v****v*v*.
423 .*v*v*vv*v*v*.
424 .*v*v*vv*v*v*.
425 .*v*v****v*v*.
426 .*v*vvvvvv*v*.
427 .*v********v*.
428 .*vvvvvvvvvv*.
429 .************.
430 vvvvvvvvvvvvvv
431 **************
432 ..............
433 Bonus:
434 ..{.{....{....
435 ....{.{{.{{.{.
436 ..{.{....{{.{.
437 ..............
438 ..{{{{{{{{{{..
439 ..{........{..
440 ..{.{{{{{{.{..
441 ..{.{....{.{..
442 ..{.{.{{.{.{..
443 ..{.{.{{.{.{..
444 ..{.{....{.{..
445 ..{.{{{{{{.{..
446 ..{........{..
447 ..{{{{{{{{{{..
448 ..............
449 {{{{{{{{{{{{{{
450 ..............
451 ..............
452 Level:
453 Ade
454 Long Misty Days
455 Bricks:
456 ..............
457 .aa.aa..aa.aa.
458 ..bbb....bbb..
459 .cc.cc..cc.cc.
460 ..............
461 .cc.cc..cc.cc.
462 ..bbb....bbb..
463 .aa.aa..aa.aa.
464 ..............
465 ..............
466 .aa.aa..aa.aa.
467 ..bbb....bbb..
468 .cc.cc..cc.cc.
469 ..............
470 .cc.cc..cc.cc.
471 ..bbb....bbb..
472 .aa.aa..aa.aa.
473 ..............
474 Bonus:
475 ..............
476 ....c.........
477 ..f...........
478 ...........2..
479 ..............
480 ....j....2....
481 ..............
482 ....}.........
483 ..............
484 ..............
485 ..2......c....
486 ...........&..
487 ..............
488 ..............
489 .&..*....*....
490 ..............
491 ..............
492 ..............
493 Level:
494 Ade
495 GreenWall
496 Bricks:
497 ##############
498 f##..####..##f
499 .f####..####f.
500 f.f########f.f
501 .f.f#....#f.f.
502 ..f.f####f.f..
503 ...f.ffff.f...
504 ....f....f....
505 ......xx......
506 .....xvvx.....
507 ......xx......
508 ...x......x...
509 ..xvx....xvx..
510 zffxffzzffxffz
511 yyfffyyyyfffyy
512 xxxfxxxxxxfxxx
513 yyfffyyyyfffyy
514 zfffffzzfffffz
515 Bonus:
516 ..............
517 }............}
518 .}..........}.
519 }.}........}.}
520 .}.}......}.}.
521 ..}.}....}.}..
522 ...}.}}}}.}...
523 ....}....}....
524 ......}}......
525 .....}&&}.....
526 ......}}......
527 ..............
528 ...m......m...
529 ..............
530 ..............
531 m0...0..0...0m
532 ..............
533 ..............
534 Level:
535 Ade
536 Stones
537 Bricks:
538 aa##EE@@EE##aa
539 kk##EEaaEE##kk
540 jj##Ea##aE##jj
541 jj##xx##xx##jj
542 kk#xx####xx#kk
543 aa##########aa
544 ..............
545 ..............
546 ..............
547 ..............
548 ..............
549 ..............
550 ..#vvvvvvvv#..
551 ..#vvvvvvvv#..
552 ..#vvvvvvvv#..
553 ..#vvvvvvvv#..
554 ..#fghijked#..
555 ..##########..
556 Bonus:
557 ..............
558 ..............
559 ..............
560 m............m
561 ..............
562 ..............
563 ..............
564 ..............
565 ..............
566 ..............
567 ..............
568 ..............
569 ......ll......
570 ..............
571 .....m&&m.....
572 ..............
573 ....l....l....
574 ..............
575 Level:
576 Ade
577 Flag
578 Bricks:
579 aaaaaaaaaaaaaa
580 aaaaaaaaaaaaaa
581 aaaaaaaaaaaaaa
582 aaaaaaaaaaaaaa
583 aaaaaaaaaaaaaa
584 dddddddddddddd
585 dddddddddddddd
586 dddddddddddddd
587 dddddddddddddd
588 dddddddddddddd
589 hhhhhhhhhhhhhh
590 hhhhhhhhhhhhhh
591 hhhhhhhhhhhhhh
592 hhhhhhhhhhhhhh
593 hhhhhhhhhhhhhh
594 ..............
595 ..............
596 ..............
597 Bonus:
598 {{{{{{{{{{{{{{
599 {j{j{j{{j{j{j{
600 ..............
601 ..d....j...d..
602 ....3.....3...
603 {{{{{{{{{{{{{{
604 ......d.......
605 ..............
606 .b.b.b.b.b.b..
607 ..............
608 jjjjjjjjjjjjjj
609 ....w..c..w...
610 .&&&......&&&.
611 ..m........m..
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Ade
618 Flag
619 Bricks:
620 ..............
621 ffffffffffffff
622 ffffffffffffff
623 ffffffffffffff
624 ffffffhhffffff
625 fffffhhhhfffff
626 ffffhhhhhhffff
627 fffhhhhhhhhfff
628 ffhhhhgghhhhff
629 ffhhhhgghhhhff
630 fffhhhhhhhhfff
631 ffffhhhhhhffff
632 fffffhhhhfffff
633 ffffffhhffffff
634 ffffffffffffff
635 ffffffffffffff
636 ffffffffffffff
637 ..............
638 Bonus:
639 ..............
640 }}}}}}}}}}}}}}
641 ...........d..
642 }}}l}}}}}}}}}}
643 .d....jj}..l..
644 }}}}}j..j}}}}}
645 ....j....j....
646 .bb.bb....jbb.
647 ..j........j..
648 ..j.d....44j..
649 ...j......j...
650 ....j....j....
651 ..&.&j.+j.&.&.
652 ......jj......
653 ...m...4...m..
654 ..............
655 ..............
656 ..............
657 Level:
658 Ade
659 Darknes
660 Bricks:
661 ..............
662 ......vv......
663 .....vvvv.....
664 ....vv..vv....
665 ...vv....vv...
666 ..vv......vv..
667 .vv........vv.
668 .v....vv....v.
669 .....vvvv.....
670 ....vv..vv....
671 ...vv....vv...
672 ..vv......vv..
673 .vv........vv.
674 vv..........vv
675 v............v
676 aaaaaaaaaaaaaa
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ......dd......
682 .....dddd.....
683 ....dd..dd....
684 ...dd....dd...
685 ..dd......dd..
686 .dd........dd.
687 .d....dd....d.
688 .....dddd.....
689 ....dd..dd....
690 ...dd....dd...
691 ..dd......dd..
692 .dd........dd.
693 dd..........dd
694 d............d
695 *d*d*d**d*d*d*
696 ..............
697 ..............
698 Level:
699 Ade
700 Hotter Than Hell
701 Bricks:
702 #.#.######.#.#
703 #.#.######.#.#
704 ###...##...###
705 #.#...##...#.#
706 #.#...##...#.#
707 .....vvvv.....
708 ....vvvvvv....
709 ...vvvvvvvv...
710 ..vvvvvvvvvv..
711 .vvvvvvvvvvvv.
712 vvvvvv..vvvvvv
713 vvvvv....vvvvv
714 vvvv......vvvv
715 vvv........vvv
716 vv..........vv
717 v............v
718 ..............
719 ..............
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 .....{{{{.....
727 ....{{{{{{....
728 ...{{{{{{{{...
729 ..{{{{{{{{{{..
730 .{{{{{**{{{{{.
731 {{{{{*..*{{{{{
732 {{{{*....*{{{{
733 {{{*......*{{{
734 {{*........*{{
735 {*..........*{
736 *............*
737 ..............
738 ..............
739 Level:
740 Ade
741 Green Day
742 Bricks:
743 @@@@@@##@@@@@@
744 @@@@@#..#@@@@@
745 @@@@#....#@@@@
746 @@@#......#@@@
747 @@#........#@@
748 @#...xxxx...#@
749 #...xxxxxx...#
750 ...xxxxxxxx...
751 ..xxxxxxxxxx..
752 .xxxxx..xxxxx.
753 xxxxx....xxxxx
754 xxxx......xxxx
755 xxx........xxx
756 xx..........xx
757 x............x
758 ..............
759 ..............
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 .....}}}}.....
768 ....}}}}}}....
769 ...}}}}}}}}...
770 ..}}}}pp}}}}..
771 .}}}}p..p}}}}.
772 }}}}p....p}}}}
773 }}}p......p}}}
774 }}p........p}}
775 }p..........p}
776 p............p
777 ..............
778 ..............
779 ..............
780 Level:
781 Ade
782 Rainbow
783 Bricks:
784 ..............
785 ......dd......
786 .....dddd.....
787 ....ddeedd....
788 ...ddehhedd...
789 ..ddehhhhedd..
790 .ddehhffhhedd.
791 ddehhffffhhedd
792 dehhffggffhhed
793 dhhffggggffhhd
794 dhffgg..ggffhd
795 dhfgg....ggfhd
796 dhfg......gfhd
797 dhfg......gfhd
798 dhfg......gfhd
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ......gg......
805 .....gggg.....
806 ....gggggg....
807 ...gggggggg...
808 ..gggggggggg..
809 .gggggggggggg.
810 gggggggggggggg
811 gggggggggggggg
812 gggggggggggggg
813 gggggg..gggggg
814 ggggg....ggggg
815 g*gg......gg*g
816 gggg......gggg
817 gggg......gggg
818 ..............
819 ..............
820 ..............
821 Level:
822 Ade
823 Yellow Stars
824 Bricks:
825 ..............
826 ......hh......
827 ..h..heeh..h..
828 .heh.heeh.heh.
829 ..h...hh...h..
830 ..............
831 ......hh......
832 .h...heeh...h.
833 heh..heeh..heh
834 .h....hh....h.
835 ...h......h...
836 ..heh....heh..
837 ...h......h...
838 .h....hh....h.
839 heh..heeh..heh
840 .h...heeh...h.
841 ......hh......
842 ..............
843 Bonus:
844 ..............
845 ......jj......
846 ..j..jjjj..j..
847 .jjj.jjjj.jjj.
848 ..j...jj...j..
849 ..............
850 ......jj......
851 .j...jjjj...j.
852 jjj..jjjj..jjj
853 .j....jj....j.
854 ...j......j...
855 ..jjj....jjj..
856 ...j......j...
857 .j....jj....j.
858 jjj..jjjj..jjj
859 .j...jjjj...j.
860 ......jj......
861 ..............
862 Level:
863 Ade
864 Paddlers
865 Bricks:
866 ..............
867 ..............
868 .....j..j.....
869 ....jj..jj....
870 ...jjj..jjj...
871 ..jjjj..jjjj..
872 .jjjjk..kjjjj.
873 jjjjkk##kkjjjj
874 jjjkka##akkjjj
875 jjkkba..abkkjj
876 jkkcb....bckkj
877 kkzc......czkk
878 kyz........zyk
879 xy..........yx
880 x............x
881 ..............
882 ..............
883 ..............
884 Bonus:
885 ..............
886 ..............
887 .....!..!.....
888 ....!b..b!....
889 ...!b!..!b!...
890 ..!b!b..b!b!..
891 .!b!b!..!b!b!.
892 !b!b!>..>!b!b!
893 b!b!>b..b>!b!b
894 !b!>bw..wb>!b!
895 b!>bw....wb>!b
896 !>bw......wb>!
897 >bw........wb>
898 bw..........wb
899 w............w
900 ..............
901 ..............
902 ..............
903 Level:
904 Ade
905 Why?
906 Bricks:
907 ..............
908 ......d.......
909 .....ddd......
910 ....ddddd.....
911 ...ddd.ddd....
912 ...dd...ddd...
913 ...d.....dd...
914 .........dd...
915 .........dd...
916 ........ddd...
917 .......ddd....
918 ......ddd.....
919 .....ddd......
920 .....dd.......
921 .....dd.......
922 .....dd.......
923 ..............
924 .....dd.......
925 Bonus:
926 ..............
927 ......?.......
928 .....???......
929 ....?????.....
930 ...???.???....
931 ...??...???...
932 ...?.....??...
933 .........??...
934 .........??...
935 ........???...
936 .......???....
937 ......???.....
938 .....???......
939 .....??.......
940 .....??.......
941 .....??.......
942 ..............
943 .....??.......
944 Level:
945 Ade
946 Slow Motion
947 Bricks:
948 !!!!..........
949 ggg!..........
950 g!!!!.........
951 gggg!.........
952 !!gg!!!!!!....
953 gggg!!ggg!....
954 !!!g!!g!g!!.!!
955 ..!gggg!gg!.!g
956 ..!!!!g!gg!.!g
957 .....!gggg!!!g
958 .....!!!!g!g!g
959 ........!gg!gg
960 ........!!!!!!
961 ..............
962 ..............
963 ..............
964 ..............
965 ..............
966 Bonus:
967 <<<<..........
968 <<<<<.........
969 <<<<<<........
970 <<<<<<<<<<....
971 <<<<<<<<<<<...
972 <<<<<<m<<<<<<<
973 <<<<<<<<<<<<<<
974 <<<m<<<<<<<<<<
975 .<<<<<<<<<<<<<
976 .<<<<<<<<<<<<<
977 ....<<<<<<<<<<
978 ....<<<<<<<<<<
979 .......<<<<m<<
980 .......<<<<<<<
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Ade
987 Freeze
988 Bricks:
989 j............j
990 jj..........jj
991 jjj........jjj
992 jjjj......jjjj
993 .jjj......jjj.
994 ..jj......jj..
995 ...j......j...
996 ....j....j....
997 ...jj####jj...
998 ..jjj####jjj..
999 .jjjj....jjjj.
1000 jjjj......jjjj
1001 jjj........jjj
1002 jj..........jj
1003 j............j
1004 ..............
1005 ..............
1006 ..............
1007 Bonus:
1008 f............f
1009 ff..........ff
1010 fff........fff
1011 ffff......ffff
1012 .fff......fff.
1013 ..fl......lf..
1014 ...f......f...
1015 ....f....f....
1016 ...fl....lf...
1017 ..fff....fff..
1018 .ffff....ffff.
1019 ffff......ffff
1020 fff........fff
1021 ff..........ff
1022 f............f
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Ade
1028 Color-Blind
1029 Bricks:
1030 hhh..####..hhh
1031 hih..#@@#..hih
1032 hhh..####..hhh
1033 .d..........d.
1034 .dddddddddddd.
1035 j.ffffffffff..
1036 j.f........f.j
1037 jjjjjjjjjjjjjj
1038 #e.iiiiiiii.e#
1039 #e.i......i.e#
1040 #eeeeeeeeeeee#
1041 g#k........k#g
1042 g#kkkkkkkkkk#g
1043 gggggggggggggg
1044 .xxxxxxxxxxxx.
1045 .x.yyyyyyyy.x.
1046 ..z........z..
1047 ..zzzzzzzzzz..
1048 Bonus:
1049 jjj........jjj
1050 jjj........jjj
1051 jjj........jjj
1052 ..............
1053 ..............
1054 ..4.....d.4...
1055 ..............
1056 ......*.......
1057 ..............
1058 ...l......l...
1059 .......d......
1060 ..............
1061 ...&.....&....
1062 .*...5.j5...*.
1063 ..............
1064 .s..........s.
1065 ..............
1066 ..............
1067 Level:
1068 Ade
1069 Colorless
1070 Bricks:
1071 j............j
1072 j....j..j....j
1073 jj...j..j...jj
1074 .j....jj....j.
1075 .jj...jj...jj.
1076 j.j..j..j..j.j
1077 j.jj.j..j.jj.j
1078 .j.j..jj..j.j.
1079 .j.jj.jj.jj.j.
1080 ..j.j....j.j..
1081 ..j.jj..jj.j..
1082 ...j.j..j.j...
1083 ...j.j..j.j...
1084 ....j....j....
1085 ....j....j....
1086 .....j..j.....
1087 .....j..j.....
1088 ..............
1089 Bonus:
1090 d............d
1091 d....d..d....d
1092 dd...d..d...dd
1093 .d....dd....d.
1094 .dd...dd...dd.
1095 d.d..d..d..d.d
1096 d.dd.d..d.dd.d
1097 .d.d..dd..d.d.
1098 .d.dd.dd.dd.d.
1099 ..d.d....d.d..
1100 ..d.dd..dd.d..
1101 ...d.d..d.d...
1102 ...d.d..d.d...
1103 ....d....d....
1104 ....d....d....
1105 .....d..d.....
1106 .....d..d.....
1107 ..............
1108 Level:
1109 Ade
1110 Mixed
1111 Bricks:
1112 @E#........#E@
1113 @E#........#E@
1114 .E#........#E.
1115 ..#........#..
1116 ..............
1117 .........*....
1118 ........!*....
1119 .......d!*....
1120 ......ed!*....
1121 .....ked!.....
1122 ....jkedc.....
1123 ...ijke.cb....
1124 ..hijk..cba...
1125 .ghij....baz..
1126 fghi......azy.
1127 fgh........zyx
1128 fg..........yx
1129 f............x
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ..............
1135 ..............
1136 ........m.....
1137 ........g.....
1138 .......jg.....
1139 ......<jg.....
1140 .....?<jg.....
1141 ....&?<j!.....
1142 ...d&?<.!b....
1143 ..bd&?..!bW...
1144 .wbd&....bWc..
1145 }wbd......Wcs.
1146 }wb........csl
1147 }w..........sl
1148 }............l
1149 Level:
1150 Ade
1151 Super Mixed
1152 Bricks:
1153 #@#....E@@@@@@
1154 #@#E....E#####
1155 #@#E*....E@@@@
1156 .@#E*!....E###
1157 ..#E*!f....E@@
1158 ...E*!fg....E#
1159 ....*!fgh....E
1160 .....!fghi....
1161 ......fghij...
1162 .......ghijk..
1163 ........hijke.
1164 ..z..c...ijked
1165 .yz.bc....jked
1166 xyzabc.....ked
1167 xy.ab.......ed
1168 x..a.........d
1169 ..............
1170 ..............
1171 Bonus:
1172 ..............
1173 ..............
1174 ....-g........
1175 ....lpg.......
1176 ....pgl.......
1177 ....lgl!......
1178 ....-ss&p.....
1179 ....ggds&w....
1180 ....Wgwjs?s...
1181 .......w+s&?..
1182 ........w}s&?.
1183 ..m..l...w<s&+
1184 .W*.j}....w+s&
1185 c*?l?<.....w+s
1186 *d.{}.......w+
1187 ?..&.........w
1188 ..............
1189 ..............
1190 Level:
1191 Ade
1192 Balls
1193 Bricks:
1194 ....######....
1195 ...@######@...
1196 ..E@#....#@E..
1197 .#E@......@E#.
1198 ##E........E##
1199 ##..........##
1200 jfd!*ikeai*!kj
1201 jfd!*ikeai*!kj
1202 edjgfkahfkgjde
1203 edjgfkahfkgjde
1204 ghfadei!jdafih
1205 ghfadei!jdafih
1206 !*kchgbfghjk*!
1207 !*kchgbfghjk*!
1208 fghijdxadkihgf
1209 fghijdxadkihgf
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..............
1219 >>>>>>>>>>>>>>
1220 WWWWWWWWWWWWWW
1221 bbbbbbbbbbbbbb
1222 **************
1223 >>>>>>>>>>>>>>
1224 >>>>>>>>>>>>>>
1225 bWbWbWbbWbWbWb
1226 WbWbWbWWbWbWbW
1227 bbbbbbbbbbbbbb
1228 bbbbbbbbbbbbbb
1229 ..............
1230 ..............
1231 Level:
1232 Ade
1233 The Dark Side
1234 Bricks:
1235 ##jjjjjjjjjjjj
1236 #.#jjjjjjjjjjj
1237 #.####jjjjjjjj
1238 #.##v#jjjjjjjj
1239 ##j######jjjjj
1240 jjj#j##v#jjjjj
1241 jjj#j#####j#jj
1242 jjjjjj##v#j#jj
1243 jjjjjj#j###jjj
1244 jjjjjjjjj#j#jj
1245 jjjjjjjjj#j#jj
1246 kkkkkkkkkkkkkk
1247 kjjkjjkjjkkjjk
1248 kkjkkjkkkkkkkk
1249 kjjkjjkjjkkjkj
1250 kjjkkkkjjkkjjk
1251 jjjjjjjjjjjjjj
1252 jjjjjjjjjjjjjj
1253 Bonus:
1254 ..mmmddddddddd
1255 ...mmddddddddd
1256 ......dddddddd
1257 ......dddddddd
1258 ..d......ddddd
1259 ddd.d....ddddd
1260 ddd.d.....d.dd
1261 dddddd....d.dd
1262 dddddd.d...ddd
1263 ddddddddd.d.dd
1264 ddddddddd.d.dd
1265 dddddddddddddd
1266 dddddddddddddd
1267 dbbddbbdbddbbd
1268 wwwwddwdddwwwd
1269 dddddddddddddd
1270 dddddddddddddd
1271 dddddddddddddd
1272 Level:
1273 Ade
1274 Some Colors
1275 Bricks:
1276 ...E##E@@EE##@
1277 ....E##E@@EE##
1278 .....E##E@@EE#
1279 aaa...E##E@@EE
1280 a......E##E@@E
1281 a..aaa........
1282 a..a.a........
1283 a..a.aa.......
1284 aaaa.aa.......
1285 *x*a.aa.aaa...
1286 chcaaaa.a.a...
1287 jijijia.a.aaaa
1288 egegegaaa.aa.a
1289 !d!d!d!!a.aaaa
1290 hjhjhjhhaaaaa.
1291 kfkfkfkkfkfa.a
1292 gjgjgjggjgja.a
1293 !i!i!i!!i!i!i!
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 4.............
1301 ..............
1302 ..............
1303 ..............
1304 ........4.....
1305 l1...1........
1306 ..............
1307 ...bl.....4...
1308 &?...*........
1309 ...b.j........
1310 *.w...........
1311 ...}...*}.....
1312 .....s........
1313 Level:
1314 Ade
1315 XXX
1316 Bricks:
1317 a...a....a...a
1318 .a.a......a.a.
1319 ..a........a..
1320 .a.a......a.a.
1321 a...a....a...a
1322 ..............
1323 ...d*dddd*d...
1324 ..ddd*dd*ddd..
1325 .ddddd**ddddd.
1326 .ddddd**ddddd.
1327 ..ddd*dd*ddd..
1328 ...d*dddd*d...
1329 ..............
1330 a...a....a...a
1331 .a.a......a.a.
1332 ..a........a..
1333 .a.a......a.a.
1334 a...a....a...a
1335 Bonus:
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ..............
1346 ..............
1347 ..............
1348 ..............
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Ade
1356 Dont Worry
1357 Bricks:
1358 ..............
1359 ..............
1360 ..vv..vvvvvv..
1361 ..vv..vvvvvv..
1362 ..vv..vv......
1363 ..vv..vv......
1364 ..vv..vv......
1365 ..vv..vv......
1366 ..vvvvvvvvvv..
1367 ..vvvvvvvvvv..
1368 ......vv..vv..
1369 ......vv..vv..
1370 ......vv..vv..
1371 ......vv..vv..
1372 ..vvvvvv..vv..
1373 ..vvvvvv..vv..
1374 ..............
1375 ..............
1376 Bonus:
1377 ..............
1378 ..............
1379 ..............
1380 ..............
1381 ..............
1382 ..............
1383 ..............
1384 ..............
1385 ......m.......
1386 .......m......
1387 ..............
1388 ..............
1389 ..............
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 ..............
1395 Level:
1396 Ade
1397 Flamengo
1398 Bricks:
1399 .!!!ddddddddd.
1400 .!!!ddddddddd.
1401 .!!!ddddddddd.
1402 .aaaaaaaaaaaa.
1403 .aaaaaaaaaaaa.
1404 .aaaaaaaaaaaa.
1405 .dddddddddddd.
1406 .dddddddddddd.
1407 .dddddddddddd.
1408 .aaaaaaaaaaaa.
1409 .aaaaaaaaaaaa.
1410 .aaaaaaaaaaaa.
1411 ..dddddddddd..
1412 ..dddddddddd..
1413 ...dddddddd...
1414 ....aaaaaa....
1415 .....aaaa.....
1416 ......aa......
1417 Bonus:
1418 ..............
1419 .........0.3..
1420 ...0..d.+.....
1421 .....m........
1422 ...0...l......
1423 .&...3....b...
1424 ..............
1425 ...b....?.....
1426 ....s......d..
1427 .........+.}..
1428 ......b.......
1429 ...?3.........
1430 .........&....
1431 .....}.s......
1432 ..............
1433 ......m.......
1434 ..............
1435 ..............
1436 Level:
1437 Ade
1438 Pink & Blue
1439 Bricks:
1440 gggggggggggggg
1441 ......gg......
1442 .iiii.gg.iiii.
1443 .i..i.gg.i..i.
1444 .ii.i.gg.i.ii.
1445 ..i.i....i.i..
1446 iii.iiiiii.iii
1447 i............i
1448 iiiiii..iiiiii
1449 .....i..i.....
1450 g....i..i....g
1451 g.iiii..iiii.g
1452 g.i........i.g
1453 g.iii.gg.iii.g
1454 g...i.gg.i...g
1455 ggg.i.gg.i.ggg
1456 ....i.gg.i....
1457 iiiii.gg.iiiii
1458 Bonus:
1459 jjjjjjjjjjjjjj
1460 ......{{......
1461 .{}{}.55.}{}{.
1462 .}..{.55.{..}.
1463 .{}.}.ll.}.}{.
1464 ..{.{....{.{..
1465 }{}.}{}}{}.}{}
1466 {............{
1467 bb{}{}..}{}{bb
1468 .....{..{.....
1469 {....{..{....{
1470 }.}{{}..}{{}.}
1471 {.{........{.{
1472 }.}{}.{{.}{}.}
1473 {...{.}}.{...{
1474 }{}.}.{{.}.}{}
1475 ....{.}}.{....
1476 }}}}}.{{.}}}}}
1477 Level:
1478 Ade
1479 GreenHeart
1480 Bricks:
1481 ..............
1482 .....f..f.....
1483 ....ffffff....
1484 ...ffffffff...
1485 ..f#f.ff.f#f..
1486 .fff......fff.
1487 fff........fff
1488 #f..........f#
1489 ff..........ff
1490 #f..........f#
1491 f#f........f#f
1492 .f#f......f#f.
1493 ..f#f....f#f..
1494 ...f#f..f#f...
1495 ....ff..ff....
1496 ....#f..f#....
1497 xxxxxf..fxxxxx
1498 yyyy......yyyy
1499 Bonus:
1500 ..............
1501 .....}..}.....
1502 ....}.33.}....
1503 ...}.5...5}...
1504 ..}...bb...}..
1505 .}.&......&.}.
1506 }............}
1507 ..............
1508 }b..........b}
1509 ..............
1510 }............}
1511 .}..........}.
1512 ..}.+....+.}..
1513 ...}......}...
1514 ....}....}....
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Ade
1520 NoIdea
1521 Bricks:
1522 ......jj......
1523 !....jjjj....!
1524 i!..jjjjjj..!i
1525 !g!........!g!
1526 .!d!......!d!.
1527 ..!f!....!f!..
1528 k..!h!..!h!..k
1529 kk..!i!!i!..kk
1530 kkk..!aa!..kkk
1531 kkk..!aa!..kkk
1532 kk..!i!!i!..kk
1533 k..!h!..!h!..k
1534 ..!f!....!f!..
1535 .!d!......!d!.
1536 !g!........!g!
1537 i!..jjjjjj..!i
1538 !....jjjj....!
1539 ......jj......
1540 Bonus:
1541 ..............
1542 ......<.f.....
1543 ..............
1544 ..f.........d.
1545 ..............
1546 ...?..........
1547 .....+...d...b
1548 .!.....*......
1549 ?.......!...w.
1550 .5.....b.....5
1551 .......+......
1552 .........c....
1553 ....?.........
1554 ...*......*...
1555 .b..........?.
1556 ......ss......
1557 ..............
1558 ..............
1559 Level:
1560 Ade
1561 Oxygen
1562 Bricks:
1563 ..............
1564 ..gggggggggggg
1565 .ggggggggggggg
1566 g.ggaaaggggggg
1567 .ggaagaagggggg
1568 g.gagggagggggg
1569 .ggagggagggagg
1570 g.gagggaggagag
1571 .ggagggagaggga
1572 g.gagggaggggga
1573 .ggaagaaggggag
1574 g.ggaaaggggagg
1575 .gggggggggaggg
1576 g.gggggggaaaaa
1577 .ggggggggggggg
1578 ..gggggggggggg
1579 ..............
1580 ..............
1581 Bonus:
1582 ..............
1583 ..............
1584 ......c.&?.0..
1585 ...sj.........
1586 ........j.b.c.
1587 ......m.......
1588 ...?..0.......
1589 .....>...2....
1590 ...b.........?
1591 ......j.<.&s..
1592 ..............
1593 ....0....m....
1594 ...w..........
1595 ....&.2.......
1596 ...b....<.b.0.
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Ade
1602 Tchau
1603 Bricks:
1604 defghijk*!defg
1605 aaa..........h
1606 !a...........i
1607 *aaa.........j
1608 kaa..........k
1609 jaa.a.a......d
1610 i.a.a.a......e
1611 h.aaaaaaaa...*
1612 g...a.aa.a...!
1613 f...a.aaaaa.af
1614 e......a.aa.ag
1615 d......a.aa.ah
1616 k.........a.ai
1617 j.........aaaj
1618 i............k
1619 !............d
1620 *............e
1621 fghijk*!xyzabc
1622 Bonus:
1623 {}{}{}{}..}{}{
1624 ..............
1625 ..............
1626 ..............
1627 ..............
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.00
1 Level:
2 gmaestro
3 Bach
4 Bricks:
5 ##############
6 hh###c#####x#x
7 hhh#ccc#i!#x#x
8 h#h#c#c!ggix#x
9 h#h#c#ci###x#x
10 h#h#c#cg###x#x
11 hhh#aaci###xzx
12 hh##aaag###xzx
13 h#h#a#ai###x#x
14 h#h#a#ag###x#x
15 h#h#a#ai###x#x
16 h#h#a#a!ggix#x
17 hhh#a#a#i!#x#x
18 **************
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..4...4...4..4
28 ....m.........
29 ..............
30 ..............
31 b.............
32 ..............
33 ..............
34 w............m
35 ..............
36 .g..g.g.g....g
37 55555555555555
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 gmaestro
44 Mozart
45 Bricks:
46 ##############
47 ######hh######
48 @vvv@hhhh@@!@@
49 @vvv@hEEh@@@@@
50 @vvv@hEEh@@@@@
51 @vvv@hEEh@!@!@
52 @vvv@hggh@v@v@
53 @vvv@hggh@vvv@
54 @v@v@hvvh@vvv@
55 @!@!@hvvh@vvv@
56 @@@@@hvvh@vvv@
57 @@@@@hvvh@vvv@
58 @@!@@hvvh@vvv@
59 .**...**...**.
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 53234555543235
66 ..............
67 l...........f.
68 ..............
69 ..............
70 ........m.....
71 .....g..g.....
72 ..W...........
73 ......44......
74 ......43......
75 ......33......
76 ......11......
77 .f...g00g....l
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 gmaestro
85 Schoenberg
86 Bricks:
87 zzzzzzzzzzzzzz
88 z*!!**!!!!*##z
89 z*!!*!!!!!!*#z
90 z*!!******!!*z
91 z*!!*####*!!*z
92 z*!!*####*!!*z
93 z*!!*####*!!*z
94 z*!!******!!*z
95 z*!!**!!!!!*#z
96 z*!!*!!****##z
97 z*!!*!!*#####z
98 z*!!*!!*#####z
99 z*!!*!!******z
100 z*!!**!!!!!!*z
101 z*!!***!!!!**z
102 zzzzzzzzzzzzzz
103 v.v...vv...v.v
104 ..............
105 Bonus:
106 l.....m......l
107 ..............
108 ..............
109 ..............
110 b....bbbb....b
111 b....bbbb....b
112 b....bbbb....b
113 b............b
114 b............b
115 b............b
116 b............b
117 ..............
118 ..............
119 .&&&&&&&&&&&&.
120 ..............
121 .w.w.w**w.w.w.
122 p............p
123 ..............
124 Level:
125 gmaestro
126 Beethoven
127 Bricks:
128 #*#*#*#*#*#*#*
129 *gvivvvvikkkv#
130 #gvivvvvikkkk*
131 *gvivvvvikvvk#
132 #gvivvvvikvvk*
133 *gvivvvvikvvk#
134 #gviivviikkkk*
135 *gvvivvivkkkv#
136 #gvvivvivkkkk*
137 *gvvivvivkvvk#
138 #gvviiiivkvvk*
139 *gvvviivvkkkk#
140 #ggggiivvkkkv*
141 ededededededed
142 dedededededede
143 ..............
144 ..............
145 ..............
146 Bonus:
147 555555l5555555
148 4444444444444l
149 l3333333333333
150 .2222222222222
151 11111m11111111
152 .0000000000000
153 ..............
154 ..........s...
155 ..............
156 ..............
157 ..............
158 ...b......b...
159 ...p......p...
160 .......w......
161 .w...*...*..w.
162 ..............
163 ..............
164 ..............
165 Level:
166 gmaestro
167 Cage
168 Bricks:
169 E.yyyh.h#cc.eh
170 k#bvvd.gv..ee.
171 h..ky@jjve.aah
172 .g#*y.a.e.k#k.
173 dbh..yaE.d.g!c
174 ...fdj...dh.vv
175 ihcf.efhx.!j#!
176 .#.!he.g.a..c.
177 hd!vvfh@vi.*.v
178 ...xx...v.d.ev
179 @iyg#f.hhf.!.!
180 avyg..*fg#k.i.
181 .v.j.j.!b.i!.h
182 .fcax.f.#E..d.
183 d.c..@.b.!xvv.
184 kh..j@eef..ih!
185 ..hiva...yki..
186 ....v.ki.vv..k
187 Bonus:
188 ...?.j.d..5..?
189 0...m......4..
190 ....5..&.p.f.!
191 .l.-.......gm.
192 p.f..d!.......
193 ...{m......+..
194 ..w....~..}..?
195 .w.......l....
196 d...d?..<w....
197 ..+...........
198 .g......-.....
199 ..4....&.d....
200 .....+.....w..
201 ...~p....?....
202 }.........{...
203 .....<..g.....
204 ..0j..........
205 ..............
206 Level:
207 gmaestro
208 Webern
209 Bricks:
210 ..........v..x
211 .x............
212 ..............
213 ..............
214 ....v.........
215 ..............
216 ..............
217 ........x.....
218 ..............
219 v.............
220 ..............
221 ..............
222 ...x.......v..
223 ..............
224 .............x
225 ..............
226 ..............
227 .......x......
228 Bonus:
229 ..........l..5
230 .5............
231 ..............
232 ..............
233 ....~.........
234 ..............
235 ..............
236 ........+.....
237 ..............
238 ~.............
239 ..............
240 ..............
241 ...5.......~..
242 ..............
243 .............5
244 ..............
245 ..............
246 .......d......
247 Level:
248 gmaestro
249 Xenakis
250 Bricks:
251 xkxkxkxkxkxkxk
252 kxkxkxkxkxkxkx
253 yayayayayayaya
254 ayayayayayayay
255 zbzbzbzbzbzbzb
256 bzbzbzbzbzbzbz
257 EEExzcEEjceEEE
258 ceczfzh*cjcafz
259 dczEEdzcgEEczg
260 gzc!!gczd!fzcd
261 zfjcec*hz!zcec
262 EEEjcaEEczxEEE
263 bzbzbzbzbzbzbz
264 zbzbzbzbzbzbzb
265 ayayayayayayay
266 yayayayayayaya
267 vxvxvxvxvxvxvx
268 xvxvxvxvxvxvxv
269 Bonus:
270 ..4!~4...4~!4.
271 ..4444...4444.
272 5l5........l5l
273 l5l........5l5
274 ..............
275 &5&5&5&5&5&5&5
276 ..............
277 g1&.2.3..p&.2g
278 *....*........
279 ........*.2..*
280 g2..1..3....1g
281 ...p..........
282 b5b5b5b5b5b5b5
283 *b*b*b*b*b*b*b
284 c*c*?*.*?*c*c*
285 >>>>>>>>>>>>>>
286 bwbwbwbwbwbwbw
287 wbwbwbwbwbwbwb
288 Level:
289 gmaestro
290 Symphonie Fantastique
291 Bricks:
292 v@@@@@@@@@@@@v
293 v@@@@@@@@@@@@v
294 v@@kkkkkkkk@@v
295 v@@kkkkkkkk@@v
296 v@@kkkkkkkk@@v
297 v@@kkkkkkkk@@v
298 v@@kkkkkkkk@@v
299 v@@kkkkkkkk@@v
300 v@@dkkkkkkk@@v
301 v@@ddkkkkkk@@v
302 v@@.ddkkkkk@@v
303 v@@..ddkkkk@@v
304 v@@...ddkkk@@v
305 v@@...vddkk@@v
306 v@@.....ddk@@v
307 v@@......dd@@v
308 v@@.......d@@v
309 v@@........@@v
310 Bonus:
311 .5l5l5.5l5l5..
312 ..5.5.5.5.5.5.
313 .....>!m>.....
314 ...&..........
315 ....>...>.....
316 .............?
317 ...W.?.W.w....
318 ..............
319 ..............
320 ...~......W...
321 ....-.........
322 .....>!.......
323 ......w.......
324 ......gw......
325 ........>.....
326 .........-....
327 ..........~...
328 ...........&..
329 Level:
330 gmaestro
331 Smetana
332 Bricks:
333 gggggg@@yyxxxx
334 ggggggg@@yxxxx
335 gggggggg@yxxxx
336 ggggEggg@@yxxx
337 ggggggggg@yxxx
338 @@ggggggg@yxxx
339 x@ggggggg@@yxx
340 x@@@gggggg@yxx
341 xyy@gggggg@yyx
342 xyy@gggggg@zyx
343 xxy@gggEgg@zyx
344 xxy@gggggg@@yy
345 xxx@@gggggg@zy
346 xxxy@@ggggg@zy
347 xxxy@@ggggg@zy
348 xxxxy@@ggggg@z
349 xxxxyy@ggggg@@
350 xxxxxy@gggggg@
351 Bonus:
352 ......33......
353 s.?....33.....
354 ....m...3.....
355 ........33....
356 ....+....3....
357 33.......3....
358 .3.w.....3l...
359 .333.pf}..2...
360 ...3..{...2...
361 ...3...+..2...
362 ...3......2...
363 ...3...m.?22..
364 ...l2.....w2..
365 ....25.....2..
366 ....22.....2..
367 .~*..22.~...1.
368 ......1..>..11
369 .w.w..1-w.w.-1
370 Level:
371 gmaestro
372 Wagner
373 Bricks:
374 ..............
375 ..............
376 ......##......
377 j.....##.....j
378 jjj..####..jjj
379 .jj..#kk#..jj.
380 .jjj##kk##jjj.
381 .jjj#kkkk#jjj.
382 .jj#kkkkkk#jj.
383 .jj#kkkkkk#jj.
384 ...#kkkkkk#...
385 ..#kkkkkkkk#..
386 ..#kkkkkkkk#..
387 ..#k#k##k#k#..
388 ..#kkkkkkkk#..
389 ..#kkkkkkkk#..
390 ..#kkkkkkkk#..
391 ..##########..
392 Bonus:
393 ..............
394 ..............
395 ......+.......
396 m............m
397 ..............
398 ......<>......
399 ..............
400 ...b......b...
401 ....s....s....
402 ..............
403 ..............
404 ..............
405 ....-.~~.-....
406 ..............
407 ......ll......
408 ..............
409 ...*......*...
410 ..5d......d5..
411 Level:
412 gmaestro
413 Varese
414 Bricks:
415 jjjjjjjjjjjjjj
416 jjjjjjjjjjjjjj
417 jjjjjjjjjjjjjj
418 jjjjjj**jjjjjj
419 jjjjj*ff*jjjjj
420 jjjj*ffff*jjjj
421 jjjj*ffff*jjjj
422 jjjj*fjjf*jjjj
423 jjj*ffjjff*jjj
424 jjj*fjjjjf*jjj
425 jj*ffjjjjff*jj
426 jj*fjjjjjjf*jj
427 jj*fjjjjjjf*jj
428 jj*fjjjjjjf*jj
429 jj*fjjjjjjf*jj
430 j*fjjjjjjjjf*j
431 **fjjjjjjjjf**
432 ffjjjjjjjjjjff
433 Bonus:
434 ..............
435 ..............
436 ......~>......
437 .....>gg~.....
438 ....~5..5>....
439 ...>g.++.g~...
440 ...~5....5>...
441 ...fg.++.g~...
442 ..>g......g>..
443 ..~5......5~..
444 .>g........g>.
445 .~5........5~.
446 .>g........g>.
447 .~5........5~.
448 .>g........g>.
449 ~5..........5~
450 gg..........gg
451 -............-
452 Level:
453 gmaestro
454 Paganini
455 Bricks:
456 vv@@@akka@@@vv
457 v@@@@akka@@@@v
458 @@@@@akka@@@@@
459 @@@@@akka@@@@@
460 @@@@@akka@@@@@
461 @@@@@@kk@@@@@@
462 @@@##@kk@##@@@
463 @@@#@@kk@@#@@@
464 v@###@kk@###@v
465 @@@#@@kk@@#@@@
466 @@@#@@kk@@#@@@
467 @@@#@@kk@@#@@@
468 @@##@@kk@@##@@
469 @@@@@@kk@@@@@@
470 @@@@@@kk@@@@@@
471 @@@@@aaaa@@@@@
472 v@@@@aaaa@@@@v
473 vv@@@@aa@@@@vv
474 Bonus:
475 .....m..m.....
476 ..............
477 .......p......
478 ..............
479 ..............
480 ..............
481 ...55....55...
482 ...5......5...
483 ..555.w..555..
484 ...5......5...
485 ...5......5...
486 ...5...l..5...
487 ..55......55..
488 ..............
489 .......&......
490 ......++......
491 ..............
492 ......w.......
493
0 Level:
1 Misty
2 Not So Dangerous
3 Bricks:
4 ..............
5 .....aaaa.....
6 ....aaaaaa....
7 ...aaaaaaaa...
8 ...addaadda...
9 ...addaadda...
10 ...aaakkaaa...
11 ...aaakkaaa...
12 ....aaaaaa....
13 ....aeeeea....
14 ....aaeeaa....
15 .j...aaaa...j.
16 jjj...aa...jjj
17 jjj...aa...jjj
18 .j..........j.
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ......11......
25 .....0..0.....
26 ...?...&..?...
27 ..........}...
28 ..............
29 ...~.1....1...
30 ......b..c....
31 ....-.........
32 ..............
33 ....<..+.-....
34 ............f.
35 0......?.....0
36 ..{...+......~
37 .b............
38 ..............
39 ..............
40 ..............
41 Level:
42 Misty
43 Vampire Teeth
44 Bricks:
45 jjjjddddddjjjj
46 djjjdd##ddjjjd
47 djjjd####djjjd
48 ..jj......jj..
49 .djj......jjd.
50 .d.j......j.d.
51 d.d.j....j.d.d
52 ..ddd....d.d..
53 .....d##d.d...
54 ..............
55 #####hhhh#####
56 hhhiiicciiihhh
57 *cc........cc*
58 ccc........ccc
59 ccc........ccc
60 .cc........cc.
61 ..c........c..
62 ...c......c...
63 Bonus:
64 ....222222...g
65 ~.......f..{..
66 ..............
67 ...}..........
68 ..............
69 ..............
70 .............!
71 ..............
72 ..............
73 ..............
74 .......m?.....
75 .?.W..>..W....
76 1...........c1
77 .+............
78 -f.........+.-
79 ...........>..
80 ..............
81 ...>..........
82 Level:
83 Misty
84 Zombie Attack
85 Bricks:
86 ..............
87 ..bb......cc..
88 .bbbb....cccc.
89 b....b..c....c
90 b*..*b..ch..hc
91 b....b..c....c
92 b.vv.b..c.vv.c
93 .b..b....c..c.
94 .c##b....c@@c.
95 .b##b....c@@c.
96 ..bb......cc..
97 ..bb......cc..
98 ..ee......ee..
99 .ffff....zzzz.
100 ffffff..zzzzzz
101 f....f..z....z
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..ll.......d..
107 .w.*..........
108 j.......&....{
109 +....+.......~
110 .....w........
111 ..j2....W..!..
112 .m............
113 ....+.........
114 .0..1....{..>.
115 ...1......-f..
116 ..............
117 ..w...........
118 .*.1.......-c.
119 0b..<+..>.f..d
120 ?....?..?....?
121 ..............
122 ..............
123 Level:
124 Misty
125 Mr Hyde
126 Bricks:
127 #...kkkkk....#
128 #...kkkkk....#
129 #...kkkkk....#
130 #...kkkkk....#
131 #.kkkkkkkkk..#
132 #...e....e...#
133 #...e!..!e...#
134 #...e....e...#
135 #...e....e...#
136 #....edde....#
137 #....e..e....#
138 #.....ee.....#
139 h.....vv.....h
140 hi...vvvv...ih
141 hi.vvvvvvvv.ih
142 hivvvvvvvvvvih
143 hivvvvvvvvvvih
144 hiffffffffffih
145 Bonus:
146 ..............
147 ....2.........
148 .......2......
149 ..............
150 ..............
151 .........1....
152 ..............
153 ....}.........
154 .........w....
155 .....1.j......
156 ........*.....
157 ..............
158 .......2.....!
159 1...........*.
160 *&...p1.....0p
161 ..............
162 .0.s........c0
163 W.>.?.?>.?....
164 Level:
165 Misty
166 The Elements Demons
167 Bricks:
168 #####....@@@@@
169 jjjj#***.@ffff
170 jjjj#*...@ffff
171 jjjj#**..@ffff
172 jjjj#*...@ffff
173 jjjj#***.@ffff
174 jjjj#!.!.@ffff
175 jjjj#!.!.@ffff
176 .....!!!......
177 ggggE!.!.Edddd
178 ggggEzzz.Edddd
179 ggggEz...Edddd
180 ggggEzz..Edddd
181 ggggEz...Edddd
182 ggggEc.c.Edddd
183 ggggEc.c.Edddd
184 EEEEEccc.EEEEE
185 .....c.c......
186 Bonus:
187 ............3.
188 5....m.......5
189 ..?l......l...
190 .....W+.....?.
191 3.{.......!j..
192 .......}......
193 ...3...d......
194 .....-........
195 ......g.......
196 ..............
197 ..g..c.m..-...
198 c....s.....{d*
199 .}f?.-p.......
200 .....c....c*..
201 f..&...+......
202 5.{..s.b...?.5
203 .....b.+......
204 ..............
205 Level:
206 Misty
207 Fire Walk With Me
208 Bricks:
209 ..............
210 ..............
211 .....dd.......
212 ....de....dd..
213 ....d....dd.dd
214 ...ded..dde.d.
215 ...ded..de.de.
216 ..deeddddedeee
217 .deeeddeeeeeee
218 deeeedeeeheeeh
219 hehhdeeehhehhh
220 dhjhhdhhhhhhhj
221 ehhjdjdjjjhjjh
222 ejjjdjj@jjhjjj
223 @@@@@@**@@@@@@
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ..............
230 .....c........
231 ....2......!..
232 ..............
233 ....*.........
234 .....~........
235 ...1..s.W.s...
236 ....c.....+...
237 ...c....1.c..3
238 &0..W..~......
239 ..>.....-...{.
240 .{...{-...{.+.
241 ....>...>-....
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Misty
248 Tengel The Evil
249 Bricks:
250 jjjjjeeeejjjjj
251 xx@@@@xx@@@@xx
252 xx@hh@xx@hh@xx
253 yy@hh@yy@hh@yy
254 zz@@@@zz@@@@zz
255 zzzzzzeezzzzzz
256 kkkkkkeekkkkkk
257 kkkkkkeekkkkkk
258 kkkkkkeekkkkkk
259 kkkkkeeeekkkkk
260 kkkkkkeekkkkkk
261 kkkkkevvekkkkk
262 ggggddddddgggg
263 gggdd****ddggg
264 gggdd****ddggg
265 ggggddddddgggg
266 ..EEEEEEEEEE..
267 ...EEEEEEEE...
268 Bonus:
269 ..ll&d.2.*.&..
270 2......d......
271 ws.55..b.55.b2
272 ...55.*..55.c.
273 p......2.....m
274 .c.W>...w>.>..
275 *..f.1..4...{.
276 ....<.-...1..~
277 ..m........j..
278 1j..1..c..*...
279 }4.........-..
280 ......??.+...g
281 &...-.........
282 .+.....4..1...
283 ....+4......m.
284 ?.....??.....?
285 ..............
286 ..............
287 Level:
288 Misty
289 Scary Dungeon
290 Bricks:
291 .#aaa****aaa#.
292 #.aaaa**aaaa.#
293 !.aaaaaaaaaav!
294 h.#.a....a.#.h
295 i#..a....a..#i
296 f!v.h.hh.h.v!f
297 dh...h..h...hd
298 gi.#hvhhvh#.ig
299 .f#........#f.
300 .d!v......v!d.
301 .gh........hg.
302 ..i.#....#.i..
303 ..f#......#f..
304 ..d!v.vv.v!d..
305 ..gh......hg..
306 ...i.****.i...
307 ...f######f...
308 ...dggggggd...
309 Bonus:
310 ...*.j..5.*...
311 .......5......
312 ....}.......c.
313 p.............
314 ..............
315 &.c....l...c.&
316 ..............
317 &....-mm-b...&
318 ..............
319 ..wc......cw..
320 ...........p..
321 ..............
322 ..............
323 ....c.dd.c....
324 ..............
325 ...b..mm..<...
326 ..............
327 .....d.<......
328 Level:
329 Misty
330 Demonic Little Idiot
331 Bricks:
332 @@@h!!hh!!h@@@
333 ##############
334 **************
335 **************
336 **************
337 *#############
338 **************
339 **************
340 #############*
341 **************
342 **************
343 *#############
344 **************
345 **************
346 #############*
347 **************
348 **************
349 *#############
350 Bonus:
351 ..............
352 ..............
353 ..m...........
354 .............>
355 ..............
356 ..............
357 .>............
358 ..............
359 ............m.
360 ..............
361 ..............
362 ..............
363 ..............
364 ...........>..
365 ......5.......
366 ..............
367 ..............
368 ..............
369 Level:
370 Misty
371 The Eye
372 Bricks:
373 ..............
374 j............j
375 .h..........h.
376 ..e..jjjj..e..
377 ....jhhhhj....
378 ...jheeeehj...
379 ..jheddddehj..
380 ..hed####dehj.
381 jhed######dehj
382 jhed######dehj
383 .jhed####dehj.
384 ..jheddddehj..
385 ...jheeeehj...
386 ....jhhhhj....
387 ..e..jjjj..e..
388 .h..........h.
389 j............j
390 ..............
391 Bonus:
392 ..............
393 j.............
394 ..............
395 .....m..b.....
396 ....?...{.....
397 ..............
398 ..............
399 .....5555.....
400 .b..543345....
401 &...543345....
402 .....5555.....
403 ...>..........
404 ........?.....
405 ..............
406 ..............
407 ............+.
408 ..............
409 ..............
410 Level:
411 Misty
412 Frozen Queen
413 Bricks:
414 ##############
415 ..##########..
416 #...######...#
417 .##..####..##.
418 ...#..##..#...
419 .ccc..##..ccc.
420 caajc.##.caajc
421 c!ajc....c!ajc
422 .ccc......ccc.
423 #............#
424 .##........###
425 ..##......##..
426 .....dddd.....
427 ....dddddd....
428 ....djjddd....
429 .....djdd.....
430 ......dd......
431 vvvvvvvvvvvvvv
432 Bonus:
433 ..............
434 ..............
435 ..............
436 ..............
437 ..............
438 .lp.......m.p.
439 3...b.........
440 ..j.......j..3
441 .&.}..........
442 ..............
443 ..............
444 ..............
445 .....>.?......
446 ....?....?....
447 ......?.>.....
448 ..............
449 ..............
450 ffffffffffffff
451 Level:
452 Misty
453 The Devil
454 Bricks:
455 .......#####..
456 ......#dd#ff#.
457 .....#ddd#fff#
458 #...##ddd#fff#
459 .###.#ddd#fff#
460 .....#ddd#fff#
461 .....#ddd#fff#
462 d...d#d#####f#
463 .ddd.##gg#hh##
464 .....#ggg#hhh#
465 .....#ggg#hhh#
466 g...g#ggg#hhh#
467 .ggg.#ggg#hhh#
468 .....#g#####h#
469 .....##.....##
470 #...##.......#
471 .###..........
472 .....vvvvvvvvv
473 Bonus:
474 .......55555..
475 ......5..5**5.
476 .....5...5...5
477 5...55.g.5..35
478 .555.5...5.m.5
479 .....5...5...5
480 .....5...5...5
481 ....3555555555
482 .+.&.55-.5..55
483 .....5...5...5
484 .....5...5..-5
485 .....5...5...5
486 ..3..5...5...5
487 .....555555555
488 .....55.....55
489 5...55.......5
490 .555..........
491 .....+..wm..wm
0 Version: 1.00
1 Level:
2 Daddy
3 Family
4 Bricks:
5 vvvvvv@vvvvvvv
6 v.v.v.v@.v.v.v
7 E!.!E!EE!E!E!E
8 E...E.EE.E.E.E
9 EEE!EEEEEE!EEE
10 zzzzzzzzzzzzzz
11 .......kik....
12 k#.*.#kikik..*
13 ik###kik.kik##
14 kik.kik###kik.
15 .kikik..*..kik
16 ..kik...###.ki
17 zzzzzzzzzzzzzz
18 ##kik###kik###
19 .kikik.kikik.k
20 kik.kikik.kiki
21 ik###kik###kik
22 zzzzzzzzzzzzzz
23 Bonus:
24 333333.l3mmm33
25 >>>>>>l.>>>>>>
26 .>.>.>..>.>...
27 .5.5.5..5.5.5.
28 ...>......>...
29 2222222222222j
30 .......?f>....
31 ?..&..>Wpf?..&
32 W>...?Wf.pf>..
33 fW>.>Wf...pf?.
34 .fWWWf..&..p..
35 ..fff.........
36 .wbwbwjw.wbwbw
37 ..<><....W....
38 .<>p><.~WpW..~
39 .><.<><W~..W.~
40 ><...<><...~W~
41 wbwbwdwdwdwbwb
42 Level:
43 Daddy
44 Snow Storm
45 Bricks:
46 jjjjjjjjjjjjjj
47 jvjvjvjjvjvjvj
48 jjjjjjjjjjjjjj
49 jvjvjvjjvjvjvj
50 jjjjjjjjjjjjjj
51 jvjvjvjjvjvjvj
52 jjjjjjjjjjjjjj
53 jvjvjvjjvjvjvj
54 jjjjjjjjjjjjjj
55 jvjvjvjjvjvjvj
56 jjjjjjjjjjjjjj
57 jvjvjvjjvjvjvj
58 jjjjjjjjjjjjjj
59 jvjvjvjjvjvjvj
60 jjjjjjjjjjjjjj
61 jvjvjvjjvjvjvj
62 jvjvjvjjvjvjvj
63 jjjjjjjjjjjjjj
64 Bonus:
65 bW.W.WwwW.W.Wb
66 .4.4.4..4.4.4.
67 .W.W.W..W.W.W.
68 .3.3.3..3.3.3.
69 .W.W.WwwW.W.W.
70 .3.3.3..3.3.3.
71 bW.W.W..W.W.Wb
72 .1.1.1..1.1.1.
73 .W.W.WwwW.W.W.
74 .1.1.1..1.1.1.
75 bW.W.W..W.W.Wb
76 .0.0.0ww0.0.0.
77 mW.WmW..WmW.Wm
78 W0W0W0WW0W0W0W
79 .W.W.W..W.W.W.
80 W0W0W0WW0W0W0W
81 b0m0m0ww0m0m0b
82 WgWgWgWWgWgWgW
83 Level:
84 Daddy
85 Boom
86 Bricks:
87 **************
88 *............*
89 *.**********.*
90 *.*........*.*
91 *.*.******.*.*
92 *.*.*....*.*.*
93 *.*.*.**.*.*.*
94 *.*.*.**.*.*.*
95 *.*.*.**.*.*.*
96 *.*.*.**.*.*.*
97 *.*.*.**.*.*.*
98 *.*.*.**.*.*.*
99 *.*.*....*.*.*
100 *.*.******.*.*
101 *.*........*.*
102 *.**********.*
103 *............*
104 **************
105 Bonus:
106 11111111111111
107 1............1
108 1.1111111111.1
109 1.1........1.1
110 1.1.222222.1.1
111 1.1.2....2.1.1
112 1.1.2.44.2.1.1
113 1.1.2.44.2.1.1
114 1.1.2.44.2.1.1
115 1.1.2.44.2.1.1
116 1.1.2.44.2.1.1
117 1.1.2.44.2.1.1
118 1.1.2....2.1.1
119 1.1.222222.1.1
120 1.1........1.1
121 1.1111111111.1
122 1............1
123 11111111111111
124 Level:
125 Daddy
126 Oh boy
127 Bricks:
128 vfv#vfv#vfv#**
129 hvh#hvh#hvh#**
130 v#v#v#v#v#v##*
131 f#f#f#f#f#f#**
132 v#v#v#v#v#v#**
133 h#h#h#h#h#h#*#
134 v#v#v#v#v#v#**
135 f#f#f#f#f#f#**
136 v#v#v#v#v#v##*
137 h#h#h#h#h#h#..
138 v#v#v#v#v#v#..
139 f#f#f#f#f#*#*#
140 v#v#v#v#v#*#**
141 h#h#h#h#h#*#**
142 v#v#v#v#v#*##*
143 f#fvf#fvf#****
144 v#vhv#vhv#****
145 h#############
146 Bonus:
147 bwb.bwb.0w0.ll
148 wbw.wbw.w0w.ll
149 0.0.0.0.0.0..l
150 0.0.0.0.0.0.ll
151 0.0.0.0.0.0.ll
152 0.0.0.0.0.0.5.
153 0.0.0.0.0.0.55
154 0.0.0.0.0.0.55
155 b.w.w.w.w.w..5
156 w.0.0.0.0.0...
157 b.0.0.0.0.0...
158 w.0.0.0.0.4.5.
159 b.0.0.0.0.4.54
160 w.0.0.0.0.4.44
161 b.0.0.0.0.4..4
162 w.bwb.bwb.4444
163 b.wbw.wbw.4444
164 w.............
165 Level:
166 Daddy
167 Fancy work
168 Bricks:
169 vvvvvvvvvvvvvv
170 xcvvvvvvvvvvcx
171 xcvvvvvvvvvvcx
172 evvvvvvvvvvvve
173 xcvvvvvvvvvvcx
174 xcvvvvvvvvvvcx
175 eevvvvvvvvvvee
176 ycvvvvvvvvvvcy
177 yccvvvvvvvvccy
178 eeevvvvvvvveee
179 yccvvvvvvvvccy
180 ycccvvvvvvcccy
181 eeeevvvvvveeee
182 zcccvvvvvvcccz
183 zccccvvvvccccz
184 eeeeevvvveeeee
185 eccceeeeeeccce
186 ecceccccccecce
187 Bonus:
188 **...f??f...**
189 ++..f?--?f..++
190 w..f?-WW-?f..w
191 .*f?-WddW-?f*.
192 g.?-Wd~~dW-?.g
193 g.-Wd~{{~dW-.g
194 ..Wd~{..{~dW..
195 ..W~{....{~W..
196 w..{......{..w
197 ..g........g..
198 ..............
199 ....<....<....
200 ...g>....>g...
201 ....<....<....
202 w............w
203 .....*..*.....
204 ....++++++....
205 ...g......g...
206 Level:
207 Daddy
208 Expand
209 Bricks:
210 @@@@@@@@@@@@@@
211 @.............
212 @!..!..!..!..!
213 @.............
214 @.............
215 @!..!..!..!..!
216 @.............
217 @.............
218 @!..!..!..!..!
219 @.............
220 @.............
221 @!..!..!..!..!
222 @.............
223 @.............
224 @!..!..!..!..!
225 @.............
226 @.............
227 @!..!..!..!..!
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ...........}g.
233 .b.<b<.b.<b<.b
234 ..............
235 .......w....d.
236 .b++b++b++b++b
237 ..}g..........
238 .c.c.c.c.c.c.c
239 .b<.b.<b<.b.<b
240 ..............
241 ...........}g.
242 ..--.--.--.--.
243 ..............
244 ..<...dw....<.
245 ..++.++.++.++.
246 ..}g.......}..
247 Level:
248 Daddy
249 Stars
250 Bricks:
251 EeEeEeEeEeEeEe
252 EeEeEeEeEeEeEe
253 EeEeEeEeEeEeEe
254 EeEeEeEeEeEeEe
255 EeEeEeEeEeEeEe
256 EeEeEeEeEeEeEe
257 EeEeEeEeEeEeEe
258 EeEeEeEeEeEeEe
259 EeEeEeEeEeEeEe
260 vvvvvvvvvvvvvv
261 ..............
262 !..!..!..!..!.
263 **************
264 vvvvvvvvvvvvvv
265 yyyyyyyyyyyyyy
266 ffffffffffffff
267 zzzzzzzzzzzzzz
268 kkkkkkkkkkkkkk
269 Bonus:
270 .l.2.3.5.3.2.l
271 .1.2.3.5.3.2.1
272 .1.2.3.5.3.2.1
273 .1.2.3.5.3.2.1
274 .1.2.3.4.3.2.1
275 .1.2.3.4.3.2.1
276 .1.2.3.4.3.2.1
277 .b.b.b.b.b.b.b
278 .w.w.w.w.w.w.w
279 >.>.>.>.>.>.>.
280 ..............
281 ..............
282 ..............
283 &.&.&.&.&.&.&.
284 ..............
285 +s+..+s+...+s+
286 jjjjjjjjjjjjjj
287 jjjjjjjjjjjjjj
288 Level:
289 Daddy
290 Whew
291 Bricks:
292 **xxxxxxxxxxxx
293 **yyyyyyyyyyyy
294 *Exxxxxxxxxxxx
295 *Eyyyyyyyyyyyy
296 *Exxxxxxxxxxxx
297 *Eyyyyyyyyyyyy
298 *Exxxxxxxxxxxx
299 *Eyyyyyyyyyyyy
300 *Exxxxxxxxxxxx
301 *Eyyyyyyyyyyyy
302 *Exxxxxxxxxxxx
303 *Eyyyyyyyyyyyy
304 *Exxxxxxxxxxxx
305 *Eyyyyyyyyyyyy
306 *Exxxxxxxxxxxx
307 *Eyyyyyyyyyyyy
308 *Exxxxxxxxxxxx
309 *EEEEEEEEEEEEE
310 Bonus:
311 bbggggggggggbb
312 bbggggggggggdd
313 b.ww........bb
314 b.dddddddddddd
315 b...........bb
316 b...........dd
317 b.ww........bb
318 b.dddddddddddd
319 b...........bb
320 b...........dd
321 b.ww........bb
322 b.dddddddddddd
323 b...........bb
324 b...........dd
325 w.ww........bb
326 w.dddddddddddd
327 w...........bb
328 w.............
329 Level:
330 Daddy
331 Alex
332 Bricks:
333 gggvgvvggvgvvg
334 gvgvgvvgvvvggv
335 gggvgvvggvvggv
336 gvgvgvvgvvgvvg
337 gvgvggvggvvvvv
338 vvvvvvvvvvvvvv
339 !!!!!!!!!!!!!!
340 ***!***!***!*!
341 *!*!*!*!*!*!*!
342 *!*!*!*!*!*!*!
343 *!*!*!*!*!*!*!
344 *!*!*!*!*!*!*!
345 *!*!*!*!*!*!*!
346 *!*!*!*!*!*!*!
347 *!*!*!*!*!*!*!
348 *!*!*!*!*!*!*!
349 *!***!***!***!
350 *#############
351 Bonus:
352 333.3l.33.3..3
353 3.3.3..3...33.
354 333.3..33..33.
355 3.3.3..3..3..3
356 3+3+33+33+.+.+
357 gbgbgbggbgbgbg
358 ppp........ppp
359 000.000.000.0.
360 0.0.0.0.0.0.0.
361 0.0.0.0.0.0.0.
362 0.0.0.0.0.0.0.
363 0.0.0.0.0.0.0.
364 0.0.0.0.0.0.0.
365 0.0.0.0.0.0.0.
366 0.0.0.0.0.0.0.
367 0.0+0.0+0.0+0.
368 0+000+000+000+
369 0.............
370 Level:
371 Daddy
372 Michael
373 Bricks:
374 ivvvvgvvgvvvvi
375 ivvvvvggvvvvvi
376 i#gg#vggv#gg#i
377 i#gg#gvvg#gg#i
378 i####iiii####i
379 iiiivvvvvviiii
380 ivvvvvvvvvvvvi
381 igvgv@gg@vgvgi
382 ivgvv@gg@vvgvi
383 igvgv@gg@vgvgi
384 iiiii@@@@iiiii
385 ..............
386 !!!!!!!!!!!!!!
387 !@@@@@@@@@@@@!
388 !!!!!!!!!!!!!!
389 **************
390 *EEEEEEEEEEEE*
391 **************
392 Bonus:
393 w..w..**..w..w
394 ..............
395 ..55......55..
396 ..55..**..55..
397 ..............
398 ....w.**.w....
399 ......**......
400 .g.g..55..g.g.
401 WWWWW.55.WWWWW
402 WWWWw.l..wWWWW
403 ccccc....ccccc
404 ffffffffffffff
405 ffffffffffffff
406 f............f
407 --------------
408 wb>>>wbw>>>>bw
409 3............3
410 33333333333333
411 Level:
412 Daddy
413 Mommy
414 Bricks:
415 ...dddddddv...
416 .!.dddddddv.!.
417 ...dddddddv...
418 ..vd@@d@@dv...
419 !zz@vv.vv@zz!.
420 .zv@vg.gv@vz..
421 .zv@vg.gv@vz..
422 !zv@vvgvv@vz!.
423 .zz@gvvvg@zz..
424 ...@vgggv@....
425 !..!@@@@@!..!.
426 ..............
427 vvvv.!..!.vvvv
428 ..vv.#..#.vv..
429 !....#.!#....!
430 *.!.!#..#!.!.*
431 *****#..#*****
432 ######!.######
433 Bonus:
434 ...0112110....
435 ...0112110....
436 ...0112110....
437 bbb0..2..0bbbb
438 ....33.33.....
439 ..w.33.33.w...
440 ..w.44.44.w...
441 ..w.44444.w...
442 b...55555...b.
443 ....55l55.....
444 ..............
445 WWWWW~><~WWWWW
446 b{{{~.<>.~{{{b
447 {{{{{.><.{{{{{
448 ......<>......
449 bWWWW.><.WWWWb
450 bbbbb.<>.bbbbb
451 ......><......
452 Level:
453 Daddy
454 Daddy
455 Bricks:
456 vvvvvvvvvvvvvv
457 ..............
458 ..............
459 .vvvvvvvvvvvv.
460 .v..........v.
461 .v..........v.
462 .v.v.vvvv.v.v.
463 .v.v.v..v.v.v.
464 .v.v.v..v.v.v.
465 .v.v.v..v.v.v.
466 .v.v.v..v.v.v.
467 .v.v.v..v.v.v.
468 .v.v.v..v.v.v.
469 .v.v.v..v.v.v.
470 .v.v......v.v.
471 .v.vvvvvvvv...
472 yyyyyyyyyyyyyy
473 zzzzzzzzzzzzzz
474 Bonus:
475 bbbbbbbbbbbbbb
476 ..............
477 ..............
478 .bbbbbbbbbbbb.
479 .b..........b.
480 .b..........b.
481 .b.4.5555.4.b.
482 .b.4.5..5.4.b.
483 .b.4.5..5.4.b.
484 .b.4.5..5.4.b.
485 .b.4.5..5.4.b.
486 .b.4.5..5.4.b.
487 .b.4.5..5.4.b.
488 .b.4.5..5.4.b.
489 .b.4......4.b.
490 .b.44444444...
491 }}...}}}....}}
492 ++++++++++++++
493 Level:
494 Daddy
495 What to do
496 Bricks:
497 ###g######g###
498 #i#.#iiii#.#i#
499 ###.######.###
500 ..............
501 ..#...#...#...
502 .#i#.#i#.#i#..
503 ..#...#...#...
504 g............g
505 ##...####...##
506 #i#.#iiii#.#i#
507 ##...####...##
508 ..............
509 ..#...#...#g..
510 .#i#.#i#.#i#..
511 ..#...#...#...
512 ..............
513 g#...#...#...#
514 #i#.#i#.#i#.#i
515 Bonus:
516 111m111111m111
517 1m1.155551.1m1
518 111.111111.111
519 ..............
520 ..1...1...1...
521 .151.151.151..
522 ..1...1...1...
523 m............m
524 11...1111...11
525 151.155551.151
526 11...1111...11
527 ..............
528 ..1...1...1m..
529 .1b1.1b1.1b1..
530 ..1...1...1...
531 ..............
532 m1...1...1...1
533 1+1.1+1.1+1.1+
534 Level:
535 Daddy
536 Just 6 to go
537 Bricks:
538 hhhxhxhxhxhxhh
539 hhhhhhhhhhhhhx
540 hhxhhh######hh
541 hhhh##hhhhhhhx
542 hh##hhhhxhhhxh
543 hhhhhxhxhxhxhx
544 hh##hhhhxhxhxh
545 hhhh##hhhxhxhx
546 hhxhhh##hhhhxh
547 xhhhxhhh##hhhx
548 hhxhhhxhhh##hh
549 hhhhxhhhxhhhhh
550 hhxhhhxhhh##hh
551 hhhhxhhh##hhhx
552 hhxhhh##hhxhxh
553 xhhh##hhhxhxhx
554 hh##hhxhxhxhxh
555 #hhhhhhhhhhhhx
556 Bonus:
557 ww..........w+
558 ...~+~.f.f.gfw
559 w...~.......w<
560 .......+....<>
561 ....b...w..<>+
562 g.lfb.~wbw~.->
563 ~~..b..~w~.->-
564 w+......~.-.->
565 ~.w.pp..ff-<>-
566 w...ppp...-~<>
567 f.w.p+pf.-..{{
568 ..f.ppp..-fl.g
569 .-...f.f-...{{
570 ..~...f-...~bw
571 -....-......wb
572 ...-........bw
573 .-..W.wW.W.Wwb
574 ..gW>WW<W>W<WW
575 Level:
576 Daddy
577 It can be done
578 Bricks:
579 **************
580 *!..!.!!.!..!*
581 *............*
582 *EEEEEddEEEEE*
583 *EeeeeddeeeeE*
584 *EeeeEddEeeeE*
585 *EeEEeddeEEeE*
586 *EeeeeeeeeeeE*
587 *!EEEEEEEEEE!*
588 *..!.ffff.!..*
589 ****.ffff.****
590 EEE*fEEEEf*EEE
591 ****..dd..****
592 *!..!.dd.!..!*
593 *EEE.EEEE.EEE*
594 *..dddddddd..*
595 *!.ffffffff.!*
596 *EEfEEffEEfEE*
597 Bonus:
598 wwwwwbbbwwwwww
599 w<<<<<<<<<<<<w
600 w2bb222222bb2w
601 w.....22.....w
602 w.4454bb4544.w
603 w.445.224544.w
604 w.4..4224..4.w
605 w.4b33bb33b4.w
606 w<..........<w
607 w22<2ssss2<22w
608 wwww2ssss2wwww
609 ...ws....sw...
610 wwww{{ss{{wwww
611 w<{{<{ss{<{{<w
612 w...{....{...w
613 w{{ssssssss{{w
614 w<{<<<<<<<<{<w
615 w..<..<<..<..w
616 Level:
617 Daddy
618 Mystery
619 Bricks:
620 vvvvvvvvvvvvvv
621 vvvvvvvvvvvvvv
622 vvvvvvvvvvvvvv
623 vvvvvvvvvvvvvv
624 vvvvvvvvvvvvvv
625 vvvvvvvvvvvvvv
626 vvvvvvvvvvvvvv
627 vvvvvvvvvvvvvv
628 vvvvvvvvvvvvvv
629 vvvvvvvvvvvvvv
630 vvvvvvvvvvvvvv
631 vvvvvvvvvvvvvv
632 vvvvvvvvvvvvvv
633 vvvvvvvvvvvvvv
634 vvvvvvvvvvvvvv
635 vvvvvvvvvvvvvv
636 vvvvvvvvvvvvvv
637 vvvvvvvvvvvvvv
638 Bonus:
639 ??????????????
640 ??????????????
641 ??????????????
642 ??????????????
643 ??????????????
644 ??????????????
645 ??????????????
646 ??????????????
647 ??????????????
648 ??????????????
649 ??????????????
650 ??????????????
651 ??????????????
652 ??????????????
653 ??????????????
654 ??????????????
655 ??????????????
656 ??????????????
657 Level:
658 Daddy
659 Just 3 to go
660 Bricks:
661 iviviviviviviv
662 vvvvvvvvvvvvvv
663 vivivivivivivi
664 vvvvvvvvvvvvvv
665 iviviviviviviv
666 vvvvvvvvvvvvvv
667 ..............
668 .!..........!.
669 ..**********..
670 ..*@@@@@@@@*..
671 !.**********.!
672 .*..........*.
673 .*!..!..!..!*.
674 .*..........*.
675 .************.
676 .*@@@@@@@@@@*.
677 .************.
678 !!!!!!!!!!!!!!
679 Bonus:
680 l.l.......l.l.
681 ..............
682 ..............
683 ..............
684 b.b.b.b.b.b.b.
685 ++++++++++++++
686 .**........**.
687 **..........**
688 *.dddddddddd.*
689 *.d........d.*
690 *--dddddddd--*
691 .W----------W.
692 .WWWWWWWWWWWW.
693 .W..........W.
694 .!!!!!!!!!!!!.
695 .!..........!.
696 .pppppppppppp.
697 WWWWWWWWWWWWWW
698 Level:
699 Daddy
700 Yeah Hawww
701 Bricks:
702 vvvvvvvvvvvvvv
703 vvvvvvvvvvvvvv
704 vvvvvvvvvvvvvv
705 vvvvvvvvvvvvvv
706 **************
707 **************
708 **************
709 **************
710 **************
711 **************
712 **************
713 **************
714 **************
715 **************
716 **************
717 **************
718 **************
719 **************
720 Bonus:
721 pppppppppppppp
722 bbbbbbbbbbbbbb
723 44444444444444
724 ++++++++++++++
725 44444444444444
726 44444444444444
727 44444444444444
728 44444444444444
729 44444444444444
730 44444444444444
731 44444444444444
732 44444444444444
733 44444444444444
734 44444444444444
735 44444444444444
736 44444444444444
737 dddddddddddddd
738 dddddddddddddd
739 Level:
740 Daddy
741 Almost done now
742 Bricks:
743 byyyxzyzyxyyyb
744 bzzyxyzyzxyzzb
745 bEzyxxxxxxyzEb
746 bEzyyyyyyyyzEb
747 bEzzzzzzzzzzEb
748 bEEEEEEEEEEEEb
749 bbbbbbbbbbbbbb
750 cccccccccccccc
751 czczczczczczcz
752 xzxzxzxzxzxzxz
753 xyxyxyxyxyxyxy
754 zyzyzyzyzyzyzy
755 zxzxzxzxzxzxzx
756 xzxzxzxzxzxzxz
757 zxzxzxzxzxzxzx
758 zyzyzyzyzyzyzy
759 yzyzyzyzyzyzyz
760 zyzyzyzyzyzyzy
761 Bonus:
762 *............*
763 *...*....*...*
764 *...w.ll.w...*
765 w............w
766 b............b
767 ..............
768 ......g.......
769 .....g.g......
770 ..............
771 ..............
772 ..............
773 .*.........*..
774 ..............
775 ..............
776 ..............
777 w...........w.
778 *...........*.
779 gg..........gg
780 Level:
781 Daddy
782 Last One whew
783 Bricks:
784 vg..******..gv
785 gvg..****..gvg
786 .gvg..**..gvg.
787 g.gvg....gvg.g
788 vg.gvg..gvg.gv
789 gvg.gvggvg.gvg
790 .gvg.gvvg.gvg.
791 ..gvggvvggvg..
792 *..gvvggvvg..*
793 *..gvvggvvg..*
794 ..gvggvvggvg..
795 .gvg.gvvg.gvg.
796 gvg.gvggvg.gvg
797 vg.gvg..gvg.gv
798 g.gvge..egvg.g
799 .gvg.e..e.gvg.
800 gvg..e..e..gvg
801 vg..******..gv
802 Bonus:
803 5.....pp.....5
804 .5....pp....5.
805 ..5...pp...5..
806 ...5......5...
807 4...5....5...4
808 .4...5..5...4.
809 ..4...44...4..
810 ...4..44..4...
811 ....44..44....
812 ....33..33....
813 ...3..33..3...
814 ..3...33...3..
815 .3...2..2...3.
816 3...2....2...3
817 ...2+b..b+2...
818 ..2+.b..b.+2..
819 .2+..b..b..+2.
820 2+..ssssss..+2
0 Version: 1.00
1 Level:
2 Nethippy
3 Hard Walls
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 ..............
10 cccccccccccccc
11 dddddddddddddd
12 cccccccccccccc
13 ..............
14 cccccccccccccc
15 jjjjjjjjjjjjjj
16 cccccccccccccc
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 l....*..<.....
30 ..............
31 ...?.b........
32 ..............
33 b.............
34 ........s.....
35 ...<.?........
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Nethippy
44 Brick Bounce
45 Bricks:
46 f.e.d.f.g.f.e.
47 c.c.c.c.c.c.c.
48 ..............
49 .d.g.h.h.d.h.g
50 .c.c.c.c.c.c.c
51 ..............
52 f.e.g.d.e.e.d.
53 c.c.c.c.c.c.c.
54 ..............
55 .h.d.g.e.d.h.f
56 .c.c.c.c.c.c.c
57 ..............
58 d.h.f.d.f.h.f.
59 c.c.c.c.c.c.c.
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..b.s.......?.
67 ..............
68 ..............
69 .....-...b....
70 ..............
71 ..>.......>...
72 ......-.......
73 ..............
74 ..............
75 .....s........
76 ..............
77 ..............
78 ?.......>...+.
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Nethippy
85 BigGray
86 Bricks:
87 ..............
88 cccccccccccccc
89 cddc......cddc
90 cddc......cddc
91 cddc......cddc
92 cddc......cddc
93 cddccc..cccddc
94 cddchc..chcddc
95 cddchc..chcddc
96 cddchc..chcddc
97 cddchc..chcddc
98 cddchc..chcddc
99 cccchc..chcccc
100 cffchc..chcffc
101 cffchc..chcffc
102 cffchc..chcffc
103 cffchc..chcffc
104 cccccc..cccccc
105 Bonus:
106 ..............
107 p333333333333p
108 ..............
109 ..............
110 ..............
111 ..............
112 l....l..l....l
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Nethippy
126 Tricky
127 Bricks:
128 ..............
129 ..............
130 ..............
131 gggggggggggggg
132 EjjjjjjjjjjjjE
133 dddddddddddddd
134 ..............
135 gggggggggggggg
136 EjjjjjjjjjjjjE
137 dddddddddddddd
138 ..............
139 gggggggggggggg
140 EjjjjjjjjjjjjE
141 dddddddddddddd
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 55555555555555
151 ......ll......
152 b............b
153 ..............
154 b............b
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 p.....>>.....p
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Nethippy
167 Arrrgh!
168 Bricks:
169 iiiiiiiiiiiiii
170 ..............
171 iiEEEEEEEEEEEE
172 .............E
173 gggggggggggggg
174 E.............
175 EEEEEEEEEEEEgg
176 E.............
177 hhhhhhhhhhhhhh
178 .............E
179 hhEEEEEEEEEEEE
180 ..............
181 dddddddddddddd
182 E.............
183 EEEEEEEEEEEEdd
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 b.............
191 ..............
192 l5555555555555
193 ..............
194 .............b
195 ..............
196 4444444444444>
197 ..............
198 b.............
199 ..............
200 >.............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Nethippy
208 Hard Shot
209 Bricks:
210 .E..........gg
211 .............g
212 .E............
213 .E............
214 .E.....hh.....
215 .E....iiii....
216 .E...ajjjja...
217 .E..ijcbbcji..
218 .E.hijbvvbjih.
219 .E.hijbvvbjih.
220 .E..ijcbbcji..
221 .E...ajjjja...
222 .E....iiii....
223 .E.....hh.....
224 .E............
225 .Eg..........g
226 .Egg........gg
227 ..EEEEEEEEEEEE
228 Bonus:
229 .............l
230 ..............
231 ..............
232 ..............
233 ..............
234 ......2222....
235 .....333333...
236 ....23444432..
237 ...b23455432b.
238 ...b23455432b.
239 ....23444432..
240 .....333333...
241 ......2222....
242 ..............
243 ..............
244 ..............
245 ..l..........l
246 ..............
247 Level:
248 Nethippy
249 Madness
250 Bricks:
251 E............E
252 EggggE..EggggE
253 EggggE.vEggggE
254 EggggE..EggggE
255 EEEhEEv.EEgEEE
256 EhhhhE..EhhhhE
257 EhhhhE.vEhhhhE
258 EhhhhE..EhhhhE
259 EchccEv.EcchcE
260 EddddE..EddddE
261 EddddE.vEddddE
262 EddddE..EddddE
263 EzzzzEv.EzzzzE
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 .5555....5555.
272 .5555..l.5555.
273 .5555....5555.
274 ...p..w...p...
275 .>>>>....>>>>.
276 .>>>>..>.>>>>.
277 .>>>>....>>>>.
278 ..b...>....b..
279 .2222....2222.
280 .2222..w.2222.
281 .2222....2222.
282 ......f.......
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Nethippy
290 Devilish
291 Bricks:
292 ..............
293 ..............
294 ggggg@..@ggggg
295 ggzgg@..@ggzgg
296 ggzzg@..@gzzgg
297 zzzzz@..@zzzzz
298 zzzzz@..@zzzzz
299 ddzzd@..@dzzdd
300 ddzdd@..@ddzdd
301 ddddd@..@ddddd
302 ddddd@..@ddddd
303 ddddd@..@ddddd
304 EEEEE@..@EEEEE
305 ..............
306 ..............
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 >>>>>....>>>>>
314 >>l>>....>>l>>
315 >>++>....>-->>
316 +++++....-----
317 +++++....-----
318 ..++......--..
319 ..f........f..
320 ..............
321 55555....55555
322 55555....55555
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Nethippy
331 Bricks Ahoy!
332 Bricks:
333 ..............
334 !.!.!.!.!.!.!.
335 ..............
336 .!.!.!.!.!.!.!
337 ..............
338 !.!.!.!.!.!.!.
339 ..............
340 .!.!.!.!.!.!.!
341 ..............
342 !.!.!.!.!.!.!.
343 ..............
344 .!.!.!.!.!.!.!
345 ..............
346 !.!.!.!.!.!.!.
347 ..............
348 .!.!.!.!.!.!.!
349 ..............
350 !.!.!.!.!.!.!.
351 Bonus:
352 ..............
353 5.5.5.5.5.5.5.
354 ..............
355 .5.5.5.5.5.5.5
356 ..............
357 ?.............
358 ..............
359 .............?
360 ..............
361 >.>.>.>.>.>.>.
362 ..............
363 .>.>.>.>.>.>.>
364 ..............
365 l...........l.
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Nethippy
372 Boom Boxes
373 Bricks:
374 ..............
375 zzz.zzz.zzz...
376 z*z.z*z.z*z...
377 zzz.zzz.zzz...
378 ..............
379 .zzz.zzz.zzz..
380 .z*z.z*z.z*z..
381 .zzz.zzz.zzz..
382 ..............
383 ..zzz.zzz.zzz.
384 ..z*z.z*z.z*z.
385 ..zzz.zzz.zzz.
386 ..............
387 ...zzz.zzz.zzz
388 ...z*z.z*z.z*z
389 ...zzz.zzz.zzz
390 ..............
391 ..............
392 Bonus:
393 ..............
394 fff.???.555...
395 f.f.?.?.5.5...
396 fff.???.555...
397 ..............
398 .+++.44l.ggg..
399 .+.+.4.4.g.g..
400 .+++.444.ggg..
401 ..............
402 ..WWW.bbb.-+-.
403 ..W.W.b.b.+.+.
404 ..WWW.bbb.-+-.
405 ..............
406 ...>>>........
407 ...>.>........
408 ...>>>........
409 ..............
410 ..............
411 Level:
412 Nethippy
413 Hell-O-Ween
414 Bricks:
415 ..............
416 ......yy......
417 ......yy......
418 ...eeeyyeee...
419 ..eeeeeeeeee..
420 .eeeeeeeeeeee.
421 .eee@eeee@eee.
422 .ee@@@ee@@@ee.
423 .eeeee@@eeeee.
424 .e@e@e@@e@e@e.
425 .e@@@eeee@@@e.
426 .ee@@@@@@@@ee.
427 .eee@e@@e@eee.
428 ..eeeeeeeeee..
429 ...eeeeeeee...
430 .....eeee.....
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ......ll......
436 ..............
437 ......mm......
438 ..............
439 ..............
440 .....f..f.....
441 ......>>......
442 ...555..555...
443 ...5.5..5.5...
444 .....5555.....
445 ..............
446 ..>..f..f..>..
447 ...>>>>>>>>...
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Nethippy
454 Wiggly
455 Bricks:
456 dEEEEEEEEEEEEE
457 dEhEgEiEgEhEdE
458 dEhEgEiEgEhEdE
459 dEhEgE...EhEdE
460 dEhEgE...EhEdE
461 dE...E.E.EhEdE
462 dE...E.E.EhEdE
463 dE.E.E.E...EdE
464 dE.E...E...EdE
465 ...E...EgE.EdE
466 ...EgEiEgE.EdE
467 .EhEgEiEgE.EdE
468 .EhEgEiEgE.EdE
469 .EhEgEiEgE.EdE
470 .EhEgEiEgE...E
471 .EhEgEiEgE...E
472 .EhEgEiEgEhE.E
473 .EEEEEEEEEEE.E
474 Bonus:
475 ..............
476 ..5.5.l.l.5.5.
477 ..5.5.5.5.5.5.
478 ..>.........5.
479 ..>.>.......5.
480 ..........>...
481 >.........>...
482 >.............
483 >.............
484 ........>.....
485 ....>.>.......
486 ..>...........
487 ..>.........>.
488 ............>.
489 ..............
490 ..5.5.5.5.....
491 ..5.5.5.5.5...
492 ..............
493 Level:
494 Nethippy
495 Diag-Wall
496 Bricks:
497 ..............
498 gg............
499 ddgg..........
500 iiddgg........
501 hhiiddgg......
502 v@hhiiddgg....
503 ..v@hhiiddgg..
504 ....v@hhiiddgg
505 ......v@hhiidd
506 ........v@hhii
507 ..........v@hh
508 ............v@
509 ..............
510 ..............
511 ..............
512 ..............
513 ..............
514 ..............
515 Bonus:
516 ..............
517 55............
518 l.55..........
519 ....55........
520 .p....55......
521 >.......55....
522 ..>.?.....55..
523 ....>.b.....55
524 ......>..*....
525 ........>.d...
526 ..........>...
527 ............>.
528 ..............
529 ..............
530 ..............
531 ..............
532 ..............
533 ..............
534 Level:
535 Nethippy
536 Pot-O-Gold
537 Bricks:
538 ..............
539 ..............
540 ..............
541 .cccc.........
542 EhhhhE........
543 EggggE........
544 EddddE........
545 EeeeeE........
546 .EEEE.........
547 ..............
548 ..............
549 ..............
550 ..............
551 ..............
552 ..............
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 .5555.........
562 .5555.........
563 .5555.........
564 .5555.........
565 ..............
566 ..............
567 ..............
568 ..............
569 ..............
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Nethippy
577 Not Pretty
578 Bricks:
579 ..............
580 ..............
581 ..............
582 jjjjjjjjjjjjjj
583 jjjjjjjjjjjjjj
584 EEEEcEEEEcEEEE
585 EddE..EE..EddE
586 E............E
587 E............E
588 E............E
589 EiiEii..iiEiiE
590 EccEEE..EEEccE
591 ..............
592 ..............
593 ..............
594 ..............
595 ..............
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ..............
601 l555555555555l
602 <555555555555<
603 ....>....>....
604 .>>........>>.
605 ..............
606 ..............
607 ..............
608 .>>.>>..>>.>>.
609 .>>........>>.
610 ..............
611 ..............
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Nethippy
618 2 Close 4U
619 Bricks:
620 ..............
621 cccccccccccccc
622 c............c
623 c.cccccccccc.c
624 c.c........c.c
625 c.c.iiiiii.c.c
626 c.c.i....i.c.c
627 ..c.i.@@.i.c..
628 E.c.i....i.c.E
629 ..............
630 hhhhhhhhhhhhhh
631 ..............
632 E.!.!.!.!.!..E
633 ..............
634 !.!.!.!.!.!.!.
635 ..............
636 vvvvvvvvvvvvvv
637 vvvvvvvvvvvvvv
638 Bonus:
639 ..............
640 444444ll444444
641 4............4
642 4............4
643 4............4
644 4...555555...4
645 l...5....5...l
646 ....5....5....
647 ..p.5....5.p..
648 ..............
649 ..............
650 ..............
651 ..>.>.>.>.>...
652 ..............
653 >.>.>.>.>.>.>.
654 ..............
655 ..............
656 ..............
657 Level:
658 Nethippy
659 Misery
660 Bricks:
661 ..............
662 ..............
663 ..............
664 EEEEEEEEEEEEEE
665 .....iEEi.....
666 ......EE......
667 ....E.EE.E....
668 hhhhE.EE.Ehhhh
669 hhhEE.EE.EEhhh
670 hhhEi.EE.iEhhh
671 hhhE..EE..Ehhh
672 EEEE.EEEE.EEEE
673 i.....@@.....i
674 ......@@......
675 ......ii......
676 ..............
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 .....>..>.....
685 ..............
686 ..............
687 >5>5......5>5>
688 5>5........5>5
689 >5>.>....>.>5>
690 5>5........5>5
691 ..............
692 >............>
693 ..............
694 ......>>......
695 ..............
696 ..............
697 ..............
698 Level:
699 Nethippy
700 Evil Face
701 Bricks:
702 ..............
703 ..............
704 .E.E......E.E.
705 .EhE......EhE.
706 .EhE......EhE.
707 .EEE......EEE.
708 .....hhhh.....
709 .....gggg.....
710 .....ffff.....
711 ..............
712 ..............
713 ..............
714 .dddddddddddd.
715 .dddddddddddd.
716 ..............
717 ..............
718 ..............
719 ..............
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..f........f..
725 ..f........f..
726 ..............
727 ..............
728 ..............
729 ..............
730 ..............
731 ..............
732 ..............
733 .>>>>>>>>>>>>.
734 .>>>>>>>>>>>>.
735 ..............
736 ..............
737 ..............
738 ..............
739 Level:
740 Nethippy
741 I.M.I.
742 Bricks:
743 ..............
744 ..............
745 d.EEiiiiiiEE.d
746 d.EgEiiiiEgE.d
747 d.E..EiiE..E.d
748 d.E...zz...E.d
749 d.E...dd...E.d
750 d.E...dd...E.d
751 d.E........E.d
752 d.E........E.d
753 d.E........E.d
754 d.E........E.d
755 d.E........E.d
756 d.E........E.d
757 d.Eg......gE.d
758 dEEE......EEEd
759 v............v
760 ..............
761 Bonus:
762 ..............
763 ..............
764 3...555555...3
765 3....5555....3
766 3.....55.....3
767 3............3
768 3.....>>.....3
769 3.....--.....3
770 3............3
771 3............3
772 3............3
773 3............3
774 3............3
775 3............3
776 3............3
777 3............3
778 f............f
779 ..............
780 Level:
781 Nethippy
782 Easy My Butt
783 Bricks:
784 ..............
785 ..............
786 ..............
787 ..............
788 aaaaaaaaaaaaaa
789 **************
790 aaaaaaaaaaaaaa
791 ..............
792 aaaaaaaaaaaaaa
793 **************
794 aaaaaaaaaaaaaa
795 ..............
796 aaaaaaaaaaaaaa
797 **************
798 aaaaaaaaaaaaaa
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ffffffff..ffff
808 ..............
809 ffffff...fffff
810 ..............
811 ffff...fffffff
812 ..............
813 fff...ffffffff
814 ..............
815 ffffff...fffff
816 ..............
817 ffff...fffffff
818 ..............
819 ..............
820 ..............
821 Level:
822 Nethippy
823 Nitey Nite!
824 Bricks:
825 ..............
826 a.a...a.a.....
827 ...........a..
828 ..a.a.a..a...a
829 ........a.....
830 .a....a..a.a..
831 ...a......a...
832 .a...a.a.....a
833 ...a......a...
834 .a......a.....
835 ...a...a..a.a.
836 .a...a........
837 .......a......
838 ..a........a..
839 .a..a.a..a...a
840 ..............
841 ...a..........
842 ..............
843 Bonus:
844 ..............
845 >.d...d.5.....
846 ...........d..
847 ..5.>.d..d...>
848 ........5.....
849 .d....d..d.d..
850 ...d......5...
851 .d...>.d.....d
852 ...d......d...
853 .5......d.....
854 ...5...>..d.d.
855 .>...d........
856 .......d......
857 ..5........d..
858 .d..d.d..d...>
859 ..............
860 ...>..........
861 ..............
862 Level:
863 Nethippy
864 Megawall
865 Bricks:
866 jjjjjjjjjjjjjj
867 jjjjjjjjjjjjjj
868 dddddddddddddd
869 dddddddddddddd
870 ..............
871 .@.@.@.@.@.@.@
872 ..............
873 hhhhhhhhhhhhhh
874 hhhhhhhhhhhhhh
875 iiiiiiiiiiiiii
876 iiiiiiiiiiiiii
877 ..............
878 !.!.!.!.!.!.!.
879 ..............
880 ffffffffffffff
881 ffffffffffffff
882 gggggggggggggg
883 gggggggggggggg
884 Bonus:
885 55555555555555
886 55555555555555
887 55555555555555
888 55555555555555
889 ..............
890 ..............
891 ..............
892 l............l
893 wffffffffffffw
894 wffffffffffffw
895 l............l
896 ..............
897 5.5.5.5.5.5.5.
898 ..............
899 ?.....bb.....?
900 ?.....bb.....?
901 >>>>>>>>>>>>>>
902 >>>>>>>>>>>>>>
903 Level:
904 Nethippy
905 Spiral Doom
906 Bricks:
907 EEEEEEEEEEEEEE
908 Ea..........bE
909 Ea..........bE
910 E.EEEEEEEEEE.E
911 E.Ev.......E.E
912 E.Ev.......E.E
913 E.E.EEEEE..E.E
914 E.E.Ehhhh..E.E
915 E.E.Ehddh..E.E
916 E.E.Ehddh..E.E
917 E.E.Ehddh..E.E
918 E.E.Ehddh..E.E
919 E.E.Ehddh..E.E
920 E.E.Ehhhh..E.E
921 E.E.EEEEEEEE.E
922 E.Ec........cE
923 E.Ec........cE
924 E.EEEEEEEEEEEE
925 Bonus:
926 ..............
927 .>..........>.
928 .>..........>.
929 ..............
930 ...>..........
931 ...>..........
932 ..............
933 .....4444.....
934 .....4554.....
935 .....4554.....
936 .....4554.....
937 .....4554.....
938 .....4554.....
939 .....4444.....
940 ..............
941 ...>........>.
942 ...>........>.
943 ..............
944 Level:
945 Nethippy
946 0-1-0
947 Bricks:
948 g.....gg.....g
949 EEEEE.EE.EEEEE
950 E...E.hh.E...E
951 E...E.hh.E...E
952 E.E.E.hh.E.E.E
953 E.E.E.hh.E.E.E
954 h.E.i.hh.i.E.h
955 h.E.i.hh.i.E.h
956 h.E.i.hh.i.E.h
957 h.E.i.hh.i.E.h
958 E.E.E.hh.E.E.E
959 E.E.E.hh.E.E.E
960 E...E.hh.E...E
961 E...E.hh.E...E
962 EEEEE.EE.EEEEE
963 ..............
964 ..............
965 ..............
966 Bonus:
967 l.....55.....l
968 ..............
969 ......>>......
970 ..............
971 ..............
972 ..............
973 5............5
974 5.....>>.....5
975 5.....>>.....5
976 5............5
977 ..............
978 ..............
979 ..............
980 ......>>......
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Nethippy
987 In Reverse
988 Bricks:
989 ..............
990 ..............
991 ..............
992 .E..........E.
993 .E..........E.
994 .E..........E.
995 .EggggggggggE.
996 .EhhhhhhhhhhE.
997 .EiiiiiiiiiiE.
998 .EddddddddddE.
999 .E..........E.
1000 .E..........E.
1001 .EEEEEEEEEEEE.
1002 ..............
1003 ..............
1004 ..............
1005 ..............
1006 ..............
1007 Bonus:
1008 ..............
1009 ..............
1010 ..............
1011 ..............
1012 ..............
1013 ..............
1014 ..>>>>>>>>>>..
1015 ..3333333333..
1016 ..4444444444..
1017 ..5555555555..
1018 ..............
1019 ..............
1020 ..............
1021 ..............
1022 ..............
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Nethippy
1028 Booomb!
1029 Bricks:
1030 ..............
1031 ..............
1032 .......jjjj...
1033 .......j..jj..
1034 ......EjE..j..
1035 ......E*E..jj.
1036 .....EE*EE..j.
1037 ....Ezz*zzE.j.
1038 ...Ezz***zzEjj
1039 ...Ez**c**zE.j
1040 ...Ez*c!c*zE.d
1041 ...Ez**c**zE..
1042 ...Ezz***zzE..
1043 ....Ezz*zzE...
1044 .....EzzzE....
1045 ......EEE.....
1046 ..............
1047 ..............
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 .......l......
1054 ..............
1055 ..............
1056 .....ff.ff....
1057 ....ff...ff...
1058 ....f.....f...
1059 ....f.....f...
1060 ....f.....f...
1061 ....ff...ff...
1062 .....ff.ff....
1063 ......fff.....
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Nethippy
1069 Crazywall
1070 Bricks:
1071 ...hhh!!hhh...
1072 @..h.d..d.h..@
1073 ...h.d!!d.h...
1074 iihh.d..d.hhii
1075 .....d!!d.....
1076 @@...d..d...@@
1077 .....d!!d.....
1078 iiiddd..dddiii
1079 .....z!!z.....
1080 @@@..z..z..@@@
1081 .....z!!z.....
1082 iiii.zzzz.iiii
1083 ......cc......
1084 @@@@c.cc.c@@@@
1085 ....cccccc....
1086 ....g....g....
1087 ggggg....ggggg
1088 .....vvvv.....
1089 Bonus:
1090 ...555..555...
1091 ...5.5..5.5...
1092 ...5.5..5.5...
1093 5555.5..5.5555
1094 .....5..5.....
1095 .....5..5.....
1096 .....5++5.....
1097 l..555..555..l
1098 .....b--b.....
1099 .....b..b.....
1100 .....bggb.....
1101 .....bbbb.....
1102 ..............
1103 ..............
1104 ..............
1105 ....>....>....
1106 >>>>>....>>>>>
1107 .....dddd.....
1108 Level:
1109 Nethippy
1110 Diamondeath
1111 Bricks:
1112 vvvvvvvvvvvvvv
1113 vvvvvv..vvvvvv
1114 vvvvv....vvvvv
1115 vvvv......vvvv
1116 vvv........vvv
1117 vv..........vv
1118 v............v
1119 ..............
1120 ......dd......
1121 ......dd......
1122 ..............
1123 v............v
1124 vv..........vv
1125 vvv........vvv
1126 vvvv......vvvv
1127 vvvvv....vvvvv
1128 vvvvvv..vvvvvv
1129 vvvvvvvvvvvvvv
1130 Bonus:
1131 555555ll555555
1132 555555..555555
1133 55555....55555
1134 5555......5555
1135 555........555
1136 55..........55
1137 5............5
1138 ..............
1139 ......pp......
1140 ......pp......
1141 ..............
1142 >............>
1143 >>..........>>
1144 >>>........>>>
1145 >>>>......>>>>
1146 >>>>>....>>>>>
1147 >>>>>>..>>>>>>
1148 >>>>>>>>>>>>>>
1149 Level:
1150 Nethippy
1151 Big Ass
1152 Bricks:
1153 ..............
1154 ..............
1155 ..............
1156 ..............
1157 ...bbbbbbb....
1158 ..EhfffffhE...
1159 .EihfjjjfhiE..
1160 EihhfffffhhiE.
1161 EiheeeeeeehiE.
1162 Eihe@ddd@ehiE.
1163 Eihee@d@eehiE.
1164 Eihhee@eehhiE.
1165 .Eihhh@hhhiE..
1166 ..Eiih@hiiE...
1167 ...EEh@hEEh...
1168 ..Ehhh@hhhE...
1169 ..Edgg@ggdE...
1170 ...EEE@EEE....
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..............
1176 ...0000000....
1177 ....WWWWW.....
1178 ..>.WdddW.>...
1179 .>..WWWWW..>..
1180 .>.bbbbbbb.>..
1181 .>.b.222.b.>..
1182 .>.bb.2.bb.>..
1183 .>..bb.bb..>..
1184 ..>.......>...
1185 ...>>...>>....
1186 ..........l...
1187 ..............
1188 ...555.555....
1189 ..............
1190 Level:
1191 Nethippy
1192 Fargin A
1193 Bricks:
1194 ..............
1195 zz.EEEccEEE.zz
1196 zz.Egv..vgE.zz
1197 zz.E.v..v.E.zz
1198 ...E.v..v.E...
1199 zEEE.v..v.EEEz
1200 ...E.v..v.E...
1201 hh.EvvEEvvE.hh
1202 hh....EE....hh
1203 hh....vv....hh
1204 hh.EvvvvvvE.hh
1205 ...E......E...
1206 EEEEvvvvvvEEEE
1207 ..............
1208 ..............
1209 ..............
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 55....++....55
1215 55..l....l..55
1216 55..........55
1217 ..............
1218 ..............
1219 ..............
1220 44..........44
1221 44..........44
1222 44....++....44
1223 44..-....-..44
1224 ..............
1225 ....>>>>>>....
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 ..............
1231 Level:
1232 Nethippy
1233 Pac Attack
1234 Bricks:
1235 ..............
1236 ..............
1237 ..............
1238 ..............
1239 ..hh..........
1240 .hhhhh..ccccc.
1241 hhhhh..ccvccvc
1242 hhhh...cvvcvvc
1243 hhh....ccccccc
1244 hhhh...ccccccc
1245 hhhhh..ccccccc
1246 .hhhhh.ccccccc
1247 ..hh....c.c.c.
1248 ..............
1249 ..............
1250 ..............
1251 ..............
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 ..bb..........
1259 .bbbbb..55l55.
1260 bbbbb..55.55.5
1261 bbbb...5..5..5
1262 bbb....5555555
1263 bbbb...>>>>>>>
1264 bbbbb..>>>>>>>
1265 .bbbbb.~f~f~f~
1266 ..bb....~.~.~.
1267 ..............
1268 ..............
1269 ..............
1270 ..............
1271 ..............
1272 Level:
1273 Nethippy
1274 Channels
1275 Bricks:
1276 .dE.gEhhEg.Ed.
1277 .dE.gEhhEg.Ed.
1278 .dE.gEhhEg.Ed.
1279 .dE.gEhhEg.Ed.
1280 .dE.gEhhEg.Ed.
1281 .dE.EE..EE.Ed.
1282 .EE.E....E.EE.
1283 .E..E....E..E.
1284 .E.iE.EE.Ei.E.
1285 .E.EE.EE.EE.E.
1286 .E.E..EE..E.E.
1287 .E.E..EE..E.E.
1288 .E.E..EE..E.E.
1289 .E.E..EE..E.E.
1290 .E.E.EiiE.E.E.
1291 .E.E.E..E.E.E.
1292 .E.E......E.E.
1293 .E..........E.
1294 Bonus:
1295 .3..4.ll.4..3.
1296 .3..4.55.4..3.
1297 .3..4.55.4..3.
1298 .3..4.55.4..3.
1299 .3..4.55.4..3.
1300 .3..........3.
1301 ..............
1302 ..............
1303 ...>......>...
1304 ..............
1305 ..............
1306 ..............
1307 ..............
1308 ..............
1309 ......>>......
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Nethippy
1315 Graybar
1316 Bricks:
1317 v............v
1318 ..............
1319 ..............
1320 ..............
1321 vvvvvvvvvvvvvv
1322 ..............
1323 vvvvvvvvvvvvvv
1324 ..............
1325 zzzzzzzzzzzzzz
1326 vvvvvvvvvvvvvv
1327 cccccccccccccc
1328 bbbbbbbbbbbbbb
1329 aaaaaaaaaaaaaa
1330 ..............
1331 ..............
1332 ..............
1333 ..............
1334 ..............
1335 Bonus:
1336 l............l
1337 ..............
1338 ..............
1339 ..............
1340 55555555555555
1341 ..............
1342 ?............?
1343 ..............
1344 55555555555555
1345 >>>>>>>>>>>>>>
1346 f............f
1347 ff..........ff
1348 >>>>>>>>>>>>>>
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Nethippy
1356 Spider
1357 Bricks:
1358 @@..........@@
1359 @............@
1360 ..............
1361 ..............
1362 .aaa......aaa.
1363 a...a....a...a
1364 .....a..a.....
1365 .aaa..cc..aaa.
1366 a...bbhhbb...a
1367 ......cc......
1368 ....bbhhbb....
1369 .aaa..hh..aaa.
1370 a...bbhhbb...a
1371 ......cc......
1372 ....bb..bb....
1373 .aaa......aaa.
1374 a............a
1375 @@..........@@
1376 Bonus:
1377 ..............
1378 ..............
1379 ..............
1380 ..............
1381 .555......555.
1382 5...5....5...5
1383 .....5..5.....
1384 .>>>..ll..>>>.
1385 >............>
1386 ......ff......
1387 ..............
1388 .>>>......>>>.
1389 >............>
1390 ..............
1391 ..............
1392 .>>>......>>>.
1393 >............>
1394 ..............
1395 Level:
1396 Nethippy
1397 O.M.F.G.
1398 Bricks:
1399 ..............
1400 .EEEEEhhEEEEE.
1401 .EgggEhhEgggE.
1402 .EgggEhhEgggE.
1403 .EiiiEhhEiiiE.
1404 .EiiiEhhEiiiE.
1405 .E...EEEE...E.
1406 .E..........E.
1407 .E..........E.
1408 .E...E..E...E.
1409 .E...E..E...E.
1410 .EzzzE..EzzzE.
1411 .EzzzE..EzzzE.
1412 .EhhhE..EhhhE.
1413 .EhhhE..EhhhE.
1414 .EdddE..EdddE.
1415 .EdddE..EdddE.
1416 .EEEEE..EEEEE.
1417 Bonus:
1418 ..............
1419 ......55......
1420 ..~f~.55.~f~..
1421 ......55......
1422 ..>>>.55.>>>..
1423 ..>>>.ll.>>>..
1424 ..............
1425 ..............
1426 ..............
1427 ..............
1428 ..............
1429 ..............
1430 ..............
1431 ..............
1432 ..............
1433 ..555....555..
1434 ..555....555..
1435 ..............
1436 Level:
1437 Nethippy
1438 Bonus Round
1439 Bricks:
1440 eeeeeeeeeeeeee
1441 iiiiiiiiiiiiii
1442 iiiiiiiiiiiiii
1443 iiiiiiiiiiiiii
1444 iiiiiiiiiiiiii
1445 gggggggggggggg
1446 gggggggggggggg
1447 gggggggggggggg
1448 gggggggggggggg
1449 dddddddddddddd
1450 dddddddddddddd
1451 dddddddddddddd
1452 dddddddddddddd
1453 hhhhhhhhhhhhhh
1454 hhhhhhhhhhhhhh
1455 hhhhhhhhhhhhhh
1456 hhhhhhhhhhhhhh
1457 hhhhhhhhhhhhhh
1458 Bonus:
1459 ljljljlljljljl
1460 55555555555555
1461 j555555555555j
1462 55555555555555
1463 55555555555555
1464 j444444444444j
1465 44444444444444
1466 44444444444444
1467 j444444444444j
1468 33333333333333
1469 33333333333333
1470 j333333333333j
1471 33333333333333
1472 22222222222222
1473 j222222222222j
1474 11111111111111
1475 11111111111111
1476 j000000000000j
1477 Level:
1478 Nethippy
1479 Boom Bang
1480 Bricks:
1481 .g...EEEE...g.
1482 .E.!******!.E.
1483 .E...*..*...E.
1484 .EEEE*..*EEEE.
1485 .E...*..*...E.
1486 .E.!**..**!.E.
1487 .E...*..*...E.
1488 .EEEE*..*EEEE.
1489 .E...*..*...E.
1490 .E.!**..**!.E.
1491 .E...*..*...E.
1492 .EEEE*..*EEEE.
1493 .E...*..*...E.
1494 .E.!**..**!.E.
1495 hE...*..*...Eh
1496 EEEEE*..*EEEEE
1497 ..............
1498 ..............
1499 Bonus:
1500 .g..........g.
1501 ...5......5...
1502 ..............
1503 ..............
1504 ..............
1505 ...5......5...
1506 ..............
1507 ..............
1508 ..............
1509 ...5......5...
1510 ..............
1511 ..............
1512 ..............
1513 ...5......5...
1514 l............l
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Nethippy
1520 Stars
1521 Bricks:
1522 ..............
1523 ..............
1524 ..E...E...E...
1525 .EgE.EeE.EdE..
1526 .ggg.eee.ddd..
1527 .EgE.EeE.EdE..
1528 ..E...E...E...
1529 ....E...E.....
1530 ...EiE.EjE....
1531 ...iii.jjj....
1532 ...EiE.EjE....
1533 ....E...E.....
1534 ......E.......
1535 .....EhE......
1536 .....hhh......
1537 .....EhE......
1538 ......E.......
1539 ..............
1540 Bonus:
1541 ..............
1542 ..............
1543 ..............
1544 ..5...5...5...
1545 .555.5l5.555..
1546 ..5...5...5...
1547 ..............
1548 ..............
1549 ....5...5.....
1550 ...555.555....
1551 ....5...5.....
1552 ..............
1553 ..............
1554 ......5.......
1555 .....555......
1556 ......5.......
1557 ..............
1558 ..............
1559 Level:
1560 Nethippy
1561 142
1562 Bricks:
1563 ..............
1564 cccccccccccccc
1565 c............c
1566 c..c.c.c.ccc.c
1567 c.cc.c.c...c.c
1568 c..c.c.c...c.c
1569 c..c.c.c.ccc.c
1570 c..c.ccc.c...c
1571 c..c...c.c...c
1572 c..c...c.c...c
1573 c.ccc..c.ccc.c
1574 c............c
1575 cccccccccccccc
1576 ..............
1577 ..............
1578 ..............
1579 ..............
1580 ..............
1581 Bonus:
1582 ..............
1583 >>>>>>>>>>>>>>
1584 >............>
1585 >..5.5.5.555.>
1586 >.55.5.5...5.>
1587 >..5.5.5...5.>
1588 >..5.5.5.555.>
1589 >..5.555.5...>
1590 >..5...5.5...>
1591 >..5...5.5...>
1592 >.555..5.555.>
1593 >............>
1594 >>>>>>>>>>>>>>
1595 ..............
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Nethippy
1602 The End
1603 Bricks:
1604 ..............
1605 ddddd.d.d.dddd
1606 d.d.d.d.d.d...
1607 ..d...ddd.ddd.
1608 ..d...d.d.d...
1609 ..d...d.d.dddd
1610 ..............
1611 dddd.d..d.ddd.
1612 d....dd.d..d.d
1613 ddd..d.dd..d.d
1614 d....d..d..d.d
1615 dddd.d..d.ddd.
1616 ..............
1617 ..............
1618 !...!...!...!.
1619 ..!...!...!...
1620 ..............
1621 vvvvvvvvvvvvvv
1622 Bonus:
1623 ..............
1624 fffff.f.f.ffff
1625 f.f.f.f.f.f...
1626 ..f...fff.fff.
1627 ..f...f.f.f...
1628 ..f...f.f.ffff
1629 ..............
1630 ffff.f..f.fff.
1631 f....ff.f..f.f
1632 fff..f.ff..f.f
1633 f....f..f..f.f
1634 ffff.f..f.fff.
1635 ..............
1636 ..............
1637 ~...~...~...~.
1638 ..~...~...~...
1639 ..............
1640 >>>>>>>>>>>>>>
0 Version: 0.10
1 Level:
2 B&Z
3 Rose for you
4 Bricks:
5 ......i.......
6 ..iii.iii.....
7 .i..ii.ii.....
8 .i..ii.ii.....
9 .iiiii.iii....
10 i.iii.iiii....
11 ii...iiii..fff
12 .iiiiiii..ff.f
13 .ii.iii.f.f.ff
14 ....ii.ff.fff.
15 ........ff....
16 ........f.....
17 ...fff..f.ff..
18 ....fff.fff...
19 .....ff.f.....
20 .......f......
21 .......f......
22 ......f.......
23 Bonus:
24 ..............
25 ..............
26 .f......f.....
27 ....!.........
28 ...+....<.....
29 ......>0p.....
30 .0...b.......?
31 ..c...1}..j-.b
32 .-...?......f.
33 ........<.....
34 ..............
35 ..............
36 ...fw...+.....
37 ..........1...
38 .....<-.0.....
39 ..............
40 ..............
41 ..............
42 Level:
43 B&Z
44 Tulip
45 Bricks:
46 ...iiii.......
47 ..i....i......
48 ..i.ii.i.i....
49 .iii..ii.ii...
50 .iii.iii.iii..
51 iiiii.i.iiii..
52 iiiii..iiiii..
53 iiii.iiiiiii..
54 iii.iiiiiiii..
55 .ii.iiiiiiii..
56 ..iiiiiiiii...
57 f..i.iiiii....
58 .f....f......f
59 .fff...f...fff
60 .f.ff..f..ffff
61 .ff.ff.f.ffff.
62 ..ff.f.f.fff..
63 ...ffffff.....
64 Bonus:
65 ....?.........
66 ..............
67 .....-.f......
68 ..0...........
69 ......j..>....
70 .~+c......W...
71 ..}.....*+f...
72 0->...&2..0...
73 .......+.~....
74 .?..~-..-.c...
75 ..f...>..?....
76 ..............
77 ..............
78 .-W.........{.
79 ...+...!...>..
80 ..2.~....~f-..
81 ...f...0......
82 .....>........
83 Level:
84 B&Z
85 Red Rose
86 Bricks:
87 .......ddd....
88 ......ddddd...
89 ....ddd.ddd...
90 ...d..dd.d.dd.
91 ..d...ddd.dddd
92 ..dddd.dd.dddd
93 ..ddddddd.dddd
94 ..dddddddd.ddd
95 .d.dddddd.dd..
96 ddd.ddd..dddd.
97 ddd....dddd..f
98 .dddddddddddf.
99 ..dddd.ddddff.
100 ...dd...ffff.f
101 .......f.fff..
102 ......f.f.fff.
103 .......f...fff
104 ............ff
105 Bonus:
106 ..............
107 ........>.....
108 ....3.!..g&...
109 ...........b..
110 .......p-...?.
111 ..~.......->.0
112 ...~s..s....~.
113 ...<*b>.3.....
114 ....3..w......
115 0-...?....j...
116 ..>...........
117 .~.....>&!<...
118 ...?-...~?..0.
119 ..........-...
120 ..........&>..
121 ......c.......
122 ............w.
123 ..............
124 Level:
125 B&Z
126 Vine Leaf
127 Bricks:
128 .fff.f..f.....
129 .f.fff.fff..f.
130 .ff.ff.fff.f..
131 ffff.f.fff....
132 .ffffffff..ff.
133 .....ffffffff.
134 .fffff.ffffff.
135 fffff.fff.....
136 ffff.fffffff..
137 .ff.ff.ff.ff..
138 ff.fff.fff.f..
139 ffffff.fffff..
140 fff.f....fff..
141 ......ff.....f
142 .....f..f...f.
143 .....f......f.
144 ......f...ff..
145 .......fff....
146 Bonus:
147 .0......W.....
148 ...>.+.>f...-.
149 .-..~..}5c....
150 ...f.1.+-.....
151 .?g.c.j....&<.
152 .....w.>s.?+..
153 .<b5?..+.3..0.
154 .+.2!.c.~.....
155 &cl}.<&.b.?>..
156 .s.....1...f..
157 ....sf..>c....
158 0-<4c....b}-..
159 .w..>.........
160 ..............
161 .....>..-.....
162 ..............
163 ...........+..
164 .......+.>....
165 Level:
166 B&Z
167 Margarite
168 Bricks:
169 ..............
170 ......f.......
171 f......f......
172 ff.....f......
173 .ff.hhh.f.....
174 ...hhhhh.hhh..
175 ...hhhhh.hhhh.
176 .hh.hhhhhhhhh.
177 hhhhh....hhhh.
178 hhhh..ee..h...
179 hhhh.e..e.hhh.
180 .hhh.e..e.hhhh
181 ...h..ee..hhhh
182 .hhhh....hhhhh
183 .hhhhhhhhh.hh.
184 .hhhh.hhhhh...
185 ..hhh.hhhhh...
186 .......hhh....
187 Bonus:
188 ..............
189 ......p.......
190 ?.............
191 .-............
192 ....3...-.....
193 ...<.!g..>.+..
194 .....0cb..0...
195 .0..+>.....<?.
196 ..<.......-...
197 .+.f...0......
198 ..0..s....&...
199 .b.-....&.s0<.
200 ......j...<.+.
201 ..?&.......c..
202 .3.0...<.3....
203 ..+.<.?+-.....
204 .......>.f....
205 ..............
0 Version: 0.50
1 Level:
2 B&Z
3 R. Labyrinth
4 Bricks:
5 dddddddddddddd
6 dddddddddddddd
7 d###d#########
8 d#d#d#ddddddd#
9 d#d#d#ddddddd#
10 d#d#d#ddddddd#
11 d#d#d#d#ddddd#
12 d#d#d#d#ddddd#
13 d#d#d#d#dd####
14 d#d#d#d#dd#ddd
15 d#d###d#dd#ddd
16 d#ddddd#dd#ddd
17 d#ddddd#dd#ddd
18 d#######dd##dd
19 dddddddddddddd
20 ..............
21 ..............
22 ..............
23 Bonus:
24 wbb?bwbbbb?b+b
25 bbbb+bb+bbbbbb
26 b100b1311b1131
27 b1b0b1bbbbbbb1
28 b1b0b1bwbb-bb1
29 b1b0b1bbbwbbw1
30 w1b0+1b0bbbbb1
31 b1b0b1b0b?bbb1
32 b1-0b1b0bb1111
33 b1b0b1b0bb1bbb
34 b1b000b0b+3b?b
35 b1bmwmb0-b0bbb
36 -1bmmmb0bb0-+b
37 w1111111ww00ww
38 fww0-+w0+0w-00
39 ..............
40 ..............
41 ..............
42 Level:
43 B&Z
44 R. Labyrinth2
45 Bricks:
46 dEEEEEdddddddE
47 dEdddEdddddddE
48 dEdddEdEEEEEdE
49 dEdEdEdEdddEdE
50 dEdEdEdEdddEdE
51 dEdEdEdEEEdEdE
52 dEdEdEdddEdEdE
53 dEdEdEdddEdEdE
54 dEdEdEEEEEdEdE
55 dEdEdEdddddddE
56 dEdEdEdddddddE
57 dEdEdEdEdEEEEE
58 dEdEdEdEdEdddd
59 dEdEdddEdEdddd
60 dEdEdddEdEdddd
61 dEEEEEEEdEdddd
62 ..............
63 ..............
64 Bonus:
65 0.......bbb.~.
66 0.bbb.w~bbbfw.
67 ..bbb.w.....w.
68 ......m.bbb.!.
69 ..~.w.m.bbb.f.
70 ....w.....b...
71 ..m...f~..b.m.
72 ..m.b.....b.b.
73 ..m.b.....b.m.
74 ..f.b.bbwbbbb.
75 ......mbmbmbm.
76 ........w.....
77 ..!...!.b.....
78 ..b.m...w..00.
79 ..b.mf..m..00.
80 ........w.....
81 ..............
82 ..............
83 Level:
84 B&Z
85 The Trap
86 Bricks:
87 ..............
88 ..............
89 .EEEE@@@@EEEE.
90 .EigigegegigE.
91 .EgigegegigiE.
92 .EigigegegigE.
93 .Egkg@**@kgkE.
94 .Ekgk@eg@gkgE.
95 .@gkg@ge@kgk@.
96 .Ekgk@@@@gkgE.
97 .EgjgdgdgjgjE.
98 .EjgjgdgdgjgE.
99 .EgjgdgdgjgjE.
100 .EjgjgdgdgjgE.
101 .EEEE@..@EEEE.
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..bbbW..?bbb..
110 ..bbb.?..bjb..
111 ..bbb...!bbb..
112 ..bbb....bbb..
113 ..bbb.mm.bbb..
114 ..bbb.mm.bbb..
115 ..bfb....bfb..
116 ..bbb...}bbb..
117 ..bbb{4.>b+b..
118 ..bbbwp.wbbb..
119 ..bbbwwwwbbb..
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 B&Z
126 Bucket
127 Bricks:
128 ......@EEEEEEE
129 .......E@.....
130 .......E......
131 .......E......
132 .EEEE..E....E.
133 .E@gEggEggggE.
134 .EggEggEggggE.
135 .EggEggEggggE.
136 .EggEggEggggE.
137 .EgggggEggggE.
138 .EgggggEggggE.
139 .EggggggggggE.
140 .EggggggggggE.
141 .EggggggggggE.
142 .Eggggggggg@E.
143 .Eggg@@gggggE.
144 .E@gg@@gggggE.
145 .EEEEEEEEEEEE.
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ...........w..
153 ...-.?b.bb....
154 ..?b..b..bbb..
155 ..bb.>b.?.b?..
156 ..bbb.b.-bbb..
157 ..bfbbb.bbbb..
158 ..bc.b.bb.bb..
159 ..b..gbb.>bb..
160 ..b.>.?.c.b...
161 ..bbbbbb.bb...
162 ..-bb..bbbbf..
163 ...w...m.?bb..
164 ..............
165 Level:
166 B&Z
167 Visualization
168 Bricks:
169 ##############
170 #f##e#dd#e##f#
171 #f##e#dd#e##f#
172 #f##e#dd#e##f#
173 #f##e#dd#e##f#
174 #f##e#dd#e##f#
175 #f##e#dd#e##f#
176 #f##e#dd#e##f#
177 #f##e#dd#e##f#
178 #f##e#dd#e##f#
179 #f##e#dd#e##f#
180 #f##e#dd#e##f#
181 ######dd######
182 fffee#ddeeefff
183 fffee#ddeeefff
184 fffee#ddeeefff
185 ###########...
186 ..............
187 Bonus:
188 ..............
189 .b..b.bb.b..b.
190 .b..b.bb.b..b.
191 .b..b.bb.b..b.
192 .b..b.bb.b..b.
193 .b..b.bb.b..b.
194 .b..b.mm.b..b.
195 .b..b.bb.b..b.
196 .b..b.bb.b..b.
197 .b..b.bb.b..b.
198 .b..b.bb.b..b.
199 .b..b.bb.b..b.
200 ......bb......
201 bWlbb.cjbwW..w
202 !bb&p.b+b.bwb.
203 bfbbb.bb~.w..w
204 ..............
205 ..............
206 Level:
207 B&Z
208 Temple
209 Bricks:
210 ......aa......
211 ......aa......
212 ......EE......
213 ......gg......
214 .....EEEE.....
215 ....gggggg....
216 ....EEEEEE....
217 ...gggggggg...
218 ...EEEEEEEE...
219 ..gggggggggg..
220 ..EEEEEEEEEE..
221 .gggggggggggg.
222 .EEEEEEEEEEEE.
223 gggggggggggggg
224 ##############
225 aaaaaaaaaaaaaa
226 aaaaaaaaaaaaaa
227 aaaaaaaaaaaaaa
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ......wf......
233 ..............
234 ....bbbbbb....
235 ..............
236 ...bbwb-bbb...
237 ..............
238 ..bbbbjbbbbb..
239 ..............
240 .bbb+bbbwbbbb.
241 ..............
242 bbfbbbbbbbbbbb
243 0000000>000000
244 bbcbbbwbbbbbbb
245 bmbmbmbmbmbmbm
246 wbbwbbwbwbbbbw
247 Level:
248 B&Z
249 Cross
250 Bricks:
251 a.a.a.aa.a.a.a
252 .@.E.@aa@.E.@.
253 a.a.a.aa.a.a.a
254 ......@#......
255 ......#@......
256 EEEE..E#..EEEE
257 ......#E......
258 ..a...@#...a..
259 .aca.a#@a.aca.
260 acacacE#cacaca
261 .aca.a#Ea.aca.
262 ..a...@#...a..
263 ......#@......
264 ......E#......
265 zzzzzz#Ezzzzzz
266 zzzzzz@#zzzzzz
267 ......#@......
268 ......E#......
269 Bonus:
270 b.b.b.bb.b.b.b
271 ......bb......
272 b.b.b.bb.b.b.b
273 ......5.......
274 ......&5......
275 .......&......
276 ......+.......
277 ..m...c+...m..
278 .bbb.b+cb.bbb.
279 mbbbmb.+bmbbbm
280 .wbb.b>.b.bbw.
281 ..w...>>...w..
282 ......>>......
283 .......>......
284 bbbbbb155bbbbb
285 wmpmpj11mmpmpw
286 ......11......
287 .......1......
288 Level:
289 B&Z
290 Therm
291 Bricks:
292 aaaaaaaaaaaaaa
293 aEEEaEEEEaEEEa
294 aEdEaEEdEaEdEa
295 aEdEaEddEaEdEa
296 aEdEaEddEaEdEa
297 aEdEaEddEaEdEa
298 aEdEaEddEaEdEa
299 aEdEaEddEaEdEa
300 aEdEaEdEEaEdEa
301 aEdEaEddEaEdEa
302 aEdEaEddEaEdEa
303 aEdEaEddEaEdEa
304 aEdEaEEdEaEdEa
305 aEdEaEddEaEdEa
306 aEdEaEddEaEdEa
307 aEdEaEddEaEdEa
308 aEdEaEddEaEdEa
309 aEdEaEdEEaEdEa
310 Bonus:
311 bbbbbbbbbbbbbb
312 b...b....b...b
313 b.b.1..p.1.b.b
314 b.b.1....1.b.b
315 b.b.f.p..1.b.b
316 b.b...>}.?.b.b
317 b.b.?.?..+.b.b
318 b.b....m...b.b
319 m.b.}....c.b.?
320 ?.b.>....>.b.m
321 1.b.p.l..1.b.+
322 +.b.p....1.b.f
323 f.b.+..?.m.b.?
324 ?.b.m....?.b.1
325 1.b.1.?c.p.b.1
326 w.b.?..>.p.b.w
327 w.b.}.mm...b.w
328 w.b...m..}.b.w
329 Level:
330 B&Z
331 Random
332 Bricks:
333 Exekgkgxekejxg
334 *Ejfejkgj*ik*!
335 h*Ehi!h!hddhd*
336 gkkEdjfgeh*gdh
337 !gjdEd*kfg!xfa
338 fjkikEai*iaga*
339 ieEkjkEejaiaf*
340 *feEdgeEkfg*ha
341 Eei*EdfxEd*ddg
342 jE*c!EeixEe*j*
343 x*Ei*dExg*Ekkd
344 g!fdj!eEdxdE*k
345 dh!hxhf!Edg*Ek
346 f*gejEjgeEkeEj
347 i*dh!iEe*i*iEa
348 hfj*gkfEkegaEg
349 *j*iajgaEfafEa
350 ..............
351 Bonus:
352 ...mw..wwm.?bb
353 ..g.bbbbbbbbbb
354 -....bmww....b
355 -bg..-bm.b.wb.
356 .bw....b?b..b-
357 .b.m...bbb.-b.
358 wb..w...gbm.b.
359 bb...cc..bm.b-
360 bbmw........b.
361 b..w..c.....bb
362 b..m.........b
363 wg*.wmm......b
364 b4.b..m..c...b
365 bw.bb..mm.w..b
366 b.w4b...m..m.b
367 bb4.bbb..wmm.b
368 wb.wbwwb...m..
369 ..............
370 Level:
371 B&Z
372 Bobble Bobble
373 Bricks:
374 fzzzzzzzzzzzzf
375 fEzzzzzzzzzzEf
376 fEzzzzzzzzzzEf
377 fEzEzzzzzzEzEf
378 fEzzzzzzzzzzEf
379 fEzzzzzzzzzzEf
380 fEzEzzzzzzEzEf
381 fEzzzzzzzzzzEf
382 fEzzzzzzzzzzEf
383 fEzEzzzzzzEzEf
384 fezzzzzzzzzzef
385 fezzzzzzzzzzef
386 feEEEEEEEEEEef
387 feeeeeeeeeeeef
388 feeeeeeeeeeeef
389 EEEaaaaaaaaEEE
390 fffaaaaaaaafff
391 fffaaaaaaaafff
392 Bonus:
393 -c-ccc?ccc?ccc
394 ....-...&..f..
395 f.......f....f
396 ....4bbbb4....
397 ...-4bbbb4.}.m
398 &.g.4bbbb-....
399 ....4bbbb4...f
400 f.}.fbbbb4.m..
401 .....bbbbf...g
402 ..0..bbbb....c
403 ..&.-.&.&0.0..
404 &..0...f..s..c
405 .g............
406 mmmmmmmmmmmmmm
407 bbbbbbbbbbbbbb
408 ...>>>>>>>>...
409 bbbbbbbbbbbbbb
410 wwwwwwwwwwwwww
411 Level:
412 B&Z
413 Fly invisibly
414 Bricks:
415 vvvvvvvvvvvvvv
416 vvvvvvvvvvvvvv
417 vvvvvvvvvvvvvv
418 vvvvvvvvvvvvvv
419 vvvvvvvvvvvvvv
420 vvvvvvvvvvvvvv
421 vvvvvvvvvvvvvv
422 vvvvvvvvvvvvvv
423 vvvvvvvvvvvvvv
424 vvvvvvvvvvvvvv
425 vvvvvvvvvvvvvv
426 vvvvvvvvvvvvvv
427 vvvvvvvvvvvvvv
428 vvvvvvvvvvvvvv
429 vvvvvvvvvvvvvv
430 vvvvvvvvvvvvvv
431 vvvvvvvvvvvvvv
432 vvvvvvvvvvvvvv
433 Bonus:
434 ..............
435 ...........<..
436 ...~..........
437 ..............
438 .f.....f......
439 ...c......c.~.
440 .....}..<.....
441 ...........}..
442 .<............
443 bbbbbbbcbbbbbb
444 bbbb~bbbb~bbbb
445 bbbbbbbbbbbbbb
446 bbb}b&bbb}bfbb
447 bfbbbbbbbbbbbb
448 bbbbbbbbbbbbbb
449 bbbbbbbbbbbbbb
450 bbbbbbbbbbbbbb
451 www.4....g4.ww
452 Level:
453 B&Z
454 FLy BoOom
455 Bricks:
456 ajdjjjjjdjajdj
457 a*ddjaajjdja*d
458 ddajdjjajdjaaj
459 jdaajdjjajjjaj
460 ajdajjdjajdjja
461 ajjdajjdjaadja
462 dajjdajddjajdj
463 ddajjjajjdjadd
464 j*jajdaajddj*d
465 jjdajjdjajddaa
466 ajjdajjjajjdda
467 aajjaajdjjjjda
468 aajjjajjdjajdd
469 daajjdaadjjajj
470 d*aajjdaaddj*j
471 dddaajddaaddja
472 jddjjjjdjjjjdd
473 jjjddjjjjjjjjj
474 Bonus:
475 .......f......
476 ...0.<........
477 ...........~..
478 ...!.....b....
479 .<...f.~..w.b.
480 ..~...........
481 .......b....>.
482 ...b.{...1....
483 ....w...!.....
484 &...s.....s...
485 ..............
486 p.s.d.....b.!.
487 ....>..b......
488 ...s..f.......
489 ..............
490 ..............
491 *.*..*.*.*..*.
492 .....w........
493 Level:
494 B&Z
495 Fly architect
496 Bricks:
497 @@@EEEE@@@@...
498 @@@E@eE@@.....
499 EEEEeeE@@.....
500 EeeeeeE@@.....
501 EeeeeeEEE..EE.
502 EeeeeeEeeeeeE.
503 EeeeeeEeeeeeE.
504 EeeeeeEeeeeeE.
505 EeeeeeeeeeeeE.
506 EeeeeeeeeeeeE.
507 EeeeeEEEeeeeE.
508 E@eeeE.EeeeeE.
509 EEeeEE.EeeeeE.
510 #eee#..EeeeeE.
511 #eee#..EeeeeE.
512 #eee#..EeeeeE.
513 #eee#..EeeeeE.
514 #####..EEEEEE.
515 Bonus:
516 ..............
517 .....5........
518 ..............
519 ..............
520 ..............
521 .?..?....wwb..
522 ...m.....bbb..
523 .......>.wwb..
524 ....?....bb>..
525 ..?m.g.>.wwb..
526 .........bbb..
527 .........bbb..
528 .........bbb..
529 ..............
530 ..............
531 ..............
532 ..............
533 ..............
534 Level:
535 B&Z
536 Fly
537 Bricks:
538 ..aaaaaaaaaa..
539 ..aEaaaaaaEa..
540 ..EdEaaaaEdE..
541 ..EdEEaaEEdE..
542 ..EeEdEEdEeE..
543 ..EeEdEEdEeE..
544 ..EeeeEEeeeE..
545 ..EeeeEEeeeE..
546 ..EeeeEEeeeE..
547 ..EaaaEEaaaE..
548 ..EaaaEEaaaE..
549 ..EaEaEEaEaE..
550 ..EeeeEEeeeE..
551 ..EeeeEEeeeE..
552 ..............
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ..bbbb000bbb..
558 ..b.<bc00b.b..
559 ...b.b00b.b...
560 ...b..bb..b...
561 ...<.b..b.b...
562 ...b.b..b.b...
563 ...bbb..bbb...
564 ...b?b..bbb...
565 ...bbb..bbb...
566 ...bbb..?00...
567 ...bbj..<s?...
568 ...b.b..0.0...
569 ...b>b..w>w...
570 ...bbb..www...
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 B&Z
577 ButterFly
578 Bricks:
579 ..............
580 vvvvvvvvvvvvvv
581 eev#vvvvvv#vee
582 veev#vvvv#veev
583 vehev#vv#vehev
584 ve!ievEEvei!ev
585 vehfieEEeifhev
586 vveifdEEdfievv
587 vvveidEEdievvv
588 vvvefhEEhfevvv
589 vvefidEEdifevv
590 vehi!eEEe!ihev
591 veheevEEveehev
592 veevvvvvvvveev
593 evvvvvvvvvvvve
594 vvvvvvvvvvvvvv
595 ..............
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ?............?
601 ..............
602 ..?0..lg..0?..
603 ...0......0...
604 ..?..W..W..?..
605 .....5..5.....
606 ...~......~...
607 w...<?..?<...w
608 b..2<....2...b
609 w.c..-..-..c.w
610 b............b
611 w............w
612 +>b>b>b>b>b>b+
613 wbwbwbwbwbwbwb
614 ..............
615 ..............
616 Level:
617 B&Z
618 Snake
619 Bricks:
620 EEEEEEEEEEEEEE
621 E!EfdfEEdfdE!E
622 EdEdfdEEfdfEfE
623 EfEfEfEEdEdEdE
624 EdEdEdEEfEfEfE
625 EfEfEfEEdEdEdE
626 EdEdEdEEfEfEfE
627 EfEfEfEEdEdEdE
628 EdEdEdEEfEfEfE
629 EfEfEfEEdEdEdE
630 EdEdEdEEfEfEfE
631 EfEfEfdfdEdEdE
632 EdEdEdfdfEfEfE
633 EfEfEfdfdEdEdE
634 EdEdEdfdfEfEfE
635 EfdfEfdfdEdfdE
636 EdfdEdfdfEfdfE
637 EEEEEfdfdEEEEE
638 Bonus:
639 ..............
640 ..............
641 ..........~...
642 .....?..>.....
643 ...}..........
644 .?...>......?.
645 ........~.j...
646 .>.j....g...>.
647 ..........>...
648 ...f....?.....
649 .l..........}.
650 .....bbbb.f...
651 ...>.bbbb.....
652 .....wbwb.....
653 .....bwbw.....
654 .....wbwb.....
655 .cm..bwbw..mc.
656 .....wbwb.....
657 Level:
658 B&Z
659 Sad Clown
660 Bricks:
661 EeeeeeeeeeeeeE
662 EEeeEEeeEEeeEE
663 e@ee@eeee@ee@e
664 e@**@eeee@**@e
665 e@gg@eeee@gg@e
666 e@**@eeee@**@e
667 e@@@@e@@e@@@@e
668 eeeeee@@eeeeee
669 eeaeee@@eeeaee
670 eeeeeeeeeeeeee
671 eeae@dddd@eaee
672 eeee@****@eeee
673 eeae@dddd@eaee
674 eeee@****@eeee
675 eeee@@@@@@eeee
676 ..............
677 ..............
678 ..............
679 Bonus:
680 .bbbb.??.bbbb.
681 ..............
682 b............b
683 b............b
684 b.mm..cc..mm.b
685 b....wwww....b
686 b....w..w....b
687 b..b......b..b
688 b.db-....-bd.b
689 bj.b......b.jb
690 b.}b......bc.b
691 b..b......b..b
692 b.Wb......b!.b
693 b..b......b..b
694 wwww......wwww
695 ..............
696 ..............
697 ..............
698 Level:
699 B&Z
700 Barbarian
701 Bricks:
702 eeeedxxxxdeeee
703 eddEdxxxxdEdde
704 eddEdxxxxdEdde
705 eddEdxxxxdEdde
706 eEEEdxxxxdEEEe
707 dddddEEEEddddd
708 xxxxxEddExxxxx
709 xxxxxEddExxxxx
710 xxxxxEddExxxxx
711 xxxxggggggxxxx
712 xEEEgeggegEEEx
713 xEddgeeeegddEx
714 xEddgeeeegddEx
715 xEddgeeeegddEx
716 xEddgEEEEgddEx
717 ..............
718 ..............
719 ..............
720 Bonus:
721 w.....ww.....w
722 ..............
723 ..............
724 ..............
725 ..............
726 ..w........w..
727 bbbbb....bbbbb
728 b...b....b...b
729 b...b....b...b
730 bbbbb....bbbbb
731 b...b....b...b
732 b.bbb....bbb.b
733 b.bbb....bbb.b
734 b.bbb....bbb.b
735 w.bwb....bwb.w
736 ..............
737 ..............
738 ..............
739 Level:
740 B&Z
741 Barbarian2
742 Bricks:
743 aaaaaaaaaaaaaa
744 aaaaaaaaaaaaaa
745 aEEEEEEEEEEEEa
746 aEddddEEddddEa
747 aEddddEEddddEa
748 aEiiidEEdiiiEa
749 aEidEEEEEEdiEa
750 aEddEdEEdEddEa
751 aEdeeeEEeeedEa
752 aEdegeEEegedEa
753 aEdeeeEEeeedEa
754 aEddddEEddddEa
755 aEEEEddddEEEEa
756 aaaaddddddaaaa
757 aaaaEEEEEEaaaa
758 aaaadeiiedaaaa
759 aaaaEEEEEEaaaa
760 aaaaaddddaaaaa
761 Bonus:
762 b..c+....c...b
763 ......j.......
764 b............b
765 ..............
766 b...+........b
767 +....m..m.....
768 b............b
769 .............c
770 b.........c..b
771 ...+.........+
772 b........c.+..
773 ..c..........b
774 b.............
775 cb.b.b.b.b.b.b
776 b.bc......b.b.
777 .b.b.b.b.bcb.b
778 bcb.......b.b.
779 wbwbwbwbwbwbwb
780 Level:
781 B&Z
782 Invisible2
783 Bricks:
784 EEE@@@@@@@@EEE
785 EEEvvvvvvvvEEE
786 EEvvvvvvvvvvEE
787 EEvvEE@@EEvvEE
788 EvvvvvvvvvvvvE
789 EvvvEvvvvEvvvE
790 vvvEEvEEvEEvvv
791 vvEEvvvvvvEEvv
792 @vEvv@vv@vvEv@
793 @vEvv@vv@vvEv@
794 vvEEvvvvvvEEvv
795 vvvEEvEEvEEvvv
796 EvvvEvvvvEvvvE
797 EvvvvvvvvvvvvE
798 EEvvEE@@EEvvEE
799 EEvvvvvvvvvvEE
800 EEEvvvvvvvvEEE
801 EEEvE@@@@EvEEE
802 Bonus:
803 ..............
804 ......cc......
805 ..............
806 ..............
807 ..f........f..
808 ..............
809 c............c
810 c............c
811 ......>>......
812 ......>>......
813 bb..bbbbbb..bb
814 bbb..b..b..bbb
815 .bbb.bbbb.bbb.
816 .mmbbbbbbbbmm.
817 ..mm......mm..
818 ..bbbbbbbbbb..
819 ...wwbbbbww...
820 ...w......w...
0 Level:
1 Corrado
2 Corrado[2]
3 Bricks:
4 ....dddddddd..
5 ...d..ddd..d..
6 ..d....d....d.
7 ..d....d....d.
8 ..d.........d.
9 ..d.........d.
10 ..d.........d.
11 ...d.......dd.
12 ...d.......d..
13 ...d.......d..
14 ...d.......d..
15 ....d.....dd..
16 ....d.....dd..
17 .....d....d...
18 .....d....d...
19 .....dd..d....
20 ......dd.d....
21 .......dd.....
22 Bonus:
23 ..............
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Corrado
43 Corrado[2]
44 Bricks:
45 ...f#y....#x..
46 ...f#yd...#x..
47 v.gf#y....#xd.
48 v.gf#yd...#xd.
49 vigf#y#.a.#xde
50 .igf#yd.a.#xde
51 .igf#*d.a.#xde
52 .igf#.d.a.#xde
53 .igf#.d.a.#xde
54 .igf#...a.#xde
55 .ig.#...a.#*de
56 .ig.#.....#vde
57 .i..#.....#.ve
58 .i..#.!.!.#.*e
59 ....#..!..#..v
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ...{..........
65 ...b.b........
66 ..f..p........
67 .....b........
68 ...m.......w..
69 ..............
70 ............>m
71 ..bb..........
72 .{bb..-.l..<<.
73 ........-....p
74 ........-....p
75 .bg........d+.
76 ..............
77 .+....4.4.....
78 .......4.....+
79 ..............
80 ..............
81 ..............
82 Level:
83 Freek
84 Corrado[1]
85 Bricks:
86 bbbbbb........
87 bbbbb...a.....
88 bbbb...aaa....
89 iii.....a.....
90 ii..........dd
91 i..ddd....!aaa
92 ..jjjd...!@@@@
93 .hhhjd..!@@@@@
94 ...hjd..@@@@@@
95 ....jd.....ggi
96 aax..d.....ggi
97 *####......ggi
98 #####......ggi
99 ......v..v.ggi
100 ...........ggi
101 ..............
102 ..............
103 ..............
104 Bonus:
105 d.55..........
106 .mg.....?.....
107 .......???....
108 pp......?.....
109 .............d
110 .....l.....??.
111 ..............
112 ....m.........
113 .....>........
114 .............w
115 W..........*..
116 ..............
117 ............?.
118 ......>..f...<
119 ...........l..
120 ..............
121 ..............
122 ..............
123 Level:
124 Freek
125 Corrado[3]
126 Bricks:
127 ffff........e.
128 .ffff....dddee
129 ..ffff....ddee
130 ..aaaaa...ddee
131 ...aaa....ddee
132 !..##.....d..e
133 .!............
134 ..!......!@@@@
135 ....aaaaa..d*.
136 .....bbbbbzd..
137 ###*..yyyyz@..
138 !#...**...z@.*
139 *#.vEEEE!vz@..
140 .#..........*.
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 .g.b........*.
147 ..w.?....b.w..
148 ....??........
149 ..mm......f...
150 ..............
151 .............m
152 ..............
153 ..p...........
154 ....c..j......
155 .....++.l.....
156 .........W....
157 ..........!...
158 .........!w...
159 ............-.
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Freek
166 untitled
167 Bricks:
168 fffff....fffff
169 dddd*...g.....
170 dddd...g..z.z.
171 dddd..g...zzz*
172 .....g......*.
173 ....g.........
174 ...kkkk*!!....
175 ..bbbbbbb!!...
176 aaaaaaaaaa!!..
177 ..............
178 ......dddd....
179 @@@j.xxxxxx.j.
180 ...jjjjjjjjjj.
181 ..............
182 ..............
183 ....v....hh.h.
184 ..............
185 ..............
186 Bonus:
187 p.p......&&b..
188 .w>>..........
189 ..>>...d....d.
190 mcc...........
191 .....b........
192 ..............
193 ...2233445....
194 ..11.-j.jb....
195 00-..j.g-.....
196 ..............
197 ..............
198 .....f..~.f...
199 ....l..}....~.
200 ..............
201 ..............
202 ....<....+....
203 ..............
204 ..............
205 Level:
206 Corrado
207 Corrado[4]
208 Bricks:
209 jjjjj.........
210 j***.yyyxx**..
211 jjjj.yxxxx....
212 jjfffyyyyycccc
213 jjfz.###..!!!c
214 hhh.dddd..cccc
215 hhhh..zd.ccccc
216 hhhhh.....eee.
217 hvvv.......ze.
218 hhh.EEEEEE....
219 ..........ii..
220 ...bbbbb.iii..
221 ....bbbb..zi..
222 .........**i..
223 a.....dddd*...
224 **aa.....**...
225 ..............
226 ..............
227 Bonus:
228 m...*.........
229 .....?b.3b.j..
230 .?3...........
231 ....+.dl..b.m.
232 ?.!W.........1
233 ...........1..
234 pm.+..........
235 ...........--.
236 ...........-..
237 m.m...........
238 ...........w..
239 .....f.!..?...
240 ....}.w.......
241 ...........s..
242 ......<..+....
243 ..}......+....
244 ..............
245 ..............
246 Level:
247 Freek
248 untitled
249 Bricks:
250 ffffffffffffff
251 gggggggggggggg
252 hhhhhhhhhhhhhh
253 #####.*#######
254 ....#vd#......
255 ccc!#..#xxxxxx
256 !ccc#..#xxEE..
257 ccc.#dv#......
258 ccc.#..#......
259 ....#.d#!!....
260 kkkk....yyyyyy
261 kkkk.v..yyyyyy
262 ....aaaa......
263 ee.xxxxxx.dddd
264 ..............
265 ..............
266 ..............
267 ..............
268 Bonus:
269 .m...??..m...b
270 ...........m..
271 *}.!.g..f.b...
272 ..............
273 ......p.......
274 j+pb.....+.-.p
275 j4.d..........
276 .44..?........
277 d.............
278 ......?.......
279 .-.~....f.c.>>
280 ..{.....c..-..
281 ..............
282 -..<<...s...w.
283 ..............
284 ..............
285 ..............
286 ..............
287 Level:
288 Freek
289 untitled
290 Bricks:
291 !v.!.....!kkdd
292 ....vkkkkkkkdd
293 ycc..kkkkkkkdd
294 ggigggggkkkkdd
295 fhiiiiiiikkkdd
296 fhhhhhhhikkkdd
297 fffffffhhhkkdd
298 ffffffffhhkkdd
299 aaaaaaffhhkkdd
300 aaaaaafffffkdd
301 aaaaaafffffkdd
302 aaaavyyyfffkdd
303 aaa...!.fffkdd
304 ##...@@@kkkk##
305 ..............
306 ..............
307 ..............
308 ..............
309 Bonus:
310 ...........-~.
311 ....2.+.......
312 m......?.?..m.
313 .~.d.f..p.+..4
314 2...?.p..2.l4.
315 ..p.........+.
316 -4.-.b~+2.?...
317 ...W.......b.p
318 +..c<..d.f<.W.
319 .W...2.W.4....
320 .4b........-.c
321 ...?.....c....
322 ..<.....-.....
323 ..........w...
324 ..............
325 ..............
326 ..............
327 ..............
328 Level:
329 Freek
330 untitled
331 Bricks:
332 *!*hhggv!.....
333 e!*hhgg*!.....
334 e!*hhgg*!.....
335 @@@@@@@@@@vvvv
336 kkkkkkkkkkkkkk
337 yyykkkkkkkkkkk
338 hhhhhhhhhhhhhh
339 hhhhhhhhhhhhhh
340 hhhhhhhhhhhhhh
341 *........*kkkk
342 *!..!zzkkkkkkk
343 EEiiizzz....EE
344 iiizziiiiiiiii
345 iiiiiiiiiiiiii
346 jjjjjjjjjjjjjj
347 jjj........jjj
348 ..............
349 ..............
350 Bonus:
351 .-.m..........
352 .....-........
353 ..............
354 ..............
355 ....f.........
356 .m.5........f.
357 ...55.-.22.-.>
358 ..*..*...2...>
359 ..............
360 ............m.
361 .........l....
362 ..jj.ddd......
363 .??...>g<.l.<.
364 ..?...........
365 bb..p.-WW}..++
366 bbw........Wbb
367 ..............
368 ..............
369 Level:
370 Freek
371 untitled
372 Bricks:
373 ..............
374 ..............
375 ...!.a...aa...
376 aa...#a..##...
377 ##....#.......
378 ...a....a.....
379 ..a#a.!.#a....
380 ii#.#....#a...
381 iiiiii....#eee
382 iiiiii.ieeeeee
383 gggggiiieeeeee
384 gggggii.eeeeee
385 gggggii....**e
386 *gggg.!v!.*...
387 g*ggg.........
388 ggggg.........
389 ..............
390 ..............
391 Bonus:
392 ..............
393 ..............
394 .....f...W~...
395 f>....>.......
396 ..............
397 ...~....W.....
398 ..~.>....f....
399 .-........c...
400 ?p.?2-........
401 .-..2.......m.
402 555.2l1.0000..
403 ......1.j.....
404 ..w.?.1.......
405 ..............
406 ..<w..........
407 ++.<..........
408 ..............
409 ..............
410 Level:
411 Freek
412 untitled
413 Bricks:
414 ..............
415 ddd...........
416 ddd.hhhhhhhh..
417 ddd.########..
418 ..............
419 ........v.....
420 !!!...........
421 !*aa.!.jjjjjj.
422 !EEE...xxx###.
423 .......xxx....
424 ....iii.......
425 ggg.iii.zzzzzz
426 ggg.@@@v.zzzz*
427 ggg..........!
428 *gg...........
429 ..............
430 ..............
431 ..............
432 Bonus:
433 ..............
434 Wbb...........
435 .....?--.b....
436 **............
437 ..............
438 ..............
439 ~.............
440 ..5m...44.j.l.
441 .......m......
442 ..............
443 ....???.......
444 W.W.fff.!..w..
445 111....}.++.d.
446 .dw...........
447 ..............
448 ..............
449 ..............
450 ..............
451 Level:
452 Freek
453 untitled
454 Bricks:
455 **************
456 **************
457 **************
458 **************
459 **************
460 **************
461 ***dddddddd***
462 ***d.dddd.d***
463 ***@@@@@@@@***
464 ******@@******
465 **************
466 **************
467 **************
468 zzzzzzzzzzzzzz
469 ..............
470 ..............
471 ..............
472 ..............
473 Bonus:
474 **************
475 **************
476 *............*
477 *............*
478 *............*
479 *............*
480 *..55555555..*
481 *..5.****.5..*
482 *............*
483 *............*
484 *............*
485 *............*
486 *............*
487 ..............
488 ..............
489 ..............
490 ..............
491 ..............
492 Level:
493 Freek
494 untitled
495 Bricks:
496 *kkg*@........
497 i*f*f@........
498 kd*d*@........
499 g*i*i@........
500 *f*k*@........
501 dfgid@........
502 *i*d*@........
503 kid*k@........
504 *k*i*@........
505 gkfgi@........
506 *d*g*@...EjE..
507 fgiff@...EeE..
508 *g*g*@####*EEE
509 f*k*k@####eEEE
510 ..............
511 ..............
512 ..............
513 ..............
514 Bonus:
515 ..............
516 ..+.+.........
517 ..............
518 ..............
519 .+............
520 .+............
521 ..............
522 ..............
523 ..............
524 ..+...........
525 ..........+...
526 +..++.........
527 ..............
528 +.............
529 ..............
530 ..............
531 ..............
532 ..............
533 Level:
534 Freek
535 untitled
536 Bricks:
537 j.k.#.k.j.k.#*
538 j.k.#.k.j.k.#*
539 j.k.#.k.j.k.#*
540 j.k.#.k.j.k.#*
541 j.k.#.k.j.k.#*
542 j.k.#.k.j.k.#*
543 j.k.#.k.j.k.#*
544 j.k.#.k.j.k.#*
545 j.k.#.k.j.k.#*
546 j.k.#.k.j.k.#*
547 j.k.#.k.j.k.#*
548 j.k.#.k.j.k.#*
549 j.k.#.k.j.k.#*
550 #.#.#.#.#.#.#.
551 ..............
552 ..............
553 ..............
554 ............@@
555 Bonus:
556 *.....+......b
557 ..............
558 ..*.....-.+...
559 *.+...*.......
560 -.....+.*.....
561 ..........*...
562 ........-.....
563 ..............
564 ..*.......+...
565 *.+...+.*.....
566 -.....*...*...
567 ........-.....
568 ..............
569 ..............
570 ..............
571 ..............
572 ..............
573 ..............
574 Level:
575
576
577 Bricks:
578 **************
579 **************
580 **************
581 **************
582 ****ff**ff****
583 ****ff**ff****
584 **f*ff**ff*f**
585 **f********f**
586 **ff******ff**
587 ***ff****ff***
588 ****f****f****
589 ****ffffff****
590 *****ffff*****
591 **************
592 **************
593 **************
594 **************
595 **************
596 Bonus:
597 ..............
598 ..............
599 ..............
600 ..............
601 ..............
602 ..............
603 ..............
604 ..............
605 ..............
606 ..............
607 ..............
608 ..............
609 ..............
610 ..............
611 ..............
612 ..............
613 ..............
614 ..............
615 Level:
616
617
618 Bricks:
619 EEEEEEEEEEEEEE
620 E............E
621 E............E
622 E............E
623 E............E
624 E.aaaaaaaaaa.E
625 E.ajbbbbbbja.E
626 E.ab!!!!!!ba.E
627 E.ab!j..j!ba.E
628 E.ab!cEEc!ba.E
629 E.ab!jccj!ba.E
630 E.ab!!!!!!ba.E
631 E.ajbbbbbbja.E
632 E.aaaaaaaaaa.E
633 E............E
634 E............E
635 E............E
636 E............E
637 Bonus:
638 ..............
639 ..............
640 ..............
641 ..............
642 ..............
643 ..+...??...+..
644 ..............
645 ....w....w....
646 ..............
647 ...bs....sb...
648 ..............
649 ....w....w....
650 ..............
651 ..+g......g+..
652 ..............
653 ..............
654 ..............
655 ..............
656 Level:
657 Freek
658 untitled
659 Bricks:
660 ..............
661 ..............
662 ..............
663 ..............
664 ..............
665 ..............
666 ..............
667 ..............
668 ......h.......
669 .......e......
670 ..............
671 ..............
672 ..............
673 ..............
674 ..............
675 ..............
676 ..............
677 ..............
678 Bonus:
679 ..............
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..............
686 ..............
687 ......>.......
688 .......>......
689 ..............
690 ..............
691 ..............
692 ..............
693 ..............
694 ..............
695 ..............
696 ..............
697 Level:
698 Freek
699 untitled
700 Bricks:
701 **.**..**.**..
702 *..*.*.*..*...
703 **.**..**.**..
704 *..**..*..*...
705 *..*.*.**.**..
706 ..............
707 **********.*.*
708 .........*.*.*
709 .........*.**.
710 .........*.*.*
711 ***.*..*.*.*.*
712 *...**.*.*....
713 ***.**.*.*****
714 *...*.**......
715 ***.*.**.***..
716 .........*..*.
717 .........*..*.
718 .........***..
719 Bonus:
720 ..............
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ..............
727 ..............
728 ..............
729 ..............
730 ggg.g..g......
731 g...gg.g......
732 ggg.gg.g......
733 g...g.gg......
734 ggg.g.gg.ggg..
735 .........g..g.
736 .........g..g.
737 .........ggg..
738 Level:
739 Freek
740
741 Bricks:
742 czczczczczczcz
743 hijfhjffjhfjih
744 hijfhjffjhfjih
745 hijfhjffjhfjih
746 hijfhjffjhfjih
747 hijfhjffjhfjih
748 hijfhjffjhfjih
749 hijfhjffjhfjih
750 hijfhjffjhfjih
751 hijfhjffjhfjih
752 hijfhjffjhfjih
753 hijfhjffjhfjih
754 hijfhjjjjhfjih
755 hijfhhhhhhfjih
756 hijffffffffjih
757 hijjjjjjjjjjih
758 hiiiiiiiiiiiih
759 hhhhhhhhhhhhhh
760 Bonus:
761 ..............
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 ..............
768 ..............
769 ..............
770 ..............
771 ..............
772 ..............
773 bbmbbdmdbbmbbb
774 +w+w+w+w+w+w+w
775 g}g5g}g5g}g5g}
776 bbbdbbbmbbbdbb
777 +d+w+d+w+d+w+d
778 w+w+w+w+w+w+w+
779 Level:
780 Freek
781
782 Bricks:
783 ..............
784 ..............
785 ..............
786 **************
787 **************
788 ..............
789 ..............
790 vvvvvv.vvvvvvv
791 ..............
792 ..............
793 ..............
794 vvvvv.vvvvvvvv
795 ..............
796 ..............
797 ..............
798 vvvvvvv.vvvvvv
799 ..............
800 ..............
801 Bonus:
802 ..............
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 ..............
809 ..............
810 ..............
811 ..............
812 ..............
813 ?????.????????
814 ..............
815 ..............
816 ..............
817 +<+>+>+.+>+s<<
818 ..............
819 ..............
820 Level:
821 Freek
822
823 Bricks:
824 .............j
825 .............j
826 .............j
827 .............j
828 .............j
829 g............j
830 g............j
831 g...b........j
832 g...b........j
833 g...b.........
834 aaaab..ccc....
835 ....b..g......
836 ....b..g......
837 ....baag......
838 .......g......
839 .......g......
840 ..............
841 ..............
842 Bonus:
843 .............*
844 .............*
845 .............*
846 .............*
847 .............*
848 *............*
849 *............W
850 *...*........W
851 *...*........W
852 *...*.........
853 WWWW*..WWW....
854 ....*..W......
855 ....*..W......
856 ....WWWW......
857 .......W......
858 .......W......
859 ..............
860 ..............
861 Level:
862 Freek
863
864 Bricks:
865 ..............
866 ..............
867 ...i......i...
868 ..iji....iji..
869 .ijjji..ijjji.
870 .ij.jjiijj.ji.
871 .ij..jiij..ji.
872 .ij...jj...ji.
873 .ij........ji.
874 ..ij......ji..
875 ..ij......ji..
876 ..ij......ji..
877 ..iij....jii..
878 ...ijj..jji...
879 ....ijjjji....
880 .....ijji.....
881 .....iiii.....
882 ......ii......
883 Bonus:
884 ..............
885 ..............
886 ...w......w...
887 ..jjj....jjj..
888 .>ssss..ssss>.
889 .>?.??????.?>.
890 .>0..0000..0>.
891 .++...00...++.
892 .!!........!!.
893 ..&&......&&..
894 ..~~......~~..
895 ..cc......cc..
896 ..>ll....ll>..
897 ...000..000...
898 ....------....
899 .....bbbb.....
900 .....gggg.....
901 ......++......
902 Level:
903 Freek
904
905 Bricks:
906 ..............
907 ..............
908 ..............
909 ..............
910 ..............
911 ..............
912 ..............
913 ..............
914 ..............
915 ..............
916 aaaaaaaaaaaaaa
917 aaaaaaaaaaaaaa
918 *a*a*a*a*a*a*a
919 E*E*E*E*E*E*E*
920 cccccccccccccc
921 cccccccccccccc
922 cccccccccccccc
923 aaaaaaaaaaaaaa
924 Bonus:
925 ..............
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..............
933 ..............
934 ..............
935 ..............
936 .-.~.-.~.-.~.-
937 !>!>!>!>!>!>!>
938 .!.!.!.!.!.!.!
939 ..............
940 ..............
941 ..............
942 wbwbwbwbwbwbwb
943 Level:
944 Freek
945
946 Bricks:
947 ..............
948 ..............
949 ..............
950 ..............
951 ..............
952 ..............
953 ..............
954 ..............
955 ..............
956 ......v.......
957 ..............
958 ..............
959 ..............
960 ..............
961 ..............
962 ..............
963 ..............
964 ..............
965 Bonus:
966 ..............
967 ..............
968 ..............
969 ..............
970 ..............
971 ..............
972 ..............
973 ..............
974 ..............
975 ..............
976 ..............
977 ..............
978 ..............
979 ..............
980 ..............
981 ..............
982 ..............
983 ..............
984 Level:
985 Freek
986
987 Bricks:
988 ..............
989 ...eeeeee.....
990 ..eeeeeeeee...
991 .ee....eeeee..
992 ee........eee.
993 ...........ee.
994 ...........ee.
995 ...........e..
996 ..........ee..
997 ......eeeee...
998 ......eeee....
999 ......ee......
1000 ......e.......
1001 ..............
1002 ..............
1003 ......e.......
1004 .....eee......
1005 .....eee......
1006 Bonus:
1007 ..............
1008 ...??????.....
1009 ..?????????...
1010 .??....?????..
1011 ??........???.
1012 ...........??.
1013 ...........??.
1014 ...........?..
1015 ..........??..
1016 ......?????...
1017 ......????....
1018 ......??......
1019 ......?.......
1020 ..............
1021 ..............
1022 ......?.......
1023 .....???......
1024 .....???......
1025 Level:
1026
1027
1028 Bricks:
1029 ........j..d..
1030 ..............
1031 .j............
1032 ..d...........
1033 ..............
1034 ..g..........g
1035 ..........j...
1036 ........d.....
1037 g........g....
1038 ...j..j.g....g
1039 j.........j...
1040 ..d...........
1041 ..........g...
1042 ..............
1043 .....j.....j.g
1044 .........j...g
1045 ...d..........
1046 ..............
1047 Bonus:
1048 ........d..*..
1049 ..............
1050 .d............
1051 ..*...........
1052 ..............
1053 ..d..........*
1054 ..........d...
1055 ........d.....
1056 *........d....
1057 ...*..d.d....*
1058 d.........*...
1059 ..d...........
1060 ..........*...
1061 ..............
1062 .....d.....d.d
1063 .........d...*
1064 ...*..........
1065 ..............
1066 Level:
1067
1068
1069 Bricks:
1070 ..j.d.jj.d.j..
1071 ..............
1072 .d..j.dd.j..d.
1073 .d..j.dd.j..d.
1074 ..............
1075 ..............
1076 jj.dd.jj.dd.jj
1077 jj.dd.jj.dd.jj
1078 ..............
1079 ..............
1080 dd.jj.dd.jj.dd
1081 dd.jj.dd.jj.dd
1082 dd.jj.dd.jj.dd
1083 ..............
1084 ..............
1085 ..............
1086 ..............
1087 ..............
1088 Bonus:
1089 ..<.~....W.j..
1090 ..............
1091 ......+f......
1092 ......f+......
1093 ..............
1094 ..............
1095 s.....s.....s.
1096 .l.....l.....l
1097 ..............
1098 ..............
1099 ..............
1100 >-.>-.>-.>-.>-
1101 ..............
1102 ..............
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 Level:
1108
1109
1110 Bricks:
1111 #E##cbabcbabc@
1112 #EEExyyzyyxxyj
1113 ..............
1114 ..............
1115 **************
1116 kkkkkkkkkkkkkk
1117 .e.e.e.e.e.e.e
1118 ..............
1119 ..........kkkk
1120 ..........kkkk
1121 ..........kkkk
1122 ..........kkkk
1123 .E#@zh....kkkk
1124 .E#@zh........
1125 ..............
1126 ..............
1127 ..............
1128 ..............
1129 Bonus:
1130 ....+...+...+.
1131 .......+.....+
1132 ..............
1133 ..............
1134 !j.!.f.!.f.!.j
1135 ..............
1136 ..............
1137 ..............
1138 ..........pwpw
1139 ..........!!!!
1140 ..........ppwp
1141 ..........wppw
1142 ..........pwpp
1143 ..............
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 Level:
1149
1150
1151 Bricks:
1152 ..............
1153 ..............
1154 ..............
1155 ...jk.........
1156 ..jkjkjkjk...k
1157 kjk..jkjkjk.kj
1158 jk........jkj.
1159 ...........j..
1160 ..............
1161 ..............
1162 ..............
1163 ...........*e*
1164 *e*......e*e*e
1165 e*e*...*e*e...
1166 ...e*e*e*.....
1167 ....e*e.......
1168 ..............
1169 ..............
1170 Bonus:
1171 ..............
1172 ..............
1173 ..............
1174 ...gw.........
1175 ..*b*b*b*w...w
1176 +g+..g+g+g+.+g
1177 *w........*b*.
1178 ...........g..
1179 ..............
1180 ..............
1181 ..............
1182 ...........fdf
1183 fdf......df>~-
1184 >~-f...<d~-...
1185 ...>fdf>~.....
1186 ....-~-.......
1187 ..............
1188 ..............
1189 Level:
1190
1191
1192 Bricks:
1193 .*.***.***.***
1194 .*.*.*.*.*.*.*
1195 .*.*.*.*.*.*.*
1196 .*.*.*.*.*.*.*
1197 .*.*.*.*.*.*.*
1198 .*.*.*.*.*.*.*
1199 .*.*.*.*.*.*.*
1200 .*.*.*.*.*.*.*
1201 .*.*.*.*.*.*.*
1202 .*.*.*.*.*.*.*
1203 .*.*.*.*.*.*.*
1204 .*.*.*.*.*.*.*
1205 .*.*.*.*.*.*.*
1206 .*.*.*.*.*.*.*
1207 .*.*.*.*.*.*.*
1208 .*.*.*.*.*.*.*
1209 .*.*.*.*.*.*.*
1210 .***.***.***.*
1211 Bonus:
1212 ...-........>.
1213 ..............
1214 .>...>...>...>
1215 ..............
1216 ...>.......-..
1217 .......-......
1218 ...........>..
1219 .-...-........
1220 ..............
1221 .............>
1222 .......-...-..
1223 ..............
1224 ...-.....-...-
1225 .>.>.>.-.....>
1226 .......>......
1227 .........>....
1228 ..............
1229 ..........>...
1230 Level:
1231
1232
1233 Bricks:
1234 **************
1235 ..............
1236 dddddddddddddd
1237 ..............
1238 @.@.@.@.@.@.@.
1239 ..............
1240 **************
1241 ..............
1242 dddddddddddddd
1243 dddddddddddddd
1244 ..............
1245 ..............
1246 ..............
1247 ..............
1248 ..............
1249 ..............
1250 ..............
1251 ..............
1252 Bonus:
1253 ..............
1254 ..............
1255 5.5.5.5.5.5.5.
1256 ..............
1257 ..............
1258 ..............
1259 -l.-l.-l.-l.-l
1260 ..............
1261 bf.bf.bf.bf.bf
1262 ..............
1263 ..............
1264 ..............
1265 ..............
1266 ..............
1267 ..............
1268 ..............
1269 ..............
1270 ..............
1271 Level:
1272
1273
1274 Bricks:
1275 ..............
1276 h.e.h.e.h.e.h.
1277 vhvhvhvhvhvhvh
1278 e.h.e.h.e.h.e.
1279 ..............
1280 ..............
1281 ..............
1282 ..............
1283 dddddddddddddd
1284 **************
1285 igigigigigigig
1286 gigigigigigigi
1287 ..............
1288 ..............
1289 **************
1290 zzzzzzzzzzzzzz
1291 jjjjjjjjjjjjjj
1292 ..............
1293 Bonus:
1294 ..............
1295 ..f...<...d...
1296 ..............
1297 w...>...g...b.
1298 ..............
1299 ..............
1300 ..............
1301 ..............
1302 -..-..-..-..-.
1303 ..............
1304 ..............
1305 ..............
1306 ..............
1307 ..............
1308 ..............
1309 ...+.....+....
1310 +.....+.....+.
1311 ..............
1312 Level:
1313
1314
1315 Bricks:
1316 ..............
1317 ..............
1318 ..............
1319 ..............
1320 ..............
1321 ..............
1322 .ccc.....aaaaa
1323 c*c*c....a*a*a
1324 c*c*c....a*a*a
1325 ccccc....aaaaa
1326 cc*ccc....a*a.
1327 *ccc*c...aaaaa
1328 c*c*cc..aa***a
1329 cc*cc...a*aaa*
1330 .ccc....aaa.aa
1331 ..............
1332 ..............
1333 ..............
1334 Bonus:
1335 ..............
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 .000.....5.5.5
1342 0w0b0.....s.f.
1343 0+0+0....5-5-5
1344 00000.....5.5.
1345 00+000.....-..
1346 +000+0....5.5.
1347 0b0p00...5f~s5
1348 00+00...5-5.5-
1349 .000.....5...5
1350 ..............
1351 ..............
1352 ..............
1353 Level:
1354
1355
1356 Bricks:
1357 ..............
1358 ..............
1359 ........hhh...
1360 ........h*h...
1361 ........h*h...
1362 .........*....
1363 .....eee.*....
1364 .....e*e.*....
1365 .ggg.e*e.*....
1366 .g*g..*..*.iii
1367 .g*g..*....i*i
1368 ..*...*....i*i
1369 ..*...*.....*.
1370 ..*.........*.
1371 ..*.........*.
1372 ..*.........*.
1373 ..............
1374 ..............
1375 Bonus:
1376 ..............
1377 ..............
1378 ........fff...
1379 ........flf...
1380 ........fff...
1381 ..............
1382 .....~~~......
1383 .....~l~......
1384 .---.~~~......
1385 .-l-.......jjj
1386 .---.......jlj
1387 ...........jjj
1388 ..............
1389 ..............
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 Level:
1395
1396
1397 Bricks:
1398 dddddddddddddd
1399 dddddddddddddd
1400 **************
1401 **************
1402 **************
1403 **************
1404 **************
1405 **************
1406 **************
1407 **************
1408 **************
1409 **************
1410 **************
1411 ..............
1412 ..............
1413 ..............
1414 ..............
1415 ..............
1416 Bonus:
1417 >>>>>>>>>>>>>>
1418 !!!!!!!!!!!!!!
1419 --------------
1420 wwwwwwwwwwwwww
1421 ++++++++++++++
1422 llllllllllllll
1423 wwwwwwwwwwwwww
1424 ++++++++++++++
1425 pppppppppppppp
1426 mmmmmmmmmmmmmm
1427 llllllllllllll
1428 ++++++++++++++
1429 ++++++++++++++
1430 ..............
1431 ..............
1432 ..............
1433 ..............
1434 ..............
1435 Level:
1436
1437
1438 Bricks:
1439 jfkfjf..fyfkfj
1440 jfkfyf..fjfkfj
1441 jfkfjf..fyfkfj
1442 jfkfyf..fjfkfj
1443 jfkfjf..fyfkfj
1444 jfkfyf..fjfkfj
1445 jfkfjf..fyfkfj
1446 jfkfyf..fjfkfj
1447 jfkfjf..fyfkfj
1448 jfkfyf..fjfkfj
1449 jfkfjf..fyfkfj
1450 jfkfyf..fjfkfj
1451 jfkfjf..fyfkfj
1452 jfkfyf..fjfkfj
1453 jfkfjf..fyfkfj
1454 jfkfyf..fjfkfj
1455 jfkfjf..fyfkfj
1456 ######..######
1457 Bonus:
1458 ..m.*>.....m.s
1459 p..b....>*....
1460 .5............
1461 .c........bm..
1462 ....*...w*..cs
1463 p..b....>...c.
1464 ..m..>....b...
1465 .c..*w.....m5s
1466 pw......>.....
1467 .....>...*b.5.
1468 ..mb........5.
1469 pw..*.......5s
1470 ...b......bmw.
1471 .5...>......w.
1472 p.mb.w...*b.c.
1473 ....*........s
1474 .....>..>.....
1475 ..............
1476 Level:
1477
1478
1479 Bricks:
1480 ..............
1481 ..............
1482 ..............
1483 .************.
1484 .*iiiiiiiiii*.
1485 .*ihhhhhhhhi*.
1486 .*ihiiiiiihi*.
1487 .*i!!hh!!!hi*.
1488 .*ihi!iih!hi*.
1489 .*ih!hii!ihi*.
1490 .*i!!!hh!ihi*.
1491 .*ihiiiiiihi*.
1492 .*ihhhhhhhhi*.
1493 .*iiiiiiiiii*.
1494 .************.
1495 ..............
1496 ..............
1497 ..............
1498 Bonus:
1499 ..............
1500 ..............
1501 ..............
1502 .344141444434.
1503 .240330020030.
1504 .42?..?..?.42.
1505 .43.?..?..?42.
1506 .41........34.
1507 .41?..?..?.21.
1508 .31........34.
1509 .03..?..?..34.
1510 .34......?.33.
1511 .03.?..?..?01.
1512 .141144414101.
1513 .040004000001.
1514 ..............
1515 ..............
1516 ..............
1517 Level:
1518
1519
1520 Bricks:
1521 ##############
1522 ##############
1523 ##############
1524 ##############
1525 ##j.j.jk.k.k##
1526 ##j.j.jk.k.k##
1527 ##.j.jkjk.k.##
1528 ##.j.jkjk.k.##
1529 ##j.j.jk.k.k##
1530 ##j.j.jk.k.k##
1531 ##.j.jkjk.k.##
1532 ##.j.jkjk.k.##
1533 ##j.j.jk.k.k##
1534 ##j.j.jk.k.k##
1535 ##..........##
1536 ##..........##
1537 ##..........##
1538 ##..........##
1539 Bonus:
1540 ..............
1541 ..............
1542 ..............
1543 ..............
1544 ..............
1545 ..............
1546 ..........-...
1547 ..............
1548 ....+.j....j..
1549 ..>........<..
1550 .......>......
1551 .....-........
1552 ..j...<.......
1553 .........+....
1554 ..............
1555 ..............
1556 ..............
1557 ..............
1558 Level:
1559
1560
1561 Bricks:
1562 ..............
1563 zzzzzzzzzzzzzz
1564 z************z
1565 z*yyyyyyyyyy*z
1566 z*yyyyyyyyyy*z
1567 z*yy******yy*z
1568 z*yy*xxxx*yy*z
1569 z*yy*xxxx*yy*z
1570 z*yy*x**x*yy*z
1571 z*yy*x**x*yy*z
1572 z*yy*xxxx*yy*z
1573 z*yy*xxxx*yy*z
1574 z*yy******yy*z
1575 z*yyyyyyyyyy*z
1576 z*yyyyyyyyyy*z
1577 z************z
1578 zzzzzzzzzzzzzz
1579 ..............
1580 Bonus:
1581 ..............
1582 ..............
1583 ..............
1584 ..............
1585 ..............
1586 ..............
1587 ..............
1588 ..............
1589 .l.}......?...
1590 ..............
1591 ......l.......
1592 ..............
1593 ..............
1594 ..............
1595 ..............
1596 ..............
1597 ..............
1598 ..............
0 Version: 1.00
1 Level:
2 Vivian
3 Gatinha 01
4 Bricks:
5 **************
6 vvvvvvvvvvvvvv
7 vvvvvvvvvvvvvv
8 vvvvvvvvvvvvvv
9 vvvvvvvvvvvvvv
10 vvvvvvvvvvvvvv
11 vvvvvvvvvvvvvv
12 vvvvvvvvvvvvvv
13 vvvvvvvvvvvvvv
14 ..............
15 **************
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ?*b?l.?b.?bj?m
26 ..bm......b..b
27 ?mbj.bm.*.?.?b
28 ..?.?..?.?...w
29 b..b*?.m..*b.*
30 .?w.....w...?.
31 >>*?.b?.j.?>>>
32 w****.jbbbbb.w
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Vivian
44 Gatinha 01
45 Bricks:
46 *v*v*v**v*v*v*
47 vv.v.v..v.v.vv
48 *..v.v..v.v..*
49 vvvv.v..v.vvvv
50 *....v..v....*
51 vvvvvv..vvvvvv
52 ..............
53 vvvvv....vvvvv
54 *...v.vv.v...*
55 vvv.v.**.v.vvv
56 ..v.v.**.v.v..
57 *.v.v.vv.v.v.*
58 ..v.v....v.v..
59 vvv.v....v.vvv
60 *...v....v...*
61 vvvvv....vvvvv
62 ..............
63 ..............
64 Bonus:
65 m.bw.wllw.wb.m
66 ..............
67 *............*
68 ...c......c...
69 c............c
70 .....c..c.....
71 ..............
72 ....c....c....
73 b............b
74 ..c...bb...c..
75 ......bb......
76 j............j
77 ..............
78 ..c........c..
79 w............w
80 c...c....c...c
81 ..............
82 ..............
83 Level:
84 Vivian
85 Gatinha 01
86 Bricks:
87 z*z!jz**zj!z*z
88 z*zj!z**z!jz*z
89 zcz!jz**zj!zcz
90 z*zj!zccz!jz*z
91 z*z!jz**zj!z*z
92 z*zj!z**z!jz*z
93 zcz!jz**zj!zcz
94 z*zj!z**z!jz*z
95 z*z!jzcczj!z*z
96 z*zj!z**z!jz*z
97 zcz!jz**zj!zcz
98 z*zj!z**z!jz*z
99 z*z!jz**zj!z*z
100 v@vvvv@@vvvv@v
101 zzzjjzzzzjjzzz
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ...>p....>m...
107 ....b....b....
108 ...*......*...
109 ....>....>....
110 ...w......w...
111 ....b....b....
112 ...j......j...
113 ....c....c....
114 ...l......l...
115 ....w....w....
116 ..m..m..m..m..
117 ..............
118 ..............
119 ..............
120 ...w+....+w...
121 ..............
122 ..............
123 ..............
124 Level:
125 Vivian
126 Gatinha 01
127 Bricks:
128 z!z!z!z!z!z!z!
129 !z!z!z!z!z!z!z
130 z!zzz!zzz!z!z!
131 !z!z!z!z!z!z!z
132 z!zzz!zzz!z!z!
133 !z!z!z!z!z!z!z
134 z!zzz!zzz!zzz!
135 !!!!!!!!!!!!!!
136 ##############
137 **************
138 **************
139 jjjjjj**jjjjjj
140 zzzzzzzzzzzzzz
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 bbbbbbbbbbbbbb
157 lmlmlmjmjmlmlm
158 ......jj......
159 wbwbwbwbwbwbwb
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Vivian
167 Gatinha 01
168 Bricks:
169 @@@.......kkkk
170 @@........k..k
171 @............k
172 @...j..j.....k
173 ....j..j.....k
174 ...jjjjjj..kkk
175 ...jgjgjj.kkkk
176 ..jjjjjjj.kkkk
177 ..jjj!jjjkkkkk
178 ..jjjjjjjkkkkk
179 ...jjdjjkkkkkk
180 ...jjdjjkkkkkk
181 ...jjjjjkkkkkk
182 ....kkkkkkkkkk
183 ....kkkkk..k.k
184 ....kkkkk..k.k
185 .@@kk@@kk@kk@k
186 .kkkk@kkk@kk@k
187 Bonus:
188 ..........>bbb
189 ..........*..b
190 .............b
191 ....w..w......
192 ..............
193 ..............
194 ....w.w.......
195 ...........+..
196 .....m....+..j
197 ...p...p.+..j.
198 .....*.......p
199 .....*....+...
200 .........+....
201 ......b.+...b.
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Vivian
208 Gatinha 01
209 Bricks:
210 jjjjjjjjjjjjjj
211 ..............
212 .@##########@.
213 .#j........j#.
214 .#.@######@.#.
215 .#.#j....j#.#.
216 .#.#.@##@.#.#.
217 .#.#.#..#.#.#.
218 .#.#.#..#.#.#.
219 .#.#.#..#.#.#.
220 .#.#.#.*#.#.#.
221 .#.#.#.@@.#.#.
222 .#.#.#j..j#.#.
223 .#.#.@####@.#.
224 .#.#j......j#.
225 .#.@########@.
226 .#j..........j
227 .#############
228 Bonus:
229 bbbwmbwmbwmjmb
230 ..............
231 ..............
232 ..b........b..
233 ..............
234 ....b....b....
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ......b..b....
242 ..............
243 ....b......b..
244 ..............
245 ..b..........b
246 ..............
247 Level:
248 Vivian
249 Gatinha 01
250 Bricks:
251 *....***....*c
252 *.....v.....*c
253 !!....v....!!c
254 *!....v....!*c
255 j!....v....!jc
256 j*....v....*jc
257 j!....v....!jc
258 j!....v....!jc
259 *!*!..v..!*!*c
260 ***!..*..!***c
261 jjj!..!..!jjjc
262 jjj!..!..!jjjc
263 jj*!*!!!*!*jjc
264 jj****v****jjc
265 jjjj!vvv!jjj*c
266 jjjj!vvv!jjj*c
267 ****@vvv@****c
268 ..............
269 Bonus:
270 l.....j.....l?
271 ..............
272 md.........dm?
273 .b.........b..
274 w>.........>w?
275 w...........w.
276 b...........b?
277 b...........b.
278 .mbp..g..pbm.?
279 ..............
280 ->>c..l..c>>-?
281 -...........-.
282 *..m.....m..*?
283 ......*.......
284 WW+s.....+Ws.?
285 >w>>.....>>w.w
286 ..............
287 ..............
288 Level:
289 vivian
290 Nao_sei
291 Bricks:
292 E#************
293 jj***#********
294 j@**j!j*******
295 #.*c*.#c******
296 ..Ec*.@cE*****
297 *j*.....#*****
298 ..E#@.*.#c****
299 #..j#j..#cE***
300 #@..j##.@*#***
301 jz*..E@...!#**
302 jz#@.*E*#*#E**
303 jz*..*..@cE**j
304 #@..E*.*#c***#
305 ..***@.@E***E*
306 ..Ejj#.##c*E**
307 .####...##E*#*
308 ..............
309 ..............
310 Bonus:
311 ..............
312 .....b........
313 .c...m........
314 ..&...........
315 ....b.........
316 mbm.....b.....
317 ......*.......
318 ....b...b.....
319 ......j.......
320 .m*.......mb..
321 .*cc.m........
322 .m*...........
323 .............b
324 ..............
325 ...p....&.l...
326 .pwc&...wc..w.
327 ..............
328 ..............
329 Level:
330 vivian
331 Nao_sei
332 Bricks:
333 .hh.**.....jj.
334 .hh...*...jjjj
335 .hh...**..jjjj
336 .......*...jj.
337 .......@......
338 .......@......
339 ......kkk.....
340 ......k!k.....
341 ......kkk.....
342 ...jjjjjjjjj..
343 ...jjcjcjcj...
344 ....jjjjjjj...
345 ggggjjjjjjgggg
346 agaggggggggggg
347 gaggggggaggaag
348 ggggggagaggggg
349 ggggaggggagaga
350 gEEgEEEgEEEgEE
351 Bonus:
352 .p..j......bl.
353 ..............
354 ..........*...
355 ............b.
356 ..............
357 ..............
358 ..............
359 .......m......
360 ..............
361 ...b.......+..
362 .....b.b.b....
363 ..............
364 &b..+jjjjj....
365 ...>......s..>
366 ......b.......
367 .b-.b.......b.
368 ...*.*...*...*
369 w..w...w...w..
370 Level:
371 Vivian
372 Gatinha 01
373 Bricks:
374 **************
375 @!!!!!!!!!!!!@
376 !cczzzzzzzzcc!
377 !c*zzzzzzzz*c!
378 !z!zzE##Ezz!z!
379 !zczz#**#zzcz!
380 !z!zz!**!zz!z!
381 !zczz#**#zzcz!
382 !z!zz#**#zz!z!
383 !zczz!**!zzcz!
384 !z!zz#**#zz!z!
385 !zczz#**#zzcz!
386 !z!zzE##Ezz!z!
387 !zczzzzzzzzcz!
388 !z!zzzzzzzz!z!
389 ..............
390 ..............
391 ..............
392 Bonus:
393 w.b.b.b.b.b..w
394 ..............
395 b.?Wp.m..pWb.b
396 c...........Wc
397 bb.m......m..b
398 *...s.ll....w*
399 b?..b>bb>bb..b
400 **.w..bw.....*
401 b...b.bb.bs.?b
402 *W..b.wb.b..**
403 b..b.jbbj....b
404 **.>..jm..b.?*
405 b..s}.......>b
406 *?>jbffffb>.j*
407 bwj?bjb+jb?jwb
408 ..............
409 ..............
410 ..............
411 Level:
412 Vivian
413 Gatinha 01
414 Bricks:
415 ****c!c!c!c***
416 ****cvcvcvc***
417 ****c.c.c.c***
418 ****c.c.c.c***
419 ****c.c.c.EE**
420 **EEE.E.E..E**
421 **E...E.E..E**
422 **E...E.EE.@E*
423 **E.@EE..E..E*
424 EE@.E....E..E*
425 E...E....E@.EE
426 E...E.....E...
427 E..EE.....EE..
428 E..E.......E..
429 EjjEjjjjjjjEEj
430 EjjEjjjjjjjjEj
431 EjjEjjjjjjjjEj
432 jjjjjjjjjjjjjj
433 Bonus:
434 jjjj.m.m.m.jjj
435 jjjj.w.w.w.jjj
436 jjjj.......jjj
437 jjjj*.*.*.*jjj
438 jjjjp.p.p...jj
439 jj..........jj
440 jj..........jj
441 jj...........j
442 jj...........j
443 .............j
444 ..............
445 ..............
446 ..............
447 ..............
448 .bb.bbbbbbb..b
449 .c..c.c.c.c..c
450 ..............
451 w...w...w...w.
452 Level:
453 Vivian
454 Gatinha 01
455 Bricks:
456 @!..........!@
457 !!.zzz..zzz.!!
458 ...z!z..z!z...
459 ...zzz..zzz...
460 ......!!......
461 !!....!!....!!
462 @!....!!....!@
463 !!.zzz..zzz.!!
464 ...z!z..z!z...
465 ...zzz..zzz...
466 ..............
467 !!..........!!
468 @!..........!@
469 !!..........!!
470 ..............
471 ..............
472 ..............
473 ..............
474 Bonus:
475 .f..........f.
476 ff.*bw..wb*.ff
477 ...?m>..>m?...
478 ...!cj..jc!...
479 ......bb......
480 ff....bb....ff
481 .f....bb....f.
482 ff.wb*..*bw.ff
483 ...?m>..>m?...
484 ...fff..fff...
485 ..............
486 ff..........ff
487 .f..........f.
488 ff..........ff
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Vivian
495 Gatinha 01
496 Bricks:
497 *@*@*@*@*@*@*@
498 z!z!z!z!z!z!z!
499 *z*z*z*z*z*z*z
500 z!z!z!z!z!z!z!
501 *z*z*z*z*z*z*z
502 z!z!z!z!z!z!z!
503 *z*z*z*z*z*z*z
504 z!z!z!z!z!z!z!
505 *z*z*z*z*z*z*z
506 z!z!z!z!z!z!z!
507 *z*z*z*z*z*z*z
508 z!z!z!z!z!z!z!
509 *z*z*z*z*z*z*z
510 z!z!z!z!z!z!z!
511 *z*z*z*z*z*z*z
512 ..............
513 ..............
514 ..............
515 Bonus:
516 m.m.m.m.m.m.m.
517 j!}jsj.jpjm!b!
518 ?}?s?.?p?m?b?*
519 ..............
520 ..............
521 ..............
522 ...........!..
523 ..............
524 .p-!-b-*-w-b-.
525 .!m!b!*!w!*!*.
526 .m-b-*-w-?-b-.
527 .>b>*>w>?>*>*.
528 .bm*mwm?m?mbm.
529 .!*!w!?!?!*!*.
530 ..............
531 ..............
532 ..............
533 ..............
534 Level:
535 Vivian
536 Gatinha 01
537 Bricks:
538 @............@
539 !.*z*z**z*z*.!
540 !.E@E@EE@E@E.!
541 !............!
542 @............@
543 !............!
544 !.y*y*yy*y*y.!
545 !.@#@#@@#@#@.!
546 !............!
547 @............@
548 c............c
549 c.*x*x**x*x*.c
550 c.cccccccccc.c
551 E............E
552 ..............
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ..............
558 j..b.bmmb.b..*
559 m............p
560 *............m
561 ..............
562 .............j
563 ......!f......
564 ..............
565 p.............
566 ..............
567 ..............
568 ...s.w..w.s...
569 ..>~>~>~>~>~..
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Vivian
577 Gatinha 01
578 Bricks:
579 ..............
580 .@!@..@!@..@!@
581 .!*!..!*!..!*!
582 .!*!..@!@..!*!
583 .@!@..vvv..!*!
584 ..vv..@!!@.!*!
585 ..@!@.!**!.!*!
586 ..!*!.!**!.@!@
587 ..!*!.!**!.vvv
588 ..!*!.@!!@.@!@
589 ..@!@..vvv.!*!
590 ..vvv..@!@.!*!
591 ..vvv..!*!.@!@
592 .@!!@..!*!.vvv
593 .!**!..@!@.@!@
594 .!**!......!*!
595 .@!!@......!*!
596 ...........@!@
597 Bonus:
598 ..............
599 ..>....>....>.
600 ..--..w*w...*.
601 .w-w...?....l.
602 ..?.........b.
603 .......>>...b.
604 ...>...gm..wbw
605 ...bm.w}sw..?.
606 ..wbw..-b.....
607 ...b...??...>.
608 ...?........*.
609 ........>..w-w
610 ........c...?.
611 ..>>....>.....
612 ........?...>.
613 ..ww........w*
614 ..??........w.
615 ............?.
616 Level:
617 Vivian
618 Gatinha 01
619 Bricks:
620 jabcxy**yxcbaj
621 jabcxyzzyxcbaj
622 kjabcxyyxcbajk
623 kjabcxyyxcbajk
624 #kjabcxxcbajk#
625 #kjabcxxcbajk#
626 #.kjabccbajk.#
627 @.kjabccbajk.@
628 @..kjabbajk..@
629 @*.kjabbajk.*@
630 @@..kjaajk..@@
631 @@*.kjaajk.*@@
632 @@@..kjjk..@@@
633 @@@*.kjjk.*@@@
634 @@@@..kk..@@@@
635 @@@@@.kk.@@@@@
636 ..............
637 ..............
638 Bonus:
639 m***b*ll*b***m
640 ms.!b*mm*b!.sm
641 m>...b**b...>m
642 m>?..b**b..?>m
643 ..w..cbbc..w..
644 ...?.cbbc.?...
645 ...w..jj..w...
646 ....?....?....
647 ....w....w....
648 .>...?..?...>.
649 .....w..w.....
650 ..>...??...>..
651 ......ww......
652 ...>......>...
653 ..............
654 ..............
655 ..............
656 ..............
657 Level:
658 Vivian
659 Gatinha 01
660 Bricks:
661 @..czz!!zzc..@
662 *..#zczccz#..*
663 @..#zcczcz#..@
664 *..c!!zc!!c..*
665 @..#zcczcz#..@
666 *..czczcczc..*
667 @..#zz!!zz#..@
668 *..c##zz##c..*
669 @..vvvvvvvv..@
670 *..vvvvvvvv..*
671 @..vvvvvvvv..@
672 *..vvvvvvvv..*
673 @..vvvvvvvv..@
674 ..............
675 ..............
676 ..............
677 ..............
678 ..............
679 Bonus:
680 ...*bcmmcb*...
681 *...b....b...*
682 ....b....b....
683 b..*p....p*..w
684 ....l....l....
685 w..*mj..jm*..b
686 ....ww..ww....
687 b..b......b..w
688 ...<??>>??<...
689 w..&W-W!-W&..b
690 ...sl....!}...
691 b..g......5..w
692 ...>...>..>...
693 ..............
694 ..............
695 ..............
696 ..............
697 ..............
698 Level:
699 Vivian
700 Gatinha 01
701 Bricks:
702 ffffffffffffff
703 ffffffhhffffff
704 fffffhhhhfffff
705 ffffhggghfffff
706 fffhggggghffff
707 ffhhgjjjghhfff
708 ffhhjjgjjhhhff
709 fhhhjgggghhhhf
710 ffhhggggghhhff
711 ffhhggjgghhfff
712 fffhhggghhffff
713 ffffhhghhfffff
714 fffffhhhffffff
715 ffffffffffffff
716 @............@
717 ..............
718 ..............
719 ..............
720 Bonus:
721 mgbgbgbgbgbg!m
722 !pWWmWmWmWWmp!
723 !pm>f????f>Wp*
724 *pW>f&mm&f*Wp!
725 !jW>f?c!?f>WWb
726 jm0>fjc!jf>0W!
727 mW0>f?c!?f>0Wm
728 !m0*f{{j{f*0*!
729 bb0>f{j{{f>0Wj
730 !b0*fwwwwf>0W!
731 *b0>>>>*>>>0**
732 !-+-bbbbbbb-+!
733 !+j+mmmmmm-j-+
734 m-+-+-+-+-+-+m
735 ..............
736 ..............
737 ..............
738 ..............
739 Level:
740 Vivian
741 Gatinha 01
742 Bricks:
743 !***a********!
744 !............!
745 zazzzazazaazze
746 a..........zze
747 a.zzazzzzz..za
748 a.z.......z*ae
749 a.z.zz***.z.ze
750 a.z.z.***.a*ze
751 a.z.z.***.z.ae
752 a.z.z...*.z.ze
753 a.z.zzzz*.z*ae
754 a.z....zzzz.ze
755 a.zzzz......ze
756 a.zzzzzzzzzzza
757 z.zzzazzzzzzze
758 ..............
759 ..............
760 ..............
761 Bonus:
762 m....mmmmm...*
763 m............*
764 ?w.b.+5w+ww?p.
765 b.............
766 >..>wj5p....bw
767 w.j.......>.ww
768 p.j.}jj&..}.>.
769 w.p.>..mb.!...
770 w.j.*.5*5.b.wc
771 w.>.......{.>.
772 d.{.>.5*..>.ww
773 j.?....&d4p.d.
774 j.j&p........c
775 j.fd.b.df>.bfw
776 w.*smmmsmmms**
777 ..............
778 ..............
779 ..............
780 Level:
781 Vivian
782 Gatinha 01
783 Bricks:
784 E*fhjde@djhf*E
785 *gfhjde!djhfg*
786 igEhjdezdjhf#i
787 igfhjde!djhfgi
788 igfhEdezdj#fgi
789 igfhjde!djhfgi
790 igfhjdez#jhfgi
791 @gfhjde!djhfg@
792 igfhjd#zEjhfgi
793 igfhjde!djhfgi
794 igfh#dezdjEfgi
795 igfhjde!djhf*i
796 ig#hjdezdjhfEi
797 *gfhjde!djhfgi
798 #gfhjdezdjhfgi
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ...!d.....!...
804 .m&......d.&m.
805 ...c.g.b...c..
806 ....p.....p...
807 w.W~...b.~...w
808 ...>.ss.?.....
809 *2.....b.d>W.*
810 ....b~?.?.....
811 s.W....b....&.
812 .5.~?j...d?5.}
813 }4.>.wwb...4..
814 w3..m.~..dm3..
815 .2..m..>..m2.w
816 .1-.mff.ffm1-.
817 .0+~m..>..m0+.
818 ..............
819 ..............
820 ..............
821 Level:
822 Vivian
823 Gatinha 01
824 Bricks:
825 dddddddddddddd
826 dffffffffffffd
827 d######fffff#d
828 d#ffff#f###f#d
829 d#ffff#f#g#f#d
830 d#f##f#f#g#f#d
831 d#f#hf#f#g#f#d
832 d#f#hf#f#g#f#d
833 d#f##f#f#g#f#d
834 d#f#hf#f#g#f#d
835 d#f#hf#f#g#f#d
836 d#f####f#g#f#d
837 d#ffffff#g#f#d
838 d#ffffff#g#f#d
839 d########g###d
840 ..............
841 ..............
842 ..............
843 Bonus:
844 s......s.c....
845 ..*........*.p
846 p............w
847 ..............
848 w...c....m...m
849 .............m
850 ....j........m
851 ....m..s.m....
852 +....c...m.*.w
853 m...m....m....
854 m...m..g.m....
855 W............W
856 m.*...........
857 w.....g......+
858 ..............
859 ..............
860 ..............
861 ..............
862 Level:
863 Vivian
864 Gatinha 01
865 Bricks:
866 daadaaadaaaaaa
867 daadadadaaaada
868 daadaaadaadaaa
869 daadadadaadada
870 ddadadadaddada
871 adddadaaddaada
872 addaadaaddaada
873 addaadaaddaada
874 addaadaaddaada
875 aaaaaaaaaaaaaa
876 aaaaaaaaaaaaaa
877 ..............
878 ..............
879 ..............
880 ..............
881 ..............
882 ..............
883 ..............
884 Bonus:
885 lf.l..fl..5..f
886 j..j.j.j.W..j.
887 *W.p..5b..*..W
888 .....*bc......
889 b?.?W?bm..?.b.
890 5.}..}b.g..b}5
891 .g&..gb...4...
892 ..m...b.g&..&4
893 .g.4.gb4.p..m.
894 b+.m+mmm+m+mmm
895 w.smw.s.w..s.w
896 ..............
897 ..............
898 ..............
899 ..............
900 ..............
901 ..............
902 ..............
903 Level:
904 Vivian
905 Gatinha 01
906 Bricks:
907 eeeeeeeEeeeee@
908 @*eeeeeeeeeeee
909 .ceeeeeeeeeeee
910 ..@eeeeeeeeeee
911 ...c*eeeeeeeee
912 ....@eeeeeeeee
913 .....ceeeeeeee
914 ......@*eeeeee
915 .......ceeeeee
916 ........@eeeeE
917 .........ceeee
918 ..........@*ee
919 ...........cee
920 ............@e
921 ..............
922 ..............
923 ..............
924 ..............
925 Bonus:
926 .mm.m.c.......
927 ..mm..........
928 .wfm.j.p.l..b.
929 ...mwwwwwww...
930 ...w.bbbbb.c..
931 .....mmbbbbm.<
932 .....wfmm.....
933 ........ml....
934 .......wmmmm..
935 ...........m..
936 .........wfmm.
937 ............m*
938 ...........w+w
939 .............+
940 ..............
941 ..............
942 ..............
943 ..............
944 Level:
945 Vivian
946 Gatinha 01
947 Bricks:
948 jjjjejjjejjjjj
949 jjjjzjjjzjjjjj
950 jjjejeeejejjjj
951 jjejjjjjjejjjj
952 jjejEjjEjejjjj
953 jjejgjjjgejjjj
954 jjejjg*gjejjjj
955 jjjegjjjgejjjj
956 jjjejdddjejjjj
957 jjjejjdjejjjjj
958 jjjjejjjejjjjj
959 jjjjjeeejjjjjj
960 ..............
961 ..............
962 ..............
963 ..............
964 ..............
965 ..............
966 Bonus:
967 ????.???.?????
968 !W.wgdWdgd...!
969 ..1.W...wb.5.W
970 f1mb....bb...f
971 .}m..cc..b.{..
972 d}m..&&&.b...d
973 .}m1.sms.b5{W!
974 >w3..5...b...>
975 !.b..jjj...{.f
976 f3b...j..m....
977 ..<.pbbbpm..<5
978 c*c*.www.m*cc*
979 ..............
980 ..............
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Vivian
987 Gatinha 01
988 Bricks:
989 **************
990 **************
991 *vvvvvvvvvvvv*
992 *v**********v*
993 *v**********v*
994 *v*vvvvvvvv*v*
995 *v*v******v*v*
996 *v*v*vvvv*v*v*
997 *v*v*!****v*v*
998 *v*v*vvv**v*v*
999 *v*v***vvvv*v*
1000 *v*v********v*
1001 *v*vvvvvvvvvv*
1002 *v*vvvvvvvvvv*
1003 vv************
1004 .vvvvvvvvvvvvv
1005 ..............
1006 ..............
1007 Bonus:
1008 mmmmmmmmmmmmmm
1009 b.b.b.b.b.b..*
1010 ..............
1011 w.}..+..+..+..
1012 ..............
1013 w............*
1014 .....l.....j..
1015 w.p...........
1016 ....lm.c.c....
1017 w............*
1018 ..p..l........
1019 w...jjjjjjjj..
1020 ..............
1021 w.p..........*
1022 ...w.w.w.w.*..
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Vivian
1028 Gatinha 01
1029 Bricks:
1030 @hhhhh@@hhhhh@
1031 g!#ffffffff#!g
1032 giiiiiiiiiiiig
1033 gEdEdE**EdEdEg
1034 gdjdjdjdjdjdjg
1035 gjdjdjdjdjdjdg
1036 ge#e@e##e@e#eg
1037 @xyzxyzzyxzyx@
1038 cacacacacacaca
1039 bbbbbbbbbbbbbb
1040 acacacacacacac
1041 vvvvvvvvvvvvvv
1042 ..............
1043 ..............
1044 ..............
1045 ..............
1046 ..............
1047 ..............
1048 Bonus:
1049 .f---f..f---f.
1050 pg.!~~&&~~!.gp
1051 ?5>5>5>5>5>5>?
1052 ?.c.c.mm.c.c.?
1053 ?012345543210?
1054 ?012345543210?
1055 p}.{.}..{.}.{p
1056 .W*bW*bb*Wb*W.
1057 w!w!w!w!w!w!w!
1058 m>m>m>m>m>m>m>
1059 +-+-+-+-+-+-+-
1060 ?+w-cmwwmc-w+?
1061 ..............
1062 ..............
1063 ..............
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Vivian
1069 Gatinha 01
1070 Bricks:
1071 !@!@!@!@!@!@!@
1072 c*c*c*c*c*c*c*
1073 cfcgchcicjckce
1074 cfcgchcicjckce
1075 cfcgchcicjckce
1076 cfcgchcicjckce
1077 cfcgchcicjckce
1078 cfcgchcicjckce
1079 cfcgchcicjckce
1080 cfcgchcicjckce
1081 cfcgchcicjckce
1082 xxxxxxxxxxxxxx
1083 ..............
1084 ..............
1085 ..............
1086 ..............
1087 ..............
1088 ..............
1089 Bonus:
1090 >.>.>.>.>.>.>.
1091 -.-.-.-.-.-.-.
1092 -&-&-&-&-&-&-&
1093 sbsbsbsbsbsbsb
1094 jmjmjmjmjmjmjm
1095 {g{g{g{g{g{g{g
1096 ?p?p?p?p?p?p?p
1097 dbdbdbdbdbdbdb
1098 !c!c!c!c!c!c!c
1099 f*f*f*f*f*f*f*
1100 ?}?}?}?}?}?}?}
1101 wmwmwmwmwmwmwm
1102 ..............
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Vivian
1110 Gatinha 01
1111 Bricks:
1112 EggggggggggggE
1113 @ggg......ggg@
1114 Egg..cccc..ggE
1115 Eg...cddc...gE
1116 @g...cddc...g@
1117 Eg...cddc...gE
1118 Eg...cEEc...gE
1119 @g...chhc...g@
1120 Eg...chhc...gE
1121 Eg...chhc...gE
1122 @g...cEEc...g@
1123 Eg...cffc...gE
1124 Eg...cffc...gE
1125 @g...cffc...g@
1126 gg...cccc...gg
1127 ......##......
1128 ......##......
1129 ..............
1130 Bonus:
1131 .pmmmmllmmmmp.
1132 .wg{......{gw.
1133 .!?..&jj&..?!.
1134 .5...-55-...5.
1135 .>...dbbd...>.
1136 .>...>mW>...>.
1137 .f...s..s...f.
1138 .w...>55>...w.
1139 .m...dbbd...!.
1140 .~...cWmc...~.
1141 .-...<..<...-.
1142 .?...d55d...?.
1143 .+...*bb*...+.
1144 .w...?mW?...w.
1145 ww...w!!w...ww
1146 ..............
1147 ..............
1148 ..............
1149 Level:
1150 Vivian
1151 Gatinha 01
1152 Bricks:
1153 jjjjjjjjjjjajj
1154 jjajajjjjjajaj
1155 jjajajjjjjjjja
1156 jjaaajjjjjjjja
1157 jahahajaaaajja
1158 jaa@aaaaaaajaj
1159 jjadaaaaaaajaj
1160 jjjajaaaaaaajj
1161 jjjjjaaaaaaajj
1162 jjjjjaaaaaaajj
1163 jjjaaajjaaaajj
1164 jjaajjjjjaajjj
1165 jjjjjjjjjjjjjj
1166 jjjjjjjjjjjjjj
1167 ..............
1168 ..............
1169 ..............
1170 ..............
1171 Bonus:
1172 +ffffffffffff-
1173 +>*b*llllb.b.-
1174 +>wbwW&wcbbbb-
1175 +>wbwW&jcw!..-
1176 +>.m.W&jcw!s.-
1177 }>...W-jcw!s.?
1178 }>...W-jcw!s.?
1179 }>{.gW-.cw!sb?
1180 }>..gW-..w..b?
1181 }>{.gW++++++b?
1182 ?>{..W......b?
1183 ?>{..Wwww...b?
1184 ?>ww{{{{{mmmm?
1185 ?------------?
1186 ..............
1187 ..............
1188 ..............
1189 ..............
1190 Level:
1191 Vivian
1192 Gatinha 01
1193 Bricks:
1194 gggggggggggggg
1195 gggggggggggggg
1196 ggghhghhgggggg
1197 ggghhghhghhggg
1198 ggghhgggghhggg
1199 ggggghhhghhggg
1200 gggghhhhhggggg
1201 gggghhhhhggggg
1202 gggghhhhhggggg
1203 ggghhhhhhggggg
1204 ggghhhhhhggggg
1205 ggghhhhhgggggg
1206 gggggggggggggg
1207 **************
1208 **************
1209 **************
1210 **************
1211 **************
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..............
1219 ..............
1220 ..............
1221 ..............
1222 ..............
1223 ..............
1224 ..............
1225 ..............
1226 mmmmmmmmmmmmmm
1227 dddddddddddddd
1228 bbbbbbbbbbbbbb
1229 wwwwwwwwwwwwww
1230 00000000000000
1231 Level:
1232 vivian
1233 untitled
1234 Bricks:
1235 ..............
1236 ..............
1237 .!.!......!.!.
1238 ..*........*..
1239 .!.!......!@!.
1240 ..@........@.x
1241 ..@..xxxx..@xx
1242 ..@.xx..xxxxxy
1243 yy@xx!.!.xx!..
1244 xxxx..*...!!!.
1245 ...x.!@!.!!*!!
1246 .!.xx.@...!!!.
1247 !*!.x.@....!..
1248 .!..xy@....@..
1249 .@...xxx...@..
1250 .@.xxxyyxxx@..
1251 y@yxy.....xxx.
1252 xxxyy.....yyxx
1253 Bonus:
1254 ..............
1255 ..............
1256 .f.f......f.f.
1257 ..b........b..
1258 .f.f......f.f.
1259 ..............
1260 .....bbb......
1261 .....p..mm....
1262 .p...-.-...!..
1263 bbb*..b...d?!.
1264 ...*.-.-.!!m~!
1265 .!.*......{Wd.
1266 !*!........!..
1267 .!............
1268 ..............
1269 ...www........
1270 ..............
1271 ...w..........
1272 Level:
1273 vivian
1274 untitled
1275 Bricks:
1276 x*xj*j*jj*j*j*
1277 x*x#*#*#@*@*@j
1278 x*x#*#*#@*@***
1279 x*x#*#*#@*@@@j
1280 x*x#*#*#@*****
1281 x*x#*#*#@@@@@j
1282 x*x#*#*#*!*!*!
1283 x*x#*#*#!!*!*!
1284 x*x#*#*#***!*!
1285 ####*#*#!!!!*!
1286 *****#*#*****!
1287 ######*#!!!!!!
1288 *******#zzzzzz
1289 ########cccccc
1290 ..............
1291 ..............
1292 ..............
1293 ..............
1294 Bonus:
1295 .b.......m.m.b
1296 .b............
1297 .b...........b
1298 .b............
1299 mb...........b
1300 mb............
1301 wb.......m...m
1302 wb......jw...w
1303 wbj..........j
1304 ..............
1305 ..............
1306 ..............
1307 ..............
1308 ........w.....
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 vivian
1315 untitled
1316 Bricks:
1317 gggfgggggggggg
1318 ggfffghhggjjjg
1319 gjfffghhgjjjjj
1320 gjfffghhggjjjj
1321 ggfffggggggggg
1322 ggfffggggggggg
1323 ggg@gggggggggg
1324 eeeeeeeeeeeeee
1325 eeejjeeeeeeeee
1326 eeejjeeeeejeee
1327 jjjjjjjjjjjjjj
1328 gjjjjjjjjjjjgj
1329 ggjjggggjjjggj
1330 gggggggggjgggj
1331 gggggggggggggg
1332 gggggggggggggg
1333 gggggggggggggg
1334 gggggggggggggg
1335 Bonus:
1336 mmwbbwpbbb.5ms
1337 .mbmbmpp.bsm.m
1338 wjbm5pw.pbmm..
1339 .wbmpms.mmm5j.
1340 wbbbbw5ppbb?sm
1341 w?bbb5m.spm..s
1342 wmbpb+mp+bp5+m
1343 bppmwppmmbp+++
1344 pwpbmb++mpm.s+
1345 bbpj+mb+bmj+5s
1346 bbbjpmbppmmm++
1347 pbbbbbppbjpm.b
1348 .wwbwwbbmmmm.b
1349 m.m.mmjmm.....
1350 bbbbbbjbmmmbbb
1351 jjjjjjjbbbbbmm
1352 ppppppjppppppp
1353 wwwwwwjwwwwwww
1354 Level:
1355 noname
1356 fff
1357 Bricks:
1358 *#*#*#*#*#*#*#
1359 *#*#*#*#*#*#*#
1360 *#*#*#*#*#*#*#
1361 !@!@!@!@!@!@!#
1362 ..............
1363 ..............
1364 j!j!j!j!j!j!j!
1365 @*@*@*@*@*@*@*
1366 #*#*#*#*#*#*#*
1367 @*@*@*@*@*@*@*
1368 ..............
1369 j!j!j!j!j!j!j!
1370 @*@*@*@*@*@*@*
1371 #*#*#*#*#*#*#*
1372 @*@*@*@*@*@*@*
1373 jvjvjvjvjvjvjv
1374 ..............
1375 ..............
1376 Bonus:
1377 ..............
1378 ..............
1379 ..............
1380 p.*.m.m.m.*.p.
1381 ..............
1382 ..............
1383 .b.j.+.}.c.b.b
1384 ..............
1385 ..............
1386 .>.>.>.>.>.>..
1387 ..............
1388 .w.w.w.w.w.w.w
1389 ..............
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 ..............
1395 Level:
1396 noname
1397 fff
1398 Bricks:
1399 ..............
1400 !*************
1401 .............*
1402 jjjjjjjjjjjj.*
1403 #E#E#E#E#E#@.*
1404 jjjjjjjjjjjj.*
1405 .............*
1406 **************
1407 *.............
1408 *.jjjjjjjjjjjj
1409 *.@#E#E#E#E#E#
1410 *.jjjjjjjjjjjj
1411 *.............
1412 *.............
1413 **************
1414 ..............
1415 ..............
1416 zzzzzzzzzzzzzz
1417 Bonus:
1418 ..............
1419 mbbbbbbbbbbbbb
1420 .............b
1421 .............b
1422 .............b
1423 .............b
1424 .............b
1425 bbbbbbbbbbbbbb
1426 b.............
1427 b.............
1428 b.............
1429 b.............
1430 b.............
1431 b.............
1432 bbbbbbbbbbbbbb
1433 ..............
1434 ..............
1435 >>bbbwwwbbb>>>
1436 Level:
1437 noname
1438 Glabi
1439 Bricks:
1440 !jhhhhhhhhhhz!
1441 zjvv*vvv*vvv.z
1442 .j*v*v*v*v*v.*
1443 .jvv*vvv*vvv.*
1444 ..fffffffffffj
1445 ..vvv*vvv*vvvj
1446 *.v*v*v*v*v*vj
1447 ..vvv*vvv*vvvj
1448 ..gggggggggggj
1449 ..jvvv*vvv.vvv
1450 .*jv*v*v*v.v*v
1451 ..jvvv*vvv.vvv
1452 ..dddddddddddj
1453 ..vvv*vvv*vvvj
1454 *.v*v*v*v*v*vj
1455 ..vvv*vvv*vvvj
1456 ..............
1457 E............E
1458 Bonus:
1459 m............m
1460 .bbb.bbb.bbb..
1461 ..............
1462 .???.???.???..
1463 ..............
1464 ..***.***.***.
1465 ..............
1466 ..???.???.....
1467 ..............
1468 ...b>W.jjj.sss
1469 ..............
1470 .......???....
1471 ..............
1472 ..>>>.lll.???.
1473 ..............
1474 ..+w+.+w+.+w+.
1475 ..............
1476 ..............
1477 Level:
1478 noname
1479 Glabi
1480 Bricks:
1481 **************
1482 **************
1483 **************
1484 **************
1485 **************
1486 *****!!!******
1487 *****!!!******
1488 *****!*!******
1489 *****!*!******
1490 *****!!!******
1491 *****!!!******
1492 **************
1493 **************
1494 **************
1495 **************
1496 **************
1497 zzzzzzzzzzzzzz
1498 vvvvvvvvvvvvvv
1499 Bonus:
1500 **************
1501 mmmmmmmmmmmmmm
1502 pppppppppppppp
1503 **************
1504 mmmmmmmmmmmmmm
1505 bbbbbgggbbbbbb
1506 bbbbbgggbbbbbb
1507 bbbbbgjgbbbbbb
1508 fjfjfgjgfjfjff
1509 fffffgggffffff
1510 fjfjfgggfjfjff
1511 ffffffffffffff
1512 *j*j*f*f*j*j*f
1513 fbfbfbfbfbfbfb
1514 >f>f>f>f>f>f>f
1515 fcfcfcfcfcfcfc
1516 jjjjjjwjjjjjjj
1517 bbbbbbbbbbbbbb
1518 Level:
1519 noname
1520 r
1521 Bricks:
1522 !.......!*!.!*
1523 *!.....!*z*!*!
1524 !*!...!*z.z*!.
1525 .!*!.!*z.!!z*!
1526 ..!*!*z.!*!.z*
1527 ...!*z.!*!.!*z
1528 ..!*z.!*!.!*z*
1529 .!*z.!*!.!*z.!
1530 !*z.!*!.!*z.!*
1531 *z.!*!.!*z.!*z
1532 z*!*!.!*z.!*z*
1533 .!*!.!*z.!*z*z
1534 .!!.!*z.!*z*z*
1535 ...!*z.!*z*z*z
1536 ..!*z.!*z*z*z*
1537 .!*z.!*z*z*z*z
1538 !*z.!*z*z*z*z*
1539 *z.!*z*z*z*z*z
1540 Bonus:
1541 m.......m.w.m.
1542 .......b...b.w
1543 b.............
1544 .w............
1545 ..............
1546 ..............
1547 ......p.......
1548 .....p........
1549 ....p.........
1550 ..............
1551 ..............
1552 ...........*..
1553 ..........*...
1554 .........*.b..
1555 ........*.b.w.
1556 .......*.b.w..
1557 ......*.b.w...
1558 .....*.b.w....
1559 Level:
1560 noname
1561 Glabi
1562 Bricks:
1563 !...!.vk.j.k.j
1564 .*.*..vk.j.k.j
1565 ..!.!.vk.j.k.j
1566 !...!.vk.j.k.j
1567 .*.*..vk.j.k.j
1568 ..!.!.vk.j.k.j
1569 .*.*..vk.j.k.j
1570 !...!.cccccccc
1571 .*.*...bbbbbbb
1572 ..!.!...aaaaaa
1573 .*.*.....ccccc
1574 !...!.....bbbb
1575 .*.*.......aaa
1576 ..!.!.....bbbb
1577 .*.*.....ccccc
1578 !...!...aaaaaa
1579 .*.*...bbbbbbb
1580 ..!.!.cccccccc
1581 Bonus:
1582 j.....pW.f.m.m
1583 ......W*.f.f.W
1584 ....j.WW.f.f.p
1585 ......WW.*.f.l
1586 ......&*.f.w.l
1587 ..g...&W.f.f.l
1588 .*....WW.f.f.W
1589 j.....p.wbbbb>
1590 ...w.....wdddd
1591 ..g.j...bbbbbb
1592 ...........>cc
1593 ..........&&&m
1594 ...........{{{
1595 ..*.......fffw
1596 ..........wWWW
1597 *.......>>>g>>
1598 .w......*.>>.*
1599 ......ffffffff
1600 Level:
1601 noname
1602 Glabi
1603 Bricks:
1604 zzzzzzzzzzzzzz
1605 z************z
1606 z*cccccccccc*z
1607 z*czzzzzzzzc*z
1608 z*cz******zc*z
1609 z*cz*zzzz*zc*z
1610 z*cz*#!!#*zc*z
1611 z*cz*#!!#*zc*z
1612 z*cz*!!!!*zc*z
1613 z*cz*#!!#*zc*z
1614 z*cz*#**#*zc*z
1615 z*cz*####*zc*z
1616 z*cz*zzzz*zc*z
1617 z*cz******zc*z
1618 z*czzzzzzzzc*z
1619 z*cccccccccc*z
1620 z************z
1621 zzzzzzzzzzzzzz
1622 Bonus:
1623 bbbbbbbbbbbbbb
1624 ffffffffffffff
1625 ffffffffffffff
1626 fffbbbbbbbbfff
1627 ffff......ffff
1628 ffff.bbbb.ffff
1629 ffff..!!..ffff
1630 ffff..m*..ffff
1631 ffff.!pl!.ffff
1632 ffff..ws..ffff
1633 ffff......ffff
1634 ffff......ffff
1635 ffff.!jj!.ffff
1636 ffff......ffff
1637 ffffffffffffff
1638 ffffffffffffff
1639 ffffffffffffff
1640 wwwwwwwwwwwwww
1641 Level:
1642 noname
1643 Glabi
1644 Bricks:
1645 z************z
1646 *############*
1647 *#z********z#*
1648 *#*########*#*
1649 *#*#z****z#*#*
1650 *#*#*####*#*#*
1651 z#z#z#zz#z#z#z
1652 *#*#*#yy#*#*#*
1653 *#*#*#xx#*#*#*
1654 *#*#*#zz#*#*#*
1655 z#z#z#yy#z#z#z
1656 *#*#*#xx#*#*#*
1657 *#*#*#zz#*#*#*
1658 *#*#*#yy#*#*#*
1659 *#*#*#xx#*#*#*
1660 *#*#*#vv#*#*#*
1661 c@c@c@cc@c@c@c
1662 vvvvvvvvvvvvvv
1663 Bonus:
1664 *?00?>ww>?00?*
1665 0m..........m0
1666 0b*0?llll?0*b0
1667 0b0b......b0b0
1668 0b0b*?pp?*b0b0
1669 wb0b0b..b0b0bw
1670 bbbbbbmmbbbbbb
1671 0b?b0bjjb!b0b0
1672 +b+b+bggb+b+b+
1673 0b0b0b*jb0b0b0
1674 >*>*>bggb>*>*>
1675 !b0b0bj*b0b0b!
1676 0bdb0bggb0bdb0
1677 0b0b0b*jb0b0b0
1678 bbbbbbggbbbbbb
1679 0b0b0bjjb0b0b0
1680 0b0b0bggb0b0b0
1681 w>w>w>wfw>w>w>
1682 Level:
1683 noname
1684 untitled
1685 Bricks:
1686 .j**********j.
1687 .@E#E#..#E#E@.
1688 .E****!!****E.
1689 .#*!!!!!!!!*#.
1690 .E*!******!*E.
1691 .#*!*!!!!*!*#.
1692 .E*!*!**!*!*E.
1693 .@!!!!**!!!!@.
1694 .E*!*!!!!*!*E.
1695 .#*!******!*#.
1696 .E*!!!!!!!!*E.
1697 .#**********#.
1698 .E#E#E##E#E#E.
1699 .@kkkkkkkkkk@.
1700 .@jjjjjjjjjj@.
1701 ..kkkkkkkkkk..
1702 ...jjjjjjjj...
1703 ..............
1704 Bonus:
1705 .m..........m.
1706 .jjjjj..jjjjj.
1707 .j*...++....j.
1708 .j.bbb++bbb.j.
1709 .j.p......p.j.
1710 .j.p......p.j.
1711 .j..........j.
1712 .j...?..?...j.
1713 .jwwwwwwwwwwj.
1714 .jbbbbbbbbbbj.
1715 .jmmmmmmmmmmj.
1716 .jppppppppppj.
1717 .jpppppjppppj.
1718 .>>>??????c>>.
1719 .>bbbbbbbbbb>.
1720 ..bbbbwwbbbb..
1721 ...bbbbbbbb...
1722 ..............
1723 Level:
1724 i
1725 untitled
1726 Bricks:
1727 *********.zzzz
1728 @@@.###**.zzzz
1729 @!!!!!#**..##z
1730 @!@@@!#****##z
1731 @!@!@!.*****#z
1732 @!@@@!#*****#z
1733 @!!!!!#v.***#z
1734 #######v.**##z
1735 vvvvvv.v.**##z
1736 .......v.**##z
1737 ******.v.*###z
1738 ******.v.####z
1739 ******.v#####z
1740 .......######z
1741 vvvvv########z
1742 ......******..
1743 **************
1744 **************
1745 Bonus:
1746 ..........m*p.
1747 ..........m*p.
1748 .mmmmm........
1749 .m...m........
1750 .m.m.m........
1751 .m...m........
1752 .mmmmm.b......
1753 .......b......
1754 bbbbbb.b......
1755 .......b...ccc
1756 .......b..****
1757 .......b.ppppp
1758 .......bbbbbbb
1759 .......wwwwwww
1760 wwwwwmmmmmmmm.
1761 ..............
1762 ..............
1763 ..............
1764 Level:
1765 noname
1766 untitled
1767 Bricks:
1768 **************
1769 vvvvvvvvvvvvvv
1770 **!!!!!!!!!!**
1771 zzzzzzzzzzzzzz
1772 **************
1773 vv!!!!!!!!!!vv
1774 **************
1775 vv!!!!!!!!!!vv
1776 **************
1777 vv!!!!!!!!!!vv
1778 **************
1779 vv!!!!!!!!!!vv
1780 **************
1781 vvvvvvvvvvvvvv
1782 v*vvv*vv*vvv*v
1783 vvvvvvvvvvvvvv
1784 **************
1785 zzzzzzzzzzzzzz
1786 Bonus:
1787 m.m.b.b.p.p..m
1788 ..............
1789 .............m
1790 ..............
1791 .........j...m
1792 ..............
1793 .............m
1794 ..............
1795 ...*.........m
1796 ..............
1797 .............m
1798 ..............
1799 .............b
1800 bbbbbbbbbbbbbb
1801 bwbbbbbbwbbbbb
1802 bbbbbbbbbbbbbb
1803 wwwwwwwwwwwwww
1804 .*.*.*.*.*.*..
1805 Level:
1806 noname
1807 untitled
1808 Bricks:
1809 *E*#*#********
1810 #@##E#EE#E##@*
1811 **************
1812 *@##E#EE#E##@#
1813 **************
1814 #@##E#EE#E##@*
1815 **************
1816 *@##E#EE#E##@#
1817 **************
1818 #@##E#EE#E##@*
1819 **************
1820 *@##E#EE#E##@#
1821 **************
1822 #@##E#EE#E##@*
1823 **************
1824 *@##E#EE#E##@#
1825 *************z
1826 #@##E#EE#E###z
1827 Bonus:
1828 j.mmmwwmmmmjjj
1829 .............j
1830 gggggggg>jjjjj
1831 }.............
1832 bbbbbbwbbbbbbb
1833 .............>
1834 ppppppwppppppp
1835 }.............
1836 ------w-------
1837 .............}
1838 >bbbbbwbbbbbbb
1839 b.............
1840 ******w*******
1841 .............}
1842 ++++++w+++++>+
1843 }.............
1844 l>llllwlllllll
1845 .............w
1846 Level:
1847 noname
1848 untitled
1849 Bricks:
1850 **************
1851 *zzzzzzzzzzzz*
1852 !!!!!!!!!!!!!!
1853 *zzzzzzzzzzzz*
1854 **************
1855 *zzzzzzzzzzzz*
1856 !!!!!!!!!!!!!!
1857 *zzzzzzzzzzzz*
1858 **************
1859 *zzzzzzzzzzzz*
1860 !!!!!!!!!!!!!!
1861 *zzzzzzzzzzzz*
1862 **************
1863 *zzzzzzzzzzzz*
1864 !!!!!!!!!!!!!!
1865 *zzzzzzzzzzzz*
1866 **************
1867 zzzzzzzzzzzzzz
1868 Bonus:
1869 bbbbbbjmbbbbbb
1870 .mmmmmmmmmmmm.
1871 bbbbbb.jbbbbbb
1872 .mmmmmmmmmmmm.
1873 bbbbbbj.bbbbbb
1874 .!d!d!d!d!d!d.
1875 .......j......
1876 .d!d!d!d!d!d!.
1877 bbbbbb..bbbbbb
1878 .ffffffffffff.
1879 .......j......
1880 .ffffffffffff.
1881 bbbb.bj.bbbbbb
1882 .ffffffffffff.
1883 .......j......
1884 .ffffffffffff.
1885 bbbbbbjbbbbbbb
1886 ..............
1887 Level:
1888 noname
1889 untitled
1890 Bricks:
1891 **************
1892 zzzzzzzzzzzzzz
1893 zzzzzzzzzzzzzz
1894 z*z*z*z*z*z*z*
1895 *!*!*!*!*!*!*!
1896 z!z!z!z!z!z!z!
1897 z*z*z*z*z*z*z*
1898 *z*z*z*z*z*z*z
1899 !z!z!z!z!z!z!z
1900 !*!*!*!*!*!*!*
1901 *z*z*z*z*z*z*z
1902 zzzzzzzzzzzzzz
1903 z*z*z*z*z*z*z*
1904 *!*!*!*!*!*!*!
1905 z!z!z!z!z!z!z!
1906 *z*z*z*z*z*z*z
1907 z*z*z*z*z*z*z*
1908 z!z!z!z!z!z!z!
1909 Bonus:
1910 jjjjjjjjjjjjjj
1911 **************
1912 ..............
1913 bbbbbb........
1914 ......jbbbbbbb
1915 ..............
1916 bbbbbb........
1917 ......jbbbbbbb
1918 ..............
1919 bbbbbb........
1920 ......jbbbbbbb
1921 ..............
1922 bbbbbb........
1923 ......jbbbbbbb
1924 ..............
1925 bbbbbbj.......
1926 .......bbbbbbb
1927 ..............
1928 Level:
1929 noname
1930 untitled
1931 Bricks:
1932 gggggggggggggg
1933 g*aaaaaaaaaa*g
1934 gaggggggggggag
1935 gag*aaaaaa*gag
1936 gagaggggggagag
1937 gagagzzzzgagag
1938 gagagz!!zgagag
1939 gagagzzzzgagag
1940 gagaggggggagag
1941 gag*aaaaaa*gag
1942 gaggggggggggag
1943 g*aaaaaaaaaa*g
1944 gggggggggggggg
1945 zzzzzzzzzzzzzz
1946 **************
1947 zzzzzzzzzzzzzz
1948 **************
1949 zzzzzzzzzzzzzz
1950 Bonus:
1951 b...b..b.b...b
1952 ..............
1953 b.b........b.b
1954 ..b........b..
1955 *.b........b.*
1956 ..b..*ppm..b..
1957 .cb..bllb.cb..
1958 ..b..mww*..b..
1959 w.b........b.w
1960 ..b...j....b..
1961 ..b........b..
1962 ....wbwbwbw...
1963 ..............
1964 f*c*f*c*f*c*f*
1965 ..............
1966 ..............
1967 ..............
1968 ..............
1969 Level:
1970 noname
1971 untitled
1972 Bricks:
1973 !*!*!*!*!*!*!*
1974 *!*!*!*!*!*!*!
1975 !*!*!*!*!*!*!*
1976 *!*!*!*!*!*!*!
1977 !*!*!*!*!*!*!*
1978 *!*!*!*!*!*!*!
1979 !*!*!*!*!*!*!*
1980 *!*!*!*!*!*!*!
1981 !*!*!*!*!*!*!*
1982 *!*!*!*!*!*!*!
1983 !*!*!*!*!*!*!*
1984 *!*!*!*!*!*!*!
1985 !*!*!*!*!*!*!*
1986 *!*!*!*!*!*!*!
1987 !*!*!*!*!*!*!*
1988 *!*!*!*!*!*!*!
1989 !*!*!*!*!*!*!*
1990 *!*!*!*!*!*!*!
1991 Bonus:
1992 m333333333333m
1993 l3l3l3l3l3l3l3
1994 >>>>>>>>>>>>>>
1995 >>>>>>j>>>>>>>
1996 llllllllllllll
1997 llllll*lllllll
1998 bbblgbbbbbbbb*
1999 *3>3g3g3g3>3*3
2000 3*3g3gWg3g3g3g
2001 b}b}b}*}b}b}b}
2002 }}}}}}}}}}}}}}
2003 -p-p-{-{-{-{-{
2004 p-p-p-{-{-{-{-
2005 f+f+f+f+f+f+f+
2006 sWsWsWsWsWsWsW
2007 gsgsgsgsgsgsgs
2008 {}{}{}{}{}{}{}
2009 --------------
2010 Level:
2011 noname
2012 untitled
2013 Bricks:
2014 c************c
2015 c!!!!!!!!!!!!c
2016 c************c
2017 c!!!!!!!!!!!!c
2018 c************c
2019 c!!!!!!!!!!!!c
2020 c************c
2021 c!!!!!!!!!!!!c
2022 c************c
2023 c!!!!!!!!!!!!c
2024 c************c
2025 c!!!!!!!!!!!!c
2026 c************c
2027 c!!!!!!!!!!!!c
2028 c************c
2029 c!!!!!!!!!!!!c
2030 c************c
2031 czzzzzzzzzzzzc
2032 Bonus:
2033 >jjjjjjjjjjjj>
2034 l************l
2035 >bbbbbbjbbbbb>
2036 ..............
2037 >bbbbbjbbbbbb>
2038 ..............
2039 >bbbbbbjbbbbb>
2040 ..............
2041 >bbbbbjbbbbbb>
2042 ..............
2043 >bbbbbbjbbbbb>
2044 ..............
2045 >bbbbbjbbbbbb>
2046 ..............
2047 >bbbbbbjbbbbb>
2048 ..............
2049 >bbbbbjbbbbbb>
2050 ..............
2051 Level:
2052 noname
2053 untitled
2054 Bricks:
2055 *j*j*j**j*j*j*
2056 j.j.j.jj.j.j.j
2057 j!.!.!..!.!.!j
2058 j*j*j*jj*j*j*j
2059 j............j
2060 *j*j*j**j*j*j*
2061 j............j
2062 j.*.*.**.*.*.j
2063 jc!c!c!!c!c!cj
2064 j.c.c.cc.c.c.j
2065 j............j
2066 j.*.*.**.*.*.j
2067 j.j.j.jj.j.j.j
2068 ..............
2069 ..............
2070 ..............
2071 ..............
2072 ..............
2073 Bonus:
2074 *b?.?.j?.?.?b*
2075 ..............
2076 .....b..b.....
2077 .?.?.?..?.?.?.
2078 ..............
2079 ?.?.?.c?.?.?.?
2080 ..............
2081 w.?.w.??.w.?.w
2082 *..b.*...b*...
2083 .............*
2084 *............*
2085 w.?.?.??.?.?.w
2086 ..>.>....>.>..
2087 ..............
2088 ..............
2089 ..............
2090 ..............
2091 ..............
2092 Level:
2093 noname
2094 untitled
2095 Bricks:
2096 *!..........!*
2097 !!.********.!!
2098 ..............
2099 @..********..@
2100 ..............
2101 zzEEEEEEEEEEzz
2102 vvv********vvv
2103 !!!!!!!!!!!!!!
2104 ..............
2105 ..............
2106 ..............
2107 ..............
2108 ..............
2109 ..............
2110 ..............
2111 ..............
2112 ..............
2113 ..............
2114 Bonus:
2115 mb..........bm
2116 bb.jjjjcjjj.bb
2117 ..............
2118 ...jjjcjjjj...
2119 ..............
2120 ww..........ww
2121 .*..........*.
2122 ....&.*.*.....
2123 ..............
2124 ..............
2125 ..............
2126 ..............
2127 ..............
2128 ..............
2129 ..............
2130 ..............
2131 ..............
2132 ..............
2133 Level:
2134 noname
2135 untitled
2136 Bricks:
2137 j..kkkkkkkkkkk
2138 .j............
2139 !.j....j...j!!
2140 *..j....j...j*
2141 j@..j....j..Ej
2142 E...@j....j..@
2143 !!j..Ej....j!!
2144 *j....@j....j*
2145 jE.....Ej....j
2146 @....j.v@j....
2147 ....jE.vvEj...
2148 ...j@v..vv@j..
2149 !!jEvv...vvEj*
2150 *j@vv.....vv@j
2151 jEvv.......vvE
2152 @vv.........vv
2153 vv............
2154 ..............
2155 Bonus:
2156 *..bwb*bwb*bwm
2157 ..............
2158 .......b...>..
2159 ............>m
2160 >........b...l
2161 ..............
2162 ...........b..
2163 .......w.....m
2164 *.............
2165 .....c........
2166 ..............
2167 ..............
2168 ..w...........
2169 .j...........m
2170 p.............
2171 ..............
2172 ..............
2173 ..............
2174 Level:
2175 noname
2176 untitled
2177 Bricks:
2178 *..*..*..*.*.*
2179 *.....*......*
2180 EEEEEEEEEE#..*
2181 #.........*..*
2182 *.*.*.*.*.*..*
2183 *.........*..#
2184 *..#EEEEEEEEE#
2185 *..*......*..#
2186 *..*......*..#
2187 #..*.*..*.*..*
2188 #E.*......#..*
2189 #EEEEEEEEE#..*
2190 ......*......*
2191 ......*.*.*..*
2192 ......*......#
2193 .cccc##EEEEEEE
2194 ..............
2195 ..............
2196 Bonus:
2197 l..m..m..m.m.j
2198 l.....w......j
2199 .............*
2200 *.........j..b
2201 w.m.m.m.m.b..>
2202 j.........*..*
2203 b.............
2204 b..*......w..b
2205 b..j......w..b
2206 w..w.m..m.*..s
2207 s..s......s..b
2208 .............b
2209 ......w......b
2210 ......w.m.m..b
2211 ......w......>
2212 ..............
2213 ..............
2214 ..............
2215 Level:
2216 noname
2217 untitled
2218 Bricks:
2219 **************
2220 **************
2221 **************
2222 **************
2223 ****#***#*****
2224 ***#!#*#!#****
2225 ****#***#*****
2226 **************
2227 ******a*******
2228 ******a*******
2229 *****aaa******
2230 **************
2231 **************
2232 **************
2233 ****aaaaa*****
2234 **************
2235 **************
2236 **************
2237 Bonus:
2238 mmmmmmmmmmmmmm
2239 wwwwwwwwwwwwww
2240 bbbbbbbbbbbbbb
2241 ..............
2242 ..............
2243 ....l...l.....
2244 ..............
2245 ..............
2246 ..............
2247 ..............
2248 ..............
2249 ..............
2250 ..............
2251 ..............
2252 ....jjjjj.....
2253 ..............
2254 ..............
2255 ..............
2256 Level:
2257 noname
2258 untitled
2259 Bricks:
2260 .kkkkk..kkkkk.
2261 k............k
2262 ..!!!....!!!..
2263 ..!*!....!*!..
2264 ..!*!....!*!..
2265 ..!!!.ee.!!!..
2266 ......ee......
2267 ......ee......
2268 .....eeee.....
2269 .....eeee.....
2270 .....ehhe.....
2271 ..............
2272 ..............
2273 ..d.dddddd.d..
2274 ...djjjjjjd...
2275 ....dddddd....
2276 ..............
2277 ..............
2278 Bonus:
2279 ....bb..bb....
2280 ..............
2281 ..............
2282 ...m......*...
2283 ..............
2284 ......p.......
2285 ..............
2286 ..............
2287 ..............
2288 ..............
2289 ......jj......
2290 ..............
2291 ..............
2292 ..............
2293 ....ww..ww....
2294 ..............
2295 ..............
2296 ..............
2297 Level:
2298 noname
2299 untitled
2300 Bricks:
2301 !************!
2302 !............!
2303 !............!
2304 vzzzzzzzzzzzzv
2305 !vvvvvvvvvvvv!
2306 !............!
2307 vzzzzzzzzzzzzv
2308 !............!
2309 !vvvvvvvvvvvv!
2310 vzzzzzzzzzzzzv
2311 !............!
2312 vccccccccccccv
2313 !............!
2314 vzzzzzzzzzzzzv
2315 ..............
2316 ..............
2317 ..............
2318 ..............
2319 Bonus:
2320 bmbmbmjmbmbmbb
2321 p............p
2322 b............b
2323 w.....p......w
2324 .c..b...m..b..
2325 ..............
2326 ..............
2327 ..............
2328 .....***....c.
2329 b............b
2330 ..............
2331 ..............
2332 ..............
2333 .wwww.....www.
2334 ..............
2335 ..............
2336 ..............
2337 ..............
2338 Level:
2339 noname
2340 untitled
2341 Bricks:
2342 *v!.*.!.*.!v*v
2343 v!.*.!.*.!.*v!
2344 !.*.!.*.!.*.!v
2345 .*.!.*.!.*.!.*
2346 *.!.*.!.*.*.!.
2347 .!.*.!.*.!.*.!
2348 !.*.!.*.*.!.*.
2349 .*.!.*.!.*.!.*
2350 *.!.*.!.!.*.!.
2351 .!.*.!.*.!.*.!
2352 !.*.!.*.*.!.*.
2353 .*.!.*#.#*.!.*
2354 *.!.*##.##*.!.
2355 .!.*##...##*.!
2356 !.*##.....##*.
2357 .*##.......##*
2358 *##.........##
2359 @............@
2360 Bonus:
2361 mjb...*...wjcm
2362 jb...*.p....j.
2363 b...*.......wj
2364 .......b......
2365 ..............
2366 .......l.....w
2367 ..............
2368 .......p......
2369 ..............
2370 .......b......
2371 c.............
2372 .....w!.!w....
2373 ....w!!.!!w...
2374 ....!!...!!..*
2375 ...!!.....!!..
2376 ..!!.......!!.
2377 .!!.........!!
2378 !............!
2379 Level:
2380 noname
2381 untitled
2382 Bricks:
2383 !v#z@#**#@z#v!
2384 !v#z@!**!@z#v!
2385 !v#z@#EE#@z#v!
2386 !v#z@@@@@@z#v!
2387 !v#zzzzzzzz#v!
2388 !v##########v!
2389 !vvvvvvvvvvvv!
2390 !!!!!!!!!!!!!!
2391 ..............
2392 @............@
2393 *............*
2394 @............@
2395 *............*
2396 @............@
2397 *............*
2398 @............@
2399 ..............
2400 ..............
2401 Bonus:
2402 f>.b..ll..b.>f
2403 f>.b..ll..b.>f
2404 f..b......b..f
2405 f..m......m..f
2406 f..mmwjjwmm..f
2407 f............f
2408 f............f
2409 ffffffffffffff
2410 ..............
2411 ..............
2412 m............m
2413 ..............
2414 b............b
2415 ..............
2416 w............w
2417 ..............
2418 ..............
2419 ..............
2420 Level:
2421 noname
2422 untitled
2423 Bricks:
2424 #*#*@...c.c***
2425 #*#*#...c.c***
2426 #*#*#...c.c***
2427 #*#*#..@######
2428 #.#.#..c.c.***
2429 #c#c#..c.c.***
2430 #c#c#..c.c.***
2431 #c#c#..c.c.***
2432 #c@c#..@######
2433 ..............
2434 ..............
2435 ..............
2436 ..............
2437 ..............
2438 ..............
2439 ..............
2440 ..............
2441 ..............
2442 Bonus:
2443 .m.m....b.b>>m
2444 .>.>....*.w>>>
2445 .w.w....w.b>>>
2446 .p.p..........
2447 .......b.b.>>m
2448 .b.*...*.*.>>>
2449 .w.w...b.w.>>>
2450 .*.b...w.b.>>>
2451 .w.w..........
2452 ..............
2453 ..............
2454 ..............
2455 ..............
2456 ..............
2457 ..............
2458 ..............
2459 ..............
2460 ..............
2461 Level:
2462 noname
2463 untitled
2464 Bricks:
2465 !.!.!.!.!.!.!.
2466 .*.*.*.*.*.*.*
2467 !.!.!.!.!.!.!.
2468 ..............
2469 .!...!..!...!.
2470 !*!.!*!!*!.!*!
2471 .!...!..!...!.
2472 ...*......*...
2473 ..............
2474 !!!.!!!!!!.!!!
2475 v*v.v*vv*v.v*v
2476 vvv.vvvvvv.vvv
2477 ccc.cccccc.ccc
2478 ..............
2479 ..............
2480 ..............
2481 ..............
2482 ..............
2483 Bonus:
2484 *...b.m...b.*.
2485 ..............
2486 ....w...l.w...
2487 ..............
2488 ..............
2489 b.....j......b
2490 ..............
2491 ..............
2492 ..............
2493 &............&
2494 ..............
2495 .............s
2496 .w.....>......
2497 ..............
2498 ..............
2499 ..............
2500 ..............
2501 ..............
2502 Level:
2503 noname
2504 untitled
2505 Bricks:
2506 ......!!......
2507 *...*.**.*...*
2508 .!.!..!!..!.!.
2509 ..*...**...*..
2510 .!.!..!!..!.!.
2511 *...*.**.*...*
2512 ......!!......
2513 ......**......
2514 cccccccccccccc
2515 *!*!*!*!*!*!*!
2516 zczczczzczczcz
2517 ..............
2518 ..............
2519 ..............
2520 ..............
2521 ..............
2522 ..............
2523 ..............
2524 Bonus:
2525 ......bb......
2526 ..............
2527 .m..........m.
2528 ..............
2529 ...*......*...
2530 ..............
2531 ......jj......
2532 ..............
2533 wsp..w..w...sw
2534 ..............
2535 b>b>bwbbwb>b>b
2536 ..............
2537 ..............
2538 ..............
2539 ..............
2540 ..............
2541 ..............
2542 ..............
2543 Level:
2544 noname
2545 untitled
2546 Bricks:
2547 ****..##..****
2548 ***@z....z@***
2549 ***@!....!@***
2550 ***@!....!@***
2551 ***@!....!@***
2552 ***@!....!@***
2553 z@@@!....!@***
2554 !!!!!....!@***
2555 !!!!!....!@***
2556 !!!!!....!@***
2557 !!!!!....!@@@@
2558 !!!!!....!!!!!
2559 ..............
2560 ..............
2561 ..............
2562 ..............
2563 ..............
2564 ..............
2565 Bonus:
2566 bbbb.......bwm
2567 www........bwm
2568 mmm.>....f.bwm
2569 jjj.>....f.bwm
2570 ....>....f.bwm
2571 ....>....f.bwm
2572 ....c....f.bwm
2573 m**mc....f.bwm
2574 wwwwc....f.bwm
2575 bb.......f...j
2576 .........f....
2577 .........fffff
2578 ..............
2579 ..............
2580 ..............
2581 ..............
2582 ..............
2583 ..............
2584 Level:
2585 noname
2586 untitled
2587 Bricks:
2588 *yzvzy**yzvzy*
2589 yyzvzyyyyzvzyy
2590 zzzvzzzzzzvzzz
2591 vvvvvvvvvvvvvv
2592 vvv@vvvvvv@vvv
2593 vvvv*vvvv*vvvv
2594 zzzv!*vv*!vzzz
2595 yyzvv!**!vvzyy
2596 *yzvvv!!vvvzy*
2597 yyzvv!**!vvzyy
2598 zzzv!*vv*!vzzz
2599 vvvv*vvvv*vvvv
2600 ***@vvvvvv@***
2601 ***#jjjjjj#***
2602 ####jjjjjj####
2603 ..............
2604 ..............
2605 ..............
2606 Bonus:
2607 l..*..ll..*..l
2608 .*.*.*..*.*.*.
2609 ..b*b....b*b..
2610 ****??????****
2611 m??.jjjjjj.??m
2612 fff-cffffc-fff
2613 ..b-..!!..-b..
2614 .*.-?....?-.*.
2615 l..-?j..j?-..l
2616 .*.-?.>>.?-.*.
2617 ..b-..cc..-b..
2618 !!!-*>>>>*-!!!
2619 +sw.ffffff.+sw
2620 jjj..b.b.b.jjj
2621 ....w.w.w.....
2622 ..............
2623 ..............
2624 ..............
2625 Level:
2626 noname
2627 untitled
2628 Bricks:
2629 ........@.....
2630 !!!!!!!.......
2631 !*****!...!!!.
2632 !*!!!*!...!*!.
2633 !*!*!*!...!!!.
2634 !*!!!*!.......
2635 !*****!.......
2636 !!!!!!!......@
2637 ..............
2638 @.............
2639 .......!!!!!!!
2640 .......!*****!
2641 .!!!...!*!!!*!
2642 .!*!...!*!*!*!
2643 .!!!...!*!!!*!
2644 .......!*****!
2645 .......!!!!!!!
2646 ..............
2647 Bonus:
2648 ..............
2649 *b....b.......
2650 ..........b.m.
2651 ..bbb......l..
2652 ...l......fff.
2653 ..............
2654 ..............
2655 ffffff*.......
2656 ..............
2657 ..............
2658 .......*b....*
2659 .............b
2660 ..*b.....www..
2661 ..l.......l...
2662 .fff...w.....w
2663 .......w.....w
2664 .......fffffff
2665 ..............
2666 Level:
2667 noname
2668 untitled
2669 Bricks:
2670 jjjjjjjjjjjjjj
2671 **************
2672 jjjjjjjjjjjjjj
2673 **************
2674 !!!!!!!!!!!!!!
2675 **************
2676 !!!!!!!!!!!!!!
2677 **************
2678 !!!!!!!!!!!!!!
2679 **************
2680 !!!!!!!!!!!!!!
2681 **************
2682 !!!!!!!!!!!!!!
2683 **************
2684 !!!!!!!!!!!!!!
2685 zzzzzzzzzzzzzz
2686 ..............
2687 ..............
2688 Bonus:
2689 bwbmbmbjbwbwbw
2690 ..............
2691 ffffffffffffff
2692 b.............
2693 ..............
2694 .............b
2695 ..............
2696 b.............
2697 ..............
2698 .............b
2699 ..............
2700 b.............
2701 ..............
2702 .............b
2703 ......w.......
2704 ..............
2705 ..............
2706 ..............
2707 Level:
2708 noname
2709 untitled
2710 Bricks:
2711 f.*.j..d.i.**.
2712 .f.j*.d!..i..g
2713 *.f..d..*..ig.
2714 .j.fd.*!*.*gi.
2715 j..df.*!..g..i
2716 j.d..f.!.g..i.
2717 .d.**!f.g..i..
2718 d.j.*!!f..i.!*
2719 !d.j.!g.fi!.!*
2720 !.d.jg..if*.!*
2721 *..dgj.i.!f.!*
2722 *..gd.i.**.f..
2723 .*g!.i.j..*.f.
2724 .g.!i.d.j....f
2725 g*.i...d.j..f.
2726 ..i!***!d.jf..
2727 .i..***!.dfj..
2728 i........fd.j.
2729 Bonus:
2730 b...*.........
2731 .b.*..........
2732 ..b.........*.
2733 .*.b..........
2734 *...b.........
2735 .....b......b.
2736 ......w.......
2737 .....*.w..b...
2738 ...m....w.....
2739 *....m...w....
2740 .......m..w.*.
2741 ....w.b.......
2742 .*...b........
2743 ..............
2744 ............*.
2745 ..f.......f...
2746 .f.........f..
2747 f...........f.
2748 Level:
2749 vivian
2750 untitled
2751 Bricks:
2752 gggggggggggggg
2753 gggggggggggggg
2754 ggghhghhgggggg
2755 ggghhghhghhggg
2756 ggghhgggghhggg
2757 ggggghhhghhggg
2758 gggghhhhhggggg
2759 gggghhhhhggggg
2760 gggghhhhhggggg
2761 ggghhhhhhggggg
2762 ggghhhhhhggggg
2763 ggghhhhhgggggg
2764 gggggggggggggg
2765 **************
2766 **************
2767 **************
2768 **************
2769 **************
2770 Bonus:
2771 ..............
2772 ..............
2773 ..............
2774 ..............
2775 ..............
2776 ..............
2777 ..............
2778 ..............
2779 ..............
2780 ..............
2781 ..............
2782 ..............
2783 ..............
2784 mmmmmmmmmmmmmm
2785 dddddddddddddd
2786 bbbbbbbbbbbbbb
2787 wwwwwwwwwwwwww
2788 00000000000000
2789 Level:
2790 vivian
2791 untitled
2792 Bricks:
2793 ..............
2794 ..............
2795 .!.!......!.!.
2796 ..*........*..
2797 .!.!......!@!.
2798 ..@........@.x
2799 ..@..xxxx..@xx
2800 ..@.xx..xxxxxy
2801 yy@xx!.!.xx!..
2802 xxxx..*...!!!.
2803 ...x.!@!.!!*!!
2804 .!.xx.@...!!!.
2805 !*!.x.@....!..
2806 .!..xy@....@..
2807 .@...xxx...@..
2808 .@.xxxyyxxx@..
2809 y@yxy.....xxx.
2810 xxxyy.....yyxx
2811 Bonus:
2812 ..............
2813 ..............
2814 .f.f......f.f.
2815 ..b........b..
2816 .f.f......f.f.
2817 ..............
2818 .....bbb......
2819 .....p..mm....
2820 .p...-.-...!..
2821 bbb*..b...d?!.
2822 ...*.-.-.!!m~!
2823 .!.*......{Wd.
2824 !*!........!..
2825 .!............
2826 ..............
2827 ...www........
2828 ..............
2829 ...w..........
2830 Level:
2831 vivian
2832 untitled
2833 Bricks:
2834 x*xj*j*jj*j*j*
2835 x*x#*#*#@*@*@j
2836 x*x#*#*#@*@***
2837 x*x#*#*#@*@@@j
2838 x*x#*#*#@*****
2839 x*x#*#*#@@@@@j
2840 x*x#*#*#*!*!*!
2841 x*x#*#*#!!*!*!
2842 x*x#*#*#***!*!
2843 ####*#*#!!!!*!
2844 *****#*#*****!
2845 ######*#!!!!!!
2846 *******#zzzzzz
2847 ########cccccc
2848 ..............
2849 ..............
2850 ..............
2851 ..............
2852 Bonus:
2853 .b.......m.m.b
2854 .b............
2855 .b...........b
2856 .b............
2857 mb...........b
2858 mb............
2859 wb.......m...m
2860 wb......jw...w
2861 wbj..........j
2862 ..............
2863 ..............
2864 ..............
2865 ..............
2866 ........w.....
2867 ..............
2868 ..............
2869 ..............
2870 ..............
2871 Level:
2872 vivian
2873 untitled
2874 Bricks:
2875 gggfgggggggggg
2876 ggfffghhggjjjg
2877 gjfffghhgjjjjj
2878 gjfffghhggjjjj
2879 ggfffggggggggg
2880 ggfffggggggggg
2881 ggg@gggggggggg
2882 eeeeeeeeeeeeee
2883 eeejjeeeeeeeee
2884 eeejjeeeeejeee
2885 jjjjjjjjjjjjjj
2886 gjjjjjjjjjjjgj
2887 ggjjggggjjjggj
2888 gggggggggjgggj
2889 gggggggggggggg
2890 gggggggggggggg
2891 gggggggggggggg
2892 gggggggggggggg
2893 Bonus:
2894 mmwbbwpbbb.5ms
2895 .mbmbmpp.bsm.m
2896 wjbm5pw.pbmm..
2897 .wbmpms.mmm5j.
2898 wbbbbw5ppbb?sm
2899 w?bbb5m.spm..s
2900 wmbpb+mp+bp5+m
2901 bppmwppmmbp+++
2902 pwpbmb++mpm.s+
2903 bbpj+mb+bmj+5s
2904 bbbjpmbppmmm++
2905 pbbbbbppbjpm.b
2906 .wwbwwbbmmmm.b
2907 m.m.mmjmm.....
2908 bbbbbbjbmmmbbb
2909 jjjjjjjbbbbbmm
2910 ppppppjppppppp
2911 wwwwwwjwwwwwww
0 Version: 1.00
1 Level:
2 Ade
3 Green Wall
4 Bricks:
5 ffcfffcfffcfcf
6 fccfcfcfcccfcf
7 ffcfffcfffccfc
8 fccfcfcccfccfc
9 ffcfcfcfffccfc
10 cccccccccccccc
11 ##############
12 xxxxxxxxxxxxxx
13 yyyyyyyyyyyyyy
14 zfzfzfzzfzfzfz
15 fzfzfzffzfzfzf
16 zfzfzfzzfzfzfz
17 fzfzfzffzfzfzf
18 zfzfzfzzfzfzfz
19 yyyyyyyyyyyyyy
20 xxxxxxxxxxxxxx
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ....&.44.&....
33 ..............
34 ..............
35 ..............
36 ......&&......
37 .&..........&.
38 ..............
39 .....m..m.....
40 ..............
41 ..............
42 Level:
43 Ade
44 Dont Lose The Ball
45 Bricks:
46 ..............
47 ..............
48 ..............
49 .....#ff#.....
50 .....####.....
51 ......aa......
52 ......##......
53 xaxax.aa.xaxax
54 a###a.##.a###a
55 x#f#x.aa.x#f#x
56 a###a.##.a###a
57 xa#ax.aa.xa#ax
58 ax#xa.##.ax#xa
59 xa#ax.aa.xa#ax
60 ax#xa.##.ax#xa
61 xa#ax.aa.xa#ax
62 axxxa.##.axxxa
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ......mm......
69 ..............
70 ..............
71 ..............
72 ..............
73 ..............
74 ..&........&..
75 ..............
76 ......&b..&...
77 ..............
78 ..............
79 ...4......4...
80 ..............
81 ..............
82 ..............
83 Level:
84 Ade
85 No Name
86 Bricks:
87 ##############
88 ##############
89 ..............
90 ....xxxxxx....
91 ...yyyyyyyy...
92 ##zzzzzzzzzz##
93 abc.......cba#
94 abc#######cba#
95 abc#fffff#cba#
96 abc#fffff#cba#
97 abc#fffff#cba#
98 abc#fffff#cba#
99 abc#######cba#
100 abc.......cba#
101 ##zzzzzzzzzz##
102 ...yyyyyyyy...
103 ....xxxxxx....
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 .....m..m.....
112 ..............
113 ..............
114 .&..........&.
115 .....4..4.....
116 .....l..l.....
117 ..............
118 ..............
119 ..............
120 .....m..m.....
121 ..............
122 ..............
123 ..............
124 Level:
125 Ade
126 Stairway to Heaven
127 Bricks:
128 ..............
129 f............f
130 #f..........f#
131 f#f........f#f
132 .f#f......f#f.
133 ..f#f....f#f..
134 ...f#f..f#f...
135 ....f#ff#f....
136 .....f##f.....
137 .....f##f.....
138 ....f#ff#f....
139 ...f#f..f#f...
140 ..f#f....f#f..
141 .f#f......f#f.
142 f#f........f#f
143 #f..........f#
144 f............f
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 .....m..m.....
154 ......44......
155 .....l..l.....
156 ..............
157 ......m.......
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Ade
167 One Way
168 Bricks:
169 ..............
170 ..............
171 ..............
172 ..a........a..
173 .aba......aba.
174 a###a....a###a
175 c#f#c.vv.c#f#c
176 b#f#b####b#f#b
177 c#f#c#ff#c#f#c
178 c#f#c#ff#c#f#c
179 b#f#b####b#f#b
180 c#f#c....c#f#c
181 a###a.aa.a###a
182 .aba.a..a.aba.
183 ..a.a....a.a..
184 ...a......a...
185 ..a........a..
186 .a..........a.
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ..b........b..
193 ..............
194 ..b...m4...b..
195 ..............
196 ..............
197 ..............
198 ..............
199 ..&........&..
200 ......**......
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Ade
208 Many Chances
209 Bricks:
210 ..............
211 ##############
212 #aaaaaccaaaaa#
213 #a##########a#
214 #acacaaaacaca#
215 #a#a######a#a#
216 #a#a#ffff#a#a#
217 #aca#f##f#aca#
218 #aca#f##f#aca#
219 #a#a#ffff#a#a#
220 #a#a##xx##a#a#
221 #acaaaaaaaaca#
222 #a###xxxx###a#
223 #aaacaccacaaa#
224 ####xxxxxx####
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 .b...s.&l...b.
232 ..............
233 ..............
234 ..............
235 .....b..b.....
236 ..............
237 ...+......+...
238 ......mm......
239 ..............
240 ..............
241 ..............
242 .&..........&.
243 .......*......
244 ..............
245 ..............
246 ..............
247 Level:
248 Ade
249 Use R to Restart
250 Bricks:
251 jcba......abcj
252 cba........abc
253 ba....##....ab
254 a....#aa#....a
255 ....#f##f#....
256 ...#f#ff#f#...
257 ..#f#f##f#f#..
258 .#f#f#ff#f#f#.
259 #a#f#f##f#f#a#
260 #a#f#f##f#f#a#
261 .#f#f#ff#f#f#.
262 ..#f#fxxf#f#..
263 ...#fxffxf#...
264 ....#fxxf#....
265 a....#zz#....a
266 ba..........ab
267 cba........abc
268 jcba......abcj
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ....b....b....
276 ..............
277 ..............
278 ..............
279 ..............
280 ..&...m4...&..
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Ade
290 Lifeless, Take Some...
291 Bricks:
292 ..............
293 ..............
294 ..............
295 #####xxxx#####
296 #fff#ffff#fff#
297 #fff#ffff#fff#
298 #####ffff#####
299 .afff....fffa.
300 .afff.ff.fffa.
301 .afff.ff.fffa.
302 .afff....fffa.
303 #####ffff#####
304 #fff#ffff#fff#
305 #fff#ffff#fff#
306 #####xxxx#####
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ......&&......
317 ......&m......
318 ..l........l..
319 ......44......
320 ..............
321 ..l........l..
322 ......m.......
323 ..............
324 ..&........&..
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Ade
331 Dont Worry
332 Bricks:
333 ......##......
334 ......##......
335 .....#aa#.....
336 .....#aa#.....
337 ....#aaaa#....
338 ....#abba#....
339 ...#abccba#...
340 ...#abccba#...
341 ..#f#abba#f#..
342 ..#f#aaaa#f#..
343 .#f#f#aa#f#f#.
344 .#f#f#aa#f#f#.
345 #f#f#f##f#f#f#
346 #f#f#f##f#f#f#
347 f#f#f#ff#f#f#f
348 f#f#f#ff#f#f#f
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ......ss......
355 ..............
356 ..............
357 ......b&......
358 ..............
359 ..............
360 ..............
361 ......m.......
362 ..............
363 ..............
364 ..............
365 .&.b......b.&.
366 ......m4......
367 ..............
368 ..............
369 ..............
370 Level:
371 Ade
372 Twins
373 Bricks:
374 jzyx......xyzj
375 zyx...##...xyz
376 yx...#cc#...xy
377 x...#bbbb#...x
378 ...#aaaaaa#...
379 ...#aaaaaa#...
380 x...#bbbb#...x
381 yx...#cc#...xy
382 zyx...##...xyz
383 zyx...##...xyz
384 yx...#cc#...xy
385 x...#bbbb#...x
386 ...#aaaaaa#...
387 ...#aaaaaa#...
388 x...#bbbb#...x
389 yx...#cc#...xy
390 zyx...##...xyz
391 jzyx......xyzj
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 ..............
402 ..............
403 ..............
404 m............m
405 ......44......
406 ....&.mm.&....
407 ......ll......
408 ..............
409 ..............
410 p............p
411 Level:
412 Ade
413 By The Way
414 Bricks:
415 ......aa......
416 ....aa##aa....
417 ..aa##ff##aa..
418 aa##ffffff##aa
419 ##ffffffffff##
420 aa##ffffff##aa
421 ..aa##ff##aa..
422 ....aa##aa....
423 ......ff......
424 ....xx##xx....
425 ..xx##ff##xx..
426 xx##ffffff##xx
427 ##ffffffffff##
428 xx##ffffff##xx
429 ..xx##ff##xx..
430 ....xx##xx....
431 ......xx......
432 ..............
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ..............
438 ..b...ll...b..
439 ..............
440 ..............
441 ....&....&....
442 ......bb......
443 ..............
444 ..............
445 ......44......
446 ..&...44..b&..
447 ..............
448 ...m..........
449 ..............
450 ..............
451 ..............
452 Level:
453 Ade
454 U2
455 Bricks:
456 .############.
457 .#cccccccccc#.
458 .#bbbbbbbbbb#.
459 .#aaaa##aaaa#.
460 .#fff#..#fff#.
461 .#ff#....#ff#.
462 .#f#......#f#.
463 .##........##.
464 ..............
465 ccbbffxxffbbcc
466 ccbbffxxffbbcc
467 ccbbffxxffbbcc
468 ######..######
469 zzyyffxxffyyzz
470 zzyyffxxffyyzz
471 zzyyffxxffyyzz
472 ..............
473 ..............
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ...&......&...
479 ....b....b....
480 ..............
481 ..............
482 ..............
483 ..............
484 .....4..4.....
485 ..............
486 ...s..mm..s...
487 ..............
488 .....+..+.....
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Ade
495 Close To The Edge
496 Bricks:
497 ..............
498 ...cbbbbbbc...
499 ...cbaaaabc...
500 ...cba##abc...
501 ...cbaffabc...
502 ccccba##abcccc
503 bbbbbaaaabbbbb
504 baaaa####aaaab
505 ba##a#ff#a##ab
506 baffa#ff#affab
507 ba##a#ff#a##ab
508 baaaa####aaaab
509 bbbbbaaaabbbbb
510 ccccba##abcccc
511 ...cbaffabc...
512 ...cba##abc...
513 ...cbaaaabc...
514 ...cbbbbbbc...
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ......b&......
521 ..............
522 ..............
523 ..............
524 ..............
525 ...&......&...
526 ..............
527 ..............
528 .m....44....m.
529 ..............
530 ..............
531 ..............
532 ..............
533 ..............
534 Level:
535 Ade
536 Almost
537 Bricks:
538 ..............
539 ......cc......
540 .....cbbc.....
541 ....cbaabc....
542 ...cbabbabc...
543 ..cbabccbabc..
544 .cbabc##cbabc.
545 cbabc#ff#cbabc
546 babc#f##f#cbab
547 abc#f#ff#f#cba
548 yxyz#f##f#zyxy
549 zyxyz#ff#zyxyz
550 .zyxyz##zyxyz.
551 ..zyxyzzyxyz..
552 ...zyxyyxyz...
553 ....zyxxyz....
554 .....zyyz.....
555 ......zz......
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 ..............
562 ....m.b4.m....
563 ..............
564 ..............
565 ..............
566 ....&.bb.&....
567 ..............
568 ..............
569 ..............
570 ....m.ll.m....
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Ade
577 Learning to Fly
578 Bricks:
579 .....xxxx.....
580 .....xaax.....
581 .....xaax.....
582 .xxxxxyyxxxxx.
583 .xyyyyzzyyyyx.
584 .xyzzzaazzzyx.
585 .xyzaaccaazyx.
586 xxyza####azyxx
587 xyzac#ff#cazyx
588 xyzac#ff#cazyx
589 xxyza####azyxx
590 .xyzaaccaazyx.
591 .xyzzzaazzzyx.
592 .xyyyyzzyyyyx.
593 .xxxxxyyxxxxx.
594 .....xaax.....
595 .....xaax.....
596 .....xxxx.....
597 Bonus:
598 ..............
599 ..............
600 ......b&......
601 ..............
602 ..............
603 ..............
604 ......bl......
605 ..............
606 ......44......
607 ......44......
608 ...&......&...
609 .....&..&.....
610 ..............
611 .m..........m.
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Ade
618 Where is the Ball?
619 Bricks:
620 zzzzzzzzzzzzzz
621 xxxxzxxzzzxxxx
622 xzzxzxzxzzxzzz
623 xzzxzxzzxzxzzz
624 xzzxzxzzxzxzzz
625 xzzxzxzzxzxzzz
626 xxxxzxzzxzxxxz
627 xzzxzxzzxzxzzz
628 xzzxzxzzxzxzzz
629 xzzxzxzzxzxzzz
630 xzzxzxzxzzxzzz
631 xzzxzxxzzzxxxx
632 zzzzzzzzzzzzzz
633 yyyyyyyyyyyyyy
634 xxxxxxxxxxxxxx
635 yyyyyyyyyyyyyy
636 zzzzzzzzzzzzzz
637 ..............
638 Bonus:
639 ..............
640 ..*........*..
641 ..............
642 ..............
643 ..............
644 ..............
645 ..*........*..
646 ..............
647 ....&....&....
648 ....*....*....
649 ..............
650 .*.........*..
651 ..............
652 ..............
653 ..&........&..
654 ..............
655 ...*......*...
656 ..............
657 Level:
658 Ade
659 RIP
660 Bricks:
661 .....####.....
662 .....#ff#.....
663 .....#ff#.....
664 .....#ff#.....
665 .....#ff#.....
666 .#####ff#####.
667 .#####ff#####.
668 .#ffffffffff#.
669 .#####ff#####.
670 .#####ff#####.
671 .....#ff#.....
672 ..x..#ff#..x..
673 .xxx.#ff#.xxx.
674 ..x..#ff#..x..
675 ..x..#ff#..x..
676 ..x..#ff#..x..
677 ..x..#ff#..x..
678 .....####.....
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ......bb......
686 ..............
687 ....&.ll.&....
688 ..............
689 ..............
690 ..............
691 ..............
692 ..m........4..
693 ..4........4..
694 ..............
695 ......&.......
696 ..............
697 ..............
698 Level:
699 Ade
700 Stars
701 Bricks:
702 ..............
703 ...xyzjjzyx...
704 ...xyz!!zyx...
705 .xxxyzjjzyxxx.
706 .xyyyz!!zyyyx.
707 .xyzzzjjzzzyx.
708 xxyz!j!!j!zyxx
709 yyyzj!jj!jzyyy
710 zzzz!ffff!zzzz
711 jjjjjfaafjjjjj
712 zzzz!ffff!zzzz
713 yyyzj!jj!jzyyy
714 xxyz!j!!j!zyxx
715 .xyzzzjjzzzyx.
716 .xyyyz!!zyyyx.
717 .xxxyzjjzyxxx.
718 ...xyz!!zyx...
719 ...xyzjjzyx...
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 .....*..*.....
727 ..&........&..
728 ..*........*..
729 ......**......
730 .....l44l.....
731 ......**......
732 ..*........*..
733 ..............
734 .....s**s.....
735 ..............
736 ..............
737 ..............
738 ......ww......
739 Level:
740 Ade
741 Love to See You Cry
742 Bricks:
743 #f..##########
744 #!f..##f######
745 #f!f..##f#####
746 fjf!f..##f####
747 #fjf!f..##f###
748 #!fjf!f..##f##
749 #f!fjf!f..##f#
750 fjf!fjf!f..###
751 #fjf!fjf!f.#f#
752 #jf!fjf!f..###
753 #f!fjf!f..##f#
754 f!fjf!f..##f##
755 #fjf!f..##f###
756 fjf!f..##f####
757 #f!f..##f#####
758 #!f..##f######
759 #f..##########
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ........b.....
765 ..m...........
766 ..............
767 ..............
768 ............&.
769 ..4.l.........
770 ..............
771 ..............
772 ...4..........
773 m.............
774 ..............
775 .........&....
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Ade
782 Dogs
783 Bricks:
784 ff#ffffffff#ff
785 ff#jffffffj#ff
786 f##jjffffjj##f
787 f#jjjjffjjjj#f
788 ##jaajjjjaaj##
789 #ajjjjjjjjjja#
790 ##jffffffffj##
791 .#jjffffffjj#.
792 .##jjffffjj##.
793 ..#jjjffjjj#..
794 ..##jjjjjj##..
795 ...#jjaajj#...
796 ...##jaaj##...
797 ....#jjjj#....
798 ....##jj##....
799 .....#jj#.....
800 ######jj######
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 m...&....&...m
807 ...m......m...
808 .4..........4.
809 ..............
810 ..............
811 ..............
812 ..............
813 ..............
814 ..............
815 ..............
816 .....*..l.....
817 ..............
818 ..............
819 ..............
820 ..............
821 Level:
822 Ade
823 Demons
824 Bricks:
825 .#....##....#.
826 .#....ff....#.
827 .############.
828 ......ff......
829 xffff.##.ffffx
830 fxccc.##.cccxf
831 fcxbb.##.bbxcf
832 fcbxa.##.axbcf
833 fcbax.ff.xabcf
834 fcbaf.##.fabcf
835 fcbaf.##.fabcf
836 fcbaf.##.fabcf
837 fcbaf.##.fabcf
838 fcbax.ff.xabcf
839 fcbxa.##.axbcf
840 fcxbb.##.bbxcf
841 fxccc.##.cccxf
842 xffff.##.ffffx
843 Bonus:
844 ..............
845 ..............
846 ..............
847 ..............
848 ..............
849 ..............
850 ..............
851 ..............
852 m.....ll.....m
853 ..&........&..
854 ...*......*...
855 ...*......*...
856 ..............
857 ......44......
858 ..............
859 ..............
860 ..............
861 ..............
862 Level:
863 Ade
864 I dont know
865 Bricks:
866 ..............
867 aaa!bbbbbb!aaa
868 aa!!######!!aa
869 a!!#ffffff#!!a
870 !!#ff####ff#!!
871 !#ff#ffff#ff#!
872 #ff#ff##ff#ff#
873 #f#ff#!!#ff#f#
874 #f#f#!!!!#f#f#
875 #f#f#!!!!#f#f#
876 #f#ff#!!#ff#f#
877 #ff#ff##ff#ff#
878 !#ff#ffff#ff#!
879 !!#ff####ff#!!
880 x!!#ffffff#!!x
881 xx!!######!!xx
882 xxxzzzzzzzzxxx
883 ..............
884 Bonus:
885 ..............
886 ..m........m..
887 ..............
888 ..............
889 ..............
890 .....4..4.....
891 .....4..4.....
892 ..............
893 ..............
894 ...&......&...
895 ..............
896 ..............
897 ......bl......
898 ..............
899 m............m
900 ..............
901 ..............
902 ..............
903 Level:
904 Ade
905 Robot
906 Bricks:
907 .....#..#.....
908 ....######....
909 ....#ffff#....
910 ...##dffd##...
911 ...##ffff##...
912 ....#ffff#....
913 ....######....
914 .....####.....
915 .....####.....
916 .....####.....
917 ..##########..
918 ..#ffffffff#..
919 .##ffffffff##.
920 .##ffffffff##.
921 ..#ffffffff#..
922 ..##########..
923 ...###vv###...
924 ...###vv###...
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 .....mbbm.....
932 ..............
933 ..............
934 ..............
935 ..............
936 ..............
937 .....4ll4.....
938 ..............
939 ...&......&...
940 ..............
941 ..............
942 ..............
943 ......mm......
944 Level:
945 Ade
946 Its Raining Again
947 Bricks:
948 ##############
949 ######ff######
950 #####f##f#####
951 ###f##ff##f###
952 ###f######f###
953 ###ff####fff##
954 ###ff####fff##
955 ##ffff##fffff#
956 ##fxff##ffxff#
957 #ffyffffffyfff
958 #fxzxffffxzxff
959 ffyjyffffyjyff
960 fxz.zxffxz.zxf
961 fyj.jyffyj.jyf
962 xz...zxxz...zx
963 yj...jyyj...jy
964 z.....zz.....z
965 j.....jj.....j
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ...m..&b..m...
971 ..............
972 ..............
973 ..............
974 .....l..l.....
975 ..............
976 ......44......
977 ..............
978 ..............
979 ......&&......
980 ..............
981 ..............
982 .*..........*.
983 ..............
984 ..............
985 Level:
986 Ade
987 Simply Green
988 Bricks:
989 .......ffxffxf
990 ......ffxffxff
991 .....ffxffxffx
992 ....ffxffxffxf
993 ...ffxffxffxff
994 ..ffxffxffxffx
995 .ffxffxffxffxf
996 ffxffxffxffxff
997 fxffxffxffxffx
998 xffxffxffxffxf
999 ffxffxffxffxff
1000 fxffxffxffxff.
1001 xffxffxffxff..
1002 ffxffxffxff...
1003 fxffxffxff....
1004 xffxffxff.....
1005 ffxffxff......
1006 fxffxff.......
1007 Bonus:
1008 ........w.wb..
1009 .......b.wbbb.
1010 .........b.bb.
1011 .......ww..b.w
1012 ....4.b..4...w
1013 ....l....l....
1014 ...........p..
1015 ..............
1016 ..............
1017 ..............
1018 ...p...p......
1019 .........b....
1020 .b..b.........
1021 p.............
1022 ..............
1023 ..p..p........
1024 ..............
1025 ..p...........
1026 Level:
1027 Ade
1028 Lightining
1029 Bricks:
1030 ......ff......
1031 .....j##j.....
1032 ....z#ff#z....
1033 ...c#jffj#c...
1034 ..bczj##jzcb..
1035 .ab#z#ff#z#ba.
1036 .a#c#jffj#c#a.
1037 .#bczj##jzcb#.
1038 .ab#z#ff#z#ba.
1039 .a#c#jffj#c#a.
1040 .#bczj##jzcb#.
1041 .ab#z#ff#z#ba.
1042 .a#c#j..j#c#a.
1043 .#bcz....zcb#.
1044 .ab#......#ba.
1045 .a#........#a.
1046 .#..........#.
1047 ..............
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 ..............
1054 ..............
1055 .m.&......&.m.
1056 ..............
1057 ......44......
1058 ......bl......
1059 .....&..b.....
1060 ..............
1061 ..............
1062 ..............
1063 ..............
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Ade
1069 Early In The Morning
1070 Bricks:
1071 xfjfjfjjfjfjfx
1072 yxfjfjffjfjfxy
1073 zyxfjfjjfjfxyz
1074 .zyxfjffjfxyz.
1075 ..zyxfjjfxyz..
1076 ...zyx..xyz...
1077 #...zy..yz...#
1078 f#...z..z...#f
1079 ff#........#ff
1080 ff#........#ff
1081 f#...z..z...#f
1082 #...zy..yz...#
1083 ...zyx..xyz...
1084 ..zyxfjjfxyz..
1085 .zyxfjffjfxyz.
1086 zyxfjfjjfjfxyz
1087 yxfjfjffjfjfxy
1088 xfjfjfjjfjfjfx
1089 Bonus:
1090 ..............
1091 ..............
1092 ..m.m....m.m..
1093 ..............
1094 ..4........4..
1095 ..............
1096 ..............
1097 ..............
1098 ..............
1099 ..............
1100 m............m
1101 ..............
1102 ..............
1103 ..............
1104 ......**......
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Ade
1110 North Sea
1111 Bricks:
1112 fff#ff.ff#ffff
1113 f#ffff.ffff#ff
1114 fffff#.#fffff#
1115 #ff#ff.ff#ff#g
1116 .#ffff.ffff#gg
1117 ..#ff#.#ff#gg.
1118 g..#ff.ff#gg..
1119 gg..#f.f#gg..g
1120 ggg....ggg..gg
1121 ggg....ggg..gg
1122 gg..#f.f#gg..g
1123 g..#ff.ff#gg..
1124 ..#ffx.xff#gg.
1125 .#ffff.ffff#gg
1126 #ffxff.ffxff#g
1127 fffffx.xfffff#
1128 fxffff.ffffxff
1129 fffxff.ffxffff
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 .&l.......l&..
1135 ..4.......4...
1136 ..............
1137 ..............
1138 ..............
1139 &m..........m&
1140 ..............
1141 ..............
1142 ....?...?.....
1143 ....?...?.....
1144 ....?...?.....
1145 ..............
1146 bbbbb.........
1147 ....w.........
1148 ....w.........
1149 Level:
1150 Ade
1151 Who knows
1152 Bricks:
1153 .....j##j.....
1154 ....fjjjjf....
1155 ...fjjffjjf...
1156 ..fj#jffj#jf..
1157 .fj#fjffjf#jf.
1158 fj#jfjffjfj#jf
1159 j#fjfjffjfjf#j
1160 #jfjfjffjfjfj#
1161 fjfj.x..x.jfjf
1162 fjfj.x..x.jfjf
1163 fjf#x.xx.x#fjf
1164 fjf#x.xx.x#fjf
1165 fj#x.xffx.x#jf
1166 fj#x.xffx.x#jf
1167 f#x.x.xx.x.x#f
1168 f#x.x.xx.x.x#f
1169 #x.x.x..x.x.x#
1170 #x.x.x..x.x.x#
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..*........*..
1176 ....w....w....
1177 ..............
1178 ..............
1179 .b.....*....b.
1180 4b..........b4
1181 .bww......wwb.
1182 .&*........*&.
1183 .b..........b.
1184 .b..........b.
1185 .b..........b.
1186 ..............
1187 l.....bb.....l
1188 ..............
1189 .....w..w.....
1190 Level:
1191 Ade
1192 Whos The Next
1193 Bricks:
1194 ffff#jkkj#ffff
1195 ffff#jkkj#ffff
1196 ffff#jjjj#ffff
1197 ffffabffbaffff
1198 f###abffba###f
1199 f#jjjjjjjjjj#f
1200 f#jkkkkkkkkj#f
1201 f##jkkkkkkj##f
1202 fbajjjkkjjjabf
1203 fba###kk###abf
1204 kkkkk#kk#kkkkk
1205 fffkk#kk#kkfff
1206 kkk###kk###kkk
1207 kfbafjkkjfabfk
1208 kfbafjkkjfabfk
1209 kkk###kk###kkk
1210 fffkfxyyxfkfff
1211 fffkfxyyxfkfff
1212 Bonus:
1213 ..............
1214 ..............
1215 ......l.......
1216 ..............
1217 ..............
1218 ...&*....*&...
1219 ..............
1220 ..............
1221 ....44..44....
1222 ..............
1223 ..............
1224 ..............
1225 ..*........*..
1226 .....bbbb.....
1227 .....bbbb.....
1228 ......ww......
1229 ....+....+....
1230 ..............
1231 Level:
1232 Ade
1233 Challenger
1234 Bricks:
1235 ffffffffffffff
1236 ##############
1237 ..............
1238 ..............
1239 xxxxxx..xxxxxx
1240 yyyyyy..yyyyyy
1241 zzzzzz..zzzzzz
1242 jjjjjj..jjjjjj
1243 !!!!!!..!!!!!!
1244 ..............
1245 ..............
1246 ..............
1247 !!!!!!..!!!!!!
1248 jjjjjj..jjjjjj
1249 zzzzzz..zzzzzz
1250 yyyyyy..yyyyyy
1251 xxxxxx..xxxxxx
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 ..............
1259 .b..b....b..b.
1260 .....b..b.....
1261 ..............
1262 ..............
1263 ..............
1264 ..............
1265 m............m
1266 ..............
1267 ..............
1268 ..............
1269 .b...w..w...b.
1270 ..............
1271 ..............
1272 Level:
1273 Ade
1274 Hungry
1275 Bricks:
1276 ..............
1277 ...k......k...
1278 ...#......#...
1279 ..kfk....kfk..
1280 ..#f#....#f#..
1281 .kfifk..kfifk.
1282 .#fif#..#fif#.
1283 kfiiifkkfiiifk
1284 #figif##figif#
1285 iiigiiiiiigiii
1286 #figif##figif#
1287 xfiiifxxfiiifx
1288 .#fif#..#fif#.
1289 .xfifx..xfifx.
1290 ..#f#....#f#..
1291 ..xfx....xfx..
1292 ...#......#...
1293 ...x......x...
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 ..&.........&.
1301 ..............
1302 .....b44b.....
1303 ..............
1304 ......l.......
1305 .....&..&.....
1306 .m...*..*...m.
1307 ..............
1308 ..............
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Ade
1315 Why Not
1316 Bricks:
1317 #####fffffffff
1318 #xxxxf.f.f.f.f
1319 #xyyyfffffffff
1320 #xyzzfffffffff
1321 #xyzjf.f.f.f.f
1322 ffffffffffffff
1323 ffffffffffffff
1324 ffffffffffffff
1325 ffffffffffffff
1326 ffffffffffffff
1327 ffffffffffffff
1328 f.f.f.f.fjzyx#
1329 fffffffffzzyx#
1330 fffffffffyyyx#
1331 f.f.f.f.fxxxx#
1332 fffffffff#####
1333 ..............
1334 ..............
1335 Bonus:
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 .***..........
1343 ..............
1344 ..............
1345 .........*****
1346 ..............
1347 ..............
1348 ..l4..........
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Ade
1356 Yes
1357 Bricks:
1358 j!j!j!j!j!j!j!
1359 !j!j!j!j!j!j!j
1360 f!j!f!j!j!j!j!
1361 fj!jfj!j!j!j!j
1362 f!j!fffff!j!j!
1363 !f!f!f!j!j!j!j
1364 j!f!jfj!jffff!
1365 !jfj!f!j!f!j!j
1366 j!f!jfj!jfj!j!
1367 zjfjzfffzfzjzj
1368 jzfzjfjzjfjzjz
1369 zjfjzfzjzffffj
1370 jzfzjfjzjzjzfz
1371 zjzjzfzjzjzjfj
1372 jzjzjffffzjzfz
1373 zjzjzjzjzjzjfj
1374 jzjzjzjzjffffz
1375 zjzjzjzjzjzjzj
1376 Bonus:
1377 ..b...l.....b.
1378 .*.m..........
1379 ..b.....*...b.
1380 .*...4.....4..
1381 ..&...........
1382 .............*
1383 ?...*.........
1384 .......?......
1385 ..............
1386 .............?
1387 ....*...l.....
1388 .?............
1389 ......4...4...
1390 .............*
1391 ..............
1392 .*.......*....
1393 ..b.w.b.......
1394 ..............
1395 Level:
1396 Ade
1397 Electra
1398 Bricks:
1399 !#!!!!!!!!!!#!
1400 f#ffffffffff#f
1401 !#!!!!!!!!!!#!
1402 ##ffffffffff##
1403 ..............
1404 a#..........#a
1405 ax#........#xa
1406 axb#......#bxa
1407 axby#....#ybxa
1408 axbyc#..#cybxa
1409 axbycz..zcybxa
1410 axbycz..zcybxa
1411 axbycz..zcybxa
1412 axbyc#..#cybxa
1413 axby#....#ybxa
1414 axb#......#bxa
1415 ax#........#xa
1416 a#..........#a
1417 Bonus:
1418 ..............
1419 m.m.m....m.m.m
1420 ..............
1421 ..............
1422 ..............
1423 ..............
1424 ..............
1425 ..............
1426 ..............
1427 ..............
1428 ..............
1429 .l4........4l.
1430 ..............
1431 ..............
1432 ..............
1433 ..............
1434 ..............
1435 ..............
1436 Level:
1437 Ade
1438 Well, Well..
1439 Bricks:
1440 f###ccffcc###f
1441 ##c#cfkkfc#c##
1442 #cc#ccffcc#cc#
1443 kcc##a##a##cck
1444 kcccabccbaccck
1445 #ccabcjjcbacc#
1446 #cabcjffjcbac#
1447 #abcjfkkfjcba#
1448 abcjfkffkfjcba
1449 abcjfkffkfjcba
1450 #abcjfkkfjcba#
1451 #cabcjffjcbac#
1452 #ccabcjjcbacc#
1453 kcccabccbaccck
1454 kcc##abba##cck
1455 #cc#......#cc#
1456 #cc#......#cc#
1457 ####......####
1458 Bonus:
1459 ..............
1460 .....m..m.....
1461 ..............
1462 &............&
1463 ..............
1464 ..............
1465 ..............
1466 .l..........l.
1467 .4..........4.
1468 .4..........4.
1469 .l..........l.
1470 .....b.&b.....
1471 ....bwbbwb....
1472 ....&s++s&....
1473 ..............
1474 ..............
1475 ..............
1476 ..............
1477 Level:
1478 Ade
1479 Chips
1480 Bricks:
1481 ffffffffffffff
1482 f............f
1483 f............f
1484 f.!..!..!..!.f
1485 f............f
1486 f............f
1487 f.!..!..!..!.f
1488 f............f
1489 f............j
1490 f.!..!..!...jz
1491 f..........jzy
1492 f.........jzyx
1493 j.!..!...jzyxy
1494 cj......jzyxyz
1495 bcj....jzyxyzj
1496 abcj.!.zyxyzje
1497 babc...yxyzjee
1498 cbab...xyzjeee
1499 Bonus:
1500 m............m
1501 ..............
1502 ..............
1503 .b..4....4..b.
1504 ..............
1505 ..............
1506 ..............
1507 .b..........b.
1508 ..............
1509 ..............
1510 ............m.
1511 .......+......
1512 ..........m...
1513 ..............
1514 ........m.....
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Ade
1520 Apolo
1521 Bricks:
1522 hfhfh....hfhfh
1523 fgfgf....fgfgf
1524 hfhfh#..#hfhfh
1525 fgfgfa..afgfgf
1526 hfhfh#..#hfhfh
1527 fgfgfa..afgfgf
1528 hfhfh#..#hfhfh
1529 fgfgfa..afgfgf
1530 hfhfh#..#hfhfh
1531 fgfgfa..afgfgf
1532 hfhfh#..#hfhfh
1533 fgfgfa..afgfgf
1534 a#a#a#..#a#a#a
1535 ..............
1536 ..............
1537 zjzjzjzjzjzjzj
1538 ykykykykykykyk
1539 xfxfxfxfxfxfxf
1540 Bonus:
1541 ..............
1542 ..............
1543 ..*........*..
1544 .....*..*.....
1545 ..............
1546 .............*
1547 ..............
1548 ..*........*..
1549 ..............
1550 ....s...ss....
1551 ..............
1552 ....s*..*s....
1553 ..............
1554 ..............
1555 ..............
1556 ..............
1557 ..............
1558 ..............
1559 Level:
1560 Ade
1561 April
1562 Bricks:
1563 abcxyz!!zyxcba
1564 abcxyzjjzyxcba
1565 abcxyz!!zyxcba
1566 abcxyzjjzyxcba
1567 abcxyz!!zyxcba
1568 abcxyzjjzyxcba
1569 abcxyz!!zyxcba
1570 abcxyzjjzyxcba
1571 abcxyz!!zyxcba
1572 abcxyzjjzyxcba
1573 abcxyz..zyxcba
1574 abcxy....yxcba
1575 abcx......xcba
1576 ab#........#ba
1577 a#..........#a
1578 #............#
1579 ..............
1580 ..............
1581 Bonus:
1582 ..............
1583 ..............
1584 ..............
1585 ..............
1586 ..............
1587 ..m...mm....m.
1588 ..............
1589 ..............
1590 ..............
1591 ..............
1592 ..............
1593 ..............
1594 ..............
1595 .&..........&.
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Ade
1602 April
1603 Bricks:
1604 ..............
1605 ..............
1606 ..............
1607 ..............
1608 ..............
1609 ..............
1610 ..............
1611 ..............
1612 ..............
1613 ..............
1614 ..............
1615 ..............
1616 ..............
1617 ..............
1618 ..............
1619 ..............
1620 ..............
1621 ..............
1622 Bonus:
1623 ..............
1624 ..............
1625 ..............
1626 ..............
1627 ..............
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.00
1 Level:
2 Ade
3 Back To The Bricks
4 Bricks:
5 ######xx######
6 #.....xx.....#
7 #....xyyx....#
8 #...xyzzyx...#
9 #..xyzjjzyx..#
10 #.xyzj##jzyx.#
11 #xyzj#ff#jzyx#
12 #xyzj#ff#jzyx#
13 #.xyzj##jzyx.#
14 #..xyzjjzyx..#
15 #...xyzzyx...#
16 #....xyyx....#
17 #.....xx.....#
18 ######xx######
19 ..jzyx..xyzj..
20 ..zyx....xyz..
21 ..yE......xy..
22 ..x........x..
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ......mm......
31 ......mm......
32 ..............
33 ..............
34 ....&....&....
35 ..............
36 ......mm......
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Ade
44 Show No Mercy
45 Bricks:
46 @@@E@@EE@@E@@@
47 @@E@@E##E@@E@@
48 @E@@E#ff#E@@E@
49 E@@E#fxxf#E@@E
50 @@E#fxffxf#E@@
51 @E#fxfxxfxf#E@
52 E#fxfxffxfxf#E
53 EfxfxfxxfxfxfE
54 EfxfxfxxfxfxfE
55 E#fxfxffxfxf#E
56 @E#fxfxxfxf#E@
57 @@E#fxffxf#E@@
58 EEE##fxxf##EEE
59 #f####xx####f#
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ..............
71 ..............
72 ......mm......
73 ......mm......
74 ..............
75 ..............
76 ..............
77 ..............
78 .m....44....s.
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Ade
85 Manhattan-Kaboul
86 Bricks:
87 ffff#...xyz...
88 fff#...xyz...a
89 ff#...xyz...ab
90 f#...xyz...abc
91 #...xyz...abc.
92 ...xyz...abc..
93 ..xyz...abc...
94 .xyz...abc....
95 xyz...abc.....
96 xyz...abc.....
97 .xyz...abc....
98 ..xyz...abc...
99 ...xyz...abc..
100 #...xyz...abc.
101 f#...xyz...abc
102 ff#...xyz...ab
103 fff#...xyz...a
104 ffff#...xyz...
105 Bonus:
106 ..............
107 ..............
108 mm............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 .m......m.....
115 .m......m.....
116 ..............
117 ..............
118 ..............
119 .....l........
120 ......l.......
121 .......4......
122 ........4.....
123 ..............
124 Level:
125 Ade
126 Doors
127 Bricks:
128 ffffff##ffffff
129 f....#aa#....f
130 f...#abba#...f
131 f..#abccba#..f
132 f.#abcjjcba#.f
133 f#abcj##jcba#f
134 fabcj#xx#jcbaf
135 fbcj#xyyx#jcbf
136 !!!!#yzzy#!!!!
137 !!!!#yzzy#!!!!
138 fbcj#xyyx#jcbf
139 fabcj#xx#jcbaf
140 f#abcj##jcba#f
141 f.#abcjjcba#.f
142 f..#abccba#..f
143 f...#abba#...f
144 f....#aa#....f
145 ffffff##ffffff
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ......44......
155 ......mm......
156 ......mm......
157 m.....44.....m
158 ..............
159 ..............
160 ..............
161 ....&b..b&....
162 ..............
163 ..............
164 ..............
165 Level:
166 Ade
167 Windows
168 Bricks:
169 ......xx......
170 ......xx......
171 ......ff......
172 .###..ff..###.
173 .#f#..xx..#f#.
174 .###..xx..###.
175 ......ff......
176 ......ff......
177 .xxxffxxffxxx.
178 .xxxffxxffxxx.
179 ......ff......
180 ......ff......
181 .###..xx..###.
182 .#f#..xx..#f#.
183 .###..ff..###.
184 ......ff......
185 ......xx......
186 ......xx......
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ..4........4..
193 ..............
194 ..............
195 ..............
196 ......mm......
197 ......mm......
198 ..............
199 ......l4......
200 ..............
201 ..&........&..
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Ade
208 Here We Go
209 Bricks:
210 ..............
211 .#x........x#.
212 .#yx......xy#.
213 .#zyx....xyz#.
214 .#jzyx..xyzj#.
215 .#!jzyxxyzj!#.
216 ..............
217 ####f####f####
218 #ff#f#ff#f#ff#
219 #ff#f#ff#f#ff#
220 ####f####f####
221 ..............
222 .#!jzyxxyzj!#.
223 .#jzyx..xyzj#.
224 .#zyx....xyz#.
225 .#yx......xy#.
226 .#x........x#.
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ......mm......
238 .l&.m.mm.m.&l.
239 ..............
240 ..............
241 .....4**4.....
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Ade
249 Trinitro Tolueno
250 Bricks:
251 ..............
252 ..............
253 .**...**...**.
254 #xx#.#xx#.#xx#
255 #xx#.#xx#.#xx#
256 ####.####.####
257 ..............
258 xxxxxxxxxxxxxx
259 *x*x*x**x*x*x*
260 *x*x*x**x*x*x*
261 xxxxxxxxxxxxxx
262 ..............
263 ####.####.####
264 #xx#.#xx#.#xx#
265 #xx#.#xx#.#xx#
266 .xx...xx...xx.
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 .mm...mm...mm.
275 ..............
276 ..............
277 *.............
278 ..............
279 ..............
280 *.............
281 ..............
282 ..............
283 ......mm......
284 ......44......
285 ..............
286 ..............
287 ..............
288 Level:
289 Ade
290 Stars
291 Bricks:
292 ......!!......
293 .....!!!!.....
294 ....!!!!!!....
295 .....!!!!.....
296 ..####!!####..
297 ..#xxxxxxxx#..
298 ..#xyyyyyyx#..
299 .!#xyz!!zyx#!.
300 !!!xy!!!!yx!!!
301 !!!xy!!!!yx!!!
302 .!#xyz!!zyx#!.
303 ..#xyyyyyyx#..
304 ..#xxxxxxxx#..
305 ..####!!####..
306 .....!!!!.....
307 ....!!!!!!....
308 .....!!!!.....
309 ......!!......
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 .....l44l.....
318 ..............
319 ..............
320 ..............
321 .*..........*.
322 ..............
323 ....mmmmmm....
324 ..............
325 ..............
326 ..............
327 ..............
328 ......**......
329 Level:
330 Ade
331 Boss
332 Bricks:
333 ########......
334 .x#....x#.....
335 .xa#...xa#....
336 .xay#..xay#...
337 .xayb#.xayb#..
338 .xaybz#xaybz#.
339 .xaybzcxaybzc.
340 .xaybzcxaybzc.
341 .xaybzcxaybzc.
342 .xaybzcxaybzc.
343 .xaybzcxaybzc.
344 .xaybzcxaybzc.
345 .xaybz#xaybz#.
346 .xayb#.xayb#..
347 .xay#..xay#...
348 .xa#...xa#....
349 .x#....x#.....
350 ########......
351 Bonus:
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ............m.
360 ............m.
361 ............m.
362 ............m.
363 ..............
364 ..............
365 ..............
366 .&&&...&&&....
367 .44....44.....
368 .l.....l......
369 ..............
370 Level:
371 Ade
372 Tetris
373 Bricks:
374 ......zz......
375 ......zz......
376 ......z.......
377 ..............
378 ..............
379 ..............
380 ...j......b...
381 .f.j..x...b.k.
382 .f.j.ax.e.bik.
383 .f.jgax.e.bik.
384 .fhjgaxde.bik.
385 .fhjgaxdezbik.
386 .fhjgaxdezbik.
387 .fhjgaxdezbik.
388 .############.
389 ..............
390 ..............
391 ..............
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 .*.*........*.
401 ..............
402 ........*.....
403 ..............
404 .......*......
405 ......**......
406 ...&4.**.4&...
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Ade
413 Clown
414 Bricks:
415 ff#aaaaaaaa#ff
416 ff#jaaaaaaj#ff
417 ff#jjaaaajj#ff
418 f#jjjjaajjjj#f
419 f#jjjjjjjjjj#f
420 f#jjjjjjjjjj#f
421 #jjggjjjjggjj#
422 #jj!!jjjj!!jj#
423 #jjggjjjjggjj#
424 f#jjjjeejjjj#f
425 f#jjjjeejjjj#f
426 f#jjjjeejjjj#f
427 ff#jjjjjjjj#ff
428 ff#jjddddjj#ff
429 ff#jjjddjjj#ff
430 fff#jjjjjj#fff
431 fff#jjjjjj#fff
432 #####jjjj#####
433 Bonus:
434 ..............
435 ..............
436 .m..........m.
437 ..............
438 ......mm......
439 m............m
440 ..............
441 ..............
442 ..............
443 ..............
444 ..............
445 ......44......
446 ..............
447 ..............
448 ..............
449 ..............
450 ......**......
451 ......ww......
452 Level:
453 Ade
454 Mirror
455 Bricks:
456 #.............
457 j#............
458 zj#...........
459 yzj#..........
460 xyzj#.........
461 #xyzj#........
462 a#xyzj#.......
463 ba#xyzj#......
464 cba#xyzj#.....
465 jcba#xyzj#....
466 #jcba#xyzj#...
467 .#jcba#xyzj#..
468 ..#jcba#xyzj#.
469 ...#jcba#xyzj#
470 ..............
471 ...#jcba#xyzj#
472 ..#jcba#xyzj#.
473 .#jcba#xyzj#..
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 ..............
482 ..............
483 ..............
484 ..............
485 ..............
486 ..............
487 ..............
488 ....4.m4.&mb&.
489 ..............
490 ....mm44......
491 ..............
492 ..............
493 Level:
494 Ade
495 Whiskey Time
496 Bricks:
497 .jcba.#......#
498 .cba.#......#.
499 .ba.#.x....#.x
500 .a.#.xx...#.xx
501 ..#.xxx..#.xxx
502 .#.xxxx.#.xxxx
503 #.ccccc#.ccccc
504 .bbbbbb.bbbbbb
505 aaaaaaaaaaaaaa
506 aaaaaaaaaaaaaa
507 .bbbbbb.bbbbbb
508 #.ccccc#.ccccc
509 .#.xxxx.#.xxxx
510 ..#.xxx..#.xxx
511 .a.#.xx...#.xx
512 .ba.#.x....#.x
513 .cba.#......#.
514 .jcba.#......#
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..............
523 ..............
524 ..............
525 .m.m.m.m.m.m..
526 ..............
527 ..............
528 ..............
529 ..............
530 ......4.......
531 ......4.......
532 ..............
533 ..............
534 Level:
535 Ade
536 Twins
537 Bricks:
538 .############.
539 .f.xxxxxxxx.f.
540 .ff.yyyyyy.ff.
541 .#ff.zzzz.ff#.
542 .#.ff.jj.ff.#.
543 .#a.ff..ff.a#.
544 .#ab.ffff.ba#.
545 .#abc.ff.cba#.
546 .#abc.##.cba#.
547 .#abc.##.cba#.
548 .#abc.ff.cba#.
549 .#ab.ffff.ba#.
550 .#a.ff..ff.a#.
551 .#.ff.jj.ff.#.
552 .#ff.zzzz.ff#.
553 .ff.yyyyyy.ff.
554 .f.xxxxxxxx.f.
555 .############.
556 Bonus:
557 ..............
558 ..............
559 ..m........m..
560 ..............
561 ..............
562 ..............
563 ..............
564 ..............
565 ..............
566 ..............
567 ..............
568 ..............
569 ..............
570 ......ll......
571 ..............
572 ..m........m..
573 ...&.&44&.&...
574 ..............
575 Level:
576 Ade
577 Inner
578 Bricks:
579 .jzyx#..#xyzj.
580 jzyx#....#xyzj
581 zyx#......#xyz
582 yx#...!!...#xy
583 x#...!!!!...#x
584 #...!!!!!!...#
585 x#...!!!!...#x
586 yx#...!!...#xy
587 zyx#......#xyz
588 jzyx#....#xyzj
589 .jzyx#..#xyzj.
590 ..jzyx##xyzj..
591 ...jzyxxyzj...
592 ....jzyyzj....
593 .....jzzj.....
594 ......jj......
595 ..............
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ..............
601 .&..........&.
602 m............m
603 ..............
604 ..............
605 m.....l......m
606 .....&44&.....
607 ..............
608 ..............
609 ..............
610 ......mm......
611 ..............
612 ..............
613 ......**......
614 ..............
615 ..............
616 Level:
617 Ade
618 The Wall
619 Bricks:
620 ..............
621 ..............
622 xx##ff##ff##xx
623 xx##ff##ff##xx
624 ##xx##ff##xx##
625 ##xx##ff##xx##
626 xx##xx##xx##xx
627 xx##xx##xx##xx
628 ffxxffxxffxxff
629 ffxxffxxffxxff
630 xx##xx##xx##xx
631 xx##xx##xx##xx
632 ##xx##ff##xx##
633 ##xx##ff##xx##
634 xx##ff##ff##xx
635 xx##ff##ff##xx
636 ..............
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ....&m..m&....
643 ..............
644 ..............
645 ..............
646 ..............
647 ..............
648 ..............
649 ..............
650 ..............
651 ..............
652 ..4l..&&..l4..
653 .m..m...m...m.
654 ..............
655 ..............
656 ..............
657 Level:
658 Ade
659 Sabotage
660 Bricks:
661 x##........##x
662 ##....##....##
663 #....#xx#....#
664 ....#xxxx#....
665 ...#xx##xx#...
666 ..#xx#..#xx#..
667 .#xx#....#xx#.
668 .xx#......#xx.
669 ......ff......
670 ......ff......
671 .xx#......#xx.
672 .#xx#....#xx#.
673 ..#xx#..#xx#..
674 ...#xx##xx#...
675 ....#xxxx#....
676 .....#xx#.....
677 ......##......
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..............
686 ..............
687 ..............
688 ......mm......
689 ......mm......
690 ..............
691 ..............
692 ..............
693 ..............
694 ..............
695 ......44......
696 ..............
697 ..............
698 Level:
699 Ade
700 Cry Baby
701 Bricks:
702 .#..........#.
703 x.#........#f.
704 ax.#......#f!.
705 xax.#....#f!f.
706 axax.#..#f!f!.
707 xaxax.#.f!f!f.
708 axaxax.#!f!f!.
709 xaxaxax.f!f!f.
710 axaxaxa.!f!f!.
711 xaxaxax.f!f!f.
712 axaxax.#!f!f!.
713 xaxax.#.f!f!f.
714 axax.#..#f!f!.
715 xax.#....#f!f.
716 ax.#......#f!.
717 x.#........#f.
718 .#..........#.
719 #.............
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ............*.
725 ..............
726 ..............
727 ..............
728 ............*.
729 ......m..*....
730 .....l........
731 ....4.........
732 ...m..........
733 ..b...........
734 .4..........*.
735 m.............
736 ..............
737 ..............
738 ..............
739 Level:
740 Ade
741 AW
742 Bricks:
743 .fff######fff.
744 .fff######fff.
745 .fff#ffff#fff.
746 .fff#ffff#fff.
747 .fff######fff.
748 .fff######fff.
749 .f#f#ffff#f#f.
750 .f#f#ffff#f#f.
751 .f#f#ffff#f#f.
752 .f#ffffffff#f.
753 .f#fff##fff#f.
754 .f#ff####ff#f.
755 .f##f####f##f.
756 .ff###ff###ff.
757 .fff#ffff#fff.
758 .ffffffffffff.
759 ..............
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ..............
765 .....m..m.....
766 ..............
767 ..............
768 ..............
769 ..............
770 ..............
771 ..............
772 ..............
773 ..............
774 ....m....m....
775 ..............
776 .bbb.bbbb.bbb.
777 .wwwwwwwwwwww.
778 ..............
779 ..............
780 Level:
781 Ade
782 Half Time
783 Bricks:
784 #############.
785 ......#######.
786 .....#abc!!!!.
787 ....#abcjjjjj.
788 ...#abczzzzzz.
789 ..#abcyyyyyyy.
790 .#abcxxxxxxxx.
791 #abcj########.
792 #bcj#ffffffff.
793 #bcj#ffffffff.
794 #abcj########.
795 .#abcxxxxxxxx.
796 ..#abcyyyyyyy.
797 ...#abczzzzzz.
798 ....#abcjjjjj.
799 .....#abc!!!!.
800 ......#######.
801 #############.
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 ..............
809 .....&........
810 ..............
811 .m...m..*.*.*.
812 .m...m..*.*.*.
813 ..............
814 .....&........
815 ..............
816 ..............
817 ..............
818 ......44l.....
819 ..............
820 ..............
821 Level:
822 Ade
823 Active
824 Bricks:
825 .......#f!f!f!
826 .!!!!!..#f!f!f
827 .!jjjj!..#f!f!
828 .!jzzzj!..#f!f
829 .!jzyyzj!..#f!
830 .!jzyx.zj!..#f
831 .!jzy...zj!..#
832 .!jz..#..zj!..
833 .!j..#f#..zj!.
834 .!jz..#f#..j!.
835 ..!jz..#..zj!.
836 #..!jz...yzj!.
837 ##..!jz.xyzj!.
838 ###..!jzyyzj!.
839 ####..!jzzzj!.
840 #####..!jjjj!.
841 ######..!!!!!.
842 #######.......
843 Bonus:
844 ..............
845 ..............
846 ..........m...
847 ..............
848 ............m.
849 ....mm........
850 ..............
851 ..............
852 ......m.......
853 .......m......
854 ..............
855 ..............
856 ........m.....
857 ......4.......
858 .......l......
859 ..............
860 ..............
861 ..............
862 Level:
863 Ade
864 ET
865 Bricks:
866 ff###ffff###ff
867 f#jjj#ff#jjj#f
868 fggjggffggjggf
869 f#jej#ff#jej#f
870 f#jej#ff#jej#f
871 f#djd#ff#djd#f
872 ff#d#ffff#d#ff
873 fff#ffffff#fff
874 ff###ffff###ff
875 f#f#f#ff#f#f#f
876 fff#ffffff#fff
877 fff#ffffff#fff
878 fff#ffffff#fff
879 ff#f#ffff#f#ff
880 f#fff#ff#fff#f
881 #fffff##fffff#
882 ..............
883 ..............
884 Bonus:
885 ..............
886 ..............
887 ..............
888 ..............
889 ..............
890 ..............
891 ...m......m...
892 ..............
893 ..............
894 ......44......
895 ..............
896 ..............
897 ..&........&..
898 ...m......m...
899 ..............
900 ..............
901 ..............
902 ..............
903 Level:
904 Ade
905 Sleepless
906 Bricks:
907 ..............
908 ......xx......
909 ....#x##x#....
910 ....x#ff#x....
911 ..#x#f##f#x#..
912 ..x#f#ff#f#x..
913 #x#f#f##f#f#x#
914 x#f#f#xx#f#f#x
915 #f#f#xffx#f#f#
916 #f#f#xffx#f#f#
917 x#f#f#xx#f#f#x
918 #x#f#f##f#f#x#
919 ..x#f#ff#f#x..
920 ..#x#f##f#x#..
921 ....x#ff#x....
922 ....#x##x#....
923 ......xx......
924 ..............
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..............
933 ..............
934 ......mm......
935 ......mm......
936 ..............
937 .m..........m.
938 ..............
939 .....4..4.....
940 ......lb......
941 ..............
942 ..............
943 ..............
944 Level:
945 Ade
946 High Density
947 Bricks:
948 ..............
949 .!..........!.
950 !!!...##...!!!
951 .!...#xx#...!.
952 ....#xyyx#....
953 ...#xy!!yx#...
954 ....#xyyx#....
955 ..x..#xx#..x..
956 .xxx..##..xxx.
957 xx!xx....xx!xx
958 .xxx..##..xxx.
959 ..x..#xx#..x..
960 ....#xyyx#....
961 ...#xy!!yx#...
962 ....#xyyx#....
963 .....#xx#.....
964 ......##......
965 ..............
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ..............
971 ..............
972 ......mm......
973 ..............
974 ..............
975 ..............
976 ..m........m..
977 ..............
978 ..............
979 ..............
980 ......mm......
981 ........l.....
982 ......44......
983 ..............
984 ..............
985 Level:
986 Ade
987 Fox Glacier
988 Bricks:
989 ..............
990 .xxx.####.xxx.
991 .xfx.#ff#.xfx.
992 .xxx.####.xxx.
993 ..x..xxxx..x..
994 .xxx.####.xxx.
995 .xfx.#ff#.xfx.
996 .xxx.####.xxx.
997 ..x..xxxx..x..
998 .xxx.####.xxx.
999 .xfx.#ff#.xfx.
1000 .xxx.####.xxx.
1001 ..x..xxxx..x..
1002 .xxx.####.xxx.
1003 .xfx.#ff#.xfx.
1004 .xxx.####.xxx.
1005 ..............
1006 ..............
1007 Bonus:
1008 ..............
1009 ..............
1010 ..m........m..
1011 ..............
1012 ..............
1013 ..............
1014 ..4........4..
1015 ..............
1016 ..............
1017 ..............
1018 ..m...mm...m..
1019 ..............
1020 ..............
1021 ..............
1022 ..&........&..
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Ade
1028 The Dark Side
1029 Bricks:
1030 xfxfxfxxfxfxfx
1031 fxfxfx..xfxfxf
1032 xfxfx....xfxfx
1033 fxfx..aa..xfxf
1034 xfx..abba..xfx
1035 fx..abccba..xf
1036 x..abcjjcba..x
1037 ..abcj##jcba..
1038 .abcj#ff#jcba.
1039 .abcj#ff#jcba.
1040 ..abcj##jcba..
1041 x..abcjjcba..x
1042 fx..abccba..xf
1043 xfx..abba..xfx
1044 fxfx..aa..xfxf
1045 xfxfx....xfxfx
1046 fxfxfx..xfxfxf
1047 xfxfxfxxfxfxfx
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 ..............
1054 ..............
1055 ..............
1056 ..............
1057 ......mm......
1058 ......mm......
1059 ..............
1060 ....b.mm.b....
1061 ....w4..4w....
1062 ..............
1063 ..............
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Ade
1069 All The Things You Say
1070 Bricks:
1071 .....#jcbaxyzj
1072 ....#.#jcbaxyz
1073 ...#...#jcbaxy
1074 ..#.xx..#jcbax
1075 .#..yyy..#jcba
1076 #...zzzz..#jcb
1077 ....aaaaa..#jc
1078 ....abbbba..#j
1079 ....abccba...#
1080 #...abccba....
1081 j#..abbbba....
1082 cj#..aaaaa....
1083 bcj#..zzzz...#
1084 abcj#..yyy..#.
1085 xabcj#..xx.#..
1086 yxabcj#...#...
1087 zyxabcj#.#....
1088 jzyxabcj#.....
1089 Bonus:
1090 ..............
1091 ..............
1092 ..............
1093 .........m....
1094 ..............
1095 ..............
1096 ............m.
1097 ..............
1098 ......m.m.....
1099 ..............
1100 ..............
1101 ..............
1102 ..............
1103 .......&ll....
1104 m.......44....
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Ade
1110 Back To Life
1111 Bricks:
1112 xx..xxx.xx.x.x
1113 x.x.x.x.x..x.x
1114 xx..xxx.x..xx.
1115 x.x.x.x.x..x.x
1116 xx..x.x.xx.x.x
1117 ..............
1118 ...xxx..xxx...
1119 ....x...x.x...
1120 ....x...x.x...
1121 ....x...x.x...
1122 ....x...xxx...
1123 ..............
1124 ..x..x.xx.xx..
1125 ..x..x.x..x...
1126 ..x..x.xx.xx..
1127 ..x..x.x..x...
1128 vvxxvxvxvvxxvv
1129 ..............
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ..............
1135 ..............
1136 ..............
1137 ..............
1138 ..............
1139 ..............
1140 ..............
1141 ..............
1142 ..............
1143 ..b..b.bb.bb..
1144 ..b..b.b..b...
1145 ..b..b.bb.bb..
1146 ..b..b.b..b...
1147 wwwwwwwwwwwwww
1148 ..............
1149 Level:
1150
1151 Electra
1152 Bricks:
1153 ffffffffffffff
1154 ##############
1155 ..............
1156 ..............
1157 ..............
1158 ..............
1159 xaxaxaaaaxaxax
1160 axaxab##baxaxa
1161 xaxaxccccxaxax
1162 axaxaccccaxaxa
1163 xaxaxccccxaxax
1164 axaxaccccaxaxa
1165 xaxaxb##bxaxax
1166 axaxaaaaaaxaxa
1167 xaxa#....#axax
1168 axa#......#axa
1169 xa#........#ax
1170 a#..........#a
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..............
1176 ..............
1177 ..............
1178 ..............
1179 ..............
1180 ..............
1181 ......mm......
1182 ..............
1183 ..............
1184 ..............
1185 &m4ml....lm4m&
1186 ..............
1187 ..............
1188 ..............
1189 ..............
1190 Level:
1191 Ade
1192 30
1193 Bricks:
1194 ffffffffffffff
1195 f####fff#####f
1196 f#####ff#####f
1197 ffff##ff#fff#f
1198 ffff##ff#fff#f
1199 ff###fff#fff#f
1200 ff###fff#fff#f
1201 ffff##ff#fff#f
1202 ffff##ff#fff#f
1203 f#####ff#####f
1204 f####fff#####f
1205 ffffffffffffff
1206 xxxxxxxxxxxxxx
1207 ffffffffffffff
1208 xxxxxxxxxxxxxx
1209 ffffffffffffff
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..........l...
1219 ......mm..&...
1220 ..........4...
1221 ...&.....m4m..
1222 ..............
1223 ..............
1224 ..............
1225 ..............
1226 ..............
1227 ..............
1228 ..*...**...*..
1229 ..............
1230 ..............
1231 Level:
1232 Ade
1233 Songs From The Wood
1234 Bricks:
1235 .############.
1236 .#f##f##f##f#.
1237 .############.
1238 .a....xx....a.
1239 .ab..yxxy..ba.
1240 .abczyxxyzcba.
1241 .abczyxxyzcba.
1242 .abczyxxyzcba.
1243 .abczyxxyzcba.
1244 .abczyxxyzcba.
1245 .ab..yxxy..ba.
1246 .a....xx....a.
1247 .############.
1248 .#f##f##f##f#.
1249 .############.
1250 ..............
1251 ..............
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 ..............
1259 ...m......m...
1260 ..............
1261 .*..........*.
1262 ..............
1263 ...m......m...
1264 ..............
1265 ......44......
1266 ..............
1267 ..m..m..m..m..
1268 ..............
1269 ..............
1270 ..............
1271 ..............
1272 Level:
1273 Ade
1274 Long Distance
1275 Bricks:
1276 ..............
1277 ..............
1278 #xyzj....jzyx#
1279 x#xyzj..jzyx#x
1280 yx#xyzjjzyx#xy
1281 zyx#xyzzyx#xyz
1282 jzyx#xyyx#xyzj
1283 .jzyx#xx#xyzj.
1284 ..jzyx##xyzj..
1285 ..jzyx##xyzj..
1286 .jzyx#xx#xyzj.
1287 jzyx#xyyx#xyzj
1288 zyx#xyzzyx#xyz
1289 yx#xyzjjzyx#xy
1290 x#xyzj..jzyx#x
1291 #xyzj....jzyx#
1292 ..............
1293 ..............
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 ..............
1301 ......ll......
1302 ......44......
1303 ..............
1304 ...m......m...
1305 ......mm......
1306 ..............
1307 ..............
1308 .&....*.....&.
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Ade
1315 Prinz
1316 Bricks:
1317 .x....##....x.
1318 ..x...ff...x..
1319 #..x..##..x..#
1320 a#..x....x..#a
1321 xa#..x..x..#ax
1322 bxa#..xx..#axb
1323 ybxa#....#axby
1324 cybxa.##.axbyc
1325 jcybx.ff.xbycj
1326 jcybx.ff.xbycj
1327 cybxa.##.axbyc
1328 ybxa#....#axby
1329 bxa#..xx..#axb
1330 xa#..x..x..#ax
1331 a#..x....x..#a
1332 #..x..##..x..#
1333 ..x...ff...x..
1334 .x....##....x.
1335 Bonus:
1336 ..............
1337 ......mm......
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ..............
1346 ..............
1347 ...&......&...
1348 ..m........m..
1349 .m..........m.
1350 ..............
1351 ..............
1352 ......44......
1353 ..............
1354 Level:
1355 Ade
1356 Money For Nothing
1357 Bricks:
1358 ......##......
1359 .....#xx#.....
1360 ....#xxxx#....
1361 ...#xxxxxx#...
1362 ..#xxx!!xxx#..
1363 .#xxx!zz!xxx#.
1364 .xxx!zffz!xxx.
1365 .xx!zf##fz!xx.
1366 .x!zf#xx#fz!x.
1367 .x!zf#xx#fz!x.
1368 .xx!zf##fz!xx.
1369 .xxx!zffz!xxx.
1370 .#xxx!zz!xxx#.
1371 ..#xxx!!xxx#..
1372 ...#xxxxxx#...
1373 ....#xxxx#....
1374 .....#xx#.....
1375 ......##......
1376 Bonus:
1377 ..............
1378 ..............
1379 ..............
1380 ..............
1381 ..............
1382 ..............
1383 .*....lb....b.
1384 .*..........b.
1385 .*..........b.
1386 .*..&.mm.&..b.
1387 .*..........b.
1388 .*....44....b.
1389 ..............
1390 ......mm......
1391 ..............
1392 ..............
1393 ..............
1394 ..............
1395 Level:
1396 Ade
1397 Time To Drink Water
1398 Bricks:
1399 ff#xaxaaxax#ff
1400 f#xaxaxxaxax#f
1401 #xaxaxaaxaxax#
1402 xaxaxaxxaxaxax
1403 axaxa#aa#axaxa
1404 xaxa#affa#axax
1405 axaxafaafaxaxa
1406 xa#afaxxafa#ax
1407 axafaxaaxafaxa
1408 #afaxaxxaxafa#
1409 #xafaxaaxafax#
1410 #axafaxxafaxa#
1411 #x#x#faaf#x#x#
1412 xaxax#ff#xaxax
1413 axaxa#aa#axaxa
1414 xaxaxaxxaxaxax
1415 ..............
1416 ..............
1417 Bonus:
1418 .m..........m.
1419 ..............
1420 ......&l......
1421 m...m.44.m...m
1422 ..............
1423 ..............
1424 ..............
1425 ..............
1426 ..............
1427 ..............
1428 ..............
1429 ..............
1430 ..............
1431 ..............
1432 bbbbb.ww.bbbbb
1433 bwbwbwbbwbwbwb
1434 ..............
1435 ..............
1436 Level:
1437 Ade
1438 Dead Fish
1439 Bricks:
1440 !!!*!!!#xxxxxx
1441 !jjjjjj.#yyyyx
1442 *jccccc..#zzyx
1443 !jcbbbb...jzyx
1444 !jcbaaa...#zyx
1445 *jcba......#yx
1446 !jcba.......#x
1447 !jcba........#
1448 !jcba.........
1449 .........abcj!
1450 #........abcj!
1451 x#.......abcj*
1452 xy#....aaabcj!
1453 xyz#...bbbbcj!
1454 xyzj...cccccj*
1455 xyzz#..jjjjjj!
1456 xyyyy#.!!!*!!!
1457 xxxxxx#.......
1458 Bonus:
1459 ........m.....
1460 .........&....
1461 ..............
1462 ..........m...
1463 ...........m..
1464 ............m.
1465 .............&
1466 ..............
1467 ....*.........
1468 ..............
1469 .........b....
1470 .........l....
1471 .........4....
1472 .........p....
1473 ...m...*......
1474 ..............
1475 ..............
1476 ..............
1477 Level:
1478 Ade
1479 Chance Master
1480 Bricks:
1481 ..............
1482 ..............
1483 ..............
1484 ..............
1485 xxxxxxxxxxxxxx
1486 #xxxxxxxxxxxx#
1487 #x*x*xffx*x*x#
1488 #fxfxffffxfxf#
1489 #fxfxfxxfxfxf#
1490 #fxfxfxxfxfxf#
1491 #fxfxffffxfxf#
1492 #x*x*xffx*x*x#
1493 #x#x#x##x#x#x#
1494 xxxxxxxxxxxxxx
1495 ..............
1496 ..............
1497 ..............
1498 ..............
1499 Bonus:
1500 ..............
1501 ..............
1502 ..............
1503 ..............
1504 ..m.m....m.m..
1505 ..............
1506 ..............
1507 ..............
1508 ..............
1509 ..............
1510 ..............
1511 ......44......
1512 .p.p.p..p.p.p.
1513 .....w..w.....
1514 ..............
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Ade
1520 One More Beer
1521 Bricks:
1522 xjjjjj...#####
1523 xyzzzzz...#fff
1524 xyzyyyyy...#ff
1525 xyzjxxxxx...#f
1526 xyzjc........#
1527 .yzjcb.#######
1528 ..zjcba.......
1529 ...jcbaa......
1530 ....cbaab.....
1531 .....baabc....
1532 ......aabcj...
1533 .......abcjz..
1534 #######.bcjzy.
1535 #........cjzyx
1536 f#...xxxxxjzyx
1537 ff#...yyyyyzyx
1538 fff#...zzzzzyx
1539 #####...jjjjjx
1540 Bonus:
1541 ..............
1542 ...........m..
1543 .....*........
1544 .*.....m.....m
1545 ..............
1546 ...*..........
1547 ..............
1548 .....*........
1549 ..............
1550 ..............
1551 .......*..*...
1552 ..............
1553 ..............
1554 ..............
1555 m.............
1556 ..............
1557 ..m.....*....*
1558 ..............
1559 Level:
1560 Ade
1561 Cast Away
1562 Bricks:
1563 ......ff......
1564 .....ffff.....
1565 ....ffzzff....
1566 ...ffzxxzff...
1567 ..ffzxaaxzff..
1568 .ffzxaxxaxzff.
1569 ffzxaxzzxaxzff
1570 fzxaxzxxzxaxzf
1571 zxaxzxaaxzxaxz
1572 zxaxzxaaxzxaxz
1573 fzxaxzxxzxaazf
1574 ffzxaxzzxaxzff
1575 .ffzxaxxaxzff.
1576 ..ffzxaaxzff..
1577 ...ffzxxzff...
1578 ....ffzzff....
1579 .....ffff.....
1580 ......ff......
1581 Bonus:
1582 ..............
1583 ..............
1584 ..............
1585 ..............
1586 ..............
1587 ..............
1588 ..............
1589 *............*
1590 ......mm......
1591 ......mm......
1592 *............*
1593 ..............
1594 ..............
1595 ..............
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Ade
1602 Cast Away
1603 Bricks:
1604 ..............
1605 ..............
1606 ..............
1607 ..............
1608 ..............
1609 ..............
1610 ..............
1611 ..............
1612 ..............
1613 ..............
1614 ..............
1615 ..............
1616 ..............
1617 ..............
1618 ..............
1619 ..............
1620 ..............
1621 ..............
1622 Bonus:
1623 ..............
1624 ..............
1625 ..............
1626 ..............
1627 ..............
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.00
1 Level:
2 Ade
3 Back To The Hell
4 Bricks:
5 xx#xx#xx#xx#xx
6 xxfxxfxxfxxfxx
7 xx#xx#xx#xx#xx
8 ..f..f..f..f..
9 xx#xx#xx#xx#xx
10 xxfxxfxxfxxfxx
11 xx#xx#xx#xx#xx
12 ..f..f..f..f..
13 xx#xx#xx#xx#xx
14 xxfxxfxxfxxfxx
15 xx#xx#xx#xx#xx
16 ..f..f..f..f..
17 xx#xx#xx#xx#xx
18 xxfxxfxxfxxfxx
19 xx#xx#xx#xx#xx
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 .....&..&.....
28 ..............
29 ..m..m..m..m..
30 ..............
31 ..............
32 ..............
33 ..m..m..m..m..
34 ..............
35 .....4..4.....
36 ..............
37 ..............
38 p.....pp.....p
39 ..............
40 ..............
41 ..............
42 Level:
43 Ade
44 Another Day In Paradise
45 Bricks:
46 .z..#ffff#..z.
47 .yz..#ff#..zy.
48 .xyz..##..zyx.
49 .#xyz....zyx#.
50 .x#xyz..zyx#x.
51 .yx#xyzzyx#xy.
52 .zyx#xyyx#xyz.
53 ..zyx#xx#xyz..
54 ...zyx**xyz...
55 ...zyx**xyz...
56 ..zyx#xx#xyz..
57 .zyx#xyyx#xyz.
58 .yx#xyzzyx#xy.
59 .x#xyz..zyx#x.
60 .#xyz....zyx#.
61 .xyz..##..zyx.
62 .yz..#ff#..zy.
63 .z..#ffff#..z.
64 Bonus:
65 ..............
66 ......mm......
67 ..............
68 ..............
69 ..............
70 ..............
71 ..............
72 ......ll......
73 .....m..m.....
74 .....m..m.....
75 ....&.44.&....
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ......**......
82 .....****.....
83 Level:
84 Ade
85 The Million Show
86 Bricks:
87 jjjjjjjj#.....
88 jzzzzzz#...#..
89 jzyyyy#...xf..
90 jzyxx#...#f#..
91 jzyx#...xf#f..
92 jzy#...#f#f#..
93 jz#...xf#f#f..
94 j#...#f#f#fx..
95 #...xf#f#f#...
96 ...#f#f#fx...#
97 ..xf#f#f#...#j
98 ..f#f#fx...#zj
99 ..#f#f#...#yzj
100 ..f#fx...#xyzj
101 ..#f#...#xxyzj
102 ..fx...#yyyyzj
103 ..#...#zzzzzzj
104 .....#jjjjjjjj
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..m...........
112 .m............
113 m.......m.....
114 ..............
115 ......&..4....
116 .....m........
117 .......l.....m
118 ...&..........
119 ..*..4........
120 ..............
121 ...l..........
122 ..............
123 .............*
124 Level:
125 Ade
126 Made In Heaven
127 Bricks:
128 ..............
129 ..............
130 #..#!#..#!#..#
131 f##!x!##!x!##f
132 f##!x!##!x!##f
133 #..#!#..#!#..#
134 ..............
135 #..x!x..x!x..#
136 f##!x!##!x!##f
137 f##!x!##!x!##f
138 #..x!x..x!x..#
139 ..............
140 #..#!#..#!#..#
141 f##!x!##!x!##f
142 f##!x!##!x!##f
143 #..#!#..#!#..#
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ....m....m....
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ....m....m....
157 ....l....l....
158 ..............
159 ..............
160 m..***..***..m
161 m..*4*..*4*..m
162 ....*....*....
163 ..............
164 ..............
165 Level:
166 Ade
167 Monsters
168 Bricks:
169 x............x
170 #x....xx....x#
171 a#x..xaax..x#a
172 xa#xxaxxaxx#ax
173 axa#axaaxa#axa
174 #axaxa..axaxa#
175 x#axa.vv.axa#x
176 .x#a..##..a#x.
177 ..x..#ff#..x..
178 ..x..#ff#..x..
179 .x#a..##..a#x.
180 x#axa.vv.axa#x
181 #axaxa..axaxa#
182 axa#axaaxa#axa
183 xa#xxaxxaxx#ax
184 a#x..xaax..x#a
185 #x....xx....x#
186 x............x
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ......ll......
192 ......44......
193 ..............
194 ......mm......
195 ..............
196 ......mm......
197 ..m...mm...m..
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ......pp......
204 ......pp......
205 ..............
206 Level:
207 Ade
208 Stars
209 Bricks:
210 .y..........y.
211 y!y...cc...y!y
212 .y...czzc...y.
213 ....cz!!zc....
214 .a...czzc...a.
215 a!a...cc...a!a
216 .a..y....y..a.
217 ...yby..yby...
218 ..yb!byyb!by..
219 ..yb!byyb!by..
220 ...yby..yby...
221 .a..y....y..a.
222 a!a...cc...a!a
223 .a...czzc...a.
224 ....cz!!zc....
225 .y...czzc...y.
226 y!y...cc...y!y
227 .y..........y.
228 Bonus:
229 ..............
230 ..............
231 ......&&......
232 ..............
233 ..............
234 .m..........m.
235 ..............
236 ..............
237 ......mm......
238 ......mm......
239 ..............
240 ..............
241 .p....44....p.
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Ade
249 Another Day
250 Bricks:
251 a###az**za###a
252 ab#baxzzxab#ba
253 vbcbvxaaxvbcbv
254 #vcv#zaaz#vcv#
255 a#v#a*zz*a#v#a
256 ab#bax**xab#ba
257 vbcbvxaaxvbcbv
258 #vcv#zaaz#vcv#
259 a#v#a*zz*a#v#a
260 ab#bax**xab#ba
261 vbcbvxaaxvbcbv
262 #vcv#zaaz#vcv#
263 .#v#..zz..#v#.
264 ..#........#..
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 .....m..m.....
271 ..............
272 ..............
273 ..............
274 ......44......
275 .....p..p.....
276 ..............
277 ..............
278 ......ll......
279 m............m
280 ..............
281 ..m........m..
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Ade
290 Show Me The Money
291 Bricks:
292 .zzzz#zz#zzzz.
293 .z##########z.
294 .z##########z.
295 .z#zz#zz#zzzz.
296 .z#zz#zz#zzzz.
297 .z#zz#zz#zzzz.
298 .z#zz#zz#zzzz.
299 .z#zz#zz#zzzz.
300 .z##########z.
301 .z##########z.
302 .zzzz#zz#zz#z.
303 .zzzz#zz#zz#z.
304 .zzzz#zz#zz#z.
305 .zzzz#zz#zz#z.
306 .zzzz#zz#zz#z.
307 .z##########z.
308 .z##########z.
309 .zzzz#zz#zzzz.
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ..............
318 .*.......m..*.
319 ..............
320 ..............
321 ......44......
322 .*..........*.
323 ..............
324 ..............
325 ....m.mm.mm...
326 ..............
327 ..............
328 .*..........*.
329 Level:
330 Ade
331 Bloody Sunday
332 Bricks:
333 j...#ffff#...j
334 zj...#ff#...jz
335 yzj...##...jzy
336 xyzj......jzyx
337 yxyzj....jzyxy
338 zyxyz....zyxyz
339 jzyxy.jj.yxyzj
340 .jzyx.zz.xyzj.
341 ..jzy.yy.yzj..
342 ...jz.xx.zj...
343 #...j.yy.j...#
344 f#....zz....#f
345 ff#...jj...#ff
346 fff#......#fff
347 ffff#....#ffff
348 ######..######
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ......mm......
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ......ll......
361 ......mm......
362 ......44......
363 ..............
364 ..............
365 ..............
366 .m.&......&.m.
367 ..............
368 ..............
369 ..............
370 Level:
371 Ade
372 Twenty
373 Bricks:
374 ...xyzjjzyx...
375 ...xyzzzzyx...
376 ...xyyyyyyx...
377 ...xxxxxxxx...
378 ..............
379 xxxx......xxxx
380 yyyx......xyyy
381 zzyx.xxxx.xyzz
382 jzyx.xffx.xyzj
383 jzyx.xffx.xyzj
384 zzyx.xxxx.xyzz
385 yyyx......xyyy
386 xxxx......xxxx
387 ..............
388 ...xxxxxxxx...
389 ...xyyyyyyx...
390 ...xyzzzzyx...
391 ...xyzjjzyx...
392 Bonus:
393 ......mm......
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 4.....mm.....4
402 m.....mm.....m
403 ..............
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Ade
413 Chocolate
414 Bricks:
415 ..............
416 ..............
417 ..............
418 aaaaaaaaaaaaaa
419 aaa#aaaaaa#aaa
420 aa#x#aaaa#x#aa
421 a#x.x#aa#x.x#a
422 #x...x##x...x#
423 x.....xx.....x
424 x.....xx.....x
425 #x...x##x...x#
426 a#x.x#aa#x.x#a
427 aa#x#aaaa#x#aa
428 aaa#aaaaaa#aaa
429 aaaaaaaaaaaaaa
430 ..............
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ..............
438 ..............
439 ..............
440 ......44......
441 ..............
442 ..............
443 ..............
444 ..............
445 ..m.&.mm.&.m..
446 ..............
447 ..............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Ade
454 MicroHard
455 Bricks:
456 a.....#.......
457 za....a#......
458 aza...xa#.....
459 yaza..axa#....
460 ayaza.#axa#...
461 xayaza##axa#..
462 axayaza##axa#.
463 #axayaza##axa#
464 ##axayaza##axa
465 ##axayaza##axa
466 #axayaza##axa#
467 axayaza##axa#.
468 xayaza##axa#..
469 ayaza.#axa#...
470 yaza..axa#....
471 aza...xa#.....
472 za....a#......
473 a.....#.......
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ..............
480 m.......m.....
481 m........m....
482 ..........m...
483 ........m.....
484 ........m.....
485 ..............
486 ..............
487 ll44*.........
488 ..............
489 ..*...........
490 ......*.......
491 *.............
492 ..............
493 Level:
494 Ade
495 Enigma
496 Bricks:
497 ....#f!f!fx...
498 ...xf!f!f#....
499 ..#f!f!fx....#
500 .xf!f!f#....xf
501 #f!f!fx....#f!
502 f!f!f#....xf!f
503 !f!fx....#f!f!
504 f!f#....xf!f!f
505 !fx....#f!f!f#
506 f#....xf!f!fx.
507 x....#f!f!f#..
508 ....xf!f!fx...
509 ...#f!f!f#....
510 ..xf!f!fx.....
511 .#f!f!f#......
512 xf!f!fx.......
513 f!f!f#........
514 ####x.........
515 Bonus:
516 ..............
517 ........m.....
518 ..............
519 ...4..m.......
520 ..............
521 ....m.........
522 ...4..........
523 ..m...........
524 ..............
525 m.............
526 ..............
527 .........*....
528 ........*.....
529 .......*......
530 ......*.......
531 .....*........
532 ....*.........
533 ..............
534 Level:
535 Ade
536 GT
537 Bricks:
538 xxxxxxx.......
539 xaaaaaa.......
540 xaxxxxx.......
541 xax...........
542 xax..xxxxxxxxx
543 xax..aaaaaaaaa
544 xax..xxxxaxxxx
545 xax.....xax...
546 xax.xax.xax...
547 xax.xax.xax...
548 xax..ax.xax...
549 xaxxxax.xax...
550 xaaaaax.xax...
551 xxxxxxx.xax...
552 ........xax...
553 ........xax...
554 ........xax...
555 ..............
556 Bonus:
557 ..............
558 ..*...*.......
559 ..............
560 ..............
561 *.............
562 ..l......*....
563 ..l...........
564 ..............
565 ..*......4....
566 *........4....
567 ..............
568 ..*...........
569 .........*....
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Ade
577 The Final Cut
578 Bricks:
579 vvvvvvvv...###
580 vxxxxxxv...#f#
581 vxvvvvvv...###
582 vxv...........
583 vxv...........
584 vxv.vvvvvv....
585 vxv.v####v....
586 vxv.v#xx#v....
587 vxv.v#xx#v.vvv
588 vvv.v####v.vxv
589 ....vvvvvv.vxv
590 ...........vxv
591 ...........vxv
592 ###...vvvvvvxv
593 #f#...vxxxxxxv
594 ###...vvvvvvvv
595 ..............
596 ..............
597 Bonus:
598 ..............
599 .m..........m.
600 ..............
601 ..............
602 ..............
603 ......**......
604 ..............
605 ......mm......
606 ......mm......
607 *.*...........
608 ......44......
609 ..............
610 ..............
611 ..............
612 .m..........*.
613 ..............
614 ..............
615 ..............
616 Level:
617 Ade
618 Too Old To Rock
619 Bricks:
620 ..............
621 ....######....
622 ...x#!!!!#x...
623 ..y##!##!##y..
624 .z#x#!##!#x#z.
625 j#yx#!!!!#xy#j
626 jz#x######x#zj
627 jzy##ffff##yzj
628 jzyx#f##f#xyzj
629 jzyx#f##f#xyzj
630 jzy##ffff##yzj
631 jz#x######x#zj
632 j#yx#!!!!#xy#j
633 .z#x#!##!#x#z.
634 ..y##!##!##y..
635 ...x#!!!!#x...
636 ....######....
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 ..............
644 m............m
645 ..............
646 ..............
647 ..............
648 ..............
649 .....m..m.....
650 ...l......l...
651 ..m........m..
652 ...4......4...
653 ..............
654 ..............
655 ..............
656 ..............
657 Level:
658 Ade
659 Too Young To Die
660 Bricks:
661 .###.####.###.
662 .#v#.#ff#.#v#.
663 .###.####.###.
664 ..............
665 .xxx.xxxx.xxx.
666 .xvx.xffx.xvx.
667 .xxx.xxxx.xxx.
668 ..............
669 .###.####.###.
670 .#v#.#ff#.#v#.
671 .###.####.###.
672 ..............
673 .xxx.xxxx.xxx.
674 .xvx.xffx.xvx.
675 .xxx.xxxx.xxx.
676 ..............
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..m...mm...m..
686 ..............
687 ..............
688 ..............
689 ......44......
690 ..............
691 ..............
692 ..............
693 ..............
694 ..............
695 ..............
696 ..............
697 ..............
698 Level:
699 Ade
700 Hole In The Sky
701 Bricks:
702 ..............
703 vvvvvvffvvvvvv
704 v############v
705 v#xxxxxxxxxx#v
706 v#x########x#v
707 v#x#vvvvvv#x#v
708 v#x#vvvvvv#x#v
709 v#x#vvvvvv#x#v
710 f#x#vv##vv#x#f
711 f#x#vv##vv#x#f
712 v#x#vvvvvv#x#v
713 v#x#vvvvvv#x#v
714 v#x#vvvvvv#x#v
715 v#x########x#v
716 v#xxxxxxxxxx#v
717 v############v
718 vvvvvvffvvvvvv
719 ..............
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ..............
727 ..............
728 ..............
729 .....4..4.....
730 m............m
731 ..............
732 ..............
733 ....lm&&ml....
734 ..............
735 ..m........m..
736 ..............
737 ......**......
738 ..............
739 Level:
740 Ade
741 Machine Messiah
742 Bricks:
743 xxxxxxxxx.....
744 ##.......x....
745 .xx.......x...
746 ..##.......x..
747 ...xx.......x.
748 ....#########.
749 ....a......###
750 ############aa
751 xxxxxxxxxx#a..
752 xxxxxxxxxx#a..
753 ############aa
754 ....a......###
755 ....#########.
756 ...xx.......x.
757 ..##.......x..
758 .xx.......x...
759 ##.......x....
760 xxxxxxxxx.....
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 ..............
768 ....m.........
769 ..............
770 ..............
771 .m.4m..m.4.m..
772 ..............
773 ....m.........
774 ..............
775 ..............
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Ade
782 20
783 Bricks:
784 zzzzzzzzzzzzzz
785 zzz##zzzz###zz
786 zz####zz#####z
787 z##zz##z#zzz#z
788 z#zzzz#z#zzz#z
789 z#zzzz#z#zzz#z
790 zzzzzz#z#zzz#z
791 zzzzz##z#zzz#z
792 zzzz##zz#zzz#z
793 zzz##zzz#zzz#z
794 zz##zzzz#zzz#z
795 z##zzz#z#zzz#z
796 z######z#####z
797 z######zz###zz
798 zzzzzzzzzzzzzz
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 m............m
809 ..............
810 ..............
811 ..............
812 ..............
813 ....&.....&...
814 ...l4l.4.m&m..
815 ..............
816 ..............
817 *....*..*....*
818 ..............
819 ..............
820 ..............
821 Level:
822 Ade
823 You Never Be Alone
824 Bricks:
825 ..######....##
826 .#jzyx#....#xy
827 #jzyx#....#xyz
828 jzyx#....#xyzj
829 zyx#....#xyzj.
830 yx#....#xyzj..
831 x#....#####...
832 #.............
833 ..............
834 ..............
835 #.............
836 x#....#####...
837 yx#....#xyzj..
838 zyx#....#xyzj.
839 jzyx#....#xyzj
840 #jzyx#....#xyz
841 .#jzyx#....#xy
842 ..######....##
843 Bonus:
844 ..............
845 ..............
846 ....m.........
847 .............m
848 ..............
849 .m............
850 ..............
851 ..............
852 ..............
853 ..............
854 ..............
855 ..............
856 ..............
857 ..............
858 ...4..........
859 .m..m......m..
860 ..&4........4.
861 ..............
862 Level:
863 Ade
864 Always On My Mind
865 Bricks:
866 #.....##.....#
867 f#...#zz#...#f
868 ff###zaaz###ff
869 f#xxx#zz#xxx#f
870 #xaaax##xaaax#
871 xazzzaxxazzzax
872 #xaaax##xaaax#
873 f#xxx#zz#xxx#f
874 ff###zaaz###ff
875 f#xxx#zz#xxx#f
876 #xaaax##xaaax#
877 xazzzaxxazzzax
878 #xaaax##xaaax#
879 f#xxx#zz#xxx#f
880 ff###zaaz###ff
881 f#vvv#zz#vvv#f
882 #v...v##v...v#
883 ..............
884 Bonus:
885 ..............
886 ..............
887 ..............
888 ..............
889 ..............
890 ..............
891 ..............
892 ..............
893 ..............
894 ..............
895 ..............
896 m...4lmml4...m
897 ..............
898 ..............
899 .m..........m.
900 ...m......m...
901 ..............
902 ..............
903 Level:
904 Ade
905 Sin
906 Bricks:
907 ......##......
908 .....xxxx.....
909 ....##..##....
910 ....x....x....
911 ...xx.aa.xx...
912 ..##.a!!a.##..
913 ..x.a!zz!a.x..
914 .xxa!zaaz!axx.
915 ##a!za!!az!a##
916 .xxa!zaaz!axx.
917 ..x.a!zz!a.x..
918 ..##.a!!a.##..
919 ...xx.aa.xx...
920 ....x....x....
921 ....##..##....
922 .....xxxx.....
923 ......##......
924 ..............
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..............
933 ..............
934 ..............
935 ...m......m...
936 ....&....&....
937 .....m..m.....
938 ......44......
939 ..............
940 ..............
941 ..............
942 ..............
943 ..............
944 Level:
945 Ade
946 Empty Spaces
947 Bricks:
948 ..v...##...v..
949 fvvvf#..#fvvvf
950 ..v..v##v..v..
951 ..v...vv...v..
952 ..v...vv...v..
953 ..v..v##v..v..
954 fvvvf#..#fvvvf
955 ..v..v##v..v..
956 ..v...vv...v..
957 ..v...vv...v..
958 ..v..v##v..v..
959 fvvvf#..#fvvvf
960 ..v..v##v..v..
961 ..v...vv...v..
962 ..............
963 ..............
964 ..............
965 ..............
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ..............
971 ......**......
972 ..............
973 *.*.*....*.*.*
974 ..............
975 ..............
976 ..............
977 ..............
978 l...4....4...l
979 ..............
980 ..............
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Ade
987 Waiting For You
988 Bricks:
989 ##..........##
990 ax#........#xa
991 .ay#......#ya.
992 ..az#....#za..
993 ...aj....ja...
994 ....a....a....
995 ..............
996 ##.##.##.##.##
997 xx.xx.xx.xx.xx
998 xx.xx.xx.xx.xx
999 ##.##.##.##.##
1000 ..............
1001 ....a....a....
1002 ...aj....ja...
1003 ..az#....#za..
1004 .ay#......#ya.
1005 ax#........#xa
1006 ##..........##
1007 Bonus:
1008 ..............
1009 m............m
1010 ..............
1011 ..............
1012 ..............
1013 ..............
1014 ..............
1015 ..............
1016 ..............
1017 ......44......
1018 ..............
1019 ..............
1020 ..............
1021 ..............
1022 ..............
1023 ..............
1024 mm..........mm
1025 ..............
1026 Level:
1027 Ade
1028 Endless
1029 Bricks:
1030 v###v####v###v
1031 .#x#.#xx#.#x#.
1032 .###.####.###.
1033 .#x#.#xx#.#x#.
1034 .###.####.###.
1035 .#x#.#xx#.#x#.
1036 .###.####.###.
1037 .#x#.#xx#.#x#.
1038 ..............
1039 ..............
1040 .#x#.#xx#.#x#.
1041 .###.####.###.
1042 .#x#.#xx#.#x#.
1043 .###.####.###.
1044 .#x#.#xx#.#x#.
1045 .###.####.###.
1046 .#x#.#xx#.#x#.
1047 .###.####.###.
1048 Bonus:
1049 m...m....m...m
1050 ..............
1051 ..............
1052 ..............
1053 ..............
1054 ..............
1055 ..............
1056 ..............
1057 ..............
1058 ..............
1059 ..............
1060 ..............
1061 ..............
1062 ..............
1063 ......ll......
1064 ..............
1065 ..m...44...m..
1066 ..............
1067 Level:
1068 Ade
1069 Deep Purple
1070 Bricks:
1071 ...#aaxxaa#...
1072 ..#aax..xaa#..
1073 .#aax....xaa#.
1074 #aax..xx..xaa#
1075 aax..x!!x..xaa
1076 ax..x!!!!x..xa
1077 x..x!!xx!!x..x
1078 a.x!!x##x!!x.a
1079 ax!!x#zz#x!!xa
1080 ax!!x#zz#x!!xa
1081 a.x!!x##x!!x.a
1082 x..x!!xx!!x..x
1083 ax..x!!!!x..xa
1084 aax..x!!x..xaa
1085 #aax..xx..xaa#
1086 .#aax....xaa#.
1087 ..#aax..xaa#..
1088 ...#aaxxaa#...
1089 Bonus:
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 ..............
1096 ..............
1097 ..............
1098 .m..m....m..m.
1099 ......mm......
1100 ..............
1101 ..............
1102 ..............
1103 ..............
1104 ...4......4...
1105 ..............
1106 ..............
1107 .....*..*.....
1108 Level:
1109 Ade
1110 Yesterday
1111 Bricks:
1112 ..............
1113 ..............
1114 vvvv.####.vvvv
1115 v##v.#vv#.v##v
1116 vvvv.####.vvvv
1117 ..............
1118 vvvv.####.vvvv
1119 v##v.#vv#.v##v
1120 ......**......
1121 ......**......
1122 v##v.#vv#.v##v
1123 vvvv.####.vvvv
1124 ..............
1125 vvvv.####.vvvv
1126 v##v.#vv#.v##v
1127 vvvv.####.vvvv
1128 ..............
1129 ..............
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ..............
1135 ..............
1136 ..............
1137 ****......****
1138 ......mm......
1139 ..............
1140 ..............
1141 ......mm......
1142 ..............
1143 ..............
1144 ..............
1145 ......44......
1146 ****......****
1147 ..............
1148 ..............
1149 Level:
1150 Ade
1151 Today
1152 Bricks:
1153 ..............
1154 .vvvvvxxvvvvv.
1155 #............#
1156 .vvvvvxxvvvvv.
1157 .v#........#v.
1158 .v.vvvxxvvv.v.
1159 .v.v#....#v.v.
1160 .v.v.vvvv.v.v.
1161 .x.x.vxxv.x.x.
1162 .x.x.vxxv.x.x.
1163 .v.v.vvvv.v.v.
1164 .v.v#....#v.v.
1165 .v.vvvxxvvv.v.
1166 .v#........#v.
1167 .vvvvvxxvvvvv.
1168 #............#
1169 .vvvvvxxvvvvv.
1170 ..............
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 .*..........*.
1176 ..............
1177 ......**......
1178 ..............
1179 ..............
1180 ..............
1181 .*.*..**..*.*.
1182 ..............
1183 ..............
1184 ......ll......
1185 ..............
1186 .*....44....*.
1187 ..............
1188 ......**......
1189 ..............
1190 Level:
1191 Ade
1192 Tomorrow
1193 Bricks:
1194 ..............
1195 ..............
1196 xxxx.xxxx.xxxx
1197 xvvx.xvvx.xvvx
1198 xvvx.xvvx.xvvx
1199 xxxx.xxxx.xxxx
1200 ..............
1201 xxxx.xxxx.xxxx
1202 xvvx.xvvx.xvvx
1203 xvvx.xvvx.xvvx
1204 xxxx.xxxx.xxxx
1205 ..............
1206 xxxx.xxxx.xxxx
1207 xvvx.xvvx.xvvx
1208 xvvx.xvvx.xvvx
1209 xxxx.xxxx.xxxx
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..............
1219 ..............
1220 ..............
1221 .**...**...**.
1222 .**...**...**.
1223 ..............
1224 ..............
1225 ...p.4..4.p...
1226 ..............
1227 ..............
1228 p..p.p..p.p..p
1229 ..............
1230 ..............
1231 Level:
1232 Ade
1233 Back To Back
1234 Bricks:
1235 xxv.xxx.xx.xvx
1236 xvx.xvx.xv.xvx
1237 xxv.xxx.xv.xxv
1238 xvx.xvx.xv.xvx
1239 xxv.xvx.xx.xvx
1240 ..............
1241 ...xxx.xxx....
1242 ...vxv.xvx....
1243 ...vxv.xvx....
1244 ...vxv.xxx....
1245 ..............
1246 xx..xxx.xx.x.x
1247 x.x.x.x.x..x.x
1248 xx..xxx.x..xx.
1249 x.x.x.x.x..x.x
1250 xxvvxvxvxxvxvx
1251 ..............
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 bb..b.b..b.b.b
1259 ..............
1260 ...b.b........
1261 ..............
1262 ..............
1263 ..............
1264 ..............
1265 .b....b.bb....
1266 ..b...b.b.....
1267 ....bbb.b.....
1268 ..b.b.b.b..b.b
1269 wbwbwww.www.ww
1270 ..............
1271 ..............
1272 Level:
1273 Ade
1274 Terminator
1275 Bricks:
1276 xx..........xx
1277 .xx........xx.
1278 ..xx......xx..
1279 x..xx*##*xx..x
1280 xx..xx##xx..xx
1281 .xx..xxxx..xx.
1282 ..xx..xx..xx..
1283 x..xx*##*xx..x
1284 xx..xx##xx..xx
1285 .xx..xxxx..xx.
1286 ..xx..xx..xx..
1287 x..xx*##*xx...
1288 xx..xx##xx..xx
1289 .xx..xxxx..xx.
1290 ..xx..xx..xx..
1291 ...xx*##*xx...
1292 ....xx##xx....
1293 .....xxxx.....
1294 Bonus:
1295 bb..........bb
1296 .bb........bb.
1297 ..b*......*b..
1298 w..**....**..w
1299 .w..**..**..w.
1300 .....*..*.....
1301 ......**......
1302 ....*....*....
1303 ....*....*....
1304 ..............
1305 ......**......
1306 ..............
1307 ....*....*....
1308 ..............
1309 ......44......
1310 ..............
1311 ..............
1312 .....pppp.....
1313 Level:
1314 Ade
1315 Killing Time
1316 Bricks:
1317 !#############
1318 f!....czf!fz..
1319 zf!....czf!fz.
1320 fzf!....czf!fz
1321 !fzf!....czf!f
1322 f!fzf!....czf!
1323 zf!fzf!....czf
1324 czf!fzf!....cz
1325 .czf!fzf!....c
1326 .czf!fzf!....c
1327 czf!fzf!....cz
1328 zf!fzf!....czf
1329 f!fzf!....czf!
1330 !fzf!....czf!f
1331 fzf!....czf!fz
1332 zf!....czf!fz.
1333 f!....czf!fz..
1334 !#############
1335 Bonus:
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ..............
1346 ..............
1347 .......4......
1348 ..............
1349 m.m.m....m.m.m
1350 ....4.........
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Ade
1356 Dib Lib
1357 Bricks:
1358 #####zaaz#####
1359 #cbazabbazabc#
1360 #bazabccbazab#
1361 #azabcjjcbaza#
1362 #zabcjffjcbaz#
1363 zabcjffffjcbaz
1364 abcjffffffjcba
1365 abcjffffffjcba
1366 zabcjffffjcbaz
1367 #zabcjffjcbaz#
1368 #azabcffcbaza#
1369 #bazabffbazab#
1370 #cbazaffazabc#
1371 ######ff######
1372 ......ff......
1373 ......ff......
1374 ......ff......
1375 ......ff......
1376 Bonus:
1377 ......mm......
1378 ..............
1379 ..............
1380 ..............
1381 ..............
1382 ..............
1383 ..............
1384 .....lppl.....
1385 .m..........m.
1386 ..............
1387 ..............
1388 ..............
1389 ...m......m...
1390 ..............
1391 ......pp......
1392 ......pp......
1393 ......pp......
1394 ..............
1395 Level:
1396 Ade
1397 Gol
1398 Bricks:
1399 ##############
1400 #xxxxxxxxxxxx#
1401 #xaaaaaaaaaax#
1402 #xazzzzzzzzax#
1403 #xazaaaaaazax#
1404 #xazaxxxxazax#
1405 #xazax..xazax#
1406 #xazax..xazax#
1407 #xazax..xazax#
1408 #xaza....azax#
1409 #xaz......zax#
1410 #xa..x..x..ax#
1411 #x..ax..xa..x#
1412 #..zax..xaz..#
1413 ..azax..xaza..
1414 .xazax..xazax.
1415 .############.
1416 ..............
1417 Bonus:
1418 ..............
1419 ..............
1420 ..............
1421 ..............
1422 ..............
1423 ..m..m..m..m..
1424 ..............
1425 ..............
1426 .....4..4.....
1427 ..............
1428 ..............
1429 ..............
1430 ..............
1431 ..............
1432 ..............
1433 ....mm..mm....
1434 ..............
1435 ..............
1436 Level:
1437 Ade
1438 Dead Fish
1439 Bricks:
1440 ......zz......
1441 ....#zaaz#....
1442 ...#zazzaz#...
1443 ..#zazaazaz#..
1444 .#zazazzazaz#.
1445 .zazazaazazaz.
1446 zazazazzazazaz
1447 ..............
1448 ..............
1449 ..............
1450 ..............
1451 zazazazzazazaz
1452 .zazazaazazaz.
1453 .#zazazzazaz#.
1454 ..#zazaazaz#..
1455 ...#zazzaz#...
1456 ....#zaaz#....
1457 ......zz......
1458 Bonus:
1459 ..............
1460 ..............
1461 ..............
1462 ..............
1463 ...m.m..m.m...
1464 ..............
1465 ..............
1466 ..............
1467 ..............
1468 ..............
1469 ..............
1470 ..............
1471 ..............
1472 ...m.m..m.m...
1473 ......44......
1474 ..............
1475 ..............
1476 ..............
1477 Level:
1478 Ade
1479 Freedom
1480 Bricks:
1481 xxxaaaaaazazaz
1482 xaaaaaaaaazaza
1483 xaaxxxaaaaazaz
1484 xxaxaxaaaaaaza
1485 xaaxaxaxxxaaaz
1486 xaaxxaaxaaaaaa
1487 xaaxxaaxaaaxxx
1488 aaaxaxaxxaaxaa
1489 zaaxaxaxaaaxaa
1490 azaaaaaxaaaxxa
1491 zazaaaaxxxaxaa
1492 azazaaaaaaaxaa
1493 zazazaaaaaaxxx
1494 azazazaaaaaaaa
1495 z#z#z#zz#z#z#z
1496 ..............
1497 ..............
1498 ..............
1499 Bonus:
1500 ..............
1501 ..............
1502 .***......***.
1503 ..............
1504 ....*...*.....
1505 ..............
1506 ..............
1507 ..*...*...*...
1508 ..............
1509 ..............
1510 .*...*.*...*..
1511 ..............
1512 ..............
1513 ..............
1514 ..p...pp...p..
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Ade
1520 Day By Day
1521 Bricks:
1522 ......zz......
1523 .....z!!z.....
1524 ....z!zz!z....
1525 ...z!z..z!z...
1526 ..z!z....z!z..
1527 .z!z..zz..z!z.
1528 z!z..z!!z..z!z
1529 !z..z!zz!z..z!
1530 z..z!z..z!z..z
1531 ..z!z.##.z!z..
1532 .z!z.#xx#.z!z.
1533 z!z.#x!!x#.z!z
1534 .z!z.#xx#.z!z.
1535 ..z!z.##.z!z..
1536 ...z!z..z!z...
1537 ....z!zz!z....
1538 .....z!!z.....
1539 ......zz......
1540 Bonus:
1541 ..............
1542 ......mm......
1543 ..............
1544 ....m....m....
1545 ..............
1546 ..m........m..
1547 ..............
1548 ..............
1549 ..............
1550 ..............
1551 ..............
1552 ......mm......
1553 ..............
1554 ..............
1555 ..............
1556 ..............
1557 ..............
1558 ..............
1559 Level:
1560 Ade
1561 The End
1562 Bricks:
1563 .#.v..##..v.#.
1564 .#.v..##..v.#.
1565 #x#v##xx##v#x#
1566 #x#v##xx##v#x#
1567 .#.v..##..v.#.
1568 v#vvvv##vvvv#v
1569 ..............
1570 ..............
1571 .#....##....#.
1572 .#....##....#.
1573 #x#.##xx##.#x#
1574 #x#.##xx##.#x#
1575 .#....##....#.
1576 .#....##....#.
1577 ..............
1578 ..............
1579 ..............
1580 ..............
1581 Bonus:
1582 ..............
1583 ..............
1584 ..............
1585 ..............
1586 ...m......m...
1587 ..............
1588 ..............
1589 ..............
1590 ..............
1591 ..............
1592 ..............
1593 .m....mm....m.
1594 ..............
1595 ..............
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Ade
1602 The End
1603 Bricks:
1604 ..............
1605 ..............
1606 ..............
1607 ..............
1608 ..............
1609 ..............
1610 ..............
1611 ..............
1612 ..............
1613 ..............
1614 ..............
1615 ..............
1616 ..............
1617 ..............
1618 ..............
1619 ..............
1620 ..............
1621 ..............
1622 Bonus:
1623 ..............
1624 ..............
1625 ..............
1626 ..............
1627 ..............
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.00
1 Level:
2 Ade
3 Welcome Back To GW4
4 Bricks:
5 #####..##...##
6 #####..##...##
7 ##.....##...##
8 ##.....##...##
9 ##.##..##...##
10 ##.##..##.#.##
11 ##..#..##.#.##
12 #####..#######
13 #####..###.###
14 .......v......
15 .......#......
16 ......##......
17 .....#.#......
18 ....#..#......
19 ff..######..ff
20 .......#......
21 .......#......
22 .......#......
23 Bonus:
24 mmmmm..mm...mm
25 mmmmm..mm...mm
26 mm.....mm...mm
27 mm.....mm...mm
28 mm.mm..mm...mm
29 mm.mm..mm.m.mm
30 mm..m..mm.m.mm
31 mmmmm..mmmmmmm
32 mmmmm..mmm.mmm
33 .......m......
34 .......m......
35 ......mm......
36 .....m.m......
37 ....m..m......
38 m...mmmmmm....
39 .......m......
40 .......m......
41 .......m......
42 Level:
43 Ade
44 New Bricks
45 Bricks:
46 @@@...xx...@@@
47 ExE...xx...ExE
48 @@@.######.@@@
49 ....#xEEx#....
50 @@@.######.@@@
51 ExE...ff...ExE
52 @@@.######.@@@
53 ....#xEEx#....
54 @@@.######.@@@
55 ExE...xx...ExE
56 @@@...xx...@@@
57 ..............
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ......mm......
66 .m....mm....m.
67 ..............
68 ..............
69 ..............
70 .m....mm....m.
71 ..............
72 ..............
73 ..............
74 .m....44....m.
75 ......ll......
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Ade
85 More Fun
86 Bricks:
87 ..............
88 ..............
89 ...@#@##@#@...
90 ...#......#...
91 ...@.EEEE.@...
92 ...#.@xx@.#...
93 ...@.#ff#.@...
94 .*.#.@xx@.#.*.
95 .*.@.#ff#.@.*.
96 .@.#.@xx@.#.@.
97 .#.@.#ff#.@.#.
98 .@.*.@xx@.*.@.
99 .#.*.#ff#.*.#.
100 .@...@xx@...@.
101 .#EEE#ff#EEE#.
102 .@#@#@xx@#@#@.
103 .....EEEE.....
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ......mm......
112 ..............
113 .l....mm....l.
114 ..............
115 ..............
116 ..............
117 ..............
118 ...m......m...
119 ......mm......
120 ..............
121 ......mm......
122 ..............
123 ..............
124 Level:
125 Ade
126 OK
127 Bricks:
128 xx@xx@xx@xx@xx
129 @@@@@@@@@@@@@@
130 xxxxxx@@xx@@@x
131 xxxxxx@@xx@@xx
132 xx@@xx@@xx@xx@
133 xx@@xx@@xxxx@@
134 xx@@xx@@xxx@@@
135 xx@@xx@@xx@@@@
136 xx@@xx@@xxx@@@
137 xx@@xx@@xxxx@@
138 xx@@xx@@xx@xx@
139 xxxxxx@@xx@@xx
140 xxxxxx@@xx@@@x
141 @@@@@@@@@@@@@@
142 xx@EE@xx@EE@xx
143 ff#ff#ff#ff#ff
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 mmmmmm..mm...m
160 ..............
161 ......mm......
162 ......44......
163 ..............
164 ..............
165 Level:
166 Ade
167 Some Ants
168 Bricks:
169 @@f@@f@@f@@f@@
170 ..............
171 ..............
172 ..E..E..E..E..
173 ..E..E..E..E..
174 ..............
175 .xxx.xxxx.xxx.
176 fx#xfx##xfx#xf
177 .xxx.xxxx.xxx.
178 ..............
179 ..E..E..E..E..
180 ..E..E..E..E..
181 ..............
182 ..............
183 @@f@@f@@f@@f@@
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..m..m..m..m..
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 4.m.l.mm.l.m.4
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Ade
208 Jonestown
209 Bricks:
210 ..............
211 ......@@......
212 ......@@......
213 ...@@@@@@@@...
214 ...@@@@@@@@...
215 ......@@......
216 ......@@......
217 ..@...@@...@..
218 .@f@..@@..@f@.
219 @fff@.@@.@fff@
220 .@f@..@@..@f@.
221 .@f@..@@..@f@.
222 .@f@..@@..@f@.
223 .@f@..@@..@f@.
224 .@f@..@@..@f@.
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ..m........m..
238 ..4........4..
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Ade
249 Snood
250 Bricks:
251 xxx...##...xxx
252 xx#..#zz#..#xx
253 x##.#zzzz#.##x
254 ...#zzzzzz#...
255 ..#zEEzzEEz#..
256 ..#zzzzzzzz#..
257 ..#zzzEEzzz#..
258 ..#zzzEEzzz#..
259 ..#zzz##zzz#..
260 ...#zEEEEz#...
261 ...#zzEEzz#...
262 ....#zzzz#....
263 x@#.#zzzz#.#@x
264 xx#..#zz#..#xx
265 xxx...##...xxx
266 .@#........#@.
267 ..............
268 ..............
269 Bonus:
270 ..............
271 m.....mm.....m
272 ......mm......
273 ......mm......
274 ......mm......
275 ......mm......
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 .....mmmm.....
282 .....4..4.....
283 m.....ll.....m
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Ade
290 Drops
291 Bricks:
292 ......ff......
293 ......@@......
294 .....@@@@.....
295 .EEE@@@@@@EEE.
296 .E##########E.
297 .E#xxxxxxxx#E.
298 .E#xyyyyyyx#E.
299 .@#xyzzzzyx#@.
300 f@#xyzjjzyx#@f
301 f@#xyzjjzyx#@f
302 .@#xyzzzzyx#@.
303 .E#xyyyyyyx#E.
304 .E#xxxxxxxx#E.
305 .E##########E.
306 .EEE@@@@@@EEE.
307 .....@@@@.....
308 ......@@......
309 ......ff......
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 m............m
320 ..............
321 ..............
322 ...m.m.m.m....
323 ......ll......
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Ade
331 Birds
332 Bricks:
333 ..............
334 ..............
335 ........E.....
336 ........@E....
337 ###......@E...
338 xx@##.....@E..
339 ffxx@##...@@E.
340 zzffxx@#..@E@E
341 EEzzffxx#*@EE@
342 EEEEzzffxx@EEE
343 EEzzffxx#*@EE@
344 zzffxx@#..@E@E
345 ffxx@###..@@E.
346 xx@###....@E..
347 ####.....@E...
348 ........@E....
349 ........E.....
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 mm............
360 ..............
361 .........m....
362 ......m.......
363 ....m.........
364 ..m...........
365 m.............
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Ade
372 617
373 Bricks:
374 xxxxxxxxxxxxxx
375 vvvvvvvvvvvvvv
376 vEEvvvEEvEEEE.
377 vEEvvvEEvEEEE.
378 vEEvvvEEvEEEE.
379 vEEvvvEEvvvEE.
380 vEEvvvEEvvvEE.
381 vEEvvvEEvvvEE.
382 vEEEEvEEvvEEEE
383 vEEEEvEEvvEEEE
384 vE..EvEEvvvEEv
385 vE..EvEEvvvEEv
386 vEEEEvEEvvvEEv
387 vEEEEvEEvvvEEv
388 vvvvvvvvvvvvvv
389 xxxxxxxxxxxxxx
390 ..............
391 ..............
392 Bonus:
393 mmmmmmmmmmmmmm
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..........4...
400 ...l4.....l...
401 ..............
402 ..............
403 ..............
404 ..............
405 ..............
406 ..............
407 **************
408 ..............
409 ..............
410 ..............
411 Level:
412 Ade
413 Daisy
414 Bricks:
415 ..............
416 ..............
417 ......jj......
418 .....jhhj.....
419 ....jhhhhj....
420 ...jhhzzhhj...
421 ..jhhyyyyhhj..
422 ..jhxxxxxxhj..
423 ..jhEEEEEEhj..
424 ..jhEEEEEEhj..
425 ..............
426 xxxx......xxxx
427 f##f@@@@@@f##f
428 f##f@@@@@@f##f
429 xxxx......xxxx
430 ..............
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ..............
436 ......mm......
437 ..............
438 ..............
439 ..............
440 ..............
441 ..............
442 ..............
443 ..............
444 ..............
445 ...4......4...
446 .mm........mm.
447 .mm........mm.
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Ade
454 Never
455 Bricks:
456 ..............
457 @.f.@.ff.@.f.@
458 @.f.@.ff.@.f.@
459 ..............
460 ..##########..
461 ..#xxxxxxxx#..
462 ..#xyyyyyyx#..
463 ..#xyzzzzyx#..
464 ..#xyzjjzyx#..
465 ..#xyzjjzyx#..
466 ..#xyzzzzyx#..
467 ..#xyyyyyyx#..
468 ..#xxxxxxxx#..
469 ..##########..
470 ..............
471 @.f.@.ff.@.f.@
472 @.f.@.ff.@.f.@
473 ..............
474 Bonus:
475 ..............
476 ......mm......
477 ......mm......
478 ..............
479 ..............
480 ..............
481 ..............
482 ..............
483 ......mm......
484 ......mm......
485 ..............
486 ..............
487 ...4m....m4...
488 ..............
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Ade
495 Always
496 Bricks:
497 @...EEEEE.#xx#
498 .@...@@@@.x@@x
499 ..@...@@@.x..x
500 a..@...@@.#..#
501 ba..@...@.#..#
502 cba..@....#..#
503 jcba..@...f@@f
504 .jcba..@..f@@f
505 ..jcba..@.#..#
506 ..jcba..@.#..#
507 .jcba..@..f@@f
508 jcba..@...f@@f
509 cba..@....#..#
510 ba..@...@.#..#
511 a..@...@@.#..#
512 ..@...@@@.x..x
513 .@...@@@@.x@@x
514 @...EEEEE.#xx#
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..........m..m
523 ..........m..m
524 ..............
525 ..............
526 ..........m..m
527 ..........m..m
528 .4............
529 4l............
530 l.............
531 ..............
532 ..............
533 ..............
534 Level:
535 Ade
536 Trash
537 Bricks:
538 ......EE......
539 .....E..E.....
540 ....E.vv.E....
541 ...E.vvvv.E...
542 ..E.vv@@vv.E..
543 #E.vv@vv@vv.E#
544 .Evv@vvvv@vvE.
545 .vv@vvvvvv@vv.
546 .vv@vvxxvv@vv.
547 .vv@vvxxvv@vv.
548 .vv@vvvvvv@vv.
549 .Evv@vvvv@vvE.
550 .E.vv@vv@vv.E.
551 ..E.vv@@vv.E..
552 ...E.vvvv.E...
553 ....E.vv.E....
554 .....E..E.....
555 ......EE......
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ......mm......
561 ..............
562 ......mm......
563 ..*...mm...*..
564 ..*...mm...*..
565 .**...mm...**.
566 ..*...mm...*..
567 ..*...mm...*..
568 ..*...mm...*..
569 ......mm......
570 ..............
571 ......mm......
572 ......44......
573 ..............
574 ..............
575 Level:
576 Ade
577 Dummies
578 Bricks:
579 EEE@@@@@@@@EEE
580 E............E
581 E.....xj.....E
582 E....xyzj....E
583 E...xyzyzj...E
584 E..xyzjxyzj..E
585 @.xyzj..xyzj.@
586 @xyzj....xyzj@
587 @xyzj....xyzj@
588 @.xyzj..xyzj.@
589 E..xyzjxyzj..@
590 E...xyzyzj...E
591 E@@..xyzj..@@E
592 E..@..xj..@..E
593 E...@....@...E
594 EEEEE@..@EEEEE
595 .....@..@.....
596 EEEEE@..@EEEEE
597 Bonus:
598 ..............
599 ..............
600 ..............
601 ..............
602 ......mm......
603 ......mm......
604 .....m..m.....
605 ....m....m....
606 ....m....m....
607 ..............
608 ..............
609 ..............
610 .....l..l.....
611 ......44......
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Ade
618 Pigeon
619 Bricks:
620 ..............
621 ..............
622 ..xxx....xxx..
623 x#@@@EEEE@@@#x
624 xc!!cccccc!!cx
625 xc!!cccccc!!cx
626 xccc!!cc!!cccx
627 @ccc!!cc!!ccc@
628 @ccccc!!ccccc@
629 @ccccc!!ccccc@
630 @ccc!!cc!!ccc@
631 xccc!!cc!!cccx
632 xc!!cccccc!!cx
633 xc!!cccccc!!cx
634 x#@@@EEEE@@@#x
635 ..xxx....xxx..
636 ..............
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 .*....mm....*.
644 .*....mm....*.
645 .*....mm....*.
646 .*....mm....*.
647 .*....mm....*.
648 .*....mm....*.
649 .*....mm....*.
650 .*....mm....*.
651 .*....mm....*.
652 .*...4mm4...*.
653 ..............
654 ..............
655 ..............
656 ..............
657 Level:
658 Ade
659 Crack
660 Bricks:
661 @@zzzzzzzzzzzz
662 @zzzzzzzz*zzzz
663 @z@@@zzz*z*zzz
664 @z@z@zzzz*zz*z
665 @@@@@@@@zzz*z*
666 zz@@z@z@zzzz*z
667 zz@z@@@@@@zzzz
668 z*zzz@z@@zzzzz
669 *z*zz@z@@z@z@z
670 z*zzzzzz@z@z@*
671 zzzzzzzz@@@@zz
672 zz*zzz*zzz@z@*
673 z*z*z*z*zz@z@z
674 zz*zzz*zzzzzzz
675 zzzzzzzzzzzzzz
676 ..............
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ..............
682 .........m....
683 ...m..........
684 ............m.
685 ....m.m.......
686 ..............
687 ..............
688 .*............
689 ..............
690 .............*
691 .............*
692 ..*...*.......
693 .....4..4.....
694 .....l..l.....
695 ..............
696 ..............
697 ..............
698 Level:
699 Ade
700 Ugly
701 Bricks:
702 ......xx......
703 .....x!!x.....
704 ....xfxxfx....
705 ...x!x!!x!x...
706 ..x@xfxxfx@x..
707 .x!*!x!!x!*!x.
708 x#x@xfxxfx@x#x
709 !x!*!x!!x!*!x!
710 x#x@xExxEx@x#x
711 x#x@xExxEx@x#x
712 !x!*!x!!x!*!x!
713 x#x@xfxxfx@x#x
714 .x!*!x!!x!*!x.
715 ..x@xfxxfx@x..
716 ...x!x!!x!x...
717 ....xfxxfx....
718 .....x!!x.....
719 ......xx......
720 Bonus:
721 ......**......
722 ......**......
723 ....*....*....
724 ..............
725 ..*........*..
726 ..............
727 *............*
728 ..............
729 ......**......
730 ......**......
731 ..............
732 *............*
733 ..............
734 ..*........*..
735 ..............
736 ....*.44.*....
737 ..............
738 ..............
739 Level:
740 Ade
741 Nice
742 Bricks:
743 ..............
744 ..............
745 .@@@......@@@.
746 .@v@.xxxx.@v@.
747 .@@@.xffx.@@@.
748 .....xxxx.....
749 ..............
750 .###.EEEE.###.
751 .#f#.E..E.#f#.
752 .#f#.E..E.#f#.
753 .###.EEEE.###.
754 ..............
755 .....xxxx.....
756 .@@@.xffx.@@@.
757 .@v@.xxxx.@v@.
758 .@@@......@@@.
759 ..............
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ......mm......
766 ..............
767 ......mm......
768 ..............
769 ..............
770 ..m........m..
771 ..m........m..
772 ..............
773 ..............
774 ......l4......
775 ..............
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Ade
782 We Will Rock You
783 Bricks:
784 ..#xyzjjzyx#..
785 ..#xyzzzzyx#..
786 ..#xyyyyyyx#..
787 ..#xxxxxxxx#..
788 ..##########..
789 ..............
790 ..............
791 ..............
792 ..............
793 ..@..@@@@..@..
794 ..@..@ff@..@..
795 ..@..@ff@..@..
796 ..@........@..
797 ..@...ff...@..
798 ..@...ff...@..
799 ..@@@@@@@@@@..
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ...mmmmmmmm...
807 ..............
808 ..............
809 ..............
810 ..............
811 ..............
812 ..............
813 ......ll......
814 ......mm......
815 ..............
816 ......mm......
817 ..............
818 ......44......
819 ..............
820 ..............
821 Level:
822 Ade
823 After Six Beers
824 Bricks:
825 ......@@......
826 .....@@@@.....
827 ....@eeee@....
828 ...@eeeeee@...
829 @@@e##ee##e@@@
830 @eee##ee##eee@
831 EeeeeeeeeeeeeE
832 EeeeeeddeeeeeE
833 EeeeeeddeeeeeE
834 EeeeeeddeeeeeE
835 .eeeeeeeeeeee.
836 ..eeEEEEEEee..
837 ..eeeEEEEeee..
838 ...eeeEEeee...
839 ...eeeeeeee...
840 .....eeee.....
841 ......ee......
842 ..............
843 Bonus:
844 ..............
845 ..............
846 ..............
847 .....m..m.....
848 ..............
849 ..............
850 ..............
851 ..............
852 ..............
853 .....*..*.....
854 ....**44**....
855 ..............
856 ....*....*....
857 ..............
858 ..............
859 ..............
860 ..............
861 ..............
862 Level:
863 Ade
864 Cognitive Distortion
865 Bricks:
866 ####.#........
867 #..#.#........
868 #..#.#......@a
869 #..#.#......aE
870 #ff#.#....@aEa
871 #..#.#....aEa.
872 #..#.#....Ea@.
873 #..#.#....@...
874 ####..........
875 ..........####
876 .....@..#.#..#
877 ...@aE..#.#..#
878 ...aEa..#.#..#
879 .@aEa@..#.#ff#
880 .aEa....#.#..#
881 aEa@....#.#..#
882 Ea......#.#..#
883 a@......#.####
884 Bonus:
885 ..............
886 ..............
887 .............m
888 ..............
889 .mm...........
890 ..............
891 ..............
892 ..............
893 ..............
894 ..............
895 ..............
896 ..............
897 ...4..........
898 ..4........mm.
899 ..............
900 m.............
901 ..............
902 ..............
903 Level:
904 Ade
905 Ace
906 Bricks:
907 ###..xxxx..###
908 #x#..@ff@..#x#
909 ###..xxxx..###
910 f*ffffffffff*f
911 @@@..xxxx..@@@
912 @x@..@xx@..@x@
913 @@@..xxxx..@@@
914 f*ffffffffff*f
915 xxx..xxxx..xxx
916 x#x..@xx@..x#x
917 xxx..xxxx..xxx
918 f*ffffffffff*f
919 EEE..xxxx..EEE
920 E#E..@ff@..E#E
921 EEE..xxxx..EEE
922 ..............
923 ..............
924 ..............
925 Bonus:
926 ..............
927 .m....mm....m.
928 ..............
929 ..............
930 ..............
931 .m....**....m.
932 ..............
933 ..............
934 .*..........*.
935 ......**......
936 .*..........*.
937 ..............
938 ..............
939 ......44......
940 ..............
941 ..............
942 ..............
943 ..............
944 Level:
945 Ade
946 Changes
947 Bricks:
948 @.xxxxxxxxxx.@
949 @.x.@....@.x.@
950 @.x.@.##.@.x.@
951 @.x.@.ff.@.x.@
952 @.x.@*ff*@.x.@
953 @.x.@*ff*@.x.@
954 @.x...ff...x.@
955 @.x.@.##.@.x.@
956 @.x.@....@.x.@
957 @.x........x.@
958 @.x.@....@.x.@
959 @.x.@....@.x.@
960 @*x*@....@*x*@
961 @...@....@...@
962 @@@@@....@@@@@
963 ..............
964 ..............
965 ..............
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ..............
971 ......44......
972 ......ll......
973 ..............
974 ..............
975 ..............
976 ..............
977 ..m........m..
978 ..m........m..
979 .mm........mm.
980 ..............
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Ade
987 Stargate
988 Bricks:
989 ......@@......
990 .....@!!@.....
991 ....@.!!.@....
992 ......@@......
993 .....@..@.....
994 ...f@x..x@f...
995 ...@.x@@x.@...
996 ...f.@xx@.f...
997 ..ff@.xx.@ff..
998 ..f@x.@@.x@f..
999 ..@.x@..@x.@..
1000 ..f.@....@.f..
1001 .ff@......@ff.
1002 .f@........@f.
1003 .@..........@.
1004 ..............
1005 ..............
1006 ..............
1007 Bonus:
1008 ..............
1009 ......mm......
1010 ......mm......
1011 ..............
1012 ..............
1013 ..............
1014 ..............
1015 ...b..mm..b...
1016 ..wb..mm..bw..
1017 ..w.b....b.w..
1018 ....4....4....
1019 ..............
1020 .wb........bw.
1021 .w..........w.
1022 ..............
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Ade
1028 Brain Damage
1029 Bricks:
1030 ..............
1031 ..............
1032 ..............
1033 @@@@@@@@@@@@@@
1034 @.jjjjjjjjjj.@
1035 @.!zzzzzzzz!.@
1036 ..j!yyyyyy!j..
1037 ..jz!xxxx!zj..
1038 ..jzy!!!!yzj..
1039 ..jzyx!!xyzj..
1040 ..jzy!!!!yzj..
1041 ..jz!xxxx!zj..
1042 ..j!yyyyyy!j..
1043 .@!zzzzzzzz!@.
1044 .@jjjjjjjjjj@.
1045 .@@@@@@@@@@@@.
1046 ..............
1047 ..............
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 .bb........bb.
1054 .bb........bb.
1055 ..w........w..
1056 ..w........w..
1057 ..w..****..w..
1058 ..b...bb...b..
1059 ..w..****..w..
1060 ..w........w..
1061 .bw........wb.
1062 ..b........b..
1063 ..b..4ll4..b..
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Ade
1069 Innocent Victim
1070 Bricks:
1071 @@@abcjjcba@@@
1072 @@@abc..cba@@@
1073 @@@ab....ba@@@
1074 @@@a..jj..a@@@
1075 @@...zjjz...@@
1076 @...yzjjzy...@
1077 #..xyzjjzyx..#
1078 #@.xyzjjzyx.@#
1079 #@.xyzjjzyx.@#
1080 ##.xyzjjzyx.##
1081 ##@.yzjjzy.@##
1082 ##@..zjjz..@##
1083 ###a..jj..a###
1084 ###ab....ba###
1085 ###abc..cba###
1086 ###abcjjcba###
1087 ..............
1088 ..............
1089 Bonus:
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 ......**......
1096 ......**......
1097 ......**......
1098 ..............
1099 ..............
1100 ..............
1101 ..............
1102 ......44......
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Ade
1110 FreeCell
1111 Bricks:
1112 #a@yE@cx@#Eba@
1113 #a@yE@cx@#Eba@
1114 #a@yE@cx@#Eba@
1115 #a@.E.c.@.Eba@
1116 #a@.E.c...E.a.
1117 .a@...........
1118 .a............
1119 .......x.....@
1120 #...E..x.#..a@
1121 #.@.E..x@#E.a@
1122 #a@.E.cx@#E.a@
1123 #a@.E.cx@#Eba@
1124 #a@yE@cx@#Eba@
1125 #a@yE@cx@#Eba@
1126 #a@yE@cx@#Eba@
1127 ..............
1128 ..............
1129 ..............
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ...........*..
1135 ......*.....*.
1136 .*............
1137 .*............
1138 ..............
1139 ..............
1140 ..............
1141 .*....**....*.
1142 .4....ll...4..
1143 ..............
1144 .b.b..bb...bb.
1145 .w.w..ww...ww.
1146 ..............
1147 ..............
1148 ..............
1149 Level:
1150 Ade
1151 Cube
1152 Bricks:
1153 ..............
1154 ..............
1155 ..............
1156 ...xxbb@@cc...
1157 ...xxbb@@cc...
1158 ...cc##aa**...
1159 ...cc##aa**...
1160 ...@@bbyyzz...
1161 ...@@bbyyzz...
1162 ...aa**jjbb...
1163 ...aa**jjbb...
1164 ...xxbb@@EE...
1165 ...xxbb@@EE...
1166 ...ccyybbzz...
1167 ...ccyybbzz...
1168 ..............
1169 ..............
1170 ..............
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..............
1176 ..............
1177 .........**...
1178 .........**...
1179 ..............
1180 ..............
1181 .....**.......
1182 .....**.......
1183 ..............
1184 ..............
1185 ......44......
1186 ..............
1187 ..............
1188 ..............
1189 ..............
1190 Level:
1191 Ade
1192 Colorfull
1193 Bricks:
1194 .....aaaa.....
1195 ....iiiiii....
1196 ...dggggggd...
1197 ..dEzzyyzzEd..
1198 .dEzaa!!aazEd.
1199 dEz!ffffff!zEd
1200 dzafhhhhhhfazd
1201 x!fh******hf!x
1202 afh*eeeeee*hfa
1203 fh*ExExxExE*hf
1204 h*ex@.@@.@xe*h
1205 *Ex........xE*
1206 ex@........@xe
1207 x............x
1208 @............@
1209 ..............
1210 ..............
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 .....mmmm.....
1217 ....mm..mm....
1218 ..............
1219 ...m......m...
1220 ..............
1221 ..............
1222 ......44......
1223 ..............
1224 ..............
1225 ..............
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 ..............
1231 Level:
1232 Ade
1233 Crazy
1234 Bricks:
1235 @@@@@....@@@@@
1236 @aaaa.EE.aaaa@
1237 @abbb.EE.bbba@
1238 @abcc....ccba@
1239 @abcxxxxxxcba@
1240 @abcxyyyyxcba@
1241 @abcxyzzyxcba@
1242 @abcxyzzyxcba@
1243 @abcxyzzyxcba@
1244 @abcxyzzyxcba@
1245 @abcxyyyyxcba@
1246 @abcxxxxxxcba@
1247 @abcc....ccba@
1248 @abbb.EE.bbba@
1249 @aaaa.EE.aaaa@
1250 @@@@@....@@@@@
1251 ..............
1252 ..............
1253 Bonus:
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 .***......***.
1259 ..............
1260 ..............
1261 .bbb..**..bbb.
1262 ......**......
1263 ......ll......
1264 ..............
1265 .***......***.
1266 ....4....4....
1267 ..............
1268 ..............
1269 ..............
1270 ..............
1271 ..............
1272 Level:
1273 Ade
1274 Poison
1275 Bricks:
1276 ..............
1277 ..............
1278 ..............
1279 ..@@@@@@@@@@..
1280 ..aaaaaaaaaa..
1281 ..bbbbbbbbbb..
1282 ..cccccccccc..
1283 ..@@@@@@@@@@..
1284 ..cccccccccc..
1285 ..bbbbbbbbbb..
1286 ..aaaaaaaaaa..
1287 ..@@@@@@@@@@..
1288 ..............
1289 ..............
1290 ..............
1291 .EEEEEEEEEEEEE
1292 ..............
1293 ..............
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..bwbbbbbbwb..
1300 ..bwmwbbwbwb..
1301 ..bwbbbbbbwb..
1302 ..............
1303 ..bwbbbbbbwb..
1304 ..bwmwbbwbwb..
1305 ..bwbbbbbbwb..
1306 ..............
1307 ..............
1308 ..............
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Ade
1315 LazyClub
1316 Bricks:
1317 ..............
1318 ..............
1319 xxxxxxxxxxxxxx
1320 aaaaaaaaaaaaaa
1321 xxxxxxxxxxxxxx
1322 @@@@@@@@@@@@@@
1323 xxxxxxxxxxxxxx
1324 aaaaaaaaaaaaaa
1325 xxxxxxxxxxxxxx
1326 @@@@@@@@@@@@@@
1327 xxxxxxxxxxxxxx
1328 aaaaaaaaaaaaaa
1329 xxxxxxxxxxxxxx
1330 ..............
1331 ..............
1332 ..............
1333 ..............
1334 ..............
1335 Bonus:
1336 ..............
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 mmmmmmmmmmmmmm
1343 !!!!!!!!!!!!!!
1344 **************
1345 !!!!!!!!!!!!!!
1346 mmmmmmmmmmmmmm
1347 !!!!!!!!!!!!!!
1348 bbbbbbbbbbbbbb
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Ade
1356 On The Frontier
1357 Bricks:
1358 ..............
1359 x############x
1360 b@bbbbbbbbbb@b
1361 bb@bbbbbbbb@bb
1362 bbb@bbbbbb@bbb
1363 bbbb@bbbb@bbbb
1364 baabbbaabbbaab
1365 baabbbaabbbaab
1366 bbbbbbbbbbbbbb
1367 bbbb@bbbb@bbbb
1368 bbb@bbbbbb@bbb
1369 bb@bbbbbbbb@bb
1370 b@bbbbbbbbbb@b
1371 x############x
1372 ..............
1373 ..............
1374 ..............
1375 ..............
1376 Bonus:
1377 ..............
1378 ..............
1379 ..............
1380 ..............
1381 ..b...........
1382 .**...........
1383 .**...mm...**.
1384 .**...mm...**.
1385 .**...........
1386 ..b...........
1387 ..............
1388 ..............
1389 .....4ll4.....
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 ..............
1395 Level:
1396 Ade
1397 TNT
1398 Bricks:
1399 .@@@@@..@@@@@.
1400 .@xxx@..@xxx@.
1401 .@x*x@..@x*x@.
1402 .@x*x@..@x*x@.
1403 .@xxx@..@xxx@.
1404 .aaaaxxxxaaaa.
1405 .accax**xacca.
1406 .accax**xacca.
1407 .aaaaxxxxaaaa.
1408 .@xxx@..@xxx@.
1409 .@x*x@..@x*x@.
1410 .@x*x@..@x*x@.
1411 .@xxx@..@xxx@.
1412 .@@@@@..@@@@@.
1413 ..............
1414 ..............
1415 ..............
1416 ..............
1417 Bonus:
1418 ..............
1419 ..............
1420 ..***....***..
1421 ..***....***..
1422 ..............
1423 .....wwww.....
1424 .....bbbb.....
1425 .....bbbb.....
1426 .....wwww.....
1427 ..............
1428 ...*......*...
1429 ...*......*...
1430 ...4......4...
1431 ..............
1432 ..............
1433 ..............
1434 ..............
1435 ..............
1436 Level:
1437 Ade
1438 Going To Bagdah
1439 Bricks:
1440 ...EEEEEEEE...
1441 ....#....#....
1442 aaaa#.aa.#aaaa
1443 .aaa@.aa.@aaa.
1444 ..aaaaaaaaaa..
1445 E..aaaaaaaa..E
1446 E#@aaaaaaaa@#E
1447 E..aaaaaaaa..E
1448 E.ccaaccaacc.E
1449 E.ccaaccaacc.E
1450 E..aaaaaaaa..E
1451 E#@aaaaaaaa@#E
1452 E..aaaaaaaa..E
1453 ..aaaaaaaaaa..
1454 .aaa@.aa.@aaa.
1455 aaaa#.aa.#aaaa
1456 ....#....#....
1457 ...EEEEEEEE...
1458 Bonus:
1459 ..............
1460 ..............
1461 ..............
1462 ..............
1463 ..............
1464 ..............
1465 ..............
1466 ..............
1467 ..mm..mm..mm..
1468 ..mm..mm..mm..
1469 ..............
1470 ..............
1471 ..............
1472 ..............
1473 ..............
1474 ......44......
1475 ..............
1476 ..............
1477 Level:
1478 Ade
1479 Dead Fish
1480 Bricks:
1481 ......xx......
1482 .....xccx.....
1483 ....xcxxcx....
1484 ...xcx..xcx...
1485 ..xcx....xcx..
1486 .xcx......xcx.
1487 xcx..@..@..xcx
1488 cx..@cccc@..xc
1489 x..@cccccc@..x
1490 cx..@cccc@..xc
1491 xcx..@..@..xcx
1492 .xcx......xcx.
1493 ..xcx....xcx..
1494 ...xcx..xcx...
1495 ....xcxxcx....
1496 .....xccx.....
1497 ......xx......
1498 ..............
1499 Bonus:
1500 ..............
1501 ..............
1502 ..............
1503 ..............
1504 ..............
1505 ..............
1506 ..............
1507 .....bbbb.....
1508 ....bbmmbb....
1509 ..............
1510 ..............
1511 ..............
1512 ..............
1513 ..............
1514 ......ll......
1515 ......44......
1516 ..............
1517 ..............
1518 Level:
1519 Ade
1520 38
1521 Bricks:
1522 ffffffffffffff
1523 f@@@@@ff@@@@@f
1524 f@@@@@ff@@@@@f
1525 f@@@@@ff@@f@@f
1526 ffff@@ff@@f@@f
1527 ffff@@ff@@f@@f
1528 ff@@@@ff@@@@@f
1529 ff@@@@ff@@@@@f
1530 ff@@@@ff@@f@@f
1531 ffff@@ff@@f@@f
1532 ffff@@ff@@f@@f
1533 f@@@@@ff@@@@@f
1534 f@@@@@ff@@@@@f
1535 f@@@@@ff@@@@@f
1536 ffffffffffffff
1537 ..............
1538 ..............
1539 ..............
1540 Bonus:
1541 ..............
1542 ..............
1543 ......mm......
1544 ......mm......
1545 ..............
1546 ..............
1547 ..............
1548 ..............
1549 ......ll......
1550 ..............
1551 ..............
1552 ..............
1553 ..............
1554 ..............
1555 ..............
1556 ..............
1557 ..............
1558 ..............
1559 Level:
1560 Ade
1561 www.death.com
1562 Bricks:
1563 .@@@@@..@@@@@.
1564 .@.f.@..@.f.@.
1565 .@.f.@..@.f.@.
1566 .@.f.@..@.f.@.
1567 .@.f.@..@.f.@.
1568 ...f......f...
1569 ...f......f...
1570 .ffffffffffff.
1571 .ffffffffffff.
1572 .ffffffffffff.
1573 ...f......f...
1574 ...f......f...
1575 .@.f.@..@.f.@.
1576 .@.f.@..@.f.@.
1577 .@.f.@..@.f.@.
1578 .@.f.@..@.f.@.
1579 .@@@@@..@@@@@.
1580 ..............
1581 Bonus:
1582 ..............
1583 ..............
1584 ..............
1585 ...b......b...
1586 ..............
1587 ..............
1588 ..............
1589 ...w......w...
1590 .bb4bbbbbb4bb.
1591 ..............
1592 ..............
1593 ..............
1594 ..............
1595 ...b......b...
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Ade
1602 www.death.com
1603 Bricks:
1604 ..............
1605 ..............
1606 ..............
1607 ..............
1608 ..............
1609 ..............
1610 ..............
1611 ..............
1612 ..............
1613 ..............
1614 ..............
1615 ..............
1616 ..............
1617 ..............
1618 ..............
1619 ..............
1620 ..............
1621 ..............
1622 Bonus:
1623 ..............
1624 ..............
1625 ..............
1626 ..............
1627 ..............
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.00
1 Level:
2 Hans
3 easy
4 Bricks:
5 *!*!*!*!*!*!*!
6 cbbbbbbbbbbbbc
7 !*!*!*!*!*!*!*
8 cbaaaaaaaaaabc
9 *!*!*!*!*!*!*!
10 cbaaaaaaaaaabc
11 !*!*!*!*!*!*!*
12 cbaaaaaaaaaabc
13 *!*!*!*!*!*!*!
14 cbaaaaaaaaaabc
15 !*!*!*!*!*!*!*
16 cbaaaaaaaaaabc
17 *!*!*!*!*!*!*!
18 cbbbbbbbbbbbbc
19 !*!*!*!*!*!*!*
20 c!c!c!c!c!c!c!
21 !c!c!c!c!c!c!c
22 c!c!c!c!c!c!c!
23 Bonus:
24 b.b.b.b.b.b.b.
25 w************w
26 .............b
27 w*..........*w
28 b.............
29 w*..........*w
30 .............b
31 w*..........*w
32 b.............
33 w*..........*w
34 .............b
35 w*..........*w
36 b.............
37 w************w
38 wbwbwbwbwbwbwb
39 bwbwbwbwbwbwbw
40 wbwbwbwbwbwbwb
41 bwbwbwbwbwbwbw
42 Level:
43 Hans
44 looks hard
45 Bricks:
46 !z!z!z!z!z!z!z
47 !z!z!z!z!z!z!z
48 !z!z!z!z!z!z!z
49 !z!z!z!z!z!z!z
50 !z!z!z!z!z!z!z
51 !z!z!z!z!z!z!z
52 !z!z!z!z!z!z!z
53 !z!z!z!z!z!z!z
54 !z!z!z!z!z!z!z
55 !z!z!z!z!z!z!z
56 !z!z!z!z!z!z!z
57 !z!z!z!z!z!z!z
58 !z!z!z!z!z!z!z
59 !z!z!z!z!z!z!z
60 !z!z!z!z!z!z!z
61 !z!z!z!z!z!z!z
62 !z!z!z!z!z!z!z
63 !z!z!z!z!z!z!z
64 Bonus:
65 w5b5w5b5w5b5w5
66 b5w5b5w5b5w5b5
67 w5b5w5b5w5b5w5
68 b5w5b5w5b5w5b5
69 w5b5w5b5w5b5w5
70 b5w5b5w5b5w5b5
71 w5b5w5b5w5b5w5
72 b5w5b5w5b5w5b5
73 w5b5w5b5w5b5w5
74 b5w5b5w5b5w5b5
75 w5b*w5b*w5b*w5
76 b5w*b5w*b5w*b5
77 w5b*w5b*w5b*w5
78 b5w*b5w*b5w*b5
79 w5b*w5b*w5b*w5
80 b5w*b5w*b5w*b5
81 w*b*w*b*w*b*w*
82 b*w*b*w*b*w*b*
83 Level:
84 Hans
85 not hard
86 Bricks:
87 czczczczczczcz
88 z*zc*cz*zc*cz*
89 czczczczczczcz
90 zcz!!!!!!!!!zc
91 c*c!*!!*!!*!c*
92 zcz!!!!!!!!!zc
93 czc!!!!!!!!!cz
94 z*z!*!!*!!*!z*
95 czc!!!!!!!!!cz
96 zcz!!!!!!!!!zc
97 c*c!*!!*!!*!c*
98 zcz!!!!!!!!!zc
99 czc!!!!!!!!!cz
100 z*z!*!!*!!*!z*
101 czc!!!!!!!!!cz
102 zczczczczczczc
103 c*cz*zc*cz*zc*
104 zczczczczczczc
105 Bonus:
106 55555555555555
107 55555555555555
108 55555555555555
109 55555555555555
110 55555555555555
111 55555555555555
112 55555555555555
113 55555555555555
114 55555555555555
115 bwb555555555bw
116 w*w555555555w*
117 bwb555555555bw
118 wbw555555555wb
119 b*b555555555b*
120 wbw555555555wb
121 bwbwbwbwbwbwbw
122 w*wb*bw*wb*bw*
123 bwbwbwbwbwbwbw
124 Level:
125 Hans
126 find them
127 Bricks:
128 vvvvvvvvvvvvvv
129 v!*vvvvvvvv*!v
130 v*!*vvvvvv*!*v
131 vv*!*v**v*!*vv
132 vvv*!!!!!!*vvv
133 vvvv!!!!!!vvvv
134 vv*!!!!!!!!*vv
135 v*!!!!!!!!!!*v
136 *!!!!!!!!!!!!*
137 v*!!!!!!!!!!*v
138 vv*!!!!!!!!*vv
139 vvvv!!!!!!vvvv
140 vvv*!!!!!!*vvv
141 vv*!*v**v*!*vv
142 v*!*vvvvvv*!*v
143 v!*vvvvvvvv*!v
144 vvvvvvvvvvvvvv
145 ddeehhffggiikk
146 Bonus:
147 ..............
148 .5..........5.
149 ..5........5..
150 ...5......5...
151 ....555555....
152 ....555555....
153 ...55555555...
154 ..5555555555..
155 .555555555555.
156 ..5555555555..
157 ...55555555...
158 ....555555....
159 .*..555555.*.*
160 *..5......5.*.
161 ..5..*.*.*.5.*
162 *5..*.*.*.*.5.
163 .*.*.*.*.*.*.*
164 wbwbwbwbwbwbwb
165 Level:
166 Hans
167 score lots
168 Bricks:
169 vvvvvvvvvvvvvv
170 v!!!!!vv!!!!!v
171 v!zzz!vv!zzz!v
172 v!zfz!vv!zfz!v
173 v!zfz!vv!zfz!v
174 v!zfz!vv!zfz!v
175 v!zfz!vv!zfz!v
176 v!zfz!vv!zfz!v
177 v!zfz!vv!zfz!v
178 v!zfz!vv!zfz!v
179 v!zfz!vv!zfz!v
180 v!zfz!vv!zfz!v
181 v!zfz!vv!zfz!v
182 v!zfz!vv!zfz!v
183 v!zzz!vv!zzz!v
184 v!!!!!vv!!!!!v
185 *v*v*v*v*v*v*v
186 v*v*v*v*v*v*v*
187 Bonus:
188 55555555555555
189 5.*.*.55.*.*.5
190 5.....55.....5
191 5*...*55*...*5
192 5.....55.....5
193 5.....55.....5
194 5*...*55*...*5
195 5.....55.....5
196 5.....55.....5
197 5*...*55*...*5
198 5.....55.....5
199 5.....55.....5
200 5*...*55*...*5
201 5.....55.....5
202 5.....55.....5
203 5*.*.*55*.*.*5
204 bwbwbwbwbwbwbw
205 wbwbwbwbwbwbwb
206 Level:
207 Hans
208 tricky
209 Bricks:
210 !!!!!!!!!!!!!!
211 !!!!!!!!!!!!!!
212 !*vvvvvvvvvv*!
213 !vccccccccccv!
214 !vc*bbbbbb*cv!
215 !vcbaaaaaabcv!
216 !vcba*!!*abcv!
217 !vcba!!!!abcv!
218 !vcba*!!*abcv!
219 !vcbaaaaaabcv!
220 !vc*bbbbbb*cv!
221 !vccccccccccv!
222 !*vvvvvvvvvv*!
223 !!!!!!!!!!!!!!
224 !!!!!!**!!!!!!
225 ######vv######
226 vvvvvvvvvvvvvv
227 vvvvvvvvvvvvvv
228 Bonus:
229 ..............
230 ..............
231 .5..........5.
232 ..............
233 ...5......5...
234 ..............
235 .....5..5.....
236 ..............
237 .....5..5.....
238 ..............
239 ...5......5...
240 ..............
241 .5..........5.
242 ..............
243 ......55......
244 ......bb......
245 *.*.*.**.*.*.*
246 w.w.w....w.w.w
247 Level:
248 Hans
249 find it
250 Bricks:
251 ..............
252 ..............
253 ..............
254 ..............
255 ..............
256 ..............
257 ..............
258 ..............
259 .......v......
260 ..............
261 ..............
262 ..............
263 ..............
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Hans
290 aim straight
291 Bricks:
292 ..............
293 ..............
294 ..............
295 ..............
296 ..............
297 ..............
298 ..............
299 ..............
300 ..............
301 ..............
302 ..............
303 ..............
304 .............z
305 ..............
306 ..............
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 ..............
320 ..............
321 ..............
322 ..............
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Hans
331 shoot!
332 Bricks:
333 !!!!!!!!!!!!!!
334 !!!!!!!!!!!!!!
335 !!!!!!!!!!!!!!
336 !!!!!!!!!!!!!!
337 !!!!!!!!!!!!!!
338 !!!!!!!!!!!!!!
339 !!!!!!!!!!!!!!
340 !!!!!!!!!!!!!!
341 !!!!!!!!!!!!!!
342 !!!!!!!!!!!!!!
343 !!!!!!!!!!!!!!
344 !!!!!!!!!!!!!!
345 !!!!!!!!!!!!!!
346 !!!!!!!!!!!!!!
347 !!!!!!!!!!!!!!
348 !!!!!!!!!!!!!!
349 !!!!!!!!!!!!!!
350 !!!!!!!!!!!!!!
351 Bonus:
352 55555555555555
353 jpjpjpjpjpjpjp
354 pjpjpjpjpjpjpj
355 55555555555555
356 5j5j5j55j5j5j5
357 55555555555555
358 j5j5j5jj5j5j5j
359 5p5p5p55p5p5p5
360 p5p5p5pp5p5p5p
361 ..............
362 jwjwjwjwjwjwjw
363 ..............
364 pppppppppppppp
365 ..............
366 wjwjwjwjwjwjwj
367 ..............
368 pppppppppppppp
369 ..............
370 Level:
371 Hans
372 gray
373 Bricks:
374 kkkkkkkkkkkkkk
375 kaaaaaaaaaaaak
376 kajjjjjjjjjjak
377 kajbbbbbbbbjak
378 kajbaaaaaabjak
379 kajbakkkkabjak
380 kajbakjjkabjak
381 kajbakbbkabjak
382 kajbakjjkabjak
383 kajbakbbkabjak
384 kajbakjjkabjak
385 kajbakbbkabjak
386 kajbakkkkabjak
387 kajbaaaaaabjak
388 kajbbbbbbbbjak
389 kajjjjjjjjjjak
390 kaaaaaaaaaaaak
391 kkkkkkkkkkkkkk
392 Bonus:
393 ll>jj{{{{jj>ll
394 >ll.}jjjj}.ll>
395 bw>>>>>>>>>>wb
396 wb>55555555>bw
397 bw>5ll>>ll5>wb
398 wb>5>llll>5>bw
399 bw>5jj55jj5>wb
400 wb>5{}55}{5>bw
401 bw>5{.55.{5>wb
402 wb>5{}55}{5>bw
403 bw>5{.55.{5>wb
404 wb>5{}55}{5>bw
405 bw>5>llll>5>wb
406 wb>5ll>>ll5>bw
407 bw>55555555>wb
408 wb>>>>>>>>>>bw
409 bwbwbwbbwbwbwb
410 wbwbwbwwbwbwbw
411 Level:
412 Hans
413 blow up
414 Bricks:
415 .....*dd*.....
416 .....d**d.....
417 .....*dd*.....
418 ....*d**d*....
419 ....d*dd*d....
420 ....*d**d*....
421 ...*d*dd*d*...
422 ...d*d**d*d...
423 ...*d*dd*d*...
424 ..*d*d**d*d*..
425 ..d*d*dd*d*d..
426 ..*d*d**d*d*..
427 .*d*d*dd*d*d*.
428 .d*d*d**d*d*d.
429 .*d*d*dd*d*d*.
430 *d*d*d**d*d*d*
431 d*d*d*dd*d*d*d
432 *d*d*d**d*d*d*
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ..............
438 ..............
439 ..............
440 ..............
441 ..............
442 ..............
443 ..............
444 ..............
445 ..............
446 ..............
447 ..............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Hans
454 eye of ra
455 Bricks:
456 .....hhhh.....
457 ......hh......
458 ..............
459 ..............
460 ......ee......
461 ......ee......
462 .....eeee.....
463 .....eeee.....
464 ....eeeeee....
465 ....eeeeee....
466 ...eeeeeeee...
467 ...eeeeeeee...
468 ..eeeeeeeeee..
469 ..eeeeeeeeee..
470 .eeeeeeeeeeee.
471 .eeeeeeeeeeee.
472 eeeeeeeeeeeeee
473 e############e
474 Bonus:
475 .....mmmm.....
476 ......mm......
477 ..............
478 ..............
479 ......55......
480 ......55......
481 .....5jj5.....
482 .....5jj5.....
483 ....5jjjj5....
484 ....5j..j5....
485 ...5j....j5...
486 ...5j....j5...
487 ..5j......j5..
488 ..5j......j5..
489 .5j...ww...j5.
490 .5j..wwww..j5.
491 +jjjwwwwwwjjj+
492 +............+
493 Level:
494 Hans
495 id4
496 Bricks:
497 zzzzffffffzzzz
498 zzzzzffffzzzzz
499 vzzzzzffzzzzzv
500 vvzzzz!!zzzzvv
501 vvvvvv!!vvvvvv
502 vvvvvv!!vvvvvv
503 ......!!......
504 ......!!......
505 ......!!......
506 ......!!......
507 ......!!......
508 ......!!......
509 ......!!......
510 ......!!......
511 ......!!......
512 ......!!......
513 ......!!......
514 ......!!......
515 Bonus:
516 *jww555555wwj*
517 **jww5555wwj**
518 >**jww55wwj**>
519 >>****++****>>
520 >>>>>>pp>>>>>>
521 >>>>>>pp>>>>>>
522 ......jj......
523 ......pp......
524 ......pp......
525 ......++......
526 ......pp......
527 ......pp......
528 ......jj......
529 ......pp......
530 ......pp......
531 ......++......
532 ......pp......
533 ......pp......
534 Level:
535 Hans
536 rainbow
537 Bricks:
538 dddddddddddddd
539 eeeeeeeeeeeeee
540 dddddddddddddd
541 eeeeeeeeeeeeee
542 hhhhhhhhhhhhhh
543 ffffffffffffff
544 hhhhhhhhhhhhhh
545 ffffffffffffff
546 gggggggggggggg
547 iiiiiiiiiiiiii
548 gggggggggggggg
549 iiiiiiiiiiiiii
550 dehfgijjigfhed
551 dehfgijjigfhed
552 dehfgijjigfhed
553 jjjjjjjjjjjjjj
554 kkkkkkkkkkkkkk
555 ..............
556 Bonus:
557 j...jj..jj...j
558 +..+..++..+..+
559 gggggggggggggg
560 gggggggggggggg
561 j...jj..jj...j
562 +..+..++..+..+
563 gggggggggggggg
564 gggggggggggggg
565 j...jj..jj...j
566 +..+..++..+..+
567 gggggggggggggg
568 gggggggggggggg
569 ......bb......
570 ..............
571 ......bb......
572 .b.b.b..b.b.b.
573 wwwwwwwwwwwwww
574 ..............
575 Level:
576 Hans
577 tree
578 Bricks:
579 ......zz......
580 .....zzzz.....
581 ....zzzzzz....
582 ...zzzzzzzz...
583 ..zzzzzzzzzz..
584 ...zzz@@zzz...
585 ....zz@@zz....
586 .....z@@z.....
587 ......@@......
588 ......@@......
589 ......@@......
590 ......@@......
591 ......@@......
592 ccccc@@@@ccccc
593 cccccccccccccc
594 cccccccccccccc
595 ..............
596 ..............
597 Bonus:
598 ......55......
599 .....5..5.....
600 ....5....5....
601 ...5......5...
602 ..5........5..
603 ...5......5...
604 ....5....5....
605 .....5..5.....
606 ..............
607 ..............
608 ..............
609 ..............
610 ..............
611 m>m>l....l>m>m
612 mwmwmwmmwmwmwm
613 +>+>+>++>+>+>+
614 ..............
615 ..............
616 Level:
617 Hans
618 we are da world
619 Bricks:
620 ..............
621 .vvvvvvvvvvvv.
622 .vzzzzzzzzzzv.
623 .vzzzzzzzzzzv.
624 .vzzffffffzzv.
625 .vzzffffffzzv.
626 .vzzff!*ffzzv.
627 .vzzff*!ffzzv.
628 .vzzff!*ffzzv.
629 .vzzff*!ffzzv.
630 .vzzff!*ffzzv.
631 .vzzff*!ffzzv.
632 .vzzff!*ffzzv.
633 .vzzffffffzzv.
634 .vzzffffffzzv.
635 .vzzzzzzzzzzv.
636 .vzzzzzzzzzzv.
637 hhhhhhhhhhhhhh
638 Bonus:
639 ..............
640 .5.b5.ww.5b.5.
641 ..b........b..
642 .w.*.*..*.*.w.
643 .5..........5.
644 .b..........b.
645 ...*..5...*...
646 .5.....5....5.
647 .b....5.....b.
648 ...*...5..*...
649 .5....5.....5.
650 .bb....5...bb.
651 ...*..5...*...
652 .5..........5.
653 ..b........b..
654 .w.*.*..*.*.w.
655 .5b........b5.
656 5w*w*w++w*w*w5
657 Level:
658 Hans
659 dominos
660 Bricks:
661 ****cccccc****
662 *bc*cc***c*cb*
663 *ba*aa***a*ab*
664 *ba*cc*c*c*ab*
665 *ba*bb*bbb*ab*
666 *ba*ac**ca*ab*
667 *ba*acb*ca*ab*
668 *ba*aca*ca*ab*
669 *ba*****ca*ab*
670 *babacccca*ab*
671 *babacaaca*ab*
672 ********ca*ab*
673 cbabacc*ca*ab*
674 cbabbbb*bb*ab*
675 ********cc*ab*
676 *baaaaaaaa*ab*
677 *bcccccccc*cb*
678 ***********cc*
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..............
686 ..............
687 ..............
688 ..............
689 ..............
690 ..............
691 ..............
692 ..............
693 ..............
694 ..............
695 ..............
696 ..............
697 ..............
698 Level:
699 Hans
700 dominos II
701 Bricks:
702 .............*
703 .............*
704 .############*
705 .#***cc****cc*
706 .#*c*cc*cc*cc*
707 .#*c*cc*cc*cc*
708 .#*c*cc*cc*cc*
709 .#*c*cc*cc*cc*
710 .#*c*cc*cc*cc*
711 .#*c*cc*cc*cc*
712 .#*c*cc*cc*cc*
713 .#*c*cc*cc*cc*
714 .#*c*cc*cc*cc*
715 .#*c*cc*cc*cc*
716 .#*c*cc*cc*cc*
717 .#*c*cc*cc*cc*
718 .#*c****cc****
719 .#############
720 Bonus:
721 .............5
722 .............5
723 ..............
724 ..5.5..5..5...
725 ..............
726 ..............
727 ..............
728 ..............
729 ..............
730 ..............
731 ..............
732 ..............
733 ..............
734 ..............
735 ..............
736 ..5...........
737 ..5.5..5..5..5
738 ..............
739 Level:
740 Hans
741 dominos II
742 Bricks:
743 ......**......
744 ......**......
745 .#####**#####.
746 .#**********#.
747 .#*zzzzzzzz*#.
748 .#*zzzzzzzz*#.
749 .#*zz*zz*zz*#.
750 .#*zz*zz*zz*#.
751 .#*zz*zz*zz*#.
752 .#*zz*zz*zz*#.
753 .#*zz*zz*zz*#.
754 .#*zz*zz*zz*#.
755 .#*zz*zz*zz*#.
756 .#*zz*zz*zz*#.
757 .#*zz*zz*zz*#.
758 .#*zz*zz*zz*#.
759 .#****zz****#.
760 .############.
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 ..............
768 ..............
769 ..............
770 ..............
771 ..............
772 ..............
773 ..............
774 ..............
775 ..............
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Hans
782 domnios III
783 Bricks:
784 ......**......
785 ......**......
786 .EEEEE**EEEEE.
787 .E!!!!**!!!!E.
788 .E!*!!**!!*!E.
789 .E!*!!**!!*!E.
790 .E!*!!**!!*!E.
791 .E!*!!**!!*!E.
792 .E!*!!**!!*!E.
793 .E!*!!**!!*!E.
794 .E!*!!**!!*!E.
795 .E!*!!**!!*!E.
796 .E!*!!**!!*!E.
797 .E!*!!**!!*!E.
798 .E!*!!**!!*!E.
799 .E!*!!**!!*!E.
800 .E!********!E.
801 .EEEEEEEEEEEE.
802 Bonus:
803 ......**......
804 ......**......
805 ......bb......
806 ..bjjbbbbjjb..
807 ..5b55bb55b5..
808 ..5bb*bb*bb5..
809 ..bb*b**b*bb..
810 ..5b55**55b5..
811 ..5*b****b*5..
812 ..b**b**b**b..
813 ..b*555l55*b..
814 ..5*b*l5*b*5..
815 ..5w*b5lb*w5..
816 ..bw55l555wb..
817 ..jwb*ww*bwj..
818 ..jw*bwwb*wj..
819 ..bjjjjjjjjb..
820 ..............
0 Level:
1 migs
2 automobile
3 Bricks:
4 ...............
5 ...............
6 ...............
7 .....ffyff.....
8 ....ffffgff....
9 ....ffffggf....
10 ....fyffggf....
11 ....ffffggf....
12 ..ffffffggffy..
13 ..fyffffffffff.
14 ..ffffyffffyfh.
15 ..@fffffyfffff.
16 ..fffffffffff..
17 ....aaa..aaa...
18 ....aja..aja...
19 ....aaa..aaa...
20 ...cc!cccc!cc..
21 ...............
22 Bonus:
23 ...............
24 ...............
25 ...............
26 .....!.+.>.....
27 ....1.2.0.}....
28 .....<.?0......
29 ....+~p.0m+....
30 .....2.-0......
31 ..}2...20.b1...
32 ....b?W...2.?<.
33 ..sw.-.>-c+....
34 ....2c.2.1.w.+.
35 ..1b.?-.~......
36 ....<.s..<>....
37 .....W.....d...
38 ....-.d..{.....
39 ...+..w.-+.?...
40 ...............
41 Level:
42 migs
43 robot
44 Bricks:
45 ...............
46 ...............
47 ......aEEa.....
48 ......a**a.....
49 ......a**a.....
50 ......aaaa.....
51 ......ahha.....
52 ......ahha.....
53 ......aaaa.....
54 ......affa.....
55 ......affa.....
56 ......aEEa.....
57 .......aa......
58 .......aa......
59 .......aa......
60 .......aa......
61 .....@@@@@@....
62 ...............
63 Bonus:
64 ...............
65 ...............
66 ......0..-.....
67 ......+.-c.....
68 ......0?.......
69 .........0.....
70 ......0>.W.....
71 ......b.f0.....
72 ......0..b.....
73 ......-5.0.....
74 ......0<++.....
75 ......W..0.....
76 .......s.......
77 .......dw......
78 .......f.......
79 ........>......
80 ...............
81 ...............
82 Level:
83 migs
84 red-man
85 Bricks:
86 ...............
87 ......d*d......
88 .....d*d*d.....
89 .....*d*d*.....
90 ......*d*......
91 .......*.......
92 .......d.......
93 .....*d*d*.....
94 .....d*d*d.....
95 .......*.......
96 .......d.......
97 .......*.......
98 .......d.......
99 ......*.*......
100 .....d...d.....
101 ....*.....*....
102 ...............
103 ...............
104 Bonus:
105 ...............
106 ......0.0......
107 .....1.-.1.....
108 .....2c.c2.....
109 .......-.......
110 .......3.......
111 .......>.......
112 ......d.d......
113 .....~.>.~.....
114 ...............
115 .......f.......
116 .......3.......
117 .......W.......
118 ...............
119 .....<...<.....
120 ...............
121 ...............
122 ...............
123 Level:
124 migs
125 sand lorry
126 Bricks:
127 ...............
128 ...............
129 ...ddd.........
130 ..ddddd..eee...
131 ..dvvdd.eeeee..
132 ..dvvddeeeeeee.
133 ..dvvddeeeeeee.
134 ddddddddddddd.
135 ddddddddddddd.
136 hd*dddddd*ddd.
137 hdddddddddddd.
138 ddddddddddddd.
139 ..daaaddddaaad.
140 ...aja....aja..
141 ...aja....aja..
142 ...aaa....aaa..
143 ...............
144 ...............
145 Bonus:
146 ...............
147 ...............
148 ...............
149 ..}.W-l..+.s...
150 ...~.1....w.-..
151 ....c+?s.d.d.?.
152 ..~f5...b.-f...
153 *.1?.}d.-1.?-.
154 ..?.!c.1&.g?.+.
155 -b..w+.4...}..
156 ...+&?.?.<!*...
157 p...d.+-...c-.
158 ..1ms.<..!.....
159 .....{....cW...
160 ....W.......s..
161 ...>.d....d.>..
162 ...............
163 ...............
164 Level:
165 migs
166 dodge 'em
167 Bricks:
168 v.............
169 .....ddd*dd...v
170 ....dddddddd...
171 ...dd*ddddddd..
172 ..dddddddd*ddd.
173 d*dddddddddddd
174 djjjjjjjjjjjjd
175 djd*dj*j*jj*jd
176 djjjdjdjdjjjjd
177 *ddjdjdjdjjddd
178 djjjdjdjjjjddd
179 dddddddddddddd
180 ..dddd*dddddd*.
181 ...dddddddddd..
182 ....ddddd*dd...
183 .....dddddd....
184 ...............
185 ...............
186 Bonus:
187 ...............
188 .....j0!.......
189 ....-!0!.>{0...
190 ...4c.!03d01-..
191 ..}w+?{.w!.f.1.
192 {.!+.?+!.-?!>.
193 ..!*d>c.bc.!3&-
194 ?5~.!s.?.!g.!w
195 !p!<?d--{!p!f?
196 ..!?3{1f?..!j??
197 0+!?~+.w03s{!4
198 -&f>c!4f!m0~0>
199 ..<0{!g!0c{!c..
200 ...b?-!jd?.?+..
201 ....~0?w!.!....
202 .....{wd-<0....
203 ...............
204 ...............
205 Level:
206 migs
207 jet
208 Bricks:
209 ...............
210 ......v......@.
211 ......k........
212 ......k...@....
213 ...@..k........
214 ......k......k.
215 ......k......k.
216 ......k......k.
217 ...kkkkkkkkkkk.
218 ..kckckckckckc.
219 ...kkkkkkkkkkk.
220 ......k......k.
221 ......k......k.
222 ......k......k.
223 ..@...k........
224 ......k..@.....
225 ......k........
226 ......v........
227 Bonus:
228 ...............
229 ...............
230 ......w........
231 ......!........
232 ......<........
233 .............?.
234 ......}........
235 .............W.
236 ...-b.?-*.>b-s.
237 ..?0c1p2.2.1c0.
238 ...+&~?+>.d&+..
239 ......~......W.
240 ......{........
241 .............?.
242 ......<........
243 ......!........
244 ......w........
245 ...............
246 Level:
247 migs
248 choo-choo
249 Bricks:
250 .....j.........
251 ....j...ddddd..
252 ...dd...dvvvd..
253 ...dd...dvvvd..
254 ...dd...ddddd.d
255 ...dd...ddddd.d
256 ..ddddddddddd.d
257 ..ddddddddddd.d
258 ..ddddddddddd.d
259 ..ddddddddddd.d
260 ..ddddddddddddd
261 ddaEadddaEad.d
262 ...aaa...aaa...
263 ...aja...aja...
264 ...aaa...aaa...
265 ...aaa...aaa...
266 ..@##@#.#@#@@v.
267 ...............
268 Bonus:
269 ...............
270 ....4...0.W.?..
271 ...?.....?W.0..
272 ...c!...fm4....
273 ...-0...f.2s..!
274 ...2?....0.!W.0
275 ..->.<>0..2p..0
276 ..f00d.ss0Wd..0
277 ...?&+4?...0..f
278 ..4cs.c.b?>.W.W
279 ..!W>4W022.?cd1
280 m0fdW---.5.0.+
281 ....2<...<0....
282 ...0}c.....b...
283 ....W....0-....
284 ...w5+...j.0...
285 ..f{gd0.4d{0.+.
286 ...............
287 Level:
288 migs
289 chevron
290 Bricks:
291 ...............
292 ...............
293 ...............
294 jjjjjjjjjjjjjj
295 h..hh..hh..hh.
296 ...hh..hh..hh..
297 ..hh..hh..hh..h
298 hh..hh..hh..hh
299 h..hh..hh..hh.
300 ...hh..hh..hh..
301 ..hh..hh..hh..h
302 hh..hh..hh..hh
303 h..hh..hh..hh.
304 jjjjjjjjjjjjjj
305 ...............
306 ...............
307 ...............
308 ...............
309 Bonus:
310 ...............
311 ...............
312 ...............
313 w.?.f.bb.f.?.w
314 ~..11..&...00.
315 ...11......00..
316 ..11..?<..00..&
317 11...-..00..+.
318 1..?<..00..>?.
319 ....-..00..+...
320 ..?<..00..>?..2
321 .....00......22
322 *..00..}{..22.
323 c.j.>.WW.>.jmc
324 ...............
325 ...............
326 ...............
327 ...............
328 Level:
329 migs
330 all aboard!!
331 Bricks:
332 .......j@.....v
333 .......j@f.....
334 ......jj@f.....
335 .....jjj@yf....
336 .....jjj@yf....
337 ....jjjj@yyf...
338 ...jjjjj@yyf...
339 ...jjjjj@yyyf..
340 ..jjjjjj@fffff.
341 .......v@v.....
342 ..eeeeeeeeeeee.
343 ...eeeeeeeeeee.
344 ....eeeeeeeee..
345 .....eeeeeee...
346 ...!..!ee!e.!..
347 gggggggggggggg
348 gggggggggggggg
349 ...............
350 Bonus:
351 .......0.......
352 ........1?.....
353 .......?.......
354 .....!-.j0.....
355 .....0.1..W....
356 ......W.4}0....
357 ...01d<2pl.0...
358 ....b.?0jm2?...
359 ..?-.0.....1.0.
360 ........1......
361 ..21*?.0.W0.2!.
362 ....012w.0db...
363 .....!.1{?.&1..
364 ......0.W.0....
365 ...>...~..>....
366 0&0?{+.<.?010?
367 f0.c0.>.0.!0.f
368 ...............
369 Level:
370 migs
371 yello sub
372 Bricks:
373 ....hh.........
374 ...!vh..!..!g..
375 EggghEgggEggEg
376 .....h.........
377 ...y.h.....yy..
378 @x..h....f..z.
379 z...h.........
380 ....hhhhhhhhh..
381 ...hhhhhhhhhhh.
382 x.hhhhhhhhhhh.
383 ...hhhhhhhhhhh.
384 ...hhhhhhhhhhh.
385 ...hhhhhhhhhhh.
386 ...hhhhhhhhhhh.
387 ....hhhhhhhhh..
388 z.x...........
389 ..y........y...
390 ........@......
391 Bonus:
392 ...............
393 ...<42..?..d...
394 ..c<...<<...<l.
395 ...............
396 ............!..
397 3?..2....f....
398 ...............
399 ....0.s.1.0....
400 ...+00.0f00&c..
401 f.!.+.00*.000.
402 ...00000&00b00.
403 ...0w0.000.0-d.
404 ...&0p0000000..
405 ...d000!.fd.0f.
406 ....-0s0+0>....
407 -.f...........
408 ...........>...
409 ........!......
410 Level:
411 migs
412 traffic
413 Bricks:
414 ...............
415 jjjjjjjjajajjj
416 .........g!g...
417 ..ada....a.a...
418 ...............
419 vjvjvjvjvjvjvj
420 ....a.a.....a.a
421 ....iii.....@@@
422 ....a.a.....a.a
423 cccccccccccccc
424 a.a...........
425 yyy.....afa...
426 a.a...........
427 vjvjajajvjvjvj
428 .....hhh..a.a..
429 .....a.a..d*d..
430 ..........a.a..
431 jjjjjjjjjjjjjj
432 Bonus:
433 ...............
434 2.?w.c.&...-.2
435 .........W.....
436 ..Wl.......?...
437 ...............
438 1-1?1.1.*.1w1.
439 ......3........
440 .....m......p.5
441 ....3..........
442 !2.s&.j-.?c2&!
443 ...............
444 ?w+.....Ws....
445 ...............
446 ..0+0.0.0.0+0?0
447 .....Ws........
448 ..........+....
449 ...............
450 >.b.>.<.>.b.>.
451 Level:
452 migs
453 bridge o' troubled h2o
454 Bricks:
455 ..............v
456 ddd.......ff..
457 dddd..v...fff.
458 cccccccccccccc
459 a.ca.c..c.aca.
460 aaaaaaaaaaaaaa
461 ekkkkkvvkkkkke
462 ekkkk....kkkke
463 ekkk......kkke
464 ekk...v...vkke
465 ekk........kke
466 ek..........ke
467 ek....v..v..ke
468 ek.v........ke
469 ee..........ke
470 ee.........vee
471 eee.v......eee
472 eeeeeg!!ggeeee
473 Bonus:
474 ..............j
475 ?.*........p..
476 +4.1..g...+.3.
477 ..>.{.{!2~&w?.?
478 &..?......~W<.
479 ..w.s.ff.}-.c.f
480 !-..?>.?4.1.2!
481 ...-0-....b-&..
482 ..<........c{>1
483 c.f...W...?...
484 ..>.........~0m
485 1.............
486 ..}....j..+..s~
487 ~..<........&1
488 ..{............
489 ?-.........b.?
490 ...?.>......c-.
491 !0>0+0.?0<.W0!
0 Version: 0.90
1 Level:
2 Eric Jacobson
3 Up Up And Away
4 Bricks:
5 ggggddddddgggg
6 gggddddddddggg
7 ggddddddddddgg
8 gddddhhhhddddg
9 dhddhhhhhdddhd
10 dhddhhhhhdddhd
11 dhddhhhhhhhhhd
12 dhdddhhhhhhhhd
13 dhhdddddddhhhd
14 dhhhdddddddhhd
15 dhhhhddddddhhd
16 dhhhhhhhhddhhd
17 gdhhddhhdddhdg
18 ggdhhddddhhdgg
19 gggddddddddggg
20 gggggggggggggg
21 vvvvvvvvvvvvvv
22 ..............
23 Bonus:
24 55lj.5555j.m55
25 55b.444444.b55
26 cf.33333333..c
27 ..333j...333..
28 ..22....f222..
29 f>22..ll.222>f
30 ..22.wggw.....
31 f!111....>b.!p
32 W-~1111111..j.
33 .{..1111111...
34 ..*..000000<s.
35 .w..<.pp.00}pw
36 >.b.00..000..>
37 ..-..0000..-..
38 .~.>..dd..>.~.
39 ..............
40 +.w..b..b..w.+
41 ..............
42 Level:
43 Eric Jacobson
44 Signal In The Sky
45 Bricks:
46 haahhahhahhaah
47 hahhhahhahhhah
48 aahahaaaahahaa
49 aaaahaaaahaaaa
50 aaaahaaaahaaaa
51 aaaaaaaaaaaaaa
52 aaaaaaaaaaaaaa
53 aaaaaaaaaaaaaa
54 aaaahaaaahaaaa
55 aaaahaaaahaaaa
56 aahahhaahhahaa
57 hahhhhaahhhhah
58 haahhhhhhhhaah
59 hhhhhhhhhhhhhh
60 vbvbvbvbvbvbvb
61 bvbvbvbvbvbvbv
62 ..............
63 ..............
64 Bonus:
65 j55W?5jj5?W55j
66 W5f?-5W~5-?f5W
67 44?4-4444-4?44
68 4444f4444f4444
69 4444W4444W4444
70 3j3333332222j2
71 3j3333222222j2
72 3j3332222222j2
73 1111f1111f1111
74 1111{1111~1111
75 00~0-~00{-0f00
76 c0{?f{00~?{c0c
77 W00W~W?cWf?00f
78 {?fc{?f?{c~W{d
79 .>.-.>.-.>.-.>
80 w.b.w.b.w.b.w.
81 ..............
82 ..............
83 Level:
84 Eric Jacobson
85 Lantern's Light
86 Bricks:
87 jjxxxxxxxxxxjj
88 jjxxxxxxxxxxjj
89 jjvvxxxxxxvvjj
90 jvvxxxxxxxxvvj
91 jvxxxvvvvxxxvj
92 jvxxvvvvvvxxvj
93 jvxxvvvvvvxxvj
94 jvxxvvvvvvxxvj
95 jvxxvvvvvvxxvj
96 jvxxvvvvvvxxvj
97 jvxxxvvvvxxxvj
98 jvvxxxxxxxxvvj
99 jjvvxxxxxxvvjj
100 jjxxxxxxxxxxjj
101 jjxxxxxxxxxxjj
102 jjjjjjjjjjjjjj
103 vvvvvvvvvvvvvv
104 ..............
105 Bonus:
106 5.0l455554l0.5
107 ..0044444400..
108 .f.p000000p.f.
109 ...00s**s00...
110 ..00-1111-00..
111 b.0-113311-0.b
112 .W0b134431b0W.
113 .p0b145541b0p.
114 >.0b134431b0.>
115 ..0+113311+0..
116 ..00+1111+00..
117 ...00{~f>00...
118 g..W000000W..s
119 ..0p000000p0..
120 .f000>f00000f.
121 ..............
122 wwb-+-bb+-+bww
123 ..............
124 Level:
125 Eric Jacobson
126 Sonic Boom
127 Bricks:
128 dddddddhhhhhhe
129 dddddddhhhhhhe
130 ddddddhhhhhhed
131 dddddhhhhhhedd
132 ddddhhhhhheddd
133 ddddhhhhhedddd
134 dddhhhhheddddd
135 ddhhhhhhhhhhed
136 ddhhhhhhhhhedd
137 ddeeeeehhheddd
138 ddddddhhhedddd
139 dddddhhheddddd
140 ddddhhhedddddd
141 ddddhheddddddd
142 dddhhedddddddd
143 ddhheddddddddd
144 dhhedddddddddd
145 vvvvvvvvvvvvvv
146 Bonus:
147 b......555555>
148 ......j444444>
149 ......444444>.
150 ..b..333333>.b
151 ....333333>...
152 ....22222>.b..
153 ...22222j.....
154 ..1111111111f.
155 ..111111111f..
156 ..ffffj000f...
157 ......000f...b
158 b....000f.....
159 ....>>>j......
160 ....>>f.b..b..
161 ...>>f........
162 ..>>f.........
163 .>>f..........
164 wbwbwbwbwbwbwb
165 Level:
166 Eric Jacobson
167 Hoping For A Sequel...
168 Bricks:
169 @@@@eehheee@@@
170 @@@eehjjh.ee@@
171 @@eeehjjhv.ee@
172 @eeeehjjh.vee@
173 @eee.vhh.v.vee
174 eee.v.v.v.v.ee
175 eeev.v.hhv.vee
176 eev.v.hhh.v.ee
177 ee.v.hhhhv.vee
178 eev.vhhhh.v.ee
179 ee.v.hhhhv.vee
180 eev.vhhhh.v.ee
181 ee.v.hhhhv.eee
182 eev.vhhhheeee@
183 @eev.hhhheeee@
184 @ee.vhhhheee@@
185 @@eeehhhhee@@@
186 ..............
187 Bonus:
188 .....m44l.....
189 .....4554.....
190 .....4554<....
191 .....4554.~...
192 .....*44.b.w..
193 ....+.d.-.{...
194 ...W.W.44>.c..
195 ..~.<.444.g...
196 ...p.3333j.f..
197 ..s.b3333.*...
198 ...j.2222p.s..
199 ..}.c2222.d...
200 ...g.1111+....
201 ..w.f1111.....
202 ...>.0000.....
203 ....-0000.....
204 .....0000.....
205 ..............
206 Level:
207 Eric Jacobson
208 Web Of Doom
209 Bricks:
210 vvddddvvddddvv
211 vvddvvddvvddvv
212 ddvvddddddvvdd
213 ddvvddvvddvvdd
214 dvddvvddvvddvd
215 vdddvvddvvdddv
216 vddvddvvddvddv
217 vddvddvvddvddv
218 vdddvvddvvdddv
219 dvddvvddvvddvd
220 ddvvddvvddvvdd
221 ddvvddddddvvdd
222 vvddvvddvvddvv
223 vvddddvvddddvv
224 ddvddddddddvdd
225 dddvddddddvddd
226 ddddvvvvvvdddd
227 ..............
228 Bonus:
229 l5....45....5l
230 40..44..44..04
231 ..04......40..
232 ..30..33..03..
233 .3..03..30..3.
234 3...30..03...3
235 2..2..55..2..2
236 2..2..55..2..2
237 2...20..02...2
238 .1..01..10..1.
239 ..10..11..01..
240 ..01......10..
241 10..11..11..01
242 00....00....00
243 ..0........0..
244 ...0......0...
245 ....wbwbwb....
246 ..............
247 Level:
248 Eric Jacobson
249 Eddie's Clubhouse
250 Bricks:
251 ggg.cgg..cg..g
252 gg.cggvvggc.gg
253 g.ccg..gg.ccg.
254 vccc..gg..cccv
255 .cjjcggvvcjjcg
256 gcjjcg..gcjjcg
257 gcjjjc.gcjjjc.
258 vcjjjccccjjjcv
259 .cjjjccccjjjcg
260 gcjjjcvvcjjjcg
261 gcjjjc.gcjjjcv
262 .cjjjcggcjjjc.
263 vcjjcggvvcjjcg
264 ggcjcg..gcjcgg
265 g.ccg..gg.ccg.
266 vvgcvvggvvcgvv
267 .gg..gg..gg..g
268 ..............
269 Bonus:
270 111.511..51..1
271 11.51133115.11
272 1...1..11...1.
273 3..?..11..?..3
274 .?...1133...?1
275 1.?.?1..1?.?.1
276 1......1......
277 3.?.?.??.?.?.3
278 .?...gppg...?1
279 1.?bj?33?jb?.1
280 1..f>..1.>~..3
281 .?.?.?11?.?.?.
282 3....1133....1
283 11-.?1..1?.+11
284 1.?+1..11.-?1.
285 33bw331133wb33
286 .11..11..11..1
287 ..............
288 Level:
289 Eric Jacobson
290 Coast To Coast
291 Bricks:
292 dddddvvvvddddd
293 dddd.vvvv.dddd
294 dddd..vv..dddd
295 ddd........ddd
296 ddd.cccccc.ddd
297 ddd..c..c..ddd
298 ddd........ddd
299 ddd........ddd
300 ddd........ddd
301 ddd........ddd
302 dd..........dd
303 h............h
304 .h..........h.
305 ..h........h..
306 ...hvvvvvvh...
307 v.v.hvvvvh.v.v
308 .v.v.hvvh.v.v.
309 v.v.v.hh.v.v.v
310 Bonus:
311 l..b.4554.b..l
312 .....4554.....
313 ..f...44...f..
314 ..............
315 .p..3p33p3..p.
316 f....3..3....f
317 ..............
318 b.f........f.b
319 ..............
320 .p..........p.
321 ..............
322 -............-
323 ..............
324 ..............
325 ...-..pp..-...
326 ..............
327 ..............
328 ..w.b.pl.b.w..
329 Level:
330 Eric Jacobson
331 The Cap'n
332 Bricks:
333 gggggggddddddd
334 ggcccggddddddd
335 gccgccgjjjjjjj
336 gcgggcgjjjjjjj
337 gcEEEcg@@@@@@@
338 gcccccgddddddd
339 gcgggcgjjjjjjj
340 gcgggcgjjjjjjj
341 gggggggddddddd
342 @@@@@@@ddddddd
343 jjjjjjjjjjjjjj
344 jjjjjjjjjjjjjj
345 dddddddddddddd
346 ddddddd@@@@@@@
347 jjjjjjjjjjjjjj
348 jjjjjjjjjjjjjj
349 dddddddddddddd
350 @@@@@@@ddddddd
351 Bonus:
352 5222222jw...?5
353 5244422..>bc.5
354 5442442.sg?..5
355 542m242f...W.5
356 54...42.......
357 5444442.b.*.w5
358 5422242..~...5
359 5422242.c.d..5
360 5222222.w.>b.5
361 .......!.sg.j5
362 5j..W........5
363 5..~.?..W..?.5
364 5...*..b.....5
365 5.w.c.........
366 5.?..d..~.W.cf
367 5W..s.>...g...
368 5........w.b?.
369 ..............
370 Level:
371 Eric Jacobson
372 Wonder Boy
373 Bricks:
374 EEEE@@@@@@EEEE
375 EEE@dddddd@EEE
376 hhhhhhhhhhh@EE
377 hhhhhhhhhhhh@E
378 @dddhhhddddhh@
379 @dddhhddddddh@
380 @ddhhddddddhh@
381 @ddhhdddddhhd@
382 @dhhhddddhhdd@
383 @dhhdddhhhddd@
384 @hhhddhhhdddd@
385 @hhdddhhddddd@
386 hhhdddhhhdddd@
387 hhdddddhhhddd@
388 hhddddddhhhd@E
389 hh@ddddddhhhEE
390 EEE@ddddddhhhE
391 EEEE@dddd@EhhE
392 Bonus:
393 55555555555555
394 5555?+bws?5555
395 44222222222555
396 42222222222255
397 5?.+222..?.225
398 5.b.22.?.-.?25
399 5ws22?.m.?.225
400 5.j22..m..22?5
401 5?222...?22..5
402 5.22.?.222...5
403 5222..222..?w5
404 522?..22..-b.5
405 222.+.222s.j.5
406 22..-.?222.+?5
407 42.s....222.55
408 445.?.gp?22255
409 5555..j..?2225
410 55555.wb.55225
411 Level:
412 Eric Jacobson
413 Green Men
414 Bricks:
415 ghhg.y.y.yghhg
416 hhhhy.y.y.hhhh
417 dhhd.y.y.yghhd
418 gdddd.y.yddddg
419 ggdddd.yddddgg
420 g.yddddddddy.g
421 .y.yddddddy.y.
422 y.y.yddddy.y.y
423 .y.yddddddy.y.
424 y.yddddddddy.y
425 .yddddy.ddddy.
426 yddddy.y.ddddy
427 ddddy.y.y.dddd
428 dddy.y.y.y.ddd
429 ddy.y.y.y.y.dd
430 dddddhhhhddddd
431 dddddhhhhddddd
432 dddddhhhhddddd
433 Bonus:
434 5....5.5.5...l
435 .s.j5.5.5.j.s.
436 ...f.4.4.4W+..
437 ......4.4.....
438 ...wg..4.gw...
439 ..3.?.jj.?.3..
440 .3.3..??..3.3.
441 3.3.3.+f.3.3.3
442 .2.2.?-.?.2.2.
443 2.2.p....p.2.2
444 .2.?c?1.?-?.2.
445 2s...1.1....s2
446 ..g.1.1.1..g..
447 +>.0.0.0.0..>+
448 ..0.0.0.0.0...
449 Ww..b.+..b..wf
450 ..?~..??..c?..
451 ?...?....?...?
452 Level:
453 Eric Jacobson
454 Titans, Go!
455 Bricks:
456 ........hhhh..
457 aaaaaaahvvvvh.
458 ccbccbchvvvvh.
459 aaaaaaahhvvhh.
460 EEEEEEEhhvvhh.
461 ..aaa...hvvhe.
462 ..EEE....hheee
463 ..cbc....eaeee
464 ..aaa.....aebe
465 ..EEE.....Ecbe
466 ..bcb.....acbe
467 ..aaa....bacbe
468 ..EEE....bacbE
469 ..cbc....bEcba
470 ggaaaggggbacba
471 gxEEExxggxxxxx
472 gxxxxxxxgggggg
473 xxxxxxxxxggggg
474 Bonus:
475 ........?m....
476 554422b.3553..
477 5544220.3333..
478 l54422w>.11.?.
479 ........?11...
480 .........11.>.
481 .........?.?..
482 ..?4?........s
483 .............?
484 ...........?-.
485 ..-4+.........
486 ...........g..
487 .........?..b.
488 ..?4?......?..
489 p.....?.s?...?
490 .?....w.......
491 ?.?.b...-..~..
492 ..w.?.g..?...>
493 Level:
494 Eric Jacobson
495 Transform!
496 Bricks:
497 vvvvddddddvvvv
498 ddvdddvvdddvdd
499 ddvvdvvvvdvvdd
500 dvdvvdvvdvvdvd
501 ddvdvvddvvdvdd
502 dvddvvvvvvddvd
503 vdvdvdvvdvdvdv
504 vvddvvddvvddvv
505 dvvvvvddvvvvvd
506 dvvvdvddvdvvvd
507 ddvddvddvddvdd
508 ddvddvddvddvdd
509 ddvddvddvddvdd
510 ddvddvvvvddvdd
511 vdvddddddddvdv
512 vvvddvvvvddvvv
513 vvvdvvddvvdvvv
514 vvvvvddddvvvvv
515 Bonus:
516 ....555555....
517 33.555..555.33
518 33..5....5..33
519 3.3..3..3..3.3
520 33.3..33..3.33
521 2.22......22.2
522 .2.2.2..2.2.2.
523 ..22..22..22..
524 w.....??.....w
525 ?...?.bb.?...?
526 .?.?b.??.b?.?.
527 ?..>?.ww.?>..?
528 .?.?..??..?.?.
529 ?...?....?...?
530 .?.?.?..?.?.?.
531 ....?....?....
532 ...?..bb..?...
533 .....>ww>.....
534 Level:
535 Eric Jacobson
536 Gen-X
537 Bricks:
538 @@@bbbbbbbbEEE
539 @@bbhhhhhhbbEE
540 @bbhhhhhhhhbbE
541 bbcchhhhhhccbb
542 bbccchhhhcccbb
543 bggccchhcccggb
544 bgggccccccgggb
545 bggggccccggggb
546 bgggggccgggggb
547 bggggccccggggb
548 bgggccccccgggb
549 bggccchhcccggb
550 bbccchhhhcccbb
551 bbcchhhhhhccbb
552 bbbhhhhhhhhbbb
553 Ebbhhhhhhhhbb@
554 EEbbhhhhhhbb@@
555 EEEbbbbbbbb@@@
556 Bonus:
557 ...11111111...
558 ..11..f.?.11..
559 .11?.?.b...11.
560 1133.....?3311
561 11333.?..33311
562 1..333..333..1
563 1??.333333f?.1
564 1...p3333*..?1
565 1?b?..55...b.1
566 0....2222?..?0
567 0.?.222222...0
568 0..222..222?.0
569 00222..?.22200
570 0022..m...2200
571 000f?.-b.?.000
572 .00...wd...00.
573 ..00>.W?.>00..
574 ...00000000...
575 Level:
576 Eric Jacobson
577 Real Heroes
578 Bricks:
579 fffffff!.!.!.!
580 ffxxxff.!j!.!.
581 fxfffxf!j!j!.!
582 fxfffxf.jjj.!.
583 fxfffxf!j!jjj!
584 fxxxxxf.!.!j!.
585 fxfffxf!.!.jj!
586 fxfffxf.!.!j!.
587 fffffff!.!.!.!
588 gggggggddddddd
589 gcgggcgddhdhdd
590 gccggcgdhdhdhd
591 gcgcgcgdhdhdhd
592 gcggccgdhdhdhd
593 gcgggcgdhdddhd
594 gcgggcgdhdddhd
595 gcgggcgdhdddhd
596 gggggggddddddd
597 Bonus:
598 ..............
599 ..555....5j...
600 .5.j.5..5.5...
601 .5...5..555...
602 .5...5..5.555.
603 .55555....j5..
604 .5.j.5.....55.
605 .5...5.....5..
606 ......mm......
607 .w.b.w...wbw..
608 *5...5...5.5.*
609 .55..5..5.5.5.
610 .5.5.5..5.5.5.
611 .5.j55..5.5.5.
612 .5.b.5..5.b.5.
613 *5...5..5.j.5*
614 .5...5..5...5.
615 .w.b.w..w.b.w.
0 Level:
1 elvis
2 Choose Your Weapon
3 Bricks:
4 ..............
5 ..............
6 .cccccccccccc.
7 .cbbbbbbbbbbc.
8 .cbgaaaaaa*bc.
9 .cbaaeeeeaabc.
10 .cbaeeeeeeabc.
11 .cbaeeeeeeabc.
12 .cbaaeeeeaabc.
13 .cbfaaaaaadbc.
14 .cbbbbbbbbbbc.
15 .cccccccccccc.
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 .bbbbbbbbbbbb.
26 .b..........b.
27 .b.m......*.b.
28 .b...2222...b.
29 .b..234432..b.
30 .b..234432..b.
31 .b...2222...b.
32 .b.p......w.b.
33 .b..........b.
34 .bbbbbbbbbbbb.
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 elvis
43 Avarice and Greed
44 Bricks:
45 eeeeeeeeeeeeee
46 c#c#c#c#c#c#cc
47 cccccccccccccc
48 cc#c#c#c#c#c#c
49 cccccccccccccc
50 ..............
51 cccccccccccccc
52 cccccccccccccc
53 cccccccccccccc
54 cccccccccccccc
55 cccccccccccccc
56 cccccccccccccc
57 dgdgdgdgdgdgdg
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 55555555555555
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 bbbbbbbbbbbbbb
71 bbbbbbbbbbbbbb
72 bbbbbbbbbbbbbb
73 bbbbbbbbbbbbbb
74 bbbbbbbbbbbbbb
75 bbbbbbbbbbbbbb
76 w.w.w.w.w.w.w.
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 elvis
84 untitled
85 Bricks:
86 .eeeeeeeeeeee.
87 .egeeegeeegee.
88 ..############
89 .iiiiiiiiiiii.
90 .iiiiiiiiiiii.
91 ############..
92 .ffffffffffff.
93 .ffffffffffff.
94 ..############
95 .hhhhhhhhhhhh.
96 .hhhhhhhhhhhh.
97 ############..
98 .kkkkkkkkkkkk.
99 .kkkkkkkkkkkk.
100 cccccccccccccc
101 cccccccccccccc
102 cccccccccccccc
103 dadadadadadada
104 Bonus:
105 .555555555555.
106 .5m555m555m55.
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 bbbbbbbbbbbbbb
120 bbbbbbbbbbbbbb
121 bbbbbbbbbbbbbb
122 w.w.w.w.w.w.w.
123 Level:
124 elvis
125 Over the Top
126 Bricks:
127 ....gggggg....
128 .ccc######ccc.
129 .ccc######ccc.
130 .ccc#eeee#ccc.
131 .ccc#eeee#ccc.
132 .ccc#eeee#ccc.
133 .ccc#eeee#ccc.
134 .ccc#eeee#ccc.
135 .ccc#eeee#ccc.
136 .ccc#eeee#ccc.
137 .ccc#eeee#ccc.
138 .ccc######ccc.
139 .############.
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ....mmmmmm....
147 .bbb......bbb.
148 .bbb......bbb.
149 .bbb.5555.bbb.
150 .bbb.5555.bbb.
151 .bbb.5555.bbb.
152 .bbb.5555.bbb.
153 .bbb.5555.bbb.
154 .bbb.5555.bbb.
155 .bbb.5555.bbb.
156 .bbb.5555.bbb.
157 .bbb......bbb.
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 elvis
166 Fetch the Ball
167 Bricks:
168 ..............
169 ..............
170 ..#...........
171 .##ddddddddddd
172 .#cccccccccccc
173 .#cccccccccccc
174 .#cccccccccccc
175 .#cccccccccccc
176 .#cccccccccccc
177 .#cccccccccccc
178 .#cccccccccccc
179 .#cccccccccccc
180 .#cccccccccccc
181 .#c###########
182 .#ceeeeeeeeeee
183 .#ceeeeeeeeeee
184 .#############
185 .#############
186 Bonus:
187 ..............
188 ..............
189 ..............
190 ...wwwwwwwwwww
191 ..bbbbbbbbbbbb
192 ..bbbbbbbbbbbb
193 ..bbbbbbbbbbbb
194 ..bbbbbbbbbbbb
195 ..bbbbbbbbbbbb
196 ..bbbbbbbbbbbb
197 ..bbbbbbbbbbbb
198 ..bbbbbbbbbbbb
199 ..bbbbbbbbbbbb
200 ..b...........
201 ..b55555555555
202 ..b55555555555
203 ..............
204 ..............
205 Level:
206 elvis
207 Self Restraint
208 Bricks:
209 ee#ee#ee#ee#ee
210 ee#ee#ee#ee#ee
211 ee#ee#ee#ee#ee
212 ee#ee#ee#ee#ee
213 ee#ee#ee#ee#ee
214 ee#ee#ee#ee#ee
215 ee#ee#ee#ee#ee
216 ee#ee#ee#ee#ee
217 ee#ee#ee#ee#ee
218 ee#ee#ee#ee#ee
219 ##############
220 c.cgcfchcic.c.
221 .c.c.c.c.c.c.c
222 c.c.c.c.c.c.c.
223 .c.c.c.c.c.c.c
224 c.c.c.c.c.c.c.
225 .c.c.c.c.c.c.c
226 d.d.d.d.d.d.d.
227 Bonus:
228 55.55.55.55.55
229 55.55.55.55.55
230 55.55.55.55.55
231 55.55.55.55.55
232 55.55.55.55.55
233 55.55.55.55.55
234 55.55.55.55.55
235 55.55.55.55.55
236 55.55.55.55.55
237 55.55.55.55.55
238 ..............
239 b.bmbpb<bsb.b.
240 .b.b.b.b.b.b.b
241 b.b.b.b.b.b.b.
242 .b.b.b.b.b.b.b
243 b.b.b.b.b.b.b.
244 .b.b.b.b.b.b.b
245 w.w.w.w.w.w.w.
246 Level:
247 elvis
248 Don't Catch a Bullet
249 Bricks:
250 eeeeeeeeeeeeee
251 egeegeeeegeege
252 eeeeeeeeeeeeee
253 ee##########ee
254 eezzcccccczzee
255 eezzcccccczzee
256 eezz......zzee
257 ezzz......zzze
258 ezzz......zzze
259 zzzzc....czzzz
260 zzzzcc..cczzzz
261 zzzzcccccczzzz
262 ####dd..dd####
263 ..............
264 ..............
265 ..............
266 ..............
267 ..............
268 Bonus:
269 54555555555545
270 4m45m5555m55m4
271 32345555555323
272 21..........12
273 10..bbbbbb..01
274 10..bbbbbb..01
275 10..........01
276 0............0
277 0............0
278 ....b....b....
279 ....bb..bb....
280 ....bbbbbb....
281 ....ww..ww....
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
0 Level:
1 Martin Moeller
2 1st Day of X-Mas
3 Bricks:
4 ghg...........
5 ghg!..!..!..!.
6 ghg...........
7 ghg...........
8 ###kkkkkkkkkkk
9 **#vvvvvvvvvkk
10 cc#vdddjdddvkk
11 cc#vdddjdddvkk
12 cc#vdddjdddvkk
13 cc#vjjjjjjjvkk
14 cc#vdddjdddvkk
15 cc#vdddjdddvkk
16 cc#vdddjdddvkk
17 cc##########kk
18 ...............
19 ...............
20 ...............
21 ...............
22 Bonus:
23 ...............
24 ..?.s..4..w..?.
25 ...............
26 ..w............
27 .....f.f.c.c.3.
28 ....b.~.s.>.b>.
29 .....1.1.1.1..<
30 ....-.g.2.l.~.1
31 ....?1.1.1.1?<>
32 ....+.2.j.2.+1.
33 .....1.1.1.1-.<
34 ....?.m.2.p..>.
35 .....1.1.1.1>.1
36 ...............
37 ...............
38 ...............
39 ...............
40 ...............
41 Level:
42 Martin Moeller
43 2nd Day of X-Mas
44 Bricks:
45 hhh*cccccccccc
46 ggh#cccccccccc
47 hhhvc!cc!!cc!c
48 hgg#cccccccccc
49 hhhvcccccccccc
50 #c#*###*##*###
51 vvvvvvvvvvvvvv
52 v**vvvvvvvvvvv
53 vvvvvvvvvvvvvv
54 ###**#########
55 bb#bb#bbbbbbbb
56 ffffffffffffff
57 eeeeeeeeeeeeee
58 ...............
59 ...............
60 ...............
61 ...............
62 ...............
63 Bonus:
64 ...sl...?.....?
65 ..4.5j.........
66 ......w..gp..m.
67 ...45.........m
68 w...?.l.l.?.l.
69 ..5...5.?.?.?.?
70 3+3-3+3-3+3-3+
71 ?2?2?2?2?2m2?2
72 1~1c1>1d1>1c1~
73 ~.d.<.>.d.~.c.
74 ...............
75 ?....l...l...?
76 ...............
77 ...............
78 ...............
79 ...............
80 ...............
81 ...............
82 Level:
83 Martin Moeller
84 3rd Day of X-Mas
85 Bricks:
86 hhh#ff!eddiijk
87 ggh#!feeddiijk
88 ghhvff!eddiijk
89 gghv!feeddiijk
90 hhh#ff!eddiijk
91 ####!feeddiijk
92 !f!fff!eddiijk
93 ffffffeeddiijk
94 e!e!e!eeddiijk
95 ddddddddddiijk
96 ddddddddddiijk
97 iiiiiiiiiiiijk
98 iiiiiiiiiiiijk
99 jjjjjjjjjjjjjk
100 **************
101 ##v###vv###v##
102 ...............
103 ...............
104 Bonus:
105 l..5..?......g
106 ....5>.........
107 .......>.......
108 ....w?.........
109 ....5..-..<....
110 5555-.........
111 +.?...+....j..
112 ...............
113 ..-.+.>........
114 .........j.....
115 ...............
116 .....<.........
117 cf............
118 m~............
119 ..s.43....34.w.
120 ...>...??...b..
121 ...............
122 ...............
123 Level:
124 Martin Moeller
125 4th Day of X-Mas
126 Bricks:
127 hgh#!k!j!cbakj
128 hgh#f!k!jcbakj
129 hhh*!f!k!cbakj
130 ggh#e!f!kcbakj
131 ggh#!e!f!cbakj
132 #v##d!e!fcbakj
133 !j!i!d!e!cbakj
134 k!j!i!d!ecbakj
135 !k!j!i!d!cbakk
136 e!k!j!i!dcbaaa
137 !e!k!j!i!cbbbb
138 cccccccccccccc
139 ...............
140 ...............
141 ...............
142 ...............
143 ...............
144 ...............
145 Bonus:
146 .....4.4.?.....
147 ......4.?..?...
148 ..m..4.?.b...?.
149 ......?.b...5..
150 .....?.b.b....?
151 ......?.b..?...
152 1.0.3.?.b...?.
153 ..0.3.3.?......
154 0.3.3.3.?.....
155 ..0.3.3.?..?...
156 1.0.3.?.s....?
157 ...............
158 ...............
159 ...............
160 ...............
161 ...............
162 ...............
163 ...............
164 Level:
165 Martin Moeller
166 5th Day of X-Mas
167 Bricks:
168 hhh#dddddddddd
169 hgg#eeeeeeeeee
170 hhhcf#ffffffff
171 gghcg##ggggg#g
172 hhh#hhhhhhh##h
173 ####iiiiiiiiii
174 jjjjjjjjjjjjjj
175 kkkkkkkkkkkkkk
176 jjjjjjjjjjjjjj
177 iiiii##iiiiiii
178 hhhhhh#hhhhhhh
179 gg#ggggggggggg
180 f##fffffffffff
181 eeeeeeeee#eeee
182 dddddddd##dddd
183 vvvvvvvvvvvvvv
184 ...............
185 ...............
186 Bonus:
187 ...............
188 ......3..3..3..
189 ..?..?.b.......
190 ............p.?
191 ...............
192 ......>........
193 ......1..1..1..
194 ...............
195 ..c...m.?...d..
196 ...............
197 ...............
198 ..l.?.0..0..0..
199 ...............
200 ......f..w.?...
201 ...............
202 ..~..<..+..-..?
203 ...............
204 ...............
205 Level:
206 Martin Moeller
207 6th Day of X-Mas
208 Bricks:
209 hhh#cccccccccc
210 hgg#bbbbbbbbbc
211 hhh#aaaaaaaabc
212 hgh#vvvvvvvabc
213 hhh#feijdkvabc
214 v###feijdkvabc
215 cbavfeijdkvabc
216 cbavfeijdkv##c
217 #bavfeijdkvabc
218 cbavvvvvvvvabc
219 cbaaaaaaaaaabc
220 *##**##**##**#
221 cccccccccccccc
222 ...............
223 ...............
224 ...............
225 ...............
226 ...............
227 Bonus:
228 ...............
229 ......+.<>.+...
230 ...............
231 ..m............
232 .............m.
233 .......?......g
234 .....f?d?......
235 s...?~.c?-....
236 ..........?....
237 ...............
238 ......j.......w
239 ...............
240 ...............
241 ...............
242 ...............
243 ...............
244 ...............
245 ...............
246 Level:
247 Martin Moeller
248 7th Day of X-Mas
249 Bricks:
250 hhhjjjjjjkkkkk
251 gghjjjjjjkkkkk
252 gghj####jkkkkk
253 gghj#gg#j####j
254 gghj#gg#jiiiii
255 ###j#gg#jiiiii
256 jjjj#gg#jjjjii
257 j####gg####j#i
258 j#eefeefee#j#i
259 j#eeeeeeee#j#i
260 j####dd####j#i
261 jjjjddddjjjjii
262 iiiiddddiiiiii
263 bbbb#dd#bbbbbb
264 cccc####cccccc
265 ...............
266 ...............
267 ...............
268 Bonus:
269 .......m.......
270 ..1........0.1.
271 0.............
272 ....04m.4.....w
273 g.............
274 ......j...1.0.f
275 ..1..4.p4......
276 -..........-.1
277 p...s..<......
278 1.+......+....
279 -..........-.0
280 ...............
281 ..b~.+..+.d..b.
282 ..?........?...
283 ...............
284 ...............
285 ...............
286 ...............
287 Level:
288 Martin Moeller
289 8th Day of X-Mas
290 Bricks:
291 hhh#..........
292 hgh!..........
293 hhh#..#fffff#.
294 hgh!..#fffff#.
295 hhh#..#fffff#.
296 #!#!..#######.
297 .......jjj#iii.
298 .......jjj#iii.
299 .......jjj#iii.
300 ####..#######.
301 #ddd..#eeeee#.
302 #ddd..#eeeee#.
303 #ddd..#eeeee#.
304 #ddd..........
305 #ddd..........
306 ####..........
307 ...............
308 ...............
309 Bonus:
310 ...............
311 ..l.+..........
312 ...............
313 ..m.-...3.?.3..
314 ..........3....
315 ..-.+..........
316 .......3.....3.
317 ........?...?..
318 .........3.3...
319 ...............
320 ..2.2...3...3..
321 ...?.....?3?...
322 ..?4?..........
323 ...?...........
324 ..2.2..........
325 ...............
326 ...............
327 ...............
328 Level:
329 Martin Moeller
330 9th Day of X-Mas
331 Bricks:
332 hhh!*.........
333 hgh!c.........
334 hhh!cj#jdddd..
335 ggh!cj#jdddd..
336 ggh!cj#jdddd..
337 !!!!*j#jdddd..
338 *cc*cj#jdddd..
339 ..ddddj#jdddd..
340 ..jjjjj#jjjjj..
341 ..###########..
342 ..jjjjj#jjjjj..
343 ..ddddj#jdddd..
344 ..ddddj#jdddd..
345 ..ddddj#jdddd..
346 ..ddddj#jdddd..
347 ..ddddj#jdddd..
348 ..ddddj#jdddd..
349 ...............
350 Bonus:
351 ....+..........
352 ..m.-..........
353 ....>..........
354 ....<..........
355 ....b....1?1...
356 -+bp..........
357 ..........1?...
358 ..1?1l...l.....
359 ...j..4.4..j...
360 ...............
361 ...j..4.4..j...
362 .....l...l.....
363 ...?1.....1?...
364 ...............
365 ...1?1...1?....
366 ...........1...
367 ...............
368 ...............
369 Level:
370 Martin Moeller
371 10th Day of X-Mas
372 Bricks:
373 ghgviiifffjjjj
374 hghviiifff#jjj
375 hhhviii#fff#jj
376 hghvii#fffff#j
377 hghvi#efffffff
378 vvvv#eeeffffff
379 iii#eeee#fffff
380 ii#eeeeee#ffff
381 i#eeeeeeee#fff
382 eeeeeeeeeee#ff
383 eeeeee#eeeeeff
384 eeeee#d#eeeeef
385 eeee#ddd#eeeee
386 eee#ddddd#eeee
387 ee#ddddddd#eee
388 e#ddddddddd#ee
389 #dddddddddddee
390 ...............
391 Bonus:
392 ........m......
393 .............s.
394 ..m......1....1
395 ...........0...
396 ............1..
397 .........0.j...
398 ......4...1.0..
399 ...............
400 .......0.......
401 ....4.j..0.....
402 ...1...........
403 .......s...0..g
404 ..4............
405 1.....?.....1.
406 ......+.+......
407 m...-.-.-.....
408 ...............
409 ...............
410 Level:
411 Martin Moeller
412 11th Day of X-Mas
413 Bricks:
414 hhg...........
415 hgh...........
416 hhg..vvvvvvv..
417 hgh..vdddddd..
418 hhg..vjjjjjj..
419 ......viiiiii..
420 ......veeeeee..
421 ..#vvvvffffff..
422 ..#vddddddddd..
423 ..#vjjjjjjjjj..
424 ..#viiiiiiiii..
425 ..#veeeeeeeee..
426 ..#vfffffffff..
427 ############..
428 ...............
429 ...............
430 ...............
431 ...............
432 Bonus:
433 ...w...........
434 ..m............
435 ...b..g-c.f-+..
436 ..s.....1......
437 ...+..+........
438 ......>.?.0?...
439 ......-1.......
440 ...+.~+..?..1..
441 ...>....0......
442 ...-.l.?.1?0...
443 ...............
444 ...c.?.1.0.?...
445 ...-........j..
446 ...............
447 ...............
448 ...............
449 ...............
450 ...............
451 Level:
452 Martin Moeller
453 12th Day of X-Mas
454 Bricks:
455 ghg#dddddddddd
456 hgh#dddddddddd
457 hgg#########ee
458 hgh#kkkkkkf#ee
459 ghg#kkkkkkf#ee
460 ########j####e
461 eed#ggh#jjf#ee
462 eed#ggh#jjf#ee
463 eed#ggh#jjffee
464 eed#gg##jjffee
465 e###g#h#####ee
466 eeddgghhj#ffee
467 eeddgghhj#ffee
468 eeddgg####f##e
469 ...............
470 ...............
471 ...............
472 ...............
473 Bonus:
474 5.j...?>0.c..?
475 ..s...0..m..0..
476 ..+b..........1
477 ..p..5.0d.?...>
478 b.g.m..c0...c.
479 ...............
480 ...1.?.m...?.d.
481 cd....1.1.>.1.
482 ..?...c...?...?
483 1.5.......1...
484 .....1.>.....>.
485 .....0..?..?..1
486 ...1.....0.....
487 ...............
488 ...............
489 ...............
490 ...............
491 ...............
492 Level:
493 Martin Moeller
494 Happy New Year
495 Bricks:
496 hhhhhhhhhhhhhh
497 hh*hhh*hhh*hhh
498 *hhhhhhhhhhh*#
499 !*hh*hhh*hh*!*
500 *#*hhhhhhh*#*v
501 v*!*hh*hh*!*vj
502 dv*#*hhh*#*vjj
503 ddv*!*h*!*vjjj
504 dddv*#*#*vjj*j
505 d*ddv*!*vjjjjj
506 dddddv*vjj*jjj
507 ddd*ddvjjjjjjj
508 *dddddvjjjjjj*
509 vvvvvvvvvvvvvv
510 ...............
511 ...............
512 ...............
513 ...............
514 Bonus:
515 33333333333333
516 22222222222222
517 1111111111111.
518 00000000000000
519 4.444444444.44
520 33333333333333
521 222.22222.2222
522 11111111111111
523 00000.0.000000
524 55555555555555
525 33333333333333
526 22222222222222
527 11111111111111
528 00000000000000
529 ...............
530 ...............
531 ...............
532 ...............
533 Level:
534 Martin Moeller
535 Easter
536 Bricks:
537 ...............
538 ..hhhkkhhkkhhh.
539 ..h####..####h.
540 ..h#ffffffff#h.
541 ..k#ffdhhdff#k.
542 ..k#fdjhhjdf#k.
543 ..h.fjjjjjjfvh.
544 ..h.ijjjjjjivh.
545 ..h.ijjjjjjivh.
546 ..h.ijjjjjjivh.
547 ..h.ijjjjjjivh.
548 ..h.fijjjjifvh.
549 ..k#ffjjjjff#k.
550 ..k#fffjjfff#k.
551 ..h#ffffffff#h.
552 ..h####vv####h.
553 ..hhhkkhhkkhhh.
554 ...............
555 Bonus:
556 ...............
557 ...............
558 ...............
559 ....f>.dd.>f...
560 ....>......>...
561 ......?..?.....
562 .....p?<ljw....
563 .....3+g5m?....
564 ....cm54b?+c...
565 ....c?sj35pc...
566 .....lb3+b4....
567 ......w?4s.....
568 ......+b<?.....
569 ....>..<j..>...
570 ....f>.--.>f...
571 ...............
572 ...............
573 ...............
574 Level:
575 Martin Moeller
576 Grand Finale
577 Bricks:
578 jjjjjjjjjjjjjj
579 jjjjjjjjjjjjjj
580 j###jj#h#j###j
581 j#gg#j#h#j#ddj
582 j#gg#j#h#j#ddj
583 j#g#jj#h#j##dj
584 j#g#jjj#jj##dj
585 j#gg#jj#jj#ddj
586 j#gg#jj#jj#ddj
587 j###jjj#jj###j
588 jjjjjjjjjjjjjj
589 jjjjjjjjjjjjjj
590 jjjjjjjjjjjjjj
591 ##vv##..##vv##
592 ...............
593 ...............
594 ...............
595 ...............
596 Bonus:
597 ..?.....?.....?
598 m...?...-.?.3.
599 ..........+....
600 ?..3..........
601 ......+.....b..
602 ...3.3..l......
603 ...3.........3c
604 .......3..<.b..
605 3..3....+.....
606 .....-j........
607 ...?....?...?..
608 .....c...-p...g
609 ...........c...
610 ...............
611 ...............
612 ...............
613 ...............
614 ...............
0 Level:
1 anchois
2 shoot
3 Bricks:
4 hh............
5 hh............
6 .....ggg......
7 ...gggggg.g...
8 ..gggjjjgggg..
9 .ggjjkkkjjjggg
10 ggjkkjjjkkkjjg
11 gjkjjjajaajkkj
12 gjkjajjjjjajkj
13 jkajjjajjjjakj
14 gjkkkjjjkjkkjg
15 ggjjjkkkjkjjgg
16 gggggjjjgkgggg
17 .gggggggggggg.
18 .....gggggg...
19 ..............
20 ..............
21 ..............
22 Bonus:
23 55............
24 55............
25 ..............
26 ..............
27 ..............
28 ......?.......
29 ....?..g.?....
30 ......5.55.?..
31 ....5.....5.?.
32 .?5b..5b...5b.
33 ..w?..wm...?w.
34 ...s.?.?.?....
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 anchois
43 Loook out !!!
44 Bricks:
45 ..............
46 .....f.f......
47 .....fff......
48 .....feff.....
49 ....f.e....dd.
50 ......e...deed
51 gggghhehhhgggg
52 ggghhhehhhggag
53 ggghhhhhhggaag
54 ggggghhhgggggg
55 gggggggggggggg
56 #!!!#!!!!#!!!#
57 .***.****.***.
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 .....lwmb.....
68 ....b.w.......
69 ......w....55.
70 .?..44w444....
71 .?.444w444..?.
72 ...>4444>..??.
73 .....444......
74 .+b-.-s.-..b+.
75 5...5....5...5
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 anchois
84 I see dead people ...
85 Bricks:
86 ...kkk......aa
87 a.kkjjk...a.aa
88 aakjjjkk.aacc.
89 ..kvjvjkaaaac.
90 ..kjjjjk.aacc.
91 ..kjjjjk......
92 ..kjjjjk......
93 ..kjjjjjk.....
94 ..kj..jjk.....
95 ..k.dd.jk.....
96 ..kjddjjk...bb
97 ..kjjjjka..abb
98 .kkkkkkk.ab.bb
99 vvvvvvvvvvvvvv
100 ..............
101 ..............
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..............
107 ...........bb.
108 ...d.d......m.
109 ...........bb.
110 ..............
111 ..............
112 ...00000......
113 ...0..00......
114 ..0.bb.0......
115 ..~~bb~~~...33
116 ..0d~0~0~...55
117 .~~~0~~~..~.33
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 anchois
125 Wind catcher
126 Bricks:
127 aaaaaaaaaaaaaa
128 a.aaaa.aaaaaaa
129 ..aaa...aaa.aa
130 ..aaa...aaa.aa
131 ...aa...aa...a
132 ...aa...aa....
133 ...a....a.....
134 ........!.....
135 ...!..........
136 ..............
137 ........!.....
138 ...ggggggg....
139 .ggvvvvvvvgg..
140 gvvvvvvv!vvvg.
141 gvv!vvvvvvvvvg
142 .gvvvvvvvvvvg.
143 ..ggvvvvvvvg..
144 ....ggggggg...
145 Bonus:
146 ......m.......
147 b....b.....b..
148 ....>.....>...
149 ..............
150 ..............
151 ..............
152 ..............
153 ........2.....
154 ...2..........
155 ..............
156 ........2.....
157 ..............
158 ..............
159 ........2.....
160 ...2..........
161 ..............
162 ..............
163 ..............
164 Level:
165 anchois
166 Rick Dangerous
167 Bricks:
168 aaaaaaaaaa####
169 ..aa.aa.a.#...
170 ...a..a...#.hh
171 f.........#*hh
172 ff........aaaa
173 f*........a.aa
174 ffffffffe....a
175 effffffff.....
176 ........e.....
177 e............f
178 ........e...ff
179 e..........fff
180 ..ffffffefffff
181 e.ffffffffffff
182 ..............
183 e.............
184 ffffffffffffff
185 efffffffffffff
186 Bonus:
187 ..............
188 ..............
189 ...f..f.....11
190 ...........g11
191 ..............
192 ..............
193 ..b...........
194 ..............
195 ..............
196 ..............
197 ..............
198 ............b.
199 ..c...b.......
200 ..............
201 ..............
202 ..............
203 ......-....-..
204 w...+...-.....
205 Level:
206 anchois
207 Test Drive
208 Bricks:
209 ...f...a..e...
210 ..fef.aha.e...
211 ...e..aka.....
212 ...e.aahaa..f.
213 .....akkka.f.f
214 f.f..akhka..e.
215 .f..aakhkaa.e.
216 fef.akkkkka.e.
217 .e..akkhkka...
218 .e.aakkhkkaa..
219 .e.akkkkkkka..
220 ...akkkhkkka..
221 ..aakkkhkkkaa.
222 ..akkkkkkkkka.
223 ..akkkkhkkkka.
224 ..akkkkhkkkka.
225 .akkkkkkkkkkka
226 aakkkkkhkkkkka
227 Bonus:
228 ..............
229 ..+.+..l......
230 ..............
231 .......2......
232 .......?...+.+
233 .......2......
234 .......2......
235 +.+...>?g.....
236 ......>2>.....
237 .w.....2......
238 ..............
239 .......2......
240 .......2......
241 ..............
242 ....b..2..b...
243 ......-2.-....
244 .......c......
245 .....??2??....
246 Level:
247 anchois
248 Invaders
249 Bricks:
250 .....!!!!.....
251 ......**......
252 ..............
253 d.d.d.d.d.d.d.
254 .g.g.g.g.g.g.g
255 f.f.f.f.f.f.f.
256 .h.h.h.h.h.h.h
257 d.d.d.d.d.d.d.
258 .g.g.g.g.g.g.g
259 f.f.f.f.f.f.f.
260 iiiiiiiiiiiiii
261 ..............
262 ..............
263 ..............
264 a...a..a..a..a
265 caaacaacaacaac
266 ..............
267 ..............
268 Bonus:
269 .....5555.....
270 ..............
271 ..............
272 p.p.p.p.p.p.p.
273 ..............
274 ..3.........3.
275 .....3.m.3....
276 ....g.....g...
277 .3...........3
278 ?.?.?.?.?.?.?.
279 b..b..b..b..b.
280 ..............
281 ..............
282 ..............
283 ..............
284 .1++w++5++w++1
285 ..............
286 ..............
287 Level:
288 anchois
289 Welcome into the Matrix
290 Bricks:
291 ..hh.hhhh.hh..
292 ##gg#gggg#gg##
293 .g!*.*!!*.*!g.
294 ..!*.*!!*.*!..
295 .g!*.*!!*.*!g.
296 ..!*.*!!*.*!..
297 .g!*.*!!*.*!g.
298 ..!*.*!!*.*!..
299 .g!*.*!!*.*!g.
300 ..!*.*!!*.*!..
301 .g!*.*!!*.*!g.
302 ..!*.*!!*.*!..
303 c...*.**.*...c
304 c.....cc.....c
305 .cc........cc.
306 ..............
307 ..............
308 ..............
309 Bonus:
310 ..11.1111.11..
311 ..............
312 ......lm......
313 ......j.......
314 ..............
315 ..............
316 .b..........b.
317 ..............
318 ..............
319 ..............
320 .......g......
321 ..............
322 ..............
323 ......??......
324 .>f........>f.
325 ..............
326 ..............
327 ..............
328 Level:
329 anchois
330 Sonic
331 Bricks:
332 .cbbbbcc......
333 cb.h.hbc......
334 cb....bbc.....
335 b......bc.....
336 b.....hbc.....
337 bh.....bc..ggg
338 b.....bc..gg..
339 cb....bc..gggg
340 cb..hbc...ggg.
341 .bh.ach.h..gj.
342 hcbbac......d.
343 aaabbbbbbbbbbb
344 ..............
345 ##..........##
346 ffffffffffffff
347 ..............
348 ..............
349 ..............
350 Bonus:
351 ....m.........
352 .b.2.2b.......
353 ..............
354 b......b......
355 ......2.......
356 .2.....b...>>>
357 b.........l>..
358 .b........>>>>
359 ....2bb...>>>.
360 .b2..b2.2..>b.
361 2bb.b.........
362 ..>-b-b-->----
363 ..............
364 ..............
365 00000000000000
366 ..............
367 ..............
368 ..............
369 Level:
370 anchois
371 drop dead
372 Bricks:
373 .........h.hhh
374 ..........h.hh
375 .aa........h.h
376 ..a.......h..h
377 ..a!........h.
378 .a............
379 eaee.........h
380 eee...........
381 eee...........
382 eee...........
383 ee............
384 ee............
385 ee............
386 e.a..g...a.g..
387 e.aag..gaa.gg.
388 eggggggggggggg
389 eggggggggggggg
390 ....ggg.gggg..
391 Bonus:
392 .........5.5.5
393 ..........m.5.
394 ...........5..
395 ..........w..5
396 ...g........5.
397 ..............
398 ...l.........5
399 ..............
400 ..b...........
401 ?b............
402 .?............
403 ..............
404 .c............
405 ..............
406 .......>...>..
407 .+.f?..?..?+?.
408 ..?..?>.?....>
409 ..........f...
410 Level:
411 anchois
412 I know what you did...
413 Bricks:
414 dddd.......ddd
415 ddd..ccc...ddd
416 dd..caaac...dd
417 dd.ca..ac...dd
418 dd.ca...ac...d
419 d.ca....aceeee
420 d.ca....acceee
421 d.cd....aaaeee
422 d..dd...ccceee
423 ...dd.....eeee
424 d...dd.......d
425 d....dd......d
426 .d............
427 ......d......d
428 d.............
429 ..............
430 .d...........d
431 ......d.......
432 Bonus:
433 11............
434 1.....m.....1.
435 1....5w5......
436 .1..b..b....1.
437 .1...........1
438 1.........1...
439 ...>.......1.1
440 1...........1.
441 ....c.......-.
442 ...........-g-
443 1...+c........
444 1.....>......1
445 ..............
446 ......1......1
447 ..............
448 ..............
449 ..............
450 ..............
451 Level:
452 anchois
453 xenon II
454 Bricks:
455 e**edehhede**e
456 e..ede!!ede.be
457 eb.edehhede..e
458 e..#ddeedd#b.e
459 e..#.dddd.#..e
460 e.b#.dddd.#.be
461 e..#.d..d.#..e
462 e..#..d.d.#b.e
463 eb.#e..d..#..e
464 e...e.....e.be
465 e...e.....e..e
466 ee..e....ee..e
467 .e..e....e..ee
468 .e...e..ee..e.
469 .ee..e..e...e.
470 ...e.......e..
471 ..............
472 ..............
473 Bonus:
474 .....f44f.....
475 .....f55f...>.
476 .>...f44f.....
477 ......ff...>..
478 ..............
479 ..c...bb....c.
480 .....-..-.....
481 ......-.-..>..
482 .>..b..-......
483 ..........b.>.
484 ..............
485 b........g....
486 .+..+....+..+.
487 .....w........
488 ..............
489 ..............
490 ..............
491 ..............
492 Level:
493 anchois
494 slow or fast ?
495 Bricks:
496 hhhhhcgggchhhh
497 h...cc...cc..h
498 hv..cgg.ggc.vh
499 h..cc.....cc.h
500 h..cgg...ggc.h
501 h.cc.......cch
502 h.cgg.!!!.ggch
503 hcc...***...cc
504 hcgg.......ggc
505 ccdddddddddddc
506 cgg.........gc
507 ceeeeeeeeeeeee
508 ggvvvvvvvvvvgg
509 ..............
510 gggggggggggggg
511 hhhhhhhhhhhhhh
512 ..............
513 ffffffffffffff
514 Bonus:
515 00000..w..0000
516 ....1.....1...
517 .m..1.....1.m.
518 ....1.....1...
519 ....<<...<<...
520 ..............
521 <...b.>>>.b.<<
522 ......>>>.....
523 ...........<<.
524 ....w....w....
525 .<<.........<<
526 ..-+-+-.+-+-..
527 <<??2222222?..
528 ..............
529 >><>>>>><>>><>
530 11111111111111
531 ..............
532 ><><><><><><><
533 Level:
534 anchois
535 aziz light !!
536 Bricks:
537 ..............
538 ..h.h.h..h....
539 ...h.h.hh.h...
540 ..h.hhhh.h....
541 .#.h#hhhh....j
542 .jjhhh#hh.j#jf
543 .fffhhhhhfffff
544 ffff#hhhffffff
545 ffffffffffffff
546 cccccccccccccc
547 ..........#...
548 #.#...........
549 gggggggggggggg
550 gggg*****gggg#
551 gggggggggggggg
552 ..............
553 ..............
554 ..............
555 Bonus:
556 ..............
557 ..............
558 ..............
559 ..............
560 .5..5mm......1
561 .11.ww5ww.151?
562 .???.....?????
563 ????5...??????
564 ??w?fbfb5??w??
565 dddg?dcd?gdddd
566 ..........5...
567 5.5...........
568 dddddddddddddd
569 ...ddddddj...5
570 000+5w55w+0000
571 ..............
572 ..............
573 ..............
574 Level:
575 anchois
576 You wanna play god ?
577 Bricks:
578 ..............
579 ##############
580 #............#
581 #............#
582 #c.########..#
583 #..#c..hhh#..#
584 #..#...hhh#..#
585 #.c#...hhh#..#
586 #..#.c#hhh#..#
587 #..#..#hhh#..#
588 #c.#..#####..#
589 #..#c.........
590 #.c#..........
591 #..###########
592 #c.....fffffff
593 #......fffffff
594 #######.......
595 ..............
596 Bonus:
597 ..............
598 ..............
599 ..............
600 ..............
601 ..............
602 .......111....
603 .......111....
604 .......m11....
605 .......111....
606 .......11m....
607 ......00000...
608 ..............
609 ..............
610 .......0000000
611 .........b...b
612 ........+..+..
613 ..............
614 ..............
615 Level:
616 anchois
617 freeze !!
618 Bricks:
619 ...hh.........
620 ...hh...j.....
621 .......jj.....
622 .......jjj....
623 ......jjjj....
624 ..j...jjjjj...
625 .jjj..jjjjjj.j
626 jjjj.gjjjjjgjj
627 ggjjggggjggggj
628 gggggggggggggg
629 gggggggggggggg
630 ..............
631 .g#g..gg#g..g#
632 ..............
633 #gggg#ggggg#gg
634 gggggggggggggg
635 ..............
636 ..............
637 Bonus:
638 ...55.........
639 ...55...l.....
640 ..............
641 ..............
642 ..............
643 ..............
644 .2....22222..2
645 ff22.2fffff2f2
646 44ff2.44f44.4f
647 ........2.....
648 ..............
649 ..............
650 .w.b..+f.f..b.
651 ..............
652 ..f.f.f.f.f.f.
653 .f.f.f.f.f.f.f
654 ..............
655 ..............
656 Level:
657 anchois
658 Insane
659 Bricks:
660 ......dd......
661 .....deed.....
662 ...a.deed.a...
663 ..a..deed..a..
664 ..a..deed..a..
665 .a...deed...a.
666 .a...deed...a.
667 a....deed....a
668 .a...deed...a.
669 .a....dd....a.
670 ..a...dd...a..
671 ..a........a..
672 ...a..dd..a...
673 ......dd......
674 ..............
675 ..............
676 vvvvvvvvvvvvvv
677 kkkkkkkkkkkkkk
678 Bonus:
679 ......md......
680 .....>ll>.....
681 ...+.>33>.+...
682 ..?..>33>..d..
683 ..d..>33>..?..
684 .-...>33>...-.
685 .-...>33>...-.
686 -....>33>....-
687 .-...b33b...-.
688 .-....--....-.
689 ..-...--...-..
690 ..~........~..
691 ...~..~~..~...
692 ......~~......
693 ..............
694 ..............
695 b--b---b---b-b
696 >>>>>>>>>>>>>>
697 Level:
698 anchois
699 Insane II
700 Bricks:
701 ..............
702 ..............
703 ...dd....dd...
704 ..deed..deed..
705 ..deed..deed..
706 ..deed..deed..
707 ..deed..deed..
708 ..deed..deed..
709 ..deed..deed..
710 ...dd....dd...
711 ..............
712 ...dd....dd...
713 ...dd....dd...
714 ..............
715 ..............
716 ..............
717 vvvvvvvvvvvvvv
718 kkkkkkkkkkkkkk
719 Bonus:
720 ..............
721 ..............
722 ...>>....>>...
723 ..dddd..dddd..
724 ..dbbd..dbbd..
725 ..d??d..d~~d..
726 ..d??d..d~~d..
727 ..d??d..d~~d..
728 ..d??d..d~~d..
729 ...>>....>>...
730 ..............
731 ...m>....m>...
732 ...>>....>>...
733 ..............
734 ..............
735 ..............
736 dbd>>dbd>ddbdd
737 >>>>d>>>d>>d>>
738 Level:
739 anchois
740 Insane III
741 Bricks:
742 e..e..d.......
743 ee.e.d!d......
744 e.ee.d!d......
745 e..e.dd.......
746 e...........ee
747 ......e..ddde.
748 .d.d.e!e.d.dee
749 .ddd.e!e.dd.e.
750 .d.d.ee..d..ee
751 .d............
752 ..............
753 ..............
754 gggg.ggggg.ggg
755 g..g.g...g.g..
756 cccccccccccccc
757 vvvvvvvvvvvvvv
758 kkkkkkkkkkkkkk
759 kvvkkvvkvkvvkv
760 Bonus:
761 >..~..~.......
762 >~.~.~l~......
763 ~.>>.~l~......
764 ~..~.~~.......
765 ~...........33
766 ......3..~>>3.
767 .~.>.3l3.-.-33
768 .>>-.3l3.>-.3.
769 .~.-.33..>..33
770 .~............
771 ..............
772 ..............
773 0000.00000.000
774 0..0.0...0.0..
775 >>>>>>>>>>>>>>
776 55cccccccccccc
777 ffff-ff-f-ffff
778 >>>c55c>>>>c>>
779 Level:
780 anchois
781 Final cut
782 Bricks:
783 .aaaaaaaaaaaa.
784 .aaaaaaaaaaaa.
785 .aacccaaaaaaa.
786 .aacacaaaacca.
787 .aacccaaaacaa.
788 .aacacacaccca.
789 .aacccaacacaa.
790 .aaaaaaacacca.
791 .aaaaaaacaaaa.
792 .############.
793 .#jaajaajaaja.
794 .#ajaajaajaaj.
795 .#jaajaajaaja.
796 ..............
797 ..............
798 ..............
799 ..............
800 ..............
801 Bonus:
802 ..............
803 ..............
804 .m.555........
805 ...5.5....55..
806 ...555....5...
807 ...5.5.5.555..
808 .m.555..5.5...
809 ........5.55..
810 ........5.....
811 ..............
812 ..-dd-dd-dd-d.
813 ..d-dd-dd-dd-.
814 ..b-db-db-dbd.
815 ..............
816 ..............
817 ..............
818 ..............
819 ..............
0 Version: 1.00
1 Level:
2 Mike Quinn
3 Re-Greening
4 Bricks:
5 ..............
6 gggggggggggggg
7 gggggggggggggg
8 gggggggggggggg
9 gggggggggggggg
10 yEEEyyyyyyEEEy
11 yE*EyyyyyyE*Ey
12 yyyyyyyyyyyyyy
13 aaaaaaaaaaaaaa
14 aaaaaaaaaaaaaa
15 aaaaaaaaaaaaaa
16 bcccacccbcccac
17 bbbbbbbbbbbbbb
18 bbbbbbbbbbbbbb
19 bbbbbbbbbbbbbb
20 zzzzzzzzzzzzzz
21 zz*zzzzzzzz*zz
22 zzzzzzzzzzzzzz
23 Bonus:
24 ..............
25 g.0.-+........
26 .b.+..c?-b-s.0
27 ..--+b......s.
28 -.w..jp.--s...
29 .222...+..222.
30 .232..b.?.232.
31 .W..+........0
32 ....b..b....0.
33 ..+..+0+.b.s.!
34 &.............
35 ..W0.?m.0.?...
36 ?.......c..?.s
37 .0b.l..b+..b..
38 .....f...+s.0.
39 .>-2{.<?......
40 .s.-....sj..0.
41 0..>.w.+..0...
42 Level:
43 Mike Quinn
44 Trap
45 Bricks:
46 ..............
47 .#####..#####.
48 .kkkkkvvkkkkk.
49 .#####..#####.
50 .jjjjz..zjjjj.
51 .#####..#####.
52 .iiiiivviiiii.
53 .#####..#####.
54 .eeeec..ceeee.
55 .@@@@@..@@@@@.
56 .dddddvvddddd.
57 .#####..#####.
58 .hhhhz..zhhhh.
59 .EEEEE..EEEEE.
60 .gggggvvggggg.
61 .#####..#####.
62 .ffffz..zffff.
63 .#####..#####.
64 Bonus:
65 ..............
66 ..............
67 ...5..11..5...
68 ..............
69 ...4.+..w.4...
70 ..............
71 ...3..>-..3...
72 ..............
73 ...2.b..W.2...
74 ..............
75 ...2..<m..2...
76 ..............
77 ...1.?..+.1...
78 ..............
79 ...1..wb..1...
80 ..............
81 ...0.+..?.0...
82 ..............
83 Level:
84 Mike Quinn
85 Maze
86 Bricks:
87 eeeeeeeeeeeeee
88 cEEEEEEEEEEEEE
89 aaaaaaaaaaaaaE
90 ############cE
91 kkkkkkkkkkkkkE
92 cEEEEEEEEEEEEE
93 jjjjjjjjjjjjjE
94 ############cE
95 dddddddddddddE
96 cEEEEEEEEEEEEE
97 fffffffffffffE
98 ############cE
99 gggggggggggggE
100 cEEEEEEEEEEEEE
101 iiiiiiiiiiiiiE
102 ############bE
103 hhhhhhhhhhhhhE
104 ....v....v....
105 Bonus:
106 2.2+2p2b2&2l2?
107 ..............
108 ...d....?.b...
109 ......f.......
110 d.{.w.bs....w.
111 ~.............
112 ~w.?b.........
113 ......~f....m.
114 ?.fsb...?b?...
115 m.............
116 ..f?w.w..?.b..
117 ......d.......
118 cb.bwb.b......
119 ..............
120 .+b..b-w?b.b..
121 ...~~.......b.
122 w.?b<}0.b0b.b.
123 .........m....
124 Level:
125 Mike Quinn
126 Aliens!
127 Bricks:
128 .c.b.cbbc..cbb
129 c.cb.cb.cc.cb.
130 cccb.cbbccccbb
131 c.cb.cb.c.cc.b
132 c.cbbcbbc..cbb
133 .@.@..#..@.@..
134 @z.z@.#.@z.z@.
135 @z@z@.#.@z@z@.
136 @z.z@.#.@z.z@.
137 @z.z@.#.@z.z@.
138 .@z@..#..@z@..
139 .@z@..#..@z@..
140 z@@@z.#..@@@..
141 .zzz..#..zzz..
142 ......#.z...z.
143 ......#.......
144 ......#.......
145 ......#.......
146 Bonus:
147 .>......c...>.
148 ..+...>....-..
149 d..>.+..>.s.~.
150 ......w.......
151 -.~.w<.c...f.>
152 ..............
153 ..............
154 .2.2.....2.2..
155 ..............
156 .g.?.....+.?..
157 ..w.......l...
158 ..4.......4...
159 1...?.........
160 ..p......<.s..
161 ........w.....
162 ..............
163 ..............
164 ..............
165 Level:
166 Mike Quinn
167 Tight Squeeze
168 Bricks:
169 ..............
170 .@.@.@.@.@.@.@
171 .@c@.@c@.@c@.c
172 .@@@.@@@.@@@.@
173 ..............
174 .@.@.@.@.@.@.@
175 .@c@.@c@.@c@.c
176 .@@@.@@@.@@@.@
177 ..............
178 .@@@.@@@.@@@.@
179 .@c...c@.@c@.b
180 .@@@.@@@.@.@.@
181 ..............
182 .@@@.@@@.@.@.@
183 ..c@.@c..@c@.z
184 .@@@.@@@.@@@.@
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ......s......2
191 ..............
192 ..............
193 ..............
194 ..........w...
195 ..............
196 ..............
197 ..............
198 ..l...........
199 ......-.......
200 ..............
201 ..............
202 ..g.......+..3
203 ..............
204 ..............
205 ..............
206 Level:
207 Mike Quinn
208 Checker
209 Bricks:
210 .c.c.c.c.c.c.c
211 .E.E.E.E.E.E.E
212 c.c.c.c.c.c.c.
213 E.E.E.E.E.E.E.
214 .c.c.c.c.c.c.c
215 .E.E.E.E.E.E.E
216 c.c.c.c.c.c.c.
217 E.E.E.E.E.E.E.
218 .z.c.z.c.z.c.z
219 .E.E.E.E.E.E.E
220 z.z.z.z.z.z.z.
221 E.E.E.E.E.E.E.
222 .z.z.z.z.z.z.z
223 .E.E.E.E.E.E.E
224 z.z.z.z.z.z.z.
225 E.E.E.E.E.E.E.
226 .z.z.z.z.z.z.z
227 .E.E.E.E.E.E.E
228 Bonus:
229 ...p.b.....+.s
230 ..............
231 &.....-.b.....
232 ..............
233 .?.b.f...d.>.+
234 ..............
235 ..w...j.......
236 ..............
237 .3...2...3.-.2
238 ..............
239 ..+...p...+.b.
240 ..............
241 .*...W...<...l
242 ..............
243 ..>...+.b.s...
244 ..............
245 .+.b.-...?...w
246 ..............
247 Level:
248 Mike Quinn
249 Crevices
250 Bricks:
251 ..............
252 @zEzEzEzEzEzEz
253 @zEzEzEzEzEzEz
254 @zEzEzEzEzEzEz
255 @zEzEzEzEzEzEz
256 @zEzEzEzEzEzEz
257 @zEzEzEzEzEzEz
258 @zEzEzEzEzEzEz
259 @zEzEzEzEzEzEz
260 @zEzEzEzEzEzEz
261 @zEzEzEzEzEzEz
262 @zEzEzEzEzEzEz
263 @zEzEzEzEzEzEz
264 @zEzEzEzEzEzEz
265 @zEzEzEzEzEzEz
266 @zEzEzEzEzEzEz
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 .3.<.l.g.l.b.3
273 ..............
274 .<.d.W.c.>.w.l
275 ..............
276 .?.>.*.2.<.b.1
277 ..............
278 .0.-.j.>.b.s.?
279 ..............
280 .p.+.+.b.c.d.+
281 ..............
282 .s.~.&.w.?.&.-
283 ..............
284 .{.w.f.s.}.<.?
285 ..............
286 ..............
287 ..............
288 Level:
289 Mike Quinn
290 Pit
291 Bricks:
292 v.v.v.v.v.v.v.
293 ..............
294 .v.v.v.v.v.v.v
295 ..@@@@..@@@@..
296 v.@zzzzzzzz@v.
297 ..@zzzzzzzz@..
298 .v@zzzzzzzz@.v
299 ..@zzzzzzzz@..
300 v.@zzzzzzzz@v.
301 ..@zzzzzzzz@..
302 .v@zzzzzzzz@.v
303 ..@zzzzzzzz@..
304 v.@zzzzzzzz@v.
305 ..@zzzzzzzz@..
306 .v@zzzzzzzz@.v
307 ..@zzzzzzzz@..
308 v.@zzzzzzzz@v.
309 ..@@@@@@@@@@..
310 Bonus:
311 d.....b.....+.
312 ..............
313 ...2.....c....
314 ..............
315 p...b.<.&.s.~.
316 ..............
317 ....f.?.j.1...
318 ..............
319 ?...d.>.+.l.?.
320 ..............
321 ....f.3.?.b..w
322 ..............
323 >...s.+.-.{.+.
324 ..............
325 ....&.W.g.c...
326 ..............
327 w...l.b.?.w.-.
328 ..............
329 Level:
330 Mike Quinn
331 GreenAgain
332 Bricks:
333 ..@@@@@@@@@@..
334 .@@zzzzzzzz@@.
335 .@zzzzzzzzzz@.
336 .@zzzzzzzzzz@.
337 .@zzzzzzzzzz@.
338 @@zzzzzzzzzz@@
339 @zzz@@@@@@zzz@
340 @zzzzzzzzzzzz@
341 @zzzzzzzzzzzz@
342 @zzzzzzzzzzzz@
343 @@@@@@zz@@@@@@
344 @zzzzzzzzzzzz@
345 @zzzzzzzzzzzz@
346 @zzzzzzzzzzzz@
347 @zzz@@@@@@zzz@
348 @zzzzzzzzzzzz@
349 @zzzzzzzzzzzz@
350 @zzzzzzzzzzzz@
351 Bonus:
352 ..............
353 ......2.......
354 ....fl..-<.2..
355 ...w.>.b......
356 ...?-.W.+.s...
357 .........>....
358 ...+.......0..
359 ..<..+.w.f.<..
360 .0.>....W.s.+.
361 ....<.<.......
362 ..............
363 ......f>....>.
364 ...b-s.<.b..s.
365 .-<W..?.wd+0..
366 ..>.......>b..
367 ....b..-....f.
368 .0-..f+.sw.>..
369 ...s..<.......
370 Level:
371 Mike Quinn
372 BeatThis
373 Bricks:
374 .zccccccccccz.
375 .@@@@@@@@@@@@.
376 .zzcczzzzcczz.
377 .@@@@@zz@@@@@.
378 .zzzcc@@cczzz.
379 .@@@@zzzz@@@@.
380 .zzzz@zz@zzzz.
381 .@@@cc@@cc@@@.
382 .zzz@zzzz@zzz.
383 .@@zz@zz@zz@@.
384 .zz@cc@@cc@zz.
385 .@zz@zzzz@zz@.
386 ..@zz@zz@zz@..
387 ...@cc@@cc@...
388 ....@zzzz@....
389 .....@@@@.....
390 ..............
391 ..............
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 ..............
402 ..............
403 ..............
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
410 ..............
0 Version: 1.00
1 Level:
2 Ukog-Nos Takeuchi
3 Tengu
4 Bricks:
5 !!!!!!!!!!!!!!
6 !!!!!!!!!!!!!!
7 !!!!!!!!!!!!!!
8 !!!!!!!!!!!!!!
9 !!!!!!!!!!!!!!
10 !!!!!!!!!!!!!!
11 !!!!!!!!!!!!!!
12 !!!!!!!!!!!!!!
13 !!!!!!!!!!!!!!
14 !!!!!!!!!!!!!!
15 !!!!!!!!!!!!!!
16 !!!!!!!!!!!!!!
17 !!!!!!!!!!!!!!
18 !!!!!!!!!!!!!!
19 !!!!!!!!!!!!!!
20 !!!!!!!!!!!!!!
21 !!!!!!!!!!!!!!
22 !!!!!!!!!!!!!!
23 Bonus:
24 wwwwwwwwwwwwww
25 wwwwwjwwpwwwww
26 wwwwjwjpwpwwww
27 wwwjwwpjwwpwww
28 wwjwwpwwjwwpww
29 wjwwpwwwwjwwpw
30 wwjpwwwwwwjpww
31 wwpjwwwwwwpjww
32 wpwwjwwwwpwwjw
33 wwpwwjwwpwwjww
34 wwwpwwjpwwjwww
35 wwwwpwpjwjwwww
36 wwwwwpwwjwwwww
37 wwwwwwwwwwwwww
38 wwwwwwwwwwwwww
39 wwwwwwwwwwwwww
40 wwwwwwwwwwwwww
41 wwwwwwwwwwwwww
42 Level:
43 Ukog-Nos Takeuchi
44 Der Gouki
45 Bricks:
46 ..............
47 .zzzzzzzzzzzz.
48 .z!!v!!!v!!!z.
49 .z*!v!*!v!*!z.
50 .z!!!!!!!!!!z.
51 .zv!*!v!*!vvz.
52 .z!!!!!!!!!!z.
53 .z*!v!*!v!*!z.
54 .z!!!!!!!!!!z.
55 .zv!*!v!*!vvz.
56 .z!!!!!!!!!!z.
57 .z*!v!*!v!*!z.
58 .z!!!!!!!!!!z.
59 .zv!*!v!*!vvz.
60 .z!!!!!!!!!!z.
61 .z*!v!*!v!*!z.
62 .zzzzzzzzzzzz.
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ....*...*.....
68 ....*...*.....
69 ..............
70 ..*...*...**..
71 ..............
72 ....*...*.....
73 ..............
74 ..*...*...**..
75 ..............
76 ....*...*.....
77 ..............
78 ..*...*...**..
79 ..............
80 ....*...*.....
81 ..............
82 ..............
83 Level:
84 Ukog-Nos Takeuchi
85 BMX XXX
86 Bricks:
87 @@@@@@@@@@@@@@
88 @*gggggggggg*@
89 @g@@@@@@@@@@g@
90 @g@*cccccc*@g@
91 @g@c@@@@@@c@g@
92 @g@c@*zz*@c@g@
93 @g@c@z@@z@c@g@
94 @g@c@z@@z@c@g@
95 @g@c@z@@z@c@g@
96 @g@c@z@@z@c@g@
97 @g@c@z@@z@c@g@
98 @g@c@z*@z@c@g@
99 @g@c@@zz*@c@g@
100 @g@c*@@@@@c@g@
101 @g@@cccccc*@g@
102 @g*@@@@@@@@@g@
103 @@gggggggggg*@
104 *@@@@@@@@@@@@@
105 Bonus:
106 jmmmmmmmmmmmmj
107 mmmmmmmmmmmmmm
108 mmjmmmmmmmmjmm
109 mmmmmmmmmmmmmm
110 mmmmjmmmmjmmmm
111 mmmmmmmmmmmmmm
112 mmmmmmjjmmmmmm
113 mmmmmmmmmmmmmm
114 mmmmmmmmmmmmmm
115 mmmmmmmmmmmmmm
116 mmmmmmmmmmmmmm
117 mmmmmmjjmmmmmm
118 mmmmmmmmmmmmmm
119 mmmmjmmmmjmmmm
120 mmmmmmmmmmmmmm
121 mmjmmmmmmmmjmm
122 mmmmmmmmmmmmmm
123 mmmmmmmmmmmmmj
124 Level:
125 Ukog-Nos Takeuchi
126 GONGhead
127 Bricks:
128 .....d...dd...
129 ....dd...dd...
130 ...dd.d.ddd...
131 ...d..d.d..d..
132 ....ddd.ddd...
133 ...d.dd.d.dd..
134 ...dd.d.dddd..
135 ...dd.d.dd.d..
136 ..............
137 ......d.......
138 .....ddd......
139 ......d.......
140 .....ddd......
141 ......d.d.....
142 .......d......
143 .....dd.......
144 ....dd.dd.....
145 ...dd....dd...
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 .....??.......
163 ....??.??.....
164 ...??....??...
165 Level:
166 Ukog-Nos Takeuchi
167 Afrocalypse now!
168 Bricks:
169 !!!!!!!!!!!!!!
170 !!!!!!!!!!!!!!
171 !!!!!!!!!!!!!!
172 !!!!!!!!!!!!!!
173 !!!!!!!!!!!!!!
174 !!!!!!!!!!!!!!
175 !!!!!!!!!!!!!!
176 !!!!!!!!!!!!!!
177 !!!!!!!!!!!!!!
178 !!!!!!!!!!!!!!
179 !!!!!!!!!!!!!!
180 !!!!!!!!!!!!!!
181 !!!!!!!!!!!!!!
182 !!!!!!!!!!!!!!
183 !!!!!!!!!!!!!!
184 !!!!!!!!!!!!!!
185 !!!!!!!!!!!!!!
186 !!!!!!!!!!!!!!
187 Bonus:
188 >>>>>>>>>>>>>>
189 >>>>>>>>>>>>>>
190 >>>>>>>>>>>>>>
191 >>>>>>>>>>>>>>
192 >>>>>>>>>>>>>>
193 >>>>>>>>>>>>>>
194 >>>>>>>>>>>>>>
195 >>>>>>>>>>>>>>
196 >>>>>>>>>>>>>>
197 >>>>>>>>>>>>>>
198 >>>>>>>>>>>>>>
199 >>>>>>>>>>>>>>
200 >>>>>>>>>>>>>>
201 >>>>>>>>>>>>>>
202 >>>>>>>>>>>>>>
203 >>>>>>>>>>>>>>
204 >>>>>>>>>>>>>>
205 ++++++++++++++
206 Level:
207 Ukog-Nos Takeuchi
208 Suchst du was bestimmtes
209 Bricks:
210 ..............
211 ..............
212 ..............
213 ..............
214 ..............
215 ..............
216 ..............
217 ..............
218 ..............
219 ......v.......
220 ..............
221 ..............
222 ..............
223 ..............
224 ..............
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248
249 DerPups@arschgas.de
250 Bricks:
251 @jjj..........
252 jj@jjjj.......
253 .jj@j@jjj.....
254 ..jjjjj@jjj...
255 ......jjj@j...
256 .jjjjjjj@jj...
257 jj@@jj@jjj....
258 j@jjjjjj......
259 j@jjjj........
260 jjj@@j.jjjjj..
261 ..jjjjjj@j@jj.
262 ..jj@j@jjjj@j.
263 ..j@jjjjj@@jj.
264 ..j@jjj.jjjj..
265 ..jjj@jjjj....
266 ....jjjj@j....
267 .......j@j....
268 .......jjj....
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 .......ggg....
288 Level:
289 Ukog-Nos Takeuchi
290 Error Inside ____ 1+1=3?
291 Bricks:
292 ..............
293 .zzzzzzzzzzzzz
294 .zzzzzzzzzzzzz
295 .zzzzzzzzzzzzz
296 .zzzzzzzzzzzzz
297 .zzzzzzzzzzzzz
298 .zzzzzzzzzzzzz
299 .zzzzzzzzzzzzz
300 .zzzzzzzzzzzzz
301 .zzzzzzzzzzzzz
302 .zzzzzzzzzzzzz
303 .zzzzzzzzzzzzz
304 .zzzzzzzzzzzzz
305 .zzzzzzzzzzzzz
306 .zzzzzzzzzzzzz
307 .zzzzzzzzzzzzz
308 .zzzzzzzzzzzzz
309 .zzzzzzzzzzzzz
310 Bonus:
311 ..............
312 .?????????????
313 .?????????????
314 .?????????????
315 .?????????????
316 .?????????????
317 .?????????????
318 .?????????????
319 .?????????????
320 .?????????????
321 .?????????????
322 .?????????????
323 .?????????????
324 .?????????????
325 .?????????????
326 .?????????????
327 .?????????????
328 .?????????????
329 Level:
330 Ukog-Nos Takeuchi
331 It's hip to be a square
332 Bricks:
333 ##defghijkd###
334 ##defghijkd###
335 ##kdefghije###
336 ##kdefghije###
337 ##jkdefghkf###
338 ##jkdefghkf###
339 ##ijkdefidg###
340 ##ijkdefidg###
341 ##hijk!gjeh###
342 ##hijk!gjeh###
343 ##ghijihkfi###
344 ##ghijihkfi###
345 ##fghgfedgj###
346 ##fghgfedgj###
347 ##efedkjihk###
348 ##efedkjihk###
349 ##dkjihgfed###
350 ##dkjihgfed###
351 Bonus:
352 ..555555555...
353 ..555555555...
354 ..555555555...
355 ..555555555...
356 ..555555555...
357 ..555555555...
358 ..555555555...
359 ..555555555...
360 ..555555555...
361 ..555555555...
362 ..555555555...
363 ..555555555...
364 ..555555555...
365 ..555555555...
366 ..555555555...
367 ..555555555...
368 ..555555555...
369 ..555555555...
370 Level:
371 Ukog-Nos Takeuchi
372 Orega kowai no ka?
373 Bricks:
374 ..............
375 EEEEEEEEEEEEEE
376 @iEiEi.......E
377 @.E.EEE.E.EE.E
378 @.E.Ei..E.E..E
379 @.E.EEEEE.E.EE
380 @.E.......E.iE
381 @.E.EEE.EEEEEE
382 @.E.Ei.......E
383 @.E.EEE.EEEE.E
384 @.E..iE.Ei...E
385 @.EEEEE.@@@@@@
386 @.Ei.........@
387 @.EEEEE.@@@@.@
388 @.Ei....@i...@
389 E.EEEEEEEEEE.@
390 E............@
391 E.EEEEEEEEEEE@
392 Bonus:
393 ..............
394 ..............
395 .l.l.l........
396 ..............
397 .....l........
398 ..............
399 ............l.
400 ..............
401 .....l........
402 ..............
403 .....l...l....
404 ..............
405 ...l..........
406 ..............
407 ...l.....l....
408 ..............
409 ..............
410 ..............
411 Level:
412 Ukog-Nos Takeuchi
413 Sylvester-Stallone
414 Bricks:
415 *E..........E*
416 E*E........E*E
417 E*E........E*E
418 .E*E......E*E.
419 ..E*E....E*E..
420 ...E*E..E*E...
421 ...E*E..E*E...
422 ....E*EE*E....
423 .....E**E.....
424 .....E**E.....
425 ....E*EE*E....
426 ...E*EddE*E...
427 ...E*EeeE*E...
428 ..E*EhhhhE*E..
429 .E*EffffffE*E.
430 E*EggggggggE*E
431 E*EiiiiiiiiE*E
432 *E..........E*
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ..............
438 ..............
439 ..............
440 ..............
441 ..............
442 ..............
443 ..............
444 ..............
445 ..............
446 ..............
447 ..............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Ukog-Nos Takeuchi
454 Die Gadouken
455 Bricks:
456 vvvvvvvvvvvvvv
457 vvvvvvvvvvvvvv
458 EEEEEEEEEEEEEv
459 vvvvvvvvvvvvvv
460 vvvvvvvvvvvvvv
461 vEEEEEEEEEEEEE
462 vvvvvvvvvvvvvv
463 vvvvvvvvvvvvvv
464 EEEEEEEEEEEEEv
465 vvvvvvvvvvvvvv
466 vvvvvvvvvvvvvv
467 vEEEEEEEEEEEEE
468 vvvvvvvvvvvvvv
469 vvvvvvvvvvvvvv
470 EEEEEEEEEEEEEv
471 vvvvvvvvvvvvvv
472 vvvvvvvvvvvvvv
473 vEEEEEEEEEEEEE
474 Bonus:
475 bbbbbbbbbbbbbb
476 bbbbbbbbbbbbbb
477 .............m
478 bbbbbbbbbbbbbb
479 bbbbbbbbbbbbbb
480 m.............
481 bbbbbbbbbbbbbb
482 bbbbbbbbbbbbbb
483 .............m
484 bbbbbbbbbbbbbb
485 bbbbbbbbbbbbbb
486 m.............
487 bbbbbbbbbbbbbb
488 bbbbbbbbbbbbbb
489 .............m
490 bbbbbbbbbbbbbb
491 bbbbbbbbbbbbbb
492 m.............
493 Level:
494 Ukog-Nos Takeuchi
495 Die Kohryuuken
496 Bricks:
497 vvvEvvvEvvvEvv
498 vvvEvvvEvvvEvv
499 vEvEvEvEvEvEvv
500 vEvEvEvEvEvEvv
501 vEvEvEvEvEvEvv
502 vEvEvEvEvEvEvv
503 vEvEvEvEvEvEvv
504 vEvEvEvEvEvEvv
505 vEvEvEvEvEvEvv
506 vEvEvEvEvEvEvv
507 vEvEvEvEvEvEvv
508 vEvEvEvEvEvEvv
509 vEvEvEvEvEvEvv
510 vEvEvEvEvEvEvv
511 vEvEvEvEvEvEvv
512 vEvvvEvvvEvvvv
513 vEvvvEvvvEvvvv
514 vEEEEEEEEEEEEE
515 Bonus:
516 bmb.bmb.bmb.bb
517 bmb.bmb.bmb.bb
518 b.b.b.b.b.b.bb
519 b.b.b.b.b.b.bb
520 b.b.b.b.b.b.bb
521 b.b.b.b.b.b.bb
522 b.b.b.b.b.b.bb
523 b.b.b.b.b.b.bb
524 b.b.b.b.b.b.bb
525 b.b.b.b.b.b.bb
526 b.b.b.b.b.b.bb
527 b.b.b.b.b.b.bb
528 b.b.b.b.b.b.bb
529 b.b.b.b.b.b.bb
530 b.b.b.b.b.b.bb
531 b.bmb.bmb.bmbb
532 b.bmb.bmb.bmbb
533 m.............
534 Level:
535 Ukog-Nos Takeuchi
536 DROGENKONSUM
537 Bricks:
538 **************
539 ..............
540 .************.
541 ..............
542 ..**********..
543 ..............
544 ...********...
545 ..............
546 ....******....
547 ..............
548 .....****.....
549 ..............
550 ......**......
551 ..............
552 .....****.....
553 ..............
554 ....******....
555 ..............
556 Bonus:
557 f>c~Wf>c~Wf>c~
558 ..............
559 .~Wf>c~Wf>c~W.
560 ..............
561 ..~Wf>c~Wf>c..
562 ..............
563 ...f>c~Wf>c...
564 ..............
565 ....Wf>c~W....
566 ..............
567 .....f>c~.....
568 ..............
569 ......~W......
570 ..............
571 .....-f>c.....
572 ..............
573 ....{{{{{{....
574 ..............
0 Version: 1.00
1 Level:
2 John van Hooff
3 Surprise
4 Bricks:
5 ....k....k....
6 ....k.jj.k....
7 fdddk.##.k..df
8 @...k##*#...d@
9 @...#.#....d.@
10 ......#...dd..
11 .b....@.......
12 ..bb..@..b....
13 .i.b..#.b...i.
14 @i....#.....i@
15 @i......b...i@
16 .i..........i.
17 ##ee.....eee##
18 ....#####.....
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ....4.........
25 ......5..m....
26 5230.....c...4
27 ....3.......2.
28 ...........g..
29 ..........2...
30 .p............
31 ..w...........
32 .2.2....*...2.
33 ............3.
34 ............j.
35 .3..........+.
36 ..00.....00-..
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 John van Hooff
44 CooL
45 Bricks:
46 ..............
47 !.*........*.!
48 .EE@E.ii.E@EE.
49 ..............
50 ..##..@@..##..
51 ..............
52 @.!........!.@
53 @............@
54 @............@
55 @............@
56 ....!....!....
57 ..............
58 vvvvv....vvvvv
59 ..y........y..
60 ....k....k....
61 ..zz..@@..zz..
62 ..............
63 ..............
64 Bonus:
65 5*..........m5
66 ..............
67 2.....dc.....2
68 ..............
69 ..............
70 ..g........g..
71 .1.0......0.1.
72 ..1........1..
73 ..............
74 ..............
75 ...j2....2j...
76 ..............
77 fc-<>....<>+?f
78 ..............
79 ..............
80 ..>+......->..
81 ..............
82 ..............
83 Level:
84 John van Hooff
85 Santa Claus
86 Bricks:
87 .h........d...
88 hgh......ddd..
89 .g.......jjdd.
90 g..dd....eejd.
91 EE.hd...egejd.
92 ..dd...eeeejd.
93 ..dd....eee..d
94 .ddd.f...edd..
95 .ddd.fd.jjdd..
96 ####x.djddddd.
97 #za#x..dddd.df
98 #ah#x...dhd..f
99 #hb#x...d.d...
100 #hb#x...d.d...
101 #hh#x..dd.dd..
102 #ee#x.dd...dd.
103 #ii#x.d.....d.
104 cccc.kk....kk.
105 Bonus:
106 ..............
107 m*W.......4...
108 .........&b2..
109 5..0........&.
110 ....0....54}c.
111 ..&.....{<2.*.
112 ..2s....2....p
113 .c.2.....4?4..
114 .50}.2..lw....
115 ....p..4W!1!4.
116 .5..c....4..W2
117 .0f.0...?.W..?
118 .-W.....{.1...
119 .?0.0.....c...
120 .......<1..+..
121 ..?...+>...~..
122 ............s.
123 Wjf...-....-f.
124 Level:
125 John van Hooff
126 Wild live
127 Bricks:
128 .........ff..!
129 ....!...f.ef..
130 ..d....ffe.f##
131 .ddd..ff.e.ff.
132 .dd...f...e..f
133 .dd..fe..g...f
134 ddd.ff.eggg.ff
135 ddd..f..ghg.f.
136 .ddd.f.fgggff.
137 .ddd...egggf.@
138 .ddd..f.eg.f..
139 aaddae!.eeee.!
140 ...d.e..eee...
141 ....de...eee..
142 c.!..e..eee...
143 .....e..eeee..
144 bbaccffeeeeeee
145 ccabbff.eyyeee
146 Bonus:
147 ..............
148 ...........?..
149 .......5.}....
150 .22&.......&4.
151 .<}...g.......
152 .........d....
153 >.j..d..5.f.4.
154 .g...5...m..4.
155 ..?..f....j.4.
156 .f33....5..g..
157 .........w....
158 ..............
159 ........&50...
160 ....<....>0...
161 d........?0...
162 .........s.0..
163 -f+.....+..<+.
164 ....f........f
165 Level:
166 John van Hooff
167 Like a Snake
168 Bricks:
169 ..............
170 .fffff...ffff.
171 feeeeef.eeeeef
172 feeeeef.eeeeef
173 fefffef.efffef
174 fef.fef.ef.fef
175 fef.fef.ef.fef
176 eee.fef.ef.fef
177 eee.feeeef..f.
178 eee..feeef....
179 .d....fff.....
180 .d...........@
181 .d...g....z..@
182 d.d.g.g....g.@
183 ............g.
184 ..............
185 ...vdyvyvc....
186 iii.......iiii
187 Bonus:
188 ..............
189 .2.5.....5?...
190 4..g2...&..2..
191 m.1?..2...g.j.
192 &1...s2..d.p.4
193 ....dlf.c....f
194 ..j..12..3.?b4
195 .~1.<.2.1.....
196 1...b1......<.
197 d3.....1.1....
198 ........~.....
199 ..............
200 .?...1........
201 0.0...+....1..
202 ............?.
203 ..............
204 ...<.-.f+.....
205 f>+.......-.f.
206 Level:
207 John van Hooff
208 Cold World
209 Bricks:
210 ..jj......jj..
211 !....*..*....!
212 .####....####.
213 gggggg!!gggggg
214 gggggggggggggg
215 ..............
216 kkkkkkkkkkkkkk
217 cccccccccccccc
218 EggggggggggggE
219 ggg!gggggg!ggg
220 j............j
221 !.jjjjjjjjjj.!
222 zzzzcccccczzzz
223 gggggggggggggg
224 gggggggggggggg
225 cccccccccccccc
226 !.!.!.!!.!.!.!
227 ..............
228 Bonus:
229 m.5........5.m
230 ..............
231 ..............
232 ..4.......4...
233 *............*
234 ..............
235 ..g...WW.g....
236 .d.j000000j.d.
237 .f.f.f.f..f.f.
238 f.f.f.f.f..f.f
239 W............W
240 ...~wl~~lw~...
241 p.2..2..2..2.p
242 f.f.f.f.f.f.f.
243 .f.f.f.f.f.f.f
244 b.+<>-...-><+b
245 .?.w.pw.p.w.?.
246 ..............
247 Level:
248 John van Hooff
249 Darkness
250 Bricks:
251 !............!
252 .v....vv....v.
253 ..v...vv...v..
254 ...v..vv..v...
255 ....v....v....
256 .....v..v.....
257 ......vv......
258 ......vv......
259 ......vv......
260 .....v..v.....
261 ....v....v....
262 ...v..vv..v...
263 ..v...vv...v..
264 .v....vv....v.
265 v.....vv.....v
266 .v..........v.
267 vvvvvvvvvvvvvv
268 jjjjjjjjjjjjjj
269 Bonus:
270 ..............
271 ......55......
272 ..............
273 ...j......j...
274 ..............
275 .....d..d.....
276 ..............
277 ......**......
278 ......22......
279 ..............
280 ....f....f....
281 ......}{......
282 ......dd......
283 ......ff......
284 f............f
285 .+..........+.
286 dddddddddddddd
287 **************
288 Level:
289 John van Hooff
290 Wisdom
291 Bricks:
292 .....d..d.....
293 ......dd......
294 .....dhhd.....
295 .....dddd.....
296 .....d@@d.....
297 ......dd......
298 .....dddd.....
299 ....vddddv....
300 EEE.dddddd.EEE
301 ...vddddddv...
302 ...#dddddd#...
303 ...#dddddd#...
304 ...#dddddd#...
305 f...dddddd...f
306 .f...dddd...f.
307 ..f...dd...f..
308 ...fffddfff...
309 cccczzzzzzcccc
310 Bonus:
311 ..............
312 ..............
313 .......l......
314 ......5.4.....
315 ..............
316 ..............
317 ..............
318 ......1*......
319 .....pW.3.....
320 ...j3.1..3j...
321 .....*.3......
322 ....1...p.....
323 .....3.1W*....
324 0............0
325 .{...-1.-...}.
326 ..0....3...0..
327 .....+..+.....
328 .0.f1....1f.0.
329 Level:
330 John van Hooff
331 Christmas Tree
332 Bricks:
333 ...@..e..@@...
334 ......e.......
335 E#....f.....#E
336 i#...hfh....#i
337 i#....f.....#i
338 .#...f*f....#.
339 .#..hfffh...#.
340 .#...*#*....#.
341 ....ff#ff.....
342 ...hff#ffh....
343 @...f*#*f....@
344 ...fffffff....
345 ..hfffffffh...
346 ...f*fff*f....
347 ..fffffffff...
348 vhffffdffffhvv
349 .v.fvvdvvf.v..
350 vv...ddd...vvv
351 Bonus:
352 ..............
353 ......5.......
354 ..............
355 .....0l0......
356 ......f.......
357 ..............
358 ....0.m.0.....
359 ..............
360 .....1.1......
361 ...0..?..0....
362 ..............
363 ...fwg.gwf....
364 ..0.d?j?d.0...
365 ......2.......
366 ...2..{..2....
367 .0.+-...-+.0..
368 ..............
369 .....<c>......
370 Level:
371 John van Hooff
372 Birthday Party
373 Bricks:
374 ..............
375 ......hh......
376 .h.h..ii..h.h.
377 .i.i..**..i.i.
378 .i.*..ii..*.i.
379 .i.i..ii..i.i.
380 .i.i..ii..i.i.
381 .i.i..ii..i.i.
382 .zzzzzzzzzzzz.
383 .c**********c.
384 .dddddddddddd.
385 .gggggggggggg.
386 .ff********ff.
387 .jjjjjjjjjjjj.
388 .eeeeeeeeeeee.
389 ......v.......
390 vvvvvv.vvvvvvv
391 cccccc.ccccccc
392 Bonus:
393 ..............
394 ......55......
395 .0.0......0.0.
396 ..............
397 .s..........l.
398 ......gj......
399 .0.0..!m..0.0.
400 ..............
401 ...d.....d....
402 ...{......{...
403 ...~f~f~f~f...
404 .&1111111111&.
405 ..............
406 ..f.0.0.0..f..
407 ...+.fpwf.+...
408 ..............
409 .ff*f!.!.f*ff.
410 ><.+......+.<>
411 Level:
412 John van Hooff
413 Iridescene
414 Bricks:
415 @@#iiihiii#@@@
416 cc#jih*hij#jjj
417 ii#jhggghj#iii
418 jj#hgzzzgh#bbb
419 EE###EEE###EEE
420 hhhhhhhhhhhhhh
421 hhhhhh**hhhhhh
422 iiiii*vv*iiiii
423 iiiii*vv*iiiii
424 jjjjj*vv*jjjjj
425 ggggg*vv*ggggg
426 ffffff**ffffff
427 ffffffffffffff
428 dddddddddddddd
429 dddddddddddddd
430 eeeeeeeeeeeeee
431 eeeeeeeeeeeeee
432 kkkkkkkkkkkkkk
433 Bonus:
434 .....555......
435 ..............
436 ....11111.....
437 ..............
438 ..............
439 ..............
440 .111.j..j..mm.
441 ..g...ff....ff
442 -----.ff.gff..
443 ......ff.-----
444 .mm!..ff..!...
445 ff............
446 ..ffWWWWW000..
447 .}{........{}.
448 ....??????....
449 .+++.0000.+++.
450 ....bbbbbbbbbb
451 wwwwwwwwwwwwww
452 Level:
453 John van Hooff
454 Sand-glass
455 Bricks:
456 ..............
457 ..............
458 ...EdddddddE..
459 ...EdddddddE..
460 ....EdddddE...
461 ....EdddddE...
462 .....EdddE....
463 .....EdddE....
464 ......@e@.....
465 ......@e@.....
466 .....E*e*E....
467 .....EhhhE....
468 ....EhhhhhE...
469 ....EhhhhhE...
470 ...EhhhhhhhE..
471 ...EhhhhhhhE..
472 ...*hhhhhhh*..
473 ..EE#######EE.
474 Bonus:
475 ..............
476 ..............
477 ....m*.*.*m...
478 ......1.1.....
479 ......*m*.....
480 .....0c.c0....
481 ......f.f.....
482 .......0......
483 .......m......
484 .......1......
485 .......1......
486 .......!......
487 .....+jmj+....
488 ......2*2.....
489 ....*0.0.0*...
490 ....0~0.0~0...
491 ....mw555wm...
492 ..............
493 Level:
494 John van Hooff
495 Sphinx
496 Bricks:
497 ....e.........
498 ....ee........
499 ...eeee.......
500 ...egee.......
501 ..eeeee.......
502 ..eeeee.......
503 ...eee........
504 ...eee........
505 ....eeee......
506 ....eeeeeeee..
507 ....eeeeeeeee.
508 ...eeeeeeeeeee
509 ...eeeeeeeeeee
510 vveeeeeeeeeeee
511 vveeeeeeeeeeev
512 eeeeeeeeeeeeev
513 eeee......eeee
514 eee..vvvv...ee
515 Bonus:
516 ..............
517 ....55........
518 ....j.........
519 ..............
520 ....1~........
521 ..W.1.b.......
522 ...~1.........
523 ....1.........
524 ....1*........
525 ....1..!4!....
526 ....1..l4m.3..
527 ....1...4..3..
528 ....1...4..3~.
529 ...*1.c.4.*3c.
530 ....1W..4..3W.
531 ....1->+4w.3..
532 ...w......-3..
533 >f+.........f>
534 Level:
535 John van Hooff
536 Pharaoh's Tomb
537 Bricks:
538 ......#.......
539 ......#.......
540 .....#j#......
541 .....aia......
542 .....#j#......
543 ....#jjj#.....
544 ....#jgj#.....
545 ....#jjg#.....
546 ...#jejgj#....
547 ...#jggjd#....
548 ...#gjjjj#vvvv
549 ..#jjgjjjj#...
550 ..ajjjgggga...
551 ..#jjgjjjj#...
552 .#hjgjjjjjj#..
553 .#jgjjjjjjj#..
554 #jjjjjjjjjjj#z
555 #############v
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ......*.......
561 ......?.......
562 .....5.2......
563 .......2......
564 ..............
565 .....l........
566 ....~.........
567 .......5{.....
568 ...5.....!....
569 ...m}?...m....
570 ......5..~....
571 .......~?.l...
572 ..........2...
573 .22?.W...W2...
574 ..............
575 Level:
576 John van Hooff
577 Buildings
578 Bricks:
579 ......E...gg..
580 ...ii.E...gg..
581 ...*i.E...gg..
582 ...ii.E.!.gg..
583 ...*i.E.!.gg..
584 ...ii.E.!.ggjj
585 ...*i.E.!.ggjj
586 ###ii.E.!.ggjj
587 #*#*i.E.!.ggjj
588 #*#ii.E.!.d.jj
589 #*#*i.E..ddd.j
590 #*#ii.E.ddedd.
591 #E#*i.Edde.edd
592 #*#ii.Edeeeeed
593 #*#*i.E.e.eee.
594 #*#fi.E.e.e.e.
595 ###fffE.e.eeef
596 ffffffff#####f
597 Bonus:
598 ...........?..
599 ...m1.....?...
600 ....1......?..
601 ...1....*.?...
602 ....1...0.m?..
603 ...1....0.?.2.
604 ....1...0..?2f
605 ...1....0.?.2f
606 .l..j...0..?2l
607 .l.1d...0.d.2f
608 ....1......?.*
609 ...1....4.5.2.
610 ....1......g.f
611 .l.1....?.*..!
612 ....1.......2.
613 ...f......2...
614 .....<....fmf.
615 .p.*.w>......c
616 Level:
617 John van Hooff
618 Light headed botles
619 Bricks:
620 ..g.@@...@@.g.
621 @.g.........g.
622 @.g...i.i...g.
623 @.g...iii...g.
624 ..g...iii...g.
625 .ggg..iii..ggg
626 .ggg..iii..ggg
627 .ggg..iii..ggg
628 .ggg..iii..ggg
629 .ggg..iii..ggg
630 .ggg..iii..ggg
631 .ggg..iii..ggg
632 .ggg..iii..ggg
633 .ggg...i...ggg
634 .ggg.@.i.@.ggg
635 .g.g.@.i.@.g.g
636 .....@.i.@....
637 .......i......
638 Bonus:
639 ..l.........l.
640 ..j.........g.
641 ..m...c.c...m.
642 ..j...cdc...g.
643 ..j...cgc...g.
644 .gjg..cgc..jgj
645 .gjg..c?c..jgj
646 .gjg..c?c..jgj
647 .gjg..c?c..jgj
648 .gjg..c?c..jgj
649 .gjg..c?c..jgj
650 .gjg..cgc..jgj
651 .gjg..cgc..jgj
652 .gjg...g...jgj
653 .gjg...g...jgj
654 .g.g...g...j.j
655 .......>......
656 .......l......
657 Level:
658 John van Hooff
659 Bulb on Bulb off
660 Bricks:
661 ......ee......
662 ......ee......
663 .!....ee....!.
664 ......ee......
665 .....c**c.....
666 .....bhhb.....
667 ....chhhhc....
668 ....bhhhhb....
669 ...chhhhhhc...
670 ...bhhjjhhb...
671 ...chjjjjhc...
672 ...bhhjjhhb...
673 ...chhjjhhc...
674 ...bhhhhhhb...
675 ...chhhhhhc...
676 ....bhhhhb....
677 .!...chhc...!.
678 ......bb......
679 Bonus:
680 ......**......
681 d!d...d!...d!d
682 !.!...!d...!.!
683 {!*...d!...*!{
684 .....d..d.....
685 ......22......
686 ....dl22ld....
687 ....p.22.p....
688 ....d!22!d....
689 ...d!dmmd!d...
690 ...!d....d!...
691 ...d!djjd!d...
692 ...!d!pp!d!...
693 ...d!d22d!d...
694 ....d!22!d....
695 *!}..d!!d..}!*
696 !.!..d22d..!.!
697 d!d........d!d
698 Level:
699 John van Hooff
700 Bad Jumbojet
701 Bricks:
702 j......jjj..jj
703 jj.jjj.jj..jjj
704 .jjjjjjj......
705 .....j...E....
706 ........E....E
707 .......E....EE
708 ......E.....E.
709 ..EEEEEEaEEEE.
710 .Ea*E******EE.
711 @a**Ek*k*k*k*E
712 @a**E*******E.
713 .EE*EE****EE..
714 ...EEEEEaE....
715 .......Ev.....
716 j.j.....E.....
717 .jjj.....E...j
718 jjjjj.....E.jj
719 jjjjjjj...jjj.
720 Bonus:
721 5.......5...p.
722 .j.5.l.?...3.&
723 ...*..c.......
724 .....f........
725 ..............
726 ..............
727 ..............
728 ..............
729 ..!...........
730 .~...f.f.f.f..
731 ..............
732 ..............
733 ..............
734 ........l.....
735 5.5...........
736 ..............
737 0m.3........c+
738 ..w..W....4.-.
739 Level:
740 John van Hooff
741 Horse Power
742 Bricks:
743 .........e....
744 ........heh...
745 ........eeee..
746 .......heege..
747 .......heeeee.
748 ......hheeee..
749 ..he!!eeee....
750 .hee!!eee.....
751 heee!!eee....@
752 heee!!eee....d
753 heeeeeeee....@
754 hee....eee..dd
755 .eee....ee..@@
756 .e.e....e.e.dd
757 .e.e....e.e.@@
758 .e..e...e..edd
759 fffbffbffbff@@
760 fbffffffbffbfb
761 Bonus:
762 ..............
763 .........0....
764 ..............
765 ........0.d...
766 ........m0.0..
767 ..........0...
768 ......j0......
769 ..j.l.0.?.....
770 .0.0.0?......f
771 .*.....0.....f
772 0g0.0...p....f
773 ............ff
774 ........3...ff
775 .0.0....3.3.ff
776 ........3...ff
777 ........<...ff
778 ....+.-!>+....
779 .-......c.....
780 Level:
781 John van Hooff
782 Blue Planet
783 Bricks:
784 ......gg......
785 .!...gggg...!.
786 .....gggg.....
787 ....gggggg....
788 ....gggggg....
789 !..gggggggg..!
790 ...gggggggg...
791 ..gggggggggg..
792 ..ggggg*gggg..
793 ..gggg*ggggg..
794 ..gggggggggg..
795 ...gggggggg...
796 !..gggggggg..!
797 ....gggggg....
798 ....gggggg....
799 .....gggg.....
800 .....gggg.....
801 .!....gg....!.
802 Bonus:
803 5.....ff.....5
804 .....ffff.....
805 .*...ffff...*.
806 ..............
807 ....??????....
808 ...d.}}}}.w...
809 .....}}}}.....
810 ......m*......
811 ..gggg~lgggg..
812 ..ggggl~gggg..
813 ......*m......
814 *2...{{{{...2*
815 .2.w.{{{{.d.2.
816 <>..??????..><
817 ..............
818 .....ffff.....
819 +1-..ffff..-1+
820 *.1...ff...1.*
821 Level:
822 John van Hooff
823 Cobra
824 Bricks:
825 .......ff.....
826 ......ffff....
827 ..j..ffff.....
828 .jjj..ff......
829 .fjf...#.j....
830 .jjj...#..j...
831 .jjj...#zz.j..
832 .jdj...##zz.j.
833 .jjj..##zz..j.
834 ..j...#.....j.
835 ..j..k#..jjjj.
836 !vjvkv#vjjjjvv
837 vjjvk##vjvvvvv
838 vjvvkkk#jvvvvv
839 vjvvvvjjvvvvvf
840 vjvvvjv#vvvvff
841 vjjjjvv#ffffff
842 fffffff#ffffff
843 Bonus:
844 .......m......
845 .......?......
846 .....j........
847 .0l0...g......
848 ..0......?....
849 .000......0...
850 .0j?.....5.0..
851 .0f0.....?..?.
852 .000..........
853 ..0...........
854 ..........0.0.
855 ..0.*....0.?..
856 *00.?...0...*.
857 .?........f...
858 .0..f.00.....j
859 .?...0........
860 .0000...?...?1
861 ..+.!.1..1!+..
862 Level:
863 John van Hooff
864 Bonsai
865 Bricks:
866 ......fff.....
867 .....ffff.....
868 ....fffEff....
869 ..f..ffEf..f..
870 .f#f..fE..ff..
871 .f##...E.###f.
872 ..ff##.E.#ff..
873 .....##E.#....
874 .......Ef#....
875 ..f...fE##....
876 .ffff.EE....f.
877 ff####EE..ffff
878 .fff.#Ef..###f
879 ......E####fff
880 ......E.......
881 vv!vvvEEvvv!vv
882 zyzyzyEEyzyzyz
883 vvvvvv@@@vvvvv
884 Bonus:
885 ......---.....
886 .....--m-.....
887 ....--f.--....
888 ..-..--.j..-..
889 .-.-..-...--..
890 .-..........-.
891 ..-*......*-..
892 ..............
893 ........*.....
894 ..-...*.......
895 .----.......-.
896 {{........---{
897 .---...*.....{
898 ...........---
899 ..............
900 .{..{....{..{.
901 50<>55..55><05
902 {+++++...++++{
903 Level:
904 John van Hooff
905 Frosty Waterfalls
906 Bricks:
907 j...j##ffff###
908 jj..Ejjj##jjjj
909 #jjj.EjjjjjjjE
910 .#jj..EjjjjjE.
911 ..Ejj.EjjjjjE.
912 ..Ejj.EjjjjE..
913 ..Ejj.EjjjE..j
914 ..Ejj..EjE..j#
915 ...#jj.EjE.j#.
916 ...#jj.EjE.j#.
917 j..#jj.Ej..j#.
918 #j..#j..j.jE..
919 #j..#jj.j.jE..
920 .#j.#jj...jE..
921 .#j.#jj..j#...
922 .#j..Ej..j#...
923 ..#j.Ejj.j#...
924 ###jj.#j.j####
925 Bonus:
926 5...f...ll....
927 fl...2.....4.5
928 .?f...mf..mfl.
929 ..1....?4.!*..
930 ...f...4ffj2..
931 ...1j..f.?f...
932 ...m!..*2p...f
933 ....f.......m.
934 ....&...f..&..
935 ....?1..?..f..
936 +...pf..2..?..
937 ........f.....
938 .}...1{...+...
939 ..2..?........
940 ..f..!f.......
941 ..?...<..?....
942 ...2..>..f....
943 ...f...0......
944 Level:
945 John van Hooff
946 Crump Clock
947 Bricks:
948 ......*......v
949 .....d.d.....v
950 ....*...*....v
951 ....d.E.d....v
952 ...d..E..d...v
953 ..*...E...*..v
954 ..d...E...d..v
955 ..d...E...d..v
956 .d....E....d.v
957 .*....*EEE.*.v
958 ..d.......d..v
959 ..d.......d..v
960 ..*.......*..v
961 ...d.....d...v
962 ....d...d....v
963 ....*...*....v
964 vvv..d.d..vvvv
965 vvvv..*..vvvvv
966 Bonus:
967 .............2
968 .....1.1.....2
969 .............2
970 ....1...1....2
971 ...1.....1...!
972 .............m
973 ..1.......1..1
974 ..d.......d..1
975 .1.........1.1
976 ......d......j
977 ..*.......*..1
978 ..1.......1..1
979 .............1
980 ...1.....1...!
981 ....*...*....m
982 .............0
983 .w...1.1...w.0
984 0+.0.....0-.+0
985 Level:
986 John van Hooff
987 Like to Smoke ?
988 Bricks:
989 ..............
990 ..............
991 EEEEEEEEEEEEEE
992 ..............
993 hhhhhhhhh.....
994 hhhhhjjjjjjje.
995 hjjjjjjje.....
996 hhhhjjjjjjje..
997 hhhhhhhhh.....
998 hhjjjjjjje....
999 hjjjjjjje.....
1000 hhhjjjjjjje...
1001 hhhhhhhhh.....
1002 ..............
1003 EEEEEEEEEEEEEv
1004 hhhhhhhhhhhhhh
1005 hhhhhhhhhhhhhh
1006 ..............
1007 Bonus:
1008 ..............
1009 ..............
1010 ..............
1011 ..............
1012 ~~~~~~~~~.....
1013 ~~~~~.........
1014 ~w............
1015 ~~~~..........
1016 ~~m~~~~~*.....
1017 ~~............
1018 ~w............
1019 ~~~...........
1020 ~~~~~~~~~.....
1021 ..............
1022 ..............
1023 >>>>>>>>>>>>>>
1024 {{{{{{{{{{{{{{
1025 ..............
1026 Level:
1027 John van Hooff
1028 High Noon
1029 Bricks:
1030 .k.........k..
1031 .kkkkkkkkkkkk.
1032 ..kkkkkkkkkkkd
1033 ..kkvvkv....d#
1034 ..kkvvkv...d#.
1035 ..kkkkvv..d#..
1036 .kkk.....d#...
1037 .kkk....d#....
1038 .kkk..#*#vvvvv
1039 vvvvv#*#..kkk.
1040 ....#d....kkk.
1041 ...#d.....kkk.
1042 ..#d..vvkkkk..
1043 .#d...vkvvkk..
1044 #d....vkvvkk..
1045 dkkkkkkkkkkk..
1046 .kkkkkkkkkkkk.
1047 ..k.........k.
1048 Bonus:
1049 .<............
1050 .....000.->+..
1051 ....?...}{.fl~
1052 ..33*.......~.
1053 ..33.3m....~..
1054 ..33!.....~...
1055 ..Wj.....~....
1056 ..?.....~.....
1057 ...g..........
1058 ..........g...
1059 .....~.....?..
1060 ....~.....jW..
1061 ...~.....!33..
1062 ..~....m3.33..
1063 .~.......*33..
1064 ~lf.{}...?....
1065 ..+>-.000.....
1066 ............<.
1067 Level:
1068 John van Hooff
1069 Penguin Adventure
1070 Bricks:
1071 ..............
1072 ...kk......k..
1073 ..kkkk....kkk.
1074 ..hEEh....kEh.
1075 ..kkkk...kkkkk
1076 ..hhhh..hhkhhk
1077 ..khhk....hhhh
1078 .kjjjjk..jkjkk
1079 .kjjjjk..jkjkk
1080 jkjjjjkj.jkjkk
1081 jkjjjjkj.jkjkk
1082 jkjjjjkj.jkjkk
1083 jkjjjjkj.jkjkk
1084 .kjjjjk..jkjkk
1085 .kjjjjk..jkjkk
1086 ..jjjj....jjjk
1087 ..kkkk.....kj.
1088 ...kk.....kkj.
1089 Bonus:
1090 ..............
1091 ..............
1092 ...11......1..
1093 ...........1..
1094 ...11......1.5
1095 ...11......1..
1096 .............4
1097 ..............
1098 ..*ff.?..?.fp.
1099 ..lffc.....f.c
1100 g..mfj.g..}fl*
1101 ...ff......fj.
1102 ..pffw.0.0.f..
1103 .s.ff}0..0.f..
1104 ...ff+0..0.f.w
1105 ..-ff......f.+
1106 ...........-s.
1107 ..............
1108 Level:
1109 John van Hooff
1110 Dragon
1111 Bricks:
1112 ....g.........
1113 .....gg.......
1114 ......g.......
1115 f...gggg......
1116 .f....ggg..f..
1117 ..ffffggg.fff.
1118 ..fkkkggfffkef
1119 ...ffgggkkkkff
1120 ....fkkkkffkf.
1121 ....fffff.ff..
1122 ....f...f.....
1123 ...ff..ff.....
1124 ...f...f......
1125 ..f...f......j
1126 jvvvvvvvvvvvjj
1127 kvvvvvvvvjjjjk
1128 jjjkvvvjkjjkjj
1129 jkjjjvjjjjkjjk
1130 Bonus:
1131 ....5.........
1132 ..............
1133 ..............
1134 ..............
1135 .......?......
1136 ..g...m....?..
1137 ...222...!.2l.
1138 ...?....2222..
1139 ....!2222?.2..
1140 .....fff..ff..
1141 ........f.....
1142 ...ff.........
1143 ..............
1144 .............*
1145 *........*....
1146 ..?.........b.
1147 .+...+..b.....
1148 ..............
1149 Level:
1150 John van Hooff
1151 Crazy
1152 Bricks:
1153 jjjjv!*!vvjjjj
1154 j..jv!!!vvj..j
1155 j..jv!!!vvj..j
1156 j..jv!!!vvj..j
1157 j..jv!!!vvj..j
1158 j..jv!!!vvj..j
1159 jjjjv...vvjjjj
1160 vvvvv...vvjjjj
1161 vvvvv...vvjjjj
1162 vjjjv...vvjjjj
1163 vj.jv...vvjjjj
1164 vj.jvjjjvv..jj
1165 vj.jvvvvvv..jj
1166 vj.jvv.vvv..jj
1167 jjjjjjdjjjjjjj
1168 jjjjjjjjjjjjjj
1169 jjjjjjjjjjjjjj
1170 jjjjjjjjjjjjjj
1171 Bonus:
1172 0000......0005
1173 0..0..*...0..0
1174 j..0......j..0
1175 0..0......0..0
1176 0..0......0..0
1177 0..0......0..0
1178 wwww..?...0000
1179 ..........000j
1180 ..........wwww
1181 .111......0000
1182 .1.j......0000
1183 .1.1.111....00
1184 .1.1........00
1185 .1.1........00
1186 !b!b!b!b!b!b!b
1187 bbbbbbbbbbbbbb
1188 bbbbbbbbbbbbbb
1189 wwwwwwwwwwwwww
1190 Level:
1191 John van Hooff
1192 Save Blue
1193 Bricks:
1194 g#*#d#EE*#*##g
1195 ##*#*#EE*#*###
1196 ******EE****d#
1197 *####*EE#*####
1198 **#*##EE#*#***
1199 *##*#*EE**##*#
1200 ******EE#****#
1201 #*###*EE####**
1202 ###*#*EE**###*
1203 #***#*EE#*#*#*
1204 **#***EE#*#*#*
1205 #*####EE##****
1206 #***##EE*#*#*#
1207 ###*##EE*#*#*#
1208 ******EE***#**
1209 #####*EE*#####
1210 vv****EE****vv
1211 v#####EE#####v
1212 Bonus:
1213 ....m...l.....
1214 ..............
1215 l...........m.
1216 ..............
1217 ..............
1218 ..............
1219 ..............
1220 ..............
1221 ..............
1222 ..............
1223 ..............
1224 ..............
1225 ..............
1226 ..............
1227 ..............
1228 ..............
1229 .s............
1230 .............+
1231 Level:
1232 John van Hooff
1233 Mondrian Art?
1234 Bricks:
1235 ##############
1236 #gg#dd#hhhhhh#
1237 #gg#dd#hhhhhh#
1238 #gg#dd#hhhhhh#
1239 #gg#dd########
1240 #gg####jjjj#g#
1241 #gg#jj#jjjj#g#
1242 #gg#jj#jjjj#g#
1243 #gg#jj#jjjj#g#
1244 ##############
1245 #jj#hh#dddd#h#
1246 #jj#hh#dddd#h#
1247 #jj#hh#dddd#h#
1248 #jj####dddd#h#
1249 #jj#gg#dd#####
1250 #jj#gg#dd#jjj#
1251 #jj#gg#dd#jjj#
1252 ##k##k##k###k#
1253 Bonus:
1254 ..............
1255 .0..33.m!0p.l.
1256 ....33.....W5.
1257 .l0..3.0f.0...
1258 ....33........
1259 .0d...........
1260 .W..11.W-.d.f.
1261 ..0.f1..+.....
1262 .0p.11....j.c.
1263 ..............
1264 .11.?..>2.<...
1265 .11.c?..2...*.
1266 .j~.?...2.!...
1267 .11....~2.m.0.
1268 .f1.+...2.....
1269 .11.-...2.111.
1270 ..1.Wg.f2.11>.
1271 ..............
1272 Level:
1273 John van Hooff
1274 Leaded Window
1275 Bricks:
1276 kkkkkkkkkkkkkk
1277 kkeeeeek!!!kik
1278 kfkeeeek!!kiik
1279 kfkeeeek!!kiik
1280 kffkkkkk!kiiik
1281 kffk@@@kkiiikk
1282 kfffk@@k*kikak
1283 kfffk@@k*kkaak
1284 kffk@@@k*kjkak
1285 kffk@@@kkjjjkk
1286 kkk@@@kkjjjjjk
1287 kggkkkxkkjjjjk
1288 kggkckxkhkjjjk
1289 kgkcckxkhhkjkk
1290 kkicckxkhhhkdk
1291 kiikcckkhhkddk
1292 kiikccckhhkddk
1293 kkkkkkkkkkkkkk
1294 Bonus:
1295 00000000000000
1296 00.....0l..0W0
1297 0.0Wc.f0.j0..0
1298 0p0+...0..0.-0
1299 0..00000.0...0
1300 0.s0...00?*.00
1301 0j.?0..0.0.0.0
1302 0..?0..0.00..0
1303 0..0...0.0.0.0
1304 0f*0...00.w.00
1305 000...00W...c0
1306 0..000<00.f.+0
1307 0-.0w0.0j0.s.0
1308 0.0..0>0..0.00
1309 00?..0.0...0?0
1310 0..0+.00-.0..0
1311 0..0...0..0..0
1312 00000000000000
1313 Level:
1314 John van Hooff
1315 Flak of Snow
1316 Bricks:
1317 ..............
1318 ......!.......
1319 !..!..!..!..!.
1320 .!..!.!.!..!..
1321 ..!..!!!..!...
1322 ...!..!..!....
1323 .!..!.!.!..!..
1324 ..!..!!!..!...
1325 ...!..!..!....
1326 !!!!!!!!!!!!!.
1327 ...!..!..!....
1328 ..!..!!!..!...
1329 .!..!.!.!..!..
1330 ...!..!..!....
1331 ..!..!!!..!...
1332 .!..!.!.!..!..
1333 !..!..!..!..!.
1334 ......!.......
1335 Bonus:
1336 ..............
1337 ...f.....f....
1338 .....l.l......
1339 *...........*.
1340 ....*...*.....
1341 ..f..>.>..f...
1342 ..............
1343 .*.p....p..*..
1344 000.?...?.000.
1345 ......m.......
1346 ..>.f...f.>...
1347 .*.j.....j.*..
1348 ..00.3.3.00...
1349 .fc..+.+..cf..
1350 ....*...*.....
1351 *.wd.....dw.*.
1352 .33.......33..
1353 ..............
1354 Level:
1355 John van Hooff
1356 Humbacked Bridge
1357 Bricks:
1358 ......ee......
1359 f...eee#e.....
1360 gff..eee#e....
1361 jgjf...e#..ee.
1362 fjjgf....#e#ee
1363 fjgjjd....#ee.
1364 .fjgddd....#..
1365 .fgddddd....#.
1366 .fddggjddd.##.
1367 .ddgjjgjddd#..
1368 .ddfgjjgjdd##.
1369 ffffjggggfff#.
1370 ....fjggggfff.
1371 .....fjgggjfff
1372 .vvv..fjgggjjf
1373 .vvv..fgjggggj
1374 .vvv..fjggggjg
1375 .......fgggggg
1376 Bonus:
1377 .......j......
1378 ..............
1379 &......&.5....
1380 c..?.......!..
1381 ..........m..?
1382 .?.c*-.....lp.
1383 ..p.---.......
1384 ..cj----......
1385 ..--.?.---....
1386 .--..c.*---...
1387 .--......--...
1388 ?.............
1389 ....W...c.?.c.
1390 ......?.......
1391 .><>..11111j11
1392 .f.<..11111111
1393 .><f..00j00000
1394 .......0000000
1395 Level:
1396 John van Hooff
1397 Locomotive
1398 Bricks:
1399 ...jjjjjjjjj..
1400 ......jjjjkk..
1401 ggggg..jj.kk..
1402 .jjjg.....kk..
1403 .j..g..k..kk..
1404 .j..gggggggggd
1405 vj..geeegeeegd
1406 vjjjgggegeggg.
1407 vhffggeegeeeg.
1408 vhffgggegggeg.
1409 vhffgeeegeeeg.
1410 vhfffffffffffg
1411 kkk@kkkkkkk@kk
1412 kk@@@kkkkk@@@k
1413 .k@@@.kkk.@@@k
1414 ..@@@.....@@@.
1415 ...@.......@..
1416 vvvvvvvvvvvvvv
1417 Bonus:
1418 ....5....5....
1419 ..............
1420 ~.............
1421 ..w.......*...
1422 .......!......
1423 ....j........{
1424 .....???.???.p
1425 *....~.?~?.~..
1426 .w....??c???..
1427 ......g?...?<.
1428 ...<.???w???..
1429 ..>.+-..j.-+>.
1430 000.0000000.00
1431 00...00000...0
1432 .0....fff....0
1433 ..............
1434 ..............
1435 0.0.0.0.0.0.0.
1436 Level:
1437 John van Hooff
1438 Limousine
1439 Bricks:
1440 .jjj..vv..jjjj
1441 jjjjjjvvjjjj..
1442 .jjjj.vvjjjjj.
1443 ..jj..vv.jjjjj
1444 f.....vv...jjj
1445 @f....vv....j.
1446 @fvvvvvvvvvvv@
1447 ff.iiiii.....@
1448 f..ivivvi....@
1449 f.divivvvi....
1450 ..iivivvvvi...
1451 .iiiiiiiiiii..
1452 dii@iiiiii@iij
1453 ii@@@iiii@@@ii
1454 ..@@@.ii.@@@..
1455 vv.@.vvvv.@.vv
1456 kkkkkkkkkkkkkk
1457 kkkkkkkkkkkkkk
1458 Bonus:
1459 .*....44......
1460 &.00?...?00l..
1461 ...........*f.
1462 ......44.c...&
1463 *.............
1464 ......44....-.
1465 ..............
1466 ...1..........
1467 ..............
1468 ...+.*........
1469 .....1........
1470 .-j.?..1.?.*..
1471 !............d
1472 .....}.w1.....
1473 ......lf......
1474 ><...<>><...<>
1475 00000000000000
1476 ..............
1477 Level:
1478 John van Hooff
1479 Traffic Light
1480 Bricks:
1481 @.....@.....@.
1482 ..............
1483 ..............
1484 .###v###v###..
1485 .#d#.#x#.#e#..
1486 .#d#.#x#.#e#..
1487 .#e#.#d#.#x#..
1488 .#e#v#d#v#x#..
1489 .#x#.#e#.#d#..
1490 .#x#.#e#.#d#..
1491 .###.###.###..
1492 vv#vvv#vvv#vvv
1493 ..#...#...#...
1494 ..#...#...#...
1495 ..#...#...#...
1496 ..#...#...#...
1497 vv#vvv#vvv#vvv
1498 k###k###k###kk
1499 Bonus:
1500 ..............
1501 ..............
1502 ..............
1503 ....p...w.....
1504 ......!.......
1505 ..............
1506 ..........l...
1507 ....m...m.....
1508 ..l...........
1509 ..!.......!...
1510 ..............
1511 .?..?...?...?.
1512 ..............
1513 ..............
1514 ..............
1515 ..............
1516 .0.0.0.0.0..0.
1517 ..............
1518 Level:
1519 John van Hooff
1520 A.T.B.
1521 Bricks:
1522 hhh........e..
1523 .j.......jj.e.
1524 .jjjjjjjjj...e
1525 .j.......j...e
1526 .d......jj.e.e
1527 .j.....j.j.ee.
1528 .j....j..j....
1529 .jj..j...jj...
1530 ..j.j.....j...
1531 ..jj......jg..
1532 .jj........jj.
1533 .kk...j....kk.
1534 k.jk...j..kj.k
1535 k.jjjjjjjjjj.k
1536 k..k...j..k..k
1537 k..k....j.k..k
1538 .kk........kk.
1539 zzzzzzzzzzzzzz
1540 Bonus:
1541 ...........5..
1542 .5.......l....
1543 ...?.?.?.0...p
1544 .!.......0....
1545 .*......20.j.s
1546 .0.....2.0..c.
1547 .0....2..0....
1548 .0s..2...0....
1549 ....j.....!...
1550 ..?2.......*..
1551 ..2.........?.
1552 .&~...}....~g.
1553 ...g...+......
1554 ..ffffffffff..
1555 -..c...+.....-
1556 ........{.....
1557 ..............
1558 <><><>w><><><>
1559 Level:
1560 John van Hooff
1561 Nerly Finish Up
1562 Bricks:
1563 #****@@*****kk
1564 #****@@*****#k
1565 d##*******###k
1566 ***#******#ffk
1567 ***#*****##ffk
1568 **#******#kkkk
1569 ***#****######
1570 ***#**###!!!!!
1571 @**#**@!!!!!!!
1572 @*#***@!!!!!!!
1573 ***#***##!!!!!
1574 ****#***#!!!!!
1575 *********#!!!!
1576 **aa******###!
1577 *aaaddd****ddz
1578 ##aviii######!
1579 ...#####x...#.
1580 ..#.....##.##.
1581 Bonus:
1582 ............fl
1583 .............!
1584 m............+
1585 ...........l?j
1586 ...........!fl
1587 ..........lf~5
1588 ..............
1589 ..............
1590 ..............
1591 ............*.
1592 ..............
1593 ..............
1594 ..............
1595 ..............
1596 ...........-s+
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601
1602 All's Well That End Well
1603 Bricks:
1604 *.....vv.....*
1605 ..............
1606 @.!.E.@@.E.!.@
1607 @.....vv.....@
1608 @.....vv.....@
1609 @.....vv.....@
1610 @.!...vv...!.@
1611 ......**......
1612 vvvvvvvvvvvvvv
1613 e............e
1614 @....vvvv....@
1615 ......EE......
1616 xxxxxxxxxxxxxx
1617 ..............
1618 @.EE.@@@@.EE.@
1619 @............@
1620 @............@
1621 vvvvvvvvvvvvvv
1622 Bonus:
1623 ......55......
1624 .222......222.
1625 .2.2......2.2.
1626 .222..33..222.
1627 ......mm......
1628 ......33......
1629 ......33......
1630 ..............
1631 .?.?!?pp?!?.?.
1632 ..............
1633 .....gwwg.....
1634 ..............
1635 }+333jllj333+}
1636 ..............
1637 ..............
1638 ..............
1639 ..............
1640 dd><dd++dd<>dd
0 Version: 1.00
1 Level:
2 Spockl
3 Nerveous breakdown
4 Bricks:
5 zzzzzzzzzzzzzz
6 zzzzzzzzzzzzzz
7 zzzzzzzzzzzzzz
8 z.............
9 zzzzzzzzzzzzzz
10 zzzzzzzzzzzzzz
11 zzzzzzzzzzzzzz
12 zzzzzzzzzzzzzz
13 z.............
14 zzzzzzzzzzzzzz
15 zzzzzzzzzzzzzz
16 zzzzzzzzzzzzzz
17 z.............
18 zzzzzzzzzzzzzz
19 zzzzzzzzzzzzzz
20 zzzzzzzzzzzzzz
21 zzzzzzzzzzzjjj
22 EEEEEEEEEEEjjj
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 .ggggg....gggg
32 ..............
33 bbbbbbbbbbbbbb
34 }}!}}}!}}!}}}}
35 j}}!}!}}!}}!..
36 j.............
37 g!g!g!g.g.g!gg
38 b*b*b*b*b*!*b*
39 *b*b*!*b*b*b*b
40 wwwwwww!www}ww
41 ...........www
42 Level:
43 Spockl
44 Welcome to juniper hill
45 Bricks:
46 EEEhhhhhEEEEEE
47 EEE.hhhEEEEEEE
48 EEEEhhh.EEEEEE
49 EEEEhhhhhhhEEE
50 EEEhhhhhhhhhhE
51 EEEhhhhhhhhhhE
52 EEEhhhh.EE...E
53 EEEE...EEEE.EE
54 EEEE...EEEE.EE
55 EEEi...iEEE.EE
56 EEEi...iEEE.EE
57 EEEE...EEEE.EE
58 EEEE...EEEE.EE
59 EEEE...EEEE.EE
60 EEEi...iEEE.EE
61 EEEi...iEEiiiE
62 EEEE...EEEiiiE
63 EEEE...EEEEEEE
64 Bonus:
65 ....*l*l......
66 ..............
67 ......?.......
68 .......?......
69 .....?.?....l.
70 .......?....l.
71 ....gw>.......
72 ..............
73 ..............
74 ...!...!......
75 ...w...w......
76 ..............
77 ..............
78 ..............
79 ...f...f......
80 ...w...w..555.
81 ..........555.
82 ..............
83 Level:
84 Spockl
85 Rubbercell 1
86 Bricks:
87 @@@@@@@@@@@@@@
88 @jjjjjjjjjjjj@
89 @j...!!!!...j@
90 @j...!!!!...j@
91 @j.@.jjjj.@.j@
92 @j.@.j@@j.@.j@
93 @j.@.j@@j.@.j@
94 @j...j@@j...j@
95 @jkkkjkkjkkkj@
96 @jjjjkkkkjjjj@
97 @j...j@@j...j@
98 @j...j@@j...j@
99 @j...j@@j...j@
100 @j...jjjj...j@
101 @j..........j@
102 @j..........j@
103 @j..........j@
104 @j..........j@
105 Bonus:
106 ..............
107 .5lll5555lll5.
108 .5...ffff...5.
109 .5..........5.
110 .5...>55>...5.
111 .5...>..>...5.
112 .5...>..>...5.
113 .5...5..5...5.
114 .5c--jccj--c5.
115 .>>>>cllc>>>5.
116 .5...+..+...5.
117 .5...+..+...5.
118 .5...>..>...5.
119 .5...+>>+...5.
120 .5..........5.
121 .5..........5.
122 .>..........>.
123 .>..........>.
124 Level:
125 Spockl
126 Try to escape
127 Bricks:
128 k....EkkEkkkkk
129 k.!!EckkEE!!kE
130 kE!!!!**!!!!kk
131 k.EE.ccc.cc*kk
132 k..gggkkggg*kk
133 .EEEEE***E**kk
134 k..kggkkggkkkk
135 k...EEEEEEEEEk
136 kk..ggabggz.Ek
137 kkk.ggkkgg.k.E
138 EEEEEEEEE..k..
139 kkk...kkg..kkk
140 .kk........kkk
141 kkkgEggggg.hEk
142 kkkgEEEEEEEEEE
143 .kkeeegEeeekE.
144 E.keeeggeeek..
145 ******Eg...EE.
146 Bonus:
147 b.....ll.bbbbb
148 b.*j.bll..j.b.
149 w.f!!!bb!!!fbw
150 *....bbb.bbbb*
151 c..+55c-55+b*b
152 ......bbb.bbb.
153 c..f4!-c!4fb*w
154 *............*
155 ww..3f*wf3w..w
156 wwb.22c-22.b..
157 ...........c..
158 cw&...*w1..&ww
159 .wc........c*w
160 ww**bbwwbb.w.w
161 wgwf.......w..
162 .g>w00+.00w>w.
163 ..>w0+>>+0w>..
164 wwwwww.+......
165 Level:
166 Spockl
167 Rubbercell 2
168 Bricks:
169 @@@EE@@@@EE@@@
170 EiiiiiiiiiiiiE
171 EijjjjEEjjjjiE
172 Eij@@jjjj@@jiE
173 Eij@ijjjji@jiE
174 @i.@ij@@ji@.i@
175 @i.@ij@@ji@.i@
176 @i.Eij@@jiE.i@
177 @i.Ei....iE.i@
178 @i.Ei.cc.iE.i@
179 @@.Ei....iE.@@
180 @ijEij.@jiEji@
181 @i.@ij@@ji@.i@
182 @i.@ij@.ji@.i@
183 @ij@ijjjji@ji@
184 @i.@i....i@.i@
185 @i.ii....ii.i@
186 @i..E....E..i@
187 Bonus:
188 ..............
189 .!b.ffffff.b!.
190 ..llll..llll..
191 ..............
192 .lc..WggW..cl.
193 .l...W..W...l.
194 .>...W..W...>.
195 .>..........>.
196 .>..........>.
197 .w..!.ll.!..w.
198 ..............
199 ....5g..g5....
200 ....5>..>5....
201 ....5>..>5....
202 ....555555....
203 .c..5....5..c.
204 .c.cc....cc.c.
205 .5..........5.
206 Level:
207 Spockl
208 Recreationcenter
209 Bricks:
210 ghh@@@hhhhhE@E
211 ghh...h...hhh@
212 .h....h.....hE
213 @h....h.....hE
214 @h..hhhhh..hhh
215 @h...hhh..Eh.h
216 @h....h...Eh.h
217 @h........EE.h
218 @bbbbbbbbbEh.h
219 @bbbbbbbbbEh.h
220 @cccccccccEh.h
221 @cccccccccEh.h
222 @gggggggggEh.h
223 @gggggggggEh.E
224 @gggggggggEh.h
225 @h@@ggg@@hEh.h
226 @ggg*g*gggEh.h
227 EEEEEEEEEEEh.h
228 Bonus:
229 m.....44444...
230 m.....4...44&.
231 ......4.....&.
232 ......4.....&.
233 ....44444..4&4
234 .....444...w.w
235 ......g....w.w
236 ...........4.4
237 .b0b0b0b0b.4.4
238 .000!000!0.4.4
239 .111111111.4.4
240 .111111111.4.4
241 .*22*22*22.4.4
242 .222222222.4.4
243 .lllljllll.w.w
244 ...........w.w
245 .b..lll..b.w.w
246 ...........w.w
247 Level:
248 Spockl
249 Drug-Locker
250 Bricks:
251 .*jjjjgjjjjj*@
252 .cjjjcgcjjjcj.
253 .cjejcgcjejcj.
254 .cjejcgcjejcj.
255 .ceeecgceeecj.
256 .cjejcgcjejcj.
257 .cjejcgcjejcj.
258 .cjjjcgcjjjcj.
259 .cccccgcccccj.
260 .cccccgcccccj.
261 .gggggggggggg.
262 ..............
263 ..............
264 .........z....
265 @.....@.....EE
266 h.............
267 EE............
268 @z@z@........@
269 Bonus:
270 ....llmll.....
271 .g....b.....g.
272 ......b.......
273 ......b.......
274 .>.l.....l.>..
275 .>.........>w.
276 .>.........>..
277 .>.........>w.
278 ...+++g+++....
279 ......g.......
280 .>&&&ggg&&&&>.
281 ..............
282 ..............
283 .........w....
284 ..............
285 w.............
286 ..............
287 ..............
288 Level:
289 Spockl
290 Infusion
291 Bricks:
292 ggg..........@
293 jggiiiiiiiii..
294 ggg........i..
295 ggg........i..
296 jgg........i.@
297 ggg...@EE..i..
298 ggg...z....i..
299 jgg...z....i..
300 ggg...z....i..
301 ggg...@z@.did.
302 jjg....Ez.cdc.
303 gggg@...z.c*c.
304 jjggE...z.ccc.
305 ggggz...@..c..
306 jjggz.........
307 g**gz.........
308 g**gEfffffffff
309 EEEE@ffffffff@
310 Bonus:
311 ..............
312 ..>g>w>w>g>g..
313 ...........>..
314 ...........g..
315 >>>........>..
316 5g5........g..
317 ...........>..
318 ......w....g..
319 .<.........>..
320 ..........5g5.
321 ..........5*5.
322 ........w.5g5.
323 ..........555.
324 5555.......j..
325 5555..........
326 5555..........
327 llll.000000000
328 .....00000000.
329 Level:
330 Spockl
331 Nurses Restroom
332 Bricks:
333 !!!!!!EE!!!!!!
334 !!!!!!EE!!!!!!
335 !!!!!!EE!!!!!!
336 @.....@@.....@
337 E............E
338 ..............
339 ..............
340 ...d......d...
341 ..d*d....d*d..
342 .jjjjj..jjjjj.
343 jjjjjj..jjjjjj
344 jjjjjjjjjjjjjj
345 jjjjjjjjjjjjjj
346 jjjjjjjjjjjjjj
347 jjjjjjjjjjjjjj
348 jjjjjjjjjjjjjj
349 EjjjjjEEjjjjjE
350 ..............
351 Bonus:
352 ffflll..lllfff
353 ..............
354 ...++d..d++...
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 ..............
364 ..............
365 ..............
366 ..+++....+++..
367 .ggggg..ggggg.
368 .ggggg..ggggg.
369 ..............
370 Level:
371 Spockl
372 Flatline
373 Bricks:
374 jjjjjjjjjjjjjj
375 jjjjjjjjjjjjjj
376 jjjjjjjjjjjjjj
377 EE.EEEE.EEE.EE
378 vvvvvvvvvvvvvv
379 vvvvvvvvvvvvvv
380 hhhhhhhhhhhhhh
381 vvvvvvvvvvvvvv
382 vvvvv!vvvvvvvv
383 jEEEEjjjjEEEEj
384 j............j
385 EEEE......EEEE
386 jejE......Ejej
387 eee........eee
388 jej........jej
389 jjj........jjj
390 E............E
391 ..............
392 Bonus:
393 +m+m+m+m+m+m+m
394 lll55555555lll
395 ll5555555555ll
396 ..............
397 >>>>>>>.>>>>>>
398 ..............
399 .***......***.
400 ......gg......
401 >>>>>!gg!>>>>>
402 m....>->-....m
403 ..............
404 ..............
405 >>>........>11
406 ww3........1p&
407 ww3........1p&
408 ++3........1p.
409 ..............
410 ..............
411 Level:
412 Spockl
413 X-RAYs
414 Bricks:
415 @@@@@@@@@@@@@@
416 @vvEhhhhhhEvv@
417 @.vEhvvvvhEv.@
418 @.vEvvvvvvEv.@
419 @.vEvgvvgvEv.@
420 @.vEvvvvvvEv.@
421 @.vEvvvvvvEv.@
422 @.vEvvvvvvEv.@
423 @.vEvdvvdvEv.@
424 E..EvvddvvE..E
425 @..EvvvvvvE..@
426 @..EEvvvvEE..@
427 @v....jj....v@
428 @v...jjjj...v@
429 @v..vvjjvv..v@
430 @v..jjjjjj..v@
431 @vvvvvjjvvvvv@
432 @@..jjvvjj..@@
433 Bonus:
434 ..............
435 .!!.llllll.!!.
436 ....l5555l....
437 ..*...ww...p..
438 .....bggb.....
439 ..............
440 ..............
441 ..............
442 ..+..g!!g..+..
443 ....j&gg&j....
444 ....+wwww+....
445 .....>>>>.....
446 .g....55....g.
447 .c...4444...c.
448 .c..333333..c.
449 .c..22w+22..c.
450 .c..111111..c.
451 ....000000....
452 Level:
453 Spockl
454 Deliriouse
455 Bricks:
456 vvvvvvvvvvvvvv
457 *vvvvvvvvvvvv*
458 *vvvvvvvvvvvv*
459 vvvvvvvvvvvvvv
460 vvvv!!!!!vvvvv
461 vvvvvvvvvvvvvv
462 vvvvEE*EEvvvvv
463 !vvvhhhhhvvvv!
464 !vvv.....vvvv!
465 !!vv.....vv!!v
466 !!vv.....vv!!v
467 !!vvh...hvv!!v
468 vvvv.....vvvvv
469 vvvv.....vvv!!
470 vvvvh...hvvvvv
471 vvvv.....vvvvv
472 vvvvh...hvvvvv
473 vvvv.....vvvvv
474 Bonus:
475 ll-l>l>l>l-lll
476 *!5!5!5!5!5!5*
477 *44>5>5>5>544*
478 -{{{{{{{{{{{{-
479 >{!>>>{>>>!{{>
480 {{1wwwwwww1{{{
481 >>1w..>..w1>>>
482 {{1w.*.*.w1{{{
483 {{1w.....w1{{{
484 ..1w.....w1..{
485 ..!w.....w!..{
486 ..1w*...*w1..{
487 {{1w.....w1{{{
488 {{1w.....w1{..
489 gggw*...*wgggg
490 ***w.....w****
491 wwww*...*wwwww
492 wwww.....wwwww
493 Level:
494 Spockl
495 Stairways to doom
496 Bricks:
497 kkiiiiiii#EEE!
498 kkkiii!!!@!!#!
499 E#kkkk!!!@!!i#
500 kEEE#kkkk@iiik
501 k!!!EEE#kkkiik
502 k!!!@!!EEE#k*k
503 k!!!@!!!!!!!*h
504 kE!!@!!!!!!!*k
505 h!!!@!!!!!!kkk
506 k!!!@!!!kkkk#E
507 k!!!@kkkk#.EEk
508 k!!k@k#EEEEkkk
509 aa@#EEEEkkkkkk
510 kggggggggggggE
511 kkkggggggggggh
512 .#kkkkkkkkkkkk
513 #EE.#kkkkkkkkk
514 ##EEEE@#kkkkkk
515 Bonus:
516 mmlllllll.....
517 mmmbbj....mm..
518 ..mbbj....mmm.
519 .....j....mmm.
520 .mmm.......mm.
521 .1mbb11.....b.
522 .1mbb11bb111b*
523 .1mbb11mb111b.
524 *1mb+11mb11ff.
525 g1mb1111.ff...
526 m1mb1........m
527 .1m........mm>
528 .1......+mm+mm
529 .0000-000bbb0.
530 ww.0>->00bpb0*
531 ..w00-000bbb00
532 .....-00wwwwww
533 ........*++++*
534 Level:
535 Spockl
536 Pathologie
537 Bricks:
538 *ffff!fffff!f*
539 !ffff!!!!!!!f!
540 !ffffffffffff!
541 !ffffffgggfff!
542 !fffffgggggff!
543 !fffffgegegff!
544 !fffffgggggff!
545 !fffffggeggff!
546 EffEgffgggffgE
547 hhfEgffgggffgE
548 hhfEgffeeeffgE
549 hhfEgfffffffgE
550 ..fEgggggggggE
551 !.fEgfffffffgE
552 !.fEgfffffffgE
553 !.fEgfffffffgE
554 !.fEfffffffffE
555 ..fEvvvvvvvvvE
556 Bonus:
557 ll>>~{{{{{{{ll
558 5>>>~{55555{m5
559 5>>>~{>>>>>{>5
560 5..>~{>!!!>{>5
561 5..>.c!...!c>5
562 5..>.c!5.5!c>5
563 5gg{{c!...!c>5
564 5gg}.c!.5.!c>5
565 .g!..c~...~cf.
566 &&g..c~...~cf.
567 &&!..c~{{{~cW.
568 ww+.fcccccccf.
569 ..w.ff..f..ff.
570 *.+.W...j.....
571 ..g.f.........
572 ..+.f.......f.
573 ..g..j.....j..
574 ..g.>>>>>>>>>.
575 Level:
576 Spockl
577 Virus-Labs
578 Bricks:
579 e!!v!!!!!!v!!e
580 !v....vv.v...!
581 !..v.vv.....v!
582 !.....vv.....!
583 !v...vv.v.v..!
584 !.....v.....vv
585 v.v...vv.....!
586 !!!!!!v..v.v.!
587 !vvvvvvvvvvvv!
588 !......v!!!!!!
589 !v.i...v.....v
590 !.iiiv.vviiv.!
591 !..i...v.....!
592 !......v.....!
593 v.v..v.vv..v.!
594 !iiviigviiiiii
595 vkkkkkkkkkkkkv
596 jjjjjjjjjjjjjj
597 Bonus:
598 l.??.?....?..l
599 .?....??.?....
600 ...>.!......??
601 .......>......
602 ??...?!...>...
603 ............!g
604 g.!....?......
605 ....?....?.?.?
606 .bWgbWbWbWbWb.
607 .......!?.?...
608 ??.....?.....g
609 ...?.?.!?.?!..
610 .......?......
611 .......!.....?
612 g.>..?.!?..?..
613 .dd?dd.Wddd.dd
614 ?>b>b>b>b>b>bW
615 +b>+>+++>+>b+>
616 Level:
617 Spockl
618 Assoziations
619 Bricks:
620 EEEEEE@@EEEEEE
621 @!!@ee@.ee@!!@
622 g!!Eee.@eeE!!g
623 @E!iee@.eei!E@
624 g!!iee.@eei!!g
625 @EEiee@.eeiEE@
626 g!!ieeeeeei!!g
627 @E!ieeeeeei!E@
628 @@.@@evve@.@@@
629 gdddddvvdddddg
630 EEddddddddddEE
631 gddddddddddddg
632 EEddddddddddEE
633 gdddddE.dddddg
634 EEdddd.EddddEE
635 @@EdddE.dddE@@
636 gggggg.Egggggg
637 @ffffgE.gffff@
638 Bonus:
639 ..............
640 .ll.1l..l1.ll.
641 W00.11..11.00W
642 .00411..11400.
643 b>>>>>..>>>>>b
644 .00411..11400.
645 W00c115511c00W
646 .00411~~11400.
647 ......55......
648 b2.2f~55~f2.2b
649 .g2f22**22f2g.
650 {b2-222222-2b{
651 .1*11{!!{11*1.
652 {1111p..p1111{
653 .0<000..000s0.
654 ...>>>..>>>...
655 {w00+0..0+00w{
656 .w000W..W000w.
657 Level:
658 Spockl
659 Recreation 2
660 Bricks:
661 !!!!!!!!!!!.dd
662 !!!!!!!!!!!Edd
663 !!!!!!!!..E.E.
664 !!!!!!!!......
665 !!!!!!!!..hhh.
666 !!!!!!!!......
667 !!EEE!!!E.....
668 gggEhhhhhE!!.E
669 gggEhhhhhE....
670 ggEEhh*hEE..!!
671 gggEEh*hhE....
672 ggg.hh*hEE!!.E
673 ggEEhh*hhE....
674 gggEEh*hEEE.!!
675 ggEEhh*hhE....
676 gggEEhhhEE!!.E
677 ggg.hhhhhE....
678 EEEEEEEEE...!!
679 Bonus:
680 ******wwww+.ll
681 .b....wgggg.ll
682 }b}.}.wg......
683 >>>>>>>g......
684 ......wg..+++.
685 }b.}..wg......
686 .b....wg......
687 ggg.g...g.}}..
688 www.bbbb>.....
689 ....b}*}....ww
690 ..w..}*}>.....
691 *>w.w}*}..*w..
692 *>..w}*}>.....
693 *>*..}*}....*g
694 *>..b}*}>.....
695 .....}}}..j*..
696 ....bwww>.....
697 ............ww
698 Level:
699 Spockl
700 Highsecuritycell
701 Bricks:
702 EEEiiiiiiiiiEE
703 Evvv######vvvE
704 Ev###vvvvvvvvE
705 Evvvvvvvv.#EvE
706 @vvg..Ev..#.v@
707 EEvg#.vv..#.vE
708 @vvg#.vvE.#.vE
709 @#E##gggg.##vE
710 vv@#.gggg...vE
711 vvv..gggg...EE
712 vvvE##ggg.....
713 EvEE.gggEEEgEE
714 vvvEvvEE..EgEg
715 vvvEvEggggggEv
716 EvvEvEggggggEv
717 vvvEE@gg.EEEvv
718 vvvvvEgg@vvvvv
719 EggEEggggEgggg
720 Bonus:
721 ...mllmlll....
722 ...0......0.*.
723 ......gg......
724 .....*gg*.....
725 ...b..........
726 ..*b..ww......
727 ...b..........
728 .....w>>w.....
729 .*...w++w...*.
730 .44..w>>w.....
731 .4w...**w.....
732 .w...www...&..
733 .4*.44.....&.*
734 .44.4.ww}*.w.w
735 .w4.*.ww}*.w.5
736 .55...ww....55
737 .555*.ww.*555+
738 .....wggw.00++
739 Level:
740 Spockl
741 Paranoia open
742 Bricks:
743 ggggggcceeeeee
744 ggggggcceeeeee
745 ggEb@EEeeeeEee
746 ggEg.ggeeeeEee
747 gggE.ggeeeeEee
748 ggEg.gg.@EEEee
749 ggbg.ggee.eEee
750 *gEg.ggee.eEe*
751 ggEg.ggee.ebee
752 ggEEE@.ee.Eeee
753 ggEggggee.eEee
754 ggEggggee.eEee
755 gEEgggg.@EEEEe
756 zbEggggeeeeEbz
757 ggEgEggeeeeEee
758 EgE.EEEeeeEEe@
759 ..............
760 ..............
761 Bonus:
762 !!llllbbllll!!
763 ...f..bb..f.?.
764 .?..........?.
765 .?.}.55.....?.
766 .?g..5gg....?.
767 .?.*.55.....g.
768 &&.5.555f.{.>>
769 jw.5.55!5.5.sj
770 >>.*.5}55.5.>>
771 .......5f.5...
772 l..lllwll.5..l
773 gg.1111{5.!.gg
774 l..11w1......l
775 ...11110000...
776 w+.11c100c0.-W
777 .+.....0000.-.
778 ..............
779 ..............
780 Level:
781 Spockl
782 Too much little helpers
783 Bricks:
784 vvvvvvvvvvvvvv
785 vvkkkvkkvkkkvv
786 vk*kkk**kkk*kv
787 vkk*k*kk*k*kkv
788 vkkg*kggk*gkkv
789 vk!!!!!!!!!!kv
790 vk!!!*!!!!!!kv
791 vk!!!!!!!*!!kv
792 v*.!!!*!*!!.*v
793 vk.*!!!**!!.kv
794 vk..........kv
795 vk!........!kv
796 vk!........!kv
797 vk!........!kv
798 vk!........!kv
799 vkkk......kkkv
800 vkk*......*kkv
801 vkkk......kkkv
802 Bonus:
803 l.....gg.....>
804 >>>>>>>>>>>>>>
805 *>>>>>>>>>>>>*
806 *>>>>>>>>>>>>*
807 >>.>..--..>.>>
808 >>>>>>..>>>>>>
809 >>..........>>
810 >>..g.......>>
811 >>.>..>5..>.>>
812 >>..g-5g-g-.>>
813 >>..........>>
814 >>>........>>>
815 >>>........>>>
816 >>>........>>>
817 >>..........>>
818 >>>>......+++>
819 +++>......>>>>
820 g>>g......g>>>
821 Level:
822 Spockl
823 Lemontree
824 Bricks:
825 @@gggggggggg@@
826 @gggggghggggg@
827 !!!!!.hdh.!!!!
828 !!!..hhhhh..!!
829 !!..hdh@dhh..!
830 !...hhh@hhdh.!
831 !..hhh@@hhh..!
832 !...hh@@hhh..!
833 !...dhh@@hhh.!
834 z..hhhh@hhh..z
835 z..hhh@*@dhh.z
836 ..hhdh@*@hh..z
837 z....h@*@h....
838 z.vv..@*@.vv.z
839 z.....@*@....z
840 .!....@*@...!@
841 zffff@@*@fffff
842 @zfff@@*@fffzz
843 Bonus:
844 ..l.>>>>>..l..
845 ..>.w..l..c.{.
846 5.....!4.....5
847 5.....l.l....5
848 5...-4..4....5
849 g.......!.4-.g
850 >....+.......>
851 g....>...>...g
852 >...4.....>!.>
853 >..{.-..+....1
854 1...!-.f.w.{.!
855 ..{{w..b..{..1
856 1....{.W.{....
857 !.WW...w..WW.1
858 1......w.....1
859 .-.....g....s.
860 >0>00..w.0>>0>
861 >>00...>..00>g
862 Level:
863 Spockl
864 Nothing to meassure
865 Bricks:
866 gggggggggg!!!!
867 !......!!..!!!
868 !zzEEE.!!..@@@
869 !!!!!E.!!EEz!!
870 @@@@!E!!!!Ez!!
871 gggggE!!!!Ez!!
872 !zzzEEzzzzzz!!
873 !..!!!!!!!!E!!
874 !..!@@@@@@!E!!
875 !..!gggggggE!!
876 !......EEEEE!!
877 !!!!!!!!!!!!!!
878 !!@@@!!!!!!!!!
879 !!gggg!!@@@@!!
880 !!!!EEE!ggggg!
881 @!..zzE...!!!!
882 @!..zzz...!!!!
883 g!..zzz...!@@!
884 Bonus:
885 l...>g>..l....
886 ...........{.l
887 ..............
888 ..&>g.........
889 .......>>.....
890 w.....W..W...g
891 ..............
892 ...}..{..*...>
893 >..f....j....g
894 g..g+..wf.+...
895 ..............
896 ..{.-*.......+
897 .f.....}-..{..
898 g.>g>w.~....W~
899 !-.....W>g>bW}
900 .W...........!
901 .>........!bbb
902 b+........+..w
903 Level:
904 Spockl
905 Changing bathes
906 Bricks:
907 E!!!!!!!!!!!!!
908 EEE!!!!!!!!!!!
909 EggEEiiEEEvvv!
910 .gggiiiEffvvE!
911 .gggiiiEEEevEE
912 .EEzEiiieeeeeE
913 !EE.EiiiieeeeE
914 !.E.EiiEzEeeeE
915 !.E.EiiE.EeeeE
916 !...EiiE.EeeeE
917 !...EiiE.EeeeE
918 !...EEz@.EeeeE
919 !@.....E.EeeeE
920 aE.......EeeeE
921 aaE......Eeee@
922 bbbE.....@EzEE
923 bbbbE........g
924 c@cccE.......@
925 Bonus:
926 .l.fg.ff.gfg.f
927 ......g.g.....
928 .ff..ff....*.j
929 .00>-3l.>>....
930 .>0>-!3...f...
931 ...w.33>>+5>l.
932 .....33>>+!5>.
933 g....>>.w.555.
934 >....33...>>>.
935 g....33...555.
936 >....l3...555.
937 g.....w...5f5.
938 >.........555.
939 d.........555.
940 dd........l5+.
941 ...........w..
942 >>>>.........*
943 w.wdd.........
944 Level:
945 Spockl
946 Administration-Office
947 Bricks:
948 vvvvvvvvvvvvvv
949 vj..........jv
950 vj.@@@....@@jv
951 vj..........jv
952 vjjjjjj..jjjjv
953 @@@@@@@..@@@@@
954 @vvvvvvvvvvvv@
955 vvvvvvvvvvvvvv
956 v..v..v..v..v.
957 v..v..v..v..v.
958 v..v..v..v..v.
959 v..v..v..v..v.
960 vjjvjjvjjvjjvj
961 gjjgjjgjjgjjgj
962 jjjjjjjjjjjjjj
963 jjjjjjjjjjjjjj
964 ..............
965 ..............
966 Bonus:
967 ll...g..g...ll
968 .?..........?.
969 .?..........?.
970 .?..........?.
971 .?>>>>?..>>>?.
972 ..............
973 .>>>g>>>>>g>>.
974 wW>w>jwj>w>>w>
975 p..+..b..s..<.
976 }..>..}..>..<.
977 >..>..>..>..}.
978 >..+..>..b..>.
979 g+-g+-g+-g+-g+
980 w>{>{>w>{>{>w>
981 >{>>>>>>>{>{>{
982 ?!?!?!?!?!?!?!
983 ..............
984 ..............
985 Level:
986 Spockl
987 Finaly free and sane
988 Bricks:
989 iiiaiiaaiiiaia
990 iaaaiaiaiaaaia
991 iaaaiaiaiaaaia
992 iiiaiiaaiiiaia
993 iaaaiaiaiaaaia
994 iaaaiaiaiaaaia
995 iaaaiaiaiiiaia
996 vvvvvvvvvvvvvv
997 vvvvviiiivvvvv
998 !!*EEiiiiEE*!!
999 !*!!EiiiiE!!*!
1000 !!!!@iiii@!!!!
1001 *!!EiiiiiiE!!*
1002 @@!EiiiiiiE!@@
1003 !!@@iiiiii@@!!
1004 @!!!iiiiii!!!@
1005 !!!!ii..ii!!!!
1006 @EEEii..iiEEE@
1007 Bonus:
1008 >>>.>>>.>>>...
1009 ....-.-.-.....
1010 ....-.-.-.....
1011 >>>.>>..>>>.>.
1012 g...!.g.g.....
1013 >...W.W.W...W.
1014 c...w.{.w!>.>.
1015 ......gg......
1016 ....+>>>>+....
1017 55...*WW*...55
1018 555..!!!!..555
1019 555..>>>>..555
1020 lll.>>>>>>.lll
1021 .....+..+.....
1022 ..............
1023 ..............
1024 ....g....g....
1025 ....ww..ww....
1026 Level:
1027 Spockl
1028 Depression again
1029 Bricks:
1030 @vvvvvvvvvvv@!
1031 vvvvvvvvvvvvv!
1032 vvvvvvvvvvvvv!
1033 vvvvvvvvvvvvv!
1034 vvvvvvvvvvvvv!
1035 ..............
1036 ..............
1037 .vEvEEvEzz....
1038 .vEv!!vEgzvvv.
1039 .vEv!!vEzzvvv.
1040 .vE!EE!E......
1041 ..............
1042 ..............
1043 vv.vvvvvvvvvv.
1044 vv.vvvvvvvvvv.
1045 vv...vvvvvvv..
1046 vvvv.vvvvvvv..
1047 @vv...vvvvvv..
1048 Bonus:
1049 .lllllllllll..
1050 55555555555fW.
1051 ............W.
1052 .fffffffffffW.
1053 .+>>>+>>>+wwW.
1054 ..............
1055 ..............
1056 .>.{..j.......
1057 .>.p}}p.m>{>>.
1058 .>.*ww*.>.>>>.
1059 .w............
1060 ..............
1061 ..............
1062 Wf.wf>>>>>---.
1063 Wf.>>>f!!f-lW.
1064 l>...>!!!!-g..
1065 ----.------l..
1066 .g>...>>>>>g..
1067 Level:
1068 Spockl
1069 Yet back in madhouse
1070 Bricks:
1071 .EEE.E.E.E.E.E
1072 .E.E.E.E.E.E.E
1073 .E.E.E.E.E.E.E
1074 .EEE.E.E.E.E.E
1075 .E.E.EEE.EEE.E
1076 .E.E.E.E.E.E..
1077 .E.E.E.E.E.E..
1078 .E.E.E.E.E.E.E
1079 ..............
1080 EEEEEEEEEEEEEE
1081 Edvvvv..vvvvdE
1082 EdvvveeeevvvdE
1083 Eddddd..dddddE
1084 Eddddd..dddddE
1085 Eddddd..dddddE
1086 Eddddd..dddddE
1087 Eddddd..dddddE
1088 Eddddd..dddddE
1089 Bonus:
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 ..............
1096 ..............
1097 ..............
1098 ..............
1099 ..............
1100 .l...l..l...l.
1101 .....g..g.....
1102 .....0..0.....
1103 .>>>>>..>>>>>.
1104 .ffff0..0ffff.
1105 .~~~~0..0~~~~.
1106 .00000..00000.
1107 .>w{>...>{>+>.
1108 Level:
1109 Spockl
1110 A last, peace
1111 Bricks:
1112 gggggggggggggg
1113 haaaaaaaaaaaah
1114 haaaaa##aaaaah
1115 haaaaa##aaaaah
1116 haaaaa##aaaaah
1117 haa########aah
1118 haaaggggggaaah
1119 haa########aah
1120 haaaaa##aaaaah
1121 haaaaa##aaaaah
1122 haaaaa##aaaaah
1123 haaaaa##aaaaah
1124 haaaaa##aaaaah
1125 haaaaa##aaaaah
1126 haaaaa##aaaaah
1127 haaaaa##aaaaah
1128 haaaaa##aaaaah
1129 haaaaaaaaaaaah
1130 Bonus:
1131 55555555555555
1132 .*j*....*..j*.
1133 .*j*....*..j*.
1134 .*j*....*..j*.
1135 jjjjjj..jjjjjj
1136 ..j........j..
1137 ..j5>55555>j..
1138 ..j........j..
1139 ..jjjj..jjjj..
1140 >>>>>j..j>>>>>
1141 }}}}>j..j>}}}}
1142 j...>j..j>...j
1143 .j**>j..j>**j.
1144 ..j*>j..j>*j..
1145 ...j>j..j>j...
1146 ....jj..jj....
1147 }....j..j....}
1148 gggg.w..w.gggg
1149 Level:
1150 Spockl
1151 The asscendation
1152 Bricks:
1153 ccccih!!hicccc
1154 ccccihddhicccc
1155 EchEihddhiEhcE
1156 ccEEihddhiEEcc
1157 EchEihddhiEhcE
1158 ccEEihddhiEEcc
1159 EchEihddhiEhcE
1160 ccEEihhhhiEEcc
1161 EchEiiiiiiEhcE
1162 ccEEEiiiiEEEcc
1163 EchhEEiiEEhhcE
1164 ccEhhEiiEhhEcc
1165 EcEEEEiiEEEEcE
1166 cccccciicccccc
1167 EcEEgEiiEgEEcE
1168 cchhgEiiEghhcc
1169 EcEhEEiiEEhEcE
1170 EEEEiiiiiiEEEE
1171 Bonus:
1172 mmmmmmmmmmmmmm
1173 ....c....c....
1174 ..}........}..
1175 gl..........lg
1176 .lm........ml.
1177 ml....>>....lm
1178 .mm...>>...mm.
1179 mm....>>....mm
1180 .m}.c.bb.c.}m.
1181 .m...mmmm...m.
1182 .m.}......}.m.
1183 mm..m.mm.m..mm
1184 .}....mm....}.
1185 mm.m.}..}.m.mm
1186 .m....++....m.
1187 wmmmm.++.mmmmw
1188 .m.}..gg..}.m.
1189 ....5www55....
1190 Level:
1191 Spockl
1192 Is that heaven
1193 Bricks:
1194 gggggggggggggg
1195 !eeeeeeeeeeeeg
1196 !eggggggggggeg
1197 !egeeeeeeeegeg
1198 !egeggggggegeg
1199 !egegeeeegegeg
1200 !egegeggegegeg
1201 !egegegdegegeg
1202 !egegegdegegeg
1203 dddddddddddddd
1204 dddddddddddddd
1205 !egegegdegegeg
1206 !egegegdegegeg
1207 !egegeggggegeg
1208 !egegeeeeeegeg
1209 !egeggggggggeg
1210 !egeeeeeeeeeeg
1211 !egggggggggggg
1212 Bonus:
1213 l5l5l5l5l5l5l5
1214 54444444444445
1215 54333333333345
1216 54344444444345
1217 54343333334345
1218 54343444434345
1219 54343433434345
1220 54343432434345
1221 54343432434345
1222 *4*4*4*2*3*3*5
1223 54343432434345
1224 54343432434345
1225 54343432434345
1226 54343433334345
1227 54343444444345
1228 54343333333345
1229 5434+444444+45
1230 54+wb}&cc&}bw+
1231 Level:
1232 Spockl
1233 Borne again
1234 Bricks:
1235 !.....!.......
1236 ...........!..
1237 .........!...!
1238 .!..!.........
1239 ..............
1240 .........!....
1241 !.....!.......
1242 ..!.!......!.!
1243 ........!.....
1244 ..............
1245 !....!........
1246 ..............
1247 ..!.....!..!..
1248 ..............
1249 ..............
1250 ggg...........
1251 ggg...........
1252 ggg...........
1253 Bonus:
1254 g.....g.......
1255 ...........g..
1256 .........g...g
1257 .g..g.........
1258 ..............
1259 ..............
1260 ......b.......
1261 ...........+..
1262 ........b.....
1263 ..............
1264 .....+........
1265 ..............
1266 ..............
1267 ..............
1268 ..............
1269 b.b...........
1270 ggg...........
1271 +++...........
1272 Level:
1273 Spockl
1274 Back in madhouse again
1275 Bricks:
1276 @@@@@@@@@@@@@@
1277 @@vvvvzzvvvv@@
1278 @vvzzv@@vzzvv@
1279 @vzz.@@@@.zzv@
1280 @vz........zv@
1281 @vz........zv@
1282 @vz..@hh@..zv@
1283 @vz..@hh@..zv@
1284 @vz..@hh@..zv@
1285 @vz..@hh@..zv@
1286 @vz..@hh@..zv@
1287 @vz..@gg@..zv@
1288 @vz..gggg..zv@
1289 @vzggggggggzv@
1290 @vzggggggggzv@
1291 @vzz......zzv@
1292 @vvz......zvv@
1293 @@@@......@@@@
1294 Bonus:
1295 .....mmmm.....
1296 .....-mm-.....
1297 .....-..-.....
1298 ..............
1299 ..............
1300 mb..........bm
1301 mb....ww....bm
1302 mb....}}....bm
1303 mb....>>....bm
1304 mb....>>....bm
1305 mb....{{....bm
1306 mb....gg....bm
1307 .....bbbb.....
1308 ..*b>>>>>>b*..
1309 ...b++ww++b...
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 Spockl
1315 Trainee conzentration
1316 Bricks:
1317 !************d
1318 !****.dz.**@.d
1319 !jjjjE...jj..d
1320 !jjjj...EjjE.d
1321 ..E......E...d
1322 !............d
1323 !............d
1324 !***h.zd.**@.d
1325 !hhhhE..Ehh..d
1326 ...E.....E...d
1327 !............d
1328 !..........***
1329 !.iii.dz.**@zz
1330 !....E..E...zz
1331 !.Eggg..gg!Edd
1332 !........g!.**
1333 !ggggE...g!E**
1334 **E*E*...E*E**
1335 Bonus:
1336 .ffffffffffff{
1337 {{>>>.g>.j>...
1338 !fllf....lf..>
1339 *fllf....lf...
1340 ..............
1341 ..............
1342 {.............
1343 !...>.{g......
1344 *fff{....{f...
1345 ..............
1346 .............j
1347 ...........>>>
1348 ......gW.>>...
1349 ............ff
1350 {..-+g..+f}.f!
1351 !.........}.--
1352 *.f.>....W}.ww
1353 --.-.-....-.>>
1354 Level:
1355 Spockl
1356 Lets Party
1357 Bricks:
1358 zzzzzzzzzzzzzz
1359 zzzzzzggggggg*
1360 zzzzzz********
1361 zzzzzz*eeeeee*
1362 zgggzz*eeeeee*
1363 z**gzz*****E**
1364 zgggzz*ddddEd*
1365 zgggzz*ddddEd*
1366 zgggzz*****E**
1367 zgggzz*kkkkEk*
1368 zgggzz*kkkkEk*
1369 zgggzz*****E**
1370 zgggzz*jjjjEj*
1371 zzzzzz*jjjjEj*
1372 zzzzzz*****E**
1373 zzzzzzvvvvvEv*
1374 zzzzzzvvvvvEv*
1375 EEEEEEEEEEEEvv
1376 Bonus:
1377 ..............
1378 5ll.lllllllll.
1379 5bbbb5....!!!!
1380 555.55bbbbbbb.
1381 555.55bbbbbbb.
1382 5bbbb5........
1383 555.55.>>>>...
1384 555.55.!!!!...
1385 5bbbb5........
1386 5ww.55..>>>.>.
1387 5ww.ggggggg.g.
1388 5}}}}}}}}}}.}}
1389 5...ggggggg.g}
1390 5...55.......}
1391 5...wwwwwww.ww
1392 5...5555555.>>
1393 5...5555555.ww
1394 ............ww
1395 Level:
1396 Spockl
1397 Tirejacket
1398 Bricks:
1399 @@@@@@@@@@@@@@
1400 @zzzzzzzzzzzz@
1401 @zzzzzzzzzzzz@
1402 @zzzzzzzzzzzz@
1403 @zzzzzzzzzzzz@
1404 ...........zzz
1405 .............z
1406 zz.zzzzzzzzz.z
1407 zz.zzz.zz.zz.z
1408 zz.zzz.zz.zz.z
1409 zz.zzz.zz.zz.z
1410 zz.zzz.zz.zz.z
1411 zz.zzz.zz.zz.z
1412 zz.zzz.zz.zz.z
1413 zz.zzz.zz.zz.z
1414 zz.zzz.zz.zz.z
1415 zz.zzz.zz.zz.z
1416 zz.zzz.zz.zz.z
1417 Bonus:
1418 ..............
1419 .llllllllllll.
1420 ..............
1421 ..............
1422 .f..f..f......
1423 ...........f..
1424 ..............
1425 ......f..f....
1426 ..............
1427 ..............
1428 ..............
1429 ..............
1430 ..............
1431 ..............
1432 ff.ffg.gf.ff.f
1433 ff.>>g.g>.ff.f
1434 gg.ggg.gg.gg.g
1435 gg.ggg.gg.gg.g
1436 Level:
1437 Spockl
1438 Madness arround
1439 Bricks:
1440 EEEEEEEjjjj***
1441 iiiiiiEjjjj***
1442 iiiiiiEjjhj***
1443 EiiiiiEjjhjE**
1444 EiiEEEEjjhjE**
1445 iiiiiiEjjhjE**
1446 iiiiiEEEjjjEEE
1447 Eddddddddddddd
1448 Edddd****ddddd
1449 Eddddddddddddd
1450 EEeeEEgEEeeEEg
1451 eeeeeEgEeeeeEg
1452 eeeEEEgEEEeeEg
1453 eeeEeEgeeEeeEg
1454 eeEeeegeeEeeEg
1455 eeeeeegEeEeeEg
1456 eeeeeEgEeeeeEg
1457 eEEEEEgEEEEEEg
1458 Bonus:
1459 .......4444444
1460 l4444*......55
1461 lj..w...W...55
1462 ...g.W......5f
1463 .f.....g.wg.ll
1464 f.g......g..jl
1465 ..............
1466 ..f.-!.!-!.f..
1467 ...~......~.f.
1468 .ff.!.f..f...f
1469 ..............
1470 +!.jf...f.j..+
1471 ..f...........
1472 >f+...f.f..*.}
1473 !..!.gw}..!!.w
1474 w>*..}>.-....>
1475 >&..&.w...g&.w
1476 w.....>......>
1477 Level:
1478 Spockl
1479 Brain empty
1480 Bricks:
1481 ***********E**
1482 ***********E**
1483 ***********E**
1484 vvvvvvvvvEEE**
1485 vvvvvvvvvvvE**
1486 ***********E**
1487 @vvvvvvvvvvE**
1488 @vvvvvvvvvvE**
1489 @vvvvvvvvvvE**
1490 vvvvvvvvvvvE**
1491 ***********E**
1492 vvvvvvvvvvvE**
1493 vvvvvvvvvvEE**
1494 vvvvvvvvvvEE**
1495 ***********E**
1496 **************
1497 **************
1498 vv**********vv
1499 Bonus:
1500 l.>>.....l...l
1501 .g>>...>.gg.>>
1502 dddd.g.ddddg>>
1503 ....}.}.....>>
1504 ............{{
1505 .>>>>dddd>>.>{
1506 .....d......dd
1507 .....d......dd
1508 .....l......dd
1509 .....f......dd
1510 >>>>>>>>>>>.>>
1511 ...g..........
1512 ..w......w....
1513 dddd...ddddddd
1514 .-g-d-c-W-5->-
1515 ++->->->->->->
1516 ++>->->->->->-
1517 .{-{-{-{-{-{-.
1518 Level:
1519 Spockl
1520 The end
1521 Bricks:
1522 !!!!!!!!!!!!!!
1523 !!!!!!gg!!!!!!
1524 !!!!!g!!g!!!!!
1525 !!!!!g!!g!!!!!
1526 !!!!!!!!g!!!!!
1527 !!!!!!!g!!!!!!
1528 !!!!!!!g!!!!!!
1529 !!!!!!g!!!!!!!
1530 !!!!!!g!!!!!!!
1531 !!!!!!!!!!!!!!
1532 !!!!!!g!!!!!!!
1533 !!!!!!g!!!!!!!
1534 !!!gg!!!!!!!!!
1535 !!!gg!!!!!!!!!
1536 !!!gg!!!!!!!!!
1537 !!!gg!!!!!!!!!
1538 ..............
1539 ..............
1540 Bonus:
1541 &>**********>&
1542 &***.*ll*.***&
1543 &....l..l....&
1544 &....l..l....&
1545 &.......l....&
1546 &......l.....&
1547 &......l.....&
1548 &.....l......&
1549 &***.*l.*..*.&
1550 &............&
1551 &&&&&&l&&&&&&&
1552 ..**..l..**...
1553 <..++<.<.<><}<
1554 <}}++<.<.<><}<
1555 gggggggggggggg
1556 ...++W+W+W+...
1557 ..............
1558 ..............
1559 Level:
1560 Spockl
1561 The real end
1562 Bricks:
1563 !!!!!!!!!!!!!!
1564 !............!
1565 !E!!!E!E!!!E!!
1566 !E!EEE!EEE!E!!
1567 !E!!!!!!!E!E!!
1568 !E!!!!!!!E!E!!
1569 !E!!!EEE!E!E!!
1570 !E!!!!!!!E!E!!
1571 !E!!!!E!!E!E!!
1572 !E!!!!E!!E!E!!
1573 !E!!!!E!!E!E!!
1574 !E!!!!E!!E!E!!
1575 !E!!!!E!!E!E!!
1576 !vvvvvvvvvvvv!
1577 !vvvvvvvvvvvv!
1578 !vvvvvvvvvvvv!
1579 !vvvvvvvvvvvv!
1580 !!!!!!!!!!!!!!
1581 Bonus:
1582 !.l..l..l.l..!
1583 ..............
1584 !.!l.....!..!!
1585 ..........!...
1586 !.!.........!!
1587 ..........!...
1588 g.g.........!g
1589 *.*..*.*..*..*
1590 g.g..g.g..g.!g
1591 ..............
1592 {.{}.}.}....!.
1593 ..g..!.!..g.}}
1594 *.**.{.}..*.!*
1595 *............s
1596 >W!!!!WWW!!!W>
1597 g............g
1598 !+>}+!!!+}{>+!
1599 wwwwwwwwwwwwww
0 Version: 1.00
1 Level:
2 Derek "Kazan" Meek
3 Warmup
4 Bricks:
5 cbaaaaaaaaaabc
6 cbaaaaaaaaaabc
7 cbbbbbbbbbbbbc
8 cccccccccccccc
9 .f.f.f..f.f.f.
10 ..f.f.ff.f.f..
11 .f.*!h..h!*.f.
12 ..f!*.hh.*.f..
13 .h.e.*!!*!e.h.
14 .hh.h!**!h.hh.
15 .hh.h!**!h.hh.
16 .h.e.*!!*!e.h.
17 ..f!*.hh.*.f..
18 .f.*!h..h!*.f.
19 ..f.f.ff.f.f..
20 .f.f.f..f.f.f.
21 xxxxxxxxxxxxxx
22 ..............
23 Bonus:
24 32111111111123
25 32111111111123
26 32222222222223
27 33333333333333
28 ..............
29 ..?....j...?..
30 .....s........
31 ..<........>..
32 ..............
33 .&..?....?..&.
34 .w..........p.
35 ......-+......
36 ..+........-..
37 .....>..<.....
38 ....?....?....
39 .m..........*.
40 ?....?..?....?
41 ..............
42 Level:
43 Derek "Kazan" Meek
44 Jackpot
45 Bricks:
46 j*aaaaaaaaaa*j
47 j*aaaaaaaaaa*j
48 j*aaaaaaaaaa*j
49 j*@@@@@@@@@@*j
50 j*yyyyyyyyyy*j
51 j*yyyyyyyyyy*j
52 j************j
53 jjj*jjjjjj*jjj
54 kkj*jkkkkj*jkk
55 fkj*jkffkj*jkf
56 fkj*jkffkj*jkf
57 fkj*jkffkj*jkf
58 fkj*jkffkj*jkf
59 fkj*jkffkj*jkf
60 fkj*jkffkj*jkf
61 fkjjjkffkjjjkf
62 fkkkkkffkkkkkf
63 ..............
64 Bonus:
65 .....1111.....
66 ....122221....
67 ...12332321...
68 ..3333333333..
69 ...s..m&..p...
70 ..............
71 ..............
72 ......jj......
73 .....f..>.....
74 ..............
75 ..............
76 ..j........j..
77 ..............
78 ..............
79 ..............
80 g.....gg.....g
81 ..w........w..
82 ..............
83 Level:
84 Derek "Kazan" Meek
85 Explosive Peril
86 Bricks:
87 ijjjk....kjjji
88 i**!k....k!**i
89 i*cck....kcc*i
90 h****....****h
91 hhfff....fffhh
92 #####.zz.#####
93 hhhh.zaaz.hhhh
94 hhhh.z**z.hhhh
95 .ff...zz...ff.
96 .ff........ff.
97 ..............
98 .....z..z.....
99 .!..!*!!*!..!.
100 xxxxxzxxzxxxxx
101 xxxxxxxxxxxxxx
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ....b.........
107 ..............
108 ....c....c....
109 ..............
110 p.~........~.m
111 ......55......
112 3....}**{....3
113 ...W.{..}.W...
114 ......44......
115 .wf........fw.
116 ..............
117 ..............
118 .s..........s.
119 ...b..........
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Derek "Kazan" Meek
126 Two Face
127 Bricks:
128 aabc..##..cbaa
129 abc.!.##.!.cba
130 bc.@..!!..@.cb
131 c....!..!....c
132 ayy.!....!.yya
133 #*y..!..!..y*#
134 #*y........y*#
135 #*y!..!!..!y*#
136 #*yxcb##bcxy*#
137 **yxcbaabcxy**
138 dxxxcbbbbcxxxd
139 dddxccccccxddd
140 dddxxxxxxxxddd
141 ddd##.##.##ddd
142 eee..!..!..eee
143 hhh.!.!!.!.hhh
144 ffff.f..f.ffff
145 ..............
146 Bonus:
147 ?.....55.....?
148 ..&...55...!..
149 .<....??....>.
150 ..............
151 ..?........?..
152 l............l
153 5............5
154 5?..........?5
155 5..3!.55.&3..5
156 c.....mm.....c
157 ..*..?..?..w..
158 .f..........>.
159 ...j.>..<.....
160 .?.55.55.55.?.
161 ..............
162 .............j
163 .>.{.3..g.p.<.
164 ..............
165 Level:
166 Derek "Kazan" Meek
167 Narrow Places
168 Bricks:
169 cccccccccccccc
170 cccccccccccccc
171 cccccccccccccc
172 *bbbeeeeeebbb*
173 #bdbee##eebdb#
174 #bdbee##eebdb#
175 *bbbeeeeeebbb*
176 cccccceecccccc
177 cccccceecccccc
178 ####cceecc####
179 ddd#cceecc#ddd
180 eee#bceecb#eee
181 hhh#abzzba#hhh
182 fff###zz###fff
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 *..>.........*
189 .?.......l..?.
190 ...&..........
191 .444.?mm?>444.
192 ..............
193 ....<.....b...
194 ......??....f.
195 .jb.?....?..j.
196 .w.f.....&<.w.
197 .....s..s.....
198 *.?.>......?.*
199 .?...bj.....?.
200 ....5....5....
201 .&}........{w.
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Derek "Kazan" Meek
208 Rock and a Hard Place
209 Bricks:
210 ..............
211 ..............
212 ..............
213 cccccccccccccc
214 caaaaaaaaaaaac
215 cccccccccccccc
216 cccccccccccccc
217 cccccccccccccc
218 cccccyyyyccccc
219 cyyycyyyycyyyc
220 cyfycyhhycyfyc
221 cyfycyhhycyfyc
222 cyyycyyyycyyyc
223 cccccyyyyccccc
224 cccccccccccccc
225 cccccccccccccc
226 caaaaaaaaaaaac
227 cccccccccccccc
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 .333333333333.
234 ..............
235 .b..........b.
236 ......ll......
237 ...>......>...
238 ..............
239 ..*...wm...*..
240 ..5...g>...5..
241 &{c}......{c}&
242 .....<..<.....
243 ..............
244 ......bb......
245 .w~.fpggpf.~w.
246 ..............
247 Level:
248 Derek "Kazan" Meek
249 The All Seeing Eye
250 Bricks:
251 cccc......cccc
252 c*c..xxxx..c*c
253 cc..xxxxxx..cc
254 c..xxyyyyxx..c
255 ..xxyyyyyyxx..
256 .xxyyzzzzyyxx.
257 .xyyzz##zzyyx.
258 .xxyyzzzzyyxx.
259 ..xxyyyyyyxx..
260 c..xxyyyyxx..c
261 cc..xxxxxx..cc
262 c*c..xxxx..c*c
263 cccc......cccc
264 ####......####
265 fff#zzzzzz#fff
266 fffzzzzzzzzfff
267 ...yyyyyyyy...
268 ..............
269 Bonus:
270 ?............?
271 .4..........4.
272 ..............
273 .....m..m.....
274 ..............
275 ..............
276 ....?.ll.?....
277 .?..........?.
278 ...?......?...
279 .....m..m.....
280 ..............
281 .4?........?4.
282 ..............
283 5555......5555
284 .*.5?.??.?5.*.
285 *.*..?ww?..*.*
286 ...?.w..w.?...
287 ..............
288 Level:
289 Derek "Kazan" Meek
290 Anger Rising
291 Bricks:
292 @.hhhhhhhhhh.@
293 ..ffffffffff..
294 ..ffffffffff..
295 ..gggggggggg..
296 ..gggggggggg..
297 **EEEEEEEEEE**
298 ..............
299 .....yyyy.....
300 .#.#.yaay.#.#.
301 .b.b.yaay.b.b.
302 .b.b.yaay.b.b.
303 .#!#.yyyy.#!#.
304 .b.b......b.b.
305 .b.b!.!!.!b.b.
306 .#b#......#b#.
307 .###.!..!.###.
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 ...l..&*..l...
320 ......44......
321 ......m&......
322 ..............
323 ..............
324 ..............
325 ..5........5..
326 ..............
327 ..............
328 ..............
329 Level:
330 Derek "Kazan" Meek
331 Test Your Might
332 Bricks:
333 cccccccccccccc
334 cccccccccccccc
335 cccccccccccccc
336 cccccccccccccc
337 cccccccccccccc
338 cccccccccccccc
339 zzzzzzzzzzzzzz
340 zzzzzzzzzzzzzz
341 zzzzzzzzzzzzzz
342 zzzzzzzzzzzzzz
343 ..............
344 gg.yyyyyyyy.gg
345 gg.yyyyyyyy.gg
346 gg.yyyyyyyy.gg
347 ###yyyyyyyy###
348 cc#zzzzzzzz#cc
349 ..............
350 ..............
351 Bonus:
352 ..............
353 .?...?..?...?.
354 ..............
355 ...?...j..?...
356 .*...........*
357 .....?..?.....
358 ...?...*..?...
359 ..-........-..
360 .?..!.j..!..?.
361 ..............
362 ..............
363 .......>......
364 ...g......g..c
365 .....f..+.....
366 555........555
367 *&5.p.ws.?.5&m
368 ..............
369 ..............
370 Level:
371 Derek "Kazan" Meek
372 Fient
373 Bricks:
374 ajggggggggggja
375 ajggggggggggja
376 aj**********ja
377 ajggff**ffggja
378 ajgg#h**h#ggja
379 ajgg#heeh#ggja
380 ajgg#heeh#ggja
381 ajgg######ggja
382 ajgg#hhhh#ggja
383 ajgg#h**h#ggja
384 ajgg#h**h#ggja
385 ajgg#h**h#ggja
386 ajgg#f**f#ggja
387 aj*g##**##g*ja
388 a#*ggg**ggg*#a
389 a#**********#a
390 a############a
391 yyyyyyyyyyyyyy
392 Bonus:
393 .m..........m.
394 ..............
395 ..............
396 ?............?
397 ..*.5....5.*..
398 ....5?..?5....
399 ....5....5....
400 ?...555555...?
401 ...s544445s...
402 ....54..45....
403 ....54..45....
404 ....54..45....
405 m...54..55...m
406 ....55..55....
407 .5.444..444.5.
408 .3..........3.
409 .333333333333.
410 .g.w......w.g.
411 Level:
412 Derek "Kazan" Meek
413 Cahadhras
414 Bricks:
415 ******!!******
416 *#####..#####*
417 .#aaa#..#aaa#.
418 .#aca#!!#aca#.
419 .#aca#..#aca#.
420 !#aca#..#aca#!
421 .#aca*..*aca#.
422 .#aca#!!#aca#.
423 .#aca#..#aca#.
424 .#aca#..#aca#.
425 .#aca#..#aca#.
426 .#aca#..#aca#.
427 !#a###!!###a#!
428 .#a##a..a##a#.
429 z#aaaazzaaaa#z
430 y#####yy#####y
431 xxxxxxxxxxxxxx
432 ..............
433 Bonus:
434 .?..........?.
435 .....l..5.....
436 ..............
437 ......?.......
438 ...?......?...
439 ..............
440 .....m..}..?..
441 .......?......
442 ..............
443 ..?...........
444 ..............
445 ...*....s.s...
446 ..............
447 ..............
448 ?.........?...
449 .............?
450 ..w.?.b?...w..
451 ..............
452 Level:
453 Derek "Kazan" Meek
454 The Mines
455 Bricks:
456 a************a
457 #a#cccccccc#a#
458 #a#cccccccc#a#
459 ...bbbbbbbb...
460 ...bbbbbbbb...
461 a#a#a#aa#a#a#a
462 b#b#b#bb#b#b#b
463 ..............
464 ..............
465 #b#b#b##b#b#b#
466 #c#c#c##c#c#c#
467 ..............
468 ..............
469 c#c#c#cc#c#c#c
470 y#y#y#yy#y#y#y
471 ..............
472 dddddddddddddd
473 dddddddddddddd
474 Bonus:
475 ..............
476 ..l........l..
477 ..m........m..
478 ....}....{....
479 ..............
480 -.?........?.+
481 ......??......
482 ..............
483 ..............
484 .&3m..33..-3m.
485 ..3..<33>..3..
486 ..............
487 ..............
488 ?...?....?...?
489 ..>...f....<..
490 ..............
491 .?...?..?...?.
492 ...?...w..?...
493 Level:
494 Derek "Kazan" Meek
495 Into the Fray
496 Bricks:
497 .ggccccccccgg.
498 .ggccccccccgg.
499 .ggccccccccgg.
500 .gggggggggggg.
501 .gggggggggggg.
502 ..............
503 ..............
504 zzzzzzzzzzzzzz
505 ******zz******
506 #dd###jj###dd#
507 #jj###jj###jj#
508 yxjxyxjjxyxjxy
509 yxjxyxjjxyxjxy
510 z###z####z###z
511 z###z####z###z
512 .jjj.jjjj.jjj.
513 .jjj.jjjj.jjj.
514 ..............
515 Bonus:
516 .?..?....?..?.
517 ......m5......
518 ..............
519 ...?......?...
520 ..............
521 ..............
522 ..............
523 ..*...??...m..
524 ..............
525 ....3....3....
526 ..?.3....3.?..
527 ..............
528 ....?....?....
529 ..3...33...3..
530 ..3...33...3..
531 ..............
532 ..?..?..?..?..
533 ..............
534 Level:
535 Derek "Kazan" Meek
536 Nautilus
537 Bricks:
538 ***bbbbbbbb***
539 aaaaaaaaaaaaaa
540 a....*aa*....a
541 a#...*aa*...#a
542 a##..abba..##a
543 a#c#.abba.#c#a
544 a#cc#abba#cc#a
545 a#cc#abba#cc#a
546 a#cc#....#cc#a
547 a#cc#....#cc#a
548 a#cc#.cc.#cc#a
549 a#cc#.cc.#cc#a
550 a#cc#.cc.#cc#a
551 a#cc#xccx#cc#a
552 aaaa#xccx#aaaa
553 aaaa#yccy#aaaa
554 #####yccy#####
555 zzzzzzzzzzzzzz
556 Bonus:
557 ....?....?....
558 ..............
559 ..............
560 m............m
561 ..............
562 ..5...s....5..
563 ..44......44..
564 ?.33.&..-.33.?
565 ..22......22..
566 ..11......11..
567 ..00..*?..00..
568 ?............?
569 ..............
570 ......+.......
571 .?..........?.
572 ...~......l...
573 ......??......
574 w..-......+..w
575 Level:
576 Derek "Kazan" Meek
577 ISU Is the Bomb
578 Bricks:
579 xxxxxxxxxxxxxx
580 **************
581 *###*z#z*#z*#*
582 **d**#b#*dz*d*
583 z*d*z#bb*dz*d*
584 z*d*zbab*dbbd*
585 z*d**bb#*dbbd*
586 **d**#b#*dbbd*
587 *###*z#z*d###*
588 **************
589 cccccccccccccc
590 cccccccccccccc
591 cccccccccccccc
592 zzzzzzzzzzzzzz
593 zzzzzzzzzzzzzz
594 zzzzzzzzzzzzzz
595 ##.##.##.##.##
596 ..............
597 Bonus:
598 .?.?..?.?.?...
599 .....?........
600 ..5......5..5.
601 ......m.......
602 ..............
603 ..............
604 ..............
605 ......m...**..
606 ..5........5..
607 ..............
608 ..............
609 .....?..??.?..
610 ..?...?.......
611 .......?....?.
612 ....?....?....
613 .?w........g..
614 ......55......
615 ..............
616
0 Level:
1 Kevin
2 Robot
3 Bricks:
4 ..............
5 jjjjjjjjjjjjjj
6 j.jjj.**.jjj.j
7 j............j
8 j............j
9 j..jjjjjjjj..j
10 j..jddddddj..j
11 j..jd!dd!dj..j
12 jjjjddddddjjjj
13 j..jddddddj..j
14 j..jhhhhhhj..j
15 jjjjh.ee.hjjjj
16 hhhhh.ee.hhhhh
17 !..!..ee..!..!
18 ..**.**ee**.**
19 .......ee.....
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ...l........l.
26 ..............
27 ..............
28 ......+..+....
29 .....454454...
30 .....5.55.5...
31 .....454454...
32 .....555555...
33 .....gg..gg...
34 ..............
35 ....m......m..
36 .......++.....
37 g..p......p...
38 ..............
39 ..............
40 ..............
41 Level:
42 Kevin
43 Easy as it gets
44 Bricks:
45 ..............
46 iiiiiiiiiiiiii
47 ..............
48 hhhhhhhhhhhhhh
49 ..............
50 gggggggggggggg
51 ..............
52 ffffffffffffff
53 ..............
54 eeeeeeeeeeeeee
55 ..............
56 dddddddddddddd
57 ..............
58 jjjjjjjjjjjjjj
59 ..............
60 kkkkkkkkkkkkkk
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 ..2m...2.22...
68 ..............
69 ....2.3+3.3.b.
70 ..............
71 ...2.+.....3b.
72 ..............
73 ..2.+.......33
74 ..............
75 ..23+.l.....l.
76 ..............
77 ..3.....222...
78 ..............
79 3.........2.w.
80 ..............
81 ..............
82 Level:
83 Kevin
84 # 3
85 Bricks:
86 ......chhc....
87 ......#hh#....
88 ......#hh#....
89 ......#hh#....
90 .....######...
91 ....#fcffcf#..
92 ...#ffccccff#.
93 ..#ffggggggff#
94 ccfggggggggfcc
95 cjjjjjjjjjjjjc
96 jjjjjjjjjjjjjj
97 cjjjjjjjjjjjjc
98 ccfggggggggfcc
99 ..#ffggggggff#
100 ...#ffccccff#.
101 ....#ccffcc#..
102 .....######...
103 ..............
104 Bonus:
105 .......22m....
106 .......33.....
107 .......44.....
108 .......55.....
109 ..............
110 .......55.....
111 ..............
112 ..............
113 ..............
114 ..............
115 g.3+..??..+3.g
116 ..............
117 ...+........+.
118 ..............
119 ..............
120 .......ll.....
121 ..............
122 ..............
123 Level:
124 Kevin
125 Probe
126 Bricks:
127 ..............
128 ..............
129 ..............
130 ..............
131 .......gg.....
132 ......g##g....
133 .....ghheeg...
134 ....g#hhee#g..
135 ...f##eehh##f.
136 ..#.f#eehh#f.#
137 #...f####f...#
138 ......f!!f....
139 ..####!ff!####
140 ......ffff....
141 .....fbccbf...
142 .....bbbbbb...
143 ..c..........c
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ..............
150 .......ll.....
151 ..............
152 ..............
153 ..............
154 ......5..5....
155 ......3443....
156 .....m....m...
157 ......b++b....
158 .......22.....
159 .......11.....
160 .....p.++.p...
161 .....000000...
162 ..g..........g
163 ..............
164 Level:
165 Kevin
166 Shaft
167 Bricks:
168 ccccchhccccccc
169 ccccchhccccccc
170 ccccchhccccccc
171 ......hh......
172 ccccchhccccccc
173 ccccchhccccccc
174 ......hh......
175 ccccchhccccccc
176 ccccchhccccccc
177 ......hh......
178 ccccchhccccccc
179 ccccchhccccccc
180 ......hh......
181 ccccchhccccccc
182 ccccchhccccccc
183 ......hh......
184 cccccccccccccc
185 cccccccccccccc
186 Bonus:
187 .......m......
188 5..5..+..5.+5.
189 .....>..>.....
190 ..............
191 ....?..+.5....
192 ..3....c...pm.
193 ..............
194 ?.m...+....>..
195 ..p........4..
196 ..............
197 ...........?..
198 ..b.33c+.3....
199 ..............
200 ....>.....3m..
201 ..4-......p.-b
202 ..............
203 ....+.w+......
204 0.0.b...0..0..
205 Level:
206 Kevin
207 Stary Night
208 Bricks:
209 ....!.....!...
210 !.....!.....!.
211 ..............
212 ...!.!...!.!.!
213 .......!......
214 ..!.!.....!.!.
215 ......!.!.....
216 ...!.......!.!
217 .....!.!.!....
218 ..............
219 ..............
220 ffffffffffffff
221 ffffffffffffff
222 gggggggggggggg
223 ####gggggg####
224 hhhhhhhhhhhhhh
225 hhhhhhhhhhhhhh
226 hhhhhhhhhhhhhh
227 Bonus:
228 ..............
229 ..............
230 ........5.....
231 ..5......5....
232 ..............
233 ............1.
234 ......1.......
235 ..............
236 ............5.
237 ..............
238 ..............
239 ...+........3.
240 ..1111..1111..
241 bm.3.1....gm3.
242 ......1...+...
243 ..3g1..1....+1
244 ....+...1111..
245 .....11....1..
246 Level:
247 Kevin
248 Smiley
249 Bricks:
250 ....vvvvvvvv..
251 ...vvhhhhhhvv.
252 ..vvhh....hhvv
253 ..vhh......hhv
254 vvh..h..h..hvv
255 vh...h..h...hv
256 vh..........hv
257 vh..........hv
258 vh..h....h..hv
259 vh..hh..hh..hv
260 vvh..hhhh..hvv
261 ..vhh......hhv
262 ..vvhh....hhvv
263 ...vvhhhhhhvv.
264 ....vvv..vvv..
265 ..............
266 ..............
267 ..............
268 Bonus:
269 ..............
270 ....5......5..
271 ..............
272 ..+...........
273 ......5..5....
274 ......5..5...+
275 ..............
276 .............g
277 ..s...........
278 .....m....m...
279 ..l...........
280 ............s.
281 ...g..........
282 ..............
283 ....4+p..p+4..
284 ..............
285 ..............
286 ..............
287 Level:
288 Kevin
289 Night
290 Bricks:
291 ..vvv...vvv...
292 v...vvv...vvv.
293 v...vvv...vvv.
294 v...vvv...vvv.
295 v...vvv...vvv.
296 ..vvv...vvv...
297 ..vvv...vvv...
298 ..vvv...vvv...
299 ..vvv...vvv...
300 v...vvv...vvv.
301 v...vvv...vvv.
302 v...vvv...vvv.
303 v...vvv...vvv.
304 ..vvv...vvv...
305 ..vvv...vvv...
306 ..vvv...vvv...
307 ..vvv...vvv...
308 ..............
309 Bonus:
310 ..dm5...dd5...
311 d...dld...dld.
312 d...ddd...ddd.
313 d...ddd...d+d.
314 5...dd5...dd5.
315 ..d+d...dld...
316 ..ddd...ddd...
317 ..ddd...ddd...
318 ..dd5...dd5...
319 d...dmd...ddd.
320 d...ddd...dd+.
321 d...ddd...ddd.
322 5...dd5...5dd.
323 ..ddd...dld...
324 ..d+d...ddd...
325 ..ddd...ddd...
326 ..dd5...dd5...
327 ..............
328 Level:
329 Kevin
330 trao
331 Bricks:
332 ..............
333 ..............
334 jjjjjjjjjjjjjj
335 jjjjjjjjjjjjjj
336 jjjjj#v##jjjjj
337 fffff#ff#fffff
338 fffff#ff#fffff
339 fffff#ff#fffff
340 fffff##f#fffff
341 ggggg#gg#ggggg
342 ggggg#gg#ggggg
343 ggggg#gg#ggggg
344 ggggg#g##ggggg
345 hhhhh#hh#hhhhh
346 hhhhh#hh#hhhhh
347 hhhhh#hh#hhhhh
348 hhhhh##h#hhhhh
349 ######..######
350 Bonus:
351 ..............
352 ..............
353 g............g
354 ..............
355 1...g.m..g...1
356 .....2....2...
357 ..............
358 .......+......
359 2......c.....2
360 .....4....4...
361 ..............
362 .......c+.....
363 4.....w......4
364 .....5....5...
365 ...b........b.
366 .......+......
367 5......w.....5
368 ..............
369 Level:
370 Kevin
371 Pedastal
372 Bricks:
373 .....vvvvvv...
374 .....vvvvvv...
375 .....j#ee#j...
376 .....j#ee#j...
377 .....j#ee#j...
378 .....j#gg#j...
379 .....j#gg#j...
380 .....j#gg#j...
381 .....j#gg#j...
382 .....j#ff#j...
383 .....j#ff#j...
384 .....j#ff#j...
385 ..iiiiiiiiiii.
386 ..iifhiiiihfi.
387 ..ifhed##dehf.
388 ..fhedccccdehf
389 fhedvvvvvvdehf
390 gggggggggggggg
391 Bonus:
392 .....5555m5...
393 .....555555...
394 ......5445....
395 ......5445....
396 ......5445....
397 ......5335....
398 ......5335....
399 .....+5335+...
400 ......m335....
401 ......5445....
402 ......5445....
403 ......5445....
404 ..55555555555.
405 .....g.+.+g...
406 .......55.....
407 ......5555....
408 ..gp........pg
409 ....+..+..+...
410 Level:
411 Kevin
412 Got Blue Balls?
413 Bricks:
414 .......#h#....
415 .......#e#....
416 ..!..!.#h#.!.!
417 .......#e#....
418 .......#h#....
419 ..!..!.#e#.!.!
420 .......#h#....
421 .......#e#....
422 ..!..!.#h#.!.!
423 .......#e#....
424 .......#h#....
425 ..!..!.#e#.!.!
426 .......#h#....
427 ########e#####
428 ..............
429 ..............
430 ..............
431 ..............
432 Bonus:
433 ........m.....
434 ..............
435 ....5.......5.
436 ..............
437 ..............
438 ..........5...
439 ..5...........
440 ..............
441 ............5.
442 .....5..l.....
443 ..............
444 ........p.5...
445 ..5...........
446 ........+.....
447 ..............
448 ..............
449 ..............
450 ..............
451 Level:
452 Kevin
453 TNT
454 Bricks:
455 !*!*!*!*!*!*!*
456 *!*!*!*!*!*!*!
457 !*!*!*!*!*!*!*
458 *!*!*!*!*!*!*!
459 !*!*!*!*!*!*!*
460 ####*!*!*!*!*!
461 ####!*!*!*!*!*
462 ####*!*!*!*!*!
463 ###.!*!*!*!*!*
464 ##..*!*!*!*!*!
465 #...!*!*!*!*!*
466 ....#*!*!*!*!*
467 ...##!*!*!*!*!
468 ..###*!*!*!*!*
469 ...##!*!*!*!*!
470 ....#*!*!*!*!*
471 ....#!*!*!*!*!
472 ....##########
473 Bonus:
474 55555351515355
475 555545250b2545
476 55555341>14345
477 55554424042>45
478 5555g3b14143b5
479 .....4>2g0p234
480 .....533131333
481 .....432303234
482 .....+3p1>1b32
483 .....422202224
484 .....+32121232
485 .....412101214
486 .....51b1w1131
487 .....412101214
488 .....>3j1g1w35
489 .....452505254
490 .....b3515153j
491 ..............
492 Level:
493 Kevin
494 Two Rooms
495 Bricks:
496 ...#..........
497 ...#!*!*!*!*!!
498 ...#..........
499 ...#!*!*!*!*!*
500 ...*..........
501 ...*!*!*!*!*!*
502 ...#..........
503 ...#!.!.!.!.!.
504 ...###########
505 ...#!.!.!.!.!.
506 ...*..........
507 ...*!*!*!*!*!*
508 ...#..........
509 ...#!*!*!*!*!*
510 ...#..........
511 ...#!*!*!*!*!*
512 ...#..........
513 ...###########
514 Bonus:
515 .....ggggg....
516 ..............
517 ......???.....
518 ..........>...
519 ....bw.44.....
520 ...wbw.>...4..
521 ....bb4.4.....
522 ....>...4.....
523 ...........4..
524 ......?.?.....
525 ....bw??4.444.
526 ...wbw?.....4.
527 ....bb..4..p..
528 .....>.l..lp..
529 ......??w.4.j.
530 ....>.wp??j...
531 ........j.....
532 ..............
533 Level:
534 Kevin
535 Face
536 Bricks:
537 hhhhhh..hhhhhh
538 hhhhhh..hhhhhh
539 hhhhhh..hhhhhh
540 hh####vv####hh
541 ###ggg..ggg###
542 ggggjg..gjgggg
543 ggggjg..gjgggg
544 ggggff..ffgggg
545 ffffff..ffffff
546 ffffff..ffffff
547 ....fff..fff..
548 .....df..fd...
549 .....dddddd...
550 ......iddi....
551 ......iiii....
552 .......ii.....
553 .......ii.....
554 ..............
555 Bonus:
556 ..............
557 ............4.
558 ..............
559 m.5555ll5555.m
560 555........555
561 .....4....4...
562 .....4....4...
563 ..............
564 ..g...........
565 .............g
566 ..............
567 ..............
568 ..............
569 ..............
570 ........l.....
571 ..............
572 ..............
573 ..............
574 Level:
575 Kevin
576 USA
577 Bricks:
578 ..............
579 ..............
580 ..#.##########
581 ..#gggggddddd#
582 ..#gggggjjjjj#
583 ..#gggggddddd#
584 ..#gggggjjjjj#
585 ..#gggggddddd#
586 ..#gggggjjjjj#
587 ..#dddddddddd#
588 ..#jjjjjjjjjj#
589 ..#dddddddddd#
590 ..#jjjjjjjjjj#
591 ..#dddddddddd#
592 ..#jjjjjjjjjj#
593 ..#dddddddddd#
594 ..############
595 ..............
596 Bonus:
597 ..............
598 ..............
599 ..............
600 ...b..........
601 .....g........
602 .........+....
603 ....+..2......
604 .........2....
605 .....2....22..
606 ..............
607 ...1..11......
608 ..............
609 .........1....
610 ......22+...m.
611 ....1.2...1...
612 ..............
613 ..............
614 ..............
615 Level:
616 Kevin
617 Tiger
618 Bricks:
619 ..............
620 ..............
621 ..............
622 ..............
623 .....ee.ee....
624 .....ee.ee....
625 .....ee.ee.ee.
626 ..ee.......ee.
627 ..ee..eee..ee.
628 ..ee.eeeee....
629 ....eeeeeee...
630 ....eeeeeee...
631 ....eeeeeee...
632 ....eeeeee....
633 .....eeee.....
634 ..............
635 ..............
636 ..............
637 Bonus:
638 ..............
639 ..............
640 ..............
641 ..............
642 ......l.4.....
643 .....54.......
644 ..............
645 ...4........5.
646 ...+..........
647 .......g4.....
648 .....4........
649 .........+....
650 ....b...4.....
651 ........b.....
652 ..............
653 ..............
654 ..............
655 ..............
656 Level:
657 Kevin
658 easy
659 Bricks:
660 ..............
661 ggg.g.g.g.ggg.
662 ..g..g.g.g.g..
663 ..g..ggg.g.ggg
664 ..g..g.g.g...g
665 ..g..g.g.g.ggg
666 ..............
667 ......g.ggg...
668 ......g.g.....
669 ......g.ggg...
670 ......g...g...
671 ......g.ggg...
672 ..............
673 gg.ggg.ggg.g.g
674 g..g.g.g...g.g
675 gg.ggg.ggg.ggg
676 g..g.g...g..g.
677 gg.g.g.ggg..g.
678 Bonus:
679 ..............
680 .......p......
681 ..2........5..
682 .....2.l.4..4.
683 ..c...........
684 ..............
685 ..............
686 ......l.......
687 ........c.....
688 .........g2...
689 ......4.......
690 .........2>...
691 ..............
692 l.............
693 ..............
694 ..4..4>..2...5
695 ..............
696 c...........w.
697 Level:
698 Kevin
699 U SUCK
700 Bricks:
701 ..............
702 ..d.d.ddd.d.d.
703 ..d#d.d.d.d.d.
704 ..ddd.d#d.d#d.
705 ...d..d.d.d.d.
706 ...d..ddd.ddd.
707 ..............
708 ..............
709 ...###.###.###
710 ddd.d.d.dd.d.d
711 d##.d.d.d..d.d
712 ddd.d.d.d..dd.
713 ##d.d#d.d##dd.
714 ...d.d.d.d..d.
715 ddd.ddd.dd.d.d
716 #######..#####
717 ..............
718 ..............
719 Bonus:
720 ..............
721 ..............
722 ............3.
723 ..5...5.......
724 ..............
725 ........3..m..
726 ..............
727 ..............
728 ..............
729 ..............
730 +.............
731 .........l....
732 .............5
733 ..............
734 .......+.5....
735 ......+.......
736 ..............
737 ..............
738 Level:
739 noname
740 Stairs
741 Bricks:
742 iiiiiiiiiiiiii
743 iiiiiiiiiiiiii
744 ###*######*###
745 gggggggggggggg
746 gggggggggggggg
747 #####*##*#####
748 ffffffffffffff
749 ffffffffffffff
750 ######**######
751 hhhhhhhhhhhhhh
752 hhhhhhhhhhhhhh
753 #.##*####*##.#
754 eeeeeeeeeeeeee
755 eeeeeeeeeeeeee
756 ##*########*##
757 dddddddddddddd
758 dddddddddddddd
759 ..############
760 Bonus:
761 5........3....
762 ...b...3....3.
763 ..............
764 5............4
765 ...3..........
766 ..............
767 4.........3...
768 m.3...........
769 ..............
770 .....>........
771 .....2+...b...
772 ..............
773 5.....3.....>m
774 3...g.....<..4
775 ..............
776 ...+.3....+...
777 3..b.+..j....w
778 ..............
779 Level:
780 Kevin
781 Rainbow
782 Bricks:
783 jkghifdedfihgj
784 jkghifdedfihgj
785 jkghifdedfihgj
786 jkghifdedfihgj
787 jkghifdedfihgj
788 jkghifdedfihgj
789 jkghif#e#fihgj
790 jkghif#e#fihgj
791 jkghif#e#fihgj
792 jkghi#...#ihgj
793 jkghi#...#ihgj
794 jkghi#...#ihgj
795 jkgh#.....#hgj
796 jkgh#.....#hgj
797 jkgh#.....#hgj
798 jkg#.......#gj
799 ###.........##
800 ..............
801 Bonus:
802 ..............
803 .....?........
804 ......gggggg..
805 ....gggb5...g?
806 >.g.5+55ggg.g.
807 ..5..5gg..5.g.
808 g5.5g....?..g.
809 g..g......55gg
810 5.5l..........
811 ...5b........g
812 55.........5m.
813 ...g+........g
814 5554.......5.g
815 ..5...........
816 5>...........g
817 5............g
818 ..............
819 ..............
0 Version: 1.00
1 Level:
2 Michael Speck
3 Wall
4 Bricks:
5 ..............
6 ..............
7 ..............
8 EEEEEEEEEEEEEE
9 ..............
10 ..............
11 .dddddddddddd.
12 .dddddddddddd.
13 .eeeeeeeeeeee.
14 .ffffffffffff.
15 .ffffffffffff.
16 .eeeeeeeeeeee.
17 .dddddddddddd.
18 .dddddddddddd.
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..s..0.>..m...
31 ..1...+....0..
32 .<.-.1..-.l...
33 .?.0..-.0..w..
34 ...+..1.<.+...
35 ..0..b..-..0..
36 ..-.f.+..0....
37 ..0+...b.>.p..
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Breakthrough
45 Bricks:
46 ..............
47 ..............
48 ..............
49 EEEEEEEEEEEEEE
50 ..............
51 ..............
52 gggggggggggggg
53 gggggggggggggg
54 eeeeeeeeeeeeee
55 eeeeeeeeeeeeee
56 dddddd..dddddd
57 ddddd....ddddd
58 iiii......iiii
59 iii........iii
60 ff..........ff
61 f............f
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ..............
71 .0...1...-..m.
72 ...b..<f..0...
73 ..-.+.0.+..1.+
74 .-.1...-.<..-.
75 p...>....2..0.
76 ..0......+.?..
77 1..+.......>+.
78 ..b........w..
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Level 02
86 Bricks:
87 ..............
88 ..............
89 ..............
90 EEEEEEEEEEEEEE
91 ..heggggggeh..
92 ...heeeeeeh...
93 ....hhhhhh....
94 hhh........hhh
95 eeeh......heee
96 gggeh....heggg
97 dddgeh..hegddd
98 dddgeh..hegddd
99 dddgeh..hegddd
100 gggeh....heggg
101 eeeh......heee
102 hhh........hhh
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..1..l...+.0..
111 ....-...w.....
112 ....f.b..-....
113 .+.........p..
114 b.............
115 .<..-.......0.
116 ...1......1..>
117 .0..>...+.....
118 ...+.f....<.b.
119 ..1........0..
120 .?........+...
121 ..-.........1.
122 ..............
123 ..............
124 Level:
125 Michael Speck
126 U.F.O.
127 Bricks:
128 ..............
129 ..............
130 ..............
131 EEEEEEEEEEEEEE
132 ..............
133 ..............
134 ......bb......
135 .....bkkb.....
136 ....kkkkkk....
137 ...gkggggkg...
138 ..kkkkkkkkkk..
139 .cccccccccccc.
140 ..kkkkkkkkkk..
141 ...gkggggkg...
142 ....kkkkkk....
143 .....bkkb.....
144 ......bb......
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ......l.......
154 .......-......
155 ....1..0......
156 ...-..+..>....
157 ..<.?...1.....
158 ...b.1.<..+...
159 ....-..w.0....
160 ....>...-.?...
161 .....+.0......
162 .....0..+.....
163 ......b.......
164 ..............
165 Level:
166 Michael Speck
167 Pyramid
168 Bricks:
169 ..............
170 ..............
171 ..............
172 EEEEEEEEEEEEEE
173 ..............
174 ..............
175 .....eeee.....
176 .....ehhe.....
177 ....ehhhhe....
178 ....eheehe....
179 ...ehheehhe...
180 ...ehheehhe...
181 ..bb######bb..
182 ..hhhhhhhhhh..
183 ..eeeehheeee..
184 .hhhheeeehhhh.
185 .aaaaaaaaaaaa.
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ......-.f.....
195 .....1.b......
196 .....-..1.....
197 ........>.....
198 ...1.<.?......
199 ...+......+...
200 ..............
201 ..m...-...0...
202 ....+...0.-<..
203 ..-.1.0.+..0..
204 .0.+.>w.1.b...
205 ..............
206 Level:
207 Michael Speck
208 Bubbles
209 Bricks:
210 ..............
211 ..............
212 ..............
213 EEEEEEEEEEEEEE
214 .........gg...
215 ..gg....gjgg..
216 .gjgg...gggg..
217 .gggg...gggg..
218 .gggg....gg...
219 ..gg..........
220 ......gg......
221 .....gjgg.....
222 .....gggg.....
223 .gg..gggg..gg.
224 gjgg..gg..gjgg
225 gggg......gggg
226 gggg......gggg
227 .gg........gg.
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ...1....+.1...
235 ..+......?.-..
236 .>.p....0.<...
237 .-.......w....
238 ...0..........
239 ......f.......
240 ........1.....
241 .....-.l......
242 .s....+.......
243 ..0....>....-.
244 .-........b.1.
245 ..<b........+.
246 .+.........0..
247 Level:
248 Michael Speck
249 Level 06
250 Bricks:
251 ..............
252 ..............
253 ..............
254 EEEEEEEEEEEEEE
255 iiiiiiiiiiiiii
256 iiiiiiiiiiiiii
257 ffffffffffffff
258 ffff......ffff
259 dddd......dddd
260 dddd......dddd
261 bb##......##bb
262 ..............
263 ..............
264 ....aeeeea....
265 ....aeeeea....
266 ....aeeeea....
267 ....######....
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ....m...b.-...
275 .1.-.....+....
276 ..b..+..<..1..
277 .-.>......b...
278 ..?.........-.
279 1..+......+.<.
280 ..............
281 ..............
282 ..............
283 ....0.+.>0....
284 ....0-.f.0....
285 ....0..1.0....
286 ..............
287 ..............
288 Level:
289 Michael Speck
290 Mushroom
291 Bricks:
292 ..............
293 ..............
294 ..............
295 EEEEEEEEEEEEEE
296 ..............
297 .....ddd......
298 ...ddddddd....
299 ..ddddddddd...
300 ..ddddddddd...
301 ..ddddddddd...
302 ..dd.eee.dd...
303 .....eee......
304 f....eee......
305 .f..feeee.f.f.
306 .f.f.eeee..f..
307 ffffffeeeeffff
308 ffffffeeeeffff
309 ..............
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ......1.......
317 ...b..-.<.....
318 ..-.....-.....
319 ..+.f..<..b...
320 ..1..l..1.....
321 ...2..0..+....
322 .......-......
323 .....p........
324 ....>.+.......
325 .....-.1......
326 .+..0.+..-..>.
327 ...b.1.?..+...
328 ..............
329 Level:
330 Michael Speck
331 Level 08
332 Bricks:
333 ..............
334 ..............
335 ..............
336 EEEEEEEEEEEEEE
337 ..............
338 ..............
339 gggg#....#gggg
340 geeg#....#geeg
341 geeg#....#geeg
342 geeg#....#geeg
343 geeg#....#geeg
344 gggg#....#gggg
345 ..............
346 aaaabbbbbbaaaa
347 aaaabffffbaaaa
348 ....bffffb....
349 ....######....
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 +.2.........b.
359 ...-......-...
360 1...........1.
361 ..>...........
362 ..+........0..
363 .b.-........+.
364 ..............
365 .>.w.1...-..<.
366 ..0...-.p..b..
367 .....<.2.+....
368 ..............
369 ..............
370 Level:
371 Michael Speck
372 Chest
373 Bricks:
374 ..............
375 ..............
376 ..............
377 EEEEEEEEEEEEEE
378 ..............
379 ..............
380 .cccccccccccc.
381 .cddddddddddc.
382 .cdeeeeeeeedc.
383 .cdeffffffedc.
384 .cdefggggfedc.
385 .cdefggggfedc.
386 .cdeffffffedc.
387 .cdeeeeeeeedc.
388 .cddddddddddc.
389 .cccccccccccc.
390 ..............
391 ..............
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 .101010101010.
400 .0-..<.+...m1.
401 .1.p......-.0.
402 .0..+..>.?..1.
403 .1....-...>.0.
404 .0.l.....+..1.
405 .1....+...-.0.
406 .0.-.....w..1.
407 .1<..s...+..0.
408 .000101010101.
409 ..............
410 ..............
411 Level:
412 Michael Speck
413 Level 10
414 Bricks:
415 ..............
416 ..............
417 ..............
418 EEEEEEEEEEEEEE
419 ..............
420 ..............
421 ..d#ffffff#d..
422 ..d#ffffff#d..
423 .dd#ffffff#dd.
424 .dd#gggggg#dd.
425 ddd#gggggg#ddd
426 ddd#gggggg#ddd
427 .dd#gggggg#dd.
428 .dd#ffffff#dd.
429 ..d#ffffff#d..
430 ..d#ffffff#d..
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ..............
438 ..............
439 ..............
440 ..<...1.......
441 ......b..>....
442 .-..-...+.....
443 .....0..1..-..
444 ..p...+......b
445 .+..f...?...+.
446 .....>.1.-.<..
447 .1...-.....m..
448 .......0......
449 .....+..b.....
450 ..............
451 ..............
452 Level:
453 Michael Speck
454 Level 11
455 Bricks:
456 ..............
457 ..............
458 ..............
459 EEEEEEEEEEEEEE
460 ..............
461 ..............
462 cccc.cccc.cccc
463 ceec.cddc.ceec
464 ceec.cddc.ceec
465 ceec.cddc.ceec
466 cccc.cccc.cccc
467 ..............
468 cccc.bbbb.cccc
469 cddc.bffb.cddc
470 cddc.bffb.cddc
471 cddc.bffb.cddc
472 cccc.bbbb.cccc
473 ..............
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 .0....+....m..
482 ........-..-..
483 ..+...0.>....+
484 .<.........b..
485 -.1...p...0...
486 ..............
487 .......-...<..
488 ..0..?..b...1.
489 l.....1.....b.
490 .+...s....-...
491 ..>....+......
492 ..............
493 Level:
494 Michael Speck
495 Egg
496 Bricks:
497 ..............
498 ..............
499 ..............
500 EEEEEEEEEEEEEE
501 ..............
502 ..............
503 ......gg......
504 ....gggggg....
505 ...ghhhhhhg...
506 ..ghiiiiiihg..
507 ..ghiiiiiihg..
508 .fhiiiiiiiihf.
509 .fhhhhhhhhhhf.
510 .ffffffffffff.
511 .ffffffffffff.
512 ..eeeeeeeeee..
513 ..dddddddddd..
514 ..............
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..............
523 ......0.......
524 .....m..<.b...
525 ....1.-..2....
526 ..0...1..-....
527 ...+.f..+..-..
528 ..1.-..2..p...
529 .+..>.+....>..
530 ..b....b.+.-..
531 ....?...2.<...
532 ..-..0..w..+..
533 ..............
534 Level:
535 Michael Speck
536 Web
537 Bricks:
538 ..............
539 ..............
540 ..............
541 EEEEEEEEEEEEEE
542 b...b....b...b
543 .b...b..b...b.
544 ..b...bb...b..
545 ...b..cc..b...
546 ....cc..cc....
547 bb..cd..dc..bb
548 ..bcddddddcb..
549 ...cddddddc...
550 ..bcddddddcb..
551 bb..cddddc..bb
552 ....ccddcc....
553 ...bb.cc.bb...
554 .bb........bb.
555 b............b
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 ..............
562 ........-.....
563 ..2....f......
564 ......+.......
565 ....1....2....
566 -...+...<...2.
567 ...2.?...+....
568 ...<..-.1.....
569 ....b.+..-....
570 .-...p.l....>.
571 ....+..-......
572 ...>..1..+....
573 ..b.........2.
574 ..............
575 Level:
576 Michael Speck
577 Level 14
578 Bricks:
579 ..............
580 ..............
581 ..............
582 EEEEEEEEEEEEEE
583 .eeeeeeeeeeee.
584 ..eeeeeeeeee..
585 ...gggggggg...
586 ....gggggg....
587 ....iiiiii....
588 ...iiiiiiii...
589 ..hhhhhhhhhh..
590 .hhhhhhhhhhhh.
591 ..............
592 ffffffffffffff
593 #f#f#f#f#f#f#f
594 dddddddddddddd
595 dddddddddddddd
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ..............
601 ..............
602 .>.-...+...2..
603 ....2.l..-....
604 ...+.....<....
605 .....-.1.+....
606 ..............
607 ...b..2.......
608 ......p.+.1...
609 .1..+.<..-....
610 ..............
611 ..-.s....-.2..
612 .?.?.?.?.?.?.?
613 ....+...b...-.
614 ..b...>...+...
615 ..............
616 Level:
617 Michael Speck
618 Bowl
619 Bricks:
620 ..............
621 ..............
622 ..............
623 EEEEEEEEEEEEEE
624 ..............
625 ..............
626 .c..........c.
627 .cggggggggggc.
628 .cggggggggggc.
629 .cddddddddddc.
630 .c#ffffffff#c.
631 ..#ffffffff#..
632 ..##dddddd##..
633 ...##eeee##...
634 ....##ee##....
635 .....####.....
636 ..............
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 ..............
644 ..............
645 ..............
646 ..2.b.<+..1...
647 ...+..s..b....
648 ....>.f.w.-...
649 ...2..+.1-....
650 ....-.-..+....
651 .....+..2.....
652 .....-.?......
653 ..............
654 ..............
655 ..............
656 ..............
657 Level:
658 Michael Speck
659 Hill
660 Bricks:
661 ..............
662 ..............
663 ..............
664 EEEEEEEEEEEEEE
665 ..............
666 ..............
667 ..............
668 ..............
669 ..............
670 ..............
671 ..............
672 ......hh......
673 .....gggg.....
674 ....ffffff....
675 ...eeeeeeee...
676 ..dddddddddd..
677 b############b
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..............
686 ..............
687 ..............
688 ..............
689 ..............
690 ..............
691 .......+......
692 .....b-.1.....
693 ....b2<.-.....
694 ...+..2m.>+...
695 ...2.-b.1..b..
696 4............4
697 ..............
698 Level:
699 Michael Speck
700 Symmetry
701 Bricks:
702 ..............
703 ..............
704 ..............
705 EEEEEEEEEEEEEE
706 ..i.h.g.f.e.d.
707 .i.h.g.f.e.d.b
708 i.h.g.f.e.d.b.
709 .h.g.f.e.d.b..
710 h.g.f.e.d.b...
711 .g.f.e.d.b..i.
712 g.f.e.d.b..d.i
713 .f.e.d.b..g.d.
714 f.e.d.b..f.g.d
715 .e.#.b..c.#.g.
716 e.#.b....c.#.g
717 .#.b......c.#.
718 #.b........c.#
719 .b..........c.
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ....l.....s...
726 .2.....2...<..
727 ....-...+...?.
728 .-.....f.s....
729 w...b.....-...
730 .....-...2....
731 ..+.>...+..b..
732 .2...f........
733 ..-........-..
734 .....b..+...>.
735 ....1....+....
736 ...<..........
737 ...........1..
738 .2............
739 Level:
740 Michael Speck
741 Rainbow
742 Bricks:
743 ..............
744 ..............
745 ..............
746 EEEEEEEEEEEEEE
747 ..............
748 ..............
749 .........ddddd
750 .....ddddeeeee
751 ..dddeeeehhhhh
752 ddeeehhhhfffff
753 eehhhffffiiiii
754 hhfffiiiiggggg
755 ffiiigggg..h..
756 iiggg....h....
757 gg..h..h...h..
758 ..h..h......h.
759 .h.....h.h....
760 ....h.......h.
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 ..............
768 ...........-..
769 ......<.......
770 ...-....+..<..
771 .w....f..-.+..
772 ..>.-..b....>.
773 .-...+...+....
774 ..?.m......2..
775 .+..b....2....
776 ....2..4...2..
777 ..2..2......2.
778 .2.....2.2....
779 ....2.......2.
780 Level:
781 Michael Speck
782 House
783 Bricks:
784 ..............
785 ..............
786 ..............
787 EEEEEEEEEEEEEE
788 ..............
789 ....dddddd....
790 ...dddddddd...
791 ..dddddddddd..
792 .dddddddddddd.
793 .jjj#....#jjj.
794 .jjj#....#jjj.
795 .jjj#gege#jjj.
796 .jjj#egeg#jjj.
797 .jjj#gege#jjj.
798 .jjj#egeg#jjj.
799 .jjj#gege#jjj.
800 .jjj#egeg#jjj.
801 .ffffffffffff.
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 .....2.+......
809 .....f...>....
810 ....1.<..-?...
811 ..+...-..2..m.
812 ..............
813 ...-........+.
814 ......-.....2.
815 ..-....>..-...
816 .s.2..l.....b.
817 .......2..w...
818 .b...+..f..+..
819 ...+..........
820 ..<...?...2...
821 Level:
822 Michael Speck
823 'Fat Boy'
824 Bricks:
825 ..............
826 ..............
827 ..............
828 EEEEEEEEEEEEEE
829 ..............
830 ....hhhhhh....
831 ..hhhhhhhhhh..
832 .hhhheeeehhhh.
833 .hheeeeeeeehh.
834 .hheeeeeeeehh.
835 .hhhheeeehhhh.
836 ..hhheeeehhh..
837 ....hheehh....
838 .....heeh.....
839 .....heeh.....
840 .....heeh.....
841 ...hheeeehh...
842 .hheeeeeeeehh.
843 Bonus:
844 ..............
845 ..............
846 ..............
847 ..............
848 ..............
849 .......s......
850 ...3.+..-.....
851 ....p.2...>...
852 .?.-.2..<.-...
853 ...<...+...+..
854 ..-..f...-....
855 ...+......2...
856 .....2..+.....
857 ......>.......
858 ........p.....
859 .....-........
860 ....2..w.+....
861 ...+..-..2....
862 Level:
863 Michael Speck
864 Twins
865 Bricks:
866 ..............
867 ..............
868 ..............
869 EEEEEEEEEEEEEE
870 ......##......
871 ......##......
872 ......##......
873 eeeeee##eeeeee
874 dddddd##dddddd
875 iiiiii##iiiiii
876 iiiiii##iiiiii
877 hhhhhh##hhhhhh
878 gggggg##gggggg
879 ffffff##ffffff
880 eeeeee##eeeeee
881 dddddd##dddddd
882 ..............
883 ..............
884 Bonus:
885 ..............
886 ..............
887 ..............
888 ..............
889 ..............
890 ..............
891 ..............
892 ..-......<.l..
893 ...2.....f...2
894 3.p.......2.-.
895 .........m..>.
896 +.2.f.......f.
897 f...<...2.....
898 .>.f......+...
899 ..b.2.......3.
900 .3.......2.f..
901 ..............
902 ..............
903 Level:
904 Michael Speck
905 Crusher
906 Bricks:
907 ..............
908 ..............
909 ..............
910 EEEEEEEEEEEEEE
911 ..............
912 ffffffffffffff
913 ffffffffffffff
914 ggggggffgggggg
915 cccccgffgccccc
916 ....cgffgc....
917 ###.cgffgc.###
918 ddd.cgffgc.ddd
919 ddd.cgffgc.ddd
920 ddd.cgffgc.ddd
921 ddd.cgffgc.ddd
922 ###.cggggc.###
923 ....cccccc....
924 ..............
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 .-...<..2...+.
932 ....+.....p...
933 .f.2....-..2..
934 ..w..3..b.>+..
935 ......2.......
936 .....-..3.....
937 .......?......
938 .+...+..2..<..
939 ......f.-..-..
940 b...>.3......?
941 .......-......
942 .....b........
943 ..............
944 Level:
945 Michael Speck
946 Dead End
947 Bricks:
948 ..............
949 ..............
950 ..............
951 EEEEEEEEEEEEEE
952 ..............
953 ..............
954 eeeeeeeeeeeeee
955 dddddddddddddd
956 ddd########ddd
957 ...#gggggg#...
958 hhh#gggggg#hhh
959 eee#ffffff#eee
960 eee#ffffff#eee
961 ...#......#...
962 ggg#ee..ee#ggg
963 ggg#dddddd#ggg
964 ggg#dddddd#ggg
965 ..............
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ..............
971 ..............
972 ..............
973 .+..b..-...+..
974 ..2..+.>.-..1.
975 .-...........-
976 ....f..-......
977 ..<........+..
978 -.....+.>.....
979 .2...2......2.
980 ..............
981 ..-.....<...+.
982 ......b....3..
983 .+...2.f...+..
984 ..............
985 Level:
986 Michael Speck
987 Level 24
988 Bricks:
989 ..............
990 ..............
991 ..............
992 EEEEEEEEEEEEEE
993 ....gg.ff.dd.f
994 ...gg.ff.dd.ff
995 ..gg.ff.dd.ff.
996 .gg.ff.dd.ff.g
997 gg.ff.dd.ff.gg
998 g.ff.dd.ff.gg.
999 .ff.dd.ff.gg.e
1000 ff.dd.ff.gg.ee
1001 f.dd.ff.gg.ee.
1002 .dd.ff.gg.ee..
1003 dd.ff.gg.ee...
1004 b.b.b.b.b.b.b.
1005 .b.b.b.b.b.b.b
1006 b.b.b.b.b.b.b.
1007 Bonus:
1008 ..............
1009 ..............
1010 ..............
1011 ..............
1012 .......?......
1013 .........3....
1014 ..2..-...+....
1015 ....?..b...-..
1016 .p....-...2...
1017 ...+........f.
1018 .-......b.+...
1019 ...b..+......s
1020 .....l...2....
1021 .+..2.....-...
1022 ......f...w...
1023 2.............
1024 ...>.....>....
1025 ..............
1026 Level:
1027 Michael Speck
1028 Level 25
1029 Bricks:
1030 ..............
1031 ..............
1032 ..............
1033 EEEEEEEEEEEEEE
1034 ..............
1035 ..............
1036 aaaaa....aaaaa
1037 eeeeaddddaeeee
1038 hhhhaddddahhhh
1039 eeeeabbbbaeeee
1040 eeeea....aeeee
1041 ..............
1042 ..............
1043 ffff#....#ffff
1044 kkkk#eeee#kkkk
1045 kkkk#eeee#kkkk
1046 ffff#aaaa#ffff
1047 #####....#####
1048 Bonus:
1049 ..............
1050 ..............
1051 ..............
1052 ..............
1053 ..............
1054 ..............
1055 2.s........-..
1056 ......?.b...2.
1057 .+.........m..
1058 -.>...+.....<.
1059 2.b.........+.
1060 ..............
1061 ..............
1062 .?........b.<-
1063 2.+...l....2..
1064 -.>.....+...-.
1065 ..3...f....1..
1066 ..............
1067 Level:
1068 Michael Speck
1069 Barrier
1070 Bricks:
1071 ..............
1072 ..............
1073 ..............
1074 EEEEEEEEEEEEEE
1075 .....#..#.....
1076 .ddd.#ff#.ggg.
1077 .dgd.#ff#.gdg.
1078 .ddd......ggg.
1079 ..............
1080 ####......####
1081 ..............
1082 .bbbbb..bbbbb.
1083 .bhhhb..bfffb.
1084 .biiib..bhhhb.
1085 .bhhhb..bfffb.
1086 .bbbbb..bbbbb.
1087 ..............
1088 ###aaaaaaaa###
1089 Bonus:
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 .......?......
1096 ..5...+....5..
1097 ...-......<...
1098 ..............
1099 ..............
1100 ..............
1101 ..+.2....+.>..
1102 .>..-.......+.
1103 ..-..+..p...2.
1104 .2.-......1...
1105 ...w.....-.+..
1106 ..............
1107 ....f.f..f....
1108 Level:
1109 Michael Speck
1110 Butterfly
1111 Bricks:
1112 ..............
1113 ..............
1114 ..............
1115 EEEEEEEEEEEEEE
1116 .....i..i.....
1117 .hh...ii...hh.
1118 .hfhh.ii.hhfh.
1119 .hfffh##hfffh.
1120 .hfggf##fggfh.
1121 .hfggf##fggfh.
1122 ..hfgf##fgfh..
1123 ..hfgf##fgfh..
1124 ..hfgf##fgfh..
1125 .hfggf##fggfh.
1126 .hfggf##fggfh.
1127 .hfffh##hfffh.
1128 .hfhh.##.hhfh.
1129 .hh........hh.
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ..............
1135 ..............
1136 .2....-.......
1137 ..<....f...1..
1138 ...+......-...
1139 ....2....2..>.
1140 .+..-.....+...
1141 ...l....2.....
1142 ..s..3.....-..
1143 ...+.....-....
1144 ..2.......w...
1145 ....?...2...+.
1146 .-.>.......<..
1147 .1.+.....b....
1148 ..............
1149 Level:
1150 Michael Speck
1151 Chamber
1152 Bricks:
1153 ..............
1154 ..............
1155 ..............
1156 EEEEEEEEEEEEEE
1157 ..#........#..
1158 ..#ffffffff#..
1159 ..#dddddddd#..
1160 gg#gggggggg#gg
1161 gg#gggggggg#gg
1162 ..#dddddddd#..
1163 ..#........#..
1164 e.###cccc###.e
1165 ee..........ee
1166 .ee.iiiiii.ee.
1167 ..eeffffffee..
1168 ...effffffe...
1169 ....iiiiii....
1170 .####....####.
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..............
1176 ..............
1177 ...f..3.......
1178 ....-..>.3....
1179 .-...3..?.....
1180 <.....f...>..+
1181 ....>..-.f....
1182 ..............
1183 ..............
1184 +...........+.
1185 .2..1.s..-.2..
1186 ...+..<1.-f...
1187 .....f.+..1...
1188 .....2..b.....
1189 ..............
1190 Level:
1191 Michael Speck
1192 The Final
1193 Bricks:
1194 ..............
1195 ..............
1196 ..............
1197 EEEEEEEEEEEEEE
1198 ..............
1199 eeeeeeeeeeeeee
1200 cceeeeeeeeeecc
1201 iccffffffffcci
1202 iiccffffffccii
1203 iiicccccccciii
1204 iiiib....biiii
1205 ....b....b....
1206 ddddb....bdddd
1207 ddddbggggbdddd
1208 hhhaaggggaahhh
1209 hhaaggggggaahh
1210 haa........aah
1211 ##....##....##
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..w.2....?....
1219 2....+.2..b.-.
1220 ..-..<...l...b
1221 .b..p.f....2..
1222 ..+..-..>.+...
1223 2.>.-.......s.
1224 .........-....
1225 ...2.......?..
1226 .?...b...+...2
1227 ..-..+.2...-..
1228 .+..2.>.f.>.3.
1229 ..b........+..
1230 ..............
0 Version: 1.00
1 Level:
2 Michael Speck
3 Late At Night
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 bbbbbbbbbbbbbb
10 aaaaaaaaaaaaaa
11 affaaaaafafffa
12 aaafaaaffaaafa
13 aaafafaafaaafa
14 aafaaaaafaafaa
15 afaaafaafaafaa
16 afaaaaaafafaaa
17 afffaaaafafaaa
18 aaaaaaaaaaaaaa
19 bbbbbbbbbbbbbb
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ....>.........
29 ..?..!.0.*....
30 0.......w...b.
31 ....d1.....-..
32 .&.....p..?...
33 ...+..b..~....
34 1...?..s.1..0.
35 ..W..-..c.}1+.
36 ...0..f..-....
37 .b.....{.....?
38 ....+.......>.
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Enter
45 Bricks:
46 ....f.gg.f....
47 ...f.g..g.f...
48 ..f.g.ee.g.f..
49 .f.g.e..e.g.f.
50 f.g.e.dd.e.g.f
51 .g.e.d..d.e.g.
52 g.e.dccccd.e.g
53 .e.d.chhc.d.e.
54 e.d.fchhcf.d.e
55 #d.f.chhc.f.d#
56 .#f.hhhhhh.f#.
57 ..#h......h#..
58 ...#......#...
59 ....#vvvv#....
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ...~..........
67 .......-.&....
68 .w.1.0....?.l.
69 ..d....1......
70 ........{.0...
71 ....?........m
72 .!.j..+.b.+.1.
73 ..0.}1.....-..
74 .......c......
75 ......b.1.....
76 ..............
77 ..............
78 .....W+>?.....
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Fate
86 Bricks:
87 ..............
88 .....jjjj.....
89 ....jjkkjj....
90 ...jjk..kjj...
91 ..jjk....jjj..
92 ..jjk.....jk..
93 ..jk......jk..
94 ..........jk..
95 .........jjk..
96 ........jjk...
97 .......jjk....
98 ......jjk.....
99 ......jj......
100 ......jk......
101 ......jk......
102 ..............
103 ......jk......
104 ......jk......
105 Bonus:
106 ..............
107 .....?.?......
108 ......?.?.....
109 ....?....?....
110 ...?......?...
111 ..?........?..
112 ...?......?...
113 ...........?..
114 ..........?...
115 .........?....
116 ........?.....
117 .......?......
118 ......?.......
119 .......?......
120 ......?.......
121 ..............
122 .......?......
123 ......?.......
124 Level:
125 Michael Speck
126 Schielded Targets
127 Bricks:
128 ..............
129 .vvvvvvvvvvvv.
130 .v*vv*vv*vv*v.
131 .vvvvvvvvvvvv.
132 ..............
133 .vvvvvvvvvvvv.
134 .v*vv*vv*vv*v.
135 .vvvvvvvvvvvv.
136 ..............
137 .vvvvvvvvvvvv.
138 .v*vv*vv*vv*v.
139 .vvvvvvvvvvvv.
140 ..............
141 .vvvvvvvvvvvv.
142 .v*vv*vv*vv*v.
143 .vvvvvvvvvvvv.
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..b...f...b...
149 ..0..0..0..0..
150 ....W....?....
151 ..............
152 ......<.......
153 ..0b.1..1>.0..
154 .>..l..W....-.
155 ..............
156 .......f..<...
157 ..0-.1..1..0..
158 ....b..?..W...
159 ..............
160 ....f.+.......
161 ..0..0..0..0..
162 ...W......+...
163 ..............
164 ..............
165 Level:
166 Michael Speck
167 Narrow Streets
168 Bricks:
169 .i.f.e..e.f.i.
170 .i.f.e..e.f.i.
171 di.f.e..e.f.id
172 .idf.e..e.fdi.
173 .i.fde..edf.i.
174 .i.f.edde.f.i.
175 .i.f.e..e.f.i.
176 hi.f.e..e.f.ih
177 .ihf.e..e.fhi.
178 .i.fhe..ehf.i.
179 .i.f.ehhe.f.i.
180 .i.f.e..e.f.i.
181 ..............
182 a#.#.#..#.#.#a
183 .#b#.#cc#.#b#.
184 .#.#c#..#c#.#.
185 .#.#.#..#.#.#.
186 ..............
187 Bonus:
188 ..............
189 ..............
190 1............1
191 ..1........1..
192 ....1....1....
193 ......22......
194 ..............
195 ?............?
196 ..?........?..
197 ....?....?....
198 ..............
199 ...b.b..b.b...
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Michael Speck
208 Minefields
209 Bricks:
210 ..............
211 ..............
212 .jggggg*ggggj.
213 .kjg*ggggggjk.
214 .kijgggg*gj*k.
215 .ki*jg*ggjiik.
216 .*iiijggjiiik.
217 .kii*ijjiiiik.
218 .kiiiii*i*i*k.
219 .kiiiiiiiiiik.
220 .ki*iijjiiiik.
221 .k*ii*g*jiiik.
222 .kiijgggg*ii*.
223 .kijggggggjik.
224 .kjgg*ggggg*k.
225 .*gggggg*gggj.
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 .....<........
232 ..j........>..
233 ..?...-.s..0..
234 ..........+...
235 ...w-..c-.....
236 ......+...p...
237 ..-..l.0.1.2..
238 .+..~......-..
239 ...1..d..fb...
240 .>2..0.1......
241 ...+........1.
242 ..........?...
243 ...b...+...1<.
244 .1......b.....
245 ..............
246 ..............
247 Level:
248 Michael Speck
249 Spaceship
250 Bricks:
251 ..............
252 ......jj......
253 .....jkkj.....
254 ....jkggkj....
255 ...jkkggkkj...
256 ..jkkkggkkkj..
257 .j####cc####j.
258 .j#.ffffff.#j.
259 .j#.ffffff.#j.
260 .j#.bbbbbb.#j.
261 .j#.******.#j.
262 ..#.******.#..
263 ..##########..
264 ...hh#dd#hh...
265 .hhed#ed#dehh.
266 ...###he###...
267 ......he......
268 .......h......
269 Bonus:
270 ..............
271 ..............
272 ......?.......
273 ....-.0.......
274 .......w.c....
275 ..b..s........
276 ......ff....0.
277 .0.......?....
278 .....<......+.
279 .>............
280 ....1.1.1.....
281 .....1.1.1....
282 ..............
283 ....b.m.......
284 ..+.......-.>.
285 .......2......
286 ..............
287 ..............
288 Level:
289 Michael Speck
290 Pointers
291 Bricks:
292 ..............
293 ..............
294 ..............
295 ..............
296 cccccc###ccccc
297 aaaeeee#ffffaa
298 affaeee#fffaee
299 afffaee#ffaeee
300 affffae#faeeee
301 afffffa#aeeeee
302 affffae#faeeee
303 afffaee#ffaeee
304 affaeee#fffaee
305 aaaeeee#ffffaa
306 cccccc###ccccc
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ..............
315 .2........+...
316 ....<.1.......
317 ..b........s.<
318 w....f..?.....
319 ...-.....-..+.
320 .->...l....j..
321 2...........1.
322 ..+..1.....b.-
323 ...?....p.....
324 -....+........
325 ...b......>.+.
326 ..............
327 ..............
328 ..............
329 Level:
330 Michael Speck
331 Linux Rocks!
332 Bricks:
333 ....ee........
334 d.....ee......
335 d.e.....ee....
336 d.ef......ee..
337 d.eff.fg....ee
338 d.eff.fg.gh...
339 ddef.ffg.gh.h.
340 ..ef.ffg.gh.h.
341 ...f..fg.gh.h.
342 ee....fg.g.h..
343 ..ee....g.h.h.
344 ....ee....h.h.
345 ......ee..h.hd
346 ........ee...d
347 cccaaacca.accd
348 c.ca.ac.aa.c.d
349 cc.a.ac.aa..c.
350 c.caaacca.accd
351 Bonus:
352 ..............
353 .......1......
354 ..............
355 >.2.......j...
356 ....<.........
357 ...-..>-......
358 +....w....+.?.
359 .......f.1....
360 ...b..+.......
361 .......1...<..
362 ........b...2.
363 .....f....b...
364 .............b
365 ..............
366 2-.?.......-..
367 .........?....
368 ......1.+...>.
369 ....+.........
370 Level:
371 Michael Speck
372 Diggin'
373 Bricks:
374 ..............
375 ...........dee
376 .....ff...dgde
377 .....ff...dgde
378 ......f.@@@gde
379 ......ffff@gde
380 ......ffgg@gde
381 .....#fg#dgdee
382 ..eee#fg#edee.
383 .eede#gf#eee..
384 eedgd#gf#.....
385 edg@ggff......
386 edg@ffff......
387 edg@@@.f......
388 edgd...ff.....
389 edgd...ff.....
390 eed...........
391 ..............
392 Bonus:
393 ..............
394 .............l
395 ......w.....1.
396 .....d.....?..
397 ............W.
398 ......2..1....
399 .......+.....2
400 ...........+..
401 ..?...!.....>.
402 ...}......-...
403 .......1......
404 .-..p.........
405 ......?.......
406 .2............
407 1.+.....>.....
408 .......b......
409 ..............
410 ..............
411 Level:
412 Michael Speck
413 Death And Rebirth
414 Bricks:
415 ..............
416 ..............
417 ..............
418 ..............
419 ...!..!!..!...
420 ..*.*....*.*..
421 .!...!**!...!.
422 ..*.*....*.*..
423 ...!..!!..!...
424 ..*.*....*.*..
425 .!...!**!...!.
426 ..*.*....*.*..
427 ...!..!!..!...
428 ..*........*..
429 .!..........!.
430 ..............
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ..............
436 ..............
437 ......>...1...
438 ....+.........
439 .......2c.....
440 ...........+<.
441 .+.-.2..+.~...
442 ..1..-........
443 ......s.-.w.3.
444 ..b.d.........
445 .>.-.<..f.?.-.
446 ......b.......
447 ...1+..?..b...
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Michael Speck
454 Modern Art
455 Bricks:
456 ..............
457 ggggggggggiiid
458 ggggggjjggggid
459 kkkkkgjjggg#id
460 keeeeg#jjjg#id
461 keddeg#jjjg#id
462 ke#dee#jjjg#id
463 ke#dee#jjfg#id
464 ke#dee#jffg#id
465 ke#deeefff##id
466 ke#dddffffiiid
467 kk##ddf#hhhiid
468 kjjdddf#hhhiid
469 jjjdddf#hhhhhd
470 jjjjdd##hhhhhd
471 ##........###.
472 ..............
473 ..............
474 Bonus:
475 ..............
476 ...........j..
477 ..<.0...-<....
478 ....-.1.....1.
479 .c........d...
480 ...+.f.......b
481 ....b...~+....
482 0...........0.
483 .>..w...s1....
484 -...3..?....-.
485 ...l..p..+....
486 .2..........>.
487 .....-..0..+..
488 .+..?.....b..2
489 ...b..........
490 ..............
491 ..............
492 ..............
493 Level:
494 Michael Speck
495 LePrechaun's Treasure
496 Bricks:
497 .....fff......
498 ....fffff.....
499 ....fffff.....
500 ....fffff.....
501 ....fffff.....
502 ....fffff.....
503 .fff.fff.fff..
504 fffffffffffff.
505 fffffffffffff.
506 fffffffffffff.
507 fffffffffffff.
508 fffffffffffff.
509 .fff.fffffff..
510 ....ffffff....
511 ....fffff.f...
512 ....fffff..f..
513 ....fffff..ff.
514 .....fff.....f
515 Bonus:
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..............
523 ..............
524 ..............
525 ......5.......
526 ..............
527 ..............
528 ..g.......g...
529 ..............
530 ..............
531 ..............
532 ......m.......
533 ......g.......
534 Level:
535 Michael Speck
536 Trenches
537 Bricks:
538 ...ddddddddd..
539 ..eeeeeeeeeee.
540 !.fffffffffff.
541 ..gggkgggkggg.
542 ..gggkgggkggg.
543 !..g.k.g.k.g..
544 .....k...k....
545 .....k...k....
546 !.............
547 .......x......
548 ...***.x.***..
549 !.#*#*#x#*#*#.
550 ..#*#*#x#*#*#.
551 ..#*#*#x#*#*#.
552 !.#*#*#x#*#*#.
553 ..#*#z#x#z#*#.
554 ###*###x###*##
555 ..............
556 Bonus:
557 ...s.......*..
558 ..............
559 .?..l.........
560 ..............
561 ......>.>.....
562 .?.w...p...c..
563 ..............
564 .....f...f....
565 .?............
566 ..............
567 ...1.1...1.1..
568 .?............
569 ...1.1...1.1..
570 ..............
571 .?.1.1...1.1..
572 .....b.+.b....
573 ...1...+...1..
574 ..............
575 Level:
576 Michael Speck
577 Fortress
578 Bricks:
579 ..............
580 .EEEbbbbbbEEE.
581 .Edd......ddE.
582 .Ed!......!dE.
583 .E....!!....E.
584 .b..hh#ff@..b.
585 .b..hh#fff..b.
586 .b..hh#fff..b.
587 .b.!###fff..b.
588 .b..ggg###!.b.
589 .b..ggg#ee..b.
590 .b..ggg#ee..b.
591 .b..@gg#ee..b.
592 .E....!!....E.
593 .Ed!..zz..!dE.
594 .Edd.yyyy.ddE.
595 .EEExxxxxxEEE.
596 ..............
597 Bonus:
598 ..............
599 ........-.....
600 ..3........3..
601 .....-..?.....
602 ...........?..
603 ....<.........
604 .W......>.....
605 ...+.j........
606 .......-.w....
607 .<...d........
608 ....>.....+.b.
609 .....b..m.....
610 ......c..{....
611 ..............
612 ..............
613 ..3..+..s..3..
614 .....W.f......
615 ..............
616 Level:
617 Michael Speck
618 Knock Knock
619 Bricks:
620 ..............
621 .*............
622 ..............
623 EEEEEEE.ffffff
624 ......#.fddddf
625 ......#.eeeeee
626 f....f#.eeeeee
627 fggggf#.fdzzdf
628 fddddf#.fdzzdf
629 fdzzdf.#fddddf
630 fdzzdf.#fggggf
631 eeeeee.#f....f
632 eeeeee.#......
633 fddddf.#......
634 ffffff.EEEEEEE
635 ..............
636 ............*.
637 ..............
638 Bonus:
639 ..............
640 .5............
641 ..............
642 ........!c....
643 ...........{..
644 ........1.?.l.
645 ........>....1
646 ...W.....*.m..
647 .1...b......+.
648 w...-...1-....
649 ..m.........b.
650 .?..&.........
651 ..}..1........
652 1..+..........
653 .....>........
654 ..............
655 ............5.
656 ..............
657 Level:
658 Michael Speck
659 Drill
660 Bricks:
661 .#............
662 .e#h.......!..
663 .ee#h.....!...
664 .eed#h........
665 .eedd#h...####
666 .eeddg#h..bakj
667 .eeddgg#h.bakj
668 .eeddggi#.bakj
669 .eeddggii.bakj
670 .eeddggii.bakj
671 .eeddggi#.bakj
672 .eeddgg#h.bakj
673 .eeddg#h..bakj
674 .eedd#h...####
675 .eed#h........
676 .ee#h.....!...
677 .e#h.......!..
678 z#............
679 Bonus:
680 ..............
681 ...b.....b....
682 ..............
683 ..*...........
684 ......!.......
685 .+............
686 ......1......1
687 ...1.+.....-..
688 ......w.?.....
689 ..f.W...?.j...
690 .2...2.-....+.
691 ....*...0..1..
692 ...-...0..c...
693 .b....>.......
694 ....b0....d...
695 ....0.........
696 ...0..........
697 g.............
698 Level:
699 Michael Speck
700 Against All Odds
701 Bricks:
702 ..............
703 ..............
704 .jkgi#........
705 .jkgi#........
706 .jkgi#........
707 .jkgi#...!*!..
708 .kkgi#...*!*..
709 .gggi#...!*!..
710 .iiii#........
711 .#####........
712 ........#####.
713 ........#dddd.
714 ..!*!...#deee.
715 ..*!*...#deff.
716 ..!*!...#defj.
717 ........#defj.
718 ........#defj.
719 ........#defj.
720 Bonus:
721 ..............
722 ..............
723 .d..>.........
724 ..............
725 .-.d....~.b.c.
726 ..............
727 ..c...........
728 ..............
729 .>..f...~...c.
730 ..............
731 ..............
732 .c...~...f..>.
733 ..............
734 ...........c..
735 ..............
736 .c.b.~....d.-.
737 ..............
738 .........>..d.
739 Level:
740 Michael Speck
741 Insane In The Brain
742 Bricks:
743 ..............
744 ..............
745 ..............
746 ....@@@@@@....
747 ....@kkkk@....
748 ...g@kkkk@g...
749 ..@@@jjjj@@@..
750 ..@kjeeeejk@..
751 ..@kjeddejk@..
752 ..@kjeddejk@..
753 ..@kjeeeejk@..
754 ..@@@jjjj@@@..
755 ...g@....@g...
756 ....@zzzz@....
757 ....@zzzz@....
758 ..............
759 ..............
760 ..............
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 ......s.......
767 ...3...?..3...
768 .....&........
769 ........d.....
770 ......~.......
771 ....+..-..>...
772 ....>.}.......
773 .....b..>.....
774 ...3......3...
775 ......1.1.....
776 .....+.W......
777 ..............
778 ..............
779 ..............
780 Level:
781 Michael Speck
782 Alien
783 Bricks:
784 ......gg......
785 .d....gg....d.
786 .dd...gg...dd.
787 .ddd..gg..ddd.
788 .ddddggggdddd.
789 .####gggg####.
790 .#eegg!!ggee#.
791 .#eegg!!ggee#.
792 .#eeg*@@*gee#.
793 .#eeef@@feee#.
794 .#eeeffffeee#.
795 .#eeff..ffee#.
796 .fff.f..f.fff.
797 .....#..#.....
798 ....#h..h#....
799 ...#h!..!h#...
800 ..#h!....!h#..
801 .#hh......hh#.
802 Bonus:
803 .......<......
804 ......?.......
805 ...........1..
806 ..1....W......
807 ...*....w.s.-.
808 .....-........
809 ..b...........
810 ....}.l..>.1..
811 .....c..f.-...
812 ...+.....2....
813 ..........j...
814 ..<......?....
815 ...1.......+..
816 ..............
817 ........b.....
818 ......>.......
819 ....+....3....
820 ..2...........
821 Level:
822 Michael Speck
823 Tricky
824 Bricks:
825 ..............
826 .####....####.
827 .#dd#....#ff#.
828 .#dd#....#ff#.
829 .#dd#....#ff#.
830 .#dd#....#ff#.
831 .#dd#....#ff#.
832 .####....####.
833 ..............
834 .####....####.
835 .#ii#....#gg#.
836 .#ii#....#gg#.
837 .#ii#!..!#gg#.
838 .#ii#....#gg#.
839 .#ii#....#gg#.
840 .####....####.
841 ..............
842 ..............
843 Bonus:
844 ..............
845 ..............
846 ..............
847 ..2........+..
848 ..........2...
849 ...2..........
850 ..?........2..
851 ..............
852 ..............
853 ..............
854 ..?.......b...
855 ...2.m..m..-..
856 ..+.......2...
857 .....m..m.....
858 ..2........2..
859 ..............
860 ..............
861 ..............
862 Level:
863 Michael Speck
864 Be Smart!
865 Bricks:
866 hh.zzzzzzzzzzz
867 hh.zzxzxzxzxzz
868 hh.zzxzxzxzxzz
869 hh.zzxzxzxzxzz
870 ee.zzxxxzxzxzz
871 ee.zzxzxzxzxzz
872 ee.zzxzxzxzzzz
873 dd.zzxzxzxzxzz
874 dd.zzzzzzzzzzz
875 ..............
876 ###zzzzxzzzzzz
877 jj#zzzxzzzzzzz
878 kk#zzxxxxxxxzz
879 jj#zzzxzzzzzzz
880 vv#zzzzxzzzzzz
881 ..............
882 ..............
883 ..............
884 Bonus:
885 ....1.........
886 .l.....?1.b...
887 4..>........&.
888 .....&...1....
889 .4....c......1
890 ........~.&...
891 ....&.......}.
892 4......p.?....
893 .*...1..&....!
894 ..............
895 ....{.........
896 **......1>.1..
897 ...1..&.....&.
898 ....b.....+..1
899 .....+........
900 ..............
901 ..............
902 ..............
903 Level:
904 Michael Speck
905 Two Glasses
906 Bricks:
907 ..............
908 ..............
909 ..............
910 ..............
911 ..............
912 .#..#....#..#.
913 .#gg#....#gg#.
914 .#gg#....#gg#.
915 .#gg#....#gg#.
916 .#gg#....#gg#.
917 .#gg#....#gg#.
918 .#gg#....#gg#.
919 .#gg#....#gg#.
920 .#gg#....#gg#.
921 .#gg#....#gg#.
922 .@gg@....@gg@.
923 .@@@@....@@@@.
924 ..............
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..s1......1+..
933 ..............
934 ..1b......*1..
935 ..............
936 ..b2......>2..
937 ..............
938 ..1-......1?..
939 ..............
940 ..?5......-5..
941 ..............
942 ..............
943 ..............
944 Level:
945 Michael Speck
946 Corners
947 Bricks:
948 ..............
949 #jj....#hh....
950 #jj....#hh....
951 #*j....#*h....
952 @##....@##....
953 ....#ee....#ff
954 ....#ee....#ff
955 ....#*e....#*f
956 ....@##....@##
957 .#dd....#gg...
958 .#dd....#gg...
959 .#*d....#*g...
960 .@##....@##...
961 .....#kk......
962 .....#kk...#ii
963 .....#*k...#ii
964 .....@##...#*i
965 ...........@##
966 Bonus:
967 ..............
968 .-......<.....
969 ..>......?....
970 .2......2.....
971 ..............
972 .....+......l.
973 ......W......b
974 .....2......2.
975 ..............
976 ..+...........
977 ...c......<...
978 ..2......2....
979 ..............
980 ......m.......
981 .......>......
982 ......2......-
983 ............2.
984 ..............
985 Level:
986 Michael Speck
987 Magnet
988 Bricks:
989 ....kkkkkk....
990 ...kkkkkkkk...
991 ...kkkkkkkk...
992 ..kkk....kkk..
993 ..kk......kk..
994 ..kk......kk..
995 ..kk......kk..
996 ..gg......dd..
997 ..gg......dd..
998 ..gg......dd..
999 ..gg......dd..
1000 ..gg......dd..
1001 ..gg.....@dd#.
1002 .#gg......dd.#
1003 .@gg#...#.ddE.
1004 ..gg@....Edd@.
1005 .#gg.#....dd..
1006 .Egg......dd#.
1007 Bonus:
1008 ....d..?......
1009 ...>..~..>....
1010 .....{.b{.....
1011 ....!....W?...
1012 ...-.......w..
1013 ..W.......>...
1014 ...>.......c..
1015 ..............
1016 ..?.......{...
1017 ...{.......W..
1018 ..&........-..
1019 ...b......?...
1020 ..+...........
1021 ...&......b...
1022 ...........+..
1023 ..>...........
1024 ..........{...
1025 ...{.......>..
0 Level:
1 Armish
2 M$ Ruins :]
3 Bricks:
4 .aaaaaaaaaa...
5 .aiiiafffa.a..
6 .aiiiafffaa.a.
7 .aiiiafffa.a..
8 .aiiiafffaa.a.
9 .aaaaaaaaa.a..
10 .agggahhhaa.a.
11 .agggahhha.a..
12 .agggahhhaa.a.
13 .agggahhha.a..
14 .aaaaaaaaaa.a.
15 ...........a..
16 ............a.
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Armish
43 Explosive
44 Bricks:
45 EEEEEEEEEEEEEE
46 cccccccccccccc
47 c************c
48 c*cccccccccc*c
49 c*c********c*c
50 c*c*cccccc*c*c
51 c*c******c*c*c
52 c*cccccccc*c*c
53 c**********c*c
54 cccccccccccc*c
55 EEEEEEEEEEEEcE
56 ..............
57 ..............
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ..............
71 ..............
72 ..............
73 ..............
74 ..............
75 ..............
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 Armish
84 Wanna play basket?
85 Bricks:
86 ..............
87 ..............
88 ..............
89 ....EghigE....
90 ....EghigE....
91 ....EghigE....
92 ....EghigE....
93 ....Eg**gE....
94 ....EghigE....
95 ....EghigE....
96 ....EghigE....
97 ....EghigE....
98 ....EEEEEE....
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 Armish
125 Time's important!
126 Bricks:
127 ..............
128 .....aaa......
129 ....afxfa.....
130 ...affxffa....
131 ..afffxfffa...
132 ..afffxfffa...
133 ..agxxxffga...
134 ..afffffffa...
135 ..afffffffa...
136 ...afffffa....
137 ....afgfa.....
138 .....aaa......
139 ..............
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Armish
166 TuRKiSH FLaG
167 Bricks:
168 ..............
169 .iiiiicciiiii.
170 .iiiicccciiii.
171 .iiicciiiiiii.
172 .iiiciiiiiiii.
173 .iicciiiiiiii.
174 .iicciiiiciii.
175 .iicciiicccii.
176 .iicciiiiciii.
177 .iicciiicicii.
178 .iiiciiiiiiii.
179 .iiicciiiiiii.
180 .iiiicccciiii.
181 .iiiiicciiiii.
182 ..............
183 ..............
184 ..............
185 ..............
186 Bonus:
187 ..............
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 Level:
206 Armish
207 What the hell...?
208 Bricks:
209 .....vvvv.....
210 .....vvvv.....
211 .....vvvv.....
212 .....vvvv.....
213 .....v**v.....
214 .....v**v.....
215 .....vvvv.....
216 .....vvvv.....
217 .....vvvv.....
218 .....vvvv.....
219 ..............
220 .....vvvv.....
221 .....vvvv.....
222 .....vvvv.....
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Armish
248 Ready for football?
249 Bricks:
250 ffffffjfffffff
251 jjxfffjfxffjjj
252 ffjffjjjfffxff
253 #fjfjfjfjffjf#
254 zfjfxfjfjffjfz
255 *xjfjfjfjffjf*
256 *fjfjfxfjffjx*
257 zfjfjfjfjffjfz
258 #fjffjjjfffjf#
259 ffxfffjffffjff
260 jjjfxfjfxffxjj
261 ffffffjfffffff
262 ..............
263 ..............
264 ..............
265 ..............
266 ..............
267 ..............
268 Bonus:
269 ..............
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 Level:
288 Armish
289 Cigarette kills you...
290 Bricks:
291 ........k.k.k.
292 .........k.kk.
293 ..........kk..
294 ..........kk..
295 ...eejjjjj.k..
296 ...eejjjjj....
297 ...#.#.#.#....
298 ..............
299 ..............
300 ..............
301 ..............
302 ..............
303 ..............
304 ..............
305 ..............
306 ..............
307 ..............
308 ..............
309 Bonus:
310 ..............
311 ..............
312 ..............
313 ..............
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 ..............
320 ..............
321 ..............
322 ..............
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 Level:
329 Armish
330 www.linux-sevenler.de
331 Bricks:
332 **************
333 *............*
334 *..!!....!!..*
335 *..!!....!!..*
336 *............*
337 *.....!!.....*
338 *.!...!!...!.*
339 *.!!......!!.*
340 *..!!....!!..*
341 *...!!!!!!...*
342 *.......!!...*
343 *.......!!...*
344 *............*
345 **************
346 ..............
347 ..............
348 ..............
349 ..............
350 Bonus:
351 ..............
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 ..............
364 ..............
365 ..............
366 ..............
367 ..............
368 ..............
0 Level:
1 Latts
2 LBreakout2
3 Bricks:
4 v.v.v.v.v.v.v.
5 .v.v.v.v.v.v.v
6 v.v.v.v.v.v.v.
7 ..............
8 j....jjj...jj.
9 j....j..j.j..j
10 j....j..j....j
11 j....j..j....j
12 j....j..j...j.
13 j....jjjj...j.
14 j....j..j..j..
15 j....j..j..j..
16 j....j..j.j...
17 j....j..j.j...
18 jjjj.jjj..jjjj
19 .v.v.v.v.v.v.v
20 v.v.v.v.v.v.v.
21 .v.v.v.v.v.v.v
22 Bonus:
23 0.....+.....0.
24 ...<.0.....p..
25 ..0.....W.0.l.
26 ..............
27 j....?......}.
28 ..........0...
29 0....0..0.....
30 .....~........
31 ..............
32 -.....+.-...-.
33 .....0.....!..
34 ........0..<..
35 ..............
36 ........~.....
37 -.0...W....0..
38 .0.-.{...?....
39 ..W.....<.d.0.
40 ...<.>.~.....d
41 Level:
42 Latts
43 Double Zero
44 Bricks:
45 hghghghghghghg
46 ..............
47 ..............
48 vvvvvv..vvvvvv
49 v....v..v....v
50 v....v..v....v
51 v....v..v....v
52 v....v..v....v
53 v....v..v....v
54 v...xv..vx...v
55 v...xv..vx...v
56 v...xv..vx...v
57 v@@@#v..v#@@@v
58 v....v..v....v
59 v....v..v....v
60 v....v..v....v
61 v....v..v....v
62 vvvvvv..vvvvvv
63 Bonus:
64 c...w.0l.f.p..
65 ..............
66 ..............
67 s..0......b..0
68 0....?........
69 ........0.....
70 .............+
71 ..............
72 m.............
73 ........0.....
74 ....jc...?....
75 ..............
76 0.0........0..
77 .............s
78 <.............
79 .....+........
80 ........0.....
81 ...f.......<..
82 Level:
83 Latts
84 Expansion
85 Bricks:
86 !...!....!...!
87 !!..!!..!!..!!
88 @!!..!..!..!!@
89 .@!..!!!!..!@.
90 ..!...!!...!..
91 ..@!..!!..!@..
92 ..c!......!c..
93 ..c!......!c..
94 ..c!!....!!c..
95 ...@!!..!!@...
96 ....@!..!@....
97 .....!!!!.....
98 .....@!!@.....
99 ......!!......
100 ......@@......
101 ..............
102 ..............
103 ..............
104 Bonus:
105 ....>....-....
106 .s.......f....
107 ...........W0.
108 .....c>+...?..
109 .0?...~.-.0&..
110 ...p.......!..
111 ..f00.....0f..
112 ...?......>...
113 ..fW....c..f..
114 ....b0...s....
115 .....>........
116 .....f..f+....
117 .......m0.....
118 ......j.......
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 Latts
125 Rainbow Cross
126 Bricks:
127 ..............
128 ...########...
129 ..............
130 .@gggggggggg@.
131 .g#dddddddd#g.
132 .gd#ffffff#dg.
133 #gdf#hhhh#fdg#
134 #gdfh#jj#hfdg#
135 #gdfhj##jhfdg#
136 #gdfhj##jhfdg#
137 #gdfh#jj#hfdg#
138 #gdf#hhhh#fdg#
139 .gd#ffffff#dg.
140 .g#dddddddd#g.
141 .@gggggggggg@.
142 ..............
143 ...########...
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ...0..0.......
150 ....W...>.0...
151 ......b-......
152 ..b?.......?..
153 .0..l..s....+.
154 ....c.........
155 ..0..m....~.~.
156 ..-.>.0...0...
157 .......j..0...
158 .....?........
159 .W..w...0>....
160 ...........s..
161 ..............
162 ..............
163 ..............
164 Level:
165 Latts
166 Where Are They?
167 Bricks:
168 .....v....v...
169 ..............
170 v.............
171 .............v
172 ..............
173 ..............
174 ........v.....
175 v.............
176 ..............
177 ..............
178 ..............
179 ..............
180 ..............
181 ..............
182 .v........v...
183 ..............
184 ..............
185 ..............
186 Bonus:
187 .....0....0...
188 ..............
189 0.............
190 .............0
191 ..............
192 ..............
193 ........0.....
194 0.............
195 ..............
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 .0........0...
202 ..............
203 ..............
204 ..............
205 Level:
206 Latts
207 Up & Down
208 Bricks:
209 dd..jE..Ej..dd
210 dd..E....E..dd
211 ...E......E...
212 ...E.jjjj.E...
213 ..E..jjjj..E..
214 ..E..jjjj..E..
215 .E...jjjj...E.
216 .....E..E.....
217 .....E..E.....
218 v...E....E...v
219 v...E....E...v
220 v..E......E..v
221 v..E......E..v
222 ..E........E..
223 ..E........E..
224 .E..........E.
225 E............E
226 E............E
227 Bonus:
228 ....0....0...b
229 ............w.
230 ..............
231 ......??......
232 .....bbbb.....
233 ..............
234 ......ww......
235 ..............
236 ..............
237 +.............
238 w............c
239 0............0
240 0............0
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Latts
248 No Smoking
249 Bricks:
250 .kddddddddddd.
251 d.kd........dd
252 dk.........ddd
253 dkk.......dd.d
254 d.k......dd..d
255 dkk.....dd...d
256 dk.....dd....d
257 d.djjjjjjeeeed
258 d.djjjjjjeeeed
259 d.djjjjjjeeeed
260 d.....dd.....d
261 d....dd......d
262 d...dd.......d
263 d..dd........d
264 d.dd.........d
265 ddd..........d
266 dd...........d
267 .dddddddddddd.
268 Bonus:
269 ...<.-0W..+.f.
270 b.............
271 .f............
272 ..........?..0
273 .............0
274 .........f....
275 .?............
276 W...?..~.0.W..
277 0.{.....0.....
278 0..0f......?-.
279 ......+.......
280 0....l........
281 -....d........
282 ...>.........>
283 ..............
284 .0............
285 .............0
286 .d.<..f>.<.~..
287 Level:
288 Latts
289 Meow
290 Bricks:
291 .jjjj####jjjj.
292 .jjj#....#jjj.
293 .jj#......#jj.
294 vj#........#jv
295 .#..aa..aa..#.
296 .#..aa..aa..#.
297 .#..........#.
298 .#..........#.
299 .#..........#.
300 .#....##....#.
301 .#....##....#.
302 .#....dd....#.
303 .#....dd....#.
304 v#..d.dd.d..#v
305 ..#..dddd..#..
306 ...#......#...
307 ....#....#....
308 .....####.....
309 Bonus:
310 ..0........0..
311 .~..0....0..-.
312 ..m0......0...
313 Ws..........?+
314 ..............
315 .0...0...s..~.
316 ..............
317 ..............
318 ..............
319 ......0.......
320 .?..........0.
321 ......11......
322 ......b-......
323 c0...........W
324 .......?0.....
325 ..........-...
326 ..............
327 ..............
328 Level:
329 Latts
330 Shakin'
331 Bricks:
332 ....j@@@@j....
333 ...j@....@j...
334 ..j@......@j..
335 .j@..cccc..@j.
336 .@...@@@@...@.
337 ....@....@....
338 ...@......@...
339 ..@..bbbb..@..
340 .@...@@@@...@.
341 ....@....@....
342 ...@......@...
343 ..@..aaaa..@..
344 .@...@@@@...@.
345 ....@ffff@....
346 ...@iiiiii@...
347 ..@........@..
348 .@..........@.
349 ..............
350 Bonus:
351 ....0..0.f....
352 ...c..........
353 ..............
354 ..f..>0b......
355 ............0.
356 ..............
357 ...0......0...
358 ......m<-.....
359 ..............
360 ..............
361 ..............
362 .....-.>c.....
363 .0............
364 .....0.0......
365 ....f.wb.00...
366 ..............
367 ..............
368 ..............
369 Level:
370 Latts
371 Balls
372 Bricks:
373 vvvvvvvvvvvvvv
374 v............v
375 v............v
376 v.....hh.....v
377 v.....hh.....v
378 v.....hh.....v
379 v.....hh.....v
380 v.....hh.....v
381 v.....hh.....v
382 v.....hh.....v
383 v.....hh.....v
384 v.....hh.....v
385 v.....hh.....v
386 v.....hh.....v
387 v.....hh.....v
388 v.....hh.....v
389 v.....hh.....v
390 v.....hh.....v
391 Bonus:
392 0W+W+WWWW+W+W0
393 W............W
394 0............0
395 +.....bb.....+
396 <.....bb.....<
397 0.....bb.....0
398 W.....WW.....W
399 0.....WW.....0
400 W.....ww.....W
401 0.....>>.....W
402 W.....>>.....0
403 <.....++.....<
404 0.....>>.....0
405 W.....ww.....<
406 W.....ff.....W
407 0.....WW.....0
408 +.....ff.....+
409 +.....++.....+
410 Level:
411 Latts
412 Beer
413 Bricks:
414 ..............
415 ...jjjjjj.....
416 ...jjjjjj.....
417 ...cjjjjc.....
418 ...cjjjjc.....
419 ...ceeeeccc...
420 ...ceeeec.c...
421 ...ceeeec.c...
422 ...ceeeec.c...
423 ...ceeeec.c...
424 ...ceeeec.c...
425 ...ceeeec.c...
426 ...ceeeec.c...
427 ...ceeeeccc...
428 ...ceeeec.....
429 ...ceeeec.....
430 ...cccccc.....
431 ..............
432 Bonus:
433 ..............
434 ........+.....
435 ...0...W......
436 .....0.<0.....
437 ....~.........
438 ..............
439 ....-0..~.....
440 ......<0......
441 ...0......p...
442 .....0..0.....
443 ........l.....
444 .....W.0......
445 ...b....w.....
446 ....s..!......
447 ....0.........
448 ......0.0.....
449 .....0........
450 ..............
451 Level:
452 Latts
453 Chaos
454 Bricks:
455 .g.###g.#..#.e
456 ...#...ie.i.h.
457 #.g.i.j..#.#.#
458 i.j##.###hij#.
459 ....h##f.#i.#.
460 e#i..d..i##did
461 ..##.i.j...#..
462 .jg.f###dg..j.
463 h.i#...#.j.#.h
464 .#h.hi...#d...
465 .d.#.dj.#..if#
466 gj#j#f.i.g.j..
467 .#.i#.j.#.h#..
468 #..#.he##....f
469 .gj###.i.di#..
470 #.e.h#g.g.j.#e
471 #j##.....h.##e
472 ....fd.jh.e...
473 Bonus:
474 ....0........<
475 ..........p.m.
476 ....f.........
477 ..........*...
478 .........00...
479 0.W..c..W...0<
480 .......d......
481 ....m0..0...c.
482 d.<...........
483 ..0...........
484 ......f.....+.
485 .-..*W.c.0....
486 ...d..-...l...
487 ......0d0.....
488 .~.......~....
489 ..f.0d....0..c
490 ..............
491 ....f...0.....
492 Level:
493 Latts
494 Hardball
495 Bricks:
496 vvvvvvvvvvvvvv
497 vvvvvvvvvvvvvv
498 vvvvvvvvvvvvvv
499 vvvvvvvvvvvvvv
500 vvvvvvvvvvvvvv
501 vvvvvvvvvvvvvv
502 vvvvvvvvvvvvvv
503 vvvvvvvvvvvvvv
504 vvvvvvvvvvvvvv
505 vvvvvvvvvvvvvv
506 vvvvvvvvvvvvvv
507 vvvvvvvvvvvvvv
508 vvvvvvvvvvvvvv
509 vvvvvvvvvvvvvv
510 vvvvvvvvvvvvvv
511 vvvvvvvvvvvvvv
512 hhhhhhhhhhhhhh
513 jjjjjjjjjjjjjj
514 Bonus:
515 W.W.W0.W.WW.W.
516 W>.W.W<....>.W
517 ..W.W.W.W0W...
518 0WW0+W<W.W.WWW
519 ....W.W...W+..
520 W.W?.W-WW<.-.W
521 .W.WW.W...0...
522 W-.W.0.+W.WW0.
523 ..W.WW>W.?WW.0
524 0WW<..W.WW..WW
525 .0..W..0W.Wd0.
526 W.W.+WW.....-W
527 .W.WW..0WW.W.W
528 .+0?.0WW..+.0<
529 WW..W.<.-W0W..
530 ..WW.0.W.W..WW
531 bbbbbb.bbbbbbb
532 w.w.w.w.w.w.w.
533 Level:
534 Latts
535 The Cell
536 Bricks:
537 jjjjjjjjjjjjjj
538 jjjjjjjjjjjjjj
539 #.#.#.##.#.#.#
540 #.#.#.##.#.#.#
541 #.#.#.##.#.#.#
542 #.#.#.##.#.#.#
543 #.#.#.##.#.#.#
544 #.#.#.##.#.#.#
545 #.#.#.##.#.#.#
546 #.#.#.##.#.#.#
547 #.#.#.##.#.#.#
548 #.#.#.##.#.#.#
549 #.#.#.##.#.#.#
550 #.#.#.##.#.#.#
551 #.#.#.##.#.#.#
552 #.#.#.##.#.#.#
553 #.#.#.##.#.#.#
554 jjjjjjjjjjjjjj
555 Bonus:
556 *....0.......*
557 ......~.<.0...
558 0.............
559 ......&....0..
560 .......0......
561 ..............
562 0...0.~....0..
563 d.............
564 .........0....
565 ......0.......
566 0............<
567 ....~....0....
568 ...........~..
569 .............0
570 ..-.-.d0...p..
571 0.............
572 ..............
573 ..0f.m-0f0.0..
574 Level:
575 Latts
576 Dice
577 Bricks:
578 aaaaaa........
579 aaaada........
580 aaaada........
581 aaaaaa........
582 aaaaaa........
583 aaaaaa........
584 aaaaaa........
585 adaaaa.aaaaaa.
586 adaaaa.adaada.
587 aaaaaa.adaada.
588 .......aaaaaa.
589 .......aaaaaa.
590 .......aaaaaa.
591 .......aaaaaa.
592 .......adaada.
593 .......adaada.
594 .......aaaaaa.
595 ..............
596 Bonus:
597 .....0........
598 ~-0?..........
599 ..............
600 .dW*..........
601 f0.0W.........
602 <.-...........
603 .{..Wd........
604 ...<0..~.0....
605 .0f.f....{-...
606 ..............
607 .........f..0.
608 .......0?0.s..
609 ..........W...
610 .......W......
611 .........f~...
612 .........0.Wf.
613 ........<d-...
614 ..............
615 Level:
616 Latts
617 Which Way?
618 Bricks:
619 .....g........
620 .....gg.......
621 gggggggg......
622 ggggggggg.....
623 gggggggg......
624 .....gg.......
625 .....g..#.....
626 .......##.....
627 ......#j######
628 .....#jjjjjjjj
629 ......#j######
630 .......##.....
631 .....e..#.....
632 .....ee.......
633 eeeeeeee......
634 eeeeeeeee.....
635 eeeeeeee......
636 .....ee.......
637 Bonus:
638 .....m........
639 ..............
640 .~0W.?0.......
641 f.d.0{.>p.....
642 0..-..........
643 ......f.......
644 .....0........
645 ..............
646 ......<0.d.0.l
647 ......+...0.-.
648 ......?.0~~...
649 ..............
650 .....~........
651 ..............
652 .0.><W-0......
653 &.d.0..s......
654 .0f...0.......
655 ..............
656 Level:
657 Latts
658 Union Jack
659 Bricks:
660 djgggjddjgggjd
661 ddjggjddjggjdd
662 dddjgjddjgjddd
663 jdddjjddjjdddj
664 gjdddjddjdddjg
665 ggjddddddddjgg
666 gggjddddddjggg
667 jjjjjddddjjjjj
668 dddddddddddddd
669 dddddddddddddd
670 jjjjjddddjjjjj
671 gggjddddddjggg
672 ggjddddddddjgg
673 gjdddjddjdddjg
674 jdddjjddjjdddj
675 dddjgjddjgjddd
676 ddjggjddjggjdd
677 djgggjddjgggjd
678 Bonus:
679 0..0....{.s...
680 ....~..0....0.
681 ............-.
682 ..{...f.......
683 ..............
684 0...<.0?.....<
685 ...w...{0..0.0
686 .-..0....l....
687 !..........w..
688 ...s.+.-.~....
689 ..f........0..
690 .0..b..0.?..-.
691 -.......f.....
692 .........0...<
693 ..w?.{....+b..
694 0......?......
695 .....0<.......
696 ..p.....0.....
697 Level:
698 Latts
699 $$$
700 Bricks:
701 ...e......e...
702 ...e......e...
703 ..eee....eee..
704 .eeeee..eeeee.
705 .e.e....e.e...
706 .e.e....e.e...
707 .e.e....e.e...
708 .e.e....e.e...
709 .eeee...eeee..
710 ..eeee...eeee.
711 ...e.e....e.e.
712 ...e.e....e.e.
713 ...e.e....e.e.
714 ...e.e....e.e.
715 .eeeee..eeeee.
716 ..eee....eee..
717 ...e......e...
718 ...e......e...
719 Bonus:
720 ...0......0...
721 ..............
722 ..0.0....0.0..
723 .0...0..0...0.
724 .b.0....w.0...
725 ..............
726 ...0......0...
727 ..............
728 .0.0j...0.0j..
729 .....0......0.
730 .....?......?.
731 ...0......0...
732 ..............
733 ...0......0...
734 .0...0..0...0.
735 ..0.0....0.0..
736 ..............
737 ...0......0...
738 Level:
739 Latts
740 Snake
741 Bricks:
742 *EEEEEEEEEEEEE
743 .E...E...E.aaE
744 .E.E.E.E.E.EaE
745 .E.E.E.E.E.EaE
746 .E.E.E.E.E.EaE
747 .E.E.E.E.E.EaE
748 .E.E.E.E.E.EaE
749 .E.E.E.E.E.EaE
750 .E.E.E.E.E.EaE
751 .E.E.E.E.E.EaE
752 .E.E.E.E.E.EaE
753 .E.E.E.E.E.EaE
754 .E.E.E.E.E.EaE
755 .E.E.E.E.E.EaE
756 .E.E.E.E.E.EaE
757 .E.E.E.E.E.EaE
758 ...E...E...EaE
759 EEEEEEEEEEEEaE
760 Bonus:
761 ..............
762 ...........bb.
763 ............b.
764 ............b.
765 ............b.
766 ............0.
767 ............0.
768 ............0.
769 ............0.
770 ............m.
771 ............0.
772 ..............
773 ..............
774 ............w.
775 ............w.
776 ............w.
777 ............w.
778 ............w.
779 Level:
780 Latts
781 Looks Simple Enough
782 Bricks:
783 ii#jj....jj#ii
784 f..#j....j#..f
785 f...#....#...f
786 .....#..#.....
787 ..............
788 ..............
789 ....#....#....
790 ...#......#...
791 hh#........#hh
792 h#..........#h
793 .....E@@E.....
794 i............i
795 #............#
796 h#..........#h
797 hh#........#hh
798 ...#......#...
799 ....#....#....
800 .....#..#.....
801 Bonus:
802 0..*........c0
803 ....?....w....
804 -............f
805 .....-........
806 ..............
807 ..............
808 ....0.........
809 ..........0...
810 b...........l.
811 .............>
812 ..............
813 ?............s
814 ..............
815 0............0
816 ............?.
817 ..............
818 ....0.........
819 ..............
820 Level:
821 Latts
822 Get In There!
823 Bricks:
824 eeeeeeeeeeeeee
825 eeeeeeeeeeeeee
826 e@e@e@ee@e@e@e
827 ..............
828 ..............
829 ##############
830 ffffffccgggggg
831 ######..######
832 ddddd....hhhhh
833 #####....#####
834 jjjj......iiii
835 ####......####
836 iii........jjj
837 ###........###
838 hh..........dd
839 ##..........##
840 g............f
841 #............#
842 Bonus:
843 0....0.....j.0
844 ......{..0....
845 ..0..0-..>....
846 ..............
847 ..............
848 ....-.........
849 0..m.>??d0..*0
850 ..-...........
851 ...{.....0*.-.
852 .0............
853 .+.b......d>0.
854 ..*...........
855 .md...........
856 ...........0.l
857 .<...........0
858 0.............
859 c.............
860 ..............
861 Level:
862 Latts
863 Potion
864 Bricks:
865 ........c.....
866 ..............
867 ..EEEE..EEEE..
868 .....Ec.E.....
869 ....EE..EE....
870 ...E......E...
871 ..E.c.c....E..
872 .E......c.c.E.
873 .E..c.......E.
874 .Ec...c..c..E.
875 .EiiiiiiiiiiE.
876 .EiiiiiiiiiiE.
877 .EiiiiiiiiiiE.
878 .EiiiiiiiiiiE.
879 .EiiiiiiiiiiE.
880 ..EiiiiiiiiE..
881 ...EiiiiiiE...
882 ....EEEEEE....
883 Bonus:
884 ........s.....
885 ..............
886 ..............
887 ......?.......
888 ..............
889 ..............
890 ....?.?.......
891 ........?.?...
892 ....?.........
893 ..-...0..?....
894 ...0....>.{...
895 ...00.0.0..0..
896 ..pppppppppp..
897 ..b.>..s.f0...
898 ..0..+0....0..
899 ...0{.........
900 .....f.0.-....
901 ..............
902 Level:
903 Latts
904 Boomerang
905 Bricks:
906 ....xx....xx..
907 ...xx....xx...
908 ..xx....xx....
909 .xx....xx.....
910 xx....xx......
911 x....xx.......
912 ....xx....v..v
913 ...xx.....v..v
914 ...xx.....v..v
915 ...xx.....v..v
916 ....xx....v..v
917 .....xx...v..v
918 x.....xx..vvvv
919 xx.....xx.....
920 .xx.....xx....
921 ..xx.....xx...
922 ...xx.....xx..
923 ....xx.....xxx
924 Bonus:
925 ....W.....bW..
926 ...l.....m....
927 ..b......0....
928 .0.....*......
929 {<.....W......
930 .....w........
931 .....d........
932 ....0.....0..0
933 ....-.........
934 ....>.....0..0
935 ....?-.......0
936 ..........0..0
937 0.....<....00.
938 W.......0.....
939 ..w.....W.....
940 ..{......0....
941 ...d.......-..
942 ..............
943 Level:
944 Latts
945 Round The Corner
946 Bricks:
947 b.!....v......
948 b.!....v......
949 ##kkkkkkkk##..
950 ##kkkkkkkk##..
951 ############..
952 ############..
953 ##jjjjjjjj##..
954 ##jjjjjjjj##..
955 ############..
956 ############..
957 ##dddddddd##..
958 ##dddddddd##..
959 ############..
960 ############..
961 ##gggggggg##..
962 ##gggggggg##..
963 ############..
964 ############..
965 Bonus:
966 b.-....?......
967 m......?......
968 ....W......>..
969 ..&..0........
970 ?...>W...0f...
971 .......0..0...
972 ...0..........
973 .0f..<0.......
974 !.............
975 .....c.0......
976 ..?......c.0..
977 ...*W.........
978 0.....~.-.....
979 .....>.0......
980 .~.....0......
981 ..0...c.......
982 ..........!...
983 ...f....W.....
984 Level:
985 Latts
986 What The?
987 Bricks:
988 !.*..!.*@....!
989 ...@.......*..
990 .....*...!....
991 *@*...!.......
992 !...!..*..*.!.
993 ..!..*...@..@.
994 .......!.!....
995 .!.*.@......*!
996 ......*!@..!..
997 *...!....*....
998 @.*.......@..@
999 ...@.*.*.!.!..
1000 .!.!..@.....*.
1001 ....*..!@.....
1002 *.*@.....*.*..
1003 .....!....@..!
1004 !..!..*.!...@.
1005 .*.....@...!..
1006 Bonus:
1007 .c..........d.
1008 dc..d{..{..d{{
1009 .......c.c{...
1010 ...ccd...{.c..
1011 ......{d....d{
1012 {{.d.d..c.{d..
1013 .dcc...d..d...
1014 c.....{.c.c...
1015 .{c{.d{c.....c
1016 ...cd.c.{d....
1017 ...{c.........
1018 c...c...{c.c{.
1019 {dc....{..{c..
1020 .{....c.......
1021 d...{{.c...dd{
1022 ..{.d...d.....
1023 .dd.{.c..{....
1024 ........{...{.
1025 Level:
1026 Latts
1027 Compact
1028 Bricks:
1029 ....EEEEEE....
1030 ....EddddE....
1031 ....EddddE....
1032 ....EhhhhE....
1033 ....jjjjjj....
1034 ....kkiikk....
1035 ....kkiikk....
1036 ....kkiikk....
1037 ....kkiikk....
1038 ....kkiikk....
1039 ....kkiikk....
1040 ....kkiikk....
1041 ....kkiikk....
1042 ....jjjjjj....
1043 ....EhhhhE....
1044 ....EddddE....
1045 ....EddddE....
1046 ....EEEEEE....
1047 Bonus:
1048 ..............
1049 ......0s......
1050 .....?..f.....
1051 ........0.....
1052 .........+....
1053 .......W......
1054 ........0.....
1055 .....0.{......
1056 ......f..W....
1057 .....b..0.....
1058 ....0..s......
1059 ....0....-....
1060 ......W~......
1061 ....-...b0....
1062 ..............
1063 .....+.f......
1064 .....f..-.....
1065 ..............
1066 Level:
1067 Latts
1068 Alcatraz
1069 Bricks:
1070 j@@@@@@@@@@@@@
1071 .@............
1072 .@..........@.
1073 .@..........@.
1074 .@..........@.
1075 .@..........@.
1076 .@..........@.
1077 .@..........@.
1078 .@...aaaa...@.
1079 .@...vvvv...@.
1080 .@...aaaa...@.
1081 .@..........@.
1082 .@..........@.
1083 .@..........@.
1084 .@..........@.
1085 .@..........@.
1086 ............@.
1087 @@@@@@@@@@@@@.
1088 Bonus:
1089 5.............
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 ..............
1096 ..............
1097 .....wwbb.....
1098 .....0000.....
1099 .....bbww.....
1100 ..............
1101 ..............
1102 ..............
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 Level:
1108 Latts
1109 Round & Round
1110 Bricks:
1111 EEEEEEEEEEEEEE
1112 E............E
1113 E............E
1114 EaEEEEEEEEEE.E
1115 E.E........E.E
1116 E.E........E.E
1117 E.EaEEEEEE.E.E
1118 E.E.Ev...E.E.E
1119 E.E.Ev...E.E.E
1120 E.E.EEEEaE.E.E
1121 E.E......E.E.E
1122 E.E......E.E.E
1123 E.EEEEEEEEaE.E
1124 E..........E.E
1125 E..........E.E
1126 EEEEEEEEEEEE.E
1127 .............E
1128 ..EEEEEEEEEEEE
1129 Bonus:
1130 ..............
1131 ..............
1132 ..............
1133 .b............
1134 ..............
1135 ..............
1136 ...b..........
1137 .....2........
1138 .....2........
1139 ........b.....
1140 ..............
1141 ..............
1142 ..........b...
1143 ..............
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 Level:
1149 Latts
1150 X Games
1151 Bricks:
1152 .j..........j.
1153 .hj........jh.
1154 .#hj......jh#.
1155 .d#hj....jh#d.
1156 .gd#hj..jh#dg.
1157 ..gd#hjjh#dg..
1158 ...gd#hh#dg...
1159 ....gd##dg....
1160 ....gd##dg....
1161 ....gd##dg....
1162 ....gd##dg....
1163 ...gd#hh#dg...
1164 ..gd#hjjh#dg..
1165 .gd#hj..jh#dg.
1166 .d#hj....jh#d.
1167 .#hj......jh#.
1168 .hj........jh.
1169 .j..........j.
1170 Bonus:
1171 ............~.
1172 ..0...........
1173 ...........0..
1174 .f.cW.....>...
1175 ...0<.......0.
1176 ....!.0.m.....
1177 .......c......
1178 .....p.?0.....
1179 ......0..0....
1180 ....0-..!.....
1181 .......0.d....
1182 ...W.>.<.l....
1183 ....f0........
1184 ..0......-.s..
1185 ...0+......0..
1186 ..............
1187 ..............
1188 ..............
1189 Level:
1190 Latts
1191 Latts
1192 Bricks:
1193 ..............
1194 ..............
1195 ..............
1196 d..ddddddddddd
1197 d..d.d.d..d.d.
1198 d..ddd.d..d.dd
1199 d..d.d.d..d..d
1200 dddd.d.d..d.dd
1201 h..hhhhhhhhhhh
1202 h..h.h.h..h.h.
1203 h..hhh.h..h.hh
1204 h..h.h.h..h..h
1205 hhhh.h.h..h.hh
1206 k..kkkkkkkkkkk
1207 k..k.k.k..k.k.
1208 k..kkk.k..k.kk
1209 k..k.k.k..k..k
1210 kkkk.k.k..k.kk
1211 Bonus:
1212 ..............
1213 ..............
1214 ..............
1215 ...W..0.f..0..
1216 0.............
1217 ...-..........
1218 ...0...0..W..f
1219 *d............
1220 .....0..s.0...
1221 ..............
1222 ...0.........0
1223 f....~.?..~..0
1224 .....0........
1225 ...f......0.0.
1226 0......0......
1227 ...{...<..d...
1228 ...0.........!
1229 .......-..0...
1230 Level:
1231 Latts
1232 Purple Star
1233 Bricks:
1234 @@@@@@ii@@@@@@
1235 f.....ii.....f
1236 .g....ii....g.
1237 EEd...ii...dEE
1238 ...x..ii..x...
1239 ....j.ii.j....
1240 .....eiie.....
1241 .....h##h.....
1242 iiiii####iiiii
1243 iiiii####iiiii
1244 @@@..h##h..@@@
1245 .....eiie.....
1246 ....j.ii.j....
1247 ...x..ii..x...
1248 ..d...ii...d..
1249 .g....ii....g.
1250 f.....ii.....f
1251 ......ii......
1252 Bonus:
1253 ......0.......
1254 0.............
1255 .......0....0.
1256 .......>...>..
1257 ......+...0...
1258 ....0.........
1259 .......0......
1260 ........c.....
1261 0........?...0
1262 .?0>.0....0+..
1263 ......0.......
1264 .......f!.....
1265 ..............
1266 ...f...0..0...
1267 ..............
1268 .0....0>......
1269 ..............
1270 ..............
1271 Level:
1272 Latts
1273 Playstation2
1274 Bricks:
1275 ..............
1276 ..............
1277 ..............
1278 aaaavaaaa.aaaa
1279 a..ava.......a
1280 a..ava.......a
1281 a..ava.......a
1282 a..ava.......a
1283 a..ava.......a
1284 aaaavaaaavaaaa
1285 a.......ava...
1286 a.......ava...
1287 a.......ava...
1288 a.......ava...
1289 a....aaaavaaaa
1290 ..............
1291 ..............
1292 ..............
1293 Bonus:
1294 ..............
1295 ..............
1296 ..............
1297 ..0..0>>>.0.-.
1298 .............d
1299 {...0........0
1300 -..>-........>
1301 ....0s.......{
1302 0....!........
1303 fff.~fff0.0fff
1304 .........+....
1305 d.......{.....
1306 0.......-.s...
1307 .........0....
1308 .....fff.....0
1309 ..............
1310 ..............
1311 ..............
1312 Level:
1313 Latts
1314 In Like Flynn
1315 Bricks:
1316 ..............
1317 .EEEEEEEEEEEEE
1318 .Eh.......!eeE
1319 .Eh.@vcbaa...E
1320 kEh@.v.......E
1321 kE@..v.......E
1322 .....v.......E
1323 .Eg..v...i..!E
1324 .Eg..vk..i...E
1325 .....vk......E
1326 kE@..v......!E
1327 kEh@.v.......E
1328 .Eh.@vcbaa...E
1329 .Eh..........E
1330 .Eh..........E
1331 .Eh..........E
1332 .Eh..iii..!eeE
1333 .EEEEEEEEEEEEE
1334 Bonus:
1335 ..............
1336 ..............
1337 ..0........0!.
1338 .....m.0-b....
1339 w.............
1340 .....0........
1341 ............0.
1342 ..0..0...0....
1343 ......b.....0.
1344 .....-b.......
1345 w....0.....0..
1346 ..............
1347 ..0..?.0.b....
1348 ..............
1349 ..W...........
1350 ..0......0....
1351 .....0.0..00p.
1352 ..............
1353 Level:
1354 Latts
1355 C'mon
1356 Bricks:
1357 @.............
1358 @.@@@.@@@.@@@.
1359 @.@g@.@g@.@g@.
1360 @.@g@.@g@.@g@.
1361 @.@g@.@g@.@g@.
1362 @.@g@.@g@.@g@.
1363 @.@g@.@g@.@g@.
1364 @.@.@.@.@.@.@.
1365 @.@.@.@.@.@.@.
1366 @.@.@.@.@.@.@.
1367 @.@.@.@.@.@.@.
1368 @.@.@.@.@.@.@.
1369 @g@.@g@.@g@.@.
1370 @g@.@g@.@g@.@.
1371 @g@.@g@.@g@.@.
1372 @g@.@g@.@g@.@.
1373 @g@.@g@.@g@.@.
1374 @@@.@@@.@@@.@.
1375 Bonus:
1376 ..............
1377 ..............
1378 ...0...0...0..
1379 ..............
1380 ...0...0...0..
1381 ...b...b...b..
1382 ...w...w...w..
1383 ..............
1384 ..............
1385 ..............
1386 ..............
1387 ..............
1388 .w...w...w....
1389 .b...b...b....
1390 .0...0...0....
1391 ..............
1392 .0...0...0....
1393 ..............
1394 Level:
1395 Latts
1396 Mirror Image
1397 Bricks:
1398 ......kk......
1399 ...!..kk..!...
1400 .EEEEEEEEEEEE.
1401 .##jj#EE#jj##.
1402 .##hj#EE#jh##.
1403 .hhhj#EE#jhhh.
1404 .giijjEEjjiig.
1405 .gi#ejEEje#ig.
1406 .gi##jEEj##ig.
1407 .gi##jEEj##ig.
1408 .gi##jEEj##ig.
1409 .gi#ejEEje#ig.
1410 .giijjEEjjiig.
1411 .hhhj#EE#jhhh.
1412 .##hj#EE#jh##.
1413 .##jj#EE#jj##.
1414 .EEEEEEEEEEEE.
1415 ..............
1416 Bonus:
1417 ...-...0......
1418 ......m...j...
1419 ..............
1420 .........*....
1421 ...0....0.f...
1422 .0..~.........
1423 ........?!.0..
1424 ....b......0..
1425 .{0l....c.....
1426 .....0..0..W0.
1427 ..............
1428 .0..........~.
1429 ..0..&..0.....
1430 ..........>...
1431 .0..c....0....
1432 ....W.........
1433 ..............
1434 ..............
1435 Level:
1436 Latts
1437 Spiral
1438 Bricks:
1439 cccccccccccccc
1440 c............c
1441 c.cccccccccc.c
1442 c.c........c.c
1443 c.c.cccccc.c.c
1444 c.c.c....c.c.c
1445 c.c.c.cc.c.c.c
1446 c.c.c.cc.c.c.c
1447 c.c.c.cc.c.c.c
1448 c.c.c.c..c.c.c
1449 c.c.c.c..c.c.c
1450 c.c.c.cccc.c.c
1451 c.c.c......c.c
1452 c.c.cccccccc.c
1453 c.c..........c
1454 c.cccccccccccc
1455 c.............
1456 cccccccccccc..
1457 Bonus:
1458 d.f....<..0-d.
1459 ..............
1460 0.....0.......
1461 .............>
1462 ..0.?...d.....
1463 W..........&..
1464 ....+.j.......
1465 ..d......f.0.W
1466 -.....b0......
1467 .........-.>..
1468 ..>......?...~
1469 ....{....W.d..
1470 ..............
1471 ..~....l.0...0
1472 &.............
1473 .....0.d......
1474 ..............
1475 ..0f..<0......
1476 Level:
1477 Latts
1478 Tip Top
1479 Bricks:
1480 ivvvvvvvvvvvvi
1481 i............i
1482 i............i
1483 @@@@......@@@@
1484 h............h
1485 h.....dd.....h
1486 h....dggd....h
1487 @@@..d..d..@@@
1488 h....d..d....h
1489 h...dg..gd...h
1490 h...d....d...h
1491 @@.dg....gd.@@
1492 i.vd......dv.i
1493 i.dg......gd.i
1494 i.d........d.i
1495 .dg........gdi
1496 dgg........ggd
1497 @@@........@@@
1498 Bonus:
1499 +..0.?.0p.0.b.
1500 0............0
1501 ..............
1502 ..............
1503 0.............
1504 -.....0<.....0
1505 ~....?.......+
1506 ..............
1507 ........>.....
1508 <...b0.......>
1509 ....0........0
1510 ....-....+0...
1511 f............~
1512 0.0>.........0
1513 ...........~..
1514 ..f..........0
1515 .0.........0..
1516 ..............
1517 Level:
1518 Latts
1519 Pyramid
1520 Bricks:
1521 ..............
1522 ..............
1523 ......EE......
1524 ......ii......
1525 .....iiii.....
1526 .....EEEE.....
1527 .....kkkk.....
1528 ....kkkkkk....
1529 ....EEEEEE....
1530 ....vvvvvv....
1531 ...vvvvvvvv...
1532 ...EEEEEEEE...
1533 ...gggggggg...
1534 ..gggggggggg..
1535 ..EEEEEEEEEE..
1536 ..hhhhhhhhhh..
1537 .hhhhhhhhhhhh.
1538 .EEEEEEEEEEEE.
1539 Bonus:
1540 ..............
1541 ..............
1542 ..............
1543 ......00......
1544 ..............
1545 ..............
1546 .....?..?.....
1547 .....0..0.....
1548 ..............
1549 .....0..0.....
1550 ....0....0....
1551 ..............
1552 ..............
1553 ...0.bbbb.0...
1554 ..............
1555 ...0.wwww.0...
1556 ..0........0..
1557 ..............
1558 Level:
1559 Latts
1560 Solid
1561 Bricks:
1562 #############k
1563 ##############
1564 ##############
1565 ##############
1566 ##############
1567 ##############
1568 ##############
1569 ##############
1570 ##############
1571 ##############
1572 ##############
1573 ##############
1574 ##############
1575 ##############
1576 ##############
1577 ##############
1578 ######dd######
1579 vvvvvvvvvvvvvv
1580 Bonus:
1581 ....cc.....m..
1582 cc....cc.c....
1583 ..c..c..c.ccc.
1584 cm..c...c.c.c.
1585 ..c.........c.
1586 ......c.......
1587 cc+.c+.c.jc.cc
1588 c..c..c.c...c.
1589 ....cc.c.c.c.c
1590 c.c..........c
1591 ....c.....c.c.
1592 c.+c...c.+c..c
1593 .c.c.c..c....c
1594 .....c........
1595 c...j.+..cc..c
1596 c...c..m.....c
1597 ..cc......cc..
1598 m.....--..+...
1599 Level:
1600 Latts
1601 This Won't Be Easy
1602 Bricks:
1603 ..............
1604 #####.########
1605 kkkkk..kkkkkkk
1606 ######.#######
1607 jjjjjj..jjjjjj
1608 #######.######
1609 iiiiiii..iiiii
1610 ########.#####
1611 hhhhhhhh..hhhh
1612 #########.####
1613 ggggggggg..ggg
1614 ##########.###
1615 ffffffffff..ff
1616 ###########.##
1617 eeeeeeeeeee..e
1618 ############.#
1619 dddddddddddd..
1620 #############.
1621 Bonus:
1622 ..............
1623 ..............
1624 0c..w..c.b.0..
1625 ..............
1626 0...c0...?w*.0
1627 ..............
1628 ..m0......0f..
1629 ...l..........
1630 ..c..*.c..0.m.
1631 ..............
1632 ..?.0.bw...b..
1633 ..............
1634 0...0..<c....c
1635 .....m........
1636 .c...l..0....?
1637 ..............
1638 0.b.0w?f..w...
1639 ..............
1640
0 Level:
1 mos19k-at-ecsis.net
2 Free-Software-foundation
3 Bricks:
4 EEE*!*!*!*!*!*
5 E!*!*!*!*!*!*!
6 E*!*!*!*!*!*!*
7 EE*!*!*!*!*!*!
8 E*!*!*!*!*!*!*
9 E!*!*EEE*!*!*!
10 E*!*!E!*!*!*!*
11 E!*!*E*!*!*!*!
12 E*!*!E!*!*!EEE
13 *!*!*EEE*!*E*!
14 !*!*!*!E!*!E!*
15 *!*!*!*E*!*E*!
16 !*!*!*!E!*!EE*
17 *!*!*EEE*!*E*!
18 !*!*!*!*!*!E!*
19 *!*!*!*!*!*E*!
20 !*!*!*!*!*!E!*
21 *!*!*!*!*!*E*!
22 Bonus:
23 ..............
24 ..............
25 ........g.....
26 .............g
27 ..g...........
28 ..............
29 ....g.........
30 .............g
31 ..............
32 ..............
33 ..g.....g.....
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 b}b}b}b}b}b.b}
40 gwgwgwgwgwgwgw
41 Level:
42 mos19k-at-ecsis.net
43 SuSE
44 Bricks:
45 ..............
46 ......fff.....
47 .....fffff....
48 ....ffffffff..
49 ...ffffffffff.
50 ..ffffffffffzf
51 .ffffffffff@ff
52 ffffffffffff@@
53 fffffffffffff.
54 f...fffffff...
55 f.f..ff..ff...
56 f..f.ff..ff...
57 f..f.ff..ff...
58 .ff.EEEEEEEE..
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ......2.......
66 ......&.>.....
67 .........j<...
68 ...W.b2.{..b..
69 .......+....5.
70 ..2w<.....2..m
71 .>....lc.2p...
72 .....g...&.~..
73 ....?}.sW.>...
74 ......+.......
75 >....b...2<...
76 ...~.55..5!...
77 ..f...........
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 mos19k-at-ecsis.net
84 Gentoo
85 Bricks:
86 ......j.......
87 .....jjj......
88 ....jjjjj.....
89 ...jjjjjjj....
90 ...jjjjjjj....
91 ..jjjjEjjjj...
92 ..jjjEEEjjj...
93 ..jjjjEjjjj...
94 ...jjjjjjjj...
95 ....jjjjjjj...
96 ......jjjjj...
97 .....jjjjj....
98 ....jjjjj.....
99 ....jjjj......
100 ...jjjj.......
101 ..jjjj........
102 ..jjj.........
103 ..jj..........
104 Bonus:
105 ......l.......
106 .....d........
107 .....f........
108 ..............
109 ......3pm.....
110 .....5.5......
111 ..?.3...3.?...
112 .....5.5......
113 ......3.......
114 ....b...&.....
115 ......c...d...
116 ..............
117 .....!.j-.....
118 ..............
119 ......{.......
120 .....+........
121 ..............
122 ...g..........
123 Level:
124 mos19k-at-ecsis.net
125 Slackware1
126 Bricks:
127 cc...cc....c..
128 c.....c....c.c
129 cc.c.cc.cc.cc.
130 .c.c.cc.c..cc.
131 cc.c....c..c.c
132 ...cc...cc.c.c
133 ..............
134 .c.c.c........
135 .c.c.c........
136 ..c.c.........
137 ..c.c.cc......
138 EE.E.E.c......
139 ......cc.cc...
140 ......cc.c..cc
141 .........c..cc
142 .........c..c.
143 ............cc
144 .........E..EE
145 Bonus:
146 55...55....5..
147 .............*
148 ...l........&.
149 ............?.
150 +.......c.....
151 ...?..........
152 ..............
153 .}.+.>........
154 ..............
155 ..p.+.........
156 ..............
157 ..............
158 ......g{..?...
159 ......-.....-.
160 .........-....
161 .........f..!.
162 .............m
163 ..............
164 Level:
165 mos19k-at-ecsis.net
166 debian
167 Bricks:
168 ..............
169 ......dd......
170 .....dddd.....
171 ....dd##dd....
172 ...dd###dd....
173 ...d#####dd...
174 ..dd##d###d...
175 ..dd#ddd##d...
176 ..d##d#d##d...
177 ..d##d###dd...
178 ..d##dd##dd...
179 ..dd##dddd....
180 ..dd###dd.....
181 ...dd###......
182 ...ddd##......
183 ....ddd#......
184 .....ddd......
185 ......dd......
186 Bonus:
187 ..............
188 ......11......
189 .....1111.....
190 ....11..12....
191 ...11...22....
192 ...1.....22...
193 ..11..5...2...
194 ..01.55l..2...
195 ..0..5.l..2...
196 ..0..d...32...
197 ..0..44..33...
198 ..00..m333....
199 ..00...33.....
200 ...00.........
201 ...000........
202 ....000.......
203 .....000......
204 ......0w......
205 Level:
206 mos19k-at-ecsis.net
207 Mandrake1
208 Bricks:
209 ......aa......
210 .....aaaa.....
211 ....aaaaaa....
212 ...aajaajaa...
213 ...ajEjjEja...
214 ...ajjjjjja...
215 ...aeeeeeea...
216 ...aaeeeeaa...
217 ....aeeeea....
218 .....aeea.....
219 .....aaaa.....
220 ....aaaaaa....
221 ....aajjaa....
222 ...aajjjjaa...
223 ...ajjjjjja...
224 ..aajjjjjjaa..
225 ..ajjjjjjjja..
226 ..ajjjjjjjja..
227 Bonus:
228 ..............
229 ......<.......
230 .........>....
231 .....l..m.s...
232 ....?.??.?....
233 ..........-...
234 ...>445544p...
235 .........~....
236 ..............
237 ......j.......
238 .....Wb&+.....
239 ....s.........
240 .....-........
241 ........w.....
242 ......+...j...
243 ..............
244 ....-..s.+b...
245 ..fb.<.....c..
246 Level:
247 mos19k-at-ecsis.net
248 Mandrake2
249 Bricks:
250 ........h.....
251 ........h.....
252 .......hhh....
253 .......hhh..@.
254 ...b..hhhhh..@
255 ..bbhhhhhhhhh.
256 .bb..hhhhhhh.@
257 .b.....hhh..@.
258 bb....hhhhh...
259 bb....hhhhh...
260 Eb...hhh.hhh..
261 .b...hh...hh..
262 .bb..h.bb..h..
263 .Eb....bb.....
264 ..bb..bb......
265 ..Ebbbb.......
266 ....EE........
267 ..............
268 Bonus:
269 ........1.....
270 ........1.....
271 .......5?5....
272 .......555....
273 ...c..!...s...
274 ....111111111.
275 .+...?.2.2d?..
276 .......2s2....
277 s.....12j21...
278 ......12p21...
279 .....112.211..
280 .....11...11..
281 .f...1.+~..1..
282 ..-.....>.....
283 ..d{..f-......
284 ...&>db.......
285 ..............
286 ..............
287 Level:
288 mos19k-at-ecsis.net
289 Caldera
290 Bricks:
291 ......**.....@
292 @....***g....@
293 @...***ggg...@
294 @..***ggggg..@
295 @..**gggggg..@
296 @.**gggggggg.@
297 @.**gggggggg.@
298 @***ggggggggg@
299 @**gggggggggg@
300 @**gggggggggg@
301 @***ggggggggg@
302 @.**gggggggg.@
303 @.**gggggggg.@
304 @..**gggggg..@
305 @..***ggggg..@
306 @...***ggg...@
307 @....***g....@
308 @.....**.....@
309 Bonus:
310 ......44......
311 .....4..5.....
312 ....4..d......
313 ...4..5j......
314 ...4.>...<....
315 ..4.5.?...+...
316 ..4.c-..g.....
317 .4..5..~......
318 .4.?>......?..
319 .4.l>-.*.~....
320 .4..W.+.......
321 ..4.5.....d...
322 ..4.>-..?.....
323 ...4.5&.......
324 ...4..f&......
325 ....4..5~.....
326 .....4..{.....
327 ......44......
328 Level:
329 mos19k-at-ecsis.net
330 Red Hat
331 Bricks:
332 .....aaaa.....
333 ....aaaaaa....
334 ...aadddEaa...
335 ..aadddddaaa..
336 .aaadddddEaaa.
337 .aa##dddddaaa.
338 aad#ddddddaaaa
339 add####dddddaa
340 adddddddddddaa
341 aaajjddddddaaa
342 aaaajjjjjjaaaa
343 aaaajjjjjjaaaa
344 .aaaajjEjaaaa.
345 .ajjjjjjjajja.
346 .ajjjjjjjjjjj.
347 ..jjjjjjjjjj..
348 ...jjjjjjjj...
349 .....jjjj.....
350 Bonus:
351 ..............
352 ......f.3.....
353 ....3.........
354 .....5...3....
355 .w............
356 ...55....~....
357 ...5lm....d.5.
358 .?.5555?.....?
359 ....s....W....
360 b............w
361 ..5...........
362 ...>!..j......
363 ......f.......
364 .......>......
365 ...d......5.~.
366 ......s.......
367 ...b......b...
368 .....w..<.....
369 Level:
370 mos19k-at-ecsis.net
371 Slackware2
372 Bricks:
373 ......bbb.....
374 .....bbbbb....
375 ....bEEEEEb...
376 ...bEEEEEEbb..
377 ...bEbbbbEbb..
378 ..bbEbbbbbbbb.
379 ..bbEbbbbbbbb.
380 .bbbEEEEEbbbbb
381 .bbbbEEEEbbbbb
382 .bbbbbbbbEbbbb
383 .bbbbbbbbEbbbb
384 ..bbbbbbbEbbb.
385 ..b@EbbbbEbbb.
386 ...@EEEEEbbb..
387 ...@zEEEEzbb..
388 ...@@@@@@@@...
389 .....bbbbb....
390 ......bbb.....
391 Bonus:
392 ......ddd.....
393 .....?>l>?....
394 ..............
395 ...*.......*..
396 .....55.......
397 .....55.f.....
398 .....5m.......
399 ..............
400 .{c.........c{
401 .&.....}5....&
402 .+......5....+
403 ..g...f}5.f...
404 ..+3....5...-.
405 ...3..........
406 ...35....4.+..
407 ...33333333...
408 .....b>p<b....
409 ......mwm.....
410 Level:
411 mos19k-at-ecsis.net
412 Lindows
413 Bricks:
414 ....yy.......@
415 @...yy........
416 ....yy.......@
417 @...yy........
418 ....yy.......@
419 @...yy........
420 ...gg........@
421 @..gg.........
422 ...gg........@
423 @...yy........
424 ....yy.......@
425 @...yy........
426 ....yy.......@
427 @...yy........
428 ....yy.......@
429 @...yyyyy.....
430 ....yyyyy....@
431 @...yyyyy.....
432 Bonus:
433 ....22........
434 ....22........
435 ....22........
436 ....22........
437 ....22........
438 ....22........
439 ...bw.........
440 ...wm.........
441 ...bw.........
442 ....22........
443 ....22........
444 ....22........
445 ....22........
446 ....22........
447 ....22........
448 ....22222.....
449 ....22222.....
450 ....2>>>2.....
451 Level:
452 mos19k-at-ecsis.net
453 Ximian
454 Bricks:
455 ......xx......
456 .....xhhx.....
457 ....xhhhhx....
458 ...xhhhahhx...
459 ..xhhahhahhx..
460 .xhhahhhhahhx.
461 .xhahhaaaahhx.
462 xhhahaaaaaaahx
463 xhhhaaaaaaaahx
464 xhhhhahhahaahx
465 xhhhahahahhhhx
466 .xhahhahhahhx.
467 .xahhahhhhahx.
468 ..xhahhhhhhx..
469 ...xhhhhhhx...
470 ....xhhhhx....
471 .....xhhx.....
472 ......xx......
473 Bonus:
474 ......mw......
475 ..............
476 ..............
477 ......&4.+....
478 .....g..4..b..
479 .b..4.-!d4....
480 ...4..4444....
481 ...4.444445l..
482 .-..44444455..
483 .*.s.4.j4!55..
484 {...4.4.4.-+..
485 ...4..4~.4....
486 ..4.pc....4...
487 ....4....&....
488 ..............
489 .....>........
490 ......w<......
491 ..............
492 Level:
493 mos19k-at-ecsis.net
494 Use the Source
495 Bricks:
496 E.E##@@....ggg
497 E.E#.@.....g..
498 E.E##@@....gg.
499 EEE.#@.....g..
500 jjj##@@.##.ggg
501 j..EEE..#.hhh.
502 jjj.E@.@##h...
503 ..j.E@@@#.h...
504 jjj.E@.@##h...
505 ..fff@.@ddhhh.
506 ..f.f...d.d...
507 ..f.f...dd....
508 ..f.f...d.d...
509 ..fffe.ed.d...
510 .....e.e......
511 .....e.e......
512 .....e.e......
513 .....eee......
514 Bonus:
515 ...........555
516 ...........5..
517 ...........55.
518 ...........5..
519 555........555
520 5.........555.
521 555.......5...
522 ..5.......5...
523 555.......5...
524 ..555...55555.
525 ..5.5...5.5...
526 ..5.5...55....
527 ..5.5...5.5...
528 ..w555.55.w...
529 .....5.5......
530 .....5.5......
531 .....5.5......
532 .....bwb......
533 Level:
534 mos19k-at-ecsis.net
535 BSOD
536 Bricks:
537 vvggvvvggggg!*
538 vgvgvvvgggg!*!
539 vgvgvggggg!*!g
540 vvvgvvvgg!*!gg
541 vvggvvvg!*!ggg
542 vgvgggvg*!gggg
543 vgvgvvvggggggg
544 vvvgvvvggggggg
545 gggggggggggggg
546 gggggggggggggg
547 gggggggvvvgvvg
548 gggg!*gvgvgvgv
549 ggg!*!gvgvgvgv
550 gg!*!ggvgvgvgv
551 g!*!gggvgvgvgv
552 !*!ggggvgvgvgv
553 *!gggggvvvgvvg
554 gggggggggggggg
555 Bonus:
556 55<.555-...m..
557 5?5+555.......
558 5?5.5Wc......j
559 55?w555.......
560 55p.555.......
561 5?5.??5f......
562 5?5.555.g..+..
563 555.555......}
564 ...d..??..w-..
565 .+....??......
566 ....jg.555!55<
567 .{.....5c5.5p5
568 ......>5?5.5?5
569 w......5?5.5?5
570 .......5?5.5?5
571 ....-..5?5+5?5
572 ......<555.55s
573 .............w
574 Level:
575 mos19k-at-ecsis.net
576 USA-fireworks
577 Bricks:
578 ..!!!!!ddddd..
579 ..!!!!!ggggg..
580 ..!!!!!ddddd..
581 ..!!!!!ggggg..
582 ..!!!!!ddddd..
583 ..!!!!!ggggg..
584 ..dddddddddd..
585 ..gggggggggg..
586 ..dddddddddd..
587 ..gggggggggg..
588 ..dddddddddd..
589 ..gggggggggg..
590 ..dddddddddd..
591 c..c.cccc..cc.
592 c..c.c....c..c
593 c..c.cccc.cccc
594 c..c....c.c..c
595 cccc.cccc.c..c
596 Bonus:
597 ..j555j44444..
598 ..5555533333..
599 ..5555544444..
600 ..55j5533333..
601 ..5555544444..
602 ..j555j33333..
603 ..4444444444..
604 ..3333333333..
605 ..4444444444..
606 ..3333333333..
607 ..4444444444..
608 ..3333333333..
609 ..4444444444..
610 *..*.*jj*..**.
611 w..w.w....w..w
612 >..>.>}}>.>bb>
613 j..j....}.j..j
614 wbbw.wbbw.w..w
0 Version: 1.00
1 Level:
2 SpocklLord
3 Hol die Blaue
4 Bricks:
5 icc.bb..##dddd
6 c.cx....#####d
7 ccc.....#####d
8 .a.x....##ff#d
9 cccx....##ff#d
10 .x...bb.##ff#d
11 x.x.....##ff#d
12 ........#####d
13 .....bb.######
14 .E.E....######
15 .dd...@.......
16 .dd...........
17 vddvvv.vvvvvvv
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 mww.........{}
25 ...W..........
26 WWW...........
27 .........b55b.
28 ..b.......ww..
29 ......b......-
30 ..........p..-
31 ..........jj.p
32 .....b....bb..
33 ..............
34 ..............
35 ..............
36 g..w.......w.g
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Lord
44 BA BOOM
45 Bricks:
46 ***...xxx..***
47 ***...xxx..***
48 ******xxx*****
49 ***EEExxxEE***
50 E*EE.ExxxE.E*E
51 E*E...EcE..E*E
52 E*E...EcE..E*E
53 E*E...EcE..E*E
54 E*E...EcE..E*E
55 E*E...EcE..E*E
56 E*E...EcE..E*E
57 EvE..!EkE!.EvE
58 ..............
59 .*..........*.
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 +......p.....+
66 .......*......
67 ....-.....-...
68 .w..........w.
69 ..............
70 .......w......
71 ..............
72 ..............
73 ..............
74 .......m......
75 ..............
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Spockl
85 Hoehle
86 Bricks:
87 EeeeiEE@@gg###
88 E*EE*EEeeEg###
89 EeeE**eeeEE###
90 Eee@E@e*.eEeEE
91 Ee.e*e....eeEE
92 Ee.eEe.i...eeE
93 Ee.e*e.Ei*..e@
94 Ee.eEe.EE.*.eE
95 Ee.eEe.EE*..EE
96 Ee.eEi.Ei.*EEE
97 Ee.vi..E.*..EE
98 Ee....EE..*.eE
99 Ee....EE.eeee@
100 Ee.E.v.E.eEecc
101 Ee.E.*.E.eEEcc
102 Ev.E.v.i*eEEcc
103 E..EE....EEEcb
104 E..EE....EEEzz
105 Bonus:
106 .{{{m..55bfb5l
107 .f.....--.{b5l
108 ..f...!df..j5l
109 .!db.bd..d....
110 .c.df+....d!..
111 ...+.d.f...d!.
112 .!.dj!..f...b5
113 .d.w.w....c.w.
114 .d.d.!...{....
115 .d.g.f..f.w...
116 .j.>f.........
117 .g..........!.
118 .d.......{f{dd
119 .>...!...!.f.m
120 .d.......w..dm
121 .>...d.f.>...m
122 ............!.
123 ............d.
124 Level:
125 Lord
126 NO
127 Bricks:
128 ..............
129 ..............
130 ..............
131 ......dd......
132 .....d**d.....
133 ...*d****d*...
134 ddddd****ddddd
135 E.E*Ed**dE*E.E
136 ..vvvvddvvvv..
137 ......xx......
138 .E.E..xx..E.E.
139 ......xx......
140 ......xx......
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ......ww......
151 ..............
152 ...!......!...
153 ...m......m...
154 ..............
155 .....!..!.....
156 ......ff......
157 ......ff......
158 ......ff......
159 ......ff......
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Spockl
167 Karies
168 Bricks:
169 ijjjijjjijjjij
170 ij*jij*jij*jij
171 aaaaaaaaaaaaaa
172 aaaaaaaaaaaaaa
173 bbbbbbbbbbbbbb
174 bbbbbbbbbbbbbb
175 cccccccccccccc
176 cccccccccccccc
177 cccccccccccccc
178 eeeeeeeeeeeeee
179 bbbbbbbbbbbbbb
180 bbbbbbbbbbbbbb
181 aaaaaaaaaaaaaa
182 aaaaaaaaaaaaaa
183 aaaaaaaaaaaaaa
184 jjjjjjjjjjjjjj
185 jjjjjjjjjjjjjj
186 jj..jj..jj..jj
187 Bonus:
188 .blb.bbb.blb.l
189 .>.>.>.>.>.>.>
190 ffffffffffffff
191 f!f!f!f!f!f!f!
192 {!!{!{!{!{!{!{
193 ffffffffffffff
194 {!??!!!!!!??!{
195 !{!!++!!++!!{!
196 44}444}}33}333
197 ssc{c{c{c{c{ss
198 bbffffggffffbb
199 {.ff.{..{.ff.{
200 !!!!!!gg!!!!!!
201 !!!!!!!!!!!!!!
202 ??!!*!!!!?!!??
203 >>>>>>gg>>>>>>
204 w???w????w???w
205 ??..??..??..??
206 Level:
207 Spockl
208 Rock Me
209 Bricks:
210 i@@@j@@@j@@@ji
211 j.@..v@ggg@..@
212 @....v..g...@@
213 @@..#v.....k.@
214 @..###...#...j
215 jvkv#vkv###vv@
216 @....v...#..@@
217 @@.k.vv......@
218 @vvvvvvvvvvkvj
219 j....#..k....@
220 @...###.....@@
221 @@vvv#vvvvvvv@
222 @....v...#...j
223 j.v.vvv.###..@
224 @..k....h#h.@@
225 @@....k......@
226 @.cc.......c.j
227 jv..cba.bcc.v@
228 Bonus:
229 m.......&....m
230 .......5.5....
231 .....d........
232 ..............
233 ....m........!
234 !..fb.wf.l.f..
235 .........b....
236 ...w..g.......
237 .~f.??!??dfg~!
238 !.............
239 ....jl........
240 ..+-+.--W+{--.
241 .....!.......w
242 w.{.fwW..mj...
243 ..........s...
244 ......{.......
245 ..>-.......>..
246 .w..f-g.gff.w.
247 Level:
248 Lord
249 THE SKUL
250 Bricks:
251 bvvvvvvvvvvvbv
252 vb.........bvv
253 v*b.......b*vv
254 v*.bbbbbbb.*vv
255 v*..bbbbb..*vv
256 v*..b*b*b..*vv
257 v*..b*b*b..*vv
258 v*..b*b*b..*vv
259 v*..bbbbb..*vv
260 v*..bbbbb..*vv
261 v*.b.bbb.b.*vv
262 v*b..bbb..b*vv
263 vb...bbb...bvv
264 b...........bv
265 .............b
266 ..............
267 ..............
268 ..............
269 Bonus:
270 wmmmmmmmmmmmw.
271 .w.........w..
272 ..w.......w...
273 ...wwwwwww....
274 ....fffff.....
275 ....fffff.....
276 ....f.f.f.....
277 m...f.f.f...mm
278 ....fffff.....
279 ....fffff.....
280 ...f.fff.f....
281 ..f..fff..f...
282 .f...fff...f..
283 f...........f.
284 .............f
285 ..............
286 ..............
287 ..............
288 Level:
289 Spockl
290 Grixprlm
291 Bricks:
292 iiiiiiiiiiiiii
293 id.##...###.di
294 i#ggg#.#dddd#i
295 .#ffg#v#eeed#i
296 .#jfg#vxe##d#.
297 .#jfg..#e#ed#.
298 i#jfg#v###e.#.
299 .#jfg#.#e#e#gi
300 .#jfg#v#e#ed#i
301 .#jfg#v#e#ed#i
302 i#jfg#.#e#ed#i
303 i#jfg#v#eeed#i
304 i#####v#.ddd#i
305 i.##########.i
306 .i..........i.
307 .v..v....v..v.
308 ..............
309 ..............
310 Bonus:
311 55c55555555c55
312 5c..........c5
313 5.!mf...bbmb.5
314 ..!!!.c.!!!!.*
315 ......c!b..!..
316 ..b.....b.lb..
317 *...f.c.......
318 ............*5
319 ..b...c......5
320 ......*.+.++.5
321 5............5
322 5.m...c......5
323 5.....b....m.5
324 5............5
325 .5..........5.
326 .w..w....w..w.
327 ..............
328 ..............
329 Level:
330 Spockl
331 Superbowl
332 Bricks:
333 ##############
334 ###@ciiic.@###
335 ##.cii*iic..##
336 #.ciiv*viic..#
337 .ciidv*vdiic..
338 ciiddv*vddiic.
339 civvvv*vvvvic.
340 iiiiiv*viiiiic
341 iijjicccijjiic
342 iigjjckcjjgiic
343 cigggcccgggic.
344 ciihhhjhhhiic.
345 .ciiddjddiic..
346 ..ciizjziic...
347 #..ciijiic...#
348 ##...iii....##
349 .##@......@##.
350 .###......###.
351 Bonus:
352 ffffffffffffff
353 f{{&4l4l4.&{{f
354 f{.40jbj04..{f
355 f.400!m!004..f
356 .40{.!b!.{04..
357 40}!s!m!s!}04.
358 4+++++b+++++4.
359 fj}}}!m!}}}jf?
360 &f...}b}...f&?
361 ..f.d.m.d.f..?
362 ->fff...fff>-.
363 {-5>>!w!>>5-{.
364 .{-5>!>!>5-{..
365 ..{-5g!g5-{...
366 w..{5!w!5{...w
367 .....>?>......
368 ..............
369 ..............
370 Level:
371 Lord
372 Kugeln wo denn
373 Bricks:
374 *****gggg*****
375 *****g**g*****
376 *****g**g*****
377 ****gg**gg****
378 ***ggg**ggg***
379 ***ggg**ggg***
380 **g********g*.
381 .*gggg**gggg*.
382 .*.ggg**ggg.*.
383 .*.ggg**ggg.*.
384 .*..gg**gg..*.
385 .*..gg**gg..*.
386 .************.
387 ......**......
388 ......**......
389 ......**......
390 ......**......
391 gggg..**..gggg
392 Bonus:
393 bbbbb....bbbbb
394 bbbbb.bb.bbbbb
395 bbbbb.bb.bbbbb
396 bbbb..bb..bbbb
397 bbb...bb...bbb
398 bbb...bb...bbb
399 bb.bbbbbbbb.b.
400 .b....bb....j.
401 .b....bb....b.
402 .j....bb....b.
403 .b....bb....b.
404 .b....bbbb..b.
405 .bbbbbbbbbbbb.
406 ......bb......
407 ......bb......
408 ......bb......
409 ......bb......
410 ......wj......
411 Level:
412 Spockl
413 Ballterror
414 Bricks:
415 !!!Ei!!!E!!!!!
416 !!!!i!!!!!!!!@
417 !!E!zE!!!!E!!!
418 !!!!!E!!!EEEE#
419 EE!EE#EEE###E#
420 !*EEE!***!**E#
421 !*!!*!!!*!!!E#
422 !!**!!**!!**E#
423 !*!!!!*!*!!Eg#
424 !**!*!***!*Eg#
425 E!!!!!!!!!!Eg#
426 E*!**!EEE!!EE#
427 *!!!*!*!!!*!E#
428 E*!**!*!*!*!E#
429 zjEEjjjjjjjEEz
430 yggggggggggggy
431 yggggggggggggy
432 xggggEEEEggggx
433 Bonus:
434 <<b5!5&wWW!5!!
435 <<b!5!&wW!5!!!
436 ll!555!j!W55!!
437 !!.!!..!..!.!!
438 f&fmfm...mmm..
439 wbbbfm{mmbbb{b
440 !!..fmmmmbffff
441 ..!!bbbbbbbbbb
442 ffffwbbbbbbbb{
443 .555bb---bbbbb
444 .5{5bbfbbbbbbb
445 .555bbfbbbbbbb
446 ....bbfbbbbbbb
447 ....bbfbbbbbbb
448 <............<
449 >+.+.+.+.+.+.>
450 >............>
451 >...g....g...>
452 Level:
453 Lord
454 Die Monsterschneke
455 Bricks:
456 ..............
457 ..............
458 ..fff.........
459 ..fff.........
460 ..f*f.........
461 ..f*f.........
462 ..fff.........
463 ...h..........
464 ...h..........
465 .hhh.hhh......
466 ..hhhhhhhh....
467 ...hhhhhhhh...
468 ...hhhhhhhh...
469 ....hhhhhhhh..
470 ...hhhhhhhhh..
471 ...hhhhhhhhh..
472 ..hhhhhhhhhhhh
473 .hhhhhhhhhhhhh
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 ..............
482 ..............
483 ..............
484 ..............
485 ..............
486 .....bbbbb....
487 .....bpppb....
488 .....bpbpb....
489 .....bpppb....
490 .....bbbbb....
491 ..............
492 .w~~~{{---!!!!
493 Level:
494 Spockl
495 Stirb Pups
496 Bricks:
497 eeeeeee#eeeeee
498 e#g#gje#e####v
499 e#gggje#ee#eee
500 e.##g#e#ee#vev
501 e#g.g#e#ee#eee
502 e.##g#*#ee#*#x
503 e#g#g#e#ee#eex
504 e#g.g#e#ee#eex
505 e#g#g#e#ee#eex
506 e.##g#e#ee#eex
507 e#g#g###ee##ex
508 e#g#g#jjeeeee#
509 e#g#gijj##eeex
510 e####ijj####.x
511 e....#iiiiii#f
512 e...########.f
513 e#eeeeeeeeeeee
514 ##avv########v
515 Bonus:
516 ffffffffbffff5
517 .w.b.........m
518 ..?.?...b.....
519 ...b.....4...m
520 ..w.....b.....
521 ...b.....4....
522 ....p.........
523 .w......WW..W.
524 ..w.w.c.cd....
525 g.d.d......m4.
526 ..............
527 ddddddddmddddd
528 ......d}......
529 g.m...{j......
530 .............w
531 .............w
532 333+++>+>+>+>.
533 .............w
534 Level:
535 Lord
536 Die Kaffetase
537 Bricks:
538 ..............
539 ..............
540 ..............
541 ..............
542 .....cEfEc....
543 ...cccEfEcf...
544 ...c.cEfEcff..
545 ...c.cEfEcff*.
546 ...c.cEfEcff..
547 ...c.cEfEcff..
548 ...c.cE*Ecff..
549 ...cccEEEcff..
550 .....cccccf...
551 ...eeeeeeeeee.
552 ...eeeeeeeeee.
553 ...ee......ee.
554 ...ee......ee.
555 ...ee......ee.
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 .......0......
562 .......0......
563 .......0......
564 .......0....f.
565 .....m.0......
566 .......0......
567 ...m..........
568 ..............
569 ..............
570 .....bbbbbb...
571 .....ffffff...
572 ..............
573 ..............
574 ...}s......s}.
575 Level:
576 Spockl
577 Umpf
578 Bricks:
579 #fffffff*fcfff
580 #xxxffffffcfff
581 #xxx#gvgvgcfff
582 #vvv#vgfggc!ff
583 #fff#gggfgc!ff
584 #fff####f#c#ff
585 #*ff##*#fcc##f
586 #fff#ccfcc##ff
587 #fff#cccf###ff
588 #fff#f##ff##ff
589 #fff#f!!!f##ff
590 #fff#fvvvf##ff
591 #####fffff#dff
592 aaaaafvf####*f
593 #f##!f!#####ff
594 #fff#f##dddfff
595 #ff###d#####ff
596 ##ffffffffaaaf
597 Bonus:
598 .*..*.....j..m
599 .....00.....00
600 .........g....
601 .l.l..b...&...
602 .mmm.bbb.g..!.
603 .mmm....c.....
604 .mmm....c.&...
605 .mmm.*.......!
606 .mmm..&.c...s.
607 .mmm....c0..++
608 .mmm.>...0..++
609 .mlm.bwww0....
610 .....>bbbs.www
611 .....>......j.
612 .{............
613 .....{........
614 .}............
615 ...}..>>......
616 Level:
617 Lord
618 Die Bombe
619 Bricks:
620 x............x
621 xddddddddddddx
622 xd##########dx
623 xd#v******v#dx
624 xd#v##**##v#dx
625 xd#v#****#v#dx
626 xd#v#*vv*#v#dx
627 xd#v#*vv*#v#dx
628 xd#v#*vv*#v#dx
629 xd#v#*vv*#v#dx
630 xd#v#*vv*#v#dx
631 xd#v#*vv*#v#dx
632 xd#v######v#dx
633 xddv######vddx
634 ......!!......
635 ......!!......
636 .....!ee!.....
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 ..............
644 ...c......c...
645 ..............
646 ..............
647 .....?..?.....
648 +m.f......f.m+
649 +............+
650 ......ff......
651 -p.j....c.j.p-
652 -p..........l-
653 ..............
654 ..............
655 .....0000.....
656 ..............
657 Level:
658 Spockl
659 Urrga
660 Bricks:
661 EEE#ee**ee#EE.
662 !!E#eeeeee#EE.
663 .!E#e####e#d!.
664 .!E#eeeeee*d!E
665 .!E#eeeeee!!!E
666 *!E#ee#!#e*d!E
667 E!E#ee.!.e#d!E
668 *!E#ee#!#e.E!E
669 E!E#ee.!.e#E!E
670 *!E#ee#!#e.E!E
671 E!d#ee.!.e#E!E
672 .!d*ee#!#e.E!E
673 .!!!ee.!.e#E!E
674 EEd*eeeeee.E!E
675 EEd.eeeeee#EEa
676 ####eedddeiiii
677 eeeeeeeeeeeeee
678 aaaaaaaaaaaaaa
679 Bonus:
680 ....55..55....
681 ml..5*55*5....
682 .m.c5....*.dm.
683 .b..55>>>*.dl.
684 .b..f{>p>5..b.
685 .b..&w.d.wgdb.
686 .b..-}.p.-.db.
687 .W.c-wdddw..b.
688 .<..W-.c.-..<.
689 .W..Ww...w..m.
690 .wd.*-.c.-..<.
691 .<d.jw...w..m.
692 .w.<.f.c.!..<.
693 ..d.!wf&fw..m.
694 ..d.sf!!s!....
695 ....dwdddw!!!!
696 dddddddwwdwwdd
697 ..............
698 Level:
699 Lord
700 Urrga2
701 Bricks:
702 ..............
703 .....vvvv.....
704 .....vvvv.....
705 .....v**v.....
706 .....vvvv.....
707 .vvvdvvvvdvvv.
708 .vvvdg..gdvvv.
709 .vvddgbbgddvv.
710 .v*d.g..g.d*v.
711 .vdd.gccg.ddv.
712 .ddxxg..gxxdd.
713 dd.x*g..g*x.dd
714 d..xxg..gxx..d
715 ...x*g..g*x...
716 ...x*gccg*x...
717 ...xxg..gxx...
718 ...x*g..g*x...
719 ...xxg..gxx...
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ....c....cddd.
727 ....c!..!cddd.
728 ...dc!dd!cddd.
729 ..dd.!..!.d.d.
730 ..dd.!++!.ddd.
731 .dddd!..!dddd.
732 dd.dd!..!dd.dd
733 d..dd!..!dd..d
734 ...dd!..!dd...
735 ...ddpffpd&...
736 ...ccw..wcc...
737 ...cdw..wdc...
738 ...ccw..wcc...
739 Level:
740 Spockl
741 Hilfaaa
742 Bricks:
743 j#######EEhhhE
744 Eh#####hEhEhEE
745 jhE#jjjeeeee#E
746 EhEE#########E
747 EjjEE#######..
748 jhjjEE######E.
749 EhEjjEE####EE.
750 EhEEjjEE##EEE.
751 Eh.EEEEE..EEE.
752 Eh............
753 Eh.EEEEE##EE..
754 EhEEEEE####EE.
755 hhhEEE#####EEj
756 hEEEE######EEj
757 hEEE########Ej
758 ccE#########Ej
759 ccffffffffffEE
760 cfffffffffffEE
761 Bonus:
762 4mmmmmmm..lll.
763 ..bbbbb.......
764 4..bbbbbbbbbb.
765 ....bbb!bbbbb.
766 .44..55???55..
767 4.44...!.!....
768 ...44.........
769 ....44........
770 ..............
771 ..............
772 ........l.....
773 ........l.....
774 ......{.!.{..4
775 ........mm...4
776 .......!.....m
777 .............b
778 ..mmmgmmpppp..
779 .wwwwwwwwwww..
780 Level:
781 Spockl
782 Hilfaaa 2
783 Bricks:
784 cEEEEEEEEEEE#g
785 ccggggggggg#g#
786 cccggggggg#g#g
787 cccciigggig#g#
788 ccccciiii##g#g
789 ccccccii##g#g#
790 cccccEiii##g#g
791 ccccEEiiii##g#
792 cccEEE.....##g
793 ccEEEE...@..##
794 cEEEEE..@....#
795 EEEEEE........
796 gggggEEEE.....
797 ggggg.........
798 aaaaaaaaaaaa..
799 bbbbbbbbbbbb..
800 cccccccccccc..
801 @@@vvvvvvvvvvv
802 Bonus:
803 b...........4l
804 mb00!00!00!4sc
805 bm.000<0<0{.>l
806 4..1110001.c~4
807 4..>!1{1{4ff>l
808 !.>1f!1<44.c~4
809 4>1f!.1114f.>l
810 41fb..222244s4
811 1fb........4>l
812 fb.**.......gc
813 b............j
814 ..............
815 !.!.!.........
816 55j.p.........
817 ffffff!w!www..
818 +c+c+c+c---w..
819 4444ffc+cffw..
820 wwwwwwwwwwwwww
821 Level:
822 SpocklLord
823 Burgsau
824 Bricks:
825 @@@@@#!!!#@@@@
826 @iijj#!#!#jij@
827 @iijj#####jji@
828 @jj*.#####ijj@
829 @jj..#bbb#*..@
830 @EEEE.@*@.EE.@
831 @.....@x@...v@
832 @....e@x@e..v@
833 @....e@x@e..v@
834 @.....xxx...v@
835 @.....@x@...v@
836 @.....@z@....@
837 @c....xyx...c@
838 .c....@x@...c.
839 .ggggg@z@gggg.
840 .eeee@@y@eeee.
841 .aaaa@@x@@aaa.
842 .aaaa@@v@@aaa.
843 Bonus:
844 ..............
845 .5555.f....f..
846 ..........s...
847 ............m.
848 ......mmm.....
849 .......f......
850 .......b......
851 .....b.b.b....
852 .....b.-.b....
853 ......+-+.....
854 .......-......
855 ..............
856 .}....+.+...W.
857 .......g......
858 ..c.c0...0.j..
859 .f.>.....ffw..
860 .w<....w..w.w.
861 .s.ww.....<...
862 Level:
863 Spockl
864 Vulkan uahhh
865 Bricks:
866 ###..E....####
867 .#...j*j...###
868 .....#*#....##
869 #...EEiE....##
870 #...E##E..a..f
871 ##..EddEE.a..f
872 ...EEdd##....f
873 ...EddEEe...#.
874 ...EddEEEe....
875 ..EEdgddEe...x
876 ..hddggdEEe..x
877 ..EdddgddEee..
878 jEEggggggEee..
879 jEEE**ddddEe..
880 jEgg***dddEee.
881 jEgEEE#EEEEeee
882 eEEggEEggEEeee
883 eeeeeeeeeeeeee
884 Bonus:
885 b&f.......ffm>
886 .....m.m....&b
887 ......m......m
888 m.....m......b
889 ..........b..c
890 .....bb...b..>
891 .....bb0m....c
892 ....5j..0.....
893 ....>c...0....
894 ....55>5.0...f
895 ..w!m55m..}..{
896 ...l?m.ml.f<..
897 <..24b4b4.w-..
898 >...p.}!b?.f..
899 <.bbww2b4g.j..
900 >.*mm.+....s}b
901 <..ww..ww..f..
902 >*f..f}f.++..s
903 Level:
904 Spockl
905 Grummel
906 Bricks:
907 @@@@@@@@#d#@@@
908 @eeeeeee#d#ee@
909 @eicaaaa#d#ae@
910 @ecccca#####e@
911 @eaccca#####e@
912 @ecccaad###ae@
913 @@@aaaadd#dae@
914 @eaaaaadd#dae@
915 @e@.@*@@ddd@@@
916 @eabbbbbdddae@
917 @*abgggbdddae@
918 @eabbcbb.aaae@
919 @eaeeeeejaaae@
920 @ea@@jeej@@ae@
921 @eajjjjjjkkae@
922 @eaggjggkkaaee
923 @eaaaaaavkeeee
924 @eavvvvv.v@@@e
925 Bonus:
926 mffffffbclcbff
927 f0f1f1f1clcfff
928 b0mfwfffwlwf2b
929 f0}{fff.sjs.2f
930 f0wfw{fc&.&c2{
931 f0f*ffff.}.{}f
932 m0>ffffffpf>2b
933 {0wwff*ffcfW2{
934 fff.f.ffffff}f
935 b0{gfjwg{ff>3f
936 b0ffwgwf{{fW3f
937 +wfgfwfg.wWW{b
938 +0{ff<ffc}Ww3f
939 +w><<f<<c..}{f
940 fffjjjjjj..fff
941 +0{gWfjg..}W3f
942 +wWW{W}?c.33w}
943 j0}{{{{{.{ffff
944 Level:
945 Spockl
946 Grummel 2
947 Bricks:
948 jjjjEEEEEEEEEE
949 jEEEEiibiixiEE
950 jEiiEiiaiiiiiE
951 jEiiiiEb.iiiiE
952 jEiiiiE*EiiiiE
953 jEiiiEabaEiiiE
954 jEiiiEbabEiiij
955 jiiiEaabaaEiij
956 jiiEEbbabbEiiE
957 EiiEiba*abiEiE
958 EiiEEbbabbEEiE
959 EiiEvaabaavEEE
960 EiiEEbbabbEjEg
961 EiiEibababijEg
962 fEEEEbbabbEEEg
963 fEgEiaabaaiEEg
964 fEgiibaaabiiEg
965 fEiiiababaiiig
966 Bonus:
967 5..m..........
968 5....*gfgc*b..
969 m..w.cb+b..bb.
970 m...j..f.jwbb.
971 5.?.w..+..bbb.
972 m.....5fw.b?..
973 w...w.f+f.~!!.
974 w..~.w+f+5...m
975 w....ff+.f..l.
976 .b...!+.+!..l.
977 .bb..fw+ff..l.
978 .bb.W5+f+wW...
979 .bb..ff+ff...p
980 .bb..!+c+b.b.c
981 p....fw+ff...}
982 s.b.>0+5+0>..b
983 +.}}-fs+>w-{.}
984 +.w.-+-+-+-.w}
985 Level:
986 LordSpockl
987 Blumenzauber
988 Bricks:
989 ##############
990 EEiiiiiiiiiii#
991 #iii!iiiEEEiiE
992 #ii!!!iii#iii#
993 #i!!*!!jiiijj#
994 #ji!!!jjii..j#
995 #jjj!.jjj..!jj
996 #jjjh.jj..!!!j
997 Ejjbh..j.!!*!!
998 ..j.hb....!!!.
999 ....h..EE..!..
1000 ..EEE...#..h..
1001 #..#......bh#.
1002 E..........hhb
1003 E...........h.
1004 E.E.....EE..E.
1005 hhhhhhhhhhhhhh
1006 hhhhhhhhhhhhhh
1007 Bonus:
1008 5mlbblbbblbbml
1009 ..???????????5
1010 m???4???...??.
1011 5??4f4???m???5
1012 5?4.m.4??????5
1013 5?.4&4????..?5
1014 5???4.???..2??
1015 5???b.??..2m2?
1016 .??b+..j.2wmw2
1017 ..j.wj....2w2.
1018 ....b......2..
1019 ........b..f..
1020 b..b......+>b.
1021 ...........wbb
1022 ............b.
1023 ..............
1024 ?w??????????w?
1025 cccccccccccccc
1026 Level:
1027 Spockl
1028 Die Tonne
1029 Bricks:
1030 EEEEEEEjjEEEcE
1031 Ejjjjjjjjjjjjc
1032 Ejjjjjjjjjjjjj
1033 E*##E@@E##*@jj
1034 EE##EEEE##EEjj
1035 EE##EEEE##E.jj
1036 EE##EiiE##EEjj
1037 EE##EiEE##EEjj
1038 EE##EggE##@.jj
1039 EE##EggE##EEjj
1040 EE##EggE##EEjj
1041 EE##EggE##EE..
1042 EE########EE..
1043 EE########EE..
1044 .cEEEEEEEEE...
1045 .EEEEEEEEEE...
1046 ..............
1047 ggg...ggg..g..
1048 Bonus:
1049 .......>l...c.
1050 .c...~.....f..
1051 .l.c.....>....
1052 .mbj....jbm.w.
1053 ..b5....db....
1054 ..b5....5b....
1055 ..bd.ww.5b...w
1056 ..b5.w..5b....
1057 ..b5.+-.5b..f.
1058 ..b5.><.5b....
1059 ..b5.}{.5b..>~
1060 ..b5.&*.5b....
1061 ..b555l55b....
1062 ..bg++++gb....
1063 .w............
1064 ..............
1065 ..............
1066 w......w......
1067 Level:
1068 Spockl
1069 Pinball
1070 Bricks:
1071 @@!!!ege###g@@
1072 @....gEg#g#.g@
1073 !.z..ege###..g
1074 .zcz.........g
1075 czizz.b.b..g.g
1076 jczzE#....xxxE
1077 jczE#..@@.g!g.
1078 ec.#...@@.xxx.
1079 jc...@.....g..
1080 ec....b.......
1081 jc......b....!
1082 ecf.b....@.c..
1083 jc@f......cf.!
1084 jc@@f....cf@..
1085 *cE@@...cf@E..
1086 dd.EEE..cEEc..
1087 dd............
1088 zE.EEE...E..E.
1089 Bonus:
1090 ..wff4.4blbb.m
1091 ........blb.>.
1092 c....4>4+j+..f
1093 ..5..........>
1094 b5m5..0.0..f..
1095 0.5..0........
1096 f{..0..--.{bf.
1097 4..0...--..g..
1098 0}.........f..
1099 4.....s.......
1100 f{......{....W
1101 4.2........{..
1102 0}12......f2.j
1103 0.012....f21..
1104 c..01...g21...
1105 {>............
1106 fW............
1107 &.............
1108 Level:
1109 Lord
1110 was ist das
1111 Bricks:
1112 ..............
1113 .......e......
1114 ......vvv.....
1115 .....vvvvv....
1116 .....vvvvv....
1117 .....vvvvv....
1118 ....ev*v*ve...
1119 .....vvvvv....
1120 .....vvvvv....
1121 .....vvvvv....
1122 ......vvv.....
1123 ......vvv.....
1124 ......vvv.....
1125 .......e......
1126 ..............
1127 ..............
1128 ...E..........
1129 ..............
1130 Bonus:
1131 ..............
1132 .......j......
1133 ..............
1134 .....b........
1135 ..............
1136 ..............
1137 ....{....sm...
1138 .......3......
1139 ..............
1140 .....~........
1141 .......m......
1142 ..............
1143 ..............
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 ..............
1149 Level:
1150 Lord
1151 Der Tempel
1152 Bricks:
1153 ..............
1154 ..............
1155 ......**......
1156 .....yyyy.....
1157 ....zzzzzz....
1158 ...zzzzzzzz...
1159 *.zzzzzzzzzz.*
1160 a.*.*.**.*.*.a
1161 a.*.*.**.*.*.a
1162 a.*.*.**.*.*.a
1163 a.*.*.**.*.*.a
1164 a.*.*.**.*.*.a
1165 a.zzzzzzzzzz.a
1166 a.z*a*aa*a*z.a
1167 vvz*a*aa*a*zvv
1168 vv**********vv
1169 ..............
1170 ..............
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ......55......
1176 ......55......
1177 ...55555555...
1178 ......55......
1179 b............b
1180 b........s...b
1181 b............b
1182 b............b
1183 b............b
1184 b.....mm.....b
1185 b..b+bbbb+b..b
1186 ..mbbbbbbbbm..
1187 **bbwbjjbbwb**
1188 ..............
1189 ..............
1190 Level:
1191 Spockl
1192 Oh Mann !!
1193 Bricks:
1194 vvvvvvvvvvvvvv
1195 vvvvvvvvvvvvvv
1196 @@@j@@@@@@@@j@
1197 vvjjjjvjjjjjvv
1198 vvjvvjvvjvvjjv
1199 jvjvjjjjjvvjjv
1200 j@@vj@@@@vvvj@
1201 jvjvvjvvvjjjjv
1202 jjjvvjvjvjvvjj
1203 vvvvjjjjvjjvvv
1204 jjjvjvjvvvvvvv
1205 vjvvvvjvvvjjjv
1206 vjvj@@jj@@jvjv
1207 j@@jvjjvjjvvjj
1208 jvjjv@@vjvvvvj
1209 jvjjjjvjjvvvvj
1210 vvvjvvvjvvvjjj
1211 vvvjvvvjvvvvvv
1212 Bonus:
1213 ld??!?dld??dl?
1214 ????!??dd?!dd?
1215 d??d!d????!???
1216 ????!?????!?d?
1217 !!!!!!!!!!!!!!
1218 ???!??????!???
1219 ???!??????!!??
1220 .?.!?.????.!.?
1221 !!!!!!!!!!!!!!
1222 ????!!!.?!.?..
1223 ??????????????
1224 ..?.??.??!.?.?
1225 ???!??????.?.?
1226 !!!??!!!!!!!!!
1227 ??????????????
1228 ??????????????
1229 ??..???.???.??
1230 ..?.???..??...
1231 Level:
1232 Spockl
1233 Spinner
1234 Bricks:
1235 E************E
1236 *****#********
1237 *****#*#******
1238 ***#i#i#i##***
1239 ***#i#i#i##***
1240 *###iiiiii###*
1241 ***#iiiiii#***
1242 ***#iiiiii#***
1243 *###iiiiii###*
1244 ***#iiiiii#***
1245 **E########E**
1246 ****#****#****
1247 ****#****#****
1248 ****#****#****
1249 aaaaaaaaaaaaaa
1250 bbbbbbbbbbbbbb
1251 .cccccccccccc.
1252 ..vvvvvvvvvv..
1253 Bonus:
1254 !!!!!!!!!!!!!!
1255 ??????????????
1256 ??!!!!!!!!!!??
1257 ??!.!.!.!..!??
1258 !!!.!.!.!..!!!
1259 ???.!!ll!!.???
1260 ???.!!ll!!.???
1261 ???.!!ll!!.???
1262 !!!.!!ll!!.!!!
1263 ???.!!!!!!.???
1264 ???........???
1265 ???????j??????
1266 ??????????????
1267 ??????????????
1268 g????????????g
1269 ..............
1270 ..............
1271 ..............
1272 Level:
1273 Spockl
1274 Irrsinn
1275 Bricks:
1276 iiiiiiiiiiiiii
1277 ii@#@iiic###ci
1278 c@iiicEciii#ic
1279 iiiii#i#iii#ii
1280 !!@!!#!#!!!#!!
1281 jj#j*#j#j#j#jc
1282 jj#jj#j#j#*#j#
1283 jj#jj#j#j#j#j#
1284 @##jjcj#j#j#*#
1285 gg#gggg#g#ggg#
1286 gg#gggg#g#ggg#
1287 gg###cg#gg###c
1288 ggggggg#gggggg
1289 gggggggcgggggg
1290 #####cbbc##bbb
1291 eeeeeeeeeee@ee
1292 @eeeeeeeeee#eh
1293 EjjEEhhEEhhhhE
1294 Bonus:
1295 l55l5555555l5l
1296 55!.!555!...!5
1297 *!!!!!0!!!*!!*
1298 w.fww.b.w....w
1299 ......b.!f!.!{
1300 !f....b.f.f.f.
1301 w..f..!.w...f.
1302 ....w.f.....w.
1303 ...*!.*.w.*...
1304 22.22ff.2.2!2.
1305 ff.w+22.2.2+w.
1306 22....{.!!....
1307 222f{22.!*!{22
1308 2222222.!!!2*2
1309 ......*+...g+.
1310 !w*!+!w.!w+.w!
1311 ....*.p......!
1312 ..............
1313 Level:
1314 Spockl
1315 Emporio
1316 Bricks:
1317 EEE*dcEggEjjjj
1318 dddddcEggEjjjE
1319 dddddcEEgEj*jj
1320 EEEEdcEggEjjjj
1321 ccccccEggEjjjj
1322 iiiiiiiiiEiiEE
1323 iiiiiiiiiiiiii
1324 EEEEEiiiiiiiii
1325 iiiiii@@iiiiii
1326 eeeeeeee@eeEEE
1327 ........@eeeee
1328 eeeeeee.ee...e
1329 EEEEEEe...eeee
1330 kkkkkkkkkkEEEE
1331 kkkkkkkkkkkkkk
1332 kkkkkkkkkkkkkk
1333 EEEEEEEkkkkkkk
1334 kkkkkkkkkEEEEE
1335 Bonus:
1336 .......55.?bll
1337 ll?b...55.???.
1338 ???b....5....b
1339 .......55.....
1340 .......55.....
1341 ..............
1342 !!!!!!!!!!!!!!
1343 ..............
1344 c.c.c~..&&&~..
1345 ffffffgf.+c...
1346 .........+ffff
1347 w>gw>>>.ff....
1348 ......>...>w.w
1349 >>>>>w>g{>....
1350 !!~.!!!{g!w>!!
1351 *>>*>.........
1352 .......***>>>*
1353 .......+g.....
1354 Level:
1355 Spockl
1356 Durchgeknallt
1357 Bricks:
1358 @EjjgE!!ghhhh@
1359 vEjjgE!!gEEEhv
1360 jvjjgEE!gvvEhg
1361 j*jjgvv!g*hEhg
1362 EEEjg!!!gEhvhg
1363 vvvjg!!!gEhhhg
1364 jjjjg!E!gE@hhg
1365 ggggg!E!gEvhhg
1366 jjEgg@E!gEhhEE
1367 jjEg!!E!gvhhvv
1368 ccEg!*E!ghhhgg
1369 jjEg!!v!gh@hhg
1370 jjvg!!!!gEEEhg
1371 gggggggggvvvhg
1372 hhhhEEEhhhhhhg
1373 jjjjvvvjjjjjjj
1374 @jjjjjjjjjjjjj
1375 EEExxxxxxxxxx@
1376 Bonus:
1377 ..44b.!!b????.
1378 l.44b.!!b...?l
1379 4*44b..!b{{.?0
1380 4.44b**!b.?.?0
1381 ...4.!!!..?{?0
1382 ***4&!!!&.???0
1383 4444s!.!s..??0
1384 +p...!.!j.{??0
1385 44.....!..??..
1386 44..!!.!.{??{{
1387 44.+!..!+???.g
1388 44.>!!}!>?.??>
1389 44*w!!!!w...?w
1390 !!.......!!!?0
1391 .......??????0
1392 d...wWbg.}.{.d
1393 .....p.......0
1394 ...W555555555.
1395 Level:
1396 Spockl
1397 Bonusfinale
1398 Bricks:
1399 !!!!!!!!!!!!!!
1400 !eeee###eeeee!
1401 !fffffffffffe!
1402 !!!!!!ggg*****
1403 ###hh!hhhh!!!*
1404 !j!jj*****!!!*
1405 !k!kk*****!!!*
1406 !d!dd*****!!!!
1407 ###dd*****!!!!
1408 !d!dd*****###!
1409 !d!dd*****gfe!
1410 !k!kk*****!!e!
1411 !j!jj*****!!e!
1412 !h!hh*****!!e!
1413 !g!ggggggg!!e!
1414 @f!fffffffffe!
1415 @!!!!!!!!!!!!!
1416 @###cccccc@@@@
1417 Bonus:
1418 bbb5ll5g5g5gbb
1419 >>>>>>>>>>>>>>
1420 !+f+!+f+!+f!+!
1421 55433333333455
1422 55432222223455
1423 554>5555555>55
1424 554>+jjjjj+>55
1425 554>+g555g+>55
1426 554>+55555+>55
1427 554>+5lll5+>55
1428 554>+w&&&w+>55
1429 lll>lwbbbwl>ll
1430 l5>>2wjbjw3>5l
1431 l54>2wwjww3>5l
1432 l54>>>ggg>>>5l
1433 l544444444445l
1434 l555555555555l
1435 l555......555l
1436 Level:
1437 Spockl
1438 Absolute War
1439 Bricks:
1440 E*!!E*!!E*!!E!
1441 E*E!E*E!E*!!E!
1442 E*E!E*E!E*E!E!
1443 E*E!E*E!E*E!E!
1444 EEE!EEE!EEE!E!
1445 eeeeeeeeeeeeee
1446 !!EE!!EEE!EEEE
1447 !!*E!!!*E!!!*E
1448 !!*E!!!*E!!!*E
1449 !!*E!!!*E!!!*E
1450 EEEE!EEEE!!EEE
1451 gggggggggggggg
1452 iiiEiiEEEi#iEE
1453 EEEEdEE*ddEddd
1454 #*!!!E**!!E!!!
1455 @*!!!@#EE!E!!!
1456 g*!EbbbbEbEbbb
1457 EfEEbbbbEbEEEz
1458 Bonus:
1459 .b...b...b...l
1460 .b...b...b...l
1461 .b...b...b....
1462 .l...l...l....
1463 ...w...w...w.w
1464 ..............
1465 ..............
1466 ..5....5....5.
1467 ..5....5....5.
1468 ..5....5....5.
1469 ..............
1470 >.>.>.>.>.>.>.
1471 ..............
1472 ..............
1473 .w.....w......
1474 ....g....g...g
1475 ..............
1476 .5............
1477 Level:
1478 Lord
1479 Inuyasha hoho
1480 Bricks:
1481 ######EE######
1482 @***iiiiii***@
1483 @ddiiiiiiiidd@
1484 @ddiiiEEiiidd@
1485 E#diEEEEEEiddE
1486 @ddiEEEEEEidd@
1487 @ddijgEEgjid#@
1488 @ddijaEEajidd@
1489 @ddijjEEjjidd@
1490 zddfffEEfffddz
1491 zddffEEEEffddz
1492 zddEffEEffEddz
1493 #dddeeEEeedddz
1494 zdddeeeeeedddz
1495 zdd*ffEEff*ddz
1496 zdddffEEffdddz
1497 EEEEeeeeeeEzEE
1498 @.....EE.....@
1499 Bonus:
1500 ..............
1501 .m!wffffffw!m.
1502 .4.ffffffff.4.
1503 l4.fff..fff.4l
1504 .4.{555555{.4.
1505 .4.{......{.4.
1506 .4..!b..b!..4.
1507 .4..!l..l!..4.
1508 .4!&}&..&}&!4j
1509 54...w..w...45
1510 54..........45
1511 54*..w..w..*45
1512 54..........45
1513 54....jg....45
1514 54w.g....g.w45
1515 54!........!45
1516 ....{.gj.}....
1517 ..............
1518 Level:
1519 Spockl
1520 No Chance!
1521 Bricks:
1522 @@@@@@@!.!.!zz
1523 @ddd#g#.....ci
1524 @ddd#g#...@.zi
1525 @ddd#g#..@@.cz
1526 @##d###.@@.jzz
1527 if#d#jj.@!.jcz
1528 @f#d#jj@@..jjj
1529 #f###jj@!....e
1530 #f#jjj@@...EEE
1531 ###jjj@!...ee@
1532 f##jj@@....ee@
1533 f##jj@!....ee@
1534 f#jj@!.....ee@
1535 f#j@@......@@@
1536 ##@@!..!@...@@
1537 #@@!...@@!....
1538 @@!....@@@....
1539 @!.....@@@....
1540 Bonus:
1541 .......*.&.+.4
1542 .3l3.l.......m
1543 .3d3.d.......m
1544 .3-3.-.......4
1545 ..53.......1.4
1546 m453..1..s....
1547 .45g.1!....>>>
1548 .45...1......g
1549 .j.1.1.......+
1550 ....1..s...ff.
1551 5..1..........
1552 5..+1......ww.
1553 5.11.......~~.
1554 5.+...........
1555 ..............
1556 ..............
1557 ..............
1558 ..............
1559 Level:
1560 Spockl
1561 Putputput
1562 Bricks:
1563 ceezeeeeezeeee
1564 ceecEEeeeceeee
1565 ceezEE***Eeeee
1566 ceeEEE*E*Eeeee
1567 ceeEEE*h*EEEcc
1568 ceeEEE*E*EEccc
1569 ccEEEE*h*Ecccc
1570 cccccE*E*E!!!i
1571 i!!!iE*!*Eiiii
1572 iiiiiE*!*Eiiii
1573 !!!!!Ee!eE!!!!
1574 !!!!!Ee!eE!!!!
1575 !!!!!EE*EE!!!!
1576 !!!!!!EEE!!!!!
1577 iiiiiiiEiiiiiE
1578 !ggggggEggggg!
1579 ...E...!!.....
1580 E........E...#
1581 Bonus:
1582 --w.!----!.w--
1583 ......---.!---
1584 .>>!...g..--b-
1585 .b!...-.-.-!-g
1586 .>>...g!g.....
1587 d>>...-.-.....
1588 .......!..----
1589 -----.!...bg>b
1590 b>b>......>>>b
1591 fffff.....ffff
1592 g!>g!.....b!!b
1593 bb--b.l.l.>++>
1594 b{bwb.....bwb{
1595 >>>>>>...>b>>>
1596 -------.-----.
1597 w------.-----w
1598 .......wg.....
1599 ..............
1600 Level:
1601 Spockl
1602 F I N A L E
1603 Bricks:
1604 gggggggggggggg
1605 gggggggggggggg
1606 gggEEgaagEEggg
1607 gggggEaaEggggg
1608 ggEEEEaaEEEEgg
1609 gEggggbbggggEg
1610 ggggggbbgggggg
1611 gEggggccggggEg
1612 ggg!hEccEh!ggg
1613 gEgEdEccEdEgEg
1614 ggg!EvccvE!ggg
1615 gEgEEg..gEEgEg
1616 gEEggg..gggEEg
1617 gh!Eg....gE!hg
1618 ghEg......gEhg
1619 g!Eg......gE!g
1620 EEg........gEE
1621 zEi......E.iEz
1622 Bonus:
1623 l5..g.}}.g..5l
1624 .5.w.&&&&.w.5.
1625 &5....gg....5&
1626 &5*}}.&&.}}*5&
1627 .b....*&....b.
1628 w.&lww&&wwl&.w
1629 .b&&lw&&wl&&b.
1630 *.&&&lw&l&&&.*
1631 .*+.+.}p.+.+*.
1632 ....?.p}.?....
1633 }b.&.5gg5.&.b}
1634 .....5..5.....
1635 ...40+..s03...
1636 .5..0....0..5.
1637 w5.0......0.5w
1638 w..0......0..w
1639 ..0........0..
1640 w.+........+.+
0 EXTRA_DIST = LBreakout1 LBreakout2 N_Arenas N_Snapshots \
1 Afl Chaos Holidays Megadoomer Runes Wolvie \
2 Arcade Demons Hommage Pabelo Shimitar Zufallswelt \
3 BeOS-4ever HereWeGo Kevin Ph33r TheGauntlet Bombs \
4 HighBall LinuxFun R-World Twilight Lattsville OpenSource \
5 Kazan-1 Abc Fly Flower Freek GreenWall Gatinha Composers Color \
6 Yexter GreenWall2 Lapis SnyMaxx Pawset X IoriYagami Tricky \
7 Silly NES CalendarFun Impossibility GreenWall3 GreenWall4 Iris \
8 Alex Maze Family SkillShot Hans WTF Symmetry-MKII FatalDoomsday \
9 Zigies TimeWaster Lord IrrenhausAh Arkanoid Heroes Biolab428
10
11 install-data-local:
12 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
13 @for file in $(EXTRA_DIST); do \
14 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/levels/$$file; \
15 done
16
17 win32-install-script:
18 @for file in $(EXTRA_DIST); do \
19 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\levels\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
20 done
21
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = LBreakout1 LBreakout2 N_Arenas N_Snapshots Afl Chaos Holidays Megadoomer Runes Wolvie Arcade Demons Hommage Pabelo Shimitar Zufallswelt BeOS-4ever HereWeGo Kevin Ph33r TheGauntlet Bombs HighBall LinuxFun R-World Twilight Lattsville OpenSource Kazan-1 Abc Fly Flower Freek GreenWall Gatinha Composers Color Yexter GreenWall2 Lapis SnyMaxx Pawset X IoriYagami Tricky Silly NES CalendarFun Impossibility GreenWall3 GreenWall4 Iris Alex Maze Family SkillShot Hans WTF Symmetry-MKII FatalDoomsday Zigies TimeWaster Lord IrrenhausAh Arkanoid Heroes Biolab428
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/levels/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/levels
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
194 @for file in $(EXTRA_DIST); do \
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/levels/$$file; \
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\levels\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
0 Version: 1.00
1 Level:
2 michael
3 hmmmmm?????
4 Bricks:
5 !EvEvEvEvEvE*E
6 **v!vv!v!v!v**
7 E*EvEvEvEvEvE*
8 **!!!!!!!!!!!*
9 *!xxxxxxxxxx**
10 *EyEyEyEyEyE*E
11 **zzzzzzzzzz**
12 !*aaaaaaaaaa!*
13 E*EbEbEbEbEbE*
14 **cccccccccc!*
15 *!dddddddddd**
16 *EeEeEeEeEeE*E
17 **kkkkkkkkkk**
18 !*jjjjjjjjjj!*
19 E*EiEiEiEiEiE*
20 **hhhhhhhhhh**
21 *EgEgEgEgEgE*E
22 *fffffffffff**
23 Bonus:
24 s.5.5.5.5.5.?.
25 ??4b44b4b4b4??
26 .?.2.2.2.2.2.?
27 ??bbbbbbbbbbs?
28 ?sbbbbbbbbbb??
29 ?.0.0.0.0.0.?.
30 ??bbbbbbbbbb??
31 p?wwwwwwwwwwp?
32 .?.w.w.w.w.w.?
33 ??bwbwbwbwbw+?
34 ?+jjjjjjjjjj??
35 ?.j.j.j.j.j.?.
36 ??~~~~~~~~~~??
37 *?dddddddddd*?
38 .?.c.c.c.c.c.?
39 ??{{{{{{{{{{??
40 ?.}.}.}.}.}.?.
41 ?wWfWfWfWfWw??
42 Level:
43 michael
44 crazy!!!!!
45 Bricks:
46 @@@@@@@@@@@@@@
47 @************@
48 @*xxxj*jgxxx*@
49 @*xkxi*igxkx*@
50 @*xxxj*jgxxx*@
51 @*xhg@@@ghgy*@
52 @@ygh@v@hgyz@@
53 @@zyg!v!gyzz@@
54 @@zzy@@@yzzz@@
55 @@!*!x***!*!@@
56 @@*!***x!*!*@@
57 @@!*!x***!*!@@
58 @**!***x!*!**@
59 @*!*!x***!*!*@
60 @**!***x!*!**@
61 @*!*!x***!*!*@
62 @**!***x!*!**@
63 @*@@@@*@@@@@*@
64 Bonus:
65 ..............
66 .????????????.
67 .?wwww?wbwww?.
68 .?wbwb?bbwbw?.
69 .?wwww?wbwww?.
70 .?wbb...bbbw?.
71 ..wbb.*.bbww..
72 ..wwb.*.bwww..
73 ..www...wwww..
74 ..?c?~ccc?c?..
75 ..c?ccc~?c?c..
76 ..?c?~ccc?c?..
77 .cc?cc?~?c?cc.
78 .c?c?~?cc?c?c.
79 .cc?cc?~?c?cc.
80 .c?c?~?cc?c?c.
81 .cc?ccc~?c?cc.
82 .c....c.....c.
83 Level:
84 michael
85 sizes!!!
86 Bricks:
87 **************
88 *!###c!###c!#*
89 *#cccccE****#*
90 *#cEEEEE*EEE#*
91 *#cE*****E!!c*
92 *#cEEEEEEE!!!*
93 *#cE!!!!!!!E#*
94 *#cEEE!!!!!!#*
95 *#EE!!!!!!!!#*
96 *!vE!EEEEEEE#*
97 *cvEEEzzzzzz!*
98 *#vEEzzzzzzzc*
99 *#vEEzEEEEEE#*
100 *#vEEEE!vycx#*
101 *#vvvvEijkbz#*
102 *#vvvvEdefgh#*
103 *#####E!#####*
104 **************
105 Bonus:
106 bbbbbbbbbbbbbb
107 bb...w?...bb.b
108 b.?????.bbbb.b
109 b.?.....b....b
110 b.?.wwwww.--bb
111 b.?.......---b
112 b.?.-------..b
113 b.?...-wwwww.b
114 b....-------.b
115 w--.m........b
116 ww-...+++++++b
117 w.-..+++++++ww
118 w.-..+.......w
119 w.-....+++++.w
120 w.----.+++++.w
121 w.----.+++++.w
122 w......+.....w
123 wwwwwwwwwwwwww
124 Level:
125 michael
126 water
127 Bricks:
128 **************
129 *EEEEEEEEEEEE*
130 *EvEEEEEEEEvE*
131 *E.EaaEEaaEgE*
132 *EgE!!EE!!EgE*
133 *EgE!!EE!!EgE*
134 *EgE!!EE!!EgE*
135 *EgEggggggEgE*
136 *ggEEgggEEEgg*
137 *gggEcEcEcEgg*
138 *EEgbkbgbkbgE*
139 *EEgxgxgxgxgE*
140 *EgEEyEgEyEEE*
141 *EgEgEgggEgEE*
142 *EggggggggggE*
143 *EvggggggggvE*
144 *EEEEEggEEEEE*
145 **************
146 Bonus:
147 bbbbbbbbbbbbbb
148 b............b
149 b.w........w.b
150 b...pp..pp.m.b
151 b.m.pp..pp.m.b
152 b.m.pp..pp.m.b
153 b.m.pp..pp.m.b
154 b.m.mmmmmm.m.b
155 bmm..mmm...mmb
156 bmmm.?.?.?.mmb
157 b..m???m???m.b
158 b..m???m???m.b
159 b.m..?.m.?...b
160 b.m.m.mmm.m..b
161 b.mmmmmmmmmm.b
162 b.wmmmmmmmmw.b
163 b.....mm.....b
164 wwwwwwwwwwwwww
165 Level:
166 michael
167 BOOM
168 Bricks:
169 *!!!!*********
170 *############!
171 *#*!!!!*****#!
172 *#*########!#!
173 *#*#*!!!!*#!#!
174 *#*#*####*#!#*
175 *#*#*#vv#*#!#*
176 *#*#*#gf#*#*#*
177 *#*#*#ih#*#*#*
178 *#*#!#jk#*#*#*
179 *#*#!#ed#*#*#*
180 *#*#!#!##*#*#*
181 *#!#!#!!!*#*#*
182 *#!#!######*#*
183 *#!#***!!!!*#*
184 *#!##########*
185 *#*******!!!!*
186 *#############
187 Bonus:
188 bbbbbwwwwwwwwb
189 b............b
190 b.wbbbbbbbbb.b
191 b.w........w.b
192 b.w.{{****.w.b
193 b.w.{....*.w.b
194 b.w.{.??.*.w.b
195 b.w.{.??.*.w.w
196 b.w.{.??.*.w.w
197 b.w.{.??.*.w.w
198 b.w.{.??.*.w.w
199 b.w.{.*..*.w.w
200 w.w.{.****.w.w
201 w.w.g......w.w
202 w.w.bbbbbbbw.w
203 w.w..........w
204 w.bbbbbbbbbbbw
205 w.............
206 Level:
207 michael
208 BLIZZARD
209 Bricks:
210 !!!!!!!!!!!!!!
211 !!!!!!!!!!!!!!
212 !!!!!!!!!!!!!!
213 !!!!!!!!!!!!!!
214 !!!!!!!!!!!!!!
215 !!!!!!!!!!!!!!
216 !!!!!!!!!!!!!!
217 E!!E!!E!!E!!E!
218 **************
219 *vvvvzEEzvvvv*
220 *vEEEzEEzEEEv*
221 *vEczzEEzzcEv*
222 *vEczzEEzzcEv*
223 *vEczzEEzzcEv*
224 *vEczzEEzzcEv*
225 *vEczzEEzzcEv*
226 *vEEEEEEEEEEE*
227 *EEEEEEEEEEEE*
228 Bonus:
229 ffffffffffffff
230 **ffff**ffff**
231 **ffff**ffff**
232 **ffff**ffff**
233 ffffffffffffff
234 ffffffffffffff
235 ffffffffffffff
236 .ff.ff.ff.ff.f
237 ..............
238 .WWWW!..!WWWW.
239 .W...!..!...W.
240 .W.**!..!**.W.
241 .W.**!..!**.W.
242 .W.**!..!**.W.
243 .W.**!..!**.W.
244 .W.*!!..!!*.W.
245 .W............
246 ..............
247 Level:
248 michael
249 FUN
250 Bricks:
251 ******EE******
252 *EEEE*EE*EEEE*
253 *EddE*EE*EddE*
254 *EeeE*EE*EeeE*
255 *EkkE*EE*EkkE*
256 *ajjE*EE*Ejja*
257 *EiiE*EE*EiiE*
258 *EhhE*EE*EhhE*
259 *EggE*EE*EggE*
260 *EfEE*EE*EEfE*
261 *EE***EE***EE*
262 *EE*EEEEEE*EE*
263 *EE*EEEEEE*EE*
264 *EE*E****E**E*
265 *E**E*EE*EE*E*
266 *E*EE*EE*EE*E*
267 *E****EE****E*
268 *EEEEEEEEEEEE*
269 Bonus:
270 wwwwww..wwwwww
271 ww...w..w....w
272 w.bb.w..w.bb.w
273 w.bb.w..w.bb.w
274 w.bb.w..w.bb.w
275 wbbb.w..w.bbbw
276 w.bb.w..w.bb.w
277 w.bb.w..w.bb.w
278 w.bb.w..w.bb.w
279 w.b..w..w..b.w
280 w..bww..wwb..w
281 w..b......b..w
282 w..b......b..w
283 w..b.bbbb.bw.w
284 w.wb.w..w..w.w
285 w.w..w..w..w.w
286 w.wwww..wwww.w
287 w............w
288 Level:
289 michael
290 FUN
291 Bricks:
292 vv************
293 !v*!!!****!!!*
294 !v*!*!****!*!*
295 !v*!!!****!!!*
296 !v************
297 !vdddddzaaaaab
298 !vdddddzaaaaab
299 !!!g!!!z!!!bbb
300 !E!g!E!z!E!ccc
301 !E!g!E!z!E!c!!
302 !E!g!E!z!E!cxy
303 !!!g!!!z!!!cxy
304 eeegfffziiicxy
305 !E!g!!!zijjxxy
306 !E!g!EEzijkyyy
307 !!!g!!!zijkkkk
308 hhhgEE!zijjjjj
309 hhhg!!!ziiiiii
310 Bonus:
311 bbwwwwwwwwwwww
312 5bw***wwww***w
313 5bw*w*wwww*w*w
314 5bw***wwww***w
315 5bwwwwwwwwwwww
316 5b-----?ddddd~
317 5b+++++?ddddd~
318 555f444?333~~~
319 5.5f4.4?3.3jjj
320 5.5f4.4?3.3j22
321 5.5f4.4?3.3j{}
322 555f444?333j{}
323 WWWf&&&?>>>j{}
324 1.1f000?><<{{}
325 1.1f0..?><p}}}
326 111f000?><pppp
327 !!!f..0?><<<<<
328 !!!f000?>>>>>>
329 Level:
330 michael
331 FUN
332 Bricks:
333 dddddddddddddd
334 kk***kkkkkkkkk
335 EiEiEiEiEiE!Ei
336 EhEhEhEhEhEhEh
337 EgEgEgEgEgEgEg
338 EfEfEfEfEfEfEf
339 **E**jEjEjEjEj
340 EeEeEeEeEeEeEe
341 EcEcEcEcEcEcEc
342 Eb.b.b.b.b.b.b
343 aa*aaadada!a!a
344 @@*@@@d@d@!@!@
345 ##*###d#d#!#!#
346 EE*EEEdEdE!E!E
347 ..*vvvdvdv!v!v
348 ..*vvvdddv!v!v
349 .EEEEEEEEEEEEE
350 **************
351 Bonus:
352 --{{cc~~>>**pp
353 &&bbb&&&&&&&&&
354 ...........*..
355 .5.5.5.5.5.5.5
356 .m.m.m.m.m.m.m
357 .}.}.}.}.}.}.}
358 bb.bbW.W.W.W.W
359 .j.j.j.j.j.j.j
360 .c.c.c.c.c.c.c
361 ..............
362 ..b...l.l.g.g.
363 ..b...l.l.g.g.
364 ..b...l.l.g.g.
365 ..b...l.l.g.g.
366 ..b...l.l.g.g.
367 ..b...lll.g.g.
368 ..............
369 wwwwwwwwwwwwww
0 Level:
1 Luke
2 madness
3 Bricks:
4 @@@@@@@@@@@@@@
5 .gggggggggggg.
6 .gggggggggggg.
7 .gggggggggggg.
8 .gggggggggggg.
9 .gggggggggggg.
10 .gggggggggggg.
11 .gggggggggggg.
12 .@@@@@@@@@@@@.
13 ..............
14 ..............
15 ##.........###
16 cc#.......#ccc
17 ccc###..##cccc
18 cccccccccccccc
19 cccc......cccc
20 ccc........ccc
21 cc..........cc
22 Bonus:
23 ..............
24 .bbb55m555bbb.
25 .bbb.5555mbbb.
26 .bbb..55..bbb.
27 .bbb......bbb.
28 .wbbbbbbbbbbw.
29 .wbbbbbbbbbbw.
30 .wwbbbbbbbbww.
31 ..............
32 ..............
33 ..............
34 ..............
35 ??.........???
36 ???.......????
37 ??????????????
38 ????......????
39 ???........???
40 ??..........??
41 Level:
42 luke
43 show me the money!
44 Bricks:
45 dddddddddddddd
46 dddddddddddddd
47 dddddddddddddd
48 dddddddddddddd
49 EEEEEE##EEEEEE
50 ..............
51 ..............
52 EE#EEEEEE#EEEE
53 ..............
54 ..............
55 #EEEEEEEEEEEE#
56 ##############
57 cccccccccccccc
58 .h.h.h.h.h.h.h
59 h.h.h.h.h.h.h.
60 .h.h.h.h.h.h.h
61 gggggggggggggg
62 kkkkkkkkkkkkkk
63 Bonus:
64 22222222222222
65 22222222222222
66 22222222222222
67 22222222222222
68 ......bb......
69 ..............
70 ..............
71 ..b......b....
72 ..............
73 ..............
74 b............b
75 bbbbbbbbbbbbbb
76 mbmbbbmmbbbbbm
77 .0.0.0.0.0.0.0
78 0.0.0.0.0.0.0.
79 .0.0.0.0.0.0.0
80 bbbbbbbbbbbbbb
81 ww....w...bww.
82 Level:
83 luke
84 Fast break
85 Bricks:
86 #*************
87 #*************
88 #EEEEEEEEEEE**
89 #Ee.e.e.e.eE**
90 #E.e.e.e.e.E**
91 #Ee.e.e.e.eE**
92 #E.e.e.e.e.E**
93 #Ee.e.e.e.eE**
94 #E.e.e.e.e.E**
95 #Ee.e.e.e.eE**
96 #E.e.e.e.e.E**
97 #Ee.e.e.e.eE**
98 #E.e.e.e.e.e**
99 #Ee.e.e.e.e.**
100 #EEEEEEEEEEEEE
101 ##############
102 iiiiiiiiiiiiii
103 gggggggggggggg
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 b.b..b.b..bb.b
121 .....m.....m..
122 w...w......w.w
123 Level:
124 luke
125 smile
126 Bricks:
127 ..............
128 ..............
129 ......hh......
130 .....hhhh.....
131 ....hhhhhh....
132 ...hhhhhhhh...
133 ..hhvvhhvvhh..
134 .hhhvvhhvvhhh.
135 .hhhhhhhhhhhh.
136 .hhhhhhhhhhhh.
137 .hhhhhhhhhhhh.
138 ..hhvhhhhvhh..
139 ...hhvhhvhh...
140 ....hhvvhh....
141 .....hhhh.....
142 ......hh......
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ......w.......
149 .......+......
150 ....-...?c....
151 ...s..c-..-...
152 ..d.55..55....
153 ..+.5m.f25.s..
154 ..............
155 .c-...-.l..+-.
156 ..?+l.....cc..
157 ....2....2....
158 ...-.2..2.-...
159 ......22......
160 .......+......
161 ......lc......
162 ..............
163 ..............
164 Level:
165 luke
166 cheaters don't win
167 Bricks:
168 #.hh......hh.#
169 ..hh......hh..
170 ..hh!!!!!!hh..
171 ..hh!!!!!!hh..
172 ..hhjkjkjkhh..
173 ..##kjkjkj##..
174 ..##dddddd##..
175 ..##eeeeee##..
176 ..##gggggg##..
177 ..##iiiiii##..
178 ..##ffffff##..
179 ..##########..
180 ..##########..
181 ..##########..
182 ..##########..
183 ..............
184 ..............
185 ..............
186 Bonus:
187 {.........m..{
188 ..+........+..
189 ....w.....g...
190 ..m...+.......
191 ..............
192 ..c?.....m??..
193 ..?f...l..-{..
194 ..{c..+...&c..
195 ..-c......{-..
196 ..?{.m..w.-f..
197 ..>d......~W..
198 ..W&W~->f{c?..
199 ..c~-{{c-?d-..
200 ..?-fd-?---?..
201 ..-{>c&-{?c?..
202 ..............
203 ..............
204 ..............
205 Level:
206 luke
207 Nuke
208 Bricks:
209 d...j..j..jjjj
210 .d..jjjjjjjjjj
211 .dd..jjjj.jjjj
212 .ddd...j..jjjj
213 .#########..j.
214 deh*******#...
215 hde********#..
216 ehh*********#.
217 deh*********#.
218 ehh********#..
219 deh*******#...
220 .#########....
221 .ddd...j..jj.j
222 .dd.....jjj.j.
223 .d....j.jjjjj.
224 d......jjjj...
225 ........jjjj..
226 .........jj...
227 Bonus:
228 ............md
229 .>...>...+-...
230 .......*....s{
231 ..+...........
232 .ddddddddd..j.
233 -..dddddddd...
234 ..5ddddddddd..
235 5..dddddddddd.
236 ...dddddddddd.
237 m.5ddddddddd..
238 ...dddddddd...
239 .ddddddddd....
240 .>w........-..
241 .........+....
242 .+......>...+.
243 -.........}...
244 .........p....
245 ..............
246 Level:
247 luke
248 Maze
249 Bricks:
250 ...*******#gg#
251 ...jjjjjjj#gg#
252 .#######..#gg#
253 .#fff#....#gg#
254 .#fff#....#gg#
255 .#...#..###gg#
256 j#...#........
257 *#............
258 j#........##..
259 j#f#####..###.
260 *#f#***#...hhh
261 .#f#ff.#...hhh
262 .#####.#######
263 ***...........
264 iii...........
265 #############.
266 ..............
267 ..............
268 Bonus:
269 ...bbbbbb.....
270 ...ww.wwbb....
271 ..............
272 ..............
273 ..............
274 ..............
275 b.............
276 ..............
277 b.............
278 b.............
279 w..........555
280 .....w.....555
281 ..............
282 ..............
283 ..w...........
284 ..............
285 ..............
286 ..............
287 Level:
288 luke
289 columns
290 Bricks:
291 ffEggEhhEiiEjj
292 ffEggEhhEiiEjj
293 ffEggEhhEiiEjj
294 ffEggEhhEiiEjj
295 ffEggEhhEiiEjj
296 ffEggEhhEiiEjj
297 ffEggEhhEiiEjj
298 ff*gg*hh*ii*jj
299 ff*gg*hh*ii*jj
300 ffEggEhhEiiEjj
301 ffEggEhhEiiEjj
302 ffEggEhhEiiEjj
303 ffEggEhhEiiEjj
304 ffEggEhhEiiEjj
305 ffEggEhhEiiEjj
306 ffEggEhhEiiEjj
307 ..............
308 ..............
309 Bonus:
310 ....l........l
311 .........s....
312 w..c..........
313 ......4+..+.+4
314 *...*.......+.
315 .f.*...s..w..s
316 4...>..*......
317 .*.+......4.&~
318 &.....cj.><..-
319 +..s{..f..{.<.
320 .j..-....g-...
321 -d.w4.&.....+.
322 ...!..}-.*....
323 .+.....-.+&..w
324 s..++.......c.
325 .<............
326 ..............
327 ..............
328 Level:
329 luke
330 krazy koulmns
331 Bricks:
332 ff@gg@dd@ee@hh
333 ff@gg@dd@ee@hh
334 ff@gg@dd@ee@hh
335 ff@gg@dd@ee@hh
336 ff@gg@dd@ee@hh
337 ff@gg@dd@ee@hh
338 ff@gg@dd@ee@hh
339 ff@gg@ddeeeehh
340 ffggggdd****hh
341 ff****ddeeeehh
342 ffggggdd@@@@hh
343 ff@@@@dd@ee@hh
344 ff@gg@dd@ee@hh
345 ff@gg@dd@ee@hh
346 ff@gg@dd@ee@hh
347 ff@gg@dd@ee@hh
348 ..............
349 ..............
350 Bonus:
351 ..?55?..?55?..
352 ..?55?.c?55?..
353 .c?..?.+?..?+.
354 ..?l.?-.?.-?..
355 ..?.+?.*?~l?.>
356 ~!?>.?m.?.+?-.
357 ..?.p?..?f.?!.
358 .-?.c?.c.....*
359 +.....c.....+.
360 .*~.......&...
361 ......-.????.m
362 ..????*+?.-?!.
363 m+?.w?!.?..?..
364 ..?f.?.w?p.?.+
365 +.?-.?>-?.+?w.
366 .p?.*?.!?c~?..
367 ..............
368 ..............
369 Level:
370 luke
371 what you can't see...
372 Bricks:
373 v.v.v.v.v.v.v.
374 .v.v.v.v.v.v.v
375 v.v.v.v.v.v.v.
376 .v.v.v.v.v.v.v
377 v.v.v.v.v.v.v.
378 .v.v.v.v.v.v.v
379 ..............
380 vvvvvvvvvvvvvv
381 ..............
382 vvvvvvvvvvvvvv
383 ..............
384 ..............
385 vvvvvvvvvvvvvv
386 ..............
387 ..............
388 vvvvvvvvvvvvvv
389 ..............
390 ..............
391 Bonus:
392 !.5...........
393 .f.b.&.5.b....
394 5.......?.3.3.
395 .W.w.3.*...W.b
396 -.3...3...3...
397 .3.{.5.3.5....
398 ..............
399 .b.?.<W?.g.j..
400 ..............
401 m.j5.+.?5b-w}.
402 ..............
403 ..............
404 w3+gbj-&.3.g.p
405 ..............
406 ..............
407 .5?..+gb.+.+..
408 ..............
409 ..............
410 Level:
411 luke
412 X
413 Bricks:
414 ..............
415 ..............
416 **************
417 *#ddddffdddd#*
418 *d#ddggggdd#d*
419 *dd#hhhhhh#dd*
420 *ddh#gggg#hdd*
421 *dghg#ff#ghgd*
422 *fghgf##fghgf*
423 *fghgf##fghgf*
424 *dghg#ff#ghgd*
425 *ddh#gggg#hdd*
426 *dd#hhhhhh#dd*
427 *d#ddggggdd#d*
428 *#ddddffdddd#*
429 ..............
430 ..............
431 ..............
432 Bonus:
433 ..............
434 ..............
435 ..............
436 .......l~.....
437 .f..-.+..+....
438 ....c..>...&..
439 ......m.5.....
440 ..+-..m....c+.
441 ...-.....d5-..
442 .-.5.......-..
443 ..>c..jc...+f.
444 .+............
445 .....+5.p...-.
446 ....w....g....
447 ....-..+.w....
448 ..............
449 ..............
450 ..............
451 Level:
452 luke
453 Box
454 Bricks:
455 ..............
456 ..............
457 .####.@@.####.
458 .#ddd....ddd#.
459 .#dkkkkkkkkd#.
460 .#dkc....ckd#.
461 .#dk.c..c.kd#.
462 .#dk..cc..kd#.
463 .#dkcccccckd#.
464 .#hk.c..c.kh#.
465 .#hkciiiickh#.
466 .#hkiiiiiikh#.
467 .#hkiiiiiikh#.
468 .#hkiiiiiikh#.
469 .#hkkkkkkkkh#.
470 .#hhhhhhhhhh#.
471 .############.
472 ..............
473 Bonus:
474 ..............
475 ..............
476 ..............
477 ..............
478 ...*..c3+.....
479 ....?.....c...
480 .....?........
481 ......3...3...
482 ...+...c......
483 ..........>...
484 ...>.c....?...
485 ...3..>..>?3..
486 ..3.????c.?...
487 .....>??..3...
488 ..cc.>..cc....
489 .......+.3....
490 ..............
491 ..............
492 Level:
493 luke
494 Lukcy 13
495 Bricks:
496 ffffffffffffff
497 .@............
498 fffff@ff!ff@ff
499 .!............
500 ffffffffffff!f
501 ..@..!..@.....
502 ffffffffffffff
503 @....@......@.
504 fffffffff@ffff
505 .!.....!......
506 ..............
507 @.@.@.@.@.@.@.
508 ..............
509 ..............
510 .@.@.@.@.@.@.@
511 ..............
512 ..............
513 ..............
514 Bonus:
515 ..............
516 ..............
517 ..............
518 ..............
519 ..............
520 ..............
521 ..............
522 ..............
523 ..............
524 ..............
525 ..............
526 ..............
527 ..............
528 ..............
529 ..............
530 ..............
531 ..............
532 ..............
533 Level:
534 luke
535 Not my cup o' tea
536 Bricks:
537 ..............
538 vvvvvvvvvvvvvv
539 vddddddddddddv
540 vdhhhhhhhhhhdv
541 vdhhhhhhhhhhdv
542 vdhhhhhhhhhhdv
543 vdhhhhhhhhhhdv
544 vdhhhhhhhhhhdv
545 vdhhhhhhhhhhdv
546 vjggggggggggjv
547 vjggggggggggjv
548 vjggggggggggjv
549 vjggggggggggjv
550 vjggggggggggjv
551 vjggggggggggjv
552 vjjjjjjjjjjjjv
553 vvvvvvvvvvvvvv
554 ..............
555 Bonus:
556 ..............
557 .....????.....
558 ???.??..???...
559 ..??......?...
560 ..??.......?..
561 .?..?......?..
562 .?..?......??.
563 .?..........?.
564 ??5555555555?.
565 ?...........?.
566 ???...??.....?
567 .??.??.?.....?
568 .????.?...?.?.
569 .??.???...?.?.
570 .......???.?..
571 ..............
572 ..............
573 ..............
574 Level:
575 luke
576 blitz 1
577 Bricks:
578 ffffffffffffff
579 **************
580 gggggggggggggg
581 ..............
582 ..............
583 ..............
584 jjjjjjjjjjjjjj
585 hhhhhhhhhhhhhh
586 eeeeeeeeeeeeee
587 dddddddddddddd
588 iiiiiiiiiiiiii
589 ffffffffffffff
590 gggggggggggggg
591 kkkkkkkkkkkkkk
592 aaaaaaaaaaaaaa
593 gggggggggggggg
594 **************
595 ffffffffffffff
596 Bonus:
597 ..............
598 ..............
599 ..............
600 ..............
601 ..............
602 ..............
603 ..............
604 ....?.....?...
605 .?............
606 ......?..?..?.
607 ....?.........
608 ...?..........
609 ..............
610 .?.?.w.?..?.?.
611 .w............
612 &&&&&&&&&&&&&&
613 >>>>>>>>>>>>>>
614 ++++++++++++++
615 Level:
616 luke
617 blitz2
618 Bricks:
619 ...!..........
620 ............!.
621 ...!.......!..
622 ....!...!.....
623 .!.!.!...!.!..
624 !.v.v.!.!.v.!.
625 .v.!.!.v.v.v.v
626 v.!.!.!.!.!.!.
627 .!.!.!.!.!.!..
628 !.!.!.!.!.!.!.
629 .!.!.!.!.!.!.!
630 !.!.!.!.!.!.!.
631 .!...!.!.!.!.!
632 !.!.!.!.!.!.!.
633 xxxxxxxxxxxxxx
634 gggggggggggggg
635 **************
636 ffffffffffffff
637 Bonus:
638 ..............
639 ..............
640 ...&..........
641 ..............
642 ...l..........
643 ........c.&...
644 ..............
645 ..c.d.&.l.d...
646 .&.......c....
647 ............&.
648 .d...d.c...c..
649 ..&...&.&.&...
650 .c...l.c...d..
651 ......c.......
652 ..............
653 &&&&&&&&&&&&&&
654 >>>>>>>>>>>>>>
655 ++++++++++++++
656 Level:
657 luke
658 blitz 3
659 Bricks:
660 ..............
661 kkkkkkkkkkkkkk
662 ..............
663 kkkkkkkkkkkkkk
664 ..............
665 kkkkkkkkkkkkkk
666 ..............
667 kkkkkkkkkkkkkk
668 **************
669 kkk*#jjjj#kkkk
670 ***#......#***
671 kk#iiiiiiii#kk
672 *#..........#*
673 #hhhhhhhhhhhh#
674 ..............
675 gggggggggggggg
676 **************
677 ffffffffffffff
678 Bonus:
679 ..............
680 ..............
681 ..............
682 ..............
683 ..............
684 ..............
685 ..............
686 ..............
687 ..............
688 ..............
689 ..............
690 ..............
691 ..............
692 ..............
693 ..............
694 &&&&&&&&&&&&&&
695 >>>>>>>>>>>>>>
696 ++++++++++++++
697 Level:
698 luke
699 blitz 4
700 Bricks:
701 **************
702 *vvvvvvvvvvvv*
703 *............*
704 *vvvvvvvvvvvv*
705 *............*
706 *vvvvvvvvvvvv*
707 *............*
708 *vvvvvvvvvvvv*
709 *............*
710 *vvvvvvvvvvvv*
711 *............*
712 *vvvvvvvvvvvv*
713 *............*
714 .vvvvvvvvvvvv.
715 **************
716 gggggggggggggg
717 **************
718 ffffffffffffff
719 Bonus:
720 ..............
721 .??........?..
722 ..............
723 ..???...???.?.
724 ..............
725 ...????????.?.
726 ..............
727 .?.?.?.??.?.?.
728 ..............
729 ...?..?..????.
730 ..............
731 .....?.???....
732 ..............
733 .&&&&&&&&&&&&.
734 cccccccccccccc
735 &&&&&&&&&&&&&&
736 >>>>>>>>>>>>>>
737 ++++++++++++++
738 Level:
739 luke
740 blitz 5
741 Bricks:
742 iiiiiiiiiiiiii
743 **************
744 !!!!!!!!!!!!!!
745 ..............
746 ..##########..
747 ..k#**hh**#k..
748 ..k*#*hh*#*k..
749 ..kk#*hh*#kk..
750 ..kk#*hh*#kk..
751 ..kkk#**#kkk..
752 ..kkk#**#kkk..
753 ..kkk#**#kkk..
754 ..kk**##**kk..
755 ..##########..
756 gggggggggggggg
757 **************
758 **************
759 ffffffffffffff
760 Bonus:
761 ..............
762 ..............
763 ..............
764 ..............
765 ..............
766 ..............
767 ..............
768 ..............
769 ..............
770 ..............
771 ..............
772 ..............
773 ..............
774 ..............
775 --------------
776 &&&&&&&&&&&&&&
777 >>>>>>>>>>>>>>
778 ++++++++++++++
779 Level:
780 luke
781 CPU Test
782 Bricks:
783 xxxx#!!!#xxx#x
784 xxxx#!!##xxx#x
785 xx#x#!#x#x#x#x
786 x#xx##xx#x#x#x
787 x#xx#xxx#x#x#x
788 x#xx#xxx#x#x#x
789 x#xx#x#x#x#x#x
790 x#xx#x#x#xxxxx
791 x#xx#x#x#xxxxx
792 x#xx#x#x#xxxxx
793 x#xx#x#x#x#x#x
794 x#xx#x#x#x#x#x
795 x#xx#x#x#x#x#x
796 x#xx#x#x#x#x#x
797 x#xx#x#x#x#x#x
798 x#xxxx#xxx#x#x
799 x#xxxx#xxx#xxx
800 x#############
801 Bonus:
802 wbwb.....bbb.m
803 bwww.....bbb.b
804 bw.b...b.b.b.b
805 w.bw..bb.b.b.b
806 b.wb.bbb.b.b.b
807 w.bb.bbb.b.b.b
808 b.bb.b.b.b.b.b
809 w.bb.b.b.bwbwb
810 b.bb.b.b.bwbwb
811 w.bb.b.b.bwbwb
812 b.bb.b.b.b.b.b
813 w.bb.b.b.b.b.b
814 b.bb.b.b.b.b.b
815 w.bb.b.b.b.b.b
816 b.bb.b.b.b.b.b
817 w.bbbb.bbb.b.b
818 b.bbbb.bbb.bbb
819 w.............
820 Level:
821 luke
822 CPU Test
823 Bricks:
824 ExExxExxExxExE
825 xxxxxxxxxxxxxx
826 E#E##E##E##E#E
827 ccc***********
828 ccc***********
829 ############**
830 **************
831 **************
832 **############
833 **************
834 **************
835 ############**
836 **************
837 **************
838 **############
839 **************
840 **************
841 ############**
842 Bonus:
843 ..............
844 ..............
845 ..............
846 bbbbbbbbbbbbbb
847 mbbbbbbbbbbbbb
848 ............bb
849 bbbbbbbbbbbbbb
850 bbbbbbbbbbbbbb
851 bb............
852 bbbbbbbbbbbbbb
853 bbbbbbbbbbbbbb
854 ............bb
855 bbbbbbbbbbbbbb
856 bbbbbbbbbbbbbb
857 bb............
858 bbbbbbwwwwwwww
859 bbbbbbwwwwwwww
860 ............ww
861 Level:
862 luke
863 spiral
864 Bricks:
865 cccccccccccccc
866 cccccccccccccc
867 c###########cc
868 c#ccccccccc#cc
869 c#ccccccccc#cc
870 b#cc#####cc#cc
871 b#cc#ccc#cc#cc
872 b#cc#ccc#cc#cc
873 b#cc#c###cc#cc
874 b#cc#cccccc#cc
875 b#cc#cccccc#cc
876 a#cc#ccccc##cc
877 a#cc######!#cc
878 a#ccccccc#!#cc
879 a#cccccccc##cc
880 a#######cccccc
881 *******#cccccc
882 *******#######
883 Bonus:
884 bbbbbbb*bbbbbb
885 bbbbbbbbbbbbbb
886 b...........bb
887 b.bbbbbbbbb.bb
888 b.bbbbbbbbb.bb
889 b.bb.....bb.bb
890 b.bb.bbb.bb.bb
891 b.bb.bbm.bb.bb
892 b.bb.b...bb.bb
893 b.bb.bbbbbb.bb
894 b.bb.bbbbbb.bb
895 w.bb.bbbbb..bb
896 w.bb........bb
897 w.bbbbbbb...bb
898 w.bbbbbbbb..bb
899 w.......bbbbbb
900 bwwbwww.bbbbbb
901 bwwwwww.......
902 Level:
903 luke
904 columns 3
905 Bricks:
906 f#g#h#i#j#k#de
907 f#g#h#i#j#k#de
908 f#g#h#i#j#k#de
909 f#g#h#i#j#k#de
910 f#g#h#i#j#k#de
911 f#g#h#i#j#k#de
912 f#g#h#i#j#k#de
913 f#g#h#i#j#k#de
914 f#g#h#i#j#k#de
915 f#g#h#i#j#k#de
916 f#g#h#i#j#k#de
917 f#g#h#i#j#k#de
918 f#g#h#i#j#k#de
919 ..............
920 ..............
921 ..............
922 ..............
923 ..............
924 Bonus:
925 m.m.m.m.m.m..m
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..............
933 ..............
934 ..............
935 ..............
936 ..............
937 ..............
938 ..............
939 ..............
940 ..............
941 ..............
942 ..............
943 Level:
944 luke
945 Teeth o' Doom
946 Bricks:
947 dddddddddddddd
948 dddddddddddddd
949 dddddddddddddd
950 dddddddddddddd
951 kdjjkdjjkdjjkd
952 k.jjk.jjk.jjk.
953 k.jjk.jjk.jjk.
954 k.jjk.jjk.jjk.
955 j.jjk.jjk.jjk.
956 ...j...j...j..
957 .j...j...j...j
958 jjj.jjj.jjj.jj
959 kjj.kjj.kjj.kj
960 kjj.kjj.kjj.kj
961 kjj.kjj.kjj.kj
962 kjjdkjjdkjjdkj
963 dddddddddddddd
964 dddddddddddddd
965 Bonus:
966 ..............
967 .m-..--.&.*...
968 ........+...p.
969 .-..........-.
970 ...*..-...*...
971 .......>......
972 ..>...........
973 .......w...-..
974 ...+....+.....
975 .......>......
976 .f...f...f...f
977 ..............
978 ..............
979 ......<.......
980 ..+..-..-+....
981 ..............
982 <....+...-<...
983 ..-..........-
984 Level:
985 luke
986 not happy anymore :(
987 Bricks:
988 ..............
989 ..............
990 ....hhhhhh....
991 ...hhhhhhhh...
992 ..hhhhhhhhhh..
993 .hhhhhhhhhhhh.
994 .hhvhvhhvhvhh.
995 .hhvvvhhvvvhh.
996 .hhhvhhhhvhhh.
997 .hhhhhhhhhhhh.
998 .hhhhhhhhhhhh.
999 .hhhvhhhhvhhh.
1000 .hhvhvhhvhvhh.
1001 ..hhhvvvvhhh..
1002 ...hhhvvhhh...
1003 ....hhhhhh....
1004 ..............
1005 ..............
1006 Bonus:
1007 ..............
1008 ..............
1009 ..............
1010 .....>.-......
1011 .......>......
1012 ..---......-..
1013 ..-0.0..0.0...
1014 ...000..000.>.
1015 .>..m..>.m....
1016 ..>...>....>..
1017 ...--....-->-.
1018 ....0-...0..-.
1019 ...0.0.>0.0...
1020 ...->0000.....
1021 ......00.-....
1022 .......>......
1023 ..............
1024 ..............
1025 Level:
1026 luke
1027 WHHHHHHHHHHYYYYYY
1028 Bricks:
1029 ...kkkkkkkk...
1030 ....kkkkkk....
1031 ....######....
1032 ....jjjjjj....
1033 .....####.....
1034 .....gggg.....
1035 ......##......
1036 .....ffff.....
1037 .....####.....
1038 ....hhhhhh....
1039 ....######....
1040 ...iiiiiiii...
1041 ...########...
1042 ..eeeeeeeeee..
1043 ..##########..
1044 .dddddddddddd.
1045 .############.
1046 ..............
1047 Bonus:
1048 ...+b.-.b.c...
1049 .....b........
1050 ..............
1051 ........c.....
1052 ..............
1053 .....cb.......
1054 ..............
1055 ......+.......
1056 ..............
1057 .....-.b......
1058 ..............
1059 ...+.b....c...
1060 ..............
1061 ...+.c.b.-.+..
1062 ..............
1063 ...b..w..-.+..
1064 ..............
1065 ..............
1066 Level:
1067 luke
1068 Invader
1069 Bricks:
1070 ..............
1071 .....d..d.....
1072 ....d....d....
1073 ...d......d...
1074 ...d......d...
1075 ...dddddddd...
1076 ..dd..dd..dd..
1077 ..d.dd..dd.d..
1078 ..d.dd..dd.d..
1079 ..dd..dd..dd..
1080 ...dddddddd...
1081 ....dddddd....
1082 ....dddddd....
1083 .....dddd.....
1084 .....dddd.....
1085 .....dddd.....
1086 ......dd......
1087 ......dd......
1088 Bonus:
1089 ..............
1090 ..............
1091 ..............
1092 ..............
1093 ..............
1094 ..............
1095 ..............
1096 ..............
1097 ..............
1098 ..............
1099 ..............
1100 ..............
1101 ..............
1102 ..............
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 Level:
1108 luke
1109 stairway from hell
1110 Bricks:
1111 cccccccccccccc
1112 cccccccccccccc
1113 ####cccccccccc
1114 cccc###ccccccc
1115 ccccccc###cccc
1116 cccccccccc###c
1117 cccccccccccccc
1118 cccccccccccccc
1119 cccccccccc####
1120 ccccccc###cccc
1121 cccc###ccccccc
1122 c###cccccccccc
1123 cccccccccccccc
1124 .......ccccccc
1125 ####......cccc
1126 cccc###.......
1127 bbbbbbb###....
1128 aaaaaaaaaa###.
1129 Bonus:
1130 ..............
1131 ..............
1132 ....m.........
1133 .b............
1134 .bb...........
1135 bwwbbb........
1136 .bbbb.bbb.....
1137 .b.bwb.bwb.b..
1138 b.b.b.b.......
1139 .bb.......bbb.
1140 b.......bbb.bb
1141 ....b...bbbbbb
1142 bbbbbbbbbbbb..
1143 .......bbbbbb.
1144 ..........bb..
1145 wwwb..........
1146 wbwwbww.......
1147 wwwwwwwwww....
1148 Level:
1149 luke
1150 Tacco!
1151 Bricks:
1152 ..............
1153 ..............
1154 ..............
1155 ....f...f.....
1156 ....efeede....
1157 ..eedfddffef..
1158 .fdfhhhhhhde..
1159 .efhhhhhhhhfef
1160 .dhhhhhhhhhhde
1161 .fhhhhhhhhhhf.
1162 .hhhhhhhhhhhh.
1163 .hhhhhhhhhhhh.
1164 .hhhhhhhhhhhh.
1165 .hhhhhhhhhhhh.
1166 .hhhhhhhhhhhh.
1167 ..............
1168 ..............
1169 ..............
1170 Bonus:
1171 ..............
1172 ..............
1173 ..............
1174 ..............
1175 ....?????.....
1176 ..?????.?.....
1177 ..?ccc*c?.....
1178 ..?mcc??cc....
1179 ..?cc??cccc??.
1180 .?cc???ccc.c?.
1181 .?cc?w?c.c.c?.
1182 .?ccccccc..?c.
1183 .?.ccccccc??..
1184 .???cc..??....
1185 ...??????.....
1186 ..............
1187 ..............
1188 ..............
1189 Level:
1190 luke
1191 stripe Search
1192 Bricks:
1193 gvivjvfvdvivev
1194 gvivjvfvdvivev
1195 gvivjvfvdvivev
1196 gvivjvfvdvivev
1197 gvivjvfvdvivev
1198 gvivjvfvdvivev
1199 gvivjvfvdvivev
1200 gvivjvfvdvivev
1201 gvivjvfvdvivev
1202 gvivjvfvdvivev
1203 gvivjvfvdvivev
1204 gvivjvfvdvivev
1205 gvivjvfvdvivev
1206 g.i.j...d.i.e.
1207 g.i.....d.i.e.
1208 ..i.....d.i.e.
1209 ........d...e.
1210 ............e.
1211 Bonus:
1212 .?.?.?.?.?.?.?
1213 .?.?.?.?.?.?.?
1214 .?.?.?.?.?.?.?
1215 .?.?.?.?.?.?.?
1216 .?.?.?.?.?.?.?
1217 .?.?.?.?.?.?.?
1218 .?.?.?.?.?.?.?
1219 .?.?.?.?.?.?.?
1220 .?.?.?.?.?.?.?
1221 .?.?.?.?.?.?.?
1222 .?.?.?.?.?.?.?
1223 .?.?.?.?.?.?.?
1224 .?.?.?.?.?.?.?
1225 ..............
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 Level:
1231 luke
1232 stairway from hell
1233 Bricks:
1234 ..............
1235 ..............
1236 ..............
1237 ..............
1238 ..............
1239 ..............
1240 ..............
1241 ..............
1242 ..............
1243 ..............
1244 ..............
1245 ..............
1246 ..............
1247 ..............
1248 ..............
1249 ..............
1250 ..............
1251 ..............
1252 Bonus:
1253 ..............
1254 ..............
1255 ..............
1256 ..............
1257 ..............
1258 ..............
1259 ..............
1260 ..............
1261 ..............
1262 ..............
1263 ..............
1264 ..............
1265 ..............
1266 ..............
1267 ..............
1268 ..............
1269 ..............
1270 ..............
1271 Level:
1272 luke
1273 encyclopedia enthropia
1274 Bricks:
1275 ............f.
1276 hhfc.f.ffcf.fh
1277 cc.c*cd*gc*h.h
1278 .*fchc.dg.*h*f
1279 c!.*..*dhg..cf
1280 g!hcgc.hc.!**.
1281 .c.c.*ffffg..h
1282 .**ff...**fgf*
1283 f.gcdh*c.!h!..
1284 ..!h*d..g!*!.g
1285 d!.!!dfg.f*ff.
1286 h!*.fd.g*c..*!
1287 h..g.cc..cgdc!
1288 hccggd*hh!.*c!
1289 .ff..f*d.*!d.h
1290 ...*g..gg.cdhh
1291 *hcc!!g.....f.
1292 !.ghh!g.ff.g..
1293 Bonus:
1294 ..............
1295 ..............
1296 ??.?..........
1297 ?..???.??.....
1298 ?........????.
1299 ....??.?......
1300 .....??......?
1301 ........??????
1302 ...????...?...
1303 ..??..........
1304 ?..?..?...?...
1305 ??..?....?....
1306 .?....?.?.....
1307 ..?......?....
1308 ..?..?........
1309 .....?....?.?.
1310 ...?.?........
1311 ...??.........
1312 Level:
1313 luke
1314 Purple Monkeis
1315 Bricks:
1316 j..jjjj.f....@
1317 jjjjjj.fff...@
1318 .jjjjjffiiff.@
1319 jjj.j.ff@i@@@@
1320 j.....ffiff..@
1321 ....i..fif.i.@
1322 ..ii....fi.i.@
1323 ..i.i.....i..@
1324 .i.ii...ii.i.i
1325 ..ii.......i.i
1326 ...i..i...iii@
1327 i..i.i...i.ii@
1328 .iiii...i.ii.i
1329 ...i..i...i.ii
1330 ...i.i.i...ii@
1331 ..i.i......i.@
1332 ..i.i........@
1333 .ii.ii.......@
1334 Bonus:
1335 ..............
1336 ..............
1337 .<.<..........
1338 ..............
1339 ..............
1340 .........<....
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ...........<..
1346 ...<..........
1347 ..............
1348 ..............
1349 ..............
1350 ..............
1351 ..............
1352 ..............
1353 Level:
1354 luke
1355 monkey riding dishwasher
1356 Bricks:
1357 kkkkkkkkkkkkkk
1358 kkkkkkkkkkkkkk
1359 kkkkkkkkkkkkkk
1360 ........a....a
1361 ..i........a..
1362 .i.i.....a...a
1363 i.i.j..a..a.a.
1364 .ii.j....a.a..
1365 .i.ij.......aa
1366 .ii.jjjjjaa...
1367 .i..jjjjj.a.a.
1368 .i..jjjjj..a..
1369 ii..jjjjja.j.a
1370 i.i.jjjjj..j..
1371 i..ijjjjjaj...
1372 .i..jjjjj.ja..
1373 ..i.jjjjjj...a
1374 .i..jjjjj.....
1375 Bonus:
1376 ..............
1377 ......<.......
1378 ..............
1379 ..............
1380 ..............
1381 .........<....
1382 .......<......
1383 ...........0..
1384 ..............
1385 .<.......<....
1386 ............<.
1387 ..............
1388 ..............
1389 ......<.......
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 Level:
1395 luke
1396 Firecracker
1397 Bricks:
1398 ***********#*#
1399 *########*#*#*
1400 #******#**##*#
1401 *######*#*#*#*
1402 #******#**##*#
1403 #*########*##*
1404 *##*******##*#
1405 **###########*
1406 *****#*****#*#
1407 *###*#*######*
1408 #****#********
1409 **############
1410 *#************
1411 ***####@@@@@@.
1412 ###...........
1413 ***...........
1414 ***..#........
1415 ####.#########
1416 Bonus:
1417 ..............
1418 ..............
1419 ..............
1420 ..............
1421 .2222222......
1422 .2............
1423 2..2222222....
1424 22............
1425 22222.........
1426 2...2.........
1427 .2222.........
1428 22............
1429 2.222222222222
1430 222...........
1431 ..............
1432 222...........
1433 222...........
1434 ..............
1435 Level:
1436 luke
1437 begenning of the end
1438 Bricks:
1439 ..............
1440 jjjjjjjjjjjjjj
1441 jjjjjjjjjjjjjj
1442 iiiiiiiiiiiiii
1443 iiiiiiiiiiiiii
1444 dddddddddddddd
1445 ddddd#dd#ddddd
1446 hhhh#hhhh#hhhh
1447 hhh#hhhhhh#hhh
1448 gg#gggggggg#gg
1449 gggggggggggggg
1450 ffffffffffffff
1451 ff#ffffffff#ff
1452 #vv#......#vv#
1453 ....#....#....
1454 .....#vv#.....
1455 ..............
1456 ..............
1457 Bonus:
1458 ..............
1459 .....-........
1460 .*......-.w.>.
1461 ..>c.>....>...
1462 .....d.c.b....
1463 >>.-..&....p..
1464 .......>...-..
1465 ..d...........
1466 c.....>>>..d>.
1467 .....c........
1468 .p...........c
1469 ...-.>.p.-....
1470 ......+.}...>.
1471 ..>...........
1472 ..............
1473 .......+......
1474 ..............
1475 ..............
1476 Level:
1477 luke
1478 one last break
1479 Bricks:
1480 ..............
1481 .!.!.!.!.!.!.!
1482 !.!.!.!.!.!.!.
1483 .!.!.!.!.!.!.!
1484 !.!.!.!.!.!.!.
1485 .!.!.!.!.!.!.!
1486 !.!.!.!.!.!.!.
1487 .!.!.!.!.!.!.!
1488 !.!.!.!.!.!.!.
1489 .!.!.!.!.!.!.!
1490 !.!.!.!.!.!.!.
1491 .!.!.!.!.!.!.!
1492 !.!.!.!.!.!.!.
1493 .!.!.!.!.!.!.!
1494 !.!.!.!.!.!.!.
1495 .!.!.!.!.!.!.!
1496 ..............
1497 ..............
1498 Bonus:
1499 ..............
1500 ...m.......m..
1501 ..............
1502 ..............
1503 ..............
1504 .m.m...m...m..
1505 ..............
1506 .m.......m....
1507 ....m.........
1508 .......m.....m
1509 ..m...........
1510 ...........m..
1511 ......m.......
1512 m.............
1513 ..............
1514 .....m.....m..
1515 ..............
1516 ..............
1517 Level:
1518 luke
1519 Die Die My Darling
1520 Bricks:
1521 ..@@..........
1522 ..@...........
1523 ..@kkkkkkkkk..
1524 @@@kkkkkkkkkk.
1525 @@@jjjjjjjjjd.
1526 ..@jjjjjjjdd..
1527 ..@........d..
1528 ..@@.......d..
1529 ........dddddd
1530 gggggggdgddddg
1531 ggggggdgdgdddd
1532 #g#g#d#d#d#d#d
1533 #g#g#g#g#d#d#d
1534 gggggggddddddd
1535 ggggggdggddgdd
1536 .#.#.#.#d#d#d#
1537 .#.#.#.#d#.#d#
1538 .#.#.#.#.#.#d#
1539 Bonus:
1540 ..............
1541 ..............
1542 ...>..........
1543 ..............
1544 .....>........
1545 ...>....!.....
1546 ..............
1547 ..............
1548 ..............
1549 ..-......--...
1550 >-!.-.!->..>-.
1551 ...>..........
1552 ...........-.-
1553 .-..>.....>...
1554 >.-...-.--..-.
1555 ..............
1556 ..............
1557 ..............
1558 Level:
1559 luke
1560 Almost there...
1561 Bricks:
1562 hhhhhhhhhhhhhh
1563 hhhhhhhhhhhhhh
1564 hhhhhhhhhhhhhh
1565 .....v.v.v.v.v
1566 ####v.v.v.####
1567 .v.v.v.v.v.v.v
1568 v.v.v.v.v.v.v.
1569 .v.v.v.v.v.v.v
1570 v.v#v.v.v.#.v.
1571 .v.v#v.v.#.v.v
1572 v.v.v#v.#.v.v.
1573 .v.v.v##.v.v.v
1574 v.v.v.v.v.v.v.
1575 .v.v.v.v.v.v.v
1576 v.v.v.v.v.v.v.
1577 .v.v.v.v.v.v.v
1578 v.v.v.v.v.v.v.
1579 ..............
1580 Bonus:
1581 55>55555555555
1582 55555}5?}5>5>5
1583 555>5555555555
1584 .........l....
1585 ....*.........
1586 .l...?.-.}....
1587 ..-.}.c.....-.
1588 .....-.*.-....
1589 {.....f.....c.
1590 .+.l...>...?.{
1591 ......g.....+.
1592 .?.*.{........
1593 ..c.......+.*.
1594 .{.}.f.f......
1595 ..+...?...{.?.
1596 ...c.....c....
1597 ..........+...
1598 ..............
1599 Level:
1600 luke
1601 MEGADOOMER
1602 Bricks:
1603 **************
1604 !!!!!!!!!!!!!!
1605 jjjjjjjjjjjjjj
1606 jj@hhhhhhhh@jj
1607 j@ghhhhhhhhg@j
1608 @gghhhhhhhhgg@
1609 ggghhh##hhhggg
1610 ggghh#ii#hhggg
1611 gggh#iiii#hggg
1612 ff#hiiiiiih#ff
1613 ff#ihhhhhhi#ff
1614 ff#i#hhhh#i#ff
1615 ff#ii#hh#ii#ff
1616 ff#iii##iii#ff
1617 ff#iiiiiiii#ff
1618 ff#iiiiiiii#ff
1619 ###iiiiiiii###
1620 xxxxxxxxxxxxxx
1621 Bonus:
1622 5....-..5....5
1623 ...5...f...f-.
1624 5-.f.5..-~5.5.
1625 ....{.5...?..?
1626 ...?...W55....
1627 ..?.5--.?5d...
1628 .5.5s....~-.5.
1629 ..WWf..5...{.d
1630 d-....W.>.f.-.
1631 .5...>>~.5...W
1632 W..{.5..5??.--
1633 --...p>5......
1634 .f.?..W...W..5
1635 .-.-.5...5..~5
1636 ~..~..{5d.f...
1637 ....5?.f.-....
1638 .........?....
1639 ..............
1640
0 Version: 1.00
1 Level:
2 Nester
3 Mario
4 Bricks:
5 ............hh
6 .....*****..hh
7 ....*********h
8 ....dddhhdh.dd
9 ...dhdhhhdhhdd
10 ...dhddhhhdhhh
11 ...ddhhhhddddd
12 .....hhhhhhhd.
13 .ddddd*ddd*d..
14 ddddddd*ddd*..
15 hdddddd*****.d
16 hh.**d**h**h*d
17 h.d**********d
18 .ddd*********d
19 ddd*******....
20 d..****.......
21 ..............
22 ..............
23 Bonus:
24 ............22
25 ............22
26 ..............
27 ......>..-....
28 .........?..-.
29 ....+.&.....s.
30 ..........w...
31 ........}.....
32 ..............
33 .~..{.........
34 0............!
35 *0......1..1..
36 0............c
37 .<...>........
38 .........~....
39 -.............
40 ..............
41 ..............
42 Level:
43 Nester
44 Luigi
45 Bricks:
46 aaa..aaaaa....
47 hhhaafffffa...
48 hhaffffffffa..
49 afaaahahhaaa..
50 afhhhhahaahha.
51 afhhhahhaahha.
52 .aaaaaahhhaa..
53 .afhhhhhhaa...
54 ..afafffafffa.
55 aaaafffafffaaa
56 ffahaahaffahhh
57 fffaaaaaafahhh
58 affaaaaaaaaafa
59 affaaaaaaaafff
60 .aa...aaaaaaff
61 ........aaa.aa
62 ..............
63 ..............
64 Bonus:
65 ..............
66 22.....l......
67 22............
68 ......-..c....
69 -.....?....g..
70 .s............
71 ..............
72 ..b....W......
73 ....j....+....
74 ..............
75 <..1..1....0*0
76 ............0.
77 .....+.>...~..
78 .f.......{....
79 ..............
80 ............>.
81 ..............
82 ..............
83 Level:
84 Nester
85 Link
86 Bricks:
87 ....ffffff....
88 ...ffffffff...
89 .e.fddddddf.e.
90 .e.dddddddd.e.
91 .eedefeefedee.
92 .eededeededee.
93 ..eeeeeeeeeed.
94 ..ffeeddeeffd.
95 .ddddeeeeffddd
96 ddedddfffffedd
97 deeededdffeeed
98 ddeddefddddeee
99 ddeddeddffffe.
100 ddeddefffff...
101 ddddde..ddd...
102 eeeeed........
103 ...ddd........
104 ..............
105 Bonus:
106 ..............
107 ..............
108 .~.+........l.
109 ......--..-...
110 .....+..+.....
111 .j...?..?...b.
112 ...&......&...
113 ......ff......
114 ..........W...
115 ..0..!.....2..
116 .0w0........*.
117 ..0...s.<..2.2
118 ..0...........
119 ~.0.~..+......
120 .........>....
121 ..............
122 ....>.........
123 ..............
124 Level:
125 Nester
126 Dragon Warrior
127 Bricks:
128 j.j...gggg...j
129 j.jjjggggggjjj
130 j..jjgjjjjgjj.
131 j...gggggggg..
132 j...gegeegeg..
133 j.ggeegeegeegg
134 jggggeeeeeeggg
135 ggjggggeeggjjj
136 eejjggggggjggg
137 eej.jgjjjjjgeg
138 j...ggggggjgeg
139 ....gjggggjggg
140 ....jjggggjjjj
141 ....eee.jjjj..
142 ....ggg.eeee..
143 ........gggg..
144 ..............
145 ..............
146 Bonus:
147 *.............
148 ..0..........0
149 ...f...wj...f.
150 ..............
151 ......-..-....
152 ....+.?..?.+..
153 ..............
154 ............l.
155 .+<...........
156 ....}.>!>b..4.
157 >...........4.
158 .......s...>.>
159 ....-.......c.
160 .....~...<....
161 ........~..~..
162 ..............
163 ..............
164 ..............
165 Level:
166 Nester
167 Megaman
168 Bricks:
169 ..............
170 ..............
171 ......aaa.....
172 ....aaa!!a....
173 ...aggga!!a...
174 ..agggggaaaa..
175 ..aggggga!!ga.
176 .a!ggggggaaga.
177 .a!gghjjjggja.
178 .a!ghjjaahaja.
179 ..aghjjaahaja.
180 ..aghhjjjhjha.
181 ...aghaaaahaa.
182 ....ahhhhha...
183 .....aaaaa....
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..............
191 .......W......
192 ..............
193 ....j..m..-...
194 ..............
195 .....+.....b..
196 ..c.......<...
197 .....f.22l.f..
198 .....s.2?.....
199 ..->......~.-.
200 ........c.....
201 .....p.p.p....
202 ......>.+.....
203 ..............
204 ..............
205 ..............
206 Level:
207 Nester
208 Bomberman2
209 Bricks:
210 ...aaddddaa...
211 ..adddddddda..
212 .addeeeeeedda.
213 .adeeEeeEeeda.
214 .adeeEeeEeeda.
215 .adeeEeeEeeda.
216 .addeeeeeedda.
217 ..adddddddda..
218 addaeeeeeeadda
219 addaeeeeeeadda
220 eaaeeeeeeeeaae
221 eeEEEE**EEEEee
222 aaaeeeeeeeeaaa
223 ..adddaaddda..
224 ..adddaaddda..
225 ..aaaaaaaaaa..
226 .aaeeeaaeeeaa.
227 aaaaaaaaaaaaaa
228 Bonus:
229 ..............
230 .....2..2.....
231 ...?......?.~.
232 ......22......
233 ..>.2.gj.2.+..
234 .~....22......
235 ..&...........
236 .....?..?.....
237 ...-.......&.-
238 -.w.....&.....
239 ....&0000.....
240 W.....**.....W
241 .....0000.....
242 ...&..s.......
243 .......+...<..
244 ....>....>....
245 ..<...-.....f.
246 .f............
247 Level:
248 Nester
249 Red Elf Is About To Die
250 Bricks:
251 ..........aaa.
252 aaaaaa.aaaada.
253 daaddaaadaadaa
254 aaddddada.aada
255 addddaa@a..ada
256 .addaa@@a..ada
257 ..ada@@@a.aad@
258 ..aaa@@aaa@@@@
259 .adddaaaa@@ada
260 adaadddadaaada
261 aa@addaaa.aada
262 a@@@aa@da.adaa
263 .a@@@@@a..ada.
264 ..aaaaaa..aaa.
265 .addadda......
266 .addaada......
267 ..............
268 ..............
269 Bonus:
270 ..............
271 .0.0.0.....b..
272 4...c...l..p..
273 ..............
274 ..c...........
275 .....?......-.
276 ...1........b.
277 .........&....
278 ............b.
279 .w..-.~.j...-.
280 +.............
281 .......{...p..
282 ...........b..
283 ..............
284 ....s.>.......
285 ..>...........
286 ..............
287 ..............
288 Level:
289 Nester
290 Lolo
291 Bricks:
292 ...aagggaa....
293 .agjjjgjggga..
294 agjjgggggggga.
295 aggggggggggga.
296 ggjjjgggjjjgga
297 gjjjjjgjjjjjga
298 gjjjvvgvvjjjga
299 ajjjvvgvvjjjaa
300 ajjjjjgjjjjjaj
301 aajjjgggjjjgaj
302 jagggggggggaja
303 jjaagggggaajja
304 aaaaaaaaaaaaa.
305 .ajjja.ajjja..
306 .aaaaa.aaaaa..
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 .....p.l......
313 ...b.......-..
314 ..............
315 .-.0.c.-.0....
316 ..0.......0.c.
317 .0..22.22..0..
318 w.0.2?{?2.0...
319 .0.0.....0...&
320 ..0.0+.+0.0...
321 ..-.......-...
322 b...~.s.W...b.
323 ..............
324 ..<f>...>f<...
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Nester
331 Super Offroad
332 Bricks:
333 ...jeea.......
334 ....aeaaeeee.j
335 eejjeaeaeeeeej
336 aajjeaaeeeeeej
337 eeeeeeeeeaaeej
338 eaaeeeeaaaaavj
339 aaaaaaavaajavv
340 ajaavvvvvaavvv
341 vaavvvvvjavvvv
342 vvvvvviiijjvvv
343 vvvvvaiiijjaaa
344 vviiiaiaajijii
345 jiiiiiaaiiiiaa
346 jiiiiiiiiiiaaa
347 jiiiaaiiiiaaaj
348 jiiaaaaaaa..aa
349 ..iaaja.......
350 ....aa........
351 Bonus:
352 ...l..........
353 ..........{...
354 .+....m..s....
355 ..f&+c..+..+.w
356 j..c..s......b
357 ..+.}....+..?.
358 ..W&......2...
359 .2...?.>>.<-?>
360 .<.>?>-?..>.>?
361 >>-?.?.....?.>
362 ?.?>>....&f...
363 >?....g.....+.
364 ...+....c.{...
365 b.&.s......+W.
366 w..}.c.{.&...2
367 ..+.+........<
368 .....2........
369 .....<........
370 Level:
371 Nester
372 Tetris
373 Bricks:
374 ##############
375 #..........c..
376 #..........cjj
377 #..........cjj
378 #........jjcjj
379 #j.......jjc..
380 #j.......ggccc
381 #j.......ggccc
382 #j.....g.ggcg.
383 #......ggggcgg
384 #......jgjjc.g
385 #.j.g.gjjjjccc
386 #.jggggjaggccc
387 #.jgjgaaaagcjj
388 #.jjjaajjagc.j
389 #.gjjagjaaac.j
390 #.gjjggjggac.j
391 #.ggjgjjjggccc
392 Bonus:
393 ..............
394 ..............
395 ............bb
396 ...........!bb
397 ............bb
398 .w.......g.?..
399 .2........j...
400 .2..........+.
401 .2.......c.+..
402 .......}....ml
403 .........-....
404 ..W.......-!.?
405 ...<.{..~.....
406 ....W..&..&.-.
407 ...f.+...{.W..
408 ..?.?.~.-.s..c
409 .....!.f.>.-..
410 ..+~.-.?.....p
0 Version: 1.00
1 Level:
2 Michael Speck
3 Duell-1
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 ..............
10 ..............
11 ..............
12 ..............
13 ..............
14 ..............
15 ..............
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Duell-2
45 Bricks:
46 ..............
47 ..............
48 ..............
49 ..............
50 ..#..#..#..#..
51 ..#..#..#..#..
52 ..#..#..#..#..
53 ..@..@..@..@..
54 ..@..@..@..@..
55 ..@..@..@..@..
56 ..@..@..@..@..
57 ..#..#..#..#..
58 ..#..#..#..#..
59 ..#..#..#..#..
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ..............
71 ..............
72 ..............
73 ..............
74 ..............
75 ..............
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Duell-1
86 Bricks:
87 ..............
88 ..............
89 ..............
90 ..............
91 ..............
92 ..............
93 ..............
94 ..............
95 ..............
96 ..............
97 ..............
98 ..............
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Michael Speck
126 Duell-3
127 Bricks:
128 ..............
129 ..............
130 ..............
131 ..............
132 ..............
133 ..#..#..#..#..
134 ..............
135 #...@....@...#
136 ..............
137 ..............
138 #...@....@...#
139 ..............
140 ..#..#..#..#..
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Michael Speck
167 Duell-1
168 Bricks:
169 ..............
170 ..............
171 ..............
172 ..............
173 ..............
174 ..............
175 ..............
176 ..............
177 ..............
178 ..............
179 ..............
180 ..............
181 ..............
182 ..............
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Michael Speck
208 Duell-4
209 Bricks:
210 ..............
211 ..............
212 .#...#..#...#.
213 ..............
214 @............@
215 @............@
216 @............@
217 @............@
218 @............@
219 @............@
220 @............@
221 @............@
222 @............@
223 @............@
224 ..............
225 .#...#..#...#.
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
0 Version: 1.00
1 Level:
2 Michael Speck
3 Chinese
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ffffffffffffff
9 ffffffffffffff
10 gggggggggggggg
11 gggggggggggggg
12 jbbbbbbbbbbbbj
13 jbjjjjjjjjjjbj
14 jbjjjjjjjjjjbj
15 jbbbbbbbbbbbbj
16 dddddddddddddd
17 dddddddddddddd
18 eeeeeeeeeeeeee
19 eeeeeeeeeeeeee
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ?......-.....?
28 ....+.....>...
29 ..p.....b.....
30 .....~.....+..
31 ...s....j.b.w.
32 .*1323232323..
33 ..3232323231*.
34 .w...j....s...
35 .......~...+..
36 ....b.....p...
37 ..b...+.>.....
38 ?...-........?
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Spearhead
45 Bricks:
46 ..............
47 ..............
48 ..............
49 jjjj..........
50 kkkkkk........
51 aaaaaaaa......
52 kkkkkkkkkk....
53 jjjjjjjjjjjj..
54 #####....zzzzz
55 #####....zzzzz
56 kkkkkkkkkkkk..
57 jjjjjjjjjj....
58 aaaaaaaa......
59 jjjjjj........
60 kkkk..........
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 .2.-..........
69 .+............
70 2.w2b..+......
71 .-....2..~....
72 .p.*.}..s..c..
73 .........44444
74 .........44444
75 p..*...}s.~...
76 .2...2-..+....
77 ..b2w..d......
78 .-.+..........
79 2.............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Fortress
86 Bricks:
87 ..............
88 ..............
89 ..............
90 ..............
91 ..............
92 ..E##zzzz##E..
93 .kE@..gg..@Ek.
94 kkE.iiiiii.Ekk
95 kkEgiggggigEkk
96 kkEgiggggigEkk
97 kkE.iiiiii.Ekk
98 .kE@..gg..@Ek.
99 ..E##zzzz##E..
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 .....f>.f.....
112 .p..........p.
113 ?...3....3...+
114 .b...34.3.....
115 .....3.43...b.
116 +...3....3...?
117 .p..........p.
118 .....f.>f.....
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Michael Speck
126 Soccer Worldcup
127 Bricks:
128 ..............
129 ..............
130 ffffffffffffff
131 ffffffffffffff
132 ffffffffffffff
133 jjjffffffffjjj
134 ffjffffffffjff
135 ffjfffjjfffjff
136 jfjffjffjffjfj
137 jfjffjffjffjfj
138 ffjfffjjfffjff
139 ffjffffffffjff
140 jjjffffffffjjj
141 ffffffffffffff
142 ffffffffffffff
143 ffffffffffffff
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 >...+.bb.+...>
150 ..b..-..-..b..
151 ..............
152 11>........>11
153 .f1..b..b..1..
154 ..1...33...1..
155 ?.1..3553..1.?
156 ?.1..3553..1.?
157 ..1...33...1..
158 ..1..b..b..1f.
159 11>........>11
160 ..............
161 ..b..-..-..b..
162 >...+.bb.+...>
163 ..............
164 ..............
165 Level:
166 Michael Speck
167 Construction Time
168 Bricks:
169 ..............
170 ..............
171 ..............
172 ..!..!kk!..!..
173 .....*kk*.....
174 .gggggggggggg.
175 .ffhhhhhhhhff.
176 .*fh*dddd*hf*.
177 .@!h@!ee!@h!@.
178 .@!h@!ee!@h!@.
179 .*fh*dddd*hf*.
180 .ffhhhhhhhhff.
181 .gggggggggggg.
182 .....*kk*.....
183 ..!..!kk!..!..
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..b..c..+..0+.
191 .0.0...3.3....
192 ..s........0..
193 ..............
194 ..............
195 .....4..4.>...
196 ..w..b.m...p..
197 ..p...g.b..w..
198 .....4..4.....
199 ..............
200 ..............
201 ..0>.......s..
202 ....3.3...0.0.
203 .+0..+..b..c..
204 ..............
205 ..............
206 Level:
207 Michael Speck
208 Four Seasons
209 Bricks:
210 ..............
211 ..............
212 hhhh......eeee
213 hhhh......eeee
214 hhhh......eeee
215 hhhh......eeee
216 hhhh......eeee
217 hhhh......eeee
218 ..............
219 ..............
220 ffff......jjjj
221 ffff......jjjj
222 ffff......jjjj
223 ffff......jjjj
224 ffff......jjjj
225 ffff......jjjj
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 +..b.......2.4
232 3.s.......4{..
233 .3.2......f.*.
234 ?.-........b.?
235 ...}......c.3.
236 .p........2pjb
237 ..............
238 ..............
239 bjp2........p.
240 .3.d......}...
241 ?.b........-.?
242 .*.f......2.3.
243 ..{4.......s.3
244 4.2.......b..+
245 ..............
246 ..............
247 Level:
248 Michael Speck
249 Hidden Obstacles
250 Bricks:
251 ..............
252 ..............
253 ..............
254 ..............
255 .v#eeeeeeee#v.
256 ..e#......#e..
257 ..eg#vvvv#ge..
258 ..egf....fge..
259 ..egf.dd.fge..
260 ..egf.dd.fge..
261 ..egf....fge..
262 ..eg#vvvv#ge..
263 ..e#......#e..
264 .v#eeeeeeee#v.
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ...00000000...
275 ..............
276 .....4444.....
277 ..+?......?b..
278 ...?b.pp.-?...
279 ...?-.pp.b?...
280 ..b?......?+..
281 .....4444.....
282 ..............
283 ...00000000...
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Michael Speck
290 Oh, Deer!
291 Bricks:
292 ..............
293 ..............
294 .d..e....e..d.
295 .e..d....d..e.
296 .#..#....#..#.
297 .a..i....i..a.
298 .g..a....a..g.
299 .a..i....i..a.
300 .g..a....a..g.
301 .a..i....i..a.
302 .g..a....a..g.
303 .a..i....i..a.
304 .g..a....a..g.
305 .#..#....#..#.
306 .h..d....d..h.
307 .d..h....h..d.
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 .p..p....p..p.
314 .p..p....p..p.
315 ..............
316 ....5....5....
317 .4..........4.
318 ....5....5....
319 .4..b....b..j.
320 ....5....5....
321 .j..b....b..4.
322 ....5....5....
323 .4..........4.
324 ..............
325 .p..p....p..p.
326 .p..p....p..p.
327 ..............
328 ..............
329 Level:
330 Michael Speck
331 Pipes
332 Bricks:
333 ..............
334 ..............
335 .j..!..!..###.
336 .j..#dd#..#gg.
337 .jj.#dd#..#g..
338 .jj.####......
339 .##...........
340 .f#*.###.*.##.
341 .f#!.!.!.!.#e.
342 .f#.!.!.!.!#e.
343 .##.*.###.*#e.
344 ...........##.
345 ......####.jj.
346 ..g#..#hh#.jj.
347 .gg#..#hh#..j.
348 .###..!..!..j.
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..............
354 .f............
355 .3....b....*>.
356 ..f..+.....d..
357 ..3...........
358 ..............
359 .3............
360 .5..?2?2?2?.3.
361 .3.?2?2?2?..5.
362 ............3.
363 ..............
364 ...........3..
365 ..c.....+..f..
366 .>*....b....3.
367 ............f.
368 ..............
369 ..............
370 Level:
371 Michael Speck
372 Collect Your Reward!
373 Bricks:
374 ..............
375 ..............
376 .x..........x.
377 ..............
378 ...z.z..z.z...
379 ..............
380 .x..........x.
381 ...z.z..z.z...
382 ..............
383 ..............
384 ...z.z..z.z...
385 .x..........x.
386 ..............
387 ...z.z..z.z...
388 ..............
389 .x..........x.
390 ..............
391 ..............
392 Bonus:
393 ..............
394 ..............
395 .b..........b.
396 ..............
397 ...5.5..5.5...
398 ..............
399 .b..........b.
400 ...5.5..5.5...
401 ..............
402 ..............
403 ...5.5..5.5...
404 .b..........b.
405 ..............
406 ...5.5..5.5...
407 ..............
408 .b..........b.
409 ..............
410 ..............
0 Level:
1 warbird-at-aaahawk.com
2 Free-Software-foundation
3 Bricks:
4 EEE*!*!*!*!*!*
5 E!*!*!*!*!*!*!
6 E*!*!*!*!*!*!*
7 EE*!*!*!*!*!*!
8 E*!*!*!*!*!*!*
9 E!*!*EEE*!*!*!
10 E*!*!E!*!*!*!*
11 E!*!*E*!*!*!*!
12 E*!*!E!*!*!EEE
13 *!*!*EEE*!*E*!
14 !*!*!*!E!*!E!*
15 *!*!*!*E*!*E*!
16 !*!*!*!E!*!EE*
17 *!*!*EEE*!*E*!
18 !*!*!*!*!*!E!*
19 *!*!*!*!*!*E*!
20 !*!*!*!*!*!E!*
21 *!*!*!*!*!*E*!
22 Bonus:
23 ..............
24 ..............
25 ........g.....
26 .............g
27 ..g...........
28 ..............
29 ....g.........
30 .............g
31 ..............
32 ..............
33 ..g.....g.....
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 b}b}b}b}b}b.b}
40 gwgwgwgwgwgwgw
41 Level:
42 warbird-at-aaahawk.com
43 SuSE
44 Bricks:
45 ..............
46 ......fff.....
47 .....fffff....
48 ....ffffffff..
49 ...ffffffffff.
50 ..ffffffffffzf
51 .ffffffffff@ff
52 ffffffffffff@@
53 fffffffffffff.
54 f...fffffff...
55 f.f..ff..ff...
56 f..f.ff..ff...
57 f..f.ff..ff...
58 .ff.EEEEEEEE..
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ......2.......
66 ......&.>.....
67 .........j<...
68 ...W.b2.{..b..
69 .......+....5.
70 ..2w<.....2..m
71 .>....lc.2p...
72 .....g...&.~..
73 ....?}.sW.>...
74 ......+.......
75 >....b...2<...
76 ...~.55..5!...
77 ..f...........
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 warbird-at-aaahawk.com
84 Gentoo
85 Bricks:
86 ......j.......
87 .....jjj......
88 ....jjjjj.....
89 ...jjjjjjj....
90 ...jjjjjjj....
91 ..jjjjEjjjj...
92 ..jjjEEEjjj...
93 ..jjjjEjjjj...
94 ...jjjjjjjj...
95 ....jjjjjjj...
96 ......jjjjj...
97 .....jjjjj....
98 ....jjjjj.....
99 ....jjjj......
100 ...jjjj.......
101 ..jjjj........
102 ..jjj.........
103 ..jj..........
104 Bonus:
105 ......l.......
106 .....d........
107 .....f........
108 ..............
109 ......3pm.....
110 .....5.5......
111 ..?.3...3.?...
112 .....5.5......
113 ......3.......
114 ....b...&.....
115 ......c...d...
116 ..............
117 .....!.j-.....
118 ..............
119 ......{.......
120 .....+........
121 ..............
122 ...g..........
123 Level:
124 warbird-at-aaahawk.com
125 Slackware1
126 Bricks:
127 cc...cc....c..
128 c.....c....c.c
129 cc.c.cc.cc.cc.
130 .c.c.cc.c..cc.
131 cc.c....c..c.c
132 ...cc...cc.c.c
133 ..............
134 .c.c.c........
135 .c.c.c........
136 ..c.c.........
137 ..c.c.cc......
138 EE.E.E.c......
139 ......cc.cc...
140 ......cc.c..cc
141 .........c..cc
142 .........c..c.
143 ............cc
144 .........E..EE
145 Bonus:
146 55...55....5..
147 .............*
148 ...l........&.
149 ............?.
150 +.......c.....
151 ...?..........
152 ..............
153 .}.+.>........
154 ..............
155 ..p.+.........
156 ..............
157 ..............
158 ......g{..?...
159 ......-.....-.
160 .........-....
161 .........f..!.
162 .............m
163 ..............
164 Level:
165 warbird-at-aaahawk.com
166 debian
167 Bricks:
168 ..............
169 ......dd......
170 .....dddd.....
171 ....dd##dd....
172 ...dd###dd....
173 ...d#####dd...
174 ..dd##d###d...
175 ..dd#ddd##d...
176 ..d##d#d##d...
177 ..d##d###dd...
178 ..d##dd##dd...
179 ..dd##dddd....
180 ..dd###dd.....
181 ...dd###......
182 ...ddd##......
183 ....ddd#......
184 .....ddd......
185 ......dd......
186 Bonus:
187 ..............
188 ......11......
189 .....1111.....
190 ....11..12....
191 ...11...22....
192 ...1.....22...
193 ..11..5...2...
194 ..01.55l..2...
195 ..0..5.l..2...
196 ..0..d...32...
197 ..0..44..33...
198 ..00..m333....
199 ..00...33.....
200 ...00.........
201 ...000........
202 ....000.......
203 .....000......
204 ......0w......
205 Level:
206 warbird-at-aaahawk.com
207 Mandrake1
208 Bricks:
209 ......aa......
210 .....aaaa.....
211 ....aaaaaa....
212 ...aajaajaa...
213 ...ajEjjEja...
214 ...ajjjjjja...
215 ...aeeeeeea...
216 ...aaeeeeaa...
217 ....aeeeea....
218 .....aeea.....
219 .....aaaa.....
220 ....aaaaaa....
221 ....aajjaa....
222 ...aajjjjaa...
223 ...ajjjjjja...
224 ..aajjjjjjaa..
225 ..ajjjjjjjja..
226 ..ajjjjjjjja..
227 Bonus:
228 ..............
229 ......<.......
230 .........>....
231 .....l..m.s...
232 ....?.??.?....
233 ..........-...
234 ...>445544p...
235 .........~....
236 ..............
237 ......j.......
238 .....Wb&+.....
239 ....s.........
240 .....-........
241 ........w.....
242 ......+...j...
243 ..............
244 ....-..s.+b...
245 ..fb.<.....c..
246 Level:
247 warbird-at-aaahawk.com
248 Mandrake2
249 Bricks:
250 ........h.....
251 ........h.....
252 .......hhh....
253 .......hhh..@.
254 ...b..hhhhh..@
255 ..bbhhhhhhhhh.
256 .bb..hhhhhhh.@
257 .b.....hhh..@.
258 bb....hhhhh...
259 bb....hhhhh...
260 Eb...hhh.hhh..
261 .b...hh...hh..
262 .bb..h.bb..h..
263 .Eb....bb.....
264 ..bb..bb......
265 ..Ebbbb.......
266 ....EE........
267 ..............
268 Bonus:
269 ........1.....
270 ........1.....
271 .......5?5....
272 .......555....
273 ...c..!...s...
274 ....111111111.
275 .+...?.2.2d?..
276 .......2s2....
277 s.....12j21...
278 ......12p21...
279 .....112.211..
280 .....11...11..
281 .f...1.+~..1..
282 ..-.....>.....
283 ..d{..f-......
284 ...&>db.......
285 ..............
286 ..............
287 Level:
288 warbird-at-aaahawk.com
289 Caldera
290 Bricks:
291 ......**.....@
292 @....***g....@
293 @...***ggg...@
294 @..***ggggg..@
295 @..**gggggg..@
296 @.**gggggggg.@
297 @.**gggggggg.@
298 @***ggggggggg@
299 @**gggggggggg@
300 @**gggggggggg@
301 @***ggggggggg@
302 @.**gggggggg.@
303 @.**gggggggg.@
304 @..**gggggg..@
305 @..***ggggg..@
306 @...***ggg...@
307 @....***g....@
308 @.....**.....@
309 Bonus:
310 ......44......
311 .....4..5.....
312 ....4..d......
313 ...4..5j......
314 ...4.>...<....
315 ..4.5.?...+...
316 ..4.c-..g.....
317 .4..5..~......
318 .4.?>......?..
319 .4.l>-.*.~....
320 .4..W.+.......
321 ..4.5.....d...
322 ..4.>-..?.....
323 ...4.5&.......
324 ...4..f&......
325 ....4..5~.....
326 .....4..{.....
327 ......44......
328 Level:
329 warbird-at-aaahawk.com
330 Red Hat
331 Bricks:
332 .....aaaa.....
333 ....aaaaaa....
334 ...aadddEaa...
335 ..aadddddaaa..
336 .aaadddddEaaa.
337 .aa##dddddaaa.
338 aad#ddddddaaaa
339 add####dddddaa
340 adddddddddddaa
341 aaajjddddddaaa
342 aaaajjjjjjaaaa
343 aaaajjjjjjaaaa
344 .aaaajjEjaaaa.
345 .ajjjjjjjajja.
346 .ajjjjjjjjjjj.
347 ..jjjjjjjjjj..
348 ...jjjjjjjj...
349 .....jjjj.....
350 Bonus:
351 ..............
352 ......f.3.....
353 ....3.........
354 .....5...3....
355 .w............
356 ...55....~....
357 ...5lm....d.5.
358 .?.5555?.....?
359 ....s....W....
360 b............w
361 ..5...........
362 ...>!..j......
363 ......f.......
364 .......>......
365 ...d......5.~.
366 ......s.......
367 ...b......b...
368 .....w..<.....
369 Level:
370 warbird-at-aaahawk.com
371 Slackware2
372 Bricks:
373 ......bbb.....
374 .....bbbbb....
375 ....bEEEEEb...
376 ...bEEEEEEbb..
377 ...bEbbbbEbb..
378 ..bbEbbbbbbbb.
379 ..bbEbbbbbbbb.
380 .bbbEEEEEbbbbb
381 .bbbbEEEEbbbbb
382 .bbbbbbbbEbbbb
383 .bbbbbbbbEbbbb
384 ..bbbbbbbEbbb.
385 ..b@EbbbbEbbb.
386 ...@EEEEEbbb..
387 ...@zEEEEzbb..
388 ...@@@@@@@@...
389 .....bbbbb....
390 ......bbb.....
391 Bonus:
392 ......ddd.....
393 .....?>l>?....
394 ..............
395 ...*.......*..
396 .....55.......
397 .....55.f.....
398 .....5m.......
399 ..............
400 .{c.........c{
401 .&.....}5....&
402 .+......5....+
403 ..g...f}5.f...
404 ..+3....5...-.
405 ...3..........
406 ...35....4.+..
407 ...33333333...
408 .....b>p<b....
409 ......mwm.....
410 Level:
411 warbird-at-aaahawk.com
412 Lindows
413 Bricks:
414 ....yy.......@
415 @...yy........
416 ....yy.......@
417 @...yy........
418 ....yy.......@
419 @...yy........
420 ...gg........@
421 @..gg.........
422 ...gg........@
423 @...yy........
424 ....yy.......@
425 @...yy........
426 ....yy.......@
427 @...yy........
428 ....yy.......@
429 @...yyyyy.....
430 ....yyyyy....@
431 @...yyyyy.....
432 Bonus:
433 ....22........
434 ....22........
435 ....22........
436 ....22........
437 ....22........
438 ....22........
439 ...bw.........
440 ...wm.........
441 ...bw.........
442 ....22........
443 ....22........
444 ....22........
445 ....22........
446 ....22........
447 ....22........
448 ....22222.....
449 ....22222.....
450 ....2>>>2.....
451 Level:
452 warbird-at-aaahawk.com
453 Ximian
454 Bricks:
455 ......xx......
456 .....xhhx.....
457 ....xhhhhx....
458 ...xhhhahhx...
459 ..xhhahhahhx..
460 .xhhahhhhahhx.
461 .xhahhaaaahhx.
462 xhhahaaaaaaahx
463 xhhhaaaaaaaahx
464 xhhhhahhahaahx
465 xhhhahahahhhhx
466 .xhahhahhahhx.
467 .xahhahhhhahx.
468 ..xhahhhhhhx..
469 ...xhhhhhhx...
470 ....xhhhhx....
471 .....xhhx.....
472 ......xx......
473 Bonus:
474 ......mw......
475 ..............
476 ..............
477 ......&4.+....
478 .....g..4..b..
479 .b..4.-!d4....
480 ...4..4444....
481 ...4.444445l..
482 .-..44444455..
483 .*.s.4.j4!55..
484 {...4.4.4.-+..
485 ...4..4~.4....
486 ..4.pc....4...
487 ....4....&....
488 ..............
489 .....>........
490 ......w<......
491 ..............
492 Level:
493 warbird-at-aaahawk.com
494 Use the Source
495 Bricks:
496 E.E##@@....ggg
497 E.E#.@.....g..
498 E.E##@@....gg.
499 EEE.#@.....g..
500 jjj##@@.##.ggg
501 j..EEE..#.hhh.
502 jjj.E@.@##h...
503 ..j.E@@@#.h...
504 jjj.E@.@##h...
505 ..fff@.@ddhhh.
506 ..f.f...d.d...
507 ..f.f...dd....
508 ..f.f...d.d...
509 ..fffe.ed.d...
510 .....e.e......
511 .....e.e......
512 .....e.e......
513 .....eee......
514 Bonus:
515 ...........555
516 ...........5..
517 ...........55.
518 ...........5..
519 555........555
520 5.........555.
521 555.......5...
522 ..5.......5...
523 555.......5...
524 ..555...55555.
525 ..5.5...5.5...
526 ..5.5...55....
527 ..5.5...5.5...
528 ..w555.55.w...
529 .....5.5......
530 .....5.5......
531 .....5.5......
532 .....bwb......
533 Level:
534 warbird-at-aaahawk.com
535 BSOD
536 Bricks:
537 vvggvvvggggg!*
538 vgvgvvvgggg!*!
539 vgvgvggggg!*!g
540 vvvgvvvgg!*!gg
541 vvggvvvg!*!ggg
542 vgvgggvg*!gggg
543 vgvgvvvggggggg
544 vvvgvvvggggggg
545 gggggggggggggg
546 gggggggggggggg
547 gggggggvvvgvvg
548 gggg!*gvgvgvgv
549 ggg!*!gvgvgvgv
550 gg!*!ggvgvgvgv
551 g!*!gggvgvgvgv
552 !*!ggggvgvgvgv
553 *!gggggvvvgvvg
554 gggggggggggggg
555 Bonus:
556 55<.555-...m..
557 5?5+555.......
558 5?5.5Wc......j
559 55?w555.......
560 55p.555.......
561 5?5.??5f......
562 5?5.555.g..+..
563 555.555......}
564 ...d..??..w-..
565 .+....??......
566 ....jg.555!55<
567 .{.....5c5.5p5
568 ......>5?5.5?5
569 w......5?5.5?5
570 .......5?5.5?5
571 ....-..5?5+5?5
572 ......<555.55s
573 .............w
574 Level:
575 warbird-at-aaahawk.com
576 USA-fireworks
577 Bricks:
578 ..!!!!!ddddd..
579 ..!!!!!ggggg..
580 ..!!!!!ddddd..
581 ..!!!!!ggggg..
582 ..!!!!!ddddd..
583 ..!!!!!ggggg..
584 ..dddddddddd..
585 ..gggggggggg..
586 ..dddddddddd..
587 ..gggggggggg..
588 ..dddddddddd..
589 ..gggggggggg..
590 ..dddddddddd..
591 c..c.cccc..cc.
592 c..c.c....c..c
593 c..c.cccc.cccc
594 c..c....c.c..c
595 cccc.cccc.c..c
596 Bonus:
597 ..j555j44444..
598 ..5555533333..
599 ..5555544444..
600 ..55j5533333..
601 ..5555544444..
602 ..j555j33333..
603 ..4444444444..
604 ..3333333333..
605 ..4444444444..
606 ..3333333333..
607 ..4444444444..
608 ..3333333333..
609 ..4444444444..
610 *..*.*jj*..**.
611 w..w.w....w..w
612 >..>.>}}>.>bb>
613 j..j....}.j..j
614 wbbw.wbbw.w..w
0 Level:
1 PabelO
2 Bombs Of Norway
3 Bricks:
4 !!!!!!!!!!!i*E
5 !***jgj***!*E*
6 !***jgj***!i*E
7 !***jgj***!*E*
8 !***jgj***!i*E
9 !jjjjgjjjj!*E*
10 !ggggggggg!i*E
11 !ggggggggg!*E*
12 !jjjjgjjjj!i*E
13 !***jgj***!*E*
14 !***jgj***!i*E
15 !***jgj***!*E*
16 !***jgj***!i*E
17 !!!!!!!!!!!*E*
18 *i*i*i*i*i*i*E
19 i*i*i*i*i*i*E*
20 *i*i*i*i*i*i*E
21 ..............
22 Bonus:
23 ???????????...
24 ?5555*&????...
25 ?5555*&????...
26 ?5555*&????...
27 ?5555*&????...
28 ?5555*&&&&?...
29 ?5555*****?...
30 ?5555+mmmm?...
31 ?5555+pppp?...
32 ?5555+pppp?...
33 w5555+p+++w...
34 w5555bbbbbw...
35 wbbbbbbbbbw...
36 wlwlllllllw...
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 PabelO
43 Not That Easy
44 Bricks:
45 gggg......gggg
46 gggg......gggg
47 gggg......gggg
48 gggg......gggg
49 gggg......gggg
50 gggg......gggg
51 gggg......gggg
52 ggggvvvvvvgggg
53 ggggjjjjjjgggg
54 ggggjjjjjjgggg
55 ggggjjjjjjgggg
56 gggvjjjjjjvggg
57 ggvv......vvgg
58 vvvv......vvvv
59 ....vvvvvv....
60 ..............
61 ..............
62 ..............
63 Bonus:
64 &***......****
65 &pp>......jjjj
66 &pp>..........
67 &pp>......!!!!
68 &pp>..........
69 &..>......pppp
70 &..>..........
71 &ff>ffffff....
72 &.!>......!!!!
73 &.!>..........
74 &.!.......gggg
75 &.!mdddddd~ggg
76 &.mm......~~gg
77 wwww......bbbb
78 ....444444....
79 ..............
80 ..............
81 ..............
82 Level:
83 PabelO
84 Only 4 Fun
85 Bricks:
86 hhhhhhhhhhhhhh
87 jhhhhhhhhhhhhj
88 jjhhhhhhhhhhjj
89 jjjhhhhhhhhjjj
90 jjjjhhhhhhjjjj
91 jjjjjhhhhjjjjj
92 jjjjjjhhjjjjjj
93 jjjjjjddjjjjjj
94 jjjjjddddjjjjj
95 jjjjddddddjjjj
96 jjjddddddddjjj
97 jjddddddddddjj
98 jddddddddddddj
99 dddddddddddddd
100 ..............
101 ..............
102 ..............
103 ..............
104 Bonus:
105 ..............
106 5............5
107 55..........m5
108 555........m!!
109 gggg......jjjj
110 gggg?....?cccc
111 ppppp?..?&&ccc
112 ??????..++++++
113 bbbb?....?bbbb
114 bbbb......bbbb
115 www........www
116 ww..........ww
117 w............w
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 PabelO
125 The Bomb Level
126 Bricks:
127 fff*ffff*fffff
128 fff*ffff*fffff
129 fff*ffff*fffff
130 ****ffff******
131 @@@@@fff@@@@@@
132 #####*f*######
133 gggg#*f*#ggggg
134 gffg#fff#gfffg
135 g**g#fffEgf*fg
136 gffg#*f*#gf*fg
137 gffg#*f*#gf*fg
138 gffg#*f*#gfffg
139 gffg#*f*#gg*gg
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ???5....5?????
147 ???5....5?????
148 ???5mmmm5?????
149 ~~~5....55~~~~
150 ..............
151 .....fff......
152 ..&..fff..&&..
153 b....fff..???.
154 b....fff..p...
155 b??..fff..p...
156 .??.......p...
157 .??.......pp..
158 .??...........
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 PabelO
166
167 Bricks:
168 ffffffffffffff
169 fg@g@g@g@g@g@f
170 fggggggggggggf
171 fgbbbbbbbbbbgf
172 fgb********bgf
173 fgb********bgf
174 fgb********bgf
175 fgb********bgf
176 fgbbbbbbbbbbgf
177 fg@@@@@@@@@@gf
178 fghhhhhhhhhhgf
179 fg!!!!!!!!!!gf
180 fgvvv!!!!vvvgf
181 fggggggggggggf
182 fg@gggggggg@gf
183 f@@@gggggg@@@f
184 ffffffffffffff
185 ..............
186 Bonus:
187 b.<<<<<<<<<..b
188 .b...........b
189 ..bbbbbbbbbbb.
190 ..............
191 ...55555555...
192 ...55555555...
193 ...55555555...
194 ...55555555..~
195 .+..........+~
196 .+..........+~
197 .+..........+~
198 .+ddd<<<<...+~
199 .+ddd<<<<ddd+~
200 .+..........+.
201 .+.pppppppp.+~
202 ....jjjjjj...~
203 bwwwllllllwwwb
204 ..............
205 Level:
206 PabelO
207
208 Bricks:
209 hhhhhhhhhhhhhh
210 hggggggggggggh
211 hgffffffffffgh
212 hgfiiiiiiiifgh
213 hgfijjjjjjifgh
214 hgfijkkkkjifgh
215 hgfijk**kjifgh
216 hgfijk**kjifgh
217 hgfijk**kjifgh
218 hgfijk**kjifgh
219 hgfijk**kjifgh
220 hgfijk**kjifgh
221 hgfijkkkkjifgh
222 hgfijjjjjjifgh
223 hgfiiiiiiiifgh
224 hgffffffffffgh
225 hggggggggggggh
226 hhhhhhhhhhhhhh
227 Bonus:
228 ...&&&.&&&&&&.
229 !....???????.j
230 dp...????22?gj
231 dpwwwwww????gj
232 dp.w2222222.gj
233 dp.w>...222cgj
234 dp.w>...222cgj
235 dp~w>>d.222c.j
236 !p~w>>d.222cgj
237 +p~w>>d.222cgj
238 +p~w>>d.222cgj
239 +.~w>>d..22c.j
240 +.~.>>...22cgj
241 +.~......22cgj
242 +.~ffffff....j
243 +.~~~~~~~~~~.j
244 +.....ssssssss
245 wwbbbbwwwwwwww
246 Level:
247 PabelO
248 The Cool One
249 Bricks:
250 **************
251 *jjjj*dddd*ee*
252 *jjjj*dddd*ee*
253 *jjjj*dddd*ee*
254 *jjjj*dddd*ee*
255 *jjjj*dddd*ee*
256 **************
257 ffffffffffffff
258 ffffffffffffff
259 ffffffffffffff
260 ffffffffffffff
261 ffffffffffffff
262 ffffffffffffff
263 f#f#f#f#ff#ff#
264 f*f*f*f*f*f*f*
265 f*f*f*f*f*f*f*
266 ..............
267 ..............
268 Bonus:
269 .....d.....~.+
270 mmmm..d<<<.~.+
271 .w.<.<.d..<~.+
272 ..<w...d..<.~+
273 bbpb......<b~+
274 ..p.bb....bb.+
275 ..p..bbbbbbbbb
276 bbpb..bbb.....
277 b..pbbbbmbbbb.
278 b.b.pp..mmm..+
279 .b.mmmpp..mm++
280 b.m..mm.pp..mm
281 .w.w.bmm..pp..
282 WWWWwWwWWwWWwW
283 W..ff...<<<<..
284 fff.+++++.....
285 ..............
286 ..............
287 Level:
288 PabelO
289 RIP ELVIS
290 Bricks:
291 .ff....f...ff.
292 .f.f...f...f.f
293 .ff....f...f.f
294 .f.f...f...ff.
295 .f.f...f...f..
296 .g..gg.ggg.ggg
297 gg.g.g...g...g
298 .g.g.g...g...g
299 .g.g.g..g...g.
300 .g..gg..g...g.
301 .g...g..g...g.
302 .g...g.g...g..
303 .g...g.g...g..
304 hh.h.h...hhhhh
305 h..h.hh.hhhh..
306 hh.h..h.h.hhhh
307 h..h..h.h.h..h
308 hh.hh..h..hhhh
309 Bonus:
310 .55....5...55.
311 .5.5...5...5.5
312 .55....5...5.5
313 .5.5...5...55.
314 .5.5...5...5..
315 .5..55.555.555
316 55.5.5...5...5
317 .5.5.5...5...5
318 .5.5.5..5...5.
319 .5..55..5...5.
320 .5...5..5...5.
321 .5...5.5...5..
322 .5...5.5...5..
323 55.5.5...55555
324 5..5.55.5555..
325 55.5..5.5.5555
326 5..5..5.5.5..5
327 55.55..5..5555
328 Level:
329 PabelO
330 The Dark One
331 Bricks:
332 gggggggggggggg
333 gggggggggggggg
334 gggggggggggggg
335 gggggggggggggg
336 gggggggggggggg
337 gggggggggggggg
338 gggggggggggggg
339 gggggggggggggg
340 gggggggggggggg
341 gggggggggggggg
342 gggggggggggggg
343 gggggggggggggg
344 gggggggggggggg
345 gggggggggggggg
346 gggggggggggggg
347 **************
348 ..............
349 ..............
350 Bonus:
351 bbbbbbbbbbbbbb
352 bbbbbbbbbbbbbb
353 bbbbbbbbbbbbbb
354 bbbbbbbbbbbbbb
355 bbbbbbbbbbbbbb
356 bbbbbbbbbbbbbb
357 bbbbbbbbbbbbbb
358 bbbbbbbbbbbbbb
359 bbbbbmmmmmbbbb
360 bbbbbbbbbbbbbb
361 bbbbbbbbbbbbbb
362 bbbbb+++++bbbb
363 bb>>>>>>>>bbbb
364 dddddddddddddd
365 dddddddddddddd
366 wwwwwwwwwwwwww
367 ..............
368 ..............
369 Level:
370 Pabelo
371 The Hard One
372 Bricks:
373 iiiiivvvviiiii
374 iiiiivvvviiiii
375 iiiiivvvviiiii
376 iiiiivvvviiiii
377 iiiiivvvviiiii
378 iiiiivvvviiiii
379 @@@@@vvvv@@@@@
380 hhhhhhhhhhhhhh
381 hhhhhhhhhhhhhh
382 hhhhhhhhhhhhhh
383 hhhhhhhhhhhhhh
384 gggggggggggggg
385 gggggggggggggg
386 gggggggggggggg
387 ffffffffffffff
388 ffffffffffffff
389 ffffffffffffff
390 ffffffffffffff
391 Bonus:
392 d.dff....>>>>>
393 .?ffs....>WW.>
394 .?--s....>.W.>
395 .?-.s....>.WW>
396 d?.ds....>.ff>
397 .?fff....>ff.>
398 ..............
399 ?ff....f.WWW..
400 ?...ss.WW-..d~
401 ?..pd.~..-sp.~
402 ?WWWW.~.d-s..~
403 ?.....~..-s..~
404 ?bd..d...-s..~
405 ?..d..b..-sp.~
406 ?.d.......s..?
407 ?b...p..b.s..?
408 ?..l.ld..ps.b?
409 ?...d..d?ds???
410
411
0 Version: 0.40
1 Level:
2 Paweusz
3 Don't be greedy
4 Bricks:
5 ..............
6 ..............
7 .EEEEEEEEEEEE.
8 .E**********E.
9 .E*EEEEEEEE*E.
10 .E*E******E*E.
11 .E*E*EEEE*E*E.
12 .E*E*E**E*E*E.
13 .E*E*E**E*E*E.
14 .E*E*EE*E*E*E.
15 .E*E****E*E*E.
16 .E*EEEEEE*E*E.
17 .E********E*E.
18 .EEEEEEEEEE*E.
19 ************E.
20 EEEEEEEEEEEEE.
21 fff...........
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ......00......
32 ......55......
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Paweusz
44 A Fortel
45 Bricks:
46 ..............
47 ..hhhhhhhhhh..
48 ..hggggggggh..
49 ..hgffffffgh..
50 ..hgfjjjjfgh..
51 ..hgffffffgh..
52 ..hggggggggh..
53 ..hhhhhhhhhh..
54 ..bbbbbbbbbb..
55 @@@@@@@@@@@@@@
56 kk.@......@.kk
57 @@.@......@.@@
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ......~....?..
67 ..........c?..
68 ...>.......?..
69 .....m.....?..
70 ........m..?..
71 ...+.......?..
72 ..-......f.?..
73 ...........?..
74 ....llgll.....
75 m5..........5m
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Paweusz
85 The Patience
86 Bricks:
87 ......@.......
88 ...@.........@
89 ....@.@.@.@@.*
90 .@...i...i....
91 *...@.@.@.@...
92 ..............
93 ....@.@.@.@...
94 @....i...i....
95 ....@.@.@.@.@.
96 ..............
97 ..@...........
98 *....@..@.@.*@
99 .@....@.......
100 ...@..........
101 ............@.
102 .....@.@..@...
103 @.............
104 ...@...@.@..@.
105 Bonus:
106 ..............
107 ..............
108 .............3
109 .....2...m....
110 b.............
111 ..............
112 ..............
113 .....0...1....
114 ..............
115 ..............
116 ..............
117 w...........l.
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Paweusz
126 Have a nice day :)
127 Bricks:
128 cafij.*..jifac
129 afij......jifa
130 fijjjjjjjj.jif
131 ijjjEE#EEjj.ji
132 jjjEjjjjjEjj.j
133 .jEjjjjjjjEj..
134 hjEjj#j#jjEj.g
135 gjEjjjjjjjEj.h
136 hjEjjjjjjjEj.g
137 g*Ejjj#jjjEj*h
138 hjEjjjjjjjEj.g
139 gjEj#jjj#jEj.h
140 hjEj#jjj#jEj.g
141 gjEjj###jjEj.h
142 .jjEjjjjjEjj..
143 ..jjEE#EEjj...
144 ..ffffffffff..
145 hghghg.hghghgh
146 Bonus:
147 5..-..m......5
148 ...........3..
149 4lw...........
150 ..........~...
151 .>...!........
152 ..............
153 ..............
154 ?..........>..
155 ...Wf...f....1
156 .m....5.....m.
157 s............s
158 ..............
159 ..............
160 .......?......
161 ..............
162 .........-....
163 ..<........+..
164 W.............
165 Level:
166 Paweusz
167 Can't see me ?
168 Bricks:
169 vE...........v
170 ..............
171 ..............
172 ..............
173 E.......v.....
174 ........E.....
175 ..............
176 ............E.
177 .E............
178 ....v.........
179 ..............
180 ..............
181 ..........v...
182 v....E........
183 ..............
184 ..............
185 .......E....E.
186 .......v......
187 Bonus:
188 5............4
189 ..............
190 ..............
191 ..............
192 ........4.....
193 ..............
194 ..............
195 ..............
196 ..............
197 ....4.........
198 ..............
199 ..............
200 ..........4...
201 4.............
202 ..............
203 ..............
204 ..............
205 .......4......
206 Level:
207 Paweusz
208 It's full of stars!
209 Bricks:
210 **************
211 **************
212 **************
213 **************
214 **************
215 **************
216 **************
217 **************
218 **************
219 **************
220 **************
221 **************
222 **************
223 ......#.......
224 ..............
225 ######.#######
226 ..............
227 ..............
228 Bonus:
229 55555555555555
230 jjjjjjjjjjjjjj
231 jjjjjjjjjjjjjj
232 jjjjjjjjjjjjjj
233 jjjjjjjjjjjjjj
234 jjjjjjjjjjjjjj
235 jjjjjjjjjjjjjj
236 jjjjjjjjjjjjjj
237 jjjjjjjjjjjjjj
238 jjjjjjjjjjjjjj
239 jjjjjjjjjjjjjj
240 jjjjjjjjjjjjjj
241 jjjjjjjjjjjjjj
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Paweusz
249 High durability
250 Bricks:
251 ..............
252 .!..@.@@.@..!.
253 ...@......@...
254 @@..........@.
255 @............@
256 @.zzzzzzzzzz.@
257 @.zzzzzzzzzz.@
258 @.zzzzzzzzzz.@
259 @.zzzzjjzzzz.@
260 @.zzzzjjzzzz.@
261 @.zzzzjjzzzz.@
262 @.zzzzzzzzzz.@
263 @.zzzzzzzzzz.@
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ps...........p
272 ..............
273 ............l.
274 ..............
275 ..*........*..
276 ....>..w.f....
277 ..............
278 ....1.33......
279 ..f...&&..-...
280 ......&&......
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Paweusz
290 The Precision
291 Bricks:
292 #a#g#i#fEjEbEc
293 #a#g#i#fEjEbEc
294 #a#g#i#fEjEbEc
295 #a#g#i#fEjEbEc
296 #a#g#i#fEjEbEc
297 #a#g#i#fEjEbEc
298 #a#g#i#fEjEbEc
299 #a#g#i#fEjEbEc
300 #a#g#i#fEjEbEc
301 #a#g#i#fEjEbEc
302 #a#g#i#fEjEbEc
303 #a#g#i#fEjEbEc
304 ..............
305 ..............
306 zzzzzzzzzzzzzz
307 jjjjjjjjjjjjjj
308 ..............
309 ..............
310 Bonus:
311 .............4
312 .....l.....2..
313 .0.......0...0
314 ...2...1......
315 ..............
316 .?...1...m.>..
317 ..............
318 .-............
319 ...?...2.1.+..
320 .1............
321 ...........1..
322 .....0...c...2
323 ..............
324 ..............
325 ...>......g..~
326 c...+...?.....
327 ..............
328 ..............
329 Level:
330 Paweusz
331 Hidden Treasure
332 Bricks:
333 ..............
334 ..............
335 !.!.!.!.!.!.!.
336 ..............
337 #............#
338 ##zzz....zzz##
339 ###*z....z*###
340 ####*z..z*####
341 iiiii*zz*fffff
342 iiiii*zz*fffff
343 ####*zvvz*####
344 ###*z.vv.z*###
345 ##zzz.vv.zzz##
346 #.....vv.....#
347 ......vv......
348 ......vv......
349 ......vv......
350 vvvvvvvvvvvvvv
351 Bonus:
352 ..............
353 ..............
354 ..?.....?.s...
355 .?....?.......
356 ..............
357 ..............
358 ..........?...
359 ..............
360 ..?>...f<..?p.
361 m.w..........m
362 ......g*......
363 ..............
364 ...W......~...
365 ......-?......
366 ..............
367 ......?.......
368 ..............
369 ....w..?......
370 Level:
371 Paweusz
372 In the Net
373 Bricks:
374 ..............
375 ..............
376 ..............
377 jjjjjjjjjjjjj.
378 jjjEEEEEEEjjj.
379 jj@jjjjjjj@jj.
380 jEjjjjjjjjjEj.
381 jEjjjEE*jjjEj.
382 jEjjE**EjjjEj.
383 jEjjE**EjjjEj.
384 jEjjE**EjjjEj.
385 jEjjE**EjjjEj.
386 jEjjjEEjEjEjj.
387 jEjjjjjjj@jjj.
388 jj@jjjjjjjjjj.
389 jjjEEEEEjjjjj.
390 jjjjjjjjjjjjj.
391 ..............
392 Bonus:
393 ..............
394 ..............
395 ..............
396 ???????????**.
397 ..p.......!.s.
398 ..............
399 w..fc*...*....
400 >.............
401 ..<..55...p...
402 ...c.55..c..~.
403 g.*..j5.&l....
404 ..c..00.......
405 .......c....*.
406 3..>..........
407 ..............
408 ..............
409 <.............
410 ..............
411 Level:
412 Paweusz
413 Arrow marks the spot
414 Bricks:
415 ##############
416 ..............
417 ..............
418 ..............
419 aaaaaaaaaaaaaa
420 aaaaaaaaaaaaaa
421 aaaaaaaaaaaaaa
422 ..............
423 ..............
424 zzzzzzzzzzxzzz
425 zzzzzzzzzzxxzz
426 zzzzzzxxxxxxxz
427 zzzzzzzzzzxxzz
428 zzzzzzzzzzxzzz
429 ..............
430 ..............
431 vvvvvvvvvvvvvv
432 vvvvvvvvvvvvvv
433 Bonus:
434 55555&555555l5
435 ..............
436 ..............
437 ..............
438 .2..21&2.+....
439 l..&.......2&.
440 ??????????????
441 ..............
442 ..............
443 .&..&.........
444 w.2....2..c...
445 .&...2.1j2...m
446 ...&.......+..
447 ......&.......
448 ..............
449 ..............
450 ..2...........
451 2...21..2..2..
452 Level:
453 Paweusz
454 Last but not least
455 Bricks:
456 **************
457 **************
458 **************
459 **************
460 **************
461 **************
462 *aaa**a*a*aaa*
463 *a**a*a*a*a***
464 *a**a*a*a*a***
465 *aaa***a**aaa*
466 *a**a**a**a***
467 *a**a**a**a***
468 *a**a**a**a***
469 *aaa***a**aaa*
470 **************
471 **************
472 **************
473 **************
474 Bonus:
475 ..............
476 55555555555555
477 55555555555555
478 55555555555555
479 55555555555555
480 55555555555555
481 55555555555555
482 55555555555555
483 55555555555555
484 55555555555555
485 55555555555555
486 55555555555555
487 55555555555555
488 55555555555555
489 55555555555555
490 55555555555555
491 55555555555555
492 55555555555555
0 Level:
1 pope1
2 ph33r
3 Bricks:
4 e...e...ee....
5 ..e.aa...eea.e
6 .eeeeeaaaeaae.
7 .ea.ee*ee.a.e.
8 aaeeee.aee.!ae
9 .e.ev###ae!..a
10 aa*!!.##.!..aa
11 aa...!*.!e*a*a
12 e.a.a*!e...a*e
13 e.a.*.!!.aea.e
14 .**a.!!aa.*.*.
15 ....!!!!!a!.*.
16 ...!.**.a..*..
17 ..!..**eeeeee.
18 .*...ee.a.....
19 ...eeeaa......
20 .e.e..........
21 ..............
22 Bonus:
23 ..............
24 ..............
25 .w............
26 ............m.
27 ..5p..........
28 ..b.>>>.>>mm..
29 .+b.>.>...m...
30 ..bbjjjj5j..5.
31 ..p..mwg.j....
32 ..p.jp>>>.....
33 ..wpwj.mm+mw..
34 ....gw...+pm..
35 ....m+.>www5..
36 ..b..+55m.....
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 pope1
43 ph33r
44 Bricks:
45 ..............
46 ..............
47 ..............
48 ..............
49 ...jjjjjjjj...
50 ..jggggggggj..
51 ..jgccccccgj..
52 ..jgcggggcgj..
53 ..jgcg**gcgj..
54 ..jgcg**gcgj..
55 ..jgcg**gcgj..
56 ..jgcg**gcgj..
57 ..jgcc**ccgj..
58 ..jggg**gggj..
59 ..jjddddddjj..
60 ...j......j...
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ....555555....
71 ....5gggg5....
72 ....5g..g5....
73 ....5g..g5....
74 ....5g..g5....
75 ....5gggg5....
76 ....555555....
77 ..............
78 ....mmmmmm....
79 ..............
80 ..............
81 ..............
82 Level:
83 pope1
84 ph33r
85 Bricks:
86 ..............
87 ....fffffff...
88 ....ffaaaff...
89 ....ffa*aff...
90 ....ffa*aff...
91 ....ffa*aff...
92 ....f*****f...
93 ....ffa*aff...
94 ....ffa*aff...
95 ....ffa*aff...
96 ....ffaaaff...
97 ....ffaaaff...
98 ....ffaaaff...
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 .......5......
111 ......555.....
112 .......5......
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 pope1
125 ph33r
126 Bricks:
127 ....cccccc....
128 ....!!!!!!....
129 ccccc....ccccc
130 c*c*c....c*c*c
131 ccccc.**.ccccc
132 *ccc*.**.*ccc*
133 ..............
134 ....######....
135 ....#....#....
136 ....#....#....
137 ....#.!..#....
138 ....#..!.#....
139 ....#....#....
140 ..............
141 iiiiiiiiiiiiii
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ....jjjjjj....
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ......w.......
157 .......w......
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 pope1
166 ph33r
167 Bricks:
168 ..............
169 ..............
170 ......**......
171 .....####.....
172 ....#....#....
173 ccc#.!..!.#...
174 c###.......#cc
175 c#....!!...##c
176 .#...!..!...#c
177 .#..!....!..#.
178 .#.!..cc..!.#.
179 .#!...cc...!#.
180 .#.!......!.#.
181 .#..!....!..#.
182 .#...!..!...#.
183 .#....!!....#.
184 ..#........#v.
185 ...........v..
186 Bonus:
187 ..............
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ............m.
194 ..............
195 ..............
196 ..............
197 ......55......
198 ......55......
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 Level:
206 pope1
207 ph33r
208 Bricks:
209 !!!!!a##a!!!!!
210 .!...####...!.
211 ..!...##.....!
212 .!....##....!.
213 !.....##...!..
214 jj**jj##jjj*jj
215 j*j*jj##jj*j*j
216 *jjj*j..j*jjj*
217 jjjjj*..*jjjjj
218 ccccc*..*ccccc
219 .....*..*.....
220 .....*..*.....
221 ..............
222 ..............
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 .....5..5.....
229 ..............
230 ..............
231 ..............
232 ..............
233 >>..>>..>>>.>>
234 >.-.>>..>>.-.>
235 .->-.>..>.->-.
236 ->>--....-->--
237 dddddd..dddddd
238 .....d..d.....
239 .....d..d.....
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 pope1
248 ph33r
249 Bricks:
250 !!!!!!!!!!!!h.
251 !!!!!!!!!!!h.#
252 !!!!!!!!!!h.#.
253 hhhhhhhhhh.#..
254 *.......*h#...
255 *.......h#....
256 h......h#.....
257 *h....h#......
258 *.h..h#.......
259 *.*hh*.#......
260 *.*hh*..#....#
261 *.h..h...#....
262 *h....h...#.#.
263 h......h...#..
264 ........h.....
265 ........*h....
266 hhhhhhhhhh....
267 ..............
268 Bonus:
269 5...5...5...m.
270 .5.5.5.5......
271 ..5...5.......
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 Level:
288 pope1
289 ph33r
290 Bricks:
291 !c...ccccc..c!
292 cc...ccccc..cc
293 .....ccccc....
294 .....c***c....
295 **************
296 *....c***c...*
297 *....ccccc...*
298 *....ccccc...*
299 *....ccccc...*
300 hhhhhggggghhhh
301 hhhhg.....ghhh
302 hhhg.......ghh
303 hhg.........gh
304 hg...........g
305 g............g
306 g............g
307 g............g
308 g............g
309 Bonus:
310 5............5
311 ..............
312 .....mmmmm....
313 .....m...m....
314 ..............
315 .....m...m....
316 .....mmmmm....
317 ..............
318 ..............
319 ..............
320 ..............
321 ..............
322 ..............
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 Level:
329 pope1
330 ph33r
331 Bricks:
332 *cccccccccccc*
333 c*bbbbbbbbbb*c
334 cb*aaaaaaaa*bc
335 cba********abc
336 cba*......*abc
337 cba**.....*abc
338 cba*.*...**abc
339 cba*.!!!!.*abc
340 cba*.!!!!.*abc
341 cba*.!!!!.*abc
342 cba*.!!!!.*abc
343 cba*.!!!!.*abc
344 cba*.*..*.*abc
345 cba**....**abc
346 cba*......*abc
347 cba*......*abc
348 cba*......*abc
349 cba*......*abc
350 Bonus:
351 ??????????????
352 3.....mm.....3
353 3............3
354 3............3
355 3............3
356 3............3
357 3............3
358 3............3
359 5.....++.....5
360 5....+ww+....5
361 3.....++.....3
362 3............3
363 3............3
364 3............3
365 3............3
366 3............3
367 3............3
368 3............3
369 Level:
370 pope1
371 ph33r
372 Bricks:
373 !ee*#jjjjj#ee!
374 eee*#jjjjj#eee
375 eee*#jjjjj#eee
376 eee*#jjjjc*eee
377 #eecjjjjjc*eee
378 .#ecjjjjjc####
379 ..#cjjjjj#....
380 ...jjjjj#.....
381 ...jjjj#......
382 ...jjj#.......
383 ...jj#........
384 ...j#.........
385 ...#..........
386 ..............
387 ..............
388 ..............
389 ..............
390 ..............
391 Bonus:
392 5....?????...5
393 .....?????....
394 .....?????....
395 ..............
396 ..............
397 ..............
398 ........j.....
399 .......j......
400 ......j.......
401 .....j........
402 ....j.........
403 ...j..........
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
0 Level:
1 riffraff
2 Begin
3 Bricks:
4 h............h
5 h............h
6 h.#ffkkkkff#.h
7 h.#@@kjjk@@#.h
8 h....kjjk....h
9 h....kkkk....h
10 ..............
11 ..............
12 ..............
13 ..............
14 ccccv!v!v!cccc
15 bbbb!v!v!vbbbb
16 aaaaheddehaaaa
17 ..............
18 ffff........jj
19 !!!!ggggeeee!!
20 !!!!ddddiiii!!
21 xxxx........jj
22 Bonus:
23 p............3
24 ..............
25 ...g?...+??...
26 ..............
27 ......m.......
28 ......--{.....
29 ..............
30 ..............
31 ..............
32 ..............
33 *..w.........*
34 .............j
35 ..............
36 ..............
37 ..............
38 ????........??
39 .*..........*.
40 ..............
41 Level:
42 riffraff
43 blocks
44 Bricks:
45 !!..aavveecc..
46 !!..aavveecc..
47 !@..a##veecc@.
48 !!..aa###!cc..
49 ..ii.**..#.dd.
50 ..ii.**hh.#dd.
51 ggii.#*hh.#dd.
52 ggii.#*hh.#dd.
53 gg...#.hh.kk..
54 gg..#...iikk..
55 ff##.ff#iikkbb
56 ffjj.ff.#ikkbb
57 ffjj.@fd#i..bb
58 ffjj.ffdd###bb
59 ..jjxx.dd..gg.
60 ....xx.dd..gg.
61 ....xx.....gg.
62 ....xx.....gg.
63 Bonus:
64 ?*..?*..?*?*..
65 ..............
66 .5.....m....5.
67 ..............
68 ..?*.?*....?*.
69 .......?*.....
70 ?*............
71 ..............
72 ..........?*..
73 ........?*....
74 ?*...?*.....?*
75 ..?*..........
76 .......?*.....
77 ..............
78 ....?*.....?*.
79 ..............
80 ..............
81 ..............
82 Level:
83 riffraff
84 colors
85 Bricks:
86 .ddddddvvvvvvE
87 .ddddiigggggvE
88 .ddddiigggggvE
89 ..vvvgggggggvE
90 E.hhhffffgggvE
91 E.hhhffffgggvE
92 E.hhhffffgggvE
93 E.hhhffffgggvE
94 E.hhhffffgggvE
95 E.hhhffffgggvE
96 E.hhhffffgggvE
97 E.hhhhhhhvvvvE
98 E.hhhhhhhvvvvv
99 E.hhhheeeddddv
100 E.hhhheeeddddv
101 E.vvvvdddddddv
102 EEEEEvdddddddv
103 EEEEEvdddddddv
104 Bonus:
105 .*....*.....g.
106 .....?.....*..
107 .*.2..?.......
108 ..........2...
109 ..*.....?.....
110 ..............
111 ...2.....f....
112 ......33......
113 ......33..2...
114 ...c..........
115 .....?.....*..
116 ..............
117 ..............
118 ....2.?.....*.
119 ..*.....?.....
120 ..........2...
121 ..............
122 ......*.....*.
123 Level:
124 riffraff
125 girders
126 Bricks:
127 ..j..j#..k..kk
128 bbbbbb#bbbbb#b
129 .i.......i.i#d
130 bbb#bbbbbbbb#.
131 ggg#....h..h#.
132 #bb#bb#bbbbb#.
133 #.e#.d#....f#d
134 #e.#..#.....#.
135 #..#d.#f....#.
136 #bb#bb#.....#.
137 #....f#bb#bb#d
138 #.....#gg#.e#.
139 #.f...#gg#bb#b
140 #bbbbb#bb#i..i
141 #h....h.h#....
142 #hh..h..h#....
143 #bbbbbbbb#bbbb
144 ..............
145 Bonus:
146 ..?..!...?...!
147 W....W.W...W.W
148 .?.......?.!.!
149 W.W.Wm.....W..
150 gg?.....?..!..
151 .WW.WW.W...W..
152 ..!..!.....!m{
153 .?.m..........
154 ....?..?......
155 .WW.WW........
156 .....!mWW.WW.?
157 m......g?..?..
158 ..?....gg.WW.W
159 .W...W.WWm?..!
160 .3....?.3.....
161 .3?..3..3.....
162 .W......W.W..W
163 ..............
164 Level:
165 riffraff
166 girders 2
167 Bricks:
168 ..............
169 ..............
170 ..............
171 ....cccccccca.
172 ....ak.....ka.
173 ....a.......a.
174 ....a.......a.
175 ....ak.....ka.
176 .ccccccccccaa.
177 .ak.kak..kaka.
178 .a...a....a.a.
179 .a...a....a.a.
180 .ak.kak..kaka.
181 .aaaacccccccc.
182 .ak.ka........
183 .ak.ka........
184 .ccccc........
185 ..............
186 Bonus:
187 ..............
188 ..............
189 ..............
190 ....d.........
191 .....?........
192 ..............
193 ..............
194 .....j........
195 ....44....4.~.
196 ...........w..
197 ..............
198 ..............
199 .........-....
200 .<...4........
201 ..>...........
202 ..............
203 ..............
204 ..............
205 Level:
206 riffraff
207 bullseye
208 Bricks:
209 ###........###
210 ##..........##
211 #............#
212 ..............
213 ...dddddddd...
214 ..ddvvvvvvdd..
215 ..dvvddddvvd..
216 ..dvddvvddvd..
217 ..dvdv!!vdvd..
218 ..dvdv!!vdvd..
219 ..dvddvvddvd..
220 ..dvvddddvvd..
221 ..ddvvvvvvdd..
222 ...dddddddd...
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 5............5
229 ..............
230 ..............
231 ..............
232 ...p...?......
233 ..........?...
234 .....?........
235 ..............
236 ...j..44...?..
237 ..?...44......
238 ........&g....
239 ...W..........
240 ..1........1..
241 ...f..->......
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 riffraff
248 lines
249 Bricks:
250 ..............
251 ..............
252 .v.......v....
253 .h.......hv.v.
254 .a.......a..h.
255 .#.......#..a.
256 .#...v...#..#.
257 ...v.h......#.
258 ...h.a........
259 ...a.#...v....
260 ...#.#...h....
261 ...#.....a....
262 .v.......#..v.
263 .h.......#..h.
264 .a..........a.
265 .#..........#.
266 .#..........#.
267 ..............
268 Bonus:
269 ..............
270 ..............
271 .?.......?....
272 .3.......3m.?.
273 ............3.
274 ..............
275 .....?........
276 ...?.3........
277 ...3..........
278 .........?....
279 .........3....
280 ..............
281 .?..........?.
282 .3..........3.
283 ..............
284 ..............
285 ..............
286 ..............
287 Level:
288 riffraff
289 separate
290 Bricks:
291 hhh#.....d....
292 hhh#e.fhk.j.!i
293 hhh#.!j..zfgd.
294 hhh#k..eg*...k
295 hhh#fhz.j.k!.g
296 hhh#..*i!...i.
297 hhh#.id..eh.zf
298 hhz.z.kgd..j*.
299 ###.##########
300 ....ee#ffff#ii
301 .f..ie#eeee#ei
302 fff#ie#eeee#ei
303 fff#ie#eeee#ei
304 f.f#ie#eeee#ei
305 f.f#ieeeeeeeei
306 fff#iiiiiiiiii
307 ...###########
308 ..............
309 Bonus:
310 222...........
311 222....2......
312 222...........
313 2*2.....?.....
314 222..2.......?
315 222...........
316 222.......2...
317 22..m.........
318 ..............
319 .....w.......l
320 .*......&m....
321 ..............
322 ....g.......~.
323 ..............
324 ..+....g.+?...
325 ....m.........
326 ..............
327 ..............
328 Level:
329 riffraff
330 remote
331 Bricks:
332 ##..........##
333 #....zzzz....#
334 kkk..z**z..kkk
335 kkk.EzzzzE.kkk
336 h...Ez**zE...h
337 h..!EzzzzE!..h
338 h.!!Ez**zE!!.h
339 h.EEEzzzzEEE.h
340 iiii......iiii
341 iiii......iiii
342 ffff......ffff
343 ffff..@@..ffff
344 .###vv@@vv###.
345 jj*ggg..ggg*jj
346 jjjgg#..#ggjjj
347 jjzg#....#gzjj
348 j*##......##*j
349 #*..........*#
350 Bonus:
351 5............5
352 ..............
353 ?............?
354 .&W........W..
355 2............2
356 2............2
357 2..*......*..2
358 2............2
359 ...*......*.{.
360 .!............
361 ..............
362 ..{...??....c.
363 ......??......
364 .....m..m.....
365 ..<.......>...
366 ..............
367 f............f
368 ..............
369 Level:
370 riffraff
371 spiral
372 Bricks:
373 vvvvvvvvvvvvvv
374 ..............
375 .#g##@##@####.
376 .#k#hfeddigj#.
377 .#d#d###@##d#.
378 .#f#g#gcjf#h#.
379 .#e#i@e##k#f#.
380 .#j#e#f*#h#g@.
381 .@c#f#*f#c#e#.
382 .#i#c#z*#e#i#.
383 .#h@i#*f#i#c@.
384 .#e#g#f*#d@k#.
385 .#f#d#@##g#d#.
386 .#g#hedghe#j#.
387 .@d###@####e#.
388 .#afcaaaecaf#.
389 .#######@##@@.
390 ..............
391 Bonus:
392 ..............
393 ..............
394 ...m..........
395 ..........4...
396 ............m.
397 ........?.....
398 ..m...4.......
399 ....s.........
400 ..b........*..
401 ..g..m...*....
402 .......?......
403 ....4.5.m..4..
404 .m..?.....m...
405 ....+....f.b..
406 ..............
407 ..?.*jw...-...
408 ............m.
409 ..............
410 Level:
411 riffraff
412 groups
413 Bricks:
414 kkkkkkkjjjjjjj
415 kkk*kkkj*jjjjj
416 kkkk*kkj*j#jjj
417 k*k#**kj#jj*jj
418 #k**kkkjjjj*jj
419 iiiiiiih*h**hh
420 i*i**iih*hh**#
421 iii*#i*h*hhhhh
422 iiiiii*hhhhhhh
423 #g##g*gf##f###
424 g****ggf**f**f
425 gggg**gff*f**f
426 ggggg**ffff**f
427 d#*ddddeeee**e
428 dd*d#ddee#eee*
429 dd*dd*d**eeeee
430 ddd****e***eee
431 ..............
432 Bonus:
433 !....{....5...
434 ..>.........4.
435 5..4..fs.....j
436 ........*.3...
437 ..g.p..c.....<
438 .m..d.-..W+...
439 .....0.1b.~...
440 ........2?}...
441 ...lj..&.....!
442 ..............
443 ..*.+.p...{.w.
444 &.............
445 ..w1.W..>.g...
446 d.......c.....
447 .g.?s2}f.m<...
448 0....b3..-...~
449 ............l.
450 ..............
451 Level:
452 riffraff
453 platforms
454 Bricks:
455 ..............
456 ..............
457 ........a.....
458 .......hhh....
459 .......h*h....
460 ..g....###....
461 .fff..........
462 .f*f..........
463 .###..........
464 ............k.
465 .....e.....jjj
466 ....ddd....j*j
467 ....d*d....###
468 ....###.......
469 ..............
470 ..............
471 ..............
472 ..............
473 Bonus:
474 ..............
475 ..............
476 ..............
477 ..............
478 ........4.....
479 ..............
480 ..............
481 ..3...........
482 ..............
483 ..............
484 ..............
485 ............2.
486 .....5........
487 ..............
488 ..............
489 ..............
490 ..............
491 ..............
492 Level:
493 riffraff
494 drip drip
495 Bricks:
496 .#.......###..
497 c#b.......#...
498 c#b......ccccc
499 c#bdd...cccccc
500 c#bddd..cccccc
501 .#..dd..cc....
502 .....d.####...
503 ....dd..hh....
504 ....d...hh....
505 ....d...hh....
506 .....d...h....
507 .....d...h....
508 ....dd..h.....
509 ....d...h.....
510 .....d..hh....
511 ....d....h....
512 ..............
513 ..............
514 Bonus:
515 ..............
516 ..............
517 ..............
518 c........3...l
519 ..&..*........
520 ........??....
521 ..............
522 .........g....
523 ....3.........
524 ..............
525 ..............
526 .....>........
527 ..............
528 ..............
529 ..............
530 ..............
531 ..............
532 ..............
533 Level:
534 riffraff
535 flow
536 Bricks:
537 ..gg..........
538 ..gg..........
539 ggggggggg..hhh
540 g##ggg##g..vvv
541 g.#####.g.....
542 g.......g.....
543 g.......g.....
544 g.....gggggg..
545 g.....g####g..
546 g.....g....g..
547 g.....g....g..
548 ggggggggg..g..
549 gg######g..g..
550 gg......g..g..
551 gg....gggggggg
552 gg....g######g
553 gg....g......g
554 gg....g......g
555 Bonus:
556 ..............
557 ..............
558 ...........333
559 ...333........
560 ..............
561 ..............
562 ..............
563 ........?.....
564 ..............
565 ..............
566 ..............
567 b..*..?.......
568 ..............
569 ..............
570 ........?..?..
571 ..............
572 ..............
573 ..............
574 Level:
575 riffraff
576 clock
577 Bricks:
578 ..............
579 .....cccc.....
580 ....chhhhc....
581 ...chhhahhc...
582 ..chhhhahhhc..
583 .chhhhhahhhhc.
584 .chhhhhahhhhc.
585 .chhhhhahhhhc.
586 .chhhhhahhhhc.
587 .chhhhhahhhhc.
588 .chhhhahhhhhc.
589 .chhhahhhhhhc.
590 ..chhhhhhhhc..
591 ...chhhhhhc...
592 ....chhhhc....
593 .....cccc.....
594 ..............
595 ..............
596 Bonus:
597 ..............
598 ..............
599 ......gW......
600 ......j-c.....
601 ...mf0...1....
602 ...d..b}..{l..
603 .~+.!<&..42...
604 ....W.sw..*...
605 ....3.>.?..5..
606 .bj?..........
607 ..&.f...!g<...
608 ..-w..d*..3l..
609 ...0}m.2c.....
610 ........{4s...
611 ....~1+.......
612 ........>.....
613 ..............
614 ..............
615 Level:
616 riffraff
617 diagonal
618 Bricks:
619 eeddxx##******
620 !!eeddx*##****
621 kk!!eeddxx##**
622 jjkk!!eeddxx##
623 iijjkk!!eeddxx
624 hhiijjkk!!eedd
625 gghhiijjkk!!ee
626 ffgghhiijjkk!!
627 ##ffgghhiijjkk
628 vv##ffgghhiijj
629 aavv##ffgghhii
630 bbaavv##ffgghh
631 ccbbaavv##ffgg
632 ..............
633 ..............
634 ..............
635 ..............
636 ..............
637 Bonus:
638 ..............
639 *?............
640 ..*?..........
641 ....*?........
642 ......*?......
643 ........*?....
644 ..........*?..
645 00..........*?
646 ..00..........
647 ....m0........
648 ......m0......
649 ........00....
650 ..........00..
651 ..............
652 ..............
653 ..............
654 ..............
655 ..............
656 Level:
657 riffraff
658 xxx
659 Bricks:
660 ..............
661 z*..!z*.......
662 !#..#!#...*z!.
663 #!..!#!...#!#.
664 ..........!#!.
665 ..............
666 .......!z*....
667 .!z*...#!#....
668 .#!#...!#!....
669 .!#!.......!z*
670 ....*z!....#!#
671 ....#!#....!#!
672 ....!#!.......
673 ........!z*...
674 *z!.....#!#...
675 #!#.....!#!...
676 !#!...........
677 ..............
678 Bonus:
679 ....*.........
680 W...?W......&.
681 1W..W2W....W?.
682 W?..?W?...W4W.
683 ..........?W?.
684 .......p......
685 .w.....?W.....
686 .?W....W3W....
687 .W0W...?W?.*..
688 .?W?*.*...<?W.
689 .....W?....W5W
690 ....W1W....?W?
691 ....?W?.l.....
692 ..*......W....
693 .W......W.W...
694 W1W......W....
695 .W............
696 ..............
697 Level:
698 riffraff
699 lightning
700 Bricks:
701 ............g!
702 g...g......g!g
703 !g.g!g.g....g.
704 g!*!g!g!g.g...
705 .g!!!g!g!*!g..
706 ..g!g!g!!!g!g.
707 ...g!g!g!g.g!g
708 ..g!g!g!g...g.
709 .g!g.g!g......
710 g!g...g!g.....
711 .g...g!g!g...g
712 ....g!g.g...g!
713 ...g!g.....g!g
714 ....g.....g!g.
715 ...........g..
716 ..............
717 ..............
718 ..............
719 Bonus:
720 ..............
721 *...........?.
722 ..............
723 ...?.j........
724 ...?..........
725 ........4.?...
726 .....??.......
727 ............?.
728 ..?.g*........
729 .......?......
730 ..............
731 ..............
732 ..............
733 ............?.
734 ..............
735 ..............
736 ..............
737 ..............
738 Level:
739 riffraff
740 explosion
741 Bricks:
742 ..............
743 ..!*!....!*!..
744 ..!*!....!*!..
745 ..!*!.!!.!*!..
746 ..!*!....!*!..
747 ..!*!....!*!..
748 .************.
749 !*!!!!!!!!!!*!
750 !*!!!!!!!!!!*!
751 !*!!!!!!!!!!*!
752 !*!!######!!*!
753 !*!!!!!!!!!!*!
754 .************.
755 .!!!!!!!!!!!!.
756 .!!!!!!!!!!!!.
757 ..............
758 ..............
759 ..............
760 Bonus:
761 ..............
762 ..!..*..*..!..
763 ..............
764 ....3.5!.3....
765 ..............
766 .>...<..<...>.
767 ..............
768 ..dddddddddd..
769 ..............
770 ..............
771 ...3......3...
772 ..............
773 W............W
774 W............W
775 W............W
776 .cws-g&&g-swc.
777 ..............
778 ..............
779 Level:
780 riffraff
781 green
782 Bricks:
783 .!!!!....!!!!.
784 .!!!!....!!!!.
785 .!!!!....!!!!.
786 .!!!!....!!!!.
787 .#!!#....#!!#.
788 .#ff#.dd.#ff#.
789 .#ff#.dd.#ff#.
790 .#ff#....#ff#.
791 .#ff#....#ff#.
792 .#ff#....#ff#.
793 .#zzzzzzzzzz#.
794 .#yyyyyyyyyy#.
795 .###cxhhxc###.
796 ....cxhhxc....
797 ....cxxxxc....
798 ....c####c....
799 ..............
800 ..............
801 Bonus:
802 w....*..*....w
803 w............w
804 w............w
805 w....*..*....w
806 ..............
807 ......**......
808 ......**......
809 ..............
810 ...5......5...
811 ..............
812 ..............
813 ....b....b....
814 ......44......
815 ......44......
816 ..............
817 ..............
818 ..............
819 ..............
820 Level:
821 riffraff
822 square
823 Bricks:
824 ..............
825 ..............
826 zzzzzzzzzzzzzz
827 zkkkkkkkkkkkkz
828 zkjjjjjjjjjjkz
829 zkjiiiiiiiijkz
830 zkjiggggggijkz
831 zkjigffffgijkz
832 zkjigfhhfgijkz
833 zkjigfhhfgijkz
834 z************z
835 zkjiggggggijkz
836 zkjiiiiiiiijkz
837 zkjjjjjjjjjjkz
838 zkkkkkkkkkkkkz
839 zzzzzzzzzzzzzz
840 ..............
841 ..............
842 Bonus:
843 ..............
844 ..............
845 ..............
846 .0..........0.
847 ..1........1..
848 ...2......2...
849 *...3.**.3....
850 .....4??4.....
851 .....?55?.....
852 .&&&&?55?&&&&.
853 >>>>?4dd4?>>>>
854 ....3....3....
855 ...2......2...
856 ..1........1..
857 .0..........0.
858 w.wbwbwbwbw.w.
859 ..............
860 ..............
861 Level:
862 riffraff
863 foo
864 Bricks:
865 kk...v....v.kk
866 kk#....v...#kk
867 kk#i##..##i#kk
868 dd##hggggh##dd
869 ..v@ghgghg@v..
870 ..v@gghhgg@v..
871 ..v@gghhgg@v..
872 ..v@ghgghg@v..
873 dd##hggggh##dd
874 ...vvv##vv..v.
875 vv...c..c....v
876 ..v.#..v.#.v..
877 v..#......#...
878 ..#..v..v..#v.
879 .#...v......#.
880 ....v...cvc...
881 v.vc...v.....v
882 ..............
883 Bonus:
884 ..............
885 ..............
886 ...m......m...
887 .....????.....
888 ..m.?....?.m..
889 ....?.33.?....
890 ....?.33.?....
891 ....?....?....
892 bb...????...bb
893 ..............
894 ..............
895 .......w......
896 ..............
897 .....w..w.....
898 .....w........
899 ....w....ww...
900 w.w....w.....w
901 ..............
902 Level:
903 riffraff
904 stairs
905 Bricks:
906 !#..........#!
907 #*....h.....*#
908 ..h...#h......
909 ..#h...#h.....
910 ...#h...#h....
911 ....#h...#h...
912 .....#....#...
913 ............h.
914 ...........h#.
915 ......h...h#..
916 .....h#..h#...
917 ....h#..h#....
918 ...h#..h#.....
919 ..h#...#......
920 ..#...........
921 ..............
922 ..............
923 ..............
924 Bonus:
925 *............m
926 ..............
927 ..............
928 ..............
929 ..............
930 ..............
931 ..............
932 ..............
933 ..............
934 ..............
935 ..............
936 ..............
937 ..............
938 ..............
939 ..............
940 ..............
941 ..............
942 ..............
943 Level:
944 riffraff
945 green 2
946 Bricks:
947 ..............
948 ..............
949 ..............
950 ..............
951 .fzf......fzf.
952 .fzf......fzf.
953 .fzf......fzf.
954 .fzf......fzf.
955 .fzf......fzf.
956 .fzf......fzf.
957 .fzf......fzf.
958 .fzf......fzf.
959 ..............
960 ..............
961 ....ffffff....
962 ....xxxxxx....
963 ....ffffff....
964 ..............
965 Bonus:
966 ..............
967 ..............
968 ..............
969 ..............
970 ..............
971 ..............
972 ..............
973 ..............
974 ..............
975 ..............
976 ..............
977 ..............
978 ..............
979 ..............
980 ..............
981 ....******....
982 ..............
983 ..............
984
0 Level:
1 armenius
2 fehu
3 Bricks:
4 ..............
5 ..............
6 ..dddddeffff..
7 ..eee#ef#ddd..
8 ..efd#f#eeee..
9 ..efd#aeffff..
10 ..efd#efdddd..
11 ..efd#fd#eee..
12 ..efd#d#gggg..
13 ..efd##giiii..
14 ..efd#gihehi..
15 ..efd#gihehi..
16 ..efd#gihehi..
17 ..efd#gihehi..
18 ..efddgihehi..
19 ..efffgihehi..
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ....+.........
26 ..........-...
27 ...-..5.......
28 .......+......
29 ......0>s.....
30 ...1..5.......
31 ......l.......
32 .........0....
33 ..s...........
34 ..............
35 ......f..-....
36 ..............
37 ...-......+...
38 ..............
39 ..............
40 ..............
41 Level:
42 armenius
43 uruz
44 Bricks:
45 ..............
46 ..............
47 ...ffffffff...
48 ...e#gghhhd...
49 ..fe##ghhhdg..
50 ..fe##gghhdg..
51 ..fe#i#ghhdg..
52 ..fe#i#gghdg..
53 ..fe#ii#ghdg..
54 d.fe#if#ggdg.h
55 cdfe#ifi#gdghc
56 .cfe#iff#gdgc.
57 ..fe#iffi#dg..
58 ...e#ifff#d...
59 ...hhhhhhhh...
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ....+.........
67 ..............
68 ..............
69 .......f..5...
70 .....2........
71 ..............
72 ...s..5....<..
73 .....-..0.....
74 >.............
75 .........-....
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 armenius
84 thurisaz
85 Bricks:
86 ..............
87 .....ei.......
88 ....f#gi......
89 ...hf#gfi.....
90 ..chf##ffi....
91 ..chf##effi...
92 ..chd#f#eff...
93 ..chdaff#ef...
94 ..chdaeee#e...
95 ..chdagg#ed...
96 ..chd#g#edd...
97 ..chf##eddi...
98 ..chf##ddi....
99 ...hf#gdi.....
100 ....f#gi......
101 .....ei.......
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ......-.......
109 ..............
110 .......1......
111 ......l.......
112 ......-.......
113 ..0.....3.<...
114 ......f.......
115 ....5.........
116 .........b....
117 ..............
118 ......f.......
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 armenius
125 ansuz
126 Bricks:
127 ..............
128 ..............
129 ..............
130 ....d#gggd....
131 ....d#gggd....
132 ..c.d##ggd.c..
133 ..e.d#g#gd.h..
134 ..c.d#gc#d.c..
135 ....d#gcfd....
136 ....d##cfd....
137 ....d#h#fd....
138 ....d#hh#d....
139 .ehhh#hhhhhhe.
140 .eeii#iiiiiee.
141 .eeee#eeeeeee.
142 .cccccccccccc.
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ..............
150 ........5.....
151 ..5........0..
152 ..+...+..-.f..
153 ..............
154 ......2.......
155 ..............
156 ..............
157 ..............
158 ....-.........
159 .........5....
160 ..............
161 .....-.....b..
162 ..............
163 ..............
164 Level:
165 armenius
166 raidho
167 Bricks:
168 ..............
169 ..............
170 ..fff#afffff..
171 ..ccc#c#cccc..
172 ..ddd#dd#ddd..
173 ..eee#eee#ee..
174 ..ggg#ggg#gg..
175 ..hhh#hh#hhh..
176 ..iii#i#iiii..
177 ..fff##fffff..
178 ..ccc#c#cccc..
179 ..ddd#d#dddd..
180 ..eee#ee#eee..
181 ..ggg#gg#ggg..
182 ..hhh#hhh#hh..
183 ..iii#iii#ii..
184 ..............
185 ..............
186 Bonus:
187 ..............
188 ..............
189 .......+......
190 ...........0..
191 ...-..........
192 ......b.p.....
193 ........l.f...
194 ..............
195 ....>.4.......
196 .......+...b..
197 ...s..1.......
198 .........-....
199 ..............
200 ...f..........
201 ..............
202 ..............
203 ..............
204 ..............
205 Level:
206 armenius
207 kaunaz
208 Bricks:
209 ..............
210 ..............
211 cccccccccccccc
212 fdeihgfc#eihgf
213 fdeihgfc#eihgf
214 fdeihgf#deihgf
215 fdeihgf#deihgf
216 fdeihg#cdeihgf
217 fdeihg#cdeihgf
218 fdeih#fcdeihgf
219 fdeih#fcdeihgf
220 fdeihg#cdeihgf
221 fdeihg#cdeihgf
222 fdeihgf#deihgf
223 fdeihgf#deihgf
224 fdeihgfc#eihgf
225 fdeihgfc#eihgf
226 cccccccccccccc
227 Bonus:
228 ..............
229 ..............
230 .0.......w....
231 ..............
232 .......1.....+
233 .-............
234 ..............
235 ..............
236 b....f........
237 ......2.-.....
238 ......+.....f.
239 ..............
240 ..............
241 ..............
242 ..............
243 +......-....0.
244 .......p......
245 ...w.....s....
246 Level:
247 armenius
248 gebo
249 Bricks:
250 ..............
251 ..............
252 ..ddddddddd...
253 .fd#ggggg#df..
254 .fd#ggggg#dfc.
255 .fdg#bcb#gdfd.
256 .fdg#bcb#gdfc.
257 .fdgb#e#bgdfg.
258 .fdgb#e#bgdfc.
259 .fdgce#ecgdfe.
260 .fdgce#ecgdfe.
261 .fdgb#e#bgdfc.
262 .fdgb#e#bgdfg.
263 .fdg#bcb#gdfc.
264 .fdg#bcb#gdfd.
265 .fd#ggggg#dfc.
266 .fd#ggggg#df..
267 ..ddddddddd...
268 Bonus:
269 ..............
270 ..............
271 ......-.......
272 .+.........+..
273 ......f.......
274 ..-.........>.
275 .......5......
276 .p............
277 ...<..2.5.-...
278 .......2......
279 .b...2.....b..
280 ......2.......
281 ....5.........
282 .+....l5...+..
283 ..>...........
284 ..........>...
285 ..-...f.......
286 .......-......
287 Level:
288 armenius
289 wunjo
290 Bricks:
291 f............f
292 c............c
293 ..ee......ii..
294 ..ee.#....ii..
295 ..ee.##...ii..
296 .ccc.#g#..ccc.
297 .....#gga.....
298 .....#gg#.....
299 .....ag#......
300 .....##.......
301 ..efe#hheife..
302 ..efi#heigfe..
303 .cdfg#eighfdc.
304 .cdfh#ighffdc.
305 ..cdd#dddddc..
306 ...cccccccc...
307 ..............
308 ..............
309 Bonus:
310 5............5
311 ..............
312 ...-......s...
313 ..............
314 ..b........b..
315 ..5...f....5..
316 .......+......
317 ......3.......
318 ......l.......
319 ..............
320 ......>.......
321 ..............
322 ..............
323 ...+...f..+...
324 ...-......-...
325 ....5.........
326 ..............
327 ..............
328 Level:
329 armenius
330 hagalaz
331 Bricks:
332 ..............
333 ..............
334 cchd#cccc#ficc
335 ..dh#bbbb#if..
336 ..hd#aaaa#fi..
337 ..dh#eeee#if..
338 ..hd##ggg#fi..
339 ..dh#f#dd#if..
340 cchd#dd#f#ficc
341 ..dh#ggg##if..
342 ..hd#eeee#fi..
343 ..dh#aaaa#if..
344 ..hd#bbbb#fi..
345 ..dh#cccc#if..
346 ..............
347 ..............
348 ..............
349 ..............
350 Bonus:
351 ..............
352 ..............
353 <..>..-.s.5.>.
354 ..............
355 ...+..........
356 ..............
357 .......b...b..
358 .....1........
359 f.......2....-
360 ..5.......<...
361 ......5.......
362 ..............
363 ......-...+...
364 .......>......
365 ..............
366 ..............
367 ..............
368 ..............
369 Level:
370 armenius
371 naudhiz
372 Bricks:
373 ..............
374 ffggiiiiiiieeg
375 aaggbb#bbaaeeg
376 ffccdd#bbddcce
377 geehbb#bbhhffd
378 geehbb#bbhhffd
379 hccg#b#eeccggd
380 effab##bbddaad
381 effabb##bddaad
382 eddabb#b#aaiid
383 eddabb#bbaaiid
384 fcceeb#bbffcch
385 aggffb#bbeeffe
386 aggffb#bbeeffe
387 addcch#ggccdde
388 ..............
389 ..............
390 ..............
391 Bonus:
392 ..............
393 ..f...p......s
394 .......5.>....
395 .+...-.....l5.
396 ..............
397 .......-......
398 .....1...g....
399 ............-.
400 s....l..1.....
401 ...>...0......
402 ..............
403 .5............
404 ....+......+..
405 ..............
406 .-.....f.>....
407 ..............
408 ..............
409 ..............
410 Level:
411 armenius
412 jera
413 Bricks:
414 ..............
415 ..............
416 eeeeeee#cccccc
417 gggggg#ddddddd
418 ddddd#gggggggg
419 ffff#eeeeeeeee
420 iiii#ggggggggg
421 hhhh#cc#dddddd
422 iiii#deg#fffff
423 fffff#fhi#iiii
424 dddddd#cc#hhhh
425 ggggggggg#iiii
426 eeeeeeeee#ffff
427 gggggggg#ddddd
428 ddddddd#gggggg
429 cccccc#eeeeeee
430 ..............
431 ..............
432 Bonus:
433 ..............
434 ..............
435 ..........-..0
436 ..............
437 ..>...........
438 +.............
439 .....<........
440 .....-........
441 .......l.....b
442 ..b...2.......
443 ........0..w..
444 ..............
445 .....s......+.
446 ..........>...
447 ........<.....
448 ...-..........
449 ..............
450 ..............
451 Level:
452 armenius
453 isa
454 Bricks:
455 .....dccd.....
456 ......cc......
457 chifd#eghifdcc
458 .ghifd#eghifd.
459 .ghifd#eghifd.
460 .ghifd#eghifd.
461 .ghifd#eghifd.
462 .ghifd#eghifd.
463 .ghifd#eghifd.
464 .ghifd#eghifd.
465 .ghifd#eghifd.
466 .ghifd#eghifd.
467 .ghifd#eghifd.
468 .ghifd#eghifd.
469 ccghifd#eghifc
470 ..............
471 ..............
472 ..............
473 Bonus:
474 ......+5-.....
475 ..............
476 5..>..2......5
477 ....+f........
478 ...........b..
479 .-............
480 .........1..-.
481 ..............
482 .......+......
483 ..0......s....
484 ............>.
485 .<............
486 .....-........
487 ........f..+..
488 ...b..>.......
489 ..............
490 ..............
491 ..............
492 Level:
493 armenius
494 eihwaz
495 Bricks:
496 ..............
497 ..............
498 .cefii#iigeca.
499 .fcfi##digcgb.
500 .cff#h#hdggca.
501 .dcfhi#fhgcdb.
502 .cffie#dfgfca.
503 .gcfei#fdgcgb.
504 .cifie#dfgica.
505 .dcfei#fdgcdb.
506 .cefie#dfgeca.
507 .icfei#fdgcib.
508 .cfffe#dggfca.
509 .gcfdf#g#gcgb.
510 .cdfhd##hgdca.
511 .ecfhh#hhgceb.
512 .abababababab.
513 ..............
514 Bonus:
515 ..............
516 ..............
517 .....>........
518 ...f.....-....
519 .....2......-.
520 ..+......<....
521 .......+......
522 .....-........
523 ..><....s.b.5.
524 .-............
525 .........f..>.
526 .....5........
527 ...s..........
528 .......l..+...
529 ..b.....>...-.
530 ..............
531 ...f...-......
532 ..............
533 Level:
534 armenius
535 perthro
536 Bricks:
537 ..............
538 ..............
539 .hhh##ccc#hhh.
540 .i..#d#g#...i.
541 .i..#di#....i.
542 .i.d#diecd..i.
543 .i..#diec...i.
544 .gg.#ciec..gg.
545 .cch#cieahhcc.
546 .ee.#ciec..ee.
547 .i..#fiec...i.
548 .i.d#fiecd..i.
549 .i..#fi#....i.
550 .ddd#f#g#.ddd.
551 .ccc##ccc#ccc.
552 .ffffffffffff.
553 ..............
554 .d..d....d..d.
555 Bonus:
556 ..............
557 ..............
558 .5.....5....5.
559 .....3.>......
560 ..............
561 .....<........
562 ......s.5.....
563 ............s.
564 .<.b.....b....
565 .....j-.......
566 ........<.....
567 ..............
568 ..............
569 .....l.f......
570 ..5....5...5..
571 ....>....>....
572 ..............
573 .-..+....+..-.
574 Level:
575 armenius
576 elhaz
577 Bricks:
578 ..............
579 ..............
580 ..............
581 .bb#bb#bb#bbb.
582 .cc#cc#cc#ccc.
583 .gg#gg#gg#ggg.
584 .ddd#d#d#dddd.
585 .eee#e#e#eeee.
586 .iiii###iiiii.
587 .ccccc#cccccc.
588 .hhhhh#hhhhhh.
589 .fffff#ffffff.
590 .ggggg#gggggg.
591 .ccccc#cccccc.
592 .ddddd#dddddd.
593 .eeeee#eeeeee.
594 .ccccc#cccccc.
595 .bbbbbbbbbbbb.
596 Bonus:
597 ..............
598 ..............
599 ..............
600 .....-.f......
601 ..+........+..
602 ....<...p.....
603 .....>.>......
604 .....2.2......
605 ..b........b..
606 .......l......
607 ..............
608 ..+.s....s.+..
609 .......<......
610 ..............
611 ...>.....>....
612 ..............
613 ..............
614 ..-.<.f.b..-..
615 Level:
616 armenius
617 sowilo
618 Bricks:
619 ..............
620 ..............
621 ..............
622 .icicici#icic.
623 .cdcdcd#dcdcd.
624 .ecece#ececec.
625 .cfcf#fcfcfcf.
626 .gcgc#cgcgcgc.
627 .chch#hchchch.
628 .icici#icicic.
629 .cdcdcd#dcdcd.
630 .ececece#ecec.
631 .cfcfcfc#cfcf.
632 .gcgcgcg#gcgc.
633 .chchch#hchch.
634 .icici#icicic.
635 .cdcd#dcdcdcd.
636 ..............
637 Bonus:
638 ..............
639 ..............
640 ..............
641 ..............
642 ....>...>.-.5.
643 ..............
644 ..1...+.......
645 .f.....b.f.<..
646 ......0.......
647 .....5...b....
648 ..-...-.......
649 .......0.5.1..
650 ....+.....+...
651 ...<...f......
652 .b............
653 ...5..........
654 ..........-.>.
655 ..............
656 Level:
657 armenius
658 tiwaz
659 Bricks:
660 ..............
661 ..............
662 .cccgf#gfcccc.
663 .cfgf###gfgfc.
664 .cgf#d#d#gfgc.
665 .cf#di#id#cfc.
666 .cg#id#di#cgc.
667 .cfcdi#idccfc.
668 .cgcid#cccfgc.
669 .cfcdi#fgfgfc.
670 .cgcic#gfgfcc.
671 .cfcce#fcccec.
672 .cgfge#gfgfec.
673 .cfgfe#fgfgec.
674 .cccce#ccccec.
675 ..............
676 ..............
677 ..............
678 Bonus:
679 ..............
680 ..............
681 ....f>.p..-...
682 ..............
683 .-.b.>.3.l.w..
684 ..............
685 .....<........
686 ........>.....
687 .......b......
688 ...-.1....f.-.
689 ..............
690 .s.........>..
691 ..>...........
692 ...f........b.
693 ...-....<.....
694 ..............
695 ..............
696 ..............
697 Level:
698 armenius
699 berkano
700 Bricks:
701 ..............
702 ..............
703 .cccc#ccccccc.
704 ..b.b##b.b.b..
705 .hhhh#e#hhhhh.
706 .b.b.#de#.b.b.
707 .dddd#ed#dddd.
708 ..b.b#d#.b.b..
709 .ffff#affffff.
710 .b.b.#d#b.b.b.
711 .iiii#ed#iiii.
712 ..b.b#de#b.b..
713 .eeee#e#eeeee.
714 .b.b.##.b.b.b.
715 .gggg#ggggggg.
716 ..............
717 ..............
718 ..............
719 Bonus:
720 ..............
721 ..............
722 ..............
723 .........s.f..
724 ...>..4....>..
725 ............s.
726 ......b...b...
727 ....<.........
728 ..+...w.+..+..
729 ..............
730 .b.....l....>.
731 ....w....w....
732 ......4.......
733 ...s..........
734 ...>...f...<..
735 ..............
736 ..............
737 ..............
738 Level:
739 armenius
740 ehwaz
741 Bricks:
742 dc..........cd
743 dc..........cd
744 cc..#cccc#..cc
745 ....##ee##....
746 ....#d##d#....
747 ....#c##c#....
748 ....#hhhh#....
749 ....#cccc#....
750 ....#iiii#....
751 cc..#cccc#..cc
752 ec..#ffff#..ce
753 ec..#cccc#..ce
754 cc..#gggg#..cc
755 ....#cccc#....
756 ..............
757 ..............
758 ..............
759 ..............
760 Bonus:
761 .............>
762 -...........+5
763 ......<.......
764 ......+l......
765 .....2..>.....
766 ..............
767 ......5.f.....
768 ..............
769 ........-.....
770 .b............
771 >....>......-.
772 .............<
773 .-....+.......
774 ........5.....
775 ..............
776 ..............
777 ..............
778 ..............
779 Level:
780 armenius
781 mannaz
782 Bricks:
783 ..............
784 ..............
785 ..............
786 ..e#f.f.f#d.d.
787 .ec##fcf##.dc.
788 ..e#h#f#h#d.d.
789 .e.#.h#h.#.d..
790 ..e#h.a.h#d.d.
791 .ebach#hcabd..
792 ..eah#g#had.d.
793 .ec##gcg##cd..
794 ..e#g.g.g#d.d.
795 .e.#.g.g.#.d..
796 ..e#g.g.g#d.d.
797 .ec#bgcgb#cd..
798 ..e#g.g.g#d.d.
799 ..............
800 ..............
801 Bonus:
802 ..............
803 ..............
804 ..............
805 ..5.+...>.....
806 ......f....b..
807 ..>.l.-.4.....
808 .....>........
809 ............+.
810 .-.b...b......
811 ..+...w.....5.
812 ..........5>..
813 ........+.....
814 .....<........
815 ..5...........
816 .......b...-..
817 ....-.........
818 ..............
819 ..............
820 Level:
821 armenius
822 laguz
823 Bricks:
824 ..............
825 ..............
826 .c.eg#fhdie.c.
827 ...eg##fdie...
828 .c.eg##fdie.c.
829 ...eg#g#fie...
830 .c.eg#g#fie.c.
831 ...eg#fg#ie...
832 .c.eg#fg#ie.c.
833 ...eg#fhgie...
834 .c.eg#fhgie.c.
835 ...eg#fhdie...
836 .c.eg#fhdie.c.
837 ...eg#fhdie...
838 .cccc#ccccccc.
839 ..............
840 .cccccccccccc.
841 ..............
842 Bonus:
843 ..............
844 ..............
845 .>..-...f.....
846 ..............
847 .........<..-.
848 ...b..2.......
849 .-....+.1.....
850 ..............
851 ....s..b..p.>.
852 ..............
853 .........b....
854 ...+..<.......
855 .f.....>..+...
856 ..............
857 ..-.....f..-..
858 ..............
859 ...<.-....>...
860 ..............
861 Level:
862 armenius
863 ingwaz
864 Bricks:
865 ..............
866 ..............
867 ..c.c.##c.c.c.
868 .cgcfcaahcdce.
869 .e.d.#g.#f.g..
870 ..g.f#.g#.d.e.
871 .e.d.#g.#f.g..
872 ..g.#.cc.#d.e.
873 .e.d#ecce#.g..
874 ..g.#.cc.#d.e.
875 .e.d.#g.#f.g..
876 ..g.f#.g#.d.e.
877 .e.d.#g.#f.g..
878 ..g.f.aah.d.e.
879 .e.d.h##.f.g..
880 .cgcfc.chcdce.
881 ..c.c.c.c.c.c.
882 ..............
883 Bonus:
884 ..............
885 ..............
886 ..............
887 ..f.+.s...-...
888 ...-.....+.f..
889 .......0......
890 ......<..b....
891 ..............
892 ...>..2l......
893 ..............
894 ......<.......
895 ....b..0..>...
896 ..............
897 .......s......
898 ...-.....+.f..
899 ..f.+.....-...
900 ..............
901 ..............
902 Level:
903 armenius
904 dagaz
905 Bricks:
906 ...c.....c....
907 f..c.e.e.c...h
908 .f.c.e.e.c..h.
909 f.f#e.e.e#.h.h
910 .f.#e.e.e#h.h.
911 f.f##e.e##.h.h
912 .f.##e.e##h.h.
913 f.f#h#e#f#.h.h
914 .f.#iaeai#h.h.
915 f.f#hiaif#.h.h
916 .f.#ih#fi#h.h.
917 f.f#h#d#f#.h.h
918 .f.#i#d#i#h.h.
919 f.f##dgd##.h.h
920 .f.##dgd##h.h.
921 f.f#dgdgd#.h.h
922 ccc#dgdgd#cccc
923 ..............
924 Bonus:
925 .........>....
926 -..5.<........
927 ..............
928 ......+....<.+
929 .b..>.........
930 ..............
931 .+............
932 ......5.b....>
933 .>..-.b.......
934 5.....l....+..
935 .......+......
936 ..<...-......5
937 ....4...2.b...
938 +.............
939 ......5.......
940 .....<.<.....-
941 b...>...-..>..
942 ..............
943 Level:
944 armenius
945 odhala
946 Bricks:
947 ..............
948 ..............
949 cccccc#ccccccc
950 eeeeeeaeeeeeee
951 ccccc#b#cccccc
952 fffffabaffffff
953 dddd#bbb#ddddd
954 iiii#bbb#iiiii
955 ggggg#b#gggggg
956 ababa#b#ababab
957 bababa#abababa
958 gggggg#ggggggg
959 iiiii#i#iiiiii
960 ddddd#d#dddddd
961 ffff#fff#fffff
962 ccc##ccc##cccc
963 eeeeeeeeeeeeee
964 cccccccccccccc
965 Bonus:
966 ..............
967 ..............
968 b......s..f.5.
969 ...>..........
970 ..5...b..+..>.
971 .+......p.....
972 ......>....5..
973 ......g.......
974 s.....+..s..+.
975 ...b..4.......
976 .f.5.........b
977 .....1.0...f..
978 ......s.......
979 ..>........>..
980 +.............
981 ......w.......
982 .....5.....>..
983 ..>.....+.5..b
0 Level:
1 Shimitar
2 the beginning
3 Bricks:
4 ..............
5 ..............
6 .gggggggggggg.
7 .ghgggggggghg.
8 .gghgggggghgg.
9 .ggghgfighggg.
10 .gggggiiggggg.
11 .gggggiiggggg.
12 .gggggiiggggg.
13 .ggghgifghggg.
14 .gghgggggghgg.
15 .ghgggggggghg.
16 .yggggggggggy.
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 .555555555555.
26 .555555555555.
27 .555555555555.
28 .555555555555.
29 .555555555555.
30 .555555555555.
31 .555555555555.
32 .555w5mm5w555.
33 .55w555555w55.
34 .5wbbbbbbbbw5.
35 .pwbbbbbbbbwp.
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Shimitar
43 Azz1
44 Bricks:
45 ..............
46 .jj........jj.
47 .jj........jj.
48 ...hh....hh...
49 ...hh....hh...
50 .....iiii.....
51 .....iv*i.....
52 .....i*vi.....
53 .....iiii.....
54 ...hh....hh...
55 ...hh....hh...
56 .jj........jj.
57 .jj........jj.
58 .EEEEEEEEEEEE.
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 .pp........pp.
66 .pp........pp.
67 ...bf....fb...
68 ...ff....ff...
69 .....0000.....
70 .....*w.*.....
71 .....*.w*.....
72 .....0000.....
73 ...>>....>>...
74 ...b>....>b...
75 .pp........pp.
76 .pp........pp.
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 Shimitar
84 Azz2
85 Bricks:
86 d...........d.
87 .d.........d..
88 ..d.......d...
89 ...d.....d....
90 ....d...d.....
91 ....*did*.....
92 ....*idi*...**
93 ddddddddddddd*
94 #############*
95 iiii........h*
96 ggggg*gg*gggh.
97 *gg*gg*gggggh.
98 g*ggggg*gg*gh.
99 *g*gg*gg*gggh.
100 ggg*ggggg*ggh.
101 g*gg*gg*gg*gh.
102 ............h.
103 ............h.
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ......5.....!.
112 ..............
113 ..............
114 m..w........+f
115 ...?.......4+.
116 ..0.....?0..+.
117 ....1.......+.
118 ...?......1?+.
119 ............>.
120 4.....?.....>.
121 ............>.
122 ............>.
123 Level:
124 Shimitar
125 DontBeAfraid
126 Bricks:
127 cz!!!!!!!!!!zc
128 zcz!!!!!!!!zcz
129 !zcz!!!!!!zcz!
130 !!zcz!!!!zcz!!
131 !!!zcz!!zcz!!!
132 !!!!zczzcz!!!!
133 !!!!!zczz!!!!!
134 !!!!!zzcz!!!!!
135 !!!!!czzc!!!!!
136 !!!zcz!!zcz!!!
137 !!zcz!!!!zcz!!
138 !zcz!!!!!!zcz!
139 zcz!!!!!!!!zcz
140 cz!!!!!!!!!!zc
141 zzzzzzzzzzzzzz
142 cccccccccccccc
143 zzzzzzzzzzzzzz
144 gggggggggggggg
145 Bonus:
146 ..............
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ......ww......
154 ......ww......
155 ..............
156 ..............
157 ..............
158 bbbbbbbbbbbbbb
159 bb>>>>>>>>>>bb
160 bbbbbbbbbbbbbb
161 bbbbbbbbbbbbbb
162 bbbbbbbbbbbbbb
163 wwwwwwwwwwwwww
164 Level:
165 Shimitar
166 Bump!
167 Bricks:
168 ..............
169 ....!..!......
170 ..............
171 ..............
172 ...!......!...
173 .!....!.....!.
174 ..............
175 ..............
176 .......!......
177 ...!......!...
178 ..............
179 ..............
180 .!....!..!..!.
181 ..............
182 ..............
183 ..!...!!...!..
184 ..............
185 ..............
186 Bonus:
187 ..............
188 .......>......
189 ..............
190 ..............
191 ...w..........
192 ............>.
193 ..............
194 ..............
195 .......g......
196 ..........m...
197 ..............
198 ..............
199 .g..........g.
200 ..............
201 ..............
202 ......>.......
203 ..............
204 ..............
205 Level:
206 Shimitar
207 Hidden...
208 Bricks:
209 ..............
210 ..............
211 ..v..v..v..v..
212 ..............
213 ..............
214 ..v..v..v..v..
215 ......ee......
216 ......ee......
217 ..v..vzzv..v..
218 ..............
219 ..............
220 ..v..v..v..v..
221 ..............
222 ..............
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ......mm......
235 ......mm......
236 ..............
237 ..............
238 ..............
239 ..b..w..w..b..
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Shimitar
248 HardStart!!!
249 Bricks:
250 ..............
251 ..............
252 !!!!!!!!!!!!!!
253 !!!!!!!!!!!!!!
254 dddddddddddddd
255 dddddddddddddd
256 e!eeeeee!eeeee
257 eee!eeeeeee!ee
258 eeeeeeeeeeeeee
259 i!iii!i!iiiiii
260 iiiiiiiiii!iii
261 hhhhhiihhhhhhh
262 hh!hhiihhhhhhh
263 ggggffffgggggg
264 ggggffffg!gg!g
265 ffffvvvvffffff
266 ffffvvvvffffff
267 @@@@@vv@@@@@@@
268 Bonus:
269 ..............
270 ..............
271 ..............
272 ..............
273 ......ww......
274 ..............
275 ..............
276 ..............
277 ..............
278 .w...b.b......
279 ..........b...
280 ..............
281 ..............
282 ..............
283 ....wwww......
284 .bbbb..bbbbbb.
285 mbmbm..m.m.m.m
286 .....dd.......
287 Level:
288 Shimitar
289 Now..Fun!
290 Bricks:
291 ..............
292 ..............
293 ..............
294 .zzzzzzzz.....
295 .z............
296 .z............
297 ##.#####z!!...
298 .#.#...#dddddd
299 .#.#...#dddddd
300 .#.#...#dddddd
301 .#.#...#dddddd
302 .#.#...#dddddd
303 .#.#...#dddddd
304 .#.#...#dddddd
305 .#.#...#dddddd
306 .#.#...#######
307 .#............
308 .#............
309 Bonus:
310 ..............
311 ..............
312 ..............
313 .55555555.....
314 .5............
315 .5............
316 ........>.....
317 ..........mm..
318 .............b
319 ........3....3
320 ........b.>...
321 ...........3..
322 ..........>?.b
323 ..............
324 ........b.....
325 ..............
326 ..............
327 ..............
328 Level:
329 Shimitar
330 UseTheForce!
331 Bricks:
332 ddi#dddi#iiiii
333 ddihhhii#dddhh
334 ddihhhii#dddhh
335 iii##########h
336 hhf#dd#ddggggh
337 hhf#dd#ddggghh
338 fff#ii#hhggghh
339 #f##ii#hhggghg
340 hhf##h##*#####
341 hhf#hhgggg#iig
342 ddfhiiiigg#iig
343 ddfhiiiihh#hhh
344 iif#ddddhh#hhh
345 iif#########g#
346 ####iihhgggggg
347 ddd#iihhggdddd
348 ddd#iihhggdddd
349 ddd#####.#####
350 Bonus:
351 ..............
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 bbb...........
364 bbb...........
365 ..............
366 mmm...........
367 mmm.wwwwwwwwww
368 mmm...........
369 Level:
370 Shimitar
371 Quick,esay,duh
372 Bricks:
373 ..............
374 ..............
375 ..............
376 ..............
377 ..............
378 .......hhh....
379 .......hhh....
380 .......hhh....
381 vvvvvvvhhh....
382 ....fffvvvvvvv
383 ....fff.......
384 ....fff.......
385 ....fff.......
386 ..............
387 ..............
388 ..............
389 ..............
390 vvvvvvvvvvvvvv
391 Bonus:
392 ..............
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ........m.....
399 ........m.....
400 ..............
401 ..............
402 .....p........
403 .....b........
404 .....>........
405 ..............
406 ..............
407 ..............
408 ..............
409 ....w.........
410 Level:
411 Shimitar
412 TheRedfield
413 Bricks:
414 d.d.d.d.d.d.d.
415 .d.d.d.d.d.d.d
416 d.d.d.d.d.d.d.
417 .d.d.d.d.d.d.d
418 d.d.d.d.d.d.d.
419 .d.d.d.d.d.d.d
420 d.d.d.d.d.d.d.
421 .d.d.d.d.d.d.d
422 d.d.d.d.d.d.d.
423 .d.d.d.d.d.d.d
424 d.d.d.d.d.d.d.
425 .d.d.d.d.d.d.d
426 d.d.d.d.d.d.d.
427 .d.d.d.d.d.d.d
428 ....d.d.d.d.d.
429 .......d.d.d.d
430 ..........d.d.
431 .............d
432 Bonus:
433 ..............
434 ..............
435 ..............
436 ..............
437 ?.....?.......
438 ...........W..
439 ..............
440 .~.m..........
441 ......W...b...
442 ..............
443 ............W.
444 .........c....
445 ..b.+.........
446 .d.+.j........
447 ....d.g.j.~...
448 .......d.d....
449 ..........d...
450 .............w
451 Level:
452 Shimitar
453 FullYellow!
454 Bricks:
455 ..............
456 ..............
457 ..hh..hh..hh..
458 ..hh..hh..hh..
459 hh..hh..hh..hh
460 hh..hh..hh..hh
461 ..hh..hh..hh..
462 ..hh..hh..hh..
463 hh..hh..hh..hh
464 hh..hh..hh..hh
465 ..hh..hh..hh..
466 ..hh..hh..hh..
467 hh..hh......hh
468 hh..hh......hh
469 ..hh..hh..hh..
470 ..hh..hh..hh..
471 ........hh....
472 ........hh....
473 Bonus:
474 ..............
475 ..............
476 .......f......
477 ..f.......f...
478 ............c.
479 .b..~....-....
480 ..............
481 ...-..p...+...
482 ..............
483 .c..-...b...+.
484 ......?.......
485 ..f.......+...
486 .....>........
487 -...>.......m.
488 ......ss...f..
489 ...?..ss......
490 ........~.....
491 ..............
492 Level:
493 Shimitar
494 Tree
495 Bricks:
496 ..............
497 ......ff......
498 .....ffff.....
499 .....ffff.....
500 ....ffffff....
501 ....ffffff....
502 ...ffffffff...
503 ...ffffffff...
504 ...ffffffff...
505 ...fff@@fff...
506 ...fff@@fff...
507 ......@@......
508 ......@@......
509 ......@@......
510 ......@@......
511 ......@@......
512 ..............
513 ..............
514 Bonus:
515 ..............
516 ......?5......
517 .....5??5.....
518 .....?&5?.....
519 ....5~5<?5....
520 ....?55>5?....
521 ...?5*p5!5?...
522 ...5&w5j5?5...
523 ...g>5?5d5>...
524 ...55>..5>5...
525 ...mb5..b5m...
526 ..............
527 ..............
528 ..............
529 ..............
530 ..............
531 ..............
532 ..............
533 Level:
534 Shimitar
535 OnlyTwoMore...
536 Bricks:
537 ......gg......
538 ......gg......
539 ......dd......
540 e.ggggddgggg.e
541 e....dddd....e
542 .e...dddd...e.
543 .e...dddd...e.
544 .*..######..*.
545 ..ee######ee..
546 ..ee......ee..
547 ..............
548 ......!!......
549 ee..........ee
550 ee..........ee
551 .*...iiii...*.
552 .....ivvh.....
553 #####hvvh#####
554 ffffffffffffff
555 Bonus:
556 ..............
557 ..............
558 ......11......
559 ......111.b...
560 1.....111.....
561 .d....0.......
562 .....f.m....0.
563 ..............
564 ..1...........
565 ..1b......0d..
566 ..............
567 ..............
568 ..............
569 0f..........1~
570 ......!!......
571 .....0........
572 ........d.....
573 .w....bw..~.w.
574 Level:
575 Shimitar
576 TheLast..Frozing!
577 Bricks:
578 *............*
579 ..............
580 ...vvvv.**....
581 .d.vdvv.**....
582 .ddvddv.......
583 ...vvvv.......
584 ...........d..
585 ..d..d.....dd.
586 ..dd.dd.d.....
587 ........dd....
588 .d............
589 .dd.d.........
590 ....dd..d.....
591 ........dd....
592 #d..........d.
593 #dd.........dd
594 !!!!!!!!!!!!!!
595 vvvvvvvvvvvvvv
596 Bonus:
597 m............?
598 ..............
599 ...ffff.~f....
600 ...ffff.d~....
601 ...ffff.......
602 ...ffff.......
603 ..............
604 ..f........bf.
605 .....?..f.....
606 .........f....
607 .f............
608 ..............
609 ....?...*.....
610 ..............
611 .f..........f.
612 ..b...........
613 ..............
614 ......w.......
615 Level:
616 Shimitar
617 WasJoking,thisIsLast.
618 Bricks:
619 zzzzzzzzzzzzzz
620 z.....ffffffff
621 z.....ffffffff
622 z.z...ffffffff
623 z.z...ffffffff
624 z.zfffffffffff
625 z.zfffffffffff
626 z.zfffffffffff
627 z.zfffffffffff
628 z.zfffffffffff
629 z.zfffffffffff
630 z.zfffffffffff
631 z.zfffffffffff
632 z.zfffffffffff
633 z.zfffffffffff
634 z.zzzzzzzzzzzz
635 z.............
636 z.............
637 Bonus:
638 55555555555555
639 5.....55555555
640 5.....55555555
641 5.0...55555555
642 5.0...555f5555
643 5.0>>>>55f5555
644 5.0555555f5555
645 5.05bbbbbf5555
646 5.05bbbbbf5555
647 5.0wbbbbbfw555
648 5.05bbbbbf5555
649 5.05bbbbbf5555
650 5.055555555555
651 5.055555555555
652 5.0m555555555m
653 5.ww0ww0000w0w
654 5.............
655 p.............
656
0 Version: 1.00
1 Level:
2 Kevin
3 Silly
4 Bricks:
5 ***bbb@bbbbaaa
6 *v*ccccccccaaa
7 *v*********@aa
8 ***xxxxxxxxaaa
9 @@@!!!!****hhh
10 fffddddeeeefff
11 vvvvvvvvvvvvvv
12 fffddddee@efff
13 fffddddeeeefff
14 !!!!!!!!!!!!!!
15 ******vv******
16 vvvvvvvvvvvvvv
17 vvvvzzzzzvvvvv
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 111...l..mmmm4
25 .l.11111111..4
26 .l.........l.4
27 555--------..4
28 lll2222llll...
29 .00p??p>>>>000
30 ..............
31 bbbbbbbbbbbbbb
32 w.w4?4?4?4>>>>
33 *++++www+++++*
34 0.....55.....0
35 dddddddddddddd
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Kevin
44 Silly
45 Bricks:
46 avaavvvvvvvacc
47 av!!av***vaccv
48 vv!vvv*!*vcvvv
49 v!*!!v*v*vvc*v
50 vv!v*v***vc**v
51 a!*vcvvvvvvc*a
52 v*vcccvv!aavca
53 v*a*vcvv!!!aav
54 v*az**vvvvv!!v
55 vvv*vvvv***!vv
56 cc*a*vvvvvvavv
57 vvvvvvvvfvvvff
58 vcvcv!vv*****v
59 !vv!v*vvvv!v**
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 <044d????dm}<<
66 p0>>&?444?}<<w
67 w!>m0?4!4?s55!
68 0++>>?4l4?5sW0
69 !0>5l?444?<~W0
70 p+~5d?????d<j}
71 4~5<<<ppg{{l<}
72 fl*W5<00g~g{{4
73 4w*+Wj00000+b4
74 !00!!000+!+b04
75 +bw&-wddddwf!0
76 pwddddddbddd+5
77 p+dbdbddbbbbbd
78 <00<0-0<00c0-w
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Kevin
85 Silly
86 Bricks:
87 @@@@@@@@@@@@@@
88 .vvv..vv..vvv.
89 .vvv..vv..vvv.
90 .vvv..vv..vvv.
91 .vvv......vvv.
92 ..............
93 ..............
94 ....vvvvvv....
95 ....vvvvvv....
96 ..............
97 ..............
98 v............v
99 v...vvvvvv...v
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 55555555555555
107 .4.4..4b..4.4.
108 ......bb......
109 ......00......
110 .bbb......bbb.
111 ..............
112 ..............
113 ....0mmmm0....
114 ....bbbbbb....
115 ..............
116 ..............
117 ..............
118 0...++++++...0
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Kevin
126 Silly
127 Bricks:
128 ........v.....
129 v......v.v...v
130 .v....v...v.v.
131 ..v..v..vv.v..
132 ...v.v..v.v...
133 ....v.vv.v....
134 ..vv.v..v.vv..
135 .v.v.v..v.v.v.
136 v...v.vv.v..vv
137 .v..v.vv.v.v..
138 ..vv.v..v.v...
139 ...v.v..v.v...
140 ....v.vv.v....
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ........5.....
148 2......5.....2
149 ......5.......
150 ..............
151 ..............
152 ......33......
153 ..3........3..
154 ..............
155 1...0....0...1
156 ....0....0....
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Kevin
167 Silly
168 Bricks:
169 @@@@@@@@@@@@@@
170 @vvvvvvvvvvvv@
171 @vjjjjjjjjjjv@
172 @vj........jv@
173 @vj........jv@
174 *k!........!k*
175 fff........fff
176 eee........eee
177 ddd........ddd
178 ggg........ggg
179 hhh........hhh
180 iii........iii
181 kkk........kkk
182 jjj........jjj
183 v!*........*!v
184 ..............
185 ..............
186 ..............
187 Bonus:
188 .555555555555.
189 .444444444444.
190 .0..........0.
191 .0..........0.
192 .0..........0.
193 ..............
194 ???........???
195 ???........???
196 ???........???
197 ???........???
198 ???........???
199 ???........???
200 ???........???
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Kevin
208 Silly
209 Bricks:
210 !d*jvvvvvvj*d!
211 .d*jvvvvvvj*d.
212 .d*jjjjjjjj*d.
213 .d**********d.
214 !dddddddddddd!
215 v..!.z!!z.!..v
216 .v..........v.
217 aav........vaa
218 aa.v.*zz*.v.aa
219 ....avvvva....
220 ....aavvaa....
221 .....aaaa.....
222 ......aa......
223 ..............
224 ..............
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ...05555550...
230 ...05555550...
231 ...00000000...
232 ..pppppppppp..
233 !????????????!
234 ?....5..5....?
235 .?..........?.
236 ..?........?..
237 ...?..55..?...
238 ....?....?....
239 .....?..?!....
240 .....!??......
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Kevin
249 Silly
250 Bricks:
251 vvvvvvvvvvvvvv
252 dddddddddddddd
253 v*v*v*vv*v*v*v
254 !.!.!.!!.!.!.!
255 aaaaaaaaaaaaaa
256 bbbbbbbbbbbbbb
257 cccccccccccccc
258 jjjjjjjjjjjjjj
259 jjjjjjjjjjjjjj
260 vv***vvvv***vv
261 vvvvvv**vvvvvv
262 vv@@@vvvv@@@vv
263 vv!..v!!v..!vv
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 55555555555555
271 11111111111111
272 0!0!0!00!0!0!0
273 m.m.m.mm.m.m.m
274 ??????????????
275 ??????????????
276 ??????????????
277 ??????????????
278 ??????????????
279 ..!!!....!!!..
280 ......mm......
281 ..............
282 ..m...mm...m..
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Kevin
290 Silly
291 Bricks:
292 @@@@@@@@@@@@@@
293 @@@@@@@@@@@@@@
294 zzzzzzzzzzzzzz
295 **************
296 vvvk!kkkk!kvvv
297 vvvk******kvvv
298 vvv!*vvvv*!vvv
299 vvv!*vvvv*!vvv
300 vvvk******kvvv
301 vvvk!kkkk!kvvv
302 !v!v!v!!v!v!v!
303 **************
304 **************
305 ..............
306 ..............
307 ..............
308 ..............
309 ..............
310 Bonus:
311 55555555555555
312 55555555555555
313 bm.m..mm..m.mb
314 +.+.-....-.+.+
315 !bb..+--+..bb!
316 !bb..m.m.m.bb!
317 !....dddd....!
318 !....dddd....!
319 !..0m.m.m.0..!
320 !..0------0..!
321 .p.p-p--p-p.p.
322 dddddddddddddd
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Kevin
331 Silly
332 Bricks:
333 !...........!.
334 .e..a.j..x..!.
335 v.jvj....*!...
336 ....j..v....k.
337 ...!.aj.jk...v
338 e.a.......a..v
339 ..!.v.e.e..!..
340 jx..xj.v.x..v.
341 .*.v*.!..*....
342 .....j.v....k.
343 e.e...e...v...
344 ...k!....k...e
345 ...v..........
346 ..v...v..!....
347 ..........v...
348 ..............
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 ..............
364 ..............
365 ..............
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Kevin
372 Silly
373 Bricks:
374 f.*...e..a...f
375 ..i.v..e.va.v.
376 .v.f.d*v...x..
377 i.d.*...ae.*..
378 .@!.vi.df@.*.!
379 v@..!.a..@.d..
380 ..!dvf.!i.v.v.
381 *..i..v...eee.
382 d.@.a.@di*...@
383 vf@!v.@.v.!v.@
384 ..............
385 ..............
386 ..............
387 ..............
388 ..............
389 ..............
390 ..............
391 ..............
392 Bonus:
393 0.!...l..j....
394 ..!.m..l.0+.f.
395 .5.b.b!f...w..
396 w.b.!...ml.!..
397 .4l.f>.b.4.!.d
398 m4..p.5..4.b..
399 ..pb<<.<>.d.d.
400 0..>..d...**m.
401 w.5.d.5<d!...5
402 dd5}m.5.5.pd.5
403 ..............
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Kevin
413 Silly
414 Bricks:
415 vaavkkaakkvaav
416 v!vaavkkvaav!v
417 vvaavakkavaavv
418 jjavavkkvavajj
419 aavav!vv!vavaa
420 avav!vvvv!vava
421 vav!vjvvjv!vav
422 avavvvjjvvvava
423 vaajvvjjvvjaav
424 ....vjvvjv....
425 ....jvvvvj....
426 ..............
427 ..............
428 ..............
429 ..............
430 ..............
431 ..............
432 ....@@@@@@....
433 Bonus:
434 m............m
435 .....m..m.....
436 ..............
437 55..........55
438 ......bb......
439 .m...bbbb...m.
440 ....b5bb5b....
441 ...bbb55bbb...
442 ...5bb55bb5...
443 ....b5bb5b....
444 ....5bbbb5....
445 ..............
446 ..............
447 ..............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Kevin
454 Silly
455 Bricks:
456 kkkkkkkkkkkkkk
457 vvvvvvvvvvvvvv
458 vvvvvvvvvvvvvv
459 *!*!*!vv!*!*!*
460 vvvvvvvvvvvvvv
461 jjjjjjjjjjjjjj
462 jjjjjjjjjjjjjj
463 jjjjjjjjjjjjjj
464 jjjjjjjjjjjjjj
465 ..............
466 ..............
467 ..............
468 ..............
469 ..............
470 ..............
471 ..............
472 ..............
473 ..............
474 Bonus:
475 55555555555555
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 ..............
482 ..............
483 ..............
484 ..............
485 ..............
486 ..............
487 ..............
488 ..............
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Kevin
495 Silly
496 Bricks:
497 .ffffffffffff.
498 xvxvxxvvxxvxvx
499 .gggggggggggg.
500 cvcvccvvccvcvc
501 .hhhhhhhhhhhh.
502 bvbvbbvvbbvbvb
503 .iiiiiiiiiiii.
504 avavaavvaavava
505 .jjjjjjjjjjjj.
506 *v*v**vv**v*v*
507 .kkkkkkkkkkkk.
508 !v!v!!vv!!v!v!
509 .eeeeeeeeeeee.
510 zzzzzzzzzzzzzz
511 ..............
512 ..............
513 ..............
514 ..............
515 Bonus:
516 ......!!......
517 !5.5..55..5.5!
518 ......!!......
519 !5.5ff55ff5.5!
520 ......!!......
521 !5f5??55??5f5!
522 ......!!......
523 !5f5??55??5f5!
524 ......!!......
525 !5.5..55..5.5!
526 ......!!......
527 !5.5..55..5.5!
528 .pppppppppppp.
529 !.....!!.....!
530 ..............
531 ..............
532 ..............
533 ..............
534 Level:
535 Kevin
536 Silly
537 Bricks:
538 jvvvjkvvkjvvvj
539 jk!gjkvvkjg!kj
540 jk!gjvvvvjg!kj
541 jk!gjfidfjg!kj
542 jk!vjfidfjv!kj
543 vk!vjfvvfjv!kv
544 vk!vjfvvfjv!kv
545 vk!vjfvvfjv!kv
546 vk!vjfvvfjv!kv
547 zzzzzzzzzzzzzz
548 ..............
549 ..............
550 ..............
551 ..............
552 ..............
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ..............
558 ..............
559 ..............
560 ..............
561 ..............
562 ..............
563 ..............
564 ..............
565 ..............
566 ..............
567 ..............
568 ..............
569 ..............
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Kevin
577 Silly
578 Bricks:
579 v!j*x*vv*x*j!v
580 .v!j*x**x*j!v.
581 ..v!j*xx*j!v..
582 ...v!j**j!v...
583 ....v!jj!v....
584 .....vvvv.....
585 .....v**v.....
586 .....v**v.....
587 .....vvvv.....
588 ..............
589 ..............
590 ..............
591 ..............
592 ..............
593 ..............
594 ..............
595 ..............
596 ..............
597 Bonus:
598 ....5.44.5....
599 .....5..5.....
600 ......55......
601 ..............
602 ..............
603 .....bbbb.....
604 .....b..b.....
605 .....b..b.....
606 .....bbbb.....
607 ..............
608 ..............
609 ..............
610 ..............
611 ..............
612 ..............
613 ..............
614 ..............
615 ..............
0 Version: 1.00
1 Level:
2 Daddy
3 Page one
4 Bricks:
5 #c#!!!!!!!!#c#
6 ###!!!!!!!!###
7 !!!!##!!##!!!!
8 ###!#!!!!#!###
9 #c#!#!!!!#!#c#
10 ###!!#!!#!!###
11 !!!!!!##!!!!!!
12 ###!!#!!#!!###
13 #c#!#!!!!#!#c#
14 ###!!!!!!!!###
15 !!!!!!!!!!!!!!
16 ###!#!!!!#!###
17 #c#!!####!!#c#
18 ###!!!!!!!!###
19 !!!!!!!!!!!!!!
20 ###!!#!!#!!###
21 #c#!#vvvv#!#c#
22 ####vvvvvv####
23 Bonus:
24 .m.m......m.m.
25 ...m.....0m000
26 00000000000000
27 333........333
28 3.3........3.3
29 333........333
30 ..............
31 222...**...222
32 2.2........2.2
33 222...&&...222
34 000000&&000000
35 333*..&&..*333
36 3.3w......w333
37 333...**...333
38 .*..w....w..*.
39 ...*......*...
40 .m....ww....m.
41 j..j..ww..j..j
42 Level:
43 Daddy
44 Page Two
45 Bricks:
46 gfgv.!.v!.v###
47 fgf.v...v.!#f#
48 gfg!.v.!.v.###
49 fgE...v...vfgf
50 gfEv.!.v.!.###
51 fgE.v...v..#g#
52 gfE!.v.!.vv###
53 fgE...v...vgfg
54 gfEv.!.v.!.###
55 fgE.v...v..#g#
56 gfE!.v.!.vv###
57 EEE...v...vfgf
58 v..v.!.v.!.###
59 .v..v...v..#f#
60 ..v..v.!.vv###
61 .!.v!.v...vvvv
62 ***********vvv
63 vvvvvvvvvvvvvv
64 Bonus:
65 ???........44l
66 ???........45l
67 ???........44l
68 ??...........5
69 ??.!!!!!!!!444
70 ??.55555555454
71 ??.!!!!!!!!444
72 ww...........5
73 ww.........444
74 ........c..454
75 mm.~~.*..cc444
76 ....~~c...c..5
77 c..c.~~c...444
78 .c..c.~~c.*454
79 ..c..c.~~>>444
80 >>>>>>>>>.>>jj
81 sswwbbbwwss>jj
82 WWWWWWWWWWWWWW
83 Level:
84 Daddy
85 Page Three
86 Bricks:
87 dddddddddddddd
88 djjjjjjjjjjjjd
89 djddddddddddjd
90 djdjjjjjjjjdjd
91 djdjddddddjdjd
92 djdjdjjjjdjdjd
93 djdjddjjddjdjd
94 djdjdjddjdjdjd
95 djdjdjddjdjdjd
96 djdjdjddjdjdjd
97 djdjdjddjdjdjd
98 djdjddjjddjdjd
99 djdjdjjjjdjdjd
100 djdjddddddjdjd
101 djdjjjjjjjjdjd
102 djddddddddddjd
103 djjjjjjjjjjjjd
104 dddddddddddddd
105 Bonus:
106 {{{{{{{{{{{{{{
107 {WWWWWWWWWWWW{
108 {W**********W{
109 {W*WWWWWWWW*W{
110 {W*W******W*W{
111 {W*W*WWWW*W*W{
112 {W*W*5WW5*W*W{
113 {W*W*W55W*W*W{
114 {W*W*W55W*W*W{
115 {W*W*W55W*W*W{
116 {W*W*W55W*W*W{
117 {W*W*5WW5*W*W{
118 {W*W*WWWW*W*W{
119 {W*W******W*W{
120 {W*WWWWWWWW*W{
121 {W**********W{
122 {WWWWWWWWWWWW{
123 {{{{{{{{{{{{{{
124 Level:
125 Daddy
126 Page Four
127 Bricks:
128 jjjjjjjjjjjjjj
129 jxxxxxxxxxxxxj
130 jxjjjjjjjjjjxj
131 jxjxxxxxxxxjxj
132 jxjxjjjjjjxjxj
133 jxjxjxxxxjxjxj
134 jxjxjjxxjjxjxj
135 jxjxjxjjxjxjxj
136 jxjxjxjjxjxjxj
137 jxjxjxjjxjxjxj
138 jxjxjxjjxjxjxj
139 jxjxjjxxjjxjxj
140 jxjxjxxxxjxjxj
141 jxjxjjjjjjxjxj
142 jxjxxxxxxxxjxj
143 jxjjjjjjjjjjxj
144 jxxxxxxxxxxxxj
145 jjjjjjjjjjjjjj
146 Bonus:
147 ffffffffffffff
148 fm..........mf
149 f.~~~~~~~~~~.f
150 f.~...mm...~.f
151 f.~..4..4..~.f
152 f.~..l..l..~.f
153 f....~..~....f
154 f.....44.....f
155 f.....44.....f
156 f.....44.....f
157 f.....44.....f
158 f..cp~..~pc..f
159 f..cpl..lpcW.f
160 f.Wcp4pp4pcW.f
161 f.WccccccccW.f
162 f.WWWWWWWWWW.f
163 fww...mm...wwf
164 ffffffffffffff
165 Level:
166 Daddy
167 Page Five
168 Bricks:
169 xvvvvvzzvvvvvx
170 vx....zz....xv
171 yvx...zz...xvy
172 vyvx..zz..xvyv
173 v.yvx.zz.xvy.v
174 v..yvxzzxvy..v
175 v...yvxxvy...v
176 v....yvvy....v
177 v.....yy.....v
178 v.....yy.....v
179 v....yvvy....v
180 v...yvxxvy...v
181 v..yvxzzxvy..v
182 v.yvx.zz.xvy.v
183 vyvx..zz..xvyv
184 yvx...zz...xvy
185 vx....zz....xv
186 xvvvvvzzvvvvvx
187 Bonus:
188 w.....ll.....w
189 .2....&&....2.
190 3.2........2.3
191 .3.2......2.3.
192 ..3.2....2.3..
193 ...3.2ww2.3...
194 ....5.22.5....
195 .....5..5.....
196 ......55......
197 ......55......
198 .....5..5.....
199 ....5.22.5....
200 m..3.2ll2.3..m
201 ..3.2.ww.2.3..
202 .3.2......2.3.
203 3.2........2.3
204 .2..........2.
205 b.....bb.....b
206 Level:
207 Daddy
208 Page Six
209 Bricks:
210 v!v!v!v!v!v!v!
211 vvvvvvvvvvvvvv
212 v!v!v!v!v!v!v!
213 vvvvvvvvvvvvvv
214 v!v!v!v!v!v!v!
215 vvvvvvvvvvvvEE
216 v!v!v!v!v!v!v!
217 vvvvvvvvvvvvvv
218 v!v!v!v!vEEEv!
219 vvvvvvvvvvvvvv
220 v!v!v!v!v!v!v!
221 vvvvvvEEEvvvvv
222 v!v!v!v!v!v!v!
223 vvvvvvvvvvvvvv
224 v!vEEEv!v!v!v!
225 vvvvvvvvvvvvvv
226 v!v!v!v!v!v!v!
227 EEEvvvvvvvvvvv
228 Bonus:
229 ....b...b...b.
230 ..p...p.g.g.gW
231 *...~.........
232 .dWd..j.>.l~<.
233 j...........pw
234 &.&.l.&.*.&...
235 ............{}
236 ..c.b.c~b.w.b.
237 l.............
238 .~>~jW..p.}{*j
239 W.....!w!.....
240 g.g.g......d.d
241 ......w}{...W.
242 .c<.w.*...w.~w
243 *.......w.....
244 .~p.}{gd.d..w.
245 .w....!...*.!.
246 ...Wb.w.bW.gb.
247 Level:
248 Daddy
249 Page Seven
250 Bricks:
251 xxxxxxxxxxxxxx
252 xe@x@exxe@x@ex
253 x@exe@xx@exe@x
254 xe@x@exxe@x@ex
255 x@exe@xx@exe@x
256 xe@x@exxe@x@ex
257 x@exe@xx@exe@x
258 xe@x@exxe@x@ex
259 x@exe@xx@exe@x
260 zz*z*z*z*z*z*z
261 z*z*z*z*z*z*zz
262 zEEEEEEEEEEEEz
263 zzzzzzzzzzzzzz
264 ..............
265 EEEEEE..EEEEEE
266 cbcbcbcbcbcbcb
267 bcbcbcbcbcbcbc
268 aaaaaaaaaaaaaa
269 Bonus:
270 mc..........cm
271 cc..........cc
272 .....w..w.....
273 ....lm..ml....
274 ....cccccc....
275 ..............
276 ..............
277 ..............
278 ..............
279 ..2>2.mm2>2.2.
280 .2.2>2cc.2>2..
281 ..............
282 ....bwwwwb....
283 ..............
284 ..............
285 ..............
286 111.111111.111
287 1s1.1s11s1.1s1
288 Level:
289 Daddy
290 Page Eight
291 Bricks:
292 vvvvvvvvvvvvvv
293 v............v
294 v.............
295 vvvvvvvvvvvvE.
296 ...........vE.
297 ...........vE.
298 .vvvvvvvvvvvE.
299 .v..........E.
300 .v..........E.
301 .vvvvvvvvvvvE.
302 ...........vE.
303 ...........vE.
304 .vvvvvvvvvvvE.
305 .v..........E.
306 .v..........E.
307 .vvvvvvvvvvvE.
308 ...........vE.
309 EvvvvvvvvvvvEE
310 Bonus:
311 .....WgW.....p
312 .............p
313 ~.............
314 bb....&...ww..
315 ..............
316 ...........~..
317 .ww..WjW..bb..
318 ..............
319 ..............
320 .....WgW..ww..
321 ...........~..
322 ..............
323 ......&.......
324 ..............
325 ..............
326 .....WjW......
327 ..............
328 .f...WgW...f..
329 Level:
330 Daddy
331 Page Nine
332 Bricks:
333 iivvvviivvvvii
334 ivivvivvivvivi
335 ivviivvvviivvi
336 ivviivvvviivvi
337 ivivvivvivvivi
338 iivvvviivvvvii
339 iivvvviivvvvii
340 ivivvivvivvivi
341 ivviivvvviivvi
342 ivviivvvviivvi
343 ivivvivvivvivi
344 iivvvviivvvvii
345 iivvvviivvvvii
346 ivivvivvivvivi
347 ivviivvvviivvi
348 ivviivvvviivvi
349 ivivvivvivvivi
350 iivvvviivvvvii
351 Bonus:
352 22222222222222
353 22222dddd22222
354 00000d&&d00000
355 00000d&&d00000
356 00000dddd00000
357 00000444400000
358 00000444400000
359 0*000dddd000*0
360 00000d&&d00000
361 00w00d&&d00w00
362 0w000dddd000w0
363 00000444400000
364 jj000dddd000jj
365 j0j00dddd00j0j
366 j00jjd&&djj00j
367 j00jjd&&djj00j
368 j0j00dddd00j0j
369 jj000dddd000jj
370 Level:
371 Daddy
372 Page Ten
373 Bricks:
374 !..!######!..!
375 ....#.##.#....
376 ....#.##.#....
377 !..!#.##.#!..!
378 .#####EE#####.
379 ....#.EE.#....
380 !..!#.EE.#!..!
381 ....#.EE.#....
382 .############.
383 ....#.##.#....
384 !..!#.##.#!..!
385 ....#.##.#....
386 .#####EE#####.
387 ....#vEEv#....
388 !..!#vEEv#!..!
389 ....#.EE.#....
390 v####!EE!####v
391 vvvvvvvvvvvvvv
392 Bonus:
393 ...m44l444m...
394 ...m4.4l.4m...
395 ....4.44.4....
396 w..w4.44.4w..w
397 .44444..44444.
398 ....4....4....
399 ....4....4....
400 ....4....4....
401 .444444444444.
402 ....4.44.4....
403 ....4.44.4....
404 ....4.44.4....
405 .44444..44444.
406 ....4*..*4....
407 ....4s..s4....
408 ....4....4....
409 .4444....4444.
410 ......ww......
411 Level:
412 Daddy
413 Page Eleven
414 Bricks:
415 ..............
416 !!!!!!!!!!!!!!
417 **************
418 ..............
419 !!!!!!!!!!!!!!
420 **************
421 ..............
422 !!!!!!!!!!!!!!
423 **************
424 ..............
425 !!!!!!!!!!!!!!
426 **************
427 ..............
428 !!!!!!!!!!!!!!
429 **************
430 ..............
431 !!!!!!!!!!!!!!
432 **************
433 Bonus:
434 .....mmmm.....
435 gg..........gg
436 dddddddddddddd
437 ..............
438 ..............
439 dddddddddddddd
440 ..............
441 ggWWWWWWWWWWgg
442 dddddddddddddd
443 ..............
444 ..............
445 dddddddddddddd
446 ..............
447 bbWWWWWWWWWWbb
448 dddddddddddddd
449 ..............
450 wwggWWWWWWggww
451 dddddddddddddd
452 Level:
453 Daddy
454 Page Twelve
455 Bricks:
456 **************
457 **************
458 **************
459 **************
460 **************
461 *****....*****
462 *****.vv.*****
463 *****.vv.*****
464 *****.vv.*****
465 *****.vv.*****
466 *****.vv.*****
467 *****.vv.*****
468 *****....*****
469 **************
470 **************
471 **************
472 **************
473 *EEEEEEEEEEEEE
474 Bonus:
475 }}}}}}}}}}}}}}
476 ++++++++++++++
477 gggggggggggggg
478 <<<<<<<<<<<<<<
479 cccccccccccccc
480 WWWWW....WWWWW
481 ?????.55.?????
482 bbbbb.55.bbbbb
483 >>>>>.l5.>>>>>
484 ddddd.5l.ddddd
485 !!!!!.55.!!!!!
486 ~~~~~.55.~~~~~
487 wwwww....wwwww
488 !!!!!!!!!!!!!!
489 wwwwwwwwwwwwww
490 cccccccccccccc
491 dddddddddddddd
492 d.............
493 Level:
494 Daddy
495 Page Thirteen
496 Bricks:
497 *v...xxx....v*
498 *vvvvxxxvvvvv*
499 *E*EvExEvE*E*E
500 ****vExEv*****
501 E*E*EExEE*E*E*
502 *****ExE******
503 *E*E*ExE*E*E*E
504 *****ExE******
505 E*E*EExEE*E*E*
506 *****ExE******
507 *E*E*ExE*E*E*E
508 *****ExE******
509 E*E*EExEE*E*E*
510 .***.ExE******
511 .E.E.ExE*E*E*E
512 .....ExE......
513 hhhhhExEhhhhhh
514 EEEEEExEEEEEEE
515 Bonus:
516 .w...wlw....w.
517 .....wbw......
518 ......w.......
519 ......w.......
520 ......b.......
521 ......b.......
522 ......w.......
523 ......b.......
524 ......w.......
525 ......*.......
526 ......w.......
527 ......b.......
528 ......w.......
529 ..............
530 ..............
531 ..............
532 44444...444444
533 ..............
534 Level:
535 Daddy
536 Page Fourteen
537 Bricks:
538 vvv.******.vvv
539 v.....**.....v
540 v.vvv....vvv.v
541 v...vv..vv...v
542 v.*.v.vv.v.*.v
543 v...v.vv.v...v
544 v.vvvv..vvvv.v
545 v............v
546 vvv.******.vvv
547 ..............
548 .vvv.vvvv.vvv.
549 ...v.v..v.v...
550 **.v.v..v.v.**
551 **.v.v..v.v.**
552 **.v.v..v.v.**
553 ...v.v..v.v...
554 .vvv.v..v.vvv.
555 .....v..v.....
556 Bonus:
557 www.bbbbbb.www
558 f.....bb.....f
559 f............f
560 f....5..5....f
561 f.b...44...b.f
562 f.....44.....f
563 f....5..5....f
564 f............f
565 fff.bbbbbb.fff
566 ..............
567 .WWW.<<<<.WWW.
568 ...W.<..<.W...
569 bb.W.<..<.W.bb
570 bb.W.<..<.W.bb
571 bb.W.<..<.W.bb
572 ...W.<..<.W...
573 .WWW.<..<.WWW.
574 .....<..<.....
575 Level:
576 Daddy
577 Page Fifteen
578 Bricks:
579 vvvvvvvvvvvvvv
580 v............v
581 v............v
582 v............v
583 v.v..v..v..v.v
584 v............v
585 v............v
586 v.v..v..v..v.v
587 v............v
588 v............v
589 v.v..v..v..v.v
590 v............v
591 v............v
592 v.v..v..v..v.v
593 v............v
594 v............v
595 v............v
596 vvvvvvvvvvvvvv
597 Bonus:
598 .-..?4.W..2?..
599 .............-
600 j.............
601 j............>
602 <.p..1..1..p.+
603 !.............
604 ..............
605 ?.>..5..l..w.W
606 ..............
607 2............3
608 ..5..?..W..?..
609 c............c
610 ..............
611 3.b..b..b..b.?
612 .............<
613 ~............~
614 ..............
615 wf+0d0+d0!4+f!
616 Level:
617 Daddy
618 Page Sixteen
619 Bricks:
620 vv#k!k!k!k!#vv
621 vv#!k!k!k!k#vv
622 vv#k!k!k!k!#vv
623 EEE!k!k!k!kEEE
624 **#k!k!k!k!#**
625 **#!k!k!k!k#**
626 **#EEE##EEE#**
627 ****#k!!k#****
628 **.*#!kk!#*.**
629 **.*#k!!k#*.**
630 **.*#EEEE#*.**
631 **.*##kk##*.**
632 **..!!##!!....
633 ....!#kk#!....
634 @kk@!!##!!@kk@
635 @kk@!#kk#!@kk@
636 @kk@!!##!!@kk@
637 @@@@!#!!#!@@@@
638 Bonus:
639 .&.00000000.&.
640 .&.00000000.&.
641 .&.00000000.&.
642 ...00000000...
643 jj.00000000.jj
644 jj.00000000.jj
645 jj....ll....jj
646 jjjj4&..&4jjjj
647 jj.j4.&&.4j.jj
648 jj.j4&..&4j.jj
649 jj.j4....4j.jj
650 jj.j44.&44j.jj
651 jj....33......
652 .....3&.3.....
653 3..3..33..3..3
654 3mm3.3.&3.3mm3
655 3mm3++33++3mm3
656 3333+3++3+3333
657 Level:
658 Daddy
659 Page Seventeen
660 Bricks:
661 kkkkkkkkkkkkkk
662 kddddddddddddk
663 kdkkkkkkkkkkdk
664 kdkddddddddkdk
665 kdkdkkkkkkdkdk
666 kdkdkddddkdkdk
667 kdkdkdkkdkdkdk
668 kdkdkdkkdkdkdk
669 kdkdkdkkdkdkdk
670 kdkdkdkkdkdkdk
671 kdkdkdkkdkdkdk
672 kdkdkdkddkdkdk
673 kdkdkdkkkkdkdk
674 kdkdkddddddkdk
675 kdkdkkkkkkkkdk
676 kdkddddddddddk
677 kdkkkkkkkkkkkk
678 kddddddddddddd
679 Bonus:
680 ..............
681 .????????????.
682 .?..........?.
683 .?.????????.?.
684 .?.?333333?.?.
685 .?.?3????4?.?.
686 .?.?3?l5?4?.?.
687 .?.?3?45?4?.?.
688 .?.?3?45?4?.33
689 .?.?3?45?4?333
690 .?.?3?45?4?.3.
691 .?.?3?4??4?.3.
692 .?.?3?4444?.3.
693 .?.?3??????.3.
694 .?.?3.......?3
695 .?.??????????3
696 .?...........3
697 .????????????3
698 Level:
699 Daddy
700 End of Game
701 Bricks:
702 zvyvxvigvxvyvz
703 zvyvxvgivxvyvz
704 zvyvxvigvxvyvz
705 zvyvxvgivxvyvz
706 zvyvxvigvxvyvz
707 zvyvxvgivxvyvz
708 zvyvxvigvxvyvz
709 zvyvxvgivxvyvz
710 zvyvxvigvxvyvz
711 zvyvxvgivxvyvz
712 zvyvxvigvxvyvz
713 zvyvxvgivxvyvz
714 zvyvxvvvvxvyvz
715 zvyvxxxxxxvyvz
716 zvyvvvvvvvvyvz
717 zvyyyyyyyyyyvz
718 zvvvvvvvvvvvvz
719 zzzzzzzzzzzzzz
720 Bonus:
721 ....*4554*....
722 .....4554.....
723 .....4554.....
724 WWWWW4554WWWWW
725 ...*.4554.*...
726 ...*.4554.*...
727 .....4554.....
728 ...++4554++...
729 fffff4554fffff
730 .....4554.....
731 ...--4bb4--...
732 fffff4bb4fffff
733 ....W4444W....
734 ....W.**.W....
735 -.WwwwwwwwwW.-
736 -.W.}}..}}.W.-
737 --{{..cc..{{--
738 }}++......++}}
0 Version: 1.14
1 Level:
2 Johann
3 NitroStart
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 ..............
10 ...!......!...
11 ..............
12 ..............
13 ......**......
14 ..............
15 ..............
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ...5......5...
30 ..............
31 ..............
32 ......00......
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Johann
44 FindEm
45 Bricks:
46 ..............
47 ..............
48 .v..........v.
49 gggggggggggggg
50 ......vv......
51 ....v....v....
52 ..............
53 ...v......v...
54 ..............
55 ......vv......
56 ......vv......
57 ..............
58 fv..ff..ff..vf
59 ..............
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ............}.
68 .j..........j.
69 ......55......
70 ....0....0....
71 ..............
72 ..............
73 ..............
74 ......dd......
75 ..............
76 ..............
77 w....?..?....+
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Johann
85 RC
86 Bricks:
87 ..............
88 ..............
89 .........ggg..
90 ..gg....g..g..
91 ..g.g...g.....
92 ..g.g...g.....
93 ..gg....g.....
94 ..g.g...g..g..
95 ..g.g.*.g..g..
96 ..g.g.g..ggg..
97 ..............
98 e............e
99 gggggggggggggg
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..........l*..
109 ..*.....g.....
110 ..............
111 ........*.....
112 ...?....*.....
113 ..*........m..
114 ..*...j.......
115 ..p.*.0...?*..
116 ..............
117 0............0
118 0?W*W000?ww??0
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Johann
126 Burst
127 Bricks:
128 dddddddddddddd
129 ggdgggdgggdggg
130 gggdggdggdgggd
131 ggggdgdgdggggd
132 dggggdhdggggdg
133 gddddhdhddddgg
134 dggggdhdggggdg
135 ggggdgdgdggggd
136 gggdggdggdgggd
137 ggdgggdgggdggg
138 xyxyxyxyxyxyxy
139 ..............
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 5.....<......5
148 ..4...!...4...
149 **************
150 **************
151 wwwwww~wwwwwww
152 **************
153 **************
154 **************
155 ******>*******
156 wwbwww}wwwbwww
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Johann
167 11-24 22:32
168 Bricks:
169 ..............
170 ....fEjjEf....
171 .iiif@jj@fiii.
172 *..df@jj@fd..*
173 ....f@jj@f....
174 d!!.f@jj@f.!!d
175 ....f@jj@f....
176 *..ifEjjEfi..*
177 ..iiffffffii..
178 bbbbbb..bbbbbb
179 ..............
180 ..............
181 ..............
182 ..............
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ....d.mm.d....
190 .l.W..44..W.w.
191 ....4.bb.4....
192 ....<.**.<....
193 g...c.<<.c...g
194 ......55......
195 ......**......
196 ...?{.ff.{?...
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Johann
208 The Fish
209 Bricks:
210 ..............
211 g...gg..gg....
212 ...g...g...gg.
213 ..g...g...g...
214 .g...b...g...g
215 ....b*b.g.....
216 ...beeeb...b!.
217 ..beveeeb.be!.
218 vEeeeeeee@ee!.
219 vv@eeeee@v@e!v
220 ..v@eee@v.v@!v
221 ...v@e@v...vvv
222 ....v@v.......
223 ..............
224 ..............
225 ..............
226 ..............
227 ..............
228 Bonus:
229 ..............
230 f.............
231 .......?...<d.
232 ..>.......?...
233 .....*...m...~
234 ........?.....
235 ....bwb....?f.
236 ....5..-..?4-.
237 ..}.......44+.
238 .....g.....4-.
239 ............f.
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Johann
249 Sacker
250 Bricks:
251 kkkkk....v....
252 kkkkk...v.....
253 kkkkk..v..hhh.
254 .......v...h.h
255 ....!..vdddh..
256 ....i..djjxd..
257 ....iddjjj.d..
258 ....d!..*..d..
259 ...dcdddddc...
260 ...cic...cic..
261 #@#.c.e#..c.#.
262 eeeeeeeeeeeeee
263 ..............
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 .........!....
271 ........m.....
272 *dw.p.....cd..
273 .............m
274 ..........d...
275 ....s...w.....
276 ....4j..-+.}..
277 ....4......-..
278 ....4.fg..4...
279 ...555...555..
280 .b..4.b...-...
281 .b..w.b.......
282 ..............
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Johann
290 CropCircles
291 Bricks:
292 .....eeee.....
293 ....efhhfe....
294 ...efhEEhfe...
295 ..*fh#!!#hf*..
296 .efh..!!..hfe.
297 kefh..!!..hfek
298 .efh..!!..hfe.
299 .vefh#!!#hfev.
300 ..vefhEEhfev..
301 ...vefhhfev...
302 ....veffev....
303 .....veev.....
304 ......yy......
305 ..............
306 ..............
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ......pp......
312 .....b44b.....
313 ....j4..4j....
314 ..l.4.55.4.~..
315 .!0>..55..<0!.
316 .*0>..55..<0m.
317 .}0>..55..<0{.
318 ..0.4.55.4.0..
319 .....4..4.....
320 ....fj44jf....
321 .....&ww&.....
322 ......WW......
323 ..............
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Johann
331 ServoSaver
332 Bricks:
333 ..............
334 ..........j...
335 ........cc!cc.
336 ..........j...
337 ..........j...
338 ..bbbbbbbbbbb.
339 .#bcccccccccb#
340 ..bc*******cb.
341 ..bc*******cb.
342 hhbc*******cb.
343 ddbcccccccccb.
344 ..bbbbbbbbbbb.
345 ..............
346 ..............
347 ..............
348 ..............
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..........*...
354 ........f}j}f.
355 ..........w...
356 ..........w...
357 ..c.........c.
358 ......g.....<.
359 ..>.224555l...
360 ..>.22l5555<..
361 55..22b5555...
362 ff..!..g..~...
363 ..w<.<........
364 ..............
365 ..............
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Johann
372 ShortWave
373 Bricks:
374 k.k.g.k......k
375 .k.gig.k....k.
376 g.gi!ig.k..k.g
377 igi!*!ig.kk.gi
378 !i!*!*!ig..gi!
379 *!*!i!*!iggi!*
380 !*!igi!*!ii!*!
381 i!igbgi!*!!*!i
382 gigbvbgi!**!ig
383 bgbvkvbgi!!igb
384 vbvk.kvbgiigbv
385 kvk...kvbggbvk
386 .k.....kvbbvk.
387 ........kvvk..
388 .........kk...
389 ..............
390 ..............
391 ..............
392 Bonus:
393 ....l.........
394 ..............
395 ..............
396 .....g........
397 .W..........?.
398 ..............
399 ....}.....&...
400 ...?..j...?...
401 .{..l.........
402 ?..~0c........
403 b.w0.0c...s?.w
404 0l0...0!.....0
405 .0.....0g..w0.
406 ........0..0..
407 .........00...
408 ..............
409 ..............
410 ..............
411 Level:
412 Johann
413 Really Simple
414 Bricks:
415 **************
416 *############*
417 *#************
418 *#*ggggggggggg
419 *#*g**********
420 *#*g*gggggggg*
421 *#*g*g********
422 *#*g*g*ggggggg
423 *#*g*g********
424 *#*g*ggggggggg
425 *#*g**********
426 *#*gggggggggg*
427 *#************
428 i#############
429 ..............
430 ..............
431 ..............
432 ..............
433 Bonus:
434 00000000000000
435 0............0
436 0.000000000000
437 0.000000000000
438 0.000000000000
439 0.000000000000
440 0.00000j000000
441 0.000000000000
442 0.000000000000
443 0.000000000000
444 0.000000000000
445 0.000000000000
446 0.000000000000
447 5.............
448 ..............
449 ..............
450 ..............
451 ..............
452 Level:
453 Johann
454 Missing Link
455 Bricks:
456 v..vvvvvvv.vv.
457 vv.vvvvvv.vvv.
458 v.vvv.vvv.vv.v
459 v..vvvvvv.vvvv
460 ..............
461 .v..v.vv...v.v
462 .v..v.v.v..v.v
463 .v..v.v.v..vv.
464 .v..v.v..v.v.v
465 .v..v.v..v.v.v
466 .vv.v.v..v.v.v
467 ..............
468 xxxxxxxxxx.xxx
469 bbb.bbbbbbbbbb
470 !!!!!!!!!!.!!!
471 eee.eeeeeeeeee
472 dddddddddd.ddd
473 ..............
474 Bonus:
475 ....{.........
476 ......5.?.}...
477 5..W.........?
478 .....-..}..5.W
479 ..............
480 .j..1.d.......
481 ......5....5..
482 .?..W.j.d..5..
483 .b..?....?.{..
484 ......&..5...+
485 .{..5......&..
486 ..............
487 1....{..b..+.1
488 .<-.....1w.}.s
489 ....5b..+...&.
490 .*.......-.*..
491 ............5{
492 ..............
493 Level:
494 Johann
495 Sny
496 Bricks:
497 iiciiciicicici
498 iciciccicicici
499 iciiiciccicici
500 iiciicicciccci
501 iiiciciiciiici
502 iciciciiciiici
503 iiciiciiciccii
504 iiiiiiiiiiiiii
505 eeeeeeeeeeeeee
506 kkkkkkkkkkkkkk
507 EkEkEkEkEkEkEk
508 kkkkkkkkkkkkkk
509 **************
510 **************
511 gggggggggggggg
512 dddgdddgdddgdd
513 d.dgd.dgd.dgd.
514 d.ddd.ddd.ddd.
515 Bonus:
516 ..4..4..4.4.4.
517 .4.4.44.4.4.4.
518 .4...4.44.4.4.
519 ..4..4.44.444.
520 ...4.4..4...4.
521 .4.4.4..4...4.
522 ..4..4..4.44..
523 ..>.....m.....
524 ..............
525 ..............
526 ..............
527 ..............
528 <<<<<<<<<<<<<<
529 .WWWWWWWWWWWW.
530 d.{{{.fj.{{{..
531 .?...?...?...?
532 ..............
533 ..............
534 Level:
535 Johann
536 ToothPick
537 Bricks:
538 dddccccccccddd
539 ddckkkkkkkkcdd
540 dckxxxxxxxxkcd
541 ckxhhhhhhhhxkc
542 kxhhhhhhhhhhxk
543 xhhhhhhhhhhhhx
544 !xhhhhhhhhhhx!
545 ..xhhhhhhhhx..
546 ...xxxxxxxx...
547 ...#......#...
548 ..............
549 ..............
550 ......**......
551 ..............
552 ..............
553 ..............
554 ..............
555 ..............
556 Bonus:
557 .............m
558 ..............
559 .....dddd.....
560 ...55555555...
561 ..?5......5...
562 &.?5w.....5.l.
563 ..?5!.....5..~
564 ...55555555...
565 ..............
566 ..............
567 ..............
568 ..............
569 ......jw......
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Johann
577 Justalevel
578 Bricks:
579 ..............
580 .k.k.k.k.k.k..
581 !!!!!!!!!!!!!!
582 k.k.k.k.k.k.k.
583 ..............
584 k###kkkkkk###k
585 vvvvvvvvvvvvvv
586 vvvvvvvvvvvvvv
587 k###kkkkkk###k
588 ..............
589 ..............
590 !!!!!.........
591 gggg!!!!!!!!!!
592 dddggggggggggg
593 **dddddddddddd
594 .************d
595 ............**
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ..............
601 ..............
602 ..............
603 ....444444....
604 d&&m......m&&d
605 d&&&......&&&d
606 ......WW......
607 ..............
608 ..............
609 ..............
610 ..............
611 ..............
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Johann
618 justanotherlevel
619 Bricks:
620 ..............
621 ..............
622 ..............
623 gggggggggggggg
624 ccccc!vv!ccccc
625 kkkk@vvvv@kkkk
626 kkkk@vvvv@kkkk
627 kkkk@vvvv@kkkk
628 @@@@@vvvv@@@@@
629 hhhhhhhhhhhhhh
630 dddddddddddddd
631 gggggggggggggg
632 !...vixxiv...!
633 ...vi....iv...
634 ..vi......iv..
635 .vi........iv.
636 vi..........iv
637 i............i
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 ......55......
644 .s...5555....c
645 ......-+...<..
646 ..........?...
647 ..............
648 ..............
649 ....}.........
650 .b.....j....b.
651 ......gf......
652 ....2....2....
653 ..............
654 ..............
655 ..............
656 w............~
657 Level:
658 Johann
659 Purplepeopleeater
660 Bricks:
661 ..............
662 ...cccccccccxi
663 dddc*******cxi
664 dddccccccc*cxi
665 dddkkkkkic*cxi
666 dddk#@#kic*cxi
667 ...k#@#kic*cxi
668 kkkkkkkkic*cxi
669 cckiiiiiic*cxi
670 *ccccccccc*cxi
671 ***********cxi
672 ccccccccccccxi
673 xxxxxxxxxxxxx!
674 iiiiiiiiiiiii!
675 !!!!!!!!!!!!!!
676 hhhhhhhhhhhhhh
677 hhhhhhhhhhhhhh
678 ..............
679 Bonus:
680 ..............
681 ...1jjjjjj...*
682 5551..........
683 5551555555....
684 555.....l5....
685 555......5....
686 .........5....
687 .........5....
688 55p...{.W5....
689 .555555555....
690 ..............
691 j.............
692 ......>.......
693 ..}.?.w.?.}.W.
694 ..............
695 g+..........w>
696 .....f<d......
697 ..............
698 Level:
699 Johann
700 NoMoney
701 Bricks:
702 cccccccccccccc
703 c............c
704 c..h.....h...c
705 c..e.....e...c
706 c.ehe...ehe..c
707 c.eh....eh...c
708 c..e.....e...c
709 c..he....he..c
710 c.ehe...ehe..c
711 c..e.....e...c
712 c..h.....h...c
713 cccccccccccccc
714 xxxxxxxxxxxxxx
715 ..............
716 ..............
717 ..............
718 ..............
719 ..............
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ..............
727 ..............
728 ..............
729 ..............
730 ..............
731 ..............
732 ..............
733 ..............
734 ..............
735 ..............
736 ..............
737 ..............
738 ..............
739 Level:
740 Johann
741 BonHomme
742 Bricks:
743 g.g.g.g.g.g.g.
744 .d.d.d.d.d.d.d
745 g.g.g.g.g.g.g.
746 .d.d.d.d.d.d.d
747 g.g.g.g.g.g.g.
748 .d.d.d.d.d.d.d
749 g.g.g.g.g.g.g.
750 .d.d.d.d.d.d.d
751 g.g.g.g.g.g.g.
752 .d.d.d.d.d.d.d
753 g.g.g.g.g.g.g.
754 .d.d.d.d.d.d.d
755 g.g.g.g.g.g.g.
756 .d.d.d.d.d.d.d
757 g.g.g.g.g.g.g.
758 .d.d.d.d.d.d.d
759 g.g.g.g.g.g.g.
760 ..............
761 Bonus:
762 4.4.4.4.4.4.4.
763 ..............
764 ..............
765 ..............
766 ......g...j...
767 .c.w.c.c.~....
768 ....j.........
769 .........d....
770 ..g...g...g...
771 ..............
772 ......j.......
773 ...}..........
774 ......g.......
775 ..............
776 &.f.f.f.f.f.f.
777 .<............
778 0.0.0.0.0.0.0.
779 ..............
780 Level:
781 Johann
782 What?
783 Bricks:
784 ..............
785 ..............
786 ..............
787 ..............
788 vvvvvvvvvvvvvv
789 ..v...v..v...v
790 ..v...v..v...v
791 vvvvvvvvvvvvvv
792 ..............
793 vvvvvvvvvvvvvv
794 v............v
795 v............v
796 vvvvvvvvvvvvvv
797 ..............
798 ..............
799 ..............
800 ..............
801 ..............
802 Bonus:
803 ..............
804 ..............
805 ..............
806 ..............
807 ??????????????
808 ..?...?..?...?
809 ..?...?..?...?
810 ??????????????
811 ..............
812 ??????????????
813 ?............?
814 ?............?
815 ??????????????
816 ..............
817 ..............
818 ..............
819 ..............
820 ..............
821 Level:
822 Johann
823 Wingnut
824 Bricks:
825 @@@@@@@@@@@@@@
826 @.....**.....@
827 @.....**.....@
828 @.@@@@@@@@@@.@
829 ..............
830 ..............
831 .jjj......jjj.
832 jjjjj....jjjjj
833 jjjjjj..jjjjjj
834 jjjjjjjjjjjjjj
835 .jjjjj@@jjjjj.
836 ..jjjj@@jjjj..
837 ...jjjjjjjj...
838 ......jj......
839 .....jjjj.....
840 ...jjjjjjjj...
841 ...cccccccc...
842 ..............
843 Bonus:
844 ..............
845 ......55......
846 ......55......
847 ..............
848 ..............
849 ..............
850 ..c...........
851 ...{........~.
852 ..c.~g..g.....
853 b.....d<..!..f
854 .?..?....{....
855 ...c......~...
856 ..............
857 ..............
858 .......s......
859 ..........c...
860 ..........-...
861 ..............
862 Level:
863 Johann
864 Michelle
865 Bricks:
866 hhhhhhhhhhhhhh
867 h............h
868 h............h
869 h.jjjjjjjjjj.h
870 h.##########.h
871 h.vvvvvvvvvv.h
872 h............h
873 h.v........v.h
874 ###g......g###
875 ...g......g...
876 ...gggggggg...
877 .##k######k##.
878 ..kkkkkkkkkk..
879 ..............
880 ..............
881 ..............
882 ..............
883 ..............
884 Bonus:
885 *444444444444l
886 4............4
887 4............4
888 4.3333333333.4
889 4............4
890 4.2222222222.4
891 4............4
892 4.2........2.4
893 ...1......1...
894 ...1......1...
895 ...11111111...
896 ..00......00..
897 ..0000000000..
898 ..............
899 ..............
900 ..............
901 ..............
902 ..............
903 Level:
904 Johann
905 Cold Turkey
906 Bricks:
907 ee...........e
908 ee...........e
909 ee.h@h.......e
910 ee.@@@x......e
911 ee.h@@@@@v...e
912 ee..x@@@@iv..e
913 ee...@@@@i*@.e
914 ee...@@@@ii@.e
915 ee...@iii*i@.e
916 ee...@i*ii*@.e
917 ee....@@@@@..e
918 ee...........e
919 ee...........e
920 ee...........e
921 ee...........e
922 ee...........e
923 ee...........e
924 ee...........e
925 Bonus:
926 ff...........f
927 jf...........f
928 jf...........f
929 jf....m......f
930 jf...........f
931 jf..l........f
932 jf...........f
933 jf...........f
934 ww....555....w
935 00....5.5....!
936 b0...........d
937 b0...........<
938 b0...........<
939 00...........<
940 0>...........f
941 0f...........f
942 0f...........f
943 00...........f
0 Version: 1.00
1 Level:
2 Leo Gruyters
3 Soft Start
4 Bricks:
5 ..............
6 ..............
7 ajjjjjjjjjjjja
8 ja@gggggggg@aj
9 jgav@v@@v@vagj
10 jgva......avgj
11 jg@.avEEva.@gj
12 jgv.vaaaav.vgj
13 jg@.Ea**aE.@gj
14 jg@.Ea**aE.@gj
15 jgv.vaaaav.vgj
16 jg@.avEEva.@gj
17 jgva......avgj
18 jgav@v@@v@vagj
19 ja@gggggggg@aj
20 ajjjjjjjjjjjja
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..m..b..b..m..
27 ..............
28 >..g..mm..g..>
29 .b..........b.
30 1...j....j...1
31 .~....lg....~.
32 ..}...55...{..
33 f.....55.....f
34 .w..........w.
35 >.?........?.>
36 1-..........-1
37 .*..........*.
38 0..0..00..0..0
39 ..~.-.ff.-.~..
40 ..............
41 ..............
42 Level:
43 Leo Gruyters
44 Nuclear
45 Bricks:
46 .....gggg.....
47 ....gg**g.....
48 ...gg*gg*gg...
49 ..gg*gggg*gg..
50 .gg*ggddgg*gg.
51 gg*ggeeeegg*gg
52 g*ggbbbbbbgg*g
53 *gg#@hhhh@#gg*
54 *gffffffffffg*
55 *giiddddddiig*
56 *gddddddddddg*
57 *gggggddggggg*
58 g*gggjddjggg*g
59 gg**ggjjgg**gg
60 gggg*!jj!*gggg
61 @@vvEj@@jEvv@@
62 ..............
63 ..............
64 Bonus:
65 .....ffff.....
66 ....ff00f.....
67 ...ff0~~0ff...
68 ..fw0~dd~0wf..
69 .ff0~d55d~0ff.
70 ff0~d.ff.d~0ff
71 w0~.j3333g.~0w
72 0~...f..f...~0
73 0............0
74 0.4..p-.-m.4.0
75 0.f........f.0
76 0.+..+bb+..+.0
77 ~0..........0~
78 w~00~.....00~w
79 ..~~0-..-0~~..
80 ..w4.>..>.4w..
81 ..............
82 ..............
83 Level:
84 Leo Gruyters
85 Mine
86 Bricks:
87 ..............
88 .ffffffffffff.
89 .@@@@@bb@@@@@.
90 .iiii#bb#iiii.
91 .bbbb#bb#bbbb.
92 .Ekfb#bb#bfkE.
93 .Ekeb#bb#bekE.
94 .Ekeb#bb#bekE.
95 .Eke@#bb#@ekE.
96 .Eke@#bb#@ekE.
97 .Ekej#bb#jekE.
98 .#####bb#####.
99 .EEEEEaaEEEEE.
100 .aaaaaaaaaaaa.
101 .aaaaaaaaaaaa.
102 .############.
103 .############.
104 ..............
105 Bonus:
106 ..............
107 ..4.4m44}4.4..
108 .0?0w0?0?040?.
109 .~..........~.
110 .0~...p....~0.
111 ..0.m...m.....
112 ..............
113 ....g.5..{....
114 ..............
115 ..............
116 ....*....*....
117 ..............
118 ..0w..jj..w0..
119 .fm.mf..fm.mf.
120 .sb-.++++.-bs.
121 .+???+??+???+.
122 ..............
123 ..............
124 Level:
125 Leo Gruyters
126 Volcano
127 Bricks:
128 ..............
129 gggEjjjjjjEggg
130 ggggjjjjjjgggg
131 gggg!EjjEggggg
132 ggggggjjgggggg
133 aaaaa!**!aaaaa
134 aaa..!**!..aaa
135 aa...!@@!...aa
136 a....!@@!....a
137 .....v@@v.....
138 ....va@@av....
139 ...va#EE#av...
140 ..va#E###Eav..
141 .va########av.
142 vaE#E#EEE#E#av
143 a############a
144 #ffffffffffff#
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..*2.m..m.2*..
150 .2..l....g..2.
151 ..p........p..
152 ......55......
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..-.~f..f~.-..
163 .>m+..mm..+>m.
164 ..............
165 Level:
166 Leo Gruyters
167 Ufo
168 Bricks:
169 ..............
170 ..............
171 ......zz......
172 .....zjjz.....
173 ....zj**jz....
174 ...xjEddEjx...
175 ..xjddddddjx..
176 .xjeeeeeeeejx.
177 xjhaahhhhaahjx
178 jhEEahEEhaEEhj
179 zjhaahhhhaahjz
180 .zjEeeeeeeEjz.
181 ..zjddddddjz..
182 ...@jddddj@...
183 ...@vj**jv@...
184 ...@.vjjv.@...
185 ...@.v@@v.@...
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ......55......
192 ..............
193 ..............
194 ...-p.ww.p-...
195 ..>~......~>..
196 .0m.f.**.f.m0.
197 00...g..l...00
198 .0+3......3+0.
199 ..3.bf..fb.3..
200 .....2ff2.....
201 ......44......
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Leo Gruyters
208 Staircase
209 Bricks:
210 ..............
211 ..............
212 .!E...........
213 ..!#..........
214 ...!E.........
215 ..!.!#........
216 .!E!.!E.......
217 ..!.!.!#......
218 ...!E!.!E.....
219 ..!.!.!.!#....
220 .!#!.!E!.!E...
221 !.!.!.!.!.!#..
222 .!.!#!.!E!.!E.
223 !.!.!.!.!.!.!#
224 .!#!.!#!.!E!.!
225 ..!...!...!...
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..m...........
231 .3.2..........
232 ....2.........
233 ...2.m........
234 ......2.......
235 .3.3.w.2......
236 ......5.m.....
237 ...1.3.1.2....
238 ....*.....2...
239 .~...~.3.~.m..
240 b.+.w.+.*.+.2.
241 ...1.....1.2.2
242 ..>...>.3.>.3.
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Leo Gruyters
249 Alien City
250 Bricks:
251 ..............
252 ......EE......
253 .....a##a.....
254 ....aaEEaa....
255 ....@j##j@....
256 ..E.@aEEa@....
257 .aaa@a##a@.E..
258 .ea#@jEEj@aaa.
259 .ej#@a##a@#ae.
260 .ea#@aEEa@#je.
261 .ea#@a##a@#ae.
262 .ea#@aEEa@#ae.
263 .ea#@EkkE@#ae.
264 .ea#EkkkkE#ae.
265 .ea#eeeeee#ae.
266 .eaeeeeeeeeae.
267 .effffffffffe.
268 #ffff....ffff#
269 Bonus:
270 ..............
271 ..............
272 ..............
273 .....5..5.....
274 .....m..m.....
275 ..............
276 ..5..?..?.....
277 .b...m..m..5..
278 .mm.........b.
279 .b...W..W..mm.
280 .m...>..>...b.
281 .b2........2m.
282 .m....mm....b.
283 .b}........{m.
284 ....g1.1.j..b.
285 .w...wmmw...w.
286 ..~f4~f4~f4~..
287 ..2+>.....>2..
288 Level:
289 Leo Gruyters
290 Evil Bricks
291 Bricks:
292 ...j#@@@@#j...
293 a.a.j#@@#j.a.a
294 a.#a.j##j.a#.a
295 a.##a.jj.a##.a
296 a.@##a..a##@.a
297 ..j###aa###j..
298 ...j@####@j...
299 ....j####j....
300 .....j##j.....
301 .....j##j.....
302 ....j####j....
303 ...j@####@j...
304 ..j###aa###j..
305 a.@##a..a##@.a
306 a.##a....a##.a
307 a.#a......a#.a
308 a.a........a.a
309 ..............
310 Bonus:
311 ...1{~ff~{1...
312 5.g.lf~~fl.s.5
313 5..}.*{{*.}..5
314 4.{.?.11.?.{.4
315 4.f{.?..?.{f.4
316 ..+~{.??.{~+..
317 ...mf{{{{fm...
318 ....+~..~+....
319 .....+~~+.....
320 .....m~~m.....
321 ....+~..~+....
322 ...mf{{{{fm...
323 ..+~{.--.{~+..
324 +.f{.w..w.{f.+
325 -.{.+....+.{.-
326 +............+
327 -............-
328 ..............
329 Level:
330 Leo Gruyters
331 Black Hole
332 Bricks:
333 ..............
334 .!!keEEEEek!!.
335 .!kk******kk!.
336 .dekkeggekked.
337 .dekkggggkked.
338 .dee######eed.
339 .dee#aaaa#eed.
340 .deE#avva#Eed.
341 .deE#avva#Eed.
342 .deE#avva#Eed.
343 .deE#avva#Eed.
344 .dee#aaaa#eed.
345 .dee######eed.
346 .dekkggggkked.
347 .dekkeggekked.
348 .!kk******kk!.
349 .!!keEEEEek!!.
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ..3.ffffff.3..
355 .W..111111..W.
356 ...wmmmmmmw...
357 .~.*......*.~.
358 .>....l!....>.
359 .fg..!55!...f.
360 ..f...55...f..
361 ......55......
362 .fp...55...jf.
363 .>00......00>.
364 ..............
365 .W*~000000~*W.
366 ..+.wffffw.+..
367 .-..-.+..-..-.
368 ..............
369 ..............
370 Level:
371 Leo Gruyters
372 Finale
373 Bricks:
374 ..............
375 **************
376 *EEE**********
377 **E*E****E****
378 **E*E***E***E*
379 **E*EE**EE****
380 **E*EjEjE*****
381 **E*E*E**E****
382 **j***********
383 **j***********
384 **EEE*******E*
385 **E***E*****E*
386 **E***EE****E*
387 **EE**E*E**EE*
388 **E***E*E*E*E*
389 **E***E*E*E*E*
390 **EEE*E*E**EE*
391 ****j*j*******
392 Bonus:
393 ..............
394 55555555555555
395 5...5555555555
396 55.5.5555.5555
397 55.5.555.555.5
398 55.5..55..5555
399 55.5.5.5.55555
400 55.5.5.55.5555
401 55555555555555
402 gggggggggggggg
403 }}...}}}}}}}.}
404 ..............
405 ..............
406 ..............
407 ..............
408 ..............
409 ..............
410 ..............
0 Level:
1 Lourens
2 Barriers (warmup)
3 Bricks:
4 ##############
5 ##############
6 ##############
7 ##############
8 ##############
9 ##############
10 ##############
11 ..............
12 .dd...ff...gg.
13 .dd...ff...gg.
14 .jj...ii...hh.
15 .jj...ii...hh.
16 ..............
17 ccjjccjjccjjcc
18 ..............
19 ..............
20 ..............
21 jccccccccccccc
22 Bonus:
23 ..............
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 .>............
32 ......+....b..
33 .+............
34 .......>....j.
35 ..............
36 ..>..1.>.1..3.
37 ..............
38 ..............
39 ..............
40 >>+....b..+...
41 Level:
42 Lourens
43 Speedy clearance
44 Bricks:
45 j###.###j.j##j
46 ####.####.####
47 #jjj.#jj#.#jj#
48 ###j.####.####
49 j###.###j.###j
50 jjj#.#jjj.#jjj
51 ####.#jjj.####
52 ###j.#jjj.j##.
53 jjjj.jjjj.jjj.
54 jEEj.#EEj.#EE.
55 #EE#.#EE#.#EE.
56 #jj#.#jj#.###.
57 ####.#jj#.###.
58 ###j.#jj#.j#j.
59 #jjj.#jj#.jjj.
60 ####.####.j#j.
61 j##j.###j.j#j.
62 cccccccccccccc
63 Bonus:
64 ..........*...
65 ..............
66 .m............
67 ..............
68 ..............
69 b*....b.....b.
70 ..............
71 ...b..m.......
72 .m.........m..
73 ..............
74 ..............
75 ......m.......
76 ..............
77 .......b......
78 .*b...........
79 ..............
80 ..............
81 ...+>+cc+>+...
82 Level:
83 Lourens
84 Frostbite
85 Bricks:
86 ##############
87 ##############
88 ##############
89 ##############
90 ##############
91 ##############
92 ##############
93 ##############
94 ##############
95 gjjjggjjggjjjg
96 cjjjjjjjjjjjjj
97 cjjjjjjjjjjjjj
98 jj..jjj.jj.jjj
99 j....j..jj..jj
100 j....j..j....j
101 j.......j....j
102 j.............
103 j.............
104 Bonus:
105 ..............
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ff>.f+>f+f>>ff
115 {.f.+.f.+>{f>{
116 ff>+.f>{ff.fff
117 .>..>f>..+..>f
118 f.......>...+.
119 >....f..f....f
120 +............>
121 f.............
122 +.............
123 Level:
124 Lourens
125 Well protected goodies
126 Bricks:
127 jdehfgidehfgij
128 cccccccccccccc
129 ..............
130 ..............
131 v##v#v##v#v##v
132 ..............
133 ..............
134 cccccccccccccc
135 jjjjjjjjjjjjjj
136 **************
137 jjjjjjjjjjjjjj
138 jcjcjcjcjcjcjc
139 cjcjcjcjcjcjcj
140 jcjcjcjcjcjcjc
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 j543210012345j
147 b.b.b.b.b.b.b.
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ~c~d>-cfcf>dcc
155 ..............
156 ddc--dc-c--f>>
157 f.>.c.>.~.f.>.
158 .c.f.~.f.c.~.c
159 ~.>.c.c.~.>.f.
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Lourens
166 Faster, Faster!
167 Bricks:
168 ..............
169 ..............
170 @@.@@@..@@.@@@
171 @..@.@.@....@.
172 @@.@@@..@...@.
173 @..@.@...@..@.
174 @..@.@.@@...@.
175 ..............
176 EE.EEE..EE.EEE
177 E..E.E.E....E.
178 EE.EEE..E...E.
179 E..E.E...E..E.
180 E..E.E.EE...E.
181 ..............
182 ..............
183 ##############
184 cccccchhcccccc
185 cccccccccccccc
186 Bonus:
187 ..............
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 5.w.>+..+>.w.5
204 +>44++>>++44>+
205 Level:
206 Lourens
207 Kept in the dark
208 Bricks:
209 jv..v.jj.v...j
210 .v.v....vv..v.
211 .v...vvvv.vv..
212 v...v........v
213 v.......vvv..v
214 .v.v.v.....v.v
215 ..v....vv.....
216 .v..v...v...v.
217 vvv..v...vv.v.
218 ..vv..........
219 ..vv..v.v.v..v
220 v.v..v..vv..vv
221 v...v.........
222 .v........vvv.
223 .vv..vvvv.v...
224 bbaaabbbbaaabb
225 dddddddddddddd
226 **************
227 Bonus:
228 .d..d....d....
229 .d.d....dd..d.
230 .d...-ddd.dd..
231 d...d........d
232 d.......d-d..f
233 .d.f.d.....d.d
234 ..d....dd.....
235 .d..d...f...d.
236 -dd..d...dd.d.
237 ..fd..........
238 ..fd..d.d.d..-
239 d.d..-..dd..dd
240 d...d.........
241 .d........dfd.
242 .dd..d-dd.d...
243 >>>>>>>>>>>>>>
244 dddddddddddddd
245 ..............
246 Level:
247 Lourens
248 Killer
249 Bricks:
250 hhhhhhhhhhhhhh
251 **************
252 hhhhhhhhhhhhhh
253 **************
254 ..............
255 ####.####.####
256 ..............
257 ..............
258 .@#@##@@##@#@.
259 ..............
260 ..............
261 #*###@##@###*#
262 *a@aa#aa#aa@a*
263 cc#*a#**#a*#cc
264 ..............
265 ..............
266 ##b##b##b##b##
267 @@.@@.@@.@@.@@
268 Bonus:
269 55555555555555
270 ..............
271 55555555555555
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 .>.>......>.>.
281 >..>......>..>
282 ...>..>>..>...
283 ..............
284 ..............
285 ..{..{..{..{..
286 ..............
287
0 Version: 1.00
1 Level:
2 houghi
3 Cold fusion
4 Bricks:
5 *vvvvvvvvvvvvv
6 **************
7 vvvvvvvvvvvvv*
8 **************
9 *vvvvvvvvvvvvv
10 **************
11 vvvvvvvvvvvvv*
12 **************
13 *vvvvvvvvvvvvv
14 **************
15 vvvvvvvvvvvvv*
16 **************
17 *vvvvvvvvvvvvv
18 **************
19 vvvvvvvvvvvvv*
20 **************
21 *vvvvvvvvvvvvv
22 **************
23 Bonus:
24 ffffffffffffff
25 ffffffffffffff
26 ffffffffffffff
27 ffffffffffffff
28 ffffffffffffff
29 ffffffffffffff
30 ffffffffffffff
31 ffffffffffffff
32 ffffffffffffff
33 ffffffffffffff
34 ffffffffffffff
35 ffffffffffffff
36 ffffffffffffff
37 ffffffffffffff
38 ffffffffffffff
39 ffffffffffffff
40 ffffffffffffff
41 fffwffffffffff
42 Level:
43 houghi
44 Let them blow first
45 Bricks:
46 *.............
47 .*************
48 *.............
49 .*************
50 *.............
51 .*************
52 *.............
53 .*************
54 *.............
55 .*************
56 *.............
57 .*************
58 *.............
59 .*************
60 *.............
61 E*E*E*EE*E*E*E
62 *E*E*E**E*E*E*
63 !!!!!!!!!!!!!!
64 Bonus:
65 j.............
66 .fffffffffffff
67 f.............
68 .ggggggggggggg
69 g.............
70 .ddddddddddddd
71 d.............
72 .bbbbbbbbbbbbb
73 b.............
74 .ppppppppppppp
75 p.............
76 .~~~~~~~~~~~~~
77 ~.............
78 ..............
79 ..............
80 ..............
81 ..............
82 --------------
83 Level:
84 houghi
85 Ready
86 Bricks:
87 ..............
88 ..............
89 ..............
90 ..............
91 ..............
92 ..............
93 ..............
94 ..............
95 ..............
96 ......f.......
97 ..............
98 ..............
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 houghi
126 Aim
127 Bricks:
128 ..............
129 ..............
130 ..............
131 ..............
132 ..............
133 ..............
134 ..............
135 ..............
136 ..............
137 ......y.......
138 ..............
139 ..............
140 ..............
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 houghi
167 Fire
168 Bricks:
169 vvvvvvvvvvvvvv
170 ..............
171 ..............
172 ..............
173 ..............
174 ..............
175 ..............
176 ......v.......
177 .....vvv......
178 .....v*v......
179 ..............
180 ..............
181 ..............
182 ..............
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ...p.........p
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ......p.......
196 .....pfp......
197 .....w.w......
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 houghi
208 Blue is nice
209 Bricks:
210 .@.x......x.@.
211 .@.x......x.@.
212 .@.x......x.@.
213 ..@E......E@..
214 ..@EeeeeeeE@..
215 ...@Eddddd@...
216 ...@EggggE@...
217 ....@EvvE@....
218 .....@EE@.....
219 ......@@......
220 ..............
221 ..............
222 ..............
223 ..............
224 ..............
225 vvvvvvvvvvvvvv
226 **************
227 vvvvvvvvvvvvvv
228 Bonus:
229 ...f......f...
230 ...f......f...
231 ...f......f...
232 ..............
233 ....ffffff....
234 .....fffff....
235 .....ffff.....
236 ......jj......
237 ..............
238 ..............
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 bbbbbbmbbbbbbb
245 bbbbbbbbbbbbbb
246 wwwwwwwwwwwwww
247 Level:
248 houghi
249 Vada Voom
250 Bricks:
251 ..............
252 .aaabbbcccjjj.
253 .aaabbbcccjjj.
254 .aaabbbcccjjj.
255 .aaabbbcccjjj.
256 .xxxyyyzzzfff.
257 .xxxyyyzzzfff.
258 .xxxyyyzzzfff.
259 .xxxyyyzzzfff.
260 .***dddeeehhh.
261 .***dddeeehhh.
262 .***dddeeehhh.
263 .***dddeeehhh.
264 ..............
265 ..............
266 vvvvvvvvvvvvvv
267 vvvvvvvvvvvvvv
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ..............
276 ..............
277 ..............
278 ..............
279 ..............
280 ..............
281 ..............
282 ..............
283 ..............
284 ..............
285 **************
286 w..w..ww..w..w
287 ..............
288 Level:
289 houghi
290 Wonder why.
291 Bricks:
292 .e...z....b...
293 ..e...z...b...
294 ......z...b...
295 ...e...z...b..
296 c...e..z...b..
297 .c...e..z..b..
298 ..c...e.z..b..
299 ...c.....z..b.
300 ....c..e.z..b.
301 .....c..e.z.b.
302 ......c...z.b.
303 ff.....c.e.z.b
304 ..ff....c.ez.b
305 ....ff...c.ezb
306 ......ff..c.zb
307 kkkk....ff.c.z
308 ....kkkk..ffcz
309 ........kkkkff
310 Bonus:
311 .m............
312 ..m...........
313 ..............
314 ...*..........
315 ....*.........
316 .....b........
317 ......b.......
318 ..............
319 .......w......
320 ........w.....
321 ..............
322 .........p....
323 ..........p...
324 ...........j..
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 houghi
331 Now! This! Is! It!
332 Bricks:
333 aacaaaccaaacaa
334 baaabaaaabaaab
335 ......vv......
336 @@@..@@@@..@@@
337 ..............
338 vvvvvvvvvvvvvv
339 ..*..*..*..*..
340 ..............
341 ##....##....##
342 ..............
343 ..!..!..!..!..
344 ...vv....vv...
345 ..e..EEEE..e..
346 vv..........vv
347 ..z..z..z..z..
348 ...e......e...
349 .e....ee....e.
350 e...e....e...e
351 Bonus:
352 0.&.0.**.0.&.0
353 w.0.p.bb.p.0.w
354 ......ll......
355 ..............
356 ..............
357 ..............
358 ..f..{..{..f..
359 ..............
360 ..............
361 ..............
362 ...*.3..3.*...
363 ......mm......
364 ..............
365 ..............
366 ..<..>..>..<..
367 ...f......f...
368 .1....--....1.
369 w...+....+...w
370 Level:
371 houghi
372 Get the hostages out.
373 Bricks:
374 ..............
375 .EEE......EEE.
376 .EeE......EeE.
377 .E.E......E.E.
378 .EgE......EgE.
379 .....gggg.....
380 .....g..g.....
381 .....g..g.....
382 .....gddg.....
383 .EEE......EEE.
384 .EeE......EeE.
385 .E.E......E.E.
386 .EgE......EgE.
387 .....gggg.....
388 .....g..g.....
389 .EEE.g..g.EEE.
390 .....gxxg.....
391 ..............
392 Bonus:
393 ..............
394 ..............
395 ..b........b..
396 ..............
397 ..w........w..
398 .....fccf.....
399 ..............
400 ..............
401 .....sjjs.....
402 ..............
403 ..b........b..
404 ..............
405 ..w........w..
406 .....f..f.....
407 ..............
408 ..............
409 .....jggj.....
410 ..............
411 Level:
412 houghi
413 Ready
414 Bricks:
415 v*v.v*v...v*v.
416 vvv.vvvvv.vvv.
417 ......v*v..vvv
418 vvvvvvvvvvvv*v
419 v*vv*v.vvv*vvv
420 vvvvvvvv*vvvvv
421 ..vvvvvvvv*vv*
422 ..v*vv*v.vvvvv
423 ..vvvvvv......
424 vvv...v*v.vvv.
425 v*vvvvvvv.v*v.
426 vvvv*v....vvv.
427 ....vvvvvv....
428 ....v*vv*v....
429 .vvvvvvvvvvvvv
430 .v*v.....v*vv*
431 vvvv.....vvvvv
432 *v............
433 Bonus:
434 ..............
435 .......b......
436 ..............
437 .w..w.....w...
438 ..............
439 .............j
440 ...b..j.......
441 ..............
442 .......w......
443 .j.........b..
444 ....j.........
445 ..............
446 .....w..b.....
447 ..............
448 ..w.......b..b
449 ..............
450 ..............
451 ..............
452 Level:
453 houghi
454 Bouncy Wall
455 Bricks:
456 @@@@@@@@@@@@@@
457 @aaaaaaaaaaaa@
458 @............@
459 @dddddddddddd@
460 @............@
461 @eeeeeeeeeeee@
462 @............@
463 @hhhhhhhhhhhh@
464 @............@
465 @ffffffffffff@
466 @............@
467 @gggggggggggg@
468 @............@
469 @iiiiiiiiiiii@
470 @............@
471 @jjjjjjjjjjjj@
472 @............@
473 @jjjjjjjjjjjj@
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ..............
480 ..............
481 ..............
482 ..............
483 ..............
484 ..............
485 ..............
486 ..............
487 ..............
488 ..............
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 houghi
495 Protected by the cold
496 Bricks:
497 *v...d!!d...v*
498 *v...diid...v*
499 *v...dddd...v*
500 *v..........v*
501 *v..........v*
502 *v..........v*
503 *v..........v*
504 *v..........v*
505 *vvvvvvvvvvvv*
506 **************
507 xxxxxxxxxxxxxx
508 ffffffffffffff
509 ..............
510 ..............
511 vvvvvvvvvvvvvv
512 ..............
513 ..............
514 ..............
515 Bonus:
516 wc..........cw
517 wc..........cw
518 fc..........cf
519 fc..........cf
520 fc..........cf
521 +c..........c+
522 +c..........c+
523 +c..........c+
524 +>>>>>>>>>>>>+
525 +ffffffffffff+
526 ?WWWWWWWWWWWW?
527 ?{{{{{{{{{{{{?
528 ..............
529 ..............
530 ?------------?
531 ..............
532 ..............
533 ..............
534 Level:
535 houghi
536 Do not take the red pill
537 Bricks:
538 !..!...!.....@
539 .....!.@.!..@.
540 ..!......@.!!.
541 !.....!!......
542 ....!..!.!.@.!
543 ..!...!.@.....
544 ..!@.@........
545 .!..!..!.@.!.@
546 ..!..........!
547 @....!...!....
548 ...!...!...!..
549 .!@..........@
550 .....!...!@...
551 ...!........!.
552 .@......!!....
553 ......@......@
554 ...........@..
555 ..............
556 Bonus:
557 .m....m.......
558 mm............
559 ...m......*...
560 .m............
561 ...*........*.
562 .*............
563 ..............
564 *..*......*.w.
565 ..............
566 ........*....w
567 ..m...*.......
568 *..........w..
569 ....*.........
570 ........ww...w
571 .......*....w.
572 ..............
573 ..............
574 ..............
575 Level:
576 houghi
577 Brother, where art thou?
578 Bricks:
579 i............i
580 .i..........i.
581 ..i........i..
582 ...i..gg..i...
583 ....igvvgi....
584 ....g@@@@g....
585 ...g@ivvi@g...
586 ..g.@.ii.@.g..
587 fgff@yyyy@ffgf
588 g............g
589 ......**......
590 .....*..*.....
591 ....*....*....
592 ..............
593 ....*....*....
594 .....*..*.....
595 ......**......
596 ..............
597 Bonus:
598 ..............
599 .b..........b.
600 ..............
601 ......ff......
602 ....bf55fb....
603 ....f....f....
604 ...&..jj..&...
605 ..............
606 .W...!ll!...W.
607 ..............
608 ......??......
609 .....p..p.....
610 ..............
611 ..............
612 ..............
613 .....W..W.....
614 ......WW......
615 ..............
616 Level:
617 houghi
618 Almost standard
619 Bricks:
620 kkkkkkkkkkkkkk
621 jjjjjjjjjjjjjj
622 iiiiiiiiiiiiii
623 hhhhhhhhhhhhhh
624 ..............
625 gggggggggggggg
626 ffffffffffffff
627 eeeeeeeeeeeeee
628 dddddddddddddd
629 ..............
630 ..............
631 avavavavavavav
632 cacacacacacaca
633 bcbcbcbcbcbcbc
634 !b!b!b!b!b!b!b
635 ..............
636 ..............
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 ..............
643 ..............
644 ..............
645 ..............
646 ..............
647 ..............
648 ..............
649 ..............
650 ..............
651 ..............
652 ..............
653 ..............
654 .p.p.p.p.p.p.m
655 ..............
656 ..............
657 Level:
658 houghi
659 Spicy
660 Bricks:
661 .aa...........
662 .cc.....a.....
663 ........c.....
664 .a..a.........
665 .c..c.........
666 ..............
667 ..a.......b.b.
668 ..c..a....j.j.
669 .a...c........
670 .c............
671 .........EEEE.
672 ........EE..Eb
673 .a.a.........j
674 .c.c........@@
675 ............@@
676 ....a.....@.@@
677 ....c.....@.@@
678 @@@@@@@@@@@.@@
679 Bonus:
680 ..*...........
681 .p............
682 ........s.....
683 .w............
684 .w............
685 ..............
686 ..j.......b.s.
687 ............s.
688 .m...b........
689 ..............
690 ..............
691 ..............
692 .*...........b
693 ...*..........
694 ..............
695 ....b.........
696 ..............
697 ..............
698 Level:
699 houghi
700 Many more points
701 Bricks:
702 ..............
703 ..............
704 ..............
705 ..............
706 ..............
707 ..............
708 ..............
709 ..............
710 ..############
711 ..#@@@@@@@@@@@
712 ..#@aaaaaaaaaa
713 ..#@abbbbbbbbb
714 ..#@abcccccccc
715 ..#@abczzzzzzz
716 ..#@abczyyyyyy
717 ..#@abczyxx###
718 ..#@abczyxvv..
719 ############v#
720 Bonus:
721 ..............
722 ..............
723 ..............
724 ..............
725 ..............
726 ..............
727 ..............
728 ..............
729 ..............
730 ..............
731 ....w0b0w0b0*0
732 ....0w0b0w0b0*
733 ....b0w0b0w0b0
734 ....0b0w0b0w0b
735 ....w0b0w0b0w0
736 ....0w0b0w0...
737 ....b0w0b0**..
738 ............*.
739 Level:
740 houghi
741 What will it be now?
742 Bricks:
743 ..............
744 g............g
745 g..ggg..ggg..g
746 g............g
747 g.j.v.jj.v.j.g
748 ..j.v.jj.v.j..
749 ....v....v....
750 hhh.v.hh.v.hhh
751 ..............
752 .!.!.!..!.!.!.
753 ..*.*.**.*.*..
754 .*.*.*..*.*.*.
755 !.!.!.!!.!.!.!
756 ..............
757 .j.j.j..j.j.j.
758 .j.j.j..j.j.j.
759 .j.j.j..j.j.j.
760 v.v.v.vv.v.v.v
761 Bonus:
762 ..............
763 ..............
764 ..............
765 ..............
766 .........l....
767 ..............
768 ..............
769 ..............
770 ??????????????
771 ??????????????
772 ??????????????
773 ??????????????
774 ??????????????
775 ??????????????
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 houghi
782 Forking
783 Bricks:
784 ...h...h...h.c
785 ...h...h...h.c
786 .c.h.c.h.c.h.c
787 .c.h.c.h.c.h.c
788 .c.h.c.h.c.h.c
789 .c.h.c.h.c.h.c
790 .c.h.c.h.c.h.c
791 .c.h.c.h.c.h.c
792 .c.h.c.h.c.h.c
793 .c.h.c.h.c.h.c
794 .c.h.c.h.c.h.c
795 .c.h.c.h.c.h.c
796 .c.h.c.h.c.h.c
797 .c.h.c.h.c.h.c
798 .c...c...c...c
799 .c...c...c...c
800 .ccccccccccccc
801 .vvvvvvvvvvvvv
802 Bonus:
803 ...0...0...0..
804 ...0...0...0..
805 .*.~.*.~.*.~.~
806 ..............
807 ..............
808 ..............
809 ...0...0...0..
810 .f.f.f.f.f.f.f
811 ...0...0...0..
812 ..............
813 ..............
814 ..............
815 ..............
816 .c.*.c.*.c.*.c
817 ..............
818 ..............
819 ..............
820 .<<<<.ss.>>>>>
821 Level:
822 noname
823 Holland - Germany
824 Bricks:
825 dddddddddddddd
826 jjjjjjjjjjjjjj
827 gggg##gg##gggg
828 ...#a#..#a#...
829 .x#..#..#..#x.
830 v#*..#..#..*#v
831 #....#..#....#
832 .....#..#.....
833 .....#..#.....
834 aaaaa#aa#aaaaa
835 ddddd#dd#ddddd
836 hhhhh#hh#hhhhh
837 .....#..#.....
838 .....#..#.....
839 .....#..#.....
840 .....#..#.....
841 .....#..#.....
842 .....#..#.....
843 Bonus:
844 .0...1**1...0.
845 .0...1..1...0.
846 .0..3g..g3..0.
847 ...3w....w3...
848 .03........30.
849 m3..........3m
850 3............3
851 ..............
852 ..............
853 ..............
854 ......**......
855 .....g..g.....
856 ..............
857 ..............
858 ..............
859 ..............
860 ..............
861 .....g..g.....
862 Level:
863 houghi
864 Sliding doors
865 Bricks:
866 ********..a..*
867 ###########..*
868 v...av.......a
869 #...av........
870 #..##v########
871 #...###......v
872 #....va......#
873 v....va......#
874 #####v#####..#
875 ....###......#
876 .....v.......#
877 v....v.......v
878 a####v########
879 aa..####..v#..
880 ....###...##..
881 ....##...##...
882 ....#...##....
883 aaaaaaa##aaaaa
884 Bonus:
885 ..........w...
886 ..............
887 .............l
888 ..............
889 .....m........
890 ..............
891 ..............
892 ..............
893 .....m........
894 ..............
895 ..............
896 w.............
897 w....m........
898 ww........m...
899 ..............
900 ..............
901 ..............
902 ..............
903 Level:
904 houghi
905 Tilted
906 Bricks:
907 EEE@@@##Ed*!fz
908 EE@@@##Ed*!fzy
909 E@@@##Ed*!fzyx
910 @@@##Ed*!fzyx@
911 @@##Ed*!fzyx@c
912 @##Ed*!fzyx@cv
913 ##Ed*!fzyx@cv.
914 #Ed*!fzyx@cv..
915 Ed*!fzyx@cv...
916 d*!fzyx@cv....
917 *!fzyx@cv.....
918 !fzyx@cv......
919 fzyx@cv.......
920 zyx@cv........
921 yx@cv.........
922 x@cv..........
923 @cv...........
924 cv............
925 Bonus:
926 .........w.*&3
927 ........w.*&3.
928 .......w.*&3.*
929 ......w.*&3.*.
930 .....w.*&3.*..
931 ....w.*&3.*...
932 ...w.*&3.*....
933 ..w.*&3.*.m...
934 .w.*&3.*......
935 w.*&3.*.......
936 .*&3.*........
937 *&3.*.........
938 &3.*..........
939 3.*...........
940 .*............
941 *.............
942 ..............
943 ..............
944 Level:
945 houghi
946 Balls
947 Bricks:
948 *a**a**aa*avvv
949 *aa*aa*a**aEEE
950 **a*a**a**a***
951 a*a*aa*a*a**aa
952 aa***aa**a*aa*
953 *aa**aa*aa*a**
954 **aa*a**a*aa**
955 a**a****a*a*a*
956 a**a**aaa*a*a*
957 aa**a*a***a*a*
958 *a**a*a*a*a*aa
959 *aaa*aa**aa**a
960 ***a*a**aa***a
961 **************
962 aaa*@*aaaaaaaa
963 !a*@*@*a*a*a*a
964 **@...@*a*a*a*
965 @@.....@@@@@@@
966 Bonus:
967 m.............
968 ..............
969 ..............
970 ..............
971 ..............
972 ..............
973 ..............
974 ..............
975 ..............
976 ..............
977 bbbbbbbbbbbbbb
978 bbbbbbbbbbbbbb
979 bbbbbbbbbbbbbb
980 bbbbbbbbbbbbbb
981 bbbbbbbbwbwbwb
982 wbbbwbbbwbwbwb
983 bbb...bbbwbbbb
984 bb.....bbbbbbb
985 Level:
986 houghi
987 Many more points
988 Bricks:
989 vvvvvvvvvvvvvv
990 vvvvvvvvvvvvvv
991 vvvvvvvvvvvvvv
992 vvvvvvvvvvvvvv
993 vvvvvvvvvvvvvv
994 vvvvvvvvvvvvvv
995 vvvvvvvvvvvvvv
996 vvvvvvvvvvvvvv
997 vv############
998 vv#@@@@@@@@@@@
999 vv#@aaaaaaaaaa
1000 vv#@abbbbbbbbb
1001 vv#@abcccccccc
1002 vv#@abczzzzzzz
1003 vv#@abczyyyyyy
1004 vv#@abczyxx###
1005 vv#@abczyxv...
1006 ############.#
1007 Bonus:
1008 00000000000000
1009 01111111111111
1010 01222222222222
1011 01333333333333
1012 01444444444444
1013 01555555555555
1014 01...........j
1015 01...........l
1016 01............
1017 01............
1018 01..>>>>>>>>>>
1019 01..mwwwwwwwww
1020 01..mwj&&&&&&&
1021 01..mw&ppppppp
1022 01..mw&p......
1023 01..mw&p.mm...
1024 01..mw&p.mm...
1025 ..............
1026 Level:
1027 houghi
1028 random thoughts
1029 Bricks:
1030 a..........c..
1031 a...#......c..
1032 a...#..gg..c..
1033 accc#c....xx..
1034 a....#ccgccc..
1035 h....d...gx...
1036 h..*.di...x...
1037 ah.*.i!...g...
1038 aah*iia!axaa..
1039 ..hhi....fga..
1040 ...*...!.dgg..
1041 ..i*h...!f.a..
1042 ..i..h.b.#.a..
1043 .bibbhbbf!daaa
1044 .bi...hxf.....
1045 ..i...x..!....
1046 ..i...x....d..
1047 ..i........d..
1048 Bonus:
1049 -..........p..
1050 -..........p..
1051 -......mm..p..
1052 -ppp.p....55..
1053 -.....ppmppp..
1054 2....*...m5...
1055 2..1.*!3..5...
1056 -2.1.!43..m...
1057 --21!!-4-5--..
1058 ..22!.333}m-..
1059 ...1..343*mm..
1060 ..012.334}.-..
1061 ..0..2.b3.3-..
1062 .b0bb2bb}4*---
1063 .b0...25}33...
1064 ..0...5.343...
1065 ..0...5.333*..
1066 ..0........*..
1067 Level:
1068 houghi
1069 Boxen
1070 Bricks:
1071 ..............
1072 .aaa...kkk....
1073 .aaa...kkk....
1074 .aaa...kkk....
1075 .aaa...kkk....
1076 ....bbb...jjj.
1077 ....bbb...jjj.
1078 ....bbb...jjj.
1079 ....bbb...jjj.
1080 .ccc...xxx....
1081 .ccc...xxx....
1082 .ccc...xxx....
1083 .ccc...xxx....
1084 ....zzz...eee.
1085 ....zzz...eee.
1086 ....zzz...eee.
1087 ....zzz...eee.
1088 ..............
1089 Bonus:
1090 ..............
1091 ..............
1092 ..b.....b.....
1093 ..b.....b.....
1094 ..............
1095 ..............
1096 .....s.....s..
1097 .....s.....s..
1098 ..............
1099 ..............
1100 ..w.....w.....
1101 ..w.....w.....
1102 ..............
1103 ..............
1104 .....*.....*..
1105 .....*.....*..
1106 ..............
1107 ..............
1108 Level:
1109 noname
1110 Half the place
1111 Bricks:
1112 E#@E@#EE#@E@#E
1113 @E#@#E@@E#@#E@
1114 #@E#E@##@@#E@#
1115 E#@E@#EE#@E@#E
1116 @E#@#E@@E#@#E@
1117 #@E#E@##@E#E@#
1118 ##@E@####@E@##
1119 @@@@@@##@@@@@@
1120 aaaaaaaaaaaaaa
1121 bbbbbbbbbbbbbb
1122 cccccccccccccc
1123 jjjjjjjjjjjjjj
1124 kkkkkkkkkkkkkk
1125 ..............
1126 ..............
1127 ..............
1128 ..............
1129 vvvvvvvvvvvvvv
1130 Bonus:
1131 ..............
1132 ..............
1133 ..............
1134 ..............
1135 ..............
1136 ..............
1137 ..............
1138 ..............
1139 W.....mm.....W
1140 W.....ll.....W
1141 ..555.--.555..
1142 b.....++.....b
1143 w............w
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 ??????????????
1149 Level:
1150 houghi
1151 Jumping Jack Flash
1152 Bricks:
1153 gEgEgEggEgEgEg
1154 gEgEgEggEgEgEg
1155 ..............
1156 ..............
1157 !!!!!!!!!!!!!!
1158 **************
1159 ..@@......@@..
1160 ......##......
1161 xxxxxxxxxxxxxx
1162 ..............
1163 ..............
1164 !!!!!!!!!!!!!!
1165 **************
1166 ..............
1167 ..............
1168 ..............
1169 !!!!!!!!!!!!!!
1170 **************
1171 Bonus:
1172 m.*.m.**.m.*.m
1173 w.w.w.ww.w.w.w
1174 ..............
1175 &&&&&&&&&&&&&&
1176 ~~~~~~~~~~~~~~
1177 jjjjjjjjjjjjjj
1178 ..............
1179 ..............
1180 !!!ll!!!!ll!!!
1181 ..............
1182 ffffffffffffff
1183 ++++++++++++++
1184 --------------
1185 ..............
1186 ..............
1187 bbbbbbbbbbbbbb
1188 WWWWWWWWWWWWWW
1189 cccccccccccccc
1190 Level:
1191 houghi
1192 Get in there!!
1193 Bricks:
1194 vvcba.g.i.h@#E
1195 v.cba.g.i.h@#E
1196 .Ecba.g.i.h@##
1197 *Ecba.g.i.h@@@
1198 **Eba.g.i.hhhh
1199 ..Eba.g.i.....
1200 ..Eba.g.iiiiii
1201 ..Eba.g.......
1202 ...Ea.g.......
1203 ...Ea.gggggggg
1204 ...Ea.........
1205 .vv.E*********
1206 ....E*********
1207 ....E.........
1208 .....EEddddddd
1209 vv.....EEeeeee
1210 .........EEvvE
1211 .........vvEEv
1212 Bonus:
1213 {m........*...
1214 }..?....*.....
1215 ..........d...
1216 5.l...*.......
1217 55.?....d.*.d*
1218 ..............
1219 .........*..*.
1220 ...d?.*.......
1221 ..............
1222 ...........*..
1223 ....d.........
1224 .....w5w5w5w5w
1225 .....w5w5w5w5w
1226 ..............
1227 ..........*...
1228 .............d
1229 ...........mm.
1230 .........ww..m
1231 Level:
1232 houghi
1233 Points at the top
1234 Bricks:
1235 dddddddddddddd
1236 ..............
1237 ..............
1238 ..............
1239 ..............
1240 ..............
1241 ..............
1242 ..............
1243 ##############
1244 xxxxxxxxxxxxxx
1245 yyyyyyyyyyyyyy
1246 zzzzzzzzzzzzzz
1247 !!!!!!!!!!!!!!
1248 cccccccccccccc
1249 jjjjjjjjjjjjjj
1250 kkkkkkkkkkkkkk
1251 ..............
1252 ..............
1253 Bonus:
1254 &&5&5&j&5&&5&&
1255 ..............
1256 ..............
1257 ..............
1258 ..............
1259 ..............
1260 ..............
1261 ..............
1262 ..............
1263 .m.m..m..m..m.
1264 ......p.......
1265 ..l........l..
1266 ...s..p..s....
1267 ..b.w...w..b..
1268 ..............
1269 ...}.....{....
1270 ..............
1271 ..............
1272 Level:
1273 houghi
1274 Try twice
1275 Bricks:
1276 xxxxxxxxxxxxxx
1277 ..............
1278 ..............
1279 ..............
1280 ..............
1281 ..............
1282 ..............
1283 ..............
1284 .*************
1285 ..............
1286 ..............
1287 ..............
1288 ..............
1289 ..............
1290 ..............
1291 ..............
1292 ..............
1293 ..............
1294 Bonus:
1295 pppppppppppppp
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 ..............
1301 ..............
1302 ..............
1303 ..............
1304 ..............
1305 ..............
1306 ..............
1307 ..............
1308 ..............
1309 ..............
1310 ..............
1311 ..............
1312 ..............
1313 Level:
1314 houghi
1315 It is I, ...
1316 Bricks:
1317 a.a..a..a.a...
1318 a.a.a.a.a.a...
1319 a.a.a.a.a.a...
1320 aaa.a.a.a.a.##
1321 a.a.a.a.a.a...
1322 a.a.a.a.a.a...
1323 a.a..a...a....
1324 ..............
1325 ......a..a.a.a
1326 ####.a.a.a.a.a
1327 ****.a.a.a.a.a
1328 !!!!.aaa.aaa.a
1329 xxxx...a.a.a.a
1330 yyyy.a.a.a.a.a
1331 zzzz..a..a.a.a
1332 ..............
1333 ..............
1334 ..............
1335 Bonus:
1336 *.*..*..*.*...
1337 ..............
1338 ..............
1339 ..............
1340 ..............
1341 ..............
1342 ..............
1343 ..............
1344 ..............
1345 ..............
1346 ....m.........
1347 ....m.........
1348 <<<<m.........
1349 >>>>..........
1350 .p.w..w..w.w.w
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 houghi
1356 Two lines
1357 Bricks:
1358 @.....v......x
1359 @.....v......x
1360 @.....v......x
1361 @.....v......x
1362 @.....v......x
1363 @.....v......x
1364 @.....v......y
1365 @.....v......y
1366 @.....v......y
1367 @.....v......y
1368 @.....v......y
1369 @.....v......y
1370 @.....v......y
1371 @.....v......z
1372 @.....v......z
1373 @.....v......z
1374 @.....v......z
1375 @.....v......z
1376 Bonus:
1377 ......*......m
1378 ..............
1379 ..............
1380 ..............
1381 ..............
1382 ..............
1383 ..............
1384 ......!......!
1385 ......p......p
1386 ......!......!
1387 ..............
1388 ..............
1389 ..............
1390 ..............
1391 ..............
1392 ..............
1393 ..............
1394 ......w......w
1395 Level:
1396 houghi
1397 Draw bridge
1398 Bricks:
1399 eeeeeeeeeeeeee
1400 dddddddddddddd
1401 hhhhhhhhhhhhhh
1402 @@@@@@@@@@@@@.
1403 #############.
1404 .....v........
1405 .....v........
1406 .....v........
1407 .EEEEvEEEEEEEE
1408 ....EEE.......
1409 ..............
1410 ..............
1411 ..............
1412 ..............
1413 ..............
1414 ..............
1415 ..............
1416 ..............
1417 Bonus:
1418 5554433221100p
1419 5554433221100p
1420 jjjjjjjjjjjjjj
1421 ..............
1422 ..............
1423 .....b........
1424 .....b........
1425 .....b........
1426 .....m........
1427 ..............
1428 ..............
1429 ..............
1430 ..............
1431 ..............
1432 ..............
1433 ..............
1434 ..............
1435 ..............
1436 Level:
1437 houghi
1438 Low Resolution
1439 Bricks:
1440 .#...#..#...#.
1441 .#..#.#.#...#.
1442 .#..#.#.#.#.#.
1443 .##..#...#.#..
1444 ..............
1445 ..###.###..##.
1446 ..#.#.#...#...
1447 #.#.#.##...#..
1448 ..##..#.....#.
1449 ..#.#.###.##..
1450 ..............
1451 EEEEEEEEEEEEEE
1452 @@@@@@@@@@@@@@
1453 ##############
1454 xxxxxxxxxxxxxx
1455 yyyyyyyyyyyyyy
1456 zzzzzzzzzzzzzz
1457 ffffffffffffff
1458 Bonus:
1459 ..............
1460 ..............
1461 ..............
1462 ..............
1463 ..............
1464 ..............
1465 ..............
1466 ..............
1467 ..............
1468 ..............
1469 ..............
1470 ..............
1471 ..............
1472 ..............
1473 ..............
1474 ..............
1475 ..............
1476 ..............
1477 Level:
1478 houghi
1479 Crossing
1480 Bricks:
1481 *.!........c.d
1482 .*.!......c.d.
1483 !.*.!....c.d.c
1484 .!.*.!..c.d.c.
1485 ..!.*.!c.d.c..
1486 ...!.*c!d.c...
1487 ....!c*d!c....
1488 ....c!d*c!....
1489 ...c.d!c*.!...
1490 ..c.d.c!.*.!..
1491 .c.d.c..!.*.!.
1492 c.d.c....!.*.!
1493 .d.c..##..!.*.
1494 d.c..#@@#..!.*
1495 .c....##....!.
1496 c............!
1497 ..............
1498 ..............
1499 Bonus:
1500 .0.12......4.3
1501 0.0.12....4.3.
1502 .0.0.12..4.3..
1503 1.0.0.124.3...
1504 21.0.0.123....
1505 .21.0.1.12....
1506 ..21.0.1.12...
1507 ...21.0.1.12..
1508 ...421.0.0.12.
1509 ..4.321.0.0.12
1510 .4.3..21.0.0.1
1511 4.3....21.0.0.
1512 .3......21.0.0
1513 3........21.0.
1514 ..........21.0
1515 ...........21.
1516 ............21
1517 ..............
1518 Level:
1519 houghi
1520 Stairs
1521 Bricks:
1522 @iihhggffd..*z
1523 iihhggffdd.z.v
1524 iihggffd...z#!
1525 hhgggfd....v..
1526 hhggfdd.*..v..
1527 hhggfd...z.!..
1528 hggfd.*..v#!.i
1529 ggfdd..z#!...i
1530 gffd...v.....i
1531 fdd.*.#!....ij
1532 dd...z.....iij
1533 ..*..v.....ijk
1534 ...z#!...iijkk
1535 *..v.....ijjkz
1536 .z#!....ijjkzz
1537 .v......ijkkzz
1538 z!....iijjkzzz
1539 v..zzzijjkkzzz
1540 Bonus:
1541 ..............
1542 ..............
1543 ...........p..
1544 ..............
1545 ..........m...
1546 ..........m.b.
1547 ......p.....b.
1548 ..........bw..
1549 ........bwb...
1550 ........b.....
1551 .....bbwb.....
1552 ..p..l........
1553 ...b..b.......
1554 ....bwb.......
1555 .b..b.........
1556 .lbwb.........
1557 b.b...........
1558 bwb...........
1559 Level:
1560 houghi
1561 Stars in the dark
1562 Bricks:
1563 ..............
1564 .!.!.!.!.!.!.!
1565 ..............
1566 !.!.!.!.!.!.!.
1567 ..............
1568 .!.!.!.!.!.!.!
1569 ..............
1570 !.!.!.!.!.!.!.
1571 ..............
1572 .!.!.!.!.!.!.!
1573 ..............
1574 !.!.!.!.!.!.!.
1575 ..............
1576 .!.!.!.!.!.!.!
1577 ..............
1578 !.!.!.!.!.!.!.
1579 ..............
1580 .!.!.!.!.!.!.!
1581 Bonus:
1582 jjjjjjjjjjjjjj
1583 jgjgjgjgjgjgjg
1584 jjjjjjjjjjjjjj
1585 gjgjgjgjgjgjgj
1586 jjjjjjjjjjjjjj
1587 jgjgjgjgjgjgjg
1588 jjjjjjjjjjjjjj
1589 gjgjgjgjgjgjgj
1590 jjjjjjjjjjjjjj
1591 jgjgjgjgjgjgjg
1592 jjjjjjjjjjjjjj
1593 gjgjgjgjgjgjgj
1594 jjjjjjjjjjjjjj
1595 jgjgjgjgjgjgjg
1596 jjjjjjjjjjjjjj
1597 gjgjgjgjgjgjgj
1598 jjjjjjjjjjjjjj
1599 jgjgjgjgjgjgjg
1600 Level:
1601 houghi
1602 The end ...
1603 Bricks:
1604 @@@@@@@@@@@@@@
1605 ..............
1606 v............v
1607 v............v
1608 vEEEvhhhhvEEEv
1609 ....v.cc.v....
1610 .c..vEEEEv..c.
1611 .c..........c.
1612 .cb........bc.
1613 .cb........bc.
1614 ..ba......ab..
1615 ..ba......ab..
1616 E..ak....ka..E
1617 E..akhhhhka..E
1618 #...kj..jk...#
1619 #...kj..jk...#
1620 #....j..j....#
1621 #....j..j....#
1622 Bonus:
1623 ..............
1624 ..............
1625 *............*
1626 ..............
1627 ....m....m....
1628 ..............
1629 .*..........*.
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..m........m..
1635 ....p....p....
1636 ..............
1637 ..............
1638 ....j....j....
1639 ..............
1640 .....w..w.....
0 Version: 1.00
1 Level:
2 Lelldorin
3 Tricky1
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ....iffffi....
9 ...ihfddfhi...
10 .iihggddgghii.
11 ..............
12 ..............
13 ..............
14 ..............
15 ......EE......
16 ....E....E....
17 ..E........E..
18 .E..........E.
19 E............E
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 .....0<20.....
28 ......--......
29 ..0+.>..>.+0..
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Lelldorin
44 Tricky2
45 Bricks:
46 .....kjjk.....
47 ....kjjjjk....
48 .....kjjk.....
49 ..E...kk...E..
50 ..iE......Eg..
51 ..i.E....E.g..
52 ..i........g..
53 ..i........g..
54 E.i........g.E
55 .Ei........gE.
56 ..E...EE...E..
57 .....EfhE.....
58 ....E.hf.E....
59 ......fh......
60 ......hf......
61 ......EE......
62 ..............
63 ..............
64 Bonus:
65 ......+l-.....
66 .....4.0......
67 .......>......
68 ......5.......
69 ..w........w..
70 ...........1..
71 ..0........>..
72 ..>........0..
73 ..............
74 ..+........+..
75 ..............
76 ......w0......
77 .......+......
78 ......0.......
79 ......>f......
80 ..............
81 ..............
82 ..............
83 Level:
84 Lelldorin
85 Tricky3
86 Bricks:
87 ddd..gggg..ddd
88 ggg..hhhh..ggg
89 hhh...ii...hhh
90 iii........iii
91 jj..........jj
92 k............k
93 ...#......#...
94 ....#bbbb#....
95 e....EaaE....e
96 ee...EaaE...ee
97 EE...EEEE...EE
98 ..E........E..
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 <15...<<...51<
107 w....1--1....w
108 1.0........0.1
109 .>..........>.
110 -............-
111 ..............
112 ..............
113 .....&ww&.....
114 0.....44.....0
115 &+....ll....+&
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Lelldorin
126 Tricky4
127 Bricks:
128 ......dd......
129 ...b*bddb*b...
130 ...bbbeebbb.E.
131 .E....ee....E.
132 .E....ff....E.
133 .E....ff....E.
134 .E....gg....E.
135 .E.!..gg..!.E.
136 .E....cc....E.
137 .E....cc....E.
138 .E....hh....E.
139 .E.!..hh..!.E.
140 .E....ii....E.
141 .E....ii....E.
142 ..EEEEEEEEEE..
143 ..............
144 E............E
145 .E..........E.
146 Bonus:
147 ......--......
148 ..........2...
149 ....+.l..+....
150 ..............
151 ......s.......
152 ......2-......
153 ..............
154 ...0..........
155 ..............
156 .......s......
157 ......-.......
158 ..........0...
159 .......4......
160 ......ff......
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Lelldorin
167 Tricky5
168 Bricks:
169 j.f.g.hh.g.f.j
170 .f.g.h..h.g.f.
171 f.g.h.ii.h.g.f
172 .g.h.i..i.h.g.
173 ..............
174 EE..EE..EE..EE
175 ..............
176 ..............
177 ..............
178 vvEE..EE..EEvv
179 ..............
180 ..............
181 ..............
182 EE..EE..EE..EE
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 &.w...ls.<.w.&
189 .0...5..5...0.
190 l.>.+.00...+.s
191 .1..........1.
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 <w..........w>
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Lelldorin
208 Tricky6
209 Bricks:
210 ......EE......
211 ..............
212 ..............
213 ....E....E....
214 .....E..E.....
215 .....E..E.....
216 .....E..E.....
217 .....E..E.....
218 .....EccE.....
219 .....EbbE.....
220 .....EaaE.....
221 .....EaaE.....
222 .....EaaE.....
223 .....EaaE.....
224 .....EaaE.....
225 .EE..EEEE..EE.
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 .......f......
238 ......21......
239 ......s+......
240 ..............
241 ......b>......
242 ......-.......
243 ......3l......
244 ..............
245 ..............
246 ..............
247 Level:
248 Lelldorin
249 Tricky7
250 Bricks:
251 ..............
252 .v.v.v..v.v.v.
253 .E.E.E..E.E.E.
254 fE.EfE..EfE.Ef
255 EE.EEE..EEE.EE
256 ..............
257 ..............
258 .EE.EE..EE.EE.
259 .gE.Eg..gE.Eg.
260 .EE.EE..EE.EE.
261 ..............
262 ..............
263 v..v..vv..v..v
264 ..............
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 -...0....>...2
274 ..............
275 ..............
276 ..............
277 ..............
278 .5...w..w...5.
279 ..............
280 ..............
281 ..............
282 0..+..>1..f..-
283 ..............
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Lelldorin
290 Tricky8
291 Bricks:
292 ..............
293 .EE.EEE.EE.EE.
294 .fEffE..EffEf.
295 .EEEEE.EEEEEE.
296 ..............
297 ..............
298 ..............
299 .....E..E.....
300 ....E....E....
301 vv.E......E.vv
302 .v.EhE..EhE.v.
303 .v.EhE..EhE.v.
304 vv.EEE..EEE.vv
305 ..............
306 ..............
307 ..............
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 .<..l....l..-.
314 ..............
315 ..............
316 ..............
317 ..............
318 ..............
319 ..............
320 ->...........w
321 ....s.......+.
322 .w..5....5..b.
323 +............-
324 ..............
325 ..............
326 ..............
327 ..............
328 ..............
329 Level:
330 Lelldorin
331 Tricky9
332 Bricks:
333 ..............
334 .E....EE....E.
335 .EeE.edde.EeE.
336 .EEE.EEEE.EEE.
337 ..............
338 ..............
339 v............v
340 ..............
341 ..............
342 ..Ed......dE..
343 ...Ed.vv.dE...
344 ....E.EE.E....
345 v...E....E...v
346 vv..E....E..vv
347 EEE.EE..EE.EEE
348 ..............
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..............
354 ..s...44...+..
355 ..............
356 ..............
357 ..............
358 0............0
359 ..............
360 ..............
361 ..............
362 ....-.+f......
363 ..............
364 0.............
365 w...........sw
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Lelldorin
372 Tricky10
373 Bricks:
374 ...Ef.EE.fE...
375 ....EvEivE....
376 .E....fE....E.
377 .E.v..Eh..v.E.
378 .E....iE....E.
379 .E....Ef....E.
380 .Ee...hE...eE.
381 .Ed...Ei...dE.
382 .Ee...fE...eE.
383 .Ed...EE...dE.
384 .Ee..j..j..eE.
385 .Ed.EEvvEE.dE.
386 .Ee..k..k..eE.
387 .EEEE.EE.EEEE.
388 .....hkkh.....
389 ....EEEEEE....
390 ..............
391 ..............
392 Bonus:
393 ....>....>....
394 ........0.....
395 ......1.......
396 ..............
397 ......-.......
398 .......w......
399 ..0...0.......
400 .......-......
401 ..-........1..
402 ...........-..
403 ..1.....0..0..
404 ......l5......
405 ..+........+..
406 ..............
407 ......f<......
408 ..............
409 ..............
410 ..............
411 Level:
412 Lelldorin
413 Tricky11
414 Bricks:
415 ......dd......
416 .dd..deed..dd.
417 .eeeE.ff.Eeee.
418 .ee..fEEf..ee.
419 .e..ffEEff..e.
420 .d..EEvvEE..d.
421 .E...EvvE...E.
422 ...E......E...
423 ..............
424 ..E........E..
425 ..E........E..
426 ..............
427 kE..........Ek
428 jE....EE....Ej
429 kE..........Ek
430 E............E
431 E............E
432 E............E
433 Bonus:
434 .......>......
435 ......l....<..
436 .3.>...0..>...
437 ............3.
438 ....-0...-....
439 .0....++....0.
440 ......ww......
441 ..............
442 ..............
443 ..............
444 ..............
445 ..............
446 s............f
447 <............<
448 5............l
449 ..............
450 ..............
451 ..............
452 Level:
453 Lelldorin
454 Tricky12
455 Bricks:
456 Eh....kk....hE
457 Eh...EggE...hE
458 Eh...EEEE...hE
459 .E...keek...E.
460 .E...kffk...E.
461 .....EeeE.....
462 ..E...ff...E..
463 ......ee......
464 ...E......E...
465 ..............
466 ....EEdiEE....
467 ..vvEEidEEvv..
468 .v....EE....v.
469 v.....EE.....v
470 ..............
471 ..............
472 ..............
473 ..............
474 Bonus:
475 .4.....-....w.
476 .+....l5....s.
477 .s..........-.
478 .....s........
479 ......w.0.....
480 .......-......
481 ......+.......
482 ..............
483 ..............
484 ..............
485 ......-.......
486 ..w+..0+...w..
487 ............-.
488 s............0
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Lelldorin
495 Tricky13
496 Bricks:
497 ..............
498 .....EeeE.....
499 .!...EeeE...!.
500 .....E@@E.....
501 ......EE......
502 ......EE......
503 ..E.E.EE.E.E..
504 ......EE......
505 ......EE......
506 hE.EfE##EfE.Eh
507 hE.EfE##EfE.Eh
508 hE.EfE##EfE.Eh
509 EE.EEEEEEEE.EE
510 ......zz......
511 .....z..z.....
512 ..E........E..
513 ..............
514 ..............
515 Bonus:
516 ..............
517 .......0......
518 ......5+......
519 ..............
520 ..............
521 ..............
522 ..............
523 ..............
524 ..............
525 w...+........w
526 3...0....0...4
527 l............l
528 ..............
529 ......5>......
530 .....-..f.....
531 ..............
532 ..............
533 ..............
534 Level:
535 Lelldorin
536 Tricky14
537 Bricks:
538 @#@#@#@@#@#@#@
539 EEEEEEEEEEEEEE
540 E..v..hh..v..E
541 e..E..hh..E..e
542 e...E.hh.E...e
543 e....EEEE....e
544 e............e
545 e.....dd.....e
546 E....EddE....E
547 ...E..EE..E...
548 .E..........E.
549 ....E....E....
550 ..Ev..EE..vE..
551 ..............
552 ...E.EvvE.E...
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ..............
558 ..............
559 ......0.......
560 ......l4......
561 .............+
562 0.............
563 .............0
564 +......0.....s
565 ......wl......
566 ..............
567 ..............
568 ..............
569 ..............
570 ..............
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Lelldorin
577 Tricky15
578 Bricks:
579 ..i........i..
580 ..iv......vi..
581 .EEE......EEE.
582 .E..E....E..E.
583 .E..E....E..E.
584 .E...v..v...E.
585 .E....EE....E.
586 .E..........E.
587 .E..........E.
588 dE..........Ed
589 eE..........Ee
590 eE..........Ee
591 eE..........Ee
592 eE..........Ee
593 eE..........Ee
594 eE..........Ee
595 eE..........Ee
596 EE..........EE
597 Bonus:
598 ..-........-..
599 ..+w......w+..
600 ..............
601 ..............
602 ..............
603 .....3..3.....
604 ..............
605 ..............
606 ..............
607 ..............
608 >............>
609 ..............
610 .............5
611 1............1
612 ..............
613 <............<
614 5............l
615 ..............
0 Version: 1.10
1 Level:
2 Twilight
3 Bomb Klaus
4 Bricks:
5 c*cc**c*c*c*cc
6 c*cc*c*cc*cc**
7 cc*c*c*cc*ccc*
8 cc*c*cccc*c**c
9 c*cc*c*cc*c**c
10 c*cccc*c*c*cc*
11 ..............
12 ..............
13 ..............
14 @!@!@!!!!@!@!@
15 ..............
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..cb?.~.b?g.5b
25 +W.~.f.5+~cf..
26 f5W.?..b...b5.
27 ..?.?+..gW+.?.
28 b5c..c.5..5..+
29 ...+...b.~..f.
30 ..............
31 ..............
32 ..............
33 .w...g>>b...w.
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Twilight
44 Boooom on
45 Bricks:
46 ##############
47 @.@..#d#......
48 ....#ddd#.*.@.
49 .@.#ddddd*....
50 ...#*ddd*#.@.@
51 ..#cc*d*dd#...
52 @.#cdd*ddd#.@.
53 ..#d*****d#...
54 ..#ddd*ddd#@.@
55 .@#dd*d*dd#...
56 ...#*ddd*#..@.
57 ...#ddddd#....
58 @...#ddd#..@.@
59 .....#d#......
60 ......#.......
61 **************
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ......5.......
67 .....555......
68 ....m.........
69 ......w.l.....
70 ..............
71 ..............
72 ..............
73 ..............
74 ...m.....5....
75 ......w.......
76 ......5.m.....
77 ..............
78 ......5.......
79 ..............
80 2f.s2.f.2df2.s
81 ..............
82 ..............
83 Level:
84 Twilight
85 Cause I'm TNT
86 Bricks:
87 zzzzzzzzzzzzzz
88 z*z*z*zz*z*z*z
89 zvzvzvzzvzvzvz
90 ..............
91 ..............
92 .############.
93 ..v.v.vv.v.v..
94 .d.d.dddd.d.d.
95 ...v.v..v.v...
96 .v..v.vv.v..v.
97 ..............
98 ...d.d.....d..
99 ..d.d...dd..d.
100 .....ddd..d...
101 .ddd.dd...dd.d
102 ..............
103 ..............
104 dddddddddddddd
105 Bonus:
106 5...?.55...?l5
107 ..............
108 ..?......?....
109 ..............
110 ..............
111 ..............
112 ..?.2..2......
113 ...?.+....g...
114 ..............
115 .w.....s......
116 ..............
117 ...c.p........
118 ..2.g.........
119 .......2..c...
120 ...........2..
121 ..............
122 ..............
123 .fd..f.d..f..d
124 Level:
125 Twilight
126 Catch me, if you can
127 Bricks:
128 ..............
129 ..............
130 .....#.#......
131 ....##.##.....
132 ...###c###....
133 ....##.##.....
134 .....#.#......
135 ..............
136 ..............
137 ..............
138 ..............
139 **************
140 ..............
141 **************
142 ..............
143 **************
144 ..............
145 **************
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 c>c>c>l>c>c>c>
159 ..............
160 ddddd>5>dddddd
161 ..............
162 dd>dd>5>dd>ddd
163 ..............
164 dddddb5bdddddd
165 Level:
166 Twilight
167 Climb up...
168 Bricks:
169 ddd.......*d@.
170 dd*.!.....d#..
171 d*d....!..#...
172 *dd.#....#....
173 ddd#....#.....
174 dd#....#.*****
175 d#....#.!*ddd*
176 @....#...*****
177 .!............
178 ......!.......
179 ..............
180 .......#.....@
181 ..!...#.....#.
182 .....#..!..#..
183 ....#.....#...
184 ...#.....#....
185 ..#.....#.....
186 @#............
187 Bonus:
188 ..........??..
189 ....m.....?...
190 .......w......
191 ..............
192 ..............
193 55............
194 5.......+.>5>.
195 ..............
196 .5b...b.......
197 ......+.......
198 ..............
199 ..............
200 .bs...........
201 ........wb....
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Twilight
208 Hommage to Ultima online
209 Bricks:
210 ...hdddddh....
211 ...hhdddhh....
212 .##hhdddhh##..
213 ...hhdddhh....
214 ...hhdddhh....
215 ...hhdddhh....
216 .##hhdddhh##..
217 ....hhdhh.....
218 ccccchhhcccccc
219 ....hhdhh.....
220 ...hhdddhh....
221 ...hhdddhh....
222 .##hhdddhh##..
223 ...hhdddhh....
224 ...hhdddhh....
225 ....hhdhh.....
226 .....hhh......
227 ......h.......
228 Bonus:
229 ...W.?5.lw....
230 ....W.........
231 .22.....b.22..
232 ...>.p.p......
233 ...{?...??....
234 .....s........
235 .22.b..W{.22..
236 ......?.d.....
237 .<>..5+5..><.>
238 ..............
239 ...c>d.s.c....
240 ...b...?......
241 .22..{...?22..
242 ...+Wjcb.+....
243 ....?...>.....
244 ........c.....
245 ..............
246 ......w.......
247 Level:
248 Twilight
249 Faster !
250 Bricks:
251 @@@@@@@@@@@@@@
252 jjjjjjjjjjjjjj
253 jdddjdjjdjdddj
254 jdjjdjddjdjdjj
255 jdjjdjddjjjdjj
256 jddjdjdjdjjdjj
257 jdjjdddjjdjdjj
258 jdjjdjddjdjdjj
259 jdjjdjdjdjjdjj
260 jjjjjjjjjjjjjj
261 ..............
262 ..............
263 vvvvvvvvvvvvvv
264 cccccccccccccc
265 bbbbbbbbbbbbbb
266 aaaaaaaaaaaaaa
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..............
275 ..............
276 ......?.......
277 ......l.......
278 b.g...5....g.b
279 ......w.......
280 ..............
281 ..............
282 &&&&&&&&&&&&&&
283 &&&&&&&&&&&&&&
284 >>>>>>>>>>>>>>
285 +>>>+>>>+>>>+>
286 ..............
287 ..............
288 Level:
289 Twilight
290 The Finals
291 Bricks:
292 .....j##j.....
293 ....jjjjjj....
294 ...jj##jjj#...
295 ...j####j##...
296 ..#j####j###..
297 ..#j####j###..
298 ..jj!##jjj##..
299 ..jjjjjjjjjj..
300 ..#jjj##jjj#..
301 ..##j####j##..
302 ..##j####j##..
303 ..##j####j#j..
304 ...jjj##jjj...
305 ...jjjjjjjj...
306 ....jjj##j....
307 .....j###.....
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ......?*.?....
313 ...??..?......
314 .....55.+.5...
315 .....55.?.55..
316 .....55...55..
317 ...?...2.?....
318 .....?22......
319 .....w...?....
320 ..5.p.55...5..
321 ..5...55...5..
322 ..5...55.+....
323 ....??........
324 ...?...?.?....
325 ..............
326 .......55.....
327 ..............
328 ..............
329 Level:
330 Twilight
331 A plus!
332 Bricks:
333 ffffff##ffffff
334 fffffc##cfffff
335 fffff####fffff
336 f#ffccccccff#f
337 f#ffccccccff#f
338 ###f##ff##f###
339 f#fcccffcccf#f
340 f#fcccffcccf#f
341 fff##ffff##fff
342 ffcccffffcccff
343 ffcccffffcccff
344 ff##ffffff##ff
345 fcccc####ccccf
346 fcccc####ccccf
347 f##cc####cc##f
348 cccffffffffccc
349 cccffffffffccc
350 ##ffffffffff##
351 Bonus:
352 m....5..5....m
353 .???.l..l.???.
354 ..............
355 5.?.*c++c*.?.5
356 5.?...!!...?.5
357 .5....??....5.
358 ?.?sbc??cbs?.?
359 ?.?.+.??.+.?.?
360 ......??......
361 ..?<?.??.?<?..
362 >...w.>>.w...>
363 ......??......
364 ?*b?c0000c?b*?
365 ?...+0000+...?
366 ...>p0000p>...
367 .<..........<.
368 5.w........w.5
369 ..............
370 Level:
371 Twilight
372 10
373 Bricks:
374 ##..........##
375 ..............
376 !............!
377 ...gg..gggg...
378 ##.gg..gggg.##
379 ...gg..gzzg...
380 !..gg..gzzg..!
381 ...gg..gzzg...
382 ##.gg..gzzg.##
383 ...gg..gzzg...
384 !..gg..gzzg..!
385 ...gg..gzzg...
386 ##.gg..gzzg.##
387 ...gg..gggg...
388 !..gg..gggg..!
389 ..............
390 ##..........##
391 ..............
392 Bonus:
393 ..............
394 .+..........+*
395 ..............
396 *..c...w?.?...
397 ....?...?c....
398 .+.w...?l.?.+.
399 ...gc..b.b....
400 ...?p.........
401 .......???w...
402 .+.?......*.+g
403 ...?....j?....
404 ...c.....?g...
405 ...b...w..c...
406 g+..w.......+.
407 ........??....
408 *............*
409 ..............
410 ..............
411 Level:
412 Twilight
413 Expect no Help!
414 Bricks:
415 @@@@@@@@@@@@@@
416 @.............
417 @.eee.eee.eee.
418 @.e!e.e!e.e!e.
419 @.eee.eee.eee.
420 @.eee.eee.eee.
421 @.e!e.e!e.e!e.
422 @.eee.eee.eee.
423 @.eee.eee.eee.
424 @.e!e.e!e.e!e.
425 @.eee.eee.eee.
426 @.eee.eee.eee.
427 @.e!e.e!e.e!e.
428 @.eee.eee.eee.
429 @.eee.eee.eee.
430 @.e!e.e!e.e!e.
431 @.eee.eee.eee.
432 @.............
433 Bonus:
434 55555555555555
435 5.............
436 5..0....0...0.
437 5.........00..
438 5..0..........
439 5.0.0.......0.
440 5.0....0....0.
441 5.....0.......
442 5..0.......0..
443 5..?..0?...?..
444 5.0...0...0...
445 5.0.......00..
446 5......0......
447 5.0.0.......0.
448 5..0..........
449 5......00.00..
450 5...0.....0...
451 5.............
452 Level:
453 Twilight
454 Fun in the Sun!
455 Bricks:
456 hhhh..h.......
457 hhhhhh........
458 hhhh.........i
459 hhh.h.......gi
460 hhh..h.....igg
461 hh.h..h...giig
462 hh..h....iig.i
463 hh...h...gi..#
464 h.h......i...#
465 h..h.........#
466 h............#
467 .............#
468 .............#
469 .............j
470 ............j#
471 .......jjjjj.#
472 ......j.j..j.#
473 gggggyyyyyyyyy
474 Bonus:
475 ?..c..l.......
476 wb.j?.........
477 .>-...........
478 ?...........g<
479 ..?..?......fg
480 .{........gb.g
481 >...?.....?g.p
482 .?.......g....
483 ..............
484 ..............
485 c.............
486 ..............
487 ..............
488 .............w
489 ..............
490 .......-..-?..
491 ........?..+..
492 .f.f..........
493 Level:
494 Twilight
495 Just drink it!
496 Bricks:
497 j....eeee....j
498 j....evve....j
499 ##...@jj@...##
500 j....@jj@....j
501 j....@jj@....j
502 j##.@jjjj@.##j
503 j...@hhhh@...j
504 j...@hhhh@...j
505 j.##@hhhh@##.j
506 j...@hhhh@...j
507 j...@hhhh@...j
508 j##.@hhhh@.##j
509 j...@hhhh@...j
510 j...@hhhh@...j
511 ##..@hhhh@..##
512 j...@hhhh@...j
513 j....@@@@....j
514 j##........##j
515 Bonus:
516 +............+
517 ......mm......
518 ......gg......
519 c.....gg.....c
520 ..............
521 w............w
522 b....??......b
523 b......??....b
524 b.......?....b
525 b....?.......b
526 b.....?......b
527 w......?.....w
528 ........?.....
529 .....?........
530 .......?......
531 ......?.......
532 ..............
533 ..............
534 Level:
535 Twilight
536 Feed the Donkey!
537 Bricks:
538 ee@@@@@@@@@ee@
539 eee.......eee@
540 eee.......eee@
541 @.ee.....ee..@
542 @..e.eee.e...@
543 @@@@eeeee@@@@@
544 @..eeeeeee...@
545 @..ejjejje...@
546 @..ejjejje...@
547 @..eeeeeee...@
548 @..eeeeeee...@
549 @..eeeeeee...@
550 @..eeeeeee...@
551 @@@@edede@@@@@
552 @...eddde....@
553 @....dde.....@
554 @...ddd......@
555 @@@@dd@@@@@@@@
556 Bonus:
557 ...........mb.
558 ...........+..
559 mb............
560 ..........*...
561 ..............
562 ....w..*......
563 .....+........
564 ...p..........
565 .....l.b......
566 ..............
567 .......+.w....
568 ..............
569 ...b.....b....
570 .....*j.......
571 ....w.........
572 .....+........
573 ..............
574 ..............
575 Level:
576 Twilight
577 Try one more ball!
578 Bricks:
579 *z#jjjjjjjjjjj
580 *z#jjjjjjjjjjj
581 *z#j#########j
582 *z#jaaaaaaaa@j
583 *z#jaaaaaaaa@j
584 *z###########j
585 *zjjjjjjjjjjjj
586 *zjjjjjjjjjjjj
587 *z###########j
588 *z#jdddddddd@j
589 *z#jdddddddd@j
590 *z#j#########j
591 *z#jjjjjjjjjjj
592 *z#jjjjjjjjjjj
593 *z#j#########j
594 *z#jhhhhhhhh@j
595 *z#jhhhhhhhh@j
596 *z############
597 Bonus:
598 bb.???????????
599 bb............
600 bb............
601 bb............
602 bb............
603 bb............
604 bb............
605 bb............
606 bb............
607 bb............
608 bb............
609 bb............
610 bb.!!!!!!!!!!!
611 bb.{{{{{{{{{{{
612 ww............
613 ww............
614 ww............
615 ww............
616 Level:
617 Twilight
618 No Speed no fun!
619 Bricks:
620 .v...v*..vv..v
621 vvvv....v...v.
622 ..**.*vv.v*.v.
623 .vv*v*v.*..*vv
624 *..v..v*.v.v..
625 ..vvv..v..*.v*
626 ..v.v*.v.v...*
627 ..vv.*v.*.v*..
628 .*vvv.........
629 v*...v...v....
630 ..vv..*v.vv.vv
631 .v.v..*..v.*..
632 .....*.v*..vv.
633 v**vv*..*.vvv.
634 ..*.v...vv...v
635 .v*..vvvv*.vvv
636 vvvvv.......vv
637 .vv...........
638 Bonus:
639 .>...>d..>>..>
640 >>>>....>...>.
641 ..dd.d>>.>+.>.
642 .>>d>d>.d..d>>
643 d..>..>d.>.>..
644 ..>>>..>..d.>l
645 ..>.>d.>.>...d
646 ..>>.d>.d.>d..
647 .+>>>.........
648 >d...>...>....
649 ..>>..d>.>>.>>
650 .>.>..d..>.d..
651 .....d.>d..>>.
652 >dd>>d..d.>>>.
653 ..d.>...>>...>
654 .>d..>>>>d.>>>
655 >>>>>.......>>
656 .>>...........
657 Level:
658 Twilight
659 Try two more balls !
660 Bricks:
661 ghhhhhhhhhhh#g
662 hhhhhhhhhhhh##
663 hhhhhhhhhhhhhh
664 hhhhhhhhhhhhhh
665 hhhhhhhhhhhhhh
666 hhhhhhhhhhhhhh
667 hhhhhhhhhhhhhh
668 hhhhhhhhhhhhhh
669 hhhhhhhhhhhhhh
670 hhhhhhhhhhhhhh
671 hhhhhhhhhhhhhh
672 hhhhhhhhhhhhhh
673 hhhhhhhhhhhhhh
674 hhhhhhhhhhhhhh
675 hhhhhhhhhhhhhh
676 hhhhhhhhhhhhhh
677 hhhhhhhhhhhhhh
678 hhhhhhhhhhhhhh
679 Bonus:
680 mbbbbbbbbbbb55
681 bbbbbbbbbbbb55
682 bbbbbbbbbbbb55
683 bbbbbbbbbbbbbb
684 bbbbbbbbbbbbbb
685 bbbbbbbbbbbbbb
686 bbbbbbbbbbbbbb
687 bbbbbbbbbbbbbb
688 bbbbbbbbbbbbbb
689 bbbbbbbbbbbbbb
690 bbbbbbbbbbbbbb
691 bbbbbbbbbbbbbb
692 bbbbbbbbbbbbbb
693 bbbbbbbbbbbbbb
694 bbbbbbbbbbbbbb
695 bbbbbbbbbbbbbb
696 >>>>>>>>>>>>>>
697 wwwwwwwwwwwwww
698 Level:
699 Twilight
700 V minus!
701 Bricks:
702 ##ffffffffff##
703 cccffffffffccc
704 cccffffffffccc
705 f##ffffffff##f
706 fcccffffffcccf
707 fcccffffffcccf
708 ff##ffffff##ff
709 ffcccffffcccff
710 ffcccffffcccff
711 fff##ffff##fff
712 fffcccffcccfff
713 fffcccffcccfff
714 ###f##ff##f###
715 ffffccccccffff
716 ffffccccccffff
717 fffff####fffff
718 fffffc##cfffff
719 ffffff##ffffff
720 Bonus:
721 ..l..c.....l..
722 5?m........m?5
723 .?..........?.
724 ..............
725 ..?.s0000cw?..
726 ..?.j0000!.?..
727 c.............
728 ...?...c..?.c.
729 ..w?......?..p
730 ..............
731 ....?0..0?+...
732 .?..?0..0?..?.
733 ......c.......
734 .?..+????...?.
735 ..p..????.....
736 ..............
737 c.............
738 ..............
739 Level:
740 Twilight
741 Not as hard as it looks !
742 Bricks:
743 cccccccccccccc
744 cccccccccccccc
745 cc##########cc
746 cc....vv....cc
747 cc....vv....cc
748 ######vv######
749 cccccccccccccc
750 cccccccccccccc
751 cc##########cc
752 cc....vv....cc
753 cc....vv....cc
754 ######vv######
755 cccccccccccccc
756 cccccccccccccc
757 cc##########cc
758 cc....vv....cc
759 cc....vv....cc
760 ######vv######
761 Bonus:
762 ...*..ll..*...
763 .*...*mm*...*.
764 .b..........b.
765 .*....55....*.
766 ......bb......
767 ..............
768 ccc*ccbbcc*ccc
769 c*ccc*cc*ccc*c
770 ..............
771 .*....ss....*.
772 ......bb......
773 ......<<......
774 ccc*ccbbcc*ccc
775 c*ccc*ww*ccc*c
776 ..............
777 .*....++....*.
778 ......ww......
779 ..............
780 Level:
781 Twilight
782 Deja Vu?
783 Bricks:
784 c*c#c*c#c*c#c*
785 c*c@c*c@c*c@c*
786 c#c#c#c#c#c#c#
787 c#j#c#c#j#c#c#
788 c@j#c@c#j@c#c@
789 c#j#j#c#j#j#c#
790 c#j#j#j#j#j#c#
791 c@j#j@j#.@j#j@
792 j#j*j#j*.#j*j#
793 j#j*j#j*.#j*j#
794 j@.#j@j#.@j#j@
795 j#.#j#j#.#j#j#
796 j#.#j#.#.#j#j#
797 j@.#j@.#.@j#j@
798 j#.#.#.#.#.#j#
799 j#.#.#.#.#.#j#
800 .*.@.*.@.*.@j*
801 .*.#.*.#.*.#j*
802 Bonus:
803 ?.?.?m?.?m?.?.
804 ?w?.?.?.?.?.?w
805 ?.?.?.?.?.?.?.
806 ?.f.?.?.f.?.?.
807 ?.f.?.?.f.?.?.
808 ?.f.f.?.f.f.?.
809 ?.f.f.f.f.f.?.
810 ?.f.f.f...f.f.
811 f.flf.fl..flf.
812 f.f5f.f5..f5f.
813 f...f.f...f.f.
814 f...f.f...f.f.
815 f...f.....f.f.
816 f...f.....f.f.
817 f...........f.
818 f...........f.
819 .p...+...w..f+
820 .w...w...w..fw
821 Level:
822 Twilight
823 You like chaos?
824 Bricks:
825 ...#e#e#e#....
826 dddddddddddddd
827 ffffffffffffff
828 ....#ccc#.....
829 ....#c*c#.....
830 ...#######....
831 ..............
832 #.#.#.##.#.#.#
833 gggggggggggggg
834 .#ccc#..#ccc#.
835 .#c*c#..#c*c#.
836 .#####..#####.
837 hhhhhhhhhhhhhh
838 #j#j#j#j#j#j#j
839 **************
840 ..............
841 ..............
842 ..............
843 Bonus:
844 ....!.l.!.....
845 ..............
846 bbb..m..m..bbb
847 .....555......
848 .....>>>......
849 ..............
850 ..............
851 ..............
852 cccccccccccccc
853 ..???....???..
854 ..?.?....?.?..
855 ..............
856 cccccccccccccc
857 ..............
858 fwfwfwfwfwfwfw
859 ..............
860 ..............
861 ..............
862 Level:
863 Twilight
864 Recursion !
865 Bricks:
866 aaaaaaaaaaaaaa
867 adddadddadddad
868 adddadddadddad
869 aaaaaaaaaaaaaa
870 eeaeeeaeeeaeee
871 eeaeeeaeeeaeee
872 aaaaaaaaaaaaaa
873 ..............
874 ..............
875 ..............
876 .....j........
877 ....jjj.......
878 .....j........
879 ..............
880 ..............
881 ..............
882 ......deed....
883 ......deed....
884 Bonus:
885 ??????????????
886 ??????????????
887 j?????j???j??j
888 ??j???????????
889 pp..>.b.>pl.b.
890 ..b..>......b.
891 ...b....b....>
892 ..............
893 ..............
894 ..............
895 .....w........
896 .....w........
897 ..............
898 ..............
899 ..............
900 ..............
901 .......++.....
902 ..............
903 Level:
904 Twilight
905 Bullseye !
906 Bricks:
907 .....aaaa.....
908 ....a####a....
909 ...a#eeee#a...
910 ..a#ehhhhe#a..
911 .a#eh....he#a.
912 a#eh.#jj#.he#a
913 eeh.#****#.hee
914 hh.#j*cc*j#.hh
915 ...@j*cc*j@...
916 jj.#j*cc*j#.jj
917 a#j.#****#.j#a
918 .a#j.#jj#.j#a.
919 ..a#j....j#a..
920 ...a#jjjj#a...
921 ....a#@@#a....
922 .....aaaa.....
923 ..............
924 ..............
925 Bonus:
926 .....c..+.....
927 .....0000.....
928 ...+0...b0s...
929 ...0.wb...0...
930 ..0?s....+?0..
931 ?0...0550...0c
932 ..c.0....0....
933 .+.05.ll.50.w.
934 ...05.mm.50...
935 s..05.++.50.b.
936 .0..0....0..0s
937 .b0..0550..0..
938 ..+0.....j0...
939 ....0c.?.0+...
940 .....0000.....
941 ......w.s.....
942 ..............
943 ..............
944 Level:
945 Twilight
946 No sun at all!
947 Bricks:
948 bcEEEEEccabbbc
949 bcEaabbbcEbbcc
950 bbEaaEEbEEbbca
951 cbccccEaEbbcEE
952 caEacg.abbcEEc
953 .cag...g.ccaac
954 ......g...cccc
955 .g.g.gg..gg...
956 g...gg.g...g..
957 g.g...g.g..g.g
958 ....g...gg..g.
959 g.g...g...g.g.
960 g....g.g.g...g
961 gg.g....g..g.g
962 ..........g.gg
963 .g.gg.g.g.....
964 .gg.....ggg.g.
965 .gg.g.g..g....
966 Bonus:
967 ?.........???.
968 ?..?????..??..
969 ??.??..?..??.?
970 .?.....?.??...
971 .?.?...???....
972 ..?........??.
973 ......?.......
974 ..............
975 ?...??.....?..
976 ..?...........
977 ........??..?.
978 ?.?...?.......
979 ?......?.?...?
980 ?.......?....?
981 ..........?..?
982 .?.??.?.......
983 ..?.....??....
984 .?............
985 Level:
986 Twilight
987 Snake!
988 Bricks:
989 ..............
990 ..............
991 ..E#E#E#E#E#E.
992 ..#.........#.
993 ..E.........E.
994 ..#..#####..#.
995 ..E..#!*##..E.
996 ..#..#.#*#..#.
997 ..E..#e#*#..E.
998 ..#..#e#*#..#.
999 ..E..#e#*#..E.
1000 ..#..###*#..#.
1001 ..E.....*#..E.
1002 ..#......#..#.
1003 ..E#E#E#E#..E.
1004 ............#.
1005 ............E.
1006 #E#E#E#E#E#E#.
1007 Bonus:
1008 ..............
1009 ..............
1010 ..............
1011 ..............
1012 ..............
1013 ..............
1014 ......mw......
1015 ......m.w.....
1016 ......5.......
1017 ......5.......
1018 ......5.......
1019 ..............
1020 ..............
1021 ..............
1022 ..............
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Twilight
1028 Cya !
1029 Bricks:
1030 vvvvvvvvvvvvvv
1031 vvvveevvvvvvvv
1032 vveeevvvvvvvvv
1033 veevvvvvvvvvvv
1034 vevvvvvvvveevv
1035 vevvvvvvvevvev
1036 vevvvvvvvevvev
1037 vevevvvveevvev
1038 veveevvveevvev
1039 vevvevvveevvev
1040 vevveevveevvev
1041 veevveveeeeeev
1042 vveeeevevevvev
1043 vvvvveeevevvev
1044 vvvvvveevevvev
1045 vvvvvvevvvevee
1046 vvevveevvvvvve
1047 vvveeevvvvvvvv
1048 Bonus:
1049 55555555555555
1050 5555**55555555
1051 55***555555555
1052 5**55555555555
1053 5*55555555**55
1054 .*.......*..*.
1055 .*.......*..*.
1056 .*.*....**..*.
1057 .*.**...**..*.
1058 .*..*...**..*.
1059 .*..**..**..*.
1060 .**..*.******.
1061 ..bbbb.b.b..b.
1062 .....bbb.b..b.
1063 ......ww.w..w.
1064 ......w...w.ww
1065 ..w..ww......w
1066 ...www........
0 Version: 1.00
1 Level:
2 Mench
3 Checkers
4 Bricks:
5 ..............
6 .!.!.!.!.!.!.!
7 @x@x@x@x@x@x@x
8 d.............
9 d.v.v.v.v.v.v.
10 d@.@.@.@.@.@.@
11 d.v.v.v.v.v.v.
12 d.............
13 @*@*@*@*@*@*@*
14 d.............
15 d.v.v.v.v.v.v.
16 d@.@.@.@.@.@.@
17 d.v.v.v.v.v.v.
18 d.............
19 @x@x@x@x@x@x@x
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 .>.~.>.~.>.~.>
26 .w...........w
27 5.............
28 5.d.d.d.d.d.d.
29 5.............
30 5.f.f.f.f.f.f.
31 5.............
32 .b.b.b.b.b.b.b
33 5.............
34 5.d.d.d.d.d.d.
35 5.............
36 5.{.{.{.{.{.{.
37 5.............
38 .?.?.?.?.?.?.?
39 ..............
40 ..............
41 ..............
42 Level:
43 Mench
44 PineApple
45 Bricks:
46 @@@ff@@@@ff@@@
47 @@fyyf@@fyyf@@
48 @fyffyffyffyf@
49 fyfxxfyyfxxfyf
50 yfx##xffx##xfy
51 fx####xx####xf
52 x####hhhh####x
53 @###hhhhhh###@
54 @##hhhhhhhh##@
55 @#hhxfhhfxhh#@
56 @#hhfxhhxfhh#@
57 @#hhhhhhhhhh#@
58 @#hhhhhhhhhh#@
59 @#hhhhhhhhhh#@
60 @#hhhhhhhhhh#@
61 @##hhhhhhhh##@
62 @###hhhhhh###@
63 @@@@@hhhh@@@@@
64 Bonus:
65 ...55....55...
66 ..5..5..5..5..
67 .5.55.55.55.5.
68 5.5.g5pp5g.5.5
69 .5...b55b...5.
70 5.....bb.....5
71 .....llll.....
72 ....~~~~~~....
73 ..............
74 ..g.b5<<5b.g..
75 ....5bffb5....
76 ...WfWWWWfW...
77 ..............
78 ..............
79 ..~~~~~~~~~~..
80 ...c++gg++c...
81 ....{{gg{{....
82 .....d>>d.....
83 Level:
84 Mench
85 Bunny Chow
86 Bricks:
87 vxxEEEEEEEExxv
88 ..............
89 ..vv@@xx@@vv..
90 .v..vEvvEv..v.
91 .....vvvv.....
92 .....@xx@.....
93 xE..@xvvx@..Ex
94 .@.@x*vv*x@.@.
95 .@.@xvvvvx@.@.
96 xE.@xvxxvx@.Ex
97 .@.@xvvvvx@.@.
98 .@..@xvvx@..@.
99 xE...@xx@...Ex
100 ....EEEEEE....
101 ......vv......
102 EEE........EEE
103 ..............
104 ..............
105 Bonus:
106 *>b........b>*
107 ..............
108 ..55..>>..55..
109 .5..5.WW.5..5.
110 .....5WW5.....
111 .....0550.....
112 ~...055550...~
113 ...05W55W50...
114 ...05555550...
115 ~..055>>550..~
116 ...05555550...
117 ....055550....
118 ~.....55.....~
119 ..............
120 ......dd......
121 ..............
122 ..............
123 ..............
124 Level:
125 Mench
126 Longhorn
127 Bricks:
128 @@@@@@@@@@@@@@
129 @v...!!!!...v@
130 @v...!!!!...v@
131 @v...@vv@...v@
132 @v...@vv@...v@
133 @v...@xx@...v@
134 @v...@@@@...v@
135 @vvv......vvv@
136 @EEv......vEE@
137 @@Ev......vE@@
138 @@Ev......vE@@
139 @@EvvvvvvvvE@@
140 @@EEEEvvEEEE@@
141 @@@@@EvvE@@@@@
142 @@@@@EvvE@@@@@
143 @@@@@EvvE@@@@@
144 @@@@@EvvE@@@@@
145 @@@@@@vv@@@@@@
146 Bonus:
147 ..............
148 .*..........*.
149 .p..........p.
150 ......55......
151 .w....55....w.
152 .b....55....b.
153 .b..........b.
154 .ccc......ccc.
155 ..............
156 ...~......~...
157 ..............
158 ...gddllddg...
159 ......ff......
160 ......ff......
161 ......44......
162 ......>>......
163 ......>>......
164 ......>>......
165 Level:
166 Mench
167 Bucket
168 Bricks:
169 *v...@@@@...v*
170 vv..........vv
171 ..vvvvvvvvvv..
172 ..vvvvvvvvvv..
173 ..vv!!!!!!vv..
174 ..vv@!!!!@vv..
175 ..vv@!!!!@vv..
176 ..vv#!!!!#vv..
177 ..vv@!!!!@vv..
178 ..vv#!!!!#vv..
179 ..vv@!!!!@vv..
180 ..vv#!!!!#vv..
181 ..vv@!!!!@vv..
182 ..vv#!!!!#vv..
183 ..vv@!!!!@vv..
184 ..vvEEEEEEvv..
185 ..............
186 ..............
187 Bonus:
188 5g..........g5
189 g............g
190 ..fb*>.b.*.f..
191 ...>.......>..
192 ..........b...
193 ..b...........
194 .....gg...>b..
195 ...b.g.dd.....
196 .......dw.b...
197 ..{....dd.....
198 ..>>.f>f..>{..
199 .....~w~......
200 .....f~f......
201 ..b........>..
202 .....5555.....
203 ..{d......d{..
204 ..............
205 ..............
206 Level:
207 Mench
208 2 Easy
209 Bricks:
210 vxvxvxvxvxvxvx
211 ..............
212 *!*!*!*!*!*!*@
213 @*@*@*@*@*@*@*
214 *!*!*!*!*!*!*!
215 @*@*@*@*@*@*@*
216 *!*!*!*!*!*!*!
217 @*@*@*@*@*@*@*
218 *!*!*!*!*!*!*!
219 @*@*@*@*@*@*@*
220 *!*!*!*!*!*!*!
221 @*@*@*@*@*@*@*
222 *!*!*!*!*!*!*@
223 vvvvvvvvvvvvvv
224 xxxxxxxxxxxxxx
225 vvvvvvvvvvvvvv
226 ..............
227 ..............
228 Bonus:
229 .l.l.l.l.l.l.l
230 ..............
231 *!*!*!*!*!*!*.
232 ..............
233 ..............
234 ..............
235 W.W.W.W.W.W.W.
236 .~.~.~.~.~.~..
237 >.>.>.>.>.>.>.
238 .b.b.b.b.b.b.b
239 f.f.f.f.f.f.f.
240 .{.{.{.{.{.{.{
241 dgdgdgdgdgdgd.
242 cccccccccccccc
243 bbbbbbbbbbbbbb
244 cccccccccccccc
245 ..............
246 ..............
247 Level:
248 Mench
249 Time
250 Bricks:
251 EEEE@@@@@@EEEE
252 EEE@vvvvvv@EEE
253 EE@vvv@vvvv@EE
254 E@vvvv@vvvvv@E
255 @vvvvv@vvvvvv@
256 @vvvvv@vvvvvv@
257 @vvvvv@vvvvvv@
258 @vvvvv@vvvvvv@
259 @vvvvv@vvvvvv@
260 @vvvvvv@vvvvv@
261 @vvvvvvv@vvvv@
262 @vvvvvvvv@vvv@
263 @vvvvvvvvv@vv@
264 E@vvvvvvvvvv@E
265 EE@vvvvvvvv@EE
266 EEE@vvvvvv@EEE
267 EEEEddddddEEEE
268 ..............
269 Bonus:
270 ..............
271 ....5>5df*....
272 ....>*.5555...
273 ..>d.d.fdfd...
274 ...~>..d.~.d..
275 .>*..>.*{.f~f.
276 .~>d....f...*.
277 ...~>..f.~fd~.
278 .>5.d~.5d.w*..
279 .d{~.....5d.f.
280 ..d.5>.5.f.d{.
281 .>.>.d~d..f...
282 .{5...5.>{.5f.
283 ..f5f.f5f.f5..
284 ...d5d5d5dd...
285 ....*g{g*g....
286 ......{.c.....
287 ..............
288 Level:
289 Mench
290 Layers
291 Bricks:
292 xyzxyzEEEEEEEE
293 @xyzxyzEEEEEEE
294 dexyzxyzEEEEEE
295 gd@xyzxyzEEEEE
296 hgdexyzxyzEEEE
297 jhgd@xyzxyzEEE
298 kjhgdexyzxyzEE
299 fkjhgd@xyzxyzE
300 @fkjhgdexyzxyz
301 @@fkjhgd@xyzxy
302 @@@fkjhgdexyzx
303 @*@@fkjhgd@xyz
304 @**@@fkjhgdexy
305 @*v*@@fkjhgd@x
306 @*vv*@@fkjhgde
307 @*vvv*@@fkjhgd
308 @******@@fkjhg
309 @@@@@@@@@@fkjh
310 Bonus:
311 .p.p.l........
312 .4???4........
313 .??!!??p......
314 4...??d?......
315 d.???d???.....
316 ..?.?!!~?.p...
317 pp????4???.4..
318 ..?4??~????~..
319 b!d??.???!!?..
320 bbd!??.?!d4.~p
321 dbb!!~??.!?!?.
322 ~5bb!!?!??.4p?
323 d55bb.4.!.!4d?
324 ~555bbd?p.4d.?
325 d5555bbd.?dd?d
326 ~55555bbd4??pm
327 d555555bb.dddd
328 ~d~d~d~dbbcccc
329 Level:
330 Mench
331 Confusion
332 Bricks:
333 @@@@@@@@@@@@@@
334 @ve.!!@@!!.ev@
335 @ze.!!@@!!.ez@
336 @ze.!!@@!!.ez@
337 @ze@@@@@@@@ez@
338 @ze.**@@**.ez@
339 @ze.**@@**.ez@
340 @ve.**@@**.ev@
341 @@@@..@@..@@@@
342 @v!@g@@@@g@!v@
343 @!!@.g@@g.@!!@
344 @!!@g@@@@g@!!@
345 @!!@.g@@g.@!!@
346 @!!@g@@@@g@!!@
347 @@..........@@
348 @............@
349 @............@
350 @............@
351 Bonus:
352 ..............
353 .b..55..55..b.
354 .l..55..55..l.
355 .<..55..55..<.
356 .<b........b<.
357 .<b.fd..df.b<.
358 .lW.ff..ff.Wl.
359 ..W.dc..cd.W..
360 ..............
361 .~f.w....w.f~.
362 .WW..>..>..WW.
363 .b~.f....f.~b.
364 .!d..>..>..d!.
365 .dd.w....w.dd.
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Mench
372 Peppermint
373 Bricks:
374 @@@@@@@@@@@@@@
375 zx...vxxv...xz
376 zx...xvvx...xz
377 @!...@@@@...!@
378 zx...xvvx...xz
379 @!...vxxv...!@
380 zx..z@@@@z..xz
381 @!..@yyyy@..!@
382 zx.!x....x!.xz
383 @!.!x....x!.!@
384 zx..@.xx.@..xz
385 @!..@....@..!@
386 zx!x@....@x!xz
387 @z@z@y..y@z@z@
388 ..............
389 ..............
390 ..............
391 ..............
392 Bonus:
393 ..............
394 .....d55d.....
395 .....5bb5.....
396 ..............
397 d....5bb5....d
398 .....d55d.....
399 d&..?....?..&d
400 .....<dd<.....
401 ?f.{W....W{.f?
402 ...{W....W{...
403 ?~....>>....~?
404 .~..........~.
405 !{~{......{~{!
406 .f.f.f..f.f.f.
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Mench
413 Top Vs Bottom
414 Bricks:
415 EEEEExxxxEEEEE
416 EEEExyyyyxEEEE
417 EEExyzzzzyxEEE
418 EExyzzzzzzyxEE
419 ExyyyyyyyyyyxE
420 xxxxxxxxxxxxxx
421 .....EEEE.....
422 ......vv......
423 !*!*.@@@@.*!*!
424 !*!*..zz..*!*!
425 .....EEEE.....
426 vvvvvvvvvvvvvv
427 @vvvvvvvvvvvv@
428 @@vvvvvvvvvv@@
429 @@@vvvvvvvv@@@
430 @@@@vvvvvv@@@@
431 @@@@@vvvv@@@@@
432 ..............
433 Bonus:
434 .....5dd5.....
435 ....5d..d5....
436 ...5d....d5...
437 ..5d..<<..d5..
438 .5df<ffff<fd5.
439 ??????????????
440 ..............
441 ......55......
442 .f.f......f.f.
443 .f.f..55..f.f.
444 ..............
445 ?fcddddddddcf?
446 .c*c000000c*c.
447 ..~>d>dd>d>~..
448 ...0f0ff0f0...
449 ....>dddd>....
450 .....bWWb.....
451 ..............
452 Level:
453 Mench
454 Smiley
455 Bricks:
456 @vvvvvvvvvvvv@
457 v....iiii....v
458 v...iivviii..v
459 v..iivvvvvi..v
460 v..ivvvvvvii.v
461 v..iv**v**vi.v
462 v..iv**v**vi.v
463 @..ivvvvvvvi.@
464 v..i.vv@vv.i.v
465 v..i...@...i.v
466 v..i.......i.v
467 v..ii!!!!!ii.v
468 v...i.....i..v
469 v...ii...ii..v
470 v....iiiii...v
471 @............@
472 ..............
473 ..............
474 Bonus:
475 .************.
476 w....dddd....d
477 w...dd**ddd..d
478 w..dd55555d..d
479 w..d5555555d.d
480 w..p5..p..5p.d
481 w..d5..p..5d.d
482 ...d5555555p..
483 d..d.55.55.d.w
484 d..p.......d.w
485 d..d.......d.w
486 d..ddbbbbbdd.w
487 d...j.....p..w
488 d...dd...dd..w
489 d....ddddd...w
490 ..............
491 ..............
492 ..............
493 Level:
494 Mench
495 Dark Days
496 Bricks:
497 @zzzzzzzzzzzz@
498 @.@..vvvv..@.@
499 @.v..@@@@..v.@
500 @.v..xxxx..v.@
501 @.v..xxxx..v.@
502 @.@..xxxx..@.@
503 @.z..xxxx..z.@
504 @.z..x@@x..z.@
505 @.z..@vv@..z.@
506 @.z..vvvv..z.@
507 E.EEEEvvEEEE.E
508 xxxxxxxxxxxxxx
509 **************
510 yyyyyyyyyyyyyy
511 **************
512 zzzzzzzzzzzzzz
513 **************
514 ..............
515 Bonus:
516 .bbbbbbbbbbbb.
517 .....<cc<.....
518 ..>........>..
519 ..>..dddd..>..
520 ..>..d55d..>..
521 .....d55d.....
522 ..d..d55d..d..
523 ..d..d..d..d..
524 ..d...WW...d..
525 ..d..WllW..d..
526 ......WW......
527 fdddddffdddddf
528 ..............
529 ?{{{{{ff{{{{{?
530 ..............
531 ?>>f>f??f>f>>?
532 dddddddddddddd
533 ..............
534 Level:
535 Mench
536 ????????
537 Bricks:
538 jjjjjjjjjjjjjj
539 jjjjjjjjjjjjjj
540 jjjjjjjjjjjjjj
541 jjjjjjjjjjjjjj
542 jjjjjjjjjjjjjj
543 xxxxxxxxxxxxxx
544 z.vvvvvvvvvv.z
545 z.vvzzzzzzvv.z
546 z*vvz*zz*zvv*z
547 z.vv@@@@@@vv.z
548 z.v........v.z
549 z.v........v.z
550 z*v........v*z
551 z.v........v.z
552 EEEEEvvvvEEEEE
553 ..............
554 ..............
555 ..............
556 Bonus:
557 ??????????????
558 ??????????????
559 ??????????????
560 ??????????????
561 ??????????????
562 ?d?d?d?d?d?d??
563 ?.5555555555.?
564 ?.5.dcdddc55.?
565 ?.5.cddddc.5.?
566 ?.5b......b5.?
567 ?.5........5.?
568 ?.5........5.?
569 ?.w........w.?
570 ?.s........s.?
571 .....>>>>.....
572 ..............
573 ..............
574 ..............
575 Level:
576 Mench
577 Blue Wall
578 Bricks:
579 ExEyExEyExEyEx
580 !x!y!x!y!x!y!x
581 !x!y!x!y!x!y!x
582 !x!y!x!y!x!y!x
583 !x!y!x!y!x!y!x
584 !x!y!x!y!x!y!x
585 ExEyExEyExEyEx
586 ExEyExEyExEyEx
587 @xEyEx@yExEy@x
588 @xEyEx@yExEy@x
589 ExEyExEyExEyEx
590 .v.v.v.v.v.v.v
591 v.v.v.v.v.v.v.
592 .v.v.v.v.v.v.v
593 ..............
594 ..............
595 ..............
596 ..............
597 Bonus:
598 ...d.d.d.d....
599 WpWpWpWpWpWpWp
600 .}.p.{.p.p.p.p
601 cwc!cwc!cwc!cw
602 +b+b+blblblblb
603 fbfbfbfbmbfbfb
604 .?.{.?.?.?.d.?
605 .?.?.?.?.{.?.?
606 .d.d.d.d.d.d.d
607 .f.{.f.{.f.{.f
608 .w.w.w.w.w.w.w
609 .>.b.~.b.d.>.d
610 f.c.d.c.d.{.f.
611 .j.b.j.b.~.>.j
612 ..............
613 ..............
614 ..............
615 ..............
616 Level:
617 Mench
618 U cant c me
619 Bricks:
620 @@@@@....*vvvv
621 @v......#.*vvv
622 @vv....*...*v#
623 @vvv..#.....*.
624 @vvvv*.....#.v
625 vvvv#.....*.v.
626 vvv*.....#.v..
627 vv#.....*.v...
628 v*.....#.v....
629 #.....*.v.....
630 vvv..#.v......
631 vvv.*.v.......
632 vvv#.v........
633 vv*.v.........
634 v#.v..........
635 *.v...........
636 .v............
637 v.............
638 Bonus:
639 ..........5555
640 .5........?...
641 ..5....?....b.
642 ...5........?.
643 ....b........>
644 ..........?.>.
645 ...?.......>..
646 .b........>...
647 b........>....
648 ......?.>.....
649 555....>......
650 555...>.......
651 555..>........
652 55?.>.........
653 5..>..........
654 ..>...........
655 .>............
656 >.............
657 Level:
658 Mench
659 Off Centre
660 Bricks:
661 c@yyyy@yyyyy@c
662 cE....E.....Ec
663 x.dddddddddd.x
664 x..E......E..x
665 x..@......@..x
666 x....***.....x
667 x....*!*.....x
668 xE...!E!....Ex
669 x@...*@*....@x
670 x...*****....x
671 x..*..!..*...x
672 !!!E..!..E!!!!
673 ...@..!..@....
674 ......!.......
675 ......!.......
676 .E....E.....E.
677 .@....@.....@.
678 ..............
679 Bonus:
680 l..5......5..l
681 s............s
682 ......*.......
683 ?............?
684 ..............
685 5....b.b.....5
686 5.....p......5
687 ..............
688 ..............
689 !...?.w.?....!
690 w.....d......w
691 ddd...f...dddd
692 ......f.......
693 ......p.......
694 ......f.......
695 ..............
696 ..............
697 ..............
698 Level:
699 Mench
700 Black & Blue
701 Bricks:
702 xcc!E!!!!E!ccx
703 c..!E****E!..c
704 c..!E****E!..c
705 c..!!!!!!!!..c
706 c..!EEEEEE!..c
707 c..vvvxxvvv..c
708 c..vvv@@vvv..c
709 xvvvvv@@vvvvvx
710 EEEEvv@@vvEEEE
711 idefvv@@vvfedi
712 def.vv@@vv.fed
713 ef..vvxxvv..fe
714 f..vEEEEEEv..f
715 ...v......v...
716 ...v......v...
717 @@@v......v@@@
718 ..............
719 ..............
720 Bonus:
721 bgg........ggb
722 >....~W~W....>
723 >....W~W~....>
724 >............>
725 >............>
726 >.....df.....>
727 >.....dd.....>
728 b.....ld.....b
729 {...g.dd.g....
730 {dbgg.fl.ggbd{
731 {db.g.dd.g.bd{
732 {d..g.ld.g..d{
733 {..d......d..{
734 ...d......d...
735 ...m......m...
736 d~dW......Wd~d
737 ..............
738 ..............
739 Level:
740 Mench
741 8 tiles
742 Bricks:
743 @.!........!.@
744 @.#........#.@
745 @.#........#.@
746 @.!...!!...!.@
747 @@@!@@@@@@!@@@
748 ......@@......
749 ..............
750 ..............
751 @...@....@...@
752 ..............
753 ..............
754 ..............
755 ..@...@@...@..
756 ..............
757 ..............
758 ..............
759 ..............
760 ..............
761 Bonus:
762 ..?........?..
763 ..............
764 ..............
765 ..w...bb...w..
766 ...b......b...
767 ..............
768 ..............
769 ..............
770 ..............
771 ..............
772 ..............
773 ..............
774 ..............
775 ..............
776 ..............
777 ..............
778 ..............
779 ..............
780 Level:
781 Mench
782 Rain
783 Bricks:
784 @@*!*@@@@@@@@@
785 @!!*!*!!!!!!!@
786 @!*!*!*!!!!!!@
787 @!!*!*!*!!!!!@
788 @!!!*!*!*!!!!@
789 @!!!!*!*!*!!!@
790 @!!!!@*!*!*!!@
791 @!!!!@!*!*!*!@
792 @!!!!@!!*!*!*@
793 @!!!!@!!!!!zzz
794 @!!!!@!!!!!zzz
795 @!!!!@!!!!!zzz
796 @!!!!@!!!!!zzz
797 @!!!!@!!!!!zzz
798 @@@@@@@@@@@@@z
799 @@@@@@@@@@@@@z
800 ..............
801 ..............
802 Bonus:
803 ..dgd.........
804 .gglf~g{dd.Wb.
805 ..bdlf~g555.-.
806 .5?bdlf~{d*5..
807 .-d{gdlf~dd.5.
808 .5.5{bdlf~.-*.
809 ..{-..gdlf~...
810 .W?5d..bglf~..
811 .d55d.-5b{l...
812 ..5W{..W{-.{{{
813 .*-{..d..55ff>
814 ....-.+-5{.>.W
815 ..*d..d*..-.{f
816 .b..?.d.-*.>>b
817 .............w
818 .............b
819 ..............
820 ..............
821 Level:
822 Mench
823 Rainbow
824 Bricks:
825 zzzz@@@@@@zzzz
826 fghje....ejhgf
827 fghje....ejhgf
828 fghje....ejhgf
829 fg!*E.vv.E*!gf
830 f!*@e.vv.e@*!f
831 !*Eje....ejE*!
832 *@hje....ejh@*
833 Eghje@@@@ejhgE
834 fghje....ejhgf
835 fghje....ejhgf
836 fg!*EvvvvE*!gf
837 f!*@......@*!f
838 !*EvvvvvvvvE*!
839 *@..........@*
840 E............E
841 ..............
842 ..............
843 Bonus:
844 c.c........cf.
845 ?..f......f..d
846 .wb?d....d.b..
847 ddf.?.....?dw.
848 ......5l....df
849 f.....l5......
850 ...d?....d....
851 ..d.......f...
852 ...d.....d.?..
853 .wdd?....f?d?d
854 d.f!!....!!dfc
855 .fd..b>b<.....
856 b...........db
857 ...bWb>bWb>...
858 ..............
859 ..............
860 ..............
861 ..............
862 Level:
863 Mench
864 2 Towers
865 Bricks:
866 @@@@@@vv@@@@@@
867 @@zc@@vv@@cz@@
868 ..zc..vv..cz..
869 ..zc..vv..cz..
870 ..zc..vv..cz..
871 ..zc..vv..cz..
872 ..zc..vv..cz..
873 ..zc..vv..cz..
874 ..zc..vv..cz..
875 ..zc..vv..cz..
876 ..zc..vv..cz..
877 ..zc..vv..cz..
878 ..zc..vv..cz..
879 ..zc..vv..cz..
880 ..zc@@vv@@cz..
881 ..zc@@@@@@cz..
882 ..............
883 ..............
884 Bonus:
885 ......55......
886 ......55......
887 ...b..55..b...
888 ...d..55..d...
889 ..>?..55..?>..
890 ...b..55..b...
891 ...d..55..d...
892 ..>?..55..?>..
893 ...b..55..b...
894 ..{d..55..d{..
895 ..>?..55..?>..
896 ...b..55..b...
897 ...d..55..d...
898 ..>?..55..?>..
899 ..cb..??..bc..
900 ..............
901 ..............
902 ..............
903 Level:
904 Mench
905 Pyramids
906 Bricks:
907 EEEEEEEEEEEEEE
908 xxxxxxxxxxxxxx
909 @.@.@*@*@.@.@.
910 iiiiiiiiiiiiii
911 iiiiiiiiiiiiii
912 f@ggggccgggg@f
913 zf@gggccggg@fz
914 ff*@*gccg*@*ff
915 fzff@gggg@ffzf
916 fffff@..@fffff
917 zfzff....ffzfz
918 fffff@..@fffff
919 fzff@....@ffzf
920 ff*@......@*ff
921 ff@........@fz
922 f@..........@f
923 @............@
924 ..............
925 Bonus:
926 ..............
927 m.>.>m..>m..>m
928 ..............
929 .b..b?..b?.b..
930 ?.d.d..d..d.d?
931 ...<??ww??<...
932 .b..??ww??..b.
933 .d...?ww?...d.
934 ?fbb.<??<.bbf?
935 .?........d...
936 !..d?....?..?!
937 ...d......d..?
938 ?*~........~*d
939 df..........fd
940 .f..........f.
941 !............!
942 ..............
943 ..............
944 Level:
945 Mench
946 Blue Balls
947 Bricks:
948 EEEEEEEEEEEEEE
949 **.d.!..!.d.**
950 **.d.Ev.E.d.**
951 **.d.E.vE.d.**
952 **.d.E..E.d.**
953 EEEE!Ev.E!EEEE
954 .....E..E.....
955 dddddE.vEddddd
956 .....E..E.....
957 .@@@@Ev.E@@@@.
958 .....E..E.....
959 .....E.vE.....
960 cccccE..Ezzzzz
961 cccccEv.Ezzzzz
962 EEEEEE..EEEEEE
963 ..............
964 ..............
965 ..............
966 Bonus:
967 ..............
968 5f..........d5
969 5f..........dj
970 jf.m...c..m.d5
971 5j..........j5
972 ......>.......
973 ..............
974 ??.??..>.?????
975 ..............
976 .~~~~.c..~~~~.
977 ..............
978 .......>......
979 wwwww....bbbbb
980 jddjj.>..5j555
981 ..............
982 ..............
983 ..............
984 ..............
985 Level:
986 Mench
987 Get up There
988 Bricks:
989 x@x@ffffff@x@x
990 .@.@ffffff@.@.
991 .@.@ffffff@.@.
992 x@x@ffEEff@x@x
993 .@.@!!!!!!@.@.
994 .@.@!v**v!@.@.
995 x@x@!!!!!!@x@x
996 .@.@EExxEE@.@.
997 .@.@vvvvvv@.@.
998 x@x@......@x@x
999 .@.@......@.@.
1000 .@.@..EE..@.@.
1001 x@x@......@x@x
1002 f@f@......@f@f
1003 f@f@EE..EE@f@f
1004 ..............
1005 ..............
1006 ..............
1007 Bonus:
1008 l............l
1009 ....bbbbbb....
1010 ....W.WW.W....
1011 b.b.ww..ww.b.b
1012 ....ffffff....
1013 ....!d..d!....
1014 w.b.bf!!fb.b.w
1015 ......bb......
1016 ....g>g>g>....
1017 >.>........>.>
1018 ..............
1019 ..............
1020 d.d........d.d
1021 f.c........c.f
1022 f.f........f.f
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Mench
1028 The Hole
1029 Bricks:
1030 ........x.x.x.
1031 ..@x.x.x.x.x.x
1032 ..E.x.x.x.x.x.
1033 ..@x.x.x.x.x.x
1034 ..E.x.x.x.x.x.
1035 ..@x.x.x.x.x.x
1036 ..E.x.x.x.x.x.
1037 ..@x.x.x.x.x.x
1038 ..E@E@E@E@E@E@
1039 ..............
1040 ..............
1041 ..............
1042 ..............
1043 ..............
1044 ..............
1045 ..............
1046 ..............
1047 ..............
1048 Bonus:
1049 ........>.5.b.
1050 ...5.5.5.5.5.5
1051 ....5.5.b.5.5.
1052 ...b.>.?.5.>.5
1053 ....5.5.5.b.5.
1054 ...5.5.c.5.5.5
1055 ....5.b.5.5.5.
1056 ...>.5.5.b.5.5
1057 ..............
1058 ..............
1059 ..............
1060 ..............
1061 ..............
1062 ..............
1063 ..............
1064 ..............
1065 ..............
1066 ..............
1067 Level:
1068 Mench
1069 Green Hell
1070 Bricks:
1071 xxxxxxxxxxxxxx
1072 z@@@@@yy@@@@@z
1073 z.f.f.yy.f.f.z
1074 z.f.f.yy.f.f.z
1075 z@@@@@yy@@@@@z
1076 z...x@yy@x...z
1077 z.@.xf@@fx.@.z
1078 z...x@yy@x...z
1079 z@@@@@yy@@@@@z
1080 z.f.f.yy.f.f.z
1081 z.f.f.yy.f.f.z
1082 z@@@@@yy@@@@@z
1083 xxxxxxxxxxxxxx
1084 ..............
1085 ..............
1086 ..............
1087 ..............
1088 ..............
1089 Bonus:
1090 001005cc500100
1091 c............c
1092 g.b.b....b.b.g
1093 ..b.b....b.b..
1094 ..............
1095 ....w.55.w....
1096 l...>l..l>...l
1097 ....w.55.w....
1098 ......**......
1099 g.b.b....b.b.g
1100 d.b.b....b.b.d
1101 d.....ff.....d
1102 +>>>>>++>>>>>+
1103 ..............
1104 ..............
1105 ..............
1106 ..............
1107 ..............
1108 Level:
1109 Mench
1110 How the F@#$
1111 Bricks:
1112 .**.vvvvvv.**.
1113 .E!!!!!!!!!!@.
1114 .@!********!E.
1115 .E!*!!!!!!*!@.
1116 .@!*!****!*!E.
1117 .E!*!*!!*!*!@.
1118 .@!*!*!!*!*!E.
1119 .E!*!****!*!@.
1120 .@!*!!!!!!*!E.
1121 .E!********!@.
1122 .@!!!!!!!!!!E.
1123 .Ezzzzzzzzzz@.
1124 .@@z@@@@@@z@E.
1125 ....@....@....
1126 ...@......@...
1127 ..............
1128 ..............
1129 ..............
1130 Bonus:
1131 .??.!!!!!!.??.
1132 ..<<<<<<<<<<..
1133 ..<dddddddd<..
1134 ..cd{5bb5{dc..
1135 ...d5dddd5d...
1136 ..pd{df5d{dp..
1137 ..pd{d5fd{dp..
1138 ...d5dddd5d...
1139 ..cd{5bb5{dc..
1140 ..>ddffdfdd>..
1141 ..c..ddfd..c..
1142 ..5555555555..
1143 ..............
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 ..............
1149 Level:
1150 Mench
1151 Swiss Roll
1152 Bricks:
1153 ddd*x**x**x**!
1154 ddd*x**x**x**!
1155 d@@@@@@@@@@@@!
1156 d@ihhhhhhhhh@!
1157 d@ihhhhhhhhh@!
1158 *@i@@@@@@@@h@!
1159 *@i@hhhhhh@h@!
1160 *@i@h@hhhh@h@!
1161 *@i@h@hhhh@h@!
1162 *@i@h@@@@@@h@!
1163 x@i@hhhhhhhh@!
1164 x@i@hhhhhhhh@!
1165 x@i@@@@@@@@@@!
1166 x@icjjjjjjjjjj
1167 x@icjjjjjjjjjj
1168 x@@@@@@@@@@@@@
1169 ..............
1170 ..............
1171 Bonus:
1172 cddwfwwfwwfww~
1173 cddwfwwfwwfww~
1174 c............~
1175 c.?bbbbd>>>>.~
1176 c.?bbbbdf>f>.~
1177 f.?........>..
1178 f.?.>>>>>>.>.~
1179 f.?.>.***f.>.~
1180 5.}.>.ffff.>.~
1181 j.}.>......>.~
1182 b.}.>>****f>.~
1183 b.{.>>*****f.~
1184 b.{..........~
1185 <.{.??????????
1186 ?.}.??????????
1187 <.............
1188 ..............
1189 ..............
1190 Level:
1191 Mench
1192 PM II
1193 Bricks:
1194 @@@@@@@@@@@@@@
1195 @...xyzzyx...@
1196 @.v.xyzzyx.v.@
1197 @...xyzzyx...@
1198 @xxx@@@@@@xxx@
1199 @...yxvvxy...@
1200 @.v.yxvvxy.v.@
1201 @...yxvvxy...@
1202 @yyy@@@@@@yyy@
1203 @...zyxxyz...@
1204 @.v.zyxxyz.v.@
1205 @...zyxxyz...@
1206 @zzz@@@@@@zzz@
1207 @....@..@....@
1208 @............@
1209 @...@@..@@...@
1210 ..............
1211 @............@
1212 Bonus:
1213 ..............
1214 ....s.&&.s....
1215 ..w.b.bb.b.w..
1216 ....&.**.&....
1217 .~~~......~~~.
1218 .....?55?.....
1219 ..b.-.ll.-.b..
1220 .....?55?.....
1221 .f{f......f{f.
1222 ....WddddW....
1223 ..w.gggggg.w..
1224 ....W????W....
1225 .ddd......ddd.
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 ..............
1231 Level:
1232 Mench
1233 Irratation
1234 Bricks:
1235 zzz@@@@@@@@zzz
1236 zzz@vv@@vv@zzz
1237 zz@v......v@zz
1238 z@vvvvvvvvvv@z
1239 z@vvvvvvvvvv@z
1240 zz@v......v@zz
1241 zzz@..@@..@zzz
1242 zzz@..@@..@zzz
1243 zz@v......v@zz
1244 z@vvvvvvvvvv@z
1245 z@vvvvvvvvvv@z
1246 zz@v......v@zz
1247 zzz@..@@..@zzz
1248 zzz@..@@..@zzz
1249 zz@v......v@zz
1250 z@v........v@z
1251 ..............
1252 ..............
1253 Bonus:
1254 b.l........l.b
1255 ....55..55....
1256 dddg......g.dd
1257 ....>>dd>>....
1258 ....>dWWd>....
1259 +c.g......g.++
1260 ..b........b..
1261 ++b........bc+
1262 f..g......g..f
1263 f...WWWWWW...f
1264 f.*>d>dd>d>*.f
1265 f..g......g..f
1266 .db........bd.
1267 d.b........b.d
1268 .d.w......w.d.
1269 {.g........g.{
1270 ..............
1271 ..............
1272 Level:
1273 Mench
1274 Ying Yang
1275 Bricks:
1276 @@@@jjjjj@@@@@
1277 @@@@a@jjjj@@@@
1278 @@@aaa@jjjj@@@
1279 @@aaaaa@jjjj@@
1280 @aaajjaa@jjjj@
1281 aaajjjja@jjjjj
1282 aaajjjja@jjjjj
1283 aaaajjaa@jjjjj
1284 aaaaaaa@jjjjjj
1285 aaaaaa@jjjjjjj
1286 aaaaa@jjkkjjjj
1287 aaaaa@jkkkkjjj
1288 aaaaa@jkkkkjjj
1289 @aaaa@jjkkjjj@
1290 @@aaaa@jjjjj@@
1291 @@@aaaa@jjj@@@
1292 @@@@aaaa@j@@@@
1293 @@@@@aaaaa@@@@
1294 Bonus:
1295 .....>>.f.....
1296 ........fd....
1297 ...>f..>.dd...
1298 ..dd....d>dd..
1299 .d~df{~d..g>..
1300 dd>f55ld.>fddd
1301 f~d{55~~..gdfd
1302 *fd~gfdd.gffd>
1303 d>>dg~d..>fdd.
1304 dd~ff~..>d{d>f
1305 >gddd.{{.>df{f
1306 dfg~~.{f55.{{d
1307 dff.>.fl55>.f.
1308 .~ddg.{~f.~{..
1309 ..~>~g.dd~{{..
1310 ...d{d{.d{d...
1311 ....d{dd.d....
1312 .....d{d{d....
1313 Level:
1314 Mench
1315 X
1316 Bricks:
1317 ccc@@@@@@@@xxx
1318 cccc@@@@@@xxxx
1319 #cccc@@@@xxxx#
1320 ##cccc@@xxxx##
1321 ###cccxcxxx###
1322 ####ccxcxx####
1323 #####cxcx#####
1324 ######xc######
1325 ######xc######
1326 ######cx######
1327 ######cx######
1328 #####xcxc#####
1329 ####xxcxcc####
1330 ###xxxcxccc###
1331 ##xxxx@@cccc##
1332 #xxxx@@@@cccc#
1333 xxxx@@@@@@cccc
1334 xxx@@@@@@@@ccc
1335 Bonus:
1336 555........555
1337 5555......5555
1338 ..............
1339 .....~..~.....
1340 .....~bb~.....
1341 .....~WW~.....
1342 .....~WW~.....
1343 ......WW......
1344 ......ll......
1345 ......ll......
1346 ......WW......
1347 .....{WW{.....
1348 ....{.WW.{....
1349 ...{..bb..{...
1350 ..{..c..c..{..
1351 .++.c....c.++.
1352 dddd......cccc
1353 ddd........>>>
1354 Level:
1355 Mench
1356 In & Out
1357 Bricks:
1358 E.@@@@@@@@@@.E
1359 @.@xxxxxxxx@.@
1360 E.@........@.E
1361 @.@........@.@
1362 E.@.xxxxxx.@.E
1363 @.@.@@@@@@.@.@
1364 E.....EE.....E
1365 @.@...@@...@.@
1366 E.@vvvxxvvv@.E
1367 @.@vvvxxvvv@.@
1368 E.@vvvxxvvv@.E
1369 @.@...@@...@.@
1370 E.....EE.....E
1371 @.@.@@@@@@.@.@
1372 E.@........@.E
1373 @.@........@.@
1374 E.@xxxxxxxx@.E
1375 @.@@@@@@@@@@.@
1376 Bonus:
1377 ..............
1378 ...b>.cc.>b...
1379 ..............
1380 ..............
1381 ....dddddd....
1382 ..............
1383 ..............
1384 ..............
1385 ......dd......
1386 ....d.bb.d....
1387 ......{{......
1388 ..............
1389 ..............
1390 ..............
1391 ..............
1392 ..............
1393 ...b>5555>b...
1394 ..............
1395 Level:
1396 Mench
1397 Frozen Time
1398 Bricks:
1399 @@@@@@@@@@@@@@
1400 .vvv...vvv.vvv
1401 .vvv...vvv.vvv
1402 .vvv...vvv.vvv
1403 .@@@...v@v.@@@
1404 .@vv...@@v.@v@
1405 .@vv.@.v@v.@v@
1406 .@vv.@.v@v.@v@
1407 .@@@.v.v@v.@c@
1408 .vv@.v.v@v.@v@
1409 .vv@.@.v@v.@v@
1410 .vv@.@.v@v.@v@
1411 v@@@v.v@@@v@@@
1412 ..............
1413 ..............
1414 ..............
1415 ..............
1416 ..............
1417 Bonus:
1418 ffffffffffffff
1419 .{g....>g..{dm
1420 .>.>....{>.d{d
1421 .d{....>dd.{{m
1422 .fff....fg.fff
1423 .f.d...ff{.f5f
1424 .f>g.f..f..d5d
1425 .f.{.f.gf..f5f
1426 .fff.>.{f>.d5d
1427 .g.f.g..f..f5f
1428 .{gf.f.>f{.d5d
1429 .>{f.f..fd.f{f
1430 .fff...fdf.fff
1431 ..............
1432 ..............
1433 ..............
1434 ..............
1435 ..............
0 Level:
1 RBA
2 W
3 Bricks:
4 ...............
5 ...ddaddddddd..
6 ...ddaadddddd..
7 ...dddaaddddd..
8 ...ddddaadddd..
9 ...dddddaaddd..
10 ...ddddddaadd..
11 ...dddddaaddd..
12 ...ddddaadddd..
13 ...dddddaaddd..
14 ...ddddddaadd..
15 ...dddddaaddd..
16 ...ddddaadddd..
17 ...dddaaddddd..
18 ...ddaadddddd..
19 ...ddaddddddd..
20 ...............
21 ...............
22 Bonus:
23 ...............
24 ...m.3...+..m..
25 .....g3g.......
26 ....s..3.f.....
27 ........3..s...
28 ....b....3.....
29 ......f...3g...
30 ...w.+......+..
31 .......lllb....
32 .....s.........
33 ........b.3.w..
34 ....b....3.....
35 ........3......
36 .......3...w...
37 ......3........
38 ...!.3....+.!..
39 ...............
40 ...............
41 Level:
42 RBA
43 o
44 Bricks:
45 ...............
46 ...dddddddddd..
47 ...dddddddddd..
48 ...dddddddddd..
49 ...dddddddddd..
50 ...dddbbbbddd..
51 ...dddbbbbddd..
52 ...dddbddbddd..
53 ...dddbddbddd..
54 ...dddbddbddd..
55 ...dddbbbbddd..
56 ...dddbbbbddd..
57 ...dddddddddd..
58 ...dddddddddd..
59 ...dddddddddd..
60 ...dddddddddd..
61 ...............
62 ...............
63 Bonus:
64 ...............
65 ...~....*......
66 ......W.....c..
67 ........{W.....
68 .....W.....~...
69 ...c...........
70 .....-l..l.&*..
71 ...*...55......
72 ...!c.l55lf.&..
73 .......55......
74 ...f.&l..l.!...
75 ...............
76 ...d-..........
77 ......f.-.d.c..
78 ...............
79 ...{...d.......
80 ...............
81 ...............
82 Level:
83 RBA
84 l
85 Bricks:
86 ...............
87 ...dddddddddd..
88 ...dddddddddd..
89 ...dddddddddd..
90 ...dddddddddd..
91 ...dddddddcdd..
92 ...dddddddcdd..
93 ...ddccccccdd..
94 ...ddccccccdd..
95 ...ddccccccdd..
96 ...ddcddddcdd..
97 ...dddddddcdd..
98 ...dddddddddd..
99 ...dddddddddd..
100 ...dddddddddd..
101 ...dddddddddd..
102 ...............
103 ...............
104 Bonus:
105 ...............
106 .......55......
107 ...5......~.5..
108 ...............
109 ...?.l.........
110 ........l...m..
111 ....+..........
112 ...m..<...4....
113 ........<...?..
114 ...~.4.........
115 ..........4.+..
116 .......?.......
117 ...wb>wb>wb>w..
118 ...............
119 ......+ff+.....
120 ...............
121 ...............
122 ...............
123 Level:
124 RBA
125 v
126 Bricks:
127 ...............
128 ...dddddddddd..
129 ...dddddddddd..
130 ...ddaddddddd..
131 ...ddaadddddd..
132 ...dddaaddddd..
133 ...ddddaadddd..
134 ...dddddaaddd..
135 ...ddddddaadd..
136 ...dddddaaddd..
137 ...ddddaadddd..
138 ...dddaaddddd..
139 ...ddaadddddd..
140 ...ddaddddddd..
141 ...dddddddddd..
142 ...dddddddddd..
143 ...............
144 ...............
145 Bonus:
146 ...............
147 ...j...2.+..W..
148 ...............
149 ....2..........
150 .........2..f..
151 ...............
152 ....W.......+..
153 ...............
154 ........l.l2...
155 ......4........
156 ...4...........
157 ..........j....
158 ........+......
159 .....f.........
160 ....+..........
161 ...........4...
162 ...............
163 ...............
164 Level:
165 RBA
166 e
167 Bricks:
168 ...............
169 ...dddddddddd..
170 ...dddddddddd..
171 ...dddddddddd..
172 ...ddbbbdbbdd..
173 ...ddbbbdbbdd..
174 ...ddbdbddbdd..
175 ...ddbdbddbdd..
176 ...ddbdbddbdd..
177 ...ddbdbddbdd..
178 ...ddbdbddbdd..
179 ...ddbbbbbbdd..
180 ...ddbbbbbbdd..
181 ...dddddddddd..
182 ...dddddddddd..
183 ...dddddddddd..
184 ...............
185 ...............
186 Bonus:
187 ...............
188 ...j...44...}..
189 .......c..+....
190 ....w..........
191 ............p..
192 ........p......
193 ...c..l...w....
194 ......5........
195 ....j.l.mc..d..
196 ......5........
197 ...d..l..}.....
198 .....w....w.c..
199 ........+......
200 ............+..
201 ...+...........
202 ......?..?.....
203 ...............
204 ...............
205 Level:
206 RBA
207 r
208 Bricks:
209 ...............
210 ...dddddddddd..
211 ...dddddddddd..
212 ...dddddddddd..
213 ...dddddddddd..
214 ...dddccddddd..
215 ...dddccddddd..
216 ...dddcdddddd..
217 ...dddcdddddd..
218 ...dddcdddddd..
219 ...dddcdddddd..
220 ...ddccccccdd..
221 ...ddccccccdd..
222 ...dddddddddd..
223 ...dddddddddd..
224 ...dddddddddd..
225 ...............
226 ...............
227 Bonus:
228 ...............
229 ...5..g.....5..
230 ........j~d....
231 ......j........
232 ....g.......&..
233 ..........&....
234 ....+..........
235 ...............
236 ....~.l.+.d....
237 ..........~....
238 ...............
239 ...............
240 ...&...........
241 ...............
242 .....+..>...+..
243 ...5........5..
244 ...............
245 ...............
246 Level:
247 RBA
248 i
249 Bricks:
250 ...............
251 ...dddddddddd..
252 ...dddddddddd..
253 ...dddddddddd..
254 ...dddddddddd..
255 ...dddddddadd..
256 ...dddddddadd..
257 ...ddadaaaadd..
258 ...ddadaaaadd..
259 ...ddadaaaadd..
260 ...ddddaddadd..
261 ...dddddddadd..
262 ...dddddddddd..
263 ...dddddddddd..
264 ...dddddddddd..
265 ...dddddddddd..
266 ...............
267 ...............
268 Bonus:
269 ...............
270 ...j....w......
271 .....+....m....
272 ......!..?.!...
273 .....j.........
274 ....b..}..3....
275 ..........3....
276 .....l.3333.+..
277 ....mf.3333....
278 .....l.3333b...
279 .......3..3....
280 ...w..?...3m...
281 ...........w...
282 .....+...b.....
283 ...............
284 ...............
285 ...............
286 ...............
287 Level:
288 RBA
289 n
290 Bricks:
291 ...............
292 ...dddddddddd..
293 ...dddddddddd..
294 ...dddddddddd..
295 ...ddddbbbbdd..
296 ...ddddbbbbdd..
297 ...ddddbddddd..
298 ...ddddbddddd..
299 ...ddddbddddd..
300 ...ddddbddddd..
301 ...dddbbddddd..
302 ...dddbbbbbdd..
303 ...dddbbbbbdd..
304 ...dddddddddd..
305 ...dddddddddd..
306 ...dddddddddd..
307 ...............
308 ...............
309 Bonus:
310 ...............
311 ...4...&4...4..
312 ......0..+..p..
313 ....f..........
314 .........W.....
315 ...w.p.l..l.c..
316 ........?......
317 ...<.1j...1w...
318 .........?..+..
319 .....<.W...j...
320 ...c..l.<......
321 ........l.l....
322 ....!.+...W....
323 ...0...?....!..
324 ..........c....
325 ...+.....0.....
326 ...............
327 ...............
328 Level:
329 RBA
330 e
331 Bricks:
332 ...............
333 ...dddddddddd..
334 ...dddddddddd..
335 ...dddddddddd..
336 ...ddcccdccdd..
337 ...ddcccdccdd..
338 ...ddcdcddcdd..
339 ...ddcdcddcdd..
340 ...ddcdcddcdd..
341 ...ddcdcddcdd..
342 ...ddcdcddcdd..
343 ...ddccccccdd..
344 ...ddccccccdd..
345 ...dddddddddd..
346 ...dddddddddd..
347 ...dddddddddd..
348 ...............
349 ...............
350 Bonus:
351 ...............
352 ...5...55...5..
353 ...p..b.>...+..
354 ...............
355 .....m..f?.....
356 ...d........>..
357 .....?l........
358 ....+.g....+...
359 ...>..lmbm.j...
360 ......g....b...
361 ......l.f.w....
362 ............d..
363 .....w..+.?....
364 ...~.......~...
365 ....+.d~...+...
366 ...............
367 ...............
368 ...............
369 Level:
370 RBA
371 CLAWS
372 Bricks:
373 cvvvvvccvvvvvc
374 cvvvvvccvvvvvc
375 vcvvvvccvvvvcv
376 vcvvvvccvvvvcv
377 vvcvvvccvvvcvv
378 vvcvvvccvvvcvv
379 vvvcvvccvvcvvv
380 vvvcvvccvvcvvv
381 vvvvcvccvcvvvv
382 vvvvcvccvcvvvv
383 vvvvvccccvvvvv
384 vvvvvccccvvvvv
385 zzzzzzcczzzzzz
386 cvvvvvccvvvvvc
387 vcvvvcvvcvvvcv
388 vvcvcvvvvcvcvv
389 vvvcvvvvvvcvvv
390 zzzzzzzzzzzzzz
391 Bonus:
392 04j44455444j40
393 0+4+4w5w4+4+4+
394 30444455444403
395 30444455444403
396 +j+4+jw5+j+0+j
397 33044455444033
398 33304455440333
399 3+jwj+j+jwj+j+
400 33330455403333
401 33330455403333
402 +3+j+2wj+3+j+3
403 33333222233333
404 5+5+5wjw5+5+5+
405 41111145333335
406 0511152243334b
407 004142222535bm
408 00052222224pmb
409 5+5+5wjw5+5+5+
0 Version: 1.01
1 Level:
2 Xposya
3 lines
4 Bricks:
5 i.i.y.*c.h.k.h
6 *.#.!.*#.!.!.#
7 ..#.#..#.h.*.i
8 i.i*#i.#.!.k*#
9 .*#.#i*#.h.!.e
10 x.#.!y.c.i*#.#
11 #.#.#y.#.h.!.#
12 f.f.#**#.i.*.#
13 #.i.#y.#*h.k*e
14 *.#*!i.c.#.!.#
15 i.*.#..#.h.k.e
16 .*#.#i.#.#.!.#
17 x.#.y..c.h*k.e
18 i.i...*i.i.#**
19 *.f.y..i.*.h.i
20 #.*.y*.*.jkde.
21 ....*..c......
22 ..............
23 Bonus:
24 1.m.j....s...b
25 ..............
26 .........w....
27 W..........p..
28 .........?....
29 ....f..m.&....
30 .........?....
31 *.m...........
32 ..2......m....
33 .......4......
34 .............d
35 .....!........
36 .........b....
37 +.0...........
38 ..g.l........{
39 .........}5.?.
40 ..............
41 ..............
42 Level:
43 Xposya
44 entrance
45 Bricks:
46 j!jjjEjjjjjjjj
47 aaaaaaaaaaaaEa
48 dddddddddddddd
49 .E...bbbE.!.E.
50 ..E..bbb......
51 hhhhb**bhhhhhh
52 aaaabb*baavaaa
53 y!yE..*bb!v.E.
54 yyyy...v......
55 .......v......
56 .......v..E...
57 .E..........E.
58 ....EE.vvvgEgg
59 gggg...vv.*i*i
60 iiii....v.zz!z
61 vvvv..........
62 .....v....v...
63 ...........v..
64 Bonus:
65 c..b...}.{~p.}
66 ..............
67 ...!..~..>.&wd
68 ..............
69 ..............
70 ps<...l...l.b.
71 ....?.........
72 ..............
73 .&{s..........
74 ..............
75 ..............
76 ..............
77 .............p
78 .b.w.......&!.
79 }.f~......sw.{
80 }.............
81 ..............
82 ..............
83 Level:
84 noname
85 X
86 Bricks:
87 Ef............
88 gbf..........g
89 .gEf........gE
90 ..gbf......gbf
91 ...gEf....gEf.
92 ....gbf..gbf..
93 .....gEfgEf...
94 ......gEbf....
95 ......hhhh....
96 ......hhhh....
97 ......fbEg....
98 .....fEgfEg...
99 ....fbg..fbg..
100 ...fEg....fEg.
101 ..fbg......fbg
102 .fEg........fE
103 fbg..........f
104 Eg............
105 Bonus:
106 .<............
107 !.2..........5
108 .w.W........p.
109 ..5.m......b.!
110 ...b.*....*.W.
111 ....p.?..?.w..
112 .....}.2l.}...
113 ......d..-....
114 ......<d{f....
115 ......m&+d....
116 ......d..w....
117 .....}.{<.}...
118 ....2.?..?.p..
119 ...W.*....*.b.
120 ..5.b......5.2
121 .<.p........W.
122 f.w..........!
123 .!............
124 Level:
125 Xposya
126 p
127 Bricks:
128 ......ckffff..
129 ......ckccccf.
130 ......ckvvvcf.
131 ......ckvvvcf.
132 ......ckvvvcf.
133 .zzz..ckcccch.
134 .zvvz.ckhhhh..
135 .zvvz.ck......
136 .zzz..ck......
137 .z....ck......
138 .z....ck..ddd.
139 .z.dd.ck..d!!d
140 .z.dvdck..d!!d
141 ...dd.ck..ddd.
142 ...d..ck..d...
143 ...d..ck..d...
144 ...d..ck..d...
145 ...d..ck..d...
146 Bonus:
147 ......j...3...
148 ..............
149 .........W.p..
150 .......3......
151 ......!.......
152 ........g.c...
153 ......ls......
154 ..............
155 .W............
156 ..............
157 .......f......
158 .!...........f
159 ......c.......
160 ....p.W...g.p.
161 ...f...!..c...
162 ......g.......
163 ...c..........
164 ..............
165 Level:
166 Xposya
167 o
168 Bricks:
169 .vffffffffffv.
170 .fvvvvvvvvvvf.
171 .fvvggggggvvf.
172 .fvg......gvf.
173 .fvg......gvf.
174 .fvg......gvf.
175 .fvg......gvf.
176 .fvg......gvf.
177 .fvg..hh..gvf.
178 .fvg..hh..gvf.
179 .fvg......gvf.
180 .fvg......gvf.
181 .fvg......gvf.
182 .fvg......gvf.
183 .fvg......gvf.
184 .fvvggggggvvf.
185 .fvvvvvvvvvvg.
186 .vffffffffffv.
187 Bonus:
188 ...3......3...
189 .?....4.5...?.
190 .?.4........?.
191 .?..........?.
192 .?g........g?.
193 .?..........?.
194 .?..........?.
195 .?........05?.
196 .?5....0....?.
197 .?....0...0.?.
198 .?..........?.
199 .?g.........?.
200 .?.........5?.
201 .?..........?.
202 .?4.........?.
203 .?.3??????.4?.
204 .?4.........?.
205 .......3......
206 Level:
207 Xposya
208 s
209 Bricks:
210 cccccccccccccc
211 cffffffffffffc
212 cfhhhhhhhhhhff
213 cfh@@@@@@@@hg.
214 cfh.......@h..
215 cfh.......@...
216 cfh...........
217 cfhhhhhhhhhhhh
218 cfffffffffffff
219 cccccccccccccc
220 fffffffffffffc
221 hhhhhhhhhhhhfc
222 ...........hfc
223 ...@.......hfc
224 ..h@@@@@@@@hfc
225 .fhhhhhhhhhhfc
226 cffffffffffffc
227 cccccccccccccc
228 Bonus:
229 ............?.
230 ..?..????.?...
231 ..............
232 ..?.........?.
233 ?.............
234 ..?...........
235 ..?...........
236 ..?...........
237 ..?.?.?..?..?.
238 ....?........?
239 .?....?.???...
240 ...?........?.
241 ..............
242 ............?.
243 ............?.
244 ..?...???...??
245 .........?...?
246 .??..?........
247 Level:
248 Xposya
249 y
250 Bricks:
251 ...iii......cc
252 ...kcc......ck
253 ...kkc......ck
254 ....kc.....cik
255 ....kkc....ckc
256 ....iicc..cckc
257 .....ikc.ciiic
258 .....ikkcckic.
259 .......kikic..
260 .......ckkcc..
261 ......cckcc...
262 .....cckcc....
263 .....cicc.....
264 ...cciic......
265 ..cciicc......
266 ccckcc........
267 ckkcc.........
268 kkcc..........
269 Bonus:
270 ....?.........
271 .............?
272 .............?
273 .....?........
274 ............?.
275 ............?.
276 ......?....?..
277 ..........?...
278 .......?..?...
279 ........?.....
280 ........?.....
281 ..............
282 .....??.......
283 ....?.........
284 ...?..........
285 ..?...........
286 .???..........
287 ..............
288 Level:
289 Xposya
290 a
291 Bricks:
292 ......cc......
293 ......cc......
294 .d....cc....!.
295 d.d..cccc..!.!
296 d.d..c..c..!.!
297 ddd.cc..cc.!!!
298 d.d.c....c.!.!
299 d.d.c....c.!.!
300 ...cc....cc...
301 ...cccccccc...
302 ..cccccccccc..
303 ..c........c..
304 ..c...jj...c..
305 .cc...jj...cc.
306 cc...j..j...cc
307 c...j....j...c
308 c...jjjjjj...c
309 c...j....j...c
310 Bonus:
311 ......l.......
312 ..............
313 ..............
314 ......?g......
315 .....?.....w..
316 w.?......g...}
317 ....?.........
318 ..p.?........?
319 .........?....
320 ...g..........
321 .....w.p..}...
322 ..w...........
323 ..............
324 .?.........gg.
325 .?...........w
326 .........?....
327 .....????....?
328 .........?....
329 Level:
330 Xposya
331 levels
332 Bricks:
333 cdcdcdcdcdcddc
334 yyyyyyhhyyyyyy
335 !!!!!!!vvvvvvv
336 ..............
337 ..............
338 yzyzyzyzyzyzyz
339 gggggggghhhhhh
340 vvvvvvv!!!!!!!
341 k.k.k.k.k.k.k.
342 .k.k.k.k.k.k.k
343 ..............
344 fffff.........
345 v!!!!.ffffffff
346 ......vvv!!!!!
347 ..............
348 ..............
349 ..............
350 ..............
351 Bonus:
352 .s.4lmm!..bs&5
353 5....j..j3&..-
354 ~..w.!........
355 ..............
356 ..............
357 &...~.c..3c.~c
358 ......1-.0*...
359 ...<........w+
360 ..2...........
361 .............&
362 ..............
363 .2w1p.........
364 {.m&...fj.c!wg
365 .......&!.~.sm
366 ..............
367 ..............
368 ..............
369 ..............
370 Level:
371 Xposya
372 blocks
373 Bricks:
374 zzzziiiiii!!!!
375 zedzikkkki!kc!
376 zdezikffki!ck!
377 zedzikffki!kc!
378 zzzzikkkki!!!!
379 jjjjiiiiiigggg
380 jcvjbbbbbbgvzg
381 jvcjbiiiibgzvg
382 jcvjbihhibgvzg
383 jvcjbihhibgzvg
384 jcvjbiiiibgvzg
385 jvcjbbbbbbgzvg
386 jjjj@@@@@@gggg
387 vvvvvvvvvvvvvv
388 ..............
389 ..............
390 ..............
391 ..............
392 Bonus:
393 ...m....1.....
394 <....*0.W..2w0
395 ....05.&.!....
396 ?+....0..f..1.
397 m...s..>.2..-.
398 .....3.1-b....
399 1.w.......3...
400 .s.l-0...&c...
401 ...2..g.0.d..+
402 .5W.p0.b>....?
403 b..m+.3g......
404 0<*>.!fd.d....
405 ..1.......cw.m
406 .<............
407 ..............
408 ..............
409 ..............
410 ..............
411 Level:
412 Xposya
413 platforms
414 Bricks:
415 ..............
416 cccc...ggg....
417 @@@@...@@@.zzz
418 cccc...iii.@@@
419 ...........hhh
420 ..iiii........
421 ..@@@@........
422 ..vvvv..zzz...
423 ........@@@...
424 ........eee...
425 ....jjj.......
426 ....@@@....kkk
427 ....fff....@@@
428 ccc........jjj
429 @@@...........
430 iii...........
431 ..............
432 ..............
433 Bonus:
434 ..............
435 55.......3....
436 ............55
437 .......3......
438 ...........2.2
439 ..3..2........
440 ..............
441 ..2..3........
442 ..............
443 ........???...
444 ....???.......
445 ...........???
446 ....???.......
447 ???........???
448 ..............
449 ???...........
450 ..............
451 ..............
452 Level:
453 Xposya
454 breakout
455 Bricks:
456 ffffffffffffff
457 gggggggggggggg
458 hhhhhhhhhhhhhh
459 iiiiiiiiiiiiii
460 jjjjjjjjjjjjjj
461 kkkkkkkkkkkkkk
462 eeeeeeeeeeeeee
463 dddddddddddddd
464 zzzzzzzzzzzzzz
465 cccccccccccccc
466 kkkkkkkkkkkkkk
467 jjjjjjjjjjjjjj
468 iiiiiiiiiiiiii
469 hhhhhhhhhhhhhh
470 vvvvvvvvvvvvvv
471 gggggggggggggg
472 ..............
473 ..............
474 Bonus:
475 .............?
476 ..............
477 .wf...w?...?..
478 .........w...?
479 .?..........m.
480 .....p....f...
481 l......?......
482 ............?.
483 .......?......
484 ......?.......
485 ..m.......?...
486 ...w..........
487 .?.....p?.....
488 .....f....m...
489 ..?...........
490 .?...?......?.
491 ..............
492 ..............
0 Version: 1.00
1 Level:
2 Yexter
3 Yexter
4 Bricks:
5 jjjjjjjjjjjjjj
6 jjjjjjjjjjjjjj
7 j#j#j##j#j#jjj
8 j#j#j#jj#j#jjj
9 j#j#j##jj#jjjj
10 jj#jj#jj#j#jjj
11 jj#jj##j#j#jjj
12 jjjjjjjjjjjjjj
13 jjjjjjjjjjjjjj
14 jjj###j##j###j
15 jjjj#jj#jj#j#j
16 jjjj#jj##j###j
17 jjjj#jj#jj##jj
18 jjjj#jj##j#j#j
19 jjjjjjjjjjjjjj
20 jjjjjjjjjjjjjj
21 ..............
22 ..............
23 Bonus:
24 ...........*..
25 .............s
26 ..............
27 ..m...4.......
28 ..m.....&.l.j.
29 ......?.......
30 ............*.
31 ..............
32 bbbb..........
33 .ww...........
34 .w...>..+}...&
35 &.....&.......
36 ........<...*.
37 d*d...........
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Yexter
44 Yexter
45 Bricks:
46 ..............
47 ..............
48 ..............
49 .jvaa....aavj.
50 .jvaa....aavj.
51 .jvaa....aavj.
52 .jvaa....aavj.
53 .jvaa....aavj.
54 .jvaaa..aaavj.
55 .jvaaaaaaaavj.
56 .jvvaaaaaavvj.
57 .jjvvvaavvvjj.
58 ...jjvaavjj...
59 ....jvaavj....
60 ....jvaavj....
61 ....jvaavj....
62 ....jvaavj....
63 ....jvaavj....
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ..............
69 ..........1...
70 ....-......+..
71 ..?......1....
72 ...f*......*..
73 ..........c...
74 .....j........
75 ..}........+..
76 .....-.&......
77 ..............
78 .......*......
79 ..............
80 .....?p.......
81 ..............
82 ..............
83 Level:
84 Yexter
85 Yexter
86 Bricks:
87 ##..######..##
88 ##..aaaaaa..##
89 **..bbbbbb..**
90 ii..bbbbbb..ii
91 ii..aaaaaa..ii
92 ii..bbjjjj..ii
93 ii..bbjjjj..ii
94 **..aaaaaj..**
95 ##..bbbbbj..##
96 ##..bbbbbj..##
97 **..aaaaaj..**
98 ii..bbjjjj..ii
99 ii..bbjjjj..ii
100 ii..aaaaaa..ii
101 ii..bbbbbb..ii
102 **..bbbbbb..**
103 ##..aaaaaa..##
104 ##..######..##
105 Bonus:
106 ..............
107 ..............
108 .......5......
109 .....&........
110 ....*.........
111 .........5....
112 ....4.........
113 ..............
114 .......*......
115 ....j.........
116 .....&...d....
117 ..............
118 ..............
119 ......ww......
120 ....*..g......
121 ......5.......
122 ..............
123 ..............
124 Level:
125 Yexter
126 Yexter
127 Bricks:
128 ..............
129 ....######....
130 .jj..####..jj.
131 .jjj..##..jjj.
132 .jvjj....jjvj.
133 .jvvjj..jjvvj.
134 .jjvvjjjjvvjj.
135 .jjjvvjjvvjjj.
136 ...jjvvvvjj...
137 ....jjvvjj....
138 ...jjvvvvjj...
139 .jjjvvjjvvjjj.
140 .jjvvjjjjvvjj.
141 .jvvjj..jjvvj.
142 .jvjj....jjvj.
143 .jjj..##..jjj.
144 .jj..####..jj.
145 ....######....
146 Bonus:
147 ..............
148 ..............
149 .?..........?.
150 ..............
151 ..............
152 ..............
153 ..............
154 .?..........?.
155 .....5ml5.....
156 ..............
157 ..............
158 .?.4w+dd-b4.?.
159 ..............
160 .....s..s.....
161 .?..........?.
162 ..............
163 ..............
164 ..............
165 Level:
166 Yexter
167 Yexter
168 Bricks:
169 ..............
170 .vvvvvvvvvvvv.
171 .vaaaaaaaaaav.
172 .v##########v.
173 .vaaaaaaaaaav.
174 .vvvvv##vvvvv.
175 .....vaav.....
176 .....v##v.....
177 vvv..vaav..vvv
178 .v...v##v...v.
179 .v...vaav...v.
180 .v...v##v...v.
181 .v...vaav...v.
182 .....v##v.....
183 .....vaav.....
184 .....v##v.....
185 .....vaav.....
186 .....vvvv.....
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ...j......j...
193 .&*..&..&..*&.
194 ......55......
195 ..............
196 .b...????...b.
197 ..............
198 ......}}......
199 ..............
200 .b...b..b...b.
201 .....w..w.....
202 .....b..b.....
203 ..............
204 ......++......
205 ..............
206 Level:
207 Yexter
208 Yexter
209 Bricks:
210 ......!!......
211 ....!!aa!!....
212 ...!aaaaaa!...
213 ...!ajjjja!...
214 ...!ajaaja!...
215 ..!ajjaajja!..
216 .!aajakkajaa!.
217 .!ajjakkajja!.
218 .!ajakxxkaja!.
219 .!ajakxxkaja!.
220 .!ajjakkajja!.
221 .!aajakkajaa!.
222 ..!ajjaajja!..
223 ...!ajaaja!...
224 ...!ajjjja!...
225 ...!aaaaaa!...
226 ....!!aa!!....
227 ......!!......
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ......<l......
234 ..............
235 ..b...j4...b..
236 ..w........w..
237 ...1.?>>?.1...
238 ......dd......
239 ..............
240 ..b..-..+..b..
241 ..............
242 ..m...33...m..
243 ..............
244 ..............
245 ..............
246 ..............
247 Level:
248 Yexter
249 Yexter
250 Bricks:
251 ..............
252 ..............
253 fvvvvvvvvvvvvf
254 v............v
255 v.fvvvvvvvvf.v
256 v.v........v.v
257 v.v.fvvvvf.v.v
258 v.v.v....v.v.v
259 v.v.v.vv.v.v.v
260 v.v.v.vv.v.v.v
261 v.v.v....v.v.v
262 v.v.fvvvvf.v.v
263 v.v........v.v
264 v.fvvvvvvvvf.v
265 v............v
266 fvvvvvvvvvvvvf
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ..&...ss...&..
275 ..}........}..
276 ....bbbbbb....
277 ....b....b....
278 ....b.44.b....
279 ....b.g+.b....
280 ....w....w....
281 ....*dddd*....
282 ..............
283 ..0...dd...0..
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Yexter
290 Yexter
291 Bricks:
292 ######.......j
293 aaaaaa......ji
294 ######.....jih
295 aaaaaa....jihg
296 ######...jihgf
297 aaaaaa..jihgfk
298 ######.jihgfke
299 aaaaaa.#######
300 ..####........
301 ...aaa........
302 j...##########
303 ij...aaaaaaaaa
304 hij...########
305 ghij...aaaaaaa
306 fghij...######
307 kfghij...aaaaa
308 ekfghij...####
309 #######....aaa
310 Bonus:
311 ..............
312 ..............
313 ..............
314 ...........&.j
315 ..............
316 ..........&..b
317 ............bb
318 ..............
319 ..............
320 ..............
321 ..............
322 ..............
323 ..............
324 s.............
325 .4............
326 m.............
327 mm.4..+.......
328 ..............
329 Level:
330 Yexter
331 Yexter
332 Bricks:
333 .vvv.vvvv.vvv.
334 .v*v.v**v.v*v.
335 .vvv.vvvv.vvv.
336 ..............
337 .vvv.vvvv.vvv.
338 .v*v.v**v.v*v.
339 .vvv.vvvv.vvv.
340 ..............
341 .vvv.vvvv.vvv.
342 .v*v.v**v.v*v.
343 .vvv.vvvv.vvv.
344 ..............
345 .vvv.vvvv.vvv.
346 .v*v.v**v.v*v.
347 .vvv.vvvv.vvv.
348 ..............
349 ..............
350 ..............
351 Bonus:
352 ...b.w..w.b...
353 .....b..b.....
354 ......&&......
355 ..............
356 .....+..+.....
357 ..............
358 .5..........5.
359 ..............
360 .....1..1.....
361 ..............
362 ..............
363 ..............
364 ...+.<..<.5...
365 ..............
366 .....}..}.....
367 ..............
368 ..............
369 ..............
370 Level:
371 Yexter
372 Yexter
373 Bricks:
374 vvvvvv**vvvvvv
375 *............*
376 v.vvvv**vvvv.v
377 v.*........*.v
378 v.v.vv**vv.v.v
379 v.v.*iiii*.v.v
380 v.v.vi!!iv.v.v
381 v.v.v!hh!v.v.v
382 *.*.*i**i*.*.*
383 *.*.*i**i*.*.*
384 v.v.v!hh!v.v.v
385 v.v.vi!!iv.v.v
386 v.v.*iiii*.v.v
387 v.v.vv**vv.v.v
388 v.*........*.v
389 v.vvvv**vvvv.v
390 *............*
391 vvvvvv**vvvvvv
392 Bonus:
393 ......m&......
394 ..............
395 ..............
396 ..............
397 ....??????....
398 ..............
399 ....l....l....
400 ....?....?....
401 ..............
402 ..............
403 ....2....2....
404 ....2....2....
405 ..............
406 ..............
407 ..............
408 ......44......
409 ..............
410 ..............
411 Level:
412 Yexter
413 Yexter
414 Bricks:
415 !v!v!v!!v!v!v!
416 vvvvvvvvvvvvvv
417 v****v*vvv*v*v
418 v*vvvv*vvv*v*v
419 v*vvvv*vvv*v*v
420 v*vvvv*vvv*v*v
421 v*vvvv*vvv*v*v
422 v*vvvv*vvv*v*v
423 v*v**v*vvv*v*v
424 v*vv*v*vvv*v*v
425 v*vv*v*vvv*v*v
426 v*vv*v*vvv*v*v
427 v****v*****v*v
428 vvvvvvvvvvvvvv
429 !v!v!v!!v!v!v!
430 ..............
431 ..............
432 ..............
433 Bonus:
434 ..............
435 ........4.....
436 ..............
437 .....2........
438 ...l+...l.....
439 ..............
440 &..+.2.......&
441 ........4.....
442 ..............
443 ..bb.+..&..+..
444 ..wb..........
445 ..bb..........
446 *............*
447 ..............
448 .}.s....s.}...
449 ..............
450 ..............
451 ..............
452 Level:
453 Yexter
454 Yexter
455 Bricks:
456 ..............
457 ..............
458 ..#a##a#.v##v.
459 ..a####av.aa..
460 ..#a##a#.v##v.
461 ....aa..v.aa..
462 ...v##v..v##v.
463 ....aa..v.aa..
464 ...v##v..v##v.
465 ....aa..v.aa..
466 ...v##v..v##v.
467 ....aa..v.aa..
468 ...v##v..v##v.
469 ..............
470 ..............
471 ..............
472 ..............
473 ..............
474 Bonus:
475 ..............
476 ..............
477 ..............
478 ..............
479 ......m.......
480 ..............
481 ...5..+..3..5.
482 ..............
483 ...3..........
484 ..............
485 ......}.......
486 ..............
487 ...s.....s....
488 ..............
489 ..............
490 ..............
491 ..............
492 ..............
493 Level:
494 Yexter
495 Yexter
496 Bricks:
497 ..............
498 *.*.*....*.*.*
499 ......vv......
500 .!.!..vv..!.!.
501 ..............
502 *.*.*....*.*.*
503 ......vv......
504 .!.!..vv..!.!.
505 ..............
506 *.*.*....*.*.*
507 ......vv......
508 .!.!..vv..!.!.
509 ..............
510 *.*.*....*.*.*
511 ......vv......
512 .!.!..vv..!.!.
513 ..............
514 *.*.*....*.*.*
515 Bonus:
516 ..............
517 ..............
518 ......lb......
519 ..............
520 ..............
521 ..............
522 ......55......
523 ....b....b....
524 ..............
525 ..............
526 ....c....c....
527 ....b....b....
528 ..............
529 ..............
530 .2..........2.
531 ......ww......
532 ..............
533 ..............
534 Level:
535 Yexter
536 Yexter
537 Bricks:
538 .v..........v.
539 .k..........k.
540 .v....kk....v.
541 .k...kvvk...k.
542 .v..kvkkvk..v.
543 .k.kvk..kvk.k.
544 .vkvk....kvkv.
545 .kvk......kvk.
546 .vk........kv.
547 .k..........k.
548 ..............
549 .aaaaaaaaaaaa.
550 .avvvvvvvvvva.
551 ..vjjjjjjjjv..
552 .xvvvvvvvvvvx.
553 .xxxxxxxxxxxx.
554 ..............
555 ..............
556 Bonus:
557 ..............
558 ..............
559 ......bb......
560 ..............
561 ......??......
562 .....?..?.....
563 ....?....?....
564 ...?......?...
565 ..............
566 ..............
567 ..............
568 ...*d5l5dd*...
569 ..............
570 ......++......
571 ..............
572 ..............
573 ..............
574 ..............
575 Level:
576 Yexter
577 Yexter
578 Bricks:
579 ..............
580 ..............
581 .cccccccccccc.
582 .vvvv*cc*vvvv.
583 .vvvvvccvvvvv.
584 .ccccvccvcccc.
585 .c*vcvccvcv*c.
586 .cvccvccvccvc.
587 .cvc*vccv*cvc.
588 .cvccccccccvc.
589 .cvvvvvvvvvvc.
590 .cccccccccccc.
591 ..............
592 ..............
593 .zzz.zzzz.zzz.
594 .z*z.z**z.z*z.
595 .zzz.zzzz.zzz.
596 ..............
597 Bonus:
598 ..............
599 ..............
600 ..............
601 ..............
602 ......ll......
603 ..............
604 ......??......
605 ......??......
606 ...3......3...
607 ......++......
608 .bbb......bbb.
609 .bw........wb.
610 ..............
611 ..............
612 ..............
613 .&...s..s...&.
614 ..............
615 ..............
616 Level:
617 Yexter
618 Yexter
619 Bricks:
620 **************
621 zzzzz****zzzzz
622 z*zz*zzzz*zz*z
623 zzzzzzzzzzzzzz
624 z*zz*z**z*zz*z
625 zzzzzzzzzzzzzz
626 z*zz*zzzz*zz*z
627 zzzzzz**zzzzzz
628 z*zz*zzzz*zz*z
629 zzzzzzzzzzzzzz
630 z*zz*z**z*zz*z
631 zzzzzzzzzzzzzz
632 z*zz*zzzz*zz*z
633 zzzzzz**zzzzzz
634 z*zz*zzzz*zz*z
635 zzzzzzzzzzzzzz
636 zzzzzzzzzzzzzz
637 ..............
638 Bonus:
639 ..............
640 ..............
641 ..............
642 .?..?.??.?..?.
643 ..............
644 ???.?....?.???
645 ......??......
646 .?..?....?..?.
647 ..............
648 ???.?.??.?.???
649 ..............
650 .?..?....?..?.
651 ......??......
652 ???.?....?.???
653 ..............
654 ..............
655 ......??......
656 ..............
657 Level:
658 Yexter
659 Yexter
660 Bricks:
661 ..............
662 ..............
663 ..............
664 .aaaaaaaaaaaa.
665 ..dddddddddd..
666 j..hhhhhhhh..j
667 ij..gggggg..ji
668 hij..jjjj..jih
669 kkij..ii..jikk
670 gggj......jggg
671 kkij..ii..jikk
672 hij..jjjj..jih
673 ij..gggggg..ji
674 j..hhhhhhhh..j
675 ..dddddddddd..
676 .aaaaaaaaaaaa.
677 ..............
678 ..............
679 Bonus:
680 ..............
681 ..............
682 ..............
683 ..............
684 .....c.c.>....
685 ..............
686 ....?..5.?....
687 ......g.......
688 ...b......b...
689 ..s........s..
690 ......ll......
691 .......j......
692 .....?..?.....
693 ...b......b...
694 ..+........+..
695 ..............
696 ..............
697 ..............
698 Level:
699 Yexter
700 Yexter
701 Bricks:
702 ..............
703 k#####..#####k
704 vk####..####kv
705 kvk###..###kvk
706 vkvk##..##kvkv
707 kvkvk#..#kvkvk
708 vkvkvk..kvkvkv
709 kvkvkvkkvkvkvk
710 vkvkvkvvkvkvkv
711 kvkvkvkkvkvkvk
712 vkvkvkvvkvkvkv
713 kvkvkvkkvkvkvk
714 vkvkvk..kvkvkv
715 kvkvk#..#kvkvk
716 vkvk##..##kvkv
717 kvk#E#..#E#kvk
718 vk#EE#..#EE#kv
719 k#####..#####k
720 Bonus:
721 ..............
722 l............l
723 ..............
724 ..............
725 ...?......?...
726 ....?....?....
727 .....?..?.....
728 .&....55....&.
729 ..............
730 .....b55b.....
731 .....w++w.....
732 +.....55.....+
733 .b..&*..*&..b.
734 w............w
735 ..............
736 4............4
737 ..............
738 ..............
739 Level:
740 Yexter
741 Yexter
742 Bricks:
743 ..............
744 ....iiiiii....
745 ....i####i....
746 ....iaiiai....
747 ...ii#ii#ii...
748 ...i#iiii#i...
749 .iiiaiiiiaiii.
750 .i##iiiiii##i.
751 .iaiiiiiiiiai.
752 .i#iiiiiiii#i.
753 .iaiiiiiiiiai.
754 .i##iiiiii##i.
755 .i###iiii###i.
756 .iiii#ii#iiii.
757 ....iaiiai....
758 ....i#ii#i....
759 ....i#ii#i....
760 ....iiiiii....
761 Bonus:
762 ..............
763 ..............
764 ..............
765 .....m..l.....
766 ..............
767 ..............
768 ..............
769 ......jj......
770 ..2?......?2..
771 ...2..}}..2...
772 ..2?......?2..
773 ....b....b....
774 .....+..+.....
775 ..............
776 ..............
777 ......ss......
778 ..............
779 ..............
780 Level:
781 Yexter
782 Yexter
783 Bricks:
784 ..............
785 ..............
786 ..............
787 vzv..vzzv..vzv
788 z*z..z**z..z*z
789 vzv..vzzv..vzv
790 vvv..vvvv..vvv
791 vzv..vzzv..vzv
792 z*z..z**z..z*z
793 vzv..vzzv..vzv
794 vvv..vvvv..vvv
795 vzv..vzzv..vzv
796 z*z..z**z..z*z
797 vzv..vzzv..vzv
798 vvv..vvvv..vvv
799 vzv..vzzv..vzv
800 z*z..z**z..z*z
801 vzv..vzzv..vzv
802 Bonus:
803 ..............
804 ..............
805 ..............
806 .s....ss....s.
807 s.s..s..s..s.s
808 .s....ss....s.
809 .5....55....5.
810 .s....ss....s.
811 s.s..s..s..s.s
812 .s....ss....s.
813 .5....55....5.
814 .s....ss....s.
815 s.s..s..s..s.s
816 .s....ss....s.
817 .5....55....5.
818 .s....ss....s.
819 s.s..s..s..s.s
820 .s....ss....s.
821 Level:
822 Yexter
823 Yexter
824 Bricks:
825 ###v.!..!.v###
826 ##v.!....!.v##
827 #v.!.j..j.!.v#
828 v.!.jv..vj.!.v
829 .!.jva..avj.!.
830 !.jvak..kavj.!
831 .jvaka..akavj.
832 jvakak..kakavj
833 vakaka..akakav
834 vakaka..akakav
835 jvakak..kakavj
836 .jvaka..akavj.
837 !.jvak..kavj.!
838 .!.jva..avj.!.
839 v.!.jv..vj.!.v
840 #v.!.j..j.!.v#
841 ##v.!....!.v##
842 ###v.!..!.v###
843 Bonus:
844 ....l....l....
845 ..............
846 ..............
847 ..............
848 .....&..&.....
849 .....b..b.....
850 ...4.b..b.4...
851 .....w..w.....
852 5b.*......*.b5
853 5b...j..j...b5
854 ..............
855 ..............
856 ..............
857 .....+..+.....
858 ..............
859 ..............
860 ..............
861 ..............
862 Level:
863 Yexter
864 Yexter
865 Bricks:
866 ..............
867 ..............
868 ..............
869 ..............
870 ##jajxiixjaj##
871 ##jajxiixjaj##
872 ##jajxiixjaj##
873 #jajxiiiixjaj#
874 jajxiiiiiixjaj
875 ajxiiiiiiiixja
876 ajxiiiiiiiixja
877 jajxiiiiiixjaj
878 #jajxiiiixjaj#
879 ##jajxiixjaj##
880 ##jajxiixjaj##
881 ##jajxiixjaj##
882 ..............
883 ..............
884 Bonus:
885 ..............
886 ..............
887 ..............
888 ..............
889 ......??......
890 ......??......
891 ......??......
892 .....ssss.....
893 ....ssjjss....
894 ...s..bb..s...
895 ...s.w44w.s...
896 .....*++*.....
897 ..............
898 ..............
899 ..............
900 ..............
901 ..............
902 ..............
903 Level:
904 Yexter
905 Yexter
906 Bricks:
907 ..............
908 ..............
909 ..............
910 cccaccccccaccc
911 czcaczcczcaczc
912 cccaccccccaccc
913 aaaaaaaaaaaaaa
914 cccaccccccaccc
915 czcaczcczcaczc
916 cccaccccccaccc
917 aaaaaaaaaaaaaa
918 cccaccccccaccc
919 czcaczcczcaczc
920 cccaccccccaccc
921 aaaaaaaaaaaaaa
922 cccaccccccaccc
923 czcaczcczcaczc
924 cccaccccccaccc
925 Bonus:
926 ..............
927 ..............
928 ..............
929 ..............
930 ......ll......
931 ...&555555&...
932 ....dddddd....
933 ....bbwwbb....
934 ..............
935 ....bbwwbb....
936 ..............
937 ..............
938 ..............
939 ..............
940 ss..........ss
941 ....+....+....
942 ..............
943 ..............
944 Level:
945 Yexter
946 Yexter
947 Bricks:
948 ##############
949 ####f####f####
950 ###faf##faf###
951 ##fadaffadaf##
952 #fadddaadddaf#
953 faddddddddddaf
954 faddddddddddaf
955 faddddddddddaf
956 faddddddddddaf
957 f.adddddddda.f
958 #a.adddddda.a#
959 ##a.adddda.a##
960 ###a.adda.a###
961 ###a.adda.a###
962 ###a.adda.a###
963 ###a.adda.a###
964 ###a.adda.a###
965 ###a......a###
966 Bonus:
967 ..............
968 ..............
969 ..............
970 ..............
971 ......44......
972 ......ss......
973 ..*...??...*..
974 ......55......
975 *.....bb.....*
976 ......ff......
977 ......++......
978 .....*}}*.....
979 ......&&......
980 ......??......
981 ......jj......
982 ......<<......
983 ......55......
984 ..............
985 Level:
986 Yexter
987 Yexter
988 Bricks:
989 ###aa####aa###
990 #....#ii#....#
991 #....#ii#....#
992 #....#ii#....#
993 a....xiix....a
994 a....xiix....a
995 #aaxxxiixxxaa#
996 #iiiiiiiiiiii#
997 #iiiiiiiiiiii#
998 #iiiiiiiiiiii#
999 #iiiiiiiiiiii#
1000 #aaxxxiixxxaa#
1001 a....xiix....a
1002 a....xiix....a
1003 #....#ii#....#
1004 #....#ii#....#
1005 #....#ii#....#
1006 ###aa####aa###
1007 Bonus:
1008 ..............
1009 ..............
1010 ......ll......
1011 ......mm......
1012 ......bb......
1013 ..............
1014 ....??..??....
1015 ..............
1016 ......++......
1017 ..............
1018 ..............
1019 .....?...?....
1020 ......mm......
1021 ......bb......
1022 ..............
1023 ..............
1024 ..............
1025 ..............
1026 Level:
1027 Yexter
1028 Yexter
1029 Bricks:
1030 #.aha#@@#aha.#
1031 #.aha#@@#aha.#
1032 #a.a.a##a.a.a#
1033 #a.a.a..a.a.a#
1034 #haha.aa.ahah#
1035 #haha.aa.ahah#
1036 ##.a.ahha.a.##
1037 ##.a.ahha.a.##
1038 @@.ha.aa.ah.@@
1039 @@.ha.aa.ah.@@
1040 ##.a.ahha.a.##
1041 ##.a.ahha.a.##
1042 #haha.aa.ahah#
1043 #haha.aa.ahah#
1044 #a.a.a..a.a.a#
1045 #a.a.a##a.a.a#
1046 #.aha#@@#aha.#
1047 #.aha#@@#aha.#
1048 Bonus:
1049 ..............
1050 ..............
1051 ...3......3...
1052 .b..........b.
1053 ..............
1054 ......ll......
1055 .....*..*.....
1056 ...b......b...
1057 ....&....&....
1058 ..............
1059 .....?..?.....
1060 ...p.?..?.p...
1061 ......44......
1062 ..............
1063 ...+......+...
1064 ...<......<...
1065 ...*......*...
1066 ..............
1067 Level:
1068 Yexter
1069 Yexter
1070 Bricks:
1071 k.vvkkkkkkvv.k
1072 .k.vvkkkkvv.k.
1073 v.k.vvkkvv.k.v
1074 vv.k.vvvv.k.vv
1075 .vv.k.vv.k.vv.
1076 ..vv.k..k.vv..
1077 v..vv.kk.vv..v
1078 kv..vv..vv..vk
1079 kkv..vvvv..vkk
1080 kkv..vvvv..vkk
1081 kv..vv..vv..vk
1082 v..vv.kk.vv..v
1083 ..vv.k..k.vv..
1084 .vv.k.vv.k.vv.
1085 vv.k.vvvv.k.vv
1086 v.k.vvkkvv.k.v
1087 .k.vvkkkkvv.k.
1088 k.vvkkkkkkvv.k
1089 Bonus:
1090 ..............
1091 ......11......
1092 ......55......
1093 ..............
1094 ..............
1095 .....?..?.....
1096 ......l4......
1097 w....*..*....w
1098 .b....dd....b.
1099 .b....dd....b.
1100 w............w
1101 ......ss......
1102 .....?..?.....
1103 ..............
1104 ..............
1105 .....*55*.....
1106 ......11......
1107 ..............
1108 Level:
1109 Yexter
1110 Yexter
1111 Bricks:
1112 ..a..a..a..a..
1113 ..a..a..a..a..
1114 ###aa####aa###
1115 #aaaaaaaaaaaa#
1116 #aaaaaaaaaaaa#
1117 #aa###aa###aa#
1118 #aa#aaaaaa#aa#
1119 #aa#aaaaaa#aa#
1120 #aa#aa##aa#aa#
1121 #aa#aa##aa#aa#
1122 #aa#aaaaaa#aa#
1123 #aaaaaaaaaaaa#
1124 a............a
1125 aa..........aa
1126 aaa........aaa
1127 aaaa......aaaa
1128 #####....#####
1129 ..............
1130 Bonus:
1131 ..............
1132 ..............
1133 ...mm....mm...
1134 ..............
1135 ....55...55...
1136 ..............
1137 ....bb..bb....
1138 .....w33w.....
1139 ..............
1140 .....s..s.....
1141 ......++......
1142 ..............
1143 ..............
1144 ..............
1145 ..............
1146 ..............
1147 ..............
1148 ..............
1149 Level:
1150 Yexter
1151 Yexter
1152 Bricks:
1153 !.!.!.!!.!.!.!
1154 ..............
1155 ..............
1156 *.*.*.**.*.*.*
1157 ..............
1158 ..............
1159 !.!.!.!!.!.!.!
1160 ..............
1161 ..............
1162 v.v.v.vv.v.v.v
1163 *.*.*.**.*.*.*
1164 v.v.v.vv.v.v.v
1165 .!.!.!..!.!.!.
1166 v.v.v.vv.v.v.v
1167 .*.*.*..*.*.*.
1168 v.v.v.vv.v.v.v
1169 .!.!.!..!.!.!.
1170 ..............
1171 Bonus:
1172 ..............
1173 ..............
1174 ..............
1175 ..............
1176 ..............
1177 ....+.ll.+....
1178 ..............
1179 ......44......
1180 ..............
1181 b.b...jj...b.b
1182 ..............
1183 ..............
1184 ..............
1185 ..............
1186 ..............
1187 ......ss......
1188 ..............
1189 ..............
1190 Level:
1191 Yexter
1192 Yexter
1193 Bricks:
1194 hhhhhhhhhhhhhh
1195 h............h
1196 h.h.h....h.h.h
1197 h..h..hh..h..h
1198 h.h.h....h.h.h
1199 h............h
1200 hv#aax..xaa#vh
1201 hv#aax..xaa#vh
1202 hv#aax..xaa#vh
1203 hv#aax..xaa#vh
1204 hv###x..x###vh
1205 hvvv#x..x#vvvh
1206 hvvv##..##vvvh
1207 hvvvh#..#hvvvh
1208 hvvvh#..#hvvvh
1209 hhhhh#..#hhhhh
1210 ######..######
1211 ..............
1212 Bonus:
1213 ..............
1214 ..............
1215 ..............
1216 ..............
1217 ..............
1218 ..............
1219 .....b..b.....
1220 bb..m....m..bb
1221 ...2m....m2...
1222 ...bm....mb...
1223 ..............
1224 .....b..b.....
1225 ..............
1226 ..............
1227 ..............
1228 ..............
1229 ..............
1230 ..............
1231 Level:
1232 Yexter
1233 Yexter
1234 Bricks:
1235 iiiiaajjaaiiii
1236 iiiaajjjjaaiii
1237 iiaajj..jjaaii
1238 iaajj....jjaai
1239 aajj......jjaa
1240 ajj........jja
1241 jj..#....#..jj
1242 j..#i....i#..j
1243 ..#ii....ii#..
1244 ..#ii....ii#..
1245 j..#i....i#..j
1246 jj..#....#..jj
1247 ajj........jja
1248 aajj......jjaa
1249 iaajj....jjaai
1250 iiaajj..jjaaii
1251 iiiaajjjjaaiii
1252 iiiiaajjaaiiii
1253 Bonus:
1254 ......44......
1255 ......22......
1256 ..............
1257 ..b........b..
1258 ..............
1259 ..*........*..
1260 ..............
1261 ....s....s....
1262 ...4......l...
1263 ...4......l...
1264 ..............
1265 ..............
1266 ..&........&..
1267 ..............
1268 ..............
1269 b*..........*b
1270 w.....55.....w
1271 ..............
1272 Level:
1273 Yexter
1274 Yexter
1275 Bricks:
1276 ##########v.a!
1277 #######a*v.a!a
1278 ########v.a!a!
1279 #####a*v.a!a!a
1280 ######v.a!a!a.
1281 ###a*v.a!a!a..
1282 ####v.a!a!av.a
1283 #a*v.a!a!a..a!
1284 ##v.a!a!a..a!a
1285 *v.a!a!a.va!a!
1286 ..a!a!a..a!a!a
1287 jajajajjajajaj
1288 ajajajaajajaja
1289 jajajajjajajaj
1290 z!z!z!zz!z!z!z
1291 !z!z!z!!z!z!z!
1292 z!z!z!zz!z!z!z
1293 ..............
1294 Bonus:
1295 ..............
1296 ..............
1297 ..............
1298 ..............
1299 ..............
1300 .......?...?..
1301 ...........*..
1302 .......j......
1303 ..............
1304 .........l....
1305 ......c.......
1306 .....555j.?.?.
1307 ....b444bc....
1308 .....bwwb.....
1309 ....}..}......
1310 .*............
1311 ..............
1312 ..............
1313 Level:
1314 Yexter
1315 Yexter
1316 Bricks:
1317 ..ajajaajaja..
1318 ...ajajjaja...
1319 ....ajaaja....
1320 .....ajja.....
1321 ......aa......
1322 ka###.jj.###ak
1323 kaakk.aa.kkaak
1324 ka#kk.jj.kk#ak
1325 kaakk.aa.kkaak
1326 ka###.jj.###ak
1327 kaaaa.aa.aaaak
1328 kkka#.jj.#akkk
1329 kkkaa.aa.aakkk
1330 kkka#.jj.#akkk
1331 aaaaa.aa.aaaaa
1332 #x#x#.jj.#x#x#
1333 ..............
1334 ..............
1335 Bonus:
1336 ..............
1337 ......00......
1338 ......l?......
1339 ..............
1340 ..............
1341 ..............
1342 bm..........mb
1343 ......bb......
1344 ...b......b...
1345 ..............
1346 ..55......55..
1347 ..............
1348 ..............
1349 ......bb......
1350 ..............
1351 ..............
1352 ..............
1353 ..............
1354 Level:
1355 Yexter
1356 Yexter
1357 Bricks:
1358 #####....#####
1359 #aaa#....#aaa#
1360 #aaa#....#aaa#
1361 #aaa#....#aaa#
1362 #aaa#....#aaa#
1363 #aaa#....#aaa#
1364 #aaa#....#aaa#
1365 #aaa#....#aaa#
1366 #aa*aaaaaa*aa#
1367 #aa*aaaaaa*aa#
1368 #aaa#....#aaa#
1369 #aaa#....#aaa#
1370 #aaa#....#aaa#
1371 #aaa#....#aaa#
1372 #aaa#....#aaa#
1373 #aaa#....#aaa#
1374 #aaa#....#aaa#
1375 #####....#####
1376 Bonus:
1377 ..............
1378 ..4........4..
1379 ..............
1380 ..............
1381 ..............
1382 .?.?......?.?.
1383 ..............
1384 .m..........m.
1385 ..............
1386 .....++++.....
1387 .m..........m.
1388 ..............
1389 .?.?......?.?.
1390 ..............
1391 ..............
1392 ..............
1393 .l..........l.
1394 ..............
1395 Level:
1396 Yexter
1397 Yexter
1398 Bricks:
1399 ##dd......dd##
1400 ##dd.vvvv.dd##
1401 ##dd.viiv.dd##
1402 ##dd.vvvv.dd##
1403 #ddd......ddd#
1404 #ddd##..##ddd#
1405 ddddha..ahdddd
1406 dddhh#..#hhddd
1407 ddhhg#..#ghhdd
1408 dhhgga..agghhd
1409 dhgg##..##gghd
1410 dhg#......#ghd
1411 dhg#......#ghd
1412 dhg#..ii..#ghd
1413 dhg#..ii..#ghd
1414 dhg#..ii..#ghd
1415 dhg#..vv..#ghd
1416 dhg#......#ghd
1417 Bonus:
1418 ..............
1419 ..............
1420 ......**......
1421 ..............
1422 .0..........0.
1423 .0..........0.
1424 ...?......?...
1425 ...?......?...
1426 ...?......?...
1427 ...?......?...
1428 ...?......?...
1429 ..............
1430 ..............
1431 ......++......
1432 b.b........b.b
1433 w.....ss......
1434 ..............
1435 ..............
1436 Level:
1437 Yexter
1438 Yexter
1439 Bricks:
1440 ....kkkkkk....
1441 ...akkkkkka...
1442 ...akkkkkka...
1443 ..aakkkkkkaa..
1444 ..a..kkkk..a..
1445 .aa...kk...aa.
1446 .a..!!..!!..a.
1447 aa..........aa
1448 a.....ee.....a
1449 aa....ee....aa
1450 .a....ee....a.
1451 .aa........aa.
1452 ..a........a..
1453 ..aa.dddd.aa..
1454 ...a..dd..a...
1455 ...aa....aa...
1456 ....a....a....
1457 aaaaaa..aaaaaa
1458 Bonus:
1459 ..............
1460 ..............
1461 ..............
1462 .....j..j.....
1463 ..............
1464 ......ll......
1465 ..............
1466 ..............
1467 ......}}......
1468 ..............
1469 ..............
1470 .55........55.
1471 ..............
1472 ......ss......
1473 ..............
1474 ..............
1475 ..............
1476 ..............
1477 Level:
1478 Yexter
1479 Yexter
1480 Bricks:
1481 ..............
1482 #####....#####
1483 #dddddddddddd#
1484 #daaaddddaaad#
1485 #daaaaaaaaaad#
1486 jjjjaaaaaajjjj
1487 jjjjaaaaaajjjj
1488 ##aaaaaaaaaa##
1489 #daaa####aaad#
1490 #daaa####aaad#
1491 ##aaaaaaaaaa##
1492 jjjjaaaaaajjjj
1493 jjjjaaaaaajjjj
1494 #daaaaaaaaaad#
1495 #daaaddddaaad#
1496 #dddddddddddd#
1497 #####....#####
1498 ..............
1499 Bonus:
1500 ..............
1501 ..............
1502 ..............
1503 ..............
1504 ..............
1505 ....bb..bb....
1506 .........c....
1507 ......44......
1508 ...w..........
1509 ..............
1510 ......mm..s...
1511 ..............
1512 ....}...+.....
1513 ......j.......
1514 ..............
1515 ..............
1516 ..............
1517 ..............
1518 Level:
1519 Yexter
1520 Yexter
1521 Bricks:
1522 aajjajajjjjjjj
1523 ajajaaajjjjjjj
1524 aajjjajjjjjjjj
1525 ajajjajjjjjjjj
1526 aajjjajjjjjjjj
1527 jjjjjjjjjjjjjj
1528 jjjaaajajajaaa
1529 jjjjajjajajajj
1530 jjjjajjaaajaaj
1531 jjjjajjajajajj
1532 jjjjajjajajaaa
1533 jjjjjjjjjjjjjj
1534 ajjjajaaajajaj
1535 ajjjajajajaaaj
1536 ajjjajaaajjajj
1537 ajajajajajjajj
1538 aajaajajajjajj
1539 jjjjjjjjjjjjjj
1540 Bonus:
1541 ..............
1542 ..............
1543 ...&&.........
1544 ..............
1545 .........&&...
1546 .......b......
1547 ..............
1548 .&&...........
1549 .....b..b.....
1550 ..............
1551 ..............
1552 ......4.4...&.
1553 ..............
1554 ..m...+.+..m..
1555 ..............
1556 ..............
1557 ..............
1558 ..............
1559 Level:
1560 Yexter
1561 Yexter
1562 Bricks:
1563 h...h....h...h
1564 ..............
1565 h...h....h...h
1566 ..............
1567 h.#.h.##.h.#.h
1568 ..x...xx...x..
1569 ..!...!!...!..
1570 ..!...!!...!..
1571 !!!!!!!!!!!!!!
1572 !!!!!!!!!!!!!!
1573 ..!...!!...!..
1574 ..!...!!...!..
1575 ..x...xx...x..
1576 h.#.h.##.h.#.h
1577 ..............
1578 h...h....h...h
1579 ..............
1580 h...h....h...h
1581 Bonus:
1582 ..............
1583 ..............
1584 ..............
1585 ..............
1586 ....*....*....
1587 ..5...55...5..
1588 .&.&.&..&.&.&.
1589 ..............
1590 ..............
1591 ..............
1592 ..............
1593 .&.&.&..&.&.&.
1594 ..5...55...5..
1595 ....*....*....
1596 ..............
1597 ..............
1598 ..............
1599 ..............
1600 Level:
1601 Yexter
1602 Yexter
1603 Bricks:
1604 .###..jj..###.
1605 .#j#..##..#j#.
1606 .#j#..jj..#j#.
1607 .#h#..jj..#h#.
1608 .#j#..##..#j#.
1609 .#j#..jj..#j#.
1610 .#j#..jj..#j#.
1611 ..j...##...j..
1612 jjjjjjjjjjjjjj
1613 jjjjjjjjjjjjjj
1614 ..j...##...j..
1615 .#j#..jj..#j#.
1616 .#j#..jj..#j#.
1617 .#j#..##..#j#.
1618 .#h#..jj..#h#.
1619 .#j#..jj..#j#.
1620 .#j#..##..#j#.
1621 .###..jj..###.
1622 Bonus:
1623 ..............
1624 ..............
1625 ..............
1626 ..m........m..
1627 ..m........m..
1628 ..............
1629 ..............
1630 ..............
1631 ..............
1632 ..............
1633 ..............
1634 ..............
1635 ..............
1636 ..m........m..
1637 ..m........m..
1638 ..............
1639 ..............
1640 ..............
0 Version: 1.04
1 Level:
2 zigie
3 the beginning
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ...ddffffdd...
9 ...dgfxxfgd...
10 ...hgffffgh...
11 ...hggggggh...
12 #..hhhhhhhh..#
13 ..............
14 ..............
15 iiEEEvvvvEEEii
16 .iihhhhhhhhii.
17 ..iiiiiiiiii..
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ...+.0..l0....
28 ......m1......
29 ....0.b...+...
30 ........0.....
31 3..w..0......3
32 ..............
33 ..............
34 1....w00c...+1
35 .f..1..1w..1..
36 ...1..+...1...
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 zigie
44 the X
45 Bricks:
46 .iiiiiiiiiii..
47 .ihhhhhhhhhi..
48 .ihggghggghi..
49 .ihg#ghg#ghi..
50 .ihg#ggg#ghi..
51 .ihgg#g#gghi..
52 .ihhg#g#ghhi..
53 .iihhg#ghhii..
54 .iihhg#ghhii..
55 .ihhg#g#ghhi..
56 .ihgg#g#gghi..
57 .ihg#ghg#ghi..
58 .ihg#ghg#ghi..
59 .ihggghggghi..
60 .ihhhhhhhhhi..
61 .iiiiiiiiiii..
62 ..............
63 ..............
64 Bonus:
65 ..0...0..0.1..
66 .1..0.+...l...
67 ..1........0..
68 .>.......0....
69 .......1..0...
70 ..+.1...m..>..
71 .0f...4.......
72 ...+.<.{.1....
73 .....f.....0..
74 .0.0..w.......
75 ..-.....+..0..
76 .....1.-...1..
77 .1........p...
78 ..0.-.j.0.....
79 .0.........1..
80 ..0.0.>.......
81 ..............
82 ..............
83 Level:
84 zigie
85 the invisible one
86 Bricks:
87 @....vvvv....@
88 ..............
89 .vvvvvvvvvvvv.
90 .@..........@.
91 v............v
92 ..vvvvvvvvvv..
93 ..@@@@@@@@@@..
94 ..............
95 .vvvvvvvvvvvv.
96 ..............
97 ..............
98 .vvvvvvvvvvvv.
99 ..............
100 ..............
101 .vvvvvvvvvvvv.
102 ..............
103 ..............
104 ..............
105 Bonus:
106 .....0.+l.....
107 ..............
108 .01.m2.1>..10.
109 ..............
110 .............1
111 ..~+..j..1....
112 ..............
113 ..............
114 ...0...c..1.b.
115 ..............
116 ..............
117 .1+..1.-w.+.0.
118 ..............
119 ..............
120 .wb1.0.>.-..b.
121 ..............
122 ..............
123 ..............
124 Level:
125 zigie
126 the labyrinth
127 Bricks:
128 ...c.....ccccc
129 .c.c.ccc.cc...
130 .c.c.c.c.cc.c.
131 .c.c.c.c....c.
132 .c...c.cccccc.
133 .ccccc........
134 .cc.....cccccc
135 .!c.ccccc.....
136 ..c.c...c.cccc
137 ccc.c.c.c.c...
138 c...c.c.c.c.c.
139 c.ccc.c.c.c.c.
140 c.c...c.ccc.c.
141 c...c.c.....c.
142 ccccccccccccc.
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ...b.....w>0b0
148 .>...1.w.2....
149 ...0...+..w.w.
150 .w...b........
151 .0.....w0b.w>.
152 .b.>.<........
153 ..1.....0.b.1-
154 .4..b.0.w.....
155 ..-.w......b0.
156 .0....b.b.b...
157 >...+.....0.b.
158 1.b0..1.w...2.
159 b.....b.b.>.1.
160 >...w.2.....w.
161 wbwwbbw.bwbw>.
162 ..............
163 ..............
164 ..............
165 Level:
166 zigie
167 uncontrollable
168 Bricks:
169 @@@@@@@@@@@@@@
170 @............@
171 @.kkkkkkkkkk.@
172 @.jjjjjjjjjj.@
173 @.jaaaaaaaaj.@
174 @.jabbbbbbaj.@
175 @.jabccccbaj.@
176 @.jabcvvcbaj.@
177 @.jabcvvcbaj.@
178 @.jabccccbaj.@
179 @.jabbbbbbaj.@
180 @.jaaaaaaaaj.@
181 @.jjjjjjjjjj.@
182 @.kkkkkkkkkk.@
183 ..............
184 .@@@@@@@@@@@@.
185 .kkkkkkkkkkkk.
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ...b..j..0.0..
191 ....1...1..g..
192 ..0......b.b..
193 ......*0..<...
194 ..b<0...+0....
195 .....l42.b....
196 ...+..24..0...
197 .....-...0.1..
198 ..0.b..W......
199 ...0.1..>.->..
200 .........0....
201 ..1.m.1.w..W..
202 ..............
203 ..............
204 .c0>b<f0.1+wc.
205 ..............
206 Level:
207 zigie
208 explosive
209 Bricks:
210 vvvvccccccvvvv
211 v**v......v**v
212 v**v.cccc.v**v
213 ####.c**c.####
214 .....c**c.....
215 vvvv.c**c.vvvv
216 v**v.c**c.v**v
217 v**v.c**c.v**v
218 ####.c**c.####
219 .....c**c.....
220 vvvv.c**c.vvvv
221 v**v.c**c.v**v
222 v**v.c**c.v**v
223 ####.cccc.####
224 vvvv......vvvv
225 v**vccccccv**v
226 v**vccccccv**v
227 ####kkkkkk####
228 Bonus:
229 5!*.l.0.g0.~f5
230 +.........0..-
231 ......W.0....~
232 .....1........
233 ........W.....
234 4-W~......+>.4
235 ...0.0..1.....
236 ~.........W..+
237 ........~.....
238 .....0........
239 3>+j....0.-.~3
240 .....>....0..f
241 +.......>.~..-
242 .....10>......
243 2d-~......+.s2
244 f..0.0..0....b
245 ~..-..0..0+...
246 .....0........
247 Level:
248 zigie
249 grow
250 Bricks:
251 !...!....!...!
252 ..............
253 ..!...!!...!..
254 ..............
255 !...!....!...!
256 ..............
257 ..!...!!...!..
258 ..............
259 !...!....!...!
260 ..............
261 ..!...!!...!..
262 ..............
263 !...!....!...!
264 vvvvvvvvvvvvvv
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 !...-0...1...0
271 0.0......0.~..
272 ..g..0l1...{0.
273 ..~.......~...
274 1...1f...1f..1
275 ...........f..
276 ..p..00j...g0.
277 ..f......0....
278 10..-...-....1
279 .~.~.......~0.
280 ..{...11...p..
281 0.0W.W..bw....
282 -...>...0wb..c
283 ~0-0fb0~0+.0+0
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 zigie
290 crack it
291 Bricks:
292 ..............
293 ..ffffffffff..
294 @.fggggggggf.@
295 ..fghhhhhhgf..
296 ..fghffffhgf..
297 ..fghfhhfhgf..
298 @.fghfhhfhgf.@
299 ..fghffffhgf..
300 ..fghhhhhhgf..
301 ..fggggggggf..
302 ..ffffffffff..
303 EEEEE#z#EEEEEE
304 ..............
305 cccccccccccccc
306 ..............
307 ExxxxxxxxxxxxE
308 ..............
309 vvvvvvvvvvvvvv
310 Bonus:
311 ..............
312 ..0..0...0.b..
313 ..bl..01...1..
314 ...1{...l.....
315 ..>20>....0...
316 ......41c.2>..
317 ..1W0...{1....
318 .....+.<0.Wj..
319 ..1.0....00...
320 ..c..010...+..
321 ..0g0.c.0~....
322 .....545......
323 ..............
324 0.0.0.2m+.2.w.
325 ..............
326 .~}0.+1p.0*.0.
327 ..............
328 bp1w1+.b+>bw1<
329 Level:
330 zigie
331 the green one
332 Bricks:
333 f!...zzzz...!f
334 !f...v**v...f!
335 f!.yyzzzzyy.!f
336 !f.x######x.f!
337 f!.x#f!!f#x.!f
338 ...x#fyyf#x...
339 ...xEzzzzEx...
340 ...xEhiihEx...
341 .xx*EhiihE*xx.
342 .@@@@gggg@@@@.
343 igigigigigigig
344 gxgxgxgxgxgxgx
345 igigigigigigig
346 xxxxxxxxxxxxxx
347 ..............
348 xxxxxxxxxxxxxx
349 ..............
350 ..............
351 Bonus:
352 +4...*..+...4+
353 4m..........m4
354 .4.1cjffmc1.41
355 41.>......>.14
356 1....+44+....1
357 ...+..110.+...
358 .....0--0.....
359 ...~.W..W.~...
360 .>....ww....c.
361 ..............
362 ...1.1.1.1...+
363 1.f..{1.j..f1.
364 .+.0.s...0....
365 0>2bw0*W2>00w2
366 ..............
367 1bbw0d11d.ws.1
368 ..............
369 ..............
370 Level:
371 zigie
372 press"d"OrFindTheBrick
373 Bricks:
374 vvvvvvvvvvvvvv
375 ..............
376 aabbccxxccbbaa
377 aabbccxxccbbaa
378 ..............
379 EEEEE####EEEEE
380 ..............
381 aabbccxxccbbaa
382 aabbccxxccbbaa
383 ..............
384 EEEE#E##E#EEEE
385 ..............
386 aabbccxxccbbaa
387 aabbccxxccbbaa
388 ..............
389 EEEEE####EEEEE
390 v............v
391 ..............
392 Bonus:
393 .10+~-1~.10-.1
394 ..............
395 .2.c0*44?0...0
396 0g0.2.44s.10-.
397 ..............
398 ......55......
399 ..............
400 2.f0.l44.p0.+0
401 ~0.-jm44mc.?0.
402 ..............
403 ....5....5....
404 ..............
405 0wf10m44mf-~0-
406 f+0{bp44b>0f~+
407 ..............
408 ......55......
409 m............m
410 ..............
0 Level:
1 Guenter
2 Guenters Rache
3 Bricks:
4 ..............
5 ......a.......
6 ......a.......
7 ..e..e.e..e...
8 ..@@@@@@@@@...
9 ..@@@@@@@@@...
10 ..@dyxxxyd@...
11 ..@dzhhhzd@...
12 ..@dzh*hzd@...
13 ..@dyh@hyd@...
14 ..@dyh.hyd@...
15 ..@dc@.@cd@...
16 ..EdE...EdE...
17 ...E.....E....
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ......-.......
25 ......m.......
26 ..{..w.w..{...
27 ..............
28 ..11..l..11...
29 ..1g>>s>>g1...
30 ..10f---f01...
31 ..d.>~.~>.d...
32 ..d.>bdb>.d...
33 ..d-fb.bf-d...
34 ..1?pd.dp?1...
35 ...p.....p....
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Guenter
43 Spirale
44 Bricks:
45 eee...........
46 ..............
47 .....#........
48 ....@.#.......
49 ...#...#......
50 ..#e.v..@.....
51 .#eee#...#....
52 ..@e#...#.vvvv
53 ...#...#......
54 ......@.......
55 .....#........
56 ....#.yyyyyyyy
57 ...@..........
58 v.#...........
59 v#............
60 ..............
61 ..............
62 vvv...........
63 Bonus:
64 <.g...........
65 ..............
66 ..............
67 ..............
68 ..............
69 ...5..........
70 ..555.........
71 ...5......m-lm
72 ..............
73 ..............
74 ..............
75 ......fff?ffff
76 ..............
77 d.............
78 d.............
79 ..............
80 ..............
81 fff...........
82 Level:
83 Guenter
84 Zauberhut
85 Bricks:
86 g............g
87 ....dddddd....
88 ....d@@@@d....
89 ....dkEEkd....
90 ....d@@@@d....
91 ....dkEEkd....
92 ....d@@@@d....
93 !!..dkEEkd..!!
94 !a..d@@@@d..a!
95 a!..dkEEkd..!a
96 .a!.d@@@@d.!a.
97 ..add.xx.dda..
98 ...a!vvvv!a...
99 xxxxx!!!!xxxxx
100 ***z******z***
101 eeeeeeeeeeeeee
102 ..............
103 ..............
104 Bonus:
105 ?............?
106 ....s....s....
107 ......jj......
108 .....4..4.....
109 ......55......
110 .....3..3.....
111 .s....55....s.
112 .m...2..2...m.
113 ......55......
114 .....g..g.....
115 ..............
116 ..............
117 .....+dd+.....
118 bbb-b.<<.b-bbb
119 ..............
120 ..............
121 ..............
122 ..............
123 Level:
124 Guenter
125 Roesselsprung
126 Bricks:
127 dddddd@ddddddd
128 dd.....v@ddddd
129 d@.......v@vdd
130 d..@........@d
131 @....@.......d
132 ...........@.d
133 .@.bv.@......d
134 ...@...bbbbb@d
135 .......@.....d
136 .............@
137 ......@.......
138 ....@.......E.
139 ..........@y..
140 yyy@....Ey....
141 ......@y......
142 ....Ey........
143 ..............
144 ..v...........
145 Bonus:
146 1b>b>b.-b>b>b1
147 1-.......b-bb1
148 1...........>1
149 m............1
150 .............1
151 .............1
152 ...f.........w
153 .......-.....1
154 .............1
155 ..............
156 ..............
157 ..............
158 ..............
159 ccc...........
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Guenter
166 Frust
167 Bricks:
168 ......@@......
169 ..............
170 ..............
171 .@ffffffffff@.
172 .@f...ii...f@.
173 .@...EEEE...@.
174 .@...h**h...@.
175 .@..######..@.
176 .@..h****h..@.
177 .E.@@@@@@@@.E.
178 ...h**!!**h...
179 ..yyyyyyyyyy..
180 .....@@@@.....
181 .dddddddddddd.
182 .!!!!!!!!!!!!.
183 eeeeeeeeeeeeee
184 ..............
185 ..............
186 Bonus:
187 ......ll......
188 ..............
189 ..............
190 ..}{.&**&.{}..
191 ..}...55...}..
192 ..............
193 ..............
194 ..............
195 ..............
196 ......gg......
197 ..............
198 ......mm......
199 ..............
200 ..+s+-<<-+s+..
201 ....<....<....
202 ?f?fcfccfcf?f?
203 ..............
204 ..............
205 Level:
206 Guenter
207 brutale Gewalt
208 Bricks:
209 ..............
210 .hh.....d.....
211 hhh....d.@@@@.
212 h.h...d.....@.
213 h.h..d......@.
214 h.hhd.yyy...@.
215 h.....y.y...@.
216 h.....yhy...@.
217 hhhh..yyy...@.
218 ...h........@.
219 ..hh..@@....@.
220 hhh..@@@@...@.
221 h...@@@@@@..@.
222 h@@@@@@@@@@@@.
223 hh..........e.
224 .h.E..cc..E.d.
225 EEEE......EEEE
226 ..............
227 Bonus:
228 ..............
229 ..0.....g.....
230 ..0....c......
231 ..0...c.......
232 ..0..c........
233 ..00c.WWW.....
234 ......W.W.....
235 j.....W5W.....
236 .0&&..WWW.....
237 ...&..........
238 ..bb..........
239 pbb...........
240 p.............
241 p.............
242 p<..........d.
243 .<....m?....d.
244 ..............
245 ..............
246 Level:
247 Guenter
248 Guenter
249 Bricks:
250 ##############
251 ............@.
252 .jjjx..jjjx.@.
253 .j..x..j..x.@.
254 .j.....j....@.
255 .j.@@@.j.@@@@.
256 .j.....j....@.
257 .j.....j....@.
258 .j.jj..j.jj.@.
259 .j..j..j..j.@.
260 .j..j..j..j.@.
261 .j..j..j..j.@.
262 .jjjj..jjjj.@.
263 ..........z.@.
264 .@@@@@@@@@@@@.
265 ..............
266 .yyyy..yyyy...
267 .EEEE..EEEE...
268 Bonus:
269 ..............
270 ..............
271 .<b<b..<b<b...
272 .b..b..b..m...
273 .<.....<......
274 .b.....b......
275 .<.....<......
276 .b.....b......
277 .<.<b..<.<b...
278 .b..<..b..<...
279 .b..b..<..b...
280 .b..<..b..<...
281 .<b<b..<b<b...
282 ..............
283 .dddddddddddd.
284 ..............
285 .fw~f..fw~f...
286 ..............
287 Level:
288 Guenter
289 Dagoberts Geldspeicher
290 Bricks:
291 eeeeeeeeeeeeee
292 ..............
293 ..............
294 jj..........cc
295 ..j..j......cc
296 ...jj.......cc
297 jj.j........cc
298 ..j...........
299 ..............
300 .####@EEEEE@EE
301 ..............
302 @@@#EEE@#####.
303 ..............
304 e####@########
305 ..............
306 EEEEEEEEE@###.
307 ..............
308 ..@###########
309 Bonus:
310 lgg2gg2gg2gg2m
311 ..............
312 ..............
313 11..........55
314 ..1..1......55
315 ...11.......55
316 11.1........55
317 ..1...........
318 ..............
319 ..............
320 ..............
321 ..............
322 ..............
323 m.............
324 ..............
325 ..............
326 ..............
327 ..............
328 Level:
329 Guenter
330 Zufallswelt
331 Bricks:
332 .a.a.a.a.a.a.a
333 ..............
334 ..@.#.@.......
335 ..@.#.@.......
336 E##.#.@#@@@@@@
337 ....#.....@...
338 .E@@@@@@@.@.#.
339 ....#.......#.
340 E@@.@.#.###.#.
341 E...#.@.@...#.
342 ..@@#.#.@.@.#.
343 .e....#...@e#.
344 .#@@@.#@@@@.#.
345 .#..........#.
346 .@.@#@#@#@EE@e
347 e#....e@e.....
348 x##@##x#zzza##
349 .hddd@.@.d@#@d
350 Bonus:
351 .4.?.4.l.4.g.4
352 ..............
353 ..............
354 ..............
355 ..............
356 ..............
357 ..............
358 ..............
359 ..............
360 ..............
361 ..............
362 ..............
363 ..............
364 ..............
365 .............m
366 4.....?.?.....
367 ........+..5..
368 ..w.+.........
369 Level:
370 Guenter
371 Eine einzige Chance
372 Bricks:
373 .....b.c......
374 ..............
375 ##############
376 ##############
377 ##############
378 ..............
379 ##############
380 ..............
381 ..............
382 ##############
383 ..............
384 ..............
385 ##############
386 ..............
387 ..............
388 ##############
389 ............xx
390 ............xx
391 Bonus:
392 .....5.l......
393 ..............
394 ..............
395 ..............
396 ..............
397 ..............
398 ..............
399 ..............
400 ..............
401 ..............
402 ..............
403 ..............
404 ..............
405 ..............
406 ..............
407 ..............
408 ............-m
409 ............-f
410 Level:
411 Guenter
412 Klebriges Zeug
413 Bricks:
414 **************
415 ..............
416 ....iiiiii....
417 ....iiiiii....
418 ..............
419 ..............
420 ....*....*....
421 ....xccccx....
422 ....xEEEEx....
423 ....xxxxxx....
424 ....xxxxxx....
425 ....xxxxxx....
426 !!!!xxxxxx!!!!
427 !!!!!!!!!!!!!!
428 ..............
429 ..............
430 ..............
431 ..............
432 Bonus:
433 >000s0>>0s000>
434 ..............
435 ....00ss00....
436 ....<<<<<<....
437 ..............
438 ..............
439 ..............
440 .....gggg.....
441 ..............
442 ....~wssw~....
443 ....s4444s....
444 cscc~b11b~ccsc
445 >.s.~0000~.s.>
446 ssssssssssssss
447 ..............
448 ..............
449 ..............
450 ..............
451 Level:
452 Guenter
453 Gluecksspiel
454 Bricks:
455 @............@
456 @.cccccccccc.@
457 @.EEE@##@EEE.@
458 @............@
459 @............@
460 @............@
461 @..EE@##@EE..@
462 @............@
463 @@..........@@
464 @....@..@....@
465 @....E..E....@
466 cccc.@..@.cccc
467 #EE@.#..#.@EE#
468 @....#..#....@
469 @....E..E....@
470 @....@..@....@
471 @....E..E....@
472 @....@cc@....@
473 Bonus:
474 ?............?
475 ?.??????????.?
476 ?.??????????.?
477 ?............?
478 ?............?
479 ?............?
480 ?..????????..?
481 ?............?
482 ??..........??
483 ?....?..?....?
484 ?....?..?....?
485 ????.?..?.????
486 ????.?..?.????
487 ?....?..?....?
488 ?....?..?....?
489 ?....?..?....?
490 ?....?..?....?
491 ?....?mm?....?
492 Level:
493 Guenter
494 Autsch
495 Bricks:
496 i.....jj.....i
497 i.....jj.....i
498 ......jj......
499 ......jj......
500 ......ii......
501 ......ii......
502 ......ii......
503 ......ii......
504 ......ii......
505 ......ii......
506 EEE...ii...EEE
507 h.....ii.....h
508 h.EEEEiiEEEE.h
509 h.....ii.....h
510 h....@@@@....h
511 hEEE......EEEh
512 h............h
513 EE.EE.@@.EE.EE
514 Bonus:
515 5.....44.....5
516 5.....44.....5
517 ......44......
518 ......44......
519 ......ff......
520 ......ff......
521 ......ff......
522 ......ff......
523 ......ff......
524 ......ff......
525 ......ff......
526 {.....ff.....{
527 f.....ff.....f
528 f.....??.....f
529 f............f
530 f............f
531 m............m
532 ..............
533 Level:
534 Guenter
535 Laecheler
536 Bricks:
537 ..............
538 ..............
539 ..............
540 ...fff.fff....
541 ..............
542 ..............
543 ....d...d.....
544 .xx.......xx..
545 .x.........x..
546 .x....i....x..
547 .xx...i...xx..
548 ......i.......
549 ......x.......
550 ...ee...he....
551 ....eeeee.....
552 .....eee......
553 ..............
554 ..............
555 Bonus:
556 ..............
557 ..............
558 ..............
559 ...&l&.&l&....
560 ..............
561 ..............
562 ....g...g.....
563 .++.......++..
564 .+.........+..
565 .+....j....+..
566 .++...j...++..
567 ......j.......
568 ......j.......
569 ...0f...f0....
570 ....00000.....
571 .....000......
572 ..............
573 ..............
574 Level:
575 Guenter
576 Umpfffff
577 Bricks:
578 ......ff......
579 ..@@@@@@@@@@..
580 ..............
581 ..............
582 .@.@......@.@.
583 .@.@......@.@.
584 .@i@......@i@.
585 .@@@......@@@.
586 .@@@......@@@.
587 ..............
588 ..............
589 ......@@......
590 ......@@......
591 ..............
592 ...@..cc..@...
593 ...@@@@@@@@...
594 ..............
595 ..............
596 Bonus:
597 ......55......
598 ..............
599 ..............
600 ..............
601 ..............
602 ..............
603 ..5........5..
604 ..............
605 ..............
606 ..............
607 ..............
608 ..............
609 ..............
610 ..............
611 ......mm......
612 ..............
613 ..............
614 ..............
615 Level:
616 Guenter
617 Schnell oder aetzend
618 Bricks:
619 ..............
620 ..............
621 ..!!!!!!!!!!..
622 ..............
623 xxxxxxxxxxxxxx
624 xx**xxxxxx**xx
625 x*****xx*****x
626 xxxxxxxxxxxxxx
627 ...@..........
628 ..............
629 .....@.....@..
630 ..............
631 ..............
632 ..@...........
633 .......@......
634 ..............
635 ............@.
636 ..............
637 Bonus:
638 ..............
639 ..4444444444..
640 ..............
641 ..............
642 ..............
643 ..............
644 ..............
645 ..............
646 ..............
647 ..............
648 ..............
649 ..............
650 ..............
651 ..............
652 ..............
653 ..............
654 ..............
655 ..............
656 Level:
657 Guenter
658 Duesterwald
659 Bricks:
660 ..............
661 .......c......
662 ..c...........
663 ..c...c..c..c.
664 ..............
665 ..............
666 ........c.....
667 ......c.....c.
668 ...c........c.
669 ..........c...
670 ..............
671 ..............
672 .c.....c....c.
673 ..............
674 ..............
675 !!!!!!!!!!!!!!
676 ..............
677 **************
678 Bonus:
679 ..............
680 .......~......
681 ..2...........
682 ..2...5..>..~.
683 ..............
684 ..............
685 ........m.....
686 ......>.....2.
687 ...W........?.
688 ..........-...
689 ..............
690 ..............
691 .-.....W....2.
692 ..............
693 ff>>ff>>ff>>ff
694 dddddddddddddd
695 dddddddddddddd
696 ..............
697 Level:
698 Guenter
699 Chaos
700 Bricks:
701 ..dd..........
702 !.d.!!!!!!dd.!
703 .d.......*.d.!
704 .d..@.!!!x.d.!
705 *!..ddd.#d!.!.
706 d!!xx.d.!.!!x.
707 .!..d!!E.!dx!.
708 @!d.d!!d.!.!!d
709 d!*...!!!xx!dd
710 .!.d!!.d*.x...
711 .x..x...!@d.!d
712 .!.xx..!!!..!.
713 .!#..d..ddx@xx
714 ..dd..!!!!xx!.
715 .d.d!!!...!!!.
716 xd...d.Exd.@d.
717 .d..dd@..dd.d.
718 ...E....!.....
719 Bonus:
720 *.....d.}}....
721 ......df..fwf.
722 .f.f..........
723 .....0.b.+..00
724 ...<.00..f!...
725 fw....0.}....<
726 ....}.d....5..
727 .f....5.<w<.>.
728 00.w.ff.!.0.>c
729 .0...d0~>..~..
730 ....?g0>.f.0..
731 ..b....0c...m.
732 f....w.b0.0.w~
733 .j.1<.f.c00..~
734 .f.....++<...0
735 ...ff.+f......
736 ....b.........
737 ..............
738 Level:
739 Guenter
740 Glueck oder Pech
741 Bricks:
742 .e..@@@@@@..e.
743 #............#
744 eE..........Ee
745 e.E...@@...E.e
746 e..E!!!!!!E..e
747 e............e
748 #............#
749 gE....@@....Eg
750 g.E........E.g
751 g..E!!!!!!E..g
752 g............g
753 #............#
754 hE....@@....Eh
755 h.E........E.h
756 h..E......E..h
757 h............h
758 @@xxxxxxxxxx@@
759 ..............
760 Bonus:
761 .g..333333..g.
762 5............5
763 1............1
764 1.....33.....1
765 1.....mm.....1
766 1...------...1
767 5............5
768 ......55......
769 ....++++++....
770 ......??......
771 ..............
772 5............5
773 ..............
774 ..............
775 ..............
776 p............p
777 55..........55
778 ..............
779 Level:
780 Guenter
781 Hoelle
782 Bricks:
783 ..............
784 hhhhhhhhhhhhhh
785 hhhhhhhhhhhhhh
786 ..............
787 ..............
788 ..............
789 @@@@@@@@@@@@@@
790 @@@@@@@@@@@@@@
791 ..............
792 ..............
793 !!!!!!!!!!!!!!
794 !!!!!!!!!!!!!!
795 ..............
796 zzzzzbbbbzzzzz
797 z*z*@@@@@@*z*z
798 zzzzzzzzzzzzzz
799 !..!..!!..!..!
800 zzzzzzzzzzzzzz
801 Bonus:
802 ..............
803 55555555555555
804 55555555555555
805 ..............
806 ..............
807 ..............
808 ssssssssssssss
809 {{{{{{{{{{{{{{
810 ..............
811 44444444444444
812 --------------
813 ~~~~~~~~~~~~~~
814 44444444444444
815 l.....mm.....l
816 &.&{{{{{{{{&.&
817 dddddddddddddd
818 &cc&cc&&cc&cc&
819 >>>>>>>>>>>>>>
820 Level:
821 Guenter
822 Himmel
823 Bricks:
824 z...!....!...z
825 ......!!......
826 .!.!......!.!.
827 .....!..!.....
828 !..x......x..!
829 ......!!......
830 .!.!......!.!.
831 .....!zz!.....
832 ..............
833 !.!...!!...!.!
834 ....!....!....
835 ..!........!..
836 ..............
837 .!.!..!!..!.!.
838 ..............
839 ..!..!..!..!..
840 ..............
841 ..............
842 Bonus:
843 ...00000000...
844 40003w..w30004
845 g000334433000g
846 00003.33.30000
847 .0..00bb00..0.
848 0001g1..1g1000
849 1.1.111111.1.1
850 11111.11.11111
851 00111111111100
852 .0.+++..+++.0.
853 00sw.0ss0.ws00
854 .*.000..000.*.
855 00000g22g00000
856 <.<.02..20.<.<
857 0&&&02<<20&&&0
858 .0000.00.0000.
859 ..............
860 ..............
861
0 /***************************************************************************
1 main.c - description
2 -------------------
3 begin : Don Sep 6 12:02:57 CEST 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifdef HAVE_CONFIG_H
18 #include "../config.h"
19 #endif
20
21 #ifdef _WIN32
22 #include <fcntl.h>
23 #endif
24
25 #include "lbreakout.h"
26 #include "../game/game.h"
27 #include "file.h"
28 #include "chart.h"
29 #include "config.h"
30 #include "shrapnells.h"
31 #include "event.h"
32 #include "game.h"
33 #include "manager.h"
34 #include "editor.h"
35 #include "help.h"
36 #include "theme.h"
37 #include "client.h"
38 #include "../gui/gui.h"
39
40 extern int stk_quit_request;
41 extern SDL_Surface *stk_display;
42 extern Config config;
43 extern StkFont *font;
44 extern char **theme_names;
45 extern int theme_count;
46 extern SDL_Surface *mbkgnd, *cr_bkgnd;
47 extern char *edit_set;
48 extern char **levelset_names_local; /* non-network levelsets */
49 extern int freakout_seed;
50
51 /* used to compile net messages */
52 char msgbuf[MAX_MSG_SIZE];
53 int msglen = 0;
54
55 int main(int argc, char *argv[])
56 {
57 int result = ACTION_NONE;
58 int leave = 0;
59 char *editor_file = 0;
60 char path[512];
61 SDL_Surface *loading;
62
63 #ifdef _WIN32
64 /* Get Windows to open files in binary mode instead of default text mode */
65 _fmode = _O_BINARY;
66 #endif
67
68 /* lbreakout info */
69 printf( "LBreakout2 %s\nCopyright 2001-2005 Michael Speck\nPublished under GNU GPL\n---\n", VERSION );
70 printf( "Looking up data in: %s\n", SRC_DIR );
71 printf( "Looking up custom levels in: %s/%s/lbreakout2-levels\n", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
72 #ifndef AUDIO_ENABLED
73 printf( "Compiled without sound and music\n" );
74 #endif
75
76 set_random_seed(); /* set random seed */
77
78 config_load();
79
80 stk_init( SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK );
81 if ( config.fullscreen )
82 stk_display_open( SDL_SWSURFACE | SDL_FULLSCREEN, 640, 480, 16 );
83 else
84 stk_display_open( SDL_SWSURFACE, 640, 480, 16 );
85 stk_audio_open( 0,0,0,config.audio_buffer_size );
86 SDL_WM_SetCaption( "LBreakout2", 0 );
87 SDL_SetEventFilter( event_filter );
88 stk_audio_enable_sound( config.sound );
89 stk_audio_set_sound_volume( config.volume * 16 );
90
91 /* load a little loading pic */
92 stk_surface_set_path( SRC_DIR "/gfx" );
93 loading = stk_surface_load( SDL_SWSURFACE, "loading.png" );
94 stk_surface_blit( loading, 0,0,-1,-1, stk_display,
95 (stk_display->w-loading->w)/2,
96 (stk_display->h-loading->h)/2 );
97 stk_display_update( STK_UPDATE_ALL );
98
99 /* load the GUI graphics from SRC_DIR/gui_theme */
100 stk_surface_set_path( SRC_DIR );
101 stk_audio_set_path( SRC_DIR );
102 gui_init( "gui_theme" );
103
104 stk_surface_set_path( SRC_DIR "/gfx" );
105 stk_audio_set_path( SRC_DIR "/sounds" );
106
107 /* load resources */
108 /* for simplicity all functions are kept but anything
109 * that is now themeable is loaded in
110 * theme_load instead of the original function
111 * (deleting resources works analouge)
112 */
113 theme_get_list();
114 if ( config.theme_count != theme_count ) {
115 if ( config.theme_id >= theme_count )
116 config.theme_id = 0;
117 config.theme_count = theme_count;
118 }
119 theme_load( theme_names[config.theme_id] );
120 /* old functions still with initialzations of
121 * lists or variables
122 */
123 client_game_create();
124 hint_load_res();
125 chart_load();
126 manager_create();
127 client_create();
128 exp_load();
129 editor_create();
130 help_create();
131 /* run game */
132 manager_fade( STK_FADE_IN );
133 while( !leave && !stk_quit_request ) {
134 result = manager_run();
135 switch( result ) {
136 case ACTION_QUIT: leave = 1; break;
137 case ACTION_RESUME_0:
138 manager_fade( STK_FADE_OUT );
139 if ( client_game_resume_local( 0 ) )
140 client_game_run();
141 client_game_finalize();
142 manager_fade( STK_FADE_IN );
143 break;
144 case ACTION_PLAY_LBR:
145 manager_fade( STK_FADE_OUT );
146 if ( client_game_init_local( "LBreakout2" ) )
147 client_game_run();
148 client_game_finalize();
149 manager_fade( STK_FADE_IN );
150 break;
151 case ACTION_PLAY_CUSTOM:
152 manager_fade( STK_FADE_OUT );
153 freakout_seed = rand(); /* set random seed for next FREAKOUT game */
154 if ( client_game_init_local( levelset_names_local[config.levelset_id_local] ) )
155 client_game_run();
156 client_game_finalize();
157 manager_fade( STK_FADE_IN );
158 break;
159 case ACTION_EDIT:
160 /* new set? */
161 if ( strequal( NEW_SET, edit_set ) ) {
162 editor_file = calloc( 16, sizeof( char ) );
163 snprintf( path, sizeof(path)-1, "%s/%s/lbreakout2-levels", getenv( "HOME" )? getenv("HOME"):".", CONFIG_DIR_NAME );
164 if ( !enter_string( font, "Set Name:", editor_file, 12 ) || !file_check( path, editor_file, "w" ) ) {
165 free( editor_file );
166 break;
167 }
168 else
169 manager_update_set_list();
170 }
171 else
172 editor_file = strdup( edit_set );
173 if ( editor_init( editor_file ) ) {
174 manager_fade( STK_FADE_OUT );
175 editor_run();
176 editor_clear();
177 manager_fade( STK_FADE_IN );
178 }
179 free( editor_file ); editor_file = 0;
180 break;
181 case ACTION_QUICK_HELP:
182 help_run();
183 break;
184 case ACTION_CLIENT:
185 manager_fade( STK_FADE_OUT );
186 client_run();
187 manager_fade( STK_FADE_IN );
188 break;
189 default: break;
190 }
191 }
192 manager_fade( STK_FADE_OUT );
193 /* delete stuff */
194 help_delete();
195 manager_delete();
196 chart_save();
197 chart_delete();
198 editor_delete();
199 exp_delete();
200 client_game_delete();
201 hint_delete_res();
202 theme_delete();
203 theme_delete_list();
204 stk_surface_free( &loading );
205
206 config_save();
207
208 return EXIT_SUCCESS;
209 }
0 /***************************************************************************
1 manager.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "manager.h"
18 #include "../game/game.h"
19 #include "file.h"
20 #include "chart.h"
21 #include "event.h"
22 #include "config.h"
23 #include "../gui/stk.h"
24 #include "theme.h"
25 #include "slot.h"
26
27 extern SDL_Surface *stk_display;
28 extern Config config;
29 extern List *menus; /* list of menus */
30 int menu_x = 54, menu_y = 220, menu_w = 256, menu_h = 256, menu_border = 16; /* default region where menu is displayed centered */
31 int cx = 384, cy = 220, cw = 256, ch = 200; /* center charts here */
32 Menu *cur_menu; /* current menu */
33 extern SDL_Surface *mbkgnd; /* menu background */
34 extern StkFont *mfont, *mhfont, *mcfont; /* font, highlight font, caption font */
35 int gap_height = 2;
36 List *levelset_names = 0; /* all names in home & install directory */
37 char **levelset_names_home = 0; /* home directory sets */
38 int levelset_count_home = 0;
39 char **levelset_names_local; /* non-network levelsets */
40 int levelset_count_local;
41 char *edit_set = 0; /* selected set in editor menu */
42 extern int stk_quit_request;
43 #ifdef AUDIO_ENABLED
44 extern StkSound *wav_menu_click;
45 extern StkSound *wav_menu_motion;
46 #endif
47 /* some items we need to know to assign name lists later */
48 Item *item_levelset, *item_set, *item_theme, *item_resume_0;
49 extern List *charts;
50 int chart_id = 0; /* current chart displayed */
51 /* theme name list */
52 extern char **theme_names;
53 extern int theme_count;
54
55 /* hints */
56 #define HINT_ 0
57 #define HINT_QUIT "There's nasty work out there waiting for you... better stay here!"
58 #define HINT_ANIM "If you turn animations low there'll be less details which will speed up the game a great deal."
59 #define HINT_TRP "Enable/disable transparency of bonuses and animations."
60 #define HINT_SHADOW "If you disable shadows it will speed up the game but won't look that good. ;-)"
61 #define HINT_BONUS_INFO "If this is enabled you'll see the time left for all bonuses and maluses at the right side of the screen."
62 #define HINT_DISPLAY "You may run LBreakout2 either fullscreen or windowed. This switch may be done anywhere by pressing 'f'."
63 #define HINT_FPS "You you don't want LBreakout2 to consume all of your CPU (best performance) limit the frame rate."
64 #define HINT_CONVEX "As long as this option is enabled the paddle is treated as convex allowing easy aiming. If you "\
65 "disable this option the real physics will show up and you'll have to influence the ball by paddle movement "\
66 "and the hemispherical ends. Just for cracks."
67 #define HINT_BALLLEVEL "If you can't see the ball because of thousands of bonuses coming down set this option to 'Above Bonuses'"
68 #define HINT_DEBRISLEVEL "If you can't see the ball because of all the debris coming down set this option to 'Below Balls'"
69 #define HINT_USEHINTS "Enable/disable these quick hints. See the manual for more information about how to use LBreakout2!"
70 #define HINT_KEYSPEED "Adjust the paddle speed for movement by keys. (pixels per second)"
71 #define HINT_PLAYERS "These are the number of players and their names. If one player looses a ball or restarts the level it's the next player's turn."
72 #define HINT_DIFF "KIDS:#Lives: 9 (max. 12)#Paddle Size: 252 (max. 396)#Ball Speed: 100-200#Bonus: -50% (no maluses, no bad speech)##"\
73 "EASY:#Lives: 6 (max. 9)#Paddle Size: 72 (max. 180)#Ball Speed: 240-400 pixels/sec#Bonus: -20%##"\
74 "MEDIUM:#Lives: 5 (max. 7)#Paddle Size: 54 (max. 144)#Ball Speed: 270-430 pixels/sec##"\
75 "HARD:#Lives: 4 (max. 5)#Paddle Size: 54 (max. 108)#Ball Speed: 300-450 pixels/sec#Bonus: +30%"
76 #define HINT_START_LBR "Play the original LBreakout2 levelset."
77 #define HINT_START_CUSTOM "Play the additional levelset selected below."
78 #define HINT_EDITOR_SET "This is the list of the levelsets found in ~/.lgames/lbreakout2-levels which you may edit. If you "\
79 "choose <CREATE SET> and click on 'Edit Set' below you'll be asked to enter a levelsetname and the new levelset " \
80 "will be saved in a file by this name."
81 #define HINT_EDITOR_EDIT "Click here to edit the levelset chosen above.##NOTE: To switch to the bonus set you'll have to right-click on the brick set and vice versa!"
82 #define HINT_EDITOR_DELETE "Click here to delete the chosen levelset (after confirmation)."
83 #define HINT_KEYS "If you use the keyboard for input these are the keys for moving the paddle ('Paddle Turbo' will double the speed while pressed.), firing balls/shots and returning the ball to paddle after a timeout of ten seconds.##Note: If balls are fired at a random angle (which has become the default) "\
84 "there is no difference between the left or right fire key. A sticky paddle stops a ball until "\
85 "any fire button is pressed but the movement angle is the one from the normal reflection. To "\
86 "reset the movement angle to -50 or +50 degrees check out 'Ball Fire Angle' in 'Advanced Options'.##"\
87 "While pressed, the 'Ball Turbo' will bring all balls to the maximum speed defined in 'Advanced Options'."
88 #define HINT_MOD "This modifies the relative motion of the mouse. (percent) "\
89 "The higher this value is the faster the mouse moves."
90 #define HINT_INVERT "If for some reason your mouse movement is inverted you can fix it with this option."
91 #define HINT_RETURN "If a ball does not damage a brick within ten seconds it is allowed to return to the paddle. If this option is set "\
92 "to 'Auto' it will automatically return and if this option is set to 'By Click' you'll have to press the middle mouse"\
93 "button or the 'back'-key (default is Backspace)."
94 #define HINT_APPLY "Click here to apply the theme you selected above. Please check the manual at lgames.sf.net for information on how to " \
95 "create a theme."
96 #define HINT_HOST "IP address of the game server as xxx.xxx.xxx.xxx.#DO NOT use 'localhost' if you run the server on your computer. You won't be able to challenge others. Use your IP queried by /sbin/ifconfig instead."
97 #define HINT_PORT "Port the game server is bound to."
98 #define HINT_USERNAME "If you're successfully connected to the game server this is your nickname there."
99 #define HINT_CONNECT "Connect to game server."
100 #define HINT_LOCAL "A local game with up to 4 alternating players."
101 #define HINT_NETWORK "A two-player or deathmatch game via Internet or LAN."
102
103 char hint_levelset[400]; /* information about version and author of selected levelset */
104 #define HINT_LEVELSET_APPENDIX "This is the levelset you actually want to play. Note, that each levelset got it's own highscore chart (left/right-click on the chart on the right)." \
105 " A levelset is either load from ~/.lgames/lbreakout2-levels or the installation directory."
106 char hint_theme[512]; /* theme information */
107 #define HINT_THEME_APPENDIX "This is the list of available themes. Choose any theme and click 'Apply' to select it"
108 #define HINT_WARP_LIMIT "After you destroyed this percentage of bricks you MAY warp to the next level by pressing 'w'. That is indicated by a small icon at the bottom right-hand side of the screen.#If you set this option to 0 you may instantly warp whereas 100 means you have to destroy all bricks.##"\
109 "Note, that this option does not apply for the levelsets 'Original' and 'LBreakout1'!"
110 #define HINT_THEME "In this menu you can change the appearance of LBreakout. Included to the release are the three winning themes from the Linux Game Tome contest 'absoluteB','Oz' and 'Moiree' along with the old graphics as theme 'Classic'.#For more themes check out http://lgames.sf.net."
111 #define HINT_CORNER "Linear:#++ There is no chance for balls to get infinitely stuck in a brick bounce combo.#"\
112 "-- It is quite hard for balls to enter narrow passages.##Spherical:#"\
113 "++ Feels better and balls can easily pass through small gaps.#"\
114 "-- There is a chance for balls to get infinitely stuck within a series of indestructible "\
115 "brick reflections if the level is too wrinkled. However, with the auto return option this "\
116 "is no problem so 'Spherical' is the default."
117 #define HINT_LOCAL_PORT "Network communication is handled by a single UDP socket which will be "\
118 "bound to this port number."
119 #define HINT_RANDOM_ANGLE "If '50' the ball is shot at an angle of 50 degrees to the left or "\
120 "right, depending on which fire button has been pressed. If it is set to 'random' the "\
121 "ball is fired at a random angle. In this case a sticky paddle simply halts "\
122 "the normal reflection until any fire button has been pressed."
123 #define HINT_MAXBALLSPEED "While you keep the middle mouse button pressed (or the acceleration key) "\
124 "all balls will go this velocity. (in pixels per second)"
125
126 /*
127 ====================================================================
128 Levelset names functions.
129 ====================================================================
130 */
131 /*
132 ====================================================================
133 Check if this levelset's name declare it as network set.
134 ====================================================================
135 */
136 int levelset_is_network( char *name )
137 {
138 if ( name == 0 ) return 0;
139 if ( name[0] == '~' ) name++;
140 if ( name[0] == 'N' && name[1] == '_' ) return 1;
141 return 0;
142 }
143 /*
144 ====================================================================
145 Get/delete list of all valid levelsets in data directory or
146 ~/.lbreakout/levels.
147 ====================================================================
148 */
149 void levelsets_delete_names()
150 {
151 if ( levelset_names ) {
152 list_delete( levelset_names );
153 levelset_names = 0;
154 }
155 if ( levelset_names_home ) {
156 free( levelset_names_home );
157 levelset_names_home = 0;
158 }
159 if ( levelset_names_local ) {
160 free( levelset_names_local );
161 levelset_names_local = 0;
162 }
163 }
164 void levelsets_load_names()
165 {
166 Text *text = 0;
167 char level_dir[512];
168 char file_name[64];
169 char *name;
170 int default_set_count = 2;
171 char *default_sets[] = {
172 "LBreakout1",
173 "!FREAKOUT!"
174 };
175 int i, j;
176 /* clear previous lists */
177 levelsets_delete_names();
178 /* gather all names in install&home directory to levelset_names */
179 levelset_names = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
180 /* parse install directory */
181 sprintf( level_dir, "%s/levels", SRC_DIR );
182 if ( ( text = get_file_list( level_dir, 0, level_dir ) ) ) {
183 for ( i = 0; i < text->count; i++ ) {
184 /* filter stuff */
185 if ( text->lines[i][0] == '*' ) continue;
186 if ( strequal( text->lines[i], "Makefile.am" ) ) continue;
187 if ( strequal( text->lines[i], "Makefile.in" ) ) continue;
188 if ( strequal( text->lines[i], "Makefile" ) ) continue;
189 /* default sets */
190 if ( strequal( text->lines[i], "LBreakout2" ) ) continue;
191 if ( strequal( text->lines[i], "LBreakout1" ) ) continue;
192 /* obsolete sets */
193 if ( strequal( text->lines[i], "Original" ) ) continue;
194 if ( strequal( text->lines[i], "AddOn-1" ) ) continue;
195 if ( strequal( text->lines[i], "AddOn-2" ) ) continue;
196 /* default sets are at the beginning of the list thus
197 ignored here */
198 for ( j = 0; j < default_set_count; j++ )
199 if ( STRCMP( default_sets[j], text->lines[i] ) )
200 continue;
201 /* add */
202 list_add( levelset_names, strdup( text->lines[i] ) );
203 }
204 delete_text( text );
205 }
206 /* parse home directory */
207 snprintf( level_dir, sizeof(level_dir)-1, "%s/%s/lbreakout2-levels", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
208 if ( ( text = get_file_list( level_dir, 0, level_dir ) ) ) {
209 for ( i = 0; i < text->count; i++ ) {
210 /* filter stuff */
211 if ( text->lines[i][0] == '*' ) continue;
212 /* add */
213 sprintf( file_name, "~%s", text->lines[i] );
214 list_add( levelset_names, strdup( file_name ) );
215 }
216 delete_text( text );
217 }
218 /* create static home list */
219 list_reset( levelset_names );
220 levelset_count_home = 1;
221 while ( ( name = list_next( levelset_names ) ) )
222 if ( name[0] == '~' )
223 levelset_count_home++;
224 levelset_names_home = calloc( levelset_count_home, sizeof( char* ) );
225 list_reset( levelset_names ); i = 1;
226 while ( ( name = list_next( levelset_names ) ) )
227 if ( name[0] == '~' )
228 levelset_names_home[i++] = name + 1;
229 levelset_names_home[0] = NEW_SET;
230 /* create static local set list */
231 list_reset( levelset_names );
232 levelset_count_local = 1;
233 while ( ( name = list_next( levelset_names ) ) )
234 if ( !levelset_is_network( name ) )
235 levelset_count_local++;
236 levelset_names_local = calloc( levelset_count_local, sizeof( char* ) );
237 list_reset( levelset_names ); i = 1;
238 while ( ( name = list_next( levelset_names ) ) )
239 if ( !levelset_is_network( name ) )
240 levelset_names_local[i++] = name;
241 /* default names */
242 for ( i = 0; i < default_set_count; i++ )
243 levelset_names_local[i] = default_sets[i];
244 /* adjust config */
245 if ( config.levelset_count_local != levelset_count_local ) {
246 config.levelset_id_local = 0;
247 config.levelset_count_local = levelset_count_local;
248 }
249 if ( config.levelset_count_home != levelset_count_home ) {
250 config.levelset_id_home = 0;
251 config.levelset_count_home = levelset_count_home;
252 }
253 }
254
255 /* select levelset chart */
256 void select_chart( char *name, int update )
257 {
258 int i;
259 Set_Chart *chart;
260 /* select chart */
261 for ( i = 0; i < charts->count; i++ ) {
262 chart = chart_set_query_id( i );
263 if ( STRCMP( chart->name, name ) ) {
264 chart_id = i;
265 if ( update ) {
266 stk_surface_blit(
267 mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
268 chart_show( chart_set_query_id( chart_id ),
269 cx, cy, cw, ch );
270 }
271 }
272 }
273 }
274
275 /*
276 ====================================================================
277 Callbacks of menu items.
278 ====================================================================
279 */
280 /* Disable/enable sound */
281 void cb_sound() {
282 #ifdef AUDIO_ENABLED
283 stk_audio_enable_sound( config.sound );
284 #endif
285 }
286 /* set volume */
287 void cb_volume() {
288 #ifdef AUDIO_ENABLED
289 stk_audio_set_sound_volume( config.volume * 16 );
290 #endif
291 }
292 /* toggle fullscreen */
293 void cb_fullscreen() {
294 manager_show();
295 }
296 /* delete set */
297 void cb_delete_set()
298 {
299 char fname[512];
300 /* do not delete <CREATE SET> file */
301 if ( strequal( "<CREATE SET>", levelset_names_home[config.levelset_id_home] ) ) {
302 printf( "You cannot delete '<CREATE SET>'!\n" );
303 return;
304 }
305 /* get file name + path */
306 snprintf( fname, sizeof(fname)-1,"%s/%s/lbreakout2-levels/%s", getenv( "HOME" ), CONFIG_DIR_NAME, levelset_names_home[config.levelset_id_home] );
307 remove( fname );
308 levelsets_load_names(); /* reinit name lists and configs indices */
309 /* reassign these name lists as position in memory has changed */
310 value_set_new_names( item_levelset->value, levelset_names_local, levelset_count_local );
311 value_set_new_names( item_set->value, levelset_names_home, levelset_count_home );
312 }
313 /* adjust set list */
314 void cb_adjust_set_list()
315 {
316 /* reinit name lists and configs indices */
317 levelsets_load_names();
318 /* reassign these name lists as position in memory has changed */
319 value_set_new_names( item_levelset->value, levelset_names_local, levelset_count_local );
320 value_set_new_names( item_set->value, levelset_names_home, levelset_count_home );
321 }
322 /* set key speed from i_key_speed */
323 void cb_set_keyspeed()
324 {
325 config.key_speed = 0.001 * config.i_key_speed;
326 }
327 /* if hints where disabled hide actual hint */
328 void cb_hints()
329 {
330 if ( !config.use_hints )
331 hint_set( 0 );
332 }
333 /* change theme */
334 void cb_change_theme()
335 {
336 Menu *menu;
337 theme_load( theme_names[config.theme_id] );
338 hint_set_bkgnd( mbkgnd );
339 /* apply the new background to all items */
340 list_reset( menus );
341 while ( ( menu = list_next( menus ) ) ) {
342 menu_set_bkgnd( menu, mbkgnd );
343 menu_set_fonts( menu, mcfont, mfont, mhfont );
344 }
345 stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
346 stk_display_update( STK_UPDATE_ALL );
347 }
348 /* update hint about selected levelset */
349 void cb_update_levelset_hint()
350 {
351 FILE *file;
352 int version, update;
353 char author[32];
354 if ( STRCMP( levelset_names_local[config.levelset_id_local], TOURNAMENT ) ) {
355 sprintf( hint_levelset, "Play *ALL* available levels in a random order." );
356 hint_set_contents( item_levelset->hint, hint_levelset );
357 hint_set( item_levelset->hint ); /* redraw the hint */
358 }
359 else if ( STRCMP( levelset_names_local[config.levelset_id_local], "LBreakout1" ) ) {
360 sprintf( hint_levelset, "The complete levelset of LBreakout1 with just minor modifications." );
361 hint_set_contents( item_levelset->hint, hint_levelset );
362 hint_set( item_levelset->hint ); /* redraw the hint */
363 }
364 else
365 if ( ( file = levelset_open( levelset_names_local[config.levelset_id_local], "rb" ) ) ) {
366 levelset_get_version( file, &version, &update );
367 levelset_get_first_author( file, author );
368 sprintf( hint_levelset, "%s v%i.%02i#Author: %s",
369 levelset_names_local[config.levelset_id_local],
370 version, update, author/*, HINT_LEVELSET_APPENDIX*/ );
371 hint_set_contents( item_levelset->hint, hint_levelset );
372 hint_set( item_levelset->hint ); /* redraw the hint */
373 fclose( file );
374 }
375
376 select_chart( levelset_names_local[config.levelset_id_local], 1 );
377 }
378 /* update hint of theme by feeding it with the ABOUT file */
379 void cb_update_theme_hint()
380 {
381 theme_get_info( theme_names[config.theme_id], hint_theme, 255 );
382 strcat( hint_theme, "##" ); strcat( hint_theme, HINT_THEME_APPENDIX );
383 hint_set_contents( item_theme->hint, hint_theme );
384 hint_set( item_theme->hint ); /* redraw the hint */
385 }
386 /* update config::motion_mod */
387 void cb_set_motion_mod()
388 {
389 config.motion_mod = 0.01 * config.i_motion_mod;
390 }
391 /* update pointer edit_set which is the name of the selected set in editor menu */
392 void cb_update_edit_set()
393 {
394 edit_set = levelset_names_home[config.levelset_id_home];
395 }
396 void cb_maxballspeed()
397 {
398 config.maxballspeed_float = (float)config.maxballspeed_int1000/ 1000;
399 }
400
401
402 /*
403 ====================================================================
404 Load/delete background and create and link all menus
405 ====================================================================
406 */
407 void manager_create()
408 {
409 int i, j;
410 Item *keys[7];
411 Item *item;
412 int filter[SDLK_LAST]; /* key filter */
413 /* constant contence of switches */
414 char *str_fps[] = { "No Limit", "100 FPS" };
415 char *str_anim[] = { "Off", "Low", "Medium", "High" };
416 char *str_diff[] = { "Kids", "Easy", "Medium", "Hard" };
417 /*
418 main:
419 new game:
420 start game
421 quick help
422 ---
423 levelset
424 difficulty
425 ---
426 active players
427 ---
428 player1
429 player2
430 player3
431 player4
432 controls
433 graphics
434 animations
435 transparency
436 shadow
437 ---
438 display
439 constant frame rate
440 audio:
441 sound
442 volume
443 advanced options:
444 convex paddle
445 ball level
446 key speed
447 editor:
448 set: (list)
449 edit
450 delete
451 yes
452 no
453 ---
454 create empty set
455 set name: (string)
456 create set
457 yes
458 no
459 ---
460 quit
461 */
462 Menu *_main = 0;
463 #ifdef _1
464 Menu *options = 0;
465 #endif
466 #ifdef AUDIO_ENABLED
467 Menu *audio = 0;
468 #endif
469 Menu *gfx = 0;
470 Menu *game = 0;
471 Menu *cont = 0;
472 Menu *adv = 0;
473 Menu *editor = 0;
474 Menu *confirm_delete = 0;
475 Menu *theme = 0;
476
477 /* load levelset names */
478 levelsets_load_names();
479 cb_update_edit_set();
480
481 /* hints will be displayed on menu background */
482 hint_set_bkgnd( mbkgnd );
483
484 /* setup filter */
485 filter_clear( filter );
486 filter_set( filter, SDLK_a, SDLK_z, 1 );
487 filter[SDLK_BACKSPACE] = 1;
488 filter[SDLK_SPACE] = 1;
489 filter[SDLK_RSHIFT] = 1;
490 filter[SDLK_LSHIFT] = 1;
491 filter[SDLK_LALT] = 1;
492 filter[SDLK_RALT] = 1;
493 filter[SDLK_LCTRL] = 1;
494 filter[SDLK_RCTRL] = 1;
495 filter[SDLK_UP] = 1;
496 filter[SDLK_DOWN] = 1;
497 filter[SDLK_LEFT] = 1;
498 filter[SDLK_RIGHT] = 1;
499 filter[SDLK_q] = 0;
500 filter[SDLK_p] = 0;
501 filter[SDLK_f] = 0;
502 filter[SDLK_s] = 0;
503 filter[SDLK_a] = 0;
504 filter[SDLK_r] = 0;
505 filter[SDLK_h] = 0;
506 filter[SDLK_d] = 0;
507
508 /* menus are added to this list for deleting later */
509 menus = list_create( LIST_AUTO_DELETE, menu_delete );
510 /* create menus */
511 _main = menu_create( "Menu", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
512 #ifdef _1
513 options = menu_create( "Options", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
514 #endif
515 gfx = menu_create( "Graphics", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
516 game = menu_create( "Local Game", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
517 cont = menu_create( "Controls", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
518 adv = menu_create( "Advanced Options", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
519 #ifdef AUDIO_ENABLED
520 audio = menu_create( "Audio", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
521 #endif
522 editor = menu_create( "Editor", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
523 confirm_delete = menu_create( "Delete Set", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
524 theme = menu_create( "Select Theme", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border, 1 );
525 /* create items */
526 /* main menu */
527 menu_add( _main, item_create_link ( "Local Game", HINT_LOCAL, game ) );
528 #ifdef NETWORK_ENABLED
529 menu_add( _main, item_create_action ( "Network Game", HINT_NETWORK, ACTION_CLIENT ) );
530 #endif
531 menu_add( _main, item_create_action ( "Quick Help", HINT_, ACTION_QUICK_HELP ) );
532 // menu_add( _main, item_create_link ( "Select Theme", HINT_THEME, theme ) );
533 menu_add( _main, item_create_separator ( "" ) );
534 #ifdef _1
535 menu_add( _main, item_create_link ( "Options", options ) );
536 #endif
537 menu_add( _main, item_create_link ( "Controls", HINT_, cont ) );
538 menu_add( _main, item_create_link ( "Graphics", HINT_, gfx ) );
539 #ifdef AUDIO_ENABLED
540 menu_add( _main, item_create_link ( "Audio", HINT_,audio ) );
541 #else
542 menu_add( _main, item_create_separator ( "Audio" ) );
543 #endif
544 menu_add( _main, item_create_link ( "Advanced Options", HINT_, adv ) );
545 menu_add( _main, item_create_separator ( "" ) );
546 menu_add( _main, item_create_link ( "Editor", HINT_, editor ) );
547 menu_add( _main, item_create_separator ( "" ) );
548 menu_add( _main, item_create_action ( "Quit", HINT_QUIT, ACTION_QUIT ) );
549 #ifdef _1
550 /* options */
551 menu_add( options, item_create_link( "Controls", HINT_, cont ) );
552 menu_add( options, item_create_link( "Graphics", HINT_, gfx ) );
553 menu_add( options, item_create_link( "Audio", HINT_, audio ) );
554 menu_add( options, item_create_separator( "Audio" ) );
555 menu_add( options, item_create_separator( "" ) );
556 menu_add( options, item_create_link( "Back", _main ) );
557 #endif
558 /* audio */
559 #ifdef AUDIO_ENABLED
560 item = item_create_switch( "Sound:", HINT_, &config.sound, "Off", "On" );
561 item->callback = cb_sound;
562 menu_add( audio, item );
563 menu_add( audio, item_create_switch( "Speech:", HINT_, &config.speech, "Off", "On" ) );
564 item = item_create_range( "Volume:", HINT_, &config.volume, 1, 8, 1 );
565 item->callback = cb_volume;
566 menu_add( audio, item );
567 menu_add( audio, item_create_separator( "" ) );
568 menu_add( audio, item_create_link( "Back", HINT_, _main ) );
569 #endif
570 /* gfx */
571 menu_add( gfx, item_create_switch_x( "Animations:", HINT_ANIM, &config.anim, str_anim, 4 ) );
572 menu_add( gfx, item_create_switch( "Bonus Info:", HINT_BONUS_INFO, &config.bonus_info, "Off", "On" ) );
573 menu_add( gfx, item_create_separator( "" ) );
574 item = item_create_switch( "Display:", HINT_DISPLAY, &config.fullscreen, "Window", "Fullscreen" );
575 item->callback = cb_fullscreen;
576 menu_add( gfx, item );
577 menu_add( gfx, item_create_switch_x( "Frame Rate:", HINT_FPS, &config.fps, str_fps, 2 ) );
578 menu_add( gfx, item_create_separator( "" ) );
579 menu_add( gfx, item_create_link( "Select Theme", HINT_THEME, theme ) );
580 menu_add( gfx, item_create_separator( "" ) );
581 menu_add( gfx, item_create_link( "Back", HINT_, _main ) );
582 /* game */
583 item_resume_0 = item_create_action( "Resume Last Game", "???", ACTION_RESUME_0 );
584 menu_add( game, item_resume_0 );
585 slot_update_hint( 0, item_resume_0->hint );
586 menu_add( game, item_create_action( "Start Original Set", HINT_START_LBR, ACTION_PLAY_LBR ) );
587 menu_add( game, item_create_action( "Start AddOn", HINT_START_CUSTOM, ACTION_PLAY_CUSTOM ) );
588 //menu_add( game, item_create_separator( "" ) );
589 item_levelset = item_create_switch_x( "AddOn:", "", &config.levelset_id_local, levelset_names_local, levelset_count_local );
590 item_levelset->callback = cb_update_levelset_hint;
591 cb_update_levelset_hint(); /* initiate first hint */
592 menu_add( game, item_levelset );
593 menu_add( game, item_create_switch_x( "Difficulty:", HINT_DIFF, &config.diff, str_diff, DIFF_COUNT ) );
594 menu_add( game, item_create_separator( "" ) );
595 menu_add( game, item_create_range( "Players:", HINT_PLAYERS, &config.player_count, 1, 4, 1 ) );
596 menu_add( game, item_create_edit( "1st:", HINT_PLAYERS, config.player_names[0], 12 ) );
597 menu_add( game, item_create_edit( "2nd:", HINT_PLAYERS, config.player_names[1], 12 ) );
598 menu_add( game, item_create_edit( "3rd:", HINT_PLAYERS, config.player_names[2], 12 ) );
599 menu_add( game, item_create_edit( "4th:", HINT_PLAYERS, config.player_names[3], 12 ) );
600 menu_add( game, item_create_separator( "" ) );
601 menu_add( game, item_create_link( "Back", HINT_, _main ) );
602 /* controls */
603 keys[0] = item_create_key( "Left:", HINT_KEYS, &config.k_left, filter );
604 keys[1] = item_create_key( "Right:", HINT_KEYS, &config.k_right, filter );
605 keys[2] = item_create_key( "Left Fire:", HINT_KEYS, &config.k_lfire, filter );
606 keys[3] = item_create_key( "Right Fire:", HINT_KEYS, &config.k_rfire, filter );
607 keys[4] = item_create_key( "Paddle Turbo:", HINT_KEYS, &config.k_turbo, filter );
608 keys[5] = item_create_key( "Ball Turbo:", HINT_KEYS, &config.k_maxballspeed, filter );
609 keys[6] = item_create_key( "Return:", HINT_KEYS, &config.k_return, filter );
610 // keys[6] = item_create_key( "Warp:", HINT_KEYS, &config.k_warp, filter );
611 for ( i = 0; i < 7; i++ )
612 menu_add( cont, keys[i] );
613 /* dynamic restriction */
614 for ( i = 0; i < 7; i++ )
615 for ( j = 0; j < 7; j++ )
616 if ( j != i )
617 value_add_other_key( keys[i]->value, keys[j]->value );
618 /* other control stuff */
619 menu_add( cont, item_create_separator( "" ) );
620 item = item_create_range( "Key Speed:", HINT_KEYSPEED, &config.i_key_speed, 100, 1000, 50 );
621 item->callback = cb_set_keyspeed;
622 menu_add( cont, item );
623 item = item_create_range( "Motion Modifier:", HINT_MOD, &config.i_motion_mod, 40, 160, 5 );
624 item->callback = cb_set_motion_mod;
625 menu_add( cont, item );
626 menu_add( cont, item_create_switch( "Invert Motion:", HINT_INVERT, &config.invert, "Off", "On" ) );
627 menu_add( cont, item_create_separator( "" ) );
628 menu_add( cont, item_create_link( "Back", HINT_, _main ) );
629 /* advanced options */
630 menu_add( adv, item_create_switch( "Convex Paddle:", HINT_CONVEX, &config.convex, "Off", "On" ) );
631 //menu_add( adv, item_create_switch( "Corner:", HINT_CORNER, &config.linear_corner, "Spherical", "Linear" ) );
632 menu_add( adv,
633 item_create_switch( "Ball Fire Angle:",
634 HINT_RANDOM_ANGLE, &config.random_angle,
635 "50", "Random" ) );
636 menu_add( adv, item_create_switch( "Balls:", HINT_BALLLEVEL, &config.ball_level, "Below Bonuses", "Above Bonuses" ) );
637 menu_add( adv, item_create_switch( "Debris:", HINT_DEBRISLEVEL, &config.debris_level, "Below Balls", "Above Balls" ) );
638 menu_add( adv, item_create_switch( "Return Balls:", HINT_RETURN, &config.return_on_click, "Auto", "By Click" ) );
639 item = item_create_switch( "Use Hints:", HINT_USEHINTS, &config.use_hints, "Off", "On" );
640 item->callback = cb_hints;
641 menu_add( adv, item );
642 menu_add( adv, item_create_range( "Warp Limit:", HINT_WARP_LIMIT, &config.rel_warp_limit, 0, 100, 10 ) );
643 menu_add( adv, item_create_edit( "Local UDP Port:", HINT_LOCAL_PORT, config.local_port, 6 ) );
644 item = item_create_range( "Acc. Ball Speed:", HINT_MAXBALLSPEED, &config.maxballspeed_int1000, 600, 900, 20 );
645 item->callback = cb_maxballspeed;
646 menu_add( adv, item );
647 menu_add( adv, item_create_separator( "" ) );
648 menu_add( adv, item_create_link( "Back", HINT_, _main ) );
649 /* editor */
650 item_set = item_create_switch_x(
651 "Set:", HINT_EDITOR_SET,
652 &config.levelset_id_home, levelset_names_home,
653 levelset_count_home );
654 item_set->callback = cb_update_edit_set;
655 menu_add( editor, item_set );
656 menu_add( editor, item_create_action( "Edit Set", HINT_EDITOR_EDIT, ACTION_EDIT ) );
657 menu_add( editor, item_create_link( "Delete Set", HINT_EDITOR_DELETE, confirm_delete ) );
658 menu_add( editor, item_create_separator( "" ) );
659 menu_add( editor, item_create_link( "Back", HINT_, _main ) );
660 /* confirm_delete set */
661 item = item_create_link( "Yes", HINT_ ,editor );
662 item->callback = cb_delete_set;
663 menu_add( confirm_delete, item );
664 menu_add( confirm_delete, item_create_link( "No", HINT_, editor ) );
665 /* theme */
666 item_theme = item_create_switch_x( "Theme:", "", &config.theme_id, theme_names, theme_count );
667 menu_add( theme, item_theme );
668 item_theme->callback = cb_update_theme_hint;
669 cb_update_theme_hint();
670 menu_add( theme, item_create_separator( "" ) );
671 item = item_create_link( "Apply", HINT_APPLY, gfx );
672 item->callback = cb_change_theme;
673 menu_add( theme, item );
674 menu_add( theme, item_create_link( "Cancel", HINT_, gfx ) );
675
676 /* adjust all menus */
677 menu_adjust( _main );
678 #ifdef _1
679 menu_adjust( options );
680 #endif
681 #ifdef AUDIO_ENABLED
682 menu_adjust( audio );
683 #endif
684 menu_adjust( gfx );
685 menu_adjust( game );
686 menu_adjust( cont );
687 menu_adjust( adv );
688 menu_adjust( editor );
689 menu_adjust( confirm_delete );
690 menu_adjust( theme );
691 /* set main menu as current */
692 menu_select( _main );
693 }
694 void manager_delete()
695 {
696 list_delete( menus );
697
698 /* free levelset names */
699 levelsets_delete_names();
700 }
701 /*
702 ====================================================================
703 Run menu until request sent
704 ====================================================================
705 */
706 int manager_run()
707 {
708 SDL_Event event;
709 int result = ACTION_NONE;
710 int ms;
711 /* draw highscores */
712 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
713 /* loop */
714 stk_timer_reset();
715 while ( result == ACTION_NONE && !stk_quit_request ) {
716 menu_hide( cur_menu );
717 hint_hide();
718 /* fullscreen if no item selected */
719 if ( SDL_PollEvent( &event ) ) {
720 if ( cur_menu->cur_item == 0 ||
721 (cur_menu->cur_item->type != ITEM_EDIT && cur_menu->cur_item->type != ITEM_KEY ) )
722 if ( event.type == SDL_KEYDOWN )
723 if ( event.key.keysym.sym == SDLK_f ) {
724 config.fullscreen = !config.fullscreen;
725 stk_display_apply_fullscreen( config.fullscreen );
726 stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
727 stk_display_update( STK_UPDATE_ALL );
728 }
729 /* check if clicked on highscore */
730 if ( event.type == SDL_MOUSEBUTTONDOWN )
731 if ( event.button.x >= cx && event.button.y >= cy )
732 if ( event.button.x < cx + cw && event.button.y < cy + ch ) {
733 #ifdef AUDIO_ENABLED
734 stk_sound_play( wav_menu_click );
735 #endif
736 /* set chart id */
737 if ( event.button.button == STK_BUTTON_LEFT ) {
738 chart_id++;
739 if ( chart_id == charts->count ) chart_id = 0;
740 }
741 else {
742 chart_id--;
743 if ( chart_id == -1 ) chart_id = charts->count - 1;
744 }
745 /* redraw */
746 stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
747 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
748 }
749 result = menu_handle_event( cur_menu, &event );
750 }
751 else
752 menu_handle_event( cur_menu, 0 ); /* update motion */
753 ms = stk_timer_get_time();
754 menu_update( cur_menu, ms );
755 hint_update( ms );
756 menu_show( cur_menu );
757 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
758 hint_show();
759 stk_display_update( STK_UPDATE_RECTS );
760 SDL_Delay( 5 );
761 }
762 return result;
763 }
764 /*
765 ====================================================================
766 Fade in/out background of menu
767 ====================================================================
768 */
769 void manager_fade( int type )
770 {
771 if ( type == STK_FADE_IN )
772 stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
773 stk_display_fade( type, STK_FADE_DEFAULT_TIME );
774 }
775 /*
776 ====================================================================
777 Update screen without menu itself as this is shown next frame.
778 ====================================================================
779 */
780 void manager_show()
781 {
782 stk_display_apply_fullscreen( config.fullscreen );
783 stk_surface_blit( mbkgnd, 0,0,-1,-1, stk_display, 0,0 );
784 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
785 stk_display_update( STK_UPDATE_ALL );
786 }
787
788 /*
789 ====================================================================
790 Update set list when creating a new file for editor.
791 ====================================================================
792 */
793 void manager_update_set_list()
794 {
795 cb_adjust_set_list(); /* hacky but shiiiit how cares? */
796 }
0 /***************************************************************************
1 manager.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MANAGER_H
18 #define __MANAGER_H
19
20 #include "lbreakout.h"
21 #include "value.h"
22 #include "item.h"
23 #include "menu.h"
24
25 /*
26 ====================================================================
27 Actions generated by menu
28 ====================================================================
29 */
30 enum {
31 ACTION_NONE = 0,
32 ACTION_QUIT,
33 ACTION_PLAY_LBR,
34 ACTION_PLAY_CUSTOM,
35 ACTION_SHOW_HIGHSCORE,
36 ACTION_EDIT,
37 ACTION_QUICK_HELP,
38 ACTION_CONNECT,
39 ACTION_CLIENT,
40 ACTION_RESUME_0
41 };
42
43 /*
44 ====================================================================
45 Load/delete background and create and link all menus
46 ====================================================================
47 */
48 void manager_create();
49 void manager_delete();
50 /*
51 ====================================================================
52 Run menu until request sent
53 ====================================================================
54 */
55 int manager_run();
56 /*
57 ====================================================================
58 Fade in/out background of menu
59 ====================================================================
60 */
61 void manager_fade( int type );
62 /*
63 ====================================================================
64 Update screen without menu itself as this is shown next frame.
65 ====================================================================
66 */
67 void manager_show();
68
69 /*
70 ====================================================================
71 Update set list when creating a new file for editor.
72 ====================================================================
73 */
74 void manager_update_set_list();
75
76 #endif
0 /***************************************************************************
1 menu.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "manager.h"
18
19 List *menus = 0; /* list of menus used to delete them later */
20 extern StkFont *mfont, *mhfont, *mcfont;
21 extern int gap_height; /* gap size between items */
22 extern Menu *cur_menu;
23 #ifdef AUDIO_ENABLED
24 extern StkSound *wav_menu_motion, *wav_menu_click;
25 #endif
26
27 /*
28 ====================================================================
29 Create menu.
30 ====================================================================
31 */
32 Menu *menu_create( char *name, int layout, int x, int y, int w, int h, int border, int add_to_list )
33 {
34 Menu *menu = calloc( 1, sizeof( Menu ) );
35 /* name */
36 if ( name )
37 menu->name = strdup( name );
38 else
39 menu->name = strdup( "none" );
40 /* layout */
41 menu->layout = layout;
42 menu->x = x + border; menu->y = y + border;
43 menu->w = w - border * 2; menu->h = h - border * 2;
44 /* items are cleared normally */
45 menu->items = list_create( LIST_AUTO_DELETE, item_delete );
46 /* add menu to list menus */
47 if ( add_to_list )
48 list_add( menus, menu );
49 /* create caption */
50 if ( name ) {
51 menu_add( menu, item_create_separator( name ) );
52 ((Item*)menu->items->head->next->item)->font = mcfont;
53 menu_add( menu, item_create_separator( "" ) );
54 }
55 /* default fonts */
56 menu->font = mfont;
57 menu->hfont = mhfont;
58 menu->cfont = mcfont;
59 /* return menu */
60 return menu;
61 }
62 /*
63 ====================================================================
64 Delete menu and all submenus starting with root menu
65 ====================================================================
66 */
67 void menu_delete( void *pmenu )
68 {
69 Menu *menu = (Menu*)pmenu;
70 if ( !menu ) return;
71 list_delete( menu->items );
72 if ( menu->name ) free( menu->name );
73 free( menu );
74 }
75 /*
76 ====================================================================
77 Add item to menu.
78 ====================================================================
79 */
80 void menu_add( Menu *menu, Item *item )
81 {
82 list_add( menu->items, item );
83 if ( item->type == ITEM_LINK && (Menu*)item->link != menu )
84 ((Menu*)item->link)->parent = menu;
85 }
86 /*
87 ====================================================================
88 Adjust position and size of all entries according to layout.
89 ====================================================================
90 */
91 void menu_adjust( Menu *menu )
92 {
93 int height, x, y;
94 Item *item;
95 if ( menu->layout == MENU_LAYOUT_CENTERED ) {
96 /* get full height of all items + gaps */
97 height = menu->items->count * menu->hfont->height +
98 ( menu->items->count - 1 ) * gap_height;
99 /* get positions of items */
100 y = menu->y + ( menu->h - height ) / 2;
101 x = menu->x;
102 /* set position */
103 list_reset( menu->items );
104 while( ( item = list_next( menu->items ) ) ) {
105 item->x = x; item->y = y;
106 item->w = menu->w; item->h = menu->hfont->height;
107 y += gap_height + menu->hfont->height;
108 item_adjust( item ); /* adjust alignment */
109 }
110 return;
111 }
112 fprintf( stderr, "menu_adjust: layout %i not supported\n", menu->layout );
113 }
114 /*
115 ====================================================================
116 Select menu: clear current item and set extern variable cur_menu
117 ====================================================================
118 */
119 void menu_select( Menu *menu )
120 {
121 if ( cur_menu ) menu_unselect_cur_item( cur_menu );
122 cur_menu = menu;
123 menu->cur_item = 0;
124 hint_set( 0 );
125 }
126 /*
127 ====================================================================
128 Show/hide all items
129 ====================================================================
130 */
131 void menu_hide( Menu *menu )
132 {
133 Item *item;
134 list_reset( menu->items );
135 while ( ( item = list_next( menu->items ) ) )
136 item_hide( item );
137 }
138 void menu_show( Menu *menu )
139 {
140 Item *item;
141 list_reset( menu->items );
142 while ( ( item = list_next( menu->items ) ) )
143 item_show( item );
144 }
145 /*
146 ====================================================================
147 modify items according to event (if any)
148 ====================================================================
149 */
150 int menu_handle_event( Menu *menu, SDL_Event *event )
151 {
152 int result = ACTION_NONE;
153 Item *item, *old_item;
154 int item_used;
155 int x, y, xoff, yoff;
156 void (*callback)(void);
157 /* if value::grab is set do only except keyup events */
158 if ( menu->cur_item && menu->cur_item->type == ITEM_KEY && menu->cur_item->value->grab ) {
159 if ( event && event->type == SDL_KEYDOWN )
160 value_set_key( menu->cur_item->value, event->key.keysym.sym );
161 return result;
162 }
163 /* if other event occured check */
164 if ( event )
165 switch ( event->type ) {
166 case SDL_KEYDOWN:
167 switch ( event->key.keysym.sym ) {
168 case SDLK_ESCAPE:
169 /* if ESCAPE is pressed go up to last menu or leave */
170 if ( strequal( "Back", ((Item*)menu->items->tail->prev->item)->name ) )
171 menu_select( ((Item*)menu->items->tail->prev->item)->link );
172 else
173 if ( strequal( "Quit", ((Item*)menu->items->tail->prev->item)->name ) )
174 result = ACTION_QUIT;
175 break;
176 case SDLK_RETURN:
177 if ( !menu->cur_item ) break;
178 item_used = 1;
179 /* callback */
180 callback = menu->cur_item->callback;
181 /* action */
182 switch ( menu->cur_item->type ) {
183 case ITEM_ACTION: result = menu->cur_item->item_id; break;
184 case ITEM_LINK: menu_select( menu->cur_item->link ); break;
185 case ITEM_KEY: value_grab( menu->cur_item->value ); break;
186 case ITEM_SWITCH:
187 case ITEM_SWITCH_X:
188 case ITEM_RANGE:
189 value_inc( menu->cur_item->value );
190 break;
191 default: item_used = 0; break;
192 }
193 if ( item_used ) {
194 #ifdef AUDIO_ENABLED
195 stk_sound_play( wav_menu_click );
196 #endif
197 if ( callback ) (callback)();
198 }
199 break;
200 case SDLK_RIGHT:
201 if ( !menu->cur_item ) break;
202 item_used = 1;
203 switch ( menu->cur_item->type ) {
204 case ITEM_SWITCH:
205 case ITEM_SWITCH_X:
206 case ITEM_RANGE:
207 value_inc( menu->cur_item->value );
208 break;
209 default: item_used = 0; break;
210 }
211 #ifdef AUDIO_ENABLED
212 if ( item_used )
213 stk_sound_play( wav_menu_click );
214 #endif
215 break;
216 case SDLK_LEFT:
217 if ( !menu->cur_item ) break;
218 item_used = 1;
219 switch ( menu->cur_item->type ) {
220 case ITEM_SWITCH:
221 case ITEM_SWITCH_X:
222 case ITEM_RANGE:
223 value_dec( menu->cur_item->value );
224 break;
225 default: item_used = 0; break;
226 }
227 #ifdef AUDIO_ENABLED
228 if ( item_used )
229 stk_sound_play( wav_menu_click );
230 #endif
231 break;
232 case SDLK_UP:
233 menu_up( menu );
234 hint_set( menu->cur_item->hint );
235 #ifdef AUDIO_ENABLED
236 stk_sound_play( wav_menu_click );
237 #endif
238 break;
239 case SDLK_DOWN:
240 menu_down( menu );
241 hint_set( menu->cur_item->hint );
242 #ifdef AUDIO_ENABLED
243 stk_sound_play( wav_menu_click );
244 #endif
245 break;
246 default:
247 /* if type is edit: edit! */
248 if ( menu->cur_item && menu->cur_item->type == ITEM_EDIT ) {
249 value_edit( menu->cur_item->value, event->key.keysym.sym, event->key.keysym.unicode );
250 #ifdef AUDIO_ENABLED
251 stk_sound_play( wav_menu_click );
252 #endif
253 break;
254 }
255 break;
256 }
257 break;
258 case SDL_MOUSEBUTTONUP:
259 if ( !menu->cur_item ) break;
260 item_used = 1;
261 callback = menu->cur_item->callback;
262 switch ( menu->cur_item->type ) {
263 case ITEM_ACTION: result = menu->cur_item->item_id; break;
264 case ITEM_LINK: menu_select( menu->cur_item->link ); break;
265 case ITEM_SWITCH:
266 case ITEM_SWITCH_X:
267 case ITEM_RANGE:
268 if ( event->button.button == STK_BUTTON_LEFT )
269 value_inc( menu->cur_item->value );
270 else
271 value_dec( menu->cur_item->value );
272 break;
273 case ITEM_KEY: value_grab( menu->cur_item->value ); break;
274 default: item_used = 0; break;
275 }
276 if ( item_used ) {
277 #ifdef AUDIO_ENABLED
278 stk_sound_play( wav_menu_click );
279 #endif
280 if ( callback ) (callback)();
281 }
282 break;
283 }
284 /* mouse motion is handled directly */
285 SDL_GetRelativeMouseState( &xoff, &yoff );
286 if ( xoff != 0 || yoff != 0 ) {
287 SDL_GetMouseState( &x, &y );
288 /* select item mouse pointer is on */
289 old_item = menu->cur_item;
290 menu_unselect_cur_item( menu );
291 list_reset( menu->items );
292 while( ( item = list_next( menu->items ) ) )
293 if ( item_focus( item, x, y ) ) {
294 menu_select_item( menu, item );
295 if ( old_item != menu->cur_item ) {
296 #ifdef AUDIO_ENABLED
297 stk_sound_play( wav_menu_motion );
298 #endif
299 }
300 break;
301 }
302 if ( menu->cur_item )
303 hint_set( menu->cur_item->hint );
304 else
305 hint_set( 0 );
306 }
307 return result;
308 }
309 /*
310 ====================================================================
311 Update alpha of items
312 ====================================================================
313 */
314 void menu_update( Menu *menu, int ms )
315 {
316 Item *item;
317 /* update alpha of all items */
318 list_reset( menu->items );
319 while ( ( item = list_next( menu->items ) ) )
320 item_update_alpha( item, ms );
321 }
322 /*
323 ====================================================================
324 Select/unselect item: update menu::cur_item und item::highlight
325 ====================================================================
326 */
327 void menu_unselect_cur_item( Menu *menu )
328 {
329 if ( menu->cur_item ) menu->cur_item->highlighted = 0;
330 menu->cur_item = 0;
331 }
332 void menu_select_item( Menu *menu, Item *item )
333 {
334 menu->cur_item = item;
335 menu->cur_item->highlighted = 1;
336 }
337 /*
338 ====================================================================
339 Go one valid menu item up or down.
340 ====================================================================
341 */
342 void menu_up( Menu *menu )
343 {
344 ListEntry *entry;
345 Item *item;
346 int valid = 0;
347 /* no selection so far: select first item after caption */
348 if ( !menu->cur_item ) {
349 menu_select_item( menu, list_get( menu->items, 2 ) );
350 return;
351 }
352 /* get entry -- MUST exist so don't check */
353 entry = list_entry( menu->items, menu->cur_item );
354 /* get next entry */
355 do {
356 entry = entry->prev;
357 if ( entry == menu->items->head )
358 entry = menu->items->tail->prev;
359 item = (Item*)entry->item;
360 if ( item->type == ITEM_SEPARATOR ) continue;
361 valid = 1;
362 } while ( !valid );
363 /* set as current */
364 menu_unselect_cur_item( menu );
365 menu_select_item( menu, entry->item );
366 }
367 void menu_down( Menu *menu )
368 {
369 ListEntry *entry;
370 Item *item;
371 int valid = 0;
372 /* no selection so far: select first item after caption */
373 if ( !menu->cur_item ) {
374 menu_select_item( menu, list_get( menu->items, 2 ) );
375 return;
376 }
377 /* get entry -- MUST exist so don't check */
378 entry = list_entry( menu->items, menu->cur_item );
379 /* get next entry */
380 do {
381 entry = entry->next;
382 if ( entry == menu->items->tail )
383 entry = menu->items->head->next;
384 item = (Item*)entry->item;
385 if ( item->type == ITEM_SEPARATOR ) continue;
386 valid = 1;
387 } while ( !valid );
388 /* set as current */
389 menu_unselect_cur_item( menu );
390 menu_select_item( menu, entry->item );
391 }
392 /*
393 ====================================================================
394 Set fonts of menu and items.
395 ====================================================================
396 */
397 void menu_set_fonts(
398 Menu *menu, StkFont *cfont, StkFont *font, StkFont *hfont )
399 {
400 Item *item;
401 menu->cfont = cfont; menu->font = font; menu->hfont = hfont;
402 list_reset( menu->items );
403 while ( ( item = list_next( menu->items ) ) ) {
404 item->font = font;
405 item->hfont = hfont;
406 }
407 }
408 /*
409 ====================================================================
410 Set background of menu and items.
411 ====================================================================
412 */
413 void menu_set_bkgnd( Menu *menu, SDL_Surface *bkgnd )
414 {
415 Item *item;
416 list_reset( menu->items );
417 while ( ( item = list_next( menu->items ) ) )
418 item->bkgnd = bkgnd;
419 }
0 /***************************************************************************
1 menu.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MENU_H
18 #define __MENU_H
19
20 /*
21 ====================================================================
22 Menu
23 ====================================================================
24 */
25 enum { MENU_LAYOUT_CENTERED = 0 };
26 typedef struct _Menu {
27 char *name; /* name of menu -- duplicated */
28 int layout;
29 int x, y, w, h; /* layout */
30 List *items; /* list of menu items */
31 Item *cur_item; /* currently highlighted item */
32 struct _Menu *parent; /* parent menu */
33 StkFont *font, *hfont, *cfont; /* if not set the default fonts are used */
34 } Menu;
35
36 /*
37 ====================================================================
38 Create menu and center it in x,y,w,h by menu_adjust() later.
39 ====================================================================
40 */
41 Menu *menu_create( char *name, int layout, int x, int y, int w, int h, int border, int add_to_list );
42 /*
43 ====================================================================
44 Delete menu and all submenus starting with root menu
45 ====================================================================
46 */
47 void menu_delete( void *menu );
48 /*
49 ====================================================================
50 Add item to menu. Add item::menu to children list if
51 ITEM_LINK.
52 ====================================================================
53 */
54 void menu_add( Menu *menu, Item *item );
55 /*
56 ====================================================================
57 Adjust position and size of all entries according to layout.
58 ====================================================================
59 */
60 void menu_adjust( Menu *menu );
61 /*
62 ====================================================================
63 Select menu: clear current item and set extern variable cur_menu
64 ====================================================================
65 */
66 void menu_select( Menu *menu );
67 /*
68 ====================================================================
69 Show/hide all items
70 ====================================================================
71 */
72 void menu_hide( Menu *menu );
73 void menu_show( Menu *menu );
74 /*
75 ====================================================================
76 modify items according to event (if any) and return action id.
77 ====================================================================
78 */
79 int menu_handle_event( Menu *menu, SDL_Event *event );
80 /*
81 ====================================================================
82 Update alpha of items
83 ====================================================================
84 */
85 void menu_update( Menu *menu, int ms );
86 /*
87 ====================================================================
88 Select/unselect item: update menu::cur_item und item::highlight
89 ====================================================================
90 */
91 void menu_unselect_cur_item( Menu *menu );
92 void menu_select_item( Menu *menu, Item *item );
93 /*
94 ====================================================================
95 Go one valid menu item up or down.
96 ====================================================================
97 */
98 void menu_up( Menu *menu );
99 void menu_down( Menu *menu );
100 /*
101 ====================================================================
102 Set fonts of menu and items.
103 ====================================================================
104 */
105 void menu_set_fonts(
106 Menu *menu, StkFont *cfont, StkFont *font, StkFont *hfont );
107 /*
108 ====================================================================
109 Set background of menu and items.
110 ====================================================================
111 */
112 void menu_set_bkgnd( Menu *menu, SDL_Surface *bkgnd );
113
114 #endif
0 /***************************************************************************
1 misc.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <time.h>
18 #include "lbreakout.h"
19 #include "../game/game.h"
20 #include "config.h"
21 #include "event.h"
22 #include "misc.h"
23
24 extern SDL_Surface *stk_display, *nuke_bkgnd, *brick_pic;
25 extern Game *local_game, *game;
26 extern Paddle *l_paddle;
27 extern StkFont *font;
28 extern SDL_Surface *offscreen;
29 extern int stk_quit_request;
30 int shadow_size = 8;
31 #ifdef AUDIO_ENABLED
32 extern StkSound *wav_click;
33 #endif
34 extern int motion_button;
35 extern Config config;
36 extern int bkgnd_count;
37 extern SDL_Surface **bkgnds;
38
39 /*
40 ====================================================================
41 Load background according to id and draw background to offscreen.
42 Return Value: loaded background surface
43 ====================================================================
44 */
45 void bkgnd_draw( SDL_Surface *bkgnd, int id )
46 {
47 SDL_Surface *pic = 0;
48 int i, j;
49
50 if ( id >= bkgnd_count || id == -1 )
51 id = rand() % bkgnd_count;
52
53 /* load background */
54 pic = bkgnds[id];
55 for ( i = 0; i < bkgnd->w; i += pic->w ) {
56 for ( j = 0; j < bkgnd->h; j += pic->h ) {
57 stk_surface_blit( pic, 0,0,-1,-1,
58 bkgnd, i, j);
59 }
60 }
61
62 /* draw to offscreen */
63 stk_surface_blit( bkgnd, 0,0,-1,-1, offscreen, 0,0 );
64 }
65 /*
66 ====================================================================
67 Confirm request. Darkens screen a bit and display text.
68 Return Value: True if successful
69 ====================================================================
70 */
71 void draw_confirm_screen( StkFont *font, SDL_Surface *buffer, char *str )
72 {
73 int i, y, x;
74 Text *text = create_text( str, 60 );
75 stk_surface_fill( stk_display, 0,0,-1,-1, 0x0 );
76 stk_surface_alpha_blit( buffer, 0,0,-1,-1, stk_display, 0,0, 128 );
77 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
78 y = (stk_display->h - text->count * font->height) / 2;
79 x = stk_display->w / 2;
80 for ( i = 0; i < text->count; i++ ) {
81 stk_font_write(font, stk_display, x, y, STK_OPAQUE, text->lines[i]);
82 y += font->height;
83 }
84 delete_text( text );
85 }
86 int confirm( StkFont *font, char *str, int type )
87 {
88 SDL_Event event;
89 int go_on = 1;
90 int ret = 0;
91 SDL_Surface *buffer =
92 stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
93 SDL_SetColorKey(buffer, 0, 0);
94
95 #ifdef AUDIO_ENABLED
96 stk_sound_play( wav_click );
97 #endif
98
99 event_clear_sdl_queue();
100
101 stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 );
102 if ( type == CONFIRM_PAUSE )
103 stk_surface_gray( stk_display, 0,0,-1,-1,0 );
104 else
105 draw_confirm_screen( font, buffer, str );
106 stk_display_update( STK_UPDATE_ALL );
107
108 while (go_on && !stk_quit_request) {
109 SDL_WaitEvent(&event);
110 /* TEST */
111 switch ( event.type ) {
112 case SDL_QUIT: stk_quit_request = 1; break;
113 case SDL_MOUSEBUTTONUP:
114 if ( type == CONFIRM_ANY_KEY ) {
115 ret = 1; go_on = 0;
116 }
117 /* else
118 if ( type == CONFIRM_YES_NO ) {
119 if ( event.button.button == LEFT_BUTTON )
120 ret = 1;
121 else
122 ret = 0;
123 go_on = 0;
124 }*/
125 break;
126 case SDL_KEYDOWN:
127 if ( type == CONFIRM_ANY_KEY ) {
128 ret = 1; go_on = 0;
129 break;
130 }
131 else
132 if ( type == CONFIRM_PAUSE ) {
133 if ( event.key.keysym.sym == SDLK_p ) {
134 ret = 1; go_on = 0;
135 break;
136 }
137 else
138 if ( event.key.keysym.sym == SDLK_f ) {
139 config.fullscreen = !config.fullscreen;
140 stk_display_apply_fullscreen( config.fullscreen );
141 draw_confirm_screen( font, buffer, str );
142 stk_display_update( STK_UPDATE_ALL );
143 }
144 }
145 else
146 switch (event.key.keysym.sym) {
147 case SDLK_y:
148 go_on = 0;
149 ret = 1;
150 break;
151 case SDLK_ESCAPE:
152 case SDLK_n:
153 go_on = 0;
154 ret = 0;
155 default:
156 break;
157 }
158 break;
159 }
160 }
161 #ifdef AUDIO_ENABLED
162 stk_sound_play( wav_click );
163 #endif
164 stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 );
165 stk_display_update( STK_UPDATE_ALL );
166 SDL_FreeSurface(buffer);
167
168 /* reset the relative position so paddle wont jump */
169 SDL_GetRelativeMouseState(0,0);
170
171 return ret;
172 }
173 #ifdef NETWORK_ENABLED
174 /*
175 ====================================================================
176 Display a info message (gray screen a bit and display text),
177 send a MSG_READY when player has clicked and wait for a remote answer
178 (timeout 10 secs). Waiting may be cancelled by pressing ESCAPE which
179 results in sending a MSG_GAME_EXITED.
180 Return Value: True if both peers clicked to continue, False if the
181 connection was cancelled for some reason.
182 ====================================================================
183 */
184 int display_info( StkFont *font, char *str, NetSocket *peer )
185 {
186 #if 0
187 char error[128];
188 Net_Msg msg;
189 SDL_Event event;
190 int ret = 0, leave = 0;
191 SDL_Surface *buffer =
192 stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
193 SDL_SetColorKey(buffer, 0, 0);
194
195 #ifdef AUDIO_ENABLED
196 stk_sound_play( wav_click );
197 #endif
198
199 event_clear_sdl_queue();
200
201 stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 );
202 draw_confirm_screen( font, buffer, str );
203 stk_display_update( STK_UPDATE_ALL );
204 stk_wait_for_input();
205 net_write_empty_msg( peer, MSG_READY );
206 draw_confirm_screen( font, buffer,
207 "Waiting for remote answer..." );
208 stk_display_update( STK_UPDATE_ALL );
209 event_clear_sdl_queue();
210 while ( !leave ) {
211 if ( SDL_PollEvent( &event ) )
212 if ( (event.type == SDL_KEYDOWN &&
213 event.key.keysym.sym == SDLK_ESCAPE) ||
214 event.type == SDL_QUIT ) {
215 net_write_empty_msg( peer, MSG_GAME_EXITED );
216 leave = 1;
217 break;
218 }
219 if ( net_read_msg( peer, &msg, 0 ) )
220 switch ( msg.type ) {
221 case MSG_READY:
222 ret = 1; leave = 1;
223 break;
224 case MSG_GAME_EXITED:
225 ret = 0; leave = 1;
226 sprintf( error, "remote player cancelled the game\n" );
227 confirm( font, error, CONFIRM_ANY_KEY );
228 break;
229 }
230 SDL_Delay( 10 );
231 }
232
233 #ifdef AUDIO_ENABLED
234 stk_sound_play( wav_click );
235 #endif
236
237 stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 );
238 stk_display_update( STK_UPDATE_ALL );
239 SDL_FreeSurface(buffer);
240
241 /* reset the relative position so paddle wont jump */
242 SDL_GetRelativeMouseState(0,0);
243
244 return ret;
245 #endif
246 return 1;
247 }
248 #endif
249 /*
250 ====================================================================
251 Create shadow surface for specified region in surface.
252 Return Value: Shadow surface
253 ====================================================================
254 */
255 SDL_Surface* create_shadow( SDL_Surface *surf, int x, int y, int w, int h )
256 {
257 SDL_Surface *shadow = 0;
258 int i, j;
259 Uint32 white = SDL_MapRGB( stk_display->format, 0xff, 0xff, 0xff );
260 Uint32 black = SDL_MapRGB( stk_display->format, 0, 0, 0 );
261 shadow = stk_surface_create( SDL_SWSURFACE, w, h );
262 SDL_SetColorKey( shadow, SDL_SRCCOLORKEY, white );
263 for ( i = 0; i < w; i++ )
264 for ( j = 0; j < h; j++ ) {
265 if ( surf->flags & SDL_SRCCOLORKEY &&
266 stk_surface_get_pixel( surf, i, j ) == surf->format->colorkey )
267 stk_surface_set_pixel( shadow, i, j, white );
268 else
269 stk_surface_set_pixel( shadow, i, j, black );
270 }
271 return shadow;
272 }
273
274
275 /*
276 ====================================================================
277 Enter a string and return True if ENTER received and False
278 if ESCAPE received.
279 ====================================================================
280 */
281 int enter_string( StkFont *font, char *caption, char *edit, int limit )
282 {
283 SDL_Event event;
284 int go_on = 1;
285 int ret = 0;
286 SDL_Surface *buffer =
287 stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
288 int length = strlen( edit );
289
290 SDL_SetColorKey(buffer, 0, 0);
291
292 stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 );
293 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
294
295 while ( go_on && !stk_quit_request ) {
296
297 stk_surface_fill( stk_display, 0,0,-1,-1, 0x0 );
298 stk_surface_alpha_blit( buffer, 0,0,-1,-1, stk_display, 0,0, 128 );
299 stk_font_write(font, stk_display, stk_display->w / 2, stk_display->h / 2, STK_OPAQUE, caption);
300 write_text_with_cursor(font, stk_display, stk_display->w / 2, stk_display->h / 2 + font->height, edit, STK_OPAQUE);
301 stk_display_update( STK_UPDATE_ALL );
302 event.type = SDL_NOEVENT;
303 SDL_PollEvent(&event);
304 /* TEST */
305 switch ( event.type ) {
306 case SDL_QUIT: stk_quit_request = 1; break;
307 case SDL_KEYDOWN:
308 switch ( event.key.keysym.sym ) {
309 case SDLK_ESCAPE:
310 ret = 0;
311 go_on = 0;
312 break;
313 case SDLK_RETURN:
314 ret = 1;
315 go_on = 0;
316 break;
317 case SDLK_BACKSPACE:
318 if ( length > 0 ) edit[--length] = 0;
319 break;
320 default:
321 if ( event.key.keysym.sym >= 32 && event.key.keysym.sym < 128 && length < limit ) {
322 edit[length++] = event.key.keysym.unicode;
323 edit[length] = 0;
324 }
325 break;
326 }
327 break;
328 }
329 }
330 stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 );
331 stk_display_update( STK_UPDATE_ALL );
332 SDL_FreeSurface(buffer);
333
334 /* reset the relative position so paddle wont jump */
335 SDL_GetRelativeMouseState(0,0);
336
337 return ret;
338 }
339
340 /*
341 ====================================================================
342 Display text blinking.
343 ====================================================================
344 */
345 void write_text_with_cursor( StkFont *fnt, SDL_Surface *dest,
346 int x, int y, char *str, int alpha)
347 {
348 static int cursor_on = 0;
349 static Uint32 last_tick = 0;
350 // create temporary space for cursor and text
351 char *text_with_cursor = calloc(strlen(str) + 2, sizeof(char));
352 if (text_with_cursor) {
353 strcpy(text_with_cursor, str);
354
355 // Time to blink cursor on/off?
356 if (SDL_GetTicks() - last_tick > 500) {
357 last_tick = SDL_GetTicks();
358 cursor_on = ! cursor_on;
359 }
360 // Tack on cursor to end of text
361 if (cursor_on) {
362 strcat(text_with_cursor, "_");
363 }
364 else {
365 strcat(text_with_cursor, " ");
366 }
367
368 stk_font_write(fnt,dest,x,y,alpha,text_with_cursor);
369
370 free(text_with_cursor);
371 }
372 }
373
374 /*
375 ====================================================================
376 Enter nuke mode and allow player to disintegrate single bricks
377 by spending 5% of his/her score.
378 ====================================================================
379 */
380 void game_nuke( void )
381 {
382 char buf[128];
383 SDL_Event event;
384 int x,y,i,j,leave = 0;
385 SDL_Surface *buffer =
386 stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
387 SDL_Surface *red_mask =
388 stk_surface_create( SDL_SWSURFACE, BRICK_WIDTH, BRICK_HEIGHT );
389 stk_surface_fill( red_mask, 0,0,-1,-1, 0xFF0000 );
390 SDL_SetAlpha( red_mask, SDL_SRCALPHA, 128 );
391 SDL_SetColorKey(buffer, 0, 0);
392
393 #ifdef AUDIO_ENABLED
394 stk_sound_play( wav_click );
395 #endif
396 SDL_SetEventFilter(0);
397 event_clear_sdl_queue();
398 /* backup screen contents */
399 stk_surface_blit( stk_display, 0,0,-1,-1, buffer, 0,0 );
400 /* display bricks darkened */
401 stk_surface_blit( nuke_bkgnd, 0,0,-1,-1,
402 stk_display, 0,0 );
403 for ( i = 1; i < MAP_WIDTH - 1; i++ )
404 for ( j = 1; j < MAP_HEIGHT - 1; j++ )
405 if ( game->bricks[i][j].id >= 0 )
406 stk_surface_alpha_blit( brick_pic,
407 game->bricks[i][j].id * BRICK_WIDTH, 0,
408 BRICK_WIDTH, BRICK_HEIGHT,
409 stk_display,
410 i*BRICK_WIDTH, j*BRICK_HEIGHT, 128 );
411 /* info */
412 font->align = STK_FONT_ALIGN_LEFT;
413 sprintf( buf, "Plane Of Inner Stability entered (Score: %i)",
414 l_paddle->player->stats.total_score + l_paddle->score );
415 stk_font_write( font, stk_display,
416 BRICK_WIDTH, (MAP_HEIGHT-1)*BRICK_HEIGHT,
417 128, buf );
418 /* show score of player */
419 stk_display_update( STK_UPDATE_ALL );
420
421 x = y = -1;
422 while (!leave && !stk_quit_request) {
423 SDL_WaitEvent(&event);
424 switch ( event.type ) {
425 case SDL_QUIT:
426 stk_quit_request = 1;
427 break;
428 case SDL_MOUSEBUTTONDOWN:
429 if ( x != -1 )
430 if ( confirm( font,
431 "Disintegrate Brick? (Costs 5% of your score.) y/n",
432 CONFIRM_YES_NO ) ) {
433 /* implant a bomb to this brick and return */
434 game_set_current( local_game );
435 brick_start_expl( x,y, local_game->paddles[0] );
436 local_game->bricks[x][y].score = 0;
437 game_set_current( game );
438 l_paddle->player->stats.total_score -= (int)(0.05 *
439 (l_paddle->score +
440 l_paddle->player->stats.total_score));
441 leave = 1;
442 }
443 break;
444 case SDL_MOUSEMOTION:
445 if ( x != -1 ) {
446 /* clear old selection */
447 stk_surface_blit( nuke_bkgnd,
448 x*BRICK_WIDTH, y*BRICK_HEIGHT,
449 BRICK_WIDTH, BRICK_HEIGHT,
450 stk_display,
451 x*BRICK_WIDTH, y*BRICK_HEIGHT );
452 stk_surface_alpha_blit( brick_pic,
453 game->bricks[x][y].id * BRICK_WIDTH, 0,
454 BRICK_WIDTH, BRICK_HEIGHT,
455 stk_display,
456 x*BRICK_WIDTH, y*BRICK_HEIGHT, 128 );
457 stk_display_store_drect();
458 x = y = -1;
459 }
460 /* make new selection if brick */
461 i = event.motion.x / BRICK_WIDTH;
462 j = event.motion.y / BRICK_HEIGHT;
463 if ( i >= 1 && i <= MAP_WIDTH -2 )
464 if ( j >= 1 && j <= MAP_HEIGHT - 2 )
465 if ( game->bricks[i][j].id >= 0 ) {
466 x = i; y = j;
467 stk_surface_blit( red_mask, 0,0,-1,-1,
468 stk_display,x*BRICK_WIDTH, y*BRICK_HEIGHT );
469 stk_display_store_drect();
470 }
471 break;
472 case SDL_KEYDOWN:
473 if ( event.key.keysym.sym == SDLK_ESCAPE )
474 leave = 1;
475 break;
476 }
477 stk_display_update( STK_UPDATE_RECTS );
478 }
479
480 stk_surface_blit( buffer, 0,0,-1,-1, stk_display, 0,0 );
481 stk_display_update( STK_UPDATE_ALL );
482 SDL_FreeSurface(red_mask);
483 SDL_FreeSurface(buffer);
484 SDL_SetEventFilter(event_filter);
485 }
486
487 /* gray screen and display a formatted text, directly update the
488 * screen */
489 void display_text( StkFont *font, char *format, ... )
490 {
491 int i, y, x;
492 Text *text;
493 char buf[512];
494 va_list args;
495
496 va_start( args, format );
497 vsnprintf( buf, 512, format, args );
498 va_end( args );
499
500 stk_surface_gray( stk_display, 0,0,-1,-1, 2 );
501 text = create_text( buf, 60 );
502 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
503 y = (stk_display->h - text->count * font->height) / 2;
504 x = stk_display->w / 2;
505 for ( i = 0; i < text->count; i++ ) {
506 stk_font_write(font, stk_display, x, y, STK_OPAQUE, text->lines[i]);
507 y += font->height;
508 }
509 delete_text( text );
510
511 stk_display_update( STK_UPDATE_ALL );
512 }
513
0 /***************************************************************************
1 misc.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MISC_H
18 #define __MISC_H
19
20 /*
21 ====================================================================
22 Target of a shot or a ball.
23 ====================================================================
24 */
25 enum { SIDE_UNDEFINED = -1, SIDE_TOP = 0, SIDE_RIGHT, SIDE_BOTTOM, SIDE_LEFT,
26 CORNER_UPPER_LEFT, CORNER_UPPER_RIGHT,
27 CORNER_LOWER_LEFT, CORNER_LOWER_RIGHT };
28 /*
29 ====================================================================
30 Load background according to id and draw background to offscreen.
31 Return Value: loaded background surface
32 ====================================================================
33 */
34 void bkgnd_draw( SDL_Surface *bkgnd, int id );
35 /*
36 ====================================================================
37 Confirm request. Darkens/gray screen a bit and display text.
38 Return Value: True if successful
39 ====================================================================
40 */
41 enum{ CONFIRM_YES_NO, CONFIRM_ANY_KEY, CONFIRM_PAUSE };
42 int confirm( StkFont *font, char *str, int type );
43 /*
44 ====================================================================
45 Display a info message (gray screen a bit and display text),
46 send a MSG_READY when player has clicked and wait for a remote answer
47 (timeout 10 secs). Waiting may be cancelled by pressing ESCAPE which
48 results in sending a MSG_GAME_EXITED.
49 Return Value: True if both peers clicked to continue, False if the
50 connection was cancelled for some reason.
51 ====================================================================
52 */
53 int display_info( StkFont *font, char *str, NetSocket *peer );
54 /*
55 ====================================================================
56 Create shadow surface for specified region in surface.
57 Return Value: Shadow surface
58 ====================================================================
59 */
60 SDL_Surface* create_shadow( SDL_Surface *surf, int x, int y, int w, int h );
61
62 /*
63 ====================================================================
64 Enter a string and return True if ENTER received and False
65 if ESCAPE received.
66 ====================================================================
67 */
68 int enter_string( StkFont *font, char *caption, char *edit, int limit );
69
70 /*
71 ====================================================================
72 Display text blinking.
73 ====================================================================
74 */
75 void write_text_with_cursor( StkFont *sfnt, SDL_Surface *dest,
76 int x, int y, char *str, int alpha);
77
78 /*
79 ====================================================================
80 Enter nuke mode and allow player to disintegrate single bricks
81 by spending 5% of his/her score.
82 ====================================================================
83 */
84 void game_nuke( void );
85
86 /* gray screen and display a formatted text, directly update the
87 * screen */
88 void display_text( StkFont *font, char *format, ... );
89
90 #endif
0 /***************************************************************************
1 paddle.c - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "paddle.h"
20 #include "../game/game.h"
21
22 /*
23 ====================================================================
24 Paddle & plasma weapon
25 ====================================================================
26 */
27 extern SDL_Surface *paddle_pic; /* paddle tiles: left, middle, right for each paddle type */
28 extern SDL_Surface *paddle_shadow;
29 extern SDL_Surface *weapon_pic;
30 extern SDL_Surface *ammo_pic;
31 extern SDL_Surface *weapon_shadow;
32 extern int paddle_cw, paddle_ch;
33 int weapon_w = 14;
34 int weapon_h = 18;
35 int weapon_fr_num = 4;
36 float weapon_fpms = 0.006;
37
38 /*
39 ====================================================================
40 Other stuff
41 ====================================================================
42 */
43 extern SDL_Surface *stk_display;
44 extern SDL_Rect stk_drect;
45 extern SDL_Surface *offscreen;
46 extern int shadow_size;
47 extern Game *game;
48 extern Config config;
49
50 /*
51 ====================================================================
52 Hide and show paddle on screen.
53 ====================================================================
54 */
55 void paddle_hide( Paddle *paddle )
56 {
57 paddle->update_rect.x = paddle->x;
58 paddle->update_rect.y = paddle->y;
59 paddle->update_rect.w = paddle->w + shadow_size;
60 paddle->update_rect.h = paddle->h + shadow_size;
61 stk_surface_blit( offscreen, paddle->x, paddle->y,
62 paddle->update_rect.w, paddle->update_rect.h,
63 stk_display, paddle->x, paddle->y );
64 /* store rect if it won't be drawn */
65 if ( paddle->invis )
66 if ( paddle->invis_delay == 0 )
67 stk_display_store_rect( &paddle->update_rect );
68 }
69 void paddle_show_shadow( Paddle *paddle )
70 {
71 int aux_w = 0, i;
72 int rem_middle_w; /* remaining points to draw in the middle */
73 if ( paddle->invis ) return;
74 if ( game->extra_active[EX_DARKNESS] ) return;
75 stk_surface_clip( stk_display, 0, 0, stk_display->w - BRICK_WIDTH, stk_display->h );
76 /* left end */
77 stk_surface_alpha_blit( paddle_shadow, paddle->pic_x_offset,0,paddle_cw, paddle_ch,
78 stk_display, paddle->x + shadow_size, paddle->y + shadow_size,
79 SHADOW_ALPHA );
80 /* middle part */
81 for ( i = paddle_cw, rem_middle_w = paddle->w - ( paddle_cw << 1 );
82 rem_middle_w > 0; i += paddle_cw, rem_middle_w -= paddle_cw ) {
83 if ( rem_middle_w > paddle_cw )
84 aux_w = paddle_cw;
85 else
86 aux_w = rem_middle_w;
87 stk_surface_alpha_blit( paddle_shadow,
88 paddle->pic_x_offset+paddle_cw,0,aux_w, paddle_ch,
89 stk_display, paddle->x + shadow_size + i, paddle->y + shadow_size,
90 SHADOW_ALPHA );
91 }
92 /* right end */
93 i = paddle->w - paddle_cw;
94 stk_surface_alpha_blit( paddle_shadow,
95 paddle->pic_x_offset+(paddle_cw<<1),0,paddle_cw, paddle_ch,
96 stk_display, paddle->x + shadow_size + i, paddle->y + shadow_size,
97 SHADOW_ALPHA );
98 stk_surface_clip( stk_display, 0, 0, 0, 0 );
99 }
100 void paddle_show( Paddle *paddle )
101 {
102 int i, aux_w = 0;
103 int rem_middle_w; /* remaining points to draw in the middle */
104 /* if invisible return or show alpha */
105 if ( paddle->invis ) {
106 if ( paddle->invis_delay != 0 )
107 paddle_alphashow( paddle, 128 );
108 return;
109 }
110 /* paddle */
111 /* left end */
112 stk_surface_blit( paddle_pic, paddle->pic_x_offset,paddle->pic_y_offset,
113 paddle_cw, paddle_ch, stk_display, paddle->x, paddle->y );
114 /* middle part */
115 for ( i = paddle_cw, rem_middle_w = paddle->w - ( paddle_cw << 1 );
116 rem_middle_w > 0; i += paddle_cw, rem_middle_w -= paddle_cw ) {
117 if ( rem_middle_w > paddle_cw )
118 aux_w = paddle_cw;
119 else
120 aux_w = rem_middle_w;
121 stk_surface_blit( paddle_pic,
122 paddle->pic_x_offset+paddle_cw,paddle->pic_y_offset,
123 aux_w, paddle_ch, stk_display, paddle->x + i, paddle->y );
124 }
125 i = paddle->w - paddle_cw;
126 /* right end */
127 stk_surface_blit( paddle_pic,
128 paddle->pic_x_offset+(paddle_cw<<1),paddle->pic_y_offset,
129 paddle_cw, paddle_ch, stk_display, paddle->x + i, paddle->y );
130 /* weapon */
131 if ( paddle->weapon_inst )
132 stk_surface_blit( weapon_pic,
133 (int)paddle->weapon_cur * weapon_w, 0, weapon_w, weapon_h,
134 stk_display, paddle->x + ((paddle->w - weapon_w)>>1), paddle->y );
135 /* update */
136 if ( paddle->x < paddle->update_rect.x ) {
137 /* movement to left */
138 paddle->update_rect.w += paddle->update_rect.x - paddle->x;
139 paddle->update_rect.x = paddle->x;
140 }
141 else {
142 /* movement to right */
143 paddle->update_rect.w += paddle->x - paddle->update_rect.x;
144 }
145 stk_display_store_rect( &paddle->update_rect );
146 }
147 void paddle_alphashow( Paddle *paddle, int a )
148 {
149 int i, aux_w;
150 int rem_middle_w;
151 /* left end */
152 stk_surface_alpha_blit( paddle_pic, paddle->pic_x_offset,paddle->pic_y_offset,
153 paddle_cw, paddle_ch, stk_display, paddle->x, paddle->y, a );
154 /* middle part */
155 for ( i = paddle_cw, rem_middle_w = paddle->w - ( paddle_cw << 1 );
156 rem_middle_w > 0; i += paddle_cw, rem_middle_w -= paddle_cw ) {
157 if ( rem_middle_w > paddle_cw )
158 aux_w = paddle_cw;
159 else
160 aux_w = rem_middle_w;
161 stk_surface_alpha_blit( paddle_pic,
162 paddle->pic_x_offset+paddle_cw,paddle->pic_y_offset,
163 aux_w, paddle_ch, stk_display, paddle->x + i, paddle->y, a );
164 }
165 i = paddle->w - paddle_cw;
166 /* right end */
167 stk_surface_alpha_blit( paddle_pic, paddle->pic_x_offset+(paddle_cw<<1),paddle->pic_y_offset,
168 paddle_cw, paddle_ch, stk_display, paddle->x + i, paddle->y, a );
169 if ( paddle->weapon_inst )
170 stk_surface_alpha_blit( weapon_pic,
171 (int)paddle->weapon_cur * weapon_w, 0, weapon_w, weapon_h,
172 stk_display, paddle->x + ((paddle->w - weapon_w)>>1), paddle->y, a );
173 /* update */
174 if ( paddle->x < paddle->update_rect.x ) {
175 /* movement to left */
176 paddle->update_rect.w += paddle->update_rect.x - paddle->x;
177 paddle->update_rect.x = paddle->x;
178 }
179 else {
180 /* movement to right */
181 paddle->update_rect.w += paddle->x - paddle->update_rect.x;
182 }
183 stk_display_store_rect( &paddle->update_rect );
184 }
185
186 /*
187 ====================================================================
188 Update paddle animation (weapon)
189 ====================================================================
190 */
191 void client_paddle_update( Paddle *paddle, int ms )
192 {
193 Ball *ball;
194 int result;
195
196 /* invisiblity */
197 if ( paddle->invis ) /* extra active */
198 if ( paddle->invis_delay > 0 && (paddle->invis_delay-=ms) <= 0 )
199 paddle->invis_delay = 0;
200
201 if ( paddle->weapon_inst ) {
202 /* animation */
203 if ( (paddle->weapon_cur+=ms*weapon_fpms) >= weapon_fr_num)
204 paddle->weapon_cur -= weapon_fr_num;
205 }
206
207 /* check for resize */
208 if ( ( result = paddle_resize( paddle, ms ) ) ) {
209 list_reset( game->balls );
210 while ( ( ball = list_next( game->balls ) ) )
211 /* adjust attached balls */
212 if ( ball->attached && ball->paddle == paddle ) {
213 if ( result < 0 ) {
214 /* shrinked */
215 if ( ball->cur.x > ( paddle->w >> 1 ) ) {
216 ball->cur.x -= 2;
217 ball->x = (int)ball->cur.x;
218 }
219 }
220 else {
221 /* expanded */
222 if ( ball->cur.x > ( paddle->w >> 1 ) ) {
223 ball->cur.x += 2;
224 ball->x = (int)ball->cur.x;
225 }
226 }
227 }
228 }
229 }
230 /*
231 ====================================================================
232 Handle events (used for local paddle): Update the coordinates
233 and the state of both fire buttons (left/right). The influence
234 of that on the weapon is handled in paddle_update() and the
235 influence on balls is handled in balls_update().
236 NEW: While the middle button is pressed, the balls will be
237 accelerated to maximum speed.
238
239 This is the local equivalent to comm_update_remote_paddle().
240 ====================================================================
241 */
242 void paddle_handle_events( Paddle *paddle, int ms )
243 {
244 Uint8 *keystate;
245 Uint8 buttonstate;
246 int xoff, yoff;
247 int diff, old_paddle_x = paddle->x;
248 int has_moved = 0;
249
250 /* a frozen paddle does nothing */
251 if ( paddle->frozen ) {
252 #ifdef PADDLE_FRICTION
253 paddle->v_x = 0;
254 #endif
255 return;
256 }
257
258 /* get SDL input states */
259 keystate = SDL_GetKeyState(0);
260 buttonstate = SDL_GetRelativeMouseState( &xoff, &yoff );
261
262 /* mouse motion */
263 if ( xoff != 0 ) {
264 if ( config.invert ) xoff = -xoff;
265 paddle->cur_x += config.motion_mod * xoff;
266 #ifdef MOUSE_WARP
267 /* reset mouse pointer as current solution does not work for
268 BeOS */
269 SDL_EventState( SDL_MOUSEMOTION, SDL_IGNORE );
270 SDL_WarpMouse(stk_display->w >> 1, stk_display->h >> 1);
271 SDL_EventState( SDL_MOUSEMOTION, SDL_ENABLE );
272 #endif
273 #ifdef PADDLE_FRICTION
274 paddle->friction_delay = 200;
275 #endif
276 has_moved = 1;
277 }
278
279 /* keys */
280 if ( keystate[config.k_left] ) {
281 paddle->cur_x -= config.key_speed * (ms << keystate[config.k_turbo]);
282 paddle->friction_delay = 0; paddle->v_x = 0.0;
283 has_moved = 1;
284 }
285 if ( keystate[config.k_right] ) {
286 paddle->cur_x += config.key_speed * (ms << keystate[config.k_turbo]);
287 paddle->friction_delay = 0; paddle->v_x = 0.0;
288 has_moved = 1;
289 }
290
291
292 /* update friction delay */
293 #ifdef PADDLE_FRICTION
294 if ( paddle->friction_delay > 0 && (paddle->friction_delay-=ms)<=0) {
295 paddle->friction_delay = 0;
296 paddle->v_x = 0.0;
297 }
298 #endif
299
300 /* check paddle when moved */
301 if ( has_moved ) {
302 /* check range and set absolute position */
303 if (paddle->cur_x < BRICK_WIDTH)
304 paddle->cur_x = BRICK_WIDTH;
305 if (paddle->cur_x + paddle->w >= stk_display->w - BRICK_WIDTH)
306 paddle->cur_x = stk_display->w - BRICK_WIDTH - paddle->w;
307 paddle->x = paddle->cur_x;
308
309 /* set paddle speed so that it will modify balls */
310 #ifdef PADDLE_FRICTION
311 diff = paddle->x - old_paddle_x;
312 paddle->v_x = (float)(diff) / ms;
313 if ( xoff != 0 ) {
314 /* limit mouse speed */
315 if (paddle->v_x > 5.0) paddle->v_x = 5.0;
316 if (paddle->v_x < -5.0) paddle->v_x = -5.0;
317 paddle->v_x /= 5;
318 }
319 #endif
320
321 /* visible for some time */
322 paddle->invis_delay = PADDLE_INVIS_DELAY;
323 }
324
325 /* update the fire flags (left/right) */
326 if ( buttonstate & SDL_BUTTON(1) || keystate[config.k_lfire] )
327 paddle->fire_left = 1;
328 else
329 paddle->fire_left = 0;
330 if ( buttonstate & SDL_BUTTON(3) || keystate[config.k_rfire] )
331 paddle->fire_right = 1;
332 else
333 paddle->fire_right = 0;
334
335 /* update maxspeed request - handled in ../game/balls.c::balls_update */
336 paddle->maxballspeed_request_old = paddle->maxballspeed_request;
337 if ( buttonstate & SDL_BUTTON(2) || keystate[config.k_maxballspeed] )
338 paddle->maxballspeed_request = 1;
339 else
340 paddle->maxballspeed_request = 0;
341 //printf( "%d\n", paddle->maxballspeed_request );
342
343 /* update return key */
344 if ( buttonstate & SDL_BUTTON(2) || keystate[config.k_return] )
345 paddle->ball_return_key_pressed = 1;
346 else
347 paddle->ball_return_key_pressed = 0;
348 }
349
350 /* draw ammo in network game */
351 void paddle_ammo_hide( Paddle *paddle )
352 {
353 int x;
354
355 x = (stk_display->w - paddle->ball_ammo*ammo_pic->w) / 2;
356 stk_surface_blit( offscreen, x,paddle->ball_ammo_disp_y,
357 paddle->ball_ammo*ammo_pic->w, ammo_pic->h,
358 stk_display, x,paddle->ball_ammo_disp_y );
359 stk_display_store_drect();
360 }
361 void paddle_ammo_show( Paddle *paddle )
362 {
363 int i, x;
364
365 x = (stk_display->w - paddle->ball_ammo*ammo_pic->w) / 2;
366 for ( i = 0; i < paddle->ball_ammo; i++, x += ammo_pic->w ) {
367 stk_surface_blit(
368 ammo_pic, 0,0,-1,-1,
369 stk_display, x, paddle->ball_ammo_disp_y );
370 stk_display_store_drect();
371 }
372 }
373
0 /***************************************************************************
1 paddle.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Hide and show paddle on screen.
20 ====================================================================
21 */
22 void paddle_hide( Paddle *paddle );
23 void paddle_show_shadow( Paddle *paddle );
24 void paddle_show( Paddle *paddle );
25 void paddle_alphashow( Paddle *paddle, int a );
26 /*
27 ====================================================================
28 Update paddle animation (weapon)
29 ====================================================================
30 */
31 void client_paddle_update( Paddle *paddle, int ms );
32 /*
33 ====================================================================
34 Handle events (used for local paddle)
35 ====================================================================
36 */
37 void paddle_handle_events( Paddle *paddle, int ms );
38
39 /* draw ammo in network game */
40 void paddle_ammo_hide( Paddle *paddle );
41 void paddle_ammo_show( Paddle *paddle );
42
0 /***************************************************************************
1 player.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "../game/levels.h"
19 #include "player.h"
20
21 int current_player = 0;
22 int player_count = 0;
23 Player players[MAX_PLAYERS];
24
25 /*
26 ====================================================================
27 Add this player to the list and increase the counter until
28 MAX_PLAYERS is reached.
29 Return Value: True if successful
30 ====================================================================
31 */
32 int player_add( char *name, int lives, Level *level )
33 {
34 if ( player_count == MAX_PLAYERS ) return 0;
35 memset( &players[player_count], 0, sizeof( Player ) );
36 strcpy( players[player_count].name, name );
37 players[player_count].lives = lives;
38 player_init_level( &players[player_count], level, 0 );
39 player_count++;
40 return 1;
41 }
42 /*
43 ====================================================================
44 Get first player.
45 Return Value: first player in list
46 ====================================================================
47 */
48 Player* players_get_first()
49 {
50 current_player = -1;
51 return players_get_next();
52 }
53 /*
54 ====================================================================
55 Get next player in list (cycle: return first player after
56 last player).
57 Return Value: current player
58 ====================================================================
59 */
60 Player* players_get_next()
61 {
62 if ( players_count() == 0 ) return 0;
63 do {
64 current_player++;
65 if ( current_player == player_count ) current_player = 0;
66 }
67 while ( players[current_player].lives == 0 );
68 return &players[current_player];
69 }
70 /*
71 ====================================================================
72 player_count players give id's 0,1,...,player_count-1. Select
73 the player with id 'current' as current player. The id used is
74 the absolute one, not the relative one resulting from dead players.
75 Return Value: current player
76 ====================================================================
77 */
78 Player* players_set_current( int current )
79 {
80 if ( current < 0 || current >= player_count ) return 0;
81 current_player = current;
82 return &players[current_player];
83 }
84 /*
85 ====================================================================
86 Reset player counter.
87 ====================================================================
88 */
89 void players_clear()
90 {
91 player_count = 0;
92 }
93 /*
94 ====================================================================
95 Return number of players still in game (lives > 0)
96 ====================================================================
97 */
98 int players_count()
99 {
100 int i;
101 int count = 0;
102 for ( i = 0; i < player_count; i++ )
103 if ( players[i].lives > 0 )
104 count++;
105 return count;
106 }
107
108 /* set level_id and init snapshot with the new leveldata */
109 void player_init_level( Player *player, Level *level, int id )
110 {
111 player->level_id = id;
112 player->snapshot = *level;
113 }
114
115
0 /***************************************************************************
1 player.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Add this player to the list and increase the counter until
20 MAX_PLAYERS is reached.
21 Return Value: True if successful
22 ====================================================================
23 */
24 int player_add( char *name, int lives, Level *level );
25 /*
26 ====================================================================
27 Get first player. (and set current id to 0)
28 Return Value: first player in list
29 ====================================================================
30 */
31 Player* players_get_first();
32 /*
33 ====================================================================
34 Get next player in list (cycle: return first player after
35 last player, update current id).
36 Return Value: current player
37 ====================================================================
38 */
39 Player* players_get_next();
40 /*
41 ====================================================================
42 player_count players give id's 0,1,...,player_count-1. Select
43 the player with id 'current' as current player. The id used is
44 the absolute one, not the relative one resulting from dead players.
45 Return Value: current player
46 ====================================================================
47 */
48 Player* players_set_current( int current );
49 /*
50 ====================================================================
51 Reset player counter.
52 ====================================================================
53 */
54 void players_clear();
55 /*
56 ====================================================================
57 Return number of players still in game (lives > 0)
58 ====================================================================
59 */
60 int players_count();
61
62 /* set level_id and init snapshot with the new leveldata */
63 void player_init_level( Player *player, Level *level, int id );
64
65
0 /***************************************************************************
1 shine.c - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19
20 extern SDL_Surface *stk_display;
21 extern Config config;
22 extern SDL_Surface *offscreen;
23 extern SDL_Surface *shine_pic;
24 extern Game *game;
25 float shine_change = 0.020; /* per ms */
26 int shine_frame = 6; /* maximum frame */
27 float shine_cur = 0; /* current frame */
28 int shine_x, shine_y; /* position where current shine is drawn */
29 int shine_recreate = 1;
30 Delay shine_delay; /* delay between shines */
31
32 /*
33 ====================================================================
34 Load/delete resources
35 ====================================================================
36 */
37 void shine_load()
38 {
39 delay_set( &shine_delay, 200 );
40 }
41 void shine_delete()
42 {
43 }
44 /*
45 ====================================================================
46 Recreate shine on a random but valid brick
47 ====================================================================
48 */
49 void shine_create()
50 {
51 int x_add, y_add, x, y;
52 shine_cur = 0;
53 shine_x = 0; shine_y = 0;
54
55 if ( !config.anim ) return;
56
57 x = (rand() % (BRICK_WIDTH - 2)) + 1;
58 y = (rand() % (BRICK_HEIGHT - 2)) + 1;
59 x_add = rand() % 2 == 0 ? 1 : -1;
60 y_add = rand() % 2 == 0 ? 1 : -1;
61
62 while (x > 0 && x < MAP_WIDTH - 1 && y > 0 && y < MAP_HEIGHT - 1) {
63 if (game->bricks[x][y].type != MAP_EMPTY && game->bricks[x][y].id != INVIS_BRICK_ID ) {
64 shine_x = x * BRICK_WIDTH;
65 shine_y = y * BRICK_HEIGHT;
66 break;
67 }
68 x += x_add; y += y_add;
69 }
70 /* if creation succeeded don't create any more shines */
71 if ( shine_x != 0 && shine_y != 0 ) shine_recreate = 0;
72 }
73 /*
74 ====================================================================
75 Reset (delete( shine
76 ====================================================================
77 */
78 void shine_reset()
79 {
80 shine_x = shine_y = 0;
81 shine_recreate = 1;
82 delay_reset( &shine_delay );
83 }
84 /*
85 ====================================================================
86 Show/hide current shine
87 ====================================================================
88 */
89 void shine_hide()
90 {
91 if (shine_x == 0 && shine_y == 0) return;
92 stk_surface_blit( offscreen, shine_x, shine_y,
93 BRICK_WIDTH, BRICK_HEIGHT,
94 stk_display, shine_x, shine_y );
95 stk_display_store_drect();
96 }
97 void shine_show()
98 {
99 if (shine_x == 0 && shine_y == 0) return;
100 stk_surface_blit( shine_pic, (int)shine_cur * BRICK_WIDTH, 0,
101 BRICK_WIDTH, BRICK_HEIGHT,
102 stk_display, shine_x, shine_y );
103 }
104 /*
105 ====================================================================
106 Update shine
107 ====================================================================
108 */
109 void shine_update( int ms )
110 {
111 /* recreate shine? */
112 if ( shine_recreate ) {
113 shine_x = shine_y = 0; /* if recreation is demanded delete old shine */
114 if ( delay_timed_out( &shine_delay, ms ) ) shine_create();
115 }
116 else {
117 shine_cur += shine_change * ms;
118 if (shine_cur > shine_frame) {
119 shine_recreate = 1;
120 delay_reset( &shine_delay );
121 }
122 }
123 }
0 /***************************************************************************
1 shine.h - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Load/delete resources
20 ====================================================================
21 */
22 void shine_load();
23 void shine_delete();
24 /*
25 ====================================================================
26 Recreate shine on a random but valid brick
27 ====================================================================
28 */
29 void shine_create();
30 /*
31 ====================================================================
32 Reset (delete( shine
33 ====================================================================
34 */
35 void shine_reset();
36 /*
37 ====================================================================
38 Show/hide current shine
39 ====================================================================
40 */
41 void shine_hide();
42 void shine_show();
43 /*
44 ====================================================================
45 Update shine
46 ====================================================================
47 */
48 void shine_update( int ms );
0 /***************************************************************************
1 shots.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/game.h"
19
20 extern SDL_Surface *shot_pic;
21 extern SDL_Surface *shot_shadow;
22 extern int shot_w, shot_h;
23 extern float shot_v_y;
24 float shot_cur_fr = 0.0;
25 int shot_fr_num = 4;
26 float shot_fpms = 0.01;
27 int shot_alpha = 128;
28 extern SDL_Surface *offscreen;
29 extern SDL_Surface *stk_display;
30 extern SDL_Rect stk_drect;
31 extern int shadow_size;
32 extern Game *game;
33
34 /*
35 ====================================================================
36 Locals
37 ====================================================================
38 */
39
40 /*
41 ====================================================================
42 Publics
43 ====================================================================
44 */
45
46 /*
47 ====================================================================
48 Hide and show shots
49 ====================================================================
50 */
51 void shots_hide()
52 {
53 ListEntry *entry = game->shots->head->next;
54 Shot *shot;
55 while ( entry != game->shots->tail ) {
56 shot = entry->item;
57 entry = entry->next;
58 stk_surface_blit( offscreen,
59 (int)shot->x,(int)shot->y,
60 shot_w + shadow_size,shot_h + shadow_size,
61 stk_display, (int)shot->x,(int)shot->y );
62 stk_display_store_rect( &shot->update_rect );
63 }
64 }
65 void shots_show()
66 {
67 ListEntry *entry = game->shots->head->next;
68 Shot *shot;
69 int x, y;
70 stk_surface_clip( stk_display, 0, 0,
71 stk_display->w - BRICK_WIDTH, stk_display->h );
72 while ( entry != game->shots->tail ) {
73 shot = entry->item;
74 entry = entry->next;
75 x = (int)shot->x; y = (int)shot->y;
76 stk_surface_alpha_blit( shot_shadow,
77 0, 0, shot_w, shot_h,
78 stk_display, x + shadow_size, y + shadow_size,
79 SHADOW_ALPHA );
80 stk_surface_alpha_blit( shot_pic, (int)shot->cur_fr * shot_w, 0,
81 shot_w, shot_h, stk_display, x, y, shot_alpha );
82
83 shot->update_rect.x = x;
84 shot->update_rect.y = y;
85 shot->update_rect.w = shot_w + shadow_size;
86 shot->update_rect.h = shot_h + shadow_size;
87 stk_display_store_rect( &shot->update_rect );
88 }
89 stk_surface_clip( stk_display, 0, 0, 0, 0 );
90 }
91 void shots_alphashow( int alpha )
92 {
93 ListEntry *entry = game->shots->head->next;
94 Shot *shot;
95 while ( entry != game->shots->tail ) {
96 shot = entry->item;
97 stk_surface_alpha_blit( shot_pic, (int)shot->cur_fr * shot_w, 0,
98 shot_w, shot_h, stk_display, (int)shot->x, (int)shot->y,
99 alpha );
100 stk_display_store_rect( &shot->update_rect );
101 entry = entry->next;
102 }
103 }
104
105 /* update animation of shots */
106 void client_shots_update( int ms )
107 {
108 Shot *shot;
109
110 shot_cur_fr += ms * shot_fpms;
111 if (shot_cur_fr >= shot_fr_num)
112 shot_cur_fr -= shot_fr_num;
113
114 list_reset( game->shots );
115 while ( (shot = list_next(game->shots)) )
116 shot->cur_fr = shot_cur_fr; /* else there would be no animation
117 as reset the list with each communicator
118 call */
119 }
120
121
0 /***************************************************************************
1 shots.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Hide and show shots
20 ====================================================================
21 */
22 void shots_hide();
23 void shots_show();
24 void shots_alphashow( int alpha );
25
26 /* update animation of shots */
27 void client_shots_update( int ms );
28
0 /***************************************************************************
1 shrapnells.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "../game/mathfuncs.h"
19 #include "config.h"
20 #include "shrapnells.h"
21
22 extern Config config;
23 extern SDL_Surface *stk_display;
24 extern SDL_Surface *offscreen;
25 List *shrapnells = 0;
26 float shr_alpha_change = 0.25;
27 float shr_start_alpha = 255;
28
29 /*
30 ====================================================================
31 Local
32 ====================================================================
33 */
34
35 /*
36 ====================================================================
37 Create a single shrapnell and add to list.
38 ====================================================================
39 */
40 void shrapnell_create( SDL_Surface *surf,
41 int sx, int sy, int sw, int sh,
42 int px, int py, float vx, float vy )
43 {
44 Shrapnell *shr = calloc( 1, sizeof( Shrapnell ) );
45 shr->pic = stk_surface_create( SDL_SWSURFACE, sw,sh );
46 //SDL_SetColorKey(shr->pic, 0, 0);
47 stk_surface_blit( surf, sx, sy,sw,sh, shr->pic, 0,0 );
48 shr->x = px;
49 shr->y = py;
50 shr->v.x = vx;
51 shr->v.y = vy;
52 shr->alpha = shr_start_alpha;
53 list_add( shrapnells, shr);
54 }
55 /*
56 ====================================================================
57 Delete a shrapnell
58 ====================================================================
59 */
60 void shrapnell_delete( void *ptr )
61 {
62 Shrapnell *shr = (Shrapnell*)ptr;
63 SDL_FreeSurface( shr->pic );
64 free( shr );
65 }
66
67 /*
68 ====================================================================
69 Public
70 ====================================================================
71 */
72
73 /*
74 ====================================================================
75 Initate or delete shrapnell list
76 ====================================================================
77 */
78 void shrapnells_init()
79 {
80 shrapnells = list_create( LIST_AUTO_DELETE, shrapnell_delete );
81 }
82 void shrapnells_delete()
83 {
84 list_delete( shrapnells );
85 }
86 /*
87 ====================================================================
88 Create shrapnells from surface (surf,sx,sy,sw,sh) and put it to
89 screen position (px,py). The vector imp is the
90 impuls and type the type of what caused the destruction.
91 ====================================================================
92 */
93 void shrapnells_create( SDL_Surface *surf,
94 int sx, int sy, int sw, int sh, int px, int py,
95 int type, Vector imp )
96 {
97 int i, j;
98 int shr_w, shr_h;
99 Vector v;
100 int dx, dy;
101 /* no animations? */
102 if ( !config.anim )
103 return;
104 /*
105 * 1 - low
106 * 2 - medium
107 * 3 - high
108 */
109 /* according to type create shrapnells */
110 switch ( type ) {
111 case SHR_BY_NORMAL_BALL:
112 vector_norm( &imp );
113 imp.x *= 0.13; imp.y *= 0.13;
114 shrapnell_create( surf, sx, sy, sw, sh, px, py,
115 imp.x, imp.y );
116 break;
117 case SHR_BY_ENERGY_BALL:
118 if ( config.anim == 1 ) {
119 /* low */
120 shrapnell_create( surf, sx, sy, sw, sh, px, py,
121 0, 0 );
122 break;
123 }
124 shr_w = sw / 2;
125 shr_h = sh / 2;
126 for ( i = 0; i < sw; i += shr_w )
127 for ( j = 0; j < sh; j += shr_h ) {
128 v.x = ( sw >> 1 ) - ( i + ( shr_w >> 1 ) );
129 v.y = ( sh >> 1 ) - ( j + ( shr_h >> 1 ) );
130 vector_norm( &v );
131 v.x *= 0.01; v.y *= 0.01;
132 shrapnell_create( surf,
133 sx + i, sy + j, shr_w, shr_h,
134 px + i, py + j, v.x, v.y );
135 }
136 break;
137 case SHR_BY_SHOT:
138 if ( config.anim == 1 ) {
139 /* low */
140 shrapnell_create( surf, sx, sy, sw, sh,
141 px, py, 0, imp.y * 0.02 );
142 break;
143 }
144 shr_w = sw / 8;
145 shr_h = sh;
146 for ( i = 0; i < ( sw >> 1 ); i += shr_w ) {
147 shrapnell_create( surf, sx + i, sy, shr_w, shr_h,
148 px + i, py, 0, imp.y * 0.002 * ( i + 1 ) );
149 shrapnell_create( surf, sx + sw - shr_w - i, sy,
150 shr_w, shr_h,
151 px + sw - shr_w - i, py, 0,
152 imp.y * 0.002 * ( i + 1 ) );
153 }
154 break;
155 case SHR_BY_EXPL:
156 shr_w = config.anim == 3 ? 5 : 10;
157 shr_h = config.anim == 3 ? 5 : 10;
158 for ( i = 0; i < sw; i += shr_w )
159 for ( j = 0; j < sh; j += shr_h ) {
160 dx = rand() % 2 == 0 ? 1 : -1;
161 dy = rand() % 2 == 0 ? 1 : -1;
162 shrapnell_create( surf,
163 sx + i, sy + j, shr_w, shr_h,
164 px + i, py + j,
165 (float)( ( rand() % 6 ) + 5) / 100 * dx,
166 (float)( ( rand() % 6 ) + 5) / 100 * dy );
167 }
168 break;
169 }
170 }
171 /*
172 ====================================================================
173 Remove all shrapnells
174 ====================================================================
175 */
176 void shrapnells_reset()
177 {
178 list_clear( shrapnells );
179 }
180 /*
181 ====================================================================
182 Show, hide all shrapnells.
183 ====================================================================
184 */
185 void shrapnells_hide()
186 {
187 ListEntry *entry = shrapnells->head->next;
188 Shrapnell *shr;
189 int x, y;
190 while ( entry != shrapnells->tail ) {
191 shr = entry->item;
192 entry = entry->next;
193 x = (int)shr->x;
194 y = (int)shr->y;
195 stk_surface_blit( offscreen, x, y,
196 shr->pic->w, shr->pic->h,
197 stk_display, x, y );
198 stk_display_store_drect();
199 }
200 }
201 void shrapnells_show()
202 {
203 ListEntry *entry = shrapnells->head->next;
204 Shrapnell *shr;
205 while ( entry != shrapnells->tail ) {
206 shr = entry->item;
207 entry = entry->next;
208 stk_surface_blit( shr->pic,
209 0,0,shr->pic->w,shr->pic->h,
210 stk_display, (int)shr->x, (int)shr->y );
211 stk_display_store_drect();
212 }
213 }
214 /*
215 ====================================================================
216 Update and remove expired shrapnells
217 ====================================================================
218 */
219 void shrapnells_update( int ms )
220 {
221 ListEntry *entry = shrapnells->head->next;
222 Shrapnell *shr;
223 while ( entry != shrapnells->tail ) {
224 shr = entry->item;
225 entry = entry->next;
226 shr->x += shr->v.x * ms;
227 shr->y += shr->v.y * ms;
228 if (shr->alpha > 0 ) {
229 shr->alpha -= shr_alpha_change * ms;
230 SDL_SetAlpha( shr->pic, SDL_SRCALPHA, (int)shr->alpha );
231 }
232 if (shr->alpha <= 0 ||
233 shr->x + shr->pic->w < 0 ||
234 shr->y + shr->pic->h < 0 ||
235 shr->x > stk_display->w ||
236 shr->y > stk_display->h )
237 list_delete_entry( shrapnells, entry->prev );
238 }
239 }
240
241 /*
242 ====================================================================
243 Brick explosion animations.
244 ====================================================================
245 */
246 #define exp_change 0.015
247 #define exp_alpha_change 0.10
248 List *exps;
249 SDL_Surface *current_exp_pic = 0; /* points either to exp_pic or exp_dark_pic */
250 extern SDL_Surface *exp_pic;
251 extern SDL_Surface *exp_dark_pic;
252 int exp_w, exp_h; /* size */
253 int exp_frame_count; /* frame count */
254 int exp_count; /* number of various explosions */
255 typedef struct {
256 float alpha;
257 float cur; /* current frame */
258 int x, y; /* position in screen */
259 int y_off; /* y offset in explosion picture */
260 } Exp;
261 void exp_load()
262 {
263 exps = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
264 exp_w = exp_h = 60; /* hardcoded as we have various explosions in one file now */
265 exp_count = exp_pic->h / exp_h;
266 exp_frame_count = exp_pic->w / exp_w;
267 exps_set_dark( 0 );
268 }
269 void exps_clear()
270 {
271 list_clear( exps );
272 }
273 void exp_delete()
274 {
275 if ( exps ) list_delete( exps ); exps = 0;
276 }
277 void exp_create( int x, int y )
278 {
279 Exp *exp = calloc( 1, sizeof( Exp ) );
280 exp->x = x - ( exp_w >> 1 );
281 exp->y = y - ( exp_h >> 1 );
282 exp->alpha = 255;
283 /* red/yellow get 4 parts, gree&yellow&bluw get 1 part each */
284 switch ( rand() % ( 4 + 4 + 1 + 1 + 1 ) ) {
285 case 0: case 1: case 2: case 3:
286 exp->y_off = 0; break;
287 case 4: case 5: case 6: case 7:
288 exp->y_off = exp_h * 4; break;
289 case 8:
290 exp->y_off = exp_h * 1; break;
291 case 9:
292 exp->y_off = exp_h * 2; break;
293 case 10:
294 exp->y_off = exp_h * 3; break;
295 }
296 list_add( exps, exp );
297 }
298 void exps_hide()
299 {
300 Exp *exp;
301 list_reset( exps );
302 while ( ( exp = list_next( exps ) ) ) {
303 stk_surface_blit( offscreen, exp->x, exp->y,
304 exp_w, exp_h, stk_display, exp->x, exp->y );
305 stk_display_store_drect();
306 }
307 }
308 void exps_show()
309 {
310 Exp *exp;
311 list_reset( exps );
312 while ( ( exp = list_next( exps ) ) ) {
313 stk_surface_alpha_blit( current_exp_pic,
314 (int)exp->cur * exp_w, exp->y_off,
315 exp_w, exp_h,
316 stk_display, exp->x, exp->y, exp->alpha );
317 }
318 }
319 void exps_update( int ms )
320 {
321 Exp *exp;
322 list_reset( exps );
323 while ( ( exp = list_next( exps ) ) ) {
324 if ( exp->alpha > 0 ) {
325 exp->alpha -= exp_alpha_change * ms;
326 if ( exp->alpha < 0 ) exp->alpha = 0;
327 }
328 exp->cur += exp_change * ms;
329 if ( exp->cur >= exp_frame_count )
330 list_delete_current( exps );
331 }
332 }
333 void exps_set_dark( int dark )
334 {
335 if ( dark )
336 current_exp_pic = exp_dark_pic;
337 else
338 current_exp_pic = exp_pic;
339 }
340
0 /***************************************************************************
1 shrapnells.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 typedef struct {
18 SDL_Surface *pic;
19 Vector v;
20 float x, y;
21 float alpha;
22 } Shrapnell;
23
24 /*
25 ====================================================================
26 Initate or delete shrapnell list
27 ====================================================================
28 */
29 void shrapnells_init();
30 void shrapnells_delete();
31
32 /*
33 ====================================================================
34 Create shrapnells from surface (surf,sx,sy,sw,sh) and put it to
35 screen position (px,py). The vector imp is the
36 impuls and type the type of what caused the destruction.
37 ====================================================================
38 */
39 void shrapnells_create( SDL_Surface *surf,
40 int sx, int sy, int sw, int sh, int px, int py,
41 int type, Vector imp );
42 /*
43 ====================================================================
44 Remove all shrapnells
45 ====================================================================
46 */
47 void shrapnells_reset();
48 /*
49 ====================================================================
50 Show, hide all shrapnells.
51 ====================================================================
52 */
53 void shrapnells_hide();
54 void shrapnells_show();
55 /*
56 ====================================================================
57 Update and remove expired shrapnells
58 ====================================================================
59 */
60 void shrapnells_update( int ms );
61
62 /*
63 ====================================================================
64 Brick explosion animations.
65 ====================================================================
66 */
67 void exp_load();
68 void exp_delete();
69 void exps_clear();
70 void exp_create( int x, int y );
71 void exps_hide();
72 void exps_show();
73 void exps_update( int ms );
74 void exps_set_dark( int dark );
0 /***************************************************************************
1 slot.c - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "slot.h"
19
20 static FILE *open_slot( int id, char *mode )
21 {
22 char fname[512];
23 snprintf( fname, 511, "%s/%s/lbr2_save_%d",
24 (getenv( "HOME" )?getenv( "HOME" ):"."),
25 CONFIG_DIR_NAME, id );
26 //printf( "accessing '%s' in mode '%s'\n", fname, mode );
27 return fopen( fname, mode );
28 }
29
30 /*
31 ====================================================================
32 Load/save a game to a slot. 'slot_load' returns 1 on success and
33 updates gs. 'slot_save' takes content of 'gs' and saves it.
34 ====================================================================
35 */
36 int slot_load( int slot_id, GameSlot *gs )
37 {
38 FILE *file = open_slot( slot_id, "r" );
39 if ( file == 0 )
40 {
41 fprintf( stderr, "ERROR: cannot open slot %d!\n", slot_id );
42 return 0;
43 }
44 fread( gs, sizeof(GameSlot), 1, file );
45 fclose( file );
46 return 1;
47 }
48
49 int slot_save( int slot_id, GameSlot *gs )
50 {
51 FILE *file = open_slot( slot_id, "w" );
52 if ( file == 0 )
53 {
54 fprintf( stderr, "ERROR: cannot open slot %d!\n", slot_id );
55 return 0;
56 }
57 fwrite( gs, sizeof(GameSlot), 1, file );
58 fclose( file );
59 return 1;
60 }
61 int slot_delete( int slot_id )
62 {
63 char fname[512];
64 snprintf( fname, 511, "%s/%s/lbr2_save_%d",
65 (getenv( "HOME" )?getenv( "HOME" ):"."),
66 CONFIG_DIR_NAME, slot_id );
67 if ( remove(fname) != 0 )
68 {
69 fprintf( stderr, "ERROR: couldn't delete file %s\n", fname );
70 return 0;
71 }
72 return 1;
73 }
74
75 /*
76 ====================================================================
77 Build info hint from game saved to slot 'slot_id'.
78 ====================================================================
79 */
80 void slot_update_hint( int slot_id, Hint *hint )
81 {
82 GameSlot gs;
83 int i;
84 char text[256], text2[256];
85 char *str_diff[] = { "Kids", "Easy", "Medium", "Hard" }; /* HACK: copied from manager.c */
86
87 if ( slot_load( slot_id, &gs ) )
88 {
89 snprintf( text, 255, "%s - %s, %d Player(s)#",
90 gs.setname, str_diff[gs.diff], gs.player_count );
91 for ( i = 0; i < gs.player_count; i++ )
92 {
93 snprintf( text2, 255, "#%s: %d (Lvl %d)",
94 gs.player_names[i], gs.player_scores[i],
95 gs.player_cur_level_id[i]+1 );
96 strcat( text, text2 );
97 }
98 }
99 else
100 strcpy( text, "Right now, there is no game you could resume." );
101 hint_set_contents( hint, text );
102 }
103
104
0 /***************************************************************************
1 slot.h - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __SLOT_H
18 #define __SLOT_H
19
20 #include "hint.h"
21
22 typedef struct {
23 char setname[32];
24 int diff;
25 int player_count; /* 0 - MAX_PLAYERS-1 */
26 char player_names[MAX_PLAYERS][32];
27 int player_cur_level_id[MAX_PLAYERS];
28 int cur_player; /* 0 - MAX_PLAYERS-1 */
29 int player_scores[MAX_PLAYERS];
30 int player_lives[MAX_PLAYERS];
31 int freakout_seed; /* seed if setname is $TOURNAMENT */
32 } GameSlot;
33
34 /*
35 ====================================================================
36 Load/save a game to a slot. 'slot_load' returns 1 on success and
37 updates gs. 'slot_save' takes content of 'gs' and saves it.
38 'slot_delete' deletes the savegame.
39 ====================================================================
40 */
41 int slot_load( int slot_id, GameSlot *gs );
42 int slot_save( int slot_id, GameSlot *gs );
43 int slot_delete( int slot_id );
44
45 /*
46 ====================================================================
47 Build info hint from game saved to slot 'slot_id'.
48 ====================================================================
49 */
50 void slot_update_hint( int slot_id, Hint *hint );
51
52 #endif
0 EXTRA_DIST = attach.wav click.wav exp.wav expand.wav extraball.wav \
1 freeze.wav gainlife.wav goldshower.wav joker.wav looselife.wav metal.wav \
2 menu_motion.wav reflect_paddle.wav reflect_brick.wav score.wav shot.wav shrink.wav speeddown.wav \
3 speedup.wav standard.wav wall.wav menu_click.wav \
4 dammit.wav damn.wav excellent.wav verygood.wav wontgiveup.wav \
5 chaos.wav darkness.wav ghost.wav timeadd.wav expl_ball.wav weak_ball.wav \
6 bonus_magnet.wav malus_magnet.wav disable.wav
7
8 install-data-local:
9 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/sounds
10 @for file in *.wav; do\
11 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/sounds/$$file;\
12 done
13
14 win32-install-script:
15 @for file in $(EXTRA_DIST); do \
16 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\sounds\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
17 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = attach.wav click.wav exp.wav expand.wav extraball.wav freeze.wav gainlife.wav goldshower.wav joker.wav looselife.wav metal.wav menu_motion.wav reflect_paddle.wav reflect_brick.wav score.wav shot.wav shrink.wav speeddown.wav speedup.wav standard.wav wall.wav menu_click.wav dammit.wav damn.wav excellent.wav verygood.wav wontgiveup.wav chaos.wav darkness.wav ghost.wav timeadd.wav expl_ball.wav weak_ball.wav bonus_magnet.wav malus_magnet.wav disable.wav
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps client/sounds/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = client/sounds
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/sounds
194 @for file in *.wav; do\
195 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/sounds/$$file;\
196 done
197
198 win32-install-script:
199 @for file in $(EXTRA_DIST); do \
200 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\sounds\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
201 done
202
203 # Tell versions [3.59,3.63) of GNU make to not export all variables.
204 # Otherwise a system limit (for SysV at least) may be exceeded.
205 .NOEXPORT:
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 /***************************************************************************
1 theme.c - description
2 -------------------
3 begin : Fri Feb 15 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <sys/types.h>
18 #include <unistd.h>
19 #include <sys/stat.h>
20 #include <dirent.h>
21
22 #ifdef HAVE_CONFIG_H
23 #include "../config.h"
24 #endif
25
26 #include "lbreakout.h"
27 #include "config.h"
28 #include "theme.h"
29
30 extern SDL_Surface *stk_display;
31 extern Config config;
32 extern int ball_w, ball_h;
33 extern int shot_w, shot_h;
34 extern int paddle_cw;
35 /* theme name list */
36 char **theme_names = 0;
37 int theme_count = 0;
38 /* current theme name */
39 char theme_name[32] = "Default";
40
41 /*
42 ====================================================================
43 Themeable gfx and sounds.
44 ====================================================================
45 */
46 SDL_Surface *exp_pic = 0;
47 SDL_Surface *exp_dark_pic = 0;
48 StkFont *font = 0;
49 StkFont *chat_font_normal = 0;
50 StkFont *chat_font_error = 0;
51 StkFont *chat_font_name = 0;
52 #ifdef AUDIO_ENABLED
53 StkSound *wav_click = 0;
54 StkSound *wav_damn = 0, *wav_dammit = 0, *wav_wontgiveup = 0, *wav_excellent = 0, *wav_verygood = 0;
55 #endif
56 SDL_Surface *brick_pic = 0;
57 SDL_Surface *brick_shadow = 0;
58 #ifdef AUDIO_ENABLED
59 StkSound *wav_boom = 0;
60 #endif
61 SDL_Surface *paddle_pic = 0;
62 SDL_Surface *paddle_shadow = 0;
63 SDL_Surface *weapon_pic = 0;
64 SDL_Surface *weapon_shadow = 0;
65 SDL_Surface *ammo_pic = 0;
66 #ifdef AUDIO_ENABLED
67 StkSound *wav_expand = 0, *wav_shrink = 0, *wav_frozen = 0;
68 #endif
69 SDL_Surface *ball_pic = 0; /* ball pictures */
70 SDL_Surface *ball_shadow = 0;
71 #ifdef AUDIO_ENABLED
72 StkSound *wav_reflect_brick = 0;
73 StkSound *wav_reflect_paddle = 0;
74 StkSound *wav_attach = 0;
75 #endif
76 SDL_Surface *shot_pic = 0;
77 SDL_Surface *shot_shadow = 0;
78 #ifdef AUDIO_ENABLED
79 StkSound *wav_shot = 0;
80 #endif
81 SDL_Surface *extra_pic = 0; /* graphics */
82 SDL_Surface *extra_shadow = 0;
83 SDL_Surface *wall_pic = 0;
84 #ifdef AUDIO_ENABLED
85 StkSound *wav_score = 0, *wav_metal = 0, *wav_std = 0, *wav_wall = 0, *wav_joker = 0;
86 StkSound *wav_goldshower = 0;
87 StkSound *wav_speedup = 0, *wav_speeddown = 0;
88 StkSound *wav_chaos = 0, *wav_darkness = 0, *wav_ghost = 0;
89 StkSound *wav_timeadd = 0, *wav_expl_ball = 0, *wav_weak_ball = 0;
90 StkSound *wav_bonus_magnet = 0, *wav_malus_magnet = 0, *wav_disable = 0;
91 #endif
92 SDL_Surface *shine_pic = 0;
93 SDL_Surface *frame_left = 0, *frame_top = 0, *frame_right = 0;
94 SDL_Surface *frame_left_shadow = 0, *frame_top_shadow = 0, *frame_right_shadow = 0;
95 SDL_Surface *frame_mp_left = 0, *frame_mp_right = 0; /* multiplayer variants */
96 SDL_Surface *frame_mp_left_shadow = 0, *frame_mp_right_shadow = 0;
97 SDL_Surface *lamps = 0; /* life lamps */
98 StkFont *display_font;
99 StkFont *display_highlight_font;
100 #ifdef AUDIO_ENABLED
101 StkSound *wav_life_up = 0, *wav_life_down = 0;
102 #endif
103 SDL_Surface **bkgnds = 0;
104 int bkgnd_count = 0;
105 SDL_Surface *nuke_bkgnd = 0; /* special background for nuke mode */
106 /* chatroom */
107 SDL_Surface *cr_up = 0, *cr_down = 0, *cr_track = 0, *cr_wallpaper = 0;
108 /* frame box */
109 SDL_Surface *fr_hori = 0, *fr_vert = 0, *fr_luc = 0, *fr_llc = 0, *fr_ruc = 0, *fr_rlc = 0;
110 /* menu manager */
111 StkFont *mfont = 0, *mhfont = 0, *mcfont = 0; /* font, highlight font, caption font */
112 SDL_Surface *mbkgnd = 0; /* menu background */
113 #ifdef AUDIO_ENABLED
114 StkSound *wav_menu_click = 0;
115 StkSound *wav_menu_motion = 0;
116 #endif
117 /* charts */
118 StkFont *cfont = 0, *chfont = 0, *ccfont = 0; /* normal, highlight and caption font */
119 /* warp icon (indicates you can now go to next level) */
120 SDL_Surface *warp_pic = 0;
121
122 /*
123 ====================================================================
124 Locals
125 ====================================================================
126 */
127
128 /*
129 ====================================================================
130 Build the theme directory from passed name. The resources are then
131 loaded from this directory and the full file name is saved to
132 theme_path.
133 ====================================================================
134 */
135 static char theme_dir[512];
136 static char theme_path[512];
137 void theme_set_dir( char *name )
138 {
139 if ( name[0] == '~' )
140 snprintf( theme_dir, sizeof(theme_dir)-1, "%s/%s/lbreakout2-themes/%s",
141 (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME, name + 1 );
142 else {
143 if ( STRCMP( SRC_DIR, "." ) ) {
144 getcwd( theme_dir, 511 );
145 strcat( theme_dir, "/gfx/" );
146 strcat( theme_dir, name );
147 }
148 else
149 snprintf( theme_dir, sizeof(theme_dir)-1, "%s/gfx/%s", SRC_DIR, name );
150 }
151 }
152
153 /*
154 ====================================================================
155 Load a picture or sound from theme directory or (if not found)
156 from original source directory.
157 ====================================================================
158 */
159 SDL_Surface* theme_load_surf( char *name )
160 {
161 struct stat filestat;
162 SDL_Surface *surf = 0;
163 sprintf( theme_path, "%s/%s", theme_dir, name );
164 if ( stat( theme_path, &filestat ) == -1 ||
165 ( surf = stk_surface_load( SDL_SWSURFACE | SDL_NONFATAL, theme_path ) ) == 0 )
166 surf = stk_surface_load( SDL_SWSURFACE, name );
167 return surf;
168 }
169 #ifdef AUDIO_ENABLED
170 StkSound* theme_load_sound( char *name )
171 {
172 struct stat filestat;
173 StkSound *sound = 0;
174 sprintf( theme_path, "%s/%s", theme_dir, name );
175 if ( stat( theme_path, &filestat ) == -1 ||
176 ( sound = stk_sound_load( -1, theme_path ) ) == 0 )
177 sound = stk_sound_load( -1, name );
178 return sound;
179 }
180 #endif
181 StkFont* theme_load_font_fixed( char *name, int start, int len, int width )
182 {
183 struct stat filestat;
184 StkFont *font = 0;
185 sprintf( theme_path, "%s/%s", theme_dir, name );
186 if ( stat( theme_path, &filestat ) == -1 ||
187 ( font = stk_font_load( SDL_SWSURFACE | SDL_NONFATAL, theme_path ) ) == 0 )
188 font = stk_font_load( SDL_SWSURFACE, name );
189 if ( font )
190 SDL_SetColorKey( font->surface, SDL_SRCCOLORKEY,
191 stk_surface_get_pixel( font->surface, 0,0 ) );
192 return font;
193 }
194
195 /*
196 ====================================================================
197 The frame is a bit complex to be done.
198 ====================================================================
199 */
200 void theme_load_frame()
201 {
202 Uint32 ckey;
203
204 /* load resources */
205 frame_left = theme_load_surf( "fr_left.png" );
206 frame_top = theme_load_surf( "fr_top.png" );
207 frame_right = theme_load_surf( "fr_right.png" );
208 /* get colorkey */
209 ckey = stk_surface_get_pixel( frame_right, frame_right->w - 1, 0 );
210 SDL_SetColorKey( frame_left, SDL_SRCCOLORKEY, ckey );
211 SDL_SetColorKey( frame_top, SDL_SRCCOLORKEY, ckey );
212 SDL_SetColorKey( frame_right, SDL_SRCCOLORKEY, ckey );
213 /* build shadows */
214 frame_left_shadow = create_shadow( frame_left, 0, 0, frame_left->w, frame_left->h );
215 frame_top_shadow = create_shadow( frame_top, 0, 0, frame_top->w, frame_top->h );
216 frame_right_shadow = create_shadow( frame_right, 0, 0, frame_right->w, frame_right->h );
217
218 /* build the columns for multiplayer */
219 frame_mp_left = theme_load_surf( "fr_mp_left.png" );
220 frame_mp_right = theme_load_surf( "fr_mp_right.png" );
221 SDL_SetColorKey( frame_mp_left, SDL_SRCCOLORKEY, ckey );
222 SDL_SetColorKey( frame_mp_right, SDL_SRCCOLORKEY, ckey );
223 frame_mp_left_shadow = create_shadow( frame_mp_left, 0, 0, frame_mp_left->w, frame_mp_left->h );
224 frame_mp_right_shadow = create_shadow( frame_mp_right, 0, 0, frame_mp_right->w, frame_mp_right->h );
225
226 /* load other resources */
227 lamps = theme_load_surf( "life.png" );
228 display_font = theme_load_font_fixed( "f_frame.png", 32, 96, 8 );
229 display_font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_CENTER_Y;
230 display_highlight_font = theme_load_font_fixed( "f_small_white.png", 32, 96, 8 );
231 display_highlight_font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_CENTER_Y;
232
233 /* waves */
234 #ifdef AUDIO_ENABLED
235 wav_life_up = theme_load_sound( "gainlife.wav" );
236 wav_life_down = theme_load_sound( "looselife.wav" );
237 #endif
238 }
239
240 /*
241 ====================================================================
242 Load backgrounds. If no background was found use the original
243 backgrounds. Else count the number of new backgrounds and use these.
244 ====================================================================
245 */
246 void theme_load_bkgnds()
247 {
248 int i;
249 struct stat filestat;
250 sprintf( theme_path, "%s/back0.png", theme_dir );
251 if ( stat( theme_path, &filestat ) == -1 ) {
252 /* use original backs */
253 bkgnds = calloc( ORIG_BACK_COUNT, sizeof( SDL_Surface* ) );
254 for ( i = 0; i < ORIG_BACK_COUNT; i++ ) {
255 sprintf( theme_path, "back%i.png", i );
256 bkgnds[i] = stk_surface_load( SDL_SWSURFACE, theme_path );
257 }
258 bkgnd_count = ORIG_BACK_COUNT;
259 }
260 else {
261 /* use new backs */
262 bkgnd_count = -1;
263 do {
264 bkgnd_count++;
265 sprintf( theme_path, "%s/back%i.png", theme_dir, bkgnd_count );
266 } while ( stat( theme_path, &filestat ) == 0 );
267 bkgnds = calloc( bkgnd_count, sizeof( SDL_Surface* ) );
268 /* load backs */
269 for ( i = 0; i < bkgnd_count; i++ ) {
270 sprintf( theme_path, "%s/back%i.png", theme_dir, i );
271 bkgnds[i] = stk_surface_load( SDL_SWSURFACE, theme_path );
272 }
273 }
274
275 for ( i = 0; i < bkgnd_count; i++ )
276 SDL_SetColorKey( bkgnds[i], 0, 0x0 );
277 }
278
279 /*
280 ====================================================================
281 Publics
282 ====================================================================
283 */
284
285 /*
286 ====================================================================
287 Get/delete names of all themes found in themes directory.
288 ====================================================================
289 */
290 void theme_get_list()
291 {
292 int i;
293 int default_theme_count = 4;
294 char *default_theme_names[] = {
295 "AbsoluteB",
296 "Oz",
297 "Moiree",
298 "Classic"
299 };
300 char name[64];
301 char dir[256];
302 DIR *hdir = 0;
303 struct dirent *entry = 0;
304 struct stat estat;
305 List *list = 0;
306 /* auxilary list */
307 list = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
308 /* install theme directory */
309 snprintf( dir, sizeof(dir) - 1, "%s/gfx", SRC_DIR );
310 if ( ( hdir = opendir( dir ) ) != 0 ) {
311 while ( ( entry = readdir( hdir ) ) ) {
312 if ( entry->d_name[0] == '.' )
313 continue;
314 /* full path */
315 sprintf( theme_path, "%s/%s", dir, entry->d_name );
316 stat( theme_path, &estat );
317 if ( S_ISDIR( estat.st_mode ) ) {
318 /* ignore entry if it is a default theme */
319 for ( i = 0; i < default_theme_count; i++ )
320 if ( STRCMP( default_theme_names[i], entry->d_name ) ) {
321 i = -1;
322 break;
323 }
324 if ( i == -1 ) continue;
325 /* store it otherwise */
326 sprintf( name, "%s", entry->d_name );
327 list_add( list, strdup( name ) );
328 }
329 }
330 closedir( hdir );
331 }
332 /* home theme directory */
333 snprintf( dir, sizeof(dir)-1, "%s/%s/lbreakout2-themes", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
334 if ( ( hdir = opendir( dir ) ) != 0 ) {
335 while ( ( entry = readdir( hdir ) ) ) {
336 if ( entry->d_name[0] == '.' )
337 continue;
338 /* full path */
339 sprintf( theme_path, "%s/%s", dir, entry->d_name );
340 stat( theme_path, &estat );
341 if ( S_ISDIR( estat.st_mode ) ) {
342 sprintf( name, "~%s", entry->d_name );
343 list_add( list, strdup( name ) );
344 }
345 }
346 closedir( hdir );
347 }
348 /* create static list. the default themes are the
349 first four entries in the order at the
350 beginning of this function. */
351 theme_count = list->count + default_theme_count;
352 theme_names = calloc( theme_count, sizeof( char* ) );
353 for ( i = 0; i < default_theme_count; i++ )
354 theme_names[i] = strdup( default_theme_names[i] );
355 for ( i = 0; i < list->count; i++ ) {
356 theme_names[i + default_theme_count] = list_get( list, i );
357 }
358 list_delete( list );
359 /* if config's theme count is not equal reset the theme_id to 0 */
360 if ( theme_count != config.theme_count ) {
361 config.theme_count = theme_count;
362 config.theme_id = 0;
363 }
364 }
365 void theme_delete_list()
366 {
367 int i;
368 if ( theme_names ) {
369 for ( i = 0; i < theme_count; i++ )
370 if ( theme_names[i] ) free( theme_names[i] );
371 free( theme_names );
372 theme_names = 0;
373 }
374 }
375
376 /*
377 ====================================================================
378 Load theme by name or delete current theme (is done by load too
379 so it might be used to change a theme as well.)
380 ====================================================================
381 */
382 void theme_load( char *name )
383 {
384 SDL_Surface *surf;
385 struct stat filestat;
386 char aux[128];
387 int i;
388 printf( "Loading theme '%s'\n", name );
389 /* clear resources */
390 theme_delete();
391 /* set theme directory */
392 theme_set_dir( name );
393 /* load resources */
394 /* explosions */
395 exp_pic = theme_load_surf( "explosions.png" );
396 exp_dark_pic = theme_load_surf( "explosions_dark.png" );
397 /* main game font */
398 font = theme_load_font_fixed( "f_game.png", 32, 96, 10 );
399 font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_CENTER_Y;
400 /* normal chat font (messages by server) */
401 chat_font_normal = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 );
402 /* error font (messages by server) */
403 chat_font_error = theme_load_font_fixed( "f_small_red.png", 32, 96, 8 );
404 /* username font (also for server) */
405 chat_font_name = theme_load_font_fixed( "f_small_white.png", 32, 96, 8 );
406 /* main game sounds */
407 #ifdef AUDIO_ENABLED
408 wav_click = theme_load_sound( "click.wav" );
409 wav_damn = theme_load_sound( "damn.wav" );
410 wav_dammit = theme_load_sound( "dammit.wav" );
411 wav_wontgiveup = theme_load_sound( "wontgiveup.wav" );
412 wav_excellent = theme_load_sound( "excellent.wav" );
413 wav_verygood = theme_load_sound( "verygood.wav" );
414 #endif
415 /* brick pics and shadow template */
416 brick_pic = theme_load_surf( "bricks.png" );
417 /* default color key is: BLACK but you may specify a special
418 key by adding a column of one pixel width at the end of the file */
419 if ( brick_pic->w & 1 )
420 SDL_SetColorKey( brick_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( brick_pic, brick_pic->w - 1, 0 ) );
421 brick_shadow = create_shadow( brick_pic, 0, 0, brick_pic->w, brick_pic->h );
422 /* brick destruction sound */
423 #ifdef AUDIO_ENABLED
424 wav_boom = theme_load_sound( "exp.wav" );
425 #endif
426 /* paddle and weapon */
427 paddle_pic = theme_load_surf( "paddle.png" );
428 SDL_SetColorKey( paddle_pic, SDL_SRCCOLORKEY,
429 stk_surface_get_pixel( paddle_pic, 0, 0 ) );
430 if ( paddle_pic->w < 6 * paddle_cw ) {
431 /* no top paddle specified so duplicate first one */
432 surf = stk_surface_create( SDL_SWSURFACE, paddle_pic->w*2, paddle_pic->h );
433 SDL_SetColorKey( surf, SDL_SRCCOLORKEY, paddle_pic->format->colorkey );
434 SDL_FillRect( surf, 0, paddle_pic->format->colorkey );
435 stk_surface_blit( paddle_pic, 0,0,-1,-1, surf, 0,0 );
436 stk_surface_blit( paddle_pic, 0,0,-1,-1, surf, paddle_pic->w,0 );
437 stk_surface_free( &paddle_pic ); paddle_pic = surf;
438 }
439 weapon_pic = theme_load_surf( "weapon.png" );
440 paddle_shadow = create_shadow( paddle_pic, 0, 0, paddle_pic->w, paddle_pic->h );
441 weapon_shadow = create_shadow( weapon_pic, 0, 0, weapon_pic->w, weapon_pic->h );
442 ammo_pic = theme_load_surf( "ammo.png" );
443 SDL_SetColorKey( ammo_pic, SDL_SRCCOLORKEY, 0x0 );
444 /* paddle sounds */
445 #ifdef AUDIO_ENABLED
446 wav_expand = theme_load_sound( "expand.wav" );
447 wav_shrink = theme_load_sound( "shrink.wav" );
448 wav_frozen = theme_load_sound( "freeze.wav" );
449 #endif
450 /* ball gfx */
451 ball_pic = theme_load_surf( "ball.png" );
452 SDL_SetColorKey( ball_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( ball_pic, 0, 0 ) );
453 ball_shadow = create_shadow( ball_pic, 0, 0, ball_w, ball_h );
454 /* ball sounds */
455 #ifdef AUDIO_ENABLED
456 wav_reflect_brick = theme_load_sound( "reflect_brick.wav" );
457 wav_reflect_paddle = theme_load_sound( "reflect_paddle.wav" );
458 wav_attach = theme_load_sound( "attach.wav" );
459 #endif
460 /* shot gfx */
461 shot_pic = theme_load_surf( "shot.png" );
462 shot_shadow = create_shadow( shot_pic, 0, 0, shot_w, shot_h );
463 #ifdef AUDIO_ENABLED
464 wav_shot = theme_load_sound( "shot.wav" );
465 #endif
466 /* extra pic */
467 extra_pic = theme_load_surf( "extras.png" );
468 SDL_SetColorKey( extra_pic, 0, 0 );
469 /* default color key is: disabled but you may specify a special
470 key by adding a column of one pixel width at the end of the file */
471 if ( extra_pic->w & 1 )
472 SDL_SetColorKey( extra_pic, SDL_SRCCOLORKEY, stk_surface_get_pixel( extra_pic, extra_pic->w - 1, 0 ) );
473 extra_shadow = create_shadow( extra_pic, 0, 0, extra_pic->w, extra_pic->h );
474 /* extra sounds */
475 #ifdef AUDIO_ENABLED
476 wav_score = theme_load_sound( "score.wav" );
477 wav_metal = theme_load_sound( "metal.wav" );
478 wav_speedup = theme_load_sound( "speedup.wav" );
479 wav_speeddown = theme_load_sound( "speeddown.wav" );
480 wav_std = theme_load_sound( "standard.wav" );
481 wav_wall = theme_load_sound( "wall.wav" );
482 wav_joker = theme_load_sound( "joker.wav" );
483 wav_goldshower = theme_load_sound( "goldshower.wav" );
484 wav_chaos = theme_load_sound( "chaos.wav" );
485 wav_darkness = theme_load_sound( "darkness.wav" );
486 wav_ghost = theme_load_sound( "ghost.wav" );
487 wav_timeadd = theme_load_sound( "timeadd.wav" );
488 wav_expl_ball = theme_load_sound( "expl_ball.wav" );
489 wav_weak_ball = theme_load_sound( "weak_ball.wav" );
490 wav_bonus_magnet = theme_load_sound( "bonus_magnet.wav" );
491 wav_malus_magnet = theme_load_sound( "malus_magnet.wav" );
492 wav_disable = theme_load_sound( "disable.wav" );
493 #endif
494 /* shine pic */
495 shine_pic = theme_load_surf( "shine.png" );
496 /* chatroom */
497 cr_up = theme_load_surf( "scroll_up.png" );
498 cr_down = theme_load_surf( "scroll_down.png" );
499 cr_track = theme_load_surf( "scroll_track.png" );
500 cr_wallpaper = theme_load_surf( "cr_back.png" );
501 SDL_SetColorKey( cr_wallpaper, 0,0 );
502 /* frame box */
503 fr_hori = theme_load_surf( "fr_hori.png" );
504 fr_vert = theme_load_surf( "fr_vert.png" );
505 fr_luc = theme_load_surf( "fr_luc.png" );
506 fr_llc = theme_load_surf( "fr_llc.png" );
507 fr_ruc = theme_load_surf( "fr_ruc.png" );
508 fr_rlc = theme_load_surf( "fr_rlc.png" );
509 /* frame */
510 theme_load_frame();
511 /* wall */
512 sprintf( theme_path, "%s/floor.png", theme_dir );
513 if ( stat( theme_path, &filestat ) == -1 ) {
514 /* build default floor */
515 wall_pic = stk_surface_create(
516 SDL_SWSURFACE, stk_display->w - 2 * BRICK_WIDTH,
517 BRICK_HEIGHT );
518 /* bricks must have been loaded at this point! */
519 for ( i = 0; i < MAP_WIDTH - 2; i++ )
520 stk_surface_blit( brick_pic, 0, 0,
521 BRICK_WIDTH, BRICK_HEIGHT,
522 wall_pic, i * BRICK_WIDTH, 0 );
523 }
524 else {
525 /* load floor */
526 wall_pic = theme_load_surf( "floor.png" );
527 }
528 /* backgrounds */
529 theme_load_bkgnds();
530 /* build nuke bkgnd */
531 nuke_bkgnd = stk_surface_create( SDL_SWSURFACE,
532 stk_display->w, stk_display->h );
533 surf = stk_surface_load( SDL_SWSURFACE, "nukeback.png" );
534 stk_surface_apply_wallpaper( nuke_bkgnd, 0,0,-1,-1,
535 surf, 128 );
536 stk_surface_free( &surf );
537 stk_surface_gray( nuke_bkgnd, 0,0,-1,-1, 0 );
538 /* manager */
539 mbkgnd = theme_load_surf( "menuback.png" );
540 SDL_SetColorKey( mbkgnd, 0, 0 );
541 mfont = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 );
542 mhfont = theme_load_font_fixed( "f_white.png", 32, 96, 10 );
543 mcfont = theme_load_font_fixed( "f_yellow.png", 32, 96, 10 );
544 #ifdef AUDIO_ENABLED
545 wav_menu_click = theme_load_sound( "menu_click.wav" );
546 wav_menu_motion = theme_load_sound( "menu_motion.wav" );
547 #endif
548 /* add version to background */
549 mfont->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_BOTTOM;
550 sprintf( aux, "v%s", VERSION );
551 stk_font_write( mfont, mbkgnd, mbkgnd->w - 4, stk_display->h - 4 - mfont->height, STK_OPAQUE, aux );
552 stk_font_write( mfont, mbkgnd, mbkgnd->w - 4, stk_display->h - 4, STK_OPAQUE, "http://lgames.sf.net" );
553 /* charts */
554 /* load resources */
555 cfont = theme_load_font_fixed( "f_small_yellow.png", 32, 96, 8 );
556 chfont = theme_load_font_fixed( "f_small_white.png", 32, 96, 8 );
557 ccfont = theme_load_font_fixed( "f_yellow.png", 32, 96, 10 );
558 /* warp picture */
559 warp_pic = theme_load_surf( "warp.png" );
560 }
561 void theme_delete()
562 {
563 int i;
564 stk_surface_free( &exp_pic );
565 stk_surface_free( &exp_dark_pic );
566 stk_font_free( &font );
567 stk_font_free( &chat_font_normal );
568 stk_font_free( &chat_font_error );
569 stk_font_free( &chat_font_name );
570 #ifdef AUDIO_ENABLED
571 stk_sound_free( &wav_click );
572 stk_sound_free( &wav_damn );
573 stk_sound_free( &wav_dammit );
574 stk_sound_free( &wav_wontgiveup );
575 stk_sound_free( &wav_excellent );
576 stk_sound_free( &wav_verygood );
577 #endif
578 stk_surface_free( &brick_pic );
579 stk_surface_free( &brick_shadow );
580 #ifdef AUDIO_ENABLED
581 stk_sound_free( &wav_boom );
582 #endif
583 stk_surface_free( &paddle_pic );
584 stk_surface_free( &weapon_pic );
585 stk_surface_free( &ammo_pic );
586 stk_surface_free( &paddle_shadow );
587 stk_surface_free( &weapon_shadow );
588 #ifdef AUDIO_ENABLED
589 stk_sound_free( &wav_expand );
590 stk_sound_free( &wav_shrink );
591 stk_sound_free( &wav_frozen );
592 #endif
593 stk_surface_free( &ball_pic );
594 stk_surface_free( &ball_shadow );
595 #ifdef AUDIO_ENABLED
596 stk_sound_free( &wav_reflect_paddle );
597 stk_sound_free( &wav_reflect_brick );
598 stk_sound_free( &wav_attach );
599 #endif
600 stk_surface_free( &shot_pic );
601 stk_surface_free( &shot_shadow );
602 #ifdef AUDIO_ENABLED
603 stk_sound_free( &wav_shot );
604 #endif
605 stk_surface_free( &extra_pic );
606 stk_surface_free( &extra_shadow );
607 stk_surface_free( &wall_pic );
608 #ifdef AUDIO_ENABLED
609 stk_sound_free( &wav_score );
610 stk_sound_free( &wav_metal );
611 stk_sound_free( &wav_speedup );
612 stk_sound_free( &wav_speeddown );
613 stk_sound_free( &wav_std );
614 stk_sound_free( &wav_wall );
615 stk_sound_free( &wav_joker );
616 stk_sound_free( &wav_goldshower );
617 stk_sound_free( &wav_chaos );
618 stk_sound_free( &wav_darkness );
619 stk_sound_free( &wav_ghost );
620 stk_sound_free( &wav_timeadd );
621 stk_sound_free( &wav_expl_ball );
622 stk_sound_free( &wav_weak_ball );
623 stk_sound_free( &wav_bonus_magnet );
624 stk_sound_free( &wav_malus_magnet );
625 stk_sound_free( &wav_disable );
626 #endif
627 stk_surface_free( &shine_pic );
628 stk_surface_free( &frame_left );
629 stk_surface_free( &frame_right );
630 stk_surface_free( &frame_top );
631 stk_surface_free( &frame_left_shadow );
632 stk_surface_free( &frame_right_shadow );
633 stk_surface_free( &frame_top_shadow );
634 stk_surface_free( &lamps );
635 stk_font_free( &display_font );
636 stk_font_free( &display_highlight_font );
637 #ifdef AUDIO_ENABLED
638 stk_sound_free( &wav_life_up );
639 stk_sound_free( &wav_life_down );
640 #endif
641 if ( bkgnds ) {
642 for ( i = 0; i < bkgnd_count; i++ )
643 stk_surface_free( &bkgnds[i] );
644 free( bkgnds );
645 bkgnds = 0;
646 bkgnd_count = 0;
647 }
648 stk_surface_free( &nuke_bkgnd );
649 /* chatroom */
650 stk_surface_free( &cr_up );
651 stk_surface_free( &cr_down );
652 stk_surface_free( &cr_track );
653 stk_surface_free( &cr_wallpaper );
654 /* frame box */
655 stk_surface_free( &fr_vert );
656 stk_surface_free( &fr_hori );
657 stk_surface_free( &fr_luc );
658 stk_surface_free( &fr_llc );
659 stk_surface_free( &fr_ruc );
660 stk_surface_free( &fr_rlc );
661 /* manager */
662 stk_surface_free( &mbkgnd );
663 stk_font_free( &mfont );
664 stk_font_free( &mhfont );
665 stk_font_free( &mcfont );
666 #ifdef AUDIO_ENABLED
667 stk_sound_free( &wav_menu_click );
668 stk_sound_free( &wav_menu_motion );
669 #endif
670 /* charts */
671 stk_font_free( &cfont );
672 stk_font_free( &chfont );
673 stk_font_free( &ccfont );
674 /* warp picture */
675 stk_surface_free( &warp_pic );
676 }
677
678 /*
679 ====================================================================
680 Check if there is a file ABOUT in the theme directory and return
681 it's contents up to limit characters.
682 If this file isn't found 'NO INFO' is set.
683 ====================================================================
684 */
685 void theme_get_info( char *theme_name, char *text, int limit )
686 {
687 FILE *file = 0;
688 int i, count;
689 theme_set_dir( theme_name );
690 sprintf( theme_path, "%s/ABOUT", theme_dir );
691 if ( ( file = fopen( theme_path, "rb" ) ) ) {
692 count = fread( text, 1, limit, file );
693 fclose( file );
694 text[(count>=0)?count:0] = 0;
695 for ( i = 0; i < strlen( text ); i++ )
696 if ( text[i] == 10 )
697 text[i] = '#';
698 /* remove empty lines */
699 for ( i = strlen( text ) - 1; i >= 0; i++ )
700 if ( text[i] == '#' && i > 0 && text[i-1] == '#' )
701 text[i] = 0;
702 else
703 break;
704 }
705 else
706 strcpy_lt( text, "NO INFO AVAILABLE", limit );
707 }
0 /***************************************************************************
1 theme.h - description
2 -------------------
3 begin : Fri Feb 15 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __THEME_H
18 #define __THEME_H
19
20 /*
21 ====================================================================
22 Get/delete names of all themes found in themes directory.
23 ====================================================================
24 */
25 void theme_get_list();
26 void theme_delete_list();
27
28 /*
29 ====================================================================
30 Load theme by name or delete current theme (is done by load too
31 so it might be used to change a theme as well.)
32 ====================================================================
33 */
34 void theme_load( char *name );
35 void theme_delete();
36
37 /*
38 ====================================================================
39 Check if there is a file ABOUT in the theme directory and return
40 it's contents up to limit characters.
41 If this file isn't found 'NO INFO' is set.
42 ====================================================================
43 */
44 void theme_get_info( char *name, char *text, int limit );
45
46 #endif
0 /***************************************************************************
1 value.c - description
2 -------------------
3 begin : Sun Sep 23 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <ctype.h>
18 #include "manager.h"
19
20 /*
21 ====================================================================
22 Locals
23 ====================================================================
24 */
25
26 /*
27 ====================================================================
28 Update val_str if not ITEM_VALUE
29 ====================================================================
30 */
31 void value_update_str( Value *value )
32 {
33 switch ( value->type ) {
34 case VALUE_RANGE_INT: sprintf( value->val_str, "%i", *value->val_int ); break;
35 case VALUE_RANGE_STR: sprintf( value->val_str, "%s", value->names[*value->val_int] ); break;
36 case VALUE_KEY:
37 if ( value->grab ) { strcpy( value->val_str, "???" ); break; }
38 switch ( *value->val_int ) {
39 case SDLK_SPACE: strcpy( value->val_str, "Space" ); break;
40 case SDLK_LEFT: strcpy( value->val_str, "Left" ); break;
41 case SDLK_RIGHT: strcpy( value->val_str, "Right" ); break;
42 case SDLK_UP: strcpy( value->val_str, "Up" ); break;
43 case SDLK_DOWN: strcpy( value->val_str, "Down" ); break;
44 case SDLK_RSHIFT: strcpy( value->val_str, "Right Shift" ); break;
45 case SDLK_LSHIFT: strcpy( value->val_str, "Left Shift" ); break;
46 case SDLK_RCTRL: strcpy( value->val_str, "Right Ctrl" ); break;
47 case SDLK_LCTRL: strcpy( value->val_str, "Left Ctrl" ); break;
48 case SDLK_RALT: strcpy( value->val_str, "Right Alt" ); break;
49 case SDLK_LALT: strcpy( value->val_str, "Left Alt" ); break;
50 case SDLK_BACKSPACE: strcpy( value->val_str, "BackSpace" ); break;
51 default:
52 if ( *value->val_int >= SDLK_a && *value->val_int <= SDLK_z )
53 sprintf( value->val_str, "'%c'", (char)toupper( *value->val_int ) );
54 else
55 sprintf( value->val_str, "%i", *value->val_int );
56 break;
57 }
58 break;
59 }
60 }
61
62 /*
63 ====================================================================
64 Create basic value
65 ====================================================================
66 */
67 Value *value_create_basic( int type, int *val_int )
68 {
69 Value *value = calloc( 1, sizeof( Value ) );
70 value->type = type;
71 value->val_int = val_int;
72 /* if not VALUE_EDIT create val_str which carries translated val_int */
73 if ( type != VALUE_EDIT ) value->val_str = calloc( 256, sizeof( char ) );
74 return value;
75 }
76
77 /*
78 ====================================================================
79 Publics
80 ====================================================================
81 */
82
83 /*
84 ====================================================================
85 Auxiliary functions to setup a key filter.
86 ====================================================================
87 */
88 void filter_clear( int *filter )
89 {
90 memset( filter, 0, sizeof( int ) * SDLK_LAST );
91 }
92 void filter_set( int *filter, int first, int last, int allowed )
93 {
94 int i;
95 for ( i = first; i <= last; i++ )
96 filter[i] = allowed;
97 }
98
99 /*
100 ====================================================================
101 Create a value. names and filter are duplicated and freed by
102 value_delete().
103 Return Value: value
104 ====================================================================
105 */
106 Value *value_create_empty()
107 {
108 return value_create_basic( VALUE_NONE, 0 );
109 }
110 Value *value_create_range_int( int *val_int, int min, int max, int step )
111 {
112 Value *value = value_create_basic( VALUE_RANGE_INT, val_int );
113 value->min = min; value->max = max; value->step = step;
114 value_update_str( value );
115 return value;
116 }
117 Value *value_create_range_str( int *val_int, char **names, int count )
118 {
119 int i;
120 Value *value = value_create_basic( VALUE_RANGE_STR, val_int );
121 value->min = 0; value->max = count - 1; value->step = 1;
122 /* duplicate names */
123 value->name_count = count;
124 value->names = calloc( count, sizeof( char* ) );
125 for ( i = 0; i < count; i++ )
126 value->names[i] = strdup( names[i] );
127 value_update_str( value );
128 return value;
129 }
130 Value *value_create_key( int *val_int, int *filter )
131 {
132 int i;
133 Value *value = value_create_basic( VALUE_KEY, val_int );
134 /* duplicate filter */
135 value->filter = calloc( SDLK_LAST, sizeof( int ) );
136 for ( i = 0; i < SDLK_LAST; i++ ) value->filter[i] = filter[i];
137 value_update_str( value );
138 /* list of other key values */
139 value->other_keys = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
140 return value;
141 }
142 Value *value_create_edit( char *val_str, int limit )
143 {
144 Value *value = value_create_basic( VALUE_EDIT, 0 );
145 value->val_str = val_str;
146 value->max = limit;
147 return value;
148 }
149 /*
150 ====================================================================
151 Delete a value
152 ====================================================================
153 */
154 void value_delete( Value *value )
155 {
156 int i;
157 if ( !value ) return;
158 if ( value->filter ) free( value->filter );
159 if ( value->names ) {
160 for ( i = 0; i < value->name_count; i++ )
161 if ( value->names[i] ) free( value->names[i] );
162 free( value->names );
163 }
164 if ( value->type != VALUE_EDIT && value->val_str ) free( value->val_str );
165 if ( value->other_keys ) list_delete( value->other_keys );
166 free( value );
167 }
168 /*
169 ====================================================================
170 Increase, decrease if range.
171 ====================================================================
172 */
173 void value_dec( Value *value )
174 {
175 *value->val_int -= value->step;
176 if ( *value->val_int < value->min ) *value->val_int = value->max;
177 value_update_str( value );
178 }
179 void value_inc( Value *value )
180 {
181 *value->val_int += value->step;
182 if ( *value->val_int > value->max ) *value->val_int = value->min;
183 value_update_str( value );
184 }
185 /*
186 ====================================================================
187 Grab input of VALUE_KEY
188 ====================================================================
189 */
190 void value_grab( Value *value )
191 {
192 if ( value->type == VALUE_KEY ) {
193 value->grab = 1;
194 value_update_str( value );
195 }
196 }
197 /*
198 ====================================================================
199 Set key value if VALUE_KEY and clear grab flag
200 ====================================================================
201 */
202 void value_set_key( Value *value, int val_int )
203 {
204 Value *other_key;
205 if ( !value->filter[val_int] ) return;
206 list_reset( value->other_keys );
207 while ( ( other_key = list_next( value->other_keys ) ) )
208 if ( *other_key->val_int == val_int ) return;
209 /* ok, set */
210 *value->val_int = val_int;
211 value->grab = 0;
212 value_update_str( value );
213 }
214 /*
215 ====================================================================
216 Edit string if VALUE_EDIT
217 ====================================================================
218 */
219 void value_edit( Value *value, int code, int unicode )
220 {
221 int length = strlen( value->val_str );
222 if ( code == SDLK_BACKSPACE && length > 0 )
223 value->val_str[length - 1] = 0;
224 else
225 if ( unicode >= 32 && unicode < 128 && length < value->max )
226 value->val_str[length] = unicode;
227 }
228 /*
229 ====================================================================
230 Add another dynamically restricted key (as VALUE_KEY) to other_key
231 list.
232 ====================================================================
233 */
234 void value_add_other_key( Value *value, Value *other_key )
235 {
236 if ( value->type != VALUE_KEY ) return;
237 list_add( value->other_keys, other_key );
238 }
239 /*
240 ====================================================================
241 Set a new name list (and update position) for VALUE_RANGE_STR.
242 ====================================================================
243 */
244 void value_set_new_names( Value *value, char **names, int count )
245 {
246 int i;
247 if ( value->type != VALUE_RANGE_STR ) return;
248 if ( value->names ) {
249 for ( i = 0; i < value->name_count; i++ )
250 if ( value->names[i] ) free( value->names[i] );
251 free( value->names );
252 }
253 value->name_count = count;
254 value->max = count - 1;
255 if ( *value->val_int > value->max ) *value->val_int = 0;
256 value->names = calloc( count, sizeof( char* ) );
257 for ( i = 0; i < count; i++ )
258 value->names[i] = strdup( names[i] );
259 value_update_str( value );
260 }
0 /***************************************************************************
1 value.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __VALUE_H
18 #define __VALUE_H
19
20 /*
21 ====================================================================
22 Value contained and handled by item.
23 ====================================================================
24 */
25 enum {
26 VALUE_NONE = 0, /* no value: separator */
27 VALUE_RANGE_INT, /* range of integers */
28 VALUE_RANGE_STR, /* range of strings: min == 0, max == count, step == 1 */
29 VALUE_KEY, /* single key value */
30 VALUE_EDIT /* editable string */
31 };
32 typedef struct _Value {
33 int type; /* type of value */
34 int min, max, step; /* integer range of value */
35 int *val_int; /* value as integer (position in range or key value) */
36 char *val_str; /* value as string (either name or converted val_int)
37 --duplicated except for VALUE_EDIT */
38 char **names; /* if set val_int is associated to the indexed name and val_str
39 is set to this name instead of the converted integer value
40 --duplicated */
41 int name_count; /* number of names */
42 int *filter; /* key filter (size: SDLK_LAST) --duplicated */
43 List *other_keys; /* list of other key values for VALUE_KEY: these are
44 restricted, too */
45 int grab; /* if type is VALUE_KEY and this is set all events except QUIT and
46 KEYUP are ignored */
47 } Value;
48
49 /*
50 ====================================================================
51 Auxiliary functions to setup a key filter.
52 ====================================================================
53 */
54 void filter_clear( int *filter );
55 void filter_set( int *filter, int first, int last, int allowed );
56
57 /*
58 ====================================================================
59 Create a value. names and filter are duplicated and freed by
60 value_delete().
61 Return Value: value
62 ====================================================================
63 */
64 Value *value_create_empty();
65 Value *value_create_range_int( int *val_int, int min, int max, int step );
66 Value *value_create_range_str( int *val_int, char **names, int count );
67 Value *value_create_key( int *val_int, int *filter );
68 Value *value_create_edit( char *val_str, int limit );
69 /*
70 ====================================================================
71 Delete a value
72 ====================================================================
73 */
74 void value_delete( Value *value );
75 /*
76 ====================================================================
77 Increase, decrease if range.
78 ====================================================================
79 */
80 void value_dec( Value *value );
81 void value_inc( Value *value );
82 /*
83 ====================================================================
84 Grab input of VALUE_KEY
85 ====================================================================
86 */
87 void value_grab( Value *value );
88 /*
89 ====================================================================
90 Set key value if VALUE_KEY and clear grab flag
91 ====================================================================
92 */
93 void value_set_key( Value *value, int val_int );
94 /*
95 ====================================================================
96 Edit string if VALUE_EDIT
97 ====================================================================
98 */
99 void value_edit( Value *value, int code, int unicode );
100 /*
101 ====================================================================
102 Add another dynamically restricted key (as VALUE_KEY) to other_key
103 list.
104 ====================================================================
105 */
106 void value_add_other_key( Value *value, Value *other_key );
107 /*
108 ====================================================================
109 Set a new name list (and update position) for VALUE_RANGE_STR.
110 ====================================================================
111 */
112 void value_set_new_names( Value *value, char **names, int count );
113
114 #endif
Binary diff not shown
0 DEFS = @DEFS@ @network_flag@ @netdebug_flag@ @sdlnet_flag@
1
2 noinst_LIBRARIES = libcommon.a
3
4 libcommon_a_SOURCES = \
5 list.c net.c tools.c parser.c
6
7 EXTRA_DIST = list.h net.h messages.h tools.h parser.h
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 DEFS = @DEFS@ @network_flag@ @netdebug_flag@ @sdlnet_flag@
92
93 noinst_LIBRARIES = libcommon.a
94
95 libcommon_a_SOURCES = list.c net.c tools.c parser.c
96
97
98 EXTRA_DIST = list.h net.h messages.h tools.h parser.h
99 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
100 CONFIG_HEADER = ../config.h
101 CONFIG_CLEAN_FILES =
102 LIBRARIES = $(noinst_LIBRARIES)
103
104 CPPFLAGS = @CPPFLAGS@
105 LDFLAGS = @LDFLAGS@
106 LIBS = @LIBS@
107 libcommon_a_LIBADD =
108 libcommon_a_OBJECTS = list.o net.o tools.o parser.o
109 AR = ar
110 CFLAGS = @CFLAGS@
111 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
112 CCLD = $(CC)
113 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
114 DIST_COMMON = Makefile.am Makefile.in
115
116
117 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
118
119 TAR = tar
120 GZIP_ENV = --best
121 SOURCES = $(libcommon_a_SOURCES)
122 OBJECTS = $(libcommon_a_OBJECTS)
123
124 all: all-redirect
125 .SUFFIXES:
126 .SUFFIXES: .S .c .o .s
127 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
128 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps common/Makefile
129
130 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
131 cd $(top_builddir) \
132 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
133
134
135 mostlyclean-noinstLIBRARIES:
136
137 clean-noinstLIBRARIES:
138 -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
139
140 distclean-noinstLIBRARIES:
141
142 maintainer-clean-noinstLIBRARIES:
143
144 .c.o:
145 $(COMPILE) -c $<
146
147 .s.o:
148 $(COMPILE) -c $<
149
150 .S.o:
151 $(COMPILE) -c $<
152
153 mostlyclean-compile:
154 -rm -f *.o core *.core
155
156 clean-compile:
157
158 distclean-compile:
159 -rm -f *.tab.c
160
161 maintainer-clean-compile:
162
163 libcommon.a: $(libcommon_a_OBJECTS) $(libcommon_a_DEPENDENCIES)
164 -rm -f libcommon.a
165 $(AR) cru libcommon.a $(libcommon_a_OBJECTS) $(libcommon_a_LIBADD)
166 $(RANLIB) libcommon.a
167
168 tags: TAGS
169
170 ID: $(HEADERS) $(SOURCES) $(LISP)
171 list='$(SOURCES) $(HEADERS)'; \
172 unique=`for i in $$list; do echo $$i; done | \
173 awk ' { files[$$0] = 1; } \
174 END { for (i in files) print i; }'`; \
175 here=`pwd` && cd $(srcdir) \
176 && mkid -f$$here/ID $$unique $(LISP)
177
178 TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
179 tags=; \
180 here=`pwd`; \
181 list='$(SOURCES) $(HEADERS)'; \
182 unique=`for i in $$list; do echo $$i; done | \
183 awk ' { files[$$0] = 1; } \
184 END { for (i in files) print i; }'`; \
185 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
186 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
187
188 mostlyclean-tags:
189
190 clean-tags:
191
192 distclean-tags:
193 -rm -f TAGS ID
194
195 maintainer-clean-tags:
196
197 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
198
199 subdir = common
200
201 distdir: $(DISTFILES)
202 @for file in $(DISTFILES); do \
203 d=$(srcdir); \
204 if test -d $$d/$$file; then \
205 cp -pr $$d/$$file $(distdir)/$$file; \
206 else \
207 test -f $(distdir)/$$file \
208 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
209 || cp -p $$d/$$file $(distdir)/$$file || :; \
210 fi; \
211 done
212 list.o: list.c list.h
213 mathfuncs.o: mathfuncs.c mathfuncs.h
214 messages.o: messages.c net.h messages.h
215 net.o: net.c net.h
216 parser.o: parser.c parser.h list.h tools.h
217 tools.o: tools.c tools.h
218
219 info-am:
220 info: info-am
221 dvi-am:
222 dvi: dvi-am
223 check-am: all-am
224 check: check-am
225 installcheck-am:
226 installcheck: installcheck-am
227 install-exec-am:
228 install-exec: install-exec-am
229
230 install-data-am:
231 install-data: install-data-am
232
233 install-am: all-am
234 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
235 install: install-am
236 uninstall-am:
237 uninstall: uninstall-am
238 all-am: Makefile $(LIBRARIES)
239 all-redirect: all-am
240 install-strip:
241 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
242 installdirs:
243
244
245 mostlyclean-generic:
246
247 clean-generic:
248
249 distclean-generic:
250 -rm -f Makefile $(CONFIG_CLEAN_FILES)
251 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
252
253 maintainer-clean-generic:
254 mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
255 mostlyclean-tags mostlyclean-generic
256
257 mostlyclean: mostlyclean-am
258
259 clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
260 mostlyclean-am
261
262 clean: clean-am
263
264 distclean-am: distclean-noinstLIBRARIES distclean-compile \
265 distclean-tags distclean-generic clean-am
266
267 distclean: distclean-am
268
269 maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
270 maintainer-clean-compile maintainer-clean-tags \
271 maintainer-clean-generic distclean-am
272 @echo "This command is intended for maintainers to use;"
273 @echo "it deletes files that may require special tools to rebuild."
274
275 maintainer-clean: maintainer-clean-am
276
277 .PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
278 clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
279 mostlyclean-compile distclean-compile clean-compile \
280 maintainer-clean-compile tags mostlyclean-tags distclean-tags \
281 clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
282 check-am installcheck-am installcheck install-exec-am install-exec \
283 install-data-am install-data install-am install uninstall-am uninstall \
284 all-redirect all-am all installdirs mostlyclean-generic \
285 distclean-generic clean-generic maintainer-clean-generic clean \
286 mostlyclean distclean maintainer-clean
287
288
289 # Tell versions [3.59,3.63) of GNU make to not export all variables.
290 # Otherwise a system limit (for SysV at least) may be exceeded.
291 .NOEXPORT:
0 /***************************************************************************
1 list.c - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18
19 #include "list.h"
20
21 /*
22 ====================================================================
23 Create a new list
24 auto_delete: Free memory of data pointer when deleting entry
25 callback: Use this callback to free memory of data including
26 the data pointer itself.
27 Return Value: List pointer
28 ====================================================================
29 */
30 List *list_create( int auto_delete, void (*callback)(void*) )
31 {
32 List *list = calloc( 1, sizeof( List ) );
33 list->head = calloc( 1, sizeof( ListEntry ) );
34 list->tail = calloc( 1, sizeof( ListEntry ) );
35 list->head->next = list->tail;
36 list->head->prev = list->head;
37 list->tail->next = list->tail;
38 list->tail->prev = list->head;
39 list->auto_delete = auto_delete;
40 list->callback = callback;
41 list->cur_entry = list->head;
42 return list;
43 }
44 /*
45 ====================================================================
46 Delete list and entries.
47 ====================================================================
48 */
49 void list_delete( List *list )
50 {
51 list_clear( list );
52 free( list->head );
53 free( list->tail );
54 free( list );
55 }
56 /*
57 ====================================================================
58 Delete all entries but keep the list. Reset current_entry to head
59 pointer.
60 ====================================================================
61 */
62 void list_clear( List *list )
63 {
64 while( !list_empty( list ) ) list_delete_pos( list, 0 );
65 }
66 /*
67 ====================================================================
68 Insert new item at position.
69 Return Value: True if successful else False.
70 ====================================================================
71 */
72 int list_insert( List *list, void *item, int pos )
73 {
74 int i;
75 ListEntry *cur = list->head;
76 ListEntry *new_entry = 0;
77
78 /* check if insertion possible */
79 if ( pos < 0 || pos > list->count ) return 0;
80 if ( item == 0 ) return 0;
81 /* get to previous entry */
82 for (i = 0; i < pos; i++) cur = cur->next;
83 /* create and anchor new entry */
84 new_entry = calloc( 1, sizeof( ListEntry ) );
85 new_entry->item = item;
86 new_entry->next = cur->next;
87 new_entry->prev = cur;
88 cur->next->prev = new_entry;
89 cur->next = new_entry;
90 list->count++;
91 return 1;
92 }
93 /*
94 ====================================================================
95 Add new item at the end of the list.
96 ====================================================================
97 */
98 int list_add( List *list, void *item )
99 {
100 ListEntry *new_entry = 0;
101 /* check if insertion possible */
102 if ( item == 0 ) return 0;
103 /* create and anchor new entry */
104 new_entry = calloc( 1, sizeof( ListEntry ) );
105 new_entry->item = item;
106 new_entry->next = list->tail;
107 new_entry->prev = list->tail->prev;
108 list->tail->prev->next = new_entry;
109 list->tail->prev = new_entry;
110 list->count++;
111 return 1;
112 }
113 /*
114 ====================================================================
115 Delete item at position. If this was the current entry update
116 current_entry to valid previous pointer.
117 Return Value: True if successful else False.
118 ====================================================================
119 */
120 int list_delete_pos( List *list, int pos )
121 {
122 int i;
123 ListEntry *cur = list->head;
124
125 /* check if deletion possbile */
126 if ( list_empty( list ) ) return 0;
127 if ( pos < 0 || pos >= list->count ) return 0;
128 /* get to correct entry */
129 for ( i = 0; i <= pos; i++ ) cur = cur->next;
130 /* modify anchors */
131 cur->next->prev = cur->prev;
132 cur->prev->next = cur->next;
133 /* decrease counter */
134 list->count--;
135 /* check current_entry */
136 if ( list->cur_entry == cur )
137 list->cur_entry = list->cur_entry->prev;
138 /* free memory */
139 if ( list->auto_delete ) {
140 if ( list->callback )
141 (list->callback)( cur->item );
142 else
143 free( cur->item );
144 }
145 free( cur );
146 return 1;
147 }
148 /*
149 ====================================================================
150 Delete item if in list. If this was the current entry update
151 current_entry to valid previous pointer.
152 Return Value: True if successful else False.
153 ====================================================================
154 */
155 int list_delete_item( List *list, void *item )
156 {
157 return list_delete_pos( list, list_check( list, item ) );
158 }
159 /*
160 ====================================================================
161 Delete entry.
162 Return Value: True if successful else False.
163 ====================================================================
164 */
165 int list_delete_entry( List *list, ListEntry *entry )
166 {
167 /* delete possible? */
168 if ( entry == 0 ) return 0;
169 if ( list->count == 0 ) return 0;
170 if ( entry == list->head || entry == list->tail ) return 0;
171 /* adjust anchor and counter */
172 entry->prev->next = entry->next;
173 entry->next->prev = entry->prev;
174 list->count--;
175 /* check current_entry */
176 if ( list->cur_entry == entry )
177 list->cur_entry = list->cur_entry->prev;
178 /* free memory */
179 if ( list->auto_delete ) {
180 if ( list->callback )
181 (list->callback)( entry->item );
182 else
183 free( entry->item );
184 }
185 free( entry );
186 return 1;
187 }
188 /*
189 ====================================================================
190 Get item from position if in list.
191 Return Value: Item pointer if found else Null pointer.
192 ====================================================================
193 */
194 void* list_get( List *list, int pos )
195 {
196 int i;
197 ListEntry *cur = list->head;
198
199 if ( pos < 0 || pos >= list->count ) return 0;
200 for ( i = 0; i <= pos; i++ ) cur = cur->next;
201 return cur->item;
202 }
203 /*
204 ====================================================================
205 Check if item's in list.
206 Return Value: Position of item else -1.
207 ====================================================================
208 */
209 int list_check( List *list, void *item )
210 {
211 int pos = -1;
212 ListEntry *cur = list->head->next;
213 while ( cur != list->tail ) {
214 pos++;
215 if ( cur->item == item ) break;
216 cur = cur->next;
217 }
218 if ( cur == list->tail ) pos = -1; /* item not found */
219 return pos;
220 }
221 /*
222 ====================================================================
223 Return first item stored in list and set current_entry to this
224 entry.
225 Return Value: Item pointer if found else Null pointer.
226 ====================================================================
227 */
228 void* list_first( List *list )
229 {
230 list->cur_entry = list->head->next;
231 return list->head->next->item;
232 }
233 /*
234 ====================================================================
235 Return last item stored in list and set current_entry to this
236 entry.
237 Return Value: Item pointer if found else Null pointer.
238 ====================================================================
239 */
240 void* list_last( List *list )
241 {
242 list->cur_entry = list->tail->prev;
243 return list->tail->prev->item;
244 }
245 /*
246 ====================================================================
247 Return item in current_entry.
248 Return Value: Item pointer if found else Null pointer.
249 ====================================================================
250 */
251 void* list_current( List *list )
252 {
253 return list->cur_entry->item;
254 }
255 /*
256 ====================================================================
257 Reset current_entry to head of list.
258 ====================================================================
259 */
260 void list_reset( List *list )
261 {
262 list->cur_entry = list->head;
263 }
264 /*
265 ====================================================================
266 Get next item and update current_entry (reset if tail reached)
267 Return Value: Item pointer if found else Null (if tail of list).
268 ====================================================================
269 */
270 void* list_next( List *list )
271 {
272 list->cur_entry = list->cur_entry->next;
273 if ( list->cur_entry == list->tail ) list_reset( list );
274 return list->cur_entry->item;
275 }
276 /*
277 ====================================================================
278 Get previous item and update current_entry.
279 Return Value: Item pointer if found else Null (if head of list).
280 ====================================================================
281 */
282 void* list_prev( List *list )
283 {
284 list->cur_entry = list->cur_entry->prev;
285 return list->cur_entry->item;
286 }
287 /*
288 ====================================================================
289 Delete the current entry if not tail or head. This is the entry
290 that contains the last returned item by list_next/prev().
291 Return Value: True if it was a valid deleteable entry.
292 ====================================================================
293 */
294 int list_delete_current( List *list )
295 {
296 if ( list->cur_entry == 0 || list->cur_entry == list->head || list->cur_entry == list->tail ) return 0;
297 list_delete_entry( list, list->cur_entry );
298 return 1;
299 }
300 /*
301 ====================================================================
302 Check if list is empty.
303 Return Value: True if list counter is 0 else False.
304 ====================================================================
305 */
306 int list_empty( List *list )
307 {
308 return list->count == 0;
309 }
310 /*
311 ====================================================================
312 Return entry containing the passed item.
313 Return Value: True if entry found else False.
314 ====================================================================
315 */
316 ListEntry *list_entry( List *list, void *item )
317 {
318 ListEntry *entry = list->head->next;
319 while ( entry != list->tail ) {
320 if ( entry->item == item ) return entry;
321 entry = entry->next;
322 }
323 return 0;
324 }
325 /*
326 ====================================================================
327 Transfer an entry from one list to another list by removing from
328 'source' and adding to 'dest' thus if source does not contain
329 the item this is equvalent to list_add( dest, item ).
330 ====================================================================
331 */
332 void list_transfer( List *source, List *dest, void *item )
333 {
334 int old_auto_flag;
335 /* add to destination */
336 list_add( dest, item );
337 /* as the pointer is added to dest without changes only the empty
338 entry must be deleted in source */
339 old_auto_flag = source->auto_delete;
340 source->auto_delete = LIST_NO_AUTO_DELETE;
341 list_delete_item( source, item );
342 source->auto_delete = old_auto_flag;
343 }
344 /*
345 ====================================================================
346 Deqeue the first list entry. (must not use auto_delete therefore)
347 ====================================================================
348 */
349 void *list_dequeue( List *list )
350 {
351 void *item;
352 if ( list->count > 0 ) {
353 item = list->head->next->item;
354 list_delete_pos( list, 0 );
355 return item;
356 }
357 else
358 return 0;
359 }
0 /***************************************************************************
1 list.h - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LIST_H
18 #define __LIST_H
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /*
25 ====================================================================
26 Dynamic list handling data as void pointers.
27 ====================================================================
28 */
29 typedef struct _ListEntry {
30 struct _ListEntry *next;
31 struct _ListEntry *prev;
32 void *item;
33 } ListEntry;
34 typedef struct {
35 int auto_delete;
36 int count;
37 ListEntry *head;
38 ListEntry *tail;
39 void (*callback)(void*);
40 ListEntry *cur_entry;
41 } List;
42
43 /*
44 ====================================================================
45 Create a new list
46 auto_delete: Free memory of data pointer when deleting entry
47 callback: Use this callback to free memory of data including
48 the data pointer itself.
49 Return Value: List pointer
50 ====================================================================
51 */
52 enum { LIST_NO_AUTO_DELETE = 0, LIST_AUTO_DELETE };
53 enum { LIST_NO_CALLBACK = 0 };
54 List *list_create( int auto_delete, void (*callback)(void*) );
55 /*
56 ====================================================================
57 Delete list and entries.
58 ====================================================================
59 */
60 void list_delete( List *list );
61 /*
62 ====================================================================
63 Delete all entries but keep the list. Reset current_entry to head
64 pointer.
65 ====================================================================
66 */
67 void list_clear( List *list );
68 /*
69 ====================================================================
70 Insert new item at position.
71 Return Value: True if successful else False.
72 ====================================================================
73 */
74 int list_insert( List *list, void *item, int pos );
75 /*
76 ====================================================================
77 Add new item at the end of the list.
78 ====================================================================
79 */
80 int list_add( List *list, void *item );
81 /*
82 ====================================================================
83 Delete item at pos. If this was the current entry update
84 current_entry to valid previous pointer.
85 Return Value: True if successful else False.
86 ====================================================================
87 */
88 int list_delete_pos( List *list, int pos );
89 /*
90 ====================================================================
91 Delete item if in list. If this was the current entry update
92 current_entry to valid previous pointer.
93 Return Value: True if successful else False.
94 ====================================================================
95 */
96 int list_delete_item( List *list, void *item );
97 /*
98 ====================================================================
99 Delete entry.
100 ====================================================================
101 */
102 int list_delete_entry( List *list, ListEntry *entry );
103 /*
104 ====================================================================
105 Get item from position if in list.
106 Return Value: Item pointer if found else Null pointer.
107 ====================================================================
108 */
109 void* list_get( List *list, int pos );
110 /*
111 ====================================================================
112 Check if item's in list.
113 Return Value: Position of item else -1.
114 ====================================================================
115 */
116 int list_check( List *list, void *item );
117 /*
118 ====================================================================
119 Return first item stored in list and set current_entry to this
120 entry.
121 Return Value: Item pointer if found else Null pointer.
122 ====================================================================
123 */
124 void* list_first( List *list );
125 /*
126 ====================================================================
127 Return last item stored in list and set current_entry to this
128 entry.
129 Return Value: Item pointer if found else Null pointer.
130 ====================================================================
131 */
132 void* list_last( List *list );
133 /*
134 ====================================================================
135 Return item in current_entry.
136 Return Value: Item pointer if found else Null pointer.
137 ====================================================================
138 */
139 void* list_current( List *list );
140 /*
141 ====================================================================
142 Reset current_entry to head of list.
143 ====================================================================
144 */
145 void list_reset( List *list );
146 /*
147 ====================================================================
148 Get next item and update current_entry (reset if tail reached).
149 Return Value: Item pointer if found else Null (if tail of list).
150 ====================================================================
151 */
152 void* list_next( List *list );
153 /*
154 ====================================================================
155 Get previous item and update current_entry.
156 Return Value: Item pointer if found else Null (if head of list).
157 ====================================================================
158 */
159 void* list_prev( List *list );
160 /*
161 ====================================================================
162 Delete the current entry if not tail or head. This is the entry
163 that contains the last returned item by list_next/prev().
164 Return Value: True if it was a valid deleteable entry.
165 ====================================================================
166 */
167 int list_delete_current( List *list );
168 /*
169 ====================================================================
170 Check if list is empty.
171 Return Value: True if list counter is 0 else False.
172 ====================================================================
173 */
174 int list_empty( List *list );
175 /*
176 ====================================================================
177 Return entry containing the passed item.
178 Return Value: True if entry found else False.
179 ====================================================================
180 */
181 ListEntry *list_entry( List *list, void *item );
182 /*
183 ====================================================================
184 Transfer an entry from one list to another list by removing from
185 'source' and adding to 'dest' thus if source does not contain
186 the item this is equvalent to list_add( dest, item ).
187 ====================================================================
188 */
189 void list_transfer( List *source, List *dest, void *item );
190 /*
191 ====================================================================
192 Deqeue the first list entry. (must not use auto_delete therefore)
193 ====================================================================
194 */
195 void *list_dequeue( List *list );
196
197 #ifdef __cplusplus
198 };
199 #endif
200
201 #endif
0 /***************************************************************************
1 messages.h - description
2 -------------------
3 begin : Mon Oct 21 12:02:57 CEST 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MESSAGES_H
18 #define __MESSAGES_H
19
20 /* protocol of server and client which must be equal */
21 #define PROTOCOL 4
22
23 /* a list of all messages in the game for client or server */
24 enum {
25 /* 00 */
26 MSG_HEARTBEAT = 0,
27 /* tells the remote one is still alive. can't be checked in another
28 * way as the connection is not a stream */
29
30 /* 01 */
31 MSG_ERROR,
32 /* string message
33 *
34 * transfer an error message */
35
36 /* 02 */
37 MSG_SERVER_INFO,
38 /* string message
39 *
40 * server message written to chat */
41
42 /* 03 */
43 MSG_CONNECT,
44 /* int8 protocol
45 * string username
46 * string password
47 *
48 * password is currently unused. requests login at server */
49
50 /* 04 */
51 MSG_LOGIN_OKAY,
52 /* int32 user id
53 * string user name
54 *
55 * accept login and tell client its server user id and its name */
56
57 /* 05 */
58 MSG_DISCONNECT,
59 /* tell server user has disconnect or vice versa */
60
61 /* 06 */
62 MSG_PREPARE_FULL_UPDATE,
63 /* clear user list and levelset list */
64
65 /* 07 */
66 MSG_ADD_USER,
67 /* string user name
68 * int32 user id
69 *
70 * add a visible user. */
71
72 /* 08 */
73 MSG_REMOVE_USER,
74 /* int32 user id
75 *
76 * remove user by that id. is used as well to hide a user */
77
78 /* 09 */
79 MSG_UNHIDE,
80 /* send by user to set hide 0 after a game was finished.
81 * prevents buffer overflow when game is done but user is
82 * idle (looking at stats or whatever) */
83
84 /* 0a */
85 MSG_CHANNEL_LIST,
86 /* int8 count
87 * string names
88 * ...
89 *
90 * send the list of all default channels */
91
92 /* 0b */
93 MSG_LEVELSET_LIST,
94 /* int8 count
95 * string names
96 * ...
97 *
98 * send the list of all available levelsets */
99
100 /* 0c */
101 MSG_CHATTER,
102 /* string message
103 *
104 * broadcast this message to all visible users */
105
106 /* 0d */
107 MSG_WHISPER,
108 /* user user id
109 * string message
110 *
111 * whisper this message to the user with the user_id which may be
112 * located in any channel */
113
114 /* 0e */
115 MSG_COMMAND,
116 /* string command
117 *
118 * user has entered a command. the prepended '/' has already been
119 * removed by the client */
120
121 /* 0f */
122 MSG_OPEN_GAME,
123 /* int32 challenged_id
124 * string setname
125 * int8 diff
126 * int8 rounds
127 * int8 frags
128 * int8 balls
129 *
130 * open a game and add the sending user and the user by id 'challenged_id'
131 * to it. */
132
133 /* 10 */
134 MSG_CHALLENGE,
135 /* string username
136 * string setname
137 * ... as above
138 *
139 * inform user that it has been challenged by 'user_id' */
140
141 /* 11 */
142 MSG_ACCEPT_CHALLENGE,
143 /* accept challenge (does not require additional data as it is sent
144 * within the game context) */
145
146 /* 12 */
147 MSG_REJECT_CHALLENGE,
148 /* reject challenge (as above) */
149
150 /* 13 */
151 MSG_CANCEL_GAME,
152 /* challenger cancells challenge which will kill the game and unhide
153 * both users (as above) */
154
155 /* 14 */
156 MSG_BUSY,
157 /* int32 user_id
158 *
159 * user cannot react on a request. the 'user_id' is the
160 * requesting user who gets the busy message */
161
162 /* 15 */
163 MSG_ENTER_CHANNEL,
164 /* string name
165 *
166 * client requests to server to enter this channel */
167
168 /* 16 */
169 MSG_SET_CHANNEL,
170 /* string name
171 *
172 * set the name of the current channel */
173
174 /* 17 */
175 MSG_QUIT_GAME,
176 /* if send by a player the opponent will be informed
177 * and then both are returned to the chat channel */
178
179 /* 18 */
180 MSG_LEVEL_DATA,
181 /* int8 flags
182 * string title
183 * string author
184 * string bricks
185 * string extras
186 *
187 * leveldata 32+252*2 bytes except the first two byte.
188 * first tells wether the client plays at top or bottom
189 * and second tells the comm delay of the server */
190
191 /* 19 */
192 MSG_READY,
193 /* send by client to confirm reception of level or to
194 * show that its ready */
195
196 /* 1a */
197 MSG_PAUSE,
198 /* pause game */
199
200 /* 1b */
201 MSG_UNPAUSE,
202 /* guess what, eh? */
203
204 /* 1c */
205 MSG_PADDLE_STATE,
206 /* int16 state
207 *
208 * position and fire flags of a paddle */
209
210 /* 1d */
211 MSG_BALL_POSITIONS,
212 /* ???
213 *
214 * attached/moving ball positions */
215
216 /* 1e */
217 MSG_SHOT_POSITIONS,
218 /* ???
219 *
220 * moving shot positions */
221
222 /* 1f */
223 MSG_SCORES,
224 /* int24 paddle bottom
225 * int24 paddle top
226 *
227 * current scores of paddles */
228
229 /* 20 */
230 MSG_BRICK_HITS,
231 /* ???
232 *
233 * brick modifications */
234
235 /* 21 */
236 MSG_NEW_EXTRAS,
237 /* ???
238 *
239 * extras collected by both paddles */
240
241 /* 22 */
242 MSG_ROUND_OVER,
243 /* int8 winner
244 *
245 * id of winner paddle or -1 if draw */
246
247 /* 23 */
248 MSG_LAST_ROUND_OVER,
249 /* int8 winner
250 *
251 * tells client that game is finished */
252
253 /* 24 */
254 MSG_GAME_STATS,
255 /* statistics
256 *
257 * final game stats */
258
259 /* 25 */
260 MSG_ADD_LEVELSET,
261 /* string setname
262 *
263 * add a new levelset to client information */
264
265 /* 26 */
266 MSG_SET_COMM_DELAY
267 /* int16 delay
268 *
269 * delay between communication frames */
270 };
271
272 #endif
0 #include "net.h"
1 #include <SDL.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <stdarg.h>
6 #include <time.h>
7
8 /* Basic layer for network communication. A single UDP socket
9 * is bound to a port. Received packages are stored in one
10 * global buffer.
11 * Socket addresses are wrapped in a struct called NetAddr to
12 * which raw data may be sent as unreliable datagrams.
13 *
14 * Error/message stream: sys_printf()
15 */
16
17 int (*sys_printf)(const char *format, ...) = printf;
18
19 /* ********** UDP SOCKET ********** */
20
21 #ifdef SDL_NET_ENABLED
22 UDPsocket SDL_socket = 0;
23 UDPpacket *SDL_packet = 0;
24 #else
25 int net_socket = -1;
26 #endif
27 NetAddr net_local_addr;
28 NetAddr net_sender_addr;
29 char net_buffer[MAX_MSG_SIZE + PACKET_HEADER_SIZE];
30 int net_buffer_cur_size = 0;
31
32 int net_show_drops = 1;
33 #ifdef NET_DEBUG_MSG
34 int net_show_packets = 1;
35 #else
36 int net_show_packets = 0;
37 #endif
38
39 #ifdef NETWORK_ENABLED
40 #ifndef SDL_NET_ENABLED
41 static void sockaddr_to_netaddr( struct sockaddr *sa, NetAddr *addr )
42 {
43 struct sockaddr_in *sin;
44 addr->sa = *sa;
45 /* if AF_INET get ip */
46 if ( sa->sa_family == AF_INET ) {
47 sin = (struct sockaddr_in*)sa;
48 *(int *)&addr->inet_ip = *(int *)&sin->sin_addr; /* wow */
49 }
50 }
51
52 static void netaddr_to_sockaddr( NetAddr *addr, struct sockaddr *sa )
53 {
54 *sa = addr->sa;
55 }
56
57 /* resolve name but leave port 0 */
58 static bool resolve_hostname( char *host, struct sockaddr *sa, int *sa_len )
59 {
60 struct sockaddr_in *sin;
61 struct sockaddr_in6 *sin6;
62 struct hostent *hostlist;
63
64 /* resolve the host's address via DNS lookup */
65 if ( ( hostlist = gethostbyname( host ) ) == 0 ) {
66 sys_printf( "unable to resolve %s: %s\n", host, strerror( errno) );
67 return 0;
68 }
69
70 /* put host address to sa struct. simply use the first resolved address */
71 *sa_len = sizeof(*sa);
72 memset( sa, 0, *sa_len );
73 switch ( hostlist->h_addrtype ) {
74 case AF_INET:
75 sin = (struct sockaddr_in*)sa;
76 sin->sin_family = AF_INET;
77 memcpy( &sin->sin_addr, hostlist->h_addr_list[0], hostlist->h_length );
78 break;
79 case AF_INET6:
80 sin6 = (struct sockaddr_in6*)sa;
81 sin6->sin6_family = AF_INET6;
82 memcpy( &sin6->sin6_addr, hostlist->h_addr_list[0], hostlist->h_length );
83 break;
84 default:
85 sys_printf( "unable to resolve: address family %i not supported\n",
86 hostlist->h_addrtype );
87 return 0;
88 }
89
90 return 1;
91 }
92
93 static void net_get_local_addr( int port )
94 {
95 char buf[MAXHOSTNAMELEN];
96 struct sockaddr_in sa;
97 int sa_len;
98
99 gethostname(buf, MAXHOSTNAMELEN);
100 buf[MAXHOSTNAMELEN-1] = 0;
101
102 resolve_hostname( buf, (struct sockaddr*)&sa, &sa_len ); /* port is missing */
103 sa.sin_port = htons((short)port);
104
105 sockaddr_to_netaddr( (struct sockaddr *)&sa, &net_local_addr );
106 }
107 #endif
108 #endif
109
110 /* open UDP socket */
111 bool net_init( int port )
112 {
113 #ifdef NETWORK_ENABLED
114 #ifdef SDL_NET_ENABLED
115 if(SDLNet_Init()==-1) {
116 sys_printf("SDLNet_Init: %s\n", SDLNet_GetError());
117 return 0;
118 }
119 SDL_socket=SDLNet_UDP_Open(port);
120 if(!SDL_socket) {
121 sys_printf("SDLNet_UDP_Open: %s\n", SDLNet_GetError());
122 return 0;
123 }
124 SDL_packet = SDLNet_AllocPacket(MAX_MSG_SIZE + PACKET_HEADER_SIZE);
125 if(SDL_packet==0) {
126 sys_printf("cannot allocate packet: out of memory\n" );
127 return 0;
128 }
129 /* net_local_addr is unset */
130 net_local_addr.SDL_address.host = 0;
131 net_local_addr.SDL_address.port = 0;
132 return 1;
133 #else
134 struct sockaddr_in sa;
135 int sa_len;
136 int fcntl_args, i;
137
138 if ( (net_socket = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
139 sys_printf( "couldn't create socket: %s\n", strerror(errno) );
140 else
141 if ( fcntl( net_socket, F_GETFL, &fcntl_args) < 0 )
142 sys_printf( "couldn't get fcntl args: %s\n", strerror(errno) );
143 else
144 if ( fcntl( net_socket, F_SETFL, O_NONBLOCK | fcntl_args) < 0 )
145 sys_printf( "couldn't set fcntl args: %s\n", strerror(errno) );
146 else {
147 sa_len = sizeof(sa);
148 memset( &sa, 0, sa_len );
149 sa.sin_family = AF_INET;
150 sa.sin_port = htons((short)port);
151 sa.sin_addr.s_addr = htonl(INADDR_ANY); /* all interfaces */
152
153 i = 10; /* try ten successive ports */
154 while ( bind( net_socket, (struct sockaddr*)&sa, sa_len ) < 0 ) {
155 sys_printf( "binding to port %i failed: %s\n", port, strerror(errno) );
156 sa.sin_port = htons((short)port++);
157 if ( --i == 0 ) {
158 close( net_socket );
159 return 0;
160 }
161 }
162
163 net_get_local_addr( port );
164 sys_printf( "UDP socket bound to %s:%i\n",
165 net_addr_to_string( &net_local_addr ), port );
166
167 return 1;
168 }
169 return 0;
170 #endif
171 #else
172 return 0;
173 #endif
174 }
175
176 void net_shutdown( void )
177 {
178 #ifdef NETWORK_ENABLED
179 #ifdef SDL_NET_ENABLED
180 SDLNet_UDP_Close(SDL_socket); SDL_socket = 0;
181 SDLNet_FreePacket(SDL_packet); SDL_packet = 0;
182 SDLNet_Quit();
183 #else
184 close( net_socket );
185 sys_printf( "UDP socket closed\n" );
186 #endif
187 #endif
188 }
189
190 void net_send_packet( NetAddr *to, int len, void *data )
191 {
192 #ifdef NETWORK_ENABLED
193 #ifdef SDL_NET_ENABLED
194 SDL_packet->channel = -1;
195 memcpy( SDL_packet->data, data, len );
196 SDL_packet->len = len;
197 SDL_packet->address = to->SDL_address;
198 SDLNet_UDP_Send(SDL_socket,-1,SDL_packet);
199 #else
200 struct sockaddr sa;
201
202 /* empty packets are not send */
203 if ( len == 0 ) {
204 sys_printf( "net_send_packet: null length packet\n" );
205 return;
206 }
207
208 netaddr_to_sockaddr( to, &sa );
209
210 if ( sendto( net_socket, data, len, 0, &sa, sizeof(sa) ) < 0 ) {
211 if (errno == EWOULDBLOCK)
212 return;
213 if (errno == ECONNREFUSED)
214 return;
215 sys_printf( "net_send_packet: %s\n", strerror(errno) );
216 }
217 #endif
218 #endif
219 }
220
221 bool net_recv_packet( void )
222 {
223 #ifdef NETWORK_ENABLED
224 int ret;
225 #ifdef SDL_NET_ENABLED
226 ret = SDLNet_UDP_Recv(SDL_socket, SDL_packet);
227 if ( ret == -1 ) {
228 sys_printf("SDLNet_UDP_Recv: %s\n", SDLNet_GetError());
229 return 0;
230 }
231 if ( ret == 1 ) {
232 memcpy( net_buffer, SDL_packet->data, SDL_packet->len );
233 net_buffer_cur_size = SDL_packet->len;
234 net_sender_addr.SDL_address = SDL_packet->address;
235 return 1;
236 }
237 net_buffer_cur_size = 0;
238 return 0;
239 #else
240 struct sockaddr sa;
241 int sa_len = sizeof(sa);
242
243 ret = recvfrom( net_socket,
244 net_buffer, sizeof(net_buffer),
245 0,
246 &sa, &sa_len);
247 if (ret == -1) {
248 if (errno == EWOULDBLOCK)
249 return 0;
250 if (errno == ECONNREFUSED)
251 return 0;
252 sys_printf( "net_recv_packet: %s\n", strerror(errno));
253 return 0;
254 }
255
256 net_buffer_cur_size = ret;
257
258 sockaddr_to_netaddr( &sa, &net_sender_addr );
259
260 return (ret>0);
261 #endif
262 #else
263 return 0;
264 #endif
265 }
266
267 /* if host contains trailing :xxxxx 'port' is overwritten */
268 bool net_build_addr( NetAddr *addr, char *host, int port )
269 {
270 #ifdef NETWORK_ENABLED
271 char *ptr;
272 #ifndef SDL_NET_ENABLED
273 struct sockaddr sa;
274 int sa_len;
275 #endif
276 if ( (ptr = strchr( host, ':' )) ) {
277 *ptr = 0;
278 port = atoi( ptr+1 );
279 }
280
281 #ifdef SDL_NET_ENABLED
282 if ( SDLNet_ResolveHost(&addr->SDL_address, host, port ) == -1 )
283 {
284 sys_printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
285 return 0;
286 }
287 return 1;
288 #else
289 memset( addr, 0, sizeof( NetAddr ) );
290 if ( resolve_hostname( host, &sa, &sa_len ) ) {
291 switch ( sa.sa_family ) {
292 case AF_INET:
293 ((struct sockaddr_in*)&sa)->sin_port = htons((short)port);
294 break;
295 case AF_INET6:
296 ((struct sockaddr_in6*)&sa)->sin6_port = htons((short)port);
297 break;
298 default:
299 /* not reached as resolve_hostname allows the same types */
300 return 0;
301 }
302 sockaddr_to_netaddr( &sa, addr );
303 return 1;
304 }
305 return 0;
306 #endif
307 #else
308 return 0;
309 #endif
310 }
311
312 /* compare host and port */
313 bool net_compare_addr( NetAddr *a1, NetAddr *a2 )
314 {
315 #ifdef NETWORK_ENABLED
316 #ifdef SDL_NET_ENABLED
317 if ( a1->SDL_address.host == a2->SDL_address.host )
318 if ( a1->SDL_address.port == a2->SDL_address.port )
319 return 1;
320 return 0;
321 #else
322 /* by now only AF_INET addresses may be compared */
323 if ( a1->sa.sa_family == AF_INET && a2->sa.sa_family == AF_INET ) {
324 if ( a1->inet_ip[0] == a2->inet_ip[0] )
325 if ( a1->inet_ip[1] == a2->inet_ip[1] )
326 if ( a1->inet_ip[2] == a2->inet_ip[2] )
327 if ( a1->inet_ip[3] == a2->inet_ip[3] )
328 if ( ((struct sockaddr_in*)&a1->sa)->sin_port ==
329 ((struct sockaddr_in*)&a2->sa)->sin_port )
330 return 1;
331 return 0;
332 }
333
334 sys_printf( "only AF_INET addresses may be compared yet\n" );
335 return 0;
336 #endif
337 #else
338 return 0;
339 #endif
340 }
341
342 char *net_addr_to_string( NetAddr *_addr ) /* not allocated but static */
343 {
344 #ifdef NETWORK_ENABLED
345 #ifdef SDL_NET_ENABLED
346 int ip[4];
347 static char host_ip[64];
348 char *host;
349 if(!(host=SDLNet_ResolveIP(&_addr->SDL_address)))
350 {
351 //printf("SDLNet_ResolveIP: %s\n", SDLNet_GetError());
352 ip[0] = _addr->SDL_address.host & 0xff;
353 ip[1] = (_addr->SDL_address.host>>8) & 0xff;
354 ip[2] = (_addr->SDL_address.host>>16) & 0xff;
355 ip[3] = (_addr->SDL_address.host>>24) & 0xff;
356 snprintf( host_ip, 64, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3] );
357 return host_ip;
358 }
359 return host;
360 #else
361 static char str[64];
362 int len = 64;
363 struct sockaddr *addr = &_addr->sa;
364 struct sockaddr_in *sin;
365 struct sockaddr_in6 *sin6;
366 /*struct sockaddr_un *sun;*/
367
368 str[len-1] = 0;
369 snprintf( str, len, "undefined" );
370
371 switch ( addr->sa_family ) {
372 case AF_INET:
373 sin = (struct sockaddr_in*)addr;
374 if ( !inet_ntop( AF_INET, &sin->sin_addr, str, len ) ) {
375 sys_printf( "inet_ntop failed: %s\n", strerror( errno ) );
376 }
377 break;
378 case AF_INET6:
379 sin6 = (struct sockaddr_in6*)addr;
380 if ( !inet_ntop( AF_INET6, &sin6->sin6_addr, str, len ) ) {
381 sys_printf( "inet_ntop failed: %s\n", strerror( errno ) );
382 }
383 break;
384 case AF_UNIX:
385 /*sun = (struct sockaddr_un *)addr;
386 if( sun->sun_path[0] == 0 ) {
387 snprintf( str, len, "unknown" );
388 sys_printf( "net_query_ip: unknown unix path\n" );
389 }
390 else
391 snprintf( str, sun->sun_path, len );*/
392 break;
393 default:
394 snprintf( str, len, "unknown" );
395 break;
396 }
397
398 return str;
399 #endif
400 #else
401 return 0;
402 #endif
403 }
404
405 /* ********** MESSAGE ********** */
406
407 char *msg_buf = 0;
408 int *msg_buf_cur_size = 0;
409 int msg_buf_max_size = 0;
410 int msg_write_overflow = 0;
411
412 #ifdef NET_DEBUG_MSG
413 static void msg_print_raw( int len, char *buf )
414 {
415 int i;
416 for ( i = 0; i < len; i++ )
417 printf( "%02x ", (unsigned char) buf[i] );
418 printf( "\n" );
419 }
420 #endif
421
422 static char* msg_get_writeable_space( int size )
423 {
424 if ( *msg_buf_cur_size + size > msg_buf_max_size ) {
425 msg_write_overflow = 1;
426 *msg_buf_cur_size = 0;
427 }
428 return msg_buf + *msg_buf_cur_size;
429 }
430
431 void msg_begin_writing( char *buf, int *cur_size, int max_size )
432 {
433 msg_buf = buf;
434 msg_buf_cur_size = cur_size;
435 msg_buf_max_size = max_size;
436 *msg_buf_cur_size = 0;
437 msg_write_overflow = 0;
438 }
439 void msg_write_int8 ( int c )
440 {
441 unsigned char *ptr = msg_get_writeable_space( 1 );
442 ptr[0] = (char)c;
443 *msg_buf_cur_size += 1;
444 }
445 void msg_write_int16 ( int s )
446 {
447 unsigned char *ptr = msg_get_writeable_space( 2 );
448 ptr[0] = s & 0xff;
449 ptr[1] = (s>>8) & 0xff;
450 *msg_buf_cur_size += 2;
451 }
452 void msg_write_int32 ( int i )
453 {
454 unsigned char *ptr = msg_get_writeable_space( 4 );
455 ptr[0] = i & 0xff;
456 ptr[1] = (i>>8) & 0xff;
457 ptr[2] = (i>>16) & 0xff;
458 ptr[3] = (i>>24) & 0xff;
459 *msg_buf_cur_size += 4;
460 }
461 void msg_write_string( char *str )
462 {
463 char *ptr = msg_get_writeable_space( strlen(str)+1 );
464 if ( strlen(str)+1 > msg_buf_max_size ) return; /* would cause segfault */
465 strcpy( ptr, str );
466 *msg_buf_cur_size += strlen(str)+1;
467 }
468 void msg_printf ( char *format, ... )
469 {
470 char buf[MAX_MSG_SIZE];
471 va_list args;
472
473 va_start( args, format );
474 vsnprintf( buf, MAX_MSG_SIZE, format, args ); buf[MAX_MSG_SIZE-1] = 0;
475 va_end( args );
476 msg_write_string( buf );
477 }
478 void msg_write ( int len, void *data )
479 {
480 unsigned char *ptr = msg_get_writeable_space( len );
481 if ( len > msg_buf_max_size ) return; /* would cause segfault */
482 memcpy( ptr, data, len );
483 *msg_buf_cur_size += len;
484 }
485 int msg_get_max_size()
486 {
487 return msg_buf_max_size;
488 }
489 bool msg_write_failed()
490 {
491 return msg_write_overflow;
492 }
493
494 int msg_read_exceeded = 0;
495 int msg_read_pos = 0;
496
497 static char* msg_get_readable_space( int size )
498 {
499 if ( msg_read_pos + size > net_buffer_cur_size ) {
500 msg_read_exceeded = 1;
501 msg_read_pos = 0;
502 }
503 return net_buffer + msg_read_pos;
504
505 }
506
507 bool msg_is_connectionless()
508 {
509 return ( *(int*)net_buffer == 0 );
510 }
511 void msg_begin_reading()
512 {
513 msg_read_exceeded = 0;
514 msg_read_pos = 0;
515 }
516 void msg_begin_connectionless_reading()
517 {
518 msg_read_exceeded = 0;
519 msg_read_pos = PACKET_HEADER_SIZE;
520 }
521 int msg_read_int8 ( void )
522 {
523 unsigned char *ptr = msg_get_readable_space( 1 );
524 msg_read_pos += 1;
525 return ptr[0];
526 }
527 int msg_read_int16( void )
528 {
529 unsigned char *ptr = msg_get_readable_space( 2 );
530 msg_read_pos += 2;
531 return ptr[0] + (ptr[1]<<8);
532 }
533 int msg_read_int32( void )
534 {
535 unsigned char *ptr = msg_get_readable_space( 4 );
536 msg_read_pos += 4;
537 return ptr[0] + (ptr[1]<<8) + (ptr[2]<<16) + (ptr[3]<<24);
538 }
539 char* msg_read_string( void )
540 {
541 static char buf[MAX_MSG_SIZE]; /* can't be bigger including trailing \0 */
542 char c;
543 int i = 0;
544
545 while ( 1 ) {
546 c = msg_read_int8();
547 buf[i++] = c;
548 if ( i == MAX_MSG_SIZE ) break; /* to be sure */
549 if ( c == 0 ) break;
550 }
551 buf[MAX_MSG_SIZE-1] = 0;
552
553 return buf;
554 }
555 void msg_read( int len, char *buf )
556 {
557 unsigned char *ptr = msg_get_readable_space( len );
558 msg_read_pos += len;
559 memcpy( buf, ptr, len );
560 }
561
562 bool msg_read_failed( void )
563 {
564 return msg_read_exceeded;
565 }
566
567 /* ********** TRANSMISSION ********** */
568
569 /* transmit a connectionless message */
570 void net_transmit_connectionless( NetAddr *addr, int len, char *data )
571 {
572 int cur_size;
573 char packet[PACKET_HEADER_SIZE + MAX_MSG_SIZE];
574
575 memset( packet, 0, PACKET_HEADER_SIZE ); /* connectionless header */
576 msg_begin_writing( packet + PACKET_HEADER_SIZE, &cur_size, MAX_MSG_SIZE );
577 msg_write( len, data );
578 if ( msg_write_failed() ) return;
579
580 net_send_packet( addr, PACKET_HEADER_SIZE + cur_size, packet );
581
582 if ( net_show_packets )
583 sys_printf( "--> %s: connectionless size=%i\n",
584 net_addr_to_string( addr ),
585 cur_size + PACKET_HEADER_SIZE );
586 }
587
588 void socket_init( NetSocket *sock, NetAddr *addr )
589 {
590 memset( sock, 0, sizeof( NetSocket ) );
591
592 sock->remote_addr = *addr;
593 sock->outgoing_id = 1; /* as id 0 means connectionless */
594 sock->idle_since = time(0);
595
596 //sys_printf( "%s: socket initiated\n", net_addr_to_string( addr ) );
597 }
598
599 void socket_reinit( NetSocket *socket ) /* with same address */
600 {
601 NetAddr addr = socket->remote_addr;
602 socket_init( socket, &addr );
603 }
604
605 void socket_print_stats( NetSocket *sock )
606 {
607 sys_printf ( "%s: STATISTICS\n drops: %i(%i packets)\n %i good packets\n",
608 net_addr_to_string( &sock->remote_addr ),
609 sock->drop_count, sock->dropped_packet_count,
610 sock->good_packet_count );
611 }
612
613 /* transmit CODE_RED/BLUE message and re-transmit dropped CODE_RED messages.
614 * length 0 messages are not transmitted. re-transmission of CODE_RED messages
615 * is handled in any case */
616 void socket_transmit( NetSocket *sock, int code, int len, char *data )
617 {
618 char packet[PACKET_HEADER_SIZE + MAX_MSG_SIZE];
619 int is_code_red = 0, cur_size = 0;
620
621 /* do not use sockets with fatal error */
622 if ( sock->fatal_error ) return;
623
624 /* add code red message to buffer */
625 if ( code == CODE_RED ) {
626 if ( sock->code_red_buf_cur_size + len > MAX_MSG_SIZE ) {
627 sock->fatal_error = 1; /* overflowed */
628 return;
629 }
630 memcpy( sock->code_red_buf + sock->code_red_buf_cur_size, data, len );
631 sock->code_red_buf_cur_size += len;
632 /* do not send the message if waiting for a receipt */
633 if ( sock->outgoing_code_red > 0 && !sock->retransmit_code_red_buf )
634 return;
635 else
636 is_code_red = 1;
637 }
638
639 if ( sock->retransmit_code_red_buf )
640 is_code_red = 1;
641
642 msg_begin_writing( packet, &cur_size, PACKET_HEADER_SIZE + MAX_MSG_SIZE );
643 msg_write_int32( sock->outgoing_id | (is_code_red<<31) );
644 msg_write_int32( sock->incoming_code_red );
645
646 if ( is_code_red )
647 sock->outgoing_code_red = sock->outgoing_id;
648
649 sock->outgoing_id++;
650
651 /* if code red buffer was not received resend it and clear the flag.
652 * if not waiting for a receipt (thus an initial code red message)
653 * send it as well */
654 if ( is_code_red ) {
655 msg_write( sock->code_red_buf_cur_size, sock->code_red_buf );
656 sock->retransmit_code_red_buf = 0;
657 }
658
659 /* add code blue packet if space is left */
660 if ( code == CODE_BLUE && cur_size + len <= msg_get_max_size() )
661 msg_write( len, data );
662
663 /* no data? */
664 if ( cur_size == PACKET_HEADER_SIZE ) return;
665
666 /* send packet */
667 net_send_packet( &sock->remote_addr, cur_size, packet );
668 #ifdef NET_DEBUG_MSG
669 printf( "OUT: "); msg_print_raw( cur_size, packet );
670 #endif
671
672 if ( net_show_packets )
673 sys_printf( "--> %s: out=%i(%s) size=%i in=%i(RED:%i)\n",
674 net_addr_to_string( &sock->remote_addr ),
675 sock->outgoing_id-1, is_code_red?"RED":"BLUE",
676 cur_size,
677 sock->incoming_id, sock->incoming_code_red );
678 }
679
680 /* update socker by net_packet header if net_sender_addr is sock.remote_addr
681 * and set read pointer to packet payload. if false is returned packet is
682 * not parsed. */
683 bool socket_process_header( NetSocket *sock )
684 {
685 int id, is_code_red, last_ack_code_red, drops = 0;
686
687 /* do not process fatal socks */
688 if ( sock->fatal_error ) return 0;
689
690 /* correct sock? */
691 if ( !net_compare_addr( &net_sender_addr, &sock->remote_addr ) )
692 return 0;
693
694 #ifdef NET_DEBUG_MSG
695 printf( " IN: " ); msg_print_raw( net_buffer_cur_size, net_buffer );
696 #endif
697
698 /* read header */
699 msg_begin_reading();
700 id = msg_read_int32(); /* new incoming id, the difference to sock->incoming_id is
701 the number of dropped packets */
702 is_code_red = id >> 31; /* highest bit tells wether code red packet */
703 id &= ~(1<<31);
704 last_ack_code_red = msg_read_int32(); /* last code red packet remote received */
705
706 /* duplicated packets are not handled */
707 if ( id <= sock->incoming_id ) {
708 if ( net_show_drops )
709 sys_printf( "%s: out of order packet %i at %i\n",
710 net_addr_to_string( &sock->remote_addr ),
711 id, sock->incoming_id );
712 return 0;
713 }
714
715 /* despite dropped packets this packet is handled */
716 if ( id > sock->incoming_id+1 ) {
717 drops = id - (sock->incoming_id+1);
718 sock->dropped_packet_count += drops;
719 sock->drop_count++;
720 if ( net_show_drops )
721 sys_printf( "%s: dropped %i packets at %i\n",
722 net_addr_to_string( &sock->remote_addr ),
723 drops, sock->incoming_id+1 );
724 }
725 sock->good_packet_count++;
726
727 sock->incoming_id = id; /* last incoming packet (no matter wether red or blue) */
728 if ( is_code_red )
729 sock->incoming_code_red = id; /* last code red packet socket received */
730
731 if ( sock->outgoing_code_red ) {
732 if ( sock->outgoing_code_red == last_ack_code_red ) {
733 /* was received so we can clear code_red buffer */
734 sock->outgoing_code_red = 0;
735 sock->code_red_buf_cur_size = 0;
736 }
737 else
738 if ( sock->outgoing_code_red > last_ack_code_red ) {
739 /* resend code_red buffer as it was dropped */
740 sock->retransmit_code_red_buf = 1;
741 }
742 else {
743 /* fatal error occured as remote received a newer code red packet
744 * although we had no receipt for the current one */
745 sock->fatal_error = 1;
746 }
747 }
748
749 sock->idle_since = time(0); /* reset idle time stamp */
750
751 /* if packet is empty mark it as unreadable */
752 if ( msg_read_pos == net_buffer_cur_size )
753 return 0;
754
755 return 1;
756 }
757
0 #ifndef __NET_H
1 #define __NET_H
2
3 #ifdef NETWORK_ENABLED
4 #ifdef SDL_NET_ENABLED
5 #include <SDL_net.h>
6 #else
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <sys/param.h>
10 #include <sys/time.h>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <netinet/tcp.h>
14 #include <netinet/in.h>
15 #include <netdb.h>
16 #include <errno.h>
17 #include <arpa/inet.h>
18 #include <sys/poll.h>
19 #include <signal.h>
20 #endif
21 #endif
22
23 #ifndef bool
24 #define bool int
25 #endif
26
27 typedef struct {
28 #ifdef NETWORK_ENABLED
29 #ifdef SDL_NET_ENABLED
30 IPaddress SDL_address;
31 #else
32 struct sockaddr sa;
33 unsigned char inet_ip[4]; /* AF_INET dotted ip */
34 #endif
35 #endif
36 } NetAddr;
37
38 #define MAX_MSG_SIZE 1016
39 #define PACKET_HEADER_SIZE 8
40
41 typedef struct {
42 NetAddr remote_addr;
43 int fatal_error; /* code red buffer has been flooded */
44
45 int idle_since; /* global time stamp when last packet was received (secs) */
46
47 int drop_count; /* number of drops */
48 int dropped_packet_count; /* number of dropped packets */
49 int good_packet_count; /* number of successfully processed packets */
50
51 int incoming_id; /* last incoming remote outgoing_id */
52 int outgoing_id; /* packet id increased every sent */
53 int incoming_code_red; /* id of last incoming code red packet. is sent
54 in the header to let remote know if any code
55 red packets were dropped */
56 int outgoing_code_red; /* last outgoing_id of code_red packet if socket
57 is still waiting for reception acknowledgment. if
58 packet was delivered successfully this is cleared
59 to 0 as well as code_red_buf */
60 int retransmit_code_red_buf; /* retransmit buffer as net_process_header
61 has received an incoming_code_red less
62 than outgoing_code_red */
63
64 char code_red_buf[MAX_MSG_SIZE];
65 char code_red_buf_cur_size;
66 } NetSocket;
67
68 extern NetAddr net_local_addr;
69 extern NetAddr net_sender_addr;
70
71 bool net_init( int port );
72 void net_shutdown( void );
73 void net_send_packet( NetAddr *to, int len, void *data );
74 bool net_recv_packet( void ); /* into net_packet from net_sender_addr */
75
76 bool net_build_addr( NetAddr *addr, char *host, int port );
77 bool net_compare_addr( NetAddr *a1, NetAddr *a2 );
78 char *net_addr_to_string( NetAddr *addr ); /* not allocated but static */
79
80 void msg_begin_writing( char *buf, int *cur_size, int max_size );
81 void msg_write_int8 ( int c );
82 void msg_write_int16 ( int s );
83 void msg_write_int32 ( int i );
84 void msg_write_string( char *str );
85 void msg_printf ( char *format, ... );
86 void msg_write ( int len, void *data );
87 int msg_get_max_size();
88 bool msg_write_failed(); /* check wether overflow occured */
89
90 bool msg_is_connectionless();
91 void msg_begin_reading(); /* of net_packet, starts at header */
92 void msg_begin_connectionless_reading(); /* of net_packet, starts after header as useless data */
93 int msg_read_int8 ( void );
94 int msg_read_int16( void );
95 int msg_read_int32( void );
96 char* msg_read_string( void );
97 void msg_read( int len, char *buf );
98 bool msg_read_failed(); /* check wether data couldn't be extracted */
99
100 void socket_init( NetSocket *sock, NetAddr *addr );
101 void socket_reinit( NetSocket *socket ); /* with same address */
102 void socket_print_stats( NetSocket *sock );
103
104 /* transmit a connectionless message */
105 void net_transmit_connectionless( NetAddr *addr, int len, char *data );
106
107 /* transmit CODE_RED/BLUE message and re-transmit dropped CODE_RED messages.
108 * length 0 messages are not transmitted but re-transmission of CODE_RED messages
109 * is handled in any case */
110 #define CODE_BLUE 0
111 #define CODE_RED 1
112 void socket_transmit( NetSocket *sock, int code, int len, char *data );
113
114 /* update socket by net_packet header if net_sender_addr is socket.remote_addr
115 * and set read pointer to packet payload. if false is returned packet is
116 * not parsed. */
117 bool socket_process_header( NetSocket *sock );
118
119 #endif
120
0 /***************************************************************************
1 parser.c - description
2 -------------------
3 begin : Sat Mar 9 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "parser.h"
20 #include "tools.h"
21
22 /*
23 ====================================================================
24 Error string.
25 ====================================================================
26 */
27 static char parser_sub_error[1024];
28 static char parser_error[1024];
29
30 /*
31 ====================================================================
32 This buffer is used to fully load resource files when the
33 compact format is used.
34 ====================================================================
35 */
36 enum { CBUFFER_SIZE = 131072 }; /* 128 KB */
37 static char cbuffer[CBUFFER_SIZE];
38 static char* cbuffer_pos = 0; /* position in cbuffer */
39
40 /*
41 ====================================================================
42 As we need constant strings sometimes we have to define a maximum
43 length for tokens.
44 ====================================================================
45 */
46 enum { PARSER_MAX_TOKEN_LENGTH = 1024 };
47
48 /*
49 ====================================================================
50 Locals
51 ====================================================================
52 */
53
54 /*
55 ====================================================================
56 Macro to shorten the fread call for a single character.
57 ====================================================================
58 */
59 #define FILE_READCHAR( file, c ) fread( &c, sizeof( char ), 1, file )
60
61 /*
62 ====================================================================
63 Find next newline in cbuffer and replace it with \0 and return the
64 pointer to the current line.
65 ====================================================================
66 */
67 static char* parser_get_next_line()
68 {
69 char *line = cbuffer_pos;
70 char *newpos;
71 if ( cbuffer_pos[0] == 0 )
72 return 0; /* completely read. no more lines. */
73 if ( ( newpos = strchr( cbuffer_pos, 10 ) ) == 0 )
74 cbuffer_pos += strlen( cbuffer_pos ); /* last line */
75 else {
76 cbuffer_pos = newpos + 1; /* set pointer to next line */
77 newpos[0] = 0; /* terminate current line */
78 }
79 return line;
80 }
81
82 /*
83 ====================================================================
84 Set parse error string: "file:line: error"
85 ====================================================================
86 */
87 static void parser_set_parse_error( char *fname, FILE *file, char *error )
88 {
89 int end, pos;
90 int line_count = 1;
91 char c;
92 end = ftell( file ); pos = 0;
93 fseek( file, 0, SEEK_SET );
94 while ( pos < end ) {
95 FILE_READCHAR( file, c ); pos++;
96 if ( c == 10 ) line_count++;
97 }
98 sprintf( parser_error, "%s: %i: %s",
99 fname, line_count, error );
100 }
101
102 /*
103 ====================================================================
104 Check if the given character occurs in the symbol list.
105 If the first symbol is ' ' it is used as wildcard for all
106 white-spaces.
107 ====================================================================
108 */
109 static int is_symbol( int c, char *symbols )
110 {
111 int i = 0;
112 if ( symbols[0] == ' ' && c <= 32 ) return 1;
113 while ( symbols[i] != 0 )
114 if ( c == symbols[i++] )
115 return 1;
116 return 0;
117 }
118
119 /*
120 ====================================================================
121 Move file position forward until reading in the given character.
122 If stop is ' ' whitespaces will be ignored.
123 ====================================================================
124 */
125 static void file_skip( FILE *file, char stop )
126 {
127 char c = 0;
128 FILE_READCHAR( file, c );
129 while ( ( ( stop == ' ' && c <= 32 ) || ( stop != ' ' && c != stop ) ) && !feof( file ) )
130 FILE_READCHAR( file, c );
131 if ( !feof( file ) )
132 fseek( file, -1, SEEK_CUR );
133 }
134
135 /*
136 ====================================================================
137 Read next token from current file position where symbols is a
138 list of characters used to break up the tokens. The symbols
139 themself are returned as tokens. If ' ' occurs in the symbol list
140 it will be ignored and whitespaces are removed automatically.
141 The token does not exceed PARSER_MAX_TOKEN_LENGTH.
142 Enclosing ".." are kept at the token. Use file_compare_token()
143 to test it's contents.
144 Returns False on EoF.
145 ====================================================================
146 */
147 static int file_read_token_intern( FILE *file, char *symbols, char *token )
148 {
149 int pos = 0;
150 char c;
151 token[0] = 0;
152 file_skip( file, ' ' );
153 FILE_READCHAR( file, c );
154 if ( feof( file ) ) {
155 sprintf( parser_sub_error, "unexpected end of file" );
156 return 0;
157 }
158 /* string? */
159 if ( c == '"' ) {
160 token[pos++] = '"';
161 FILE_READCHAR( file, c );
162 while ( ( !feof( file ) && c != '"' ) ) {
163 token[pos++] = c;
164 if ( pos == PARSER_MAX_TOKEN_LENGTH - 2 ) {
165 token[pos++] = '"';
166 token[pos] = 0;
167 sprintf( parser_sub_error, "token exceeds limit" );
168 return 0;
169 }
170 FILE_READCHAR( file, c );
171 }
172 token[pos++] = '"';
173 token[pos] = 0;
174 if ( feof( file ) ) {
175 sprintf( parser_sub_error, "unexpected end of file" );
176 token[0] = 0;
177 return 0;
178 }
179 return 1;
180 }
181 /* symbol? */
182 if ( is_symbol( c, symbols ) ) {
183 token[0] = c; token[1] = 0;
184 return 1;
185 }
186 /* other token */
187 while ( !is_symbol( c, symbols ) && !feof( file ) ) {
188 token[pos++] = c;
189 if ( pos == PARSER_MAX_TOKEN_LENGTH - 1 ) {
190 token[pos] = 0;
191 sprintf( parser_sub_error, "token exceeds limit" );
192 return 0;
193 }
194 FILE_READCHAR( file, c );
195 }
196 token[pos] = 0;
197 if ( feof( file ) )
198 return 1;
199 fseek( file, -1, SEEK_CUR );
200 return 1;
201 }
202
203 /*
204 ====================================================================
205 Skip all tokens until one begins with character 'stop'. This
206 token is also ignored.
207 ====================================================================
208 */
209 static void file_skip_section( FILE *file, char stop )
210 {
211 char token[PARSER_MAX_TOKEN_LENGTH];
212 do {
213 file_read_token_intern( file, PARSER_SYMBOLS, token );
214 } while ( !feof( file ) && token[0] != stop );
215 }
216
217 /*
218 ====================================================================
219 Read next token and skip comments enclosed in tokens
220 skip[0], skip[1] (if skip is not NULL).
221 Return 0 if EoF.
222 ====================================================================
223 */
224 static int file_read_token( FILE *file, char *symbols, char *skip, char *token )
225 {
226 while ( 1 ) {
227 if ( !file_read_token_intern( file, symbols, token ) )
228 return 0;
229 if ( skip ) {
230 if ( token[0] == skip[0] )
231 file_skip_section( file, skip[1] );
232 else
233 break;
234 }
235 else
236 break;
237 }
238 return 1;
239 }
240
241 /*
242 ====================================================================
243 Remove quotes if any and return result as newly allocated string.
244 ====================================================================
245 */
246 static char* parser_remove_quotes( char *string )
247 {
248 char *new;
249 if ( string[0] != '"' )
250 return strdup( string );
251 new = calloc( strlen( string ) - 1, sizeof( char ) );
252 strncpy( new, string + 1, strlen( string ) - 2 );
253 new[strlen( string ) - 2] = 0;
254 return new;
255 }
256
257 /*
258 ====================================================================
259 Proceed in the given string until it ends or non-whitespace occurs
260 and return the new position.
261 ====================================================================
262 */
263 static char* string_ignore_whitespace( char *string )
264 {
265 int i = 0;
266 while ( string[i] != 0 && string[i] <= 32 ) i++;
267 return string + i;
268 }
269
270 /*
271 ====================================================================
272 This function searches file from the current position for the next
273 pdata entry.
274 ====================================================================
275 */
276 static PData* parser_parse_file( FILE *file )
277 {
278 char token[PARSER_MAX_TOKEN_LENGTH];
279 PData *pd = 0, *sub = 0;
280
281 /* get name */
282 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
283 return 0;
284 if ( is_symbol( token[0], PARSER_SYMBOLS ) ) {
285 sprintf( parser_sub_error, "parse error before '%s'", token );
286 return 0;
287 }
288 pd = calloc( 1, sizeof( PData ) );
289 pd->name = parser_remove_quotes( token );
290 /* check type */
291 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
292 goto failure;
293 switch ( token[0] ) {
294 case PARSER_SET:
295 /* assign single value or list */
296 pd->values = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
297 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
298 goto failure;
299 if ( token[0] != PARSER_LIST_BEGIN ) {
300 if ( is_symbol( token[0], PARSER_SYMBOLS ) ) {
301 sprintf( parser_sub_error, "parse error before '%s'", token );
302 goto failure;
303 }
304 else
305 list_add( pd->values, parser_remove_quotes( token ) );
306 }
307 else {
308 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
309 goto failure;
310 while ( token[0] != PARSER_LIST_END ) {
311 if ( is_symbol( token[0], PARSER_SYMBOLS ) ) {
312 sprintf( parser_sub_error, "parse error before '%s'", token );
313 goto failure;
314 }
315 else
316 list_add( pd->values, parser_remove_quotes( token ) );
317 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
318 goto failure;
319 }
320 }
321 break;
322 case PARSER_GROUP_BEGIN:
323 /* check all entries until PARSER_GROUP_END */
324 pd->entries = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
325 while ( 1 ) {
326 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) )
327 goto failure;
328 if ( token[0] == PARSER_GROUP_END )
329 break;
330 fseek( file, -strlen( token ), SEEK_CUR );
331 sub = parser_parse_file( file );
332 if ( sub )
333 list_add( pd->entries, sub );
334 else
335 goto failure;
336 }
337 break;
338 default:
339 sprintf( parser_sub_error, "parse error before '%s'", token );
340 goto failure;
341 }
342 return pd;
343 failure:
344 parser_free( &pd );
345 return 0;
346 }
347
348 /*
349 ====================================================================
350 Publics
351 ====================================================================
352 */
353
354 /*
355 ====================================================================
356 This function splits a string into tokens using the characters
357 found in symbols as breakpoints. If the first symbol is ' ' all
358 whitespaces are used as breakpoints though NOT added as a token
359 (thus removed from string).
360 ====================================================================
361 */
362 List* parser_split_string( char *string, char *symbols )
363 {
364 int pos;
365 char *token = 0;
366 List *list = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
367 while ( string[0] != 0 ) {
368 if ( symbols[0] == ' ' )
369 string = string_ignore_whitespace( string );
370 if ( string[0] == 0 ) break;
371 pos = 1; /* 'read in' first character */
372 while ( string[pos - 1] != 0 && !is_symbol( string[pos - 1], symbols ) && string[pos - 1] != '"' ) pos++;
373 if ( pos > 1 )
374 pos--;
375 else
376 if ( string[pos - 1] == '"' ) {
377 /* read a string */
378 string = string + 1; pos = 0;
379 while ( string[pos] != 0 && string[pos] != '"' ) pos++;
380 token = calloc( pos + 1, sizeof( char ) );
381 strncpy( token, string, pos ); token[pos] = 0;
382 list_add( list, token );
383 string = string + pos + (string[pos] != 0);
384 continue;
385 }
386 token = calloc( pos + 1, sizeof( char ) );
387 strncpy( token, string, pos); token[pos] = 0;
388 list_add( list, token );
389 string = string + pos;
390 }
391 return list;
392 }
393 /*
394 ====================================================================
395 This is the light version of parser_split_string which checks for
396 just one character and does not add this glue characters to the
397 list. It's about 2% faster. Wow.
398 ====================================================================
399 */
400 List *parser_explode_string( char *string, char c )
401 {
402 List *list = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
403 char *next_slash = 0;
404 char buffer[64];
405 while ( string[0] != 0 && ( next_slash = strchr( string, c ) ) != 0 ) {
406 if ( next_slash != string ) {
407 strcpy_lt( buffer, string, (next_slash-string>63)?63:(next_slash-string) );
408 list_add( list, strdup( buffer ) );
409 }
410 string += next_slash - string + 1;
411 }
412 if ( string[0] != 0 )
413 list_add( list, strdup( string ) );
414 return list;
415 }
416
417 /*
418 ====================================================================
419 This function reads in a whole file and converts it into a
420 PData tree struct. If an error occurs NULL is returned and
421 parser_error is set.
422 ====================================================================
423 */
424 static int parser_read_file_full( FILE *file, PData *top )
425 {
426 PData *sub = 0;
427 char token[1024];
428 /* parse file */
429 while ( !feof( file ) ) {
430 if ( ( sub = parser_parse_file( file ) ) != 0 )
431 list_add( top->entries, sub );
432 else
433 return 0;
434 /* skip comments and whitespaces */
435 if ( !file_read_token( file, PARSER_SYMBOLS, PARSER_SKIP_SYMBOLS, token ) ) {
436 if ( token[0] != 0 )
437 return 0;
438 break;
439 }
440 else
441 fseek( file, -strlen( token ), SEEK_CUR );
442 }
443 return 1;
444 }
445 static int parser_read_file_compact( PData *section )
446 {
447 /* section is the parent pdata that needs some
448 entries */
449 PData *pd = 0;
450 char *line, *cur;
451 while ( ( line = parser_get_next_line() ) ) {
452 switch ( line[0] ) {
453 case '>':
454 /* this section is finished */
455 return 1;
456 case '<':
457 /* add a whole subsection */
458 pd = calloc( 1, sizeof( PData ) );
459 pd->name = strdup( line + 1 );
460 pd->entries = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
461 parser_read_file_compact( pd );
462 /* add to section */
463 list_add( section->entries, pd );
464 break;
465 default:
466 /* read values as subsection */
467 pd = calloc( 1, sizeof( PData ) );
468 /* check name */
469 if ( ( cur = strchr( line, '»' ) ) == 0 ) {
470 sprintf( parser_sub_error, "parse error: use '»' for assignment or '<' for section" );
471 return 0;
472 }
473 cur[0] = 0; cur++;
474 pd->name = strdup( line );
475 /* get values */
476 pd->values = parser_explode_string( cur, '°' );
477 /* add to section */
478 list_add( section->entries, pd );
479 break;
480 }
481 }
482 return 1;
483 }
484 PData* parser_read_file( char *tree_name, char *fname )
485 {
486 int size;
487 char magic = 0;
488 FILE *file = 0;
489 PData *top = 0;
490 /* open file */
491 if ( ( file = fopen( fname, "r" ) ) == 0 ) {
492 sprintf( parser_error, "%s: file not found", fname );
493 return 0;
494 }
495 /* create top level pdata */
496 top = calloc( 1, sizeof( PData ) );
497 top->name = strdup( tree_name );
498 top->entries = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
499 /* parse */
500 FILE_READCHAR( file, magic );
501 if ( magic == '@' ) {
502 /* get the whole contents -- 1 and CBUFFER_SIZE are switched */
503 fseek( file, 0, SEEK_END ); size = ftell( file ) - 2;
504 if ( size >= CBUFFER_SIZE ) {
505 fprintf( stderr, "%s: file's too big to fit the compact buffer (128KB)\n", fname );
506 size = CBUFFER_SIZE - 1;
507 }
508 fseek( file, 2, SEEK_SET );
509 fread( cbuffer, 1, size, file );
510 cbuffer[size] = 0;
511 /* set indicator to beginning of text */
512 cbuffer_pos = cbuffer;
513 /* parse cbuffer */
514 if ( !parser_read_file_compact( top ) ) {
515 parser_set_parse_error( fname, file, parser_sub_error );
516 goto failure;
517 }
518 }
519 else {
520 fseek( file, 0, SEEK_SET );
521 if ( !parser_read_file_full( file, top ) ) {
522 parser_set_parse_error( fname, file, parser_sub_error );
523 goto failure;
524 }
525 }
526 /* finalize */
527 fclose( file );
528 return top;
529 failure:
530 fclose( file );
531 parser_free( &top );
532 return 0;
533 }
534
535 /*
536 ====================================================================
537 This function frees a PData tree struct.
538 ====================================================================
539 */
540 void parser_free( PData **pdata )
541 {
542 PData *entry = 0;
543 if ( (*pdata) == 0 ) return;
544 if ( (*pdata)->name ) free( (*pdata)->name );
545 if ( (*pdata)->values ) list_delete( (*pdata)->values );
546 if ( (*pdata)->entries ) {
547 list_reset( (*pdata)->entries );
548 while ( ( entry = list_next( (*pdata)->entries ) ) )
549 parser_free( &entry );
550 list_delete( (*pdata)->entries );
551 }
552 free( *pdata ); *pdata = 0;
553 }
554
555 /*
556 ====================================================================
557 Functions to access a PData tree.
558 'name' is the pass within tree 'pd' where subtrees are separated
559 by '/' (e.g.: name = 'config/graphics/animations')
560 parser_get_pdata : get pdata entry associated with 'name'
561 parser_get_entries : get list of subtrees (PData structs) in 'name'
562 parser_get_values : get value list of 'name'
563 parser_get_value : get a single value from value list of 'name'
564 parser_get_int : get first value of 'name' converted to integer
565 parser_get_double : get first value of 'name' converted to double
566 parser_get_string : get first value of 'name' _duplicated_
567 If an error occurs result is set NULL, False is returned and
568 parse_error is set.
569 ====================================================================
570 */
571 int parser_get_pdata ( PData *pd, char *name, PData **result )
572 {
573 int i, found;
574 PData *pd_next = pd;
575 PData *entry = 0;
576 char *sub = 0;
577 List *path = parser_explode_string( name, '/' );
578 for ( i = 0, list_reset( path ); i < path->count; i++ ) {
579 sub = list_next( path );
580 if ( !pd_next->entries ) {
581 sprintf( parser_sub_error, "%s: no subtrees", pd_next->name );
582 goto failure;
583 }
584 list_reset( pd_next->entries ); found = 0;
585 while ( ( entry = list_next( pd_next->entries ) ) )
586 if ( strlen( entry->name ) == strlen( sub ) && !strncmp( entry->name, sub, strlen( sub ) ) ) {
587 pd_next = entry;
588 found = 1;
589 break;
590 }
591 if ( !found ) {
592 sprintf( parser_sub_error, "%s: subtree '%s' not found", pd_next->name, sub );
593 goto failure;
594 }
595 }
596 list_delete( path );
597 *result = pd_next;
598 return 1;
599 failure:
600 sprintf( parser_error, "parser_get_pdata: %s/%s: %s", pd->name, name, parser_sub_error );
601 list_delete( path );
602 *result = 0;
603 return 0;
604 }
605 int parser_get_entries( PData *pd, char *name, List **result )
606 {
607 PData *entry;
608 *result = 0;
609 if ( !parser_get_pdata( pd, name, &entry ) ) {
610 sprintf( parser_sub_error, "parser_get_entries:\n %s", parser_error );
611 strcpy( parser_error, parser_sub_error );
612 return 0;
613 }
614 if ( !entry->entries || entry->entries->count == 0 ) {
615 sprintf( parser_error, "parser_get_entries: %s/%s: no subtrees", pd->name, name );
616 return 0;
617 }
618 *result = entry->entries;
619 return 1;
620 }
621 int parser_get_values ( PData *pd, char *name, List **result )
622 {
623 PData *entry;
624 *result = 0;
625 if ( !parser_get_pdata( pd, name, &entry ) ) {
626 sprintf( parser_sub_error, "parser_get_values:\n %s", parser_error );
627 strcpy( parser_error, parser_sub_error );
628 return 0;
629 }
630 if ( !entry->values || entry->values->count == 0 ) {
631 sprintf( parser_error, "parser_get_values: %s/%s: no values", pd->name, name );
632 return 0;
633 }
634 *result = entry->values;
635 return 1;
636 }
637 int parser_get_value ( PData *pd, char *name, char **result, int index )
638 {
639 List *values;
640 if ( !parser_get_values( pd, name, &values ) ) {
641 sprintf( parser_sub_error, "parser_get_value:\n %s", parser_error );
642 strcpy( parser_error, parser_sub_error );
643 return 0;
644 }
645 if ( index >= values->count ) {
646 sprintf( parser_error, "parser_get_value: %s/%s: index %i out of range (%i elements)",
647 pd->name, name, index, values->count );
648 return 0;
649 }
650 *result = list_get( values, index );
651 return 1;
652 }
653 int parser_get_int ( PData *pd, char *name, int *result )
654 {
655 char *value;
656 if ( !parser_get_value( pd, name, &value, 0 ) ) {
657 sprintf( parser_sub_error, "parser_get_int:\n %s", parser_error );
658 strcpy( parser_error, parser_sub_error );
659 return 0;
660 }
661 *result = atoi( value );
662 return 1;
663 }
664 int parser_get_double ( PData *pd, char *name, double *result )
665 {
666 char *value;
667 if ( !parser_get_value( pd, name, &value, 0 ) ) {
668 sprintf( parser_sub_error, "parser_get_double:\n %s", parser_error );
669 strcpy( parser_error, parser_sub_error );
670 return 0;
671 }
672 *result = strtod( value, 0 );
673 return 1;
674 }
675 int parser_get_string ( PData *pd, char *name, char **result )
676 {
677 char *value;
678 if ( !parser_get_value( pd, name, &value, 0 ) ) {
679 sprintf( parser_sub_error, "parser_get_string:\n %s", parser_error );
680 strcpy( parser_error, parser_sub_error );
681 return 0;
682 }
683 *result = strdup( value );
684 return 1;
685 }
686
687 /*
688 ====================================================================
689 If an error occurred you can query the reason with this function.
690 ====================================================================
691 */
692 char* parser_get_error( void )
693 {
694 return parser_error;
695 }
696
0 /***************************************************************************
1 parser.h - description
2 -------------------
3 begin : Sat Mar 9 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17
18 #ifndef __PARSER_H
19 #define __PARSER_H
20
21 #include "list.h"
22 #include <stdio.h>
23
24 /*
25 ====================================================================
26 This module provides functions to parse ASCII data from strings
27 and files.
28 Synopsis:
29 groupname <begin group> entry1 .. entryX <end group>
30 variable <set> value
31 A group entry may either be a variable or a group (interlacing).
32 A variable value may either be a single token or a list of tokens
33 enclosed by <begin list> <end list>.
34 Text enclosed by ".." is counted as a single token.
35 ====================================================================
36 */
37
38 /*
39 ====================================================================
40 Symbols.
41 Note: These symbols are ignored when found in a token "<expression>"
42 as they belong to this token then.
43 PARSER_GROUP_BEGIN: <begin group>
44 PARSER_GROUP_END: <end group>
45 PARSER_SET: <set>
46 PARSER_LIST_BEGIN: <begin list>
47 PARSER_LIST_END: <end list>
48 PARSER_COMMENT_BEGIN: <begin comment>
49 PARSER_COMMENT_END: <end comment>
50 PARSER_SYMBOLS: List of all symbols + whitespace used to
51 split strings and tokens.
52 PARSER_SKIP_SYMBOLS: text bewteen these two symbols is handled as
53 comment and therefore completely ignored
54 ====================================================================
55 */
56 #define PARSER_GROUP_BEGIN '{'
57 #define PARSER_GROUP_END '}'
58 #define PARSER_SET '='
59 #define PARSER_LIST_BEGIN '('
60 #define PARSER_LIST_END ')'
61 #define PARSER_COMMENT_BEGIN '['
62 #define PARSER_COMMENT_END ']'
63 #define PARSER_SYMBOLS " =(){}[]"
64 #define PARSER_SKIP_SYMBOLS "[]"
65
66 /*
67 ====================================================================
68 An input string is converted into a PData tree struct.
69 The name identifies this entry and it's the token that is searched
70 for when reading this entry.
71 Either 'values' or 'entries' is set.
72 If 'entries' is not NULL the PData is a group and 'entries'
73 contains pointers to other groups or lists.
74 If 'values' is not NULL the PData is a list and 'values' contains
75 a list of value strings associated with 'name'.
76 ====================================================================
77 */
78 typedef struct {
79 char *name;
80 List *values;
81 List *entries;
82 } PData;
83
84 /*
85 ====================================================================
86 This function splits a string into tokens using the characters
87 found in symbols as breakpoints. If the first symbol is ' ' all
88 whitespaces are used as breakpoints though NOT added as a token
89 (thus removed from string).
90 ====================================================================
91 */
92 List* parser_split_string( char *string, char *symbols );
93 /*
94 ====================================================================
95 This is the light version of parser_split_string which checks for
96 just one character and does not add this glue characters to the
97 list. It's about 2% faster. Wow.
98 ====================================================================
99 */
100 List *parser_explode_string( char *string, char c );
101
102 /*
103 ====================================================================
104 This function reads in a whole file and converts it into a
105 PData tree struct. If an error occurs NULL is returned and
106 parser_error is set. 'tree_name' is the name of the PData tree.
107 ====================================================================
108 */
109 PData* parser_read_file( char *tree_name, char *fname );
110
111 /*
112 ====================================================================
113 This function frees a PData tree struct.
114 ====================================================================
115 */
116 void parser_free( PData **pdata );
117
118 /*
119 ====================================================================
120 Functions to access a PData tree.
121 'name' is the pass within tree 'pd' where subtrees are separated
122 by '/' (e.g.: name = 'config/graphics/animations')
123 parser_get_pdata : get pdata entry associated with 'name'
124 parser_get_entries : get list of subtrees (PData structs) in 'name'
125 parser_get_values : get value list of 'name'
126 parser_get_value : get a single value from value list of 'name'
127 parser_get_int : get first value of 'name' converted to integer
128 parser_get_double : get first value of 'name' converted to double
129 parser_get_string : get first value of 'name' _duplicated_
130 If an error occurs result is set NULL, False is returned and
131 parse_error is set.
132 ====================================================================
133 */
134 int parser_get_pdata ( PData *pd, char *name, PData **result );
135 int parser_get_entries( PData *pd, char *name, List **result );
136 int parser_get_values ( PData *pd, char *name, List **result );
137 int parser_get_value ( PData *pd, char *name, char **result, int index );
138 int parser_get_int ( PData *pd, char *name, int *result );
139 int parser_get_double ( PData *pd, char *name, double *result );
140 int parser_get_string ( PData *pd, char *name, char **result );
141
142 /*
143 ====================================================================
144 If an error occurred you can query the message with this function.
145 ====================================================================
146 */
147 char* parser_get_error( void );
148
149 #endif
0 /***************************************************************************
1 tools.c - description
2 -------------------
3 begin : Fri Jan 19 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <time.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <stdio.h>
21 #include "tools.h"
22
23 /* compares to strings and returns true if their first strlen(str1) chars are equal */
24 inline int strequal( char *str1, char *str2 )
25 {
26 if ( strlen( str1 ) != strlen( str2 ) ) return 0;
27 return ( !strncmp( str1, str2, strlen( str1 ) ) );
28 }
29
30 /* set delay to ms milliseconds */
31 inline void delay_set( Delay *delay, int ms )
32 {
33 delay->limit = ms;
34 delay->cur = 0;
35 }
36
37 /* reset delay ( cur = 0 )*/
38 inline void delay_reset( Delay *delay )
39 {
40 delay->cur = 0;
41 }
42
43 /* check if times out and reset */
44 inline int delay_timed_out( Delay *delay, int ms )
45 {
46 delay->cur += ms;
47 if ( delay->cur >= delay->limit ) {
48
49 delay->cur = 0;
50 return 1;
51
52 }
53 return 0;
54 }
55
56
57 inline void goto_tile( int *x, int *y, int d )
58 {
59 /* 0 -up, clockwise, 5 - left up */
60 switch ( d ) {
61
62 case 1:
63 if ( !( (*x) & 1 ) )
64 (*y)--;
65 (*x)++;
66 break;
67 case 2:
68 if ( (*x) & 1 )
69 (*y)++;
70 (*x)++;
71 break;
72 case 4:
73 if ( (*x) & 1 )
74 (*y)++;
75 (*x)--;
76 break;
77 case 5:
78 if ( !( (*x) & 1 ) )
79 (*y)--;
80 (*x)--;
81 break;
82
83 }
84 }
85
86 /* return distance between to map positions */
87 int get_dist( int x1, int y1, int x2, int y2 )
88 {
89 int range = 0;
90
91 while ( x1 != x2 || y1 != y2 ) {
92
93 /* approach to x2,y2 */
94 /* 0 -up, clockwise, 5 - left up */
95 if ( y1 < y2 ) {
96
97 if ( x1 < x2 )
98 goto_tile( &x1, &y1, 2 );
99 else
100 if ( x1 > x2 )
101 goto_tile( &x1, &y1, 4 );
102 else
103 y1++;
104
105 }
106 else
107 if ( y1 > y2 ) {
108
109 if ( x1 < x2 )
110 goto_tile( &x1, &y1, 1 );
111 else
112 if ( x1 > x2 )
113 goto_tile( &x1, &y1, 5 );
114 else
115 y1--;
116
117 }
118 else {
119
120 if ( x1 < x2 )
121 x1++;
122 else
123 if ( x1 > x2 )
124 x1--;
125
126 }
127
128 range++;
129 }
130
131 return range;
132 }
133
134 /* init random seed by using ftime */
135 void set_random_seed()
136 {
137 srand( (unsigned int)time( 0 ) );
138 }
139
140 /* get coordinates from string */
141 void get_coord( char *str, int *x, int *y )
142 {
143 int i;
144 char *cur_arg = 0;
145
146 *x = *y = 0;
147
148 /* get position of comma */
149 for ( i = 0; i < strlen( str ); i++ )
150 if ( str[i] == ',' ) break;
151 if ( i == strlen( str ) ) {
152 fprintf( stderr, "get_coord: no comma found in pair of coordinates '%s'\n", str );
153 return; /* no comma found */
154 }
155
156 /* y */
157 cur_arg = str + i + 1;
158 if ( cur_arg[0] == 0 )
159 fprintf( stderr, "get_coord: warning: y-coordinate is empty (maybe you left a space between x and comma?)\n" );
160 *y = atoi( cur_arg );
161 /* x */
162 cur_arg = strdup( str ); cur_arg[i] = 0;
163 *x = atoi( cur_arg );
164 FREE( cur_arg );
165 }
166
167 /* replace new_lines with spaces in text */
168 void repl_new_lines( char *text )
169 {
170 int i;
171 for ( i = 0; i < strlen( text ); i++ )
172 if ( text[i] < 32 )
173 text[i] = 32;
174 }
175
176 // convert a str into text ( for listbox ) //
177 // char width is the width of a line in characters //
178 Text* create_text( char *orig_str, int char_width )
179 {
180 int i, j;
181 char line[256]; /* a line should not exceed this length */
182 int pos;
183 int last_space;
184 int new_line;
185 Text *text = 0;
186 char *str = 0;
187
188 text = calloc ( 1, sizeof( Text ) );
189
190 // maybe orig_str is a constant expression; duplicate for safety //
191 str = strdup( orig_str );
192
193 // replace original new_lines with spaces //
194 repl_new_lines( str );
195
196 /* change some spaces to new_lines, so that the new text fits the wanted line_length */
197 /* NOTE: '#' means new_line ! */
198 // if character with is 0 it's just a single line //
199 if ( char_width > 0 ) {
200 pos = 0;
201 while ( pos < strlen( str ) ) {
202 last_space = 0;
203 new_line = 0;
204 i = 0;
205 while ( !new_line && i < char_width && i + pos < strlen( str ) ) {
206 switch ( str[pos + i] ) {
207 case '#': new_line = 1;
208 case 32: last_space = i; break;
209 }
210 i++;
211 }
212 if ( i + pos >= strlen( str ) ) break;
213 if ( last_space == 0 ) {
214 /* uhh... much to long, we'll have to cut a word into pieces ... */
215 last_space = char_width / 2;
216 }
217 str[pos + last_space] = 10;
218 pos += last_space;
219 }
220 }
221
222 /* count lines */
223 if ( char_width > 0 ) {
224 for ( i = 0; i < strlen( str ); i++ )
225 if ( str[i] == 10 )
226 text->count++;
227 /* maybe one unfinished line */
228 if ( str[strlen( str ) - 1] != 10 )
229 text->count++;
230 }
231 else
232 text->count = 1;
233
234 /* get mem */
235 text->lines = calloc( text->count, sizeof( char* ) );
236
237 pos = 0;
238 /* get all lines */
239 for ( j = 0; j < text->count; j++ ) {
240 i = 0;
241 while ( pos + i < strlen( str ) && str[pos + i] != 10 ) {
242 line[i] = str[i + pos];
243 i++;
244 }
245 pos += i; pos++;
246 line[i] = 0;
247 text->lines[j] = strdup( line );
248 }
249
250 if ( text->count == 0 )
251 fprintf( stderr, "conv_to_text: warning: line_count is 0\n" );
252
253 free( str );
254
255 return text;
256 }
257
258 // delete text //
259 void delete_text( Text *text )
260 {
261 int i;
262
263 if ( text == 0 ) return;
264 /*
265 if ( lines[1][1] == 'e' && lines[1][0] == '<' )
266 printf( "hallo\n" );
267
268 printf( "--- deleting:\n" );
269 for ( i = 0; i < line_count; i++ ) {
270 printf( lines[i] );
271 printf( "\n" );
272 }*/
273 if ( text->lines ) {
274 for ( i = 0; i < text->count; i++ )
275 if ( text->lines[i] )
276 free( text->lines[i] );
277 free( text->lines );
278 }
279 free( text );
280 }
281
282 /*
283 ====================================================================
284 Get type and prefix from string:
285 type::prefix
286 Set both pointers 0 if failure.
287 ====================================================================
288 */
289 void get_type_and_prefix( char *arg, char **type, char **prefix )
290 {
291 char *first, *second;
292
293 *type = *prefix = 0;
294
295 first = strtok( arg, ":" );
296 second = strtok( 0, ":" );
297
298 if ( first == 0 || second == 0 ) return;
299
300 *type = strdup( first );
301 *prefix = strdup( second );
302 }
303
304 /*
305 ====================================================================
306 Replace any existence of character old into new.
307 ====================================================================
308 */
309 void strrepl( char **str, char c_old, char c_new )
310 {
311 char *pos;
312 while ( ( pos = strchr( *str, c_old ) ) != 0 )
313 pos[0] = c_new;
314 }
315
316 /*
317 ====================================================================
318 Copy source to dest and at maximum limit chars. Terminate with 0.
319 ====================================================================
320 */
321 void strcpy_lt( char *dest, char *src, int limit )
322 {
323 int len = strlen( src );
324 if ( len > limit ) {
325 strncpy( dest, src, limit );
326 dest[limit] = 0;
327 }
328 else
329 strcpy( dest, src );
330 }
331
332 /*
333 ====================================================================
334 Parse a version string and return the major version and the current
335 update.
336 ====================================================================
337 */
338 void parse_version( char *string, int *version, int *update )
339 {
340 char *ptr = strchr( string, '.' );
341 if ( ptr ) ptr[0] = 0;
342 *version = atoi( string );
343 if ( ptr ) {
344 ptr++;
345 *update = atoi( ptr );
346 if ( *update < 10 && ptr[0] != '0' )
347 *update *= 10; /* allow stuff like 1.01 */
348 ptr--;
349 ptr[0] = '.';
350 }
351 else
352 *update = 0;
353 }
354
355 /* allocate memory or exit with error if out of it */
356 void *salloc( int num, int size )
357 {
358 void *ptr = calloc( num, size );
359 if ( ptr == 0 ) {
360 printf( "out of memory\n" );
361 exit(1);
362 }
363 return ptr;
364 }
365
366 /* print contents of pointer raw */
367 void print_raw( int len, char *buf )
368 {
369 int i;
370 for ( i = 0; i < len; i++ )
371 printf( "%02x ", (unsigned char) buf[i] );
372 printf( "\n" );
373 }
374
375 /* check whether a string does only contain letters, digits or
376 * underscores */
377 int is_alphanum( char *str )
378 {
379 int i;
380 for ( i = 0; i< strlen(str); i++ )
381 if ( !((str[i]>=48&&str[i]<=57)||(str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)||str[i]=='_') )
382 return 0;
383 return 1;
384 }
385
386
0 /***************************************************************************
1 tools.h - description
2 -------------------
3 begin : Fri Jan 19 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __TOOLS_H
18 #define __TOOLS_H
19
20 /* this file contains some useful tools */
21
22 /* free with a check */
23 #define FREE( ptr ) { if ( ptr ) free( ptr ); ptr = 0; }
24
25 /* check if a serious of flags is set in source */
26 #define CHECK_FLAGS( source, flags ) ( source & (flags) )
27
28 /* return random value between ( and including ) upper,lower limit */
29 #define RANDOM( lower, upper ) ( ( rand() % ( ( upper ) - ( lower ) + 1 ) ) + ( lower ) )
30
31 /* compute distance of two vectors */
32 #define VEC_DIST( vec1, vec2 ) ( sqrt( ( vec1.x - vec2.x ) * ( vec1.x - vec2.x ) + ( vec1.y - vec2.y ) * ( vec1.y - vec2.y ) ) )
33
34 /* return true if strings are fully equal */
35 #define STRCMP( str1, str2 ) ( ( strlen( str1 ) == strlen( str2 ) ) && !strncmp( str1, str2, strlen( str1 ) ) )
36
37 /* return minimum */
38 #define MINIMUM( a, b ) ((a<b)?a:b)
39
40 /* return maximum */
41 #define MAXIMUM( a, b ) ((a>b)?a:b)
42
43 /* square value */
44 #define SQUARE( x ) ((x)*(x))
45
46 /* compares to strings and returns true if their first strlen(str1) chars are equal */
47 inline int strequal( char *str1, char *str2 );
48
49 /* delete lines */
50 void delete_lines( char **lines, int line_number );
51
52 /* delay struct */
53 typedef struct {
54 int limit;
55 int cur;
56 } Delay;
57
58 /* set delay to ms milliseconds */
59 inline void delay_set( Delay *delay, int ms );
60
61 /* reset delay ( cur = 0 )*/
62 inline void delay_reset( Delay *delay );
63
64 /* check if time's out ( add ms milliseconds )and reset */
65 inline int delay_timed_out( Delay *delay, int ms );
66
67 /* return distance betwteen to map positions */
68 int get_dist( int x1, int y1, int x2, int y2 );
69
70 /* init random seed by using ftime */
71 void set_random_seed();
72
73 /* get coordintaes from string */
74 void get_coord( char *str, int *x, int *y );
75
76 // text structure //
77 typedef struct {
78 char **lines;
79 int count;
80 } Text;
81 // convert a str into text ( for listbox ) //
82 Text* create_text( char *str, int char_width );
83 // delete text //
84 void delete_text( Text *text );
85
86 /*
87 ====================================================================
88 Get type and prefix from string:
89 type::prefix
90 Set both pointers 0 if failure.
91 ====================================================================
92 */
93 void get_type_and_prefix( char *arg, char **ext, char **prefix );
94
95 /*
96 ====================================================================
97 Replace any existence of character old into new.
98 ====================================================================
99 */
100 void strrepl( char **str, char c_old, char c_new );
101
102 /*
103 ====================================================================
104 Copy source to dest and at maximum limit chars. Terminate with 0.
105 ====================================================================
106 */
107 void strcpy_lt( char *dest, char *src, int limit );
108
109 /*
110 ====================================================================
111 Parse a version string and return the major version and the current
112 update.
113 ====================================================================
114 */
115 void parse_version( char *string, int *version, int *update );
116
117
118 /* allocate memory or exit with error if out of it */
119 void *salloc( int num, int size );
120
121 /* print contents of pointer raw */
122 void print_raw( int len, char *buf );
123
124 /* check whether a string does only contain letters, digits or
125 * underscores */
126 int is_alphanum( char *str );
127
128 #endif
+0
-50
comp.bat less more
0 @echo off
1 del *.o lbreakout2.exe
2 set INCLUDES=-IX:\include\SDL\
3 set DEFS=-DSRC_DIR=\"lgames\" -DHI_DIR=\"lgames\" -DVERSION=\"2.2.2\" -DSDL_1_1_5
4 -DSOUND
5 set CC=gcc
6 set CFLAGS=-g -Wall -c
7 rem DEFS = @warp_flag@ @sound_flag@ @inst_flag@ @hi_inst_flag@
8 rem MOUSE_WARP SOUND SRC_DIR HI_DIR
9 set bin_PROGRAMS=lbreakout2
10 echo Compiling %bin_PROGRAMS%
11
12 %CC% %CFLAGS% audio.c %INCLUDES% %DEFS%
13 %CC% %CFLAGS% balls.c %INCLUDES% %DEFS%
14 %CC% %CFLAGS% bricks.c %INCLUDES% %DEFS%
15 %CC% %CFLAGS% chart.c %INCLUDES% %DEFS%
16 %CC% %CFLAGS% config.c %INCLUDES% %DEFS%
17 %CC% %CFLAGS% credit.c %INCLUDES% %DEFS%
18 %CC% %CFLAGS% difficulty.c %INCLUDES% %DEFS%
19 %CC% %CFLAGS% editor.c %INCLUDES% %DEFS%
20 %CC% %CFLAGS% event.c %INCLUDES% %DEFS%
21 %CC% %CFLAGS% extras.c %INCLUDES% %DEFS%
22 %CC% %CFLAGS% file.c %INCLUDES% %DEFS%
23 %CC% %CFLAGS% frame.c %INCLUDES% %DEFS%
24 %CC% %CFLAGS% game.c %INCLUDES% %DEFS%
25 %CC% %CFLAGS% help.c %INCLUDES% %DEFS%
26 %CC% %CFLAGS% hint.c %INCLUDES% %DEFS%
27 %CC% %CFLAGS% item.c %INCLUDES% %DEFS%
28 %CC% %CFLAGS% levels.c %INCLUDES% %DEFS%
29 %CC% %CFLAGS% list.c %INCLUDES% %DEFS%
30 %CC% %CFLAGS% main.c %INCLUDES% %DEFS%
31 %CC% %CFLAGS% manager.c %INCLUDES% %DEFS%
32 %CC% %CFLAGS% menu.c %INCLUDES% %DEFS%
33 %CC% %CFLAGS% misc.c %INCLUDES% %DEFS%
34 %CC% %CFLAGS% paddle.c %INCLUDES% %DEFS%
35 %CC% %CFLAGS% player.c %INCLUDES% %DEFS%
36 %CC% %CFLAGS% sdl.c %INCLUDES% %DEFS%
37 %CC% %CFLAGS% shine.c %INCLUDES% %DEFS%
38 %CC% %CFLAGS% shots.c %INCLUDES% %DEFS%
39 %CC% %CFLAGS% shrapnells.c %INCLUDES% %DEFS%
40 %CC% %CFLAGS% tools.c %INCLUDES% %DEFS%
41 %CC% %CFLAGS% value.c %INCLUDES% %DEFS%
42
43 gcc -o %bin_PROGRAMS% -mwindows audio.o balls.o bricks.o chart.o config.o
44 credit.o difficulty.o editor.o event.o extras.o file.o frame.o game.o
45 help.o hint.o item.o levels.o list.o main.o manager.o menu.o misc.o
46 paddle.o player.o shine.o shots.o shrapnells.o tools.o value.o sdl.o
47 -Wl,-u,_WinMain@16 -lSDLmain -lSDL -lSDLmixer -lpng -lSDLimage
48
49 strip lbreakout2.exe
0 #! /bin/sh
1 # Attempt to guess a canonical system name.
2 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 # Free Software Foundation, Inc.
4
5 timestamp='2001-09-04'
6
7 # This file is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #
21 # As a special exception to the GNU General Public License, if you
22 # distribute this file as part of a program that contains a
23 # configuration script generated by Autoconf, you may include it under
24 # the same distribution terms that you use for the rest of that program.
25
26 # Written by Per Bothner <bothner@cygnus.com>.
27 # Please send patches to <config-patches@gnu.org>.
28 #
29 # This script attempts to guess a canonical system name similar to
30 # config.sub. If it succeeds, it prints the system name on stdout, and
31 # exits with 0. Otherwise, it exits with 1.
32 #
33 # The plan is that this can be called by configure scripts if you
34 # don't specify an explicit build system type.
35
36 me=`echo "$0" | sed -e 's,.*/,,'`
37
38 usage="\
39 Usage: $0 [OPTION]
40
41 Output the configuration name of the system \`$me' is run on.
42
43 Operation modes:
44 -h, --help print this help, then exit
45 -t, --time-stamp print date of last modification, then exit
46 -v, --version print version number, then exit
47
48 Report bugs and patches to <config-patches@gnu.org>."
49
50 version="\
51 GNU config.guess ($timestamp)
52
53 Originally written by Per Bothner.
54 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
55 Free Software Foundation, Inc.
56
57 This is free software; see the source for copying conditions. There is NO
58 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
59
60 help="
61 Try \`$me --help' for more information."
62
63 # Parse command line
64 while test $# -gt 0 ; do
65 case $1 in
66 --time-stamp | --time* | -t )
67 echo "$timestamp" ; exit 0 ;;
68 --version | -v )
69 echo "$version" ; exit 0 ;;
70 --help | --h* | -h )
71 echo "$usage"; exit 0 ;;
72 -- ) # Stop option processing
73 shift; break ;;
74 - ) # Use stdin as input.
75 break ;;
76 -* )
77 echo "$me: invalid option $1$help" >&2
78 exit 1 ;;
79 * )
80 break ;;
81 esac
82 done
83
84 if test $# != 0; then
85 echo "$me: too many arguments$help" >&2
86 exit 1
87 fi
88
89
90 dummy=dummy-$$
91 trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
92
93 # CC_FOR_BUILD -- compiler used by this script.
94 # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
95 # use `HOST_CC' if defined, but it is deprecated.
96
97 set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
98 ,,) echo "int dummy(){}" > $dummy.c ;
99 for c in cc gcc c89 ; do
100 ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
101 if test $? = 0 ; then
102 CC_FOR_BUILD="$c"; break ;
103 fi ;
104 done ;
105 rm -f $dummy.c $dummy.o $dummy.rel ;
106 if test x"$CC_FOR_BUILD" = x ; then
107 CC_FOR_BUILD=no_compiler_found ;
108 fi
109 ;;
110 ,,*) CC_FOR_BUILD=$CC ;;
111 ,*,*) CC_FOR_BUILD=$HOST_CC ;;
112 esac'
113
114 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
115 # (ghazi@noc.rutgers.edu 1994-08-24)
116 if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
117 PATH=$PATH:/.attbin ; export PATH
118 fi
119
120 UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
121 UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
122 UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
123 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
124
125 # Note: order is significant - the case branches are not exclusive.
126
127 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
128 *:NetBSD:*:*)
129 # Netbsd (nbsd) targets should (where applicable) match one or
130 # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
131 # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
132 # switched to ELF, *-*-netbsd* would select the old
133 # object file format. This provides both forward
134 # compatibility and a consistent mechanism for selecting the
135 # object file format.
136 # Determine the machine/vendor (is the vendor relevant).
137 case "${UNAME_MACHINE}" in
138 amiga) machine=m68k-unknown ;;
139 arm32) machine=arm-unknown ;;
140 atari*) machine=m68k-atari ;;
141 sun3*) machine=m68k-sun ;;
142 mac68k) machine=m68k-apple ;;
143 macppc) machine=powerpc-apple ;;
144 hp3[0-9][05]) machine=m68k-hp ;;
145 ibmrt|romp-ibm) machine=romp-ibm ;;
146 *) machine=${UNAME_MACHINE}-unknown ;;
147 esac
148 # The Operating System including object format, if it has switched
149 # to ELF recently, or will in the future.
150 case "${UNAME_MACHINE}" in
151 i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
152 eval $set_cc_for_build
153 if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
154 | grep __ELF__ >/dev/null
155 then
156 # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
157 # Return netbsd for either. FIX?
158 os=netbsd
159 else
160 os=netbsdelf
161 fi
162 ;;
163 *)
164 os=netbsd
165 ;;
166 esac
167 # The OS release
168 release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
169 # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
170 # contains redundant information, the shorter form:
171 # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
172 echo "${machine}-${os}${release}"
173 exit 0 ;;
174 alpha:OSF1:*:*)
175 if test $UNAME_RELEASE = "V4.0"; then
176 UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
177 fi
178 # A Vn.n version is a released version.
179 # A Tn.n version is a released field test version.
180 # A Xn.n version is an unreleased experimental baselevel.
181 # 1.2 uses "1.2" for uname -r.
182 cat <<EOF >$dummy.s
183 .data
184 \$Lformat:
185 .byte 37,100,45,37,120,10,0 # "%d-%x\n"
186
187 .text
188 .globl main
189 .align 4
190 .ent main
191 main:
192 .frame \$30,16,\$26,0
193 ldgp \$29,0(\$27)
194 .prologue 1
195 .long 0x47e03d80 # implver \$0
196 lda \$2,-1
197 .long 0x47e20c21 # amask \$2,\$1
198 lda \$16,\$Lformat
199 mov \$0,\$17
200 not \$1,\$18
201 jsr \$26,printf
202 ldgp \$29,0(\$26)
203 mov 0,\$16
204 jsr \$26,exit
205 .end main
206 EOF
207 eval $set_cc_for_build
208 $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
209 if test "$?" = 0 ; then
210 case `./$dummy` in
211 0-0)
212 UNAME_MACHINE="alpha"
213 ;;
214 1-0)
215 UNAME_MACHINE="alphaev5"
216 ;;
217 1-1)
218 UNAME_MACHINE="alphaev56"
219 ;;
220 1-101)
221 UNAME_MACHINE="alphapca56"
222 ;;
223 2-303)
224 UNAME_MACHINE="alphaev6"
225 ;;
226 2-307)
227 UNAME_MACHINE="alphaev67"
228 ;;
229 2-1307)
230 UNAME_MACHINE="alphaev68"
231 ;;
232 esac
233 fi
234 rm -f $dummy.s $dummy
235 echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
236 exit 0 ;;
237 Alpha\ *:Windows_NT*:*)
238 # How do we know it's Interix rather than the generic POSIX subsystem?
239 # Should we change UNAME_MACHINE based on the output of uname instead
240 # of the specific Alpha model?
241 echo alpha-pc-interix
242 exit 0 ;;
243 21064:Windows_NT:50:3)
244 echo alpha-dec-winnt3.5
245 exit 0 ;;
246 Amiga*:UNIX_System_V:4.0:*)
247 echo m68k-unknown-sysv4
248 exit 0;;
249 amiga:OpenBSD:*:*)
250 echo m68k-unknown-openbsd${UNAME_RELEASE}
251 exit 0 ;;
252 *:[Aa]miga[Oo][Ss]:*:*)
253 echo ${UNAME_MACHINE}-unknown-amigaos
254 exit 0 ;;
255 arc64:OpenBSD:*:*)
256 echo mips64el-unknown-openbsd${UNAME_RELEASE}
257 exit 0 ;;
258 arc:OpenBSD:*:*)
259 echo mipsel-unknown-openbsd${UNAME_RELEASE}
260 exit 0 ;;
261 hkmips:OpenBSD:*:*)
262 echo mips-unknown-openbsd${UNAME_RELEASE}
263 exit 0 ;;
264 pmax:OpenBSD:*:*)
265 echo mipsel-unknown-openbsd${UNAME_RELEASE}
266 exit 0 ;;
267 sgi:OpenBSD:*:*)
268 echo mips-unknown-openbsd${UNAME_RELEASE}
269 exit 0 ;;
270 wgrisc:OpenBSD:*:*)
271 echo mipsel-unknown-openbsd${UNAME_RELEASE}
272 exit 0 ;;
273 *:OS/390:*:*)
274 echo i370-ibm-openedition
275 exit 0 ;;
276 arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
277 echo arm-acorn-riscix${UNAME_RELEASE}
278 exit 0;;
279 SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
280 echo hppa1.1-hitachi-hiuxmpp
281 exit 0;;
282 Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
283 # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
284 if test "`(/bin/universe) 2>/dev/null`" = att ; then
285 echo pyramid-pyramid-sysv3
286 else
287 echo pyramid-pyramid-bsd
288 fi
289 exit 0 ;;
290 NILE*:*:*:dcosx)
291 echo pyramid-pyramid-svr4
292 exit 0 ;;
293 sun4H:SunOS:5.*:*)
294 echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
295 exit 0 ;;
296 sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
297 echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
298 exit 0 ;;
299 i86pc:SunOS:5.*:*)
300 echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
301 exit 0 ;;
302 sun4*:SunOS:6*:*)
303 # According to config.sub, this is the proper way to canonicalize
304 # SunOS6. Hard to guess exactly what SunOS6 will be like, but
305 # it's likely to be more like Solaris than SunOS4.
306 echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
307 exit 0 ;;
308 sun4*:SunOS:*:*)
309 case "`/usr/bin/arch -k`" in
310 Series*|S4*)
311 UNAME_RELEASE=`uname -v`
312 ;;
313 esac
314 # Japanese Language versions have a version number like `4.1.3-JL'.
315 echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
316 exit 0 ;;
317 sun3*:SunOS:*:*)
318 echo m68k-sun-sunos${UNAME_RELEASE}
319 exit 0 ;;
320 sun*:*:4.2BSD:*)
321 UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
322 test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
323 case "`/bin/arch`" in
324 sun3)
325 echo m68k-sun-sunos${UNAME_RELEASE}
326 ;;
327 sun4)
328 echo sparc-sun-sunos${UNAME_RELEASE}
329 ;;
330 esac
331 exit 0 ;;
332 aushp:SunOS:*:*)
333 echo sparc-auspex-sunos${UNAME_RELEASE}
334 exit 0 ;;
335 sparc*:NetBSD:*)
336 echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
337 exit 0 ;;
338 atari*:OpenBSD:*:*)
339 echo m68k-unknown-openbsd${UNAME_RELEASE}
340 exit 0 ;;
341 # The situation for MiNT is a little confusing. The machine name
342 # can be virtually everything (everything which is not
343 # "atarist" or "atariste" at least should have a processor
344 # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
345 # to the lowercase version "mint" (or "freemint"). Finally
346 # the system name "TOS" denotes a system which is actually not
347 # MiNT. But MiNT is downward compatible to TOS, so this should
348 # be no problem.
349 atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
350 echo m68k-atari-mint${UNAME_RELEASE}
351 exit 0 ;;
352 atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
353 echo m68k-atari-mint${UNAME_RELEASE}
354 exit 0 ;;
355 *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
356 echo m68k-atari-mint${UNAME_RELEASE}
357 exit 0 ;;
358 milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
359 echo m68k-milan-mint${UNAME_RELEASE}
360 exit 0 ;;
361 hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
362 echo m68k-hades-mint${UNAME_RELEASE}
363 exit 0 ;;
364 *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
365 echo m68k-unknown-mint${UNAME_RELEASE}
366 exit 0 ;;
367 sun3*:OpenBSD:*:*)
368 echo m68k-unknown-openbsd${UNAME_RELEASE}
369 exit 0 ;;
370 mac68k:OpenBSD:*:*)
371 echo m68k-unknown-openbsd${UNAME_RELEASE}
372 exit 0 ;;
373 mvme68k:OpenBSD:*:*)
374 echo m68k-unknown-openbsd${UNAME_RELEASE}
375 exit 0 ;;
376 mvme88k:OpenBSD:*:*)
377 echo m88k-unknown-openbsd${UNAME_RELEASE}
378 exit 0 ;;
379 powerpc:machten:*:*)
380 echo powerpc-apple-machten${UNAME_RELEASE}
381 exit 0 ;;
382 RISC*:Mach:*:*)
383 echo mips-dec-mach_bsd4.3
384 exit 0 ;;
385 RISC*:ULTRIX:*:*)
386 echo mips-dec-ultrix${UNAME_RELEASE}
387 exit 0 ;;
388 VAX*:ULTRIX*:*:*)
389 echo vax-dec-ultrix${UNAME_RELEASE}
390 exit 0 ;;
391 2020:CLIX:*:* | 2430:CLIX:*:*)
392 echo clipper-intergraph-clix${UNAME_RELEASE}
393 exit 0 ;;
394 mips:*:*:UMIPS | mips:*:*:RISCos)
395 eval $set_cc_for_build
396 sed 's/^ //' << EOF >$dummy.c
397 #ifdef __cplusplus
398 #include <stdio.h> /* for printf() prototype */
399 int main (int argc, char *argv[]) {
400 #else
401 int main (argc, argv) int argc; char *argv[]; {
402 #endif
403 #if defined (host_mips) && defined (MIPSEB)
404 #if defined (SYSTYPE_SYSV)
405 printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
406 #endif
407 #if defined (SYSTYPE_SVR4)
408 printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
409 #endif
410 #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
411 printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
412 #endif
413 #endif
414 exit (-1);
415 }
416 EOF
417 $CC_FOR_BUILD $dummy.c -o $dummy \
418 && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
419 && rm -f $dummy.c $dummy && exit 0
420 rm -f $dummy.c $dummy
421 echo mips-mips-riscos${UNAME_RELEASE}
422 exit 0 ;;
423 Motorola:PowerMAX_OS:*:*)
424 echo powerpc-motorola-powermax
425 exit 0 ;;
426 Night_Hawk:Power_UNIX:*:*)
427 echo powerpc-harris-powerunix
428 exit 0 ;;
429 m88k:CX/UX:7*:*)
430 echo m88k-harris-cxux7
431 exit 0 ;;
432 m88k:*:4*:R4*)
433 echo m88k-motorola-sysv4
434 exit 0 ;;
435 m88k:*:3*:R3*)
436 echo m88k-motorola-sysv3
437 exit 0 ;;
438 AViiON:dgux:*:*)
439 # DG/UX returns AViiON for all architectures
440 UNAME_PROCESSOR=`/usr/bin/uname -p`
441 if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
442 then
443 if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
444 [ ${TARGET_BINARY_INTERFACE}x = x ]
445 then
446 echo m88k-dg-dgux${UNAME_RELEASE}
447 else
448 echo m88k-dg-dguxbcs${UNAME_RELEASE}
449 fi
450 else
451 echo i586-dg-dgux${UNAME_RELEASE}
452 fi
453 exit 0 ;;
454 M88*:DolphinOS:*:*) # DolphinOS (SVR3)
455 echo m88k-dolphin-sysv3
456 exit 0 ;;
457 M88*:*:R3*:*)
458 # Delta 88k system running SVR3
459 echo m88k-motorola-sysv3
460 exit 0 ;;
461 XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
462 echo m88k-tektronix-sysv3
463 exit 0 ;;
464 Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
465 echo m68k-tektronix-bsd
466 exit 0 ;;
467 *:IRIX*:*:*)
468 echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
469 exit 0 ;;
470 ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
471 echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
472 exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
473 i*86:AIX:*:*)
474 echo i386-ibm-aix
475 exit 0 ;;
476 ia64:AIX:*:*)
477 if [ -x /usr/bin/oslevel ] ; then
478 IBM_REV=`/usr/bin/oslevel`
479 else
480 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
481 fi
482 echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
483 exit 0 ;;
484 *:AIX:2:3)
485 if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
486 eval $set_cc_for_build
487 sed 's/^ //' << EOF >$dummy.c
488 #include <sys/systemcfg.h>
489
490 main()
491 {
492 if (!__power_pc())
493 exit(1);
494 puts("powerpc-ibm-aix3.2.5");
495 exit(0);
496 }
497 EOF
498 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
499 rm -f $dummy.c $dummy
500 echo rs6000-ibm-aix3.2.5
501 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
502 echo rs6000-ibm-aix3.2.4
503 else
504 echo rs6000-ibm-aix3.2
505 fi
506 exit 0 ;;
507 *:AIX:*:[45])
508 IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
509 if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
510 IBM_ARCH=rs6000
511 else
512 IBM_ARCH=powerpc
513 fi
514 if [ -x /usr/bin/oslevel ] ; then
515 IBM_REV=`/usr/bin/oslevel`
516 else
517 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
518 fi
519 echo ${IBM_ARCH}-ibm-aix${IBM_REV}
520 exit 0 ;;
521 *:AIX:*:*)
522 echo rs6000-ibm-aix
523 exit 0 ;;
524 ibmrt:4.4BSD:*|romp-ibm:BSD:*)
525 echo romp-ibm-bsd4.4
526 exit 0 ;;
527 ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
528 echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
529 exit 0 ;; # report: romp-ibm BSD 4.3
530 *:BOSX:*:*)
531 echo rs6000-bull-bosx
532 exit 0 ;;
533 DPX/2?00:B.O.S.:*:*)
534 echo m68k-bull-sysv3
535 exit 0 ;;
536 9000/[34]??:4.3bsd:1.*:*)
537 echo m68k-hp-bsd
538 exit 0 ;;
539 hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
540 echo m68k-hp-bsd4.4
541 exit 0 ;;
542 9000/[34678]??:HP-UX:*:*)
543 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
544 case "${UNAME_MACHINE}" in
545 9000/31? ) HP_ARCH=m68000 ;;
546 9000/[34]?? ) HP_ARCH=m68k ;;
547 9000/[678][0-9][0-9])
548 case "${HPUX_REV}" in
549 11.[0-9][0-9])
550 if [ -x /usr/bin/getconf ]; then
551 sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
552 sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
553 case "${sc_cpu_version}" in
554 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
555 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
556 532) # CPU_PA_RISC2_0
557 case "${sc_kernel_bits}" in
558 32) HP_ARCH="hppa2.0n" ;;
559 64) HP_ARCH="hppa2.0w" ;;
560 esac ;;
561 esac
562 fi ;;
563 esac
564 if [ "${HP_ARCH}" = "" ]; then
565 eval $set_cc_for_build
566 sed 's/^ //' << EOF >$dummy.c
567
568 #define _HPUX_SOURCE
569 #include <stdlib.h>
570 #include <unistd.h>
571
572 int main ()
573 {
574 #if defined(_SC_KERNEL_BITS)
575 long bits = sysconf(_SC_KERNEL_BITS);
576 #endif
577 long cpu = sysconf (_SC_CPU_VERSION);
578
579 switch (cpu)
580 {
581 case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
582 case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
583 case CPU_PA_RISC2_0:
584 #if defined(_SC_KERNEL_BITS)
585 switch (bits)
586 {
587 case 64: puts ("hppa2.0w"); break;
588 case 32: puts ("hppa2.0n"); break;
589 default: puts ("hppa2.0"); break;
590 } break;
591 #else /* !defined(_SC_KERNEL_BITS) */
592 puts ("hppa2.0"); break;
593 #endif
594 default: puts ("hppa1.0"); break;
595 }
596 exit (0);
597 }
598 EOF
599 (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
600 if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
601 rm -f $dummy.c $dummy
602 fi ;;
603 esac
604 echo ${HP_ARCH}-hp-hpux${HPUX_REV}
605 exit 0 ;;
606 ia64:HP-UX:*:*)
607 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
608 echo ia64-hp-hpux${HPUX_REV}
609 exit 0 ;;
610 3050*:HI-UX:*:*)
611 eval $set_cc_for_build
612 sed 's/^ //' << EOF >$dummy.c
613 #include <unistd.h>
614 int
615 main ()
616 {
617 long cpu = sysconf (_SC_CPU_VERSION);
618 /* The order matters, because CPU_IS_HP_MC68K erroneously returns
619 true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
620 results, however. */
621 if (CPU_IS_PA_RISC (cpu))
622 {
623 switch (cpu)
624 {
625 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
626 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
627 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
628 default: puts ("hppa-hitachi-hiuxwe2"); break;
629 }
630 }
631 else if (CPU_IS_HP_MC68K (cpu))
632 puts ("m68k-hitachi-hiuxwe2");
633 else puts ("unknown-hitachi-hiuxwe2");
634 exit (0);
635 }
636 EOF
637 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
638 rm -f $dummy.c $dummy
639 echo unknown-hitachi-hiuxwe2
640 exit 0 ;;
641 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
642 echo hppa1.1-hp-bsd
643 exit 0 ;;
644 9000/8??:4.3bsd:*:*)
645 echo hppa1.0-hp-bsd
646 exit 0 ;;
647 *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
648 echo hppa1.0-hp-mpeix
649 exit 0 ;;
650 hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
651 echo hppa1.1-hp-osf
652 exit 0 ;;
653 hp8??:OSF1:*:*)
654 echo hppa1.0-hp-osf
655 exit 0 ;;
656 i*86:OSF1:*:*)
657 if [ -x /usr/sbin/sysversion ] ; then
658 echo ${UNAME_MACHINE}-unknown-osf1mk
659 else
660 echo ${UNAME_MACHINE}-unknown-osf1
661 fi
662 exit 0 ;;
663 parisc*:Lites*:*:*)
664 echo hppa1.1-hp-lites
665 exit 0 ;;
666 hppa*:OpenBSD:*:*)
667 echo hppa-unknown-openbsd
668 exit 0 ;;
669 C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
670 echo c1-convex-bsd
671 exit 0 ;;
672 C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
673 if getsysinfo -f scalar_acc
674 then echo c32-convex-bsd
675 else echo c2-convex-bsd
676 fi
677 exit 0 ;;
678 C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
679 echo c34-convex-bsd
680 exit 0 ;;
681 C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
682 echo c38-convex-bsd
683 exit 0 ;;
684 C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
685 echo c4-convex-bsd
686 exit 0 ;;
687 CRAY*X-MP:*:*:*)
688 echo xmp-cray-unicos
689 exit 0 ;;
690 CRAY*Y-MP:*:*:*)
691 echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
692 exit 0 ;;
693 CRAY*[A-Z]90:*:*:*)
694 echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
695 | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
696 -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
697 -e 's/\.[^.]*$/.X/'
698 exit 0 ;;
699 CRAY*TS:*:*:*)
700 echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
701 exit 0 ;;
702 CRAY*T3D:*:*:*)
703 echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
704 exit 0 ;;
705 CRAY*T3E:*:*:*)
706 echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
707 exit 0 ;;
708 CRAY*SV1:*:*:*)
709 echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
710 exit 0 ;;
711 CRAY-2:*:*:*)
712 echo cray2-cray-unicos
713 exit 0 ;;
714 F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
715 FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
716 FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
717 FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
718 echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
719 exit 0 ;;
720 hp300:OpenBSD:*:*)
721 echo m68k-unknown-openbsd${UNAME_RELEASE}
722 exit 0 ;;
723 i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
724 echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
725 exit 0 ;;
726 sparc*:BSD/OS:*:*)
727 echo sparc-unknown-bsdi${UNAME_RELEASE}
728 exit 0 ;;
729 *:BSD/OS:*:*)
730 echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
731 exit 0 ;;
732 *:FreeBSD:*:*)
733 echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
734 exit 0 ;;
735 *:OpenBSD:*:*)
736 echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
737 exit 0 ;;
738 i*:CYGWIN*:*)
739 echo ${UNAME_MACHINE}-pc-cygwin
740 exit 0 ;;
741 i*:MINGW*:*)
742 echo ${UNAME_MACHINE}-pc-mingw32
743 exit 0 ;;
744 i*:PW*:*)
745 echo ${UNAME_MACHINE}-pc-pw32
746 exit 0 ;;
747 i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
748 # How do we know it's Interix rather than the generic POSIX subsystem?
749 # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
750 # UNAME_MACHINE based on the output of uname instead of i386?
751 echo i386-pc-interix
752 exit 0 ;;
753 i*:UWIN*:*)
754 echo ${UNAME_MACHINE}-pc-uwin
755 exit 0 ;;
756 p*:CYGWIN*:*)
757 echo powerpcle-unknown-cygwin
758 exit 0 ;;
759 prep*:SunOS:5.*:*)
760 echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
761 exit 0 ;;
762 *:GNU:*:*)
763 echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
764 exit 0 ;;
765 i*86:Minix:*:*)
766 echo ${UNAME_MACHINE}-pc-minix
767 exit 0 ;;
768 arm*:Linux:*:*)
769 echo ${UNAME_MACHINE}-unknown-linux-gnu
770 exit 0 ;;
771 ia64:Linux:*:*)
772 echo ${UNAME_MACHINE}-unknown-linux
773 exit 0 ;;
774 m68*:Linux:*:*)
775 echo ${UNAME_MACHINE}-unknown-linux-gnu
776 exit 0 ;;
777 mips:Linux:*:*)
778 case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
779 big) echo mips-unknown-linux-gnu && exit 0 ;;
780 little) echo mipsel-unknown-linux-gnu && exit 0 ;;
781 esac
782 ;;
783 ppc:Linux:*:*)
784 echo powerpc-unknown-linux-gnu
785 exit 0 ;;
786 ppc64:Linux:*:*)
787 echo powerpc64-unknown-linux-gnu
788 exit 0 ;;
789 alpha:Linux:*:*)
790 case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
791 EV5) UNAME_MACHINE=alphaev5 ;;
792 EV56) UNAME_MACHINE=alphaev56 ;;
793 PCA56) UNAME_MACHINE=alphapca56 ;;
794 PCA57) UNAME_MACHINE=alphapca56 ;;
795 EV6) UNAME_MACHINE=alphaev6 ;;
796 EV67) UNAME_MACHINE=alphaev67 ;;
797 EV68*) UNAME_MACHINE=alphaev68 ;;
798 esac
799 objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
800 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
801 echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
802 exit 0 ;;
803 parisc:Linux:*:* | hppa:Linux:*:*)
804 # Look for CPU level
805 case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
806 PA7*) echo hppa1.1-unknown-linux-gnu ;;
807 PA8*) echo hppa2.0-unknown-linux-gnu ;;
808 *) echo hppa-unknown-linux-gnu ;;
809 esac
810 exit 0 ;;
811 parisc64:Linux:*:* | hppa64:Linux:*:*)
812 echo hppa64-unknown-linux-gnu
813 exit 0 ;;
814 s390:Linux:*:* | s390x:Linux:*:*)
815 echo ${UNAME_MACHINE}-ibm-linux
816 exit 0 ;;
817 sh*:Linux:*:*)
818 echo ${UNAME_MACHINE}-unknown-linux-gnu
819 exit 0 ;;
820 sparc:Linux:*:* | sparc64:Linux:*:*)
821 echo ${UNAME_MACHINE}-unknown-linux-gnu
822 exit 0 ;;
823 x86_64:Linux:*:*)
824 echo x86_64-unknown-linux-gnu
825 exit 0 ;;
826 i*86:Linux:*:*)
827 # The BFD linker knows what the default object file format is, so
828 # first see if it will tell us. cd to the root directory to prevent
829 # problems with other programs or directories called `ld' in the path.
830 ld_supported_targets=`cd /; ld --help 2>&1 \
831 | sed -ne '/supported targets:/!d
832 s/[ ][ ]*/ /g
833 s/.*supported targets: *//
834 s/ .*//
835 p'`
836 case "$ld_supported_targets" in
837 elf32-i386)
838 TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
839 ;;
840 a.out-i386-linux)
841 echo "${UNAME_MACHINE}-pc-linux-gnuaout"
842 exit 0 ;;
843 coff-i386)
844 echo "${UNAME_MACHINE}-pc-linux-gnucoff"
845 exit 0 ;;
846 "")
847 # Either a pre-BFD a.out linker (linux-gnuoldld) or
848 # one that does not give us useful --help.
849 echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
850 exit 0 ;;
851 esac
852 # Determine whether the default compiler is a.out or elf
853 eval $set_cc_for_build
854 cat >$dummy.c <<EOF
855 #include <features.h>
856 #ifdef __cplusplus
857 #include <stdio.h> /* for printf() prototype */
858 int main (int argc, char *argv[]) {
859 #else
860 int main (argc, argv) int argc; char *argv[]; {
861 #endif
862 #ifdef __ELF__
863 # ifdef __GLIBC__
864 # if __GLIBC__ >= 2
865 printf ("%s-pc-linux-gnu\n", argv[1]);
866 # else
867 printf ("%s-pc-linux-gnulibc1\n", argv[1]);
868 # endif
869 # else
870 printf ("%s-pc-linux-gnulibc1\n", argv[1]);
871 # endif
872 #else
873 printf ("%s-pc-linux-gnuaout\n", argv[1]);
874 #endif
875 return 0;
876 }
877 EOF
878 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
879 rm -f $dummy.c $dummy
880 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
881 ;;
882 i*86:DYNIX/ptx:4*:*)
883 # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
884 # earlier versions are messed up and put the nodename in both
885 # sysname and nodename.
886 echo i386-sequent-sysv4
887 exit 0 ;;
888 i*86:UNIX_SV:4.2MP:2.*)
889 # Unixware is an offshoot of SVR4, but it has its own version
890 # number series starting with 2...
891 # I am not positive that other SVR4 systems won't match this,
892 # I just have to hope. -- rms.
893 # Use sysv4.2uw... so that sysv4* matches it.
894 echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
895 exit 0 ;;
896 i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
897 UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
898 if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
899 echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
900 else
901 echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
902 fi
903 exit 0 ;;
904 i*86:*:5:[78]*)
905 case `/bin/uname -X | grep "^Machine"` in
906 *486*) UNAME_MACHINE=i486 ;;
907 *Pentium) UNAME_MACHINE=i586 ;;
908 *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
909 esac
910 echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
911 exit 0 ;;
912 i*86:*:3.2:*)
913 if test -f /usr/options/cb.name; then
914 UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
915 echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
916 elif /bin/uname -X 2>/dev/null >/dev/null ; then
917 UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
918 (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
919 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
920 && UNAME_MACHINE=i586
921 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
922 && UNAME_MACHINE=i686
923 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
924 && UNAME_MACHINE=i686
925 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
926 else
927 echo ${UNAME_MACHINE}-pc-sysv32
928 fi
929 exit 0 ;;
930 i*86:*DOS:*:*)
931 echo ${UNAME_MACHINE}-pc-msdosdjgpp
932 exit 0 ;;
933 pc:*:*:*)
934 # Left here for compatibility:
935 # uname -m prints for DJGPP always 'pc', but it prints nothing about
936 # the processor, so we play safe by assuming i386.
937 echo i386-pc-msdosdjgpp
938 exit 0 ;;
939 Intel:Mach:3*:*)
940 echo i386-pc-mach3
941 exit 0 ;;
942 paragon:*:*:*)
943 echo i860-intel-osf1
944 exit 0 ;;
945 i860:*:4.*:*) # i860-SVR4
946 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
947 echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
948 else # Add other i860-SVR4 vendors below as they are discovered.
949 echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
950 fi
951 exit 0 ;;
952 mini*:CTIX:SYS*5:*)
953 # "miniframe"
954 echo m68010-convergent-sysv
955 exit 0 ;;
956 M68*:*:R3V[567]*:*)
957 test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
958 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
959 OS_REL=''
960 test -r /etc/.relid \
961 && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
962 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
963 && echo i486-ncr-sysv4.3${OS_REL} && exit 0
964 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
965 && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
966 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
967 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
968 && echo i486-ncr-sysv4 && exit 0 ;;
969 m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
970 echo m68k-unknown-lynxos${UNAME_RELEASE}
971 exit 0 ;;
972 mc68030:UNIX_System_V:4.*:*)
973 echo m68k-atari-sysv4
974 exit 0 ;;
975 i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
976 echo i386-unknown-lynxos${UNAME_RELEASE}
977 exit 0 ;;
978 TSUNAMI:LynxOS:2.*:*)
979 echo sparc-unknown-lynxos${UNAME_RELEASE}
980 exit 0 ;;
981 rs6000:LynxOS:2.*:*)
982 echo rs6000-unknown-lynxos${UNAME_RELEASE}
983 exit 0 ;;
984 PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
985 echo powerpc-unknown-lynxos${UNAME_RELEASE}
986 exit 0 ;;
987 SM[BE]S:UNIX_SV:*:*)
988 echo mips-dde-sysv${UNAME_RELEASE}
989 exit 0 ;;
990 RM*:ReliantUNIX-*:*:*)
991 echo mips-sni-sysv4
992 exit 0 ;;
993 RM*:SINIX-*:*:*)
994 echo mips-sni-sysv4
995 exit 0 ;;
996 *:SINIX-*:*:*)
997 if uname -p 2>/dev/null >/dev/null ; then
998 UNAME_MACHINE=`(uname -p) 2>/dev/null`
999 echo ${UNAME_MACHINE}-sni-sysv4
1000 else
1001 echo ns32k-sni-sysv
1002 fi
1003 exit 0 ;;
1004 PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
1005 # says <Richard.M.Bartel@ccMail.Census.GOV>
1006 echo i586-unisys-sysv4
1007 exit 0 ;;
1008 *:UNIX_System_V:4*:FTX*)
1009 # From Gerald Hewes <hewes@openmarket.com>.
1010 # How about differentiating between stratus architectures? -djm
1011 echo hppa1.1-stratus-sysv4
1012 exit 0 ;;
1013 *:*:*:FTX*)
1014 # From seanf@swdc.stratus.com.
1015 echo i860-stratus-sysv4
1016 exit 0 ;;
1017 *:VOS:*:*)
1018 # From Paul.Green@stratus.com.
1019 echo hppa1.1-stratus-vos
1020 exit 0 ;;
1021 mc68*:A/UX:*:*)
1022 echo m68k-apple-aux${UNAME_RELEASE}
1023 exit 0 ;;
1024 news*:NEWS-OS:6*:*)
1025 echo mips-sony-newsos6
1026 exit 0 ;;
1027 R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
1028 if [ -d /usr/nec ]; then
1029 echo mips-nec-sysv${UNAME_RELEASE}
1030 else
1031 echo mips-unknown-sysv${UNAME_RELEASE}
1032 fi
1033 exit 0 ;;
1034 BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
1035 echo powerpc-be-beos
1036 exit 0 ;;
1037 BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
1038 echo powerpc-apple-beos
1039 exit 0 ;;
1040 BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
1041 echo i586-pc-beos
1042 exit 0 ;;
1043 SX-4:SUPER-UX:*:*)
1044 echo sx4-nec-superux${UNAME_RELEASE}
1045 exit 0 ;;
1046 SX-5:SUPER-UX:*:*)
1047 echo sx5-nec-superux${UNAME_RELEASE}
1048 exit 0 ;;
1049 Power*:Rhapsody:*:*)
1050 echo powerpc-apple-rhapsody${UNAME_RELEASE}
1051 exit 0 ;;
1052 *:Rhapsody:*:*)
1053 echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
1054 exit 0 ;;
1055 *:Darwin:*:*)
1056 echo `uname -p`-apple-darwin${UNAME_RELEASE}
1057 exit 0 ;;
1058 *:procnto*:*:* | *:QNX:[0123456789]*:*)
1059 if test "${UNAME_MACHINE}" = "x86pc"; then
1060 UNAME_MACHINE=pc
1061 fi
1062 echo `uname -p`-${UNAME_MACHINE}-nto-qnx
1063 exit 0 ;;
1064 *:QNX:*:4*)
1065 echo i386-pc-qnx
1066 exit 0 ;;
1067 NSR-[KW]:NONSTOP_KERNEL:*:*)
1068 echo nsr-tandem-nsk${UNAME_RELEASE}
1069 exit 0 ;;
1070 *:NonStop-UX:*:*)
1071 echo mips-compaq-nonstopux
1072 exit 0 ;;
1073 BS2000:POSIX*:*:*)
1074 echo bs2000-siemens-sysv
1075 exit 0 ;;
1076 DS/*:UNIX_System_V:*:*)
1077 echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
1078 exit 0 ;;
1079 *:Plan9:*:*)
1080 # "uname -m" is not consistent, so use $cputype instead. 386
1081 # is converted to i386 for consistency with other x86
1082 # operating systems.
1083 if test "$cputype" = "386"; then
1084 UNAME_MACHINE=i386
1085 else
1086 UNAME_MACHINE="$cputype"
1087 fi
1088 echo ${UNAME_MACHINE}-unknown-plan9
1089 exit 0 ;;
1090 i*86:OS/2:*:*)
1091 # If we were able to find `uname', then EMX Unix compatibility
1092 # is probably installed.
1093 echo ${UNAME_MACHINE}-pc-os2-emx
1094 exit 0 ;;
1095 *:TOPS-10:*:*)
1096 echo pdp10-unknown-tops10
1097 exit 0 ;;
1098 *:TENEX:*:*)
1099 echo pdp10-unknown-tenex
1100 exit 0 ;;
1101 KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
1102 echo pdp10-dec-tops20
1103 exit 0 ;;
1104 XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
1105 echo pdp10-xkl-tops20
1106 exit 0 ;;
1107 *:TOPS-20:*:*)
1108 echo pdp10-unknown-tops20
1109 exit 0 ;;
1110 *:ITS:*:*)
1111 echo pdp10-unknown-its
1112 exit 0 ;;
1113 i*86:XTS-300:*:STOP)
1114 echo ${UNAME_MACHINE}-unknown-stop
1115 exit 0 ;;
1116 i*86:atheos:*:*)
1117 echo ${UNAME_MACHINE}-unknown-atheos
1118 exit 0 ;;
1119 esac
1120
1121 #echo '(No uname command or uname output not recognized.)' 1>&2
1122 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
1123
1124 eval $set_cc_for_build
1125 cat >$dummy.c <<EOF
1126 #ifdef _SEQUENT_
1127 # include <sys/types.h>
1128 # include <sys/utsname.h>
1129 #endif
1130 main ()
1131 {
1132 #if defined (sony)
1133 #if defined (MIPSEB)
1134 /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
1135 I don't know.... */
1136 printf ("mips-sony-bsd\n"); exit (0);
1137 #else
1138 #include <sys/param.h>
1139 printf ("m68k-sony-newsos%s\n",
1140 #ifdef NEWSOS4
1141 "4"
1142 #else
1143 ""
1144 #endif
1145 ); exit (0);
1146 #endif
1147 #endif
1148
1149 #if defined (__arm) && defined (__acorn) && defined (__unix)
1150 printf ("arm-acorn-riscix"); exit (0);
1151 #endif
1152
1153 #if defined (hp300) && !defined (hpux)
1154 printf ("m68k-hp-bsd\n"); exit (0);
1155 #endif
1156
1157 #if defined (NeXT)
1158 #if !defined (__ARCHITECTURE__)
1159 #define __ARCHITECTURE__ "m68k"
1160 #endif
1161 int version;
1162 version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
1163 if (version < 4)
1164 printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
1165 else
1166 printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
1167 exit (0);
1168 #endif
1169
1170 #if defined (MULTIMAX) || defined (n16)
1171 #if defined (UMAXV)
1172 printf ("ns32k-encore-sysv\n"); exit (0);
1173 #else
1174 #if defined (CMU)
1175 printf ("ns32k-encore-mach\n"); exit (0);
1176 #else
1177 printf ("ns32k-encore-bsd\n"); exit (0);
1178 #endif
1179 #endif
1180 #endif
1181
1182 #if defined (__386BSD__)
1183 printf ("i386-pc-bsd\n"); exit (0);
1184 #endif
1185
1186 #if defined (sequent)
1187 #if defined (i386)
1188 printf ("i386-sequent-dynix\n"); exit (0);
1189 #endif
1190 #if defined (ns32000)
1191 printf ("ns32k-sequent-dynix\n"); exit (0);
1192 #endif
1193 #endif
1194
1195 #if defined (_SEQUENT_)
1196 struct utsname un;
1197
1198 uname(&un);
1199
1200 if (strncmp(un.version, "V2", 2) == 0) {
1201 printf ("i386-sequent-ptx2\n"); exit (0);
1202 }
1203 if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
1204 printf ("i386-sequent-ptx1\n"); exit (0);
1205 }
1206 printf ("i386-sequent-ptx\n"); exit (0);
1207
1208 #endif
1209
1210 #if defined (vax)
1211 # if !defined (ultrix)
1212 # include <sys/param.h>
1213 # if defined (BSD)
1214 # if BSD == 43
1215 printf ("vax-dec-bsd4.3\n"); exit (0);
1216 # else
1217 # if BSD == 199006
1218 printf ("vax-dec-bsd4.3reno\n"); exit (0);
1219 # else
1220 printf ("vax-dec-bsd\n"); exit (0);
1221 # endif
1222 # endif
1223 # else
1224 printf ("vax-dec-bsd\n"); exit (0);
1225 # endif
1226 # else
1227 printf ("vax-dec-ultrix\n"); exit (0);
1228 # endif
1229 #endif
1230
1231 #if defined (alliant) && defined (i860)
1232 printf ("i860-alliant-bsd\n"); exit (0);
1233 #endif
1234
1235 exit (1);
1236 }
1237 EOF
1238
1239 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
1240 rm -f $dummy.c $dummy
1241
1242 # Apollos put the system type in the environment.
1243
1244 test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
1245
1246 # Convex versions that predate uname can use getsysinfo(1)
1247
1248 if [ -x /usr/convex/getsysinfo ]
1249 then
1250 case `getsysinfo -f cpu_type` in
1251 c1*)
1252 echo c1-convex-bsd
1253 exit 0 ;;
1254 c2*)
1255 if getsysinfo -f scalar_acc
1256 then echo c32-convex-bsd
1257 else echo c2-convex-bsd
1258 fi
1259 exit 0 ;;
1260 c34*)
1261 echo c34-convex-bsd
1262 exit 0 ;;
1263 c38*)
1264 echo c38-convex-bsd
1265 exit 0 ;;
1266 c4*)
1267 echo c4-convex-bsd
1268 exit 0 ;;
1269 esac
1270 fi
1271
1272 cat >&2 <<EOF
1273 $0: unable to guess system type
1274
1275 This script, last modified $timestamp, has failed to recognize
1276 the operating system you are using. It is advised that you
1277 download the most up to date version of the config scripts from
1278
1279 ftp://ftp.gnu.org/pub/gnu/config/
1280
1281 If the version you run ($0) is already up to date, please
1282 send the following data and any information you think might be
1283 pertinent to <config-patches@gnu.org> in order to provide the needed
1284 information to handle your system.
1285
1286 config.guess timestamp = $timestamp
1287
1288 uname -m = `(uname -m) 2>/dev/null || echo unknown`
1289 uname -r = `(uname -r) 2>/dev/null || echo unknown`
1290 uname -s = `(uname -s) 2>/dev/null || echo unknown`
1291 uname -v = `(uname -v) 2>/dev/null || echo unknown`
1292
1293 /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
1294 /bin/uname -X = `(/bin/uname -X) 2>/dev/null`
1295
1296 hostinfo = `(hostinfo) 2>/dev/null`
1297 /bin/universe = `(/bin/universe) 2>/dev/null`
1298 /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
1299 /bin/arch = `(/bin/arch) 2>/dev/null`
1300 /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
1301 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
1302
1303 UNAME_MACHINE = ${UNAME_MACHINE}
1304 UNAME_RELEASE = ${UNAME_RELEASE}
1305 UNAME_SYSTEM = ${UNAME_SYSTEM}
1306 UNAME_VERSION = ${UNAME_VERSION}
1307 EOF
1308
1309 exit 1
1310
1311 # Local variables:
1312 # eval: (add-hook 'write-file-hooks 'time-stamp)
1313 # time-stamp-start: "timestamp='"
1314 # time-stamp-format: "%:y-%02m-%02d"
1315 # time-stamp-end: "'"
1316 # End:
0 /* config.h.in. Generated automatically from configure.in by autoheader. */
0 /* config.h.in. Generated automatically from configure.in by autoheader 2.13. */
11
22 /* Define if you have the m library (-lm). */
33 #undef HAVE_LIBM
55 /* Define if you have the png library (-lpng). */
66 #undef HAVE_LIBPNG
77
8 /* Define if you have the z library (-lz). */
9 #undef HAVE_LIBZ
10
811 /* Name of package */
912 #undef PACKAGE
1013
0 #! /bin/sh
1 # Configuration validation subroutine script.
2 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 # Free Software Foundation, Inc.
4
5 timestamp='2001-09-07'
6
7 # This file is (in principle) common to ALL GNU software.
8 # The presence of a machine in this file suggests that SOME GNU software
9 # can handle that machine. It does not imply ALL GNU software can.
10 #
11 # This file is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place - Suite 330,
24 # Boston, MA 02111-1307, USA.
25
26 # As a special exception to the GNU General Public License, if you
27 # distribute this file as part of a program that contains a
28 # configuration script generated by Autoconf, you may include it under
29 # the same distribution terms that you use for the rest of that program.
30
31 # Please send patches to <config-patches@gnu.org>.
32 #
33 # Configuration subroutine to validate and canonicalize a configuration type.
34 # Supply the specified configuration type as an argument.
35 # If it is invalid, we print an error message on stderr and exit with code 1.
36 # Otherwise, we print the canonical config type on stdout and succeed.
37
38 # This file is supposed to be the same for all GNU packages
39 # and recognize all the CPU types, system types and aliases
40 # that are meaningful with *any* GNU software.
41 # Each package is responsible for reporting which valid configurations
42 # it does not support. The user should be able to distinguish
43 # a failure to support a valid configuration from a meaningless
44 # configuration.
45
46 # The goal of this file is to map all the various variations of a given
47 # machine specification into a single specification in the form:
48 # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
49 # or in some cases, the newer four-part form:
50 # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
51 # It is wrong to echo any other type of specification.
52
53 me=`echo "$0" | sed -e 's,.*/,,'`
54
55 usage="\
56 Usage: $0 [OPTION] CPU-MFR-OPSYS
57 $0 [OPTION] ALIAS
58
59 Canonicalize a configuration name.
60
61 Operation modes:
62 -h, --help print this help, then exit
63 -t, --time-stamp print date of last modification, then exit
64 -v, --version print version number, then exit
65
66 Report bugs and patches to <config-patches@gnu.org>."
67
68 version="\
69 GNU config.sub ($timestamp)
70
71 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
72 Free Software Foundation, Inc.
73
74 This is free software; see the source for copying conditions. There is NO
75 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
76
77 help="
78 Try \`$me --help' for more information."
79
80 # Parse command line
81 while test $# -gt 0 ; do
82 case $1 in
83 --time-stamp | --time* | -t )
84 echo "$timestamp" ; exit 0 ;;
85 --version | -v )
86 echo "$version" ; exit 0 ;;
87 --help | --h* | -h )
88 echo "$usage"; exit 0 ;;
89 -- ) # Stop option processing
90 shift; break ;;
91 - ) # Use stdin as input.
92 break ;;
93 -* )
94 echo "$me: invalid option $1$help"
95 exit 1 ;;
96
97 *local*)
98 # First pass through any local machine types.
99 echo $1
100 exit 0;;
101
102 * )
103 break ;;
104 esac
105 done
106
107 case $# in
108 0) echo "$me: missing argument$help" >&2
109 exit 1;;
110 1) ;;
111 *) echo "$me: too many arguments$help" >&2
112 exit 1;;
113 esac
114
115 # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
116 # Here we must recognize all the valid KERNEL-OS combinations.
117 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
118 case $maybe_os in
119 nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
120 os=-$maybe_os
121 basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
122 ;;
123 *)
124 basic_machine=`echo $1 | sed 's/-[^-]*$//'`
125 if [ $basic_machine != $1 ]
126 then os=`echo $1 | sed 's/.*-/-/'`
127 else os=; fi
128 ;;
129 esac
130
131 ### Let's recognize common machines as not being operating systems so
132 ### that things like config.sub decstation-3100 work. We also
133 ### recognize some manufacturers as not being operating systems, so we
134 ### can provide default operating systems below.
135 case $os in
136 -sun*os*)
137 # Prevent following clause from handling this invalid input.
138 ;;
139 -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
140 -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
141 -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
142 -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
143 -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
144 -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
145 -apple | -axis)
146 os=
147 basic_machine=$1
148 ;;
149 -sim | -cisco | -oki | -wec | -winbond)
150 os=
151 basic_machine=$1
152 ;;
153 -scout)
154 ;;
155 -wrs)
156 os=-vxworks
157 basic_machine=$1
158 ;;
159 -chorusos*)
160 os=-chorusos
161 basic_machine=$1
162 ;;
163 -chorusrdb)
164 os=-chorusrdb
165 basic_machine=$1
166 ;;
167 -hiux*)
168 os=-hiuxwe2
169 ;;
170 -sco5)
171 os=-sco3.2v5
172 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
173 ;;
174 -sco4)
175 os=-sco3.2v4
176 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
177 ;;
178 -sco3.2.[4-9]*)
179 os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
180 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
181 ;;
182 -sco3.2v[4-9]*)
183 # Don't forget version if it is 3.2v4 or newer.
184 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
185 ;;
186 -sco*)
187 os=-sco3.2v2
188 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
189 ;;
190 -udk*)
191 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
192 ;;
193 -isc)
194 os=-isc2.2
195 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
196 ;;
197 -clix*)
198 basic_machine=clipper-intergraph
199 ;;
200 -isc*)
201 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
202 ;;
203 -lynx*)
204 os=-lynxos
205 ;;
206 -ptx*)
207 basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
208 ;;
209 -windowsnt*)
210 os=`echo $os | sed -e 's/windowsnt/winnt/'`
211 ;;
212 -psos*)
213 os=-psos
214 ;;
215 -mint | -mint[0-9]*)
216 basic_machine=m68k-atari
217 os=-mint
218 ;;
219 esac
220
221 # Decode aliases for certain CPU-COMPANY combinations.
222 case $basic_machine in
223 # Recognize the basic CPU types without company name.
224 # Some are omitted here because they have special meanings below.
225 1750a | 580 \
226 | a29k \
227 | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
228 | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
229 | c4x | clipper \
230 | d10v | d30v | dsp16xx \
231 | fr30 \
232 | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
233 | i370 | i860 | i960 | ia64 \
234 | m32r | m68000 | m68k | m88k | mcore \
235 | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
236 | mips64vr4100 | mips64vr4100el | mips64vr4300 \
237 | mips64vr4300el | mips64vr5000 | mips64vr5000el \
238 | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
239 | mipsisa32 \
240 | mn10200 | mn10300 \
241 | ns16k | ns32k \
242 | openrisc \
243 | pdp10 | pdp11 | pj | pjl \
244 | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
245 | pyramid \
246 | s390 | s390x \
247 | sh | sh[34] | sh[34]eb | shbe | shle \
248 | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
249 | stormy16 | strongarm \
250 | tahoe | thumb | tic80 | tron \
251 | v850 \
252 | we32k \
253 | x86 | xscale \
254 | z8k)
255 basic_machine=$basic_machine-unknown
256 ;;
257 m6811 | m68hc11 | m6812 | m68hc12)
258 # Motorola 68HC11/12.
259 basic_machine=$basic_machine-unknown
260 os=-none
261 ;;
262 m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
263 ;;
264
265 # We use `pc' rather than `unknown'
266 # because (1) that's what they normally are, and
267 # (2) the word "unknown" tends to confuse beginning users.
268 i*86 | x86_64)
269 basic_machine=$basic_machine-pc
270 ;;
271 # Object if more than one company name word.
272 *-*-*)
273 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
274 exit 1
275 ;;
276 # Recognize the basic CPU types with company name.
277 580-* \
278 | a29k-* \
279 | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
280 | alphapca5[67]-* | arc-* \
281 | arm-* | armbe-* | armle-* | armv*-* \
282 | bs2000-* \
283 | c[123]* | c30-* | [cjt]90-* | c54x-* \
284 | clipper-* | cray2-* | cydra-* \
285 | d10v-* | d30v-* \
286 | elxsi-* \
287 | f30[01]-* | f700-* | fr30-* | fx80-* \
288 | h8300-* | h8500-* \
289 | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
290 | i*86-* | i860-* | i960-* | ia64-* \
291 | m32r-* \
292 | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
293 | m88110-* | m88k-* | mcore-* \
294 | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
295 | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
296 | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
297 | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
298 | none-* | np1-* | ns16k-* | ns32k-* \
299 | orion-* \
300 | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
301 | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
302 | pyramid-* \
303 | romp-* | rs6000-* \
304 | s390-* | s390x-* \
305 | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
306 | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
307 | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
308 | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
309 | v850-* | vax-* \
310 | we32k-* \
311 | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
312 | ymp-* \
313 | z8k-*)
314 ;;
315 # Recognize the various machine names and aliases which stand
316 # for a CPU type and a company and sometimes even an OS.
317 386bsd)
318 basic_machine=i386-unknown
319 os=-bsd
320 ;;
321 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
322 basic_machine=m68000-att
323 ;;
324 3b*)
325 basic_machine=we32k-att
326 ;;
327 a29khif)
328 basic_machine=a29k-amd
329 os=-udi
330 ;;
331 adobe68k)
332 basic_machine=m68010-adobe
333 os=-scout
334 ;;
335 alliant | fx80)
336 basic_machine=fx80-alliant
337 ;;
338 altos | altos3068)
339 basic_machine=m68k-altos
340 ;;
341 am29k)
342 basic_machine=a29k-none
343 os=-bsd
344 ;;
345 amdahl)
346 basic_machine=580-amdahl
347 os=-sysv
348 ;;
349 amiga | amiga-*)
350 basic_machine=m68k-unknown
351 ;;
352 amigaos | amigados)
353 basic_machine=m68k-unknown
354 os=-amigaos
355 ;;
356 amigaunix | amix)
357 basic_machine=m68k-unknown
358 os=-sysv4
359 ;;
360 apollo68)
361 basic_machine=m68k-apollo
362 os=-sysv
363 ;;
364 apollo68bsd)
365 basic_machine=m68k-apollo
366 os=-bsd
367 ;;
368 aux)
369 basic_machine=m68k-apple
370 os=-aux
371 ;;
372 balance)
373 basic_machine=ns32k-sequent
374 os=-dynix
375 ;;
376 convex-c1)
377 basic_machine=c1-convex
378 os=-bsd
379 ;;
380 convex-c2)
381 basic_machine=c2-convex
382 os=-bsd
383 ;;
384 convex-c32)
385 basic_machine=c32-convex
386 os=-bsd
387 ;;
388 convex-c34)
389 basic_machine=c34-convex
390 os=-bsd
391 ;;
392 convex-c38)
393 basic_machine=c38-convex
394 os=-bsd
395 ;;
396 cray | ymp)
397 basic_machine=ymp-cray
398 os=-unicos
399 ;;
400 cray2)
401 basic_machine=cray2-cray
402 os=-unicos
403 ;;
404 [cjt]90)
405 basic_machine=${basic_machine}-cray
406 os=-unicos
407 ;;
408 crds | unos)
409 basic_machine=m68k-crds
410 ;;
411 cris | cris-* | etrax*)
412 basic_machine=cris-axis
413 ;;
414 da30 | da30-*)
415 basic_machine=m68k-da30
416 ;;
417 decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
418 basic_machine=mips-dec
419 ;;
420 delta | 3300 | motorola-3300 | motorola-delta \
421 | 3300-motorola | delta-motorola)
422 basic_machine=m68k-motorola
423 ;;
424 delta88)
425 basic_machine=m88k-motorola
426 os=-sysv3
427 ;;
428 dpx20 | dpx20-*)
429 basic_machine=rs6000-bull
430 os=-bosx
431 ;;
432 dpx2* | dpx2*-bull)
433 basic_machine=m68k-bull
434 os=-sysv3
435 ;;
436 ebmon29k)
437 basic_machine=a29k-amd
438 os=-ebmon
439 ;;
440 elxsi)
441 basic_machine=elxsi-elxsi
442 os=-bsd
443 ;;
444 encore | umax | mmax)
445 basic_machine=ns32k-encore
446 ;;
447 es1800 | OSE68k | ose68k | ose | OSE)
448 basic_machine=m68k-ericsson
449 os=-ose
450 ;;
451 fx2800)
452 basic_machine=i860-alliant
453 ;;
454 genix)
455 basic_machine=ns32k-ns
456 ;;
457 gmicro)
458 basic_machine=tron-gmicro
459 os=-sysv
460 ;;
461 go32)
462 basic_machine=i386-pc
463 os=-go32
464 ;;
465 h3050r* | hiux*)
466 basic_machine=hppa1.1-hitachi
467 os=-hiuxwe2
468 ;;
469 h8300hms)
470 basic_machine=h8300-hitachi
471 os=-hms
472 ;;
473 h8300xray)
474 basic_machine=h8300-hitachi
475 os=-xray
476 ;;
477 h8500hms)
478 basic_machine=h8500-hitachi
479 os=-hms
480 ;;
481 harris)
482 basic_machine=m88k-harris
483 os=-sysv3
484 ;;
485 hp300-*)
486 basic_machine=m68k-hp
487 ;;
488 hp300bsd)
489 basic_machine=m68k-hp
490 os=-bsd
491 ;;
492 hp300hpux)
493 basic_machine=m68k-hp
494 os=-hpux
495 ;;
496 hp3k9[0-9][0-9] | hp9[0-9][0-9])
497 basic_machine=hppa1.0-hp
498 ;;
499 hp9k2[0-9][0-9] | hp9k31[0-9])
500 basic_machine=m68000-hp
501 ;;
502 hp9k3[2-9][0-9])
503 basic_machine=m68k-hp
504 ;;
505 hp9k6[0-9][0-9] | hp6[0-9][0-9])
506 basic_machine=hppa1.0-hp
507 ;;
508 hp9k7[0-79][0-9] | hp7[0-79][0-9])
509 basic_machine=hppa1.1-hp
510 ;;
511 hp9k78[0-9] | hp78[0-9])
512 # FIXME: really hppa2.0-hp
513 basic_machine=hppa1.1-hp
514 ;;
515 hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
516 # FIXME: really hppa2.0-hp
517 basic_machine=hppa1.1-hp
518 ;;
519 hp9k8[0-9][13679] | hp8[0-9][13679])
520 basic_machine=hppa1.1-hp
521 ;;
522 hp9k8[0-9][0-9] | hp8[0-9][0-9])
523 basic_machine=hppa1.0-hp
524 ;;
525 hppa-next)
526 os=-nextstep3
527 ;;
528 hppaosf)
529 basic_machine=hppa1.1-hp
530 os=-osf
531 ;;
532 hppro)
533 basic_machine=hppa1.1-hp
534 os=-proelf
535 ;;
536 i370-ibm* | ibm*)
537 basic_machine=i370-ibm
538 ;;
539 # I'm not sure what "Sysv32" means. Should this be sysv3.2?
540 i*86v32)
541 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
542 os=-sysv32
543 ;;
544 i*86v4*)
545 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
546 os=-sysv4
547 ;;
548 i*86v)
549 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
550 os=-sysv
551 ;;
552 i*86sol2)
553 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
554 os=-solaris2
555 ;;
556 i386mach)
557 basic_machine=i386-mach
558 os=-mach
559 ;;
560 i386-vsta | vsta)
561 basic_machine=i386-unknown
562 os=-vsta
563 ;;
564 iris | iris4d)
565 basic_machine=mips-sgi
566 case $os in
567 -irix*)
568 ;;
569 *)
570 os=-irix4
571 ;;
572 esac
573 ;;
574 isi68 | isi)
575 basic_machine=m68k-isi
576 os=-sysv
577 ;;
578 m88k-omron*)
579 basic_machine=m88k-omron
580 ;;
581 magnum | m3230)
582 basic_machine=mips-mips
583 os=-sysv
584 ;;
585 merlin)
586 basic_machine=ns32k-utek
587 os=-sysv
588 ;;
589 mingw32)
590 basic_machine=i386-pc
591 os=-mingw32
592 ;;
593 miniframe)
594 basic_machine=m68000-convergent
595 ;;
596 *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
597 basic_machine=m68k-atari
598 os=-mint
599 ;;
600 mipsel*-linux*)
601 basic_machine=mipsel-unknown
602 os=-linux-gnu
603 ;;
604 mips*-linux*)
605 basic_machine=mips-unknown
606 os=-linux-gnu
607 ;;
608 mips3*-*)
609 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
610 ;;
611 mips3*)
612 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
613 ;;
614 mmix*)
615 basic_machine=mmix-knuth
616 os=-mmixware
617 ;;
618 monitor)
619 basic_machine=m68k-rom68k
620 os=-coff
621 ;;
622 msdos)
623 basic_machine=i386-pc
624 os=-msdos
625 ;;
626 mvs)
627 basic_machine=i370-ibm
628 os=-mvs
629 ;;
630 ncr3000)
631 basic_machine=i486-ncr
632 os=-sysv4
633 ;;
634 netbsd386)
635 basic_machine=i386-unknown
636 os=-netbsd
637 ;;
638 netwinder)
639 basic_machine=armv4l-rebel
640 os=-linux
641 ;;
642 news | news700 | news800 | news900)
643 basic_machine=m68k-sony
644 os=-newsos
645 ;;
646 news1000)
647 basic_machine=m68030-sony
648 os=-newsos
649 ;;
650 news-3600 | risc-news)
651 basic_machine=mips-sony
652 os=-newsos
653 ;;
654 necv70)
655 basic_machine=v70-nec
656 os=-sysv
657 ;;
658 next | m*-next )
659 basic_machine=m68k-next
660 case $os in
661 -nextstep* )
662 ;;
663 -ns2*)
664 os=-nextstep2
665 ;;
666 *)
667 os=-nextstep3
668 ;;
669 esac
670 ;;
671 nh3000)
672 basic_machine=m68k-harris
673 os=-cxux
674 ;;
675 nh[45]000)
676 basic_machine=m88k-harris
677 os=-cxux
678 ;;
679 nindy960)
680 basic_machine=i960-intel
681 os=-nindy
682 ;;
683 mon960)
684 basic_machine=i960-intel
685 os=-mon960
686 ;;
687 nonstopux)
688 basic_machine=mips-compaq
689 os=-nonstopux
690 ;;
691 np1)
692 basic_machine=np1-gould
693 ;;
694 nsr-tandem)
695 basic_machine=nsr-tandem
696 ;;
697 op50n-* | op60c-*)
698 basic_machine=hppa1.1-oki
699 os=-proelf
700 ;;
701 OSE68000 | ose68000)
702 basic_machine=m68000-ericsson
703 os=-ose
704 ;;
705 os68k)
706 basic_machine=m68k-none
707 os=-os68k
708 ;;
709 pa-hitachi)
710 basic_machine=hppa1.1-hitachi
711 os=-hiuxwe2
712 ;;
713 paragon)
714 basic_machine=i860-intel
715 os=-osf
716 ;;
717 pbd)
718 basic_machine=sparc-tti
719 ;;
720 pbb)
721 basic_machine=m68k-tti
722 ;;
723 pc532 | pc532-*)
724 basic_machine=ns32k-pc532
725 ;;
726 pentium | p5 | k5 | k6 | nexgen)
727 basic_machine=i586-pc
728 ;;
729 pentiumpro | p6 | 6x86 | athlon)
730 basic_machine=i686-pc
731 ;;
732 pentiumii | pentium2)
733 basic_machine=i686-pc
734 ;;
735 pentium-* | p5-* | k5-* | k6-* | nexgen-*)
736 basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
737 ;;
738 pentiumpro-* | p6-* | 6x86-* | athlon-*)
739 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
740 ;;
741 pentiumii-* | pentium2-*)
742 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
743 ;;
744 pn)
745 basic_machine=pn-gould
746 ;;
747 power) basic_machine=power-ibm
748 ;;
749 ppc) basic_machine=powerpc-unknown
750 ;;
751 ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
752 ;;
753 ppcle | powerpclittle | ppc-le | powerpc-little)
754 basic_machine=powerpcle-unknown
755 ;;
756 ppcle-* | powerpclittle-*)
757 basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
758 ;;
759 ppc64) basic_machine=powerpc64-unknown
760 ;;
761 ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
762 ;;
763 ppc64le | powerpc64little | ppc64-le | powerpc64-little)
764 basic_machine=powerpc64le-unknown
765 ;;
766 ppc64le-* | powerpc64little-*)
767 basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
768 ;;
769 ps2)
770 basic_machine=i386-ibm
771 ;;
772 pw32)
773 basic_machine=i586-unknown
774 os=-pw32
775 ;;
776 rom68k)
777 basic_machine=m68k-rom68k
778 os=-coff
779 ;;
780 rm[46]00)
781 basic_machine=mips-siemens
782 ;;
783 rtpc | rtpc-*)
784 basic_machine=romp-ibm
785 ;;
786 sa29200)
787 basic_machine=a29k-amd
788 os=-udi
789 ;;
790 sequent)
791 basic_machine=i386-sequent
792 ;;
793 sh)
794 basic_machine=sh-hitachi
795 os=-hms
796 ;;
797 sparclite-wrs)
798 basic_machine=sparclite-wrs
799 os=-vxworks
800 ;;
801 sps7)
802 basic_machine=m68k-bull
803 os=-sysv2
804 ;;
805 spur)
806 basic_machine=spur-unknown
807 ;;
808 st2000)
809 basic_machine=m68k-tandem
810 ;;
811 stratus)
812 basic_machine=i860-stratus
813 os=-sysv4
814 ;;
815 sun2)
816 basic_machine=m68000-sun
817 ;;
818 sun2os3)
819 basic_machine=m68000-sun
820 os=-sunos3
821 ;;
822 sun2os4)
823 basic_machine=m68000-sun
824 os=-sunos4
825 ;;
826 sun3os3)
827 basic_machine=m68k-sun
828 os=-sunos3
829 ;;
830 sun3os4)
831 basic_machine=m68k-sun
832 os=-sunos4
833 ;;
834 sun4os3)
835 basic_machine=sparc-sun
836 os=-sunos3
837 ;;
838 sun4os4)
839 basic_machine=sparc-sun
840 os=-sunos4
841 ;;
842 sun4sol2)
843 basic_machine=sparc-sun
844 os=-solaris2
845 ;;
846 sun3 | sun3-*)
847 basic_machine=m68k-sun
848 ;;
849 sun4)
850 basic_machine=sparc-sun
851 ;;
852 sun386 | sun386i | roadrunner)
853 basic_machine=i386-sun
854 ;;
855 sv1)
856 basic_machine=sv1-cray
857 os=-unicos
858 ;;
859 symmetry)
860 basic_machine=i386-sequent
861 os=-dynix
862 ;;
863 t3e)
864 basic_machine=t3e-cray
865 os=-unicos
866 ;;
867 tic54x | c54x*)
868 basic_machine=tic54x-unknown
869 os=-coff
870 ;;
871 tx39)
872 basic_machine=mipstx39-unknown
873 ;;
874 tx39el)
875 basic_machine=mipstx39el-unknown
876 ;;
877 tower | tower-32)
878 basic_machine=m68k-ncr
879 ;;
880 udi29k)
881 basic_machine=a29k-amd
882 os=-udi
883 ;;
884 ultra3)
885 basic_machine=a29k-nyu
886 os=-sym1
887 ;;
888 v810 | necv810)
889 basic_machine=v810-nec
890 os=-none
891 ;;
892 vaxv)
893 basic_machine=vax-dec
894 os=-sysv
895 ;;
896 vms)
897 basic_machine=vax-dec
898 os=-vms
899 ;;
900 vpp*|vx|vx-*)
901 basic_machine=f301-fujitsu
902 ;;
903 vxworks960)
904 basic_machine=i960-wrs
905 os=-vxworks
906 ;;
907 vxworks68)
908 basic_machine=m68k-wrs
909 os=-vxworks
910 ;;
911 vxworks29k)
912 basic_machine=a29k-wrs
913 os=-vxworks
914 ;;
915 w65*)
916 basic_machine=w65-wdc
917 os=-none
918 ;;
919 w89k-*)
920 basic_machine=hppa1.1-winbond
921 os=-proelf
922 ;;
923 windows32)
924 basic_machine=i386-pc
925 os=-windows32-msvcrt
926 ;;
927 xmp)
928 basic_machine=xmp-cray
929 os=-unicos
930 ;;
931 xps | xps100)
932 basic_machine=xps100-honeywell
933 ;;
934 z8k-*-coff)
935 basic_machine=z8k-unknown
936 os=-sim
937 ;;
938 none)
939 basic_machine=none-none
940 os=-none
941 ;;
942
943 # Here we handle the default manufacturer of certain CPU types. It is in
944 # some cases the only manufacturer, in others, it is the most popular.
945 w89k)
946 basic_machine=hppa1.1-winbond
947 ;;
948 op50n)
949 basic_machine=hppa1.1-oki
950 ;;
951 op60c)
952 basic_machine=hppa1.1-oki
953 ;;
954 mips)
955 if [ x$os = x-linux-gnu ]; then
956 basic_machine=mips-unknown
957 else
958 basic_machine=mips-mips
959 fi
960 ;;
961 romp)
962 basic_machine=romp-ibm
963 ;;
964 rs6000)
965 basic_machine=rs6000-ibm
966 ;;
967 vax)
968 basic_machine=vax-dec
969 ;;
970 pdp10)
971 # there are many clones, so DEC is not a safe bet
972 basic_machine=pdp10-unknown
973 ;;
974 pdp11)
975 basic_machine=pdp11-dec
976 ;;
977 we32k)
978 basic_machine=we32k-att
979 ;;
980 sh3 | sh4 | sh3eb | sh4eb)
981 basic_machine=sh-unknown
982 ;;
983 sparc | sparcv9 | sparcv9b)
984 basic_machine=sparc-sun
985 ;;
986 cydra)
987 basic_machine=cydra-cydrome
988 ;;
989 orion)
990 basic_machine=orion-highlevel
991 ;;
992 orion105)
993 basic_machine=clipper-highlevel
994 ;;
995 mac | mpw | mac-mpw)
996 basic_machine=m68k-apple
997 ;;
998 pmac | pmac-mpw)
999 basic_machine=powerpc-apple
1000 ;;
1001 c4x*)
1002 basic_machine=c4x-none
1003 os=-coff
1004 ;;
1005 *-unknown)
1006 # Make sure to match an already-canonicalized machine name.
1007 ;;
1008 *)
1009 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
1010 exit 1
1011 ;;
1012 esac
1013
1014 # Here we canonicalize certain aliases for manufacturers.
1015 case $basic_machine in
1016 *-digital*)
1017 basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
1018 ;;
1019 *-commodore*)
1020 basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
1021 ;;
1022 *)
1023 ;;
1024 esac
1025
1026 # Decode manufacturer-specific aliases for certain operating systems.
1027
1028 if [ x"$os" != x"" ]
1029 then
1030 case $os in
1031 # First match some system type aliases
1032 # that might get confused with valid system types.
1033 # -solaris* is a basic system type, with this one exception.
1034 -solaris1 | -solaris1.*)
1035 os=`echo $os | sed -e 's|solaris1|sunos4|'`
1036 ;;
1037 -solaris)
1038 os=-solaris2
1039 ;;
1040 -svr4*)
1041 os=-sysv4
1042 ;;
1043 -unixware*)
1044 os=-sysv4.2uw
1045 ;;
1046 -gnu/linux*)
1047 os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
1048 ;;
1049 # First accept the basic system types.
1050 # The portable systems comes first.
1051 # Each alternative MUST END IN A *, to match a version number.
1052 # -sysv* is not here because it comes later, after sysvr4.
1053 -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
1054 | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
1055 | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
1056 | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
1057 | -aos* \
1058 | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
1059 | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
1060 | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
1061 | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
1062 | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
1063 | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
1064 | -chorusos* | -chorusrdb* \
1065 | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
1066 | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
1067 | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
1068 | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
1069 | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
1070 | -os2* | -vos*)
1071 # Remember, each alternative MUST END IN *, to match a version number.
1072 ;;
1073 -qnx*)
1074 case $basic_machine in
1075 x86-* | i*86-*)
1076 ;;
1077 *)
1078 os=-nto$os
1079 ;;
1080 esac
1081 ;;
1082 -nto*)
1083 os=-nto-qnx
1084 ;;
1085 -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
1086 | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
1087 | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
1088 ;;
1089 -mac*)
1090 os=`echo $os | sed -e 's|mac|macos|'`
1091 ;;
1092 -linux*)
1093 os=`echo $os | sed -e 's|linux|linux-gnu|'`
1094 ;;
1095 -sunos5*)
1096 os=`echo $os | sed -e 's|sunos5|solaris2|'`
1097 ;;
1098 -sunos6*)
1099 os=`echo $os | sed -e 's|sunos6|solaris3|'`
1100 ;;
1101 -opened*)
1102 os=-openedition
1103 ;;
1104 -wince*)
1105 os=-wince
1106 ;;
1107 -osfrose*)
1108 os=-osfrose
1109 ;;
1110 -osf*)
1111 os=-osf
1112 ;;
1113 -utek*)
1114 os=-bsd
1115 ;;
1116 -dynix*)
1117 os=-bsd
1118 ;;
1119 -acis*)
1120 os=-aos
1121 ;;
1122 -386bsd)
1123 os=-bsd
1124 ;;
1125 -ctix* | -uts*)
1126 os=-sysv
1127 ;;
1128 -ns2 )
1129 os=-nextstep2
1130 ;;
1131 -nsk*)
1132 os=-nsk
1133 ;;
1134 # Preserve the version number of sinix5.
1135 -sinix5.*)
1136 os=`echo $os | sed -e 's|sinix|sysv|'`
1137 ;;
1138 -sinix*)
1139 os=-sysv4
1140 ;;
1141 -triton*)
1142 os=-sysv3
1143 ;;
1144 -oss*)
1145 os=-sysv3
1146 ;;
1147 -svr4)
1148 os=-sysv4
1149 ;;
1150 -svr3)
1151 os=-sysv3
1152 ;;
1153 -sysvr4)
1154 os=-sysv4
1155 ;;
1156 # This must come after -sysvr4.
1157 -sysv*)
1158 ;;
1159 -ose*)
1160 os=-ose
1161 ;;
1162 -es1800*)
1163 os=-ose
1164 ;;
1165 -xenix)
1166 os=-xenix
1167 ;;
1168 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
1169 os=-mint
1170 ;;
1171 -none)
1172 ;;
1173 *)
1174 # Get rid of the `-' at the beginning of $os.
1175 os=`echo $os | sed 's/[^-]*-//'`
1176 echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
1177 exit 1
1178 ;;
1179 esac
1180 else
1181
1182 # Here we handle the default operating systems that come with various machines.
1183 # The value should be what the vendor currently ships out the door with their
1184 # machine or put another way, the most popular os provided with the machine.
1185
1186 # Note that if you're going to try to match "-MANUFACTURER" here (say,
1187 # "-sun"), then you have to tell the case statement up towards the top
1188 # that MANUFACTURER isn't an operating system. Otherwise, code above
1189 # will signal an error saying that MANUFACTURER isn't an operating
1190 # system, and we'll never get to this point.
1191
1192 case $basic_machine in
1193 *-acorn)
1194 os=-riscix1.2
1195 ;;
1196 arm*-rebel)
1197 os=-linux
1198 ;;
1199 arm*-semi)
1200 os=-aout
1201 ;;
1202 pdp10-*)
1203 os=-tops20
1204 ;;
1205 pdp11-*)
1206 os=-none
1207 ;;
1208 *-dec | vax-*)
1209 os=-ultrix4.2
1210 ;;
1211 m68*-apollo)
1212 os=-domain
1213 ;;
1214 i386-sun)
1215 os=-sunos4.0.2
1216 ;;
1217 m68000-sun)
1218 os=-sunos3
1219 # This also exists in the configure program, but was not the
1220 # default.
1221 # os=-sunos4
1222 ;;
1223 m68*-cisco)
1224 os=-aout
1225 ;;
1226 mips*-cisco)
1227 os=-elf
1228 ;;
1229 mips*-*)
1230 os=-elf
1231 ;;
1232 *-tti) # must be before sparc entry or we get the wrong os.
1233 os=-sysv3
1234 ;;
1235 sparc-* | *-sun)
1236 os=-sunos4.1.1
1237 ;;
1238 *-be)
1239 os=-beos
1240 ;;
1241 *-ibm)
1242 os=-aix
1243 ;;
1244 *-wec)
1245 os=-proelf
1246 ;;
1247 *-winbond)
1248 os=-proelf
1249 ;;
1250 *-oki)
1251 os=-proelf
1252 ;;
1253 *-hp)
1254 os=-hpux
1255 ;;
1256 *-hitachi)
1257 os=-hiux
1258 ;;
1259 i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
1260 os=-sysv
1261 ;;
1262 *-cbm)
1263 os=-amigaos
1264 ;;
1265 *-dg)
1266 os=-dgux
1267 ;;
1268 *-dolphin)
1269 os=-sysv3
1270 ;;
1271 m68k-ccur)
1272 os=-rtu
1273 ;;
1274 m88k-omron*)
1275 os=-luna
1276 ;;
1277 *-next )
1278 os=-nextstep
1279 ;;
1280 *-sequent)
1281 os=-ptx
1282 ;;
1283 *-crds)
1284 os=-unos
1285 ;;
1286 *-ns)
1287 os=-genix
1288 ;;
1289 i370-*)
1290 os=-mvs
1291 ;;
1292 *-next)
1293 os=-nextstep3
1294 ;;
1295 *-gould)
1296 os=-sysv
1297 ;;
1298 *-highlevel)
1299 os=-bsd
1300 ;;
1301 *-encore)
1302 os=-bsd
1303 ;;
1304 *-sgi)
1305 os=-irix
1306 ;;
1307 *-siemens)
1308 os=-sysv4
1309 ;;
1310 *-masscomp)
1311 os=-rtu
1312 ;;
1313 f30[01]-fujitsu | f700-fujitsu)
1314 os=-uxpv
1315 ;;
1316 *-rom68k)
1317 os=-coff
1318 ;;
1319 *-*bug)
1320 os=-coff
1321 ;;
1322 *-apple)
1323 os=-macos
1324 ;;
1325 *-atari*)
1326 os=-mint
1327 ;;
1328 *)
1329 os=-none
1330 ;;
1331 esac
1332 fi
1333
1334 # Here we handle the case where we know the os, and the CPU type, but not the
1335 # manufacturer. We pick the logical manufacturer.
1336 vendor=unknown
1337 case $basic_machine in
1338 *-unknown)
1339 case $os in
1340 -riscix*)
1341 vendor=acorn
1342 ;;
1343 -sunos*)
1344 vendor=sun
1345 ;;
1346 -aix*)
1347 vendor=ibm
1348 ;;
1349 -beos*)
1350 vendor=be
1351 ;;
1352 -hpux*)
1353 vendor=hp
1354 ;;
1355 -mpeix*)
1356 vendor=hp
1357 ;;
1358 -hiux*)
1359 vendor=hitachi
1360 ;;
1361 -unos*)
1362 vendor=crds
1363 ;;
1364 -dgux*)
1365 vendor=dg
1366 ;;
1367 -luna*)
1368 vendor=omron
1369 ;;
1370 -genix*)
1371 vendor=ns
1372 ;;
1373 -mvs* | -opened*)
1374 vendor=ibm
1375 ;;
1376 -ptx*)
1377 vendor=sequent
1378 ;;
1379 -vxsim* | -vxworks*)
1380 vendor=wrs
1381 ;;
1382 -aux*)
1383 vendor=apple
1384 ;;
1385 -hms*)
1386 vendor=hitachi
1387 ;;
1388 -mpw* | -macos*)
1389 vendor=apple
1390 ;;
1391 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
1392 vendor=atari
1393 ;;
1394 -vos*)
1395 vendor=stratus
1396 ;;
1397 esac
1398 basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
1399 ;;
1400 esac
1401
1402 echo $basic_machine$os
1403 exit 0
1404
1405 # Local variables:
1406 # eval: (add-hook 'write-file-hooks 'time-stamp)
1407 # time-stamp-start: "timestamp='"
1408 # time-stamp-format: "%:y-%02m-%02d"
1409 # time-stamp-end: "'"
1410 # End:
1717 ac_help="$ac_help
1818 --disable-sdltest Do not try to compile and run a test SDL program"
1919 ac_help="$ac_help
20 --with-sdl-prefix=PFX Prefix where SDL is installed (optional)"
21 ac_help="$ac_help
22 --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)"
23 ac_help="$ac_help
24 --disable-sdltest Do not try to compile and run a test SDL program"
25 ac_help="$ac_help
2620 --enable-warp Enable mouse warp (for BeOS and Mac)"
2721 ac_help="$ac_help
28 --disable-sound Disables sound"
22 --disable-audio Disables Audio"
2923 ac_help="$ac_help
30 --with-doc-path=DPATH Directory where documentation is saved."
24 --with-docdir=DPATH Directory where documentation is saved."
25 ac_help="$ac_help
26 --disable-network No network support."
27 ac_help="$ac_help
28 --enable-sdl-net Use SDL_Net for networking."
29 ac_help="$ac_help
30 --enable-netdebug Enable net packet debugging."
3131 ac_help="$ac_help
3232 --disable-install No installation. Played from the source directory."
33 ac_help="$ac_help
34 --with-highscore-path=HPATH Directory where global highscore chart is saved."
3533
3634 # Initialize some variables set by options.
3735 # The variables have the same names as the options, with
578576 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
579577 # ./install, which can be erroneously created by make from ./install.sh.
580578 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
581 echo "configure:583: checking for a BSD compatible install" >&5
579 echo "configure:581: checking for a BSD compatible install" >&5
582580 if test -z "$INSTALL"; then
583581 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
584582 echo $ac_n "(cached) $ac_c" 1>&6
631629 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
632630
633631 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
634 echo "configure:636: checking whether build environment is sane" >&5
632 echo "configure:634: checking whether build environment is sane" >&5
635633 # Just in case
636634 sleep 1
637635 echo timestamp > conftestfile
688686 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
689687
690688 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
691 echo "configure:693: checking whether ${MAKE-make} sets \${MAKE}" >&5
689 echo "configure:691: checking whether ${MAKE-make} sets \${MAKE}" >&5
692690 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
693691 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
694692 echo $ac_n "(cached) $ac_c" 1>&6
717715
718716 PACKAGE=lbreakout2
719717
720 VERSION=2.2.2
718 VERSION=2.5.2
721719
722720 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
723721 { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
734732
735733 missing_dir=`cd $ac_aux_dir && pwd`
736734 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
737 echo "configure:739: checking for working aclocal" >&5
735 echo "configure:737: checking for working aclocal" >&5
738736 # Run test in a subshell; some versions of sh will print an error if
739737 # an executable is not found, even if stderr is redirected.
740738 # Redirect stdin to placate older versions of autoconf. Sigh.
747745 fi
748746
749747 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
750 echo "configure:752: checking for working autoconf" >&5
748 echo "configure:750: checking for working autoconf" >&5
751749 # Run test in a subshell; some versions of sh will print an error if
752750 # an executable is not found, even if stderr is redirected.
753751 # Redirect stdin to placate older versions of autoconf. Sigh.
760758 fi
761759
762760 echo $ac_n "checking for working automake""... $ac_c" 1>&6
763 echo "configure:765: checking for working automake" >&5
761 echo "configure:763: checking for working automake" >&5
764762 # Run test in a subshell; some versions of sh will print an error if
765763 # an executable is not found, even if stderr is redirected.
766764 # Redirect stdin to placate older versions of autoconf. Sigh.
773771 fi
774772
775773 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
776 echo "configure:778: checking for working autoheader" >&5
774 echo "configure:776: checking for working autoheader" >&5
777775 # Run test in a subshell; some versions of sh will print an error if
778776 # an executable is not found, even if stderr is redirected.
779777 # Redirect stdin to placate older versions of autoconf. Sigh.
786784 fi
787785
788786 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
789 echo "configure:791: checking for working makeinfo" >&5
787 echo "configure:789: checking for working makeinfo" >&5
790788 # Run test in a subshell; some versions of sh will print an error if
791789 # an executable is not found, even if stderr is redirected.
792790 # Redirect stdin to placate older versions of autoconf. Sigh.
803801 # Extract the first word of "gcc", so it can be a program name with args.
804802 set dummy gcc; ac_word=$2
805803 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
806 echo "configure:808: checking for $ac_word" >&5
804 echo "configure:806: checking for $ac_word" >&5
807805 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
808806 echo $ac_n "(cached) $ac_c" 1>&6
809807 else
833831 # Extract the first word of "cc", so it can be a program name with args.
834832 set dummy cc; ac_word=$2
835833 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
836 echo "configure:838: checking for $ac_word" >&5
834 echo "configure:836: checking for $ac_word" >&5
837835 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
838836 echo $ac_n "(cached) $ac_c" 1>&6
839837 else
884882 # Extract the first word of "cl", so it can be a program name with args.
885883 set dummy cl; ac_word=$2
886884 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
887 echo "configure:889: checking for $ac_word" >&5
885 echo "configure:887: checking for $ac_word" >&5
888886 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
889887 echo $ac_n "(cached) $ac_c" 1>&6
890888 else
916914 fi
917915
918916 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
919 echo "configure:921: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
917 echo "configure:919: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
920918
921919 ac_ext=c
922920 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
927925
928926 cat > conftest.$ac_ext << EOF
929927
930 #line 932 "configure"
928 #line 930 "configure"
931929 #include "confdefs.h"
932930
933931 main(){return(0);}
934932 EOF
935 if { (eval echo configure:937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
933 if { (eval echo configure:935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
936934 ac_cv_prog_cc_works=yes
937935 # If we can't run a trivial program, we are probably using a cross compiler.
938936 if (./conftest; exit) 2>/dev/null; then
958956 { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
959957 fi
960958 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
961 echo "configure:963: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
959 echo "configure:961: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
962960 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
963961 cross_compiling=$ac_cv_prog_cc_cross
964962
965963 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
966 echo "configure:968: checking whether we are using GNU C" >&5
964 echo "configure:966: checking whether we are using GNU C" >&5
967965 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
968966 echo $ac_n "(cached) $ac_c" 1>&6
969967 else
972970 yes;
973971 #endif
974972 EOF
975 if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
973 if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:975: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
976974 ac_cv_prog_gcc=yes
977975 else
978976 ac_cv_prog_gcc=no
991989 ac_save_CFLAGS="$CFLAGS"
992990 CFLAGS=
993991 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
994 echo "configure:996: checking whether ${CC-cc} accepts -g" >&5
992 echo "configure:994: checking whether ${CC-cc} accepts -g" >&5
995993 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
996994 echo $ac_n "(cached) $ac_c" 1>&6
997995 else
10251023 # Extract the first word of "ranlib", so it can be a program name with args.
10261024 set dummy ranlib; ac_word=$2
10271025 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
1028 echo "configure:1030: checking for $ac_word" >&5
1026 echo "configure:1028: checking for $ac_word" >&5
10291027 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
10301028 echo $ac_n "(cached) $ac_c" 1>&6
10311029 else
10521050 echo "$ac_t""no" 1>&6
10531051 fi
10541052
1053 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
1054 echo "configure:1056: checking for Cygwin environment" >&5
1055 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
1056 echo $ac_n "(cached) $ac_c" 1>&6
1057 else
1058 cat > conftest.$ac_ext <<EOF
1059 #line 1061 "configure"
1060 #include "confdefs.h"
1061
1062 int main() {
1063
1064 #ifndef __CYGWIN__
1065 #define __CYGWIN__ __CYGWIN32__
1066 #endif
1067 return __CYGWIN__;
1068 ; return 0; }
1069 EOF
1070 if { (eval echo configure:1072: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
1071 rm -rf conftest*
1072 ac_cv_cygwin=yes
1073 else
1074 echo "configure: failed program was:" >&5
1075 cat conftest.$ac_ext >&5
1076 rm -rf conftest*
1077 ac_cv_cygwin=no
1078 fi
1079 rm -f conftest*
1080 rm -f conftest*
1081 fi
1082
1083 echo "$ac_t""$ac_cv_cygwin" 1>&6
1084 CYGWIN=
1085 test "$ac_cv_cygwin" = yes && CYGWIN=yes
1086 echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
1087 echo "configure:1089: checking for mingw32 environment" >&5
1088 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
1089 echo $ac_n "(cached) $ac_c" 1>&6
1090 else
1091 cat > conftest.$ac_ext <<EOF
1092 #line 1094 "configure"
1093 #include "confdefs.h"
1094
1095 int main() {
1096 return __MINGW32__;
1097 ; return 0; }
1098 EOF
1099 if { (eval echo configure:1101: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
1100 rm -rf conftest*
1101 ac_cv_mingw32=yes
1102 else
1103 echo "configure: failed program was:" >&5
1104 cat conftest.$ac_ext >&5
1105 rm -rf conftest*
1106 ac_cv_mingw32=no
1107 fi
1108 rm -f conftest*
1109 rm -f conftest*
1110 fi
1111
1112 echo "$ac_t""$ac_cv_mingw32" 1>&6
1113 MINGW32=
1114 test "$ac_cv_mingw32" = yes && MINGW32=yes
1115
1116
1117 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
1118 echo "configure:1120: checking for executable suffix" >&5
1119 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
1120 echo $ac_n "(cached) $ac_c" 1>&6
1121 else
1122 if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
1123 ac_cv_exeext=.exe
1124 else
1125 rm -f conftest*
1126 echo 'int main () { return 0; }' > conftest.$ac_ext
1127 ac_cv_exeext=
1128 if { (eval echo configure:1130: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
1129 for file in conftest.*; do
1130 case $file in
1131 *.$ac_ext | *.c | *.o | *.obj) ;;
1132 *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
1133 esac
1134 done
1135 else
1136 { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
1137 fi
1138 rm -f conftest*
1139 test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
1140 fi
1141 fi
1142
1143 EXEEXT=""
1144 test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
1145 echo "$ac_t""${ac_cv_exeext}" 1>&6
1146 ac_exeext=$EXEEXT
1147
10551148
10561149 echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
1057 echo "configure:1059: checking for main in -lm" >&5
1150 echo "configure:1152: checking for main in -lm" >&5
10581151 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
10591152 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
10601153 echo $ac_n "(cached) $ac_c" 1>&6
10621155 ac_save_LIBS="$LIBS"
10631156 LIBS="-lm $LIBS"
10641157 cat > conftest.$ac_ext <<EOF
1065 #line 1067 "configure"
1158 #line 1160 "configure"
10661159 #include "confdefs.h"
10671160
10681161 int main() {
10691162 main()
10701163 ; return 0; }
10711164 EOF
1072 if { (eval echo configure:1074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1165 if { (eval echo configure:1167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
10731166 rm -rf conftest*
10741167 eval "ac_cv_lib_$ac_lib_var=yes"
10751168 else
10971190 { echo "configure: error: lib math is needed" 1>&2; exit 1; }
10981191 fi
10991192
1193 echo $ac_n "checking for main in -lz""... $ac_c" 1>&6
1194 echo "configure:1196: checking for main in -lz" >&5
1195 ac_lib_var=`echo z'_'main | sed 'y%./+-%__p_%'`
1196 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
1197 echo $ac_n "(cached) $ac_c" 1>&6
1198 else
1199 ac_save_LIBS="$LIBS"
1200 LIBS="-lz $LIBS"
1201 cat > conftest.$ac_ext <<EOF
1202 #line 1204 "configure"
1203 #include "confdefs.h"
1204
1205 int main() {
1206 main()
1207 ; return 0; }
1208 EOF
1209 if { (eval echo configure:1211: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1210 rm -rf conftest*
1211 eval "ac_cv_lib_$ac_lib_var=yes"
1212 else
1213 echo "configure: failed program was:" >&5
1214 cat conftest.$ac_ext >&5
1215 rm -rf conftest*
1216 eval "ac_cv_lib_$ac_lib_var=no"
1217 fi
1218 rm -f conftest*
1219 LIBS="$ac_save_LIBS"
1220
1221 fi
1222 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
1223 echo "$ac_t""yes" 1>&6
1224 ac_tr_lib=HAVE_LIB`echo z | sed -e 's/[^a-zA-Z0-9_]/_/g' \
1225 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
1226 cat >> confdefs.h <<EOF
1227 #define $ac_tr_lib 1
1228 EOF
1229
1230 LIBS="-lz $LIBS"
1231
1232 else
1233 echo "$ac_t""no" 1>&6
1234 { echo "configure: error: libz is needed" 1>&2; exit 1; }
1235 fi
1236
11001237 echo $ac_n "checking for main in -lpng""... $ac_c" 1>&6
1101 echo "configure:1103: checking for main in -lpng" >&5
1238 echo "configure:1240: checking for main in -lpng" >&5
11021239 ac_lib_var=`echo png'_'main | sed 'y%./+-%__p_%'`
11031240 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
11041241 echo $ac_n "(cached) $ac_c" 1>&6
11061243 ac_save_LIBS="$LIBS"
11071244 LIBS="-lpng $LIBS"
11081245 cat > conftest.$ac_ext <<EOF
1109 #line 1111 "configure"
1246 #line 1248 "configure"
11101247 #include "confdefs.h"
11111248
11121249 int main() {
11131250 main()
11141251 ; return 0; }
11151252 EOF
1116 if { (eval echo configure:1118: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1253 if { (eval echo configure:1255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
11171254 rm -rf conftest*
11181255 eval "ac_cv_lib_$ac_lib_var=yes"
11191256 else
11441281
11451282 CFLAGS="$CFLAGS -Wall"
11461283
1147 sdl_flag=""
11481284 # Check whether --with-sdl-prefix or --without-sdl-prefix was given.
11491285 if test "${with_sdl_prefix+set}" = set; then
11501286 withval="$with_sdl_prefix"
11861322 # Extract the first word of "sdl-config", so it can be a program name with args.
11871323 set dummy sdl-config; ac_word=$2
11881324 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
1189 echo "configure:1191: checking for $ac_word" >&5
1325 echo "configure:1327: checking for $ac_word" >&5
11901326 if eval "test \"`echo '$''{'ac_cv_path_SDL_CONFIG'+set}'`\" = set"; then
11911327 echo $ac_n "(cached) $ac_c" 1>&6
11921328 else
12191355 echo "$ac_t""no" 1>&6
12201356 fi
12211357
1222 min_sdl_version=1.0.0
1358 min_sdl_version=1.2.0
12231359 echo $ac_n "checking for SDL - version >= $min_sdl_version""... $ac_c" 1>&6
1224 echo "configure:1226: checking for SDL - version >= $min_sdl_version" >&5
1360 echo "configure:1362: checking for SDL - version >= $min_sdl_version" >&5
12251361 no_sdl=""
12261362 if test "$SDL_CONFIG" = "no" ; then
12271363 no_sdl=yes
12451381 echo $ac_n "cross compiling; assumed OK... $ac_c"
12461382 else
12471383 cat > conftest.$ac_ext <<EOF
1248 #line 1250 "configure"
1384 #line 1386 "configure"
12491385 #include "confdefs.h"
12501386
12511387 #include <stdio.h>
13001436
13011437
13021438 EOF
1303 if { (eval echo configure:1305: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
1439 if { (eval echo configure:1441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
13041440 then
13051441 :
13061442 else
13341470 CFLAGS="$CFLAGS $SDL_CFLAGS"
13351471 LIBS="$LIBS $SDL_LIBS"
13361472 cat > conftest.$ac_ext <<EOF
1337 #line 1339 "configure"
1473 #line 1475 "configure"
13381474 #include "confdefs.h"
13391475
13401476 #include <stdio.h>
13441480 return 0;
13451481 ; return 0; }
13461482 EOF
1347 if { (eval echo configure:1349: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1483 if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
13481484 rm -rf conftest*
13491485 echo "*** The test program compiled, but did not run. This usually means"
13501486 echo "*** that the run-time linker is not finding SDL or finding the wrong"
13791515
13801516 CFLAGS="$CFLAGS $SDL_CFLAGS"
13811517 LIBS="$LIBS $SDL_LIBS"
1382 # Check whether --with-sdl-prefix or --without-sdl-prefix was given.
1383 if test "${with_sdl_prefix+set}" = set; then
1384 withval="$with_sdl_prefix"
1385 sdl_prefix="$withval"
1386 else
1387 sdl_prefix=""
1388 fi
1389
1390 # Check whether --with-sdl-exec-prefix or --without-sdl-exec-prefix was given.
1391 if test "${with_sdl_exec_prefix+set}" = set; then
1392 withval="$with_sdl_exec_prefix"
1393 sdl_exec_prefix="$withval"
1394 else
1395 sdl_exec_prefix=""
1396 fi
1397
1398 # Check whether --enable-sdltest or --disable-sdltest was given.
1399 if test "${enable_sdltest+set}" = set; then
1400 enableval="$enable_sdltest"
1401 :
1402 else
1403 enable_sdltest=yes
1404 fi
1405
1406
1407 if test x$sdl_exec_prefix != x ; then
1408 sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
1409 if test x${SDL_CONFIG+set} != xset ; then
1410 SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
1411 fi
1412 fi
1413 if test x$sdl_prefix != x ; then
1414 sdl_args="$sdl_args --prefix=$sdl_prefix"
1415 if test x${SDL_CONFIG+set} != xset ; then
1416 SDL_CONFIG=$sdl_prefix/bin/sdl-config
1417 fi
1418 fi
1419
1420 # Extract the first word of "sdl-config", so it can be a program name with args.
1421 set dummy sdl-config; ac_word=$2
1422 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
1423 echo "configure:1425: checking for $ac_word" >&5
1424 if eval "test \"`echo '$''{'ac_cv_path_SDL_CONFIG'+set}'`\" = set"; then
1425 echo $ac_n "(cached) $ac_c" 1>&6
1426 else
1427 case "$SDL_CONFIG" in
1428 /*)
1429 ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path.
1430 ;;
1431 ?:/*)
1432 ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a dos path.
1433 ;;
1434 *)
1435 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
1436 ac_dummy="$PATH"
1437 for ac_dir in $ac_dummy; do
1438 test -z "$ac_dir" && ac_dir=.
1439 if test -f $ac_dir/$ac_word; then
1440 ac_cv_path_SDL_CONFIG="$ac_dir/$ac_word"
1441 break
1442 fi
1443 done
1444 IFS="$ac_save_ifs"
1445 test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no"
1446 ;;
1447 esac
1448 fi
1449 SDL_CONFIG="$ac_cv_path_SDL_CONFIG"
1450 if test -n "$SDL_CONFIG"; then
1451 echo "$ac_t""$SDL_CONFIG" 1>&6
1452 else
1453 echo "$ac_t""no" 1>&6
1454 fi
1455
1456 min_sdl_version=1.1.5
1457 echo $ac_n "checking for SDL - version >= $min_sdl_version""... $ac_c" 1>&6
1458 echo "configure:1460: checking for SDL - version >= $min_sdl_version" >&5
1459 no_sdl=""
1460 if test "$SDL_CONFIG" = "no" ; then
1461 no_sdl=yes
1462 else
1463 SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
1464 SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs`
1465
1466 sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
1467 sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
1468 sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
1469 sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
1470 sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
1471 sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
1472 if test "x$enable_sdltest" = "xyes" ; then
1473 ac_save_CFLAGS="$CFLAGS"
1474 ac_save_LIBS="$LIBS"
1475 CFLAGS="$CFLAGS $SDL_CFLAGS"
1476 LIBS="$LIBS $SDL_LIBS"
1477 rm -f conf.sdltest
1478 if test "$cross_compiling" = yes; then
1479 echo $ac_n "cross compiling; assumed OK... $ac_c"
1480 else
1481 cat > conftest.$ac_ext <<EOF
1482 #line 1484 "configure"
1483 #include "confdefs.h"
1484
1485 #include <stdio.h>
1486 #include <stdlib.h>
1487 #include <string.h>
1488 #include "SDL.h"
1489
1490 char*
1491 my_strdup (char *str)
1492 {
1493 char *new_str;
1494
1495 if (str)
1496 {
1497 new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
1498 strcpy (new_str, str);
1499 }
1500 else
1501 new_str = NULL;
1502
1503 return new_str;
1504 }
1505
1506 int main (int argc, char *argv[])
1507 {
1508 int major, minor, micro;
1509 char *tmp_version;
1510
1511 /* This hangs on some systems (?)
1512 system ("touch conf.sdltest");
1513 */
1514 { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
1515
1516 /* HP/UX 9 (%@#!) writes to sscanf strings */
1517 tmp_version = my_strdup("$min_sdl_version");
1518 if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
1519 printf("%s, bad version string\n", "$min_sdl_version");
1520 exit(1);
1521 }
1522
1523 if (($sdl_major_version > major) ||
1524 (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
1525 (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
1526 {
1527 return 0;
1528 }
1529 else
1530 {
1531 return 1;
1532 }
1533 }
1534
1535
1536 EOF
1537 if { (eval echo configure:1539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
1538 then
1539 :
1540 else
1541 echo "configure: failed program was:" >&5
1542 cat conftest.$ac_ext >&5
1543 rm -fr conftest*
1544 no_sdl=yes
1545 fi
1546 rm -fr conftest*
1547 fi
1548
1549 CFLAGS="$ac_save_CFLAGS"
1550 LIBS="$ac_save_LIBS"
1551 fi
1552 fi
1553 if test "x$no_sdl" = x ; then
1554 echo "$ac_t""yes" 1>&6
1555 sdl_flag="-DSDL_1_1_5"
1556 else
1557 echo "$ac_t""no" 1>&6
1558 if test "$SDL_CONFIG" = "no" ; then
1559 echo "*** The sdl-config script installed by SDL could not be found"
1560 echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
1561 echo "*** your path, or set the SDL_CONFIG environment variable to the"
1562 echo "*** full path to sdl-config."
1563 else
1564 if test -f conf.sdltest ; then
1565 :
1566 else
1567 echo "*** Could not run SDL test program, checking why..."
1568 CFLAGS="$CFLAGS $SDL_CFLAGS"
1569 LIBS="$LIBS $SDL_LIBS"
1570 cat > conftest.$ac_ext <<EOF
1571 #line 1573 "configure"
1572 #include "confdefs.h"
1573
1574 #include <stdio.h>
1575 #include "SDL.h"
1576
1577 int main() {
1578 return 0;
1579 ; return 0; }
1580 EOF
1581 if { (eval echo configure:1583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1582 rm -rf conftest*
1583 echo "*** The test program compiled, but did not run. This usually means"
1584 echo "*** that the run-time linker is not finding SDL or finding the wrong"
1585 echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
1586 echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
1587 echo "*** to the installed location Also, make sure you have run ldconfig if that"
1588 echo "*** is required on your system"
1589 echo "***"
1590 echo "*** If you have an old version installed, it is best to remove it, although"
1591 echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
1592 else
1593 echo "configure: failed program was:" >&5
1594 cat conftest.$ac_ext >&5
1595 rm -rf conftest*
1596 echo "*** The test program failed to compile or link. See the file config.log for the"
1597 echo "*** exact error that occured. This usually means SDL was incorrectly installed"
1598 echo "*** or that you have moved SDL since it was installed. In the latter case, you"
1599 echo "*** may want to edit the sdl-config script: $SDL_CONFIG"
1600 fi
1601 rm -f conftest*
1602 CFLAGS="$ac_save_CFLAGS"
1603 LIBS="$ac_save_LIBS"
1604 fi
1605 fi
1606 SDL_CFLAGS=""
1607 SDL_LIBS=""
1608 :
1609 fi
1610
1611
1612 rm -f conf.sdltest
1613
1614 CFLAGS="$CFLAGS $sdl_flag"
16151518
16161519 warp_flag=""
16171520 # Check whether --enable-warp or --disable-warp was given.
16221525
16231526
16241527
1625 sound_flag="-DSOUND"
1528 audio_flag="-DAUDIO_ENABLED"
16261529 mixer_flag="-lSDL_mixer"
1627 # Check whether --enable-sound or --disable-sound was given.
1628 if test "${enable_sound+set}" = set; then
1629 enableval="$enable_sound"
1630 sound_flag=""; mixer_flag=""
1530 # Check whether --enable-audio or --disable-audio was given.
1531 if test "${enable_audio+set}" = set; then
1532 enableval="$enable_audio"
1533 audio_flag=""; mixer_flag=""
16311534 fi
16321535
16331536
16341537 echo $ac_n "checking for main in -lSDL_mixer""... $ac_c" 1>&6
1635 echo "configure:1637: checking for main in -lSDL_mixer" >&5
1538 echo "configure:1540: checking for main in -lSDL_mixer" >&5
16361539 ac_lib_var=`echo SDL_mixer'_'main | sed 'y%./+-%__p_%'`
16371540 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
16381541 echo $ac_n "(cached) $ac_c" 1>&6
16401543 ac_save_LIBS="$LIBS"
16411544 LIBS="-lSDL_mixer $LIBS"
16421545 cat > conftest.$ac_ext <<EOF
1643 #line 1645 "configure"
1546 #line 1548 "configure"
16441547 #include "confdefs.h"
16451548
16461549 int main() {
16471550 main()
16481551 ; return 0; }
16491552 EOF
1650 if { (eval echo configure:1652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1553 if { (eval echo configure:1555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
16511554 rm -rf conftest*
16521555 eval "ac_cv_lib_$ac_lib_var=yes"
16531556 else
16651568 echo "$ac_t"""SDL_Mixer found"" 1>&6
16661569 else
16671570 echo "$ac_t""no" 1>&6
1668 echo "$ac_t"""SDL_Mixer NOT found: Audio disabled"" 1>&6; sound_flag=""; mixer_flag=""
1669 fi
1670
1671
1672
1571 echo "$ac_t"""SDL_Mixer NOT found \(http://libsdl.org\): Audio disabled"" 1>&6; audio_flag=""; mixer_flag=""
1572 fi
1573
1574
1575
1576
1577
1578
1579 # Make sure we can run config.sub.
1580 if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
1581 else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
1582 fi
1583
1584 echo $ac_n "checking host system type""... $ac_c" 1>&6
1585 echo "configure:1587: checking host system type" >&5
1586
1587 host_alias=$host
1588 case "$host_alias" in
1589 NONE)
1590 case $nonopt in
1591 NONE)
1592 if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
1593 else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
1594 fi ;;
1595 *) host_alias=$nonopt ;;
1596 esac ;;
1597 esac
1598
1599 host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
1600 host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
1601 host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
1602 host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
1603 echo "$ac_t""$host" 1>&6
16731604
16741605
16751606 doc_dir="/usr/doc"
1676 # Check whether --with-doc-path or --without-doc-path was given.
1677 if test "${with_doc_path+set}" = set; then
1678 withval="$with_doc_path"
1607 # Check whether --with-docdir or --without-docdir was given.
1608 if test "${with_docdir+set}" = set; then
1609 withval="$with_docdir"
16791610 doc_dir="$withval"
16801611 fi
16811612
16821613
16831614
1684 inst_dir="$datadir/games/lbreakout2"
1685 hi_dir="/var/lib/games"
1615 network_flag="-DNETWORK_ENABLED"
1616 # Check whether --enable-network or --disable-network was given.
1617 if test "${enable_network+set}" = set; then
1618 enableval="$enable_network"
1619 network_flag=""
1620 fi
1621
1622
1623
1624 sdlnet_flag=""
1625 sdlnet_lib_flag=""
1626 # Check whether --enable-sdl-net or --disable-sdl-net was given.
1627 if test "${enable_sdl_net+set}" = set; then
1628 enableval="$enable_sdl_net"
1629 sdlnet_flag="-DSDL_NET_ENABLED"; sdlnet_lib_flag="-lSDL_net"
1630 fi
1631
1632
1633
1634 if test "$sdlnet_flag" == "-DSDL_NET_ENABLED" ; then
1635 echo $ac_n "checking for main in -lSDL_net""... $ac_c" 1>&6
1636 echo "configure:1638: checking for main in -lSDL_net" >&5
1637 ac_lib_var=`echo SDL_net'_'main | sed 'y%./+-%__p_%'`
1638 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
1639 echo $ac_n "(cached) $ac_c" 1>&6
1640 else
1641 ac_save_LIBS="$LIBS"
1642 LIBS="-lSDL_net $LIBS"
1643 cat > conftest.$ac_ext <<EOF
1644 #line 1646 "configure"
1645 #include "confdefs.h"
1646
1647 int main() {
1648 main()
1649 ; return 0; }
1650 EOF
1651 if { (eval echo configure:1653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
1652 rm -rf conftest*
1653 eval "ac_cv_lib_$ac_lib_var=yes"
1654 else
1655 echo "configure: failed program was:" >&5
1656 cat conftest.$ac_ext >&5
1657 rm -rf conftest*
1658 eval "ac_cv_lib_$ac_lib_var=no"
1659 fi
1660 rm -f conftest*
1661 LIBS="$ac_save_LIBS"
1662
1663 fi
1664 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
1665 echo "$ac_t""yes" 1>&6
1666 echo "$ac_t"""SDL_net found"" 1>&6
1667 else
1668 echo "$ac_t""no" 1>&6
1669 echo "$ac_t"""SDL_net NOT found \(http://libsdl.org\): Networking disabled"" 1>&6; sdlnet_flag=""; sdlnet_lib_flag=""; network_flag=""
1670 fi
1671
1672 fi
1673
1674 netdebug_flag=""
1675 # Check whether --enable-netdebug or --disable-netdebug was given.
1676 if test "${enable_netdebug+set}" = set; then
1677 enableval="$enable_netdebug"
1678 netdebug_flag="-DNET_DEBUG_MSG"
1679 fi
1680
1681
1682
1683 inst_dir="$datadir/lbreakout2"
1684 hi_dir=$localstatedir
16861685
16871686 # Check whether --enable-install or --disable-install was given.
16881687 if test "${enable_install+set}" = set; then
16911690 fi
16921691
16931692
1694 # Check whether --with-highscore-path or --without-highscore-path was given.
1695 if test "${with_highscore_path+set}" = set; then
1696 withval="$with_highscore_path"
1697 hi_dir="$withval"
1698 fi
1699
1700
17011693 inst_flag="-DSRC_DIR=\\\"$inst_dir\\\""
17021694 hi_inst_flag="-DHI_DIR=\\\"$hi_dir\\\""
17031695
17041696
17051697
17061698
1699
1700
1701 case "$host" in
1702 *-mingw32)
1703 win32="yes"
1704 win32_inst_script="`pwd -W`/installer.iss"
1705 arch_flag="-march=i586"
1706 win32_deps="lbreakout2res.o" ;;
1707 *)
1708 win32="no"
1709 win32_inst_script=""
1710 arch_flag=""
1711 win32_deps="" ;;
1712 esac
1713
1714
1715
1716
1717 if test "x$win32" = xyes; then
1718 for ac_prog in mawk gawk nawk awk
1719 do
1720 # Extract the first word of "$ac_prog", so it can be a program name with args.
1721 set dummy $ac_prog; ac_word=$2
1722 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
1723 echo "configure:1725: checking for $ac_word" >&5
1724 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
1725 echo $ac_n "(cached) $ac_c" 1>&6
1726 else
1727 if test -n "$AWK"; then
1728 ac_cv_prog_AWK="$AWK" # Let the user override the test.
1729 else
1730 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
1731 ac_dummy="$PATH"
1732 for ac_dir in $ac_dummy; do
1733 test -z "$ac_dir" && ac_dir=.
1734 if test -f $ac_dir/$ac_word; then
1735 ac_cv_prog_AWK="$ac_prog"
1736 break
1737 fi
1738 done
1739 IFS="$ac_save_ifs"
1740 fi
1741 fi
1742 AWK="$ac_cv_prog_AWK"
1743 if test -n "$AWK"; then
1744 echo "$ac_t""$AWK" 1>&6
1745 else
1746 echo "$ac_t""no" 1>&6
1747 fi
1748
1749 test -n "$AWK" && break
1750 done
1751
1752
1753 # Extract the first word of "strip", so it can be a program name with args.
1754 set dummy strip; ac_word=$2
1755 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
1756 echo "configure:1758: checking for $ac_word" >&5
1757 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
1758 echo $ac_n "(cached) $ac_c" 1>&6
1759 else
1760 if test -n "$STRIP"; then
1761 ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
1762 else
1763 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
1764 ac_dummy="$PATH"
1765 for ac_dir in $ac_dummy; do
1766 test -z "$ac_dir" && ac_dir=.
1767 if test -f $ac_dir/$ac_word; then
1768 ac_cv_prog_STRIP="strip"
1769 break
1770 fi
1771 done
1772 IFS="$ac_save_ifs"
1773 fi
1774 fi
1775 STRIP="$ac_cv_prog_STRIP"
1776 if test -n "$STRIP"; then
1777 echo "$ac_t""$STRIP" 1>&6
1778 else
1779 echo "$ac_t""no" 1>&6
1780 fi
1781
1782 test -z "${STRIP}" && { echo "configure: error: strip was not found on this system" 1>&2; exit 1; }
1783
1784
1785 fi
1786
1787 appname="LBreakout2"
17071788
17081789
17091790 trap '' 1 2 15
18071888 ac_given_srcdir=$srcdir
18081889 ac_given_INSTALL="$INSTALL"
18091890
1810 trap 'rm -fr `echo "Makefile src/Makefile src/docs/Makefile src/gfx/Makefile src/sounds/Makefile src/levels/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
1891 trap 'rm -fr `echo "Makefile
1892 docs/Makefile
1893 common/Makefile
1894 game/Makefile
1895 gui/Makefile
1896 client/Makefile
1897 client/gui_theme/Makefile
1898 client/gfx/Makefile
1899 client/gfx/AbsoluteB/Makefile
1900 client/gfx/Oz/Makefile
1901 client/gfx/Moiree/Makefile
1902 client/gfx/Classic/Makefile
1903 client/sounds/Makefile
1904 client/levels/Makefile
1905 server/Makefile
1906 server/levels/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
18111907 EOF
18121908 cat >> $CONFIG_STATUS <<EOF
18131909
18521948 s%@SET_MAKE@%$SET_MAKE%g
18531949 s%@CC@%$CC%g
18541950 s%@RANLIB@%$RANLIB%g
1951 s%@EXEEXT@%$EXEEXT%g
18551952 s%@SDL_CONFIG@%$SDL_CONFIG%g
18561953 s%@SDL_CFLAGS@%$SDL_CFLAGS%g
18571954 s%@SDL_LIBS@%$SDL_LIBS%g
18581955 s%@warp_flag@%$warp_flag%g
1859 s%@sound_flag@%$sound_flag%g
1956 s%@audio_flag@%$audio_flag%g
18601957 s%@mixer_flag@%$mixer_flag%g
1958 s%@host@%$host%g
1959 s%@host_alias@%$host_alias%g
1960 s%@host_cpu@%$host_cpu%g
1961 s%@host_vendor@%$host_vendor%g
1962 s%@host_os@%$host_os%g
18611963 s%@doc_dir@%$doc_dir%g
1964 s%@network_flag@%$network_flag%g
1965 s%@sdlnet_flag@%$sdlnet_flag%g
1966 s%@sdlnet_lib_flag@%$sdlnet_lib_flag%g
1967 s%@netdebug_flag@%$netdebug_flag%g
18621968 s%@inst_flag@%$inst_flag%g
18631969 s%@hi_inst_flag@%$hi_inst_flag%g
18641970 s%@inst_dir@%$inst_dir%g
18651971 s%@hi_dir@%$hi_dir%g
1972 s%@win32_deps@%$win32_deps%g
1973 s%@arch_flag@%$arch_flag%g
1974 s%@AWK@%$AWK%g
1975 s%@STRIP@%$STRIP%g
1976 s%@win32_inst_script@%$win32_inst_script%g
1977 s%@appname@%$appname%g
18661978
18671979 CEOF
18681980 EOF
19042016
19052017 cat >> $CONFIG_STATUS <<EOF
19062018
1907 CONFIG_FILES=\${CONFIG_FILES-"Makefile src/Makefile src/docs/Makefile src/gfx/Makefile src/sounds/Makefile src/levels/Makefile"}
2019 CONFIG_FILES=\${CONFIG_FILES-"Makefile
2020 docs/Makefile
2021 common/Makefile
2022 game/Makefile
2023 gui/Makefile
2024 client/Makefile
2025 client/gui_theme/Makefile
2026 client/gfx/Makefile
2027 client/gfx/AbsoluteB/Makefile
2028 client/gfx/Oz/Makefile
2029 client/gfx/Moiree/Makefile
2030 client/gfx/Classic/Makefile
2031 client/sounds/Makefile
2032 client/levels/Makefile
2033 server/Makefile
2034 server/levels/Makefile"}
19082035 EOF
19092036 cat >> $CONFIG_STATUS <<\EOF
19102037 for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
22
33 AM_CONFIG_HEADER(config.h)
44
5 AM_INIT_AUTOMAKE(lbreakout2,2.2.2)
5 AM_INIT_AUTOMAKE(lbreakout2,2.5.2)
66
77 dnl Checks for programs.
88 AC_PROG_CC
99 AC_PROG_RANLIB
10 AC_EXEEXT
1011
1112 dnl Checks for libraries.
1213 AC_CHECK_LIB(m, main,, AC_MSG_ERROR(lib math is needed))
14 AC_CHECK_LIB(z, main,, AC_MSG_ERROR(libz is needed))
1315 AC_CHECK_LIB(png, main,, AC_MSG_ERROR(libpng is needed))
1416
1517 CFLAGS="$CFLAGS -Wall"
1618
1719 dnl check SDL version
18 sdl_flag=""
19 AM_PATH_SDL(1.0.0,, AC_MSG_ERROR(lib SDL is needed))
20 AM_PATH_SDL(1.2.0,, AC_MSG_ERROR(lib SDL is needed))
2021 CFLAGS="$CFLAGS $SDL_CFLAGS"
2122 LIBS="$LIBS $SDL_LIBS"
22 AM_PATH_SDL(1.1.5, sdl_flag="-DSDL_1_1_5",)
23 CFLAGS="$CFLAGS $sdl_flag"
2423
2524 dnl check warp mouse flag
2625 warp_flag=""
2928 AC_SUBST(warp_flag)
3029
3130 dnl check sound
32 sound_flag="-DSOUND"
31 audio_flag="-DAUDIO_ENABLED"
3332 mixer_flag="-lSDL_mixer"
34 AC_ARG_ENABLE( sound,
35 [ --disable-sound Disables sound], sound_flag=""; mixer_flag="")
33 AC_ARG_ENABLE( audio,
34 [ --disable-audio Disables Audio], audio_flag=""; mixer_flag="")
3635
3736 dnl check if SDL_mixer's installed
3837 dnl if not: clear sound_flag and mixer_flag
3938 AC_CHECK_LIB(SDL_mixer, main,
4039 AC_MSG_RESULT("SDL_Mixer found"),
41 AC_MSG_RESULT("SDL_Mixer NOT found: Audio disabled"); sound_flag=""; mixer_flag="")
40 AC_MSG_RESULT("SDL_Mixer NOT found \(http://libsdl.org\): Audio disabled"); audio_flag=""; mixer_flag="")
4241
43 AC_SUBST(sound_flag)
42 AC_SUBST(audio_flag)
4443 AC_SUBST(mixer_flag)
44
45 dnl get host info
46 AC_CANONICAL_HOST
4547
4648 dnl documentation path
4749 doc_dir="/usr/doc"
4850 dnl check if manually overwriting doc path
49 AC_ARG_WITH( doc-path,
50 [ --with-doc-path=DPATH Directory where documentation is saved.],
51 AC_ARG_WITH( docdir,
52 [ --with-docdir=DPATH Directory where documentation is saved.],
5153 doc_dir="$withval",)
52 dnl substitute
5354 AC_SUBST(doc_dir)
5455
56 dnl network support
57 network_flag="-DNETWORK_ENABLED"
58 AC_ARG_ENABLE( network,
59 [ --disable-network No network support.], network_flag="" )
60 AC_SUBST(network_flag)
61
62 dnl SDL_net usage
63 sdlnet_flag=""
64 sdlnet_lib_flag=""
65 AC_ARG_ENABLE( sdl-net,
66 [ --enable-sdl-net Use SDL_Net for networking.], sdlnet_flag="-DSDL_NET_ENABLED"; sdlnet_lib_flag="-lSDL_net" )
67 AC_SUBST(sdlnet_flag)
68 AC_SUBST(sdlnet_lib_flag)
69 if test "$sdlnet_flag" == "-DSDL_NET_ENABLED" ; then
70 dnl check if SDL_net is installed
71 AC_CHECK_LIB(SDL_net, main,
72 AC_MSG_RESULT("SDL_net found"),
73 AC_MSG_RESULT("SDL_net NOT found \(http://libsdl.org\): Networking disabled"); sdlnet_flag=""; sdlnet_lib_flag=""; network_flag="")
74 fi
75
76 dnl network debug
77 netdebug_flag=""
78 AC_ARG_ENABLE( netdebug,
79 [ --enable-netdebug Enable net packet debugging.], netdebug_flag="-DNET_DEBUG_MSG" )
80 AC_SUBST(netdebug_flag)
81
5582 dnl installation&highscore path
56 inst_dir="$datadir/games/lbreakout2"
57 hi_dir="/var/lib/games"
83 inst_dir="$datadir/lbreakout2"
84 hi_dir=$localstatedir
5885
5986 dnl check if installation was disabled
6087 AC_ARG_ENABLE( install,
6188 [ --disable-install No installation. Played from the source directory.],
6289 inst_dir="." hi_dir="." )
63
64 dnl check if manually overwriting highscore path
65 AC_ARG_WITH( highscore-path,
66 [ --with-highscore-path=HPATH Directory where global highscore chart is saved.],
67 hi_dir="$withval",)
6890
6991 inst_flag="-DSRC_DIR=\\\"$inst_dir\\\""
7092 hi_inst_flag="-DHI_DIR=\\\"$hi_dir\\\""
7496 AC_SUBST(inst_dir)
7597 AC_SUBST(hi_dir)
7698
77 AC_OUTPUT(Makefile src/Makefile src/docs/Makefile src/gfx/Makefile src/sounds/Makefile src/levels/Makefile)
99 case "$host" in
100 *-mingw32)
101 win32="yes"
102 win32_inst_script="`pwd -W`/installer.iss"
103 arch_flag="-march=i586"
104 win32_deps="lbreakout2res.o" ;;
105 *)
106 win32="no"
107 win32_inst_script=""
108 arch_flag=""
109 win32_deps="" ;;
110 esac
111
112 AC_SUBST(win32_deps)
113 AC_SUBST(arch_flag)
114
115 if test "x$win32" = xyes; then
116 AC_PROG_AWK
117 AC_PROG_STRIP
118 dnl AC_PROG_ISCC
119 AC_SUBST(win32_inst_script)
120 fi
121
122 appname="LBreakout2"
123 AC_SUBST(appname)
124
125 AC_OUTPUT(
126 Makefile
127 docs/Makefile
128 common/Makefile
129 game/Makefile
130 gui/Makefile
131 client/Makefile
132 client/gui_theme/Makefile
133 client/gfx/Makefile
134 client/gfx/AbsoluteB/Makefile
135 client/gfx/Oz/Makefile
136 client/gfx/Moiree/Makefile
137 client/gfx/Classic/Makefile
138 client/sounds/Makefile
139 client/levels/Makefile
140 server/Makefile
141 server/levels/Makefile)
0 EXTRA_DIST = index.html \
1 x0.jpg x1.jpg x2.jpg x3.jpg x4.jpg x5.jpg x6.jpg x7.jpg \
2 x8.jpg x9.jpg x10.jpg x11.jpg x12.jpg x13.jpg x14.jpg \
3 x15.jpg x16.jpg x17.jpg x18.jpg x19.jpg x20.jpg x21.jpg \
4 x22.jpg x23.jpg \
5 b0.jpg b1.jpg b2.jpg b3.jpg b4.jpg b5.jpg b6.jpg \
6 warp.jpg screen.jpg
7
8 install-data-local:
9 $(mkinstalldirs) $(DESTDIR)$(doc_dir)/lbreakout2
10 @for file in *.jpg; do\
11 $(INSTALL_DATA) $$file $(DESTDIR)$(doc_dir)/lbreakout2/$$file;\
12 done
13 $(INSTALL_DATA) index.html $(DESTDIR)$(doc_dir)/lbreakout2/index.html
14
15 win32-install-script:
16 @for file in $(EXTRA_DIST); do \
17 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\docs\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
18 done
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = index.html x0.jpg x1.jpg x2.jpg x3.jpg x4.jpg x5.jpg x6.jpg x7.jpg x8.jpg x9.jpg x10.jpg x11.jpg x12.jpg x13.jpg x14.jpg x15.jpg x16.jpg x17.jpg x18.jpg x19.jpg x20.jpg x21.jpg x22.jpg x23.jpg b0.jpg b1.jpg b2.jpg b3.jpg b4.jpg b5.jpg b6.jpg warp.jpg screen.jpg
92
93 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
94 CONFIG_HEADER = ../config.h
95 CONFIG_CLEAN_FILES =
96 DIST_COMMON = Makefile.am Makefile.in
97
98
99 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
100
101 TAR = tar
102 GZIP_ENV = --best
103 all: all-redirect
104 .SUFFIXES:
105 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
106 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps docs/Makefile
107
108 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
109 cd $(top_builddir) \
110 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
111
112 tags: TAGS
113 TAGS:
114
115
116 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
117
118 subdir = docs
119
120 distdir: $(DISTFILES)
121 @for file in $(DISTFILES); do \
122 d=$(srcdir); \
123 if test -d $$d/$$file; then \
124 cp -pr $$d/$$file $(distdir)/$$file; \
125 else \
126 test -f $(distdir)/$$file \
127 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
128 || cp -p $$d/$$file $(distdir)/$$file || :; \
129 fi; \
130 done
131 info-am:
132 info: info-am
133 dvi-am:
134 dvi: dvi-am
135 check-am: all-am
136 check: check-am
137 installcheck-am:
138 installcheck: installcheck-am
139 install-exec-am:
140 install-exec: install-exec-am
141
142 install-data-am: install-data-local
143 install-data: install-data-am
144
145 install-am: all-am
146 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
147 install: install-am
148 uninstall-am:
149 uninstall: uninstall-am
150 all-am: Makefile
151 all-redirect: all-am
152 install-strip:
153 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
154 installdirs:
155
156
157 mostlyclean-generic:
158
159 clean-generic:
160
161 distclean-generic:
162 -rm -f Makefile $(CONFIG_CLEAN_FILES)
163 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
164
165 maintainer-clean-generic:
166 mostlyclean-am: mostlyclean-generic
167
168 mostlyclean: mostlyclean-am
169
170 clean-am: clean-generic mostlyclean-am
171
172 clean: clean-am
173
174 distclean-am: distclean-generic clean-am
175
176 distclean: distclean-am
177
178 maintainer-clean-am: maintainer-clean-generic distclean-am
179 @echo "This command is intended for maintainers to use;"
180 @echo "it deletes files that may require special tools to rebuild."
181
182 maintainer-clean: maintainer-clean-am
183
184 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
185 installcheck-am installcheck install-exec-am install-exec \
186 install-data-local install-data-am install-data install-am install \
187 uninstall-am uninstall all-redirect all-am all installdirs \
188 mostlyclean-generic distclean-generic clean-generic \
189 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
190
191
192 install-data-local:
193 $(mkinstalldirs) $(DESTDIR)$(doc_dir)/lbreakout2
194 @for file in *.jpg; do\
195 $(INSTALL_DATA) $$file $(DESTDIR)$(doc_dir)/lbreakout2/$$file;\
196 done
197 $(INSTALL_DATA) index.html $(DESTDIR)$(doc_dir)/lbreakout2/index.html
198
199 win32-install-script:
200 @for file in $(EXTRA_DIST); do \
201 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\docs\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
202 done
203
204 # Tell versions [3.59,3.63) of GNU make to not export all variables.
205 # Otherwise a system limit (for SysV at least) may be exceeded.
206 .NOEXPORT:
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 <HTML>
1
2 <HEAD>
3 <TITLE>LBreakout2 Manual</TITLE>
4 </HEAD>
5
6 <BODY bgcolor="#ffffff" link="#0000ff" alink="#0000ff" vlink="#0000ff">
7
8 <DIV align="center">
9 <H1>LBreakout2 Manual</H1>
10 maintained by Michael Speck<BR>last change: 03/05/24
11 </DIV>
12
13 <!-- toc -->
14 <P>
15 <H2><A name="toc">Table Of Contents</A></H2>
16 <UL>
17 <LI>
18 <A href="#gameplay">Game Play</A>
19 <UL>
20 <LI><A href="#basics">Basics</A></LI>
21 <LI><A href="#bonus">Bonus/Malus</A></LI>
22 <LI><A href="#bricks">Special Bricks</A></LI>
23 <LI><A href="#keys">Keys</A></LI>
24 <LI><A href="#resume">Resuming A Local Game</A></LI>
25 <LI><A href="#network">Network Game</A></LI>
26 </UL>
27 </LI>
28 <LI>
29 <A href="#editor">Editor</A>
30 <UL>
31 <LI><A href="#misc">Miscellany</A></LI>
32 <LI><A href="#screen">Editor Layout</A></LI>
33 <LI><A href="#howto">How To Edit</A></LI>
34 </UL>
35 </LI>
36 <LI>
37 <A href="#theme">Themes</A>
38 <UL>
39 <LI><A href="#theme_misc">Miscellany</A></LI>
40 <LI><A href="#theme_howto">How To Make A Theme</A></LI>
41 </UL>
42 </LI>
43 </UL>
44 </P>
45
46 <!-- game play -->
47 <P>
48 <H2><A name="gameplay">Game Play</A></H2>
49 <!-- basics -->
50 <H3><A name="basics">Basics</A></H3>
51 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
52 Okay, I guess all of you know how to play breakout basically. Ball bounces around -->
53 paddle keeps ball in game -> all bricks destroyed --> next level ;-D<BR>
54 The chosen difficulty level has some influence
55 on the size of the paddle, the speed of balls and the score gained.
56 <TABLE border=1>
57 <TR><TD>Level</TD><TD>paddle size (in pixel)</TD><TD>ball speed (in pixels per second)</TD><TD>score modification</TD></TR>
58 <TR><TD>Easy</TD><TD>72 - 180</TD><TD>240 - 400</TD><TD>-20%</TD></TR>
59 <TR><TD>Medium</TD><TD>72 - 144</TD><TD>270 - 430</TD><TD>0</TD></TR>
60 <TR><TD>Hard</TD><TD>52 - 108</TD><TD>300 - 450</TD><TD>+30%</TD></TR>
61 </TABLE>
62 If there is more than one player the next player will get his/her chance when the current
63 one restarts the level or looses all balls. The name of the current/next player is displayed
64 in the right top corner of the screen and before each turn.
65 </TD></TR></TABLE>
66 <!-- bonus/malus -->
67 <H3><A name="bonus">Bonus/Malus</A></H3>
68 <TABLE border=0 cellpadding=5 cellspacing=5>
69 <TR><TD colspan=4>
70 A destroyed brick may release a bonus or malus which will move down slowly. It's
71 used as soon as it is collected by paddle.</TD></TR>
72 <TR bgcolor="#f2f2f2"><TD>Name</TD><TD>Time (in sec)</TD><TD>Picture</TD><TD>Description</TD></TR>
73 <TR bgcolor="#d0f2d0"><TD>Extra Score</TD><TD>-</TD><TD><IMG src="x0.jpg"></TD><TD>Gives you the score written on it.</TD></TR>
74 <TR bgcolor="#d0f2d0"><TD>End Of The Rainbow</TD><TD>20</TD><TD><IMG src="x1.jpg"></TD><TD>If you destroy a brick with no bonus assigned it will release 1000 points extra score!</TD></TR>
75 <TR bgcolor="#d0f2d0"><TD>Expand Paddle</TD><TD>-</TD><TD><IMG src="x3.jpg"></TD><TD>Expands your paddle about one tile (the maxium size depends on the chosen difficulty level).</TD></TR>
76 <TR bgcolor="#d0f2d0"><TD>Extra Life</TD><TD>-</TD><TD><IMG src="x4.jpg"></TD><TD>Gives you one extra life (paddle).</TD></TR>
77 <TR bgcolor="#d0f2d0"><TD>Sticky Paddle</TD><TD>20</TD><TD><IMG src="x5.jpg"></TD><TD>Balls touching the paddle will keep attached until you press fire.</TD></TR>
78 <TR bgcolor="#d0f2d0"><TD>Energy Balls</TD><TD>5</TD><TD><IMG src="x6.jpg"></TD><TD>Balls won't be reflected at a brick but go directly through it.</TD></TR>
79 <TR bgcolor="#d0f2d0"><TD>Extra Ball</TD><TD>-</TD><TD><IMG src="x7.jpg"></TD><TD>Creates a new ball.</TD></TR>
80 <TR bgcolor="#d0f2d0"><TD>Bonus floor</TD><TD>10</TD><TD><IMG src="x8.jpg"></TD><TD>Closes the screen so no balls can get lost.</TD></TR>
81 <TR bgcolor="#d0f2d0"><TD>Weapon</TD><TD>5</TD><TD><IMG src="x10.jpg"></TD><TD>Adds a weapon to the paddle.</TD></TR>
82 <TR bgcolor="#d0f2d0"><TD>Speed Down</TD><TD>20</TD><TD><IMG src="x13.jpg"></TD><TD>Deccelerates all balls to mimum speed.</TD></TR>
83 <TR bgcolor="#d0f2d0"><TD>Joker</TD><TD>-</TD><TD><IMG src="x14.jpg"></TD><TD>Collects all bonus on screen instantly and destroys all malus. Doubles score and time of the collected bonus!</TD></TR>
84 <TR bgcolor="#d0f2d0"><TD>Explosive Balls</TD><TD>10</TD><TD><IMG src="x20.jpg"></TD><TD>When hitting a brick balls will cause an explosion destroying all surounding bricks.</TD></TR>
85 <TR bgcolor="#d0f2d0"><TD>Bonus Magnet</TD><TD>20</TD><TD><IMG src="x21.jpg"></TD><TD>While this bonus is active the paddle will attract other bonuses.</TD></TR>
86
87 <TR bgcolor="#f2f2f2"><TD>Reset</TD><TD>-</TD><TD><IMG src="x18.jpg"></TD><TD>All active bonuses and maluses will be reset.</TD></TR>
88 <TR bgcolor="#f2f2f2"><TD>Time-Add</TD><TD>-</TD><TD><IMG src="x19.jpg"></TD><TD>All active bonuses and maluses will last seven seconds longer.</TD></TR>
89 <TR bgcolor="#f2f2f2"><TD>Random Extra</TD><TD>-</TD><TD><IMG src="x11.jpg"></TD><TD>Gives you any of the listed extras.</TD></TR>
90
91 <TR bgcolor="#f2d0d0"><TD>Speed Up</TD><TD>20</TD><TD><IMG src="x12.jpg"></TD><TD>Accelerates all balls to maximum speed.</TD></TR>
92 <TR bgcolor="#f2d0d0"><TD>Frozen Paddle</TD><TD>1</TD><TD><IMG src="x9.jpg"></TD><TD>Freezes the paddle (no movement possible).</TD></TR>
93 <TR bgcolor="#f2d0d0"><TD>Shrink Paddle</TD><TD>-</TD><TD><IMG src="x2.jpg"></TD><TD>Shrinks your paddle about one paddle tile (18 pixels).</TD></TR>
94 <TR bgcolor="#f2d0d0"><TD>Lights Out!</TD><TD>20</TD><TD><IMG src="x15.jpg"></TD><TD>Total darkness. All you see is a shade of paddle, balls and extras.</TD></TR>
95 <TR bgcolor="#f2d0d0"><TD>Chaos</TD><TD>20</TD><TD><IMG src="x16.jpg"></TD><TD>Balls are reflected randomly at bricks. (but not at paddle)</TD></TR>
96 <TR bgcolor="#f2d0d0"><TD>Ghostly Paddle</TD><TD>20</TD><TD><IMG src="x17.jpg"></TD><TD>Paddle disappears when not moving and won't reflect any balls then. (nor does it collect bonuses)</TD></TR>
97 <TR bgcolor="#f2d0d0"><TD>Malus Magnet</TD><TD>20</TD><TD><IMG src="x22.jpg"></TD><TD>While this malus is active the paddle will attract other maluses.</TD></TR>
98 <TR bgcolor="#f2d0d0"><TD>Weak Balls</TD><TD>10</TD><TD><IMG src="x23.jpg"></TD><TD>With this malus active there is a 40% chance that a ball won't damage a brick.</TD></TR>
99
100 </TD></TR></TABLE>
101 <!-- special bricks -->
102 <H3><A name="bricks">Special Bricks</A></H3>
103 <TABLE border=0 cellpadding=5 cellspacing=5>
104 <TR bgcolor="#f2f2f2"><TD>Name</TD><TD>Picture</TD><TD>Description</TD></TR>
105 <TR bgcolor="#f2f2f2"><TD>Shielded Brick</TD><TD><IMG src="b6.jpg"></TD><TD>This brick is indestructible even for energy balls.</TD></TR>
106 <TR bgcolor="#f2f2f2"><TD>Metal Brick</TD><TD><IMG src="b0.jpg"></TD><TD>This wall is indestructible except for energy balls.</TD></TR>
107 <TR bgcolor="#f2f2f2"><TD>Chaotic Brick</TD><TD><IMG src="b4.jpg"></TD><TD>Similiar to the Chaos Malus the ball is reflected randomly at such a brick.</TD></TR>
108 <TR bgcolor="#f2f2f2"><TD>Strong Brick</TD><TD><IMG src="b1.jpg"></TD><TD>These walls take up to three shots before destruction and grow darker with every hit. NOTE: to this series belongs a forth brick which is invisbile.</TD></TR>
109 <TR bgcolor="#f2f2f2"><TD>Regenerating Brick</TD><TD><IMG src="b5.jpg"></TD><TD>This brick will regenerate one point durability within four seconds if not hit again.</TD></TR>
110 <TR bgcolor="#f2f2f2"><TD>Explosive Brick</TD><TD><IMG src="b2.jpg"></TD><TD>This bricks destroys its neighbors on destruction.</TD></TR>
111 <TR bgcolor="#f2f2f2"><TD>Growing Brick</TD><TD><IMG src="b3.jpg"></TD><TD>If this brick is destroyed it creates up to 8 new bricks.</TD></TR>
112 </TD></TR></TABLE>
113 <!-- keys -->
114 <H3><A name="keys">Keys</A></H3>
115 <TABLE border=0 cellpadding=5 cellspacing=5>
116 <TR bgcolor="#f2f2f2"><TD colspan=2>There are some predefined keys for LBreakout:</TD></TR>
117 <TR bgcolor="#f2f2f2"><TD>h or F1</TD><TD>Display quick help.</TD></TR>
118 <TR bgcolor="#f2f2f2"><TD>Escape</TD><TD>Quit LBreakout (after confirmation).</TD></TR>
119 <TR bgcolor="#f2f2f2"><TD>p</TD><TD>Pause game.</TD></TR>
120 <TR bgcolor="#f2f2f2"><TD>r</TD><TD>Restart level. If more than player the next one will get his chance before this player may play the restarted level!</TD></TR>
121 <TR bgcolor="#f2f2f2"><TD>w</TD><TD>Warp to next level after required percentage of bricks was cleared.
122 As soon as this is possible a blinking icon will appear at the bottom right-hand side of the screen:
123 <IMG alt="" src="warp.jpg">. This option can be set in menu <I>Advanced Options</I>. It does
124 only apply to AddOn levelsets as it is meant as a workaround for bad leveldesign.</TD></TR>
125 <TR bgcolor="#f2f2f2"><TD>d</TD><TD>Switch to the <i>Plane Of Inner Stability</I> and disintegrate single bricks. Again, this only works in AddOn levelsets to remove bricks that are hard to hit.</TD></TR>
126 <TR bgcolor="#f2f2f2"><TD>f</TD><TD>Switch Fullscreen and Windowed mode.</TD></TR>
127 <TR bgcolor="#f2f2f2"><TD>a</TD><TD>Change animation level (off/low/high).</TD></TR>
128 <TR bgcolor="#f2f2f2"><TD>s</TD><TD>Turn on/off sound.</TD></TR>
129 </TABLE>
130 <!-- resume game -->
131 <H3><A name="resume">Resuming A Local Game</A></H3>
132 If you quit a game, it may be continued later by 'Resume Last Game' in menu 'Local Game'. While the current
133 player, all scores and lives are saved, the state of the level itself is not. Thus if you break up a game
134 and resume it later, the level of each player will be reset. Therefore it is recommended to quit a game
135 right after a level was finished (quite difficult for multiple players, yes). A highscore entry will not
136 be created! If you don't intend to resume the game later but want to enter the highscores, you'll
137 have to loose all balls.
138 <!-- network game -->
139 <H3><A name="network">Network Game</A></H3>
140 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
141 You can play LBreakout2 against another human via network. Therefore you'll have
142 to connect to a server or run a server and have your friends connected. <BR>
143 <B>Start A Server</B><BR>
144 After you started the program <I>lbreakout2server</I> with any of the following options
145 <TABLE border=1>
146 <TR><TD>-p &lt;PORT&gt;</TD><TD>the port the server shall run at (default is 2002)</TD></TR>
147 <TR><TD>-l &lt;LIMIT&gt;</TD><TD>maximum number of users that may connect to the server (default is 30)</TD></TR>
148 <TR><TD>-m &lt;MESSAGE&gt;</TD><TD>this message is displayed to welcome a user</TD></TR>
149 <TR><TD>-a &lt;PASSWORD&gt;</TD><TD>a user that logs in with this name will become administrator named <I>admin</I> (default is no admin)</TD></TR>
150 <TR><TD>-f &lt;FRAMERATE&gt;</TD><TD>is the number of calls to the send/recv handler per second. The default is 33.</TD></TR>
151 </TABLE>
152 you can obtain your IP address by using <I>/sbin/ifconfig</I>. If you want to play
153 via LAN the <I>inet addr</I> of device <I>eth0</I> is important and for internet
154 connections it's the <I>inet addr</I> of device <I>ppp0</I>.<BR>
155 <B>Playing</B><BR>
156 How to play is explained in the in-game help accessable via the 'Help' button
157 at the bottom right-hand side in the network chatroom.<BR>
158 <B>New Playing Grounds</B><BR>
159 You can build new levelsets combining <I>pingpong</I> and <I>normal</I> ones.
160 Such a levelset must start with 'N_'. An 'upload' command is planned but right
161 now the only way to make a new levelset available is to copy it to the server's
162 levelset directory (default: /usr/local/share/games/lbreakout2/levels) and restart
163 the server.
164 </TD></TR></TABLE>
165 </P>
166 <P>
167 <A href="#toc">ToC</A>
168 </P>
169
170 <!-- editor -->
171 <P>
172 <H2><A name="editor">Editor</A></H2>
173 <!-- general -->
174 <H3><A name="misc">Miscellany</A></H3>
175 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
176 All files you edit are saved to <B>~/.lbreakout2/levels</B>. This '~' you see in front of
177 the name when choosing levelset for playing is not part of the file name but added afterwards
178 to separate the files in the installation path from the files in the config path (these you may
179 edit).
180 </TD></TR></TABLE>
181 <!-- screen -->
182 <H3><A name="screen">Editor Layout</A></H3>
183 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2">
184 <TR>
185 <TD><CENTER><IMG alt="editor overview" src="screen.jpg"></CENTER></TD>
186 <TD>
187 Actions like quit, save, load, clear, add, insert, remove require a confirmation for safety.
188 <OL>
189 <LI>Editable Part</LI>
190 <LI>Bricks and Bonus</LI>
191 <LI>Information about location of set file and how many levels you already created, which level your currently on and how many levels more you may create. If you marked a level for swap it's displayed there, too.</LI>
192 <LI>Click on title to change title of this level.</LI>
193 <LI>Click here to change author's name for this level.</LI>
194 <LI>Click here to test this level.</LI>
195 <LI>Go to first level.</LI>
196 <LI>Go to next level.</LI>
197 <LI>Go to previous level.</LI>
198 <LI>Clear all bricks and bonus in this level.</LI>
199 <LI>Swap two levels. On first click the current level will be marked (info displayed in region 3), on second click the current and the marked level will be swapped.</LI>
200 <LI>Insert a level at the end (copies title and author of previously last level).</LI>
201 <LI>Insert a level at current position (copying current title and author).</LI>
202 <LI>Remove current level.</LI>
203 <LI>Reload this level set (discards all unsaved changes).</LI>
204 <LI>Save this levelset (save all changes).</LI>
205 </UL>
206 </TD>
207 </TR>
208 </TABLE>
209 <!-- how to edit -->
210 <H3><A name="howto">How To Edit</A></H3>
211 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
212 Very simple. Select a brick or a bonus by left-click (right-click into the section to switch between the
213 brick and the bonus set) from the bottom of the screen (red-yellow selection
214 frame) go to the editable part and left-click. Right click will remove a brick
215 (any brick and its bonus if a brick's selected) or bonus (any bonus without touching the
216 brick if bonus selected). You may move the mouse while having left or right buttom
217 pressed. To parse/add/remove any levels or save/load this set use the buttons as explained
218 above. You may use the cursor keys, too (UP - first level, RIGHT - next level,
219 LEFT - previous level). Pressing ESCAPE leaves the editor after confirmation.
220 </TD></TR></TABLE>
221 </P>
222 <P>
223 <A href="#toc">ToC</A>
224 </P>
225
226 <!-- themes -->
227 <P>
228 <H2><A name="theme">Themes</A></H2>
229 <!-- miscellany-->
230 <H3><A name="theme_misc">Miscellany</A></H3>
231 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
232 <P>
233 If you want to run LBreakout2 with other graphics and sounds you can create a
234 theme which allows you to modify <U>all</U> game graphics and sounds.
235 The use of new backgrounds is also allowed. The following list contains all editable
236 graphics and sounds. What you have to do to edit them is explained <A href="#theme_howto">below</A>.
237 </P>
238 <P>
239 <I>Editable graphics:</I>
240 <TABLE border=0 cellpadding=2 cellspacing=2>
241 <TR><TD bgcolor="#dddddd">backgrounds</TD><TD>Handling of backgrounds is special. As long as you do not provide a back0.png file
242 the original backgrounds are used. If you want to use self-made backgrounds
243 you'll have to save them as back<I>indices</I>.png where your first indices must be 0.
244 If this happens LBreakout2 will only use the backgrounds found in your theme directory (six backgrounds at maximum).
245 This means if you only provide one background LBreakout2 will only use this background
246 throughout the game as long as your theme is running.</TD></TR>
247 <TR><TD bgcolor="#dddddd">ball.png</TD><TD></TD></TR>
248 <TR><TD bgcolor="#dddddd">bricks.png</TD><TD></TD></TR>
249 <TR><TD bgcolor="#dddddd">menuback.png</TD><TD>background of the main menu</TD></TR>
250 <TR><TD bgcolor="#dddddd">cr_back.png</TD><TD>background of the chatroom</TD></TR>
251 <TR><TD bgcolor="#dddddd">explosions.png</TD><TD>normal explosions</TD></TR>
252 <TR><TD bgcolor="#dddddd">explosions_dark.png</TD><TD>explosions if darkness malus is active</TD></TR>
253 <TR><TD bgcolor="#dddddd">extras.png</TD><TD>bonuses and maluses</TD></TR>
254 <TR><TD bgcolor="#dddddd">f_frame.png</TD><TD>font used for score and player name in the right upper corner of the frame</TD></TR>
255 <TR><TD bgcolor="#dddddd">f_game.png</TD><TD>font used for level credits and confirmation</TD></TR>
256 <TR><TD bgcolor="#dddddd">floor.png</TD><TD>bonus floor that is used to close playing field (optional)</TD></TR>
257 <TR><TD bgcolor="#dddddd">fr_left.png</TD><TD>left part of frame</TD></TR>
258 <TR><TD bgcolor="#dddddd">fr_right.png</TD><TD>right part of frame</TD></TR>
259 <TR><TD bgcolor="#dddddd">fr_top.png</TD><TD>top part of frame</TD></TR>
260 <TR><TD bgcolor="#dddddd">fr_mp_left.png</TD><TD>left part of frame for network game</TD></TR>
261 <TR><TD bgcolor="#dddddd">fr_mp_right.png</TD><TD>right part of frame for network game</TD></TR>
262 <TR><TD bgcolor="#dddddd">life.png</TD><TD>life lamps displayed in the left bottom corner of the frame</TD></TR>
263 <TR><TD bgcolor="#dddddd">paddle.png</TD><TD></TD></TR>
264 <TR><TD bgcolor="#dddddd">shine.png</TD><TD>animation running accross bricks</TD></TR>
265 <TR><TD bgcolor="#dddddd">shot.png</TD><TD>shot of the plasma weapon</TD></TR>
266 <TR><TD bgcolor="#dddddd">warp.png</TD><TD>icon that blinks at the bottom right-hand side of the screen when warp became possible</TD></TR>
267 <TR><TD bgcolor="#dddddd">weapon.png</TD><TD>weapon displayed on the paddle</TD></TR>
268 </TABLE>
269 </P>
270 <P>
271 <I>Editable sounds:</I>
272 <TABLE border=0 cellpadding=2 cellspacing=2>
273 <TR><TD bgcolor="#dddddd">attach.wav</TD><TD>played if ball is attached to sticky paddle</TD><TD bgcolor="#dddddd">joker.wav</TD><TD>bonus sound</TD></TR>
274 <TR><TD bgcolor="#dddddd">bonus_magnet.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">looselife.wav</TD><TD>played if you loose a life</TD></TR>
275 <TR><TD bgcolor="#dddddd">chaos.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">malus_magnet.wav</TD><TD>malus sound</TD></TR>
276 <TR><TD bgcolor="#dddddd">click.wav</TD><TD>played if key was pressed (e.g. confirmation)</TD><TD bgcolor="#dddddd">metal.wav</TD><TD>enery ball sound</TD></TR>
277 <TR><TD bgcolor="#dddddd">dammit.wav</TD><TD><I>Dammit!</I> speech sample</TD><TD bgcolor="#dddddd">reflect.wav</TD><TD>ball reflection sound</TD></TR>
278 <TR><TD bgcolor="#dddddd">damn.wav</TD><TD><i>Damn!</I> speech sample</TD><TD bgcolor="#dddddd">score.wav</TD><TD>bonus sound</TD></TR>
279 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">darkness.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">shot.wav</TD><TD>weapon's firing noise</TD></TR>
280 <TR><TD bgcolor="#dddddd">disable.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">shrink.wav</TD><TD>malus sound</TD></TR>
281 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">excellent.wav</TD><TD><I>Excellent!</I> speech sample</TD><TD bgcolor="#dddddd">speeddown.wav</TD><TD>bonus sound</TD></TR>
282 <TR><TD bgcolor="#dddddd">exp.wav</TD><TD>brick explosion sound</TD><TD bgcolor="#dddddd">speedup.wav</TD><TD>malus sound</TD></TR>
283 <TR><TD bgcolor="#dddddd">expand.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">standard.wav</TD><TD>standard sound for collecting an extra </TD></TR>
284 <TR><TD bgcolor="#dddddd">expl_ball.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">timeadd.wav</TD><TD>bonus sound</TD></TR>
285 <TR><TD bgcolor="#dddddd">extraball.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">verygood.wav</TD><TD><I>Very Good!</I> speech sample</TD></TR>
286 <TR><TD bgcolor="#dddddd">freeze.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">wall.wav</TD><TD>bonus sound</TD></TR>
287 <TR><TD bgcolor="#dddddd">gainlife.wav</TD><TD>played if you got an extralife</TD><TD bgcolor="#dddddd">weak_ball.wav</TD><TD>malus sound</TD></TR>
288 <TR><TD bgcolor="#dddddd">ghost.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">wontgiveup.wav</TD><TD><I>I won't give up!</I> speech sample</TD></TR>
289 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">goldshower.wav</TD><TD>bonus sound</TD><TD>&nbsp;</TD></TR>
290 </TABLE>
291 </P>
292 </TD></TR></TABLE>
293 <!-- steps -->
294 <H3><A name="theme_howto">How To Make A Theme</A></H3>
295 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
296 <OL>
297 <LI>Create a directory in <I>~/.lgames/lbreakout2-themes</I> with the name of your theme.</LI>
298 <LI>
299 Have a look at the original graphics and sounds located in the
300 <I>gfx</I> and <I>sounds</I> directory in the <I>source path</I> or
301 in <I>/usr/local/share/games/lbreakout2</I>.
302 </LI>
303 <LI>
304 Now change a graphic or sound to your liking and save it with the
305 same name to <I>~/.lgames/lbreakout2-themes</I>. <BR>
306 <I>Note:</I>
307 <UL>
308 <LI>You <U>must not</U> change the measurements of a graphic. The only exception is <I>warp.png</I> which will be centered to the bottom right-side of the frame.</LI>
309 <LI>You <u>must not</U> save it to a subdirectory <I>gfx</I> or <I>sounds</I> but directly to <I>~/.lgames/lbreakout2-themes/MyTheme</I>.</LI>
310 <LI>A graphic or sound that can't be found in your theme directory is loaded from the
311 original resources.</LI>
312 <LI>Handling of backgrounds is special. As long as you do not provide a back0.png file
313 the original backgrounds are used. If you want to use self-made backgrounds
314 you'll have to save them as back<I>indices</I>.png where your first indices must be 0.
315 If this happens LBreakout2 will only use the backgrounds found in your theme directory (six backgrounds at maximum).
316 This means if you only provide one background LBreakout2 will only use this background
317 throughout the game as long as your theme is running.
318 <LI>
319 Some bricks require multiple hits before destruction as explained in section
320 <A href="#bricks">Special Bricks</A> thus we have two 'groups' of bricks
321 <I>Strong Bricks</I> (4th - 7th) and <I>Regenerative Bricks</I> (8th - 10th).
322 Everytime a brick from such a group is hit the id is decreased
323 by one and if we are at the very <I>left</I> brick thus the first id of the group it
324 will be cleared. So as these bricks belong together they should look consistent.
325 All other bricks are independent.
326 </LI>
327 <LI>The default colorkey (transparency) is pure black (0x000000).
328 <BR>Exceptions:
329 <UL>
330 <LI>All frame graphics (fr_*.png) use the upper right pixel of fr_right.png as color key.</LI>
331 <LI>All fonts (f_*.png) use the very first pixel (0,0) as color key.</LI>
332 <LI><I>paddle.png</I> uses the very first pixel (0,0) as color key.</LI>
333 <LI><I>extras.png</I> has no color key by default and <I>bricks.png</I> has black as
334 default color key <U>but</U> in both cases you may add a single last column (one pixel width)
335 with a custom color key.</LI>
336 </UL>
337 </LI>
338 <LI><I>floor.png</I> is an optional PNG. Per default a line of
339 indestructible bricks will be drawn when you catch the 'bonus floor'. (closes the playing
340 field) If you provide this PNG, however, it will be drawn instead thus it must have the
341 size of 560x20. (same as the fr_top.png) It uses black as color key.
342 </LI>
343 </UL>
344 </LI>
345 <LI>
346 Add a file named ABOUT to your theme directory. The first 255 characters will be
347 displayed in the menu as quick info about your levelset so you should still provide a
348 README with more detailed information. The
349 ABOUT file should contain name, version, author and a short description.
350 </LI>
351 <LI>
352 Run LBreakout2 and select your theme in <I>Advanced Options/Select Theme</I>.
353 </LI>
354 <LI>
355 If everything works fine add a README with credits and a description.
356 </LI>
357 <LI>
358 Tar.gz your theme directory and send it to
359 <A href="mailto:kulkanie@gmx.net">kulkanie@gmx.net</A> and I'll add it to the site.<BR>
360 Please provide the following information (either in the mail
361 or in the README):<BR>
362 <OL>
363 <LI>Full title</LI>
364 <LI>Version number</LI>
365 <LI>Your name</LI>
366 <LI>Email-address for feedback</LI>
367 <LI>Description</LI>
368 <LI>A jpg screenshot with your theme in action (press TAB while playing).</LI>
369 </OL>
370 </LI>
371 </OL>
372 </TD></TR></TABLE>
373 </P>
374 <P>
375 <A href="#toc">ToC</A>
376 </P>
377
378 </BODY>
379
380 </HTML>
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 DEFS = @network_flag@ @sdlnet_flag@ @arch_flag@ @inst_flag@ @DEFS@
1
2 noinst_LIBRARIES = libgame.a
3
4 libgame_a_SOURCES = \
5 game.c \
6 levels.c \
7 shots.c \
8 bricks.c \
9 paddle.c \
10 extras.c \
11 balls.c \
12 mathfuncs.c \
13 comm.c
14
15 EXTRA_DIST = game.h levels.h shots.h balls.h \
16 bricks.h extras.h paddle.h mathfuncs.h comm.h \
17 gamedefs.h
18
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 DEFS = @network_flag@ @sdlnet_flag@ @arch_flag@ @inst_flag@ @DEFS@
92
93 noinst_LIBRARIES = libgame.a
94
95 libgame_a_SOURCES = game.c levels.c shots.c bricks.c paddle.c extras.c balls.c mathfuncs.c comm.c
96
97
98 EXTRA_DIST = game.h levels.h shots.h balls.h bricks.h extras.h paddle.h mathfuncs.h comm.h gamedefs.h
99
100 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
101 CONFIG_HEADER = ../config.h
102 CONFIG_CLEAN_FILES =
103 LIBRARIES = $(noinst_LIBRARIES)
104
105 CPPFLAGS = @CPPFLAGS@
106 LDFLAGS = @LDFLAGS@
107 LIBS = @LIBS@
108 libgame_a_LIBADD =
109 libgame_a_OBJECTS = game.o levels.o shots.o bricks.o paddle.o extras.o \
110 balls.o mathfuncs.o comm.o
111 AR = ar
112 CFLAGS = @CFLAGS@
113 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
114 CCLD = $(CC)
115 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
116 DIST_COMMON = Makefile.am Makefile.in
117
118
119 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
120
121 TAR = tar
122 GZIP_ENV = --best
123 SOURCES = $(libgame_a_SOURCES)
124 OBJECTS = $(libgame_a_OBJECTS)
125
126 all: all-redirect
127 .SUFFIXES:
128 .SUFFIXES: .S .c .o .s
129 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
130 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps game/Makefile
131
132 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
133 cd $(top_builddir) \
134 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
135
136
137 mostlyclean-noinstLIBRARIES:
138
139 clean-noinstLIBRARIES:
140 -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
141
142 distclean-noinstLIBRARIES:
143
144 maintainer-clean-noinstLIBRARIES:
145
146 .c.o:
147 $(COMPILE) -c $<
148
149 .s.o:
150 $(COMPILE) -c $<
151
152 .S.o:
153 $(COMPILE) -c $<
154
155 mostlyclean-compile:
156 -rm -f *.o core *.core
157
158 clean-compile:
159
160 distclean-compile:
161 -rm -f *.tab.c
162
163 maintainer-clean-compile:
164
165 libgame.a: $(libgame_a_OBJECTS) $(libgame_a_DEPENDENCIES)
166 -rm -f libgame.a
167 $(AR) cru libgame.a $(libgame_a_OBJECTS) $(libgame_a_LIBADD)
168 $(RANLIB) libgame.a
169
170 tags: TAGS
171
172 ID: $(HEADERS) $(SOURCES) $(LISP)
173 list='$(SOURCES) $(HEADERS)'; \
174 unique=`for i in $$list; do echo $$i; done | \
175 awk ' { files[$$0] = 1; } \
176 END { for (i in files) print i; }'`; \
177 here=`pwd` && cd $(srcdir) \
178 && mkid -f$$here/ID $$unique $(LISP)
179
180 TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
181 tags=; \
182 here=`pwd`; \
183 list='$(SOURCES) $(HEADERS)'; \
184 unique=`for i in $$list; do echo $$i; done | \
185 awk ' { files[$$0] = 1; } \
186 END { for (i in files) print i; }'`; \
187 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
188 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
189
190 mostlyclean-tags:
191
192 clean-tags:
193
194 distclean-tags:
195 -rm -f TAGS ID
196
197 maintainer-clean-tags:
198
199 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
200
201 subdir = game
202
203 distdir: $(DISTFILES)
204 @for file in $(DISTFILES); do \
205 d=$(srcdir); \
206 if test -d $$d/$$file; then \
207 cp -pr $$d/$$file $(distdir)/$$file; \
208 else \
209 test -f $(distdir)/$$file \
210 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
211 || cp -p $$d/$$file $(distdir)/$$file || :; \
212 fi; \
213 done
214 balls.o: balls.c ../client/lbreakout.h ../client/../gui/stk.h \
215 ../client/../common/tools.h ../client/../common/list.h \
216 ../client/../common/net.h ../client/../common/messages.h \
217 ../client/../game/gamedefs.h ../client/misc.h levels.h paddle.h \
218 shots.h balls.h bricks.h mathfuncs.h
219 bricks.o: bricks.c ../client/lbreakout.h ../client/../gui/stk.h \
220 ../client/../common/tools.h ../client/../common/list.h \
221 ../client/../common/net.h ../client/../common/messages.h \
222 ../client/../game/gamedefs.h ../client/misc.h extras.h balls.h \
223 bricks.h mathfuncs.h
224 comm.o: comm.c ../client/lbreakout.h ../client/../gui/stk.h \
225 ../client/../common/tools.h ../client/../common/list.h \
226 ../client/../common/net.h ../client/../common/messages.h \
227 ../client/../game/gamedefs.h ../client/misc.h mathfuncs.h \
228 levels.h extras.h balls.h shots.h bricks.h paddle.h
229 extras.o: extras.c ../client/lbreakout.h ../client/../gui/stk.h \
230 ../client/../common/tools.h ../client/../common/list.h \
231 ../client/../common/net.h ../client/../common/messages.h \
232 ../client/../game/gamedefs.h ../client/misc.h levels.h paddle.h \
233 bricks.h balls.h mathfuncs.h extras.h
234 game.o: game.c ../client/lbreakout.h ../client/../gui/stk.h \
235 ../client/../common/tools.h ../client/../common/list.h \
236 ../client/../common/net.h ../client/../common/messages.h \
237 ../client/../game/gamedefs.h ../client/misc.h game.h \
238 mathfuncs.h levels.h extras.h balls.h shots.h bricks.h paddle.h \
239 comm.h
240 levels.o: levels.c levels.h ../client/lbreakout.h ../client/../gui/stk.h \
241 ../client/../common/tools.h ../client/../common/list.h \
242 ../client/../common/net.h ../client/../common/messages.h \
243 ../client/../game/gamedefs.h ../client/misc.h
244 mathfuncs.o: mathfuncs.c ../client/lbreakout.h ../client/../gui/stk.h \
245 ../client/../common/tools.h ../client/../common/list.h \
246 ../client/../common/net.h ../client/../common/messages.h \
247 ../client/../game/gamedefs.h ../client/misc.h mathfuncs.h
248 paddle.o: paddle.c ../client/lbreakout.h ../client/../gui/stk.h \
249 ../client/../common/tools.h ../client/../common/list.h \
250 ../client/../common/net.h ../client/../common/messages.h \
251 ../client/../game/gamedefs.h ../client/misc.h shots.h paddle.h
252 shots.o: shots.c ../client/lbreakout.h ../client/../gui/stk.h \
253 ../client/../common/tools.h ../client/../common/list.h \
254 ../client/../common/net.h ../client/../common/messages.h \
255 ../client/../game/gamedefs.h ../client/misc.h mathfuncs.h \
256 balls.h bricks.h
257
258 info-am:
259 info: info-am
260 dvi-am:
261 dvi: dvi-am
262 check-am: all-am
263 check: check-am
264 installcheck-am:
265 installcheck: installcheck-am
266 install-exec-am:
267 install-exec: install-exec-am
268
269 install-data-am:
270 install-data: install-data-am
271
272 install-am: all-am
273 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
274 install: install-am
275 uninstall-am:
276 uninstall: uninstall-am
277 all-am: Makefile $(LIBRARIES)
278 all-redirect: all-am
279 install-strip:
280 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
281 installdirs:
282
283
284 mostlyclean-generic:
285
286 clean-generic:
287
288 distclean-generic:
289 -rm -f Makefile $(CONFIG_CLEAN_FILES)
290 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
291
292 maintainer-clean-generic:
293 mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
294 mostlyclean-tags mostlyclean-generic
295
296 mostlyclean: mostlyclean-am
297
298 clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
299 mostlyclean-am
300
301 clean: clean-am
302
303 distclean-am: distclean-noinstLIBRARIES distclean-compile \
304 distclean-tags distclean-generic clean-am
305
306 distclean: distclean-am
307
308 maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
309 maintainer-clean-compile maintainer-clean-tags \
310 maintainer-clean-generic distclean-am
311 @echo "This command is intended for maintainers to use;"
312 @echo "it deletes files that may require special tools to rebuild."
313
314 maintainer-clean: maintainer-clean-am
315
316 .PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
317 clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
318 mostlyclean-compile distclean-compile clean-compile \
319 maintainer-clean-compile tags mostlyclean-tags distclean-tags \
320 clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
321 check-am installcheck-am installcheck install-exec-am install-exec \
322 install-data-am install-data install-am install uninstall-am uninstall \
323 all-redirect all-am all installdirs mostlyclean-generic \
324 distclean-generic clean-generic maintainer-clean-generic clean \
325 mostlyclean distclean maintainer-clean
326
327
328 # Tell versions [3.59,3.63) of GNU make to not export all variables.
329 # Otherwise a system limit (for SysV at least) may be exceeded.
330 .NOEXPORT:
0 /***************************************************************************
1 balls.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "levels.h"
19 #include "paddle.h"
20 #include "shots.h"
21 #include "balls.h"
22 #include "bricks.h"
23 #include "mathfuncs.h"
24
25 #define TOARC(d) (((float)d/180)*M_PI)
26 #define TODEG(a) (((float)a/M_PI)*180)
27 #define VLEN(x, y) ( sqrt( (x)*(x) + (y)*(y) ) )
28 #define REC_SQRT_2 (0.707106781)
29
30 float ball_vhmask = 0.363970234; /* twenty degrees */
31 float ball_vvmask = 5.67128182; /* ten degrees */
32 int ball_rad = 6;
33 int ball_dia = 12;
34 int ball_w = 12;
35 int ball_h = 12;
36 extern Game *cur_game;
37
38 int last_ball_brick_reflect_x = -1; /* HACK: used to play local sound */
39 int last_ball_paddle_reflect_x = -1; /* HACK: used to play local sound */
40 int last_ball_attach_x = -1; /* HACK: used to play local sound */
41
42 /*
43 ====================================================================
44 Locals
45 ====================================================================
46 */
47
48 #ifdef WITH_BUG_REPORT
49 /*
50 ====================================================================
51 Display info about a ball's target.
52 ====================================================================
53 */
54 static void ball_print_target_info( Ball *ball )
55 {
56 Coord center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad }; /* ball center */
57 printf( "Target exists: %i\n", ball->target.exists );
58 printf("Ball: %4.2f,%4.2f (%i,%i) -> %4.2f,%4.2f (%4.2f)\n",
59 center.x, center.y, (int)center.x/BRICK_WIDTH, (int)center.y/BRICK_HEIGHT,
60 ball->vel.x, ball->vel.y, ball->vel.y/ball->vel.x );
61 printf("Brick %i,%i: Side %i (%4.2f,%4.2f)\n",
62 ball->target.mx, ball->target.my, ball->target.side,
63 ball->target.x, ball->target.y );
64 printf("Perp Vector: %4.2f,%4.2f\n", ball->target.perp_vector.x, ball->target.perp_vector.y);
65 printf("Takes %i ms\n", ball->target.time);
66 }
67 #endif
68
69 /*
70 ====================================================================
71 Clear contents of target.
72 ====================================================================
73 */
74 void ball_clear_target( Target *t )
75 {
76 memset(t, 0, sizeof(Target));
77 t->side = SIDE_UNDEFINED;
78 }
79 /*
80 ====================================================================
81 Attach ball to paddle.
82 ====================================================================
83 */
84 void ball_attach( Ball *ball, Paddle *paddle )
85 {
86 /* relative position */
87 ball->attached = 1;
88 ball->paddle = paddle;
89 ball->paddle->attached_ball_count++;
90 ball->idle_time = ball->moving_back = ball->return_allowed = 0;
91 ball->get_target = 0;
92 ball->cur.x -= paddle->x;
93 ball->cur.y -= paddle->y;
94 ball->x = (int)ball->cur.x;
95 ball->y = (int)ball->cur.y;
96 cur_game->mod.attached_ball_count++;
97 last_ball_attach_x = ball->x + paddle->x;
98 }
99 /*
100 ====================================================================
101 Reflect ball at brick assume normed perp_vector.
102 ====================================================================
103 */
104 void ball_check_brick_reflection( Ball *b )
105 {
106 float old_vx;
107 Vector n;
108 int reflect;
109 int chaos_reflect;
110 int hit_type;
111
112 /* time left? */
113 if (b->target.cur_tm < b->target.time) return;
114
115 /* if the brick is destructible (thus it'll take damage)
116 * we must reset the idle time
117 */
118 if ( cur_game->bricks[b->target.mx][b->target.my].dur != -1 ||
119 (cur_game->extra_active[EX_METAL] &&
120 cur_game->bricks[b->target.mx][b->target.my].type != MAP_WALL ) )
121 b->idle_time = 0;
122 /* or if it is within the last four rows and no chaotic malus is active it will
123 hit the paddle soon so reset here too */
124 if ( b->target.my >= MAP_HEIGHT - 4 && b->vel.y > 0 && !cur_game->extra_active[EX_CHAOS] )
125 b->idle_time = 0;
126
127 /* will reflect? */
128 reflect = 1;
129 if ( cur_game->extra_active[EX_METAL] )
130 if ( cur_game->bricks[b->target.mx][b->target.my].type != MAP_WALL )
131 reflect = 0;
132
133 /* will reflect chaotic? */
134 chaos_reflect = 0;
135 if ( cur_game->extra_active[EX_CHAOS] ||
136 cur_game->bricks[b->target.mx][b->target.my].type == MAP_BRICK_CHAOS )
137 chaos_reflect = 1;
138
139 /* remove brick -- if weak ball there is a 40% chance that no damage is done to the brick */
140 if ( !cur_game->extra_active[EX_WEAK_BALL] || rand() % 10 < 6 ) {
141 /* if explosive ball und brick is destructible by normal means set as explosive */
142 if ( cur_game->extra_active[EX_EXPL_BALL] )
143 if ( cur_game->bricks[b->target.mx][b->target.my].dur > 0 ) {
144 cur_game->bricks[b->target.mx][b->target.my].type = MAP_BRICK_EXP;
145 cur_game->bricks[b->target.mx][b->target.my].dur = 1;
146 }
147 /* hit brick */
148 hit_type = SHR_BY_NORMAL_BALL;
149 if ( cur_game->extra_active[EX_METAL] ) hit_type = SHR_BY_ENERGY_BALL;
150 brick_hit( b->target.mx, b->target.my,
151 cur_game->extra_active[EX_METAL],
152 hit_type, b->vel, b->paddle );
153 }
154
155 /* we have a target and so we have a reset position and even if the ball's
156 not reflected the position must be reset */
157 b->cur.x = b->target.x; b->x = (int)b->cur.x;
158 b->cur.y = b->target.y; b->y = (int)b->cur.y;
159
160 if ( reflect ) {
161 cur_game->mod.brick_reflected_ball_count++;
162 last_ball_brick_reflect_x = b->x; /* HACK: used to play local sound */
163 old_vx = b->vel.x;
164 if ( !chaos_reflect ) {
165 /* normal reflection */
166 n.x = (1-2*b->target.perp_vector.x*b->target.perp_vector.x)*b->vel.x +
167 ( -2*b->target.perp_vector.x*b->target.perp_vector.y)*b->vel.y;
168 n.y = ( -2*b->target.perp_vector.x*b->target.perp_vector.y)*b->vel.x +
169 (1-2*b->target.perp_vector.y*b->target.perp_vector.y)*b->vel.y;
170 b->vel.x = n.x;
171 b->vel.y = n.y;
172 }
173 else {
174 b->vel.x = ((float)RANDOM( -10000, 10000 )) / 10000;
175 b->vel.y = (float)(RANDOM( -10000, 10000 )) / 10000;
176 }
177 if ( b->target.side >= CORNER_UPPER_LEFT && !chaos_reflect )
178 ball_mask_vel( b, old_vx, BALL_ADD_ENTROPY );
179 else
180 ball_mask_vel( b, old_vx, BALL_NO_ENTROPY );
181 /* only use 2 degree steps */
182 b->angle = vec2angle( &b->vel );
183 angle2vec( b->angle, &b->vel );
184 vector_set_length( &b->vel, cur_game->ball_v );
185
186 /* reset contact time: this ball is working for its paddle so it
187 * was cheating if it would be allowed to bring a new ball to
188 * game */
189 b->paddle->last_ball_contact = SDL_GetTicks();
190 }
191
192 /* mark target as disabled so it won't get stuck at the
193 bottom of the screen but keep the target position so
194 that we know what needs an update. */
195 b->target.exists = 0;
196 /* check targets */
197 balls_check_targets( b->target.mx, b->target.my );
198 shots_check_targets( b->target.mx, b->target.my );
199 }
200 /*
201 ====================================================================
202 Handle ball's contact with paddle: reflect at perpendicular (normed)
203 or attach.
204 ====================================================================
205 */
206 void ball_handle_paddle_contact( Ball *ball, Paddle *paddle, Vector perp_vector )
207 {
208 float old_vx = ball->vel.x;
209 Vector c; /* A(perp_vector) = c; */
210
211 ball->paddle = paddle;
212
213 /* valid perpendicular? */
214 if ( perp_vector.x == 0 && perp_vector.y == 0 )
215 return;
216
217 /* reflect */
218 /* a simple 2x2 matrix does this for us */
219 c.x = (1-2*perp_vector.x*perp_vector.x)*ball->vel.x +
220 ( -2*perp_vector.x*perp_vector.y)*ball->vel.y;
221 c.y = ( -2*perp_vector.x*perp_vector.y)*ball->vel.x +
222 (1-2*perp_vector.y*perp_vector.y)*ball->vel.y;
223 /* if this new velocity vector does not bring back the ball to the playing field
224 thus the lower hemispherical parts of the paddle were hit we consider this
225 to be no reflection at all to prevent balls from getting stuck when 'bonus floor'
226 is active */
227 if ( (paddle->type == PADDLE_TOP && c.y < 0) ||
228 (paddle->type == PADDLE_BOTTOM && c.y > 0) )
229 return;
230
231 /* set new speed vector */
232 ball->vel.x = c.x; ball->vel.y = c.y;
233 #ifdef PADDLE_FRICTION
234 /* transfer friction to ball's velocity if not convex */
235 if ( cur_game->paddle_is_convex )
236 ball->vel.x += paddle->v_x * paddle->friction;
237 #endif
238 ball_mask_vel( ball, old_vx, BALL_NO_ENTROPY );
239 /* only use 2 degree steps */
240 ball->angle = vec2angle( &ball->vel );
241 angle2vec( ball->angle, &ball->vel );
242 vector_set_length( &ball->vel, cur_game->ball_v );
243
244 /* reset position if in wall */
245 if ( ball->x < BRICK_WIDTH ) {
246 ball->cur.x = BRICK_WIDTH;
247 ball->x = (int)ball->cur.x;
248 }
249 else
250 if ( ball->x + ball_dia >= 640 - BRICK_WIDTH ) {
251 ball->cur.x = 640 - BRICK_WIDTH - ball_dia;
252 ball->x = (int)ball->cur.x;
253 }
254 if ( paddle->extra_active[EX_WALL] ) {
255 if ( paddle->type == PADDLE_BOTTOM ) {
256 if ( ball->cur.y + ball_dia > 480 - BRICK_HEIGHT - 1 ) {
257 ball->cur.y = 480 - BRICK_HEIGHT - 1 - ball_dia;
258 ball->y = (int)ball->cur.y;
259 }
260 }
261 else {
262 if ( ball->cur.y < BRICK_HEIGHT ) {
263 ball->cur.y = BRICK_HEIGHT;
264 ball->y = (int)ball->cur.y;
265 }
266 }
267 }
268
269 /* attach ball if sticky */
270 if ( paddle_slimy( paddle ) ) {
271 ball_attach( ball, paddle );
272 return;
273 }
274
275 /* count successful paddle contacts */
276 paddle->balls_reflected++;
277 cur_game->mod.paddle_reflected_ball_count++;
278 last_ball_paddle_reflect_x = ball->x; /* HACK: used to play local sound */
279
280 /* get new target */
281 ball->get_target = 1;
282
283 /* reset contact time */
284 paddle->last_ball_contact = SDL_GetTicks();
285 }
286 /*
287 ====================================================================
288 Berechnung der Schnittpunkte der Geraden, die orthogonal zur
289 Geraden der Ballgeschwindigkeit durch den Ballmittelpunkt verläuft,
290 also der tangentialen Geschwindigkeitspunkte.
291 Der Geschwindigkeitsvektor wird auf 1 genormt. Ausgehend vom
292 Mittelpunkt wird der dazu orthogonale Vektor jeweils mit geändertem
293 Vorzeichen addiert und ergibt so die Tangentialpunkte.
294
295 If you're able and willing to translate this please send me your
296 result. ;-)
297 ====================================================================
298 */
299 void ball_get_tangents( Ball *ball, Coord *left, Coord *right )
300 {
301 Vector norm_vel = ball->vel;
302 float center_x = ball->cur.x + ball_rad, center_y = ball->cur.y + ball_rad;
303
304 vector_norm( &norm_vel );
305 left->x = center_x + norm_vel.y * ball_rad;
306 left->y = center_y - norm_vel.x * ball_rad;
307 right->x = center_x - norm_vel.y * ball_rad;
308 right->y = center_y + norm_vel.x * ball_rad;
309 }
310 /*
311 ====================================================================
312 Check if the ball is on paddle's level and an reflect is
313 possible.
314 ====================================================================
315 */
316 int ball_paddle_contact_possible( Ball *ball, Paddle *paddle, Vector old )
317 {
318 if ( ball->attached ) return 0; /* was attached to a previous paddle */
319 if ( !paddle_solid( paddle ) ) return 0;
320 if ( paddle->type == PADDLE_TOP ) {
321 if ( ball->vel.y > 0 ) return 0;
322 if ( ball->y > paddle->y + paddle->h - 1 ) return 0; /* below paddle */
323 if ( ball->y + ball_dia <= paddle->y + ( paddle->h >> 1 ) )
324 if ( old.y + ball_dia <= paddle->y + ( paddle->h >> 1 ) )
325 return 0; /* already behind paddle */
326 }
327 else {
328 if ( ball->vel.y < 0 ) return 0; /* ball moves up so no contact possible because
329 if it was below the paddle it has been
330 reflected by the bonus floor and MUST ignore
331 the paddle */
332 if ( ball->y + ball_dia < paddle->y ) return 0; /* above paddle */
333 if ( ball->y >= paddle->y + ( paddle->h >> 1 ) )
334 if ( old.y >= paddle->y + ( paddle->h >> 1 ) )
335 return 0; /* already behind paddle */
336 }
337 return 1;
338 }
339 /*
340 ====================================================================
341 Check reflection of ball at paddle. 'old' is the position of
342 the ball before update. Used to compute direction.
343 ====================================================================
344 */
345 enum { CONTACT_LEFT = 1, CONTACT_MIDDLE, CONTACT_RIGHT };
346 void ball_check_paddle_reflection( Ball *ball, Paddle *paddle )
347 {
348 Line ball_line; /* balls velocity line */
349 Line paddle_line; /* paddle line */
350 Coord pt, pt2; /* auxiliary point (result of intersection) */
351 int contact = 0; /* paddle contact */
352 Vector perp_vector; /* perpendicular of ball's direction change */
353 Coord center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad }; /* center of ball */
354 Vector norm_vel; /* normed ball velocity vector */
355 /* paddle is constructed as two hemispheres at the side and a cylinder in the middle */
356 Coord right_hemi_center = { paddle->x + paddle->w - ( paddle->h >> 1 ), paddle->y + ( paddle->h >> 1 ) };
357 Coord left_hemi_center = { paddle->x + ( paddle->h >> 1 ), paddle->y + ( paddle->h >> 1 ) };
358 /* radius of hemispheres */
359 int hemi_r = ( ball_rad ) + ( paddle->h >> 1 );
360 /* if paddle's treated as convex these are the perpendiculars through the hemisphere centers */
361 Vector left_convex_perp = { 1, (paddle->type == PADDLE_TOP)?-1:1 };
362 /* paddle center */
363 Coord paddle_center = { paddle->x + ( paddle->w >> 1 ), paddle->y + ( paddle->h >> 1 ) };
364 /* center of the convex behaviour -- computed when reflecting by using
365 left/right_convex_perp and paddle_center */
366 Coord convex_center;
367 /* perpendicular line used for convex behaviour */
368 Line convex_line;
369
370 /* the simple check for the y-position of ball and paddle is done
371 * in ball_paddle_contact_possible() so if we got here it's possible
372 * by velocity and position of ball that it hits the paddle
373 */
374
375 /* basic idea:
376 The paddle is constructed of a middle rectangle and two hemispheres.
377 We check the center line of the ball with the imaginary paddle that's size
378 is paddle_size + ball_rad. The intersection with this paddle is the reset point
379 for the ball at the same time (if sticky).
380 The perpendicular is computed as convex thing. (overwrites the perpendicular
381 set by the reflection)
382 */
383 /* ball line */
384 line_set( &ball_line, center.x, center.y, ball->vel.y / ball->vel.x );
385 /* imaginary paddle upper/lower line
386 * -- we'll decide at intersection which hemipshere to check
387 */
388 if ( paddle->type == PADDLE_TOP )
389 line_set_hori( &paddle_line, paddle->y + paddle->h - 1 + ball_rad );
390 else
391 line_set_hori( &paddle_line, paddle->y - ball_rad );
392 line_intersect( &paddle_line, &ball_line, &pt );
393 if ( pt.x < left_hemi_center.x ) {
394 /* intersect left */
395 norm_vel = ball->vel; vector_norm( &norm_vel );
396 if ( circle_intersect( left_hemi_center, hemi_r,
397 center, norm_vel,
398 &pt, &pt2 ) ) {
399 if ( VEC_DIST( center, left_hemi_center ) <= hemi_r ) {
400 if ( paddle->type == PADDLE_TOP ) {
401 /* use lower point as intersection */
402 if ( pt.y < pt2.y ) pt = pt2;
403 }
404 else
405 /* use the higher point as this is the upper intersection */
406 if ( pt.y > pt2.y ) pt = pt2;
407 /* use vector between hemi_sphere center and ball center
408 * as reflection perp */
409 perp_vector = vector_get( center.x - left_hemi_center.x,
410 center.y - left_hemi_center.y );
411 vector_norm( &perp_vector );
412 /* had contact */
413 contact = CONTACT_LEFT;
414 }
415 }
416 }
417 else
418 if ( pt.x > right_hemi_center.x ) {
419 /* intersect right */
420 norm_vel = ball->vel; vector_norm( &norm_vel );
421 if ( circle_intersect( right_hemi_center, hemi_r,
422 center, norm_vel,
423 &pt, &pt2 ) ) {
424 if ( VEC_DIST( center, right_hemi_center ) <= hemi_r ) {
425 if ( paddle->type == PADDLE_TOP ) {
426 /* use lower point as intersection */
427 if ( pt.y < pt2.y ) pt = pt2;
428 }
429 else
430 /* use the higher point as this is the upper intersection */
431 if ( pt.y > pt2.y ) pt = pt2;
432 /* use vector between hemi_sphere center and ball center
433 * as reflection perp */
434 perp_vector = vector_get( center.x - right_hemi_center.x,
435 center.y - right_hemi_center.y );
436 vector_norm( &perp_vector );
437 /* had contact */
438 contact = CONTACT_RIGHT;
439 }
440 }
441 }
442 else {
443 contact = CONTACT_MIDDLE; /* contact with middle part */
444 perp_vector = vector_get( 0, 1 ); /* reflect at horizontal line */
445 }
446
447 /* if we got here 'pt' contains the intersection with the imaginary paddle so reset ball
448 to this position */
449 if ( contact ) {
450 /* reset idle time */
451 ball->idle_time = 0;
452 /* reset position if ball will be attached */
453 if ( paddle_slimy( paddle ) ) {
454 ball->cur.x = pt.x - ( ball_rad );
455 ball->cur.y = pt.y - ( ball_rad );
456 ball->x = (int)ball->cur.x; ball->y = (int)ball->cur.y;
457 }
458 /* convex perpendicular */
459 if ( cur_game->paddle_is_convex ) {
460 line_set_vert( &paddle_line, paddle_center.x );
461 line_set( &convex_line, left_hemi_center.x, left_hemi_center.y,
462 vector_monotony( left_convex_perp ) );
463 line_intersect( &paddle_line, &convex_line, &convex_center );
464 /* get actual perp_vector */
465 perp_vector.x = convex_center.x - pt.x;
466 perp_vector.y = convex_center.y - pt.y;
467 //vector_norm( &perp_vector );
468 /* this vector is not normed but for whatever reason...
469 the reflection behaviour is much nicer this way */
470 }
471 /* handle contact: attach, reflect, sound... */
472 ball_handle_paddle_contact( ball, paddle, perp_vector );
473 }
474 }
475 /*
476 ====================================================================
477 Intersect ball line with imaginary brick line.
478 Use target's map position and
479 set reset position (centered) and perp_vector of target.
480 ball_rad is substracted later in ball_get_target()
481 ====================================================================
482 */
483 enum { LINE_HORI = 0, LINE_VERT };
484 int check_line( Line *ball_line, int type, int anchor, int range_start, int range_end, Coord *pt ) {
485 Line line;
486 if ( type == LINE_HORI )
487 line_set_hori( &line, anchor );
488 else
489 line_set_vert( &line, anchor );
490 line_intersect( &line, ball_line, pt );
491 if ( type == LINE_HORI ) {
492 if ( pt->x >= range_start && pt->x <= range_end ) return 1;
493 return 0;
494 }
495 else {
496 if ( pt->y >= range_start && pt->y <= range_end ) return 1;
497 return 0;
498 }
499 }
500 void ball_intersect_brick( Ball *ball, Target *target )
501 {
502 Line ball_line;
503 Coord pt; /* auxiliary point */
504 int x = target->mx * BRICK_WIDTH;
505 int y = target->my * BRICK_HEIGHT; /* left upper corner of brick */
506 int intersect = 0; /* intersected? */
507
508 /* ball_line */
509 line_set( &ball_line,
510 ball->cur.x + ball_rad,
511 ball->cur.y + ball_rad,
512 ball->vel.y / ball->vel.x );
513
514 if ( ball->vel.x > 0 ) {
515 /* left */
516 if ( check_line( &ball_line,
517 LINE_VERT,
518 x - ball_rad,
519 y - ball_rad, y + BRICK_HEIGHT + ball_rad,
520 &pt ) ) {
521 intersect = 1;
522 target->perp_vector = vector_get( 1, 0 );
523 }
524 }
525 else {
526 /* right */
527 if ( check_line( &ball_line,
528 LINE_VERT,
529 x + BRICK_WIDTH + ball_rad,
530 y - ball_rad, y + BRICK_HEIGHT + ball_rad,
531 &pt ) ) {
532 intersect = 1;
533 target->perp_vector = vector_get( 1, 0 );
534 }
535 }
536 if ( !intersect ) {
537 if ( ball->vel.y > 0 ) {
538 /* top */
539 if ( check_line( &ball_line,
540 LINE_HORI,
541 y - ball_rad,
542 x - ball_rad, x + BRICK_WIDTH + ball_rad,
543 &pt ) ) {
544 intersect = 1;
545 target->perp_vector = vector_get( 0, 1 );
546 }
547 }
548 else {
549 /* bottom */
550 if ( check_line( &ball_line,
551 LINE_HORI,
552 y + BRICK_HEIGHT + ball_rad,
553 x - ball_rad, x + BRICK_WIDTH + ball_rad,
554 &pt ) ) {
555 intersect = 1;
556 target->perp_vector = vector_get( 0, 1 );
557 }
558 }
559 }
560 /* intersected */
561 if ( intersect ) {
562 target->x = pt.x;
563 target->y = pt.y;
564 /* perp_vector is set */
565 }
566 }
567 /*
568 ====================================================================
569 Reflect ball at target at target->side and set perp_vector
570 and reset position x,y of the target. Does not update the ball.
571 ====================================================================
572 */
573 void ball_reflect_at_side( Ball *ball, Target *target )
574 {
575 float old_vx;
576 int compute_vel, start;
577 Line ball_line;
578 Line brick_line;
579 Coord pt;
580 /* ball line */
581 line_set( &ball_line,
582 ball->cur.x + ball_rad,
583 ball->cur.y + ball_rad,
584 ball->vel.y / ball->vel.x );
585 /* brick line and perp vector */
586 switch ( target->side ) {
587 case SIDE_LEFT:
588 line_set_vert( &brick_line, target->mx * BRICK_WIDTH - ball_rad );
589 target->perp_vector = vector_get( 1, 0 );
590 break;
591 case SIDE_RIGHT:
592 line_set_vert( &brick_line,
593 target->mx * BRICK_WIDTH + BRICK_WIDTH + ball_rad );
594 target->perp_vector = vector_get( 1, 0 );
595 break;
596 case SIDE_TOP:
597 line_set_hori( &brick_line, target->my * BRICK_HEIGHT - ball_rad );
598 target->perp_vector = vector_get( 0, 1 );
599 break;
600 case SIDE_BOTTOM:
601 line_set_hori( &brick_line,
602 target->my * BRICK_HEIGHT + BRICK_HEIGHT + ball_rad );
603 target->perp_vector = vector_get( 0, 1 );
604 break;
605 default:
606 fprintf( stderr, "Unknown side: %i\n", target->side );
607 break;
608 }
609 /* intersect, it's already assured that we hit this brick so just get the reset position */
610 line_intersect( &brick_line, &ball_line, &pt );
611 target->x = pt.x;
612 target->y = pt.y;
613 /* check if ball slid into next brick because of high angle when
614 reflect at side (not corner) */
615 compute_vel = 0;
616 switch ( target->side ) {
617 case SIDE_BOTTOM:
618 case SIDE_TOP:
619 if ( ball->vel.x > 0 )
620 pt.x = target->x + ball_rad;
621 else
622 pt.x = target->x - ball_rad;
623 start = (int)pt.x / BRICK_WIDTH;
624 if ( cur_game->bricks[start][(int)target->y/BRICK_HEIGHT].type != MAP_EMPTY ) {
625 if ( ball->vel.x > 0 )
626 target->x = start * BRICK_WIDTH - ball_rad - 1;
627 else
628 target->x = (start+1) * BRICK_WIDTH + ball_rad;
629 compute_vel = 1;
630 }
631 break;
632 case SIDE_LEFT:
633 case SIDE_RIGHT:
634 if ( ball->vel.y > 0 )
635 pt.y = target->y + ball_rad;
636 else
637 pt.y = target->y - ball_rad;
638 start = (int)pt.y / BRICK_HEIGHT;
639 if ( cur_game->bricks[(int)target->x/BRICK_WIDTH][start].type != MAP_EMPTY ) {
640 if ( ball->vel.y > 0 )
641 target->y = start * BRICK_HEIGHT - ball_rad - 1;
642 else
643 target->y = (start+1) * BRICK_HEIGHT + ball_rad;
644 compute_vel = 1;
645 }
646 break;
647 }
648 if ( compute_vel ) {
649 old_vx = ball->vel.x;
650 ball->vel.x = target->x - (ball->cur.x + ball_rad);
651 ball->vel.y = target->y - (ball->cur.y + ball_rad);
652 ball_mask_vel( ball, old_vx, BALL_NO_ENTROPY );
653 /* should we mask to the 2deg steps here? yes! */
654 ball->angle = vec2angle( &ball->vel );
655 angle2vec( ball->angle, &ball->vel );
656 vector_set_length( &ball->vel, cur_game->ball_v );
657 }
658 }
659 /*
660 ====================================================================
661 Reflect ball at target but ignore target::side and reflect at
662 corner instead. Does not update the ball.
663 ====================================================================
664 */
665 void ball_reflect_at_corner( Ball *ball, Target *target, int corner )
666 {
667 Coord corner_center; /* center of corner circle */
668 Coord ball_center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad };
669 Vector norm_vel = ball->vel;
670 Coord pt, pt2; /* intersection points */
671
672 /* norm velocity */
673 vector_norm( &norm_vel );
674
675 /* set up center of corner */
676 switch ( corner ) {
677 case CORNER_UPPER_LEFT:
678 corner_center = vector_get(
679 target->mx * BRICK_WIDTH,
680 target->my * BRICK_HEIGHT );
681 break;
682 case CORNER_UPPER_RIGHT:
683 corner_center = vector_get(
684 target->mx * BRICK_WIDTH + BRICK_WIDTH - 1,
685 target->my * BRICK_HEIGHT );
686 break;
687 case CORNER_LOWER_LEFT:
688 corner_center = vector_get(
689 target->mx * BRICK_WIDTH,
690 target->my * BRICK_HEIGHT + BRICK_HEIGHT - 1);
691 break;
692 case CORNER_LOWER_RIGHT:
693 corner_center = vector_get(
694 target->mx * BRICK_WIDTH + BRICK_WIDTH - 1,
695 target->my * BRICK_HEIGHT + BRICK_HEIGHT - 1);
696 break;
697 }
698 /* intersect */
699 circle_intersect( corner_center, ball_rad + 2, ball_center, norm_vel, &pt, &pt2 );
700 /* use nearest point for reset and perp vector */
701 if ( VEC_DIST( ball_center, pt ) < VEC_DIST( ball_center, pt2 ) ) {
702 target->x = pt.x;
703 target->y = pt.y;
704 }
705 else {
706 target->x = pt2.x;
707 target->y = pt2.y;
708 }
709 /* compute the spherical perp vector
710 (corner center - intersection point) */
711 target->perp_vector =
712 vector_get( corner_center.x - target->x,
713 corner_center.y - target->y );
714 vector_norm( &target->perp_vector );
715 /* this vector must operate within a 90° region depending on the corner.
716 if it doesn't we have a side reflection unnoticed by the previous
717 checks as we enclosed a corner. this is the only position to check
718 this as the reset position is different when a corner is enclosed.
719 doing this anywhere else would lead to errors. */
720 switch ( corner ) {
721 case CORNER_UPPER_LEFT:
722 if ( target->perp_vector.x * target->perp_vector.y >= 0 ) {
723 /* we needed the spherical perp to determine if it is
724 really a corner however we might have set the
725 config option linear_corner */
726 /*if ( config.linear_corner )
727 target->perp_vector = vector_get( REC_SQRT_2, REC_SQRT_2 );*/
728 break;
729 }
730 if ( target->y < corner_center.y || target->x >= corner_center.x )
731 target->perp_vector = vector_get( 0, 1 ); /* top */
732 else
733 target->perp_vector = vector_get( 1, 0 ); /* left */
734 break;
735 case CORNER_LOWER_RIGHT:
736 if ( target->perp_vector.x * target->perp_vector.y >= 0 ) {
737 /*if ( config.linear_corner )
738 target->perp_vector = vector_get( REC_SQRT_2, REC_SQRT_2 );*/
739 break;
740 }
741 if ( target->y > corner_center.y || target->x <= corner_center.x )
742 target->perp_vector = vector_get( 0, 1 ); /* bottom */
743 else
744 target->perp_vector = vector_get( 1, 0 ); /* right */
745 break;
746 case CORNER_UPPER_RIGHT:
747 if ( target->perp_vector.x * target->perp_vector.y <= 0 ) {
748 /*if ( config.linear_corner )
749 target->perp_vector = vector_get( REC_SQRT_2, -REC_SQRT_2 );*/
750 break;
751 }
752 if ( target->y < corner_center.y || target->x <= corner_center.x )
753 target->perp_vector = vector_get( 0, 1 ); /* top */
754 else
755 target->perp_vector = vector_get( 1, 0 ); /* right */
756 break;
757 case CORNER_LOWER_LEFT:
758 if ( target->perp_vector.x * target->perp_vector.y <= 0 ) {
759 /*if ( config.linear_corner )
760 target->perp_vector = vector_get( REC_SQRT_2, -REC_SQRT_2 );*/
761 break;
762 }
763 if ( target->y > corner_center.y || target->x >= corner_center.x )
764 target->perp_vector = vector_get( 0, 1 ); /* bottom */
765 else
766 target->perp_vector = vector_get( 1, 0 ); /* left */
767 break;
768 }
769 }
770 /*
771 ====================================================================
772 Reflect ball at target ball:t and decide by ball::t::side wether
773 to use reflect_at_side or reflect_at_corner.
774 ====================================================================
775 */
776 void ball_reflect( Ball *ball )
777 {
778 if ( !ball->target.exists ) return;
779 if ( ball->target.side <= SIDE_LEFT )
780 ball_reflect_at_side( ball, &ball->target );
781 else
782 ball_reflect_at_corner( ball, &ball->target, ball->target.side );
783 }
784
785 /*
786 ====================================================================
787 Check if ball's tangents enclose a corner and update target's side.
788 ====================================================================
789 */
790 void ball_corner_check( Ball *ball,
791 Target *target_left_tang, Target *target_right_tang, Target *target )
792 {
793 /* balls moving ... */
794 if ( ball->vel.y > 0 ) {
795 if ( ball->vel.x < 0 ) {
796 /* ... down left */
797 if ( target == target_right_tang )
798 if ( target->side == SIDE_TOP )
799 target->side = CORNER_UPPER_RIGHT;
800 if ( target == target_left_tang )
801 if ( target->side == SIDE_RIGHT )
802 target->side = CORNER_UPPER_RIGHT;
803 }
804 else {
805 /* ... down right */
806 if ( target == target_left_tang )
807 if ( target->side == SIDE_TOP )
808 target->side = CORNER_UPPER_LEFT;
809 if ( target == target_right_tang )
810 if ( target->side == SIDE_LEFT ) target->side = CORNER_UPPER_LEFT;
811 }
812 }
813 else {
814 if ( ball->vel.x < 0 ) {
815 /* ... up left */
816 if ( target == target_right_tang )
817 if ( target->side == SIDE_RIGHT )
818 target->side = CORNER_LOWER_RIGHT;
819 if ( target == target_left_tang )
820 if ( target->side == SIDE_BOTTOM )
821 target->side = CORNER_LOWER_RIGHT;
822 }
823 else {
824 /* ... up right */
825 if ( target == target_left_tang )
826 if ( target->side == SIDE_LEFT )
827 target->side = CORNER_LOWER_LEFT;
828 if ( target == target_right_tang )
829 if ( target->side == SIDE_BOTTOM )
830 target->side = CORNER_LOWER_LEFT;
831 }
832 }
833 }
834
835 /*
836 ====================================================================
837 Public
838 ====================================================================
839 */
840
841 /*
842 ====================================================================
843 Create ball at position
844 ====================================================================
845 */
846 Ball* ball_create( int x, int y )
847 {
848 Ball *ball = salloc( 1, sizeof( Ball ) );
849 ball->cur.x = x;
850 ball->x = x;
851 ball->cur.y = y;
852 ball->y = y;
853 ball->attached = 0;
854 ball->idle_time = 0;
855 ball->moving_back = 0;
856 ball->return_allowed = 0;
857 ball_clear_target(&ball->target);
858 return ball;
859 }
860 /*
861 ====================================================================
862 Set a special ball property like metal ball. Unused now
863 as it is directly checked wether extra_active is 1.
864 ====================================================================
865 */
866 void balls_set_type( int type )
867 {
868 }
869 /*
870 ====================================================================
871 Set chaotic behaviour (random relfection). Unused as extra_active
872 is checked now.
873 ====================================================================
874 */
875 void balls_set_chaos( int chaos )
876 {
877 }
878 /*
879 ====================================================================
880 Update balls and detach attached balls if fire was pressed.
881 ====================================================================
882 */
883 void balls_update( int ms )
884 {
885 int top = 0, bottom = 0; /* num of lost balls */
886 int i, x, y;
887 ListEntry *entry = cur_game->balls->head->next;
888 Ball *ball;
889 Vector old; /* old position of ball before update */
890 int fired_attached, fire_dir;
891
892 /* detach or fire balls from paddles */
893 for ( i = 0; i < cur_game->paddle_count; i++ ) {
894 /* check wether paddles created new balls or released attached ones */
895 if ( (cur_game->paddles[i]->ball_fire_delay-=ms) <= 0 )
896 if ( cur_game->paddles[i]->fire_left || cur_game->paddles[i]->fire_right ) {
897 /* reset delay till next ball may be released */
898 cur_game->paddles[i]->ball_fire_delay = BALL_FIRE_RATE;
899 /* get direction */
900 fire_dir = cur_game->paddles[i]->fire_left?-1:1;
901 /* try to fire attached balls */
902 fired_attached = balls_detach_from_paddle( cur_game->paddles[i], fire_dir );
903 /* if no attached balls were fired but paddle has ammo left
904 * it creates a new ball in PINGPONG levels */
905 if ( !fired_attached )
906 if ( cur_game->level_type == LT_PINGPONG )
907 if ( cur_game->paddles[i]->ball_ammo > 0 ) {
908 x = cur_game->paddles[i]->x + (cur_game->paddles[i]->w - ball_w) / 2;
909 if ( cur_game->paddles[i]->type == PADDLE_BOTTOM )
910 y = cur_game->paddles[i]->y - ball_dia;
911 else
912 y = cur_game->paddles[i]->y + cur_game->paddles[i]->h;
913 ball = ball_create( x, y );
914 ball->paddle = cur_game->paddles[i];
915 if ( cur_game->balls_use_random_angle )
916 ball_set_random_angle( ball, cur_game->ball_v );
917 else {
918 ball->vel.x = 1.0 * fire_dir;
919 if ( ball->paddle->type == PADDLE_TOP )
920 ball->vel.y = 1.2;
921 else
922 ball->vel.y = -1.2;
923 /* only use 2 degree steps */
924 ball->angle = vec2angle( &ball->vel );
925 angle2vec( ball->angle, &ball->vel );
926 vector_set_length( &ball->vel, cur_game->ball_v );
927 }
928 ball->get_target = 1;
929 list_add( cur_game->balls, ball );
930 cur_game->paddles[i]->ball_ammo--;
931 }
932 }
933
934 /* check wether no balls are attached and the respawn time is exceeded.
935 * then in NMP a ball is created and attached */
936 if ( cur_game->game_type == GT_NETWORK && cur_game->level_type == LT_NORMAL )
937 if ( cur_game->paddles[i]->attached_ball_count == 0 )
938 if ( SDL_GetTicks() >= cur_game->paddles[i]->last_ball_contact + BALL_RESPAWN_TIME ) {
939 x = cur_game->paddles[i]->x + (cur_game->paddles[i]->w - ball_w) / 2;
940 if ( cur_game->paddles[i]->type == PADDLE_BOTTOM )
941 y = cur_game->paddles[i]->y - ball_dia;
942 else
943 y = cur_game->paddles[i]->y + cur_game->paddles[i]->h;
944 ball = ball_create( x, y );
945 list_add( cur_game->balls, ball );
946 ball_attach( ball, cur_game->paddles[i] );
947 ball_set_random_angle( ball, cur_game->ball_v );
948 }
949 }
950
951 /* speed up/down balls on request */
952 if ( cur_game->game_type == GT_LOCAL )
953 {
954 if ( cur_game->paddles[0]->maxballspeed_request && !cur_game->paddles[0]->maxballspeed_request_old )
955 {
956 cur_game->ball_v = cur_game->accelerated_ball_speed;
957 balls_set_velocity( cur_game->balls, cur_game->ball_v );
958 }
959 if ( !cur_game->paddles[0]->maxballspeed_request && cur_game->paddles[0]->maxballspeed_request_old )
960 {
961 if ( cur_game->extra_active[EX_SLOW] )
962 cur_game->ball_v = cur_game->ball_v_min;
963 else
964 if ( cur_game->extra_active[EX_FAST] )
965 cur_game->ball_v = cur_game->ball_v_max;
966 else
967 cur_game->ball_v = cur_game->diff->v_start +
968 cur_game->diff->v_add * cur_game->speedup_level;
969 balls_set_velocity( cur_game->balls, cur_game->ball_v );
970 }
971 }
972
973 /* increase speed */
974 if ( !cur_game->extra_active[EX_SLOW] )
975 if ( !cur_game->extra_active[EX_FAST] )
976 if ( cur_game->game_type != GT_LOCAL || !cur_game->paddles[0]->maxballspeed_request )
977 balls_inc_vel( ms );
978
979 /* return idle balls if not autoreturn */
980 for ( i = 0; i < cur_game->paddle_count; i++ )
981 if ( cur_game->paddles[i]->ball_return_key_pressed )
982 balls_return( cur_game->paddles[i] );
983
984 /* move balls */
985 while ( entry != cur_game->balls->tail ) {
986 ball = entry->item;
987 old.x = ball->cur.x;
988 old.y = ball->cur.y;
989
990 /* update ball when moving back */
991 if ( ball->moving_back ) {
992 /* update velocity */
993 ball->vel.x = ( ball->paddle->x + ( ball->paddle->w >> 1 ) ) -
994 ( ball->cur.x + ball_rad );
995 ball->vel.y = ( ball->paddle->y - ball_rad + 2 ) - ( ball->cur.y + ball_rad );
996 vector_set_length( &ball->vel, cur_game->ball_v_max );
997 /* new position */
998 ball->cur.x += ball->vel.x * ms;
999 ball->cur.y += ball->vel.y * ms;
1000 ball->x = (int)ball->cur.x;
1001 ball->y = (int)ball->cur.y;
1002 /* check if paddle is reached and attach the ball */
1003 if ( ball->x + ball_rad >= ball->paddle->x )
1004 if ( ball->x + ball_rad < ball->paddle->x + ball->paddle->w )
1005 if ( ball->y + ball_dia >= ball->paddle->y )
1006 if ( ball->y + ball_dia < ball->paddle->y + ball->paddle->h ) {
1007 ball->cur.x = ball->paddle->x + ( ball->paddle->w >> 1 ) - ball_rad;
1008 if ( ball->paddle->type == PADDLE_TOP )
1009 ball->cur.y = ball->paddle->y + ball->paddle->h;
1010 else
1011 ball->cur.y = ball->paddle->y - ball_dia;
1012 ball->x = (int)ball->cur.x;
1013 ball->y = (int)ball->cur.y;
1014 ball_attach( ball, ball->paddle );
1015 ball_set_random_angle( ball, cur_game->ball_v );
1016 }
1017 }
1018
1019 /* update ball if not attached and not moving back */
1020 if ( !ball->attached && !ball->moving_back ) {
1021 /* increase idle time -- paddle and brick_check will reset this value */
1022 if ( !ball->return_allowed )
1023 ball->idle_time += ms;
1024
1025 /* check if reflected by any paddle */
1026 for ( i = 0; i < cur_game->paddle_count; i++ )
1027 if ( ball_paddle_contact_possible( ball, cur_game->paddles[i], old ) )
1028 ball_check_paddle_reflection( ball, cur_game->paddles[i] );
1029
1030 /* update target? */
1031 if ( ball->get_target ) {
1032 ball_get_target( ball );
1033 ball->get_target = 0;
1034 }
1035
1036 /* new position if NOT attached*/
1037 if ( !ball->attached ) {
1038 ball->cur.x += ball->vel.x * ms;
1039 ball->cur.y += ball->vel.y * ms;
1040 ball->x = (int)ball->cur.x;
1041 ball->y = (int)ball->cur.y;
1042 }
1043
1044 /* reflection by brick */
1045 /* quick hack to handle the case when the ball was just attached but
1046 * touches the wall and the slimy paddle in the same instant. -
1047 * Patrick Hohmeyer 19.12.01 */
1048 if ( ball->target.exists && !ball->attached ) {
1049 ball->target.cur_tm += ms;
1050 ball_check_brick_reflection( ball );
1051 }
1052
1053 /* check if idle time is above limit and the ball has a target because if
1054 * there is no target the ball moves out of the window and should not go
1055 * back to the paddle as it's moving into this direction by itself
1056 */
1057 if ( ball->idle_time >= BALLS_IDLE_LIMIT )
1058 if ( !ball->return_allowed )
1059 if ( ball->target.exists ) {
1060 /* okay send this ball back home or allow to do so by click */
1061 if ( !cur_game->balls_return_by_click ) {
1062 ball->idle_time = 0;
1063 ball->moving_back = 1;
1064 ball->target.exists = 0; /* no target */
1065 }
1066 else {
1067 ball->idle_time = 0;
1068 ball->return_allowed = 1;
1069 }
1070 }
1071 }
1072
1073 /* get next entry in list and remove those out of the window */
1074 entry = entry->next;
1075 if (!ball->attached )
1076 if ( ball->x >= 640 ||
1077 ball->x + ball_dia < 0 ||
1078 ball->y >= 480 ||
1079 ball->y + ball_dia < 0 ) {
1080 if ( ball->y + ball_rad <= 480 >> 1 )
1081 top++;
1082 else
1083 bottom++;
1084 list_delete_entry( cur_game->balls, entry->prev );
1085 }
1086 }
1087
1088 /* update stats */
1089 cur_game->paddles[PADDLE_BOTTOM]->balls_lost += bottom;
1090 if ( cur_game->paddles[PADDLE_TOP] )
1091 cur_game->paddles[PADDLE_TOP]->balls_lost += top;
1092
1093 /* modify scores in network game. for local games lost balls do not
1094 * change score. */
1095 if ( cur_game->game_type == GT_NETWORK ) {
1096 /* modify scores when a ball got lost */
1097 if ( cur_game->level_type == LT_PINGPONG ) {
1098 /* in pingpong a lost ball gives opponent one point and
1099 * the paddle that lost the ball can bring it back to
1100 * game */
1101 cur_game->paddles[PADDLE_BOTTOM]->score += top;
1102 cur_game->paddles[PADDLE_TOP]->score += bottom;
1103 cur_game->paddles[PADDLE_BOTTOM]->ball_ammo += bottom;
1104 cur_game->paddles[PADDLE_TOP]->ball_ammo += top;
1105 }
1106 else {
1107 /* in a normal level 10% of score gets lost and
1108 * last contact time is reset so that it will take
1109 * ten seconds penalty before a new ball is
1110 * generated. */
1111 if ( top ) {
1112 while ( top-- > 0 )
1113 cur_game->paddles[PADDLE_TOP]->score =
1114 90 * cur_game->paddles[PADDLE_TOP]->score / 100;
1115 cur_game->paddles[PADDLE_TOP]->last_ball_contact = SDL_GetTicks();
1116 }
1117 if ( bottom ) {
1118 while ( bottom-- > 0 )
1119 cur_game->paddles[PADDLE_BOTTOM]->score =
1120 90 * cur_game->paddles[PADDLE_BOTTOM]->score / 100;
1121 cur_game->paddles[PADDLE_BOTTOM]->last_ball_contact = SDL_GetTicks();
1122 }
1123 }
1124 }
1125 }
1126 /*
1127 ====================================================================
1128 All balls with target mx,my will have there 'get_target' flag
1129 set True so they compute a new target next time balls_update()
1130 is called. If 'mx' is -1 all balls will set their flag.
1131 ====================================================================
1132 */
1133 void balls_check_targets(int mx, int my) {
1134 Ball *ball;
1135 int reset = 0;
1136 list_reset( cur_game->balls );
1137 while ( ( ball = list_next( cur_game->balls ) ) )
1138 if ( !ball->attached && !ball->moving_back )
1139 if ( mx == -1 || ( ball->target.mx == mx && ball->target.my == my ) ) {
1140 /* As we don't have a constant velocity but assume one it is possible that
1141 * the ball is within a wall when this function is called because it actually
1142 * passed it's reset position without time expiration because of the velocity
1143 * change. So we have to check here if it is already behind this position
1144 * and if so simply reset here. This doesn't hurt as this would happen
1145 * before reflection, too. */
1146 if ( ball->target.exists ) {
1147 if ( ball->vel.y > 0 ) {
1148 if ( ball->cur.y > ball->target.y )
1149 reset = 1;
1150 }
1151 else {
1152 if ( ball->cur.y < ball->target.y )
1153 reset = 1;
1154 }
1155 if ( ball->vel.x > 0 ) {
1156 if ( ball->cur.x > ball->target.x )
1157 reset = 1;
1158 }
1159 else {
1160 if ( ball->cur.x < ball->target.x )
1161 reset = 1;
1162 }
1163 if ( reset ) {
1164 ball->cur.x = ball->target.x;
1165 ball->cur.y = ball->target.y;
1166 ball->x = (int)ball->cur.x;
1167 ball->y = (int)ball->cur.y;
1168 }
1169 }
1170 ball->get_target = 1;
1171 }
1172 }
1173 /*
1174 ====================================================================
1175 Adjust velocity of ball to spare out any illegal values.
1176 Add a little entropy to the vector if 'entropy' is True.
1177 ====================================================================
1178 */
1179 void ball_mask_vel(Ball *b, float old_vx, int entropy )
1180 {
1181 float m, entropy_level = 0;
1182
1183 if ( b->vel.x == 0 && b->vel.y == 0 ) return;
1184
1185 /* b->vel.x == 0 would cause seg faults */
1186 if (b->vel.x == 0) {
1187 if (old_vx < 0)
1188 b->vel.x = 0.01;
1189 else
1190 b->vel.x = -0.01;
1191 }
1192
1193 if ( entropy == BALL_ADD_ENTROPY )
1194 entropy_level = (float)((rand() % 81)+40)/1000.0;
1195
1196 m = b->vel.y / b->vel.x;
1197 if (fabs(m) < ball_vhmask) {
1198 /* mask angles from 70 to 110 and -110 to -70 */
1199 if (b->vel.y < 0)
1200 b->vel.y = -fabs(ball_vhmask * b->vel.x);
1201 else
1202 b->vel.y = fabs(ball_vhmask * b->vel.x);
1203 if ( entropy == BALL_ADD_ENTROPY )
1204 b->vel.x -= b->vel.x * entropy_level;
1205 }
1206 else
1207 if (fabs(m) > ball_vvmask) {
1208 /* mask angles from -10 to 10 and 170 to 190 */
1209 if (b->vel.x < 0)
1210 b->vel.x = -fabs(b->vel.y / ball_vvmask);
1211 else
1212 b->vel.x = fabs(b->vel.y / ball_vvmask);
1213 if ( entropy == BALL_ADD_ENTROPY )
1214 b->vel.x += b->vel.x * entropy_level;
1215 }
1216 else
1217 if ( entropy == BALL_ADD_ENTROPY ) {
1218 if ( rand() % 2 )
1219 entropy_level = -entropy_level;
1220 b->vel.x += b->vel.x * entropy_level;
1221 }
1222
1223 /* avoid 45° angles */
1224 if (b->vel.x == b->vel.y)
1225 b->vel.x *= 0.98;
1226
1227 /* adjust speed */
1228 vector_set_length( &b->vel, cur_game->ball_v );
1229 }
1230 /*
1231 ====================================================================
1232 Get target for a ball.
1233 ====================================================================
1234 */
1235 enum { TANG_LEFT = 0, TANG_RIGHT };
1236 enum { DIR_UP = 0, DIR_DOWN, DIR_LEFT, DIR_RIGHT };
1237 void ball_get_target( Ball *ball )
1238 {
1239 int cur_tang;
1240 float mono; /* monotony */
1241 Coord tang_pts[2]; /* tangential points */
1242 Line tang; /* current tangent */
1243 Coord center = {
1244 ball->cur.x + ball_rad,
1245 ball->cur.y + ball_rad }; /* ball center */
1246 int start, end, dir, line_pos, change; /* used to intersect the brick grid */
1247 Line cur_line; /* dito */
1248 Coord pt; /* auxiliary point. used for this 'n' that */
1249 Target targets[2]; /* targets hit by the tangents: nearest is the actual target */
1250 Target hori_target[2], vert_target[2]; /* used to get target of tangent */
1251 float dist; /* distance between two points */
1252 Vector norm_vel; /* normed ball velocity */
1253 #ifdef WITH_BUG_REPORT
1254 char tang_target_chosen_str[2][128]; /* either hori or vert target chosen */
1255 char side_str[128];
1256 Coord test_pts[2];
1257 #endif
1258 Target *prim, *sec; /* primary, secondary target */
1259 int maybe_corner;
1260
1261 #ifdef WITH_BUG_REPORT
1262 side_str[0] = 0;
1263 #endif
1264
1265 /* balls moving back to paddle must not be reflected */
1266 if ( ball->moving_back ) return;
1267 /* attached balls MUST NOT be reflected!!!! */
1268 if ( ball->attached ) return;
1269 /* balls already out of the screen though still visible don't need new reflection, too */
1270 if ( ball->cur.y + ball_dia >= 480 - 1 ) return;
1271
1272 /* clear ball targets */
1273 ball_clear_target( &ball->target );
1274 ball_clear_target( &targets[TANG_LEFT] );
1275 ball_clear_target( &targets[TANG_RIGHT] );
1276 /* monotony */
1277 mono = ball->vel.y / ball->vel.x;
1278 /* normed velocity */
1279 norm_vel = ball->vel; vector_norm( &norm_vel );
1280 /* tangential points */
1281 ball_get_tangents( ball, &tang_pts[TANG_LEFT], &tang_pts[TANG_RIGHT] );
1282 /* get all map bricks the tangents intersect and check target */
1283 for ( cur_tang = 0; cur_tang < 2; cur_tang++ ) {
1284 /* clear targets */
1285 ball_clear_target( &hori_target[cur_tang] );
1286 ball_clear_target( &vert_target[cur_tang] );
1287 /* current tangent */
1288 line_set( &tang, tang_pts[cur_tang].x, tang_pts[cur_tang].y, mono );
1289 /* intersect horizontal lines */
1290 /* get direction */
1291 dir = DIR_DOWN;
1292 if ( ball->vel.y < 0 ) dir = DIR_UP;
1293 /* get starting line */
1294 start = ((int)( tang_pts[cur_tang].y / BRICK_HEIGHT )) * BRICK_HEIGHT;
1295 /* get end line */
1296 if ( dir == DIR_UP )
1297 end = 0;
1298 else
1299 end = ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT;
1300 /* adjust lines if ball moves up */
1301 if ( dir == DIR_UP ) {
1302 start += BRICK_HEIGHT - 1;
1303 end += BRICK_HEIGHT - 1;
1304 }
1305 /* get position change */
1306 change = BRICK_HEIGHT;
1307 if ( dir == DIR_UP ) change = -change;
1308 /* we're at this brick so we can't reflect here */
1309 start += change;
1310 /* intersect */
1311 line_pos = start;
1312 /* end specifies the last line to be checked to we have to add
1313 another line to state the break condition.
1314 this last line is not checked */
1315 end += change;
1316 while ( line_pos != end ) {
1317 line_set_hori( &cur_line, line_pos );
1318 if ( line_intersect( &cur_line, &tang, &pt ) && ( pt.x >= 0 && pt.x < 640 ) )
1319 if ( cur_game->bricks[(int)pt.x / BRICK_WIDTH][(int)pt.y / BRICK_HEIGHT].type != MAP_EMPTY ) {
1320 /* we got our horizontal target */
1321 hori_target[cur_tang].exists = 1;
1322 hori_target[cur_tang].x = pt.x;
1323 hori_target[cur_tang].y = pt.y;
1324 hori_target[cur_tang].mx = (int)pt.x / BRICK_WIDTH;
1325 hori_target[cur_tang].my = (int)pt.y / BRICK_HEIGHT;
1326 if ( ball->vel.y < 0 )
1327 hori_target[cur_tang].side = SIDE_BOTTOM;
1328 else
1329 hori_target[cur_tang].side = SIDE_TOP;
1330 break; /* we got our target for this tangent */
1331 }
1332 line_pos += change;
1333 }
1334 /* intersect vertical lines */
1335 /* get direction */
1336 dir = DIR_RIGHT;
1337 if ( ball->vel.x < 0 ) dir = DIR_LEFT;
1338 /* get starting line */
1339 start = ((int)( tang_pts[cur_tang].x / BRICK_WIDTH )) * BRICK_WIDTH;
1340 /* get end line */
1341 if ( dir == DIR_LEFT )
1342 end = 0;
1343 else
1344 end = ( MAP_WIDTH - 1 ) * BRICK_WIDTH;
1345 /* adjust lines if ball moves up */
1346 if ( dir == DIR_LEFT ) {
1347 start += BRICK_WIDTH - 1;
1348 end += BRICK_WIDTH - 1;
1349 }
1350 /* get position change */
1351 change = BRICK_WIDTH;
1352 if ( dir == DIR_LEFT ) change = -change;
1353 /* we're at this brick so we can't reflect here */
1354 start += change;
1355 /* intersect */
1356 line_pos = start;
1357 /* end specifies the last line to be checked too we have to add
1358 another line to state the break condition.
1359 this last line is not checked */
1360 end += change;
1361 while ( line_pos != end ) {
1362 line_set_vert( &cur_line, line_pos );
1363 if ( line_intersect( &cur_line, &tang, &pt ) && ( pt.y >= 0 && pt.y < 480 ) )
1364 if ( cur_game->bricks[(int)pt.x / BRICK_WIDTH][(int)pt.y / BRICK_HEIGHT].type != MAP_EMPTY ) {
1365 /* we got our vertical target */
1366 vert_target[cur_tang].exists = 1;
1367 vert_target[cur_tang].x = pt.x;
1368 vert_target[cur_tang].y = pt.y;
1369 vert_target[cur_tang].mx = (int)pt.x / BRICK_WIDTH;
1370 vert_target[cur_tang].my = (int)pt.y / BRICK_HEIGHT;
1371 if ( ball->vel.x < 0 )
1372 vert_target[cur_tang].side = SIDE_RIGHT;
1373 else
1374 vert_target[cur_tang].side = SIDE_LEFT;
1375 break; /* we got our target for this tangent */
1376 }
1377 line_pos += change;
1378 }
1379 /* get closest target */
1380 if ( !hori_target[cur_tang].exists ) {
1381 targets[cur_tang] = vert_target[cur_tang];
1382 #ifdef WITH_BUG_REPORT
1383 if ( !vert_target[cur_tang].exists )
1384 sprintf( tang_target_chosen_str[cur_tang], "No target chosen." );
1385 else
1386 sprintf( tang_target_chosen_str[cur_tang], "Vertical target chosen." );
1387 #endif
1388 }
1389 else
1390 if ( !vert_target[cur_tang].exists ) {
1391 targets[cur_tang] = hori_target[cur_tang];
1392 #ifdef WITH_BUG_REPORT
1393 sprintf( tang_target_chosen_str[cur_tang], "Horizontal target chosen." );
1394 #endif
1395 }
1396 else {
1397 /* check the relation and choose the correct target */
1398 /* if vertical and hori hit the same brick we have hit the corner */
1399 if ( hori_target[cur_tang].mx == vert_target[cur_tang].mx && hori_target[cur_tang].my == vert_target[cur_tang].my ) {
1400 /* congrats! we hit the exact corner pixel! now we have to decide by corner and
1401 tangent which target to use */
1402 if ( cur_tang == TANG_LEFT ) {
1403 /* left tangent */
1404 if ( ball->vel.y > 0 ) {
1405 if ( ball->vel.x > 0 ) /* upper, right */
1406 targets[cur_tang] = vert_target[cur_tang];
1407 else
1408 targets[cur_tang] = hori_target[cur_tang];
1409 }
1410 else {
1411 if ( ball->vel.x > 0 ) /* lower, right */
1412 targets[cur_tang] = hori_target[cur_tang];
1413 else
1414 targets[cur_tang] = vert_target[cur_tang];
1415 }
1416 }
1417 else {
1418 /* right tangent */
1419 if ( ball->vel.y > 0 ) {
1420 if ( ball->vel.x > 0 ) /* upper, right */
1421 targets[cur_tang] = hori_target[cur_tang];
1422 else
1423 targets[cur_tang] = vert_target[cur_tang];
1424 }
1425 else {
1426 if ( ball->vel.x > 0 ) /* lower, right */
1427 targets[cur_tang] = vert_target[cur_tang];
1428 else
1429 targets[cur_tang] = hori_target[cur_tang];
1430 }
1431 }
1432 #ifdef WITH_BUG_REPORT
1433 if ( targets[cur_tang].x == hori_target[cur_tang].x && targets[cur_tang].y == hori_target[cur_tang].y )
1434 sprintf( tang_target_chosen_str[cur_tang], "(TRICKY) Horizontal target chosen." );
1435 else
1436 sprintf( tang_target_chosen_str[cur_tang], "(TRICKY) Vertical target chosen." );
1437 #endif
1438 }
1439 else {
1440 if ( VEC_DIST( tang_pts[cur_tang], vector_get( hori_target[cur_tang].x, hori_target[cur_tang].y ) ) < VEC_DIST( tang_pts[cur_tang], vector_get( vert_target[cur_tang].x, vert_target[cur_tang].y ) ) ) {
1441 targets[cur_tang] = hori_target[cur_tang];
1442 #ifdef WITH_BUG_REPORT
1443 sprintf( tang_target_chosen_str[cur_tang], "Horizontal target chosen." );
1444 #endif
1445 }
1446 else {
1447 targets[cur_tang] = vert_target[cur_tang];
1448 #ifdef WITH_BUG_REPORT
1449 sprintf( tang_target_chosen_str[cur_tang], "Vertical target chosen." );
1450 #endif
1451 }
1452 }
1453 }
1454 } /* now we have the two targets hit by the tangents */
1455 /* whatever's up the nearest brick is hit */
1456 if ( targets[TANG_LEFT].exists || targets[TANG_RIGHT].exists ) {
1457 prim = sec = 0;
1458 if ( !targets[TANG_LEFT].exists || !targets[TANG_RIGHT].exists ) {
1459 if ( targets[TANG_LEFT].exists )
1460 prim = &targets[TANG_LEFT];
1461 else
1462 prim = &targets[TANG_RIGHT];
1463 }
1464 else {
1465 if ( VEC_DIST( center, vector_get( targets[TANG_RIGHT].x, targets[TANG_RIGHT].y ) ) < VEC_DIST( center, vector_get( targets[TANG_LEFT].x, targets[TANG_LEFT].y ) ) ) {
1466 prim = &targets[TANG_RIGHT];
1467 sec = &targets[TANG_LEFT];
1468 }
1469 else {
1470 prim = &targets[TANG_LEFT];
1471 sec = &targets[TANG_RIGHT];
1472 }
1473 }
1474 /* however, the primary target maybe be blocked by another brick or may be a corner */
1475 /* check if side of prim target isn't blocked by a brick */
1476 switch ( prim->side ) {
1477 case SIDE_TOP:
1478 if ( cur_game->bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) {
1479 if ( ball->vel.x > 0 )
1480 prim->side = SIDE_LEFT;
1481 else
1482 prim->side = SIDE_RIGHT;
1483 #ifdef WITH_BUG_REPORT
1484 sprintf( side_str, "Had to change side as TOP wasn't appropiate!" );
1485 #endif
1486 }
1487 break;
1488 case SIDE_BOTTOM:
1489 if ( cur_game->bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) {
1490 if ( ball->vel.x > 0 )
1491 prim->side = SIDE_LEFT;
1492 else
1493 prim->side = SIDE_RIGHT;
1494 #ifdef WITH_BUG_REPORT
1495 sprintf( side_str, "Had to change side as BOTTOM wasn't appropiate!" );
1496 #endif
1497 }
1498 break;
1499 case SIDE_LEFT:
1500 if ( cur_game->bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) {
1501 if ( ball->vel.y > 0 )
1502 prim->side = SIDE_TOP;
1503 else
1504 prim->side = SIDE_BOTTOM;
1505 #ifdef WITH_BUG_REPORT
1506 sprintf( side_str, "Had to change side as LEFT wasn't appropiate!" );
1507 #endif
1508 }
1509 break;
1510 case SIDE_RIGHT:
1511 if ( cur_game->bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) {
1512 if ( ball->vel.y > 0 )
1513 prim->side = SIDE_TOP;
1514 else
1515 prim->side = SIDE_BOTTOM;
1516 #ifdef WITH_BUG_REPORT
1517 sprintf( side_str, "Had to change side as RIGHT wasn't appropiate!" );
1518 #endif
1519 }
1520 break;
1521 }
1522 /* now it still may be a corner */
1523 if ( sec == 0 || prim->mx != sec->mx || prim->my != sec->my || prim->side != sec->side ) {
1524 maybe_corner = 1;
1525 if ( ball->vel.y > 0 ) {
1526 if ( ball->vel.x > 0 ) {
1527 /* upper left corner */
1528 if ( cur_game->bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) maybe_corner = 0;
1529 if ( cur_game->bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1530 }
1531 else {
1532 /* upper right corner */
1533 if ( cur_game->bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) maybe_corner = 0;
1534 if ( cur_game->bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1535 }
1536 }
1537 else {
1538 if ( ball->vel.x > 0 ) {
1539 /* lower left corner */
1540 if ( cur_game->bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) maybe_corner = 0;
1541 if ( cur_game->bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1542 }
1543 else {
1544 /* lower right corner */
1545 if ( cur_game->bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) maybe_corner = 0;
1546 if ( cur_game->bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1547 }
1548 }
1549 if ( maybe_corner )
1550 ball_corner_check( ball, &targets[TANG_LEFT], &targets[TANG_RIGHT], prim );
1551 }
1552 /* we updated primary's side info correctly and may reflect now */
1553 ball->target = *prim;
1554 ball_reflect( ball );
1555 /* we got the reset position and the perpvector so finalize target */
1556 /* compute time: assume constant velocity: velocity change must not be too high! */
1557 dist = sqrt( SQUARE(center.x - ball->target.x) + SQUARE(center.y - ball->target.y) );
1558 ball->target.time = (int)floor(dist / cur_game->ball_v);
1559 /* target's reset position is center position right now but
1560 we need the upper left corner of the ball */
1561 ball->target.x -= ball_rad; ball->target.y -= ball_rad;
1562 /* some error information */
1563 #ifdef WITH_BUG_REPORT
1564 pt.x = ball->cur.x; pt.y = ball->cur.y;
1565 ball->cur.x = ball->target.x; ball->cur.y = ball->target.y;
1566 ball_get_tangents( ball, &test_pts[TANG_LEFT], &test_pts[TANG_RIGHT] );
1567 ball->cur.x = pt.x; ball->cur.y = pt.y;
1568 if ( cur_game->bricks[(int)test_pts[0].x/BRICK_WIDTH][(int)test_pts[0].y/BRICK_HEIGHT].type != MAP_EMPTY ||
1569 cur_game->bricks[(int)test_pts[1].x/BRICK_WIDTH][(int)test_pts[1].y/BRICK_HEIGHT].type != MAP_EMPTY ) {
1570 printf( "*****\n" );
1571 printf( "Test Failed: %4.2f,%4.2f (%i,%i):\n",
1572 ball->target.x+ball_rad, ball->target.y+ball_rad,
1573 (int)(ball->target.x+ball_rad)/BRICK_WIDTH,
1574 (int)(ball->target.y+ball_rad)/BRICK_HEIGHT );
1575 printf( "Left Tangent %4.2f,%4.2f (%i,%i) or Right Tangent %4.2f,%4.2f (%i,%i)\n",
1576 test_pts[0].x,test_pts[0].y,
1577 (int)test_pts[0].x/BRICK_WIDTH,(int)test_pts[0].y/BRICK_HEIGHT,
1578 test_pts[1].x,test_pts[1].y,
1579 (int)test_pts[1].x/BRICK_WIDTH,(int)test_pts[1].y/BRICK_HEIGHT);
1580 printf( "*****\n" );
1581 printf( "2.4: Balls: %i\n", cur_game->balls->count );
1582 if ( targets[TANG_LEFT].exists ) {
1583 printf( "Left Tangential Point: %4.2f,%4.2f\n",
1584 tang_pts[TANG_LEFT].x, tang_pts[TANG_LEFT].y );
1585 printf( "Left Tangent: Horizontal: %i,%i, %i (%4.2f,%4.2f)\n",
1586 hori_target[TANG_LEFT].mx, hori_target[TANG_LEFT].my, hori_target[TANG_LEFT].side,
1587 hori_target[TANG_LEFT].x, hori_target[TANG_LEFT].y );
1588 printf( "Left Tangent: Vertical: %i,%i, %i (%4.2f,%4.2f)\n",
1589 vert_target[TANG_LEFT].mx, vert_target[TANG_LEFT].my, vert_target[TANG_LEFT].side,
1590 vert_target[TANG_LEFT].x, vert_target[TANG_LEFT].y );
1591 printf( "%s\n", tang_target_chosen_str[TANG_LEFT] );
1592 }
1593 if ( targets[TANG_RIGHT].exists ) {
1594 printf( "Right Tangential Point: %4.2f,%4.2f\n",
1595 tang_pts[TANG_RIGHT].x, tang_pts[TANG_RIGHT].y );
1596 printf( "Right Tangent: Horizontal: %i,%i, %i (%4.2f,%4.2f)\n",
1597 hori_target[TANG_RIGHT].mx, hori_target[TANG_RIGHT].my, hori_target[TANG_RIGHT].side,
1598 hori_target[TANG_RIGHT].x, hori_target[TANG_RIGHT].y );
1599 printf( "Right Tangent: Vertical: %i,%i, %i (%4.2f,%4.2f)\n",
1600 vert_target[TANG_RIGHT].mx, vert_target[TANG_RIGHT].my, vert_target[TANG_RIGHT].side,
1601 vert_target[TANG_RIGHT].x, vert_target[TANG_RIGHT].y );
1602 printf( "%s\n", tang_target_chosen_str[TANG_RIGHT] );
1603 }
1604 if ( side_str[0] != 0 ) printf( "BTW: %s\n", side_str );
1605 printf( "-----\n" );
1606 ball_print_target_info( ball );
1607 printf("*****\n");
1608 printf( "\nYou encountered a bug! Please send this output to kulkanie@gmx.net. Thanks!\n" );
1609 //exit(1);
1610 /* move ball back to paddle as the current target is nonsense */
1611 ball->target.exists = 0;
1612 ball->idle_time = 0;
1613 ball->moving_back = 1;
1614 ball->return_allowed = 0;
1615 }
1616 #endif
1617 }
1618 }
1619 /*
1620 ====================================================================
1621 Increase velocity acording to vel_change
1622 ====================================================================
1623 */
1624 void balls_inc_vel( int ms )
1625 {
1626 Ball *ball;
1627
1628 if ( cur_game->ball_v >= cur_game->ball_v_max ) return;
1629
1630 if ( !delay_timed_out( &cur_game->speedup_delay, ms ) ) return;
1631
1632 cur_game->ball_v += cur_game->diff->v_add;
1633 cur_game->speedup_level++;
1634
1635 list_reset( cur_game->balls );
1636 while ( ( ball = list_next( cur_game->balls ) ) != 0 ) {
1637 if ( ball->attached ) continue;
1638 vector_set_length( &ball->vel, cur_game->ball_v );
1639 }
1640 }
1641 /*
1642 ====================================================================
1643 Return all balls that have ball->return_allowed True.
1644 ====================================================================
1645 */
1646 void balls_return( Paddle *paddle )
1647 {
1648 Ball *ball;
1649
1650 list_reset( cur_game->balls );
1651 while ( ( ball = list_next( cur_game->balls ) ) != 0 )
1652 if ( ball->return_allowed && ball->paddle == paddle ) {
1653 ball->moving_back = 1;
1654 ball->target.exists = 0;
1655 ball->return_allowed = 0;
1656 }
1657 }
1658
1659 /* set random starting angle for ball according to its paddle */
1660 void ball_set_random_angle( Ball *ball, double ball_v )
1661 {
1662 if ( ball->paddle->type == PADDLE_TOP )
1663 ball->vel.y = 1.0;
1664 else
1665 ball->vel.y = -1.0;
1666 ball->vel.x = (float)((rand() % 145) + 6);
1667 if ( rand() % 2 )
1668 ball->vel.x /= -100.0;
1669 else
1670 ball->vel.x /= 100.0;
1671
1672 /* only use 2 degree steps */
1673 ball->angle = vec2angle( &ball->vel );
1674 angle2vec( ball->angle, &ball->vel );
1675 ball->vel.x *= ball_v; ball->vel.y *= ball_v;
1676 }
1677
1678 /*
1679 ====================================================================
1680 Set velocity of all balls and get new targets if any.
1681 ====================================================================
1682 */
1683 void balls_set_velocity( List *balls, double vel )
1684 {
1685 Ball *b;
1686 double dist;
1687
1688 list_reset( balls );
1689 while ( ( b = list_next( balls ) ) ) {
1690 vector_set_length( &b->vel, vel );
1691 if ( b->target.exists ) {
1692 dist = sqrt( SQUARE(b->cur.x - b->target.x) +
1693 SQUARE(b->cur.y - b->target.y) );
1694 b->target.time = (int)floor(dist / vel);
1695 b->target.cur_tm = 0;
1696 }
1697 }
1698 }
1699
1700 /*
1701 ====================================================================
1702 Detach all balls to the passed direction (-1 or 1) and return True
1703 if there were any balls detached. As balls within walls are not
1704 fired the result may differ from paddle::attached_ball_count!
1705 ====================================================================
1706 */
1707 int balls_detach_from_paddle( Paddle *paddle, int dir )
1708 {
1709 Ball *ball;
1710 int fired = 0;
1711
1712 list_reset( cur_game->balls );
1713 while ( ( ball = list_next( cur_game->balls ) ) ) {
1714 if ( !ball->attached || ball->paddle != paddle )
1715 continue;
1716 /* balls in walls (hehe) are not fired */
1717 if ( ball->x + paddle->x < BRICK_WIDTH )
1718 continue;
1719 if ( ball->x + ball_dia + paddle->x >= 640 - BRICK_WIDTH )
1720 continue;
1721 /* release ball */
1722 ball->attached = 0;
1723 ball->paddle->attached_ball_count--;
1724 ball->moving_back = ball->idle_time = ball->return_allowed = 0;
1725 ball->x += paddle->x;
1726 ball->y += paddle->y;
1727 ball->cur.x = ball->x;
1728 ball->cur.y = ball->y;
1729 if ( !cur_game->balls_use_random_angle ) {
1730 /* when random angle is used the vector is not
1731 * changed but the one before the attachment is
1732 * used */
1733 ball->vel.x = (float)dir;
1734 if ( ball->paddle->type == PADDLE_TOP )
1735 ball->vel.y = 1.2;
1736 else
1737 ball->vel.y = -1.2;
1738 /* only use 2 degree steps */
1739 ball->angle = vec2angle( &ball->vel );
1740 angle2vec( ball->angle, &ball->vel );
1741 vector_set_length( &ball->vel, cur_game->ball_v );
1742 }
1743 ball->get_target = 1;
1744 fired = 1;
1745 }
1746
1747 /* if no balls are attached anymore set last contact time */
1748 if ( fired && paddle->attached_ball_count == 0 )
1749 paddle->last_ball_contact = SDL_GetTicks();
1750
1751 return fired;
1752 }
1753
0 /***************************************************************************
1 balls.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __BALLS_H
18 #define __BALLS_H
19
20 /*
21 ====================================================================
22 Load/delete ball graphics
23 ====================================================================
24 */
25 void ball_load();
26 void ball_delete();
27 /*
28 ====================================================================
29 Create ball at position
30 ====================================================================
31 */
32 Ball* ball_create( int x, int y );
33 /*
34 ====================================================================
35 Set a special ball property like metal ball.
36 ====================================================================
37 */
38 void balls_set_type( int type );
39 /*
40 ====================================================================
41 Set chaotic behaviour (random relfection)
42 ====================================================================
43 */
44 void balls_set_chaos( int chaos );
45 /*
46 ====================================================================
47 Clear ball list and attach one ball to paddle
48 ====================================================================
49 */
50 void balls_reset();
51 /*
52 ====================================================================
53 Show/hide all balls
54 ====================================================================
55 */
56 void balls_hide();
57 void balls_show_shadow();
58 void balls_show();
59 void balls_alphashow( int alpha );
60 /*
61 ====================================================================
62 Update balls and detach attached balls if fire was pressed.
63 ====================================================================
64 */
65 void balls_update( int ms );
66 /*
67 ====================================================================
68 All balls with target mx,my will have there 'get_target' flag
69 set True so they compute a new target next time balls_update()
70 is called. If 'mx' is -1 all balls will set their flag.
71 ====================================================================
72 */
73 void balls_check_targets(int mx, int my);
74 /*
75 ====================================================================
76 Adjust velocity of ball to spare out any illegal values.
77 Add a little entropy to the vector if 'entropy' is True.
78 ====================================================================
79 */
80 void ball_mask_vel(Ball *b, float old_vx, int entropy );
81 /*
82 ====================================================================
83 Get target for a ball.
84 input :
85 Ball* b
86 function :
87 -check if ball b hits a brick and if so:
88 -compute the hitten brick in lev_map (int mx, my)
89 -the reset position of the ball after destroying the brick (float x, y)
90 -the time in milliseconds it takes the ball to hit the brick from its current position
91 by using ball_v as velocity (int time)
92 -the side at which the ball hits; might be LEFT, RIGHT, TOP, BOTTOM (int side)
93 -the reflection vector (float a); if reflecting at an horizontal wall it's a = {0, 1} else a = {1, 0}
94 ====================================================================
95 */
96 void ball_get_target( Ball *b );
97 /*
98 ====================================================================
99 Increase velocity acording to vel_change
100 ====================================================================
101 */
102 void balls_inc_vel( int ms );
103 /*
104 ====================================================================
105 Return all balls that have ball->return_allowed True to the paddle
106 (if they touched this one as last).
107 ====================================================================
108 */
109 void balls_return( Paddle *paddle );
110
111 /* set random starting angle for ball according to its paddle */
112 void ball_set_random_angle( Ball *ball, double ball_v );
113
114 /*
115 ====================================================================
116 Check if the ball is on paddle's level and an reflect is
117 possible.
118 ====================================================================
119 */
120 int ball_paddle_contact_possible( Ball *ball, Paddle *paddle, Vector old );
121
122 /*
123 ====================================================================
124 Check reflection of ball at paddle. 'old' is the position of
125 the ball before update. Used to compute direction.
126 ====================================================================
127 */
128 void ball_check_paddle_reflection( Ball *ball, Paddle *paddle );
129
130 /*
131 ====================================================================
132 Set velocity of all balls and get new targets if any.
133 ====================================================================
134 */
135 void balls_set_velocity( List *balls, double vel );
136
137 /*
138 ====================================================================
139 Detach all balls to the passed direction (-1 or 1) and return True
140 if there were any balls detached. As balls within walls are not
141 fired the result may differ from paddle::attached_ball_count!
142 ====================================================================
143 */
144 int balls_detach_from_paddle( Paddle *paddle, int dir );
145
146 #endif
147
0 /***************************************************************************
1 bricks.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "extras.h"
19 #include "balls.h"
20 #include "bricks.h"
21 #include "mathfuncs.h"
22
23 extern Game *cur_game;
24 extern int ball_dia;
25
26 /* extras conversion table */
27 Extra_Conv extra_conv_table[EX_NUMBER] = {
28 { EX_SCORE200, '0' },
29 { EX_SCORE500, '1' },
30 { EX_SCORE1000, '2' },
31 { EX_SCORE2000, '3' },
32 { EX_SCORE5000, '4' },
33 { EX_SCORE10000, '5' },
34 { EX_GOLDSHOWER, 'g' },
35 { EX_LENGTHEN, '+' },
36 { EX_SHORTEN, '-' },
37 { EX_LIFE, 'l' },
38 { EX_SLIME, 's' },
39 { EX_METAL, 'm' },
40 { EX_BALL, 'b' },
41 { EX_WALL, 'w' },
42 { EX_FROZEN, 'f' },
43 { EX_WEAPON, 'p' },
44 { EX_RANDOM, '?' },
45 { EX_FAST, '>' },
46 { EX_SLOW, '<' },
47 { EX_JOKER, 'j' },
48 { EX_DARKNESS, 'd' },
49 { EX_CHAOS, 'c' },
50 { EX_GHOST_PADDLE, '~' },
51 { EX_DISABLE, '!' },
52 { EX_TIME_ADD, '&' },
53 { EX_EXPL_BALL, '*' },
54 { EX_BONUS_MAGNET, '}' },
55 { EX_MALUS_MAGNET, '{' },
56 { EX_WEAK_BALL, 'W' }
57 };
58 /* brick conversion table: brick id, char */
59 Brick_Conv brick_conv_table[BRICK_COUNT] = {
60 { 'E', MAP_WALL, 0, -1, 0 },
61 { '#', MAP_BRICK, 1, -1, 1000 },
62 { '@', MAP_BRICK_CHAOS, 2, -1, 1000 },
63 { 'a', MAP_BRICK, 3, 1, BRICK_SCORE * 1 },
64 { 'b', MAP_BRICK, 4, 2, BRICK_SCORE * 2 },
65 { 'c', MAP_BRICK, 5, 3, BRICK_SCORE * 3 },
66 { 'v', MAP_BRICK, 6, 4, BRICK_SCORE * 4 },
67 { 'x', MAP_BRICK_HEAL, 7, 1, BRICK_SCORE * 2},
68 { 'y', MAP_BRICK_HEAL, 8, 2, BRICK_SCORE * 4},
69 { 'z', MAP_BRICK_HEAL, 9, 3, BRICK_SCORE * 6},
70 { 'd', MAP_BRICK, 10, 1, BRICK_SCORE },
71 { 'e', MAP_BRICK, 11, 1, BRICK_SCORE },
72 { 'f', MAP_BRICK, 12, 1, BRICK_SCORE },
73 { 'g', MAP_BRICK, 13, 1, BRICK_SCORE },
74 { 'h', MAP_BRICK, 14, 1, BRICK_SCORE },
75 { 'i', MAP_BRICK, 15, 1, BRICK_SCORE },
76 { 'j', MAP_BRICK, 16, 1, BRICK_SCORE },
77 { 'k', MAP_BRICK, 17, 1, BRICK_SCORE },
78 { '*', MAP_BRICK_EXP, 18, 1, BRICK_SCORE * 2 },
79 { '!', MAP_BRICK_GROW, GROW_BRICK_ID, 1, BRICK_SCORE * 2 },
80 };
81
82 /*
83 ====================================================================
84 Locals
85 ====================================================================
86 */
87
88 /*
89 ====================================================================
90 Initiate a brick explosion.
91 ====================================================================
92 */
93 void brick_start_expl( int x, int y, Paddle *paddle )
94 {
95 cur_game->bricks[x][y].exp_time = BRICK_EXP_TIME;
96 cur_game->bricks[x][y].exp_paddle = paddle;
97 cur_game->bricks[x][y].mx = x; cur_game->bricks[x][y].my = y;
98 list_add( cur_game->exp_bricks, &cur_game->bricks[x][y] );
99 }
100
101 /*
102 ====================================================================
103 Grow a brick at mx,my if the ball does not block the tile.
104 ====================================================================
105 */
106 static void brick_grow( int mx, int my, int id )
107 {
108 Ball *ball;
109
110 /* check all balls */
111 list_reset( cur_game->balls );
112 while ( (ball = list_next( cur_game->balls )) != 0 ) {
113 if ( mx == (ball->x) / BRICK_WIDTH )
114 if ( my == (ball->y) / BRICK_HEIGHT )
115 return;
116 if ( mx == (ball->x + ball_dia) / BRICK_WIDTH )
117 if ( my == (ball->y) / BRICK_HEIGHT )
118 return;
119 if ( mx == (ball->x) / BRICK_WIDTH )
120 if ( my == (ball->y + ball_dia) / BRICK_HEIGHT )
121 return;
122 if ( mx == (ball->x + ball_dia) / BRICK_WIDTH )
123 if ( my == (ball->y + ball_dia) / BRICK_HEIGHT )
124 return;
125 }
126
127 /* add brick */
128 cur_game->bricks[mx][my].brick_c = brick_conv_table[id].c;
129 cur_game->bricks[mx][my].id = brick_conv_table[id].id;
130 cur_game->bricks[mx][my].type = brick_conv_table[id].type;
131 cur_game->bricks[mx][my].score = brick_conv_table[id].score;
132 cur_game->bricks[mx][my].dur = brick_conv_table[id].dur;
133 /* keep the extra that is already assigned to this position */
134 cur_game->bricks[mx][my].exp_time = -1;
135 cur_game->bricks[mx][my].heal_time = -1;
136 /* adjust brick count */
137 cur_game->bricks_left++;
138 cur_game->brick_count++;
139 /* add modification */
140 bricks_add_mod( mx, my, HT_GROW, 0, vector_get(0,0), 0 );
141
142 /* get new targets */
143 balls_check_targets( -1, 0 );
144 }
145 /*
146 ====================================================================
147 Remove brick from offscreen and screen.
148 Create shrapnells by type and impulse.
149 'paddle' is the paddle that initiated hit either by shot or ball.
150 ====================================================================
151 */
152 void brick_remove( int mx, int my, int type, Vector imp, Paddle *paddle )
153 {
154 int i,j,px,py;
155 int dir;
156
157 /* if explosive set exp_time of surrounding bricks */
158 if ( cur_game->bricks[mx][my].type == MAP_BRICK_EXP ) {
159 for ( i = mx - 1; i <= mx + 1; i++ )
160 for ( j = my - 1; j <= my + 1; j++ )
161 if ( i != mx || j != my )
162 if ( cur_game->bricks[i][j].type != MAP_EMPTY )
163 if ( cur_game->bricks[i][j].dur > 0 )
164 if ( cur_game->bricks[i][j].exp_time == -1 )
165 brick_start_expl( i,j,paddle );
166 }
167 if ( cur_game->bricks[mx][my].type == MAP_BRICK_GROW ) {
168 for ( i = mx - 1; i <= mx + 1; i++ )
169 for ( j = my - 1; j <= my + 1; j++ )
170 if ( cur_game->bricks[i][j].type == MAP_EMPTY )
171 brick_grow( i, j, RANDOM( BRICK_GROW_FIRST, BRICK_GROW_LAST ) );
172 }
173
174 /* decrease brick count if no indestructible brick was destroyed */
175 if ( cur_game->bricks[mx][my].dur != -1 ) {
176 --cur_game->bricks_left;
177
178 /* update stats */
179 paddle->bricks_cleared++;
180 }
181
182 /* remove brick from map */
183 cur_game->bricks[mx][my].id = -1;
184 cur_game->bricks[mx][my].dur = -1;
185 cur_game->bricks[mx][my].exp_time = -1;
186 cur_game->bricks[mx][my].heal_time = -1;
187 cur_game->bricks[mx][my].type = MAP_EMPTY;
188 cur_game->bricks[mx][my].brick_c = ' ';
189
190 px = mx*BRICK_WIDTH;
191 py = my*BRICK_HEIGHT;
192
193 /* release extra if one exists */
194 dir = ( paddle->type == PADDLE_TOP ) ? -1 : 1;
195 if ( cur_game->bricks[mx][my].extra != EX_NONE ) {
196 if ( cur_game->diff->allow_maluses ||
197 !extra_is_malus( cur_game->bricks[mx][my].extra ) )
198 list_add( cur_game->extras,
199 extra_create( cur_game->bricks[mx][my].extra, px, py, dir ) );
200 }
201 else if ( paddle->extra_active[EX_GOLDSHOWER] )
202 list_add( cur_game->extras,
203 extra_create( EX_SCORE1000, px, py, dir ) );
204 cur_game->bricks[mx][my].extra = EX_NONE;
205 cur_game->bricks[mx][my].extra_c = ' ';
206
207 /* add score */
208 paddle->score += cur_game->bricks[mx][my].score;
209 /* give 5000 extra if this was the last brick
210 if ( cur_game->bricks_left == 0 )
211 paddle->score += 5000;*/
212 }
213
214 /*
215 ====================================================================
216 Publics
217 ====================================================================
218 */
219
220 /*
221 ====================================================================
222 Init bricks from level data, set the warp limit (percent) and
223 add regenerating bricks. As this function is called when
224 initializing a level it does not use the 'cur_game' context.
225 'score_mod' is percentual and 100 means normal score.
226 ====================================================================
227 */
228 void bricks_init( Game *game, int game_type, Level *level, int score_mod, int rel_warp_limit )
229 {
230 int i, j, k;
231 int y_off;
232
233 /* clear everything */
234 for (i = 0; i < MAP_WIDTH; i++)
235 for (j = 0; j < MAP_HEIGHT; j++) {
236 game->bricks[i][j].id = -1;
237 game->bricks[i][j].dur = -1;
238 game->bricks[i][j].type = MAP_EMPTY;
239 game->bricks[i][j].brick_c = ' ';
240 game->bricks[i][j].extra_c = ' ';
241 }
242
243 /* build walls */
244 for (i = 0; i < MAP_WIDTH; i++)
245 if ( game_type == GT_LOCAL ) {
246 /* in multiplayer this is open */
247 game->bricks[i][0].id = 0;
248 game->bricks[i][0].dur = -1;
249 game->bricks[i][0].type = MAP_WALL; /* this means - indestructible */
250 }
251 for (j = 0; j < MAP_HEIGHT; j++) {
252 game->bricks[0][j].id = 0;
253 game->bricks[0][j].dur = -1;
254 game->bricks[0][j].type = MAP_WALL; /* this means - indestructible */
255 game->bricks[MAP_WIDTH - 1][j].id = 0;
256 game->bricks[MAP_WIDTH - 1][j].dur = -1;
257 game->bricks[MAP_WIDTH - 1][j].type = MAP_WALL;
258 }
259
260 /* load map -- center if multiplayer */
261 if ( game_type == GT_NETWORK )
262 y_off = ( MAP_HEIGHT - EDIT_HEIGHT ) / 2;
263 else
264 y_off = 1;
265 for (i = 0; i < EDIT_WIDTH; i++)
266 for (j = 0; j < EDIT_HEIGHT; j++) {
267 /* create bricks */
268 game->bricks[i + 1][j + y_off].exp_time = -1;
269 game->bricks[i + 1][j + y_off].heal_time = -1;
270 for ( k = 0; k < BRICK_COUNT; k++ )
271 if ( level->bricks[i][j] == brick_conv_table[k].c ) {
272 game->bricks[i + 1][j + y_off].brick_c = brick_conv_table[k].c;
273 game->bricks[i + 1][j + y_off].type = brick_conv_table[k].type;
274 game->bricks[i + 1][j + y_off].id = brick_conv_table[k].id;
275 game->bricks[i + 1][j + y_off].dur = brick_conv_table[k].dur;
276 game->bricks[i + 1][j + y_off].score =
277 (score_mod * brick_conv_table[k].score) / 10;
278 break;
279 }
280 if ( k == BRICK_COUNT && level->bricks[i][j] != '.' && level->bricks[i][j] != ' ' )
281 printf( "unknown: %i,%i: %c\n", i, j, level->bricks[i][j] );
282 /* create extras */
283 game->bricks[i + 1][j + y_off].extra = EX_NONE;
284 for ( k = 0; k < EX_NUMBER; k++ )
285 if ( level->extras[i][j] == extra_conv_table[k].c ) {
286 game->bricks[i + 1][j + y_off].extra_c = extra_conv_table[k].c;
287 game->bricks[i + 1][j + y_off].extra = extra_conv_table[k].type;
288 break;
289 }
290 }
291
292 /* count bricks & extras */
293 game->bricks_left = 0; game->extra_count = 0;
294 for (i = 1; i < MAP_WIDTH - 1; i++)
295 for (j = 1; j < MAP_HEIGHT - 1; j++) {
296 if ( game->bricks[i][j].dur > 0 ) {
297 game->bricks_left++;
298 if ( game->bricks[i][j].extra != EX_NONE )
299 game->extra_count++;
300 }
301 }
302 game->brick_count = game->bricks_left;
303
304 /* the above code is fine for levels that are loaded from a
305 * snapshot identical to the original level which is the
306 * case for first load in local game and always in network
307 * game (as in this case, the complete level is sent and
308 * never restarted). for a local game where a ball gets
309 * lost the total number of bricks gets distorted. to allow
310 * fair usage of the warp function the level's original
311 * brick count is used in any case. 'game->brick_count as
312 * computed above is screwed anyway for re-initiated levels
313 * as it does not remember the cleared bricks. the original
314 * number does not take the grown bricks in account. i don't
315 * see an easy way to sync both, so let's keep it, nobody
316 * is hurt as long as no one asks for stats on local games.
317 * DONT ASK FOR STATS ON LOCAL GAMES!!!
318 * okay, grown bricks are not taken in account for the
319 * warp limit, it is computed based on the initial brick
320 * count, thus the additional bricks from a growth must be
321 * cleared without helping to hit the warp limit. that is
322 * not too unfair i think, as it will allow to warp when
323 * you come below the limit and then loose the ball.
324 * why do i write so much anyway? */
325 game->warp_limit = ( 100 - rel_warp_limit ) *
326 level->normal_brick_count / 100;
327
328 /* clear explosion/healing list */
329 list_clear( game->exp_bricks );
330 list_clear( game->heal_bricks );
331
332 /* add regenerating bricks */
333 for ( i = 1; i < MAP_WIDTH - 1; i++ )
334 for ( j = 1; j < MAP_HEIGHT - 1; j++ )
335 if ( game->bricks[i][j].type == MAP_BRICK_HEAL )
336 if ( game->bricks[i][j].dur < 3 ) {
337 game->bricks[i][j].mx = i;
338 game->bricks[i][j].my = j;
339 game->bricks[i][j].heal_time = BRICK_HEAL_TIME;
340 list_add( game->heal_bricks, &game->bricks[i][j] );
341 }
342 }
343 /*
344 ====================================================================
345 Hit brick and remove if destroyed. 'metal' means the ball
346 destroys any brick with the first try.
347 type and imp are used for shrapnell creation.
348 'extra' contains the pushed extra if one was released.
349 'paddle' is the paddle that initiated hit either by shot or ball.
350 Return true on destruction
351 ====================================================================
352 */
353 int brick_hit( int mx, int my, int metal, int type, Vector imp, Paddle *paddle )
354 {
355 int remove = 0;
356 int loose_dur = 0;
357
358 /* a map wall can't be touched */
359 if ( cur_game->bricks[mx][my].type == MAP_WALL ) return 0;
360
361 /* if metal ball resistance is futile */
362 if ( metal )
363 remove = 1;
364 else {
365 if ( cur_game->bricks[mx][my].dur == -1 )
366 return 0; /* duration of -1 means only breakable
367 by engery ball (metal ball) */
368 if ( cur_game->bricks[mx][my].dur <= 1 )
369 remove = 1;
370 else
371 loose_dur = 1;
372 }
373
374 if ( remove ) {
375 bricks_add_mod( mx, my, HT_REMOVE, type, imp, paddle );
376 brick_remove( mx, my, type, imp, paddle );
377 }
378 else
379 if ( loose_dur ) {
380 bricks_add_mod( mx, my, HT_HIT, type, imp, paddle );
381 brick_loose_dur( mx, my, 1 );
382 }
383
384 return remove;
385 }
386 /*
387 ====================================================================
388 Make brick at mx,my loose 'points' duration. It must have been
389 previously checked that this operation is completely valid.
390 It does not update net_bricks or the player's duration reference.
391 ====================================================================
392 */
393 void brick_loose_dur( int mx, int my, int points )
394 {
395 while ( points-- > 0 ) {
396 cur_game->bricks[mx][my].dur--;
397 cur_game->bricks[mx][my].id--;
398 /* adjust brick character:
399 * a,b,c - multiple hits
400 * v - invisible */
401 if ( cur_game->bricks[mx][my].brick_c == 'v' )
402 cur_game->bricks[mx][my].brick_c = 'c';
403 else
404 cur_game->bricks[mx][my].brick_c--; /* successive order */
405 /* set regeneration time if it's a healing brick */
406 if ( cur_game->bricks[mx][my].type == MAP_BRICK_HEAL ) {
407 /* if this brick is already healing just reset the time
408 but don't add to the list again */
409 if ( cur_game->bricks[mx][my].heal_time != -1 )
410 cur_game->bricks[mx][my].heal_time = BRICK_HEAL_TIME;
411 else {
412 cur_game->bricks[mx][my].mx = mx;
413 cur_game->bricks[mx][my].my = my;
414 cur_game->bricks[mx][my].heal_time = BRICK_HEAL_TIME;
415 list_add( cur_game->heal_bricks, &cur_game->bricks[mx][my] );
416 }
417 }
418 }
419 }
420
421 /* add a modification to the list. if 'mod' is HT_HIT and the
422 * tile is empty it is an HT_REMOVE. 'type' is the type of
423 * the responsible source and 'src' its impact vector. */
424 void bricks_add_mod( int x, int y, int mod, int dest_type, Vector imp, Paddle *paddle )
425 {
426 BrickHit *hit;
427
428 if ( cur_game->mod.brick_hit_count > MAX_MODS ) return; /* drop hit */
429
430 hit = &cur_game->mod.brick_hits[cur_game->mod.brick_hit_count++];
431 memset(hit,0,sizeof(BrickHit)); /* clear hit */
432
433 if ( mod == HT_REMOVE ) {
434 if ( paddle->extra_active[EX_GOLDSHOWER] )
435 if ( cur_game->bricks[x][y].extra == EX_NONE )
436 hit->gold_shower = 1;
437 if (cur_game->bricks[x][y].type==MAP_BRICK_EXP)
438 hit->draw_explosion = 1;
439 if (dest_type==SHR_BY_DELAYED_EXPL)
440 {
441 dest_type = SHR_BY_EXPL; /* delayed explosion thus initiated by a close-by
442 explosion have no explosion animation */
443 }
444 else if (dest_type==SHR_BY_NORMAL_BALL && cur_game->extra_active[EX_EXPL_BALL])
445 {
446 dest_type = SHR_BY_EXPL;
447 hit->draw_explosion = 1;
448 }
449 }
450
451 hit->x = x; hit->y = y;
452 hit->type = mod;
453 hit->dest_type = dest_type;
454 hit->paddle = (cur_game->paddles[PADDLE_BOTTOM]==paddle)?PADDLE_BOTTOM:PADDLE_TOP;
455
456 hit->degrees = 0;
457 if ( mod == HT_REMOVE && dest_type == SHR_BY_NORMAL_BALL ) {
458 hit->degrees = vec2angle( &imp );
459 }
460 else
461 if ( dest_type == SHR_BY_SHOT ) {
462 if ( hit->paddle == PADDLE_BOTTOM )
463 hit->degrees = 270 / 2;
464 else
465 hit->degrees = 90 / 2;
466 }
467 }
468
469 /* update regeneration and explosion of bricks */
470 void bricks_update( int ms )
471 {
472 Brick *brick;
473
474 /* check if bricks were destroyed by explosion */
475 if ( cur_game->exp_bricks->count > 0 ) {
476 list_reset( cur_game->exp_bricks );
477 while ( ( brick = list_next( cur_game->exp_bricks ) ) != 0 ) {
478 if ( (brick->exp_time -= ms) <= 0 ) {
479 brick->exp_time = -1;
480 bricks_add_mod( brick->mx, brick->my,
481 HT_REMOVE, SHR_BY_DELAYED_EXPL,
482 vector_get( 0, 0 ), brick->exp_paddle );
483 brick_remove( brick->mx, brick->my, SHR_BY_EXPL,
484 vector_get( 0, 0 ), brick->exp_paddle );
485 balls_check_targets( brick->mx, brick->my );
486 list_delete_current( cur_game->exp_bricks );
487 }
488 }
489 }
490
491 /* check if bricks regenerate */
492 if ( cur_game->heal_bricks->count > 0 ) {
493 list_reset( cur_game->heal_bricks );
494 while ( ( brick = list_next( cur_game->heal_bricks ) ) != 0 ) {
495 /* skip brick if destroyed meanwhile */
496 if ( brick->type != MAP_BRICK_HEAL ) {
497 list_delete_current( cur_game->heal_bricks );
498 continue;
499 }
500 if ( (brick->heal_time -= ms) < 0 ) {
501 brick->dur++;
502 brick->id++;
503 bricks_add_mod( brick->mx, brick->my,
504 HT_HEAL, 0, vector_get( 0, 0 ), 0 );
505 if ( brick->dur < 3 ) {
506 /* initate next healing step */
507 brick->heal_time = BRICK_HEAL_TIME;
508 }
509 else {
510 brick->heal_time = -1;
511 list_delete_current( cur_game->heal_bricks );
512 }
513 }
514 }
515 }
516 }
517
518 /* return the character that represents the brick with this type id */
519 char brick_get_char( int type )
520 {
521 int i;
522 for ( i = 0; i < BRICK_COUNT; i++ )
523 if ( brick_conv_table[i].id == type )
524 return brick_conv_table[i].c;
525 return ' ';
526 }
527
528
0 /***************************************************************************
1 bricks.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __BRICKS_H
18 #define __BRICKS_H
19
20 /* extra conversion item */
21 typedef struct {
22 int type; /* extra of type */
23 char c; /* is assigned to this character */
24 } Extra_Conv;
25 /* brick conversion item */
26 typedef struct {
27 char c; /* is assigned to this character */
28 int type; /* extra of type */
29 int id; /* pic id */
30 int dur;
31 int score;
32 } Brick_Conv;
33
34 /*
35 ====================================================================
36 Init bricks from level data, set the warp limit (percent) and
37 add regenerating bricks. As this function is called when
38 initializing a level it does not use the 'cur_game' context.
39 'score_mod' is percentual and 100 means normal score.
40 ====================================================================
41 */
42 void bricks_init( Game *game, int game_type, Level *level, int score_mod, int rel_warp_limit );
43 /*
44 ====================================================================
45 Hit brick and remove if destroyed. 'metal' means the ball
46 destroys any brick with the first try.
47 type and imp are used for shrapnell creation.
48 'extra' contains the pushed extra if one was released.
49 'paddle' is the paddle that initiated hit either by shot or ball.
50 Return true on destruction
51 ====================================================================
52 */
53 int brick_hit( int mx, int my, int metal, int type, Vector imp, Paddle *paddle );
54 /*
55 ====================================================================
56 Make brick at mx,my loose 'points' duration. It must have been
57 previously checked that this operation is completely valid.
58 It does not update net_bricks or the player's duration reference.
59 ====================================================================
60 */
61 void brick_loose_dur( int mx, int my, int points );
62
63 /*
64 ====================================================================
65 Initiate a brick explosion.
66 ====================================================================
67 */
68 void brick_start_expl( int x, int y, Paddle *paddle );
69
70 /* add a modification to the list. if 'mod' is HT_HIT and the
71 * tile is empty it is an HT_REMOVE. 'type' is the type of
72 * the responsible source and 'src' its impact vector. */
73 void bricks_add_mod( int x, int y, int mod, int dest_type, Vector imp, Paddle *paddle );
74
75 /* update regeneration and explosion of bricks */
76 void bricks_update( int ms );
77
78 /* return the character that represents the brick with this type id */
79 char brick_get_char( int type );
80
81 #endif
82
0 /***************************************************************************
1 copyright : (C) 2003 by Michael Speck
2 email : kulkanie@gmx.net
3 ***************************************************************************/
4
5 /***************************************************************************
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 ***************************************************************************/
13
14 /***** INCLUDES ************************************************************/
15
16 #include "../client/lbreakout.h"
17 #include "mathfuncs.h"
18 #include "levels.h"
19 #include "extras.h"
20 #include "balls.h"
21 #include "shots.h"
22 #include "bricks.h"
23 #include "paddle.h"
24
25 /***** EXTERNAL VARIABLES **************************************************/
26
27 extern Game *cur_game;
28
29 /***** EXPORTS *************************************************************/
30
31 /***** FORWARDED DECLARATIONS **********************************************/
32
33 /***** LOCAL TYPE DEFINITIONS **********************************************/
34
35 /***** LOCAL VARIABLES *****************************************************/
36
37 /***** LOCAL FUNCTIONS *****************************************************/
38
39 /* debug */
40 void print_level( Level *level )
41 {
42 int i, j;
43
44 printf( "Title: %s\n", level->name );
45 printf( "Author: %s\n", level->author );
46 printf( "Bricks:\n" );
47 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
48 for ( i = 0; i < EDIT_WIDTH; i++ )
49 printf( "%c", level->bricks[i][j] );
50 printf( "\n" );
51 }
52 printf( "Extras:\n" );
53 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
54 for ( i = 0; i < EDIT_WIDTH; i++ )
55 printf( "%c", level->extras[i][j] );
56 printf( "\n" );
57 }
58 printf( "End\n" );
59 }
60
61 /***** PUBLIC FUNCTIONS ****************************************************/
62
63 /* pack paddle information
64 * 0-9 x position
65 * 10 left fire
66 * 11 right fire
67 * 12 return key pressed
68 *
69 * the invisible state is not send as the server has
70 * its own copy of it.
71 */
72 void comm_pack_paddle( Paddle *paddle, unsigned char *msg, int *pos )
73 {
74 int info = 0;
75
76 info = paddle->x;
77 if ( paddle->fire_left ) SETBIT( info, 10 );
78 if ( paddle->fire_right ) SETBIT( info, 11 );
79 if ( paddle->ball_return_key_pressed ) SETBIT( info, 12 );
80
81 msg[(*pos)++] = info & 0xff;
82 msg[(*pos)++] = (info>>8) & 0xff;
83 }
84
85 /* apply packed paddle */
86 void comm_unpack_paddle( Paddle *paddle, unsigned char *msg, int *pos )
87 {
88 int new_x;
89 int info = msg[(*pos)] + (msg[(*pos)+1]<<8); *pos += 2;
90
91 new_x = info & 1023;
92 if ( new_x != paddle->x )
93 if ( paddle->invis )
94 /* visible for some time when position has changed */
95 paddle->invis_delay = PADDLE_INVIS_DELAY;
96 paddle->x = new_x;
97 paddle->cur_x = paddle->x;
98
99 paddle->fire_left = paddle->fire_right = paddle->ball_return_key_pressed = 0;
100 if ( GETBIT(info,10) )
101 paddle->fire_left = 1;
102 if ( GETBIT(info,11) )
103 paddle->fire_right = 1;
104 if ( GETBIT(info,12) )
105 paddle->ball_return_key_pressed = 1;
106 }
107
108 /* pack moving/attached ball and sound information
109 * 0-3 ball ammo of paddle bottom
110 * 4-7 ball ammo of paddle top
111 * 0-7 speedlevel
112 * 0-4 moving ball count (max: 31)
113 * 5 brick reflect sound
114 * 6 attach sound
115 * 7 fire sound (weapon)
116 * 32 each:
117 * 0-7 lower x
118 * 8-15 lower y
119 * 16 9th bit of x
120 * 17 10th bit of x
121 * 18 9th bit of y
122 * 24-31 angle 0-180
123 * 0-4 attached ball count (max: 31)
124 * 5 paddle reflect sound !!! HACK !!!
125 * 16 each:
126 * 0-7 x + 20
127 * 8-14 y + 20
128 * 15 paddle (bottom or top)
129 */
130 void comm_pack_balls( unsigned char *msg, int *pos )
131 {
132 unsigned char *counter, count, level;
133 unsigned char byte;
134 Ball *ball;
135
136 /* ball ammo */
137 if ( cur_game->level_type == LT_NORMAL )
138 msg[(*pos)++] = 0;
139 else {
140 count = cur_game->paddles[PADDLE_BOTTOM]->ball_ammo & 15;
141 count = count | ((cur_game->paddles[PADDLE_TOP]->ball_ammo & 15)<<4);
142 msg[(*pos)++] = count;
143 }
144
145 /* speedlevel */
146 if ( cur_game->extra_active[EX_SLOW] )
147 level = 0;
148 else if ( cur_game->extra_active[EX_FAST] )
149 level = 100;
150 else level = cur_game->speedup_level;
151 msg[(*pos)++] = level;
152
153 /* moving balls */
154 counter = &msg[(*pos)++];
155 list_reset( cur_game->balls ); count = 0;
156 while ( (ball = list_next(cur_game->balls)) ) {
157 if ( ball->attached ) continue;
158 byte = ball->x & 255;
159 msg[(*pos)++] = byte;
160 byte = ball->y & 255;
161 msg[(*pos)++] = byte;
162 byte = 0;
163 if ( GETBIT( ball->x, 8 ) ) SETBIT( byte, 0 );
164 if ( GETBIT( ball->x, 9 ) ) SETBIT( byte, 1 );
165 if ( GETBIT( ball->y, 8 ) ) SETBIT( byte, 2 );
166 msg[(*pos)++] = byte;
167 byte = ball->angle;
168 if ( ball->moving_back ) byte = 255;
169 msg[(*pos)++] = byte;
170 count++;
171 }
172 byte = count;
173 if ( cur_game->mod.brick_reflected_ball_count > 0 ) SETBIT( byte, 5 );
174 if ( cur_game->mod.attached_ball_count > 0 ) SETBIT( byte, 6 );
175 if ( cur_game->mod.fired_shot_count > 0 ) SETBIT( byte, 7 );
176 *counter = byte;
177
178 /* attached balls */
179 counter = &msg[(*pos)++];
180 list_reset( cur_game->balls ); count = 0;
181 while ( (ball = list_next(cur_game->balls)) ) {
182 if ( !ball->attached ) continue;
183 byte = ball->x + 20;
184 msg[(*pos)++] = byte;
185 byte = ball->y + 20;
186 if ( ball->paddle->type == PADDLE_TOP ) SETBIT( byte, 7 );
187 msg[(*pos)++] = byte;
188 count++;
189 }
190 byte = count;
191 if ( cur_game->mod.paddle_reflected_ball_count > 0 ) SETBIT( byte, 5 );
192 *counter = byte;
193 }
194
195 /* apply ball information */
196 void comm_unpack_balls( unsigned char *msg, int *pos )
197 {
198 Ball *ball;
199 unsigned char byte;
200 int count, level, i;
201
202 list_clear( cur_game->balls );
203
204 /* ball ammo */
205 count = msg[(*pos)++];
206 cur_game->paddles[PADDLE_BOTTOM]->ball_ammo = count & 15;
207 cur_game->paddles[PADDLE_TOP]->ball_ammo = (count>>4) & 15;
208
209 /* ball speed */
210 level = msg[(*pos)++];
211 cur_game->ball_v = cur_game->diff->v_start + cur_game->diff->v_add * level;
212
213 /* moving balls and sounds */
214 count = msg[(*pos)++];
215 cur_game->mod.brick_reflected_ball_count =
216 cur_game->mod.paddle_reflected_ball_count =
217 cur_game->mod.attached_ball_count =
218 cur_game->mod.fired_shot_count = 0;
219 if ( GETBIT(count,5) )
220 cur_game->mod.brick_reflected_ball_count = 1;
221 if ( GETBIT(count,6) )
222 cur_game->mod.attached_ball_count = 1;
223 if ( GETBIT(count,7) )
224 cur_game->mod.fired_shot_count = 1;
225 count = count & 31;
226 for ( i = 0; i < count; i++ ) {
227 ball = salloc( 1, sizeof( Ball ) );
228 ball->x = msg[(*pos)++];
229 ball->y = msg[(*pos)++];
230 byte = msg[(*pos)++];
231 if ( GETBIT(byte,0) ) ball->x += 256;
232 if ( GETBIT(byte,1) ) ball->x += 512;
233 if ( GETBIT(byte,2) ) ball->y += 256;
234 ball->angle = msg[(*pos)++];
235 ball->vel.x = ball->vel.y = 0;
236 if ( ball->angle != 255 ) {
237 angle2vec( ball->angle, &ball->vel );
238 vector_set_length( &ball->vel, cur_game->ball_v );
239 }
240 ball->cur.x = ball->x;
241 ball->cur.y = ball->y;
242 list_add( cur_game->balls, ball );
243 }
244
245 /* attached balls */
246 count = msg[(*pos)++];
247 if ( GETBIT(count,5) )
248 cur_game->mod.paddle_reflected_ball_count = 1;
249 count = count & 31;
250 for ( i = 0; i < count; i++ ) {
251 ball = salloc( 1, sizeof( Ball ) );
252 ball->x = msg[(*pos)++] - 20;
253 byte = msg[(*pos)++];
254 ball->y = (byte&127) - 20;
255 ball->attached = 1;
256 if ( GETBIT(byte,7) )
257 ball->paddle = cur_game->paddles[1];
258 else
259 ball->paddle = cur_game->paddles[0];
260 list_add( cur_game->balls, ball );
261 }
262 }
263
264 /* pack shot information
265 * 0-7 shot count
266 * 24 each:
267 * 0-7 lower x
268 * 8-15 lower y
269 * 16 9th bit of x
270 * 17 10th bit of x
271 * 18 9th bit of y
272 *
273 * as shot_y can be negative 20 pixels are added to keep
274 * the transfer value a positive. shots below this height
275 * level are not transferred.
276 */
277 void comm_pack_shots( unsigned char *msg, int *pos )
278 {
279 unsigned char byte, *counter;
280 Shot *shot;
281 int shot_x, shot_y, count = 0;
282
283 counter = &msg[(*pos)++];
284 list_reset( cur_game->shots );
285 while ( (shot = list_next(cur_game->shots)) ) {
286 shot_x = shot->x;
287 shot_y = shot->y + 20;
288 if ( shot_y < 0 ) continue;
289 byte = shot_x & 255;
290 msg[(*pos)++] = byte;
291 byte = shot_y & 255;
292 msg[(*pos)++] = byte;
293 byte = 0;
294 if ( GETBIT( shot_x, 8 ) ) SETBIT( byte, 0 );
295 if ( GETBIT( shot_x, 9 ) ) SETBIT( byte, 1 );
296 if ( GETBIT( shot_y, 8 ) ) SETBIT( byte, 2 );
297 msg[(*pos)++] = byte;
298 count++;
299 }
300 *counter = count;
301 }
302
303 /* apply shots */
304 void comm_unpack_shots( unsigned char *msg, int *pos )
305 {
306 unsigned char byte;
307 Shot *shot;
308 int count, i;
309
310 list_clear( cur_game->shots );
311
312 count = msg[(*pos)++];
313 for ( i = 0; i < count; i++ ) {
314 shot = salloc( 1, sizeof( Shot ) );
315 shot->x = msg[(*pos)++];
316 shot->y = msg[(*pos)++];
317 byte = msg[(*pos)++];
318 if ( GETBIT(byte,0) ) shot->x += 256;
319 if ( GETBIT(byte,1) ) shot->x += 512;
320 if ( GETBIT(byte,2) ) shot->y += 256;
321 shot->y -= 20;
322 list_add( cur_game->shots, shot );
323 }
324 }
325
326 /* pack brick hit information
327 * 0-7 hit count (loose duration)
328 * 8 each:
329 * 0-7 id in edit window
330 * 0-7 heal count (one point)
331 * 8 each:
332 * 0-7 id in edit window
333 * 0-7 grow count (random client id)
334 * 0-7 id in edit window
335 * 0-7 remove count
336 * 16(+8) each:
337 * 0-7 id in edit window
338 * 8-9 destroy type (00 normal, 01 energy, 10 shot, 11 expl)
339 * 10 paddle (top or bottom)
340 * 11 goldshower (release 1000P)
341 * 12 draw explosion animation when killing brick
342 * 13-15 unused
343 * (16-23) clockwise impact position 0-180 for normal animation
344 */
345 void comm_pack_brick_hits( unsigned char *msg, int *pos )
346 {
347 unsigned char *counter, byte;
348 BrickHit *hit;
349 int i, y_off = ( MAP_HEIGHT - EDIT_HEIGHT ) / 2, count;
350
351 /* duration */
352 counter = &msg[(*pos)++]; count = 0;
353 for ( i = 0; i < cur_game->mod.brick_hit_count; i++ ) {
354 hit = &cur_game->mod.brick_hits[i];
355 if ( hit->type == HT_HIT ) {
356 msg[(*pos)++] = (hit->y-y_off) * EDIT_WIDTH + hit->x - 1;
357 count++;
358 }
359 }
360 *counter = count;
361
362 /* heal */
363 counter = &msg[(*pos)++]; count = 0;
364 for ( i = 0; i < cur_game->mod.brick_hit_count; i++ ) {
365 hit = &cur_game->mod.brick_hits[i];
366 if ( hit->type == HT_HEAL ) {
367 msg[(*pos)++] = (hit->y-y_off) * EDIT_WIDTH + hit->x - 1;
368 count++;
369 }
370 }
371 *counter = count;
372
373 /* growth */
374 counter = &msg[(*pos)++]; count = 0;
375 for ( i = 0; i < cur_game->mod.brick_hit_count; i++ ) {
376 hit = &cur_game->mod.brick_hits[i];
377 if ( hit->type == HT_GROW ) {
378 msg[(*pos)++] = (hit->y-y_off) * EDIT_WIDTH + hit->x - 1;
379 count++;
380 }
381 }
382 *counter = count;
383
384 /* remove */
385 counter = &msg[(*pos)++]; count = 0;
386 for ( i = 0; i < cur_game->mod.brick_hit_count; i++ ) {
387 hit = &cur_game->mod.brick_hits[i];
388 if ( hit->type != HT_REMOVE ) continue;
389 msg[(*pos)++] = (hit->y-y_off) * EDIT_WIDTH + hit->x - 1;
390 byte = 0;
391 if ( hit->dest_type == SHR_BY_ENERGY_BALL || hit->dest_type == SHR_BY_EXPL )
392 SETBIT( byte, 0 );
393 if ( hit->dest_type == SHR_BY_SHOT || hit->dest_type == SHR_BY_EXPL )
394 SETBIT( byte, 1 );
395 if ( hit->paddle ) SETBIT( byte, 2 );
396 if ( hit->gold_shower ) SETBIT( byte, 3 );
397 if ( hit->draw_explosion ) SETBIT( byte, 4 );
398 msg[(*pos)++] = byte;
399 if ( hit->dest_type == SHR_BY_NORMAL_BALL ) {
400 byte = hit->degrees;
401 msg[(*pos)++] = byte;
402 }
403 count++;
404 }
405 *counter = count;
406 }
407
408 /* build client brick hits */
409 void comm_unpack_brick_hits( unsigned char *msg, int *pos )
410 {
411 BrickHit *hit;
412 int hit_count = 0;
413 int count, i, j;
414 unsigned char byte;
415
416 /* duration, heal, growth */
417 for ( j = 0; j < 3; j++ ) {
418 count = msg[(*pos)++];
419 for ( i = 0; i < count; i++ ) {
420 hit = &cur_game->mod.brick_hits[hit_count++];
421 byte = msg[(*pos)++];
422 hit->x = byte % EDIT_WIDTH + 1;
423 hit->y = byte / EDIT_WIDTH + (MAP_HEIGHT-EDIT_HEIGHT)/2;
424 hit->type = (j==0)?HT_HIT:(j==1)?HT_HEAL:HT_GROW;
425 }
426 }
427
428 /* removal */
429 count = msg[(*pos)++];
430 for ( i = 0; i < count; i++ ) {
431 hit = &cur_game->mod.brick_hits[hit_count++];
432 hit->type = HT_REMOVE;
433 byte = msg[(*pos)++];
434 hit->x = byte % EDIT_WIDTH + 1;
435 hit->y = byte / EDIT_WIDTH + (MAP_HEIGHT-EDIT_HEIGHT)/2;
436 byte = msg[(*pos)++];
437 hit->dest_type = byte & 3;
438 hit->paddle = GETBIT(byte,2);
439 hit->gold_shower = GETBIT(byte,3);
440 hit->draw_explosion = GETBIT(byte,4);
441 if ( hit->dest_type == SHR_BY_NORMAL_BALL )
442 hit->degrees = msg[(*pos)++];
443 else
444 if ( hit->dest_type == SHR_BY_SHOT ) {
445 if ( hit->paddle == PADDLE_BOTTOM )
446 hit->degrees = 135;
447 else
448 hit->degrees = 45;
449 }
450 }
451
452 cur_game->mod.brick_hit_count = hit_count;
453 }
454
455 /* pack collected extra information
456 * 0-7 paddle bottom count
457 * 8 each:
458 * 0-7 extra id
459 * 0-7 paddle top count
460 * 8 each:
461 * 0-7 extra id
462 */
463 void comm_pack_collected_extras( unsigned char *msg, int *pos )
464 {
465 int i, j;
466
467 for ( i = 0; i < cur_game->paddle_count; i++ ) {
468 msg[(*pos)++] = cur_game->mod.collected_extra_count[i];
469 for ( j = 0; j < cur_game->mod.collected_extra_count[i]; j++ )
470 msg[(*pos)++] = (unsigned char)cur_game->mod.collected_extras[i][j];
471 }
472 }
473
474 /* build client collected extras */
475 void comm_unpack_collected_extras( unsigned char *msg, int *pos )
476 {
477 int i, j;
478
479 for ( i = 0; i < cur_game->paddle_count; i++ ) {
480 cur_game->mod.collected_extra_count[i] = msg[(*pos)++];
481 for ( j = 0; j < cur_game->mod.collected_extra_count[i]; j++ )
482 cur_game->mod.collected_extras[i][j] = msg[(*pos)++];
483 }
484 }
485
486 /* pack level data (in byte)
487 * 16 title
488 * 16 author
489 * 252 bricks
490 * 252 extras
491 */
492 void comm_pack_level( Level *level, unsigned char *msg, int *pos )
493 {
494 char *ptr = msg + *pos;
495
496 snprintf( ptr, 16, level->name ); ptr[15] = 0; ptr += 16;
497 snprintf( ptr, 16, level->author); ptr[15] = 0; ptr += 16;
498 memcpy( ptr, level->bricks, 252 ); ptr += 252;
499 memcpy( ptr, level->extras, 252 ); ptr += 252;
500
501 *pos += 16 + 16 + 252 + 252;
502 }
503
504 /* unpack leveldata */
505 void comm_unpack_level( Level *level, unsigned char *msg, int *pos )
506 {
507 char *ptr = msg + *pos;
508
509 snprintf( level->name, 16, ptr ); ptr += 16;
510 snprintf( level->author, 16, ptr ); ptr += 16;
511 memcpy( level->bricks, ptr, 252 ); ptr += 252;
512 memcpy( level->extras, ptr, 252 ); ptr += 252;
513
514 *pos += 16 + 16 + 252 + 252;
515 }
516
517 /* pack scores
518 * 0-23 paddle bottom
519 * 24-47 paddle top
520 */
521 void comm_pack_scores( unsigned char *msg, int *pos )
522 {
523 unsigned char *ptr = msg + *pos;
524 int i;
525
526 i = cur_game->paddles[0]->score;
527 ptr[0] = i & 0xff; ptr[1] = (i>>8) & 0xff; ptr[2] = (i>>16) & 0xff;
528 i = cur_game->paddles[1]->score;
529 ptr[3] = i & 0xff; ptr[4] = (i>>8) & 0xff; ptr[5] = (i>>16) & 0xff;
530
531 *pos += 6;
532 }
533
534 /* apply scores to paddles */
535 void comm_unpack_scores( unsigned char *msg, int *pos )
536 {
537 unsigned char *ptr = msg + *pos;
538
539 cur_game->paddles[0]->score = ptr[0] + (ptr[1]<<8) + (ptr[2]<<16);
540 cur_game->paddles[1]->score = ptr[3] + (ptr[4]<<8) + (ptr[5]<<16);
541
542 *pos += 6;
543 }
544
545 /* dummy unpack the various things thus simply adjust the 'pos'
546 * pointer but don't handle the message data */
547 void comm_unpack_paddle_dummy(unsigned char *msg, int *pos )
548 {
549 *pos += 2;
550 }
551 void comm_unpack_balls_dummy(unsigned char *msg, int *pos )
552 {
553 int count;
554
555 /* moving balls and sounds */
556 count = msg[(*pos)++]; *pos += (count&31) * 3;
557
558 /* attached balls */
559 count = msg[(*pos)++]; *pos += count * 2;
560 }
561 void comm_unpack_shots_dummy(unsigned char *msg, int *pos )
562 {
563 int count;
564
565 count = msg[(*pos)++]; *pos += count * 2;
566 }
567 void comm_unpack_scores_dummy(unsigned char *msg, int *pos )
568 {
569 *pos += 6;
570 }
571 void comm_unpack_brick_hits_dummy(unsigned char *msg, int *pos )
572 {
573 int count, i, j;
574 unsigned char byte;
575
576 /* duration, heal, growth */
577 for ( j = 0; j < 3; j++ ) {
578 count = msg[(*pos)++];
579 *pos += count;
580 }
581
582 /* removal */
583 count = msg[(*pos)++];
584 for ( i = 0; i < count; i++ ) {
585 *pos += 1;
586 byte = msg[(*pos)++];
587 if ( (byte&3) == SHR_BY_NORMAL_BALL )
588 *pos += 1;
589 }
590 }
591 void comm_unpack_collected_extras_dummy(unsigned char *msg, int *pos )
592 {
593 int i, count;
594
595 for ( i = 0; i < 2/* assume two paddles */; i++ ) {
596 count = msg[(*pos)++]; *pos += count;
597 }
598 }
599
0 /***************************************************************************
1 copyright : (C) 2003 by Michael Speck
2 email : kulkanie@gmx.net
3 ***************************************************************************/
4
5 /***************************************************************************
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 ***************************************************************************/
13
14 #ifndef __COMM_H
15 #define __COMM_H
16
17 /***** INCLUDES ************************************************************/
18
19 /***** TYPE DEFINITIONS ****************************************************/
20
21 /***** PUBLIC FUNCTIONS ****************************************************/
22
23 /* pack paddle information
24 * 0-9 x position
25 * 10 left fire
26 * 11 right fire
27 * 12 return key pressed
28 *
29 * the invisible state is not send as the server has
30 * its own copy of it.
31 */
32 void comm_pack_paddle( Paddle *paddle, unsigned char *msg, int *pos );
33
34 /* apply packed paddle */
35 void comm_unpack_paddle( Paddle *paddle, unsigned char *msg, int *pos );
36
37 /* pack moving/attached ball and sound information
38 * 0-4 moving ball count (max: 31)
39 * 5 reflect sound
40 * 6 attach sound
41 * 7 fire sound (weapon)
42 * 24 each:
43 * 0-7 lower x
44 * 8-15 lower y
45 * 16 9th bit of x
46 * 17 10th bit of x
47 * 18 9th bit of y
48 * 0-7 attached ball count (max: 31)
49 * 16 each:
50 * 0-7 x + 20
51 * 8-14 y + 20
52 * 15 paddle (bottom or top)
53 */
54 void comm_pack_balls( unsigned char *msg, int *pos );
55
56 /* apply ball information */
57 void comm_unpack_balls( unsigned char *msg, int *pos );
58
59 /* pack shot information
60 * 0-7 shot count
61 * 24 each:
62 * 0-7 lower x
63 * 8-15 lower y
64 * 16 9th bit of x
65 * 17 10th bit of x
66 * 18 9th bit of y
67 */
68 void comm_pack_shots( unsigned char *msg, int *pos );
69
70 /* apply shots */
71 void comm_unpack_shots( unsigned char *msg, int *pos );
72
73 /* pack brick hit information
74 * 0-7 hit count (loose duration)
75 * 8 each:
76 * 0-7 id in edit window
77 * 0-7 heal count (one point)
78 * 8 each:
79 * 0-7 id in edit window
80 * 0-7 grow count (random client id)
81 * 0-7 id in edit window
82 * 0-7 remove count
83 * 16(+8) each:
84 * 0-7 id in edit window
85 * 8-9 destroy type (00 normal, 01 energy, 10 shot, 11 expl)
86 * 10 paddle (top or bottom)
87 * 11 goldshower (release 1000P)
88 * 12-15 unused
89 * (16-23) clockwise impact position 0-180 for normal animation
90 */
91 void comm_pack_brick_hits( unsigned char *msg, int *pos );
92
93 /* build client brick hits */
94 void comm_unpack_brick_hits( unsigned char *msg, int *pos );
95
96 /* pack collected extra information
97 * 0-7 paddle bottom count
98 * 8 each:
99 * 0-7 extra id
100 * 0-7 paddle top count
101 * 8 each:
102 * 0-7 extra id
103 */
104 void comm_pack_collected_extras( unsigned char *msg, int *pos );
105
106 /* build client collected extras */
107 void comm_unpack_collected_extras( unsigned char *msg, int *pos );
108
109 /* pack level data (in byte)
110 * 16 title
111 * 16 author
112 * 252 bricks
113 * 252 extras
114 */
115 void comm_pack_level( Level *level, unsigned char *msg, int *pos );
116
117 /* unpack leveldata */
118 void comm_unpack_level( Level *level, unsigned char *msg, int *pos );
119
120 /* pack scores
121 * 0-23 paddle bottom
122 * 24-47 paddle top
123 */
124 void comm_pack_scores( unsigned char *msg, int *pos );
125
126 /* apply scores to paddles */
127 void comm_unpack_scores( unsigned char *msg, int *pos );
128
129 /* dummy unpack the various things thus simply adjust the 'pos'
130 * pointer but don't handle the message data */
131 void comm_unpack_paddle_dummy(unsigned char *msg, int *pos );
132 void comm_unpack_balls_dummy(unsigned char *msg, int *pos );
133 void comm_unpack_shots_dummy(unsigned char *msg, int *pos );
134 void comm_unpack_scores_dummy(unsigned char *msg, int *pos );
135 void comm_unpack_brick_hits_dummy(unsigned char *msg, int *pos );
136 void comm_unpack_collected_extras_dummy(unsigned char *msg, int *pos );
137
138 #endif
139
0 /***************************************************************************
1 extras.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "levels.h"
19 #include "paddle.h"
20 #include "bricks.h"
21 #include "balls.h"
22 #include "mathfuncs.h"
23 #include "extras.h"
24
25 extern int ball_w, ball_dia;
26 extern Game *cur_game;
27
28 /*
29 ====================================================================
30 Locals
31 ====================================================================
32 */
33
34 /*
35 ====================================================================
36 Public
37 ====================================================================
38 */
39
40 /*
41 ====================================================================
42 Create new extra at position
43 ====================================================================
44 */
45 Extra *extra_create( int type, int x, int y, int dir )
46 {
47 Extra *e = salloc( 1, sizeof( Extra ) );
48 e->type = type;
49 e->offset = type * BRICK_WIDTH;
50 e->x = x; e->y = y;
51 e->dir = dir;
52 e->alpha = 0;
53 return e;
54 }
55
56 /*
57 ====================================================================
58 Use extra when paddle collected it
59 ====================================================================
60 */
61 void extra_use( Paddle *paddle, int extra_type )
62 {
63 Ball *b;
64 int i, j;
65
66 if ( cur_game->diff->allow_maluses ) {
67 while( extra_type == EX_RANDOM )
68 extra_type = rand() % (EX_NUMBER);
69 } else {
70 while ( extra_type == EX_RANDOM || extra_is_malus( extra_type ) )
71 extra_type = rand() % (EX_NUMBER);
72 }
73
74 /* store modification */
75 i = cur_game->paddles[0]==paddle?0:1;
76 if ( cur_game->mod.collected_extra_count[i] < MAX_MODS )
77 cur_game->mod.collected_extras[i][cur_game->mod.collected_extra_count[i]++] =
78 extra_type;
79 /* statistics */
80 paddle->extras_collected++;
81
82 switch (extra_type) {
83 case EX_SCORE200:
84 paddle->score += cur_game->diff->score_mod * 200 / 10;
85 break;
86 case EX_SCORE500:
87 paddle->score += cur_game->diff->score_mod * 500 / 10;
88 break;
89 case EX_SCORE1000:
90 paddle->score += cur_game->diff->score_mod * 1000 / 10;
91 break;
92 case EX_SCORE2000:
93 paddle->score += cur_game->diff->score_mod * 2000 / 10;
94 break;
95 case EX_SCORE5000:
96 paddle->score += cur_game->diff->score_mod * 5000 / 10;
97 break;
98 case EX_SCORE10000:
99 paddle->score += cur_game->diff->score_mod * 10000 / 10;
100 break;
101 case EX_GOLDSHOWER:
102 paddle->extra_time[EX_GOLDSHOWER] += TIME_GOLDSHOWER;
103 paddle->extra_active[EX_GOLDSHOWER] = 1;
104 break;
105 case EX_LIFE:
106 /* adding life is handled by client */
107 break;
108 case EX_SHORTEN:
109 paddle_init_resize( paddle, -1);
110 break;
111 case EX_LENGTHEN:
112 paddle_init_resize( paddle, 1);
113 break;
114 case EX_BALL:
115 b = ball_create(
116 paddle->x + (paddle->w - ball_w) / 2,
117 paddle->y + ((paddle->type == PADDLE_TOP)?paddle->h:-ball_dia) );
118 b->paddle = paddle;
119 ball_set_random_angle( b, cur_game->ball_v );
120 b->get_target = 1;
121 list_add( cur_game->balls, b );
122 break;
123 case EX_WALL:
124 paddle->extra_time[EX_WALL] += TIME_WALL;
125 if ( paddle->extra_active[EX_WALL] ) break;
126 paddle->extra_active[extra_type] = 1;
127 if ( paddle->wall_y == 0 ) {
128 for (i = 1; i < MAP_WIDTH - 1; i++) {
129 cur_game->bricks[i][0].type = MAP_WALL;
130 cur_game->bricks[i][0].id = 0;
131 }
132 }
133 else
134 for (i = 1; i < MAP_WIDTH - 1; i++) {
135 cur_game->bricks[i][MAP_HEIGHT - 1].type = MAP_WALL;
136 cur_game->bricks[i][MAP_HEIGHT - 1].id = 0;
137 }
138 paddle->wall_alpha = 0;
139 balls_check_targets( -1, 0 );
140 break;
141 case EX_METAL:
142 cur_game->extra_time[EX_METAL] += TIME_METAL;
143 cur_game->extra_active[extra_type] = 1;
144 balls_set_type( BALL_METAL );
145 /* other ball extras are disabled */
146 if ( cur_game->extra_active[EX_EXPL_BALL] ) {
147 cur_game->extra_active[EX_EXPL_BALL] = 0;
148 cur_game->extra_time[EX_EXPL_BALL] = 0;
149 }
150 if ( cur_game->extra_active[EX_WEAK_BALL] ) {
151 cur_game->extra_active[EX_WEAK_BALL] = 0;
152 cur_game->extra_time[EX_WEAK_BALL] = 0;
153 }
154 break;
155 case EX_FROZEN:
156 paddle->extra_time[EX_FROZEN] = TIME_FROZEN;
157 paddle->extra_active[extra_type] = 1;
158 paddle_freeze( paddle, 1 );
159 break;
160 case EX_WEAPON:
161 paddle->extra_time[EX_WEAPON] += TIME_WEAPON;
162 paddle->extra_active[extra_type] = 1;
163 weapon_install( paddle, 1 );
164 break;
165 case EX_SLIME:
166 paddle->extra_time[EX_SLIME] += TIME_SLIME;
167 paddle->extra_active[extra_type] = 1;
168 paddle_set_slime( paddle, 1 );
169 break;
170 case EX_FAST:
171 if ( cur_game->extra_active[EX_SLOW] ) {
172 cur_game->extra_time[EX_SLOW] = 0;
173 cur_game->extra_active[EX_SLOW] = 0;
174 }
175 cur_game->extra_time[EX_FAST] += TIME_FAST;
176 cur_game->extra_active[extra_type] = 1;
177 cur_game->ball_v = cur_game->ball_v_max;
178 balls_set_velocity( cur_game->balls, cur_game->ball_v );
179 break;
180 case EX_SLOW:
181 if ( cur_game->extra_active[EX_FAST] ) {
182 cur_game->extra_time[EX_FAST] = 0;
183 cur_game->extra_active[EX_FAST] = 0;
184 }
185 cur_game->extra_time[EX_SLOW] += TIME_SLOW;
186 cur_game->extra_active[extra_type] = 1;
187 cur_game->ball_v = cur_game->ball_v_min;
188 balls_set_velocity( cur_game->balls, cur_game->ball_v );
189 break;
190 case EX_CHAOS:
191 cur_game->extra_time[EX_CHAOS] += TIME_CHAOS;
192 cur_game->extra_active[extra_type] = 1;
193 balls_set_chaos( 1 );
194 break;
195 case EX_DARKNESS:
196 cur_game->extra_time[EX_DARKNESS] += TIME_DARKNESS;
197 cur_game->extra_active[extra_type] = 1;
198 break;
199 case EX_GHOST_PADDLE:
200 paddle->extra_time[EX_GHOST_PADDLE] += TIME_GHOST_PADDLE;
201 paddle->extra_active[extra_type] = 1;
202 paddle_set_invis( paddle, 1 );
203 break;
204 case EX_TIME_ADD:
205 for ( i = 0; i < EX_NUMBER; i++ )
206 if ( cur_game->extra_time[i] )
207 cur_game->extra_time[i] += 7000;
208 for ( i = 0; i < EX_NUMBER; i++ ) {
209 for ( j = 0; j < cur_game->paddle_count; j++ )
210 if ( cur_game->paddles[j]->extra_time[i] )
211 cur_game->paddles[j]->extra_time[i] += 7000;
212 }
213 break;
214 case EX_EXPL_BALL:
215 balls_set_type( BALL_EXPL );
216 cur_game->extra_time[EX_EXPL_BALL] += TIME_EXPL_BALL;
217 cur_game->extra_active[extra_type] = 1;
218 /* other ball extras are disabled */
219 if ( cur_game->extra_active[EX_METAL] ) {
220 cur_game->extra_active[EX_METAL] = 0;
221 cur_game->extra_time[EX_METAL] = 0;
222 }
223 if ( cur_game->extra_active[EX_WEAK_BALL] ) {
224 cur_game->extra_active[EX_WEAK_BALL] = 0;
225 cur_game->extra_time[EX_WEAK_BALL] = 0;
226 }
227 break;
228 case EX_WEAK_BALL:
229 balls_set_type( BALL_WEAK );
230 cur_game->extra_time[EX_WEAK_BALL] += TIME_WEAK_BALL;
231 cur_game->extra_active[extra_type] = 1;
232 /* other ball extras are disabled */
233 if ( cur_game->extra_active[EX_METAL] ) {
234 cur_game->extra_active[EX_METAL] = 0;
235 cur_game->extra_time[EX_METAL] = 0;
236 }
237 if ( cur_game->extra_active[EX_EXPL_BALL] ) {
238 cur_game->extra_active[EX_EXPL_BALL] = 0;
239 cur_game->extra_time[EX_EXPL_BALL] = 0;
240 }
241 break;
242 case EX_BONUS_MAGNET:
243 paddle_set_attract( paddle, ATTRACT_BONUS );
244 paddle->extra_time[EX_BONUS_MAGNET] += TIME_BONUS_MAGNET;
245 paddle->extra_active[extra_type] = 1;
246 if ( paddle->extra_active[EX_MALUS_MAGNET] ) {
247 paddle->extra_active[EX_MALUS_MAGNET] = 0;
248 paddle->extra_time[EX_MALUS_MAGNET] = 0;
249 }
250 break;
251 case EX_MALUS_MAGNET:
252 paddle_set_attract( paddle, ATTRACT_MALUS );
253 paddle->extra_time[EX_MALUS_MAGNET] += TIME_MALUS_MAGNET;
254 paddle->extra_active[extra_type] = 1;
255 if ( paddle->extra_active[EX_BONUS_MAGNET] ) {
256 paddle->extra_active[EX_BONUS_MAGNET] = 0;
257 paddle->extra_time[EX_BONUS_MAGNET] = 0;
258 }
259 break;
260 case EX_DISABLE:
261 /* set all active extra times to 1 so they will expire next
262 prog cycle */
263 for ( i = 0; i < EX_NUMBER; i++ )
264 if ( cur_game->extra_time[i] )
265 cur_game->extra_time[i] = 1;
266 for ( i = 0; i < EX_NUMBER; i++ ) {
267 for ( j = 0; j < cur_game->paddle_count; j++ )
268 if ( cur_game->paddles[j]->extra_time[i] )
269 cur_game->paddles[j]->extra_time[i] = 1;
270 }
271 break;
272 default:
273 /* it wasn't used so delete mod */
274 i = cur_game->paddles[0]==paddle?0:1;
275 cur_game->mod.collected_extra_count[i]--;
276 break;
277
278 }
279 }
280 /*
281 ====================================================================
282 Update extras
283 ====================================================================
284 */
285 void extras_update( int ms )
286 {
287 Extra *ex;
288 int i, j;
289 int magnets;
290 Paddle *magnet;
291
292 /* check extra_time of limited extras */
293
294 /* general extras */
295 for ( i = 0; i < EX_NUMBER; i++ )
296 if ( cur_game->extra_time[i] )
297 if ( (cur_game->extra_time[i] -= ms) <= 0 ) {
298 cur_game->extra_time[i] = 0;
299 /* expired */
300 switch ( i ) {
301 case EX_EXPL_BALL:
302 case EX_WEAK_BALL:
303 case EX_METAL:
304 balls_set_type( BALL_NORMAL );
305 break;
306 case EX_SLOW:
307 case EX_FAST:
308 cur_game->ball_v = cur_game->diff->v_start +
309 cur_game->diff->v_add * cur_game->speedup_level;
310 balls_set_velocity( cur_game->balls, cur_game->ball_v );
311 break;
312 case EX_CHAOS:
313 balls_set_chaos( 0 );
314 break;
315 }
316 /* set deactivated */
317 cur_game->extra_active[i] = 0;
318 }
319
320 /* paddlized extras */
321 for ( j = 0; j < cur_game->paddle_count; j++ )
322 for ( i = 0; i < EX_NUMBER; i++ )
323 /* extra_time of wall is updated in wall_update() */
324 if ( cur_game->paddles[j]->extra_time[i] && i != EX_WALL )
325 if ( (cur_game->paddles[j]->extra_time[i] -= ms) <= 0 ) {
326 cur_game->paddles[j]->extra_time[i] = 0;
327 /* expired */
328 switch ( i ) {
329 case EX_SLIME:
330 paddle_set_slime( cur_game->paddles[j], 0 );
331 /* release all balls from paddle */
332 balls_detach_from_paddle( cur_game->paddles[j],
333 ((rand()%2==1)?-1:1) );
334 break;
335 case EX_WEAPON: weapon_install( cur_game->paddles[j], 0 ); break;
336 case EX_FROZEN:
337 paddle_freeze( cur_game->paddles[j], 0 );
338 break;
339 case EX_GHOST_PADDLE:
340 paddle_set_invis( cur_game->paddles[j], 0 );
341 break;
342 case EX_BONUS_MAGNET:
343 case EX_MALUS_MAGNET:
344 paddle_set_attract( cur_game->paddles[j], ATTRACT_NONE );
345 break;
346 }
347 /* set deactivated */
348 cur_game->paddles[j]->extra_active[i] = 0; /* wall is handled in wall_...() */
349 }
350
351 /* move extras and check if paddle was hit */
352 list_reset( cur_game->extras );
353 while ( ( ex = list_next( cur_game->extras ) ) ) {
354 /* if only one paddle has a magnet active all extras will
355 * be attracted by this paddle else the extras 'dir' is used
356 */
357 magnets = 0; magnet = 0;
358 for ( i = 0; i < cur_game->paddle_count; i++ )
359 if ( paddle_check_attract( cur_game->paddles[i], ex->type ) ) {
360 magnets++;
361 magnet = cur_game->paddles[i]; /* last magnet */
362 }
363 if ( magnets != 1 ) {
364 /* either no or more than one magnet so use default */
365 if ( ex->dir > 0 )
366 ex->y += 0.05 * ms;
367 else
368 ex->y -= 0.05 * ms;
369 }
370 else {
371 /* 'magnet' is the paddle that will attract this extra */
372 if ( magnet->type == PADDLE_TOP )
373 ex->y -= 0.05 * ms;
374 else
375 ex->y += 0.05 * ms;
376 if ( ex->x + ( BRICK_WIDTH >> 1 ) < magnet->x + ( magnet->w >> 1 ) ) {
377 ex->x += 0.05 * ms;
378 if ( ex->x + ( BRICK_WIDTH >> 1 ) > magnet->x + ( magnet->w >> 1 ) )
379 ex->x = magnet->x + ( magnet->w >> 1 ) - ( BRICK_WIDTH >> 1 );
380 }
381 else {
382 ex->x -= 0.05 * ms;
383 if ( ex->x + ( BRICK_WIDTH >> 1 ) < magnet->x + ( magnet->w >> 1 ) )
384 ex->x = magnet->x + ( magnet->w >> 1 ) - ( BRICK_WIDTH >> 1 );
385 }
386 }
387 /* if out of screen, kill this extra */
388 if ( ex->y >= 480 || ex->y + BRICK_HEIGHT < 0 ) {
389 list_delete_current( cur_game->extras );
390 continue;
391 }
392 for ( j = 0; j < cur_game->paddle_count; j++ ) {
393 /* contact with paddle core ? */
394 if ( paddle_solid( cur_game->paddles[j] ) )
395 if ( ex->x + BRICK_WIDTH > cur_game->paddles[j]->x )
396 if ( ex->x < cur_game->paddles[j]->x + cur_game->paddles[j]->w - 1 )
397 if ( ex->y + BRICK_HEIGHT > cur_game->paddles[j]->y )
398 if ( ex->y < cur_game->paddles[j]->y + cur_game->paddles[j]->h ) {
399 /* any extra except EX_JOKER is simply used */
400 if ( ex->type != EX_JOKER ) {
401 extra_use( cur_game->paddles[j], ex->type );
402 list_delete_current( cur_game->extras );
403 break;
404 }
405 /* use EX_JOKER and work through all active extras */
406 /* the mod is only stored to play the sound */
407 if ( cur_game->mod.collected_extra_count[j] < MAX_MODS )
408 cur_game->mod.collected_extras[j][cur_game->mod.collected_extra_count[j]++] = EX_JOKER;
409 list_reset( cur_game->extras );
410 while ( ( ex = list_next( cur_game->extras ) ) ) {
411 if ( ex->type != EX_JOKER )
412 if ( ex->type != EX_SHORTEN )
413 if ( ex->type != EX_FROZEN )
414 if ( ex->type != EX_FAST )
415 if ( ex->type != EX_RANDOM )
416 if ( ex->type != EX_DARKNESS )
417 if ( ex->type != EX_GHOST_PADDLE )
418 if ( ex->type != EX_CHAOS )
419 if ( ex->type != EX_DISABLE )
420 if ( ex->type != EX_MALUS_MAGNET )
421 if ( ex->type != EX_WEAK_BALL ) {
422 extra_use( cur_game->paddles[j], ex->type );
423 extra_use( cur_game->paddles[j], ex->type );
424 }
425 list_delete_current( cur_game->extras );
426 }
427 break;
428 }
429 }
430 }
431 }
432
433 /* wall */
434 void walls_update( int ms )
435 {
436 int i, j;
437
438 for ( j = 0; j < cur_game->paddle_count; j++ )
439 if ( cur_game->paddles[j]->extra_active[EX_WALL] ) {
440 if ( cur_game->paddles[j]->extra_time[EX_WALL] > 0 ) {
441 if ( (cur_game->paddles[j]->extra_time[EX_WALL] -= ms) < 0 )
442 cur_game->paddles[j]->extra_time[EX_WALL] = 0;
443 /* still appearing? */
444 if (cur_game->paddles[j]->wall_alpha < 255)
445 if ( (cur_game->paddles[j]->wall_alpha += 0.25 * ms) > 255 )
446 cur_game->paddles[j]->wall_alpha = 255;
447 }
448 else
449 if ( (cur_game->paddles[j]->wall_alpha -= 0.25 * ms) < 0 ) {
450 cur_game->paddles[j]->wall_alpha = 0;
451 cur_game->paddles[j]->extra_active[EX_WALL] = 0;
452 if ( cur_game->paddles[j]->wall_y == 0 )
453 for (i = 1; i < MAP_WIDTH - 1; i++)
454 cur_game->bricks[i][0].type = MAP_EMPTY;
455 else
456 for (i = 1; i < MAP_WIDTH - 1; i++)
457 cur_game->bricks[i][MAP_HEIGHT - 1].type = MAP_EMPTY;
458 balls_check_targets( -1, 0 );
459 }
460 }
461 }
462
463 int extra_is_malus( int type )
464 {
465 if ( type == EX_SHORTEN ) return 1;
466 if ( type == EX_FROZEN ) return 1;
467 if ( type == EX_FAST ) return 1;
468 if ( type == EX_DARKNESS ) return 1;
469 if ( type == EX_GHOST_PADDLE ) return 1;
470 if ( type == EX_CHAOS ) return 1;
471 if ( type == EX_DISABLE ) return 1;
472 if ( type == EX_MALUS_MAGNET ) return 1;
473 if ( type == EX_WEAK_BALL ) return 1;
474 return 0;
475 }
476
0 /***************************************************************************
1 extras.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __EXTRAS_H
18 #define __EXTRAS_H
19
20 /*
21 ====================================================================
22 Create new extra at position
23 ====================================================================
24 */
25 Extra *extra_create( int type, int x, int y, int dir );
26 /*
27 ====================================================================
28 Use extra when paddle collected it
29 ====================================================================
30 */
31 void extra_use( Paddle *paddle, int type );
32 /*
33 ====================================================================
34 Update extras
35 ====================================================================
36 */
37 void extras_update( int ms );
38 /*
39 ====================================================================
40 Wall
41 ====================================================================
42 */
43 void walls_update( int ms );
44
45
46 int extra_is_malus( int type );
47
48 #endif
49
0 /***************************************************************************
1 game.c - description
2 -------------------
3 begin : 03/03/19
4 copyright : (C) 2003 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /***** INCLUDES ************************************************************/
18
19 #include "../client/lbreakout.h"
20 #include "game.h"
21 #include "bricks.h"
22 #include "paddle.h"
23 #include "balls.h"
24 #include "shots.h"
25 #include "extras.h"
26
27 /***** EXTERNAL VARIABLES **************************************************/
28
29 extern int ball_w, ball_dia;
30
31 /***** EXPORTS *************************************************************/
32
33 Game *cur_game = 0;
34
35 /***** FORWARDED DECLARATIONS **********************************************/
36
37 /***** LOCAL TYPE DEFINITIONS **********************************************/
38
39 /***** LOCAL VARIABLES *****************************************************/
40
41 static GameDiff diffs[DIFF_COUNT] = {
42 { 9, 12, 8, 12, 20, 5, 0.10, 0.0016, 0.20, 32000, 0 },
43 { 6, 9, 0, 2, 8, 8, 0.24, 0.0016, 0.40, 1800, 1 },
44 { 5, 7, 0, 1, 6, 10, 0.27, 0.0016, 0.43, 1800, 1 },
45 { 4, 5, 0, 1, 4, 13, 0.30, 0.0015, 0.45, 1800, 1 }
46 };
47
48 /* in network game the ball is slower and the paddle is bigger */
49 static GameDiff net_diffs[DIFF_COUNT] = {
50 { 6, 9, 1, 2, 8, 8, 0.18, 0.0012, 0.30, 1800, 1 },
51 { 5, 7, 1, 2, 6, 10, 0.21, 0.0012, 0.33, 1800, 1 },
52 { 4, 5, 1, 2, 4, 13, 0.24, 0.0011, 0.35, 1800, 1 }
53 };
54
55 /***** LOCAL FUNCTIONS *****************************************************/
56
57 /***** PUBLIC FUNCTIONS ****************************************************/
58
59 /* create/delete game context */
60 Game *game_create( int game_type, int diff, int rel_warp_limit )
61 {
62 Game *game = salloc( 1, sizeof( Game ) );
63
64 /* set diff and game type */
65 game->game_type = game_type;
66 if ( game_type == GT_LOCAL )
67 game->diff = &diffs[diff];
68 else
69 game->diff = &net_diffs[diff];
70 game->rel_warp_limit = rel_warp_limit;
71
72 /* create lists */
73 game->shots = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
74 game->exp_bricks = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
75 game->heal_bricks = list_create( LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
76 game->extras = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
77 game->balls = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
78
79 /* set ball speed */
80 game->ball_v_min = game->diff->v_start;
81 game->ball_v_max = game->diff->v_max;
82 delay_set( &game->speedup_delay, game->diff->v_delay );
83
84 /* create paddles */
85 game->paddle_count = (game_type==GT_NETWORK)?2:1;
86 /* bottom */
87 game->paddles[PADDLE_BOTTOM] = paddle_create( 0, PADDLE_BOTTOM,
88 (MAP_HEIGHT-2)*BRICK_HEIGHT,
89 game->diff->paddle_size,
90 game->diff->paddle_min_size, game->diff->paddle_max_size,
91 0 );
92 /* top */
93 if ( game_type == GT_NETWORK )
94 game->paddles[PADDLE_TOP] = paddle_create( 0, PADDLE_TOP,
95 BRICK_HEIGHT+2,
96 game->diff->paddle_size,
97 game->diff->paddle_min_size, game->diff->paddle_max_size,
98 0 );
99
100 return game;
101 }
102 void game_delete( Game **_game )
103 {
104 Game *game = *_game;
105 int i;
106
107 if ( game == 0 ) return;
108
109 /* delete paddles */
110 for ( i = 0; i < game->paddle_count; i++ )
111 paddle_delete( game->paddles[i] );
112
113 /* delete lists */
114 if ( game->shots ) list_delete( game->shots );
115 if ( game->exp_bricks ) list_delete( game->exp_bricks );
116 if ( game->heal_bricks ) list_delete( game->heal_bricks );
117 if ( game->extras ) list_delete( game->extras );
118 if ( game->balls ) list_delete( game->balls );
119
120 free( game );
121 *_game = 0;
122 }
123
124 /* finalize single game level. the level_type is determined by
125 * counting the bricks. the data of 'level' is copied and modified
126 * while playing. */
127 void game_init( Game *game, Level *level )
128 {
129 int i;
130 Ball *ball;
131
132 game->level_over = 0;
133
134 /* initiate level data */
135 snprintf( game->title, 32, level->name );
136 snprintf( game->author, 32, level->author );
137 bricks_init( game, game->game_type, level, game->diff->score_mod, game->rel_warp_limit );
138 if ( game->game_type == GT_LOCAL || game->brick_count > 0 )
139 game->level_type = LT_NORMAL;
140 else
141 game->level_type = LT_PINGPONG;
142 memset( game->extra_active, 0, sizeof( game->extra_active ) );
143 memset( game->extra_time, 0, sizeof( game->extra_time ) );
144
145 /* set ball speed */
146 game->ball_v = game->ball_v_min;
147 game->speedup_level = 0;
148
149 /* clear maxballspeed_request */
150 if ( game->game_type == GT_LOCAL )
151 {
152 cur_game->paddles[0]->maxballspeed_request = 0;
153 cur_game->paddles[0]->maxballspeed_request_old = 0;
154 }
155
156 /* attach one ball to each paddle */
157 list_clear( game->balls );
158 for ( i = 0; i < game->paddle_count; i++ ) {
159 if ( game->paddles[i]->type == PADDLE_BOTTOM )
160 ball = ball_create((game->paddles[i]->w - ball_w) / 2, -ball_dia );
161 else
162 ball = ball_create((game->paddles[i]->w - ball_w) / 2, game->paddles[i]->h );
163 ball->attached = 1;
164 ball->paddle = game->paddles[i];
165 ball->paddle->attached_ball_count = 1;
166 ball_set_random_angle( ball, game->ball_v );
167 list_add( game->balls, ball );
168 }
169 }
170
171 /* reset level/in_game data */
172 void game_finalize( Game *game )
173 {
174 int i;
175
176 /* reset lists */
177 list_clear( game->balls );
178 list_clear( game->extras );
179 list_clear( game->shots );
180 list_clear( game->heal_bricks );
181 list_clear( game->exp_bricks );
182
183 /* reset paddles (and their statistics which are only for
184 * the currently played level) */
185 for ( i = 0; i < game->paddle_count; i++ )
186 paddle_reset( game->paddles[i] );
187
188 /* reset updates */
189 game_reset_mods();
190 }
191
192 /* set the game context the subfunctions will apply their changes to */
193 void game_set_current( Game *game )
194 {
195 cur_game = game;
196 }
197
198 /* set score of paddle 'id'. 0 is bottom paddle and 1 is top paddle */
199 void game_set_score( int id, int score )
200 {
201 if ( id < 0 || id >= cur_game->paddle_count ) return;
202 cur_game->paddles[id]->score = score;
203 }
204
205 /* set number of additional balls a paddle can fire (all paddles) */
206 void game_set_ball_ammo( int ammo )
207 {
208 int i;
209 for ( i = 0; i < cur_game->paddle_count; i++ ) {
210 cur_game->paddles[i]->ball_ammo = ammo;
211 cur_game->paddles[i]->start_ball_ammo = ammo;
212 }
213 }
214
215 /* set the number of points required to win a PINGPONG level */
216 void game_set_frag_limit( int limit )
217 {
218 cur_game->frag_limit = limit;
219 }
220
221 /* set wether to use convex paddle */
222 void game_set_convex_paddle( int convex )
223 {
224 cur_game->paddle_is_convex = convex;
225 }
226
227 /* set wether balls are returned to a paddle by pressing fire.
228 * the alternative is that they automatically return. */
229 void game_set_ball_auto_return( int auto_return )
230 {
231 cur_game->balls_return_by_click = !auto_return;
232 }
233
234 /* set wether balls are fired at random angle or wether the
235 * left/right fire keys are used */
236 void game_set_ball_random_angle( int random )
237 {
238 cur_game->balls_use_random_angle = random;
239 }
240
241 /* set the speed of balls will have in accelerated state */
242 void game_set_ball_accelerated_speed( float speed )
243 {
244 cur_game->accelerated_ball_speed = speed;
245 }
246
247 /* update state of a paddle. x or y may be 0 which is not a valid value.
248 * in this case the property is left unchanged */
249 void game_set_paddle_state( int id, int x, int y, int left_fire, int right_fire, int return_key )
250 {
251 Paddle *paddle = 0;
252
253 if ( id < 0 || id >= cur_game->paddle_count ) return;
254
255 paddle = cur_game->paddles[id];
256 if ( x != 0 ) { paddle->x = x; paddle->cur_x = x; }
257 if ( y != 0 ) paddle->y = y;
258 paddle->fire_left = left_fire;
259 paddle->fire_right = right_fire;
260 paddle->ball_return_key_pressed = return_key;
261 }
262
263 /* move objects, modify game data, store brick hits and collected extras.
264 * return wether level has been finished and the id of the winning paddle
265 * in network games. -1 is a draw. level_over and winner is saved in the
266 * game struct. */
267 void game_update( int ms )
268 {
269 int i;
270
271 extras_update( ms );
272 walls_update( ms );
273 shots_update( ms );
274 bricks_update( ms );
275 for ( i = 0; i < cur_game->paddle_count; i++ )
276 {
277 paddle_update( cur_game->paddles[i], ms );
278 /* release all balls from paddle if invisible */
279 if (!paddle_solid(cur_game->paddles[i]))
280 balls_detach_from_paddle( cur_game->paddles[i], ((rand()%2==1)?-1:1) );
281 }
282
283 balls_update( ms );
284
285 /* level finished? */
286 cur_game->level_over = 0;
287 if ( cur_game->game_type == GT_LOCAL ) {
288 /* local game */
289 if ( cur_game->bricks_left == 0 ) cur_game->level_over = 1;
290 if ( cur_game->balls->count == 0 ) cur_game->level_over = 1;
291 } else {
292 /* network game */
293 if ( cur_game->level_type == LT_NORMAL ) {
294 if ( cur_game->bricks_left == 0 ) cur_game->level_over = 1;
295 }
296 else
297 if ( cur_game->paddles[PADDLE_TOP]->score >= cur_game->frag_limit ||
298 cur_game->paddles[PADDLE_BOTTOM]->score >= cur_game->frag_limit )
299 cur_game->level_over = 1;
300 }
301
302 /* if so, determine winner */
303 if ( cur_game->level_over ) {
304 if ( cur_game->game_type == GT_LOCAL ) {
305 if ( cur_game->bricks_left == 0 )
306 cur_game->winner = PADDLE_BOTTOM; /* praise */
307 else
308 cur_game->winner = PADDLE_TOP; /* swear */
309 } else {
310 cur_game->winner = PADDLE_BOTTOM;
311 if ( cur_game->game_type == GT_NETWORK ) {
312 if ( cur_game->paddles[PADDLE_TOP]->score >
313 cur_game->paddles[PADDLE_BOTTOM]->score )
314 cur_game->winner = PADDLE_TOP;
315 else
316 if ( cur_game->paddles[PADDLE_TOP]->score ==
317 cur_game->paddles[PADDLE_BOTTOM]->score )
318 cur_game->winner = -1;
319 }
320 }
321 }
322 }
323
324 /* get the modifications that occured in game_update() */
325
326 /* get current score of player. return 0 if player does not exist */
327 int game_get_score( int id, int *score )
328 {
329 if ( id < 0 || id >= cur_game->paddle_count ) return 0;
330 *score = cur_game->paddles[id]->score;
331 return 1;
332 }
333
334 /* get number of ball reflections */
335 int game_get_reflected_ball_count( void )
336 {
337 return cur_game->mod.brick_reflected_ball_count+
338 cur_game->mod.paddle_reflected_ball_count;
339 }
340
341 /* get number of ball reflections on bricks */
342 int game_get_brick_reflected_ball_count( void )
343 {
344 return cur_game->mod.brick_reflected_ball_count;
345 }
346
347 /* get number of ball reflections on paddle */
348 int game_get_paddle_reflected_ball_count( void )
349 {
350 return cur_game->mod.paddle_reflected_ball_count;
351 }
352
353 /* get number of newly attached balls */
354 int game_get_attached_ball_count( void )
355 {
356 return cur_game->mod.attached_ball_count;
357 }
358
359 /* get number of fired shots no matter which paddle */
360 int game_get_fired_shot_count( void )
361 {
362 return cur_game->mod.fired_shot_count;
363 }
364
365 /* hit bricks since last call to game_update() */
366 BrickHit *game_get_brick_hits( int *count )
367 {
368 *count = cur_game->mod.brick_hit_count;
369 return cur_game->mod.brick_hits;
370 }
371
372 /* get a list of extras collected by paddle id */
373 int *game_get_collected_extras( int id, int *count )
374 {
375 *count = 0;
376 if ( id < 0 || id >= cur_game->paddle_count ) return 0;
377 *count = cur_game->mod.collected_extra_count[id];
378 return cur_game->mod.collected_extras[id];
379 }
380
381 /* get a snapshot of the level data which is the brick states
382 * converted to the original file format. this can be used to
383 * overwrite a levels data when player changes in alternative
384 * game */
385 void game_get_level_snapshot( Level *shot )
386 {
387 int i, j;
388 int y_off;
389
390 if ( cur_game->game_type == GT_NETWORK )
391 y_off = ( MAP_HEIGHT - EDIT_HEIGHT ) / 2;
392 else
393 y_off = 1;
394
395 for ( i = 0; i < EDIT_WIDTH; i++ )
396 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
397 shot->bricks[i][j] = cur_game->bricks[i+1][j+y_off].brick_c;
398 shot->extras[i][j] = cur_game->bricks[i+1][j+y_off].extra_c;
399 }
400 }
401
402 /* reset the modification of game_update() */
403 void game_reset_mods( void )
404 {
405 memset( &cur_game->mod, 0, sizeof( GameMod ) );
406 }
407
408 /* update a statistics struct by the level stats of a paddle.
409 * updates the win/loss/draw as well. the played_rounds entry
410 * is simply increased everytime this function is called */
411 void game_update_stats( int id, GameStats *stats )
412 {
413 Paddle *paddle;
414 if ( id < 0 || id >= cur_game->paddle_count ) return;
415
416 /* this should be called before game_finalize() as the
417 * stats will be cleared there */
418 paddle = cur_game->paddles[id];
419
420 stats->total_score += paddle->score;
421 if ( stats->total_score < 0 ) stats->total_score = 0;
422 stats->balls_reflected += paddle->balls_reflected;
423 stats->balls_lost += paddle->balls_lost;
424 stats->bricks_cleared += paddle->bricks_cleared;
425 stats->total_brick_count += cur_game->brick_count;
426 stats->extras_collected += paddle->extras_collected;
427 stats->total_extra_count += cur_game->extra_count;
428
429 if ( cur_game->winner == -1 )
430 stats->draws++;
431 else
432 if ( cur_game->winner == id )
433 stats->wins++;
434 else
435 stats->losses++;
436 stats->played_rounds++;
437 }
438
0 /***************************************************************************
1 copyright : (C) 2003 by Michael Speck
2 email : kulkanie@gmx.net
3 ***************************************************************************/
4
5 /***************************************************************************
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 ***************************************************************************/
13
14 #ifndef __GAME_H
15 #define __GAME_H
16
17 /***** INCLUDES ************************************************************/
18
19 #include "../client/lbreakout.h"
20 #include "mathfuncs.h"
21 #include "levels.h"
22 #include "extras.h"
23 #include "balls.h"
24 #include "shots.h"
25 #include "bricks.h"
26 #include "paddle.h"
27 #include "comm.h"
28
29 /***** TYPE DEFINITIONS ****************************************************/
30
31 /***** PUBLIC FUNCTIONS ****************************************************/
32
33 /* create/delete game context */
34 Game *game_create( int game_type, int diff, int rel_warp_limit );
35 void game_delete( Game **game );
36
37 /* finalize single game level. the level_type is determined by
38 * counting the bricks. the data of 'level' is copied and modified
39 * while playing. */
40 void game_init( Game *game, Level *level );
41
42 /* reset level/in_game data */
43 void game_finalize( Game *game );
44
45 /* set the game context the subfunctions will apply their changes to */
46 void game_set_current( Game *game );
47
48 /* set score of paddle 'id'. 0 is bottom paddle and 1 is top paddle */
49 void game_set_score( int id, int score );
50
51 /* set number of additional balls a paddle can fire (all paddles) */
52 void game_set_ball_ammo( int ammo );
53
54 /* set the number of points required to win a PINGPONG level */
55 void game_set_frag_limit( int limit );
56
57 /* set wether to use convex paddle */
58 void game_set_convex_paddle( int convex );
59
60 /* set wether balls are returned to a paddle by pressing fire.
61 * the alternative is that they automatically return. */
62 void game_set_ball_auto_return( int auto_return );
63
64 /* set wether balls are fired at random angle or wether the
65 * left/right fire keys are used */
66 void game_set_ball_random_angle( int random );
67
68 /* set the speed of balls will have in accelerated state */
69 void game_set_ball_accelerated_speed( float speed );
70
71 /* update state of a paddle. x or y may be 0 which is not a valid value.
72 * in this case the property is left unchanged */
73 void game_set_paddle_state( int id, int x, int y, int left_fire, int right_fire, int return_key );
74
75 /* move objects, modify game data, store brick hits and collected extras.
76 * return wether level has been finished and the id of the winning paddle
77 * in network games. -1 is a draw. level_over and winner is saved in the
78 * game struct. */
79 void game_update( int ms );
80
81 /* get the modifications that occured in game_update() */
82
83 /* get current score of player. return 0 if player does not exist */
84 int game_get_score( int id, int *score );
85
86 /* get number of ball reflections */
87 int game_get_reflected_ball_count( void );
88 int game_get_brick_reflected_ball_count( void );
89 int game_get_paddle_reflected_ball_count( void );
90
91 /* get number of newly attached balls */
92 int game_get_attached_ball_count( void );
93
94 /* get number of fired shots no matter which paddle */
95 int game_get_fired_shot_count( void );
96
97 /* hit bricks since last call to game_update() */
98 BrickHit *game_get_brick_hits( int *count );
99
100 /* get a list of extras collected by paddle id */
101 int *game_get_collected_extras( int id, int *count );
102
103 /* get a snapshot of the level data which is the brick states
104 * converted to the original file format. this can be used to
105 * overwrite a levels data when player changes in alternative
106 * game */
107 void game_get_level_snapshot( Level *snapshot );
108
109 /* reset the modification of game_update() */
110 void game_reset_mods( void );
111
112 /* update a statistics struct by the level stats of a paddle.
113 * updates the win/loss/draw as well. the played_rounds entry
114 * is simply increased everytime this function is called */
115 void game_update_stats( int id, GameStats *stats );
116
117 #endif
118
0 /***************************************************************************
1 gamedefs.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GAMEDEFS_H
18 #define __GAMEDEFS_H
19
20 enum {
21 /* game/level types */
22 GT_LOCAL = 0,
23 GT_NETWORK,
24 LT_NORMAL = 0,
25 LT_PINGPONG,
26
27 /* playing field */
28 MAP_WIDTH = 16,
29 MAP_HEIGHT = 24,
30 EDIT_WIDTH = 14,
31 EDIT_HEIGHT = 18,
32
33 /* extras */
34 EX_NONE = -1,
35 EX_SCORE200 = 0,
36 EX_SCORE500,
37 EX_SCORE1000,
38 EX_SCORE2000,
39 EX_SCORE5000,
40 EX_SCORE10000,
41 EX_GOLDSHOWER,
42 EX_SHORTEN,
43 EX_LENGTHEN,
44 EX_LIFE,
45 EX_SLIME,
46 EX_METAL,
47 EX_BALL,
48 EX_WALL,
49 EX_FROZEN,
50 EX_WEAPON,
51 EX_RANDOM,
52 EX_FAST,
53 EX_SLOW,
54 EX_JOKER,
55 EX_DARKNESS,
56 EX_CHAOS,
57 EX_GHOST_PADDLE,
58 EX_DISABLE,
59 EX_TIME_ADD,
60 EX_EXPL_BALL,
61 EX_BONUS_MAGNET,
62 EX_MALUS_MAGNET,
63 EX_WEAK_BALL,
64 EX_NUMBER,
65 TIME_WALL = 10000,
66 TIME_METAL = 5000,
67 TIME_WEAPON = 5000,
68 TIME_FROZEN = 1000,
69 TIME_SLIME = 20000,
70 TIME_FAST = 20000,
71 TIME_SLOW = 20000,
72 TIME_GOLDSHOWER = 20000,
73 TIME_DARKNESS = 20000,
74 TIME_CHAOS = 10000,
75 TIME_GHOST_PADDLE = 20000,
76 TIME_EXPL_BALL = 10000,
77 TIME_BONUS_MAGNET = 20000,
78 TIME_MALUS_MAGNET = 20000,
79 TIME_WEAK_BALL = 10000,
80
81 /* unused */
82 TIME_SPIN_RIGHT = 20000,
83 TIME_SPIN_LEFT = 20000,
84
85 /* paddle */
86 PADDLE_INVIS_DELAY = 200,
87 WEAPON_FIRE_RATE = 150,
88 BALL_FIRE_RATE = 500,
89 BALL_RESPAWN_TIME = 5000, /* in normal multiplayer levelsets a user may bring
90 a new ball to game after this time penalty */
91 ATTRACT_NONE = 0,
92 ATTRACT_BONUS,
93 ATTRACT_MALUS,
94 PADDLE_BOTTOM = 0,
95 PADDLE_TOP,
96 PADDLE_WEAPON_AMMO = 100,
97
98 /* bricks */
99 INVIS_BRICK_ID = 6, /* id of invisible brick */
100 BRICK_EXP_TIME = 150, /* delay until explosion */
101 BRICK_COUNT = 20, /* various brick types */
102 BRICK_GROW_FIRST = 10, /* only bricks within this range may grow randomly */
103 BRICK_GROW_LAST = 17,
104 GROW_BRICK_ID = 19,
105 BRICK_HEAL_TIME = 4000, /* after this time duration is increased */
106 EXTRA_STACK_LIMIT = 20,
107
108 MAP_EMPTY = 0, /* no brick */
109 MAP_WALL, /* can't be destroyed at all */
110 MAP_BRICK, /* may be destroyed if duration is not -1 */
111 MAP_BRICK_EXP, /* explodes neighbors if destroyed */
112 MAP_BRICK_GROW, /* grow neighbors if destroyed */
113 MAP_BRICK_HEAL, /* heals itself when hit */
114 MAP_BRICK_CHAOS, /* chaotic reflection by this brick */
115
116 BRICK_WIDTH = 40,
117 BRICK_HEIGHT = 20,
118 BRICK_SCORE = 100,
119
120 /* hit types */
121 HT_HIT = 0, /* decrease duration */
122 HT_HEAL, /* negative hit: regeneration */
123 HT_REMOVE, /* remove brick completely */
124 HT_GROW, /* create brick with random color */
125
126 /* balls */
127 BALL_NORMAL = 0,
128 BALL_METAL,
129 BALL_EXPL,
130 BALL_WEAK,
131 BALLS_IDLE_LIMIT=10000,
132 BALL_NO_ENTROPY = 0,
133 BALL_ADD_ENTROPY,
134
135 /* particles */
136 SHR_BY_NORMAL_BALL = 0,
137 SHR_BY_ENERGY_BALL,
138 SHR_BY_SHOT,
139 SHR_BY_EXPL,
140 SHR_BY_EXPL_WITH_EXPL, /* shrapnells as from explosion and draw an explosion */
141 SHR_BY_DELAYED_EXPL, /* no explosion animation except for a expl brick */
142
143 /* modifications, beyond this count they are dropped */
144 MAX_MODS = 256,
145
146 /* difficulty */
147 DIFF_COUNT = 4,
148
149 /* players */
150 MAX_PLAYERS = 4,
151
152 /* credits */
153 HIDE_CREDIT = 0,
154 SHOW_CREDIT,
155
156 /* levels */
157 MAX_LEVELS = 40
158 };
159
160 typedef struct Level {
161 char author[32], name[32];
162 /* extras and bricks are saved by their specific character and
163 interpreted by bricks_create later */
164 char bricks[EDIT_WIDTH][EDIT_HEIGHT];
165 char extras[EDIT_WIDTH][EDIT_HEIGHT];
166 int normal_brick_count;
167 } Level;
168 typedef struct {
169 char name[20];
170 int count;
171 int version, update;
172 int cur_level; /* id of current level */
173 Level **levels;
174 } LevelSet;
175
176 typedef struct {
177 float x, y;
178 } Vector;
179 typedef Vector Coord;
180
181 typedef struct {
182 int exists; /* is there a target */
183 int mx, my; /* position in map */
184 float x, y; /* reset position of ball */
185 int time; /* time till contact */
186 int cur_tm; /* current time */
187 Vector perp_vector; /* reflection vector */
188 int side; /* side/corner of brick hit */
189 } Target;
190
191 typedef struct {
192 int total_score; /* or frags */
193
194 int balls_reflected;
195 int balls_lost;
196 int bricks_cleared;
197 int total_brick_count;
198 int extras_collected;
199 int total_extra_count;
200
201 int wins, losses, draws;
202 int played_rounds;
203 } GameStats;
204
205 typedef struct {
206 char name[32]; /* name */
207 int lives; /* lives remaining (single player) */
208 GameStats stats; /* total score and stuff */
209 int paddle_id; /* index of paddle in game::paddles */
210 int level_id; /* index in levelset the player is currently in.
211 to initiate a level the snapshot is used
212 as the player modifies the level data which
213 must be saved for alternating games */
214 Level snapshot; /* if player switches in alternating game a
215 snapshot is kept of the players progress
216 in this level. when it is its turn again
217 it starts with this leveldata */
218 int next_level_received;
219 int next_paddle_id; /* whether level has been received */
220 } Player;
221
222 /* if this is not defined paddle has no velocity balls are reflected by convex surface */
223 #define PADDLE_FRICTION
224
225 typedef struct {
226 int score; /* score/frags gained by this paddle */
227 int type; /* either top or bottom */
228 float cur_x;
229 int x, y;
230 int w, h; /* actual geometry */
231 #ifdef PADDLE_FRICTION
232 float v_x;
233 #endif
234 int wanted_w; /* resize until w == wanted_w */
235 int len; /* how many middle components ? */
236 int start_len;
237 int min_len, max_len; /* limits */
238 float friction; /* how much relative speed is given to balls ? */
239 int friction_delay; /* its hard to exactly hit the moment when the ball touches the paddle
240 so while this is >0 friction is applied */
241 int frozen; /* paddle frozen? */
242 int slime; /* paddle covered with sticky slime */
243 int attract; /* true if paddle attracts balls */
244 Delay resize_delay; /* every delay ms the paddle size is adjusted about two pixels */
245 int invis; /* is paddle invisible? */
246 int invis_delay; /* as long as this isn't timed out the paddle is seen.
247 will be reset by movement */
248
249 /* FIRE STATE - updated by paddle_handle_events() & comm_update_remote_paddle() */
250 int fire_left;
251 int fire_right; /* wether player presses fire buttons */
252 int ball_return_key_pressed; /* wether player wants to return idle balls */
253
254 /* WEAPON - handled by paddle_update() */
255 double weapon_cur;
256 int weapon_inst; /* is weapon installed? */
257 int weapon_fire_delay; /* if >0 and either fire_left or fire_right is True checked
258 against milliseconds wether it drops <=0 in which
259 case it is reset to WEAPON_FIRE_RATE and a shot is fired */
260 int weapon_ammo; /* number of shots available */
261
262 /* BALLS - handled by balls_update() !!! */
263 int ball_fire_delay; /* analogue to weapon_fire_delay */
264 int ball_ammo; /* number of balls player may bring to game */
265 int start_ball_ammo; /* initial ammount as ball ammo is modified while playing */
266 int last_ball_contact; /* in NormMP player may fire a new ball when this
267 time is longer ago than BALL_RESPAWN_TIME and no
268 balls are attached. Then a new ball is created and
269 attached to paddle. */
270 int attached_ball_count; /* number of attached balls */
271 int ball_ammo_disp_y; /* icons are drawn centered at y */
272 int maxballspeed_request;
273 int maxballspeed_request_old; /* when middle mouse button is pressed the balls
274 are accelerated to max speed if old state was
275 zero and vice versa to slow down again */
276
277 /* EXTRAS */
278 int extra_active[EX_NUMBER];
279 int extra_time[EX_NUMBER]; /* paddle specific extras */
280 int wall_y; /* position where wall is drawn */
281 double wall_alpha;
282
283 /* STATISTICS */
284 int balls_reflected; /* how many times successfully reflected a ball */
285 int balls_lost; /* how many balls lost? */
286 int extras_collected; /* number of collected extras. the total number is
287 extra_count in struct game */
288 int bricks_cleared; /* again the total number is brick_count in game */
289
290 /* used by client */
291 Player *player;
292 int pic_x_offset;
293 int pic_y_offset;
294 SDL_Rect update_rect; /* screen update region */
295
296 /* used for dummy paddles */
297 float bot_vx; /* paddle velocity in pix/msec */
298 } Paddle;
299
300 typedef struct {
301 Coord cur; /* current position */
302 int x, y;
303 Vector vel; /* velocity components */
304 int angle; /* angle 0-180 of vector */
305 int attached; /* attached to paddle ? */
306 Paddle *paddle; /* last paddle the ball had contact with */
307 int moving_back; /* ball moves back to paddle as there was no
308 brick/paddle contact within the last
309 20 secs */
310 int idle_time; /* time passed since last brick/paddle contact */
311 int return_allowed; /* if this is set returning by click is allowed */
312 Target target; /* target in map */
313 int get_target; /* if this is true balls_update() will compute the target
314 and clear this flag */
315 } Ball;
316
317 typedef struct {
318 float x, y;
319 Target target;
320 int next_too; /* destroys right brick, too */
321 Paddle *paddle; /* paddle that initiated the shot */
322 int dir; /* direction of shot depending on paddle */
323 int get_target; /* if this is true shots_update() will compute the target
324 and clear this flag */
325
326 /* used by client */
327 float cur_fr;
328 SDL_Rect update_rect; /* screen update region */
329 } Shot;
330
331 typedef struct {
332 int type; /* any of the old MAP_XXX types above */
333 int id; /* picture id -- if -1 no brick -- if 0 it's indestructible */
334 int dur; /* durability - if -1 & type != MAP_WALL it's only destructible
335 by energy ball */
336 int extra; /* extra released when destroyed */
337 int score; /* score you get when desctroying this brick */
338 int exp_time; /* -1 means inexplosive; value is set by a nearby explosion brick */
339 Paddle *exp_paddle; /* paddle that initiated the explosion */
340 int heal_time; /* if not -1 counted down and when 0 brick heals one duration
341 (until fully healed) */
342 int mx, my; /* position of brick in map */
343 char brick_c; /* original character when saved to file */
344 char extra_c; /* original character or 0 */
345 } Brick;
346
347 typedef struct {
348 int x,y; /* position */
349 int type; /* destruction, hit, regeneration, growth */
350 int dest_type;/* shot, normal, energy, explosion */
351 /* if paddle was destroyed: */
352 int paddle; /* 0 bottom, 1 top */
353 int gold_shower;/* goldshower extra released? */
354 int draw_explosion; /* draw an explosion on destruction */
355 int degrees; /* 0 to 180. *2 degree of normal animation movement */
356 } BrickHit;
357
358 typedef struct {
359 float x, y;
360 float alpha;
361 int type;
362 int offset; /* offset in extra pic */
363 int dir; /* extra will move to this direction: 1 or -1 */
364 SDL_Rect update_rect; /* screen update region */
365 } Extra;
366
367 typedef struct {
368 int type;
369 int px, py;
370 int dir;
371 } Stack_Extra; /* pushed extra in bricks.c which is popped in extra.c */
372
373 typedef struct {
374 int lives, max_lives;
375 int paddle_min_size; /* minimum middle size */
376 int paddle_size; /* paddle's starting size */
377 int paddle_max_size; /* max size */
378 int score_mod; /* 10: 100% ±1: ±10% */
379 float v_start;
380 float v_add; /* change per speedup level */
381 float v_max; /* velocity for this difficulty */
382 int v_delay; /* delay between speedups */
383 int allow_maluses; /* boolean */
384 } GameDiff;
385
386 typedef struct {
387 int collected_extras[2][MAX_MODS];
388 int collected_extra_count[2];
389 BrickHit brick_hits[MAX_MODS];
390 int brick_hit_count;
391 int fired_shot_count;
392 int attached_ball_count;
393 int paddle_reflected_ball_count;
394 int brick_reflected_ball_count;
395 } GameMod;
396
397 typedef struct {
398 int game_type;
399 GameDiff *diff; /* difficulty level */
400 int rel_warp_limit;
401
402 /* level data */
403 int level_type;
404 char author[32], title[32];
405 Brick bricks[MAP_WIDTH][MAP_HEIGHT];
406 int brick_count; /* is not changed as it is needed for stats */
407 int bricks_left; /* is decreased. when 0 game is over */
408 int warp_limit; /* if bricks_left <= warp_limit, warp is allowed */
409 int extra_count; /* initial number of extras */
410 int extra_active[EX_NUMBER]; /* wether extra is active */
411 int extra_time[EX_NUMBER]; /* time in milliseconds when extra expires */
412 double ball_v, ball_v_min, ball_v_max; /* ball velocity */
413 Delay speedup_delay;
414 int speedup_level; /* number of speedups */
415 int paddle_is_convex;
416 int balls_return_by_click;
417 int balls_use_random_angle;
418 float accelerated_ball_speed;
419 int frag_limit; /* number of points a player must gain to win a
420 pingpong level */
421 int level_over; /* wether level is finished */
422 int winner; /* 0 - BOTTOM won
423 1 - TOP won
424 -1 - draw */
425
426 /* game objects */
427 Paddle *paddles[2];
428 int paddle_count;
429 List *balls;
430 List *extras;
431 List *shots;
432 List *heal_bricks, *exp_bricks;
433
434 /* code red modifications from update() */
435 GameMod mod;
436 } Game;
437
438 #define SETBIT( data, bit ) data |= (1L << bit )
439 #define GETBIT( data, bit ) ((data >> bit) & 1)
440
441 #endif
442
0 /***************************************************************************
1 levels.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "levels.h"
18
19 /*
20 ====================================================================
21 Locals
22 ====================================================================
23 */
24
25 /*
26 ====================================================================
27 Read in next line.
28 ====================================================================
29 */
30 static int next_line( FILE *file, char *buffer )
31 {
32 /* lines with an # are comments: ignore them */
33 if ( !fgets( buffer, 1023, file ) ) return 0;
34 if ( buffer[strlen(buffer) - 1] == 10 )
35 buffer[strlen(buffer) - 1] = 0;
36 return 1;
37 }
38
39 /* compare with brick conversion table and return true or false
40 * depending on whether brick is destructible by normal hit */
41 static int is_destructible( char brick )
42 {
43 if ( (brick >= 'a' && brick <= 'k') ||
44 (brick >= 'x' && brick <= 'z') ||
45 brick == 'v' ||
46 brick == '*' ||
47 brick == '!' )
48 return 1;
49 return 0;
50 }
51
52 /*
53 ====================================================================
54 Publics
55 ====================================================================
56 */
57
58 /*
59 ====================================================================
60 Open a levelset file by name.
61 ====================================================================
62 */
63 FILE *levelset_open( char *fname, char *mode )
64 {
65 FILE *file;
66 char path[512];
67 if ( fname[0] == '~' ) {
68 snprintf( path, sizeof(path)-1, "%s/%s/lbreakout2-levels/%s",
69 (getenv( "HOME" )?getenv( "HOME" ):"."),
70 CONFIG_DIR_NAME, fname + 1 );
71 }
72 else
73 if ( fname[0] != '/' ) /* keep global pathes */
74 snprintf( path, sizeof(path)-1, "%s/levels/%s", SRC_DIR, fname );
75 else
76 snprintf( path, sizeof(path)-1, fname );
77
78 if ( ( file = fopen( path, mode ) ) == 0 ) {
79 fprintf( stderr, "couldn't open %s\n", path );
80 return 0;
81 }
82 return file;
83 }
84 /*
85 ====================================================================
86 Load all levels from file and add them to the list.
87 ====================================================================
88 */
89 int levels_load( char *fname, List *levels, int *version, int *update )
90 {
91 /* load all levels from levelset 'fname' and put
92 them to list 'levels' */
93 FILE *file;
94 Level *level;
95 /* get file handle */
96 if ( ( file = levelset_open( fname, "rb" ) ) == 0 )
97 return 0;
98 /* check version */
99 levelset_get_version( file, version, update );
100 /* read levels */
101 while( ( level = level_load( file ) ) != 0 )
102 list_add( levels, level );
103 fclose( file );
104 return 1;
105 }
106 /*
107 ====================================================================
108 Load all levels from either
109 home directory (fname begins with ~) or installation directory.
110 ====================================================================
111 */
112 LevelSet *levelset_load( char *fname )
113 {
114 int version, update;
115 LevelSet *set;
116 List *levels = list_create( LIST_NO_AUTO_DELETE, 0 );
117
118 levels_load( fname, levels, &version, &update );
119 set = levelset_build_from_list( levels, fname, version, update );
120 if ( set == 0 )
121 fprintf( stderr, "empty levelset: %s\n", fname );
122 else
123 printf( "%s v%i.%02i: %i levels\n", fname, set->version, set->update, set->count );
124 return set;
125 }
126 /*
127 ====================================================================
128 Load all levelSETS listed in 'levelsets' (names) into one big
129 levelset and shake the levels a bit. Use a fixed seed for this
130 and reinit random generator with current time when done.
131 Use sets from install directory only (no preceding ~)
132 ====================================================================
133 */
134 LevelSet *levelset_load_all( List *levelsets, int seed )
135 {
136 LevelSet *set;
137 char *setname;
138 int version, update;
139 List *levels = list_create( LIST_NO_AUTO_DELETE, 0 );
140 int i;
141 ListEntry *entry;
142 Level **pointers, *level;
143
144 /* use sets from install directory only (no preceding ~) */
145 list_reset( levelsets );
146 while ( (setname = list_next( levelsets )) && setname[0] != '~' )
147 levels_load( setname, levels, &version, &update );
148
149 /* shake the levels a bit */
150 srand(seed);
151 list_reset( levels ); i = 0;
152 pointers = calloc( levels->count, sizeof( Level* ) );
153 while ( ( level = list_next( levels ) ) ) {
154 i = rand() % levels->count;
155 while ( pointers[i] ) {
156 i++;
157 if ( i == levels->count )
158 i = 0;
159 }
160 pointers[i] = level;
161 }
162 entry = levels->head->next;
163 for ( i = 0; i < levels->count; i++ ) {
164 entry->item = pointers[i];
165 entry = entry->next;
166 }
167 free( pointers );
168 srand(time(0));
169
170 version = 1; update = 0;
171 set = levelset_build_from_list( levels, TOURNAMENT, version, update );
172 if ( set == 0 )
173 fprintf( stderr, "empty levelset: %s\n", TOURNAMENT );
174 else
175 printf( "%s v%i.%02i: %i levels\n", TOURNAMENT,
176 set->version, set->update, set->count );
177 return set;
178 }
179 /*
180 ====================================================================
181 Build a levelset from a level list and delete the list.
182 The levels are taken from the list so it must not have AUTO_DELETE
183 enabled!
184 ====================================================================
185 */
186 LevelSet *levelset_build_from_list( List *levels, char *name, int version, int update )
187 {
188 LevelSet *set = 0;
189 Level *level;
190 int i = 0;
191
192 if ( levels->count == 0 ) return 0;
193 set = salloc( 1, sizeof( LevelSet ) );
194 snprintf( set->name, 20, name );
195 set->levels = salloc( levels->count, sizeof( Level* ) );
196 set->count = levels->count;
197 set->version = version;
198 set->update = update;
199 list_reset( levels );
200 while ( (level = list_next( levels )) ) {
201 set->levels[i] = level;
202 i++;
203 }
204 list_delete( levels );
205 return set;
206 }
207 /*
208 ====================================================================
209 Save levelset to home directory (regardsless of ~ in front of it).
210 Return Value: True if successful.
211 ====================================================================
212 */
213 int levelset_save( LevelSet *set, char *fname )
214 {
215 FILE *file;
216 Level *level;
217 char path[512];
218 int i, j, k;
219
220 if ( set == 0 || set->count == 0 ) return 0;
221
222 snprintf( path, sizeof(path)-1, "%s/%s/lbreakout2-levels/%s",
223 (getenv( "HOME" )?getenv( "HOME" ):"."),
224 CONFIG_DIR_NAME, (fname[0]=='~')?fname+1:fname );
225 if ( ( file = fopen( path, "w" ) ) == 0 ) {
226 fprintf( stderr, "couldn't open %s\n", path );
227 return 0;
228 }
229
230 fprintf( file, "Version: %i.%02i\n",
231 set->version, set->update );
232 for ( k = 0; k < set->count; k++ ) {
233 level = set->levels[k];
234
235 fprintf( file, "Level:\n%s\n%s\nBricks:\n",
236 level->author, level->name );
237 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
238 for ( i = 0; i < EDIT_WIDTH; i++ )
239 fprintf( file, "%c", level->bricks[i][j] );
240 fprintf( file, "\n" );
241 }
242 fprintf( file, "Bonus:\n" );
243 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
244 for ( i = 0; i < EDIT_WIDTH; i++ )
245 fprintf( file, "%c", level->extras[i][j] );
246 fprintf( file, "\n" );
247 }
248 }
249
250 fclose( file );
251 return 1;
252 }
253 /*
254 ====================================================================
255 Create an all empty levelset.
256 ====================================================================
257 */
258 LevelSet *levelset_create_empty( int count, char *author, char *name )
259 {
260 int i;
261 LevelSet *set = salloc( 1, sizeof( LevelSet ) );
262
263 strcpy( set->name, "empty" );
264 set->count = count;
265 set->levels = salloc( count, sizeof( Level* ) );
266 for ( i = 0; i < count; i++ )
267 set->levels[i] = level_create_empty( author, name );
268 set->version = 1; set->update = 0;
269 return set;
270 }
271 /*
272 ====================================================================
273 Delete levels and set pointer NULL. Second version is for use with
274 lists.
275 ====================================================================
276 */
277 void levelset_delete( LevelSet **set )
278 {
279 int i;
280 if ( *set == 0 ) return;
281 if ( (*set)->levels ) {
282 for ( i = 0; i < (*set)->count; i++ )
283 if ( (*set)->levels[i] )
284 level_delete( (*set)->levels[i] );
285 free( (*set)->levels );
286 }
287 free( *set ); *set = 0;
288 }
289 void levelset_list_delete( void *ptr )
290 {
291 LevelSet *set = (LevelSet*)ptr;
292 levelset_delete( &set );
293 }
294 /*
295 ====================================================================
296 Get next level from a set starting at the first level. If no more
297 levels remain, NULL is returned.
298 ====================================================================
299 */
300 Level* levelset_get_first( LevelSet *set )
301 {
302 return set->levels[0];
303 }
304 Level* levelset_get_next( LevelSet *set )
305 {
306 if ( set->cur_level == set->count )
307 return 0;
308 return set->levels[set->cur_level++];
309 }
310 /*
311 ====================================================================
312 Return list id of this level or -1 if not within this set.
313 ====================================================================
314 */
315 int levelset_get_id( LevelSet *set, Level *level )
316 {
317 int i;
318
319 for ( i = 0; i < set->count; i++ )
320 if ( level == set->levels[i] )
321 return i;
322 return -1;
323 }
324 /*
325 ====================================================================
326 Load level from current file position.
327 ====================================================================
328 */
329 Level* level_load( FILE *file )
330 {
331 Level *level = 0;
332 char buffer[1024];
333 int i, j;
334
335 /* file handle ok? */
336 if ( !file )
337 return 0;
338 /* get level mem */
339 level = calloc( 1, sizeof( Level ) );
340 /* read entries */
341 /* level: */
342 if ( !next_line( file, buffer ) ) goto failure;
343 if ( !strequal( "Level:", buffer ) ) goto failure;
344 /* author */
345 if ( !next_line( file, buffer ) ) goto failure;
346 snprintf( level->author, 31, buffer );
347 /* level name */
348 if ( !next_line( file, buffer ) ) goto failure;
349 snprintf( level->name, 31, buffer );
350 /* bricks: */
351 if ( !next_line( file, buffer ) ) goto failure;
352 if ( !strequal( "Bricks:", buffer ) ) goto failure;
353 /* load bricks */
354 for ( i = 0; i < EDIT_HEIGHT; i++ ) {
355 if ( !next_line( file, buffer ) ) goto failure;
356 if ( strlen( buffer ) < EDIT_WIDTH ) goto failure;
357 for ( j = 0; j < EDIT_WIDTH; j++ )
358 level->bricks[j][i] = buffer[j];
359 }
360 /* extras: */
361 if ( !next_line( file, buffer ) ) goto failure;
362 if ( !strequal( "Bonus:", buffer ) ) goto failure;
363 /* load extras */
364 for ( i = 0; i < EDIT_HEIGHT; i++ ) {
365 if ( !next_line( file, buffer ) ) goto failure;
366 if ( strlen( buffer ) < EDIT_WIDTH ) goto failure;
367 for ( j = 0; j < EDIT_WIDTH; j++ )
368 level->extras[j][i] = buffer[j];
369 }
370 /* count destructible bricks */
371 level->normal_brick_count = 0;
372 for ( i = 0; i < EDIT_HEIGHT; i++ )
373 for ( j = 0; j < EDIT_WIDTH; j++ )
374 if ( is_destructible(level->bricks[j][i]) )
375 level->normal_brick_count++;
376 /* return level */
377 return level;
378 failure:
379 level_delete( level );
380 return 0;
381 }
382 /*
383 ====================================================================
384 Create an empty level
385 ====================================================================
386 */
387 Level* level_create_empty( char *author, char *name )
388 {
389 int i, j;
390 Level *level = calloc( 1, sizeof( Level ) );
391 snprintf( level->author, 31, author );
392 snprintf( level->name, 31, name );
393 /* empty arena */
394 for ( i = 0; i < EDIT_WIDTH; i++ )
395 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
396 level->extras[i][j] = (char)EX_NONE;
397 level->bricks[i][j] = (char)-1;
398 }
399 return level;
400 }
401 /*
402 ====================================================================
403 Delete level pointer.
404 ====================================================================
405 */
406 void level_delete( void *level_ptr )
407 {
408 Level *level = (Level*)level_ptr;
409 if ( level == 0 ) return;
410 free( level );
411 }
412
413 /*
414 ====================================================================
415 Get version and current update of levelset: x.x
416 Will reset the file pointer to beginning.
417 ====================================================================
418 */
419 void levelset_get_version( FILE *file, int *version, int *update )
420 {
421 char buffer[1024];
422 *version = 1; *update = 0;
423 fseek( file, 0, SEEK_SET );
424 next_line( file, buffer );
425 if ( strlen( buffer ) > 8 && !strncmp( buffer, "Version:", 8 ) )
426 parse_version( buffer + 8, version, update );
427 else
428 fseek( file, 0, SEEK_SET );
429 }
430
431 /*
432 ====================================================================
433 Get the name of the author of the first level.
434 ====================================================================
435 */
436 void levelset_get_first_author( FILE *file, char *author )
437 {
438 char buffer[1024];
439 int dummy;
440 levelset_get_version( file, &dummy, &dummy );
441 next_line( file, buffer );
442 next_line( file, buffer );
443 strcpy_lt( author, buffer, 31 );
444 }
445
446
0 /***************************************************************************
1 levels.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LEVELS_H
18 #define __LEVELS_H
19
20 #include "../client/lbreakout.h"
21
22 #define NEW_SET "<CREATE SET>"
23 #define TOURNAMENT "!FREAKOUT!"
24
25 /*
26 ====================================================================
27 Open a levelset file by name.
28 ====================================================================
29 */
30 FILE *levelset_open( char *fname, char *mode );
31 /*
32 ====================================================================
33 Load all levels from file and add them to the list.
34 ====================================================================
35 */
36 int levels_load( char *fname, List *levels, int *version, int *update );
37 /*
38 ====================================================================
39 Load all levels from either
40 home directory (fname begins with ~) or installation directory.
41 ====================================================================
42 */
43 LevelSet *levelset_load( char *fname );
44 /*
45 ====================================================================
46 Load all levelSETS listed in 'levelsets' (names) into one big
47 levelset and shake the levels a bit. Use a fixed seed for this
48 and reinit random generator with current time when done.
49 ====================================================================
50 */
51 LevelSet *levelset_load_all( List *levelsets, int seed );
52 /*
53 ====================================================================
54 Build a levelset from a level list and delete the list.
55 The levels are taken from the list so it must not have AUTO_DELETE
56 enabled!
57 ====================================================================
58 */
59 LevelSet *levelset_build_from_list( List *levels, char *name, int version, int update );
60 /*
61 ====================================================================
62 Save levelset to home directory (regardsless of ~ in front of it).
63 Return Value: True if successful.
64 ====================================================================
65 */
66 int levelset_save( LevelSet *set, char *fname );
67 /*
68 ====================================================================
69 Create an all empty levelset.
70 ====================================================================
71 */
72 LevelSet *levelset_create_empty( int count, char *author, char *name );
73 /*
74 ====================================================================
75 Delete levels and set pointer NULL. Second version is for use with
76 lists.
77 ====================================================================
78 */
79 void levelset_delete( LevelSet **set );
80 void levelset_list_delete( void *ptr );
81 /*
82 ====================================================================
83 Get first/next level from a set starting at the first level. If
84 no more levels remain, NULL is returned.
85 ====================================================================
86 */
87 Level* levelset_get_first( LevelSet *set );
88 Level* levelset_get_next( LevelSet *set );
89 /*
90 ====================================================================
91 Return list id of this level or -1 if not within this set.
92 ====================================================================
93 */
94 int levelset_get_id( LevelSet *set, Level *level );
95 /*
96 ====================================================================
97 Load level from current file position.
98 ====================================================================
99 */
100 Level* level_load( FILE *file );
101 /*
102 ====================================================================
103 Create an empty level
104 ====================================================================
105 */
106 Level* level_create_empty( char *author, char *name );
107 /*
108 ====================================================================
109 Delete level pointer.
110 ====================================================================
111 */
112 void level_delete( void *level_ptr );
113
114 /*
115 ====================================================================
116 Get version and current update of levelset: x.x
117 Will reset the file pointer to beginning.
118 ====================================================================
119 */
120 void levelset_get_version( FILE *file, int *version, int *update );
121 /*
122 ====================================================================
123 Get the name of the author of the first level.
124 ====================================================================
125 */
126 void levelset_get_first_author( FILE *file, char *author );
127
128 #endif
129
0 /***************************************************************************
1 mathfuncs.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "mathfuncs.h"
19
20 char circle_msg[256];
21
22 /*
23 ====================================================================
24 Return vector struct with the specified coordinates.
25 ====================================================================
26 */
27 Vector vector_get( float x, float y )
28 {
29 Vector v = { x, y };
30 return v;
31 }
32 /*
33 ====================================================================
34 Give vector the normed length of 1.
35 ====================================================================
36 */
37 void vector_norm( Vector *v )
38 {
39 float length;
40 if ( v->x == 0 && v->y == 0 ) return; /* NULL vector may not be normed */
41 length = sqrt( v->x * v->x + v->y * v->y );
42 v->x /= length;
43 v->y /= length;
44 }
45 /*
46 ====================================================================
47 Return monotony of vector. If vertical return 0
48 ====================================================================
49 */
50 float vector_monotony( Vector v )
51 {
52 if ( v.x == 0 ) return 0;
53 return v.y / v.x;
54 }
55 /*
56 ====================================================================
57 Set length of a vector.
58 ====================================================================
59 */
60 void vector_set_length( Vector *v, float length )
61 {
62 vector_norm( v );
63 v->x *= length; v->y *= length;
64 }
65
66 /*
67 ====================================================================
68 Initiate a line struct.
69 ====================================================================
70 */
71 void line_set( Line *line, float x, float y, float m )
72 {
73 line->vertical = 0;
74 line->m = m;
75 line->n = y - m*x;
76 }
77 void line_set_vert( Line *line, float x )
78 {
79 line->vertical = 1;
80 line->x = x;
81 }
82 void line_set_hori( Line *line, float y )
83 {
84 line->vertical = 0;
85 line->m = 0;
86 line->n = y;
87 }
88 /*
89 ====================================================================
90 Intersect lines and set 'pos' to intersecting point.
91 Return Value: True if lines intersect.
92 ====================================================================
93 */
94 int line_intersect( Line *line, Line *target, Coord *pos )
95 {
96 /* reset pos */
97 pos->x = pos->y = 0;
98 /* if lines are parallel return False */
99 if ( line->vertical && target->vertical ) return 0; /* vertical parallels */
100 if ( !line->vertical && !target->vertical && line->m == target->m ) return 0; /* non-vertical parallels */
101 /* right now only one thing is supported: line horizontal */
102 if ( line->m == 0 && line->vertical == 0 ) {
103 pos->y = line->n;
104 if ( target->vertical )
105 pos->x = target->x;
106 else
107 pos->x = ( pos->y - target->n ) / target->m;
108 return 1;
109 }
110 if ( line->vertical ) {
111 if ( target->vertical ) return 0;
112 pos->x = line->x;
113 pos->y = target->m * pos->x + target->n;
114 return 1;
115 }
116 if ( target->vertical ) {
117 printf( "line_intersect: line non-vertical and target vertical not supported yet\n" );
118 return 1;
119 }
120 /* compute if both lines are neither vertical nor horizontal */
121 pos->x = ( line->n - target->n ) / ( target->m - line->m );
122 pos->y = line->m * pos->x + line->n;
123 return 1;
124 }
125
126 /*
127 ====================================================================
128 Initiate a line struct.
129 ====================================================================
130 */
131 void iline_set( ILine *line, int x, int y, int m_4096 )
132 {
133 line->vertical = 0;
134 line->m_4096 = m_4096;
135 line->n = y - ((m_4096*x)>>12);
136 }
137 void iline_set_vert( ILine *line, int x )
138 {
139 line->vertical = 1;
140 line->x = x;
141 }
142 void iline_set_hori( ILine *line, int y )
143 {
144 line->vertical = 0;
145 line->m_4096 = 0;
146 line->n = y;
147 }
148 /*
149 ====================================================================
150 Intersect lines and set 'pos' to intersecting point.
151 Return Value: True if lines intersect.
152 ====================================================================
153 */
154 int iline_intersect( ILine *line, ILine *target, ICoord *pos )
155 {
156 /* reset pos */
157 pos->x = pos->y = 0;
158 /* if lines are parallel return False */
159 if ( line->vertical && target->vertical ) return 0; /* vertical parallels */
160 if ( !line->vertical && !target->vertical )
161 if ( line->m_4096 == target->m_4096 ) return 0; /* non-vertical parallels */
162 /* right now only one thing is supported: line horizontal */
163 if ( line->m_4096 == 0 && line->vertical == 0 ) {
164 pos->y = line->n;
165 if ( target->vertical )
166 pos->x = target->x;
167 else
168 pos->x = (( pos->y - target->n )<<12) / target->m_4096;
169 return 1;
170 }
171 if ( line->vertical ) {
172 if ( target->vertical ) return 0;
173 pos->x = line->x;
174 pos->y = ((target->m_4096 * pos->x)>>12) + target->n;
175 return 1;
176 }
177 if ( target->vertical ) {
178 printf( "line_intersect: line non-vertical and target vertical not supported yet\n" );
179 return 1;
180 }
181 /* compute if both lines are neither vertical nor horizontal */
182 pos->x = (( line->n - target->n )<<12) / ( target->m_4096 - line->m_4096 );
183 pos->y = ((line->m_4096 * pos->x)>>12) + line->n;
184 return 1;
185 }
186
187 /*
188 ====================================================================
189 Intersect line pos+t*v with circle (x+m)²=r²
190 Important length of v MUST be 1.
191 Return Value: True if intersecting, Intersecting points
192 ====================================================================
193 */
194 int circle_intersect( Vector m, int r, Vector pos, Vector v, Vector *t1, Vector *t2 )
195 {
196 Vector delta = { pos.x - m.x, pos.y - m.y };
197 float delta_v = delta.x * v.x + delta.y * v.y;
198 float dis = delta_v * delta_v + r * r - ( delta.x * delta.x + delta.y * delta.y );
199 float t;
200
201 if ( dis < 0 ) {
202 #ifdef WITH_BUG_REPORT
203 sprintf( circle_msg, "Diskriminante < 0" );
204 #endif
205 return 0;
206 }
207 dis = sqrt( dis );
208
209 t = -delta_v + dis;
210 t1->x = pos.x + t * v.x; t1->y = pos.y + t * v.y;
211 t = -delta_v - dis;
212 t2->x = pos.x + t * v.x; t2->y = pos.y + t * v.y;
213 #ifdef WITH_BUG_REPORT
214 sprintf( circle_msg, "Intersection points: (%4.2f,%4.2f), (%4.2f,%4.2f)", t1->x, t1->y, t2->x, t2->y );
215 #endif
216 return 1;
217 }
218
219 /* convert vector to angle/2 0-180 and vice versa */
220 static Vector impact_vectors[180]; /* clockwise impact vectors in 2 degree steps */
221
222 void init_angles( void )
223 {
224 int i;
225
226 /* create vectors for all degrees in 2° steps */
227 for ( i = 0; i < 180; i++ ) {
228 impact_vectors[i].x = cos( 6.28 * i / 180 );
229 impact_vectors[i].y = sin( 6.28 * i / 180 );
230 }
231 }
232
233 int vec2angle( Vector *vec )
234 {
235 int degrees = 0;
236
237 /* translate impact vector (src-center) into degrees
238 * (0°: horizontally right, clockwise going) */
239 if ( vec->x == 0 )
240 degrees = 90; /* basically impossible as we mask this out */
241 else
242 degrees = (int)(360 * atan( (double)(fabs(vec->y))/fabs(vec->x) ) / 6.28);
243 /* get the proper quartal */
244 if ( vec->x > 0 ) {
245 if ( vec->y < 0 )
246 degrees = 360 - degrees;
247 }
248 else {
249 if ( vec->y >= 0 )
250 degrees = 180 - degrees;
251 else
252 degrees = 180 + degrees;
253 }
254
255 return degrees/2;
256 }
257
258 void angle2vec( int angle, Vector *vec )
259 {
260 vec->x = 0;
261 vec->y = 0;
262
263 if ( angle < 0 ) return;
264 if ( angle > 179 ) return;
265
266 *vec = impact_vectors[angle];
267 }
268
269
0 /***************************************************************************
1 mathfuncs.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MATH_H
18 #define __MATH_H
19
20 /* integer vector */
21 typedef struct {
22 int x,y;
23 } ICoord;
24
25 typedef struct {
26 float x; /* position if vertical line */
27 int vertical; /* if this is set monotony is not computed */
28 float m; /* monotony */
29 float n; /* y_offset */
30 } Line;
31
32 /* integer line */
33 typedef struct {
34 int x; /* position if vertical line */
35 int vertical; /* if this is set monotony is not computed */
36 int m_4096; /* monotony * 4096 */
37 int n; /* y_offset */
38 } ILine;
39
40 /*
41 ====================================================================
42 Return vector struct with the specified coordinates.
43 ====================================================================
44 */
45 Vector vector_get( float x, float y );
46 /*
47 ====================================================================
48 Give vector the normed length of 1.
49 ====================================================================
50 */
51 void vector_norm( Vector *v );
52 /*
53 ====================================================================
54 Return monotony of vector. If vertical return 0
55 ====================================================================
56 */
57 float vector_monotony( Vector v );
58 /*
59 ====================================================================
60 Set length of a vector.
61 ====================================================================
62 */
63 void vector_set_length( Vector *v, float length );
64
65 /*
66 ====================================================================
67 Initiate a line struct.
68 ====================================================================
69 */
70 void line_set( Line *line, float x, float y, float m );
71 void line_set_vert( Line *line, float x );
72 void line_set_hori( Line *line, float y );
73 /*
74 ====================================================================
75 Intersect lines and set 'pos' to intersecting point.
76 Return Value: True if lines intersect.
77 ====================================================================
78 */
79 int line_intersect( Line *line, Line *target, Coord *pos );
80
81 /*
82 ====================================================================
83 Initiate a line struct.
84 ====================================================================
85 */
86 void iline_set( ILine *line, int x, int y, int m_4096 );
87 void iline_set_vert( ILine *line, int x );
88 void iline_set_hori( ILine *line, int y );
89 /*
90 ====================================================================
91 Intersect lines and set 'pos' to intersecting point.
92 Return Value: True if lines intersect.
93 ====================================================================
94 */
95 int iline_intersect( ILine *line, ILine *target, ICoord *pos );
96
97 /*
98 ====================================================================
99 Intersect line pos+t*v with circle (x+m)²=r²
100 Important length of v MUST be 1.
101 Return Value: True if intersecting, Intersecting points
102 ====================================================================
103 */
104 int circle_intersect( Vector m, int r, Vector pos, Vector v, Vector *t1, Vector *t2 );
105
106 /* convert vector to angle/2 0-180 and vice versa */
107 void init_angles( void );
108 int vec2angle( Vector *vec );
109 void angle2vec( int angle, Vector *vec );
110
111 #endif
0 /***************************************************************************
1 paddle.c - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "shots.h"
19 #include "paddle.h"
20
21 extern Game *cur_game;
22 int paddle_cw = 18, paddle_ch = 18; /* size of a paddle component */
23
24 /*
25 ====================================================================
26 Create/delete a paddle. x is centered assuming a screen width of
27 640. ball_ammo is the number of additional balls paddle
28 may bring to game.
29 ====================================================================
30 */
31 Paddle* paddle_create(
32 int score, int type, int y, int size, int min_size, int max_size, int ball_ammo )
33 {
34 Paddle *paddle = salloc( 1, sizeof( Paddle ) );
35 delay_set( &paddle->resize_delay, 40 );
36 paddle->score = score;
37 paddle->len = size;
38 paddle->start_len = size;
39 paddle->min_len = min_size;
40 paddle->max_len = max_size;
41 paddle->w = (paddle->len + 2) * paddle_cw;
42 paddle->wanted_w = paddle->w;
43 paddle->h = paddle_ch;
44 paddle->y = y;
45 paddle->type = type;
46 if ( paddle->type == PADDLE_TOP )
47 paddle->wall_y = 0;
48 else
49 paddle->wall_y = 480 - BRICK_HEIGHT;
50 paddle->wall_alpha = 0;
51 paddle->x = ((MAP_WIDTH * BRICK_WIDTH) - paddle->w) / 2; /* centered */
52 paddle->cur_x = paddle->x;
53 paddle->friction = 0.3;
54 paddle->friction_delay = 0;
55 /* reset weapon */
56 paddle->weapon_ammo = PADDLE_WEAPON_AMMO;
57 /* reset slime&frozen */
58 paddle->slime = 0;
59 paddle->frozen = 0;
60 /* attract */
61 paddle->attract = ATTRACT_NONE;
62 /* no ivisiblivty */
63 paddle->invis = 0;
64 /* ammo */
65 paddle->ball_ammo = ball_ammo;
66 paddle->start_ball_ammo = ball_ammo;
67 /* ammo display */
68 paddle->ball_ammo_disp_y = 4;
69 if ( paddle->type == PADDLE_BOTTOM )
70 paddle->ball_ammo_disp_y += (MAP_HEIGHT-1)*BRICK_HEIGHT;
71
72 return paddle;
73 }
74 void paddle_delete( Paddle *paddle )
75 {
76 if ( paddle ) free( paddle );
77 }
78 void paddle_reset( Paddle *paddle )
79 {
80 /* bad hack, isn't it? */
81 Paddle *new = paddle_create(
82 0/*clear score*/, paddle->type, paddle->y, paddle->start_len,
83 paddle->min_len, paddle->max_len, paddle->start_ball_ammo );
84 *paddle = *new;
85 paddle_delete( new );
86 }
87
88 void paddle_freeze( Paddle *paddle, int freeze )
89 {
90 paddle->frozen = freeze;
91 /* Goddammit what a shitty hack!!! hope I never change input stuff
92 again. but who cares anyway? isn't this source all screwed up
93 already? so let's go on until chaos reigns!!! multiple exclamation
94 marks are a sure sign of a deseased mind, I read somewhere. This
95 is not true!!! I am NOT not mental!!! Hey, if you read this, drop
96 me a note. Just curious whether someone ever happened to do so. */
97 SDL_GetRelativeMouseState( &freeze, &freeze );
98 }
99 void paddle_set_slime( Paddle *paddle, int slime )
100 {
101 paddle->slime = slime;
102 }
103 int paddle_slimy( Paddle *paddle )
104 {
105 return paddle->slime;
106 }
107
108 /*
109 ====================================================================
110 Set if paddle attracts boni/mali or none.
111 ====================================================================
112 */
113 void paddle_set_attract( Paddle *paddle, int attract )
114 {
115 paddle->attract = attract;
116 /* no graphical change yet */
117 }
118 int paddle_attract_malus( Paddle *paddle )
119 {
120 return ( paddle->attract == ATTRACT_MALUS );
121 }
122 int paddle_attract_bonus( Paddle *paddle )
123 {
124 return ( paddle->attract == ATTRACT_BONUS );
125 }
126 int paddle_check_attract( Paddle *paddle, int type )
127 {
128 switch ( type ) {
129 /* bonus */
130 case EX_SCORE200:
131 case EX_SCORE500:
132 case EX_SCORE1000:
133 case EX_SCORE2000:
134 case EX_SCORE5000:
135 case EX_SCORE10000:
136 case EX_GOLDSHOWER:
137 case EX_LENGTHEN:
138 case EX_LIFE:
139 case EX_SLIME:
140 case EX_METAL:
141 case EX_BALL:
142 case EX_WALL:
143 case EX_WEAPON:
144 case EX_SLOW:
145 case EX_JOKER:
146 case EX_EXPL_BALL:
147 case EX_BONUS_MAGNET:
148 if ( paddle_attract_bonus( paddle ) )
149 return 1;
150 return 0;
151 /* malus */
152 case EX_SHORTEN:
153 case EX_FAST:
154 /*
155 case EX_SPIN_RIGHT:
156 case EX_SPIN_LEFT:
157 */
158 case EX_MALUS_MAGNET:
159 case EX_WEAK_BALL:
160 case EX_DARKNESS:
161 case EX_GHOST_PADDLE:
162 case EX_FROZEN:
163 if ( paddle_attract_malus( paddle ) )
164 return 1;
165 return 0;
166 /* neutral */
167 case EX_DISABLE:
168 case EX_CHAOS:
169 case EX_TIME_ADD:
170 case EX_RANDOM:
171 return 0;
172 }
173 return 0;
174 }
175
176 /*
177 ====================================================================
178 (De)activate ghostly behaviour: paddle is only seen when moved at
179 maximum 200ms before.
180 ====================================================================
181 */
182 void paddle_set_invis( Paddle *paddle, int invis )
183 {
184 if ( invis ) paddle->invis_delay = PADDLE_INVIS_DELAY;
185 paddle->invis = invis;
186 }
187 int paddle_solid( Paddle *paddle )
188 {
189 /* does paddle is visible? */
190 if ( !paddle->invis ) return 1;
191 if ( paddle->invis_delay ) return 1;
192 return 0;
193 }
194
195 /*
196 ====================================================================
197 Init paddle resize (the change between wanted_w and w MUST be
198 even (else the paddle shrinks til eternity)
199 ====================================================================
200 */
201 int paddle_init_resize( Paddle *paddle, int c )
202 {
203 /* resize possbile */
204 if ( paddle->len + c > paddle->max_len || paddle->len + c < paddle->min_len )
205 return 0;
206 /* get wanted width */
207 paddle->len += c;
208 paddle->wanted_w = (paddle->len + 2) * paddle_cw;
209 /* reset delay */
210 delay_reset( &paddle->resize_delay );
211 return 1;
212 }
213 /*
214 ====================================================================
215 Actually resize paddle and return the -1 for shrinkage and 1
216 for expansion.
217 ====================================================================
218 */
219 int paddle_resize( Paddle *paddle, int ms )
220 {
221 if ( paddle->w == paddle->wanted_w ) return 0;
222 if ( !delay_timed_out( &paddle->resize_delay, ms ) ) return 0;
223 /* change size and position */
224 if ( paddle->w < paddle->wanted_w ) {
225 paddle->w += 2;
226 paddle->cur_x -= 1;
227 paddle->x = (int)paddle->cur_x;
228 /* check range */
229 if (paddle->x < BRICK_WIDTH)
230 paddle->x = BRICK_WIDTH;
231 if (paddle->x + paddle->w > 640 - BRICK_WIDTH)
232 paddle->x = 640 - BRICK_WIDTH - paddle->w;
233 return 1;
234 }
235 else {
236 paddle->w -= 2;
237 paddle->cur_x += 1;
238 paddle->x = (int)paddle->cur_x;
239 return -1;
240 }
241 }
242
243 /*
244 ====================================================================
245 Update paddle resize and fire weapon.
246 ====================================================================
247 */
248 void paddle_update( Paddle *paddle, int ms )
249 {
250 Ball *ball;
251 int result;
252
253 /* invisiblity */
254 if ( paddle->invis ) /* extra active */
255 if ( paddle->invis_delay > 0 && (paddle->invis_delay-=ms) <= 0 )
256 paddle->invis_delay = 0;
257
258 /* handle weapon */
259 if ( paddle->weapon_inst ) {
260 if ( paddle->fire_left || paddle->fire_right )
261 if ( paddle->weapon_ammo > 0 )
262 if ( (paddle->weapon_fire_delay-=ms) <= 0 ) {
263 paddle->weapon_fire_delay = WEAPON_FIRE_RATE;
264 shot_create( paddle );
265 paddle->weapon_ammo--;
266 }
267 }
268
269 /* check for resize */
270 if ( ( result = paddle_resize( paddle, ms ) ) ) {
271 list_reset( cur_game->balls );
272 while ( ( ball = list_next( cur_game->balls ) ) )
273 /* adjust attached balls */
274 if ( ball->attached && ball->paddle == paddle ) {
275 if ( result < 0 ) {
276 /* shrinked */
277 if ( ball->cur.x > ( paddle->w >> 1 ) ) {
278 ball->cur.x -= 2;
279 ball->x = (int)ball->cur.x;
280 }
281 }
282 else {
283 /* expanded */
284 if ( ball->cur.x > ( paddle->w >> 1 ) ) {
285 ball->cur.x += 2;
286 ball->x = (int)ball->cur.x;
287 }
288 }
289 }
290 }
291 }
292 /*
293 ====================================================================
294 De/Activate weapon
295 ====================================================================
296 */
297 void weapon_install( Paddle *paddle, int install )
298 {
299 if ( install ) paddle->weapon_fire_delay = WEAPON_FIRE_RATE;
300 paddle->weapon_inst = install;
301 }
302
0 /***************************************************************************
1 paddle.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __PADDLE_H
18 #define __PADDLE_H
19
20 /*
21 ====================================================================
22 Create/delete a paddle. x is centered assuming a screen width of
23 640. ball_ammo is the number of additional balls paddle
24 may bring to game.
25 ====================================================================
26 */
27 Paddle* paddle_create(
28 int score, int type, int y, int size, int min_size, int max_size, int ball_ammo );
29 void paddle_delete( Paddle *paddle );
30 void paddle_reset( Paddle *paddle ); /* will clear stats and score too */
31
32 void paddle_freeze( Paddle *paddle, int freeze );
33 void paddle_set_slime( Paddle *paddle, int slime );
34 int paddle_slimy( Paddle *paddle );
35
36 /*
37 ====================================================================
38 Set if paddle attracts boni/mali or none.
39 ====================================================================
40 */
41 void paddle_set_attract( Paddle *paddle, int attract );
42 int paddle_attract_malus( Paddle *paddle );
43 int paddle_attract_bonus( Paddle *paddle );
44 int paddle_check_attract( Paddle *paddle, int type );
45
46 /*
47 ====================================================================
48 (De)activate ghostly behaviour: paddle is only seen when moved at
49 maximum 200ms before.
50 ====================================================================
51 */
52 void paddle_set_invis( Paddle *paddle, int invis );
53 int paddle_solid( Paddle *paddle );
54
55 /*
56 ====================================================================
57 Init paddle resize (the change between wanted_w and w MUST be
58 even (else the paddle shrinks til eternity)
59 ====================================================================
60 */
61 int paddle_init_resize( Paddle *paddle, int c );
62 /*
63 ====================================================================
64 Actually resize paddle and return the -1 for shrinkage and 1
65 for expansion.
66 ====================================================================
67 */
68 int paddle_resize( Paddle *paddle, int ms );
69
70 /*
71 ====================================================================
72 Update paddle resize and fire weapon.
73 ====================================================================
74 */
75 void paddle_update( Paddle *paddle, int ms );
76 /*
77 ====================================================================
78 De/Activate weapon
79 ====================================================================
80 */
81 void weapon_install( Paddle *paddle, int install );
82
83 #endif
84
0 /***************************************************************************
1 shots.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "../client/lbreakout.h"
18 #include "mathfuncs.h"
19 #include "balls.h"
20 #include "bricks.h"
21
22 int shot_w = 10;
23 int shot_h = 10;
24 float shot_v_y = 0.2;
25 extern Game *cur_game;
26
27 int last_shot_fire_x = -1; /* HACK: used to play local sound */
28
29 /*
30 ====================================================================
31 Locals
32 ====================================================================
33 */
34
35 /*
36 ====================================================================
37 Compute target of shot.
38 ====================================================================
39 */
40 void shot_get_target( Shot *shot ) {
41 int mx = (int)(shot->x + 3) / BRICK_WIDTH;
42 int my = (int)(shot->y + 3 + ((shot->dir==1)?5:0) ) / BRICK_HEIGHT;
43 memset( &shot->target, 0, sizeof(Target) );
44 while ( cur_game->bricks[mx][my].id == -1 )
45 my += shot->dir;
46 shot->target.mx = mx; shot->target.my = my;
47 mx = (int)(shot->x + 6) / BRICK_WIDTH;
48 if (mx != shot->target.mx) {
49 my = (int)(shot->y + 3 + ((shot->dir==1)?5:0) ) / BRICK_HEIGHT;
50 while(cur_game->bricks[mx][my].id == -1)
51 my += shot->dir;
52 if (my == shot->target.my)
53 shot->next_too = 1;
54 else
55 if ( ( shot->dir == -1 && my > shot->target.my ) ||
56 ( shot->dir == 1 && my < shot->target.my ) ) {
57 shot->target.mx = mx;
58 shot->target.my = my;
59 shot->next_too = 0;
60 }
61 }
62 shot->target.cur_tm = 0;
63 shot->target.time = abs(
64 (int)((shot->y + 3 +
65 ((shot->dir==1)?5:0) -
66 (shot->target.my * BRICK_HEIGHT + ((shot->dir==-1)?(BRICK_HEIGHT - 1):0) )) /
67 fabs(shot_v_y)) );
68 }
69
70 /*
71 ====================================================================
72 Publics
73 ====================================================================
74 */
75
76 /*
77 ====================================================================
78 Create new shot at position (centered).
79 'signum' of direction determines into which direction the shot
80 vertically goes.
81 ====================================================================
82 */
83 void shot_create( Paddle *paddle )
84 {
85 Shot *shot = calloc( 1, sizeof( Shot ) );
86 shot->cur_fr = 0;
87 shot->paddle = paddle;
88 shot->dir = (paddle->type == PADDLE_TOP) ? 1 : -1;
89 shot->x = paddle->x + ( paddle->w >> 1 ) - (shot_w >> 1);
90 shot->y = paddle->y + ( paddle->h >> 1 ) - (shot_h >> 1);
91 shot->get_target = 1;
92 list_add( cur_game->shots, shot );
93
94 cur_game->mod.fired_shot_count++;
95 last_shot_fire_x = shot->x; /* HACK: used to play local sound */
96 }
97
98 /*
99 ====================================================================
100 Set 'get_target' flag so target is updated next time
101 'shots_update' is called. -1 means to update all shots.
102 ====================================================================
103 */
104 void shots_check_targets( int mx, int my )
105 {
106 Shot *shot;
107 list_reset( cur_game->shots );
108 while ( ( shot = list_next( cur_game->shots ) ) )
109 if ( mx == -1 || (shot->target.mx == mx && shot->target.my == my) )
110 shot->get_target = 1;
111 }
112
113 /*
114 ====================================================================
115 Update position of shots and check if bricks get destroyed.
116 A list of all hit bricks is returned (at maximum
117 PADDLE_WEAPON_AMMO * 4)
118 ====================================================================
119 */
120 void shots_update( int ms )
121 {
122 int i;
123 ListEntry *entry = cur_game->shots->head->next;
124 Shot *shot;
125
126 while ( entry != cur_game->shots->tail ) {
127 shot = entry->item;
128 if ( shot->get_target ) { /* new target? */
129 shot_get_target(shot);
130 shot->get_target = 0;
131 }
132 shot->y += shot->dir * ms * shot_v_y;
133 shot->target.cur_tm += ms;
134 entry = entry->next;
135 /* kill 'out of screen' shots */
136 if ( shot->y + shot_h < 0 || shot->y > 480 ) {
137 shot->paddle->weapon_ammo++; /* give back used shot */
138 list_delete_entry( cur_game->shots, entry->prev );
139 continue;
140 }
141 /* check hits */
142 if (shot->target.cur_tm > shot->target.time) {
143 if ( brick_hit( shot->target.mx, shot->target.my,
144 0, SHR_BY_SHOT, vector_get( 0, shot->dir ),
145 shot->paddle ) ) {
146 shots_check_targets( shot->target.mx, shot->target.my );
147 balls_check_targets( shot->target.mx, shot->target.my );
148 }
149 if (shot->next_too)
150 if ( brick_hit( shot->target.mx + 1, shot->target.my,
151 0, SHR_BY_SHOT, vector_get( 0, shot->dir ),
152 shot->paddle ) ) {
153 shots_check_targets(shot->target.mx + 1, shot->target.my);
154 balls_check_targets( shot->target.mx, shot->target.my );
155 }
156 shot->paddle->weapon_ammo++; /* give back used shot */
157 list_delete_entry( cur_game->shots, entry->prev );
158 continue;
159 }
160 /* in multiplayer we check if we hit the opponent if so we steal
161 him a 1000 points */
162 for ( i = 0; i < cur_game->paddle_count; i++ )
163 if ( cur_game->paddles[i] != shot->paddle )
164 if ( shot->x + shot_w > cur_game->paddles[i]->x )
165 if ( shot->x < cur_game->paddles[i]->x + cur_game->paddles[i]->w )
166 if ( shot->y + shot_h > cur_game->paddles[i]->y )
167 if ( shot->y < cur_game->paddles[i]->y + cur_game->paddles[i]->h ) {
168 if ( (cur_game->paddles[i]->score -= 1000) < 0 )
169 cur_game->paddles[i]->score = 0;
170 shot->paddle->score += 1000;
171 shot->paddle->weapon_ammo++;
172 list_delete_entry( cur_game->shots, entry->prev );
173 break;
174 }
175 }
176 }
177
0 /***************************************************************************
1 shots.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __SHOTS_H
18 #define __SHOTS_H
19
20 /*
21 ====================================================================
22 Create new shot at position (centered).
23 'signum' of direction determines into which direction the shot
24 vertically goes.
25 ====================================================================
26 */
27 void shot_create( Paddle *paddle );
28
29 /*
30 ====================================================================
31 Set 'get_target' flag so target is updated next time
32 'shots_update' is called. -1 means to update all shots.
33 ====================================================================
34 */
35 void shots_check_targets( int mx, int my );
36
37 /*
38 ====================================================================
39 Update position of shots and check if bricks get destroyed.
40 A list of all hit bricks is returned (at maximum
41 PADDLE_WEAPON_AMMO * 4)
42 ====================================================================
43 */
44 void shots_update( int ms );
45
46 #endif
47
0 DEFS = @DEFS@ @inst_flag@ @audio_flag@
1
2 noinst_LIBRARIES = libGui.a
3
4 libGui_a_SOURCES = list.c stk.c \
5 gui.c gui_widget.c gui_theme.c \
6 gui_box.c gui_button.c gui_label.c gui_icon.c \
7 gui_radiogroup.c gui_scrollbar.c gui_progressbar.c \
8 gui_list.c gui_edit.c gui_spinbutton.c
9
10 EXTRA_DIST = list.h stk.h \
11 gui.h gui_widget.h gui_theme.h \
12 gui_box.h gui_button.h gui_label.h gui_icon.h \
13 gui_radiogroup.h gui_scrollbar.h gui_progressbar.h \
14 gui_list.h gui_edit.h gui_spinbutton.h
15
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 DEFS = @DEFS@ @inst_flag@ @audio_flag@
92
93 noinst_LIBRARIES = libGui.a
94
95 libGui_a_SOURCES = list.c stk.c gui.c gui_widget.c gui_theme.c gui_box.c gui_button.c gui_label.c gui_icon.c gui_radiogroup.c gui_scrollbar.c gui_progressbar.c gui_list.c gui_edit.c gui_spinbutton.c
96
97
98 EXTRA_DIST = list.h stk.h gui.h gui_widget.h gui_theme.h gui_box.h gui_button.h gui_label.h gui_icon.h gui_radiogroup.h gui_scrollbar.h gui_progressbar.h gui_list.h gui_edit.h gui_spinbutton.h
99
100 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
101 CONFIG_HEADER = ../config.h
102 CONFIG_CLEAN_FILES =
103 LIBRARIES = $(noinst_LIBRARIES)
104
105 CPPFLAGS = @CPPFLAGS@
106 LDFLAGS = @LDFLAGS@
107 LIBS = @LIBS@
108 libGui_a_LIBADD =
109 libGui_a_OBJECTS = list.o stk.o gui.o gui_widget.o gui_theme.o \
110 gui_box.o gui_button.o gui_label.o gui_icon.o gui_radiogroup.o \
111 gui_scrollbar.o gui_progressbar.o gui_list.o gui_edit.o \
112 gui_spinbutton.o
113 AR = ar
114 CFLAGS = @CFLAGS@
115 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
116 CCLD = $(CC)
117 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
118 DIST_COMMON = Makefile.am Makefile.in
119
120
121 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
122
123 TAR = tar
124 GZIP_ENV = --best
125 SOURCES = $(libGui_a_SOURCES)
126 OBJECTS = $(libGui_a_OBJECTS)
127
128 all: all-redirect
129 .SUFFIXES:
130 .SUFFIXES: .S .c .o .s
131 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
132 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps gui/Makefile
133
134 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
135 cd $(top_builddir) \
136 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
137
138
139 mostlyclean-noinstLIBRARIES:
140
141 clean-noinstLIBRARIES:
142 -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
143
144 distclean-noinstLIBRARIES:
145
146 maintainer-clean-noinstLIBRARIES:
147
148 .c.o:
149 $(COMPILE) -c $<
150
151 .s.o:
152 $(COMPILE) -c $<
153
154 .S.o:
155 $(COMPILE) -c $<
156
157 mostlyclean-compile:
158 -rm -f *.o core *.core
159
160 clean-compile:
161
162 distclean-compile:
163 -rm -f *.tab.c
164
165 maintainer-clean-compile:
166
167 libGui.a: $(libGui_a_OBJECTS) $(libGui_a_DEPENDENCIES)
168 -rm -f libGui.a
169 $(AR) cru libGui.a $(libGui_a_OBJECTS) $(libGui_a_LIBADD)
170 $(RANLIB) libGui.a
171
172 tags: TAGS
173
174 ID: $(HEADERS) $(SOURCES) $(LISP)
175 list='$(SOURCES) $(HEADERS)'; \
176 unique=`for i in $$list; do echo $$i; done | \
177 awk ' { files[$$0] = 1; } \
178 END { for (i in files) print i; }'`; \
179 here=`pwd` && cd $(srcdir) \
180 && mkid -f$$here/ID $$unique $(LISP)
181
182 TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
183 tags=; \
184 here=`pwd`; \
185 list='$(SOURCES) $(HEADERS)'; \
186 unique=`for i in $$list; do echo $$i; done | \
187 awk ' { files[$$0] = 1; } \
188 END { for (i in files) print i; }'`; \
189 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
190 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
191
192 mostlyclean-tags:
193
194 clean-tags:
195
196 distclean-tags:
197 -rm -f TAGS ID
198
199 maintainer-clean-tags:
200
201 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
202
203 subdir = gui
204
205 distdir: $(DISTFILES)
206 @for file in $(DISTFILES); do \
207 d=$(srcdir); \
208 if test -d $$d/$$file; then \
209 cp -pr $$d/$$file $(distdir)/$$file; \
210 else \
211 test -f $(distdir)/$$file \
212 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
213 || cp -p $$d/$$file $(distdir)/$$file || :; \
214 fi; \
215 done
216 gui.o: gui.c gui.h gui_widget.h list.h stk.h gui_theme.h gui_box.h \
217 gui_label.h gui_icon.h gui_button.h gui_radiogroup.h \
218 gui_progressbar.h gui_scrollbar.h gui_edit.h gui_list.h \
219 gui_spinbutton.h
220 gui_box.o: gui_box.c gui_widget.h list.h stk.h gui_theme.h gui_box.h
221 gui_button.o: gui_button.c gui_widget.h list.h stk.h gui_theme.h \
222 gui_button.h
223 gui_edit.o: gui_edit.c gui_widget.h list.h stk.h gui_theme.h gui_edit.h
224 gui_icon.o: gui_icon.c gui_widget.h list.h stk.h gui_theme.h gui_icon.h
225 gui_label.o: gui_label.c gui_widget.h list.h stk.h gui_theme.h \
226 gui_label.h
227 gui_list.o: gui_list.c gui_widget.h list.h stk.h gui_theme.h \
228 gui_button.h gui_scrollbar.h gui_list.h
229 gui_progressbar.o: gui_progressbar.c gui_widget.h list.h stk.h \
230 gui_theme.h gui_progressbar.h
231 gui_radiogroup.o: gui_radiogroup.c gui_widget.h list.h stk.h gui_theme.h \
232 gui_radiogroup.h
233 gui_scrollbar.o: gui_scrollbar.c gui_widget.h list.h stk.h gui_theme.h \
234 gui_button.h gui_scrollbar.h
235 gui_spinbutton.o: gui_spinbutton.c gui_widget.h list.h stk.h gui_theme.h \
236 gui_spinbutton.h gui_button.h gui_edit.h
237 gui_theme.o: gui_theme.c gui_theme.h stk.h
238 gui_widget.o: gui_widget.c gui_widget.h list.h stk.h gui_theme.h
239 list.o: list.c list.h
240 main.o: main.c
241 png.o: png.c
242 sdl.o: sdl.c sdl.h png.h
243 stk.o: stk.c stk.h
244 tools.o: tools.c tools.h
245
246 info-am:
247 info: info-am
248 dvi-am:
249 dvi: dvi-am
250 check-am: all-am
251 check: check-am
252 installcheck-am:
253 installcheck: installcheck-am
254 install-exec-am:
255 install-exec: install-exec-am
256
257 install-data-am:
258 install-data: install-data-am
259
260 install-am: all-am
261 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
262 install: install-am
263 uninstall-am:
264 uninstall: uninstall-am
265 all-am: Makefile $(LIBRARIES)
266 all-redirect: all-am
267 install-strip:
268 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
269 installdirs:
270
271
272 mostlyclean-generic:
273
274 clean-generic:
275
276 distclean-generic:
277 -rm -f Makefile $(CONFIG_CLEAN_FILES)
278 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
279
280 maintainer-clean-generic:
281 mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
282 mostlyclean-tags mostlyclean-generic
283
284 mostlyclean: mostlyclean-am
285
286 clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
287 mostlyclean-am
288
289 clean: clean-am
290
291 distclean-am: distclean-noinstLIBRARIES distclean-compile \
292 distclean-tags distclean-generic clean-am
293
294 distclean: distclean-am
295
296 maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
297 maintainer-clean-compile maintainer-clean-tags \
298 maintainer-clean-generic distclean-am
299 @echo "This command is intended for maintainers to use;"
300 @echo "it deletes files that may require special tools to rebuild."
301
302 maintainer-clean: maintainer-clean-am
303
304 .PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
305 clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
306 mostlyclean-compile distclean-compile clean-compile \
307 maintainer-clean-compile tags mostlyclean-tags distclean-tags \
308 clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
309 check-am installcheck-am installcheck install-exec-am install-exec \
310 install-data-am install-data install-am install uninstall-am uninstall \
311 all-redirect all-am all installdirs mostlyclean-generic \
312 distclean-generic clean-generic maintainer-clean-generic clean \
313 mostlyclean distclean maintainer-clean
314
315
316 # Tell versions [3.59,3.63) of GNU make to not export all variables.
317 # Otherwise a system limit (for SysV at least) may be exceeded.
318 .NOEXPORT:
0 /***************************************************************************
1 gui.c - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui.h"
20
21 extern int stk_quit_request;
22 extern GuiTheme *gui_theme;
23 extern GuiWidget *gui_clicked_widget;
24 extern GuiWidget *gui_focused_widget;
25 extern GuiWidget *gui_key_widget;
26
27 /*
28 ====================================================================
29 This is a list of all root widgets (no parent) created. It is used
30 to delete all widgets in gui_finalize().
31 ====================================================================
32 */
33 List *gui_root_stack = 0;
34 /*
35 ====================================================================
36 This is a list of all visible root widgets updated by
37 gui_widget_show(). The upper most root widget will handle
38 events first.
39 ====================================================================
40 */
41 List *gui_visible_stack = 0;
42 /*
43 ====================================================================
44 This is a list of all widgets that enabled the GUI_TIME_PASSED
45 event on creation.
46 ====================================================================
47 */
48 List *gui_timed_stack = 0;
49
50
51 /*
52 ====================================================================
53 LOCALS
54 ====================================================================
55 */
56
57 /*
58 ====================================================================
59 Event filter for mouse motion. Update 'gui_motion_event' with
60 the latest motion and pass just the very first motion event to
61 the queue (so we know that it occured)
62 ====================================================================
63 */
64 SDL_EventFilter gui_old_event_filter = 0;
65 int gui_uses_event_filter = 0;
66 SDL_Event gui_sdl_motion_event;
67 int gui_event_filter( const SDL_Event *event )
68 {
69 int xrel, yrel;
70 if ( event->type == SDL_MOUSEMOTION ) {
71 if ( gui_sdl_motion_event.type == SDL_NOEVENT ) {
72 /* first occurence */
73 gui_sdl_motion_event = *event;
74 }
75 else {
76 /* already queued */
77 xrel = gui_sdl_motion_event.motion.xrel;
78 yrel = gui_sdl_motion_event.motion.yrel;
79 gui_sdl_motion_event = *event;
80 gui_sdl_motion_event.motion.xrel += xrel;
81 gui_sdl_motion_event.motion.yrel += yrel;
82 return 0;
83 }
84 }
85 return 1;
86 }
87
88 /*
89 ====================================================================
90 Check all visible root widgets and update the focus by
91 assuming the mouse pointer at the position of the passed
92 GUI_MOTION event which was not necessarily initiated from
93 an SDL event thus gui_update_focus() can be used to
94 update the focus if a widget grabbed focus on button pressed.
95 ====================================================================
96 */
97 void gui_update_focus( GuiEvent *gui_event )
98 {
99 ListEntry *entry;
100 GuiWidget *widget = 0;
101 GuiWidget *next, *new_focus = 0;
102 /* check all root widgets for new focus */
103 new_focus = 0;
104 entry = gui_visible_stack->tail->prev;
105 while ( entry != gui_visible_stack->head ) {
106 widget = (GuiWidget*)entry->item;
107 /* clear widget->focused_widget */
108 if ( ( next = widget->focused_widget ) ) {
109 while ( next ) {
110 next->focused = 0;
111 next = next->parent;
112 }
113 widget->focused_widget = 0;
114 }
115 /* get new focused_widget */
116 gui_widget_update_focus( widget,
117 gui_event->motion.x, gui_event->motion.y,
118 &widget->focused_widget );
119 /* if we have a focused widget this is either
120 our current or a new focus */
121 if ( widget->focused_widget ) {
122 new_focus = widget->focused_widget;
123 break;
124 }
125 /* if 'grab_input' is set we don't check
126 lower root widgets */
127 if ( widget->grab_input )
128 break;
129 /* next root widget */
130 entry = entry->prev;
131 }
132 /* check relation new_focus/gui_focused_widget */
133 if ( new_focus == gui_focused_widget ) {
134 if ( !new_focus ) /* no focus at all */
135 return;
136 /* unchanged focus thus motion event */
137 gui_widget_handle_event(
138 gui_focused_widget, gui_event );
139 }
140 else {
141 if ( gui_focused_widget ) {
142 /* focus out event */
143 gui_event->type = GUI_FOCUS_OUT;
144 next = gui_focused_widget;
145 while ( next ) {
146 next->focused = 0;
147 next = next->parent;
148 }
149 gui_widget_handle_event(
150 gui_focused_widget, gui_event );
151 gui_focused_widget = 0;
152 }
153 if ( new_focus ) {
154 /* focus in event */
155 gui_focused_widget = new_focus;
156 gui_event->type = GUI_FOCUS_IN;
157 gui_widget_handle_event(
158 gui_focused_widget, gui_event );
159 }
160 }
161 }
162
163 /*
164 ====================================================================
165 Handle an SDL event for the visible root widgets and store all
166 nescessary update rects. If the event was handled by a widget
167 the user_event_handler is called if one has been installed.
168 Returns True if the event was handled by the GUI.
169 ====================================================================
170 */
171 static int gui_handle_event( SDL_Event *sdl_event )
172 {
173 GuiWidget *widget = 0;
174 GuiEvent gui_event;
175
176 switch ( sdl_event->type ) {
177 case SDL_QUIT:
178 stk_quit_request = 1;
179 return 1;
180 case SDL_KEYUP:
181 case SDL_KEYDOWN:
182 /* a key event is either processed by the
183 gui_key_widget or gui_focused_widget */
184 if ( gui_key_widget )
185 widget = gui_key_widget;
186 else
187 widget = gui_focused_widget;
188 if ( widget ) {
189 gui_event_init( &gui_event, sdl_event );
190 gui_widget_handle_event( widget, &gui_event );
191 return 1;
192 }
193 break;
194 case SDL_MOUSEBUTTONDOWN:
195 /* if our widget is focused update gui_key_widget */
196 if ( !gui_focused_widget ) break;
197 gui_clicked_widget = gui_focused_widget;
198 widget = gui_focused_widget;
199 widget->pressed = 1;
200 if ( widget->grab_keys ) {
201 if ( gui_key_widget )
202 gui_key_widget->default_event_handler(
203 gui_key_widget,
204 gui_event_get_simple( GUI_FOCUS_OUT ) );
205 gui_key_widget = widget;
206 }
207 gui_event_init( &gui_event, sdl_event );
208 gui_widget_handle_event( widget, &gui_event );
209 return 1;
210 case SDL_MOUSEBUTTONUP:
211 /* if clicked_widget grabbed focus we need to
212 update the focus by a fake motion event. */
213 if ( gui_clicked_widget )
214 if ( gui_clicked_widget->pressed )
215 if ( gui_clicked_widget->grab_focus ) {
216 memset( &gui_event, 0, sizeof( gui_event ) );
217 gui_event.type = GUI_MOTION;
218 gui_event.motion.x = sdl_event->button.x;
219 gui_event.motion.y = sdl_event->button.y;
220 /* we don't set buttons and relative position
221 in this fake event so this might cause errors
222 if the 'focus grabbing' widget requires
223 these values. however at this point the
224 only case we need 'grab_focus' is for
225 scrollbar track buttons. so if this ever
226 changes don't forget to drop by. ;-) */
227 gui_update_focus( &gui_event );
228 }
229 /* if our focused widget has 'pressed' True
230 this becomes a CLICKED event. clear 'pressed'
231 flag in any case*/
232 if ( !gui_focused_widget ) {
233 if ( gui_clicked_widget )
234 gui_clicked_widget->pressed = 0;
235 break;
236 }
237 gui_event_init( &gui_event, sdl_event );
238 widget = gui_focused_widget;
239 if ( widget->pressed )
240 gui_event.type = GUI_CLICKED;
241 else
242 gui_event.type = GUI_BUTTON_RELEASED;
243 if ( gui_clicked_widget )
244 gui_clicked_widget->pressed = 0;
245 gui_widget_handle_event( widget, &gui_event );
246 return 1;
247 case SDL_MOUSEMOTION:
248 /* if we use the improved event filter check for
249 the latest motion event in gui_motion_event */
250 if ( gui_uses_event_filter ) {
251 gui_event_init( &gui_event, &gui_sdl_motion_event );
252 gui_sdl_motion_event.type = SDL_NOEVENT;
253 }
254 else
255 gui_event_init( &gui_event, sdl_event );
256 /* if clicked widget grabs input do not update the
257 focus but pass the event directly to clicked_widget */
258 if ( gui_clicked_widget )
259 if ( gui_clicked_widget->pressed )
260 if ( gui_clicked_widget->grab_focus ) {
261 gui_widget_handle_event( gui_clicked_widget, &gui_event );
262 break;
263 }
264 /* update the focus and sent FOCUS_IN, FOCUS_OUT,
265 MOTION events */
266 gui_update_focus( &gui_event );
267 break;
268 }
269 return 0; /* grab input later */
270 }
271
272 /*
273 ====================================================================
274 PUBLICS
275 ====================================================================
276 */
277
278 /*
279 ====================================================================
280 Initiate the GUI and load the theme either from stk's surface
281 path or an absolute position. This must be done before any widget
282 is created. gui_init() installs gui_finalize() as exit function.
283 ====================================================================
284 */
285 void gui_init( char *theme_path )
286 {
287 /* load theme */
288 gui_theme = gui_theme_load( theme_path );
289 /* all root widgets created. the list is not AUTO_DELETE
290 to allow direct usage of gui_widget_delete() as well. */
291 gui_root_stack = list_create(
292 LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
293 /* visible stack stores pointers to existing root widgets */
294 gui_visible_stack = list_create(
295 LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
296 /* timed stack stores pointers to existing widgets */
297 gui_timed_stack = list_create(
298 LIST_NO_AUTO_DELETE, LIST_NO_CALLBACK );
299 /* install gui_finalize() */
300 atexit( gui_finalize );
301 }
302
303 /*
304 ====================================================================
305 Finalize GUI and free any memory allocated by gui_init(). Also
306 delete all widgets that were not destroyed at this point.
307 ====================================================================
308 */
309 void gui_finalize( void )
310 {
311 GuiWidget *widget;
312 if ( gui_root_stack ) {
313 list_reset( gui_root_stack );
314 while ( ( widget = list_next( gui_root_stack ) ) )
315 gui_widget_delete( &widget );
316 list_delete( gui_root_stack );
317 gui_root_stack = 0;
318 }
319 if ( gui_visible_stack ) {
320 list_delete( gui_visible_stack );
321 gui_visible_stack = 0;
322 }
323 if ( gui_timed_stack ) {
324 list_delete( gui_timed_stack );
325 gui_timed_stack = 0;
326 }
327 gui_theme_delete( &gui_theme );
328 printf( "GUI finalized\n" );
329 }
330
331 /*
332 ====================================================================
333 Handle SDL and time event for visible root widgets.
334 If 'event' is not NULL and it is handled by one of the root widgets
335 True is returned or False otherwise. If a widget within this queue
336 has 'grab_input' set True 'event' is not handled by lower level
337 widgets and True is returned.
338 'ms' is the amount of milliseconds passed since the last call from
339 gui_dispatch_event(). If 'ms' > 0 a GUI_TIME_PASSED event is sent
340 to all widgets that enabled the GUI_TIME_PASSED event.
341 The GUI_TIME_PASSED event is send regardless of 'grab_input'.
342
343 WARNING: If a root widget closes itself it's okay but if the
344 previous widget in visible_stack is closed the entry pointer
345 becomes invalid when handling the SDL event. FIXME
346 ====================================================================
347 */
348 int gui_dispatch_event( SDL_Event *sdl_event, int ms )
349 {
350 ListEntry *entry;
351 GuiEvent gui_event;
352 GuiWidget *widget;
353 int ret = 0;
354 /* timer event */
355 if ( ms > 0 ) {
356 /* of all edits only one needs to blink it's
357 cursor and handle a pressed key so we by-pass
358 the clean way of raising a GUI_TIME_PASSED
359 event and update this edit directly. yes, this
360 is a hack but it speeds up dispatching and is
361 within the GUI. no one is hurt. */
362 widget = gui_key_widget;
363 if ( !widget ) widget = gui_focused_widget;
364 if ( widget && widget->type == GUI_EDIT )
365 gui_edit_update( widget, ms );
366 /* GUI_TIME_PASSED event */
367 gui_event.type = GUI_TIME_PASSED;
368 gui_event.time.ms = ms;
369 entry = gui_timed_stack->head->next;
370 while ( entry != gui_timed_stack->tail ) {
371 widget = (GuiWidget*)entry->item;
372 if ( !widget->visible ) continue;
373 gui_widget_call_user_event_handler(
374 widget, &gui_event );
375 entry = entry->next;
376 }
377 }
378 /* sdl event */
379 if ( sdl_event )
380 ret = gui_handle_event( sdl_event );
381 return ret;
382 }
383
384 /*
385 ====================================================================
386 Run all visible root widgets until the 'master' widget is closed.
387 If there is no root widget open gui_run() will immediately exit.
388 If 'master' is 0 the gui is run until all root widgets are closed.
389 ====================================================================
390 */
391 void gui_run( GuiWidget *master )
392 {
393 SDL_Event event;
394 int ms;
395
396 stk_timer_reset();
397 while ( 1 ) {
398 /* break conditions */
399 if ( stk_quit_request ) break;
400 if ( master ) {
401 if ( !master->visible ) break; }
402 else
403 if ( gui_visible_stack->count == 0 ) break;
404 /* get time */
405 ms = stk_timer_get_time();
406 /* handle event */
407 if ( SDL_PollEvent( &event ) )
408 gui_dispatch_event( &event, ms );
409 else
410 gui_dispatch_event( 0, ms );
411 /* update display */
412 stk_display_update( STK_UPDATE_RECTS );
413 /* wait some time */
414 SDL_Delay( 5 );
415 }
416 }
417
418 /*
419 ====================================================================
420 Install a special event filter to improve usage of scrollbars.
421 gui_disable_event_filter() restores the previous filter.
422 ====================================================================
423 */
424 void gui_enable_event_filter()
425 {
426 /* already in use? */
427 if ( SDL_GetEventFilter() == gui_event_filter )
428 return;
429 /* install */
430 gui_old_event_filter = SDL_GetEventFilter();
431 SDL_SetEventFilter( gui_event_filter );
432 gui_sdl_motion_event.type = SDL_NOEVENT;
433 gui_uses_event_filter = 1;
434 }
435 void gui_disable_event_filter()
436 {
437 SDL_SetEventFilter( gui_old_event_filter );
438 gui_uses_event_filter = 0;
439 }
0 /***************************************************************************
1 gui.h - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_H
18 #define __GUI_H
19
20 #include "gui_widget.h"
21 #include "gui_box.h"
22 #include "gui_label.h"
23 #include "gui_icon.h"
24 #include "gui_button.h"
25 #include "gui_radiogroup.h"
26 #include "gui_progressbar.h"
27 #include "gui_scrollbar.h"
28 #include "gui_edit.h"
29 #include "gui_list.h"
30 #include "gui_spinbutton.h"
31
32 /*
33 ====================================================================
34 GUI
35 ====================================================================
36 */
37
38 /*
39 ====================================================================
40 Initiate the GUI and load the theme either from stk's surface
41 path or an absolute position. This must be done before any widget
42 is created. gui_init() installs gui_finalize() as exit function.
43 ====================================================================
44 */
45 void gui_init( char *theme_path );
46
47 /*
48 ====================================================================
49 Finalize GUI and free any memory allocated by gui_init(). Also
50 delete all widgets that were not destroyed at this point.
51 ====================================================================
52 */
53 void gui_finalize( void );
54
55 /*
56 ====================================================================
57 Handle SDL and time event for visible root widgets.
58 If 'event' is not NULL and it is handled by one of the root widgets
59 True is returned or False otherwise. If a widget within this queue
60 has 'grab_input' set True 'event' is not handled by lower level
61 widgets and True is returned.
62 'ms' is the amount of milliseconds passed since the last call from
63 gui_dispatch_event(). If 'ms' > 0 a GUI_TIME_PASSED event is sent
64 to all widgets that enabled the GUI_TIME_PASSED event.
65 The GUI_TIME_PASSED event is send regardless of 'grab_input'.
66 ====================================================================
67 */
68 int gui_dispatch_event( SDL_Event *event, int ms );
69
70 /*
71 ====================================================================
72 Run all visible root widgets until the 'master' widget is closed.
73 If there is no root widget open gui_run() will immediately exit.
74 If 'master' is 0 the gui is run until all root widgets are closed.
75 ====================================================================
76 */
77 void gui_run( GuiWidget *master );
78
79 /*
80 ====================================================================
81 Install a special event filter to improve usage of scrollbars.
82 gui_disable_event_filter() restores the previous filter.
83 ====================================================================
84 */
85 void gui_enable_event_filter();
86 void gui_disable_event_filter();
87
88 #endif
0 /***************************************************************************
1 gui_box.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include "gui_widget.h"
19 #include "gui_box.h"
20
21 extern GuiTheme *gui_theme;
22 extern SDL_Surface *stk_display;
23
24 /*
25 ====================================================================
26 LOCALS
27 ====================================================================
28 */
29
30 /*
31 ====================================================================
32 Default event handler
33 ====================================================================
34 */
35 static void default_event_handler(
36 GuiWidget *widget, GuiEvent *event )
37 {
38 switch ( event->type ) {
39 case GUI_DESTROY:
40 break;
41 case GUI_DRAW:
42 /* display surface */
43 stk_surface_blit(
44 widget->surface, 0, 0, -1, -1,
45 stk_display,
46 widget->screen_region.x,
47 widget->screen_region.y );
48 break;
49 }
50 }
51
52 /*
53 ====================================================================
54 PUBLICS
55 ====================================================================
56 */
57
58 /*
59 ====================================================================
60 Create a box widget that can be used to contain various other
61 widgets of any kind. If 'grab_input' is True and this widget is
62 opened as a root widget it will not pass unhandled events to the
63 lower-level root widgets thus it blocks events.
64 ====================================================================
65 */
66 GuiWidget* gui_box_create(
67 GuiWidget *parent, int x, int y, int width, int height,
68 void (*user_event_handler)(GuiWidget*,GuiEvent*),
69 int grab_input )
70 {
71 GuiWidget *widget = gui_widget_create(
72 parent, GUI_BOX, x, y, width, height,
73 default_event_handler, user_event_handler );
74 /* create surface, wallpaper and frame it */
75 widget->surface = stk_surface_create(
76 SDL_SWSURFACE, width, height );
77 SDL_SetColorKey( widget->surface, 0,0 );
78 stk_surface_apply_wallpaper( widget->surface, 0,0,-1,-1,
79 gui_theme->box_wallpaper, -1 );
80 widget->border = stk_surface_apply_frame(
81 widget->surface, 0, 0, -1, -1,
82 (parent==0)?gui_theme->box_frame:gui_theme->widget_frame );
83 /* various */
84 widget->width -= 2 * widget->border;
85 widget->height -= 2 * widget->border;
86 widget->grab_input = grab_input;
87 /* done */
88 return widget;
89 }
0 /***************************************************************************
1 gui_box.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_BOX_H
18 #define __GUI_BOX_H
19
20 /*
21 ====================================================================
22 Create a box widget that can be used to contain various other
23 widgets of any kind. If 'grab_input' is True and this widget is
24 opened as a root widget it will not pass unhandled events to the
25 lower-level root widgets thus it blocks events.
26 ====================================================================
27 */
28 GuiWidget* gui_box_create(
29 GuiWidget *parent, int x, int y, int width, int height,
30 void (*user_event_handler)(GuiWidget*,GuiEvent*),
31 int grab_input );
32
33 #endif
34
0 /***************************************************************************
1 gui_button.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui_widget.h"
20 #include "gui_button.h"
21
22 extern GuiTheme *gui_theme;
23 extern SDL_Surface *stk_display;
24
25 /*
26 ====================================================================
27 LOCALS
28 ====================================================================
29 */
30
31 /*
32 ====================================================================
33 Default event handler
34 ====================================================================
35 */
36 static void default_event_handler(
37 GuiWidget *widget, GuiEvent *event )
38 {
39 switch ( event->type ) {
40 case GUI_DESTROY:
41 break;
42 case GUI_DRAW:
43 /* the button surface provides for states in a
44 vertical order: normal, focused, clicked,
45 inactive */
46 if ( !widget->active ) {
47 stk_surface_blit( widget->surface,
48 0, (widget->screen_region.h<<1) +
49 widget->screen_region.h,
50 -1, widget->screen_region.h,
51 stk_display,
52 widget->screen_region.x,
53 widget->screen_region.y );
54 break;
55 }
56 if ( widget->focused ) {
57 if ( widget->pressed )
58 stk_surface_blit( widget->surface,
59 0, widget->screen_region.h<<1,
60 -1, widget->screen_region.h,
61 stk_display,
62 widget->screen_region.x,
63 widget->screen_region.y );
64 else
65 stk_surface_blit( widget->surface,
66 0, widget->screen_region.h,
67 -1, widget->screen_region.h,
68 stk_display,
69 widget->screen_region.x,
70 widget->screen_region.y );
71 }
72 else
73 stk_surface_blit( widget->surface, 0, 0,
74 -1, widget->screen_region.h,
75 stk_display,
76 widget->screen_region.x,
77 widget->screen_region.y );
78 break;
79 case GUI_BUTTON_PRESSED:
80 stk_sound_play( gui_theme->click_sound );
81 case GUI_ACTIVATED:
82 case GUI_DEACTIVATED:
83 case GUI_BUTTON_RELEASED:
84 case GUI_CLICKED:
85 case GUI_FOCUS_IN:
86 case GUI_FOCUS_OUT:
87 gui_widget_draw( widget );
88 break;
89 }
90 }
91
92 /*
93 ====================================================================
94 PUBLICS
95 ====================================================================
96 */
97
98 /*
99 ====================================================================
100 Create a button that may contain an icon and a text. Both are
101 displayed centered.
102 ====================================================================
103 */
104 GuiWidget* gui_button_create(
105 GuiWidget *parent, int x, int y, int width, int height,
106 void (*user_event_handler)(GuiWidget*,GuiEvent*),
107 SDL_Surface *icon, int ix, int iy, int iw, int ih,
108 char *caption )
109 {
110 int offset, i;
111 GuiWidget *widget = gui_widget_create(
112 parent, GUI_BUTTON, x, y, width, height,
113 default_event_handler, user_event_handler );
114 /* events */
115 gui_widget_enable_event( widget, GUI_CLICKED );
116 /* basic surface */
117 /* four different states in a vertical order:
118 NORMAL: normal wallpaper + normal button frame
119 FOCUSED: focus wallpaper + normal button frame
120 CLICKED: focus wallpaper + clicked button frame
121 INACTIVE: grayed NORMAL
122 */
123 widget->surface = stk_surface_create(
124 SDL_SWSURFACE, width, height * 4 );
125 /* NORMAL */
126 stk_surface_apply_wallpaper(
127 widget->surface, 0,0,-1,height,
128 gui_theme->button_wallpaper_normal, -1 );
129 SDL_SetColorKey( widget->surface, 0,0 );
130 widget->border = stk_surface_apply_frame(
131 widget->surface, 0,0,-1,height,
132 gui_theme->button_frame_normal );
133 /* FOCUSED */
134 stk_surface_apply_wallpaper(
135 widget->surface, 0,height,-1,height,
136 gui_theme->button_wallpaper_focused, -1 );
137 stk_surface_apply_frame(
138 widget->surface, 0,height,-1,height,
139 gui_theme->button_frame_normal );
140 /* CLICKED */
141 stk_surface_apply_wallpaper(
142 widget->surface,
143 widget->border, widget->border + 2 * height,
144 -1,height,
145 gui_theme->button_wallpaper_focused, -1 );
146 stk_surface_apply_frame(
147 widget->surface, 0,2*height,-1,height,
148 gui_theme->button_frame_clicked );
149 /* INACTIVE */
150 stk_surface_apply_wallpaper(
151 widget->surface, 0,height*3,-1,height,
152 gui_theme->button_wallpaper_normal, -1 );
153 stk_surface_apply_frame(
154 widget->surface, 0,height*3,-1,height,
155 gui_theme->button_frame_normal );
156 stk_surface_gray( widget->surface,
157 0, height*3, width, height, 0 );
158 /* size w/o border */
159 widget->width -= 2 * widget->border;
160 widget->height -= 2 * widget->border;
161 /* add label and icon */
162 offset = width;
163 if ( icon )
164 offset -= iw;
165 if ( caption )
166 offset -= stk_font_string_width(
167 gui_theme->button_font, caption );
168 offset /= 2;
169 /* icon */
170 if ( icon ) {
171 for ( i = 0; i < 4; i++ )
172 stk_surface_alpha_blit( icon, ix, iy, iw, ih,
173 widget->surface,
174 offset + (i==2)*widget->border/2,
175 i * height + (height - ih) / 2 +
176 (i==2)*widget->border/2,
177 (i==3)?128:SDL_ALPHA_OPAQUE );
178 offset += iw;
179 }
180 if ( caption ) {
181 gui_theme->button_font->align = STK_FONT_ALIGN_CENTER_Y;
182 for ( i = 0; i < 4; i++ )
183 stk_font_write( gui_theme->button_font,
184 widget->surface,
185 offset + (i==2)*widget->border/2,
186 i * height + height / 2 +
187 (i==2)*widget->border/2,
188 (i==3)?128:SDL_ALPHA_OPAQUE, caption );
189 }
190 /* done */
191 return widget;
192 }
0 /***************************************************************************
1 gui_button.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_BUTTON_H
18 #define __GUI_BUTTON_H
19
20 /*
21 ====================================================================
22 Create a button that may contain an icon and a text. Both are
23 displayed centered.
24 ====================================================================
25 */
26 GuiWidget* gui_button_create(
27 GuiWidget *parent, int x, int y, int width, int height,
28 void (*user_event_handler)(GuiWidget*,GuiEvent*),
29 SDL_Surface *icon, int ix, int iy, int iw, int ih,
30 char *caption );
31
32 #endif
0 /***************************************************************************
1 gui_edit.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui_widget.h"
20 #include "gui_edit.h"
21
22 extern GuiTheme *gui_theme;
23 extern SDL_Surface *stk_display;
24 extern GuiWidget *gui_key_widget;
25
26 /*
27 ====================================================================
28 LOCALS
29 ====================================================================
30 */
31
32 /*
33 ====================================================================
34 Global edit variables that are used by the focused widget and
35 are global as there is only one keyboard they can be related
36 with.
37 ====================================================================
38 */
39 static int gui_edit_blink_time = 0; /* used to toggle gui_edit_blink
40 twice a second */
41 static int gui_edit_blink = 0; /* if true a cursor is displayed at
42 the edit position */
43 static int gui_edit_delay = 0;
44 static int gui_edit_interval = 0; /* after a delay of 300 ms the
45 keyevent is repeated at an interval of 100 */
46 static int gui_edit_keysym = -1; /* last pressed keysym */
47 static int gui_edit_unicode = -1; /* last pressed unicode */
48
49 /* FORWARDED */
50 static void gui_edit_handle_key(
51 GuiWidget *widget, int keysym, int unicode );
52 static int gui_edit_adjust_cursor( GuiWidget *widget, int offset );
53
54 /*
55 ====================================================================
56 Default event handler
57 ====================================================================
58 */
59 static void default_event_handler(
60 GuiWidget *widget, GuiEvent *event )
61 {
62 char *ptr;
63 int px, py, i;
64 switch ( event->type ) {
65 case GUI_DESTROY:
66 if ( widget->spec.edit.buffer )
67 free( widget->spec.edit.buffer );
68 if ( widget->spec.edit.display_buffer )
69 free( widget->spec.edit.display_buffer );
70 break;
71 case GUI_DRAW:
72 /* display surface */
73 stk_surface_blit(
74 widget->surface, 0, 0, -1, -1,
75 stk_display,
76 widget->screen_region.x,
77 widget->screen_region.y );
78 /* add text */
79 gui_theme->edit_font->align = STK_FONT_ALIGN_LEFT;
80 ptr = widget->spec.edit.display_buffer;
81 px = widget->screen_region.x + widget->border;
82 py = widget->screen_region.y + widget->border +
83 widget->spec.edit.y_offset;
84 for ( i = 0; i < widget->spec.edit.height;
85 i++, py += gui_theme->edit_font->height,
86 ptr += widget->spec.edit.width + 1 )
87 stk_font_write( gui_theme->edit_font,
88 stk_display, px, py, -1, ptr );
89 /* add cursor */
90 if ( widget == gui_key_widget || widget->focused )
91 if ( gui_edit_blink )
92 stk_surface_fill( stk_display,
93 px + widget->spec.edit.x *
94 gui_theme->edit_font->width,
95 widget->screen_region.y +
96 widget->border + widget->spec.edit.y_offset +
97 widget->spec.edit.y *
98 gui_theme->edit_font->height,
99 1, gui_theme->edit_font->height,
100 0xffffff );
101 break;
102 case GUI_KEY_PRESSED:
103 if ( gui_edit_keysym != event->key.keysym ) {
104 gui_edit_delay = 250;
105 gui_edit_handle_key( widget,
106 event->key.keysym,
107 event->key.unicode );
108 //stk_sound_play( gui_theme->type_sound );
109 }
110 break;
111 case GUI_KEY_RELEASED:
112 gui_edit_keysym = -1;
113 break;
114 case GUI_FOCUS_OUT:
115 gui_edit_blink = 0;
116 gui_widget_draw( widget );
117 break;
118 case GUI_CLICKED:
119 stk_sound_play( gui_theme->click_sound );
120 px = event->button.x - widget->screen_region.x -
121 widget->border;
122 py = event->button.y - widget->screen_region.y -
123 widget->border - widget->spec.edit.y_offset;
124 gui_edit_adjust_cursor( widget,
125 (py / gui_theme->edit_font->height) *
126 widget->spec.edit.width +
127 (px / gui_theme->edit_font->width) +
128 widget->spec.edit.start - widget->spec.edit.pos + 1 );
129 gui_edit_blink = 1;
130 gui_edit_blink_time = 0;
131 gui_widget_draw( widget );
132 break;
133 }
134 }
135
136 /*
137 ====================================================================
138 Render the display buffer from the edit string and the first
139 character displayed of it. No screen update.
140 ====================================================================
141 */
142 static void gui_edit_update_display_buffer( GuiWidget *widget )
143 {
144 int i, length, left;
145 char *src, *dest;
146 memset( widget->spec.edit.display_buffer, 0,
147 (widget->spec.edit.width+1) * widget->spec.edit.height *
148 sizeof( char ) );
149 if ( widget->spec.edit.multi_line ) {
150 src = widget->spec.edit.buffer + widget->spec.edit.start;
151 left = strlen( src );
152 dest = widget->spec.edit.display_buffer;
153 for ( i = 0; i < widget->spec.edit.height; i++ ) {
154 length = widget->spec.edit.width;
155 if ( length > left )
156 length = left;
157 strncpy( dest, src, length );
158 dest += widget->spec.edit.width + 1;
159 src += length;
160 left -= length;
161 if ( left == 0 )
162 break;
163 }
164 }
165 else {
166 strncpy( widget->spec.edit.display_buffer,
167 widget->spec.edit.buffer + widget->spec.edit.start,
168 widget->spec.edit.width );
169 }
170 }
171 /*
172 ====================================================================
173 Adjust edit cursor position by offset and return True
174 if the display buffer has changed. Do not update display.
175 ====================================================================
176 */
177 static int gui_edit_adjust_cursor( GuiWidget *widget, int offset )
178 {
179 int new_y, changed = 0;
180 /* adjust position */
181 widget->spec.edit.pos += offset;
182 if ( widget->spec.edit.pos < 0 ) widget->spec.edit.pos = 0;
183 if ( widget->spec.edit.pos > widget->spec.edit.length )
184 widget->spec.edit.pos = widget->spec.edit.length;
185 /* don't blink cursor while moving */
186 gui_edit_blink_time = 0;
187 /* update display position */
188 if ( widget->spec.edit.multi_line ) {
189 new_y = widget->spec.edit.pos / widget->spec.edit.width;
190 /* if this position is out of screen modify 'line'
191 and 'start' */
192 if ( new_y < widget->spec.edit.line ||
193 new_y >= widget->spec.edit.line + widget->spec.edit.height ) {
194 if ( new_y < widget->spec.edit.line )
195 widget->spec.edit.line = new_y;
196 else
197 widget->spec.edit.line = new_y - widget->spec.edit.height + 1;
198 widget->spec.edit.start =
199 widget->spec.edit.line * widget->spec.edit.width;
200 /* update the display buffer */
201 gui_edit_update_display_buffer( widget );
202 changed = 1;
203 }
204 widget->spec.edit.x =
205 widget->spec.edit.pos % widget->spec.edit.width;
206 widget->spec.edit.y = new_y - widget->spec.edit.line;
207 }
208 else {
209 if ( widget->spec.edit.pos < widget->spec.edit.start ) {
210 widget->spec.edit.start = widget->spec.edit.pos;
211 widget->spec.edit.x = 0;
212 /* update the display buffer */
213 gui_edit_update_display_buffer( widget );
214 changed = 1;
215 }
216 else
217 if ( widget->spec.edit.pos >=
218 widget->spec.edit.start + widget->spec.edit.width ) {
219 widget->spec.edit.start = widget->spec.edit.pos -
220 widget->spec.edit.width;
221 widget->spec.edit.x = widget->spec.edit.width;
222 /* update the display buffer */
223 gui_edit_update_display_buffer( widget );
224 changed = 1;
225 }
226 else {
227 /* within text */
228 widget->spec.edit.x =
229 widget->spec.edit.pos - widget->spec.edit.start;
230 }
231 }
232 return changed;
233 }
234 /*
235 ====================================================================
236 Handle the pressed key, modify the edit buffer and update the
237 displayed edit if visible.
238 ====================================================================
239 */
240 static void gui_edit_handle_key(
241 GuiWidget *widget, int keysym, int unicode )
242 {
243 int i, changed = 0, old_length = widget->spec.edit.length;
244 switch ( keysym ) {
245 case SDLK_RIGHT:
246 gui_edit_adjust_cursor( widget, 1 );
247 changed = 1;
248 break;
249 case SDLK_LEFT:
250 gui_edit_adjust_cursor( widget, -1 );
251 changed = 1;
252 break;
253 case SDLK_DOWN:
254 gui_edit_adjust_cursor(
255 widget, widget->spec.edit.width );
256 changed = 1;
257 break;
258 case SDLK_UP:
259 gui_edit_adjust_cursor(
260 widget, -widget->spec.edit.width );
261 changed = 1;
262 break;
263 case SDLK_HOME:
264 gui_edit_adjust_cursor(
265 widget, -widget->spec.edit.pos );
266 changed = 1;
267 break;
268 case SDLK_END:
269 widget->spec.edit.pos = 0;
270 gui_edit_adjust_cursor(
271 widget, widget->spec.edit.length );
272 changed = 1;
273 break;
274 case SDLK_BACKSPACE:
275 if ( widget->spec.edit.pos > 0 ) {
276 --widget->spec.edit.pos;
277 for ( i = widget->spec.edit.pos;
278 i < widget->spec.edit.length - 1; i++ )
279 widget->spec.edit.buffer[i] =
280 widget->spec.edit.buffer[i + 1];
281 widget->spec.edit.buffer[i] = 0;
282 widget->spec.edit.length--;
283 if ( !gui_edit_adjust_cursor( widget, 0 ) )
284 gui_edit_update_display_buffer( widget );
285 changed = 1;
286 }
287 break;
288 case SDLK_DELETE:
289 if ( widget->spec.edit.pos < widget->spec.edit.length ) {
290 for ( i = widget->spec.edit.pos;
291 i < widget->spec.edit.length - 1; i++ )
292 widget->spec.edit.buffer[i] =
293 widget->spec.edit.buffer[i + 1];
294 widget->spec.edit.buffer[i] = 0;
295 widget->spec.edit.length--;
296 gui_edit_update_display_buffer( widget );
297 changed = 1;
298 }
299 break;
300 default:
301 if ( widget->spec.edit.filter[unicode] && widget->spec.edit.pos < widget->spec.edit.size )
302 if ( widget->spec.edit.length < widget->spec.edit.size ) {
303 for ( i = widget->spec.edit.size - 1;
304 i > widget->spec.edit.pos; i-- )
305 widget->spec.edit.buffer[i] =
306 widget->spec.edit.buffer[i - 1];
307 widget->spec.edit.buffer[widget->spec.edit.pos++] = unicode;
308 widget->spec.edit.length++;
309 if ( !gui_edit_adjust_cursor( widget, 0 ) )
310 gui_edit_update_display_buffer( widget );
311 changed = 1;
312 }
313 break;
314 }
315 if ( changed ) {
316 gui_edit_blink_time = 0;
317 gui_edit_blink = 1;
318 gui_widget_draw( widget );
319 gui_edit_interval = 0;
320 gui_edit_keysym = keysym;
321 gui_edit_unicode = unicode;
322 if ( old_length != widget->spec.edit.length ) {
323 gui_widget_call_user_event_handler(
324 widget, gui_event_get_simple( GUI_CHANGED ) );
325 }
326 }
327 else
328 gui_edit_keysym = -1;
329 }
330
331 /*
332 ====================================================================
333 PUBLICS
334 ====================================================================
335 */
336
337 /*
338 ====================================================================
339 Create a multi-line editable widget. By checking the measurements
340 of the standard font the number of lines and the line width is
341 determined.
342 'text': is copied and displayed when first shown
343 'size': limit of characters (excluding the \0)
344 ====================================================================
345 */
346 GuiWidget* gui_edit_create(
347 GuiWidget *parent, int x, int y, int width, int height,
348 void (*user_event_handler)(GuiWidget*,GuiEvent*),
349 int border, int multi_line, int size, char *text )
350 {
351 GuiWidget *widget = gui_widget_create(
352 parent, GUI_EDIT, x, y, width, height,
353 default_event_handler, user_event_handler );
354 /* events */
355 gui_widget_enable_event( widget, GUI_CHANGED );
356 /* create surface, wallpaper and frame it */
357 widget->surface = stk_surface_create(
358 SDL_SWSURFACE, width, height );
359 SDL_SetColorKey( widget->surface, 0,0 );
360 stk_surface_apply_wallpaper( widget->surface, 0,0,-1,-1,
361 gui_theme->widget_wallpaper, STK_OPAQUE );
362 widget->border = stk_surface_apply_frame(
363 widget->surface, 0, 0, -1, -1,
364 gui_theme->widget_frame );
365 /* size w/o border */
366 widget->width -= 2 * widget->border;
367 widget->height -= 2 * widget->border;
368 /* grab keys */
369 widget->grab_keys = 1;
370 /* prepare text */
371 gui_edit_set_filter( widget, GUI_EDIT_DEFAULT );
372 widget->spec.edit.multi_line = multi_line;
373 widget->border += border;
374 widget->spec.edit.width =
375 (width - widget->border*2) /
376 gui_theme->edit_font->width;
377 if ( multi_line )
378 widget->spec.edit.height =
379 (height - widget->border*2) /
380 gui_theme->edit_font->height;
381 else
382 widget->spec.edit.height = 1;
383 widget->spec.edit.display_buffer =
384 calloc( (widget->spec.edit.width+1) * widget->spec.edit.height,
385 sizeof( char ) );
386 if ( widget->spec.edit.display_buffer == 0 )
387 GUI_ABORT( "Out Of Memory" );
388 gui_edit_resize_buffer( widget, size );
389 gui_edit_set_text( widget, text );
390 /* center single-line edit */
391 if ( !multi_line )
392 widget->spec.edit.y_offset =
393 (height - 2 * widget->border -
394 gui_theme->edit_font->height) / 2;
395 /* done */
396 return widget;
397 }
398
399 /*
400 ====================================================================
401 Resize the edit buffer and clear any text. (no update)
402 ====================================================================
403 */
404 void gui_edit_resize_buffer( GuiWidget *widget, int size )
405 {
406 if ( widget->type != GUI_EDIT ) return;
407 widget->spec.edit.size = size;
408 if ( widget->spec.edit.buffer )
409 free( widget->spec.edit.buffer );
410 widget->spec.edit.buffer = calloc( size + 1, sizeof( char ) );
411 if ( widget->spec.edit.buffer == 0 )
412 GUI_ABORT( "Out Of Memory" );
413 }
414 /*
415 ====================================================================
416 Set the edit's text. This resets the edit cursor's position to
417 end of text and updates displayed edit if visible.
418 ====================================================================
419 */
420 void gui_edit_set_text( GuiWidget *widget, char *text )
421 {
422 if ( widget->type != GUI_EDIT ) return;
423 /* copy text */
424 snprintf( widget->spec.edit.buffer, widget->spec.edit.size + 1, text );
425 widget->spec.edit.length = strlen( widget->spec.edit.buffer );
426 /* reset */
427 /* first character in first line */
428 widget->spec.edit.pos = 0;
429 widget->spec.edit.x = widget->spec.edit.y = 0;
430 widget->spec.edit.start = widget->spec.edit.line = 0;
431 /* jump to end */
432 if ( !gui_edit_adjust_cursor( widget, widget->spec.edit.length ) )
433 gui_edit_update_display_buffer( widget );
434 /* update */
435 if ( widget->visible )
436 gui_widget_draw( widget );
437 }
438 /*
439 ====================================================================
440 Copy characters from 'start' to 'length' of the edit string to
441 'buffer' (at maximum limit characters including \0). If 'length'
442 is -1 the characters copied are those from 'start' to end of text.
443 ====================================================================
444 */
445 int gui_edit_get_text(
446 GuiWidget *widget, char *buffer, int limit,
447 int start, int length )
448 {
449 char *ptr;
450 if ( widget->type != GUI_EDIT ) return 0;
451 if ( start < 0 ) start = 0;
452 ptr = widget->spec.edit.buffer + start;
453 if ( length == -1 )
454 length = strlen( ptr );
455 if ( length > limit )
456 length = limit;
457 if ( length )
458 snprintf( buffer, limit, widget->spec.edit.buffer );
459 else
460 buffer[0] = 0;
461 return 1;
462 }
463 /*
464 ====================================================================
465 Update the blinking cursor flag (no update) of the edit and in
466 case a key is pressed call gui_edit_handle_key().
467 ====================================================================
468 */
469 void gui_edit_update( GuiWidget *widget, int ms )
470 {
471 gui_edit_blink_time += ms;
472 if ( gui_edit_blink_time > 500 ) {
473 gui_edit_blink_time = 0;
474 gui_edit_blink = !gui_edit_blink;
475 gui_widget_draw( widget );
476 }
477 if ( gui_edit_keysym != -1 ) {
478 if ( gui_edit_delay > 0 ) {
479 gui_edit_delay -= ms;
480 if ( gui_edit_delay <= 0 )
481 gui_edit_delay = 0;
482 }
483 if ( gui_edit_delay == 0 ) {
484 if ( gui_edit_interval > 0 ) {
485 gui_edit_interval -= ms;
486 if ( gui_edit_interval < 0 )
487 gui_edit_interval = 0;
488 }
489 if ( gui_edit_interval == 0 ) {
490 gui_edit_handle_key( widget,
491 gui_edit_keysym, gui_edit_unicode );
492 gui_edit_interval = 30;
493 }
494 }
495 }
496 }
497 /*
498 ====================================================================
499 Select a character set.
500 default: all non-whitespaces >=32 && <= 128
501 alpha: A-Z,a-z
502 numerical: 0-9
503 alphanumerical: A-Z,a-z,0-9
504 ====================================================================
505 */
506 void gui_edit_set_filter( GuiWidget *widget, int type )
507 {
508 int i, j;
509 if ( widget->type != GUI_EDIT ) return;
510 memset( widget->spec.edit.filter, 0,
511 sizeof( widget->spec.edit.filter ) );
512 switch ( type ) {
513 case GUI_EDIT_DEFAULT:
514 for ( i = 32; i <= 128; i++ )
515 widget->spec.edit.filter[i] = 1;
516 break;
517 case GUI_EDIT_ALPHANUMERICAL:
518 case GUI_EDIT_ALPHANUMERICAL2:
519 case GUI_EDIT_ALPHA:
520 for ( i = 65, j = 97; i <= 90; i++, j++ ) {
521 widget->spec.edit.filter[i] = 1;
522 widget->spec.edit.filter[j] = 1;
523 }
524 if ( type == GUI_EDIT_ALPHANUMERICAL || type == GUI_EDIT_ALPHANUMERICAL2 ) {
525 widget->spec.edit.filter[45] = 1;
526 for ( i = 48; i <= 57; i++ )
527 widget->spec.edit.filter[i] = 1;
528 }
529 if ( type == GUI_EDIT_ALPHANUMERICAL2 )
530 widget->spec.edit.filter[95] = 1;
531 break;
532 case GUI_EDIT_NUMERICAL:
533 for ( i = 48; i <= 57; i++ )
534 widget->spec.edit.filter[i] = 1;
535 widget->spec.edit.filter[45] = 1;
536 break;
537 }
538 }
0 /***************************************************************************
1 gui_edit.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_EDIT_H
18 #define __GUI_EDIT_H
19
20 /*
21 ====================================================================
22 Create a single/multi-line editable widget. By checking the
23 measurements of the standard font the number of lines and the
24 line width is determined. If the edit is single-lined height is
25 always one but edit becomes scrollable.
26 'border': between text and frame
27 'text': is copied and displayed when first shown
28 'size': limit of characters (excluding the \0)
29 Per default the edit accepts all non-whitespace characters.
30 ====================================================================
31 */
32 GuiWidget* gui_edit_create(
33 GuiWidget *parent, int x, int y, int width, int height,
34 void (*user_event_handler)(GuiWidget*,GuiEvent*),
35 int border, int multi_line, int size, char *text );
36
37 /*
38 ====================================================================
39 Resize the edit buffer and clear any text. (no update)
40 ====================================================================
41 */
42 void gui_edit_resize_buffer( GuiWidget *edit, int size );
43 /*
44 ====================================================================
45 Set the edit's text. This resets the edit cursor's position to
46 end of text and updates displayed edit if visible.
47 ====================================================================
48 */
49 void gui_edit_set_text( GuiWidget *edit, char *text );
50 /*
51 ====================================================================
52 Copy characters from 'start' to 'length' of the edit string to
53 'buffer' (at maximum limit characters including \0). If 'length' is
54 -1 the characters copied are those from 'start' to end of text.
55 ====================================================================
56 */
57 int gui_edit_get_text(
58 GuiWidget *edit, char *buffer, int limit,
59 int start, int length );
60 /*
61 ====================================================================
62 Update the blinking cursor flag (no update) of the edit and in
63 case a key is pressed call gui_edit_handle_key().
64 ====================================================================
65 */
66 void gui_edit_update( GuiWidget *widget, int ms );
67 /*
68 ====================================================================
69 Select a character filter.
70 default: all non-whitespaces >=32 && <= 128
71 alpha: A-Z,a-z
72 numerical: -,0-9
73 alphanumerical: A-Z,a-z,0-9
74 alphanumerical2: + underscores
75 ====================================================================
76 */
77 enum {
78 GUI_EDIT_DEFAULT = 0,
79 GUI_EDIT_ALPHA,
80 GUI_EDIT_NUMERICAL,
81 GUI_EDIT_ALPHANUMERICAL,
82 GUI_EDIT_ALPHANUMERICAL2
83 };
84 void gui_edit_set_filter( GuiWidget *edit, int type );
85
86 #endif
0 /***************************************************************************
1 gui_icon.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include "gui_widget.h"
19 #include "gui_icon.h"
20
21 extern GuiTheme *gui_theme;
22 extern SDL_Surface *stk_display;
23
24 /*
25 ====================================================================
26 LOCALS
27 ====================================================================
28 */
29
30 /*
31 ====================================================================
32 Default event handler
33 ====================================================================
34 */
35 static void default_event_handler(
36 GuiWidget *widget, GuiEvent *event )
37 {
38 switch ( event->type ) {
39 case GUI_DESTROY:
40 break;
41 case GUI_DRAW:
42 /* display surface */
43 stk_surface_blit(
44 widget->surface, 0, 0, -1, -1,
45 stk_display,
46 widget->screen_region.x,
47 widget->screen_region.y );
48 break;
49 }
50 }
51
52 /*
53 ====================================================================
54 PUBLICS
55 ====================================================================
56 */
57
58 /*
59 ====================================================================
60 Create an icon widget that displays the icon centered and uses
61 the parent's background.
62 ====================================================================
63 */
64 GuiWidget *gui_icon_create(
65 GuiWidget *parent, int x, int y, int width, int height, int with_frame,
66 void (*user_event_handler)(GuiWidget*,GuiEvent*),
67 SDL_Surface *icon, int ix, int iy, int iw, int ih )
68 {
69 GuiWidget *widget = gui_widget_create(
70 parent, GUI_ICON, x, y, width, height,
71 default_event_handler, user_event_handler );
72 /* events */
73 gui_widget_enable_event( widget, GUI_CLICKED );
74 /* create surface and add frame -
75 contents is set by icon_set_icon() */
76 widget->surface = stk_surface_create(
77 SDL_SWSURFACE, width, height );
78 if ( with_frame )
79 widget->border = stk_surface_apply_frame(
80 widget->surface, 0, 0, -1, -1,
81 gui_theme->widget_frame );
82 /* size w/o border */
83 widget->width -= 2 * widget->border;
84 widget->height -= 2 * widget->border;
85 /* set icon */
86 gui_icon_set_icon( widget, icon, ix, iy, iw, ih );
87 /* done */
88 return widget;
89 }
90
91 /*
92 ====================================================================
93 Apply a new icon.
94 ====================================================================
95 */
96 void gui_icon_set_icon(
97 GuiWidget *widget, SDL_Surface *icon,
98 int ix, int iy, int iw, int ih )
99 {
100 if ( widget->type != GUI_ICON ) return;
101 /* clear widget to wallpaper */
102 gui_widget_apply_wallpaper(
103 widget, gui_theme->widget_wallpaper, -1 );
104 /* add icon */
105 if ( icon ) {
106 /* adjust size */
107 if ( iw == -1 ) iw = icon->w;
108 if ( ih == -1 ) ih = icon->h;
109 stk_surface_blit( icon, ix, iy, iw, ih,
110 widget->surface,
111 (widget->surface->w - iw)/2,
112 (widget->surface->h - ih)/2 );
113 }
114 /* done */
115 if ( widget->visible )
116 gui_widget_draw( widget );
117 }
118
0 /***************************************************************************
1 gui_icon.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_ICON_H
18 #define __GUI_ICON_H
19
20 /*
21 ====================================================================
22 Create an icon widget that displays the icon centered and uses
23 the parent's background.
24 ====================================================================
25 */
26 GuiWidget *gui_icon_create(
27 GuiWidget *parent, int x, int y, int width, int height,
28 int with_frame,
29 void (*user_event_handler)(GuiWidget*,GuiEvent*),
30 SDL_Surface *icon, int ix, int iy, int iw, int ih );
31
32 /*
33 ====================================================================
34 Apply a new icon.
35 ====================================================================
36 */
37 void gui_icon_set_icon(
38 GuiWidget *icon, SDL_Surface *source,
39 int ix, int iy, int iw, int ih );
40
41 #endif
42
0 /***************************************************************************
1 gui_label.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include <stdarg.h>
20 #include "gui_widget.h"
21 #include "gui_label.h"
22
23 extern GuiTheme *gui_theme;
24 extern SDL_Surface *stk_display;
25
26 /*
27 ====================================================================
28 LOCALS
29 ====================================================================
30 */
31
32 /*
33 ====================================================================
34 Convert a text string into single lines of maximum length
35 'char_width'.
36 ====================================================================
37 */
38 typedef struct {
39 char **lines;
40 int count;
41 } LabelText;
42 static void repl_new_lines( char *text )
43 {
44 int i;
45 for ( i = 0; i < strlen( text ); i++ )
46 if ( text[i] < 32 )
47 text[i] = 32;
48 }
49 static LabelText* text_create( char *orig_str, int char_width )
50 {
51 int i, j;
52 char line[256]; /* a line should not exceed this length */
53 int pos;
54 int last_space;
55 int new_line;
56 LabelText *text = 0;
57 char *str = 0;
58
59 text = calloc ( 1, sizeof( LabelText ) );
60 /* maybe orig_str is a constant expression; duplicate for safety */
61 str = strdup( orig_str );
62 /* replace original new_lines with spaces */
63 repl_new_lines( str );
64 /* change some spaces to new_lines, so that the new text fits the wanted line_length */
65 /* NOTE: '#' means new_line ! */
66 // if character with is 0 it's just a single line //
67 if ( char_width > 0 ) {
68 pos = 0;
69 while ( pos < strlen( str ) ) {
70 last_space = 0;
71 new_line = 0;
72 i = 0;
73 while ( !new_line && i < char_width && i + pos < strlen( str ) ) {
74 switch ( str[pos + i] ) {
75 case '#': new_line = 1;
76 case 32: last_space = i; break;
77 }
78 i++;
79 }
80 if ( i + pos >= strlen( str ) ) break;
81 if ( last_space == 0 ) {
82 /* uhh... much to long, we'll have to cut a word into pieces ... */
83 last_space = char_width / 2;
84 }
85 str[pos + last_space] = 10;
86 pos += last_space;
87 }
88 }
89 /* count lines */
90 if ( char_width > 0 ) {
91 for ( i = 0; i < strlen( str ); i++ )
92 if ( str[i] == 10 )
93 text->count++;
94 /* maybe one unfinished line */
95 if ( str[strlen( str ) - 1] != 10 )
96 text->count++;
97 }
98 else
99 text->count = 1;
100 /* get mem */
101 text->lines = calloc( text->count, sizeof( char* ) );
102 /* get all lines */
103 pos = 0;
104 for ( j = 0; j < text->count; j++ ) {
105 i = 0;
106 while ( pos + i < strlen( str ) && str[pos + i] != 10 ) {
107 line[i] = str[i + pos];
108 i++;
109 }
110 pos += i; pos++;
111 line[i] = 0;
112 text->lines[j] = strdup( line );
113 }
114 if ( text->count == 0 )
115 fprintf( stderr, "conv_to_text: warning: line_count is 0\n" );
116 free( str );
117 return text;
118 }
119 static void text_delete( LabelText *text )
120 {
121 int i;
122 if ( text == 0 ) return;
123 if ( text->lines ) {
124 for ( i = 0; i < text->count; i++ )
125 if ( text->lines[i] )
126 free( text->lines[i] );
127 free( text->lines );
128 }
129 free( text );
130 }
131
132 /*
133 ====================================================================
134 Default event handler
135 ====================================================================
136 */
137 static void default_event_handler(
138 GuiWidget *widget, GuiEvent *event )
139 {
140 switch ( event->type ) {
141 case GUI_DESTROY:
142 if ( widget->spec.label.text )
143 free( widget->spec.label.text );
144 break;
145 case GUI_DRAW:
146 /* display surface */
147 stk_surface_blit(
148 widget->surface, 0, 0, -1, -1,
149 stk_display,
150 widget->screen_region.x,
151 widget->screen_region.y );
152 break;
153 }
154 }
155
156 /*
157 ====================================================================
158 PUBLICS
159 ====================================================================
160 */
161
162 /*
163 ====================================================================
164 Create a label widget with the parent's background and maybe a
165 frame.
166 'border': space between text and frame
167 'text': text that may contain multiple lines separated by '#'
168 (duplicated)
169 'align': alignment for each line
170 'font': used to display the text. if NULL is passed the default
171 label font is used
172 ====================================================================
173 */
174 GuiWidget* gui_label_create(
175 GuiWidget *parent, int x, int y, int width, int height, int with_frame,
176 void (*user_event_handler)(GuiWidget*,GuiEvent*),
177 int border, StkFont *font, int align, char *text )
178 {
179 GuiWidget *widget = gui_widget_create(
180 parent, GUI_LABEL, x, y, width, height,
181 default_event_handler, user_event_handler );
182 /* events */
183 gui_widget_enable_event( widget, GUI_CLICKED );
184 /* create surface and add frame -
185 contents is set by label_set_text() */
186 widget->surface = stk_surface_create(
187 SDL_SWSURFACE, width, height );
188 SDL_SetColorKey( widget->surface, 0,0 );
189 if ( with_frame )
190 widget->border = stk_surface_apply_frame(
191 widget->surface, 0, 0, -1, -1,
192 gui_theme->widget_frame );
193 /* add some extra space between frame and text */
194 widget->border += border;
195 /* size w/o border */
196 widget->width -= 2 * widget->border;
197 widget->height -= 2 * widget->border;
198 /* set font and alignment */
199 widget->spec.label.font = (font)?font:gui_theme->label_font;
200 widget->spec.label.align = align;
201 /* do the text */
202 if ( text )
203 widget->spec.label.text = strdup( text );
204 gui_label_set_text( widget, text );
205 /* done */
206 return widget;
207 }
208
209 /*
210 ====================================================================
211 Set label font/alignment/text. Update if visible.
212 ====================================================================
213 */
214 void gui_label_set_font( GuiWidget *widget, StkFont *font )
215 {
216 if ( widget->type != GUI_LABEL ) return;
217 widget->spec.label.font = font;
218 gui_label_set_text( widget, widget->spec.label.text );
219 }
220 void gui_label_set_align( GuiWidget *widget, int align )
221 {
222 if ( widget->type != GUI_LABEL ) return;
223 widget->spec.label.align = align;
224 gui_label_set_text( widget, widget->spec.label.text );
225 }
226 static char label_buffer[1024];
227 void gui_label_set_text( GuiWidget *widget, char *format, ... )
228 {
229 LabelText *text;
230 int px, py, i;
231 va_list args;
232 if ( widget->type != GUI_LABEL ) return;
233 /* free old text */
234 if ( widget->spec.label.text ) {
235 free( widget->spec.label.text );
236 widget->spec.label.text = 0;
237 }
238 /* clear widget to wallpaper */
239 gui_widget_apply_wallpaper(
240 widget, gui_theme->widget_wallpaper, -1 );
241 /* set new text if any */
242 if ( format ) {
243 /* build full string */
244 va_start( args, format );
245 vsnprintf( label_buffer, 1024, format, args );
246 va_end( args );
247 /* build text */
248 widget->spec.label.text = strdup( label_buffer );
249 text = text_create( widget->spec.label.text,
250 (widget->screen_region.w - 2 * widget->border) /
251 widget->spec.label.font->width );
252 /* add text */
253 widget->spec.label.font->align = widget->spec.label.align;
254 if ( widget->spec.label.align & STK_FONT_ALIGN_LEFT )
255 px = widget->border;
256 else
257 if ( widget->spec.label.align & STK_FONT_ALIGN_RIGHT )
258 px = widget->screen_region.w - widget->border;
259 else
260 px = widget->border +
261 ((widget->screen_region.w -
262 (widget->border<<1))>>1);
263 py = (widget->parent_region.h -
264 text->count * widget->spec.label.font->height) / 2;
265 for ( i = 0; i < text->count;
266 i++, py += widget->spec.label.font->height )
267 stk_font_write( widget->spec.label.font,
268 widget->surface, px, py, -1,
269 text->lines[i] );
270 text_delete( text );
271 }
272 /* display */
273 if ( widget->visible )
274 gui_widget_draw( widget );
275 }
0 /***************************************************************************
1 gui_label.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_LABEL_H
18 #define __GUI_LABEL_H
19
20 /*
21 ====================================================================
22 Create a label widget with the parent's background and maybe a
23 frame.
24 'border': space between text and frame
25 'text': text that may contain multiple lines separated by '#'
26 (duplicated)
27 'align': alignment for each line
28 'font': used to display the text. if NULL is passed the default
29 label font is used
30 ====================================================================
31 */
32 GuiWidget* gui_label_create(
33 GuiWidget *parent, int x, int y, int width, int height,
34 int with_frame,
35 void (*user_event_handler)(GuiWidget*,GuiEvent*),
36 int border, StkFont *font, int align, char *text );
37
38 /*
39 ====================================================================
40 Set label font/alignment/text. Update if visible.
41 ====================================================================
42 */
43 void gui_label_set_font( GuiWidget *label, StkFont *font );
44 void gui_label_set_align( GuiWidget *label, int align );
45 void gui_label_set_text( GuiWidget *label, char *format, ... );
46
47 #endif
0 /***************************************************************************
1 gui_list.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include "gui_widget.h"
19 #include "gui_button.h"
20 #include "gui_scrollbar.h"
21 #include "gui_list.h"
22
23 extern GuiTheme *gui_theme;
24 extern SDL_Surface *stk_display;
25
26 /*
27 ====================================================================
28 LOCALS
29 ====================================================================
30 */
31
32 /*
33 ====================================================================
34 Default event handler
35 ====================================================================
36 */
37 static void default_event_handler(
38 GuiWidget *widget, GuiEvent *event )
39 {
40 Uint32 color;
41 SDL_Rect rect;
42 int pos, px, py, item_id, i, j;
43 switch ( event->type ) {
44 case GUI_DESTROY:
45 if ( widget->spec.list.checks )
46 free( widget->spec.list.checks );
47 stk_surface_free( &widget->spec.list.render_buffer );
48 break;
49 case GUI_DRAW:
50 /* display surface */
51 stk_surface_blit(
52 widget->surface, 0, 0, -1, -1,
53 stk_display,
54 widget->screen_region.x,
55 widget->screen_region.y );
56 /* render items */
57 if ( widget->spec.list.item_count == 0 )
58 break;
59 pos = 0;
60 if ( widget->spec.list.scrollbar )
61 gui_scrollbar_get_value(
62 widget->spec.list.scrollbar, &pos );
63 item_id = pos * widget->spec.list.columns;
64 py = widget->screen_region.y + widget->border;
65 for ( j = 0; j < widget->spec.list.rows_per_page; j++ ) {
66 px = widget->screen_region.x + widget->border;
67 for ( i = 0; i < widget->spec.list.columns; i++ ) {
68 if ( (widget->spec.list.select_type ==
69 GUI_LIST_SINGLE_SELECT &&
70 widget->spec.list.checks[0] == item_id) ||
71 (widget->spec.list.select_type ==
72 GUI_LIST_MULTI_SELECT &&
73 widget->spec.list.checks[item_id] ) ) {
74 color = stk_surface_get_pixel(
75 gui_theme->list_item_color, 0, 0 );
76 SDL_FillRect(
77 widget->spec.list.render_buffer, 0, color );
78 stk_surface_alpha_blit( widget->surface,
79 px - widget->screen_region.x,
80 py - widget->screen_region.y,
81 widget->spec.list.item_width,
82 widget->spec.list.item_height,
83 widget->spec.list.render_buffer, 0, 0,
84 192 );
85 }
86 else
87 stk_surface_fill(
88 widget->spec.list.render_buffer, 0,0,-1,-1,
89 0x0 );
90 if ( widget->spec.list.render_item(
91 i, j + pos, widget->spec.list.render_buffer ) )
92 stk_surface_blit(
93 widget->spec.list.render_buffer,
94 0,0,-1,-1, stk_display, px, py );
95 px += widget->spec.list.item_width +
96 widget->spec.list.gap;
97 item_id++;
98 if ( item_id >= widget->spec.list.item_count )
99 break;
100 }
101 py += widget->spec.list.item_height +
102 widget->spec.list.gap;
103 if ( item_id >= widget->spec.list.item_count )
104 break;
105 }
106 break;
107 case GUI_BUTTON_PRESSED:
108 if ( event->button.button == STK_WHEEL_UP )
109 gui_scrollbar_add( widget->spec.list.scrollbar,
110 -widget->spec.list.scrollbar->spec.scrollbar.step*2 );
111 else
112 if ( event->button.button == STK_WHEEL_DOWN )
113 gui_scrollbar_add( widget->spec.list.scrollbar,
114 widget->spec.list.scrollbar->spec.scrollbar.step*2 );
115 else {
116 /* handle selection */
117 pos = 0;
118 if ( widget->spec.list.scrollbar )
119 gui_scrollbar_get_value(
120 widget->spec.list.scrollbar, &pos );
121 rect.w = widget->spec.list.item_width;
122 rect.h = widget->spec.list.item_height;
123 rect.y = widget->screen_region.y +
124 widget->border;
125 for ( j = 0; j < widget->spec.list.rows_per_page; j++ ) {
126 rect.x = widget->screen_region.x +
127 widget->border;
128 for ( i = 0; i < widget->spec.list.columns; i++ ) {
129 if ( STK_IN_RECT( rect,
130 event->button.x,
131 event->button.y ) ) {
132 gui_list_select(
133 widget, i, j + pos, -1 );
134 return;
135 }
136 rect.x += widget->spec.list.item_width +
137 widget->spec.list.gap;
138 }
139 rect.y += widget->spec.list.item_height +
140 widget->spec.list.gap;
141 }
142 }
143 break;
144 }
145 }
146
147 /*
148 ====================================================================
149 Dummy routine to produce an empty list.
150 ====================================================================
151 */
152 static int gui_list_render_item_dummy(
153 int x, int y, SDL_Surface *buffer )
154 {
155 return 0;
156 }
157 /*
158 ====================================================================
159 Default handler for listbox scrollbar.
160 ====================================================================
161 */
162 static void gui_list_scrollbar_handler(
163 GuiWidget *widget, GuiEvent *event )
164 {
165 /* update the listbox */
166 if ( event->type == GUI_CHANGED )
167 gui_widget_draw( widget->parent );
168 /* call event handler */
169 gui_widget_call_user_event_handler( widget->parent, event );
170 }
171
172 /*
173 ====================================================================
174 PUBLICS
175 ====================================================================
176 */
177
178 /*
179 ====================================================================
180 Create a listbox that may have multiple columns which cannot be
181 scrolled however.
182 'gap': gap between items and frame
183 'columns': the item width is determined by available_width/columns
184 'item_height': the number of rows is unlimited and this is the
185 height of an item
186 'scrollbar_width' : if > 0 a vertical scrollbar is provided
187 'render_item': The scrollbar value (0 if none) tells which row
188 is the first displayed and
189 render_item(row,column,buffer) is called to
190 obtain the graphic for each visible item.
191 If 'render_item' returns False the item is not
192 displayed.
193 'select_type': no, single, multi select
194 ====================================================================
195 */
196 GuiWidget* gui_list_create(
197 GuiWidget *parent, int x, int y, int width, int height,
198 void (*user_event_handler)(GuiWidget*,GuiEvent*),
199 int gap, int columns, int item_height,
200 int scrollbar_width, int (*render_item)(int,int,SDL_Surface*),
201 int select_type )
202 {
203 int old_border;
204 GuiWidget *widget = gui_widget_create(
205 parent, GUI_LIST, x, y, width, height,
206 default_event_handler, user_event_handler );
207 /* events */
208 gui_widget_enable_event( widget, GUI_ITEM_SELECTED );
209 gui_widget_enable_event( widget, GUI_ITEM_UNSELECTED );
210 /* create surface and wallpaper it */
211 widget->surface = stk_surface_create(
212 SDL_SWSURFACE, width, height );
213 SDL_SetColorKey( widget->surface, 0,0 );
214 stk_surface_apply_wallpaper(
215 widget->surface, 0, 0, -1, -1,
216 gui_theme->widget_wallpaper, -1 );
217 /* add frame leaving space for scrollbar */
218 widget->border = stk_surface_apply_frame(
219 widget->surface, 0, 0, width - scrollbar_width, height,
220 gui_theme->widget_frame );
221 /* size w/o border */
222 widget->width -= 2 * widget->border;
223 widget->height -= 2 * widget->border;
224 /* distance between frame and items */
225 widget->spec.list.gap = gap;
226 widget->border += gap;
227 /* item settings */
228 widget->spec.list.columns = columns;
229 widget->spec.list.item_width =
230 (width - scrollbar_width - widget->border*2 + gap) /
231 columns - gap;
232 widget->spec.list.item_height = item_height;
233 widget->spec.list.rows_per_page =
234 (height - widget->border*2 + gap) / (item_height + gap);
235 /* selection */
236 widget->spec.list.select_type = select_type;
237 widget->spec.list.checks = calloc( 1, sizeof( int ) );
238 if ( widget->spec.list.checks == 0 )
239 GUI_ABORT( "Out Of Memory" );
240 /* render callback */
241 if ( render_item == 0 ) {
242 fprintf( stderr,
243 "You must specify a render callback for lists!\n" );
244 widget->spec.list.render_item = gui_list_render_item_dummy;
245 }
246 else
247 widget->spec.list.render_item = render_item;
248 /* build scrollbar if any */
249 if ( scrollbar_width > 0 ) {
250 /* the border is set to 0 as the frame doesn't
251 apply to the scrollbar */
252 old_border = widget->border;
253 widget->border = 0;
254 widget->spec.list.scrollbar = gui_scrollbar_create( widget,
255 width - scrollbar_width, 0, scrollbar_width, height,
256 gui_list_scrollbar_handler, 1,
257 0, 0, 1, widget->spec.list.rows_per_page / 2, 0 );
258 widget->border = old_border;
259 gui_widget_disable_event( widget->spec.list.scrollbar, GUI_FOCUS_IN );
260 gui_widget_disable_event( widget->spec.list.scrollbar, GUI_FOCUS_OUT );
261 }
262 /* create the render buffer */
263 widget->spec.list.render_buffer =
264 stk_surface_create( SDL_SWSURFACE,
265 widget->spec.list.item_width, widget->spec.list.item_height );
266 if ( widget->spec.list.render_buffer == 0 )
267 GUI_ABORT( "Out Of Memory" );
268 return widget;
269 }
270
271 /*
272 ====================================================================
273 Set item count of list and update it even if item count hasn't
274 changed. This function is used to tell the list that it
275 contents has changed and needs to be redrawn. All selections
276 are cleared by this function.
277 ====================================================================
278 */
279 void gui_list_update( GuiWidget *widget, int count )
280 {
281 int value = 0, old_count = widget->spec.list.item_count;
282 if ( widget->type != GUI_LIST ) return;
283 /* adjust count and row number */
284 widget->spec.list.item_count = count;
285 widget->spec.list.rows =
286 widget->spec.list.item_count / widget->spec.list.columns +
287 ((widget->spec.list.item_count %
288 widget->spec.list.columns) != 0);
289 /* clear checks */
290 if ( widget->spec.list.select_type == GUI_LIST_MULTI_SELECT ) {
291 free( widget->spec.list.checks );
292 widget->spec.list.checks =
293 calloc( (count<=0)?1:count, sizeof( int ) );
294 }
295 else
296 widget->spec.list.checks[0] = -1;
297 /* set range and value of scrollbar */
298 if ( widget->spec.list.scrollbar ) {
299 if ( count > old_count ) {
300 /* additional items. current scrollbar value will
301 still be valid. no screen update yet. */
302 if ( widget->visible )
303 widget->spec.list.scrollbar->
304 spec.scrollbar.track->visible = 0;
305 value = widget->spec.list.rows -
306 widget->spec.list.rows_per_page;
307 if ( value < 0 ) value = 0;
308 gui_scrollbar_set_range(
309 widget->spec.list.scrollbar, 0, value, -1, -1 );
310 if ( widget->visible )
311 widget->spec.list.scrollbar->
312 spec.scrollbar.track->visible = 1;
313 }
314 else if ( count < old_count ) {
315 /* lesser items. the current scrollbar value
316 may be out of range. no screen update yet. */
317 gui_scrollbar_get_value(
318 widget->spec.list.scrollbar, &value );
319 if ( widget->visible )
320 widget->spec.list.scrollbar->
321 spec.scrollbar.track->visible = 0;
322 value = widget->spec.list.rows -
323 widget->spec.list.rows_per_page;
324 if ( value < 0 ) value = 0;
325 if ( value + widget->spec.list.rows_per_page >
326 widget->spec.list.rows ) {
327 gui_scrollbar_set_value( widget->spec.list.scrollbar,
328 value );
329 }
330 gui_scrollbar_set_range(
331 widget->spec.list.scrollbar, 0, value, -1, -1 );
332 if ( widget->visible )
333 widget->spec.list.scrollbar->
334 spec.scrollbar.track->visible = 1;
335 }
336 }
337 /* redraw */
338 if ( widget->visible )
339 gui_widget_draw( widget );
340 }
341 /*
342 ====================================================================
343 Handle a listbox selection and update listbox.
344 If 'select' is 1 the item is selected, if it's 0 the item
345 is unselected, -1 means to toggle the value.
346 If SINGLE_SELECT toggeling the current selection keeps selection.
347 ====================================================================
348 */
349 void gui_list_select(
350 GuiWidget *widget, int column, int row, int select )
351 {
352 GuiEvent event;
353 int id, pos;
354 if ( widget->type != GUI_LIST ) return;
355 if ( widget->spec.list.select_type == GUI_LIST_NO_SELECT ) return;
356 event.type = GUI_NONE;
357 event.item.x = column;
358 event.item.y = row;
359 /* get id of item */
360 id = row * widget->spec.list.columns + column;
361 /* update selection */
362 if ( widget->spec.list.select_type == GUI_LIST_SINGLE_SELECT ) {
363 if ( select == 1 || select == -1 ) {
364 widget->spec.list.checks[0] = id;
365 event.type = GUI_ITEM_SELECTED;
366 }
367 else
368 if ( select == 0 && id == widget->spec.list.checks[0] ) {
369 widget->spec.list.checks[0] = -1;
370 event.type = GUI_ITEM_UNSELECTED;
371 }
372 }
373 else {
374 if ( select == -1 )
375 widget->spec.list.checks[id] = !widget->spec.list.checks[id];
376 else
377 widget->spec.list.checks[id] = select;
378 event.type = (widget->spec.list.checks[id]) ?
379 GUI_ITEM_SELECTED :
380 GUI_ITEM_UNSELECTED;
381 }
382 /* selection event? */
383 if ( event.type != GUI_NONE )
384 gui_widget_call_user_event_handler( widget, &event );
385 /* redraw */
386 if ( widget->visible ) {
387 pos = 0;
388 if ( widget->spec.list.scrollbar )
389 gui_scrollbar_get_value(
390 widget->spec.list.scrollbar, &pos );
391 if ( row >= pos )
392 if ( row < pos + widget->spec.list.rows_per_page )
393 gui_widget_draw( widget );
394 }
395 }
396
397 /*
398 ====================================================================
399 Display passed row as first one or jump to end if 'row' is -1 .
400 ====================================================================
401 */
402 void gui_list_goto( GuiWidget *widget, int row )
403 {
404 if ( widget->type != GUI_LIST ) return;
405 if ( row == -1 )
406 gui_scrollbar_add( widget->spec.list.scrollbar,
407 widget->spec.list.item_count );
408 else
409 gui_scrollbar_add( widget->spec.list.scrollbar,
410 row - widget->spec.list.scrollbar->spec.scrollbar.value );
411 }
0 /***************************************************************************
1 gui_list.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_LIST_H
18 #define __GUI_LIST_H
19
20 /* select types */
21 enum {
22 GUI_LIST_MULTI_SELECT = -1,
23 GUI_LIST_NO_SELECT,
24 GUI_LIST_SINGLE_SELECT
25 };
26
27 /*
28 ====================================================================
29 Create a listbox that may have multiple columns which cannot be
30 scrolled however.
31 'gap': gap between items and frame
32 'columns': the item width is determined by available_width/columns
33 'item_height': the number of rows is unlimited and this is the
34 height of an item
35 'scrollbar_width' : if > 0 a vertical scrollbar is provided
36 'render_item': The scrollbar value (0 if none) tells which row
37 is the first displayed and
38 render_item(row,column,buffer) is called to
39 obtain the graphic for each visible item.
40 If 'render_item' returns False the item is not
41 displayed.
42 'select_type': no, single, multi select
43 ====================================================================
44 */
45 GuiWidget* gui_list_create(
46 GuiWidget *parent, int x, int y, int width, int height,
47 void (*user_event_handler)(GuiWidget*,GuiEvent*),
48 int gap, int columns, int item_height,
49 int scrollbar_width, int (*render_item)(int,int,SDL_Surface*),
50 int select_type );
51
52 /*
53 ====================================================================
54 Set item count of list and update it even if item count hasn't
55 changed. This function is used to tell the list that it
56 contents has changed and needs to be redrawn. All selections
57 are cleared by this function.
58 ====================================================================
59 */
60 void gui_list_update( GuiWidget *list, int count );
61 /*
62 ====================================================================
63 Handle a listbox selection and update listbox.
64 If 'select' is 1 the item is selected, if it's 0 the item
65 is unselected, -1 means to toggle the value.
66 If SINGLE_SELECT toggeling the current selection keeps selection.
67 ====================================================================
68 */
69 void gui_list_select(
70 GuiWidget *list, int column, int row, int select );
71
72 /*
73 ====================================================================
74 Display passed row as first one or jump to end if 'row' is -1 .
75 ====================================================================
76 */
77 void gui_list_goto( GuiWidget *list, int row );
78
79 #endif
80
0 /***************************************************************************
1 gui_progressbar.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "gui_widget.h"
18 #include "gui_progressbar.h"
19
20 extern GuiTheme *gui_theme;
21 extern SDL_Surface *stk_display;
22
23 /*
24 ====================================================================
25 LOCALS
26 ====================================================================
27 */
28
29 /*
30 ====================================================================
31 Default event handler
32 ====================================================================
33 */
34 static char progressbar_hint[32];
35 static void default_event_handler(
36 GuiWidget *widget, GuiEvent *event )
37 {
38 switch ( event->type ) {
39 case GUI_DESTROY:
40 break;
41 case GUI_DRAW:
42 /* display surface */
43 stk_surface_blit(
44 widget->surface, 0,0,-1,-1,
45 stk_display,
46 widget->screen_region.x,
47 widget->screen_region.y );
48 /* add progress */
49 stk_surface_apply_wallpaper( stk_display,
50 widget->screen_region.x + widget->border,
51 widget->screen_region.y + widget->border,
52 widget->spec.progressbar.length,
53 widget->screen_region.h - (widget->border<<1),
54 widget->spec.progressbar.wallpaper, -1 );
55 /* if focused add info */
56 if ( widget->focused ) {
57 gui_theme->progressbar_font->align =
58 STK_FONT_ALIGN_CENTER_X |
59 STK_FONT_ALIGN_CENTER_Y;
60 snprintf( progressbar_hint, 32, "%i/%i",
61 widget->spec.progressbar.value,
62 widget->spec.progressbar.max );
63 stk_font_write( gui_theme->progressbar_font,
64 stk_display,
65 widget->screen_region.x +
66 widget->screen_region.w/2,
67 widget->screen_region.y +
68 widget->screen_region.h/2,
69 -1, progressbar_hint );
70 }
71 break;
72 case GUI_FOCUS_IN:
73 case GUI_FOCUS_OUT:
74 gui_widget_draw( widget );
75 break;
76 }
77 }
78
79 /*
80 ====================================================================
81 Adjust length of the beam and set correct beam wallpaper.
82 (no update)
83 ====================================================================
84 */
85 static void gui_progressbar_adjust( GuiWidget *widget )
86 {
87 int ratio = 100 * widget->spec.progressbar.value /
88 widget->spec.progressbar.max;
89 /* wallpaper */
90 if ( ratio > 60 )
91 widget->spec.progressbar.wallpaper =
92 gui_theme->progress_high;
93 else
94 if ( ratio > 25 )
95 widget->spec.progressbar.wallpaper =
96 gui_theme->progress_medium;
97 else
98 widget->spec.progressbar.wallpaper =
99 gui_theme->progress_low;
100 /* length */
101 widget->spec.progressbar.length =
102 (widget->parent_region.w - (widget->border<<1)) *
103 widget->spec.progressbar.value / widget->spec.progressbar.max;
104 }
105
106 /*
107 ====================================================================
108 PUBLICS
109 ====================================================================
110 */
111
112 /*
113 ====================================================================
114 Create a framed progress bar.
115 ====================================================================
116 */
117 GuiWidget *gui_progressbar_create(
118 GuiWidget *parent, int x, int y, int width, int height,
119 void (*user_event_handler)(GuiWidget*,GuiEvent*),
120 int max, int value )
121 {
122 GuiWidget *widget = gui_widget_create(
123 parent, GUI_PROGRESSBAR, x, y, width, height,
124 default_event_handler, user_event_handler );
125 /* create surface, wallpaper and frame it */
126 widget->surface = stk_surface_create(
127 SDL_SWSURFACE, width, height );
128 SDL_SetColorKey( widget->surface, 0,0 );
129 stk_surface_apply_wallpaper( widget->surface, 0,0,-1,-1,
130 gui_theme->widget_wallpaper, -1 );
131 widget->border = stk_surface_apply_frame(
132 widget->surface, 0, 0, -1, -1,
133 gui_theme->widget_frame );
134 /* size w/o border */
135 widget->width -= 2 * widget->border;
136 widget->height -= 2 * widget->border;
137 /* set value */
138 widget->spec.progressbar.max = max;
139 gui_progressbar_set_value( widget, value );
140 /* done */
141 return widget;
142 }
143
144 /*
145 ====================================================================
146 Get/Set value and limit of progressbar.
147 ====================================================================
148 */
149 void gui_progressbar_set_value(
150 GuiWidget *widget, int value )
151 {
152 if ( widget->type != GUI_PROGRESSBAR ) return;
153 /* set value */
154 widget->spec.progressbar.value = value;
155 gui_progressbar_adjust( widget );
156 /* done */
157 if ( widget->visible )
158 gui_widget_draw( widget );
159 }
160 void gui_progressbar_set_max(
161 GuiWidget *widget, int max )
162 {
163 if ( widget->type != GUI_PROGRESSBAR ) return;
164 /* set max */
165 widget->spec.progressbar.max = max;
166 gui_progressbar_adjust( widget );
167 /* done */
168 if ( widget->visible )
169 gui_widget_draw( widget );
170 }
171 int gui_progressbar_get_value(
172 GuiWidget *widget, int *value )
173 {
174 if ( widget->type != GUI_PROGRESSBAR ) return 0;
175 *value = widget->spec.progressbar.value;
176 return 1;
177 }
178 int gui_progressbar_get_max(
179 GuiWidget *widget, int *max )
180 {
181 if ( widget->type != GUI_PROGRESSBAR ) return 0;
182 *max = widget->spec.progressbar.max;
183 return 1;
184 }
185
0 /***************************************************************************
1 gui_progressbar.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_PROGRESSBAR_H
18 #define __GUI_PROGRESSBAR_H
19
20 /*
21 ====================================================================
22 Create a framed progress bar.
23 ====================================================================
24 */
25 GuiWidget *gui_progressbar_create(
26 GuiWidget *parent, int x, int y, int width, int height,
27 void (*user_event_handler)(GuiWidget*,GuiEvent*),
28 int max, int value );
29
30 /*
31 ====================================================================
32 Get/Set value and limit of progressbar.
33 ====================================================================
34 */
35 void gui_progressbar_set_value(
36 GuiWidget *progressbar, int value );
37 void gui_progressbar_set_max(
38 GuiWidget *progressbar, int max );
39 int gui_progressbar_get_value(
40 GuiWidget *progressbar, int *value );
41 int gui_progressbar_get_max(
42 GuiWidget *widget, int *max );
43
44 #endif
45
0 /***************************************************************************
1 gui_radiogroup.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui_widget.h"
20 #include "gui_radiogroup.h"
21
22 extern GuiTheme *gui_theme;
23 extern SDL_Surface *stk_display;
24
25 /*
26 ====================================================================
27 LOCALS
28 ====================================================================
29 */
30
31 /*
32 ====================================================================
33 Default event handler
34 ====================================================================
35 */
36 static void default_event_handler(
37 GuiWidget *widget, GuiEvent *event )
38 {
39 int px, py, i;
40 switch ( event->type ) {
41 case GUI_DESTROY:
42 if ( widget->spec.radiogroup.checks )
43 free( widget->spec.radiogroup.checks );
44 break;
45 case GUI_DRAW:
46 /* display surface */
47 stk_surface_blit(
48 widget->surface, 0, 0, -1, -1,
49 stk_display,
50 widget->screen_region.x,
51 widget->screen_region.y );
52 /* add checkers */
53 px = widget->screen_region.x +
54 widget->spec.radiogroup.x;
55 py = widget->screen_region.y +
56 widget->spec.radiogroup.y;
57 for ( i = 0; i < widget->spec.radiogroup.size;
58 i++, py += widget->spec.radiogroup.offset ) {
59 if ( widget->spec.radiogroup.checks[i] )
60 stk_surface_blit(
61 gui_theme->checkbox,
62 gui_theme->checkbox_size, 0,
63 gui_theme->checkbox_size,
64 gui_theme->checkbox_size,
65 stk_display, px, py );
66 }
67 break;
68 case GUI_CLICKED:
69 gui_radiogroup_toggle( widget,
70 (event->button.y - widget->screen_region.y -
71 widget->border) / widget->spec.radiogroup.offset );
72 break;
73 }
74 }
75
76 /*
77 ====================================================================
78 PUBLICS
79 ====================================================================
80 */
81
82 /*
83 ====================================================================
84 Create a radiogroup or a checkbox which is nothing but a
85 single entried radiogroup.
86 'caption': checkbox caption
87 'items': items - the widget does not modify the pointers
88 'checked': is True if checkbox checked else False.
89 Radiogroup selections can be set with gui_radiogroup_select().
90 ====================================================================
91 */
92 GuiWidget* gui_checkbox_create(
93 GuiWidget *parent, int x, int y, int width, int height, int with_frame,
94 void (*user_event_handler)(GuiWidget*,GuiEvent*),
95 char *caption, int checked )
96 {
97 GuiWidget *widget;
98 char *items[1];
99 items[0] = caption;
100 /* this is just a single itemed radiogroup */
101 widget = gui_radiogroup_create(
102 parent, x, y, width, height, with_frame, user_event_handler,
103 1, items, 0, 1 );
104 gui_radiogroup_set_checked( widget, 0, checked );
105 return widget;
106 }
107 GuiWidget* gui_radiogroup_create(
108 GuiWidget *parent, int x, int y, int width, int height, int with_frame,
109 void (*user_event_handler)(GuiWidget*,GuiEvent*),
110 int item_count, char **items, int min, int max )
111 {
112 int px, py, i, j, gap = 4;
113 GuiWidget *widget = gui_widget_create(
114 parent, GUI_RADIOGROUP, x, y, width, height,
115 default_event_handler, user_event_handler );
116 /* events */
117 gui_widget_enable_event( widget, GUI_CLICKED );
118 /* create surface, wallpaper and frame it */
119 widget->surface = stk_surface_create(
120 SDL_SWSURFACE, width, height );
121 SDL_SetColorKey( widget->surface, 0,0 );
122 stk_surface_apply_wallpaper( widget->surface, 0,0,-1,-1,
123 gui_theme->widget_wallpaper, -1 );
124 if ( with_frame )
125 widget->border = stk_surface_apply_frame(
126 widget->surface, 0, 0, -1, -1,
127 gui_theme->widget_frame );
128 /* size w/o border */
129 widget->width -= 2 * widget->border;
130 widget->height -= 2 * widget->border;
131 /* various */
132 widget->spec.radiogroup.size = item_count;
133 widget->spec.radiogroup.min = min;
134 widget->spec.radiogroup.max = max;
135 widget->spec.radiogroup.single_check = -1;
136 /* compute offset of single items */
137 widget->spec.radiogroup.offset =
138 (height - 2 * widget->border) /
139 item_count;
140 /* position of first checkbox */
141 widget->spec.radiogroup.x = widget->border + gap;
142 widget->spec.radiogroup.y = widget->border +
143 (widget->spec.radiogroup.offset -
144 gui_theme->checkbox_size) / 2;
145 /* add empty checkboxes and labels */
146 gui_theme->label_font->align = STK_FONT_ALIGN_CENTER_Y;
147 px = widget->spec.radiogroup.x;
148 py = widget->spec.radiogroup.y;
149 for ( i = 0, j = 0; i < widget->spec.radiogroup.size;
150 i++, py += widget->spec.radiogroup.offset, j++ ) {
151 stk_surface_blit(
152 gui_theme->checkbox, 0, 0,
153 gui_theme->checkbox_size,
154 gui_theme->checkbox_size,
155 widget->surface, px, py );
156 stk_font_write( gui_theme->label_font,
157 widget->surface, px + gui_theme->checkbox_size + gap,
158 py + gui_theme->checkbox_size/2, -1, items[j] );
159 }
160 /* create empty checkers */
161 widget->spec.radiogroup.checks = calloc( item_count, sizeof( int ) );
162 if ( widget->spec.radiogroup.checks == 0 )
163 GUI_ABORT( "Out Of Memory" );
164 return widget;
165 }
166
167 /*
168 ====================================================================
169 Set or check if a checkbox in the radiogroup is set.
170 Stores refresh rects if visible.
171 ====================================================================
172 */
173 void gui_radiogroup_set_checked(
174 GuiWidget *widget, int id, int check )
175 {
176 if ( widget->type != GUI_RADIOGROUP )
177 return;
178 if ( id >= widget->spec.radiogroup.size || id < 0 )
179 return;
180 /* if there is at maximum one item selectable
181 we clear the selection to simplify usage */
182 if ( widget->spec.radiogroup.max == 1 ) {
183 memset( widget->spec.radiogroup.checks, 0,
184 widget->spec.radiogroup.size * sizeof( int ) );
185 widget->spec.radiogroup.check_count = 0;
186 widget->spec.radiogroup.single_check = -1;
187 }
188 if ( check ) {
189 /* select item if possible */
190 if ( widget->spec.radiogroup.check_count ==
191 widget->spec.radiogroup.max )
192 return;
193 /* if only one selection is allowed unselect old checker */
194 widget->spec.radiogroup.checks[id] = 1;
195 widget->spec.radiogroup.single_check = id;
196 widget->spec.radiogroup.check_count++;
197 }
198 else {
199 /* unselect item if possible */
200 if ( widget->spec.radiogroup.check_count ==
201 widget->spec.radiogroup.min )
202 return;
203 if ( widget->spec.radiogroup.checks[id] == 0 )
204 return;
205 widget->spec.radiogroup.checks[id] = 0;
206 widget->spec.radiogroup.single_check = -1;
207 widget->spec.radiogroup.check_count--;
208 }
209 if ( widget->visible )
210 gui_widget_draw( widget );
211 }
212 void gui_radiogroup_toggle( GuiWidget *widget, int id )
213 {
214 if ( widget->type != GUI_RADIOGROUP )
215 return;
216 if ( id >= widget->spec.radiogroup.size || id < 0 )
217 return;
218 gui_radiogroup_set_checked(
219 widget, id, !widget->spec.radiogroup.checks[id] );
220 }
221 int gui_radiogroup_is_checked( GuiWidget *widget, int id )
222 {
223 if ( widget->type != GUI_RADIOGROUP )
224 return 0;
225 if ( id >= widget->spec.radiogroup.size || id < 0 )
226 return 0;
227 return widget->spec.radiogroup.checks[id];
228 }
229 /*
230 ====================================================================
231 For radiogroups with at max one items this returns the currently
232 checked id or -1.
233 ====================================================================
234 */
235 int gui_radiogroup_get_checked( GuiWidget *widget )
236 {
237 if ( widget->type != GUI_RADIOGROUP )
238 return -1;
239 if ( widget->spec.radiogroup.max != 1 )
240 return -1;
241 return widget->spec.radiogroup.single_check;
242 }
243
0 /***************************************************************************
1 gui_radiogroup.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_RADIOGROUP_H
18 #define __GUI_RADIOGROUP_H
19
20 /*
21 ====================================================================
22 Create a radiogroup or a checkbox which is nothing but a
23 single entried radiogroup.
24 'caption': checkbox caption
25 'items': items - the widget does not modify the pointers
26 'checked': is True if checkbox checked else False.
27 Radiogroup selections can be set with gui_radiogroup_select().
28 ====================================================================
29 */
30 GuiWidget* gui_checkbox_create(
31 GuiWidget *parent, int x, int y, int width, int height,
32 int with_frame,
33 void (*user_event_handler)(GuiWidget*,GuiEvent*),
34 char *caption, int checked );
35 GuiWidget* gui_radiogroup_create(
36 GuiWidget *parent, int x, int y, int width, int height,
37 int with_frame,
38 void (*user_event_handler)(GuiWidget*,GuiEvent*),
39 int item_count, char **items, int min, int max );
40
41 /*
42 ====================================================================
43 Set or check if a checkbox in the radiogroup is set.
44 Stores refresh rects if visible.
45 ====================================================================
46 */
47 void gui_radiogroup_set_checked(
48 GuiWidget *radiogroup, int id, int check );
49 void gui_radiogroup_toggle( GuiWidget *radiogroup, int id );
50 int gui_radiogroup_is_checked( GuiWidget *radiogroup, int id );
51 /*
52 ====================================================================
53 For radiogroups with at max one items this returns the currently
54 checked id or -1.
55 ====================================================================
56 */
57 int gui_radiogroup_get_checked( GuiWidget *radiogroup );
58
59 #endif
0 /***************************************************************************
1 gui_scrollbar.c - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include "gui_widget.h"
19 #include "gui_button.h"
20 #include "gui_scrollbar.h"
21
22 extern GuiTheme *gui_theme;
23 extern SDL_Surface *stk_display;
24
25 /*
26 ====================================================================
27 LOCALS
28 ====================================================================
29 */
30
31 /*
32 ====================================================================
33 Default event handler
34 ====================================================================
35 */
36 static void default_event_handler(
37 GuiWidget *widget, GuiEvent *event )
38 {
39 switch ( event->type ) {
40 case GUI_DESTROY:
41 break;
42 case GUI_DRAW:
43 /* display surface */
44 stk_surface_blit(
45 widget->surface, 0, 0, -1, -1,
46 stk_display,
47 widget->screen_region.x,
48 widget->screen_region.y );
49 break;
50 case GUI_BUTTON_PRESSED:
51 if ( widget->spec.scrollbar.vertical ) {
52 if ( event->button.y <
53 widget->spec.scrollbar.track->
54 screen_region.y )
55 gui_scrollbar_add( widget,
56 -widget->spec.scrollbar.jump );
57 else
58 gui_scrollbar_add( widget,
59 widget->spec.scrollbar.jump );
60 }
61 else {
62 if ( event->button.x <
63 widget->spec.scrollbar.track->
64 screen_region.x )
65 gui_scrollbar_add( widget,
66 -widget->spec.scrollbar.jump );
67 else
68 gui_scrollbar_add( widget,
69 widget->spec.scrollbar.jump );
70 }
71 break;
72 }
73 }
74
75 /*
76 ====================================================================
77 Warp track button of scrollbar to correct position.
78 ====================================================================
79 */
80 static void gui_scrollbar_update_track( GuiWidget *widget )
81 {
82 int offset;
83 if ( widget->type != GUI_SCROLLBAR ) return;
84 if ( widget->spec.scrollbar.min == widget->spec.scrollbar.max )
85 offset = 0;
86 else
87 offset =
88 (((widget->spec.scrollbar.vertical) ?
89 widget->parent_region.h :
90 widget->parent_region.w) -
91 (widget->spec.scrollbar.button_size * 3) ) *
92 widget->spec.scrollbar.value /
93 (widget->spec.scrollbar.max - widget->spec.scrollbar.min);
94 gui_widget_warp( widget->spec.scrollbar.track,
95 (widget->spec.scrollbar.vertical) ? 0 :
96 (offset + widget->spec.scrollbar.button_size),
97 (widget->spec.scrollbar.vertical)?
98 (offset + widget->spec.scrollbar.button_size) : 0 );
99 }
100
101 /*
102 ====================================================================
103 Update the scrollbar value by position of track button,
104 return True if it has changed and call event handler with
105 GUI_CHANGED.
106 ====================================================================
107 */
108 static int gui_scrollbar_adjust( GuiWidget *widget )
109 {
110 int new_value;
111 if ( widget->type != GUI_SCROLLBAR ) return 0;
112 new_value = (((widget->spec.scrollbar.vertical) ?
113 widget->spec.scrollbar.track->parent_region.y :
114 widget->spec.scrollbar.track->parent_region.x) -
115 widget->spec.scrollbar.button_size) *
116 (widget->spec.scrollbar.max - widget->spec.scrollbar.min) /
117 (((widget->spec.scrollbar.vertical) ?
118 widget->parent_region.h :
119 widget->parent_region.w) -
120 widget->spec.scrollbar.button_size * 3);
121 if ( new_value != widget->spec.scrollbar.value ) {
122 widget->spec.scrollbar.value = new_value;
123 gui_widget_call_user_event_handler(
124 widget, gui_event_get_simple( GUI_CHANGED ) );
125 return 1;
126 }
127 return 0;
128 }
129
130 /*
131 ====================================================================
132 Default event handlers for scrollbar buttons: update the
133 scrollbar if a button was clicked and pass the event to the
134 scrollbar's user event handler.
135 ====================================================================
136 */
137 static void gui_scrollbar_dec_handler(
138 GuiWidget *widget, GuiEvent *event )
139 {
140 if ( event->type == GUI_CLICKED )
141 gui_scrollbar_add( widget->parent,
142 -widget->parent->spec.scrollbar.step );
143 gui_widget_call_user_event_handler(
144 widget->parent, event );
145 }
146 static void gui_scrollbar_inc_handler(
147 GuiWidget *widget, GuiEvent *event )
148 {
149 if ( event->type == GUI_CLICKED )
150 gui_scrollbar_add( widget->parent,
151 widget->parent->spec.scrollbar.step );
152 gui_widget_call_user_event_handler(
153 widget->parent, event );
154 }
155 static void gui_scrollbar_track_handler(
156 GuiWidget *widget, GuiEvent *event )
157 {
158 int pos;
159 if ( event->type == GUI_MOTION )
160 if ( event->motion.button ) {
161 if ( widget->parent->spec.scrollbar.vertical ) {
162 /* absolute offset in parent */
163 pos = widget->parent_region.y +
164 event->motion.yrel;
165 if ( pos < widget->parent->spec.scrollbar.button_size )
166 pos = widget->parent->spec.scrollbar.button_size;
167 else
168 if ( pos >= widget->parent->parent_region.h -
169 (widget->parent->spec.scrollbar.button_size<<1) )
170 pos = widget->parent->parent_region.h -
171 (widget->parent->spec.scrollbar.button_size<<1);
172 /* move */
173 gui_widget_warp( widget, 0, pos );
174 }
175 else {
176 /* absolute offset in parent */
177 pos = widget->parent_region.x +
178 event->motion.xrel;
179 if ( pos < widget->parent->spec.scrollbar.button_size )
180 pos = widget->parent->spec.scrollbar.button_size;
181 else
182 if ( pos >= widget->parent->parent_region.w -
183 (widget->parent->spec.scrollbar.button_size<<1) )
184 pos = widget->parent->parent_region.w -
185 (widget->parent->spec.scrollbar.button_size<<1);
186 /* move */
187 gui_widget_warp( widget, pos, 0 );
188 }
189 /* update value */
190 gui_scrollbar_adjust( widget->parent );
191 }
192 /* send event */
193 gui_widget_call_user_event_handler(
194 widget->parent, event );
195 }
196
197 /*
198 ====================================================================
199 PUBLICS
200 ====================================================================
201 */
202
203 /*
204 ====================================================================
205 Create an either vertical or horizontal scrollbar. The increase/
206 decrease/track buttons are square.
207 ====================================================================
208 */
209 GuiWidget* gui_scrollbar_create(
210 GuiWidget *parent, int x, int y, int width, int height,
211 void (*user_event_handler)(GuiWidget*,GuiEvent*),
212 int vertical, int min, int max, int step, int jump, int value )
213 {
214 int size;
215 GuiWidget *widget = gui_widget_create(
216 parent, GUI_SCROLLBAR, x, y, width, height,
217 default_event_handler, user_event_handler );
218 /* events */
219 gui_widget_enable_event( widget, GUI_CHANGED );
220 /* create surface and wallpaper it */
221 widget->surface = stk_surface_create(
222 SDL_SWSURFACE, width, height );
223 SDL_SetColorKey( widget->surface, 0,0 );
224 stk_surface_apply_wallpaper(
225 widget->surface, 0, 0, -1, -1,
226 gui_theme->widget_wallpaper, -1 );
227 /* get scrollbar size and add frame */
228 if ( vertical ) {
229 size = width;
230 stk_surface_apply_frame(
231 widget->surface, 0, size, size, height - 2 * size,
232 gui_theme->widget_frame );
233 }
234 else {
235 size = height;
236 stk_surface_apply_frame(
237 widget->surface, size, 0, width - 2 * size, size,
238 gui_theme->widget_frame );
239 }
240 /* various */
241 widget->spec.scrollbar.vertical = vertical;
242 widget->spec.scrollbar.button_size = size;
243 /* add inc/dec/track buttons */
244 widget->spec.scrollbar.dec =
245 gui_button_create( widget, 0, 0, size, size,
246 gui_scrollbar_dec_handler,
247 gui_theme->scrollbar_arrows,
248 (vertical)?0:
249 (gui_theme->scrollbar_arrow_size*2),
250 0,
251 gui_theme->scrollbar_arrow_size,
252 gui_theme->scrollbar_arrow_size, 0 );
253 gui_widget_disable_event( widget->spec.scrollbar.dec, GUI_FOCUS_IN );
254 gui_widget_disable_event( widget->spec.scrollbar.dec, GUI_FOCUS_OUT );
255 widget->spec.scrollbar.inc =
256 gui_button_create( widget,
257 (vertical)?0:(width-size),
258 (vertical)?(height-size):0,
259 size, size,
260 gui_scrollbar_inc_handler,
261 gui_theme->scrollbar_arrows,
262 gui_theme->scrollbar_arrow_size +
263 ((vertical)?0:
264 (gui_theme->scrollbar_arrow_size*2)),
265 0,
266 gui_theme->scrollbar_arrow_size,
267 gui_theme->scrollbar_arrow_size, 0 );
268 gui_widget_disable_event( widget->spec.scrollbar.inc, GUI_FOCUS_IN );
269 gui_widget_disable_event( widget->spec.scrollbar.inc, GUI_FOCUS_OUT );
270 widget->spec.scrollbar.track =
271 gui_button_create( widget, 0, 0, size, size,
272 gui_scrollbar_track_handler,
273 0,0,0,0,0, 0 );
274 /* our trackbutton needs the motion event monitored */
275 gui_widget_enable_event( widget->spec.scrollbar.track, GUI_MOTION );
276 gui_widget_disable_event( widget->spec.scrollbar.track, GUI_FOCUS_IN );
277 gui_widget_disable_event( widget->spec.scrollbar.track, GUI_FOCUS_OUT );
278 /* track grabs focus if pressed to simplify usage */
279 widget->spec.scrollbar.track->grab_focus = 1;
280 /* range */
281 gui_scrollbar_set_range( widget, min, max, step, jump );
282 gui_scrollbar_set_value( widget, value );
283 /* done */
284 return widget;
285 }
286
287 /*
288 ====================================================================
289 Set or get scrollbar value. Get returns False if this was no
290 scrollbar.
291 ====================================================================
292 */
293 void gui_scrollbar_set_value( GuiWidget *widget, int value )
294 {
295 if ( widget->type == GUI_SCROLLBAR ) {
296 widget->spec.scrollbar.value = value;
297 gui_scrollbar_update_track( widget );
298 }
299 }
300 int gui_scrollbar_get_value( GuiWidget *widget, int *value )
301 {
302 if ( widget->type != GUI_SCROLLBAR )
303 return 0;
304 *value = widget->spec.scrollbar.value;
305 return 1;
306 }
307 /*
308 ====================================================================
309 Set the range of the scrollbar. Stores refresh rects if visible.
310 -1 for any value means to keep the current setting.
311 ====================================================================
312 */
313 int gui_scrollbar_set_range(
314 GuiWidget *widget, int min, int max, int step, int jump )
315 {
316 if ( widget->type != GUI_SCROLLBAR )
317 return 0;
318 if ( min != -1 ) widget->spec.scrollbar.min = min;
319 if ( max != -1 ) widget->spec.scrollbar.max = max;
320 if ( step != -1 ) widget->spec.scrollbar.step = step;
321 if ( jump != -1 ) widget->spec.scrollbar.jump = jump;
322 gui_scrollbar_update_track( widget );
323 return 1;
324 }
325 /*
326 ====================================================================
327 Modify value of scrollbar by the passed amount and update,
328 return True if it has changed and call event handler with
329 GUI_CHANGED.
330 ====================================================================
331 */
332 int gui_scrollbar_add( GuiWidget *widget, int change )
333 {
334 int old_value = widget->spec.scrollbar.value;
335 if ( widget->type != GUI_SCROLLBAR ) return 0;
336 widget->spec.scrollbar.value += change;
337 if ( widget->spec.scrollbar.value < widget->spec.scrollbar.min )
338 widget->spec.scrollbar.value = widget->spec.scrollbar.min;
339 if ( widget->spec.scrollbar.value > widget->spec.scrollbar.max )
340 widget->spec.scrollbar.value = widget->spec.scrollbar.max;
341 gui_scrollbar_update_track( widget );
342 if ( old_value != widget->spec.scrollbar.value ) {
343 gui_widget_call_user_event_handler(
344 widget, gui_event_get_simple( GUI_CHANGED ) );
345 return 1;
346 }
347 return 0;
348 }
349
0 /***************************************************************************
1 gui_scrollbar.h - description
2 -------------------
3 begin : Wed Oct 16 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_SCROLLBAR_H
18 #define __GUI_SCROLLBAR_H
19
20 /*
21 ====================================================================
22 Create an either vertical or horizontal scrollbar. The increase/
23 decrease/track buttons are square.
24 ====================================================================
25 */
26 GuiWidget* gui_scrollbar_create(
27 GuiWidget *parent, int x, int y, int width, int height,
28 void (*user_event_handler)(GuiWidget*,GuiEvent*),
29 int vertical, int min, int max, int step, int jump, int value );
30
31 /*
32 ====================================================================
33 Set or get scrollbar value. Get returns False if this was no
34 scrollbar.
35 ====================================================================
36 */
37 void gui_scrollbar_set_value( GuiWidget *scrollbar, int value );
38 int gui_scrollbar_get_value( GuiWidget *scrollbar, int *value );
39 /*
40 ====================================================================
41 Set the range of the scrollbar. Stores refresh rects if visible.
42 -1 for any value means to keep the current setting.
43 ====================================================================
44 */
45 int gui_scrollbar_set_range(
46 GuiWidget *scrollbar, int min, int max, int step, int jump );
47 /*
48 ====================================================================
49 Modify value of scrollbar by the passed amount and update,
50 return True if it has changed and call event handler with
51 GUI_CHANGED.
52 ====================================================================
53 */
54 int gui_scrollbar_add( GuiWidget *widget, int change );
55
56 #endif
57
0 /***************************************************************************
1 gui_spinbutton.c - description
2 -------------------
3 begin : Sat Oct 19 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui_widget.h"
20 #include "gui_spinbutton.h"
21 #include "gui_button.h"
22 #include "gui_edit.h"
23
24 extern GuiTheme *gui_theme;
25 extern SDL_Surface *stk_display;
26
27 /*
28 ====================================================================
29 LOCALS
30 ====================================================================
31 */
32
33 /*
34 ====================================================================
35 Default event handler
36 ====================================================================
37 */
38 static void default_event_handler(
39 GuiWidget *widget, GuiEvent *event )
40 {
41 switch ( event->type ) {
42 case GUI_DESTROY:
43 break;
44 case GUI_DRAW:
45 break;
46 }
47 }
48
49 /*
50 ====================================================================
51 Handle edit and restrict input to digits and minus. Check range.
52 The GUI_CHANGED event from the edit is blocked if an invalid
53 character was added.
54 ====================================================================
55 */
56 static void gui_spinbutton_edit_handler(
57 GuiWidget *widget, GuiEvent *event )
58 {
59 char aux[GUI_SPINBUTTON_LENGTH + 1];
60 int old_value;
61 if ( event->type == GUI_CHANGED ) {
62 old_value = widget->parent->spec.spinbutton.value;
63 gui_edit_get_text( widget, aux,
64 GUI_SPINBUTTON_LENGTH + 1, 0, -1 );
65 widget->parent->spec.spinbutton.value = atoi( aux );
66 /* check if we hit upper limit */
67 if ( widget->parent->spec.spinbutton.value >
68 widget->parent->spec.spinbutton.max ) {
69 widget->parent->spec.spinbutton.value =
70 widget->parent->spec.spinbutton.max;
71 snprintf( aux, GUI_SPINBUTTON_LENGTH + 1,
72 "%i", widget->parent->spec.spinbutton.value );
73 gui_edit_set_text( widget, aux );
74 }
75 if ( old_value != widget->parent->spec.spinbutton.value )
76 gui_widget_call_user_event_handler(
77 widget->parent, event );
78 }
79 else
80 gui_widget_call_user_event_handler(
81 widget->parent, event );
82 }
83 /*
84 ====================================================================
85 Handle increase/decrease buttons.
86 ====================================================================
87 */
88 static void gui_spinbutton_inc_handler(
89 GuiWidget *widget, GuiEvent *event )
90 {
91 if ( event->type == GUI_CLICKED )
92 if ( widget->parent->spec.spinbutton.value <
93 widget->parent->spec.spinbutton.max ) {
94 widget->parent->spec.spinbutton.value +=
95 widget->parent->spec.spinbutton.step;
96 if ( widget->parent->spec.spinbutton.value >
97 widget->parent->spec.spinbutton.max )
98 widget->parent->spec.spinbutton.value =
99 widget->parent->spec.spinbutton.max;
100 gui_spinbutton_set_value( widget->parent,
101 widget->parent->spec.spinbutton.value );
102 gui_widget_call_user_event_handler(
103 widget->parent,
104 gui_event_get_simple( GUI_CHANGED ) );
105 }
106 gui_widget_call_user_event_handler( widget->parent, event );
107 }
108 static void gui_spinbutton_dec_handler(
109 GuiWidget *widget, GuiEvent *event )
110 {
111 if ( event->type == GUI_CLICKED )
112 if ( widget->parent->spec.spinbutton.value >
113 widget->parent->spec.spinbutton.min ) {
114 widget->parent->spec.spinbutton.value -=
115 widget->parent->spec.spinbutton.step;
116 if ( widget->parent->spec.spinbutton.value <
117 widget->parent->spec.spinbutton.min )
118 widget->parent->spec.spinbutton.value =
119 widget->parent->spec.spinbutton.min;
120 gui_spinbutton_set_value( widget->parent,
121 widget->parent->spec.spinbutton.value );
122 gui_widget_call_user_event_handler(
123 widget->parent,
124 gui_event_get_simple( GUI_CHANGED ) );
125 }
126 gui_widget_call_user_event_handler( widget->parent, event );
127 }
128
129 /*
130 ====================================================================
131 PUBLICS
132 ====================================================================
133 */
134
135 /*
136 ====================================================================
137 Create a spinbutton which is an alphanumerical edit with an
138 increase and a decrease button both the size of height x height/2
139 at the right end of the edit.
140 ====================================================================
141 */
142 GuiWidget* gui_spinbutton_create(
143 GuiWidget *parent, int x, int y, int width, int height,
144 void (*user_event_handler)(GuiWidget*,GuiEvent*),
145 int min, int max, int step, int value )
146 {
147 GuiWidget *widget = gui_widget_create(
148 parent, GUI_SPINBUTTON, x, y, width, height,
149 default_event_handler, user_event_handler );
150 /* events */
151 gui_widget_enable_event( widget, GUI_CHANGED );
152 /* build empty surface */
153 widget->surface = stk_surface_create(
154 SDL_SWSURFACE, width, height );
155 /* set range */
156 widget->spec.spinbutton.min = min;
157 widget->spec.spinbutton.max = max;
158 widget->spec.spinbutton.step = step;
159 /* build edit */
160 widget->spec.spinbutton.edit = gui_edit_create(
161 widget, 0, 0, width - height, height,
162 gui_spinbutton_edit_handler, 2, 0,
163 GUI_SPINBUTTON_LENGTH, "undefined" );
164 gui_edit_set_filter(
165 widget->spec.spinbutton.edit, GUI_EDIT_NUMERICAL );
166 gui_widget_disable_event(
167 widget->spec.spinbutton.edit, GUI_FOCUS_IN );
168 gui_widget_disable_event(
169 widget->spec.spinbutton.edit, GUI_FOCUS_OUT );
170 /* by default edit can't be edited */
171 widget->spec.spinbutton.edit->active = 0;
172 /* build buttons */
173 widget->spec.spinbutton.inc = gui_button_create(
174 widget, width - height, 0, height, height / 2,
175 gui_spinbutton_inc_handler,
176 gui_theme->spinbutton_arrows, 0,0,
177 gui_theme->spinbutton_arrow_size,
178 gui_theme->spinbutton_arrow_size, 0 );
179 gui_widget_disable_event(
180 widget->spec.spinbutton.inc, GUI_FOCUS_IN );
181 gui_widget_disable_event(
182 widget->spec.spinbutton.inc, GUI_FOCUS_OUT );
183 widget->spec.spinbutton.dec = gui_button_create(
184 widget, width - height, height/2, height, height / 2,
185 gui_spinbutton_dec_handler,
186 gui_theme->spinbutton_arrows,
187 gui_theme->spinbutton_arrow_size,0,
188 gui_theme->spinbutton_arrow_size,
189 gui_theme->spinbutton_arrow_size, 0 );
190 gui_widget_disable_event(
191 widget->spec.spinbutton.dec, GUI_FOCUS_IN );
192 gui_widget_disable_event(
193 widget->spec.spinbutton.dec, GUI_FOCUS_OUT );
194 /* set value */
195 gui_spinbutton_set_value( widget, value );
196 /* done */
197 return widget;
198 }
199
200 /*
201 ====================================================================
202 Get/set spinbutton's value. Get returns False if this was no
203 spinbutton.
204 ====================================================================
205 */
206 void gui_spinbutton_set_value( GuiWidget *widget, int value )
207 {
208 char aux[GUI_SPINBUTTON_LENGTH + 1];
209 if ( widget->type == GUI_SPINBUTTON ) {
210 widget->spec.spinbutton.value = value;
211 snprintf( aux, GUI_SPINBUTTON_LENGTH + 1, "%i", value );
212 gui_edit_set_text( widget->spec.spinbutton.edit, aux );
213 }
214 }
215 int gui_spinbutton_get_value( GuiWidget *widget, int *value )
216 {
217 if ( widget->type != GUI_SPINBUTTON )
218 return 0;
219 *value = widget->spec.spinbutton.value;
220 if ( *value < widget->spec.spinbutton.min )
221 *value = widget->spec.spinbutton.min;
222 if ( *value > widget->spec.spinbutton.max )
223 *value = widget->spec.spinbutton.max;
224 return 1;
225 }
226 /*
227 ====================================================================
228 Set the range of the spinbutton. Stores refresh rects if visible.
229 -1 for any value means to keep the current setting.
230 ====================================================================
231 */
232 int gui_spinbutton_set_range(
233 GuiWidget *widget, int min, int max, int step )
234 {
235 if ( widget->type != GUI_SPINBUTTON )
236 return 0;
237 if ( min != -1 ) widget->spec.spinbutton.min = min;
238 if ( max != -1 ) widget->spec.spinbutton.max = max;
239 if ( step != -1 ) widget->spec.spinbutton.step = step;
240 return 1;
241 }
242
243 /*
244 ====================================================================
245 (De)Activate edit of spinbutton. If the entered value is greater
246 than the maximum it is set to maximum. If it's less than minimum
247 it is _not_ reset (else it would be impossible to enter new
248 values) However, if the value is queried by
249 gui_spinbutton_get_value() it is checked for its range.
250 ====================================================================
251 */
252 void gui_spinbutton_enable_edit( GuiWidget *widget, int enable )
253 {
254 widget->spec.spinbutton.edit->active = enable;
255 }
0 /***************************************************************************
1 gui_spinbutton.h - description
2 -------------------
3 begin : Sat Oct 19 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_SPINBUTTON_H
18 #define __GUI_SPINBUTTON_H
19
20 /* maximum number of characters (minus/digits) in the edit */
21 enum { GUI_SPINBUTTON_LENGTH = 15 };
22
23 /*
24 ====================================================================
25 Create a spinbutton which is an alphanumerical edit with an
26 increase and a decrease button both the size of height x height/2
27 at the right end of the edit.
28 ====================================================================
29 */
30 GuiWidget* gui_spinbutton_create(
31 GuiWidget *parent, int x, int y, int width, int height,
32 void (*user_event_handler)(GuiWidget*,GuiEvent*),
33 int min, int max, int step, int value );
34
35 /*
36 ====================================================================
37 Get/set spinbutton's value. Get returns False if this was no
38 spinbutton.
39 ====================================================================
40 */
41 void gui_spinbutton_set_value( GuiWidget *spinbutton, int value );
42 int gui_spinbutton_get_value( GuiWidget *spinbutton, int *value );
43 /*
44 ====================================================================
45 Set the range of the spinbutton. Stores refresh rects if visible.
46 -1 for any value means to keep the current setting.
47 ====================================================================
48 */
49 int gui_spinbutton_set_range(
50 GuiWidget *spinbutton, int min, int max, int step );
51
52 /*
53 ====================================================================
54 (De)Activate edit of spinbutton. If the entered value is greater
55 than the maximum it is set to maximum. If it's less than minimum
56 it is _not_ reset (else it would be impossible to enter new
57 values) However, if the value is queried by
58 gui_spinbutton_get_value() it is checked for its range.
59 ====================================================================
60 */
61 void gui_spinbutton_enable_edit( GuiWidget *spinbutton, int enable );
62
63 #endif
64
0 /***************************************************************************
1 gui_theme.c - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include "gui_theme.h"
21
22 #define ABORT( msg ) { fprintf( stderr, "%s\n", msg ); exit(1); }
23
24 GuiTheme *gui_theme = 0;
25
26 /*
27 ====================================================================
28 Load a theme from a theme directory. The surface path set by
29 stk_surface_set_path() is prepended.
30 ====================================================================
31 */
32
33 GuiTheme* gui_theme_load( char *name )
34 {
35 GuiTheme *theme = calloc( 1, sizeof( GuiTheme ) );
36 if ( theme == 0 ) ABORT( "Out Of Memory" )
37
38 theme->box_wallpaper =
39 stk_surface_load( SDL_SWSURFACE,
40 "%s/box_wallpaper.png", name );
41 theme->widget_wallpaper =
42 stk_surface_load( SDL_SWSURFACE,
43 "%s/widget_wallpaper.png", name );
44 theme->box_frame =
45 stk_surface_load( SDL_SWSURFACE,
46 "%s/box_frame.png", name );
47 theme->widget_frame =
48 stk_surface_load( SDL_SWSURFACE,
49 "%s/widget_frame.png", name );
50 theme->button_frame_normal =
51 stk_surface_load( SDL_SWSURFACE,
52 "%s/button_frame_normal.png", name );
53 theme->button_frame_clicked =
54 stk_surface_load( SDL_SWSURFACE,
55 "%s/button_frame_clicked.png", name );
56 theme->button_wallpaper_normal =
57 stk_surface_load( SDL_SWSURFACE,
58 "%s/button_wallpaper_normal.png", name );
59 theme->button_wallpaper_focused =
60 stk_surface_load( SDL_SWSURFACE,
61 "%s/button_wallpaper_focused.png", name );
62 theme->scrollbar_arrows =
63 stk_surface_load( SDL_SWSURFACE,
64 "%s/scrollbar_arrows.png", name );
65 theme->scrollbar_arrow_size =
66 theme->scrollbar_arrows->h;
67 theme->checkbox =
68 stk_surface_load( SDL_SWSURFACE,
69 "%s/checkbox.png", name );
70 theme->checkbox_size = theme->checkbox->h;
71 theme->progress_high =
72 stk_surface_load( SDL_SWSURFACE,
73 "%s/progress_high.png", name );
74 theme->progress_medium =
75 stk_surface_load( SDL_SWSURFACE,
76 "%s/progress_medium.png", name );
77 theme->progress_low =
78 stk_surface_load( SDL_SWSURFACE,
79 "%s/progress_low.png", name );
80 theme->list_item_color =
81 stk_surface_load( SDL_SWSURFACE,
82 "%s/list_item_color.png", name );
83 theme->spinbutton_arrows =
84 stk_surface_load( SDL_SWSURFACE,
85 "%s/spinbutton_arrows.png", name );
86 theme->spinbutton_arrow_size =
87 theme->spinbutton_arrows->h;
88
89 theme->font =
90 stk_font_load( SDL_SWSURFACE, "%s/font.png", name );
91 theme->edit_font =
92 stk_font_load( SDL_SWSURFACE, "%s/font.png", name );
93 theme->label_font =
94 stk_font_load( SDL_SWSURFACE, "%s/font.png", name );
95 theme->button_font = theme->font;
96 theme->progressbar_font = theme->font;
97
98 theme->click_sound =
99 stk_sound_load( -1, "%s/click.wav", name );
100 theme->type_sound =
101 stk_sound_load( -1, "%s/edit.wav", name );
102
103 return theme;
104 }
105
106 /*
107 ====================================================================
108 Free the memory of a surface if not NULL and reset the pointer
109 to NULL.
110 ====================================================================
111 */
112 void gui_theme_delete( GuiTheme **theme )
113 {
114 if ( *theme ) {
115 stk_surface_free( &(*theme)->box_wallpaper );
116 stk_surface_free( &(*theme)->widget_wallpaper );
117 stk_surface_free( &(*theme)->box_frame );
118 stk_surface_free( &(*theme)->widget_frame );
119 stk_surface_free( &(*theme)->button_frame_normal );
120 stk_surface_free( &(*theme)->button_frame_clicked );
121 stk_surface_free( &(*theme)->button_wallpaper_normal );
122 stk_surface_free( &(*theme)->button_wallpaper_focused );
123 stk_surface_free( &(*theme)->scrollbar_arrows );
124 stk_surface_free( &(*theme)->checkbox );
125 stk_surface_free( &(*theme)->progress_high );
126 stk_surface_free( &(*theme)->progress_medium );
127 stk_surface_free( &(*theme)->progress_low );
128 stk_surface_free( &(*theme)->list_item_color );
129 stk_surface_free( &(*theme)->spinbutton_arrows );
130 stk_font_free( &(*theme)->font );
131 stk_font_free( &(*theme)->edit_font );
132 stk_font_free( &(*theme)->label_font );
133 stk_sound_free( &(*theme)->click_sound );
134 stk_sound_free( &(*theme)->type_sound );
135 free( *theme ); *theme = 0;
136 }
137 }
138
139 /*
140 ====================================================================
141 Select the current theme. New widgets will use its graphics.
142 ====================================================================
143 */
144 void gui_theme_select( GuiTheme *theme )
145 {
146 gui_theme = theme;
147 }
148
0 /***************************************************************************
1 gui_theme.h - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_THEME_H
18 #define __GUI_THEME_H
19
20 #include "stk.h"
21
22 /*
23 ====================================================================
24 All widgets need a basic set of graphics and this is it.
25 It provides a wallpaper, a frame, a basic button, arrows for
26 scrollbars etc. However it cannot be changed on runtime so
27 once a widget is completed it looks like it looks.
28 ====================================================================
29 */
30 typedef struct {
31 SDL_Surface *box_wallpaper; /* wallpaper for box widget */
32 SDL_Surface *widget_wallpaper; /* wallpaper for other widgets */
33 SDL_Surface *box_frame; /* frame for box window */
34 SDL_Surface *widget_frame; /* frame for other widgets */
35 SDL_Surface *button_frame_normal,
36 *button_frame_clicked; /* frames for the different
37 button types */
38 SDL_Surface *button_wallpaper_normal,
39 *button_wallpaper_focused; /* button wallpapers */
40 StkFont *font; /* standard font */
41 SDL_Surface *scrollbar_arrows; /* scrollbar arrows */
42 int scrollbar_arrow_size; /* arrows are square */
43 SDL_Surface *checkbox; /* checkbox and checker */
44 int checkbox_size; /* checkboxes are square */
45 SDL_Surface *progress_high,
46 *progress_medium,
47 *progress_low; /* three wallpapers for
48 progressbar (25%,60%,100%) */
49 SDL_Surface *list_item_color; /* color of the selection box */
50 SDL_Surface *spinbutton_arrows; /* scrollbar arrows */
51 int spinbutton_arrow_size; /* arrows are square */
52 StkFont *button_font; /* font for button captions */
53 StkFont *label_font; /* font for labels */
54 StkFont *progressbar_font;
55 StkFont *edit_font;
56 /* sounds */
57 StkSound *click_sound;
58 StkSound *type_sound;
59 } GuiTheme;
60
61 /*
62 ====================================================================
63 Load a theme from a theme directory. The surface path set by
64 stk_surface_set_path() is prepended.
65 ====================================================================
66 */
67 GuiTheme* gui_theme_load( char *name );
68
69 /*
70 ====================================================================
71 Free the memory of a surface if not NULL and reset the pointer
72 to NULL.
73 ====================================================================
74 */
75 void gui_theme_delete( GuiTheme **theme );
76
77 /*
78 ====================================================================
79 Select the current theme. New widgets will use its graphics.
80 ====================================================================
81 */
82 void gui_theme_select( GuiTheme *theme );
83
84 #endif
85
0 /***************************************************************************
1 gui_widget.c - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include "gui_widget.h"
20
21 extern GuiTheme *gui_theme;
22 extern SDL_Surface *stk_display;
23 extern List *gui_root_stack;
24 extern List *gui_visible_stack;
25 extern List *gui_timed_stack;
26
27 GuiWidget *gui_key_widget = 0;
28 /* is the last child widget of _all_ visible key grabbing
29 widgets that was clicked on */
30 GuiWidget *gui_clicked_widget = 0;
31 /* is the last child widget of _all_ visible widgets
32 that was clicked on (used to clear 'pressed' flag) */
33 GuiWidget *gui_focused_widget = 0;
34 /* the very toplevel widget of all visible widgets
35 the mouse pointer hovers above */
36
37 /*
38 ====================================================================
39 LOCALS
40 ====================================================================
41 */
42
43 /*
44 ====================================================================
45 Free the memory of a widget and all its subwidgets.
46 ====================================================================
47 */
48 static void gui_widget_delete_intern( GuiWidget *widget )
49 {
50 GuiWidget *child;
51 if ( widget ) {
52 /* go recursive */
53 list_reset( widget->widgets );
54 while ( ( child = list_next( widget->widgets ) ) )
55 gui_widget_delete_intern( child );
56 /* free common data */
57 list_delete( widget->widgets );
58 stk_surface_free( &widget->surface );
59 /* free special data */
60 widget->default_event_handler(
61 widget, gui_event_get_simple( GUI_DESTROY ) );
62 /* widget itself */
63 free( widget );
64 }
65 }
66
67 /*
68 ====================================================================
69 Draw the widget and its children. gui_widget_draw() disabled
70 the display monitoring and will add the widgets screen_region
71 as update rectangle.
72 ====================================================================
73 */
74 static void gui_widget_draw_intern( GuiWidget *widget )
75 {
76 GuiWidget *child = 0;
77 /* draw widget */
78 widget->default_event_handler(
79 widget, gui_event_get_simple( GUI_DRAW ) );
80 /* draw children */
81 list_reset( widget->widgets );
82 while ( ( child = list_next( widget->widgets ) ) )
83 gui_widget_draw_intern( child );
84 }
85
86 /*
87 ====================================================================
88 Set visible flag to 'visible' for widget and all children
89 recursively.
90 ====================================================================
91 */
92 static void gui_widget_show_intern( GuiWidget *widget, int visible )
93 {
94 GuiWidget *child;
95 widget->visible = visible;
96 list_reset( widget->widgets );
97 while ( ( child = list_next( widget->widgets ) ) )
98 gui_widget_show_intern( child, visible );
99 }
100
101 /*
102 ====================================================================
103 If there are any root windows above this widget in the stack that
104 overlap this one they need to be redrawn. We clip to the widgets
105 screen region and redraw all root widgets above.
106 ====================================================================
107 */
108 static void gui_widget_redraw_overlapping_roots(
109 GuiWidget *widget )
110 {
111 ListEntry *entry;
112 if ( gui_visible_stack->count > 1 )
113 if ( list_last( gui_visible_stack ) != widget->root ) {
114 /* clip */
115 stk_surface_clip( stk_display,
116 widget->screen_region.x, widget->screen_region.y,
117 widget->screen_region.w, widget->screen_region.h );
118 /* get first root widget above */
119 entry = list_entry(
120 gui_visible_stack, widget->root );
121 if ( !entry ) {
122 fprintf( stderr,
123 "'visible_stack' corrupted: root widget not found\n" );
124 return;
125 }
126 entry = entry->next;
127 /* redraw */
128 while ( entry != gui_visible_stack->tail ) {
129 gui_widget_draw_intern( (GuiWidget*)entry->item );
130 entry = entry->next;
131 }
132 /* unclip */
133 stk_surface_clip( stk_display, 0,0,-1,-1 );
134 }
135 }
136
137 /*
138 ====================================================================
139 Move position by relative value for all widgets.
140 ====================================================================
141 */
142 static void gui_widget_move_intern(
143 GuiWidget *widget, int rel_x, int rel_y)
144 {
145 GuiWidget *child;
146 widget->screen_region.x += rel_x;
147 widget->screen_region.y += rel_y;
148 widget->parent_region.x += rel_x;
149 widget->parent_region.y += rel_y;
150 list_reset( widget->widgets );
151 while ( ( child = list_next( widget->widgets ) ) )
152 gui_widget_move_intern( child, rel_x, rel_y );
153 }
154
155 /*
156 ====================================================================
157 PUBLICS
158 ====================================================================
159 */
160
161 /*
162 ====================================================================
163 GUI events
164 ====================================================================
165 */
166
167 /*
168 ====================================================================
169 Return pointer to simple event (one that doesn't need
170 additional data)
171 ====================================================================
172 */
173 static GuiEvent aux_event;
174 GuiEvent *gui_event_get_simple( int type )
175 {
176 aux_event.type = type;
177 return &aux_event;
178 }
179
180 /*
181 ====================================================================
182 Initiate a GUI event from an SDL event.
183 ====================================================================
184 */
185 void gui_event_init( GuiEvent *gui_event, SDL_Event *sdl_event )
186 {
187 int i;
188 memset( gui_event, 0, sizeof( GuiEvent ) );
189 switch ( sdl_event->type ) {
190 case SDL_MOUSEMOTION:
191 gui_event->type = GUI_MOTION;
192 gui_event->motion.x = sdl_event->motion.x;
193 gui_event->motion.y = sdl_event->motion.y;
194 gui_event->motion.xrel = sdl_event->motion.xrel;
195 gui_event->motion.yrel = sdl_event->motion.yrel;
196 gui_event->motion.state = sdl_event->motion.state;
197 for ( i = 1; i <= 3; i++ )
198 if ( sdl_event->motion.state & SDL_BUTTON(i) ) {
199 gui_event->motion.button = i;
200 break;
201 }
202 break;
203 case SDL_MOUSEBUTTONUP:
204 case SDL_MOUSEBUTTONDOWN:
205 if ( sdl_event->type == SDL_MOUSEBUTTONUP )
206 gui_event->type = GUI_BUTTON_RELEASED;
207 else
208 gui_event->type = GUI_BUTTON_PRESSED;
209 gui_event->button.x = sdl_event->button.x;
210 gui_event->button.y = sdl_event->button.y;
211 gui_event->button.button = sdl_event->button.button;
212 break;
213 case SDL_KEYUP:
214 case SDL_KEYDOWN:
215 if ( sdl_event->type == SDL_KEYUP )
216 gui_event->type = GUI_KEY_RELEASED;
217 else
218 gui_event->type = GUI_KEY_PRESSED;
219 gui_event->key.keysym = sdl_event->key.keysym.sym;
220 gui_event->key.unicode = sdl_event->key.keysym.unicode;
221 break;
222 }
223 }
224
225 /*
226 ====================================================================
227 GUI widget
228 ====================================================================
229 */
230
231 /*
232 ====================================================================
233 Create a basic widget and setup things all different widget types
234 have in common. If a parent is specified this widget is added to
235 it's 'widgets' list. Per default following events are enabled:
236 GUI_ACTIVATED, GUI_DEACTIVATED, GUI_DRAW, GUI_DESTROY,
237 GUI_FOCUS_IN, GUI_FOCUS_OUT. 'x' or 'y' -1 means to center the
238 widget.
239 ====================================================================
240 */
241 GuiWidget* gui_widget_create(
242 GuiWidget *parent, int type,
243 int x, int y, int width, int height,
244 void (*default_event_handler)(GuiWidget*,GuiEvent*),
245 void (*user_event_handler)(GuiWidget*,GuiEvent*) )
246 {
247 GuiWidget *widget = calloc( 1, sizeof( GuiWidget ) );
248 if ( widget == 0 )
249 GUI_ABORT( "Out Of Memory" )
250 /* create empty children list */
251 if ( ( widget->widgets =
252 list_create( LIST_NO_AUTO_DELETE,
253 LIST_NO_CALLBACK ) ) == 0 )
254 GUI_ABORT( "Out Of Memory" )
255 /* various assignments */
256 if ( parent ) {
257 widget->parent = parent;
258 list_add( widget->parent->widgets, widget );
259 }
260 widget->type = type;
261 widget->root = (parent==0)?widget:parent->root;
262 widget->active = 1;
263 widget->default_event_handler = default_event_handler;
264 widget->user_event_handler = user_event_handler;
265 /* adjust x,y */
266 if ( x == -1 ) {
267 if ( parent )
268 x = ( parent->width - width ) / 2;
269 else
270 x = ( stk_display->w - width ) / 2;
271 }
272 if ( y == -1 ) {
273 if ( parent )
274 y = ( parent->height - height ) / 2;
275 else
276 y = ( stk_display->h - height ) / 2;
277 }
278 /* region in parent */
279 if ( parent == 0 ) {
280 widget->parent_region.x = x;
281 widget->parent_region.y = y;
282 }
283 else {
284 widget->parent_region.x = x + widget->parent->border;
285 widget->parent_region.y = y + widget->parent->border;
286 }
287 widget->parent_region.w = width;
288 widget->parent_region.h = height;
289 /* screen region */
290 if ( widget->parent == 0 )
291 widget->screen_region = widget->parent_region;
292 else {
293 widget->screen_region.x =
294 widget->parent_region.x + parent->screen_region.x;
295 widget->screen_region.y =
296 widget->parent_region.y + parent->screen_region.y;
297 widget->screen_region.w = widget->parent_region.w;
298 widget->screen_region.h = widget->parent_region.h;
299 }
300 /* children size */
301 widget->width = width; widget->height = height;
302 /* events */
303 gui_widget_enable_event( widget, GUI_ACTIVATED );
304 gui_widget_enable_event( widget, GUI_DEACTIVATED );
305 gui_widget_enable_event( widget, GUI_DRAW );
306 gui_widget_enable_event( widget, GUI_DESTROY );
307 gui_widget_enable_event( widget, GUI_FOCUS_IN );
308 gui_widget_enable_event( widget, GUI_FOCUS_OUT );
309 /* if this is a root widget add it to root_stack */
310 if ( widget->root == widget )
311 list_add( gui_root_stack, widget );
312 /* done */
313 return widget;
314 }
315
316 /*
317 ====================================================================
318 This function will delete a root widget including all subwidgets.
319 Subwidgets can't be directly deleted. Resets the widget
320 pointer to NULL.
321 ====================================================================
322 */
323 void gui_widget_delete( GuiWidget **widget )
324 {
325 if ( *widget == 0 ) return;
326 if ( (*widget)->root != *widget ) {
327 fprintf( stderr, "You can only delete root widgets!\n" );
328 return;
329 }
330 if ( (*widget)->visible )
331 list_delete_item( gui_visible_stack, *widget );
332 if ( (*widget)->event_mask & GUI_TIME_PASSED )
333 list_delete_item( gui_timed_stack, *widget );
334 list_delete_item( gui_root_stack, *widget );
335 gui_widget_delete_intern( *widget );
336 *widget = 0;
337 }
338
339
340 /*
341 ====================================================================
342 If button is deactivated no input events (key,button,motion)
343 are handled.
344 ====================================================================
345 */
346 void gui_widget_set_active( GuiWidget *widget, int active )
347 {
348 int type;
349 if ( widget->active == active ) return;
350 widget->active = active;
351 type = (active)?GUI_ACTIVATED:GUI_DEACTIVATED;
352 widget->default_event_handler(
353 widget, gui_event_get_simple( type ) );
354 gui_widget_call_user_event_handler(
355 widget, gui_event_get_simple( type ) );
356 }
357
358 /*
359 ====================================================================
360 Draw the widget and its children if visible.
361 ====================================================================
362 */
363 void gui_widget_draw( GuiWidget *widget )
364 {
365 /* update only if visible */
366 if ( !widget->visible ) return;
367 /* recursively draw widget */
368 gui_widget_draw_intern( widget );
369 /* redraw higher level roots that overlap this widget. */
370 gui_widget_redraw_overlapping_roots( widget );
371 /* store update rect */
372 stk_display_store_rect( &widget->screen_region );
373 }
374
375 /*
376 ====================================================================
377 Set 'visible' flag and draw widget (store update rects)
378 if either parent is visible or it has no parent.
379 (thus is a root window). If it is a root window add it to the
380 root window stack. This new window will handle incoming events
381 first.
382 ====================================================================
383 */
384 void gui_widget_show( GuiWidget *widget )
385 {
386 if ( widget->visible ) return;
387 if ( widget->root == widget ) {
388 list_add( gui_visible_stack, widget );
389 if ( widget->event_mask & GUI_TIME_PASSED )
390 list_add( gui_timed_stack, widget );
391 #ifdef GUI_DEBUG
392 printf( "show root widget: %i,%i,%i,%i\n",
393 widget->screen_region.x, widget->screen_region.y,
394 widget->screen_region.w, widget->screen_region.h );
395 #endif
396 /* if this root widget grabs the input the old
397 gui_key_widget/gui_clicked_widget is obsolete */
398 if ( widget->grab_input ) {
399 if ( gui_key_widget ) {
400 gui_key_widget->default_event_handler(
401 gui_key_widget,
402 gui_event_get_simple( GUI_FOCUS_OUT ) );
403 gui_key_widget = 0;
404 }
405 gui_clicked_widget = 0;
406 }
407 /* maybe there is a default key grab widget? */
408 if ( widget->default_key_widget )
409 gui_key_widget = widget->default_key_widget;
410 }
411 gui_widget_show_intern( widget, 1 );
412 if ( widget->parent == 0 || widget->parent->visible )
413 gui_widget_draw( widget );
414 }
415
416 /*
417 ====================================================================
418 Clear 'visible' flag and restore widget if parent is visible.
419 If there is no parent (thus is a root window) remove it from
420 stack and redraw the underlying window (which regains control). If
421 a root widget is hidden the background cannot be restored
422 as it is unknown.
423 ====================================================================
424 */
425 void gui_widget_hide( GuiWidget *widget )
426 {
427 ListEntry *entry;
428 if ( !widget->visible ) return;
429 gui_widget_show_intern( widget, 0 );
430 if ( widget->root == widget ) {
431 entry = list_entry( gui_visible_stack, widget );
432 if ( entry ) {
433 /* remove */
434 entry = entry->next;
435 list_delete_entry(
436 gui_visible_stack, entry->prev );
437 /* FIX ME! redraw all open roots */
438 entry = gui_visible_stack->head->next;
439 while ( entry != gui_visible_stack->tail ) {
440 gui_widget_draw( (GuiWidget*)entry->item );
441 entry = entry->next;
442 }
443 }
444 if ( widget->event_mask & GUI_TIME_PASSED )
445 list_delete_item( gui_timed_stack, widget );
446 }
447 else {
448 /* draw parent's background */
449 stk_surface_blit( widget->parent->surface,
450 widget->parent_region.x, widget->parent_region.y,
451 widget->parent_region.w, widget->parent_region.h,
452 stk_display,
453 widget->screen_region.x, widget->screen_region.y );
454 /* redraw higher level roots that overlap this widget. */
455 gui_widget_redraw_overlapping_roots( widget );
456 /* store update rect */
457 stk_display_store_rect( &widget->screen_region );
458 }
459 /* check if gui_key_widget is still valid */
460 if ( gui_key_widget )
461 if ( widget == gui_key_widget ||
462 widget == gui_key_widget->parent ||
463 widget == gui_key_widget->root )
464 gui_key_widget = 0;
465 }
466
467 /*
468 ====================================================================
469 Modify the event mask of a widget to define which events will
470 be passed to user_event_handler.
471 ====================================================================
472 */
473 void gui_widget_enable_event( GuiWidget *widget, int event )
474 {
475 widget->event_mask |= (1L << event);
476 }
477 void gui_widget_disable_event( GuiWidget *widget, int event )
478 {
479 widget->event_mask &= ~(1L << event);
480 }
481
482 /*
483 ====================================================================
484 Pass GuiEvent to user defined callback if it has been installed
485 and the event mask flag is True for this event.
486 ====================================================================
487 */
488 void gui_widget_call_user_event_handler(
489 GuiWidget *widget, GuiEvent *event )
490 {
491 if ( widget->user_event_handler )
492 if ( widget->event_mask & (1L << event->type) )
493 widget->user_event_handler( widget, event );
494 }
495
496 /*
497 ====================================================================
498 Handle the GUI event by calling the default_event_handler()
499 and the user_event_handler() if one has been installed.
500 ====================================================================
501 */
502 void gui_widget_handle_event( GuiWidget *widget, GuiEvent *event )
503 {
504 widget->default_event_handler( widget, event );
505 gui_widget_call_user_event_handler( widget, event );
506 }
507
508 /*
509 ====================================================================
510 Move widget within parent window by a relative value. If the
511 widget is visible the changes will be drawn to screen.
512 ====================================================================
513 */
514 void gui_widget_move( GuiWidget *widget, int rel_x, int rel_y )
515 {
516 if ( !widget->visible )
517 gui_widget_move_intern( widget, rel_x, rel_y );
518 else {
519 gui_widget_hide( widget );
520 gui_widget_move_intern( widget, rel_x, rel_y );
521 gui_widget_show( widget );
522 }
523 }
524
525 /*
526 ====================================================================
527 Move widget within parent window by an absolute value. If the
528 widget is visible the changes will be drawn to screen.
529 ====================================================================
530 */
531 void gui_widget_warp( GuiWidget *widget, int abs_x, int abs_y )
532 {
533 if ( widget->parent )
534 gui_widget_move( widget,
535 abs_x - widget->parent_region.x +
536 widget->parent->border,
537 abs_y - widget->parent_region.y +
538 widget->parent->border );
539 else
540 gui_widget_move( widget,
541 abs_x - widget->parent_region.x,
542 abs_y - widget->parent_region.y );
543 }
544
545 /*
546 ====================================================================
547 Apply parents background or wallpaper within the frame (if
548 any) of the widget's surface keeping the frame.
549 ====================================================================
550 */
551 void gui_widget_apply_wallpaper(
552 GuiWidget *widget, SDL_Surface *wallpaper, int alpha )
553 {
554 if ( widget->parent )
555 stk_surface_blit( widget->parent->surface,
556 widget->parent_region.x +
557 widget->border,
558 widget->parent_region.y +
559 widget->border,
560 widget->parent_region.w -
561 (widget->border<<1),
562 widget->parent_region.h -
563 (widget->border<<1),
564 widget->surface,
565 widget->border, widget->border );
566 else
567 stk_surface_apply_wallpaper(
568 widget->surface, widget->border, widget->border,
569 widget->parent_region.w - (widget->border<<1),
570 widget->parent_region.h - (widget->border<<1),
571 wallpaper, alpha );
572 }
573
574 /*
575 ====================================================================
576 Browse the widget tree and set 'focused' true for all widgets
577 that have the mouse pointer above them. 'focused_widget'
578 returns the deepest widget that is focused.
579 ====================================================================
580 */
581 void gui_widget_update_focus(
582 GuiWidget *widget, int mx, int my, GuiWidget **focused_widget )
583 {
584 GuiWidget *child;
585 if ( !widget->active )
586 return;
587 if ( !STK_IN_RECT( widget->screen_region, mx, my ) )
588 return;
589 widget->focused = 1;
590 *focused_widget = widget;
591 /* handle children recursively */
592 list_reset( widget->widgets );
593 while ( ( child = list_next( widget->widgets ) ) )
594 gui_widget_update_focus( child, mx, my, focused_widget );
595 }
596
597 /*
598 ====================================================================
599 Get direct access to widget's surface.
600 ====================================================================
601 */
602 SDL_Surface *gui_widget_get_surface( GuiWidget *widget )
603 {
604 return widget->surface;
605 }
606
607 /*
608 ====================================================================
609 That key grabbing child of a root widget.
610 ====================================================================
611 */
612 void gui_widget_set_default_key_widget(
613 GuiWidget *root, GuiWidget *key_widget )
614 {
615 if ( root->root != root ) return;
616 root->default_key_widget = key_widget;
617 }
0 /***************************************************************************
1 gui_widget.h - description
2 -------------------
3 begin : Fri Oct 11 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __GUI_WIDGET_H
18 #define __GUI_WIDGET_H
19
20 #include "list.h"
21 #include "stk.h"
22 #include "gui_theme.h"
23
24 //#define GUI_DEBUG
25
26 #define GUI_ABORT( msg ) \
27 { fprintf( stderr, "Fatal GUI Error!\n%s\n", msg ); exit( 1 ); }
28
29 /*
30 ====================================================================
31 GUI events
32 ====================================================================
33 */
34
35 /* types */
36 enum {
37 GUI_NONE = 0,
38 GUI_DESTROY, /* widget is deleted */
39 GUI_ACTIVATED,
40 GUI_DEACTIVATED, /* handle _input_ events or not */
41 GUI_DRAW, /* draw widget to stk_display */
42 GUI_TIME_PASSED, /* msecs since last TIME_PASSED event */
43 GUI_FOCUS_IN, /* widget lost focus */
44 GUI_FOCUS_OUT, /* widget gained focus */
45 GUI_MOTION, /* motion within widget */
46 GUI_BUTTON_PRESSED,
47 GUI_BUTTON_RELEASED, /* mouse button */
48 GUI_KEY_PRESSED,
49 GUI_KEY_RELEASED, /* key */
50 GUI_CLICKED, /* mouse button pressed + released */
51 GUI_CHANGED, /* type-dependent data changed */
52 GUI_ITEM_SELECTED,
53 GUI_ITEM_UNSELECTED /* list item (un)selected */
54 };
55
56 /* event */
57 typedef union {
58 int type;
59 struct {
60 int type;
61 int x, y, button;
62 } button;
63 struct {
64 int type;
65 int x, y, xrel, yrel;
66 int button; /* first button pressed */
67 int state; /* full button mask */
68 } motion;
69 struct {
70 int type;
71 int keysym;
72 int unicode;
73 } key;
74 struct {
75 int type;
76 int x, y;
77 } item;
78 struct {
79 int type;
80 int ms;
81 } time;
82 } GuiEvent;
83
84 /*
85 ====================================================================
86 Return pointer to simple event (one that doesn't need
87 additional data)
88 ====================================================================
89 */
90 GuiEvent *gui_event_get_simple( int type );
91
92 /*
93 ====================================================================
94 Initiate a GUI event from an SDL event.
95 ====================================================================
96 */
97 void gui_event_init( GuiEvent *gui_event, SDL_Event *sdl_event );
98
99 /*
100 ====================================================================
101 GUI widget
102 ====================================================================
103 */
104
105 /* types */
106 enum {
107 GUI_BOX = 0,
108 GUI_BUTTON,
109 GUI_LABEL,
110 GUI_ICON,
111 GUI_PROGRESSBAR,
112 GUI_RADIOGROUP,
113 GUI_SCROLLBAR,
114 GUI_EDIT,
115 GUI_LIST,
116 GUI_SPINBUTTON
117 };
118
119 /* GUI widget -
120 for simplicity only one is used for all types */
121 typedef struct _GuiWidget {
122 struct _GuiWidget *parent; /* widget's parent */
123 struct _GuiWidget *root; /* widget's root (top parent) */
124 List *widgets; /* widget's children */
125 struct _GuiWidget *focused_widget; /* recursivly in widgets */
126 struct _GuiWidget *default_key_widget;
127 /* child 'default_key_widget' will grab key input if this
128 is a root widget that is shown */
129 int type; /* button, label, icon ... */
130 int visible; /* gui_widget_draw() updates screen */
131 int active; /* accept events */
132 int focused; /* mouse pointer somewhere in widget */
133 int grab_input; /* deny event handling to lower roots */
134 int grab_keys; /* grab key input if clicked */
135 int grab_focus; /* grab focus IF PRESSED thus motion events
136 are directly passed to widgets handler.
137 the focus is not updated until mouse button
138 is released again. */
139 int pressed; /* memorize 'button_pressed' event */
140 SDL_Rect screen_region; /* absolute region in screen (clipped) */
141 SDL_Rect parent_region; /* relative region in parent */
142 /* CALLBACKS */
143 void (*default_event_handler)(struct _GuiWidget*,GuiEvent*);
144 /* handles event and updates a widget (graphics etc) */
145 void (*user_event_handler)(struct _GuiWidget*,GuiEvent*);
146 /* user's possibility to react on event. is NOT called
147 from the default_event_handler but from
148 gui_widget_handle_event() itself. */
149 /* USED BY ALL WIDGETS BUT TYPE DEPENDANT */
150 int border; /* size of frame around widget */
151 int width, height; /* widget's size w/o border */
152 int event_mask; /* events passed to user's event_handler */
153 SDL_Surface *surface; /* picture of widget */
154 /* SPECS */
155 union {
156 /* LABEL */
157 struct {
158 StkFont *font;
159 int align; /* alignment of text */
160 char *text; /* text */
161 } label;
162 /* PROGRESSBAR */
163 struct {
164 int max; /* maximum value */
165 int value; /* current value */
166 int length; /* current length */
167 SDL_Surface *wallpaper; /* current beam wallpaper */
168 } progressbar;
169 /* RADIOGROUP */
170 struct {
171 int min; /* minimum selections required */
172 int max; /* minimum selections allowed */
173 int size; /* number of items */
174 int *checks; /* 'checked' flag for each item */
175 int check_count; /* number of selections */
176 int single_check; /* id of last item selected */
177 int x, y; /* position of first checkbox in parent */
178 int offset; /* offset from one item to next */
179 } radiogroup;
180 /* SCROLLBAR */
181 struct {
182 int vertical; /* vertical scrollbar? */
183 int button_size; /* size of (square) buttons */
184 int value; /* current value */
185 int min, max; /* range of value */
186 int step; /* offset for up/down */
187 int jump; /* offset for pgup/pgdown */
188 struct _GuiWidget *inc;
189 struct _GuiWidget *dec; /* pointers to 'widgets' */
190 struct _GuiWidget *track; /* special widget that is NOT
191 in the 'widgets' list */
192 } scrollbar;
193 /* EDIT */
194 struct {
195 int filter[SDLK_LAST]; /* characters accepted */
196 int multi_line; /* single-line edit or text area? */
197 int size; /* character limit */
198 char *buffer; /* string of edit */
199 char *display_buffer; /* contains 'height' lines of
200 length 'width' separated by \0 which will be
201 displayed when drawing. is rendered by
202 gui_edit_adjust_cursor() */
203 int length; /* current string length */
204 int width; /* characters per line */
205 int height; /* number of lines */
206 int x, y; /* position in visible characters */
207 int y_offset; /* used to center single-line edits */
208 int pos; /* position of edit cursor */
209 int start; /* first character displayed */
210 int line; /* first line displayed (start/width) */
211 } edit;
212 /* LIST */
213 struct {
214 int columns; /* (fixed) number of columns */
215 int item_width;
216 int item_height; /* item size */
217 int gap; /* space between items */
218 int rows_per_page; /* number of rows displayed */
219 int item_count; /* number of items */
220 int rows; /* number of rows */
221 int select_type; /* no, single, multi select */
222 int *checks; /* NO_SELECT: unused
223 SINGLE_SELECT: id of selected item
224 MULTI_SELECT: flags for all items
225 whether they are
226 selected or not */
227 SDL_Surface
228 *render_buffer; /* 'render_item' renders item
229 into this surface*/
230 int (*render_item)(int,int,SDL_Surface*); /* user
231 defined render callback to render item x,y into
232 surface. This item is only displayed
233 if 'render_item' returns True. */
234 struct _GuiWidget *scrollbar; /* pointer to
235 'widgets' */
236 } list;
237 /* SPINBUTTON */
238 struct {
239 int min, max, step; /* range of value */
240 int value; /* value */
241 struct _GuiWidget *edit; /* pointer to edit */
242 struct _GuiWidget *inc;
243 struct _GuiWidget *dec; /* pointer to buttons */
244 } spinbutton;
245 } spec;
246 } GuiWidget;
247
248 /*
249 ====================================================================
250 Create a basic widget and setup things all different widget types
251 have in common. If a parent is specified this widget is added to
252 it's 'widgets' list. 'x' or 'y' -1 means to center the
253 widget.
254 ====================================================================
255 */
256 GuiWidget* gui_widget_create(
257 GuiWidget *parent, int type,
258 int x, int y, int width, int height,
259 void (*default_event_handler)(GuiWidget*,GuiEvent*),
260 void (*user_event_handler)(GuiWidget*,GuiEvent*) );
261
262 /*
263 ====================================================================
264 This function will delete a root widget including all subwidgets.
265 Subwidgets can't be directly deleted. Resets the widget
266 pointer to NULL.
267 ====================================================================
268 */
269 void gui_widget_delete( GuiWidget **widget );
270
271 /*
272 ====================================================================
273 If button is deactivated no input events (key,button,motion)
274 are handled.
275 ====================================================================
276 */
277 void gui_widget_set_active( GuiWidget *widget, int active );
278
279 /*
280 ====================================================================
281 Draw the widget and its children if visible.
282 ====================================================================
283 */
284 void gui_widget_draw( GuiWidget *widget );
285
286 /*
287 ====================================================================
288 Set 'visible' flag and draw widget (store update rects)
289 if either parent is visible or it has no parent.
290 (thus is a root window). If it is a root window add it to the
291 root window stack. This new window will handle incoming events
292 first.
293 ====================================================================
294 */
295 void gui_widget_show( GuiWidget *widget );
296
297 /*
298 ====================================================================
299 Clear 'visible' flag and restore widget if parent is visible.
300 If there is no parent (thus is a root window) remove it from
301 stack and redraw the underlying window (which regains control). If
302 a root widget is hidden the background cannot be restored
303 as it is unknown.
304 ====================================================================
305 */
306 void gui_widget_hide( GuiWidget *widget );
307
308 /*
309 ====================================================================
310 Modify the event mask of a widget to define which events will
311 be passed to user_event_handler. Update timed_stack if
312 GUI_TIME_PASSED is enabled/disabled.
313 ====================================================================
314 */
315 void gui_widget_enable_event( GuiWidget *widget, int event );
316 void gui_widget_disable_event( GuiWidget *widget, int event );
317
318 /*
319 ====================================================================
320 Pass GuiEvent to user defined callback if it has been installed
321 and the event mask flag is True for this event.
322 ====================================================================
323 */
324 void gui_widget_call_user_event_handler(
325 GuiWidget *widget, GuiEvent *event );
326
327 /*
328 ====================================================================
329 Handle the GUI event by calling the default_event_handler()
330 and the user_event_handler() if one has been installed.
331 ====================================================================
332 */
333 void gui_widget_handle_event( GuiWidget *widget, GuiEvent *event );
334
335 /*
336 ====================================================================
337 Move widget within parent window by a relative value. If the
338 widget is visible the changes will be drawn to screen.
339 ====================================================================
340 */
341 void gui_widget_move( GuiWidget *widget, int rel_x, int rel_y );
342
343 /*
344 ====================================================================
345 Move widget within parent window by an absolute value. If the
346 widget is visible the changes will be drawn to screen.
347 ====================================================================
348 */
349 void gui_widget_warp( GuiWidget *widget, int abs_x, int abs_y );
350
351 /*
352 ====================================================================
353 Apply parents background or wallpaper within the frame (if
354 any) of the widget's surface.
355 ====================================================================
356 */
357 void gui_widget_apply_wallpaper(
358 GuiWidget *widget, SDL_Surface *wallpaper, int alpha );
359
360 /*
361 ====================================================================
362 Browse the widget tree and set 'focused' true for all widgets
363 that have the mouse pointer above them. 'focused_widget'
364 returns the deepest widget that is focused.
365 ====================================================================
366 */
367 void gui_widget_update_focus(
368 GuiWidget *widget, int mx, int my, GuiWidget **focused_widget );
369
370 /*
371 ====================================================================
372 Get direct access to widget's surface.
373 ====================================================================
374 */
375 SDL_Surface *gui_widget_get_surface( GuiWidget *widget );
376
377 /*
378 ====================================================================
379 That key grabbing child of a root widget.
380 ====================================================================
381 */
382 void gui_widget_set_default_key_widget(
383 GuiWidget *root, GuiWidget *key_widget );
384
385 #endif
0 /***************************************************************************
1 list.c - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18
19 #include "list.h"
20
21 /*
22 ====================================================================
23 Create a new list
24 auto_delete: Free memory of data pointer when deleting entry
25 callback: Use this callback to free memory of data including
26 the data pointer itself.
27 Return Value: List pointer
28 ====================================================================
29 */
30 List *list_create( int auto_delete, void (*callback)(void*) )
31 {
32 List *list = calloc( 1, sizeof( List ) );
33 list->head = calloc( 1, sizeof( ListEntry ) );
34 list->tail = calloc( 1, sizeof( ListEntry ) );
35 list->head->next = list->tail;
36 list->head->prev = list->head;
37 list->tail->next = list->tail;
38 list->tail->prev = list->head;
39 list->auto_delete = auto_delete;
40 list->callback = callback;
41 list->cur_entry = list->head;
42 return list;
43 }
44 /*
45 ====================================================================
46 Delete list and entries.
47 ====================================================================
48 */
49 void list_delete( List *list )
50 {
51 list_clear( list );
52 free( list->head );
53 free( list->tail );
54 free( list );
55 }
56 /*
57 ====================================================================
58 Delete all entries but keep the list. Reset current_entry to head
59 pointer.
60 ====================================================================
61 */
62 void list_clear( List *list )
63 {
64 while( !list_empty( list ) ) list_delete_pos( list, 0 );
65 }
66 /*
67 ====================================================================
68 Insert new item at position.
69 Return Value: True if successful else False.
70 ====================================================================
71 */
72 int list_insert( List *list, void *item, int pos )
73 {
74 int i;
75 ListEntry *cur = list->head;
76 ListEntry *new_entry = 0;
77
78 /* check if insertion possible */
79 if ( pos < 0 || pos > list->count ) return 0;
80 if ( item == 0 ) return 0;
81 /* get to previous entry */
82 for (i = 0; i < pos; i++) cur = cur->next;
83 /* create and anchor new entry */
84 new_entry = calloc( 1, sizeof( ListEntry ) );
85 new_entry->item = item;
86 new_entry->next = cur->next;
87 new_entry->prev = cur;
88 cur->next->prev = new_entry;
89 cur->next = new_entry;
90 list->count++;
91 return 1;
92 }
93 /*
94 ====================================================================
95 Add new item at the end of the list.
96 ====================================================================
97 */
98 int list_add( List *list, void *item )
99 {
100 ListEntry *new_entry = 0;
101 /* check if insertion possible */
102 if ( item == 0 ) return 0;
103 /* create and anchor new entry */
104 new_entry = calloc( 1, sizeof( ListEntry ) );
105 new_entry->item = item;
106 new_entry->next = list->tail;
107 new_entry->prev = list->tail->prev;
108 list->tail->prev->next = new_entry;
109 list->tail->prev = new_entry;
110 list->count++;
111 return 1;
112 }
113 /*
114 ====================================================================
115 Delete item at position. If this was the current entry update
116 current_entry to valid previous pointer.
117 Return Value: True if successful else False.
118 ====================================================================
119 */
120 int list_delete_pos( List *list, int pos )
121 {
122 int i;
123 ListEntry *cur = list->head;
124
125 /* check if deletion possbile */
126 if ( list_empty( list ) ) return 0;
127 if ( pos < 0 || pos >= list->count ) return 0;
128 /* get to correct entry */
129 for ( i = 0; i <= pos; i++ ) cur = cur->next;
130 /* modify anchors */
131 cur->next->prev = cur->prev;
132 cur->prev->next = cur->next;
133 /* decrease counter */
134 list->count--;
135 /* check current_entry */
136 if ( list->cur_entry == cur )
137 list->cur_entry = list->cur_entry->prev;
138 /* free memory */
139 if ( list->auto_delete ) {
140 if ( list->callback )
141 (list->callback)( cur->item );
142 else
143 free( cur->item );
144 }
145 free( cur );
146 return 1;
147 }
148 /*
149 ====================================================================
150 Delete item if in list. If this was the current entry update
151 current_entry to valid previous pointer.
152 Return Value: True if successful else False.
153 ====================================================================
154 */
155 int list_delete_item( List *list, void *item )
156 {
157 return list_delete_pos( list, list_check( list, item ) );
158 }
159 /*
160 ====================================================================
161 Delete entry.
162 Return Value: True if successful else False.
163 ====================================================================
164 */
165 int list_delete_entry( List *list, ListEntry *entry )
166 {
167 /* delete possible? */
168 if ( entry == 0 ) return 0;
169 if ( list->count == 0 ) return 0;
170 if ( entry == list->head || entry == list->tail ) return 0;
171 /* adjust anchor and counter */
172 entry->prev->next = entry->next;
173 entry->next->prev = entry->prev;
174 list->count--;
175 /* check current_entry */
176 if ( list->cur_entry == entry )
177 list->cur_entry = list->cur_entry->prev;
178 /* free memory */
179 if ( list->auto_delete ) {
180 if ( list->callback )
181 (list->callback)( entry->item );
182 else
183 free( entry->item );
184 }
185 free( entry );
186 return 1;
187 }
188 /*
189 ====================================================================
190 Get item from position if in list.
191 Return Value: Item pointer if found else Null pointer.
192 ====================================================================
193 */
194 void* list_get( List *list, int pos )
195 {
196 int i;
197 ListEntry *cur = list->head;
198
199 if ( pos < 0 || pos >= list->count ) return 0;
200 for ( i = 0; i <= pos; i++ ) cur = cur->next;
201 return cur->item;
202 }
203 /*
204 ====================================================================
205 Check if item's in list.
206 Return Value: Position of item else -1.
207 ====================================================================
208 */
209 int list_check( List *list, void *item )
210 {
211 int pos = -1;
212 ListEntry *cur = list->head->next;
213 while ( cur != list->tail ) {
214 pos++;
215 if ( cur->item == item ) break;
216 cur = cur->next;
217 }
218 if ( cur == list->tail ) pos = -1; /* item not found */
219 return pos;
220 }
221 /*
222 ====================================================================
223 Return first item stored in list and set current_entry to this
224 entry.
225 Return Value: Item pointer if found else Null pointer.
226 ====================================================================
227 */
228 void* list_first( List *list )
229 {
230 list->cur_entry = list->head->next;
231 return list->head->next->item;
232 }
233 /*
234 ====================================================================
235 Return last item stored in list and set current_entry to this
236 entry.
237 Return Value: Item pointer if found else Null pointer.
238 ====================================================================
239 */
240 void* list_last( List *list )
241 {
242 list->cur_entry = list->tail->prev;
243 return list->tail->prev->item;
244 }
245 /*
246 ====================================================================
247 Return item in current_entry.
248 Return Value: Item pointer if found else Null pointer.
249 ====================================================================
250 */
251 void* list_current( List *list )
252 {
253 return list->cur_entry->item;
254 }
255 /*
256 ====================================================================
257 Reset current_entry to head of list.
258 ====================================================================
259 */
260 void list_reset( List *list )
261 {
262 list->cur_entry = list->head;
263 }
264 /*
265 ====================================================================
266 Get next item and update current_entry (reset if tail reached)
267 Return Value: Item pointer if found else Null (if tail of list).
268 ====================================================================
269 */
270 void* list_next( List *list )
271 {
272 list->cur_entry = list->cur_entry->next;
273 if ( list->cur_entry == list->tail ) list_reset( list );
274 return list->cur_entry->item;
275 }
276 /*
277 ====================================================================
278 Get previous item and update current_entry.
279 Return Value: Item pointer if found else Null (if head of list).
280 ====================================================================
281 */
282 void* list_prev( List *list )
283 {
284 list->cur_entry = list->cur_entry->prev;
285 return list->cur_entry->item;
286 }
287 /*
288 ====================================================================
289 Delete the current entry if not tail or head. This is the entry
290 that contains the last returned item by list_next/prev().
291 Return Value: True if it was a valid deleteable entry.
292 ====================================================================
293 */
294 int list_delete_current( List *list )
295 {
296 if ( list->cur_entry == 0 || list->cur_entry == list->head || list->cur_entry == list->tail ) return 0;
297 list_delete_entry( list, list->cur_entry );
298 return 1;
299 }
300 /*
301 ====================================================================
302 Check if list is empty.
303 Return Value: True if list counter is 0 else False.
304 ====================================================================
305 */
306 int list_empty( List *list )
307 {
308 return list->count == 0;
309 }
310 /*
311 ====================================================================
312 Return entry containing the passed item.
313 Return Value: True if entry found else False.
314 ====================================================================
315 */
316 ListEntry *list_entry( List *list, void *item )
317 {
318 ListEntry *entry = list->head->next;
319 while ( entry != list->tail ) {
320 if ( entry->item == item ) return entry;
321 entry = entry->next;
322 }
323 return 0;
324 }
325 /*
326 ====================================================================
327 Transfer an entry from one list to another list by removing from
328 'source' and adding to 'dest' thus if source does not contain
329 the item this is equvalent to list_add( dest, item ).
330 ====================================================================
331 */
332 void list_transfer( List *source, List *dest, void *item )
333 {
334 int old_auto_flag;
335 /* add to destination */
336 list_add( dest, item );
337 /* as the pointer is added to dest without changes only the empty
338 entry must be deleted in source */
339 old_auto_flag = source->auto_delete;
340 source->auto_delete = LIST_NO_AUTO_DELETE;
341 list_delete_item( source, item );
342 source->auto_delete = old_auto_flag;
343 }
344 /*
345 ====================================================================
346 Deqeue the first list entry. (must not use auto_delete therefore)
347 ====================================================================
348 */
349 void *list_dequeue( List *list )
350 {
351 void *item;
352 if ( list->count > 0 ) {
353 item = list->head->next->item;
354 list_delete_pos( list, 0 );
355 return item;
356 }
357 else
358 return 0;
359 }
0 /***************************************************************************
1 list.h - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LIST_H
18 #define __LIST_H
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /*
25 ====================================================================
26 Dynamic list handling data as void pointers.
27 ====================================================================
28 */
29 typedef struct _ListEntry {
30 struct _ListEntry *next;
31 struct _ListEntry *prev;
32 void *item;
33 } ListEntry;
34 typedef struct {
35 int auto_delete;
36 int count;
37 ListEntry *head;
38 ListEntry *tail;
39 void (*callback)(void*);
40 ListEntry *cur_entry;
41 } List;
42
43 /*
44 ====================================================================
45 Create a new list
46 auto_delete: Free memory of data pointer when deleting entry
47 callback: Use this callback to free memory of data including
48 the data pointer itself.
49 Return Value: List pointer
50 ====================================================================
51 */
52 enum { LIST_NO_AUTO_DELETE = 0, LIST_AUTO_DELETE };
53 enum { LIST_NO_CALLBACK = 0 };
54 List *list_create( int auto_delete, void (*callback)(void*) );
55 /*
56 ====================================================================
57 Delete list and entries.
58 ====================================================================
59 */
60 void list_delete( List *list );
61 /*
62 ====================================================================
63 Delete all entries but keep the list. Reset current_entry to head
64 pointer.
65 ====================================================================
66 */
67 void list_clear( List *list );
68 /*
69 ====================================================================
70 Insert new item at position.
71 Return Value: True if successful else False.
72 ====================================================================
73 */
74 int list_insert( List *list, void *item, int pos );
75 /*
76 ====================================================================
77 Add new item at the end of the list.
78 ====================================================================
79 */
80 int list_add( List *list, void *item );
81 /*
82 ====================================================================
83 Delete item at pos. If this was the current entry update
84 current_entry to valid previous pointer.
85 Return Value: True if successful else False.
86 ====================================================================
87 */
88 int list_delete_pos( List *list, int pos );
89 /*
90 ====================================================================
91 Delete item if in list. If this was the current entry update
92 current_entry to valid previous pointer.
93 Return Value: True if successful else False.
94 ====================================================================
95 */
96 int list_delete_item( List *list, void *item );
97 /*
98 ====================================================================
99 Delete entry.
100 ====================================================================
101 */
102 int list_delete_entry( List *list, ListEntry *entry );
103 /*
104 ====================================================================
105 Get item from position if in list.
106 Return Value: Item pointer if found else Null pointer.
107 ====================================================================
108 */
109 void* list_get( List *list, int pos );
110 /*
111 ====================================================================
112 Check if item's in list.
113 Return Value: Position of item else -1.
114 ====================================================================
115 */
116 int list_check( List *list, void *item );
117 /*
118 ====================================================================
119 Return first item stored in list and set current_entry to this
120 entry.
121 Return Value: Item pointer if found else Null pointer.
122 ====================================================================
123 */
124 void* list_first( List *list );
125 /*
126 ====================================================================
127 Return last item stored in list and set current_entry to this
128 entry.
129 Return Value: Item pointer if found else Null pointer.
130 ====================================================================
131 */
132 void* list_last( List *list );
133 /*
134 ====================================================================
135 Return item in current_entry.
136 Return Value: Item pointer if found else Null pointer.
137 ====================================================================
138 */
139 void* list_current( List *list );
140 /*
141 ====================================================================
142 Reset current_entry to head of list.
143 ====================================================================
144 */
145 void list_reset( List *list );
146 /*
147 ====================================================================
148 Get next item and update current_entry (reset if tail reached).
149 Return Value: Item pointer if found else Null (if tail of list).
150 ====================================================================
151 */
152 void* list_next( List *list );
153 /*
154 ====================================================================
155 Get previous item and update current_entry.
156 Return Value: Item pointer if found else Null (if head of list).
157 ====================================================================
158 */
159 void* list_prev( List *list );
160 /*
161 ====================================================================
162 Delete the current entry if not tail or head. This is the entry
163 that contains the last returned item by list_next/prev().
164 Return Value: True if it was a valid deleteable entry.
165 ====================================================================
166 */
167 int list_delete_current( List *list );
168 /*
169 ====================================================================
170 Check if list is empty.
171 Return Value: True if list counter is 0 else False.
172 ====================================================================
173 */
174 int list_empty( List *list );
175 /*
176 ====================================================================
177 Return entry containing the passed item.
178 Return Value: True if entry found else False.
179 ====================================================================
180 */
181 ListEntry *list_entry( List *list, void *item );
182 /*
183 ====================================================================
184 Transfer an entry from one list to another list by removing from
185 'source' and adding to 'dest' thus if source does not contain
186 the item this is equvalent to list_add( dest, item ).
187 ====================================================================
188 */
189 void list_transfer( List *source, List *dest, void *item );
190 /*
191 ====================================================================
192 Deqeue the first list entry. (must not use auto_delete therefore)
193 ====================================================================
194 */
195 void *list_dequeue( List *list );
196
197 #ifdef __cplusplus
198 };
199 #endif
200
201 #endif
0 /***************************************************************************
1 stk.c - description
2 -------------------
3 begin : Thu Oct 12 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <string.h>
18 #include <stdarg.h>
19 #include <stdlib.h>
20 #include <png.h>
21 #include "stk.h"
22
23 //#define STK_DEBUG
24
25 /*
26 ====================================================================
27 LOCAL
28 ====================================================================
29 */
30
31 int stk_quit_request = 0;
32 SDL_Surface *stk_display = 0;
33 enum { STK_UPDATE_RECT_LIMIT = 200 };
34 SDL_Rect stk_update_rects[STK_UPDATE_RECT_LIMIT];
35 int stk_update_rect_count = 0;
36 int stk_display_use_fade = 1; /* fading allowed? */
37 SDL_Cursor *stk_empty_cursor = 0;
38 SDL_Cursor *stk_standard_cursor = 0;
39 char *stk_surface_path = 0;
40 char *stk_audio_path = 0;
41 SDL_Rect stk_srect, stk_drect;
42 int stk_old_alpha = 0;
43 int stk_audio_ok = 0;
44 #ifdef AUDIO_ENABLED
45 int stk_audio_mixchannel_count = MIX_CHANNELS;
46 #else
47 int stk_audio_mixchannel_count = 0;
48 #endif
49 int stk_audio_sound_enabled = 1;
50 int stk_audio_sound_volume = 127;
51 int stk_audio_buffer_size = 512;
52 int stk_screenshot_id = 1;
53
54 /* Load a PNG type image from an SDL datasource */
55 #define IMG_SetError SDL_SetError
56 static void png_read_data(png_structp ctx, png_bytep area, png_size_t size)
57 {
58 SDL_RWops *src;
59
60 src = (SDL_RWops *)png_get_io_ptr(ctx);
61 SDL_RWread(src, area, size, 1);
62 }
63 static SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)
64 {
65 SDL_Surface *volatile surface;
66 png_structp png_ptr;
67 png_infop info_ptr;
68 png_uint_32 width, height;
69 int bit_depth, color_type, interlace_type;
70 Uint32 Rmask;
71 Uint32 Gmask;
72 Uint32 Bmask;
73 Uint32 Amask;
74 SDL_Palette *palette;
75 png_bytep *volatile row_pointers;
76 int row, i;
77 volatile int ckey = -1;
78 png_color_16 *transv;
79
80 /* Initialize the data we will clean up when we're done */
81 png_ptr = NULL; info_ptr = NULL; row_pointers = NULL; surface = NULL;
82
83 /* Check to make sure we have something to do */
84 if ( ! src ) {
85 goto done;
86 }
87
88 /* Create the PNG loading context structure */
89 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
90 NULL,NULL,NULL);
91 if (png_ptr == NULL){
92 IMG_SetError("Couldn't allocate memory for PNG file");
93 goto done;
94 }
95
96 /* Allocate/initialize the memory for image information. REQUIRED. */
97 info_ptr = png_create_info_struct(png_ptr);
98 if (info_ptr == NULL) {
99 IMG_SetError("Couldn't create image information for PNG file");
100 goto done;
101 }
102
103 /* Set error handling if you are using setjmp/longjmp method (this is
104 * the normal method of doing things with libpng). REQUIRED unless you
105 * set up your own error handlers in png_create_read_struct() earlier.
106 */
107 if ( setjmp(png_ptr->jmpbuf) ) {
108 IMG_SetError("Error reading the PNG file.");
109 goto done;
110 }
111
112 /* Set up the input control */
113 png_set_read_fn(png_ptr, src, png_read_data);
114
115 /* Read PNG header info */
116 png_read_info(png_ptr, info_ptr);
117 png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
118 &color_type, &interlace_type, NULL, NULL);
119
120 /* tell libpng to strip 16 bit/color files down to 8 bits/color */
121 png_set_strip_16(png_ptr) ;
122
123 /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
124 * byte into separate bytes (useful for paletted and grayscale images).
125 */
126 png_set_packing(png_ptr);
127
128 /* scale greyscale values to the range 0..255 */
129 if(color_type == PNG_COLOR_TYPE_GRAY)
130 png_set_expand(png_ptr);
131
132 /* For images with a single "transparent colour", set colour key;
133 if more than one index has transparency, or if partially transparent
134 entries exist, use full alpha channel */
135 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
136 int num_trans;
137 Uint8 *trans;
138 png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans,
139 &transv);
140 if(color_type == PNG_COLOR_TYPE_PALETTE) {
141 /* Check if all tRNS entries are opaque except one */
142 int i, t = -1;
143 for(i = 0; i < num_trans; i++)
144 if(trans[i] == 0) {
145 if(t >= 0)
146 break;
147 t = i;
148 } else if(trans[i] != 255)
149 break;
150 if(i == num_trans) {
151 /* exactly one transparent index */
152 ckey = t;
153 } else {
154 /* more than one transparent index, or translucency */
155 png_set_expand(png_ptr);
156 }
157 } else
158 ckey = 0; /* actual value will be set later */
159 }
160
161 if ( color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
162 png_set_gray_to_rgb(png_ptr);
163
164 png_read_update_info(png_ptr, info_ptr);
165
166 png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
167 &color_type, &interlace_type, NULL, NULL);
168
169 /* Allocate the SDL surface to hold the image */
170 Rmask = Gmask = Bmask = Amask = 0 ;
171 if ( color_type != PNG_COLOR_TYPE_PALETTE ) {
172 if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {
173 Rmask = 0x000000FF;
174 Gmask = 0x0000FF00;
175 Bmask = 0x00FF0000;
176 Amask = (info_ptr->channels == 4) ? 0xFF000000 : 0;
177 } else {
178 int s = (info_ptr->channels == 4) ? 0 : 8;
179 Rmask = 0xFF000000 >> s;
180 Gmask = 0x00FF0000 >> s;
181 Bmask = 0x0000FF00 >> s;
182 Amask = 0x000000FF >> s;
183 }
184 }
185 surface = SDL_AllocSurface(SDL_SWSURFACE, width, height,
186 bit_depth*info_ptr->channels, Rmask,Gmask,Bmask,Amask);
187 if ( surface == NULL ) {
188 IMG_SetError("Out of memory");
189 goto done;
190 }
191
192 if(ckey != -1) {
193 if(color_type != PNG_COLOR_TYPE_PALETTE)
194 /* FIXME: Should these be truncated or shifted down? */
195 ckey = SDL_MapRGB(surface->format,
196 (Uint8)transv->red,
197 (Uint8)transv->green,
198 (Uint8)transv->blue);
199 SDL_SetColorKey(surface, SDL_SRCCOLORKEY, ckey);
200 }
201
202 /* Create the array of pointers to image data */
203 row_pointers = (png_bytep*) malloc(sizeof(png_bytep)*height);
204 if ( (row_pointers == NULL) ) {
205 IMG_SetError("Out of memory");
206 SDL_FreeSurface(surface);
207 surface = NULL;
208 goto done;
209 }
210 for (row = 0; row < (int)height; row++) {
211 row_pointers[row] = (png_bytep)
212 (Uint8 *)surface->pixels + row*surface->pitch;
213 }
214
215 /* Read the entire image in one go */
216 png_read_image(png_ptr, row_pointers);
217
218 /* read rest of file, get additional chunks in info_ptr - REQUIRED */
219 png_read_end(png_ptr, info_ptr);
220
221 /* Load the palette, if any */
222 palette = surface->format->palette;
223 if ( palette ) {
224 if(color_type == PNG_COLOR_TYPE_GRAY) {
225 palette->ncolors = 256;
226 for(i = 0; i < 256; i++) {
227 palette->colors[i].r = i;
228 palette->colors[i].g = i;
229 palette->colors[i].b = i;
230 }
231 } else if (info_ptr->num_palette > 0 ) {
232 palette->ncolors = info_ptr->num_palette;
233 for( i=0; i<info_ptr->num_palette; ++i ) {
234 palette->colors[i].b = info_ptr->palette[i].blue;
235 palette->colors[i].g = info_ptr->palette[i].green;
236 palette->colors[i].r = info_ptr->palette[i].red;
237 }
238 }
239 }
240
241 done: /* Clean up and return */
242 png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : (png_infopp)0,
243 (png_infopp)0);
244 if ( row_pointers ) {
245 free(row_pointers);
246 }
247 return(surface);
248 }
249
250 static SDL_Surface *png_load( char *path )
251 {
252 SDL_RWops *src;
253 SDL_Surface *surf;
254 if ( ( src = SDL_RWFromFile(path, "rb") ) == 0 ) {
255 fprintf( stderr, "%s\n", SDL_GetError() );
256 return 0;
257 }
258 else {
259 surf = IMG_LoadPNG_RW( src );
260 SDL_RWclose( src );
261 return surf;
262 }
263 }
264
265 /*
266 ====================================================================
267 Close display and call SDL_Quit.
268 ====================================================================
269 */
270 static void stk_quit( void )
271 {
272 stk_surface_free( &stk_display );
273 stk_cursor_free( &stk_empty_cursor );
274 if ( stk_surface_path ) {
275 free( stk_surface_path );
276 stk_surface_path = 0;
277 }
278 printf( "STK finalized\n" );
279 SDL_Quit();
280 printf( "SDL finalized\n" );
281 }
282
283 /*
284 ====================================================================
285 PUBLIC
286 ====================================================================
287 */
288
289 /* GENERAL */
290
291 /*
292 ====================================================================
293 Initiate SDL, build a default cursor and install the clean
294 up function stk_quit().
295 ====================================================================
296 */
297 void stk_init( int flags )
298 {
299 /* remove sound flag if disabled */
300 #ifndef WITH_SOUND
301 if ( flags & SDL_INIT_AUDIO )
302 flags = flags & ~SDL_INIT_AUDIO;
303 #endif
304 /* init SDL */
305 if ( SDL_Init( flags ) < 0 )
306 STK_ABORT( SDL_GetError() );
307 /* enable unicode */
308 SDL_EnableUNICODE( 1 );
309 /* set cleanup function */
310 atexit( stk_quit );
311 /* set current directory as path for surfaces */
312 stk_surface_set_path( "." );
313 /* set current directory as path for sounds */
314 stk_audio_set_path( "." );
315 /* create empty cursor */
316 stk_empty_cursor = stk_cursor_create( 16, 16, 8, 8,
317 " "
318 " "
319 " "
320 " "
321 " "
322 " "
323 " "
324 " "
325 " "
326 " "
327 " "
328 " "
329 " "
330 " "
331 " "
332 " " );
333 stk_standard_cursor = SDL_GetCursor();
334 }
335
336 /*
337 ====================================================================
338 Block until either a key or button was pressed.
339 ====================================================================
340 */
341 void stk_wait_for_input( void )
342 {
343 SDL_Event event;
344 while ( 1 ) {
345 SDL_WaitEvent(&event);
346 if (event.type == SDL_QUIT) {
347 stk_quit_request = 1;
348 return;
349 }
350 if (event.type == SDL_KEYDOWN || event.type == SDL_MOUSEBUTTONDOWN)
351 return;
352 }
353 }
354
355 /* SCREEN */
356
357 /*
358 ====================================================================
359 Open a display with the passed settings. Depth may be modified due
360 to Xserver settings and if the resolution is completely
361 unavailable 640 x 480 x 16 x SDL_SWSURFACE is opened.
362 If the display is already open it is closed and re-opened.
363 There is no function to close the display as this is handled by the
364 stk_quit() function installed by stk_init().
365 The display can be accessed by
366 extern SDL_Surface *stk_display;
367 This funtion returns True if the wanted width and height are
368 available, False if not and it aborts when no display is found.
369 ====================================================================
370 */
371 int stk_display_open( int flags, int width, int height, int depth )
372 {
373 #ifdef STK_DEBUG
374 SDL_PixelFormat *format;
375 #endif
376 if ( stk_display ) {
377 /* if display is already open check if the requested
378 resolution is already the current one */
379 if ( stk_display->w == width )
380 if ( stk_display->h == height )
381 if ( stk_display->flags == flags )
382 return 1;
383 /* close old display */
384 stk_surface_free( &stk_display );
385 }
386 else { /* load window icon on first time setup */
387 SDL_Surface *icon;
388 icon = png_load(SRC_DIR "/gfx/win_icon.png");
389 SDL_SetColorKey(icon, SDL_SRCCOLORKEY, 0);
390 SDL_WM_SetIcon(icon, NULL);
391 }
392
393 /* open new display */
394 if ( ( depth = SDL_VideoModeOK( width, height, depth, flags ) ) == 0 ) {
395 fprintf( stderr, "Requested mode %ix%i %s unavailable\n",
396 width, height, (flags&SDL_FULLSCREEN)?"Fullscreen":"Window" );
397 stk_display = SDL_SetVideoMode( 640, 480, 16, SDL_SWSURFACE );
398 return 0;
399 }
400 else
401 if ( ( stk_display = SDL_SetVideoMode( width, height, depth, flags ) ) == 0 )
402 STK_ABORT( SDL_GetError() );
403
404 #ifdef STK_DEBUG
405 printf( "set display %ix%i %s\n",
406 width, height, (flags&SDL_FULLSCREEN)?"Fullscreen":"Window" );
407
408 format = stk_display->format;
409 printf("video mode format:\n");
410 printf("Masks: R=%i, G=%i, B=%i\n",
411 format->Rmask, format->Gmask, format->Bmask);
412 printf("LShft: R=%i, G=%i, B=%i\n",
413 format->Rshift, format->Gshift, format->Bshift);
414 printf("RShft: R=%i, G=%i, B=%i\n",
415 format->Rloss, format->Gloss, format->Bloss);
416 printf("BBP: %i\n", format->BitsPerPixel);
417 printf("-----\n");
418 #endif
419
420 return 1;
421 }
422
423 /*
424 ====================================================================
425 Add an update rectangle that will be updated by
426 stk_display_update(). Regardless of clipping the rectangles
427 must fit the screen else it'll raise an X error.
428 If NULL is passed as 'rect' the whole screen is stored for update.
429 ====================================================================
430 */
431 void stk_display_store_rect( SDL_Rect *rect )
432 {
433 if ( stk_update_rect_count < STK_UPDATE_RECT_LIMIT ) {
434 if ( rect ) {
435 /* for safety this check is kept although it should be
436 unnescessary */
437 if ( rect->x < 0 ) {
438 rect->w += rect->x;
439 rect->x = 0;
440 }
441 if ( rect->y < 0 ) {
442 rect->h += rect->y;
443 rect->y = 0;
444 }
445 if ( rect->x + rect->w > stk_display->w )
446 rect->w = stk_display->w - rect->x;
447 if ( rect->y + rect->h > stk_display->h )
448 rect->h = stk_display->h - rect->y;
449 if ( rect->w > 0 && rect->h > 0 )
450 stk_update_rects[stk_update_rect_count++] = *rect;
451 }
452 else
453 stk_update_rect_count = STK_UPDATE_RECT_LIMIT;
454 }
455 }
456
457 /*
458 ====================================================================
459 Store the destination rectangle of the last blit operation. SDL
460 modified this rectangle to the actually updated clipping region.
461 ====================================================================
462 */
463 void stk_display_store_drect( void )
464 {
465 if ( stk_update_rect_count < STK_UPDATE_RECT_LIMIT )
466 stk_update_rects[stk_update_rect_count++] = stk_drect;
467 }
468
469 /*
470 ====================================================================
471 Either update all gathered rects or simply the full screen.
472 In any case the stored regions are cleared.
473 ====================================================================
474 */
475 void stk_display_update( int type )
476 {
477 if ( type == STK_UPDATE_ALL ||
478 stk_update_rect_count == STK_UPDATE_RECT_LIMIT )
479 SDL_UpdateRect( stk_display, 0, 0, 0, 0 );
480 else
481 SDL_UpdateRects( stk_display, stk_update_rect_count,
482 stk_update_rects );
483 stk_update_rect_count = 0;
484 }
485
486 /*
487 ====================================================================
488 Fade the current contents of the display either in or out. 'time'
489 is the time in milliseconds the fading is supposed to take.
490 ====================================================================
491 */
492 void stk_display_fade( int type, int time )
493 {
494 SDL_Surface *buffer = 0;
495 float alpha;
496 float alpha_change; /* per ms */
497 int leave = 0;
498 int ms;
499
500 if ( stk_quit_request ) return;
501
502 if ( !stk_display_use_fade ) {
503 if ( type == STK_FADE_IN )
504 stk_display_update( STK_UPDATE_ALL );
505 else {
506 stk_surface_fill( stk_display, 0, 0, -1, -1, 0x0 );
507 stk_display_update( STK_UPDATE_ALL );
508 }
509 }
510
511 /* get screen contents */
512 buffer = stk_surface_create( SDL_SWSURFACE, stk_display->w, stk_display->h );
513 SDL_SetColorKey( buffer, 0, 0 );
514 stk_surface_blit( stk_display, 0, 0, -1, -1, buffer, 0, 0 );
515
516 /* compute alpha and alpha change */
517 if ( type == STK_FADE_OUT ) {
518 alpha = 255;
519 alpha_change = -255.0 / time;
520 }
521 else {
522 alpha = 0;
523 alpha_change = 255.0 / time;
524 }
525
526 /* fade */
527 stk_timer_reset();
528 while ( !leave ) {
529 ms = stk_timer_get_time();
530 alpha += alpha_change * ms;
531 if ( type == STK_FADE_IN && alpha >= 255 ) break;
532 if ( type == STK_FADE_OUT && alpha <= 0 ) break;
533 /* update */
534 stk_surface_fill( stk_display, 0, 0, -1, -1, 0x0 );
535 SDL_SetAlpha( buffer, SDL_SRCALPHA, (int)alpha );
536 stk_surface_blit( buffer, 0, 0, -1, -1, stk_display, 0, 0);
537 stk_display_update( STK_UPDATE_ALL );
538 }
539
540 /* update screen */
541 SDL_SetAlpha( buffer, 0, 0 );
542 if ( type == STK_FADE_IN )
543 stk_surface_blit( buffer, 0, 0, -1, -1, stk_display, 0, 0 );
544 else
545 stk_surface_fill( stk_display, 0, 0, -1, -1, 0x0 );
546 stk_display_update( STK_UPDATE_ALL );
547 stk_surface_free( &buffer );
548 }
549
550
551 /*
552 ====================================================================
553 Take a screenshot and save it to screenshot[index].bmp in the
554 current directory.
555 ====================================================================
556 */
557 void stk_display_take_screenshot()
558 {
559 char str[32];
560 snprintf( str, 32, "screenshot%i.bmp", stk_screenshot_id++ );
561 SDL_SaveBMP( stk_display, str );
562 }
563
564 /*
565 ====================================================================
566 Switch fullscreen/windowed for current resolution.
567 ====================================================================
568 */
569 void stk_display_apply_fullscreen( int fullscreen )
570 {
571 int flags = stk_display->flags;
572 if ( fullscreen && stk_display->flags & SDL_FULLSCREEN )
573 return;
574 if ( !fullscreen && !(stk_display->flags & SDL_FULLSCREEN ) )
575 return;
576 if ( fullscreen )
577 flags |= SDL_FULLSCREEN;
578 else
579 flags &= ~SDL_FULLSCREEN;
580 stk_display_open( flags, stk_display->w, stk_display->h,
581 stk_display->format->BitsPerPixel );
582 }
583
584 /* SURFACE */
585
586 /*
587 ====================================================================
588 If stk_surface_load() is called with a relative path this prefix
589 is added. Default is '.'; 'path' is copied.
590 ====================================================================
591 */
592 void stk_surface_set_path( char *path )
593 {
594 #ifdef STK_DEBUG
595 printf( "surface prefix set to: %s\n", path );
596 #endif
597 if ( stk_surface_path )
598 free( stk_surface_path );
599 if ( ( stk_surface_path = strdup( path ) ) == 0 )
600 STK_ABORT( "Out Of Memory" )
601 }
602
603 static int is_path_relative(char *path)
604 {
605 int is_relative;
606 #ifdef _WIN32
607 is_relative = ((*path != '\\') && ((strchr(path,':') == NULL)));
608 #else
609 is_relative = (*path != '/');
610 #endif
611 return is_relative;
612 }
613
614
615 /*
616 ====================================================================
617 Load a surface from a path. If it's not an absolute directory
618 (starting with '/') the prefix passed in stk_surface_set_path()
619 is prepended.
620 If a video mode was set the surface will be converted to its
621 format to speed up blitting. As resource either BMP or PNG may
622 be provided.
623 If SDL_NONFATAL is passed a warning is displayed and the function
624 returns NULL else it will exit the program with an error.
625 ====================================================================
626 */
627 SDL_Surface* stk_surface_load( int flags, char *format, ... )
628 {
629 SDL_Surface *surface = 0;
630 SDL_Surface *converted_surface = 0;
631 char path[512], *ptr;
632 va_list args;
633
634 /* build full path */
635 memset( path, 0, 512 ); ptr = path;
636 if ( is_path_relative(format) && stk_surface_path ) {
637 sprintf( path, "%s/", stk_surface_path );
638 ptr = path + strlen( path );
639 }
640 va_start( args, format );
641 vsnprintf( ptr, 511 - (path-ptr), format, args );
642 va_end( args );
643 #ifdef STK_DEBUG
644 printf( "loading %s\n", path );
645 #endif
646
647 /* load surface */
648 ptr = path + strlen( path ) - 3;
649 if ( !strncmp( ptr, "png", 3 ) )
650 /* as png */
651 surface = png_load( path );
652 else
653 /* as bmp */
654 surface = SDL_LoadBMP( path );
655 if ( surface == 0 ) {
656 if ( flags & SDL_NONFATAL ) {
657 fprintf( stderr, "%s\n", SDL_GetError() );
658 return 0;
659 }
660 else
661 STK_ABORT( SDL_GetError() )
662 }
663
664 /* convert if display open */
665 if ( stk_display ) {
666 converted_surface = SDL_DisplayFormat( surface );
667 if ( converted_surface == 0 ) {
668 fprintf( stderr, "Conversion of %s failed: %s\n",
669 path, SDL_GetError() );
670 return surface;
671 }
672 else {
673 SDL_FreeSurface( surface );
674 SDL_SetColorKey(
675 converted_surface, SDL_SRCCOLORKEY, 0x0 );
676 SDL_SetAlpha( converted_surface, 0, 0 );
677 return converted_surface;
678 }
679 }
680 else {
681 #ifdef STK_DEBUG
682 printf( " not converted\n" );
683 #endif
684 return surface;
685 }
686 }
687
688 /*
689 ====================================================================
690 Create a surface with the given size and the format of the
691 video mode which must be set.
692 The default color key of the surface is black and no alpha.
693 ====================================================================
694 */
695 SDL_Surface* stk_surface_create( int flags, int width, int height )
696 {
697 SDL_Surface *surface = 0;
698 if ( !stk_display ) {
699 if ( flags & SDL_NONFATAL ) {
700 fprintf( stderr,
701 "Can't create surface as no display is open\n" );
702 return 0;
703 }
704 else
705 STK_ABORT(
706 "Can't create surface as no display is open\n" );
707 }
708 surface = SDL_CreateRGBSurface( flags, width, height,
709 stk_display->format->BitsPerPixel,
710 stk_display->format->Rmask,
711 stk_display->format->Gmask,
712 stk_display->format->Bmask,
713 stk_display->format->Amask );
714 if ( surface == 0 ) {
715 if ( flags & SDL_NONFATAL ) {
716 fprintf( stderr, "%s\n", SDL_GetError() );
717 return 0;
718 }
719 else
720 STK_ABORT( SDL_GetError() );
721 }
722 SDL_SetColorKey( surface, SDL_SRCCOLORKEY, 0x0 );
723 SDL_SetAlpha( surface, 0, 0 );
724 #ifdef STK_DEBUG
725 printf( "surface %ix%i created\n", width, height );
726 #endif
727 return surface;
728 }
729
730 /*
731 ====================================================================
732 Free the memory of a surface if not NULL and reset the pointer
733 to NULL.
734 ====================================================================
735 */
736 void stk_surface_free( SDL_Surface **surface )
737 {
738 if ( *surface ) {
739 SDL_FreeSurface( *surface );
740 *surface = 0;
741 }
742 }
743
744 /*
745 ====================================================================
746 Blit retangle from 'src' to 'dest' with current alpha of 'src'.
747 If 'sw' is -1 the full source width is used, 'sh' analogue.
748 stk_display_store_drect() can be used to store the update rect
749 of the blitted surface.
750 ====================================================================
751 */
752 void stk_surface_blit(
753 SDL_Surface *src, int sx, int sy, int sw, int sh,
754 SDL_Surface *dest, int dx, int dy )
755 {
756 /* build rectangles */
757 stk_drect.x = dx; stk_drect.y = dy;
758 stk_drect.w = (sw==-1)?src->w:sw;
759 stk_drect.h = (sh==-1)?src->h:sh;
760 stk_srect.x = sx; stk_srect.y = sy;
761 stk_srect.w = stk_drect.w;
762 stk_srect.h = stk_drect.h;
763 /* blit */
764 SDL_BlitSurface( src, &stk_srect, dest, &stk_drect );
765 }
766
767 /*
768 ====================================================================
769 Different from stk_surface_blit() this function temporarily
770 overwrites 'src's alpha value. It is not recommended to use
771 this function if performance is important as it is slower
772 than an SDL_SetAlpha() combined with stk_surface_blit().
773 ====================================================================
774 */
775 void stk_surface_alpha_blit(
776 SDL_Surface *src, int sx, int sy, int sw, int sh,
777 SDL_Surface *dest, int dx, int dy, int alpha )
778 {
779 if ( src->flags & SDL_SRCALPHA )
780 stk_old_alpha = src->format->alpha;
781 else
782 stk_old_alpha = -1;
783 SDL_SetAlpha( src, SDL_SRCALPHA, alpha );
784 stk_surface_blit( src, sx,sy,sw,sh, dest, dx,dy );
785 if ( stk_old_alpha == -1 )
786 SDL_SetAlpha( src, 0, 0 );
787 else
788 SDL_SetAlpha( src, SDL_SRCALPHA,
789 stk_old_alpha );
790 }
791
792 /*
793 ====================================================================
794 Fill a rectangle of the surface with a given color of the format
795 0xRRGGBB. 'dw' == -1 and 'dh' == -1 have the same effect as in
796 stk_surface_blit().
797 ====================================================================
798 */
799 void stk_surface_fill(
800 SDL_Surface *dest, int dx, int dy, int dw, int dh,
801 int color )
802 {
803 /* build rectangle */
804 stk_drect.x = dx; stk_drect.y = dy;
805 stk_drect.w = (dw==-1)?dest->w:dw;
806 stk_drect.h = (dh==-1)?dest->h:dh;
807 /* fill surface */
808 SDL_FillRect( dest, &stk_drect,
809 SDL_MapRGB( stk_display->format,
810 color >> 16,
811 (color >> 8) & 0xFF,
812 color & 0xFF) );
813 }
814
815 /*
816 ====================================================================
817 Set the clipping region of a surface. All blit operations into
818 this surface will only have effect within the clipping region.
819 'dw' == -1 and 'dh' == -1 have the same effect as in
820 stk_surface_blit().
821 ====================================================================
822 */
823 void stk_surface_clip(
824 SDL_Surface *dest, int dx, int dy, int dw, int dh )
825 {
826 /* build rectangle */
827 stk_drect.x = dx; stk_drect.y = dy;
828 stk_drect.w = (dw<=0)?dest->w:dw;
829 stk_drect.h = (dh<=0)?dest->h:dh;
830 /* clip */
831 SDL_SetClipRect( dest, &stk_drect );
832 }
833
834 /*
835 ====================================================================
836 Lock/unlock surface for direct access.
837 ====================================================================
838 */
839 #define stk_surface_lock( surface ) \
840 if (SDL_MUSTLOCK((surface))) SDL_LockSurface((surface))
841 #define stk_surface_unlock( surface ) \
842 if (SDL_MUSTLOCK((surface))) SDL_UnlockSurface((surface))
843
844 /*
845 ====================================================================
846 Get or set a pixel from/to a surface. This time the pixel must
847 already be in SDL format.
848 ====================================================================
849 */
850 void stk_surface_set_pixel(
851 SDL_Surface *dest, int dx, int dy, Uint32 pixel )
852 {
853 memcpy( dest->pixels + dy * dest->pitch +
854 dx * dest->format->BytesPerPixel,
855 &pixel, dest->format->BytesPerPixel );
856 }
857 Uint32 stk_surface_get_pixel( SDL_Surface *src, int sx, int sy )
858 {
859 Uint32 pixel = 0;
860 memcpy( &pixel,
861 src->pixels + sy * src->pitch +
862 sx * src->format->BytesPerPixel,
863 src->format->BytesPerPixel );
864 return pixel;
865 }
866
867 /*
868 ====================================================================
869 Convert part of the surface to gray and if 'dark' is set cut the
870 brightness in half. 'dw' == -1 and 'dh' == -1 have the same
871 effect as in tk_surface_blit().
872 ====================================================================
873 */
874 void stk_surface_gray(
875 SDL_Surface *dest, int dx, int dy, int dw, int dh, int dark )
876 {
877 int i, j, y_offset, x_offset;
878 Uint32 pixel, temp;
879 Uint8 red, green, blue, gray;
880 /* adjust size */
881 if ( dw == -1 ) dw = dest->w;
882 if ( dh == -1 ) dh = dest->h;
883 /* gray */
884 y_offset = dest->pitch * dy;
885 for ( j = dy; j < dy + dh; j++ ) {
886 for ( i = dx, x_offset = dx * dest->format->BytesPerPixel;
887 i < dx + dw;
888 i++, x_offset += dest->format->BytesPerPixel ) {
889 pixel = 0;
890 /* get pixel */
891 memcpy( &pixel,
892 dest->pixels +
893 y_offset + x_offset,
894 dest->format->BytesPerPixel );
895 /* extract colors */
896 temp=pixel & dest->format->Rmask;
897 temp=temp>>dest->format->Rshift;
898 temp=temp<<dest->format->Rloss;
899 red=(Uint8)temp;
900 temp=pixel & dest->format->Gmask;
901 temp=temp>>dest->format->Gshift;
902 temp=temp<<dest->format->Gloss;
903 green=(Uint8)temp;
904 temp=pixel & dest->format->Bmask;
905 temp=temp>>dest->format->Bshift;
906 temp=temp<<dest->format->Bloss;
907 blue=(Uint8)temp;
908 /* build new color */
909 gray = (red + green + green + blue) >> (2 + dark);
910 pixel = SDL_MapRGB( dest->format, gray, gray, gray );
911 /* replace */
912 memcpy( dest->pixels +
913 y_offset + x_offset,
914 &pixel,
915 dest->format->BytesPerPixel );
916 }
917 y_offset += dest->pitch;
918 }
919 }
920
921 /*
922 ====================================================================
923 Add a 3D frame to surface and dark to contents. The frame border
924 is 'border' thick.
925 ====================================================================
926 */
927 void stk_surface_add_3dframe(
928 SDL_Surface *dest, int dx, int dy, int dw, int dh, int border )
929 {
930 printf( "not implemented yet!\n" );
931 }
932
933 /*
934 ====================================================================
935 Fill the surface with the wallpaper (clipped)
936 ====================================================================
937 */
938 void stk_surface_apply_wallpaper(
939 SDL_Surface *dest, int dx, int dy, int dw, int dh,
940 SDL_Surface *wallpaper, int alpha )
941 {
942 int i, j;
943 /* adjust dw and dh */
944 if ( dw == -1 ) dw = dest->w;
945 if ( dh == -1 ) dh = dest->h;
946 stk_surface_clip( dest, dx, dy, dw, dh );
947 /* apply */
948 for ( i = 0; i < dw; i += wallpaper->w )
949 for ( j = 0; j < dh; j += wallpaper->h )
950 stk_surface_alpha_blit( wallpaper, 0, 0, -1, -1,
951 dest, dx + i, dy + j, alpha );
952 stk_surface_clip( dest, 0,0,-1,-1 );
953 }
954
955 /*
956 ====================================================================
957 Apply a frame to the surface. The frame resource provides the eight
958 square-like parts for the frame composed as a little frame: corners
959 and sides.
960 'dw' == -1 and 'dh' == -1 have the same effect as in
961 stk_surface_blit().
962 Returns the size of the border.
963 ====================================================================
964 */
965 int stk_surface_apply_frame(
966 SDL_Surface *dest, int dx, int dy, int dw, int dh,
967 SDL_Surface *frame )
968 {
969 int tile_size = frame->w / 3;
970 int i;
971 /* adjust dw and dh */
972 if ( dw == -1 ) dw = dest->w;
973 if ( dh == -1 ) dh = dest->h;
974 /* horizontal middle parts */
975 for ( i = dx; i < dx + dw - tile_size; i += tile_size ) {
976 stk_surface_blit( frame, tile_size, 0,
977 tile_size, tile_size,
978 dest, i, dy );
979 stk_surface_blit( frame, tile_size, tile_size << 1,
980 tile_size, tile_size,
981 dest, i, dy + dh - tile_size );
982 }
983 /* vertical middle parts */
984 for ( i = dy; i < dy + dh - tile_size; i += tile_size ) {
985 stk_surface_blit( frame, 0, tile_size,
986 tile_size, tile_size,
987 dest, dx, i );
988 stk_surface_blit( frame, tile_size << 1, tile_size,
989 tile_size, tile_size,
990 dest, dx + dw - tile_size, i );
991 }
992 /* corners */
993 stk_surface_blit( frame, 0, 0, tile_size, tile_size,
994 dest, dx, dy );
995 stk_surface_blit( frame, tile_size << 1, 0,
996 tile_size, tile_size,
997 dest, dx + dw - tile_size, dy );
998 stk_surface_blit( frame, 0, tile_size << 1,
999 tile_size, tile_size,
1000 dest, dx, dy + dh - tile_size );
1001 stk_surface_blit( frame, tile_size << 1, tile_size << 1,
1002 tile_size, tile_size,
1003 dest, dx + dw - tile_size,
1004 dy + dh - tile_size );
1005 return tile_size;
1006 }
1007
1008 /* FIXED FONT */
1009
1010 /*
1011 ====================================================================
1012 Load a fixed font which is simply a surface containing the ASCII
1013 characters from 32 (blank) to 96 (whatever) where all characters
1014 have the same width.
1015 ====================================================================
1016 */
1017 StkFont* stk_font_load( int flags, char *format, ... )
1018 {
1019 char path[512];
1020 va_list args;
1021 StkFont *font = calloc( 1, sizeof ( StkFont ) );
1022 if ( font == 0 )
1023 STK_ABORT( "Out Of Memory" );
1024 /* build path */
1025 memset( path, 0, 512 );
1026 va_start( args, format );
1027 vsnprintf( path, 511, format, args );
1028 va_end( args );
1029 /* load surface */
1030 font->surface = stk_surface_load( flags, path );
1031 if ( font == 0 ) {
1032 if ( flags & SDL_NONFATAL ) {
1033 fprintf( stderr, "%s\n", SDL_GetError() );
1034 return 0;
1035 }
1036 else
1037 STK_ABORT( SDL_GetError() );
1038 }
1039 /* do the rest */
1040 font->height = font->surface->h;
1041 font->width = font->surface->w / 96;
1042 return font;
1043 }
1044
1045 /*
1046 ====================================================================
1047 Free a font if not NULL and reset pointer to NULL.
1048 ====================================================================
1049 */
1050 void stk_font_free( StkFont **font )
1051 {
1052 if ( *font ) {
1053 stk_surface_free( &(*font)->surface );
1054 free(*font); *font = 0;
1055 }
1056 }
1057
1058 /*
1059 ====================================================================
1060 Write string to surface. If 'alpha' is -1 the font is displayed
1061 with the current alpha value else the new alpha is used and kept.
1062 stk_display_store_drect() can be used to store the update rect
1063 of the written string.
1064 ====================================================================
1065 */
1066 void stk_font_write(
1067 StkFont *font, SDL_Surface *dest, int dx, int dy,
1068 int alpha, char *string )
1069 {
1070 int x, i, width = 0;
1071
1072 /* get pixel width of string */
1073 width = stk_font_string_width( font, string );
1074
1075 /* ajust dx,dy to alignment */
1076 if ( font->align & STK_FONT_ALIGN_CENTER_X )
1077 dx -= width >> 1;
1078 else
1079 if ( font->align & STK_FONT_ALIGN_RIGHT )
1080 dx -= width;
1081 if ( font->align & STK_FONT_ALIGN_CENTER_Y )
1082 dy -= (font->height >> 1 ) + 1;
1083 else
1084 if ( font->align & STK_FONT_ALIGN_BOTTOM )
1085 dy -= font->height;
1086
1087 /* draw characters */
1088 if ( alpha != -1 )
1089 SDL_SetAlpha( font->surface, SDL_SRCALPHA, alpha );
1090 for ( i = 0, x = dx; i < strlen( string );
1091 i++, x += font->width ) {
1092 stk_surface_blit(
1093 font->surface, font->width * (string[i] - 32), 0,
1094 font->width, font->height,
1095 dest, x, dy );
1096 }
1097
1098 /* fake destination rectangle to full string */
1099 stk_drect.x = dx; stk_drect.y = dy;
1100 stk_drect.w = width; stk_drect.h = font->height;
1101 if (stk_drect.x < 0) {
1102 stk_drect.w += stk_drect.x;
1103 stk_drect.x = 0;
1104 }
1105 if (stk_drect.y < 0) {
1106 stk_drect.h += stk_drect.y;
1107 stk_drect.y = 0;
1108 }
1109 if (stk_drect.x + stk_drect.w >= stk_display->w)
1110 stk_drect.w = stk_display->w - stk_drect.x;
1111 if (stk_drect.y + stk_drect.h >= stk_display->h)
1112 stk_drect.h = stk_display->h - stk_drect.y;
1113 }
1114
1115 /* CURSOR */
1116
1117 /*
1118 ====================================================================
1119 Build an SDL cursor with the given hotspot. The resource mask
1120 contains 'b' for black 'w' for white and ' ' for transparent.
1121 ====================================================================
1122 */
1123 SDL_Cursor* stk_cursor_create(
1124 int width, int height, int hot_x, int hot_y, char *source )
1125 {
1126 char *mask = 0, *data = 0;
1127 SDL_Cursor *cursor = 0;
1128 int i, j, k;
1129 char data_byte, mask_byte;
1130 int pot;
1131 /* create mask&data */
1132 mask = calloc( width * height / 8, sizeof ( char ) );
1133 data = calloc( width * height / 8, sizeof ( char ) );
1134 /* convert */
1135 k = 0;
1136 for (j = 0; j < width * height; j += 8, k++) {
1137 pot = 1;
1138 data_byte = mask_byte = 0;
1139 /* create byte */
1140 for (i = 7; i >= 0; i--) {
1141 switch ( source[j + i] ) {
1142 case 'b':
1143 data_byte += pot;
1144 case 'w':
1145 mask_byte += pot;
1146 break;
1147 }
1148 pot *= 2;
1149 }
1150 /* add to mask */
1151 data[k] = data_byte;
1152 mask[k] = mask_byte;
1153 }
1154 /* create and return cursor */
1155 cursor = SDL_CreateCursor( data, mask, width, height, hot_x, hot_y );
1156 free( mask );
1157 free( data );
1158 return cursor;
1159 }
1160
1161 /*
1162 ====================================================================
1163 Free a cursor if not NULL and reset pointer to NULL.
1164 ====================================================================
1165 */
1166 void stk_cursor_free( SDL_Cursor **cursor )
1167 {
1168 if ( *cursor ) {
1169 SDL_FreeCursor( *cursor );
1170 *cursor = 0;
1171 }
1172 }
1173
1174 /* TIMER */
1175
1176 int stk_timer_last_call = 0;
1177
1178 /*
1179 ====================================================================
1180 Reset the timer.
1181 ====================================================================
1182 */
1183 void stk_timer_reset( void )
1184 {
1185 stk_timer_last_call = SDL_GetTicks();
1186 }
1187
1188 /*
1189 ====================================================================
1190 Get the time since last call or reset.
1191 ====================================================================
1192 */
1193 int stk_timer_get_time( void )
1194 {
1195 int ms, current = SDL_GetTicks();
1196 if ( current == stk_timer_last_call )
1197 SDL_Delay(1);
1198 current = SDL_GetTicks();
1199 ms = current - stk_timer_last_call;
1200 stk_timer_last_call = current;
1201 return ms;
1202 }
1203
1204 /* AUDIO */
1205
1206 /*
1207 ====================================================================
1208 Open mixer. If this fails an error message is
1209 displayed (program doesn't abort) and all stk_audio and stk_sound
1210 functions have no effect.
1211 'frequency': 11025, 22050, 44100 ...
1212 'format': MIX_DEFAULT_FORMAT is recommended
1213 'channels': mono(1) or stereo(2)
1214 'chunksize': mix buffer size (1024 Bytes recommended)
1215 Passing 0 for an argument means to use the SDL default:
1216 22050Hz in format AUDIO_S16LSB stereo with 1024 bytes chunksize
1217 stk_audio_open() installs stk_audio_close() as exit function.
1218 There are 8 channels available for mixing.
1219 ====================================================================
1220 */
1221 int stk_audio_open(
1222 int frequency, Uint16 format, int channels, int chunksize )
1223 {
1224 #ifdef AUDIO_ENABLED
1225 if ( frequency == 0 ) frequency = MIX_DEFAULT_FREQUENCY;
1226 if ( format == 0 ) format = MIX_DEFAULT_FORMAT;
1227 if ( channels == 0 ) channels = 2;
1228 if ( chunksize == 0 ) chunksize = stk_audio_buffer_size;
1229 if ( Mix_OpenAudio(
1230 frequency, format, channels, chunksize ) < 0 ) {
1231 fprintf( stderr, "%s\n", SDL_GetError() );
1232 stk_audio_ok = 0;
1233 return 0;
1234 }
1235 stk_audio_ok = 1;
1236 atexit( stk_audio_close );
1237 return 1;
1238 #else
1239 stk_audio_ok = 0;
1240 return 0;
1241 #endif
1242 }
1243
1244 /*
1245 ====================================================================
1246 Close mixer if previously opened.
1247 ====================================================================
1248 */
1249 void stk_audio_close( void )
1250 {
1251 #ifdef AUDIO_ENABLED
1252 if ( stk_audio_ok ) {
1253 Mix_CloseAudio();
1254 stk_audio_ok = 0;
1255 }
1256 #endif
1257 printf( "Audio finalized\n" );
1258 }
1259
1260 /*
1261 ====================================================================
1262 If stk_sound_load() is called with a relative path this prefix
1263 is added. Default is '.'; 'path' is copied.
1264 ====================================================================
1265 */
1266 void stk_audio_set_path( char *path )
1267 {
1268 #ifdef STK_DEBUG
1269 printf( "sound prefix set to: %s\n", path );
1270 #endif
1271 if ( stk_audio_path )
1272 free( stk_audio_path );
1273 if ( ( stk_audio_path = strdup( path ) ) == 0 )
1274 STK_ABORT( "Out Of Memory" )
1275 }
1276
1277 /*
1278 ====================================================================
1279 Enable/disable sound. If disabled stk_sound_play () has no effect.
1280 ====================================================================
1281 */
1282 void stk_audio_enable_sound( int enable )
1283 {
1284 stk_audio_sound_enabled = enable;
1285 }
1286
1287 /*
1288 ====================================================================
1289 Set default volume of all sounds: 0 - 128
1290 ====================================================================
1291 */
1292 void stk_audio_set_sound_volume( int volume )
1293 {
1294 if ( !stk_audio_ok ) return;
1295 if ( volume < 0 ) volume = 0;
1296 if ( volume > 127 ) volume = 127;
1297 stk_audio_sound_volume = volume;
1298 #ifdef AUDIO_ENABLED
1299 Mix_Volume( -1, volume ); /* all sound channels */
1300 #endif
1301 }
1302
1303 /*
1304 ====================================================================
1305 Fade out a specific sound channel. If 'channel is -1 all
1306 channels fade out. 'ms' is the time the fading shall take.
1307 ====================================================================
1308 */
1309 void stk_audio_fade_out( int channel, int ms )
1310 {
1311 #ifdef AUDIO_ENABLED
1312 if ( stk_audio_ok )
1313 Mix_FadeOutChannel( channel, ms );
1314 #endif
1315 }
1316
1317 /* SOUND */
1318
1319 /*
1320 ====================================================================
1321 Load a sound from a path. If it's not an absolute directory
1322 (starting with '/') the prefix passed in stk_sound_set_path()
1323 is prepended. Loading sounds is non-fatal thus if a sound
1324 cannot be found it is created but empty. In this case
1325 a warning is displayed.
1326 The volume is set to the default set by
1327 stk_audio_set_sound_volume(). Sounds with an equal 'channel'
1328 will share it so if a new sound is played the old one breaks up
1329 thus channel should be used to group sounds.
1330 If channel is -1 the first available channel is used
1331 to play sound.
1332 ====================================================================
1333 */
1334 StkSound *stk_sound_load( int channel, char *format, ... )
1335 {
1336 StkSound *sound;
1337 #ifdef AUDIO_ENABLED
1338 char path[512], *ptr;
1339 va_list args;
1340
1341 /* build full path */
1342 memset( path, 0, 512 ); ptr = path;
1343 if ( is_path_relative(format) && stk_audio_path ) {
1344 sprintf( path, "%s/", stk_audio_path );
1345 ptr = path + strlen( path );
1346 }
1347 va_start( args, format );
1348 vsnprintf( ptr, 511 - (path-ptr), format, args );
1349 va_end( args );
1350 #ifdef STK_DEBUG
1351 printf( "loading %s\n", path );
1352 #endif
1353
1354 /* load sound */
1355 if ( ( sound = calloc( 1, sizeof( StkSound ) ) ) == 0 )
1356 STK_ABORT( "Out Of Memory" );
1357 if ( ( sound->chunk = Mix_LoadWAV( path ) ) == 0 )
1358 fprintf( stderr, "Couldn't open %s (%s)\n",
1359 path, SDL_GetError() );
1360 #else
1361 if ( ( sound = calloc( 1, sizeof( StkSound ) ) ) == 0 )
1362 STK_ABORT( "Out Of Memory" );
1363 #endif
1364 sound->volume = stk_audio_sound_volume;
1365 sound->channel = channel;
1366
1367 /* done */
1368 return sound;
1369 }
1370
1371 /*
1372 ====================================================================
1373 Free the memory of a sound if not NULL and reset the pointer
1374 to NULL.
1375 ====================================================================
1376 */
1377 void stk_sound_free( StkSound **sound )
1378 {
1379 if ( *sound ) {
1380 #ifdef AUDIO_ENABLED
1381 if ( (*sound)->chunk )
1382 Mix_FreeChunk( (*sound)->chunk );
1383 #endif
1384 free( *sound );
1385 }
1386 }
1387
1388 /*
1389 ====================================================================
1390 Set channel/volume of sound.
1391 ====================================================================
1392 */
1393 void stk_sound_set_volume( StkSound *sound, int volume )
1394 {
1395 if ( volume < 0 ) volume = 0;
1396 if ( volume > 128 ) volume = 128;
1397 sound->volume = volume;
1398 }
1399 void stk_sound_set_channel( StkSound *sound, int channel )
1400 {
1401 if ( channel < 0 ) channel = 0;
1402 if ( channel > stk_audio_mixchannel_count )
1403 channel = stk_audio_mixchannel_count;
1404 sound->channel = channel;
1405 }
1406
1407 /*
1408 ====================================================================
1409 Play a sound.
1410 ====================================================================
1411 */
1412 void stk_sound_play( StkSound *sound )
1413 {
1414 int channel;
1415 #ifdef AUDIO_ENABLED
1416 if ( stk_audio_ok && stk_audio_sound_enabled ) {
1417 /* if channel is -1 use first free channel */
1418 channel = sound->channel;
1419 if ( channel == -1 )
1420 channel = Mix_GroupAvailable(-1);
1421 Mix_Volume( channel, sound->volume );
1422 Mix_PlayChannel( channel, sound->chunk, 0 );
1423 }
1424 #endif
1425 }
1426 /*
1427 ====================================================================
1428 Play a sound at horizontal position x..
1429 ====================================================================
1430 */
1431 void stk_sound_play_x( int x, StkSound *sound )
1432 {
1433 int channel;
1434 #ifdef AUDIO_ENABLED
1435 if ( stk_audio_ok && stk_audio_sound_enabled ) {
1436 x = (x - 40) * 255 / (640 - 40 - 40);
1437 if (x < 0) x = 0;
1438 if (x > 255) x = 255;
1439 /* if channel is -1 use first free channel */
1440 channel = sound->channel;
1441 if ( channel == -1 )
1442 channel = Mix_GroupAvailable(-1);
1443 Mix_SetPanning( channel, 255 - x, x );
1444 Mix_PlayChannel( channel, sound->chunk, 0 );
1445 }
1446 #endif
1447 }
1448
1449 /*
1450 ====================================================================
1451 Fade out the channel of this sound.
1452 ====================================================================
1453 */
1454 void stk_sound_fade_out( StkSound *sound, int ms )
1455 {
1456 #ifdef AUDIO_ENABLED
1457 if ( stk_audio_ok )
1458 Mix_FadeOutChannel( sound->channel, ms );
1459 #endif
1460 }
0 /***************************************************************************
1 stk.h - description
2 -------------------
3 begin : Thu Oct 12 2002
4 copyright : (C) 2002 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __STK_H
18 #define __STK_H
19
20 #include <SDL.h>
21 #ifdef AUDIO_ENABLED
22 #include <SDL_mixer.h>
23 #endif
24
25 /* GENERAL */
26
27 #define SDL_NONFATAL 0x10000000
28
29 #define STK_ABORT( msg ) \
30 { fprintf( stderr, "Fatal STK Error!\n%s\n", msg ); exit( 1 ); }
31
32 #define STK_IN_RECT( rect, mx, my ) \
33 ( mx >= (rect).x && my >= (rect).y && \
34 mx < (rect).x + (rect).w && my < (rect).y + (rect).h )
35
36 #define STK_OPAQUE SDL_ALPHA_OPAQUE
37 #define STK_TRANSPARENT SDL_ALPHA_TRANSPARENT
38
39 enum {
40 STK_BUTTON_LEFT = 1,
41 STK_BUTTON_MIDDLE,
42 STK_BUTTON_RIGHT,
43 STK_WHEEL_UP,
44 STK_WHEEL_DOWN,
45 STK_BUTTON_COUNT
46 };
47
48 /*
49 ====================================================================
50 Initiate SDL, build a default cursor and install the clean
51 up function stk_quit().
52 ====================================================================
53 */
54 void stk_init( int flags );
55
56 /*
57 ====================================================================
58 Block until either a key or button was pressed. If SDL_QUIT
59 was received this will set stk_quit_request True.
60 ====================================================================
61 */
62 void stk_wait_for_input( void );
63
64 /* SCREEN */
65
66 /*
67 ====================================================================
68 Open a display with the passed settings. Depth may be modified due
69 to Xserver settings and if the resolution is completely
70 unavailable 640 x 480 x 16 x SDL_SWSURFACE is opened.
71 If the display is already open it is closed and re-opened.
72 There is no function to close the display as this is handled by the
73 stk_quit() function installed by stk_init().
74 The display can be accessed by
75 extern SDL_Surface *stk_display;
76 This funtion returns True if the wanted width and height are
77 available, False if not and it aborts when no display is found.
78 ====================================================================
79 */
80 int stk_display_open( int flags, int width, int height, int depth );
81
82 /*
83 ====================================================================
84 Add an update rectangle that will be updated by
85 stk_display_update(). Regardless of clipping the rectangles
86 must fit the screen else it'll raise an X error.
87 If NULL is passed as 'rect' the whole screen is stored for update.
88 ====================================================================
89 */
90 void stk_display_store_rect( SDL_Rect *rect );
91
92 /*
93 ====================================================================
94 Store the destination rectangle of the last blit operation. SDL
95 modified this rectangle to the actually updated clipping region.
96 ====================================================================
97 */
98 void stk_display_store_drect( void );
99
100 /*
101 ====================================================================
102 Either update all gathered rects or simply the full screen.
103 In any case the stored regions are cleared.
104 ====================================================================
105 */
106 enum {
107 STK_UPDATE_ALL = 0,
108 STK_UPDATE_RECTS
109 };
110 void stk_display_update( int type );
111
112 /*
113 ====================================================================
114 Fade the current contents of the display either in or out. 'time'
115 is the time in milliseconds the fading is supposed to take.
116 ====================================================================
117 */
118 enum {
119 STK_FADE_IN = 0,
120 STK_FADE_OUT,
121 STK_FADE_DEFAULT_TIME = 350
122 };
123 void stk_display_fade( int type, int time );
124
125 /*
126 ====================================================================
127 Take a screenshot and save it to screenshot[index].bmp in the
128 current directory.
129 ====================================================================
130 */
131 void stk_display_take_screenshot();
132
133 /*
134 ====================================================================
135 Switch fullscreen/windowed for current resolution.
136 ====================================================================
137 */
138 void stk_display_apply_fullscreen( int fullscreen );
139
140 /* SURFACE */
141
142 /*
143 ====================================================================
144 If stk_surface_load() is called with a relative path this prefix
145 is added. Default is '.'; 'path' is copied.
146 ====================================================================
147 */
148 void stk_surface_set_path( char *path );
149
150 /*
151 ====================================================================
152 Load a surface from a path. If it's not an absolute directory
153 (starting with '/') the prefix passed in stk_surface_set_path()
154 is prepended.
155 If a video mode was set the surface will be converted to its
156 format to speed up blitting. As resource either BMP or PNG may
157 be provided.
158 If SDL_NONFATAL is passed a warning is displayed and the function
159 returns NULL else it will exit the program with an error.
160 The default color key of the surface is black and no alpha.
161 ====================================================================
162 */
163 SDL_Surface* stk_surface_load( int flags, char *format, ... );
164
165 /*
166 ====================================================================
167 Create a surface with the given size and the format of the
168 video mode which must be set.
169 The default color key of the surface is black and no alpha.
170 ====================================================================
171 */
172 SDL_Surface* stk_surface_create( int flags, int width, int height );
173
174 /*
175 ====================================================================
176 Free the memory of a surface if not NULL and reset the pointer
177 to NULL.
178 ====================================================================
179 */
180 void stk_surface_free( SDL_Surface **surface );
181
182 /*
183 ====================================================================
184 Blit retangle from 'src' to 'dest' with current alpha of 'src'.
185 If 'sw' is -1 the full source width is used, 'sh' analogue.
186 stk_display_store_drect() can be used to store the update rect
187 of the blitted surface.
188 ====================================================================
189 */
190 void stk_surface_blit(
191 SDL_Surface *src, int sx, int sy, int sw, int sh,
192 SDL_Surface *dest, int dx, int dy );
193
194 /*
195 ====================================================================
196 Different from stk_surface_blit() this function temporarily
197 overwrites 'src's alpha value. It is not recommended to use
198 this function if performance is important as it is 10 times slower
199 than an SDL_SetAlpha() combined with stk_surface_blit().
200 ====================================================================
201 */
202 void stk_surface_alpha_blit(
203 SDL_Surface *src, int sx, int sy, int sw, int sh,
204 SDL_Surface *dest, int dx, int dy, int alpha );
205
206 /*
207 ====================================================================
208 Fill a rectangle of the surface with a given color of the format
209 0xRRGGBB. 'dw' == -1 and 'dh' == -1 have the same effect as in
210 stk_surface_blit().
211 ====================================================================
212 */
213 void stk_surface_fill(
214 SDL_Surface *dest, int dx, int dy, int dw, int dh,
215 int color );
216
217 /*
218 ====================================================================
219 Set the clipping region of a surface. All blit operations into
220 this surface will only have effect within the clipping region.
221 'dw' == -1 and 'dh' == -1 have the same effect as in
222 stk_surface_blit().
223 ====================================================================
224 */
225 void stk_surface_clip(
226 SDL_Surface *dest, int dx, int dy, int dw, int dh );
227
228 /*
229 ====================================================================
230 Lock/unlock surface for direct access.
231 ====================================================================
232 */
233 #define stk_surface_lock( surface ) \
234 if (SDL_MUSTLOCK((surface))) SDL_LockSurface((surface))
235 #define stk_surface_unlock( surface ) \
236 if (SDL_MUSTLOCK((surface))) SDL_UnlockSurface((surface))
237
238 /*
239 ====================================================================
240 Get or set a pixel from/to a surface. This time the pixel must
241 already be in SDL format.
242 ====================================================================
243 */
244 void stk_surface_set_pixel(
245 SDL_Surface *dest, int dx, int dy, Uint32 pixel );
246 Uint32 stk_surface_get_pixel( SDL_Surface *src, int sx, int sy );
247
248 /*
249 ====================================================================
250 Convert part of the surface to gray and if 'dark' is set cut the
251 brightness in half. 'dw' == -1 and 'dh' == -1 have the same
252 effect as in tk_surface_blit().
253 ====================================================================
254 */
255 void stk_surface_gray(
256 SDL_Surface *dest, int dx, int dy, int dw, int dh, int dark );
257
258 /*
259 ====================================================================
260 Add a 3D frame to surface and dark to contents. The frame border
261 is 'border' thick.
262 ====================================================================
263 */
264 void stk_surface_add_3dframe(
265 SDL_Surface *dest, int dx, int dy, int dw, int dh, int border );
266
267 /*
268 ====================================================================
269 Fill the surface with the wallpaper (clipped)
270 ====================================================================
271 */
272 void stk_surface_apply_wallpaper(
273 SDL_Surface *dest, int dx, int dy, int dw, int dh,
274 SDL_Surface *wallpaper, int alpha );
275
276 /*
277 ====================================================================
278 Apply a frame to the surface. The frame resource provides the eight
279 square-like parts for the frame composed as a little frame: corners
280 and sides.
281 'dw' == -1 and 'dh' == -1 have the same effect as in
282 stk_surface_blit().
283 Returns the size of the border.
284 ====================================================================
285 */
286 int stk_surface_apply_frame(
287 SDL_Surface *dest, int dx, int dy, int dw, int dh,
288 SDL_Surface *frame );
289
290 /* FIXED FONT */
291
292 enum {
293 STK_FONT_ALIGN_LEFT = (1L << 1),
294 STK_FONT_ALIGN_RIGHT = (1L << 2),
295 STK_FONT_ALIGN_TOP = (1L << 3),
296 STK_FONT_ALIGN_BOTTOM = (1L << 4),
297 STK_FONT_ALIGN_CENTER_X = (1L << 5),
298 STK_FONT_ALIGN_CENTER_Y = (1L << 6)
299 };
300 typedef struct {
301 SDL_Surface *surface;
302 int align; /* text aligment */
303 int width; /* of a single character */
304 int height; /* of a single character */
305 } StkFont;
306
307 /*
308 ====================================================================
309 Load a fixed font which is simply a surface containing the ASCII
310 characters from 32 (blank) to 96 (whatever) where all characters
311 have the same width.
312 ====================================================================
313 */
314 StkFont* stk_font_load( int flags, char *format, ... );
315
316 /*
317 ====================================================================
318 Free a font if not NULL and reset pointer to NULL.
319 ====================================================================
320 */
321 void stk_font_free( StkFont **font );
322
323 /*
324 ====================================================================
325 Write string to surface. If 'alpha' is -1 the font is displayed
326 with the current alpha value else the new alpha is used and kept.
327 stk_display_store_drect() can be used to store the update rect
328 of the written string.
329 ====================================================================
330 */
331 void stk_font_write(
332 StkFont *font, SDL_Surface *dest, int dx, int dy,
333 int alpha, char *string );
334
335 /*
336 ====================================================================
337 Query the length of the string in pixels.
338 ====================================================================
339 */
340 #define stk_font_string_width( font, string ) \
341 (strlen(string) * font->width)
342
343 /* CURSOR */
344
345 /*
346 ====================================================================
347 Build an SDL cursor with the given hotspot. The resource mask
348 contains 'b' for black 'w' for white and ' ' for transparent.
349 There are two cursors provided:
350 extern SDL_Cursor *empty_cursor (all transparent)
351 extern SDL_Cursor *std_cursor (SDL standard cursor)
352 ====================================================================
353 */
354 SDL_Cursor* stk_cursor_create(
355 int width, int height, int hot_x, int hot_y, char *src );
356
357 /*
358 ====================================================================
359 Free a cursor if not NULL and reset pointer to NULL.
360 ====================================================================
361 */
362 void stk_cursor_free( SDL_Cursor **cursor );
363
364 /* TIMER */
365
366 /*
367 ====================================================================
368 Reset the timer.
369 ====================================================================
370 */
371 void stk_timer_reset( void );
372
373 /*
374 ====================================================================
375 Get the time since last call or reset.
376 ====================================================================
377 */
378 int stk_timer_get_time( void );
379
380 /* AUDIO */
381
382 /*
383 ====================================================================
384 Open mixer. If this fails an error message is
385 displayed (program doesn't abort) and all stk_audio and stk_sound
386 functions have no effect.
387 'frequency': 11025, 22050, 44100 ...
388 'format': MIX_DEFAULT_FORMAT is recommended
389 'channels': mono(1) or stereo(2)
390 'chunksize': mix buffer size (1024 Bytes recommended)
391 Passing 0 for an argument means to use the SDL default:
392 22050Hz in format AUDIO_S16LSB stereo with 1024 bytes chunksize
393 stk_audio_open() installs stk_audio_close() as exit function.
394 There are 8 channels available for mixing.
395 ====================================================================
396 */
397 int stk_audio_open(
398 int frequency, Uint16 format, int channels, int chunksize );
399
400 /*
401 ====================================================================
402 Close mixer if previously opened.
403 ====================================================================
404 */
405 void stk_audio_close( void );
406
407 /*
408 ====================================================================
409 If stk_sound_load() is called with a relative path this prefix
410 is added. Default is '.'; 'path' is copied.
411 ====================================================================
412 */
413 void stk_audio_set_path( char *path );
414
415 /*
416 ====================================================================
417 Enable/disable sound. If disabled stk_sound_play () has no effect.
418 ====================================================================
419 */
420 void stk_audio_enable_sound( int enable );
421
422 /*
423 ====================================================================
424 Set default volume of all sounds: 0 - 128
425 ====================================================================
426 */
427 void stk_audio_set_sound_volume( int volume );
428
429 /*
430 ====================================================================
431 Fade out a specific sound channel. If 'channel is -1 all
432 channels fade out. 'ms' is the time the fading shall take.
433 ====================================================================
434 */
435 void stk_audio_fade_out( int channel, int ms );
436
437 /* SOUND */
438
439 typedef struct {
440 #ifdef AUDIO_ENABLED
441 Mix_Chunk *chunk; /* SDL_Mixer's sound buffer */
442 #endif
443 int channel;
444 int volume;
445 } StkSound;
446
447 /*
448 ====================================================================
449 Load a sound from a path. If it's not an absolute directory
450 (starting with '/') the prefix passed in stk_sound_set_path()
451 is prepended. Loading sounds is non-fatal thus if a sound
452 cannot be found it is created but empty. In this case
453 a warning is displayed.
454 The volume is set to the default set by
455 stk_audio_set_sound_volume(). Sounds with an equal 'channel'
456 will share it so if a new sound is played the old one breaks up
457 thus channel should be used to group sounds.
458 If channel is -1 the first available channel is used
459 to play sound.
460 ====================================================================
461 */
462 StkSound *stk_sound_load( int channel, char *format, ... );
463
464 /*
465 ====================================================================
466 Free the memory of a sound if not NULL and reset the pointer
467 to NULL.
468 ====================================================================
469 */
470 void stk_sound_free( StkSound **sound );
471
472 /*
473 ====================================================================
474 Set channel/volume of sound.
475 ====================================================================
476 */
477 void stk_sound_set_volume( StkSound *sound, int volume );
478 void stk_sound_set_channel( StkSound *sound, int channel );
479
480 /*
481 ====================================================================
482 Play a sound.
483 ====================================================================
484 */
485 void stk_sound_play( StkSound *sound );
486 /*
487 ====================================================================
488 Play a sound at horizontal position x..
489 ====================================================================
490 */
491 void stk_sound_play_x( int x, StkSound *sound );
492
493 /*
494 ====================================================================
495 Fade out the channel of this sound.
496 ====================================================================
497 */
498 void stk_sound_fade_out( StkSound *sound, int ms );
499
500
501 #endif
00 %define name lbreakout2
1 %define version 2.2.2
1 %define version 2.4.1
22 %define release 1
33
44 Summary: A breakout-style arcade game for Linux
Binary diff not shown
Binary diff not shown
0 DEFS = @DEFS@ @network_flag@ @sdlnet_flag@ @inst_flag@
1
2 bin_PROGRAMS = lbreakout2server
3
4 lbreakout2server_SOURCES = \
5 server.c server_game.c
6
7 EXTRA_DIST = server.h server_game.h
8
9 lbreakout2server_LDADD = ../common/libcommon.a ../game/libgame.a @sdlnet_lib_flag@
10
11 SUBDIRS = levels
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 DEFS = @DEFS@ @network_flag@ @sdlnet_flag@ @inst_flag@
92
93 bin_PROGRAMS = lbreakout2server
94
95 lbreakout2server_SOURCES = server.c server_game.c
96
97
98 EXTRA_DIST = server.h server_game.h
99
100 lbreakout2server_LDADD = ../common/libcommon.a ../game/libgame.a @sdlnet_lib_flag@
101
102 SUBDIRS = levels
103 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
104 CONFIG_HEADER = ../config.h
105 CONFIG_CLEAN_FILES =
106 bin_PROGRAMS = lbreakout2server$(EXEEXT)
107 PROGRAMS = $(bin_PROGRAMS)
108
109 CPPFLAGS = @CPPFLAGS@
110 LDFLAGS = @LDFLAGS@
111 LIBS = @LIBS@
112 lbreakout2server_OBJECTS = server.o server_game.o
113 lbreakout2server_DEPENDENCIES = ../common/libcommon.a ../game/libgame.a
114 lbreakout2server_LDFLAGS =
115 CFLAGS = @CFLAGS@
116 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
117 CCLD = $(CC)
118 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
119 DIST_COMMON = Makefile.am Makefile.in
120
121
122 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
123
124 TAR = tar
125 GZIP_ENV = --best
126 SOURCES = $(lbreakout2server_SOURCES)
127 OBJECTS = $(lbreakout2server_OBJECTS)
128
129 all: all-redirect
130 .SUFFIXES:
131 .SUFFIXES: .S .c .o .s
132 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
133 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps server/Makefile
134
135 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
136 cd $(top_builddir) \
137 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
138
139
140 mostlyclean-binPROGRAMS:
141
142 clean-binPROGRAMS:
143 -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
144
145 distclean-binPROGRAMS:
146
147 maintainer-clean-binPROGRAMS:
148
149 install-binPROGRAMS: $(bin_PROGRAMS)
150 @$(NORMAL_INSTALL)
151 $(mkinstalldirs) $(DESTDIR)$(bindir)
152 @list='$(bin_PROGRAMS)'; for p in $$list; do \
153 if test -f $$p; then \
154 echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
155 $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
156 else :; fi; \
157 done
158
159 uninstall-binPROGRAMS:
160 @$(NORMAL_UNINSTALL)
161 list='$(bin_PROGRAMS)'; for p in $$list; do \
162 rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
163 done
164
165 .c.o:
166 $(COMPILE) -c $<
167
168 .s.o:
169 $(COMPILE) -c $<
170
171 .S.o:
172 $(COMPILE) -c $<
173
174 mostlyclean-compile:
175 -rm -f *.o core *.core
176
177 clean-compile:
178
179 distclean-compile:
180 -rm -f *.tab.c
181
182 maintainer-clean-compile:
183
184 lbreakout2server$(EXEEXT): $(lbreakout2server_OBJECTS) $(lbreakout2server_DEPENDENCIES)
185 @rm -f lbreakout2server$(EXEEXT)
186 $(LINK) $(lbreakout2server_LDFLAGS) $(lbreakout2server_OBJECTS) $(lbreakout2server_LDADD) $(LIBS)
187
188 # This directory's subdirectories are mostly independent; you can cd
189 # into them and run `make' without going through this Makefile.
190 # To change the values of `make' variables: instead of editing Makefiles,
191 # (1) if the variable is set in `config.status', edit `config.status'
192 # (which will cause the Makefiles to be regenerated when you run `make');
193 # (2) otherwise, pass the desired values on the `make' command line.
194
195 @SET_MAKE@
196
197 all-recursive install-data-recursive install-exec-recursive \
198 installdirs-recursive install-recursive uninstall-recursive \
199 check-recursive installcheck-recursive info-recursive dvi-recursive:
200 @set fnord $(MAKEFLAGS); amf=$$2; \
201 dot_seen=no; \
202 target=`echo $@ | sed s/-recursive//`; \
203 list='$(SUBDIRS)'; for subdir in $$list; do \
204 echo "Making $$target in $$subdir"; \
205 if test "$$subdir" = "."; then \
206 dot_seen=yes; \
207 local_target="$$target-am"; \
208 else \
209 local_target="$$target"; \
210 fi; \
211 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
212 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
213 done; \
214 if test "$$dot_seen" = "no"; then \
215 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
216 fi; test -z "$$fail"
217
218 mostlyclean-recursive clean-recursive distclean-recursive \
219 maintainer-clean-recursive:
220 @set fnord $(MAKEFLAGS); amf=$$2; \
221 dot_seen=no; \
222 rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
223 rev="$$subdir $$rev"; \
224 test "$$subdir" = "." && dot_seen=yes; \
225 done; \
226 test "$$dot_seen" = "no" && rev=". $$rev"; \
227 target=`echo $@ | sed s/-recursive//`; \
228 for subdir in $$rev; do \
229 echo "Making $$target in $$subdir"; \
230 if test "$$subdir" = "."; then \
231 local_target="$$target-am"; \
232 else \
233 local_target="$$target"; \
234 fi; \
235 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
236 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
237 done && test -z "$$fail"
238 tags-recursive:
239 list='$(SUBDIRS)'; for subdir in $$list; do \
240 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
241 done
242
243 tags: TAGS
244
245 ID: $(HEADERS) $(SOURCES) $(LISP)
246 list='$(SOURCES) $(HEADERS)'; \
247 unique=`for i in $$list; do echo $$i; done | \
248 awk ' { files[$$0] = 1; } \
249 END { for (i in files) print i; }'`; \
250 here=`pwd` && cd $(srcdir) \
251 && mkid -f$$here/ID $$unique $(LISP)
252
253 TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
254 tags=; \
255 here=`pwd`; \
256 list='$(SUBDIRS)'; for subdir in $$list; do \
257 if test "$$subdir" = .; then :; else \
258 test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
259 fi; \
260 done; \
261 list='$(SOURCES) $(HEADERS)'; \
262 unique=`for i in $$list; do echo $$i; done | \
263 awk ' { files[$$0] = 1; } \
264 END { for (i in files) print i; }'`; \
265 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
266 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
267
268 mostlyclean-tags:
269
270 clean-tags:
271
272 distclean-tags:
273 -rm -f TAGS ID
274
275 maintainer-clean-tags:
276
277 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
278
279 subdir = server
280
281 distdir: $(DISTFILES)
282 @for file in $(DISTFILES); do \
283 d=$(srcdir); \
284 if test -d $$d/$$file; then \
285 cp -pr $$d/$$file $(distdir)/$$file; \
286 else \
287 test -f $(distdir)/$$file \
288 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
289 || cp -p $$d/$$file $(distdir)/$$file || :; \
290 fi; \
291 done
292 for subdir in $(SUBDIRS); do \
293 if test "$$subdir" = .; then :; else \
294 test -d $(distdir)/$$subdir \
295 || mkdir $(distdir)/$$subdir \
296 || exit 1; \
297 chmod 777 $(distdir)/$$subdir; \
298 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
299 || exit 1; \
300 fi; \
301 done
302 main.o: main.c ../config.h ../common/net.h ../common/messages.h \
303 ../common/list.h ../common/tools.h ../common/parser.h server.h
304 net.o: net.c net.h
305 server.o: server.c server.h ../config.h ../common/tools.h \
306 ../common/net.h ../common/messages.h ../common/list.h \
307 ../common/parser.h ../game/game.h ../game/../client/lbreakout.h \
308 ../game/../client/../gui/stk.h \
309 ../game/../client/../common/tools.h \
310 ../game/../client/../common/list.h \
311 ../game/../client/../common/net.h \
312 ../game/../client/../common/messages.h \
313 ../game/../client/../game/gamedefs.h ../game/../client/misc.h \
314 ../game/mathfuncs.h ../game/levels.h ../game/extras.h \
315 ../game/balls.h ../game/shots.h ../game/bricks.h \
316 ../game/paddle.h ../game/comm.h server_game.h
317 server_game.o: server_game.c server.h ../config.h ../common/tools.h \
318 ../common/net.h ../common/messages.h ../common/list.h \
319 ../common/parser.h ../game/game.h ../game/../client/lbreakout.h \
320 ../game/../client/../gui/stk.h \
321 ../game/../client/../common/tools.h \
322 ../game/../client/../common/list.h \
323 ../game/../client/../common/net.h \
324 ../game/../client/../common/messages.h \
325 ../game/../client/../game/gamedefs.h ../game/../client/misc.h \
326 ../game/mathfuncs.h ../game/levels.h ../game/extras.h \
327 ../game/balls.h ../game/shots.h ../game/bricks.h \
328 ../game/paddle.h ../game/comm.h
329
330 info-am:
331 info: info-recursive
332 dvi-am:
333 dvi: dvi-recursive
334 check-am: all-am
335 check: check-recursive
336 installcheck-am:
337 installcheck: installcheck-recursive
338 install-exec-am: install-binPROGRAMS
339 install-exec: install-exec-recursive
340
341 install-data-am:
342 install-data: install-data-recursive
343
344 install-am: all-am
345 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
346 install: install-recursive
347 uninstall-am: uninstall-binPROGRAMS
348 uninstall: uninstall-recursive
349 all-am: Makefile $(PROGRAMS)
350 all-redirect: all-recursive
351 install-strip:
352 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
353 installdirs: installdirs-recursive
354 installdirs-am:
355 $(mkinstalldirs) $(DESTDIR)$(bindir)
356
357
358 mostlyclean-generic:
359
360 clean-generic:
361
362 distclean-generic:
363 -rm -f Makefile $(CONFIG_CLEAN_FILES)
364 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
365
366 maintainer-clean-generic:
367 mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
368 mostlyclean-tags mostlyclean-generic
369
370 mostlyclean: mostlyclean-recursive
371
372 clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \
373 mostlyclean-am
374
375 clean: clean-recursive
376
377 distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \
378 distclean-generic clean-am
379
380 distclean: distclean-recursive
381
382 maintainer-clean-am: maintainer-clean-binPROGRAMS \
383 maintainer-clean-compile maintainer-clean-tags \
384 maintainer-clean-generic distclean-am
385 @echo "This command is intended for maintainers to use;"
386 @echo "it deletes files that may require special tools to rebuild."
387
388 maintainer-clean: maintainer-clean-recursive
389
390 .PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
391 maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
392 mostlyclean-compile distclean-compile clean-compile \
393 maintainer-clean-compile install-data-recursive \
394 uninstall-data-recursive install-exec-recursive \
395 uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
396 all-recursive check-recursive installcheck-recursive info-recursive \
397 dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
398 maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
399 distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
400 dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
401 install-exec install-data-am install-data install-am install \
402 uninstall-am uninstall all-redirect all-am all installdirs-am \
403 installdirs mostlyclean-generic distclean-generic clean-generic \
404 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
405
406
407 # Tell versions [3.59,3.63) of GNU make to not export all variables.
408 # Otherwise a system limit (for SysV at least) may be exceeded.
409 .NOEXPORT:
0 EXTRA_DIST = N_Arenas N_Snapshots
1
2 install-data-local:
3 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
4 @for file in $(EXTRA_DIST); do \
5 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/levels/$$file; \
6 done
7
8 win32-install-script:
9 @for file in $(EXTRA_DIST); do \
10 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\levels\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
11 done
12
0 # Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 host_alias = @host_alias@
60 host_triplet = @host@
61 AWK = @AWK@
62 CC = @CC@
63 EXEEXT = @EXEEXT@
64 ISCC = @ISCC@
65 MAKEINFO = @MAKEINFO@
66 PACKAGE = @PACKAGE@
67 RANLIB = @RANLIB@
68 SDL_CFLAGS = @SDL_CFLAGS@
69 SDL_CONFIG = @SDL_CONFIG@
70 SDL_LIBS = @SDL_LIBS@
71 STRIP = @STRIP@
72 VERSION = @VERSION@
73 ZIP = @ZIP@
74 appname = @appname@
75 arch_flag = @arch_flag@
76 audio_flag = @audio_flag@
77 doc_dir = @doc_dir@
78 hi_dir = @hi_dir@
79 hi_inst_flag = @hi_inst_flag@
80 inst_dir = @inst_dir@
81 inst_flag = @inst_flag@
82 mixer_flag = @mixer_flag@
83 netdebug_flag = @netdebug_flag@
84 network_flag = @network_flag@
85 sdlnet_flag = @sdlnet_flag@
86 sdlnet_lib_flag = @sdlnet_lib_flag@
87 warp_flag = @warp_flag@
88 win32_deps = @win32_deps@
89 win32_inst_script = @win32_inst_script@
90
91 EXTRA_DIST = N_Arenas N_Snapshots
92 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
93 CONFIG_HEADER = ../../config.h
94 CONFIG_CLEAN_FILES =
95 DIST_COMMON = Makefile.am Makefile.in
96
97
98 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
99
100 TAR = tar
101 GZIP_ENV = --best
102 all: all-redirect
103 .SUFFIXES:
104 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
105 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps server/levels/Makefile
106
107 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
108 cd $(top_builddir) \
109 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
110
111 tags: TAGS
112 TAGS:
113
114
115 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
116
117 subdir = server/levels
118
119 distdir: $(DISTFILES)
120 @for file in $(DISTFILES); do \
121 d=$(srcdir); \
122 if test -d $$d/$$file; then \
123 cp -pr $$d/$$file $(distdir)/$$file; \
124 else \
125 test -f $(distdir)/$$file \
126 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
127 || cp -p $$d/$$file $(distdir)/$$file || :; \
128 fi; \
129 done
130 info-am:
131 info: info-am
132 dvi-am:
133 dvi: dvi-am
134 check-am: all-am
135 check: check-am
136 installcheck-am:
137 installcheck: installcheck-am
138 install-exec-am:
139 install-exec: install-exec-am
140
141 install-data-am: install-data-local
142 install-data: install-data-am
143
144 install-am: all-am
145 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
146 install: install-am
147 uninstall-am:
148 uninstall: uninstall-am
149 all-am: Makefile
150 all-redirect: all-am
151 install-strip:
152 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
153 installdirs:
154
155
156 mostlyclean-generic:
157
158 clean-generic:
159
160 distclean-generic:
161 -rm -f Makefile $(CONFIG_CLEAN_FILES)
162 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
163
164 maintainer-clean-generic:
165 mostlyclean-am: mostlyclean-generic
166
167 mostlyclean: mostlyclean-am
168
169 clean-am: clean-generic mostlyclean-am
170
171 clean: clean-am
172
173 distclean-am: distclean-generic clean-am
174
175 distclean: distclean-am
176
177 maintainer-clean-am: maintainer-clean-generic distclean-am
178 @echo "This command is intended for maintainers to use;"
179 @echo "it deletes files that may require special tools to rebuild."
180
181 maintainer-clean: maintainer-clean-am
182
183 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
184 installcheck-am installcheck install-exec-am install-exec \
185 install-data-local install-data-am install-data install-am install \
186 uninstall-am uninstall all-redirect all-am all installdirs \
187 mostlyclean-generic distclean-generic clean-generic \
188 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
189
190
191 install-data-local:
192 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
193 @for file in $(EXTRA_DIST); do \
194 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/levels/$$file; \
195 done
196
197 win32-install-script:
198 @for file in $(EXTRA_DIST); do \
199 echo "Source: \"`pwd -W`\\$$file\"; DestDir: \"{app}\\levels\"; CopyMode: alwaysoverwrite" >> @win32_inst_script@; \
200 done
201
202 # Tell versions [3.59,3.63) of GNU make to not export all variables.
203 # Otherwise a system limit (for SysV at least) may be exceeded.
204 .NOEXPORT:
0 Version: 1.00
1 Level:
2 Michael Speck
3 Duell-1
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ..............
9 ..............
10 ..............
11 ..............
12 ..............
13 ..............
14 ..............
15 ..............
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ..............
28 ..............
29 ..............
30 ..............
31 ..............
32 ..............
33 ..............
34 ..............
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Duell-2
45 Bricks:
46 ..............
47 ..............
48 ..............
49 ..............
50 ..#..#..#..#..
51 ..#..#..#..#..
52 ..#..#..#..#..
53 ..@..@..@..@..
54 ..@..@..@..@..
55 ..@..@..@..@..
56 ..@..@..@..@..
57 ..#..#..#..#..
58 ..#..#..#..#..
59 ..#..#..#..#..
60 ..............
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ..............
71 ..............
72 ..............
73 ..............
74 ..............
75 ..............
76 ..............
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Duell-1
86 Bricks:
87 ..............
88 ..............
89 ..............
90 ..............
91 ..............
92 ..............
93 ..............
94 ..............
95 ..............
96 ..............
97 ..............
98 ..............
99 ..............
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 ..............
112 ..............
113 ..............
114 ..............
115 ..............
116 ..............
117 ..............
118 ..............
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Michael Speck
126 Duell-3
127 Bricks:
128 ..............
129 ..............
130 ..............
131 ..............
132 ..............
133 ..#..#..#..#..
134 ..............
135 #...@....@...#
136 ..............
137 ..............
138 #...@....@...#
139 ..............
140 ..#..#..#..#..
141 ..............
142 ..............
143 ..............
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 ..............
150 ..............
151 ..............
152 ..............
153 ..............
154 ..............
155 ..............
156 ..............
157 ..............
158 ..............
159 ..............
160 ..............
161 ..............
162 ..............
163 ..............
164 ..............
165 Level:
166 Michael Speck
167 Duell-1
168 Bricks:
169 ..............
170 ..............
171 ..............
172 ..............
173 ..............
174 ..............
175 ..............
176 ..............
177 ..............
178 ..............
179 ..............
180 ..............
181 ..............
182 ..............
183 ..............
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..............
191 ..............
192 ..............
193 ..............
194 ..............
195 ..............
196 ..............
197 ..............
198 ..............
199 ..............
200 ..............
201 ..............
202 ..............
203 ..............
204 ..............
205 ..............
206 Level:
207 Michael Speck
208 Duell-4
209 Bricks:
210 ..............
211 ..............
212 .#...#..#...#.
213 ..............
214 @............@
215 @............@
216 @............@
217 @............@
218 @............@
219 @............@
220 @............@
221 @............@
222 @............@
223 @............@
224 ..............
225 .#...#..#...#.
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 ..............
232 ..............
233 ..............
234 ..............
235 ..............
236 ..............
237 ..............
238 ..............
239 ..............
240 ..............
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 ..............
0 Version: 1.00
1 Level:
2 Michael Speck
3 Chinese
4 Bricks:
5 ..............
6 ..............
7 ..............
8 ffffffffffffff
9 ffffffffffffff
10 gggggggggggggg
11 gggggggggggggg
12 jbbbbbbbbbbbbj
13 jbjjjjjjjjjjbj
14 jbjjjjjjjjjjbj
15 jbbbbbbbbbbbbj
16 dddddddddddddd
17 dddddddddddddd
18 eeeeeeeeeeeeee
19 eeeeeeeeeeeeee
20 ..............
21 ..............
22 ..............
23 Bonus:
24 ..............
25 ..............
26 ..............
27 ?......-.....?
28 ....+.....>...
29 ..p.....b.....
30 .....~.....+..
31 ...s....j.b.w.
32 .*1323232323..
33 ..3232323231*.
34 .w...j....s...
35 .......~...+..
36 ....b.....p...
37 ..b...+.>.....
38 ?...-........?
39 ..............
40 ..............
41 ..............
42 Level:
43 Michael Speck
44 Spearhead
45 Bricks:
46 ..............
47 ..............
48 ..............
49 jjjj..........
50 kkkkkk........
51 aaaaaaaa......
52 kkkkkkkkkk....
53 jjjjjjjjjjjj..
54 #####....zzzzz
55 #####....zzzzz
56 kkkkkkkkkkkk..
57 jjjjjjjjjj....
58 aaaaaaaa......
59 jjjjjj........
60 kkkk..........
61 ..............
62 ..............
63 ..............
64 Bonus:
65 ..............
66 ..............
67 ..............
68 .2.-..........
69 .+............
70 2.w2b..+......
71 .-....2..~....
72 .p.*.}..s..c..
73 .........44444
74 .........44444
75 p..*...}s.~...
76 .2...2-..+....
77 ..b2w..d......
78 .-.+..........
79 2.............
80 ..............
81 ..............
82 ..............
83 Level:
84 Michael Speck
85 Fortress
86 Bricks:
87 ..............
88 ..............
89 ..............
90 ..............
91 ..............
92 ..E##zzzz##E..
93 .kE@..gg..@Ek.
94 kkE.iiiiii.Ekk
95 kkEgiggggigEkk
96 kkEgiggggigEkk
97 kkE.iiiiii.Ekk
98 .kE@..gg..@Ek.
99 ..E##zzzz##E..
100 ..............
101 ..............
102 ..............
103 ..............
104 ..............
105 Bonus:
106 ..............
107 ..............
108 ..............
109 ..............
110 ..............
111 .....f>.f.....
112 .p..........p.
113 ?...3....3...+
114 .b...34.3.....
115 .....3.43...b.
116 +...3....3...?
117 .p..........p.
118 .....f.>f.....
119 ..............
120 ..............
121 ..............
122 ..............
123 ..............
124 Level:
125 Michael Speck
126 Soccer Worldcup
127 Bricks:
128 ..............
129 ..............
130 ffffffffffffff
131 ffffffffffffff
132 ffffffffffffff
133 jjjffffffffjjj
134 ffjffffffffjff
135 ffjfffjjfffjff
136 jfjffjffjffjfj
137 jfjffjffjffjfj
138 ffjfffjjfffjff
139 ffjffffffffjff
140 jjjffffffffjjj
141 ffffffffffffff
142 ffffffffffffff
143 ffffffffffffff
144 ..............
145 ..............
146 Bonus:
147 ..............
148 ..............
149 >...+.bb.+...>
150 ..b..-..-..b..
151 ..............
152 11>........>11
153 .f1..b..b..1..
154 ..1...33...1..
155 ?.1..3553..1.?
156 ?.1..3553..1.?
157 ..1...33...1..
158 ..1..b..b..1f.
159 11>........>11
160 ..............
161 ..b..-..-..b..
162 >...+.bb.+...>
163 ..............
164 ..............
165 Level:
166 Michael Speck
167 Construction Time
168 Bricks:
169 ..............
170 ..............
171 ..............
172 ..!..!kk!..!..
173 .....*kk*.....
174 .gggggggggggg.
175 .ffhhhhhhhhff.
176 .*fh*dddd*hf*.
177 .@!h@!ee!@h!@.
178 .@!h@!ee!@h!@.
179 .*fh*dddd*hf*.
180 .ffhhhhhhhhff.
181 .gggggggggggg.
182 .....*kk*.....
183 ..!..!kk!..!..
184 ..............
185 ..............
186 ..............
187 Bonus:
188 ..............
189 ..............
190 ..b..c..+..0+.
191 .0.0...3.3....
192 ..s........0..
193 ..............
194 ..............
195 .....4..4.>...
196 ..w..b.m...p..
197 ..p...g.b..w..
198 .....4..4.....
199 ..............
200 ..............
201 ..0>.......s..
202 ....3.3...0.0.
203 .+0..+..b..c..
204 ..............
205 ..............
206 Level:
207 Michael Speck
208 Four Seasons
209 Bricks:
210 ..............
211 ..............
212 hhhh......eeee
213 hhhh......eeee
214 hhhh......eeee
215 hhhh......eeee
216 hhhh......eeee
217 hhhh......eeee
218 ..............
219 ..............
220 ffff......jjjj
221 ffff......jjjj
222 ffff......jjjj
223 ffff......jjjj
224 ffff......jjjj
225 ffff......jjjj
226 ..............
227 ..............
228 Bonus:
229 ..............
230 ..............
231 +..b.......2.4
232 3.s.......4{..
233 .3.2......f.*.
234 ?.-........b.?
235 ...}......c.3.
236 .p........2pjb
237 ..............
238 ..............
239 bjp2........p.
240 .3.d......}...
241 ?.b........-.?
242 .*.f......2.3.
243 ..{4.......s.3
244 4.2.......b..+
245 ..............
246 ..............
247 Level:
248 Michael Speck
249 Hidden Obstacles
250 Bricks:
251 ..............
252 ..............
253 ..............
254 ..............
255 .v#eeeeeeee#v.
256 ..e#......#e..
257 ..eg#vvvv#ge..
258 ..egf....fge..
259 ..egf.dd.fge..
260 ..egf.dd.fge..
261 ..egf....fge..
262 ..eg#vvvv#ge..
263 ..e#......#e..
264 .v#eeeeeeee#v.
265 ..............
266 ..............
267 ..............
268 ..............
269 Bonus:
270 ..............
271 ..............
272 ..............
273 ..............
274 ...00000000...
275 ..............
276 .....4444.....
277 ..+?......?b..
278 ...?b.pp.-?...
279 ...?-.pp.b?...
280 ..b?......?+..
281 .....4444.....
282 ..............
283 ...00000000...
284 ..............
285 ..............
286 ..............
287 ..............
288 Level:
289 Michael Speck
290 Oh, Deer!
291 Bricks:
292 ..............
293 ..............
294 .d..e....e..d.
295 .e..d....d..e.
296 .#..#....#..#.
297 .a..i....i..a.
298 .g..a....a..g.
299 .a..i....i..a.
300 .g..a....a..g.
301 .a..i....i..a.
302 .g..a....a..g.
303 .a..i....i..a.
304 .g..a....a..g.
305 .#..#....#..#.
306 .h..d....d..h.
307 .d..h....h..d.
308 ..............
309 ..............
310 Bonus:
311 ..............
312 ..............
313 .p..p....p..p.
314 .p..p....p..p.
315 ..............
316 ....5....5....
317 .4..........4.
318 ....5....5....
319 .4..b....b..j.
320 ....5....5....
321 .j..b....b..4.
322 ....5....5....
323 .4..........4.
324 ..............
325 .p..p....p..p.
326 .p..p....p..p.
327 ..............
328 ..............
329 Level:
330 Michael Speck
331 Pipes
332 Bricks:
333 ..............
334 ..............
335 .j..!..!..###.
336 .j..#dd#..#gg.
337 .jj.#dd#..#g..
338 .jj.####......
339 .##...........
340 .f#*.###.*.##.
341 .f#!.!.!.!.#e.
342 .f#.!.!.!.!#e.
343 .##.*.###.*#e.
344 ...........##.
345 ......####.jj.
346 ..g#..#hh#.jj.
347 .gg#..#hh#..j.
348 .###..!..!..j.
349 ..............
350 ..............
351 Bonus:
352 ..............
353 ..............
354 .f............
355 .3....b....*>.
356 ..f..+.....d..
357 ..3...........
358 ..............
359 .3............
360 .5..?2?2?2?.3.
361 .3.?2?2?2?..5.
362 ............3.
363 ..............
364 ...........3..
365 ..c.....+..f..
366 .>*....b....3.
367 ............f.
368 ..............
369 ..............
370 Level:
371 Michael Speck
372 Collect Your Reward!
373 Bricks:
374 ..............
375 ..............
376 .x..........x.
377 ..............
378 ...z.z..z.z...
379 ..............
380 .x..........x.
381 ...z.z..z.z...
382 ..............
383 ..............
384 ...z.z..z.z...
385 .x..........x.
386 ..............
387 ...z.z..z.z...
388 ..............
389 .x..........x.
390 ..............
391 ..............
392 Bonus:
393 ..............
394 ..............
395 .b..........b.
396 ..............
397 ...5.5..5.5...
398 ..............
399 .b..........b.
400 ...5.5..5.5...
401 ..............
402 ..............
403 ...5.5..5.5...
404 .b..........b.
405 ..............
406 ...5.5..5.5...
407 ..............
408 .b..........b.
409 ..............
410 ..............
0 /***************************************************************************
1 server.c - description
2 -------------------
3 begin : 03/03/11
4 copyright : (C) 2003 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /***** INCLUDES ************************************************************/
18
19 #include <dirent.h>
20 #include "server.h"
21 #include "server_game.h"
22
23 /***** EXTERNAL VARIABLES **************************************************/
24
25 extern int net_buffer_cur_size, msg_read_pos;
26
27 /***** FORWARDED DECLARATIONS **********************************************/
28
29 #ifdef NETWORK_ENABLED
30 static void signal_handler( int signal );
31 static void broadcast_all( int len, char *data );
32 #endif
33
34 /***** LOCAL TYPE DEFINITIONS **********************************************/
35
36 enum { CHANNEL_MAIN_ID = 1 };
37
38 /***** LOCAL VARIABLES *****************************************************/
39
40 int server_port = 8000; /* server is listening at this port */
41 List *channels = 0; /* chat channels */
42 List *games = 0; /* running games */
43 List *levelsets = 0; /* loaded levelsets */
44 int global_id = 1; /* global id counter increased each type an object
45 (user,channel,game) is added (id:1 is channel MAIN) */
46 int server_halt = 0; /* when set, server will go down after some seconds */
47 int server_halt_since = 0; /* global time (in secs) passed since halt command */
48 char errbuf[128]; /* used to compile error messages */
49 char msgbuf[MAX_MSG_SIZE]; /* used to compile messages */
50 int msglen = 0;
51 int user_limit = 50; /* maximum number of users that may be logged in (0: unlimited)*/
52 int user_count = 0; /* number of logged in users */
53 char greetings[256] = "Welcome to LBreakout2 online!"; /* welcome message send to user on login */
54 char admin_pwd[20] = ""; /* admin password (if any) */
55 char datadir[128] = SRC_DIR; /* levels are loaded from here */
56 int server_fps = 20; /* communication frame rate */
57 int server_frame_delay = 50; /* delay between server frames */
58 int server_recv_limit = -1; /* number of packets parsed in one go (-1 == unlimited) */
59 int server_def_bot_num = 0; /* number of 800's and 1000's bots to be
60 created on startup */
61
62 /* these default channels are known by the client and the only
63 * ones shown in the list. there id starts at 1 for MAIN increased
64 * by 1 with each step */
65 ServerChannel *main_channel = 0; /* pointer to MAIN */
66 int default_channel_count = 1;
67 char *default_channels[] = {
68 "MAIN"
69 };
70
71 /***** LOCAL FUNCTIONS *****************************************************/
72
73 #ifdef NETWORK_ENABLED
74
75 static void server_init_halt()
76 {
77 printf( "server is going down...\n" );
78 server_halt_since = time(0);
79 server_halt = 1;
80 errbuf[0] = MSG_ERROR;
81 sprintf( errbuf+1, "SERVER IS GOING DOWN!!!" );
82 broadcast_all( 2+strlen(errbuf+1), errbuf );
83 }
84
85 void send_info( ServerUser *user, int type, char *format, ... )
86 {
87 va_list args;
88
89 if ( user->no_comm ) return;
90
91 va_start( args, format );
92 vsnprintf( msgbuf+1, MAX_MSG_SIZE-1, format, args );
93 va_end( args );
94 msgbuf[0] = type;
95
96 socket_transmit( &user->socket, CODE_BLUE, 2+strlen(msgbuf+1), msgbuf );
97 }
98
99 /* channel_add/delete don't require client updates as the only
100 * channels that are shown in the list are already known by name
101 * and id by the client. additional channels can be entered by typing
102 * in the name. A pointer is returned to simplify transfer of users.
103 */
104 static ServerChannel* channel_add( char *name )
105 {
106 ServerChannel *channel = salloc( 1, sizeof( ServerChannel ) );
107
108 strncpy(channel->name,name,20);
109 channel->id = global_id++;
110 channel->users = list_create( LIST_AUTO_DELETE, LIST_NO_CALLBACK );
111
112 printf( "channel added: %s\n", channel->name );
113 list_add( channels, channel );
114
115 return channel;
116 }
117 static void channel_delete( void *ptr )
118 {
119 ServerChannel *channel = (ServerChannel*)ptr;
120 if ( channel ) {
121 printf( "channel deleted: %s (%i users)\n", channel->name, channel->users->count );
122 if ( channel->users )
123 list_delete( channel->users );
124 free( channel );
125 }
126 }
127
128 ServerChannel *channel_find_by_name( char *name )
129 {
130 ServerChannel *channel = 0;
131 list_reset( channels );
132 while ( ( channel = list_next( channels ) ) )
133 if ( !strcmp( channel->name, name ) )
134 return channel;
135 return 0;
136 }
137
138 static void channel_add_user( ServerChannel *channel, ServerUser *user );
139 static void channel_add_bot( ServerChannel *channel, char *name, int level )
140 {
141 NetAddr addr;
142 ServerUser *user = salloc( 1, sizeof( ServerUser) );
143
144 /* add a bot user to channel which can be challenged
145 * but does nothing else */
146 strncpy(user->name,name,16);
147 user->id = global_id++;
148 user->no_comm = 1;
149 user->bot = 1;
150 user->bot_level = level; /* playing level */
151 net_build_addr( &addr, "localhost", 8000 );
152 socket_init( &user->socket, &addr );
153 channel_add_user( channel, user );
154 }
155
156 static void create_default_channels()
157 {
158 int i = 0;
159
160 for ( i = 0; i < default_channel_count; i++ )
161 channel_add( default_channels[i] );
162 main_channel = (ServerChannel*)list_first( channels );
163 }
164
165 static int is_default_channel( ServerChannel *channel )
166 {
167 int i = 0;
168
169 for ( i = 0; i < default_channel_count; i++ )
170 if ( !strcmp( default_channels[i], channel->name ) ) return 1;
171 return 0;
172 }
173
174 static void channel_broadcast( ServerChannel *channel, int len, char *data )
175 {
176 int urgent = 0;
177 ServerUser *user;
178
179 /* urgent messages are always sent even to hidden users */
180 if ( data[0] == MSG_ERROR ||
181 data[0] == MSG_ADD_USER || data[0] == MSG_REMOVE_USER ||
182 data[0] == MSG_SET_COMM_DELAY )
183 urgent = 1;
184
185 /* deliver it */
186 list_reset( channel->users );
187 while ( ( user = list_next( channel->users ) ) )
188 if ( !user->no_comm )
189 if ( urgent || !user->hidden )
190 socket_transmit( &user->socket, CODE_BLUE, len, data );
191 }
192
193 /* broadcast message to all users in all channels even the hidden ones */
194 static void broadcast_all( int len, char *data )
195 {
196 ServerChannel *channel;
197
198 list_reset( channels );
199 while ( ( channel = list_next( channels ) ) )
200 channel_broadcast( channel, len, data );
201 }
202
203 static void channel_add_user( ServerChannel *channel, ServerUser *user )
204 {
205 if ( channel == 0 ) return;
206 if ( user == 0 ) return;
207
208 list_add( channel->users, user );
209 printf( "user added: %s (%i) from %s\n",
210 user->name, user->id, net_addr_to_string( &user->socket.remote_addr ) );
211
212 /* inform all users in channel (including this one if not hidden) */
213 msg_begin_writing( msgbuf, &msglen, 128 );
214 msg_write_int8( MSG_ADD_USER );
215 msg_write_int32( user->id );
216 msg_write_string( user->name );
217 channel_broadcast( channel, msglen, msgbuf );
218
219 /* don't count dummies */
220 if ( !user->bot ) user_count++;
221 }
222
223 void channel_remove_user( ServerChannel *channel, ServerUser *user )
224 {
225 if ( channel == 0 ) return;
226 if ( user == 0 ) return;
227
228 user->hidden = 1; /* this user does not require the following update */
229
230 /* inform all users in channel */
231 msg_begin_writing( msgbuf, &msglen, 128 );
232 msg_write_int8( MSG_REMOVE_USER );
233 msg_write_int32( user->id );
234 channel_broadcast( channel, msglen, msgbuf );
235
236 /* don't count dummies */
237 if ( !user->bot ) user_count--;
238 /* remove */
239 printf( "user removed: %s (%i)\n", user->name, user->id );
240 list_delete_item( channel->users, user );
241
242 /* if empty channel and not default channel delete it */
243 if ( channel->users->count == 0 && !is_default_channel( channel ) )
244 list_delete_item( channels, channel );
245 }
246
247 void channel_hide_user( ServerChannel *channel, ServerUser *user, int hide )
248 {
249 if ( channel == 0 ) return;
250 if ( user == 0 ) return;
251 if ( user->hidden == hide ) return; /* nothing changes */
252
253
254 /* broadcast update to all users in channel */
255 if ( hide ) {
256 msg_begin_writing( msgbuf, &msglen, 128 );
257 msg_write_int8( MSG_REMOVE_USER );
258 msg_write_int32( user->id );
259 channel_broadcast( channel, msglen, msgbuf );
260 user->hidden = hide;
261 } else {
262 user->hidden = hide;
263 msg_begin_writing( msgbuf, &msglen, 128 );
264 msg_write_int8( MSG_ADD_USER );
265 msg_write_int32( user->id );
266 msg_write_string( user->name );
267 channel_broadcast( channel, msglen, msgbuf );
268 }
269 }
270
271 static void channel_kick_user( ServerChannel *channel, ServerUser *user, char *reason )
272 {
273 if ( channel == 0 ) return;
274 if ( user == 0 ) return;
275
276 snprintf( errbuf, 128, "You have been kicked! Reason: %s", reason );
277 send_info( user, MSG_ERROR, errbuf );
278
279 errbuf[0] = MSG_DISCONNECT;
280 socket_transmit( &user->socket, CODE_BLUE, 1, errbuf );
281
282 printf( "user kicked (%s): %s (%i)\n", reason, user->name, user->id );
283 channel_remove_user( channel, user );
284 }
285
286 /* transfer user to new channel and send nescessary updates */
287 void send_full_update( ServerUser *user, ServerChannel *channel );
288 void channel_transfer_user( ServerChannel *old, ServerChannel *new, ServerUser *user )
289 {
290 /* same channel? */
291 if ( old == new ) return;
292
293 /* mute user as he will receive a complete update
294 after the transfer */
295 user->hidden = 1;
296
297 /* transfer */
298 msg_begin_writing( msgbuf, &msglen, 128 );
299 msg_write_int8( MSG_REMOVE_USER );
300 msg_write_int32( user->id );
301 channel_broadcast( old, msglen, msgbuf );
302
303 list_transfer( old->users, new->users, user );
304
305 if ( old->users->count == 0 && !is_default_channel( old ) )
306 list_delete_item( channels, old );
307
308 msg_begin_writing( msgbuf, &msglen, 128 );
309 msg_write_int8( MSG_ADD_USER );
310 msg_write_int32( user->id );
311 channel_broadcast( new, msglen, msgbuf );
312
313 /* update */
314 user->hidden = 0;
315 msg_begin_writing( msgbuf, &msglen, 128 );
316 msg_write_int8( MSG_SERVER_INFO );
317 msg_printf( "you have entered a new channel: %s", new->name );
318 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
319 msg_begin_writing( msgbuf, &msglen, 128 );
320 msg_write_int8( MSG_SET_CHANNEL );
321 msg_write_string( new->name );
322 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
323
324 send_full_update( user, new );
325 }
326
327 /* Send a list of all users in user's channel including itself.
328 *
329 * FIXME: Sending each single entry is a not very nice.
330 */
331 void send_full_update( ServerUser *user, ServerChannel *channel )
332 {
333 ServerUser *u;
334
335 msgbuf[0] = MSG_PREPARE_FULL_UPDATE;
336 socket_transmit( &user->socket, CODE_BLUE, 1, msgbuf );
337
338 /* users */
339 list_reset( channel->users );
340 while ( ( u = list_next( channel->users ) ) ) {
341 msg_begin_writing( msgbuf, &msglen, 32 );
342 msg_write_int8( MSG_ADD_USER );
343 msg_write_int32( u->id );
344 msg_write_string( u->name );
345 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
346 }
347 }
348
349
350 /* ServerUser *find_user_by_name
351 * IN char *name
352 *
353 * Search all channels for a user by that name.
354 */
355 static ServerUser* find_user_by_name( char *name )
356 {
357 ServerUser *user;
358 ServerChannel *channel;
359
360 list_reset( channels );
361 while ( ( channel = list_next( channels ) ) ) {
362 list_reset( channel->users );
363 while ( ( user = list_next( channel->users ) ) )
364 if ( !strcmp( user->name, name ) )
365 return user;
366 }
367
368 return 0;
369 }
370
371 /* ServerUser *search_user
372 * IN char *name
373 *
374 * Search all channels for a user by that name and return
375 * the channel as well.
376 */
377 static ServerUser* search_user( char *name, ServerChannel **channel )
378 {
379 ServerUser *user;
380
381 list_reset( channels );
382 while ( ( *channel = list_next( channels ) ) ) {
383 list_reset( (*channel)->users );
384 while ( ( user = list_next( (*channel)->users ) ) )
385 if ( !strcmp( user->name, name ) )
386 return user;
387 }
388
389 return 0;
390 }
391
392 /* ServerUser *find_user_by_id
393 * IN int id
394 *
395 * Search all channels for a user by that id.
396 */
397 static ServerUser* find_user_by_id( int id )
398 {
399 ServerUser *user;
400 ServerChannel *channel;
401
402 list_reset( channels );
403 while ( ( channel = list_next( channels ) ) ) {
404 list_reset( channel->users );
405 while ( ( user = list_next( channel->users ) ) )
406 if ( user->id == id )
407 return user;
408 }
409
410 return 0;
411 }
412
413 /* ServerUser *find_user_by_addr
414 * IN NetAddr *addr
415 *
416 * Search wether a user already uses this net address.
417 */
418 static ServerUser* find_user_by_addr( NetAddr *addr )
419 {
420 ServerUser *user;
421 ServerChannel *channel;
422
423 list_reset( channels );
424 while ( ( channel = list_next( channels ) ) ) {
425 list_reset( channel->users );
426 while ( ( user = list_next( channel->users ) ) )
427 if ( net_compare_addr( addr, &user->socket.remote_addr ) )
428 return user;
429 }
430
431 return 0;
432 }
433
434 /* void handle_connectionless_packet
435 *
436 * By now only connection attempts can be found in this category.
437 * So check wether the packet contains a valid request (or send
438 * error messages if it doesn't) and add a new user to channel
439 * MAIN.
440 */
441 static void handle_connectionless_packet( void )
442 {
443 char name[20], pwd[20], buf[128];
444 int protocol;
445 ServerUser *user = 0;
446 int i;
447
448 msg_begin_connectionless_reading();
449
450 if ( msg_read_int8() != MSG_CONNECT ) return;
451
452 protocol = msg_read_int8();
453 strncpy(name,msg_read_string(),20); name[19] = 0;
454 strncpy(pwd,msg_read_string(),20); pwd[19] = 0;
455 if ( msg_read_failed() ) {
456 sprintf( errbuf+1, "Login data corrupted, please retry." );
457 goto failure;
458 }
459 if ( !is_alphanum(name) ) {
460 strcpy(errbuf+1,
461 "Your username may only contain letters, digits and underscores.\n" );
462 goto failure;
463 }
464
465 /* check wether this user already exists. if so the LOGIN_OKAY
466 * message was dropped. */
467 if ( (user = find_user_by_addr( &net_sender_addr )) )
468 if ( strcmp( user->name, name ) )
469 user = 0; /* somebody else though same box */
470
471 /* check data for validity */
472 if ( protocol != PROTOCOL ) {
473 if ( protocol < PROTOCOL )
474 sprintf( errbuf+1, "Your protocol is out of date, please update." );
475 else
476 sprintf( errbuf+1, "Server uses an older protocol (%i), sorry.",
477 PROTOCOL );
478 goto failure;
479 }
480 if ( user_count >= user_limit && user == 0/*else user exists already but wasn't informed*/ ) {
481 sprintf( errbuf+1, "Server is full!" );
482 goto failure;
483 }
484 if ( name[0] == 0 ) {
485 sprintf( errbuf+1, "Please enter a name!" );
486 goto failure;
487 }
488 if ( strchr( name, ' ' ) ) {
489 sprintf( errbuf+1, "Your name must not contain blanks! (But can have underscores.)" );
490 goto failure;
491 }
492 if ( (user==0 && find_user_by_name( name )) || !strcmp( name, "admin" ) ) {
493 sprintf( errbuf+1, "This name is already in use. Please choose another one." );
494 goto failure;
495 }
496 /* password is currently unused */
497
498 /* data successfully extracted and checked. if this is not a
499 * user whos LOGIN_OKAY was dropped, create a new one. */
500 if ( user == 0 ) {
501 user = salloc( 1, sizeof( ServerUser ) );
502 user->id = global_id++;
503 if ( admin_pwd[0] != 0 && !strcmp( admin_pwd, name ) ) {
504 strncpy(user->name,"admin",20);
505 user->admin = 1;
506 }
507 else
508 strncpy(user->name,name,20);
509 socket_init( &user->socket, &net_sender_addr );
510 user->hidden = 1; /* don't get the ADD_USER message */
511 channel_add_user( main_channel, user );
512 user->hidden = 0;
513 }
514
515 /* tell user that it is accepted */
516 msg_begin_writing( msgbuf, &msglen, 32 );
517 msg_write_int8( MSG_LOGIN_OKAY );
518 msg_write_int32( user->id );
519 msg_write_string( user->name );
520 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
521 msg_begin_writing( msgbuf, &msglen, 2+strlen(greetings) );
522 msg_write_int8( MSG_SERVER_INFO );
523 msg_write_string( greetings );
524 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
525 msg_begin_writing( msgbuf, &msglen, 128 );
526 msg_write_int8( MSG_SERVER_INFO );
527 if ( user_count == 1 )
528 strcpy ( buf , "1 user online" );
529 else
530 snprintf( buf, 128, "%i users online", user_count );
531 msg_write_string( buf );
532 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
533 msg_begin_writing( msgbuf, &msglen, 4 );
534 msg_write_int8( MSG_SET_COMM_DELAY );
535 msg_write_int16( server_frame_delay );
536 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
537
538 /* send default channels */
539 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
540 msg_write_int8( MSG_CHANNEL_LIST );
541 msg_write_int8( default_channel_count );
542 for ( i = 0; i < default_channel_count; i++ )
543 msg_write_string( default_channels[i] );
544 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
545
546 /* send levelset names */
547 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
548 msg_write_int8( MSG_LEVELSET_LIST );
549 msg_write_int8( levelsets->count );
550 list_reset( levelsets );
551 for ( i = 0; i < levelsets->count; i++ )
552 msg_write_string( list_next( levelsets ) );
553 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
554
555 send_full_update( user, main_channel );
556
557 return;
558
559 failure:
560 /* send error message as connectionless one as we have no
561 * connection so far */
562 errbuf[0] = MSG_ERROR;
563 net_transmit_connectionless( &net_sender_addr, 2+strlen(errbuf+1), errbuf );
564 }
565
566 /* void handle_command
567 * IN ServerUser *user
568 * IN char *cmd_line
569 *
570 * Handle command send by the user. The admin has more commands available
571 * the a normal user.
572 */
573 static void handle_command( ServerUser *user, ServerChannel *channel, char *cmd_line )
574 {
575 List *args = parser_explode_string( cmd_line, ' ' );
576 char *cmd = list_first( args );
577 char *name, *limit, *text;
578 int val;
579 ServerUser *target, *remote;
580 ServerChannel *target_channel;
581 LevelSet *lset;
582 char buf[128];
583 FILE *file;
584
585 if ( cmd == 0 ) return;
586
587 if ( !strcmp( cmd, "search" ) ) {
588 if ( (name = list_next( args )) == 0 ) {
589 send_info( user, MSG_SERVER_INFO, "search: specify a user name!" );
590 return;
591 }
592 if ( (target = search_user( name, &target_channel )) == 0 )
593 send_info( user, MSG_SERVER_INFO, "search: user is not online." );
594 else {
595 sprintf( buf, "search: %s: in channel %s: %s",
596 target->name, target_channel->name,
597 user->game?"playing":"chatting" );
598 send_info( user, MSG_SERVER_INFO, buf );
599 }
600 } else
601 if ( !strcmp( cmd, "version" ) ) {
602 sprintf( buf, "transmission protocol: %i", PROTOCOL );
603 send_info( user, MSG_SERVER_INFO, buf );
604 } else
605 if ( !strcmp( cmd, "info" ) ) {
606 sprintf( buf, "user limit: %i#frame rate: %i#packet limit: %i",
607 user_limit, server_fps, server_recv_limit );
608 send_info( user, MSG_SERVER_INFO, buf );
609 } else
610 if ( !strcmp( cmd, "addset" ) && user->admin ) {
611 if ( (name = list_next( args )) == 0 ) {
612 send_info( user, MSG_SERVER_INFO, "addset: name missing" );
613 return;
614 }
615 /* can find levelset? */
616 if ( (file = levelset_open( name, "r" )) ) {
617 fclose( file );
618 lset = levelset_load( name );
619 if ( lset ) {
620 list_add( levelsets, lset );
621 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
622 msg_write_int8( MSG_ADD_LEVELSET );
623 msg_write_string( name );
624 if ( !msg_write_failed() )
625 broadcast_all( msglen, msgbuf );
626 }
627 else
628 send_info( user, MSG_SERVER_INFO, "addset: file %s corrupted", name );
629 }
630 else
631 send_info( user, MSG_SERVER_INFO, "addset: file %s not found", name );
632 } else
633 if ( !strcmp( cmd, "addbot" ) && user->admin ) {
634 if ( (name = list_next( args )) == 0 ) {
635 send_info( user, MSG_SERVER_INFO, "addbot: name missing" );
636 return;
637 }
638 if ( (target = find_user_by_name( name )) ) {
639 send_info( user, MSG_SERVER_INFO, "addbot: bot '%s' exists", name );
640 return;
641 }
642 if ( (limit = list_next( args )) == 0 ) {
643 send_info( user, MSG_SERVER_INFO, "addbot: strength missing" );
644 return;
645 }
646 channel_add_bot( channel, name, atoi(limit) );
647
648 } else
649 if ( !strcmp( cmd, "delbot" ) && user->admin ) {
650 if ( (name = list_next( args )) == 0 ) {
651 send_info( user, MSG_SERVER_INFO, "delbot: name missing" );
652 return;
653 }
654 if ( (target = find_user_by_name( name )) == 0 ) {
655 send_info( user, MSG_SERVER_INFO, "delbot: bot '%s' not found", name );
656 return;
657 }
658 channel_remove_user( channel, target );
659 } else
660 if ( !strcmp( cmd, "set" ) && user->admin ) {
661 if ( (name = list_next( args )) == 0 ) {
662 send_info( user, MSG_SERVER_INFO, "set: variable missing" );
663 return;
664 }
665 if ( (limit = list_next( args )) == 0 ) {
666 send_info( user, MSG_SERVER_INFO, "set: value missing" );
667 return;
668 }
669 val = atoi( limit );
670 if ( !strcmp( name, "userlimit" ) ) {
671 user_limit = val;
672 sprintf( buf, "userlimit: set to %i", user_limit );
673 }
674 else
675 if ( !strcmp( name, "packetlimit" ) ) {
676 server_recv_limit = val;
677 sprintf( buf, "packetlimit: set to %i", server_recv_limit );
678 }
679 else
680 if ( !strcmp( name, "fps" ) ) {
681 server_fps = val;
682 server_frame_delay = 1000/val;
683 sprintf( buf, "fps: set to %i", server_fps );
684
685 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
686 msg_write_int8( MSG_SET_COMM_DELAY );
687 msg_write_int16( server_frame_delay );
688 broadcast_all( msglen, msgbuf );
689 }
690 send_info( user, MSG_SERVER_INFO, buf );
691 } else
692 if ( !strcmp( cmd, "kick" ) && user->admin ) {
693 if ( (name = list_next( args )) == 0 ) {
694 send_info( user, MSG_SERVER_INFO, "kick: specify a user name!" );
695 return;
696 }
697 if ( (target = search_user( name, &target_channel )) == 0 )
698 send_info( user, MSG_SERVER_INFO, "kick: user is not online." );
699 else {
700 if ( target->game ) {
701 /* bring em out of the game and tell the remote
702 * that the game is killed*/
703 remote = ((ServerGame*)target->game)->users[0];
704 if ( remote == target )
705 remote = ((ServerGame*)target->game)->users[1];
706 errbuf[0] = MSG_ERROR;
707 sprintf( errbuf+1, "Sorry, but your opponent has been kicked!" );
708 socket_transmit(
709 &remote->socket, CODE_BLUE,
710 2+strlen(errbuf+1), errbuf );
711 server_game_remove( (ServerGame*)target->game );
712 }
713 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
714 msg_write_int8( MSG_SERVER_INFO );
715 msg_printf( "ADMIN has kicked %s.", target->name );
716 broadcast_all( msglen, msgbuf );
717 channel_kick_user( target_channel, target, "admin kick" );
718 }
719
720 } else
721 if ( !strcmp( cmd, "admin_says" ) && user->admin ) {
722 if ( (text = list_next( args )) == 0 ) {
723 send_info( user, MSG_SERVER_INFO, "info: a message is required!" );
724 return;
725 }
726 /* don't show just the first word */
727 if ( (text = strchr( cmd_line, ' ' )) == 0 ) return; /* will never happen */
728 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
729 msg_write_int8( MSG_SERVER_INFO );
730 msg_printf( "ADMIN says: %s", text+1 /*don't double the space*/ );
731 broadcast_all( msglen, msgbuf );
732 } else
733 if ( !strcmp( cmd, "halt" ) && user->admin ) {
734 server_init_halt();
735 }
736 else {
737 send_info( user, MSG_SERVER_INFO, "unknown command: %s", cmd );
738 }
739 }
740
741 /* void parse_packet_channel
742 * IN ServerChannel *channel
743 * IN ServerUser *user
744 *
745 * Check all messages in packet from user who is located in channel and
746 * not playing. The header has been successfully processed and the read
747 * pointer is at the beginning of the first message. If a message occurs
748 * that is not handled, the rest of the packet is skipped as we don't
749 * know its further format.
750 */
751 static void parse_packet_channel( ServerUser *user, ServerChannel *channel )
752 {
753 int id;
754 unsigned char type;
755 char name[16];
756 ServerUser *recv;
757 ServerGameCtx ctx;
758 ServerChannel *newchannel;
759
760 while ( 1 ) {
761 type = (unsigned)msg_read_int8();
762
763 if ( msg_read_failed() ) break; /* no more messages */
764
765 switch ( type ) {
766 case MSG_HEARTBEAT:
767 /* updates the socket information automatically
768 * so connection is not closed */
769 break;
770 case MSG_DISCONNECT:
771 user->no_comm = 1; /* receive no more messages */
772 printf( "%s (%i) disconnected\n", user->name, user->id );
773 channel_remove_user( channel, user );
774 break;
775 case MSG_QUIT_GAME:
776 /* if player looks at error message and breaks up
777 * game (e.g. waiting for stats) it will send this
778 * message which is simply ignored */
779 break;
780 case MSG_COMMAND:
781 handle_command( user, channel, msg_read_string() );
782 break;
783 case MSG_UNHIDE:
784 if ( user->hidden )
785 channel_hide_user( channel, user, 0 );
786 break;
787 case MSG_CHATTER:
788 /* if UNHIDE was dropped user can become visible
789 * again by simply chatting */
790 if ( user->hidden )
791 channel_hide_user( channel, user, 0 );
792
793 msg_begin_writing( msgbuf, &msglen, 128 );
794 msg_write_int8( MSG_CHATTER );
795 msg_printf( "<%s> %s", user->name, msg_read_string() );
796 if ( !msg_write_failed() )
797 channel_broadcast( channel, msglen, msgbuf );
798 break;
799 case MSG_WHISPER:
800 id = msg_read_int32();
801 recv = find_user_by_id( id ); /* all channels */
802 if ( recv == 0 ) {
803 sprintf( errbuf, "There is no user by that name." );
804 send_info( user, MSG_ERROR, errbuf );
805 } else {
806 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
807 msg_write_int8( MSG_CHATTER );
808 msg_printf( "<%s> %s", user->name, msg_read_string() );
809 if ( !msg_write_failed() ) {
810 socket_transmit(
811 &recv->socket,
812 CODE_BLUE, msglen, msgbuf );
813 socket_transmit(
814 &user->socket,
815 CODE_BLUE, msglen, msgbuf );
816 }
817 }
818 break;
819 case MSG_ENTER_CHANNEL:
820 strncpy(name,msg_read_string(),16);
821 if ( strchr( name, ' ' ) ) {
822 sprintf( errbuf, "Channel name must not contain blanks!" );
823 send_info( user, MSG_ERROR, errbuf );
824 break;
825 }
826 newchannel = channel_find_by_name( name );
827 if ( newchannel == 0 ) newchannel = channel_add( name );
828 channel_transfer_user( channel, newchannel, user );
829 break;
830 case MSG_OPEN_GAME:
831 ctx.challenger = user;
832 id = msg_read_int32();
833 ctx.challenged = find_user_by_id( id );
834 strncpy(ctx.name,msg_read_string(),20);
835 ctx.name[19] = 0;
836 ctx.diff = msg_read_int8();
837 ctx.rounds = msg_read_int8();
838 ctx.frags = msg_read_int8();
839 ctx.balls = msg_read_int8();
840 errbuf[0] = 0;
841 if ( msg_read_failed() )
842 sprintf( errbuf, "OpenGame message corrupted!" );
843 if ( ctx.challenged == 0 )
844 sprintf( errbuf, "User with id %i does not exist!", id );
845 if ( errbuf[0] != 0 )
846 send_info( user, MSG_ERROR, errbuf );
847 else
848 server_game_add( channel, &ctx );
849 break;
850 default:
851 printf( "channel %i: %s: invalid message %x: skipping %i bytes\n",
852 channel->id,
853 net_addr_to_string( &user->socket.remote_addr), type,
854 net_buffer_cur_size - msg_read_pos );
855 msg_read_pos = net_buffer_cur_size;
856 break;
857
858 }
859 }
860 }
861
862 /* void find_send_user
863 * OUT ServerUser **user
864 *
865 * Check all channels and games for the user who's socket address equals
866 * net_sender_addr and return a pointer to it or set '*user' 0 else.
867 *
868 * This is a linear search and should be improved.
869 */
870 static void find_send_user( ServerUser **user, ServerChannel **channel, ServerGame **game )
871 {
872 *user = 0;
873 *channel = 0;
874 *game = 0;
875
876 list_reset( channels );
877 while ( ( *channel = list_next( channels ) ) ) {
878 list_reset( (*channel)->users );
879 while ( ( *user = list_next( (*channel)->users ) ) )
880 if ( net_compare_addr( &net_sender_addr, &(*user)->socket.remote_addr ) ) {
881 /* we have found the user. check if it is playing a game */
882 if ( (*user)->game )
883 *game = (ServerGame*)(*user)->game; /* is a void pointer */
884 return;
885 }
886 }
887 }
888
889 /* void remove_zombies
890 *
891 * Close overflowed connections and users that were idle for too long.
892 */
893 static void remove_zombies( void )
894 {
895 ServerUser *user, *peer;
896 ServerChannel *channel;
897 int cur_time = time(0);
898
899 list_reset( channels );
900 while ( ( channel = list_next( channels ) ) ) {
901 list_reset( channel->users );
902 while ( ( user = list_next( channel->users ) ) ) {
903 if ( user->bot ) continue; /* are never removed */
904 if ( user->socket.fatal_error ||
905 cur_time >= user->socket.idle_since + 60 ) {
906 /* either the code red buffer overflowed or the
907 * user did not send the heartbeat: a zombie! */
908 /* bring users to channel if playing */
909 if ( user->game ) {
910 peer = user->player_id==0?
911 ((ServerGame*)user->game)->users[1]:
912 ((ServerGame*)user->game)->users[0];
913 send_info( peer, MSG_ERROR,
914 "Remote player has disconnected!" );
915 server_game_remove( (ServerGame*)user->game );
916 }
917 channel_kick_user( channel, user, "zombie" );
918 }
919 }
920 }
921 }
922
923 /* void handle
924 * IN int ms milliseconds passed since last call
925 *
926 * Receive all packets at the single UDP socket and check wether it is
927 * connectionless (connection requests) or belongs to a connection (socket).
928 * Find the user and parse all messages in the packet.
929 *
930 * Remove any zombies. (no heartbeat, buffer overflow)
931 *
932 * Update games.
933 */
934 static void handle( int ms )
935 {
936 int recv_limit;
937 ServerUser *user = 0;
938 ServerChannel *channel = 0;
939 ServerGame *game = 0;
940
941 recv_limit = server_recv_limit; /* limited number of packets if not -1 */
942 while ( net_recv_packet() && ( recv_limit==-1 || recv_limit > 0) ) {
943 /* handle connectionless packets (login requests) */
944 if ( msg_is_connectionless() ) {
945 handle_connectionless_packet();
946 continue;
947 }
948
949 /* find the sending user and its channel by comparing
950 * net_sender_addr. */
951 find_send_user( &user, &channel, &game );
952 if ( user == 0 ) continue;
953
954 /* check if this is a valid packet and update the socket */
955 if ( !socket_process_header( &user->socket ) ) continue;
956
957 /* extract the messages */
958 if ( game )
959 parse_packet_game( game, user );
960 else
961 if ( channel )
962 parse_packet_channel( user, channel );
963
964 if ( recv_limit != -1 ) recv_limit--;
965 }
966
967 remove_zombies();
968
969 update_games( ms );
970 }
971
972 /* (re)load all levelsets from the datadir */
973 static int load_levelsets( void )
974 {
975 DIR *hdir;
976 struct dirent *dirent;
977
978 list_clear( levelsets );
979
980 hdir = opendir( SRC_DIR "/levels" );
981 if ( hdir == 0 ) {
982 printf( "couldn't open directory %s!\n", SRC_DIR "/levels" );
983 return 0;
984 }
985
986 while ( (dirent = readdir( hdir )) ) {
987 if ( dirent->d_name[0] == '.' ) continue;
988 if ( dirent->d_name[0] != 'N' || dirent->d_name[1] != '_' ) continue;
989 list_add( levelsets, levelset_load( dirent->d_name ) );
990 }
991 printf( "loaded %i levelsets from directory %s\n",
992 levelsets->count, SRC_DIR "/levels" );
993
994 closedir( hdir );
995 return 1;
996 }
997
998 /* display help of command line options */
999 static void display_help()
1000 {
1001 printf( "Usage:\n lbreakout2server\n" );
1002 printf( " [-p <SERVER_PORT>] Bind server to this port (Default: %i).\n", server_port );
1003 printf( " [-l <USER_LIMIT>] Maximum number of users that can login to server.\n" );
1004 printf( " [-m <WELCOME_FILE>] The text in this file is send to new users on login.\n" );
1005 printf( " [-a <ADMIN_PWD>] The user logging in as <ADMIN_PWD> will become\n" );
1006 printf( " the administrator named 'admin'.\n" );
1007 /* printf( " [-D <DATADIR>] In this directory the network levelsets are located.\n" );
1008 printf( " Note: To upload levelsets as admin the directory\n" );
1009 printf( " must be writeable.\n" );*/
1010 printf( " [-f <FRAMERATE>] Number of send/recv handlings in a second.\n" );
1011 printf( " (Default: 33)\n" );
1012 printf( " [-b <BOTNUM>] Number of paddle bots with 800 and 1000 strength\n");
1013 printf( " each. (Default: 0)\n" );
1014 exit( 0 );
1015 }
1016
1017 /* Parse the command line. */
1018 static void parse_args( int argc, char **argv )
1019 {
1020 int i, len;
1021 FILE *file;
1022
1023 for ( i = 0; i < argc; i++ ) {
1024 if ( !strcmp( "-p", argv[i] ) )
1025 if ( argv[i + 1] )
1026 server_port = atoi( argv[i + 1] );
1027 if ( !strcmp( "-l", argv[i] ) )
1028 if ( argv[i + 1] )
1029 user_limit = atoi( argv[i + 1] );
1030 if ( !strcmp( "-f", argv[i] ) )
1031 if ( argv[i + 1] ) {
1032 server_fps = atoi(argv[i + 1]);
1033 server_frame_delay = 1000/server_fps;
1034 }
1035 if ( !strcmp( "-D", argv[i] ) )
1036 if ( argv[i + 1] )
1037 strncpy(datadir,argv[i + 1],128);
1038 if ( !strcmp( "-h", argv[i] ) || !strcmp( "--help", argv[i] ) )
1039 display_help();
1040 if ( !strcmp( "-m", argv[i] ) )
1041 if ( argv[i + 1] ) {
1042 file = fopen( argv[i+1], "r" );
1043 if ( file == 0 )
1044 printf( "greetings not found: %s\n", argv[i+1] );
1045 else {
1046 len = fread( greetings, 1, 255, file );
1047 greetings[len] = 0;
1048 fclose( file );
1049 printf( "greetings loaded: %s\n", argv[i+1] );
1050 }
1051 }
1052 if ( !strcmp( "-a", argv[i] ) )
1053 if ( argv[i + 1] )
1054 strncpy(admin_pwd,argv[i + 1],15);
1055 if ( !strcmp( "-b", argv[i] ) )
1056 if ( argv[i + 1] )
1057 server_def_bot_num = atoi(argv[i + 1]);
1058 }
1059 }
1060
1061 /* Initiate network connection and lists. */
1062 static void finalize()
1063 {
1064 /* disconnect all users */
1065 errbuf[0] = MSG_DISCONNECT;
1066 broadcast_all( 1, errbuf );
1067
1068 /* free lists */
1069 if ( channels )
1070 list_delete( channels );
1071 if ( games )
1072 list_delete( games );
1073 if ( levelsets )
1074 list_delete( levelsets );
1075
1076 /* close server socket */
1077 net_shutdown();
1078
1079 printf( "server halted\n" );
1080 }
1081 static void init( int argc, char **argv )
1082 {
1083 char name[16];
1084 int id = 1, j;
1085 /* initiate sdl timer */
1086 SDL_Init( SDL_INIT_TIMER );
1087
1088 /* set signal handler to cleanly shutdown by CTRL-C */
1089 signal( SIGINT, signal_handler );
1090
1091 /* parse command line options */
1092 parse_args( argc, argv );
1093
1094 /* open single UDP socket */
1095 if ( !net_init( server_port ) ) exit(1);
1096
1097 /* create empty lists */
1098 channels = list_create( LIST_AUTO_DELETE, channel_delete );
1099 games = list_create( LIST_AUTO_DELETE, server_game_delete );
1100 levelsets= list_create( LIST_AUTO_DELETE, levelset_list_delete );
1101 if ( channels == 0 || games == 0 || levelsets == 0 ) exit(1);
1102
1103 /* load levelset names */
1104 load_levelsets();
1105
1106 printf( "user limit is %i\n", user_limit );
1107 printf( "FPS: %i (delay: %i ms)\n", 1000/server_frame_delay, server_frame_delay );
1108
1109 /* add default channels */
1110 create_default_channels();
1111
1112 /* add default bots */
1113 for ( j = 0; j < server_def_bot_num; j++,id++ )
1114 {
1115 snprintf( name, 16, "BOT%i-800", id );
1116 channel_add_bot( main_channel, name, 800 );
1117 }
1118 for ( j = 0; j < server_def_bot_num; j++,id++ )
1119 {
1120 snprintf( name, 16, "BOT%i-1000", id );
1121 channel_add_bot( main_channel, name, 1000 );
1122 }
1123
1124 /* build angle table */
1125 init_angles();
1126 }
1127
1128 static void signal_handler( int signal )
1129 {
1130 switch ( signal ) {
1131 case SIGINT:
1132 if ( server_halt ) break;
1133 server_init_halt();
1134 break;
1135 }
1136 }
1137
1138 #endif
1139
1140 /***** PUBLIC FUNCTIONS ****************************************************/
1141
1142 int main( int argc, char **argv )
1143 {
1144 #ifdef NETWORK_ENABLED
1145 int last_ticks, cur_ticks;
1146 int ms = 0;
1147
1148 set_random_seed(); /* set random seed */
1149 init( argc, argv );
1150
1151 /* loop and handle messages until shutdown */
1152 last_ticks = cur_ticks = SDL_GetTicks();
1153 while ( 1 ) {
1154 last_ticks = cur_ticks; cur_ticks = SDL_GetTicks();
1155 ms += cur_ticks - last_ticks;
1156
1157 if ( ms > server_frame_delay ) {
1158 handle( ms );
1159 ms -= server_frame_delay;
1160 }
1161
1162 if ( server_halt && time( 0 ) > server_halt_since + 5 )
1163 break;
1164
1165 SDL_Delay( 5 );
1166 }
1167
1168 finalize();
1169 #else
1170 printf( "LBreakout2 has been compiled without network support.\n" );
1171 #endif
1172
1173 return 0;
1174 }
1175
0 /***************************************************************************
1 server.h - description
2 -------------------
3 begin : 03/03/19
4 copyright : (C) 2003 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __SERVER_H
18 #define __SERVER_H
19
20 /***** INCLUDES ************************************************************/
21
22 #ifdef HAVE_CONFIG_H
23 #include "../config.h"
24 #endif
25 #include <SDL.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdio.h>
29 #include <signal.h>
30 #include <time.h>
31 #include "../common/tools.h"
32 #include "../common/net.h"
33 #include "../common/messages.h"
34 #include "../common/list.h"
35 #include "../common/parser.h"
36 #include "../game/game.h"
37
38 /***** TYPE DEFINITIONS ****************************************************/
39
40 typedef struct {
41 int id; /* global user id */
42 char name[20];
43 int no_comm; /* user does not communicate: bots and disconnected
44 users have this set True */
45 int bot; /* if True this is a paddle bot */
46 int bot_level; /* paddle speed in pix/sec */
47 NetSocket socket; /* transmission socket */
48 int hidden; /* True if chatroom user is not visible
49 (e.g. looking at game statistics or playing) */
50 int admin; /* wether user logged in with admit rights */
51 void *game; /* FIXME: I'M A BAD HACK: points to the current ServerGame
52 if this user is playing */
53 int player_id; /* 0 - challenger in game or 1 - challenged */
54 } ServerUser;
55
56 typedef struct {
57 char name[20];
58 int id;
59 List *users;
60 } ServerChannel;
61
62 enum {
63 SERVER_AWAIT_ACCEPT, /* the first user has created the game and is already
64 added. a challenge note is sent to the challenged
65 user. in this state the server awaits either a
66 ACCEPTED or REFUSED message by the remote
67 or a CANCEL, DISCONNECT by the challenger */
68 SERVER_AWAIT_READY, /* await ready message from both users, then play */
69 SERVER_PLAY, /* now the game is actually running: valid messages are
70 paddle updates, pause requests, chat messages and exits */
71 SERVER_PAUSE /* game is paused and players may exchange chat messages
72 until one sends an UNPAUSE */
73 }; /* states of a server game */
74
75 typedef struct {
76 ServerUser *challenger;
77 ServerUser *challenged; /* the two users that will play */
78
79 char name[20]; /* name of the levelset */
80 int diff; /* difficulty level */
81 int rounds; /* per level */
82 int frags; /* DM: frags required to win */
83 int balls; /* DM: number of balls a paddle may fire */
84 } ServerGameCtx;
85
86 typedef struct {
87 int id; /* users join a game by sending its id */
88 int state; /* current state as above */
89 ServerUser *users[2]; /* pointers to chat channel:
90 0 - challenger
91 1 - challenged */
92 ServerChannel *channel; /* the channel the users are in */
93
94 LevelSet *set; /* pointer to the current set */
95 int rounds_per_level;
96 int rounds; /* level count * rounds per level */
97 int cur_round; /* id of current round. level id
98 is cur_round / rounds */
99 int cur_level; /* id of current level */
100
101 int ready[2]; /* wether user has sent READY */
102 Game *game; /* the actual game data used by server */
103 GameStats stats[2]; /* game stats:
104 0 - challenger
105 1 - challenged */
106 int game_over; /* True after last round was finalized
107 and stats have been send. */
108 } ServerGame;
109
110 /***** PUBLIC FUNCTIONS ****************************************************/
111
112 #endif
113
0 /***************************************************************************
1 server_game.c - description
2 -------------------
3 begin : 03/03/19
4 copyright : (C) 2003 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /***** INCLUDES ************************************************************/
18
19 #include "server.h"
20
21 /***** EXTERNAL VARIABLES **************************************************/
22
23 extern List *games;
24 extern int global_id;
25 extern char errbuf[128]; /* used to compile error messages */
26 extern char msgbuf[MAX_MSG_SIZE]; /* used to compile messages */
27 extern int msglen;
28 extern List *levelsets;
29 extern char net_buffer[MAX_MSG_SIZE + PACKET_HEADER_SIZE];
30 extern int server_frame_delay;
31 extern int msg_read_pos, net_buffer_cur_size;
32
33 extern void send_info( ServerUser *user, int type, char *format, ... );
34 extern void channel_hide_user( ServerChannel *channel, ServerUser *user, int hide );
35 extern void channel_remove_user( ServerChannel *channel, ServerUser *user );
36 extern void send_full_update( ServerUser *user, ServerChannel *channel );
37
38 /***** EXPORTS *************************************************************/
39
40 /***** FORWARDED DECLARATIONS **********************************************/
41
42 /***** LOCAL TYPE DEFINITIONS **********************************************/
43
44 /***** LOCAL VARIABLES *****************************************************/
45
46 /***** LOCAL FUNCTIONS *****************************************************/
47
48 #ifdef NETWORK_ENABLED
49
50 /* update the position of top paddle */
51 static void update_bot_paddle( Game *game, int ms )
52 {
53 int src_x, dest_x, dir;
54 Ball *ball, *min_ball = 0;
55 Extra *extra, *min_extra = 0;
56 Paddle *paddle = game->paddles[PADDLE_TOP];
57 int move = 0;
58 static int entropy = 0;
59 float change;
60
61 /* always fire */
62 paddle->fire_left = 1;
63
64 /* get nearest ball */
65 list_reset( game->balls );
66 while ( ( ball = list_next( game->balls ) ) ) {
67 if ( ball->attached ) continue;
68 if ( min_ball == 0 || ball->y < min_ball->y )
69 min_ball = ball;
70 }
71 /* get nearest extra */
72 list_reset( game->extras );
73 while ( ( extra = list_next( game->extras ) ) ) {
74 if ( extra->dir != -1 ) continue;
75 if ( min_extra == 0 || extra->y < min_extra->y )
76 min_extra = extra;
77 }
78
79 src_x = paddle->x + paddle->w/2;
80 dest_x = paddle->x + paddle->w/2;
81 if ( min_ball || min_extra ) {
82 if ( min_ball && ( min_extra == 0 || min_ball->y < min_extra->y ) ) {
83 dest_x = min_ball->x + 6;
84 move = 1;
85 }
86 else
87 if ( min_extra && ( min_ball == 0 || min_extra->y < min_ball->y ) ) {
88 dest_x = min_extra->x + 20;
89 move = 1;
90 }
91 }
92 dir = (dest_x<src_x)?-1:(dest_x>src_x)?1:0;
93
94 entropy = (rand() % 17)-8;
95 if ( move && dir != 0 ) {
96 change = paddle->bot_vx * ms;
97 /* due to high 'ms' the change might be so much that
98 * the paddle would start to jump epileptically, so
99 * set position to 'dest' then */
100 if ( dir < 0 && src_x-change<dest_x+entropy )
101 paddle->cur_x = dest_x+entropy - paddle->w/2;
102 else
103 if ( dir > 0 && src_x+change>dest_x-entropy )
104 paddle->cur_x = dest_x-entropy - paddle->w/2;
105 else
106 paddle->cur_x += change * dir;
107 if ( paddle->cur_x < BRICK_WIDTH )
108 paddle->cur_x = BRICK_WIDTH;
109 if ( paddle->cur_x + paddle->w >= 640 - BRICK_WIDTH )
110 paddle->cur_x = 640 - BRICK_WIDTH - paddle->w;
111 paddle->x = (int)paddle->cur_x;
112 }
113 }
114
115 static LevelSet *find_levelset( char *name )
116 {
117 LevelSet *set;
118
119 list_reset( levelsets );
120 while ( (set = list_next( levelsets ) ) )
121 if ( !strcmp( set->name, name ) )
122 return set;
123 return 0;
124 }
125
126 static void send_level( Level *level, ServerUser *user, int l_pos )
127 {
128 if ( user->bot ) return;
129
130 msgbuf[0] = MSG_LEVEL_DATA;
131 msgbuf[1] = l_pos;
132 msglen = 2;
133 comm_pack_level( level, msgbuf, &msglen );
134 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
135 }
136
137 static void init_next_round( ServerGame *game )
138 {
139 game->cur_round++;
140 game->cur_level = game->cur_round / game->rounds_per_level;
141 game_init( game->game, game->set->levels[game->cur_level] );
142
143 /* send level and wait for ready */
144 game->state = SERVER_AWAIT_READY;
145 game->ready[0] = game->ready[1] = 0;
146 send_level( game->set->levels[game->cur_level],
147 game->users[0], PADDLE_BOTTOM );
148 if ( !game->users[1]->bot )
149 send_level( game->set->levels[game->cur_level],
150 game->users[1], PADDLE_TOP );
151 else
152 game->ready[1] = 1; /* bot is always the challenged one */
153
154 /* set up bot top paddle if any */
155 if ( game->users[1]->bot )
156 game->game->paddles[PADDLE_TOP]->bot_vx =
157 0.001 * game->users[1]->bot_level;
158
159 }
160
161 static void finalize_round( ServerGame *game )
162 {
163 /* update stats */
164 game_update_stats( 0, &game->stats[0] );
165 game_update_stats( 1, &game->stats[1] );
166
167 /* finalize */
168 game_finalize( game->game );
169
170 /* tell clients that round is over */
171 if ( game->cur_round == game->rounds-1 )
172 msgbuf[0] = MSG_LAST_ROUND_OVER;
173 else
174 msgbuf[0] = MSG_ROUND_OVER;
175 msgbuf[1] = game->game->winner;
176 msglen = 2;
177 socket_transmit( &game->users[0]->socket, CODE_BLUE, msglen, msgbuf );
178 if ( !game->users[1]->bot )
179 socket_transmit( &game->users[1]->socket, CODE_BLUE, msglen, msgbuf );
180
181 /* if this was the last round set game_over */
182 if ( game->cur_round == game->rounds-1 )
183 game->game_over = 1;
184 }
185
186 /* send game statistics were the first stats is the user it is send
187 * to and the second is the opponents stats */
188 static void send_stats( ServerUser *user, GameStats *stats1, GameStats *stats2 )
189 {
190 int count;
191 int kept[2] = {0,0}, bricks[2] = {0,0}, extras[2] = {0,0};
192
193 if ( user->bot ) return;
194
195 count = stats1->balls_reflected + stats1->balls_lost;
196 if ( count > 0 )
197 kept[0] = 100 * stats1->balls_reflected / count;
198 count = stats2->balls_reflected + stats2->balls_lost;
199 if ( count > 0 )
200 kept[1] = 100 * stats2->balls_reflected / count;
201 if ( stats1->total_brick_count > 0 )
202 bricks[0] = 100 * stats1->bricks_cleared / stats1->total_brick_count;
203 if ( stats2->total_brick_count > 0 )
204 bricks[1] = 100 * stats2->bricks_cleared / stats2->total_brick_count;
205 if ( stats1->total_extra_count > 0 )
206 extras[0] = 100 * stats1->extras_collected / stats1->total_extra_count;
207 if ( stats2->total_extra_count > 0 )
208 extras[1] = 100 * stats2->extras_collected / stats2->total_extra_count;
209
210 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
211 msg_write_int8( MSG_GAME_STATS );
212 msg_write_int8( stats1->wins );
213 msg_write_int8( stats2->wins );
214 msg_write_int8( stats1->losses );
215 msg_write_int8( stats2->losses );
216 msg_write_int8( stats1->draws );
217 msg_write_int8( stats2->draws );
218 msg_write_int32( stats1->total_score );
219 msg_write_int32( stats2->total_score );
220 msg_write_int8( kept[0] );
221 msg_write_int8( kept[1] );
222 msg_write_int8( bricks[0] );
223 msg_write_int8( bricks[1] );
224 msg_write_int8( extras[0] );
225 msg_write_int8( extras[1] );
226
227 socket_transmit( &user->socket, CODE_BLUE, msglen, msgbuf );
228 }
229
230 /***** PUBLIC FUNCTIONS ****************************************************/
231
232 /* Add a new game by the context information, hide both users
233 * and send a challenge message to the challenged user. */
234 void server_game_add( ServerChannel *channel, ServerGameCtx *ctx )
235 {
236 ServerGame *game = salloc( 1, sizeof( ServerGame ) );
237
238 /* copy game data */
239 game->state = SERVER_AWAIT_ACCEPT;
240 game->id = global_id++;
241 game->channel = channel;
242 game->set = find_levelset( ctx->name );
243 if ( game->set == 0 ) {
244 /* should never happen... */
245 sprintf( errbuf, "game_create_failed: no levelset '%s' found\n", ctx->name );
246 send_info( ctx->challenger, MSG_ERROR, errbuf );
247 free( game );
248 return;
249 }
250 game->rounds_per_level = ctx->rounds;
251 game->rounds = game->set->count * game->rounds_per_level;
252 game->cur_round = -1; /* init_next_round will increase this to 0 */
253 /* create game module */
254 if ( (game->game = game_create( GT_NETWORK, ctx->diff, 100/*no rel warp*/ )) == 0 ) {
255 /* send error to user */
256 strncpy(errbuf,"game_create failed: out of memory",128);
257 send_info( ctx->challenger, MSG_ERROR, errbuf );
258 free( game );
259 return;
260 }
261 game_set_current( game->game );
262 game_set_ball_ammo( ctx->balls );
263 game_set_frag_limit( ctx->frags );
264 game_set_convex_paddle( 1 );
265 game_set_ball_random_angle( 1 );
266
267 /* set game for both users and set both users for game */
268 ctx->challenger->game = game;
269 ctx->challenged->game = game;
270 ctx->challenger->player_id = 0;
271 ctx->challenged->player_id = 1;
272 game->users[0] = ctx->challenger;
273 game->users[1] = ctx->challenged;
274
275 /* hide both users */
276 channel_hide_user( channel, ctx->challenger, 1 );
277 channel_hide_user( channel, ctx->challenged, 1 );
278
279 /* inform challenged user */
280 if ( !ctx->challenged->bot ) {
281 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
282 msg_write_int8( MSG_CHALLENGE );
283 msg_write_string( ctx->challenger->name );
284 msg_write_string( ctx->name );
285 msg_write_int8( ctx->diff );
286 msg_write_int8( ctx->rounds );
287 msg_write_int8( ctx->frags );
288 msg_write_int8( ctx->balls );
289 socket_transmit( &ctx->challenged->socket, CODE_BLUE, msglen, msgbuf );
290 }
291 else {
292 /* instantly accept as bot */
293 msgbuf[0] = MSG_ACCEPT_CHALLENGE;
294 socket_transmit( &game->users[0]->socket,
295 CODE_BLUE, 1, msgbuf );
296 init_next_round( game );
297 }
298
299 list_add( games, game );
300 printf( "game added: %s (%i): %i rounds: %s vs. %s\n",
301 game->set->name, game->id, game->rounds,
302 game->users[0]->name, game->users[1]->name );
303 }
304
305 /* Free game memory. */
306 void server_game_delete( void *ptr )
307 {
308 ServerGame *game = (ServerGame*)ptr;
309
310 if ( game ) {
311 printf( "game deleted: %s (%i)\n", game->set->name, game->id );
312
313 if ( game->game )
314 game_delete( &game->game );
315 free( game );
316 }
317 }
318
319 /* unhide the users to their chat channel and delete the game.
320 * if game was beyond state AWAIT_ACCEPT the game stats are send
321 */
322 void server_game_remove( ServerGame *game )
323 {
324 int i;
325
326 /* users are not unhidden if the actual game has already started
327 * as they need time to read the error messages (if any) then */
328 if ( game->state == SERVER_AWAIT_ACCEPT )
329 for ( i = 0; i < 2; i++ ) {
330 if ( game->users[i]->hidden )
331 channel_hide_user( game->channel, game->users[i], 0 );
332 }
333 else {
334 /* send stats */
335 send_stats( game->users[0], &game->stats[0], &game->stats[1] );
336 send_stats( game->users[1], &game->stats[1], &game->stats[0] );
337
338 /* and unhide bot if any */
339 if ( game->users[1]->bot )
340 channel_hide_user( game->channel, game->users[1], 0 );
341 }
342
343 /* clear user game pointer */
344 game->users[0]->game = 0;
345 game->users[1]->game = 0;
346
347 /* free memory */
348 list_delete_item( games, game );
349 }
350
351 /* void parse_packet_game
352 * IN ServerGame *game
353 * IN ServerUser *user
354 *
355 * Check all messages in packet from user who is currently within
356 * a game. The header has already been successfully processed and
357 * the read pointer is at the beginning of the first message.
358 */
359 void parse_packet_game( ServerGame *game, ServerUser *user )
360 {
361 ServerUser *peer;
362 unsigned char type;
363 int handled, i;
364
365 game_set_current( game->game );
366
367 while ( 1 ) {
368 type = (unsigned)msg_read_int8(); handled = 0;
369 msglen = 0; /* the extract functions require a position pointer */
370
371 if ( msg_read_failed() ) break; /* no more messages */
372
373 /* general messages */
374 switch ( type ) {
375 case MSG_HEARTBEAT:
376 /* updates the socket information automatically
377 * so connection is not closed */
378 handled = 1;
379 break;
380 case MSG_DISCONNECT:
381 /* update stats and finalize context if playing */
382 if ( game->state != SERVER_AWAIT_ACCEPT ) {
383 game->game->winner = -1; /* count unfinished level as draw */
384 game_update_stats( 0, &game->stats[0] );
385 game_update_stats( 1, &game->stats[1] );
386 game_finalize( game->game );
387 }
388
389 if ( user == game->users[0] )
390 peer = game->users[1];
391 else
392 peer = game->users[0];
393 send_info( peer, MSG_ERROR, "Remote player has disconnected..." );
394
395 server_game_remove( game );
396 printf( "%s (%i) disconnected\n", user->name, user->id );
397 channel_remove_user( game->channel, user );
398 handled = 1;
399 break;
400 case MSG_QUIT_GAME:
401 if ( user == game->users[0] )
402 peer = game->users[1];
403 else
404 peer = game->users[0];
405 send_info( peer, MSG_ERROR, "Remote player has left the game..." );
406
407 /* update stats and finalize context */
408 game->game->winner = -1; /* count unfinished level as draw */
409 game_update_stats( 0, &game->stats[0] );
410 game_update_stats( 1, &game->stats[1] );
411 game_finalize( game->game );
412
413 server_game_remove( game );
414 handled = 1;
415 break;
416 case MSG_UNHIDE:
417 /* it's very unlikely that the user sends this
418 * message while being in the game context but to be sure
419 * he may unhide here */
420 if ( user->hidden )
421 channel_hide_user( game->channel, user, 0 );
422 handled = 1;
423 break;
424 }
425
426 /* challenge */
427 if ( game->state == SERVER_AWAIT_ACCEPT )
428 switch ( type ) {
429 case MSG_ACCEPT_CHALLENGE:
430 if ( user == game->users[1] ) {
431 /* inform opponent */
432 msgbuf[0] = MSG_ACCEPT_CHALLENGE;
433 socket_transmit( &game->users[0]->socket,
434 CODE_BLUE, 1, msgbuf );
435
436 init_next_round( game );
437 handled = 1;
438 }
439 break;
440 case MSG_REJECT_CHALLENGE:
441 if ( user == game->users[1] ) {
442 /* tell challenger that you refused the offer */
443 msgbuf[0] = MSG_REJECT_CHALLENGE;
444 socket_transmit( &game->users[0]->socket,
445 CODE_BLUE, 1, msgbuf );
446
447 server_game_remove( game );
448 handled = 1;
449 }
450 break;
451 case MSG_CANCEL_GAME:
452 if ( user == game->users[0] ) {
453 /* tell challenged that you cancelled the offer */
454 msgbuf[0] = MSG_CANCEL_GAME;
455 socket_transmit( &game->users[1]->socket,
456 CODE_BLUE, 1, msgbuf );
457
458 server_game_remove( game );
459 handled = 1;
460 }
461 break;
462 }
463
464 /* preparation */
465 if ( game->state == SERVER_AWAIT_READY )
466 if ( type == MSG_READY ) {
467 game->ready[user->player_id] = 1;
468 if ( game->ready[0] && game->ready[1] )
469 game->state = SERVER_PLAY;
470 handled = 1;
471 }
472
473 /* in-game messages */
474 if ( game->state == SERVER_PLAY )
475 switch ( type ) {
476 case MSG_PADDLE_STATE:
477 comm_unpack_paddle( game->game->paddles[user->player_id],
478 net_buffer, &msg_read_pos );
479 handled = 1;
480 break;
481 case MSG_PAUSE:
482 game->state = SERVER_PAUSE;
483
484 msgbuf[0] = MSG_PAUSE; msglen = 1;
485 if ( user == game->users[0] )
486 peer = game->users[1];
487 else
488 peer = game->users[0];
489 if ( !peer->bot )
490 socket_transmit( &peer->socket, CODE_BLUE, msglen, msgbuf );
491 handled = 1;
492 break;
493 }
494
495 /* pause messages */
496 if ( game->state == SERVER_PAUSE )
497 switch ( type ) {
498 case MSG_UNPAUSE:
499 game->state = SERVER_PLAY;
500 for ( i = 0; i < game->game->paddle_count; i++ )
501 game->game->paddles[i]->last_ball_contact = SDL_GetTicks();
502
503 msgbuf[0] = MSG_UNPAUSE; msglen = 1;
504 if ( user == game->users[0] )
505 peer = game->users[1];
506 else
507 peer = game->users[0];
508 if ( !peer->bot )
509 socket_transmit( &peer->socket, CODE_BLUE, msglen, msgbuf );
510 handled = 1;
511 break;
512 case MSG_CHATTER:
513 /* client has added <user> prefix so simply pass it
514 * to the remote user */
515 msg_begin_writing( msgbuf, &msglen, MAX_MSG_SIZE );
516 msg_write_int8( MSG_CHATTER );
517 msg_write_string( msg_read_string() );
518 if ( !msg_write_failed() ) {
519 if ( user == game->users[0] )
520 peer = game->users[1];
521 else
522 peer = game->users[0];
523 if ( !peer->bot )
524 socket_transmit( &peer->socket,
525 CODE_BLUE, msglen, msgbuf );
526 }
527 handled = 1;
528 break;
529 }
530
531 if ( !handled ) {
532 printf( "game %i: %s: state %i: invalid message %x: skipping %i bytes\n",
533 game->id, net_addr_to_string( &user->socket.remote_addr ),
534 game->state, type, net_buffer_cur_size - msg_read_pos );
535 msg_read_pos = net_buffer_cur_size;
536 }
537
538 }
539 }
540
541 /* void update_games
542 * IN int ms milliseconds passed since last call
543 *
544 * Update the objects of all games that are actually playing.
545 */
546 void update_games( int ms )
547 {
548 int i;
549 ServerGame *game;
550
551 list_reset( games );
552 while ( (game = list_next( games ) ) ) {
553 if ( game->state != SERVER_PLAY ) continue;
554
555 game_set_current( game->game );
556 game_update( ms );
557
558 /* send updates to remote players */
559
560 if ( game->game->level_over ) {
561 finalize_round( game );
562 if ( game->game_over )
563 server_game_remove( game );
564 else
565 init_next_round( game );
566 continue;
567 }
568
569 /* if playing against a bot update the top paddle */
570 if ( game->users[1]->bot )
571 update_bot_paddle( game->game, ms );
572
573 /* pack update */
574 msglen = 0;
575
576 msgbuf[msglen++] = MSG_PADDLE_STATE;
577 comm_pack_paddle( game->game->paddles[1], msgbuf, &msglen );
578
579 msgbuf[msglen++] = MSG_BALL_POSITIONS;
580 comm_pack_balls( msgbuf, &msglen );
581
582 if ( game->game->shots->count > 0 ) {
583 msgbuf[msglen++] = MSG_SHOT_POSITIONS;
584 comm_pack_shots( msgbuf, &msglen );
585 }
586
587 msgbuf[msglen++] = MSG_SCORES;
588 comm_pack_scores( msgbuf, &msglen );
589
590 if ( game->game->mod.brick_hit_count > 0 ) {
591 msgbuf[msglen++] = MSG_BRICK_HITS;
592 comm_pack_brick_hits( msgbuf, &msglen );
593 }
594
595 if ( game->game->mod.collected_extra_count[0] > 0 ||
596 game->game->mod.collected_extra_count[1] > 0 ) {
597 msgbuf[msglen++] = MSG_NEW_EXTRAS;
598 comm_pack_collected_extras( msgbuf, &msglen );
599 }
600
601 /* send packet */
602 socket_transmit( &game->users[0]->socket, CODE_BLUE, msglen, msgbuf );
603
604 /* replace paddle which has a constant size */
605 i = 1;
606 comm_pack_paddle( game->game->paddles[0], msgbuf, &i );
607 if ( !game->users[1]->bot )
608 socket_transmit( &game->users[1]->socket, CODE_BLUE, msglen, msgbuf );
609
610 game_reset_mods();
611 }
612 }
613
614 #endif
615
0 /***************************************************************************
1 server_game.h - description
2 -------------------
3 begin : 03/03/19
4 copyright : (C) 2003 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __SERVER_GAME_H
18 #define __SERVER_GAME_H
19
20 /***** INCLUDES ************************************************************/
21
22 /***** TYPE DEFINITIONS ****************************************************/
23
24 /***** PUBLIC FUNCTIONS ****************************************************/
25
26 /* Add a new game by the context information, hide both users
27 * and send a challenge message to the challenged user. */
28 void server_game_add( ServerChannel *channel, ServerGameCtx *ctx );
29
30 /* Free game memory. */
31 void server_game_delete( void *ptr );
32
33 /* unhide the users to their chat channel and delete the game.
34 * if game was beyond state AWAIT_ACCEPT the game stats are send
35 */
36 void server_game_remove( ServerGame *game );
37
38 /* void parse_packet_game
39 * IN ServerGame *game
40 * IN ServerUser *user
41 *
42 * Check all messages in packet from user who is currently within
43 * a game. The header has already been successfully processed and the
44 * read pointer is at the beginning of the first message.
45 */
46 void parse_packet_game( ServerGame *game, ServerUser *user );
47
48 /* void update_games
49 * IN int ms milliseconds passed since last call
50 *
51 * Update the objects of all games that are actually playing.
52 */
53 void update_games( int ms );
54
55 #endif
56
+0
-32
src/Makefile.am less more
0 DEFS = @warp_flag@ @sound_flag@ @inst_flag@ @hi_inst_flag@ @DEFS@
1 bin_PROGRAMS = lbreakout2
2 lbreakout2_SOURCES = audio.c credit.c shine.c extras.c balls.c shrapnells.c \
3 shots.c event.c paddle.c frame.c misc.c bricks.c difficulty.c player.c game.c \
4 tools.c file.c levels.c sdl.c config.c list.c \
5 item.c menu.c manager.c value.c chart.c \
6 editor.c help.c hint.c theme.c main.c
7 lbreakout2_LDADD = @mixer_flag@
8
9 EXTRA_DIST = main.c paddle.h list.c list.h config.c config.h sdl.c \
10 sdl.h levels.h levels.c file.c file.h tools.c tools.h lbreakout.h bricks.h \
11 game.h game.c player.h player.c difficulty.h difficulty.c bricks.c misc.h \
12 misc.c frame.h frame.c paddle.c event.h event.c shots.h shots.c shrapnells.h \
13 shrapnells.c balls.c balls.h extras.h extras.c shine.h shine.c credit.h \
14 credit.c audio.c audio.h value.h item.h menu.h manager.h value.c item.c menu.c \
15 manager.c chart.h chart.c editor.h editor.c help.h help.c \
16 hint.c hint.h theme.c theme.h \
17 empty.hscr
18
19 SUBDIRS = docs gfx sounds levels
20
21 install-data-local:
22 $(mkinstalldirs) $(DESTDIR)$(inst_dir)
23 $(mkinstalldirs) $(DESTDIR)$(hi_dir)
24 if ! test -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr; then \
25 $(INSTALL_DATA) --mode=666 empty.hscr $(DESTDIR)$(hi_dir)/lbreakout2.hscr; \
26 fi;
27
28 uninstall-local:
29 rm -rf $(DESTDIR)$(inst_dir)
30 rm -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr
31 rm -rf $(DESTDIR)$(doc_dir)/lbreakout2
+0
-438
src/Makefile.in less more
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 CC = @CC@
60 MAKEINFO = @MAKEINFO@
61 PACKAGE = @PACKAGE@
62 RANLIB = @RANLIB@
63 SDL_CFLAGS = @SDL_CFLAGS@
64 SDL_CONFIG = @SDL_CONFIG@
65 SDL_LIBS = @SDL_LIBS@
66 VERSION = @VERSION@
67 doc_dir = @doc_dir@
68 hi_dir = @hi_dir@
69 hi_inst_flag = @hi_inst_flag@
70 inst_dir = @inst_dir@
71 inst_flag = @inst_flag@
72 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
74 warp_flag = @warp_flag@
75
76 DEFS = @warp_flag@ @sound_flag@ @inst_flag@ @hi_inst_flag@ @DEFS@
77 bin_PROGRAMS = lbreakout2
78 lbreakout2_SOURCES = audio.c credit.c shine.c extras.c balls.c shrapnells.c shots.c event.c paddle.c frame.c misc.c bricks.c difficulty.c player.c game.c tools.c file.c levels.c sdl.c config.c list.c item.c menu.c manager.c value.c chart.c editor.c help.c hint.c theme.c main.c
79
80 lbreakout2_LDADD = @mixer_flag@
81
82 EXTRA_DIST = main.c paddle.h list.c list.h config.c config.h sdl.c sdl.h levels.h levels.c file.c file.h tools.c tools.h lbreakout.h bricks.h game.h game.c player.h player.c difficulty.h difficulty.c bricks.c misc.h misc.c frame.h frame.c paddle.c event.h event.c shots.h shots.c shrapnells.h shrapnells.c balls.c balls.h extras.h extras.c shine.h shine.c credit.h credit.c audio.c audio.h value.h item.h menu.h manager.h value.c item.c menu.c manager.c chart.h chart.c editor.h editor.c help.h help.c hint.c hint.h theme.c theme.h empty.hscr
83
84
85 SUBDIRS = docs gfx sounds levels
86 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
87 CONFIG_HEADER = ../config.h
88 CONFIG_CLEAN_FILES =
89 PROGRAMS = $(bin_PROGRAMS)
90
91 CPPFLAGS = @CPPFLAGS@
92 LDFLAGS = @LDFLAGS@
93 LIBS = @LIBS@
94 lbreakout2_OBJECTS = audio.o credit.o shine.o extras.o balls.o \
95 shrapnells.o shots.o event.o paddle.o frame.o misc.o bricks.o \
96 difficulty.o player.o game.o tools.o file.o levels.o sdl.o config.o \
97 list.o item.o menu.o manager.o value.o chart.o editor.o help.o hint.o \
98 theme.o main.o
99 lbreakout2_DEPENDENCIES =
100 lbreakout2_LDFLAGS =
101 CFLAGS = @CFLAGS@
102 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
103 CCLD = $(CC)
104 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
105 DIST_COMMON = Makefile.am Makefile.in
106
107
108 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
109
110 TAR = gtar
111 GZIP_ENV = --best
112 SOURCES = $(lbreakout2_SOURCES)
113 OBJECTS = $(lbreakout2_OBJECTS)
114
115 all: all-redirect
116 .SUFFIXES:
117 .SUFFIXES: .S .c .o .s
118 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
119 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile
120
121 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
122 cd $(top_builddir) \
123 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
124
125
126 mostlyclean-binPROGRAMS:
127
128 clean-binPROGRAMS:
129 -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
130
131 distclean-binPROGRAMS:
132
133 maintainer-clean-binPROGRAMS:
134
135 install-binPROGRAMS: $(bin_PROGRAMS)
136 @$(NORMAL_INSTALL)
137 $(mkinstalldirs) $(DESTDIR)$(bindir)
138 @list='$(bin_PROGRAMS)'; for p in $$list; do \
139 if test -f $$p; then \
140 echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
141 $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
142 else :; fi; \
143 done
144
145 uninstall-binPROGRAMS:
146 @$(NORMAL_UNINSTALL)
147 list='$(bin_PROGRAMS)'; for p in $$list; do \
148 rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
149 done
150
151 .c.o:
152 $(COMPILE) -c $<
153
154 .s.o:
155 $(COMPILE) -c $<
156
157 .S.o:
158 $(COMPILE) -c $<
159
160 mostlyclean-compile:
161 -rm -f *.o core *.core
162
163 clean-compile:
164
165 distclean-compile:
166 -rm -f *.tab.c
167
168 maintainer-clean-compile:
169
170 lbreakout2: $(lbreakout2_OBJECTS) $(lbreakout2_DEPENDENCIES)
171 @rm -f lbreakout2
172 $(LINK) $(lbreakout2_LDFLAGS) $(lbreakout2_OBJECTS) $(lbreakout2_LDADD) $(LIBS)
173
174 # This directory's subdirectories are mostly independent; you can cd
175 # into them and run `make' without going through this Makefile.
176 # To change the values of `make' variables: instead of editing Makefiles,
177 # (1) if the variable is set in `config.status', edit `config.status'
178 # (which will cause the Makefiles to be regenerated when you run `make');
179 # (2) otherwise, pass the desired values on the `make' command line.
180
181 @SET_MAKE@
182
183 all-recursive install-data-recursive install-exec-recursive \
184 installdirs-recursive install-recursive uninstall-recursive \
185 check-recursive installcheck-recursive info-recursive dvi-recursive:
186 @set fnord $(MAKEFLAGS); amf=$$2; \
187 dot_seen=no; \
188 target=`echo $@ | sed s/-recursive//`; \
189 list='$(SUBDIRS)'; for subdir in $$list; do \
190 echo "Making $$target in $$subdir"; \
191 if test "$$subdir" = "."; then \
192 dot_seen=yes; \
193 local_target="$$target-am"; \
194 else \
195 local_target="$$target"; \
196 fi; \
197 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
198 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
199 done; \
200 if test "$$dot_seen" = "no"; then \
201 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
202 fi; test -z "$$fail"
203
204 mostlyclean-recursive clean-recursive distclean-recursive \
205 maintainer-clean-recursive:
206 @set fnord $(MAKEFLAGS); amf=$$2; \
207 dot_seen=no; \
208 rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
209 rev="$$subdir $$rev"; \
210 test "$$subdir" = "." && dot_seen=yes; \
211 done; \
212 test "$$dot_seen" = "no" && rev=". $$rev"; \
213 target=`echo $@ | sed s/-recursive//`; \
214 for subdir in $$rev; do \
215 echo "Making $$target in $$subdir"; \
216 if test "$$subdir" = "."; then \
217 local_target="$$target-am"; \
218 else \
219 local_target="$$target"; \
220 fi; \
221 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
222 || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
223 done && test -z "$$fail"
224 tags-recursive:
225 list='$(SUBDIRS)'; for subdir in $$list; do \
226 test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
227 done
228
229 tags: TAGS
230
231 ID: $(HEADERS) $(SOURCES) $(LISP)
232 list='$(SOURCES) $(HEADERS)'; \
233 unique=`for i in $$list; do echo $$i; done | \
234 awk ' { files[$$0] = 1; } \
235 END { for (i in files) print i; }'`; \
236 here=`pwd` && cd $(srcdir) \
237 && mkid -f$$here/ID $$unique $(LISP)
238
239 TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
240 tags=; \
241 here=`pwd`; \
242 list='$(SUBDIRS)'; for subdir in $$list; do \
243 if test "$$subdir" = .; then :; else \
244 test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
245 fi; \
246 done; \
247 list='$(SOURCES) $(HEADERS)'; \
248 unique=`for i in $$list; do echo $$i; done | \
249 awk ' { files[$$0] = 1; } \
250 END { for (i in files) print i; }'`; \
251 test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
252 || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
253
254 mostlyclean-tags:
255
256 clean-tags:
257
258 distclean-tags:
259 -rm -f TAGS ID
260
261 maintainer-clean-tags:
262
263 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
264
265 subdir = src
266
267 distdir: $(DISTFILES)
268 @for file in $(DISTFILES); do \
269 d=$(srcdir); \
270 if test -d $$d/$$file; then \
271 cp -pr $$/$$file $(distdir)/$$file; \
272 else \
273 test -f $(distdir)/$$file \
274 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
275 || cp -p $$d/$$file $(distdir)/$$file || :; \
276 fi; \
277 done
278 for subdir in $(SUBDIRS); do \
279 if test "$$subdir" = .; then :; else \
280 test -d $(distdir)/$$subdir \
281 || mkdir $(distdir)/$$subdir \
282 || exit 1; \
283 chmod 777 $(distdir)/$$subdir; \
284 (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
285 || exit 1; \
286 fi; \
287 done
288 audio.o: audio.c
289 balls.o: balls.c lbreakout.h sdl.h tools.h misc.h list.h config.h \
290 event.h difficulty.h levels.h shrapnells.h bricks.h shots.h \
291 paddle.h balls.h
292 bricks.o: bricks.c lbreakout.h sdl.h tools.h misc.h list.h config.h \
293 levels.h player.h shrapnells.h bricks.h
294 chart.o: chart.c lbreakout.h sdl.h tools.h misc.h config.h chart.h \
295 list.h
296 config.o: config.c sdl.h config.h
297 credit.o: credit.c lbreakout.h sdl.h tools.h misc.h credit.h
298 difficulty.o: difficulty.c lbreakout.h sdl.h tools.h misc.h difficulty.h
299 editor.o: editor.c lbreakout.h sdl.h tools.h misc.h chart.h config.h \
300 event.h levels.h bricks.h extras.h frame.h game.h editor.h
301 event.o: event.c lbreakout.h sdl.h tools.h misc.h config.h event.h
302 extras.o: extras.c lbreakout.h sdl.h tools.h misc.h list.h config.h \
303 event.h shrapnells.h difficulty.h levels.h player.h bricks.h \
304 shots.h paddle.h balls.h extras.h frame.h
305 file.o: file.c list.h tools.h file.h
306 frame.o: frame.c lbreakout.h sdl.h tools.h misc.h config.h levels.h \
307 bricks.h extras.h frame.h
308 game.o: game.c lbreakout.h sdl.h tools.h misc.h list.h event.h config.h \
309 difficulty.h shrapnells.h levels.h player.h chart.h shine.h \
310 credit.h bricks.h shots.h frame.h paddle.h balls.h extras.h \
311 game.h
312 help.o: help.c lbreakout.h sdl.h tools.h misc.h event.h config.h \
313 levels.h player.h shrapnells.h bricks.h
314 hint.o: hint.c lbreakout.h sdl.h tools.h misc.h hint.h config.h
315 item.o: item.c manager.h lbreakout.h sdl.h tools.h misc.h list.h value.h \
316 item.h hint.h menu.h
317 levels.o: levels.c lbreakout.h sdl.h tools.h misc.h config.h list.h \
318 file.h levels.h
319 list.o: list.c list.h
320 main.o: main.c ../config.h lbreakout.h sdl.h tools.h misc.h file.h \
321 chart.h config.h shrapnells.h event.h levels.h game.h manager.h \
322 list.h value.h item.h hint.h menu.h editor.h help.h theme.h
323 manager.o: manager.c ../config.h manager.h lbreakout.h sdl.h tools.h \
324 misc.h list.h value.h item.h hint.h menu.h chart.h event.h \
325 config.h levels.h theme.h
326 menu.o: menu.c manager.h lbreakout.h sdl.h tools.h misc.h list.h value.h \
327 item.h hint.h menu.h
328 misc.o: misc.c lbreakout.h sdl.h tools.h misc.h config.h event.h
329 paddle.o: paddle.c lbreakout.h sdl.h tools.h misc.h config.h event.h \
330 difficulty.h levels.h bricks.h shots.h paddle.h
331 player.o: player.c levels.h lbreakout.h sdl.h tools.h misc.h player.h
332 sdl.o: sdl.c sdl.h
333 shine.o: shine.c lbreakout.h sdl.h tools.h misc.h config.h levels.h \
334 player.h shrapnells.h bricks.h shine.h
335 shots.o: shots.c lbreakout.h sdl.h tools.h misc.h config.h list.h \
336 levels.h shrapnells.h bricks.h shots.h
337 shrapnells.o: shrapnells.c lbreakout.h sdl.h tools.h misc.h config.h \
338 list.h shrapnells.h
339 theme.o: theme.c lbreakout.h sdl.h tools.h misc.h config.h list.h \
340 theme.h levels.h player.h shrapnells.h bricks.h
341 tools.o: tools.c tools.h
342 value.o: value.c manager.h lbreakout.h sdl.h tools.h misc.h list.h \
343 value.h item.h hint.h menu.h
344
345 info-am:
346 info: info-recursive
347 dvi-am:
348 dvi: dvi-recursive
349 check-am: all-am
350 check: check-recursive
351 installcheck-am:
352 installcheck: installcheck-recursive
353 install-exec-am: install-binPROGRAMS
354 install-exec: install-exec-recursive
355
356 install-data-am: install-data-local
357 install-data: install-data-recursive
358
359 install-am: all-am
360 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
361 install: install-recursive
362 uninstall-am: uninstall-binPROGRAMS uninstall-local
363 uninstall: uninstall-recursive
364 all-am: Makefile $(PROGRAMS)
365 all-redirect: all-recursive
366 install-strip:
367 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
368 installdirs: installdirs-recursive
369 installdirs-am:
370 $(mkinstalldirs) $(DESTDIR)$(bindir)
371
372
373 mostlyclean-generic:
374
375 clean-generic:
376
377 distclean-generic:
378 -rm -f Makefile $(CONFIG_CLEAN_FILES)
379 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
380
381 maintainer-clean-generic:
382 mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
383 mostlyclean-tags mostlyclean-generic
384
385 mostlyclean: mostlyclean-recursive
386
387 clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \
388 mostlyclean-am
389
390 clean: clean-recursive
391
392 distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \
393 distclean-generic clean-am
394
395 distclean: distclean-recursive
396
397 maintainer-clean-am: maintainer-clean-binPROGRAMS \
398 maintainer-clean-compile maintainer-clean-tags \
399 maintainer-clean-generic distclean-am
400 @echo "This command is intended for maintainers to use;"
401 @echo "it deletes files that may require special tools to rebuild."
402
403 maintainer-clean: maintainer-clean-recursive
404
405 .PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
406 maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
407 mostlyclean-compile distclean-compile clean-compile \
408 maintainer-clean-compile install-data-recursive \
409 uninstall-data-recursive install-exec-recursive \
410 uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
411 all-recursive check-recursive installcheck-recursive info-recursive \
412 dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
413 maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
414 distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
415 dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
416 install-exec install-data-local install-data-am install-data install-am \
417 install uninstall-local uninstall-am uninstall all-redirect all-am all \
418 installdirs-am installdirs mostlyclean-generic distclean-generic \
419 clean-generic maintainer-clean-generic clean mostlyclean distclean \
420 maintainer-clean
421
422
423 install-data-local:
424 $(mkinstalldirs) $(DESTDIR)$(inst_dir)
425 $(mkinstalldirs) $(DESTDIR)$(hi_dir)
426 if ! test -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr; then \
427 $(INSTALL_DATA) --mode=666 empty.hscr $(DESTDIR)$(hi_dir)/lbreakout2.hscr; \
428 fi;
429
430 uninstall-local:
431 rm -rf $(DESTDIR)$(inst_dir)
432 rm -f $(DESTDIR)$(hi_dir)/lbreakout2.hscr
433 rm -rf $(DESTDIR)$(doc_dir)/lbreakout2
434
435 # Tell versions [3.59,3.63) of GNU make to not export all variables.
436 # Otherwise a system limit (for SysV at least) may be exceeded.
437 .NOEXPORT:
+0
-151
src/audio.c less more
0 /***************************************************************************
1 sound.c - description
2 -------------------
3 begin : Sun Jul 29 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifdef SOUND
18
19 #include "lbreakout.h"
20 #include "audio.h"
21
22 /*
23 ====================================================================
24 If audio device was properly initiated this flag is set.
25 If this flag is not set; no action will be taken for audio.
26 ====================================================================
27 */
28 int audio_ok = 0;
29 /*
30 ====================================================================
31 If this flag is not set no sound is played.
32 ====================================================================
33 */
34 int sound_enabled = 1;
35
36 /*
37 ====================================================================
38 Initiate/close audio
39 ====================================================================
40 */
41 int audio_open()
42 {
43 if ( Mix_OpenAudio( MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 256 ) < 0 ) {
44 fprintf( stderr, "audio_open: can't open audio device: %s\n", SDL_GetError() );
45 audio_ok = 0;
46 return 0;
47 }
48 audio_ok = 1;
49 return 1;
50 }
51 void audio_close()
52 {
53 if ( !audio_ok ) return;
54 Mix_CloseAudio();
55 }
56
57 /*
58 ====================================================================
59 Sound chunk
60 ====================================================================
61 */
62 Sound_Chunk* sound_chunk_load( char *file_name )
63 {
64 char path[512];
65 Mix_Chunk *chunk = 0;
66
67 if ( !audio_ok ) {
68 fprintf( stderr,
69 "sound_chunk_load: cannot load WAV '%s' as audio device isn't initated properly\n",
70 file_name );
71 return 0;
72 }
73
74 /* use SRCDIR/sounds as source directory */
75 sprintf( path, "%s/sounds/%s", SRC_DIR, file_name );
76
77 chunk = Mix_LoadWAV( path );
78 /* didable this warning as this would occur very often when using themes
79 if ( chunk == 0 )
80 fprintf( stderr, "chunk_load: couldn't load WAV '%s': %s\n", path, SDL_GetError() );
81 */
82 return (Sound_Chunk*)chunk;
83 }
84 void sound_chunk_free( Sound_Chunk **chunk )
85 {
86 if ( !audio_ok ) return;
87 Mix_FreeChunk( (Mix_Chunk*)(*chunk) );
88 *chunk = 0;
89 }
90
91 /*
92 ====================================================================
93 Sound stuff
94 ====================================================================
95 */
96
97 /*
98 ====================================================================
99 Enable/disable sound
100 ====================================================================
101 */
102 void sound_enable( int enable )
103 {
104 if ( !audio_ok ) return;
105 sound_enabled = enable;
106 if ( !enable )
107 Mix_Pause( -1 ); /* stop all sound channels */
108 }
109 /*
110 ====================================================================
111 Set general volume of sounds. 0 - 127
112 ====================================================================
113 */
114 void sound_volume( int level )
115 {
116 if ( !audio_ok ) return;
117 if ( level < 0 ) level = 0;
118 if ( level > 127 ) level = 127;
119 Mix_Volume( -1, level ); /* all sound channels */
120 }
121 /*
122 ====================================================================
123 Play a chunk.
124 ====================================================================
125 */
126 void sound_play( Sound_Chunk *chunk )
127 {
128 if ( !audio_ok ) return;
129 if ( !sound_enabled ) return;
130 /* use first free sound channel and play sound one time */
131 Mix_PlayChannel( -1, (Mix_Chunk*)chunk, 0 );
132 }
133
134 /*
135 ====================================================================
136 Music stuff
137 ====================================================================
138 */
139
140 /*
141 ====================================================================
142 Set general volume of sounds. 0 - 127
143 ====================================================================
144 */
145 void music_volume( int level )
146 {
147 /* not implemented */
148 }
149
150 #endif
+0
-64
src/audio.h less more
0 /***************************************************************************
1 sound.h - description
2 -------------------
3 begin : Sun Jul 29 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __AUDIO_H
18 #define __AUDIO_H
19
20 #ifdef SOUND
21
22 /*
23 ====================================================================
24 Wrapper for the SDL_mixer functions.
25 ====================================================================
26 */
27
28 /*
29 ====================================================================
30 Initiate/close audio
31 ====================================================================
32 */
33 int audio_open();
34 void audio_close();
35
36 /*
37 ====================================================================
38 Sound chunk
39 ====================================================================
40 */
41 typedef Mix_Chunk Sound_Chunk;
42 Sound_Chunk* sound_chunk_load( char *file_name );
43 void sound_chunk_free( Sound_Chunk **chunk );
44
45 /*
46 ====================================================================
47 Sound stuff
48 ====================================================================
49 */
50 void sound_enable( int enable );
51 void sound_volume( int level /*0 - 127*/ );
52 void sound_play( Sound_Chunk *chunk );
53
54 /*
55 ====================================================================
56 Music stuff
57 ====================================================================
58 */
59 void music_volume( int level );
60
61 #endif
62
63 #endif
+0
-1509
src/balls.c less more
0 /***************************************************************************
1 balls.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "list.h"
19 #include "config.h"
20 #include "event.h"
21 #include "difficulty.h"
22 #include "levels.h"
23 #include "shrapnells.h"
24 #include "bricks.h"
25 #include "shots.h"
26 #include "paddle.h"
27 #include "balls.h"
28 #ifdef SOUND
29 #include "audio.h"
30 #endif
31
32 #define BALLS_IDLE_LIMIT 10000
33
34 #define TOARC(d) (((float)d/180)*M_PI)
35 #define TODEG(a) (((float)a/M_PI)*180)
36 #define VLEN(x, y) ( sqrt( (x)*(x) + (y)*(y) ) )
37 #define REC_SQRT_2 (0.707106781)
38
39 extern SDL_Surface *ball_pic; /* ball pictures */
40 extern SDL_Surface *ball_shadow;
41 int ball_pic_x_offset = 0; /* display ball at this position */
42 float ball_vhmask = 0.363970234; /* twenty degrees */
43 float ball_vvmask = 5.67128182; /* ten degrees */
44 int ball_rad = 6;
45 int ball_dia = 12;
46 int ball_w = 12;
47 int ball_h = 12;
48 List *balls = 0;
49 float ball_vm; /* v max */
50 float ball_v; /* ball's speed */
51 float ball_old_v; /* old speed (before extra used) */
52 float ball_v_add;
53 int ball_metal = 0; /* ball gets through metal */
54 int ball_weak = 0; /* 30% that a ball is unable to damage a brick */
55 int ball_expl = 0; /* like an explosibve brick a ball causes explosion */
56 float ball_metal_alpha_change = 1.2; /* pulse factor */
57 float ball_metal_alpha = 0; /* alpha of ball when blue */
58 int ball_chaos = 0; /* chaotic ball reflection */
59 extern Paddle paddle;
60 extern int paddle_resized;
61 extern SDL_Surface *offscreen;
62 extern Sdl sdl;
63 extern Config config;
64 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
65 extern int keystate[SDLK_LAST];
66 extern int buttonstate[BUTTON_COUNT];
67 extern int shadow_size;
68 #ifdef SOUND
69 extern Sound_Chunk *wav_reflect;
70 extern Sound_Chunk *wav_attach;
71 #endif
72
73 extern int active[EX_NUMBER];
74
75 extern char circle_msg[256];
76 extern Font *font;
77
78 /*
79 ====================================================================
80 Locals
81 ====================================================================
82 */
83
84 /*
85 ====================================================================
86 Return x squared
87 ====================================================================
88 */
89 float square(float x)
90 {
91 return (x * x);
92 }
93 /*
94 ====================================================================
95 Clear contents of target.
96 ====================================================================
97 */
98 void ball_clear_target( Target *t )
99 {
100 memset(t, 0, sizeof(Target));
101 t->side = SIDE_UNDEFINED;
102 }
103 /*
104 ====================================================================
105 Compute motion vector from angle and velocity
106 ====================================================================
107 */
108 void ball_compute_vec(Ball *b, float a, float v)
109 {
110 b->vel.x = sin(TOARC(a)) * v;
111 b->vel.y = cos(TOARC(a)) * v;
112 /* y-coordinates are upside down */
113 b->vel.y = -b->vel.y;
114 /* mask angles */
115 ball_mask_vel(b, b->vel.x);
116 }
117 /*
118 ====================================================================
119 Attach ball to paddle.
120 ====================================================================
121 */
122 void ball_attach( Ball *ball )
123 {
124 /* relative position */
125 ball->attached = 1;
126 ball->idle_time = ball->moving_back = ball->return_allowed = 0;
127 ball->cur.x -= paddle.x;
128 ball->cur.y -= paddle.y;
129 ball->x = (int)ball->cur.x;
130 ball->y = (int)ball->cur.y;
131 #ifdef SOUND
132 sound_play( wav_attach );
133 #endif
134 }
135 /*
136 ====================================================================
137 Reflect ball at brick assume normed perp_vector.
138 ====================================================================
139 */
140 void ball_check_brick_reflection( Ball *b )
141 {
142 float old_vx;
143 Vector n;
144 int reflect;
145 int chaos_reflect;
146
147 /* time left? */
148 if (b->t.cur_tm < b->t.time) return;
149
150 /* if the brick is destructible (thus it'll take damage)
151 * we must reset the idle time
152 */
153 if ( bricks[b->t.mx][b->t.my].dur != -1 || ( ball_metal && bricks[b->t.mx][b->t.my].type != MAP_WALL ) )
154 b->idle_time = 0;
155 /* or if it is within the last four rows and no chaotic malus is active it will
156 hit the paddle soon so reset here too */
157 if ( b->t.my >= MAP_HEIGHT - 4 && b->vel.y > 0 && !active[EX_CHAOS] )
158 b->idle_time = 0;
159
160 /* will reflect? */
161 reflect = 1;
162 if ( ball_metal && bricks[b->t.mx][b->t.my].type != MAP_WALL )
163 reflect = 0;
164
165 /* will reflect chaotic? */
166 chaos_reflect = 0;
167 if ( active[EX_CHAOS] || bricks[b->t.mx][b->t.my].type == MAP_BRICK_CHAOS )
168 chaos_reflect = 1;
169
170 /* remove brick -- if weak ball there is a 40% chance that no damage is done to the brick */
171 if ( !ball_weak || rand() % 10 < 6 ) {
172 /* if explosive ball und brick is destructible by normal means set as explosive */
173 if ( ball_expl && bricks[b->t.mx][b->t.my].dur > 0 ) {
174 bricks[b->t.mx][b->t.my].type = MAP_BRICK_EXP;
175 bricks[b->t.mx][b->t.my].dur = 1;
176 }
177 /* hit brick */
178 if ( ball_metal )
179 brick_hit( b->t.mx, b->t.my, ball_metal, SHR_BY_ENERGY_BALL, b->vel );
180 else
181 brick_hit( b->t.mx, b->t.my, ball_metal, SHR_BY_NORMAL_BALL, b->vel );
182 }
183 // if (b->t2.exists) brick_hit( b->t2.mx, b->t2.my, ball_metal, SHR_HIGH_RES );
184
185 /* we have a target and so we have a reset position and even if the ball's
186 not reflected the position must be reset */
187 b->cur.x = b->t.x; b->x = (int)b->cur.x;
188 b->cur.y = b->t.y; b->y = (int)b->cur.y;
189
190 if ( reflect ) {
191 #ifdef SOUND
192 sound_play( wav_reflect );
193 #endif
194 old_vx = b->vel.x;
195 if ( !chaos_reflect ) {
196 /* normal reflection */
197 n.x = (1 - 2 * b->t.perp_vector.x * b->t.perp_vector.x) * b->vel.x + ( - 2 * b->t.perp_vector.x * b->t.perp_vector.y) * b->vel.y;
198 n.y = ( - 2 * b->t.perp_vector.x * b->t.perp_vector.y) * b->vel.x + (1 - 2 * b->t.perp_vector.y * b->t.perp_vector.y) * b->vel.y;
199 b->vel.x = n.x;
200 b->vel.y = n.y;
201 }
202 else {
203 b->vel.x = ((float)RANDOM( -10000, 10000 )) / 10000;
204 b->vel.y = (float)(RANDOM( -10000, 10000 )) / 10000;
205 ball_mask_vel( b, old_vx );
206 }
207 }
208 /* mark target as disabled so it won't get stuck at the bottom of the screen but keep the target position so we know that we need
209 an update. */
210 b->t.exists = 0;
211 /* check targets */
212 balls_get_new_targets( b->t.mx, b->t.my );
213 shots_get_new_targets( b->t.mx, b->t.my );
214 /*if ( b->t2.exists ) {
215 balls_get_new_targets(b->t2.mx, b->t2.my);
216 shots_get_new_targets(b->t2.mx, b->t2.my);
217 }*/
218 }
219 /*
220 ====================================================================
221 Handle ball's contact with paddle: reflect at perpendicular (normed)
222 or attach.
223 ====================================================================
224 */
225 void ball_handle_paddle_contact( Ball *ball, Vector perp_vector )
226 {
227 float old_vx = ball->vel.x;
228 Vector c; /* A(perp_vector) = c; */
229
230 /* attach ball or reflect */
231 if ( paddle_slimy() ) {
232 ball_attach( ball );
233 }
234 else {
235 /* assume that perpendicular is normed */
236 /* reflect */
237 if ( perp_vector.x || perp_vector.y ) {
238 /* a simple 2x2 matrix does this for us */
239 c.x = (1 - 2 * perp_vector.x * perp_vector.x) * ball->vel.x + (-2 * perp_vector.x * perp_vector.y) * ball->vel.y;
240 c.y = (-2 * perp_vector.x * perp_vector.y) * ball->vel.x + (1 - 2 * perp_vector.y * perp_vector.y) * ball->vel.y;
241 ball->vel.x = c.x; ball->vel.y = c.y;
242 #ifdef PADDLE_FRICTION
243 /* transfer friction to ball's velocity if not convex */
244 if ( !config.convex )
245 ball->vel.x += paddle.v_x * paddle.friction;
246 #endif
247 /* adjust velocity */
248 ball_mask_vel( ball, old_vx );
249 /* or reset position if in wall */
250 if ( ball->x < BRICK_WIDTH ) {
251 ball->cur.x = BRICK_WIDTH;
252 ball->x = (int)ball->cur.x;
253 }
254 else
255 if ( ball->x + ball_dia >= sdl.screen->w - BRICK_WIDTH ) {
256 ball->cur.x = sdl.screen->w - BRICK_WIDTH - ball_dia;
257 ball->x = (int)ball->cur.x;
258 }
259 /* get new target */
260 ball_get_target( ball );
261 #ifdef SOUND
262 sound_play( wav_reflect );
263 #endif
264 }
265 else
266 fprintf( stderr, "ERROR: Can't reflect at perpendicular (0,0)!\n" );
267 }
268 }
269 /*
270 ====================================================================
271 Sorry.
272 Berechnung der Schnittpunkte der Geraden, die orthogonal zur
273 Geraden der Ballgeschwindigkeit durch den Ballmittelpunkt verläuft,
274 also der tangentialen Geschwindigkeitspunkte.
275 Der Geschwindigkeitsvektor wird auf 1 genormt. Ausgehend vom
276 Mittelpunkt wird der dazu orthogonale Vektor jeweils mit geändertem
277 Vorzeichen addiert und ergibt so die Tangentialpunkte.
278
279 If you're able and willing to translate this please send me your
280 result. ;-)
281 ====================================================================
282 */
283 void ball_get_tangents( Ball *ball, Coord *left, Coord *right )
284 {
285 Vector norm_vel = ball->vel;
286 int center_x = ball->cur.x + ball_rad, center_y = ball->cur.y + ball_rad;
287 vector_norm( &norm_vel );
288 left->x = center_x + norm_vel.y * ball_rad;
289 left->y = center_y - norm_vel.x * ball_rad;
290 right->x = center_x - norm_vel.y * ball_rad;
291 right->y = center_y + norm_vel.x * ball_rad;
292 }
293 /*
294 ====================================================================
295 Check if the ball is on paddle's level and an reflect is
296 possible (ball moves down).
297 ====================================================================
298 */
299 int ball_paddle_contact_possible( Ball *ball, Vector old )
300 {
301 if ( !paddle_solid() ) return 0;
302 if ( ball->vel.y < 0 ) return 0; /* ball moves up so no contact possible because if it was below the paddle it has been
303 reflected by the bonus floor and MUST ignore the paddle */
304 if ( ball->y + ball_dia < paddle.y ) return 0; /* above paddle */
305 if ( ball->y >= paddle.y + ( paddle.h >> 1 ) )
306 if ( old.y >= paddle.y + ( paddle.h >> 1 ) ) return 0; /* already behind paddle */
307 return 1;
308 }
309 /*
310 ====================================================================
311 Check reflection of ball at paddle. 'old' is the position of
312 the ball before update. Used to compute direction.
313 ====================================================================
314 */
315 enum { CONTACT_LEFT = 1, CONTACT_MIDDLE, CONTACT_RIGHT };
316 void ball_check_paddle_reflection( Ball *ball )
317 {
318 Line ball_line; /* balls velocity line */
319 Line paddle_line; /* paddle line */
320 Coord pt, pt2; /* auxiliary point (result of intersection) */
321 int contact = 0; /* paddle contact */
322 Vector perp_vector; /* perpendicular of ball's direction change */
323 Coord center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad }; /* center of ball */
324 Vector norm_vel; /* normed ball velocity vector */
325 /* paddle is constructed as two hemispheres at the side and a cylinder in the middle */
326 Coord right_hemi_center = { paddle.x + paddle.w - ( paddle.h >> 1 ), paddle.y + ( paddle.h >> 1 ) };
327 Coord left_hemi_center = { paddle.x + ( paddle.h >> 1 ), paddle.y + ( paddle.h >> 1 ) };
328 /* radius of hemispheres */
329 int hemi_r = ( ball_rad ) + ( paddle.h >> 1 );
330 /* if paddle's treated as convex these are the perpendiculars through the hemisphere centers */
331 Vector left_convex_perp = { 1, 1 };
332 /* paddle center */
333 Coord paddle_center = { paddle.x + ( paddle.w >> 1 ), paddle.y + ( paddle.h >> 1 ) };
334 /* center of the convex behaviour -- computed when reflecting by using
335 left/right_convex_perp and paddle_center */
336 Coord convex_center;
337 /* perpendicular line used for convex behaviour */
338 Line convex_line;
339
340 /* the simple check for the y-position of ball and paddle is done in ball_paddle_contact_possible() */
341 /* so if we got here it's possible by velocity and position of ball that it hits the paddle */
342
343 /* basic idea:
344 The paddle is constructed of a middle rectangle and two hemispheres.
345 We check the center line of the ball with the imaginary paddle that's size
346 is paddle_size + ball_rad. The intersection with this paddle is the reset point
347 for the ball at the same time (if slimy).
348 The perpendicular is computed as convex thing. (overwrites the perpendicular
349 set by the reflection)
350 */
351 /* ball line */
352 line_set( &ball_line, center.x, center.y, ball->vel.y / ball->vel.x );
353 /* imaginary paddle upper line -- we'll decide at intersection which hemipshere to check */
354 line_set_hori( &paddle_line, paddle.y - ball_rad );
355 line_intersect( &paddle_line, &ball_line, &pt );
356 if ( pt.x < left_hemi_center.x ) {
357 /* intersect left */
358 norm_vel = ball->vel; vector_norm( &norm_vel );
359 if ( circle_intersect( left_hemi_center, hemi_r,
360 center, norm_vel,
361 &pt, &pt2 ) ) {
362 if ( VEC_DIST( center, left_hemi_center ) <= hemi_r ) {
363 /* use the higher point as this is the upper intersection */
364 if ( pt.y > pt2.y ) pt = pt2;
365 /* use vector between hemi_sphere center and ball center as reflection */
366 perp_vector = vector_get( center.x - left_hemi_center.x,
367 center.y - left_hemi_center.y );
368 vector_norm( &perp_vector );
369 /* had contact */
370 contact = CONTACT_LEFT;
371 }
372 }
373 }
374 else
375 if ( pt.x > right_hemi_center.x ) {
376 /* intersect right */
377 norm_vel = ball->vel; vector_norm( &norm_vel );
378 if ( circle_intersect( right_hemi_center, hemi_r,
379 center, norm_vel,
380 &pt, &pt2 ) ) {
381 if ( VEC_DIST( center, right_hemi_center ) <= hemi_r ) {
382 /* use the higher point as this is the upper intersection */
383 if ( pt.y > pt2.y ) pt = pt2;
384 /* use vector between hemi_sphere center and ball center as reflection */
385 perp_vector = vector_get( center.x - right_hemi_center.x,
386 center.y - right_hemi_center.y );
387 vector_norm( &perp_vector );
388 /* had contact */
389 contact = CONTACT_RIGHT;
390 }
391 }
392 }
393 else {
394 contact = CONTACT_MIDDLE; /* contact with middle part */
395 perp_vector = vector_get( 0, 1 ); /* reflect at horizontal line */
396 }
397 /* if we got here 'pt' contains the intersection with the imaginary paddle so reset ball
398 to this position */
399 if ( contact ) {
400 /* reset idle time */
401 ball->idle_time = 0;
402 /* reset position if ball will be attached */
403 if ( paddle_slimy() ) {
404 ball->cur.x = pt.x - ( ball_rad );
405 ball->cur.y = pt.y - ( ball_rad );
406 ball->x = (int)ball->cur.x; ball->y = (int)ball->cur.y;
407 }
408 /* convex perpendicular */
409 if ( config.convex ) {
410 line_set_vert( &paddle_line, paddle_center.x );
411 line_set( &convex_line, left_hemi_center.x, left_hemi_center.y,
412 vector_monotony( left_convex_perp ) );
413 line_intersect( &paddle_line, &convex_line, &convex_center );
414 /* get actual perp_vector */
415 perp_vector.x = pt.x - convex_center.x;
416 perp_vector.y = pt.y - convex_center.y;
417 }
418 /* handle contact: attach, reflect, sound... */
419 ball_handle_paddle_contact( ball, perp_vector );
420 }
421 }
422 /*
423 ====================================================================
424 Intersect ball line with imaginary brick line.
425 Use target's map position and
426 set reset position (centered) and perp_vector of target.
427 ball_rad is substracted later in ball_get_target()
428 ====================================================================
429 */
430 enum { LINE_HORI = 0, LINE_VERT };
431 int check_line( Line *ball_line, int type, int anchor, int range_start, int range_end, Coord *pt ) {
432 Line line;
433 if ( type == LINE_HORI )
434 line_set_hori( &line, anchor );
435 else
436 line_set_vert( &line, anchor );
437 line_intersect( &line, ball_line, pt );
438 if ( type == LINE_HORI ) {
439 if ( pt->x >= range_start && pt->x <= range_end ) return 1;
440 return 0;
441 }
442 else {
443 if ( pt->y >= range_start && pt->y <= range_end ) return 1;
444 return 0;
445 }
446 }
447 void ball_intersect_brick( Ball *ball, Target *target )
448 {
449 Line ball_line;
450 Coord pt; /* auxiliary point */
451 int x = target->mx * BRICK_WIDTH, y = target->my * BRICK_HEIGHT; /* left upper corner of brick */
452 int intersect = 0; /* intersected? */
453
454 /* ball_line */
455 line_set( &ball_line, ball->cur.x + ball_rad, ball->cur.y + ball_rad, ball->vel.y / ball->vel.x );
456
457 if ( ball->vel.x > 0 ) {
458 /* left */
459 if ( check_line( &ball_line,
460 LINE_VERT,
461 x - ball_rad,
462 y - ball_rad, y + BRICK_HEIGHT + ball_rad,
463 &pt ) ) {
464 intersect = 1;
465 target->perp_vector = vector_get( 1, 0 );
466 }
467 }
468 else {
469 /* right */
470 if ( check_line( &ball_line,
471 LINE_VERT,
472 x + BRICK_WIDTH + ball_rad,
473 y - ball_rad, y + BRICK_HEIGHT + ball_rad,
474 &pt ) ) {
475 intersect = 1;
476 target->perp_vector = vector_get( 1, 0 );
477 }
478 }
479 if ( !intersect ) {
480 if ( ball->vel.y > 0 ) {
481 /* top */
482 if ( check_line( &ball_line,
483 LINE_HORI,
484 y - ball_rad,
485 x - ball_rad, x + BRICK_WIDTH + ball_rad,
486 &pt ) ) {
487 intersect = 1;
488 target->perp_vector = vector_get( 0, 1 );
489 }
490 }
491 else {
492 /* bottom */
493 if ( check_line( &ball_line,
494 LINE_HORI,
495 y + BRICK_HEIGHT + ball_rad,
496 x - ball_rad, x + BRICK_WIDTH + ball_rad,
497 &pt ) ) {
498 intersect = 1;
499 target->perp_vector = vector_get( 0, 1 );
500 }
501 }
502 }
503 /* intersected */
504 if ( intersect ) {
505 target->x = pt.x;
506 target->y = pt.y;
507 /* perp_vector is set */
508 }
509 }
510 /*
511 ====================================================================
512 Reflect ball at target at target->side and set perp_vector
513 and reset position x,y.
514 ====================================================================
515 */
516 void ball_reflect_at_side( Ball *ball, Target *target )
517 {
518 Line ball_line;
519 Line brick_line;
520 Coord pt;
521 /* ball line */
522 line_set( &ball_line, ball->cur.x + ball_rad, ball->cur.y + ball_rad, ball->vel.y / ball->vel.x );
523 /* brick line and perp vector */
524 switch ( target->side ) {
525 case SIDE_LEFT:
526 line_set_vert( &brick_line, target->mx * BRICK_WIDTH - ball_rad );
527 target->perp_vector = vector_get( 1, 0 );
528 break;
529 case SIDE_RIGHT:
530 line_set_vert( &brick_line, target->mx * BRICK_WIDTH + BRICK_WIDTH + ball_rad );
531 target->perp_vector = vector_get( 1, 0 );
532 break;
533 case SIDE_TOP:
534 line_set_hori( &brick_line, target->my * BRICK_HEIGHT - ball_rad );
535 target->perp_vector = vector_get( 0, 1 );
536 break;
537 case SIDE_BOTTOM:
538 line_set_hori( &brick_line, target->my * BRICK_HEIGHT + BRICK_HEIGHT + ball_rad );
539 target->perp_vector = vector_get( 0, 1 );
540 break;
541 default:
542 fprintf( stderr, "Unknown side: %i\n", target->side );
543 break;
544 }
545 /* intersect, it's already assured that we hit this brick so just get the reset position */
546 line_intersect( &brick_line, &ball_line, &pt );
547 target->x = pt.x;
548 target->y = pt.y;
549 }
550 /*
551 ====================================================================
552 Reflect ball at target but ignore target::side and reflect at
553 corner instead.
554 ====================================================================
555 */
556 void ball_reflect_at_corner( Ball *ball, Target *target, int corner )
557 {
558 Coord corner_center; /* center of corner circle */
559 Coord ball_center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad };
560 Vector norm_vel = ball->vel;
561 Coord pt, pt2; /* intersection points */
562 /* norm velocity */
563 vector_norm( &norm_vel );
564 /* set up center of corner */
565 switch ( corner ) {
566 case CORNER_UPPER_LEFT:
567 corner_center = vector_get( target->mx * BRICK_WIDTH, target->my * BRICK_HEIGHT );
568 break;
569 case CORNER_UPPER_RIGHT:
570 corner_center = vector_get( target->mx * BRICK_WIDTH + BRICK_WIDTH - 1, target->my * BRICK_HEIGHT );
571 break;
572 case CORNER_LOWER_LEFT:
573 corner_center = vector_get( target->mx * BRICK_WIDTH, target->my * BRICK_HEIGHT + BRICK_HEIGHT - 1);
574 break;
575 case CORNER_LOWER_RIGHT:
576 corner_center = vector_get( target->mx * BRICK_WIDTH + BRICK_WIDTH - 1, target->my * BRICK_HEIGHT + BRICK_HEIGHT - 1);
577 break;
578 }
579 /* intersect */
580 circle_intersect( corner_center, ball_rad + 2, ball_center, norm_vel, &pt, &pt2 );
581 /* use nearest point for reset and perp vector */
582 if ( VEC_DIST( ball_center, pt ) < VEC_DIST( ball_center, pt2 ) ) {
583 target->x = pt.x;
584 target->y = pt.y;
585 }
586 else {
587 target->x = pt2.x;
588 target->y = pt2.y;
589 }
590 /* don't use the real perp vector but assume a 45 degree angle */
591 switch ( corner ) {
592 case CORNER_UPPER_LEFT:
593 case CORNER_LOWER_RIGHT:
594 target->perp_vector = vector_get( REC_SQRT_2, REC_SQRT_2 );
595 break;
596 case CORNER_UPPER_RIGHT:
597 case CORNER_LOWER_LEFT:
598 target->perp_vector = vector_get( REC_SQRT_2, -REC_SQRT_2 );
599 break;
600 }
601 }
602 /*
603 ====================================================================
604 Reflect ball at target ball:t and decide by ball::t::side wether
605 to use reflect_at_side or reflect_at_corner.
606 ====================================================================
607 */
608 void ball_reflect( Ball *ball )
609 {
610 if ( !ball->t.exists ) return;
611 if ( ball->t.side <= SIDE_LEFT )
612 ball_reflect_at_side( ball, &ball->t );
613 else
614 ball_reflect_at_corner( ball, &ball->t, ball->t.side );
615 }
616
617 /*
618 ====================================================================
619 Check if ball hit a corner and update target's side.
620 ====================================================================
621 */
622 void corner_check( Ball *ball, Target *target_left_tang, Target *target_right_tang, Target *target ) {
623 /* balls moving ... */
624 if ( ball->vel.y > 0 ) {
625 if ( ball->vel.x < 0 ) {
626 /* ... down left */
627 if ( target == target_right_tang && target->side == SIDE_TOP ) target->side = CORNER_UPPER_RIGHT;
628 if ( target == target_left_tang && target->side == SIDE_RIGHT ) target->side = CORNER_UPPER_RIGHT;
629 }
630 else {
631 /* ... down right */
632 if ( target == target_left_tang && target->side == SIDE_TOP ) target->side = CORNER_UPPER_LEFT;
633 if ( target == target_right_tang && target->side == SIDE_LEFT ) target->side = CORNER_UPPER_LEFT;
634 }
635 }
636 else {
637 if ( ball->vel.x < 0 ) {
638 /* ... up left */
639 if ( target == target_right_tang && target->side == SIDE_RIGHT ) target->side = CORNER_LOWER_RIGHT;
640 if ( target == target_left_tang && target->side == SIDE_BOTTOM ) target->side = CORNER_LOWER_RIGHT;
641 }
642 else {
643 /* ... up right */
644 if ( target == target_left_tang && target->side == SIDE_LEFT ) target->side = CORNER_LOWER_LEFT;
645 if ( target == target_right_tang && target->side == SIDE_BOTTOM ) target->side = CORNER_LOWER_LEFT;
646 }
647 }
648 }
649
650 /*
651 ====================================================================
652 Public
653 ====================================================================
654 */
655
656 /*
657 ====================================================================
658 Load/delete ball graphics
659 ====================================================================
660 */
661 void ball_load()
662 {
663 balls = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
664 }
665 void ball_delete()
666 {
667 if ( balls ) list_delete( balls ); balls = 0;
668 }
669 /*
670 ====================================================================
671 Create ball at position with starting angle and velocity
672 ====================================================================
673 */
674 Ball* ball_create( int x, int y, float a, float v )
675 {
676 Ball *b = calloc( 1, sizeof( Ball ) );
677 b->cur.x = x;
678 b->x = x;
679 b->cur.y = y;
680 b->y = y;
681 b->attached = 0;
682 b->idle_time = 0;
683 b->moving_back = 0;
684 b->return_allowed = 0;
685 ball_compute_vec(b, a, v);
686 ball_clear_target(&b->t);
687 ball_clear_target(&b->t2);
688 return b;
689 }
690 /*
691 ====================================================================
692 Set a special ball property like metal ball.
693 ====================================================================
694 */
695 void balls_set_type( int type )
696 {
697 ball_metal = 0;
698 ball_expl = 0;
699 ball_weak = 0;
700 switch ( type ) {
701 case BALL_NORMAL:
702 ball_pic_x_offset = 0;
703 break;
704 case BALL_METAL:
705 ball_metal = 1;
706 ball_pic_x_offset = ball_w;
707 ball_metal_alpha = 0;
708 if ( ball_metal_alpha_change < 0 )
709 ball_metal_alpha_change = -ball_metal_alpha_change;
710 break;
711 case BALL_EXPL:
712 ball_expl = 1;
713 ball_pic_x_offset = ball_w + ball_w;
714 break;
715 case BALL_WEAK:
716 ball_weak = 1;
717 ball_pic_x_offset = ball_w + ball_w + ball_w;
718 break;
719 }
720 }
721 /*
722 ====================================================================
723 Set chaotic behaviour (random relfection)
724 ====================================================================
725 */
726 void balls_set_chaos( int chaos )
727 {
728 ball_chaos = chaos;
729 }
730 /*
731 ====================================================================
732 Clear ball list and attach one ball to paddle
733 ====================================================================
734 */
735 void balls_reset()
736 {
737 Ball *ball;
738 list_clear( balls );
739 ball = ball_create((paddle.w - ball_w) / 2, -ball_dia, (rand() % 120) - 60, ball_v);
740 ball->attached = 1;
741 list_add( balls, ball );
742 balls_set_type( BALL_NORMAL );
743 }
744 /*
745 ====================================================================
746 Initate velocity values (for all balls one value )
747 ====================================================================
748 */
749 void balls_set_vel( float v_start, float v_change, float v_max )
750 {
751 ball_v = v_start;
752 ball_vm = v_max;
753 ball_v_add = v_change;
754 }
755 /*
756 ====================================================================
757 Show/hide all balls
758 ====================================================================
759 */
760 void balls_hide()
761 {
762 List_Entry *entry = balls->head.next;
763 Ball *b;
764 int bx, by;
765 int w = ball_w, h = ball_h;
766 if ( config.shadow ) { w += shadow_size; h += shadow_size; }
767 while ( entry != &balls->tail ) {
768 b = entry->item;
769 /* balls position; add paddle pos if attached */
770 bx = b->x;
771 by = b->y;
772 if (b->attached) {
773 bx += paddle.x;
774 by += paddle.y;
775 }
776 /* put background */
777 DEST(sdl.screen, bx, by, w, h);
778 SOURCE(offscreen, bx, by);
779 blit_surf();
780 add_refresh_rect(bx, by, w, h );
781 entry = entry->next;
782 }
783 }
784 void balls_show()
785 {
786 List_Entry *entry = balls->head.next;
787 Ball *b;
788 int bx, by;
789 int mx, my;
790 while ( entry != &balls->tail ) {
791 b = entry->item;
792 /* balls position; add paddle pos if attached */
793 bx = b->x;
794 by = b->y;
795 if (b->attached) {
796 bx += paddle.x;
797 by += paddle.y;
798 }
799 /* show ball -- no shadow if darkness -- no shadow if going back home */
800 if ( config.shadow && !active[EX_DARKNESS] && !b->moving_back ) {
801 set_surf_clip( sdl.screen, 0, 0, sdl.screen->w - BRICK_WIDTH, sdl.screen->h );
802 DEST(sdl.screen, bx + shadow_size, by + shadow_size, ball_w, ball_h);
803 SOURCE(ball_shadow, 0, 0);
804 if ( ball_metal )
805 alpha_blit_surf( ball_metal_alpha );
806 else
807 alpha_blit_surf( SHADOW_ALPHA );
808 /* redraw nearby bricks */
809 set_surf_clip( sdl.screen, bx + shadow_size, by + shadow_size, ball_w, ball_h );
810 /* check the three outer ocrners of the shadow if there's a brick */
811 mx = ( bx + shadow_size + ball_w ) / BRICK_WIDTH;
812 my = ( by + shadow_size ) / BRICK_HEIGHT;
813 if ( my < MAP_HEIGHT - 1 )
814 if ( mx < MAP_WIDTH - 1 && bricks[mx][my].type != MAP_EMPTY )
815 brick_draw( sdl.screen, mx, my, 0 );
816 mx = ( bx + shadow_size + ball_w ) / BRICK_WIDTH;
817 my = ( by + shadow_size + ball_h ) / BRICK_HEIGHT;
818 if ( my < MAP_HEIGHT - 1 )
819 if ( mx < MAP_WIDTH - 1 && bricks[mx][my].type != MAP_EMPTY )
820 brick_draw( sdl.screen, mx, my, 0 );
821 mx = ( bx + shadow_size ) / BRICK_WIDTH;
822 my = ( by + shadow_size + ball_h ) / BRICK_HEIGHT;
823 if ( my < MAP_HEIGHT - 1 )
824 if ( mx < MAP_WIDTH - 1 && bricks[mx][my].type != MAP_EMPTY )
825 brick_draw( sdl.screen, mx, my, 0 );
826 set_surf_clip( sdl.screen, 0, 0, 0, 0 );
827 }
828 DEST(sdl.screen, bx, by, ball_w, ball_h);
829 SOURCE(ball_pic, ball_pic_x_offset, 0);
830 if ( ball_metal ) {
831 alpha_blit_surf( ball_metal_alpha );
832 }
833 else {
834 if ( !active[EX_DARKNESS] ) {
835 if ( b->moving_back )
836 alpha_blit_surf( 128 );
837 else
838 blit_surf();
839 }
840 else
841 alpha_blit_surf( 128 );
842 }
843 if ( config.shadow )
844 add_refresh_rect(bx, by, ball_w + shadow_size, ball_h + shadow_size);
845 else
846 add_refresh_rect(bx, by, ball_w, ball_h);
847 entry = entry->next;
848 }
849 }
850 void balls_alphashow( int alpha )
851 {
852 List_Entry *entry = balls->head.next;
853 Ball *b;
854 int bx, by;
855 while ( entry != &balls->tail ) {
856 b = entry->item;
857 /* balls position; add paddle pos if attached */
858 bx = b->x;
859 by = b->y;
860 if (b->attached) {
861 bx += paddle.x;
862 by += paddle.y;
863 }
864 /* show ball */
865 DEST(sdl.screen, bx, by, ball_w, ball_h);
866 SOURCE(ball_pic, ball_pic_x_offset, 0);
867 alpha_blit_surf( alpha );
868 add_refresh_rect(bx, by, ball_w, ball_h);
869 entry = entry->next;
870 }
871 }
872 /*
873 ====================================================================
874 Update balls and detach attached balls if fire was pressed.
875 Return False if all balls are lost.
876 ====================================================================
877 */
878 int balls_update( int ms )
879 {
880 List_Entry *entry = balls->head.next;
881 Ball *b;
882 Vector old; /* old position of ball before update */
883 /* modify alpha when metal */
884 if ( ball_metal && config.trp ) {
885 ball_metal_alpha += ball_metal_alpha_change * ms;
886 if ( ball_metal_alpha >= 255 || ball_metal_alpha <= 0 ) {
887 ball_metal_alpha_change = -ball_metal_alpha_change;
888 if ( ball_metal_alpha < 0 ) ball_metal_alpha = 0;
889 if ( ball_metal_alpha > 255 ) ball_metal_alpha = 255;
890 }
891 }
892 while ( entry != &balls->tail ) {
893 b = entry->item;
894 old.x = b->cur.x;
895 old.y = b->cur.y;
896 /* adjust position if paddle_resize and attached */
897 if ( b->attached && paddle_resized ) {
898 if ( paddle_resized < 0 ) {
899 /* shrinked */
900 if ( b->cur.x > ( paddle.w >> 1 ) ) {
901 b->cur.x -= 2;
902 b->x = (int)b->cur.x;
903 }
904 }
905 else {
906 /* expanded */
907 if ( b->cur.x > ( paddle.w >> 1 ) ) {
908 b->cur.x += 2;
909 b->x = (int)b->cur.x;
910 }
911 }
912 }
913 /* fire balls */
914 if (b->attached && (buttonstate[LEFT_BUTTON] || buttonstate[RIGHT_BUTTON]|| keystate[config.k_fire])) {
915 /* if not in wall */
916 if (b->x + paddle.x >= BRICK_WIDTH && b->x + ball_dia + paddle.x < sdl.screen->w - BRICK_WIDTH) {
917 /* release ball */
918 #ifdef SOUND
919 #endif
920 b->attached = 0;
921 b->moving_back = b->idle_time = b->return_allowed = 0;
922 b->x += paddle.x;
923 b->y += paddle.y;
924 b->cur.x = b->x;
925 b->cur.y = b->y;
926 if (buttonstate[LEFT_BUTTON])
927 ball_compute_vec(b, -50, ball_v);
928 else
929 ball_compute_vec(b, 50, ball_v);
930 ball_get_target(b);
931 }
932 }
933 /* update ball when moving back */
934 if ( b->moving_back ) {
935 /* update velocity */
936 b->vel.x = ( paddle.x + ( paddle.w >> 1 ) ) - ( b->cur.x + ball_rad );
937 b->vel.y = ( paddle.y - ball_rad + 2 ) - ( b->cur.y + ball_rad );
938 ball_adjust_vel( b, ball_vm );
939 /* new position */
940 b->cur.x += b->vel.x * ms;
941 b->cur.y += b->vel.y * ms;
942 b->x = (int)b->cur.x;
943 b->y = (int)b->cur.y;
944 /* check if paddle is reached and attach the ball */
945 if ( b->x + ball_rad >= paddle.x && b->x + ball_rad < paddle.x + paddle.w )
946 if ( b->y + ball_dia >= paddle.y && b->y + ball_dia < paddle.y + paddle.h ) {
947 b->cur.x = paddle.x + ( paddle.w >> 1 ) - ball_rad;
948 b->cur.y = paddle.y - ball_dia;
949 b->x = (int)b->cur.x;
950 b->y = (int)b->cur.y;
951 ball_attach( b );
952 }
953 }
954 /* update ball if not attached and not moving back */
955 if (!b->attached && !b->moving_back) {
956 /* increase idle time -- paddle and brick_check will reset this value */
957 if ( !b->return_allowed )
958 b->idle_time += ms;
959 /* new position */
960 b->cur.x += b->vel.x * ms;
961 b->cur.y += b->vel.y * ms;
962 b->x = (int)b->cur.x;
963 b->y = (int)b->cur.y;
964 /* check if reflected by paddle */
965 if ( ball_paddle_contact_possible( b, old ) ) ball_check_paddle_reflection( b );
966 /* or by brick */
967 /* quick hack to handle the case when the ball was just attached but touches the wall and the
968 slimy paddle in the same instant. - Patrick Hohmeyer 19.12.01 */
969 if ( b->t.exists && !b->attached ) {
970 b->t.cur_tm += ms;
971 ball_check_brick_reflection(b);
972 }
973 /* check if idle time is above limit and the ball has a target because if there
974 * is no target the ball moves out of the window and should not go back to the
975 * paddle as it's moving into this direction by itself
976 */
977 if ( b->idle_time >= BALLS_IDLE_LIMIT && !b->return_allowed && b->t.exists ) {
978 /* okay send this ball back home or allow to do so by click */
979 if ( !config.return_on_click ) {
980 b->idle_time = 0;
981 b->moving_back = 1;
982 b->t.exists = 0; /* no target */
983 }
984 else {
985 b->idle_time = 0;
986 b->return_allowed = 1;
987 }
988 }
989 }
990 entry = entry->next;
991 /* delete ball if outside of window */
992 if (!b->attached && (b->x >= sdl.screen->w || b->x + ball_dia < 0 || b->y >= sdl.screen->h))
993 list_delete_entry( balls, entry->prev );
994 }
995 /* clear paddle_resize flag */
996 paddle_resized = 0;
997 /* all balls lost?*/
998 return !list_empty( balls );
999 }
1000 /*
1001 ====================================================================
1002 Compute new targets for all balls (as bricks where destroyed
1003 meanwhile by other balls or shots)
1004 ====================================================================
1005 */
1006 void balls_get_new_targets( int mx, int my )
1007 {
1008 Ball *ball;
1009 int reset = 0;
1010 list_reset( balls );
1011 while ( ( ball = list_next( balls ) ) )
1012 if ( !ball->attached && !ball->moving_back )
1013 if ( mx == -1 || ( ball->t.mx == mx && ball->t.my == my ) ) {
1014 /*
1015 * As we don't have a constant velocity but assume one it is possible that
1016 * the ball is within a wall when this function is called because it actually
1017 * passed it's reset position without time expiration because of the velocity
1018 * change. So we have to check here if it is already behind this position and if so
1019 * simply reset here. This doesn't hurt as this would happen before reflection, too.
1020 */
1021 if ( ball->t.exists ) {
1022 if ( ball->vel.y > 0 ) {
1023 if ( ball->cur.y > ball->t.y )
1024 reset = 1;
1025 }
1026 else {
1027 if ( ball->cur.y < ball->t.y )
1028 reset = 1;
1029 }
1030 if ( ball->vel.x > 0 ) {
1031 if ( ball->cur.x > ball->t.x )
1032 reset = 1;
1033 }
1034 else {
1035 if ( ball->cur.x < ball->t.x )
1036 reset = 1;
1037 }
1038 if ( reset ) {
1039 ball->cur.x = ball->t.x;
1040 ball->cur.y = ball->t.y;
1041 ball->x = (int)ball->cur.x;
1042 ball->y = (int)ball->cur.y;
1043 }
1044 }
1045 /* get target */
1046 ball_get_target(ball);
1047 }
1048 }
1049 /*
1050 ====================================================================
1051 Adjust ball's velocity to passed velocity
1052 ====================================================================
1053 */
1054 void ball_adjust_vel(Ball *b, float v)
1055 {
1056 float d = sqrt(b->vel.x * b->vel.x + b->vel.y * b->vel.y);
1057 b->vel.x /= d; b->vel.y /= d;
1058 b->vel.x *= v; b->vel.y *= v;
1059 }
1060 /*
1061 ====================================================================
1062 Adjust velocity of ball to spare out any illegal values
1063 ====================================================================
1064 */
1065 void ball_mask_vel(Ball *b, float old_vx)
1066 {
1067 float m;
1068
1069 /* b->vel.x == 0 would cause seg faults */
1070 if (b->vel.x == 0) {
1071 if (old_vx < 0)
1072 b->vel.x = 0.01;
1073 else
1074 b->vel.x = -0.01;
1075 }
1076 /* avoid 45° angles */
1077 if (b->vel.x == b->vel.y)
1078 b->vel.x *= 0.99;
1079
1080 m = b->vel.y / b->vel.x;
1081
1082 /* mask angles from 70 to 110 and -110 to -70 */
1083 if (fabs(m) < ball_vhmask) {
1084 if (b->vel.y < 0)
1085 b->vel.y = fabs(ball_vhmask * b->vel.x) * -1;
1086 else
1087 b->vel.y = fabs(ball_vhmask * b->vel.x);
1088 }
1089 /* mask angles from -10 to 10 and 170 to 190 */
1090 if (fabs(m) > ball_vvmask) {
1091 if (b->vel.x < 0)
1092 b->vel.x = fabs(b->vel.y / ball_vvmask) * -1;
1093 else
1094 b->vel.x = fabs(b->vel.y / ball_vvmask);
1095 }
1096 /* adjust speed */
1097 ball_adjust_vel(b, ball_v);
1098 }
1099 /*
1100 ====================================================================
1101 Get target for a ball.
1102 ====================================================================
1103 */
1104 enum { TANG_LEFT = 0, TANG_RIGHT };
1105 enum { DIR_UP = 0, DIR_DOWN, DIR_LEFT, DIR_RIGHT };
1106 void ball_get_target( Ball *ball )
1107 {
1108 int i;
1109 int cur_tang;
1110 float mono; /* monotony */
1111 Coord tang_pts[2]; /* tangential points */
1112 Line tang; /* current tangent */
1113 Coord center = { ball->cur.x + ball_rad, ball->cur.y + ball_rad }; /* ball center */
1114 int start, end, dir, line_pos, change; /* used to intersect the brick grid */
1115 Line cur_line; /* dito */
1116 Coord pt; /* auxiliary point. used for this 'n' that */
1117 Target targets[2]; /* targets hit by the tangents: nearest is the actual target */
1118 Target hori_target[2], vert_target[2]; /* used to get target of tangent */
1119 float dist; /* distance between two points */
1120 Vector norm_vel; /* normed ball velocity */
1121 int corner = -1; /* id of corner sued for corner reflection */
1122 #ifdef WITH_BUG_REPORT
1123 char tang_target_chosen_str[2][128]; /* either hori or vert target chosen */
1124 char side_str[128];
1125 #endif
1126 Target *prim, *sec; /* primary, secondary target */
1127 int maybe_corner;
1128
1129 #ifdef WITH_BUG_REPORT
1130 side_str[0] = 0;
1131 #endif
1132
1133 /* balls moving back to paddle must not be reflected */
1134 if ( ball->moving_back ) return;
1135 /* attached balls MUST NOT be reflected!!!! */
1136 if ( ball->attached ) return;
1137 /* balls already out of the screen though still visible don't need new reflection, too */
1138 if ( ball->cur.y + ball_dia >= sdl.screen->h - 1 ) return;
1139
1140 /* clear ball targets */
1141 ball_clear_target( &ball->t );
1142 ball_clear_target( &ball->t2 );
1143 ball_clear_target( &targets[TANG_LEFT] );
1144 ball_clear_target( &targets[TANG_RIGHT] );
1145 /* monotony */
1146 mono = ball->vel.y / ball->vel.x;
1147 /* normed velocity */
1148 norm_vel = ball->vel; vector_norm( &norm_vel );
1149 /* tangential points */
1150 ball_get_tangents( ball, &tang_pts[TANG_LEFT], &tang_pts[TANG_RIGHT] );
1151 /* get all map bricks the tangents intersect and check target */
1152 for ( cur_tang = 0; cur_tang < 2; cur_tang++ ) {
1153 /* clear targets */
1154 ball_clear_target( &hori_target[cur_tang] );
1155 ball_clear_target( &vert_target[cur_tang] );
1156 /* current tangent */
1157 line_set( &tang, tang_pts[cur_tang].x, tang_pts[cur_tang].y, mono );
1158 /* intersect horizontal lines */
1159 /* get direction */
1160 dir = DIR_DOWN;
1161 if ( ball->vel.y < 0 ) dir = DIR_UP;
1162 /* get starting line */
1163 start = ((int)( tang_pts[cur_tang].y / BRICK_HEIGHT )) * BRICK_HEIGHT;
1164 /* get end line */
1165 if ( dir == DIR_UP )
1166 end = 0;
1167 else
1168 end = ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT;
1169 /* adjust lines if ball moves up */
1170 if ( dir == DIR_UP ) {
1171 start += BRICK_HEIGHT - 1;
1172 end += BRICK_HEIGHT - 1;
1173 }
1174 /* get position change */
1175 change = BRICK_HEIGHT;
1176 if ( dir == DIR_UP ) change = -change;
1177 /* we're at this brick so we can't reflect here */
1178 start += change;
1179 /* intersect */
1180 line_pos = start;
1181 /* end specifies the last line to be checked to we have to add
1182 another line to state the break condition.
1183 this last line is not checked */
1184 end += change;
1185 while ( line_pos != end ) {
1186 line_set_hori( &cur_line, line_pos );
1187 if ( line_intersect( &cur_line, &tang, &pt ) && ( pt.x >= 0 && pt.x < sdl.screen->w ) )
1188 if ( bricks[(int)pt.x / BRICK_WIDTH][(int)pt.y / BRICK_HEIGHT].type != MAP_EMPTY ) {
1189 /* we got our horizontal target */
1190 hori_target[cur_tang].exists = 1;
1191 hori_target[cur_tang].x = pt.x;
1192 hori_target[cur_tang].y = pt.y;
1193 hori_target[cur_tang].mx = pt.x / BRICK_WIDTH;
1194 hori_target[cur_tang].my = pt.y / BRICK_HEIGHT;
1195 if ( ball->vel.y < 0 )
1196 hori_target[cur_tang].side = SIDE_BOTTOM;
1197 else
1198 hori_target[cur_tang].side = SIDE_TOP;
1199 break; /* we got our target for this tangent */
1200 }
1201 line_pos += change;
1202 }
1203 /* intersect vertical lines */
1204 /* get direction */
1205 dir = DIR_RIGHT;
1206 if ( ball->vel.x < 0 ) dir = DIR_LEFT;
1207 /* get starting line */
1208 start = ((int)( tang_pts[cur_tang].x / BRICK_WIDTH )) * BRICK_WIDTH;
1209 /* get end line */
1210 if ( dir == DIR_LEFT )
1211 end = 0;
1212 else
1213 end = ( MAP_WIDTH - 1 ) * BRICK_WIDTH;
1214 /* adjust lines if ball moves up */
1215 if ( dir == DIR_LEFT ) {
1216 start += BRICK_WIDTH - 1;
1217 end += BRICK_WIDTH - 1;
1218 }
1219 /* get position change */
1220 change = BRICK_WIDTH;
1221 if ( dir == DIR_LEFT ) change = -change;
1222 /* we're at this brick so we can't reflect here */
1223 start += change;
1224 /* intersect */
1225 line_pos = start;
1226 /* end specifies the last line to be checked too we have to add
1227 another line to state the break condition.
1228 this last line is not checked */
1229 end += change;
1230 while ( line_pos != end ) {
1231 line_set_vert( &cur_line, line_pos );
1232 if ( line_intersect( &cur_line, &tang, &pt ) && ( pt.y >= 0 && pt.y < sdl.screen->h ) )
1233 if ( bricks[(int)pt.x / BRICK_WIDTH][(int)pt.y / BRICK_HEIGHT].type != MAP_EMPTY ) {
1234 /* we got our vertical target */
1235 vert_target[cur_tang].exists = 1;
1236 vert_target[cur_tang].x = pt.x;
1237 vert_target[cur_tang].y = pt.y;
1238 vert_target[cur_tang].mx = pt.x / BRICK_WIDTH;
1239 vert_target[cur_tang].my = pt.y / BRICK_HEIGHT;
1240 if ( ball->vel.x < 0 )
1241 vert_target[cur_tang].side = SIDE_RIGHT;
1242 else
1243 vert_target[cur_tang].side = SIDE_LEFT;
1244 break; /* we got our target for this tangent */
1245 }
1246 line_pos += change;
1247 }
1248 /* get closest target */
1249 if ( !hori_target[cur_tang].exists ) {
1250 targets[cur_tang] = vert_target[cur_tang];
1251 #ifdef WITH_BUG_REPORT
1252 if ( !vert_target[cur_tang].exists )
1253 sprintf( tang_target_chosen_str[cur_tang], "No target chosen." );
1254 else
1255 sprintf( tang_target_chosen_str[cur_tang], "Vertical target chosen." );
1256 #endif
1257 }
1258 else
1259 if ( !vert_target[cur_tang].exists ) {
1260 targets[cur_tang] = hori_target[cur_tang];
1261 #ifdef WITH_BUG_REPORT
1262 sprintf( tang_target_chosen_str[cur_tang], "Horizontal target chosen." );
1263 #endif
1264 }
1265 else {
1266 /* check the relation and choose the correct target */
1267 /* if vertical and hori hit the same brick we have hit the corner */
1268 if ( hori_target[cur_tang].mx == vert_target[cur_tang].mx && hori_target[cur_tang].my == vert_target[cur_tang].my ) {
1269 /* congrats! we hit the exact corner pixel! now we have to decide by corner and
1270 tangent which target to use */
1271 if ( cur_tang == TANG_LEFT ) {
1272 /* left tangent */
1273 if ( ball->vel.y > 0 ) {
1274 if ( ball->vel.x > 0 ) /* upper, right */
1275 targets[cur_tang] = vert_target[cur_tang];
1276 else
1277 targets[cur_tang] = hori_target[cur_tang];
1278 }
1279 else {
1280 if ( ball->vel.x > 0 ) /* lower, right */
1281 targets[cur_tang] = hori_target[cur_tang];
1282 else
1283 targets[cur_tang] = vert_target[cur_tang];
1284 }
1285 }
1286 else {
1287 /* right tangent */
1288 if ( ball->vel.y > 0 ) {
1289 if ( ball->vel.x > 0 ) /* upper, right */
1290 targets[cur_tang] = hori_target[cur_tang];
1291 else
1292 targets[cur_tang] = vert_target[cur_tang];
1293 }
1294 else {
1295 if ( ball->vel.x > 0 ) /* lower, right */
1296 targets[cur_tang] = vert_target[cur_tang];
1297 else
1298 targets[cur_tang] = hori_target[cur_tang];
1299 }
1300 }
1301 #ifdef WITH_BUG_REPORT
1302 if ( targets[cur_tang].x == hori_target[cur_tang].x && targets[cur_tang].y == hori_target[cur_tang].y )
1303 sprintf( tang_target_chosen_str[cur_tang], "(TRICKY) Horizontal target chosen." );
1304 else
1305 sprintf( tang_target_chosen_str[cur_tang], "(TRICKY) Vertical target chosen." );
1306 #endif
1307 }
1308 else {
1309 if ( VEC_DIST( tang_pts[cur_tang], vector_get( hori_target[cur_tang].x, hori_target[cur_tang].y ) ) < VEC_DIST( tang_pts[cur_tang], vector_get( vert_target[cur_tang].x, vert_target[cur_tang].y ) ) ) {
1310 targets[cur_tang] = hori_target[cur_tang];
1311 #ifdef WITH_BUG_REPORT
1312 sprintf( tang_target_chosen_str[cur_tang], "Horizontal target chosen." );
1313 #endif
1314 }
1315 else {
1316 targets[cur_tang] = vert_target[cur_tang];
1317 #ifdef WITH_BUG_REPORT
1318 sprintf( tang_target_chosen_str[cur_tang], "Vertical target chosen." );
1319 #endif
1320 }
1321 }
1322 }
1323 } /* now we have the two targets hit by the tangents */
1324 /* whatever's up the nearest brick is hit */
1325 if ( targets[TANG_LEFT].exists || targets[TANG_RIGHT].exists ) {
1326 prim = sec = 0;
1327 if ( !targets[TANG_LEFT].exists || !targets[TANG_RIGHT].exists ) {
1328 if ( targets[TANG_LEFT].exists )
1329 prim = &targets[TANG_LEFT];
1330 else
1331 prim = &targets[TANG_RIGHT];
1332 }
1333 else {
1334 if ( VEC_DIST( center, vector_get( targets[TANG_RIGHT].x, targets[TANG_RIGHT].y ) ) < VEC_DIST( center, vector_get( targets[TANG_LEFT].x, targets[TANG_LEFT].y ) ) ) {
1335 prim = &targets[TANG_RIGHT];
1336 sec = &targets[TANG_LEFT];
1337 }
1338 else {
1339 prim = &targets[TANG_LEFT];
1340 sec = &targets[TANG_RIGHT];
1341 }
1342 }
1343 /* however, the primary target maybe be blocked by another brick or may be a corner */
1344 /* check if side of prim target isn't blocked by a brick */
1345 switch ( prim->side ) {
1346 case SIDE_TOP:
1347 if ( bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) {
1348 if ( ball->vel.x > 0 )
1349 prim->side = SIDE_LEFT;
1350 else
1351 prim->side = SIDE_RIGHT;
1352 #ifdef WITH_BUG_REPORT
1353 printf( side_str, "Had to change side as TOP wasn't appropiate!" );
1354 #endif
1355 }
1356 break;
1357 case SIDE_BOTTOM:
1358 if ( bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) {
1359 if ( ball->vel.x > 0 )
1360 prim->side = SIDE_LEFT;
1361 else
1362 prim->side = SIDE_RIGHT;
1363 #ifdef WITH_BUG_REPORT
1364 printf( side_str, "Had to change side as BOTTOM wasn't appropiate!" );
1365 #endif
1366 }
1367 break;
1368 case SIDE_LEFT:
1369 if ( bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) {
1370 if ( ball->vel.y > 0 )
1371 prim->side = SIDE_TOP;
1372 else
1373 prim->side = SIDE_BOTTOM;
1374 #ifdef WITH_BUG_REPORT
1375 printf( side_str, "Had to change side as LEFT wasn't appropiate!" );
1376 #endif
1377 }
1378 break;
1379 case SIDE_RIGHT:
1380 if ( bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) {
1381 if ( ball->vel.y > 0 )
1382 prim->side = SIDE_TOP;
1383 else
1384 prim->side = SIDE_BOTTOM;
1385 #ifdef WITH_BUG_REPORT
1386 printf( side_str, "Had to change side as RIGHT wasn't appropiate!" );
1387 #endif
1388 }
1389 break;
1390 }
1391 /* now it still may be a corner */
1392 maybe_corner = 1;
1393 if ( ball->vel.y > 0 ) {
1394 if ( ball->vel.x > 0 ) {
1395 /* upper left corner */
1396 if ( bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) maybe_corner = 0;
1397 if ( bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1398 }
1399 else {
1400 /* upper right corner */
1401 if ( bricks[prim->mx][prim->my - 1].type != MAP_EMPTY ) maybe_corner = 0;
1402 if ( bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1403 }
1404 }
1405 else {
1406 if ( ball->vel.x > 0 ) {
1407 /* lower left corner */
1408 if ( bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) maybe_corner = 0;
1409 if ( bricks[prim->mx - 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1410 }
1411 else {
1412 /* lower right corner */
1413 if ( bricks[prim->mx][prim->my + 1].type != MAP_EMPTY ) maybe_corner = 0;
1414 if ( bricks[prim->mx + 1][prim->my].type != MAP_EMPTY ) maybe_corner = 0;
1415 }
1416 }
1417 if ( maybe_corner )
1418 corner_check( ball, &targets[TANG_LEFT], &targets[TANG_RIGHT], prim );
1419 /* we updated primary's side info correctly and may reflect now */
1420 ball->t = *prim;
1421 ball_reflect( ball );
1422 /* we got the reset position and the perpvector so finalize target */
1423 /* compute time: assume constant velocity: velocity change must not be too high! */
1424 dist = sqrt( square(center.x - ball->t.x) + square(center.y - ball->t.y) );
1425 ball->t.time = (int)floor(dist / ball_v);
1426 /* target's reset position is center position right now but
1427 we need the upper left corner of the ball */
1428 ball->t.x -= ball_rad; ball->t.y -= ball_rad;
1429 /* some error information */
1430 if ( ball->t.x <= 0.0 || ball->t.y <= 0.0 ) {
1431 #ifdef WITH_BUG_REPORT
1432 printf( "*****\n" );
1433 printf( "2.2.2: Balls: %i\n", balls->count );
1434 printf( "Extras: " );
1435 for ( i = 0; i < EX_NUMBER; i++ )
1436 if ( active[i] )
1437 printf( "%i ", i );
1438 printf( "\n" );
1439 if ( targets[TANG_LEFT].exists ) {
1440 printf( "Left Tangent: Horizontal: %i,%i, %i (%4.2f,%4.2f)\n",
1441 hori_target[TANG_LEFT].mx, hori_target[TANG_LEFT].my, hori_target[TANG_LEFT].side,
1442 hori_target[TANG_LEFT].x, hori_target[TANG_LEFT].y );
1443 printf( "Left Tangent: Vertical: %i,%i, %i (%4.2f,%4.2f)\n",
1444 vert_target[TANG_LEFT].mx, vert_target[TANG_LEFT].my, vert_target[TANG_LEFT].side,
1445 vert_target[TANG_LEFT].x, vert_target[TANG_LEFT].y );
1446 printf( "%s\n", tang_target_chosen_str[TANG_LEFT] );
1447 }
1448 if ( targets[TANG_RIGHT].exists ) {
1449 printf( "Right Tangent: Horizontal: %i,%i, %i (%4.2f,%4.2f)\n",
1450 hori_target[TANG_RIGHT].mx, hori_target[TANG_RIGHT].my, hori_target[TANG_RIGHT].side,
1451 hori_target[TANG_RIGHT].x, hori_target[TANG_RIGHT].y );
1452 printf( "Right Tangent: Vertical: %i,%i, %i (%4.2f,%4.2f)\n",
1453 vert_target[TANG_RIGHT].mx, vert_target[TANG_RIGHT].my, vert_target[TANG_RIGHT].side,
1454 vert_target[TANG_RIGHT].x, vert_target[TANG_RIGHT].y );
1455 printf( "%s\n", tang_target_chosen_str[TANG_RIGHT] );
1456 }
1457 if ( side_str[0] != 0 ) printf( "BTW: %s\n", side_str );
1458 printf( "-----\n" );
1459 printf("Ball: %4.2f,%4.2f -> %4.2f,%4.2f (%4.2f)\n", ball->cur.x + ball_rad, ball->cur.y + ball_rad, ball->vel.x, ball->vel.y, mono );
1460 printf("Brick %i,%i: Side %i (%4.2f,%4.2f)\n", ball->t.mx, ball->t.my, ball->t.side, ball->t.x, ball->t.y );
1461 printf("Perp Vector: %4.2f,%4.2f\n", ball->t.perp_vector.x, ball->t.perp_vector.y);
1462 printf("Reset position %4.2f,%4.2f\n", ball->t.x, ball->t.y);
1463 printf("Takes %i ms\n", ball->t.time);
1464 if ( corner != -1 ) printf( "%s\n", circle_msg );
1465 printf("*****\n");
1466 printf( "\nYou encountered a bug! Please send this output to kulkanie@gmx.net. Thanks!\n" );
1467 #endif
1468 /* move ball back to paddle as the current target is nonsense */
1469 ball->t.exists = 0;
1470 ball->idle_time = 0;
1471 ball->moving_back = 1;
1472 ball->return_allowed = 0;
1473 }
1474 }
1475 }
1476 /*
1477 ====================================================================
1478 Increase velocity acording to vel_change
1479 ====================================================================
1480 */
1481 void balls_inc_vel( int ms )
1482 {
1483 List_Entry *entry;
1484 if (ball_v < ball_vm && !(balls->count == 1 && ((Ball*)(balls->head.next->item))->attached)) {
1485 ball_v += ball_v_add * ms;
1486 entry = balls->head.next;
1487 while ( entry != &balls->tail ) {
1488 ball_adjust_vel((Ball*)entry->item, ball_v);
1489 entry = entry->next;
1490 }
1491 }
1492 }
1493 /*
1494 ====================================================================
1495 Return all balls that have ball->return_allowed True.
1496 ====================================================================
1497 */
1498 void balls_return()
1499 {
1500 Ball *ball;
1501 list_reset( balls );
1502 while ( ( ball = list_next( balls ) ) != 0 )
1503 if ( ball->return_allowed ) {
1504 ball->moving_back = 1;
1505 ball->t.exists = 0;
1506 ball->return_allowed = 0;
1507 }
1508 }
+0
-136
src/balls.h less more
0 /***************************************************************************
1 balls.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 typedef struct {
18 Coord cur; /* current position */
19 int x, y;
20 Vector vel; /* velocity components */
21 int attached; /* attached to club ? */
22 int moving_back; /* ball moves back to paddle as there was no
23 brick/paddle contact within the last
24 20 secs */
25 int idle_time; /* time passed since last brick/paddle contact */
26 int return_allowed; /* if this is set returning by click is allowed */
27 Target t; /* target in map */
28 Target t2; /* possible second brick */
29 } Ball;
30
31 /*
32 ====================================================================
33 Load/delete ball graphics
34 ====================================================================
35 */
36 void ball_load();
37 void ball_delete();
38 /*
39 ====================================================================
40 Create ball at position with starting angle and velocity
41 ====================================================================
42 */
43 Ball* ball_create( int x, int y, float a, float v );
44 /*
45 ====================================================================
46 Set a special ball property like metal ball.
47 ====================================================================
48 */
49 enum {
50 BALL_NORMAL = 0,
51 BALL_METAL,
52 BALL_EXPL,
53 BALL_WEAK
54 };
55 void balls_set_type( int type );
56 /*
57 ====================================================================
58 Set chaotic behaviour (random relfection)
59 ====================================================================
60 */
61 void balls_set_chaos( int chaos );
62 /*
63 ====================================================================
64 Clear ball list and attach one ball to paddle
65 ====================================================================
66 */
67 void balls_reset();
68 /*
69 ====================================================================
70 Initate velocity values (for all balls one value)
71 ====================================================================
72 */
73 void balls_set_vel( float v_start, float v_change, float v_max );
74 /*
75 ====================================================================
76 Show/hide all balls
77 ====================================================================
78 */
79 void balls_hide();
80 void balls_show();
81 void balls_alphashow( int alpha );
82 /*
83 ====================================================================
84 Update balls and detach attached balls if fire was pressed.
85 Return False if all balls are lost.
86 ====================================================================
87 */
88 int balls_update( int ms );
89 /*
90 ====================================================================
91 Compute new targets for all balls (as bricks where destroyed
92 meanwhile by other balls or shots)
93 ====================================================================
94 */
95 void balls_get_new_targets(int mx, int my);
96 /*
97 ====================================================================
98 Adjust ball's velocity to passed velocity
99 ====================================================================
100 */
101 void ball_adjust_vel(Ball *b, float v);
102 /*
103 ====================================================================
104 Adjust velocity of ball to spare out any illegal values
105 ====================================================================
106 */
107 void ball_mask_vel(Ball *b, float old_vx);
108 /*
109 ====================================================================
110 Get target for a ball.
111 input :
112 Ball* b
113 function :
114 -check if ball b hits a brick and if so:
115 -compute the hitten brick in lev_map (int mx, my)
116 -the reset position of the ball after destroying the brick (float x, y)
117 -the time in milliseconds it takes the ball to hit the brick from its current position
118 by using ball_v as velocity (int time)
119 -the side at which the ball hits; might be LEFT, RIGHT, TOP, BOTTOM (int side)
120 -the reflection vector (float a); if reflecting at an horizontal wall it's a = {0, 1} else a = {1, 0}
121 ====================================================================
122 */
123 void ball_get_target( Ball *b );
124 /*
125 ====================================================================
126 Increase velocity acording to vel_change
127 ====================================================================
128 */
129 void balls_inc_vel( int ms );
130 /*
131 ====================================================================
132 Return all balls that have ball->return_allowed True.
133 ====================================================================
134 */
135 void balls_return();
+0
-489
src/bricks.c less more
0 /***************************************************************************
1 bricks.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "list.h"
19 #include "config.h"
20 #include "levels.h"
21 #include "player.h"
22 #include "shrapnells.h"
23 #include "bricks.h"
24 #ifdef SOUND
25 #include "audio.h"
26 #endif
27
28 extern Sdl sdl;
29 extern SDL_Surface *offscreen; /* offscreen with bricks, background, frame */
30 extern SDL_Surface *bkgnd; /* background picture (includes frame) */
31 Brick bricks[MAP_WIDTH][MAP_HEIGHT];
32 int brick_count; /* how many bricks out there? used to determine when level cleared */
33 extern SDL_Surface *brick_pic; /* brick graphics in a horizontal order */
34 extern Player *player; /* ad new brick score to this player */
35 enum { EXTRA_STACK_LIMIT = 20 };
36 typedef struct { int type; int px, py; } Stack_Extra;
37 Stack_Extra extra_stack[EXTRA_STACK_LIMIT]; /* stack'ed extras released in brick_hit */
38 int extra_count;
39 extern int shadow_size;
40 extern SDL_Surface *brick_shadow; /* shadow mask */
41 extern Config config;
42 extern int shine_x, shine_y, shine_recreate;
43 extern int active[EX_NUMBER];
44 #ifdef SOUND
45 extern Sound_Chunk *wav_boom;
46 #endif
47 List *exp_bricks = 0; /* list of exploding bricks */
48 List *heal_bricks = 0; /* list of regenerating bricks */
49 int grow = 0;
50 int grow_mask[MAP_WIDTH][MAP_HEIGHT]; /* if grow is set this contains the indices of the
51 growing bricks in brick_conv_table. anything out of 0-BRICK_COUNT
52 means no brick */
53
54 /* extras conversion table */
55 Extra_Conv extra_conv_table[EX_NUMBER] = {
56 { EX_SCORE200, '0' },
57 { EX_SCORE500, '1' },
58 { EX_SCORE1000, '2' },
59 { EX_SCORE2000, '3' },
60 { EX_SCORE5000, '4' },
61 { EX_SCORE10000, '5' },
62 { EX_GOLDSHOWER, 'g' },
63 { EX_LENGTHEN, '+' },
64 { EX_SHORTEN, '-' },
65 { EX_LIFE, 'l' },
66 { EX_SLIME, 's' },
67 { EX_METAL, 'm' },
68 { EX_BALL, 'b' },
69 { EX_WALL, 'w' },
70 { EX_FROZEN, 'f' },
71 { EX_WEAPON, 'p' },
72 { EX_RANDOM, '?' },
73 { EX_FAST, '>' },
74 { EX_SLOW, '<' },
75 { EX_JOKER, 'j' },
76 { EX_DARKNESS, 'd' },
77 { EX_CHAOS, 'c' },
78 { EX_GHOST_PADDLE, '~' },
79 { EX_DISABLE, '!' },
80 { EX_TIME_ADD, '&' },
81 /*
82 { EX_SPIN_RIGHT, ')' },
83 { EX_SPIN_LEFT, '(' },
84 */
85 { EX_EXPL_BALL, '*' },
86 { EX_BONUS_MAGNET, '}' },
87 { EX_MALUS_MAGNET, '{' },
88 { EX_WEAK_BALL, 'W' }
89 };
90 /* brick conversion table: brick id, char */
91 Brick_Conv brick_conv_table[BRICK_COUNT] = {
92 { 'E', MAP_WALL, 0, -1, 0 },
93 { '#', MAP_BRICK, 1, -1, 1000 },
94 { '@', MAP_BRICK_CHAOS, 2, -1, 1000 },
95 { 'a', MAP_BRICK, 3, 1, BRICK_SCORE * 1 },
96 { 'b', MAP_BRICK, 4, 2, BRICK_SCORE * 2 },
97 { 'c', MAP_BRICK, 5, 3, BRICK_SCORE * 3 },
98 { 'v', MAP_BRICK, 6, 4, BRICK_SCORE * 4 },
99 { 'x', MAP_BRICK_HEAL, 7, 1, BRICK_SCORE * 2},
100 { 'y', MAP_BRICK_HEAL, 8, 2, BRICK_SCORE * 4},
101 { 'z', MAP_BRICK_HEAL, 9, 3, BRICK_SCORE * 6},
102 { 'd', MAP_BRICK, 10, 1, BRICK_SCORE },
103 { 'e', MAP_BRICK, 11, 1, BRICK_SCORE },
104 { 'f', MAP_BRICK, 12, 1, BRICK_SCORE },
105 { 'g', MAP_BRICK, 13, 1, BRICK_SCORE },
106 { 'h', MAP_BRICK, 14, 1, BRICK_SCORE },
107 { 'i', MAP_BRICK, 15, 1, BRICK_SCORE },
108 { 'j', MAP_BRICK, 16, 1, BRICK_SCORE },
109 { 'k', MAP_BRICK, 17, 1, BRICK_SCORE },
110 { '*', MAP_BRICK_EXP, 18, 1, BRICK_SCORE * 2 },
111 { '!', MAP_BRICK_GROW, GROW_BRICK_ID, 1, BRICK_SCORE * 2 },
112 };
113
114 /*
115 ====================================================================
116 Locals
117 ====================================================================
118 */
119
120 /*
121 ====================================================================
122 Remove brick from offscreen and screen.
123 Create shrapnells by type and impulse.
124 ====================================================================
125 */
126 void brick_remove( int mx, int my, int type, Vector imp )
127 {
128 int px, py, w, h, i, j, shadow;
129 int no_anim = 0; /* explosive bricks have their explosion as animation */
130
131 /* if explosive set exp_time of surrounding bricks */
132 if ( bricks[mx][my].type == MAP_BRICK_EXP ) {
133 no_anim = 1;
134 for ( i = mx - 1; i <= mx + 1; i++ )
135 for ( j = my - 1; j <= my + 1; j++ )
136 if ( i != mx || j != my )
137 if ( bricks[i][j].type != MAP_EMPTY && bricks[i][j].dur > 0 )
138 if ( bricks[i][j].exp_time == -1 ) {
139 bricks[i][j].exp_time = BRICK_EXP_TIME;
140 bricks[i][j].mx = i; bricks[i][j].my = j;
141 list_add( exp_bricks, &bricks[i][j] );
142 }
143 /* add explosion animation */
144 exp_create( mx * BRICK_WIDTH + ( BRICK_WIDTH >> 1 ), my * BRICK_HEIGHT + ( BRICK_HEIGHT >> 1 ) );
145 #ifdef SOUND
146 sound_play( wav_boom );
147 #endif
148 }
149 if ( bricks[mx][my].type == MAP_BRICK_GROW ) {
150 if ( !grow ) memset( grow_mask, 0xff, sizeof( grow_mask ) );
151 grow = 1;
152 for ( i = mx - 1; i <= mx + 1; i++ )
153 for ( j = my - 1; j <= my + 1; j++ )
154 if ( bricks[i][j].type == MAP_EMPTY )
155 grow_mask[i][j] = RANDOM( BRICK_GROW_FIRST, BRICK_GROW_LAST );
156 }
157
158 /* decrease brick count if no indestructible brick was destroyed */
159 if ( bricks[mx][my].dur != -1 ) --brick_count;
160 /* remove brick from map */
161 bricks[mx][my].id = -1;
162 bricks[mx][my].dur = -1;
163 bricks[mx][my].exp_time = -1;
164 bricks[mx][my].heal_time = -1;
165 bricks[mx][my].type = MAP_EMPTY;
166 /* mark as removed in players brick map */
167 player->bricks[mx][my] = 0;
168 player->grown_bricks[mx][my] = 0;
169
170 /* get screen position */
171 px = mx * BRICK_WIDTH;
172 py = my * BRICK_HEIGHT;
173
174 /* release extra if one exists */
175 if ( bricks[mx][my].extra != EX_NONE )
176 bricks_push_extra( bricks[mx][my].extra, px, py );
177 else
178 if ( active[EX_GOLDSHOWER] )
179 bricks_push_extra( EX_SCORE1000, px, py );
180 bricks[mx][my].extra = EX_NONE;
181 /* get score */
182 player->score += bricks[mx][my].score;
183
184 /* in case of darkness no (graphical) remove nescessary */
185 if ( active[EX_DARKNESS] ) {
186 #ifdef SOUND
187 sound_play( wav_boom );
188 #endif
189 return;
190 }
191
192 /* add shrapnells */
193 if ( !no_anim )
194 shrapnells_create( px, py, BRICK_WIDTH, BRICK_HEIGHT, type, imp );
195 /* recreate shine if needed */
196 if (px == shine_x && py == shine_y) shine_recreate = 1;
197 /* clear offscreen */
198 w = BRICK_WIDTH; h = BRICK_HEIGHT;
199 if ( config.shadow ) {
200 w += shadow_size; h += shadow_size;
201 if ( px + w > sdl.screen->w - BRICK_WIDTH ) w = sdl.screen->w - BRICK_WIDTH - px;
202 set_surf_clip( offscreen, px, py, w, h );
203 }
204 DEST(offscreen, px, py, w, h );
205 SOURCE(bkgnd, px, py);
206 blit_surf();
207 /* if shadow redraw close bricks */
208 if ( config.shadow ) {
209 for ( i = mx - 1; i <= mx + 1; i++ )
210 for ( j = my - 1; j <= my + 1; j++ ) {
211 if ( i > 0 && j > 0 && i < MAP_WIDTH - 1 ) {
212 if ( bricks[i][j].type != MAP_EMPTY ) {
213 if ( i <= mx && j <= my ) shadow = 1; else shadow = 0;
214 brick_draw( offscreen, i, j, shadow );
215 }
216 }
217 /* redraw shadow of frame */
218 if ( ( i == 0 || j == 0 ) && i < MAP_WIDTH - 1 )
219 brick_draw( offscreen, i, j, 1 );
220 }
221 set_surf_clip( offscreen, 0, 0, 0, 0 );
222 }
223 /* update screen */
224 DEST(sdl.screen, px, py, w, h );
225 SOURCE(offscreen, px, py);
226 blit_surf();
227 add_refresh_rect(px, py, w, h );
228 #ifdef SOUND
229 sound_play( wav_boom );
230 #endif
231 }
232
233 /*
234 ====================================================================
235 Publics
236 ====================================================================
237 */
238
239 /*
240 ====================================================================
241 Load picture containing brick graphics
242 ====================================================================
243 */
244 void bricks_load()
245 {
246 exp_bricks = list_create( LIST_NO_AUTO_DELETE, NO_CALLBACK );
247 heal_bricks = list_create( LIST_NO_AUTO_DELETE, NO_CALLBACK );
248 }
249 /*
250 ====================================================================
251 Delete bricks picture
252 ====================================================================
253 */
254 void bricks_delete()
255 {
256 if ( exp_bricks ) list_delete( exp_bricks ); exp_bricks = 0;
257 if ( heal_bricks ) list_delete( heal_bricks ); heal_bricks = 0;
258 }
259 /*
260 ====================================================================
261 Create bricks from level info.
262 ====================================================================
263 */
264 void bricks_create( Level *level )
265 {
266 int i, j, k;
267
268 /* clear explosion/healing list */
269 list_clear( exp_bricks );
270 list_clear( heal_bricks );
271
272 /* build walls */
273 for (i = 0; i < MAP_WIDTH; i++) {
274 bricks[i][0].id = 0;
275 bricks[i][0].dur = -1;
276 bricks[i][0].type = MAP_WALL; /* this means - indestructible */
277 bricks[i][MAP_HEIGHT - 1].id = -1;
278 bricks[i][MAP_HEIGHT - 1].dur = -1;
279 bricks[i][MAP_HEIGHT - 1].type = MAP_EMPTY;
280 }
281 for (j = 0; j < MAP_HEIGHT; j++) {
282 bricks[0][j].id = 0;
283 bricks[0][j].dur = -1;
284 bricks[0][j].type = MAP_WALL; /* this means - indestructible */
285 bricks[MAP_WIDTH - 1][j].id = 0;
286 bricks[MAP_WIDTH - 1][j].dur = -1;
287 bricks[MAP_WIDTH - 1][j].type = MAP_WALL;
288 }
289 /* clear last lines as there are non-editable */
290 for (i = 1; i < MAP_WIDTH - 1; i++)
291 for (j = EDIT_HEIGHT + 1; j < MAP_HEIGHT - 1; j++) {
292 bricks[i][j].id = -1;
293 bricks[i][j].dur = -1;
294 bricks[i][j].type = MAP_EMPTY;
295 }
296
297 /* load map */
298 for (i = 0; i < EDIT_WIDTH; i++)
299 for (j = 0; j < EDIT_HEIGHT; j++) {
300 /* create bricks */
301 bricks[i + 1][j + 1].type = MAP_EMPTY;
302 bricks[i + 1][j + 1].id = -1;
303 bricks[i + 1][j + 1].dur = -1;
304 bricks[i + 1][j + 1].exp_time = -1;
305 bricks[i + 1][j + 1].heal_time = -1;
306 for ( k = 0; k < BRICK_COUNT; k++ )
307 if ( level->bricks[i][j] == brick_conv_table[k].c ) {
308 bricks[i + 1][j + 1].type = brick_conv_table[k].type;
309 bricks[i + 1][j + 1].id = brick_conv_table[k].id;
310 bricks[i + 1][j + 1].dur = brick_conv_table[k].dur;
311 bricks[i + 1][j + 1].score = brick_conv_table[k].score;
312 break;
313 }
314 /* create extras */
315 bricks[i + 1][j + 1].extra = EX_NONE;
316 for ( k = 0; k < EX_NUMBER; k++ )
317 if ( level->extras[i][j] == extra_conv_table[k].c ) {
318 bricks[i + 1][j + 1].extra = extra_conv_table[k].type;
319 break;
320 }
321 }
322
323 /* count bricks */
324 brick_count = 0;
325 for (i = 1; i < MAP_WIDTH - 1; i++)
326 for (j = 1; j < MAP_HEIGHT - 1; j++)
327 if ( bricks[i][j].dur > 0 )
328 brick_count++;
329 }
330 /*
331 ====================================================================
332 Draw all bricks to offscreen surface.
333 ====================================================================
334 */
335 void bricks_draw()
336 {
337 int i, j;
338 if ( offscreen == 0 ) return;
339 set_surf_clip( offscreen, 0, 0, sdl.screen->w - BRICK_WIDTH, sdl.screen->h );
340 for ( j = 1; j < MAP_HEIGHT - 1; j++ )
341 for ( i = 1; i < MAP_WIDTH - 1; i++ )
342 if ( bricks[i][j].id >= 0 )
343 brick_draw( offscreen, i, j, config.shadow );
344 set_surf_clip( offscreen, 0,0,0,0 );
345 }
346 /*
347 ====================================================================
348 Draw brick to passed surface
349 ====================================================================
350 */
351 void brick_draw( SDL_Surface *surf, int map_x, int map_y, int shadow )
352 {
353 int x = map_x * BRICK_WIDTH, y = map_y * BRICK_HEIGHT;
354 /* dont draw invisible bricks */
355 if ( bricks[map_x][map_y].id == INVIS_BRICK_ID ) return;
356 /* add shadow */
357 if ( shadow ) {
358 DEST( surf, x + shadow_size, y + shadow_size, BRICK_WIDTH, BRICK_HEIGHT );
359 SOURCE( brick_shadow, 0, 0 );
360 alpha_blit_surf( SHADOW_ALPHA );
361 }
362 /* brick if not frame brick */
363 if ( map_x == 0 || map_y == 0 || map_x == MAP_WIDTH - 1 ) return;
364 DEST( surf, x, y, BRICK_WIDTH, BRICK_HEIGHT );
365 SOURCE( brick_pic, bricks[map_x][map_y].id * BRICK_WIDTH, 0 );
366 blit_surf();
367 }
368 /*
369 ====================================================================
370 Add brick with clipped shadow to offscreen. To draw a brick without
371 shadow check use brick_draw().
372 ====================================================================
373 */
374 void brick_draw_complex( int mx, int my, int px, int py )
375 {
376 brick_draw( offscreen, mx, my, 1 );
377 /* redraw surrounding bricks */
378 set_surf_clip( offscreen, px + shadow_size, py + shadow_size, BRICK_WIDTH, BRICK_HEIGHT );
379 if ( mx + 1 == MAP_WIDTH - 1 ) {
380 /* right frame part */
381 DEST(offscreen, px + BRICK_WIDTH, py, BRICK_WIDTH, ( BRICK_HEIGHT << 1 ) );
382 SOURCE(bkgnd, px + BRICK_WIDTH, py);
383 blit_surf();
384 }
385 else {
386 brick_draw( offscreen, mx + 1, my, 0 );
387 brick_draw( offscreen, mx + 1, my + 1, 0 );
388 }
389 if ( bricks[mx][my + 1].type != MAP_EMPTY )
390 brick_draw( offscreen, mx, my + 1, 0 );
391 set_surf_clip( offscreen, 0, 0, 0, 0 );
392 }
393 /*
394 ====================================================================
395 Hit brick and remove if destroyed. 'metal' means the ball
396 destroys any brick with the first try.
397 type and imp are used for shrapnell creation.
398 Return true on destruction
399 ====================================================================
400 */
401 int brick_hit( int mx, int my, int metal, int type, Vector imp )
402 {
403 int px, py;
404 int remove = 0;
405 int loose_dur = 0;
406 int refresh_h, refresh_w;
407
408 /* a map wall can't be touched */
409 if ( bricks[mx][my].type == MAP_WALL ) return 0;
410
411 /* if metal ball resistance is futile */
412 if ( metal )
413 remove = 1;
414 else {
415 if ( bricks[mx][my].dur == -1 ) return 0; /* duration of -1 means only breakable by engery ball (metal ball) */
416 if ( bricks[mx][my].dur <= 1 )
417 remove = 1;
418 else
419 loose_dur = 1;
420 }
421
422 if ( remove )
423 brick_remove( mx, my, type, imp );
424 else
425 if ( loose_dur ) {
426 bricks[mx][my].dur--;
427 bricks[mx][my].id--;
428 player->bricks[mx][my] = bricks[mx][my].dur;
429 /* set regeneration time if it's a healing brick */
430 if ( bricks[mx][my].type == MAP_BRICK_HEAL ) {
431 /* if this brick is already healing just reset the time
432 but don't add to the list again */
433 if ( bricks[mx][my].heal_time != -1 )
434 bricks[mx][my].heal_time = BRICK_HEAL_TIME;
435 else {
436 bricks[mx][my].mx = mx;
437 bricks[mx][my].my = my;
438 bricks[mx][my].heal_time = BRICK_HEAL_TIME;
439 list_add( heal_bricks, &bricks[mx][my] );
440 }
441 }
442 if ( !active[EX_DARKNESS]) {
443 px = mx * BRICK_WIDTH;
444 py = my * BRICK_HEIGHT;
445 refresh_w = BRICK_WIDTH;
446 refresh_h = BRICK_HEIGHT;
447 if ( bricks[mx][my].id + 1 == INVIS_BRICK_ID && config.shadow ) {
448 brick_draw_complex( mx, my, px, py );
449 /* resize refreshregion due to shadow */
450 refresh_w += shadow_size;
451 refresh_h += shadow_size;
452 /* udpate screen */
453 DEST( sdl.screen, px, py, refresh_w, refresh_h );
454 SOURCE( offscreen, px, py );
455 blit_surf();
456 }
457 else {
458 brick_draw( offscreen, mx, my, 0 );
459 brick_draw( sdl.screen, mx, my, 0 );
460 }
461 add_refresh_rect(px, py, refresh_w, refresh_h );
462 }
463 }
464 return remove;
465 }
466 /*
467 ====================================================================
468 Get released extra from queue if any.
469 ====================================================================
470 */
471 void bricks_push_extra( int type, int px, int py )
472 {
473 if ( extra_count == EXTRA_STACK_LIMIT ) return;
474 extra_stack[extra_count].type = type;
475 extra_stack[extra_count].px = px;
476 extra_stack[extra_count].py = py;
477 extra_count++;
478 }
479 int bricks_pop_extra( int *type, int *px, int *py )
480 {
481 if ( extra_count == 0 ) return 0;
482 extra_count--;
483 *type = extra_stack[extra_count].type;
484 *px = extra_stack[extra_count].px;
485 *py = extra_stack[extra_count].py;
486 return 1;
487 }
488
+0
-129
src/bricks.h less more
0 /***************************************************************************
1 bricks.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /* various defines needed by special bricks */
18 enum {
19 INVIS_BRICK_ID = 6, /* id of invisible brick */
20 BRICK_EXP_TIME = 150, /* delay until explosion */
21 BRICK_COUNT = 20, /* various brick types */
22 BRICK_GROW_FIRST = 10, /* only bricks within this range may grow randomly */
23 BRICK_GROW_LAST = 17,
24 GROW_BRICK_ID = 19,
25 BRICK_HEAL_TIME = 4000 /* after this time duration is increased */
26 };
27 /* the brick types are not appropiate but in order to use the old
28 lbreakout functions we need them */
29 enum {
30 MAP_EMPTY = 0, /* no brick */
31 MAP_WALL, /* can't be destroyed at all */
32 MAP_BRICK, /* may be destroyed if duration is not -1 */
33 MAP_BRICK_EXP, /* explodes neighbors if destroyed */
34 MAP_BRICK_GROW, /* grow neighbors if destroyed */
35 MAP_BRICK_HEAL, /* heals itself when hit */
36 MAP_BRICK_CHAOS,/* chaotic reflection by this brick */
37 };
38 enum {
39 BRICK_WIDTH = 40,
40 BRICK_HEIGHT = 20,
41 BRICK_SCORE = 100
42 };
43 typedef struct {
44 int type; /* any of the old MAP_XXX types above */
45 int id; /* picture id -- if -1 no brick -- if 0 it's indestructible */
46 int dur; /* durability - if -1 & type != MAP_WALL it's only destructible by energy ball */
47 int extra; /* extra released when destroyed */
48 int score; /* score you get when desctroying this brick */
49 int exp_time; /* -1 means inexplosive; value is set by a nearby explosion brick */
50 int heal_time; /* if not -1 counted down and when 0 brick heals one duration (until fully healed) */
51 int mx, my; /* a bit hacky but who cares? this conatins the position of an explosion/healing brick */
52 } Brick;
53
54 /* extra conversion item */
55 typedef struct {
56 int type; /* extra of type */
57 char c; /* is assigned to this character */
58 } Extra_Conv;
59 /* brick conversion item */
60 typedef struct {
61 char c; /* is assigned to this character */
62 int type; /* extra of type */
63 int id; /* pic id */
64 int dur;
65 int score;
66 } Brick_Conv;
67
68 /*
69 ====================================================================
70 Load picture containing brick graphics
71 ====================================================================
72 */
73 void bricks_load();
74 /*
75 ====================================================================
76 Delete bricks picture
77 ====================================================================
78 */
79 void bricks_delete();
80 /*
81 ====================================================================
82 Create bricks from level info.
83 ====================================================================
84 */
85 void bricks_create( Level *level );
86 /*
87 ====================================================================
88 Draw all bricks to offscreen surface.
89 ====================================================================
90 */
91 void bricks_draw();
92 /*
93 ====================================================================
94 Add brick with clipped shadow to offscreen. To draw a brick without
95 shadow check use brick_draw().
96 ====================================================================
97 */
98 void brick_draw_complex( int mx, int my, int px, int py );
99 /*
100 ====================================================================
101 Draw brick to passed surface
102 ====================================================================
103 */
104 void brick_draw( SDL_Surface *surf, int map_x, int map_y, int shadow );
105 /*
106 ====================================================================
107 Hit brick and remove if destroyed. 'metal' means the ball
108 destroys any brick with the first try.
109 type and imp are used for shrapnell creation.
110 Return true on destruction
111 ====================================================================
112 */
113 int brick_hit( int map_x, int map_y, int metal, int type, Vector imp );
114 /*
115 ====================================================================
116 The actual remove function. If it is called directly there is no
117 duration check (done by brick_hit) but the brick is destroyed
118 in any case.
119 ====================================================================
120 */
121 void brick_remove( int map_x, int map_y, int type, Vector imp );
122 /*
123 ====================================================================
124 Push pop extra on/off stack
125 ====================================================================
126 */
127 void bricks_push_extra( int type, int px, int py );
128 int bricks_pop_extra( int *type, int *px, int *py );
+0
-400
src/chart.c less more
0 /***************************************************************************
1 chart.c - description
2 -------------------
3 begin : Mon Sep 24 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "chart.h"
20 #include "list.h"
21
22 #define CHART_FILE_NAME "lbreakout2.hscr"
23
24 List *charts = 0; /* list of all loaded level set charts */
25
26 char chart_path[512]; /* path charts where actually loaded/created from */
27 int chart_loaded = 0; /* true if highscore succesfully loaded */
28 int chart_w, chart_h; /* size of higscore chart */
29 int chart_gap = 10;
30 int chart_level_offset = 0; /* level offset (name's left aligned, score's right aligned) */
31 char *cheader = "Name Level Score";
32 Font *cfont = 0, *chfont = 0, *ccfont = 0; /* normal, highlight and caption font */
33 extern Config config;
34 extern Sdl sdl;
35
36 /*
37 ====================================================================
38 Local
39 ====================================================================
40 */
41
42 /*
43 ====================================================================
44 Reset charts
45 ====================================================================
46 */
47 void chart_reset( Set_Chart *chart )
48 {
49 int i;
50 memset( chart->entries, 0, sizeof( Chart_Entry ) * CHART_ENTRY_COUNT );
51 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
52 chart_add( chart, "............", i + 1, 10000 * ( i + 1 ) );
53 chart->entries[0].score = 300000;
54 chart->entries[1].score = 200000;
55 chart->entries[2].score = 150000;
56 chart->entries[3].score = 100000;
57 chart->entries[4].score = 70000;
58 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
59 chart->entries[i].new_entry = 0;
60 }
61
62 /*
63 ====================================================================
64 Create/delete set chart.
65 ====================================================================
66 */
67 Set_Chart* chart_set_create( char *name )
68 {
69 Set_Chart *chart = calloc( 1, sizeof( Set_Chart ) );
70 chart->name = strdup( name );
71 chart_reset( chart );
72 return chart;
73 }
74 void chart_set_delete( void *ptr )
75 {
76 Set_Chart *chart = (Set_Chart*)ptr;
77 if ( !chart ) return;
78 if ( chart->name ) free( chart->name );
79 free( chart );
80 }
81
82 /*
83 ====================================================================
84 Read entries of a chart from file position.
85 ====================================================================
86 */
87 void chart_read_entries( FILE *file, char *file_name, Set_Chart *chart )
88 {
89 char buffer[128];
90 int i;
91
92 for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) {
93 if ( feof( file ) ) {
94 fprintf( stderr, "Unexpected EOF in '%s' in entry %i... reading of highscore aborted.\n",
95 file_name, i );
96 break;
97 }
98 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
99 strcpy( chart->entries[i].name, buffer );
100 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
101 chart->entries[i].level = atoi( buffer );
102 fgets( buffer, 128, file ); buffer[strlen(buffer) - 1] = 0; /* remove newline */
103 chart->entries[i].score = atoi( buffer );
104 }
105 }
106
107 /*
108 ====================================================================
109 Load all highscores from path. If not found create chart with
110 one set 'Original'.
111 ReturnValue: True if successful
112 ====================================================================
113 */
114 int chart_load_from_path( char *path )
115 {
116 FILE *file = 0;
117 char file_name[512];
118 char setname[1024];
119 char aux[4];
120 Set_Chart *chart = 0;
121 /* full file name */
122 sprintf( file_name, "%s/%s", path, CHART_FILE_NAME );
123 /* clear chart list */
124 list_clear( charts );
125 /* open file */
126 file = fopen( file_name, "r" );
127 if ( file ) {
128 /* test if it's new format or old one. */
129 fread( aux, sizeof( char ), 3, file ); aux[3] = 0;
130 fseek( file, 0, SEEK_SET );
131 if ( strequal( ">>>", aux ) ) {
132 /* new format: load all set charts */
133 while( !feof( file ) ) {
134 /* check if next sign is an '>' else skip reading */
135 aux[0] = 0;
136 fread( aux, sizeof( char ), 1, file );
137 fseek( file, -1, SEEK_CUR );
138 if ( aux[0] != '>' ) break;
139 chart = calloc( 1, sizeof( Set_Chart ) );
140 /* get name: >>>name */
141 fscanf( file, ">>>%s\n", setname );
142 chart->name = strdup( setname );
143 /* entries */
144 chart_read_entries( file, file_name, chart );
145 /* add */
146 list_add( charts, chart );
147 }
148 }
149 else {
150 /* old format: load single chart as 'Original' */
151 fprintf( stderr, "Converting highscore chart as format changed.\n" );
152 chart = chart_set_create( "Original" );
153 chart_read_entries( file, file_name, chart );
154 list_add( charts, chart );
155 }
156 fclose( file );
157 }
158 else {
159 fprintf( stderr, "Highscore chart doesn't exist in '%s'... creating new one.\n", path );
160 chart = chart_set_create( "Original" );
161 list_add( charts, chart );
162 }
163 /* test if writing is allowed without changing actual contents */
164 if ( ( file = fopen( file_name, "a" ) ) == 0 ) {
165 fprintf( stderr, "Write permission for '%s' denied.\n", file_name );
166 return 0;
167 }
168 else
169 fclose( file );
170 strcpy( chart_path, path );
171 chart_loaded = 1;
172 return 1;
173 }
174
175 /*
176 ====================================================================
177 Publics
178 ====================================================================
179 */
180
181 /*
182 ====================================================================
183 Load highscore. If it doesn't exist try to create it in HI_DIR if
184 this fails fall back to ~/.lbreakout and create highscore there.
185 ====================================================================
186 */
187 void chart_load()
188 {
189 /* create list */
190 if ( charts ) list_delete( charts ); charts = 0;
191 charts = list_create( LIST_AUTO_DELETE, chart_set_delete );
192 /* load highscore */
193 if ( !chart_load_from_path( HI_DIR ) ) {
194 fprintf( stderr, "Unable to access highscore chart in '%s'.\n", HI_DIR );
195 fprintf( stderr, "Trying to use config directory '%s'.\n", config.dir_name );
196 if ( !chart_load_from_path( config.dir_name ) ) {
197 fprintf( stderr, "Unable to access highscore chart in config directory... won't be "
198 "able to save any results. Sorry.\n" );
199 return;
200 }
201 }
202 printf( "Saving highscore chart in: %s\n", chart_path );
203 /* load resources */
204 cfont = load_fixed_font( "f_small_yellow.bmp", 32, 96, 8, SDL_SWSURFACE );
205 chfont = load_fixed_font( "f_small_white.bmp", 32, 96, 8, SDL_SWSURFACE );
206 ccfont = load_fixed_font( "f_yellow.bmp", 32, 96, 10, SDL_SWSURFACE );
207 /* compute size and position stuff of highscore */
208 chart_w = text_width( ccfont, cheader );
209 chart_h = ccfont->height + chart_gap + /* title + gap */
210 cfont->height * CHART_ENTRY_COUNT + /* entries */
211 chart_gap + /*gap between caption and entries */
212 ccfont->height; /* caption size */
213 chart_level_offset = text_width( ccfont, "name.-----" ) + text_width( ccfont, "Level" ) / 2; /* level offset centered */
214 }
215 /*
216 ====================================================================
217 Delete resources
218 ====================================================================
219 */
220 void chart_delete()
221 {
222 free_font( &cfont );
223 free_font( &chfont );
224 free_font( &ccfont );
225 if ( charts ) list_delete( charts ); charts = 0;
226 }
227 /*
228 ====================================================================
229 Save chart in directory it was loaded from.
230 ====================================================================
231 */
232 void chart_save()
233 {
234 char file_name[512];
235 int i;
236 Set_Chart *chart = 0;
237 FILE *file = 0;
238 if ( !chart_loaded ) return;
239 /* full file name */
240 sprintf( file_name, "%s/%s", chart_path, CHART_FILE_NAME );
241 /* open file */
242 file = fopen( file_name, "w" );
243 if ( !file ) {
244 fprintf( stderr, "??? Highscore chart loaded properly but cannot save?\n" );
245 return;
246 }
247 /* save all charts */
248 list_reset( charts );
249 while ( ( chart = list_next( charts ) ) != 0 ) {
250 fprintf( file, ">>>%s\n", chart->name );
251 for ( i = 0; i < CHART_ENTRY_COUNT; i++ )
252 fprintf( file, "%s\n%i\n%i\n", chart->entries[i].name, chart->entries[i].level, chart->entries[i].score );
253 }
254 fclose( file );
255 }
256 /*
257 ====================================================================
258 Check if this player entered the highscore chart and update it.
259 ====================================================================
260 */
261 void chart_add( Set_Chart *chart, char *name, int level, int score )
262 {
263 /* add new entry at blind end of chart */
264 strcpy( chart->entries[CHART_ENTRY_COUNT].name, name );
265 chart->entries[CHART_ENTRY_COUNT].level = level;
266 chart->entries[CHART_ENTRY_COUNT].score = score;
267 chart->entries[CHART_ENTRY_COUNT].new_entry = 1;
268 /* sort algorithm is stable so first sort levels then score */
269 chart_sort( chart, SORT_BY_LEVEL );
270 chart_sort( chart, SORT_BY_SCORE );
271 }
272 /*
273 ====================================================================
274 Sort chart with stable algorithm (bubble sort's ok) by wanted
275 value.
276 ====================================================================
277 */
278 void chart_swap( Chart_Entry *entry1, Chart_Entry *entry2 )
279 {
280 Chart_Entry dummy;
281 dummy = *entry1;
282 *entry1 = *entry2;
283 *entry2 = dummy;
284 }
285 void chart_sort( Set_Chart *chart, int type )
286 {
287 int j;
288 int changed = 0;
289 /* use entry dummy as well so count is CHART_ENTRY_COUNT + 1 */
290 do {
291 changed = 0;
292 for ( j = 0; j < CHART_ENTRY_COUNT; j++ )
293 switch ( type ) {
294 case SORT_BY_LEVEL:
295 if ( chart->entries[j].level < chart->entries[j + 1].level ) {
296 chart_swap( &chart->entries[j], &chart->entries[j + 1] );
297 changed = 1;
298 }
299 break;
300 case SORT_BY_SCORE:
301 if ( chart->entries[j].score < chart->entries[j + 1].score ) {
302 chart_swap( &chart->entries[j], &chart->entries[j + 1] );
303 changed = 1;
304 }
305 break;
306 }
307 } while ( changed );
308 }
309 /*
310 ====================================================================
311 Draw highscores centered in regio x,y,w,h
312 ====================================================================
313 */
314 void chart_show( Set_Chart *chart, int x, int y, int w, int h )
315 {
316 char number_buffer[24];
317 int entry_offset; /* y offset of entries */
318 Font *font;
319 int i;
320 /* adjust x,y so it's centered */
321 x += ( w - chart_w ) / 2;
322 y += ( h - chart_h ) / 2;
323 /* title = name of levelset */
324 ccfont->align = ALIGN_X_CENTER | ALIGN_Y_TOP;
325 write_text( ccfont, sdl.screen, x + ( chart_w >> 1 ), y, chart->name, OPAQUE );
326 /* caption */
327 ccfont->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
328 write_text( ccfont, sdl.screen, x, y + ccfont->height + chart_gap, cheader, OPAQUE );
329 /* get entry offset */
330 entry_offset = ( ccfont->height + chart_gap ) * 2 + y;
331 /* entries */
332 for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) {
333 font = cfont;
334 if ( chart->entries[i].new_entry ) font = chfont;
335 /* name */
336 font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
337 write_text( font, sdl.screen, x, entry_offset, chart->entries[i].name, OPAQUE );
338 /* level */
339 font->align = ALIGN_X_CENTER | ALIGN_Y_TOP;
340 sprintf( number_buffer, "%i", chart->entries[i].level );
341 write_text( font, sdl.screen, x + chart_level_offset, entry_offset, number_buffer, OPAQUE );
342 /* score */
343 font->align = ALIGN_X_RIGHT | ALIGN_Y_TOP;
344 sprintf( number_buffer, "%i", chart->entries[i].score );
345 write_text( font, sdl.screen, x + chart_w, entry_offset, number_buffer, OPAQUE );
346 /* change offset */
347 entry_offset += font->height;
348 }
349 add_refresh_rect( x, y, chart_w, chart_h );
350 }
351 /*
352 ====================================================================
353 Clear all new_entry flags (done before new players are added
354 to chart when game over).
355 ====================================================================
356 */
357 void chart_clear_new_entries()
358 {
359 int i;
360 Set_Chart *chart;
361 list_reset( charts );
362 while ( ( chart = list_next( charts ) ) != 0 ) {
363 chart->entries[CHART_ENTRY_COUNT].score = chart->entries[CHART_ENTRY_COUNT].level = 0;
364 for ( i = 0; i < CHART_ENTRY_COUNT + 1; i++ )
365 chart->entries[i].new_entry = 0;
366 }
367 }
368 /*
369 ====================================================================
370 Query set chart by this name or if not found create a new one
371 by this name.
372 ====================================================================
373 */
374 Set_Chart* chart_set_query( char *name )
375 {
376 Set_Chart *chart = 0;
377 list_reset( charts );
378 while ( ( chart = list_next( charts ) ) != 0 )
379 if ( strequal( name, chart->name ) )
380 return chart;
381 /* not found so create it */
382 fprintf( stderr, "First chart query for '%s'. Creating this chart.\n", name );
383 chart = chart_set_create( name );
384 list_add( charts, chart );
385 return chart;
386 }
387 /*
388 ====================================================================
389 Query chart by id. If id is invalid return 0.
390 ====================================================================
391 */
392 Set_Chart* chart_set_query_id( int id )
393 {
394 if ( id >= charts->count ) {
395 fprintf( stderr, "Chart index '%i' is out of range!\n", id );
396 return 0;
397 }
398 return (Set_Chart*)list_get( charts, id );
399 }
+0
-98
src/chart.h less more
0 /***************************************************************************
1 chart.h - description
2 -------------------
3 begin : Mon Sep 24 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Highscore chart entry
20 ====================================================================
21 */
22 typedef struct {
23 char name[32];
24 int level;
25 int score;
26 int new_entry; /* newly entered the highscore */
27 } Chart_Entry;
28 /*
29 ====================================================================
30 Levelset highscore chart.
31 ====================================================================
32 */
33 enum { CHART_ENTRY_COUNT = 10 };
34 typedef struct {
35 Chart_Entry entries[CHART_ENTRY_COUNT + 1]; /* last entry is space holder for new entry */
36 char *name;
37 } Set_Chart;
38
39 /*
40 ====================================================================
41 Load highscore. If it doesn't exist try to create it in HI_DIR if
42 this fails fall back to ~/.lbreakout and create highscore there.
43 ====================================================================
44 */
45 void chart_load();
46 /*
47 ====================================================================
48 Delete resources
49 ====================================================================
50 */
51 void chart_delete();
52 /*
53 ====================================================================
54 Save chart in directory it was loaded from.
55 ====================================================================
56 */
57 void chart_save();
58 /*
59 ====================================================================
60 Check if this player entered the highscore chart and update it.
61 ====================================================================
62 */
63 void chart_add( Set_Chart *chart, char *name, int level, int score );
64 /*
65 ====================================================================
66 Sort chart with stable algorithm (bubble sort's ok) by wanted
67 value.
68 ====================================================================
69 */
70 enum { SORT_BY_LEVEL = 0, SORT_BY_SCORE };
71 void chart_sort( Set_Chart *chart, int type );
72 /*
73 ====================================================================
74 Draw highscores centered in regio x,y,w,h
75 ====================================================================
76 */
77 void chart_show( Set_Chart *chart, int x, int y, int w, int h );
78 /*
79 ====================================================================
80 Clear all new_entry flags (done before new players are added
81 to chart when game over).
82 ====================================================================
83 */
84 void chart_clear_new_entries();
85 /*
86 ====================================================================
87 Query set chart by this name or if not found create a new one
88 by this name.
89 ====================================================================
90 */
91 Set_Chart* chart_set_query( char *name );
92 /*
93 ====================================================================
94 Query chart by id. If id is invalid return 0.
95 ====================================================================
96 */
97 Set_Chart* chart_set_query_id( int id );
+0
-160
src/config.c less more
0 /***************************************************************************
1 config.c - description
2 -------------------
3 begin : Tue Feb 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <SDL.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <dirent.h>
22 #include <sys/types.h>
23 #include <sys/stat.h>
24
25 #include "sdl.h"
26 #include "config.h"
27
28 #ifdef _WIN32
29 #define MKDIR(d, p) mkdir(d)
30 #else
31 #define MKDIR mkdir
32 #endif
33
34 Config config;
35
36 #define CONFIG_FILE_NAME "lbreakout2.conf"
37
38 /* check if config directory exists; if not create it and set config_dir */
39 void config_check_dir()
40 {
41 char level_dir[512];
42 sprintf( config.dir_name, "%s/%s", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
43 /* test and create .lgames */
44 if ( opendir( config.dir_name ) == 0 ) {
45 fprintf( stderr, "couldn't find/open config directory '%s'\n", config.dir_name );
46 fprintf( stderr, "attempting to create it... " );
47 MKDIR( config.dir_name, S_IRWXU );
48 if ( opendir( config.dir_name ) == 0 )
49 fprintf( stderr, "failed\n" );
50 else
51 fprintf( stderr, "ok\n" );
52 }
53 /* create levels directory */
54 sprintf( level_dir, "%s/lbreakout2-levels", config.dir_name );
55 MKDIR( level_dir, S_IRWXU );
56 /* create themes directory */
57 sprintf( level_dir, "%s/lbreakout2-themes", config.dir_name );
58 MKDIR( level_dir, S_IRWXU );
59 }
60
61 /* set config to default */
62 void config_reset()
63 {
64 /* levels */
65 config.levelset_id = 0;
66 config.levelset_count = 0;
67 config.levelset_home_id = 0;
68 config.levelset_home_count = 0;
69 /* player */
70 config.player_count = 1;
71 strcpy( config.player_names[0], "Michael" );
72 strcpy( config.player_names[1], "Mr.X" );
73 strcpy( config.player_names[2], "Mr.Y" );
74 strcpy( config.player_names[3], "Mr.Z" );
75 /* game */
76 config.diff = 1;
77 config.startlevel = 0;
78 /* controls */
79 config.k_left = SDLK_LEFT;
80 config.k_right = SDLK_RIGHT;
81 config.k_fire = SDLK_SPACE;
82 config.k_return = SDLK_BACKSPACE;
83 config.control = 2;
84 config.grab = 0;
85 config.rel_motion = 0;
86 config.motion_mod = 100;
87 config.convex = 1;
88 config.invert = 0;
89 config.i_key_speed = 50;
90 config.key_speed = 0.5;
91 /* sounds */
92 config.sound = 1;
93 config.volume = 8;
94 config.speech = 1;
95 /* graphics */
96 config.trp = 1;
97 config.anim = 2;
98 config.fullscreen = 0;
99 config.fade = 1;
100 config.shadow = 1;
101 config.fps = 0;
102 config.ball_level = BALL_BELOW_BONUS;
103 /* various */
104 config.use_hints = 1;
105 config.return_on_click = 0;
106 config.theme_id = 0;
107 config.theme_count = 1;
108 }
109
110 /* load config */
111 void config_load( )
112 {
113 FILE *file = 0;
114 char file_name[512];
115 struct stat dir_stat;
116 char dir_name[512];
117
118 /* check if directory exists, if not create it */
119 config_check_dir();
120
121 sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME );
122 if ( ( file = fopen( file_name, "r" ) ) == 0 ) {
123 /* not found? use defaults! */
124 fprintf( stderr, "config file '%s' not found... using defaults\n", file_name );
125 config_reset();
126 }
127 else {
128 /* check if file size fits struct size; if not use defaults */
129 stat( file_name, &dir_stat );
130 if ( dir_stat.st_size != sizeof( Config ) ) {
131 fprintf( stderr, "config file '%s' corrupted... using defaults\n", file_name );
132 config_reset();
133 }
134 else {
135 /* must backup dir_name! */
136 strcpy( dir_name, config.dir_name );
137 /* read it from file */
138 fread( &config, sizeof( Config ), 1, file );
139 strcpy( config.dir_name, dir_name );
140 }
141 fclose( file );
142 }
143 }
144
145 /* save config */
146 void config_save( )
147 {
148 FILE *file = 0;
149 char file_name[512];
150
151 sprintf( file_name, "%s/%s", config.dir_name, CONFIG_FILE_NAME );
152 if ( ( file = fopen( file_name, "w" ) ) == 0 )
153 fprintf( stderr, "cannot access config file '%s' to save settings\n", file_name );
154 else {
155 fwrite( &config, sizeof( Config ), 1, file );
156 fclose( file );
157 }
158 }
159
+0
-86
src/config.h less more
0 /***************************************************************************
1 config.h - description
2 -------------------
3 begin : Tue Feb 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __CONFIG_H
18 #define __CONFIG_H
19
20 /* configure struct */
21 enum { BALL_BELOW_BONUS = 0, BALL_ABOVE_BONUS };
22 typedef struct {
23 /* directory to save config and saved games */
24 char dir_name[512];
25 /* levels */
26 int levelset_id;
27 int levelset_count; /* save number of levelsets for safety (to reset id if count changed) */
28 int levelset_home_id;
29 int levelset_home_count; /* save number of levelsets for safety (to reset id if count changed) */
30 /* players */
31 int player_count;
32 char player_names[4][32];
33 /* game */
34 int diff; /* diffculty */
35 int startlevel;
36 /* controls */
37 int k_left;
38 int k_right;
39 int k_fire;
40 int control;
41 int rel_motion; /* use relative mouse motion; motion_mod and invert need this enabled */
42 int grab; /* keep mouse in window */
43 int motion_mod;
44 int convex;
45 int invert;
46 float key_speed; /* move with key_speed pix per sec when keys are used */
47 /* sound */
48 int sound;
49 int volume; /* 1 - 8 */
50 int speech; /* enable speech? */
51 /* graphics */
52 int trp;
53 int anim;
54 int fullscreen;
55 int fade;
56 int shadow;
57 int fps; /* frames per second: 0 - no limit, 1 - 50, 2 - 100, 3 - 200 */
58 int ball_level;
59 int i_key_speed; /* integer value that is devided by 100 to get real key_speed */
60 /* various */
61 int use_hints;
62 int return_on_click; /* autoreturn on click if true else automatically */
63 int k_return; /* return ball on click on this key */
64 int theme_id; /* 0 == default theme */
65 int theme_count; /* to check and properly reset id if number of themes changed */
66 char dummy[232]; /* new options will be initiated by space from this dummy array so files won't be corrupted in the future */
67 } Config;
68
69 /* config directory name in home directory */
70 #ifdef _WIN32
71 #define CONFIG_DIR_NAME "lgames"
72 #else
73 #define CONFIG_DIR_NAME ".lgames"
74 #endif
75
76 /* set config to default */
77 void config_reset();
78
79 /* load config */
80 void config_load( );
81
82 /* save config */
83 void config_save( );
84
85 #endif
+0
-121
src/credit.c less more
0 /***************************************************************************
1 credit.c - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "credit.h"
19
20 extern Sdl sdl;
21 extern Font *font;
22 extern SDL_Surface *offscreen;
23
24 SDL_Surface *credit_bkgnd = 0;
25 float credit_alpha;
26 float credit_pms = 0.2;
27 int credit_cur;
28 int credit_time = 4000;
29 int credit_x, credit_y, credit_w, credit_h;
30 char credit_str[64];
31 int credit_status;
32
33 /*
34 ====================================================================
35 Initiate credit.
36 ====================================================================
37 */
38 void credit_init( char *name, char *author, int level )
39 {
40 credit_cur = 0; credit_alpha = 255; credit_status = 0;
41
42 /* string */
43 sprintf( credit_str, "%s (%i) - %s", name, level + 1, author );
44
45 /* position */
46 credit_w = text_width( font, credit_str) + 4;
47 credit_h = font->height + 4;
48 credit_x = (sdl.screen->w - credit_w) / 2;
49 credit_y = sdl.screen->h - 2 - credit_h;
50
51 /* background */
52 if ( credit_bkgnd ) SDL_FreeSurface( credit_bkgnd );
53 credit_bkgnd = create_surf( credit_w, credit_h, SDL_SWSURFACE );
54 SDL_SetColorKey( credit_bkgnd, 0, 0 );
55 FULL_DEST( credit_bkgnd );
56 fill_surf( 0x0 );
57 }
58 void credit_clear()
59 {
60 if ( credit_bkgnd ) SDL_FreeSurface( credit_bkgnd ); credit_bkgnd = 0;
61 }
62 /*
63 ====================================================================
64 Show/Hide credits
65 ====================================================================
66 */
67 void credit_hide()
68 {
69 if (credit_status == 3) return;
70 DEST(sdl.screen, credit_x, credit_y, credit_w, credit_h);
71 SOURCE(offscreen, credit_x, credit_y);
72 blit_surf();
73 add_refresh_rect(credit_x, credit_y, credit_w, credit_h);
74 }
75 void credit_show( )
76 {
77 if (credit_status == 3) return;
78 if ( credit_bkgnd ) {
79 DEST( sdl.screen, credit_x, credit_y, credit_w, credit_h );
80 SOURCE( credit_bkgnd, 0, 0 );
81 alpha_blit_surf( ( credit_alpha / 2 ) + 128 );
82 }
83 font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
84 write_text(font, sdl.screen, credit_x + 2, credit_y + 2, credit_str, (int)credit_alpha);
85 font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
86 }
87 void credit_alphashow( int alpha )
88 {
89 if (credit_status == 3) return;
90 font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
91 write_text(font, sdl.screen, credit_x + 2, credit_y + 2, credit_str, (int)alpha);
92 font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
93 add_refresh_rect(credit_x, credit_y, credit_w, credit_h);
94 }
95 void credit_update( int ms )
96 {
97 /* appearing */
98 if (credit_status == 0) {
99 credit_alpha -= credit_pms * ms;
100 if (credit_alpha <= 0) {
101 credit_status = 1;
102 credit_alpha = 0;
103 }
104 }
105 else
106 /* visible */
107 if (credit_status == 1) {
108 credit_cur += ms;
109 if (credit_cur > credit_time)
110 credit_status = 2;
111 }
112 else
113 /* disappearing */
114 if (credit_status == 2) {
115 credit_alpha += credit_pms * ms;
116 if (credit_alpha >= 255)
117 credit_status = 3;
118 }
119 /* credit_status == 3 means credit disappeared */
120 }
+0
-33
src/credit.h less more
0 /***************************************************************************
1 credit.h - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Initiate credit.
20 ====================================================================
21 */
22 void credit_init( char *name, char *author, int level );
23 void credit_clear();
24 /*
25 ====================================================================
26 Show/Hide credits
27 ====================================================================
28 */
29 void credit_hide();
30 void credit_show();
31 void credit_alphashow( int alpha );
32 void credit_update( int ms );
+0
-38
src/difficulty.c less more
0 /***************************************************************************
1 difficulty.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "difficulty.h"
19
20 int diff_count = 3;
21 Diff diffs[3] = {
22 { 6,10, 20000, 2, 8, 1.00, 0.24, 0.0000010, 0.40 },
23 { 5, 7, 20000, 2, 6, 1.20, 0.26, 0.0000012, 0.42 },
24 { 4, 5, 30000, 1, 4, 1.40, 0.28, 0.0000014, 0.42 }
25 };
26
27 /*
28 ====================================================================
29 Get difficulty level information (easy, normal, hard)
30 ====================================================================
31 */
32 Diff* diff_get( int id )
33 {
34 if ( id < 0 ) id = 0;
35 if ( id > diff_count ) id = diff_count - 1;
36 return &diffs[id];
37 }
+0
-37
src/difficulty.h less more
0 /***************************************************************************
1 difficulty.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Difficulty level specific information.
20 ====================================================================
21 */
22 typedef struct {
23 int lives, max_lives;
24 int life_cost;
25 int paddle_size; /* paddle's starting size */
26 int paddle_max_size; /* max size */
27 float score_mod;
28 float v_start, v_change, v_max; /* velocity for this difficulty */
29 } Diff;
30
31 /*
32 ====================================================================
33 Get difficulty level information (easy, normal, hard)
34 ====================================================================
35 */
36 Diff* diff_get( int id );
+0
-13
src/docs/Makefile.am less more
0 EXTRA_DIST = index.html \
1 x0.jpg x1.jpg x2.jpg x3.jpg x4.jpg x5.jpg x6.jpg x7.jpg \
2 x8.jpg x9.jpg x10.jpg x11.jpg x12.jpg x13.jpg x14.jpg \
3 x15.jpg x16.jpg x17.jpg x18.jpg x19.jpg x20.jpg x21.jpg \
4 x22.jpg x23.jpg \
5 b0.jpg b1.jpg b2.jpg b3.jpg b4.jpg b5.jpg b6.jpg
6
7 install-data-local:
8 $(mkinstalldirs) $(DESTDIR)$(doc_dir)/lbreakout2
9 @for file in *.jpg; do\
10 $(INSTALL_DATA) $$file $(DESTDIR)$(doc_dir)/lbreakout2/$$file;\
11 done
12 $(INSTALL_DATA) index.html $(DESTDIR)$(doc_dir)/lbreakout2/index.html
+0
-187
src/docs/Makefile.in less more
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 CC = @CC@
60 MAKEINFO = @MAKEINFO@
61 PACKAGE = @PACKAGE@
62 RANLIB = @RANLIB@
63 SDL_CFLAGS = @SDL_CFLAGS@
64 SDL_CONFIG = @SDL_CONFIG@
65 SDL_LIBS = @SDL_LIBS@
66 VERSION = @VERSION@
67 doc_dir = @doc_dir@
68 hi_dir = @hi_dir@
69 hi_inst_flag = @hi_inst_flag@
70 inst_dir = @inst_dir@
71 inst_flag = @inst_flag@
72 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
74 warp_flag = @warp_flag@
75
76 EXTRA_DIST = index.html x0.jpg x1.jpg x2.jpg x3.jpg x4.jpg x5.jpg x6.jpg x7.jpg x8.jpg x9.jpg x10.jpg x11.jpg x12.jpg x13.jpg x14.jpg x15.jpg x16.jpg x17.jpg x18.jpg x19.jpg x20.jpg x21.jpg x22.jpg x23.jpg b0.jpg b1.jpg b2.jpg b3.jpg b4.jpg b5.jpg b6.jpg
77
78 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
79 CONFIG_HEADER = ../../config.h
80 CONFIG_CLEAN_FILES =
81 DIST_COMMON = Makefile.am Makefile.in
82
83
84 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
85
86 TAR = gtar
87 GZIP_ENV = --best
88 all: all-redirect
89 .SUFFIXES:
90 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
91 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/docs/Makefile
92
93 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
94 cd $(top_builddir) \
95 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
96
97 tags: TAGS
98 TAGS:
99
100
101 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
102
103 subdir = src/docs
104
105 distdir: $(DISTFILES)
106 @for file in $(DISTFILES); do \
107 d=$(srcdir); \
108 if test -d $$d/$$file; then \
109 cp -pr $$/$$file $(distdir)/$$file; \
110 else \
111 test -f $(distdir)/$$file \
112 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
113 || cp -p $$d/$$file $(distdir)/$$file || :; \
114 fi; \
115 done
116 info-am:
117 info: info-am
118 dvi-am:
119 dvi: dvi-am
120 check-am: all-am
121 check: check-am
122 installcheck-am:
123 installcheck: installcheck-am
124 install-exec-am:
125 install-exec: install-exec-am
126
127 install-data-am: install-data-local
128 install-data: install-data-am
129
130 install-am: all-am
131 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
132 install: install-am
133 uninstall-am:
134 uninstall: uninstall-am
135 all-am: Makefile
136 all-redirect: all-am
137 install-strip:
138 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
139 installdirs:
140
141
142 mostlyclean-generic:
143
144 clean-generic:
145
146 distclean-generic:
147 -rm -f Makefile $(CONFIG_CLEAN_FILES)
148 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
149
150 maintainer-clean-generic:
151 mostlyclean-am: mostlyclean-generic
152
153 mostlyclean: mostlyclean-am
154
155 clean-am: clean-generic mostlyclean-am
156
157 clean: clean-am
158
159 distclean-am: distclean-generic clean-am
160
161 distclean: distclean-am
162
163 maintainer-clean-am: maintainer-clean-generic distclean-am
164 @echo "This command is intended for maintainers to use;"
165 @echo "it deletes files that may require special tools to rebuild."
166
167 maintainer-clean: maintainer-clean-am
168
169 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
170 installcheck-am installcheck install-exec-am install-exec \
171 install-data-local install-data-am install-data install-am install \
172 uninstall-am uninstall all-redirect all-am all installdirs \
173 mostlyclean-generic distclean-generic clean-generic \
174 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
175
176
177 install-data-local:
178 $(mkinstalldirs) $(DESTDIR)$(doc_dir)/lbreakout2
179 @for file in *.jpg; do\
180 $(INSTALL_DATA) $$file $(DESTDIR)$(doc_dir)/lbreakout2/$$file;\
181 done
182 $(INSTALL_DATA) index.html $(DESTDIR)$(doc_dir)/lbreakout2/index.html
183
184 # Tell versions [3.59,3.63) of GNU make to not export all variables.
185 # Otherwise a system limit (for SysV at least) may be exceeded.
186 .NOEXPORT:
src/docs/b0.jpg less more
Binary diff not shown
src/docs/b1.jpg less more
Binary diff not shown
src/docs/b2.jpg less more
Binary diff not shown
src/docs/b3.jpg less more
Binary diff not shown
src/docs/b4.jpg less more
Binary diff not shown
src/docs/b5.jpg less more
Binary diff not shown
src/docs/b6.jpg less more
Binary diff not shown
+0
-376
src/docs/index.html less more
0 <HTML>
1
2 <HEAD>
3 <TITLE>LBreakout2 Manual</TITLE>
4 </HEAD>
5
6 <BODY bgcolor="#ffffff" link="#0000ff" alink="#0000ff" vlink="#0000ff">
7
8 <DIV align="center">
9 <H1>LBreakout2 Manual</H1>
10 maintained by Michael Speck<BR>last change: 02/02/17
11 </DIV>
12
13 <!-- toc -->
14 <P>
15 <H2><A name="toc">Table Of Contents</A></H2>
16 <UL>
17 <LI>
18 <A href="#gameplay">Game Play</A>
19 <UL>
20 <LI><A href="#basics">Basics</A></LI>
21 <LI><A href="#bonus">Bonus/Malus</A></LI>
22 <LI><A href="#bricks">Special Bricks</A></LI>
23 <LI><A href="#keys">Keys</A></LI>
24 </UL>
25 </LI>
26 <LI>
27 <A href="#options">Options</A>
28 <UL>
29 <LI><A href="#new_game">New Game</A></LI>
30 <LI><A href="#controls">Controls</A></LI>
31 <LI><A href="#graphics">Graphics</A></LI>
32 <LI><A href="#audio">Audio</A></LI>
33 <LI><A href="#adv">Advanced Options</A></LI>
34 <LI><A href="#edit_opt">Editor</A></LI>
35 </UL>
36 </LI>
37 <LI>
38 <A href="#editor">Editor</A>
39 <UL>
40 <LI><A href="#misc">Miscellany</A></LI>
41 <LI><A href="#screen">Editor Layout</A></LI>
42 <LI><A href="#howto">How To Edit</A></LI>
43 </UL>
44 </LI>
45 <LI>
46 <A href="#theme">Themes</A>
47 <UL>
48 <LI><A href="#theme_misc">Miscellany</A></LI>
49 <LI><A href="#theme_howto">How To Make A Theme</A></LI>
50 </UL>
51 </LI>
52 </UL>
53 </P>
54
55 <!-- game play -->
56 <P>
57 <H2><A name="gameplay">Game Play</A></H2>
58 <!-- basics -->
59 <H3><A name="basics">Basics</A></H3>
60 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
61 Okay, I guess all of you know how to play breakout basically. Ball bounces around -->
62 paddle keeps ball in game -> all bricks destroyed --> next level ;-D<BR>
63 The chosen difficulty level (see <A href="#options">Options</A>) has some influence
64 on paddle, ball and score. The harder the smaller is the paddle, the faster move the balls,
65 the less lives you have and
66 the more costs a continue but you'll earn a bonus of 20% (medium) or 40% (hard) score
67 when the game's over.<BR>
68 If there is more than one player the next player will get his/her chance when the current
69 one restarts the level or looses all balls. The name of the current/next player is displayed
70 in the right top corner of the screen and before each turn.
71 </TD></TR></TABLE>
72 <!-- bonus/malus -->
73 <H3><A name="bonus">Bonus/Malus</A></H3>
74 <TABLE border=0 cellpadding=5 cellspacing=5>
75 <TR><TD colspan=4>
76 A destroyed brick may release a bonus or malus which will move down slowly. It's
77 used as soon as it is collected by paddle.</TD></TR>
78 <TR bgcolor="#f2f2f2"><TD>Name</TD><TD>Time (in sec)</TD><TD>Picture</TD><TD>Description</TD></TR>
79 <TR bgcolor="#d0f2d0"><TD>Extra Score</TD><TD>-</TD><TD><IMG src="x0.jpg"></TD><TD>Gives you the score written on it.</TD></TR>
80 <TR bgcolor="#d0f2d0"><TD>End Of The Rainbow</TD><TD>20</TD><TD><IMG src="x1.jpg"></TD><TD>If you destroy a brick with no bonus assigned it will release 1000 points extra score!</TD></TR>
81 <TR bgcolor="#d0f2d0"><TD>Expand Paddle</TD><TD>-</TD><TD><IMG src="x3.jpg"></TD><TD>Expands your paddle about one tile (the maxium size depends on the chosen difficulty level).</TD></TR>
82 <TR bgcolor="#d0f2d0"><TD>Extra Life</TD><TD>-</TD><TD><IMG src="x4.jpg"></TD><TD>Gives you one extra life (paddle).</TD></TR>
83 <TR bgcolor="#d0f2d0"><TD>Sticky Paddle</TD><TD>20</TD><TD><IMG src="x5.jpg"></TD><TD>Balls touching the paddle will keep attached until you press fire.</TD></TR>
84 <TR bgcolor="#d0f2d0"><TD>Energy Balls</TD><TD>10</TD><TD><IMG src="x6.jpg"></TD><TD>Balls won't be reflected at a brick but go directly through it.</TD></TR>
85 <TR bgcolor="#d0f2d0"><TD>Extra Ball</TD><TD>-</TD><TD><IMG src="x7.jpg"></TD><TD>Creates a new ball.</TD></TR>
86 <TR bgcolor="#d0f2d0"><TD>Bonus floor</TD><TD>20</TD><TD><IMG src="x8.jpg"></TD><TD>Closes the screen so no balls can get lost.</TD></TR>
87 <TR bgcolor="#d0f2d0"><TD>Weapon</TD><TD>10</TD><TD><IMG src="x10.jpg"></TD><TD>Adds a weapon to the paddle.</TD></TR>
88 <TR bgcolor="#d0f2d0"><TD>Speed Down</TD><TD>20</TD><TD><IMG src="x13.jpg"></TD><TD>Deccelerates all balls to mimum speed.</TD></TR>
89 <TR bgcolor="#d0f2d0"><TD>Joker</TD><TD>-</TD><TD><IMG src="x14.jpg"></TD><TD>Collects all bonus on screen instantly and destroys all malus. Doubles score and time of the collected bonus!</TD></TR>
90 <TR bgcolor="#d0f2d0"><TD>Explosive Balls</TD><TD>10</TD><TD><IMG src="x20.jpg"></TD><TD>When hitting a brick balls will cause an explosion destroying all surounding bricks.</TD></TR>
91 <TR bgcolor="#d0f2d0"><TD>Bonus Magnet</TD><TD>20</TD><TD><IMG src="x21.jpg"></TD><TD>While this bonus is active the paddle will attract other bonuses.</TD></TR>
92
93 <TR bgcolor="#f2f2f2"><TD>Reset</TD><TD>-</TD><TD><IMG src="x18.jpg"></TD><TD>All active bonuses and maluses will be reset.</TD></TR>
94 <TR bgcolor="#f2f2f2"><TD>Time-Add</TD><TD>-</TD><TD><IMG src="x19.jpg"></TD><TD>All active bonuses and maluses will last seven seconds longer.</TD></TR>
95 <TR bgcolor="#f2f2f2"><TD>Random Extra</TD><TD>-</TD><TD><IMG src="x11.jpg"></TD><TD>Gives you any of the listed extras.</TD></TR>
96
97 <TR bgcolor="#f2d0d0"><TD>Speed Up</TD><TD>20</TD><TD><IMG src="x12.jpg"></TD><TD>Accelerates all balls to maximum speed.</TD></TR>
98 <TR bgcolor="#f2d0d0"><TD>Frozen Paddle</TD><TD>1</TD><TD><IMG src="x9.jpg"></TD><TD>Freezes the paddle (no movement possible).</TD></TR>
99 <TR bgcolor="#f2d0d0"><TD>Shrink Paddle</TD><TD>-</TD><TD><IMG src="x2.jpg"></TD><TD>Shrinks your paddle about one paddle tile (18 pixels).</TD></TR>
100 <TR bgcolor="#f2d0d0"><TD>Lights Out!</TD><TD>20</TD><TD><IMG src="x15.jpg"></TD><TD>Total darkness. All you see is a shade of paddle, balls and extras.</TD></TR>
101 <TR bgcolor="#f2d0d0"><TD>Chaos</TD><TD>20</TD><TD><IMG src="x16.jpg"></TD><TD>Balls are reflected randomly at bricks. (but not at paddle)</TD></TR>
102 <TR bgcolor="#f2d0d0"><TD>Ghostly Paddle</TD><TD>20</TD><TD><IMG src="x17.jpg"></TD><TD>Paddle disappears when not moving and won't reflect any balls then. (nor does it collect bonuses)</TD></TR>
103 <TR bgcolor="#f2d0d0"><TD>Malus Magnet</TD><TD>20</TD><TD><IMG src="x22.jpg"></TD><TD>While this malus is active the paddle will attract other maluses.</TD></TR>
104 <TR bgcolor="#f2d0d0"><TD>Weak Balls</TD><TD>20</TD><TD><IMG src="x23.jpg"></TD><TD>With this malus active there is a 40% chance that a ball won't damage a brick.</TD></TR>
105
106 </TD></TR></TABLE>
107 <!-- special bricks -->
108 <H3><A name="bricks">Special Bricks</A></H3>
109 <TABLE border=0 cellpadding=5 cellspacing=5>
110 <TR bgcolor="#f2f2f2"><TD>Name</TD><TD>Picture</TD><TD>Description</TD></TR>
111 <TR bgcolor="#f2f2f2"><TD>Shielded Brick</TD><TD><IMG src="b6.jpg"></TD><TD>This brick is indestructible even for energy balls.</TD></TR>
112 <TR bgcolor="#f2f2f2"><TD>Metal Brick</TD><TD><IMG src="b0.jpg"></TD><TD>This wall is indestructible except for energy balls.</TD></TR>
113 <TR bgcolor="#f2f2f2"><TD>Chaotic Brick</TD><TD><IMG src="b4.jpg"></TD><TD>Similiar to the Chaos Malus the ball is reflected randomly at such a brick.</TD></TR>
114 <TR bgcolor="#f2f2f2"><TD>Strong Brick</TD><TD><IMG src="b1.jpg"></TD><TD>These walls take up to three shots before destruction and grow darker with every hit. NOTE: to this series belongs a forth brick which is invisbile.</TD></TR>
115 <TR bgcolor="#f2f2f2"><TD>Regenerating Brick</TD><TD><IMG src="b5.jpg"></TD><TD>This brick will regenerate one point durability within four seconds if not hit again.</TD></TR>
116 <TR bgcolor="#f2f2f2"><TD>Explosive Brick</TD><TD><IMG src="b2.jpg"></TD><TD>This bricks destroys its neighbors on destruction.</TD></TR>
117 <TR bgcolor="#f2f2f2"><TD>Growing Brick</TD><TD><IMG src="b3.jpg"></TD><TD>If this brick is destroyed it creates up to 8 new bricks.</TD></TR>
118 </TD></TR></TABLE>
119 <!-- keys -->
120 <H3><A name="keys">Keys</A></H3>
121 <TABLE border=0 cellpadding=5 cellspacing=5>
122 <TR bgcolor="#f2f2f2"><TD colspan=2>There are some predefined keys for LBreakout:</TD></TR>
123 <TR bgcolor="#f2f2f2"><TD>Escape</TD><TD>Quit LBreakout (after confirmation).</TD></TR>
124 <TR bgcolor="#f2f2f2"><TD>r</TD><TD>Restart level. If more than player the next one will get his chancebefore this player may play the restarted level!</TD></TR>
125 <TR bgcolor="#f2f2f2"><TD>p</TD><TD>Pause game.</TD></TR>
126 <TR bgcolor="#f2f2f2"><TD>f</TD><TD>Switch Fullscreen and Windowed mode.</TD></TR>
127 <TR bgcolor="#f2f2f2"><TD>a</TD><TD>Change animation level (off/low/high).</TD></TR>
128 <TR bgcolor="#f2f2f2"><TD>s</TD><TD>Turn on/off sound.</TD></TR>
129 </TABLE>
130 </P>
131 <P>
132 <A href="#toc">ToC</A>
133 </P>
134
135 <!-- options -->
136 <P>
137 <H2><A name="options">Options</A></H2>
138 <!-- new game -->
139 <H3><A name="new_game">New Game</A></H3>
140 <TABLE border=0 cellpadding=5 cellspacing=5>
141 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>New Game</I>:</TD></TR>
142 <TR bgcolor="#f2f2f2"><TD>Start Game</TD><TD>Start game with the specified options.</TD></TR>
143 <TR bgcolor="#f2f2f2"><TD>Levelset</TD><TD>This is the levelset you actually want to play. LBreakout parses the installation path and ~/.lbreakout/levels for valid levelsets. Levelsets found in the home directory have an '~' in front of the actual name.</TD></TR>
144 <TR bgcolor="#f2f2f2"><TD>Difficulty</TD><TD>Difficulty is either <I>easy, medium</I> or <I>hard</I>. See the <A href="#basics">Basics</A> for more info.</TD></TR>
145 <TR bgcolor="#f2f2f2"><TD>Players</TD><TD>How many players? Four at maximum.</TD></TR>
146 <TR bgcolor="#f2f2f2"><TD>1st, 2nd, 3rd, 4th</TD><TD>Names of the players.</TD></TR>
147 </TABLE>
148 <!-- controls -->
149 <H3><A name="controls">Controls</A></H3>
150 <TABLE border=0 cellpadding=5 cellspacing=5>
151 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>Controls</I>:</TD></TR>
152 <TR bgcolor="#f2f2f2"><TD>Left, Right, Fire</TD><TD>Keys for paddle movement.</TD></TR>
153 <TR bgcolor="#f2f2f2"><TD>Grab Mouse</TD><TD>Keep mouse in window? Useful for windowed mode. Grab is turned off when confirming something or having a break.</TD></TR>
154 <TR bgcolor="#f2f2f2"><TD>Relative Motion</TD><TD>Invert and motion modifier to only work for this option enabled. But note: enabling this option already slows down the mouse so you'll have to play around with the motion modifier to fit your needs.</TD></TR>
155 <TR bgcolor="#f2f2f2"><TD>Motion Modifier</TD><TD>Slows down or speeds up mouse motion.</TD></TR>
156 <TR bgcolor="#f2f2f2"><TD>Invert Motion</TD><TD>Invert paddle motion.</TD></TR>
157 <TR bgcolor="#f2f2f2"><TD>Input</TD><TD>Is either <I>Keyboard'n'Mouse, Mouse Only</I> or <I>Keyboard Only</I>.</TD></TR>
158 </TABLE>
159 <!-- graphics -->
160 <H3><A name="graphics">Graphics</A></H3>
161 <TABLE border=0 cellpadding=5 cellspacing=5>
162 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>Graphics</I>:</TD></TR>
163 <TR bgcolor="#f2f2f2"><TD>Animations</TD><TD>Animation level. Using no or low animations will increase frame rate a lot.</TD></TR>
164 <TR bgcolor="#f2f2f2"><TD>Transparency</TD><TD>Use transparency effects?</TD></TR>
165 <TR bgcolor="#f2f2f2"><TD>Shadow</TD><TD>Shadow of frame, bricks, balls, bonus and paddle.</TD></TR>
166 <TR bgcolor="#f2f2f2"><TD>Display</TD><TD>Either <I>Fullscreen</I> or <I>Window</I>. Is switched directly after changing this option.</TD></TR>
167 <TR bgcolor="#f2f2f2"><TD>Frame Rate</TD><TD>Either <I>200 FPS, 100 FPS, 50 FPS</I> or <I>Unlimited</I>. <I>Unlimited</I> is recommended for best performance, but if you got any jobs running you should limit the frame rate to prevent LBreakout from consuming 100% CU time.</TD></TR>
168 </TABLE>
169 <!-- audio -->
170 <H3><A name="audio">Audio</A></H3>
171 <TABLE border=0 cellpadding=5 cellspacing=5>
172 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>Audio</I>:</TD></TR>
173 <TR bgcolor="#f2f2f2"><TD>Sound</TD><TD>Enable/disable sound.</TD></TR>
174 <TR bgcolor="#f2f2f2"><TD>Speech</TD><TD>Enable speech samples (might get on your nerves so I added this option).</TD></TR>
175 <TR bgcolor="#f2f2f2"><TD>Volume</TD><TD>Sound volume between 1-8.</TD></TR>
176 </TABLE>
177 <!-- advanced -->
178 <H3><A name="adv">Advanced Options</A></H3>
179 <TABLE border=0 cellpadding=5 cellspacing=5>
180 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>Advanced Options</I>:</TD></TR>
181 <TR bgcolor="#f2f2f2"><TD>Convex Paddle</TD><TD>If this options is enabled the paddle's surface is treated as convex which simplifies aiming a lot.<BR>If this option is disabled the original paddle physics are used. Influencing the ball's direction does only work with the paddle's hemisphere at each end and friction by paddle movement. Very difficult.</TD></TR>
182 <TR bgcolor="#f2f2f2"><TD>Balls</TD><TD>Either <I>Below Bonuses</I> or <I>Above Bonuses</I>. <I>Below Bonuses</I> is default but with lots of bonuses on screen balls may be hard to spot so switch to <I>Above Bonuses</I> then.</TD></TR>
183 <TR bgcolor="#f2f2f2"><TD>Key Speed</TD><TD>This is the speed with which the paddle moves when using keyboard for input.</TD></TR>
184 <TR bgcolor="#f2f2f2"><TD>Return Balls</TD>
185 <TD>
186 If a ball does not damage a brick within ten seconds it is allowed to return to the paddle.
187 If this option is set to <I>Auto</I> it will automatically return and if this option is set
188 to <I>By Click</I> you'll have to press the middle mouse button or the 'back'-key (default is Backspace).
189 </TD></TR>
190 <TR bgcolor="#f2f2f2"><TD>Use Hints</TD><TD>Enables/disables the quick hint system.</TD></TR>
191 <TR bgcolor="#f2f2f2"><TD>Select Theme</TD><TD>Here you may select another theme for LBreakout2.</TD></TR>
192 </TABLE>
193 </P>
194 <!-- editor options -->
195 <H3><A name="edit_opt">Editor</A></H3>
196 <TABLE border=0 cellpadding=5 cellspacing=5>
197 <TR bgcolor="#f2f2f2"><TD colspan=2>Options in menu <I>Editor</I>:</TD></TR>
198 <TR bgcolor="#f2f2f2"><TD>Set</TD><TD>The set file in your config directory '~/.lbreakout2/levels' you want to edit or delete. If you select <I>'&lt;CREATE SET&gt;'</I> and hit edit you'll be asked for a set name and then this set will be created.</TD></TR>
199 <TR bgcolor="#f2f2f2"><TD>Edit Set</TD><TD>Edit (or create) this set.</TD></TR>
200 <TR bgcolor="#f2f2f2"><TD>Delete Set</TD><TD>Delete this set.</TD></TR>
201 </TABLE>
202 </P>
203 <P>
204 <A href="#toc">ToC</A>
205 </P>
206
207 <!-- editor -->
208 <P>
209 <H2><A name="editor">Editor</A></H2>
210 <!-- general -->
211 <H3><A name="misc">Miscellany</A></H3>
212 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
213 All files you edit are saved to <B>~/.lbreakout2/levels</B>. This '~' you see in front of
214 the name when choosing levelset for playing is not part of the file name but added afterwards
215 to separate the files in the installation path from the files in the config path (these you may
216 edit).
217 </TD></TR></TABLE>
218 <!-- screen -->
219 <H3><A name="screen">Editor Layout</A></H3>
220 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2">
221 <TR>
222 <TD><CENTER><IMG alt="editor overview" src="screen.jpg"></CENTER></TD>
223 <TD>
224 Actions like quit, save, load, clear, add, insert, remove require a confirmation for safety.
225 <OL>
226 <LI>Editable Part</LI>
227 <LI>Bricks and Bonus</LI>
228 <LI>Information about location of set file and how many levels you already created, which level your currently on and how many levels more you may create. If you marked a level for swap it's displayed there, too.</LI>
229 <LI>Click on title to change title of this level.</LI>
230 <LI>Click here to change author's name for this level.</LI>
231 <LI>Click here to test this level.</LI>
232 <LI>Go to first level.</LI>
233 <LI>Go to next level.</LI>
234 <LI>Go to previous level.</LI>
235 <LI>Clear all bricks and bonus in this level.</LI>
236 <LI>Swap two levels. On first click the current level will be marked (info displayed in region 3), on second click the current and the marked level will be swapped.</LI>
237 <LI>Insert a level at the end (copies title and author of previously last level).</LI>
238 <LI>Insert a level at current position (copying current title and author).</LI>
239 <LI>Remove current level.</LI>
240 <LI>Reload this level set (discards all unsaved changes).</LI>
241 <LI>Save this levelset (save all changes).</LI>
242 </UL>
243 </TD>
244 </TR>
245 </TABLE>
246 <!-- how to edit -->
247 <H3><A name="howto">How To Edit</A></H3>
248 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
249 Very simple. Select a brick or a bonus by left-click (right-click into the section to switch between the
250 brick and the bonus set) from the bottom of the screen (red-yellow selection
251 frame) go to the editable part and left-click. Right click will remove a brick
252 (any brick and its bonus if a brick's selected) or bonus (any bonus without touching the
253 brick if bonus selected). You may move the mouse while having left or right buttom
254 pressed. To parse/add/remove any levels or save/load this set use the buttons as explained
255 above. You may use the cursor keys, too (UP - first level, RIGHT - next level,
256 LEFT - previous level). Pressing ESCAPE leaves the editor after confirmation.
257 </TD></TR></TABLE>
258 </P>
259 <P>
260 <A href="#toc">ToC</A>
261 </P>
262
263 <!-- themes -->
264 <P>
265 <H2><A name="theme">Themes</A></H2>
266 <!-- miscellany-->
267 <H3><A name="theme_misc">Miscellany</A></H3>
268 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
269 <P>
270 If you want to run LBreakout2 with other graphics and sounds you can create a
271 theme which allows you to modify all ingame gfx and sounds. The menu is not themeable
272 (and before you ask: the answer is no ;-).
273 The use of new backgrounds is also allowed. The following list contains all editable
274 graphics and sounds. What you have to do to edit them is explained <A href="#theme_howto">below</A>.
275 </P>
276 <P>
277 <I>Editable graphics:</I>
278 <TABLE border=0 cellpadding=2 cellspacing=2>
279 <TR><TD bgcolor="#dddddd">ball.png</TD><TD></TD></TR>
280 <TR><TD bgcolor="#dddddd">bricks.png</TD><TD></TD></TR>
281 <TR><TD bgcolor="#dddddd">explosions.png</TD><TD>normal explosions</TD></TR>
282 <TR><TD bgcolor="#dddddd">explosions_dark.png</TD><TD>explosions if darkness malus is active</TD></TR>
283 <TR><TD bgcolor="#dddddd">extras.png</TD><TD></TD></TR>
284 <TR><TD bgcolor="#dddddd">f_frame.png</TD><TD>font used for score and player name in the right upper corner of the frame</TD></TR>
285 <TR><TD bgcolor="#dddddd">f_game.png</TD><TD>font used for level credits and confirmation</TD></TR>
286 <TR><TD bgcolor="#dddddd">fr_left.png</TD><TD>left part of frame</TD></TR>
287 <TR><TD bgcolor="#dddddd">fr_right.png</TD><TD>right part of frame</TD></TR>
288 <TR><TD bgcolor="#dddddd">fr_top.png</TD><TD>top part of frame</TD></TR>
289 <TR><TD bgcolor="#dddddd">life.png</TD><TD>life lamps displayed in the left bottom corner of the frame</TD></TR>
290 <TR><TD bgcolor="#dddddd">paddle.png</TD><TD></TD></TR>
291 <TR><TD bgcolor="#dddddd">shine.png</TD><TD>animation running accross bricks</TD></TR>
292 <TR><TD bgcolor="#dddddd">shot.png</TD><TD>shot of the plasma weapon</TD></TR>
293 <TR><TD bgcolor="#dddddd">weapon.png</TD><TD>weapon displayed on the paddle</TD></TR>
294 </TABLE>
295 </P>
296 <P>
297 <I>Editable sounds:</I>
298 <TABLE border=0 cellpadding=2 cellspacing=2>
299 <TR><TD bgcolor="#dddddd">attach.wav</TD><TD>played if ball is attached to sticky paddle</TD><TD bgcolor="#dddddd">joker.wav</TD><TD>bonus sound</TD></TR>
300 <TR><TD bgcolor="#dddddd">bonus_magnet.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">looselife.wav</TD><TD>played if you loose a life</TD></TR>
301 <TR><TD bgcolor="#dddddd">chaos.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">malus_magnet.wav</TD><TD>malus sound</TD></TR>
302 <TR><TD bgcolor="#dddddd">click.wav</TD><TD>played if key was pressed (e.g. confirmation)</TD><TD bgcolor="#dddddd">metal.wav</TD><TD>enery ball sound</TD></TR>
303 <TR><TD bgcolor="#dddddd">dammit.wav</TD><TD><I>Dammit!</I> speech sample</TD><TD bgcolor="#dddddd">reflect.wav</TD><TD>ball reflection sound</TD></TR>
304 <TR><TD bgcolor="#dddddd">damn.wav</TD><TD><i>Damn!</I> speech sample</TD><TD bgcolor="#dddddd">score.wav</TD><TD>bonus sound</TD></TR>
305 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">darkness.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">shot.wav</TD><TD>weapon's firing noise</TD></TR>
306 <TR><TD bgcolor="#dddddd">disable.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">shrink.wav</TD><TD>malus sound</TD></TR>
307 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">excellent.wav</TD><TD><I>Excellent!</I> speech sample</TD><TD bgcolor="#dddddd">speeddown.wav</TD><TD>bonus sound</TD></TR>
308 <TR><TD bgcolor="#dddddd">exp.wav</TD><TD>brick explosion sound</TD><TD bgcolor="#dddddd">speedup.wav</TD><TD>malus sound</TD></TR>
309 <TR><TD bgcolor="#dddddd">expand.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">standard.wav</TD><TD>standard sound for collecting an extra </TD></TR>
310 <TR><TD bgcolor="#dddddd">expl_ball.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">timeadd.wav</TD><TD>bonus sound</TD></TR>
311 <TR><TD bgcolor="#dddddd">extraball.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">verygood.wav</TD><TD><I>Very Good!</I> speech sample</TD></TR>
312 <TR><TD bgcolor="#dddddd">freeze.wav</TD><TD>malus sound</TD><TD bgcolor="#dddddd">wall.wav</TD><TD>bonus sound</TD></TR>
313 <TR><TD bgcolor="#dddddd">gainlife.wav</TD><TD>played if you got an extralife</TD><TD bgcolor="#dddddd">weak_ball.wav</TD><TD>malus sound</TD></TR>
314 <TR><TD bgcolor="#dddddd">ghost.wav</TD><TD>bonus sound</TD><TD bgcolor="#dddddd">wontgiveup.wav</TD><TD><I>I won't give up!</I> speech sample</TD></TR>
315 <TR><TD bgcolor="#dddddd" bgcolor="#dddddd">goldshower.wav</TD><TD>bonus sound</TD><TD>&nbsp;</TD></TR>
316 </TABLE>
317 </P>
318 </TD></TR></TABLE>
319 <!-- steps -->
320 <H3><A name="theme_howto">How To Make A Theme</A></H3>
321 <TABLE border=0 cellpadding=5 cellspacing=5 bgcolor="#f2f2f2"><TR><TD>
322 <OL>
323 <LI>Create a directory in <I>~/.lgames/lbreakout2-themes</I> with the name of your theme.</LI>
324 <LI>
325 Have a look at the original graphics and sounds located in the
326 <I>gfx</I> and <I>sounds</I> directory in the <I>source path</I> or
327 in <I>/usr/local/share/games/lbreakout2</I>.
328 </LI>
329 <LI>
330 Now change a graphic or sound to your liking and save it with the
331 same name to <I>~/.lgames/lbreakout2-themes</I>. <BR>
332 <I>Note:</I>
333 <UL>
334 <LI>You <U>must not</U> change the measurements of a graphic!</LI>
335 <LI>Do not save it to a subdirectory <I>gfx</I> or <I>sounds</I> but directly to <I>~/.lgames/lbreakout2-themes/MyTheme</I>!</LI>
336 <LI>A graphic or sound that can't be found in your theme directory is loaded from the
337 original resources.</LI>
338 <LI>Handling of backgrounds is special. As long as you do not provide a back0.png file
339 the original backgrounds are used. If you want to use self-made backgrounds
340 you'll have to save them as back<I>indices</I>.png where your first indices must be 0.
341 If this happens LBreakout2 will only use the backgrounds found in your theme directory (six backgrounds at maximum).
342 This means if you only provide one background LBreakout2 will only use this background
343 throughout the game as long as your theme is running.
344 </UL>
345 </LI>
346 <LI>
347 Run LBreakout2 and select your theme in <I>Advanced Options/Select Theme</I>.
348 </LI>
349 <LI>
350 If everything works fine add a README with credits and a description.
351 </LI>
352 <LI>
353 Tar.gz your theme directory and send it to
354 <A href="mailto:kulkanie@gmx.net">kulkanie@gmx.net</A> and I'll add it to the site.<BR>
355 Please provide the following information (either in the mail
356 or in the README):<BR>
357 <OL>
358 <LI>Full title</LI>
359 <LI>Version number</LI>
360 <LI>Your name</LI>
361 <LI>Email-address for feedback</LI>
362 <LI>Description</LI>
363 <LI>A jpg screenshot with your theme in action (press TAB while playing).</LI>
364 </OL>
365 </LI>
366 </OL>
367 </TD></TR></TABLE>
368 </P>
369 <P>
370 <A href="#toc">ToC</A>
371 </P>
372
373 </BODY>
374
375 </HTML>
src/docs/x0.jpg less more
Binary diff not shown
src/docs/x1.jpg less more
Binary diff not shown
src/docs/x10.jpg less more
Binary diff not shown
src/docs/x11.jpg less more
Binary diff not shown
src/docs/x12.jpg less more
Binary diff not shown
src/docs/x13.jpg less more
Binary diff not shown
src/docs/x14.jpg less more
Binary diff not shown
src/docs/x15.jpg less more
Binary diff not shown
src/docs/x16.jpg less more
Binary diff not shown
src/docs/x17.jpg less more
Binary diff not shown
src/docs/x18.jpg less more
Binary diff not shown
src/docs/x19.jpg less more
Binary diff not shown
src/docs/x2.jpg less more
Binary diff not shown
src/docs/x20.jpg less more
Binary diff not shown
src/docs/x21.jpg less more
Binary diff not shown
src/docs/x22.jpg less more
Binary diff not shown
src/docs/x23.jpg less more
Binary diff not shown
src/docs/x3.jpg less more
Binary diff not shown
src/docs/x4.jpg less more
Binary diff not shown
src/docs/x5.jpg less more
Binary diff not shown
src/docs/x6.jpg less more
Binary diff not shown
src/docs/x7.jpg less more
Binary diff not shown
src/docs/x8.jpg less more
Binary diff not shown
src/docs/x9.jpg less more
Binary diff not shown
+0
-820
src/editor.c less more
0 /***************************************************************************
1 editor.c - description
2 -------------------
3 begin : Fri Oct 12 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "chart.h"
19 #include "config.h"
20 #include "event.h"
21 #include "levels.h"
22 #include "bricks.h"
23 #include "extras.h"
24 #include "frame.h"
25 #include "game.h"
26 #ifdef SOUND
27 #include "audio.h"
28 #endif
29 #include "editor.h"
30
31 SDL_Surface *sel_frame = 0, *buttons = 0;
32 SDL_Surface *editor_bkgnd = 0; /* background (black with frame) of editor */
33 enum { EDITOR_LEVEL_LIMIT = 40 };
34 char edit_file_name[512]; /* full path of edited file */
35 Level *edit_levels[EDITOR_LEVEL_LIMIT]; /* editor levels */
36 int edit_level_count; /* how many levels currently used? */
37 int edit_cur_level_id;
38 Level *edit_cur_level; /* current level modified */
39 enum { EDITOR_BRICK, EDITOR_EXTRA };
40 int edit_sel_type; /* type of selected tile */
41 int edit_sel_id; /* brick or extra id */
42 int edit_sel_x, edit_sel_y; /* position in map of selected tile */
43 int edit_tile_x = 1, edit_tile_y = 20, edit_tile_w = MAP_WIDTH - 2, edit_tile_h = 3; /* part where either bricks ro bonuses
44 are displayed */
45 int extra_vis; /* extras currently shown? blinks. */
46 int first_swap_level = -1; /* if not -1 this and the current level will be swapped
47 next time the button is pressed */
48 enum {
49 /* tiles */
50 BUTTON_NONE = 0,
51 BUTTON_FIRST_BRICK,
52 BUTTON_LAST_BRICK = BUTTON_FIRST_BRICK + ( BRICK_COUNT ),
53 BUTTON_FIRST_EXTRA,
54 BUTTON_LAST_EXTRA = BUTTON_FIRST_EXTRA + ( EX_NUMBER -1 ),
55 BUTTON_EDIT,
56 BUTTON_EDIT_AUTHOR,
57 BUTTON_EDIT_NAME,
58 /* buttons */
59 BUTTON_FIRST,
60 BUTTON_NEXT,
61 BUTTON_PREV,
62 BUTTON_CLEAR,
63 BUTTON_SWAP,
64 BUTTON_ADD,
65 BUTTON_INSERT,
66 BUTTON_DELETE,
67 BUTTON_LOAD,
68 BUTTON_SAVE,
69 BUTTON_PLAY
70 };
71 int edit_buttons[MAP_WIDTH][MAP_HEIGHT]; /* an action is assigned to each map tile */
72 /* externals */
73 extern Sdl sdl;
74 extern SDL_Surface *frame;
75 extern SDL_Surface *extra_pic;
76 extern SDL_Surface *brick_pic;
77 extern Font *frame_font; /* use frame's font to draw status */
78 extern Font *font; /* use game's font to confirm */
79 extern int motion, motion_x, motion_y, motion_button;
80 extern Config config;
81 extern int term_game;
82
83 /* extra conversion table may be found in bricks.c */
84 extern Extra_Conv extra_conv_table[EX_NUMBER];
85 extern Brick_Conv brick_conv_table[BRICK_COUNT];
86
87 /*
88 ====================================================================
89 Locals
90 ====================================================================
91 */
92
93 /*
94 ====================================================================
95 We had a right click into the tile region so check and change the
96 bricks displayed there. We select the first new tile and set
97 edit_sel_id, edit_sel_x, edit_sel_y. The full update is initated
98 by editor_handle_click().
99 ====================================================================
100 */
101 void editor_switch_tiles()
102 {
103 int x_off = 2, y_off = 20, len = MAP_WIDTH - x_off * 2; /* offset in map of tiles, len is the number of tiles in one line */
104 int i, j;
105 /* clear edit buttons */
106 for ( i = edit_tile_x; i < edit_tile_x + edit_tile_w; i++ )
107 for ( j = edit_tile_y; j < edit_tile_y + edit_tile_h; j++ )
108 edit_buttons[i][j] = BUTTON_NONE;
109 /* clear this part of the editor bkjgnd */
110 DEST( editor_bkgnd, edit_tile_x * BRICK_WIDTH, edit_tile_y * BRICK_HEIGHT,
111 edit_tile_w * BRICK_WIDTH, edit_tile_h * BRICK_HEIGHT );
112 fill_surf( 0x0 );
113 /* switch */
114 if ( edit_sel_type == EDITOR_BRICK ) {
115 /* flag */
116 edit_sel_type = EDITOR_EXTRA;
117 /* button map & background */
118 i = 0; j = 0;
119 while ( i + j * len < EX_NUMBER ) {
120 edit_buttons[x_off + i][y_off + j] = BUTTON_FIRST_EXTRA + i + j * len;
121 DEST( editor_bkgnd, ( i + x_off ) * BRICK_WIDTH, ( j + y_off ) * BRICK_HEIGHT,
122 BRICK_WIDTH, BRICK_HEIGHT );
123 SOURCE( extra_pic, ( i + j * len ) * BRICK_WIDTH, 0 );
124 blit_surf();
125 i++;
126 if ( i == len ) {
127 i = 0;
128 j++;
129 }
130 }
131 /* select first tile */
132 edit_sel_id = 0;
133 edit_sel_x = x_off;
134 edit_sel_y = y_off;
135 }
136 else {
137 /* flag */
138 edit_sel_type = EDITOR_BRICK;
139 /* button map & background */
140 i = 0; j = 0;
141 while ( i + j * len < BRICK_COUNT ) {
142 edit_buttons[x_off + i][y_off + j] = BUTTON_FIRST_BRICK + i + j * len;
143 DEST( editor_bkgnd, ( i + x_off ) * BRICK_WIDTH, ( j + y_off ) * BRICK_HEIGHT,
144 BRICK_WIDTH, BRICK_HEIGHT );
145 SOURCE( brick_pic, ( i + j * len ) * BRICK_WIDTH, 0 );
146 blit_surf();
147 i++;
148 if ( i == len ) {
149 i = 0;
150 j++;
151 }
152 }
153 /* select first tile */
154 edit_sel_id = 0;
155 edit_sel_x = x_off;
156 edit_sel_y = y_off;
157 }
158 }
159
160 /*
161 ====================================================================
162 Draw a helping grid.
163 ====================================================================
164 */
165 void editor_draw_grid()
166 {
167 SDL_Surface *buffer;
168 int i;
169 buffer = create_surf( EDIT_WIDTH * BRICK_WIDTH, 1, SDL_SWSURFACE );
170 FULL_DEST( buffer ); fill_surf( 0xffffff );
171 DEST( editor_bkgnd, BRICK_WIDTH, BRICK_HEIGHT, buffer->w, buffer->h );
172 FULL_SOURCE( buffer );
173 blit_surf();
174 DEST( editor_bkgnd, BRICK_WIDTH, ( EDIT_HEIGHT + 1 ) * BRICK_HEIGHT - 1, buffer->w, buffer->h );
175 FULL_SOURCE( buffer );
176 blit_surf();
177 for ( i = 0; i < EDIT_HEIGHT - 1; i++ ) {
178 DEST( editor_bkgnd, BRICK_WIDTH, ( i + 1 ) * BRICK_HEIGHT + BRICK_HEIGHT- 1, buffer->w, buffer->h );
179 FULL_SOURCE( buffer );
180 if ( i == EDIT_HEIGHT / 2 - 1 )
181 alpha_blit_surf( 64 );
182 else
183 if ( i % (EDIT_HEIGHT/4) == 0 )
184 alpha_blit_surf( 128 );
185 else
186 alpha_blit_surf( 192 );
187 }
188 SDL_FreeSurface( buffer );
189 buffer = create_surf( 1, EDIT_HEIGHT * BRICK_HEIGHT, SDL_SWSURFACE );
190 FULL_DEST( buffer ); fill_surf( 0xffffff );
191 DEST( editor_bkgnd, BRICK_WIDTH, BRICK_HEIGHT, buffer->w, buffer->h );
192 FULL_SOURCE( buffer );
193 blit_surf();
194 DEST( editor_bkgnd, ( EDIT_WIDTH + 1 ) * BRICK_WIDTH - 1, BRICK_HEIGHT, buffer->w, buffer->h );
195 FULL_SOURCE( buffer );
196 blit_surf();
197 for ( i = 0; i < EDIT_WIDTH - 1; i++ ) {
198 DEST( editor_bkgnd, ( i + 1 ) * BRICK_WIDTH + BRICK_WIDTH- 1, BRICK_HEIGHT, buffer->w, buffer->h );
199 FULL_SOURCE( buffer );
200 if ( i == EDIT_WIDTH / 2 - 1 )
201 alpha_blit_surf( 64 );
202 else
203 if ( i % (EDIT_WIDTH/4) == 0 )
204 alpha_blit_surf( 128 );
205 else
206 alpha_blit_surf( 192 );
207 }
208 SDL_FreeSurface( buffer );
209 }
210
211 /*
212 ====================================================================
213 Translate the saved character strings into extra and brick indices
214 for the editor.
215 ====================================================================
216 */
217 enum { INDICES_2_CHAR, CHAR_2_INDICES };
218 void editor_translate_level( Level *level, int type )
219 {
220 int i, j, k;
221 if ( type == CHAR_2_INDICES ) {
222 for ( i = 0; i < EDIT_WIDTH; i++ )
223 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
224 /* bricks */
225 for ( k = 0; k < BRICK_COUNT; k++ )
226 if ( brick_conv_table[k].c == level->bricks[i][j] ) {
227 level->bricks[i][j] = brick_conv_table[k].id;
228 break;
229 }
230 if ( k == BRICK_COUNT ) level->bricks[i][j] = -1;
231 /* extras */
232 for ( k = 0; k < EX_NUMBER; k++ )
233 if ( extra_conv_table[k].c == level->extras[i][j] ) {
234 level->extras[i][j] = extra_conv_table[k].type;
235 break;
236 }
237 if ( k == EX_NUMBER ) level->extras[i][j] = EX_NONE;
238 }
239 }
240 else {
241 /* indices to characters */
242 for ( i = 0; i < EDIT_WIDTH; i++ )
243 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
244 /* bricks */
245 if ( level->bricks[i][j] == -1 )
246 level->bricks[i][j] = '.';
247 else
248 for ( k = 0; k < BRICK_COUNT; k++ )
249 if ( level->bricks[i][j] == brick_conv_table[k].id ) {
250 level->bricks[i][j] = brick_conv_table[k].c;
251 break;
252 }
253 /* extras */
254 if ( level->extras[i][j] == EX_NONE )
255 level->extras[i][j] = '.';
256 else
257 for ( k = 0; k < EX_NUMBER; k++ )
258 if ( level->extras[i][j] == extra_conv_table[k].type ) {
259 level->extras[i][j] = extra_conv_table[k].c;
260 break;
261 }
262 }
263 }
264 }
265 /*
266 ====================================================================
267 Draw name of set file, current level, current count, remaining
268 levels, and other info stuff.
269 ====================================================================
270 */
271 void editor_draw_status()
272 {
273 char str[512];
274 int x = BRICK_WIDTH, y = ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT - 2;
275 int height = 10;
276 /* locartion */
277 sprintf( str, "Location: %s", edit_file_name );
278 frame_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
279 write_text( frame_font, sdl.screen, x, y, str, OPAQUE );
280 /* current level */
281 sprintf( str, "Current Level: %i/%i (Free: %i)", edit_cur_level_id + 1, edit_level_count, EDITOR_LEVEL_LIMIT - edit_level_count );
282 frame_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
283 write_text( frame_font, sdl.screen, x, y + height, str, OPAQUE );
284 /* swap */
285 if ( first_swap_level != -1 ) {
286 frame_font->align = ALIGN_X_RIGHT | ALIGN_Y_TOP;
287 sprintf( str, "*** Level %i Marked For Swap ***", first_swap_level + 1 );
288 write_text( frame_font, sdl.screen, sdl.screen->w - BRICK_WIDTH, y + height, str, OPAQUE );
289 }
290 /* name and author */
291 frame_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
292 sprintf( str, "Title: %s", edit_cur_level->name );
293 write_text( frame_font, sdl.screen, BRICK_WIDTH + 2, ( MAP_HEIGHT - 5 ) * BRICK_HEIGHT + 5, str, OPAQUE );
294 frame_font->align = ALIGN_X_RIGHT | ALIGN_Y_TOP;
295 sprintf( str, "Author: %s", edit_cur_level->author );
296 write_text( frame_font, sdl.screen, sdl.screen->w - BRICK_WIDTH - 2, ( MAP_HEIGHT - 5 ) * BRICK_HEIGHT + 5, str, OPAQUE );
297 }
298 /*
299 ====================================================================
300 Draw brick and extra (if any) from screen map pos
301 so it fits the editable field (no frame, no bottom).
302 ====================================================================
303 */
304 void editor_draw_brick( int edit_map_x, int edit_map_y )
305 {
306 /* brick */
307 if ( edit_cur_level->bricks[edit_map_x][edit_map_y] != -1 ) {
308 DEST( sdl.screen, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT,
309 BRICK_WIDTH, BRICK_HEIGHT );
310 if ( edit_cur_level->bricks[edit_map_x][edit_map_y] != INVIS_BRICK_ID ) {
311 SOURCE( brick_pic, edit_cur_level->bricks[edit_map_x][edit_map_y] * BRICK_WIDTH, 0 );
312 blit_surf();
313 }
314 else {
315 fill_surf( 0x777777 );
316 }
317 }
318 else {
319 DEST( sdl.screen, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT,
320 BRICK_WIDTH, BRICK_HEIGHT );
321 SOURCE( editor_bkgnd, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT );
322 blit_surf();
323 }
324 /* extra */
325 if ( ( extra_vis || edit_sel_type == EDITOR_EXTRA ) && edit_cur_level->extras[edit_map_x][edit_map_y] != EX_NONE) {
326 DEST( sdl.screen, (edit_map_x + 1) * BRICK_WIDTH, (edit_map_y + 1) * BRICK_HEIGHT,
327 BRICK_WIDTH, BRICK_HEIGHT );
328 SOURCE( extra_pic, ( edit_cur_level->extras[edit_map_x][edit_map_y] ) * BRICK_WIDTH, 0 );
329 blit_surf();
330 }
331 }
332 /*
333 ====================================================================
334 Redraw and refresh full screen
335 ====================================================================
336 */
337 void editor_full_update()
338 {
339 int i, j;
340 /* background */
341 FULL_DEST( sdl.screen );
342 FULL_SOURCE( editor_bkgnd );
343 blit_surf();
344 /* bricks&extras */
345 for ( i = 0; i < EDIT_WIDTH; i++ )
346 for ( j = 0; j < EDIT_HEIGHT; j++ )
347 editor_draw_brick( i, j );
348 /* selection frame */
349 DEST( sdl.screen, edit_sel_x * BRICK_WIDTH, edit_sel_y * BRICK_HEIGHT,
350 BRICK_WIDTH, BRICK_HEIGHT );
351 SOURCE( sel_frame, 0, 0 );
352 blit_surf();
353 /* status */
354 editor_draw_status();
355 /* refresh */
356 refresh_screen( 0, 0, 0, 0 );
357 }
358 /*
359 ====================================================================
360 Do only redraw and refresh those bricks with an extra
361 ====================================================================
362 */
363 void editor_update_extra_bricks()
364 {
365 int i, j;
366 for ( i = 0; i < EDIT_WIDTH; i++ )
367 for ( j = 0; j < EDIT_HEIGHT; j++ )
368 if ( edit_cur_level->extras[i][j] != EX_NONE ) {
369 editor_draw_brick( i, j );
370 add_refresh_rect( ( i + 1 ) * BRICK_WIDTH, ( j + 1 ) * BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT );
371 }
372 refresh_rects();
373 }
374 /*
375 ====================================================================
376 Free all editor levels
377 ====================================================================
378 */
379 void editor_clear_levels()
380 {
381 int i;
382 for ( i = 0; i < EDITOR_LEVEL_LIMIT; i++ )
383 if ( edit_levels[i] ) level_delete( edit_levels[i] );
384 memset( edit_levels, 0, sizeof( Level* ) * EDITOR_LEVEL_LIMIT );
385 edit_level_count = 0;
386 }
387 /*
388 ====================================================================
389 Save/load levels to/from editor file.
390 ====================================================================
391 */
392 void editor_load_levels()
393 {
394 int i;
395 Level *level;
396 FILE *file = 0;
397 /* clear levels first */
398 editor_clear_levels();
399 /* read levels while there are some in it */
400 edit_level_count = 0;
401 if ( ( file = fopen( edit_file_name, "r" ) ) != 0 ) {
402 while ( ( level = level_load( file ) ) != 0 )
403 edit_levels[edit_level_count++] = level;
404 fclose( file );
405 }
406 /* if we got no level at all create an empty one */
407 if ( edit_level_count == 0 ) {
408 edit_level_count = 1;
409 edit_levels[0] = level_create_empty( "noname", "untitled" );
410 }
411 /* translate the character strings to editor info */
412 for ( i = 0; i < edit_level_count; i++ )
413 editor_translate_level( edit_levels[i], CHAR_2_INDICES );
414 }
415 void editor_save_levels()
416 {
417 FILE *file = 0;
418 int i, j, k;
419 Level *level = 0;
420 /* convert */
421 for ( i = 0; i < edit_level_count; i++ )
422 editor_translate_level( edit_levels[i], INDICES_2_CHAR );
423 /* save */
424 if ( ( file = fopen( edit_file_name, "w" ) ) != 0 ) {
425 for ( i = 0; i < edit_level_count; i++ ) {
426 level = edit_levels[i];
427 /* save level */
428 fprintf( file, "Level:\n%s\n%s\nBricks:\n", level->author, level->name );
429 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
430 for ( k = 0; k < EDIT_WIDTH; k++ )
431 fprintf( file, "%c", level->bricks[k][j] );
432 fprintf( file, "\n" );
433 }
434 fprintf( file, "Bonus:\n" );
435 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
436 for ( k = 0; k < EDIT_WIDTH; k++ )
437 fprintf( file, "%c", level->extras[k][j] );
438 fprintf( file, "\n" );
439 }
440 }
441 fclose( file );
442 }
443 /* convert back */
444 for ( i = 0; i < edit_level_count; i++ )
445 editor_translate_level( edit_levels[i], CHAR_2_INDICES );
446 }
447 /*
448 ====================================================================
449 Handle button action
450 ====================================================================
451 */
452 void editor_handle_button( int type, int *full_update ) {
453 Level *dummy_ptr;
454 int old_pos;
455 char *name, *author;
456 int i;
457 switch ( type ) {
458 case BUTTON_FIRST:
459 edit_cur_level_id = 0;
460 edit_cur_level = edit_levels[0];
461 *full_update = 1;
462 break;
463 case BUTTON_NEXT:
464 edit_cur_level_id++;
465 if ( edit_cur_level_id == edit_level_count ) edit_cur_level_id = 0;
466 edit_cur_level = edit_levels[edit_cur_level_id];
467 *full_update = 1;
468 break;
469 case BUTTON_PREV:
470 edit_cur_level_id--;
471 if ( edit_cur_level_id == -1 ) edit_cur_level_id = edit_level_count - 1;
472 edit_cur_level = edit_levels[edit_cur_level_id];
473 *full_update = 1;
474 break;
475 case BUTTON_SWAP:
476 if ( first_swap_level == -1 ) {
477 first_swap_level = edit_cur_level_id;
478 *full_update = 1;
479 }
480 else {
481 /* swap current and marked level */
482 dummy_ptr = edit_levels[first_swap_level];
483 edit_levels[first_swap_level] = edit_levels[edit_cur_level_id];
484 edit_levels[edit_cur_level_id] = dummy_ptr;
485 edit_cur_level = edit_levels[edit_cur_level_id];
486 first_swap_level = -1;
487 *full_update = 1;
488 }
489 break;
490 case BUTTON_LOAD:
491 if ( !confirm( font, "Discard All Changes? y/n", CONFIRM_YES_NO ) ) break;
492 /* load levels and reset position if level doesn't exist */
493 old_pos = edit_cur_level_id;
494 editor_load_levels();
495 if ( old_pos >= edit_level_count ) edit_cur_level_id = 0;
496 edit_cur_level = edit_levels[edit_cur_level_id];
497 first_swap_level = -1;
498 *full_update = 1;
499 break;
500 case BUTTON_SAVE:
501 if ( !confirm( font, "Save Changes? y/n", CONFIRM_YES_NO ) ) break;
502 editor_save_levels();
503 break;
504 case BUTTON_CLEAR:
505 if ( !confirm( font, "Clear Level? y/n", CONFIRM_YES_NO ) ) break;
506 author = strdup( edit_cur_level->author );
507 name = strdup( edit_cur_level->name );
508 level_delete( edit_levels[edit_cur_level_id] );
509 edit_levels[edit_cur_level_id] = level_create_empty( author, name );
510 edit_cur_level = edit_levels[edit_cur_level_id];
511 free( name ); free( author );
512 *full_update = 1;
513 break;
514 case BUTTON_ADD:
515 if ( edit_level_count == EDITOR_LEVEL_LIMIT ) break;
516 if ( !confirm( font, "Add Level? y/n", CONFIRM_YES_NO ) ) break;
517 edit_levels[edit_level_count] = level_create_empty( edit_levels[edit_level_count - 1]->author, edit_levels[edit_level_count - 1]->name );
518 edit_level_count++;
519 *full_update = 1;
520 break;
521 case BUTTON_INSERT:
522 if ( edit_level_count == EDITOR_LEVEL_LIMIT ) break;
523 if ( !confirm( font, "Insert Level? y/n", CONFIRM_YES_NO ) ) break;
524 for ( i = edit_level_count; i > edit_cur_level_id; i-- )
525 edit_levels[i] = edit_levels[i - 1];
526 edit_level_count++;
527 edit_levels[edit_cur_level_id] = level_create_empty( edit_cur_level->author, edit_cur_level->name );
528 edit_cur_level = edit_levels[edit_cur_level_id];
529 *full_update = 1;
530 break;
531 case BUTTON_DELETE:
532 if ( edit_level_count == 1 ) break; /* last level may not be removed */
533 if ( !confirm( font, "Delete Level? y/n", CONFIRM_YES_NO ) ) break;
534 level_delete( edit_levels[edit_cur_level_id] );
535 for ( i = edit_cur_level_id; i < edit_level_count - 1; i++ )
536 edit_levels[i] = edit_levels[i + 1];
537 edit_levels[i] = 0;
538 edit_level_count--;
539 if ( edit_cur_level_id >= edit_level_count )
540 edit_cur_level_id = edit_level_count - 1;
541 edit_cur_level = edit_levels[edit_cur_level_id];
542 *full_update = 1;
543 break;
544 case BUTTON_PLAY:
545 fade_screen( FADE_OUT, FADE_DEF_TIME );
546 /* translate */
547 editor_translate_level( edit_cur_level, INDICES_2_CHAR );
548 /* run */
549 game_test_level( edit_cur_level );
550 /* translate back */
551 editor_translate_level( edit_cur_level, CHAR_2_INDICES );
552 *full_update = 1;
553 break;
554 }
555 }
556 /*
557 ====================================================================
558 Handle a click on a map tile.
559 If set is False a remove action was requested (only for
560 editing)
561 ====================================================================
562 */
563 int near_grow_brick( int x, int y ) {
564 int i, j;
565 for ( i = x - 1; i <= x + 1; i++ )
566 for ( j = y - 1; j <= y + 1; j++ )
567 if ( i != x || j != y )
568 if ( i >= 0 && j >= 0 && i < EDIT_WIDTH && j < EDIT_HEIGHT )
569 if ( edit_cur_level->bricks[i][j] == GROW_BRICK_ID )
570 return 1;
571 return 0;
572 }
573 void editor_handle_click( int x, int y, int set, int *full_update )
574 {
575 int sel = 0;
576 int edit_x, edit_y;
577 char str[32];
578 /* if !set and within the tile field we perform a switch */
579 if ( !set ) {
580 if ( x >= edit_tile_x && y >= edit_tile_y && x < edit_tile_x + edit_tile_w && y < edit_tile_y + edit_tile_h ) {
581 editor_switch_tiles();
582 *full_update = 1;
583 return;
584 }
585 }
586 /* the remaining stuff requires a tile at the position */
587 if ( edit_buttons[x][y] == BUTTON_NONE ) return; /* no action */
588 /* bricks */
589 if ( edit_buttons[x][y] >= BUTTON_FIRST_BRICK && edit_buttons[x][y] <= BUTTON_LAST_BRICK ) {
590 sel = 1;
591 edit_sel_type = EDITOR_BRICK;
592 edit_sel_id = edit_buttons[x][y] - BUTTON_FIRST_BRICK;
593 }
594 /* extras */
595 if ( edit_buttons[x][y] >= BUTTON_FIRST_EXTRA && edit_buttons[x][y] <= BUTTON_LAST_EXTRA ) {
596 sel = 1;
597 edit_sel_type = EDITOR_EXTRA;
598 edit_sel_id = edit_buttons[x][y] - BUTTON_FIRST_EXTRA;
599 }
600 /* edit field */
601 if ( edit_buttons[x][y] == BUTTON_EDIT ) {
602 edit_x = x - 1;
603 edit_y = y - 1;
604 if ( edit_sel_type == EDITOR_BRICK ) {
605 if ( set ) {
606 /* set brick */
607 edit_cur_level->bricks[edit_x][edit_y] = edit_sel_id;
608 *full_update = 1;
609 }
610 else {
611 /* remove brick and extra if any */
612 if ( edit_cur_level->bricks[edit_x][edit_y] != -1 ) {
613 edit_cur_level->bricks[edit_x][edit_y] = -1;
614 edit_cur_level->extras[edit_x][edit_y] = EX_NONE;
615 *full_update = 1;
616 }
617 }
618 }
619 else {
620 if ( set ) {
621 /* set extra - must be on a brick or beside a grow brick */
622 if ( edit_cur_level->bricks[edit_x][edit_y] != -1 || near_grow_brick( edit_x, edit_y ) ) {
623 edit_cur_level->extras[edit_x][edit_y] = edit_sel_id;
624 *full_update = 1;
625 }
626 }
627 else {
628 /* remove extra */
629 if ( edit_cur_level->extras[edit_x][edit_y] != EX_NONE ) {
630 edit_cur_level->extras[edit_x][edit_y] = EX_NONE;
631 *full_update = 1;
632 }
633 }
634 }
635 }
636 /* buttons */
637 editor_handle_button( edit_buttons[x][y], full_update );
638 /* name&author */
639 strcpy( str, "" );
640 if ( edit_buttons[x][y] == BUTTON_EDIT_AUTHOR )
641 if ( enter_string( font, "Author's Name:", str, 24 ) ) {
642 free( edit_cur_level->author );
643 edit_cur_level->author = strdup( str );
644 *full_update = 1;
645 }
646 if ( edit_buttons[x][y] == BUTTON_EDIT_NAME )
647 if ( enter_string( font, "Title:", str, 24 ) ) {
648 free( edit_cur_level->name );
649 edit_cur_level->name = strdup( str );
650 *full_update = 1;
651 }
652 /* sel frame tile position */
653 if ( sel ) {
654 edit_sel_x = x;
655 edit_sel_y = y;
656 *full_update = 1;
657 }
658 }
659
660 /*
661 ====================================================================
662 Publics
663 ====================================================================
664 */
665 /*
666 ====================================================================
667 Create/delete editor resources
668 ====================================================================
669 */
670 void editor_create()
671 {
672 int i, j;
673 /* clear all level pointers */
674 memset( edit_levels, 0, sizeof( Level* ) * EDITOR_LEVEL_LIMIT );
675 /* load sel frame */
676 sel_frame = load_surf( "sel_frame.bmp", SDL_SWSURFACE );
677 /* load buttons */
678 buttons = load_surf( "buttons.bmp", SDL_SWSURFACE );
679 /* background is black + frame */
680 editor_bkgnd = create_surf( sdl.screen->w, sdl.screen->h, SDL_SWSURFACE );
681 SDL_SetColorKey( editor_bkgnd, 0, 0 );
682 FULL_DEST( editor_bkgnd ); fill_surf( 0x0 );
683 // FULL_SOURCE( frame ); blit_surf();
684 /* add helping grid */
685 editor_draw_grid();
686 /* set actions */
687 /* editable part */
688 for ( i = 0; i < EDIT_WIDTH; i++ )
689 for ( j = 0; j < EDIT_HEIGHT; j++ )
690 edit_buttons[i + 1][j + 1] = BUTTON_EDIT;
691 /* buttons */
692 for ( i = 0; i < 10; i++ )
693 edit_buttons[0][MAP_HEIGHT - 10 + i] = BUTTON_FIRST + i;
694 edit_buttons[MAP_WIDTH - 1][MAP_HEIGHT - 1] = BUTTON_PLAY;
695 /* name&author */
696 for ( i = 1; i < MAP_WIDTH / 2; i++ )
697 edit_buttons[i][MAP_HEIGHT - 5] = BUTTON_EDIT_NAME;
698 for ( i = MAP_WIDTH / 2; i < MAP_WIDTH - 1; i++ )
699 edit_buttons[i][MAP_HEIGHT - 5] = BUTTON_EDIT_AUTHOR;
700 /* draw buttons */
701 for ( i = 0; i < 10; i++ ) {
702 DEST( editor_bkgnd, 0, ( MAP_HEIGHT - 10 + i ) * BRICK_HEIGHT,
703 BRICK_WIDTH, BRICK_HEIGHT );
704 SOURCE( buttons, i * BRICK_WIDTH, 0 );
705 blit_surf();
706 }
707 DEST( editor_bkgnd, ( MAP_WIDTH - 1 ) * BRICK_WIDTH, ( MAP_HEIGHT - 1 ) * BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT );
708 SOURCE( buttons, 10 * BRICK_WIDTH, 0 );
709 blit_surf();
710 }
711 void editor_delete()
712 {
713 if ( editor_bkgnd ) SDL_FreeSurface( editor_bkgnd ); editor_bkgnd = 0;
714 if ( sel_frame ) SDL_FreeSurface( sel_frame ); sel_frame = 0;
715 if ( buttons ) SDL_FreeSurface( buttons ); buttons = 0;
716 }
717 /*
718 ====================================================================
719 Initiate and clear stuff for each editor call.
720 file_name is the name of the edited file in home directory.
721 ====================================================================
722 */
723 int editor_init( char *file_name )
724 {
725 FILE *file = 0;
726 /* set full file name */
727 sprintf( edit_file_name, "%s/%s/lbreakout2-levels/%s", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME, file_name );
728 /* test this file for write access. use append to keep contents */
729 if ( ( file = fopen( edit_file_name, "a" ) ) == 0 ) {
730 fprintf( stderr, "Permission to write to file '%s' denied.\n", edit_file_name );
731 return 0;
732 }
733 else
734 fclose( file );
735 /* load levels */
736 editor_load_levels();
737 /* select first level */
738 edit_cur_level_id = 0;
739 edit_cur_level = edit_levels[0];
740 /* select first brick */
741 edit_sel_type = EDITOR_EXTRA;
742 editor_switch_tiles();
743 /* clear other flags */
744 extra_vis = 0;
745 first_swap_level = -1;
746 return 1;
747 }
748 void editor_clear()
749 {
750 /* free all levels */
751 editor_clear_levels();
752 }
753 /*
754 ====================================================================
755 Run the editor
756 ====================================================================
757 */
758 void editor_run()
759 {
760 SDL_Event event;
761 int leave = 0;
762 int ms;
763 int last_switch_time = 0;
764 int full_update = 0;
765 /* draw first time */
766 editor_full_update();
767 /* main loop */
768 reset_timer();
769 while ( !leave ) {
770 if ( event_poll( &event ) ) {
771 switch ( event.type ) {
772 case SDL_QUIT: leave = 1; term_game = 1; break;
773 case SDL_MOUSEBUTTONUP:
774 editor_handle_click( event.button.x / BRICK_WIDTH,
775 event.button.y / BRICK_HEIGHT,
776 (event.button.button == LEFT_BUTTON),
777 &full_update );
778 break;
779 case SDL_KEYUP:
780 switch ( event.key.keysym.sym ) {
781 case SDLK_ESCAPE:
782 if ( confirm( font, "Quit Editor? y/n", CONFIRM_YES_NO ) ) leave = 1;
783 break;
784 case SDLK_LEFT: editor_handle_button( BUTTON_PREV, &full_update ); break;
785 case SDLK_RIGHT: editor_handle_button( BUTTON_NEXT, &full_update ); break;
786 case SDLK_UP: editor_handle_button( BUTTON_FIRST, &full_update ); break;
787 case SDLK_f:
788 config.fullscreen = !config.fullscreen;
789 set_video_mode( std_video_mode( config.fullscreen ) );
790 full_update = 1;
791 break;
792 default: break;
793 }
794 break;
795 default: break;
796 }
797 }
798 /* mouse motion is extra */
799 if ( motion && motion_button ) {
800 editor_handle_click( motion_x / BRICK_WIDTH,
801 motion_y / BRICK_HEIGHT,
802 (motion_button == LEFT_BUTTON),
803 &full_update );
804 }
805 ms = get_time();
806 if ( ( last_switch_time -= ms ) <= 0 ) {
807 extra_vis = !extra_vis;
808 last_switch_time = 500;
809 editor_update_extra_bricks();
810 }
811 /* full update? */
812 if ( full_update ) {
813 editor_full_update();
814 full_update = 0;
815 }
816 /* don't consume all CPU time */
817 SDL_Delay( 5 );
818 }
819 }
+0
-38
src/editor.h less more
0 /***************************************************************************
1 editor.h - description
2 -------------------
3 begin : Fri Oct 12 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Create/delete editor resources
20 ====================================================================
21 */
22 void editor_create();
23 void editor_delete();
24 /*
25 ====================================================================
26 Initiate and clear stuff for each editor call.
27 file_name is the name of the edited file in home directory.
28 ====================================================================
29 */
30 int editor_init( char *file_name );
31 void editor_clear();
32 /*
33 ====================================================================
34 Run the editor
35 ====================================================================
36 */
37 void editor_run();
+0
-31
src/empty.hscr less more
0 >>>Original
1 ............
2 10
3 300000
4 ............
5 9
6 200000
7 ............
8 8
9 150000
10 ............
11 7
12 100000
13 ............
14 6
15 70000
16 ............
17 5
18 50000
19 ............
20 4
21 40000
22 ............
23 3
24 30000
25 ............
26 2
27 20000
28 ............
29 1
30 10000
+0
-167
src/event.c less more
0 /***************************************************************************
1 event.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "event.h"
20
21 extern Sdl sdl;
22 extern SDL_Cursor *empty_cursor;
23 extern SDL_Cursor *std_cursor;
24 extern Config config;
25 int keystate[SDLK_LAST];
26 int buttonstate[BUTTON_COUNT];
27 int rel_motion = 0; /* relative mouse motion? */
28 int motion_x = 0, motion_y = 0; /* current position of mouse */
29 int motion_rel_x = 0; /* position of mouse relative to old position */
30 int motion = 0; /* motion occured? */
31 int motion_button = 0; /* button pressed while moving */
32 float motion_mod;
33 /* interna */
34 int intern_motion = 0; /* event_filter noted a motion so event_poll will set motion next time */
35 int intern_motion_rel_x = 0;
36 int intern_motion_x = 0, intern_motion_y = 0;
37 int intern_motion_last_x, intern_motion_last_y = 0;
38 int intern_motion_button = 0;
39 int intern_block_motion = 0;
40
41 /*
42 ====================================================================
43 Event filter used to get motion x.
44 ====================================================================
45 */
46 int event_filter( const SDL_Event *event )
47 {
48 /* if this is a mousemotion event get the latest mouse position
49 and set motion and motion_x and drop this event */
50 /* event_poll does not return any motion events instead motion_x
51 is used directly */
52 if ( event->type == SDL_MOUSEMOTION ) {
53 if ( intern_block_motion ) return 0;
54 /* mouse warp to keep in window */
55 if ( !intern_motion ) {
56 intern_motion_last_x = intern_motion_x;
57 intern_motion_last_y = intern_motion_y;
58 intern_motion = 1;
59 intern_motion_rel_x = event->motion.xrel;
60 }
61 else
62 intern_motion_rel_x += event->motion.xrel;
63 intern_motion_x = event->motion.x;
64 intern_motion_y = event->motion.y;
65 intern_motion_button = event->motion.state;
66 return 0;
67 }
68 return 1;
69 }
70
71 /*
72 ====================================================================
73 Reset event states
74 ====================================================================
75 */
76 void event_reset()
77 {
78 memset( &keystate, 0, sizeof( int ) * SDLK_LAST );
79 memset( &buttonstate, 0, sizeof( int ) * BUTTON_COUNT );
80 motion_mod = (float)(config.motion_mod) / 100;
81 intern_motion = motion = 0;
82 }
83 /*
84 ====================================================================
85 Grab or release input. Hide cursor if events are kept in window.
86 Use relative mouse motion and grab if config tells so.
87 ====================================================================
88 */
89 void event_grab_input()
90 {
91 /* if rel_motion is set the global rel_motion_x is updated by event_poll()
92 (internal value is always updated by event_filter()) */
93 rel_motion = config.rel_motion;
94 /* use empty cursor if fullscreen or grab is set */
95 if ( config.grab || sdl.screen->flags & SDL_FULLSCREEN ) SDL_SetCursor( empty_cursor );
96 /* grab input if grab activated or rel_motion is set as we have to grab the input
97 and hide the cursor if so */
98 if ( config.grab || rel_motion ) SDL_WM_GrabInput( SDL_GRAB_ON );
99 /* if rel_motion is set hide the cursor to get relative motion events even when
100 cursor hits the border (due to grab) */
101 if ( rel_motion ) SDL_ShowCursor( 0 );
102 }
103 void event_ungrab_input()
104 {
105 /* show cursor, grab nothing */
106 SDL_WM_GrabInput( SDL_GRAB_OFF );
107 rel_motion = 0;
108 SDL_ShowCursor( 1 ); SDL_SetCursor( std_cursor );
109 }
110 /*
111 ====================================================================
112 Poll next event and set key and mousestate.
113 Return Value: True if event occured
114 ====================================================================
115 */
116 int event_poll( SDL_Event *event )
117 {
118 motion = 0;
119 /* check if motion occured: does not cause an event */
120 if ( intern_motion ) {
121 /* gather all motion events to one absolute/relative position until
122 event_poll is called next time */
123 intern_motion = 0;
124 /* if either absolute position is used or relative motion occured set motion flag
125 so paddle may move */
126 if ( !rel_motion || intern_motion_rel_x ) motion = 1;
127 /* absolute position */
128 motion_x = intern_motion_x;
129 motion_y = intern_motion_y;
130 /* button */
131 motion_button = intern_motion_button;
132 /* use motion modifier and invert if wanted */
133 if ( rel_motion && motion ) {
134 motion_rel_x = (int)( motion_mod * intern_motion_rel_x );
135 if ( config.invert ) motion_rel_x = -motion_rel_x;
136 #ifdef MOUSE_WARP
137 /* reset mouse pointer as current solution does not work for
138 BeOS */
139 SDL_EventState( SDL_MOUSEMOTION, SDL_IGNORE );
140 SDL_WarpMouse(sdl.screen->w >> 1, sdl.screen->h >> 1);
141 SDL_EventState( SDL_MOUSEMOTION, SDL_ENABLE );
142 #endif
143 }
144 }
145 /* check queued events */
146 if ( SDL_PollEvent( event ) ) {
147 switch ( event->type ) {
148 case SDL_QUIT: return 1;
149 case SDL_MOUSEBUTTONUP: buttonstate[event->button.button] = 0; return 1;
150 case SDL_MOUSEBUTTONDOWN: buttonstate[event->button.button] = 1; return 1;
151 case SDL_KEYUP: keystate[event->key.keysym.sym] = 0; return 1;
152 case SDL_KEYDOWN: keystate[event->key.keysym.sym] = 1; return 1;
153 default: return 1;
154 }
155 }
156 return 0;
157 }
158 /*
159 ====================================================================
160 Block/unblock motion event
161 ====================================================================
162 */
163 void event_block_motion( int block )
164 {
165 intern_block_motion = block;
166 }
+0
-50
src/event.h less more
0 /***************************************************************************
1 event.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Event filter used to get motion x.
20 ====================================================================
21 */
22 int event_filter( const SDL_Event *event );
23 /*
24 ====================================================================
25 Reset event states
26 ====================================================================
27 */
28 void event_reset();
29 /*
30 ====================================================================
31 Grab or release input. Hide cursor if events are kept in window.
32 Use relative mouse motion and grab if config tells so.
33 ====================================================================
34 */
35 void event_grab_input();
36 void event_ungrab_input();
37 /*
38 ====================================================================
39 Poll next event and set key and mousestate.
40 Return Value: True if event occured
41 ====================================================================
42 */
43 int event_poll( SDL_Event *event );
44 /*
45 ====================================================================
46 Block/unblock motion event
47 ====================================================================
48 */
49 void event_block_motion( int block );
+0
-764
src/extras.c less more
0 /***************************************************************************
1 extras.c - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "list.h"
19 #include "config.h"
20 #include "event.h"
21 #include "shrapnells.h"
22 #include "difficulty.h"
23 #include "levels.h"
24 #include "player.h"
25 #include "bricks.h"
26 #include "shots.h"
27 #include "paddle.h"
28 #include "balls.h"
29 #include "extras.h"
30 #include "frame.h"
31 #ifdef SOUND
32 #include "audio.h"
33 #endif
34
35 extern Diff *diff;
36 extern Player *player;
37 extern Config config;
38 extern Sdl sdl;
39 extern SDL_Surface *offscreen;
40 extern SDL_Surface *bkgnd; /* background + frame */
41 extern SDL_Surface *offscreen_backup;
42 extern Paddle paddle;
43 extern int ball_w, ball_dia;
44 extern float ball_v, ball_vm, ball_old_v;
45 extern List *balls;
46 extern SDL_Surface *brick_pic;
47 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
48 extern SDL_Surface *extra_pic; /* graphics */
49 extern SDL_Surface *extra_shadow;
50 List *extras = 0; /* extras */
51 int active[EX_NUMBER]; /* true if extra activated */
52 int extra_time[EX_NUMBER]; /* time in milliseconds when extra expires: 0 unlimited */
53 /* wall */
54 extern SDL_Surface *wall_pic;
55 float wall_alpha = 0;
56 extern int shadow_size;
57 #ifdef SOUND
58 extern Sound_Chunk *wav_score, *wav_metal, *wav_std, *wav_wall, *wav_joker;
59 extern Sound_Chunk *wav_goldshower;
60 extern Sound_Chunk *wav_speedup, *wav_speeddown;
61 extern Sound_Chunk *wav_chaos, *wav_darkness, *wav_ghost;
62 extern Sound_Chunk *wav_timeadd, *wav_expl_ball, *wav_weak_ball;
63 extern Sound_Chunk *wav_bonus_magnet, *wav_malus_magnet, *wav_disable;
64 extern Sound_Chunk *wav_attach; /* handled by balls.c */
65 #endif
66
67 /*
68 ====================================================================
69 Extra times
70 ====================================================================
71 */
72 enum {
73 TIME_WALL = 20000,
74 TIME_METAL = 10000,
75 TIME_WEAPON = 10000,
76 TIME_FROZEN = 1000,
77 TIME_SLIME = 20000,
78 TIME_FAST = 20000,
79 TIME_SLOW = 20000,
80 TIME_GOLDSHOWER = 20000,
81 TIME_DARKNESS = 20000,
82 TIME_CHAOS = 20000,
83 TIME_GHOST_PADDLE = 20000,
84 TIME_SPIN_RIGHT = 20000,
85 TIME_SPIN_LEFT = 20000,
86 TIME_EXPL_BALL = 10000,
87 TIME_BONUS_MAGNET = 20000,
88 TIME_MALUS_MAGNET = 20000,
89 TIME_WEAK_BALL = 20000
90 };
91
92 /*
93 ====================================================================
94 Locals
95 ====================================================================
96 */
97
98 /*
99 ====================================================================
100 Test if the paddle currently attracts extras of this type.
101 ====================================================================
102 */
103 int extra_attracted_by_paddle( int type )
104 {
105 switch ( type ) {
106 /* bonus */
107 case EX_SCORE200:
108 case EX_SCORE500:
109 case EX_SCORE1000:
110 case EX_SCORE2000:
111 case EX_SCORE5000:
112 case EX_SCORE10000:
113 case EX_GOLDSHOWER:
114 case EX_LENGTHEN:
115 case EX_LIFE:
116 case EX_SLIME:
117 case EX_METAL:
118 case EX_BALL:
119 case EX_WALL:
120 case EX_WEAPON:
121 case EX_SLOW:
122 case EX_JOKER:
123 case EX_EXPL_BALL:
124 case EX_BONUS_MAGNET:
125 if ( paddle_attract_bonus() )
126 return 1;
127 return 0;
128 /* malus */
129 case EX_SHORTEN:
130 case EX_FAST:
131 /*
132 case EX_SPIN_RIGHT:
133 case EX_SPIN_LEFT:
134 */
135 case EX_MALUS_MAGNET:
136 case EX_WEAK_BALL:
137 case EX_DARKNESS:
138 case EX_GHOST_PADDLE:
139 case EX_FROZEN:
140 if ( paddle_attract_malus() )
141 return 1;
142 return 0;
143 /* neutral */
144 case EX_DISABLE:
145 case EX_CHAOS:
146 case EX_TIME_ADD:
147 case EX_RANDOM:
148 return 0;
149 }
150 return 0;
151 }
152
153 /*
154 ====================================================================
155 Public
156 ====================================================================
157 */
158
159 /*
160 ====================================================================
161 Load and delete extra graphics
162 ====================================================================
163 */
164 void extras_load()
165 {
166 extras = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
167 }
168 void extras_delete()
169 {
170 if ( extras ) list_delete( extras ); extras = 0;
171 }
172 /*
173 ====================================================================
174 Reset extras
175 ====================================================================
176 */
177 void extras_reset()
178 {
179 list_clear( extras );
180 memset( active, 0, sizeof( int ) * EX_NUMBER );
181 memset( extra_time, 0, sizeof( int ) * EX_NUMBER );
182 }
183 /*
184 ====================================================================
185 Create new extra at position
186 ====================================================================
187 */
188 void extra_create( int type, int x, int y )
189 {
190 Extra *e = calloc( 1, sizeof( Extra ) );
191 e->type = type;
192 e->x = x; e->y = y;
193 if (!config.trp)
194 e->alpha = 0;
195 else
196 e->alpha = 255;
197 list_add( extras, e );
198 }
199 /*
200 ====================================================================
201 Use extra when paddle collected it
202 ====================================================================
203 */
204 void extra_use( int extra_type )
205 {
206 Ball *b;
207 int i;
208
209 while( extra_type == EX_RANDOM ) extra_type = rand() % (EX_NUMBER);
210
211 switch (extra_type) {
212 case EX_SCORE200:
213 player->score += 200;
214 if ( active[EX_JOKER] ) player->score += 200;
215 #ifdef SOUND
216 sound_play( wav_score );
217 #endif
218 break;
219 case EX_SCORE500:
220 player->score += 500;
221 if ( active[EX_JOKER] ) player->score += 500;
222 #ifdef SOUND
223 sound_play( wav_score );
224 #endif
225 break;
226 case EX_SCORE1000:
227 player->score += 1000;
228 if ( active[EX_JOKER] ) player->score += 1000;
229 #ifdef SOUND
230 sound_play( wav_score );
231 #endif
232 break;
233 case EX_SCORE2000:
234 player->score += 2000;
235 if ( active[EX_JOKER] ) player->score += 2000;
236 #ifdef SOUND
237 sound_play( wav_score );
238 #endif
239 break;
240 case EX_SCORE5000:
241 player->score += 5000;
242 if ( active[EX_JOKER] ) player->score += 5000;
243 #ifdef SOUND
244 sound_play( wav_score );
245 #endif
246 break;
247 case EX_SCORE10000:
248 player->score += 10000;
249 if ( active[EX_JOKER] ) player->score += 10000;
250 #ifdef SOUND
251 sound_play( wav_score );
252 #endif
253 break;
254 case EX_GOLDSHOWER:
255 extra_time[EX_GOLDSHOWER] += TIME_GOLDSHOWER;
256 if ( active[EX_JOKER] ) extra_time[EX_GOLDSHOWER] += TIME_GOLDSHOWER;
257 #ifdef SOUND
258 sound_play( wav_goldshower );
259 #endif
260 break;
261 case EX_LIFE:
262 if (player->lives < diff->max_lives) {
263 player->lives++;
264 /* update lives */
265 frame_add_life();
266 }
267 else {
268 player->score += 10000;
269 #ifdef SOUND
270 sound_play( wav_score );
271 #endif
272 }
273 break;
274 case EX_SHORTEN:
275 paddle_init_resize(-1);
276 break;
277 case EX_LENGTHEN:
278 paddle_init_resize(1);
279 break;
280 case EX_BALL:
281 b = ball_create(paddle.x + (paddle.w - ball_w) / 2, paddle.y - ball_dia, (rand() % 90) - 45, 0.15);
282 ball_mask_vel(b, b->vel.x);
283 ball_get_target(b);
284 list_add( balls, b );
285 #ifdef SOUND
286 sound_play( wav_std );
287 #endif
288 break;
289 case EX_WALL:
290 extra_time[EX_WALL] += TIME_WALL;
291 if ( active[EX_JOKER] ) extra_time[EX_WALL] += TIME_WALL;
292 if (active[EX_WALL]) {
293 #ifdef SOUND
294 sound_play( wav_std );
295 #endif
296 break;
297 }
298 for (i = 1; i < MAP_WIDTH - 1; i++) {
299 bricks[i][MAP_HEIGHT - 1].type = MAP_WALL;
300 bricks[i][MAP_HEIGHT - 1].id = 0;
301 }
302 wall_alpha = 255;
303 balls_get_new_targets( -1, 0 );
304 #ifdef SOUND
305 sound_play( wav_wall );
306 #endif
307 break;
308 case EX_METAL:
309 extra_time[EX_METAL] += TIME_METAL;
310 if ( active[EX_JOKER] ) extra_time[EX_METAL] += TIME_METAL;
311 balls_set_type( BALL_METAL );
312 #ifdef SOUND
313 sound_play( wav_metal );
314 #endif
315 /* other ball extras are disabled */
316 if ( active[EX_EXPL_BALL] ) {
317 active[EX_EXPL_BALL] = 0;
318 extra_time[EX_EXPL_BALL] = 0;
319 }
320 if ( active[EX_WEAK_BALL] ) {
321 active[EX_WEAK_BALL] = 0;
322 extra_time[EX_WEAK_BALL] = 0;
323 }
324 break;
325 case EX_FROZEN:
326 extra_time[EX_FROZEN] = TIME_FROZEN;
327 paddle_freeze( 1 );
328 #ifdef SOUND
329 #endif
330 break;
331 case EX_WEAPON:
332 extra_time[EX_WEAPON] += TIME_WEAPON;
333 if ( active[EX_JOKER] ) extra_time[EX_WEAPON] += TIME_WEAPON;
334 weapon_install( 1 );
335 #ifdef SOUND
336 sound_play( wav_std );
337 #endif
338 break;
339 case EX_SLIME:
340 extra_time[EX_SLIME] += TIME_SLIME;
341 if ( active[EX_JOKER] ) extra_time[EX_SLIME] += TIME_SLIME;
342 paddle_set_slime( 1 );
343 #ifdef SOUND
344 sound_play( wav_attach );
345 #endif
346 break;
347 case EX_FAST:
348 #ifdef SOUND
349 sound_play( wav_speedup );
350 #endif
351 if ( active[EX_SLOW] || active[EX_FAST] )
352 ball_v = ball_old_v;
353 if ( active[EX_SLOW] ) {
354 extra_time[EX_SLOW] = 0;
355 active[EX_SLOW] = 0;
356 }
357 extra_time[EX_FAST] += TIME_FAST;
358 if ( active[EX_JOKER] ) extra_time[EX_FAST] += TIME_FAST;
359 ball_old_v = ball_v;
360 ball_v = ball_vm;
361 list_reset( balls );
362 while ( ( b = list_next( balls ) ) ) {
363 ball_adjust_vel(b, ball_v);
364 ball_get_target(b);
365 }
366 break;
367 case EX_SLOW:
368 #ifdef SOUND
369 sound_play( wav_speeddown );
370 #endif
371 if ( active[EX_SLOW] || active[EX_FAST] )
372 ball_v = ball_old_v;
373 if ( active[EX_FAST] ) {
374 extra_time[EX_FAST] = 0;
375 active[EX_FAST] = 0;
376 }
377 extra_time[EX_SLOW] += TIME_SLOW;
378 if ( active[EX_JOKER] ) extra_time[EX_SLOW] += TIME_SLOW;
379 ball_old_v = ball_v;
380 ball_v = diff->v_start;
381 list_reset( balls );
382 while ( ( b = list_next( balls ) ) ) {
383 ball_adjust_vel(b, ball_v);
384 ball_get_target(b);
385 }
386 break;
387 case EX_CHAOS:
388 #ifdef SOUND
389 sound_play( wav_chaos );
390 #endif
391 extra_time[EX_CHAOS] += TIME_CHAOS;
392 balls_set_chaos( 1 );
393 break;
394 case EX_DARKNESS:
395 #ifdef SOUND
396 sound_play( wav_darkness );
397 #endif
398 extra_time[EX_DARKNESS] += TIME_DARKNESS;
399 if ( active[EX_DARKNESS] ) break;
400 /* backup offscreen and turn it black */
401 FULL_DEST( offscreen ); fill_surf( 0x0 );
402 FULL_DEST( sdl.screen ); fill_surf( 0x0 );
403 add_refresh_rect( 0, 0, offscreen->w, offscreen->h );
404 /* use dark explosions */
405 exps_set_dark( 1 );
406 break;
407 case EX_GHOST_PADDLE:
408 #ifdef SOUND
409 sound_play( wav_ghost );
410 #endif
411 extra_time[EX_GHOST_PADDLE] += TIME_GHOST_PADDLE;
412 paddle_set_invis( 1 );
413 break;
414 case EX_TIME_ADD:
415 #ifdef SOUND
416 sound_play( wav_timeadd );
417 #endif
418 for ( i = 0; i < EX_NUMBER; i++ )
419 if ( extra_time[i] )
420 extra_time[i] += 7000;
421 break;
422 case EX_EXPL_BALL:
423 #ifdef SOUND
424 sound_play( wav_expl_ball );
425 #endif
426 balls_set_type( BALL_EXPL );
427 extra_time[EX_EXPL_BALL] += TIME_EXPL_BALL;
428 if ( active[EX_JOKER] ) extra_time[EX_EXPL_BALL] += TIME_EXPL_BALL;
429 /* other ball extras are disabled */
430 if ( active[EX_METAL] ) {
431 active[EX_METAL] = 0;
432 extra_time[EX_METAL] = 0;
433 }
434 if ( active[EX_WEAK_BALL] ) {
435 active[EX_WEAK_BALL] = 0;
436 extra_time[EX_WEAK_BALL] = 0;
437 }
438 break;
439 case EX_WEAK_BALL:
440 #ifdef SOUND
441 sound_play( wav_weak_ball );
442 #endif
443 balls_set_type( BALL_WEAK );
444 extra_time[EX_WEAK_BALL] += TIME_WEAK_BALL;
445 /* other ball extras are disabled */
446 if ( active[EX_METAL] ) {
447 active[EX_METAL] = 0;
448 extra_time[EX_METAL] = 0;
449 }
450 if ( active[EX_EXPL_BALL] ) {
451 active[EX_EXPL_BALL] = 0;
452 extra_time[EX_EXPL_BALL] = 0;
453 }
454 break;
455 case EX_BONUS_MAGNET:
456 #ifdef SOUND
457 sound_play( wav_bonus_magnet );
458 #endif
459 paddle_set_attract( ATTRACT_BONUS );
460 extra_time[EX_BONUS_MAGNET] += TIME_BONUS_MAGNET;
461 if ( active[EX_JOKER] ) extra_time[EX_BONUS_MAGNET] += TIME_BONUS_MAGNET;
462 if ( active[EX_MALUS_MAGNET] ) {
463 active[EX_MALUS_MAGNET] = 0;
464 extra_time[EX_MALUS_MAGNET] = 0;
465 }
466 break;
467 case EX_MALUS_MAGNET:
468 #ifdef SOUND
469 sound_play( wav_malus_magnet );
470 #endif
471 paddle_set_attract( ATTRACT_MALUS );
472 extra_time[EX_MALUS_MAGNET] += TIME_MALUS_MAGNET;
473 if ( active[EX_BONUS_MAGNET] ) {
474 active[EX_BONUS_MAGNET] = 0;
475 extra_time[EX_BONUS_MAGNET] = 0;
476 }
477 break;
478 case EX_DISABLE:
479 #ifdef SOUND
480 sound_play( wav_disable );
481 #endif
482 /* set all active extra times to 1 so they will expire next
483 prog cycle */
484 for ( i = 0; i < EX_NUMBER; i++ )
485 if ( extra_time[i] )
486 extra_time[i] = 1;
487 break;
488 }
489 active[extra_type] = 1;
490 }
491 /*
492 ====================================================================
493 Show, hide extras
494 ====================================================================
495 */
496 void extras_hide()
497 {
498 List_Entry *entry = extras->head.next;
499 Extra *ex;
500 int x, y;
501 while ( entry != &extras->tail ) {
502 ex = entry->item;
503 x = (int)ex->x;
504 y = (int)ex->y;
505 if ( config.shadow )
506 DEST(sdl.screen, x, y, BRICK_WIDTH + shadow_size, BRICK_HEIGHT + shadow_size )
507 else
508 DEST(sdl.screen, x, y, BRICK_WIDTH, BRICK_HEIGHT )
509 SOURCE(offscreen, x, y);
510 blit_surf();
511 if ( config.shadow )
512 add_refresh_rect( x, y, BRICK_WIDTH + shadow_size, BRICK_HEIGHT + shadow_size );
513 else
514 add_refresh_rect( x, y, BRICK_WIDTH, BRICK_HEIGHT );
515 entry = entry->next;
516 }
517 }
518 void extra_show_shadow( Extra *extra )
519 {
520 DEST( sdl.screen, (int)extra->x + shadow_size, (int)extra->y + shadow_size, BRICK_WIDTH, BRICK_HEIGHT );
521 SOURCE( extra_shadow, 0, 0 );
522 alpha_blit_surf( ( extra->alpha / 255 ) * ( 255 - SHADOW_ALPHA ) + SHADOW_ALPHA );
523 }
524 void extras_show()
525 {
526 List_Entry *entry = extras->head.next;
527 Extra *ex;
528 int x, y;
529 while ( entry != &extras->tail ) {
530 ex = entry->item;
531 x = (int)ex->x;
532 y = (int)ex->y;
533 if ( config.shadow ) extra_show_shadow( ex );
534 DEST(sdl.screen, x, y, BRICK_WIDTH, BRICK_HEIGHT);
535 SOURCE(extra_pic, ex->type * BRICK_WIDTH, 0);
536 if ( ex->alpha == 0 )
537 blit_surf();
538 else
539 alpha_blit_surf((int)ex->alpha);
540 if ( config.shadow )
541 add_refresh_rect( x, y, BRICK_WIDTH + shadow_size, BRICK_HEIGHT + shadow_size );
542 else
543 add_refresh_rect( x, y, BRICK_WIDTH, BRICK_HEIGHT );
544 entry = entry->next;
545 }
546 }
547 void extras_alphashow( int alpha )
548 {
549 List_Entry *entry = extras->head.next;
550 Extra *ex;
551 int x, y;
552 while ( entry != &extras->tail ) {
553 ex = entry->item;
554 x = (int)ex->x;
555 y = (int)ex->y;
556 DEST(sdl.screen, x, y, BRICK_WIDTH, BRICK_HEIGHT);
557 SOURCE(extra_pic, ex->type * BRICK_WIDTH, 0);
558 alpha_blit_surf( alpha );
559 add_refresh_rect(x, y, BRICK_WIDTH, BRICK_HEIGHT);
560 entry = entry->next;
561 }
562 }
563 /*
564 ====================================================================
565 Update extras
566 ====================================================================
567 */
568 void extras_update( int ms )
569 {
570 List_Entry *entry;
571 Extra *ex;
572 Ball *ball;
573 int i;
574 int type, px, py;
575
576 /* release new extras */
577 while ( bricks_pop_extra( &type, &px, &py ) ) extra_create( type, px, py );
578 /* check extra_time of limited extras */
579 for ( i = 0; i < EX_NUMBER; i++ )
580 /* extra_time of wall is updated in wall_update() */
581 if ( extra_time[i] && i != EX_WALL ) {
582 extra_time[i] -= ms;
583 if ( extra_time[i] <= 0 ) {
584 extra_time[i] = 0;
585 /* expired */
586 switch ( i ) {
587 case EX_SLIME: paddle_set_slime( 0 ); break;
588 case EX_WEAPON: weapon_install( 0 ); break;
589 case EX_FROZEN:
590 paddle_freeze( 0 );
591 break;
592 case EX_EXPL_BALL:
593 case EX_WEAK_BALL:
594 case EX_METAL:
595 balls_set_type( BALL_NORMAL );
596 break;
597 case EX_SLOW:
598 case EX_FAST:
599 ball_v = ball_old_v;
600 list_reset( balls );
601 while ( ( ball = list_next( balls ) ) ) {
602 ball_adjust_vel(ball, ball_v);
603 ball_get_target(ball);
604 }
605 break;
606 case EX_GHOST_PADDLE:
607 paddle_set_invis( 0 );
608 break;
609 case EX_DARKNESS:
610 /* restore offscreen */
611 FULL_DEST( offscreen ); FULL_SOURCE( bkgnd ); blit_surf();
612 bricks_draw();
613 frame_draw_lives( player->lives, diff->max_lives );
614 /* back to screen */
615 FULL_DEST( sdl.screen ); FULL_SOURCE( offscreen ); blit_surf();
616 add_refresh_rect( 0, 0, offscreen->w, offscreen->h );
617 /* use bright explosions */
618 exps_set_dark( 0 );
619 break;
620 case EX_CHAOS:
621 balls_set_chaos( 0 );
622 break;
623 case EX_BONUS_MAGNET:
624 case EX_MALUS_MAGNET:
625 paddle_set_attract( ATTRACT_NONE );
626 break;
627 }
628 /* set deactivated */
629 active[i] = 0; /* wall is handled in wall_...() */
630 }
631 }
632 /* move extras and check if paddle was hit */
633 entry = extras->head.next;
634 while ( entry != &extras->tail ) {
635 ex =entry->item;
636 ex->y += 0.05 * ms;
637 /* if this extra type is attracted by paddle also change the x position */
638 if ( extra_attracted_by_paddle( ex->type ) ) {
639 if ( ex->x + ( BRICK_WIDTH >> 1 ) < paddle.x + ( paddle.w >> 1 ) ) {
640 ex->x += 0.05 * ms;
641 if ( ex->x + ( BRICK_WIDTH >> 1 ) > paddle.x + ( paddle.w >> 1 ) )
642 ex->x = paddle.x + ( paddle.w >> 1 ) - ( BRICK_WIDTH >> 1 );
643 }
644 else {
645 ex->x -= 0.05 * ms;
646 if ( ex->x + ( BRICK_WIDTH >> 1 ) < paddle.x + ( paddle.w >> 1 ) )
647 ex->x = paddle.x + ( paddle.w >> 1 ) - ( BRICK_WIDTH >> 1 );
648 }
649 }
650 if ( !active[EX_DARKNESS] ) {
651 if ( ex->alpha > 0 )
652 ex->alpha -= 0.25 * ms;
653 }
654 else {
655 if ( ex->alpha < 128 )
656 ex->alpha = 128;
657 if (ex->alpha > 128)
658 ex->alpha -= 0.25 * ms;
659 }
660 if (ex->alpha < 0)
661 ex->alpha = 0;
662 entry = entry->next;
663 if (ex->y >= sdl.screen->h)
664 list_delete_entry( extras, entry->prev );
665 else {
666 // contact with paddle core ? //
667 if ( paddle_solid() )
668 if (ex->x + BRICK_WIDTH > paddle.x && ex->x < paddle.x + paddle.w - 1 && ex->y + BRICK_HEIGHT > paddle.y && ex->y < paddle.y + paddle.h) {
669 /* some types may not be simply used by extra_use() */
670 switch ( ex->type ) {
671 /* if ex->type is EX_JOKER check all extras and use all bonus and quit */
672 case EX_JOKER:
673 #ifdef SOUND
674 sound_play( wav_joker );
675 #endif
676 /* set EX_JOKER as active so times may be doubled in extra_use */
677 active[EX_JOKER] = 1;
678 list_reset( extras );
679 while ( ( ex = list_next( extras ) ) ) {
680 if ( ex->type != EX_JOKER )
681 if ( ex->type != EX_SHORTEN )
682 if ( ex->type != EX_FROZEN )
683 if ( ex->type != EX_FAST )
684 if ( ex->type != EX_RANDOM )
685 if ( ex->type != EX_DARKNESS )
686 if ( ex->type != EX_GHOST_PADDLE )
687 if ( ex->type != EX_CHAOS )
688 if ( ex->type != EX_DISABLE )
689 /*
690 if ( ex->type != EX_SPIN_RIGHT )
691 if ( ex->type != EX_SPIN_LEFT )
692 */
693 if ( ex->type != EX_MALUS_MAGNET )
694 if ( ex->type != EX_WEAK_BALL )
695 extra_use( ex->type );
696 list_delete_item( extras, ex );
697 }
698 active[EX_JOKER] = 0;
699 entry = &extras->tail;
700 break;
701 default:
702 extra_use(ex->type);
703 list_delete_entry( extras, entry->prev );
704 break;
705 }
706 }
707 }
708 }
709 }
710 /* wall */
711 void wall_hide()
712 {
713 if ( !active[EX_WALL] ) return;
714 DEST( sdl.screen, BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
715 SOURCE( offscreen, BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT );
716 blit_surf();
717 add_refresh_rect( BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
718 }
719 void wall_show()
720 {
721 if ( !active[EX_WALL] ) return;
722 DEST( sdl.screen, BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
723 SOURCE( wall_pic, 0, 0 );
724 if ( config.trp && wall_alpha )
725 alpha_blit_surf( wall_alpha );
726 else
727 blit_surf();
728 }
729 void wall_alphashow( int alpha )
730 {
731 if ( !active[EX_WALL] ) return;
732 DEST( sdl.screen, BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
733 SOURCE( wall_pic, 0, 0 );
734 alpha_blit_surf( alpha );
735 add_refresh_rect( BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
736 }
737 void wall_update( int ms )
738 {
739 int i;
740
741 if ( !active[EX_WALL] ) return;
742 if ( extra_time[EX_WALL] > 0 ) {
743 extra_time[EX_WALL] -= ms;
744 if ( extra_time[EX_WALL] < 0 ) extra_time[EX_WALL] = 0;
745 /* still appearing? */
746 if (wall_alpha > 0) {
747 wall_alpha -= 0.25 * ms;
748 if (wall_alpha < 0) wall_alpha = 0;
749 }
750 }
751 else {
752 wall_alpha += 0.25 * ms;
753 if ( wall_alpha >= 255 ) {
754 wall_alpha = 255;
755 /* disappear */
756 wall_hide();
757 add_refresh_rect( BRICK_WIDTH, sdl.screen->h - BRICK_HEIGHT, wall_pic->w, wall_pic->h );
758 active[EX_WALL] = 0;
759 for (i = 1; i < MAP_WIDTH - 1; i++) bricks[i][MAP_HEIGHT - 1].type = MAP_EMPTY;
760 balls_get_new_targets( -1, 0 );
761 }
762 }
763 }
+0
-71
src/extras.h less more
0 /***************************************************************************
1 extras.h - description
2 -------------------
3 begin : Sun Sep 9 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 typedef struct {
18 float x, y;
19 float alpha;
20 int type; /* defined in lbreakout.h */
21 } Extra;
22
23 /*
24 ====================================================================
25 Load and delete extra graphics
26 ====================================================================
27 */
28 void extras_load();
29 void extras_delete();
30 /*
31 ====================================================================
32 Reset extras
33 ====================================================================
34 */
35 void extras_reset();
36 /*
37 ====================================================================
38 Create new extra at position
39 ====================================================================
40 */
41 void extra_create( int type, int x, int y );
42 /*
43 ====================================================================
44 Use extra when paddle collected it
45 ====================================================================
46 */
47 void extra_use( int type );
48 /*
49 ====================================================================
50 Show, hide extras
51 ====================================================================
52 */
53 void extras_hide();
54 void extras_show();
55 void extras_alphashow( int alpha );
56 /*
57 ====================================================================
58 Update extras
59 ====================================================================
60 */
61 void extras_update( int ms );
62 /*
63 ====================================================================
64 Wall
65 ====================================================================
66 */
67 void wall_hide();
68 void wall_show();
69 void wall_alphashow( int alpha );
70 void wall_update( int ms );
+0
-532
src/file.c less more
0
1 /***************************************************************************
2 file.c - description
3 -------------------
4 begin : Thu Jan 18 2001
5 copyright : (C) 2001 by Michael Speck
6 email : kulkanie@gmx.net
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <dirent.h>
22 #include <sys/stat.h>
23
24 #include "list.h"
25 #include "tools.h"
26 #include "file.h"
27
28 //#define FILE_DEBUG
29
30 /*
31 ====================================================================
32 Test file in path as mode.
33 Return Value: True if sucessful
34 ====================================================================
35 */
36 int file_check( char *path, char *fname, char *mode )
37 {
38 char *full_path;
39 FILE *file = 0;
40 int ok = 0;
41
42 full_path = calloc( strlen( path ) + strlen( fname ) + 2, sizeof( char ) );
43 sprintf( full_path, "%s/%s", path, fname );
44
45 if ( ( file = fopen( full_path, mode ) ) != 0 ) {
46 fclose( file );
47 ok = 1;
48 }
49 else
50 fprintf( stderr, "Permission for operation \"%s\" for file '%s' denied.\n", mode, full_path );
51 free( full_path );
52 return ok;
53 }
54 /*
55 ====================================================================
56 Open file in path according to type (write, read, append)
57 Return Value: File handle if successful else Null
58 ====================================================================
59 */
60 FILE *file_open( char *path, char *fname, int type )
61 {
62 FILE *file = 0;
63 char *full_path;
64 char mode[3] = "a";
65
66 full_path = calloc( strlen( path ) + strlen( fname ) + 2, sizeof( char ) );
67 sprintf( full_path, "%s/%s", path, fname );
68
69 switch ( type ) {
70 case FILE_READ:
71 if ( ( file = fopen( full_path, "r" ) ) == 0 )
72 fprintf( stderr, "file_open: cannot open file '%s' for reading: permission denied or non-existent\n", full_path );
73 break;
74 case FILE_WRITE:
75 sprintf( mode, "w" );
76 case FILE_APPEND:
77 if ( ( file = fopen( full_path, mode ) ) == 0 )
78 fprintf( stderr, "file_open: cannot open file '%s': permission denied\n", full_path );
79 break;
80 }
81 return file;
82 }
83
84 /*
85 ====================================================================
86 Read all lines from file pointer and return as static array.
87 Resets the file pointer. Should only be used when reading a whole
88 file.
89 ====================================================================
90 */
91 char** file_read_lines( FILE *file, int *count )
92 {
93 int nl_count = 0;
94 char c;
95 char **lines;
96 char buffer[1024];
97
98 if ( !file ) return 0;
99
100 /* count new_lines */
101 fseek( file, 0, SEEK_SET );
102 while ( !feof( file ) ) {
103 fread( &c, sizeof( char ), 1, file );
104 if ( c == 10 ) nl_count++;
105 }
106 fseek( file, 0, SEEK_SET );
107 nl_count++; /* maybe last lines wasn't terminated */
108
109 /* get mem */
110 lines = calloc( nl_count, sizeof( char* ) );
111
112 /* read lines */
113 *count = 0;
114 while( !feof( file ) ) {
115 if ( !fgets( buffer, 1023, file ) ) break;
116 if ( buffer[0] == 10 ) continue; /* empty line */
117 buffer[strlen( buffer ) - 1] = 0; /* cancel newline */
118 lines[*count] = strdup( buffer );
119 (*count)++;
120 }
121
122 return lines;
123 }
124
125 /* check consistence of file (all brackets/comments closed).
126 will reset the file pos to the very beginning */
127 int check_file_cons( FILE *file )
128 {
129 int brac = 0, comm = 0;
130 char c;
131 int ok = 1;
132
133 fseek( file, 0, SEEK_SET );
134
135 while ( !feof( file ) ) {
136
137 fread( &c, 1, 1, file );
138 switch ( c ) {
139
140 case '(': brac++; break;
141 case ')': brac--; break;
142 case '#': comm++; break;
143
144 }
145
146 }
147
148 fseek( file, 0, SEEK_SET );
149
150 if ( brac != 0 || ( comm % 2) != 0 ) {
151
152 #ifdef FILE_DEBUG
153 if ( brac != 0 )
154 printf("the number of opening and closing brackets does not fit!...\n");
155 else
156 printf("the number of opening and closing comment hashes does not fit!...\n");
157 #endif
158 ok = 0;
159
160 }
161
162 return ok;
163 }
164
165 /* return line number; keeps current file pos */
166 int get_line_number( FILE *file ) {
167 int count = 0;
168 char c;
169 int pos = ftell( file );
170
171 fseek( file, 0, SEEK_SET );
172 while ( ftell( file ) < pos - 1 ) {
173 fread( &c, sizeof( char ), 1, file );
174 if ( c == 10 ) count++;
175 }
176 fseek( file, pos, SEEK_SET );
177 return count + 1;
178 }
179
180 /* ignore all blanks and jump to next none-blank */
181 void ignore_blanks( FILE *file )
182 {
183 char c;
184 do {
185 fread( &c, sizeof( char ), 1, file );
186 } while ( c <= 32 && !feof( file ) );
187 if ( !feof( file ) )
188 fseek( file, -1, SEEK_CUR ); /* restore last none-blank */
189 }
190
191 /* add character to token and check max length; return true if below max length */
192 int add_char( char *token, int c )
193 {
194 int length = strlen( token );
195 /* check token length */
196 if ( length == MAX_TOKEN_LENGTH - 1 ) {
197 fprintf( stderr,
198 "read_token: token '%s' reached maximum length of %i, reading skipped\n",
199 token, length );
200 return 0;
201 }
202 token[length++] = c;
203 token[length] = 0;
204 return 1;
205 }
206 /* read token from current file position; ignore spaces;
207 tokes are:
208 (
209 )
210 =
211 # comment #
212 " string "
213 normal_token
214 save token in token and check that MAX_TOKEN_LENGTH is not exceeded
215 return true if not end of file */
216 int read_token( FILE *file, char *token )
217 {
218 int length = 0; /* token length */
219 char c;
220 int read_str = 0; /* if this is set token is a string "..." */
221 int i;
222
223 /* clear token */
224 token[0] = 0;
225
226 /* ignore all blanks before token */
227 ignore_blanks( file );
228
229 while( !feof( file ) ) {
230 fread( &c, sizeof( char ), 1, file );
231 /* treat new_lines as blanks */
232 if ( c == 10 ) c = 32;
233 /* check if this is a comment; if so ignore all characters in between */
234 if ( c == '#' && !read_str ) {
235 /* read all characters until '#' occurs */
236 do {
237 fread( &c, sizeof( char ), 1, file );
238 } while ( c != '#' );
239 /* ignore all blanks after comment */
240 ignore_blanks( file );
241 continue; /* start reading again */
242 }
243 /* add char */
244 if ( !add_char( token, c ) ) {
245 /* in this case restore last char as it belongs to next token */
246 fseek( file, -1, SEEK_CUR );
247 break;
248 }
249 else
250 length++;
251 /* check if token ends with a special single-character assignment token */
252 if ( !read_str )
253 if ( c == '(' || c == ')' || c == '=' ) {
254 /* if this wasn't the first character it already belongs to a new token, so skip it */
255 if ( length > 1 ) {
256 fseek( file, -1, SEEK_CUR );
257 token[--length] = 0;
258 }
259 break;
260 }
261 /* check if this char is a blank */
262 if ( c <= 32 && !read_str ) {
263 /* remvoe this blank from token */
264 token[--length] = 0;
265 break;
266 }
267 /* check if this is a long string embraced by "..." */
268 if ( c == '"' ) {
269 if ( length > 1 ) {
270 if ( read_str )
271 /* termination of string; stop reading */
272 break;
273 else {
274 /* token read and this " belongs to next token */
275 /* in this case restore last char */
276 fseek( file, -1, SEEK_CUR );
277 token[--length] = 0;
278 break;
279 }
280 }
281 else
282 read_str = 1;
283 }
284 }
285 if ( read_str ) {
286 /* delete brackets from token */
287 for ( i = 1; i < strlen( token ); i++ )
288 token[i - 1] = token[i];
289 token[strlen( token ) - 2] = 0;
290 }
291 if ( feof( file ) ) return 0;
292 return 1;
293 }
294
295 /* find a string in the file and set file stream to this position */
296 int find_token( FILE *file, char *name, int type, int warning )
297 {
298 char token[MAX_TOKEN_LENGTH];
299
300 if ( type == RESET_FILE_POS )
301 fseek( file, 0, SEEK_SET );
302 while( read_token( file, token ) )
303 if ( strequal( name, token ) ) {
304 /* adjust position this token must be read */
305 fseek( file, -strlen( token ) -1, SEEK_CUR );
306 return 1;
307 }
308 if ( warning == WARNING )
309 fprintf( stderr, "find_token: warning: token '%s' not found\n", name );
310 return 0;
311 }
312
313 /* read argument string of a single assignment */
314 char* get_arg( FILE *file, char *name, int type )
315 {
316 char token[MAX_TOKEN_LENGTH];
317 char *arg = 0;
318
319 /* search entry_name */
320 if ( !find_token( file, name, type, WARNING ) ) return 0;
321
322 /* token was found so read it */
323 read_token( file, token );
324 /* next token must be an equation */
325 read_token( file, token );
326 if ( token[0] != '=' ) {
327 fprintf( stderr,
328 "get_arg: line %i: '=' expected after token '%s' but found '%s' instead\n", get_line_number( file ), name, token );
329 return 0;
330 }
331 /* get argument */
332 read_token( file, token );
333 if ( token[0] == 0 )
334 fprintf( stderr, "get_arg: line %i: warning: argument for '%s' is empty\n", get_line_number( file ), name );
335 arg = strdup( token );
336 #ifdef FILE_DEBUG
337 printf( "get_arg: %s = %s\n", name, arg );
338 #endif
339 return arg;
340 }
341
342 /* read a cluster of arguments and return as static list */
343 char** get_arg_cluster( FILE *file, char *name, int *count, int type, int warning )
344 {
345 List *args;
346 char token[MAX_TOKEN_LENGTH];
347 char **arg_list = 0;
348 int i;
349
350 *count = 0;
351
352 /* search entry_name */
353 if ( !find_token( file, name, type, warning ) ) return 0;
354
355 /* init list */
356 args = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
357
358 /* read entry_name */
359 read_token( file, token );
360 /* next token must be an '(' */
361 read_token( file, token );
362 if ( token[0] != '(' ) {
363 fprintf( stderr, "get_arg_cluster: line %i: '(' expected after token '%s' but found '%s' instead\n", get_line_number( file ), name, token );
364 return 0;
365 }
366
367 /* read tokens and add to dynamic list until ')' occurs; if an '=' or '(' is read instead something
368 gone wrong */
369 while ( 1 ) {
370 read_token( file, token );
371 if ( token[0] == ')' ) break;
372 if ( token[0] == '(' || token[0] == '=' ) {
373 fprintf( stderr, "get_arg_cluster: line %i: ')' expected to terminate argument list of entry '%s' but found '%c' instead\n", get_line_number( file ), name, token[0] );
374 list_clear( args );
375 return 0;
376 }
377 /* everything's ok; add to list */
378 list_add( args, strdup( token ) );
379 }
380
381 /* static argument list */
382 arg_list = calloc( args->count, sizeof( char* ) );
383 for ( i = 0; i < args->count; i++ )
384 arg_list[i] = strdup( (char*)list_get( args, i ) );
385 *count = args->count;
386
387 list_delete( args );
388
389 return arg_list;
390 }
391
392 /* free arg cluster */
393 void delete_arg_cluster( char **cluster, int count )
394 {
395 int i;
396 if ( cluster ) {
397 for ( i = 0; i < count; i++ )
398 if ( cluster[i] )
399 FREE( cluster[i] );
400 FREE( cluster );
401 }
402 }
403
404 /* count number of entries */
405 int count_arg( FILE *file, char *name )
406 {
407 char token[MAX_TOKEN_LENGTH];
408 int count = 0;
409
410 fseek( file, 0, SEEK_SET );
411 while ( read_token( file, token ) ) {
412 if ( strequal( name, token ) )
413 count++;
414 }
415 return count;
416 }
417
418 /*
419 ====================================================================
420 Swap these two pointers.
421 ====================================================================
422 */
423 void swap( char **str1, char **str2 )
424 {
425 char *dummy;
426 dummy = *str1;
427 *str1 = *str2;
428 *str2 = dummy;
429 }
430
431 /*
432 ====================================================================
433 Return a list with all accessible files and directories in path
434 with the extension ext (if != 0). Don't show hidden files.
435 Root is the name of the parent directory that can't be left. If this
436 is next directory up '..' is not added.
437 ====================================================================
438 */
439 Text* get_file_list( char *path, char *ext, char *root )
440 {
441 Text *text = 0;
442 int i, j;
443 DIR *dir;
444 DIR *test_dir;
445 struct dirent *dirent = 0;
446 List *list = 0;
447 struct stat fstat;
448 char file_name[512];
449 FILE *file;
450 int len;
451
452 /* open this directory */
453 if ( ( dir = opendir( path ) ) == 0 ) {
454 fprintf( stderr, "get_file_list: can't open parent directory '%s'\n", path );
455 return 0;
456 }
457
458 text = calloc( 1, sizeof( Text ) );
459
460 /* use dynamic list to gather all valid entries */
461 list = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
462 /* read each entry and check if its a valid entry, then add it to the dynamic list */
463 while ( ( dirent = readdir( dir ) ) != 0 ) {
464 /* hiden stuff is not displayed */
465 if ( dirent->d_name[0] == '.' && dirent->d_name[1] != '.' ) continue;
466 /* check if it's the root directory */
467 if ( root )
468 if ( dirent->d_name[0] == '.' )
469 if ( strlen( path ) > strlen( root ) )
470 if ( !strncmp( path + strlen( path ) - strlen( root ), root, strlen( root ) ) )
471 continue;
472 /* get stats */
473 sprintf( file_name, "%s/%s", path, dirent->d_name );
474 if ( stat( file_name, &fstat ) == -1 ) continue;
475 /* check directory */
476 if ( S_ISDIR( fstat.st_mode ) ) {
477 if ( ( test_dir = opendir( file_name ) ) == 0 ) continue;
478 closedir( test_dir );
479 sprintf( file_name, "*%s", dirent->d_name );
480 list_add( list, strdup( file_name ) );
481 }
482 else
483 /* check regular file */
484 if ( S_ISREG( fstat.st_mode ) ) {
485 /* test it */
486 if ( ( file = fopen( file_name, "r" ) ) == 0 ) continue;
487 fclose( file );
488 /* check if this file has the proper extension */
489 if ( ext )
490 if ( !strequal( dirent->d_name + ( strlen( dirent->d_name ) - strlen( ext ) ), ext ) )
491 continue;
492 list_add( list, strdup( dirent->d_name ) );
493 }
494 }
495 /* close dir */
496 closedir( dir );
497
498 /* convert to static list */
499 text->count = list->count;
500 text->lines = calloc( list->count, sizeof( char* ));
501 for ( i = 0; i < text->count; i++ )
502 text->lines[i] = strdup( (char*)list_get( list, i ) );
503 list_delete( list );
504
505 /* sort this list: directories at top and everything in alphabetical order */
506 if ( text->count > 0 )
507 for ( i = 0; i < text->count - 1; i++ )
508 for ( j = i + 1; j < text->count; j++ ) {
509 /* directory comes first */
510 if ( text->lines[j][0] == '*' ) {
511 if ( text->lines[i][0] != '*' )
512 swap( &text->lines[i], &text->lines[j] );
513 else {
514 /* do not exceed buffer size of smaller buffer */
515 len = strlen( text->lines[i] );
516 if ( strlen( text->lines[j] ) < len ) len = strlen( text->lines[j] );
517 if ( strncmp( text->lines[j], text->lines[i], len ) < 0 )
518 swap( &text->lines[i], &text->lines[j] );
519 }
520 }
521 else {
522 /* do not exceed buffer size of smaller buffer */
523 len = strlen( text->lines[i] );
524 if ( strlen( text->lines[j] ) < len ) len = strlen( text->lines[j] );
525 if ( strncmp( text->lines[j], text->lines[i], len ) < 0 )
526 swap( &text->lines[i], &text->lines[j] );
527 }
528 }
529
530 return text;
531 }
+0
-107
src/file.h less more
0 /***************************************************************************
1 file.h - description
2 -------------------
3 begin : Thu Jan 18 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17
18 #ifndef __FILE_H
19 #define __FILE_H
20
21 /*
22 this file contains function to work with files like
23 open,close,read/write binary/ascii data...
24 */
25
26 /* maximum length of a token */
27 enum {
28 MAX_TOKEN_LENGTH = 1024
29 };
30
31 /* shall find_arg reset to beginning of file or use current position? */
32 enum {
33 RESET_FILE_POS = 0,
34 FROM_CURRENT_FILE_POS
35 };
36
37 /* shall read_file_token go to next token or stay at end of current one */
38 enum {
39 GO_TO_NEXT_TOKEN = 0,
40 STAY_AT_TOKEN
41 };
42
43 /* display warning if find_arg failed */
44 enum {
45 NO_WARNING = 0,
46 WARNING
47 };
48
49 /*
50 ====================================================================
51 Test file in path as mode.
52 Return Value: True if sucessful
53 ====================================================================
54 */
55 int file_check( char *path, char *file, char *mode );
56 /*
57 ====================================================================
58 Open file in path according to type (write, read, append)
59 Return Value: File handle if successful else Null
60 ====================================================================
61 */
62 enum {
63 FILE_WRITE,
64 FILE_READ,
65 FILE_APPEND
66 };
67 FILE *file_open( char *path, char *fname, int type );
68 /*
69 ====================================================================
70 Read all lines from file pointer and return as static array.
71 Resets the file pointer. Should only be used when reading a whole
72 file.
73 ====================================================================
74 */
75 char** file_read_lines( FILE *file, int *count );
76
77 /* check consistence of file (all brackets/comments closed).
78 will reset the file pos to the very beginning */
79 int check_file_cons( FILE *file );
80
81 /* find a string in the file and set file stream to this position */
82 int find_token( FILE *file, char *name, int type, int warning );
83
84 /* read argument string of a single assignment */
85 char* get_arg( FILE *file, char *name, int type );
86
87 /* read a cluster of arguments and return as static list */
88 char** get_arg_cluster( FILE *file, char *name, int *count, int type, int warning );
89
90 /* free arg cluster */
91 void delete_arg_cluster( char **cluster, int count );
92
93 /* count number of entries */
94 int count_arg( FILE *file, char*name );
95
96 /*
97 ====================================================================
98 Return a list with all accessible files and directories in path
99 with the extension ext (if != 0). Don't show hidden files.
100 Root is the name of the parent directory that can't be left. If this
101 is next directory up '..' is not added.
102 ====================================================================
103 */
104 Text* get_file_list( char *path, char *ext, char *root );
105
106 #endif
+0
-302
src/frame.c less more
0 /***************************************************************************
1 frame.c - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "levels.h"
20 #include "bricks.h"
21 #include "extras.h"
22 #include "frame.h"
23 #ifdef SOUND
24 #include "audio.h"
25 #endif
26
27 extern Sdl sdl;
28 extern SDL_Surface *offscreen;
29 extern SDL_Surface *bkgnd; /* background + frame */
30 /* parts of the frame: left, top, right */
31 extern SDL_Surface *frame_left, *frame_top, *frame_right;
32 extern SDL_Surface *frame; /* assembled frame */
33 extern SDL_Surface *frame_shadow; /* shadow of frame */
34 extern SDL_Surface *lamps; /* life lamps */
35 float score = 0; /* current score */
36 int dest_score; /* final score */
37 int score_x_offset = 54; /* display score at this position (right align)*/
38 int score_x, score_y = BRICK_HEIGHT / 2 - 2; /* center position where to write score */
39 int new_life_y; /* if new life lamp is drawn do this at this y position */
40 int name_x = 404, name_y = BRICK_HEIGHT / 2 - 2; /* offset (right side of screen) */
41 extern Font *frame_font;
42 extern int shadow_size;
43 extern Config config;
44 int info_x, info_y; /* absolute position is info_y + info_offset */
45 int info_offsets[EX_NUMBER]; /* offset at which extra info is displayed */
46 extern int active[EX_NUMBER];
47 extern int extra_time[EX_NUMBER];
48 extern SDL_Surface *extra_pic;
49 #ifdef SOUND
50 extern Sound_Chunk *wav_life_up, *wav_life_down;
51 #endif
52
53 /*
54 ====================================================================
55 Locals
56 ====================================================================
57 */
58
59 /*
60 ====================================================================
61 Publics
62 ====================================================================
63 */
64
65 /*
66 ====================================================================
67 Create frame by loading and assembling all graphics and loading
68 additional graphics.
69 ====================================================================
70 */
71 void frame_create()
72 {
73 /* setup position of extra info */
74 info_x = sdl.screen->w - BRICK_WIDTH;
75 info_y = 48;
76 info_offsets[EX_GOLDSHOWER] = 30;
77 info_offsets[EX_SLIME] = 60;
78 info_offsets[EX_METAL] = 90;
79 info_offsets[EX_WEAK_BALL] = 90;
80 info_offsets[EX_EXPL_BALL] = 90;
81 info_offsets[EX_WALL] = 120;
82 info_offsets[EX_WEAPON] = 150;
83 info_offsets[EX_FAST] = 180;
84 info_offsets[EX_SLOW] = 180;
85 info_offsets[EX_CHAOS] = 210;
86 info_offsets[EX_GHOST_PADDLE] = 240;
87 /*
88 info_offsets[EX_SPIN_LEFT] = 270;
89 info_offsets[EX_SPIN_RIGHT] = 270;
90 */
91 info_offsets[EX_BONUS_MAGNET] = 270;
92 info_offsets[EX_MALUS_MAGNET] = 270;
93 }
94
95 /*
96 ====================================================================
97 Free all resources created by frame_create()
98 ====================================================================
99 */
100 void frame_delete()
101 {
102 }
103 /*
104 ====================================================================
105 Draw frame to offscreen and to bkgnd as frame won't change while
106 playing.
107 ====================================================================
108 */
109 void frame_draw()
110 {
111 /* offscreen */
112 /* add shadow */
113 if ( config.shadow ) {
114 DEST( offscreen, shadow_size, shadow_size, offscreen->w, offscreen->h );
115 SOURCE( frame_shadow, 0, 0 );
116 alpha_blit_surf( SHADOW_ALPHA );
117 }
118 FULL_DEST( offscreen );
119 FULL_SOURCE( frame );
120 blit_surf();
121 /* bkgnd */
122 /* add shadow */
123 if ( config.shadow ) {
124 DEST( bkgnd, shadow_size, shadow_size, offscreen->w, offscreen->h );
125 SOURCE( frame_shadow, 0, 0 );
126 alpha_blit_surf( SHADOW_ALPHA );
127 }
128 FULL_DEST( bkgnd );
129 FULL_SOURCE( frame );
130 blit_surf();
131 }
132 /*
133 ====================================================================
134 Add life lamps at left side of frame in offscreen
135 ====================================================================
136 */
137 void frame_draw_lives( int lives, int max_lives )
138 {
139 int i;
140 /* substract one life to have the same result like in old LBreakout */
141 /* at maximum ten lamps may be displayed */
142 for ( i = 0; i < 10; i++ ) {
143 DEST( offscreen, 0, ( MAP_HEIGHT - i - 1 ) * BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT );
144 if ( i < lives - 1 )
145 SOURCE( lamps, 0, BRICK_HEIGHT )
146 else
147 if ( i < max_lives - 1 )
148 SOURCE( lamps, 0, 0 )
149 else
150 SOURCE( lamps, 0, BRICK_HEIGHT * 2 )
151 blit_surf();
152 }
153 /* get position of next lamp */
154 new_life_y = sdl.screen->h - lives * BRICK_HEIGHT;
155 }
156 /*
157 ====================================================================
158 Add one new life at offscreen and screen (as this will happen in
159 game )
160 ====================================================================
161 */
162 void frame_add_life()
163 {
164 if ( !active[EX_DARKNESS] ) {
165 DEST( sdl.screen, 0, new_life_y, BRICK_WIDTH, BRICK_HEIGHT );
166 SOURCE( lamps, 0, BRICK_HEIGHT );
167 blit_surf();
168 add_refresh_rect( 0, new_life_y, BRICK_WIDTH, BRICK_HEIGHT );
169 }
170 new_life_y -= BRICK_HEIGHT;
171 #ifdef SOUND
172 sound_play( wav_life_up );
173 #endif
174 }
175 /*
176 ====================================================================
177 Switch of a life lamp
178 ====================================================================
179 */
180 void frame_remove_life()
181 {
182 new_life_y += BRICK_HEIGHT;
183 if ( new_life_y >= sdl.screen->h ) return;
184 if ( !active[EX_DARKNESS] ) {
185 DEST( sdl.screen, 0, new_life_y, BRICK_WIDTH, BRICK_HEIGHT );
186 SOURCE( lamps, 0, 0 );
187 blit_surf();
188 add_refresh_rect( 0, new_life_y, BRICK_WIDTH, BRICK_HEIGHT );
189 }
190 #ifdef SOUND
191 sound_play( wav_life_down );
192 #endif
193 }
194 /*
195 ====================================================================
196 Draw players name.
197 ====================================================================
198 */
199 void frame_draw_player_name( char *name )
200 {
201 frame_font->align = ALIGN_X_LEFT | ALIGN_Y_CENTER;
202 write_text( frame_font, offscreen, name_x, name_y, name, OPAQUE );
203 frame_font->last_width = frame_font->last_height = 0;
204 }
205 /*
206 ====================================================================
207 Set destination score to this value (update in sdl.screen)
208 ====================================================================
209 */
210 void frame_score_set( int dest )
211 {
212 dest_score = dest;
213 }
214 /*
215 ====================================================================
216 Set destination score and current score
217 to this value (update in sdl.screen)
218 ====================================================================
219 */
220 void frame_score_reset( int dest )
221 {
222 score = dest;
223 dest_score = dest;
224 }
225 /*
226 ====================================================================
227 Update score in sdl.screen
228 ====================================================================
229 */
230 void frame_score_hide()
231 {
232 DEST( sdl.screen, frame_font->last_x, frame_font->last_y, frame_font->last_width, frame_font->last_height );
233 SOURCE( frame, frame_font->last_x, frame_font->last_y );
234 blit_surf();
235 add_refresh_rect( frame_font->last_x, frame_font->last_y, frame_font->last_width, frame_font->last_height );
236 }
237 void frame_score_show()
238 {
239 char str[12];
240 /* get score string */
241 sprintf(str, "%i", (int)score);
242 score_x = sdl.screen->w - score_x_offset;
243 frame_font->align = ALIGN_X_RIGHT | ALIGN_Y_CENTER;
244 frame_font->save_last = 1;
245 write_text( frame_font, sdl.screen, score_x, score_y, str, OPAQUE );
246 add_refresh_rect( frame_font->last_x, frame_font->last_y, frame_font->last_width, frame_font->last_height );
247 }
248 void frame_score_update( int ms )
249 {
250 float change;
251 if ( (int)score == dest_score ) return;
252 /* change relative as for big scores we must count faster */
253 change = ( dest_score - score ) / 2000;
254 if ( change > 0 && change < 0.6 ) change = 0.6;
255 if ( change < 0 && change > -0.6 ) change = -0.6;
256 score += change * ms;
257 if ( change > 0 && score > dest_score ) score = dest_score;
258 if ( change < 0 && score < dest_score ) score = dest_score;
259 }
260 /*
261 ====================================================================
262 Display extra information on right side of screen.
263 ====================================================================
264 */
265 void frame_info_hide()
266 {
267 int i;
268 for ( i = 0; i < EX_NUMBER; i++ )
269 if ( info_offsets[i] > 0 && active[i] ) {
270 DEST( sdl.screen, info_x, info_y + info_offsets[i], BRICK_WIDTH, BRICK_HEIGHT );
271 SOURCE( offscreen, info_x, info_y + info_offsets[i] );
272 blit_surf();
273 add_refresh_rect( info_x, info_y + info_offsets[i], BRICK_WIDTH, BRICK_HEIGHT );
274 }
275 }
276 void frame_info_show()
277 {
278 char str[12];
279 int i;
280 frame_font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
281 for ( i = 0; i < EX_NUMBER; i++ ) {
282 if ( info_offsets[i] > 0 && active[i] ) {
283 if ( i == EX_WALL && extra_time[i] <= 0 ) continue;
284 /* picture */
285 DEST( sdl.screen, info_x, info_y + info_offsets[i], BRICK_WIDTH, BRICK_HEIGHT );
286 fill_surf( 0x0 );
287 SOURCE( extra_pic, i * BRICK_WIDTH, 0 );
288 alpha_blit_surf( 64 );
289 /* remaining extra_time */
290 sprintf(str, "%i", (extra_time[i] / 1000) + 1);
291 /* write text without saving last rect as this is used for score update */
292 frame_font->save_last = 0;
293 write_text( frame_font, sdl.screen,
294 info_x + ( BRICK_WIDTH >> 1 ), info_y + info_offsets[i] + ( BRICK_HEIGHT >> 1 ),
295 str, OPAQUE );
296 frame_font->save_last = 1;
297 /* refresh */
298 add_refresh_rect( info_x, info_y + info_offsets[i], BRICK_WIDTH, BRICK_HEIGHT );
299 }
300 }
301 }
+0
-96
src/frame.h less more
0 /***************************************************************************
1 frame.h - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 This file handles all the graphical stuff concering the frame
20 including drawing of score, lifes and bonus info.
21 ====================================================================
22 */
23
24 /*
25 ====================================================================
26 Create frame by loading and assembling all graphics and loading
27 additional graphics.
28 ====================================================================
29 */
30 void frame_create();
31 /*
32 ====================================================================
33 Free all resources created by frame_create()
34 ====================================================================
35 */
36 void frame_delete();
37 /*
38 ====================================================================
39 Draw frame to offscreen.
40 ====================================================================
41 */
42 void frame_draw();
43 /*
44 ====================================================================
45 Add life lamps at left side of frame in offscreen
46 ====================================================================
47 */
48 void frame_draw_lives( int lives, int max_lives );
49 /*
50 ====================================================================
51 Add one new life at offscreen and screen (as this will happen in
52 game )
53 ====================================================================
54 */
55 void frame_add_life();
56 /*
57 ====================================================================
58 Switch of a life lamp
59 ====================================================================
60 */
61 void frame_remove_life();
62 /*
63 ====================================================================
64 Draw players name.
65 ====================================================================
66 */
67 void frame_draw_player_name( char *name );
68 /*
69 ====================================================================
70 Set destination score to this value.
71 ====================================================================
72 */
73 void frame_score_set( int dest );
74 /*
75 ====================================================================
76 Set destination score and current score
77 to this value.
78 ====================================================================
79 */
80 void frame_score_reset( int dest );
81 /*
82 ====================================================================
83 Update score in sdl.screen
84 ====================================================================
85 */
86 void frame_score_hide();
87 void frame_score_show();
88 void frame_score_update( int ms );
89 /*
90 ====================================================================
91 Display extra information on right side of screen.
92 ====================================================================
93 */
94 void frame_info_hide();
95 void frame_info_show();
+0
-756
src/game.c less more
0 /***************************************************************************
1 game.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "list.h"
19 #include "event.h"
20 #include "config.h"
21 #include "difficulty.h"
22 #include "shrapnells.h"
23 #include "levels.h"
24 #include "player.h"
25 #include "chart.h"
26 #include "shine.h"
27 #include "credit.h"
28 #include "bricks.h"
29 #include "shots.h"
30 #include "frame.h"
31 #include "paddle.h"
32 #include "balls.h"
33 #include "extras.h"
34 #include "game.h"
35 #ifdef SOUND
36 #include "audio.h"
37 #endif
38
39 SDL_Surface *bkgnd = 0; /* current background picture */
40 SDL_Surface *offscreen = 0; /* buffer with frame, background and bricks */
41 int screenshot = 0; /* index of current screenshot */
42 extern Font *font; /* standard font */
43 Player *player = 0; /* current player */
44 extern Config config; /* lbreakout config struct */
45 extern int term_game; /* terminate game */
46 extern Sdl sdl; /* SDL struct */
47 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
48 Diff *diff = 0; /* current difficulty information */
49 extern int keystate[SDLK_LAST];
50 extern int buttonstate[BUTTON_COUNT];
51 extern int active[EX_NUMBER];
52 extern int shot_bricks_hit, shot_mx, shot_my; /* position at which brick (and maybe neighbor) was destroyed */
53 extern int brick_count;
54 extern char **levelset_names; /* names of all available levelsets */
55 char *levelset_name = 0; /* pointer (may not be deleted) to the current levelset's name */
56 extern Player players[MAX_PLAYERS]; /* player infos */
57 #ifdef SOUND
58 extern Sound_Chunk *wav_click;
59 extern Sound_Chunk *wav_damn, *wav_dammit, *wav_wontgiveup, *wav_excellent, *wav_verygood;
60 #endif
61 extern List *exp_bricks;
62 extern List *heal_bricks;
63
64 /* grow stuff put here because of interaction between balls and bricks */
65 extern int grow;
66 extern int grow_mask[MAP_WIDTH][MAP_HEIGHT]; /* indicates which tiles are blocked by a ball */
67 extern Brick_Conv brick_conv_table[BRICK_COUNT];
68 extern int brick_count;
69 extern List *balls;
70 extern int ball_dia;
71 extern int shadow_size;
72
73 /*
74 ====================================================================
75 Locals
76 ====================================================================
77 */
78
79 /*
80 ====================================================================
81 Create all bricks by ids stored to grow_mask.
82 ====================================================================
83 */
84 void game_grow_bricks()
85 {
86 int i, j;
87 int px, py, refresh_w, refresh_h;
88 Ball *list_ball;
89
90 /* clear occupied grow parts */
91 list_reset( balls );
92 while ( ( list_ball = list_next( balls ) ) != 0 ) {
93 grow_mask[(list_ball->x) / BRICK_WIDTH][(list_ball->y) / BRICK_HEIGHT] = -1;
94 grow_mask[(list_ball->x + ball_dia) / BRICK_WIDTH][(list_ball->y) / BRICK_HEIGHT] = -1;
95 grow_mask[(list_ball->x) / BRICK_WIDTH][(list_ball->y + ball_dia) / BRICK_HEIGHT] = -1;
96 grow_mask[(list_ball->x + ball_dia) / BRICK_WIDTH][(list_ball->y + ball_dia) / BRICK_HEIGHT] = -1;
97 }
98 /* refresh tile size */
99 refresh_w = BRICK_WIDTH;
100 refresh_h = BRICK_HEIGHT;
101 if ( config.shadow ) {
102 refresh_w += shadow_size;
103 refresh_h += shadow_size;
104 }
105 /* add bricks */
106 px = py = 0;
107 for ( j = 0; j < MAP_HEIGHT; j++ ) {
108 for ( i = 0; i < MAP_WIDTH; i++ ) {
109 if ( grow_mask[i][j] >= BRICK_GROW_FIRST && grow_mask[i][j] <= BRICK_GROW_LAST ) {
110 bricks[i][j].id = brick_conv_table[grow_mask[i][j]].id;
111 bricks[i][j].type = brick_conv_table[grow_mask[i][j]].type;
112 bricks[i][j].score = brick_conv_table[grow_mask[i][j]].score;
113 bricks[i][j].dur = brick_conv_table[grow_mask[i][j]].dur;
114 /* keep the extra that is already assigned to this position */
115 bricks[i][j].exp_time = -1;
116 bricks[i][j].heal_time = -1;
117 if ( !active[EX_DARKNESS] ) {
118 if ( config.shadow )
119 brick_draw_complex( i, j, px, py );
120 else
121 brick_draw( offscreen, i, j, 0 );
122 }
123 /* add id to grown_brick mask */
124 player->grown_bricks[i][j] = brick_conv_table[grow_mask[i][j]].id;
125 /* adjust brick count */
126 brick_count++;
127 /* refresh*/
128 if ( !active[EX_DARKNESS] ) {
129 DEST( sdl.screen, px, py, refresh_w, refresh_h );
130 SOURCE( offscreen, px, py );
131 blit_surf();
132 add_refresh_rect( px, py, refresh_w, refresh_h );
133 }
134 }
135 px += BRICK_WIDTH;
136 }
137 py += BRICK_HEIGHT;
138 px = 0;
139 }
140 grow = 0;
141 /* get new targets */
142 balls_get_new_targets( -1, -1 );
143 }
144
145 /*
146 ====================================================================
147 Initate current level from player's level resource pointer.
148 Recreates offscreen (frame, background, bricks) and resets paddle,
149 balls, extras. Do not add the bricks already removed:
150 player->bricks[x][y] == 0.
151 Return Value: True if successful
152 ====================================================================
153 */
154 enum { WITH_CREDITS = 1 };
155 int game_init_level( Player *player, int with_credits )
156 {
157 int i, j, k;
158
159 /* load bricks&extras from level data */
160 bricks_create( player->level );
161 /* remove cleared bricks */
162 for ( i = 1; i < MAP_WIDTH - 1; i++ )
163 for ( j = 1; j < MAP_HEIGHT - 1; j++ ) {
164 if ( player->bricks[i][j] == -99 ) {
165 /* initiate duration -- 0 means this brick was removed */
166 if ( bricks[i][j].type == MAP_EMPTY )
167 player->bricks[i][j] = 0;
168 else
169 player->bricks[i][j] = bricks[i][j].dur;
170 }
171 else
172 if ( player->bricks[i][j] == 0 ) {
173 if ( bricks[i][j].dur > 0 ) brick_count--;
174 bricks[i][j].id = -1;
175 bricks[i][j].dur = -1;
176 bricks[i][j].type = MAP_EMPTY;
177 }
178 else
179 if ( bricks[i][j].type != MAP_BRICK_HEAL ) /* generative bricks are kept reset */
180 if ( bricks[i][j].dur > 1 ) {
181 /*if multiple duration we need to use the player->bricks value */
182 for ( k = 0; k < bricks[i][j].dur - player->bricks[i][j]; k++ )
183 bricks[i][j].id--;
184 bricks[i][j].dur = player->bricks[i][j];
185 }
186 /* regnerative bricks with a durability of less than three shall be added to the regen list */
187 if ( bricks[i][j].type == MAP_BRICK_HEAL && bricks[i][j].dur < 3 ) {
188 bricks[i][j].mx = i;
189 bricks[i][j].my = j;
190 bricks[i][j].heal_time = BRICK_HEAL_TIME;
191 list_add( heal_bricks, &bricks[i][j] );
192 }
193 if ( player->grown_bricks[i][j] ) {
194 if ( bricks[i][j].type != MAP_EMPTY )
195 fprintf( stderr, "WARNING: Grown brick is blocked by another brick at %i,%i.\n", i, j );
196 else {
197 /* add grown brick */
198 bricks[i][j].id = player->grown_bricks[i][j];
199 bricks[i][j].dur = 1;
200 bricks[i][j].type = MAP_BRICK;
201 brick_count++;
202 }
203 }
204 }
205
206 /* recreate offscreen */
207 if ( offscreen ) SDL_FreeSurface( offscreen );
208 offscreen = create_surf( sdl.screen->w, sdl.screen->h, SDL_SWSURFACE );
209 SDL_SetColorKey( offscreen, 0, 0 );
210
211 /* add&create background */
212 if ( bkgnd ) SDL_FreeSurface( bkgnd );
213 bkgnd = bkgnd_draw( -1 );
214 /* add frame */
215 frame_draw();
216 /* add bricks */
217 bricks_draw();
218 /* draw lives */
219 frame_draw_lives( player->lives, diff->max_lives );
220 /* reset score */
221 frame_score_reset( player->score );
222 /* draw player's name */
223 frame_draw_player_name( player->name );
224 /* reset paddle */
225 paddle_reset();
226 /* event reset */
227 event_reset();
228 /* shots reset */
229 shots_reset();
230 /* reset balls */
231 balls_set_vel( diff->v_start, diff->v_change, diff->v_max );
232 balls_reset();
233 /* reset extras */
234 extras_reset();
235 /* reset shrapnells */
236 shrapnells_reset();
237 /* reset shine */
238 shine_reset();
239 /* reset explosions */
240 exps_clear();
241 exps_set_dark( 0 );
242 /* initiate credit */
243 if ( with_credits )
244 credit_init( player->level->name, player->level->author, levels_get_id( player->level ) );
245
246 /* show offscreen */
247 FULL_DEST( sdl.screen ); FULL_SOURCE( offscreen ); blit_surf();
248 /* no refresh rect as we want to use dim effect */
249 return 1;
250 }
251
252 /*
253 ====================================================================
254 Display info about player
255 ====================================================================
256 */
257 void player_info()
258 {
259 char info[128];
260 /* short info about actual player */
261 /* no info if this is the last active player */
262 if ( players_count() > 1 ) {
263 sprintf( info, "Next Player: %s", player->name );
264 confirm( font, info, CONFIRM_ANY_KEY );
265 }
266 else
267 refresh_screen( 0, 0, 0, 0 );
268 }
269 /*
270 ====================================================================
271 Runs Lbreakout until player looses ball or explicitly wishes
272 to quit, restart. (just request! confirmation not done here)
273 Assumes that the current offscreen was already displayed on screen
274 by game_init_level.
275 ====================================================================
276 */
277 enum {
278 REQUEST_NONE = 0,
279 REQUEST_RESTART,
280 REQUEST_QUIT,
281 REQUEST_NEXT_LEVEL,
282 REQUEST_NEXT_PLAYER,
283 REQUEST_PAUSE
284 };
285 int breakout_run() {
286 SDL_Event event;
287 int result = REQUEST_NONE;
288 int ms;
289 int fps_delay = 0;
290 Brick *brick;
291
292 /* delay */
293 switch ( config.fps ) {
294 case 1: fps_delay = 20; break;
295 case 2: fps_delay = 10; break;
296 case 3: fps_delay = 5; break;
297 }
298 /* grab input if wanted */
299 event_grab_input();
300 /* run main loop */
301 event_reset();
302 reset_timer();
303 while( result == REQUEST_NONE ) {
304 if ( config.fps ) SDL_Delay( fps_delay );
305 if ( event_poll( &event ) ) {
306 switch ( event.type ) {
307 case SDL_QUIT: term_game = 1; result = REQUEST_QUIT; break;
308 case SDL_KEYDOWN:
309 if ( keystate[config.k_fire] && weapon_installed() && !weapon_firing() ) weapon_start_fire();
310 break;
311 case SDL_KEYUP:
312 /* stop firing shots */
313 if ( weapon_firing() && !keystate[config.k_fire] ) weapon_stop_fire();
314 /* return balls that may do so */
315 if ( event.key.keysym.sym == config.k_return )
316 balls_return();
317 /* various requests */
318 switch ( event.key.keysym.sym ) {
319 case SDLK_q:
320 case SDLK_ESCAPE: result = REQUEST_QUIT; break;
321 case SDLK_r:
322 if ( player->lives <= 1 && player->score < diff->life_cost ) break;
323 result = REQUEST_RESTART;
324 player->lives--;
325 break;
326 case SDLK_f:
327 event_ungrab_input();
328 config.fullscreen = !config.fullscreen;
329 set_video_mode( std_video_mode( config.fullscreen ) );
330 /* redraw offscreen to get background */
331 FULL_DEST( sdl.screen ); FULL_SOURCE( offscreen ); blit_surf();
332 refresh_screen( 0, 0, 0, 0 );
333 event_grab_input();
334 break;
335 case SDLK_s:
336 #ifdef SOUND
337 config.sound = !config.sound;
338 sound_enable( config.sound );
339 #endif
340 break;
341 case SDLK_a:
342 config.anim++;
343 if ( config.anim >= 4 ) config.anim = 0;
344 break;
345 case SDLK_TAB:
346 take_screenshot( screenshot++ );
347 break;
348 case SDLK_p:
349 result = REQUEST_PAUSE;
350 break;
351 default: break;
352 }
353 break;
354 case SDL_MOUSEBUTTONDOWN:
355 if ( buttonstate[LEFT_BUTTON] && weapon_installed() && !weapon_firing() ) weapon_start_fire();
356 break;
357 case SDL_MOUSEBUTTONUP:
358 if ( weapon_firing() && !buttonstate[LEFT_BUTTON] ) weapon_stop_fire();
359 if ( event.button.button == MIDDLE_BUTTON )
360 balls_return();
361 break;
362 }
363 }
364 ms = get_time();
365 /* hide */
366 frame_info_hide();
367 extras_hide();
368 paddle_hide();
369 balls_hide();
370 shots_hide();
371 shrapnells_hide();
372 wall_hide();
373 if ( !active[EX_DARKNESS] ) frame_score_hide();
374 shine_hide();
375 exps_hide();
376 credit_hide();
377 /* update */
378 paddle_update( ms );
379 if ( !balls_update( ms ) ) {
380 result = REQUEST_NEXT_PLAYER;
381 player->lives--;
382 }
383 shots_update( ms );
384 extras_update( ms );
385 wall_update( ms );
386 shrapnells_update( ms );
387 frame_score_update( ms );
388 shine_update( ms );
389 exps_update( ms );
390 credit_update( ms );
391 /* check if bricks were destroyed by shots */
392 if ( shot_bricks_hit ) {
393 balls_get_new_targets( shot_mx, shot_my );
394 if ( shot_bricks_hit == 2 ) /* hit neighbor, too */
395 balls_get_new_targets( shot_mx + 1, shot_my );
396 shot_bricks_hit = 0;
397 }
398 /* check if bricks were destroyed by explosion */
399 if ( exp_bricks->count > 0 ) {
400 list_reset( exp_bricks );
401 while ( ( brick = list_next( exp_bricks ) ) != 0 ) {
402 brick->exp_time -= ms;
403 if ( brick->exp_time <= 0 ) {
404 brick->exp_time = -1;
405 brick_remove( brick->mx, brick->my, SHR_BY_EXPL, vector_get( 0, 0 ) );
406 balls_get_new_targets( brick->mx, brick->my );
407 list_delete_current( exp_bricks );
408 }
409 }
410 }
411 /* check if bricks regenerate */
412 if ( heal_bricks->count > 0 ) {
413 list_reset( heal_bricks );
414 while ( ( brick = list_next( heal_bricks ) ) != 0 ) {
415 /* skip brick if destroyed meanwhile */
416 if ( brick->type != MAP_BRICK_HEAL ) {
417 list_delete_current( heal_bricks );
418 continue;
419 }
420 brick->heal_time -= ms;
421 if ( brick->heal_time < 0 ) {
422 brick->dur++;
423 brick->id++;
424 /* redraw */
425 if ( !active[EX_DARKNESS] ) {
426 brick_draw( offscreen, brick->mx, brick->my, 0 );
427 brick_draw( sdl.screen, brick->mx, brick->my, 0 );
428 add_refresh_rect( brick->mx * BRICK_WIDTH, brick->my * BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT );
429 }
430 if ( brick->dur < 3 ) {
431 /* initate next healing step */
432 brick->heal_time = BRICK_HEAL_TIME;
433 }
434 else {
435 brick->heal_time = -1;
436 list_delete_current( heal_bricks );
437 }
438 }
439 }
440 }
441 /* check if this results in growing */
442 if ( grow ) game_grow_bricks();
443 /* update score */
444 if ( player_score_changed( player ) ) frame_score_set( player->score );
445 /* update ball speed */
446 if ( !active[EX_SLOW] && !active[EX_FAST] ) balls_inc_vel( ms );
447 /* check if all bricks where destroyed */
448 if ( brick_count == 0 ) result = REQUEST_NEXT_LEVEL;
449 /* show -- some things will be missing if darkness is enabled */
450 if ( config.ball_level == BALL_BELOW_BONUS )
451 balls_show();
452 shots_show();
453 extras_show();
454 if ( config.ball_level == BALL_ABOVE_BONUS )
455 balls_show();
456 paddle_show();
457 if ( !active[EX_DARKNESS] ) wall_show();
458 shine_show();
459 exps_show();
460 if ( !active[EX_DARKNESS] ) {
461 shrapnells_show();
462 frame_score_show();
463 frame_info_show();
464 }
465 credit_show();
466 /* update anything that was changed */
467 refresh_rects();
468 }
469 /* release input */
470 event_ungrab_input();
471 return result;
472 }
473 /*
474 ====================================================================
475 Fade all animations until they disappear
476 ====================================================================
477 */
478 void fade_anims()
479 {
480 float alpha = 0;
481 int ms;
482 frame_remove_life();
483 reset_timer();
484 while ( alpha < 255 ) {
485 paddle_hide();
486 balls_hide();
487 extras_hide();
488 shrapnells_hide();
489 shots_hide();
490 wall_hide();
491 credit_hide();
492 ms = get_time();
493 alpha += 0.5 * ms;
494 if ( alpha > 255 ) alpha = 255;
495 shrapnells_update( ms );
496 paddle_alphashow( alpha );
497 balls_alphashow( alpha );
498 extras_alphashow( alpha );
499 shots_alphashow( alpha );
500 shrapnells_show();
501 wall_alphashow( alpha );
502 credit_alphashow( alpha );
503 refresh_rects();
504 }
505 }
506
507 /*
508 ====================================================================
509 Publics
510 ====================================================================
511 */
512
513 /*
514 ====================================================================
515 Load all static resources like frame, bricks, balls, extras...
516 ====================================================================
517 */
518 void game_create()
519 {
520 bricks_load();
521 paddle_load();
522 ball_load();
523 shot_load();
524 extras_load();
525 frame_create();
526 shrapnells_init();
527 shine_load();
528 /* load names of all valid levelsets */
529 levelsets_load_names();
530 }
531 /*
532 ====================================================================
533 Delete anything created by game_create();
534 ====================================================================
535 */
536 void game_delete()
537 {
538 bricks_delete();
539 paddle_delete();
540 ball_delete();
541 shot_delete();
542 extras_delete();
543 frame_delete();
544 shrapnells_delete();
545 shine_delete();
546 /* free levelset names */
547 levelsets_delete_names();
548 }
549 /*
550 ====================================================================
551 Initiates players and the first level.
552 Return Value: True if successful
553 ====================================================================
554 */
555 int game_init()
556 {
557 int i;
558 char path[512];
559 char *setname = 0;
560 /* load level */
561 setname = levelset_names[config.levelset_id];
562 if ( levelset_names[config.levelset_id][0] == '~' ) {
563 sprintf( path, "%s/%s/lbreakout2-levels", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
564 setname++;
565 }
566 else
567 sprintf( path, "%s/levels", SRC_DIR );
568 if ( !levels_load( path, setname ) ) return 0;
569 /* set global pointer to set name */
570 levelset_name = levelset_names[config.levelset_id];
571 /* set difficulty */
572 diff = diff_get( config.diff );
573 /* initiate players from config information */
574 players_clear();
575 for ( i = 0; i < config.player_count; i++ )
576 player_add( config.player_names[i], diff->lives, levels_get_first() );
577 player = players_get_first();
578 /* initiate level */
579 return game_init_level( player, WITH_CREDITS );
580 }
581
582 /*
583 ====================================================================
584 Free all memory allocated by game_init()
585 ====================================================================
586 */
587 void game_clear()
588 {
589 if ( offscreen ) SDL_FreeSurface( offscreen ); offscreen = 0;
590 if ( bkgnd ) SDL_FreeSurface( bkgnd ); bkgnd = 0;
591 credit_clear();
592 }
593 /*
594 ====================================================================
595 Run game after first level was initiated. Initiates next levels,
596 too.
597 ====================================================================
598 */
599 void game_run()
600 {
601 int leave = 0;
602 int next_player = 0;
603 int result;
604 char str[64];
605 int i;
606
607 fade_screen( FADE_IN, FADE_DEF_TIME );
608 player_info();
609 while ( !leave && !term_game ) {
610 /* run game until player wants to quit or restart or lost the ball or reached next level */
611 result = breakout_run();
612 switch ( result ) {
613 case REQUEST_PAUSE:
614 confirm( font, "Pause", CONFIRM_PAUSE );
615 break;
616 case REQUEST_QUIT:
617 if ( term_game || confirm( font, "Exit Game? y/n", CONFIRM_YES_NO ) )
618 leave = 1;
619 break;
620 case REQUEST_NEXT_LEVEL:
621 #ifdef SOUND
622 if ( config.speech ) {
623 if ( rand() % 2 )
624 sound_play( wav_excellent );
625 else
626 sound_play( wav_verygood );
627 }
628 #endif
629 player->level = levels_get_next( player->level );
630 player_reset_bricks( player );
631 if ( !player->level ) {
632 confirm( font, "Congratulations! No more levels left!", CONFIRM_ANY_KEY );
633 /* player finished all levels so ''deactivate'' him */
634 player->lives = 0;
635 /* if this was the last player show congrats */
636 if ( players_count() == 0 ) {
637 /* congrats */
638 confirm( font, "Game Over!", CONFIRM_ANY_KEY );
639 leave = 1;
640 break;
641 }
642 /*
643 else {
644 player = players_get_next();
645 next_player = 1;
646 }
647 */
648 }
649 /* switch player in any case after level was finished so the other
650 players don't have to wait too long */
651 if ( players_count() > 1 ) {
652 player = players_get_next();
653 next_player = 1;
654 }
655 if ( next_player ) {
656 fade_anims();
657 game_init_level( player, WITH_CREDITS );
658 player_info();
659 next_player = 0;
660 }
661 else {
662 fade_screen( FADE_OUT, FADE_DEF_TIME );
663 game_init_level( player, WITH_CREDITS );
664 fade_screen( FADE_IN, FADE_DEF_TIME );
665 }
666 break;
667 case REQUEST_RESTART:
668 /* if there are no lifes remaining this is a continue request */
669 if ( player->lives == 0 ) {
670 sprintf( str, "Buy a continue? (%i points) y/n", diff->life_cost );
671 if ( confirm( font , str, CONFIRM_YES_NO ) ) {
672 player->score -= diff->life_cost;
673 player->lives++;
674 }
675 else
676 break;
677 }
678 else
679 if ( !confirm( font, "Restart Level? y/n", CONFIRM_YES_NO ) ) break;
680 player_reset_bricks( player );
681 case REQUEST_NEXT_PLAYER:
682 /* if we got here the current player lost a life */
683 #ifdef SOUND
684 if ( result == REQUEST_NEXT_PLAYER && config.speech ) {
685 if ( rand() % 2 )
686 sound_play( wav_damn );
687 else
688 sound_play( wav_dammit );
689 }
690 #endif
691 /* if he has no lives left but enough score to buy one he may do so
692 else he will be kicked out of the game as lives == 0 */
693 if ( player->lives == 0 && player->score >= diff->life_cost ) {
694 sprintf( str, "Buy a continue? (%i points) y/n", diff->life_cost );
695 if ( confirm( font , str, CONFIRM_YES_NO ) ) {
696 player->score -= diff->life_cost;
697 player->lives++;
698 #ifdef SOUND
699 if ( config.speech )
700 sound_play( wav_wontgiveup );
701 #endif
702 }
703 }
704 if ( players_count() >= 1 )
705 player = players_get_next();
706 else {
707 /* all players died - quit game */
708 leave = 1;
709 confirm( font, "Game Over!", CONFIRM_ANY_KEY );
710 break;
711 }
712 fade_anims();
713 game_init_level( player, WITH_CREDITS );
714 player_info();
715 break;
716 }
717 }
718 fade_screen( FADE_OUT, FADE_DEF_TIME );
719 /* modify score of involved players */
720 if ( diff->score_mod != 1.0 )
721 for ( i = 0; i < config.player_count; i++ )
722 players[i].score = (int)(diff->score_mod * players[i].score);
723 /* add players to chart */
724 chart_clear_new_entries();
725 for ( i = 0; i < config.player_count; i++ )
726 chart_add( chart_set_query( levelset_name), players[i].name, levels_get_id( players[i].level ) + 1, players[i].score );
727 /* and save... maybe it crashes and we don't want to loose highscore results, right? */
728 chart_save();
729 }
730
731 /*
732 ====================================================================
733 Test this level until ball gets lost.
734 ====================================================================
735 */
736 void game_test_level( Level *level )
737 {
738 Player test_player;
739 /* initate testplayer */
740 strcpy( test_player.name, "Player" );
741 test_player.score = 0;
742 test_player.old_score = 0;
743 test_player.lives = 1;
744 test_player.level = level;
745 player_reset_bricks( &test_player );
746 player = &test_player;
747 /* difficulty */
748 diff = diff_get( config.diff );
749 /* init game */
750 game_init_level( player, 0 /* no credits */ );
751 /* run */
752 fade_screen( FADE_IN, FADE_DEF_TIME );
753 breakout_run();
754 fade_screen( FADE_OUT, FADE_DEF_TIME );
755 }
+0
-58
src/game.h less more
0 /***************************************************************************
1 game.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Load all static resources like frame, bricks, balls, extras...
20 ====================================================================
21 */
22 void game_create();
23 /*
24 ====================================================================
25 Delete anything created by game_create();
26 ====================================================================
27 */
28 void game_delete();
29 /*
30 ====================================================================
31 Initiates player and the first level.
32 Return Value: True if successful
33 ====================================================================
34 */
35 int game_init();
36
37 /*
38 ====================================================================
39 Free all memory allocated by game_init()
40 ====================================================================
41 */
42 void game_clear();
43
44 /*
45 ====================================================================
46 Run game after first level was initiated. Initiates next levels,
47 too.
48 ====================================================================
49 */
50 void game_run();
51
52 /*
53 ====================================================================
54 Test this level until ball gets lost.
55 ====================================================================
56 */
57 void game_test_level( Level *level );
+0
-14
src/gfx/Makefile.am less more
0 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png \
1 ball.png bricks.png extras.png \
2 f_small_white.png f_small_yellow.png f_white.png f_yellow.png \
3 fr_left.png fr_right.png fr_top.png \
4 life.png menuback.png paddle.png shine.png shot.png weapon.png \
5 sel_frame.png buttons.png explosions.png explosions_dark.png \
6 f_tiny_black.png balloon.png balloon_peek.png \
7 f_frame.png f_game.png
8
9 install-data-local:
10 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx
11 @for file in *.png; do\
12 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/$$file;\
13 done
+0
-186
src/gfx/Makefile.in less more
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 CC = @CC@
60 MAKEINFO = @MAKEINFO@
61 PACKAGE = @PACKAGE@
62 RANLIB = @RANLIB@
63 SDL_CFLAGS = @SDL_CFLAGS@
64 SDL_CONFIG = @SDL_CONFIG@
65 SDL_LIBS = @SDL_LIBS@
66 VERSION = @VERSION@
67 doc_dir = @doc_dir@
68 hi_dir = @hi_dir@
69 hi_inst_flag = @hi_inst_flag@
70 inst_dir = @inst_dir@
71 inst_flag = @inst_flag@
72 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
74 warp_flag = @warp_flag@
75
76 EXTRA_DIST = back0.png back1.png back2.png back3.png back4.png back5.png ball.png bricks.png extras.png f_small_white.png f_small_yellow.png f_white.png f_yellow.png fr_left.png fr_right.png fr_top.png life.png menuback.png paddle.png shine.png shot.png weapon.png sel_frame.png buttons.png explosions.png explosions_dark.png f_tiny_black.png balloon.png balloon_peek.png f_frame.png f_game.png
77
78 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
79 CONFIG_HEADER = ../../config.h
80 CONFIG_CLEAN_FILES =
81 DIST_COMMON = Makefile.am Makefile.in
82
83
84 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
85
86 TAR = gtar
87 GZIP_ENV = --best
88 all: all-redirect
89 .SUFFIXES:
90 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
91 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/gfx/Makefile
92
93 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
94 cd $(top_builddir) \
95 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
96
97 tags: TAGS
98 TAGS:
99
100
101 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
102
103 subdir = src/gfx
104
105 distdir: $(DISTFILES)
106 @for file in $(DISTFILES); do \
107 d=$(srcdir); \
108 if test -d $$d/$$file; then \
109 cp -pr $$/$$file $(distdir)/$$file; \
110 else \
111 test -f $(distdir)/$$file \
112 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
113 || cp -p $$d/$$file $(distdir)/$$file || :; \
114 fi; \
115 done
116 info-am:
117 info: info-am
118 dvi-am:
119 dvi: dvi-am
120 check-am: all-am
121 check: check-am
122 installcheck-am:
123 installcheck: installcheck-am
124 install-exec-am:
125 install-exec: install-exec-am
126
127 install-data-am: install-data-local
128 install-data: install-data-am
129
130 install-am: all-am
131 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
132 install: install-am
133 uninstall-am:
134 uninstall: uninstall-am
135 all-am: Makefile
136 all-redirect: all-am
137 install-strip:
138 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
139 installdirs:
140
141
142 mostlyclean-generic:
143
144 clean-generic:
145
146 distclean-generic:
147 -rm -f Makefile $(CONFIG_CLEAN_FILES)
148 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
149
150 maintainer-clean-generic:
151 mostlyclean-am: mostlyclean-generic
152
153 mostlyclean: mostlyclean-am
154
155 clean-am: clean-generic mostlyclean-am
156
157 clean: clean-am
158
159 distclean-am: distclean-generic clean-am
160
161 distclean: distclean-am
162
163 maintainer-clean-am: maintainer-clean-generic distclean-am
164 @echo "This command is intended for maintainers to use;"
165 @echo "it deletes files that may require special tools to rebuild."
166
167 maintainer-clean: maintainer-clean-am
168
169 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
170 installcheck-am installcheck install-exec-am install-exec \
171 install-data-local install-data-am install-data install-am install \
172 uninstall-am uninstall all-redirect all-am all installdirs \
173 mostlyclean-generic distclean-generic clean-generic \
174 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
175
176
177 install-data-local:
178 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/gfx
179 @for file in *.png; do\
180 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/gfx/$$file;\
181 done
182
183 # Tell versions [3.59,3.63) of GNU make to not export all variables.
184 # Otherwise a system limit (for SysV at least) may be exceeded.
185 .NOEXPORT:
src/gfx/back0.png less more
Binary diff not shown
src/gfx/back1.png less more
Binary diff not shown
src/gfx/back2.png less more
Binary diff not shown
src/gfx/back3.png less more
Binary diff not shown
src/gfx/back4.png less more
Binary diff not shown
src/gfx/back5.png less more
Binary diff not shown
src/gfx/ball.png less more
Binary diff not shown
src/gfx/balloon.png less more
Binary diff not shown
src/gfx/balloon_peek.png less more
Binary diff not shown
src/gfx/bricks.png less more
Binary diff not shown
src/gfx/buttons.png less more
Binary diff not shown
src/gfx/explosions.png less more
Binary diff not shown
src/gfx/explosions_dark.png less more
Binary diff not shown
src/gfx/extras.png less more
Binary diff not shown
src/gfx/f_frame.png less more
Binary diff not shown
src/gfx/f_game.png less more
Binary diff not shown
src/gfx/f_small_white.png less more
Binary diff not shown
src/gfx/f_small_yellow.png less more
Binary diff not shown
src/gfx/f_tiny_black.png less more
Binary diff not shown
src/gfx/f_white.png less more
Binary diff not shown
src/gfx/f_yellow.png less more
Binary diff not shown
src/gfx/fr_left.png less more
Binary diff not shown
src/gfx/fr_right.png less more
Binary diff not shown
src/gfx/fr_top.png less more
Binary diff not shown
src/gfx/life.png less more
Binary diff not shown
src/gfx/menuback.png less more
Binary diff not shown
src/gfx/paddle.png less more
Binary diff not shown
src/gfx/sel_frame.png less more
Binary diff not shown
src/gfx/shine.png less more
Binary diff not shown
src/gfx/shot.png less more
Binary diff not shown
src/gfx/weapon.png less more
Binary diff not shown
+0
-373
src/help.c less more
0 /***************************************************************************
1 help.c - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "event.h"
19 #include "config.h"
20 #include "levels.h"
21 #include "player.h"
22 #include "shrapnells.h"
23 #include "bricks.h"
24 #ifdef SOUND
25 #include "audio.h"
26 #endif
27
28 Font *help_caption_font = 0;
29 Font *help_font = 0;
30 SDL_Surface *help_bkgnd = 0;
31 int side_count = 4;
32
33 extern Sdl sdl;
34 extern SDL_Surface *extra_pic;
35 extern SDL_Surface *brick_pic;
36
37 /*
38 ====================================================================
39 Locals
40 ====================================================================
41 */
42
43 /*
44 ====================================================================
45 Draw title.
46 ====================================================================
47 */
48 void draw_title( )
49 {
50 help_caption_font->align = ALIGN_X_CENTER | ALIGN_Y_TOP;
51 write_text( help_caption_font, sdl.screen, sdl.screen->w / 2, 20, "Quick Help", OPAQUE );
52 }
53 /*
54 ====================================================================
55 Add footnote.
56 ====================================================================
57 */
58 void draw_footnote( int side )
59 {
60 char buf[256];
61 help_font->align = ALIGN_X_RIGHT | ALIGN_Y_BOTTOM;
62 sprintf( buf, "%i / %i", side, side_count );
63 write_text( help_font, sdl.screen, sdl.screen->w - 2, sdl.screen->h - 2, buf, OPAQUE );
64 help_font->align = ALIGN_X_LEFT | ALIGN_Y_BOTTOM;
65 sprintf( buf, "<ESCAPE>: Quit <LEFT BUTTON>: Next Page <RIGHT BUTTON>: Previous Page" );
66 write_text( help_font, sdl.screen, 2, sdl.screen->h - 2, buf, OPAQUE );
67 }
68
69 /*
70 ====================================================================
71 Draw bonus info
72 ====================================================================
73 */
74 void draw_bonus_info( int x, int y, int id, char *text )
75 {
76 DEST( sdl.screen, x, y, BRICK_WIDTH, BRICK_HEIGHT );
77 SOURCE( extra_pic, id * BRICK_WIDTH, 0 );
78 blit_surf();
79 help_font->align = ALIGN_X_LEFT | ALIGN_Y_CENTER;
80 write_text( help_font, sdl.screen, x + BRICK_WIDTH + 10, y + BRICK_HEIGHT / 2, text, OPAQUE );
81 }
82
83 /*
84 ====================================================================
85 Draw brick info
86 ====================================================================
87 */
88 void draw_brick_info( int x, int y, int id, char *text )
89 {
90 DEST( sdl.screen, x, y, BRICK_WIDTH, BRICK_HEIGHT );
91 SOURCE( brick_pic, id * BRICK_WIDTH, 0 );
92 blit_surf();
93 help_font->align = ALIGN_X_LEFT | ALIGN_Y_CENTER;
94 write_text( help_font, sdl.screen, x + BRICK_WIDTH + 10, y + BRICK_HEIGHT / 2, text, OPAQUE );
95 }
96
97 /*
98 ====================================================================
99 Draw bonus info screen.
100 ====================================================================
101 */
102 void draw_bonus_screen()
103 {
104 int bonus_x = 20, bonus_y = 80, bonus_w = 200, bonus_h = 30;
105 int malus_x = 20, malus_y = 330, malus_w = 200, malus_h = 30;
106
107 FULL_DEST( sdl.screen ); FULL_SOURCE( help_bkgnd ); blit_surf();
108 draw_title();
109
110 /* bonuses */
111 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
112 write_text( help_caption_font, sdl.screen, bonus_x, bonus_y - 30, "Bonuses:", OPAQUE );
113 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 0, 8, "Expand paddle" );
114 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 0, 9, "Extra life" );
115 draw_bonus_info( bonus_x + bonus_w * 2, bonus_y + bonus_h * 0, 10, "Sticky paddle" );
116 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 1, 15, "Plasma weapon" );
117 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 1, 2, "200 - 10,000 points extra score" );
118 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 2, 12, "Extra ball" );
119 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 2, 11, "Energy balls (penetrate bricks)" );
120 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 3, 13, "Bonus floor" );
121 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 3, 18, "Deccelerate balls to minimum speed" );
122 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 4, 6, "1,000 points extra score from bricks with no bonus" );
123 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 5, 19, "Instantly collect all bonuses and destroy all maluses" );
124 draw_bonus_info( bonus_x + bonus_w * 0, bonus_y + bonus_h * 6, 25, "Explosive balls" );
125 draw_bonus_info( bonus_x + bonus_w * 1, bonus_y + bonus_h * 6, 26, "Paddle attracts bonuses" );
126
127 /* maluses */
128 write_text( help_caption_font, sdl.screen, malus_x, malus_y - 30, "Maluses:", OPAQUE );
129 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 0, 7, "Shrink paddle" );
130 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 3, 17, "Accelerate balls" );
131 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 1, 14, "Freeze paddle" );
132 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 1, 21, "Random ball reflection at bricks" );
133 draw_bonus_info( malus_x + malus_w * 0, malus_y + malus_h * 2, 20, "Darkness" );
134 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 2, 27, "Paddle attracts maluses" );
135 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 0, 22, "Paddle disappears when not moving" );
136 draw_bonus_info( malus_x + malus_w * 1, malus_y + malus_h * 3, 28, "40% chance that a ball doesn't damage brick" );
137
138 draw_footnote( 1 );
139
140 refresh_screen( 0, 0, 0, 0 );
141 }
142 /*
143 ====================================================================
144 Draw hint
145 ====================================================================
146 */
147 void draw_hint( int x, int y, char *text )
148 {
149 write_text( help_font, sdl.screen, x, y, text, OPAQUE );
150 }
151 /*
152 ====================================================================
153 Draw hints
154 ====================================================================
155 */
156 void draw_hints_screen()
157 {
158 int hint_x = 20, hint_y = 80, hint_h = 20;
159
160 FULL_DEST( sdl.screen ); FULL_SOURCE( help_bkgnd ); blit_surf();
161 draw_title();
162
163 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
164 write_text( help_caption_font, sdl.screen, hint_x, hint_y - 40, "Hints:", OPAQUE );
165
166 draw_hint( hint_x, hint_y + hint_h * 0, "<<'In Game'-Keys>>" );
167 draw_hint( hint_x, hint_y + hint_h * 1, " p Pause game." );
168 draw_hint( hint_x, hint_y + hint_h * 2, " s Enable/Disable sound." );
169 draw_hint( hint_x, hint_y + hint_h * 3, " a Change animation level (off/low/high)." );
170 draw_hint( hint_x, hint_y + hint_h * 4, " f Switch fullscreen/windowed mode." );
171 draw_hint( hint_x, hint_y + hint_h * 5, " NOTE: Changing resolution takes a while so this is done best" );
172 draw_hint( hint_x, hint_y + hint_h * 6, " when game's paused." );
173 draw_hint( hint_x, hint_y + hint_h * 7, " r Restart level." );
174 draw_hint( hint_x, hint_y + hint_h * 8, " TAB Take a screenshot." );
175 draw_hint( hint_x, hint_y + hint_h * 9, " ESC Quit game." );
176
177 draw_footnote( 3 );
178
179 refresh_screen( 0, 0, 0, 0 );
180 }
181 /*
182 ====================================================================
183 Draw ingame hints
184 ====================================================================
185 */
186 void draw_ingame_hints_screen()
187 {
188 int brick_x = 20, brick_y = 210, brick_h = 30;
189 int extra_x = 20, extra_y = 80, extra_h = 30;
190
191 FULL_DEST( sdl.screen ); FULL_SOURCE( help_bkgnd ); blit_surf();
192 draw_title();
193
194 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
195 write_text( help_caption_font, sdl.screen, extra_x, extra_y - 30, "Neutral Power-Ups:", OPAQUE );
196
197 draw_bonus_info( extra_x, extra_y + extra_h * 0, 16, "Any of the listed bonuses/maluses." );
198 draw_bonus_info( extra_x, extra_y + extra_h * 1, 23, "Resets all active bonuses and maluses." );
199 draw_bonus_info( extra_x, extra_y + extra_h * 2, 24, "Adds 7 seconds to all active bonuses/maluses." );
200
201 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
202 write_text( help_caption_font, sdl.screen, brick_x, brick_y - 30, "Special Bricks:", OPAQUE );
203
204 draw_brick_info( brick_x, brick_y + brick_h * 0, 0, "Indestructible." );
205 draw_brick_info( brick_x, brick_y + brick_h * 1, 1, "May only be destroyed by energy ball else it's indestructible." );
206 draw_brick_info( brick_x, brick_y + brick_h * 2, 2, "As above and balls are reflected randomly at this brick." );
207 draw_brick_info( brick_x, brick_y + brick_h * 3, 5, "Needs three hits to be destroyed." );
208 draw_brick_info( brick_x, brick_y + brick_h * 4, 9, "As above and regenerates durability every 4 seconds." );
209 draw_brick_info( brick_x, brick_y + brick_h * 5, 18, "Explodes and destroys all nearby bricks." );
210 draw_brick_info( brick_x, brick_y + brick_h * 6, 19, "Creates up to 8 bricks on destruction." );
211
212 draw_footnote( 2 );
213
214 refresh_screen( 0, 0, 0, 0 );
215 }
216 /*
217 ====================================================================
218 Draw trouble shooting
219 ====================================================================
220 */
221 void draw_trouble( int x, int y, char *text )
222 {
223 draw_hint( x, y, text );
224 }
225 void draw_trouble_screen()
226 {
227 int trouble_x = 20, trouble_y = 90, trouble_h = 20;
228 int manual_x = 20, manual_y = 310, manual_h = 20;
229 FULL_DEST( sdl.screen ); FULL_SOURCE( help_bkgnd ); blit_surf();
230 draw_title();
231
232 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
233 write_text( help_caption_font, sdl.screen, trouble_x, trouble_y - 40, "Troubleshooting:", OPAQUE );
234
235 draw_trouble( trouble_x, trouble_y + trouble_h * 0, "* In fullscreen mode the window keeps it size just adding a black frame?" );
236 draw_trouble( trouble_x, trouble_y + trouble_h * 1, " - Maybe you do not have 640x480 as resolution available? Check your" );
237 draw_trouble( trouble_x, trouble_y + trouble_h * 2, " X configuration." );
238 draw_trouble( trouble_x, trouble_y + trouble_h * 3, "* Sounds seem to be out of sync and are played with some delay?" );
239 draw_trouble( trouble_x, trouble_y + trouble_h * 4, " - Set SDL_AUDIODRIVER to dma (export SDL_AUDIODRIVER=dma). If this results" );
240 draw_trouble( trouble_x, trouble_y + trouble_h * 5, " in a lot of errors killing artsd (or esd) may help." );
241 draw_trouble( trouble_x, trouble_y + trouble_h * 6, "* LBreakout2 gets mute while playing when switching on/off sounds?" );
242 draw_trouble( trouble_x, trouble_y + trouble_h * 7, " - SDL_mixer seems to mute active channels. You shouldn't enable/disable" );
243 draw_trouble( trouble_x, trouble_y + trouble_h * 8, " sounds to often as you'll propably loose all channels then." );
244
245 help_caption_font->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
246 write_text( help_caption_font, sdl.screen, manual_x, manual_y - 40, "Manual:", OPAQUE );
247 draw_trouble( manual_x, manual_y + manual_h * 0, "This is just a quick help with the most important facts about LBreakout2." );
248 draw_trouble( manual_x, manual_y + manual_h * 1, "If you want more and better information check out the manual installed to" );
249 draw_trouble( manual_x, manual_y + manual_h * 2, "/usr/doc/lbreakout2 or the online version at http://www.lgames.org." );
250 draw_trouble( manual_x, manual_y + manual_h * 3, "And if you have questions (not answered by the manual) or you found a bug" );
251 draw_trouble( manual_x, manual_y + manual_h * 4, "or you just want to drop a general note about LBreakout2 just mail to:" );
252 draw_trouble( manual_x, manual_y + manual_h * 5, " kulkanie@gmx.net" );
253 draw_trouble( manual_x, manual_y + manual_h * 6, " Enjoy the game!" );
254 draw_trouble( manual_x, manual_y + manual_h * 6 + 10, " Michael Speck" );
255
256 draw_footnote( 4 );
257
258 refresh_screen( 0, 0, 0, 0 );
259 }
260
261 /*
262 ====================================================================
263 Publics
264 ====================================================================
265 */
266
267 /*
268 ====================================================================
269 Load/delete help resources.
270 ====================================================================
271 */
272 void help_create()
273 {
274 SDL_Surface *buffer = 0;
275 help_font = load_fixed_font( "f_small_yellow.bmp", 32, 96, 8, SDL_SWSURFACE );
276 help_caption_font = load_fixed_font( "f_yellow.bmp", 32, 96, 10, SDL_SWSURFACE );
277 /* background */
278 buffer = load_surf( "menuback.bmp", SDL_SWSURFACE );
279 help_bkgnd = create_surf( buffer->w, buffer->h, SDL_SWSURFACE );
280 SDL_SetColorKey( help_bkgnd, 0, 0 );
281 FULL_DEST( help_bkgnd ); fill_surf( 0x0 );
282 FULL_SOURCE( buffer ); alpha_blit_surf( 192 );
283 SDL_FreeSurface( buffer );
284 }
285 void help_delete()
286 {
287 free_font( &help_font );
288 free_font( &help_caption_font );
289 if ( help_bkgnd ) SDL_FreeSurface ( help_bkgnd ); help_bkgnd = 0;
290 }
291
292 /*
293 ====================================================================
294 Run help.
295 ====================================================================
296 */
297 void help_run()
298 {
299 int leave = 0;
300 SDL_Event event;
301 int cur_side = 0;
302 SDL_Surface *buffer = create_surf(sdl.screen->w, sdl.screen->h, SDL_HWSURFACE);
303
304 event_block_motion( 1 );
305
306 /* buffer screen */
307 SDL_SetColorKey(buffer, 0, 0);
308 FULL_DEST(buffer);
309 FULL_SOURCE(sdl.screen);
310 blit_surf();
311
312 /* display background */
313 FULL_DEST(sdl.screen);
314 FULL_SOURCE(help_bkgnd);
315 blit_surf();
316
317 draw_bonus_screen();
318 while ( !leave ) {
319 SDL_WaitEvent( &event );
320 switch ( event.type ) {
321 case SDL_KEYUP:
322 switch ( event.key.keysym.sym ) {
323 case SDLK_ESCAPE: leave = 1; break;
324 case SDLK_LEFT:
325 case SDLK_RIGHT:
326 if ( event.key.keysym.sym == SDLK_RIGHT ) {
327 cur_side++;
328 if ( cur_side == side_count ) cur_side = 0;
329 }
330 else {
331 cur_side--;
332 if ( cur_side < 0 ) cur_side = side_count - 1;
333 }
334 switch ( cur_side ) {
335 case 0: draw_bonus_screen(); break;
336 case 2: draw_hints_screen(); break;
337 case 1: draw_ingame_hints_screen(); break;
338 case 3: draw_trouble_screen(); break;
339 }
340 break;
341 default: break;
342 }
343 break;
344 case SDL_MOUSEBUTTONUP:
345 if ( event.button.button == LEFT_BUTTON ) {
346 cur_side++;
347 if ( cur_side == side_count ) cur_side = 0;
348 }
349 else {
350 cur_side--;
351 if ( cur_side < 0 ) cur_side = side_count - 1;
352 }
353 switch ( cur_side ) {
354 case 0: draw_bonus_screen(); break;
355 case 2: draw_hints_screen(); break;
356 case 1: draw_ingame_hints_screen(); break;
357 case 3: draw_trouble_screen(); break;
358 }
359 break;
360 default: break;
361 }
362 }
363
364 /* redraw screen */
365 FULL_DEST(sdl.screen);
366 FULL_SOURCE(buffer);
367 blit_surf();
368 refresh_screen( 0, 0, 0, 0 );
369 SDL_FreeSurface( buffer );
370
371 event_block_motion( 0 );
372 }
+0
-36
src/help.h less more
0 /***************************************************************************
1 item.h - description
2 -------------------
3 begin : Sat Dec 15 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __HELP_H
18 #define __HELP_H
19
20 /*
21 ====================================================================
22 Load/delete help resources.
23 ====================================================================
24 */
25 void help_create();
26 void help_delete();
27
28 /*
29 ====================================================================
30 Run help.
31 ====================================================================
32 */
33 void help_run();
34
35 #endif
+0
-229
src/hint.c less more
0 /***************************************************************************
1 hint.c - description
2 -------------------
3 begin : Sun Jan 6 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "hint.h"
19 #include "config.h"
20
21 SDL_Surface *hint_balloon = 0;
22 SDL_Surface *hint_bkgnd = 0;
23 SDL_Surface *balloon = 0;
24 SDL_Surface *balloon_peek = 0;
25 int balloon_peek_add_x = 9, balloon_peek_add_y = 9; /* added to actual balloon to display peek */
26 int balloon_tile_size;
27 Hint *cur_hint = 0;
28 Font *hint_font = 0;
29 int hint_delay = 0;
30 float hint_alpha;
31 int hint_text_x = 10 + 9, hint_text_y = 10; /* text is drawn at this offset within balloon */
32
33 extern Config config;
34 extern Sdl sdl;
35
36 /*
37 ====================================================================
38 Locals
39 ====================================================================
40 */
41
42 /*
43 ====================================================================
44 Create actual hint picture displayed.
45 ====================================================================
46 */
47 void hint_create_pic()
48 {
49 int x, y;
50 free_surf( &hint_balloon );
51 hint_balloon = create_surf( cur_hint->sw, cur_hint->sh, SDL_SWSURFACE );
52 for ( y = 0; y < cur_hint->sh - balloon_peek_add_y; y += balloon_tile_size )
53 for ( x = 0; x < cur_hint->sw - balloon_peek_add_x; x += balloon_tile_size ) {
54 DEST( hint_balloon, x + balloon_peek_add_x, y, balloon_tile_size, balloon_tile_size );
55 /* get proper tile */
56 if ( y == 0 ) {
57 if ( x == 0 )
58 SOURCE( balloon, 0, 0 )
59 else
60 if ( x >= cur_hint->sw - balloon_peek_add_x - balloon_tile_size )
61 SOURCE( balloon, balloon_tile_size * 2, 0 )
62 else
63 SOURCE( balloon, balloon_tile_size, 0 )
64 }
65 else
66 if ( y >= cur_hint->sh - balloon_peek_add_y - balloon_tile_size ) {
67 if ( x == 0 )
68 SOURCE( balloon, 0, balloon_tile_size * 2 )
69 else
70 if ( x >= cur_hint->sw - balloon_peek_add_x - balloon_tile_size )
71 SOURCE( balloon, balloon_tile_size * 2, balloon_tile_size * 2 )
72 else
73 SOURCE( balloon, balloon_tile_size, balloon_tile_size * 2 )
74 }
75 else {
76 if ( x == 0 )
77 SOURCE( balloon, 0, balloon_tile_size )
78 else
79 if ( x >= cur_hint->sw - balloon_peek_add_x - balloon_tile_size )
80 SOURCE( balloon, balloon_tile_size * 2, balloon_tile_size )
81 else
82 SOURCE( balloon, balloon_tile_size, balloon_tile_size )
83 }
84 blit_surf();
85 }
86 /* peek */
87 DEST( hint_balloon, 0, cur_hint->sh - balloon_peek->h, balloon_peek->w, balloon_peek->h );
88 SOURCE( balloon_peek, 0, 0 );
89 blit_surf();
90 /* text */
91 for ( y = 0, x = 0; x < cur_hint->text->count; y += hint_font->height, x++ )
92 write_text( hint_font, hint_balloon, hint_text_x, hint_text_y + y, cur_hint->text->lines[x], OPAQUE );
93 }
94
95 /*
96 ====================================================================
97 Publics
98 ====================================================================
99 */
100
101 /*
102 ====================================================================
103 Load/delete hint resources.
104 ====================================================================
105 */
106 void hint_load_res()
107 {
108 balloon = load_surf( "balloon.bmp", SDL_SWSURFACE );
109 balloon_peek = load_surf( "balloon_peek.bmp", SDL_SWSURFACE );
110 balloon_tile_size = balloon->w / 3;
111 hint_font = load_fixed_font( "f_tiny_black.bmp", 32, 96, 6, SDL_SWSURFACE );
112 }
113 void hint_delete_res()
114 {
115 free_surf( &balloon );
116 free_surf( &balloon_peek );
117 free_font( &hint_font );
118 free_surf( &hint_balloon );
119 }
120
121 /*
122 ====================================================================
123 Create a hint. The passed x,y position is where the end of the
124 Sprechblasenspitze is. Contents is converted to lines (duplicated).
125 ====================================================================
126 */
127 Hint* hint_create( int x, int y, char *contents )
128 {
129 Hint *hint = calloc( 1, sizeof( Hint ) );
130 /* get text */
131 hint->text = create_text( contents, 36 );
132 /* get screen size and convert string */
133 hint->sw = 240 + balloon_peek_add_x;
134 hint->sh = balloon_tile_size * ( 2 + ( hint->text->count + 0 ) * hint_font->height / balloon_tile_size ) + balloon_peek_add_y;
135 hint_set_pos( hint, x, y );
136 return hint;
137 }
138 void hint_delete( Hint *hint )
139 {
140 if ( !hint )
141 return;
142 free( hint );
143 }
144
145 /*
146 ====================================================================
147 Set the background on which the hints will be displayed.
148 ====================================================================
149 */
150 void hint_set_bkgnd( SDL_Surface *bkgnd )
151 {
152 hint_bkgnd = bkgnd;
153 }
154
155 /*
156 ====================================================================
157 Set this hint as actual one. If NULL was passed no hint will be
158 handled.
159 ====================================================================
160 */
161 void hint_set( Hint *hint )
162 {
163 if ( config.use_hints )
164 cur_hint = hint;
165 else
166 cur_hint = 0;
167 if ( cur_hint ) {
168 hint_alpha = 255;
169 hint_delay = 500;
170 hint_create_pic();
171 }
172 }
173
174 /*
175 ====================================================================
176 Set hint to this position.
177 ====================================================================
178 */
179 void hint_set_pos( Hint *hint, int x, int y )
180 {
181 /* adjust screen position so that balloon's peek is at x,y */
182 hint->sx = x;
183 hint->sy = y - hint->sh - balloon_peek->h / 2;
184 }
185
186 /*
187 ====================================================================
188 Show/hide/update _current_ hint.
189 ====================================================================
190 */
191 void hint_hide()
192 {
193 if ( !cur_hint || hint_delay )
194 return;
195 DEST( sdl.screen, cur_hint->sx, cur_hint->sy, cur_hint->sw, cur_hint->sh );
196 SOURCE( hint_bkgnd, cur_hint->sx, cur_hint->sy );
197 blit_surf();
198 add_refresh_rect( cur_hint->sx, cur_hint->sy, cur_hint->sw, cur_hint->sh );
199 /* peek */
200 DEST( sdl.screen, cur_hint->sx + balloon_peek_add_x, cur_hint->sy + cur_hint->sh + balloon_peek_add_y, balloon_peek->w, balloon_peek->h );
201 SOURCE( hint_bkgnd, cur_hint->sx + balloon_peek_add_x, cur_hint->sy + cur_hint->sh + balloon_peek_add_y );
202 blit_surf();
203 add_refresh_rect( cur_hint->sx + balloon_peek_add_x, cur_hint->sy + cur_hint->sh + balloon_peek_add_y, balloon_peek->w, balloon_peek->h );
204 }
205 void hint_show()
206 {
207 if ( !cur_hint || hint_delay )
208 return;
209 DEST( sdl.screen, cur_hint->sx, cur_hint->sy, cur_hint->sw, cur_hint->sh );
210 SOURCE( hint_balloon, 0, 0 );
211 alpha_blit_surf( hint_alpha );
212 add_refresh_rect( cur_hint->sx, cur_hint->sy, cur_hint->sw, cur_hint->sh );
213 }
214 void hint_update( int ms )
215 {
216 /* delay */
217 if ( hint_delay > 0 ) {
218 hint_delay -= ms;
219 if ( hint_delay <= 0 )
220 hint_delay = 0;
221 }
222 /* if delay fade blend if if still alpha */
223 if ( hint_delay == 0 && hint_alpha > 0 ) {
224 hint_alpha -= 1.0 * ms;
225 if ( hint_alpha < 0 )
226 hint_alpha = 0;
227 }
228 }
+0
-74
src/hint.h less more
0 /***************************************************************************
1 hint.h - description
2 -------------------
3 begin : Sun Jan 6 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __HINT_H
18 #define __HINT_H
19
20 typedef struct {
21 Text *text; /* contents */
22 int sx, sy, sw, sh; /* screen geometry */
23 } Hint;
24
25 /*
26 ====================================================================
27 Load/delete hint resources.
28 ====================================================================
29 */
30 void hint_load_res();
31 void hint_delete_res();
32
33 /*
34 ====================================================================
35 Create a hint. The passed x,y position is where the end of the
36 Sprechblasenspitze is. Contents is converted to lines (duplicated).
37 ====================================================================
38 */
39 Hint* hint_create( int x, int y, char *contents );
40 void hint_delete( Hint *hint );
41
42 /*
43 ====================================================================
44 Set the background on which the hints will be displayed.
45 ====================================================================
46 */
47 void hint_set_bkgnd( SDL_Surface *bkgnd );
48
49 /*
50 ====================================================================
51 Set this hint as actual one. If NULL was passed no hint will be
52 handled.
53 ====================================================================
54 */
55 void hint_set( Hint *hint );
56
57 /*
58 ====================================================================
59 Set hint to this position.
60 ====================================================================
61 */
62 void hint_set_pos( Hint *hint, int x, int y );
63
64 /*
65 ====================================================================
66 Show/hide/update _current_ hint.
67 ====================================================================
68 */
69 void hint_hide();
70 void hint_show();
71 void hint_update( int ms );
72
73 #endif
+0
-215
src/item.c less more
0 /***************************************************************************
1 item.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "manager.h"
18
19 extern Sdl sdl;
20 extern SDL_Surface *mbkgnd;
21 extern Font *mfont, *mhfont;
22
23 /*
24 ====================================================================
25 Locals
26 ====================================================================
27 */
28
29 float alpha_change = 0.4;
30
31 /*
32 ====================================================================
33 Create a basic item.
34 ====================================================================
35 */
36 Item *item_create_basic( int type, char *name, char *hint )
37 {
38 Item *item = calloc( 1, sizeof( Item ) );
39 /* name */
40 item->name = strdup( name );
41 /* id */
42 item->item_id = -1;
43 /* alpha */
44 item->halpha = 255;
45 item->alpha = 0;
46 /* type */
47 item->type = type;
48 /* hint if astring was passed */
49 if ( hint == 0 )
50 item->hint = 0;
51 else
52 item->hint = hint_create( 0, 0, hint ); /* the position will be set when this item is adjusted in menu adjust */
53 return item;
54 }
55
56 /*
57 ====================================================================
58 Publics
59 ====================================================================
60 */
61
62 /*
63 ====================================================================
64 Create item.
65 Return Value: item
66 ====================================================================
67 */
68 Item *item_create_separator( char *name )
69 {
70 Item *item = item_create_basic( ITEM_SEPARATOR, name, 0 );
71 return item;
72 }
73 Item *item_create_range( char *name, char *hint, int *val_int, int min, int max, int step )
74 {
75 Item *item = item_create_basic( ITEM_RANGE, name, hint );
76 item->value = value_create_range_int( val_int, min, max, step );
77 return item;
78 }
79 Item *item_create_switch( char *name, char *hint, int *val_int, char *str_off, char *str_on )
80 {
81 char **names = calloc( 2, sizeof( char* ) );
82 Item *item = item_create_basic( ITEM_SWITCH, name, hint );
83 names[0] = strdup( str_off );
84 names[1] = strdup( str_on );
85 item->value = value_create_range_str( val_int, names, 2 );
86 free( names[0] ); free( names[1] ); free( names );
87 return item;
88 }
89 Item *item_create_switch_x( char *name, char *hint, int *val_int, char **strings, int count )
90 {
91 Item *item = item_create_basic( ITEM_SWITCH_X, name, hint );
92 item->value = value_create_range_str( val_int, strings, count );
93 return item;
94 }
95 Item *item_create_key( char *name, char *hint, int *val_int, int *filter )
96 {
97 Item *item = item_create_basic( ITEM_KEY, name, hint );
98 item->value = value_create_key( val_int, filter );
99 return item;
100 }
101 Item *item_create_edit( char *name, char *hint, char *val_str, int limit )
102 {
103 Item *item = item_create_basic( ITEM_EDIT, name, hint );
104 item->value = value_create_edit( val_str, limit );
105 return item;
106 }
107 Item *item_create_link( char *name, char *hint, void *menu )
108 {
109 Item *item = item_create_basic( ITEM_LINK, name, hint );
110 item->link = menu;
111 return item;
112 }
113 Item *item_create_action( char *name, char *hint, int item_id )
114 {
115 Item *item = item_create_basic( ITEM_ACTION, name, hint );
116 item->item_id = item_id;
117 return item;
118 }
119 /*
120 ====================================================================
121 Delete item (void pointer for compatiblity when using with list)
122 ====================================================================
123 */
124 void item_delete( void *pitem )
125 {
126 Item *item = (Item*)pitem;
127 if ( !item ) return;
128 if ( item->name ) free( item->name );
129 if ( item->value ) value_delete( item->value );
130 if ( item->hint ) hint_delete( item->hint );
131 free( item );
132 }
133 /*
134 ====================================================================
135 Adjust alignment of name and value strings
136 ====================================================================
137 */
138 void item_adjust( Item *item )
139 {
140 /* alignment - name */
141 item->nx = 0; item->ny = item->h / 2; item->nalign = ALIGN_X_LEFT | ALIGN_Y_CENTER;
142 if ( item->type == ITEM_LINK || item->type == ITEM_ACTION || item->type == ITEM_SEPARATOR ) {
143 item->nx = item->w / 2;
144 item->nalign = ALIGN_X_CENTER | ALIGN_Y_CENTER;
145 }
146 item->vx = item->w - 1; item->vy = item->h / 2; item->valign = ALIGN_X_RIGHT | ALIGN_Y_CENTER;
147 /* hint position */
148 if ( item->hint )
149 hint_set_pos( item->hint, item->x + item->w * 0.6, item->y );
150 }
151 /*
152 ====================================================================
153 Hide/Show item
154 ====================================================================
155 */
156 void item_hide( Item *item )
157 {
158 DEST( sdl.screen, item->x, item->y, item->w, item->h );
159 SOURCE( mbkgnd, item->x, item->y );
160 blit_surf();
161 add_refresh_rect( item->x, item->y, item->w, item->h );
162 }
163 void item_show( Item *item )
164 {
165 Font *font = mfont;
166 /* name */
167 if ( item->font ) font = item->font; /* manual override if special font was set */
168 font->align = item->nalign;
169 mhfont->align = item->nalign;
170 write_text( font, sdl.screen, item->x + item->nx, item->y + item->ny, item->name, item->alpha );
171 if ( item->halpha < 255 )
172 write_text( mhfont, sdl.screen, item->x + item->nx, item->y + item->ny, item->name, item->halpha );
173 /* value string */
174 if ( item->value ) {
175 font->align = item->valign;
176 mhfont->align = item->valign;
177 write_text( font, sdl.screen, item->x + item->vx, item->y + item->vy, item->value->val_str, item->alpha );
178 if ( item->halpha < 255 )
179 write_text( mhfont, sdl.screen, item->x + item->vx, item->y + item->vy, item->value->val_str, item->halpha );
180 }
181 add_refresh_rect( item->x, item->y, item->w, item->h );
182 }
183 /*
184 ====================================================================
185 Update alpha of item
186 ====================================================================
187 */
188 void item_update_alpha( Item *item, int ms )
189 {
190 if ( item->highlighted ) {
191 item->halpha = 0;
192 item->alpha = 255;
193 }
194 else {
195 if ( item->halpha < 255 ) {
196 item->halpha += alpha_change * ms;
197 if ( item->halpha > 255 ) item->halpha = 255;
198 }
199 if ( item->alpha > 0 ) {
200 item->alpha -= alpha_change * ms;
201 if ( item->alpha < 0 ) item->alpha = 0;
202 }
203 }
204 }
205 /*
206 ====================================================================
207 Check if position's on item.
208 ====================================================================
209 */
210 int item_focus( Item *item, int x, int y )
211 {
212 if ( item->type == ITEM_SEPARATOR ) return 0; /* may never be focused */
213 return ( x >= item->x && y >= item->y && x < item->x + item->w && y < item->y + item->h );
214 }
+0
-105
src/item.h less more
0 /***************************************************************************
1 item.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __ITEM_H
18 #define __ITEM_H
19
20 #include "hint.h"
21
22 /*
23 ====================================================================
24 Item of menu
25 ====================================================================
26 */
27 enum {
28 ITEM_SEPARATOR = 0,
29 ITEM_SWITCH,
30 ITEM_SWITCH_X,
31 ITEM_RANGE,
32 ITEM_KEY,
33 ITEM_EDIT,
34 ITEM_LINK,
35 ITEM_ACTION
36 };
37 typedef struct {
38 Value *value; /* value of item */
39 int type; /* type as listed above */
40 char *name; /* name of item -- duplicated */
41 int item_id; /* id of item (returned as action if ITEM_ACTION) */
42 int x, y, w, h; /* position and size in screen */
43 int nx, ny; /* position where name is drawn */
44 int nalign; /* align of name: either left-aligned
45 or centered (only if link to another menu) */
46 int vx, vy; /* position where value string is drawn right-aligned */
47 int valign; /* alignment of value string */
48 float alpha; /* alpha of normal font (which vanishes when selected) */
49 float halpha; /* alpha of highlight font */
50 int highlighted; /* keep alpha at 0 (will raise to 255 if not set) */
51 void (*callback)(); /* if value of item has been modified this functions is called */
52 void *link; /* menu link */
53 Font *font; /* if set use this font instead of standard font */
54 Hint *hint; /* if not NULL this hint is displayed when quick-help's enabled:
55 created by item itself */
56 } Item;
57
58 /*
59 ====================================================================
60 Create item.
61 Return Value: item
62 ====================================================================
63 */
64 Item *item_create_separator( char *name );
65 Item *item_create_range( char *name, char *hint, int *val_int, int min, int max, int step );
66 Item *item_create_switch( char *name, char *hint, int *val_int, char *str_off, char *str_on );
67 Item *item_create_switch_x( char *name, char *hint, int *val_int, char **strings, int count );
68 Item *item_create_key( char *name, char *hint, int *val_int, int *filter );
69 Item *item_create_edit( char *name, char *hint, char *val_str, int limit );
70 Item *item_create_link( char *name, char *hint, void *menu );
71 Item *item_create_action( char *name, char *hint, int item_id );
72 /*
73 ====================================================================
74 Delete item (void pointer for compatiblity when using with list)
75 ====================================================================
76 */
77 void item_delete( void *item );
78 /*
79 ====================================================================
80 Adjust alignment of name and value strings
81 ====================================================================
82 */
83 void item_adjust( Item *item );
84 /*
85 ====================================================================
86 Hide/Show item
87 ====================================================================
88 */
89 void item_hide( Item *item );
90 void item_show( Item *item );
91 /*
92 ====================================================================
93 Update alpha of item
94 ====================================================================
95 */
96 void item_update_alpha( Item *item, int ms );
97 /*
98 ====================================================================
99 Check if position's on item.
100 ====================================================================
101 */
102 int item_focus( Item *item, int x, int y );
103
104 #endif
+0
-112
src/lbreakout.h less more
0 /***************************************************************************
1 lbreakout.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LBREAKOUT_H
18 #define __LBREAKOUT_H
19
20 #define WITH_BUG_REPORT
21
22 /*
23 ====================================================================
24 Global definitions for LBreakout and general system includes.
25 ====================================================================
26 */
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <math.h>
32 #include <SDL.h>
33 #ifdef SOUND
34 #include <SDL_mixer.h>
35 #endif
36 #include "sdl.h"
37 #include "tools.h"
38 #include "misc.h"
39
40 #ifndef M_PI
41 #define M_PI 3.1415926535897932384626433832795f
42 #endif
43
44 /*
45 ====================================================================
46 Size of playing field and editable playing field.
47 ====================================================================
48 */
49 enum {
50 MAP_WIDTH = 16,
51 MAP_HEIGHT = 24,
52 EDIT_WIDTH = 14,
53 EDIT_HEIGHT = 18
54 };
55
56 /*
57 ====================================================================
58 Extras
59 ====================================================================
60 */
61 enum {
62 EX_NONE = -1,
63 EX_SCORE200 = 0,
64 EX_SCORE500,
65 EX_SCORE1000,
66 EX_SCORE2000,
67 EX_SCORE5000,
68 EX_SCORE10000,
69 EX_GOLDSHOWER,
70 EX_SHORTEN,
71 EX_LENGTHEN,
72 EX_LIFE,
73 EX_SLIME,
74 EX_METAL,
75 EX_BALL,
76 EX_WALL,
77 EX_FROZEN,
78 EX_WEAPON,
79 EX_RANDOM,
80 EX_FAST,
81 EX_SLOW,
82 EX_JOKER,
83 EX_DARKNESS,
84 EX_CHAOS,
85 EX_GHOST_PADDLE,
86 EX_DISABLE,
87 EX_TIME_ADD,
88 EX_EXPL_BALL,
89 EX_BONUS_MAGNET,
90 EX_MALUS_MAGNET,
91 EX_WEAK_BALL,
92 /*
93 EX_SPIN_RIGHT,
94 EX_SPIN_LEFT,
95 */
96 EX_NUMBER
97 };
98 /*
99 ====================================================================
100 Alpha of shadow
101 ====================================================================
102 */
103 enum { SHADOW_ALPHA = 64 };
104 /*
105 ====================================================================
106 Maximum number of allowed backgrounds.
107 ====================================================================
108 */
109 enum { BACK_COUNT = 6 };
110
111 #endif
+0
-615
src/levels/AddOn-1 less more
0 Level:
1 Michael Speck
2 Fireworks
3 Bricks:
4 ..............
5 gg..........gg
6 **gg......gg**
7 gg**gg..gg**gg
8 eegg**gg**ggee
9 **eeggggggee**
10 ee**eeggee**ee
11 ffee**ee**eeff
12 **ffeeeeeeff**
13 ff**ffeeff**ff
14 ddff**ff**ffdd
15 **ddffffffdd**
16 dd**ddffdd**dd
17 ..dd**dd**dd..
18 ....dddddd....
19 ......dd......
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ..............
26 .s........1-..
27 ............d.
28 ..+.>..~......
29 .1....-..?..b.
30 ...<..1....>..
31 .?...+..-...1.
32 ...b...j...w..
33 ...-.c....<...
34 .+.....1.-..+.
35 ......f.......
36 ....1......b..
37 .......+......
38 ..............
39 ..............
40 ..............
41 Level:
42 Michael Speck
43
44 Bricks:
45 ..............
46 ..............
47 ..............
48 ...gggggggg...
49 ddddggggggdddd
50 ddddddggdddddd
51 eeeeeeggeeeeee
52 ccceeeggeeeccc
53 ..chhhgghhhc..
54 ..chhh..hhhc..
55 ..ceee..eeec..
56 ccceeeffeeeccc
57 ddddddffdddddd
58 ddddddffdddddd
59 ..ffffffffff..
60 ...ffffffff...
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 .........j....
68 .~.....-.....w
69 .....?.....-..
70 ..+-...1.+....
71 .....+.....>..
72 ...>..d...b...
73 ....s....1....
74 ..<m.-..c.+...
75 1.....f.....2.
76 .1..b....-....
77 ...+.1....?...
78 .......<......
79 ..........b...
80 ..............
81 ..............
82 Level:
83 Michael Speck
84 Minefields
85 Bricks:
86 ..............
87 ..............
88 .jggggg*ggggj.
89 .kjg*ggggggjk.
90 .kijgggg*gj*k.
91 .ki*jg*ggjiik.
92 .*iiijggjiiik.
93 .kii*ijjiiiik.
94 .kiiiii*i*i*k.
95 .kiiiiiiiiiik.
96 .ki*iijjiiiik.
97 .k*ii*g*jiiik.
98 .kiijgggg*ii*.
99 .kijggggggjik.
100 .kjgg*ggggg*k.
101 .*gggggg*gggj.
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ..............
107 .....<........
108 ..j........>..
109 ..?...-.s..1..
110 ..........+...
111 ...w-..c-.....
112 ......+...p...
113 ..-..l.1.1.1..
114 .+..~......-..
115 ...1..d..fb...
116 .>1..1.1......
117 ...+........1.
118 ..........?...
119 ...b...+...1<.
120 .1......b.....
121 ..............
122 ..............
123 Level:
124 Michael Speck
125 Fate
126 Bricks:
127 ..............
128 .....jjjj.....
129 ....jjkkjj....
130 ...jjk..kjj...
131 ..jjk....jjj..
132 ..jjk.....jk..
133 ..jk......jk..
134 ..........jk..
135 .........jjk..
136 ........jjk...
137 .......jjk....
138 ......jjk.....
139 ......jj......
140 ......jk......
141 ......jk......
142 ..............
143 ......jk......
144 ......jk......
145 Bonus:
146 ..............
147 .....?.?......
148 ......?.?.....
149 ....?....?....
150 ...?......?...
151 ..?........?..
152 ...?......?...
153 ...........?..
154 ..........?...
155 .........?....
156 ........?.....
157 .......?......
158 ......?.......
159 .......?......
160 ......?.......
161 ..............
162 .......?......
163 ......?.......
164 Level:
165 Michael Speck
166
167 Bricks:
168 ..............
169 ..............
170 .ffffffffffff.
171 .fggggggggggf.
172 .fgiiiiiiiigf.
173 .fgikkkkkkigf.
174 .fgikkkkkkigf.
175 .fgikkkkkkigf.
176 .fgiiiiiiiigf.
177 .fggggggggggf.
178 .ffffffffffff.
179 ..............
180 ..............
181 hchchchchchchc
182 .h.h.h.h.h.h.h
183 ..............
184 cdcdcdcdcdcdcd
185 d.d.d.d.d.d.d.
186 Bonus:
187 ..............
188 ..............
189 ..g.......>...
190 .....2..p..j..
191 ..............
192 ..2w...-......
193 .2..+.....s...
194 ...........2-.
195 ......-..<....
196 ..+....2......
197 ..<.b....+....
198 ..............
199 ..............
200 ..b...1.-.b...
201 .-.~.....f.+.>
202 ..............
203 .....?.d.c.?..
204 ..1.+.........
205 Level:
206 Michael Speck
207 Death And Rebirth
208 Bricks:
209 ..............
210 ..............
211 ..............
212 ..............
213 ...!..!!..!...
214 ..*.*....*.*..
215 .!...!**!...!.
216 ..*.*....*.*..
217 ...!..!!..!...
218 ..*.*....*.*..
219 .!...!**!...!.
220 ..*.*....*.*..
221 ...!..!!..!...
222 ..*........*..
223 .!..........!.
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ..............
230 ..............
231 ......>...2...
232 ....+.........
233 .......2c.....
234 ...........+<.
235 .+.-.2..+.~...
236 ..2..-........
237 ......s.-.w.2.
238 ..b.d.........
239 .>.-.<..f.?.-.
240 ......b.......
241 ...2+..?..b...
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Michael Speck
248
249 Bricks:
250 ....#kkkk#....
251 .gi.#kkkk#.ig.
252 .gi.#kkkk#.ig.
253 .gi.#kkkk#.ig.
254 .gi.#jjjj#.ig.
255 .gi.#vvvv#.ig.
256 .g..........g.
257 ..............
258 hhhhhhhhhhhhhh
259 eeeeeeeeeeeeee
260 eeeeeeeeeeeeee
261 ....eeeeee....
262 jj#.ffffff.#jj
263 kk#.ffffff.#kk
264 kk#.dddddd.#kk
265 kk#.dddddd.#kk
266 ###........###
267 ..............
268 Bonus:
269 .......l......
270 .....>........
271 ........?...-.
272 .-....-.......
273 .....j........
274 ..d....f...<..
275 ..............
276 ..............
277 +..<...>...s..
278 ....-....+..+.
279 ..b...+....c..
280 .....w.~......
281 3...b...-....3
282 .3..........3.
283 3....+.......3
284 .3.....?.b..3.
285 ..............
286 ..............
287 Level:
288 Michael Speck
289 Chain Reaction
290 Bricks:
291 ..............
292 ......**......
293 .....*vv*.....
294 ....*veev*....
295 ...*veeeev*...
296 ..*veeeeeev*..
297 .*veeeeeeeev*.
298 *veeeeeeeeeev*
299 vjjjjjjjjjjjjv
300 vjjjjjjjjjjjjv
301 *.gggggggggg.*
302 v*.gggggggg.*v
303 .v*.gggggg.*v.
304 ..v*.gggg.*v..
305 ...v*.gg.*v...
306 ....v*..*v....
307 .....v**v.....
308 ......vv......
309 Bonus:
310 ..............
311 ..............
312 ..............
313 ..............
314 ......d.......
315 .........c....
316 ....+..<..b...
317 ..~..b..+.....
318 ....>..p.j....
319 .>.?..-...?.>.
320 ....w....s....
321 1..<...f.....1
322 .1...+..-...1.
323 ..1........1..
324 ...1...b..1...
325 ....1....1....
326 .....1..1.....
327 ......11......
328 Level:
329 Michael Speck
330 Hidden Obstacles
331 Bricks:
332 ..............
333 ..............
334 ..............
335 ...jjjjjjjj...
336 .!.jkkkkkkj.!.
337 ...jkkkkkkj...
338 ...jkggggkj...
339 .!.jkggggkj.!.
340 ...jkgiigkj...
341 ...jkgiigkj...
342 .!.jkgiigkj.!.
343 ...jkgiigkj...
344 ...jk#ii#kj...
345 .!.jk#ii#kj.!.
346 ...jk#ii#kj...
347 vvv###vv###vvv
348 ..............
349 ..............
350 Bonus:
351 ..............
352 ..............
353 ..............
354 2.2..c....d2.2
355 .?..-...-...?.
356 ...j......w...
357 2.2..+.....2.2
358 .?....f.+...?.
359 ...s..........
360 2.2.>...-<.2.2
361 .?...-....+.?.
362 ...+...b......
363 2.2.......>2.2
364 .?....<.....?.
365 ...b..........
366 .............b
367 ..............
368 ..............
369 Level:
370 Michael Speck
371 Stairway
372 Bricks:
373 ..............
374 .............g
375 ............ig
376 ...........dig
377 ..........fdig
378 .........efdig
379 ........hefdig
380 .......khefdig
381 ......jkhefdig
382 .....gjkhefdig
383 ....igjkhefdig
384 ...digjkhefdig
385 ...digjkhefdig
386 ...digjkhefdig
387 ...digjkhefdig
388 .!.###########
389 ..............
390 ..............
391 Bonus:
392 ..............
393 ..............
394 ..............
395 ............>.
396 ...........3.s
397 .........w....
398 ..........?.-.
399 ........3..b..
400 .........-.+.<
401 .......+..g.3.
402 .....?..b3...-
403 ...3..>...+-..
404 ....b..-.d....
405 ....1.f.<..2.j
406 .....+...b..>.
407 ..............
408 ..............
409 ..............
410 Level:
411 Michael Speck
412 Tricky
413 Bricks:
414 ..............
415 .####....####.
416 .#dd#....#ff#.
417 .#dd#....#ff#.
418 .#dd#....#ff#.
419 .#dd#....#ff#.
420 .#dd#....#ff#.
421 .####....####.
422 ..............
423 .####....####.
424 .#ii#....#gg#.
425 .#ii#....#gg#.
426 .#ii#!..!#gg#.
427 .#ii#....#gg#.
428 .#ii#....#gg#.
429 .####....####.
430 ..............
431 ..............
432 Bonus:
433 ..............
434 ..............
435 ..........l...
436 ..3........+..
437 ..........3...
438 ...3..........
439 ..?........3..
440 ..............
441 ..............
442 ..............
443 ..?.......b...
444 ...3.m..m..-..
445 ..+.......3...
446 .....m..m.....
447 ..3........3..
448 ..............
449 ..............
450 ..............
451 Level:
452 Michael Speck
453 Against All Odds
454 Bricks:
455 ..............
456 ..............
457 .jkgi#........
458 .jkgi#........
459 .jkgi#........
460 .jkgi#...!*!..
461 .kkgi#...*!*..
462 .gggi#...!*!..
463 .iiii#........
464 .#####........
465 ........#####.
466 ........#dddd.
467 ..!*!...#deee.
468 ..*!*...#deff.
469 ..!*!...#defj.
470 ........#defj.
471 ........#defj.
472 ........#defj.
473 Bonus:
474 ..............
475 ..............
476 .d..>.........
477 ..............
478 .-.d....~.b.c.
479 ..............
480 ..c...........
481 ..............
482 .>..f...~...c.
483 ..............
484 ..............
485 .c...~...f..>.
486 ..............
487 ...........c..
488 ..............
489 .c.b.~....d.-.
490 ..............
491 .........>..d.
492 Level:
493 Michael Speck
494 Modern Art
495 Bricks:
496 ..............
497 ggggggggggiiid
498 ggggggjjggggid
499 kkkkkgjjggg#id
500 keeeeg#jjjg#id
501 keddeg#jjjg#id
502 ke#dee#jjjg#id
503 ke#dee#jjfg#id
504 ke#dee#jffg#id
505 ke#deeefff##id
506 ke#dddffffiiid
507 kk##ddf#hhhiid
508 kjjdddf#hhhiid
509 jjjdddf#hhhhhd
510 jjjjdd##hhhhhd
511 ##........###.
512 ..............
513 ..............
514 Bonus:
515 ..............
516 ...........j..
517 ..<.2...-<....
518 ....-.3.....3.
519 .c........d...
520 ...+.f.......b
521 ....b...~+....
522 2...........2.
523 .>..w...s3....
524 -...4..?....-.
525 ......p..+....
526 .3..........>.
527 .....-..2..+..
528 .+..?.....b..4
529 ...b..........
530 ..............
531 ..............
532 ..............
533 Level:
534 Michael Speck
535 Barriere
536 Bricks:
537 ..............
538 ..............
539 ..............
540 ..............
541 .!.!.!..!.!.!.
542 ..............
543 ..............
544 ...!.!!!!.!...
545 ..............
546 ..............
547 .!.!.!..!.!.!.
548 ..............
549 ..............
550 ..............
551 ..#...#...#...
552 .v.v.v.v.v.v.v
553 #...#...#...#.
554 ..............
555 Bonus:
556 ..............
557 ..............
558 ..............
559 ...4.j.4...s..
560 .........c....
561 ....-.>....+4.
562 ..b..d....b...
563 ......4.~.....
564 ..-.4......w..
565 .........>....
566 .......b..4...
567 ..>.+.f..+....
568 ..............
569 ..............
570 ..............
571 .?.?.?.?.?.?.?
572 ..............
573 ..............
574 Level:
575 Michael Speck
576 One Chance Only
577 Bricks:
578 ..............
579 ..............
580 .#####..#####.
581 .***j#..#j***.
582 .###j#..#j###.
583 .#j#*#..#*#j#.
584 .#*#*#..#*#*#.
585 .#*#*#..#*#*#.
586 .#***#..#***#.
587 .#####..#####.
588 .#***#..#***#.
589 .#####..#####.
590 .#***#..#***#.
591 .#####..#####.
592 .#***#..#***#.
593 .#####..#####.
594 .#***#..#***#.
595 .#####..#####.
596 Bonus:
597 ..............
598 ..............
599 ..............
600 .5555....m....
601 ....5.........
602 ..............
603 ..............
604 ..............
605 ..............
606 ..............
607 ..............
608 ..............
609 ..............
610 ..............
611 ..............
612 ..............
613 ..............
614 ..............
+0
-410
src/levels/AddOn-2 less more
0 Level:
1 Michael Speck
2 Late At Night
3 Bricks:
4 ..............
5 ..............
6 bbbbbbbbbbbbbb
7 aaaaaaaaaaaaaa
8 affaaaaafafffa
9 aaafaaaffaaafa
10 aaafafaafaaafa
11 aafaaaaafaafaa
12 afaaafaafaafaa
13 afaaaaaafafaaa
14 afffaaaafafaaa
15 aaaaaaaaaaaaaa
16 bbbbbbbbbbbbbb
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ....>.........
26 ..?..!.2.*....
27 2.......w...b.
28 ....d3.....-..
29 .&.....p..?...
30 ...+..b..~....
31 3...?..s.3..2.
32 ..W..-..c.}3+.
33 ...2..f..-....
34 .b.....{.....?
35 ....+.......>.
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Michael Speck
43
44 Bricks:
45 ..............
46 ..............
47 ..............
48 ..............
49 ....E....E....
50 ....EzzzzE....
51 @cccEheehEccc@
52 @!.!EheehE!.!@
53 @.!.EehheE.!.@
54 @!.!EehheE!.!@
55 @.!.EheehE.!.@
56 @cccEheehEccc@
57 ....EzzzzE....
58 ....E....E....
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 ..............
68 ..............
69 ..............
70 ...}..?.......
71 ..2..f.2......
72 .>.c..m.d...?.
73 .......?...3..
74 ...3.2..{.-...
75 ..-...>.....+.
76 .......+......
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 Michael Speck
84 Fate
85 Bricks:
86 ..............
87 .....f........
88 .....f....g...
89 ...i.@....g...
90 ...i......@...
91 ...@...j....e.
92 k......j....e.
93 k...j..@....@.
94 @...j....i....
95 ..d.@....i....
96 ..d......@.g..
97 ..@..f.....g.k
98 .e...f.....@.k
99 .e...@..d....@
100 .@......d.....
101 ........@.....
102 ..............
103 ..............
104 Bonus:
105 ..............
106 .....l........
107 .....+........
108 ..........3...
109 ...3..........
110 ..............
111 .......?....?.
112 >.............
113 ....f.........
114 .........f....
115 ..?...........
116 ...........3..
117 .....{.......+
118 .b............
119 ........>.....
120 ..............
121 ..............
122 ..............
123 Level:
124 Michael Speck
125 Chain Reaction
126 Bricks:
127 ..............
128 ..............
129 ......!.!.!...
130 ....!.**.*..#.
131 ..@..*..#.*.!.
132 !.!**.!..!*.*.
133 .**..*.!...*..
134 ...!.!*.E..*..
135 .#.....*..*...
136 ..*!..*.**..@.
137 .*..@*.!.!*!..
138 *!.**!.....**.
139 .**!....@....*
140 .....E........
141 .E.........E..
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ........2.....
148 ...?...?......
149 ...........3..
150 ..............
151 .3.>..........
152 .....m........
153 ...........>..
154 ....3?.+......
155 .........d....
156 .-...~..3.W...
157 ...d..3..?..g.
158 2.............
159 ..2.2.........
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Michael Speck
166 Enter
167 Bricks:
168 ....f.gg.f....
169 ...f.g..g.f...
170 ..f.g.ee.g.f..
171 .f.g.e..e.g.f.
172 f.g.e.dd.e.g.f
173 .g.e.d..d.e.g.
174 g.e.dxxxxd.e.g
175 .e.d.xhhx.d.e.
176 e.d.fxhhxf.d.e
177 Ed.f.xhhx.f.dE
178 .Ef.hhhhhh.fE.
179 ..Eh......hE..
180 ...E......E...
181 ....EvvvvE....
182 ..............
183 ..............
184 ..............
185 ..............
186 Bonus:
187 ..............
188 ...~..........
189 .......-.&....
190 .w.4.2....?...
191 ..d....3......
192 ........{.2...
193 ....?........m
194 .!.j..+.b.+.4.
195 ..2.}3.....-..
196 .......c......
197 ......b.3.....
198 ..............
199 ..............
200 .....W+>?.....
201 ..............
202 ..............
203 ..............
204 ..............
205 Level:
206 Michael Speck
207 Diggin'
208 Bricks:
209 ..............
210 ...........dee
211 .....ff...dgde
212 .....ff...dgde
213 ......f.@@@gde
214 ......ffff@gde
215 ......ffgg@gde
216 .....#fg#dgdee
217 ..eee#fg#edee.
218 .eede#gf#eee..
219 eedgd#gf#.....
220 edg@ggff......
221 edg@ffff......
222 edg@@@.f......
223 edgd...ff.....
224 edgd...ff.....
225 eed...........
226 ..............
227 Bonus:
228 ..............
229 ..............
230 ......w.....3.
231 .....d.....?..
232 ............W.
233 ......2..4....
234 .......+.....2
235 ...........+..
236 ..?...!.....>.
237 ...}......-...
238 .......3......
239 .-..p.........
240 ......?.......
241 .2............
242 3.+.....>.....
243 .......b......
244 ..............
245 ..............
246 Level:
247 Michael Speck
248 Knock Knock
249 Bricks:
250 ..............
251 .*............
252 ..............
253 EEEEEEE.ffffff
254 ......#.fddddf
255 ......#.eeeeee
256 f....f#.eeeeee
257 fggggf#.fdzzdf
258 fddddf#.fdzzdf
259 fdzzdf.#fddddf
260 fdzzdf.#fggggf
261 eeeeee.#f....f
262 eeeeee.#......
263 fddddf.#......
264 ffffff.EEEEEEE
265 ..............
266 ............*.
267 ..............
268 Bonus:
269 ..............
270 .5............
271 ..............
272 .........c....
273 ...........{..
274 ........3.?.l.
275 ........>....2
276 .!.W.....*.m..
277 .4...b......+.
278 w...-...2-....
279 ..m.........b.
280 .?..&.........
281 ..}..3........
282 3..+..........
283 .....>........
284 ..............
285 ............5.
286 ..............
287 Level:
288 Michael Speck
289 Insane In The Brain
290 Bricks:
291 ..............
292 ..............
293 ..............
294 ....@@@@@@....
295 ....@kkkk@....
296 ...g@kkkk@g...
297 ..@@@jjjj@@@..
298 ..@kjeeeejk@..
299 ..@kjeddejk@..
300 ..@kjeddejk@..
301 ..@kjeeeejk@..
302 ..@@@jjjj@@@..
303 ...g@....@g...
304 ....@zzzz@....
305 ....@zzzz@....
306 ..............
307 ..............
308 ..............
309 Bonus:
310 ..............
311 ..............
312 ..............
313 ..............
314 ......s.......
315 ...2...?..2...
316 .....&........
317 ........d.....
318 ......~.......
319 ....+..-..>...
320 ....>.}.......
321 .....b..>.....
322 ...2......2...
323 ......1.1.....
324 .....+.W......
325 ..............
326 ..............
327 ..............
328 Level:
329 Michael Speck
330 Magnet
331 Bricks:
332 ....kkkkkk....
333 ...kkkkkkkk...
334 ...kkkkkkkk...
335 ..kkk....kkk..
336 ..kk......kk..
337 ..kk......kk..
338 ..kk......kk..
339 ..gg......dd..
340 ..gg......dd..
341 ..gg......dd..
342 ..gg......dd..
343 ..gg......dd..
344 ..gg.....@dd#.
345 .#gg......dd.#
346 .@gg#...#.ddE.
347 ..gg@....Edd@.
348 .#gg.#....dd..
349 .Egg......dd#.
350 Bonus:
351 ....d..?......
352 ...>..~..>....
353 .....{.b{.....
354 ....!....W?...
355 ...-.......w..
356 ..W.......>...
357 ...>.......c..
358 ..............
359 ..?.......{...
360 ...{.......W..
361 ..&........-..
362 ...b......?...
363 ..+...........
364 ...&......b...
365 ...........+..
366 ..>...........
367 ..........{...
368 ...{.......>..
369 Level:
370 Michael Speck
371 Be Smart!
372 Bricks:
373 hh.zzzzzzzzzzz
374 hh.zzxzxzxzxzz
375 hh.zzxzxzxzxzz
376 hh.zzxzxzxzxzz
377 ee.zzxxxzxzxzz
378 ee.zzxzxzxzxzz
379 ee.zzxzxzxzzzz
380 dd.zzxzxzxzxzz
381 dd.zzzzzzzzzzz
382 ..............
383 ###zzzzzzzzzzz
384 jj#zzzzzzzzzzz
385 kk#zzzzzzzzzzz
386 jj#zzzzzzzzzzz
387 vv#zzzzzzzzzzz
388 ..............
389 ..............
390 ..............
391 Bonus:
392 ..............
393 .l.....?..b...
394 5..>........&.
395 .....&...3....
396 .5....c.......
397 ........~.&...
398 ....&.......}.
399 5......p.?....
400 .....3..&..W.!
401 ..............
402 ....{.........
403 **.......>.4..
404 ......&.....&.
405 ....b...{.+...
406 .....+........
407 ..............
408 ..............
409 ..............
+0
-7
src/levels/Makefile.am less more
0 EXTRA_DIST = Original AddOn-1 AddOn-2
1
2 install-data-local:
3 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
4 $(INSTALL_DATA) Original $(DESTDIR)$(inst_dir)/levels/Original
5 $(INSTALL_DATA) AddOn-1 $(DESTDIR)$(inst_dir)/levels/AddOn-1
6 $(INSTALL_DATA) AddOn-2 $(DESTDIR)$(inst_dir)/levels/AddOn-2
+0
-185
src/levels/Makefile.in less more
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 CC = @CC@
60 MAKEINFO = @MAKEINFO@
61 PACKAGE = @PACKAGE@
62 RANLIB = @RANLIB@
63 SDL_CFLAGS = @SDL_CFLAGS@
64 SDL_CONFIG = @SDL_CONFIG@
65 SDL_LIBS = @SDL_LIBS@
66 VERSION = @VERSION@
67 doc_dir = @doc_dir@
68 hi_dir = @hi_dir@
69 hi_inst_flag = @hi_inst_flag@
70 inst_dir = @inst_dir@
71 inst_flag = @inst_flag@
72 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
74 warp_flag = @warp_flag@
75
76 EXTRA_DIST = Original AddOn-1 AddOn-2
77 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
78 CONFIG_HEADER = ../../config.h
79 CONFIG_CLEAN_FILES =
80 DIST_COMMON = Makefile.am Makefile.in
81
82
83 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
84
85 TAR = gtar
86 GZIP_ENV = --best
87 all: all-redirect
88 .SUFFIXES:
89 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
90 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/levels/Makefile
91
92 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
93 cd $(top_builddir) \
94 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
95
96 tags: TAGS
97 TAGS:
98
99
100 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
101
102 subdir = src/levels
103
104 distdir: $(DISTFILES)
105 @for file in $(DISTFILES); do \
106 d=$(srcdir); \
107 if test -d $$d/$$file; then \
108 cp -pr $$/$$file $(distdir)/$$file; \
109 else \
110 test -f $(distdir)/$$file \
111 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
112 || cp -p $$d/$$file $(distdir)/$$file || :; \
113 fi; \
114 done
115 info-am:
116 info: info-am
117 dvi-am:
118 dvi: dvi-am
119 check-am: all-am
120 check: check-am
121 installcheck-am:
122 installcheck: installcheck-am
123 install-exec-am:
124 install-exec: install-exec-am
125
126 install-data-am: install-data-local
127 install-data: install-data-am
128
129 install-am: all-am
130 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
131 install: install-am
132 uninstall-am:
133 uninstall: uninstall-am
134 all-am: Makefile
135 all-redirect: all-am
136 install-strip:
137 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
138 installdirs:
139
140
141 mostlyclean-generic:
142
143 clean-generic:
144
145 distclean-generic:
146 -rm -f Makefile $(CONFIG_CLEAN_FILES)
147 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
148
149 maintainer-clean-generic:
150 mostlyclean-am: mostlyclean-generic
151
152 mostlyclean: mostlyclean-am
153
154 clean-am: clean-generic mostlyclean-am
155
156 clean: clean-am
157
158 distclean-am: distclean-generic clean-am
159
160 distclean: distclean-am
161
162 maintainer-clean-am: maintainer-clean-generic distclean-am
163 @echo "This command is intended for maintainers to use;"
164 @echo "it deletes files that may require special tools to rebuild."
165
166 maintainer-clean: maintainer-clean-am
167
168 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
169 installcheck-am installcheck install-exec-am install-exec \
170 install-data-local install-data-am install-data install-am install \
171 uninstall-am uninstall all-redirect all-am all installdirs \
172 mostlyclean-generic distclean-generic clean-generic \
173 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
174
175
176 install-data-local:
177 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/levels
178 $(INSTALL_DATA) Original $(DESTDIR)$(inst_dir)/levels/Original
179 $(INSTALL_DATA) AddOn-1 $(DESTDIR)$(inst_dir)/levels/AddOn-1
180 $(INSTALL_DATA) AddOn-2 $(DESTDIR)$(inst_dir)/levels/AddOn-2
181
182 # Tell versions [3.59,3.63) of GNU make to not export all variables.
183 # Otherwise a system limit (for SysV at least) may be exceeded.
184 .NOEXPORT:
+0
-1025
src/levels/Original less more
0 Level:
1 Michael Speck
2 Classic
3 Bricks:
4 ..............
5 ..............
6 .gggggggggggg.
7 .ffffffffffff.
8 .ffffffffffff.
9 .dddddddddddd.
10 .eeeeeeeeeeee.
11 .eeeeeeeeeeee.
12 .dddddddddddd.
13 .ffffffffffff.
14 .ffffffffffff.
15 .gggggggggggg.
16 ..............
17 ..............
18 ..............
19 ..............
20 ..............
21 ..............
22 Bonus:
23 ..............
24 ..............
25 ...?...m..0.b.
26 .b...+.....j..
27 ..-.0.s.1-....
28 .>..........<.
29 .....-....+...
30 .<+....-...0..
31 ....1....>....
32 ..0...0.......
33 .w...f..b.?.>.
34 ...+..+..-....
35 ..............
36 ..............
37 ..............
38 ..............
39 ..............
40 ..............
41 Level:
42 Michael Speck
43 Open Envelope
44 Bricks:
45 ..............
46 ..............
47 .c..........c.
48 .ci........ic.
49 .cig......gic.
50 .cigd....dgic.
51 .cigde..edgic.
52 .cigdeffedgic.
53 .cigdeeeedgic.
54 .cigddddddgic.
55 .ciggggggggic.
56 .ciiiiiiiiiic.
57 .cccccccccccc.
58 ..............
59 ..............
60 ..............
61 ..............
62 ..............
63 Bonus:
64 ..............
65 ..............
66 ..............
67 .1.........>..
68 ...-..........
69 .-.1......+.b.
70 ..?..b..s.....
71 ...p.......0-.
72 ....<..?.b....
73 ..+..+f....-..
74 .>.0..........
75 ....w..-0+.j..
76 ....+.1.....<.
77 ..............
78 ..............
79 ..............
80 ..............
81 ..............
82 Level:
83 Michael Speck
84 Pyramid
85 Bricks:
86 ..............
87 ......hh......
88 .....chhc.....
89 .....chhc.....
90 ......cc......
91 ......cc......
92 .....iiii.....
93 .....iiii.....
94 ....gggggg....
95 ....gggggg....
96 ...eeeeeeee...
97 ...eeeeeeee...
98 ..ffffffffff..
99 ..ffffffffff..
100 .dddddddddddd.
101 .dddddddddddd.
102 ..............
103 ..............
104 Bonus:
105 ..............
106 ......-.......
107 .......b0.....
108 ..............
109 .......-......
110 ......m.......
111 .....s.b......
112 ..............
113 ....<.l.-.....
114 ..............
115 ....?1+.j.>...
116 ..............
117 ..0+.-.w.?....
118 ...1.......+..
119 ...>....f<-.0.
120 .+..b.+...1...
121 ..............
122 ..............
123 Level:
124 Michael Speck
125 U.F.O.
126 Bricks:
127 ..............
128 ..............
129 ......cc......
130 .....caac.....
131 ....caeeac....
132 ...caeeeeac...
133 ..caeeeeeeac..
134 .cggggggggggc.
135 .cggggggggggc.
136 ..caeeeeeeac..
137 ...caeeeeac...
138 ....caeeac....
139 .....caac.....
140 ......cc......
141 ..............
142 ..............
143 ..............
144 ..............
145 Bonus:
146 ..............
147 ..............
148 ......+.......
149 .......-......
150 ....1....0....
151 ...b.>..-.....
152 ......+...<...
153 .+0.-..s.w..b.
154 ..<..j0.......
155 ...b....+.>0..
156 ...1..?...1...
157 ....-....?....
158 ......p.......
159 .......f......
160 ..............
161 ..............
162 ..............
163 ..............
164 Level:
165 Michael Speck
166 Flowers
167 Bricks:
168 ......hhh.....
169 ......hhh.....
170 .d.d.hhchh....
171 dddddhhchhg.g.
172 ddddd.hhhggggg
173 .dcd..hhhggggg
174 .dcd...f..gcg.
175 ddddd..f..gcg.
176 ddfdd..f.ggggg
177 ..f...ff.ggfgg
178 ..f...f....f..
179 ..f...f....f..
180 ..ff..f....f..
181 ...f......f...
182 ...f.....ff...
183 ...f.....f....
184 ...f.....f....
185 ..............
186 Bonus:
187 ..............
188 ..............
189 ..............
190 .w....s1m...b.
191 ...-........1.
192 ......b+..-...
193 .>2...........
194 ...?.......j..
195 +......-.f..-.
196 ..-...?.......
197 ...........>..
198 ......+.......
199 ..b........+..
200 ..............
201 ...+..........
202 ..............
203 ..............
204 ..............
205 Level:
206 Michael Speck
207
208 Bricks:
209 ..............
210 ..............
211 cccccc###ccccc
212 aaaeeee#ffffaa
213 affaeee#fffaee
214 afffaee#ffaeee
215 affffae#faeeee
216 afffffa#aeeeee
217 affffae#faeeee
218 afffaee#ffaeee
219 affaeee#fffaee
220 aaaeeee#ffffaa
221 cccccc###ccccc
222 ..............
223 ..............
224 ..............
225 ..............
226 ..............
227 Bonus:
228 ..............
229 ..............
230 .2........+...
231 ....<.1.......
232 ..b........s.<
233 w....f..?.....
234 ...-.....-..+.
235 .->........j..
236 1...........1.
237 ..+...1....b.-
238 ...?....p.....
239 -....+........
240 ...b......>.+.
241 ..............
242 ..............
243 ..............
244 ..............
245 ..............
246 Level:
247 Michael Speck
248
249 Bricks:
250 ..............
251 ..............
252 ..............
253 ...#gggggg#...
254 ..d#eeeeee#d..
255 .dd#eeeeee#dd.
256 .dd#hhhhhh#dd.
257 .dd#ffffff#dd.
258 .dd#ffffff#dd.
259 .dd#ffffff#dd.
260 .dd#hhhhhh#dd.
261 .dd#eeeeee#dd.
262 ..d#eeeeee#d..
263 ...#gggggg#...
264 ..............
265 ..............
266 ..............
267 ..............
268 Bonus:
269 ..............
270 ..............
271 ..............
272 .........>....
273 .....2.-b..j..
274 .?+..+........
275 ....<..?....1.
276 .-....-.+..<..
277 ....w.........
278 ..1..l>1.b.+..
279 ..............
280 .s..b.f.2...-.
281 .....+........
282 .......m.-....
283 ..............
284 ..............
285 ..............
286 ..............
287 Level:
288 Michael Speck
289 Workstation
290 Bricks:
291 ..............
292 ..............
293 .......cc.....
294 .......ccbcc..
295 .......ccbcca.
296 .......ccbcca.
297 .......ccbcca.
298 .......ccbcca.
299 .......ccbcca.
300 .......ccbcca.
301 .......ccbcaa.
302 .......ccbba..
303 .......bb.b...
304 ....cb...cb...
305 ..ccba..cccb..
306 .baaaa.aaaaaa.
307 eeeeeeeeeeeeee
308 ..............
309 Bonus:
310 ..............
311 ..............
312 .......b......
313 .........<....
314 ...........+..
315 .......+1.....
316 .........-....
317 ...........b..
318 .......2.j....
319 ............>.
320 ........+.....
321 ...........1..
322 ........f.....
323 ....2.....-...
324 ..-1.p........
325 ....<....2....
326 .b.+..>+...-b.
327 ..............
328 Level:
329 Michael Speck
330 Fat Boy
331 Bricks:
332 ..............
333 .....hhhh.....
334 ....hhhhhh....
335 ...hhheehhh...
336 ..hhheeeehhh..
337 .hhheeeeeehhh.
338 .hheeeeeeeehh.
339 .hhheeeeeehhh.
340 .hhhheeeehhhh.
341 ..hhheeeehhh..
342 ....hheehh....
343 .....heeh.....
344 .....heeh.....
345 .....heeh.....
346 .....heeh.....
347 ....hheehh....
348 .hhhheeeehhhh.
349 ..............
350 Bonus:
351 ..............
352 ......-.......
353 ....?.........
354 .....j..2.<...
355 ......>.......
356 .b.2.+..<.....
357 ...........+..
358 ..+....m.-....
359 ....-.2.b..2..
360 ..........b...
361 .....w..-.....
362 .......f......
363 ........?.....
364 ......+.......
365 ..............
366 .......1......
367 ...-.>...+....
368 ..............
369 Level:
370 Michael Speck
371
372 Bricks:
373 hf..........fh
374 fhf........fhf
375 dfhf......fhfd
376 edfhf....fhfde
377 dedfhf..fhfded
378 .dedfhffhfded.
379 ..dedfhhfded..
380 ...dedffded...
381 ....dedded....
382 .....deed.....
383 ......dd......
384 c##........##c
385 ..#........#..
386 g.#........#.g
387 g.#........#.g
388 ..#........#..
389 c##........##c
390 ..............
391 Bonus:
392 ............-.
393 ..............
394 .+........b...
395 ..->.......<+.
396 .s..+...-.....
397 ...2..p...2...
398 ..<..-.f...b..
399 ...b.....+....
400 .......w3.....
401 ......2.>.....
402 ..............
403 ?............?
404 ..............
405 j.............
406 ..............
407 ..............
408 ..............
409 ..............
410 Level:
411 Michael Speck
412 Rainbow
413 Bricks:
414 ............dd
415 ......dddddddd
416 ...dddddddddee
417 .dddddeeeeeeee
418 ddddeeeeeeeehh
419 ddeeeehhhhhhhh
420 eeeehhhhhhhhff
421 eeehhhhfffffff
422 hhhhhfffffffgg
423 hhhhfffggggggg
424 fffffggggggg..
425 ffffggg.......
426 ggggg.........
427 gggg..........
428 ..............
429 ..............
430 ..............
431 ..............
432 Bonus:
433 ..............
434 ..............
435 ........-.....
436 ......?.......
437 ...........+..
438 b...+....j...-
439 ..-...-.......
440 ........m.?...
441 .?............
442 -..+.g...b.+..
443 ..............
444 .+............
445 ..............
446 ...b..........
447 ..............
448 ..............
449 ..............
450 ..............
451 Level:
452 Michael Speck
453 Bowls
454 Bricks:
455 ..............
456 .cffc....ceec.
457 .cffc....ceec.
458 .cffc....ceec.
459 .cffc....ceec.
460 .cffc....ceec.
461 .####....####.
462 ..............
463 ..............
464 .cddc....cggc.
465 .cddc....cggc.
466 .cddc....cggc.
467 .cddc....cggc.
468 .cddc....cggc.
469 .####....####.
470 ..............
471 ..............
472 ..............
473 Bonus:
474 ..............
475 ...3.......3..
476 ..?......b.?..
477 .>+.f....<+...
478 ...-......-l..
479 .........w....
480 ..............
481 ..............
482 ..............
483 .>3.s......3<.
484 ...2......?...
485 .b.......j.+b.
486 ..+-..........
487 ...?......-...
488 ..............
489 ..............
490 ..............
491 ..............
492 Level:
493 Michael Speck
494 Heart
495 Bricks:
496 ..............
497 ...dd....dd...
498 ..dddd..dddd..
499 ..dddd..dddd..
500 .dddddddddddd.
501 .ddccdddddddd.
502 .ddccdddddddd.
503 .ddcddddddddd.
504 .dddddddddddd.
505 ..dddddddddd..
506 ..dddddddddd..
507 ...dddddddd...
508 ...dddddddd...
509 ....dddddd....
510 ....dddddd....
511 .....dddd.....
512 .....dddd.....
513 ......dd......
514 Bonus:
515 ..............
516 ....3.........
517 ..........j...
518 ...+..........
519 .....>..-2.-..
520 .......f..<...
521 .-....+.....?.
522 ........?.....
523 .....b....+...
524 ..?.2..-......
525 .........>.2..
526 ...-b<2.......
527 ........+.b...
528 .....+.p......
529 ..............
530 ..............
531 .....w.3......
532 ..............
533 Level:
534 Michael Speck
535 Golden Eye
536 Bricks:
537 ..............
538 .....cccc.....
539 ....cccccc....
540 ...ccchhccc...
541 ..ccchhhhccc..
542 .ccchhhhhhccc.
543 .ccchhaahhccc.
544 .ccchhaahhccc.
545 .ccchhaahhccc.
546 .ccchhaahhccc.
547 .ccchhhhhhccc.
548 ..ccchhhhccc..
549 ...ccchhccc...
550 ....cccccc....
551 .....cccc.....
552 ..............
553 ..............
554 ..............
555 Bonus:
556 ..............
557 ..............
558 ......+.?>....
559 ...>?.........
560 .......f......
561 ...-..33......
562 .>..+3..3.-b..
563 .........j....
564 ..+........+..
565 .....3..3.?...
566 ...?-.33-.....
567 ..b...f.......
568 .....+....>...
569 ........m.....
570 .....>........
571 ..............
572 ..............
573 ..............
574 Level:
575 Michael Speck
576
577 Bricks:
578 ..............
579 ..............
580 ..............
581 ..............
582 dd..........dd
583 ed....ii....de
584 ed...iggi...de
585 ed...iggi...de
586 dd..igffgi..dd
587 ....igffgi....
588 ...igfeefgi...
589 ...igfeefgi...
590 ..##gfeefg##..
591 ....##ee##....
592 ......##......
593 ..............
594 ..............
595 ..............
596 Bonus:
597 ..............
598 ..............
599 ..............
600 ..............
601 .>...........3
602 -......f....<.
603 .3...3>.2....+
604 +......3....2.
605 .b...?........
606 ....2.j.?.....
607 ...s...-.+b...
608 ....<+........
609 .......-......
610 ......b.......
611 ..............
612 ..............
613 ..............
614 ..............
615 Level:
616 Michael Speck
617 Spider's Web
618 Bricks:
619 ...c....c....c
620 ...c....c...c.
621 ...c...c....c.
622 ....c..c..cc..
623 c...ccccc.c...
624 cc..c....c....
625 .ccc..dd.c..cc
626 ..cc.dddd.ccc.
627 ...c.dddd.c...
628 ...c.dddd.c...
629 ....c.dd..c...
630 ..ccc....c.cc.
631 .cc..cccc...cc
632 cc...c.c.c...c
633 c...c..c.c....
634 ...c..c..cc...
635 ...c..c...c...
636 ..c...c....c..
637 Bonus:
638 ..............
639 ...?..........
640 .......3....-.
641 ...........<..
642 ......>.j.+...
643 ....+.........
644 .-b...l.......
645 .......f..p.?.
646 .....3........
647 ...w...3..3...
648 ..............
649 ..2+.....<....
650 .>.....b....-.
651 .....-........
652 ..............
653 ...b..........
654 ......2...+...
655 ..............
656 Level:
657 Michael Speck
658
659 Bricks:
660 ..............
661 d.............
662 de............
663 def...........
664 defg..........
665 defgi.........
666 defgi........d
667 defgi.......ed
668 defgi......fed
669 defgi.....gfed
670 #####....igfed
671 ....c....igfed
672 ....c....igfed
673 ....c....igfed
674 ....c....igfed
675 ....ccccc#####
676 ..............
677 ..............
678 Bonus:
679 ..............
680 ..............
681 ..............
682 +.............
683 .?>...........
684 ....3.........
685 -3+...........
686 ...b.........b
687 .<-........3..
688 j..4......<.-.
689 .........-.+..
690 ...........mws
691 ....b.....>...
692 ...........-?.
693 .........+...3
694 ....+.f.......
695 ..............
696 ..............
697 Level:
698 Michael Speck
699 Home, sweet Home!
700 Bricks:
701 ....#.........
702 ....#.dd......
703 ....#dddd.....
704 ....dddddd....
705 ...dddddddd...
706 ..dddddddddd..
707 .dddddddddddd.
708 .dccccccccccd.
709 ..ccggccggcc..
710 ..ccggccggcc..
711 ..ccggccggcc..
712 ..cccccccccc..
713 ..cccccccccc..
714 ..cccceecccc..
715 ..cccceecccc..
716 ffcccceeccccff
717 ffcccceeccccff
718 ..............
719 Bonus:
720 ..............
721 ..............
722 ......?.......
723 .......3......
724 ....<....+....
725 .....-.f......
726 ..b...4.......
727 ...+...-......
728 .....p...w....
729 .......j...<..
730 ...>..........
731 .....->.+..?..
732 ...?......3...
733 ..3.-...-.....
734 ...4..b...+...
735 .s...f........
736 ..+......b....
737 ..............
738 Level:
739 Michael Speck
740
741 Bricks:
742 ......ii......
743 .....iiii.....
744 ....ii..ii....
745 ...ddi..igg...
746 ..ddd....ggg..
747 .dddf....fggg.
748 ddd.ff..ff.ggg
749 dd...ffff...gg
750 dd....ff....gg
751 dd....ff....gg
752 dd....ff....gg
753 dd....ff....gg
754 dd....ff....gg
755 dd....ff...ggg
756 ddd...ff...ggg
757 ddd...ff...ggg
758 ###...ff...###
759 ......##......
760 Bonus:
761 .......-......
762 ..............
763 ..............
764 ...w..........
765 ....>.....+...
766 ..+...........
767 .-.......j....
768 .....f<......?
769 .......b....b.
770 .?............
771 -.....-.......
772 .............-
773 <...........>.
774 .+.....+......
775 ...........+..
776 ..b...?.......
777 ..............
778 ..............
779 Level:
780 Michael Speck
781 LePrechaun's Treasure
782 Bricks:
783 .....fff......
784 ....fffff.....
785 ....fffff.....
786 ....fffff.....
787 ....fffff.....
788 ....fffff.....
789 .fff.fff.fff..
790 fffffffffffff.
791 fffffffffffff.
792 fffffffffffff.
793 fffffffffffff.
794 fffffffffffff.
795 .fff.fffffff..
796 ....ffffff....
797 ....fffff.f...
798 ....fffff..f..
799 ....fffff..ff.
800 .....fff.....f
801 Bonus:
802 ..............
803 ..............
804 ..............
805 ..............
806 ..............
807 ..............
808 ..............
809 ..............
810 ..............
811 ......5.......
812 ..............
813 ..............
814 ..g.......g...
815 ..............
816 ..............
817 ..............
818 ......m.......
819 ......g.......
820 Level:
821 Michael Speck
822
823 Bricks:
824 .....#dd#.....
825 .hh..#dd#..hh.
826 .hh..#dd#..hh.
827 .....fddf.....
828 ###.efddfe.###
829 igg.efddfe.ggi
830 igg.efddfe.ggi
831 igg.efddfe.ggi
832 igg.efddfe.ggi
833 igg.efddfe.ggi
834 igg.efddfe.ggi
835 igg.effffe.ggi
836 igg.eeeeee.ggi
837 igg........ggi
838 ###eeeeeeee###
839 ..............
840 ..............
841 ..............
842 Bonus:
843 ......-.......
844 .5..........5.
845 ..............
846 .......>-.....
847 .....s........
848 ........j.....
849 ..<...+....b..
850 .-..>...2....>
851 ?....w......+.
852 .......<-..?..
853 .+..?.p.......
854 .....2.l....-.
855 ..b.+....b....
856 ...........+..
857 ....f....f....
858 ..............
859 ..............
860 ..............
861 Level:
862 Michael Speck
863 Butterfly
864 Bricks:
865 .....b..b.....
866 .....b..b.....
867 .hh...bb...hh.
868 .hhhh.bb.hhhh.
869 .hhhhh##hhhhh.
870 .hhddh##hddhh.
871 .hdggd##dggdh.
872 ..dggd##dggd..
873 ..hddh##hddh..
874 ..hhhh##hhhh..
875 .hhddh##hddhh.
876 .hdggd##dggdh.
877 .hdggd##dggdh.
878 .hhddh##hddhh.
879 .hhhhh##hhhhh.
880 .hhhh.##.hhhh.
881 .hh........hh.
882 ..............
883 Bonus:
884 ..............
885 .....w........
886 .......f......
887 ..b.3....3..?.
888 ..........-...
889 .?..-....j....
890 ..3.....<.....
891 ...+......+...
892 ....?.........
893 ...4.3..-..3..
894 .>..<....4..>.
895 .........m....
896 ...-....s.+...
897 ..............
898 ..+.b.....b.+.
899 .3............
900 ..............
901 ..............
902 Level:
903 Michael Speck
904 Twins
905 Bricks:
906 ......##......
907 ......##......
908 hhhhhh##hhhhhh
909 hhhhhh##hhhhhh
910 iiiiii##iiiiii
911 iiiiii##iiiiii
912 gggggg##gggggg
913 gggggg##gggggg
914 ffffff##ffffff
915 ffffff##ffffff
916 eeeeee##eeeeee
917 eeeeee##eeeeee
918 dddddd##dddddd
919 dddddd##dddddd
920 cccccc##cccccc
921 ..............
922 ..............
923 ..............
924 Bonus:
925 ..............
926 ..............
927 ..............
928 .........4.>j.
929 .4..b........b
930 ..<.......-...
931 ?.-.....4.....
932 .w..+.......?.
933 ...>.....-.>..
934 -4..?....f....
935 ........b..4+.
936 ..+..f...?.<..
937 ...4......+...
938 +...........-.
939 ...b..........
940 ..............
941 ..............
942 ..............
943 Level:
944 Michael Speck
945 Linux Rocks!
946 Bricks:
947 ....ee........
948 d.....ee......
949 d.e.....ee....
950 d.ef......ee..
951 d.eff.fg....ee
952 d.eff.fg.gh...
953 ddef.ffg.gh.h.
954 ..ef.ffg.gh.h.
955 ...f..fg.gh.h.
956 ee....fg.g.h..
957 ..ee....g.h.h.
958 ....ee....h.h.
959 ......ee..h.hd
960 ........ee...d
961 cccaaacca.accd
962 c.ca.ac.aa.c.d
963 cc.a.ac.aa..c.
964 c.caaacca.accd
965 Bonus:
966 ..............
967 .......4......
968 ..............
969 >.4.......j...
970 ....<.........
971 ...-..>-......
972 +....w....+.?.
973 .......f.4....
974 ...b..+.......
975 .......4...<..
976 ........b...4.
977 .....f....b...
978 .............b
979 ..............
980 4-.?.......-..
981 .........?....
982 ......4.+...>.
983 ....+.........
984 Level:
985 Michael Speck
986 Narrow Streets
987 Bricks:
988 .i.f.e..e.f.i.
989 .i.f.e..e.f.i.
990 di.f.e..e.f.id
991 .idf.e..e.fdi.
992 .i.fde..edf.i.
993 .i.f.edde.f.i.
994 .i.f.e..e.f.i.
995 hi.f.e..e.f.ih
996 .ihf.e..e.fhi.
997 .i.fhe..ehf.i.
998 .i.f.ehhe.f.i.
999 .i.f.e..e.f.i.
1000 ..............
1001 a#.#.#..#.#.#a
1002 .#b#.#cc#.#b#.
1003 .#.#c#..#c#.#.
1004 .#.#.#..#.#.#.
1005 ..............
1006 Bonus:
1007 ..............
1008 ..............
1009 5............5
1010 ..5........5..
1011 ....5....5....
1012 ......55......
1013 ..............
1014 ?............?
1015 ..?........?..
1016 ....?....?....
1017 .......l......
1018 ...b.b..b.b...
1019 ..............
1020 ..............
1021 ..............
1022 ..............
1023 ..............
1024 ..............
+0
-284
src/levels.c less more
0 /***************************************************************************
1 levels.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "list.h"
20 #include "file.h"
21 #include "levels.h"
22
23 List *levels = 0; /* dynamic list containing the levels */
24 char **levelset_names = 0; /* name of all valid levelsets */
25 int levelset_count = 0;
26 char **levelset_home_names = 0; /* home directory sets */
27 int levelset_home_count;
28 extern Config config;
29
30 /*
31 ====================================================================
32 Locals
33 ====================================================================
34 */
35
36 /*
37 ====================================================================
38 Publics
39 ====================================================================
40 */
41
42 /*
43 ====================================================================
44 Free current levels if any and load all levels saved
45 in path/fname.
46 Return Value: True if successful.
47 ====================================================================
48 */
49 int levels_load( char *path, char *fname )
50 {
51 Level *level;
52 FILE *file;
53
54 /* delete old levels */
55 if ( levels ) levels_delete();
56 /* init list */
57 levels = list_create( LIST_AUTO_DELETE, level_delete );
58 list_reset( levels );
59 /* open file */
60 if ( ( file = file_open( path, fname, FILE_READ ) ) == 0 ) return 0;
61 /* read levels */
62 while( ( level = level_load( file ) ) != 0 ) list_add( levels, level );
63 fclose( file );
64 /* if no levels loaded at all delete levels */
65 if ( list_empty( levels ) ) {
66 levels_delete();
67 fprintf( stderr, "Ups! No valid levels found in '%s/%s'.\n", path, fname );
68 return 0;
69 }
70 printf( "Loaded %i levels from '%s/%s'.\n", levels->count, path, fname );
71 return 1;
72 }
73 /*
74 ====================================================================
75 Delete levels
76 ====================================================================
77 */
78 void levels_delete()
79 {
80 if ( !levels ) return;
81 list_delete( levels );
82 levels = 0;
83 }
84 /*
85 ====================================================================
86 Get a specific level from list.
87 Return Value: Level pointer containing information of this level or
88 NULL if there is no level
89 ====================================================================
90 */
91 Level* levels_get_first()
92 {
93 return list_first( levels );
94 }
95 Level* levels_get_next( Level *current_level )
96 {
97 return list_get( levels, list_check( levels, current_level ) + 1 );
98 }
99 /*
100 ====================================================================
101 Return id of this level in list.
102 ====================================================================
103 */
104 int levels_get_id( Level *level )
105 {
106 return list_check( levels, level );
107 }
108 /*
109 ====================================================================
110 Load level from current file position.
111 ====================================================================
112 */
113 int next_line( FILE *file, char **buffer )
114 {
115 /* lines with an # are comments: ignore them */
116 if ( !fgets( *buffer, 1023, file ) ) return 0;
117 if ( (*buffer)[strlen(*buffer) - 1] == 10 )
118 (*buffer)[strlen(*buffer) - 1] = 0;
119 /* if ( (*buffer)[0] == '#' )
120 next_line( file, buffer ); */
121 return 1;
122 }
123 Level* level_load( FILE *file )
124 {
125 Level *level = 0;
126 char *buffer = calloc( 1024, sizeof( char ) );
127 int i, j;
128
129 /* file handle ok? */
130 if ( !file ) { free( buffer ); return 0; }
131 /* get level mem */
132 level = calloc( 1, sizeof( Level ) );
133 /* read entries */
134 /* level: */
135 if ( !next_line( file, &buffer ) ) goto failure;
136 if ( !strequal( "Level:", buffer ) ) goto failure;
137 /* author */
138 if ( !next_line( file, &buffer ) ) goto failure;
139 level->author = strdup( buffer );
140 /* level name */
141 if ( !next_line( file, &buffer ) ) goto failure;
142 level->name = strdup( buffer );
143 /* bricks: */
144 if ( !next_line( file, &buffer ) ) goto failure;
145 if ( !strequal( "Bricks:", buffer ) ) goto failure;
146 /* load bricks */
147 for ( i = 0; i < EDIT_HEIGHT; i++ ) {
148 if ( !next_line( file, &buffer ) ) goto failure;
149 if ( strlen( buffer ) < EDIT_WIDTH ) goto failure;
150 for ( j = 0; j < EDIT_WIDTH; j++ )
151 level->bricks[j][i] = buffer[j];
152 }
153 /* extras: */
154 if ( !next_line( file, &buffer ) ) goto failure;
155 if ( !strequal( "Bonus:", buffer ) ) goto failure;
156 /* load extras */
157 for ( i = 0; i < EDIT_HEIGHT; i++ ) {
158 if ( !next_line( file, &buffer ) ) goto failure;
159 if ( strlen( buffer ) < EDIT_WIDTH ) goto failure;
160 for ( j = 0; j < EDIT_WIDTH; j++ )
161 level->extras[j][i] = buffer[j];
162 }
163 /* return level */
164 free( buffer );
165 return level;
166 failure:
167 level_delete( level );
168 free( buffer );
169 return 0;
170 }
171 /*
172 ====================================================================
173 Create an empty level
174 ====================================================================
175 */
176 Level* level_create_empty( char *author, char *name )
177 {
178 int i, j;
179 Level *level = calloc( 1, sizeof( Level ) );
180 level->author = strdup( author );
181 level->name = strdup( name );
182 /* empty arena */
183 for ( i = 0; i < EDIT_WIDTH; i++ )
184 for ( j = 0; j < EDIT_HEIGHT; j++ ) {
185 level->extras[i][j] = (char)EX_NONE;
186 level->bricks[i][j] = (char)-1;
187 }
188 return level;
189 }
190 /*
191 ====================================================================
192 Delete level pointer.
193 ====================================================================
194 */
195 void level_delete( void *level_ptr )
196 {
197 Level *level = (Level*)level_ptr;
198 if ( !level ) return;
199 if ( level->author ) free( level->author );
200 if ( level->name ) free( level->name );
201 free( level );
202 }
203
204 /*
205 ====================================================================
206 Get/delete list of all valid levelsets in data directory or
207 ~/.lbreakout/levels.
208 ====================================================================
209 */
210 void levelsets_load_names()
211 {
212 List *names;
213 Text *text = 0;
214 char level_dir[512];
215 char file_name[64];
216 int i;
217 /* clear previous list */
218 if ( levelset_names ) levelsets_delete_names();
219 /* create dynamic list */
220 names = list_create( LIST_NO_AUTO_DELETE, NO_CALLBACK );
221 /* parse home directory */
222 sprintf( level_dir, "%s/%s/lbreakout2-levels", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
223 text = get_file_list( level_dir, 0, level_dir );
224 for ( i = 0; i < text->count; i++ ) {
225 /* filter stuff */
226 if ( text->lines[i][0] == '*' ) continue;
227 /* add */
228 sprintf( file_name, "~%s", text->lines[i] );
229 list_add( names, strdup( file_name ) );
230 }
231 delete_text( text );
232 /* create static levelset_home_names */
233 levelset_home_count = names->count + 1;
234 levelset_home_names = calloc( levelset_home_count, sizeof( char* ) );
235 levelset_home_names[0] = strdup( "<CREATE SET>" );
236 for ( i = 1; i < levelset_home_count; i++ )
237 levelset_home_names[i] = strdup( list_get( names, i - 1 ) + 1 );
238 /* parse source directory */
239 sprintf( level_dir, "%s/levels", SRC_DIR );
240 text = get_file_list( level_dir, 0, level_dir );
241 for ( i = 0; i < text->count; i++ ) {
242 /* filter stuff */
243 if ( text->lines[i][0] == '*' ) continue;
244 if ( strequal( text->lines[i], "Makefile.am" ) ) continue;
245 if ( strequal( text->lines[i], "Makefile.in" ) ) continue;
246 if ( strequal( text->lines[i], "Makefile" ) ) continue;
247 /* add */
248 list_add( names, strdup( text->lines[i] ) );
249 }
250 delete_text( text );
251 /* create static list levelset_names */
252 levelset_count = names->count;
253 levelset_names = calloc( levelset_count, sizeof( char* ) );
254 for ( i = 0; i < levelset_count; i++ )
255 levelset_names[i] = list_get( names, i );
256 /* adjust config */
257 if ( config.levelset_count != levelset_count ) {
258 config.levelset_id = 0;
259 config.levelset_count = levelset_count;
260 }
261 if ( config.levelset_home_count != levelset_home_count ) {
262 config.levelset_home_id = 0;
263 config.levelset_home_count = levelset_home_count;
264 }
265 /* delete list */
266 list_delete( names );
267 }
268 void levelsets_delete_names()
269 {
270 int i;
271 if ( levelset_names ) {
272 for ( i = 0; i < levelset_count; i++ )
273 if ( levelset_names[i] ) free( levelset_names[i] );
274 free( levelset_names );
275 levelset_names = 0;
276 }
277 if ( levelset_home_names ) {
278 for ( i = 0; i < levelset_home_count; i++ )
279 if ( levelset_home_names[i] ) free( levelset_home_names[i] );
280 free( levelset_home_names );
281 levelset_home_names = 0;
282 }
283 }
+0
-98
src/levels.h less more
0 /***************************************************************************
1 levels.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Loading and deleting of levels is managed here.
20 The according list is found in levels.c and accessed by
21 levels_get_first/get_next/get_current
22 ====================================================================
23 */
24
25 #include "lbreakout.h"
26
27 /*
28 ====================================================================
29 Level resource structure.
30 ====================================================================
31 */
32 typedef struct Level {
33 char *author, *name;
34 /* extras and bricks are saved by their specific character and
35 interpreted by bricks_create later */
36 char bricks[EDIT_WIDTH][EDIT_HEIGHT];
37 char extras[EDIT_WIDTH][EDIT_HEIGHT];
38 } Level;
39
40 /*
41 ====================================================================
42 Free current levels if any and load all levels saved
43 in path/fname.
44 Return Value: True if successful.
45 ====================================================================
46 */
47 int levels_load( char *path, char *fname );
48 /*
49 ====================================================================
50 Delete levels
51 ====================================================================
52 */
53 void levels_delete();
54 /*
55 ====================================================================
56 Get a specific level from list. Either first one or the level that
57 follows the current level.
58 Return Value: Level pointer containing information of this level or
59 NULL if there is no level
60 ====================================================================
61 */
62 Level* levels_get_first();
63 Level* levels_get_next( Level *current_level );
64 /*
65 ====================================================================
66 Return id of this level in list.
67 ====================================================================
68 */
69 int levels_get_id( Level *level );
70 /*
71 ====================================================================
72 Load level from current file position.
73 ====================================================================
74 */
75 Level* level_load( FILE *file );
76 /*
77 ====================================================================
78 Create an empty level
79 ====================================================================
80 */
81 Level* level_create_empty( char *author, char *name );
82 /*
83 ====================================================================
84 Delete level pointer.
85 ====================================================================
86 */
87 void level_delete( void *level_ptr );
88
89 /*
90 ====================================================================
91 Get/delete list of all valid levelsets in data directory or
92 ~/.lbreakout/levels.
93 Sets a second list which contains home directory entries only.
94 ====================================================================
95 */
96 void levelsets_load_names();
97 void levelsets_delete_names();
+0
-320
src/list.c less more
0 /***************************************************************************
1 list.c - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <stdlib.h>
18
19 #include "list.h"
20
21 /*
22 ====================================================================
23 Create a new list
24 auto_delete: Free memory of data pointer when deleting entry
25 callback: Use this callback to free memory of data including
26 the data pointer itself.
27 Return Value: List pointer
28 ====================================================================
29 */
30 List *list_create( int auto_delete, void (*callback)(void*) )
31 {
32 List *list = calloc( 1, sizeof( List ) );
33 list->head.next = &list->tail;
34 list->head.prev = &list->head;
35 list->tail.next = &list->tail;
36 list->tail.prev = &list->head;
37 list->auto_delete = auto_delete;
38 list->callback = callback;
39 list->cur_entry = &list->head;
40 return list;
41 }
42 /*
43 ====================================================================
44 Delete list and entries.
45 ====================================================================
46 */
47 void list_delete( List *list )
48 {
49 list_clear( list );
50 free( list );
51 }
52 /*
53 ====================================================================
54 Delete all entries but keep the list. Reset current_entry to head
55 pointer.
56 ====================================================================
57 */
58 void list_clear( List *list )
59 {
60 while( !list_empty( list ) ) list_delete_pos( list, 0 );
61 }
62 /*
63 ====================================================================
64 Insert new item at position.
65 Return Value: True if successful else False.
66 ====================================================================
67 */
68 int list_insert( List *list, void *item, int pos )
69 {
70 int i;
71 List_Entry *cur = &list->head;
72 List_Entry *new_entry = 0;
73
74 /* check if insertion possible */
75 if ( pos < 0 || pos > list->count ) return 0;
76 if ( item == 0 ) return 0;
77 /* get to previous entry */
78 for (i = 0; i < pos; i++) cur = cur->next;
79 /* create and anchor new entry */
80 new_entry = calloc( 1, sizeof( List_Entry ) );
81 new_entry->item = item;
82 new_entry->next = cur->next;
83 new_entry->prev = cur;
84 cur->next->prev = new_entry;
85 cur->next = new_entry;
86 list->count++;
87 return 1;
88 }
89 /*
90 ====================================================================
91 Add new item at the end of the list.
92 ====================================================================
93 */
94 int list_add( List *list, void *item )
95 {
96 List_Entry *new_entry = 0;
97 /* check if insertion possible */
98 if ( item == 0 ) return 0;
99 /* create and anchor new entry */
100 new_entry = calloc( 1, sizeof( List_Entry ) );
101 new_entry->item = item;
102 new_entry->next = &list->tail;
103 new_entry->prev = list->tail.prev;
104 list->tail.prev->next = new_entry;
105 list->tail.prev = new_entry;
106 list->count++;
107 return 1;
108 }
109 /*
110 ====================================================================
111 Delete item at position. If this was the current entry update
112 current_entry to valid previous pointer.
113 Return Value: True if successful else False.
114 ====================================================================
115 */
116 int list_delete_pos( List *list, int pos )
117 {
118 int i;
119 List_Entry *cur = &list->head;
120
121 /* check if deletion possbile */
122 if ( list_empty( list ) ) return 0;
123 if ( pos < 0 || pos >= list->count ) return 0;
124 /* get to correct entry */
125 for ( i = 0; i <= pos; i++ ) cur = cur->next;
126 /* modify anchors */
127 cur->next->prev = cur->prev;
128 cur->prev->next = cur->next;
129 /* decrease counter */
130 list->count--;
131 /* check current_entry */
132 if ( list->cur_entry == cur )
133 list->cur_entry = list->cur_entry->prev;
134 /* free memory */
135 if ( list->auto_delete ) {
136 if ( list->callback )
137 (list->callback)( cur->item );
138 else
139 free( cur->item );
140 }
141 free( cur );
142 return 1;
143 }
144 /*
145 ====================================================================
146 Delete item if in list. If this was the current entry update
147 current_entry to valid previous pointer.
148 Return Value: True if successful else False.
149 ====================================================================
150 */
151 int list_delete_item( List *list, void *item )
152 {
153 return list_delete_pos( list, list_check( list, item ) );
154 }
155 /*
156 ====================================================================
157 Delete entry.
158 Return Value: True if successful else False.
159 ====================================================================
160 */
161 int list_delete_entry( List *list, List_Entry *entry )
162 {
163 /* delete possible? */
164 if ( entry == 0 ) return 0;
165 if ( list->count == 0 ) return 0;
166 if ( entry == &list->head || entry == &list->tail ) return 0;
167 /* adjust anchor and counter */
168 entry->prev->next = entry->next;
169 entry->next->prev = entry->prev;
170 list->count--;
171 /* check current_entry */
172 if ( list->cur_entry == entry )
173 list->cur_entry = list->cur_entry->prev;
174 /* free memory */
175 if ( list->auto_delete ) {
176 if ( list->callback )
177 (list->callback)( entry->item );
178 else
179 free( entry->item );
180 }
181 free( entry );
182 return 1;
183 }
184 /*
185 ====================================================================
186 Get item from position if in list.
187 Return Value: Item pointer if found else Null pointer.
188 ====================================================================
189 */
190 void* list_get( List *list, int pos )
191 {
192 int i;
193 List_Entry *cur = &list->head;
194
195 if ( pos < 0 || pos >= list->count ) return 0;
196 for ( i = 0; i <= pos; i++ ) cur = cur->next;
197 return cur->item;
198 }
199 /*
200 ====================================================================
201 Check if item's in list.
202 Return Value: Position of item else -1.
203 ====================================================================
204 */
205 int list_check( List *list, void *item )
206 {
207 int pos = -1;
208 List_Entry *cur = list->head.next;
209 while ( cur != &list->tail ) {
210 pos++;
211 if ( cur->item == item ) break;
212 cur = cur->next;
213 }
214 return pos;
215 }
216 /*
217 ====================================================================
218 Return first item stored in list and set current_entry to this
219 entry.
220 Return Value: Item pointer if found else Null pointer.
221 ====================================================================
222 */
223 void* list_first( List *list )
224 {
225 list->cur_entry = list->head.next;
226 return list->head.next->item;
227 }
228 /*
229 ====================================================================
230 Return last item stored in list and set current_entry to this
231 entry.
232 Return Value: Item pointer if found else Null pointer.
233 ====================================================================
234 */
235 void* list_last( List *list )
236 {
237 list->cur_entry = list->tail.prev;
238 return list->tail.prev->item;
239 }
240 /*
241 ====================================================================
242 Return item in current_entry.
243 Return Value: Item pointer if found else Null pointer.
244 ====================================================================
245 */
246 void* list_current( List *list )
247 {
248 return list->cur_entry->item;
249 }
250 /*
251 ====================================================================
252 Reset current_entry to head of list.
253 ====================================================================
254 */
255 void list_reset( List *list )
256 {
257 list->cur_entry = &list->head;
258 }
259 /*
260 ====================================================================
261 Get next item and update current_entry (reset if tail reached)
262 Return Value: Item pointer if found else Null (if tail of list).
263 ====================================================================
264 */
265 void* list_next( List *list )
266 {
267 list->cur_entry = list->cur_entry->next;
268 if ( list->cur_entry == &list->tail ) list_reset( list );
269 return list->cur_entry->item;
270 }
271 /*
272 ====================================================================
273 Get previous item and update current_entry.
274 Return Value: Item pointer if found else Null (if head of list).
275 ====================================================================
276 */
277 void* list_prev( List *list )
278 {
279 list->cur_entry = list->cur_entry->prev;
280 return list->cur_entry->item;
281 }
282 /*
283 ====================================================================
284 Delete the current entry if not tail or head. This is the entry
285 that contains the last returned item by list_next/prev().
286 Return Value: True if it was a valid deleteable entry.
287 ====================================================================
288 */
289 int list_delete_current( List *list )
290 {
291 if ( list->cur_entry == 0 || list->cur_entry == &list->head || list->cur_entry == &list->tail ) return 0;
292 list_delete_entry( list, list->cur_entry );
293 return 1;
294 }
295 /*
296 ====================================================================
297 Check if list is empty.
298 Return Value: True if list counter is 0 else False.
299 ====================================================================
300 */
301 int list_empty( List *list )
302 {
303 return list->count == 0;
304 }
305 /*
306 ====================================================================
307 Return entry containing the passed item.
308 Return Value: True if entry found else False.
309 ====================================================================
310 */
311 List_Entry *list_entry( List *list, void *item )
312 {
313 List_Entry *entry = list->head.next;
314 while ( entry != &list->tail ) {
315 if ( entry->item == item ) return entry;
316 entry = entry->next;
317 }
318 return 0;
319 }
+0
-188
src/list.h less more
0 /***************************************************************************
1 list.h - description
2 -------------------
3 begin : Sun Sep 2 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __LIST_H
18 #define __LIST_H
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /*
25 ====================================================================
26 Dynamic list handling data as void pointers.
27 ====================================================================
28 */
29 typedef struct _List_Entry {
30 struct _List_Entry *next;
31 struct _List_Entry *prev;
32 void *item;
33 } List_Entry;
34 typedef struct {
35 int auto_delete;
36 int count;
37 List_Entry head;
38 List_Entry tail;
39 void (*callback)(void*);
40 List_Entry *cur_entry;
41 } List;
42
43 /*
44 ====================================================================
45 Create a new list
46 auto_delete: Free memory of data pointer when deleting entry
47 callback: Use this callback to free memory of data including
48 the data pointer itself.
49 Return Value: List pointer
50 ====================================================================
51 */
52 enum { LIST_NO_AUTO_DELETE = 0, LIST_AUTO_DELETE };
53 enum { NO_CALLBACK = 0 };
54 List *list_create( int auto_delete, void (*callback)(void*) );
55 /*
56 ====================================================================
57 Delete list and entries.
58 ====================================================================
59 */
60 void list_delete( List *list );
61 /*
62 ====================================================================
63 Delete all entries but keep the list. Reset current_entry to head
64 pointer.
65 ====================================================================
66 */
67 void list_clear( List *list );
68 /*
69 ====================================================================
70 Insert new item at position.
71 Return Value: True if successful else False.
72 ====================================================================
73 */
74 int list_insert( List *list, void *item, int pos );
75 /*
76 ====================================================================
77 Add new item at the end of the list.
78 ====================================================================
79 */
80 int list_add( List *list, void *item );
81 /*
82 ====================================================================
83 Delete item at pos. If this was the current entry update
84 current_entry to valid previous pointer.
85 Return Value: True if successful else False.
86 ====================================================================
87 */
88 int list_delete_pos( List *list, int pos );
89 /*
90 ====================================================================
91 Delete item if in list. If this was the current entry update
92 current_entry to valid previous pointer.
93 Return Value: True if successful else False.
94 ====================================================================
95 */
96 int list_delete_item( List *list, void *item );
97 /*
98 ====================================================================
99 Delete entry.
100 ====================================================================
101 */
102 int list_delete_entry( List *list, List_Entry *entry );
103 /*
104 ====================================================================
105 Get item from position if in list.
106 Return Value: Item pointer if found else Null pointer.
107 ====================================================================
108 */
109 void* list_get( List *list, int pos );
110 /*
111 ====================================================================
112 Check if item's in list.
113 Return Value: Position of item else -1.
114 ====================================================================
115 */
116 int list_check( List *list, void *item );
117 /*
118 ====================================================================
119 Return first item stored in list and set current_entry to this
120 entry.
121 Return Value: Item pointer if found else Null pointer.
122 ====================================================================
123 */
124 void* list_first( List *list );
125 /*
126 ====================================================================
127 Return last item stored in list and set current_entry to this
128 entry.
129 Return Value: Item pointer if found else Null pointer.
130 ====================================================================
131 */
132 void* list_last( List *list );
133 /*
134 ====================================================================
135 Return item in current_entry.
136 Return Value: Item pointer if found else Null pointer.
137 ====================================================================
138 */
139 void* list_current( List *list );
140 /*
141 ====================================================================
142 Reset current_entry to head of list.
143 ====================================================================
144 */
145 void list_reset( List *list );
146 /*
147 ====================================================================
148 Get next item and update current_entry (reset if tail reached).
149 Return Value: Item pointer if found else Null (if tail of list).
150 ====================================================================
151 */
152 void* list_next( List *list );
153 /*
154 ====================================================================
155 Get previous item and update current_entry.
156 Return Value: Item pointer if found else Null (if head of list).
157 ====================================================================
158 */
159 void* list_prev( List *list );
160 /*
161 ====================================================================
162 Delete the current entry if not tail or head. This is the entry
163 that contains the last returned item by list_next/prev().
164 Return Value: True if it was a valid deleteable entry.
165 ====================================================================
166 */
167 int list_delete_current( List *list );
168 /*
169 ====================================================================
170 Check if list is empty.
171 Return Value: True if list counter is 0 else False.
172 ====================================================================
173 */
174 int list_empty( List *list );
175 /*
176 ====================================================================
177 Return entry containing the passed item.
178 Return Value: True if entry found else False.
179 ====================================================================
180 */
181 List_Entry *list_entry( List *list, void *item );
182
183 #ifdef __cplusplus
184 };
185 #endif
186
187 #endif
+0
-152
src/main.c less more
0 /***************************************************************************
1 main.c - description
2 -------------------
3 begin : Don Sep 6 12:02:57 CEST 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifdef HAVE_CONFIG_H
18 #include "../config.h"
19 #endif
20
21 #include "lbreakout.h"
22 #include "file.h"
23 #include "chart.h"
24 #include "config.h"
25 #include "shrapnells.h"
26 #include "event.h"
27 #include "levels.h"
28 #include "game.h"
29 #ifdef SOUND
30 #include "audio.h"
31 #endif
32 #include "manager.h"
33 #include "editor.h"
34 #include "help.h"
35 #include "theme.h"
36
37 int term_game = 0;
38 extern Sdl sdl;
39 extern Config config;
40 extern char **levelset_home_names;
41 extern Font *font;
42 extern char **theme_names;
43
44 int main(int argc, char *argv[])
45 {
46 int result = ACTION_NONE;
47 int leave = 0;
48 char *editor_file = 0;
49 char path[512];
50
51 /* lbreakout info */
52 printf( "LBreakout2 %s\nCopyright 2001 Michael Speck\nPublished under GNU GPL\n---\n", VERSION );
53 printf( "Looking up data in: %s\n", SRC_DIR );
54 printf( "Looking up own levels in: %s/%s/lbreakout2-levels\n", (getenv( "HOME" )?getenv( "HOME" ):"."), CONFIG_DIR_NAME );
55 #ifndef SOUND
56 printf( "Compiled without sound and music\n" );
57 #endif
58
59 set_random_seed(); /* set random seed */
60
61 config_load();
62
63 init_sdl( SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER );
64 set_video_mode( std_video_mode( config.fullscreen ) );
65 SDL_WM_SetCaption( "LBreakout2", 0 );
66 sdl.fade = config.fade;
67 SDL_SetEventFilter( event_filter );
68 #ifdef SOUND
69 audio_open();
70 sound_enable( config.sound );
71 sound_volume( config.volume * 16 );
72 #endif
73
74 /* load resources */
75 /* for simplicity all functions are kept but anything
76 * that is now themeable is loaded in
77 * theme_load instead of the original function
78 * (deleting resources works analouge)
79 */
80 theme_get_list();
81 theme_load( theme_names[config.theme_id] );
82 /* old functions still with initialzations of
83 * lists or variables
84 */
85 game_create();
86 exp_load();
87 editor_create();
88 hint_load_res();
89 manager_create();
90 chart_load();
91 help_create();
92 /* run game */
93 manager_fade( FADE_IN );
94 while( !leave && !term_game ) {
95 result = manager_run();
96 switch( result ) {
97 case ACTION_QUIT: leave = 1; break;
98 case ACTION_PLAY:
99 manager_fade( FADE_OUT );
100 if ( game_init() ) game_run();
101 game_clear();
102 manager_fade( FADE_IN );
103 break;
104 case ACTION_EDIT:
105 /* new set? */
106 if ( strequal( "<CREATE SET>", levelset_home_names[config.levelset_home_id] ) ) {
107 editor_file = calloc( 16, sizeof( char ) );
108 sprintf( path, "%s/%s/lbreakout2-levels", getenv( "HOME" ), CONFIG_DIR_NAME );
109 if ( !enter_string( font, "Set Name:", editor_file, 12 ) || !file_check( path, editor_file, "w" ) ) {
110 free( editor_file );
111 break;
112 }
113 else
114 manager_update_set_list();
115 }
116 else
117 editor_file = strdup( levelset_home_names[config.levelset_home_id] );
118 if ( editor_init( editor_file ) ) {
119 manager_fade( FADE_OUT );
120 editor_run();
121 editor_clear();
122 manager_fade( FADE_IN );
123 }
124 free( editor_file ); editor_file = 0;
125 break;
126 case ACTION_QUICK_HELP:
127 help_run();
128 break;
129 default: break;
130 }
131 }
132 manager_fade( FADE_OUT );
133 /* delete stuff */
134 help_delete();
135 manager_delete();
136 chart_save();
137 chart_delete();
138 editor_delete();
139 exp_delete();
140 game_delete();
141 hint_delete_res();
142 theme_delete();
143 theme_delete_list();
144
145 #ifdef SOUND
146 audio_close();
147 #endif
148 config_save();
149
150 return EXIT_SUCCESS;
151 }
+0
-561
src/manager.c less more
0 /***************************************************************************
1 manager.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifdef HAVE_CONFIG_H
18 #include "../config.h"
19 #endif
20
21 #include "manager.h"
22 #include "chart.h"
23 #include "event.h"
24 #include "config.h"
25 #ifdef SOUND
26 #include "audio.h"
27 #endif
28 #include "levels.h"
29 #include "theme.h"
30
31 extern Sdl sdl;
32 extern Config config;
33 extern List *menus; /* list of menus */
34 int menu_x = 54, menu_y = 220, menu_w = 256, menu_h = 256, menu_border = 16; /* default region where menu is displayed centered */
35 int cx = 384, cy = 220, cw = 256, ch = 200; /* center charts here */
36 Menu *cur_menu; /* current menu */
37 SDL_Surface *mbkgnd = 0; /* menu background */
38 Font *mfont = 0, *mhfont = 0, *mcfont = 0; /* font, highlight font, caption font */
39 int gap_height = 2;
40 extern char **levelset_names;
41 extern int levelset_count;
42 extern char **levelset_home_names;
43 extern int levelset_home_count;
44 extern int term_game;
45 #ifdef SOUND
46 Sound_Chunk *wav_menu_click = 0;
47 Sound_Chunk *wav_menu_motion = 0;
48 #endif
49 /* some items we need to know to assign name lists later */
50 Item *item_levelset, *item_set;
51 extern List *charts;
52 int chart_id = 0; /* current chart displayed */
53 /* theme name list */
54 extern char **theme_names;
55 extern int theme_count;
56
57 /* hints */
58 #define HINT_ 0
59 #define HINT_QUIT "There's nasty work out there waiting for you... better stay here!"
60 #define HINT_ANIM "If you turn animations low there'll be less details which will speed up the game a great deal."
61 #define HINT_TRP "Enable/disable transparency of bonuses and animations."
62 #define HINT_SHADOW "If you disable shadows it will speed up the game but won't look that good. ;-)"
63 #define HINT_DISPLAY "You may run LBreakout2 either fullscreen or windowed. This switch may be done anywhere by pressing 'f'."
64 #define HINT_FPS "You you don't want LBreakout2 to consume all of your CPU (best performance) limit the frame rate."
65 #define HINT_CONVEX "As long as this option is enabled the paddle is treated as convex allowing easy aiming. If you "\
66 "disable this option the real physics will show up and you'll have to influence the ball by paddle movement "\
67 "and the hemispherical ends. Just for cracks."
68 #define HINT_BALLLEVEL "If you can't see the ball because of thousands of bonuses coming down set this option to 'Above Bonuses'"
69 #define HINT_USEHINTS "Enable/disable these quick hints. See the manual for more information about how to use LBreakout2!"
70 #define HINT_KEYSPEED "If you use the keyboard as input you may here adjust the paddle speed to your needs."
71 #define HINT_PLAYERS "These are the number of players and their names. If one player looses a ball or restarts the level it's the next player's turn."
72 #define HINT_LEVELSET "This is the levelset you actually want to play. Note, that each levelset got it's own highscore chart (left/right-click on the chart on the right)." \
73 " A levelset is either load from ~/.lgames/lbreakout2-levels or the installation directory."
74 #define HINT_DIFF "EASY:#Lives: 6 (max. 10)#Paddle Size: 72 (max. 180)#Continue Cost: 20,000 points##"\
75 "MEDIUM:#Lives: 5 (max. 7)#Paddle Size: 72 (max. 144)#Continue Cost: 20,000 points#Bonus: 20%##"\
76 "HARD:#Lives: 4 (max. 5)#Paddle Size: 54 (max. 108)#Continue Cost: 30,000 points#Bonus: 40%##"\
77 "The bonus is added at the very end of the game."
78 #define HINT_STARTGAME "Let's get it on!"
79 #define HINT_EDITOR_SET "This is the list of the levelsets found in ~/.lgames/lbreakout2-levels which you may edit. If you "\
80 "choose <CREATE SET> and click on 'Edit Set' below you'll be asked to enter a levelsetname and the new levelset " \
81 "will be saved in a file by this name."
82 #define HINT_EDITOR_EDIT "Click here to edit the levelset chosen above."
83 #define HINT_EDITOR_DELETE "Click here to delete the chosen levelset (after confirmation)."
84 #define HINT_KEYS "If you use the keyboard for input these are the keys for moving the paddle, firing balls/shots and returning the ball to paddle after a timeout of ten seconds."
85 #define HINT_GRAB "Keeps the mouse in window. This option is only needed when running in windowed mode with relative mouse motion disabled."
86 #define HINT_RELMOTION "Turning this on allows you to invert the mouse motion, modify the mouse speed and use keyboard for fine-tuning."
87 #define HINT_MOD "This is the percentual motion modifier. The higher the faster the mouse moves."
88 #define HINT_INVERT "If for some reason you need an inversion. You may turn this on here."
89 #define HINT_INPUT "Here you may specify which input devices are allowed for input handling."
90 #define HINT_RETURN "If a ball does not damage a brick within ten seconds it is allowed to return to the paddle. If this option is set "\
91 "to 'Auto' it will automatically return and if this option is set to 'By Click' you'll have to press the middle mouse"\
92 "button or the 'back'-key (default is Backspace)."
93 #define HINT_THEME "This is the list of available themes. Choose any theme and click 'Apply' to select it. The menu is not themeable "\
94 "so you'll see the change when you run a game. Please check the manual at www.lgames.org for information on how to "\
95 "create a theme."
96
97 /*
98 ====================================================================
99 Callbacks of menu items.
100 ====================================================================
101 */
102 /* Disable/enable sound */
103 void cb_sound() {
104 #ifdef SOUND
105 sound_enable( config.sound );
106 #endif
107 }
108 /* set volume */
109 void cb_volume() {
110 #ifdef SOUND
111 sound_volume( config.volume * 16 );
112 #endif
113 }
114 /* toggle fullscreen */
115 void cb_fullscreen() {
116 manager_show();
117 }
118 /* delete set */
119 void cb_delete_set()
120 {
121 char fname[512];
122 /* do not delete <CREATE SET> file */
123 if ( strequal( "<CREATE SET>", levelset_home_names[config.levelset_home_id] ) ) {
124 printf( "You cannot delete '<CREATE SET>'!\n" );
125 return;
126 }
127 /* get file name + path */
128 sprintf( fname, "%s/%s/lbreakout2-levels/%s", getenv( "HOME" ), CONFIG_DIR_NAME, levelset_home_names[config.levelset_home_id] );
129 remove( fname );
130 levelsets_load_names(); /* reinit name lists and configs indices */
131 /* reassign these name lists as position in memory has changed */
132 value_set_new_names( item_levelset->value, levelset_names, levelset_count );
133 value_set_new_names( item_set->value, levelset_home_names, levelset_home_count );
134 }
135 /* adjust set list */
136 void cb_adjust_set_list()
137 {
138 /* reinit name lists and configs indices */
139 levelsets_load_names();
140 /* reassign these name lists as position in memory has changed */
141 value_set_new_names( item_levelset->value, levelset_names, levelset_count );
142 value_set_new_names( item_set->value, levelset_home_names, levelset_home_count );
143 }
144 /* set key speed from i_key_speed */
145 void cb_set_keyspeed()
146 {
147 config.key_speed = (float)config.i_key_speed / 100;
148 }
149 /* if hints where disabled hide actual hint */
150 void cb_hints()
151 {
152 if ( !config.use_hints )
153 hint_set( 0 );
154 }
155 /* change theme */
156 void cb_change_theme()
157 {
158 theme_load( theme_names[config.theme_id] );
159 }
160
161 /*
162 ====================================================================
163 Load/delete background and create and link all menus
164 ====================================================================
165 */
166 void manager_create()
167 {
168 Item *key1, *key2, *key3, *key4;
169 Item *item;
170 int filter[SDLK_LAST]; /* key filter */
171 /* constant contence of switches */
172 char *str_fps[] = { "No Limit", "50 FPS", "100 FPS", "200 FPS" };
173 char *str_anim[] = { "Off", "Low", "Medium", "High" };
174 char *str_diff[] = { "Easy", "Medium", "Hard" };
175 char *str_ctrl[] = { "Keyboard Only", "Mouse Only", "Keyboard&Mouse" };
176 char aux[128];
177 /*
178 main:
179 new game:
180 start game
181 quick help
182 ---
183 levelset
184 difficulty
185 ---
186 active players
187 ---
188 player1
189 player2
190 player3
191 player4
192 controls
193 graphics
194 animations
195 transparency
196 shadow
197 ---
198 display
199 constant frame rate
200 audio:
201 sound
202 volume
203 advanced options:
204 convex paddle
205 ball level
206 key speed
207 editor:
208 set: (list)
209 edit
210 delete
211 yes
212 no
213 ---
214 create empty set
215 set name: (string)
216 create set
217 yes
218 no
219 ---
220 quit
221 */
222 Menu *_main = 0;
223 #ifdef _1
224 Menu *options = 0;
225 #endif
226 #ifdef SOUND
227 Menu *audio = 0;
228 #endif
229 Menu *gfx = 0;
230 Menu *game = 0;
231 Menu *cont = 0;
232 Menu *adv = 0;
233 Menu *editor = 0;
234 Menu *confirm_delete = 0;
235 Menu *theme = 0;
236
237 /* load graphics and sounds */
238 mbkgnd = load_surf( "menuback.bmp", SDL_SWSURFACE );
239 SDL_SetColorKey( mbkgnd, 0, 0 );
240 mfont = load_fixed_font( "f_small_yellow.bmp", 32, 96, 8, SDL_SWSURFACE );
241 mhfont = load_fixed_font( "f_white.bmp", 32, 96, 10, SDL_SWSURFACE );
242 mcfont = load_fixed_font( "f_yellow.bmp", 32, 96, 10, SDL_SWSURFACE );
243 #ifdef SOUND
244 wav_menu_click = sound_chunk_load( "menu_click.wav" );
245 wav_menu_motion = sound_chunk_load( "menu_motion.wav" );
246 #endif
247 /* add version to background */
248 mfont->align = ALIGN_X_RIGHT | ALIGN_Y_BOTTOM;
249 sprintf( aux, "v%s", VERSION );
250 write_text( mfont, mbkgnd, mbkgnd->w - 2, mbkgnd->h - 2 - mfont->height, aux, OPAQUE );
251 write_text( mfont, mbkgnd, mbkgnd->w - 2, mbkgnd->h - 2, "http://www.lgames.org", OPAQUE );
252
253 /* hints will be displayed on menu background */
254 hint_set_bkgnd( mbkgnd );
255
256 /* setup filter */
257 filter_clear( filter );
258 filter_set( filter, SDLK_a, SDLK_z, 1 );
259 filter[SDLK_BACKSPACE] = 1;
260 filter[SDLK_SPACE] = 1;
261 filter[SDLK_RSHIFT] = 1;
262 filter[SDLK_LSHIFT] = 1;
263 filter[SDLK_LALT] = 1;
264 filter[SDLK_RALT] = 1;
265 filter[SDLK_LCTRL] = 1;
266 filter[SDLK_RCTRL] = 1;
267 filter[SDLK_UP] = 1;
268 filter[SDLK_DOWN] = 1;
269 filter[SDLK_LEFT] = 1;
270 filter[SDLK_RIGHT] = 1;
271 filter[SDLK_q] = 0;
272 filter[SDLK_p] = 0;
273 filter[SDLK_f] = 0;
274 filter[SDLK_s] = 0;
275 filter[SDLK_a] = 0;
276 filter[SDLK_r] = 0;
277
278 /* menus are added to this list for deleting later */
279 menus = list_create( LIST_AUTO_DELETE, menu_delete );
280 /* create menus */
281 _main = menu_create( "Menu", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
282 #ifdef _1
283 options = menu_create( "Options", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
284 #endif
285 gfx = menu_create( "Graphics", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
286 game = menu_create( "New Game", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
287 cont = menu_create( "Controls", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
288 adv = menu_create( "Advanced Options", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
289 #ifdef SOUND
290 audio = menu_create( "Audio", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
291 #endif
292 editor = menu_create( "Editor", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
293 confirm_delete = menu_create( "Delete Set", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
294 theme = menu_create( "Select Theme", MENU_LAYOUT_CENTERED, menu_x, menu_y, menu_w, menu_h, menu_border );
295 /* create items */
296 /* main menu */
297 menu_add( _main, item_create_link ( "New Game", HINT_, game ) );
298 menu_add( _main, item_create_action ( "Quick Help", HINT_, ACTION_QUICK_HELP ) );
299 menu_add( _main, item_create_separator ( "" ) );
300 #ifdef _1
301 menu_add( _main, item_create_link ( "Options", options ) );
302 #endif
303 menu_add( _main, item_create_link ( "Controls", HINT_, cont ) );
304 menu_add( _main, item_create_link ( "Graphics", HINT_, gfx ) );
305 #ifdef SOUND
306 menu_add( _main, item_create_link ( "Audio", HINT_,audio ) );
307 #else
308 menu_add( _main, item_create_separator ( "Audio" ) );
309 #endif
310 menu_add( _main, item_create_link ( "Advanced Options", HINT_, adv ) );
311 menu_add( _main, item_create_separator ( "" ) );
312 menu_add( _main, item_create_link ( "Editor", HINT_, editor ) );
313 menu_add( _main, item_create_separator ( "" ) );
314 menu_add( _main, item_create_action ( "Quit", HINT_QUIT, ACTION_QUIT ) );
315 #ifdef _1
316 /* options */
317 menu_add( options, item_create_link( "Controls", HINT_, cont ) );
318 menu_add( options, item_create_link( "Graphics", HINT_, gfx ) );
319 menu_add( options, item_create_link( "Audio", HINT_, audio ) );
320 menu_add( options, item_create_separator( "Audio" ) );
321 menu_add( options, item_create_separator( "" ) );
322 menu_add( options, item_create_link( "Back", _main ) );
323 #endif
324 /* audio */
325 #ifdef SOUND
326 item = item_create_switch( "Sound:", HINT_, &config.sound, "Off", "On" );
327 item->callback = cb_sound;
328 menu_add( audio, item );
329 menu_add( audio, item_create_switch( "Speech:", HINT_, &config.speech, "Off", "On" ) );
330 item = item_create_range( "Volume:", HINT_, &config.volume, 1, 8, 1 );
331 item->callback = cb_volume;
332 menu_add( audio, item );
333 menu_add( audio, item_create_separator( "" ) );
334 menu_add( audio, item_create_link( "Back", HINT_, _main ) );
335 #endif
336 /* gfx */
337 menu_add( gfx, item_create_switch_x( "Animations:", HINT_ANIM, &config.anim, str_anim, 4 ) );
338 menu_add( gfx, item_create_switch( "Transparency:", HINT_TRP, &config.trp, "Off", "On" ) );
339 menu_add( gfx, item_create_switch( "Shadow:", HINT_SHADOW, &config.shadow, "Off", "On" ) );
340 menu_add( gfx, item_create_separator( "" ) );
341 item = item_create_switch( "Display:", HINT_DISPLAY, &config.fullscreen, "Window", "Fullscreen" );
342 item->callback = cb_fullscreen;
343 menu_add( gfx, item );
344 menu_add( gfx, item_create_switch_x( "Frame Rate:", HINT_FPS, &config.fps, str_fps, 4 ) );
345 menu_add( gfx, item_create_separator( "" ) );
346 menu_add( gfx, item_create_link( "Back", HINT_, _main ) );
347 /* game */
348 menu_add( game, item_create_action( "Start Game", HINT_STARTGAME, ACTION_PLAY ) );
349 menu_add( game, item_create_separator( "" ) );
350 item_levelset = item_create_switch_x( "Levelset:", HINT_LEVELSET, &config.levelset_id, levelset_names, levelset_count );
351 menu_add( game, item_levelset );
352 menu_add( game, item_create_switch_x( "Difficulty:", HINT_DIFF, &config.diff, str_diff, 3 ) );
353 menu_add( game, item_create_separator( "" ) );
354 menu_add( game, item_create_range( "Players:", HINT_PLAYERS, &config.player_count, 1, 4, 1 ) );
355 menu_add( game, item_create_edit( "1st:", HINT_PLAYERS, config.player_names[0], 12 ) );
356 menu_add( game, item_create_edit( "2nd:", HINT_PLAYERS, config.player_names[1], 12 ) );
357 menu_add( game, item_create_edit( "3rd:", HINT_PLAYERS, config.player_names[2], 12 ) );
358 menu_add( game, item_create_edit( "4th:", HINT_PLAYERS, config.player_names[3], 12 ) );
359 menu_add( game, item_create_separator( "" ) );
360 menu_add( game, item_create_link( "Back", HINT_, _main ) );
361 /* controls */
362 key1 = item_create_key( "Left:", HINT_KEYS, &config.k_left, filter );
363 key2 = item_create_key( "Right:", HINT_KEYS, &config.k_right, filter );
364 key3 = item_create_key( "Fire:", HINT_KEYS, &config.k_fire, filter );
365 key4 = item_create_key( "Return:", HINT_KEYS, &config.k_return, filter );
366 menu_add( cont, key1 );
367 menu_add( cont, key2 );
368 menu_add( cont, key3 );
369 menu_add( cont, key4 );
370 /* dynamic restriction */
371 value_add_other_key( key1->value, key2->value );
372 value_add_other_key( key1->value, key3->value );
373 value_add_other_key( key1->value, key4->value );
374 value_add_other_key( key2->value, key1->value );
375 value_add_other_key( key2->value, key3->value );
376 value_add_other_key( key2->value, key4->value );
377 value_add_other_key( key3->value, key1->value );
378 value_add_other_key( key3->value, key2->value );
379 value_add_other_key( key3->value, key4->value );
380 value_add_other_key( key4->value, key1->value );
381 value_add_other_key( key4->value, key2->value );
382 value_add_other_key( key4->value, key3->value );
383 /* other control stuff */
384 menu_add( cont, item_create_separator( "" ) );
385 menu_add( cont, item_create_switch( "Grab Mouse:", HINT_GRAB, &config.grab, "Off", "On" ) );
386 menu_add( cont, item_create_switch( "Relative Motion:", HINT_RELMOTION, &config.rel_motion, "Off", "On" ) );
387 menu_add( cont, item_create_range( "Motion Modifier:", HINT_MOD, &config.motion_mod, 40, 160, 10 ) );
388 menu_add( cont, item_create_switch( "Invert Motion:", HINT_INVERT, &config.invert, "Off", "On" ) );
389 menu_add( cont, item_create_switch_x( "Input:", HINT_INPUT, &config.control, str_ctrl, 3 ) );
390 menu_add( cont, item_create_separator( "" ) );
391 menu_add( cont, item_create_link( "Back", HINT_, _main ) );
392 /* advanced options */
393 menu_add( adv, item_create_switch( "Convex Paddle:", HINT_CONVEX, &config.convex, "Off", "On" ) );
394 menu_add( adv, item_create_switch( "Balls:", HINT_BALLLEVEL, &config.ball_level, "Below Bonuses", "Above Bonuses" ) );
395 item = item_create_range( "Key Speed:", HINT_KEYSPEED, &config.i_key_speed, 40, 100, 5 );
396 item->callback = cb_set_keyspeed;
397 menu_add( adv, item );
398 menu_add( adv, item_create_switch( "Return Balls:", HINT_RETURN, &config.return_on_click, "Auto", "By Click" ) );
399 item = item_create_switch( "Use Hints:", HINT_USEHINTS, &config.use_hints, "Off", "On" );
400 item->callback = cb_hints;
401 menu_add( adv, item );
402 menu_add( adv, item_create_separator( "" ) );
403 menu_add( adv, item_create_link( "Select Theme", HINT_, theme ) );
404 menu_add( adv, item_create_separator( "" ) );
405 menu_add( adv, item_create_link( "Back", HINT_, _main ) );
406 /* editor */
407 item_set = item_create_switch_x( "Set:", HINT_EDITOR_SET, &config.levelset_home_id, levelset_home_names, levelset_home_count );
408 menu_add( editor, item_set );
409 menu_add( editor, item_create_action( "Edit Set", HINT_EDITOR_EDIT, ACTION_EDIT ) );
410 menu_add( editor, item_create_link( "Delete Set", HINT_EDITOR_DELETE, confirm_delete ) );
411 menu_add( editor, item_create_separator( "" ) );
412 menu_add( editor, item_create_link( "Back", HINT_, _main ) );
413 /* confirm_delete set */
414 item = item_create_link( "Yes", HINT_ ,editor );
415 item->callback = cb_delete_set;
416 menu_add( confirm_delete, item );
417 menu_add( confirm_delete, item_create_link( "No", HINT_, editor ) );
418 /* theme */
419 menu_add( theme, item_create_switch_x( "Theme:", HINT_THEME, &config.theme_id, theme_names, theme_count ) );
420 menu_add( theme, item_create_separator( "" ) );
421 item = item_create_link( "Apply", HINT_, adv );
422 item->callback = cb_change_theme;
423 menu_add( theme, item );
424 menu_add( theme, item_create_link( "Cancel", HINT_, adv ) );
425
426 /* adjust all menus */
427 menu_adjust( _main );
428 #ifdef _1
429 menu_adjust( options );
430 #endif
431 #ifdef SOUND
432 menu_adjust( audio );
433 #endif
434 menu_adjust( gfx );
435 menu_adjust( game );
436 menu_adjust( cont );
437 menu_adjust( adv );
438 menu_adjust( editor );
439 menu_adjust( confirm_delete );
440 menu_adjust( theme );
441 /* set main menu as current */
442 menu_select( _main );
443 }
444 void manager_delete()
445 {
446 list_delete( menus );
447 if ( mbkgnd ) SDL_FreeSurface( mbkgnd ); mbkgnd = 0;
448 free_font( &mfont );
449 free_font( &mhfont );
450 free_font( &mcfont );
451 #ifdef SOUND
452 sound_chunk_free( &wav_menu_click );
453 sound_chunk_free( &wav_menu_motion );
454 #endif
455 }
456 /*
457 ====================================================================
458 Run menu until request sent
459 ====================================================================
460 */
461 int manager_run()
462 {
463 SDL_Event event;
464 int event_polled = 0; /* event occured? */
465 int result = ACTION_NONE;
466 int ms;
467 /* draw highscores */
468 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
469 /* loop */
470 reset_timer();
471 while ( result == ACTION_NONE && !term_game ) {
472 if ( event_poll( &event ) ) event_polled = 1;
473 if ( event_polled && event.type == SDL_QUIT ) {
474 result = ACTION_QUIT;
475 term_game = 1;
476 }
477 /* fullscreen if no item selected */
478 if ( event_polled ) {
479 if ( cur_menu->cur_item == 0 || ( cur_menu->cur_item->type != ITEM_EDIT && cur_menu->cur_item->type != ITEM_KEY ) )
480 if ( event.type == SDL_KEYUP )
481 if ( event.key.keysym.sym == SDLK_f ) {
482 config.fullscreen = !config.fullscreen;
483 set_video_mode( std_video_mode( config.fullscreen ) );
484 FULL_DEST( sdl.screen ); FULL_SOURCE( mbkgnd ); blit_surf();
485 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
486 refresh_screen( 0, 0 ,0, 0 );
487 }
488 /* check if clicked on highscore */
489 if ( event.type == SDL_MOUSEBUTTONUP )
490 if ( event.button.x >= cx && event.button.y >= cy )
491 if ( event.button.x < cx + cw && event.button.y < cy + ch ) {
492 #ifdef SOUND
493 sound_play( wav_menu_click );
494 #endif
495 /* set chart id */
496 if ( event.button.button == LEFT_BUTTON ) {
497 chart_id++;
498 if ( chart_id == charts->count ) chart_id = 0;
499 }
500 else {
501 chart_id--;
502 if ( chart_id == -1 ) chart_id = charts->count - 1;
503 }
504 /* redraw */
505 FULL_DEST( sdl.screen ); FULL_SOURCE( mbkgnd ); blit_surf();
506 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
507 refresh_screen( cx, cy, cw, ch );
508 }
509 }
510 ms = get_time();
511 menu_hide( cur_menu );
512 hint_hide();
513 if ( event_polled )
514 result = menu_update( cur_menu, &event, ms );
515 else
516 result = menu_update( cur_menu, 0, ms );
517 hint_update( ms );
518 menu_show( cur_menu );
519 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
520 hint_show();
521 refresh_rects();
522 event_polled = 0;
523 SDL_Delay( 5 );
524 }
525 return result;
526 }
527 /*
528 ====================================================================
529 Fade in/out background of menu
530 ====================================================================
531 */
532 void manager_fade( int type )
533 {
534 if ( type == FADE_IN ) {
535 FULL_DEST( sdl.screen ); FULL_SOURCE( mbkgnd ); blit_surf();
536 }
537 fade_screen( type, FADE_DEF_TIME );
538 }
539 /*
540 ====================================================================
541 Update screen without menu itself as this is shown next frame.
542 ====================================================================
543 */
544 void manager_show()
545 {
546 set_video_mode( std_video_mode( config.fullscreen ) );
547 FULL_DEST( sdl.screen ); FULL_SOURCE( mbkgnd ); blit_surf();
548 chart_show( chart_set_query_id( chart_id ), cx, cy, cw, ch );
549 add_refresh_rect( 0, 0, sdl.screen->w, sdl.screen->h );
550 }
551
552 /*
553 ====================================================================
554 Update set list when creating a new file for editor.
555 ====================================================================
556 */
557 void manager_update_set_list()
558 {
559 cb_adjust_set_list(); /* hacky but shiiiit how cares? */
560 }
+0
-74
src/manager.h less more
0 /***************************************************************************
1 manager.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MANAGER_H
18 #define __MANAGER_H
19
20 #include "lbreakout.h"
21 #include "list.h"
22 #include "value.h"
23 #include "item.h"
24 #include "menu.h"
25
26 /*
27 ====================================================================
28 Actions generated by menu
29 ====================================================================
30 */
31 enum {
32 ACTION_NONE = 0,
33 ACTION_QUIT,
34 ACTION_PLAY,
35 ACTION_SHOW_HIGHSCORE,
36 ACTION_EDIT,
37 ACTION_QUICK_HELP
38 };
39
40 /*
41 ====================================================================
42 Load/delete background and create and link all menus
43 ====================================================================
44 */
45 void manager_create();
46 void manager_delete();
47 /*
48 ====================================================================
49 Run menu until request sent
50 ====================================================================
51 */
52 int manager_run();
53 /*
54 ====================================================================
55 Fade in/out background of menu
56 ====================================================================
57 */
58 void manager_fade( int type );
59 /*
60 ====================================================================
61 Update screen without menu itself as this is shown next frame.
62 ====================================================================
63 */
64 void manager_show();
65
66 /*
67 ====================================================================
68 Update set list when creating a new file for editor.
69 ====================================================================
70 */
71 void manager_update_set_list();
72
73 #endif
+0
-374
src/menu.c less more
0 /***************************************************************************
1 menu.c - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "manager.h"
18 #ifdef SOUND
19 #include "audio.h"
20 #endif
21
22 List *menus = 0; /* list of menus used to delete them later */
23 extern Font *mfont, *mhfont, *mcfont;
24 extern int gap_height; /* gap size between items */
25 extern Menu *cur_menu;
26 extern int motion, motion_x, motion_y; /* mouse motion event */
27 #ifdef SOUND
28 extern Sound_Chunk *wav_menu_motion, *wav_menu_click;
29 #endif
30
31 /*
32 ====================================================================
33 Create menu.
34 ====================================================================
35 */
36 Menu *menu_create( char *name, int layout, int x, int y, int w, int h, int border )
37 {
38 Menu *menu = calloc( 1, sizeof( Menu ) );
39 /* name */
40 menu->name = strdup( name );
41 /* layout */
42 menu->layout = layout;
43 menu->x = x + border; menu->y = y + border;
44 menu->w = w - border * 2; menu->h = h - border * 2;
45 /* items are cleared normally */
46 menu->items = list_create( LIST_AUTO_DELETE, item_delete );
47 /* add menu to list menus */
48 list_add( menus, menu );
49 /* create caption */
50 menu_add( menu, item_create_separator( name ) );
51 ((Item*)menu->items->head.next->item)->font = mcfont;
52 menu_add( menu, item_create_separator( "" ) );
53 /* return menu */
54 return menu;
55 }
56 /*
57 ====================================================================
58 Delete menu and all submenus starting with root menu
59 ====================================================================
60 */
61 void menu_delete( void *pmenu )
62 {
63 Menu *menu = (Menu*)pmenu;
64 if ( !menu ) return;
65 list_delete( menu->items );
66 if ( menu->name ) free( menu->name );
67 free( menu );
68 }
69 /*
70 ====================================================================
71 Add item to menu.
72 ====================================================================
73 */
74 void menu_add( Menu *menu, Item *item )
75 {
76 list_add( menu->items, item );
77 if ( item->type == ITEM_LINK && (Menu*)item->link != menu )
78 ((Menu*)item->link)->parent = menu;
79 }
80 /*
81 ====================================================================
82 Adjust position and size of all entries according to layout.
83 ====================================================================
84 */
85 void menu_adjust( Menu *menu )
86 {
87 int height, x, y;
88 Item *item;
89 if ( menu->layout == MENU_LAYOUT_CENTERED ) {
90 /* get full height of all items + gaps */
91 height = menu->items->count * mhfont->height +
92 ( menu->items->count - 1 ) * gap_height;
93 /* get positions of items */
94 y = menu->y + ( menu->h - height ) / 2;
95 x = menu->x;
96 /* set position */
97 list_reset( menu->items );
98 while( ( item = list_next( menu->items ) ) ) {
99 item->x = x; item->y = y;
100 item->w = menu->w; item->h = mhfont->height;
101 y += gap_height + mhfont->height;
102 item_adjust( item ); /* adjust alignment */
103 }
104 return;
105 }
106 fprintf( stderr, "menu_adjust: layout %i not supported\n", menu->layout );
107 }
108 /*
109 ====================================================================
110 Select menu: clear current item and set extern variable cur_menu
111 ====================================================================
112 */
113 void menu_select( Menu *menu )
114 {
115 if ( cur_menu ) menu_unselect_cur_item( cur_menu );
116 cur_menu = menu;
117 menu->cur_item = 0;
118 hint_set( 0 );
119 }
120 /*
121 ====================================================================
122 Show/hide all items
123 ====================================================================
124 */
125 void menu_hide( Menu *menu )
126 {
127 Item *item;
128 list_reset( menu->items );
129 while ( ( item = list_next( menu->items ) ) )
130 item_hide( item );
131 }
132 void menu_show( Menu *menu )
133 {
134 Item *item;
135 list_reset( menu->items );
136 while ( ( item = list_next( menu->items ) ) )
137 item_show( item );
138 }
139 /*
140 ====================================================================
141 Update alpha of items and modify items according to event (if any)
142 ====================================================================
143 */
144 int menu_update( Menu *menu, SDL_Event *event, int ms )
145 {
146 int result = ACTION_NONE;
147 Item *item, *old_item;
148 int item_used;
149 void (*callback)(void);
150 /* update alpha of all items */
151 list_reset( menu->items );
152 while ( ( item = list_next( menu->items ) ) )
153 item_update_alpha( item, ms );
154 /* if value::grab is set do only except keyup events */
155 if ( menu->cur_item && menu->cur_item->type == ITEM_KEY && menu->cur_item->value->grab ) {
156 if ( event && event->type == SDL_KEYUP )
157 value_set_key( menu->cur_item->value, event->key.keysym.sym );
158 return result;
159 }
160 /* if other event occured check */
161 if ( event )
162 switch ( event->type ) {
163 case SDL_KEYUP:
164 switch ( event->key.keysym.sym ) {
165 case SDLK_ESCAPE:
166 /* if ESCAPE is pressed go up to last menu or leave */
167 if ( strequal( "Back", ((Item*)menu->items->tail.prev->item)->name ) )
168 menu_select( ((Item*)menu->items->tail.prev->item)->link );
169 else
170 if ( strequal( "Quit", ((Item*)menu->items->tail.prev->item)->name ) )
171 result = ACTION_QUIT;
172 break;
173 case SDLK_RETURN:
174 if ( !menu->cur_item ) break;
175 item_used = 1;
176 /* callback */
177 callback = menu->cur_item->callback;
178 /* action */
179 switch ( menu->cur_item->type ) {
180 case ITEM_ACTION: result = menu->cur_item->item_id; break;
181 case ITEM_LINK: menu_select( menu->cur_item->link ); break;
182 case ITEM_KEY: value_grab( menu->cur_item->value ); break;
183 case ITEM_SWITCH:
184 case ITEM_SWITCH_X:
185 case ITEM_RANGE:
186 value_inc( menu->cur_item->value );
187 break;
188 default: item_used = 0; break;
189 }
190 if ( item_used ) {
191 #ifdef SOUND
192 sound_play( wav_menu_click );
193 #endif
194 if ( callback ) (callback)();
195 }
196 break;
197 case SDLK_RIGHT:
198 if ( !menu->cur_item ) break;
199 item_used = 1;
200 switch ( menu->cur_item->type ) {
201 case ITEM_SWITCH:
202 case ITEM_SWITCH_X:
203 case ITEM_RANGE:
204 value_inc( menu->cur_item->value );
205 break;
206 default: item_used = 0; break;
207 }
208 #ifdef SOUND
209 if ( item_used )
210 sound_play( wav_menu_click );
211 #endif
212 break;
213 case SDLK_LEFT:
214 if ( !menu->cur_item ) break;
215 item_used = 1;
216 switch ( menu->cur_item->type ) {
217 case ITEM_SWITCH:
218 case ITEM_SWITCH_X:
219 case ITEM_RANGE:
220 value_dec( menu->cur_item->value );
221 break;
222 default: item_used = 0; break;
223 }
224 #ifdef SOUND
225 if ( item_used )
226 sound_play( wav_menu_click );
227 #endif
228 break;
229 case SDLK_UP:
230 menu_up( menu );
231 hint_set( menu->cur_item->hint );
232 #ifdef SOUND
233 sound_play( wav_menu_click );
234 #endif
235 break;
236 case SDLK_DOWN:
237 menu_down( menu );
238 hint_set( menu->cur_item->hint );
239 #ifdef SOUND
240 sound_play( wav_menu_click );
241 #endif
242 break;
243 default:
244 /* if type is edit: edit! */
245 if ( menu->cur_item && menu->cur_item->type == ITEM_EDIT ) {
246 value_edit( menu->cur_item->value, event->key.keysym.sym, event->key.keysym.unicode );
247 #ifdef SOUND
248 sound_play( wav_menu_click );
249 #endif
250 break;
251 }
252 break;
253 }
254 break;
255 case SDL_MOUSEBUTTONUP:
256 if ( !menu->cur_item ) break;
257 item_used = 1;
258 callback = menu->cur_item->callback;
259 switch ( menu->cur_item->type ) {
260 case ITEM_ACTION: result = menu->cur_item->item_id; break;
261 case ITEM_LINK: menu_select( menu->cur_item->link ); break;
262 case ITEM_SWITCH:
263 case ITEM_SWITCH_X:
264 case ITEM_RANGE:
265 if ( event->button.button == LEFT_BUTTON )
266 value_inc( menu->cur_item->value );
267 else
268 value_dec( menu->cur_item->value );
269 break;
270 case ITEM_KEY: value_grab( menu->cur_item->value ); break;
271 default: item_used = 0; break;
272 }
273 if ( item_used ) {
274 #ifdef SOUND
275 sound_play( wav_menu_click );
276 #endif
277 if ( callback ) (callback)();
278 }
279 break;
280 }
281 /* mouse motion is handled by event_filter so check motion */
282 if ( motion ) {
283 /* select item mouse pointer is on */
284 old_item = menu->cur_item;
285 menu_unselect_cur_item( menu );
286 list_reset( menu->items );
287 while( ( item = list_next( menu->items ) ) )
288 if ( item_focus( item, motion_x, motion_y ) ) {
289 menu_select_item( menu, item );
290 if ( old_item != menu->cur_item ) {
291 #ifdef SOUND
292 sound_play( wav_menu_motion );
293 #endif
294 }
295 break;
296 }
297 if ( menu->cur_item )
298 hint_set( menu->cur_item->hint );
299 else
300 hint_set( 0 );
301 }
302 return result;
303 }
304 /*
305 ====================================================================
306 Select/unselect item: update menu::cur_item und item::highlight
307 ====================================================================
308 */
309 void menu_unselect_cur_item( Menu *menu )
310 {
311 if ( menu->cur_item ) menu->cur_item->highlighted = 0;
312 menu->cur_item = 0;
313 }
314 void menu_select_item( Menu *menu, Item *item )
315 {
316 menu->cur_item = item;
317 menu->cur_item->highlighted = 1;
318 }
319 /*
320 ====================================================================
321 Go one valid menu item up or down.
322 ====================================================================
323 */
324 void menu_up( Menu *menu )
325 {
326 List_Entry *entry;
327 Item *item;
328 int valid = 0;
329 /* no selection so far: select first item after caption */
330 if ( !menu->cur_item ) {
331 menu_select_item( menu, list_get( menu->items, 2 ) );
332 return;
333 }
334 /* get entry -- MUST exist so don't check */
335 entry = list_entry( menu->items, menu->cur_item );
336 /* get next entry */
337 do {
338 entry = entry->prev;
339 if ( entry == &menu->items->head )
340 entry = menu->items->tail.prev;
341 item = (Item*)entry->item;
342 if ( item->type == ITEM_SEPARATOR ) continue;
343 valid = 1;
344 } while ( !valid );
345 /* set as current */
346 menu_unselect_cur_item( menu );
347 menu_select_item( menu, entry->item );
348 }
349 void menu_down( Menu *menu )
350 {
351 List_Entry *entry;
352 Item *item;
353 int valid = 0;
354 /* no selection so far: select first item after caption */
355 if ( !menu->cur_item ) {
356 menu_select_item( menu, list_get( menu->items, 2 ) );
357 return;
358 }
359 /* get entry -- MUST exist so don't check */
360 entry = list_entry( menu->items, menu->cur_item );
361 /* get next entry */
362 do {
363 entry = entry->next;
364 if ( entry == &menu->items->tail )
365 entry = menu->items->head.next;
366 item = (Item*)entry->item;
367 if ( item->type == ITEM_SEPARATOR ) continue;
368 valid = 1;
369 } while ( !valid );
370 /* set as current */
371 menu_unselect_cur_item( menu );
372 menu_select_item( menu, entry->item );
373 }
+0
-95
src/menu.h less more
0 /***************************************************************************
1 menu.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MENU_H
18 #define __MENU_H
19
20 /*
21 ====================================================================
22 Menu
23 ====================================================================
24 */
25 enum { MENU_LAYOUT_CENTERED = 0 };
26 typedef struct _Menu {
27 char *name; /* name of menu -- duplicated */
28 int layout;
29 int x, y, w, h; /* layout */
30 List *items; /* list of menu items */
31 Item *cur_item; /* currently highlighted item */
32 struct _Menu *parent; /* parent menu */
33 } Menu;
34
35 /*
36 ====================================================================
37 Create menu and center it in x,y,w,h by menu_adjust() later.
38 ====================================================================
39 */
40 Menu *menu_create( char *name, int layout, int x, int y, int w, int h, int border );
41 /*
42 ====================================================================
43 Delete menu and all submenus starting with root menu
44 ====================================================================
45 */
46 void menu_delete( void *menu );
47 /*
48 ====================================================================
49 Add item to menu. Add item::menu to children list if
50 ITEM_LINK.
51 ====================================================================
52 */
53 void menu_add( Menu *menu, Item *item );
54 /*
55 ====================================================================
56 Adjust position and size of all entries according to layout.
57 ====================================================================
58 */
59 void menu_adjust( Menu *menu );
60 /*
61 ====================================================================
62 Select menu: clear current item and set extern variable cur_menu
63 ====================================================================
64 */
65 void menu_select( Menu *menu );
66 /*
67 ====================================================================
68 Show/hide all items
69 ====================================================================
70 */
71 void menu_hide( Menu *menu );
72 void menu_show( Menu *menu );
73 /*
74 ====================================================================
75 Update alpha of items and modify items according to event (if any)
76 ====================================================================
77 */
78 int menu_update( Menu *menu, SDL_Event *event, int ms );
79 /*
80 ====================================================================
81 Select/unselect item: update menu::cur_item und item::highlight
82 ====================================================================
83 */
84 void menu_unselect_cur_item( Menu *menu );
85 void menu_select_item( Menu *menu, Item *item );
86 /*
87 ====================================================================
88 Go one valid menu item up or down.
89 ====================================================================
90 */
91 void menu_up( Menu *menu );
92 void menu_down( Menu *menu );
93
94 #endif
+0
-422
src/misc.c less more
0 /***************************************************************************
1 misc.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "event.h"
20 #include "misc.h"
21 #ifdef SOUND
22 #include "audio.h"
23 #endif
24
25 extern Sdl sdl;
26 extern SDL_Surface *offscreen;
27 extern int term_game;
28 int shadow_size = 10;
29 #ifdef SOUND
30 extern Sound_Chunk *wav_click;
31 #endif
32 extern int motion_button;
33 extern Config config;
34 extern int bkgnd_count;
35 extern SDL_Surface *bkgnds[BACK_COUNT];
36
37 char circle_msg[256];
38
39 /*
40 ====================================================================
41 Load background according to id and draw background to offscreen.
42 Return Value: loaded background surface
43 ====================================================================
44 */
45 SDL_Surface* bkgnd_draw( int id )
46 {
47 SDL_Surface *bkgnd = 0;
48 SDL_Surface *pic = 0;
49 int i, j;
50
51 if ( id >= bkgnd_count ) id = 0;
52 if ( id == -1 ) id = rand() % bkgnd_count;
53
54 /* background is always the size of screen */
55 bkgnd = create_surf( sdl.screen->w, sdl.screen->h, SDL_SWSURFACE );
56 SDL_SetColorKey( bkgnd, 0, 0 );
57 FULL_DEST( bkgnd ); fill_surf( 0x0 );
58
59 /* load background */
60 pic = bkgnds[id];
61 for ( i = 0; i < bkgnd->w; i += pic->w ) {
62 for ( j = 0; j < bkgnd->h; j += pic->h ) {
63 DEST( bkgnd, i, j, pic->w, pic->h );
64 SOURCE( pic, 0, 0 );
65 blit_surf();
66 }
67 }
68
69 /* draw to offscreen */
70 FULL_DEST( offscreen ); FULL_SOURCE( bkgnd ); blit_surf();
71
72 return bkgnd;
73 }
74 /*
75 ====================================================================
76 Confirm request. Darkens screen a bit and display text.
77 Return Value: True if successful
78 ====================================================================
79 */
80 void draw_confirm_screen( Font *font, SDL_Surface *buffer, char *str )
81 {
82 FULL_DEST(sdl.screen);
83 fill_surf(0x0);
84 FULL_SOURCE(buffer);
85 alpha_blit_surf(128);
86 font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
87 write_text(font, sdl.screen, sdl.screen->w / 2, sdl.screen->h / 2, str, 0);
88 }
89 int confirm( Font *font, char *str, int type )
90 {
91 SDL_Event event;
92 int go_on = 1;
93 int ret = 0;
94 SDL_Surface *buffer = create_surf(sdl.screen->w, sdl.screen->h, SDL_SWSURFACE);
95 SDL_SetColorKey(buffer, 0, 0);
96
97 #ifdef SOUND
98 sound_play( wav_click );
99 #endif
100
101 event_block_motion( 1 );
102
103 FULL_DEST(buffer);
104 FULL_SOURCE(sdl.screen);
105 blit_surf();
106 draw_confirm_screen( font, buffer, str );
107 refresh_screen( 0, 0, 0, 0 );
108
109 while (go_on && !term_game) {
110 SDL_WaitEvent(&event);
111 /* TEST */
112 switch ( event.type ) {
113 case SDL_QUIT: term_game = 1; break;
114 case SDL_MOUSEBUTTONUP:
115 if ( type == CONFIRM_ANY_KEY ) {
116 ret = 1; go_on = 0;
117 }
118 /* else
119 if ( type == CONFIRM_YES_NO ) {
120 if ( event.button.button == LEFT_BUTTON )
121 ret = 1;
122 else
123 ret = 0;
124 go_on = 0;
125 }*/
126 break;
127 case SDL_KEYUP:
128 if ( type == CONFIRM_ANY_KEY ) {
129 ret = 1; go_on = 0;
130 break;
131 }
132 else
133 if ( type == CONFIRM_PAUSE ) {
134 if ( event.key.keysym.sym == SDLK_p ) {
135 ret = 1; go_on = 0;
136 break;
137 }
138 else
139 if ( event.key.keysym.sym == SDLK_f ) {
140 config.fullscreen = !config.fullscreen;
141 set_video_mode( std_video_mode( config.fullscreen ) );
142 draw_confirm_screen( font, buffer, str );
143 refresh_screen( 0, 0, 0, 0 );
144 }
145 }
146 else
147 switch (event.key.keysym.sym) {
148 case SDLK_y:
149 go_on = 0;
150 ret = 1;
151 break;
152 case SDLK_ESCAPE:
153 case SDLK_n:
154 go_on = 0;
155 ret = 0;
156 default:
157 break;
158 }
159 break;
160 }
161 }
162 #ifdef SOUND
163 sound_play( wav_click );
164 #endif
165 FULL_DEST(sdl.screen);
166 FULL_SOURCE(buffer);
167 blit_surf();
168 refresh_screen( 0, 0, 0, 0 );
169 SDL_FreeSurface(buffer);
170
171 event_block_motion( 0 );
172
173 return ret;
174 }
175 /*
176 ====================================================================
177 Create shadow surface for specified region in surface.
178 Return Value: Shadow surface
179 ====================================================================
180 */
181 SDL_Surface* create_shadow( SDL_Surface *surf, int x, int y, int w, int h )
182 {
183 SDL_Surface *shadow = 0;
184 int i, j;
185 Uint32 white = SDL_MapRGB( sdl.screen->format, 0xff, 0xff, 0xff );
186 Uint32 black = SDL_MapRGB( sdl.screen->format, 0, 0, 0 );
187 shadow = create_surf( w, h, SDL_SWSURFACE );
188 SDL_SetColorKey( shadow, SDL_SRCCOLORKEY, white );
189 for ( i = 0; i < w; i++ )
190 for ( j = 0; j < h; j++ ) {
191 if ( get_pixel( surf, i, j ) == surf->format->colorkey )
192 set_pixel( shadow, i, j, white );
193 else
194 set_pixel( shadow, i, j, black );
195 }
196 return shadow;
197 }
198
199 /*
200 ====================================================================
201 Return vector struct with the specified coordinates.
202 ====================================================================
203 */
204 Vector vector_get( float x, float y )
205 {
206 Vector v = { x, y };
207 return v;
208 }
209 /*
210 ====================================================================
211 Give vector the normed length of 1.
212 ====================================================================
213 */
214 void vector_norm( Vector *v )
215 {
216 float length;
217 if ( v->x == 0 && v->y == 0 ) return; /* NULL vector may not be normed */
218 length = sqrt( v->x * v->x + v->y * v->y );
219 v->x /= length;
220 v->y /= length;
221 }
222 /*
223 ====================================================================
224 Return monotony of vector. If vertical return 0
225 ====================================================================
226 */
227 float vector_monotony( Vector v )
228 {
229 if ( v.x == 0 ) return 0;
230 return v.y / v.x;
231 }
232
233 /*
234 ====================================================================
235 Initiate a line struct.
236 ====================================================================
237 */
238 void line_set( Line *line, float x, float y, float m )
239 {
240 line->vertical = 0;
241 line->m = m;
242 line->n = y - m*x;
243 }
244 void line_set_vert( Line *line, float x )
245 {
246 line->vertical = 1;
247 line->x = x;
248 }
249 void line_set_hori( Line *line, float y )
250 {
251 line->vertical = 0;
252 line->m = 0;
253 line->n = y;
254 }
255 void line_set_pts( Line *line, float x, float y, float x2, float y2 )
256 {
257 if ( x == x2 && y == y2 ) {
258 fprintf( stderr, "Warning! Can't create line from two identical points (%4.2f,%4.2f)... bailing out. Result is undefined.\n", x, y );
259 return;
260 }
261 if ( y == y2 ) line_set_hori( line, y );
262 else
263 if ( x == x2 ) line_set_vert( line, x );
264 else
265 line_set( line, x, y, ( y2 - y ) / ( x2 - x ) );
266 }
267 /*
268 ====================================================================
269 Intersect lines and set 'pos' to intersecting point.
270 Return Value: True if lines intersect.
271 ====================================================================
272 */
273 int line_intersect( Line *line, Line *target, Coord *pos )
274 {
275 /* reset pos */
276 pos->x = pos->y = 0;
277 /* if lines are parallel return False */
278 if ( line->vertical && target->vertical ) return 0; /* vertical parallels */
279 if ( !line->vertical && !target->vertical && line->m == target->m ) return 0; /* non-vertical parallels */
280 /* right now only one thing is supported: line horizontal */
281 if ( line->m == 0 && line->vertical == 0 ) {
282 pos->y = line->n;
283 if ( target->vertical )
284 pos->x = target->x;
285 else
286 pos->x = ( pos->y - target->n ) / target->m;
287 return 1;
288 }
289 if ( line->vertical ) {
290 if ( target->vertical ) return 0;
291 pos->x = line->x;
292 pos->y = target->m * pos->x + target->n;
293 return 1;
294 }
295 if ( target->vertical ) {
296 printf( "line_intersect: line non-vertical and target vertical not supported yet\n" );
297 return 1;
298 }
299 /* compute if both lines are neither vertical nor horizontal */
300 pos->x = ( line->n - target->n ) / ( target->m - line->m );
301 pos->y = line->m * pos->x + line->n;
302 return 1;
303 }
304 /*
305 ====================================================================
306 Return f(x)
307 ====================================================================
308 */
309 float line_y( Line *line, float x )
310 {
311 if ( line->vertical ) return 0;
312 return line->m * x + line->n;
313 }
314
315 /*
316 ====================================================================
317 Intersect line pos+t*v with circle (x+m)²=r²
318 Important length of v MUST be 1.
319 Return Value: True if intersecting, Intersecting points
320 ====================================================================
321 */
322 int circle_intersect( Vector m, int r, Vector pos, Vector v, Vector *t1, Vector *t2 )
323 {
324 Vector delta = { pos.x - m.x, pos.y - m.y };
325 float delta_v = delta.x * v.x + delta.y * v.y;
326 float dis = delta_v * delta_v + r * r - ( delta.x * delta.x + delta.y * delta.y );
327 float t;
328
329 if ( dis < 0 ) {
330 #ifdef WITH_BUG_REPORT
331 sprintf( circle_msg, "Diskriminante < 0" );
332 #endif
333 return 0;
334 }
335 dis = sqrt( dis );
336
337 t = -delta_v + dis;
338 t1->x = pos.x + t * v.x; t1->y = pos.y + t * v.y;
339 t = -delta_v - dis;
340 t2->x = pos.x + t * v.x; t2->y = pos.y + t * v.y;
341 #ifdef WITH_BUG_REPORT
342 sprintf( circle_msg, "Intersection points: (%4.2f,%4.2f), (%4.2f,%4.2f)", t1->x, t1->y, t2->x, t2->y );
343 #endif
344 return 1;
345 }
346
347 /*
348 ====================================================================
349 Enter a string and return True if ENTER received and False
350 if ESCAPE received.
351 ====================================================================
352 */
353 int enter_string( Font *font, char *caption, char *edit, int limit )
354 {
355 SDL_Event event;
356 int go_on = 1;
357 int ret = 0;
358 SDL_Surface *buffer = create_surf(sdl.screen->w, sdl.screen->h, SDL_SWSURFACE);
359 int length = strlen( edit );
360 int update = 1;
361
362 SDL_SetColorKey(buffer, 0, 0);
363
364 event_block_motion( 1 );
365
366 FULL_DEST(buffer);
367 FULL_SOURCE(sdl.screen);
368 blit_surf();
369 font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
370
371 while ( go_on && !term_game ) {
372 if ( update ) {
373 FULL_DEST(sdl.screen);
374 fill_surf(0x0);
375 FULL_SOURCE(buffer);
376 alpha_blit_surf(128);
377 write_text(font, sdl.screen, sdl.screen->w / 2, sdl.screen->h / 2, caption, OPAQUE);
378 write_text(font, sdl.screen, sdl.screen->w / 2, sdl.screen->h / 2 + font->height, edit, OPAQUE);
379 refresh_screen( 0, 0, 0, 0 );
380 update = 0;
381 }
382 SDL_WaitEvent(&event);
383 /* TEST */
384 switch ( event.type ) {
385 case SDL_QUIT: term_game = 1; break;
386 case SDL_KEYUP:
387 switch ( event.key.keysym.sym ) {
388 case SDLK_ESCAPE:
389 ret = 0;
390 go_on = 0;
391 break;
392 case SDLK_RETURN:
393 ret = 1;
394 go_on = 0;
395 break;
396 case SDLK_BACKSPACE:
397 if ( length > 0 ) edit[--length] = 0;
398 update = 1;
399 break;
400 default:
401 if ( event.key.keysym.sym >= 32 && event.key.keysym.sym < 128 && length < limit ) {
402 edit[length++] = event.key.keysym.unicode;
403 edit[length] = 0;
404 update = 1;
405 }
406 break;
407 }
408 break;
409 }
410 }
411
412 FULL_DEST(sdl.screen);
413 FULL_SOURCE(buffer);
414 blit_surf();
415 refresh_screen( 0, 0, 0, 0 );
416 SDL_FreeSurface(buffer);
417
418 event_block_motion( 0 );
419
420 return ret;
421 }
+0
-143
src/misc.h less more
0 /***************************************************************************
1 misc.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __MISC_H
18 #define __MISC_H
19
20 /*
21 ====================================================================
22 Vector
23 ====================================================================
24 */
25 typedef struct {
26 float x, y;
27 } Vector;
28 /*
29 ====================================================================
30 Line
31 ====================================================================
32 */
33 typedef Vector Coord;
34 typedef struct {
35 float x; /* position if vertical line */
36 int vertical; /* if this is set monotony is not computed */
37 float m; /* monotony */
38 float n; /* y_offset */
39 } Line;
40
41 /*
42 ====================================================================
43 Target of a shot or a ball.
44 ====================================================================
45 */
46 enum { SIDE_UNDEFINED = -1, SIDE_TOP = 0, SIDE_RIGHT, SIDE_BOTTOM, SIDE_LEFT,
47 CORNER_UPPER_LEFT, CORNER_UPPER_RIGHT,
48 CORNER_LOWER_LEFT, CORNER_LOWER_RIGHT };
49 typedef struct {
50 int exists; /* is there a target */
51 int mx, my; /* position in map */
52 float x, y; /* reset position of ball */
53 int time; /* time till contact */
54 int cur_tm; /* current time */
55 Vector perp_vector; /* reflection vector */
56 int side; /* side/corner of brick hit */
57 } Target;
58
59 /*
60 ====================================================================
61 Load background according to id and draw background to offscreen.
62 Return Value: loaded background surface
63 ====================================================================
64 */
65 SDL_Surface* bkgnd_draw( int id );
66 /*
67 ====================================================================
68 Confirm request. Darkens screen a bit and display text.
69 Return Value: True if successful
70 ====================================================================
71 */
72 enum{ CONFIRM_YES_NO, CONFIRM_ANY_KEY, CONFIRM_PAUSE };
73 int confirm( Font *font, char *str, int type );
74 /*
75 ====================================================================
76 Create shadow surface for specified region in surface.
77 Return Value: Shadow surface
78 ====================================================================
79 */
80 SDL_Surface* create_shadow( SDL_Surface *surf, int x, int y, int w, int h );
81
82 /*
83 ====================================================================
84 Return vector struct with the specified coordinates.
85 ====================================================================
86 */
87 Vector vector_get( float x, float y );
88 /*
89 ====================================================================
90 Give vector the normed length of 1.
91 ====================================================================
92 */
93 void vector_norm( Vector *v );
94 /*
95 ====================================================================
96 Return monotony of vector. If vertical return 0
97 ====================================================================
98 */
99 float vector_monotony( Vector v );
100
101 /*
102 ====================================================================
103 Initiate a line struct.
104 ====================================================================
105 */
106 void line_set( Line *line, float x, float y, float m );
107 void line_set_vert( Line *line, float x );
108 void line_set_hori( Line *line, float y );
109 void line_set_pts( Line *line, float x, float y, float x2, float y2 );
110 void line_set_affin( Line *line, Vector p, Vector v );
111 /*
112 ====================================================================
113 Intersect lines and set 'pos' to intersecting point.
114 Return Value: True if lines intersect.
115 ====================================================================
116 */
117 int line_intersect( Line *line, Line *target, Coord *pos );
118 /*
119 ====================================================================
120 Return f(x)
121 ====================================================================
122 */
123 float line_y( Line *line, float x );
124
125 /*
126 ====================================================================
127 Intersect line pos+t*v with circle (x+m)²=r²
128 Important length of v MUST be 1.
129 Return Value: True if intersecting, Intersecting points
130 ====================================================================
131 */
132 int circle_intersect( Vector m, int r, Vector pos, Vector v, Vector *t1, Vector *t2 );
133
134 /*
135 ====================================================================
136 Enter a string and return True if ENTER received and False
137 if ESCAPE received.
138 ====================================================================
139 */
140 int enter_string( Font *font, char *caption, char *edit, int limit );
141
142 #endif
+0
-509
src/paddle.c less more
0 /***************************************************************************
1 paddle.c - description
2 -------------------
3 begin : Fri Sep 7 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "event.h"
20 #include "difficulty.h"
21 #include "levels.h"
22 #include "bricks.h"
23 #include "shots.h"
24 #include "paddle.h"
25 #ifdef SOUND
26 #include "audio.h"
27 #endif
28
29 /*
30 ====================================================================
31 Basic paddle
32 ====================================================================
33 */
34 extern SDL_Surface *paddle_pic; /* paddle tiles: left, middle, right for each paddle type */
35 extern SDL_Surface *paddle_shadow;
36 int paddle_cw = 18, paddle_ch = 18; /* size of a graphical paddle component */
37 Paddle paddle; /* paddle data */
38 int paddle_pic_y_offset; /* use paddle tile set at this offset */
39 int paddle_frozen = 0; /* paddle frozen? */
40 int paddle_slime = 0; /* paddle covered with slime */
41 int paddle_attract = 0;
42 Delay paddle_resize_delay; /* every delay ms the paddle size is adjusted about two pixels */
43 int paddle_resized = 0; /* if this flag is set balls_update() will update the position of attached balls and clear this flag */
44 int paddle_invis = 0; /* is paddle invisible? */
45 int paddle_invis_delay; /* as long as this isn't timed out the paddle is seen. will be reset by movement */
46 enum { PADDLE_INVIS_DELAY = 200 };
47 /*
48 ====================================================================
49 Plasma weapon stuff
50 ====================================================================
51 */
52 extern SDL_Surface *weapon_pic;
53 extern SDL_Surface *weapon_shadow;
54 int weapon_y_off = 0;
55 int weapon_x, weapon_y; /* last position where weapon has been drawn */
56 int weapon_w = 14;
57 int weapon_h = 18;
58 int weapon_fr_num = 4;
59 float weapon_fpms = 0.006;
60 float weapon_cur = 0;
61 int weapon_inst = 0; /* is weapon installed? */
62 int weapon_fire = 0; /* fire weapon! */
63 Delay weapon_delay; /* delay between shots */
64 /*
65 ====================================================================
66 Other stuff
67 ====================================================================
68 */
69 extern Diff *diff; /* current difficulty */
70 extern Sdl sdl;
71 extern SDL_Surface *offscreen;
72 extern int motion;
73 extern int motion_x;
74 extern int motion_rel_x;
75 extern int keystate[SDLK_LAST];
76 extern Config config;
77 extern int shadow_size;
78 #ifdef SOUND
79 extern Sound_Chunk *wav_expand, *wav_shrink, *wav_frozen;
80 #endif
81 extern int active[EX_NUMBER];
82
83 /*
84 ====================================================================
85 Load and free paddle graphics.
86 ====================================================================
87 */
88 void paddle_load()
89 {
90 delay_set( &paddle_resize_delay, 40 );
91 }
92 void paddle_delete()
93 {
94 }
95 /*
96 ====================================================================
97 Reset position and size of paddle.
98 ====================================================================
99 */
100 void paddle_reset() {
101 paddle.len = diff->paddle_size;
102 paddle.max_len = diff->paddle_max_size;
103 paddle.w = (paddle.len + 2) * paddle_cw;
104 paddle.wanted_w = paddle.w;
105 paddle.h = paddle_ch;
106 paddle.y = (MAP_HEIGHT - 2) * BRICK_HEIGHT;
107 paddle.x = ((MAP_WIDTH * BRICK_WIDTH) - paddle.w) / 2; // centered //
108 paddle.cur_x = paddle.x;
109 paddle.friction = 0.3;
110 paddle.time = 0;
111 /* reset weapon delay&weapon */
112 delay_set( &weapon_delay, 100 );
113 weapon_inst = weapon_fire = 0;
114 /* reset slime&frozen */
115 paddle_slime = 0;
116 paddle_frozen = 0;
117 paddle_pic_y_offset = 0;
118 /* attract */
119 paddle_attract = ATTRACT_NONE;
120 /* no ivisiblivty */
121 paddle_invis = 0;
122 }
123 /*
124 ====================================================================
125 Freeze paddle movement or set slime.
126 ====================================================================
127 */
128 void paddle_freeze( int freeze )
129 {
130 #ifdef SOUND
131 if ( !paddle_frozen && freeze )
132 sound_play( wav_frozen );
133 #endif
134 paddle_frozen = freeze;
135 if ( freeze )
136 paddle_pic_y_offset = paddle_ch << 1;
137 else
138 if ( paddle_slime )
139 paddle_pic_y_offset = paddle_ch;
140 else
141 paddle_pic_y_offset = 0;
142 }
143 void paddle_set_slime( int slime )
144 {
145 paddle_slime = slime;
146 if ( paddle_frozen )
147 paddle_pic_y_offset = paddle_ch << 1;
148 else
149 if ( slime )
150 paddle_pic_y_offset = paddle_ch;
151 else
152 paddle_pic_y_offset = 0;
153 }
154 int paddle_slimy()
155 {
156 return paddle_slime;
157 }
158 /*
159 ====================================================================
160 Set if paddle attracts boni/mali or none.
161 ====================================================================
162 */
163 void paddle_set_attract( int attract )
164 {
165 paddle_attract = attract;
166 /* no graphical change yet */
167 }
168 inline int paddle_attract_malus()
169 {
170 return ( paddle_attract == ATTRACT_MALUS );
171 }
172 inline int paddle_attract_bonus()
173 {
174 return ( paddle_attract == ATTRACT_BONUS );
175 }
176 /*
177 ====================================================================
178 (De)activate ghostly behaviour: paddle is only seen when moved at
179 maximum 250ms before.
180 ====================================================================
181 */
182 void paddle_set_invis( int invis )
183 {
184 if ( invis ) paddle_invis_delay = PADDLE_INVIS_DELAY;
185 paddle_invis = invis;
186 }
187 int paddle_solid()
188 {
189 /* does paddle is visible? */
190 if ( !paddle_invis ) return 1;
191 if ( paddle_invis_delay ) return 1;
192 return 0;
193 }
194 /*
195 ====================================================================
196 Init paddle resize (the change between wanted_w and w MUST be
197 even (else the paddle shrinks til eternity)
198 ====================================================================
199 */
200 int paddle_init_resize( int c )
201 {
202 /* resize possbile */
203 if ( paddle.len + c > paddle.max_len || paddle.len + c < 1 ) return 0;
204 #ifdef SOUND
205 if ( c < 0 )
206 sound_play( wav_shrink );
207 else
208 sound_play( wav_expand );
209 #endif
210 /* get wanted width */
211 paddle.len += c;
212 paddle.wanted_w = (paddle.len + 2) * paddle_cw;
213 /* reset delay */
214 delay_reset( &paddle_resize_delay );
215 return 1;
216 }
217 /*
218 ====================================================================
219 Actually resize paddle
220 ====================================================================
221 */
222 void paddle_resize( int ms )
223 {
224 if ( paddle.w == paddle.wanted_w ) return;
225 if ( !delay_timed_out( &paddle_resize_delay, ms ) ) return;
226 /* change size and position */
227 if ( paddle.w < paddle.wanted_w ) {
228 paddle_resized = 1;
229 paddle.w += 2;
230 paddle.cur_x -= 1;
231 paddle.x = (int)paddle.cur_x;
232 /* check range */
233 if (paddle.x < BRICK_WIDTH)
234 paddle.x = BRICK_WIDTH;
235 if (paddle.x + paddle.w > sdl.screen->w - BRICK_WIDTH)
236 paddle.x = sdl.screen->w - BRICK_WIDTH - paddle.w;
237 }
238 else {
239 paddle_resized = -1;
240 paddle.w -= 2;
241 paddle.cur_x += 1;
242 paddle.x = (int)paddle.cur_x;
243 }
244 }
245 /*
246 ====================================================================
247 Hide and show paddle on screen.
248 ====================================================================
249 */
250 void paddle_hide()
251 {
252 int y = paddle.y;
253 int w = paddle.w;
254 int h = paddle.h;
255 if ( weapon_inst ) {
256 y -= weapon_y_off;
257 h = weapon_h;
258 }
259 if ( config.shadow ) { w += shadow_size; h += shadow_size; }
260 DEST(sdl.screen, paddle.x, y, w, h );
261 SOURCE(offscreen, paddle.x, y);
262 blit_surf();
263 add_refresh_rect(paddle.x, y, w, h );
264 }
265 void paddle_show()
266 {
267 int i;
268 int w = paddle.w;
269 int h = paddle.h;
270 int aux_w = 0;
271 int rem_middle_w; /* remaining points to draw in the middle */
272 /* if invisible return or show alpha */
273 if ( paddle_invis ) {
274 if ( paddle_invis_delay != 0 )
275 paddle_alphashow( 128 );
276 return;
277 }
278 if ( config.shadow ) set_surf_clip( sdl.screen, 0, 0, sdl.screen->w - BRICK_WIDTH, sdl.screen->h );
279 if ( config.shadow ) { w += shadow_size; h += shadow_size; }
280 /* paddle */
281 /* left end */
282 if ( config.shadow ) {
283 DEST(sdl.screen, paddle.x + shadow_size, paddle.y + shadow_size, paddle_cw, paddle_ch);
284 SOURCE(paddle_shadow, 0, 0);
285 alpha_blit_surf( SHADOW_ALPHA );
286 }
287 DEST(sdl.screen, paddle.x, paddle.y, paddle_cw, paddle_ch);
288 SOURCE(paddle_pic, 0, paddle_pic_y_offset);
289 if ( !active[EX_DARKNESS] )
290 blit_surf();
291 else
292 alpha_blit_surf( 128 );
293 /* middle part */
294 for ( i = paddle_cw, rem_middle_w = paddle.w - ( paddle_cw << 1 ); rem_middle_w > 0; i += paddle_cw, rem_middle_w -= paddle_cw ) {
295 if ( rem_middle_w > paddle_cw )
296 aux_w = paddle_cw;
297 else
298 aux_w = rem_middle_w;
299 if ( config.shadow ) {
300 DEST(sdl.screen, paddle.x + shadow_size + i, paddle.y + shadow_size, aux_w, paddle_ch);
301 SOURCE(paddle_shadow, paddle_cw, 0);
302 alpha_blit_surf( SHADOW_ALPHA );
303 }
304 DEST(sdl.screen, paddle.x + i, paddle.y, aux_w, paddle_ch);
305 SOURCE(paddle_pic, paddle_cw, paddle_pic_y_offset);
306 if ( !active[EX_DARKNESS] )
307 blit_surf();
308 else
309 alpha_blit_surf( 128 );
310 }
311 i = paddle.w - paddle_cw;
312 /* right end */
313 if ( config.shadow ) {
314 DEST(sdl.screen, paddle.x + shadow_size + i, paddle.y + shadow_size, paddle_cw, paddle_ch);
315 SOURCE(paddle_shadow, paddle_cw * 2, 0);
316 alpha_blit_surf( SHADOW_ALPHA );
317 }
318 DEST(sdl.screen, paddle.x + i, paddle.y, paddle_cw, paddle_ch);
319 SOURCE(paddle_pic, paddle_cw * 2, paddle_pic_y_offset);
320 if ( !active[EX_DARKNESS] )
321 blit_surf();
322 else
323 alpha_blit_surf( 128 );
324 /* weapon */
325 if ( weapon_inst ) {
326 weapon_x = paddle.x + (paddle.w - weapon_w) / 2;
327 weapon_y = paddle.y - weapon_y_off;
328 DEST(sdl.screen, weapon_x, weapon_y, weapon_w, weapon_h);
329 SOURCE(weapon_pic, (int)weapon_cur * weapon_w, 0);
330 if ( !active[EX_DARKNESS] )
331 blit_surf();
332 else
333 alpha_blit_surf( 128 );
334 add_refresh_rect(paddle.x, weapon_y, w, h);
335 }
336 else
337 add_refresh_rect(paddle.x, paddle.y, w, h);
338 if ( config.shadow ) set_surf_clip( sdl.screen, 0, 0, 0, 0 );
339 }
340 void paddle_alphashow( int a )
341 {
342 int i, aux_w;
343 int rem_middle_w;
344 /* left end */
345 DEST(sdl.screen, paddle.x, paddle.y, paddle_cw, paddle_ch);
346 SOURCE(paddle_pic, 0, paddle_pic_y_offset);
347 alpha_blit_surf(a);
348 /* middle part */
349 for ( i = paddle_cw, rem_middle_w = paddle.w - ( paddle_cw << 1 ); rem_middle_w > 0; i += paddle_cw, rem_middle_w -= paddle_cw ) {
350 if ( rem_middle_w > paddle_cw )
351 aux_w = paddle_cw;
352 else
353 aux_w = rem_middle_w;
354 DEST(sdl.screen, paddle.x + i, paddle.y, aux_w, paddle_ch);
355 SOURCE(paddle_pic, paddle_cw, paddle_pic_y_offset);
356 alpha_blit_surf(a);
357 }
358 i = paddle.w - paddle_cw;
359 /* right end */
360 DEST(sdl.screen, paddle.x + i, paddle.y, paddle_cw, paddle_ch);
361 SOURCE(paddle_pic, paddle_cw * 2, paddle_pic_y_offset);
362 alpha_blit_surf(a);
363 if ( weapon_inst ) {
364 weapon_x = paddle.x + (paddle.w - weapon_w) / 2;
365 weapon_y = paddle.y - weapon_y_off;
366 DEST(sdl.screen, weapon_x, weapon_y, weapon_w, weapon_h);
367 SOURCE(weapon_pic, (int)weapon_cur * weapon_w, 0);
368 alpha_blit_surf(a);
369 add_refresh_rect(paddle.x, weapon_y, paddle.w, weapon_h);
370 }
371 else
372 add_refresh_rect(paddle.x, paddle.y, paddle.w, paddle.h);
373 }
374 /*
375 ====================================================================
376 Update position of paddle and weapon animation if any.
377 ====================================================================
378 */
379 void paddle_update( int ms )
380 {
381 #ifdef PADDLE_FRICTION
382 int old_x = paddle.x;
383 int off_x;
384 #endif
385 int moved = 0;
386
387 if ( paddle_frozen ) {
388 #ifdef PADDLE_FRICTION
389 paddle.v_x = 0;
390 #endif
391 return;
392 }
393 /* invisiblity */
394 if ( paddle_invis && paddle_invis_delay > 0 ) {
395 paddle_invis_delay -= ms;
396 if ( paddle_invis_delay < 0 ) paddle_invis_delay = 0;
397 }
398 /* mouse motion */
399 if (motion && config.control != 0) {
400 if (config.rel_motion)
401 paddle.cur_x += motion_rel_x;
402 else
403 paddle.cur_x = motion_x - ( paddle.w >> 1 );
404 #ifdef PADDLE_FRICTION
405 paddle.time = 200;
406 #endif
407 moved = 1;
408 }
409 /* keys */
410 if (keystate[config.k_left] && config.control != 1) {
411 paddle.cur_x -= config.key_speed * ms;
412 paddle.time = 0;
413 moved = 1;
414 }
415 if (keystate[config.k_right] && config.control != 1) {
416 paddle.cur_x += config.key_speed * ms;
417 paddle.time = 0;
418 moved = 1;
419 }
420 #ifdef PADDLE_FRICTION
421 /* paddle should have friction for some time */
422 if (paddle.time > 0) {
423 paddle.time -= ms;
424 if (paddle.time < 0) {
425 paddle.time = 0;
426 paddle.v_x = 0.0;
427 }
428 }
429 else
430 paddle.v_x = 0.0;
431 #endif
432 /* check paddle when moved */
433 if ( moved ) {
434 /* check range */
435 if (paddle.cur_x < BRICK_WIDTH)
436 paddle.cur_x = BRICK_WIDTH;
437 if (paddle.cur_x + paddle.w >= sdl.screen->w - BRICK_WIDTH)
438 paddle.cur_x = sdl.screen->w - BRICK_WIDTH - paddle.w;
439 /* absolute position */
440 paddle.x = (int)paddle.cur_x;
441 #ifdef PADDLE_FRICTION
442 /* offset */
443 off_x = paddle.x - old_x;
444 /* speed */
445 paddle.v_x = (float)(off_x) / ms;
446 if ( motion ) {
447 /* limit mouse speed */
448 if (paddle.v_x > 5.0) paddle.v_x = 5.0;
449 if (paddle.v_x < -5.0) paddle.v_x = -5.0;
450 paddle.v_x /= 5;
451 }
452 /* visible for some time */
453 paddle_invis_delay = PADDLE_INVIS_DELAY;
454 #endif
455 }
456 /* weapon animation */
457 if ( weapon_inst ) {
458 weapon_cur += ms * weapon_fpms;
459 if (weapon_cur >= weapon_fr_num) weapon_cur -= weapon_fr_num;
460 }
461 if ( weapon_inst && weapon_fire && delay_timed_out( &weapon_delay, ms ) && shots_below_limit() )
462 shot_create( paddle.x + ( paddle.w >> 1 ), weapon_y + ( weapon_h >> 1 ) );
463 /* check for resize */
464 paddle_resize( ms );
465 }
466 /*
467 ====================================================================
468 De/Activate weapon
469 ====================================================================
470 */
471 void weapon_install( int install )
472 {
473 weapon_inst = install;
474 if ( !install ) weapon_stop_fire();
475 }
476 /*
477 ====================================================================
478 Check if weapon's installed
479 ====================================================================
480 */
481 int weapon_installed()
482 {
483 return weapon_inst;
484 }
485 /*
486 ====================================================================
487 Start firing at maxium rate until weapon_stop() is called.
488 ====================================================================
489 */
490 void weapon_start_fire()
491 {
492 delay_reset( &weapon_delay );
493 if ( shots_below_limit() ) shot_create( paddle.x + ( paddle.w >> 1 ), weapon_y + ( weapon_h >> 1 ) );
494 weapon_fire = 1;
495 }
496 void weapon_stop_fire()
497 {
498 weapon_fire = 0;
499 }
500 /*
501 ====================================================================
502 weapon_firing() returns true if weapon is firing
503 ====================================================================
504 */
505 int weapon_firing()
506 {
507 return weapon_fire;
508 }
+0
-121
src/paddle.h less more
0 /***************************************************************************
1 paddle.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /* if this is not defined paddle has no velocity balls are reflected by convex surface */
18 #define PADDLE_FRICTION
19
20 typedef struct {
21 float cur_x;
22 int x, y;
23 #ifdef PADDLE_FRICTION
24 float v_x;
25 #endif
26 int w, h; /* actual measures */
27 int wanted_w; /* resize until w == wanted_w */
28 int len; /* how many middle components ? */
29 int max_len; /* limit */
30 float friction; /* how much relative speed is given to balls ? */
31 int time;
32 } Paddle;
33
34 /*
35 ====================================================================
36 Load and free paddle graphics.
37 ====================================================================
38 */
39 void paddle_load();
40 void paddle_delete();
41 /*
42 ====================================================================
43 Reset position and size of paddle.
44 ====================================================================
45 */
46 void paddle_reset();
47 /*
48 ====================================================================
49 Freeze paddle movement or set slime.
50 ====================================================================
51 */
52 void paddle_freeze( int freeze );
53 void paddle_set_slime( int slime );
54 int paddle_slimy();
55 /*
56 ====================================================================
57 Set if paddle attracts boni/mali or none.
58 ====================================================================
59 */
60 enum {
61 ATTRACT_NONE = 0,
62 ATTRACT_BONUS,
63 ATTRACT_MALUS
64 };
65 void paddle_set_attract( int attract );
66 int paddle_attract_malus();
67 int paddle_attract_bonus();
68 /*
69 ====================================================================
70 (De)activate ghostly behaviour: paddle is only seen when moved at
71 maximum 250ms before.
72 ====================================================================
73 */
74 void paddle_set_invis( int invis );
75 int paddle_solid();
76 /*
77 ====================================================================
78 Resize paddle
79 ====================================================================
80 */
81 int paddle_init_resize( int c );
82 /*
83 ====================================================================
84 Hide and show paddle on screen.
85 ====================================================================
86 */
87 void paddle_hide();
88 void paddle_show();
89 void paddle_alphashow( int a );
90 /*
91 ====================================================================
92 Update position of paddle and weapon animation if any.
93 ====================================================================
94 */
95 void paddle_update( int ms );
96 /*
97 ====================================================================
98 De/Activate weapon
99 ====================================================================
100 */
101 void weapon_install( int install );
102 /*
103 ====================================================================
104 Check if weapon's installed
105 ====================================================================
106 */
107 int weapon_installed();
108 /*
109 ====================================================================
110 Start firing at maxium rate until weapon_stop() is called.
111 ====================================================================
112 */
113 void weapon_start_fire();
114 void weapon_stop_fire();
115 /*
116 ====================================================================
117 weapon_firing() returns true if weapon is firing
118 ====================================================================
119 */
120 int weapon_firing();
+0
-121
src/player.c less more
0 /***************************************************************************
1 player.c - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "levels.h"
18 #include "player.h"
19
20 int current_player = 0;
21 int player_count = 0;
22 Player players[MAX_PLAYERS];
23
24 /*
25 ====================================================================
26 Add this player to the list and increase the counter until
27 MAX_PLAYERS is reached.
28 Return Value: True if successful
29 ====================================================================
30 */
31 int player_add( char *name, int lives, Level *level )
32 {
33 if ( player_count == MAX_PLAYERS ) return 0;
34 strcpy( players[player_count].name, name );
35 players[player_count].score = players[player_count].old_score = 0;
36 players[player_count].lives = lives;
37 players[player_count].level = level;
38 player_reset_bricks( &players[player_count] );
39 player_count++;
40 return 1;
41 }
42 /*
43 ====================================================================
44 Reset bricks array of this player.
45 ====================================================================
46 */
47 void player_reset_bricks( Player *player )
48 {
49 int i, j;
50 for ( i = 0; i < MAP_WIDTH; i++ )
51 for ( j = 0; j < MAP_HEIGHT; j++ ) {
52 player->bricks[i][j] = -99; /* undefined duration which means it is initalized by game_init_level */
53 player->grown_bricks[i][j] = 0; /* would be a wall that can't be grown so this means no brick there */
54 }
55 }
56 /*
57 ====================================================================
58 Return true if the score of this player changed since _last_
59 call of this function.
60 ====================================================================
61 */
62 int player_score_changed( Player *player )
63 {
64 if ( player->old_score != player->score ) {
65 player->old_score = player->score;
66 return 1;
67 }
68 return 0;
69 }
70 /*
71 ====================================================================
72 Get first player.
73 Return Value: first player in list
74 ====================================================================
75 */
76 Player* players_get_first()
77 {
78 current_player = -1;
79 return players_get_next();
80 }
81 /*
82 ====================================================================
83 Get next player in list (cycle: return first player after
84 last player).
85 Return Value: current player
86 ====================================================================
87 */
88 Player* players_get_next()
89 {
90 if ( players_count() == 0 ) return 0;
91 do {
92 current_player++;
93 if ( current_player == player_count ) current_player = 0;
94 }
95 while ( players[current_player].lives == 0 );
96 return &players[current_player];
97 }
98 /*
99 ====================================================================
100 Reset player counter.
101 ====================================================================
102 */
103 void players_clear()
104 {
105 player_count = 0;
106 }
107 /*
108 ====================================================================
109 Return number of players still in game (lives > 0)
110 ====================================================================
111 */
112 int players_count()
113 {
114 int i;
115 int count = 0;
116 for ( i = 0; i < player_count; i++ )
117 if ( players[i].lives > 0 )
118 count++;
119 return count;
120 }
+0
-81
src/player.h less more
0 /***************************************************************************
1 player.h - description
2 -------------------
3 begin : Thu Sep 6 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Player information. Names are saved in the config.
20 ====================================================================
21 */
22 enum { MAX_PLAYERS = 4 };
23 typedef struct {
24 char name[32]; /* name */
25 int score; /* current score */
26 int old_score; /* used to determine score change */
27 int lives; /* lives remaining */
28 Level *level; /* current level */
29 int bricks[MAP_WIDTH][MAP_HEIGHT]; /* duration of level bricks */
30 int grown_bricks[MAP_WIDTH][MAP_HEIGHT]; /* if not NULL the id of the brick to grow */
31 } Player;
32
33 /*
34 ====================================================================
35 Add this player to the list and increase the counter until
36 MAX_PLAYERS is reached.
37 Return Value: True if successful
38 ====================================================================
39 */
40 int player_add( char *name, int lives, Level *level );
41 /*
42 ====================================================================
43 Reset bricks array of this player.
44 ====================================================================
45 */
46 void player_reset_bricks( Player *player );
47 /*
48 ====================================================================
49 Return true if the score of this player changed since _last_
50 call of this function.
51 ====================================================================
52 */
53 int player_score_changed( Player *player );
54 /*
55 ====================================================================
56 Get first player.
57 Return Value: first player in list
58 ====================================================================
59 */
60 Player* players_get_first();
61 /*
62 ====================================================================
63 Get next player in list (cycle: return first player after
64 last player).
65 Return Value: current player
66 ====================================================================
67 */
68 Player* players_get_next();
69 /*
70 ====================================================================
71 Reset player counter.
72 ====================================================================
73 */
74 void players_clear();
75 /*
76 ====================================================================
77 Return number of players still in game (lives > 0)
78 ====================================================================
79 */
80 int players_count();
+0
-1235
src/sdl.c less more
0 /***************************************************************************
1 sdl.c - description
2 -------------------
3 begin : Thu Apr 20 2000
4 copyright : (C) 2000 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <SDL.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include "sdl.h"
21
22 #ifdef USE_PNG
23 #include <png.h>
24 #endif
25
26 extern int term_game;
27
28 Sdl sdl;
29 SDL_Cursor *empty_cursor = 0;
30 SDL_Cursor *std_cursor = 0;
31
32 /*
33 ====================================================================
34 Default video modes. The first value is the id and indicates
35 if a mode is a standard video mode. If the mode was created by
36 directly by video_mode() this id is set to -1. The very last
37 value indicates if this is a valid mode and is checked by
38 init_sdl(). Init_sdl sets the available desktop bit depth.
39 ====================================================================
40 */
41 int const mode_count = 2;
42 Video_Mode modes[] = {
43 { 0, "640x480x16 Window", 640, 480, 16, SDL_SWSURFACE, 0 },
44 { 1, "640x480x16 Fullscreen", 640, 480, 16, SDL_SWSURFACE | SDL_FULLSCREEN, 0 },
45 };
46 Video_Mode *def_mode = &modes[0]; /* default resolution */
47 Video_Mode cur_mode; /* current video mode set in set_video_mode */
48
49 /* timer */
50 int cur_time, last_time;
51
52 /* sdl surface */
53
54 #ifdef USE_PNG
55 /* loads an image from png file and returns surface
56 * or NULL in case of error;
57 * you can get additional information with SDL_GetError
58 *
59 * stolen from SDL_image:
60 *
61 * Copyright (C) 1999 Sam Lantinga
62 *
63 * Sam Lantinga
64 * 5635-34 Springhouse Dr.
65 * Pleasanton, CA 94588 (USA)
66 * slouken@devolution.com
67 */
68 SDL_Surface *load_png( const char *file )
69 {
70 FILE *volatile fp = NULL;
71 SDL_Surface *volatile surface = NULL;
72 png_structp png_ptr = NULL;
73 png_infop info_ptr = NULL;
74 png_bytep *volatile row_pointers = NULL;
75 png_uint_32 width, height;
76 int bit_depth, color_type, interlace_type;
77 Uint32 Rmask;
78 Uint32 Gmask;
79 Uint32 Bmask;
80 Uint32 Amask;
81 SDL_Palette *palette;
82 int row, i;
83 volatile int ckey = -1;
84 png_color_16 *transv;
85
86 /* create the PNG loading context structure */
87 png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING,
88 NULL, NULL, NULL );
89 if( png_ptr == NULL ) {
90 SDL_SetError( "Couldn't allocate memory for PNG file" );
91 goto done;
92 }
93
94 /* allocate/initialize the memory for image information. REQUIRED. */
95 info_ptr = png_create_info_struct( png_ptr );
96 if( info_ptr == NULL ) {
97 SDL_SetError( "Couldn't create image information for PNG file" );
98 goto done;
99 }
100
101 /* set error handling if you are using setjmp/longjmp method (this is
102 * the normal method of doing things with libpng). REQUIRED unless you
103 * set up your own error handlers in png_create_read_struct() earlier.
104 */
105 if( setjmp( png_ptr->jmpbuf ) ) {
106 SDL_SetError( "Error reading the PNG file." );
107 goto done;
108 }
109
110 /* open file */
111 fp = fopen( file, "r" );
112 if( fp == NULL ) {
113 SDL_SetError( "Could not open png file." );
114 goto done;
115 }
116 png_init_io( png_ptr, fp );
117
118 /* read PNG header info */
119 png_read_info( png_ptr, info_ptr );
120 png_get_IHDR( png_ptr, info_ptr, &width, &height, &bit_depth,
121 &color_type, &interlace_type, NULL, NULL );
122
123 /* tell libpng to strip 16 bit/color files down to 8 bits/color */
124 png_set_strip_16( png_ptr );
125
126 /* extract multiple pixels with bit depths of 1, 2, and 4 from a single
127 * byte into separate bytes (useful for paletted and grayscale images).
128 */
129 png_set_packing( png_ptr );
130
131 /* scale greyscale values to the range 0..255 */
132 if( color_type == PNG_COLOR_TYPE_GRAY )
133 png_set_expand( png_ptr );
134
135 /* for images with a single "transparent colour", set colour key;
136 if more than one index has transparency, use full alpha channel */
137 if( png_get_valid( png_ptr, info_ptr, PNG_INFO_tRNS ) ) {
138 int num_trans;
139 Uint8 *trans;
140 png_get_tRNS( png_ptr, info_ptr, &trans, &num_trans,
141 &transv );
142 if( color_type == PNG_COLOR_TYPE_PALETTE ) {
143 if( num_trans == 1 ) {
144 /* exactly one transparent value: set colour key */
145 ckey = trans[0];
146 } else
147 png_set_expand( png_ptr );
148 } else
149 ckey = 0; /* actual value will be set later */
150 }
151
152 if( color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
153 png_set_gray_to_rgb( png_ptr );
154
155 png_read_update_info( png_ptr, info_ptr );
156
157 png_get_IHDR( png_ptr, info_ptr, &width, &height, &bit_depth,
158 &color_type, &interlace_type, NULL, NULL );
159
160 /* allocate the SDL surface to hold the image */
161 Rmask = Gmask = Bmask = Amask = 0 ;
162 if( color_type != PNG_COLOR_TYPE_PALETTE ) {
163 if( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {
164 Rmask = 0x000000FF;
165 Gmask = 0x0000FF00;
166 Bmask = 0x00FF0000;
167 Amask = (info_ptr->channels == 4) ? 0xFF000000 : 0;
168 } else {
169 int s = (info_ptr->channels == 4) ? 0 : 8;
170 Rmask = 0xFF000000 >> s;
171 Gmask = 0x00FF0000 >> s;
172 Bmask = 0x0000FF00 >> s;
173 Amask = 0x000000FF >> s;
174 }
175 }
176 surface = SDL_AllocSurface( SDL_SWSURFACE, width, height,
177 bit_depth * info_ptr->channels, Rmask, Gmask, Bmask, Amask );
178 if( surface == NULL ) {
179 SDL_SetError( "Out of memory" );
180 goto done;
181 }
182
183 if( ckey != -1 ) {
184 if( color_type != PNG_COLOR_TYPE_PALETTE )
185 /* FIXME: should these be truncated or shifted down? */
186 ckey = SDL_MapRGB( surface->format,
187 (Uint8)transv->red,
188 (Uint8)transv->green,
189 (Uint8)transv->blue );
190 SDL_SetColorKey( surface, SDL_SRCCOLORKEY, ckey );
191 }
192
193 /* create the array of pointers to image data */
194 row_pointers = (png_bytep*)malloc( sizeof( png_bytep ) * height );
195 if( ( row_pointers == NULL ) ) {
196 SDL_SetError( "Out of memory" );
197 SDL_FreeSurface( surface );
198 surface = NULL;
199 goto done;
200 }
201 for( row = 0; row < (int)height; row++ ) {
202 row_pointers[row] = (png_bytep)
203 (Uint8*)surface->pixels + row * surface->pitch;
204 }
205
206 /* read the entire image in one go */
207 png_read_image( png_ptr, row_pointers );
208
209 /* read rest of file, get additional chunks in info_ptr - REQUIRED */
210 png_read_end( png_ptr, info_ptr );
211
212 /* load the palette, if any */
213 palette = surface->format->palette;
214 if( palette ) {
215 if( color_type == PNG_COLOR_TYPE_GRAY ) {
216 palette->ncolors = 256;
217 for( i = 0; i < 256; i++ ) {
218 palette->colors[i].r = i;
219 palette->colors[i].g = i;
220 palette->colors[i].b = i;
221 }
222 } else if( info_ptr->num_palette > 0 ) {
223 palette->ncolors = info_ptr->num_palette;
224 for( i = 0; i < info_ptr->num_palette; ++i ) {
225 palette->colors[i].b = info_ptr->palette[i].blue;
226 palette->colors[i].g = info_ptr->palette[i].green;
227 palette->colors[i].r = info_ptr->palette[i].red;
228 }
229 }
230 }
231
232 done:
233 /* clean up and return */
234 png_destroy_read_struct( &png_ptr, info_ptr ? &info_ptr : (png_infopp)0,
235 (png_infopp)0 );
236 if( row_pointers )
237 free( row_pointers );
238 if( fp )
239 fclose( fp );
240
241 return surface;
242 }
243 #endif
244
245 /* return full path of bitmap */
246 inline void get_full_bmp_path( char *full_path, char *file_name )
247 {
248 sprintf(full_path, "%s/gfx/%s", SRC_DIR, file_name );
249 }
250
251 /*
252 load a surface from file putting it in soft or hardware mem
253 */
254 SDL_Surface* load_surf(char *_fname, int f)
255 {
256 SDL_Surface *buf;
257 SDL_Surface *new_sur;
258 char path[ 512 ];
259 SDL_PixelFormat *spf;
260 int last;
261 char *fname = strdup( _fname );
262
263 #ifdef USE_PNG
264 /* override file name as all graphics were changed from
265 bitmap to png so the extension must be corrected */
266 last = strlen( fname ) - 1;
267 fname[last-2] = 'p';
268 fname[last-1] = 'n';
269 fname[last] = 'g';
270 if ( fname[0] != '/' )
271 get_full_bmp_path( path, fname );
272 else
273 strcpy( path, fname );
274 buf = load_png( path );
275 #else
276 if ( fname[0] != '/' )
277 get_full_bmp_path( path, fname );
278 else
279 strcpy( path, fname );
280 buf = SDL_LoadBMP( path );
281 #endif
282 if ( buf == 0 ) {
283
284 if ( f & SDL_NONFATAL ) {
285 free( fname );
286 return 0;
287 }
288 else {
289 fprintf( stderr, "File Not Found: %s, %s\n", path, SDL_GetError() );
290 free( fname );
291 exit( 1 );
292 }
293
294 }
295 /* if ( !(f & SDL_HWSURFACE) ) {
296
297 SDL_SetColorKey( buf, SDL_SRCCOLORKEY, 0x0 );
298 return buf;
299
300 }
301 new_sur = create_surf(buf->w, buf->h, f);
302 SDL_BlitSurface(buf, 0, new_sur, 0);
303 SDL_FreeSurface(buf);*/
304 spf = SDL_GetVideoSurface()->format;
305 new_sur = SDL_ConvertSurface( buf, spf, f );
306 SDL_FreeSurface( buf );
307 SDL_SetColorKey( new_sur, SDL_SRCCOLORKEY, 0x0 );
308 SDL_SetAlpha( new_sur, 0, 0 ); /* no alpha */
309 free( fname );
310 return new_sur;
311 }
312
313 /*
314 create an surface
315 MUST NOT BE USED IF NO SDLSCREEN IS SET
316 */
317 SDL_Surface* create_surf(int w, int h, int f)
318 {
319 SDL_Surface *sur;
320 SDL_PixelFormat *spf = SDL_GetVideoSurface()->format;
321 if ((sur = SDL_CreateRGBSurface(f, w, h, spf->BitsPerPixel, spf->Rmask, spf->Gmask, spf->Bmask, spf->Amask)) == 0) {
322 fprintf(stderr, "create_surf: not enough memory to create surface...\n");
323 exit(1);
324 }
325 /* if (f & SDL_HWSURFACE && !(sur->flags & SDL_HWSURFACE))
326 fprintf(stderr, "unable to create surface (%ix%ix%i) in hardware memory...\n", w, h, spf->BitsPerPixel);*/
327 SDL_SetColorKey(sur, SDL_SRCCOLORKEY, 0x0);
328 SDL_SetAlpha(sur, 0, 0); /* no alpha */
329 return sur;
330 }
331
332 /*
333 * Free a surface if != NULL and set pointer to NULL
334 */
335 void free_surf( SDL_Surface **surf )
336 {
337 if ( *surf ) SDL_FreeSurface( *surf );
338 *surf = 0;
339 }
340 /*
341 lock surface
342 */
343 inline void lock_surf(SDL_Surface *sur)
344 {
345 if (SDL_MUSTLOCK(sur))
346 SDL_LockSurface(sur);
347 }
348
349 /*
350 unlock surface
351 */
352 inline void unlock_surf(SDL_Surface *sur)
353 {
354 if (SDL_MUSTLOCK(sur))
355 SDL_UnlockSurface(sur);
356 }
357
358 /*
359 blit surface with destination DEST and source SOURCE using it's actual alpha and color key settings
360 */
361 void blit_surf(void)
362 {
363 #ifdef SDL_1_1_5
364 if (sdl.s.s->flags & SDL_SRCALPHA)
365 SDL_SetAlpha(sdl.s.s, SDL_SRCALPHA, 255 - sdl.s.s->format->alpha);
366 #endif
367 SDL_BlitSurface(sdl.s.s, &sdl.s.r, sdl.d.s, &sdl.d.r);
368 #ifdef SDL_1_1_5
369 if (sdl.s.s->flags & SDL_SRCALPHA)
370 SDL_SetAlpha(sdl.s.s, SDL_SRCALPHA, 255 - sdl.s.s->format->alpha);
371 #endif
372 }
373
374 /*
375 do an alpha blit
376 */
377 void alpha_blit_surf(int alpha)
378 {
379 #ifdef SDL_1_1_5
380 SDL_SetAlpha(sdl.s.s, SDL_SRCALPHA, 255 - alpha);
381 #else
382 SDL_SetAlpha(sdl.s.s, SDL_SRCALPHA, alpha);
383 #endif
384 SDL_BlitSurface(sdl.s.s, &sdl.s.r, sdl.d.s, &sdl.d.r);
385 SDL_SetAlpha(sdl.s.s, 0, 0);
386 }
387
388 /*
389 fill surface with color c
390 */
391 void fill_surf(int c)
392 {
393 SDL_FillRect(sdl.d.s, &sdl.d.r, SDL_MapRGB(sdl.d.s->format, c >> 16, (c >> 8) & 0xFF, c & 0xFF));
394 }
395
396 /* set clipping rect */
397 void set_surf_clip( SDL_Surface *surf, int x, int y, int w, int h )
398 {
399 #ifdef SDL_1_1_5
400 SDL_Rect rect = { x, y, w, h };
401 if ( w == h || h == 0 )
402 SDL_SetClipRect( surf, 0 );
403 else
404 SDL_SetClipRect( surf, &rect );
405 #else
406 SDL_SetClipping( surf, x, y, w, h );
407 #endif
408 }
409
410 /* set pixel */
411 Uint32 set_pixel( SDL_Surface *surf, int x, int y, int pixel )
412 {
413 int pos = 0;
414
415 pos = y * surf->pitch + x * surf->format->BytesPerPixel;
416 memcpy( surf->pixels + pos, &pixel, surf->format->BytesPerPixel );
417 return pixel;
418 }
419
420 /* get pixel */
421 Uint32 get_pixel( SDL_Surface *surf, int x, int y )
422 {
423 int pos = 0;
424 Uint32 pixel = 0;
425
426 pos = y * surf->pitch + x * surf->format->BytesPerPixel;
427 memcpy( &pixel, surf->pixels + pos, surf->format->BytesPerPixel );
428 return pixel;
429 }
430
431 /* draw a shadowed frame and darken contents which starts at cx,cy */
432 void draw_3dframe( SDL_Surface *surf, int cx, int cy, int w, int h, int border )
433 {
434 int i, j;
435 SDL_Surface *frame = 0;
436 SDL_Surface *contents = 0;
437 frame = create_surf( w + border * 2, h + border * 2, SDL_SWSURFACE );
438 SDL_SetColorKey( frame, SDL_SRCCOLORKEY, SDL_MapRGB( surf->format, 0xff, 0, 0 ) );
439 FULL_DEST( frame ); fill_surf ( 0xff0000 );
440 /* move contents by border size -1 */
441 DEST( surf, cx, cy, w, h );
442 SOURCE( surf, cx - border + 1, cy - border + 1 );
443 blit_surf();
444 /* shadow part */
445 FULL_DEST( frame ); fill_surf ( 0xff0000 );
446 DEST( frame, 0, 0, w + border, border ); fill_surf( 0x0 );
447 DEST( frame, 0, 0, border, h + border ); fill_surf( 0x0 );
448 for ( i = 0; i < border; i++ ) {
449 for ( j = 0; j < border; j++ ) {
450 if ( i < j )
451 set_pixel( frame, border + w + i, border - j - 1, SDL_MapRGB( frame->format, 0,0,0 ) );
452 }
453 }
454 for ( i = 0; i < border; i++ ) {
455 for ( j = 0; j < border; j++ ) {
456 if ( i > j )
457 set_pixel( frame, border - i - 1, border + h + j, SDL_MapRGB( frame->format, 0,0,0 ) );
458 }
459 }
460 DEST( surf, cx - border, cy - border, w + border * 2, h + border * 2 );
461 SOURCE( frame, 0, 0 );
462 alpha_blit_surf( 48 );
463 /* bright part */
464 FULL_DEST( frame ); fill_surf ( 0xff0000 );
465 DEST( frame, w + border, border, border, h + border ); fill_surf( 0xffffff );
466 DEST( frame, border, h + border, w + border, border ); fill_surf( 0xffffff );
467 for ( i = 0; i < border; i++ ) {
468 for ( j = 0; j < border; j++ ) {
469 if ( i >= j )
470 set_pixel( frame, border + w + i, border - j - 1, SDL_MapRGB( frame->format, 0xff,0xff,0xff ) );
471 }
472 }
473 for ( i = 0; i < border; i++ ) {
474 for ( j = 0; j < border; j++ ) {
475 if ( i <= j )
476 set_pixel( frame, border - i - 1, border + h + j, SDL_MapRGB( frame->format, 0xff,0xff,0xff ) );
477 }
478 }
479 DEST( surf, cx - border, cy - border, w + border * 2, h + border * 2 );
480 SOURCE( frame, 0, 0 );
481 alpha_blit_surf( 128 );
482 /* darken contents */
483 contents = create_surf( w, h, SDL_SWSURFACE );
484 SDL_SetColorKey( contents, 0, 0 );
485 FULL_DEST( contents ); fill_surf( 0x0 );
486 DEST( surf, cx, cy, w, h );
487 SOURCE( contents, 0, 0 );
488 alpha_blit_surf( 96 );
489
490 SDL_FreeSurface( contents );
491 SDL_FreeSurface( frame );
492 }
493
494 /* sdl font */
495
496 /* return full font path */
497 void get_full_font_path( char *path, char *file_name )
498 {
499 strcpy( path, file_name );
500 /* sprintf(path, "./gfx/fonts/%s", file_name ); */
501 }
502
503 /*
504 load a font using the width values in the file
505 */
506 Font* load_font(char *fname)
507 {
508 Font *fnt = 0;
509 FILE *file = 0;
510 char path[512];
511 int i;
512
513 get_full_font_path( path, fname );
514
515 fnt = malloc(sizeof(Font));
516 if (fnt == 0) {
517 fprintf(stderr, "load_font: not enough memory\n");
518 exit(1);
519 }
520
521 if ((fnt->pic = load_surf(path, SDL_HWSURFACE)) == 0)
522 exit(1);
523 /* use very first pixel as transparency key */
524 SDL_SetColorKey( fnt->pic, SDL_SRCCOLORKEY, get_pixel( fnt->pic, 0, 0 ) );
525
526 fnt->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
527 fnt->color = 0x00FFFFFF;
528 fnt->height = fnt->pic->h;
529
530 /* table */
531 file = fopen(path, "r");
532 fseek(file, -1, SEEK_END);
533 fread(&fnt->offset, 1, 1, file);
534 #ifdef SDL_DEBUG
535 printf("offset: %i\n", fnt->offset);
536 #endif
537 fseek(file, -2, SEEK_END);
538 fread(&fnt->length, 1, 1, file);
539 #ifdef SDL_DEBUG
540 printf("number: %i\n", fnt->length);
541 #endif
542 fseek(file, -2 - fnt->length, SEEK_END);
543 fread(fnt->char_width, 1, fnt->length, file);
544 #ifdef SDL_DEBUG
545 printf("letter width: %i\n", fnt->length);
546 for (i = 0; i < fnt->length; i++)
547 printf("%i ", fnt->char_width[i]);
548 printf("\n");
549 #endif
550 fclose(file);
551
552 /* letter offsets */
553 fnt->char_offset[0] = 0;
554 for (i = 1; i < fnt->length; i++)
555 fnt->char_offset[i] = fnt->char_offset[i - 1] + fnt->char_width[i - 1];
556
557 /* allowed keys */
558 memset(fnt->keys, 0, 256);
559 for (i = 0; i < fnt->length; i++) {
560 fnt->keys[i + fnt->offset] = 1;
561 }
562
563 fnt->last_x = fnt->last_y = fnt->last_width = fnt->last_height = 0;
564 return fnt;
565 }
566
567 /*
568 load a font with fixed size
569 */
570 Font *load_fixed_font(char *f, int off, int len, int w, int flags )
571 {
572 int i;
573 Font *fnt;
574 char path[512];
575
576 get_full_font_path( path, f );
577
578 fnt = malloc(sizeof(Font));
579 if (fnt == 0) {
580 fprintf(stderr, "load_fixed_font: not enough memory\n");
581 exit(1);
582 }
583
584 if ((fnt->pic = load_surf(path, flags)) == 0)
585 return 0;
586 /* use very first pixel as transparency key */
587 SDL_SetColorKey( fnt->pic, SDL_SRCCOLORKEY, get_pixel( fnt->pic, 0, 0 ) );
588
589 fnt->align = ALIGN_X_LEFT | ALIGN_Y_TOP;
590 fnt->color = 0x00FFFFFF;
591 fnt->height = fnt->pic->h;
592
593 fnt->offset = off;
594 fnt->length = len;
595
596 for (i = 0; i < len; i++)
597 fnt->char_width[i] = w;
598
599 /* letter offsets */
600 fnt->char_offset[0] = 0;
601 for (i = 1; i < fnt->length; i++)
602 fnt->char_offset[i] = fnt->char_offset[i - 1] + w;
603
604 /* allowed keys*/
605 memset(fnt->keys, 0, 256);
606 for (i = 0; i < fnt->length; i++) {
607 fnt->keys[i + fnt->offset] = 1;
608 }
609
610 fnt->last_x = fnt->last_y = fnt->last_width = fnt->last_height = 0;
611 return fnt;
612 }
613
614 /*
615 free memory
616 */
617 void free_font(Font **fnt)
618 {
619 if ( *fnt == 0 ) return;
620 if ( (*fnt)->pic) SDL_FreeSurface( (*fnt)->pic);
621 free( *fnt );
622 *fnt = 0;
623 }
624
625 /*
626 write something with transparency
627 */
628 int write_text(Font *fnt, SDL_Surface *dest, int x, int y, char *str, int alpha)
629 {
630 int c_abs;
631 int len = strlen(str);
632 int pix_len = 0;
633 int px = x, py = y;
634 int i;
635 SDL_Surface *spf = SDL_GetVideoSurface();
636
637 pix_len = text_width(fnt, str);
638 for (i = 0; i < len; i++)
639 if (!fnt->keys[(int)str[i]])
640 str[i] = ' ';
641
642 /* alignment */
643 if (fnt->align & ALIGN_X_CENTER)
644 px -= pix_len >> 1;
645 else
646 if (fnt->align & ALIGN_X_RIGHT)
647 px -= pix_len;
648 if (fnt->align & ALIGN_Y_CENTER)
649 py -= (fnt->height >> 1 ) + 1;
650 else
651 if (fnt->align & ALIGN_Y_BOTTOM)
652 py -= fnt->height;
653
654 /* do only set last rect if font->save_last is true */
655 if ( fnt->save_last ) {
656 fnt->last_x = px; if (fnt->last_x < 0) fnt->last_x = 0;
657 fnt->last_y = py; if (fnt->last_y < 0) fnt->last_y = 0;
658 fnt->last_width = pix_len; if (fnt->last_x + fnt->last_width >= spf->w) fnt->last_width = spf->w - fnt->last_x;
659 fnt->last_height = fnt->height; if (fnt->last_y + fnt->last_height >= spf->h) fnt->last_height = spf->h - fnt->last_y;
660 }
661
662 if (alpha != 0)
663 SDL_SetAlpha(fnt->pic, SDL_SRCALPHA, alpha);
664 else
665 SDL_SetAlpha(fnt->pic, 0, 0);
666 for (i = 0; i < len; i++) {
667 c_abs = str[i] - fnt->offset;
668 DEST(dest, px, py, fnt->char_width[c_abs], fnt->height);
669 SOURCE(fnt->pic, fnt->char_offset[c_abs], 0);
670 blit_surf();
671 px += fnt->char_width[c_abs];
672 }
673
674 return 0;
675 }
676
677 /*
678 lock font surface
679 */
680 inline void lock_font(Font *fnt)
681 {
682 if (SDL_MUSTLOCK(fnt->pic))
683 SDL_LockSurface(fnt->pic);
684 }
685
686 /*
687 unlock font surface
688 */
689 inline void unlock_font(Font *fnt)
690 {
691 if (SDL_MUSTLOCK(fnt->pic))
692 SDL_UnlockSurface(fnt->pic);
693 }
694
695 /*
696 return last update region
697 */
698 SDL_Rect last_write_rect(Font *fnt)
699 {
700 SDL_Rect rect={fnt->last_x, fnt->last_y, fnt->last_width, fnt->last_height};
701 return rect;
702 }
703
704 /*
705 return the text width in pixels
706 */
707 int text_width(Font *fnt, char *str)
708 {
709 unsigned int i;
710 int pix_len = 0;
711 for (i = 0; i < strlen(str); i++)
712 pix_len += fnt->char_width[str[i] - fnt->offset];
713 return pix_len;
714 }
715
716 /* sdl */
717
718 /*
719 initialize sdl
720 */
721 void init_sdl( int f )
722 {
723 int i;
724 int valid_depth = 0;
725
726 /* check flags: if SOUND is not enabled flag SDL_INIT_AUDIO musn't be set */
727 #ifndef WITH_SOUND
728 if ( f & SDL_INIT_AUDIO )
729 f = f & ~SDL_INIT_AUDIO;
730 #endif
731
732 sdl.screen = 0;
733 if (SDL_Init(f) < 0) {
734 fprintf(stderr, "ERR: sdl_init: %s", SDL_GetError());
735 exit(1);
736 }
737 SDL_EnableUNICODE(1);
738 atexit(SDL_Quit);
739 /* check resolutions */
740 for ( i = 0; i < mode_count; i++ ) {
741 if ( ( valid_depth = SDL_VideoModeOK( modes[i].width, modes[i].height, modes[i].depth, modes[i].flags ) ) != 0 ) {
742 modes[i].depth = valid_depth;
743 modes[i].ok = 1;
744 printf( "Mode %s valid\n", modes[i].name );
745 }
746 }
747 /* reset default video mode if none found exit */
748 if ( !def_mode->ok ) {
749 for ( i = 0; i < mode_count; i++ )
750 if ( modes[i].ok ) {
751 def_mode = &modes[i];
752 break;
753 }
754 /* no valid default mode found? exit */
755 if ( i == mode_count ) {
756 fprintf( stderr, "No valid video mode found!\n" );
757 exit( 1 );
758 }
759 }
760 /* create empty cursor */
761 empty_cursor = create_cursor( 16, 16, 8, 8,
762 " "
763 " "
764 " "
765 " "
766 " "
767 " "
768 " "
769 " "
770 " "
771 " "
772 " "
773 " "
774 " "
775 " "
776 " "
777 " " );
778 std_cursor = SDL_GetCursor();
779 }
780
781 /*
782 free screen
783 */
784 void quit_sdl()
785 {
786 if (sdl.screen) SDL_FreeSurface(sdl.screen);
787 if ( empty_cursor ) SDL_FreeCursor( empty_cursor );
788 }
789
790 /*
791 ====================================================================
792 Get a verified video mode.
793 ====================================================================
794 */
795 Video_Mode def_video_mode()
796 {
797 return *def_mode;
798 }
799 Video_Mode std_video_mode( int id )
800 {
801 return modes[id];
802 }
803 Video_Mode video_mode( int width, int height, int depth, int flags )
804 {
805 Video_Mode mode;
806 /* set name */
807 sprintf( mode.name, "%ix%ix%i", width, height, depth );
808 if ( flags & SDL_FULLSCREEN )
809 strcat( mode.name, " Fullscreen" );
810 else
811 strcat( mode.name, " Window" );
812 /* check mode */
813 if ( SDL_VideoModeOK( width, height, depth, flags ) != depth ) {
814 fprintf( stderr, "video_mode: %s invalid: using default mode\n", mode.name );
815 return def_video_mode();
816 }
817 /* set and return this mode */
818 mode.id = -1;
819 mode.width = width;
820 mode.height = height;
821 mode.depth = depth;
822 mode.flags = flags;
823 return mode;
824 }
825 /*
826 ====================================================================
827 Current video mode.
828 ====================================================================
829 */
830 Video_Mode* cur_video_mode()
831 {
832 return &cur_mode;
833 }
834 /*
835 ====================================================================
836 Get a list with all valid standard mode names.
837 ====================================================================
838 */
839 char** get_mode_names( int *count )
840 {
841 char **lines;
842 int i, j;
843
844 *count = 0;
845 for ( i = 0; i < mode_count; i++ )
846 if ( modes[i].ok )
847 (*count)++;
848 lines = calloc( *count, sizeof( char* ) );
849 for ( i = 0, j = 0; i < mode_count; i++ )
850 if ( modes[i].ok )
851 lines[j++] = strdup( modes[i].name );
852 return lines;
853 }
854 /*
855 ====================================================================
856 Switch to passed video mode.
857 ====================================================================
858 */
859 int set_video_mode( Video_Mode mode )
860 {
861 #ifdef SDL_DEBUG
862 SDL_PixelFormat *fmt;
863 #endif
864
865 /* free old screen */
866 if (sdl.screen) SDL_FreeSurface( sdl.screen );
867
868 /* check again */
869 mode = video_mode( mode.width, mode.height, mode.depth, mode.flags );
870 /* set as current mode */
871 cur_mode = mode;
872
873 /* set video mode */
874 if ( ( sdl.screen = SDL_SetVideoMode( mode.width, mode.height, mode.depth, mode.flags ) ) == 0 ) {
875 fprintf(stderr, "set_video_mode: cannot allocate screen: %s", SDL_GetError());
876 return 1;
877 }
878
879 #ifdef SDL_DEBUG
880 if (f & SDL_HWSURFACE && !(sdl.screen->flags & SDL_HWSURFACE))
881 fprintf(stderr, "unable to create screen in hardware memory...\n");
882 if (f & SDL_DOUBLEBUF && !(sdl.screen->flags & SDL_DOUBLEBUF))
883 fprintf(stderr, "unable to create double buffered screen...\n");
884 if (f & SDL_FULLSCREEN && !(sdl.screen->flags & SDL_FULLSCREEN))
885 fprintf(stderr, "unable to switch to fullscreen...\n");
886
887 fmt = sdl.screen->format;
888 printf("video mode format:\n");
889 printf("Masks: R=%i, G=%i, B=%i\n", fmt->Rmask, fmt->Gmask, fmt->Bmask);
890 printf("LShft: R=%i, G=%i, B=%i\n", fmt->Rshift, fmt->Gshift, fmt->Bshift);
891 printf("RShft: R=%i, G=%i, B=%i\n", fmt->Rloss, fmt->Gloss, fmt->Bloss);
892 printf("BBP: %i\n", fmt->BitsPerPixel);
893 printf("-----\n");
894 #endif
895
896 return 0;
897 }
898
899 /*
900 show hardware capabilities
901 */
902 void hardware_cap()
903 {
904 const SDL_VideoInfo *vi = SDL_GetVideoInfo();
905 char *ny[2] = {"No", "Yes"};
906
907 printf("video hardware capabilities:\n");
908 printf("Hardware Surfaces: %s\n", ny[vi->hw_available]);
909 printf("HW_Blit (CC, A): %s (%s, %s)\n", ny[vi->blit_hw], ny[vi->blit_hw_CC], ny[vi->blit_hw_A]);
910 printf("SW_Blit (CC, A): %s (%s, %s)\n", ny[vi->blit_sw], ny[vi->blit_sw_CC], ny[vi->blit_sw_A]);
911 printf("HW_Fill: %s\n", ny[vi->blit_fill]);
912 printf("Video Memory: %i\n", vi->video_mem);
913 printf("------\n");
914 }
915
916 /*
917 update rectangle (0,0,0,0)->fullscreen
918 */
919 inline void refresh_screen(int x, int y, int w, int h)
920 {
921 if ( sdl.screen->flags & SDL_DOUBLEBUF )
922 SDL_Flip( sdl.screen );
923 else
924 SDL_UpdateRect(sdl.screen, x, y, w, h);
925 }
926
927 /*
928 draw all update regions
929 */
930 void refresh_rects()
931 {
932 if ( sdl.screen->flags & SDL_DOUBLEBUF )
933 SDL_Flip( sdl.screen );
934 else
935 if (sdl.rect_count == RECT_LIMIT)
936 SDL_UpdateRect(sdl.screen, 0, 0, sdl.screen->w, sdl.screen->h);
937 else
938 SDL_UpdateRects(sdl.screen, sdl.rect_count, sdl.rect);
939 sdl.rect_count = 0;
940 }
941
942 /*
943 add update region
944 */
945 void add_refresh_rect(int x, int y, int w, int h)
946 {
947 if (sdl.rect_count == RECT_LIMIT) return;
948 if (x < 0) {
949 w += x;
950 x = 0;
951 }
952 if (y < 0) {
953 h += y;
954 y = 0;
955 }
956 if (x + w > sdl.screen->w)
957 w = sdl.screen->w - x;
958 if (y + h > sdl.screen->h)
959 h = sdl.screen->h - y;
960 if (w <= 0 || h <= 0)
961 return;
962 sdl.rect[sdl.rect_count].x = x;
963 sdl.rect[sdl.rect_count].y = y;
964 sdl.rect[sdl.rect_count].w = w;
965 sdl.rect[sdl.rect_count].h = h;
966 sdl.rect_count++;
967 }
968
969 /*
970 fade screen to black
971 */
972 void dim_screen(int steps, int delay, int trp)
973 {
974 #ifndef NODIM
975 SDL_Surface *buffer;
976 int per_step = trp / steps;
977 int i;
978 if (term_game) return;
979 buffer = create_surf(sdl.screen->w, sdl.screen->h, SDL_SWSURFACE);
980 SDL_SetColorKey(buffer, 0, 0);
981 FULL_DEST(buffer);
982 FULL_SOURCE(sdl.screen);
983 blit_surf();
984 for (i = 0; i <= trp; i += per_step) {
985 FULL_DEST(sdl.screen);
986 fill_surf(0x0);
987 FULL_SOURCE(buffer);
988 alpha_blit_surf(i);
989 refresh_screen( 0, 0, 0, 0);
990 SDL_Delay(delay);
991 }
992 if (trp == 255) {
993 FULL_DEST(sdl.screen);
994 fill_surf(0x0);
995 refresh_screen( 0, 0, 0, 0);
996 }
997 SDL_FreeSurface(buffer);
998 #else
999 refresh_screen( 0, 0, 0, 0);
1000 #endif
1001 }
1002
1003 /*
1004 undim screen
1005 */
1006 void undim_screen(int steps, int delay, int trp)
1007 {
1008 #ifndef NODIM
1009 SDL_Surface *buffer;
1010 int per_step = trp / steps;
1011 int i;
1012 if (term_game) return;
1013 buffer = create_surf(sdl.screen->w, sdl.screen->h, SDL_SWSURFACE);
1014 SDL_SetColorKey(buffer, 0, 0);
1015 FULL_DEST(buffer);
1016 FULL_SOURCE(sdl.screen);
1017 blit_surf();
1018 for (i = trp; i >= 0; i -= per_step) {
1019 FULL_DEST(sdl.screen);
1020 fill_surf(0x0);
1021 FULL_SOURCE(buffer);
1022 alpha_blit_surf(i);
1023 refresh_screen( 0, 0, 0, 0);
1024 SDL_Delay(delay);
1025 }
1026 FULL_DEST(sdl.screen);
1027 FULL_SOURCE(buffer);
1028 blit_surf();
1029 refresh_screen( 0, 0, 0, 0);
1030 SDL_FreeSurface(buffer);
1031 #else
1032 refresh_screen( 0, 0, 0, 0);
1033 #endif
1034 }
1035
1036 /*
1037 wait for a key
1038 */
1039 int wait_for_key()
1040 {
1041 /* wait for key */
1042 SDL_Event event;
1043 while (1) {
1044 SDL_WaitEvent(&event);
1045 if (event.type == SDL_QUIT) {
1046 term_game = 1;
1047 return 0;
1048 }
1049 if (event.type == SDL_KEYUP)
1050 return event.key.keysym.sym;
1051 }
1052 }
1053
1054 /*
1055 wait for a key or mouse click
1056 */
1057 void wait_for_click()
1058 {
1059 /* wait for key or button */
1060 SDL_Event event;
1061 while (1) {
1062 SDL_WaitEvent(&event);
1063 if (event.type == SDL_QUIT) {
1064 term_game = 1;
1065 return;
1066 }
1067 if (event.type == SDL_KEYUP || event.type == SDL_MOUSEBUTTONUP)
1068 return;
1069 }
1070 }
1071
1072 /*
1073 lock surface
1074 */
1075 inline void lock_screen()
1076 {
1077 if (SDL_MUSTLOCK(sdl.screen))
1078 SDL_LockSurface(sdl.screen);
1079 }
1080
1081 /*
1082 unlock surface
1083 */
1084 inline void unlock_screen()
1085 {
1086 if (SDL_MUSTLOCK(sdl.screen))
1087 SDL_UnlockSurface(sdl.screen);
1088 }
1089
1090 /*
1091 flip hardware screens (double buffer)
1092 */
1093 inline void flip_screen()
1094 {
1095 SDL_Flip(sdl.screen);
1096 }
1097
1098 /* cursor */
1099
1100 /* creates cursor */
1101 SDL_Cursor* create_cursor( int width, int height, int hot_x, int hot_y, char *source )
1102 {
1103 char *mask = 0, *data = 0;
1104 SDL_Cursor *cursor = 0;
1105 int i, j, k;
1106 char data_byte, mask_byte;
1107 int pot;
1108
1109 /* meaning of char from source:
1110 b : black, w: white, ' ':transparent */
1111
1112 /* create mask&data */
1113 mask = malloc( width * height * sizeof ( char ) / 8 );
1114 data = malloc( width * height * sizeof ( char ) / 8 );
1115
1116 k = 0;
1117 for (j = 0; j < width * height; j += 8, k++) {
1118
1119 pot = 1;
1120 data_byte = mask_byte = 0;
1121 /* create byte */
1122 for (i = 7; i >= 0; i--) {
1123
1124 switch ( source[j + i] ) {
1125
1126 case 'b':
1127 data_byte += pot;
1128 case 'w':
1129 mask_byte += pot;
1130 break;
1131
1132 }
1133 pot *= 2;
1134
1135 }
1136 /* add to mask */
1137 data[k] = data_byte;
1138 mask[k] = mask_byte;
1139
1140 }
1141
1142 /* create and return cursor */
1143 cursor = SDL_CreateCursor( data, mask, width, height, hot_x, hot_y );
1144 free( mask );
1145 free( data );
1146 return cursor;
1147 }
1148
1149 /*
1150 get milliseconds since last call
1151 */
1152 inline int get_time()
1153 {
1154 int ms;
1155 cur_time = SDL_GetTicks();
1156 ms = cur_time - last_time;
1157 last_time = cur_time;
1158 if (ms == 0) {
1159 ms = 1;
1160 SDL_Delay(1);
1161 }
1162 return ms;
1163 }
1164
1165 /*
1166 reset timer
1167 */
1168 inline void reset_timer()
1169 {
1170 last_time = SDL_GetTicks();
1171 }
1172
1173 void fade_screen( int type, int length )
1174 {
1175 SDL_Surface *buffer = 0;
1176 float alpha;
1177 float alpha_change; /* per ms */
1178 int leave = 0;
1179 int ms;
1180
1181 if ( !sdl.fade ) {
1182 if ( type == FADE_IN )
1183 refresh_screen( 0, 0, 0, 0 );
1184 else {
1185 FULL_DEST( sdl.screen );
1186 fill_surf( 0x0 );
1187 refresh_screen( 0, 0, 0, 0 );
1188 }
1189 }
1190
1191 /* get screen contents */
1192 buffer = create_surf( sdl.screen->w, sdl.screen->h, SDL_SWSURFACE );
1193 SDL_SetColorKey( buffer, 0, 0 );
1194 FULL_DEST( buffer ); FULL_SOURCE( sdl.screen ); blit_surf();
1195
1196 /* compute alpha and alpha change */
1197 if ( type == FADE_OUT ) {
1198 alpha = 0;
1199 alpha_change = 255.0 / length;
1200 }
1201 else {
1202 alpha = 255;
1203 alpha_change = -255.0 / length;
1204 }
1205
1206 /* fade */
1207 reset_timer();
1208 while ( !leave ) {
1209 ms = get_time();
1210 alpha += alpha_change * ms;
1211 if ( type == FADE_OUT && alpha >= 255 ) break;
1212 if ( type == FADE_IN && alpha <= 0 ) break;
1213 /* update */
1214 FULL_DEST( sdl.screen ); fill_surf(0x0);
1215 FULL_SOURCE( buffer ); alpha_blit_surf( (int)alpha );
1216 refresh_screen( 0, 0, 0, 0);
1217 }
1218
1219 /* update screen */
1220 FULL_DEST( sdl.screen ); FULL_SOURCE( buffer );
1221 if ( type == FADE_IN )
1222 blit_surf();
1223 else
1224 fill_surf( 0x0 );
1225 refresh_screen( 0, 0, 0, 0 );
1226 SDL_FreeSurface(buffer);
1227 }
1228
1229 void take_screenshot( int i )
1230 {
1231 char str[32];
1232 sprintf( str, "screenshot%i.bmp", i );
1233 SDL_SaveBMP( sdl.screen, str );
1234 }
+0
-158
src/sdl.h less more
0 /***************************************************************************
1 sdl.h - description
2 -------------------
3 begin : Thu Apr 20 2000
4 copyright : (C) 2000 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef SDL_H
18 #define SDL_H
19
20 #include <SDL.h>
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 #define USE_PNG
27
28 // draw region //
29 #define DEST(p, i, j, k, l) {sdl.d.s = p; sdl.d.r.x = i; sdl.d.r.y = j; sdl.d.r.w = k; sdl.d.r.h = l;}
30 #define SOURCE(p, i, j) {sdl.s.s = p; sdl.s.r.x = i; sdl.s.r.y = j; sdl.s.r.w = sdl.d.r.w; sdl.s.r.h = sdl.d.r.h;}
31 #define FULL_DEST(p) {sdl.d.s = p; sdl.d.r.x = 0; sdl.d.r.y = 0; sdl.d.r.w = (p)->w; sdl.d.r.h = (p)->h;}
32 #define FULL_SOURCE(p) {sdl.s.s = p; sdl.s.r.x = 0; sdl.s.r.y = 0; sdl.s.r.w = sdl.d.r.w; sdl.s.r.h = sdl.d.r.h;}
33 typedef struct {
34 SDL_Surface *s;
35 SDL_Rect r;
36 } DrawRgn;
37
38 // Sdl Surface //
39 #define SDL_NONFATAL 0x10000000
40 SDL_Surface* load_surf(char *fname, int f);
41 SDL_Surface* create_surf(int w, int h, int f);
42 void free_surf( SDL_Surface **surf );
43 inline void lock_surf(SDL_Surface *sur);
44 inline void unlock_surf(SDL_Surface *sur);
45 void blit_surf(void);
46 void alpha_blit_surf(int alpha);
47 void fill_surf(int c);
48 void set_surf_clip( SDL_Surface *surf, int x, int y, int w, int h );
49 Uint32 set_pixel( SDL_Surface *surf, int x, int y, int pixel );
50 Uint32 get_pixel( SDL_Surface *surf, int x, int y );
51 /* draw a shadowed frame and darken contents which starts at cx,cy */
52 void draw_3dframe( SDL_Surface *surf, int cx, int cy, int w, int h, int border );
53
54 // Sdl Font //
55 enum {
56 OPAQUE = 0
57 };
58 enum {
59 ALIGN_X_LEFT = (1L<<1),
60 ALIGN_X_CENTER = (1L<<2),
61 ALIGN_X_RIGHT = (1L<<3),
62 ALIGN_Y_TOP = (1L<<4),
63 ALIGN_Y_CENTER = (1L<<5),
64 ALIGN_Y_BOTTOM = (1L<<6)
65 };
66
67 typedef struct {
68 SDL_Surface *pic;
69 int align;
70 int color;
71 int height;
72 char char_width[256];
73 int char_offset[256];
74 char keys[256];
75 char offset;
76 char length;
77 //last written rect
78 int save_last;
79 int last_x;
80 int last_y;
81 int last_width;
82 int last_height;
83 } Font;
84 Font* load_font(char *fname);
85 Font* load_fixed_font(char *fname, int off, int len, int w, int flags);
86 void free_font(Font **sfnt);
87 int write_text(Font *sfnt, SDL_Surface *dest, int x, int y, char *str, int alpha);
88 inline void lock_font(Font *sfnt);
89 inline void unlock_font(Font *sfnt);
90 SDL_Rect last_write_rect(Font *fnt);
91 int text_width(Font *fnt, char *str);
92
93 /* mouse buttons */
94 enum {
95 LEFT_BUTTON = 1,
96 MIDDLE_BUTTON = 2,
97 RIGHT_BUTTON = 3,
98 WHEEL_UP = 4,
99 WHEEL_DOWN = 5,
100 BUTTON_COUNT
101 };
102
103 /* video modes */
104 typedef struct {
105 int id;
106 char name[64];
107 int width, height, depth;
108 int flags;
109 int ok;
110 } Video_Mode;
111 /* Sdl */
112 enum {
113 RECT_LIMIT = 200,
114 FADE_DEF_TIME = 500,
115 FADE_IN = 0,
116 FADE_OUT = 1
117 };
118 typedef struct {
119 SDL_Surface *screen;
120 DrawRgn d, s;
121 int rect_count;
122 SDL_Rect rect[RECT_LIMIT];
123 int fade;
124 } Sdl;
125 void init_sdl( int f );
126 void quit_sdl();
127 Video_Mode def_video_mode();
128 Video_Mode std_video_mode( int id );
129 Video_Mode video_mode( int width, int height, int depth, int flags );
130 Video_Mode* cur_video_mode();
131 char** get_mode_names( int *count );
132 int set_video_mode( Video_Mode mode );
133 void hardware_cap();
134 inline void refresh_screen( int x, int y, int w, int h );
135 void refresh_rects();
136 void add_refresh_rect(int x, int y, int w, int h);
137 int wait_for_key();
138 void wait_for_click();
139 inline void lock_screen();
140 inline void unlock_screen();
141 inline void flip_screen();
142 void fade_screen( int type, int ms );
143 void take_screenshot( int i );
144
145 /* cursor */
146 /* creates cursor */
147 SDL_Cursor* create_cursor( int width, int height, int hot_x, int hot_y, char *source );
148
149 /* timer */
150 inline int get_time();
151 inline void reset_timer();
152
153 #ifdef __cplusplus
154 };
155 #endif
156
157 #endif
+0
-130
src/shine.c less more
0 /***************************************************************************
1 shine.c - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "levels.h"
20 #include "player.h"
21 #include "shrapnells.h"
22 #include "bricks.h"
23 #include "shine.h"
24
25 extern Sdl sdl;
26 extern Config config;
27 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
28 extern SDL_Surface *offscreen;
29 extern SDL_Surface *shine_pic;
30 float shine_change = 0.020; /* per ms */
31 int shine_frame = 6; /* maximum frame */
32 float shine_cur = 0; /* current frame */
33 int shine_x, shine_y; /* position where current shine is drawn */
34 int shine_recreate = 1;
35 Delay shine_delay; /* delay between shines */
36
37 /*
38 ====================================================================
39 Load/delete resources
40 ====================================================================
41 */
42 void shine_load()
43 {
44 delay_set( &shine_delay, 200 );
45 }
46 void shine_delete()
47 {
48 }
49 /*
50 ====================================================================
51 Recreate shine on a random but valid brick
52 ====================================================================
53 */
54 void shine_create()
55 {
56 int x_add, y_add, x, y;
57 shine_cur = 0;
58 shine_x = 0; shine_y = 0;
59
60 if ( !config.anim ) return;
61
62 x = (rand() % (BRICK_WIDTH - 2)) + 1;
63 y = (rand() % (BRICK_HEIGHT - 2)) + 1;
64 x_add = rand() % 2 == 0 ? 1 : -1;
65 y_add = rand() % 2 == 0 ? 1 : -1;
66
67 while (x > 0 && x < MAP_WIDTH - 1 && y > 0 && y < MAP_HEIGHT - 1) {
68 if (bricks[x][y].type != MAP_EMPTY && bricks[x][y].id != INVIS_BRICK_ID ) {
69 shine_x = x * BRICK_WIDTH;
70 shine_y = y * BRICK_HEIGHT;
71 break;
72 }
73 x += x_add; y += y_add;
74 }
75 /* if creation succeeded don't create any more shines */
76 if ( shine_x != 0 && shine_y != 0 ) shine_recreate = 0;
77 }
78 /*
79 ====================================================================
80 Reset (delete( shine
81 ====================================================================
82 */
83 void shine_reset()
84 {
85 shine_x = shine_y = 0;
86 shine_recreate = 1;
87 delay_reset( &shine_delay );
88 }
89 /*
90 ====================================================================
91 Show/hide current shine
92 ====================================================================
93 */
94 void shine_hide()
95 {
96 if (shine_x == 0 && shine_y == 0) return;
97 DEST(sdl.screen, shine_x, shine_y, BRICK_WIDTH, BRICK_HEIGHT);
98 SOURCE(offscreen, shine_x, shine_y);
99 blit_surf();
100 add_refresh_rect(shine_x, shine_y, BRICK_WIDTH, BRICK_HEIGHT);
101 }
102 void shine_show()
103 {
104 if (shine_x == 0 && shine_y == 0) return;
105 DEST(sdl.screen, shine_x, shine_y, BRICK_WIDTH, BRICK_HEIGHT);
106 SOURCE(shine_pic, (int)shine_cur * BRICK_WIDTH, 0);
107 blit_surf();
108 add_refresh_rect(shine_x, shine_y, BRICK_WIDTH, BRICK_HEIGHT);
109 }
110 /*
111 ====================================================================
112 Update shine
113 ====================================================================
114 */
115 void shine_update( int ms )
116 {
117 /* recreate shine? */
118 if ( shine_recreate ) {
119 shine_x = shine_y = 0; /* if recreation is demanded delete old shine */
120 if ( delay_timed_out( &shine_delay, ms ) ) shine_create();
121 }
122 else {
123 shine_cur += shine_change * ms;
124 if (shine_cur > shine_frame) {
125 shine_recreate = 1;
126 delay_reset( &shine_delay );
127 }
128 }
129 }
+0
-49
src/shine.h less more
0 /***************************************************************************
1 shine.h - description
2 -------------------
3 begin : Thu Sep 13 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 /*
18 ====================================================================
19 Load/delete resources
20 ====================================================================
21 */
22 void shine_load();
23 void shine_delete();
24 /*
25 ====================================================================
26 Recreate shine on a random but valid brick
27 ====================================================================
28 */
29 void shine_create();
30 /*
31 ====================================================================
32 Reset (delete( shine
33 ====================================================================
34 */
35 void shine_reset();
36 /*
37 ====================================================================
38 Show/hide current shine
39 ====================================================================
40 */
41 void shine_hide();
42 void shine_show();
43 /*
44 ====================================================================
45 Update shine
46 ====================================================================
47 */
48 void shine_update( int ms );
+0
-242
src/shots.c less more
0 /***************************************************************************
1 shots.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "list.h"
20 #include "levels.h"
21 #include "shrapnells.h"
22 #include "bricks.h"
23 #include "shots.h"
24 #ifdef SOUND
25 #include "audio.h"
26 #endif
27
28 extern SDL_Surface *shot_pic;
29 extern SDL_Surface *shot_shadow;
30 List *shots; /* list of all shots */
31 int shot_w = 10;
32 int shot_h = 10;
33 int shot_fr_num = 4;
34 float shot_fpms = 0.01;
35 float shot_v_y = -0.2;
36 int shot_alpha = 64;
37 int shot_limit = 10; /* maximimum number of shots */
38 int shot_bricks_hit = 0, shot_mx, shot_my; /* how many bricks destroyed by shot at position mx, my */
39 extern Brick bricks[MAP_WIDTH][MAP_HEIGHT];
40 extern SDL_Surface *offscreen;
41 extern Sdl sdl;
42 extern int shadow_size;
43 extern Config config;
44 #ifdef SOUND
45 extern Sound_Chunk *wav_shot;
46 #endif
47
48 /*
49 ====================================================================
50 Locals
51 ====================================================================
52 */
53
54 /*
55 ====================================================================
56 Compute target of shot.
57 ====================================================================
58 */
59 void shot_get_target( Shot *shot ) {
60 int mx = (int)(shot->x + 3) / BRICK_WIDTH;
61 int my = (int)(shot->y + 3) / BRICK_HEIGHT;
62 memset(&shot->t, 0, sizeof(Target));
63 while (bricks[mx][my].id == -1) my--;
64 shot->t.mx = mx; shot->t.my = my;
65 mx = (int)(shot->x + 6) / BRICK_WIDTH;
66 if (mx != shot->t.mx) {
67 my = (int)(shot->y + 3) / BRICK_HEIGHT;
68 while(bricks[mx][my].id == -1) my--;
69 if (my > shot->t.my) {
70 shot->t.mx = mx;
71 shot->t.my = my;
72 shot->next_too = 0;
73 }
74 else
75 if (my == shot->t.my)
76 shot->next_too = 1;
77 }
78 shot->t.cur_tm = 0;
79 shot->t.time = (int)((shot->y + 3 - (shot->t.my * BRICK_HEIGHT + BRICK_HEIGHT - 1)) / fabs(shot_v_y));
80 }
81
82 /*
83 ====================================================================
84 Publics
85 ====================================================================
86 */
87
88 /*
89 ====================================================================
90 Load, delete shot graphics
91 ====================================================================
92 */
93 void shot_load()
94 {
95 shots = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
96 }
97 void shot_delete()
98 {
99 if ( shots ) list_delete( shots ); shots = 0;
100 }
101 /*
102 ====================================================================
103 Create new shot at position (centered)
104 ====================================================================
105 */
106 void shot_create( int x, int y )
107 {
108 Shot *shot = calloc( 1, sizeof( Shot ) );
109 shot->cur_fr = 0;
110 shot->x = x - (shot_w >> 1);
111 shot->y = y - (shot_h >> 1);
112 shot_get_target( shot );
113 list_add( shots, shot );
114 #ifdef SOUND
115 sound_play( wav_shot );
116 #endif
117 }
118 /*
119 ====================================================================
120 Delete all shots
121 ====================================================================
122 */
123 void shots_reset()
124 {
125 list_clear( shots );
126 }
127 /*
128 ====================================================================
129 Hide and show shots
130 ====================================================================
131 */
132 void shots_hide()
133 {
134 List_Entry *entry = shots->head.next;
135 Shot *shot;
136 int w = shot_w, h = shot_h;
137 if ( config.shadow ) { w += shadow_size; h += shadow_size; }
138 while ( entry != &shots->tail ) {
139 shot = entry->item;
140 DEST(sdl.screen, (int)shot->x, (int)shot->y, w, h );
141 SOURCE(offscreen, (int)shot->x, (int)shot->y);
142 blit_surf();
143 add_refresh_rect((int)shot->x, (int)shot->y, w, h );
144 entry = entry->next;
145 }
146 }
147 void shots_show()
148 {
149 List_Entry *entry = shots->head.next;
150 Shot *shot;
151 if ( config.shadow ) set_surf_clip( sdl.screen, 0, 0, sdl.screen->w - BRICK_WIDTH, sdl.screen->h );
152 while ( entry != &shots->tail ) {
153 shot = entry->item;
154 if ( config.shadow ) {
155 DEST(sdl.screen, (int)shot->x + shadow_size, (int)shot->y + shadow_size, shot_w, shot_h);
156 SOURCE(shot_shadow, 0, 0);
157 alpha_blit_surf(SHADOW_ALPHA);
158 }
159 DEST(sdl.screen, (int)shot->x, (int)shot->y, shot_w, shot_h);
160 SOURCE(shot_pic, (int)shot->cur_fr * shot_w, 0);
161 alpha_blit_surf(shot_alpha);
162 if ( config.shadow )
163 add_refresh_rect((int)shot->x, (int)shot->y, shot_w + shadow_size, shot_h + shadow_size);
164 else
165 add_refresh_rect((int)shot->x, (int)shot->y, shot_w, shot_h);
166 entry = entry->next;
167 }
168 if ( config.shadow ) set_surf_clip( sdl.screen, 0, 0, 0, 0 );
169 }
170 void shots_alphashow( int alpha )
171 {
172 List_Entry *entry = shots->head.next;
173 Shot *shot;
174 while ( entry != &shots->tail ) {
175 shot = entry->item;
176 DEST(sdl.screen, (int)shot->x, (int)shot->y, shot_w, shot_h);
177 SOURCE(shot_pic, (int)shot->cur_fr * shot_w, 0);
178 alpha_blit_surf(alpha);
179 add_refresh_rect((int)shot->x, (int)shot->y, shot_w, shot_h);
180 entry = entry->next;
181 }
182 }
183 /*
184 ====================================================================
185 Update position of shots and check if bricks get destroyed
186 If this happens true is returned and balls must be checked (new
187 targets).
188 ====================================================================
189 */
190 int shots_update( int ms )
191 {
192 int result = 0;
193 List_Entry *entry = shots->head.next;
194 Shot *shot;
195 while ( entry != &shots->tail ) {
196 shot = entry->item;
197 shot->cur_fr += ms * shot_fpms;
198 if (shot->cur_fr >= shot_fr_num) shot->cur_fr -= shot_fr_num;
199 shot->y += ms * shot_v_y;
200 shot->t.cur_tm += ms;
201 entry = entry->next;
202 if (shot->t.cur_tm > shot->t.time) {
203 if ( brick_hit(shot->t.mx, shot->t.my, 0, SHR_BY_SHOT, vector_get( 0, 1 ) ) ) {
204 shot_bricks_hit++;
205 shot_my = shot->t.my;
206 shot_mx = shot->t.mx;
207 }
208 if (shot->next_too) {
209 if ( brick_hit(shot->t.mx + 1, shot->t.my, 0, SHR_BY_SHOT, vector_get( 0, 1 ) ) ) shot_bricks_hit++;
210 shots_get_new_targets(shot->t.mx + 1, shot->t.my);
211 }
212 shots_get_new_targets(shot->t.mx, shot->t.my);
213 list_delete_entry( shots, entry->prev );
214 result = 1;
215 }
216 }
217 return result;
218 }
219 /*
220 ====================================================================
221 Get new targets for all shots that where supposed to
222 destroy brick at x,y
223 ====================================================================
224 */
225 void shots_get_new_targets( int x, int y )
226 {
227 Shot *shot;
228 list_reset( shots );
229 while ( ( shot = list_next( shots ) ) )
230 if (shot->t.mx == x && shot->t.my == y)
231 shot_get_target( shot );
232 }
233 /*
234 ====================================================================
235 Return true if below shot_limit
236 ====================================================================
237 */
238 int shots_below_limit()
239 {
240 return shot_limit - shots->count;
241 }
+0
-72
src/shots.h less more
0 /***************************************************************************
1 shots.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 typedef struct {
18 float x, y;
19 float cur_fr;
20 Target t;
21 int next_too; /* destroys right brick, too */
22 } Shot;
23
24 /*
25 ====================================================================
26 Load, delete shot graphics
27 ====================================================================
28 */
29 void shot_load();
30 void shot_delete();
31 /*
32 ====================================================================
33 Create new shot at position (centered).
34 ====================================================================
35 */
36 void shot_create( int x, int y );
37 /*
38 ====================================================================
39 Delete all shots
40 ====================================================================
41 */
42 void shots_reset();
43 /*
44 ====================================================================
45 Hide and show shots
46 ====================================================================
47 */
48 void shots_hide();
49 void shots_show();
50 void shots_alphashow( int alpha );
51 /*
52 ====================================================================
53 Update position of shots and check if bricks get destroyed
54 If this happens true is returned and balls must be checked (new
55 targets).
56 ====================================================================
57 */
58 int shots_update( int ms );
59 /*
60 ====================================================================
61 Get new targets for all shots that where supposed to
62 destroy brick at x,y
63 ====================================================================
64 */
65 void shots_get_new_targets( int x, int y );
66 /*
67 ====================================================================
68 Return true if below shot_limit
69 ====================================================================
70 */
71 int shots_below_limit();
+0
-389
src/shrapnells.c less more
0 /***************************************************************************
1 shrapnells.c - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "lbreakout.h"
18 #include "config.h"
19 #include "list.h"
20 #include "shrapnells.h"
21
22 extern Config config;
23 extern Sdl sdl;
24 extern SDL_Surface *offscreen;
25 List *shrapnells = 0;
26 float shr_alpha_change = 0.25;
27 float shr_start_alpha = 0;
28
29 /*
30 ====================================================================
31 Local
32 ====================================================================
33 */
34
35 /*
36 ====================================================================
37 Create a single shrapnell and add to list.
38 ====================================================================
39 */
40 void shrapnell_create( int x, int y, int w, int h, float vx, float vy )
41 {
42 Shrapnell *shr = calloc( 1, sizeof( Shrapnell ) );
43 shr->pic = create_surf(w, h, SDL_SWSURFACE);
44 SDL_SetColorKey(shr->pic, 0, 0);
45 DEST(shr->pic, 0, 0, w, h);
46 SOURCE(offscreen, x, y);
47 blit_surf();
48 shr->x = x;
49 shr->y = y;
50 shr->v.x = vx;
51 shr->v.y = vy;
52 shr->alpha = shr_start_alpha;
53 list_add( shrapnells, shr);
54 }
55 /*
56 ====================================================================
57 Delete a shrapnell
58 ====================================================================
59 */
60 void shrapnell_delete( void *ptr )
61 {
62 Shrapnell *shr = (Shrapnell*)ptr;
63 SDL_FreeSurface( shr->pic );
64 free( shr );
65 }
66
67 /*
68 ====================================================================
69 Public
70 ====================================================================
71 */
72
73 /*
74 ====================================================================
75 Initate or delete shrapnell list
76 ====================================================================
77 */
78 void shrapnells_init()
79 {
80 shrapnells = list_create( LIST_AUTO_DELETE, shrapnell_delete );
81 }
82 void shrapnells_delete()
83 {
84 list_delete( shrapnells );
85 }
86 /*
87 ====================================================================
88 Create shrapnells from position in offscreen. The vector imp is the
89 impuls and type the type of what caused the destruction.
90 ====================================================================
91 */
92 void shrapnells_create( int x, int y, int w, int h, int type, Vector imp )
93 {
94 int i, j;
95 int shr_w, shr_h;
96 Vector v;
97 int dx, dy;
98 /* no animations? */
99 if ( !config.anim )
100 return;
101 /*
102 * 1 - low
103 * 2 - medium
104 * 3 - high
105 */
106 /* according to type create shrapnells */
107 switch ( type ) {
108 case SHR_BY_NORMAL_BALL:
109 vector_norm( &imp );
110 imp.x *= 0.13; imp.y *= 0.13;
111 shrapnell_create( x, y, w, h, imp.x, imp.y );
112 break;
113 case SHR_BY_ENERGY_BALL:
114 if ( config.anim == 1 ) {
115 /* low */
116 shrapnell_create( x, y, w, h, 0, 0 );
117 break;
118 }
119 shr_w = w / 2;
120 shr_h = h / 2;
121 for ( i = 0; i < w; i += shr_w )
122 for ( j = 0; j < h; j += shr_h ) {
123 v.x = ( x + ( w >> 1 ) ) - ( x + i + ( shr_w >> 1 ) );
124 v.y = ( y + ( h >> 1 ) ) - ( y + j + ( shr_h >> 1 ) );
125 vector_norm( &v );
126 v.x *= 0.01; v.y *= 0.01;
127 shrapnell_create( x + i, y + j, shr_w, shr_h, v.x, v.y );
128 }
129 break;
130 case SHR_BY_SHOT:
131 if ( config.anim == 1 ) {
132 /* low */
133 shrapnell_create( x, y, w, h, 0, -0.02 );
134 break;
135 }
136 shr_w = w / 8;
137 shr_h = h;
138 for ( i = 0; i < ( w >> 1 ); i += shr_w ) {
139 shrapnell_create( x + i, y, shr_w, shr_h, 0, -0.002 * ( i + 1 ) );
140 shrapnell_create( x + w - shr_w - i, y, shr_w, shr_h, 0, -0.002 * ( i + 1 ) );
141 }
142 break;
143 case SHR_BY_EXPL:
144 shr_w = config.anim == 3 ? 5 : 10;
145 shr_h = config.anim == 3 ? 5 : 10;
146 for ( i = 0; i < w; i += shr_w )
147 for ( j = 0; j < h; j += shr_h ) {
148 dx = rand() % 2 == 0 ? 1 : -1;
149 dy = rand() % 2 == 0 ? 1 : -1;
150 shrapnell_create( x + i, y + j, shr_w, shr_h,
151 (float)( ( rand() % 6 ) + 5) / 100 * dx, (float)( ( rand() % 6 ) + 5) / 100 * dy );
152 }
153 break;
154 }
155 }
156 #ifdef _1
157 /*
158 ====================================================================
159 Create shrapnells from position in offscreen
160 ====================================================================
161 */
162 void shrapnells_create( int x, int y, int w, int h, int res )
163 {
164 int mod = config.anim;
165 int i, j;
166 int r;
167 int shr_w, shr_h, dx, dy;
168
169 /* no animations? */
170 if (!config.anim) return;
171
172 /* high/low resolution shrapnells? */
173 if ( res == SHR_LOW_RES )
174 r = rand() % 3;
175 else {
176 r = rand() % 5;
177 if (r == 4) r = 3;
178 }
179
180 /* check result */
181 switch (r) {
182 case 0:
183 shr_w = w / (8 * mod);
184 shr_h = h;
185 for (i = 0; i < (4 * mod); i++)
186 shrapnell_create(x + i * shr_w, y, shr_w, shr_h, -0.05 - i * 0.01, 0);
187 for (i = (4 * mod) - 1; i >= 0; i--)
188 shrapnell_create(x + w - (i + 1) * shr_w, y, shr_w, shr_h, 0.05 + i * 0.01, 0);
189 break;
190 case 1:
191 shr_w = w;
192 shr_h = h / (4 * mod);
193 for (i = 0; i < (2 * mod); i++)
194 shrapnell_create(x, y + i * shr_h, shr_w, shr_h, 0, -0.05 - i * 0.01);
195 for (i = (2 * mod) - 1; i >= 0; i--)
196 shrapnell_create(x, y + h - (i + 1) * shr_h, shr_w, shr_h, 0, 0.05 + i * 0.01);
197 break;
198 case 2:
199 shr_w = w / (8 * mod);
200 shr_h = h;
201 for (i = 0; i < (8 * mod); i++)
202 shrapnell_create(x + i * shr_w, y, shr_w, shr_h, 0, (1 - 2 * (i & 1)) * 0.1);
203 break;
204 case 3:
205 shr_w = config.anim == 1 ? 8 : 4;
206 shr_h = config.anim == 1 ? 8 : 4;
207 for (i = 0; i < w / shr_w; i++)
208 for (j = 0; j < h / shr_h; j++) {
209 dx = rand() % 2 == 0 ? 1 : -1;
210 dy = rand() % 2 == 0 ? 1 : -1;
211 shrapnell_create(x + i * shr_w, y + j * shr_h, shr_w, shr_h, (float)(rand()%6+5) / 100 * dx, (float)(rand()%6+5) / 100 * dy);
212 }
213 break;
214 }
215 }
216 #endif
217 /*
218 ====================================================================
219 Remove all shrapnells
220 ====================================================================
221 */
222 void shrapnells_reset()
223 {
224 list_clear( shrapnells );
225 }
226 /*
227 ====================================================================
228 Show, hide all shrapnells.
229 ====================================================================
230 */
231 void shrapnells_hide()
232 {
233 List_Entry *entry = shrapnells->head.next;
234 Shrapnell *shr;
235 int x, y;
236 while ( entry != &shrapnells->tail ) {
237 shr = entry->item;
238 x = (int)shr->x;
239 y = (int)shr->y;
240 DEST(sdl.screen, x, y, shr->pic->w, shr->pic->h);
241 SOURCE(offscreen, x, y);
242 blit_surf();
243 add_refresh_rect(x, y, shr->pic->w, shr->pic->h);
244 entry = entry->next;
245 }
246 }
247 void shrapnells_show()
248 {
249 List_Entry *entry = shrapnells->head.next;
250 Shrapnell *shr;
251 int x, y;
252 while ( entry != &shrapnells->tail ) {
253 shr = entry->item;
254 x = (int)shr->x;
255 y = (int)shr->y;
256 DEST(sdl.screen, x, y, shr->pic->w, shr->pic->h);
257 SOURCE(shr->pic, 0, 0);
258 if (!config.trp || shr->alpha == 0)
259 blit_surf();
260 else
261 alpha_blit_surf((int)shr->alpha);
262 add_refresh_rect(x, y, shr->pic->w, shr->pic->h);
263 entry = entry->next;
264 }
265 }
266 /*
267 ====================================================================
268 Update and remove expired shrapnells
269 ====================================================================
270 */
271 void shrapnells_update( int ms )
272 {
273 List_Entry *entry = shrapnells->head.next;
274 Shrapnell *shr;
275 while ( entry != &shrapnells->tail ) {
276 shr = entry->item;
277 shr->x += shr->v.x * ms;
278 shr->y += shr->v.y * ms;
279 if (shr->alpha < 255)
280 shr->alpha += shr_alpha_change * ms;
281 entry = entry->next;
282 if (shr->alpha > 255 || shr->x + shr->pic->w < 0 || shr->y + shr->pic->h < 0 || shr->x > sdl.screen->w || shr->y > sdl.screen->h)
283 list_delete_entry( shrapnells, entry->prev );
284 }
285 }
286
287 /*
288 ====================================================================
289 Brick explosion animations.
290 ====================================================================
291 */
292 #define exp_change 0.015
293 #define exp_alpha_change 0.10
294 List *exps;
295 SDL_Surface *current_exp_pic = 0; /* points either to exp_pic or exp_dark_pic */
296 extern SDL_Surface *exp_pic;
297 extern SDL_Surface *exp_dark_pic;
298 int exp_w, exp_h; /* size */
299 int exp_frame_count; /* frame count */
300 int exp_count; /* number of various explosions */
301 typedef struct {
302 float alpha;
303 float cur; /* current frame */
304 int x, y; /* position in screen */
305 int y_off; /* y offset in explosion picture */
306 } Exp;
307 void exp_load()
308 {
309 exps = list_create( LIST_AUTO_DELETE, NO_CALLBACK );
310 exp_w = exp_h = 60; /* hardcoded as we have various explosions in one file now */
311 exp_count = exp_pic->h / exp_h;
312 exp_frame_count = exp_pic->w / exp_w;
313 }
314 void exps_clear()
315 {
316 list_clear( exps );
317 }
318 void exp_delete()
319 {
320 if ( exps ) list_delete( exps ); exps = 0;
321 }
322 void exp_create( int x, int y )
323 {
324 Exp *exp = calloc( 1, sizeof( Exp ) );
325 exp->x = x - ( exp_w >> 1 );
326 exp->y = y - ( exp_h >> 1 );
327 exp->alpha = 0;
328 /* red/yellow get 4 parts, gree&yellow&bluw get 1 part each */
329 switch ( rand() % ( 4 + 4 + 1 + 1 + 1 ) ) {
330 case 0: case 1: case 2: case 3:
331 exp->y_off = 0; break;
332 case 4: case 5: case 6: case 7:
333 exp->y_off = exp_h * 4; break;
334 case 8:
335 exp->y_off = exp_h * 1; break;
336 case 9:
337 exp->y_off = exp_h * 2; break;
338 case 10:
339 exp->y_off = exp_h * 3; break;
340 }
341 list_add( exps, exp );
342 }
343 void exps_hide()
344 {
345 Exp *exp;
346 list_reset( exps );
347 while ( ( exp = list_next( exps ) ) ) {
348 DEST( sdl.screen, exp->x, exp->y, exp_w, exp_h );
349 SOURCE( offscreen, exp->x, exp->y );
350 blit_surf();
351 add_refresh_rect( exp->x, exp->y, exp_w, exp_h );
352 }
353 }
354 void exps_show()
355 {
356 Exp *exp;
357 list_reset( exps );
358 while ( ( exp = list_next( exps ) ) ) {
359 DEST( sdl.screen, exp->x, exp->y, exp_w, exp_h );
360 SOURCE( current_exp_pic, (int)exp->cur * exp_w, exp->y_off );
361 if ( config.trp )
362 alpha_blit_surf( exp->alpha );
363 else
364 blit_surf();
365 }
366 }
367 void exps_update( int ms )
368 {
369 Exp *exp;
370 list_reset( exps );
371 while ( ( exp = list_next( exps ) ) ) {
372 if ( exp->alpha < 255 ) {
373 exp->alpha += exp_alpha_change * ms;
374 if ( exp->alpha > 255 ) exp->alpha = 255;
375 }
376 exp->cur += exp_change * ms;
377 if ( exp->cur >= exp_frame_count )
378 list_delete_current( exps );
379 }
380 }
381 void exps_set_dark( int dark )
382 {
383 if ( dark )
384 current_exp_pic = exp_dark_pic;
385 else
386 current_exp_pic = exp_pic;
387 }
388
+0
-78
src/shrapnells.h less more
0 /***************************************************************************
1 shrapnells.h - description
2 -------------------
3 begin : Sat Sep 8 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 typedef struct {
18 SDL_Surface *pic;
19 Vector v;
20 float x, y;
21 float alpha;
22 } Shrapnell;
23
24 /*
25 ====================================================================
26 Initate or delete shrapnell list
27 ====================================================================
28 */
29 void shrapnells_init();
30 void shrapnells_delete();
31
32 /*
33 ====================================================================
34 Create shrapnells from position in offscreen. The vector imp is the
35 impuls and type the type of what caused the destruction.
36 ====================================================================
37 */
38 enum {
39 SHR_BY_NORMAL_BALL = 0,
40 SHR_BY_ENERGY_BALL,
41 SHR_BY_SHOT,
42 SHR_BY_EXPL
43 };
44 void shrapnells_create( int x, int y, int w, int h, int type, Vector imp );
45 /*
46 ====================================================================
47 Remove all shrapnells
48 ====================================================================
49 */
50 void shrapnells_reset();
51 /*
52 ====================================================================
53 Show, hide all shrapnells.
54 ====================================================================
55 */
56 void shrapnells_hide();
57 void shrapnells_show();
58 /*
59 ====================================================================
60 Update and remove expired shrapnells
61 ====================================================================
62 */
63 void shrapnells_update( int ms );
64
65 /*
66 ====================================================================
67 Brick explosion animations.
68 ====================================================================
69 */
70 void exp_load();
71 void exp_delete();
72 void exps_clear();
73 void exp_create( int x, int y );
74 void exps_hide();
75 void exps_show();
76 void exps_update( int ms );
77 void exps_set_dark( int dark );
+0
-13
src/sounds/Makefile.am less more
0 EXTRA_DIST = attach.wav click.wav exp.wav expand.wav extraball.wav \
1 freeze.wav gainlife.wav goldshower.wav joker.wav looselife.wav metal.wav \
2 menu_motion.wav reflect.wav score.wav shot.wav shrink.wav speeddown.wav \
3 speedup.wav standard.wav wall.wav menu_click.wav \
4 dammit.wav damn.wav excellent.wav verygood.wav wontgiveup.wav \
5 chaos.wav darkness.wav ghost.wav timeadd.wav expl_ball.wav weak_ball.wav \
6 bonus_magnet.wav malus_magnet.wav disable.wav
7
8 install-data-local:
9 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/sounds
10 @for file in *.wav; do\
11 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/sounds/$$file;\
12 done
+0
-186
src/sounds/Makefile.in less more
0 # Makefile.in generated automatically by automake 1.4 from Makefile.am
1
2 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
3 # This Makefile.in is free software; the Free Software Foundation
4 # gives unlimited permission to copy and/or distribute it,
5 # with or without modifications, as long as this notice is preserved.
6
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
9 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10 # PARTICULAR PURPOSE.
11
12
13 SHELL = @SHELL@
14
15 srcdir = @srcdir@
16 top_srcdir = @top_srcdir@
17 VPATH = @srcdir@
18 prefix = @prefix@
19 exec_prefix = @exec_prefix@
20
21 bindir = @bindir@
22 sbindir = @sbindir@
23 libexecdir = @libexecdir@
24 datadir = @datadir@
25 sysconfdir = @sysconfdir@
26 sharedstatedir = @sharedstatedir@
27 localstatedir = @localstatedir@
28 libdir = @libdir@
29 infodir = @infodir@
30 mandir = @mandir@
31 includedir = @includedir@
32 oldincludedir = /usr/include
33
34 DESTDIR =
35
36 pkgdatadir = $(datadir)/@PACKAGE@
37 pkglibdir = $(libdir)/@PACKAGE@
38 pkgincludedir = $(includedir)/@PACKAGE@
39
40 top_builddir = ../..
41
42 ACLOCAL = @ACLOCAL@
43 AUTOCONF = @AUTOCONF@
44 AUTOMAKE = @AUTOMAKE@
45 AUTOHEADER = @AUTOHEADER@
46
47 INSTALL = @INSTALL@
48 INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
49 INSTALL_DATA = @INSTALL_DATA@
50 INSTALL_SCRIPT = @INSTALL_SCRIPT@
51 transform = @program_transform_name@
52
53 NORMAL_INSTALL = :
54 PRE_INSTALL = :
55 POST_INSTALL = :
56 NORMAL_UNINSTALL = :
57 PRE_UNINSTALL = :
58 POST_UNINSTALL = :
59 CC = @CC@
60 MAKEINFO = @MAKEINFO@
61 PACKAGE = @PACKAGE@
62 RANLIB = @RANLIB@
63 SDL_CFLAGS = @SDL_CFLAGS@
64 SDL_CONFIG = @SDL_CONFIG@
65 SDL_LIBS = @SDL_LIBS@
66 VERSION = @VERSION@
67 doc_dir = @doc_dir@
68 hi_dir = @hi_dir@
69 hi_inst_flag = @hi_inst_flag@
70 inst_dir = @inst_dir@
71 inst_flag = @inst_flag@
72 mixer_flag = @mixer_flag@
73 sound_flag = @sound_flag@
74 warp_flag = @warp_flag@
75
76 EXTRA_DIST = attach.wav click.wav exp.wav expand.wav extraball.wav freeze.wav gainlife.wav goldshower.wav joker.wav looselife.wav metal.wav menu_motion.wav reflect.wav score.wav shot.wav shrink.wav speeddown.wav speedup.wav standard.wav wall.wav menu_click.wav dammit.wav damn.wav excellent.wav verygood.wav wontgiveup.wav chaos.wav darkness.wav ghost.wav timeadd.wav expl_ball.wav weak_ball.wav bonus_magnet.wav malus_magnet.wav disable.wav
77
78 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
79 CONFIG_HEADER = ../../config.h
80 CONFIG_CLEAN_FILES =
81 DIST_COMMON = Makefile.am Makefile.in
82
83
84 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
85
86 TAR = gtar
87 GZIP_ENV = --best
88 all: all-redirect
89 .SUFFIXES:
90 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
91 cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/sounds/Makefile
92
93 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
94 cd $(top_builddir) \
95 && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
96
97 tags: TAGS
98 TAGS:
99
100
101 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
102
103 subdir = src/sounds
104
105 distdir: $(DISTFILES)
106 @for file in $(DISTFILES); do \
107 d=$(srcdir); \
108 if test -d $$d/$$file; then \
109 cp -pr $$/$$file $(distdir)/$$file; \
110 else \
111 test -f $(distdir)/$$file \
112 || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
113 || cp -p $$d/$$file $(distdir)/$$file || :; \
114 fi; \
115 done
116 info-am:
117 info: info-am
118 dvi-am:
119 dvi: dvi-am
120 check-am: all-am
121 check: check-am
122 installcheck-am:
123 installcheck: installcheck-am
124 install-exec-am:
125 install-exec: install-exec-am
126
127 install-data-am: install-data-local
128 install-data: install-data-am
129
130 install-am: all-am
131 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
132 install: install-am
133 uninstall-am:
134 uninstall: uninstall-am
135 all-am: Makefile
136 all-redirect: all-am
137 install-strip:
138 $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
139 installdirs:
140
141
142 mostlyclean-generic:
143
144 clean-generic:
145
146 distclean-generic:
147 -rm -f Makefile $(CONFIG_CLEAN_FILES)
148 -rm -f config.cache config.log stamp-h stamp-h[0-9]*
149
150 maintainer-clean-generic:
151 mostlyclean-am: mostlyclean-generic
152
153 mostlyclean: mostlyclean-am
154
155 clean-am: clean-generic mostlyclean-am
156
157 clean: clean-am
158
159 distclean-am: distclean-generic clean-am
160
161 distclean: distclean-am
162
163 maintainer-clean-am: maintainer-clean-generic distclean-am
164 @echo "This command is intended for maintainers to use;"
165 @echo "it deletes files that may require special tools to rebuild."
166
167 maintainer-clean: maintainer-clean-am
168
169 .PHONY: tags distdir info-am info dvi-am dvi check check-am \
170 installcheck-am installcheck install-exec-am install-exec \
171 install-data-local install-data-am install-data install-am install \
172 uninstall-am uninstall all-redirect all-am all installdirs \
173 mostlyclean-generic distclean-generic clean-generic \
174 maintainer-clean-generic clean mostlyclean distclean maintainer-clean
175
176
177 install-data-local:
178 $(mkinstalldirs) $(DESTDIR)$(inst_dir)/sounds
179 @for file in *.wav; do\
180 $(INSTALL_DATA) $$file $(DESTDIR)$(inst_dir)/sounds/$$file;\
181 done
182
183 # Tell versions [3.59,3.63) of GNU make to not export all variables.
184 # Otherwise a system limit (for SysV at least) may be exceeded.
185 .NOEXPORT:
src/sounds/attach.wav less more
Binary diff not shown
src/sounds/bonus_magnet.wav less more
Binary diff not shown
src/sounds/chaos.wav less more
Binary diff not shown
src/sounds/click.wav less more
Binary diff not shown
src/sounds/dammit.wav less more
Binary diff not shown
src/sounds/damn.wav less more
Binary diff not shown
src/sounds/darkness.wav less more
Binary diff not shown
src/sounds/disable.wav less more
Binary diff not shown
src/sounds/excellent.wav less more
Binary diff not shown
src/sounds/exp.wav less more
Binary diff not shown
src/sounds/expand.wav less more
Binary diff not shown
src/sounds/expl_ball.wav less more
Binary diff not shown
src/sounds/extraball.wav less more
Binary diff not shown
src/sounds/freeze.wav less more
Binary diff not shown
src/sounds/gainlife.wav less more
Binary diff not shown
src/sounds/ghost.wav less more
Binary diff not shown
src/sounds/goldshower.wav less more
Binary diff not shown
src/sounds/joker.wav less more
Binary diff not shown
src/sounds/looselife.wav less more
Binary diff not shown
src/sounds/malus_magnet.wav less more
Binary diff not shown
src/sounds/menu_click.wav less more
Binary diff not shown
src/sounds/menu_motion.wav less more
Binary diff not shown
src/sounds/metal.wav less more
Binary diff not shown
src/sounds/reflect.wav less more
Binary diff not shown
src/sounds/score.wav less more
Binary diff not shown
src/sounds/shot.wav less more
Binary diff not shown
src/sounds/shrink.wav less more
Binary diff not shown
src/sounds/speeddown.wav less more
Binary diff not shown
src/sounds/speedup.wav less more
Binary diff not shown
src/sounds/standard.wav less more
Binary diff not shown
src/sounds/timeadd.wav less more
Binary diff not shown
src/sounds/verygood.wav less more
Binary diff not shown
src/sounds/wall.wav less more
Binary diff not shown
src/sounds/weak_ball.wav less more
Binary diff not shown
src/sounds/wontgiveup.wav less more
Binary diff not shown
+0
-467
src/theme.c less more
0 /***************************************************************************
1 theme.c - description
2 -------------------
3 begin : Fri Feb 15 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 #include <dirent.h>
20
21 #include "lbreakout.h"
22 #include "config.h"
23 #include "list.h"
24 #include "theme.h"
25 #include "levels.h"
26 #include "player.h"
27 #include "shrapnells.h"
28 #include "bricks.h"
29 #ifdef SOUND
30 #include "audio.h"
31 #endif
32
33 extern Sdl sdl;
34 extern Config config;
35 extern int ball_w, ball_h;
36 extern int shot_w, shot_h;
37 /* theme name list */
38 char **theme_names = 0;
39 int theme_count = 0;
40 /* current theme name */
41 char theme_name[32] = "Default";
42
43 /*
44 ====================================================================
45 Themeable gfx and sounds.
46 ====================================================================
47 */
48 SDL_Surface *exp_pic = 0;
49 SDL_Surface *exp_dark_pic = 0;
50 Font *font = 0;
51 #ifdef SOUND
52 Sound_Chunk *wav_click = 0;
53 Sound_Chunk *wav_damn = 0, *wav_dammit = 0, *wav_wontgiveup = 0, *wav_excellent = 0, *wav_verygood = 0;
54 #endif
55 SDL_Surface *brick_pic = 0;
56 SDL_Surface *brick_shadow = 0;
57 #ifdef SOUND
58 Sound_Chunk *wav_boom = 0;
59 #endif
60 SDL_Surface *paddle_pic = 0;
61 SDL_Surface *paddle_shadow = 0;
62 SDL_Surface *weapon_pic = 0;
63 SDL_Surface *weapon_shadow = 0;
64 #ifdef SOUND
65 Sound_Chunk *wav_expand = 0, *wav_shrink = 0, *wav_frozen = 0;
66 #endif
67 SDL_Surface *ball_pic = 0; /* ball pictures */
68 SDL_Surface *ball_shadow = 0;
69 #ifdef SOUND
70 Sound_Chunk *wav_reflect = 0;
71 Sound_Chunk *wav_attach = 0;
72 #endif
73 SDL_Surface *shot_pic = 0;
74 SDL_Surface *shot_shadow = 0;
75 #ifdef SOUND
76 Sound_Chunk *wav_shot = 0;
77 #endif
78 SDL_Surface *extra_pic = 0; /* graphics */
79 SDL_Surface *extra_shadow = 0;
80 SDL_Surface *wall_pic = 0;
81 #ifdef SOUND
82 Sound_Chunk *wav_score = 0, *wav_metal = 0, *wav_std = 0, *wav_wall = 0, *wav_joker = 0;
83 Sound_Chunk *wav_goldshower = 0;
84 Sound_Chunk *wav_speedup = 0, *wav_speeddown = 0;
85 Sound_Chunk *wav_chaos = 0, *wav_darkness = 0, *wav_ghost = 0;
86 Sound_Chunk *wav_timeadd = 0, *wav_expl_ball = 0, *wav_weak_ball = 0;
87 Sound_Chunk *wav_bonus_magnet = 0, *wav_malus_magnet = 0, *wav_disable = 0;
88 #endif
89 SDL_Surface *shine_pic = 0;
90 SDL_Surface *frame_left, *frame_top, *frame_right;
91 SDL_Surface *frame = 0; /* assembled frame */
92 SDL_Surface *frame_shadow = 0; /* shadow of frame */
93 SDL_Surface *lamps = 0; /* life lamps */
94 Font *frame_font;
95 #ifdef SOUND
96 Sound_Chunk *wav_life_up = 0, *wav_life_down = 0;
97 #endif
98 SDL_Surface *bkgnds[BACK_COUNT];
99 int bkgnd_count = 0;
100
101 /*
102 ====================================================================
103 Locals
104 ====================================================================
105 */
106
107 /*
108 ====================================================================
109 Load a picture or sound from theme directory or (if not found)
110 from original source directory.
111 ====================================================================
112 */
113 SDL_Surface* theme_load_surf( char *name )
114 {
115 SDL_Surface *surf = 0;
116 char path[512];
117 sprintf( path, "%s/.lgames/lbreakout2-themes/%s/%s", getenv( "HOME" ), theme_name, name );
118 if ( strequal( theme_name, "Default" ) || ( surf = load_surf( path, SDL_SWSURFACE | SDL_NONFATAL ) ) == 0 )
119 surf = load_surf( name, SDL_SWSURFACE );
120 return surf;
121 }
122 #ifdef SOUND
123 Sound_Chunk* theme_load_sound( char *name )
124 {
125 Sound_Chunk *sound = 0;
126 char path[512];
127 sprintf( path, "%s/.lgames/lbreakout2-themes/%s/%s", getenv( "HOME" ), theme_name, name );
128 if ( strequal( theme_name, "Default" ) || ( sound = sound_chunk_load( path ) ) == 0 )
129 sound = sound_chunk_load( name );
130 return sound;
131 }
132 #endif
133 Font* theme_load_font_fixed( char *name, int start, int len, int width )
134 {
135 Font *font = 0;
136 char path[512];
137 sprintf( path, "%s/.lgames/lbreakout2-themes/%s/%s", getenv( "HOME" ), theme_name, name );
138 if ( strequal( theme_name, "Default" ) || ( font = load_fixed_font( path, start, len, width, SDL_SWSURFACE | SDL_NONFATAL ) ) == 0 )
139 font = load_fixed_font( name, start, len, width, SDL_SWSURFACE );
140 return font;
141 }
142
143 /*
144 ====================================================================
145 The frame is a bit complex to be done.
146 ====================================================================
147 */
148 void theme_load_frame()
149 {
150 Uint32 ckey;
151 SDL_Rect rect = { BRICK_WIDTH, BRICK_HEIGHT, sdl.screen->w - BRICK_WIDTH * 2, sdl.screen->h - BRICK_HEIGHT };
152
153 /* load resources */
154 frame_left = theme_load_surf( "fr_left.bmp" );
155 frame_top = theme_load_surf( "fr_top.bmp" );
156 frame_right = theme_load_surf( "fr_right.bmp" );
157
158 /* use most right pixel of fr_right */
159 ckey = get_pixel( frame_right, frame_right->w - 1, 0 );
160 /* assemble frame */
161 frame = create_surf( sdl.screen->w, sdl.screen->h, SDL_SWSURFACE );
162 SDL_FillRect( frame, &rect, ckey );
163 /* left part */
164 DEST( frame, 0, 0, BRICK_WIDTH, sdl.screen->h );
165 SOURCE( frame_left, 0, 0 );
166 blit_surf();
167 /* top part */
168 DEST( frame, BRICK_WIDTH, 0, sdl.screen->w - BRICK_WIDTH * 2, BRICK_HEIGHT );
169 SOURCE( frame_top, 0, 0 );
170 blit_surf();
171 /* right part */
172 DEST( frame, sdl.screen->w - BRICK_WIDTH, 0, BRICK_WIDTH, sdl.screen->h );
173 SOURCE( frame_right, 0, 0 );
174 blit_surf();
175 /* create shadow */
176 SDL_SetColorKey( frame, SDL_SRCCOLORKEY, ckey );
177 frame_shadow = create_shadow( frame, 0, 0, frame->w, frame->h );
178
179 /* load other resources */
180 lamps = theme_load_surf( "life.bmp" );
181 frame_font = theme_load_font_fixed( "f_frame.bmp", 32, 96, 8 );
182 frame_font->align = ALIGN_X_RIGHT | ALIGN_Y_CENTER;
183
184 /* waves */
185 #ifdef SOUND
186 wav_life_up = theme_load_sound( "gainlife.wav" );
187 wav_life_down = theme_load_sound( "looselife.wav" );
188 #endif
189 }
190
191 /*
192 ====================================================================
193 Load backgrounds. If no background was found use the original
194 backgrounds. Else count the number of new backgrounds and use these.
195 ====================================================================
196 */
197 void theme_load_bkgnds()
198 {
199 int i;
200 struct stat filestat;
201 char path[512];
202 char fname[512];
203 sprintf( fname, "%s/.lgames/lbreakout2-themes/%s/back0.png", getenv( "HOME" ), theme_name );
204 if ( strequal( theme_name, "Default" ) || stat( fname, &filestat ) == -1 ) {
205 /* use original backs */
206 bkgnd_count = BACK_COUNT;
207 sprintf( path, "." );
208 }
209 else {
210 /* use new backs */
211 sprintf( path, "%s/.lgames/lbreakout2-themes/%s", getenv( "HOME" ), theme_name );
212 bkgnd_count = -1;
213 do {
214 bkgnd_count++;
215 if ( bkgnd_count == BACK_COUNT )
216 break;
217 sprintf( fname, "%s/back%i.png", path, bkgnd_count );
218 } while ( stat( fname, &filestat ) == 0 );
219 }
220 /* load backs */
221 for ( i = 0; i < bkgnd_count; i++ ) {
222 sprintf( fname, "%s/back%i.png", path, i );
223 bkgnds[i] = load_surf( fname, SDL_SWSURFACE );
224 }
225 }
226
227 /*
228 ====================================================================
229 Publics
230 ====================================================================
231 */
232
233 /*
234 ====================================================================
235 Get/delete names of all themes found in themes directory.
236 ====================================================================
237 */
238 void theme_get_list()
239 {
240 int i;
241 char dir[256];
242 char path[512];
243 DIR *hdir = 0;
244 struct dirent *entry = 0;
245 struct stat estat;
246 List *list = 0;
247 /* auxilary list */
248 list = list_create( LIST_NO_AUTO_DELETE, NO_CALLBACK );
249 /* theme directory */
250 sprintf( dir, "%s/.lgames/lbreakout2-themes", getenv( "HOME" ) );
251 if ( ( hdir = opendir( dir ) ) != 0 ) {
252 while ( ( entry = readdir( hdir ) ) ) {
253 if ( entry->d_name[0] == '.' )
254 continue;
255 /* full path */
256 sprintf( path, "%s/%s", dir, entry->d_name );
257 stat( path, &estat );
258 if ( S_ISDIR( estat.st_mode ) )
259 list_add( list, strdup( entry->d_name ) );
260 }
261 closedir( hdir );
262 }
263 /* create static list. first entry is default */
264 theme_count = list->count + 1;
265 theme_names = calloc( theme_count, sizeof( char* ) );
266 theme_names[0] = strdup( "Default" );
267 for ( i = 0; i < list->count; i++ )
268 theme_names[i + 1] = list_get( list, i );
269 list_delete( list );
270 /* if config's theme count is not equal reset the theme_id to 0 */
271 if ( theme_count != config.theme_count ) {
272 config.theme_count = theme_count;
273 config.theme_id = 0;
274 }
275 }
276 void theme_delete_list()
277 {
278 int i;
279 if ( theme_names ) {
280 for ( i = 0; i < theme_count; i++ )
281 if ( theme_names[i] ) free( theme_names[i] );
282 free( theme_names );
283 theme_names = 0;
284 }
285 }
286
287 /*
288 ====================================================================
289 Load theme by name or delete current theme (is done by load too
290 so it might be used to change a theme as well.)
291 ====================================================================
292 */
293 void theme_load( char *name )
294 {
295 int i;
296 /* clear resources */
297 theme_delete();
298 /* set theme name */
299 strcpy( theme_name, name );
300 /* load resources */
301 /* explosions */
302 exp_pic = theme_load_surf( "explosions.bmp" );
303 exp_dark_pic = theme_load_surf( "explosions_dark.bmp" );
304 /* main game font */
305 font = theme_load_font_fixed( "f_game.bmp", 32, 96, 10 );
306 font->align = ALIGN_X_CENTER | ALIGN_Y_CENTER;
307 /* main game sounds */
308 #ifdef SOUND
309 wav_click = theme_load_sound( "click.wav" );
310 wav_damn = theme_load_sound( "damn.wav" );
311 wav_dammit = theme_load_sound( "dammit.wav" );
312 wav_wontgiveup = theme_load_sound( "wontgiveup.wav" );
313 wav_excellent = theme_load_sound( "excellent.wav" );
314 wav_verygood = theme_load_sound( "verygood.wav" );
315 #endif
316 /* brick pics and shadow template */
317 brick_pic = theme_load_surf( "bricks.bmp" );
318 brick_shadow = create_shadow( brick_pic, 0, 0, BRICK_WIDTH, BRICK_HEIGHT );
319 /* brick destruction sound */
320 #ifdef SOUND
321 wav_boom = theme_load_sound( "exp.wav" );
322 #endif
323 /* paddle and weapon */
324 paddle_pic = theme_load_surf( "paddle.bmp" );
325 SDL_SetColorKey( paddle_pic, SDL_SRCCOLORKEY, get_pixel( paddle_pic, 0, 0 ) );
326 weapon_pic = theme_load_surf( "weapon.bmp" );
327 paddle_shadow = create_shadow( paddle_pic, 0, 0, paddle_pic->w, paddle_pic->h );
328 weapon_shadow = create_shadow( weapon_pic, 0, 0, weapon_pic->w, weapon_pic->h );
329 /* paddle sounds */
330 #ifdef SOUND
331 wav_expand = theme_load_sound( "expand.wav" );
332 wav_shrink = theme_load_sound( "shrink.wav" );
333 wav_frozen = theme_load_sound( "freeze.wav" );
334 #endif
335 /* ball gfx */
336 ball_pic = theme_load_surf( "ball.bmp" );
337 SDL_SetColorKey( ball_pic, SDL_SRCCOLORKEY, get_pixel( ball_pic, 0, 0 ) );
338 ball_shadow = create_shadow( ball_pic, 0, 0, ball_w, ball_h );
339 /* ball sounds */
340 #ifdef SOUND
341 wav_reflect = theme_load_sound( "reflect.wav" );
342 wav_attach = theme_load_sound( "attach.wav" );
343 #endif
344 /* shot gfx */
345 shot_pic = theme_load_surf( "shot.bmp" );
346 shot_shadow = create_shadow( shot_pic, 0, 0, shot_w, shot_h );
347 #ifdef SOUND
348 wav_shot = theme_load_sound( "shot.wav" );
349 #endif
350 /* extra pic */
351 extra_pic = theme_load_surf( "extras.bmp" );
352 SDL_SetColorKey( extra_pic, 0, 0 );
353 extra_shadow = create_shadow( extra_pic, 0, 0, BRICK_WIDTH, BRICK_HEIGHT );
354 /* wall */
355 wall_pic = create_surf( sdl.screen->w - 2 * BRICK_WIDTH, BRICK_HEIGHT, SDL_SWSURFACE );
356 /* bricks must have been loaded at this point! */
357 for ( i = 0; i < MAP_WIDTH - 2; i++ ) {
358 DEST( wall_pic, i * BRICK_WIDTH, 0, BRICK_WIDTH, BRICK_HEIGHT );
359 SOURCE( brick_pic, BRICK_WIDTH, 0 );
360 blit_surf();
361 }
362 /* extra sounds */
363 #ifdef SOUND
364 wav_score = theme_load_sound( "score.wav" );
365 wav_metal = theme_load_sound( "metal.wav" );
366 wav_speedup = theme_load_sound( "speedup.wav" );
367 wav_speeddown = theme_load_sound( "speeddown.wav" );
368 wav_std = theme_load_sound( "standard.wav" );
369 wav_wall = theme_load_sound( "wall.wav" );
370 wav_joker = theme_load_sound( "joker.wav" );
371 wav_goldshower = theme_load_sound( "goldshower.wav" );
372 wav_chaos = theme_load_sound( "chaos.wav" );
373 wav_darkness = theme_load_sound( "darkness.wav" );
374 wav_ghost = theme_load_sound( "ghost.wav" );
375 wav_timeadd = theme_load_sound( "timeadd.wav" );
376 wav_expl_ball = theme_load_sound( "expl_ball.wav" );
377 wav_weak_ball = theme_load_sound( "weak_ball.wav" );
378 wav_bonus_magnet = theme_load_sound( "bonus_magnet.wav" );
379 wav_malus_magnet = theme_load_sound( "malus_magnet.wav" );
380 wav_disable = theme_load_sound( "disable.wav" );
381 #endif
382 /* shine pic */
383 shine_pic = theme_load_surf( "shine.bmp" );
384 /* frame */
385 theme_load_frame();
386 /* backgrounds */
387 theme_load_bkgnds();
388 }
389 void theme_delete()
390 {
391 int i;
392 free_surf( &exp_pic );
393 free_surf( &exp_dark_pic );
394 free_font( &font );
395 #ifdef SOUND
396 sound_chunk_free( &wav_click );
397 sound_chunk_free( &wav_damn );
398 sound_chunk_free( &wav_dammit );
399 sound_chunk_free( &wav_wontgiveup );
400 sound_chunk_free( &wav_excellent );
401 sound_chunk_free( &wav_verygood );
402 #endif
403 free_surf( &brick_pic );
404 free_surf( &brick_shadow );
405 #ifdef SOUND
406 sound_chunk_free( &wav_boom );
407 #endif
408 free_surf( &paddle_pic );
409 free_surf( &weapon_pic );
410 free_surf( &paddle_shadow );
411 free_surf( &weapon_shadow );
412 #ifdef SOUND
413 sound_chunk_free( &wav_expand );
414 sound_chunk_free( &wav_shrink );
415 sound_chunk_free( &wav_frozen );
416 #endif
417 free_surf( &ball_pic );
418 free_surf( &ball_shadow );
419 #ifdef SOUND
420 sound_chunk_free( &wav_reflect );
421 sound_chunk_free( &wav_attach );
422 #endif
423 free_surf( &shot_pic );
424 free_surf( &shot_shadow );
425 #ifdef SOUND
426 sound_chunk_free( &wav_shot );
427 #endif
428 free_surf( &extra_pic );
429 free_surf( &extra_shadow );
430 free_surf( &wall_pic );
431 #ifdef SOUND
432 sound_chunk_free( &wav_score );
433 sound_chunk_free( &wav_metal );
434 sound_chunk_free( &wav_speedup );
435 sound_chunk_free( &wav_speeddown );
436 sound_chunk_free( &wav_std );
437 sound_chunk_free( &wav_wall );
438 sound_chunk_free( &wav_joker );
439 sound_chunk_free( &wav_goldshower );
440 sound_chunk_free( &wav_chaos );
441 sound_chunk_free( &wav_darkness );
442 sound_chunk_free( &wav_ghost );
443 sound_chunk_free( &wav_timeadd );
444 sound_chunk_free( &wav_expl_ball );
445 sound_chunk_free( &wav_weak_ball );
446 sound_chunk_free( &wav_bonus_magnet );
447 sound_chunk_free( &wav_malus_magnet );
448 sound_chunk_free( &wav_disable );
449 #endif
450 free_surf( &shine_pic );
451 free_surf( &frame_left );
452 free_surf( &frame_right );
453 free_surf( &frame_top );
454 free_surf( &frame );
455 free_surf( &frame_shadow );
456 free_surf( &lamps );
457 free_font( &frame_font );
458 #ifdef SOUND
459 sound_chunk_free( &wav_life_up );
460 sound_chunk_free( &wav_life_down );
461 #endif
462 for ( i = 0; i < bkgnd_count; i++ )
463 free_surf( &bkgnds[i] );
464 bkgnd_count = 0;
465 }
466
+0
-38
src/theme.h less more
0 /***************************************************************************
1 theme.h - description
2 -------------------
3 begin : Fri Feb 15 2002
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __THEME_H
18 #define __THEME_H
19
20 /*
21 ====================================================================
22 Get/delete names of all themes found in themes directory.
23 ====================================================================
24 */
25 void theme_get_list();
26 void theme_delete_list();
27
28 /*
29 ====================================================================
30 Load theme by name or delete current theme (is done by load too
31 so it might be used to change a theme as well.)
32 ====================================================================
33 */
34 void theme_load( char *name );
35 void theme_delete();
36
37 #endif
+0
-316
src/tools.c less more
0 /***************************************************************************
1 tools.c - description
2 -------------------
3 begin : Fri Jan 19 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <time.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <stdio.h>
21 #include "tools.h"
22
23 /* compares to strings and returns true if their first strlen(str1) chars are equal */
24 inline int strequal( char *str1, char *str2 )
25 {
26 if ( strlen( str1 ) != strlen( str2 ) ) return 0;
27 return ( !strncmp( str1, str2, strlen( str1 ) ) );
28 }
29
30 /* set delay to ms milliseconds */
31 inline void delay_set( Delay *delay, int ms )
32 {
33 delay->limit = ms;
34 delay->cur = 0;
35 }
36
37 /* reset delay ( cur = 0 )*/
38 inline void delay_reset( Delay *delay )
39 {
40 delay->cur = 0;
41 }
42
43 /* check if times out and reset */
44 inline int delay_timed_out( Delay *delay, int ms )
45 {
46 delay->cur += ms;
47 if ( delay->cur >= delay->limit ) {
48
49 delay->cur = 0;
50 return 1;
51
52 }
53 return 0;
54 }
55
56
57 inline void goto_tile( int *x, int *y, int d )
58 {
59 /* 0 -up, clockwise, 5 - left up */
60 switch ( d ) {
61
62 case 1:
63 if ( !( (*x) & 1 ) )
64 (*y)--;
65 (*x)++;
66 break;
67 case 2:
68 if ( (*x) & 1 )
69 (*y)++;
70 (*x)++;
71 break;
72 case 4:
73 if ( (*x) & 1 )
74 (*y)++;
75 (*x)--;
76 break;
77 case 5:
78 if ( !( (*x) & 1 ) )
79 (*y)--;
80 (*x)--;
81 break;
82
83 }
84 }
85
86 /* return distance between to map positions */
87 int get_dist( int x1, int y1, int x2, int y2 )
88 {
89 int range = 0;
90
91 while ( x1 != x2 || y1 != y2 ) {
92
93 /* approach to x2,y2 */
94 /* 0 -up, clockwise, 5 - left up */
95 if ( y1 < y2 ) {
96
97 if ( x1 < x2 )
98 goto_tile( &x1, &y1, 2 );
99 else
100 if ( x1 > x2 )
101 goto_tile( &x1, &y1, 4 );
102 else
103 y1++;
104
105 }
106 else
107 if ( y1 > y2 ) {
108
109 if ( x1 < x2 )
110 goto_tile( &x1, &y1, 1 );
111 else
112 if ( x1 > x2 )
113 goto_tile( &x1, &y1, 5 );
114 else
115 y1--;
116
117 }
118 else {
119
120 if ( x1 < x2 )
121 x1++;
122 else
123 if ( x1 > x2 )
124 x1--;
125
126 }
127
128 range++;
129 }
130
131 return range;
132 }
133
134 /* init random seed by using ftime */
135 void set_random_seed()
136 {
137 srand( (unsigned int)time( 0 ) );
138 }
139
140 /* get coordinates from string */
141 void get_coord( char *str, int *x, int *y )
142 {
143 int i;
144 char *cur_arg = 0;
145
146 *x = *y = 0;
147
148 /* get position of comma */
149 for ( i = 0; i < strlen( str ); i++ )
150 if ( str[i] == ',' ) break;
151 if ( i == strlen( str ) ) {
152 fprintf( stderr, "get_coord: no comma found in pair of coordinates '%s'\n", str );
153 return; /* no comma found */
154 }
155
156 /* y */
157 cur_arg = str + i + 1;
158 if ( cur_arg[0] == 0 )
159 fprintf( stderr, "get_coord: warning: y-coordinate is empty (maybe you left a space between x and comma?)\n" );
160 *y = atoi( cur_arg );
161 /* x */
162 cur_arg = strdup( str ); cur_arg[i] = 0;
163 *x = atoi( cur_arg );
164 FREE( cur_arg );
165 }
166
167 /* replace new_lines with spaces in text */
168 void repl_new_lines( char *text )
169 {
170 int i;
171 for ( i = 0; i < strlen( text ); i++ )
172 if ( text[i] < 32 )
173 text[i] = 32;
174 }
175
176 // convert a str into text ( for listbox ) //
177 // char width is the width of a line in characters //
178 Text* create_text( char *orig_str, int char_width )
179 {
180 int i, j;
181 char line[256]; /* a line should not exceed this length */
182 int pos;
183 int last_space;
184 int new_line;
185 Text *text = 0;
186 char *str = 0;
187
188 text = calloc ( 1, sizeof( Text ) );
189
190 // maybe orig_str is a constant expression; duplicate for safety //
191 str = strdup( orig_str );
192
193 // replace original new_lines with spaces //
194 repl_new_lines( str );
195
196 /* change some spaces to new_lines, so that the new text fits the wanted line_length */
197 /* NOTE: '#' means new_line ! */
198 // if character with is 0 it's just a single line //
199 if ( char_width > 0 ) {
200 pos = 0;
201 while ( pos < strlen( str ) ) {
202 last_space = 0;
203 new_line = 0;
204 i = 0;
205 while ( !new_line && i < char_width && i + pos < strlen( str ) ) {
206 switch ( str[pos + i] ) {
207 case '#': new_line = 1;
208 case 32: last_space = i; break;
209 }
210 i++;
211 }
212 if ( i + pos >= strlen( str ) ) break;
213 if ( last_space == 0 ) {
214 /* uhh... much to long, we'll have to cut a word into pieces ... */
215 last_space = char_width / 2;
216 }
217 str[pos + last_space] = 10;
218 pos += last_space;
219 }
220 }
221
222 /* count lines */
223 if ( char_width > 0 ) {
224 for ( i = 0; i < strlen( str ); i++ )
225 if ( str[i] == 10 )
226 text->count++;
227 /* maybe one unfinished line */
228 if ( str[strlen( str ) - 1] != 10 )
229 text->count++;
230 }
231 else
232 text->count = 1;
233
234 /* get mem */
235 text->lines = calloc( text->count, sizeof( char* ) );
236
237 pos = 0;
238 /* get all lines */
239 for ( j = 0; j < text->count; j++ ) {
240 i = 0;
241 while ( pos + i < strlen( str ) && str[pos + i] != 10 ) {
242 line[i] = str[i + pos];
243 i++;
244 }
245 pos += i; pos++;
246 line[i] = 0;
247 text->lines[j] = strdup( line );
248 }
249
250 if ( text->count == 0 )
251 fprintf( stderr, "conv_to_text: warning: line_count is 0\n" );
252
253 free( str );
254
255 return text;
256 }
257
258 // delete text //
259 void delete_text( Text *text )
260 {
261 int i;
262
263 if ( text == 0 ) return;
264 /*
265 if ( lines[1][1] == 'e' && lines[1][0] == '<' )
266 printf( "hallo\n" );
267
268 printf( "--- deleting:\n" );
269 for ( i = 0; i < line_count; i++ ) {
270 printf( lines[i] );
271 printf( "\n" );
272 }*/
273 if ( text->lines ) {
274 for ( i = 0; i < text->count; i++ )
275 if ( text->lines[i] )
276 free( text->lines[i] );
277 free( text->lines );
278 }
279 free( text );
280 }
281
282 /*
283 ====================================================================
284 Get type and prefix from string:
285 type::prefix
286 Set both pointers 0 if failure.
287 ====================================================================
288 */
289 void get_type_and_prefix( char *arg, char **type, char **prefix )
290 {
291 char *first, *second;
292
293 *type = *prefix = 0;
294
295 first = strtok( arg, ":" );
296 second = strtok( 0, ":" );
297
298 if ( first == 0 || second == 0 ) return;
299
300 *type = strdup( first );
301 *prefix = strdup( second );
302 }
303
304 /*
305 ====================================================================
306 Replace any existence of character old into new.
307 ====================================================================
308 */
309 void strrepl( char **str, char c_old, char c_new )
310 {
311 char *pos;
312 while ( ( pos = strchr( *str, c_old ) ) != 0 )
313 pos[0] = c_new;
314 }
315
+0
-91
src/tools.h less more
0 /***************************************************************************
1 tools.h - description
2 -------------------
3 begin : Fri Jan 19 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __TOOLS_H
18 #define __TOOLS_H
19
20 /* this file contains some useful tools */
21
22 /* free with a check */
23 #define FREE( ptr ) { if ( ptr ) free( ptr ); ptr = 0; }
24
25 /* check if a serious of flags is set in source */
26 #define CHECK_FLAGS( source, flags ) ( source & (flags) )
27
28 /* return random value between ( and including ) upper,lower limit */
29 #define RANDOM( lower, upper ) ( ( rand() % ( ( upper ) - ( lower ) + 1 ) ) + ( lower ) )
30
31 /* compute distance of two vectors */
32 #define VEC_DIST( vec1, vec2 ) ( sqrt( ( vec1.x - vec2.x ) * ( vec1.x - vec2.x ) + ( vec1.y - vec2.y ) * ( vec1.y - vec2.y ) ) )
33
34 /* compares to strings and returns true if their first strlen(str1) chars are equal */
35 inline int strequal( char *str1, char *str2 );
36
37 /* delete lines */
38 void delete_lines( char **lines, int line_number );
39
40 /* delay struct */
41 typedef struct {
42 int limit;
43 int cur;
44 } Delay;
45
46 /* set delay to ms milliseconds */
47 inline void delay_set( Delay *delay, int ms );
48
49 /* reset delay ( cur = 0 )*/
50 inline void delay_reset( Delay *delay );
51
52 /* check if time's out ( add ms milliseconds )and reset */
53 inline int delay_timed_out( Delay *delay, int ms );
54
55 /* return distance betwteen to map positions */
56 int get_dist( int x1, int y1, int x2, int y2 );
57
58 /* init random seed by using ftime */
59 void set_random_seed();
60
61 /* get coordintaes from string */
62 void get_coord( char *str, int *x, int *y );
63
64 // text structure //
65 typedef struct {
66 char **lines;
67 int count;
68 } Text;
69 // convert a str into text ( for listbox ) //
70 Text* create_text( char *str, int char_width );
71 // delete text //
72 void delete_text( Text *text );
73
74 /*
75 ====================================================================
76 Get type and prefix from string:
77 type::prefix
78 Set both pointers 0 if failure.
79 ====================================================================
80 */
81 void get_type_and_prefix( char *arg, char **ext, char **prefix );
82
83 /*
84 ====================================================================
85 Replace any existence of character old into new.
86 ====================================================================
87 */
88 void strrepl( char **str, char c_old, char c_new );
89
90 #endif
+0
-261
src/value.c less more
0 /***************************************************************************
1 value.c - description
2 -------------------
3 begin : Sun Sep 23 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include <ctype.h>
18 #include "manager.h"
19
20 /*
21 ====================================================================
22 Locals
23 ====================================================================
24 */
25
26 /*
27 ====================================================================
28 Update val_str if not ITEM_VALUE
29 ====================================================================
30 */
31 void value_update_str( Value *value )
32 {
33 switch ( value->type ) {
34 case VALUE_RANGE_INT: sprintf( value->val_str, "%i", *value->val_int ); break;
35 case VALUE_RANGE_STR: sprintf( value->val_str, "%s", value->names[*value->val_int] ); break;
36 case VALUE_KEY:
37 if ( value->grab ) { strcpy( value->val_str, "???" ); break; }
38 switch ( *value->val_int ) {
39 case SDLK_SPACE: strcpy( value->val_str, "Space" ); break;
40 case SDLK_LEFT: strcpy( value->val_str, "Left" ); break;
41 case SDLK_RIGHT: strcpy( value->val_str, "Right" ); break;
42 case SDLK_UP: strcpy( value->val_str, "Up" ); break;
43 case SDLK_DOWN: strcpy( value->val_str, "Down" ); break;
44 case SDLK_RSHIFT: strcpy( value->val_str, "Right Shift" ); break;
45 case SDLK_LSHIFT: strcpy( value->val_str, "Left Shift" ); break;
46 case SDLK_RCTRL: strcpy( value->val_str, "Right Ctrl" ); break;
47 case SDLK_LCTRL: strcpy( value->val_str, "Left Ctrl" ); break;
48 case SDLK_RALT: strcpy( value->val_str, "Right Alt" ); break;
49 case SDLK_LALT: strcpy( value->val_str, "Left Alt" ); break;
50 case SDLK_BACKSPACE: strcpy( value->val_str, "BackSpace" ); break;
51 default:
52 if ( *value->val_int >= SDLK_a && *value->val_int <= SDLK_z )
53 sprintf( value->val_str, "'%c'", (char)toupper( *value->val_int ) );
54 else
55 sprintf( value->val_str, "%i", *value->val_int );
56 break;
57 }
58 break;
59 }
60 }
61
62 /*
63 ====================================================================
64 Create basic value
65 ====================================================================
66 */
67 Value *value_create_basic( int type, int *val_int )
68 {
69 Value *value = calloc( 1, sizeof( Value ) );
70 value->type = type;
71 value->val_int = val_int;
72 /* if not VALUE_EDIT create val_str which carries translated val_int */
73 if ( type != VALUE_EDIT ) value->val_str = calloc( 256, sizeof( char ) );
74 return value;
75 }
76
77 /*
78 ====================================================================
79 Publics
80 ====================================================================
81 */
82
83 /*
84 ====================================================================
85 Auxiliary functions to setup a key filter.
86 ====================================================================
87 */
88 void filter_clear( int *filter )
89 {
90 memset( filter, 0, sizeof( int ) * SDLK_LAST );
91 }
92 void filter_set( int *filter, int first, int last, int allowed )
93 {
94 int i;
95 for ( i = first; i <= last; i++ )
96 filter[i] = allowed;
97 }
98
99 /*
100 ====================================================================
101 Create a value. names and filter are duplicated and freed by
102 value_delete().
103 Return Value: value
104 ====================================================================
105 */
106 Value *value_create_empty()
107 {
108 return value_create_basic( VALUE_NONE, 0 );
109 }
110 Value *value_create_range_int( int *val_int, int min, int max, int step )
111 {
112 Value *value = value_create_basic( VALUE_RANGE_INT, val_int );
113 value->min = min; value->max = max; value->step = step;
114 value_update_str( value );
115 return value;
116 }
117 Value *value_create_range_str( int *val_int, char **names, int count )
118 {
119 int i;
120 Value *value = value_create_basic( VALUE_RANGE_STR, val_int );
121 value->min = 0; value->max = count - 1; value->step = 1;
122 /* duplicate names */
123 value->name_count = count;
124 value->names = calloc( count, sizeof( char* ) );
125 for ( i = 0; i < count; i++ )
126 value->names[i] = strdup( names[i] );
127 value_update_str( value );
128 return value;
129 }
130 Value *value_create_key( int *val_int, int *filter )
131 {
132 int i;
133 Value *value = value_create_basic( VALUE_KEY, val_int );
134 /* duplicate filter */
135 value->filter = calloc( SDLK_LAST, sizeof( int ) );
136 for ( i = 0; i < SDLK_LAST; i++ ) value->filter[i] = filter[i];
137 value_update_str( value );
138 /* list of other key values */
139 value->other_keys = list_create( LIST_NO_AUTO_DELETE, NO_CALLBACK );
140 return value;
141 }
142 Value *value_create_edit( char *val_str, int limit )
143 {
144 Value *value = value_create_basic( VALUE_EDIT, 0 );
145 value->val_str = val_str;
146 value->max = limit;
147 return value;
148 }
149 /*
150 ====================================================================
151 Delete a value
152 ====================================================================
153 */
154 void value_delete( Value *value )
155 {
156 int i;
157 if ( !value ) return;
158 if ( value->filter ) free( value->filter );
159 if ( value->names ) {
160 for ( i = 0; i < value->name_count; i++ )
161 if ( value->names[i] ) free( value->names[i] );
162 free( value->names );
163 }
164 if ( value->type != VALUE_EDIT && value->val_str ) free( value->val_str );
165 if ( value->other_keys ) list_delete( value->other_keys );
166 free( value );
167 }
168 /*
169 ====================================================================
170 Increase, decrease if range.
171 ====================================================================
172 */
173 void value_dec( Value *value )
174 {
175 *value->val_int -= value->step;
176 if ( *value->val_int < value->min ) *value->val_int = value->max;
177 value_update_str( value );
178 }
179 void value_inc( Value *value )
180 {
181 *value->val_int += value->step;
182 if ( *value->val_int > value->max ) *value->val_int = value->min;
183 value_update_str( value );
184 }
185 /*
186 ====================================================================
187 Grab input of VALUE_KEY
188 ====================================================================
189 */
190 void value_grab( Value *value )
191 {
192 if ( value->type == VALUE_KEY ) {
193 value->grab = 1;
194 value_update_str( value );
195 }
196 }
197 /*
198 ====================================================================
199 Set key value if VALUE_KEY and clear grab flag
200 ====================================================================
201 */
202 void value_set_key( Value *value, int val_int )
203 {
204 Value *other_key;
205 if ( !value->filter[val_int] ) return;
206 list_reset( value->other_keys );
207 while ( ( other_key = list_next( value->other_keys ) ) )
208 if ( *other_key->val_int == val_int ) return;
209 /* ok, set */
210 *value->val_int = val_int;
211 value->grab = 0;
212 value_update_str( value );
213 }
214 /*
215 ====================================================================
216 Edit string if VALUE_EDIT
217 ====================================================================
218 */
219 void value_edit( Value *value, int code, int unicode )
220 {
221 int length = strlen( value->val_str );
222 if ( code == SDLK_BACKSPACE && length > 0 )
223 value->val_str[length - 1] = 0;
224 else
225 if ( code >= 32 && code < 128 && length < value->max )
226 value->val_str[length] = unicode;
227 }
228 /*
229 ====================================================================
230 Add another dynamically restricted key (as VALUE_KEY) to other_key
231 list.
232 ====================================================================
233 */
234 void value_add_other_key( Value *value, Value *other_key )
235 {
236 if ( value->type != VALUE_KEY ) return;
237 list_add( value->other_keys, other_key );
238 }
239 /*
240 ====================================================================
241 Set a new name list (and update position) for VALUE_RANGE_STR.
242 ====================================================================
243 */
244 void value_set_new_names( Value *value, char **names, int count )
245 {
246 int i;
247 if ( value->type != VALUE_RANGE_STR ) return;
248 if ( value->names ) {
249 for ( i = 0; i < value->name_count; i++ )
250 if ( value->names[i] ) free( value->names[i] );
251 free( value->names );
252 }
253 value->name_count = count;
254 value->max = count - 1;
255 if ( *value->val_int > value->max ) *value->val_int = 0;
256 value->names = calloc( count, sizeof( char* ) );
257 for ( i = 0; i < count; i++ )
258 value->names[i] = strdup( names[i] );
259 value_update_str( value );
260 }
+0
-115
src/value.h less more
0 /***************************************************************************
1 value.h - description
2 -------------------
3 begin : Thu Sep 20 2001
4 copyright : (C) 2001 by Michael Speck
5 email : kulkanie@gmx.net
6 ***************************************************************************/
7
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #ifndef __VALUE_H
18 #define __VALUE_H
19
20 /*
21 ====================================================================
22 Value contained and handled by item.
23 ====================================================================
24 */
25 enum {
26 VALUE_NONE = 0, /* no value: separator */
27 VALUE_RANGE_INT, /* range of integers */
28 VALUE_RANGE_STR, /* range of strings: min == 0, max == count, step == 1 */
29 VALUE_KEY, /* single key value */
30 VALUE_EDIT /* editable string */
31 };
32 typedef struct _Value {
33 int type; /* type of value */
34 int min, max, step; /* integer range of value */
35 int *val_int; /* value as integer (position in range or key value) */
36 char *val_str; /* value as string (either name or converted val_int)
37 --duplicated except for VALUE_EDIT */
38 char **names; /* if set val_int is associated to the indexed name and val_str
39 is set to this name instead of the converted integer value
40 --duplicated */
41 int name_count; /* number of names */
42 int *filter; /* key filter (size: SDLK_LAST) --duplicated */
43 List *other_keys; /* list of other key values for VALUE_KEY: these are
44 restricted, too */
45 int grab; /* if type is VALUE_KEY and this is set all events except QUIT and
46 KEYUP are ignored */
47 } Value;
48
49 /*
50 ====================================================================
51 Auxiliary functions to setup a key filter.
52 ====================================================================
53 */
54 void filter_clear( int *filter );
55 void filter_set( int *filter, int first, int last, int allowed );
56
57 /*
58 ====================================================================
59 Create a value. names and filter are duplicated and freed by
60 value_delete().
61 Return Value: value
62 ====================================================================
63 */
64 Value *value_create_empty();
65 Value *value_create_range_int( int *val_int, int min, int max, int step );
66 Value *value_create_range_str( int *val_int, char **names, int count );
67 Value *value_create_key( int *val_int, int *filter );
68 Value *value_create_edit( char *val_str, int limit );
69 /*
70 ====================================================================
71 Delete a value
72 ====================================================================
73 */
74 void value_delete( Value *value );
75 /*
76 ====================================================================
77 Increase, decrease if range.
78 ====================================================================
79 */
80 void value_dec( Value *value );
81 void value_inc( Value *value );
82 /*
83 ====================================================================
84 Grab input of VALUE_KEY
85 ====================================================================
86 */
87 void value_grab( Value *value );
88 /*
89 ====================================================================
90 Set key value if VALUE_KEY and clear grab flag
91 ====================================================================
92 */
93 void value_set_key( Value *value, int val_int );
94 /*
95 ====================================================================
96 Edit string if VALUE_EDIT
97 ====================================================================
98 */
99 void value_edit( Value *value, int code, int unicode );
100 /*
101 ====================================================================
102 Add another dynamically restricted key (as VALUE_KEY) to other_key
103 list.
104 ====================================================================
105 */
106 void value_add_other_key( Value *value, Value *other_key );
107 /*
108 ====================================================================
109 Set a new name list (and update position) for VALUE_RANGE_STR.
110 ====================================================================
111 */
112 void value_set_new_names( Value *value, char **names, int count );
113
114 #endif
0 dirs="gui
1 common
2 game
3 server
4 client"
5 if [ ! -z "$1" ]; then
6 dirs=$1
7 fi
8 for dir in $dirs; do
9 cd $dir
10 for file in *.c; do
11 echo "making $dir/$file"
12 gcc -DNETWORK_ENABLED -DSDL_NET_ENABLED -march=i386 -DAUDIO_ENABLED -DSRC_DIR=\".\" -DHI_DIR=\".\" -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/local/include -Wall -I/usr/local/include/SDL -Dmain=SDL_main -c `test -f $file || echo './'`$file
13 done
14 cd ..
15 done
0 rm -rf lbreakout2
1 mkdir lbreakout2 lbreakout2/client lbreakout2/server
2 cp -R client/gfx client/gui_theme client/levels client/sounds lbreakout2/client
3 cp -R server/levels lbreakout2/server
4 cp client/lbreakout2.exe lbreakout2/client
5 cp server/lbreakout2server.exe lbreakout2/server
6 cp win32dlls/*.dll lbreakout2/client
7 cp win32dlls/SDL_net.dll lbreakout2/server
8 cp AUTHORS COPYING INSTALL README TODO Changelog lbreakout2
9
10 makefiles=`find lbreakout2 -name Makefile`
11 for file in $makefiles; do
12 rm $file
13 done
14 makefiles=`find lbreakout2 -name Makefile.am`
15 for file in $makefiles; do
16 rm $file
17 done
18 makefiles=`find lbreakout2 -name Makefile.in`
19 for file in $makefiles; do
20 rm $file
21 done