X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fplayer.c;h=7a693ac959eb2829f5bb0166e194f7e452b063da;hb=584adc9c1911a6941ef07443a6fc6ff922d7c8ea;hp=fd1080a4a49a52e34b738f06af873b8ded08d86e;hpb=8fb3d3f767b8e5d094e8bcbee350f4d16ab17c5a;p=flatwaifu.git diff --git a/src/player.c b/src/player.c index fd1080a..7a693ac 100644 --- a/src/player.c +++ b/src/player.c @@ -23,7 +23,6 @@ #include "glob.h" #include #include -#include "vga.h" #include "keyb.h" #include "view.h" #include "dots.h" @@ -35,6 +34,7 @@ #include "switch.h" #include "player.h" #include "misc.h" +#include "my.h" extern int hit_xv,hit_yv; @@ -44,7 +44,6 @@ extern int hit_xv,hit_yv; #define PL_SWUP 4 #define PL_FLYUP 4 -#define PL_AIR 360 #define PL_AQUA_AIR 1091 byte p_immortal=0,p_fly=0; @@ -62,12 +61,10 @@ static int aitime; static void *aisnd[3]; static void *pdsnd[5]; -static void *spr[27*2],*snd[11]; -static char sprd[27*2]; -static void *wpn[11][6]; -static byte goanim[]="BDACDA", - dieanim[]="HHHHIIIIJJJJKKKKLLLLMMMM", - slopanim[]="OOPPQQRRSSTTUUVVWW"; +static void *snd[11]; +byte plr_goanim[]="BDACDA", + plr_dieanim[]="HHHHIIIIJJJJKKKKLLLLMMMM", + plr_slopanim[]="OOPPQQRRSSTTUUVVWW"; #pragma pack(1) @@ -76,16 +73,112 @@ struct { } _keys; #pragma pack() -void PL_savegame(FILE* h) { - myfwrite(&pl1,1,sizeof(pl1)-sizeof(_keys),h);//myfwrite(&pl1,1,sizeof(pl1),h); - if(_2pl) myfwrite(&pl2,1,sizeof(pl2)-sizeof(_keys),h);//myfwrite(&pl2,1,sizeof(pl2),h); - myfwrite(&PL_JUMP,1,4,h);myfwrite(&PL_RUN,1,4,h);myfwrite(&p_immortal,1,1,h); +void PL_save_player (player_t *p, FILE *h) { + myfwrite32(p->o.x, h); + myfwrite32(p->o.y, h); + myfwrite32(p->o.xv, h); + myfwrite32(p->o.yv, h); + myfwrite32(p->o.vx, h); + myfwrite32(p->o.vy, h); + myfwrite32(p->o.r, h); + myfwrite32(p->o.h, h); + myfwrite32(p->looky, h); + myfwrite32(p->st, h); + myfwrite32(p->s, h); + myfwrite32(p->life, h); + myfwrite32(p->armor, h); + myfwrite32(p->hit, h); + myfwrite32(p->hito, h); + myfwrite32(p->pain, h); + myfwrite32(p->air, h); + myfwrite32(p->invl, h); + myfwrite32(p->suit, h); + myfwrite8(p->d, h); + myfwrite32(p->frag, h); + myfwrite32(p->ammo, h); + myfwrite32(p->shel, h); + myfwrite32(p->rock, h); + myfwrite32(p->cell, h); + myfwrite32(p->fuel, h); + myfwrite32(p->kills, h); + myfwrite32(p->secrets, h); + myfwrite8(p->fire, h); + myfwrite8(p->cwpn, h); + myfwrite8(p->csnd, h); + myfwrite8(p->amul, h); + myfwrite16(p->wpns, h); + myfwrite8(p->wpn, h); + myfwrite8(p->f, h); + myfwrite8(p->drawst, h); + myfwrite8(p->color, h); + myfwrite32(p->id, h); + myfwrite8(p->keys, h); + myfwrite8(p->lives, h); + // k* not saved } -void PL_loadgame(FILE* h) { - myfread(&pl1,1,sizeof(pl1)-sizeof(_keys),h);//myfread(&pl1,1,sizeof(pl1),h); - if(_2pl) myfread(&pl2,1,sizeof(pl2)-sizeof(_keys),h);//myfread(&pl2,1,sizeof(pl2),h); - myfread(&PL_JUMP,1,4,h);myfread(&PL_RUN,1,4,h);myfread(&p_immortal,1,1,h); +void PL_savegame (FILE *h) { + PL_save_player(&pl1, h); + if (_2pl) { + PL_save_player(&pl2, h); + } + myfwrite32(PL_JUMP, h); + myfwrite32(PL_RUN, h); + myfwrite8(p_immortal, h); +} + +void PL_load_player (player_t *p, FILE *h) { + p->o.x = myfread32(h); + p->o.y = myfread32(h); + p->o.xv = myfread32(h); + p->o.yv = myfread32(h); + p->o.vx = myfread32(h); + p->o.vy = myfread32(h); + p->o.r = myfread32(h); + p->o.h = myfread32(h); + p->looky = myfread32(h); + p->st = myfread32(h); + p->s = myfread32(h); + p->life = myfread32(h); + p->armor = myfread32(h); + p->hit = myfread32(h); + p->hito = myfread32(h); + p->pain = myfread32(h); + p->air = myfread32(h); + p->invl = myfread32(h); + p->suit = myfread32(h); + p->d = myfread8(h); + p->frag = myfread32(h); + p->ammo = myfread32(h); + p->shel = myfread32(h); + p->rock = myfread32(h); + p->cell = myfread32(h); + p->fuel = myfread32(h); + p->kills = myfread32(h); + p->secrets = myfread32(h); + p->fire = myfread8(h); + p->cwpn = myfread8(h); + p->csnd = myfread8(h); + p->amul = myfread8(h); + p->wpns = myfread16(h); + p->wpn = myfread8(h); + p->f = myfread8(h); + p->drawst = myfread8(h); + p->color = myfread8(h); + p->id = myfread32(h); + p->keys = myfread8(h); + p->lives = myfread8(h); + // k* not saved +} + +void PL_loadgame (FILE *h) { + PL_load_player(&pl1, h); + if (_2pl) { + PL_load_player(&pl2, h); + } + PL_JUMP = myfread32(h); + PL_RUN = myfread32(h); + p_immortal = myfread8(h); } static int nonz(int a) {return (a)?a:1;} @@ -220,17 +313,7 @@ void PL_alloc(void) { "SAWHIT", "PLFALL" }; - static char s[6]; - - for(i=0;i<27;++i) { - spr[i*2]=Z_getspr("PLAY",i,1,sprd+i*2); - spr[i*2+1]=Z_getspr("PLAY",i,2,sprd+i*2+1); - } - memcpy(s,"PWPx",4); - for(i=1;i<11;++i) { - s[3]=((i<10)?'0':('A'-10))+i; - for(j=0;j<6;++j) wpn[i][j]=Z_getspr(s,j,1,NULL); - } + char s[6]; for(i=0;i<11;++i) snd[i]=Z_getsnd(nm[i]); memcpy(s,"AIx",4); for(i=0;i<3;++i) { @@ -506,12 +589,12 @@ void PL_act(player_t *p) { switch(p->st) { case DIE: p->o.h=7; - if(!dieanim[++p->s]) {p->st=DEAD;MN_killedp();} + if(!plr_dieanim[++p->s]) {p->st=DEAD;MN_killedp();} p->o.xv=Z_dec(p->o.xv,1); break; case SLOP: p->o.h=6; - if(!slopanim[++p->s]) {p->st=MESS;MN_killedp();} + if(!plr_slopanim[++p->s]) {p->st=MESS;MN_killedp();} p->o.xv=Z_dec(p->o.xv,1); break; case GO: @@ -562,56 +645,6 @@ void PL_act(player_t *p) { } } -static int standspr(player_t *p) { - if(p->f&PLF_UP) return 'X'; - if(p->f&PLF_DOWN) return 'Z'; - return 'E'; -} - -static int wpnspr(player_t *p) { - if(p->f&PLF_UP) return 'C'; - if(p->f&PLF_DOWN) return 'E'; - return 'A'; -} - -void PL_draw(player_t *p) { - int s,w,wx,wy; - static int wytab[]={-1,-2,-1,0}; - - s='A';w=0;wx=wy=0; - switch(p->st) { - case STAND: - if(p->f&PLF_FIRE) {s=standspr(p)+1;w=wpnspr(p)+1;} - else if(p->pain) {s='G';w='A';wx=p->d?2:-2;wy=1;} - else {s=standspr(p);w=wpnspr(p);} - break; - case DEAD: - s='N';break; - case MESS: - s='W';break; - case GO: - if(p->pain) {s='G';w='A';wx=p->d?2:-2;wy=1;} - else { - s=goanim[p->s/8];w=(p->f&PLF_FIRE)?'B':'A'; - wx=p->d?2:-2;wy=1+wytab[s-'A']; - } - break; - case DIE: - s=dieanim[p->s];break; - case SLOP: - s=slopanim[p->s];break; - case OUT: - s=0;break; - } - if(p->wpn==0) w=0; - if(w) Z_drawspr(p->o.x+wx,p->o.y+wy,wpn[p->wpn][w-'A'],p->d); - if(s) Z_drawmanspr(p->o.x,p->o.y,spr[(s-'A')*2+p->d],sprd[(s-'A')*2+p->d],p->color); -} - -void *PL_getspr(int s,int d) { - return spr[(s-'A')*2+d]; -} - static void chk_bfg(player_t *p,int x,int y) { int dx,dy; @@ -633,34 +666,3 @@ void bfg_fly(int x,int y,int o) { if(_2pl) if(o!=-2) chk_bfg(&pl2,x,y); if(o==-1 || o==-2) MN_warning(x-50,y-50,x+50,y+50); } - -void PL_drawst(player_t *p) { - V_setrect(WD,120,w_o,HT);Z_clrst(); - int i; - - if(p->drawst&PL_DRAWAIR) - if (p->airair); - if(p->drawst&PL_DRAWLIFE) - Z_drawstprcnt(0,p->life); - if(p->drawst&PL_DRAWARMOR) - Z_drawstprcnt(1,p->armor); - if(p->drawst&PL_DRAWWPN) { - switch(p->wpn) { - case 2: case 5: - i=p->ammo;break; - case 3: case 4: case 9: - i=p->shel;break; - case 6: - i=p->rock;break; - case 10: - i=p->fuel;break; - case 7: case 8: - i=p->cell;break; - } - Z_drawstwpn(p->wpn,i); - } - if(p->drawst&PL_DRAWFRAG) Z_drawstnum(p->frag); - if(p->drawst&PL_DRAWKEYS) Z_drawstkeys(p->keys); - if(!_2pl) if(p->drawst&PL_DRAWLIVES) Z_drawstlives(p->lives); -}