more daily bonus for prestige

This commit is contained in:
Face 2025-06-25 17:03:52 +03:00
parent 96cb799cc7
commit ee29f97ca4
4 changed files with 47 additions and 11 deletions

View file

@ -1,6 +1,6 @@
<script lang="ts">
import { Button } from '$lib/components/ui/button';
import { Gift, Clock, Loader2, CheckIcon } from 'lucide-svelte';
import { Gift, Clock, Loader2, CheckIcon, Star } from 'lucide-svelte';
import { USER_DATA } from '$lib/stores/user-data';
import { fetchPortfolioSummary } from '$lib/stores/portfolio-data';
import { toast } from 'svelte-sonner';
@ -11,6 +11,8 @@
canClaim: boolean;
rewardAmount: number;
baseReward: number;
prestigeBonus?: number;
prestigeLevel?: number;
timeRemaining: number;
nextClaimTime: string | null;
totalRewardsClaimed: number;
@ -67,9 +69,13 @@
const result = await response.json();
claimState = 'success';
const prestigeBonus = result.prestigeBonus || 0;
const hasPrestigeBonus = prestigeBonus > 0;
toast.success(`Daily reward claimed! +$${formatCurrency(result.rewardAmount)}`, {
description:
rewardStatus.loginStreak > 0
description: hasPrestigeBonus
? `Base: $${formatCurrency(result.baseReward)} + Prestige bonus: $${formatCurrency(prestigeBonus)} | Streak: ${rewardStatus.loginStreak} days 🔥`
: rewardStatus.loginStreak > 0
? `Login streak: ${rewardStatus.loginStreak} days 🔥`
: undefined,
action: {

View file

@ -82,6 +82,7 @@ export const POST: RequestHandler = async ({ request, locals }) => {
.set({
baseCurrencyBalance: '100.00000000',
prestigeLevel: nextPrestige,
lastRewardClaim: null,
updatedAt: new Date()
})
.where(eq(user.id, userId));
@ -92,7 +93,7 @@ export const POST: RequestHandler = async ({ request, locals }) => {
userId: userId,
type: 'SYSTEM',
title: `${prestigeName} Achieved!`,
message: `Congratulations! You have successfully reached ${prestigeName}. Your portfolio has been reset and you can now start fresh with your new prestige badge.`,
message: `Congratulations! You have successfully reached ${prestigeName}. Your portfolio has been reset, daily reward cooldown has been cleared, and you can now start fresh with your new prestige badge and enhanced daily rewards.`,
});
return json({

View file

@ -19,6 +19,19 @@ const REWARD_TIERS = [
4000, // Day 8+
];
const PRESTIGE_MULTIPLIERS = {
0: 1.0, // No prestige
1: 1.25, // 25% bonus
2: 1.5, // 50% bonus
3: 1.75, // 75% bonus
4: 2.0, // 100% bonus
5: 2.5, // 150% bonus
};
function getPrestigeMultiplier(prestigeLevel: number): number {
return PRESTIGE_MULTIPLIERS[prestigeLevel as keyof typeof PRESTIGE_MULTIPLIERS] || 1.0;
}
function calculateStreak(lastClaim: Date | null, currentStreak: number): number {
if (!lastClaim) return 1;
@ -33,11 +46,14 @@ function calculateStreak(lastClaim: Date | null, currentStreak: number): number
return currentStreak;
}
function calculateReward(streak: number): { total: number; base: number } {
function calculateReward(streak: number, prestigeLevel: number = 0): { total: number; base: number; prestigeBonus: number } {
const tierIndex = Math.min(streak - 1, REWARD_TIERS.length - 1);
const base = REWARD_TIERS[tierIndex];
const prestigeMultiplier = getPrestigeMultiplier(prestigeLevel);
const prestigeBonus = base * (prestigeMultiplier - 1);
const total = base + prestigeBonus;
return { total: base, base };
return { total, base, prestigeBonus };
}
export const POST: RequestHandler = async ({ request }) => {
@ -53,7 +69,8 @@ export const POST: RequestHandler = async ({ request }) => {
baseCurrencyBalance: user.baseCurrencyBalance,
lastRewardClaim: user.lastRewardClaim,
totalRewardsClaimed: user.totalRewardsClaimed,
loginStreak: user.loginStreak
loginStreak: user.loginStreak,
prestigeLevel: user.prestigeLevel
})
.from(user)
.where(eq(user.id, userId))
@ -78,7 +95,7 @@ export const POST: RequestHandler = async ({ request }) => {
}
const newStreak = calculateStreak(currentUser.lastRewardClaim, currentUser.loginStreak || 0);
const reward = calculateReward(newStreak);
const reward = calculateReward(newStreak, currentUser.prestigeLevel || 0);
const currentBalance = parseFloat(currentUser.baseCurrencyBalance || '0');
const currentTotalRewards = parseFloat(currentUser.totalRewardsClaimed || '0');
@ -98,6 +115,8 @@ export const POST: RequestHandler = async ({ request }) => {
success: true,
rewardAmount: reward.total,
baseReward: reward.base,
prestigeBonus: reward.prestigeBonus,
prestigeLevel: currentUser.prestigeLevel || 0,
newBalance,
totalRewardsClaimed: newTotalRewards,
loginStreak: newStreak,
@ -115,7 +134,8 @@ export const GET: RequestHandler = async ({ request }) => {
baseCurrencyBalance: user.baseCurrencyBalance,
lastRewardClaim: user.lastRewardClaim,
totalRewardsClaimed: user.totalRewardsClaimed,
loginStreak: user.loginStreak
loginStreak: user.loginStreak,
prestigeLevel: user.prestigeLevel
})
.from(user)
.where(eq(user.id, Number(session.user.id)))
@ -141,12 +161,14 @@ export const GET: RequestHandler = async ({ request }) => {
}
const potentialStreak = calculateStreak(currentUser.lastRewardClaim, currentUser.loginStreak || 0);
const reward = calculateReward(potentialStreak);
const reward = calculateReward(potentialStreak, currentUser.prestigeLevel || 0);
return json({
canClaim,
rewardAmount: reward.total,
baseReward: reward.base,
prestigeBonus: reward.prestigeBonus,
prestigeLevel: currentUser.prestigeLevel || 0,
timeRemaining,
nextClaimTime,
totalRewardsClaimed: Number(currentUser.totalRewardsClaimed || 0),

View file

@ -149,6 +149,12 @@
{/if}
<li>Total portfolio value: {formatValue(totalValue)}</li>
</ul>
<strong class="mt-2 block text-green-600">You will gain:</strong>
<ul class="mt-1 list-disc space-y-1 pl-4">
<li>More money in daily rewards</li>
<li>A daily reward reset</li>
<li>Prestige badge and status</li>
</ul>
We will automatically sell all your coin holdings.
</AlertDescription>
</Alert>
@ -245,7 +251,7 @@
<div>
<p class="font-medium">Gain Status</p>
<p class="text-muted-foreground text-sm">
Earn an exclusive prestige title and start fresh
Earn an exclusive prestige title, enhanced daily rewards, and reset your daily reward cooldown
</p>
</div>
</div>
@ -430,6 +436,7 @@
</div>
</div>
</div>
<p class="text-xs">You also get 25% more daily rewards.</p>
</Card.Content>
</Card.Root>
{/if}