//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int Export_BotLibSetup(void) { int errnum; bot_developer = LibVarGetValue("bot_developer"); memset( &botlibglobals, 0, sizeof(botlibglobals) ); // bk001207 - init //initialize byte swapping (litte endian etc.) // Swap_Init(); Log_Open("botlib.log"); // botimport.Print(PRT_MESSAGE, "------- BotLib Initialization -------\n"); // botlibglobals.maxclients = (int) LibVarValue("maxclients", "128"); botlibglobals.maxentities = (int) LibVarValue("maxentities", "1024"); errnum = AAS_Setup(); //be_aas_main.c if (errnum != BLERR_NOERROR) return errnum; errnum = EA_Setup(); //be_ea.c if (errnum != BLERR_NOERROR) return errnum; /* errnum = BotSetupWeaponAI(); //be_ai_weap.c if (errnum != BLERR_NOERROR)return errnum; errnum = BotSetupGoalAI(); //be_ai_goal.c if (errnum != BLERR_NOERROR) return errnum; errnum = BotSetupChatAI(); //be_ai_chat.c if (errnum != BLERR_NOERROR) return errnum; errnum = BotSetupMoveAI(); //be_ai_move.c if (errnum != BLERR_NOERROR) return errnum; */ botlibsetup = qtrue; botlibglobals.botlibsetup = qtrue; return BLERR_NOERROR; } //end of the function Export_BotLibSetup
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int Export_BotLibSetup(void) { int errnum; botDeveloper = LibVarGetValue("bot_developer"); memset( &botlibglobals, 0, sizeof(botlibglobals) ); // bk001207 - init //initialize byte swapping (litte endian etc.) // Swap_Init(); if(botDeveloper) { char const * homedir, * gamedir, * basedir; char logfilename[MAX_OSPATH]; homedir = LibVarGetString("homedir"); gamedir = LibVarGetString("gamedir"); basedir = LibVarGetString("com_basegame"); if (*homedir) { if(*gamedir) Com_sprintf(logfilename, sizeof(logfilename), "%s%c%s%cbotlib.log", homedir, PATH_SEP, gamedir, PATH_SEP); else if(*basedir) Com_sprintf(logfilename, sizeof(logfilename), "%s%c%s%cbotlib.log", homedir, PATH_SEP, basedir, PATH_SEP); else Com_sprintf(logfilename, sizeof(logfilename), "%s%c" "base" "%cbotlib.log", homedir, PATH_SEP, PATH_SEP); //fixme use BASEGAME define } else Com_sprintf(logfilename, sizeof(logfilename), "botlib.log"); Log_Open(logfilename); } // // botimport.Print(PRT_MESSAGE, "------- BotLib Initialization -------\n"); // botlibglobals.maxclients = (int) LibVarValue("maxclients", "128"); botlibglobals.maxentities = (int) LibVarValue("maxentities", "1024"); errnum = AAS_Setup(); //be_aas_main.c if (errnum != BLERR_NOERROR) return errnum; errnum = EA_Setup(); //be_ea.c if (errnum != BLERR_NOERROR) return errnum; /* errnum = BotSetupWeaponAI(); //be_ai_weap.c if (errnum != BLERR_NOERROR)return errnum; errnum = BotSetupGoalAI(); //be_ai_goal.c if (errnum != BLERR_NOERROR) return errnum; errnum = BotSetupChatAI(); //be_ai_chat.c if (errnum != BLERR_NOERROR) return errnum; errnum = BotSetupMoveAI(); //be_ai_move.c if (errnum != BLERR_NOERROR) return errnum; */ botlibsetup = qtrue; botlibglobals.botlibsetup = qtrue; return BLERR_NOERROR; } //end of the function Export_BotLibSetup
int BotLibSetup( bool singleplayer ) { bot_developer = LibVarGetValue( "bot_developer" ); Com_Memset( &botlibglobals, 0, sizeof ( botlibglobals ) ); Log_Open( "botlib.log" ); BotImport_Print( PRT_MESSAGE, "------- BotLib Initialization -------\n" ); botlibglobals.maxclients = ( int )LibVarValue( "maxclients", "128" ); botlibglobals.maxentities = ( int )LibVarValue( "maxentities", GGameType & GAME_WolfSP ? "2048" : "1024" ); int errnum = AAS_Setup(); //be_aas_main.c if ( errnum != BLERR_NOERROR ) { return errnum; } errnum = EA_Setup(); //be_ea.c if ( errnum != BLERR_NOERROR ) { return errnum; } if ( !( GGameType & ( GAME_WolfSP | GAME_WolfMP ) ) ) { errnum = BotSetupWeaponAI(); //be_ai_weap.c if ( errnum != BLERR_NOERROR ) { return errnum; } errnum = BotSetupGoalAI( singleplayer ); //be_ai_goal.c if ( errnum != BLERR_NOERROR ) { return errnum; } errnum = BotSetupChatAI(); //be_ai_chat.c if ( errnum != BLERR_NOERROR ) { return errnum; } } if ( !( GGameType & GAME_WolfMP ) ) { errnum = BotSetupMoveAI(); //be_ai_move.c if ( errnum != BLERR_NOERROR ) { return errnum; } } if ( GGameType & GAME_ET ) { PC_RemoveAllGlobalDefines(); } botlibsetup = true; botlibglobals.botlibsetup = true; return BLERR_NOERROR; }
int BotSetupGoalAI( bool singleplayer ) { if ( GGameType & GAME_ET ) { g_singleplayer = singleplayer; } else { //check if teamplay is on g_gametype = LibVarValue( "g_gametype", "0" ); } //item configuration file const char* filename = LibVarString( "itemconfig", "items.c" ); if ( GGameType & GAME_ET ) { PS_SetBaseFolder( BOTFILESBASEFOLDER ); } //load the item configuration itemconfig = LoadItemConfig( filename ); if ( GGameType & GAME_ET ) { PS_SetBaseFolder( "" ); } if ( !itemconfig ) { BotImport_Print( PRT_FATAL, "couldn't load item config\n" ); return GGameType & GAME_Quake3 ? Q3BLERR_CANNOTLOADITEMCONFIG : WOLFBLERR_CANNOTLOADITEMCONFIG; } if ( GGameType & GAME_Quake3 ) { droppedweight = LibVar( "droppedweight", "1000" ); } //everything went ok return BLERR_NOERROR; }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void AAS_InitAASLinkHeap(void) { int i, max_aaslinks; max_aaslinks = aasworld.linkheapsize; //if there's no link heap present if (!aasworld.linkheap) { #ifdef BSPC max_aaslinks = 6144; #else max_aaslinks = (int) LibVarValue("max_aaslinks", "6144"); #endif if (max_aaslinks < 0) max_aaslinks = 0; aasworld.linkheapsize = max_aaslinks; aasworld.linkheap = (aas_link_t *) GetHunkMemory(max_aaslinks * sizeof(aas_link_t)); } //end if //link the links on the heap aasworld.linkheap[0].prev_ent = NULL; aasworld.linkheap[0].next_ent = &aasworld.linkheap[1]; for (i = 1; i < max_aaslinks-1; i++) { aasworld.linkheap[i].prev_ent = &aasworld.linkheap[i - 1]; aasworld.linkheap[i].next_ent = &aasworld.linkheap[i + 1]; } //end for aasworld.linkheap[max_aaslinks-1].prev_ent = &aasworld.linkheap[max_aaslinks-2]; aasworld.linkheap[max_aaslinks-1].next_ent = NULL; //pointer to the first free link aasworld.freelinks = &aasworld.linkheap[0]; // numaaslinks = max_aaslinks; } //end of the function AAS_InitAASLinkHeap
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void AAS_ContinueInit(float time) { //if no AAS file loaded if (!aasworld.loaded) return; //if AAS is already initialized if (aasworld.initialized) return; //calculate reachability, if not finished return if (AAS_ContinueInitReachability(time)) return; //initialize clustering for the new map AAS_InitClustering(); //if reachability has been calculated and an AAS file should be written //or there is a forced data optimization if (aasworld.savefile || ((int)LibVarGetValue("forcewrite"))) { //optimize the AAS data if ((int)LibVarValue("aasoptimize", "0")) AAS_Optimize(); //save the AAS file if (AAS_WriteAASFile(aasworld.filename)) { botimport.Print(PRT_MESSAGE, "%s written succesfully\n", aasworld.filename); } //end if else { botimport.Print(PRT_ERROR, "couldn't write %s\n", aasworld.filename); } //end else } //end if //initialize the routing AAS_InitRouting(); //at this point AAS is initialized AAS_SetInitialized(); } //end of the function AAS_ContinueInit
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void Log_Open( char *filename ) { if ( !LibVarValue( "log", "0" ) ) { return; } Log_AlwaysOpen( filename ); }
//=========================================================================== // called when the library is first loaded // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_Setup(void) { aasworld.maxclients = (int) LibVarValue("maxclients", "128"); aasworld.maxentities = (int) LibVarValue("maxentities", "1024"); // as soon as it's set to 1 the routing cache will be saved saveroutingcache = LibVar("saveroutingcache", "0"); //allocate memory for the entities if (aasworld.entities) FreeMemory(aasworld.entities); aasworld.entities = (aas_entity_t *) GetClearedHunkMemory(aasworld.maxentities * sizeof(aas_entity_t)); //invalidate all the entities AAS_InvalidateEntities(); //force some recalculations //LibVarSet("forceclustering", "1"); //force clustering calculation //LibVarSet("forcereachability", "1"); //force reachability calculation aasworld.numframes = 0; return BLERR_NOERROR; } //end of the function AAS_Setup
//=========================================================================== // called when the library is first loaded // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int AAS_Setup( void ) { // Ridah, just use the default world for entities AAS_SetCurrentWorld( 0 ); ( *aasworlds ).maxclients = (int) LibVarValue( "maxclients", "128" ); ( *aasworlds ).maxentities = (int) LibVarValue( "maxentities", "1024" ); //allocate memory for the entities if ( ( *aasworld ).entities ) { FreeMemory( ( *aasworld ).entities ); } ( *aasworld ).entities = (aas_entity_t *) GetClearedHunkMemory( ( *aasworld ).maxentities * sizeof( aas_entity_t ) ); //invalidate all the entities AAS_InvalidateEntities(); //force some recalculations //LibVarSet("forceclustering", "1"); //force clustering calculation //LibVarSet("forcereachability", "1"); //force reachability calculation ( *aasworld ).numframes = 0; return BLERR_NOERROR; } //end of the function AAS_Setup
static void InitLevelItemHeap() { if ( levelitemheap ) { Mem_Free( levelitemheap ); } int max_levelitems = ( int )LibVarValue( "max_levelitems", "256" ); levelitemheap = ( levelitem_t* )Mem_ClearedAlloc( max_levelitems * sizeof ( levelitem_t ) ); for ( int i = 0; i < max_levelitems - 1; i++ ) { levelitemheap[ i ].next = &levelitemheap[ i + 1 ]; } levelitemheap[ max_levelitems - 1 ].next = NULL; freelevelitems = levelitemheap; }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== int BotSetupGoalAI( void ) { char *filename; //check if teamplay is on g_gametype = LibVarValue( "g_gametype", "0" ); //item configuration file filename = LibVarString( "itemconfig", "items.c" ); //load the item configuration itemconfig = LoadItemConfig( filename ); if ( !itemconfig ) { botimport.Print( PRT_FATAL, "couldn't load item config\n" ); return BLERR_CANNOTLOADITEMCONFIG; } //end if //everything went ok return BLERR_NOERROR; } //end of the function BotSetupGoalAI
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void InitLevelItemHeap( void ) { int i, max_levelitems; if ( levelitemheap ) { FreeMemory( levelitemheap ); } max_levelitems = (int) LibVarValue( "max_levelitems", "256" ); levelitemheap = (levelitem_t *) GetMemory( max_levelitems * sizeof( levelitem_t ) ); for ( i = 0; i < max_levelitems - 2; i++ ) { levelitemheap[i].next = &levelitemheap[i + 1]; } //end for levelitemheap[max_levelitems - 1].next = NULL; // freelevelitems = levelitemheap; } //end of the function InitLevelItemHeap
void Log_Open( const char* filename ) { if ( !LibVarValue( "log", "0" ) ) { return; } if ( !filename || !String::Length( filename ) ) { BotImport_Print( PRT_MESSAGE, "openlog <filename>\n" ); return; } if ( logfile.fp ) { BotImport_Print( PRT_ERROR, "log file %s is already opened\n", logfile.filename ); return; } logfile.fp = FS_FOpenFileWrite( filename ); if ( !logfile.fp ) { BotImport_Print( PRT_ERROR, "can't open the log file %s\n", filename ); return; } String::NCpy( logfile.filename, filename, MAX_QPATH ); BotImport_Print( PRT_MESSAGE, "Opened log %s\n", logfile.filename ); }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void Log_Open(char *filename) { if (!LibVarValue("log", "0")) return; if (!filename || !strlen(filename)) { botimport.Print(PRT_MESSAGE, "openlog <filename>\n"); return; } //end if if (logfile.fp) { botimport.Print(PRT_ERROR, "log file %s is already opened\n", logfile.filename); return; } //end if logfile.fp = fopen(filename, "wb"); if (!logfile.fp) { botimport.Print(PRT_ERROR, "can't open the log file %s\n", filename); return; } //end if strncpy(logfile.filename, filename, MAX_LOGFILENAMESIZE); botimport.Print(PRT_MESSAGE, "Opened log %s\n", logfile.filename); } //end of the function Log_Create
static itemconfig_t* LoadItemConfig( const char* filename ) { int max_iteminfo = ( int )LibVarValue( "max_iteminfo", "256" ); if ( max_iteminfo < 0 ) { BotImport_Print( PRT_ERROR, "max_iteminfo = %d\n", max_iteminfo ); max_iteminfo = 256; LibVarSet( "max_iteminfo", "256" ); } if ( GGameType & GAME_Quake3 ) { PC_SetBaseFolder( BOTFILESBASEFOLDER ); } char path[ MAX_QPATH ]; String::NCpyZ( path, filename, MAX_QPATH ); source_t* source = LoadSourceFile( path ); if ( !source ) { BotImport_Print( PRT_ERROR, "counldn't load %s\n", path ); return NULL; } //initialize item config itemconfig_t* ic = ( itemconfig_t* )Mem_ClearedAlloc( sizeof ( itemconfig_t ) + max_iteminfo * sizeof ( iteminfo_t ) ); ic->iteminfo = ( iteminfo_t* )( ( char* )ic + sizeof ( itemconfig_t ) ); ic->numiteminfo = 0; //parse the item config file token_t token; while ( PC_ReadToken( source, &token ) ) { if ( !String::Cmp( token.string, "iteminfo" ) ) { if ( ic->numiteminfo >= max_iteminfo ) { SourceError( source, "more than %d item info defined\n", max_iteminfo ); Mem_Free( ic ); FreeSource( source ); return NULL; } iteminfo_t* ii = &ic->iteminfo[ ic->numiteminfo ]; Com_Memset( ii, 0, sizeof ( iteminfo_t ) ); if ( !PC_ExpectTokenType( source, TT_STRING, 0, &token ) ) { Mem_Free( ic ); FreeSource( source ); return NULL; } StripDoubleQuotes( token.string ); String::NCpy( ii->classname, token.string, sizeof ( ii->classname ) - 1 ); if ( !ReadStructure( source, &iteminfo_struct, ( char* )ii ) ) { Mem_Free( ic ); FreeSource( source ); return NULL; } ii->number = ic->numiteminfo; ic->numiteminfo++; } else { SourceError( source, "unknown definition %s\n", token.string ); Mem_Free( ic ); FreeSource( source ); return NULL; } } FreeSource( source ); if ( !ic->numiteminfo ) { BotImport_Print( PRT_WARNING, "no item info loaded\n" ); } BotImport_Print( PRT_MESSAGE, "loaded %s\n", path ); return ic; }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== weaponconfig_t *LoadWeaponConfig(char *filename) { int max_weaponinfo, max_projectileinfo; token_t token; char path[MAX_PATH]; int i, j; source_t *source; weaponconfig_t *wc; weaponinfo_t weaponinfo; max_weaponinfo = (int) LibVarValue("max_weaponinfo", "32"); if (max_weaponinfo < 0) { botimport.Print(PRT_ERROR, "max_weaponinfo = %d\n", max_weaponinfo); max_weaponinfo = 32; LibVarSet("max_weaponinfo", "32"); } //end if max_projectileinfo = (int) LibVarValue("max_projectileinfo", "32"); if (max_projectileinfo < 0) { botimport.Print(PRT_ERROR, "max_projectileinfo = %d\n", max_projectileinfo); max_projectileinfo = 32; LibVarSet("max_projectileinfo", "32"); } //end if strncpy(path, filename, MAX_PATH); PC_SetBaseFolder(BOTFILESBASEFOLDER); source = LoadSourceFile(path); if (!source) { botimport.Print(PRT_ERROR, "counldn't load %s\n", path); return NULL; } //end if //initialize weapon config wc = (weaponconfig_t *) GetClearedHunkMemory(sizeof(weaponconfig_t) + max_weaponinfo * sizeof(weaponinfo_t) + max_projectileinfo * sizeof(projectileinfo_t)); wc->weaponinfo = (weaponinfo_t *) ((char *) wc + sizeof(weaponconfig_t)); wc->projectileinfo = (projectileinfo_t *) ((char *) wc->weaponinfo + max_weaponinfo * sizeof(weaponinfo_t)); wc->numweapons = max_weaponinfo; wc->numprojectiles = 0; //parse the source file while(PC_ReadToken(source, &token)) { if (!strcmp(token.string, "weaponinfo")) { Com_Memset(&weaponinfo, 0, sizeof(weaponinfo_t)); if (!ReadStructure(source, &weaponinfo_struct, (char *) &weaponinfo)) { FreeMemory(wc); FreeSource(source); return NULL; } //end if if (weaponinfo.number < 0 || weaponinfo.number >= max_weaponinfo) { botimport.Print(PRT_ERROR, "weapon info number %d out of range in %s\n", weaponinfo.number, path); FreeMemory(wc); FreeSource(source); return NULL; } //end if Com_Memcpy(&wc->weaponinfo[weaponinfo.number], &weaponinfo, sizeof(weaponinfo_t)); wc->weaponinfo[weaponinfo.number].valid = qtrue; } //end if else if (!strcmp(token.string, "projectileinfo")) { if (wc->numprojectiles >= max_projectileinfo) { botimport.Print(PRT_ERROR, "more than %d projectiles defined in %s\n", max_projectileinfo, path); FreeMemory(wc); FreeSource(source); return NULL; } //end if Com_Memset(&wc->projectileinfo[wc->numprojectiles], 0, sizeof(projectileinfo_t)); if (!ReadStructure(source, &projectileinfo_struct, (char *) &wc->projectileinfo[wc->numprojectiles])) { FreeMemory(wc); FreeSource(source); return NULL; } //end if wc->numprojectiles++; } //end if else { botimport.Print(PRT_ERROR, "unknown definition %s in %s\n", token.string, path); FreeMemory(wc); FreeSource(source); return NULL; } //end else } //end while FreeSource(source); //fix up weapons for (i = 0; i < wc->numweapons; i++) { if (!wc->weaponinfo[i].valid) continue; if (!wc->weaponinfo[i].name[0]) { botimport.Print(PRT_ERROR, "weapon %d has no name in %s\n", i, path); FreeMemory(wc); return NULL; } //end if if (!wc->weaponinfo[i].projectile[0]) { botimport.Print(PRT_ERROR, "weapon %s has no projectile in %s\n", wc->weaponinfo[i].name, path); FreeMemory(wc); return NULL; } //end if //find the projectile info and copy it to the weapon info for (j = 0; j < wc->numprojectiles; j++) { if (!strcmp(wc->projectileinfo[j].name, wc->weaponinfo[i].projectile)) { Com_Memcpy(&wc->weaponinfo[i].proj, &wc->projectileinfo[j], sizeof(projectileinfo_t)); break; } //end if } //end for if (j == wc->numprojectiles) { botimport.Print(PRT_ERROR, "weapon %s uses undefined projectile in %s\n", wc->weaponinfo[i].name, path); FreeMemory(wc); return NULL; } //end if } //end for if (!wc->numweapons) botimport.Print(PRT_WARNING, "no weapon info loaded\n"); botimport.Print(PRT_MESSAGE, "loaded %s\n", path); return wc; } //end of the function LoadWeaponConfig
void AAS_InitSettings( void ) { aassettings.phys_gravitydirection.x = 0; aassettings.phys_gravitydirection.y = 0; aassettings.phys_gravitydirection.z = -1; aassettings.phys_friction = LibVarValue("phys_friction", "6"); aassettings.phys_stopspeed = LibVarValue("phys_stopspeed", "100"); aassettings.phys_gravity = LibVarValue("phys_gravity", "800"); aassettings.phys_waterfriction = LibVarValue("phys_waterfriction", "1"); aassettings.phys_watergravity = LibVarValue("phys_watergravity", "400"); aassettings.phys_maxvelocity = LibVarValue("phys_maxvelocity", "320"); aassettings.phys_maxwalkvelocity = LibVarValue("phys_maxwalkvelocity", "320"); aassettings.phys_maxcrouchvelocity = LibVarValue("phys_maxcrouchvelocity", "100"); aassettings.phys_maxswimvelocity = LibVarValue("phys_maxswimvelocity", "150"); aassettings.phys_walkaccelerate = LibVarValue("phys_walkaccelerate", "10"); aassettings.phys_airaccelerate = LibVarValue("phys_airaccelerate", "1"); aassettings.phys_swimaccelerate = LibVarValue("phys_swimaccelerate", "4"); aassettings.phys_maxstep = LibVarValue("phys_maxstep", "19"); aassettings.phys_maxsteepness = LibVarValue("phys_maxsteepness", "0.7"); aassettings.phys_maxwaterjump = LibVarValue("phys_maxwaterjump", "18"); aassettings.phys_maxbarrier = LibVarValue("phys_maxbarrier", "33"); aassettings.phys_jumpvel = LibVarValue("phys_jumpvel", "270"); aassettings.phys_falldelta5 = LibVarValue("phys_falldelta5", "40"); aassettings.phys_falldelta10 = LibVarValue("phys_falldelta10", "60"); aassettings.rs_waterjump = LibVarValue("rs_waterjump", "400"); aassettings.rs_teleport = LibVarValue("rs_teleport", "50"); aassettings.rs_barrierjump = LibVarValue("rs_barrierjump", "100"); aassettings.rs_startcrouch = LibVarValue("rs_startcrouch", "300"); aassettings.rs_startgrapple = LibVarValue("rs_startgrapple", "500"); aassettings.rs_startwalkoffledge = LibVarValue("rs_startwalkoffledge", "70"); aassettings.rs_startjump = LibVarValue("rs_startjump", "300"); aassettings.rs_rocketjump = LibVarValue("rs_rocketjump", "500"); aassettings.rs_bfgjump = LibVarValue("rs_bfgjump", "500"); aassettings.rs_jumppad = LibVarValue("rs_jumppad", "250"); aassettings.rs_aircontrolledjumppad = LibVarValue("rs_aircontrolledjumppad", "300"); aassettings.rs_funcbob = LibVarValue("rs_funcbob", "300"); aassettings.rs_startelevator = LibVarValue("rs_startelevator", "50"); aassettings.rs_falldamage5 = LibVarValue("rs_falldamage5", "300"); aassettings.rs_falldamage10 = LibVarValue("rs_falldamage10", "500"); aassettings.rs_maxfallheight = LibVarValue("rs_maxfallheight", "0"); aassettings.rs_maxjumpfallheight = LibVarValue("rs_maxjumpfallheight", "450"); }
int Export_BotLibSetup( void ) { #else int Export_BotLibSetup( qboolean singleplayer ) { #endif // RTCW_XX int errnum; bot_developer = LibVarGetValue( "bot_developer" ); //BBi ////initialize byte swapping (litte endian etc.) //Swap_Init(); //BBi Log_Open( "botlib.log" ); // botimport.Print( PRT_MESSAGE, "------- BotLib Initialization -------\n" ); // botlibglobals.maxclients = (int) LibVarValue( "maxclients", "128" ); #if defined RTCW_SP botlibglobals.maxentities = (int) LibVarValue( "maxentities", "2048" ); #else botlibglobals.maxentities = (int) LibVarValue( "maxentities", "1024" ); #endif // RTCW_XX errnum = AAS_Setup(); //be_aas_main.c if ( errnum != BLERR_NOERROR ) { return errnum; } errnum = EA_Setup(); //be_ea.c if ( errnum != BLERR_NOERROR ) { return errnum; } #if !defined RTCW_ET // errnum = BotSetupWeaponAI(); //be_ai_weap.c // if (errnum != BLERR_NOERROR)return errnum; // errnum = BotSetupGoalAI(); //be_ai_goal.c // if (errnum != BLERR_NOERROR) return errnum; // errnum = BotSetupChatAI(); //be_ai_chat.c // if (errnum != BLERR_NOERROR) return errnum; #else errnum = BotSetupWeaponAI(); //be_ai_weap.c if ( errnum != BLERR_NOERROR ) { return errnum; } // START Arnout changes, 28-08-2002. // added single player errnum = BotSetupGoalAI( singleplayer ); //be_ai_goal.c // END Arnout changes, 28-08-2002. if ( errnum != BLERR_NOERROR ) { return errnum; } errnum = BotSetupChatAI(); //be_ai_chat.c if ( errnum != BLERR_NOERROR ) { return errnum; } #endif // RTCW_XX #if defined RTCW_MP // errnum = BotSetupMoveAI(); //be_ai_move.c // if (errnum != BLERR_NOERROR) return errnum; #endif // RTCW_XX #if !defined RTCW_MP errnum = BotSetupMoveAI(); //be_ai_move.c if ( errnum != BLERR_NOERROR ) { return errnum; } #endif // RTCW_XX #if defined RTCW_ET globaldefines = NULL; #endif // RTCW_XX botlibsetup = qtrue; botlibglobals.botlibsetup = qtrue; return BLERR_NOERROR; } //end of the function Export_BotLibSetup
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== itemconfig_t *LoadItemConfig( char *filename ) { int max_iteminfo; token_t token; char path[MAX_PATH]; source_t *source; itemconfig_t *ic; iteminfo_t *ii; max_iteminfo = (int) LibVarValue( "max_iteminfo", "256" ); if ( max_iteminfo < 0 ) { botimport.Print( PRT_ERROR, "max_iteminfo = %d\n", max_iteminfo ); max_iteminfo = 128; LibVarSet( "max_iteminfo", "128" ); } strncpy( path, filename, MAX_PATH ); source = LoadSourceFile( path ); if ( !source ) { botimport.Print( PRT_ERROR, "counldn't load %s\n", path ); return NULL; } //end if //initialize item config ic = (itemconfig_t *) GetClearedHunkMemory( sizeof( itemconfig_t ) + max_iteminfo * sizeof( iteminfo_t ) ); ic->iteminfo = ( iteminfo_t * )( (char *) ic + sizeof( itemconfig_t ) ); ic->numiteminfo = 0; //parse the item config file while ( PC_ReadToken( source, &token ) ) { if ( !strcmp( token.string, "iteminfo" ) ) { if ( ic->numiteminfo >= max_iteminfo ) { SourceError( source, "more than %d item info defined\n", max_iteminfo ); FreeMemory( ic ); FreeSource( source ); return NULL; } //end if ii = &ic->iteminfo[ic->numiteminfo]; memset( ii, 0, sizeof( iteminfo_t ) ); if ( !PC_ExpectTokenType( source, TT_STRING, 0, &token ) ) { FreeMemory( ic ); FreeMemory( source ); return NULL; } //end if StripDoubleQuotes( token.string ); strncpy( ii->classname, token.string, sizeof( ii->classname ) - 1 ); if ( !ReadStructure( source, &iteminfo_struct, (char *) ii ) ) { FreeMemory( ic ); FreeSource( source ); return NULL; } //end if ii->number = ic->numiteminfo; ic->numiteminfo++; } //end if else { SourceError( source, "unknown definition %s\n", token.string ); FreeMemory( ic ); FreeSource( source ); return NULL; } //end else } //end while FreeSource( source ); // if ( !ic->numiteminfo ) { botimport.Print( PRT_WARNING, "no item info loaded\n" ); } botimport.Print( PRT_MESSAGE, "loaded %s\n", path ); return ic; } //end of the function LoadItemConfig