generator client { provider = "prisma-client-js" output = "./generated/game" engineType = "binary" } datasource db { provider = "postgresql" } enum LogScope { SYSTEM NATION GENERAL USER } enum LogCategory { HISTORY SUMMARY ACTION BATTLE_BRIEF BATTLE_DETAIL USER } enum AuctionStatus { OPEN FINALIZING FINISHED CANCELED } enum AuctionType { BUY_RICE SELL_RICE UNIQUE_ITEM } enum DiplomacyLetterState { PROPOSED ACTIVATED CANCELLED REPLACED } enum InputEventStatus { PENDING PROCESSING SUCCEEDED FAILED } enum InputEventTarget { API ENGINE } model InputEvent { sequence BigInt @id @default(autoincrement()) requestId String @unique @map("request_id") target InputEventTarget eventType String @map("event_type") payload Json @default(dbgenerated("'{}'::jsonb")) actorUserId String? @map("actor_user_id") status InputEventStatus @default(PENDING) result Json? error String? attempts Int @default(0) lockedBy String? @map("locked_by") leaseUntil DateTime? @map("lease_until") createdAt DateTime @default(now()) @map("created_at") processingAt DateTime? @map("processing_at") completedAt DateTime? @map("completed_at") @@index([target, status, sequence]) @@map("input_event") } model TurnDaemonLease { profile String @id ownerId String @map("owner_id") leaseUntil DateTime @map("lease_until") fencingEpoch BigInt @default(1) @map("fencing_epoch") heartbeatAt DateTime @default(now()) @map("heartbeat_at") @@map("turn_daemon_lease") } model WorldState { id Int @id @default(autoincrement()) scenarioCode String @map("scenario_code") currentYear Int @map("current_year") currentMonth Int @map("current_month") tickSeconds Int @map("tick_seconds") config Json @default(dbgenerated("'{}'::jsonb")) meta Json @default(dbgenerated("'{}'::jsonb")) updatedAt DateTime @updatedAt @map("updated_at") @@map("world_state") } model Nation { id Int @id name String color String capitalCityId Int? @map("capital_city_id") chiefGeneralId Int? @map("chief_general_id") gold Int @default(0) rice Int @default(0) tech Float @default(0) level Int @default(0) typeCode String @default("che_중립") @map("type_code") meta Json @default(dbgenerated("'{}'::jsonb")) @@map("nation") } model City { id Int @id name String level Int nationId Int @default(0) @map("nation_id") supplyState Int @default(1) @map("supply_state") frontState Int @default(0) @map("front_state") population Int @map("pop") populationMax Int @map("pop_max") agriculture Int @map("agri") agricultureMax Int @map("agri_max") commerce Int @map("comm") commerceMax Int @map("comm_max") security Int @map("secu") securityMax Int @map("secu_max") trust Float @default(0) @db.Real trade Int? @default(100) defence Int @map("def") defenceMax Int @map("def_max") wall Int @map("wall") wallMax Int @map("wall_max") region Int conflict Json @default(dbgenerated("'{}'::jsonb")) meta Json @default(dbgenerated("'{}'::jsonb")) @@map("city") } model General { id Int @id userId String? @map("user_id") name String nationId Int @default(0) @map("nation_id") cityId Int @default(0) @map("city_id") troopId Int @default(0) @map("troop_id") npcState Int @default(0) @map("npc_state") affinity Int? bornYear Int @default(180) @map("born_year") deadYear Int @default(300) @map("dead_year") picture String? imageServer Int @default(0) @map("image_server") leadership Int @default(50) strength Int @default(50) intel Int @default(50) injury Int @default(0) experience Int @default(0) dedication Int @default(0) officerLevel Int @default(0) @map("officer_level") gold Int @default(1000) rice Int @default(1000) crew Int @default(0) crewTypeId Int @default(0) @map("crew_type_id") train Int @default(0) atmos Int @default(0) weaponCode String @default("None") @map("weapon_code") bookCode String @default("None") @map("book_code") horseCode String @default("None") @map("horse_code") itemCode String @default("None") @map("item_code") turnTime DateTime @map("turn_time") recentWarTime DateTime? @map("recent_war_time") age Int @default(20) startAge Int @default(20) @map("start_age") personalCode String @default("None") @map("personal_code") specialCode String @default("None") @map("special_code") special2Code String @default("None") @map("special2_code") lastTurn Json @default(dbgenerated("'{}'::jsonb")) @map("last_turn") meta Json @default(dbgenerated("'{}'::jsonb")) penalty Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @default(now()) @map("updated_at") @@map("general") } model GeneralAccessLog { id Int @id @default(autoincrement()) generalId Int @unique @map("general_id") userId String? @map("user_id") lastRefresh DateTime? @map("last_refresh") refresh Int @default(0) refreshTotal Int @default(0) @map("refresh_total") refreshScore Int @default(0) @map("refresh_score") refreshScoreTotal Int @default(0) @map("refresh_score_total") @@index([userId]) @@map("general_access_log") } model MessageReadState { generalId Int @id @map("general_id") latestPrivateMessage Int @default(0) @map("latest_private_message") latestDiplomacyMessage Int @default(0) @map("latest_diplomacy_message") updatedAt DateTime @updatedAt @map("updated_at") @@map("message_read_state") } model Message { id Int @id @default(autoincrement()) mailbox Int type String src Int dest Int time DateTime validUntil DateTime @map("valid_until") message Json @@map("message") } model RankData { id Int @id @default(autoincrement()) nationId Int @default(0) @map("nation_id") generalId Int @map("general_id") type String @db.VarChar(20) value Int @default(0) @@unique([generalId, type]) @@index([type, value], name: "by_type") @@index([nationId, type, value], name: "by_nation") @@map("rank_data") } model HallOfFame { id Int @id @default(autoincrement()) serverId String @map("server_id") season Int scenario Int generalNo Int @map("general_no") type String @db.VarChar(20) value Float owner String? @map("owner") aux Json @default(dbgenerated("'{}'::jsonb")) @@unique([serverId, type, generalNo]) @@unique([owner, serverId, type], name: "hall_owner") @@index([serverId, type, value], name: "server_show") @@index([season, scenario, type, value], name: "scenario") @@map("hall") } model GameHistory { id Int @id @default(autoincrement()) serverId String @map("server_id") date DateTime winnerNation Int? @map("winner_nation") map String? @map("map") season Int scenario Int scenarioName String @map("scenario_name") env Json @default(dbgenerated("'{}'::jsonb")) @@unique([serverId]) @@index([date]) @@map("ng_games") } model OldNation { id Int @id @default(autoincrement()) serverId String @map("server_id") nation Int @default(0) data Json @default(dbgenerated("'{}'::jsonb")) date DateTime @default(now()) @@unique([serverId, nation]) @@index([serverId, nation], name: "by_server") @@map("ng_old_nations") } model OldGeneral { id Int @id @default(autoincrement()) serverId String @map("server_id") generalNo Int @map("general_no") owner String? @map("owner") name String lastYearMonth Int @map("last_yearmonth") turnTime DateTime @map("turntime") data Json @default(dbgenerated("'{}'::jsonb")) @@unique([serverId, generalNo], name: "by_no") @@index([serverId, name], name: "by_name") @@index([owner, serverId], name: "owner") @@map("ng_old_generals") } model Emperor { id Int @id @default(autoincrement()) @map("no") serverId String? @map("server_id") phase String? @default("") nationCount String? @map("nation_count") nationName String? @map("nation_name") nationHist String? @map("nation_hist") genCount String? @map("gen_count") personalHist String? @map("personal_hist") specialHist String? @map("special_hist") name String? @default("") type String? @default("") color String? @default("") year Int? @default(0) month Int? @default(0) power Int? @default(0) gennum Int? @default(0) citynum Int? @default(0) pop String? @default("0") poprate String? @default("") gold Int? @default(0) rice Int? @default(0) l12name String? @default("") l12pic String? @default("") l11name String? @default("") l11pic String? @default("") l10name String? @default("") l10pic String? @default("") l9name String? @default("") l9pic String? @default("") l8name String? @default("") l8pic String? @default("") l7name String? @default("") l7pic String? @default("") l6name String? @default("") l6pic String? @default("") l5name String? @default("") l5pic String? @default("") tiger String? @default("") eagle String? @default("") gen String? @default("") history Json @default(dbgenerated("'{}'::jsonb")) aux Json @default(dbgenerated("'{}'::jsonb")) @@map("emperior") } model Troop { troopLeaderId Int @id @map("troop_leader") nationId Int @map("nation") name String @@map("troop") } model GeneralTurn { id Int @id @default(autoincrement()) generalId Int @map("general_id") turnIdx Int @map("turn_idx") actionCode String @map("action_code") arg Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@unique([generalId, turnIdx]) @@map("general_turn") } model NationTurn { id Int @id @default(autoincrement()) nationId Int @map("nation_id") officerLevel Int @map("officer_level") turnIdx Int @map("turn_idx") actionCode String @map("action_code") arg Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@unique([nationId, officerLevel, turnIdx]) @@map("nation_turn") } model Diplomacy { id Int @id @default(autoincrement()) srcNationId Int @map("src_nation_id") destNationId Int @map("dest_nation_id") stateCode Int @map("state_code") term Int @default(0) isDead Boolean @default(false) @map("is_dead") isShowing Boolean @default(true) @map("is_showing") meta Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@unique([srcNationId, destNationId]) @@map("diplomacy") } model DiplomacyLetter { id Int @id @default(autoincrement()) srcNationId Int @map("src_nation_id") destNationId Int @map("dest_nation_id") prevId Int? @map("prev_id") state DiplomacyLetterState @default(PROPOSED) textBrief String @map("text_brief") textDetail String @map("text_detail") date DateTime @default(now()) @map("date") srcSignerId Int @map("src_signer") destSignerId Int? @map("dest_signer") aux Json @default(dbgenerated("'{}'::jsonb")) @@index([srcNationId, destNationId]) @@index([destNationId, srcNationId]) @@index([state, date]) @@map("diplomacy_letter") } model YearbookHistory { id Int @id @default(autoincrement()) profileName String @map("profile_name") year Int month Int map Json nations Json hash String @default("") createdAt DateTime @default(now()) @map("created_at") @@unique([profileName, year, month]) @@index([profileName, year, month]) @@map("yearbook_history") } model Event { id Int @id @default(autoincrement()) targetCode String @map("target_code") priority Int @default(0) condition Json @default(dbgenerated("'{}'::jsonb")) action Json @default(dbgenerated("'{}'::jsonb")) meta Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@map("event") } model LogEntry { id Int @id @default(autoincrement()) scope LogScope category LogCategory subType String? @map("sub_type") year Int month Int text String generalId Int? @map("general_id") nationId Int? @map("nation_id") userId Int? @map("user_id") meta Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@index([scope, category, id]) @@index([generalId, category, id]) @@index([nationId, category, id]) @@index([userId, category, id]) @@map("log_entry") } model ErrorLog { id Int @id @default(autoincrement()) category String source String? @map("source") message String trace String? context Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@index([category, id]) @@map("error_log") } model InheritancePoint { id Int @id @default(autoincrement()) userId String @map("user_id") key String value Float @default(0) aux Json @default(dbgenerated("'{}'::jsonb")) updatedAt DateTime @updatedAt @map("updated_at") @@unique([userId, key]) @@index([userId]) @@map("inheritance_point") } model NationBetting { id Int @id type String @default("bettingNation") name String finished Boolean @default(false) selectCount Int @map("select_count") isExclusive Boolean? @map("is_exclusive") requiresInheritancePoint Boolean @default(true) @map("requires_inheritance_point") openYearMonth Int @map("open_year_month") closeYearMonth Int @map("close_year_month") candidates Json winner Json? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") bets NationBet[] @@index([type, id]) @@map("nation_betting") } model NationBet { id Int @id @default(autoincrement()) bettingId Int @map("betting_id") generalId Int @map("general_id") userId String? @map("user_id") selection Json selectionKey String @map("selection_key") amount Float createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") betting NationBetting @relation(fields: [bettingId], references: [id], onDelete: Cascade) @@unique([bettingId, userId, selectionKey]) @@index([bettingId]) @@index([bettingId, userId]) @@map("nation_bet") } model InheritanceLog { id Int @id @default(autoincrement()) userId String @map("user_id") year Int month Int text String createdAt DateTime @default(now()) @map("created_at") @@index([userId, id]) @@map("inheritance_log") } model InheritanceResult { id Int @id @default(autoincrement()) serverId String @map("server_id") owner String @map("owner") generalId Int @map("general_id") year Int month Int value Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") @@index([serverId, owner]) @@map("inheritance_result") } model Auction { id Int @id @default(autoincrement()) type AuctionType targetCode String? @map("target_code") hostGeneralId Int @map("host_general_id") hostName String? @map("host_name") detail Json @default(dbgenerated("'{}'::jsonb")) status AuctionStatus @default(OPEN) closeAt DateTime @map("close_at") latestEventId String @default("") @map("latest_event_id") latestEventAt DateTime @default(now()) @map("latest_event_at") finalizingAt DateTime? @map("finalizing_at") finishedAt DateTime? @map("finished_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") bids AuctionBid[] @@index([status, closeAt]) @@map("auction") } model AuctionBid { id Int @id @default(autoincrement()) auctionId Int @map("auction_id") generalId Int @map("general_id") amount Int eventId String @map("event_id") eventAt DateTime @map("event_at") meta Json @default(dbgenerated("'{}'::jsonb")) createdAt DateTime @default(now()) @map("created_at") auction Auction @relation(fields: [auctionId], references: [id], onDelete: Cascade) @@index([auctionId, amount]) @@index([auctionId, eventAt]) @@map("auction_bid") } model InheritanceUserState { userId String @id @map("user_id") meta Json @default(dbgenerated("'{}'::jsonb")) updatedAt DateTime @updatedAt @map("updated_at") @@map("inheritance_user_state") } model BoardPost { id Int @id @default(autoincrement()) nationId Int @map("nation_id") isSecret Boolean @default(false) @map("is_secret") authorGeneralId Int @map("author_general_id") authorName String @map("author_name") title String contentHtml String @map("content_html") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") comments BoardComment[] @@index([nationId, isSecret, createdAt]) @@map("board_post") } model BoardComment { id Int @id @default(autoincrement()) postId Int @map("post_id") nationId Int @map("nation_id") isSecret Boolean @default(false) @map("is_secret") authorGeneralId Int @map("author_general_id") authorName String @map("author_name") contentText String @map("content_text") createdAt DateTime @default(now()) @map("created_at") post BoardPost @relation(fields: [postId], references: [id], onDelete: Cascade) @@index([postId, createdAt]) @@map("board_comment") } model VotePoll { id Int @id @default(autoincrement()) title String body String @default("") options Json multipleOptions Int @default(1) @map("multiple_options") revealMode String @map("reveal_mode") openerGeneralId Int @map("opener_general_id") openerName String @map("opener_name") startAt DateTime @default(now()) @map("start_at") endAt DateTime? @map("end_at") closedAt DateTime? @map("closed_at") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") votes Vote[] comments VoteComment[] @@map("vote_poll") } model Vote { id Int @id @default(autoincrement()) voteId Int @map("vote_id") generalId Int @map("general_id") nationId Int @map("nation_id") selection Json createdAt DateTime @default(now()) @map("created_at") poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade) @@unique([voteId, generalId]) @@index([voteId]) @@map("vote") } model VoteComment { id Int @id @default(autoincrement()) voteId Int @map("vote_id") generalId Int @map("general_id") nationId Int @map("nation_id") generalName String @map("general_name") nationName String @map("nation_name") text String createdAt DateTime @default(now()) @map("created_at") poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade) @@index([voteId, createdAt]) @@map("vote_comment") }