X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fitems.c;h=c9b23b5f7370a6a466fde5cf873b9fe2fb7e0644;hb=c46b82f5794be555af272740e67ead316b9b1f90;hp=06230c9c7f949bf83952a3697da60fbd654351a0;hpb=82abbc606cc5e3d9c26e2ab6d36e093ed86ae1bf;p=flatwaifu.git diff --git a/src/items.c b/src/items.c index 06230c9..c9b23b5 100644 --- a/src/items.c +++ b/src/items.c @@ -31,6 +31,7 @@ #include "things.h" #include "misc.h" #include "map.h" +#include "my.h" extern map_block_t blk; @@ -49,21 +50,44 @@ static item_t it[MAXITEM]; int itm_rtime=1092; -void IT_savegame(FILE* h) { - int n; - - for(n=MAXITEM;--n;) if(it[n].t) break; - ++n;myfwrite(&n,1,4,h); - myfwrite(it,1,n*sizeof(it[0]),h); - myfwrite(&itm_rtime,1,4,h); +void IT_savegame (FILE *h) { + int i, n; + for (n = MAXITEM - 1; n >= 0 && it[n].t == 0; n--) { + // empty + } + n += 1; + myfwrite32(n, h); + for (i = 0; i < n; i++) { + myfwrite32(it[i].o.x, h); + myfwrite32(it[i].o.y, h); + myfwrite32(it[i].o.xv, h); + myfwrite32(it[i].o.yv, h); + myfwrite32(it[i].o.vx, h); + myfwrite32(it[i].o.vy, h); + myfwrite32(it[i].o.r, h); + myfwrite32(it[i].o.h, h); + myfwrite32(it[i].t, h); + myfwrite32(it[i].s, h); + } + myfwrite32(itm_rtime, h); } -void IT_loadgame(FILE* h) { - int n; - - myfread(&n,1,4,h); - myfread(it,1,n*sizeof(it[0]),h); - myfread(&itm_rtime,1,4,h); +void IT_loadgame (FILE *h) { + int i, n; + n = myfread32(h); + for (i = 0; i < n; i++) { + it[i].o.x = myfread32(h); + it[i].o.y = myfread32(h); + it[i].o.xv = myfread32(h); + it[i].o.yv = myfread32(h); + it[i].o.vx = myfread32(h); + it[i].o.vy = myfread32(h); + it[i].o.r = myfread32(h); + it[i].o.h = myfread32(h); + it[i].t = myfread32(h); + it[i].s = myfread32(h); + } + itm_rtime = myfread32(h); } void IT_alloc(void) { @@ -112,52 +136,97 @@ void IT_init(void) { tsndtm=rsndtm=0; } -int IT_load(FILE* h) { - int m,i,j; +int IT_load (FILE *h) { + int m, i, j; old_thing_t t; - - switch(blk.t) { + switch (blk.t) { case MB_THING: - for(i=0;blk.sz>0;++i,blk.sz-=8) { - myfread(&t,1,sizeof(t),h); - it[i].o.x=t.x;it[i].o.y=t.y; - it[i].t=t.t;it[i].s=t.f; - if(!it[i].t) break; - if((it[i].s&THF_DM) && !g_dm) it[i].t=0; - }m=i; - for(i=0,j=-1;i 0; ++i, blk.sz -= 8) { + t.x = myfread16(h); + t.y = myfread16(h); + t.t = myfread16(h); + t.f = myfread16(h); + it[i].o.x = t.x; + it[i].o.y = t.y; + it[i].t = t.t; + it[i].s = t.f; + if (it[i].t && (it[i].s & THF_DM) && !g_dm) { + it[i].t=0; + } } - for(i=0,j=-1;i=TH_CLIP && it[i].t=I_KEYR && it[i].t<=I_KEYB) it[i].t|=0x8000; - }else if(it[i].t>=TH_DEMON) { - MN_spawn(it[i].o.x,it[i].o.y,it[i].s&THF_DIR,it[i].t-TH_DEMON+MN_DEMON); - it[i].t=0; - } + for (i = 0, j = 0; i < m; ++i) { + if (it[i].t == TH_DMSTART) { + if (g_dm) { + dm_pos[j].x = it[i].o.x; + dm_pos[j].y = it[i].o.y; + dm_pos[j].d = it[i].s & THF_DIR; + } + it[i].t = 0; + ++j; + } + } + if (g_dm && j < 2) { + ERR_fatal("Меньше 2-ух точек DM"); + } + if (g_dm) { + dm_pnum = j; + dm_pl1p = myrand(dm_pnum); + do { + dm_pl2p = myrand(dm_pnum); + } while (dm_pl2p == dm_pl1p); + } else { + dm_pl1p = 0; + dm_pl2p = 1; + dm_pnum = 2; + } + PL_spawn(&pl1, dm_pos[dm_pl1p].x, dm_pos[dm_pl1p].y, dm_pos[dm_pl1p].d); + if (_2pl) { + PL_spawn(&pl2, dm_pos[dm_pl2p].x, dm_pos[dm_pl2p].y, dm_pos[dm_pl2p].d); + } + for (i = 0; i < m; ++i) { + if (it[i].t >= TH_CLIP && it[i].t < TH_DEMON) { + it[i].s = 0; + it[i].t = it[i].t - TH_CLIP + I_CLIP; + if (it[i].t >= I_KEYR && it[i].t <= I_KEYB) { + it[i].t |= 0x8000; + } + } else if (it[i].t >= TH_DEMON) { + MN_spawn(it[i].o.x, it[i].o.y, it[i].s & THF_DIR, it[i].t - TH_DEMON + MN_DEMON); + it[i].t = 0; + } + } return 1; - }return 0; + } + return 0; } static void takesnd(int t) {