From 1d811031caa4b525f46a8f01167beb56508784f6 Mon Sep 17 00:00:00 2001 From: Mathias Gruber Date: Sun, 20 Oct 2024 09:58:29 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Allow=20modification=20&=20addition?= =?UTF-8?q?=20of=20new=20combat=20assets.=20Properly=20overlay=20in=20comb?= =?UTF-8?q?at?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/drizzle/migrations/0158_careful_bucky.sql | 5 + .../migrations/meta/0158_snapshot.json | 6685 +++++++++++++++++ app/drizzle/migrations/meta/_journal.json | 7 + app/drizzle/schema.ts | 8 + app/public/manual/asset.webp | Bin 0 -> 104110 bytes .../app/manual/asset/edit/[assetid]/page.tsx | 77 + app/src/app/manual/asset/page.tsx | 102 + app/src/app/manual/page.tsx | 1 + app/src/components/ui/button.tsx | 1 - app/src/layout/Combat.tsx | 4 +- app/src/layout/ContentImage.tsx | 117 +- app/src/layout/EditContent.tsx | 2 +- app/src/layout/ItemWithEffects.tsx | 37 +- app/src/libs/asset.ts | 61 + app/src/libs/combat/drawing.ts | 19 +- app/src/server/api/root.ts | 2 + app/src/server/api/routers/asset.ts | 132 + app/src/validators/asset.ts | 14 + 18 files changed, 7228 insertions(+), 46 deletions(-) create mode 100644 app/drizzle/migrations/0158_careful_bucky.sql create mode 100644 app/drizzle/migrations/meta/0158_snapshot.json create mode 100644 app/public/manual/asset.webp create mode 100644 app/src/app/manual/asset/edit/[assetid]/page.tsx create mode 100644 app/src/app/manual/asset/page.tsx create mode 100644 app/src/libs/asset.ts create mode 100644 app/src/server/api/routers/asset.ts create mode 100644 app/src/validators/asset.ts diff --git a/app/drizzle/migrations/0158_careful_bucky.sql b/app/drizzle/migrations/0158_careful_bucky.sql new file mode 100644 index 00000000..8a2546f8 --- /dev/null +++ b/app/drizzle/migrations/0158_careful_bucky.sql @@ -0,0 +1,5 @@ +ALTER TABLE `GameAsset` ADD `createdAt` datetime(3) DEFAULT (CURRENT_TIMESTAMP(3)) NOT NULL; +ALTER TABLE `GameAsset` ADD `updatedAt` datetime(3) DEFAULT (CURRENT_TIMESTAMP(3)) NOT NULL; +ALTER TABLE `GameAsset` ADD `licenseDetails` text DEFAULT ('TNR') NOT NULL; +ALTER TABLE `GameAsset` ADD `createdByUserId` varchar(191); +UPDATE `GameAsset` SET licenseDetails = 'UPDATE `GameAsset` SET licenseDetails = "https://craftpix.net/file-licenses/"'; \ No newline at end of file diff --git a/app/drizzle/migrations/meta/0158_snapshot.json b/app/drizzle/migrations/meta/0158_snapshot.json new file mode 100644 index 00000000..967514f7 --- /dev/null +++ b/app/drizzle/migrations/meta/0158_snapshot.json @@ -0,0 +1,6685 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "68a2f7d8-ff62-4299-8361-c186aba27844", + "prevId": "8f6f3309-28b6-4e7a-846f-cfcbda44ce8b", + "tables": { + "ActionLog": { + "name": "ActionLog", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "tableName": { + "name": "tableName", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "changes": { + "name": "changes", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "relatedId": { + "name": "relatedId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "relatedText": { + "name": "relatedText", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "relatedImage": { + "name": "relatedImage", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "ActionLog_userId_idx": { + "name": "ActionLog_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ActionLog_id": { + "name": "ActionLog_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "AiProfile": { + "name": "AiProfile", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rules": { + "name": "rules", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "AiProfile_userId_idx": { + "name": "AiProfile_userId_idx", + "columns": [ + "userId" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "AiProfile_id": { + "name": "AiProfile_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "AnbuSquad": { + "name": "AnbuSquad", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "leaderId": { + "name": "leaderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "pvpActivity": { + "name": "pvpActivity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "kageOrderId": { + "name": "kageOrderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "leaderOrderId": { + "name": "leaderOrderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "AnbuSquad_name_key": { + "name": "AnbuSquad_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "AnbuSquad_leaderId_idx": { + "name": "AnbuSquad_leaderId_idx", + "columns": [ + "leaderId" + ], + "isUnique": false + }, + "AnbuSquad_villageId_idx": { + "name": "AnbuSquad_villageId_idx", + "columns": [ + "villageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "AnbuSquad_id": { + "name": "AnbuSquad_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Badge": { + "name": "Badge", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "Badge_name_key": { + "name": "Badge_name_key", + "columns": [ + "name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Badge_id": { + "name": "Badge_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "BankTransfers": { + "name": "BankTransfers", + "columns": { + "senderId": { + "name": "senderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "receiverId": { + "name": "receiverId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "enum('bank','sensei','recruiter')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'bank'" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "BankTransfers_senderId_idx": { + "name": "BankTransfers_senderId_idx", + "columns": [ + "senderId" + ], + "isUnique": false + }, + "BankTransfers_receiverId_idx": { + "name": "BankTransfers_receiverId_idx", + "columns": [ + "receiverId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "Battle": { + "name": "Battle", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "roundStartAt": { + "name": "roundStartAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "background": { + "name": "background", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "battleType": { + "name": "battleType", + "type": "enum('ARENA','COMBAT','SPARRING','KAGE_CHALLENGE','CLAN_CHALLENGE','CLAN_BATTLE','TOURNAMENT','QUEST','VILLAGE_PROTECTOR','TRAINING')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "usersState": { + "name": "usersState", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "usersEffects": { + "name": "usersEffects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "groundEffects": { + "name": "groundEffects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rewardScaling": { + "name": "rewardScaling", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "version": { + "name": "version", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "round": { + "name": "round", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "activeUserId": { + "name": "activeUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "Battle_id_version_key": { + "name": "Battle_id_version_key", + "columns": [ + "id", + "version" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Battle_id": { + "name": "Battle_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "BattleAction": { + "name": "BattleAction", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "battleId": { + "name": "battleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "battleVersion": { + "name": "battleVersion", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "battleRound": { + "name": "battleRound", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "appliedEffects": { + "name": "appliedEffects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "BattleAction_round_key": { + "name": "BattleAction_round_key", + "columns": [ + "battleId", + "battleVersion", + "battleRound" + ], + "isUnique": true + }, + "BattleAction_createdAt_idx": { + "name": "BattleAction_createdAt_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "BattleAction_id": { + "name": "BattleAction_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "BattleHistory": { + "name": "BattleHistory", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "battleId": { + "name": "battleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "battleType": { + "name": "battleType", + "type": "enum('ARENA','COMBAT','SPARRING','KAGE_CHALLENGE','CLAN_CHALLENGE','CLAN_BATTLE','TOURNAMENT','QUEST','VILLAGE_PROTECTOR','TRAINING')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "attackedId": { + "name": "attackedId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "defenderId": { + "name": "defenderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "BattleHistory_battleId_idx": { + "name": "BattleHistory_battleId_idx", + "columns": [ + "battleId" + ], + "isUnique": false + }, + "BattleHistory_attackedId_idx": { + "name": "BattleHistory_attackedId_idx", + "columns": [ + "attackedId" + ], + "isUnique": false + }, + "BattleHistory_defenderId_idx": { + "name": "BattleHistory_defenderId_idx", + "columns": [ + "defenderId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "BattleHistory_id": { + "name": "BattleHistory_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Bloodline": { + "name": "Bloodline", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "statClassification": { + "name": "statClassification", + "type": "enum('Highest','Ninjutsu','Genjutsu','Taijutsu','Bukijutsu')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "effects": { + "name": "effects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "regenIncrease": { + "name": "regenIncrease", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "NULL" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "rank": { + "name": "rank", + "type": "enum('D','C','B','A','S','H')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "Bloodline_name_key": { + "name": "Bloodline_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "Bloodline_image_key": { + "name": "Bloodline_image_key", + "columns": [ + "image" + ], + "isUnique": true + }, + "Bloodline_village_idx": { + "name": "Bloodline_village_idx", + "columns": [ + "villageId" + ], + "isUnique": false + }, + "Bloodline_rank_idx": { + "name": "Bloodline_rank_idx", + "columns": [ + "rank" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Bloodline_id": { + "name": "Bloodline_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "BloodlineRolls": { + "name": "BloodlineRolls", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "bloodlineId": { + "name": "bloodlineId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "used": { + "name": "used", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "type": { + "name": "type", + "type": "enum('NATURAL','ITEM')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'NATURAL'" + }, + "rank": { + "name": "rank", + "type": "enum('D','C','B','A','S','H')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "BloodlineRolls_userId_idx": { + "name": "BloodlineRolls_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "BloodlineRolls_bloodlineId_idx": { + "name": "BloodlineRolls_bloodlineId_idx", + "columns": [ + "bloodlineId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "BloodlineRolls_id": { + "name": "BloodlineRolls_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Captcha": { + "name": "Captcha", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "captcha": { + "name": "captcha", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3) + INTERVAL 1 DAY )" + }, + "success": { + "name": "success", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "used": { + "name": "used", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "Captcha_userId_key": { + "name": "Captcha_userId_key", + "columns": [ + "userId" + ], + "isUnique": false + }, + "Captcha_used_idx": { + "name": "Captcha_used_idx", + "columns": [ + "used" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Captcha_id": { + "name": "Captcha_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Clan": { + "name": "Clan", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "founderId": { + "name": "founderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "leaderId": { + "name": "leaderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "coLeader1": { + "name": "coLeader1", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "coLeader2": { + "name": "coLeader2", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "coLeader3": { + "name": "coLeader3", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "coLeader4": { + "name": "coLeader4", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "leaderOrderId": { + "name": "leaderOrderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "trainingBoost": { + "name": "trainingBoost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "ryoBoost": { + "name": "ryoBoost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "points": { + "name": "points", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bank": { + "name": "bank", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pvpActivity": { + "name": "pvpActivity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "Clan_name_key": { + "name": "Clan_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "Clan_village_idx": { + "name": "Clan_village_idx", + "columns": [ + "villageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Clan_id": { + "name": "Clan_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ConceptImage": { + "name": "ConceptImage", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "status": { + "name": "status", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'started'" + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "prompt": { + "name": "prompt", + "type": "varchar(5000)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "negative_prompt": { + "name": "negative_prompt", + "type": "varchar(5000)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "seed": { + "name": "seed", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 42 + }, + "guidance_scale": { + "name": "guidance_scale", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 4 + }, + "n_likes": { + "name": "n_likes", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "n_loves": { + "name": "n_loves", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "n_laugh": { + "name": "n_laugh", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "n_comments": { + "name": "n_comments", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "done": { + "name": "done", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "image_avatar_key": { + "name": "image_avatar_key", + "columns": [ + "image" + ], + "isUnique": true + }, + "image_done_idx": { + "name": "image_done_idx", + "columns": [ + "done" + ], + "isUnique": false + }, + "image_userId_idx": { + "name": "image_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ConceptImage_id": { + "name": "ConceptImage_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Conversation": { + "name": "Conversation", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "isLocked": { + "name": "isLocked", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "isPublic": { + "name": "isPublic", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + } + }, + "indexes": { + "Conversation_title_key": { + "name": "Conversation_title_key", + "columns": [ + "title" + ], + "isUnique": false + }, + "Conversation_createdById_idx": { + "name": "Conversation_createdById_idx", + "columns": [ + "createdById" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Conversation_id": { + "name": "Conversation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ConversationComment": { + "name": "ConversationComment", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "conversationId": { + "name": "conversationId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "isPinned": { + "name": "isPinned", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "ConversationComment_userId_idx": { + "name": "ConversationComment_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "ConversationComment_createdAt_idx": { + "name": "ConversationComment_createdAt_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + }, + "ConversationComment_conversationId_idx": { + "name": "ConversationComment_conversationId_idx", + "columns": [ + "conversationId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ConversationComment_id": { + "name": "ConversationComment_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "DamageCalculation": { + "name": "DamageCalculation", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "state": { + "name": "state", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active": { + "name": "active", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + } + }, + "indexes": { + "DamageCalculation_userId_idx": { + "name": "DamageCalculation_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "DamageCalculation_createdAt_idx": { + "name": "DamageCalculation_createdAt_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "DamageCalculation_id": { + "name": "DamageCalculation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "DataBattleAction": { + "name": "DataBattleAction", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "enum('jutsu','item','bloodline','basic','ai')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "contentId": { + "name": "contentId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "battleType": { + "name": "battleType", + "type": "enum('ARENA','COMBAT','SPARRING','KAGE_CHALLENGE','CLAN_CHALLENGE','CLAN_BATTLE','TOURNAMENT','QUEST','VILLAGE_PROTECTOR','TRAINING')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "battleWon": { + "name": "battleWon", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "DataBattleActions_contentId_idx": { + "name": "DataBattleActions_contentId_idx", + "columns": [ + "contentId" + ], + "isUnique": false + }, + "DataBattleActions_type": { + "name": "DataBattleActions_type", + "columns": [ + "type" + ], + "isUnique": false + }, + "DataBattleActions_battleWon": { + "name": "DataBattleActions_battleWon", + "columns": [ + "battleWon" + ], + "isUnique": false + }, + "DataBattleActions_battleType": { + "name": "DataBattleActions_battleType", + "columns": [ + "battleType" + ], + "isUnique": false + }, + "DataBattleActions_createdAt": { + "name": "DataBattleActions_createdAt", + "columns": [ + "createdAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "DataBattleAction_id": { + "name": "DataBattleAction_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ForumBoard": { + "name": "ForumBoard", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "summary": { + "name": "summary", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group": { + "name": "group", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "nPosts": { + "name": "nPosts", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "nThreads": { + "name": "nThreads", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "ForumBoard_name_key": { + "name": "ForumBoard_name_key", + "columns": [ + "name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ForumBoard_id": { + "name": "ForumBoard_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ForumPost": { + "name": "ForumPost", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "threadId": { + "name": "threadId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "ForumPost_userId_idx": { + "name": "ForumPost_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "ForumPost_threadId_idx": { + "name": "ForumPost_threadId_idx", + "columns": [ + "threadId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ForumPost_id": { + "name": "ForumPost_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ForumThread": { + "name": "ForumThread", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "boardId": { + "name": "boardId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nPosts": { + "name": "nPosts", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "isPinned": { + "name": "isPinned", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "isLocked": { + "name": "isLocked", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "ForumThread_boardId_idx": { + "name": "ForumThread_boardId_idx", + "columns": [ + "boardId" + ], + "isUnique": false + }, + "ForumThread_userId_idx": { + "name": "ForumThread_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ForumThread_id": { + "name": "ForumThread_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "GameAsset": { + "name": "GameAsset", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "enum('STATIC','ANIMATION')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "frames": { + "name": "frames", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "speed": { + "name": "speed", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "licenseDetails": { + "name": "licenseDetails", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('TNR')" + }, + "createdByUserId": { + "name": "createdByUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "onInitialBattleField": { + "name": "onInitialBattleField", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "GameAsset_type_idx": { + "name": "GameAsset_type_idx", + "columns": [ + "type" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "GameAsset_id": { + "name": "GameAsset_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "GameRule": { + "name": "GameRule", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "varchar(500)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "name": { + "name": "name", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "GameRule_id": { + "name": "GameRule_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "GameSetting": { + "name": "GameSetting", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time": { + "name": "time", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "name": { + "name": "name", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "GameSetting_id": { + "name": "GameSetting_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "HistoricalAvatar": { + "name": "HistoricalAvatar", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "avatar": { + "name": "avatar", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "replicateId": { + "name": "replicateId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "status": { + "name": "status", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'started'" + }, + "done": { + "name": "done", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "HistoricalAvatar_replicateId_key": { + "name": "HistoricalAvatar_replicateId_key", + "columns": [ + "replicateId" + ], + "isUnique": true + }, + "HistoricalAvatar_avatar_key": { + "name": "HistoricalAvatar_avatar_key", + "columns": [ + "avatar" + ], + "isUnique": true + }, + "HistoricalAvatar_done_idx": { + "name": "HistoricalAvatar_done_idx", + "columns": [ + "done" + ], + "isUnique": false + }, + "HistoricalAvatar_userId_idx": { + "name": "HistoricalAvatar_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "HistoricalAvatar_id": { + "name": "HistoricalAvatar_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Item": { + "name": "Item", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "effects": { + "name": "effects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "itemType": { + "name": "itemType", + "type": "enum('WEAPON','CONSUMABLE','ARMOR','ACCESSORY','MATERIAL','OTHER')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rarity": { + "name": "rarity", + "type": "enum('COMMON','RARE','EPIC','LEGENDARY')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slot": { + "name": "slot", + "type": "enum('HEAD','CHEST','LEGS','FEET','HAND','ITEM','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cooldown": { + "name": "cooldown", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "weaponType": { + "name": "weaponType", + "type": "enum('STAFF','AXE','FIST_WEAPON','SHURIKEN','SICKLE','DAGGER','SWORD','POLEARM','FLAIL','CHAIN','FAN','BOW','HAMMER','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'NONE'" + }, + "target": { + "name": "target", + "type": "enum('SELF','OTHER_USER','OPPONENT','ALLY','CHARACTER','GROUND','EMPTY_GROUND')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "method": { + "name": "method", + "type": "enum('SINGLE','ALL','AOE_CIRCLE_SPAWN','AOE_LINE_SHOOT','AOE_WALL_SHOOT','AOE_CIRCLE_SHOOT','AOE_SPIRAL_SHOOT')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'SINGLE'" + }, + "cost": { + "name": "cost", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "reputationCost": { + "name": "reputationCost", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "stackSize": { + "name": "stackSize", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "destroyOnUse": { + "name": "destroyOnUse", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "range": { + "name": "range", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "chakraCost": { + "name": "chakraCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "staminaCost": { + "name": "staminaCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "healthCost": { + "name": "healthCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "staminaCostReducePerLvl": { + "name": "staminaCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "chakraCostReducePerLvl": { + "name": "chakraCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "healthCostReducePerLvl": { + "name": "healthCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "actionCostPerc": { + "name": "actionCostPerc", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 60 + }, + "battleDescription": { + "name": "battleDescription", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('')" + }, + "canStack": { + "name": "canStack", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "inShop": { + "name": "inShop", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "isEventItem": { + "name": "isEventItem", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "maxEquips": { + "name": "maxEquips", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "preventBattleUsage": { + "name": "preventBattleUsage", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "Item_name_key": { + "name": "Item_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "Item_rarity_idx": { + "name": "Item_rarity_idx", + "columns": [ + "rarity" + ], + "isUnique": false + }, + "Item_itemType_idx": { + "name": "Item_itemType_idx", + "columns": [ + "itemType" + ], + "isUnique": false + }, + "Item_slot_idx": { + "name": "Item_slot_idx", + "columns": [ + "slot" + ], + "isUnique": false + }, + "Item_method_idx": { + "name": "Item_method_idx", + "columns": [ + "method" + ], + "isUnique": false + }, + "Item_target_idx": { + "name": "Item_target_idx", + "columns": [ + "target" + ], + "isUnique": false + }, + "Item_isEventItem_idx": { + "name": "Item_isEventItem_idx", + "columns": [ + "isEventItem" + ], + "isUnique": false + }, + "Item_onlyInShop_idx": { + "name": "Item_onlyInShop_idx", + "columns": [ + "inShop" + ], + "isUnique": false + }, + "Item_cost_idx": { + "name": "Item_cost_idx", + "columns": [ + "cost" + ], + "isUnique": false + }, + "Item_repsCost_idx": { + "name": "Item_repsCost_idx", + "columns": [ + "reputationCost" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Item_id": { + "name": "Item_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Jutsu": { + "name": "Jutsu", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "extraBaseCost": { + "name": "extraBaseCost", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "effects": { + "name": "effects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target": { + "name": "target", + "type": "enum('SELF','OTHER_USER','OPPONENT','ALLY','CHARACTER','GROUND','EMPTY_GROUND')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "range": { + "name": "range", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cooldown": { + "name": "cooldown", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bloodlineId": { + "name": "bloodlineId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "requiredLevel": { + "name": "requiredLevel", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "requiredRank": { + "name": "requiredRank", + "type": "enum('STUDENT','GENIN','CHUNIN','JONIN','COMMANDER','ELDER','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jutsuType": { + "name": "jutsuType", + "type": "enum('NORMAL','SPECIAL','BLOODLINE','FORBIDDEN','LOYALTY','CLAN','EVENT','AI')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jutsuWeapon": { + "name": "jutsuWeapon", + "type": "enum('STAFF','AXE','FIST_WEAPON','SHURIKEN','SICKLE','DAGGER','SWORD','POLEARM','FLAIL','CHAIN','FAN','BOW','HAMMER','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'NONE'" + }, + "statClassification": { + "name": "statClassification", + "type": "enum('Highest','Ninjutsu','Genjutsu','Taijutsu','Bukijutsu')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "battleDescription": { + "name": "battleDescription", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jutsuRank": { + "name": "jutsuRank", + "type": "enum('D','C','B','A','S','H')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'D'" + }, + "actionCostPerc": { + "name": "actionCostPerc", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 80 + }, + "staminaCost": { + "name": "staminaCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0.05 + }, + "chakraCost": { + "name": "chakraCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0.05 + }, + "staminaCostReducePerLvl": { + "name": "staminaCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "chakraCostReducePerLvl": { + "name": "chakraCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "healthCostReducePerLvl": { + "name": "healthCostReducePerLvl", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "healthCost": { + "name": "healthCost", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "method": { + "name": "method", + "type": "enum('SINGLE','ALL','AOE_CIRCLE_SPAWN','AOE_LINE_SHOOT','AOE_WALL_SHOOT','AOE_CIRCLE_SHOOT','AOE_SPIRAL_SHOOT')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'SINGLE'" + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "Jutsu_name_key": { + "name": "Jutsu_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "Jutsu_image_key": { + "name": "Jutsu_image_key", + "columns": [ + "image" + ], + "isUnique": true + }, + "Jutsu_bloodlineId_idx": { + "name": "Jutsu_bloodlineId_idx", + "columns": [ + "bloodlineId" + ], + "isUnique": false + }, + "Jutsu_villageId_idx": { + "name": "Jutsu_villageId_idx", + "columns": [ + "villageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Jutsu_id": { + "name": "Jutsu_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "JutsuLoadout": { + "name": "JutsuLoadout", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "JutsuLoadout_userId_idx": { + "name": "JutsuLoadout_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "JutsuLoadout_id": { + "name": "JutsuLoadout_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "KageDefendedChallenges": { + "name": "KageDefendedChallenges", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kageId": { + "name": "kageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "didWin": { + "name": "didWin", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "rounds": { + "name": "rounds", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "VillageKageChallenges_villageId_idx": { + "name": "VillageKageChallenges_villageId_idx", + "columns": [ + "villageId" + ], + "isUnique": false + }, + "VillageKageChallenges_userId_idx": { + "name": "VillageKageChallenges_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "VillageKageChallenges_kageID_idx": { + "name": "VillageKageChallenges_kageID_idx", + "columns": [ + "kageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "KageDefendedChallenges_id": { + "name": "KageDefendedChallenges_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "MpvpBattleQueue": { + "name": "MpvpBattleQueue", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "clan1Id": { + "name": "clan1Id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "clan2Id": { + "name": "clan2Id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "winnerId": { + "name": "winnerId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "battleId": { + "name": "battleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "MpvpBattleQueue_battleId_idx": { + "name": "MpvpBattleQueue_battleId_idx", + "columns": [ + "battleId" + ], + "isUnique": false + }, + "MpvpBattleQueue_clan1Id_idx": { + "name": "MpvpBattleQueue_clan1Id_idx", + "columns": [ + "clan1Id" + ], + "isUnique": false + }, + "MpvpBattleQueue_clan2Id_idx": { + "name": "MpvpBattleQueue_clan2Id_idx", + "columns": [ + "clan2Id" + ], + "isUnique": false + }, + "MpvpBattleQueue_winnerId_idx": { + "name": "MpvpBattleQueue_winnerId_idx", + "columns": [ + "winnerId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "MpvpBattleQueue_id": { + "name": "MpvpBattleQueue_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "MpvpBattleUser": { + "name": "MpvpBattleUser", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "clanBattleId": { + "name": "clanBattleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "MpvpBattleUser_clanBattleId_idx": { + "name": "MpvpBattleUser_clanBattleId_idx", + "columns": [ + "clanBattleId" + ], + "isUnique": false + }, + "MpvpBattleUser_userId_idx": { + "name": "MpvpBattleUser_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "MpvpBattleUser_id": { + "name": "MpvpBattleUser_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Notification": { + "name": "Notification", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "Notification_createdAt_idx": { + "name": "Notification_createdAt_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Notification_id": { + "name": "Notification_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "PaypalSubscription": { + "name": "PaypalSubscription", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "affectedUserId": { + "name": "affectedUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "federalStatus": { + "name": "federalStatus", + "type": "enum('NONE','NORMAL','SILVER','GOLD')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "orderId": { + "name": "orderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscriptionId": { + "name": "subscriptionId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "PaypalSubscription_subscriptionId_key": { + "name": "PaypalSubscription_subscriptionId_key", + "columns": [ + "subscriptionId" + ], + "isUnique": true + }, + "PaypalSubscription_orderId_key": { + "name": "PaypalSubscription_orderId_key", + "columns": [ + "orderId" + ], + "isUnique": true + }, + "PaypalSubscription_createdById_idx": { + "name": "PaypalSubscription_createdById_idx", + "columns": [ + "createdById" + ], + "isUnique": false + }, + "PaypalSubscription_affectedUserId_idx": { + "name": "PaypalSubscription_affectedUserId_idx", + "columns": [ + "affectedUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "PaypalSubscription_id": { + "name": "PaypalSubscription_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "PaypalTransaction": { + "name": "PaypalTransaction", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "affectedUserId": { + "name": "affectedUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "transactionId": { + "name": "transactionId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "transactionUpdatedDate": { + "name": "transactionUpdatedDate", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "orderId": { + "name": "orderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoiceId": { + "name": "invoiceId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "amount": { + "name": "amount", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reputationPoints": { + "name": "reputationPoints", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "currency": { + "name": "currency", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'USD'" + }, + "status": { + "name": "status", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rawData": { + "name": "rawData", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "PaypalTransaction_orderId_key": { + "name": "PaypalTransaction_orderId_key", + "columns": [ + "orderId" + ], + "isUnique": true + }, + "PaypalTransaction_createdById_idx": { + "name": "PaypalTransaction_createdById_idx", + "columns": [ + "createdById" + ], + "isUnique": false + }, + "PaypalTransaction_affectedUserId_idx": { + "name": "PaypalTransaction_affectedUserId_idx", + "columns": [ + "affectedUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "PaypalTransaction_id": { + "name": "PaypalTransaction_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "PaypalWebhookMessage": { + "name": "PaypalWebhookMessage", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "eventType": { + "name": "eventType", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rawData": { + "name": "rawData", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "handled": { + "name": "handled", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "PaypalWebhookMessage_id": { + "name": "PaypalWebhookMessage_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Quest": { + "name": "Quest", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "varchar(5000)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "successDescription": { + "name": "successDescription", + "type": "varchar(5000)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "questRank": { + "name": "questRank", + "type": "enum('D','C','B','A','S','H')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'D'" + }, + "requiredLevel": { + "name": "requiredLevel", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "maxLevel": { + "name": "maxLevel", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "requiredVillage": { + "name": "requiredVillage", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tierLevel": { + "name": "tierLevel", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "timeFrame": { + "name": "timeFrame", + "type": "enum('daily','weekly','monthly','all_time')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "questType": { + "name": "questType", + "type": "enum('mission','crime','event','exam','errand','tier','daily','achievement')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hidden": { + "name": "hidden", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "consecutiveObjectives": { + "name": "consecutiveObjectives", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "expiresAt": { + "name": "expiresAt", + "type": "date", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "Quest_questType_idx": { + "name": "Quest_questType_idx", + "columns": [ + "questType" + ], + "isUnique": false + }, + "Quest_questRank_idx": { + "name": "Quest_questRank_idx", + "columns": [ + "questRank" + ], + "isUnique": false + }, + "Quest_requiredLevel_idx": { + "name": "Quest_requiredLevel_idx", + "columns": [ + "requiredLevel" + ], + "isUnique": false + }, + "Quest_maxLevel_idx": { + "name": "Quest_maxLevel_idx", + "columns": [ + "maxLevel" + ], + "isUnique": false + }, + "Quest_requiredVillage_idx": { + "name": "Quest_requiredVillage_idx", + "columns": [ + "requiredVillage" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Quest_id": { + "name": "Quest_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "tierLevel": { + "name": "tierLevel", + "columns": [ + "tierLevel" + ] + } + } + }, + "QuestHistory": { + "name": "QuestHistory", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "questId": { + "name": "questId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "questType": { + "name": "questType", + "type": "enum('mission','crime','event','exam','errand','tier','daily','achievement')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "startedAt": { + "name": "startedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "endedAt": { + "name": "endedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "completed": { + "name": "completed", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "previousCompletes": { + "name": "previousCompletes", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "previousAttempts": { + "name": "previousAttempts", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "QuestHistory_userId_idx": { + "name": "QuestHistory_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "QuestHistory_questType_idx": { + "name": "QuestHistory_questType_idx", + "columns": [ + "questType" + ], + "isUnique": false + }, + "QuestHistory_endedAt_idx": { + "name": "QuestHistory_endedAt_idx", + "columns": [ + "endedAt" + ], + "isUnique": false + }, + "QuestHistory_questId_idx": { + "name": "QuestHistory_questId_idx", + "columns": [ + "questId" + ], + "isUnique": false + }, + "QuestHistory_completed_idx": { + "name": "QuestHistory_completed_idx", + "columns": [ + "completed" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "QuestHistory_id": { + "name": "QuestHistory_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "ReportLog": { + "name": "ReportLog", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "targetUserId": { + "name": "targetUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "staffUserId": { + "name": "staffUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "action": { + "name": "action", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "ReportLog_targetUserId_idx": { + "name": "ReportLog_targetUserId_idx", + "columns": [ + "targetUserId" + ], + "isUnique": false + }, + "ReportLog_staffUserId_idx": { + "name": "ReportLog_staffUserId_idx", + "columns": [ + "staffUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "ReportLog_id": { + "name": "ReportLog_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "RyoTrade": { + "name": "RyoTrade", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "creatorUserId": { + "name": "creatorUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "repsForSale": { + "name": "repsForSale", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "requestedRyo": { + "name": "requestedRyo", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ryoPerRep": { + "name": "ryoPerRep", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "purchaserUserId": { + "name": "purchaserUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "allowedPurchaserId": { + "name": "allowedPurchaserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "RyoTrade_creatorUserId_idx": { + "name": "RyoTrade_creatorUserId_idx", + "columns": [ + "creatorUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "RyoTrade_id": { + "name": "RyoTrade_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Tournament": { + "name": "Tournament", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "round": { + "name": "round", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "type": { + "name": "type", + "type": "enum('CLAN')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rewards": { + "name": "rewards", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "startedAt": { + "name": "startedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3) + INTERVAL 1 DAY )" + }, + "roundStartedAt": { + "name": "roundStartedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3) + INTERVAL 1 DAY )" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "status": { + "name": "status", + "type": "enum('OPEN','IN_PROGRESS','COMPLETED')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'OPEN'" + } + }, + "indexes": { + "Tournament_name_key": { + "name": "Tournament_name_key", + "columns": [ + "name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Tournament_id": { + "name": "Tournament_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "TournamentMatch": { + "name": "TournamentMatch", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tournamentId": { + "name": "tournamentId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "round": { + "name": "round", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "match": { + "name": "match", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "state": { + "name": "state", + "type": "enum('WAITING','PLAYED','NO_SHOW')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'WAITING'" + }, + "winnerId": { + "name": "winnerId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "battleId": { + "name": "battleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "userId1": { + "name": "userId1", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId2": { + "name": "userId2", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "startedAt": { + "name": "startedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "TournamentMatch_tournamentId_idx": { + "name": "TournamentMatch_tournamentId_idx", + "columns": [ + "tournamentId" + ], + "isUnique": false + }, + "TournamentMatch_userId1_idx": { + "name": "TournamentMatch_userId1_idx", + "columns": [ + "userId1" + ], + "isUnique": false + }, + "TournamentMatch_userId2_idx": { + "name": "TournamentMatch_userId2_idx", + "columns": [ + "userId2" + ], + "isUnique": false + }, + "TournamentMatch_winnerId_idx": { + "name": "TournamentMatch_winnerId_idx", + "columns": [ + "winnerId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "TournamentMatch_id": { + "name": "TournamentMatch_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "TournamentRecord": { + "name": "TournamentRecord", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "round": { + "name": "round", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "type": { + "name": "type", + "type": "enum('CLAN')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rewards": { + "name": "rewards", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "startedAt": { + "name": "startedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3) + INTERVAL 1 DAY )" + }, + "winnerId": { + "name": "winnerId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "HistoricalTournament_name_key": { + "name": "HistoricalTournament_name_key", + "columns": [ + "name" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "TournamentRecord_id": { + "name": "TournamentRecord_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "TrainingLog": { + "name": "TrainingLog", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "stat": { + "name": "stat", + "type": "enum('ninjutsuOffence','taijutsuOffence','genjutsuOffence','bukijutsuOffence','ninjutsuDefence','taijutsuDefence','genjutsuDefence','bukijutsuDefence','strength','speed','intelligence','willpower')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "speed": { + "name": "speed", + "type": "enum('15min','1hr','4hrs','8hrs')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "trainingFinishedAt": { + "name": "trainingFinishedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "TrainingLog_userId_idx": { + "name": "TrainingLog_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "TrainingLog_speed_idx": { + "name": "TrainingLog_speed_idx", + "columns": [ + "speed" + ], + "isUnique": false + }, + "TrainingLog_stat_idx": { + "name": "TrainingLog_stat_idx", + "columns": [ + "stat" + ], + "isUnique": false + }, + "TrainingLog_trainingFinishedAt_idx": { + "name": "TrainingLog_trainingFinishedAt_idx", + "columns": [ + "trainingFinishedAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "TrainingLog_id": { + "name": "TrainingLog_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UsersInConversation": { + "name": "UsersInConversation", + "columns": { + "conversationId": { + "name": "conversationId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "assignedAt": { + "name": "assignedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "UsersInConversation_userId_idx": { + "name": "UsersInConversation_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UsersInConversation_conversationId_userId_pk": { + "name": "UsersInConversation_conversationId_userId_pk", + "columns": [ + "conversationId", + "userId" + ] + } + }, + "uniqueConstraints": {} + }, + "UserAssociation": { + "name": "UserAssociation", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userOne": { + "name": "userOne", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userTwo": { + "name": "userTwo", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "associationType": { + "name": "associationType", + "type": "enum('MARRIAGE','DIVORCED')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'MARRIAGE'" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "UserOne_UserTwo_UserAssociation_key": { + "name": "UserOne_UserTwo_UserAssociation_key", + "columns": [ + "userOne", + "userTwo", + "associationType" + ], + "isUnique": true + }, + "UserAttribute_userOne_idx": { + "name": "UserAttribute_userOne_idx", + "columns": [ + "userOne" + ], + "isUnique": false + }, + "UserAttribute_userTwo_idx": { + "name": "UserAttribute_userTwo_idx", + "columns": [ + "userTwo" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserAssociation_id": { + "name": "UserAssociation_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserAttribute": { + "name": "UserAttribute", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "attribute": { + "name": "attribute", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "UserAttribute_attribute_userId_key": { + "name": "UserAttribute_attribute_userId_key", + "columns": [ + "attribute", + "userId" + ], + "isUnique": true + }, + "UserAttribute_userId_idx": { + "name": "UserAttribute_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserAttribute_id": { + "name": "UserAttribute_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserBadge": { + "name": "UserBadge", + "columns": { + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "badgeId": { + "name": "badgeId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "UserBadge_userId_idx": { + "name": "UserBadge_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "UserBadge_badgeId_idx": { + "name": "UserBadge_badgeId_idx", + "columns": [ + "badgeId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "UserBlackList": { + "name": "UserBlackList", + "columns": { + "id": { + "name": "id", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "creatorUserId": { + "name": "creatorUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "targetUserId": { + "name": "targetUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "BlackList_creatorUserId_idx": { + "name": "BlackList_creatorUserId_idx", + "columns": [ + "creatorUserId" + ], + "isUnique": false + }, + "BlackList_targetUserId_idx": { + "name": "BlackList_targetUserId_idx", + "columns": [ + "targetUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserBlackList_id": { + "name": "UserBlackList_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserData": { + "name": "UserData", + "columns": { + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "recruiterId": { + "name": "recruiterId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "anbuId": { + "name": "anbuId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "clanId": { + "name": "clanId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jutsuLoadout": { + "name": "jutsuLoadout", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "nRecruited": { + "name": "nRecruited", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "lastIp": { + "name": "lastIp", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "gender": { + "name": "gender", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "curHealth": { + "name": "curHealth", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "maxHealth": { + "name": "maxHealth", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "curChakra": { + "name": "curChakra", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "maxChakra": { + "name": "maxChakra", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "curStamina": { + "name": "curStamina", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "maxStamina": { + "name": "maxStamina", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "regeneration": { + "name": "regeneration", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 60 + }, + "money": { + "name": "money", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "bank": { + "name": "bank", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "experience": { + "name": "experience", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "earnedExperience": { + "name": "earnedExperience", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "rank": { + "name": "rank", + "type": "enum('STUDENT','GENIN','CHUNIN','JONIN','COMMANDER','ELDER','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'STUDENT'" + }, + "isOutlaw": { + "name": "isOutlaw", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "level": { + "name": "level", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bloodlineId": { + "name": "bloodlineId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "enum('AWAKE','HOSPITALIZED','TRAVEL','BATTLE','QUEUED','ASLEEP')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'AWAKE'" + }, + "strength": { + "name": "strength", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "intelligence": { + "name": "intelligence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "willpower": { + "name": "willpower", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "speed": { + "name": "speed", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "ninjutsuOffence": { + "name": "ninjutsuOffence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "ninjutsuDefence": { + "name": "ninjutsuDefence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "genjutsuOffence": { + "name": "genjutsuOffence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "genjutsuDefence": { + "name": "genjutsuDefence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "taijutsuOffence": { + "name": "taijutsuOffence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "taijutsuDefence": { + "name": "taijutsuDefence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "bukijutsuDefence": { + "name": "bukijutsuDefence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "bukijutsuOffence": { + "name": "bukijutsuOffence", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "statsMultiplier": { + "name": "statsMultiplier", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "poolsMultiplier": { + "name": "poolsMultiplier", + "type": "double", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "reputationPoints": { + "name": "reputationPoints", + "type": "float", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 5 + }, + "primaryElement": { + "name": "primaryElement", + "type": "enum('Fire','Water','Wind','Earth','Lightning','Ice','Crystal','Dust','Shadow','Wood','Scorch','Storm','Magnet','Yin-Yang','Lava','Explosion','Light','None')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "secondaryElement": { + "name": "secondaryElement", + "type": "enum('Fire','Water','Wind','Earth','Lightning','Ice','Crystal','Dust','Shadow','Wood','Scorch','Storm','Magnet','Yin-Yang','Lava','Explosion','Light','None')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reputationPointsTotal": { + "name": "reputationPointsTotal", + "type": "float", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 5 + }, + "villagePrestige": { + "name": "villagePrestige", + "type": "float", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "federalStatus": { + "name": "federalStatus", + "type": "enum('NONE','NORMAL','SILVER','GOLD')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'NONE'" + }, + "approvedTos": { + "name": "approvedTos", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avatar": { + "name": "avatar", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sector": { + "name": "sector", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "longitude": { + "name": "longitude", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "latitude": { + "name": "latitude", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 7 + }, + "location": { + "name": "location", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "''" + }, + "joinedVillageAt": { + "name": "joinedVillageAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3) - INTERVAL 7 DAY)" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "questFinishAt": { + "name": "questFinishAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "activityStreak": { + "name": "activityStreak", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "deletionAt": { + "name": "deletionAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "travelFinishAt": { + "name": "travelFinishAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "isBanned": { + "name": "isBanned", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "isSilenced": { + "name": "isSilenced", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "role": { + "name": "role", + "type": "enum('USER','MODERATOR','CONTENT','EVENT','HEAD_MODERATOR','ADMIN','CONTENT-ADMIN')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'USER'" + }, + "battleId": { + "name": "battleId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "isAi": { + "name": "isAi", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "isSummon": { + "name": "isSummon", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "isEvent": { + "name": "isEvent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "inArena": { + "name": "inArena", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "inboxNews": { + "name": "inboxNews", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "regenAt": { + "name": "regenAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "immunityUntil": { + "name": "immunityUntil", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "trainingStartedAt": { + "name": "trainingStartedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "trainingSpeed": { + "name": "trainingSpeed", + "type": "enum('15min','1hr','4hrs','8hrs')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'15min'" + }, + "currentlyTraining": { + "name": "currentlyTraining", + "type": "enum('ninjutsuOffence','taijutsuOffence','genjutsuOffence','bukijutsuOffence','ninjutsuDefence','taijutsuDefence','genjutsuDefence','bukijutsuDefence','strength','speed','intelligence','willpower')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "unreadNotifications": { + "name": "unreadNotifications", + "type": "smallint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "unreadNews": { + "name": "unreadNews", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "questData": { + "name": "questData", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "senseiId": { + "name": "senseiId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "medicalExperience": { + "name": "medicalExperience", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pvpFights": { + "name": "pvpFights", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pveFights": { + "name": "pveFights", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pvpActivity": { + "name": "pvpActivity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pvpStreak": { + "name": "pvpStreak", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "errands": { + "name": "errands", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsD": { + "name": "missionsD", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsC": { + "name": "missionsC", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsB": { + "name": "missionsB", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsA": { + "name": "missionsA", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsS": { + "name": "missionsS", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "missionsH": { + "name": "missionsH", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesD": { + "name": "crimesD", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesC": { + "name": "crimesC", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesB": { + "name": "crimesB", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesA": { + "name": "crimesA", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesS": { + "name": "crimesS", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "crimesH": { + "name": "crimesH", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "dailyArenaFights": { + "name": "dailyArenaFights", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "dailyMissions": { + "name": "dailyMissions", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "dailyErrands": { + "name": "dailyErrands", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "dailyTrainings": { + "name": "dailyTrainings", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "movedTooFastCount": { + "name": "movedTooFastCount", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "extraItemSlots": { + "name": "extraItemSlots", + "type": "smallint unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "extraJutsuSlots": { + "name": "extraJutsuSlots", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "customTitle": { + "name": "customTitle", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "marriageSlots": { + "name": "marriageSlots", + "type": "int unsigned", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "aiProfileId": { + "name": "aiProfileId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "effects": { + "name": "effects", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('[]')" + } + }, + "indexes": { + "UserData_userId_key": { + "name": "UserData_userId_key", + "columns": [ + "userId" + ], + "isUnique": true + }, + "UserData_isAi_idx": { + "name": "UserData_isAi_idx", + "columns": [ + "isAi" + ], + "isUnique": false + }, + "UserData_rank_idx": { + "name": "UserData_rank_idx", + "columns": [ + "rank" + ], + "isUnique": false + }, + "UserData_role_idx": { + "name": "UserData_role_idx", + "columns": [ + "role" + ], + "isUnique": false + }, + "UserData_clanId_idx": { + "name": "UserData_clanId_idx", + "columns": [ + "clanId" + ], + "isUnique": false + }, + "UserData_anbuId_idx": { + "name": "UserData_anbuId_idx", + "columns": [ + "anbuId" + ], + "isUnique": false + }, + "UserData_jutsuLoadout_idx": { + "name": "UserData_jutsuLoadout_idx", + "columns": [ + "jutsuLoadout" + ], + "isUnique": false + }, + "UserData_level_idx": { + "name": "UserData_level_idx", + "columns": [ + "level" + ], + "isUnique": false + }, + "UserData_username_key": { + "name": "UserData_username_key", + "columns": [ + "username" + ], + "isUnique": true + }, + "UserData_bloodlineId_idx": { + "name": "UserData_bloodlineId_idx", + "columns": [ + "bloodlineId" + ], + "isUnique": false + }, + "UserData_villageId_idx": { + "name": "UserData_villageId_idx", + "columns": [ + "villageId" + ], + "isUnique": false + }, + "UserData_battleId_idx": { + "name": "UserData_battleId_idx", + "columns": [ + "battleId" + ], + "isUnique": false + }, + "UserData_status_idx": { + "name": "UserData_status_idx", + "columns": [ + "status" + ], + "isUnique": false + }, + "UserData_sector_idx": { + "name": "UserData_sector_idx", + "columns": [ + "sector" + ], + "isUnique": false + }, + "UserData_senseiId_idx": { + "name": "UserData_senseiId_idx", + "columns": [ + "senseiId" + ], + "isUnique": false + }, + "UserData_latitude_idx": { + "name": "UserData_latitude_idx", + "columns": [ + "latitude" + ], + "isUnique": false + }, + "UserData_longitude_idx": { + "name": "UserData_longitude_idx", + "columns": [ + "longitude" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserData_userId": { + "name": "UserData_userId", + "columns": [ + "userId" + ] + } + }, + "uniqueConstraints": {} + }, + "UserItem": { + "name": "UserItem", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "itemId": { + "name": "itemId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "equipped": { + "name": "equipped", + "type": "enum('HEAD','CHEST','LEGS','FEET','HAND_1','HAND_2','ITEM_1','ITEM_2','ITEM_3','ITEM_4','ITEM_5','ITEM_6','ITEM_7','NONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'NONE'" + } + }, + "indexes": { + "UserItem_userId_idx": { + "name": "UserItem_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "UserItem_itemId_idx": { + "name": "UserItem_itemId_idx", + "columns": [ + "itemId" + ], + "isUnique": false + }, + "UserItem_quantity_idx": { + "name": "UserItem_quantity_idx", + "columns": [ + "quantity" + ], + "isUnique": false + }, + "UserItem_equipped_idx": { + "name": "UserItem_equipped_idx", + "columns": [ + "equipped" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserItem_id": { + "name": "UserItem_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserJutsu": { + "name": "UserJutsu", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "jutsuId": { + "name": "jutsuId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "level": { + "name": "level", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "experience": { + "name": "experience", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "equipped": { + "name": "equipped", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "finishTraining": { + "name": "finishTraining", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "UserJutsu_userId_jutsuId_key": { + "name": "UserJutsu_userId_jutsuId_key", + "columns": [ + "userId", + "jutsuId" + ], + "isUnique": true + }, + "UserJutsu_jutsuId_idx": { + "name": "UserJutsu_jutsuId_idx", + "columns": [ + "jutsuId" + ], + "isUnique": false + }, + "Jutsu_equipped_idx": { + "name": "Jutsu_equipped_idx", + "columns": [ + "equipped" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserJutsu_id": { + "name": "UserJutsu_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserLikes": { + "name": "UserLikes", + "columns": { + "type": { + "name": "type", + "type": "enum('like','love','laugh')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "imageId": { + "name": "imageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "userLikes_userId_idx": { + "name": "userLikes_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "userLikes_imageId_idx": { + "name": "userLikes_imageId_idx", + "columns": [ + "imageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "UserNindo": { + "name": "UserNindo", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "UserNindo_userId_idx": { + "name": "UserNindo_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserNindo_id": { + "name": "UserNindo_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserReport": { + "name": "UserReport", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reporterUserId": { + "name": "reporterUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reportedUserId": { + "name": "reportedUserId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "system": { + "name": "system", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "infraction": { + "name": "infraction", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "banEnd": { + "name": "banEnd", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "adminResolved": { + "name": "adminResolved", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "status": { + "name": "status", + "type": "enum('UNVIEWED','REPORT_CLEARED','BAN_ACTIVATED','SILENCE_ACTIVATED','BAN_ESCALATED','SILENCE_ESCALATED','OFFICIAL_WARNING')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'UNVIEWED'" + } + }, + "indexes": { + "UserReport_reporterUserId_idx": { + "name": "UserReport_reporterUserId_idx", + "columns": [ + "reporterUserId" + ], + "isUnique": false + }, + "UserReport_reportedUserId_idx": { + "name": "UserReport_reportedUserId_idx", + "columns": [ + "reportedUserId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserReport_id": { + "name": "UserReport_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserReportComment": { + "name": "UserReportComment", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "userId": { + "name": "userId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reportId": { + "name": "reportId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "decision": { + "name": "decision", + "type": "enum('UNVIEWED','REPORT_CLEARED','BAN_ACTIVATED','SILENCE_ACTIVATED','BAN_ESCALATED','SILENCE_ESCALATED','OFFICIAL_WARNING')", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "UserReportComment_userId_idx": { + "name": "UserReportComment_userId_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "UserReportComment_reportId_idx": { + "name": "UserReportComment_reportId_idx", + "columns": [ + "reportId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserReportComment_id": { + "name": "UserReportComment_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "UserRequest": { + "name": "UserRequest", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "senderId": { + "name": "senderId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "receiverId": { + "name": "receiverId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "enum('PENDING','ACCEPTED','REJECTED','CANCELLED','EXPIRED')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "enum('SPAR','ALLIANCE','SURRENDER','SENSEI','ANBU','CLAN','MARRIAGE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + } + }, + "indexes": { + "UserRequest_createdAt_idx": { + "name": "UserRequest_createdAt_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + }, + "UserRequest_senderId_idx": { + "name": "UserRequest_senderId_idx", + "columns": [ + "senderId" + ], + "isUnique": false + }, + "UserRequest_receiverId_idx": { + "name": "UserRequest_receiverId_idx", + "columns": [ + "receiverId" + ], + "isUnique": false + }, + "UserRequest_type_idx": { + "name": "UserRequest_type_idx", + "columns": [ + "type" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "UserRequest_id": { + "name": "UserRequest_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "Village": { + "name": "Village", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "mapName": { + "name": "mapName", + "type": "varchar(191)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sector": { + "name": "sector", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "description": { + "name": "description", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "kageId": { + "name": "kageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tokens": { + "name": "tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "type": { + "name": "type", + "type": "enum('VILLAGE','OUTLAW','SAFEZONE')", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'VILLAGE'" + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "leaderUpdatedAt": { + "name": "leaderUpdatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP(3))" + }, + "hexColor": { + "name": "hexColor", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'#000000'" + }, + "populationCount": { + "name": "populationCount", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "allianceSystem": { + "name": "allianceSystem", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "joinable": { + "name": "joinable", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "pvpDisabled": { + "name": "pvpDisabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "villageLogo": { + "name": "villageLogo", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "villageGraphic": { + "name": "villageGraphic", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + } + }, + "indexes": { + "Village_name_key": { + "name": "Village_name_key", + "columns": [ + "name" + ], + "isUnique": true + }, + "Village_sector_key": { + "name": "Village_sector_key", + "columns": [ + "sector" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "Village_id": { + "name": "Village_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "VillageAlliance": { + "name": "VillageAlliance", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "villageIdA": { + "name": "villageIdA", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "villageIdB": { + "name": "villageIdB", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "enum('NEUTRAL','ALLY','ENEMY')", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "datetime(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "VillageAlliance_villageIdA_idx": { + "name": "VillageAlliance_villageIdA_idx", + "columns": [ + "villageIdA" + ], + "isUnique": false + }, + "VillageAlliance_villageIdB_idx": { + "name": "VillageAlliance_villageIdB_idx", + "columns": [ + "villageIdB" + ], + "isUnique": false + }, + "VillageAlliance_status_idx": { + "name": "VillageAlliance_status_idx", + "columns": [ + "status" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "VillageAlliance_id": { + "name": "VillageAlliance_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "VillageStructure": { + "name": "VillageStructure", + "columns": { + "id": { + "name": "id", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "route": { + "name": "route", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image": { + "name": "image", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "villageId": { + "name": "villageId", + "type": "varchar(191)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "longitude": { + "name": "longitude", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "latitude": { + "name": "latitude", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "hasPage": { + "name": "hasPage", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "curSp": { + "name": "curSp", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "maxSp": { + "name": "maxSp", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "allyAccess": { + "name": "allyAccess", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "baseCost": { + "name": "baseCost", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10000 + }, + "level": { + "name": "level", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "maxLevel": { + "name": "maxLevel", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "anbuSquadsPerLvl": { + "name": "anbuSquadsPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "arenaRewardPerLvl": { + "name": "arenaRewardPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bankInterestPerLvl": { + "name": "bankInterestPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "blackDiscountPerLvl": { + "name": "blackDiscountPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "clansPerLvl": { + "name": "clansPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "hospitalSpeedupPerLvl": { + "name": "hospitalSpeedupPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "itemDiscountPerLvl": { + "name": "itemDiscountPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "patrolsPerLvl": { + "name": "patrolsPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "ramenDiscountPerLvl": { + "name": "ramenDiscountPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "regenIncreasePerLvl": { + "name": "regenIncreasePerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "sleepRegenPerLvl": { + "name": "sleepRegenPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "structureDiscountPerLvl": { + "name": "structureDiscountPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "trainBoostPerLvl": { + "name": "trainBoostPerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "villageDefencePerLvl": { + "name": "villageDefencePerLvl", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "VillageStructure_name_villageId_key": { + "name": "VillageStructure_name_villageId_key", + "columns": [ + "name", + "villageId" + ], + "isUnique": true + }, + "VillageStructure_villageId_idx": { + "name": "VillageStructure_villageId_idx", + "columns": [ + "villageId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "VillageStructure_id": { + "name": "VillageStructure_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/app/drizzle/migrations/meta/_journal.json b/app/drizzle/migrations/meta/_journal.json index e8a54f89..a234afa8 100644 --- a/app/drizzle/migrations/meta/_journal.json +++ b/app/drizzle/migrations/meta/_journal.json @@ -1107,6 +1107,13 @@ "when": 1729328308678, "tag": "0157_sad_pete_wisdom", "breakpoints": true + }, + { + "idx": 158, + "version": "5", + "when": 1729362439597, + "tag": "0158_careful_bucky", + "breakpoints": true } ] } \ No newline at end of file diff --git a/app/drizzle/schema.ts b/app/drizzle/schema.ts index f0e9748c..b2453bdb 100644 --- a/app/drizzle/schema.ts +++ b/app/drizzle/schema.ts @@ -40,6 +40,14 @@ export const gameAsset = mysqlTable( image: varchar("image", { length: 191 }).notNull(), frames: tinyint("frames").default(1).notNull(), speed: tinyint("speed").default(1).notNull(), + createdAt: datetime("createdAt", { mode: "date", fsp: 3 }) + .default(sql`(CURRENT_TIMESTAMP(3))`) + .notNull(), + updatedAt: datetime("updatedAt", { mode: "date", fsp: 3 }) + .default(sql`(CURRENT_TIMESTAMP(3))`) + .notNull(), + licenseDetails: text("licenseDetails").default("TNR").notNull(), + createdByUserId: varchar("createdByUserId", { length: 191 }), onInitialBattleField: boolean("onInitialBattleField").default(false).notNull(), }, (table) => { diff --git a/app/public/manual/asset.webp b/app/public/manual/asset.webp new file mode 100644 index 0000000000000000000000000000000000000000..b1c11cc7fb5947b38983814a67ee3bfd2bf1bdf9 GIT binary patch literal 104110 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 Rd3F%x4- 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 literal 0 HcmV?d00001 diff --git a/app/src/app/manual/asset/edit/[assetid]/page.tsx b/app/src/app/manual/asset/edit/[assetid]/page.tsx new file mode 100644 index 00000000..07e15d71 --- /dev/null +++ b/app/src/app/manual/asset/edit/[assetid]/page.tsx @@ -0,0 +1,77 @@ +"use client"; + +import ContentBox from "@/layout/ContentBox"; +import Loader from "@/layout/Loader"; +import { useRouter } from "next/navigation"; +import { api } from "@/utils/api"; +import { useEffect } from "react"; +import { EditContent } from "@/layout/EditContent"; +import { useRequiredUserData } from "@/utils/UserContext"; +import { canChangeContent } from "@/utils/permissions"; +import { useAssetEditForm } from "@/libs/asset"; +import { gameAssetValidator } from "@/validators/asset"; +import type { GameAsset } from "@/drizzle/schema"; + +export default function AssetEdit({ params }: { params: { assetid: string } }) { + const assetId = params.assetid; + const router = useRouter(); + const { data: userData } = useRequiredUserData(); + + // Queries + const { data, isPending, refetch } = api.gameAsset.get.useQuery( + { id: assetId }, + { staleTime: Infinity, enabled: assetId !== undefined }, + ); + + // Redirect to profile if not content or admin + useEffect(() => { + if (userData && !canChangeContent(userData.role)) { + router.push("/profile"); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [userData]); + + // Prevent unauthorized access + if (isPending || !userData || !canChangeContent(userData.role) || !data) { + return ; + } + + return ; +} + +interface SingleEditAssetProps { + asset: GameAsset; + refetch: () => void; +} + +const SingleEditAsset: React.FC = (props) => { + // Form handling + const { asset, form, formData, handleAssetSubmit } = useAssetEditForm( + props.asset, + props.refetch, + ); + + // Show panel controls + return ( + + {!asset &&

Could not find this asset

} + {asset && ( + + )} +
+ ); +}; diff --git a/app/src/app/manual/asset/page.tsx b/app/src/app/manual/asset/page.tsx new file mode 100644 index 00000000..ec645ae8 --- /dev/null +++ b/app/src/app/manual/asset/page.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import ContentBox from "@/layout/ContentBox"; +import Loader from "@/layout/Loader"; +import ItemWithEffects from "@/layout/ItemWithEffects"; +import { Button } from "@/components/ui/button"; +import { api } from "@/utils/api"; +import { FilePlus } from "lucide-react"; +import { useInfinitePagination } from "@/libs/pagination"; +import { useUserData } from "@/utils/UserContext"; +import { showMutationToast } from "@/libs/toast"; +import { canChangeContent } from "@/utils/permissions"; + +export default function ManualAssets() { + // Settings + const { data: userData } = useUserData(); + const [lastElement, setLastElement] = useState(null); + + // Router for forwarding + const router = useRouter(); + + // Query data + const { + data: assets, + isFetching, + refetch, + fetchNextPage, + hasNextPage, + } = api.gameAsset.getAll.useInfiniteQuery( + { limit: 50 }, + { + getNextPageParam: (lastPage) => lastPage.nextCursor, + placeholderData: (previousData) => previousData, + }, + ); + const allAssets = assets?.pages.map((page) => page.data).flat(); + useInfinitePagination({ fetchNextPage, hasNextPage, lastElement }); + + // Mutations + const { mutate: create, isPending: load1 } = api.gameAsset.create.useMutation({ + onSuccess: async (data) => { + showMutationToast(data); + await refetch(); + router.push(`/manual/asset/edit/${data.message}`); + }, + }); + + const { mutate: remove, isPending: load2 } = api.gameAsset.delete.useMutation({ + onSuccess: async (data) => { + showMutationToast(data); + await refetch(); + }, + }); + + // Derived + const isPending = isFetching || load1 || load2; + + // Return JSX + return ( + <> + + Here you can see the list of all game assets. Click on an asset to view. + + + {userData && canChangeContent(userData.role) && ( + <> + + + )} + {/* */} + + } + > + {isPending && } + {allAssets?.map((asset, i) => ( +
+ remove({ id })} + showEdit="asset" + /> +
+ ))} +
+ + ); +} diff --git a/app/src/app/manual/page.tsx b/app/src/app/manual/page.tsx index f01b6f93..e0b19610 100644 --- a/app/src/app/manual/page.tsx +++ b/app/src/app/manual/page.tsx @@ -20,6 +20,7 @@ export default function ManualMain() { "logs", "damage_calcs", "badge", + "asset", ].map((page) => ( = (props) => { // js groups for organization const group_users = new Group(); const group_ground = new Group(); + const group_effects = new Group(); // Enable controls const controls = new OrbitControls(camera, renderer.domElement); @@ -399,6 +400,7 @@ const Combat: React.FC = (props) => { scene.add(group_edges); scene.add(group_ground); scene.add(group_users); + scene.add(group_effects); // Capture clicks to update move direction const onClick = () => { @@ -468,7 +470,7 @@ const Combat: React.FC = (props) => { // Draw all ground effects on the map drawCombatEffects({ - groupGround: group_ground, + groupEffects: group_effects, battle: battle.current, grid: grid.current, animationId, diff --git a/app/src/layout/ContentImage.tsx b/app/src/layout/ContentImage.tsx index beb00464..8ac78c9e 100644 --- a/app/src/layout/ContentImage.tsx +++ b/app/src/layout/ContentImage.tsx @@ -1,13 +1,16 @@ -import React from "react"; -import Image from "next/image"; -import Loader from "./Loader"; -import { ItemRarities } from "../../drizzle/constants"; -import type { ItemRarity } from "../../drizzle/schema"; +import React, { useRef } from "react"; +import NextImage from "next/image"; +import Loader from "@/layout/Loader"; +import { cn } from "src/libs/shadui"; +import { ItemRarities } from "@/drizzle/constants"; +import type { ItemRarity } from "@/drizzle/schema"; interface ContentImageProps { image?: string | null; alt: string; rarity?: ItemRarity; + frames?: number; + speed?: number; className: string; roundFull?: boolean; hideBorder?: boolean; @@ -15,22 +18,83 @@ interface ContentImageProps { } const ContentImage: React.FC = (props) => { - const drawBackground = - props.rarity && Object.values(ItemRarities).includes(props.rarity); - return ( - <> - {drawBackground && props.rarity && ( - (null); + const pixels = 112; + let img: null | React.ReactNode = null; + if (props.image) { + if (props.speed && props.frames) { + img = ( +
+ +
+ ); + let currentFrame = 0; + const spritesheet = new Image(); + const ctx = imgRef?.current?.getContext("2d"); + spritesheet.src = props.image; + spritesheet.onload = function () { + init(); + }; + function init() { + window.requestAnimationFrame(step); + } + function step() { + if (ctx && imgRef?.current && props.frames) { + const h = spritesheet.height / props.frames; + const w = spritesheet.width; + ctx.clearRect(0, 0, pixels, pixels); + ctx.drawImage(spritesheet, 0, currentFrame * h, w, h, 0, 0, pixels, pixels); + currentFrame++; + if (currentFrame >= props.frames) currentFrame = 0; + window.requestAnimationFrame(step); + } + } + } else { + img = ( + + ); + } + } + + // Derived properties + const drawBackground = + props.rarity && Object.values(ItemRarities).includes(props.rarity); + + // Return + return ( + <> + {drawBackground && props.rarity && ( +
+ +
)} {!props.image && (
@@ -38,19 +102,16 @@ const ContentImage: React.FC = (props) => {
)} {props.image && ( - {props.alt} +
+ {img} +
)} ); diff --git a/app/src/layout/EditContent.tsx b/app/src/layout/EditContent.tsx index 2e825a1f..eae0d56a 100644 --- a/app/src/layout/EditContent.tsx +++ b/app/src/layout/EditContent.tsx @@ -74,7 +74,7 @@ interface EditContentProps { buttonTxt?: string; allowImageUpload?: boolean; fixedWidths?: "basis-32" | "basis-64" | "basis-96"; - type?: "jutsu" | "bloodline" | "item" | "quest" | "ai" | "badge"; + type?: "jutsu" | "bloodline" | "item" | "quest" | "ai" | "badge" | "asset"; bgColor?: "bg-slate-600" | ""; onAccept?: ( e: React.BaseSyntheticEvent | undefined, diff --git a/app/src/layout/ItemWithEffects.tsx b/app/src/layout/ItemWithEffects.tsx index e457b83f..05fc678a 100644 --- a/app/src/layout/ItemWithEffects.tsx +++ b/app/src/layout/ItemWithEffects.tsx @@ -13,7 +13,7 @@ import { capitalizeFirstLetter } from "@/utils/sanitize"; import { getObjectiveImage } from "@/libs/objectives"; import { ObjectiveReward } from "@/validators/objectives"; import { cn } from "src/libs/shadui"; -import type { ItemRarity } from "@/drizzle/schema"; +import type { ItemRarity, GameAsset } from "@/drizzle/schema"; import type { Bloodline, Item, Jutsu, Quest } from "@/drizzle/schema"; import type { ZodAllTags } from "@/libs/combat/types"; @@ -34,11 +34,11 @@ export type GenericObject = { }; export interface ItemWithEffectsProps { - item: Bloodline | Item | Jutsu | Quest | GenericObject; + item: Bloodline | Item | Jutsu | Quest | GameAsset | GenericObject; hideDetails?: boolean; imageBorder?: boolean; imageExtra?: React.ReactNode; - showEdit?: "bloodline" | "item" | "jutsu" | "ai" | "quest" | "badge"; + showEdit?: "bloodline" | "item" | "jutsu" | "ai" | "quest" | "badge" | "asset"; showStatistic?: "bloodline" | "item" | "jutsu" | "ai"; hideTitle?: boolean; onDelete?: (id: string) => void; @@ -62,8 +62,10 @@ const ItemWithEffects: React.FC = (props) => {
{props.imageExtra} @@ -174,7 +176,7 @@ const ItemWithEffects: React.FC = (props) => {

- {!hideDetails && item.description && ( + {!hideDetails && "description" in item && item.description && (
{parseHtml(item.description)}
)} @@ -231,6 +233,31 @@ const ItemWithEffects: React.FC = (props) => { Rank: {item.rank}

)} + {"frames" in item && item.frames && ( +

+ Frames: {item.frames} +

+ )} + {"speed" in item && item.speed && ( +

+ Speed: {item.speed} +

+ )} + {"type" in item && item.type && ( +

+ Type: {item.type.toLowerCase()} +

+ )} + {"onInitialBattleField" in item && item.onInitialBattleField && ( +

+ On battlefield: {item.onInitialBattleField ? "yes" : "no"} +

+ )} + {"licenseDetails" in item && item.licenseDetails && ( +

+ License: {item.licenseDetails} +

+ )} {"village" in item && item.village && typeof item.village === "object" && diff --git a/app/src/libs/asset.ts b/app/src/libs/asset.ts new file mode 100644 index 00000000..aebabc83 --- /dev/null +++ b/app/src/libs/asset.ts @@ -0,0 +1,61 @@ +import { calculateContentDiff } from "@/utils/diff"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { gameAssetValidator } from "@/validators/asset"; +import { api } from "@/utils/api"; +import { showMutationToast, showFormErrorsToast } from "@/libs/toast"; +import { GameAssetTypes } from "@/drizzle/constants"; +import type { GameAsset } from "@/drizzle/schema"; +import type { FormEntry } from "@/layout/EditContent"; +import type { ZodGameAssetType } from "@/validators/asset"; + +/** + * Hook used when creating frontend forms for editing assets + * @param data + */ +export const useAssetEditForm = (asset: GameAsset, refetch: () => void) => { + // Form handling + const form = useForm({ + mode: "all", + criteriaMode: "all", + values: asset, + defaultValues: asset, + resolver: zodResolver(gameAssetValidator), + }); + + // Mutation for updating asset + const { mutate: updateAsset } = api.gameAsset.update.useMutation({ + onSuccess: (data) => { + showMutationToast(data); + refetch(); + }, + }); + + // Form submission + const handleAssetSubmit = form.handleSubmit( + (data: ZodGameAssetType) => { + const newAsset = { ...asset, ...data }; + const diff = calculateContentDiff(asset, newAsset); + if (diff.length > 0) { + updateAsset({ id: asset.id, data: newAsset }); + } + }, + (errors) => showFormErrorsToast(errors), + ); + + // Watch for changes to avatar + const imageUrl = form.watch("image"); + + // Object for form values + const formData: FormEntry[] = [ + { id: "name", label: "Asset Name", type: "text" }, + { id: "image", type: "avatar", href: imageUrl }, + { id: "frames", type: "number", label: "Number of Frames" }, + { id: "speed", type: "number", label: "Speed of Animation" }, + { id: "licenseDetails", type: "text", label: "License Details" }, + { id: "type", type: "str_array", values: GameAssetTypes }, + { id: "onInitialBattleField", type: "boolean" }, + ]; + + return { asset, form, formData, handleAssetSubmit }; +}; diff --git a/app/src/libs/combat/drawing.ts b/app/src/libs/combat/drawing.ts index 9ba72222..f679dccf 100644 --- a/app/src/libs/combat/drawing.ts +++ b/app/src/libs/combat/drawing.ts @@ -150,7 +150,7 @@ export const drawCombatBackground = ( * Draw/update the users on the map. Should be called on every render */ export const drawCombatEffects = (info: { - groupGround: Group; + groupEffects: Group; battle: ReturnedBattle; grid: Grid; animationId: number; @@ -158,7 +158,7 @@ export const drawCombatEffects = (info: { gameAssets: GameAsset[]; }) => { // Destructure - const { battle, groupGround, spriteMixer, animationId, gameAssets } = info; + const { battle, groupEffects, spriteMixer, animationId, gameAssets } = info; const { groundEffects, usersEffects, usersState } = battle; // Record of drawn IDs @@ -171,7 +171,7 @@ export const drawCombatEffects = (info: { y: effect.latitude, }); drawCombatEffect({ - groupGround, + groupEffects, effect, animationId, hex, @@ -189,7 +189,7 @@ export const drawCombatEffects = (info: { y: user.latitude, }); drawCombatEffect({ - groupGround, + groupEffects, effect, animationId, hex, @@ -201,7 +201,7 @@ export const drawCombatEffects = (info: { }); // Hide all which are not used anymore - groupGround.children.forEach((object) => { + groupEffects.children.forEach((object) => { if (!drawnIds.has(object.name)) { object.visible = false; } @@ -209,7 +209,7 @@ export const drawCombatEffects = (info: { }; export const drawCombatEffect = (info: { - groupGround: Group; + groupEffects: Group; effect: GroundEffect | UserEffect; animationId: number; hex?: TerrainHex; @@ -218,12 +218,12 @@ export const drawCombatEffect = (info: { gameAssets: GameAsset[]; }) => { // Destructure - const { effect, groupGround, animationId, hex, drawnIds } = info; + const { effect, groupEffects, animationId, hex, drawnIds } = info; const { spriteMixer, gameAssets } = info; if (hex) { if (effect.staticAssetPath || effect.appearAnimation || effect.disappearAnimation) { const { height: h, width: w } = hex; - let asset = groupGround.getObjectByName(effect.id) as Group; + let asset = groupEffects.getObjectByName(effect.id) as Group; if (!asset) { // Group for the asset asset = new Group(); @@ -232,7 +232,6 @@ export const drawCombatEffect = (info: { // Sprite to show if (effect.staticAssetPath) { const obj = gameAssets.find((a) => a.id === effect.staticAssetPath); - console.log("obj", obj); if (obj) { const texture = loadTexture(obj.image); const material = new SpriteMaterial({ map: texture }); @@ -271,7 +270,7 @@ export const drawCombatEffect = (info: { hp_background.visible = false; } // Add to group - groupGround.add(asset); + groupEffects.add(asset); } // Set visibility diff --git a/app/src/server/api/root.ts b/app/src/server/api/root.ts index fbbd8413..a9336c19 100644 --- a/app/src/server/api/root.ts +++ b/app/src/server/api/root.ts @@ -12,6 +12,7 @@ import { conceptartRouter } from "./routers/conceptart"; import { clanRouter } from "./routers/clan"; import { dataRouter } from "./routers/data"; import { forumRouter } from "./routers/forum"; +import { gameAssetRouter } from "./routers/asset"; import { homeRouter } from "./routers/home"; import { hospitalRouter } from "./routers/hospital"; import { itemRouter } from "./routers/item"; @@ -54,6 +55,7 @@ export const appRouter = createTRPCRouter({ clan: clanRouter, data: dataRouter, forum: forumRouter, + gameAsset: gameAssetRouter, home: homeRouter, hospital: hospitalRouter, item: itemRouter, diff --git a/app/src/server/api/routers/asset.ts b/app/src/server/api/routers/asset.ts new file mode 100644 index 00000000..c9478c43 --- /dev/null +++ b/app/src/server/api/routers/asset.ts @@ -0,0 +1,132 @@ +import { z } from "zod"; +import { nanoid } from "nanoid"; +import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; +import { serverError, baseServerResponse } from "@/api/trpc"; +import { eq } from "drizzle-orm"; +import { gameAsset } from "@/drizzle/schema"; +import { actionLog } from "@/drizzle/schema"; +import { gameAssetValidator } from "@/validators/asset"; +import { fetchUser } from "@/routers/profile"; +import { canChangeContent } from "@/utils/permissions"; +import { callDiscordContent } from "@/libs/discord"; +import { calculateContentDiff } from "@/utils/diff"; +import { IMG_AVATAR_DEFAULT } from "@/drizzle/constants"; +import { setEmptyStringsToNulls } from "@/utils/typeutils"; +import type { DrizzleClient } from "@/server/db"; + +export const gameAssetRouter = createTRPCRouter({ + getAllNames: publicProcedure.query(async ({ ctx }) => { + return await ctx.drizzle.query.gameAsset.findMany({ + columns: { id: true, name: true, image: true }, + }); + }), + getAll: publicProcedure + .input( + z + .object({ + cursor: z.number().nullish(), + limit: z.number().min(1).max(500), + }) + .optional(), + ) + .query(async ({ ctx, input }) => { + const currentCursor = input?.cursor ? input.cursor : 0; + const limit = input?.limit ? input.limit : 100; + const skip = currentCursor * limit; + const results = await ctx.drizzle.query.gameAsset.findMany({ + offset: skip, + limit: limit, + }); + const nextCursor = results.length < limit ? null : currentCursor + 1; + return { + data: results, + nextCursor: nextCursor, + }; + }), + get: publicProcedure + .input(z.object({ id: z.string() })) + .query(async ({ ctx, input }) => { + const result = await fetchgameAsset(ctx.drizzle, input.id); + if (!result) { + throw serverError("NOT_FOUND", "gameAsset not found"); + } + return result; + }), + update: protectedProcedure + .input(z.object({ id: z.string(), data: gameAssetValidator })) + .output(baseServerResponse) + .mutation(async ({ ctx, input }) => { + setEmptyStringsToNulls(input.data); + const user = await fetchUser(ctx.drizzle, ctx.userId); + const entry = await fetchgameAsset(ctx.drizzle, input.id); + if (entry && canChangeContent(user.role)) { + // Calculate diff + const diff = calculateContentDiff(entry, { + id: entry.id, + createdAt: entry.createdAt, + ...input.data, + }); + // Update database + await Promise.all([ + ctx.drizzle + .update(gameAsset) + .set(input.data) + .where(eq(gameAsset.id, entry.id)), + ctx.drizzle.insert(actionLog).values({ + id: nanoid(), + userId: ctx.userId, + tableName: "gameAsset", + changes: diff, + relatedId: entry.id, + relatedMsg: `Update: ${entry.name}`, + relatedImage: entry.image, + }), + ]); + if (process.env.NODE_ENV !== "development") { + await callDiscordContent(user.username, entry.name, diff, entry.image); + } + return { success: true, message: `Data updated: ${diff.join(". ")}` }; + } else { + return { success: false, message: `Not allowed to edit gameAsset` }; + } + }), + create: protectedProcedure.output(baseServerResponse).mutation(async ({ ctx }) => { + const user = await fetchUser(ctx.drizzle, ctx.userId); + if (canChangeContent(user.role)) { + const id = nanoid(); + await ctx.drizzle.insert(gameAsset).values({ + id: id, + name: "Placeholder", + type: "STATIC", + image: IMG_AVATAR_DEFAULT, + createdByUserId: ctx.userId, + }); + return { success: true, message: id }; + } else { + return { success: false, message: `Not allowed to create gameAsset` }; + } + }), + delete: protectedProcedure + .input(z.object({ id: z.string() })) + .output(baseServerResponse) + .mutation(async ({ ctx, input }) => { + const user = await fetchUser(ctx.drizzle, ctx.userId); + const entry = await fetchgameAsset(ctx.drizzle, input.id); + if (entry && canChangeContent(user.role)) { + await ctx.drizzle.delete(gameAsset).where(eq(gameAsset.id, input.id)); + return { success: true, message: `gameAsset deleted` }; + } else { + return { success: false, message: `Not allowed to delete gameAsset` }; + } + }), +}); + +/** + * COMMON QUERIES WHICH ARE REUSED + */ + +export const fetchgameAsset = async (client: DrizzleClient, id: string) => { + return await client.query.gameAsset.findFirst({ + where: eq(gameAsset.id, id), + }); +}; diff --git a/app/src/validators/asset.ts b/app/src/validators/asset.ts new file mode 100644 index 00000000..ba830966 --- /dev/null +++ b/app/src/validators/asset.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; +import { GameAssetTypes } from "@/drizzle/constants"; + +export const gameAssetValidator = z.object({ + name: z.string().min(1).max(191), + image: z.string().url(), + frames: z.coerce.number().int().min(1).max(100), + speed: z.coerce.number().int().min(1).max(100), + type: z.enum(GameAssetTypes), + licenseDetails: z.string().min(1).max(512), + onInitialBattleField: z.boolean(), +}); + +export type ZodGameAssetType = z.infer;