1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084 |
- /*
- Copyright (C) 2004-2005 Michael Liebscher <johnnycanuck@users.sourceforge.net>
- Copyright (C) 2000 Steven Fuller <relnev@atdot.org>
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- /*
- * mac.c: This module is used to extract data from the Macintosh
- * version of Wolfenstein 3-D.
- *
- * Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
- *
- * Acknowledgement:
- * Portion of this code was derived from code that was originally
- * written by Steven Fuller.
- *
- */
- #include <stdio.h>
- #include <string.h>
- #include "mac.h"
- #include "../wolf/wolf_def.h"
- #include "../../../common/arch.h"
- #include "../../../common/common_utils.h"
- #include "../loaders/tga.h"
- #include "../memory/memory.h"
- #include "../string/com_string.h"
- #include "../filesys/file.h"
- /* Resource file Palette offsets */
- #define MACPAL 898370L
- #define IDPAL 899142L
- #define GAMEPAL 946811L
- #define INTERPAL 997211L
- #define YUMMYPAL 1011345L
- #define TITLEPAL 2235007L
- #define PALETTE_SIZE 768
- #define MACBINFILENAME "Wolfenstein 3D"
- #define FILETYPECREATOR "APPLWOLF"
- #define DATAFORKLENGTH 105754L
- #define RESFORKLENGTH 2424697L
- PRIVATE W8 *macPalette;
- PRIVATE FILE *fResHandle;
- /*
- -----------------------------------------------------------------------------
- Function: getResourceBlock -Get block of resource data.
-
- Parameters: offset -[in] Number of bytes from start of file.
- length -[in] Length of resource block.
- glen -[out] next four bytes after block.
-
- Returns: NULL on error, otherwise pointer to block of memory.
-
- Notes: Caller is responsible for freeing memory block.
- -----------------------------------------------------------------------------
- */
- PRIVATE W8 *getResourceBlock( W32 offset, W32 length, W32 *glen )
- {
- W8 *buf;
-
- fseek( fResHandle, offset, SEEK_SET );
- buf = (PW8)MM_MALLOC( length );
- if( buf == NULL )
- {
- printf( "could not malloc data\n" );
-
- return NULL;
- }
- if( fread( buf, 1, length, fResHandle ) != length )
- {
- printf( "read error on resource file\n" );
- return NULL;
- }
- if( fread( glen, 1, 4, fResHandle ) != 4 )
- {
- printf( "read error on resource file\n" );
- return NULL;
- }
- *glen = BigLong( *glen );
- return buf;
- }
- /*
- -----------------------------------------------------------------------------
- Function:
-
- Parameters:
-
- Returns:
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void Decode_LZSS( W8 *dst, const W8 *src, W32 Length )
- {
- W32 bitBucket;
- W32 runCount;
- W32 Fun;
- W8 *ptrBack;
-
- if( ! Length )
- {
- return;
- }
- bitBucket = (W32) src[ 0 ] | 0x100;
- ++src;
- do
- {
- if( bitBucket & 1 )
- {
- dst[ 0 ] = src[ 0 ];
- ++src;
- ++dst;
- --Length;
- }
- else
- {
- runCount = (W32) src[ 0 ] | ((W32) src[ 1 ] << 8);
- Fun = 0x1000 - (runCount & 0xFFF);
- ptrBack = dst - Fun;
- runCount = ((runCount >> 12) & 0x0F) + 3;
- if( Length >= runCount )
- {
- Length -= runCount;
- }
- else
- {
- runCount = Length;
- Length = 0;
- }
- while( runCount-- )
- {
- *dst++ = *ptrBack++;
- }
- src += 2;
- }
- bitBucket >>= 1;
- if( bitBucket == 1 )
- {
- bitBucket = (W32) src[ 0 ] | 0x100;
- ++src;
- }
- } while( Length );
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Palette Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: ConvertPaletteToRGB -Convert 256 palette data to RGB.
-
- Parameters: dst -[in/out] Destination for RGB raw image data.
- src -[in] 256 palette data.
- length -[in] length of source data.
- palette -[in] Pointer to 256*3 array.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void ConvertPaletteToRGB( W8 *dst, W8 *src, W32 length, W8 *palette )
- {
- W32 i;
- for( i = 0 ; i < length ; ++i )
- {
- dst[ i * 3 ] = palette[ src[ i ] * 3 ];
- dst[ i * 3 + 1 ] = palette[ src[ i ] * 3 + 1 ];
- dst[ i * 3 + 2 ] = palette[ src[ i ] * 3 + 2 ];
- }
- }
- /*
- -----------------------------------------------------------------------------
- Function: setPalette -Set global palette.
-
- Parameters: offset -[in] offset of palette in resource file.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void setPalette( W32 offset )
- {
- W32 junk;
- if( macPalette )
- {
- MM_FREE( macPalette );
- }
- macPalette = getResourceBlock( offset, PALETTE_SIZE, &junk );
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Screen Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- PRIVATE void DecodeBJMapImage( W32 offset, W32 length )
- {
- W8 *ptrResource;
- W8 *buffer;
- char filename[ 32 ];
- W32 junk;
- ptrResource = (PW8)getResourceBlock( offset, length, &junk );
- if( ! ptrResource )
- {
- return;
- }
- buffer = (PW8) MM_MALLOC( 16 * 16 * 3 );
- ConvertPaletteToRGB( buffer, ptrResource, 16 * 16, macPalette );
- cs_snprintf( filename, sizeof( filename ), "%s/bjautomap.tga", DIRPATHPICS );
- WriteTGA( filename, 24, 16, 16, buffer, 0, 1 );
- MM_FREE( buffer );
- }
- PRIVATE void DecodeBJIntermImages( W32 offset, W32 length )
- {
- W32 *ptrResource;
- W32 uncomprLength;
- W8 *uncompr, *buffer;
- W32 indexs[3];
- W16 *ptr;
- int width, height, i;
- W32 junk;
- char filename[ 32 ];
-
- ptrResource = (PW32)getResourceBlock( offset, length, &junk );
- if( ! ptrResource )
- {
- return;
- }
-
- uncomprLength = BigLong( ptrResource[ 0 ] );
- uncompr = (PW8)MM_MALLOC( uncomprLength );
- Decode_LZSS( uncompr, (PW8)&ptrResource[ 1 ], uncomprLength );
-
- MM_FREE( ptrResource );
-
- memcpy( indexs, uncompr, 12 );
-
- indexs[ 0 ] = BigLong( indexs[ 0 ] );
- indexs[ 1 ] = BigLong( indexs[ 1 ] );
- indexs[ 2 ] = BigLong( indexs[ 2 ] );
-
-
- buffer = MM_MALLOC( 256 * 256 * 3 );
- for( i = 0 ; i < 3 ; ++i )
- {
- ptr = (PW16)&uncompr[ indexs[ i ] ];
- width = BigShort( ptr[ 0 ] );
- height = BigShort( ptr[ 1 ] );
-
- ConvertPaletteToRGB( buffer, (PW8)&ptr[ 2 ], width * height, macPalette );
-
- cs_snprintf( filename, sizeof( filename ), "%s/bj%d.tga", DIRPATHPICS, i );
- WriteTGA( filename, 24, width, height, buffer, 0, 1 );
- }
-
- MM_FREE( buffer );
-
- MM_FREE( uncompr );
- }
- /*
- -----------------------------------------------------------------------------
- Function: DecodeScreen -Decode screen from Macintosh resource fork.
-
- Parameters:
- offset -[in] offset in resource file.
- length -[in] length of data.
- filename -[in] Name of file to save as.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void DecodeScreen( W32 offset, W32 length, const char *filename )
- {
- W8 *ptrResource;
- W32 uncomprLength;
- W16 *uncompr;
- W16 width, height;
- W8 *buffer;
- W32 junk;
- ptrResource = getResourceBlock( offset, length, &junk );
- if( ! ptrResource )
- {
- return;
- }
- uncomprLength = BigLong( *((PW32)ptrResource) );
- uncompr = (PW16)MM_MALLOC( uncomprLength );
- Decode_LZSS( (PW8)uncompr, ptrResource+4, uncomprLength );
- width = BigShort( uncompr[ 0 ] );
- height = BigShort( uncompr[ 1 ] );
- buffer = MM_MALLOC( width * height * 3 );
-
- ConvertPaletteToRGB( buffer, (PW8)&uncompr[ 2 ], width * height, macPalette );
- WriteTGA( filename, 24, width, height, buffer, 0, 1 );
- MM_FREE( buffer );
- MM_FREE( uncompr );
- MM_FREE( ptrResource );
- }
- /*
- -----------------------------------------------------------------------------
- Function: RipScreens -Extract screens from Macintosh resource fork.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void RipScreens( void )
- {
- char path[ 256 ];
- setPalette( MACPAL );
- cs_snprintf( path, sizeof( path ), "%s/macplaypic.tga", DIRPATHPICS );
- DecodeScreen( 899914, 46893, path );
- setPalette( IDPAL );
- cs_snprintf( path, sizeof( path ), "%s/idpic.tga", DIRPATHPICS );
- DecodeScreen( 899914, 46893, path );
-
- setPalette( INTERPAL );
- cs_snprintf( path, sizeof( path ), "%s/intermissionpic.tga", DIRPATHPICS );
- DecodeScreen( 947583, 49624, path );
- DecodeBJIntermImages( 1018931, 20766 );
-
- setPalette( GAMEPAL );
- cs_snprintf( path, sizeof( path ), "%s/getpsychedpic.tga", DIRPATHPICS );
- DecodeScreen( 997983, 3256, path );
- DecodeBJMapImage( 2391746, 1281 );
- setPalette( YUMMYPAL );
- cs_snprintf( path, sizeof( path ), "%s/yummypic.tga", DIRPATHPICS );
- DecodeScreen( 1002299, 9042, path );
- setPalette( TITLEPAL );
- cs_snprintf( path, sizeof( path ), "%s/titlepic.tga", DIRPATHPICS );
- DecodeScreen( 2067971, 167032, path );
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Wall Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: obverseWall -Realign wall image.
-
- Parameters:
- src -[in] source data.
- width -[in] width of wall image.
- height -[in] height of wall image.
-
- Returns: NULL on error, otherwise pointer to memory block with realigned
- wall image data.
-
- Notes: Caller is responsible for freeing returned memory block.
- -----------------------------------------------------------------------------
- */
- PRIVATE W8 *obverseWall( const W8 *src, W16 width, W16 height )
- {
- W8 *target;
- W16 w, h;
-
- target = MM_MALLOC( width * height );
-
- for( h = 0; h < height; ++h )
- for( w = 0; w < width; ++w )
- {
- target[ h + width * w ] = src[ h * width + w ];
- }
- return target;
- }
- /*
- -----------------------------------------------------------------------------
- Function: DecodeWall -Decode then save wall data as TARGA image file.
-
- Parameters:
- offet -[in] offset in resource file.
- length -[in] length of data.
- retval -[out] Length of next block.
- filename -[in] Name of file to save as.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void DecodeWall( W32 offset, W32 length, W32 *retval, const char *filename )
- {
- W8 *ptrResource;
- W8 *uncompr;
- W8 *buffer;
- W8 *newwall;
- ptrResource = getResourceBlock( offset, length, retval );
- if( ! ptrResource )
- {
- return;
- }
- uncompr = (PW8)MM_MALLOC( 128 * 128 );
-
- Decode_LZSS( uncompr, ptrResource, 128 * 128 );
- newwall = obverseWall( uncompr, 128, 128 );
-
- buffer = MM_MALLOC( 128 * 128 * 3 );
- ConvertPaletteToRGB( buffer, newwall, 128 * 128, macPalette );
- WriteTGA( filename, 24, 128, 128, buffer, 0, 1 );
- MM_FREE( buffer );
- MM_FREE( newwall );
- MM_FREE( uncompr );
- MM_FREE( ptrResource );
- }
- /*
- -----------------------------------------------------------------------------
- Function: RipWalls -Extract wall image data from resource fork.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void RipWalls( void )
- {
- int i;
- W32 noffset = 702256;
- W32 length = 6277;
- W32 retval;
- char name[ 256 ];
- for( i = 0 ; i < 35 ; ++i )
- {
- cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHWALLS, i );
- DecodeWall( noffset, length, &retval, name );
-
- noffset += length + 4;
- length = retval;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Sprite Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- typedef struct
- {
- W16 Topy;
- W16 Boty;
- W16 Shape;
- } spriteRun;
- /*
- -----------------------------------------------------------------------------
- Function: DecodeSprite -Decode then save sprite data as TARGA image file.
-
- Parameters:
- offet -[in] offset in resource file.
- length -[in] length of data.
- retval -[out] Length of next block.
- filename -[in] Name of file to save as.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void DecodeSprite( W32 offset, W32 length, W32 *retval, const char *filename )
- {
- W8 *ptrResource;
- W32 uncomprLength;
- W8 *uncompr;
- W8 *buffer;
- W16 *ptr;
- int i, x, width, noffset;
- ptrResource = getResourceBlock( offset, length, retval );
- if( ! ptrResource )
- {
- return;
- }
- uncomprLength = ptrResource[ 0 ];
- uncomprLength |= ptrResource[ 1 ] << 8;
- uncompr = (PW8)MM_MALLOC( uncomprLength );
- Decode_LZSS( uncompr, ptrResource+2, uncomprLength );
-
- buffer = (W8 *)MM_MALLOC(128 * 128 * 4);
- memset( buffer, 0, 128 * 128 * 4 );
-
- ptr = (PW16)uncompr;
- width = BigShort( ptr[ 0 ] );
-
- noffset = 64 - width / 2;
- for( x = 0 ; x < width ; ++x )
- {
- spriteRun *p = (spriteRun *)&ptr[ BigShort( ptr[ x + 1 ] ) / 2 ];
-
- while( p->Topy != 0xFFFF )
- {
- for( i = BigShort( p->Topy ) / 2; i < BigShort( p->Boty ) / 2; ++i )
- {
- *(buffer + (i * 128 + x + noffset) * 4 + 0) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 0 ];
- *(buffer + (i * 128 + x + noffset) * 4 + 1) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 1 ];
- *(buffer + (i * 128 + x + noffset) * 4 + 2) = macPalette[ uncompr[ BigShort( p->Shape ) + BigShort( p->Topy ) / 2 + (i - BigShort( p->Topy ) / 2) ] * 3 + 2 ];
- *(buffer + (i * 128 + x + noffset) * 4 + 3) = 255;
- }
- p++;
- }
- }
- WriteTGA( filename, 32, 128, 128, buffer, 0, 1 );
- MM_FREE( buffer );
- MM_FREE( uncompr );
- MM_FREE( ptrResource );
- }
- /*
- -----------------------------------------------------------------------------
- Function: RipSprites -Extract sprites from resource fork.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void RipSprites( void )
- {
- int i;
- W32 offset = 106345;
- W32 length = 524;
- W32 retval;
- char name[ 256 ];
- for( i = 0 ; i < 163 ; ++i )
- {
- cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i );
- DecodeSprite( offset, length, &retval, name );
- offset += length + 4;
- length = retval;
- }
- offset = 579104;
- length = 868;
- for( i = 163 ; i < 171 ; ++i )
- {
- cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i );
- DecodeSprite( offset, length, &retval, name );
- offset += length + 4;
- length = retval;
- }
- offset = 2356530;
- length = 7153;
- for( i = 171 ; i < 175 ; ++i )
- {
- cs_snprintf( name, sizeof( name ), "%s/%.3d.tga", DIRPATHSPRITES, i );
- DecodeSprite( offset, length, &retval, name );
- offset += length + 4;
- length = retval;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Item Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: DecodeItem -Convert item data into RGB raw data.
-
- Parameters: data -[in] data chunk to decode.
- pal -[in] palette.
-
- Returns: On success pointer to RGB data, otherwise NULL.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE W8 *DecodeItem( W8 *data, W8 *pal )
- {
- W8 *buffer, *mask, *ptr;
- int x, y, w, h;
-
- buffer = (W8 *)MM_MALLOC( 128 * 128 * 4 );
-
- memset( buffer, 0, 128 * 128 * 4 );
-
- x = data[ 0 ] << 8 | data[ 1 ];
- y = data[ 2 ] << 8 | data[ 3 ];
- w = data[ 4 ] << 8 | data[ 5 ];
- h = data[ 6 ] << 8 | data[ 7 ];
-
- data += 8;
- mask = data + w * h;
- ptr = buffer + 512 * y + x * 4;
-
- do
- {
- int w2 = w;
- do
- {
- if( *mask == 0 )
- {
- ptr[ 0 ] = pal[ data[ 0 ] * 3 ];
- ptr[ 1 ] = pal[ data[ 0 ] * 3 + 1 ];
- ptr[ 2 ] = pal[ data[ 0 ] * 3 + 2 ];
- ptr[ 3 ] = 255;
- }
- ptr += 4;
- data++;
- mask++;
- } while( --w2 );
- ptr += 4 * (128 - w);
- } while( --h );
-
- return buffer;
- }
- /*
- -----------------------------------------------------------------------------
- Function: RipItems -Extract pic images from resource file.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void RipItems( void )
- {
- W8 *ptrResource;
- W8 *ptrDst;
- W32 *ptrLong;
- W8 *buffer;
- W8 **gameItems;
- W32 junk;
- W32 uncomprLength;
- int i;
- char name[ 256 ];
- W16 *ptrShape1;
- W8 *ptrShape2;
- W16 width, height;
- W32 offset = 634799L;
- W32 length = 67453L;
- ptrResource = (PW8)getResourceBlock( offset, length, &junk );
- uncomprLength = BigLong( *((PW32)ptrResource) );
- gameItems = (W8 **)MM_MALLOC( uncomprLength );
-
- Decode_LZSS( (PW8)gameItems, ptrResource+4, uncomprLength );
- MM_FREE( ptrResource );
- ptrLong = (PW32)gameItems;
- ptrDst = (PW8)gameItems;
- for( i = 0; i < 47; ++i )
- {
- uncomprLength = BigLong( ptrLong[ i ] );
- gameItems[ i ] = ptrDst + uncomprLength;
- }
-
- for( i = 0 ; i < 6 * 4 ; ++i )
- {
- cs_snprintf( name, sizeof( name ), "%s/weapon%.2d.tga", DIRPATHPICS, i );
- buffer = DecodeItem( gameItems[ 12 + i ], macPalette );
- WriteTGA( name, 32, 128, 128, buffer, 0, 1 );
- MM_FREE( buffer );
- }
- for( i = 0 ; i < 47 ; ++i )
- {
- ptrShape1 = (PW16)gameItems[ i ];
- width = BigShort( ptrShape1[ 0 ] );
- height = BigShort( ptrShape1[ 1 ] );
- ptrShape2 = (PW8)&ptrShape1[ 2 ];
- buffer = MM_MALLOC( width * height * 3 );
- ConvertPaletteToRGB( buffer, ptrShape2, width * height, macPalette );
- cs_snprintf( name, sizeof( name ), "%s/%.2d.tga", DIRPATHPICS, i );
- WriteTGA( name, 24, width, height, buffer, 0, 1 );
- MM_FREE( buffer );
- // Skip over weapon frames
- if( 11 == i )
- {
- i = 35;
- }
- }
-
- MM_FREE( gameItems );
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Midi Routines
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: RipMidi -Extract midi files from resource fork.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE void RipMidi( void )
- {
- W8 *ptrResource;
- W32 retval;
- FILE *fhandle;
- char name[ 256 ];
- int i;
- W32 offset = 1899536L;
- W32 length = 8215L;
- for( i = 0 ; i < 8 ; ++i )
- {
- ptrResource = getResourceBlock( offset, length, &retval );
- if( ! ptrResource )
- {
- continue;
- }
- cs_snprintf( name, sizeof( name ), "%s/%d.mid", DIRPATHMIDI, i );
- fhandle = fopen( name, "wb" );
- if( ! fhandle )
- {
- continue;
- }
- fwrite( ptrResource, 1, length, fhandle );
- fclose( fhandle );
- MM_FREE( ptrResource );
- offset += length + 4;
- length = retval;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // PICT image
- //
- ///////////////////////////////////////////////////////////////////////////////
- #if 0
- PRIVATE void DecodePICTimage( W32 offset, W32 length )
- {
- FILE *hfOut;
- W8 *ptrResource;
- W32 junk;
- int i;
- ptrResource = getResourceBlock( offset, length, &junk );
- if( ! ptrResource )
- {
- return;
- }
- hfOut = fopen( "pict.pct", "wb" );
- if( ! hfOut )
- {
- return;
- }
- for( i ; i < 512 ; ++i )
- {
- fwrite( ptrResource, 1, 0, hfOut );
- }
- fwrite( ptrResource, 1, length, hfOut );
- fclose( hfOut );
- }
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Parse MacBinary Header
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: parseMacBinaryHead -Parse mac binary header.
-
- Parameters: Nothing.
-
- Returns: true if this is Wolfenstein Mac binary file, otherwise false.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PRIVATE _boolean parseMacBinaryHead( void )
- {
- W32 temp32 = 0;
- char name[ 64 ];
- //
- // Check file name
- //
- fseek( fResHandle, 1, SEEK_SET );
- // get file name length (range is 1 to 31)
- fread( &temp32, 1, 1, fResHandle );
- if( temp32 < 1 || temp32 > 31 )
- {
- return false;
- }
-
- fread( name, 1, temp32, fResHandle );
- name[ temp32 - 1 ] = '\0';
- if( strcmp( name, MACBINFILENAME ) != 0 )
- {
- return false;
- }
- //
- // Check file type / creator
- //
- fseek( fResHandle, 65, SEEK_SET );
- fread( &name, 1, 8, fResHandle );
- name[ 8 ] = '\0';
- if( strcmp( name, FILETYPECREATOR ) != 0 )
- {
- return false;
- }
- //
- // Check Data Fork length
- //
- fseek( fResHandle, 83, SEEK_SET );
- fread( &temp32, 1, 4, fResHandle );
- temp32 = BigLong( temp32 );
- if( temp32 != DATAFORKLENGTH )
- {
- return false;
- }
- //
- // Check Resource Fork length
- //
- fread( &temp32, 1, 4, fResHandle );
- temp32 = BigLong( temp32 );
- if( temp32 != RESFORKLENGTH )
- {
- return false;
- }
- return true;
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Interface
- //
- ///////////////////////////////////////////////////////////////////////////////
- /*
- -----------------------------------------------------------------------------
- Function: ripMac -Interface to Macintosh data extractor.
-
- Parameters: Nothing.
-
- Returns: Nothing.
-
- Notes:
- -----------------------------------------------------------------------------
- */
- PUBLIC void ripMac( void )
- {
- char *fname;
- char ext[ 256 ];
- cs_strlcpy( ext, MAC_FEXT, sizeof( ext ) );
-
- fname = FS_FindFirst( ext, 0, FA_DIR );
- FS_FindClose();
- if( fname == NULL )
- {
- // try again with lower case
- fname = FS_FindFirst( cs_strlwr( ext ), 0, FA_DIR );
- FS_FindClose();
- if( fname == NULL )
- {
- printf( "Could not find any mac files for read\n" );
- return;
- }
- }
- fResHandle = fopen( fname, "rb" );
- if( fResHandle == NULL )
- {
- printf( "Could not open file (%s) for read\n", fname );
- return;
- }
- if( ! parseMacBinaryHead() )
- {
- printf( "Unknown MacBinary file\n" );
- fclose( fResHandle );
-
- return;
- }
- FS_Mkdir( DIRPATHPICS );
- FS_Mkdir( DIRPATHSPRITES );
- FS_Mkdir( DIRPATHWALLS );
- FS_Mkdir( DIRPATHMIDI );
- printf( "Extracting Midi data...\n" );
- RipMidi();
- printf( "Decoding Screen data...\n" );
- RipScreens();
-
- setPalette( GAMEPAL );
- printf( "Decoding Wall data...\n" );
- RipWalls();
- printf( "Decoding Sprite data...\n" );
- RipSprites();
- printf( "Decoding Item data...\n" );
- RipItems();
- fclose( fResHandle );
- }
|