<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */

/**
 * Rounds Points plugin.
 * Allows setting common and custom Rounds points systems.
 * Created by Xymph
 *
 * Dependencies: used by chat.admin.php
 */

Aseco::registerEvent('onSync', 'init_rpoints');

Aseco::addChatCommand('rpoints', 'Shows current Rounds points system');

global $rounds_points;
$rounds_points = array();

// define common points systems:

// http://www.formula1.com/inside_f1/rules_and_regulations/sporting_regulations/6833/
$rounds_points['f1old']      = array('Formula 1 GP Old',
                                     array(10,8,6,5,4,3,2,1));
// http://www.formula1.com/inside_f1/rules_and_regulations/sporting_regulations/8681/
$rounds_points['f1new']      = array('Formula 1 GP New',
                                     array(25,18,15,12,10,8,6,4,2,1));
// http://www.motogp.com/en/about+MotoGP/key+rules
$rounds_points['motogp']     = array('MotoGP',
                                     array(25,20,16,13,11,10,9,8,7,6,5,4,3,2,1));
// MotoGP + 5 points
$rounds_points['motogp5']    = array('MotoGP + 5',
                                     array(30,25,21,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1));
// http://www.et-leagues.com/fet1/rules.php
$rounds_points['fet1']       = array('Formula ET Season 1',
                                     array(12,10,9,8,7,6,5,4,4,3,3,3,2,2,2,1));
// http://www.et-leagues.com/fet2/rules.php (fixed: #17-19 = 2, not #17-21)
$rounds_points['fet2']       = array('Formula ET Season 2',
                                     array(15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,1));
// http://www.et-leagues.com/fet3/rules.php
$rounds_points['fet3']       = array('Formula ET Season 3',
                                     array(15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,2,1));
// http://www.champcarworldseries.com/News/Article.asp?ID=7499
$rounds_points['champcar']   = array('Champ Car World Series',
                                     array(31,27,25,23,21,19,17,15,13,11,10,9,8,7,6,5,4,3,2,1));
// http://www.eurosuperstars.com/eng/regolamenti.asp
$rounds_points['superstars'] = array('Superstars',
                                     array(20,15,12,10,8,6,4,3,2,1));
$rounds_points['simple5']    = array('Simple 5',
                                     array(5,4,3,2,1));
$rounds_points['simple10']   = array('Simple 10',
                                     array(10,9,8,7,6,5,4,3,2,1));

// any players finishing beyond the last points entry get the same number of points (typically 1) as that last entry


function init_rpoints($aseco) {
	global $rounds_points;

	// set default rounds points system
	$system = $aseco->settings['default_rpoints'];
	if (preg_match('/^\d+,[\d,]*\d+$/', $system)) {
		// set new custom points as array of ints
		$points = array_map('intval', explode(',', $system));
		$rtn = $aseco->client->query('SetRoundCustomPoints', $points, false);
		// log console message
		if (!$rtn) {
			$aseco->console('Invalid rounds points: {1}  Error: {2}', $system, $aseco->client->getErrorMessage());
		} else {
			$aseco->console('Initialize default rounds points: {1}', $system);
		}

	} elseif (array_key_exists($system, $rounds_points)) {
		// set new custom points
		$rtn = $aseco->client->query('SetRoundCustomPoints', $rounds_points[$system][1], false);
		// log console message
		if (!$rtn) {
			$aseco->console('Invalid rounds points: {1}  Error: {2}', $system, $aseco->client->getErrorMessage());
		} else {
			$aseco->console('Initialize default rounds points: {1} - {2}',
			                $rounds_points[$system][0],
			                implode(',', $rounds_points[$system][1]));
		}

	} elseif ($system == '') {
		// disable custom points
		$rtn = $aseco->client->query('SetRoundCustomPoints', array(), false);

	} else {
		$aseco->console('Unknown rounds points: {1}', $system);
	}
}  // init_rpoints

function admin_rpoints($aseco, $admin, $logtitle, $chattitle, $command) {
	global $rounds_points;

	$login = $admin->login;
	$command = explode(' ', preg_replace('/ +/', ' ', $command));
	$system = strtolower($command[0]);

	if ($command[0] == 'help') {
		$header = '{#black}/admin rpoints$g sets custom Rounds points:';
		$help = array();
		$help[] = array('...', '{#black}help',
		                'Displays this help information');
		$help[] = array('...', '{#black}list',
		                'Displays available points systems');
		$help[] = array('...', '{#black}show',
		                'Shows current points system');
		$help[] = array('...', '{#black}xxx',
		                'Sets custom points system labelled xxx');
		$help[] = array('...', '{#black}X,Y,...,Z',
		                'Sets custom points system with specified values;');
		$help[] = array('', '',
		                'X,Y,...,Z must be decreasing integers and there');
		$help[] = array('', '',
		                'must be at least two values with no spaces');
		$help[] = array('...', '{#black}off',
		                'Disables custom points system');

		// display ManiaLink message
		display_manialink($login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $help, array(1.05, 0.05, 0.2, 0.8), 'OK');

	} elseif ($command[0] == 'list') {
		$head = 'Currently available Rounds points systems:';
		$list = array();
		$list[] = array('Label', '{#black}System', '{#black}Distribution');
		$lines = 0;
		$admin->msgs = array();
		$admin->msgs[0] = array(1, $head, array(1.3, 0.2, 0.4, 0.7), array('Icons128x32_1', 'RT_Rounds'));
		foreach ($rounds_points as $tag => $points) {
			$list[] = array('{#black}' . $tag, $points[0],
			                implode(',', $points[1]) . ',...');
			if (++$lines > 14) {
				$admin->msgs[] = $list;
				$lines = 0;
				$list = array();
				$list[] = array('Label', '{#black}System', '{#black}Distribution');
			}
		}
		if (!empty($list)) {
			$admin->msgs[] = $list;
		}
		// display ManiaLink message
		display_manialink_multi($admin);

	} elseif ($command[0] == 'show') {
		// get custom points
		$aseco->client->query('GetRoundCustomPoints');
		$points = $aseco->client->getResponse();

		// search for known points system
		$system = false;
		foreach ($rounds_points as $rpoints) {
			if ($points == $rpoints[1]) {
				$system = $rpoints[0];
				break;
			}
		}

		// check for results
		if (empty($points)) {
			$message = formatText($aseco->getChatMessage('NO_RPOINTS'), '{#admin}');
		} else {
			if ($system)
				$message = formatText($aseco->getChatMessage('RPOINTS_NAMED'),
				                      '{#admin}', $system, '{#admin}', implode(',', $points));
			else
				$message = formatText($aseco->getChatMessage('RPOINTS_NAMELESS'),
				                      '{#admin}', implode(',', $points));
		}
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);

	} elseif ($command[0] == 'off') {
		// disable custom points
		$rtn = $aseco->client->query('SetRoundCustomPoints', array(), false);

		// log console message
		$aseco->console('{1} [{2}] disabled custom points', $logtitle, $login);

		// show chat message
		$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} disables custom rounds points',
		                      $chattitle, $admin->nickname);
		$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));

	} elseif (preg_match('/^\d+,[\d,]*\d+$/', $command[0])) {
		// set new custom points as array of ints
		$points = array_map('intval', explode(',', $command[0]));
		$rtn = $aseco->client->query('SetRoundCustomPoints', $points, false);
		if (!$rtn) {
			$message = '{#server}> {#error}Invalid point distribution!  Error: {#highlite}$i ' . $aseco->client->getErrorMessage();
			$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
		} else {
			// log console message
			$aseco->console('{1} [{2}] set new custom points: {3}', $logtitle, $login, $command[0]);

			// show chat message
			$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} sets custom rounds points: {#highlite}{3},...',
			                      $chattitle, $admin->nickname,
			                      $command[0]);
			$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
		}

	} elseif (array_key_exists($system, $rounds_points)) {
		// set new custom points
		$rtn = $aseco->client->query('SetRoundCustomPoints', $rounds_points[$system][1], false);
		if (!$rtn) {
			trigger_error('[' . $aseco->client->getErrorCode() . '] SetRoundCustomPoints - ' . $aseco->client->getErrorMessage(), E_USER_WARNING);
		} else {
			// log console message
			$aseco->console('{1} [{2}] set new custom points [{3}]', $logtitle, $login, strtoupper($command[0]));

			// show chat message
			$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} sets rounds points to {#highlite}{3}{#admin}: {#highlite}{4},...',
			                      $chattitle, $admin->nickname,
			                      $rounds_points[$system][0],
			                      implode(',', $rounds_points[$system][1]));
			$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
		}

	} else {
		$message = '{#server}> {#error}Unknown points system {#highlite}$i ' . strtoupper($command[0]) . '$z$s {#error}!';
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	}
}  // admin_rpoints

function chat_rpoints($aseco, $command) {
	global $rounds_points;

	$login = $command['author']->login;

	if ($aseco->server->getGame() == 'TMF') {
		// get custom points
		$aseco->client->query('GetRoundCustomPoints');
		$points = $aseco->client->getResponse();

		// search for known points system
		$system = false;
		foreach ($rounds_points as $rpoints) {
			if ($points == $rpoints[1]) {
				$system = $rpoints[0];
				break;
			}
		}

		// check for results
		if (empty($points)) {
			$message = formatText($aseco->getChatMessage('NO_RPOINTS'), '');
		} else {
			if ($system)
				$message = formatText($aseco->getChatMessage('RPOINTS_NAMED'),
				                      '', $system, '', implode(',', $points));
			else
				$message = formatText($aseco->getChatMessage('RPOINTS_NAMELESS'),
				                      '', implode(',', $points));
		}
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	} else {
		$message = $aseco->getChatMessage('FOREVER_ONLY');
		$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
	}
}  // chat_rpoints
?>