- Added new tiles: honeycomb, cave, up/down signs

- Added new fruit: diamond

- Level transitions are now smoother
- Levels now contain exitdir (which way to scroll when completed)

- Added random powerups on each level (if you define a position in the editor)
- Added temp powerup: boxing glove
This commit is contained in:
Rob Pearce 2008-09-28 03:18:36 +00:00
parent c3c3bf6579
commit f6d5d4285e
30 changed files with 956 additions and 320 deletions

33
defs.h
View File

@ -35,7 +35,7 @@
#define POINTSDELAY 40
#define BONUSDELAY 50
#define HURRYDELAY 50
#define LEVELDELAY 70
#define LEVELDELAY 80
#define HELPDELAY 80
@ -100,7 +100,7 @@
#define S_SLOPE 2
// Sprite types
#define MAXPTYPES 23
#define MAXPTYPES 27
#define P_PLAYER 0
#define P_RAT 1
#define P_CHEESE 2
@ -124,6 +124,14 @@
#define P_PUFF 20
#define P_GEMYELLOW 21
#define P_GEMPURPLE 22
#define P_POWERUPPOS 23
#define P_BOXING 24 // this is the powerup
#define P_GLOVE 25 // this is the glove on the end of the net
#define P_DIAMOND 26
// powerups
#define PW_NONE 0
#define PW_BOXING 1 // boxing glove
// Frame names
#define F_WALK1 0
@ -143,6 +151,15 @@
#define F_SLAM4 14
#define F_SLAM5 15
// Level states
#define LV_INIT 5 // just loaded, waiting for monsters to appear
#define LV_INPROGRESS 0 // regular game play
#define LV_CLEAR 1 // all monsters dead
#define LV_WAIT 2 // LEVEL COMPLETE displayed, delay to collect fruits
#define LV_FINAL 3 // delay 5 seconds more...
#define LV_NEXTLEV 4 // end of delay, nextlevel() in 5 seconds
// Tile types
#define T_BLANK 0
#define T_LAND 1
@ -180,6 +197,8 @@
// directions
#define D_RIGHT (1)
#define D_LEFT (-1)
#define D_UP (-2)
#define D_DOWN (2)
/* data structures */
@ -238,9 +257,14 @@ typedef struct level_s {
struct level_s *prev;
int p1x; /* player 1 start pos */
int p1y;
int powerupx; /* powerup position */
int powerupy; /* powerup position */
int gotpowerup; /* has the random powerup appeared yet? */
int exitdir; /* which way to scroll on level completion */
int nummonsters;
initialmonster_t initm[MAXMONSTERSPERLEVEL];
int hurryuptime;
int poweruptime;
} level_t;
level_t *level;
@ -269,11 +293,13 @@ typedef struct sprite_s {
int nety; // y position of end of net (used when shooting >1 net)
int netxstart; // x position of start of net
int netystart; // y position of start of net
int powerup; // what temp powerup does the player have?
// monster only
int willbecome; // what fruit this will become when dead
int angry; // is this sprite in ANGRY mode for its AI?
struct sprite_s *caughtby; // who has us in their net? NULL if nobody
int quickdie; // die without bouncing?
int caughtstate; // are we caught by a net? being pulled in or caught?
int jumptimer; // delay before we will jump
int flies; // can we fly?
@ -336,6 +362,9 @@ extern TTF_Font *font[];
extern int musicplaying;
extern Mix_Music *music, *normalmusic, *fastmusic;
extern Mix_Chunk *sfx[];
extern int oldexitdir;
extern int levelcomplete;
extern text_t *text, *lasttext;
#endif

43
edit.c
View File

@ -208,12 +208,12 @@ int main (int argc, char **argv) {
y = (my / TILEH);
/* checks */
// can only have one player start pos
if (selsprite == P_PLAYER) {
// can only have one player/powerup pos
if ((selsprite == P_PLAYER) || (selsprite == P_POWERUPPOS)) {
/* does a player start pos already exist? */
sprite_t *s;
for (s = sprite ; s ; s = s->next) {
if (s->id == P_PLAYER) {
if (s->id == selsprite) {
// if so, just move it
s->x = x*TILEW+(TILEW/2);
s->y = y*TILEH+TILEH;
@ -241,9 +241,9 @@ int main (int argc, char **argv) {
/* place selected sprite at mouse position
(locked to a tile) */
if (selsprite == P_HELP) {
addsprite(selsprite, x*TILEW+(TILEW/2),y*TILEH+TILEH,"FILL ME IN", B_TRUE);
addsprite(selsprite, x*TILEW+(TILEW/2),y*TILEH+TILEH,"FILL ME IN" );
} else {
addsprite(selsprite, x*TILEW+(TILEW/2),y*TILEH+TILEH,"something", B_TRUE);
addsprite(selsprite, x*TILEW+(TILEW/2),y*TILEH+TILEH,"something" );
}
printf("added a sprite\n");
toggletimer = 30;
@ -312,6 +312,36 @@ int main (int argc, char **argv) {
}
}
/* exit direction */
if (toggletimer == 0) {
if (keys[SDLK_h]) {
printf("Exit direction set to LEFT.\n");
curlevel->exitdir = D_LEFT;
toggletimer = 30;
modified = B_TRUE;
}
if (keys[SDLK_j]) {
printf("Exit direction set to DOWN.\n");
curlevel->exitdir = D_DOWN;
toggletimer = 30;
modified = B_TRUE;
}
if (keys[SDLK_k]) {
printf("Exit direction set to UP.\n");
curlevel->exitdir = D_UP;
toggletimer = 30;
modified = B_TRUE;
}
if (keys[SDLK_l]) {
printf("Exit direction set to RIGHT.\n");
curlevel->exitdir = D_RIGHT;
toggletimer = 30;
modified = B_TRUE;
}
}
/* next level */
if (keys[SDLK_RIGHT]) {
if (toggletimer == 0) {
@ -563,6 +593,9 @@ int savelevel(int wnum, int lnum) {
}
fprintf(f, "endmonsters\n");
/* exit dir */
fprintf(f, "exitdir %d\n",curlevel->exitdir);
/* level data */
for (y = 0; y < LEVELH; y++) {
for (x = 0; x < LEVELW; x++) {

View File

@ -13,10 +13,16 @@ sprite_t *player; // pointer to the player's sprite
Mix_Music *music, *fastmusic, *normalmusic;
Mix_Chunk *sfx[MAXFX];
text_t *text, *lasttext;
level_t *curlevel; // the current level's data
int levelcomplete; // has the levle been finished?
tiletype_t fakeblock; // used for returning tiletypes from a function
int oldexitdir; // exit direction of previous level
int vidargs; // arguments for SetVideo call
TTF_Font *font[MAXLETTERHEIGHT];

BIN
newtiles/cavebg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

BIN
newtiles/cavebridge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

BIN
newtiles/cavespikes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

BIN
newtiles/honey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 B

BIN
newtiles/honeybg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

BIN
newtiles/honeytop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

BIN
newtiles/signdown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

BIN
newtiles/signup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

BIN
rc

Binary file not shown.

620
rc.c
View File

@ -30,6 +30,7 @@ char tempm[BUFLEN];
tiletype_t fakeblock;
/* the order in which fruit will appear */
int fruittypes[] = {
P_CHEESE,
@ -59,14 +60,13 @@ int fpsstart = 0;
int curworld = 1;
int curlevelnum;
level_t *curlevel;
int levelcomplete = B_FALSE;
int levelcompletetime = -1;
sprite_t *sprite = NULL; /* main sprite list */
sprite_t *player;
sprite_t *lastsprite;
text_t *text, *lasttext;
SDL_Color red = {255, 0, 0, 0};
SDL_Color black = {0, 0, 0, 0};
@ -171,7 +171,11 @@ int main (int argc, char **argv) {
}
drawlevel();
//levelcomplete = LV_FINAL;
curlevelnum-- ; // since nexlevel() will increment it
nextlevel();
//drawlevel();
/* TODO: place player */
flip();
timer = 0;
@ -180,13 +184,6 @@ int main (int argc, char **argv) {
player->score = 0;
while (1) {
/*
removetext();
for (s = sprite ; s ; s = s->next) {
removesprite(s);
}
removenetting(player);
*/
removeall();
/* check for death & update movement status*/
@ -209,12 +206,12 @@ int main (int argc, char **argv) {
}
/* check for end of level */
if (levelcomplete == 1) {
if (levelcomplete == LV_CLEAR) {
addtext(318,242,32,"Level Complete!",&black,LEVELDELAY);
addtext(320,240,32,"Level Complete!",&yellow,LEVELDELAY);
levelcomplete = 2;
levelcomplete = LV_WAIT;
playfx(FX_WINLEVEL);
} else if (levelcomplete == 2) {
} else if (levelcomplete == LV_WAIT) {
int mcount = 0;
sprite_t *s2;
@ -229,7 +226,7 @@ int main (int argc, char **argv) {
}
if (mcount == 0) {
levelcompletetime = gtime;
levelcomplete = 3;
levelcomplete = LV_FINAL;
}
}
@ -244,6 +241,12 @@ int main (int argc, char **argv) {
if (keys[SDLK_q]) {
gtime = curlevel->hurryuptime -1;
}
if (keys[SDLK_n]) {
if (toggletimer == 0) {
nextlevel();
toggletimer = 50;
}
}
if (keys[SDLK_RETURN]) {
if (toggletimer == 0) {
SDL_WM_ToggleFullScreen(screen);
@ -347,6 +350,27 @@ int main (int argc, char **argv) {
}
player->netlen = 0;
player->netdir = player->dir;
/* handle boxing glove */
if (player->powerup == PW_BOXING) {
sprite_t *s;
int found;
// use existing glove if it is there
found = B_FALSE;
for (s = sprite; s ; s = s->next) {
if (s->id == P_GLOVE) {
s->x = player->x;
s->y = player->y - (imageset[P_PLAYER].img[F_SHOOT]->h / 2) + 5;
found = B_TRUE;
}
}
if (!found) {
addsprite(P_GLOVE, player->x,
player->y - (imageset[P_PLAYER].img[F_SHOOT]->h / 2) + 5,
"glove");
}
}
}
}
}
@ -385,23 +409,25 @@ int main (int argc, char **argv) {
movetext();
/* gravity */
for (s = sprite ; s ; s = s->next) {
dogravity(s);
}
if (levelcomplete == LV_INIT) {
// only player
dogravity(player);
dotileeffects(player);
} else {
/* gravity */
for (s = sprite ; s ; s = s->next) {
dogravity(s);
}
/* tile effects */
for (s = sprite ; s ; s = s->next) {
dotileeffects(s);
/* tile effects */
for (s = sprite ; s ; s = s->next) {
dotileeffects(s);
}
}
/* check collisions */
//for (s = sprite ; s ; s = s->next) {
// checkcollide(s);
//}
checkcollide(player);
drawscore();
drawnetting(player);
@ -439,7 +465,7 @@ void tick(void) {
gtime++;
/* */
/* check for hurryup*/
if (gtime == curlevel->hurryuptime) {
if (!levelcomplete) {
for (s = sprite; s; s = s->next) {
@ -454,17 +480,36 @@ void tick(void) {
}
} else if (gtime == curlevel->hurryuptime + 10) {
if (!levelcomplete) {
addsprite(P_CLOUD, 320,240,"cloud", B_FALSE);
addsprite(P_CLOUD, 320,240,"cloud");
addtext(320,240,TEXTSIZE_HURRY, "Too slow!", &red,HURRYDELAY);
playfx(FX_TOOSLOW);
}
}
/* check for random power up */
if ((curlevel->powerupx != -1) && (curlevel->powerupy != -1)) {
if (!curlevel->gotpowerup) {
if (gtime == curlevel->poweruptime) {
if (!levelcomplete) {
/* add a random powerup at the right position */
/* IMPORTANT: the name 'random_up' is important as it tells addsprite() to
give it a higher doomcount */
puffin(randompowerup(),
curlevel->powerupx*TILEW + (TILEW/2),
curlevel->powerupy*TILEH + TILEH - 1,
"random_up",0);
curlevel->gotpowerup = B_TRUE;
}
}
}
}
/* 5 seconds after level completion */
if (levelcomplete == 3) {
if (levelcomplete == LV_FINAL) {
if (gtime - levelcompletetime >= 5) {
if (!player->dead) {
levelcomplete = LV_NEXTLEV;
nextlevel();
}
}
@ -475,20 +520,44 @@ void tick(void) {
}
void nextlevel(void) {
char msg[SMALLBUFLEN];
// remove the player
removesprite(player);
// don't want the player flashing
player->invuln = 0;
/* in case we skipped the level due to a powerup etc */
levelcomplete = LV_NEXTLEV;
/* go to next level */
curlevelnum++;
if (!musicplaying || (curmusic == fastmusic)) {
playmusic(normalmusic);
}
// these two handle the scroll effect to the next level
loadlevel(curworld,curlevelnum);
drawlevel();
levelcomplete = B_FALSE;
/* reset game stats */
levelcomplete = LV_INIT;
levelcompletetime = -1;
/* reset level stats */
level->gotpowerup = B_FALSE;
sprintf(msg, " Level %02d-%02d ",curworld, curlevelnum);
addtext(318,242,32,msg,&black,LEVELDELAY);
addtext(320,240,32,msg,&green,LEVELDELAY);
/* reset player stats */
player->netting = B_FALSE;
player->slamming = B_FALSE;
player->jumping = B_FALSE;
player->powerup = B_FALSE;
}
void jump(sprite_t *s, int dir) {
@ -560,7 +629,7 @@ void die(sprite_t *s) {
}
if (mcount == 0) {
levelcomplete = 1;
levelcomplete = LV_CLEAR;
}
}
}
@ -592,19 +661,44 @@ void checkcollide(sprite_t *s) {
if (collide) {
/* check for colission with our net */
if ((s->netting) && (!s2->caughtby)) {
if (s->netcaught < s->netmax) {
if (ismonster(s2->id) && s2->id != P_CLOUD) {
xdiff = (s->x + s->netlen*s->netdir) - s2->x;
if (xdiff < 0) xdiff = -xdiff;
ydiff = s->netystart - (s2->y - s2->img->h/2);
if (ydiff < 0) ydiff = -ydiff;
if (ismonster(s2->id) && s2->id != P_CLOUD) {
xdiff = (s->x + s->netlen*s->netdir) - s2->x;
if (xdiff < 0) xdiff = -xdiff;
ydiff = s->netystart - (s2->y - s2->img->h/2);
if (ydiff < 0) ydiff = -ydiff;
if ((xdiff <= s2->img->w/2) && (ydiff <= s2->img->h)) {
s2->caughtby = s;
s2->jumping = 0;
s2->falling = 0;
s2->caughtstate = C_NETTING;
s->netcaught++;
if ((xdiff <= s2->img->w/2) && (ydiff <= s2->img->h)) {
// we hit something!
// if we have a boxing glove, it dies
if (s->powerup == PW_BOXING) {
s2->dead = D_BOUNCING;// die as soon as it hits a wall
s2->bounces = 1;
s2->quickdie = B_TRUE;
/* go FAST in the direction player is facing */
s2->xs = s->dir * 5;
s2->ys = 0;
/* slightly raise the sprite to avoid isonground() being true */
s2->y -= 3;
/* make sure we're not too high since we'll never get lower now */
if (s2->y <= TILEH) s2->y = TILEH+1;
// become something special
s2->willbecome = P_DIAMOND;
playfx(FX_KILL);
} else {
// otherwise we caught it if we have enough nets
if (s->netcaught < s->netmax) {
s2->caughtby = s;
s2->jumping = 0;
s2->falling = 0;
s2->caughtstate = C_NETTING;
s->netcaught++;
}
}
}
}
@ -687,6 +781,15 @@ void movesprite(sprite_t *s) {
int rv;
tiletype_t *tt;
if (levelcomplete == LV_INIT) {
// most things can't move in this state
if ((s->id != P_PUFF) && (s->id != P_PLAYER)) {
// caught or dead sprites can move, in case
// the player catches something before level start time
if ((!s->caughtby) && (!s->dead)) return;
}
}
/* timer */
if (s->doomcount) {
s->doomcount--;
@ -765,13 +868,12 @@ void movesprite(sprite_t *s) {
} else {
/* bounch around the screen 3 times */
bouncesprite(s);
if ((s->bounces >= 2) && (s->ys > 0)) {
if ((s->bounces >= 2) && (s->ys >= 0)) {
// make sure we're not on the ground
if (!isonground(s)) {
int tx,ty;
tiletype_t *tt;
tt = gettileat(s->x,s->y,&tx,&ty);
//int tx,ty;
//tiletype_t *tt;
//tt = gettileat(s->x,s->y,&tx,&ty);
s->dead = D_LASTBOUNCE;
}
}
@ -787,35 +889,9 @@ void movesprite(sprite_t *s) {
}
} else { /* bounce around, stop when we hit the ground */
bouncesprite(s);
/* OLD BOUNCE CODE
if (s->x >= (640-TILEW- s->img->w/2)) {
if (s->xs > 0) {
s->xs = -s->xs;
s->bounces++;
}
} else if (s->x <= TILEW + s->img->w/2) {
if (s->xs < 0) {
s->xs = -s->xs;
s->bounces++;
}
}
if (s->y >= (480-(s->img->h/2))) {
if (s->ys > 0) {
s->ys = -s->ys;
s->bounces++;
}
} else if (s->y <= s->img->h) {
if (s->ys < 0) {
s->ys = -s->ys;
s->bounces++;
}
}
*/
if ((s->ys > 0) && (s->y >= TILEH)) {
if (isonground(s)) {
if ((s->ys >= 0) && (s->y >= TILEH)) {
if (s->quickdie || isonground(s)) {
int x,y,ty;
s->dead = D_FINAL;
/* change into a fruit */
@ -829,7 +905,7 @@ void movesprite(sprite_t *s) {
if (x < (TILEW)) x = TILEW;
//addsprite(s->willbecome, x, y, "Fruit", B_FALSE);
puffin(s->willbecome, x, y, 0);
puffin(s->willbecome, x, y, "fruit", 0);
//ss = addsprite(P_PUFF, x, y, "Fruit", B_FALSE);
//ss->timer3 = s->willbecome;
@ -937,13 +1013,23 @@ void movesprite(sprite_t *s) {
// finished animating
if (s->timer1 == PUFFAPPEAR) {
// create a gem/fruit/etc
addsprite(s->timer3, s->x,s->y,"gem", B_FALSE);
addsprite(s->timer3, s->x,s->y,s->name );
} else if (s->timer1 >= PUFFFRAMES) {
s->dead = D_FINAL;
}
}
}
} else if (s->id == P_GLOVE) { // boxing glove effect
// dies when the player finshes netting
if (!player->netting) {
s->dead = D_FINAL;
} else {
// keep it at the end of the net
s->x = player->x + (player->netdir * player->netlen);
s->y = player->y - (player->img->h/2) + 5;
s->dir = player->dir;
}
} else if (s->id == P_RAT) {
if (!s->falling) {
int move = B_FALSE;
@ -1149,7 +1235,7 @@ printf("can shoot again\n");
if (shoot) {
// if our shooting timer is okay
if (s->timer1 == 0) {
ss = addsprite(P_SPIT,s->x,s->y - s->img->h/2,"spit", B_FALSE);
ss = addsprite(P_SPIT,s->x,s->y - s->img->h/2,"spit" );
ss->ys = 0;
ss->xs = s->dir * (getspeed(s)*2);
ss->dir = s->dir;
@ -1236,6 +1322,13 @@ printf("can shoot again\n");
s->ys = -s->ys;
}
/* check for top of screen */
// TODO: later, remove this when we can wrap around
if ((s->y <= s->img->h) && (s->ys < 0)) {
s->ys = -s->ys;
}
/* move */
s->x += s->xs;
s->y += s->ys;
@ -1428,11 +1521,18 @@ void dotileeffects(sprite_t *s) {
}
// initial transition to a new level
void drawlevel(void) {
int x,y;
SDL_Rect area;
int speed = 16;
int dstx,dsty,xdis,ydis,dis;
int turns;
int pspeed;
SDL_Rect area,dst;
int speed = TILEW;
SDL_Surface *playerbg;
/* TODO: chekc for memory leak here with temps -
need to free it at the end? */
if (temps) {
SDL_FreeSurface(temps);
temps = NULL;
@ -1443,6 +1543,18 @@ void drawlevel(void) {
screen->format->Gmask,screen->format->Bmask,
screen->format->Amask);
// change player to floating image
player->img = imageset[P_PLAYER].img[F_SHOOT];
// create buffer for player background
playerbg = SDL_CreateRGBSurface(SDL_SWSURFACE,
player->img->w, player->img->h,
screen->format->BitsPerPixel, screen->format->Rmask,
screen->format->Gmask,screen->format->Bmask,
screen->format->Amask);
// draw the full level onto a temporary surface
for (x = 0; x < LEVELW; x++) {
for (y = 0; y < LEVELH; y++) {
drawtile(temps,x,y);
@ -1450,16 +1562,231 @@ void drawlevel(void) {
}
for (x = 0; x < 640; x += speed) {
area.x = 0;
area.y = 0;
if (x > 639) {
area.w = 639;
} else area.w = x;
area.h = 480;
SDL_BlitSurface(temps, &area, screen, &area);
SDL_UpdateRect(screen, area.x, area.y, area.w, area.h);
// figure out where the player's new start position is
dstx = (curlevel->p1x * TILEW) + (TILEW/2);
dsty = (curlevel->p1y * TILEH) + TILEH-2;
// figure out distance to newposition
xdis = player->x - dstx; if (xdis < 0) xdis = -xdis;
ydis = player->y - dsty; if (ydis < 0) ydis = -ydis;
if (xdis > ydis) dis = xdis;
else dis = ydis;
// figure out how many loops it will take to scroll to the next level
switch (oldexitdir) {
case D_LEFT:
case D_RIGHT:
turns = 640 / TILEW;
break;
case D_UP:
case D_DOWN:
default:
turns = 480 / TILEH;
break;
}
turns -= 4; // just to be safe
// figure out how fast player needs to move to get there in time
pspeed = dis / turns;
if (oldexitdir == D_LEFT) {
// blit a column at a time to the real screen, shuffling
// the real one along.
for (x = 0; x < 640; x += speed) {
// move player
movetostart(player,dstx,dsty,pspeed);
// shuffle real screen
area.x = 0;
area.y = 0;
area.w = 640-TILEW;
area.h = 480;
dst.x = TILEW;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(screen, &area, screen, &dst);
// blit next column from temp surface (take last column first)
area.x = 640-x;
area.y = 0;
area.w = TILEW;
area.h = 480;
dst.x = 0;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(temps, &area, screen, &dst);
// remember area behind player
grabbehind(player, playerbg);
// draw player
drawsprite(player);
// update screen
SDL_UpdateRect(screen, 0,0,640,480);
// remove player
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
area.w = 0;
area.h = 0;
SDL_BlitSurface(playerbg, NULL, screen, &area );
}
} else if (oldexitdir == D_UP) {
// blit a row at a time to the real screen, shuffling
// the real one along.
for (y = 0; y < 480; y += speed) {
// move player
movetostart(player,dstx,dsty,pspeed);
// shuffle real screen
area.x = 0;
area.y = 0;
area.w = 640;
area.h = 480-TILEH;
dst.x = 0;
dst.y = TILEH;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(screen, &area, screen, &dst);
// blit next row from temp surface (take last column first)
area.x = 0;
area.y = 480-y;
area.w = 640;
area.h = TILEH;
dst.x = 0;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(temps, &area, screen, &dst);
// remember area behind player
grabbehind(player, playerbg);
// draw player
drawsprite(player);
// update screen
SDL_UpdateRect(screen, 0,0,640,480);
// remove player
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
area.w = 0;
area.h = 0;
SDL_BlitSurface(playerbg, NULL, screen, &area );
}
} else if (oldexitdir == D_DOWN) {
// blit a row at a time to the real screen, shuffling
// the real one along.
for (y = 0; y < 480; y += speed) {
// move player
movetostart(player,dstx,dsty,pspeed);
// shuffle real screen
area.x = 0;
area.y = TILEH;
area.w = 640;
area.h = 480-TILEH;
dst.x = 0;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(screen, &area, screen, &dst);
// blit next row from temp surface (take last column first)
area.x = 0;
area.y = y;
area.w = 640;
area.h = TILEH;
dst.x = 0;
dst.y = 480-TILEH;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(temps, &area, screen, &dst);
// remember area behind player
grabbehind(player, playerbg);
// draw player
drawsprite(player);
// update screen
SDL_UpdateRect(screen, 0,0,640,480);
// remove player
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
area.w = 0;
area.h = 0;
SDL_BlitSurface(playerbg, NULL, screen, &area );
}
} else { // right, or default
// blit a column at a time to the real screen, shuffling
// the real one along.
for (x = 0; x < 640; x += speed) {
// move player
movetostart(player,dstx,dsty,pspeed);
// shuffle real screen
area.x = TILEW;
area.y = 0;
area.w = 640-TILEW;
area.h = 480;
dst.x = 0;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(screen, &area, screen, &dst);
// blit next column from temp surface (take last column first)
area.x = x;
area.y = 0;
area.w = TILEW;
area.h = 480;
dst.x = 640-TILEW;
dst.y = 0;
dst.w = 0;
dst.h = 0;
SDL_BlitSurface(temps, &area, screen, &dst);
// remember area behind player
grabbehind(player, playerbg);
// draw player
drawsprite(player);
// update screen
SDL_UpdateRect(screen, 0,0,640,480);
// remove player
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
area.w = 0;
area.h = 0;
SDL_BlitSurface(playerbg, NULL, screen, &area );
}
}
SDL_FreeSurface(playerbg);
levelcomplete = B_FALSE;
}
@ -1532,23 +1859,10 @@ int addtext(int x, int y, int size, char *string, SDL_Color *c, int delay) {
/* copy background buffer (ie. tiles) to screen, erasing sprites */
void removeall(void) {
void fruit(void) {
SDL_BlitSurface(temps, NULL, screen, NULL);
}
void removetext(void) {
SDL_Rect sarea;
text_t *t;
for (t = text ; t ; t = t->next) {
sarea.x = 0;
sarea.y = 0;
sarea.w = t->bgarea.w;
sarea.h = t->bgarea.h;
SDL_BlitSurface(t->bg, &sarea, screen, &t->bgarea);
}
}
void movetext(void) {
text_t *t,*nextt;
@ -1626,39 +1940,11 @@ void drawtext(void) {
}
void killtext(text_t *t) {
text_t *nextone, *lastone;
if (t->bg) {
SDL_FreeSurface(t->bg);
t->bg = NULL;
}
if (t->img) {
SDL_FreeSurface(t->img);
t->img = NULL;
}
nextone = t->next;
if (nextone != NULL) {
nextone->prev = t->prev;
} else { /*last text */
lasttext = t->prev;
}
if (t->prev == NULL) {
/* first text */
nextone = text->next;
free(text);
text = nextone;
} else {
lastone = t->prev;
free (lastone->next );
lastone->next = nextone;
}
/* copy background buffer (ie. tiles) to screen, erasing sprites */
void removeall(void) {
SDL_BlitSurface(temps, NULL, screen, NULL);
}
void drawnetting(sprite_t *s) {
int sx;
SDL_Rect area;
@ -2205,6 +2491,13 @@ int dofruiteffect(sprite_t *s) {
sprintf(tempm, "Big net!");
addtext(s->x,s->y - s->img->h/2, TEXTSIZE_POINTS, tempm,&white,POINTSDELAY);
return B_TRUE;
} else if (s->id == P_BOXING) {
playfx(FX_POWERUP);
//player->netbig = B_TRUE;
player->powerup = PW_BOXING;
sprintf(tempm, "Boxing Glove!");
addtext(s->x,s->y - s->img->h/2, TEXTSIZE_POINTS, tempm,&white,POINTSDELAY);
return B_TRUE;
} else if (s->id == P_HELP) {
playfx(FX_POWERUP);
addtext(320,240,TEXTSIZE_HELP, s->name, &white,HELPDELAY);
@ -2235,7 +2528,7 @@ int dofruiteffect(sprite_t *s) {
break;
}
/* create a flower */
puffin(flowertogem(s->id), xx, s->y, puffdelay);
puffin(flowertogem(s->id), xx, s->y, "flower", puffdelay);
//ss = addsprite(P_PUFF, xx,s->y,"puff", B_FALSE);
//ss->timer1 = -puffdelay;
//ss->timer3 = flowertogem(s->id);
@ -2250,7 +2543,7 @@ int dofruiteffect(sprite_t *s) {
if (tt->solid) {
break;
}
puffin(flowertogem(s->id), xx, s->y, puffdelay);
puffin(flowertogem(s->id), xx, s->y, "flower", puffdelay);
//ss = addsprite(P_PUFF, xx,s->y,"puff", B_FALSE);
//ss->timer1 = -puffdelay;
//ss->timer3 = flowertogem(s->id);
@ -2396,10 +2689,55 @@ void channeldone(int channel) {
void puffin(int willbecome, int x, int y, int delay) {
sprite_t *ss;
ss = addsprite(P_PUFF, x, y, "puff", B_FALSE);
ss->timer3 = willbecome;
ss->timer1 = -delay;
// move player towards new position
void movetostart(sprite_t *p, int dstx, int dsty, int speed) {
if (p->x < dstx) {
p->x += speed;
if (p->x > dstx) p->x = dstx;
}
if (p->x > dstx) {
p->x -= speed;
if (p->x < dstx) p->x = dstx;
}
if (p->y < dsty) {
p->y += speed;
if (p->y > dsty) p->y = dsty;
}
if (p->y > dsty) {
p->y -= speed;
if (p->y < dsty) p->y = dsty;
}
}
// grabs area behind a sprite into a temp buffer
SDL_Surface *grabbehind(sprite_t *s, SDL_Surface *surf) {
SDL_Rect area;
// remember area behind player
area.x = s->x - s->img->w/2;
area.y = s->y - s->img->h;
area.w = s->img->w;
area.h = s->img->h;
SDL_BlitSurface(screen, &area, surf, NULL);
return surf;
}
// returns a random powerup
int randompowerup(void) {
int num;
num = rand() % 4;
switch (num) {
case 0:
default:
return P_SPEED;
case 1:
return P_BIGNET;
case 2:
return P_NUMNETS;
case 3:
return P_BOXING;
}
}

6
rc.h
View File

@ -3,9 +3,7 @@ int addtext(int x, int y, int size, char *string, SDL_Color *c, int delay);
void drawscore(void);
void drawtext(void);
void movetext(void);
void killtext(text_t *t);
void removeall(void);
void removetext(void);
void drawlevel(void);
void removesprite(sprite_t *s);
void removenetting(sprite_t *s);
@ -40,4 +38,6 @@ void playfx(int num);
void playmusic(Mix_Music *toplay);
void stopmusic(void);
void channeldone(int channel);
void puffin(int willbecome, int x, int y, int delay);
void movetostart(sprite_t *p, int dstx, int dsty, int speed);
SDL_Surface *grabbehind(sprite_t *s, SDL_Surface *surf);
int randompowerup(void);

304
shared.c
View File

@ -43,8 +43,18 @@ int loadlevel(int wnum, int lnum) {
int numenemies = 0;
printf("Loading level %d-%d...",wnum,lnum);
// remember exit direction for current level
// before loading the new one.
if (level) {
oldexitdir = level->exitdir;
} else {
oldexitdir = D_RIGHT;
}
if (!level) level = malloc(sizeof(level_t));
if (level->animtiles) free(level->animtiles);
@ -56,8 +66,12 @@ int loadlevel(int wnum, int lnum) {
/* default */
level->hurryuptime = 30;
level->poweruptime = 5;
level->p1x = 0;
level->p1y = 0;
level->powerupx = -1;
level->powerupy = -1;
sprintf(filename, "world%d/level%d.dat",wnum,lnum);
f = fopen(filename,"rt");
@ -84,7 +98,12 @@ int loadlevel(int wnum, int lnum) {
tiletype = tt;
}
/* clear player linked list */
/* remove all onscreen text */
while (text) {
killtext(text);
}
/* clear sprite linked list (leave player) */
if (sprite != NULL) {
while (sprite->next) {
killsprite(sprite->next);
@ -227,6 +246,9 @@ int loadlevel(int wnum, int lnum) {
if (monid == P_PLAYER) {
level->p1x = x;
level->p1y = y;
} else if (monid == P_POWERUPPOS) {
level->powerupx = x;
level->powerupy = y;
} else {
/* place the monster */
level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2);
@ -252,12 +274,39 @@ int loadlevel(int wnum, int lnum) {
fgets(buf, BUFLEN, f);
}
/* this reads the first line of the level */
/* this reads the next line after monster defs */
fgets(buf, BUFLEN, f);
}
printf("got %d monsters\n", numenemies);
/* exitdir ? */
if (strstr(buf, "exitdir")) {
p = strtok(buf, " "); // "exitdir"
p = strtok(NULL, " ");
level->exitdir = atoi(p);
printf("Exit direction is ");
switch (level->exitdir) {
case D_RIGHT:
printf("RIGHT"); break;
case D_LEFT:
printf("LEFT"); break;
case D_UP:
printf("UP"); break;
case D_DOWN:
printf("DOWN"); break;
default:
level->exitdir = D_RIGHT;
printf("*INVALID*");
break;
}
printf("\n");
fgets(buf, BUFLEN, f);
} else {
level->exitdir = D_RIGHT;
printf("Defaulting to exitdir of RIGHT.\n");
}
/* check whether we've got a new or old level version */
if (strstr(buf, ",")) {
/* new version */
@ -517,26 +566,50 @@ printf("got %d monsters\n", numenemies);
/* set current level pointer */
curlevel = level;
/* add player */
/* add player if required */
if (player == NULL) {
addsprite(P_PLAYER, (curlevel->p1x * TILEW) + (TILEW/2),
(curlevel->p1y * TILEH) + TILEH-2 , "Player" , B_TRUE);
} else {
(curlevel->p1y * TILEH) + TILEH-2 , "Player" );
player = lastsprite;
}
#ifdef __EDITOR
/* add powerup pos if it exists */
if ((level->powerupx != -1) && (level->powerupy != -1)) {
addsprite(P_POWERUPPOS, (curlevel->powerupx * TILEW) + (TILEW/2),
(curlevel->powerupy * TILEH) + TILEH-2 , "poweruppos" );
}
#endif
/*else {
player->x = (curlevel->p1x * TILEW) + (TILEW/2);
player->y = (curlevel->p1y * TILEH) + TILEH-2;
}
player = lastsprite;
*/
/* add monsters */
for (i = 0; i < level->nummonsters; i++) {
char name[MIDBUFLEN];
int delay;
if (level->initm[i].id == P_HELP) {
strncpy(name, level->initm[i].help, MIDBUFLEN);
} else {
strcpy(name, "Monster");
}
if (ismonster(level->initm[i].id)) {
delay = 20;
} else {
delay = 0;
}
#ifdef __EDITOR
addsprite(level->initm[i].id,
level->initm[i].startx, level->initm[i].starty, name, B_TRUE);
level->initm[i].startx, level->initm[i].starty, name );
#else
puffin(level->initm[i].id, level->initm[i].startx, level->initm[i].starty, name, delay );
#endif
}
gtime = 0;
@ -570,6 +643,7 @@ void setdefaults(sprite_t *s) {
s->netbig = 0;
s->dropping = 0;
s->dropx = -1;
s->quickdie = B_FALSE;
s->dropy = -1;
s->falling = 0;
s->fallspeed = 0;
@ -609,6 +683,9 @@ void setdefaults(sprite_t *s) {
case P_BURGER:
s->score = 400;
break;
case P_DIAMOND:
s->score = 500;
break;
case P_FLOWERYELLOW:
s->score = 5;
break;
@ -643,7 +720,7 @@ void setdefaults(sprite_t *s) {
}
/* initial is TRUE if we are populating the level for the first time */
sprite_t *addsprite(int id, int x, int y, char *name , int initial) {
sprite_t *addsprite(int id, int x, int y, char *name ) {
sprite_t *s;
if (sprite == NULL) {
@ -684,13 +761,19 @@ sprite_t *addsprite(int id, int x, int y, char *name , int initial) {
setdefaults(s);
if (!initial) {
// initial fruits don't time out
#ifndef __EDITOR
if ((levelcomplete != LV_NEXTLEV) && (levelcomplete != LV_INIT)) {
if (isfruit(s->id)) {
if (s->id != P_HELP) { // help icons don't time out
// random powerups stay for longer
if (!strcmp(s->name, "random_up")) {
s->doomcount = 900;
} else {
s->doomcount = 500;
}
}
}
#endif
s->next = NULL;
@ -977,6 +1060,18 @@ int loadimagesets(void) {
loadspriteimage(P_GEMPURPLE,F_WALK1, "sprites/gem-purple.png");
imageset[P_GEMPURPLE].numimages = 1;
loadspriteimage(P_POWERUPPOS,F_WALK1, "sprites/poweruppos.png");
imageset[P_POWERUPPOS].numimages = 1;
loadspriteimage(P_BOXING,F_WALK1, "sprites/boxing.png");
imageset[P_BOXING].numimages = 1;
loadspriteimage(P_GLOVE,F_WALK1, "sprites/boxing.png");
imageset[P_GLOVE].numimages = 1;
loadspriteimage(P_DIAMOND,F_WALK1, "sprites/diamond.png");
imageset[P_DIAMOND].numimages = 1;
for (i = 0; i < PUFFFRAMES; i++) {
char name[SMALLBUFLEN];
sprintf(name, "sprites/puff%d.png",i);
@ -994,6 +1089,7 @@ int loadimagesets(void) {
/* generate rotated/flipped images */
for (p = 0; p < MAXPTYPES; p++) {
/* rotated */
// TODO: need to free tempimg ? */
if (!isfruit(p) && !isbullet(p) && !iseffect(p)) {
tempimg = rotozoomSurface(imageset[p].img[F_DEAD],90,1,0);
imageset[p].img[F_DEAD2] = SDL_DisplayFormat(tempimg);
@ -1078,66 +1174,72 @@ void drawsprite(sprite_t *s) {
SDL_Rect area;
int frame;
/* select frame */
if (isfruit(s->id)) {
frame = F_WALK1;
} else if (isbullet(s->id)) {
frame = F_WALK1;
} else if (iseffect(s->id)) {
if (s->id == P_PUFF) {
if (s->timer1 >= PUFFFRAMES) {
frame = PUFFFRAMES-1;
} else if (s->timer1 < 0) {
// don't draw
return;
} else {
frame = s->timer1;
}
}
} else if (s->dead) {
if (s == player) {
frame = F_DEAD;
} else {
frame = F_DEAD + ((timer/2) % 4);
}
} else if (s->caughtby) {
frame = F_CAUGHT;
} else if (s->climbing) {
frame = F_CLIMB1 + ((timer/12) % 2);
} else if (s->netting) {
if ((s == player) && (levelcomplete == LV_NEXTLEV)) {
frame = F_SHOOT;
} else if (s->jumping) {
frame = F_JUMP;
} else if (s->falling) {
frame = F_FALL;
} else if (s->slamming) {
double slamdegs = s->slamangle / (M_PI/180);
if (slamdegs < 36) {
frame = F_SLAM1;
} else if (slamdegs < 72) {
frame = F_SLAM2;
} else if (slamdegs < 108) {
frame = F_SLAM3;
} else if (slamdegs < 144) {
frame = F_SLAM4;
} else {
frame = F_SLAM5;
}
} else if (!s->teleporting) {
if ((s->id == P_SPIDER) && (s->ys != -99)) {
frame = F_FALL;
} else {
if (s->moved) {
if ((timer/12) % 2 == 0) {
frame = F_WALK1;
} else {
/* select frame */
if (isfruit(s->id)) {
frame = F_WALK1;
} else if (isbullet(s->id)) {
frame = F_WALK1;
} else if (iseffect(s->id)) {
if (s->id == P_PUFF) {
if (s->timer1 >= PUFFFRAMES) {
frame = PUFFFRAMES-1;
} else if (s->timer1 < 0) {
// don't draw
return;
} else {
frame = F_JUMP;
frame = s->timer1;
}
} else {
} else if (s->id == P_GLOVE) {
frame = F_WALK1;
}
}
} else if (s->dead) {
if (s == player) {
frame = F_DEAD;
} else {
frame = F_DEAD + ((timer/2) % 4);
}
} else if (s->caughtby) {
frame = F_CAUGHT;
} else if (s->climbing) {
frame = F_CLIMB1 + ((timer/12) % 2);
} else if (s->netting) {
frame = F_SHOOT;
} else if (s->jumping) {
frame = F_JUMP;
} else if (s->falling) {
frame = F_FALL;
} else if (s->slamming) {
double slamdegs = s->slamangle / (M_PI/180);
if (slamdegs < 36) {
frame = F_SLAM1;
} else if (slamdegs < 72) {
frame = F_SLAM2;
} else if (slamdegs < 108) {
frame = F_SLAM3;
} else if (slamdegs < 144) {
frame = F_SLAM4;
} else {
frame = F_SLAM5;
}
} else if (!s->teleporting) {
if ((s->id == P_SPIDER) && (s->ys != -99)) {
frame = F_FALL;
} else {
if (s->moved) {
if ((timer/12) % 2 == 0) {
frame = F_WALK1;
} else {
frame = F_JUMP;
}
} else {
frame = F_WALK1;
}
}
}
}
/* x-flip if required */
@ -1285,17 +1387,24 @@ int isflower(int id) {
int isfruit(int id) {
switch (id) {
/* fruits */
case P_CHEESE:
case P_ICECREAM:
case P_CHIPS:
case P_BURGER:
case P_DIAMOND:
/* normal powerups */
case P_SPEED:
case P_NUMNETS:
case P_BIGNET:
case P_HELP:
/* random powerups */
case P_BOXING:
/* flowers */
case P_FLOWERYELLOW:
case P_FLOWERRED:
case P_FLOWERPURPLE:
/* gems */
case P_GEMYELLOW:
case P_GEMRED:
case P_GEMPURPLE:
@ -1314,6 +1423,8 @@ int isbullet(int id) {
int iseffect(int id) {
if (id == P_PUFF) return B_TRUE;
if (id == P_POWERUPPOS) return B_TRUE;
if (id == P_GLOVE) return B_TRUE;
return B_FALSE;
}
@ -1475,6 +1586,7 @@ int chartomonster(char ch) {
case 'P': return P_FLOWERPURPLE;
case 'C': return P_COKE;
case '*': return P_GEMRED;
case '!': return P_POWERUPPOS;
}
return -1;
@ -1493,6 +1605,7 @@ char monstertochar(int id ) {
case P_FLOWERPURPLE: return 'P';
case P_COKE: return 'C';
case P_GEMRED: return '*';
case P_POWERUPPOS: return '!';
}
return '\0';
@ -1586,3 +1699,66 @@ int ismonster(int id) {
return B_FALSE;
}
void puffin(int willbecome, int x, int y, char *name, int delay) {
sprite_t *ss;
ss = addsprite(P_PUFF, x, y, "puff" );
ss->timer3 = willbecome;
ss->timer1 = -delay;
strncpy(ss->name, name, MIDBUFLEN);
}
/*
void removetext(void) {
SDL_Rect sarea;
text_t *t;
for (t = text ; t ; t = t->next) {
sarea.x = 0;
sarea.y = 0;
sarea.w = t->bgarea.w;
sarea.h = t->bgarea.h;
SDL_BlitSurface(t->bg, &sarea, screen, &t->bgarea);
}
}
*/
void killtext(text_t *t) {
text_t *nextone, *lastone;
if (t->bg) {
SDL_FreeSurface(t->bg);
t->bg = NULL;
}
if (t->img) {
SDL_FreeSurface(t->img);
t->img = NULL;
}
nextone = t->next;
if (nextone != NULL) {
nextone->prev = t->prev;
} else { /*last text */
lasttext = t->prev;
}
if (t->prev == NULL) {
/* first text */
nextone = text->next;
free(text);
text = nextone;
} else {
lastone = t->prev;
free (lastone->next );
lastone->next = nextone;
}
/* if we're killing text during LV_INIT, it must have been
the level announcement. That means that we can start
moving.
*/
if (levelcomplete == LV_INIT) levelcomplete = LV_INPROGRESS;
}

View File

@ -8,7 +8,7 @@
int loadlevel(int wnum, int lnum);
void setdefaults(sprite_t *s);
int loadtiletypes(char *filename);
sprite_t *addsprite(int id,int x, int y, char *name, int initial);
sprite_t *addsprite(int id,int x, int y, char *name);
tiletype_t *gettileat(int pixx,int pixy, int *tilex, int *tiley);
int loadimagesets(void);
int isbullet(int id);
@ -31,8 +31,9 @@ char monstertochar(int id);
tiletype_t *gettile(int tid);
void drawtile(SDL_Surface *s, int x, int y);
void initglobals(void);
void killtext(text_t *t);
int ismonster(int id);
void puffin(int willbecome, int x, int y, char *name, int delay);
SDL_Surface *loadspriteimage(int spriteid, int frame, char *filename);
#endif

BIN
sprites/boxing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

BIN
sprites/diamond.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

BIN
sprites/poweruppos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

View File

@ -10,7 +10,6 @@ monsters
1 3 19
? 7 19
? 12 19
@ 16 14
@ 30 15
@ 31 15
P 21 15
@ -18,17 +17,20 @@ P 21 15
@ 20 15
Y 23 15
Y 19 15
P 36 14
Y 2 15
Y 1 15
Y 24 19
Y 22 19
Y 20 19
r 18 15
r 27 15
P 36 14
Y 34 19
@ 35 19
P 36 19
endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,18,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
@ -40,13 +42,13 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,4,
4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,4,4,
4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4,4,4,4,4,1,1,1,1,1,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,

View File

@ -28,6 +28,7 @@ Y 34 19
@ 35 19
P 36 19
endmonsters
exitdir 1
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,

View File

@ -1,6 +1,6 @@
tileset green
bg 0
hurryup 30
hurryup 60
endmaps
help
endhelp
@ -33,33 +33,34 @@ P 38 24
S 31 24
r 20 21
endmonsters
exitdir 1
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,21,21,21,21,22,22,22,22,22,22,21,21,21,20,20,1,1,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,20,20,21,21,21,20,20,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,21,21,21,21,22,22,22,22,22,22,21,21,21,20,20,1,1,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,20,21,21,21,22,22,22,22,22,22,21,21,21,21,20,20,20,1,1,1,1,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,20,20,20,20,20,20,20,20,20,20,20,20,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,1,1,1,20,20,20,20,20,20,20,20,20,20,20,1,1,1,1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
1,1,1,1,20,20,20,20,20,20,20,21,21,21,21,21,22,22,22,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,1,1,1,1,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,1,1,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,1,1,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,1,1,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,1,1,28,28,28,28,28,28,28,1,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,1,1,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,1,1,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,1,1,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,1,1,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,1,1,1,1,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,1,1,1,1,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,1,28,28,28,28,28,28,28,28,28,28,28,28,28,1,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,1,1,1,1,1,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,4,4,4,4,4,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,4,4,4,4,4,4,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,1,1,1,28,28,28,28,28,28,28,28,28,28,28,1,1,1,1,4,4,4,4,4,4,4,4,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
1,1,1,1,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,1,1,1,1,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

View File

@ -1,46 +1,87 @@
tileset green
bg 0
hurryup 30
hurryup 60
endmaps
help
endhelp
monsters
1 3 28
C 33 7
C 11 13
r 13 5
r 19 21
r 7 17
S 28 24
s 23 1
1 5 28
a 23 18
a 14 10
a 21 7
r 36 12
r 2 16
r 2 8
r 38 4
r 35 20
r 4 24
C 23 1
C 7 1
P 24 28
P 23 28
P 25 28
P 25 19
@ 16 19
@ 18 19
@ 20 19
@ 22 19
Y 36 16
Y 37 16
Y 3 12
Y 2 12
Y 3 20
Y 2 20
Y 36 8
Y 37 8
Y 37 24
Y 36 24
@ 37 20
@ 36 20
@ 3 24
@ 2 24
@ 2 16
@ 3 16
@ 37 12
@ 36 12
@ 3 8
@ 2 4
@ 2 8
@ 3 4
@ 36 4
@ 37 4
@ 17 1
@ 23 1
P 20 1
P 19 1
P 21 1
endmonsters
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,20,20,20,20,20,20,20,20,20,20,20,25,25,25,25,25,25,25,25,25,25,25,20,20,20,20,20,20,20,20,20,20,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,25,24,24,24,24,24,24,24,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,0,0,0,25,24,24,24,24,24,24,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,0,0,25,24,24,24,24,24,24,24,26,26,26,26,26,26,25,25,25,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,26,24,24,24,24,24,24,24,26,26,26,26,26,24,24,24,24,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,26,26,26,24,24,24,24,24,26,26,26,26,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,0,26,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,25,0,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,0,25,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,24,25,25,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,25,24,24,24,25,25,25,26,26,26,26,26,26,26,24,24,24,24,24,24,25,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,24,24,24,24,24,24,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,24,24,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,24,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,24,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,0,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,0,24,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,0,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,0,24,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,24,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,24,24,24,26,26,26,26,26,26,26,26,26,26,26,24,24,24,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,24,24,24,25,25,25,25,25,25,25,25,25,26,25,24,24,24,0,0,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,24,24,24,26,24,24,24,24,0,0,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,24,26,24,24,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,24,26,24,24,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,26,24,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,20,20,20,20,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,26,24,0,0,0,0,0,0,0,0,0,20,20,20,20,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,21,21,21,21,22,22,22,22,22,22,21,21,21,20,20,1,1,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,20,20,21,21,21,20,20,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,21,21,21,21,22,22,22,22,22,22,21,21,21,20,20,1,1,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,1,1,20,20,20,21,21,21,22,22,22,22,22,22,21,21,21,21,20,20,20,1,1,1,1,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,20,20,20,20,20,20,20,20,20,20,20,20,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,1,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,1,1,1,20,20,20,20,20,20,20,20,20,20,20,1,1,1,1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
1,1,1,1,20,20,20,20,20,20,20,21,21,21,21,21,22,22,22,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,20,20,1,1,1,1,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,

View File

@ -24,11 +24,12 @@ r 9 4
? 27 4
Y 20 4
endmonsters
exitdir 1
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,18,23,19,0,0,4,
4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,27,27,27,27,27,27,1,1,27,27,27,27,27,27,27,27,27,27,27,27,27,0,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,1,1,1,1,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,

View File

@ -31,7 +31,9 @@ r 4 23
@ 2 23
? 10 19
? 16 19
! 20 15
endmonsters
exitdir -2
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,18,23,23,23,23,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,

View File

@ -36,19 +36,19 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,23,19,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,1,20,20,21,21,21,21,21,21,21,21,20,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,18,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,20,20,21,21,21,21,21,21,21,21,20,20,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,20,20,20,20,20,20,20,20,20,20,20,20,1,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,

View File

@ -39,6 +39,7 @@ Y 26 8
@ 33 16
Y 7 16
endmonsters
exitdir -2
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
@ -51,12 +52,12 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,20,20,21,21,21,21,21,20,20,3,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,0,0,0,0,0,0,0,0,0,4,3,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,0,0,0,0,0,0,0,0,0,4,4,3,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,0,0,0,0,0,0,0,0,0,4,4,4,3,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,1,1,1,1,1,1,1,4,4,4,4,1,1,1,0,0,0,1,1,1,4,4,4,4,1,1,1,1,1,1,1,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,28,28,28,28,28,28,28,28,28,3,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,27,27,27,27,27,27,27,27,27,4,3,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,27,27,27,27,27,27,27,27,27,4,4,3,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,27,27,27,27,27,27,27,27,27,4,4,4,3,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,1,1,1,1,1,1,1,1,4,4,4,4,1,1,1,27,27,27,1,1,1,4,4,4,4,1,1,1,1,1,1,1,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,

View File

@ -43,6 +43,7 @@ r 22 9
r 26 13
r 16 17
endmonsters
exitdir -2
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
@ -70,6 +71,6 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
4,4,4,4,4,4,4,4,4,4,4,4,4,16,16,16,16,16,16,16,16,16,16,16,16,16,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,17,17,17,17,17,17,17,17,17,17,17,17,17,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,27,27,27,27,27,27,27,27,27,27,27,27,27,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,31,31,31,31,31,31,31,31,31,31,31,31,31,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,

View File

@ -24,7 +24,9 @@ Y 30 13
Y 38 13
Y 9 8
Y 2 8
a 4 8
endmonsters
exitdir 1
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,18,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,23,19,0,0,4,
@ -36,8 +38,8 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,1,1,8,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,4,
4,0,18,19,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,8,1,1,1,4,
4,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,4,

View File

@ -5,6 +5,7 @@ endmaps
help
endhelp
monsters
1 18 15
@ 11 5
@ 12 9
@ 27 9
@ -39,7 +40,6 @@ Y 4 28
Y 6 28
a 31 3
a 7 19
1 18 15
r 27 5
r 16 5
r 10 12
@ -47,6 +47,7 @@ r 29 12
r 6 15
r 31 15
endmonsters
exitdir 2
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,18,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,19,0,4,
@ -63,17 +64,17 @@ endmonsters
4,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,20,20,20,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,25,25,25,25,25,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,1,11,11,11,11,11,0,0,0,0,0,0,0,0,11,11,11,11,11,1,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,4,1,1,1,1,1,11,11,11,11,11,11,11,11,1,1,1,1,1,4,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,1,1,1,1,1,1,1,1,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,27,27,27,27,27,27,27,27,27,1,11,11,11,11,11,0,0,0,0,0,0,0,0,11,11,11,11,11,1,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,4,1,1,1,1,1,11,11,11,11,11,11,11,11,1,1,1,1,1,4,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,4,4,4,4,4,1,1,1,1,1,1,1,1,4,4,4,4,4,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,4,4,4,4,4,4,4,4,4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,12,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,13,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,4,
4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,