From b08cdd3eaeed3a6b18d0499b26017814e829e601 Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Sun, 19 Oct 2008 20:45:38 +0000 Subject: [PATCH] - Player gets wings when you get wingboots - Fixed crash related to checking joystick when none exists --- data/sprites/wingleft0.png | Bin 0 -> 693 bytes data/sprites/wingleft1.png | Bin 0 -> 742 bytes data/sprites/wingleft2.png | Bin 0 -> 902 bytes data/sprites/wingleft3.png | Bin 0 -> 655 bytes data/sprites/wingright0.png | Bin 0 -> 680 bytes data/sprites/wingright1.png | Bin 0 -> 719 bytes data/sprites/wingright2.png | Bin 0 -> 762 bytes data/world1/level99.dat | 1 - defs.h | 4 +- edit.c | 15 ++- rc.c | 32 +++--- shared.c | 189 +++++++++++++++++++++++++++++------- shared.h | 1 + templates/wings.png | Bin 0 -> 693 bytes 14 files changed, 184 insertions(+), 58 deletions(-) create mode 100644 data/sprites/wingleft0.png create mode 100644 data/sprites/wingleft1.png create mode 100644 data/sprites/wingleft2.png create mode 100644 data/sprites/wingleft3.png create mode 100644 data/sprites/wingright0.png create mode 100644 data/sprites/wingright1.png create mode 100644 data/sprites/wingright2.png create mode 100644 templates/wings.png diff --git a/data/sprites/wingleft0.png b/data/sprites/wingleft0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e12127434581efcd27ab1622b4ae3056ed8894f GIT binary patch literal 693 zcmV;m0!safP)WFU8GbZ8({Xk{QrNlj4iWF>9@00J3FL_t(2&t1&DPZU8M z#_?xoc4u$dJ?;>NU}K`uPAw4s080}rO=z?xSeQ_lSXf(FS=d`>qXuJPFe=F6W z)CfYnS77gjz1^F=+q>PFpM{d3pYq8!j{yL0pS{ARD|2_EQMlX*eAbh#)v&df00TkLLDUVE!N_nOM>~b$b>@0bBzp;l@d$^F z8jLh!nH<2gPw?80>IatehZQ0ka3K)Oo>Gbo+jiO5Sf2cPqr({Io37_XexnY@bvY@G zK`&NXX-rN}oo7T;O8Uc!5Dwxn8OD)J8MBzh1=*f^fko}+I^%pZ?)64FQ*dY_l~ShP zzI^^3)T(dT>9c2QL{u8fIh;r<$1RFeCuhuqz4A}l^k13)5Vf1@!V`RaW{O)d$+j#_ zI(wllbB6&y>0PPDh1n?Pix9aSqBu+lYHjJ>{U!r|g~eOQvb1s-9A+ATTgV^$+WzVT z0K;EdqU7Y%v{@(?43(vy9zJ=Be*$ORnaFz{Mx$Z2wY&A;Xg2_$Ua6Wg(_LZNZVWFU8GbZ8({Xk{QrNlj4iWF>9@00K%$L_t(I%axPMYZFlv z#=m>#(YcecGs#SAnm)v8THW+zYik7s>mpi;BE^NE_yku9qASIP|AHXc{sr!e2nsdT zf{ReBx^pA3plvlZ6;qi`a_7!<(Osf#{g&T>ALo4M9D*v1kDsXv!^m7(`r-qK=H})( zwvbwFjGjDw+%#j85_&-h{$^t0;f>kZSJ7q=T5Sj++g-PzskJ55-I4CRe(}P&qsmty32eI_)(#cTDR1!9*x2ONYnP2}XHr;M z>1f-N-Y9As^g0z?U47@yUoc(Ma3Ak%w8`@Fvajme>eSPzw+s0NSpz9o{237j_l1Zk zpn*^cgDGUNzb~`5eRqbLhFmQc5mFND@9MetdOG_^sfHxHM4>ai@2u_Eo~jZUOhd?h zP(=Y_F#sTzWs!Ko)nd#VP^n(5$t0O<41fD;AH$G92%y3PP=!DUj`g4f5pi(NA%g&^ zhGe2`SL#+xC%IfM>hA6SVCd?Q!D6YfEU_^bg_IJM5=clyA_6EugX_7<-_oARW{U?0 zhCWreIAEIfjlRzj2?&RDq0uP*f1f0Ls7C_A)!Y(A(4Z<9p#-lNDnvze*)i zE_0O2>!6f^0w6?y&oi?=dUgF@>e2#3E``l(aAAlQbI z$tH{(8)-f?Jp9~o;t3%nTU=Uvmj9f8@P7VXep?U#FijJl=jo2)D7J00TrRiD`No6) Y0dH~ApSZBg8~^|S07*qoM6N<$g4{Sxs{jB1 literal 0 HcmV?d00001 diff --git a/data/sprites/wingleft2.png b/data/sprites/wingleft2.png new file mode 100644 index 0000000000000000000000000000000000000000..9117f7a92993b84eb3ed614af8c6e8275a9d53bc GIT binary patch literal 902 zcmV;119|+3P)WFU8GbZ8({Xk{QrNlj4iWF>9@00QbsL_t(I%axK(Y?E~y z#y`LJUujqAM!PkXO`&5p5Ho0S&cx_}NF0($#gT0ZhKUIzf-y1d0G>!N-t{Cb7%>J! z@ed`U(P$RyWr=~XF&v#sY}0O*wr&&FzW;u&2N+&B%;)r+KKXpVc?9><*SE*#I8rYb z^EM#I#(uL|VYKD4>&28A2sD@;2Ci#!>eL6y=;+UKB@kt~xUNSy+)P_*jK@0?488Wc zT&anYN~Hh@_=AL-A~ZDyX={zp-Ie6%@LT`y97QvjocbNhUSjVnJMsG??C$Mle*Pau zPM_h(8;8*holTuv!4@1kwEqD_q*5t;aNt$j!=ODLXJYay-Cap4m07+?r~Ovls6|^s z^bZaI5PS47rn55?@;P?)?D)?l9B!suS-5s9JCy;xUl)s{E0tM#U+S-Ya&~0Z(1Ew> z@4b8S1x2Xi!JWgdKjhlc>IZp$*V7ScO~DcRA#52 z>VA6P@X-^gXiG@+4-Q>> z*T=^{l_C%Z*cji?vwC&#-tRo9)g?mnu<9n+sT)E7jGX@X&27o9_gkV(gc=PrT}M$o zJWs`w8VIm$8&}#$7X)D1Ca!C8^X80D0WPJ#9^3xh_CNGhkL=Mkoj^kaimITf0>`<7 z=SghGL{StxJZ#rQ6&gZF=F8Q@gRzw>)pl1({>&9+X|BrR!qPo`Rp7V+RW)!O57&{H zH4E3V8K21hZAp66WyrVRrAId>5mBocRKA*Nuel;Z7tys=wxr@tA%3W z^6_KC`_+d*wj{S)%jI*IiuuA9u9Vv*Zd}j)@Z*)CXt??LbLY=()->Oag9i_6u&nx( cTrTJS3!5o35;%d(CjbBd07*qoM6N<$f)_BU4*&oF literal 0 HcmV?d00001 diff --git a/data/sprites/wingleft3.png b/data/sprites/wingleft3.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c5d97d1b7297c4acb921dd520c48ab672c243a GIT binary patch literal 655 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 + // show level filename + snprintf(temps, BUFLEN, "%s",curlevel->filename); wid = writetext(screen, area.x, area.y, temps, EDITTEXT, &white); area.x += (wid + STATUSPAD); // show level desc @@ -1053,6 +1053,9 @@ int isplacablesprite(int sid) { case P_MASK: case P_TAP: case P_CLOVER: + case P_SKULL: + case P_WINGLEFT: + case P_WINGRIGHT: return B_FALSE; } @@ -1082,12 +1085,6 @@ void draweditortile(SDL_Surface *where, int x, int y) { area.w = TILEW; area.h = TILEH; - - - - - - /* draw blank tile first */ tt = gettile(curlevel->bgtileid); SDL_BlitSurface(levelbg, &area, where, &area); diff --git a/rc.c b/rc.c index 4ddf0c2..da4a438 100644 --- a/rc.c +++ b/rc.c @@ -24,6 +24,7 @@ SDL_Surface *screen; TTF_Font *font[MAXLETTERHEIGHT]; +int havejoysticks; SDL_Joystick *joy; Uint8 *keys; int joyx,joyy,joybut[MAXJOYBUTTONS]; @@ -5797,7 +5798,9 @@ void initsdl(void) { if (joy) { printf("%d joystick(s) detected and enabled.\n",SDL_NumJoysticks()); SDL_JoystickEventState(SDL_ENABLE); + havejoysticks = B_TRUE; } else { + havejoysticks = B_FALSE; printf("No joysticks found.\n"); } } @@ -6585,7 +6588,7 @@ void handleinput(void) { keys = SDL_GetKeyState(NULL); // check for joystick - if (joy) { + if (havejoysticks) { joyx = SDL_JoystickGetAxis(joy,0); joyy = SDL_JoystickGetAxis(joy,1); for (i = 0; i < MAXJOYBUTTONS; i++) { @@ -6949,19 +6952,20 @@ int keydown(int checkfor) { return B_TRUE; } // check for joystick - if (checkfor == SDLK_RIGHT) { - //if ((joyx >= 6000) || (joybut[5])) return B_TRUE; - if (joybut[5]) return B_TRUE; - } else if (checkfor == SDLK_LEFT) { - if (joybut[7]) return B_TRUE; - } else if (checkfor == SDLK_UP) { - if (joybut[4]) return B_TRUE; - } else if (checkfor == SDLK_DOWN) { - if (joybut[6]) return B_TRUE; - } else if (checkfor == SDLK_z) { - if (joybut[0] || joybut[14]) return B_TRUE; - } else if (checkfor == SDLK_x) { - if (joybut[1] || joybut[13]) return B_TRUE; + if (havejoysticks) { + if (checkfor == SDLK_RIGHT) { + if (joybut[5]) return B_TRUE; + } else if (checkfor == SDLK_LEFT) { + if (joybut[7]) return B_TRUE; + } else if (checkfor == SDLK_UP) { + if (joybut[4]) return B_TRUE; + } else if (checkfor == SDLK_DOWN) { + if (joybut[6]) return B_TRUE; + } else if (checkfor == SDLK_z) { + if (joybut[0] || joybut[14]) return B_TRUE; + } else if (checkfor == SDLK_x) { + if (joybut[1] || joybut[13]) return B_TRUE; + } } return B_FALSE; diff --git a/shared.c b/shared.c index 3fc6e5a..1d2024f 100644 --- a/shared.c +++ b/shared.c @@ -403,6 +403,8 @@ int loadlevel(int wnum, int lnum, int wantmonsters) { tempanim[numanim] = y*LEVELW+x; numanim++; } + if (y*LEVELW+x == 800) printf("tileframe of 800 is %d\n",level->tileframe[y*LEVELW+x]); + x++; p = strtok(NULL, ","); @@ -1166,6 +1168,7 @@ int loadimagesets(void) { loadspriteimage(P_MASK,1, "sprites/maskleft.png"); imageset[P_MASK].numimages = 2; + loadspriteimage(P_MASKPOWERUP,F_WALK1, "sprites/maskpowerup.png"); imageset[P_MASKPOWERUP].numimages = 1; @@ -1292,6 +1295,26 @@ int loadimagesets(void) { loadspriteimage(P_WINGBOOTS,F_WALK1, "sprites/wingboots.png"); imageset[P_WINGBOOTS].numimages = 1; + // wings + loadspriteimage(P_WINGLEFT,0, "sprites/wingleft0.png"); // standing + loadspriteimage(P_WINGLEFT,1, "sprites/wingleft1.png"); // jumping + loadspriteimage(P_WINGLEFT,2, "sprites/wingleft2.png"); // jumping + loadspriteimage(P_WINGLEFT,3, "sprites/wingleft3.png"); // swimming + imageset[P_WINGLEFT].numimages = 4; + + loadspriteimage(P_WINGRIGHT,0, "sprites/wingright0.png"); // standing + loadspriteimage(P_WINGRIGHT,1, "sprites/wingright1.png"); // jumping + loadspriteimage(P_WINGRIGHT,2, "sprites/wingright2.png"); // jumping + imageset[P_WINGRIGHT].numimages = 3; + + // manually do flipped images + for (i = 0; i < 3; i++) { + imageset[P_WINGLEFT].img[MAXFRAMES+i] = rotozoomSurfaceXY(imageset[P_WINGLEFT].img[i], 0, -1,1,0); + imageset[P_WINGRIGHT].img[MAXFRAMES+i] = rotozoomSurfaceXY(imageset[P_WINGRIGHT].img[i], 0, -1,1,0); + } + // and one more for WINGLEFT... + imageset[P_WINGLEFT].img[MAXFRAMES+3] = rotozoomSurfaceXY(imageset[P_WINGLEFT].img[3], 0, -1,1,0); + loadspriteimage(P_SKULL,F_WALK1, "sprites/skull.png"); imageset[P_SKULL].numimages = 1; @@ -1647,6 +1670,10 @@ void drawsprite(sprite_t *s) { if (s->dir == -1) { frame += MAXFRAMES; } + } else if ((s->id == P_WINGLEFT) || (s->id == P_WINGRIGHT)) { + if (player->dir == -1) { + frame += MAXFRAMES; + } } /* make red if required */ if (s->angry && s->id != P_BLACKCLOUD) { @@ -1694,46 +1721,42 @@ void drawsprite(sprite_t *s) { area.w = 0; area.h = 0; - //if (area.y < (480-s->img->h)) { -/* -if (s == player) { -printf("player at %0.1f,%0.1f\n",player->x,player->y); -} -*/ - - if (s->invuln) { - if (timer % 2 == 0) { - //SDL_BlitSurface(s->img, NULL, screen, &area); + if (s->invuln) { + if (timer % 2 == 0) { + //SDL_BlitSurface(s->img, NULL, screen, &area); + if (s == player) { + drawplayer(s, &area); + } else { doblit(s->img, screen, &area); } - } else if (s == boss && s->dead) { - if ((timer / 10) % 2 == 0) { - //SDL_BlitSurface(s->img, NULL, screen, &area); - doblit(s->img, screen, &area); - } - } else { - // draw the sprite + } + } else if (s == boss && s->dead) { + if ((timer / 10) % 2 == 0) { //SDL_BlitSurface(s->img, NULL, screen, &area); doblit(s->img, screen, &area); - /* for opengl */ - //SDL_UpdateRect(screen, area.x, area.y, area.w, area.h); } + } else { + if (s == player) { + drawplayer(s, &area); + } else { + doblit(s->img, screen, &area); + } + } - // ice cube - if (s->iced) { - if (!s->iceimg) { - double xmod,ymod; - xmod = (double)s->img->w / (double)icecube->w; - ymod = (double)s->img->h / (double)icecube->h; - // create image - s->iceimg = rotozoomSurfaceXY(icecube,0, xmod, ymod ,0); - } - // draw it - doblit(s->iceimg, screen, &area); - //SDL_BlitSurface(s->iceimg, NULL, screen, &area); - + // ice cube + if (s->iced) { + if (!s->iceimg) { + double xmod,ymod; + xmod = (double)s->img->w / (double)icecube->w; + ymod = (double)s->img->h / (double)icecube->h; + // create image + s->iceimg = rotozoomSurfaceXY(icecube,0, xmod, ymod ,0); } - //} + // draw it + doblit(s->iceimg, screen, &area); + //SDL_BlitSurface(s->iceimg, NULL, screen, &area); + + } @@ -1756,6 +1779,7 @@ printf("player at %0.1f,%0.1f\n",player->x,player->y); void killsprite(sprite_t *s) { sprite_t *nextone, *lastone; +#ifndef __EDITOR sprite_t *s2; // remove boss pointer @@ -1794,6 +1818,7 @@ void killsprite(sprite_t *s) { SDL_FreeSurface(s->img); } } +#endif nextone = s->next; if (nextone != NULL) { @@ -1954,6 +1979,9 @@ int iseffect(int id) { case P_MASK: case P_MOVINGCARD: case P_FIVECARDS: + // these last two aren't REALLY effects since they never have a sprite allocated + case P_WINGLEFT: + case P_WINGRIGHT: return B_TRUE; } @@ -3105,3 +3133,98 @@ int getcardvalue(int cardid) { return (points+1); } + +// draw player, and wings if required +void drawplayer(sprite_t *s, SDL_Rect *where) { +#ifndef __EDITOR + SDL_Rect wingarea; + int wingframe; +#endif + +#ifndef __EDITOR + if (s->doublejump) { + // draw wings behind the sprite + if (s->jumping || s->falling) { + // flapping wings + if ((timer/12) % 2 == 0) { + wingframe = 1; + } else { + wingframe = 2; + } + } else { + // still wings + wingframe = 0; + } + + wingarea.x = player->x - (imageset[P_WINGRIGHT].img[wingframe]->w/2); + wingarea.y = player->y - (imageset[P_WINGRIGHT].img[wingframe]->h); + if (wingframe == 0) { // still + wingarea.x += (4*player->dir); + wingarea.y += 2; + } else if ((wingframe >= 1) && (wingframe <= 2)) { // flapping + wingarea.x += (11*player->dir); + wingarea.y -= 9; + } + + // when climbing, show "left" wing twice instead + // when swimming, only show left wing + if (!s->climbing && !s->swimming) { + if (player->dir == -1) wingframe += MAXFRAMES; + doblit(imageset[P_WINGRIGHT].img[wingframe], screen, &wingarea); + } + } +#endif + + // draw the sprite + doblit(s->img, screen, where); + +#ifndef __EDITOR + if (s->doublejump) { + // draw wings in front of the sprite + if (s->swimming) { + wingframe = 3; + } else if (s->jumping || s->falling) { + // flapping wings + if ((timer/12) % 2 == 0) { + wingframe = 1; + } else { + wingframe = 2; + } + } else { + // still wings + wingframe = 0; + } + + wingarea.x = player->x - (imageset[P_WINGLEFT].img[wingframe]->w/2); + wingarea.y = player->y - (imageset[P_WINGLEFT].img[wingframe]->h); + if (wingframe == 0) { // still + if (s->climbing) { + wingarea.x -= 4; + wingarea.y += 2; + } else { + wingarea.x -= (6*player->dir); + wingarea.y += 2; + } + } else if ((wingframe >= 1) && (wingframe <= 2)) { // flapping + wingarea.x -= (11*player->dir); + wingarea.y -= 9; + } else if (wingframe == 3) { + wingarea.y -= 9; + wingarea.x -= (6*player->dir); + } + + + if (player->dir == -1) wingframe += MAXFRAMES; + doblit(imageset[P_WINGLEFT].img[wingframe], screen, &wingarea); + + if (s->climbing) { + // draw the other wing + wingarea.x += 8; + // reverse it + if (player->dir == -1) wingframe -= MAXFRAMES; + else wingframe += MAXFRAMES; + doblit(imageset[P_WINGLEFT].img[wingframe], screen, &wingarea); + } + } +#endif +} diff --git a/shared.h b/shared.h index f4fe5f6..4b847b5 100644 --- a/shared.h +++ b/shared.h @@ -60,6 +60,7 @@ int getcardvalue(int cardid); int getcardsuit(int cardid); int getworld(int lev); int getlevel(int lev); +void drawplayer(sprite_t *s, SDL_Rect *where); // for doco void setfruitinfo(void); void setinfo(int id, char *name, char *desc, char *file); diff --git a/templates/wings.png b/templates/wings.png new file mode 100644 index 0000000000000000000000000000000000000000..86027130ad04acee63c21f5a1bd2246242f5b709 GIT binary patch literal 693 zcmV;m0!safP)WFU8GbZ8({Xk{QrNlj4iWF>9@00J3FL_t(2&t1&DPZU8M z#_?xoc4u$dJ?;>NU}K`uPAw4s080}rO=z?xSeQ_lSXf(FS=d`>qXuJPFe=F6W z)CfYnS77gjz1^F=+q>PFpM{d3pYq8!j{yL0pS{ARD|2_EQMlX*eAbh#)v&df00TkLLDUVE!N_nOM>~b$b>@0bBzp;l@d$^F z8jLh!nH<2gPw?80>IatehZQ0ka3K)Oo>Gbo+jiO5Sf2cPqr({Io37_XexnY@bvY@G zK`&NXX-rN}oo7T;O8Uc!5Dwxn8OD)J8MBzh1=*f^fko}+I^%pZ?)64FQ*dY_l~ShP zzI^^3)T(dT>9c2QL{u8fIh;r<$1RFeCuhuqz4A}l^k13)5Vf1@!V`RaW{O)d$+j#_ zI(wllbB6&y>0PPDh1n?Pix9aSqBu+lYHjJ>{U!r|g~eOQvb1s-9A+ATTgV^$+WzVT z0K;EdqU7Y%v{@(?43(vy9zJ=Be*$ORnaFz{Mx$Z2wY&A;Xg2_$Ua6Wg(_LZNZV