added mascot clicking

This commit is contained in:
2025-08-03 21:05:07 +05:30
parent 7f48a70473
commit 40b8f367fe
15 changed files with 341 additions and 19 deletions

View File

@@ -4,7 +4,7 @@ import { createClerkClient, verifyToken } from '@clerk/backend';
interface GameState {
totalClicks: number;
users: Record<string, { name: string; clicks: number; lastSeen: number }>;
users: Record<string, { name: string; clicks: number; lastSeen: number; bonusMultiplier: number }>; // Added bonusMultiplier
upgrades: Record<string, { owned: number; cost: number }>;
milestones: Record<string, boolean>;
clickMultiplier: number;
@@ -28,18 +28,24 @@ interface PurchaseUpgradeMessage extends AuthenticatedMessage {
upgradeId: string;
}
interface ApplyMultiplierBonusMessage extends AuthenticatedMessage { // New message type
type: 'apply-multiplier-bonus';
multiplierBonus: number;
}
interface UserJoinMessage extends AuthenticatedMessage {
type: 'user-join';
}
type Message = ClickMessage | PurchaseUpgradeMessage | UserJoinMessage;
type Message = ClickMessage | PurchaseUpgradeMessage | ApplyMultiplierBonusMessage | UserJoinMessage; // Updated Message type
const UPGRADES = {
clickMultiplier: { baseCost: 10, multiplier: 1.5, clickBonus: 1 },
autoClicker: { baseCost: 50, multiplier: 2, autoClickRate: 1 },
megaBonus: { baseCost: 200, multiplier: 2.5, clickBonus: 5 },
hyperClicker: { baseCost: 1000, multiplier: 3, autoClickRate: 10 },
quantumClicker: { baseCost: 5000, multiplier: 4, clickBonus: 50 }
quantumClicker: { baseCost: 5000, multiplier: 4, clickBonus: 50 },
friendBoost: { baseCost: 2000, multiplier: 3, clickMultiplierBonus: 1.02 } // Renamed from shoominions upgrade
};
const MILESTONES = [
@@ -103,11 +109,16 @@ export default class GameServer implements Party.Server {
this.gameState.users[authenticatedUserId] = {
name: data.userName, // Use the name provided by the client, which comes from Clerk
clicks: 0,
lastSeen: Date.now()
lastSeen: Date.now(),
bonusMultiplier: 1 // Initialize bonus multiplier
};
}
this.gameState.users[authenticatedUserId].lastSeen = Date.now();
this.gameState.users[authenticatedUserId].name = data.userName; // Update name in case it changed
// Ensure bonusMultiplier is initialized if it somehow wasn't
if (this.gameState.users[authenticatedUserId].bonusMultiplier === undefined) {
this.gameState.users[authenticatedUserId].bonusMultiplier = 1;
}
switch (data.type) {
case 'user-join':
@@ -119,6 +130,9 @@ export default class GameServer implements Party.Server {
case 'purchase-upgrade':
this.handlePurchaseUpgrade(data, authenticatedUserId);
break;
case 'apply-multiplier-bonus': // Handle new message type
this.handleApplyMultiplierBonus(data, authenticatedUserId);
break;
}
} catch (error) {
console.error('Clerk token verification failed:', error);
@@ -145,7 +159,9 @@ export default class GameServer implements Party.Server {
}
handleClick(data: ClickMessage, authenticatedUserId: string) {
const clickValue = this.gameState.clickMultiplier;
// Apply global click multiplier and user-specific bonus multiplier
const userBonusMultiplier = this.gameState.users[authenticatedUserId]?.bonusMultiplier || 1;
const clickValue = this.gameState.clickMultiplier * userBonusMultiplier;
this.gameState.totalClicks += clickValue;
@@ -154,7 +170,8 @@ export default class GameServer implements Party.Server {
this.gameState.users[authenticatedUserId] = {
name: data.userName, // Use the name from the client, which comes from Clerk
clicks: 0,
lastSeen: Date.now()
lastSeen: Date.now(),
bonusMultiplier: 1 // Initialize if user was just created
};
}
@@ -164,6 +181,16 @@ export default class GameServer implements Party.Server {
this.checkMilestones();
}
handleApplyMultiplierBonus(data: ApplyMultiplierBonusMessage, authenticatedUserId: string) {
if (!this.gameState.users[authenticatedUserId]) {
console.warn(`User ${authenticatedUserId} not found for multiplier bonus application.`);
return;
}
// Apply the compounding multiplier bonus
this.gameState.users[authenticatedUserId].bonusMultiplier *= data.multiplierBonus;
console.log(`User ${authenticatedUserId} bonus multiplier updated to: ${this.gameState.users[authenticatedUserId].bonusMultiplier}`);
}
handlePurchaseUpgrade(data: PurchaseUpgradeMessage, authenticatedUserId: string) {
const upgrade = UPGRADES[data.upgradeId as keyof typeof UPGRADES];
const currentUpgrade = this.gameState.upgrades[data.upgradeId];
@@ -193,6 +220,8 @@ export default class GameServer implements Party.Server {
if ('autoClickRate' in config && config.autoClickRate) {
this.gameState.autoClickRate += config.autoClickRate * upgrade.owned;
}
// Note: clickMultiplierBonus from upgrades.ts is handled client-side for spawning frequency
// and applied per-click on the server via handleApplyMultiplierBonus
});
this.setupAutoClicker();