diff --git a/defs.h b/defs.h index adfd22c..c722a86 100644 --- a/defs.h +++ b/defs.h @@ -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 diff --git a/edit.c b/edit.c index cb10955..0427899 100644 --- a/edit.c +++ b/edit.c @@ -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++) { diff --git a/globals.h b/globals.h index a246179..78cba03 100644 --- a/globals.h +++ b/globals.h @@ -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]; diff --git a/newtiles/cavebg.png b/newtiles/cavebg.png new file mode 100644 index 0000000..7984756 Binary files /dev/null and b/newtiles/cavebg.png differ diff --git a/newtiles/cavebridge.png b/newtiles/cavebridge.png new file mode 100644 index 0000000..9efaab6 Binary files /dev/null and b/newtiles/cavebridge.png differ diff --git a/newtiles/cavespikes.png b/newtiles/cavespikes.png new file mode 100644 index 0000000..be04d07 Binary files /dev/null and b/newtiles/cavespikes.png differ diff --git a/newtiles/honey.png b/newtiles/honey.png new file mode 100644 index 0000000..5fe0448 Binary files /dev/null and b/newtiles/honey.png differ diff --git a/newtiles/honeybg.png b/newtiles/honeybg.png new file mode 100644 index 0000000..f183784 Binary files /dev/null and b/newtiles/honeybg.png differ diff --git a/newtiles/honeytop.png b/newtiles/honeytop.png new file mode 100644 index 0000000..cd3779e Binary files /dev/null and b/newtiles/honeytop.png differ diff --git a/newtiles/signdown.png b/newtiles/signdown.png new file mode 100644 index 0000000..09caa06 Binary files /dev/null and b/newtiles/signdown.png differ diff --git a/newtiles/signup.png b/newtiles/signup.png new file mode 100644 index 0000000..070f464 Binary files /dev/null and b/newtiles/signup.png differ diff --git a/rc b/rc index afd4569..3930a1c 100755 Binary files a/rc and b/rc differ diff --git a/rc.c b/rc.c index b8b9598..cb94ba8 100644 --- a/rc.c +++ b/rc.c @@ -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; + } +} diff --git a/rc.h b/rc.h index 0f01625..04d4006 100644 --- a/rc.h +++ b/rc.h @@ -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); diff --git a/shared.c b/shared.c index 4e22aaf..2233f80 100644 --- a/shared.c +++ b/shared.c @@ -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; +} diff --git a/shared.h b/shared.h index f987ac5..046f1d8 100644 --- a/shared.h +++ b/shared.h @@ -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 diff --git a/sprites/boxing.png b/sprites/boxing.png new file mode 100644 index 0000000..193bef8 Binary files /dev/null and b/sprites/boxing.png differ diff --git a/sprites/diamond.png b/sprites/diamond.png new file mode 100644 index 0000000..25c8e01 Binary files /dev/null and b/sprites/diamond.png differ diff --git a/sprites/poweruppos.png b/sprites/poweruppos.png new file mode 100644 index 0000000..c45ec80 Binary files /dev/null and b/sprites/poweruppos.png differ diff --git a/world1/BAK b/world1/BAK index ff19ea5..0680060 100644 --- a/world1/BAK +++ b/world1/BAK @@ -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, diff --git a/world1/level1.dat b/world1/level1.dat index 0680060..3138a9e 100644 --- a/world1/level1.dat +++ b/world1/level1.dat @@ -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, diff --git a/world1/level10.dat b/world1/level10.dat index 625b38a..3c66ca3 100644 --- a/world1/level10.dat +++ b/world1/level10.dat @@ -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, diff --git a/world1/level11.dat b/world1/level11.dat index 8e74b6b..262bdb9 100644 --- a/world1/level11.dat +++ b/world1/level11.dat @@ -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, diff --git a/world1/level2.dat b/world1/level2.dat index 0e03013..86400dd 100644 --- a/world1/level2.dat +++ b/world1/level2.dat @@ -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, diff --git a/world1/level3.dat b/world1/level3.dat index 263bb9d..beb14ca 100644 --- a/world1/level3.dat +++ b/world1/level3.dat @@ -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, diff --git a/world1/level4.dat b/world1/level4.dat index 2c27fd2..361fe2b 100644 --- a/world1/level4.dat +++ b/world1/level4.dat @@ -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, diff --git a/world1/level5.dat b/world1/level5.dat index 43643ac..0d1cc1f 100644 --- a/world1/level5.dat +++ b/world1/level5.dat @@ -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, diff --git a/world1/level6.dat b/world1/level6.dat index cb0fe01..497023d 100644 --- a/world1/level6.dat +++ b/world1/level6.dat @@ -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, diff --git a/world1/level7.dat b/world1/level7.dat index 7851448..71a570f 100644 --- a/world1/level7.dat +++ b/world1/level7.dat @@ -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, diff --git a/world1/level8.dat b/world1/level8.dat index cc4106c..c7b7f94 100644 --- a/world1/level8.dat +++ b/world1/level8.dat @@ -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,