/** * Load an old fashioned GRF file to replace already loaded sprites. * @param filename The name of the file to open. * @param index_tlb The offsets of each of the sprites. * @param file_index The Fio offset to load the file in. * @return The number of loaded sprites. */ static void LoadGrfFileIndexed(const char *filename, const SpriteID *index_tbl, int file_index) { uint start; uint sprite_id = 0; FioOpenFile(file_index, filename, BASESET_DIR); DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename); byte container_ver = GetGRFContainerVersion(); if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename); ReadGRFSpriteOffsets(container_ver); if (container_ver >= 2) { /* Read compression. */ byte compression = FioReadByte(); if (compression != 0) usererror("Unsupported compression format"); } while ((start = *index_tbl++) != END) { uint end = *index_tbl++; do { bool b = LoadNextSprite(start, file_index, sprite_id, container_ver); assert(b); sprite_id++; } while (++start <= end); } }
/** * Load an old fashioned GRF file. * @param filename The name of the file to open. * @param load_index The offset of the first sprite. * @param file_index The Fio offset to load the file in. * @return The number of loaded sprites. */ static uint LoadGrfFile(const char *filename, uint load_index, int file_index) { uint load_index_org = load_index; uint sprite_id = 0; FioOpenFile(file_index, filename, BASESET_DIR); DEBUG(sprite, 2, "Reading grf-file '%s'", filename); byte container_ver = GetGRFContainerVersion(); if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename); ReadGRFSpriteOffsets(container_ver); if (container_ver >= 2) { /* Read compression. */ byte compression = FioReadByte(); if (compression != 0) usererror("Unsupported compression format"); } while (LoadNextSprite(load_index, file_index, sprite_id, container_ver)) { load_index++; sprite_id++; if (load_index >= MAX_SPRITES) { usererror("Too many sprites. Recompile with higher MAX_SPRITES value or remove some custom GRF files."); } } DEBUG(sprite, 2, "Currently %i sprites are loaded", load_index); return load_index - load_index_org; }
static void FioRestoreFile(int slot) { /* Do we still have the file open, or should we reopen it? */ if (_fio.handles[slot] == NULL) { DEBUG(misc, 6, "Restoring file '%s' in slot '%d' from disk", _fio.filenames[slot], slot); FioOpenFile(slot, _fio.filenames[slot]); } _fio.usage_count[slot]++; }
static bool OpenPNGFile(const char *filename, uint32 id, bool mask) { char png_file[MAX_PATH]; /* Add path separator after 'sprites' if not present */ const char *sep = (filename[0] == PATHSEPCHAR) ? "" : PATHSEP; snprintf(png_file, sizeof(png_file), "sprites%s%s" PATHSEP "%d%s.png", sep, filename, id, mask ? "m" : ""); if (FioCheckFileExists(png_file)) { FioOpenFile(PNG_SLOT, png_file); return true; } /* TODO -- Add TAR support */ return false; }
/** * Load an old fashioned GRF file to replace already loaded sprites. * @param filename The name of the file to open. * @param index_tlb The offsets of each of the sprites. * @param file_index The Fio offset to load the file in. * @return The number of loaded sprites. */ static void LoadGrfFileIndexed(const char *filename, const SpriteID *index_tbl, int file_index) { uint start; uint sprite_id = 0; FioOpenFile(file_index, filename, BASESET_DIR); DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename); while ((start = *index_tbl++) != END) { uint end = *index_tbl++; do { bool b = LoadNextSprite(start, file_index, sprite_id); assert(b); sprite_id++; } while (++start <= end); } }
/** * Load an old fashioned GRF file. * @param filename The name of the file to open. * @param load_index The offset of the first sprite. * @param file_index The Fio offset to load the file in. * @return The number of loaded sprites. */ static uint LoadGrfFile(const char *filename, uint load_index, int file_index) { uint load_index_org = load_index; uint sprite_id = 0; FioOpenFile(file_index, filename, BASESET_DIR); DEBUG(sprite, 2, "Reading grf-file '%s'", filename); while (LoadNextSprite(load_index, file_index, sprite_id)) { load_index++; sprite_id++; if (load_index >= MAX_SPRITES) { usererror("Too many sprites. Recompile with higher MAX_SPRITES value or remove some custom GRF files."); } } DEBUG(sprite, 2, "Currently %i sprites are loaded", load_index); return load_index - load_index_org; }
static void OpenBankFile(const char *filename) { memset(_original_sounds, 0, sizeof(_original_sounds)); /* If there is no sound file (nosound set), don't load anything */ if (filename == NULL) return; FioOpenFile(SOUND_SLOT, filename); size_t pos = FioGetPos(); uint count = FioReadDword(); /* The new format has the highest bit always set */ bool new_format = HasBit(count, 31); ClrBit(count, 31); count /= 8; /* Simple check for the correct number of original sounds. */ if (count != ORIGINAL_SAMPLE_COUNT) { /* Corrupt sample data? Just leave the allocated memory as those tell * there is no sound to play (size = 0 due to calloc). Not allocating * the memory disables valid NewGRFs that replace sounds. */ DEBUG(misc, 6, "Incorrect number of sounds in '%s', ignoring.", filename); return; } FioSeekTo(pos, SEEK_SET); for (uint i = 0; i != ORIGINAL_SAMPLE_COUNT; i++) { _original_sounds[i].file_slot = SOUND_SLOT; _original_sounds[i].file_offset = GB(FioReadDword(), 0, 31) + pos; _original_sounds[i].file_size = FioReadDword(); } for (uint i = 0; i != ORIGINAL_SAMPLE_COUNT; i++) { SoundEntry *sound = &_original_sounds[i]; char name[255]; FioSeekTo(sound->file_offset, SEEK_SET); /* Check for special case, see else case */ FioReadBlock(name, FioReadByte()); // Read the name of the sound if (new_format || strcmp(name, "Corrupt sound") != 0) { FioSeekTo(12, SEEK_CUR); // Skip past RIFF header /* Read riff tags */ for (;;) { uint32 tag = FioReadDword(); uint32 size = FioReadDword(); if (tag == ' tmf') { FioReadWord(); // wFormatTag sound->channels = FioReadWord(); // wChannels sound->rate = FioReadDword(); // samples per second if (!new_format) sound->rate = 11025; // seems like all old samples should be played at this rate. FioReadDword(); // avg bytes per second FioReadWord(); // alignment sound->bits_per_sample = FioReadByte(); // bits per sample FioSeekTo(size - (2 + 2 + 4 + 4 + 2 + 1), SEEK_CUR); } else if (tag == 'atad') { sound->file_size = size; sound->file_slot = SOUND_SLOT; sound->file_offset = FioGetPos(); break; } else { sound->file_size = 0; break; } } } else { /* * Special case for the jackhammer sound * (name in sample.cat is "Corrupt sound") * It's no RIFF file, but raw PCM data */ sound->channels = 1; sound->rate = 11025; sound->bits_per_sample = 8; sound->file_slot = SOUND_SLOT; sound->file_offset = FioGetPos(); } } }