Skip to content

Commit

Permalink
Added game-specific versions of website breeding charts
Browse files Browse the repository at this point in the history
  • Loading branch information
thommcgrath committed Jan 16, 2024
1 parent b763001 commit 483dad5
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 17 deletions.
3 changes: 3 additions & 0 deletions Website/conf/www.conf
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ rewrite "^/spawn/?$" /Games/Ark/Cheats permanent;
rewrite "^/account/auth$" /account/auth/redeem.php last;
rewrite "^/account/login/verify(\.php)?$" /account/auth/verify.php last;
rewrite "^/download(/?((index)?\.php)?)?$" /download/index.php last;
rewrite "^/tools/breeding(\.php)?$" /Games/Ark/Breeding permanent;

rewrite "(?i)^/Games/?$" /games/index.php last;

Expand All @@ -105,6 +106,7 @@ rewrite "(?i)^/Games/Ark/Tags/([0-9A-Za-z_]+)/(Creatures|Engrams|LootDrops|Spawn
rewrite "(?i)^/Games/Ark/Tags/([0-9A-Za-z_]+)/(Creatures|Engrams|LootDrops|SpawnPoints)/(\d+)$" /games/ark/blueprints.php?tag=$1&group=$2&page=$3 last;
rewrite "(?i)^/Games/Ark/([A-Za-z0-9_]+_[cC])$" /games/ark/blueprint.php?classString=$1 last;
rewrite "(?i)^/Games/Ark/Mods/(\d+)/([A-Za-z0-9_]+_[cC])$" /games/ark/blueprint.php?contentPackId=$1&classString=$2 last;
rewrite "(?i)^/Games/Ark/Breeding$" /games/ark/breeding.php last;

rewrite "(?i)^/Games/ArkSA/?$" /games/arksa/index.php last;
rewrite "(?i)^/Games/ArkSA/(Creatures|Engrams|LootDrops|SpawnPoints)/?$" /games/arksa/blueprints.php?group=$1 last;
Expand All @@ -122,5 +124,6 @@ rewrite "(?i)^/Games/ArkSA/Tags/([0-9A-Za-z_]+)/(Creatures|Engrams|LootDrops|Spa
rewrite "(?i)^/Games/ArkSA/Tags/([0-9A-Za-z_]+)/(Creatures|Engrams|LootDrops|SpawnPoints)/(\d+)$" /games/arksa/blueprints.php?tag=$1&group=$2&page=$3 last;
rewrite "(?i)^/Games/ArkSA/([A-Za-z0-9_]+_[cC])$" /games/arksa/blueprint.php?classString=$1 last;
rewrite "(?i)^/Games/ArkSA/Mods/(\d+)/([A-Za-z0-9_]+_[cC])$" /games/arksa/blueprint.php?contentPackId=$1&classString=$2 last;
rewrite "(?i)^/Games/ArkSA/Breeding$" /games/arksa/breeding.php last;

rewrite "^/robots.txt" /robots.php last;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php
require(dirname(__FILE__, 3) . '/framework/loader.php');
BeaconTemplate::SetTitle('Ark Breeding Chart');
require(dirname(__FILE__, 4) . '/framework/loader.php');
BeaconTemplate::SetTitle('Ark: Survival Evolved Breeding Chart');

use BeaconAPI\v4\Ark\Creature;
use BeaconAPI\v4\ContentPack;
Expand Down Expand Up @@ -69,44 +69,44 @@
</thead>
<tbody>
<?php
$cache_key = 'breeding:msm=' . number_format($msm, 8) . ';ipm=' . number_format($ipm, 8) . ';ism=' . number_format($ism, 8) . ';iam=' . number_format($iam, 8) . ';m=' . implode(',', $steamIds);

$cache_key = 'ark.breeding:msm=' . number_format($msm, 8) . ';ipm=' . number_format($ipm, 8) . ';ism=' . number_format($ism, 8) . ';iam=' . number_format($iam, 8) . ';m=' . implode(',', $steamIds);
$cached = BeaconCache::Get($cache_key);

if (is_null($cached)) {
ob_start();

$results = $database->Query('SELECT MAX(build_number) AS newest_build FROM updates;');
$min_version = $results->Field('newest_build');

$officialPacks = ContentPack::Search(['minVersion' => $min_version, 'isOfficial' => true], true);
$officialPackIds = [];
foreach ($officialPacks as $officialPack) {
$officialPackIds[] = $officialPack->ContentPackId();
}

$marketplacePacks = ContentPack::Search(['minVersion' => $min_version, 'marketplace' => 'Steam Workshop', 'marketplaceId' => implode(',', $steamIds)], true);
$marketplacePackIds = [];
foreach ($marketplacePacks as $marketplacePack) {
$marketplacePackIds[] = $marketplacePack->ContentPackId();
}

$showModNames = count($steamIds) > 0;
$combinedPackIds = array_merge($officialPackIds, $marketplacePackIds);
$creatures = Creature::Search(['minVersion' => $min_version, 'contentPackId' => $combinedPackIds], true);
foreach ($creatures as $creature) {
if (is_null($creature->IncubationTimeSeconds()) || is_null($creature->MatureTimeSeconds())) {
continue;
}

$incubation_seconds = $creature->IncubationTimeSeconds() / $ism;
$mature_seconds = $creature->MatureTimeSeconds() / $msm;

$max_cuddles = 0;
$per_cuddle = 0;
if ($iam > 0) {
$max_cuddles = floor($mature_seconds / $computed_cuddle_period);

if ($max_cuddles > 0) {
$per_cuddle = min((1 / $max_cuddles) * $iam, 1.0);
$max_cuddles = ceil(1.0 / $per_cuddle);
Expand All @@ -117,24 +117,24 @@
} else {
$cuddle_text = number_format($per_cuddle * 100, 0) . '% ea / ' . $max_cuddles . ' total';
}

$label = htmlentities($creature->Label());
if ($showModNames) {
$label .= '<span class="beacon-engram-mod-name"><br>' . htmlentities($creature->ContentPackName()) . '</span>';
}

$incubation_text = BeaconCommon::SecondsToEnglish(round($incubation_seconds), true);
$mature_text = BeaconCommon::SecondsToEnglish(round($mature_seconds), true);
echo '<tr><td>' . $label . '<span class="narrow-only text-lighter"><br><strong>Incubation Time:</strong> ' . htmlentities($incubation_text) . '<br><strong>Mature Time:</strong> ' . htmlentities($mature_text) . '<br><strong>Imprinting:</strong> ' . htmlentities($cuddle_text) . '</span></td><td class="wide-only">' . htmlentities($incubation_text) . '</td><td class="wide-only">' . htmlentities($mature_text) . '</td><td class="wide-only">' . htmlentities($cuddle_text) . '</td></tr>';
}

$cached = ob_get_contents();
ob_end_clean();
BeaconCache::Set($cache_key, $cached);
}

echo $cached;
?>
</tbody>
</table>
<p class="smaller text-center">Any creature that can be imprinted can be imprinted to 100%</p>
<p class="smaller text-center">Any creature that can be imprinted can be imprinted to 100%</p>
140 changes: 140 additions & 0 deletions Website/www/games/arksa/breeding.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<?php
require(dirname(__FILE__, 4) . '/framework/loader.php');
BeaconTemplate::SetTitle('Ark: Survival Ascended Breeding Chart');

use BeaconAPI\v4\ArkSA\Creature;
use BeaconAPI\v4\ContentPack;

$msm = isset($_GET['msm']) ? floatval($_GET['msm']) : 1.0;
$ipm = isset($_GET['ipm']) ? floatval($_GET['ipm']) : 1.0;
$ism = isset($_GET['ism']) ? floatval($_GET['ism']) : 1.0;
$iam = isset($_GET['iam']) ? floatval($_GET['iam']) : 1.0;

$steamIds = [];
$m = isset($_GET['m']) ? explode(',', $_GET['m']) : [];
for ($idx = 0; $idx < count($m); $idx++) {
$id = filter_var($m[$idx], FILTER_VALIDATE_INT);
if ($id !== false) {
$steamIds[] = $id;
}
}

$msm = ($msm > 0) ? $msm : 1.0;
$ipm = ($ipm > 0) ? $ipm : 1.0;
$ism = ($ism > 0) ? $ism : 1.0;
$iam = ($iam > 0) ? $iam : 1.0;

$database = BeaconCommon::Database();
$results = $database->Query('SELECT value::INTEGER FROM arksa.game_variables WHERE key = $1;', 'Cuddle Period');
if ($results->RecordCount() != 1) {
http_response_code(500);
echo "There was a problem loading the default imprint interval.";
exit;
}
$official_cuddle_period = $results->Field('value');
$computed_cuddle_period = round($official_cuddle_period * $ipm);

BeaconTemplate::AddStylesheet(BeaconCommon::AssetURI('breeding.css'));

?><div id="breeding-stats">
<div id="breeding-stats-msm" class="breeding-stats-column">
<div class="breeding-stats-label">Mature Speed:</div>
<div class="breeding-stats-value"><?php echo htmlentities(BeaconCommon::FormatFloat($msm)); ?></div>
</div>
<div id="breeding-stats-ism" class="breeding-stats-column">
<div class="breeding-stats-label">Incubation Speed:</div>
<div class="breeding-stats-value"><?php echo htmlentities(BeaconCommon::FormatFloat($ism)); ?></div>
</div>
<div id="breeding-stats-ipm" class="breeding-stats-column">
<div class="breeding-stats-label">Imprint Period:</div>
<div class="breeding-stats-value"><?php echo htmlentities(BeaconCommon::FormatFloat($ipm)); ?></div>
</div>
<div id="breeding-stats-if" class="breeding-stats-column">
<div class="breeding-stats-label">Imprint Amount:</div>
<div class="breeding-stats-value"><?php echo htmlentities(BeaconCommon::FormatFloat($iam)); ?></div>
</div>
<div id="breeding-stats-if" class="breeding-stats-column">
<div class="breeding-stats-label">Imprint Frequency:</div>
<div class="breeding-stats-value"><?php echo htmlentities(BeaconCommon::SecondsToEnglish($computed_cuddle_period, true)); ?></div>
</div>
</div>
<table id="creature-chart" class="generic">
<thead>
<tr>
<th>Creature</th>
<th class="wide-only">Incubation Time</th>
<th class="wide-only">Mature Time</th>
<th class="wide-only">Imprints</th>
</tr>
</thead>
<tbody>
<?php

$cache_key = 'arksa.breeding:msm=' . number_format($msm, 8) . ';ipm=' . number_format($ipm, 8) . ';ism=' . number_format($ism, 8) . ';iam=' . number_format($iam, 8) . ';m=' . implode(',', $steamIds);
$cached = BeaconCache::Get($cache_key);

if (is_null($cached)) {
ob_start();

$results = $database->Query('SELECT MAX(build_number) AS newest_build FROM updates;');
$min_version = $results->Field('newest_build');

$officialPacks = ContentPack::Search(['minVersion' => $min_version, 'isOfficial' => true], true);
$officialPackIds = [];
foreach ($officialPacks as $officialPack) {
$officialPackIds[] = $officialPack->ContentPackId();
}

$marketplacePacks = ContentPack::Search(['minVersion' => $min_version, 'marketplace' => 'Steam Workshop', 'marketplaceId' => implode(',', $steamIds)], true);
$marketplacePackIds = [];
foreach ($marketplacePacks as $marketplacePack) {
$marketplacePackIds[] = $marketplacePack->ContentPackId();
}

$showModNames = count($steamIds) > 0;
$combinedPackIds = array_merge($officialPackIds, $marketplacePackIds);
$creatures = Creature::Search(['minVersion' => $min_version, 'contentPackId' => $combinedPackIds], true);
foreach ($creatures as $creature) {
if (is_null($creature->IncubationTimeSeconds()) || is_null($creature->MatureTimeSeconds())) {
continue;
}

$incubation_seconds = $creature->IncubationTimeSeconds() / $ism;
$mature_seconds = $creature->MatureTimeSeconds() / $msm;

$max_cuddles = 0;
$per_cuddle = 0;
if ($iam > 0) {
$max_cuddles = floor($mature_seconds / $computed_cuddle_period);

if ($max_cuddles > 0) {
$per_cuddle = min((1 / $max_cuddles) * $iam, 1.0);
$max_cuddles = ceil(1.0 / $per_cuddle);
}
}
if ($max_cuddles == 0) {
$cuddle_text = 'Can\'t Imprint';
} else {
$cuddle_text = number_format($per_cuddle * 100, 0) . '% ea / ' . $max_cuddles . ' total';
}

$label = htmlentities($creature->Label());
if ($showModNames) {
$label .= '<span class="beacon-engram-mod-name"><br>' . htmlentities($creature->ContentPackName()) . '</span>';
}

$incubation_text = BeaconCommon::SecondsToEnglish(round($incubation_seconds), true);
$mature_text = BeaconCommon::SecondsToEnglish(round($mature_seconds), true);
echo '<tr><td>' . $label . '<span class="narrow-only text-lighter"><br><strong>Incubation Time:</strong> ' . htmlentities($incubation_text) . '<br><strong>Mature Time:</strong> ' . htmlentities($mature_text) . '<br><strong>Imprinting:</strong> ' . htmlentities($cuddle_text) . '</span></td><td class="wide-only">' . htmlentities($incubation_text) . '</td><td class="wide-only">' . htmlentities($mature_text) . '</td><td class="wide-only">' . htmlentities($cuddle_text) . '</td></tr>';
}

$cached = ob_get_contents();
ob_end_clean();
BeaconCache::Set($cache_key, $cached);
}

echo $cached;
?>
</tbody>
</table>
<p class="smaller text-center">Any creature that can be imprinted can be imprinted to 100%</p>

0 comments on commit 483dad5

Please sign in to comment.