Kord/prisma/seed.ts

117 lines
3.4 KiB
TypeScript

import { Pool } from 'pg';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@prisma/client';
import 'dotenv/config';
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const adapter = new PrismaPg(pool);
const prisma = new PrismaClient({ adapter });
async function main() {
console.log('🌱 Start seeding refinement balance data...');
// 1. Refinement System Config (Global)
const systemConfigs = [
{ key: 'MAX_LEVEL', value: '25', description: 'Maximum weapon level' },
{ key: 'START_GOLD', value: '1000', description: 'Initial gold for new players' },
{ key: 'CHECKIN_GOLD', value: '500', description: 'Gold awarded for daily check-in' },
{ key: 'DAILY_BATTLE_LIMIT', value: '10', description: 'Maximum battles per day' },
{ key: 'INVERSE_REWARD_MULTIPLIER', value: '2.0', description: 'Base multiplier for battle rewards' },
{ key: 'REWARD_RANDOM_MIN', value: '0.8', description: 'Minimum random factor for rewards' },
{ key: 'REWARD_RANDOM_MAX', value: '1.2', description: 'Maximum random factor for rewards' },
];
for (const config of systemConfigs) {
await prisma.refinementSystemConfig.upsert({
where: { key: config.key },
update: config,
create: config,
});
}
// 2. Refinement Level Config (0-25)
const levelConfigs = [];
for (let l = 0; l <= 25; l++) {
let successRate = 0;
if (l === 0) successRate = 1.0;
else if (l === 1) successRate = 0.98;
else if (l === 2) successRate = 0.95;
else if (l === 3) successRate = 0.92;
else if (l === 4) successRate = 0.90;
else if (l === 5) successRate = 0.05;
else if (l === 6) successRate = 0.04;
else if (l === 7) successRate = 0.03;
else if (l === 8) successRate = 0.02;
else if (l < 10) successRate = 0.01;
else if (l < 20) successRate = 0.001;
else successRate = 0.0001;
const cost = Math.floor(10 * Math.pow(1.6, l));
const destroyRate = l * 0.015;
const sellMultiplier = l < 5 ? 2.0 : 2 + (l - 4) * 10;
levelConfigs.push({
level: l,
successRate,
destroyRate,
cost,
sellMultiplier,
});
}
for (const config of levelConfigs) {
await prisma.refinementLevelConfig.upsert({
where: { level: config.level },
update: config,
create: config,
});
}
// 3. Refinement Battle Config (Gap)
const battleConfigs = [];
for (let g = 0; g <= 25; g++) {
battleConfigs.push({ gap: g, winRate: Math.min(0.99, 0.5 + g * 0.05) });
}
const negativeGaps = [
{ gap: -1, rate: 0.4 },
{ gap: -2, rate: 0.3 },
{ gap: -3, rate: 0.2 },
{ gap: -4, rate: 0.1 },
{ gap: -5, rate: 0.05 },
{ gap: -6, rate: 0.04 },
{ gap: -7, rate: 0.03 },
{ gap: -8, rate: 0.02 },
{ gap: -9, rate: 0.01 },
];
for (const n of negativeGaps) {
battleConfigs.push({ gap: n.gap, winRate: n.rate });
}
for (let g = -10; g >= -25; g--) {
battleConfigs.push({ gap: g, winRate: 0 });
}
for (const config of battleConfigs) {
await prisma.refinementBattleConfig.upsert({
where: { levelGap: config.gap },
update: { winRate: config.winRate },
create: { levelGap: config.gap, winRate: config.winRate },
});
}
console.log('✅ Seeding completed!');
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
await pool.end();
});