Beispiel #1
0
static void CAL_SetupAudioFile()
{
	int handle;
	long length;
	char fname[13];
	int i;
	
	strcpy(fname, aheadname);
	strcat(fname, extension);

	handle = OpenRead(fname);
	if (handle == -1)
		CA_CannotOpen(fname);
	
	length = ReadLength(handle);
	
	MM_GetPtr((memptr)&audiostarts, length);
	
	for (i = 0; i < (length/4); i++)
		audiostarts[i] = ReadInt32(handle);

	CloseRead(handle);	

/* open the data file */

	strcpy(fname, afilename);
	strcat(fname, extension);

	audiohandle = OpenRead(fname);
	if (audiohandle == -1)
		CA_CannotOpen(fname);
}
Beispiel #2
0
void CAL_SetupGrFile()
{
    char fname[13];
    bstone::FileStream handle;
    Uint8* compseg;

    //
    // load ???dict.ext (huffman dictionary for graphics files)
    //

    strcpy(fname, gdictname);
    strcat(fname, extension);

    handle.open(fname);

    if (!handle.is_open())
        CA_CannotOpen(fname);

    handle.read(&grhuffman, sizeof(grhuffman));

    //
    // load the data offsets from ???head.ext
    //
    int grstarts_size = (NUMCHUNKS + 1) * FILEPOSSIZE;

    grstarts = new Sint32[(grstarts_size + 3) / 4];

    strcpy(fname, gheadname);
    strcat(fname, extension);

    handle.open(fname);

    if (!handle.is_open())
        CA_CannotOpen(fname);

    handle.read(grstarts, grstarts_size);

    //
    // Open the graphics file, leaving it open until the game is finished
    //
    OpenGrFile();

    //
    // load the pic and sprite headers into the arrays in the data segment
    //
    pictable = new pictabletype[NUMPICS];
    CAL_GetGrChunkLength(STRUCTPIC);		// position file pointer
    compseg = new Uint8[chunkcomplen];
    grhandle.read(compseg, chunkcomplen);

    CAL_HuffExpand(
        compseg,
        (Uint8*)pictable,
        NUMPICS * sizeof(pictabletype),
        grhuffman);

    delete [] compseg;
}
Beispiel #3
0
void CAL_SetupAudioFile (void)
{
	bstone::FileStream handle;
	Sint32 length;
	char fname[13];

//
// load maphead.ext (offsets and tileinfo for map file)
//
#ifndef AUDIOHEADERLINKED
	strcpy(fname,aheadname);
	strcat(fname,extension);

    handle.open(fname);
	if (!handle.is_open())
		CA_CannotOpen(fname);

	length = static_cast<Sint32>(handle.get_size());
    audiostarts = new Sint32[length / 4];
	handle.read(audiostarts, length);
	handle.close();
#else
	audiohuffman = (huffnode *)&audiodict;
	CAL_OptimizeNodes (audiohuffman);
	audiostarts = (Sint32 *)FP_SEG(&audiohead);
#endif

//
// open the data file
//
	OpenAudioFile();
}
void PM_Startup()
{
    char fname[13] = "vswap.";
    strcat(fname,extension);

    FILE *file = fopen(fname,"rb");
    if(!file)
        CA_CannotOpen(fname);

    ChunksInFile = 0;
    fread(&ChunksInFile, sizeof(word), 1, file);
    PMSpriteStart = 0;
    fread(&PMSpriteStart, sizeof(word), 1, file);
    PMSoundStart = 0;
    fread(&PMSoundStart, sizeof(word), 1, file);

    uint32_t* pageOffsets = (uint32_t *) malloc((ChunksInFile + 1) * sizeof(int32_t));
    CHECKMALLOCRESULT(pageOffsets);
    fread(pageOffsets, sizeof(uint32_t), ChunksInFile, file);

    word *pageLengths = (word *) malloc(ChunksInFile * sizeof(word));
    CHECKMALLOCRESULT(pageLengths);
    fread(pageLengths, sizeof(word), ChunksInFile, file);

    fseek(file, 0, SEEK_END);
    long fileSize = ftell(file);
    long pageDataSize = fileSize - pageOffsets[0];
    if(pageDataSize > (size_t) -1)
        Quit("The page file \"%s\" is too large!", fname);

    pageOffsets[ChunksInFile] = fileSize;

    uint32_t dataStart = pageOffsets[0];
    int i;

    // Check that all pageOffsets are valid
    for(i = 0; i < ChunksInFile; i++)
    {
        if(!pageOffsets[i]) continue;   // sparse page
        if(pageOffsets[i] < dataStart || pageOffsets[i] >= (size_t) fileSize)
            Quit("Illegal page offset for page %i: %u (filesize: %u)",
                    i, pageOffsets[i], fileSize);
    }

    // Calculate total amount of padding needed for sprites and sound info page
    int alignPadding = 0;
    for(i = PMSpriteStart; i < PMSoundStart; i++)
    {
        if(!pageOffsets[i]) continue;   // sparse page
        uint32_t offs = pageOffsets[i] - dataStart + alignPadding;
        if(offs & 1)
            alignPadding++;
    }

    if((pageOffsets[ChunksInFile - 1] - dataStart + alignPadding) & 1)
        alignPadding++;

    PMPageDataSize = (size_t) pageDataSize + alignPadding;
    PMPageData = (uint32_t *) malloc(PMPageDataSize);
    CHECKMALLOCRESULT(PMPageData);

    PMPages = (uint8_t **) malloc((ChunksInFile + 1) * sizeof(uint8_t *));
    CHECKMALLOCRESULT(PMPages);

    // Load pages and initialize PMPages pointers
    uint8_t *ptr = (uint8_t *) PMPageData;
    for(i = 0; i < ChunksInFile; i++)
    {
        if(i >= PMSpriteStart && i < PMSoundStart || i == ChunksInFile - 1)
        {
            size_t offs = ptr - (uint8_t *) PMPageData;

            // pad with zeros to make it 2-byte aligned
            if(offs & 1)
            {
                *ptr++ = 0;
                if(i == ChunksInFile - 1) PMSoundInfoPagePadded = true;
            }
        }

        PMPages[i] = ptr;

        if(!pageOffsets[i])
            continue;               // sparse page

        // Use specified page length, when next page is sparse page.
        // Otherwise, calculate size from the offset difference between this and the next page.
        uint32_t size;
        if(!pageOffsets[i + 1]) size = pageLengths[i];
        else size = pageOffsets[i + 1] - pageOffsets[i];

        fseek(file, pageOffsets[i], SEEK_SET);
        fread(ptr, 1, size, file);
        ptr += size;
    }

    // last page points after page buffer
    PMPages[ChunksInFile] = ptr;

    free(pageLengths);
    free(pageOffsets);
    fclose(file);
}
Beispiel #5
0
static void CAL_SetupMapFile()
{
	int i;
	int handle;
	long pos;
	char fname[13];
	
	strcpy(fname, mheadname);
	if (w0 == true || w1 == true || s0 == true || s1 == true){
		strcat(fname, extension);
	}else{
		strcat(fname, extension2);
	}

	handle = OpenRead(fname);
	if (handle == -1)
		CA_CannotOpen(fname);

	RLEWtag = ReadInt16(handle);

/* open the data file */
	strcpy(fname, gmapsname);
	if (w0 == true || w1 == true || s0 == true || s1 == true){
		strcat(fname, extension);
	}else{
		strcat(fname, extension2);
	}

	maphandle = OpenRead(fname);
	if (maphandle == -1)
		CA_CannotOpen(fname);

/* load all map header */
	for (i = 0; i < NUMMAPS; i++)
	{
		pos = ReadInt32(handle);
		if (pos == 0) {
			mapheaderseg[i] = NULL;
			continue;
		}
			
		MM_GetPtr((memptr)&mapheaderseg[i], sizeof(maptype));
		MM_SetLock((memptr)&mapheaderseg[i], true);

		ReadSeek(maphandle, pos, SEEK_SET);
		
		mapheaderseg[i]->planestart[0] = ReadInt32(maphandle);
		mapheaderseg[i]->planestart[1] = ReadInt32(maphandle);
		mapheaderseg[i]->planestart[2] = ReadInt32(maphandle);
		
		mapheaderseg[i]->planelength[0] = ReadInt16(maphandle);
		mapheaderseg[i]->planelength[1] = ReadInt16(maphandle);
		mapheaderseg[i]->planelength[2] = ReadInt16(maphandle);
		mapheaderseg[i]->width = ReadInt16(maphandle);
		mapheaderseg[i]->height = ReadInt16(maphandle);
		ReadBytes(maphandle, (byte *)mapheaderseg[i]->name, 16);		
	}

	CloseRead(handle);
	
/* allocate space for 2 64*64 planes */
	for (i = 0;i < MAPPLANES; i++) {
		MM_GetPtr((memptr)&mapsegs[i], 64*64*2);
		MM_SetLock((memptr)&mapsegs[i], true);
	}
}
Beispiel #6
0
static void CAL_SetupGrFile()
{
	char fname[13];
	int handle;
	byte *grtemp;
	int i;

/* load vgadict.ext (huffman dictionary for graphics files) */
	strcpy(fname, gdictname);
	strcat(fname, extension);

	handle = OpenRead(fname);
	if (handle == -1)
		CA_CannotOpen(fname);

	for (i = 0; i < 256; i++) {
		grhuffman[i].bit0 = ReadInt16(handle);
		grhuffman[i].bit1 = ReadInt16(handle);
	}
	
	CloseRead(handle);
	
/* load the data offsets from vgahead.ext */
	if (w0 == true){
		MM_GetPtr((memptr)&grstarts, (NUMCHUNKSWL1+1)*4);
		MM_GetPtr((memptr)&grtemp, (NUMCHUNKSWL1+1)*3);
	}else if (w1 == true){
		MM_GetPtr((memptr)&grstarts, (NUMCHUNKSWL6+1)*4);
		MM_GetPtr((memptr)&grtemp, (NUMCHUNKSWL6+1)*3);
	}else if (s0 == true){
		MM_GetPtr((memptr)&grstarts, (NUMCHUNKSSDM+1)*4);
		MM_GetPtr((memptr)&grtemp, (NUMCHUNKSSDM+1)*3);
	}else{
		MM_GetPtr((memptr)&grstarts, (NUMCHUNKSSOD+1)*4);
		MM_GetPtr((memptr)&grtemp, (NUMCHUNKSSOD+1)*3);
	}
	
	strcpy(fname, gheadname);
	strcat(fname, extension);

	handle = OpenRead(fname);
	if (handle == -1)
		CA_CannotOpen(fname);
	if (w0 == true){
		ReadBytes(handle, grtemp, (NUMCHUNKSWL1+1)*3);
	
		for (i = 0; i < NUMCHUNKSWL1+1; i++)
			grstarts[i] = (grtemp[i*3+0]<<0)|(grtemp[i*3+1]<<8)|(grtemp[i*3+2]<<16);
	}else if (w1 == true){
		ReadBytes(handle, grtemp, (NUMCHUNKSWL6+1)*3);
	
		for (i = 0; i < NUMCHUNKSWL6+1; i++)
			grstarts[i] = (grtemp[i*3+0]<<0)|(grtemp[i*3+1]<<8)|(grtemp[i*3+2]<<16);
	}else if (s0 == true){
		ReadBytes(handle, grtemp, (NUMCHUNKSSDM+1)*3);
	
		for (i = 0; i < NUMCHUNKSSDM+1; i++)
			grstarts[i] = (grtemp[i*3+0]<<0)|(grtemp[i*3+1]<<8)|(grtemp[i*3+2]<<16);
	}else{
		ReadBytes(handle, grtemp, (NUMCHUNKSSOD+1)*3);
	
		for (i = 0; i < NUMCHUNKSSOD+1; i++)
			grstarts[i] = (grtemp[i*3+0]<<0)|(grtemp[i*3+1]<<8)|(grtemp[i*3+2]<<16);
	}

	MM_FreePtr((memptr)&grtemp);
	
	CloseRead(handle);
	
/* Open the graphics file, leaving it open until the game is finished */
	strcpy(fname, gfilename);
	strcat(fname, extension);

	grhandle = OpenRead(fname);
	if (grhandle == -1)
		CA_CannotOpen(fname);

/* load the pic headers into pictable */
	CA_CacheGrChunk(STRUCTPIC);

	if (w0 == true){
		grtemp = grsegsWL1[STRUCTPIC];
		for (i = 0; i < NUMPICSWL1; i++) {
			pictableWL1[i].width = grtemp[i*4+0] | (grtemp[i*4+1] << 8);
			pictableWL1[i].height = grtemp[i*4+2] | (grtemp[i*4+3] << 8);
		}
	}else if (w1 == true){
		grtemp = grsegsWL6[STRUCTPIC];
		for (i = 0; i < NUMPICSWL6; i++) {
			pictableWL6[i].width = grtemp[i*4+0] | (grtemp[i*4+1] << 8);
			pictableWL6[i].height = grtemp[i*4+2] | (grtemp[i*4+3] << 8);
		}
	}else if (s0 == true){
		grtemp = grsegsSDM[STRUCTPIC];
		for (i = 0; i < NUMPICSSDM; i++) {
			pictableSDM[i].width = grtemp[i*4+0] | (grtemp[i*4+1] << 8);
			pictableSDM[i].height = grtemp[i*4+2] | (grtemp[i*4+3] << 8);
		}
	}else{
		grtemp = grsegsSOD[STRUCTPIC];
		for (i = 0; i < NUMPICSSOD; i++) {
			pictableSOD[i].width = grtemp[i*4+0] | (grtemp[i*4+1] << 8);
			pictableSOD[i].height = grtemp[i*4+2] | (grtemp[i*4+3] << 8);
		}
	}

	CA_UnCacheGrChunk(STRUCTPIC);
}
Beispiel #7
0
void CAL_SetupMapFile()
{
    Sint16 i;
    bstone::FileStream handle;
    Sint32 pos;
    char fname[13];
    mapfiletype header;
    maptype* map_header;

    //
    // load maphead.ext (offsets and tileinfo for map file)
    //

    strcpy(fname, mheadname);
    strcat(fname, extension);

    handle.open(fname);

    if (!handle.is_open())
        CA_CannotOpen(fname);

    handle.read(&header.RLEWtag, sizeof(header.RLEWtag));
    handle.read(&header.headeroffsets, sizeof(header.headeroffsets));

    rlew_tag = header.RLEWtag;

    //
    // open the data file
    //
    OpenMapFile();

    //
    // load all map header
    //
    for (i = 0; i < NUMMAPS; ++i) {
        pos = header.headeroffsets[i];

        if (pos < 0)
            continue;

        mapheaderseg[i] = new maptype();
        map_header = mapheaderseg[i];

        maphandle.set_position(pos);

        maphandle.read(
            &map_header->planestart,
            sizeof(map_header->planestart));

        maphandle.read(
            &map_header->planelength,
            sizeof(map_header->planelength));

        maphandle.read(
            &map_header->width,
            sizeof(map_header->width));

        maphandle.read(
            &map_header->height,
            sizeof(map_header->height));

        maphandle.read(
            &map_header->name,
            sizeof(map_header->name));
    }

    //
    // allocate space for 3 64*64 planes
    //
    for (i = 0; i < MAPPLANES; ++i)
        mapsegs[i] = new Uint16[64 * 64];

#if FORCE_FILE_CLOSE
    CloseMapFile();
#endif

}