/* ================= Bot_ScriptLog_Entry ================= */ void Bot_ScriptLog_Entry( bot_state_t *bs, qboolean showDetails, char *preText, char *fmt, ... ) { va_list ap; char text[1024], *pStr, *token; fileHandle_t f; int i; // if (!(f = bs->script.logFile)) return; // // timestamp // get the time/date Q_strncpyz( text, va("(%i) ", level.time), sizeof(text) ); trap_FS_Write( text, strlen(text), f ); // i = 40; // padding for indentation // pretext if (preText) { trap_FS_Write( preText, strlen(preText), f ); i -= strlen(preText); if (i < 0) i = 0; } // indentation while (i--) trap_FS_Write( " ", 1, f ); // if (showDetails && (Bot_Script_GetCurrentLine( bs ) > -1)) { // show the current script line and text Q_strncpyz( text, va("(line %i:", Bot_Script_GetCurrentLine( bs )), sizeof(text) ); trap_FS_Write( text, strlen(text), f ); // text pStr = bs->script.status.currentItem->text; while ((token = COM_ParseExt( &pStr, qfalse )) && token[0]) { trap_FS_Write( " ", 1, f ); trap_FS_Write( token, strlen(token), f ); } trap_FS_Write( ") ", 2, f ); } // if (fmt) { va_start(ap, fmt); Q_vsnprintf( text, sizeof(text), fmt, ap ); if (strlen(text) >= sizeof(text)) { //G_Error( "Bot_ScriptLog_Entry: text exceeded buffer size" ); // just cut it short text[sizeof(text)-1] = '\0'; } va_end(ap); // trap_FS_Write( text, strlen(text), f ); } trap_FS_Write( "\r\n", 2, f ); }
/* ============= Bot_ScriptRun returns qtrue if the script completed ============= */ qboolean Bot_ScriptRun(bot_state_t * bs, qboolean force) { bot_script_stack_t *stack; bot_script_stack_item_t *item; int oldScriptId; if(!bs->script.data) { return qtrue; } // turn off flags that get set each frame while they are active bs->script.frameFlags = 0; if(bs->script.status.eventIndex < 0) { return qtrue; } if(!bs->script.data->events) { bs->script.status.eventIndex = -1; return qtrue; } if(!force && (bs->script.pauseTime >= level.time)) { return qtrue; } stack = &bs->script.data->events[bs->script.status.eventIndex].stack; if(!stack->numItems) { bs->script.status.eventIndex = -1; return qtrue; } while(bs->script.status.stackHead < stack->numItems) { item = &bs->script.data->items[stack->startIndex + bs->script.status.stackHead]; bs->script.status.currentItem = item; // if(bs->script.flags & BSFL_FIRST_CALL) { Bot_ScriptLog_Entry(bs, qtrue, Bot_LineText(bs->script.data->events[bs->script.status.eventIndex].text), ""); } // oldScriptId = bs->script.status.id; // // Mad Doc - TDf if(G_IsSinglePlayerGame()) { if(bot_debug.integer) { trap_SendServerCommand(0, va("botdebugprint %i \"Line: %i %s %s\"", bs->client, Bot_Script_GetCurrentLine(bs), item->action->actionString, item->params)); } } if(!item->action->actionFunc(bs, item->params)) { bs->script.flags &= ~BSFL_FIRST_CALL; return qfalse; } // if our script changed, stop execution if(oldScriptId != bs->script.status.id) { return qfalse; } // move to the next action in the script bs->script.status.stackHead++; // record the time that this new item became active bs->script.status.stackChangeTime = level.time; // reset misc stuff bs->script.flags |= BSFL_FIRST_CALL; } Bot_ScriptLog_Entry(bs, qtrue, Bot_LineText(bs->script.data->events[bs->script.status.eventIndex].text), "** FINISHED **"); bs->script.status.eventIndex = -1; return qtrue; }