<?php

$ffname = $fflocation ."Sfc2Spd.sds";

$ffdbstring = file_get_contents($ffname);

$ffdb_format ="";

	$ffdb_format .= 'a4savever/';
    	$ffdb_format .= 'Lobjectnum/';
   	$ffdb_format .= 'Llastobjectid/';
	$ffdb_format .= 'Lcampsize1/';
	$ffdb_format .= 'Lcampsize2/';
	$ffdb_format .= 'Lcamphdrsize/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['camphdrsize'].'campheader/';
	$ffdb_format .= 'Lcampseperator/';
	$ffdb_format .= 'a6campobjheader/';
	$ffdb_format .= 'Lcampidentifier/';
	$ffdb_format .= 'Lcampunknown/';
	$ffdb_format .= 'Lcampnamelen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campnamelen'].'campaignname/';
	$ffdb_format .= 'Lcampdesclen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campdesclen'].'campdesc/';
	$ffdb_format .= 'Lcampearlymaplen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campearlymaplen'].'campearlymap/';
	$ffdb_format .= 'Lcampmiddlemaplen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);


	$ffdb_format .= 'a'.$dbdecarray['campmiddlemaplen'].'campmiddlemap/';
	$ffdb_format .= 'Lcamplatemaplen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);


	$ffdb_format .= 'a'.$dbdecarray['camplatemaplen'].'camplatemap/';
	$ffdb_format .= 'Lcampnummissions/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);


	for ($i = 1; $i <= $dbdecarray['campnummissions']; $i++) {
		$ffdb_format .= 'Lcampmissionnamelen'.$i.'/';
		$dbdecarray = unpack ($ffdb_format,$ffdbstring);
		$ffdb_format .= 'a'.$dbdecarray['campmissionnamelen'.$i].'campmissionname'.$i.'/';
	}
	$ffdb_format .= 'Lcampnumraces/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'L'.$dbdecarray['campnumraces'].'camprace/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'Lcampstartera/';
	$ffdb_format .= 'Lcampdifficulty/';
	$ffdb_format .= 'Lcamptriggerprestige/';
	$ffdb_format .= 'Lcamptriggerlen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['camptriggerlen'].'camptriggermission/'; 
	$ffdb_format .= 'Lcampnamelen2/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campnamelen2'].'campaignname2/'; 
	$ffdb_format .= 'Lcampspcaptnamelen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	if ($dbdecarray['campspcaptnamelen'] == 0) {
		$ffdb_format .= 'Ccampspcaptname/';
	} else {
		$ffdb_format .= 'a'.$dbdecarray['campspcaptnamelen'].'campspcaptname/'; 
	}
	$ffdb_format .= 'Lcampspcaptrace/';
	$ffdb_format .= 'Lcampspprestige/';
	$ffdb_format .= 'Lcampunknown5/';
	//$ffdb_format .= 'LcampunknownSP/';
	$ffdb_format .= 'Lcampturnssofar/';
	$ffdb_format .= 'Lcampunknown10/';
	$ffdb_format .= 'Lcampturnsperyear/';
	$ffdb_format .= 'Lcamplengthofturn/';
	$ffdb_format .= 'Lcampbaseyear/';
	$ffdb_format .= 'Lcampearlyerastart/';
	$ffdb_format .= 'Lcampmiderastart/';
	$ffdb_format .= 'Lcamplateerastart/';
	$ffdb_format .= 'Lcampadverastart/';
	$ffdb_format .= 'Lcampnumaccounts/';
	$ffdb_format .= 'Lcampmaxaccounts/';
	$ffdb_format .= 'Lcampnumplaying/';
	$ffdb_format .= 'Lcampmaxplaying/';
	$ffdb_format .= 'Lcampversionlen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campversionlen'].'campversion/'; 
	$ffdb_format .= 'Lcampversionlen2/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['campversionlen2'].'campversion2/'; 
	// omitted Dave's remaininglength stuff...
	$ffdb_format .= 'Lmapsize1/';
	$ffdb_format .= 'Lmapsize2/';
	$ffdb_format .= 'Lmaphdrlen/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['maphdrlen'].'mapheader/';
	$ffdb_format .= 'Lmapseperator/';
	$ffdb_format .= 'a6mapobjheader/';
	$ffdb_format .= 'Lmapidentifier/';
	$ffdb_format .= 'Lmapunknown1/';
	$ffdb_format .= 'Lmapnumcolumns/';
	$ffdb_format .= 'Lmapnumrows/';
	$ffdb_format .= 'amapunknown2/';

	//long remaininglen;
	// the following is the product of numcolumns and numrows
	//long numhexes;

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

for ($i = 1; $i <= ($dbdecarray['mapnumcolumns'] * $dbdecarray['mapnumrows']); $i++) {

	//maphexobject
	$ffdb_format .= 'Lmaphex'.$i.'size1/';
	$ffdb_format .= 'Lmaphex'.$i.'size2/';
	$ffdb_format .= 'Lmaphex'.$i.'hdrlen/';

//$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	//$ffdb_format .= 'a'.$dbdecarray['maphex'.$i.'hdrlen'].'maphex'.$i.'header/';
	$ffdb_format .= 'a17maphex'.$i.'header/';

	$ffdb_format .= 'Lmaphex'.$i.'seperator/';
	$ffdb_format .= 'a6maphex'.$i.'objheader/';
	$ffdb_format .= 'Lmaphex'.$i.'identifier/';
	$ffdb_format .= 'a9maphex'.$i.'unknown/';
	$ffdb_format .= 'Lmaphex'.$i.'column/';
	$ffdb_format .= 'Lmaphex'.$i.'row/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerA/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerB/';
	$ffdb_format .= 'Lmaphex'.$i.'race/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerC/';
	$ffdb_format .= 'Lmaphex'.$i.'cartel/';
	$ffdb_format .= 'Lmaphex'.$i.'terrain/';
	$ffdb_format .= 'Lmaphex'.$i.'planet/';
	$ffdb_format .= 'Lmaphex'.$i.'base/';
	$ffdb_format .= 'Lmaphex'.$i.'maxecon/';
	$ffdb_format .= 'Lmaphex'.$i.'currecon/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerD /';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerE/';
	$ffdb_format .= 'Lmaphex'.$i.'maxdv/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerF/';
	$ffdb_format .= 'Lmaphex'.$i.'cartelmaxdv/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerG/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerH/';
	$ffdb_format .= 'Lmaphex'.$i.'currdv/';
	$ffdb_format .= 'Lmaphex'.$i.'opmarkerI/';
	$ffdb_format .= 'Lmaphex'.$i.'cartelcurrdv/';
	$ffdb_format .= 'Lmaphex'.$i.'maximpa/';
	$ffdb_format .= 'Lmaphex'.$i.'maximpb/';
	$ffdb_format .= 'Lmaphex'.$i.'currimpa/';
	$ffdb_format .= 'Lmaphex'.$i.'currimpb/';
	//$ffdb_format .= 'amaphex'.$i.'unknown2/';

	//char *unknown2; // the balance of the object size, if any
	//long remaininglen;
}


$dbdecarray = unpack ($ffdb_format,$ffdbstring);



	//political tension matrix

	$ffdb_format .= 'Lpolobjsize1/';
	$ffdb_format .= 'Lpolobjsize2/';
	$ffdb_format .= 'Lpolhdrlength/';

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

	$ffdb_format .= 'a'.$dbdecarray['polhdrlength'].'polheader/';


	$ffdb_format .= 'Lpolseperator/';
	$ffdb_format .= 'a6polobjheader/';
	$ffdb_format .= 'Lpolidentifier/';
	$ffdb_format .= 'Lpolunknown1/';
	$ffdb_format .= 'Lpolnumraces/';
	//struct sTensionElem {
		//long tension;
		//char percent;
	//};
	//sTensionElem *poltensions;
	//$ffdb_format .=char *polunknown2; // length is balance of object size
	//$ffdb_format .=long polremaininglen;

$dbdecarray = unpack ($ffdb_format,$ffdbstring);

?>