added mascot clicking
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user