Commit 0f81db78 authored by Colin Tuckley's avatar Colin Tuckley Committed by Andreas Tille

Import Debian changes 2.6.3-1

lbreakout2 (2.6.3-1) unstable; urgency=low

  * New upstream release (Closes: #653902).
    incl upstream fix for warp limit (Closes: #307126)
  * Ack NMU
  * Fix desktop file (Closes: #638992)
parents fcce5367 32c118ee
2.6.3:
- fixed compiler warnings (2011/03/08 MS)
- fixed bug in loading levelsets formated in DOS (2011/03/07 MS)
- added comfortable levelset selection (2011/03/07 MS)
- fixed compile issue with libpng-1.5 (2011/03/02 Thomas Klausner)
- improved french localisation (2011/03/02 stormi)
2.6.2:
- added some new levelsets and updates (2010/10/05 MS)
- do not consider grown bricks for warp limit (2010/10/05 MS)
- fixed possible highscore loss on write error (2010/10/05 MS)
- fixed broken compilation with audio disabled (2010/10/04 Petr Pisar)
2.6.1:
- fixed missing font transparency in help screen (24/12/09 MS)
- fixed bug in menus's level set list that prevented first few entries
......
......@@ -29,7 +29,7 @@ lbreakout2res.o: win32.ico
bin_PROGRAMS = lbreakout2
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 \
file.c config.c setselect.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 \
......@@ -39,7 +39,7 @@ lbreakout2_LDADD = @win32_deps@ ../common/libcommon.a ../gui/libGui.a ../game/li
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 \
file.h config.h lbreakout.h setselect.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 \
......
......@@ -70,10 +70,10 @@ am_lbreakout2_OBJECTS = credit.$(OBJEXT) shine.$(OBJEXT) \
shots.$(OBJEXT) event.$(OBJEXT) paddle.$(OBJEXT) \
frame.$(OBJEXT) misc.$(OBJEXT) bricks.$(OBJEXT) \
player.$(OBJEXT) file.$(OBJEXT) config.$(OBJEXT) \
item.$(OBJEXT) menu.$(OBJEXT) manager.$(OBJEXT) \
value.$(OBJEXT) chart.$(OBJEXT) editor.$(OBJEXT) \
help.$(OBJEXT) hint.$(OBJEXT) theme.$(OBJEXT) client.$(OBJEXT) \
client_recv.$(OBJEXT) client_data.$(OBJEXT) \
setselect.$(OBJEXT) item.$(OBJEXT) menu.$(OBJEXT) \
manager.$(OBJEXT) value.$(OBJEXT) chart.$(OBJEXT) \
editor.$(OBJEXT) help.$(OBJEXT) hint.$(OBJEXT) theme.$(OBJEXT) \
client.$(OBJEXT) client_recv.$(OBJEXT) client_data.$(OBJEXT) \
client_handlers.$(OBJEXT) game.$(OBJEXT) comm.$(OBJEXT) \
slot.$(OBJEXT) display.$(OBJEXT) main.$(OBJEXT)
lbreakout2_OBJECTS = $(am_lbreakout2_OBJECTS)
......@@ -236,7 +236,7 @@ win32_deps = @win32_deps@
win32_inst_script = @win32_inst_script@
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 \
file.c config.c setselect.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 \
......@@ -246,7 +246,7 @@ lbreakout2_DEPENDENCIES = @win32_deps@
lbreakout2_LDADD = @win32_deps@ ../common/libcommon.a ../gui/libGui.a ../game/libgame.a @mixer_flag@ @sdlnet_lib_flag@
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 \
file.h config.h lbreakout.h setselect.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 \
......@@ -345,6 +345,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paddle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/player.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setselect.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shine.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shots.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shrapnells.Po@am__quote@
......
......@@ -59,9 +59,15 @@ void client_brick_remove( int mx, int my, int type, Vector imp, Paddle *paddle,
type = SHR_BY_EXPL; /* WITH_EXPL is not known */
}
/* decrease brick count if no indestructible brick was destroyed */
if ( game->bricks[mx][my].dur != -1 )
game->bricks_left--;
/* decrease brick count if no indestructible brick was destroyed */
if ( game->bricks[mx][my].dur != -1 ) {
game->bricks_left--;
/* adjust warp limit if this was a grown brick; then limit
* has to decrease again */
if (IS_GROWN_BRICK_CHAR(game->bricks[mx][my].brick_c))
game->warp_limit--;
}
/* before removing the brick, store the brick id for animation */
anim_brick_id = game->bricks[mx][my].id;
......@@ -159,8 +165,18 @@ static void client_brick_grow( int x, int y, int id )
/* keep the extra that is already assigned to this position */
brick->exp_time = -1;
brick->heal_time = -1;
if (!isReplace) game->bricks_left++;
/* XXX mark grown bricks by upper case. with this trick we can store
* this information in the level snapshot. */
brick->brick_c -= 32; /* f->F, ... */
if (!isReplace) {
game->bricks_left++;
/* adjust warp limit (grown bricks don't help hitting limit) */
game->warp_limit++;
}
if ( !game->extra_active[EX_DARKNESS] ) {
px = x * BRICK_WIDTH;
py = y * BRICK_HEIGHT;
......
......@@ -64,7 +64,7 @@ void chart_reset( Set_Chart *chart )
Create/delete set chart.
====================================================================
*/
Set_Chart* chart_set_create( char *name )
Set_Chart* chart_set_create( const char *name )
{
Set_Chart *chart = calloc( 1, sizeof( Set_Chart ) );
chart->name = strdup( name );
......@@ -251,7 +251,8 @@ void chart_save()
}
else {
/* open file */
file = fopen( file_name, "w" );
if ((file = fopen( file_name, "r+" )) == NULL)
file = fopen( file_name, "w" ); /* either no access or it does not exist so try this */
}
if ( !file ) {
......@@ -374,6 +375,52 @@ void chart_show( Set_Chart *chart, int x, int y, int w, int h )
}
/*
====================================================================
Draw highscores centered in regio x,y,w,h but in a more compact way
(no title). Also don't use chart_pos (except for x).
====================================================================
*/
void chart_show_compact( Set_Chart *chart, int x, int y, int w, int h )
{
int px = x + ( w - chart_pos.w ) / 2, py = y;
char number_buffer[24];
int entry_offset; /* y offset of entries */
StkFont *font;
int i;
/* caption */
ccfont->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
char *cheader = _("Name Level Score");
stk_font_write( ccfont, stk_display, px, py, -1, cheader );
/* get entry offset */
entry_offset = ( ccfont->height + 2) + py;
/* entries */
for ( i = 0; i < CHART_ENTRY_COUNT; i++ ) {
font = cfont;
if ( chart->entries[i].new_entry ) font = chfont;
/* name */
font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
stk_font_write( font, stk_display,
px, entry_offset, -1, chart->entries[i].name );
/* level */
font->align = STK_FONT_ALIGN_CENTER_X | STK_FONT_ALIGN_TOP;
sprintf( number_buffer, "%i", chart->entries[i].level );
stk_font_write( font, stk_display,
px + chart_level_offset, entry_offset, -1, number_buffer );
/* score */
font->align = STK_FONT_ALIGN_RIGHT | STK_FONT_ALIGN_TOP;
sprintf( number_buffer, "%i", chart->entries[i].score );
stk_font_write( font, stk_display,
px + chart_pos.w, entry_offset, -1, number_buffer );
/* change offset */
entry_offset += font->height - 1;
}
{ SDL_Rect region = { x, y, w, h };
stk_display_store_rect( &region ); }
}
/*
====================================================================
Clear all new_entry flags (done before new players are added
to chart when game over).
====================================================================
......@@ -395,7 +442,7 @@ Query set chart by this name or if not found create a new one
by this name.
====================================================================
*/
Set_Chart* chart_set_query( char *name )
Set_Chart* chart_set_query( const char *name )
{
Set_Chart *chart = 0;
list_reset( charts );
......@@ -403,7 +450,7 @@ Set_Chart* chart_set_query( char *name )
if ( strequal( name, chart->name ) )
return chart;
/* not found so create it */
fprintf( stderr, _("First chart query for '%s'. Creating this chart.\n"), name );
//fprintf( stderr, _("First chart query for '%s'. Creating this chart.\n"), name );
chart = chart_set_create( name );
list_add( charts, chart );
return chart;
......
......@@ -78,6 +78,13 @@ Draw highscores centered in regio x,y,w,h
void chart_show( Set_Chart *chart, int x, int y, int w, int h );
/*
====================================================================
Draw highscores centered in regio x,y,w,h but in a more compact way
(no title). Also don't use chart_pos (except for x).
====================================================================
*/
void chart_show_compact( Set_Chart *chart, int x, int y, int w, int h );
/*
====================================================================
Clear all new_entry flags (done before new players are added
to chart when game over).
====================================================================
......@@ -89,7 +96,7 @@ Query set chart by this name or if not found create a new one
by this name.
====================================================================
*/
Set_Chart* chart_set_query( char *name );
Set_Chart* chart_set_query( const char *name );
/*
====================================================================
Query chart by id. If id is invalid return 0.
......
......@@ -275,27 +275,27 @@ static void client_parse_packet()
* message was sent because ADD_USER commands may be in the
* package and these we should get. */
case MSG_PADDLE_STATE:
comm_unpack_paddle_dummy( net_buffer, &msg_read_pos );
comm_unpack_paddle_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_SHOT_POSITIONS:
comm_unpack_shots_dummy( net_buffer, &msg_read_pos );
comm_unpack_shots_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_BALL_POSITIONS:
comm_unpack_balls_dummy( net_buffer, &msg_read_pos );
comm_unpack_balls_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_SCORES:
comm_unpack_scores_dummy( net_buffer, &msg_read_pos );
comm_unpack_scores_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_BRICK_HITS:
comm_unpack_brick_hits_dummy( net_buffer, &msg_read_pos );
comm_unpack_brick_hits_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_NEW_EXTRAS:
comm_unpack_collected_extras_dummy( net_buffer, &msg_read_pos );
comm_unpack_collected_extras_dummy( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_ROUND_OVER:
......
......@@ -236,7 +236,7 @@ static void comm_parse_packet()
cur_player->next_paddle_id = msg_read_int8(); /* top or bottom? */
msg_read( 536, msgbuf );
if ( !msg_read_failed() ) {
comm_unpack_level( &cur_player->snapshot, msgbuf, &msglen );
comm_unpack_level( &cur_player->snapshot, (unsigned char*)msgbuf, &msglen );
cur_player->next_level_received = 1;
handled = 1;
}
......@@ -280,15 +280,15 @@ static void comm_parse_packet()
//if ( client_state == CS_PLAY )
switch ( type ) {
case MSG_PADDLE_STATE:
comm_unpack_paddle( r_paddle, net_buffer, &msg_read_pos );
comm_unpack_paddle( r_paddle, (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_SHOT_POSITIONS:
comm_unpack_shots( net_buffer, &msg_read_pos );
comm_unpack_shots( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_BALL_POSITIONS:
comm_unpack_balls( net_buffer, &msg_read_pos );
comm_unpack_balls( (unsigned char*)net_buffer, &msg_read_pos );
#ifdef AUDIO_ENABLED
/* play sounds for attached, reflected balls or fired shots */
......@@ -308,11 +308,11 @@ static void comm_parse_packet()
handled = 1;
break;
case MSG_SCORES:
comm_unpack_scores( net_buffer, &msg_read_pos );
comm_unpack_scores( (unsigned char*)net_buffer, &msg_read_pos );
handled = 1;
break;
case MSG_BRICK_HITS:
comm_unpack_brick_hits( net_buffer, &msg_read_pos );
comm_unpack_brick_hits( (unsigned char*)net_buffer, &msg_read_pos );
/* handle brick hits and create new extras. the extras
* are moved independently by the client and destroyed on
......@@ -324,7 +324,7 @@ static void comm_parse_packet()
handled = 1;
break;
case MSG_NEW_EXTRAS:
comm_unpack_collected_extras( net_buffer, &msg_read_pos );
comm_unpack_collected_extras( (unsigned char*)net_buffer, &msg_read_pos );
/* these collected extras take effect */
for ( i = 0; i < game->paddle_count; i++ ) {
......@@ -402,7 +402,7 @@ void comm_send_paddle( Paddle *paddle )
}
msgbuf[0] = MSG_PADDLE_STATE; msglen = 1;
comm_pack_paddle( paddle, msgbuf, &msglen );
comm_pack_paddle( paddle, (unsigned char*)msgbuf, &msglen );
client_transmit( CODE_BLUE, msglen, msgbuf );
}
......
......@@ -61,8 +61,6 @@ void config_check_dir()
void config_reset()
{
/* levels */
config.levelset_id_local = 0;
config.levelset_count_local = 0;
config.levelset_id_home = 0;
config.levelset_count_home = 0;
/* player */
......@@ -143,8 +141,6 @@ void config_load( )
return;
}
/* assign */
parser_get_int( pd, "set_id_local", &config.levelset_id_local );
parser_get_int( pd, "set_count_local", &config.levelset_count_local );
parser_get_int( pd, "set_id_home", &config.levelset_id_home );
parser_get_int( pd, "set_count_home", &config.levelset_count_home );
parser_get_int( pd, "player_count", &config.player_count );
......@@ -218,8 +214,6 @@ void config_save( )
fprintf( stderr, "Cannot access config file '%s' to save settings\n", file_name );
else {
fprintf( file, "@\n" );
fprintf( file, "set_id_local%i\n", config.levelset_id_local );
fprintf( file, "set_count_local%i\n", config.levelset_count_local );
fprintf( file, "set_id_home%i\n", config.levelset_id_home );
fprintf( file, "set_count_home%i\n", config.levelset_count_home );
fprintf( file, "player_count%i\n", config.player_count );
......
......@@ -25,9 +25,6 @@ typedef struct {
/* directory to save config and saved games */
char dir_name[512];
/* levels */
int levelset_id_local;
int levelset_count_local; /* save number of local game levelsets
for safety (to reset id if count changed) */
int levelset_id_home;
int levelset_count_home; /* save number of levelsets for safety
(to reset id if count changed) */
......
......@@ -44,7 +44,7 @@ enum {
/* tiles */
BUTTON_NONE = 0,
BUTTON_FIRST_BRICK,
BUTTON_LAST_BRICK = BUTTON_FIRST_BRICK + ( BRICK_COUNT ),
BUTTON_LAST_BRICK = BUTTON_FIRST_BRICK + ( BRICK_COUNT_REGULAR ),
BUTTON_FIRST_EXTRA,
BUTTON_LAST_EXTRA = BUTTON_FIRST_EXTRA + ( EX_NUMBER -1 ),
BUTTON_EDIT,
......@@ -132,7 +132,7 @@ void editor_switch_tiles()
edit_sel_type = EDITOR_BRICK;
/* button map & background */
i = 0; j = 0;
while ( i + j * len < BRICK_COUNT ) {
while ( i + j * len < BRICK_COUNT_REGULAR ) {
edit_buttons[x_off + i][y_off + j] = BUTTON_FIRST_BRICK + i + j * len;
stk_surface_blit( brick_pic, ( i + j * len ) * BRICK_WIDTH, 0,
BRICK_WIDTH, BRICK_HEIGHT,
......
......@@ -98,8 +98,6 @@ int gameSeed = 0; /* last used seed for freakout game */
extern int current_player;
extern Item *item_resume_0;
extern void select_chart( char *name, int update );
/*
====================================================================
Locals
......@@ -138,9 +136,9 @@ static int init_level( Player *player, int l_pos )
/* add&create background */
if ( game->game_type == GT_LOCAL )
bkgnd_draw( bkgnd, bkgnd_ids[player->level_id] );
bkgnd_draw( bkgnd, bkgnd_ids[player->level_id], 1 );
else
bkgnd_draw( bkgnd, -1 );
bkgnd_draw( bkgnd, -1, 1 );
/* add frame */
frame_draw();
/* add bricks */
......@@ -939,7 +937,7 @@ void client_game_delete()
/* create network/local game context and initiate game state:
* network needs to receive the level data and a local game
* has to load the next level */
int client_game_init_local( char *setname )
int client_game_init_local( const char *setname )
{
Set_Chart *chart;
int i, warp_limit;
......@@ -1205,7 +1203,6 @@ void client_game_run( void )
if ( button_clicked || key_pressed ) {
chart_load();
check_highscores();
select_chart( game_set->name, 0 );
/* remove saved game */
slot_delete( 0 );
slot_update_hint( 0, item_resume_0->hint );
......@@ -1445,7 +1442,6 @@ void client_game_run( void )
* high scores ***
if ( game_set ) {
check_highscores();
select_chart( game_set->name, 0 );
}*/
/* save local game */
if ( game_set != 0 /*not testing a level*/ )
......
......@@ -49,7 +49,7 @@ void client_game_delete();
/* create network/local game context and initiate game state:
* network needs to receive the level data and a local game
* has to load the next level */
int client_game_init_local( char *setname );
int client_game_init_local( const char *setname );
int client_game_init_network( char *opponent_name, int diff );
/* create local game context and initiate game state
......@@ -64,4 +64,3 @@ void client_game_run( void );
/* test a level until all balls got lost */
void client_game_test_level( Level *level );
......@@ -80,4 +80,10 @@ enum { ORIG_BACK_COUNT = 6 };
extern char msgbuf[MAX_MSG_SIZE];
extern int msglen;
/* check if position is in given region */
#define FOCUS( cx, cy, rx, ry, rw, rh ) \
( cx >= rx && cy >= ry && cx < rx + rw && cy < ry + rh )
#define FOCUS_RECT( cx, cy, rect ) \
FOCUS( cx, cy, (rect).x, (rect).y, (rect).w, (rect).h )
#endif
This diff is collapsed.
......@@ -21,6 +21,7 @@ Circle \
Classique \
Color \
Composers \
Cool \
Crossing \
D2K \
Daves \
......@@ -61,6 +62,7 @@ LBreakout2 \
LinuxFun \
Lord \
Maze \
MegaMan2 \
Megadoomer \
MontyHall \
N_Arenas \
......@@ -100,6 +102,7 @@ Tricky \
Twilight \
Vader \
Weirdness \
Wizi \
Wolvie \
WonderWalls \
WTF \
......
......@@ -225,6 +225,7 @@ Circle \
Classique \
Color \
Composers \
Cool \
Crossing \
D2K \
Daves \
......@@ -265,6 +266,7 @@ LBreakout2 \
LinuxFun \
Lord \
Maze \
MegaMan2 \
Megadoomer \
MontyHall \
N_Arenas \
......@@ -304,6 +306,7 @@ Tricky \
Twilight \
Vader \
Weirdness \
Wizi \
Wolvie \
WonderWalls \
WTF \
......
Version: 1.00
Level:
Wraithlord
AirMan
Bricks:
EEEEEEEEEEEEEE
E............E
E.....gg.....E
E..gggggggg..E
E..ggcggcgga.E
E.aaggaaggaa.E
E.aagghhgg.a.E
Egg.ghgghg.h.E
@gg.ghgghg.h.E
@hh.gghhgg.h.E
@hh..gggg.hh.E
@gg..gggg.hh.E
@....aaaa....E
@....a..a....E
E...hh..hh...E
E..hhh..hhh..E
E..hhh..hhh..E
E..hhh..hhh..E
Bonus:
..............
..............
......mm......
...?&....&?...
....&W..W&....
..ww......ww..
...?..{{.?....
.....}..}..j..
.bb..}..}..j..
.jj...{{......
..........5<..
.pp.......5...
......??......
..............
....55..55....
...fls..slf...
..............
..............
Level:
Wraithlord
Woodman
Bricks:
zy....ee....yz
!z...eeee.e.z!
y*y..ekkeeey*y
.z!..eccce.!z.
.yz..eccce.zy.
.....eaae.....
..aae.eeheaa..
..aaehhheeaa..
..aaehheeeaa..
..a.ehheee.a..
..@@eheeee@@..
..@@eeeeee@@..
....eeeeee....
.zy..eeee..yz.
.y!.aa..aa.!y.
y*z.ea..ae.z*y
!z..ee..ee..z!
zy.eee..eee.yz
Bonus:
p>....b.....>p
.c..........c.
f.f...mm...f.f
.w...5.b&5..w.
.??...j.b..??.
..............
......j..j....
..{b5*.1&..b..
......>1.}....
..}.>}>1...}..
....5.&.*.....
....5..1b<....
....&&1.<&....
.??...bb...??.
.fp.--..--.pf.
pwf.~~..~~.fwc
sc..{b..&m..p.
?>.+<+..+<+.s?
Level:
Wraithlord
CrashMan
Bricks:
..............
.....dddd.....
....dcdddd....
c...ccccddc...
c..cceacd.cc..
cc..eeeed.cc..
cc.deeeed.cc..
cd.deaaedddd..
ddcdeeeddddd..
ddcddddddddd..
ddccddjdd.dd..
d...cdddc.d...
....ccccc.....
...ccccccc....
...cc...cc....
...dd...dd....
..ddd...ddd...
.dddd...dddd..
Bonus:
..............
..............
.....!..<.....
.....!!j<.....
....+.pj<.+...
....5555..+...
...&5..5..w...
...&5pp5s..c..
*{w&555.sw.c..
*{w.jj.cs..c..
*{wwjj....{c..
*...bb..b.{...
....b}}}b.....
...&-&&&-.....
....-...-.....
...jj...jj....
....f...f.....
.w+wf...fw+w..
Level:
Wraithlord
BubbleMan
Bricks:
.....z........
.....yc.......
.c....aaz.....
ccc..zzzz.....
ccc.zaaazj....
.c..zkakzj....
....zakazj....
.jz..zkzy.....
.zzz.ycy......
.zzz.cccjj....
..zzjcccjj....
...jj##c.x....
....z##zxx....
.....zzzxx....
....cc.cc.....
...xxx.zzz....
...axx.aaa....
..aaaa.aaaa...
Bonus:
.....!........
.....w........
.}............
*m*...........
*m*.>jj.&.....
.}..>..g......
....>>.g&.....
.bb....g&.....
.bbp.<.&......
.bss.<<.......
..ssp<jjpp....
...p&..j......
....&..<cc....
.....fffcc....
....W-.W-.....
.....-..-!....
...w{{.{{w....
..++55.55++...
Level:
WraithLord
FlashMan
Bricks:
......ccg.....
.....ggggg....
....gkgggg....
....gagacg....
.....acacg....
....jeeeegjj..
...jjeaaegjj..
!c.aEgeeegEjg.
!c.aEgeegEEgg.
cccaacggc...g.
ckcaa.ccc..gg.
.ckc..ccc..gg.
..c...ggg..gg.
.....aggaa.gg.
.....aa.ab....
.....bb.bb....
....ggg.ggg...
...gggg.gggg..
Bonus:
..............
.......&?.....
....j.j&?w....
....j.j&.w....
......{&w?....
.......&w?....
.........?....
!m....}??..cc.
!m.ww.}.....c.
mmfw.{}.j...c.
mjfw..{.......
.fw....?....*.
..f...&?...*..
.....??.ss.pp.
.....?&.j.....
.....??.jj....
....22w.22....
...{22s.w2w...
Level:
Wraithlord
HeatMan
Bricks:
..**...**.....
..**...***....
..**...***....
.**.....***...
.**.hhhhh**...
.@@.hhhhh**...
.aahhhddhaa...
.aajejeddaa...
..aeeeedaaa...
...eaeedaah...
...hhhhddhh...
...h**hdah....
...h**hha.....
...ahhhaa.....
...aa..ad.....
..ddd..ddd....
..@dd..dd@....
.dddd..dddd...
Bonus:
...m...m......
.........l....
..l......l....
..............
.......??.....
....&.{.......
.pp...{..pp...
.....?........
.....?........
...{.?.}......
...???5.......
...5**5.......
...&**5.j.....
...j555.j.....
..............
..wss..ssw....
....c...c.....
..?}...??.....
Level:
Wraithlord
MetalMan
Bricks:
.....!.d...h..