void FSM::LoadXML( const char *filename ) { using namespace CommXML; using namespace VSFileSystem; unitlevel = 0; VSFile f; VSError err = f.OpenReadOnly( filename, CommFile ); if (err > Ok) { fprintf( stderr, "Failed to open Communications file '%s' -- aborting!\n", filename ); assert( 0 ); return; } XML_Parser parser = XML_ParserCreate( NULL ); XML_SetUserData( parser, this ); XML_SetElementHandler( parser, &FSM::beginElement, &FSM::endElement ); XML_Parse( parser, ( f.ReadFull() ).c_str(), f.Size(), 1 ); f.Close(); XML_ParserFree( parser ); }
SGalaxy::SGalaxy(const char *configfile) { using namespace VSFileSystem; subheirarchy=NULL; VSFile f; VSError err = f.OpenReadOnly(configfile,UniverseFile); if (err<=Ok) { GalaxyXML::XML x; x.g=this; XML_Parser parser = XML_ParserCreate(NULL); XML_SetUserData(parser,&x); XML_SetElementHandler (parser,&GalaxyXML::beginElement,&GalaxyXML::endElement); XML_Parse(parser,(f.ReadFull()).c_str(),f.Size(),1); /* do { const int chunk_size = 65536; char buf[chunk_size]; int length; length = VSFileSystem::vs_read (buf,1,chunk_size,fp); XML_Parse(parser,buf,length,VSFileSystem::vs_feof(fp)); }while (!VSFileSystem::vs_feof(fp)); VSFileSystem::vs_close (fp); */ f.Close(); XML_ParserFree(parser); } else { if(SERVER) { std::cerr<<"!!! ERROR : couldn't find galaxy file : "<<configfile<<std::endl; exit(1); } } }
void AIScript::LoadXML() { static int aidebug = XMLSupport::parse_int( vs_config->getVariable( "AI", "debug_level", "0" ) ); using namespace AiXml; using namespace VSFileSystem; string full_filename = filename; bool doroll = false; HardCodedMap::const_iterator iter = hard_coded_scripts.find( full_filename ); if (iter==hard_coded_scripts.end() && full_filename.length() > 5 && full_filename[0] == 'r' && full_filename[1] == 'o' && full_filename[2] == 'l' && full_filename[3] == 'l' && full_filename[4] == ' ') { doroll = true; full_filename = full_filename.substr( 5 ); iter = hard_coded_scripts.find( full_filename ); } if ( iter != hard_coded_scripts.end() ) { CCScript *myscript = (*iter).second; (*myscript)(this, parent); if (doroll) { unsigned int val = rand(); if (val < RAND_MAX/4) RollRightHard( this, parent ); else if (val < RAND_MAX/2) RollLeftHard( this, parent ); else RollLeft( this, parent ); } if (aidebug > 1) { VSFileSystem::vs_fprintf( stderr, "%f using hcs %s for %s threat %f\n", mission->getGametime(), filename, parent->name.get().c_str(), parent->GetComputerData().threatlevel ); } if ( _Universe->isPlayerStarship( parent->Target() ) ) { float value; static float game_speed = XMLSupport::parse_float( vs_config->getVariable( "physics", "game_speed", "1" ) ); static float game_accel = XMLSupport::parse_float( vs_config->getVariable( "physics", "game_accel", "1" ) ); { Unit *targ = parent->Target(); if (targ) { Vector PosDifference = ( targ->Position()-parent->Position() ).Cast(); float pdmag = PosDifference.Magnitude(); value = ( pdmag-parent->rSize()-targ->rSize() ); float myvel = pdmag > 0 ? PosDifference.Dot( parent->GetVelocity()-targ->GetVelocity() )/pdmag : 0; if (myvel > 0) value -= myvel*myvel/( 2*( parent->Limits().retro/parent->GetMass() ) ); } else { value = 10000; } value /= game_speed*game_accel; } if (aidebug > 0) { UniverseUtil::IOmessage( 0, parent->name, "all", string( "using script " )+string( filename )+" threat "+XMLSupport::tostring( parent->GetComputerData().threatlevel )+" dis " +XMLSupport::tostring( value ) ); } } return; } else { if (aidebug > 1) VSFileSystem::vs_fprintf( stderr, "using soft coded script %s", filename ); if (aidebug > 0) UniverseUtil::IOmessage( 0, parent->name, "all", string( "FAILED(or missile) script " )+string( filename )+" threat "+XMLSupport::tostring( parent->GetComputerData().threatlevel ) ); } #ifdef AIDBG VSFileSystem::vs_fprintf( stderr, "chd" ); #endif #ifdef AIDBG VSFileSystem::vs_fprintf( stderr, "echd" ); #endif VSFile f; VSError err = f.OpenReadOnly( filename, AiFile ); #ifdef AIDBG VSFileSystem::vs_fprintf( stderr, "backup " ); #endif if (err > Ok) { VSFileSystem::vs_fprintf( stderr, "cannot find AI script %s\n", filename ); if (hard_coded_scripts.find(filename)!=hard_coded_scripts.end()) { assert(0); } return; } #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "nxml" ); #endif xml = new AIScriptXML; xml->unitlevel = 0; xml->terminate = true; xml->afterburn = true; xml->acc = 2; xml->defaultvec = QVector( 0, 0, 0 ); xml->defaultf = 0; #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "parscrea" ); #endif XML_Parser parser = XML_ParserCreate( NULL ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "usdat %x", parser ); #endif XML_SetUserData( parser, this ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "elha" ); #endif XML_SetElementHandler( parser, &AIScript::beginElement, &AIScript::endElement ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "do" ); #endif XML_Parse( parser, ( f.ReadFull() ).c_str(), f.Size(), 1 ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "%xxml_free", parser ); fflush( stderr ); #endif XML_ParserFree( parser ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "xml_freed" ); #endif f.Close(); for (unsigned int i = 0; i < xml->orders.size(); i++) { #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "parset" ); #endif xml->orders[i]->SetParent( parent ); EnqueueOrder( xml->orders[i] ); #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "cachunkx" ); #endif } #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "xml%x", xml ); fflush( stderr ); #endif delete xml; #ifdef BIDBG VSFileSystem::vs_fprintf( stderr, "\\xml\n" ); fflush( stderr ); #endif }