Files @ r11049:6eb2c87ed64a
Branch filter:

Location: cpp/openttd-patchpack/source/src/ai/api/ai_log.cpp

peter1138
(svn r15389) -Feature: Add ability to select which base graphics set is used from the Game Options window. The change takes effect when the window is closed. This option can only be used from the intro menu, as reloading graphics during a game may cause issues.
/* $Id$ */

/** @file ai_log.cpp Implementation of AILog. */

#include "ai_log.hpp"
#include "../../core/alloc_func.hpp"
#include "../../company_func.h"
#include "../../debug.h"
#include "../../window_func.h"

/* static */ void AILog::Info(const char *message)
{
	AILog::Log(LOG_INFO, message);
}

/* static */ void AILog::Warning(const char *message)
{
	AILog::Log(LOG_WARNING, message);
}

/* static */ void AILog::Error(const char *message)
{
	AILog::Log(LOG_ERROR, message);
}

/* static */ void AILog::Log(AILog::AILogType level, const char *message)
{
	if (AIObject::GetLogPointer() == NULL) {
		AIObject::GetLogPointer() = new LogData();
		LogData *log = (LogData *)AIObject::GetLogPointer();

		log->lines = CallocT<char *>(80);
		log->type = CallocT<AILog::AILogType>(80);
		log->count = 80;
		log->pos = log->count;
		log->used = 0;
	}
	LogData *log = (LogData *)AIObject::GetLogPointer();

	/* Go to the next log-line */
	log->pos = (log->pos + 1) % log->count;

	if (log->used != log->count) log->used++;

	/* Free last message, and write new message */
	free(log->lines[log->pos]);
	log->lines[log->pos] = strdup(message);
	log->type[log->pos] = level;

	/* Cut string after first \n */
	char *p;
	while ((p = strchr(log->lines[log->pos], '\n')) != NULL) {
		*p = '\0';
		break;
	}

	char logc;

	switch (level) {
		case LOG_SQ_ERROR: logc = 'S'; break;
		case LOG_ERROR:    logc = 'E'; break;
		case LOG_SQ_INFO:  logc = 'P'; break;
		case LOG_WARNING:  logc = 'W'; break;
		case LOG_INFO:     logc = 'I'; break;
		default:           logc = '?'; break;
	}

	/* Also still print to debug window */
	DEBUG(ai, level, "[%d] [%c] %s", (uint)_current_company, logc, log->lines[log->pos]);
	InvalidateWindowData(WC_AI_DEBUG, 0, _current_company);
}

/* static */ void AILog::FreeLogPointer()
{
	LogData *log = (LogData *)AIObject::GetLogPointer();

	for (int i = 0; i < log->count; i++) {
		free(log->lines[i]);
	}

	free(log->lines);
	free(log->type);
	delete log;
}