void SetupGameLevel (void) { int x,y,i; unsigned far *map,tile,spot; if (!loadedgame) { gamestate.TimeCount= gamestate.secrettotal= gamestate.killtotal= gamestate.treasuretotal= gamestate.secretcount= gamestate.killcount= gamestate.treasurecount=0; } if (demoplayback || demorecord) US_InitRndT (false); else US_InitRndT (true); // // load the level // CA_CacheMap (gamestate.mapon+10*gamestate.episode); mapon-=gamestate.episode*10; mapwidth = mapheaderseg[mapon]->width; mapheight = mapheaderseg[mapon]->height; if (mapwidth != 64 || mapheight != 64) Quit ("Map not 64*64!"); // // copy the wall data to a data segment array // memset (tilemap,0,sizeof(tilemap)); memset (actorat,0,sizeof(actorat)); map = mapsegs[0]; for (y=0;y<mapheight;y++) for (x=0;x<mapwidth;x++) { tile = *map++; if (tile<AREATILE) { // solid wall tilemap[x][y] = tile; (unsigned)actorat[x][y] = tile; } else { // area floor tilemap[x][y] = 0; (unsigned)actorat[x][y] = 0; } } // // spawn doors // InitActorList (); // start spawning things with a clean slate InitDoorList (); InitStaticList (); map = mapsegs[0]; for (y=0;y<mapheight;y++) for (x=0;x<mapwidth;x++) { tile = *map++; if (tile >= 90 && tile <= 101) { // door switch (tile) { case 90: case 92: case 94: case 96: case 98: case 100: SpawnDoor (x,y,1,(tile-90)/2); break; case 91: case 93: case 95: case 97: case 99: case 101: SpawnDoor (x,y,0,(tile-91)/2); break; } } } // // spawn actors // ScanInfoPlane (); // // take out the ambush markers // map = mapsegs[0]; for (y=0;y<mapheight;y++) for (x=0;x<mapwidth;x++) { tile = *map++; if (tile == AMBUSHTILE) { tilemap[x][y] = 0; if ( (unsigned)actorat[x][y] == AMBUSHTILE) actorat[x][y] = NULL; if (*map >= AREATILE) tile = *map; if (*(map-1-mapwidth) >= AREATILE) tile = *(map-1-mapwidth); if (*(map-1+mapwidth) >= AREATILE) tile = *(map-1+mapwidth); if ( *(map-2) >= AREATILE) tile = *(map-2); *(map-1) = tile; } } // // have the caching manager load and purge stuff to make sure all marks // are in memory // CA_LoadAllSounds (); }
boolean LoadTheGame(FILE *file,int x,int y) { int32_t oldchecksum; objtype nullobj; statobj_t nullstat; int actnum=0, i, j; int32_t checksum = 0; DiskFlopAnim(x,y); fread (&gamestate,sizeof(gamestate),1,file); checksum = DoChecksum((byte *)&gamestate,sizeof(gamestate),checksum); DiskFlopAnim(x,y); fread (&LevelRatios[0],sizeof(LRstruct)*LRpack,1,file); checksum = DoChecksum((byte *)&LevelRatios[0],sizeof(LRstruct)*LRpack,checksum); DiskFlopAnim(x,y); SetupGameLevel (); DiskFlopAnim(x,y); fread (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++) { fread (&actnum,sizeof(word),1,file); checksum = DoChecksum((byte *) &actnum,sizeof(word),checksum); if(actnum&0x8000) actorat[i][j]=objlist+(actnum&0x7fff); else actorat[i][j]=(objtype *)(uintptr_t) actnum; } } fread (areaconnect,sizeof(areaconnect),1,file); fread (areabyplayer,sizeof(areabyplayer),1,file); InitActorList (); DiskFlopAnim(x,y); fread (player,sizeof(*player),1,file); player->state=(statetype *) ((uintptr_t)player->state+(uintptr_t)&s_player); /* Load all actors ? */ while (1) { DiskFlopAnim(x,y); fread (&nullobj,sizeof(nullobj),1,file); if (nullobj.active == ac_badobject) break; GetNewActor (); nullobj.state=(statetype *) ((uintptr_t)nullobj.state+(uintptr_t)&s_grdstand); /* don't copy over the links */ memcpy (newobj,&nullobj,sizeof(nullobj)-8); } DiskFlopAnim(x,y); word laststatobjnum; fread (&laststatobjnum,sizeof(laststatobjnum),1,file); laststatobj=statobjlist+laststatobjnum; checksum = DoChecksum((byte *)&laststatobjnum,sizeof(laststatobjnum),checksum); DiskFlopAnim(x,y); for(i=0; i<MAXSTATS; i++) { fread(&nullstat,sizeof(nullstat),1,file); checksum = DoChecksum((byte *)&nullstat,sizeof(nullstat),checksum); nullstat.visspot=(byte *) ((uintptr_t)nullstat.visspot+(uintptr_t)spotvis); memcpy(statobjlist+i,&nullstat,sizeof(nullstat)); } DiskFlopAnim(x,y); fread (doorposition,sizeof(doorposition),1,file); checksum = DoChecksum((byte *)doorposition,sizeof(doorposition),checksum); DiskFlopAnim(x,y); fread (doorobjlist,sizeof(doorobjlist),1,file); checksum = DoChecksum((byte *)doorobjlist,sizeof(doorobjlist),checksum); DiskFlopAnim(x,y); fread (&pwallstate,sizeof(pwallstate),1,file); checksum = DoChecksum((byte *)&pwallstate,sizeof(pwallstate),checksum); fread (&pwalltile,sizeof(pwalltile),1,file); checksum = DoChecksum((byte *)&pwalltile,sizeof(pwalltile),checksum); fread (&pwallx,sizeof(pwallx),1,file); checksum = DoChecksum((byte *)&pwallx,sizeof(pwallx),checksum); fread (&pwally,sizeof(pwally),1,file); checksum = DoChecksum((byte *)&pwally,sizeof(pwally),checksum); fread (&pwalldir,sizeof(pwalldir),1,file); checksum = DoChecksum((byte *)&pwalldir,sizeof(pwalldir),checksum); fread (&pwallpos,sizeof(pwallpos),1,file); checksum = DoChecksum((byte *)&pwallpos,sizeof(pwallpos),checksum); /* assign valid floorcodes under moved pushwalls */ if (gamestate.secretcount) { word *map, *obj; word tile, sprite; map = mapsegs[0]; obj = mapsegs[1]; for (y=0; y<mapheight; y++) for (x=0; x<mapwidth; x++) { tile = *map++; sprite = *obj++; if (sprite == PUSHABLETILE && !tilemap[x][y] && (tile < AREATILE || tile >= (AREATILE+NUMMAPS))) { if (*map >= AREATILE) tile = *map; if (*(map-1-mapwidth) >= AREATILE) tile = *(map-1-mapwidth); if (*(map-1+mapwidth) >= AREATILE) tile = *(map-1+mapwidth); if ( *(map-2) >= AREATILE) tile = *(map-2); *(map-1) = tile; *(obj-1) = 0; } } } /* set player->areanumber to the floortile you're standing on */ Thrust(0,0); fread (&oldchecksum,sizeof(oldchecksum),1,file); fread (&lastgamemusicoffset,sizeof(lastgamemusicoffset),1,file); if(lastgamemusicoffset<0) lastgamemusicoffset=0; if (oldchecksum != checksum) { Message(STR_SAVECHT1"\n" STR_SAVECHT2"\n" STR_SAVECHT3"\n" STR_SAVECHT4); IN_ClearKeysDown(); IN_Ack(); gamestate.oldscore = gamestate.score = 0; gamestate.lives = 1; gamestate.weapon = gamestate.chosenweapon = gamestate.bestweapon = wp_pistol; gamestate.ammo = 8; } return true; }