void BasicOverhead (void) { int x, y, z, offx, offy; z = 128/MAPSIZE; // zoom scale offx = 320/2; offy = (160-MAPSIZE*z)/2; #ifdef MAPBORDER int temp = viewsize; NewViewSize(16); DrawPlayBorder(); #endif // right side (raw) for(x=0;x<MAPSIZE;x++) for(y=0;y<MAPSIZE;y++) VWB_Bar(x*z+offx, y*z+offy,z,z,(unsigned)(uintptr_t)actorat[x][y]); // left side (filtered) uintptr_t tile; int color; offx -= 128; for(x=0;x<MAPSIZE;x++) { for(y=0;y<MAPSIZE;y++) { tile = (uintptr_t)actorat[x][y]; if (ISPOINTER(tile) && ((objtype *)tile)->flags&FL_SHOOTABLE) color = 72; // enemy else if (!tile || ISPOINTER(tile)) { if (spotvis[x][y]) color = 111; // visable else color = 0; // nothing } else if (MAPSPOT(x,y,1) == PUSHABLETILE) color = 171; // pushwall else if (tile == 64) color = 158; // solid obj else if (tile < 128) color = 154; // walls else if (tile < 256) color = 146; // doors VWB_Bar(x*z+offx, y*z+offy,z,z,color); } } VWB_Bar(player->tilex*z+offx,player->tiley*z+offy,z,z,15); // player // resize the border to match VW_UpdateScreen(); IN_Ack(); #ifdef MAPBORDER NewViewSize(temp); DrawPlayBorder(); #endif }
boolean SaveTheGame(FILE *file,int x,int y) { objtype *ob; objtype nullobj; statobj_t nullstat; unsigned i, j; int checksum = 0; DiskFlopAnim(x,y); fwrite(&gamestate,sizeof(gamestate),1,file); checksum = DoChecksum((byte *)&gamestate,sizeof(gamestate),checksum); DiskFlopAnim(x,y); fwrite(&LevelRatios[0],sizeof(LRstruct)*LRpack,1,file); checksum = DoChecksum((byte *)&LevelRatios[0],sizeof(LRstruct)*LRpack,checksum); DiskFlopAnim(x,y); fwrite(tilemap,sizeof(tilemap),1,file); checksum = DoChecksum((byte *)tilemap,sizeof(tilemap),checksum); DiskFlopAnim(x,y); for(i = 0; i < MAPSIZE; i++) { for(j = 0; j < MAPSIZE; j++) { word actnum; objtype *objptr=actorat[i][j]; if(ISPOINTER(objptr)) actnum=0x8000 | (word)(objptr-objlist); else actnum=(word)(uintptr_t)objptr; fwrite(&actnum,sizeof(actnum),1,file); checksum = DoChecksum((byte *)&actnum,sizeof(actnum),checksum); } } fwrite (areaconnect,sizeof(areaconnect),1,file); fwrite (areabyplayer,sizeof(areabyplayer),1,file); // player object needs special treatment as it's in WL_AGENT.CPP and not in // WL_ACT2.CPP which could cause problems for the relative addressing ob = player; DiskFlopAnim(x,y); memcpy(&nullobj,ob,sizeof(nullobj)); nullobj.state=(statetype *) ((uintptr_t)nullobj.state-(uintptr_t)&s_player); fwrite(&nullobj,sizeof(nullobj),1,file); ob = ob->next; DiskFlopAnim(x,y); for (; ob ; ob=ob->next) { memcpy(&nullobj,ob,sizeof(nullobj)); nullobj.state=(statetype *) ((uintptr_t)nullobj.state-(uintptr_t)&s_grdstand); fwrite(&nullobj,sizeof(nullobj),1,file); } nullobj.active = ac_badobject; // end of file marker DiskFlopAnim(x,y); fwrite(&nullobj,sizeof(nullobj),1,file); DiskFlopAnim(x,y); word laststatobjnum=(word) (laststatobj-statobjlist); fwrite(&laststatobjnum,sizeof(laststatobjnum),1,file); checksum = DoChecksum((byte *)&laststatobjnum,sizeof(laststatobjnum),checksum); DiskFlopAnim(x,y); for(i = 0; i < MAXSTATS; i++) { memcpy(&nullstat,statobjlist+i,sizeof(nullstat)); nullstat.visspot=(byte *) ((uintptr_t) nullstat.visspot-(uintptr_t)spotvis); fwrite(&nullstat,sizeof(nullstat),1,file); checksum = DoChecksum((byte *)&nullstat,sizeof(nullstat),checksum); } DiskFlopAnim(x,y); fwrite (doorposition,sizeof(doorposition),1,file); checksum = DoChecksum((byte *)doorposition,sizeof(doorposition),checksum); DiskFlopAnim(x,y); fwrite (doorobjlist,sizeof(doorobjlist),1,file); checksum = DoChecksum((byte *)doorobjlist,sizeof(doorobjlist),checksum); DiskFlopAnim(x,y); fwrite (&pwallstate,sizeof(pwallstate),1,file); checksum = DoChecksum((byte *)&pwallstate,sizeof(pwallstate),checksum); fwrite (&pwalltile,sizeof(pwalltile),1,file); checksum = DoChecksum((byte *)&pwalltile,sizeof(pwalltile),checksum); fwrite (&pwallx,sizeof(pwallx),1,file); checksum = DoChecksum((byte *)&pwallx,sizeof(pwallx),checksum); fwrite (&pwally,sizeof(pwally),1,file); checksum = DoChecksum((byte *)&pwally,sizeof(pwally),checksum); fwrite (&pwalldir,sizeof(pwalldir),1,file); checksum = DoChecksum((byte *)&pwalldir,sizeof(pwalldir),checksum); fwrite (&pwallpos,sizeof(pwallpos),1,file); checksum = DoChecksum((byte *)&pwallpos,sizeof(pwallpos),checksum); /* WRITE OUT CHECKSUM */ fwrite (&checksum,sizeof(checksum),1,file); fwrite (&lastgamemusicoffset,sizeof(lastgamemusicoffset),1,file); return(true); }
boolean SaveTheGame(FILE *file,int x,int y) { // struct diskfree_t dfree; // int32_t avail,size,checksum; int checksum; objtype *ob; objtype nullobj; statobj_t nullstat; /* if (_dos_getdiskfree(0,&dfree)) Quit("Error in _dos_getdiskfree call"); avail = (int32_t)dfree.avail_clusters * dfree.bytes_per_sector * dfree.sectors_per_cluster; size = 0; for (ob = player; ob ; ob=ob->next) size += sizeof(*ob); size += sizeof(nullobj); size += sizeof(gamestate) + sizeof(LRstruct)*LRpack + sizeof(tilemap) + sizeof(actorat) + sizeof(laststatobj) + sizeof(statobjlist) + sizeof(doorposition) + sizeof(pwallstate) + sizeof(pwalltile) + sizeof(pwallx) + sizeof(pwally) + sizeof(pwalldir) + sizeof(pwallpos); if (avail < size) { Message(STR_NOSPACE1"\n"STR_NOSPACE2); return false; }*/ checksum = 0; DiskFlopAnim(x,y); fwrite(&gamestate,sizeof(gamestate),1,file); checksum = DoChecksum((byte *)&gamestate,sizeof(gamestate),checksum); DiskFlopAnim(x,y); fwrite(&LevelRatios[0],sizeof(LRstruct)*LRpack,1,file); checksum = DoChecksum((byte *)&LevelRatios[0],sizeof(LRstruct)*LRpack,checksum); DiskFlopAnim(x,y); fwrite(tilemap,sizeof(tilemap),1,file); checksum = DoChecksum((byte *)tilemap,sizeof(tilemap),checksum); DiskFlopAnim(x,y); int i; for(i=0;i<MAPSIZE;i++) { for(int j=0;j<MAPSIZE;j++) { word actnum; objtype *objptr=actorat[i][j]; if(ISPOINTER(objptr)) actnum=0x8000 | (word)(objptr-objlist); else actnum=(word)(uintptr_t)objptr; fwrite(&actnum,sizeof(actnum),1,file); checksum = DoChecksum((byte *)&actnum,sizeof(actnum),checksum); } } fwrite (areaconnect,sizeof(areaconnect),1,file); fwrite (areabyplayer,sizeof(areabyplayer),1,file); // player object needs special treatment as it's in WL_AGENT.CPP and not in // WL_ACT2.CPP which could cause problems for the relative addressing ob = player; DiskFlopAnim(x,y); memcpy(&nullobj,ob,sizeof(nullobj)); nullobj.state=(statetype *) ((uintptr_t)nullobj.state-(uintptr_t)&s_player); fwrite(&nullobj,sizeof(nullobj),1,file); ob = ob->next; DiskFlopAnim(x,y); for (; ob ; ob=ob->next) { memcpy(&nullobj,ob,sizeof(nullobj)); nullobj.state=(statetype *) ((uintptr_t)nullobj.state-(uintptr_t)&s_grdstand); fwrite(&nullobj,sizeof(nullobj),1,file); } nullobj.active = ac_badobject; // end of file marker DiskFlopAnim(x,y); fwrite(&nullobj,sizeof(nullobj),1,file); DiskFlopAnim(x,y); word laststatobjnum=(word) (laststatobj-statobjlist); fwrite(&laststatobjnum,sizeof(laststatobjnum),1,file); checksum = DoChecksum((byte *)&laststatobjnum,sizeof(laststatobjnum),checksum); DiskFlopAnim(x,y); for(i=0;i<MAXSTATS;i++) { memcpy(&nullstat,statobjlist+i,sizeof(nullstat)); nullstat.visspot=(byte *) ((uintptr_t) nullstat.visspot-(uintptr_t)spotvis); fwrite(&nullstat,sizeof(nullstat),1,file); checksum = DoChecksum((byte *)&nullstat,sizeof(nullstat),checksum); } DiskFlopAnim(x,y); fwrite (doorposition,sizeof(doorposition),1,file); checksum = DoChecksum((byte *)doorposition,sizeof(doorposition),checksum); DiskFlopAnim(x,y); fwrite (doorobjlist,sizeof(doorobjlist),1,file); checksum = DoChecksum((byte *)doorobjlist,sizeof(doorobjlist),checksum); DiskFlopAnim(x,y); fwrite (&pwallstate,sizeof(pwallstate),1,file); checksum = DoChecksum((byte *)&pwallstate,sizeof(pwallstate),checksum); fwrite (&pwalltile,sizeof(pwalltile),1,file); checksum = DoChecksum((byte *)&pwalltile,sizeof(pwalltile),checksum); fwrite (&pwallx,sizeof(pwallx),1,file); checksum = DoChecksum((byte *)&pwallx,sizeof(pwallx),checksum); fwrite (&pwally,sizeof(pwally),1,file); checksum = DoChecksum((byte *)&pwally,sizeof(pwally),checksum); fwrite (&pwalldir,sizeof(pwalldir),1,file); checksum = DoChecksum((byte *)&pwalldir,sizeof(pwalldir),checksum); fwrite (&pwallpos,sizeof(pwallpos),1,file); checksum = DoChecksum((byte *)&pwallpos,sizeof(pwallpos),checksum); // // WRITE OUT CHECKSUM // fwrite (&checksum,sizeof(checksum),1,file); fwrite (&lastgamemusicoffset,sizeof(lastgamemusicoffset),1,file); return(true); }