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">
|
||||
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: {
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
Reference in a new issue