db+game: ship_systems table + starting ship seed (new game and v4 backfill step)

This commit is contained in:
2026-09-28 23:32:04 +00:00
parent c7580d92bd
commit 0910891995
5 changed files with 108 additions and 3 deletions
+15 -1
View File
@@ -1,4 +1,4 @@
import { integer, primaryKey, real, sqliteTable, text } from 'drizzle-orm/sqlite-core'
import { integer, primaryKey, real, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'
// Drizzle schema for game state. Single-player by design: exactly ONE save row ever exists
// (no auth/accounts), so every table hangs off saves.id but only one save is in play.
@@ -74,6 +74,20 @@ export const crew = sqliteTable('crew', {
origin: text('origin').notNull(),
})
// The ship's systems, one row per known type (see SHIP_TYPES in lib/game/ship-costs.ts).
// `built` is derived, not stored: level > 0 means built — unbuilt rows sit at level/capacity 0.
export const shipSystems = sqliteTable(
'ship_systems',
{
id: integer('id').primaryKey({ autoIncrement: true }),
saveId: integer('save_id').notNull().references(() => saves.id),
type: text('type').notNull(),
level: integer('level').notNull().default(0), // 0 = not built yet
capacity: integer('capacity').notNull().default(0),
},
(t) => [uniqueIndex('ship_systems_save_type_unique').on(t.saveId, t.type)],
)
// Append-only game log. Writers so far: new-game + jump events; later issues add more
// writers and a read endpoint.
export const events = sqliteTable('events', {