- Fixed bug with jumping off ladders

- Fixed issue when dropping throughbridges and moving at the same time
- Can no longer climb while slamming/netting
- Modified behaviour of flowertogem powerup
- Level orderis now read from levels.dat
- Editor now handles loading an empty level
- Added sounds for teleportation and entering/exitting water
- Fixed swimming in water behaviour
- Added powerup:  Mace
This commit is contained in:
Rob Pearce 2008-09-30 07:42:09 +00:00
parent 875de25da6
commit 5b272b4665
24 changed files with 616 additions and 288 deletions

27
defs.h
View File

@ -15,7 +15,7 @@
// size of flower straem when getting last flower
// (number of gems on each side)
#define STREAMWID 6
#define STREAMWID 5
// puff of smoke
@ -59,8 +59,12 @@
#define NETSPEED 9 // how fast the player's net moves
#define POWERUPTIME 15 // # secs before a powerup appears
#define MACEEXPX 4 // X size of mace explosion
#define MACEEXPY 2 // Y size of mace explosion
// Limits
#define MAXLEVELS 100
#define MAXMAPPINGS 50
#define MAXMONSTERSPERLEVEL 40
#define MAXLETTERHEIGHT 100
@ -85,7 +89,7 @@
/* enums */
/* sounds */
#define MAXFX 15
#define MAXFX 18
#define FX_SHOOT 0
#define FX_SLAM 1
#define FX_KILL 2
@ -101,6 +105,9 @@
#define FX_MORPH 12
#define FX_BOOM 13
#define FX_SPRING 14
#define FX_TELEPORT 15
#define FX_SPLASH 16
#define FX_MACE 17
// Slope types
#define S_NOTSOLID 0
@ -108,7 +115,7 @@
#define S_SLOPE 2
// Sprite types
#define MAXPTYPES 31
#define MAXPTYPES 33
#define P_PLAYER 0
#define P_RAT 1
#define P_CHEESE 2
@ -140,11 +147,14 @@
#define P_FTOGEM 28
#define P_BOMB 29
#define P_SHIELD 30
#define P_MACEPOWERUP 31
#define P_MACE 32
// powerups
#define PW_NONE 0
#define PW_BOXING 1 // boxing glove
#define PW_BOMB 2 // bomb
#define PW_MACE 3 // made
// Frame names
#define F_WALK1 0
@ -284,6 +294,11 @@ typedef struct level_s {
} level_t;
level_t *level;
typedef struct levelentry_s {
char *filename;
char *desc;
} levelentry_t;
typedef struct sprite_s {
int id; // what kind of sprite? (eg. player, cheese, rat)
int score; // player's score, for monsters how much they are worth
@ -329,6 +344,7 @@ typedef struct sprite_s {
char name[MIDBUFLEN]; // Help text for help icons, otherwise not really used outside of debugging
// player and monster
int swimming; // are we in the water?
int falling; // are we falling?
int dropping; // are we purposely dropping through solid ground?
int dropx,dropy;// coords of tile we dropped from
@ -365,7 +381,7 @@ imageset_t imageset[MAXPTYPES];
/* external globals */
extern SDL_Color black;
extern SDL_Surface *screen, *temps;
extern SDL_Surface *screen, *temps, *levelbg;
extern sprite_t *sprite, *lastsprite, *player;
extern level_t *curlevel;
extern tiletype_t fakeblock;
@ -373,6 +389,7 @@ extern int gtime;
extern int timer;
extern SDL_Color red;
extern SDL_Color black;
extern SDL_Color blue;
extern SDL_Color white;
extern SDL_Color green;
extern SDL_Color yellow;
@ -386,6 +403,8 @@ extern int oldexitdir;
extern int levelcomplete;
extern text_t *text, *lasttext;
extern int cheat;
extern int nexthurryup;
extern levelentry_t levelentry[];
#endif

View File

@ -7,4 +7,4 @@
- in shared.c: update isflower(), isfruit(), isbullet(), iseffect();
- in shared.c: IF A GEM: update flowertogem()
- in rc.c: update ismonster()
- in rc.c: add monster movement
- in rc.c: add monster/effect movement

114
edit.c
View File

@ -41,6 +41,8 @@ int main (int argc, char **argv) {
curlevelnum = 1;
levelbg = NULL;
/* handle arguments */
if (argc >= 2) {
for (i = 1; i < argc; i++) {
@ -62,6 +64,11 @@ int main (int argc, char **argv) {
}
}
if (loadlevellist()) {
printf("Error loading level list from levels.dat.\n");
return 1;
}
/* initialise */
initglobals();
@ -139,6 +146,7 @@ int main (int argc, char **argv) {
seltile = NULL;
/* get tile number */
for (tt = tiletype; tt != NULL; tt = tt->next) {
if (isplacabletile(tt->id)) {
// is mouse over this one?
if ((mx >= x) && (my >= y) && (mx <= x+TILEW-1) && (my <= y+TILEH-1)) {
seltile = tt;
@ -153,6 +161,7 @@ int main (int argc, char **argv) {
}
}
}
}
// redraw palette with new selection
drawpalette();
} else if ((mx >= PALX) && (my > SPALY)) { // over sprite palette
@ -163,6 +172,7 @@ int main (int argc, char **argv) {
selsprite = -1;
for (p = 0; p < MAXPTYPES; p++) {
if (isplacablesprite(p)) {
SDL_Surface *firstimg;
int w,h;
@ -186,7 +196,7 @@ int main (int argc, char **argv) {
maxh = 0;
}
}
}
}
// redraw palette with new selection
drawpalette();
@ -309,29 +319,7 @@ int main (int argc, char **argv) {
}
if (keys[SDLK_c]) {
if (toggletimer == 0) {
int offset,x,y;
/* clear all sprites */
while (sprite) {
killsprite(sprite);
}
/* clear level */
for (x = 0; x < LEVELW; x++) {
for (y = 0; y < LEVELH; y++) {
offset = y*LEVELW+x;
if ((x == 0) || (x == LEVELW-1)) {
curlevel->map[offset] = T_FULL;
} else if (y == LEVELH-1) {
curlevel->map[offset] = T_LAND;
} else {
curlevel->map[offset] = T_BLANK;
}
curlevel->map2[offset] = T_BLANK;
drawtile(screen,x,y);
}
}
printf("cleared level\n");
clearlevel();
toggletimer = 30;
}
}
@ -371,7 +359,10 @@ int main (int argc, char **argv) {
if (toggletimer == 0) {
printf("Skipping to next level.\n");
curlevelnum++;
loadlevel(curworld,curlevelnum);
if (loadlevel(curworld,curlevelnum)) {
printf("creating new level\n");
clearlevel();
}
draweditorlevel();
drawsprites();
toggletimer = 30;
@ -383,7 +374,10 @@ int main (int argc, char **argv) {
if (curlevelnum > 1) {
printf("Skipping to previous level.\n");
curlevelnum--;
loadlevel(curworld,curlevelnum);
if (loadlevel(curworld,curlevelnum)) {
printf("creating new level\n");
clearlevel();
}
draweditorlevel();
drawsprites();
toggletimer = 30;
@ -517,6 +511,7 @@ void drawpalette(void) {
area.w = TILEW;
area.h = TILEH;
for (tt = tiletype; tt != NULL; tt = tt->next) {
if (isplacabletile(tt->id)) {
/* draw background */
SDL_BlitSurface(bg->img[0], NULL, screen, &area);
/* draw tile */
@ -532,7 +527,7 @@ void drawpalette(void) {
area.x = PALX;
area.y += TILEH;
}
}
}
SDL_UpdateRect(screen, PALX,PALY,PALW,PALH);
@ -545,6 +540,7 @@ void drawpalette(void) {
for (p = 0; p < MAXPTYPES; p++) {
SDL_Surface *firstimg;
if (isplacablesprite(p)) {
/* select images */
firstimg = imageset[p].img[F_WALK1];
area.w = firstimg->w;
@ -568,6 +564,7 @@ void drawpalette(void) {
area.y += maxheight;
maxheight = 0;
}
}
}
SDL_UpdateRect(screen, SPALX,SPALY,SPALW,SPALH);
@ -582,7 +579,8 @@ int savelevel(int wnum, int lnum) {
sprite_t *s;
sprintf(filename, "world%d/level%d.dat",wnum,lnum);
sprintf(filename,"world%d/%s",wnum,levelentry[lnum].filename);
f = fopen(filename,"wt");
if (!f) {
printf("can't open level file\n");
@ -646,3 +644,63 @@ int savelevel(int wnum, int lnum) {
return 0;
}
void clearlevel(void) {
int offset,x,y;
/* clear all sprites */
while (sprite) {
killsprite(sprite);
}
/* clear level */
for (x = 0; x < LEVELW; x++) {
for (y = 0; y < LEVELH; y++) {
offset = y*LEVELW+x;
if ((x == 0) || (x == LEVELW-1)) {
curlevel->map[offset] = T_FULL;
} else if (y == LEVELH-1) {
curlevel->map[offset] = T_LAND;
} else {
curlevel->map[offset] = T_BLANK;
}
curlevel->map2[offset] = T_BLANK;
drawtile(screen,x,y);
}
}
modified = B_TRUE;
}
int isplacabletile(int tid) {
switch (tid) {
case T_TRAMPDOWN:
return B_FALSE;
}
return B_TRUE;
}
int isplacablesprite(int sid) {
switch (sid) {
case P_SPEED:
case P_NUMNETS:
case P_BIGNET:
case P_CLOUD:
case P_SPIT:
case P_PUFF:
case P_BOXING:
case P_GLOVE:
case P_DIAMOND:
case P_FTODIAMOND:
case P_FTOGEM:
case P_BOMB:
case P_SHIELD:
case P_MACEPOWERUP:
case P_MACE:
case P_GEMRED:
case P_GEMYELLOW:
case P_GEMPURPLE:
return B_FALSE;
}
return B_TRUE;
}

3
edit.h
View File

@ -21,4 +21,7 @@ void drawsprites(void);
int savelevel(int wnum, int lnum);
void cleanup(void);
void usage(void);
void clearlevel(void);
int isplacabletile(int tid);
int isplacablesprite(int sid);

View File

@ -4,6 +4,9 @@
/* global variables */
int musicplaying;
levelentry_t levelentry[MAXLEVELS]; // level filenames etc
SDL_Surface *levelbg; // level background image
SDL_Surface *temps; // temporary surface
SDL_Surface *screen; // the actual video screen
sprite_t *sprite; // head of sprite linked list
@ -19,6 +22,8 @@ level_t *curlevel; // the current level's data
int levelcomplete; // has the levle been finished?
int nexthurryup; // next hurryuptime for the level
int cheat;
tiletype_t fakeblock; // used for returning tiletypes from a function
@ -37,6 +42,7 @@ int toggletimer; // used for toggling between fullscreen mode
/* colours */
SDL_Color red;
SDL_Color black;
SDL_Color blue;
SDL_Color white;
SDL_Color green;
SDL_Color yellow;

304
rc.c
View File

@ -70,6 +70,7 @@ sprite_t *lastsprite;
SDL_Color red = {255, 0, 0, 0};
SDL_Color black = {0, 0, 0, 0};
SDL_Color blue = {0, 0, 255, 0};
SDL_Color white = {255, 255, 255, 0};
SDL_Color green = {0, 255, 0, 0};
SDL_Color yellow = {255, 255, 0, 0};
@ -89,6 +90,7 @@ int main (int argc, char **argv) {
curlevelnum = 1;
musicplaying = B_FALSE;
cheat = B_FALSE;
levelbg = NULL;
/* handle arguments */
if (argc >= 2) {
@ -130,7 +132,15 @@ int main (int argc, char **argv) {
screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE|SDL_DOUBLEBUF|vidargs);
#endif
srand(time(NULL));
if (loadimagesets()) {
printf("Error loading images.\n");
return 1;
}
if (loadlevellist()) {
printf("Error loading level list from levels.dat.\n");
return 1;
}
@ -244,7 +254,7 @@ int main (int argc, char **argv) {
if (keys[SDLK_q]) {
gtime = curlevel->hurryuptime -1;
gtime = nexthurryup-1;
}
if (keys[SDLK_n]) {
if (toggletimer == 0) {
@ -287,19 +297,26 @@ int main (int argc, char **argv) {
}
}
if (keys[SDLK_UP]) {
if (isonladder(player) || isladderabove(player)) {
//if (isonladder(player) || isladderabove(player)) {
if (player->climbing || isladderabove(player)) {
if (!player->netting && !player->slamming) {
player->y -= getspeed(player);
player->jumping = 0;
player->falling = 0;
player->climbing = B_TRUE;
player->moved = B_TRUE;
}
}
}
if (keys[SDLK_DOWN]) {
if (isonladder(player)) {
if (!player->netting && !player->slamming) {
player->y += getspeed(player);
player->jumping = 0;
player->falling = 0;
player->climbing = B_TRUE;
player->moved = B_TRUE;
}
}
}
if (keys[SDLK_x]) {
@ -323,14 +340,13 @@ int main (int argc, char **argv) {
} else {
whichway = 0;
}
// TODO: change to splash
playfx(FX_JUMP);
playfx(FX_SPLASH);
jump(player, whichway);
}
}
}
} else {
} else { // not in water
if (!player->jumping) {
if (!player->falling) {
if (isonground(player) || isonladder(player)) {
@ -342,9 +358,8 @@ int main (int argc, char **argv) {
player->dropx = player->x / TILEW;
player->dropy = player->y / TILEH;
}
} else {
} else { // jumping
int whichway;
player->climbing = B_FALSE;
if (keys[SDLK_RIGHT]) {
whichway = 1;
} else if (keys[SDLK_LEFT]) {
@ -375,6 +390,28 @@ int main (int argc, char **argv) {
player->slamangle = 0;
player->netxstart = player->x - (player->img->w/2)*player->dir;
player->netystart = player->y;
/* handle boxing glove */
if (player->powerup == PW_MACE) {
sprite_t *s;
int found;
// use existing mace if it is there
found = B_FALSE;
for (s = sprite; s ; s = s->next) {
if (s->id == P_MACE) {
s->x = player->x;
s->y = player->y - (imageset[P_PLAYER].img[F_SHOOT]->h / 2) + 5;
found = B_TRUE;
}
}
if (!found) {
addsprite(P_MACE, player->x,
player->y - (imageset[P_PLAYER].img[F_SHOOT]->h / 2) + 5,
"mace");
}
}
}
} else {
if (player->netcaught < player->netmax) {
@ -530,7 +567,7 @@ void tick(void) {
/* check for hurryup*/
if (gtime == curlevel->hurryuptime) {
if (gtime == nexthurryup) {
if (!levelcomplete) {
for (s = sprite; s; s = s->next) {
if ((s != player) && (!isfruit(s->id))) {
@ -542,7 +579,7 @@ void tick(void) {
stopmusic();
Mix_PlayChannel(CH_HURRYUP, sfx[FX_HURRYUP], 0);
}
} else if (gtime == curlevel->hurryuptime + 10) {
} else if (gtime == nexthurryup + 10) {
if (!levelcomplete) {
addsprite(P_CLOUD, 320,240,"cloud");
addtext(320,240,TEXTSIZE_HURRY, "Too slow!", &red,HURRYDELAY);
@ -585,6 +622,8 @@ void tick(void) {
void nextlevel(void) {
char msg[SMALLBUFLEN];
SDL_Surface *tempt;
int wid;
// remove the player
removesprite(player);
@ -616,9 +655,22 @@ void nextlevel(void) {
/* 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);
sprintf(msg, "Level %d-%d",curworld, curlevelnum);
// calc width
tempt = TTF_RenderText_Solid(font[32], msg, black);
wid = tempt->w;
addtext(318,240-18+2,32,msg,&black,LEVELDELAY);
addtext(320,240-18,32,msg,&red,LEVELDELAY);
SDL_FreeSurface(tempt);
sprintf(msg, "%s", curlevel->name);
// calc width
tempt = TTF_RenderText_Solid(font[22], msg, black);
wid = tempt->w;
addtext(319,240+18+1,22,msg,&black,LEVELDELAY);
addtext(320,240+18,22,msg,&blue,LEVELDELAY);
SDL_FreeSurface(tempt);
/* reset player stats */
player->netting = B_FALSE;
@ -635,7 +687,12 @@ void jump(sprite_t *s, int dir) {
if (s->jumping) return;
if (s->jumptimer) return;
if (isonground(s) || isinwater(s)) {
// can only jump up when climbing
if (s->climbing && (dir == 0)) {
return;
}
if (isonground(s) || isinwater(s) || isonladder(s)) {
if (ismonster(s->id)) {
s->jumpdir = dir;
if (s->jumpdir != 0) {
@ -648,12 +705,16 @@ void jump(sprite_t *s, int dir) {
s->dir = s->jumpdir;
}
s->jumping = 1;
if (s->ontramp) {
if (s->climbing) {
s->jumpspeed = 3;
} else if (s->ontramp) {
s->jumpspeed = 7;
} else {
s->jumpspeed = 5;
}
}
// stop climbing
player->climbing = B_FALSE;
}
}
@ -666,7 +727,7 @@ void die(sprite_t *s) {
// We already do this in the cloud movement routine, but
// this handles cases where the cloud hasn't appeared yet.
if (s == player) {
gtime = 0;
nexthurryup = gtime + level->hurryuptime;
if (curmusic == fastmusic) {
playmusic(normalmusic);
}
@ -1061,11 +1122,13 @@ void movesprite(sprite_t *s) {
if (isonground(s)) {
if ((!s->falling) && (!s->jumping)) {
if (!s->climbing && !s->dropping) {
if (!isonladder(s)) {
adjustheight(s);
}
}
}
}
}
/* sprite is about to jump */
if (s->jumptimer) {
@ -1126,6 +1189,19 @@ void movesprite(sprite_t *s) {
s->y = player->y - (player->img->h/2) + 5;
s->dir = player->dir;
}
} else if (s->id == P_MACE) { // mace slam effect
// dies when the player finishes slamming
if (!player->slamming) {
s->dead = D_FINAL;
} else {
double dist;
// keep it at the end of the slam
dist = (player->slamangle * (180/M_PI))/2;
s->x = player->x + cos(player->slamangle-(180*(M_PI/180)))*dist*player->dir;
s->y = player->y + sin(player->slamangle-(180*(M_PI/180)))*dist + imageset[P_MACEPOWERUP].img[F_WALK1]->h/2;
s->dir = player->dir;
}
} else if (s->id == P_RAT) {
if (!s->falling) {
int move = B_FALSE;
@ -1517,7 +1593,7 @@ void movesprite(sprite_t *s) {
if ((s->img->h <= 3) || (s->img->w <= 3)) {
s->dead = D_FINAL;
/* reset hurryup timer */
gtime = 0;
nexthurryup = gtime + level->hurryuptime;
} else {
SDL_Surface *ts;
/* get smaller */
@ -1582,13 +1658,18 @@ void dotileeffects(sprite_t *s) {
/* check where we are */
tt = gettileat(s->x,s->y-2,&tilex,&tiley);
// teleporters
if ((tt->id == T_TELEPORT) || (tt->id == T_TELEPORT2)) {
if (s->id == P_PLAYER || ismonster(s->id)) {
if (s->id != P_CLOUD) {
if (!s->teleporting) {
playfx(FX_TELEPORT);
s->teleporting = 1;
}
}
}
}
/* check under us */
@ -2212,11 +2293,21 @@ int isonbridge(sprite_t *s) {
return B_FALSE;
}
int isladder(int tid) {
switch (tid) {
case T_LADDER:
case T_LADDERTOP:
return B_TRUE;
}
return B_FALSE;
}
int isonladder(sprite_t *s) {
tiletype_t *tthere;
tthere = gettileat(s->x,s->y, NULL,NULL);
if ((tthere->id == T_LADDER) || (tthere->id == T_LADDERTOP)) {
if (isladder(tthere->id)) {
return B_TRUE;
}
@ -2312,7 +2403,8 @@ int isongroundpoint(sprite_t *s, int x,int y) {
// when dropping, the tile you dropped from doesn't count
// as "ground".
if (s->dropping && (tilex == s->dropx) && (tiley == s->dropy)) {
//if (s->dropping && (tilex == s->dropx) && (tiley == s->dropy)) {
if (s->dropping && (tiley == s->dropy)) {
return B_FALSE;
}
@ -2387,10 +2479,48 @@ void dogravity(sprite_t *s) {
if (isbullet(s->id)) return;
if (isonladder(s) && !s->falling && !s->jumping) {
//if (isonladder(s) && !s->falling && !s->jumping) {
/*
if (isonladder(s) ) {
s->falling = B_FALSE;
return;
}
*/
// update water stats
if (isinwater(s)) {
if (!s->swimming) {
s->swimming = B_TRUE;
playfx(FX_SPLASH);
}
} else {
if (s->swimming) {
s->swimming = B_FALSE;
}
}
if (s->climbing) {
int attop = B_FALSE;
// check if we are at the top of our ladder
//tt = gettileat(s->x, s->y - s->img->h-1,NULL,NULL);
if (!isonladder(s)) {
attop = B_TRUE;
}
if (isonground(s)) {
if (!isongroundpoint(s, s->x, s->y-1)) {
attop = B_TRUE;
}
}
if (attop) {
s->climbing = B_FALSE;
} else {
// don't do any more checking
return;
}
}
// handle jumps
if (s->jumping) {
@ -2416,7 +2546,7 @@ void dogravity(sprite_t *s) {
s->fallspeed = 0;
}
} else {
} else { // not jumping
if (isonground(s) ) {
s->dropping = B_FALSE;
s->falling = B_FALSE;
@ -2451,9 +2581,7 @@ void dogravity(sprite_t *s) {
}
}
}
}
if (s->slamming) {
} else if (s->slamming) {
int netx;
double dist;
int hitwall = B_FALSE;
@ -2473,12 +2601,47 @@ void dogravity(sprite_t *s) {
int pointsinc = 250;
int psize = 6;
int gotsomething = B_FALSE;
int macex,macey;
s->slamming = 0;
/* reset fruit type counter */
curfruittype = 0;
// if we have a mace, add an explosion and play a thump sound
if (player->powerup == PW_MACE) {
// play sound
playfx(FX_MACE);
// find location of mace
for (s2 = sprite; s2 ; s2 = s2->next) {
if (s2->id == P_MACE) {
break;
}
}
if (!s2) {
// should never happen
macex = 0;
macey = 0;
} else {
int xx,yy;
macex = s2->x;
macey = s2->y - s2->img->h/2;
// add explosion
puffin(-1, macex, macey, "nothing", 0);
for (yy = 0; yy < MACEEXPY; yy++) {
for (xx = 0; xx < MACEEXPX; xx++) {
puffin(-1, macex+xx*TILEW, macey-yy*TILEH, "nothing", 0);
puffin(-1, macex-xx*TILEW, macey-yy*TILEH, "nothing", 0);
}
}
}
}
/* kill anything we've caught */
for (s2 = sprite; s2 ; s2 = s2->next) {
/* kill anything we have caught */
@ -2507,15 +2670,35 @@ void dogravity(sprite_t *s) {
}
}
// if we have a powerup, centre of net is the mace position
if (player->powerup == PW_MACE) {
xnet = macex;
ynet = macey;
}
// only check for hitting something if we already had a monster caught,
// or we have a mace
if (gotsomething || (player->powerup == PW_MACE)) {
/* kill anything we hit */
for (s2 = sprite; s2 ; s2 = s2->next) {
if ((s2->caughtby != s) && (!s2->dead) && (ismonster(s2->id))) {
int xthresh,ythresh;
xdiff = s2->x - xnet;
if (xdiff < 0) xdiff =-xdiff;
ydiff = (s2->y - s2->img->h/2) - ynet;
if (ydiff < 0) ydiff =-ydiff;
if ((xdiff <= s2->img->w) && (ydiff <= s2->img->h)) {
if (player->powerup == PW_MACE) {
xthresh = TILEW*MACEEXPX*2;
ythresh = TILEW*MACEEXPY*2;
} else {
xthresh = s2->img->w;
ythresh = s2->img->h;
}
if ((xdiff <= xthresh) && (ydiff <= ythresh)) {
if (s2->id != P_CLOUD) {
/* dies and becomes a powerup */
s2->willbecome = poweruptypes[curpoweruptype];
@ -2532,6 +2715,7 @@ void dogravity(sprite_t *s) {
}
}
}
if (gotsomething >= 1) {
playfx(FX_KILL);
}
@ -2563,8 +2747,8 @@ void dogravity(sprite_t *s) {
s->score += pointsinc;
}
}
}
} // end if slamangle > 180degrees
} // end if slamming
}
@ -2678,9 +2862,14 @@ 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_MACEPOWERUP) {
playfx(FX_POWERUP);
player->powerup = PW_MACE;
sprintf(tempm, "Mace Slam!");
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);
@ -2705,6 +2894,12 @@ int dofruiteffect(sprite_t *s) {
return B_TRUE;
} else if (s->id == P_FTOGEM) {
sprite_t *s2, *nexts;
int howmany;
int puffdelay;
int gemtype = P_GEMYELLOW;
int xx;
tiletype_t *tt;
// convert all flowers to gems
playfx(FX_MORPH);
sprintf(tempm, "Make gems!");
@ -2719,6 +2914,44 @@ int dofruiteffect(sprite_t *s) {
sprintf(s2->name, "made_gem");
}
}
// and also make a stream of gems underneath us
howmany = (STREAMWID+1)*3;
// RIGHT
puffdelay = 0;
for (xx = s->x+TILEW; xx < s->x + (TILEW*howmany); xx += TILEW) {
// if on a wall, exit
tt = gettileat(xx,s->y-TILEH,NULL,NULL);
if (tt->solid) {
break;
}
switch (puffdelay % 3) {
case 0: gemtype = P_GEMYELLOW; break;
case 1: gemtype = P_GEMRED; break;
case 2: gemtype = P_GEMPURPLE; break;
}
/* create a gem */
puffin(gemtype, xx, s->y, "gem", puffdelay);
puffdelay += 1;
}
// LEFT
puffdelay = 0;
for (xx = s->x+TILEW; xx > s->x - (TILEW*howmany); xx -= TILEW) {
// if on a wall, exit
tt = gettileat(xx,s->y-TILEH,NULL,NULL);
if (tt->solid) {
break;
}
switch (puffdelay % 3) {
case 0: gemtype = P_GEMYELLOW; break;
case 1: gemtype = P_GEMRED; break;
case 2: gemtype = P_GEMPURPLE; break;
}
/* create a gem */
puffin(gemtype, xx, s->y, "gem", puffdelay);
puffdelay += 1;
}
return B_TRUE;
} else if (s->id == P_BOMB) {
sprite_t *s2, *nexts;
@ -2781,9 +3014,6 @@ int dofruiteffect(sprite_t *s) {
}
/* create a flower */
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);
puffdelay += 1;
}
@ -2796,9 +3026,6 @@ int dofruiteffect(sprite_t *s) {
break;
}
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);
puffdelay += 1;
}
playfx(FX_BONUS);
@ -2822,7 +3049,8 @@ void usage(void) {
int canmove(sprite_t *pl) {
if (!pl->jumping && !pl->slamming ) {
if (!pl->netting) {
if (!isonladder(pl) || pl->falling || isonground(pl)) {
//if (!isonladder(pl) || pl->falling || isonground(pl)) {
if ( pl->climbing || pl->falling || isonground(pl)) {
return B_TRUE;
}
} else if (pl->netting && pl->falling) { // netting and falling
@ -2879,6 +3107,9 @@ int initsound(void) {
loadfx(FX_MORPH, "morph.wav");
loadfx(FX_BOOM, "boom.wav");
loadfx(FX_SPRING, "spring.wav");
loadfx(FX_TELEPORT, "teleport.wav");
loadfx(FX_SPLASH, "splash.wav");
loadfx(FX_MACE, "mace.wav");
// load sound effects
@ -2981,8 +3212,7 @@ SDL_Surface *grabbehind(sprite_t *s, SDL_Surface *surf) {
// returns a random powerup
int randompowerup(void) {
int num;
num = rand() % 8;
num = rand() % 9;
switch (num) {
case 0:
@ -3002,6 +3232,8 @@ int randompowerup(void) {
return P_BOMB;
case 7:
return P_SHIELD;
case 8:
return P_MACEPOWERUP;
}
}

1
rc.h
View File

@ -45,3 +45,4 @@ int randompowerup(void);
void dumpsprites(void);
void countmonsters(void);
int getpoints(int id);
int isladder(int tid);

View File

@ -48,6 +48,16 @@ int loadlevel(int wnum, int lnum) {
printf("Loading level %d-%d...",wnum,lnum);
sprintf(filename,"world%d/%s",wnum,levelentry[lnum].filename);
//filename = levelentry[lnum].filename;
//sprintf(filename, "world%d/level%d.dat",wnum,lnum);
f = fopen(filename,"rt");
if (!f) {
printf("can't open level file %s\n",filename);
return B_TRUE;
}
// remember exit direction for current level
// before loading the new one.
if (level) {
@ -62,10 +72,17 @@ int loadlevel(int wnum, int lnum) {
if (level->animtiles) free(level->animtiles);
level->id = 0;
sprintf(level->name, "Level %d-%d",wnum,lnum);
//sprintf(level->name, "Level %d-%d",wnum,lnum);
sprintf(level->name, "\"%s\"",levelentry[lnum].desc);
level->prev = NULL;
level->next = NULL;
/* load background image */
// TODO: read this from the level file rather than hardcoding
if (levelbg) SDL_FreeSurface(levelbg);
levelbg = IMG_Load("backgrounds/forest.png");
/* default */
level->hurryuptime = 30;
if (cheat) {
@ -77,12 +94,6 @@ int loadlevel(int wnum, int lnum) {
level->powerupy = -1;
sprintf(filename, "world%d/level%d.dat",wnum,lnum);
f = fopen(filename,"rt");
if (!f) {
printf("can't open level file\n");
return B_TRUE;
}
/* clear tiletype linked list */
@ -294,7 +305,7 @@ printf("got %d monsters\n", numenemies);
case D_RIGHT:
printf("RIGHT"); break;
case D_LEFT:
printf("LEFT"); break;
printf("lEFT"); break;
case D_UP:
printf("UP"); break;
case D_DOWN:
@ -649,6 +660,7 @@ printf("got %d monsters\n", numenemies);
}
gtime = 0;
nexthurryup = level->hurryuptime;
printf("Done.\n");
/*
@ -667,6 +679,7 @@ void setdefaults(sprite_t *s) {
s->speed = 1;
s->teleporting = 0;
s->climbing = 0;
s->powerup = 0;
s->jumping = 0;
s->jumpspeed = 0;
s->jumpdir = 1;
@ -1092,6 +1105,12 @@ int loadimagesets(void) {
loadspriteimage(P_SHIELD,F_WALK1, "sprites/shield.png");
imageset[P_SHIELD].numimages = 1;
loadspriteimage(P_MACEPOWERUP,F_WALK1, "sprites/macepowerup.png");
imageset[P_MACEPOWERUP].numimages = 1;
loadspriteimage(P_MACE,F_WALK1, "sprites/mace.png");
imageset[P_MACE].numimages = 1;
for (i = 0; i < PUFFFRAMES; i++) {
char name[SMALLBUFLEN];
sprintf(name, "sprites/puff%d.png",i);
@ -1214,6 +1233,8 @@ void drawsprite(sprite_t *s) {
}
} else if (s->id == P_GLOVE) {
frame = F_WALK1;
} else if (s->id == P_MACE) {
frame = F_WALK1;
}
} else if (s->dead) {
if (s == player) {
@ -1224,7 +1245,16 @@ void drawsprite(sprite_t *s) {
} else if (s->caughtby) {
frame = F_CAUGHT;
} else if (s->climbing) {
frame = F_CLIMB1 + ((timer/12) % 2);
//frame = F_CLIMB1 + ((timer/12) % 2);
if (s->moved) {
if ((timer/12) % 2 == 0) {
frame = F_CLIMB1;
} else {
frame = F_CLIMB2;
}
} else {
frame = F_CLIMB1;
}
} else if (s->netting) {
frame = F_SHOOT;
} else if (s->jumping) {
@ -1420,6 +1450,7 @@ int isfruit(int id) {
case P_HELP:
/* random powerups */
case P_BOXING:
case P_MACEPOWERUP:
case P_FTODIAMOND:
case P_FTOGEM:
case P_BOMB:
@ -1451,6 +1482,7 @@ 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;
if (id == P_MACE) return B_TRUE;
return B_FALSE;
}
@ -1669,11 +1701,12 @@ void drawtile(SDL_Surface *where, int x, int y) {
area.x = x * TILEW;
area.y = y * TILEH;
area.w = 0;
area.h = 0;
area.w = TILEW;
area.h = TILEH;
/* draw blank tile first */
tt = gettile(curlevel->bgtileid);
SDL_BlitSurface(tt->img[0], NULL, where, &area);
//SDL_BlitSurface(tt->img[0], NULL, where, &area);
SDL_BlitSurface(levelbg, &area, where, &area);
/* now draw real one */
offset = y*LEVELW+x;
@ -1709,6 +1742,7 @@ void initglobals(void) {
/* colours */
red.r = 255; red.g = 0; red.b = 0;
black.r = 0; black.g = 0; black.b = 0;
blue.r = 0; blue.g = 0; blue.b = 255;
white.r = 255; white.g = 255; white.b = 255;
green.r = 0; green.g = 255; green.b = 0;
yellow.r = 255; yellow.g = 255; yellow.b = 0;
@ -1853,3 +1887,41 @@ int getpoints(int id) {
return points;
}
int loadlevellist(void) {
int lev;
FILE *f;
char buf[BUFLEN];
char *p;
f = fopen("levels.dat","r");
// format is:
//
// dummy,filename,description,
lev = 1;
fgets(buf, BUFLEN, f);
while (!feof(f)) {
p = strtok(buf, ",");
p = strtok(NULL, ",");
if (!p) {
printf("invalid level filename - line %d\n",lev);
return B_TRUE;
}
levelentry[lev].filename = strdup(p);
p = strtok(NULL, ",");
if (!p) {
printf("invalid level description - line %d\n",lev);
return B_TRUE;
}
p[strlen(p)-1] = '\0'; // strip newline
levelentry[lev].desc = strdup(p);
lev++;
fgets(buf, BUFLEN, f);
}
fclose(f);
printf("Read %d levels.\n",lev);
return B_FALSE;
}

View File

@ -37,5 +37,6 @@ 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);
int getpoints(int id);
int loadlevellist(void);
#endif

BIN
sounds/mace.wav Normal file

Binary file not shown.

BIN
sounds/teleport.wav Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 976 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -33,9 +33,9 @@ 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,
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,18,19,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,0,0,0,0,0,0,0,0,0,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

@ -57,7 +57,7 @@ exitdir 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,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,1,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,1,4,4,4,4,4,4,27,27,27,27,27,27,4,
4,27,27,27,27,27,27,1,1,1,27,27,27,27,27,27,27,27,27,27,27,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,1,1,1,27,27,27,27,27,27,27,27,27,27,27,1,1,1,1,1,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,27,27,27,27,27,27,27,27,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,

View File

@ -26,7 +26,7 @@ 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,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,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,
@ -55,3 +55,4 @@ 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,4,
layer2

View File

@ -8,6 +8,7 @@ But don't fall on them!
endhelp
monsters
1 4 27
! 20 15
r 19 15
r 5 7
r 35 7
@ -31,12 +32,11 @@ 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,
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,
@ -49,7 +49,7 @@ exitdir -2
4,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,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,18,23,19,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,1,1,1,1,1,1,1,1,1,1,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,
@ -64,3 +64,4 @@ exitdir -2
4,0,0,0,0,0,0,0,0,0,6,11,11,5,0,0,0,0,0,0,0,0,0,0,0,0,6,11,11,5,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,4,
4,4,4,4,4,4,4,4,4,4,4,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,4,4,4,
layer2

View File

@ -6,7 +6,7 @@ help
Drop through bridges with Down+X
endhelp
monsters
1 4 27
! 20 8
r 10 4
r 11 12
r 33 12
@ -32,25 +32,25 @@ Y 6 24
P 8 4
@ 26 8
? 21 8
! 20 8
1 24 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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,
@ -65,3 +65,4 @@ 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,0,0,0,0,0,0,0,0,0,0,0,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,
layer2

View File

@ -46,7 +46,7 @@ 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,
4,0,0,0,0,0,0,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,18,19,0,0,0,0,0,4,
4,0,0,0,0,0,0,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,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,

View File

@ -49,7 +49,7 @@ 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,1,1,1,1,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,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,18,19,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,5,0,0,0,0,5,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,1,9,9,9,9,1,1,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

@ -29,19 +29,19 @@ 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,
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,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,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,18,23,23,19,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,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,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,
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,7 +5,6 @@ endmaps
help
endhelp
monsters
1 22 15
! 20 12
@ 11 5
@ 12 9
@ -47,11 +46,12 @@ r 10 12
r 29 12
r 6 15
r 31 15
1 20 12
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,
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,

View File

@ -7,19 +7,13 @@ endhelp
monsters
1 15 12
! 3 12
Y 10 12
@ 17 17
P 25 21
Y 13 12
Y 11 12
Y 12 12
@ 18 17
@ 15 17
@ 16 17
P 24 21
P 23 21
P 26 21
r 37 3
r 20 6
r 9 6
endmonsters
exitdir 1
17,17,17,17,17,17,0,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,1,1,1,4,
@ -28,29 +22,35 @@ 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,1,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,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,17,17,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,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,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,0,0,0,0,0,0,0,0,0,0,0,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,20,20,20,20,20,20,20,20,20,20,20,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,15,15,15,15,15,15,15,1,16,16,16,16,16,16,1,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,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,4,
4,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,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,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,0,11,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,0,0,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,4,
4,0,0,0,0,0,0,1,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,0,0,0,0,0,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,1,1,1,1,20,20,20,20,20,20,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,7,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,4,
4,15,15,15,15,15,15,15,1,16,16,16,16,16,16,1,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,0,7,0,0,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,4,
4,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
4,15,15,15,15,15,15,15,1,15,15,15,15,15,15,1,0,7,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,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,
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,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
layer2
19,6,1
22,6,1
13,7,8
17,7,8
13,13,8
17,13,8
11,24,11

View File

@ -1,67 +0,0 @@
tileset green
bg 0
hurryup 60
endmaps
help
endhelp
monsters
1 1 2
r 33 7
r 13 10
@ 6 28
@ 6 28
@ 6 28
@ 6 28
@ 2 28
@ 2 28
@ 2 28
@ 2 28
@ 2 28
@ 15 28
@ 15 28
@ 15 28
@ 15 28
@ 15 28
Y 35 5
Y 28 5
@ 20 2
Y 21 2
Y 18 2
Y 6 10
Y 10 10
r 11 18
C 9 28
S 30 5
S 30 5
S 30 5
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,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,2,1,1,1,1,3,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,3,0,0,0,0,0,0,2,4,4,4,4,4,4,3,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,3,0,0,0,0,2,4,4,4,4,4,4,4,4,3,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,3,0,0,2,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,0,0,0,1,16,16,16,4,
4,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,4,15,15,15,4,
4,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,16,16,16,16,16,1,1,1,4,15,15,15,4,
4,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,15,15,15,15,15,4,4,4,4,15,15,15,4,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,4,4,4,4,15,15,15,15,15,4,4,4,4,15,15,15,4,
4,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16,16,4,4,4,4,15,15,15,15,15,4,4,4,4,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,15,15,15,15,4,4,4,15,15,15,15,15,15,15,4,4,4,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,15,15,15,15,15,15,1,1,1,1,1,1,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,15,15,15,15,15,15,4,0,0,0,0,4,15,15,15,15,15,15,4,
4,4,4,7,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,15,15,15,15,15,15,4,0,0,0,0,4,15,15,15,15,15,15,4,
4,4,4,7,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,15,15,15,15,15,15,4,12,0,0,0,4,15,15,15,15,15,15,4,
4,4,4,8,1,1,1,1,1,1,1,1,1,1,1,4,4,4,4,4,4,15,15,15,15,15,15,4,13,0,0,0,4,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,15,15,15,15,15,4,1,16,16,16,4,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,
4,4,4,7,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,1,4,
4,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,1,15,15,15,15,15,15,15,15,15,15,15,15,15,1,4,4,
4,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,1,15,15,15,15,15,15,15,15,15,15,15,1,4,4,4,
4,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,1,15,15,15,15,15,15,15,15,15,1,4,4,4,4,
4,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,4,4,4,4,4,4,4,1,15,15,15,15,15,15,15,1,4,4,4,4,4,
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,1,1,4,4,4,4,4,4,