Skip to content

Instantly share code, notes, and snippets.

@wescopeland
Last active August 1, 2023 12:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wescopeland/1411e4fd66ff0d8386ab2b4df2169a45 to your computer and use it in GitHub Desktop.
Save wescopeland/1411e4fd66ff0d8386ab2b4df2169a45 to your computer and use it in GitHub Desktop.
function testBeatenGame(int $gameId, string $user, bool $postBeaten): array
{
$totalProgressions = Achievement::where('GameID', $gameId)
->where('type', AchievementType::Progression)
->where('Flags', AchievementFlag::OfficialCore)
->count();
$progressionTierAchievements = Achievement::where('Achievements.GameID', $gameId)
->whereIn('Achievements.type', [AchievementType::Progression, AchievementType::WinCondition])
->where('Achievements.Flags', AchievementFlag::OfficialCore)
->leftJoin('Awarded', function ($join) use ($user) {
$join->on('Achievements.ID', '=', 'Awarded.AchievementID')
->where('Awarded.User', '=', $user);
})
->select('Achievements.type', 'Awarded.HardcoreMode', 'Awarded.AchievementID')
->get();
$softcoreProgressionAchievementIDs = [];
$hardcoreProgressionAchievementIDs = [];
$softcoreWinConditionAchievementIDs = [];
$hardcoreWinConditionAchievementIDs = [];
foreach ($progressionTierAchievements as $achievement) {
if ($achievement->type === AchievementType::Progression) {
if (isset($achievement->AchievementID)) {
if ($achievement->HardcoreMode) {
$hardcoreProgressionAchievementIDs[$achievement->AchievementID] = true;
$softcoreProgressionAchievementIDs[$achievement->AchievementID] = true;
} else {
$softcoreProgressionAchievementIDs[$achievement->AchievementID] = true;
}
}
} elseif ($achievement->type === AchievementType::WinCondition && isset($achievement->AchievementID)) {
if ($achievement->HardcoreMode) {
$hardcoreWinConditionAchievementIDs[$achievement->AchievementID] = true;
$softcoreWinConditionAchievementIDs[$achievement->AchievementID] = true;
} else {
$softcoreWinConditionAchievementIDs[$achievement->AchievementID] = true;
}
}
}
$numUnlockedSoftcoreProgressions = count($softcoreProgressionAchievementIDs);
$numUnlockedHardcoreProgressions = count($hardcoreProgressionAchievementIDs);
$numUnlockedSoftcoreWinConditions = count($softcoreWinConditionAchievementIDs);
$numUnlockedHardcoreWinConditions = count($hardcoreWinConditionAchievementIDs);
$isBeatenSoftcore = $numUnlockedSoftcoreProgressions === $totalProgressions && $numUnlockedSoftcoreWinConditions > 0;
$isBeatenHardcore = $numUnlockedHardcoreProgressions === $totalProgressions && $numUnlockedHardcoreWinConditions > 0;
if ($postBeaten && ($isBeatenSoftcore || $isBeatenHardcore)) {
$awardMode = $isBeatenHardcore ? UnlockMode::Hardcore : UnlockMode::Softcore;
if (!HasSiteAward($user, AwardType::GameBeaten, $gameId, $awardMode)) {
AddSiteAward($user, AwardType::GameBeaten, $gameId, $awardMode);
}
if (!RecentlyPostedProgressionActivity($user, $gameId, $awardMode, ActivityType::BeatGame)) {
postActivity($user, ActivityType::BeatGame, $gameId, $awardMode);
}
}
return [
'isBeatenSoftcore' => $isBeatenSoftcore,
'isBeatenHardcore' => $isBeatenHardcore,
];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment