var GameLog = [];
var GameLogChapter = 0;
var GameLogActor = 1;
var GameLogEvent = 2;
var GameLogTimer = 3;

// Log a specific event that happened in the game to be consulted by other scripts afterward
function GameLogSpecificAdd(ChapterToLog, ActorToLog, EventToLog) {

	// If no actor is specified, we imply the player
	if (ActorToLog == "") ActorToLog = "Player";

	// Do not log the same event twice
	for (var L = 0; L < GameLog.length; L++)
		if ((ChapterToLog == GameLog[L][GameLogChapter]) && (ActorToLog == GameLog[L][GameLogActor]) && (EventToLog == GameLog[L][GameLogEvent]))
			return;

	// Log the event
	GameLog[GameLog.length] = [ChapterToLog, ActorToLog, EventToLog, 0];

}

// Log a specific event that happened in the game with a timer to be used in the game later
function GameLogSpecificAddTimer(ChapterToLog, ActorToLog, EventToLog, TimerToLog) {

	// If no actor is specified, we imply the player
	if (ActorToLog == "") ActorToLog = "Player";

	// Do not log the same event twice, replace the timer
	for (var L = 0; L < GameLog.length; L++)
		if ((ChapterToLog == GameLog[L][GameLogChapter]) && (ActorToLog == GameLog[L][GameLogActor]) && (EventToLog == GameLog[L][GameLogEvent])) {
			GameLog[L] = [ChapterToLog, ActorToLog, EventToLog, TimerToLog];
			return;
		}

	// Log the event with it's timer
	GameLog[GameLog.length] = [ChapterToLog, ActorToLog, EventToLog, TimerToLog];

}

// Flush a specific event from the log
function GameLogSpecificDelete(ChapterToDelete, ActorToDelete, EventToDelete) {
	for (var L = 0; L < GameLog.length; L++)
		if ((ChapterToDelete == GameLog[L][GameLogChapter]) && (ActorToDelete == GameLog[L][GameLogActor]) && (EventToDelete == GameLog[L][GameLogEvent]))
			GameLog.splice(L, 1);
}

// Log a specific event for the current chapter and actor, to be consulted by other scripts afterward
function GameLogAdd(EventToLog) {
	GameLogSpecificAdd(CurrentChapter, CurrentActor, EventToLog);
}

// Log a specific event that happened in the game with a timer to be used in the game later (negative timer means we flush the log)
function GameLogAddTimer(EventToLog, TimerToLog) {
	if (TimerToLog >= 0)
		GameLogSpecificAddTimer(CurrentChapter, CurrentActor, EventToLog, TimerToLog);
	else
		GameLogSpecificDelete(CurrentChapter, CurrentActor, EventToLog);
}

// Returns TRUE if the event happened based on the query parameters, none of them are mandatory, the timer must be still valid at game time, it acts an expiry date
function GameLogQuery(ChapterToQuery, ActorToQuery, EventToQuery) {

	// Scan the log based on the query parameters, returns TRUE if all parameters are a match
	for (var L = 0; L < GameLog.length; L++)
		if ((ChapterToQuery == "") || (ChapterToQuery == GameLog[L][GameLogChapter]))
			if ((ActorToQuery == "") || (ActorToQuery == GameLog[L][GameLogActor]))
				if ((EventToQuery == "") || (EventToQuery == GameLog[L][GameLogEvent]))
					if ((GameLog[L][GameLogTimer] == 0) || (CurrentTime < GameLog[L][GameLogTimer]))
						return true;

	// Since the queried event wasn't found, we return FALSE
	return false;

}