⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_saveg.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 5 页
字号:
    mapsidedef_t  *msd;    maplinedef_t  *mld;    sector_t      *ss;    byte           diff;    byte           diff2;    ms = W_CacheLumpNum (lastloadedmaplumpnum+ML_SECTORS,PU_CACHE);    ss = sectors;    put = save_p;    for (i=0 ; i<numsectors ; i++, ss++, ms++)    {        diff=0;diff2=0;        if (ss->floorheight != SHORT(ms->floorheight)<<FRACBITS)            diff |= SD_FLOORHT;        if (ss->ceilingheight != SHORT(ms->ceilingheight)<<FRACBITS)            diff |= SD_CEILHT;        //        //  flats        //        // P_AddLevelFlat should not add but just return the number        if (ss->floorpic != P_AddLevelFlat (ms->floorpic,levelflats))            diff |= SD_FLOORPIC;        if (ss->ceilingpic != P_AddLevelFlat (ms->ceilingpic,levelflats))            diff |= SD_CEILPIC;        if (ss->lightlevel != SHORT(ms->lightlevel))     diff |= SD_LIGHT;        if (ss->special != SHORT(ms->special))           diff |= SD_SPECIAL;        if (ss->floor_xoffs != 0)                        diff2 |= SD_FXOFFS;        if (ss->floor_yoffs != 0)                        diff2 |= SD_FYOFFS;        if (ss->ceiling_xoffs != 0)                      diff2 |= SD_CXOFFS;        if (ss->ceiling_yoffs != 0)                      diff2 |= SD_CYOFFS;        if (ss->stairlock < 0)                           diff2 |= SD_STAIRLOCK;        if (ss->nextsec != -1)                           diff2 |= SD_NEXTSEC;        if (ss->prevsec != -1)                           diff2 |= SD_PREVSEC;        if (diff2)                                       diff |= SD_DIFF2;        if(diff)        {            statsec++;            WRITESHORT(put,i);            WRITEBYTE(put,diff);            if( diff & SD_DIFF2   )     WRITEBYTE(put,diff2);            if( diff & SD_FLOORHT )     WRITEFIXED(put,ss->floorheight);            if( diff & SD_CEILHT  )     WRITEFIXED(put,ss->ceilingheight);            if( diff & SD_FLOORPIC)            {                memcpy(put,levelflats[ss->floorpic].name,8);                put+=8;            }            if( diff & SD_CEILPIC )            {                memcpy(put,levelflats[ss->ceilingpic].name,8);                put+=8;            }            if( diff & SD_LIGHT   )     WRITESHORT(put,(short)ss->lightlevel);            if( diff & SD_SPECIAL )     WRITESHORT(put,(short)ss->special);            if( diff2 & SD_FXOFFS  )    WRITEFIXED(put,ss->floor_xoffs);            if( diff2 & SD_FYOFFS  )    WRITEFIXED(put,ss->floor_yoffs);            if( diff2 & SD_CXOFFS  )    WRITEFIXED(put,ss->ceiling_xoffs);            if( diff2 & SD_CYOFFS  )    WRITEFIXED(put,ss->ceiling_yoffs);            if( diff2 & SD_STAIRLOCK)   WRITELONG (put,ss->stairlock);            if( diff2 & SD_NEXTSEC )    WRITELONG (put,ss->nextsec);            if( diff2 & SD_PREVSEC )    WRITELONG (put,ss->prevsec);        }    }    *((unsigned short *)put)++=0xffff;    mld = W_CacheLumpNum (lastloadedmaplumpnum+ML_LINEDEFS,PU_CACHE);    msd = W_CacheLumpNum (lastloadedmaplumpnum+ML_SIDEDEFS,PU_CACHE);    li = lines;    // do lines    for (i=0 ; i<numlines ; i++,mld++,li++)    {        diff=0;diff2=0;        // we don't care of map in deathmatch !        if(((cv_deathmatch.value==0) && (li->flags != SHORT(mld->flags))) ||           ((cv_deathmatch.value!=0) && ((li->flags & ~ML_MAPPED) != SHORT(mld->flags))))            diff |= LD_FLAG;        if(li->special != SHORT(mld->special))            diff |= LD_SPECIAL;        if (li->sidenum[0] != -1)        {            si = &sides[li->sidenum[0]];            if (si->textureoffset != SHORT(msd[li->sidenum[0]].textureoffset)<<FRACBITS)                diff |= LD_S1TEXOFF;            //SoM: 4/1/2000: Some textures are colormaps. Don't worry about invalid textures.            if(R_CheckTextureNumForName(msd[li->sidenum[0]].toptexture) != -1)              if (si->toptexture != R_TextureNumForName(msd[li->sidenum[0]].toptexture) )                diff |= LD_S1TOPTEX;            if(R_CheckTextureNumForName(msd[li->sidenum[0]].bottomtexture) != -1)              if (si->bottomtexture != R_TextureNumForName(msd[li->sidenum[0]].bottomtexture) )                diff |= LD_S1BOTTEX;            if(R_CheckTextureNumForName(msd[li->sidenum[0]].midtexture) != -1)              if (si->midtexture != R_TextureNumForName(msd[li->sidenum[0]].midtexture) )                diff |= LD_S1MIDTEX;        }        if (li->sidenum[1] != -1)        {            si = &sides[li->sidenum[1]];            if (si->textureoffset != SHORT(msd[li->sidenum[1]].textureoffset)<<FRACBITS)                diff2 |= LD_S2TEXOFF;            if(R_CheckTextureNumForName(msd[li->sidenum[1]].toptexture) != -1)              if (si->toptexture != R_TextureNumForName(msd[li->sidenum[1]].toptexture) )                diff2 |= LD_S2TOPTEX;            if(R_CheckTextureNumForName(msd[li->sidenum[1]].bottomtexture) != -1)              if (si->bottomtexture != R_TextureNumForName(msd[li->sidenum[1]].bottomtexture) )                diff2 |= LD_S2BOTTEX;            if(R_CheckTextureNumForName(msd[li->sidenum[1]].midtexture) != -1)              if (si->midtexture != R_TextureNumForName(msd[li->sidenum[1]].midtexture) )                diff2 |= LD_S2MIDTEX;            if(diff2)                diff |= LD_DIFF2;        }        if(diff)        {            statline++;            WRITESHORT(put,(short)i);            WRITEBYTE(put,diff);            if( diff & LD_DIFF2    )     WRITEBYTE(put,diff2);            if( diff & LD_FLAG     )     WRITESHORT(put,li->flags);            if( diff & LD_SPECIAL  )     WRITESHORT(put,li->special);            si = &sides[li->sidenum[0]];            if( diff & LD_S1TEXOFF )     WRITEFIXED(put,si->textureoffset);            if( diff & LD_S1TOPTEX )     WRITESHORT(put,si->toptexture);            if( diff & LD_S1BOTTEX )     WRITESHORT(put,si->bottomtexture);            if( diff & LD_S1MIDTEX )     WRITESHORT(put,si->midtexture);            si = &sides[li->sidenum[1]];            if( diff2 & LD_S2TEXOFF )    WRITEFIXED(put,si->textureoffset);            if( diff2 & LD_S2TOPTEX )    WRITESHORT(put,si->toptexture);            if( diff2 & LD_S2BOTTEX )    WRITESHORT(put,si->bottomtexture);            if( diff2 & LD_S2MIDTEX )    WRITESHORT(put,si->midtexture);        }    }    WRITEUSHORT(put,0xffff);    //CONS_Printf("sector saved %d/%d, line saved %d/%d\n",statsec,numsectors,statline,numlines);    save_p = put;}//// P_UnArchiveWorld//void P_UnArchiveWorld (void){    int                 i;    line_t*     li;    side_t*     si;    byte*       get;    byte        diff,diff2;    get = save_p;    while (1)    {        i=*((unsigned short *)get)++;        if (i==0xffff)            break;        diff=READBYTE(get);        if( diff & SD_DIFF2    )   diff2 = READBYTE(get);                              else diff2 = 0;        if( diff & SD_FLOORHT  )   sectors[i].floorheight   = READFIXED(get);        if( diff & SD_CEILHT   )   sectors[i].ceilingheight = READFIXED(get);        if( diff & SD_FLOORPIC )        {            sectors[i].floorpic = P_AddLevelFlat (get,levelflats);            get+=8;        }        if( diff & SD_CEILPIC )        {            sectors[i].ceilingpic = P_AddLevelFlat (get,levelflats);            get+=8;        }        if( diff & SD_LIGHT )    sectors[i].lightlevel = READSHORT(get);        if( diff & SD_SPECIAL )  sectors[i].special    = READSHORT(get);        if( diff2 & SD_FXOFFS )  sectors[i].floor_xoffs     = READFIXED(get);        if( diff2 & SD_FYOFFS )  sectors[i].floor_yoffs     = READFIXED(get);        if( diff2 & SD_CXOFFS )  sectors[i].ceiling_xoffs   = READFIXED(get);        if( diff2 & SD_CYOFFS )  sectors[i].ceiling_yoffs   = READFIXED(get);        if( diff2 & SD_STAIRLOCK)sectors[i].stairlock       = READLONG (get);                            else sectors[i].stairlock       = 0;        if( diff2 & SD_NEXTSEC)  sectors[i].nextsec         = READLONG (get);                            else sectors[i].nextsec         = -1;        if( diff2 & SD_PREVSEC)  sectors[i].prevsec         = READLONG (get);                            else sectors[i].prevsec         = -1;    }    while(1)    {        i=READUSHORT(get);        if (i==0xffff)            break;        diff = READBYTE(get);        li = &lines[i];        if( diff & LD_DIFF2    )    diff2 = READBYTE(get);                               else diff2 = 0;        if( diff & LD_FLAG     )    li->flags = READSHORT(get);        if( diff & LD_SPECIAL  )    li->special = READSHORT(get);        si = &sides[li->sidenum[0]];        if( diff & LD_S1TEXOFF )    si->textureoffset = READFIXED(get);        if( diff & LD_S1TOPTEX )    si->toptexture    = READSHORT(get);        if( diff & LD_S1BOTTEX )    si->bottomtexture = READSHORT(get);        if( diff & LD_S1MIDTEX )    si->midtexture    = READSHORT(get);        si = &sides[li->sidenum[1]];        if( diff2 & LD_S2TEXOFF )   si->textureoffset = READFIXED(get);        if( diff2 & LD_S2TOPTEX )   si->toptexture    = READSHORT(get);        if( diff2 & LD_S2BOTTEX )   si->bottomtexture = READSHORT(get);        if( diff2 & LD_S2MIDTEX )   si->midtexture    = READSHORT(get);    }    save_p = get;}//// Thinkers//typedef enum {    MD_SPAWNPOINT = 0x000001,    MD_POS        = 0x000002,    MD_TYPE       = 0x000004,    MD_Z          = 0x000008,    MD_MOM        = 0x000010,    MD_RADIUS     = 0x000020,    MD_HEIGHT     = 0x000040,    MD_FLAGS      = 0x000080,    MD_HEALTH     = 0x000100,    MD_RTIME      = 0x000200,    MD_STATE      = 0x000400,    MD_TICS       = 0x000800,    MD_SPRITE     = 0x001000,    MD_FRAME      = 0x002000,    MD_EFLAGS     = 0x004000,    MD_PLAYER     = 0x008000,    MD_MOVEDIR    = 0x010000,    MD_MOVECOUNT  = 0x020000,    MD_THRESHOLD  = 0x040000,    MD_LASTLOOK   = 0x080000,    MD_TARGET     = 0x100000,    MD_TRACER     = 0x200000,    MD_FRICTION   = 0x400000,    MD_MOVEFACTOR = 0x800000,    MD_FLAGS2     =0x1000000,    MD_SPECIAL1   =0x2000000,    MD_SPECIAL2   =0x4000000,} mobj_diff_t;enum{    tc_mobj,    tc_ceiling,    tc_door,    tc_floor,    tc_plat,    tc_flash,    tc_strobe,    tc_glow,    tc_fireflicker,    tc_elevator, //SoM: 3/15/2000: Add extra boom types.    tc_scroll,    tc_friction,    tc_pusher,    tc_end} specials_e;//// P_ArchiveThinkers////// Things to handle://// P_MobjsThinker (all mobj)// T_MoveCeiling, (ceiling_t: sector_t * swizzle), - active list// T_VerticalDoor, (vldoor_t: sector_t * swizzle),// T_MoveFloor, (floormove_t: sector_t * swizzle),// T_LightFlash, (lightflash_t: sector_t * swizzle),// T_StrobeFlash, (strobe_t: sector_t *),// T_Glow, (glow_t: sector_t *),// T_PlatRaise, (plat_t: sector_t *), - active list// BP: added missing : T_FireFlicker//void P_ArchiveThinkers (void){    thinker_t*          th;    mobj_t*             mobj;    ULONG               diff;//    int                 i; //SoM: 3/16/2000: Removed. Not used any more.    // save off the current thinkers    for (th = thinkercap.next ; th != &thinkercap ; th=th->next)    {        if (th->function.acp1 == (actionf_p1)P_MobjThinker)        {            mobj = (mobj_t *)th;/*            // not a monster nor a picable item so don't save it            if( (((mobj->flags & (MF_COUNTKILL | MF_PICKUP | MF_SHOOTABLE )) == 0)                 && (mobj->flags & MF_MISSILE)                 && (mobj->info->doomednum !=-1) )                || (mobj->type == MT_BLOOD) )                continue;*/            if( mobj->spawnpoint && (mobj->info->doomednum !=-1)) {                // spawnpoint is not moddified but we must save it since it is a indentifier                diff = MD_SPAWNPOINT;                if((mobj->x != mobj->spawnpoint->x << FRACBITS) ||                   (mobj->y != mobj->spawnpoint->y << FRACBITS) ||                   (mobj->angle != (unsigned)(ANG45 * (mobj->spawnpoint->angle/45))) ) diff |= MD_POS;                if(mobj->info->doomednum != mobj->spawnpoint->type)        diff |= MD_TYPE;            }            else            {                diff = MD_POS | MD_TYPE;            }            // not the default but the most probable            if( mobj->z             != mobj->floorz)                       diff |= MD_Z;            if((mobj->momx != 0)||(mobj->momy != 0)||(mobj->momz != 0) )   diff |= MD_MOM;            if( mobj->radius        != mobj->info->radius       )          diff |= MD_RADIUS;            if( mobj->height        != mobj->info->height       )          diff |= MD_HEIGHT;            if( mobj->flags         != mobj->info->flags        )          diff |= MD_FLAGS;            if( mobj->flags2        != mobj->info->flags2       )          diff |= MD_FLAGS2;            if( mobj->health        != mobj->info->spawnhealth  )          diff |= MD_HEALTH;            if( mobj->reactiontime  != mobj->info->reactiontime )          diff |= MD_RTIME;            if( mobj->state-states  != mobj->info->spawnstate   )          diff |= MD_STATE;            if( mobj->tics          != mobj->state->tics        )          diff |= MD_TICS;            if( mobj->sprite        != mobj->state->sprite      )          diff |= MD_SPRITE;            if( mobj->frame         != mobj->state->frame       )          diff |= MD_FRAME;            if( mobj->eflags        )                                      diff |= MD_EFLAGS;            if( mobj->player        )                                      diff |= MD_PLAYER;            if( mobj->movedir       )                                      diff |= MD_MOVEDIR;            if( mobj->movecount     )                                      diff |= MD_MOVECOUNT;            if( mobj->threshold     )                                      diff |= MD_THRESHOLD;            if( mobj->lastlook      != -1 )                                diff |= MD_LASTLOOK;            if( mobj->target        )                                      diff |= MD_TARGET;            if( mobj->tracer        )                                      diff |= MD_TRACER;            if( mobj->friction      !=ORIG_FRICTION             )          diff |= MD_FRICTION;            if( mobj->movefactor    !=ORIG_FRICTION_FACTOR      )          diff |= MD_MOVEFACTOR;            if( mobj->special1      )                                      diff |= MD_SPECIAL1;            if( mobj->special2      )                                      diff |= MD_SPECIAL2;            PADSAVEP();            WRITEBYTE(save_p, tc_mobj);            WRITEULONG(save_p, diff);            WRITEULONG(save_p, (ULONG)mobj);            if( diff & MD_SPAWNPOINT )   WRITESHORT(save_p, mobj->spawnpoint-mapthings);            if( diff & MD_TYPE       )   WRITEULONG(save_p, mobj->type);            if( diff & MD_POS        ) { WRITEFIXED(save_p, mobj->x);                                         WRITEFIXED(save_p, mobj->y);                                         WRITEANGLE(save_p, mobj->angle);     }            if( diff & MD_Z          )   WRITEFIXED(save_p, mobj->z);            if( diff & MD_MOM        ) { WRITEFIXED(save_p, mobj->momx);                                         WRITEFIXED(save_p, mobj->momy);                                         WRITEFIXED(save_p, mobj->momz);      }            if( diff & MD_RADIUS     )   WRITEFIXED(save_p, mobj->radius      );            if( diff & MD_HEIGHT     )   WRITEFIXED(save_p, mobj->height      );            if( diff & MD_FLAGS      )   WRITELONG (save_p, mobj->flags       );            if( diff & MD_FLAGS2     )   WRITELONG (save_p, mobj->flags2      );            if( diff & MD_HEALTH     )   WRITELONG (save_p, mobj->health      );            if( diff & MD_RTIME      )   WRITELONG (save_p, mobj->reactiontime);            if( diff & MD_STATE      )  WRITEUSHORT(save_p, mobj->state-states);            if( diff & MD_TICS       )   WRITELONG (save_p, mobj->tics        );            if( diff & MD_SPRITE     )  WRITEUSHORT(save_p, mobj->sprite      );            if( diff & MD_FRAME      )   WRITEULONG(save_p, mobj->frame       );            if( diff & MD_EFLAGS     )   WRITEULONG(save_p, mobj->eflags      );            if( diff & MD_PLAYER     )   WRITEBYTE (save_p, mobj->player-players );            if( diff & MD_MOVEDIR    )   WRITELONG (save_p, mobj->movedir     );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -