Exemplo n.º 1
0
/*
=================
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 );
}
Exemplo n.º 2
0
/*
=============
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;
}