// Seeds a demo campaign for local dev. Species/classes/skills are NOT seeded // as rows — they're fixed game-rule tables ported into src/game/data/*.js and // used directly by the calculation engine. Weapons ARE seeded, but only into // this demo campaign (weapons are per-campaign in the schema, since a DM can // add homebrew weapons). const path = require('path'); const bcrypt = require('bcrypt'); const { PrismaClient } = require('@prisma/client'); const { generateInviteCode } = require('../src/utils/inviteCode'); const prisma = new PrismaClient(); const weapons = require(path.join(__dirname, '..', 'seed-data', 'weapons.json')); async function main() { const passwordHash = await bcrypt.hash('password123', 12); const dm = await prisma.user.upsert({ where: { email: 'dm@example.com' }, update: {}, create: { email: 'dm@example.com', passwordHash, displayName: 'Dungeon Master' }, }); const player = await prisma.user.upsert({ where: { email: 'player@example.com' }, update: {}, create: { email: 'player@example.com', passwordHash, displayName: 'Test Player' }, }); let campaign = await prisma.campaign.findFirst({ where: { name: 'The Sunken Reach (Demo)' } }); if (!campaign) { campaign = await prisma.campaign.create({ data: { name: 'The Sunken Reach (Demo)', description: 'A demo campaign seeded for local development.', inviteCode: generateInviteCode(), startingGold: 15, startingItemCount: 2, startingSpellCount: 2, ownerId: dm.id, members: { create: [ { userId: dm.id, role: 'DM' }, { userId: player.id, role: 'PLAYER' }, ], }, }, }); } for (const weapon of weapons) { const existing = await prisma.weapon.findFirst({ where: { campaignId: campaign.id, name: weapon.name } }); if (!existing) { await prisma.weapon.create({ data: { ...weapon, campaignId: campaign.id } }); } } console.log('Seed complete.'); console.log(` DM login: dm@example.com / password123`); console.log(` Player login: player@example.com / password123`); console.log(` Campaign invite code: ${campaign.inviteCode}`); } main() .catch((err) => { console.error(err); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });