Files
gioco-mobile/server/src/jobs/updateMarketPrices.job.ts
T

42 lines
1.5 KiB
TypeScript
Raw Normal View History

2026-06-09 23:42:04 +02:00
import { balance } from '../config/gameBalance.js';
import { prisma } from '../db/prisma.js';
import { getActiveEvents, priceModifierForCity } from '../modules/events/events.service.js';
import { clampDemandSupply, computePrices } from '../modules/market/pricing.js';
import { emitGlobal } from '../realtime/socket.js';
/**
* Tick del mercato (ogni minuto): domanda e offerta tornano lentamente
* verso l'equilibrio e i prezzi vengono ricalcolati con i modificatori
* degli eventi attivi.
*/
export async function updateMarketPrices(): Promise<void> {
const m = balance.market;
const [events, prices] = await Promise.all([
getActiveEvents(),
prisma.marketPrice.findMany({ include: { item: true, city: true } }),
]);
const updates = prices.map((price) => {
const demand = clampDemandSupply(
price.demand * m.decayFactor + m.equilibrium * (1 - m.decayFactor),
);
const supply = clampDemandSupply(
price.supply * m.decayFactor + m.equilibrium * (1 - m.decayFactor),
);
const next = computePrices(
price.item.basePrice,
price.city.economyModifier,
demand,
supply,
priceModifierForCity(events, price.cityId),
);
return prisma.marketPrice.update({
where: { cityId_itemId: { cityId: price.cityId, itemId: price.itemId } },
data: { demand, supply, buyPrice: next.buyPrice, sellPrice: next.sellPrice },
});
});
await prisma.$transaction(updates);
emitGlobal('market:updated', { updatedAt: new Date().toISOString() });
}