bool physics_file_is_m1(void)
{
    bool m1_physics = false;
    
    // check for M1 physics
    OpenedFile PhysicsFile;
    short SavedType, SavedError = get_game_error(&SavedType);
    if (PhysicsFileSpec.Open(PhysicsFile))
    {
        uint32 tag = SDL_ReadBE32(PhysicsFile.GetRWops());
        switch (tag)
        {
            case M1_MONSTER_PHYSICS_TAG:
            case M1_EFFECTS_PHYSICS_TAG:
            case M1_PROJECTILE_PHYSICS_TAG:
            case M1_PHYSICS_PHYSICS_TAG:
            case M1_WEAPONS_PHYSICS_TAG:
                m1_physics = true;
                break;
            default:
                break;
        }
        
        PhysicsFile.Close();
    }
    set_game_error(SavedType, SavedError);
    return m1_physics;
}
Example #2
0
static void load_preferences(
  void)
{
  /* If it was already allocated, we are reloading, so free the old one.. */
  if(prefInfo->wad) {
    free_wad(prefInfo->wad);
    prefInfo->wad= NULL;
  }

  OpenedFile PrefsFile;
  if (open_wad_file_for_reading(prefInfo->PrefsFile,PrefsFile)) {
    struct wad_header header;

    /* Read the header from the wad file */
    if(read_wad_header(PrefsFile, &header)) {
      /* Read the indexed wad from the file */
      prefInfo->wad= read_indexed_wad_from_file(PrefsFile, &header, 0, false);
      // LP change: more graceful degradation
      if (!prefInfo->wad) {
        set_game_error(gameError, errUnknownWadVersion);
      }
    }

    /* Close the file.. */
    close_wad_file(PrefsFile);
  }
}
/* --------- local code */
static struct wad_data *get_physics_wad_data(
	bool *bungie_physics)
{
	struct wad_data *wad= NULL;
	
//	dprintf("Open is: %d %d %.*s", physics_file.vRefNum, physics_file.parID, physics_file.name[0], physics_file.name+1);

	OpenedFile PhysicsFile;
	if(open_wad_file_for_reading(PhysicsFileSpec,PhysicsFile))
	{
		struct wad_header header;

		if(read_wad_header(PhysicsFile, &header))
		{
			if(header.data_version==BUNGIE_PHYSICS_DATA_VERSION || header.data_version==PHYSICS_DATA_VERSION)
			{
				wad= read_indexed_wad_from_file(PhysicsFile, &header, 0, true);
				if(header.data_version==BUNGIE_PHYSICS_DATA_VERSION)
				{
					*bungie_physics= true;
				} else {
					*bungie_physics= false;
				}
			}
		}

		close_wad_file(PhysicsFile);
	} 
	
	/* Reset any errors that might have occurred.. */
	set_game_error(systemError, errNone);

	return wad;
}
Example #4
0
// Open resource file
bool FileSpecifier::Open(OpenedResourceFile &OFile, bool Writable)
{
	OFile.Close();

	OFile.f = open_res_file(*this);
	err = OFile.f ? 0 : errno;
	if (OFile.f == NULL) {
		set_game_error(systemError, err);
		return false;
	} else
		return true;
}
Example #5
0
// Open data file
bool FileSpecifier::Open(OpenedFile &OFile, bool Writable)
{
	OFile.Close();

	SDL_RWops *f;
#ifdef __MACOS__
	if (!Writable)
		f = OFile.f = open_fork_from_existing_path(GetPath(), false);
	else
#endif
	{
#ifdef HAVE_ZZIP
		if (!Writable)
		{
			f = OFile.f = SDL_RWFromZZIP(unix_path_separators(GetPath()).c_str(), "rb");
		} 
		else
#endif
		f = OFile.f = SDL_RWFromFile(GetPath(), Writable ? "wb+" : "rb");
	}

	err = f ? 0 : errno;
	if (f == NULL) {
		set_game_error(systemError, err);
		return false;
	}
	if (Writable)
		return true;

	// Transparently handle AppleSingle and MacBinary files on reading
	int32 offset, data_length, rsrc_length;
	if (is_applesingle(f, false, offset, data_length)) {
		OFile.is_forked = true;
		OFile.fork_offset = offset;
		OFile.fork_length = data_length;
		SDL_RWseek(f, offset, SEEK_SET);
		return true;
	} else if (is_macbinary(f, data_length, rsrc_length)) {
		OFile.is_forked = true;
		OFile.fork_offset = 128;
		OFile.fork_length = data_length;
		SDL_RWseek(f, 128, SEEK_SET);
		return true;
	}
	SDL_RWseek(f, 0, SEEK_SET);
	return true;
}
void *get_network_physics_buffer(
	int32 *physics_length)
{
	if (physics_file_is_m1())
	{
		bool success = false;
		uint8 *data = NULL;
		OpenedFile PhysicsFile;
		if (PhysicsFileSpec.Open(PhysicsFile) &&
		    PhysicsFile.GetLength(*physics_length))
		{
			data = (uint8 *)malloc(*physics_length + 4);
            SDL_RWops *ops = SDL_RWFromMem(data, *physics_length + 4);
            success = SDL_WriteBE32(ops, uint32(M1_PHYSICS_MAGIC_COOKIE));
            if (success)
                success = SDL_WriteBE32(ops, uint32(*physics_length));
            SDL_RWclose(ops);
            if (success)
                success = PhysicsFile.Read(*physics_length, &data[8]);
			if (!success)
				free(data);
		}
		if (!success)
		{
			*physics_length = 0;
			return NULL;
		}
		return data;
	}
	
	short SavedType, SavedError = get_game_error(&SavedType);
	void *data= get_flat_data(PhysicsFileSpec, false, 0);
	set_game_error(SavedType, SavedError);
	
	if(data)
	{
		*physics_length= get_flat_data_length(data);
	} else {
		*physics_length= 0;
	}
	
	return data;
}
Example #7
0
/*  preferences pointer.. */
bool w_open_preferences_file(
  char *PrefName,
  Typecode Type)
{
  int error = 0;
  bool success= true;

  /* allocate space for our global structure to keep track of the prefs file */
  prefInfo = NULL;
  try {
    prefInfo = new preferences_info;

#if defined(mac)
    prefInfo->PrefsFile.SetParentToPreferences();
    prefInfo->PrefsFile.SetName(PrefName,Type);
    /* check for the preferences folder using FindFolder, creating it if necessary */
#elif defined(SDL)
    prefInfo->PrefsFile.SetToPreferencesDir();
    prefInfo->PrefsFile += PrefName;
#endif

    /* does the preferences file exist? */
    load_preferences();             /* Uses prefInfo.. */

    if(error_pending()) {
      short type;

      error= get_game_error(&type);
      if(type==systemError) {
        if (!prefInfo->PrefsFile.Exists()) {
          prefInfo->PrefsFile.Create(Type);
          prefInfo->wad = create_empty_wad();
          set_game_error(systemError,prefInfo->PrefsFile.GetError());
          w_write_preferences_file();
        }
      }
      else {
        /* Something was invalid.. */
        if (prefInfo->PrefsFile.Delete()) {
          prefInfo->wad= create_empty_wad();
          set_game_error(systemError, error);
          w_write_preferences_file();
        }
        set_game_error(systemError, errNone);
      }
    }
  } catch (...) {
    dprintf("In \"catch\"");
    set_game_error(systemError, memory_error());
  }

  if (error) {
    /* if something is broken, make sure we at least return valid prefs */
    if(prefInfo && !prefInfo->wad) {
      prefInfo->wad= create_empty_wad();
    }
  }

  /* Gotta bail... */
  if(!prefInfo || !prefInfo->wad) {
    success= false;
  }

// dump_wad(prefInfo->wad);

  return success;
}
Example #8
0
void w_write_preferences_file(
  void)
{
  struct wad_header header;

  /* We can be called atexit. */
  if(error_pending()) {
    set_game_error(systemError, errNone);
  }

  assert(!error_pending());

  // LP: need to re-create that file to avoid
  // nonexistence-induced errors in the MacOS version
  Typecode Type = prefInfo->PrefsFile.GetType();

  // Setting to default if _typecode_unknown
  if (Type == _typecode_unknown) {
    Type = _typecode_preferences;
  }

  // CB: delete old prefs file, we're overwriting it
  // (writing can go wrong when the old file is still in place)
  prefInfo->PrefsFile.Delete();

  // Re-creating the file
  // CB: is Create() supposed to truncate the file to zero length
  // if it already exists? Then the Delete() call above can go away.
  prefInfo->PrefsFile.Create(Type);

  OpenedFile PrefsFile;
  if (open_wad_file_for_writing(prefInfo->PrefsFile,PrefsFile)) {
    struct directory_entry entry;

    fill_default_wad_header(prefInfo->PrefsFile,
                            CURRENT_WADFILE_VERSION,
                            CURRENT_PREF_WADFILE_VERSION,
                            1, 0l,
                            &header);

    if (write_wad_header(PrefsFile, &header)) {
      int32 wad_length;
      int32 offset= sizeof(struct wad_header);

      /* Length? */
      wad_length= calculate_wad_length(&header, prefInfo->wad);

      /* Set the entry data..... (and put into correct byte-order for writing) */
      set_indexed_directory_offset_and_length(&header,
                                              &entry, 0, offset, wad_length, 0);

      /* Now write it.. */
      if (write_wad(PrefsFile, &header, prefInfo->wad, offset)) {
        offset+= wad_length;
        header.directory_offset= offset;
        if (write_wad_header(PrefsFile, &header) &&
            write_directorys(PrefsFile, &header, &entry)) {
          /* Success! */
        }
        else {
          assert(error_pending());
        }
      }
      else {
        assert(error_pending());
      }

      /* Since we don't free it, it is opened.. */
    }
    else {
      assert(error_pending());
    }
    close_wad_file(PrefsFile);
  }
}