/* ----------------------------------------------------------------------------- Function: MapRipper -Re-encode map data. Parameters: extension -[in] file extension for map data files. Returns: Nothing. Notes: ----------------------------------------------------------------------------- */ PUBLIC _boolean MapRipper( const char *fextension, W16 version ) { W32 i; char fname[ 32 ]; gameversion = version; // // Setup // if( 0 == FS_Mkdir( MAPDIR ) ) { printf( "[%s] Could not create directory (%s)!\n", "wolf_map.c", MAPDIR ); return false; } if( ! CAL_SetupMapFile( fextension ) ) { CAL_ShutdownMapFile(); return false; } // // Decode Map data // printf( "Decoding Map Data...\n" ); for( i = 0 ; i < TotalMaps ; ++i ) { cs_snprintf( fname, sizeof( fname ), "%s/%c%.2d.map", MAPDIR, TOLOWER( fextension[ 1 ] ), i ); CA_CacheMap( headeroffsets[ i ], headeroffsets[ i + 1 ] - headeroffsets[ i ], fname, i ); } // // Shutdown // CAL_ShutdownMapFile(); return true; }
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 (); }