From bbe1aca3584579a30040752356142fe9e3d331a2 Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Wed, 17 Sep 2008 02:34:39 +0000 Subject: [PATCH] - Split code into multiple files - Removed unused code from edit.c / rc.c - Changed level format from ascii to comma seperated numbers - Began commentin of data structures / globals - Renamed some variables to be more meaningful - Replaced many hardcoded values with macros - Modified greentiles grass graphic - Added cloud graphic - Fixed score bug (score would jump super high) - Fixed what looks like a bug where snakes would only shoot one way - Fruits no longer turn red after a hurry-up --- Makefile | 13 +- defs.h | 278 ++++ edit.c | 2933 ++------------------------------------- edit.h | 24 + fixall.sh | 9 +- globals.h | 32 + newtiles/cloudleft.png | Bin 0 -> 632 bytes newtiles/cloudright.png | Bin 0 -> 733 bytes newtiles/full.png | Bin 0 -> 672 bytes newtiles/land.bmp | Bin 0 -> 822 bytes newtiles/land.png | Bin 0 -> 627 bytes newtiles/sky.png | Bin 0 -> 123 bytes oldtiles/full.bmp | Bin 0 -> 822 bytes rc | Bin 164440 -> 170624 bytes rc.c | 1313 +----------------- rc.h | 258 ---- shared.c | 1309 +++++++++++++++++ shared.h | 30 + work/cloud.png | Bin 0 -> 1414 bytes world1/ORIG.level7.dat | 46 +- world1/ORIG.level8.dat | 54 +- world1/ORIG.level9.dat | 56 +- world1/level1.dat | 73 +- world1/level2.dat | 66 +- world1/level3.dat | 21 +- world2/level15.dat | 41 +- world2/level7.dat | 25 +- world2/level8.dat | 29 +- world2/level9.dat | 26 +- 29 files changed, 2114 insertions(+), 4522 deletions(-) create mode 100644 defs.h create mode 100644 edit.h create mode 100644 globals.h create mode 100644 newtiles/cloudleft.png create mode 100644 newtiles/cloudright.png create mode 100644 newtiles/full.png create mode 100644 newtiles/land.bmp create mode 100644 newtiles/land.png create mode 100644 newtiles/sky.png create mode 100644 oldtiles/full.bmp create mode 100644 shared.c create mode 100644 shared.h create mode 100644 work/cloud.png diff --git a/Makefile b/Makefile index 909ef47..22365a3 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ -rc: rc.c rc.h - gcc -Wall -o rc -g rc.c `sdl-config --cflags --libs` -I/usr/local/include -L/usr/local/lib -lSDLmain -lSDL -lSDL_image -lSDL_gfx -lSDL_ttf - -edit: edit.c rc.h - gcc -Wall -o edit -g edit.c `sdl-config --cflags --libs` -I/usr/local/include -L/usr/local/lib -lSDLmain -lSDL -lSDL_image -lSDL_gfx -lSDL_ttf - all: rc edit + +rc: rc.c shared.c rc.h shared.h globals.h defs.h + gcc -Wall -o rc -g rc.c shared.c `sdl-config --cflags --libs` -I/usr/local/include -L/usr/local/lib -lSDLmain -lSDL -lSDL_image -lSDL_gfx -lSDL_ttf + +edit: edit.c shared.c edit.h shared.h globals.h defs.h + gcc -Wall -o edit -g edit.c shared.c `sdl-config --cflags --libs` -I/usr/local/include -L/usr/local/lib -lSDLmain -lSDL -lSDL_image -lSDL_gfx -lSDL_ttf + diff --git a/defs.h b/defs.h new file mode 100644 index 0000000..e12ebd0 --- /dev/null +++ b/defs.h @@ -0,0 +1,278 @@ +#ifndef __DEFS_H +#define __DEFS_H + +/* Macros */ +//#define OPENGL + + +// text sizes +#define TEXTSIZE_HELP 20 +#define TEXTSIZE_POINTS 10 +#define TEXTSIZE_HURRY 50 + +// text delays +#define TEXTSPEED 2 // how fast text zooms in + +// how long to keep various text on the screen +#define POINTSDELAY 40 +#define HURRYDELAY 50 +#define LEVELDELAY 40 +#define HELPDELAY 80 + + +// Sizes +#define TILEH 16 // tile width (in pixels) +#define TILEW 16 // tile height (in pixels) + +#define LEVELW 40 // level width (in tiles) +#define LEVELH 30 // level height (in tiles) + + + + +// Game mechanics +#define INVULNTIME 200 // how long player stays invulnerable for +#define FALLSPEED 4 // terminal velocity of falling sprites +#define NETSPEED 9 // how fast the player's net moves + + +// Limits +#define MAXMAPPINGS 50 +#define MAXMONSTERSPERLEVEL 20 +#define MAXLETTERHEIGHT 100 +#define MAXFRAMES 10 +#define MAXHELP 5 + +// Fixed text buffer sizes +#define BUFLEN 512 +#define MIDBUFLEN 64 +#define SMALLBUFLEN 32 + + +// Boolean values +#define B_TRUE -1 +#define B_FALSE 0 + +// Other +#define WANTFPS 75 // try to run at this many frames per sec + + +/* enums */ + +// Slope types +#define S_NOTSOLID 0 +#define S_SOLID 1 +#define S_SLOPE 2 + +// Sprite types +#define MAXPTYPES 15 +#define P_PLAYER 0 +#define P_RAT 1 +#define P_CHEESE 2 +#define P_SPEED 3 +#define P_NUMNETS 4 +#define P_BIGNET 5 +#define P_BEE 6 +#define P_SPIDER 7 +#define P_CLOUD 8 +#define P_ICECREAM 9 +#define P_CHIPS 10 +#define P_BURGER 11 +#define P_SNAKE 12 +#define P_SPIT 13 +#define P_HELP 14 + +// Frame names +#define F_WALK1 0 +#define F_JUMP 1 +#define F_FALL 2 +#define F_CAUGHT 3 +#define F_DEAD 4 +#define F_DEAD2 5 +#define F_DEAD3 6 +#define F_DEAD4 7 +#define F_CLIMB1 8 +#define F_CLIMB2 9 + +// Tile types +#define T_BLANK 0 +#define T_LAND 1 +#define T_SLOPEUP 2 +#define T_SLOPEDOWN 3 +#define T_FULL 4 +#define T_SKY 5 +#define T_LADDER 6 +#define T_LADDERTOP 7 +#define T_RIGHT 8 +#define T_LEFT 9 +#define T_SPIKES 10 +#define T_TELEPORT 11 +#define T_TELEPORT2 12 +#define T_TELEPORTDEST 13 +#define T_WATER 14 +#define T_WATERTOP 15 +#define T_WATERSPIKES 16 + +// death states +#define D_INITIAL (1) // Need to trigger death sequence +#define D_BOUNCING (2) // Corpse is bouncing around the screen +#define D_LASTBOUNCE (3) // Final descent, about to turn to fruit(or respawn for player) +#define D_FINAL (4) // ACTUALLY dead, remove the sprite + + +// teleporting states +#define TP_SHRINKING (1) // entering teleporter + +// caught by net states +#define C_NETTING (1) // being pulled in to player +#define C_NETTED (2) // being held by player + +// directions +#define D_RIGHT (1) +#define D_LEFT (-1) + + +/* data structures */ +typedef struct mapping_s { + char ch; + int tnum; +} mapping_t; + +typedef struct tiletype_s { + int uniqid; + int id; + char name[SMALLBUFLEN]; + int lowness[TILEW]; + int solid; + int water; + int spikes; + SDL_Surface *img; + struct tiletype_s *next; + struct tiletype_s *prev; +} tiletype_t; +tiletype_t *tiletype; + +typedef struct initialmonster_s { + int startx; + int starty; + int id; + char *help; +} initialmonster_t; + +typedef struct text_s { + int x,y; + int size; + int maxsize; + int state; + int delay; // how long to stay on screen + char txt[BUFLEN]; + SDL_Rect bgarea; + SDL_Surface *bg; + SDL_Surface *img; + SDL_Color *c; + struct text_s *next; + struct text_s *prev; +} text_t; + +typedef struct level_s { + int id; + int bgtileid; + char name[SMALLBUFLEN]; + int map[LEVELW*LEVELH]; + struct level_s *next; + struct level_s *prev; + int p1x; /* player 1 start pos */ + int p1y; + int nummonsters; + initialmonster_t initm[MAXMONSTERSPERLEVEL]; + int hurryuptime; +} level_t; +level_t *level; + +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 + + // ATTRIBUTES + double speed; // how fast this sprite moves + + + // CURRENT STATE + + // player only + int slamming; // are we slamming our net (player only) + double slamangle;// are what point around is our net? + int netting; // are we shooting our net out? + int climbing; // are we climbing a laddder + int invuln; // are we invulnerable (ie. just after player respawning) + int netcaught; // how many monsters are in our net? + int netmax; // how many monsters can our net hold? + int netspeed; // how fast does our net shoot out? + int netdir; // which way is our net going (left/right) + int netlen; // how far our is our net? + int netbig; // have we collected a BIG NET powerup? + 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 + + // 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 caughtstate; // are we caught by a net? being pulled in or caught? + int jumptimer; // delay before we will jump + int flies; // can we fly? + double xs,ys; // bounce direction after death + struct sprite_s *bullet; // pointer to our bullet + struct sprite_s *owner; // if we ARE a bullet, pointer to the sprite who made us + char name[MIDBUFLEN]; // Help text for help icons, otherwise not really used outside of debugging + + // player and monster + int falling; // are we falling? + int fallspeed; // how fast are we falling? + int jumping; // are we jumping? + int jumpdir; //which way are we jumping? (monsters only) + int jumpspeed; // how fast we are moving upwards + int teleporting;// are we inside a teleporter? >0 is entering, <0 is exitting + int dead; // is this sprite dead? if so, what dying state? + int bounces; // how many time have we bounced after dying + int doomcount; // sprites dies when this reaches zero + int moved; // did we move this loop cycle? + + + // GAME MECHANICS + double x,y; // current position + int dir; // which way we are facing (1=right,-1=left) + SDL_Surface *img; // current graphic image + SDL_Surface *netbg; // temp storage for area behind net + + // LINKED LIST STUFF + struct sprite_s *next; + struct sprite_s *prev; +} sprite_t; + +typedef struct imageset_s { + SDL_Surface *img[MAXFRAMES*4]; + int numimages; +} imageset_t; +imageset_t imageset[MAXPTYPES]; + +/* external globals */ +extern SDL_Color black; +extern SDL_Surface *screen, *temps; +extern sprite_t *sprite, *lastsprite, *player; +extern level_t *curlevel; +extern tiletype_t fakeblock; +extern int gtime; +extern int timer; +extern SDL_Color red; +extern SDL_Color black; +extern SDL_Color white; +extern SDL_Color green; +extern SDL_Color yellow; +extern int vidargs; +extern int toggletimer; +extern TTF_Font *font[]; + + +#endif diff --git a/edit.c b/edit.c index 0adc87b..7a53194 100644 --- a/edit.c +++ b/edit.c @@ -15,69 +15,20 @@ #include #include -#include "rc.h" +#include "defs.h" +#include "shared.h" +#include "edit.h" -FPSmanager manager; -SDL_Surface *temps; - -SDL_Surface *screen; -TTF_Font *font[MAXLETTERHEIGHT]; - -char tempm[BUFLEN]; - -tiletype_t fakeblock; +/* these hold the currently selected sprite/tile types */ tiletype_t *seltile = NULL; int selsprite = -1; -/* the order in which fruit will appear */ -int fruittypes[] = { - 2, - 9, - 10, - 11, - -1 -}; +int modified = B_FALSE; // has the current level been modified since last save? -/* the order in which powerups will appear */ -int poweruptypes[] = { - 3, - 4, - 5, - 4, - -1 -}; - -int curfruittype = 0; -int curpoweruptype = 0; - -int gtime = 0; -int fpsticks = 0; -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}; -SDL_Color white = {255, 255, 255, 0}; -SDL_Color green = {0, 255, 0, 0}; -SDL_Color yellow = {255, 255, 0, 0}; - -int vidargs = 0; - -int timer = 0; -int toggletimer = 0; int main (int argc, char **argv) { Uint8 *keys; @@ -109,6 +60,9 @@ int main (int argc, char **argv) { } } + /* initialise */ + initglobals(); + if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE)==-1) { printf("SDL_Init: %s\n", SDL_GetError()); exit(1); @@ -156,10 +110,11 @@ int main (int argc, char **argv) { return 1; } + modified = B_FALSE; seltile = tiletype; - drawlevel(); + draweditorlevel(); drawpalette(); drawsprites(); flip(); @@ -238,10 +193,12 @@ int main (int argc, char **argv) { /* place selected tile at mouse pos */ x = (mx / TILEW); y = (my / TILEH); - curlevel->map[y*LEVELW+x] = seltile->id; + curlevel->map[y*LEVELW+x] = seltile->uniqid; // redraw tile and sprites drawtile(screen,x,y); drawsprites(); + + modified = B_TRUE; } else if (selsprite >= 0) { int placed = B_FALSE; @@ -259,17 +216,29 @@ int main (int argc, char **argv) { s->x = x*TILEW+(TILEW/2); s->y = y*TILEH+TILEH; placed = B_TRUE; + modified = B_TRUE; // get rid of old sprite - drawlevel(); + draweditorlevel(); + } + } + } else { // is there a monster already there? + sprite_t *s; + for (s = sprite ; s ; s = s->next) { + if (s->id == selsprite) { + if ((s->x == x*TILEW+(TILEW/2)) && (s->y == y*TILEH+TILEH)) { + /* don't place it */ + placed = B_TRUE; + } } } } + if (!placed) { /* place selected sprite at mouse position (locked to a til) */ - addsprite(selsprite, x*TILEW+(TILEW/2),y*TILEH+TILEH,"something", B_TRUE); + modified = B_TRUE; } drawsprites(); @@ -280,9 +249,34 @@ int main (int argc, char **argv) { /* check for keys */ SDL_PumpEvents(); keys = SDL_GetKeyState(NULL); - if (keys[SDLK_q]) { - gtime = curlevel->hurryuptime -1; + + + + if (keys[SDLK_x]) { // delete monster + int donesomething = B_FALSE; + sprite_t *s, *nextone; + + for (s = sprite ; s ; s = nextone) { + nextone = s->next; + + /* if mouse is over this sprite */ + if ( (mx >= s->x - (s->img->w/2)) && + (mx <= s->x + (s->img->w/2)) && + (my >= s->y - s->img->h) && + (my <= s->y )) { + // kill it + killsprite(s); + donesomething = B_TRUE; + } + } + if (donesomething) { + draweditorlevel(); + drawsprites(); + modified = B_TRUE; + } } + + if (keys[SDLK_RETURN]) { if (toggletimer == 0) { SDL_WM_ToggleFullScreen(screen); @@ -293,6 +287,15 @@ int main (int argc, char **argv) { return 1; } + /* SAVE LEVEL */ + if (keys[SDLK_s]) { + if (modified) { + savelevel(curworld,curlevelnum); + modified = B_FALSE; + } + } + + flip(); if (++timer == 100) timer = 0; @@ -304,114 +307,6 @@ int main (int argc, char **argv) { } -void tick(void) { - sprite_t *s; - - SDL_framerateDelay(&manager); - - fpsticks = SDL_GetTicks(); - if (fpsstart == 0) { - fpsstart = fpsticks; - } else { - /* once per second */ - if (fpsticks - fpsstart >= 1000) { - gtime++; - /* */ - if (gtime == curlevel->hurryuptime) { - if (!levelcomplete) { - for (s = sprite; s; s = s->next) { - if (s != player) { - s->angry = B_TRUE; - } - } - addtext(320,240,TEXTSIZE_HURRY, "Hurry up!", &yellow,HURRYDELAY); - } - } - if (gtime == curlevel->hurryuptime + 10) { - if (!levelcomplete) { - addsprite(P_CLOUD, 320,240,"cloud", B_FALSE); - addtext(320,240,TEXTSIZE_HURRY, "Too slow!", &red,HURRYDELAY); - } - } - - /* 5 seconds after level completion */ - if (levelcomplete == 3) { - if (gtime - levelcompletetime >= 5) { - if (!player->dead) { - nextlevel(); - } - } - } - fpsstart = fpsticks; - } - } -} - -void nextlevel(void) { - /* go to next level */ - curlevelnum++; - loadlevel(curworld,curlevelnum); - drawlevel(); - levelcomplete = B_FALSE; - levelcompletetime = -1; -} - -void jump(sprite_t *s, int dir) { - if (s->jumping) return; - if (s->jumptimer) return; - - if (isonground(s)) { - if (ismonster(s->id)) { - s->jumpdir = dir; - if (s->jumpdir != 0) { - s->dir = s->jumpdir; - } - s->jumptimer = 60; - } else { - s->jumpdir = dir; - if (s->jumpdir != 0) { - s->dir = s->jumpdir; - } - s->jumping = 1; - s->jumpspeed = 5; - } - } -} - -void die(sprite_t *s) { - int mcount = 0; - sprite_t *s2; - /* clouds can't die like this */ - if (s->id == P_CLOUD) return; - - /* release anything we've caught */ - for (s2 = sprite->next ; s2 ; s2 = s2->next) { - if (s2->caughtby == s) { - s2->caughtby = NULL; - s2->angry = B_TRUE; - } - } - /* set death attribute */ - s->dead = 1; - s->netting = 0; - s->slamming = 0; - - /* any monsters left? */ - if (!levelcomplete) { - for (s2 = sprite->next ; s2 ; s2 = s2->next) { - if (ismonster(s2->id) && !s2->dead) { - if (s2->id != P_CLOUD) { - mcount++; - break; - } - } - } - - if (mcount == 0) { - levelcomplete = 1; - } - } -} void cleanup(void) { int i; @@ -422,728 +317,9 @@ void cleanup(void) { SDL_Quit(); } -void checkcollide(sprite_t *s) { - sprite_t *s2; - int collide; - int xdiff,ydiff; - - for (s2 = sprite ; s2 ; s2 = s2->next) { - collide = B_TRUE; - if (s2 == s) collide = B_FALSE; - else if (s->dead) collide = B_FALSE; - else if (s2->dead) collide = B_FALSE; - else if (s->caughtby) collide = B_FALSE; - else if (s2->caughtby) collide = B_FALSE; - - 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 ((xdiff <= s2->img->w/2) && (ydiff <= s2->img->h)) { - s2->caughtby = s; - s2->jumping = 0; - s2->falling = 0; - s2->caughtstate = 1; - s->netcaught++; - } - } - } - } else { - /* check for collision with us */ - xdiff = s->x - s2->x; - if (xdiff < 0) xdiff = -xdiff; - ydiff = (s->y-(s->img->h/2)) - (s2->y-(s2->img->h/2)); - if (ydiff < 0) ydiff = -ydiff; - - if ((xdiff <= s->img->w/2 + s2->img->w/2) && - (ydiff <= s->img->h/2 + s2->img->h/2)) { - /* COLLISION! */ - if (isfruit(s2->id)) { - if (s == player) { - int gotscore = s2->score; - /* kill the fruit */ - s2->dead = 4; - /* handle fruit effects */ - if (!dofruiteffect(s2)) { - sprintf(tempm, "%d", gotscore); - addtext(s2->x,s2->y - s2->img->h/2, 16, tempm, &white,POINTSDELAY); - } - /* give points to the player */ - s->score += gotscore; - } - } - if (ismonster(s2->id) || isbullet(s2->id)) { - if ((s == player) && (!s->invuln)) { - die(s); - } - } - } - } - } - } -} - -tiletype_t *gettile(int tid) { - tiletype_t *t; - - for (t = tiletype; t ; t = t->next) { - if (t->id == tid) return t; - } - - return &fakeblock; -} - -void movesprite(sprite_t *s) { - int rv; - tiletype_t *tt; - - /* timer */ - if (s->timer) { - s->timer--; - if (s->timer == 0) { - s->dead = 4; - } - } - - /* avoid edges of screen */ - if (s->y < s->img->h) { - if (!s->flies) { - s->y = s->img->h; - } - } - if (s->x > (640 - s->img->w/2)) { - s->x = 640 - s->img->w/2; - } - if (s->x < (s->img->w/2)) { - s->x = s->img->w/2; - } - - if (s->invuln) { - s->invuln--; - } - if (s->caughtby) { - if (s->caughtby->slamming) { - - /* */ - - s->x = s->caughtby->netxstart; - s->y = s->caughtby->netystart; - } else { - /* stay at position of net */ - s->y = s->caughtby->y; - if (s->caughtstate == 1) { - s->x = s->caughtby->x + (s->caughtby->netlen*s->caughtby->netdir); - } else { - s->x = s->caughtby->x + (s->caughtby->img->w/2) * -(s->caughtby->dir); - } - } - return; - } else if (s->dead == 1) { /* just set to dead */ - //s->xs = ((rand() % 7)) - 3; - s->xs = ((rand() % 14) / 2) - 3; - s->ys = ((rand() % 3) + 3) * -1; - s->dead = 2; - s->bounces = 0; - if (s == player) { - s->jumpspeed = 8; - s->jumping = 1; - } - return; - } else if (s->dead == 2) { /* dying */ - if (s == player) { - /* shoot up in the air, then fall */ - s->y -= s->jumpspeed; - - s->jumping++; - if (s->jumping % 5 == 0) { - s->jumpspeed--; - } - - /* if we've fallen off the bottom... */ - if (s->y >= 480) { - /* pause before respawning */ - s->jumpspeed = 0; /* this is now a timer */ - s->dead = 3; - } - } else { - /* bounch around the screen 3 times */ - s->x += s->xs; - s->y += s->ys; - 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->bounces >= 2) && (s->ys > 0)) { - s->dead = 3; - } - } - return; - } else if (s->dead == 3) { /* final fall */ - if (s == player) { - /* just delay... */ - s->jumpspeed++; - if (s->jumpspeed == 50) { - /* really die */ - s->dead = 4; - } - } else { /* bounce around, stop when we hit the ground */ - s->x += s->xs; - s->y += s->ys; - 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)) { - int x,y,ty; - s->dead = 4; - /* change into a fruit */ - x = s->x; - gettileat(s->x,s->y-1,NULL,&ty); - y = ty*TILEH + TILEH - 2; - - /* make sure it's within the screen */ - if (x > (640-TILEW)) x = 640-TILEW; - if (x < (TILEW)) x = TILEW; - - addsprite(s->willbecome, x, y, "Fruit", B_FALSE); - - } - } - } - return; - } else if (s->teleporting > 0) { - SDL_Surface *ts; - if (timer % 2 == 0) { - /* shrink */ - if (s->teleporting == 1) { - ts = rotozoomSurfaceXY(s->img,0, 0.9 , 0.9 ,0); - s->img = ts; - } else { - ts = rotozoomSurfaceXY(s->img,0, 0.9 , 0.9 ,0); - SDL_FreeSurface(s->img); - s->img = ts; - } - - if ((s->img->w <= 2) || (s->img->h <= 2)) { - /* go to tele dest */ - int x,y; - /* find destination */ - for (y = 0; y < LEVELH; y++) { - for (x = 0; x < LEVELW; x++) { - tt = gettile(curlevel->map[y*LEVELW+x]); - if (tt->id == T_TELEPORTDEST) { - /* teleport there */ - s->x = (x * TILEW) + (TILEW/2); - s->y = (y * TILEH) + TILEH-2; - } - } - } - s->teleporting = -1; - } else s->teleporting++; - } - } else if (s->teleporting < 0) { - double size; - if (timer % 2 == 0) { - /* grow */ - size = (double)-s->teleporting / 10; - - SDL_FreeSurface(s->img); - if (size >= 1) { - s->teleporting = 0; - s->img = imageset[s->id].img[F_WALK1]; - } else { - s->img = rotozoomSurfaceXY(imageset[s->id].img[F_WALK1],0,size,size,0); - s->teleporting--; - } - } - } else if (s->jumping) { - movex(s, s->jumpdir*getspeed(s)); - return; - } - - if (isonground(s)) { - if ((!s->falling) && (!s->jumping)) { - if (!s->climbing) { - adjustheight(s); - } - } - } - - /* sprite is about to jump */ - if (s->jumptimer) { - s->jumptimer--; - if (s->jumptimer == 0) { - s->jumping = 1; - s->jumpspeed = 5; - if (s->jumpdir != 0) s->dir = s->jumpdir; - return; - } else if (s->jumptimer % 20 == 0) { - s->dir = -s->dir; - } - } else if (s->id == P_RAT) { - if (!s->falling) { - int move = B_FALSE; - int xdiff, absxdiff; - - - /* distance to player */ - xdiff = player->x - s->x; - if (xdiff < 0) absxdiff = -xdiff; - else absxdiff = xdiff; - - tt = gettileat(s->x + s->dir+getspeed(s),s->y,NULL,NULL); - /* if there's a hole in front of us */ - if (tt->solid == S_NOTSOLID) { - if ((player->y > s->y) && (s->angry)) { - /* if player is below, fall off */ - if (xdiff <= (TILEW*8)) { - move = B_TRUE; - } - } else if (player->y == s->y) { - if (s->angry) { - /* if player is at same level and close, jump */ - if ((s->dir == 1) && (xdiff > 0) && (xdiff <= (TILEW*7))) { - jump(s,1); - } else if ((s->dir == -1) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { - jump(s,-1); - } - } - } - } else { - move = B_TRUE; - } - - /* either move or turn around */ - if (move) { - rv = movex(s, s->dir*getspeed(s)); - if (rv) { - /* if we couldn't move (hit a wall), turn */ - s->dir = -s->dir; - } - } else { - s->dir = -s->dir; - } - - if (s->angry) { - if ((player->dead == 0) && (!s->jumping) && (!s->jumptimer)) { - /* if player is above us, jump */ - if (player->y < s->y) { - if ((xdiff >= (TILEW*2)) && (xdiff <= (TILEW*3))) { - /* jump right */ - jump(s, 1); - } else if ((xdiff <= -(TILEW*2)) && (xdiff >= -(TILEW*3))) { - /* jump left */ - jump(s, -1); - } else if (s->y - player->y <= (TILEH*6)) { - if ((xdiff >= 0) && (xdiff < (TILEW*2))) { - /* jump up */ - jump(s, 0); - } else if ((xdiff <= 0) && (xdiff > -(TILEW*2))) { - /* jump up */ - jump(s, 0); - } - } else { - /* jump whichever way we're facing */ - /* - s->jumpdir = s->dir; - s->jumping = 1; - s->jumpspeed = 5; - */ - } - } - } - } - } - } else if (s->id == P_SNAKE) { - if (!s->falling) { - int move = B_FALSE; - int xdiff, absxdiff,ydiff; - - - /* distance to player */ - xdiff = player->x - s->x; - if (xdiff < 0) absxdiff = -xdiff; - else absxdiff = xdiff; - - tt = gettileat(s->x + s->dir+getspeed(s),s->y,NULL,NULL); - /* if there's a hole in front of us */ - if (tt->solid == S_NOTSOLID) { - if ((player->y > s->y) && (s->angry)) { - /* if player is below, fall off */ - if (xdiff <= (TILEW*8)) { - move = B_TRUE; - } - } else if (player->y == s->y) { - if (s->angry) { - /* if player is at same level and close, jump */ - if ((s->dir == 1) && (xdiff > 0) && (xdiff <= (TILEW*7))) { - jump(s,1); - } else if ((s->dir == -1) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { - jump(s,-1); - } - } - } - } else { - move = B_TRUE; - } - - /* shoot */ - ydiff = player->y - s->y; - if (ydiff < 0) ydiff =-ydiff; - - if (ydiff <= (TILEH*4)) { - sprite_t *ss; - int shoot = B_FALSE; - if (s->bullet == NULL) { - if ( (player->x < s->x) && (s->dir == -1) ) { - shoot = B_TRUE; - } else if ( (player->x < s->x) && (s->dir == -1) ) { - shoot = B_TRUE; - } - } - if (shoot) { - ss = addsprite(P_SPIT,s->x,s->y - s->img->h/2,"spit", B_FALSE); - ss->ys = 0; - ss->xs = s->dir * (getspeed(s)*2); - ss->dir = s->dir; - ss->owner = s; - - s->bullet = ss; - } - } - - /* either move or turn around */ - if (move) { - rv = movex(s, s->dir*getspeed(s)); - if (rv) { - /* if we couldn't move (hit a wall), turn */ - s->dir = -s->dir; - } - } else { - s->dir = -s->dir; - } - - - if (s->angry) { - if ((player->dead == 0) && (!s->jumping) && (!s->jumptimer)) { - /* if player is above us, jump */ - if (player->y < s->y) { - if ((xdiff >= (TILEW*2)) && (xdiff <= (TILEW*3))) { - /* jump right */ - jump(s, 1); - } else if ((xdiff <= -(TILEW*2)) && (xdiff >= -(TILEW*3))) { - /* jump left */ - jump(s, -1); - } else if (s->y - player->y <= (TILEH*6)) { - if ((xdiff >= 0) && (xdiff < (TILEW*2))) { - /* jump up */ - jump(s, 0); - } else if ((xdiff <= 0) && (xdiff > -(TILEW*2))) { - /* jump up */ - jump(s, 0); - } - } else { - /* jump whichever way we're facing */ - /* - s->jumpdir = s->dir; - s->jumping = 1; - s->jumpspeed = 5; - */ - } - } - } - } - } - - } else if (s->id == P_BEE) { - double absxs,absys; - if ((s->xs == -99) || (s->ys == -99)) { - s->xs = getspeed(s); - s->ys = getspeed(s); - } - - if (s->xs > 0) absxs = 1; - else absxs = -1; - - if (s->ys > 0) absys = 1; - else absys = -1; - - /* this will fix the speed if ANGRY is set */ - s->xs = absxs*getspeed(s); - s->ys = absys*getspeed(s); - - - /* can we move? */ - tt = gettileat(s->x + absxs*((s->img->w/2)+8), s->y-(s->img->h/2),NULL,NULL); - if ((tt->solid) || (tt->spikes )) { - /* turn */ - s->xs = -s->xs; - } - tt = gettileat(s->x, s->y-(s->img->h/2) + absys*((s->img->h/2)+8),NULL,NULL); - if ((tt->solid) || (tt->spikes)) { - /* turn */ - s->ys = -s->ys; - } - - /* move */ - s->x += s->xs; - s->y += s->ys; - s->dir = absxs; - s->moved = B_TRUE; - } else if (s->id == P_SPIDER) { - /* if on ground, go up */ - if (isonground(s) && !s->flies) { - s->flies = B_TRUE; - s->falling = B_FALSE; - s->ys = -getspeed(s); - } else if (s->falling) { - /* if we are about to hit spikes, go back up */ - tt = gettileat(s->x,s->y + 8,NULL,NULL); - if (tt->spikes) { - /* go back up */ - s->flies = B_TRUE; - s->falling = B_FALSE; - s->ys = -getspeed(s); - } - } else { - if (s->ys != -99) { - /* if roof above us */ - tt = gettileat(s->x,s->y - s->img->h,NULL,NULL); - if (tt->solid) { - int tiley; - /* start walking again */ - tiley = (int) (s->y / TILEH); - s->y = tiley*TILEH; - s->ys = -99; - s->flies = B_TRUE; - } else { - s->y += s->ys; - s->flies = B_TRUE; - } - } else { - int move = B_FALSE; - int xdiff; - /* walk back and forwards */ - - /* drop if player is close */ - xdiff = player->x - s->x; - if (xdiff < 0) xdiff =-xdiff; - if ((player->y > s->y) && (xdiff <= (TILEW*2))) { - s->flies = B_FALSE; - s->falling = B_TRUE; - s->fallspeed = 8; - } else { - - s->flies = B_TRUE; - - /* if there's a hole in front of us */ - tt = gettileat(s->x + s->dir*((s->img->w/2)+2),s->y - s->img->h - 2,NULL,NULL); - if (tt->solid == S_NOTSOLID) { - move = B_FALSE; - } else { - move = B_TRUE; - } - - /* either move or turn around */ - if (move) { - rv = movex(s, s->dir*getspeed(s)); - if (rv) { - /* if we couldn't move (hit a wall), turn */ - s->dir = -s->dir; - } - } else { - s->dir = -s->dir; - } - } - } - } - } else if (s->id == P_SPIT) { - if (movex(s, s->xs)) { - s->dead = 4; - } - } else if (s->id == P_CLOUD) { - if ((player->dead) || (levelcomplete)) { - if ((s->img->h <= 3) || (s->img->w <= 3)) { - s->dead = 4; - /* reset hurryup timer */ - gtime = 0; - } else { - SDL_Surface *ts; - /* get smaller */ - ts = rotozoomSurfaceXY(s->img,0, 0.9 , 0.9 ,0); - SDL_FreeSurface(s->img); - s->img = ts; - s->y--; - } - } else { - if ((s->xs == -99) || (s->ys == -99)) { - s->ys = 0.5; - s->xs = 1; - } - - s->x += s->xs; - s->y += s->ys; - - if (s->x >= (640 - s->img->w/2 - 5)) { - s->xs = -s->xs; - s->x = 640 - s->img->w/2 - 6; - } - if (s->x <= (s->img->w/2 + 5)) { - s->xs = -s->xs; - s->x = s->img->w/2 + 6; - } - if (s->y >= (480 - s->img->h/2 - 5)) { - s->ys = -s->ys; - s->y = 480 - s->img->h/2 - 6; - } - if (s->y <= (s->img->h/2 + 5)) { - s->ys = -s->ys; - s->y = s->img->h/2 + 6; - } - - - if (timer % 50 == 0) { - int w,h; - SDL_Surface *ts; - /* get bigger */ - w = s->img->w; - h = s->img->h; - ts = rotozoomSurfaceXY(s->img,0, 1.1 , 1.1 ,0); - SDL_FreeSurface(s->img); - s->img = ts; - - s->y += 2; - } - } - } - -} - -void dotileeffects(sprite_t *s) { - tiletype_t *tt; - int finished = B_FALSE; - int state = 0; - - if (s->jumping || s->dead || s->caughtby) { - return; - } - - /* check where we are */ - tt = gettileat(s->x,s->y-2,NULL,NULL); - if ((tt->id == T_TELEPORT) || (tt->id == T_TELEPORT2)) { - s->teleporting = 1; - } - - /* check under us */ - tt = gettileat(s->x,s->y+3,NULL,NULL); - while (!finished) { - if (tt->id == T_RIGHT) { - if (!ismonster(s->id)) { - movex(s, 1.5); - } - finished = B_TRUE; - } else if (tt->id == T_LEFT) { - if (!ismonster(s->id)) { - movex(s, -1.5); - } - finished = B_TRUE; - } else if (tt->spikes) { - if (!isfruit(s->id)) { - if (!s->invuln) { - if (s->id != P_CLOUD) { - die(s); - } - } - } - finished = B_TRUE; - } else { - if (state == 0) { - /* check tile to our right */ - tt = gettileat(s->x + s->img->w/2,s->y+3,NULL,NULL); - state = 1; - } else if (state == 1) { - /* check tile to our left */ - tt = gettileat(s->x - s->img->w/2,s->y+3,NULL,NULL); - state = 2; - } else { - finished = B_TRUE; - } - } - } -} - -void drawtile(SDL_Surface *where, int x, int y) { - SDL_Rect area; - tiletype_t *tt; - - if ((x < 0) || (y < 0) || (x >= LEVELW) || (y >= LEVELH)) { - return; - } - - area.x = x * TILEW; - area.y = y * TILEH; - area.w = 0; - area.h = 0; - /* draw blank tile first */ - tt = gettile(curlevel->bgtileid); - SDL_BlitSurface(tt->img, NULL, where, &area); - - tt = gettile(curlevel->map[y*LEVELW+x]); - if (tt->id != curlevel->bgtileid) { - SDL_BlitSurface(tt->img, NULL, where, &area); - } -} - -void drawlevel(void) { +void draweditorlevel(void) { int x,y; if (temps) { @@ -1166,1104 +342,8 @@ void drawlevel(void) { } -int loadlevel(int wnum, int lnum) { - FILE *f; - int x,y; - char buf[BUFLEN]; - char buf2[BUFLEN]; - char filename[BUFLEN]; - char *help[MAXHELP]; - int numhelp = 0; - int curhelp; - char *p; - int tileid; - int i; - mapping_t mapping[MAXMAPPINGS]; - int nmappings = 0; - tiletype_t *lasttile; - level = malloc(sizeof(level_t)); - - level->id = 0; - sprintf(level->name, "Level %d-%d",wnum,lnum); - level->prev = NULL; - level->next = NULL; - - /* default */ - level->hurryuptime = 30; - level->p1x = 0; - level->p1y = 0; - - 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 text */ - while (text) { - killtext(text); - } - - /* clear tiletype linked list */ - while (tiletype != NULL) { - tiletype_t *tt; - - /* kill first tile */ - if (tiletype->img) { - SDL_FreeSurface(tiletype->img); - tiletype->img = NULL; - tt = tiletype->next; - free(tiletype); - tiletype = tt; - } - } - - /* clear player linked list */ - if (sprite != NULL) { - while (sprite->next) { - killsprite(sprite->next); - } - } - - /* read tileset */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "tileset") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - - /* strip newline */ - p[strlen(p)-1] = '\0'; - - strcat(p, ".tiles"); - - if (loadtiletypes(p)) { - printf("Cannot load tileset file: %s\n", p); - return B_TRUE; - } - - } else { - printf("invalid tileset file in line: '%s'\n",buf); - return B_TRUE; - } - - /* read background tile */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "bg") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - level->bgtileid = atoi(p); - if (!gettile(level->bgtileid)) { - printf("invalid background tile id: %d\n",level->bgtileid); - return B_TRUE; - } - //printf("Background tile id is %d (%s)\n",level->bgtileid,(gettile(level->bgtileid)->name)); - } else { - printf("invalid background tile id line: '%s'\n",buf); - return B_TRUE; - } - - /* read hurryup time tile */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "hurryup") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - level->hurryuptime = atoi(p); - //printf("Hurryup time is %d\n",level->hurryuptime); - } else { - printf("invalid hurryup time line: '%s'\n",buf); - return B_TRUE; - } - - level->nummonsters = 0; - - /* read tile defs */ - nmappings = 0; - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endmaps")) { - strncpy(buf2,buf,BUFLEN); - p = strtok(buf2, ","); - if (p == NULL) { - printf("invalid char->tile mapping: '%s'\n",buf); - return B_TRUE; - } - mapping[nmappings].ch = p[0]; - p = strtok(NULL, ","); - if (p == NULL) { - printf("invalid char->tile mapping: '%s'\n",buf); - return B_TRUE; - } - mapping[nmappings].tnum = atoi(p); - printf("got mapping: '%c' to %d\n",mapping[nmappings].ch,mapping[nmappings].tnum); - nmappings++; - fgets(buf, BUFLEN, f); - } - - fgets(buf, BUFLEN, f); - /* read help messages if present */ - if (strstr(buf, "help")) { - curhelp = 0; // used later - numhelp = 0; - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endhelp")) { - // strip newline - buf[strlen(buf)-1] = '\0'; - help[numhelp] = strdup(buf); - numhelp++; - fgets(buf, BUFLEN, f); - } - - /* this reads the first line of the level */ - fgets(buf, BUFLEN, f); - } - /* read monster definitions if present */ - if (strstr(buf, "monsters")) { - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endmonsters")) { - char ch; - int monid; - int x,y; - // strip newline - buf[strlen(buf)-1] = '\0'; - - strncpy(buf2,buf,BUFLEN); - p = strtok(buf2, " "); - if (p == NULL) { - printf("invalid monster definition (missing type): '%s'\n",buf); - return B_TRUE; - } - ch = p[0]; // type of monster - monid = chartomonster(ch); - if (monid < 0) { - printf("invalid monster definition (invalid type): '%s'\n",buf); - return B_TRUE; - } - - p = strtok(NULL, " "); - if (p == NULL) { - printf("invalid monster definition (missing x): '%s'\n",buf); - return B_TRUE; - } - x = atoi(p); // monster x pos - - p = strtok(NULL, " "); - if (p == NULL) { - printf("invalid monster definition (missing y): '%s'\n",buf); - return B_TRUE; - } - y = atoi(p); // monster y pos - - - if (monid == P_PLAYER) { - level->p1x = x; - level->p1y = y; - } else { - /* place the monster */ - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = monid; - - if (monid == P_HELP) { - if (curhelp >= numhelp) { - printf("Error in level - more help icons than help texts.\n"); - exit(1); - } else { - level->initm[level->nummonsters].help = strdup(help[curhelp]); - curhelp++; - } - } - - level->nummonsters++; - } - - - fgets(buf, BUFLEN, f); - } - - /* this reads the first line of the level */ - fgets(buf, BUFLEN, f); - } - - x = 0; - y = 0; - while (!feof(f)) { - for (p = buf; *p; p++) { - int n,found = 0; - /* search mappings */ - for (n = 0; n < nmappings; n++) { - if (mapping[n].ch == *p) { - tileid = mapping[n].tnum; - found = B_TRUE; - break; - } - } - if (!found) { - - if (*p == '~') { - tileid = T_LAND; - } else if (*p == '=') { - tileid = T_LADDER; - } else if (*p == '-') { - tileid = T_LADDERTOP; - } else if (*p == '{') { - tileid = T_WATERTOP; - } else if (*p == '}') { - tileid = T_WATER; - } else if (*p == '>') { - tileid = T_RIGHT; - } else if (*p == '<') { - tileid = T_LEFT; - } else if (*p == '^') { - tileid = T_SPIKES; - } else if (*p == 'c') { - tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_CLOUD; - level->nummonsters++; - } else if (*p == 'r') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_RAT; - level->nummonsters++; - - } else if (*p == 'S') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_SNAKE; - level->nummonsters++; - } else if (*p == 'a') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_BEE; - level->nummonsters++; - } else if (*p == 's') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+TILEH; - level->initm[level->nummonsters].id = P_SPIDER; - level->nummonsters++; - } else if (*p == '?') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_HELP; - - if (curhelp >= numhelp) { - printf("Error in level - more help icons than help texts.\n"); - exit(1); - } else { - level->initm[level->nummonsters].help = strdup(help[curhelp]); - curhelp++; - } - - level->nummonsters++; - } else if (*p == '*') { - tileid = T_FULL; - } else if (*p == ';') { - tileid = T_TELEPORT; - } else if (*p == ':') { - tileid = T_TELEPORT2; - } else if (*p == '.') { - tileid = T_TELEPORTDEST; - } else if (*p == '/') { - tileid = T_SLOPEUP; - } else if (*p == '\\') { - tileid = T_SLOPEDOWN; - } else if (*p == '1') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - level->p1x = x; - level->p1y = y; - } else { - tileid = level->bgtileid; - } - } - if (!gettile(tileid)) { - printf("invalid tileid: %d\n",tileid); - fclose(f); - return B_TRUE; - } - if (x > LEVELW) { - printf("Too many tiles on line %d: %d,%d\n",y,x,y); - fclose(f); - return B_TRUE; - } - if (y >= LEVELH) { - printf("Too many lines at line %d: %d,%d\n",y,x,y); - fclose(f); - return B_TRUE; - } - level->map[y*LEVELW+x] = tileid; - - lasttile = gettile(tileid); - x++; - } - if (x < LEVELW+1) { - printf("Not enough tiles on line: y = %d\n",y); - fclose(f); - return B_TRUE; - } - y++; - x = 0; - fgets(buf, BUFLEN, f); - } - fclose(f); - - if ((numhelp > 0) && (curhelp != numhelp)) { - printf("WARNING: Unused help text. First unused is '%s'\n",help[curhelp]); - } - - if (y < LEVELH) { - printf("Incomplete level: y=%d, should be %d.\n", - y,LEVELH); - return B_TRUE; - } - - if ((level->p1x == 0) || (level->p1y == 0)) { - printf("Level is missing player 1 start position.\n"); - return B_TRUE; - } - - /* free help texts */ - for (i = 0; i < numhelp; i++) { - free(help[i]); - } - - /* set current level pointer */ - curlevel = level; - - /* add player */ - if (player == NULL) { - addsprite(P_PLAYER, (curlevel->p1x * TILEW) + (TILEW/2), - (curlevel->p1y * TILEH) + TILEH-2 , "Player" , B_TRUE); - } 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]; - if (level->initm[i].id == P_HELP) { - strncpy(name, level->initm[i].help, MIDBUFLEN); - } else { - strcpy(name, "Monster"); - } - addsprite(level->initm[i].id, - level->initm[i].startx, level->initm[i].starty, name, B_TRUE); - } - - gtime = 0; - - return B_FALSE; -} - -int loadtiletypes(char *filename) { - tiletype_t *t = NULL; - int i; - int state; - FILE *f; - char buf[BUFLEN]; - char *p,*pp; - - state = 0; - f = fopen(filename,"rt"); - if (!f) { - printf("can't open tiles file\n"); - return B_TRUE; - } - - fgets(buf, BUFLEN, f); - while (!feof(f)) { - if (state == 0) { - if (strstr(buf, "tile") == buf) { - if (t == NULL) { - tiletype = malloc(sizeof(tiletype_t)); - t = tiletype; - t->prev = NULL; - } else { - t->next = malloc(sizeof(tiletype_t)); - t->next->prev = t; - - t = t->next; - } - p = strtok(buf, " "); - p = strtok(NULL, " "); - /* strip newline */ - p[strlen(p)-1] = '\0'; - strcpy(t->name, p); - - /* defaults */ - t->id = 0; - t->water = B_FALSE; - t->spikes = B_FALSE; - t->solid = B_TRUE; - for (i = 0; i < TILEW; i++) { - t->lowness[i] = 0; - } - t->img = NULL; - t->next = NULL; - state = 1; - } - } else if (state == 1) { /* inside a definition */ - if (strstr(buf, "end") == buf) { - //printf("got tile %d: %s (solid=%d)\n",t->id,t->name,t->solid); - state = 0; - } else if (strstr(buf, "id") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->id = atoi(p); - } else if (strstr(buf, "lowness") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - pp = strtok(p, ","); - for (i = 0;i < TILEW; i++) { - t->lowness[i] = atoi(pp); - pp = strtok(NULL, ","); - } - } else if (strstr(buf, "solid") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->solid = atoi(p); - } else if (strstr(buf, "spikes") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->spikes = atoi(p); - } else if (strstr(buf, "water") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->water = atoi(p); - } else if (strstr(buf, "file") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - if (t->img) { - SDL_FreeSurface(t->img); - t->img = NULL; - } - /* strip newline */ - p[strlen(p)-1] = '\0'; - t->img = IMG_Load(p); - if (!t->img) { - printf("cannot load tile image file: '%s'\n",p); - fclose(f); - return B_TRUE; - } - SDL_SetColorKey(t->img, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - } - } - fgets(buf, BUFLEN, f); - } - - fclose(f); - return B_FALSE; - -} - -int loadimagesets(void) { - int p,i; - SDL_Surface *tempimg; - - SDL_Surface *reds; - - imageset[P_PLAYER].img[F_WALK1] = IMG_Load("pdwarf.png"); - imageset[P_PLAYER].img[F_JUMP] = IMG_Load("pdwarfjump.png"); - imageset[P_PLAYER].img[F_FALL] = IMG_Load("pdwarffall.png"); - imageset[P_PLAYER].img[F_CAUGHT] = IMG_Load("pdwarf.png"); - imageset[P_PLAYER].img[F_DEAD] = IMG_Load("dwarfdie.png"); - /* next 3 are auto generated */ - imageset[P_PLAYER].img[F_CLIMB1] = IMG_Load("dclimb1.png"); - imageset[P_PLAYER].img[F_CLIMB2] = IMG_Load("dclimb2.png"); - imageset[P_PLAYER].numimages = 10; - - imageset[P_SNAKE].img[F_WALK1] = IMG_Load("snake.bmp"); - imageset[P_SNAKE].img[F_JUMP] = IMG_Load("snakejump.bmp"); - imageset[P_SNAKE].img[F_FALL] = IMG_Load("snakejump.bmp"); - imageset[P_SNAKE].img[F_CAUGHT] = IMG_Load("snakecaught.bmp"); - imageset[P_SNAKE].img[F_DEAD] = IMG_Load("snakedead.bmp"); - /* next 3 are auto generated */ - imageset[P_SNAKE].numimages = 8; - - - imageset[P_RAT].img[F_WALK1] = IMG_Load("rat.bmp"); - imageset[P_RAT].img[F_JUMP] = IMG_Load("ratjump.bmp"); - imageset[P_RAT].img[F_FALL] = IMG_Load("ratjump.bmp"); - imageset[P_RAT].img[F_CAUGHT] = IMG_Load("ratcaught.bmp"); - imageset[P_RAT].img[F_DEAD] = IMG_Load("ratdead.bmp"); - /* next 3 are auto generated */ - imageset[P_RAT].numimages = 8; - - imageset[P_BEE].img[F_WALK1] = IMG_Load("bee.bmp"); - imageset[P_BEE].img[F_JUMP] = IMG_Load("beejump.bmp"); - imageset[P_BEE].img[F_FALL] = IMG_Load("beejump.bmp"); - imageset[P_BEE].img[F_CAUGHT] = IMG_Load("beecaught.bmp"); - imageset[P_BEE].img[F_DEAD] = IMG_Load("beedead.bmp"); - /* next 3 are auto generated */ - imageset[P_BEE].numimages = 8; - - imageset[P_SPIDER].img[F_WALK1] = IMG_Load("spider.bmp"); - imageset[P_SPIDER].img[F_JUMP] = IMG_Load("spiderjump.bmp"); - imageset[P_SPIDER].img[F_FALL] = IMG_Load("spiderfall.bmp"); - imageset[P_SPIDER].img[F_CAUGHT] = IMG_Load("spidercaught.bmp"); - imageset[P_SPIDER].img[F_DEAD] = IMG_Load("spiderdead.bmp"); - /* next 3 are auto generated */ - imageset[P_SPIDER].numimages = 8; - - imageset[P_CLOUD].img[F_WALK1] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_JUMP] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_FALL] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_CAUGHT] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_DEAD] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].numimages = 2; - - imageset[P_CHEESE].img[F_WALK1] = IMG_Load("cheese.bmp"); - imageset[P_CHEESE].numimages = 1; - - imageset[P_ICECREAM].img[F_WALK1] = IMG_Load("icecream.bmp"); - imageset[P_ICECREAM].numimages = 1; - - imageset[P_CHIPS].img[F_WALK1] = IMG_Load("chips.bmp"); - imageset[P_CHIPS].numimages = 1; - - imageset[P_BURGER].img[F_WALK1] = IMG_Load("burger.bmp"); - imageset[P_BURGER].numimages = 1; - - imageset[P_SPEED].img[F_WALK1] = IMG_Load("speed.bmp"); - imageset[P_SPEED].numimages = 1; - - imageset[P_NUMNETS].img[F_WALK1] = IMG_Load("numnets.bmp"); - imageset[P_NUMNETS].numimages = 1; - - imageset[P_BIGNET].img[F_WALK1] = IMG_Load("bignet.bmp"); - imageset[P_BIGNET].numimages = 1; - - imageset[P_HELP].img[F_WALK1] = IMG_Load("help.bmp"); - imageset[P_HELP].numimages = 1; - - /* bullets */ - imageset[P_SPIT].img[F_WALK1] = IMG_Load("spit.bmp"); - imageset[P_SPIT].numimages = 1; - - - - - /* generate rotated/flipped images */ - for (p = 0; p < MAXPTYPES; p++) { - if (!isfruit(p) && !isbullet(p)) { - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],90,1,0); - imageset[p].img[F_DEAD2] = SDL_DisplayFormat(tempimg); - - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],180,1,0); - imageset[p].img[F_DEAD3] = SDL_DisplayFormat(tempimg); - - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],270,1,0); - imageset[p].img[F_DEAD4] = SDL_DisplayFormat(tempimg); - } - - for (i = 0; i < imageset[p].numimages; i++) { - SDL_Surface *origi; - - SDL_SetColorKey(imageset[p].img[i], - SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - origi = imageset[p].img[i]; - - - /* flipped image */ - imageset[p].img[MAXFRAMES+i] = - rotozoomSurfaceXY(imageset[p].img[i], 0, -1,1,0); - SDL_SetColorKey(imageset[p].img[MAXFRAMES+i], - SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - - - /* angry image */ - reds = SDL_CreateRGBSurface(SDL_SWSURFACE, - origi->w, - origi->h, - origi->format->BitsPerPixel, origi->format->Rmask, - origi->format->Gmask,origi->format->Bmask, 0); - SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); - SDL_SetAlpha(reds, SDL_SRCALPHA,100); - - imageset[p].img[MAXFRAMES*2+i] = rotozoomSurfaceXY(origi, 0, 1,1,0); - - - SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*2+i], NULL); - SDL_FreeSurface(reds); - - temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*2+i]); - SDL_FreeSurface(imageset[p].img[MAXFRAMES*2+i]); - imageset[p].img[MAXFRAMES*2+i] = temps; - - SDL_SetColorKey(imageset[p].img[MAXFRAMES*2+i], - SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*2+i]->format, 101, 0, 0)); - - - /* flipped angry image */ - reds = SDL_CreateRGBSurface(SDL_SWSURFACE, - origi->w, - origi->h, - origi->format->BitsPerPixel, origi->format->Rmask, - origi->format->Gmask,origi->format->Bmask, 0); - SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); - SDL_SetAlpha(reds, SDL_SRCALPHA,100); - - imageset[p].img[MAXFRAMES*3+i] = rotozoomSurfaceXY(origi, 0, -1,1,0); - - - SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*3+i], NULL); - SDL_FreeSurface(reds); - - temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*3+i]); - SDL_FreeSurface(imageset[p].img[MAXFRAMES*3+i]); - imageset[p].img[MAXFRAMES*3+i] = temps; - - SDL_SetColorKey(imageset[p].img[MAXFRAMES*3+i], - SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*3+i]->format, 101, 0, 0)); - - } - } - - return B_FALSE; -} - -double getspeed(sprite_t *s ) { - int id = s->id; - double speed = 1; - - if (id == P_PLAYER) { - speed = s->speed; - } else if (id == P_RAT) { - if (s->angry) speed = 1.5; - else speed = 1; - } else if (id == P_SNAKE) { - if (s->angry) speed = 1.5; - else speed = 1; - } else if (id == P_BEE) { - if (s->angry) speed = 2; - else speed = 1; - } else if (id == P_SPIDER) { - if (s->angry) speed = 1.5; - else speed = 2; - } else if (id == P_CHEESE) { - speed = 0; - } - - if (isinwater(s)) speed /= 2; - - return speed; -} - - -int addtext(int x, int y, int size, char *string, SDL_Color *c, int delay) { - text_t *t; - - if (text == NULL) { - text = malloc(sizeof(text_t)); - t = text; - t->prev = NULL; - } else { - t = lasttext; - t->next = malloc(sizeof(text_t)); - t->next->prev = t; - - t = t->next; - } - - t->bg = SDL_CreateRGBSurface(SDL_SWSURFACE, - 300, 110, - screen->format->BitsPerPixel, screen->format->Rmask, - screen->format->Gmask,screen->format->Bmask, - screen->format->Amask); - - t->c = c; - t->x = x; - t->y = y; - t->maxsize = size; - t->size = 3; - strcpy(t->txt, string); - t->state = 0; - t->delay = delay; - - t->img = TTF_RenderText_Solid(font[t->size], t->txt, *t->c); - - - t->next = NULL; - lasttext = t; - - return B_FALSE; -} - - -void removeall(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; - for (t = text ; t ; t = nextt) { - nextt = t->next; - if (t->state == 0) { - t->size += TEXTSPEED; - if (t->size >= t->maxsize) { - t->state = 1; - } - } else if (t->state == t->delay) { - t->size -= TEXTSPEED; - if (t->size <= 3) { - killtext(t); - } - - } else { - t->state++; - } - } -} - -void drawscore(void) { - SDL_Surface *score; - SDL_Rect area; - - sprintf(tempm, "%d",player->score); - - /* shadow */ - score = TTF_RenderText_Solid(font[14], tempm, black); - area.x = 18; - area.y = 7; - area.w = 0; - area.h = 0; - SDL_BlitSurface(score, NULL, screen, &area); - SDL_FreeSurface(score); - /* score */ - score = TTF_RenderText_Solid(font[14], tempm, green); - area.x = 20; - area.y = 5; - area.w = 0; - area.h = 0; - SDL_BlitSurface(score, NULL, screen, &area); - SDL_FreeSurface(score); -} - -void drawtext(void) { - text_t *t; - SDL_Rect area; - - for (t = text ; t ; t = t->next) { - - /* create text */ - if (t->img) { - SDL_FreeSurface(t->img); - t->img = NULL; - } - t->img = TTF_RenderText_Solid(font[t->size], t->txt, *t->c); - - /* get bg */ - t->bgarea.x = t->x - t->img->w/2; - t->bgarea.y = t->y - t->img->h/2; - t->bgarea.w = t->img->w; - t->bgarea.h = t->img->h; - SDL_BlitSurface(screen, &t->bgarea, t->bg, NULL); - - /* draw text */ - area.x = t->x - t->img->w/2; - area.y = t->y - t->img->h/2; - area.w = t->img->w; - area.h = t->img->h; - SDL_BlitSurface(t->img,NULL, screen, &area); - } - - -} - -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; - } -} - -void setdefaults(sprite_t *s) { - s->speed = 1; - s->teleporting = 0; - s->climbing = 0; - s->jumping = 0; - s->jumpspeed = 0; - s->jumpdir = 1; - s->netting = 0; - s->netmax = 1; - s->netcaught = 0; - s->netbig = 0; - s->falling = 0; - s->fallspeed = 0; - s->dir = 1; - s->slamming = 0; - s->dead = 0; - s->angry = 0; - s->invuln = 0; - s->jumptimer = 0; - - s->bullet = NULL; - s->owner = NULL; - - s->willbecome = P_CHEESE; - - switch (s->id) { - case P_BEE: - case P_CLOUD: - s->flies = B_TRUE; - break; - default: - s->flies = B_FALSE; - break; - - } - - switch (s->id) { - case P_CHEESE: - s->score = 500; - break; - case P_ICECREAM: - s->score = 1000; - break; - case P_CHIPS: - s->score = 2000; - break; - case P_BURGER: - s->score = 4000; - break; - default: - break; - - } - - s->caughtby = NULL; - s->caughtstate = 0; - - s->xs = -99; - s->ys = -99; - - s->timer = 0; -} - -/* 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 *s; - - if (sprite == NULL) { - sprite = malloc(sizeof(sprite_t)); - s = sprite; - s->prev = NULL; - } else { - s = lastsprite; - s->next = malloc(sizeof(sprite_t)); - s->next->prev = s; - - s = s->next; - } - - - s->id = id; - s->x = x; - s->y = y; - if (s->id == P_CLOUD) { - s->img = rotozoomSurfaceXY(imageset[id].img[F_WALK1],0,1,1,0); - } else { - s->img = imageset[id].img[F_WALK1]; - } - if (s->y > (480 - TILEH-1)) { - s->y = 480 - TILEH-1; - } - strcpy(s->name, name); - - if (s == sprite) { - s->netbg = SDL_CreateRGBSurface(SDL_SWSURFACE, - 200, 64, - screen->format->BitsPerPixel, screen->format->Rmask, - screen->format->Gmask,screen->format->Bmask, - screen->format->Amask); - } else { - s->netbg = NULL; - } - - setdefaults(s); - - if (!initial) { - if (isfruit(s->id)) { - if (s->id != P_HELP) { // help icons don't time out - s->timer = 500; - } - } - } - - s->next = NULL; - - lastsprite = s; - - return s; -} - - - -tiletype_t *gettileat(int pixx,int pixy, int *tilex,int *tiley) { - int tx,ty; - tx = pixx / TILEW; - ty = pixy / TILEH; - if (tilex != NULL) { - *tilex = tx; - } - if (tiley != NULL) { - *tiley = ty; - } - - return gettile(curlevel->map[ty*LEVELW+tx]); -} - -void drawnetting(sprite_t *s) { - int sx; - SDL_Rect area; - - if (s->netting) { - int y,yy; - int dis; - int netsleft; - - sx = s->x; - s->nety = s->y - (s->img->h/2); - - s->netxstart = s->x; - s->netystart = s->nety - 3; - - if (s->netdir == 1) { - area.x = s->netxstart + TILEW/2; - } else { - area.x = s->netxstart - TILEW/2 - s->netlen; - } - //area.y = s->netystart; - area.y = s->y - s->img->h-2; - area.w = s->netlen; - area.h = s->img->h+2; - SDL_BlitSurface(screen, &area,s->netbg, NULL); - - netsleft = s->netmax - s->netcaught; - if (netsleft < 1) netsleft = 1; - dis = (int)s->img->h / (int)(netsleft+1) + 1; - - - for (y = dis; y < s->img->h; y += dis) { - yy = s->y - s->img->h; - yy += y; - drawline16(screen,sx,s->nety,s->x + s->netdir*s->netlen,yy,white); - } - - //drawline16(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety-3,white); - //drawline16(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety,white); - //drawline16(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety+3,white); - } else if (s->slamming) { - double dist; - int x,y; - dist = (s->slamangle * (180/M_PI))/2; - - s->netxstart = s->x + cos(s->slamangle-(180*(M_PI/180)))*dist*s->dir; - s->netystart = s->y + sin(s->slamangle-(180*(M_PI/180)))*dist; - - /* middle line */ - drawline16(screen,s->x,s->y - s->img->h/2, - s->netxstart,s->netystart,white); - /* left line */ - x = s->x + cos(s->slamangle-(5*(M_PI/180))-(180*(M_PI/180)))*dist*s->dir; - y = s->y + sin(s->slamangle-(5*(M_PI/180))-(180*(M_PI/180)))*dist; - drawline16(screen,s->x,s->y - s->img->h/2,x, y, white); - /* right line */ - x = s->x + cos(s->slamangle+(5*(M_PI/180))-(180*(M_PI/180)))*dist*s->dir; - y = s->y + sin(s->slamangle+(5*(M_PI/180))-(180*(M_PI/180)))*dist; - drawline16(screen,s->x,s->y - s->img->h/2,x, y, white); - } - -} - void drawsprites(void) { sprite_t *s; for (s = sprite; s != NULL; s = s->next) { @@ -2271,818 +351,40 @@ void drawsprites(void) { } } -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 (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->jumping) { - frame = F_JUMP; - } else if (s->falling) { - frame = F_FALL; - } 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 */ - if (s->dir == -1) { - frame += MAXFRAMES; - } - /* make red if required */ - if (s->angry) { - frame += (MAXFRAMES*2); - } - - if ((s->id != P_CLOUD) && (!s->teleporting)) { - s->img = imageset[s->id].img[frame]; - } - - - /* spider's climbing web */ - if ((s->id == P_SPIDER) && ((s->ys != -99) || s->falling) && (!s->dead) && (!s->caughtby)) { - tiletype_t *tt; - int x = s->x; - int y = s->y - s->img->h/2; - int tx=0,ty = 0; - int done = B_FALSE; - for (y = s->y ; !done ; y-= TILEH) { - tt = gettileat(x,y,&tx,&ty); - if ((tt == NULL) || (tt->solid)) { - done = B_TRUE; - } - } - drawline16(screen,s->x,s->y - (s->img->h/2),s->x,ty*TILEH+TILEH-1,white); - - } - - - area.x = s->x - (s->img->w/2); - area.y = s->y - (s->img->h); - area.w = 0; - area.h = 0; - - if (area.y < (480-s->img->h)) { - if (s->invuln) { - if (timer % 2 == 0) { - SDL_BlitSurface(s->img, NULL, screen, &area); - } - } else { - SDL_BlitSurface(s->img, NULL, screen, &area); - /* for opengl */ - //SDL_UpdateRect(screen, area.x, area.y, area.w, area.h); - } - } - - - /* caughtby lines */ - if ((s->caughtby) && (s->caughtstate == 2)){ - drawline16(screen, s->x,s->y - s->img->h, - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - drawline16(screen, s->x,s->y - (s->img->h/2), - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - drawline16(screen, s->x,s->y, - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - } - - -} - -void removenetting(sprite_t *s) { - SDL_Rect area,sarea; - - if (s->netting) { - sarea.x = 0; - sarea.y = 0; - sarea.w = s->netlen; - sarea.h = s->img->h+2; - - if (s->netdir == 1) { - area.x = s->netxstart + TILEW/2; - } else { - area.x = s->netxstart - TILEW/2 - s->netlen; - } - //area.y = s->netystart; - area.y = s->y - s->img->h-2; - area.w = s->netlen; - area.h = s->img->h+2; - - if (s->netbg != NULL) { - SDL_BlitSurface(s->netbg, &sarea, screen, &area); - } - } -} - - -void killsprite(sprite_t *s) { - sprite_t *nextone, *lastone; - sprite_t *s2; - - /* remove references to this sprite before removing it */ - for (s2 = sprite ; s2 ; s2 = s2->next) { - if (s2->owner == s) { - s2->owner = NULL; - } - if (s2->bullet == s) { - s2->bullet = NULL; - } - } - - nextone = s->next; - if (nextone != NULL) { - nextone->prev = s->prev; - } else { /*last sprite */ - lastsprite = s->prev; - } - - if (s->prev == NULL) { - /* first sprite */ - nextone = sprite->next; - free(sprite); - sprite = nextone; - } else { - lastone = s->prev; - free (lastone->next ); - lastone->next = nextone; - } - - - -} - -void removesprite(sprite_t *s) { - int startx,starty,endx,endy; - int x,y; - - - /* find topleft-most tile */ - gettileat(s->x - s->img->w, s->y - s->img->h,&startx,&starty); - /* find bottomright-most tile */ - gettileat(s->x + s->img->w, s->y + s->img->h,&endx,&endy); - - if (s->slamming) { - if (s->dir == -1) { - startx -= 5; - endx += 1; - } else { - startx -= 1; - endx += 5; - } - starty -= 2; - endy += 1; - } - - /* draw the tiles */ - for (y = starty; y <= endy; y++) { - for (x = startx; x <= endx; x++) { - drawtile(screen,x,y); - } - } -} - - -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)) { - return B_TRUE; - } - - return B_FALSE; -} - -int isladderabove(sprite_t *s) { - tiletype_t *tthere; - tthere = gettileat(s->x,s->y-TILEH, NULL,NULL); - if (tthere->id == T_LADDER) { - return B_TRUE; - } - - return B_FALSE; -} - -int isinwater(sprite_t *s) { - tiletype_t *tt; - tt = gettileat(s->x, s->y - s->img->h/2, NULL, NULL); - if (tt->water) { - return B_TRUE; - } - - return B_FALSE; -} - -int isroofabove(sprite_t *s) { - tiletype_t *tt; - - /* get tile above sprite's head */ - tt = gettileat(s->x, s->y - s->img->h,NULL,NULL); - if (tt->solid) return B_TRUE; - tt = gettileat(s->x + s->img->w/2, s->y - s->img->h,NULL,NULL); - if (tt->solid) return B_TRUE; - tt = gettileat(s->x - s->img->w/2, s->y - s->img->h,NULL,NULL); - if (tt->solid) return B_TRUE; - - return B_FALSE; -} -/* is there a roof n tiles above us. If howfar is 1, this is the same - as the regular isroofabove() */ -int isroofnabove(sprite_t *s, int howfar) { - tiletype_t *tt; - int ypos; - - ypos = s->y - s->img->h - TILEH*(howfar-1); - - /* get tile above sprite's head */ - tt = gettileat(s->x, ypos,NULL,NULL); - if (tt->solid) return B_TRUE; - tt = gettileat(s->x + s->img->w/2, ypos,NULL,NULL); - if (tt->solid) return B_TRUE; - tt = gettileat(s->x - s->img->w/2, ypos,NULL,NULL); - if (tt->solid) return B_TRUE; - - return B_FALSE; -} - -int isonground(sprite_t *s) { - /* get tile below sprite's feet */ - if (isongroundpoint(s, s->x, s->y)) { - return B_TRUE; - } - if (!s->falling) { - if (isongroundpoint(s, s->x + s->img->w/2, s->y)) { - return B_TRUE; - } - if (isongroundpoint(s, s->x - s->img->w/2, s->y)) { - return B_TRUE; - } - } - - return B_FALSE; -} - -int isongroundpoint(sprite_t *s, int x,int y) { - tiletype_t *tt; - int tilex,tiley; - int xoff; - int groundy; - - tt = gettileat(x,y, &tilex, &tiley); - /* get offset */ - xoff = x - (tilex*TILEW); - - /* if it's not solid... */ - if (tt->solid == 0) { - return B_FALSE; - } else { - /* check height of tile at that position */ - groundy = tiley*TILEH + tt->lowness[xoff]; - - /* above ground level */ - if (y < groundy) { - return B_FALSE; - } else if (y > groundy + 3) { - /* below ground level */ - if (s->jumping) { - return B_FALSE; - } - } else if (s->falling) { - tiletype_t *abovetile; - /* falling, on a tile, but with tiles above you */ - abovetile = gettileat(x,y-TILEH, NULL, NULL); - if (abovetile->solid) { - return B_FALSE; - } - } - - } - - return B_TRUE; -} - -void dogravity(sprite_t *s) { - sprite_t *s2; - - if (s->dead) return; - if (s->flies) return; - - if (isbullet(s->id)) return; - - if (isonladder(s) && !s->falling && !s->jumping) { - s->falling = B_FALSE; - return; - } - - // handle jumps - if (s->jumping) { - s->falling = B_FALSE; - s->y -= s->jumpspeed; - s->jumping++; - if (s->jumping % 5 == 0) { - if (s->jumpspeed > 0) s->jumpspeed--; - else { - s->jumping = 0; - s->falling = B_TRUE; - s->fallspeed = 0; - } - } - - /* have we hit a roof ? */ - /* can jump through one tile, but not two or more */ - if (isroofabove(s) && isroofnabove(s,2)) { - /* stop jumping */ - s->jumping = 0; - s->falling = B_TRUE; - s->fallspeed = 0; - } - - } else { - if (isonground(s)) { - s->falling = B_FALSE; - s->climbing = B_FALSE; - } else { - if (s->falling == B_FALSE) { - s->fallspeed = 1; - } - s->falling = B_TRUE; - if (isinwater(s)) { - s->y += (s->fallspeed/2); - } else { - s->y += s->fallspeed; - } - if ((timer % 10 == 0) && (s->fallspeed < FALLSPEED)) { - s->fallspeed++; - } - } - } - - if (s->netting) { - s->netlen += s->netspeed; - s->netting++; - if (s->netting % 2 == 0) { - if (s->netspeed > -NETSPEED) s->netspeed--; - else { - s->netting = 0; - for (s2 = sprite ; s2 ; s2 = s2->next) { - if ((s2->caughtby == s) && (s2->caughtstate == 1)) { - s2->caughtstate = 2; - } - } - } - } - } - - if (s->slamming) { - s->slamangle += (10 * (M_PI/180)); - if (s->slamangle >= (180 * (M_PI/180))) { - int xdiff,ydiff,xnet = 0,ynet = 0; - int pointsinc = 250; - int psize = 6; - - s->slamming = 0; - - /* reset fruit type counter */ - curfruittype = 0; - - /* kill anything we've caught */ - for (s2 = sprite; s2 ; s2 = s2->next) { - /* kill anything we have caught */ - if (s2->caughtby == s) { - tiletype_t *tt; - tt = gettileat(s2->x,s2->y+2,NULL,NULL); - /* if on ground, monster dies */ - if ((tt == NULL) || (tt->solid)) { - /* becomes a fruit */ - s2->willbecome = fruittypes[curfruittype]; - /* increment fruit type */ - if (fruittypes[++curfruittype] == -1) { - curfruittype = 0; - } - die(s2); - pointsinc *= 2; - psize += 10; - xnet = s2->x; - ynet = s2->y - s2->img->h/2; - } else { - /* otherwise it gets angry */ - s2->angry = B_TRUE; - } - } - } - - /* kill anything we hit */ - for (s2 = sprite; s2 ; s2 = s2->next) { - if ((s2->caughtby != s) && (!s2->dead) && (ismonster(s2->id))) { - 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 (s2->id != P_CLOUD) { - /* becomes a powerup */ - s2->willbecome = poweruptypes[curpoweruptype]; - if (poweruptypes[++curpoweruptype] == -1) { - curpoweruptype = 0; - } - die(s2); - pointsinc *= 2; - psize += 10; - } - } - - } - } - - /* release anything we've caught */ - for (s2 = sprite; s2 ; s2 = s2->next) { - if (s2->caughtby == s) { - /* release it */ - s2->caughtby = NULL; - } - } - - s->netcaught = 0; - - /* show points */ - if (psize >= MAXLETTERHEIGHT) { - psize = MAXLETTERHEIGHT-1; - } - if (pointsinc > 250) { - sprintf(tempm, "%d",pointsinc); - addtext(xnet,ynet-TILEH, psize, tempm, &white,POINTSDELAY); - /* give points to player */ - s->score += pointsinc; - } - - } - } -} - - -void flip(void) { - #ifdef OPENGL - SDL_GL_SwapBuffers(); - SDL_UpdateRect(screen,0,0,screen->w,screen->h); - #else - SDL_Flip(screen); - #endif -} - -int movex(sprite_t *s,double amt) { - double newx,newy; - double curx,cury; - int tilex,tiley; - tiletype_t *tt,*tt2; - int newxoff,newgroundy; - int newtilex,newtiley; - - double amtdir; - - tt = gettileat(s->x, s->y, &tilex,&tiley); - - - if (amt > 0) amtdir = 1; - else (amtdir = -1); - - - curx = s->x; - cury = s->y; - - /* check for blockage in front of us */ - //newx = s->x + (amtdir*(s->img->w/2)); - newx = s->x + (amtdir*TILEW/2); - newy = cury-TILEH; - tt2 = gettileat(newx,newy,&newtilex,&newtiley); - if (tt2->solid == S_SOLID) { - return B_TRUE; - } - - /* get new position */ - newx = curx + amt; - newy = cury-2; - tt2 = gettileat(newx,newy,&newtilex,&newtiley); - newxoff = newx - (newtilex*TILEW); - newgroundy = newtiley*TILEH + tt2->lowness[newxoff]; - - /* new block is at least partially solid */ - if (tt2->solid == S_SOLID) { - return B_TRUE; - } else if (tt2->solid == S_SLOPE) { - /* we can move, but need to adjust our height */ - s->x += amt; - } else { - /* new block is empty */ - s->x += amt; - } - - s->moved = B_TRUE; - return B_FALSE; -} - -void adjustheight(sprite_t *s) { - tiletype_t *tt; - int xoff,groundy; - int tilex,tiley; - - if (s->flies) { - return; - } - - tt = gettileat(s->x,s->y-1,&tilex,&tiley); - if (!tt) return; - if (tt->solid == S_SLOPE) { - xoff = s->x - (tilex*TILEW); - groundy = tiley*TILEH + tt->lowness[xoff]; - s->y = groundy; - } else if (tt->solid == S_SOLID) { - while (tt->solid == S_SOLID) { - s->y--; - tt = gettileat(s->x,s->y-1,&tilex,&tiley); - } - } -} - -int dofruiteffect(sprite_t *s) { - if (s->id == P_SPEED) { - player->speed = 2; - addtext(s->x,s->y - s->img->h/2, TEXTSIZE_POINTS, "Speed up!", &white,POINTSDELAY); - return B_TRUE; - } else if (s->id == P_NUMNETS) { - if (player->netmax < 4) { - player->netmax++; - } - sprintf(tempm, "%d nets!",player->netmax); - addtext(s->x,s->y - s->img->h/2, TEXTSIZE_POINTS, tempm,&white,POINTSDELAY); - return B_TRUE; - } else if (s->id == P_BIGNET) { - player->netbig = B_TRUE; - 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_HELP) { - addtext(320,240,TEXTSIZE_HELP, s->name, &white,HELPDELAY); - return B_TRUE; - } - - return B_FALSE; -} - -int isfruit(int id) { +/* +char tiletochar(int id) { switch (id) { - case P_CHEESE: - case P_ICECREAM: - case P_CHIPS: - case P_BURGER: - case P_SPEED: - case P_NUMNETS: - case P_BIGNET: - case P_HELP: - return B_TRUE; - - } + case T_BLANK: return '0'; + case T_LAND: return '~'; + case T_SLOPEUP: return '/'; + case T_SLOPEDOWN: return '\\'; + case T_FULL: return '*'; + case T_SKY: return '0'; + case T_LADDER: return '='; + case T_LADDERTOP: return '-'; + case T_RIGHT: return '>'; + case T_LEFT: return '<'; + case T_SPIKES: return '^'; + case T_TELEPORT: return ';'; + case T_TELEPORT2: return ':'; + case T_TELEPORTDEST: return '.'; + case T_WATER: return '}'; + case T_WATERTOP: return '{'; + case T_WATERSPIKES: return '|'; + } - return B_FALSE; -} - -int isbullet(int id) { - if (id == P_SPIT) return B_TRUE; - - return B_FALSE; -} - -int ismonster(int id) { - if (id == P_RAT) return B_TRUE; - if (id == P_BEE) return B_TRUE; - if (id == P_SPIDER) return B_TRUE; - if (id == P_SNAKE) return B_TRUE; - if (id == P_CLOUD) return B_TRUE; - - return B_FALSE; -} - -/* -inline void drawpixel32(SDL_Surface *screen, int x, int y, SDL_Color c) -{ - Uint32 *bufp; - - // check x/y - if (x >= screen->w) return; - if (y >= screen->h) return; - if (x < 0) return; - if (y < 0) return; - - bufp = (Uint32 *)screen->pixels + (y*screen->pitch / 2) + x; - *bufp = SDL_MapRGB(screen->format, c.r, c.g, c.b); + return '0'; } */ -inline void drawpixel16(SDL_Surface *screen, int x, int y, SDL_Color c) -{ - Uint16 *bufp; - - /* check x/y */ - if (x >= screen->w) return; - if (y >= screen->h) return; - if (x < 0) return; - if (y < 0) return; - - bufp = (Uint16 *)screen->pixels + (y*screen->pitch / 2) + x; - *bufp = SDL_MapRGB(screen->format, c.r, c.g, c.b); -} - - -void drawline16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c) { - int deltax, deltay; - int numpixels; - int d; - int dinc1,dinc2,xinc1,xinc2,yinc1,yinc2; - int i; - int x; - int y; - int maskcount = 0; - int maskindex = 0; - - - - deltax = (x2 - x1); - if (deltax < 0) deltax = -deltax; - deltay = (y2 - y1); - if (deltay < 0) deltay = -deltay; - - if (deltax >= deltay) { - numpixels = deltax + 1; - d = (deltay*2) - deltax; - dinc1 = deltay << 1; - dinc2 = (deltay-deltax) << 1; - xinc1 = 1; - xinc2 = 1; - yinc1 = 0; - yinc2 = 1; - } else { - numpixels = deltay + 1; - d = (deltax*2) - deltay; - dinc1 = deltax << 1; - dinc2 = (deltax - deltay) << 1; - xinc1 = 0; - xinc2 = 1; - yinc1 = 1; - yinc2 = 1; - } - - if (x1 > x2) { - xinc1 = - xinc1; - xinc2 = - xinc2; - } - if (y1 > y2) { - yinc1 = - yinc1; - yinc2 = - yinc2; - } - - x = x1; y = y1; - - maskcount = 0; - maskindex = 0; - for (i = 0; i < numpixels; i++) { - - drawpixel16(screen,x,y,c); - - - - if (d < 0) { - d += dinc1; - x += xinc1; - y += yinc1; - } else { - d += dinc2; - x += xinc2; - y += yinc2; - } - } -} - - -void drawbox16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color *c, SDL_Color *fc) { - if (fc != NULL) { - /* fill */ - if (((x2 - x1) >= 2) && ((y2 - y1) >= 2)) { - int y; - for (y = (y1+1) ; y <= (y2-1); y++) { - drawline16(screen, x1+1, y, x2-1,y,*fc); - } - } - } - drawline16(screen,x1,y1,x2,y1,*c); - drawline16(screen,x1,y1,x1,y2,*c); - drawline16(screen,x1,y2,x2,y2,*c); - drawline16(screen,x2,y1,x2,y2,*c); -} - - - -int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col) { - Uint32 pixel; - int bpp = dest->format->BytesPerPixel; - char *ppos; - unsigned char r,g,b,a; - - - ppos = (char *) dest->pixels; - - /* offset y */ - ppos += (dest->pitch * y); - /* offset x */ - ppos += (bpp * x); - - memcpy(&pixel, ppos, bpp); - - - if (dest->format->BitsPerPixel == 32) { - SDL_GetRGBA(pixel, dest->format, &r,&g,&b, &a); - col->r = r; - col->g = g; - col->b = b; - col->unused = a; - } else if (dest->format->BitsPerPixel == 16) { - SDL_GetRGB(pixel, dest->format, &r,&g,&b); - col->r = r; - col->g = g; - col->b = b; - } else if (dest->format->BitsPerPixel == 8) { - *col = dest->format->palette->colors[(Uint8)pixel]; - } - - - return 0; - -/* - bpp = dest->format->BytesPerPixel; - - if (bpp != 2) { - printf("bpp isnt 2!!!\n"); - fflush(stdout); - } - - //pixel = (Uint32 *) (dest->pixels + (y * dest->w) + x) ; - pixel = (Uint32 *) (dest->pixels + y * dest->pitch + x * bpp); - - - - SDL_GetRGB(*pixel,dest->format, - &col->r, - &col->g, - &col->b ); - - return 0; -*/ - - - -} - -int chartomonster(char ch) { - switch (ch) { - case 'c': return P_CLOUD; - case 'r': return P_RAT; - case 'S': return P_SNAKE; - case 'a': return P_BEE; - case 's': return P_SPIDER; - case '?': return P_HELP; - case '1': return P_PLAYER; - } - - return -1; -} void usage(void) { - printf("usage: rc [-fs] [-l xx]\n"); + printf("usage: edit [-fs] [-l xx]\n"); printf(" -fs Start in full-screen mode.\n"); - printf(" -l xx Skip to level xx.\n"); + printf(" -l xx Edit level xx.\n"); printf("\n"); } @@ -3156,3 +458,64 @@ void drawpalette(void) { } SDL_UpdateRect(screen, SPALX,SPALY,SPALW,SPALH); } + + +int savelevel(int wnum, int lnum) { + FILE *f; + int x,y; + char filename[BUFLEN]; + + sprite_t *s; + + + sprintf(filename, "world%d/level%d.dat",wnum,lnum); + f = fopen(filename,"wt"); + if (!f) { + printf("can't open level file\n"); + return B_TRUE; + } + + /* TODO: don't hardcode */ + fprintf(f, "tileset green\n"); + fprintf(f, "bg %d\n",level->bgtileid); + fprintf(f, "hurryup %d\n",level->hurryuptime); + + /* no mappings */ + fprintf(f, "endmaps\n"); + + /* help text */ + fprintf(f, "help\n"); + for (s = sprite; s ; s = s->next) { + if (s->id == P_HELP) { + fprintf(f,"%s\n",s->name); + } + } + fprintf(f, "endhelp\n"); + + /* monster defs */ + fprintf(f, "monsters\n"); + for (s = sprite; s ; s = s->next) { + int mx,my; + char mid; + mid = monstertochar(s->id); + mx = (s->x - (TILEW/2)) / TILEW; + my = (s->y - TILEH/2) / TILEH; + fprintf(f,"%c %d %d\n",mid,mx,my); + } + fprintf(f, "endmonsters\n"); + + /* level data */ + for (y = 0; y < LEVELH; y++) { + for (x = 0; x < LEVELW; x++) { + fprintf(f, "%d,",level->map[y*LEVELW+x]); + } + fprintf(f, "\n"); + } + + fclose(f); + + printf("Level saved to '%s'\n",filename); + + return 0; +} + diff --git a/edit.h b/edit.h new file mode 100644 index 0000000..80f6cf9 --- /dev/null +++ b/edit.h @@ -0,0 +1,24 @@ +// Editor specific macros +#define EDITORW 800 +#define EDITORH 480 + +// location of tile palette in editor +#define PALX 640 +#define PALY 0 +#define PALW (EDITORW-PALX) +#define PALH (EDITORH/2)-1 + +// location of sprite palette in editor +#define SPALX 640 +#define SPALY (EDITORH/2) +#define SPALW (EDITORW-PALX) +#define SPALH (EDITORH/2)-1 + +// Editor specific functions +void draweditorlevel(void); +void drawpalette(void); +void drawsprites(void); +int savelevel(int wnum, int lnum); +void cleanup(void); +void usage(void); + diff --git a/fixall.sh b/fixall.sh index 88f52da..c6e85ce 100755 --- a/fixall.sh +++ b/fixall.sh @@ -1,8 +1,9 @@ #!/bin/sh -LEVELS="2 3 4 5 6 7 8 9" +WORLD=2 +LEVELS="7 8 9 15" for l in $LEVELS; do - cp world1/level${l}.dat world1/ORIG.level${l}.dat - cat world1/level${l}.dat | awk -f fixlevel.awk > /tmp/$$ - mv -f /tmp/$$ world1/level${l}.dat + cp world2/level${l}.dat world1/ORIG.level${l}.dat + cat world2/level${l}.dat | awk -f fixlevel.awk > /tmp/$$ + mv -f /tmp/$$ world2/level${l}.dat done diff --git a/globals.h b/globals.h new file mode 100644 index 0000000..3ed4d8d --- /dev/null +++ b/globals.h @@ -0,0 +1,32 @@ +#ifndef __GLOBALS_H +#define __GLOBALS_H + +/* global variables */ +SDL_Surface *temps; // temporary surface +SDL_Surface *screen; // the actual video screen +sprite_t *sprite; // head of sprite linked list +sprite_t *lastsprite; // tail of sprite linked list +sprite_t *player; // pointer to the player's sprite + +level_t *curlevel; // the current level's data + +tiletype_t fakeblock; // used for returning tiletypes from a function + +int vidargs; // arguments for SetVideo call + +TTF_Font *font[MAXLETTERHEIGHT]; + +/* timers */ +int gtime; // game time - time elapsed on current level +int timer; // generic 1-100 timer for repeated events +int toggletimer; // used for toggling between fullscreen mode + +/* colours */ +SDL_Color red; +SDL_Color black; +SDL_Color white; +SDL_Color green; +SDL_Color yellow; + + +#endif diff --git a/newtiles/cloudleft.png b/newtiles/cloudleft.png new file mode 100644 index 0000000000000000000000000000000000000000..41804b2af699912f2c7e94f9593b41ce12643f6c GIT binary patch literal 632 zcmV-;0*C#HP)6Hc1a&EK%`50DppWI+C(yX@BiaB$8n_^>w7vJ7^LHUJO8oe(W-+sv%n-bx1^^h& zL%$0G2=pi8d3yb$=P!15cZ$9J>_36^huhDd9=6*6YUf?%RsUvHS3lkuY;NwV=NMf~ zF~kspBajuv_|~0wDO^~){bhNj6tqvj&0k%f-Mh=pA}1nZI%`3sMe}5S;b`N@+Z(-$ zMV_h7`Akzfsj8|hZ8RFIO0$`V5Y3<}Iz64MTcg)+T26FiG=%)UiSMtA|wQ1sIUkzvx=ySQzz(dfpGkF zp{}xOnpc%vS^2CQVu&flWGNXerDSH7l9{3g5-^@{uSmZ8bs^%{L#&|w~a|VIj0= z(I#9(%b-oGTJ$}tFA>y-i4002%+N%kT4boG-TaGsz4v;~oik@<-WGyd&+4~%;J0|h z!$*y|*;=j72`sOT!R+TDS86y#z&}F(2oSSh{utxEms)p7(wlePg~e*-)9AtO5c8RF zj+mQY3PA(d5M%99T`926O@C~?dOdQuKjdA)EH0Yz`HN@Ft|+=%5lZ$Upv3-ql)5=N zxg(X`-_HQ}?2}kr`j+QK=_;*Mni{3Z`PeGYZ>F^(l86vu zV1`61lPFDc_psCHQ1f7roO4PMBA*mCNfJq95)A-=CU(T zvMrbfhxfcka<0-uhzI~gXpBjX_JI$ZCo3DBZjsgdZRzCrL}U8x-R8jn2}BTrnVA6v zDw2p;7WVf}YieqI`Nz$k-rQHzEi%_NzDlTygop?-u?kU`bxeFn;ToNxM6Z(f#eq!PEbtB7lIuGyY3(TUP{q P00000NkvXXu0mjfegRUO literal 0 HcmV?d00001 diff --git a/newtiles/full.png b/newtiles/full.png new file mode 100644 index 0000000000000000000000000000000000000000..2a967a872d6ed9864d23accd382f88f8511d66d0 GIT binary patch literal 672 zcmV;R0$=@!P)0006%Nkl%X?s8MksROC$*3;&E@z;XnR-B*uCxdoxz$owI%4-|{*d_t$?H zxYGIYux)!YEc>!7O4*ZiIETE>2Mdk$17k`!8jJMD$?gTmsS~N7>&lEgPI<{xdKLfd;X$G_0{D@&*#Ir zJGw;)H8ZR)PfvQ3cZx+&OoUB9SH+fhlKhr#EwGU4!3~wygj$>>JC9v6GHT5y+ui~Op}e! zLdtF+2qLuzyk-uk^N1fL5Czoe{aT;}*sgCo)6&P>IfbqEhS$;vwWML--Si;TP^Tnr zfoEHt>^{mpL5!iu*Iy1LN{yQ@%JGzPrl!fJwo?|!nNd^% zSutMT{q~jxRH(Il`p_xnFDX-_oBaEq_Y!%jba3kZ-=K-db)Af%tc0;hRG$A>=7XJ` z!7H5(wg*#grEARNKJ_Zs#B{c{^+u>titZUUK+c~Z&P=RX<>cY(_ajiN*GiR#3rZ&d zpzb8kKV^U>t=d-5N~N|p#FR5hSpgKPvhfnx`ah7Sy5nyQNSMdfLUTy~0000^FA+ literal 0 HcmV?d00001 diff --git a/newtiles/land.bmp b/newtiles/land.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0332599d711fdf7592345f1b08bad629a7d34524 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;AK`;whyalMKZ-_n2skv5kOqK?AqX?sV2Z;P T0~rwYa5czMXtHQhH0A;Tdp7hx literal 0 HcmV?d00001 diff --git a/newtiles/land.png b/newtiles/land.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d9ef9ab0018971872f41318d22a9106b258261 GIT binary patch literal 627 zcmV-(0*w8MP)2R>VZZbzu9g29zr_&9( zNY1(+hJguJQUnTc94u=}N_R8@E}PznAl6?R2}%>RwtbyEyx*`@Hl<<8_{8 z4Mj%-UG!8R-_H8>U8q|()33Jz%zCP=QYI!>F^N+PAZrAIvwG^f{My5Xf z^x@$&J{(${^W$lpdee6u9OhV#6N~LoWgLBK#Hv~+2=9UT^!XFeRao}9|NQG?Pq(wB z;rdUM1NGi*$@1y9vUV>c->$tf@4k4%E|R5K?;NZ*)D5mLJ!{$${{sEtoL4sD_@n>; N002ovPDHLkV1k-QAP)cl literal 0 HcmV?d00001 diff --git a/newtiles/sky.png b/newtiles/sky.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9141ca77f3fa027c088e08352e979d8b406562 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F5M?jcysy3fAP>{XE z)7O>#2B#o{AmistrSE}4Ql2i3AsXkCdtUB3?!c9hq#)RnC2`fD#Dsxi#ze*^eTJc_ PKvfK$u6{1-oD!M<5||!o literal 0 HcmV?d00001 diff --git a/oldtiles/full.bmp b/oldtiles/full.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eeedda991d8dab0577c8df621b780ed85769c730 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;AK`;whyalMKe&-Y1Ensc+yn}PXrLTGp}iDp MCpFOMY#q#b0AR!boB#j- literal 0 HcmV?d00001 diff --git a/rc b/rc index 165eeee1ca2ec76d3fdaadf3f875632e6f0bac44..d98b40b8a6d584cd68b9c1a4ff245ec88c76c714 100755 GIT binary patch literal 170624 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 literal 164440 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 diff --git a/rc.c b/rc.c index 6d6993c..4561901 100644 --- a/rc.c +++ b/rc.c @@ -15,6 +15,7 @@ #include #include +#include "shared.h" #include "rc.h" FPSmanager manager; @@ -179,7 +180,7 @@ int main (int argc, char **argv) { for (s = sprite ; s ; s = nextsprite) { s->moved = B_FALSE; nextsprite = s->next; - if (s->dead == 4) { + if (s->dead == D_FINAL) { if (s == player) { /* TODO: lose a life */ /* if we have lives left, go back to start position */ @@ -243,7 +244,7 @@ int main (int argc, char **argv) { movex(player, getspeed(player)); } } - player->dir = 1; + player->dir = D_RIGHT; } if (keys[SDLK_LEFT]) { if ((!player->jumping) && (!player->slamming)) { @@ -251,7 +252,7 @@ int main (int argc, char **argv) { movex(player, -getspeed(player)); } } - player->dir = -1; + player->dir = D_LEFT; } if (keys[SDLK_UP]) { if (isonladder(player) || isladderabove(player)) { @@ -456,7 +457,7 @@ void die(sprite_t *s) { } } /* set death attribute */ - s->dead = 1; + s->dead = D_INITIAL; s->netting = 0; s->slamming = 0; @@ -513,7 +514,7 @@ void checkcollide(sprite_t *s) { s2->caughtby = s; s2->jumping = 0; s2->falling = 0; - s2->caughtstate = 1; + s2->caughtstate = C_NETTING; s->netcaught++; } } @@ -532,7 +533,7 @@ void checkcollide(sprite_t *s) { if (s == player) { int gotscore = s2->score; /* kill the fruit */ - s2->dead = 4; + s2->dead = D_FINAL; /* give points to the player */ player->score = player->score + gotscore; /* handle fruit effects */ @@ -553,25 +554,16 @@ void checkcollide(sprite_t *s) { } } -tiletype_t *gettile(int tid) { - tiletype_t *t; - - for (t = tiletype; t ; t = t->next) { - if (t->id == tid) return t; - } - - return &fakeblock; -} void movesprite(sprite_t *s) { int rv; tiletype_t *tt; /* timer */ - if (s->timer) { - s->timer--; - if (s->timer == 0) { - s->dead = 4; + if (s->doomcount) { + s->doomcount--; + if (s->doomcount == 0) { + s->dead = D_FINAL; } } @@ -603,25 +595,27 @@ void movesprite(sprite_t *s) { } else { /* stay at position of net */ s->y = s->caughtby->y; - if (s->caughtstate == 1) { + if (s->caughtstate == C_NETTING) { s->x = s->caughtby->x + (s->caughtby->netlen*s->caughtby->netdir); } else { s->x = s->caughtby->x + (s->caughtby->img->w/2) * -(s->caughtby->dir); } } return; - } else if (s->dead == 1) { /* just set to dead */ + } else if (s->dead == D_INITIAL) { /* just set to dead */ //s->xs = ((rand() % 7)) - 3; + // TODO: avoid straight up, also make this able + // to be a float s->xs = ((rand() % 14) / 2) - 3; s->ys = ((rand() % 3) + 3) * -1; - s->dead = 2; + s->dead = D_BOUNCING; s->bounces = 0; if (s == player) { s->jumpspeed = 8; s->jumping = 1; } return; - } else if (s->dead == 2) { /* dying */ + } else if (s->dead == D_BOUNCING) { /* dying */ if (s == player) { /* shoot up in the air, then fall */ s->y -= s->jumpspeed; @@ -635,7 +629,7 @@ void movesprite(sprite_t *s) { if (s->y >= 480) { /* pause before respawning */ s->jumpspeed = 0; /* this is now a timer */ - s->dead = 3; + s->dead = D_LASTBOUNCE; } } else { /* bounch around the screen 3 times */ @@ -665,17 +659,17 @@ void movesprite(sprite_t *s) { } } if ((s->bounces >= 2) && (s->ys > 0)) { - s->dead = 3; + s->dead = D_LASTBOUNCE; } } return; - } else if (s->dead == 3) { /* final fall */ + } else if (s->dead == D_LASTBOUNCE) { /* final fall */ if (s == player) { /* just delay... */ s->jumpspeed++; if (s->jumpspeed == 50) { /* really die */ - s->dead = 4; + s->dead = D_FINAL; } } else { /* bounce around, stop when we hit the ground */ s->x += s->xs; @@ -708,7 +702,7 @@ void movesprite(sprite_t *s) { if ((s->ys > 0) && (s->y >= TILEH)) { if (isonground(s)) { int x,y,ty; - s->dead = 4; + s->dead = D_FINAL; /* change into a fruit */ x = s->x; gettileat(s->x,s->y-1,NULL,&ty); @@ -728,7 +722,7 @@ void movesprite(sprite_t *s) { SDL_Surface *ts; if (timer % 2 == 0) { /* shrink */ - if (s->teleporting == 1) { + if (s->teleporting == TP_SHRINKING) { ts = rotozoomSurfaceXY(s->img,0, 0.9 , 0.9 ,0); s->img = ts; } else { @@ -815,10 +809,10 @@ void movesprite(sprite_t *s) { } else if (player->y == s->y) { if (s->angry) { /* if player is at same level and close, jump */ - if ((s->dir == 1) && (xdiff > 0) && (xdiff <= (TILEW*7))) { - jump(s,1); - } else if ((s->dir == -1) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { - jump(s,-1); + if ((s->dir == D_RIGHT) && (xdiff > 0) && (xdiff <= (TILEW*7))) { + jump(s,D_RIGHT); + } else if ((s->dir == D_LEFT) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { + jump(s,D_LEFT); } } } @@ -889,10 +883,10 @@ void movesprite(sprite_t *s) { } else if (player->y == s->y) { if (s->angry) { /* if player is at same level and close, jump */ - if ((s->dir == 1) && (xdiff > 0) && (xdiff <= (TILEW*7))) { - jump(s,1); - } else if ((s->dir == -1) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { - jump(s,-1); + if ((s->dir == D_RIGHT) && (xdiff > 0) && (xdiff <= (TILEW*7))) { + jump(s,D_RIGHT); + } else if ((s->dir == D_LEFT) && (xdiff < 0) && (xdiff >= -(TILEW*7))) { + jump(s,D_LEFT); } } } @@ -908,9 +902,9 @@ void movesprite(sprite_t *s) { sprite_t *ss; int shoot = B_FALSE; if (s->bullet == NULL) { - if ( (player->x < s->x) && (s->dir == -1) ) { + if ( (player->x < s->x) && (s->dir == D_LEFT) ) { shoot = B_TRUE; - } else if ( (player->x < s->x) && (s->dir == -1) ) { + } else if ( (player->x > s->x) && (s->dir == D_RIGHT) ) { shoot = B_TRUE; } } @@ -1072,12 +1066,12 @@ void movesprite(sprite_t *s) { } } else if (s->id == P_SPIT) { if (movex(s, s->xs)) { - s->dead = 4; + s->dead = D_FINAL; } } else if (s->id == P_CLOUD) { if ((player->dead) || (levelcomplete)) { if ((s->img->h <= 3) || (s->img->w <= 3)) { - s->dead = 4; + s->dead = D_FINAL; /* reset hurryup timer */ gtime = 0; } else { @@ -1185,27 +1179,6 @@ void dotileeffects(sprite_t *s) { } } -void drawtile(SDL_Surface *where, int x, int y) { - SDL_Rect area; - tiletype_t *tt; - - if ((x < 0) || (y < 0) || (x >= LEVELW) || (y >= LEVELH)) { - return; - } - - area.x = x * TILEW; - area.y = y * TILEH; - area.w = 0; - area.h = 0; - /* draw blank tile first */ - tt = gettile(curlevel->bgtileid); - SDL_BlitSurface(tt->img, NULL, where, &area); - - tt = gettile(curlevel->map[y*LEVELW+x]); - if (tt->id != curlevel->bgtileid) { - SDL_BlitSurface(tt->img, NULL, where, &area); - } -} void drawlevel(void) { int x,y; @@ -1242,714 +1215,6 @@ void drawlevel(void) { } -int loadlevel(int wnum, int lnum) { - FILE *f; - int x,y; - char buf[BUFLEN]; - char buf2[BUFLEN]; - char filename[BUFLEN]; - char *help[MAXHELP]; - int numhelp = 0; - int curhelp; - char *p; - int tileid; - int i; - mapping_t mapping[MAXMAPPINGS]; - int nmappings = 0; - tiletype_t *lasttile; - - - level = malloc(sizeof(level_t)); - - level->id = 0; - sprintf(level->name, "Level %d-%d",wnum,lnum); - level->prev = NULL; - level->next = NULL; - - /* default */ - level->hurryuptime = 30; - level->p1x = 0; - level->p1y = 0; - - 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 text */ - while (text) { - killtext(text); - } - - /* clear tiletype linked list */ - while (tiletype != NULL) { - tiletype_t *tt; - - /* kill first tile */ - if (tiletype->img) { - SDL_FreeSurface(tiletype->img); - tiletype->img = NULL; - tt = tiletype->next; - free(tiletype); - tiletype = tt; - } - } - - /* clear player linked list */ - if (sprite != NULL) { - while (sprite->next) { - killsprite(sprite->next); - } - } - - /* read tileset */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "tileset") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - - /* strip newline */ - p[strlen(p)-1] = '\0'; - - strcat(p, ".tiles"); - - if (loadtiletypes(p)) { - printf("Cannot load tileset file: %s\n", p); - return B_TRUE; - } - - } else { - printf("invalid tileset file in line: '%s'\n",buf); - return B_TRUE; - } - - /* read background tile */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "bg") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - level->bgtileid = atoi(p); - if (!gettile(level->bgtileid)) { - printf("invalid background tile id: %d\n",level->bgtileid); - return B_TRUE; - } - //printf("Background tile id is %d (%s)\n",level->bgtileid,(gettile(level->bgtileid)->name)); - } else { - printf("invalid background tile id line: '%s'\n",buf); - return B_TRUE; - } - - /* read hurryup time tile */ - fgets(buf, BUFLEN, f); - if (strstr(buf, "hurryup") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - level->hurryuptime = atoi(p); - //printf("Hurryup time is %d\n",level->hurryuptime); - } else { - printf("invalid hurryup time line: '%s'\n",buf); - return B_TRUE; - } - - level->nummonsters = 0; - - /* read tile defs */ - nmappings = 0; - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endmaps")) { - strncpy(buf2,buf,BUFLEN); - p = strtok(buf2, ","); - if (p == NULL) { - printf("invalid char->tile mapping: '%s'\n",buf); - return B_TRUE; - } - mapping[nmappings].ch = p[0]; - p = strtok(NULL, ","); - if (p == NULL) { - printf("invalid char->tile mapping: '%s'\n",buf); - return B_TRUE; - } - mapping[nmappings].tnum = atoi(p); - printf("got mapping: '%c' to %d\n",mapping[nmappings].ch,mapping[nmappings].tnum); - nmappings++; - fgets(buf, BUFLEN, f); - } - - fgets(buf, BUFLEN, f); - /* read help messages if present */ - if (strstr(buf, "help")) { - curhelp = 0; // used later - numhelp = 0; - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endhelp")) { - // strip newline - buf[strlen(buf)-1] = '\0'; - help[numhelp] = strdup(buf); - numhelp++; - fgets(buf, BUFLEN, f); - } - - /* this reads the first line of the level */ - fgets(buf, BUFLEN, f); - } - /* read monster definitions if present */ - if (strstr(buf, "monsters")) { - fgets(buf, BUFLEN, f); - while (!strstr(buf, "endmonsters")) { - char ch; - int monid; - int x,y; - // strip newline - buf[strlen(buf)-1] = '\0'; - - strncpy(buf2,buf,BUFLEN); - p = strtok(buf2, " "); - if (p == NULL) { - printf("invalid monster definition (missing type): '%s'\n",buf); - return B_TRUE; - } - ch = p[0]; // type of monster - monid = chartomonster(ch); - if (monid < 0) { - printf("invalid monster definition (invalid type): '%s'\n",buf); - return B_TRUE; - } - - p = strtok(NULL, " "); - if (p == NULL) { - printf("invalid monster definition (missing x): '%s'\n",buf); - return B_TRUE; - } - x = atoi(p); // monster x pos - - p = strtok(NULL, " "); - if (p == NULL) { - printf("invalid monster definition (missing y): '%s'\n",buf); - return B_TRUE; - } - y = atoi(p); // monster y pos - - - if (monid == P_PLAYER) { - level->p1x = x; - level->p1y = y; - } else { - /* place the monster */ - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = monid; - - if (monid == P_HELP) { - if (curhelp >= numhelp) { - printf("Error in level - more help icons than help texts.\n"); - exit(1); - } else { - level->initm[level->nummonsters].help = strdup(help[curhelp]); - curhelp++; - } - } - - level->nummonsters++; - } - - - fgets(buf, BUFLEN, f); - } - - /* this reads the first line of the level */ - fgets(buf, BUFLEN, f); - } - - - - x = 0; - y = 0; - while (!feof(f)) { - for (p = buf; *p; p++) { - int n,found = 0; - /* search mappings */ - for (n = 0; n < nmappings; n++) { - if (mapping[n].ch == *p) { - tileid = mapping[n].tnum; - found = B_TRUE; - break; - } - } - if (!found) { - - if (*p == '~') { - tileid = T_LAND; - } else if (*p == '=') { - tileid = T_LADDER; - } else if (*p == '-') { - tileid = T_LADDERTOP; - } else if (*p == '{') { - tileid = T_WATERTOP; - } else if (*p == '}') { - tileid = T_WATER; - } else if (*p == '>') { - tileid = T_RIGHT; - } else if (*p == '<') { - tileid = T_LEFT; - } else if (*p == '^') { - tileid = T_SPIKES; - } else if (*p == 'c') { - tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_CLOUD; - level->nummonsters++; - } else if (*p == 'r') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_RAT; - level->nummonsters++; - - } else if (*p == 'S') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_SNAKE; - level->nummonsters++; - } else if (*p == 'a') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_BEE; - level->nummonsters++; - } else if (*p == 's') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+TILEH; - level->initm[level->nummonsters].id = P_SPIDER; - level->nummonsters++; - } else if (*p == '?') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - - // tileid = level->bgtileid; - level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); - level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); - level->initm[level->nummonsters].id = P_HELP; - - if (curhelp >= numhelp) { - printf("Error in level - more help icons than help texts.\n"); - exit(1); - } else { - level->initm[level->nummonsters].help = strdup(help[curhelp]); - curhelp++; - } - - level->nummonsters++; - } else if (*p == '*') { - tileid = T_FULL; - } else if (*p == ';') { - tileid = T_TELEPORT; - } else if (*p == ':') { - tileid = T_TELEPORT2; - } else if (*p == '.') { - tileid = T_TELEPORTDEST; - } else if (*p == '/') { - tileid = T_SLOPEUP; - } else if (*p == '\\') { - tileid = T_SLOPEDOWN; - } else if (*p == '1') { - /* figure out background type */ - if (lasttile->solid) { - tileid = level->map[(y-1)*LEVELW+x]; - } else { - tileid = lasttile->id; - } - level->p1x = x; - level->p1y = y; - } else { - tileid = level->bgtileid; - } - } - if (!gettile(tileid)) { - printf("invalid tileid: %d\n",tileid); - fclose(f); - return B_TRUE; - } - if (x > LEVELW) { - printf("Too many tiles on line %d: %d,%d\n",y,x,y); - fclose(f); - return B_TRUE; - } - if (y >= LEVELH) { - printf("Too many lines at line %d: %d,%d\n",y,x,y); - fclose(f); - return B_TRUE; - } - level->map[y*LEVELW+x] = tileid; - - lasttile = gettile(tileid); - x++; - } - if (x < LEVELW+1) { - printf("Not enough tiles on line: y = %d\n",y); - fclose(f); - return B_TRUE; - } - y++; - x = 0; - fgets(buf, BUFLEN, f); - } - fclose(f); - - if ((numhelp > 0) && (curhelp != numhelp)) { - printf("WARNING: Unused help text. First unused is '%s'\n",help[curhelp]); - } - - if (y < LEVELH) { - printf("Incomplete level: y=%d, should be %d.\n", - y,LEVELH); - return B_TRUE; - } - - if ((level->p1x == 0) || (level->p1y == 0)) { - printf("Level is missing player 1 start position.\n"); - return B_TRUE; - } - - /* free help texts */ - for (i = 0; i < numhelp; i++) { - free(help[i]); - } - - /* set current level pointer */ - curlevel = level; - - /* add player */ - if (player == NULL) { - addsprite(P_PLAYER, (curlevel->p1x * TILEW) + (TILEW/2), - (curlevel->p1y * TILEH) + TILEH-2 , "Player" , B_TRUE); - } 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]; - if (level->initm[i].id == P_HELP) { - strncpy(name, level->initm[i].help, MIDBUFLEN); - } else { - strcpy(name, "Monster"); - } - addsprite(level->initm[i].id, - level->initm[i].startx, level->initm[i].starty, name, B_TRUE); - } - - gtime = 0; - - return B_FALSE; -} - -int loadtiletypes(char *filename) { - tiletype_t *t = NULL; - int i; - int state; - FILE *f; - char buf[BUFLEN]; - char *p,*pp; - - state = 0; - f = fopen(filename,"rt"); - if (!f) { - printf("can't open tiles file\n"); - return B_TRUE; - } - - fgets(buf, BUFLEN, f); - while (!feof(f)) { - if (state == 0) { - if (strstr(buf, "tile") == buf) { - if (t == NULL) { - tiletype = malloc(sizeof(tiletype_t)); - t = tiletype; - t->prev = NULL; - } else { - t->next = malloc(sizeof(tiletype_t)); - t->next->prev = t; - - t = t->next; - } - p = strtok(buf, " "); - p = strtok(NULL, " "); - /* strip newline */ - p[strlen(p)-1] = '\0'; - strcpy(t->name, p); - - /* defaults */ - t->id = 0; - t->water = B_FALSE; - t->spikes = B_FALSE; - t->solid = B_TRUE; - for (i = 0; i < TILEW; i++) { - t->lowness[i] = 0; - } - t->img = NULL; - t->next = NULL; - state = 1; - } - } else if (state == 1) { /* inside a definition */ - if (strstr(buf, "end") == buf) { - //printf("got tile %d: %s (solid=%d)\n",t->id,t->name,t->solid); - state = 0; - } else if (strstr(buf, "id") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->id = atoi(p); - } else if (strstr(buf, "lowness") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - pp = strtok(p, ","); - for (i = 0;i < TILEW; i++) { - t->lowness[i] = atoi(pp); - pp = strtok(NULL, ","); - } - } else if (strstr(buf, "solid") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->solid = atoi(p); - } else if (strstr(buf, "spikes") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->spikes = atoi(p); - } else if (strstr(buf, "water") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - t->water = atoi(p); - } else if (strstr(buf, "file") == buf) { - p = strtok(buf, " "); - p = strtok(NULL, " "); - if (t->img) { - SDL_FreeSurface(t->img); - t->img = NULL; - } - /* strip newline */ - p[strlen(p)-1] = '\0'; - t->img = IMG_Load(p); - if (!t->img) { - printf("cannot load tile image file: '%s'\n",p); - fclose(f); - return B_TRUE; - } - SDL_SetColorKey(t->img, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - } - } - fgets(buf, BUFLEN, f); - } - - fclose(f); - return B_FALSE; - -} - -int loadimagesets(void) { - int p,i; - SDL_Surface *tempimg; - - SDL_Surface *reds; - - imageset[P_PLAYER].img[F_WALK1] = IMG_Load("pdwarf.png"); - imageset[P_PLAYER].img[F_JUMP] = IMG_Load("pdwarfjump.png"); - imageset[P_PLAYER].img[F_FALL] = IMG_Load("pdwarffall.png"); - imageset[P_PLAYER].img[F_CAUGHT] = IMG_Load("pdwarf.png"); - imageset[P_PLAYER].img[F_DEAD] = IMG_Load("dwarfdie.png"); - /* next 3 are auto generated */ - imageset[P_PLAYER].img[F_CLIMB1] = IMG_Load("dclimb1.png"); - imageset[P_PLAYER].img[F_CLIMB2] = IMG_Load("dclimb2.png"); - imageset[P_PLAYER].numimages = 10; - - imageset[P_SNAKE].img[F_WALK1] = IMG_Load("snake.bmp"); - imageset[P_SNAKE].img[F_JUMP] = IMG_Load("snakejump.bmp"); - imageset[P_SNAKE].img[F_FALL] = IMG_Load("snakejump.bmp"); - imageset[P_SNAKE].img[F_CAUGHT] = IMG_Load("snakecaught.bmp"); - imageset[P_SNAKE].img[F_DEAD] = IMG_Load("snakedead.bmp"); - /* next 3 are auto generated */ - imageset[P_SNAKE].numimages = 8; - - - imageset[P_RAT].img[F_WALK1] = IMG_Load("rat.bmp"); - imageset[P_RAT].img[F_JUMP] = IMG_Load("ratjump.bmp"); - imageset[P_RAT].img[F_FALL] = IMG_Load("ratjump.bmp"); - imageset[P_RAT].img[F_CAUGHT] = IMG_Load("ratcaught.bmp"); - imageset[P_RAT].img[F_DEAD] = IMG_Load("ratdead.bmp"); - /* next 3 are auto generated */ - imageset[P_RAT].numimages = 8; - - imageset[P_BEE].img[F_WALK1] = IMG_Load("bee.bmp"); - imageset[P_BEE].img[F_JUMP] = IMG_Load("beejump.bmp"); - imageset[P_BEE].img[F_FALL] = IMG_Load("beejump.bmp"); - imageset[P_BEE].img[F_CAUGHT] = IMG_Load("beecaught.bmp"); - imageset[P_BEE].img[F_DEAD] = IMG_Load("beedead.bmp"); - /* next 3 are auto generated */ - imageset[P_BEE].numimages = 8; - - imageset[P_SPIDER].img[F_WALK1] = IMG_Load("spider.bmp"); - imageset[P_SPIDER].img[F_JUMP] = IMG_Load("spiderjump.bmp"); - imageset[P_SPIDER].img[F_FALL] = IMG_Load("spiderfall.bmp"); - imageset[P_SPIDER].img[F_CAUGHT] = IMG_Load("spidercaught.bmp"); - imageset[P_SPIDER].img[F_DEAD] = IMG_Load("spiderdead.bmp"); - /* next 3 are auto generated */ - imageset[P_SPIDER].numimages = 8; - - imageset[P_CLOUD].img[F_WALK1] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_JUMP] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_FALL] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_CAUGHT] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].img[F_DEAD] = IMG_Load("cloud.bmp"); - imageset[P_CLOUD].numimages = 2; - - imageset[P_CHEESE].img[F_WALK1] = IMG_Load("cheese.bmp"); - imageset[P_CHEESE].numimages = 1; - - imageset[P_ICECREAM].img[F_WALK1] = IMG_Load("icecream.bmp"); - imageset[P_ICECREAM].numimages = 1; - - imageset[P_CHIPS].img[F_WALK1] = IMG_Load("chips.bmp"); - imageset[P_CHIPS].numimages = 1; - - imageset[P_BURGER].img[F_WALK1] = IMG_Load("burger.bmp"); - imageset[P_BURGER].numimages = 1; - - imageset[P_SPEED].img[F_WALK1] = IMG_Load("speed.bmp"); - imageset[P_SPEED].numimages = 1; - - imageset[P_NUMNETS].img[F_WALK1] = IMG_Load("numnets.bmp"); - imageset[P_NUMNETS].numimages = 1; - - imageset[P_BIGNET].img[F_WALK1] = IMG_Load("bignet.bmp"); - imageset[P_BIGNET].numimages = 1; - - imageset[P_HELP].img[F_WALK1] = IMG_Load("help.bmp"); - imageset[P_HELP].numimages = 1; - - /* bullets */ - imageset[P_SPIT].img[F_WALK1] = IMG_Load("spit.bmp"); - imageset[P_SPIT].numimages = 1; - - - - - /* generate rotated/flipped images */ - for (p = 0; p < MAXPTYPES; p++) { - if (!isfruit(p) && !isbullet(p)) { - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],90,1,0); - imageset[p].img[F_DEAD2] = SDL_DisplayFormat(tempimg); - - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],180,1,0); - imageset[p].img[F_DEAD3] = SDL_DisplayFormat(tempimg); - - tempimg = rotozoomSurface(imageset[p].img[F_DEAD],270,1,0); - imageset[p].img[F_DEAD4] = SDL_DisplayFormat(tempimg); - } - - for (i = 0; i < imageset[p].numimages; i++) { - SDL_Surface *origi; - - SDL_SetColorKey(imageset[p].img[i], - SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - origi = imageset[p].img[i]; - - - /* flipped image */ - imageset[p].img[MAXFRAMES+i] = - rotozoomSurfaceXY(imageset[p].img[i], 0, -1,1,0); - SDL_SetColorKey(imageset[p].img[MAXFRAMES+i], - SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); - - - - /* angry image */ - reds = SDL_CreateRGBSurface(SDL_SWSURFACE, - origi->w, - origi->h, - origi->format->BitsPerPixel, origi->format->Rmask, - origi->format->Gmask,origi->format->Bmask, 0); - SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); - SDL_SetAlpha(reds, SDL_SRCALPHA,100); - - imageset[p].img[MAXFRAMES*2+i] = rotozoomSurfaceXY(origi, 0, 1,1,0); - - - SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*2+i], NULL); - SDL_FreeSurface(reds); - - temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*2+i]); - SDL_FreeSurface(imageset[p].img[MAXFRAMES*2+i]); - imageset[p].img[MAXFRAMES*2+i] = temps; - - SDL_SetColorKey(imageset[p].img[MAXFRAMES*2+i], - SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*2+i]->format, 101, 0, 0)); - - - /* flipped angry image */ - reds = SDL_CreateRGBSurface(SDL_SWSURFACE, - origi->w, - origi->h, - origi->format->BitsPerPixel, origi->format->Rmask, - origi->format->Gmask,origi->format->Bmask, 0); - SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); - SDL_SetAlpha(reds, SDL_SRCALPHA,100); - - imageset[p].img[MAXFRAMES*3+i] = rotozoomSurfaceXY(origi, 0, -1,1,0); - - - SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*3+i], NULL); - SDL_FreeSurface(reds); - - temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*3+i]); - SDL_FreeSurface(imageset[p].img[MAXFRAMES*3+i]); - imageset[p].img[MAXFRAMES*3+i] = temps; - - SDL_SetColorKey(imageset[p].img[MAXFRAMES*3+i], - SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*3+i]->format, 101, 0, 0)); - - } - } - - return B_FALSE; -} - double getspeed(sprite_t *s ) { int id = s->id; double speed = 1; @@ -2143,143 +1408,6 @@ void killtext(text_t *t) { } } -void setdefaults(sprite_t *s) { - s->speed = 1; - s->teleporting = 0; - s->climbing = 0; - s->jumping = 0; - s->jumpspeed = 0; - s->jumpdir = 1; - s->netting = 0; - s->netmax = 1; - s->netcaught = 0; - s->netbig = 0; - s->falling = 0; - s->fallspeed = 0; - s->dir = 1; - s->slamming = 0; - s->dead = 0; - s->angry = 0; - s->invuln = 0; - s->jumptimer = 0; - - s->bullet = NULL; - s->owner = NULL; - - s->willbecome = P_CHEESE; - - switch (s->id) { - case P_BEE: - case P_CLOUD: - s->flies = B_TRUE; - break; - default: - s->flies = B_FALSE; - break; - - } - - // assign score - switch (s->id) { - case P_CHEESE: - s->score = 500; - break; - case P_ICECREAM: - s->score = 1000; - break; - case P_CHIPS: - s->score = 2000; - break; - case P_BURGER: - s->score = 4000; - break; - default: - s->score = 0; - break; - - } - - s->caughtby = NULL; - s->caughtstate = 0; - - s->xs = -99; - s->ys = -99; - - s->timer = 0; -} - -/* 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 *s; - - if (sprite == NULL) { - sprite = malloc(sizeof(sprite_t)); - s = sprite; - s->prev = NULL; - } else { - s = lastsprite; - s->next = malloc(sizeof(sprite_t)); - s->next->prev = s; - - s = s->next; - } - - - s->id = id; - s->x = x; - s->y = y; - if (s->id == P_CLOUD) { - s->img = rotozoomSurfaceXY(imageset[id].img[F_WALK1],0,1,1,0); - } else { - s->img = imageset[id].img[F_WALK1]; - } - if (s->y > (480 - TILEH-1)) { - s->y = 480 - TILEH-1; - } - strcpy(s->name, name); - - if (s == sprite) { - s->netbg = SDL_CreateRGBSurface(SDL_SWSURFACE, - 200, 64, - screen->format->BitsPerPixel, screen->format->Rmask, - screen->format->Gmask,screen->format->Bmask, - screen->format->Amask); - } else { - s->netbg = NULL; - } - - setdefaults(s); - - if (!initial) { - if (isfruit(s->id)) { - if (s->id != P_HELP) { // help icons don't time out - s->timer = 500; - } - } - } - - s->next = NULL; - - lastsprite = s; - - return s; -} - - - -tiletype_t *gettileat(int pixx,int pixy, int *tilex,int *tiley) { - int tx,ty; - tx = pixx / TILEW; - ty = pixy / TILEH; - if (tilex != NULL) { - *tilex = tx; - } - if (tiley != NULL) { - *tiley = ty; - } - - return gettile(curlevel->map[ty*LEVELW+tx]); -} void drawnetting(sprite_t *s) { int sx; @@ -2344,109 +1472,6 @@ void drawnetting(sprite_t *s) { } -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 (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->jumping) { - frame = F_JUMP; - } else if (s->falling) { - frame = F_FALL; - } 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 */ - if (s->dir == -1) { - frame += MAXFRAMES; - } - /* make red if required */ - if (s->angry) { - frame += (MAXFRAMES*2); - } - - if ((s->id != P_CLOUD) && (!s->teleporting)) { - s->img = imageset[s->id].img[frame]; - } - - - /* spider's climbing web */ - if ((s->id == P_SPIDER) && ((s->ys != -99) || s->falling) && (!s->dead) && (!s->caughtby)) { - tiletype_t *tt; - int x = s->x; - int y = s->y - s->img->h/2; - int tx=0,ty = 0; - int done = B_FALSE; - for (y = s->y ; !done ; y-= TILEH) { - tt = gettileat(x,y,&tx,&ty); - if ((tt == NULL) || (tt->solid)) { - done = B_TRUE; - } - } - drawline16(screen,s->x,s->y - (s->img->h/2),s->x,ty*TILEH+TILEH-1,white); - - } - - - area.x = s->x - (s->img->w/2); - area.y = s->y - (s->img->h); - area.w = 0; - area.h = 0; - - if (area.y < (480-s->img->h)) { - if (s->invuln) { - if (timer % 2 == 0) { - SDL_BlitSurface(s->img, NULL, screen, &area); - } - } else { - SDL_BlitSurface(s->img, NULL, screen, &area); - /* for opengl */ - //SDL_UpdateRect(screen, area.x, area.y, area.w, area.h); - } - } - - - /* caughtby lines */ - if ((s->caughtby) && (s->caughtstate == 2)){ - drawline16(screen, s->x,s->y - s->img->h, - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - drawline16(screen, s->x,s->y - (s->img->h/2), - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - drawline16(screen, s->x,s->y, - s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); - } - - -} - void removenetting(sprite_t *s) { SDL_Rect area,sarea; @@ -2473,42 +1498,6 @@ void removenetting(sprite_t *s) { } -void killsprite(sprite_t *s) { - sprite_t *nextone, *lastone; - sprite_t *s2; - - /* remove references to this sprite before removing it */ - for (s2 = sprite ; s2 ; s2 = s2->next) { - if (s2->owner == s) { - s2->owner = NULL; - } - if (s2->bullet == s) { - s2->bullet = NULL; - } - } - - nextone = s->next; - if (nextone != NULL) { - nextone->prev = s->prev; - } else { /*last sprite */ - lastsprite = s->prev; - } - - if (s->prev == NULL) { - /* first sprite */ - nextone = sprite->next; - free(sprite); - sprite = nextone; - } else { - lastone = s->prev; - free (lastone->next ); - lastone->next = nextone; - } - - - -} - void removesprite(sprite_t *s) { int startx,starty,endx,endy; int x,y; @@ -2520,7 +1509,7 @@ void removesprite(sprite_t *s) { gettileat(s->x + s->img->w, s->y + s->img->h,&endx,&endy); if (s->slamming) { - if (s->dir == -1) { + if (s->dir == D_LEFT) { startx -= 5; endx += 1; } else { @@ -2722,8 +1711,8 @@ void dogravity(sprite_t *s) { else { s->netting = 0; for (s2 = sprite ; s2 ; s2 = s2->next) { - if ((s2->caughtby == s) && (s2->caughtstate == 1)) { - s2->caughtstate = 2; + if ((s2->caughtby == s) && (s2->caughtstate == C_NETTING)) { + s2->caughtstate = C_NETTED; } } } @@ -2750,7 +1739,7 @@ void dogravity(sprite_t *s) { tt = gettileat(s2->x,s2->y+2,NULL,NULL); /* if on ground, monster dies */ if ((tt == NULL) || (tt->solid)) { - /* becomes a fruit */ + /* will become a fruit when it finishes dying */ s2->willbecome = fruittypes[curfruittype]; /* increment fruit type */ if (fruittypes[++curfruittype] == -1) { @@ -2818,15 +1807,6 @@ void dogravity(sprite_t *s) { } -void flip(void) { - #ifdef OPENGL - SDL_GL_SwapBuffers(); - SDL_UpdateRect(screen,0,0,screen->w,screen->h); - #else - SDL_Flip(screen); - #endif -} - int movex(sprite_t *s,double amt) { double newx,newy; double curx,cury; @@ -2926,29 +1906,6 @@ int dofruiteffect(sprite_t *s) { return B_FALSE; } -int isfruit(int id) { - switch (id) { - case P_CHEESE: - case P_ICECREAM: - case P_CHIPS: - case P_BURGER: - case P_SPEED: - case P_NUMNETS: - case P_BIGNET: - case P_HELP: - return B_TRUE; - - } - - return B_FALSE; -} - -int isbullet(int id) { - if (id == P_SPIT) return B_TRUE; - - return B_FALSE; -} - int ismonster(int id) { if (id == P_RAT) return B_TRUE; if (id == P_BEE) return B_TRUE; @@ -2959,198 +1916,6 @@ int ismonster(int id) { return B_FALSE; } -/* -inline void drawpixel32(SDL_Surface *screen, int x, int y, SDL_Color c) -{ - Uint32 *bufp; - - // check x/y - if (x >= screen->w) return; - if (y >= screen->h) return; - if (x < 0) return; - if (y < 0) return; - - bufp = (Uint32 *)screen->pixels + (y*screen->pitch / 2) + x; - *bufp = SDL_MapRGB(screen->format, c.r, c.g, c.b); -} -*/ - -inline void drawpixel16(SDL_Surface *screen, int x, int y, SDL_Color c) -{ - Uint16 *bufp; - - /* check x/y */ - if (x >= screen->w) return; - if (y >= screen->h) return; - if (x < 0) return; - if (y < 0) return; - - bufp = (Uint16 *)screen->pixels + (y*screen->pitch / 2) + x; - *bufp = SDL_MapRGB(screen->format, c.r, c.g, c.b); -} - - -void drawline16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c) { - int deltax, deltay; - int numpixels; - int d; - int dinc1,dinc2,xinc1,xinc2,yinc1,yinc2; - int i; - int x; - int y; - int maskcount = 0; - int maskindex = 0; - - - - deltax = (x2 - x1); - if (deltax < 0) deltax = -deltax; - deltay = (y2 - y1); - if (deltay < 0) deltay = -deltay; - - if (deltax >= deltay) { - numpixels = deltax + 1; - d = (deltay*2) - deltax; - dinc1 = deltay << 1; - dinc2 = (deltay-deltax) << 1; - xinc1 = 1; - xinc2 = 1; - yinc1 = 0; - yinc2 = 1; - } else { - numpixels = deltay + 1; - d = (deltax*2) - deltay; - dinc1 = deltax << 1; - dinc2 = (deltax - deltay) << 1; - xinc1 = 0; - xinc2 = 1; - yinc1 = 1; - yinc2 = 1; - } - - if (x1 > x2) { - xinc1 = - xinc1; - xinc2 = - xinc2; - } - if (y1 > y2) { - yinc1 = - yinc1; - yinc2 = - yinc2; - } - - x = x1; y = y1; - - maskcount = 0; - maskindex = 0; - for (i = 0; i < numpixels; i++) { - - drawpixel16(screen,x,y,c); - - - - if (d < 0) { - d += dinc1; - x += xinc1; - y += yinc1; - } else { - d += dinc2; - x += xinc2; - y += yinc2; - } - } -} - - -void drawbox16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color *c, SDL_Color *fc) { - if (fc != NULL) { - /* fill */ - if (((x2 - x1) >= 2) && ((y2 - y1) >= 2)) { - int y; - for (y = (y1+1) ; y <= (y2-1); y++) { - drawline16(screen, x1+1, y, x2-1,y,*fc); - } - } - } - drawline16(screen,x1,y1,x2,y1,*c); - drawline16(screen,x1,y1,x1,y2,*c); - drawline16(screen,x1,y2,x2,y2,*c); - drawline16(screen,x2,y1,x2,y2,*c); -} - - - -int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col) { - Uint32 pixel; - int bpp = dest->format->BytesPerPixel; - char *ppos; - unsigned char r,g,b,a; - - - ppos = (char *) dest->pixels; - - /* offset y */ - ppos += (dest->pitch * y); - /* offset x */ - ppos += (bpp * x); - - memcpy(&pixel, ppos, bpp); - - - if (dest->format->BitsPerPixel == 32) { - SDL_GetRGBA(pixel, dest->format, &r,&g,&b, &a); - col->r = r; - col->g = g; - col->b = b; - col->unused = a; - } else if (dest->format->BitsPerPixel == 16) { - SDL_GetRGB(pixel, dest->format, &r,&g,&b); - col->r = r; - col->g = g; - col->b = b; - } else if (dest->format->BitsPerPixel == 8) { - *col = dest->format->palette->colors[(Uint8)pixel]; - } - - - return 0; - -/* - bpp = dest->format->BytesPerPixel; - - if (bpp != 2) { - printf("bpp isnt 2!!!\n"); - fflush(stdout); - } - - //pixel = (Uint32 *) (dest->pixels + (y * dest->w) + x) ; - pixel = (Uint32 *) (dest->pixels + y * dest->pitch + x * bpp); - - - - SDL_GetRGB(*pixel,dest->format, - &col->r, - &col->g, - &col->b ); - - return 0; -*/ - - - -} - -int chartomonster(char ch) { - switch (ch) { - case 'c': return P_CLOUD; - case 'r': return P_RAT; - case 'S': return P_SNAKE; - case 'a': return P_BEE; - case 's': return P_SPIDER; - case '?': return P_HELP; - case '1': return P_PLAYER; - } - - return -1; -} void usage(void) { printf("usage: rc [-fs] [-l xx]\n"); diff --git a/rc.h b/rc.h index 8b01937..43bd057 100644 --- a/rc.h +++ b/rc.h @@ -1,239 +1,3 @@ -#include - -//#define OPENGL - - -#define EDITORW 800 -#define EDITORH 480 - -// location of tile palette in editor -#define PALX 640 -#define PALY 0 -#define PALW (EDITORW-PALX) -#define PALH (EDITORH/2)-1 - -// loc of sprite palette -#define SPALX 640 -#define SPALY (EDITORH/2) -#define SPALW (EDITORW-PALX) -#define SPALH (EDITORH/2)-1 - -// text sizes -#define TEXTSIZE_HELP 20 -#define TEXTSIZE_POINTS 10 -#define TEXTSIZE_HURRY 50 - -#define INVULNTIME 200 - -#define WANTFPS 75 - -#define TEXTSPEED 2 -#define NETSPEED 9 - -#define POINTSDELAY 40 -#define HURRYDELAY 50 -#define LEVELDELAY 40 -#define HELPDELAY 80 - -#define MAXMAPPINGS 50 - -#define MAXMONSTERSPERLEVEL 20 - -#define MAXLETTERHEIGHT 100 - -#define MAXFRAMES 10 - -#define MAXHELP 5 - -#define TILEH 16 -#define TILEW 16 - -#define LEVELW 40 -#define LEVELH 30 - -#define BUFLEN 512 -#define MIDBUFLEN 64 -#define SMALLBUFLEN 32 - -#define FALLSPEED 4 - -#define B_TRUE -1 -#define B_FALSE 0 - -#define S_NOTSOLID 0 -#define S_SOLID 1 -#define S_SLOPE 2 - -#define MAXPTYPES 15 -#define P_PLAYER 0 -#define P_RAT 1 -#define P_CHEESE 2 -#define P_SPEED 3 -#define P_NUMNETS 4 -#define P_BIGNET 5 -#define P_BEE 6 -#define P_SPIDER 7 -#define P_CLOUD 8 -#define P_ICECREAM 9 -#define P_CHIPS 10 -#define P_BURGER 11 -#define P_SNAKE 12 -#define P_SPIT 13 -#define P_HELP 14 - -#define F_WALK1 0 -#define F_JUMP 1 -#define F_FALL 2 -#define F_CAUGHT 3 -#define F_DEAD 4 -#define F_DEAD2 5 -#define F_DEAD3 6 -#define F_DEAD4 7 -#define F_CLIMB1 8 -#define F_CLIMB2 9 - -#define T_BLANK 0 -#define T_LAND 1 -#define T_SLOPEUP 2 -#define T_SLOPEDOWN 3 -#define T_FULL 4 -#define T_SKY 5 -#define T_LADDER 6 -#define T_LADDERTOP 7 -#define T_RIGHT 8 -#define T_LEFT 9 -#define T_SPIKES 10 -#define T_TELEPORT 11 -#define T_TELEPORT2 12 -#define T_TELEPORTDEST 13 -#define T_WATER 14 -#define T_WATERTOP 15 -#define T_WATERSPIKES 16 - - - -typedef struct mapping_s { - char ch; - int tnum; -} mapping_t; - -typedef struct tiletype_s { - int id; - char name[SMALLBUFLEN]; - int lowness[TILEW]; - int solid; - int water; - int spikes; - SDL_Surface *img; - struct tiletype_s *next; - struct tiletype_s *prev; -} tiletype_t; -tiletype_t *tiletype; - -typedef struct initialmonster_s { - int startx; - int starty; - int id; - char *help; -} initialmonster_t; - -typedef struct text_s { - int x,y; - int size; - int maxsize; - int state; - int delay; // how long to stay on screen - char txt[BUFLEN]; - SDL_Rect bgarea; - SDL_Surface *bg; - SDL_Surface *img; - SDL_Color *c; - struct text_s *next; - struct text_s *prev; -} text_t; - -typedef struct level_s { - int id; - int bgtileid; - char name[SMALLBUFLEN]; - int map[LEVELW*LEVELH]; - struct level_s *next; - struct level_s *prev; - int p1x; /* player 1 start pos */ - int p1y; - int nummonsters; - initialmonster_t initm[MAXMONSTERSPERLEVEL]; - int hurryuptime; -} level_t; -level_t *level; - -typedef struct sprite_s { - int id; - double speed; - - int score; - - int falling; - int fallspeed; - int jumping; - int jumpdir; - - int willbecome; - - int angry; - - int teleporting; - - int dead; - int invuln; - int bounces; - - struct sprite_s *caughtby; - int caughtstate; - - int jumpspeed; - int climbing; - int slamming; - double slamangle; - int netting; - int netcaught; - int netmax; - int netspeed; - int netdir; - int netlen; - int netbig; - int nety; - int netxstart; - int netystart; - - int timer; - int jumptimer; - - int moved; - - int flies; - - double xs,ys; - - struct sprite_s *bullet; - struct sprite_s *owner; - - double x,y; - int dir; - SDL_Surface *img; - SDL_Surface *netbg; - struct sprite_s *next; - struct sprite_s *prev; - char name[MIDBUFLEN]; -} sprite_t; - -typedef struct imageset_s { - SDL_Surface *img[MAXFRAMES*4]; - int numimages; -} imageset_t; -imageset_t imageset[MAXPTYPES]; - - void cleanup(void); int addtext(int x, int y, int size, char *string, SDL_Color *c, int delay); void drawscore(void); @@ -242,20 +6,12 @@ void movetext(void); void killtext(text_t *t); void removeall(void); void removetext(void); -sprite_t *addsprite(int id,int x, int y, char *name, int initial); -int loadtiletypes(char *filename); -tiletype_t *gettileat(int pixx,int pixy, int *tilex, int *tiley); -int loadlevel(int wnum, int lnum); -int loadimagesets(void); void drawlevel(void); -void drawtile(SDL_Surface *s, int x, int y); void removesprite(sprite_t *s); void removenetting(sprite_t *s); -void drawsprite(sprite_t *s); void drawnetting(sprite_t *s); void dogravity(sprite_t *s); void dotileeffects(sprite_t *s); -void flip(void); int movex(sprite_t *s,double amt); void movesprite(sprite_t *s); int isinwater(sprite_t *s); @@ -265,31 +21,17 @@ int isonground(sprite_t *s); int isongroundpoint(sprite_t *s, int x, int y); int isonladder(sprite_t *s); int isladderabove(sprite_t *s); -int isfruit(int id); int dofruiteffect(sprite_t *s); int ismonster(int id); -int isbullet(int id); -void killsprite(sprite_t *s); void checkcollide(sprite_t *s); void die(sprite_t *s); void nextlevel(void); void jump(sprite_t *s, int dir); double getspeed(sprite_t *s ); void adjustheight(sprite_t *s); -void setdefaults(sprite_t *s); void tick(void); void usage(void); -int chartomonster(char ch); -inline void drawpixel16(SDL_Surface *screen, int x, int y, SDL_Color c); -inline void drawpixel32(SDL_Surface *screen, int x, int y, SDL_Color c); -inline void drawbox16(SDL_Surface *screen, int x1,int y1,int x2,int y2,SDL_Color *c,SDL_Color *fc); -void drawline16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c); -int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col); - -/////////////////////////////////////// -void drawpalette(void); -void drawsprites(void); diff --git a/shared.c b/shared.c new file mode 100644 index 0000000..fb981fc --- /dev/null +++ b/shared.c @@ -0,0 +1,1309 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "defs.h" +#include "globals.h" +#include "shared.h" + + +int loadlevel(int wnum, int lnum) { + FILE *f; + int x,y; + char buf[BUFLEN]; + char buf2[BUFLEN]; + char filename[BUFLEN]; + char *help[MAXHELP]; + int numhelp = 0; + int curhelp; + char *p; + int tileid; + int i; + mapping_t mapping[MAXMAPPINGS]; + int nmappings = 0; + tiletype_t *lasttile; + int newversion; + + + level = malloc(sizeof(level_t)); + + level->id = 0; + sprintf(level->name, "Level %d-%d",wnum,lnum); + level->prev = NULL; + level->next = NULL; + + /* default */ + level->hurryuptime = 30; + level->p1x = 0; + level->p1y = 0; + + 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 */ + while (tiletype != NULL) { + tiletype_t *tt; + + /* kill first tile */ + if (tiletype->img) { + SDL_FreeSurface(tiletype->img); + tiletype->img = NULL; + tt = tiletype->next; + free(tiletype); + tiletype = tt; + } + } + + /* clear player linked list */ + if (sprite != NULL) { + while (sprite->next) { + killsprite(sprite->next); + } + } + + /* read tileset */ + fgets(buf, BUFLEN, f); + if (strstr(buf, "tileset") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + + /* strip newline */ + p[strlen(p)-1] = '\0'; + + strcat(p, ".tiles"); + + if (loadtiletypes(p)) { + printf("Cannot load tileset file: %s\n", p); + return B_TRUE; + } + + } else { + printf("invalid tileset file in line: '%s'\n",buf); + return B_TRUE; + } + + /* read background tile */ + fgets(buf, BUFLEN, f); + if (strstr(buf, "bg") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + level->bgtileid = atoi(p); + if (!gettile(level->bgtileid)) { + printf("invalid background tile id: %d\n",level->bgtileid); + return B_TRUE; + } + //printf("Background tile id is %d (%s)\n",level->bgtileid,(gettile(level->bgtileid)->name)); + } else { + printf("invalid background tile id line: '%s'\n",buf); + return B_TRUE; + } + + /* read hurryup time tile */ + fgets(buf, BUFLEN, f); + if (strstr(buf, "hurryup") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + level->hurryuptime = atoi(p); + //printf("Hurryup time is %d\n",level->hurryuptime); + } else { + printf("invalid hurryup time line: '%s'\n",buf); + return B_TRUE; + } + + level->nummonsters = 0; + + /* read tile defs */ + nmappings = 0; + fgets(buf, BUFLEN, f); + while (!strstr(buf, "endmaps")) { + strncpy(buf2,buf,BUFLEN); + p = strtok(buf2, ","); + if (p == NULL) { + printf("invalid char->tile mapping: '%s'\n",buf); + return B_TRUE; + } + mapping[nmappings].ch = p[0]; + p = strtok(NULL, ","); + if (p == NULL) { + printf("invalid char->tile mapping: '%s'\n",buf); + return B_TRUE; + } + mapping[nmappings].tnum = atoi(p); + printf("got mapping: '%c' to %d\n",mapping[nmappings].ch,mapping[nmappings].tnum); + nmappings++; + fgets(buf, BUFLEN, f); + } + + fgets(buf, BUFLEN, f); + /* read help messages if present */ + if (strstr(buf, "help")) { + curhelp = 0; // used later + numhelp = 0; + fgets(buf, BUFLEN, f); + while (!strstr(buf, "endhelp")) { + // strip newline + buf[strlen(buf)-1] = '\0'; + help[numhelp] = strdup(buf); + numhelp++; + fgets(buf, BUFLEN, f); + } + + /* this reads the first line of the level */ + fgets(buf, BUFLEN, f); + } + /* read monster definitions if present */ + if (strstr(buf, "monsters")) { + fgets(buf, BUFLEN, f); + while (!strstr(buf, "endmonsters")) { + char ch; + int monid; + int x,y; + // strip newline + buf[strlen(buf)-1] = '\0'; + + strncpy(buf2,buf,BUFLEN); + p = strtok(buf2, " "); + if (p == NULL) { + printf("invalid monster definition (missing type): '%s'\n",buf); + return B_TRUE; + } + ch = p[0]; // type of monster + monid = chartomonster(ch); + if (monid < 0) { + printf("invalid monster definition (invalid type): '%s'\n",buf); + return B_TRUE; + } + + p = strtok(NULL, " "); + if (p == NULL) { + printf("invalid monster definition (missing x): '%s'\n",buf); + return B_TRUE; + } + x = atoi(p); // monster x pos + + p = strtok(NULL, " "); + if (p == NULL) { + printf("invalid monster definition (missing y): '%s'\n",buf); + return B_TRUE; + } + y = atoi(p); // monster y pos + + + if (monid == P_PLAYER) { + level->p1x = x; + level->p1y = y; + } else { + /* place the monster */ + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = monid; + + if (monid == P_HELP) { + if (curhelp >= numhelp) { + printf("Error in level - more help icons than help texts.\n"); + exit(1); + } else { + level->initm[level->nummonsters].help = strdup(help[curhelp]); + curhelp++; + } + } + + level->nummonsters++; + } + + + fgets(buf, BUFLEN, f); + } + + /* this reads the first line of the level */ + fgets(buf, BUFLEN, f); + } + + /* check whether we've got a new or old level version */ + if (strstr(buf, ",")) { + /* new version */ + newversion = B_TRUE; + printf("Level data is new version.\n"); + } else { + /* old version */ + newversion = B_FALSE; + printf("Level data is old version.\n"); + } + + x = 0; + y = 0; + while (!feof(f)) { + /* process a line of level data */ + if (newversion) { + strncpy(buf2, buf, BUFLEN); + p = strtok(buf2, ","); + while (p) { + tileid = atoi(p); + /* validate it */ + if (!gettile(tileid)) { + printf("invalid tileid: %d\n",tileid); + fclose(f); + return B_TRUE; + } + if (x > LEVELW) { + printf("Too many tiles on line %d: %d,%d\n",y,x,y); + fclose(f); + return B_TRUE; + } + if (y >= LEVELH) { + printf("Too many lines at line %d: %d,%d\n",y,x,y); + fclose(f); + return B_TRUE; + } + /* all okay */ + level->map[y*LEVELW+x] = tileid; + + x++; + p = strtok(NULL, ","); + } + + } else { /* old level data version */ + for (p = buf; *p; p++) { + int n,found = 0; + /* search mappings */ + for (n = 0; n < nmappings; n++) { + if (mapping[n].ch == *p) { + tileid = mapping[n].tnum; + found = B_TRUE; + break; + } + } + if (!found) { + + if (*p == '~') { + tileid = T_LAND; + } else if (*p == '=') { + tileid = T_LADDER; + } else if (*p == '-') { + tileid = T_LADDERTOP; + } else if (*p == '{') { + tileid = T_WATERTOP; + } else if (*p == '}') { + tileid = T_WATER; + } else if (*p == '>') { + tileid = T_RIGHT; + } else if (*p == '<') { + tileid = T_LEFT; + } else if (*p == '^') { + tileid = T_SPIKES; + } else if (*p == '|') { + tileid = T_WATERSPIKES; + } else if (*p == 'c') { + tileid = level->bgtileid; + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = P_CLOUD; + level->nummonsters++; + } else if (*p == 'r') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + + // tileid = level->bgtileid; + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = P_RAT; + level->nummonsters++; + + } else if (*p == 'S') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + + // tileid = level->bgtileid; + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = P_SNAKE; + level->nummonsters++; + } else if (*p == 'a') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = P_BEE; + level->nummonsters++; + } else if (*p == 's') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+TILEH; + level->initm[level->nummonsters].id = P_SPIDER; + level->nummonsters++; + } else if (*p == '?') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + + // tileid = level->bgtileid; + level->initm[level->nummonsters].startx = x*TILEW+(TILEW/2); + level->initm[level->nummonsters].starty = y*TILEH+(TILEH-2); + level->initm[level->nummonsters].id = P_HELP; + + if (curhelp >= numhelp) { + printf("Error in level - more help icons than help texts.\n"); + exit(1); + } else { + level->initm[level->nummonsters].help = strdup(help[curhelp]); + curhelp++; + } + + level->nummonsters++; + } else if (*p == '*') { + tileid = T_FULL; + } else if (*p == ';') { + tileid = T_TELEPORT; + } else if (*p == ':') { + tileid = T_TELEPORT2; + } else if (*p == '.') { + tileid = T_TELEPORTDEST; + } else if (*p == '/') { + tileid = T_SLOPEUP; + } else if (*p == '\\') { + tileid = T_SLOPEDOWN; + } else if (*p == '1') { + /* figure out background type */ + if (lasttile->solid) { + tileid = level->map[(y-1)*LEVELW+x]; + } else { + tileid = lasttile->id; + } + level->p1x = x; + level->p1y = y; + } else { + tileid = level->bgtileid; + } + } + if (!gettile(tileid)) { + printf("invalid tileid: %d\n",tileid); + fclose(f); + return B_TRUE; + } + if (x > LEVELW) { + printf("Too many tiles on line %d: %d,%d\n",y,x,y); + fclose(f); + return B_TRUE; + } + if (y >= LEVELH) { + printf("Too many lines at line %d: %d,%d\n",y,x,y); + fclose(f); + return B_TRUE; + } + level->map[y*LEVELW+x] = tileid; + + lasttile = gettile(tileid); + x++; + } + } /* if newversion */ + + /* make sure enough data was found */ + if (x < LEVELW+1) { + printf("Not enough tiles on line: y = %d\n",y); + fclose(f); + return B_TRUE; + } + + /* go to next line */ + y++; + x = 0; + fgets(buf, BUFLEN, f); + } + fclose(f); + + if ((numhelp > 0) && (curhelp != numhelp)) { + printf("WARNING: Unused help text. First unused is '%s'\n",help[curhelp]); + } + + if (y < LEVELH) { + printf("Not enough lines in level: last y=%d, should be %d.\n", + y,LEVELH); + return B_TRUE; + } + + if ((level->p1x == 0) || (level->p1y == 0)) { + printf("Level is missing player 1 start position.\n"); + return B_TRUE; + } + + /* free help texts */ + for (i = 0; i < numhelp; i++) { + free(help[i]); + } + + /* set current level pointer */ + curlevel = level; + + /* add player */ + if (player == NULL) { + addsprite(P_PLAYER, (curlevel->p1x * TILEW) + (TILEW/2), + (curlevel->p1y * TILEH) + TILEH-2 , "Player" , B_TRUE); + } 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]; + if (level->initm[i].id == P_HELP) { + strncpy(name, level->initm[i].help, MIDBUFLEN); + } else { + strcpy(name, "Monster"); + } + addsprite(level->initm[i].id, + level->initm[i].startx, level->initm[i].starty, name, B_TRUE); + } + + gtime = 0; + + return B_FALSE; +} + + + +void setdefaults(sprite_t *s) { + s->speed = 1; + s->teleporting = 0; + s->climbing = 0; + s->jumping = 0; + s->jumpspeed = 0; + s->jumpdir = 1; + s->netting = 0; + s->netmax = 1; + s->netcaught = 0; + s->netbig = 0; + s->falling = 0; + s->fallspeed = 0; + s->dir = 1; + s->slamming = 0; + s->dead = 0; + s->angry = 0; + s->invuln = 0; + s->jumptimer = 0; + + s->bullet = NULL; + s->owner = NULL; + + s->willbecome = P_CHEESE; + + switch (s->id) { + case P_BEE: + case P_CLOUD: + s->flies = B_TRUE; + break; + default: + s->flies = B_FALSE; + break; + + } + + switch (s->id) { + case P_CHEESE: + s->score = 500; + break; + case P_ICECREAM: + s->score = 1000; + break; + case P_CHIPS: + s->score = 2000; + break; + case P_BURGER: + s->score = 4000; + break; + default: + s->score = 0; + break; + + } + + s->caughtby = NULL; + s->caughtstate = 0; + + s->xs = -99; + s->ys = -99; + + s->doomcount = 0; +} + +/* 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 *s; + + if (sprite == NULL) { + sprite = malloc(sizeof(sprite_t)); + s = sprite; + s->prev = NULL; + } else { + s = lastsprite; + s->next = malloc(sizeof(sprite_t)); + s->next->prev = s; + + s = s->next; + } + + + s->id = id; + s->x = x; + s->y = y; + if (s->id == P_CLOUD) { + s->img = rotozoomSurfaceXY(imageset[id].img[F_WALK1],0,1,1,0); + } else { + s->img = imageset[id].img[F_WALK1]; + } + if (s->y > (480 - TILEH-1)) { + s->y = 480 - TILEH-1; + } + strcpy(s->name, name); + + if (s == sprite) { + s->netbg = SDL_CreateRGBSurface(SDL_SWSURFACE, + 200, 64, + screen->format->BitsPerPixel, screen->format->Rmask, + screen->format->Gmask,screen->format->Bmask, + screen->format->Amask); + } else { + s->netbg = NULL; + } + + setdefaults(s); + + if (!initial) { + if (isfruit(s->id)) { + if (s->id != P_HELP) { // help icons don't time out + s->doomcount = 500; + } + } + } + + s->next = NULL; + + lastsprite = s; + + return s; +} + + + +tiletype_t *gettileat(int pixx,int pixy, int *tilex,int *tiley) { + int tx,ty; + tx = pixx / TILEW; + ty = pixy / TILEH; + if (tilex != NULL) { + *tilex = tx; + } + if (tiley != NULL) { + *tiley = ty; + } + + return gettile(curlevel->map[ty*LEVELW+tx]); +} + +int loadtiletypes(char *filename) { + tiletype_t *t = NULL; + int i; + int state; + FILE *f; + char buf[BUFLEN]; + char *p,*pp; + + int uniq = 0 ; + + state = 0; + f = fopen(filename,"rt"); + if (!f) { + printf("can't open tiles file\n"); + return B_TRUE; + } + + fgets(buf, BUFLEN, f); + while (!feof(f)) { + if (state == 0) { + if (strstr(buf, "tile") == buf) { + if (t == NULL) { + tiletype = malloc(sizeof(tiletype_t)); + t = tiletype; + t->prev = NULL; + } else { + t->next = malloc(sizeof(tiletype_t)); + t->next->prev = t; + + t = t->next; + } + p = strtok(buf, " "); + p = strtok(NULL, " "); + /* strip newline */ + p[strlen(p)-1] = '\0'; + strcpy(t->name, p); + + /* defaults */ + t->id = 0; + t->water = B_FALSE; + t->spikes = B_FALSE; + t->solid = B_TRUE; + for (i = 0; i < TILEW; i++) { + t->lowness[i] = 0; + } + t->img = NULL; + t->next = NULL; + state = 1; + + /* unique id */ + t->uniqid = uniq; + uniq++; + } + } else if (state == 1) { /* inside a definition */ + if (strstr(buf, "end") == buf) { + //printf("got tile %d: %s (solid=%d)\n",t->id,t->name,t->solid); + state = 0; + } else if (strstr(buf, "id") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + t->id = atoi(p); + } else if (strstr(buf, "lowness") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + pp = strtok(p, ","); + for (i = 0;i < TILEW; i++) { + t->lowness[i] = atoi(pp); + pp = strtok(NULL, ","); + } + } else if (strstr(buf, "solid") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + t->solid = atoi(p); + } else if (strstr(buf, "spikes") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + t->spikes = atoi(p); + } else if (strstr(buf, "water") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + t->water = atoi(p); + } else if (strstr(buf, "file") == buf) { + p = strtok(buf, " "); + p = strtok(NULL, " "); + if (t->img) { + SDL_FreeSurface(t->img); + t->img = NULL; + } + /* strip newline */ + p[strlen(p)-1] = '\0'; + t->img = IMG_Load(p); + if (!t->img) { + printf("cannot load tile image file: '%s'\n",p); + fclose(f); + return B_TRUE; + } + SDL_SetColorKey(t->img, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); + + } + } + fgets(buf, BUFLEN, f); + } + + fclose(f); + return B_FALSE; + +} + +int loadimagesets(void) { + int p,i; + SDL_Surface *tempimg; + + SDL_Surface *reds; + + imageset[P_PLAYER].img[F_WALK1] = IMG_Load("sprites/pdwarf.png"); + imageset[P_PLAYER].img[F_JUMP] = IMG_Load("sprites/pdwarfjump.png"); + imageset[P_PLAYER].img[F_FALL] = IMG_Load("sprites/pdwarffall.png"); + imageset[P_PLAYER].img[F_CAUGHT] = IMG_Load("sprites/pdwarf.png"); + imageset[P_PLAYER].img[F_DEAD] = IMG_Load("sprites/dwarfdie.png"); + /* next 3 are auto generated */ + imageset[P_PLAYER].img[F_CLIMB1] = IMG_Load("sprites/dclimb1.png"); + imageset[P_PLAYER].img[F_CLIMB2] = IMG_Load("sprites/dclimb2.png"); + imageset[P_PLAYER].numimages = 10; + + imageset[P_SNAKE].img[F_WALK1] = IMG_Load("sprites/snake.bmp"); + imageset[P_SNAKE].img[F_JUMP] = IMG_Load("sprites/snakejump.bmp"); + imageset[P_SNAKE].img[F_FALL] = IMG_Load("sprites/snakejump.bmp"); + imageset[P_SNAKE].img[F_CAUGHT] = IMG_Load("sprites/snakecaught.bmp"); + imageset[P_SNAKE].img[F_DEAD] = IMG_Load("sprites/snakedead.bmp"); + /* next 3 are auto generated */ + imageset[P_SNAKE].numimages = 8; + + + imageset[P_RAT].img[F_WALK1] = IMG_Load("sprites/rat.bmp"); + imageset[P_RAT].img[F_JUMP] = IMG_Load("sprites/ratjump.bmp"); + imageset[P_RAT].img[F_FALL] = IMG_Load("sprites/ratjump.bmp"); + imageset[P_RAT].img[F_CAUGHT] = IMG_Load("sprites/ratcaught.bmp"); + imageset[P_RAT].img[F_DEAD] = IMG_Load("sprites/ratdead.bmp"); + /* next 3 are auto generated */ + imageset[P_RAT].numimages = 8; + + imageset[P_BEE].img[F_WALK1] = IMG_Load("sprites/bee.bmp"); + imageset[P_BEE].img[F_JUMP] = IMG_Load("sprites/beejump.bmp"); + imageset[P_BEE].img[F_FALL] = IMG_Load("sprites/beejump.bmp"); + imageset[P_BEE].img[F_CAUGHT] = IMG_Load("sprites/beecaught.bmp"); + imageset[P_BEE].img[F_DEAD] = IMG_Load("sprites/beedead.bmp"); + /* next 3 are auto generated */ + imageset[P_BEE].numimages = 8; + + imageset[P_SPIDER].img[F_WALK1] = IMG_Load("sprites/spider.bmp"); + imageset[P_SPIDER].img[F_JUMP] = IMG_Load("sprites/spiderjump.bmp"); + imageset[P_SPIDER].img[F_FALL] = IMG_Load("sprites/spiderfall.bmp"); + imageset[P_SPIDER].img[F_CAUGHT] = IMG_Load("sprites/spidercaught.bmp"); + imageset[P_SPIDER].img[F_DEAD] = IMG_Load("sprites/spiderdead.bmp"); + /* next 3 are auto generated */ + imageset[P_SPIDER].numimages = 8; + + imageset[P_CLOUD].img[F_WALK1] = IMG_Load("sprites/cloud.bmp"); + imageset[P_CLOUD].img[F_JUMP] = IMG_Load("sprites/cloud.bmp"); + imageset[P_CLOUD].img[F_FALL] = IMG_Load("sprites/cloud.bmp"); + imageset[P_CLOUD].img[F_CAUGHT] = IMG_Load("sprites/cloud.bmp"); + imageset[P_CLOUD].img[F_DEAD] = IMG_Load("sprites/cloud.bmp"); + imageset[P_CLOUD].numimages = 2; + + imageset[P_CHEESE].img[F_WALK1] = IMG_Load("sprites/cheese.bmp"); + imageset[P_CHEESE].numimages = 1; + + imageset[P_ICECREAM].img[F_WALK1] = IMG_Load("sprites/icecream.bmp"); + imageset[P_ICECREAM].numimages = 1; + + imageset[P_CHIPS].img[F_WALK1] = IMG_Load("sprites/chips.bmp"); + imageset[P_CHIPS].numimages = 1; + + imageset[P_BURGER].img[F_WALK1] = IMG_Load("sprites/burger.bmp"); + imageset[P_BURGER].numimages = 1; + + imageset[P_SPEED].img[F_WALK1] = IMG_Load("sprites/speed.bmp"); + imageset[P_SPEED].numimages = 1; + + imageset[P_NUMNETS].img[F_WALK1] = IMG_Load("sprites/numnets.bmp"); + imageset[P_NUMNETS].numimages = 1; + + imageset[P_BIGNET].img[F_WALK1] = IMG_Load("sprites/bignet.bmp"); + imageset[P_BIGNET].numimages = 1; + + imageset[P_HELP].img[F_WALK1] = IMG_Load("sprites/help.bmp"); + imageset[P_HELP].numimages = 1; + + /* bullets */ + imageset[P_SPIT].img[F_WALK1] = IMG_Load("sprites/spit.bmp"); + imageset[P_SPIT].numimages = 1; + + + + + /* generate rotated/flipped images */ + for (p = 0; p < MAXPTYPES; p++) { + if (!isfruit(p) && !isbullet(p)) { + tempimg = rotozoomSurface(imageset[p].img[F_DEAD],90,1,0); + imageset[p].img[F_DEAD2] = SDL_DisplayFormat(tempimg); + + tempimg = rotozoomSurface(imageset[p].img[F_DEAD],180,1,0); + imageset[p].img[F_DEAD3] = SDL_DisplayFormat(tempimg); + + tempimg = rotozoomSurface(imageset[p].img[F_DEAD],270,1,0); + imageset[p].img[F_DEAD4] = SDL_DisplayFormat(tempimg); + } + + for (i = 0; i < imageset[p].numimages; i++) { + SDL_Surface *origi; + + SDL_SetColorKey(imageset[p].img[i], + SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); + + origi = imageset[p].img[i]; + + + /* flipped image */ + imageset[p].img[MAXFRAMES+i] = + rotozoomSurfaceXY(imageset[p].img[i], 0, -1,1,0); + SDL_SetColorKey(imageset[p].img[MAXFRAMES+i], + SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0, 0, 0)); + + + + /* angry image */ + reds = SDL_CreateRGBSurface(SDL_SWSURFACE, + origi->w, + origi->h, + origi->format->BitsPerPixel, origi->format->Rmask, + origi->format->Gmask,origi->format->Bmask, 0); + SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); + SDL_SetAlpha(reds, SDL_SRCALPHA,100); + + imageset[p].img[MAXFRAMES*2+i] = rotozoomSurfaceXY(origi, 0, 1,1,0); + + + SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*2+i], NULL); + SDL_FreeSurface(reds); + + temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*2+i]); + SDL_FreeSurface(imageset[p].img[MAXFRAMES*2+i]); + imageset[p].img[MAXFRAMES*2+i] = temps; + + SDL_SetColorKey(imageset[p].img[MAXFRAMES*2+i], + SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*2+i]->format, 101, 0, 0)); + + + /* flipped angry image */ + reds = SDL_CreateRGBSurface(SDL_SWSURFACE, + origi->w, + origi->h, + origi->format->BitsPerPixel, origi->format->Rmask, + origi->format->Gmask,origi->format->Bmask, 0); + SDL_FillRect(reds, NULL, SDL_MapRGB(reds->format, 255, 0, 0)); + SDL_SetAlpha(reds, SDL_SRCALPHA,100); + + imageset[p].img[MAXFRAMES*3+i] = rotozoomSurfaceXY(origi, 0, -1,1,0); + + + SDL_BlitSurface(reds, NULL, imageset[p].img[MAXFRAMES*3+i], NULL); + SDL_FreeSurface(reds); + + temps = SDL_DisplayFormat(imageset[p].img[MAXFRAMES*3+i]); + SDL_FreeSurface(imageset[p].img[MAXFRAMES*3+i]); + imageset[p].img[MAXFRAMES*3+i] = temps; + + SDL_SetColorKey(imageset[p].img[MAXFRAMES*3+i], + SDL_SRCCOLORKEY, SDL_MapRGB(imageset[p].img[MAXFRAMES*3+i]->format, 101, 0, 0)); + + } + } + + return B_FALSE; +} + + +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 (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->jumping) { + frame = F_JUMP; + } else if (s->falling) { + frame = F_FALL; + } 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 */ + if (s->dir == -1) { + frame += MAXFRAMES; + } + /* make red if required */ + if (s->angry) { + frame += (MAXFRAMES*2); + } + + if ((s->id != P_CLOUD) && (!s->teleporting)) { + s->img = imageset[s->id].img[frame]; + } + + + /* spider's climbing web */ + if ((s->id == P_SPIDER) && ((s->ys != -99) || s->falling) && (!s->dead) && (!s->caughtby)) { + tiletype_t *tt; + int x = s->x; + int y = s->y - s->img->h/2; + int tx=0,ty = 0; + int done = B_FALSE; + for (y = s->y ; !done ; y-= TILEH) { + tt = gettileat(x,y,&tx,&ty); + if ((tt == NULL) || (tt->solid)) { + done = B_TRUE; + } + } + drawline16(screen,s->x,s->y - (s->img->h/2),s->x,ty*TILEH+TILEH-1,white); + + } + + + area.x = s->x - (s->img->w/2); + area.y = s->y - (s->img->h); + area.w = 0; + area.h = 0; + + if (area.y < (480-s->img->h)) { + if (s->invuln) { + if (timer % 2 == 0) { + SDL_BlitSurface(s->img, NULL, screen, &area); + } + } else { + SDL_BlitSurface(s->img, NULL, screen, &area); + /* for opengl */ + //SDL_UpdateRect(screen, area.x, area.y, area.w, area.h); + } + } + + + /* caughtby lines */ + if ((s->caughtby) && (s->caughtstate == 2)){ + drawline16(screen, s->x,s->y - s->img->h, + s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); + drawline16(screen, s->x,s->y - (s->img->h/2), + s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); + drawline16(screen, s->x,s->y, + s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); + } + + +} + + +void killsprite(sprite_t *s) { + sprite_t *nextone, *lastone; + sprite_t *s2; + + /* remove references to this sprite before removing it */ + for (s2 = sprite ; s2 ; s2 = s2->next) { + if (s2->owner == s) { + s2->owner = NULL; + } + if (s2->bullet == s) { + s2->bullet = NULL; + } + } + + nextone = s->next; + if (nextone != NULL) { + nextone->prev = s->prev; + } else { /*last sprite */ + lastsprite = s->prev; + } + + if (s->prev == NULL) { + /* first sprite */ + nextone = sprite->next; + free(sprite); + sprite = nextone; + } else { + lastone = s->prev; + free (lastone->next ); + lastone->next = nextone; + } + + +} + +void flip(void) { + #ifdef OPENGL + SDL_GL_SwapBuffers(); + SDL_UpdateRect(screen,0,0,screen->w,screen->h); + #else + SDL_Flip(screen); + #endif +} + +int isfruit(int id) { + switch (id) { + case P_CHEESE: + case P_ICECREAM: + case P_CHIPS: + case P_BURGER: + case P_SPEED: + case P_NUMNETS: + case P_BIGNET: + case P_HELP: + return B_TRUE; + + } + + return B_FALSE; +} + +int isbullet(int id) { + if (id == P_SPIT) return B_TRUE; + + return B_FALSE; +} + + +inline void drawpixel16(SDL_Surface *screen, int x, int y, SDL_Color c) +{ + Uint16 *bufp; + + /* check x/y */ + if (x >= screen->w) return; + if (y >= screen->h) return; + if (x < 0) return; + if (y < 0) return; + + bufp = (Uint16 *)screen->pixels + (y*screen->pitch / 2) + x; + *bufp = SDL_MapRGB(screen->format, c.r, c.g, c.b); +} + + +void drawline16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c) { + int deltax, deltay; + int numpixels; + int d; + int dinc1,dinc2,xinc1,xinc2,yinc1,yinc2; + int i; + int x; + int y; + int maskcount = 0; + int maskindex = 0; + + + + deltax = (x2 - x1); + if (deltax < 0) deltax = -deltax; + deltay = (y2 - y1); + if (deltay < 0) deltay = -deltay; + + if (deltax >= deltay) { + numpixels = deltax + 1; + d = (deltay*2) - deltax; + dinc1 = deltay << 1; + dinc2 = (deltay-deltax) << 1; + xinc1 = 1; + xinc2 = 1; + yinc1 = 0; + yinc2 = 1; + } else { + numpixels = deltay + 1; + d = (deltax*2) - deltay; + dinc1 = deltax << 1; + dinc2 = (deltax - deltay) << 1; + xinc1 = 0; + xinc2 = 1; + yinc1 = 1; + yinc2 = 1; + } + + if (x1 > x2) { + xinc1 = - xinc1; + xinc2 = - xinc2; + } + if (y1 > y2) { + yinc1 = - yinc1; + yinc2 = - yinc2; + } + + x = x1; y = y1; + + maskcount = 0; + maskindex = 0; + for (i = 0; i < numpixels; i++) { + + drawpixel16(screen,x,y,c); + + + + if (d < 0) { + d += dinc1; + x += xinc1; + y += yinc1; + } else { + d += dinc2; + x += xinc2; + y += yinc2; + } + } +} + + +void drawbox16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color *c, SDL_Color *fc) { + if (fc != NULL) { + /* fill */ + if (((x2 - x1) >= 2) && ((y2 - y1) >= 2)) { + int y; + for (y = (y1+1) ; y <= (y2-1); y++) { + drawline16(screen, x1+1, y, x2-1,y,*fc); + } + } + } + drawline16(screen,x1,y1,x2,y1,*c); + drawline16(screen,x1,y1,x1,y2,*c); + drawline16(screen,x1,y2,x2,y2,*c); + drawline16(screen,x2,y1,x2,y2,*c); +} + + + +int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col) { + Uint32 pixel; + int bpp = dest->format->BytesPerPixel; + char *ppos; + unsigned char r,g,b,a; + + + ppos = (char *) dest->pixels; + + /* offset y */ + ppos += (dest->pitch * y); + /* offset x */ + ppos += (bpp * x); + + memcpy(&pixel, ppos, bpp); + + + if (dest->format->BitsPerPixel == 32) { + SDL_GetRGBA(pixel, dest->format, &r,&g,&b, &a); + col->r = r; + col->g = g; + col->b = b; + col->unused = a; + } else if (dest->format->BitsPerPixel == 16) { + SDL_GetRGB(pixel, dest->format, &r,&g,&b); + col->r = r; + col->g = g; + col->b = b; + } else if (dest->format->BitsPerPixel == 8) { + *col = dest->format->palette->colors[(Uint8)pixel]; + } + + + return 0; + + +} + + +int chartomonster(char ch) { + switch (ch) { + case 'c': return P_CLOUD; + case 'r': return P_RAT; + case 'S': return P_SNAKE; + case 'a': return P_BEE; + case 's': return P_SPIDER; + case '?': return P_HELP; + case '1': return P_PLAYER; + } + + return -1; +} +char monstertochar(int id ) { + switch (id) { + case P_CLOUD: return 'c'; + case P_RAT: return 'r'; + case P_SNAKE: return 'S'; + case P_BEE: return 'a'; + case P_SPIDER: return 's'; + case P_HELP: return '?'; + case P_PLAYER: return '1'; + } + + return '\0'; +} + +tiletype_t *gettile(int tid) { + tiletype_t *t; + + for (t = tiletype; t ; t = t->next) { + if (t->uniqid == tid) return t; + } + + return &fakeblock; +} + +void drawtile(SDL_Surface *where, int x, int y) { + SDL_Rect area; + tiletype_t *tt; + + if ((x < 0) || (y < 0) || (x >= LEVELW) || (y >= LEVELH)) { + return; + } + + area.x = x * TILEW; + area.y = y * TILEH; + area.w = 0; + area.h = 0; + /* draw blank tile first */ + tt = gettile(curlevel->bgtileid); + SDL_BlitSurface(tt->img, NULL, where, &area); + + tt = gettile(curlevel->map[y*LEVELW+x]); + if (tt->id != curlevel->bgtileid) { + SDL_BlitSurface(tt->img, NULL, where, &area); + } +} + +void initglobals(void) { + sprite = NULL; + + vidargs = 0; + + /* timers */ + gtime = 0; + timer = 0; + toggletimer = 0; + + /* colours */ + red.r = 255; red.g = 0; red.b = 0; + black.r = 0; black.g = 0; black.b = 0; + 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; +} diff --git a/shared.h b/shared.h new file mode 100644 index 0000000..5608877 --- /dev/null +++ b/shared.h @@ -0,0 +1,30 @@ +#ifndef __SHARED_H +#define __SHARED_H + +#include +#include "defs.h" + +/* functions */ +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); +tiletype_t *gettileat(int pixx,int pixy, int *tilex, int *tiley); +int loadimagesets(void); +int isbullet(int id); +void flip(void); +void killsprite(sprite_t *s); +void drawsprite(sprite_t *s); +int isfruit(int id); +inline void drawpixel16(SDL_Surface *screen, int x, int y, SDL_Color c); +inline void drawpixel32(SDL_Surface *screen, int x, int y, SDL_Color c); +inline void drawbox16(SDL_Surface *screen, int x1,int y1,int x2,int y2,SDL_Color *c,SDL_Color *fc); +void drawline16(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c); +int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col); +int chartomonster(char ch); +char monstertochar(int id); +tiletype_t *gettile(int tid); +void drawtile(SDL_Surface *s, int x, int y); +void initglobals(void); +#endif + diff --git a/work/cloud.png b/work/cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..36d87f7bb014edfdad8da6cd930aae3d0834ce4c GIT binary patch literal 1414 zcmV;11$p|3P)0000TbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAXI2&AV*0}Q14_VZU6uT{7FPXR7l6Am0gToRTano>tpY8&b>2pr)36fEd{l< zH8C1Y`Xup%D2WXi4I~ze2Pxc1YH!E9h)oIdf5w>^`tH2D)hd+w|I z_U!t$h;%{-&S%cNQ(9hLIv-@}dSAL? zfZOhVh?s%8Y3vs#zlA&ReWd;Ij~xEyLMyx9d6CRH#1z5IaL&Q0z&WjEv$_Z|(N()T zH4(XKU1ROli)T*1uy)_Hv6sx^0H8>g($60~{_g;vzvp{i}IYkHw?S)p_>GpXxt5H@{Y;F(#)E!hO*Ut4`n$+o) zCx3X)NDf_pV@05MDC2Ml&HiMD&;$&IBXqlc3`Zp(1t@2>m6jUyGJB_tzBngNgCRb{`@F?*%KnJ7^UiP6Z$Wk)a6a#^U75OssgBkItCFS%t$e!EGw89rruo!}}fRqeg=amA0DkINx6uC!;hHh_+vlsgl7Tyx3y)l8j($PT~?+wAu{1<>( z;yTbT&D=+m#hXCF2?=HdG6I7D5QrEg0%8V;U}i7_m>5py8ktp7oZsxHb6cZ_d!yzF z?|5H~Rwlz{6H+&s4c_z#Zn^V8v~%oh=lr-Z?Tv;@LRj@m@5wzcIT1LgaNZ*(L#7Pp z1X<>=&?-h_p0e(J=r+5hc^Zx^@T{SXszA;Nj#^>zTO%=GK-F#I8zO;4RXW^c9kAGDWO U-#~|5K>z>%07*qoM6N<$g2D5V2><{9 literal 0 HcmV?d00001 diff --git a/world1/ORIG.level7.dat b/world1/ORIG.level7.dat index 68db3e5..7caf730 100644 --- a/world1/ORIG.level7.dat +++ b/world1/ORIG.level7.dat @@ -5,30 +5,30 @@ endmaps *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000a00000000000000000* +*00000000S000000000000000000000000S0000* +*************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*000000r0000000000000000000000000000000* -*0~~-~~~~~00000000000000000000000000000* -*000=0000000000000000000000000000000000* -*000=0000000000~~~~~~000000000000000000* -*000=0000000000000000000000000000000000* -*000=000000000000000000000000000r000000* -*000=0000000000000000000000000~~~~~-~~~* -*000=000000000000000000000000000000=000* -*000=000000000000000000000000000000=000* -*000=000000000000000000000000000000=000* -*000=000000000000r^^000000000000000=000* -*000=00000~~~~~-~~~~~00000000000000=000* -*000=0000000000=0000000000000000000=000* -*000=0000000000=0000000000000000000=000* -*000=0000000000=000000000000r000000=000* -*000=0000000000=0000000~~~-~~~~0000=000* -*000=0000000000=0000000000=00000000=000* -*000=0000000000=0000000000=00000000=000* -*000=0000000000=0000000000=00000000=000* -*000=0000000000=0000000000=00000000=000* -*010=0000000000=0000000000=00000000=000* +*00r000000000000000000000000000000000r0* +*************00000000000000************* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000r00000000000000000000S00000000* +*************00000000000000************* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00S00000000000000000000000000000000r00* +*************00000000000000************* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*0000000000r00000000000000000000000S000* +*************00000000000000************* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00010000000000000000000000000000000000* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/world1/ORIG.level8.dat b/world1/ORIG.level8.dat index 8fcb251..c1351ac 100644 --- a/world1/ORIG.level8.dat +++ b/world1/ORIG.level8.dat @@ -1,34 +1,34 @@ -tileset castle +tileset green bg 0 -hurryup 30 +hurryup 90 endmaps +*000000000*0000000000000000000000000000* +*000000000*0000000000000000000000000000* +*000000000*0000000000000000000000000000* +*000000000****************************** +*000000000000000000000000000000s0000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*000000000a000000000000000000000000a000* *00000000000000000000000000000000000000* -*0000000000000000000000=000000000000000* -*000000000000000000r000=000000000000000* -*00r000000000000~~~~~~~-~~~~00000000000* -*~~~~~~\000000000000000=0000000000000r0* -********\00000000000000=000000000~~~~~~* -*********00000000000000=000000000000000* -*0000000000000000000000=000000000000000* -*00000000000~~~-~0000~~~~~000-~~~~~0000* -*00000000000000=0000000000000=000000000* -*00000000000000=0000000000000=000000000* -*00000000000000=0000000000000=000000000* -*00000000000000=0000000000000=000000000* -*00000000000000=0000000000000=000000000* -*00000000000000=000/~~~\00000=000000000* -*00000000000000=00/*****\0000=000000000* -*00000000/~~\00=0/*******\00/~\00000000* -*1000000/****~~~~*********~~***\0000000* -*~~{{{~~************************{{{{{{{* -*}}}}}}}}}}}}}s}}}}}*}}}}}s}}}}}}}}}}}}* -*}}}}}}}}}}}}}}}}}}}*}}}}}}}}}}}}}}}}}}* -*}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}* -*}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}* -*}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}* -*}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}* +*0.100000000000000000000000000000000r00* +****************000000000000000********* +*000000000000000000000000000000*0000000* +*000000000000000000000000000000*0r00000* +*000000000000000000000000000000*~~~~~~~* +*000000000000000000000000000000*0000000* +*000000000000000000000000000000*00000r0* +*0000000<<<<<<<<<<<<<<<<<<<<<<<*~~~~~~~* +*000000000000000000000000000000*0000000* +*000000000000000000000000000000*0000000* +*000000000000000000000000000000*00r0000* +*000000000000000000000000000000*~~~~~~~* +*000000000000000000000000000000*0000000* +*>>>>>>>>>>>>>>>>>>>>>>>>>00000*0000000* +*0000000000a0000000000000000000*000r000* +*000000000000000000000000000000*~~~~~~~* +*000000000000000000000000000000*0000000* +*0000a000000000000000000000^^^^*0000000* +*0;00000000000000000000000/*****0000000* +*0:0000000000000000000a00/******000r000* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/world1/ORIG.level9.dat b/world1/ORIG.level9.dat index 8d68997..d2410c3 100644 --- a/world1/ORIG.level9.dat +++ b/world1/ORIG.level9.dat @@ -2,33 +2,33 @@ tileset green bg 0 hurryup 30 endmaps -**************************************** *00000000000000000000000000000000000000* -*100000000000000000000000b0000000000000* -*~~~~~~~\00000000/~~~~\0000000000000000* -*********\000000/******\000000000000000* -**********\0000/********\00000r00000000* -***********\00/**********~~~~~~~000~{{{* -*000000000000000000********000000r0*}}}* -*000000000000000000********{{{{{~~~*}}}* -*000000000000000000********}}}}}****}}}* -*000000000000r000000000****}}}}}****}}}* -*~~-~~~~~~~~~~~~~{{{{{{****}}}}}****}}}* -***=***************}}}}****}}}}}****}}}* -***=****************}}}}}}}}}}}}}}}}}}}* -***=****************}}}}}}}}}}}}}}}}}}}* -***=****************}}}}}}}}}}}}}}}}}}}* -***=*****************}}}}}}}}r}}}}}}}}}* -***=*****************}}}}}}*****}}}}}}}* -***=*****************}}}}}}*000*}}}}}}}* -***=*****************}}}}}}*.00*}}}}}}}* -***=*****************}}}}}}*~{~*}}}}}}}* -***=*****************}}}}}}}}}}}}}}}}}}* -***=*****************}}}}}}}}}}}}}}}}}}* -***=******************}}}}}}}}}}}}}}}}}* -***=*******************}}}}}}}}}}}}}}}** -*00=000000000000000*****}}}}}}}}}}}}}*** -*00=000000000000000******}}}}}}}}}}}**** -*00=00000000000000;*******}}}}}}}}}***** -*00=0000000S000000:********}}}}}}}****** +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*000000000000000000a0000000000000000000* +*000000a0000000000000000000000000000000* +*00000000000000000000000000r00000000000* +***********000*******************000000* +*000000000s000000000000s000000000000000* +*00000000000000000000000000000000000000* +*0000000000000000000000000000000000~~~~* +*00000000000000000000000000000000000000* +*000000000000000000r0000000000000000000* +**-********000*******************000000* +*0=0s000*000000*0000s00*0000s00*0000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000000000* +*0=000000000000000000000000000000^^^000* +*~~~~~~~~~0000~~~~~~~~~~000~~00~~~~~~-~* +*000000000000000000000000000000000000=0* +*000000000000000000000000000000000000=0* +*000000000000000000000000000000000000=0* +*000000000000000000000000000000000000=0* +*0100000^^^^^^^^000000000000000000000=0* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/world1/level1.dat b/world1/level1.dat index 36293e2..1e36e7e 100644 --- a/world1/level1.dat +++ b/world1/level1.dat @@ -1,45 +1,44 @@ tileset green bg 0 hurryup 30 -z,10 endmaps help -Use X to jump, Z to catch a monster. -Once caught, use Down+Z to finish a monster! +Use X to jump, Z to catch the rat. +Once caught, Down+Z will slam and kill a monster! endhelp monsters -r 26 15 -? 11 19 -? 27 19 -1 5 19 +1 3 19 +r 27 15 +? 7 19 +? 12 19 endmonsters -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*000000000000000~~~~~~~~~~~~~0000000000* -*000000000000000000000000**00000000000** -*000000000000000000000000**000000000000* -*000000000000000000000000**000000000000* -*~~~~~~~~~~~~~~~~~~~~~~~~**~~~~~~~~~~~~* -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,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,4,4,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,0,0,0,0,0,0,0,4,4,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,4,4,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,4,4,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, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,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/level2.dat b/world1/level2.dat index 74fed74..34b449b 100644 --- a/world1/level2.dat +++ b/world1/level2.dat @@ -4,44 +4,44 @@ hurryup 80 endmaps help Slam a monster onto another for a powerup. -Catch this rat but don't kill it yet... +Grab this monster, but don't kill it yet... Stand on this ledge then slam! endhelp monsters +1 4 10 r 33 9 r 16 10 ? 6 10 -? 9 10 +? 12 10 ? 25 10 -1 4 10 endmonsters -******************************000000000* -******************************000000000* -******************************000000000* -******************************000000000* -******************************000000000* -******************************000000000* -******************************000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000~0~00000000000000*0*0000* -*00000000000000*0*000000000~0000***0000* -*~~~~~~~~~~~~~~~~~~~~~~~~~~*~~~~~~~~~~~* -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** -**************************************** +4,4,4,4,4,4,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,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,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,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,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,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,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,4, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,1,0,0,0,0,4,4,4,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,4,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, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,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/level3.dat b/world1/level3.dat index da7b68c..788a741 100644 --- a/world1/level3.dat +++ b/world1/level3.dat @@ -2,39 +2,40 @@ tileset green bg 0 hurryup 30 endmaps +help +endhelp monsters -r 5 3 -r 34 3 -r 12 8 -r 27 8 -r 13 18 -r 27 18 1 4 28 +r 19 15 +r 5 7 +r 35 7 +r 35 23 +r 4 23 endmonsters *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* *~~~~~~~~~~000000000000000000~~~~~~~~~~* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* *0000000~~~~~~~~~~0000~~~~~~~~~~0000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* *00000000000000~~~~~~~~~~00000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* *0000000~~~~~~~~~~0000~~~~~~~~~~0000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* *~~~~~~~~~~000000000000000000~~~~~~~~~~* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* diff --git a/world2/level15.dat b/world2/level15.dat index faae120..868e9b1 100644 --- a/world2/level15.dat +++ b/world2/level15.dat @@ -2,22 +2,32 @@ tileset green bg 0 hurryup 30 endmaps +monsters +s 7 1 +a 36 7 +a 2 9 +a 21 15 +a 12 23 +a 29 23 +1 1 23 +endmonsters **************************************** -*000000s00*0000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000a00* -*00000000000000000000000000000000000000* -*0a000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000000000000000000000* -*00000000000000000000a00000000000000000* +*000000000*0000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* @@ -25,7 +35,6 @@ endmaps *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*10000000000a0000000000000000a000000000* ***000>>>>>000>>>>>>>>>>>>>>000<<<<<<00* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* diff --git a/world2/level7.dat b/world2/level7.dat index 7caf730..171f62a 100644 --- a/world2/level7.dat +++ b/world2/level7.dat @@ -2,33 +2,46 @@ tileset green bg 0 hurryup 30 endmaps +monsters +S 9 3 +S 34 3 +r 3 8 +r 37 8 +r 9 13 +S 30 13 +r 36 18 +S 3 18 +r 11 23 +S 35 23 +1 4 28 +endmonsters +*00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000S000000000000000000000000S0000* *************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00r000000000000000000000000000000000r0* +*00000000000000000000000000000000000000* *************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00000000r00000000000000000000S00000000* +*00000000000000000000000000000000000000* *************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00S00000000000000000000000000000000r00* +*00000000000000000000000000000000000000* *************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*0000000000r00000000000000000000000S000* +*00000000000000000000000000000000000000* *************00000000000000************* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*00010000000000000000000000000000000000* +*00000000000000000000000000000000000000* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/world2/level8.dat b/world2/level8.dat index c1351ac..1286b57 100644 --- a/world2/level8.dat +++ b/world2/level8.dat @@ -2,33 +2,46 @@ tileset green bg 0 hurryup 90 endmaps +monsters +s 31 4 +r 36 9 +1 3 9 +r 33 12 +r 37 15 +r 34 19 +r 35 23 +a 11 23 +a 5 26 +r 35 28 +a 22 28 +endmonsters *000000000*0000000000000000000000000000* *000000000*0000000000000000000000000000* *000000000*0000000000000000000000000000* *000000000****************************** -*000000000000000000000000000000s0000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*0.100000000000000000000000000000000r00* +*00000000000000000000000000000000000000* +*0.000000000000000000000000000000000000* ****************000000000000000********* *000000000000000000000000000000*0000000* -*000000000000000000000000000000*0r00000* +*000000000000000000000000000000*0000000* *000000000000000000000000000000*~~~~~~~* *000000000000000000000000000000*0000000* -*000000000000000000000000000000*00000r0* +*000000000000000000000000000000*0000000* *0000000<<<<<<<<<<<<<<<<<<<<<<<*~~~~~~~* *000000000000000000000000000000*0000000* *000000000000000000000000000000*0000000* -*000000000000000000000000000000*00r0000* +*000000000000000000000000000000*0000000* *000000000000000000000000000000*~~~~~~~* *000000000000000000000000000000*0000000* *>>>>>>>>>>>>>>>>>>>>>>>>>00000*0000000* -*0000000000a0000000000000000000*000r000* +*000000000000000000000000000000*0000000* *000000000000000000000000000000*~~~~~~~* *000000000000000000000000000000*0000000* -*0000a000000000000000000000^^^^*0000000* +*00000000000000000000000000^^^^*0000000* *0;00000000000000000000000/*****0000000* -*0:0000000000000000000a00/******000r000* +*0:0000000000000000000000/******0000000* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/world2/level9.dat b/world2/level9.dat index d2410c3..7452135 100644 --- a/world2/level9.dat +++ b/world2/level9.dat @@ -2,22 +2,34 @@ tileset green bg 0 hurryup 30 endmaps +monsters +a 19 5 +a 7 6 +r 27 7 +s 10 9 +s 23 9 +r 19 13 +s 4 15 +s 20 15 +s 28 15 +1 2 28 +endmonsters +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* +*00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *00000000000000000000000000000000000000* -*000000000000000000a0000000000000000000* -*000000a0000000000000000000000000000000* -*00000000000000000000000000r00000000000* ***********000*******************000000* -*000000000s000000000000s000000000000000* +*00000000000000000000000000000000000000* *00000000000000000000000000000000000000* *0000000000000000000000000000000000~~~~* *00000000000000000000000000000000000000* -*000000000000000000r0000000000000000000* +*00000000000000000000000000000000000000* **-********000*******************000000* -*0=0s000*000000*0000s00*0000s00*0000000* +*0=00000*000000*0000000*0000000*0000000* *0=000000000000000000000000000000000000* *0=000000000000000000000000000000000000* *0=000000000000000000000000000000000000* @@ -30,5 +42,5 @@ endmaps *000000000000000000000000000000000000=0* *000000000000000000000000000000000000=0* *000000000000000000000000000000000000=0* -*0100000^^^^^^^^000000000000000000000=0* +*0000000^^^^^^^^000000000000000000000=0* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~