";
$r .= "";
}
$aAry = getAchievementsArray($aType);
$nextLevelRequired = $aAry[($aLevel + 1)][0];
$currentLevelRequired = $aAry[($aLevel)][0];
if ($currency) {
$currentLevelRequired = number_format($currentLevelRequired);
$r .= "You have $currentLevelRequired $currency
";
}
if ($nextLevelRequired >= 1) {
$nextLevelRequired = number_format($nextLevelRequired);
$r .= "Next level at $nextLevelRequired
";
}
// Item ID List
$aIDList[] = "'$aID'";
}
$r .= "
Go select unlocks now";
// ---------- Mark that we have notified the user
$aIDListStr = implode(',', $aIDList);
$sql = "UPDATE `achievements`
SET `notified` = 1
WHERE `ID` IN ($aIDListStr)";
mysql_query($sql);
return $r;
// ---------- Done!
}
//Returns true when an achievement is applied.
// Usage example: applyCareerAchievement($userID);
// !! DEPRECIATED
function applyCareerPathAchievements($userID) {
$sql = "SELECT
SUM(solutions.moves) as totalMoves
FROM `solutions`
WHERE userID = '$userID'";
$result = mysql_query($sql);
// --------- User hasn't played yet.
if (mysql_num_rows($result) != 1)
return false;
list($uTotalMoves) = mysql_fetch_row($result);
// ------- Select the highest level they've achieved.
$sql = "SELECT `level`
FROM `achievements`
WHERE `userID` = '$userID'
AND `type` = 1
ORDER BY `level` DESC
LIMIT 1";
$result = mysql_query($sql);
// --------- No achievements yet?
if (mysql_num_rows($result) == 1)
list($aLevel) = mysql_fetch_row($result);
else
$aLevel = 0;
$cp = getCareerPathArray();
//Is there a next level for this?
$aNextLevel = $aLevel + 1;
if (!isset($cp[$aNextLevel]))
return false;
list($required, $unlockType, $unlockValue, $unlockName) = $cp[$aNextLevel];
if ($uTotalMoves < $required)
return false;
$sql = "INSERT INTO `achievements`
(`userID`, `type`, `level`)
VALUES ('$userID', 1, '$aNextLevel')";
mysql_query($sql);
$aID = mysql_insert_id();
// ------- User gets unlock. (unlocks plural is possible here)
$sql = "INSERT INTO `unlocks`
(`userID`, `achievementID`, `type`, `subtype`, `name`, `value`)
VALUES ('$userID', '$aID', '$unlockType', NULL, '$unlockName', '$unlockValue')";
mysql_query($sql);
return true;
}
//Almost a duplicate of applyCareerPathAchievements
// !! DEPRECIATED
function applyCareerMazesAchievements($userID) {
$sql = "SELECT
COUNT(*) as totalSolutions
FROM `solutions`
WHERE userID = '$userID'";
$result = mysql_query($sql);
// --------- User hasn't played yet.
if (mysql_num_rows($result) != 1)
return false;
list($uTotalSolutions) = mysql_fetch_row($result);
// ------- Select the highest level they've achieved.
$sql = "SELECT `level`
FROM `achievements`
WHERE `userID` = '$userID'
AND `type` = 2
ORDER BY `level` DESC
LIMIT 1";
$result = mysql_query($sql);
// --------- No achievements yet?
if (mysql_num_rows($result) == 1)
list($aLevel) = mysql_fetch_row($result);
else
$aLevel = 0;
$cm = getCareerMazesArray();
//Is there a next level for this?
$aNextLevel = $aLevel + 1;
if (!isset($cm[$aNextLevel]))
return false;
list($required, $unlockType, $unlockValue, $unlockName) = $cm[$aNextLevel];
if ($uTotalSolutions < $required)
return false;
$sql = "INSERT INTO `achievements`
(`userID`, `type`, `level`)
VALUES ('$userID', 2, '$aNextLevel')";
mysql_query($sql);
$aID = mysql_insert_id();
// ------- User gets unlock. (unlocks plural is possible here)
$sql = "INSERT INTO `unlocks`
(`userID`, `achievementID`, `type`, `subtype`, `name`, `value`)
VALUES ('$userID', '$aID', '$unlockType', NULL, '$unlockName', '$unlockValue')";
mysql_query($sql);
return true;
}
//Challenges including the Tutorial.
function applyChallengeAchievements($userID, $challengeID, $mapID, $solution, $moves) {
if ($challengeID == '1') {
//echo 'challengeID'.$mapID;
//echo 'moves'.$moves;
if ($moves == 75 AND $mapID == 5) {
//echo 'true story';
// -------- Completed the tutorial!
//have they already completed he tutorial?
$sql = "SELECT `level`
FROM `achievements`
WHERE `userID` = '$userID'
AND `type` = 32
ORDER BY `level` DESC
LIMIT 1";
$result = mysql_query($sql);
if (mysql_num_rows($result) == 1)
return false;
// -------- This is the first time they've completed the tutorial!
$sql = "INSERT INTO `achievements`
(`userID`, `type`, `level`)
VALUES ('$userID', 32, '1')";
mysql_query($sql);
$aID = mysql_insert_id();
// ------- User gets unlock. (unlocks plural is possible here)
$sql = "INSERT INTO `unlocks`
(`userID`, `achievementID`, `type`, `subtype`, `name`, `value`)
VALUES ('$userID', '$aID', '1', 0, 'Blue', '#4444ff')";
mysql_query($sql);
return true;
}
}
}
function applyAchievements($userID, $aType) {
$amount = getAchievementCurrency($userID, $aType);
$aLevel = getAchievementLevel($userID, $aType);
$aArray = getAchievementsArray($aType);
//Is there a next level for this?
$aNextLevel = $aLevel + 1;
if (!isset($aArray[$aNextLevel]))
return false;
list($required, $unlockType, $unlockValue, $unlockName, $unlockSubtype) = $aArray[$aNextLevel];
if ($amount < $required)
return false;
$sql = "INSERT INTO `achievements`
(`userID`, `type`, `level`)
VALUES ('$userID', $aType, '$aNextLevel')";
mysql_query($sql);
$aID = mysql_insert_id();
// ------- User gets unlock. (!!unlocks plural is possible here)
$sql = "INSERT INTO `unlocks`
(`userID`, `achievementID`, `type`, `subtype`, `name`, `value`)
VALUES ('$userID', '$aID', '$unlockType', '$unlockSubtype', '$unlockName', '$unlockValue')";
mysql_query($sql);
return true;
}
function getAchievementCurrency($userID, $aType) {
// 1, Total Moves "Path Career" //Backdated
// 2, Total Solutions (Total maps played) "Mazes Career" //Backdated
// 3, Tie Top-Score on a map "Maze Mastery" //Tracked (no backdate)
// 4, Rank#1 Win Top-Score on a map "Wins" //Tracked
$r = 0;
$sql = '';
switch ($aType) {
case 1:
$sql = "SELECT
SUM(solutions.moves) as t
FROM `solutions`
WHERE userID = '$userID'";
break;
case 2:
$sql = "SELECT
COUNT(*) as t
FROM `solutions`
WHERE userID = '$userID'";
break;
case 3:
$sql = "SELECT
SUM(`value`) as t
FROM `statistics`
WHERE `userID` = '$userID'
AND `type` IN (1, 2, 3, 4)";
break;
case 4:
$sql = "SELECT
SUM(`value`) as t
FROM `statistics`
WHERE `userID` = '$userID'
AND `type` IN (32, 33, 34, 35)";
break;
}
if ($sql == '')
return false;
$result = mysql_query($sql);
if (mysql_num_rows($result) == 1)
list($r) = mysql_fetch_row($result);
return $r;
}
function getAchievementLevel($userID, $aType) {
// ------- Select the highest level they've achieved.
$r = 0;
$sql = "SELECT `level`
FROM `achievements`
WHERE `userID` = '$userID'
AND `type` = '$aType'
ORDER BY `level` DESC
LIMIT 1";
$result = mysql_query($sql);
if (mysql_num_rows($result) == 1)
list($r) = mysql_fetch_row($result);
return $r;
}
function getAchievementsArray($type) {
if ($type == 1)
return getCareerPathArray();
if ($type == 2)
return getCareerMazesArray();
if ($type == 3)
return getMazeMasteryArray();
if ($type == 4)
return getWinsArray();
//Tutorial
if ($type == 32) {
$r[1] = array(1, 1, '#4444ff', 'Blue');
return $r;
}
return array();
}
//TYPE 1
function getCareerPathArray() {
//$cp[0] = array(requiredmoves, type, 'value', 'name');
// Note that the description is followed by " wall color"
$cp[1] = array(100, 1, '#229922', 'Green');
$cp[2] = array(1000, 1, '#9922ff', 'Purple');
$cp[3] = array(5000, 2, 'CircleSmall_W.png', 'Light Small Circle', 0);
$cp[4] = array(10000, 2, 'DiamondSmall_B.png', 'Dark Small Diamond', 0);
$cp[5] = array(20000, 3, '#a9b1f6', 'Steel Blue');
$cp[6] = array(32000, 2, 'DiagonalCover_W.png', 'Light Diagonal Cover', 0);
$cp[7] = array(50000, 2, 'DiamondLargeDonut_B_I.png', 'Inverted Dark Annulated Diamond', 0);
$cp[8] = array(75000, 3, '#ffffaa', 'Yellow');
$cp[9] = array(100000, 3, '#ffbb77', 'Orange');
$cp[10] = array(130000, 2, 'OffsetStripesVertical_W.png', 'Light Vertical Stripes', 0);
$cp[11] = array(165000, 2, 'CircleSmall_B.png', 'Dark Small Circle', 0);
$cp[12] = array(200000, 3, '#ee77ff', 'Purple');
$cp[13] = array(250000, 1, '#ffff22', 'Yellow', 1);
$cp[14] = array(300000, 2, 'DiagonalCover_B_I.png', 'Inverted Dark Diagonal Cover', 0);
$cp[15] = array(350000, 1, '#333377', 'Navy Blue', 0);
$cp[16] = array(400000, 2, 'RacingStripes_W.png', 'Light Racing Stripes', 0);
return $cp;
}
//TYPE 2
function getCareerMazesArray() {
//$cp[0] = array(requiredmazes, type, 'value', 'name');
$cm[1] = array(5, 1, '#eeeeee', 'Silver', 1);
$cm[2] = array(15, 1, '#ff9922', 'Orange', 1);
$cm[3] = array(30, 2, 'DiamondLargeDonut_W.png', 'Light Annulated Diamond', 0);
$cm[4] = array(50, 1, '#aaaa22', 'Chartreuse');
$cm[5] = array(85, 2, 'CrossXL_W.png', 'Light Large Present', 0);
$cm[6] = array(150, 1, '#cc22aa', 'Magenta', 0);
$cm[7] = array(250, 1, '#ff3344', 'Red');
$cm[8] = array(375, 1, '#ffdd88', 'Gold', 1);
$cm[9] = array(550, 2, 'ConvexCover_W.png', 'Light Dome Cover', 0);
$cm[10] = array(750, 2, 'OffsetStripesVertical_B.png', 'Dark Vertical Stripes', 0);
$cm[11] = array(1000, 3, '#ff95b0', 'Pink');
$cm[12] = array(1400, 1, '#ff95b0', 'Pink', 1);
$cm[13] = array(2000, 2, 'StarsR_W.png', 'Bright Stars', 0);
$cm[14] = array(2750, 2, 'Stars1_B.png', 'Dark Single Star', 0);
$cm[15] = array(3500, 2, 'CircleSmall_B_I.png', 'Inverted Dark Small Circle', 0);
return $cm;
}
//TYPE 3
function getMazeMasteryArray() {
//$cp[0] = array(requiredmazestied, type, 'value', 'name');
$r[1] = array(1, 2, 'OffsetStripesDiagonal_W.png', 'Light Diagonal Stripes', 0);
$r[2] = array(5, 2, 'OffsetStripesVertical_B_I.png', 'Inverted Dark Vertical Stripes', 0);
$r[3] = array(15, 2, 'DiagonalCover_W_I.png', 'Inverted Light Diagonal Cover', 0);
$r[4] = array(30, 3, '#aafcbb', 'Green');
$r[5] = array(50, 2, 'DiamondLarge_W.png', 'Light Large Diamond', 0);
$r[6] = array(75, 2, 'CrossXL_B.png', 'Dark Large Present', 0);
$r[7] = array(100, 2, 'CircleLargeDonut_W.png', 'Light Annulated Circle', 0);
$r[8] = array(150, 2, 'CrossXL_W_I.png', 'Inverted Bright Large Present', 0);
return $r;
}
//TYPE 4
function getWinsArray() {
//$cp[0] = array(requiredmazewins, type, 'value', 'name');
$r[1] = array(1, 2, 'DiagonalCover_B.png', 'Light Diagnol Cover', 0);
$r[2] = array(5, 1, '#22aaaa', 'Teal');
$r[3] = array(15, 2, 'OffsetStripesDiagonal_B.png', 'Dark Diagonal Stripes', 0);
$r[4] = array(30, 2, 'DiamondLargeDonut_W_I.png', 'Inverted Light Annulated Diamond', 0);
$r[5] = array(50, 2, 'StarsR_B.png', 'Dark Stars', 0);
$r[6] = array(75, 2, 'CrossXL_B_I.png', 'Inverted Dark Large Present', 0);
$r[7] = array(75, 2, 'CircleSmall_W_I.png', 'Inverted Bright Small Circle', 0);
return $r;
}
//Used to track statistics on who wins or ties maps at the end of a day.
function trackMOTDstats($mapType) {
// Our rather massive query to get the data we need.
$sql = "SELECT
users.ID as userID,
SUM(solutions.moves) as Moves,
timediff(MAX(dateModified), maps.dateCreated) as Timetaken
FROM `maps`
JOIN `solutions`
ON maps.ID = solutions.mapID
JOIN `users`
ON solutions.userID = users.ID
JOIN `mapOfTheDay`
ON maps.ID = mapOfTheDay.mapID
WHERE
DATE_ADD(CURDATE(), INTERVAL -1 DAY) =
DATE_FORMAT(solutions.dateModified,'%Y-%m-%d')
AND DATE_ADD(CURDATE(), INTERVAL -1 DAY) =
DATE_FORMAT(maps.dateCreated,'%Y-%m-%d')
AND `mapType` = '$mapType'
GROUP BY solutions.userID
ORDER BY Moves DESC, MAX(dateModified) ASC
";
$mainResult = mysql_query($sql);
if ($mainResult) {
$first = true;
while (list($userID, $uMoves, $uTimeTaken) = mysql_fetch_row($mainResult)) {
//echo "$first : userID: $userID uMoves: $uMoves uTimeTaken: $uTimeTaken mapType: $mapType
";
do {
//If it's the rank #1 user, we need to repeat to also award him the tie stat.
$repeatThis = false;
$sType = $mapType;
if ($first) {
$bestMoves = $uMoves;
$sType = 31 + $mapType;
$repeatThis = true;
}
if ($uMoves == $bestMoves) {
$sql = "SELECT `ID` FROM `statistics`
WHERE `userID` = '$userID' AND `type` = '$sType'";
$result = mysql_query($sql);
if (mysql_num_rows($result) == 0) {
$sql = "INSERT INTO `statistics` (`userID`, `type`, `value`)
VALUES ('$userID', '$sType', 1)";
$result = mysql_query($sql);
if (!$result)
return false;
} else {
$sql = "UPDATE `statistics`
SET `value` = `value` + 1
WHERE `userID` = '$userID' AND `type` = '$sType'";
$result = mysql_query($sql);
if (!$result)
return false;
}
} else {
break 2;
}
$first = false;
} while ($repeatThis);
}
}
return true;
}
?>