public static function GenerateDaily($date)
 {
     $dayid = DailyConfig::DateTimeToInt($date);
     $weekDay = intval($date->format('w'));
     $chr = Character::Isaac;
     $endLevel = 0;
     $diff = 0;
     $isMega = false;
     $polaroid = false;
     $rnd = new RandIsaac($dayid);
     do {
         $chr = $rnd->Next() % 15;
     } while ($chr == Character::Lazarus2 || $chr == Character::BlackJudas || $chr == Character::Keeper);
     switch ($rnd->Next() & 3) {
         case 0:
             $endLevel = EndLevel::MomsFoot;
             break;
         case 1:
             $endLevel = EndLevel::MomsHeart;
             break;
         case 2:
             $polaroid = ($rnd->Next() & 1) == 0;
             $endLevel = $polaroid ? EndLevel::Cathedral : EndLevel::Sheol;
             break;
         case 3:
             $polaroid = ($rnd->Next() & 1) == 0;
             $endLevel = $polaroid ? EndLevel::Chest : EndLevel::DarkRoom;
             break;
     }
     if ($weekDay == 0) {
         $endLevel = $polaroid ? EndLevel::Chest : EndLevel::DarkRoom;
         $isMega = true;
         if ($rnd->Next() % 6 == 0) {
             $diff = Difficulty::Hard;
         }
     } else {
         if ($weekDay == 1) {
             $diff = Difficulty::Hard;
         }
     }
     return new DailyConfig($chr, $endLevel, $diff, $isMega, $rnd->Next());
 }
<?php

date_default_timezone_set('Pacific/Honolulu');
include "models/dailyseed.php";
$start = isset($_GET['start']) ? $_GET['start'] : null;
$length = isset($_GET['length']) ? intval($_GET['length']) : 1000;
$start = DateTime::createFromFormat("Ymd", $start);
if (!$start) {
    $start = DateTime::createFromFormat("Ymd", "20151031");
}
$length = min(800, max(1, $length));
$today = new DateTime((new DateTime())->format('Y-m-d'));
$dailies = array();
for ($i = 0; $i < $length; $i++) {
    $daily = DailyConfig::GenerateDaily($start);
    $r = array();
    if ($start->compare($today)->isBeforeOrEqual()) {
        $r['char'] = $daily->CharAsText();
        $r['end'] = $daily->EndAsText();
        $r['mega'] = $daily->IsMegaSatan;
        $r['hard'] = $daily->Difficulty;
    }
    if ($start < $today) {
        $r['seed'] = DailyConfig::SeedToString($daily->Seed);
    }
    $dailies[$start->format('Ymd')] = $r;
    $start = $start->add(new DateInterval("P1D"));
}
echo json_encode($dailies);
<?php

date_default_timezone_set('Pacific/Honolulu');
include "models/dailyseed.php";
$length = 365 * 3;
$start = date_create_from_format("Ymd", "20151031");
$today = date_create();
$dailies = array();
while ($length !== 0) {
    $daily = DailyConfig::GenerateDaily($start);
    $r = array();
    if ($start <= $today) {
        $r['char'] = $daily->CharAsText();
        $r['end'] = $daily->EndAsText();
        $r['mega'] = $daily->IsMegaSatan;
        $r['hard'] = $daily->Difficulty;
        $r['seed'] = $start < $today ? DailyConfig::SeedToString($daily->Seed) : "????????";
        $dailies[$start->format('Ymd')] = $r;
        $start = $start->add(new DateInterval("P1D"));
    }
    $length--;
}
echo json_encode($dailies);
function updateDailyObjectives($date = 0)
{
    global $db;
    if ($date == 0) {
        $stmt = $db->query("\n            SELECT date\n              FROM dates\n             WHERE done = 1\n             ORDER BY date DESC\n             LIMIT 1");
    } else {
        $stmt = $db->prepare("\n            SELECT date\n              FROM dates\n             WHERE date = :date");
        $stmt->execute(array(':date' => $date));
    }
    $date = new DateTime($stmt->fetch()[0]);
    $daily = DailyConfig::GenerateDaily($date);
    $stmt = $db->prepare("\n        UPDATE dates\n           SET char_id = :char,\n               endlevel = :floor,\n               megasatan = :mega,\n               hard = :hard\n         WHERE date = :date");
    $stmt->execute(array(':char' => $daily->Character, ':floor' => $daily->EndLevel, ':mega' => $daily->IsMegaSatan, ':hard' => $daily->Difficulty, ':date' => $date->format('Y-m-d')));
    return $daily;
}