summaryrefslogtreecommitdiffstats
path: root/includes/mapoftheday.php
blob: 4f4032ab756598aeb81bbfa9f0347e68eee57fec (plain)
1
<?php

include_once('maps.php');
include_once('db.inc.php');

/**
 * Returns the Map Of The Day with the given type (index)
 */
function mapOfTheDay($type = 1) {
	ignore_user_abort(true);

	if ($type <= 8)
		$expire = 2;
	if ($type <= 4)
		$expire = 1;

	$sql = "
SELECT 
	maps.ID, 
	maps.code
FROM `mapOfTheDay`, `maps`
WHERE `mapType` = $type AND
	DATEDIFF(CURDATE(), mapOfTheDay.mapDate) < $expire AND
	mapID = maps.ID
	";
	$result = mysql_query($sql);
	//No map for today?
	if (mysql_num_rows($result) != 0) {
			$r['code'] = mysql_result($result, 0, 'code');
		$r['map'] = GenerateMapByCode($r['code']);
		$r['id'] = mysql_result($result, 0, 'ID');
		return $r;
	}
	return generateNewMapOfTheDay($type, $sql);
}

/**
 * Generates a new map of the day.  DO NOT CALL OUTSIDE OF mapoftheday.php
 */
function generateNewMapOfTheDay($type, $sql)
{
	// If you want to modify the maps created! This is the line
	//GenerateMap($rows, $cols, $rockchance, $numBlocks = -1, $cp = -1, $tp = -1) {
	switch ($type) {
		case 1:  //Easy
			$map = GenerateMap(13, 7, 12, rand(7, 10), rand(0, 1), 0);
			break;

		case 2:  //Normal
			$map = GenerateMap(15, 9, 7, rand(11, 13), rand(1, 3) + rand(0, 1), 0);
			break;

		case 3:  //Hard
			$map = GenerateMap(19, 9, rand(7, 9), rand(14, 16), rand(2, 5), rand(1, 2));
			break;

		case 4:  //Full random map
			$map = getRandomSpecialMap();
			break;

		case 5:
			// TEST MAP...
			$ultraComplex[] = "soooooooooooooooooooooooooooor";
			$ultraComplex[] = "ro??????????????????????????of";
			$ultraComplex[] = "so??????????????????????????or";
			$ultraComplex[] = "ro??????????????????????????of";
			$ultraComplex[] = "so??????????????????????????or";
			$ultraComplex[] = "ro??????????????????????????of";
			$ultraComplex[] = "so??????????????????????????or";
			$ultraComplex[] = "ro??????????????????????????of";
			$ultraComplex[] = "so??????????????????????????or";
			$ultraComplex[] = "ro??????????????????????????of";
			$ultraComplex[] = "so??????????????????????????or";
			$ultraComplex[] = "roooooooooooooooooooooooooooof";

			$ultraComplex = insertPoint($ultraComplex, 'abcde');
			$ultraComplex = insertPoint($ultraComplex, 'tumngh');
			$ultraComplex = insertPoint($ultraComplex, 'ppppppppppp');

			$myparams['checkpoints'] = 5;
			$myparams['teleports'] = 3;
			$myparams['rockchance'] = 9;
			$myparams['walls'] = 38;
			$myparams['name'] = 'Ultra Complex';
			$map = GenerateShapedMap($ultraComplex, $myparams);

			break;

		default:
			$map = GenerateMap(rand(13, 18), rand(10, 14), rand(6, 9));
			break;
	}

	$lock = acquireMotdLock();
	try
	{
		//Double check... $sql is already set
		$result = mysql_query($sql);
		//Are you SURE there's no map?
		if (mysql_num_rows($result) != 0)
		{
			releaseMotdLock($lock);
			return mapOfTheDay($type);
		}

		$code = GenerateMapCode($map);
		$sql = "INSERT INTO `maps` (`code`)
				VALUES ('$code')";

		$result = mysql_query($sql);
		if (!$result)
		{
			releaseMotdLock($lock);
			die("Error on inserting map");
		}
		$mapID = mysql_insert_id();
		$r['code'] = $code;
		$r['map'] = $map;
		$r['id'] = $mapID;

		$sql = "INSERT INTO `mapOfTheDay` (`mapID`, `mapType`, `mapDate`)
				VALUES ('$mapID', '$type', CURDATE()) ";
		$result = mysql_query($sql);
		if (!$result)
		{
			releaseMotdLock($lock);
			die("Error on insert into mapOfTheDay");
		}
	} catch (Exception $exc) { /* Ignore... :| */ }

	releaseMotdLock($lock);

	// ---------- Track statistics for 'yesterdays' map.
	trackMOTDstats($type);

	return $r;
}

/**
 * The file locked in order to create serialize map-creations, since our DB doesn't support transactions...
 */
define('FILE_MOTD_LOCK', './motdLockFile');

/**
 * Obtains the mutex used for creating the Map Of The Day, so that race-conditions cannot occur (like two threads
 * creating and inserting the maps into the database at the same time, which has happened
 */
function acquireMotdLock()
{
	$fileHandle = fopen(FILE_MOTD_LOCK, 'a+');
	flock($fileHandle, LOCK_EX);
	return $fileHandle;
}

/**
 * Releases the lock acquired from acquireMotdLock
 */
function releaseMotdLock($fileHandle)
{
	if($fileHandle)
		flock($fileHandle, LOCK_UN);
}

//Select from yesterday
function getYesterdaysMap() {
	$sql = "
	select `ID`, `code` from `maps`
	WHERE ( 
		DAY(dateCreated) = DAY(NOW()) - 1 
		AND 
		MONTH(dateCreated) = MONTH(NOW()) 
		AND
		YEAR(dateCreated) = YEAR(NOW())
	)
	";
	$result = mysql_query($sql);
	//No map for today?
	if (mysql_num_rows($result) == 0) {
		return -1;
	}
	$r['code'] = mysql_result($result, 0, 'code');
	$r['id'] = mysql_result($result, 0, 'ID');
	return $r;
}

function getRandomSpecialMap() {

	//This can be used to add additional weight to certain maps that we like.
	$random = weight(0, 1, 2, 3, 4, 5, 6, 7, 8);

	$shape = array();
	$params = array();

	switch ($random) {

		//=====================================
		case 0:
			//Thirty
			$map = GenerateMap(
					18, 14, 20, //width, height, rocks
					weight(30), //Walls
					weight(1), //Checkpoints
					weight(1), //Teleports
					'Thirty'
			);
			break;
		//=====================================
		case 1:
			//Simple
			$map = GenerateMap(
					18, 9, 7, //width, height, rocks
					weight(15, 16, 17), //Walls
					weight(0), //Checkpoints
					weight(0), //Teleports
					'Finite'
			);
			break;
		//=====================================
		case 2:
			//ABC's
			$map = GenerateMap(
					19, 11, 12, //width, height, rocks
					weight(20, 21, 22, 22, 23), //Walls
					weight(3), //Checkpoints
					weight(0), //Teleports
					"ABC's "
			);
			break;
		//=====================================
		case 3:
			//Tele Madness
			$map = GenerateMap(
					17, 12, 10, //width, height, rocks
					weight(17, 18), //Walls
					weight(1), //Checkpoints
					weight(5), //Teleports
					'Teleport Madness'
			);
			break;
		//=====================================
		case 4: //Thursday
			//Rocky Maze
			$map = GenerateMap(
					19, 15, 5, //width, height, rocks
					weight(16, 17, 18), //Walls
					weight(1, 2, 2, 2, 3, 3), //Checkpoints
					weight(0), //Teleports
					'Rocky Maze'
			);
			break;
		//=====================================
		case 5: //Friday
			//Side to Side
			$map = GenerateMap(
					26, 6, 12, //width, height, rocks
					weight(17, 18, 19), //Walls
					weight(2, 2, 2, 3, 3), //Checkpoints
					weight(3, 3, 3, 4), //Teleports
					'Side to Side'
			);
			break;

		//=====================================
		case 6:
			//Ultimate's Random map:
			//Create shape
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			$shape[] = "??????????????????";
			//Insert points
			$shape = insertPoint($shape, "sfabcr", $target = '?');
			$shape = insertPoint($shape, weight("tu", "d", "tu", "", ""), $target = '?');
			//Set params
			$params['rockchance'] = 10;
			$params['walls'] = weight(21, 20, 22, 20, 21);
			$params['name'] = 'Ultimate Random';
			//Put it all together.
			$map = GenerateShapedMap($shape, $params);

			break;
		//=====================================
		//=====================================
		case 7:
			//Dual map
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "s???????????????????f";
			$dualmapa[] = "oqqqqqqqqqqqqqqqqqqqo";
			$dualmapb[] = "s???????????????????f";
			$dualmapb[] = "s???????????????????f";
			$dualmapb[] = "s???????????????????f";
			$dualmapb[] = "s???????????????????f";
			$dualmapb[] = "s???????????????????f";
			$dualmapb[] = "s???????????????????f";

			$dualmapa = insertPoint($dualmapa, 'abc');
			$dualmapb = insertPoint($dualmapb, 'abc');
			$dualmap = array_merge($dualmapa, $dualmapb);
			$dualmap = insertPoint($dualmap, 'tu');

			$myparams['checkpoints'] = 3;
			$myparams['teleports'] = 1;
			$myparams['rockchance'] = 9;
			$myparams['walls'] = weight(20, 20, 21, 21, 22, 23);
			$myparams['name'] = 'Seeing Double';
			$map = GenerateShapedMap($dualmap, $myparams);
			break;
		//=====================================
		//=====================================
		case 8:
			//Centralized
			$myshape[] = "ooooooooooooooooooo";
			$myshape[] = "o?????????????????o";
			$myshape[] = "o?????????????????o";
			$myshape[] = "o?????????????????o";
			$myshape[] = "o???????fos???????o";
			$myshape[] = "o?????????????????o";
			$myshape[] = "o?????????????????o";
			$myshape[] = "o?????????????????o";
			$myshape[] = "ooooooooooooooooooo";

			$myshape = insertPoint($myshape, "abc", $target = '?');
			$myshape = insertPoint($myshape, weight("tu", "d", "tud", ""), $target = '?');
			$myparams['rockchance'] = 7;
			$myparams['walls'] = weight(17, 18, 19, 18, 17);
			$myparams['name'] = 'Centralized';
			$map = GenerateShapedMap($myshape, $myparams);
			break;
		//=====================================
	}
	return $map;
}
?>