예제 #1
0
TbFileHandle LbFileOpen(const char *fname, const unsigned char accmode)
{
  unsigned char mode = accmode;

  if ( !LbFileExists(fname) )
  {
#ifdef __DEBUG
    LbSyncLog("LbFileOpen: file doesn't exist\n");
#endif
    if ( mode == Lb_FILE_MODE_READ_ONLY )
      return -1;
    if ( mode == Lb_FILE_MODE_OLD )
      mode = Lb_FILE_MODE_NEW;
  }
  TbFileHandle rc;
/* DISABLED - NOT NEEDED
  if ( mode == Lb_FILE_MODE_NEW )
  {
#ifdef __DEBUG
    LbSyncLog("LbFileOpen: creating file\n");
#endif
    rc = _sopen(fname, _O_WRONLY|_O_CREAT|_O_TRUNC|_O_BINARY, _SH_DENYNO);
    //setmode(rc,_O_TRUNC);
    close(rc);
  }
*/
  rc = -1;
  switch (mode)
  {
  case Lb_FILE_MODE_NEW:
    {
#ifdef __DEBUG
      LbSyncLog("LbFileOpen: LBO_CREAT mode\n");
#endif
        rc = _sopen(fname, O_RDWR|O_CREAT|O_BINARY, SH_DENYNO, S_IREAD|S_IWRITE);
    };break;
  case Lb_FILE_MODE_OLD:
    {
#ifdef __DEBUG
        LbSyncLog("LbFileOpen: LBO_RDWR mode\n");
#endif
        rc = _sopen(fname, O_RDWR|O_BINARY, SH_DENYNO);
    };break;
  case Lb_FILE_MODE_READ_ONLY:
    {
#ifdef __DEBUG
        LbSyncLog("LbFileOpen: LBO_RDONLY mode\n");
#endif
        rc = _sopen(fname, O_RDONLY|O_BINARY, SH_DENYNO);
    };break;
  }
#ifdef __DEBUG
  LbSyncLog("LbFileOpen: out handle = %ld, errno = %d\n",rc,errno);
#endif
  return rc;
}
예제 #2
0
TbBool load_slab_tng_file(void)
{
    char *fname;
    SYNCDBG(5,"Starting");
    fname = prepare_file_fmtpath(FGrp_StdData,"slabs.tng");
    wait_for_cd_to_be_available();
    if ( LbFileExists(fname) )
      LbFileLoadAt(fname, &game.slabobjs_num);
    else
      ERRORLOG("Could not load slab object set");
    return true;
}
예제 #3
0
short load_level_file(LevelNumber lvnum)
{
    char *fname;
    short fgroup;
    short result;
    fgroup = get_level_fgroup(lvnum);
    fname = prepare_file_fmtpath(fgroup,"map%05lu.slb",(unsigned long)lvnum);
    wait_for_cd_to_be_available();
    if (LbFileExists(fname))
    {
        result = true;
        load_map_data_file(lvnum);
        load_map_flag_file(lvnum);
        load_column_file(lvnum);
        init_whole_blocks();
        load_slab_file();
        init_columns();
        load_static_light_file(lvnum);
        if (!load_map_ownership_file(lvnum))
          result = false;
        load_map_wibble_file(lvnum);
        load_and_setup_map_info(lvnum);
        load_texture_map_file(game.texture_id, 2);
        load_action_point_file(lvnum);
        if (!load_map_slab_file(lvnum))
          result = false;
        if (!load_thing_file(lvnum))
          result = false;
        reinitialise_map_rooms();
        ceiling_init(0, 1);
    } else
    {
        ERRORLOG("The level \"map%05lu\" doesn't exist; creating empty map.",lvnum);
        init_whole_blocks();
        load_slab_file();
        init_columns();
        game.texture_id = 0;
        load_texture_map_file(game.texture_id, 2);
        init_top_texture_to_cube_table();
        result = false;
    }
    return result;
}
TbBool load_texture_map_file(unsigned long tmapidx, unsigned char n)
{
    char *fname;
    SYNCDBG(7,"Starting");
#ifdef SPRITE_FORMAT_V2
    fname = prepare_file_fmtpath(FGrp_StdData,"tmapa%03d-%d.dat",tmapidx,32);
#else
    fname = prepare_file_fmtpath(FGrp_StdData,"tmapa%03d.dat",tmapidx);
#endif
    if (!wait_for_cd_to_be_available())
        return false;
    if (!LbFileExists(fname))
    {
        WARNMSG("Texture file \"%s\" doesn't exits.",fname);
        return false;
    }
    // The texture file has always over 500kb
    if (LbFileLoadAt(fname, block_mem) < 65536)
    {
        WARNMSG("Texture file \"%s\" can't be loaded or is too small.",fname);
        return false;
    }
    return true;
}
예제 #5
0
TbBool cumulative_screen_shot(void)
{
    //_DK_cumulative_screen_shot();return;
    static long frame_number=0;
    char fname[255];
    const char *fext;
    int w,h;
    switch (screenshot_format)
    {
    case 1:
        fext="raw";
        break;
    case 2:
        fext="bmp";
        break;
    default:
        ERRORLOG("Screenshot format incorrectly set.");
        return false;
    }
    long i;
    unsigned char *buf;
    long ssize;
    for (i=frame_number; i<10000; i++)
    {
        sprintf(fname, "scrshots/scr%05ld.%s", i, fext);
        if (!LbFileExists(fname)) break;
    }
    frame_number = i;
    if (frame_number >= 10000)
    {
        show_onscreen_msg(game.num_fps, "No free filename for screenshot.");
        return false;
    }
    sprintf(fname, "scrshots/scr%05ld.%s", frame_number, fext);

    w=MyScreenWidth/pixel_size;
    h=MyScreenHeight/pixel_size;

    buf = LbMemoryAlloc((w+3)*h+2048);
    if (buf == NULL)
    {
        ERRORLOG("Can't allocate buffer");
        return false;
    }
    LbPaletteGet(cap_palette);
    switch (screenshot_format)
    {
    case 1:
        ssize=prepare_hsi_screenshot(buf,cap_palette);
        break;
    case 2:
        ssize=prepare_bmp_screenshot(buf,cap_palette);
        break;
    default:
        ssize=0;
        break;
    }
    if (ssize>0)
        ssize = LbFileSaveAt(fname, buf, ssize);
    LbMemoryFree(buf);
    if (ssize>0)
        show_onscreen_msg(game.num_fps, "File \"%s\" saved.", fname);
    else
        show_onscreen_msg(game.num_fps, "Cannot save \"%s\".", fname);
    frame_number++;
    return (ssize>0);
}
예제 #6
0
TbBool setup_heaps(void)
{
    TbBool low_memory;
    char snd_fname[2048];
    char *spc_fname;
    long i;
    SYNCDBG(8,"Starting");
    low_memory = false;
    if (!SoundDisabled)
    {
      StopAllSamples();
      close_sound_heap();
      if (sound_heap_memory != NULL)
      {
        LbMemoryFree(sound_heap_memory);
        sound_heap_memory = NULL;
      }
    }
    if (heap != NULL)
    {
      ERRORLOG("Graphics heap already allocated");
      LbMemoryFree(heap);
      heap = NULL;
    }
    // Allocate sound heap
    if (!SoundDisabled)
    {
      i = mem_size;
      while (sound_heap_memory == NULL)
      {
        sound_heap_size = get_best_sound_heap_size(i);
        i = get_smaller_memory_amount(i);
        sound_heap_memory = LbMemoryAlloc(sound_heap_size);
        if ((i <= 8) && (sound_heap_memory == NULL))
        {
          low_memory = true;
          break;
        }
      }
    }
    // Allocate graphics heap
    i = mem_size;
    while (heap == NULL)
    {
      heap_size = get_best_sound_heap_size(i);
      i = get_smaller_memory_amount(i);
      heap = LbMemoryAlloc(heap_size);
      if ((i <= 8) && (heap == NULL))
      {
        low_memory = true;
        break;
      }
    }
    SYNCMSG("GraphicsHeap Size %d", heap_size);

    if (low_memory)
    {
      SYNCDBG(8,"Low memory mode entered on heap allocation.");
      while (heap != NULL)
      {
        if ((!SoundDisabled) && (sound_heap_memory == NULL))
        {
          break;
        }
        if (!SoundDisabled)
        {
          if (sound_heap_size < heap_size)
          {
            heap_size -= 16384;
          } else
          if (sound_heap_size == heap_size)
          {
            heap_size -= 16384;
            sound_heap_size -= 16384;
          } else
          {
            sound_heap_size -= 16384;
          }
          if (sound_heap_size < 524288)
          {
            ERRORLOG("Unable to allocate heaps (small_mem)");
            return false;
          }
        } else
        {
          heap_size -= 16384;
        }
        if (heap_size < 524288)
        {
          if (sound_heap_memory != NULL)
          {
            LbMemoryFree(sound_heap_memory);
            sound_heap_memory = NULL;
          }
          ERRORLOG("Unable to allocate heaps (small_mem)");
          return false;
          }
        }
        if (sound_heap_memory != NULL)
        {
          LbMemoryFree(sound_heap_memory);
          sound_heap_memory = NULL;
        }
        if (heap != NULL)
        {
          LbMemoryFree(heap);
          heap = NULL;
        }
        if (!SoundDisabled)
        {
          sound_heap_memory = LbMemoryAlloc(sound_heap_size);
        }
        heap = LbMemoryAlloc(heap_size);
    }
    if (!SoundDisabled)
    {
      SYNCMSG("SoundHeap Size %d", sound_heap_size);
      // Prepare sound sample bank file names
      prepare_file_path_buf(snd_fname,FGrp_LrgSound,sound_fname);
      // language-specific speech file
      spc_fname = prepare_file_fmtpath(FGrp_LrgSound,"speech_%s.dat",get_language_lwrstr(install_info.lang_id));
      // default speech file
      if (!LbFileExists(spc_fname))
        spc_fname = prepare_file_path(FGrp_LrgSound,speech_fname);
      // speech file for english
      if (!LbFileExists(spc_fname))
        spc_fname = prepare_file_fmtpath(FGrp_LrgSound,"speech_%s.dat",get_language_lwrstr(1));
      // Initialize sample banks
      if (!init_sound_heap_two_banks(sound_heap_memory, sound_heap_size, snd_fname, spc_fname, 1622))
      {
        LbMemoryFree(sound_heap_memory);
        sound_heap_memory = NULL;
        SoundDisabled = true;
        ERRORLOG("Unable to initialize sound heap. Sound disabled.");
      }
    }
    return true;
}