271 template <
typename T >
283 return left >= right;
293 return left == right;
305 return left <= right;
314 return left != right;
331 bool ok = 3 == sscanf( cond.c_str(),
"%63[-a-zA-Z_0-9] %2[<>=!] %63[-0-9.Ee]",
338 varname[
sizeof (varname)/
sizeof (*varname)-1] = 0;
339 op[
sizeof (op)/
sizeof (*op)-1] = 0;
340 varval[
sizeof (varval)/
sizeof (*varval)-1] = 0;
344 if (endptr == varval) {
346 rv = EvalCondition< string > ( op, sval, varval );
350 rv = EvalCondition< float > ( op, fval, fref );
358 if (var.length() == 0)
361 var = var.substr( 1 );
365 if (var.length() == 0)
367 return invert ? -x >= val : x >= val;
372 if ( (r.i || r.j || r.k) && (s.i || s.j || s.k) ) {
375 retval = retval*rotvel;
376 return retval.Cast();
378 return Vector( 0, rotvel, 0 );
382 static void GetLights(
const vector< GFXLight > &origlights, vector< GFXLightLocal > &curlights,
const char *str,
float lightSize )
386 char *tmp = strdup( str );
390 while ( ( numel = sscanf( st,
"%d%c", &tint, &isloc ) ) > 0 ) {
391 assert( tint < (
int) origlights.size() );
392 lloc.
ligh = origlights[tint];
393 lloc.
islocal = (numel > 1 && isloc ==
'l');
397 curlights.push_back( lloc );
398 while ( isspace( *st ) )
400 while ( isalnum( *st ) )
412 float x = 2*difficulty*( (
float) rand() )/RAND_MAX-difficulty;
413 float y = 2*difficulty*( (
float) rand() )/RAND_MAX-difficulty;
414 float z = 2*difficulty*( (
float) rand() )/RAND_MAX-difficulty;
424 if (alpha == NULL) {}
else if (alpha[0] ==
'\0') {}
else {
425 char *s = strdup( alpha );
426 char *
d = strdup( alpha );
429 if ( 2 == sscanf( alpha,
"%s %s", s, d ) ) {
430 if (strcmp( s,
"true" ) != 0) {
466 using namespace StarXML;
469 vector< GFXLightLocal >curlights;
471 string varname, condition;
479 float scaleatmos = 10;
481 bool insideout =
false;
483 string truncatedfilename = this->
filename;
485 string::size_type tmp;
486 if ( ( tmp = truncatedfilename.find(
".system" ) ) != string::npos )
487 truncatedfilename = truncatedfilename.substr( 0, tmp );
502 vector< string >dest;
503 map< string, string > paramOverrides;
506 string fullname =
"unknw";
515 AttributeList::const_iterator iter;
527 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
555 this->name =
new char[strlen( (*iter).value.c_str() )+1];
556 strcpy( this->name, (*iter).value.c_str() );
573 string myfile(
"planets/ring.png" );
583 float iradius = p->
rSize()*1.25f;
584 float oradius = p->
rSize()*1.75f;
587 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
591 myfile = (*iter).value;
630 varname = (*iter).value;
640 ( (
Planet*) p )->AddRing( myfile, iradius, oradius,
R,
S, numslices, wrapx, wrapy, blendSrc, blendDst );
649 string myfile(
"elevator" );
657 char direction =
'b';
661 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
665 myfile = (*iter).value;
668 varname = (*iter).value;
675 if ( !(*iter).value.empty() )
676 direction = (*iter).value[0];
690 ( (
Planet*) p )->AddSpaceElevator( myfile,
faction, direction );
702 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
717 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
746 xml->
fog.back().meshname = iter->value;
776 string myfile(
"planets/Dirt_light.png" );
781 bool inside_out =
false;
786 float radius = p->
rSize();
787 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
791 myfile = (*iter).value;
809 varname = (*iter).value;
820 ( (
Planet*) p )->AddCity( myfile, radius, wrapx, wrapy, blendSrc, blendDst, inside_out );
830 string myfile(
"sol/earthcloudmaptrans.png" );
833 bool inside_out =
false;
837 float radius = p->
rSize()*1.075;
838 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
842 myfile = (*iter).value;
851 varname = (*iter).value;
865 ( (
Planet*) p )->AddAtmosphere( myfile, radius, blendSrc, blendDst, inside_out );
878 position = game_options.
mass;
881 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
894 myfile = (*iter).value;
938 float y =
S.Magnitude();
940 float z =
R.Magnitude();
945 t.
r[3] =
S.i*TerrainScale.j;
946 t.
r[4] =
S.j*TerrainScale.j;
947 t.
r[5] =
S.k*TerrainScale.j;
948 t.
r[6] =
R.i*TerrainScale.k;
949 t.
r[7] =
R.j*TerrainScale.k;
950 t.
r[8] =
R.k*TerrainScale.k;
952 t.
r[0] =
S.i*TerrainScale.i;
953 t.
r[1] =
S.j*TerrainScale.i;
954 t.
r[2] =
S.k*TerrainScale.i;
956 if ( myfile.length() ) {
968 p->setTerrain(
xml->
ct, scalex, numwraps, scaleatmos );
970 p->getTerrain( *tmpp );
998 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
1015 xml->
lights.back().SetProperties( tmptarg, tmpcol );
1024 citylights = string(
"" );
1025 technique = string(
"" );
1028 paramOverrides.clear();
1030 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
1037 fullname = (*iter).value;
1048 technique = (*iter).value;
1051 unitname = (*iter).value;
1057 citylights = (*iter).value;
1071 if (
faction == originalowner) {
1117 ourmat.sr = ourmat.sg = ourmat.sb = ourmat.dr = ourmat.dg = ourmat.db =
1118 ourmat.ar = ourmat.ag = ourmat.ab = 0;
1157 if (fabs(
parse_float( (*iter).value ) ) > .00001)
1161 if (fabs(
parse_float( (*iter).value ) ) > .00001)
1170 string::size_type eqpos = (*iter).value.find_first_of(
'=');
1171 if (eqpos != string::npos) {
1172 string name = (*iter).value.substr(0,eqpos);
1173 string value = (*iter).value.substr(eqpos+1);
1174 paramOverrides[
name] = value;
1185 fprintf(stderr,
"Creating planet %s with texture %s and technique %s - unitlevel > 2\n", fullname.c_str(),
filename.c_str(), technique.c_str());
1187 position, gravity, radius,
1188 filename, technique, unitname, blendSrc, blendDst, dest,
1193 fullname, insideout );
1196 un->SetSerial( serial );
1197 un->applyTechniqueOverrides(paramOverrides);
1201 fprintf(stderr,
"Creating planet %s with texture %s and technique %s - unitlevel <= 2\n", fullname.c_str(),
filename.c_str(), technique.c_str());
1205 position, gravity, radius,
1207 blendSrc, blendDst, dest,
xml->
cursun.Cast()
1209 NULL, ourmat, curlights,
faction
1225 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
1229 condition = (*iter).value;
1252 nebfile =
new char[1];
1255 fullname =
"unkn-unit";
1257 for (iter = attributes.begin(); iter != attributes.end(); ++iter) {
1264 fullname = (*iter).value;
1271 nebfile =
new char[strlen( (*iter).value.c_str() )+1];
1272 strcpy( nebfile, (*iter).value.c_str() );
1285 if (
faction == originalowner) {
1330 varname = (*iter).value;
1336 condition = (*iter).value;
1351 un->SetSerial( serial );
1352 un->setFullname( fullname );
1353 }
else if (elem ==
NEBULA) {
1356 un->SetSerial( serial );
1361 < 0 ? -scalex : scalex ) );
1362 un->SetSerial( serial );
1365 un->SetSerial( serial );
1368 for (
unsigned int i = 0;
i < dest.size(); ++
i)
1369 un->AddDestination( dest[i] );
1373 if (elem ==
UNIT && un->faction != neutralfaction) {
1377 if (scalex < 0 && elem !=
ASTEROID)
1391 for (
unsigned int i = 0; i < dest.size(); ++i)
1405 for (
unsigned int i = 0; i < dest.size(); ++i)
1416 }
else if (elem ==
NEBULA) {
1433 for (
unsigned int i = 0; i < dest.size(); ++i)
1442 if (elem ==
UNIT &&
xml->
moons.back()->faction != neutralfaction) {
1445 }
else if (scalex < 0 && elem !=
ASTEROID) {
1460 using namespace StarXML;
1497 using namespace VSFileSystem;
1501 bool autogenerated =
false;
1507 autogenerated =
false;
1513 printf(
"StarSystem: file not found %s\n",
file.c_str() );
1532 XML_Parser parser = XML_ParserCreate( NULL );
1533 XML_SetUserData( parser,
this );
1536 string fcontents =
f.ReadFull();
1538 XML_Parse( parser, (fcontents).c_str(),
f.Size(), 1 );
1541 XML_ParserFree( parser );
1543 for (i = 0; i <
xml->
moons.size(); ++i) {