Ejemplo n.º 1
0
int SpriteCache::attachFile(const char *filename) {
  ff = clibfopen((char *)filename, "rb");
  if (ff == NULL)
    return -1;
  return 0;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
0
/* *** 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();
}