/* ====================== ReadBehaviorTree Load a behavior tree of the given name from a file ====================== */ AIBehaviorTree_t *ReadBehaviorTree( const char *name, AITreeList_t *list ) { int i; char treefilename[ MAX_QPATH ]; int handle; pc_token_list *tokenlist; AIBehaviorTree_t *tree; pc_token_list *current; AIGenericNode_t *node; currentList = list; // check if this behavior tree has already been loaded for ( i = 0; i < list->numTrees; i++ ) { AIBehaviorTree_t *tree = list->trees[ i ]; if ( !Q_stricmp( tree->name, name ) ) { return tree; } } // add preprocessor defines for use in the behavior tree // add upgrades D( UP_LIGHTARMOUR ); D( UP_MEDIUMARMOUR ); D( UP_BATTLESUIT ); D( UP_RADAR ); D( UP_JETPACK ); D( UP_GRENADE ); D( UP_MEDKIT ); // add weapons D( WP_MACHINEGUN ); D( WP_PAIN_SAW ); D( WP_SHOTGUN ); D( WP_LAS_GUN ); D( WP_MASS_DRIVER ); D( WP_CHAINGUN ); D( WP_FLAMER ); D( WP_PULSE_RIFLE ); D( WP_LUCIFER_CANNON ); D( WP_HBUILD ); // add teams D( TEAM_ALIENS ); D( TEAM_HUMANS ); D( TEAM_NONE ); // add AIEntitys D( E_NONE ); D( E_A_SPAWN ); D( E_A_OVERMIND ); D( E_A_BARRICADE ); D( E_A_ACIDTUBE ); D( E_A_TRAPPER ); D( E_A_BOOSTER ); D( E_A_HIVE ); D( E_A_LEECH ); D( E_H_SPAWN ); D( E_H_MGTURRET ); D( E_H_ROCKETPOD ); D( E_H_ARMOURY ); D( E_H_MEDISTAT ); D( E_H_DRILL ); D( E_H_REACTOR ); D( E_H_REPEATER ); D( E_GOAL ); D( E_ENEMY ); D( E_DAMAGEDBUILDING ); D( E_SELF ); // add player classes D( PCL_NONE ); D( PCL_ALIEN_BUILDER0 ); D( PCL_ALIEN_BUILDER0_UPG ); D( PCL_ALIEN_LEVEL0 ); D( PCL_ALIEN_LEVEL1 ); D( PCL_ALIEN_LEVEL2 ); D( PCL_ALIEN_LEVEL2_UPG ); D( PCL_ALIEN_LEVEL3 ); D( PCL_ALIEN_LEVEL3_UPG ); D( PCL_ALIEN_LEVEL4 ); D( PCL_HUMAN_NAKED ); D( PCL_HUMAN_LIGHT ); D( PCL_HUMAN_MEDIUM ); D( PCL_HUMAN_BSUIT ); D( MOVE_FORWARD ); D( MOVE_BACKWARD ); D( MOVE_RIGHT ); D( MOVE_LEFT ); D2( ET_BUILDABLE, Util::ordinal(entityType_t::ET_BUILDABLE) ); // node return status D( STATUS_RUNNING ); D( STATUS_SUCCESS ); D( STATUS_FAILURE ); D( SAY_ALL ); D( SAY_TEAM ); D( SAY_AREA ); D( SAY_AREA_TEAM ); Q_strncpyz( treefilename, va( "bots/%s.bt", name ), sizeof( treefilename ) ); handle = trap_Parse_LoadSource( treefilename ); if ( !handle ) { Log::Warn( "Cannot load behavior tree %s: File not found", treefilename ); return nullptr; } tokenlist = CreateTokenList( handle ); trap_Parse_FreeSource( handle ); tree = ( AIBehaviorTree_t * ) BG_Alloc( sizeof( AIBehaviorTree_t ) ); Q_strncpyz( tree->name, name, sizeof( tree->name ) ); tree->run = BotBehaviorNode; tree->type = BEHAVIOR_NODE; AddTreeToList( list, tree ); current = tokenlist; node = ReadNode( ¤t ); if ( node ) { tree->root = node; } else { RemoveTreeFromList( list, tree ); tree = nullptr; } FreeTokenList( tokenlist ); return tree; }
void CG_BuildableStatusParse( const char *filename, buildStat_t *bs ) { pc_token_t token; int handle; const char *s; int i; float f; vec4_t c; handle = trap_Parse_LoadSource( filename ); if( !handle ) return; while( 1 ) { if( !trap_Parse_ReadToken( handle, &token ) ) break; if( !Q_stricmp( token.string, "frameShader" ) ) { if( PC_String_Parse( handle, &s ) ) bs->frameShader = trap_R_RegisterShader( s ); continue; } else if( !Q_stricmp( token.string, "overlayShader" ) ) { if( PC_String_Parse( handle, &s ) ) bs->overlayShader = trap_R_RegisterShader( s ); continue; } else if( !Q_stricmp( token.string, "noPowerShader" ) ) { if( PC_String_Parse( handle, &s ) ) bs->noPowerShader = trap_R_RegisterShader( s ); continue; } else if( !Q_stricmp( token.string, "markedShader" ) ) { if( PC_String_Parse( handle, &s ) ) bs->markedShader = trap_R_RegisterShader( s ); continue; } else if( !Q_stricmp( token.string, "healthSevereColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->healthSevereColor ); continue; } else if( !Q_stricmp( token.string, "healthHighColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->healthHighColor ); continue; } else if( !Q_stricmp( token.string, "healthElevatedColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->healthElevatedColor ); continue; } else if( !Q_stricmp( token.string, "healthGuardedColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->healthGuardedColor ); continue; } else if( !Q_stricmp( token.string, "healthLowColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->healthLowColor ); continue; } else if( !Q_stricmp( token.string, "foreColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->foreColor ); continue; } else if( !Q_stricmp( token.string, "backColor" ) ) { if( PC_Color_Parse( handle, &c ) ) Vector4Copy( c, bs->backColor ); continue; } else if( !Q_stricmp( token.string, "frameHeight" ) ) { if( PC_Int_Parse( handle, &i ) ) bs->frameHeight = i; continue; } else if( !Q_stricmp( token.string, "frameWidth" ) ) { if( PC_Int_Parse( handle, &i ) ) bs->frameWidth = i; continue; } else if( !Q_stricmp( token.string, "healthPadding" ) ) { if( PC_Int_Parse( handle, &i ) ) bs->healthPadding = i; continue; } else if( !Q_stricmp( token.string, "overlayHeight" ) ) { if( PC_Int_Parse( handle, &i ) ) bs->overlayHeight = i; continue; } else if( !Q_stricmp( token.string, "overlayWidth" ) ) { if( PC_Int_Parse( handle, &i ) ) bs->overlayWidth = i; continue; } else if( !Q_stricmp( token.string, "verticalMargin" ) ) { if( PC_Float_Parse( handle, &f ) ) bs->verticalMargin = f; continue; } else if( !Q_stricmp( token.string, "horizontalMargin" ) ) { if( PC_Float_Parse( handle, &f ) ) bs->horizontalMargin = f; continue; } else { Com_Printf("CG_BuildableStatusParse: unknown token %s in %s\n", token.string, filename ); bs->loaded = qfalse; return; } } bs->loaded = qtrue; }
/* ============ BG_VoiceParse ============ */ static voiceCmd_t *BG_VoiceParse( const char *name ) { voiceCmd_t *voiceCmds = NULL; voiceCmd_t *top = NULL; pc_token_t token; qboolean parsingCmd = qfalse; int handle; handle = trap_Parse_LoadSource( va( "voice/%s.voice", name ) ); if ( !handle ) { return NULL; } while ( trap_Parse_ReadToken( handle, &token ) ) { if ( parsingCmd ) { if ( token.string[ 0 ] == '{' ) { voiceCmds->tracks = BG_VoiceParseCommand( handle ); parsingCmd = qfalse; continue; } else { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Error( ERR_FATAL, "BG_VoiceParse(): " "parse error on line %d of %s", line, filename ); } } if ( strlen( token.string ) >= MAX_VOICE_CMD_LEN ) { int line; char filename[ MAX_QPATH ]; trap_Parse_SourceFileAndLine( handle, filename, &line ); Com_Error( ERR_FATAL, "BG_VoiceParse(): " "command \"%s\" exceeds MAX_VOICE_CMD_LEN (%d) on line %d of %s", token.string, MAX_VOICE_CMD_LEN, line, filename ); } if ( top == NULL ) { voiceCmds = BG_Alloc( sizeof( voiceCmd_t ) ); top = voiceCmds; } else { voiceCmds->next = BG_Alloc( sizeof( voiceCmd_t ) ); voiceCmds = voiceCmds->next; } Q_strncpyz( voiceCmds->cmd, token.string, sizeof( voiceCmds->cmd ) ); voiceCmds->next = NULL; parsingCmd = qtrue; } trap_Parse_FreeSource( handle ); return top; }