int SpriteCache::attachFile(const char *filename) { ff = clibfopen((char *)filename, "rb"); if (ff == NULL) return -1; return 0; }
int SpriteCache::initFile(const char *filnam) { short vers; char buff[20]; short numspri = 0; int vv, wdd, htt; long spr_initial_offs = 0; int spriteFileID = 0; for (vv = 0; vv < elements; vv++) { images[vv] = NULL; offsets[vv] = 0; } ff = clibfopen((char *)filnam, "rb"); if (ff == NULL) return -1; spr_initial_offs = ftell(ff); fread(&vers, 2, 1, ff); // read the "Sprite File" signature fread(&buff[0], 13, 1, ff); if ((vers < 4) || (vers > 6)) { fclose(ff); ff = NULL; return -1; } // unknown version buff[13] = 0; if (strcmp(buff, spriteFileSig)) { fclose(ff); ff = NULL; return -1; } if (vers == 4) this->spritesAreCompressed = false; else if (vers == 5) this->spritesAreCompressed = true; else if (vers >= 6) { this->spritesAreCompressed = (fgetc(ff) == 1); spriteFileID = getw(ff); } if (vers < 5) { // skip the palette fseek(ff, 256 * 3, SEEK_CUR); } fread(&numspri, 2, 1, ff); if (vers < 4) numspri = 200; #ifdef THIS_IS_THE_ENGINE // adjust the buffers to the sprite file size changeMaxSize(numspri + 1); #endif // if there is a sprite index file, use it if (loadSpriteIndexFile(spriteFileID, spr_initial_offs, numspri)) { // Succeeded return 0; } // failed, delete the index file because it's invalid unlink(spindexfilename); // no sprite index file, manually index it for (vv = 0; vv <= numspri; vv++) { offsets[vv] = ftell(ff); flags[vv] = 0; int coldep = getshort(ff); if (coldep == 0) { offsets[vv] = 0; images[vv] = NULL; #ifdef THIS_IS_THE_ENGINE // make it a blue cup, to avoid crashes spritewidth[vv] = spritewidth[0]; spriteheight[vv] = spriteheight[0]; offsets[vv] = offsets[0]; flags[vv] = SPRCACHEFLAG_DOESNOTEXIST; #else // no sprite ... blank it out spritewidth[vv] = 0; spriteheight[vv] = 0; offsets[vv] = 0; #endif if (feof(ff)) break; continue; } if (feof(ff)) break; if (vv >= elements) break; images[vv] = NULL; wdd = getshort(ff); htt = getshort(ff); spritewidth[vv] = wdd; spriteheight[vv] = htt; get_new_size_for_sprite(vv, wdd, htt, spritewidth[vv], spriteheight[vv]); long spriteDataSize; if (vers == 5) { spriteDataSize = getw(ff); } else { spriteDataSize = wdd * coldep * htt; } fseek(ff, spriteDataSize, SEEK_CUR); } sprite0InitialOffset = offsets[0]; return 0; }
bool SpriteCache::loadSpriteIndexFile(int expectedFileID, long spr_initial_offs, short numspri) { short numspri_index = 0; int vv; FILE *fidx = clibfopen((char*)spindexfilename, "rb"); if (fidx == NULL) { return false; } char buffer[9]; // check "SPRINDEX" id fread(&buffer[0], strlen(spindexid), 1, fidx); buffer[8] = 0; if (strcmp(buffer, spindexid)) { fclose(fidx); return false; } // check version int fileVersion = getw(fidx); if ((fileVersion < 1) || (fileVersion > 2)) { fclose(fidx); return false; } if (fileVersion >= 2) { if (getw(fidx) != expectedFileID) { fclose(fidx); return false; } } numspri_index = getw(fidx); // end index+1 should be the same as num sprites if (getw(fidx) != numspri_index + 1) { fclose(fidx); return false; } if (numspri_index != numspri) { fclose(fidx); return false; } short numsprits = numspri + 1; short *rspritewidths = (short*)malloc(numsprits * sizeof(short)); short *rspriteheights = (short*)malloc(numsprits * sizeof(short)); fread(&rspritewidths[0], sizeof(short), numsprits, fidx); fread(&rspriteheights[0], sizeof(short), numsprits, fidx); fread(&offsets[0], sizeof(long), numsprits, fidx); for (vv = 0; vv <= numspri; vv++) { flags[vv] = 0; if (offsets[vv] != 0) { offsets[vv] += spr_initial_offs; get_new_size_for_sprite(vv, rspritewidths[vv], rspriteheights[vv], spritewidth[vv], spriteheight[vv]); } else if (vv > 0) { #ifdef THIS_IS_THE_ENGINE // no sprite ... convert it to the blue cup spritewidth[vv] = spritewidth[0]; spriteheight[vv] = spriteheight[0]; offsets[vv] = offsets[0]; flags[vv] = SPRCACHEFLAG_DOESNOTEXIST; #else // no sprite ... blank it out spritewidth[vv] = 0; spriteheight[vv] = 0; offsets[vv] = 0; #endif } } sprite0InitialOffset = offsets[0]; free(rspritewidths); free(rspriteheights); fclose(fidx); return true; }
/* *** SCRIPT SYMBOL: [Multimedia] PlayFlic *** */ void play_flc_file(int numb,int playflags) { color oldpal[256]; if (play.fast_forward) return; wreadpalette(0,255,oldpal); int clearScreenAtStart = 1; canabort = playflags % 10; playflags -= canabort; if (canabort == 2) // convert to PlayVideo-compatible setting canabort = 3; if (playflags % 100 == 0) stretch_flc = 1; else stretch_flc = 0; if (playflags / 100) clearScreenAtStart = 0; char flicnam[20]; sprintf(flicnam,"flic%d.flc",numb); FILE*iii=clibfopen(flicnam,"rb"); if (iii==NULL) { sprintf(flicnam,"flic%d.fli",numb); iii=clibfopen(flicnam,"rb"); } if (iii==NULL) { debug_log("FLIC animation FLIC%d.FLC not found",numb); return; } fseek(iii,8,SEEK_CUR); fread(&fliwidth,2,1,iii); fread(&fliheight,2,1,iii); fclose(iii); if (game.color_depth > 1) { hicol_buf=create_bitmap_ex(final_col_dep,fliwidth,fliheight); clear(hicol_buf); } // override the stretch option if necessary if ((fliwidth==scrnwid) && (fliheight==scrnhit)) stretch_flc = 0; else if ((fliwidth > scrnwid) || (fliheight > scrnhit)) stretch_flc = 1; fli_buffer=create_bitmap_ex(8,fliwidth,fliheight); //640,400); //scrnwid,scrnhit); if (fli_buffer==NULL) quit("Not enough memory to play animation"); clear(fli_buffer); if (clearScreenAtStart) { clear(screen); render_to_screen(screen, 0, 0); } fli_target = create_bitmap_ex(final_col_dep, BMP_W(screen), BMP_H(screen)); fli_ddb = gfxDriver->CreateDDBFromBitmap(fli_target, false, true); if (play_fli(flicnam,fli_buffer,0,fli_callback)==FLI_ERROR) quit("FLI/FLC animation play error"); wfreeblock(fli_buffer); clear(screen); wsetpalette(0,255,oldpal); render_to_screen(screen, 0, 0); destroy_bitmap(fli_target); gfxDriver->DestroyDDB(fli_ddb); fli_ddb = NULL; if (hicol_buf!=NULL) { wfreeblock(hicol_buf); hicol_buf=NULL; } // wsetscreen(screen); wputblock(0,0,backbuffer,0); while (ac_mgetbutton()!=NONE) ; invalidate_screen(); }