'; $aTypeNames[1] = "Path Career Level $aLevel!"; $aTypeNames[2] = "Mazes Career Level $aLevel!"; $aTypeNames[3] = "Maze Mastery Level $aLevel!"; $aTypeNames[4] = "Champion Level $aLevel!"; $aTypeNames[32] = 'Tutorial Complete!'; $aTypeCurrency[1] = "total moves mazed"; $aTypeCurrency[2] = "mazes played"; $aTypeCurrency[3] = "mazes with (tied) top score"; $aTypeCurrency[4] = "champion points"; $aName = $aTypeNames[$aType]; $currency = $aTypeCurrency[$aType]; // --------- Any unlocks for this achievement? $sql = "SELECT `type`, `name`, `value` FROM `unlocks` WHERE `achievementID` = '$aID'"; $result = mysql_query($sql); $unlocked = ''; if (mysql_num_rows($result) >= 1) { $unlocked = "You've unlocked: "; while (list($uType, $uName, $uValue) = mysql_fetch_row($result)) { switch ($uType) { case 1: $unlocked .= "$uName Wall Color!"; $unlocked .= "
"; break; case 2: $unlocked .= "$uName Emblem!"; $unlocked .= "
"; $unlocked .= "
"; break; case 3: $unlocked .= "
$uName Username color!
"; break; } } } // ---------- Prepare response $r .= "$aName"; if ($unlocked !== '') { $r .= "
$unlocked"; //$r .= "
"; $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); // TODO: DEPRECIATED function applyCareerPathAchievements($userID) { $sql = "SELECT totalMoves FROM `users` WHERE ID = '$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 // TODO: 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; } /** * Called when a user completes a challenge * @param type $userID User who did the challenge * @param type $mapID Map to check for challenges * @param type $solution The final placement of towers, as a string of .-separated x,y pairs. * Begins and ends with "." as well * @param type $moves The total number of moves in the solution, for all paths * @param type $paths An array of path-objects, each as returned by routePath(). */ function getCompletedChallenges($userID, $mapID, $solution, $moves, $paths) { //mapID 5 is the tutorial, and is treated specially //TODO: Fix / depreciate this. Re-adapt tutorial // Temporary Hack to complete the tutorial... // if($mapID <= 10) { if ($mapID == 5 && $moves == 75) { onCompletedTutorial($userID); } // return; // } $challengeResultset = loadChallengesForMap($mapID, $userID); $challengesCompleted = array(); while($challenge = mysql_fetch_array($challengeResultset)) { //Skip checking challenges which have already been completed if($challenge["dateSolved"] !== NULL) { $challengesCompleted[] = $challenge["challengeID"]; } else if(hasChallengeBeenCompleted($challenge, $solution, $moves, $paths)) { setChallengeCompleted($challenge, $solution, $userID, $moves); $challengesCompleted[] = $challenge["challengeID"]; } } return $challengesCompleted; } /** * Called when a user completes the tutorial */ function onCompletedTutorial($userID) { //have they previously completed the tutorial? if(hasCompletedTutorial($userID)) 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; } /** * Checks if the given solution meets the requirements for the given challenge */ function hasChallengeBeenCompleted($challenge, $solution, $moves, $paths) { //$firephp = FirePHP::getInstance(true); //Check the maze-length if($challenge['goal'] != 0) { //Er, "greater than" should really be called "greater than or equal to" :\ if(($challenge['inequality'] == "greater than" && $moves < $challenge['goal']) || ($challenge['inequality'] == "less than" && $moves >= $challenge['goal']) || ($challenge['inequality'] == "equal" && $moves != $challenge['goal'])) { //$firephp->log("Failed at distance"); return false; } } //Check wall-count restriction if($challenge['restrictWallCount'] !== NULL) { //The number of walls is equal to the number of "," characters in the $solution string $temp = count_chars($solution, 1); //$temp needed due to extreme PHP-stupidity $numWalls = $temp[ord(",")]; if($numWalls > $challenge['restrictWallCount']) { //$firephp->log("Failed at wall-count"); return false; } } //Check wall-placement restriction if($challenge['restrictWallPlacement'] !== NULL) { $invalidWalls = explode(".", $challenge['restrictWallPlacement']); foreach($invalidWalls as $invalidWall) { $stringToSearchFor = "." . swapXandYCoordinates($invalidWall) . "."; if(strpos($solution,$stringToSearchFor) !== false) { //$firephp->log("Failed at wall-placement: " . $invalidWall); //$firephp->log("Solution: " . $solution); return false; } } } //TODO: This portion probably needs to be rewritten due to the weird way paths are saved if($challenge['restrictTeleportCount'] !== NULL || $challenge['restrictTeleportsUsed'] !== NULL) { //Check teleport count $usedTeleports = explode(".", getUsedTeleports($paths)); //TODO: Implement if($challenge['restrictTeleportCount'] !== NULL) { if(count($usedTeleports) !== $challenge['restrictTeleportCount'] && ($challenge['restrictTeleportCount'] != 0 || $usedTeleports[0] != "")) { //$firephp->log("Failed at teleport count"); return false; } } //Check teleports used if($challenge['restrictTeleportsUsed'] !== NULL) { foreach($usedTeleports as $usedTeleport) { foreach($paths as $path) { //Check each path to see if it walks over that teleport if(strpos($path['path'], $usedTeleport) !== false) { //$firephp->log("Failed at teleports used"); return false; } } } } } //Check start points if($challenge['restrictStartPoint'] !== NULL) { $usesCorrectStartPoint = false; foreach($paths as $path) { if($path['start'] == $challenge['restrictStartPoint']) $usesCorrectStartPoint = true; } if(!$usesCorrectStartPoint) { //$firephp->log("Failed at start-point"); return false; } } //Check end points if($challenge['restrictEndPoint'] !== NULL) { $usesCorrectEndPoint = false; foreach($paths as $path) { if($path['end'] == $challenge['restrictEndPoint']) $usesCorrectEndPoint = true; } if(!$usesCorrectEndPoint) { //$firephp->log("Failed at endpoint"); return false; } } //All of the restrictions were met, meaning the challenge was completed! //$firephp->log("Succeeded!"); return true; } /** * Returns the datetime of the next weekly map */ function getNextWeeklyMapDateTime() { $sql = "SELECT MAX(mapExpireTime) AS mapExpireTime FROM mapOfTheDay WHERE mapType = " . MapType::Weekly; $result = mysql_query($sql); $row = mysql_fetch_row($result); return $row[0]; } /** * Hack, due to positions being stored as x,y in some places and y,x in others */ function swapXandYCoordinates($position) { $coords = explode(",", $position); return $coords[1] . "," . $coords[0]; } /** * Sets the given challenge as completed by the user in the database */ function setChallengeCompleted($challenge, $solution, $userID, $moves) { $solution = mysql_escape_string($solution); $userID = mysql_escape_string($userID); $challengeID = $challenge["challengeID"]; $sql = "INSERT INTO `challengeSolutions` (`userID`, `challengeID`, `solution`, `moves`, `dateSolved`) VALUES ('$userID', '$challengeID', '$solution', $moves, NOW())"; mysql_query($sql); } function isChallengeMap($mapID) { $sql = "SELECT ID FROM `challengeMaps` WHERE ID = '$mapID'; "; $result = mysql_query($sql) or die(mysql_error()); return (mysql_num_rows($result) != 0); } function getUserChallengeTier($userID) { $userID = mysql_escape_string($userID); $sql = "SELECT challengeTier FROM users WHERE users.ID = '$userID'"; $result = mysql_query($sql); $row = mysql_fetch_row($result); return $row[0]; } function setUserChallengeTier($userID, $challengeTier) { $userID = mysql_escape_string($userID); $challengeTier = mysql_escape_string($challengeTier); $sql = "UPDATE users SET challengeTier = '$challengeTier' WHERE users.ID = '$userID'"; mysql_query($sql); } 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. (TODO: 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, Champion Points! $r = 0; $sql = ''; //TODO: These can all be combined into a single query... switch ($aType) { case 1: $sql = "SELECT totalMoves AS t FROM `users` WHERE `ID` = '$userID'"; break; case 2: $sql = "SELECT totalMazes as t FROM `users` WHERE `ID` = '$userID'"; break; case 3: $sql = "SELECT totalTies FROM `users` WHERE `ID` = '$userID'"; break; case 4: $sql = "SELECT championPoints FROM `users` WHERE `ID` = '$userID'"; break; } if ($sql == '') return false; $result = mysql_query($sql) OR die("SQL query failed; $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 getChampionPointsArray(); //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); $r[9] = array(225, 2, 'CircleLarge_W_I.png', 'Inverted Bright Large Circle', 0); $r[10] = array(300, 2, 'DiamondSmall_B_I.png', 'Inverted Dark Small Diamond', 0); $r[11] = array(400, 2, 'CircleLargeDonut_B.png', 'Dark Annulated Circle', 0); $r[12] = array(550, 2, 'CrossXL_B_I.png', 'Inverted Dark Large Present', 0); //$cp[4] = array(10000, 2, 'DiamondSmall_B.png', 'Dark Small Diamond', 0); return $r; } //TYPE 4 function getChampionPointsArray() { //$cp[0] = array(requiredpoints, type, 'value', 'name'); $r[1] = array(100, 2, 'DiagonalCover_B.png', 'Light Diagonal Cover', 0); $r[2] = array(250, 1, '#22aaaa', 'Teal'); $r[3] = array(500, 2, 'OffsetStripesDiagonal_B.png', 'Dark Diagonal Stripes', 0); $r[4] = array(1000, 2, 'DiamondLargeDonut_W_I.png', 'Inverted Light Annulated Diamond', 0); $r[5] = array(2000, 2, 'StarsR_B.png', 'Dark Stars', 0); $r[6] = array(4000, 2, 'OffsetStripesHorizontal_B_I.png', 'Inverted Dark Horizontal Stripes', 0); $r[7] = array(8000, 2, 'CrossXLDonut_B_I.png', 'Inverted Dark Large Intersection', 0); $r[8] = array(16000, 2, 'DiamondLarge_B.png', 'Dark Large Diamond', 0); $r[9] = array(32000, 1, '#22ff22', 'Neon Lime', 1); //$r[7] = array(75, 2, 'CircleSmall_W_I.png', 'Inverted Bright Small Circle', 0); return $r; } //Select Members function getMembers($pageNumber = 1, $pageDivide = 50, $order = 'DESC', $orderBy = 'dateJoined') { if ($pageDivide <= 0) $pageDivide = 50; if ($order !== 'ASC' AND $order !== 'DESC') $order = 'DESC'; $columns = array('dateJoined', 'dateLogin', 'championPoints', 'totalMazes', 'totalWins', 'totalTies', 'totalMovesThisWeek', 'totalMoves', 'display'); if (!in_array($orderBy, $columns)) $orderBy = 'dateJoined'; //These values are now confirmed. $sqlOrder = "ORDER BY `$orderBy` $order"; $limitTop = ($pageNumber - 1) * $pageDivide; $sql = "SELECT COUNT(*) as 'count' FROM `users`"; $result = mysql_query($sql) or die(mysql_error()); $row = mysql_fetch_assoc($result); $total = $row['count']; $output['pageCount'] = ceil(($total / $pageDivide)); $pageRequest = 'all'; if ($pageRequest == 'all') { $pageReqStart = 1; $pageReqEnd = 1000; } elseif (is_int($pageRequest)) { $pageReqStart = $pageRequest; $pageReqEnd = $pageRequest; } else { $tmp = explode($pageRequest, "-"); $pageReqStart = $tmp[0]; $pageReqEnd = $tmp[1]; } $sql = " SELECT users.ID as ID, users.displayName as display, users.totalMoves, ( SELECT IFNULL(SUM(moves),0) FROM solutions INNER JOIN mapOfTheDay ON solutions.mapID = mapOfTheDay.mapID WHERE solutions.userID = users.ID AND mapOfTheDay.mapExpireTime BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW() ) AS totalMovesThisWeek, users.championPoints as championPoints, users.totalMazes as totalMazes, users.totalWins as totalWins, users.totalTies as totalTies, users.wallColor, users.displayColor, users.wallEmblem, users.datejoined as dateJoined, users.dateLogin as dateLogin FROM `users` $sqlOrder LIMIT $limitTop, $pageDivide "; $result = mysql_query($sql); //$utime = date("g:i A (T)"); $output['updateTime'] = date("g:i A (T)"); $i = $limitTop; $foundUser = false; while ($row = mysql_fetch_assoc($result)) { $i++; $userID = $row['ID']; if ($_SESSION['userID'] == $userID) { $userPosition = $i; } $row['dateJoined'] = Date("Y-m-d", strtotime($row['dateJoined'])); $row['dateLogin'] = Date("Y-m-d", strtotime($row['dateLogin'])); $scoredDate = strtotime($row['cdate']); $secondsSinceScored = strtotime("now") - $scoredDate ; //Alternate background colors $background = '#262631'; if ($i % 2 == 1) $background = '#20202a'; if ($userPosition == $i) { $background = '#343c57'; $foundUser = true; } $output['users'][$i] = $row; $output['users'][$i]['secondsSinceScored'] = $secondsSinceScored; $output['users'][$i]['background'] = $background; $output['users'][$i]['isUser'] = $userPosition == $i; } // END WHILE return $output; } //Select Stats/Scores. function getScores($mapID, $pageNumber = 1, $pageDivide = 10) { $top = $pageNumber * $pageDivide; $bottom = $top - $pageDivide; //TODO: !! set to false before uploading. $isBlindMap = false; $pageRequest = 'all'; if ($pageRequest == 'all') { $pageReqStart = 1; $pageReqEnd = 1000; } elseif (is_int($pageRequest)) { $pageReqStart = $pageRequest; $pageReqEnd = $pageRequest; } else { $tmp = explode($pageRequest, "-"); $pageReqStart = $tmp[0]; $pageReqEnd = $tmp[1]; } $userID = $_SESSION['userID']; $myBestMoves = 0; if ($isBlindMap) { $sql = "SELECT `moves` FROM `solutions` WHERE `mapID` = '$mapID' AND `userID` = '$userID'"; $result = mysql_query($sql) or die(mysql_error()); $row = mysql_fetch_assoc($result); $myBestMoves = $row['moves']; } $requestSolutions = ''; $currentMap = isCurrentMap($mapID); if (!$currentMap) { $requestSolutions = 'solutions.solution,'; } $sql = " SELECT timediff(solutions.dateModified, TIMESTAMP(CURDATE())) as diff, users.displayName as display, solutions.moves as moves, solutions.championPointsWorth as points, users.ID as ID, users.displayColor, users.wallColor, users.wallEmblem, $requestSolutions solutions.dateModified as cdate, solutions.ID as solutionID FROM `users` JOIN `solutions` ON users.ID = solutions.userID WHERE solutions.mapID = '$mapID' ORDER BY solutions.moves DESC, solutions.dateModified ASC, solutions.ID DESC "; // ORDER BY solutions.moves ASC, solutions.dateModified DESC, solutions.ID ASC $result = mysql_query($sql); //$utime = date("g:i A (T)"); $output['updateTime'] = time(); $i = 0; $foundUser = false; while ($row = mysql_fetch_assoc($result)) { $i++; $moves = $row['moves']; $requestedUserID = $row['ID']; if ($i == 1) { $bestMoves = $moves; $output['bestMoves'] = $bestMoves; $output['bestBy'] = $row['display']; } if ($_SESSION['userID'] == $requestedUserID) { $userPosition = $i; //$myBestMoves = $moves; } else { if ($i > $top) continue; if ($i <= $bottom) continue; } $scoredDate = strtotime($row['cdate']); $secondsSinceScored = strtotime("now") - $scoredDate; //Alternate background colors $background = '#262631'; if ($i % 2 == 1) $background = '#20202a'; if ($userPosition == $i) { $background = '#343c57'; $foundUser = true; } $medal = 'none'; if ($moves == $bestMoves) $medal = 'silver'; if ($i == 1) $medal = 'gold'; // if is blind map. if ($isBlindMap AND $myBestMoves < $moves) $row['moves'] = '???'; $output['users'][$i] = $row; $output['users'][$i]['secondsSinceScored'] = $secondsSinceScored; $output['users'][$i]['background'] = $background; $output['users'][$i]['medal'] = $medal; $output['users'][$i]['isUser'] = $userPosition == $i; } // END WHILE if ($foundUser) { $userPage = ceil(($userPosition / $pageDivide)); $output['userPage'] = $userPage; $output['userPosition'] = $userPosition; } $output['pageCount'] = ceil(($i / $pageDivide)); $output['isCurrentMap'] = $currentMap; return $output; } /** * Returns true if the given user has completed the tutorial, false otherwise */ function hasCompletedTutorial($userID) { $userID = mysql_escape_string($userID); $sql = "SELECT `level` FROM `achievements` WHERE `type` = 32 AND `userID` = '$userID' LIMIT 1"; $result = mysql_query($sql); return (mysql_num_rows($result) >= 1); } /** * Returns a MySQL resultset for all challenges for the given mapID * @param $mapIdUnsanitized The mapID to load. Assumed to be unsanitized. * @param $userID The userID. Assumed to be unsanitized * @return Returns a MySQL resultset with the columns listed in the code, or NULL if nothing found */ function loadChallengesForMap($mapIdUnsanitized, $userIdUnsanitized) { $mapID = mysql_escape_string($mapIdUnsanitized); $userID = mysql_escape_string($userIdUnsanitized); $sql = " SELECT challenges.ID AS challengeID, challenges.inequality, challenges.goal, challenges.hint, challenges.restrictWallCount, challenges.restrictWallPlacement, challenges.restrictTeleportCount, challenges.restrictTeleportsUsed, challenges.restrictStartPoint, challenges.restrictEndPoint, challengeSolutions.dateSolved FROM challenges LEFT JOIN challengeSolutions ON challenges.ID = challengeSolutions.challengeID AND challengeSolutions.userID = '$userID' WHERE challenges.mapID = '$mapID' AND challenges.enabled = 1 ORDER BY challenges.ordering "; $result = mysql_query($sql); echo mysql_error(); if (mysql_num_rows($result) >= 1) return $result; return NULL; } /** * Loads a listing of all maps and challenges for display, along with which ones the user has completed * @param type $userIdUnsanitized The userID. Assumed to be unsanitized. * @return Returns a MySQL resultset with the columns listed in the code, or NULL if nothing found */ function loadChallengeListing($userIdUnsanitized) { $userID = mysql_escape_string($userIdUnsanitized); $sql = "SELECT challengeMaps.ID AS challengeMapID, challengeMaps.challengeTier, challengeMaps.name AS name, challengeSolutions.dateSolved, challengeSolutions.challengeID AS challengeID, challengeMaps.challengeSuborder, challenges.ordering, challengeMaps.code as mapCode FROM challenges INNER JOIN challengeMaps ON challenges.mapID = challengeMaps.ID LEFT JOIN challengeSolutions ON challenges.ID = challengeSolutions.challengeID AND challengeSolutions.userID = '$userID' WHERE challenges.enabled = 1 AND challengeMaps.challengeTier <= (SELECT challengeTier FROM users WHERE ID = '$userID' LIMIT 1) ORDER BY challengeMaps.challengeTier, challengeMaps.challengeSuborder, challenges.ordering"; $result = mysql_query($sql) OR die(mysql_error()."SQL: $sql"); if (mysql_num_rows($result) >= 1) return $result; return NULL; } /** * Returns the map "code" for the given mapId */ function loadChallengeMapCode($mapIdUnsanitized) { $ID = mysql_escape_string($mapIdUnsanitized); $sql = " SELECT challengeMaps.code as code FROM challengeMaps WHERE ID = '$ID' LIMIT 1 "; $result = mysql_query($sql); if (mysql_num_rows($result) >= 1) { $temp = mysql_fetch_row($result); return $temp[0]; } return NULL; } function isCurrentMap($mapID) { include_once('./includes/sqlEmbedded.php'); $sql = "SELECT mapID FROM `mapOfTheDay` WHERE `mapID` = '$mapID' AND mapExpireTime > NOW() LIMIT 1 "; $result = mysql_query($sql) or die(mysql_error()); return (mysql_num_rows($result) != 0); } ?>