more daily bonus for prestige
This commit is contained in:
parent
96cb799cc7
commit
ee29f97ca4
4 changed files with 47 additions and 11 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Button } from '$lib/components/ui/button';
|
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 { USER_DATA } from '$lib/stores/user-data';
|
||||||
import { fetchPortfolioSummary } from '$lib/stores/portfolio-data';
|
import { fetchPortfolioSummary } from '$lib/stores/portfolio-data';
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
@ -11,6 +11,8 @@
|
||||||
canClaim: boolean;
|
canClaim: boolean;
|
||||||
rewardAmount: number;
|
rewardAmount: number;
|
||||||
baseReward: number;
|
baseReward: number;
|
||||||
|
prestigeBonus?: number;
|
||||||
|
prestigeLevel?: number;
|
||||||
timeRemaining: number;
|
timeRemaining: number;
|
||||||
nextClaimTime: string | null;
|
nextClaimTime: string | null;
|
||||||
totalRewardsClaimed: number;
|
totalRewardsClaimed: number;
|
||||||
|
|
@ -67,9 +69,13 @@
|
||||||
const result = await response.json();
|
const result = await response.json();
|
||||||
claimState = 'success';
|
claimState = 'success';
|
||||||
|
|
||||||
|
const prestigeBonus = result.prestigeBonus || 0;
|
||||||
|
const hasPrestigeBonus = prestigeBonus > 0;
|
||||||
|
|
||||||
toast.success(`Daily reward claimed! +$${formatCurrency(result.rewardAmount)}`, {
|
toast.success(`Daily reward claimed! +$${formatCurrency(result.rewardAmount)}`, {
|
||||||
description:
|
description: hasPrestigeBonus
|
||||||
rewardStatus.loginStreak > 0
|
? `Base: $${formatCurrency(result.baseReward)} + Prestige bonus: $${formatCurrency(prestigeBonus)} | Streak: ${rewardStatus.loginStreak} days 🔥`
|
||||||
|
: rewardStatus.loginStreak > 0
|
||||||
? `Login streak: ${rewardStatus.loginStreak} days 🔥`
|
? `Login streak: ${rewardStatus.loginStreak} days 🔥`
|
||||||
: undefined,
|
: undefined,
|
||||||
action: {
|
action: {
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,7 @@ export const POST: RequestHandler = async ({ request, locals }) => {
|
||||||
.set({
|
.set({
|
||||||
baseCurrencyBalance: '100.00000000',
|
baseCurrencyBalance: '100.00000000',
|
||||||
prestigeLevel: nextPrestige,
|
prestigeLevel: nextPrestige,
|
||||||
|
lastRewardClaim: null,
|
||||||
updatedAt: new Date()
|
updatedAt: new Date()
|
||||||
})
|
})
|
||||||
.where(eq(user.id, userId));
|
.where(eq(user.id, userId));
|
||||||
|
|
@ -92,7 +93,7 @@ export const POST: RequestHandler = async ({ request, locals }) => {
|
||||||
userId: userId,
|
userId: userId,
|
||||||
type: 'SYSTEM',
|
type: 'SYSTEM',
|
||||||
title: `${prestigeName} Achieved!`,
|
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({
|
return json({
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,19 @@ const REWARD_TIERS = [
|
||||||
4000, // Day 8+
|
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 {
|
function calculateStreak(lastClaim: Date | null, currentStreak: number): number {
|
||||||
if (!lastClaim) return 1;
|
if (!lastClaim) return 1;
|
||||||
|
|
||||||
|
|
@ -33,11 +46,14 @@ function calculateStreak(lastClaim: Date | null, currentStreak: number): number
|
||||||
return currentStreak;
|
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 tierIndex = Math.min(streak - 1, REWARD_TIERS.length - 1);
|
||||||
const base = REWARD_TIERS[tierIndex];
|
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 }) => {
|
export const POST: RequestHandler = async ({ request }) => {
|
||||||
|
|
@ -53,7 +69,8 @@ export const POST: RequestHandler = async ({ request }) => {
|
||||||
baseCurrencyBalance: user.baseCurrencyBalance,
|
baseCurrencyBalance: user.baseCurrencyBalance,
|
||||||
lastRewardClaim: user.lastRewardClaim,
|
lastRewardClaim: user.lastRewardClaim,
|
||||||
totalRewardsClaimed: user.totalRewardsClaimed,
|
totalRewardsClaimed: user.totalRewardsClaimed,
|
||||||
loginStreak: user.loginStreak
|
loginStreak: user.loginStreak,
|
||||||
|
prestigeLevel: user.prestigeLevel
|
||||||
})
|
})
|
||||||
.from(user)
|
.from(user)
|
||||||
.where(eq(user.id, userId))
|
.where(eq(user.id, userId))
|
||||||
|
|
@ -78,7 +95,7 @@ export const POST: RequestHandler = async ({ request }) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const newStreak = calculateStreak(currentUser.lastRewardClaim, currentUser.loginStreak || 0);
|
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 currentBalance = parseFloat(currentUser.baseCurrencyBalance || '0');
|
||||||
const currentTotalRewards = parseFloat(currentUser.totalRewardsClaimed || '0');
|
const currentTotalRewards = parseFloat(currentUser.totalRewardsClaimed || '0');
|
||||||
|
|
@ -98,6 +115,8 @@ export const POST: RequestHandler = async ({ request }) => {
|
||||||
success: true,
|
success: true,
|
||||||
rewardAmount: reward.total,
|
rewardAmount: reward.total,
|
||||||
baseReward: reward.base,
|
baseReward: reward.base,
|
||||||
|
prestigeBonus: reward.prestigeBonus,
|
||||||
|
prestigeLevel: currentUser.prestigeLevel || 0,
|
||||||
newBalance,
|
newBalance,
|
||||||
totalRewardsClaimed: newTotalRewards,
|
totalRewardsClaimed: newTotalRewards,
|
||||||
loginStreak: newStreak,
|
loginStreak: newStreak,
|
||||||
|
|
@ -115,7 +134,8 @@ export const GET: RequestHandler = async ({ request }) => {
|
||||||
baseCurrencyBalance: user.baseCurrencyBalance,
|
baseCurrencyBalance: user.baseCurrencyBalance,
|
||||||
lastRewardClaim: user.lastRewardClaim,
|
lastRewardClaim: user.lastRewardClaim,
|
||||||
totalRewardsClaimed: user.totalRewardsClaimed,
|
totalRewardsClaimed: user.totalRewardsClaimed,
|
||||||
loginStreak: user.loginStreak
|
loginStreak: user.loginStreak,
|
||||||
|
prestigeLevel: user.prestigeLevel
|
||||||
})
|
})
|
||||||
.from(user)
|
.from(user)
|
||||||
.where(eq(user.id, Number(session.user.id)))
|
.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 potentialStreak = calculateStreak(currentUser.lastRewardClaim, currentUser.loginStreak || 0);
|
||||||
const reward = calculateReward(potentialStreak);
|
const reward = calculateReward(potentialStreak, currentUser.prestigeLevel || 0);
|
||||||
|
|
||||||
return json({
|
return json({
|
||||||
canClaim,
|
canClaim,
|
||||||
rewardAmount: reward.total,
|
rewardAmount: reward.total,
|
||||||
baseReward: reward.base,
|
baseReward: reward.base,
|
||||||
|
prestigeBonus: reward.prestigeBonus,
|
||||||
|
prestigeLevel: currentUser.prestigeLevel || 0,
|
||||||
timeRemaining,
|
timeRemaining,
|
||||||
nextClaimTime,
|
nextClaimTime,
|
||||||
totalRewardsClaimed: Number(currentUser.totalRewardsClaimed || 0),
|
totalRewardsClaimed: Number(currentUser.totalRewardsClaimed || 0),
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,12 @@
|
||||||
{/if}
|
{/if}
|
||||||
<li>Total portfolio value: {formatValue(totalValue)}</li>
|
<li>Total portfolio value: {formatValue(totalValue)}</li>
|
||||||
</ul>
|
</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.
|
We will automatically sell all your coin holdings.
|
||||||
</AlertDescription>
|
</AlertDescription>
|
||||||
</Alert>
|
</Alert>
|
||||||
|
|
@ -245,7 +251,7 @@
|
||||||
<div>
|
<div>
|
||||||
<p class="font-medium">Gain Status</p>
|
<p class="font-medium">Gain Status</p>
|
||||||
<p class="text-muted-foreground text-sm">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -430,6 +436,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<p class="text-xs">You also get 25% more daily rewards.</p>
|
||||||
</Card.Content>
|
</Card.Content>
|
||||||
</Card.Root>
|
</Card.Root>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
||||||
Reference in a new issue