diff --git a/SVSim.Bootstrap/Data/seeds/battle-pass-levels.json b/SVSim.Bootstrap/Data/seeds/battle-pass-levels.json
index 7810eb1..d2d660a 100644
--- a/SVSim.Bootstrap/Data/seeds/battle-pass-levels.json
+++ b/SVSim.Bootstrap/Data/seeds/battle-pass-levels.json
@@ -1,702 +1,402 @@
[
{
- "id": 1,
- "reward_data": {
- "level": "1",
- "required_point": "0"
- }
+ "level": 1,
+ "required_point": 0
},
{
- "id": 2,
- "reward_data": {
- "level": "2",
- "required_point": "500"
- }
+ "level": 2,
+ "required_point": 500
},
{
- "id": 3,
- "reward_data": {
- "level": "3",
- "required_point": "1000"
- }
+ "level": 3,
+ "required_point": 1000
},
{
- "id": 4,
- "reward_data": {
- "level": "4",
- "required_point": "1500"
- }
+ "level": 4,
+ "required_point": 1500
},
{
- "id": 5,
- "reward_data": {
- "level": "5",
- "required_point": "2000"
- }
+ "level": 5,
+ "required_point": 2000
},
{
- "id": 6,
- "reward_data": {
- "level": "6",
- "required_point": "2500"
- }
+ "level": 6,
+ "required_point": 2500
},
{
- "id": 7,
- "reward_data": {
- "level": "7",
- "required_point": "3000"
- }
+ "level": 7,
+ "required_point": 3000
},
{
- "id": 8,
- "reward_data": {
- "level": "8",
- "required_point": "3500"
- }
+ "level": 8,
+ "required_point": 3500
},
{
- "id": 9,
- "reward_data": {
- "level": "9",
- "required_point": "4000"
- }
+ "level": 9,
+ "required_point": 4000
},
{
- "id": 10,
- "reward_data": {
- "level": "10",
- "required_point": "4500"
- }
+ "level": 10,
+ "required_point": 4500
},
{
- "id": 11,
- "reward_data": {
- "level": "11",
- "required_point": "5000"
- }
+ "level": 11,
+ "required_point": 5000
},
{
- "id": 12,
- "reward_data": {
- "level": "12",
- "required_point": "5500"
- }
+ "level": 12,
+ "required_point": 5500
},
{
- "id": 13,
- "reward_data": {
- "level": "13",
- "required_point": "6000"
- }
+ "level": 13,
+ "required_point": 6000
},
{
- "id": 14,
- "reward_data": {
- "level": "14",
- "required_point": "6500"
- }
+ "level": 14,
+ "required_point": 6500
},
{
- "id": 15,
- "reward_data": {
- "level": "15",
- "required_point": "7000"
- }
+ "level": 15,
+ "required_point": 7000
},
{
- "id": 16,
- "reward_data": {
- "level": "16",
- "required_point": "7500"
- }
+ "level": 16,
+ "required_point": 7500
},
{
- "id": 17,
- "reward_data": {
- "level": "17",
- "required_point": "8000"
- }
+ "level": 17,
+ "required_point": 8000
},
{
- "id": 18,
- "reward_data": {
- "level": "18",
- "required_point": "8500"
- }
+ "level": 18,
+ "required_point": 8500
},
{
- "id": 19,
- "reward_data": {
- "level": "19",
- "required_point": "9000"
- }
+ "level": 19,
+ "required_point": 9000
},
{
- "id": 20,
- "reward_data": {
- "level": "20",
- "required_point": "9500"
- }
+ "level": 20,
+ "required_point": 9500
},
{
- "id": 21,
- "reward_data": {
- "level": "21",
- "required_point": "10000"
- }
+ "level": 21,
+ "required_point": 10000
},
{
- "id": 22,
- "reward_data": {
- "level": "22",
- "required_point": "10500"
- }
+ "level": 22,
+ "required_point": 10500
},
{
- "id": 23,
- "reward_data": {
- "level": "23",
- "required_point": "11000"
- }
+ "level": 23,
+ "required_point": 11000
},
{
- "id": 24,
- "reward_data": {
- "level": "24",
- "required_point": "11500"
- }
+ "level": 24,
+ "required_point": 11500
},
{
- "id": 25,
- "reward_data": {
- "level": "25",
- "required_point": "12000"
- }
+ "level": 25,
+ "required_point": 12000
},
{
- "id": 26,
- "reward_data": {
- "level": "26",
- "required_point": "12500"
- }
+ "level": 26,
+ "required_point": 12500
},
{
- "id": 27,
- "reward_data": {
- "level": "27",
- "required_point": "13000"
- }
+ "level": 27,
+ "required_point": 13000
},
{
- "id": 28,
- "reward_data": {
- "level": "28",
- "required_point": "13500"
- }
+ "level": 28,
+ "required_point": 13500
},
{
- "id": 29,
- "reward_data": {
- "level": "29",
- "required_point": "14000"
- }
+ "level": 29,
+ "required_point": 14000
},
{
- "id": 30,
- "reward_data": {
- "level": "30",
- "required_point": "14500"
- }
+ "level": 30,
+ "required_point": 14500
},
{
- "id": 31,
- "reward_data": {
- "level": "31",
- "required_point": "15000"
- }
+ "level": 31,
+ "required_point": 15000
},
{
- "id": 32,
- "reward_data": {
- "level": "32",
- "required_point": "15500"
- }
+ "level": 32,
+ "required_point": 15500
},
{
- "id": 33,
- "reward_data": {
- "level": "33",
- "required_point": "16000"
- }
+ "level": 33,
+ "required_point": 16000
},
{
- "id": 34,
- "reward_data": {
- "level": "34",
- "required_point": "16500"
- }
+ "level": 34,
+ "required_point": 16500
},
{
- "id": 35,
- "reward_data": {
- "level": "35",
- "required_point": "17000"
- }
+ "level": 35,
+ "required_point": 17000
},
{
- "id": 36,
- "reward_data": {
- "level": "36",
- "required_point": "17500"
- }
+ "level": 36,
+ "required_point": 17500
},
{
- "id": 37,
- "reward_data": {
- "level": "37",
- "required_point": "18000"
- }
+ "level": 37,
+ "required_point": 18000
},
{
- "id": 38,
- "reward_data": {
- "level": "38",
- "required_point": "18500"
- }
+ "level": 38,
+ "required_point": 18500
},
{
- "id": 39,
- "reward_data": {
- "level": "39",
- "required_point": "19000"
- }
+ "level": 39,
+ "required_point": 19000
},
{
- "id": 40,
- "reward_data": {
- "level": "40",
- "required_point": "19500"
- }
+ "level": 40,
+ "required_point": 19500
},
{
- "id": 41,
- "reward_data": {
- "level": "41",
- "required_point": "20000"
- }
+ "level": 41,
+ "required_point": 20000
},
{
- "id": 42,
- "reward_data": {
- "level": "42",
- "required_point": "20500"
- }
+ "level": 42,
+ "required_point": 20500
},
{
- "id": 43,
- "reward_data": {
- "level": "43",
- "required_point": "21000"
- }
+ "level": 43,
+ "required_point": 21000
},
{
- "id": 44,
- "reward_data": {
- "level": "44",
- "required_point": "21500"
- }
+ "level": 44,
+ "required_point": 21500
},
{
- "id": 45,
- "reward_data": {
- "level": "45",
- "required_point": "22000"
- }
+ "level": 45,
+ "required_point": 22000
},
{
- "id": 46,
- "reward_data": {
- "level": "46",
- "required_point": "22500"
- }
+ "level": 46,
+ "required_point": 22500
},
{
- "id": 47,
- "reward_data": {
- "level": "47",
- "required_point": "23000"
- }
+ "level": 47,
+ "required_point": 23000
},
{
- "id": 48,
- "reward_data": {
- "level": "48",
- "required_point": "23500"
- }
+ "level": 48,
+ "required_point": 23500
},
{
- "id": 49,
- "reward_data": {
- "level": "49",
- "required_point": "24000"
- }
+ "level": 49,
+ "required_point": 24000
},
{
- "id": 50,
- "reward_data": {
- "level": "50",
- "required_point": "24500"
- }
+ "level": 50,
+ "required_point": 24500
},
{
- "id": 51,
- "reward_data": {
- "level": "51",
- "required_point": "25000"
- }
+ "level": 51,
+ "required_point": 25000
},
{
- "id": 52,
- "reward_data": {
- "level": "52",
- "required_point": "25500"
- }
+ "level": 52,
+ "required_point": 25500
},
{
- "id": 53,
- "reward_data": {
- "level": "53",
- "required_point": "26000"
- }
+ "level": 53,
+ "required_point": 26000
},
{
- "id": 54,
- "reward_data": {
- "level": "54",
- "required_point": "26500"
- }
+ "level": 54,
+ "required_point": 26500
},
{
- "id": 55,
- "reward_data": {
- "level": "55",
- "required_point": "27000"
- }
+ "level": 55,
+ "required_point": 27000
},
{
- "id": 56,
- "reward_data": {
- "level": "56",
- "required_point": "27500"
- }
+ "level": 56,
+ "required_point": 27500
},
{
- "id": 57,
- "reward_data": {
- "level": "57",
- "required_point": "28000"
- }
+ "level": 57,
+ "required_point": 28000
},
{
- "id": 58,
- "reward_data": {
- "level": "58",
- "required_point": "28500"
- }
+ "level": 58,
+ "required_point": 28500
},
{
- "id": 59,
- "reward_data": {
- "level": "59",
- "required_point": "29000"
- }
+ "level": 59,
+ "required_point": 29000
},
{
- "id": 60,
- "reward_data": {
- "level": "60",
- "required_point": "29500"
- }
+ "level": 60,
+ "required_point": 29500
},
{
- "id": 61,
- "reward_data": {
- "level": "61",
- "required_point": "30000"
- }
+ "level": 61,
+ "required_point": 30000
},
{
- "id": 62,
- "reward_data": {
- "level": "62",
- "required_point": "30500"
- }
+ "level": 62,
+ "required_point": 30500
},
{
- "id": 63,
- "reward_data": {
- "level": "63",
- "required_point": "31000"
- }
+ "level": 63,
+ "required_point": 31000
},
{
- "id": 64,
- "reward_data": {
- "level": "64",
- "required_point": "31500"
- }
+ "level": 64,
+ "required_point": 31500
},
{
- "id": 65,
- "reward_data": {
- "level": "65",
- "required_point": "32000"
- }
+ "level": 65,
+ "required_point": 32000
},
{
- "id": 66,
- "reward_data": {
- "level": "66",
- "required_point": "32500"
- }
+ "level": 66,
+ "required_point": 32500
},
{
- "id": 67,
- "reward_data": {
- "level": "67",
- "required_point": "33000"
- }
+ "level": 67,
+ "required_point": 33000
},
{
- "id": 68,
- "reward_data": {
- "level": "68",
- "required_point": "33500"
- }
+ "level": 68,
+ "required_point": 33500
},
{
- "id": 69,
- "reward_data": {
- "level": "69",
- "required_point": "34000"
- }
+ "level": 69,
+ "required_point": 34000
},
{
- "id": 70,
- "reward_data": {
- "level": "70",
- "required_point": "34500"
- }
+ "level": 70,
+ "required_point": 34500
},
{
- "id": 71,
- "reward_data": {
- "level": "71",
- "required_point": "35000"
- }
+ "level": 71,
+ "required_point": 35000
},
{
- "id": 72,
- "reward_data": {
- "level": "72",
- "required_point": "35500"
- }
+ "level": 72,
+ "required_point": 35500
},
{
- "id": 73,
- "reward_data": {
- "level": "73",
- "required_point": "36000"
- }
+ "level": 73,
+ "required_point": 36000
},
{
- "id": 74,
- "reward_data": {
- "level": "74",
- "required_point": "36500"
- }
+ "level": 74,
+ "required_point": 36500
},
{
- "id": 75,
- "reward_data": {
- "level": "75",
- "required_point": "37000"
- }
+ "level": 75,
+ "required_point": 37000
},
{
- "id": 76,
- "reward_data": {
- "level": "76",
- "required_point": "37500"
- }
+ "level": 76,
+ "required_point": 37500
},
{
- "id": 77,
- "reward_data": {
- "level": "77",
- "required_point": "38000"
- }
+ "level": 77,
+ "required_point": 38000
},
{
- "id": 78,
- "reward_data": {
- "level": "78",
- "required_point": "38500"
- }
+ "level": 78,
+ "required_point": 38500
},
{
- "id": 79,
- "reward_data": {
- "level": "79",
- "required_point": "39000"
- }
+ "level": 79,
+ "required_point": 39000
},
{
- "id": 80,
- "reward_data": {
- "level": "80",
- "required_point": "39500"
- }
+ "level": 80,
+ "required_point": 39500
},
{
- "id": 81,
- "reward_data": {
- "level": "81",
- "required_point": "40000"
- }
+ "level": 81,
+ "required_point": 40000
},
{
- "id": 82,
- "reward_data": {
- "level": "82",
- "required_point": "40500"
- }
+ "level": 82,
+ "required_point": 40500
},
{
- "id": 83,
- "reward_data": {
- "level": "83",
- "required_point": "41000"
- }
+ "level": 83,
+ "required_point": 41000
},
{
- "id": 84,
- "reward_data": {
- "level": "84",
- "required_point": "41500"
- }
+ "level": 84,
+ "required_point": 41500
},
{
- "id": 85,
- "reward_data": {
- "level": "85",
- "required_point": "42000"
- }
+ "level": 85,
+ "required_point": 42000
},
{
- "id": 86,
- "reward_data": {
- "level": "86",
- "required_point": "42500"
- }
+ "level": 86,
+ "required_point": 42500
},
{
- "id": 87,
- "reward_data": {
- "level": "87",
- "required_point": "43000"
- }
+ "level": 87,
+ "required_point": 43000
},
{
- "id": 88,
- "reward_data": {
- "level": "88",
- "required_point": "43500"
- }
+ "level": 88,
+ "required_point": 43500
},
{
- "id": 89,
- "reward_data": {
- "level": "89",
- "required_point": "44000"
- }
+ "level": 89,
+ "required_point": 44000
},
{
- "id": 90,
- "reward_data": {
- "level": "90",
- "required_point": "44500"
- }
+ "level": 90,
+ "required_point": 44500
},
{
- "id": 91,
- "reward_data": {
- "level": "91",
- "required_point": "45000"
- }
+ "level": 91,
+ "required_point": 45000
},
{
- "id": 92,
- "reward_data": {
- "level": "92",
- "required_point": "45500"
- }
+ "level": 92,
+ "required_point": 45500
},
{
- "id": 93,
- "reward_data": {
- "level": "93",
- "required_point": "46000"
- }
+ "level": 93,
+ "required_point": 46000
},
{
- "id": 94,
- "reward_data": {
- "level": "94",
- "required_point": "46500"
- }
+ "level": 94,
+ "required_point": 46500
},
{
- "id": 95,
- "reward_data": {
- "level": "95",
- "required_point": "47000"
- }
+ "level": 95,
+ "required_point": 47000
},
{
- "id": 96,
- "reward_data": {
- "level": "96",
- "required_point": "47500"
- }
+ "level": 96,
+ "required_point": 47500
},
{
- "id": 97,
- "reward_data": {
- "level": "97",
- "required_point": "48000"
- }
+ "level": 97,
+ "required_point": 48000
},
{
- "id": 98,
- "reward_data": {
- "level": "98",
- "required_point": "48500"
- }
+ "level": 98,
+ "required_point": 48500
},
{
- "id": 99,
- "reward_data": {
- "level": "99",
- "required_point": "49000"
- }
+ "level": 99,
+ "required_point": 49000
},
{
- "id": 100,
- "reward_data": {
- "level": "100",
- "required_point": "49500"
- }
+ "level": 100,
+ "required_point": 49500
}
]
diff --git a/SVSim.Bootstrap/Importers/BattlePassImporter.cs b/SVSim.Bootstrap/Importers/BattlePassImporter.cs
index b29d091..50c0c96 100644
--- a/SVSim.Bootstrap/Importers/BattlePassImporter.cs
+++ b/SVSim.Bootstrap/Importers/BattlePassImporter.cs
@@ -1,4 +1,3 @@
-using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using SVSim.Bootstrap.Models.Seed;
using SVSim.Database;
@@ -8,7 +7,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Idempotent upsert of battle-pass level rows from seeds/battle-pass-levels.json.
-/// Per-level reward_data blob preserved verbatim (shape varies per level).
+/// Curve is global; rows missing from the seed are LEFT INTACT.
///
public class BattlePassImporter
{
@@ -21,12 +20,10 @@ public class BattlePassImporter
int created = 0, updated = 0;
foreach (var s in seed)
{
- if (s.Id == 0) continue;
- var entry = existing.TryGetValue(s.Id, out var ex) ? ex : new BattlePassLevelEntry { Id = s.Id };
- entry.RewardData = s.RewardData.ValueKind == JsonValueKind.Undefined
- ? "{}"
- : JsonSerializer.Serialize(s.RewardData);
- if (ex is null) { context.BattlePassLevels.Add(entry); existing[s.Id] = entry; created++; }
+ if (s.Level == 0) continue;
+ var entry = existing.TryGetValue(s.Level, out var ex) ? ex : new BattlePassLevelEntry { Level = s.Level };
+ entry.RequiredPoint = s.RequiredPoint;
+ if (ex is null) { context.BattlePassLevels.Add(entry); existing[s.Level] = entry; created++; }
else updated++;
}
diff --git a/SVSim.Bootstrap/Models/Seed/BattlePassLevelSeed.cs b/SVSim.Bootstrap/Models/Seed/BattlePassLevelSeed.cs
index 0869c8d..107adab 100644
--- a/SVSim.Bootstrap/Models/Seed/BattlePassLevelSeed.cs
+++ b/SVSim.Bootstrap/Models/Seed/BattlePassLevelSeed.cs
@@ -1,11 +1,10 @@
-using System.Text.Json;
using System.Text.Json.Serialization;
namespace SVSim.Bootstrap.Models.Seed;
-/// Mirrors seeds/battle-pass-levels.json. reward_data preserved verbatim.
+/// Mirrors a single entry in seeds/battle-pass-levels.json.
public sealed class BattlePassLevelSeed
{
- [JsonPropertyName("id")] public int Id { get; set; }
- [JsonPropertyName("reward_data")] public JsonElement RewardData { get; set; }
+ [JsonPropertyName("level")] public int Level { get; set; }
+ [JsonPropertyName("required_point")] public int RequiredPoint { get; set; }
}
diff --git a/SVSim.Database/Migrations/20260527015510_RefactorBattlePassLevels.Designer.cs b/SVSim.Database/Migrations/20260527015510_RefactorBattlePassLevels.Designer.cs
new file mode 100644
index 0000000..8be0bc3
--- /dev/null
+++ b/SVSim.Database/Migrations/20260527015510_RefactorBattlePassLevels.Designer.cs
@@ -0,0 +1,2808 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using SVSim.Database;
+
+#nullable disable
+
+namespace SVSim.Database.Migrations
+{
+ [DbContext(typeof(SVSimDbContext))]
+ [Migration("20260527015510_RefactorBattlePassLevels")]
+ partial class RefactorBattlePassLevels
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.8")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.HasSequence("ShortUdidSequence")
+ .StartsAt(400000000L);
+
+ modelBuilder.Entity("DegreeEntryViewer", b =>
+ {
+ b.Property("DegreesId")
+ .HasColumnType("integer");
+
+ b.Property("ViewersId")
+ .HasColumnType("bigint");
+
+ b.HasKey("DegreesId", "ViewersId");
+
+ b.HasIndex("ViewersId");
+
+ b.ToTable("DegreeEntryViewer");
+ });
+
+ modelBuilder.Entity("EmblemEntryViewer", b =>
+ {
+ b.Property("EmblemsId")
+ .HasColumnType("integer");
+
+ b.Property("ViewersId")
+ .HasColumnType("bigint");
+
+ b.HasKey("EmblemsId", "ViewersId");
+
+ b.HasIndex("ViewersId");
+
+ b.ToTable("EmblemEntryViewer");
+ });
+
+ modelBuilder.Entity("LeaderSkinEntryViewer", b =>
+ {
+ b.Property("LeaderSkinsId")
+ .HasColumnType("integer");
+
+ b.Property("ViewersId")
+ .HasColumnType("bigint");
+
+ b.HasKey("LeaderSkinsId", "ViewersId");
+
+ b.HasIndex("ViewersId");
+
+ b.ToTable("LeaderSkinEntryViewer");
+ });
+
+ modelBuilder.Entity("MyPageBackgroundEntryViewer", b =>
+ {
+ b.Property("MyPageBackgroundsId")
+ .HasColumnType("integer");
+
+ b.Property("ViewersId")
+ .HasColumnType("bigint");
+
+ b.HasKey("MyPageBackgroundsId", "ViewersId");
+
+ b.HasIndex("ViewersId");
+
+ b.ToTable("MyPageBackgroundEntryViewer");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.SpecialBattleSetting", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("BanishEffectOverride")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ClassDestroyEffectOverride")
+ .HasColumnType("integer");
+
+ b.Property("EnemyAttachSkill")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("EnemyStartLife")
+ .HasColumnType("integer");
+
+ b.Property("EnemyStartPp")
+ .HasColumnType("integer");
+
+ b.Property("IdOverrideInBattleLog")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Note")
+ .HasColumnType("text");
+
+ b.Property("PlayerAttachSkill")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("PlayerFirstTurn")
+ .HasColumnType("integer");
+
+ b.Property("PlayerStartLife")
+ .HasColumnType("integer");
+
+ b.Property("PlayerStartPp")
+ .HasColumnType("integer");
+
+ b.Property("ResultSkip")
+ .HasColumnType("integer");
+
+ b.Property("SpecialTokenDrawEffectOverride")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TokenDrawEffectOverride")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("VsEffectOverride")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("SpecialBattleSettings");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.StoryChapter", b =>
+ {
+ b.Property("StoryId")
+ .HasColumnType("integer");
+
+ b.Property("Battle3dFieldId")
+ .HasColumnType("integer");
+
+ b.Property("BattleExists")
+ .HasColumnType("boolean");
+
+ b.Property("BgFileName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BgmId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ChapterClearTextId")
+ .HasColumnType("text");
+
+ b.Property("ChapterEffectPath")
+ .HasColumnType("text");
+
+ b.Property("ChapterId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CharaId")
+ .HasColumnType("integer");
+
+ b.Property("EnemyAiId")
+ .HasColumnType("integer");
+
+ b.Property("EnemyCharaId")
+ .HasColumnType("integer");
+
+ b.Property("EnemyClass")
+ .HasColumnType("integer");
+
+ b.Property("IsCameraMovable")
+ .HasColumnType("integer");
+
+ b.Property("IsMaintenanceChapter")
+ .HasColumnType("boolean");
+
+ b.Property("IsPlayAnotherEndAppearanceAnimation")
+ .HasColumnType("boolean");
+
+ b.Property("IsReleasedAnotherEnd")
+ .HasColumnType("boolean");
+
+ b.Property("IsSkipEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("NextChapterId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ReleasePoint")
+ .HasColumnType("integer");
+
+ b.Property("RequiredChapterId")
+ .HasColumnType("text");
+
+ b.Property("SectionId")
+ .HasColumnType("integer");
+
+ b.Property("SelectionDisplayPosition")
+ .HasColumnType("text");
+
+ b.Property("SelectionTextId")
+ .HasColumnType("text");
+
+ b.Property("ShowCoordinate")
+ .HasColumnType("integer");
+
+ b.Property("ShowSubtitles")
+ .HasColumnType("integer");
+
+ b.Property("SpecialBattleSettingId")
+ .HasColumnType("integer");
+
+ b.Property("UnlockText")
+ .HasColumnType("text");
+
+ b.Property("XCoordinate")
+ .HasColumnType("numeric");
+
+ b.Property("YCoordinate")
+ .HasColumnType("numeric");
+
+ b.HasKey("StoryId");
+
+ b.HasIndex("NextChapterId");
+
+ b.HasIndex("SpecialBattleSettingId");
+
+ b.HasIndex("SectionId", "CharaId", "ChapterId");
+
+ b.ToTable("StoryChapters");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.StorySection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("AllStoryOrderId")
+ .HasColumnType("integer");
+
+ b.Property("BackGroundId")
+ .HasColumnType("integer");
+
+ b.Property("ChapterSelectType")
+ .HasColumnType("integer");
+
+ b.Property("ImageName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsLeaderSelect")
+ .HasColumnType("boolean");
+
+ b.Property("IsPlayAnotherEndAppearanceAnimation")
+ .HasColumnType("boolean");
+
+ b.Property("IsSpoiler")
+ .HasColumnType("integer");
+
+ b.Property("IsUnderMaintenance")
+ .HasColumnType("boolean");
+
+ b.Property("NameTextKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("OrderId")
+ .HasColumnType("integer");
+
+ b.Property("SpoilerMessage")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("StoryApiType")
+ .HasColumnType("integer");
+
+ b.Property("StoryTypeOverwrite")
+ .HasColumnType("integer");
+
+ b.Property("WorldId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorldId");
+
+ b.ToTable("StorySections");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.StoryWorld", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("PanelImageName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("RibbonText")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("TitleTextKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("StoryWorlds");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.ViewerStoryBranchUnlock", b =>
+ {
+ b.Property("ViewerId")
+ .HasColumnType("bigint");
+
+ b.Property("StoryId")
+ .HasColumnType("integer");
+
+ b.Property("UnlockedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("ViewerId", "StoryId");
+
+ b.ToTable("ViewerStoryBranchUnlocks");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Entities.Story.ViewerStoryProgress", b =>
+ {
+ b.Property("ViewerId")
+ .HasColumnType("bigint");
+
+ b.Property("StoryId")
+ .HasColumnType("integer");
+
+ b.Property("FinishedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsFinish")
+ .HasColumnType("boolean");
+
+ b.Property("IsSkipped")
+ .HasColumnType("boolean");
+
+ b.Property("SkippedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("ViewerId", "StoryId");
+
+ b.ToTable("ViewerStoryProgress");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.ArenaSeasonConfig", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("Cost")
+ .HasColumnType("numeric(20,0)");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Enable")
+ .HasColumnType("integer");
+
+ b.Property("FormatInfo")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("IsJoin")
+ .HasColumnType("boolean");
+
+ b.Property("Mode")
+ .HasColumnType("integer");
+
+ b.Property("RupyCost")
+ .HasColumnType("numeric(20,0)");
+
+ b.Property("TicketCost")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("ArenaSeasons");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.AvatarAbilityEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("Ability")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("AbilityCost")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("AbilityDesc")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("BattleStartFirstPlayerTurnBp")
+ .HasColumnType("integer");
+
+ b.Property("BattleStartMaxLife")
+ .HasColumnType("integer");
+
+ b.Property("BattleStartSecondPlayerTurnBp")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("LeaderSkinId")
+ .HasColumnType("integer");
+
+ b.Property("PassiveAbility")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("PassiveAbilityDesc")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("AvatarAbilities");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.BannerEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("ChangeTime")
+ .HasColumnType("integer");
+
+ b.Property("Click")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ImageName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ImagePaths")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("RemainingTime")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Banners");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.BattlePassLevelEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Level")
+ .HasColumnType("integer");
+
+ b.Property("RequiredPoint")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("BattlePassLevels");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.BattlefieldEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsOpen")
+ .HasColumnType("boolean");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Battlefields");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.BuildDeckProductEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeckCode")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("FeaturedCardId")
+ .HasColumnType("bigint");
+
+ b.Property("IntroPriceCrystal")
+ .HasColumnType("integer");
+
+ b.Property("IntroPriceRupy")
+ .HasColumnType("integer");
+
+ b.Property("IsEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("LeaderId")
+ .HasColumnType("integer");
+
+ b.Property("ProductNameKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("PurchaseNumMax")
+ .HasColumnType("integer");
+
+ b.Property("RegularPriceCrystal")
+ .HasColumnType("integer");
+
+ b.Property("RegularPriceRupy")
+ .HasColumnType("integer");
+
+ b.Property("SeriesId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SeriesId");
+
+ b.ToTable("BuildDeckProducts");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.BuildDeckSeriesEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DrumrollPath")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IntroKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("IsNew")
+ .HasColumnType("boolean");
+
+ b.Property("NameKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("OrderIndex")
+ .HasColumnType("integer");
+
+ b.Property("TitlePath")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("BuildDeckSeries");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.CardCosmeticReward", b =>
+ {
+ b.Property("CardId")
+ .HasColumnType("bigint");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("CosmeticId")
+ .HasColumnType("bigint");
+
+ b.Property("Quantity")
+ .HasColumnType("integer");
+
+ b.HasKey("CardId", "Type", "CosmeticId");
+
+ b.HasIndex("CardId");
+
+ b.ToTable("CardCosmeticRewards");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.ClassEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Classes");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.ClassExpEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NecessaryExp")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("ClassExpCurve");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.ColosseumConfig", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("CardPoolName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ColosseumId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ColosseumName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeckFormat")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("EndTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsAllCardEnabled")
+ .HasColumnType("integer");
+
+ b.Property("IsColosseumPeriod")
+ .HasColumnType("boolean");
+
+ b.Property("IsDisplayTips")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsNormalTwoPick")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsRoundPeriod")
+ .HasColumnType("boolean");
+
+ b.Property("IsSpecialMode")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("NowRound")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SalesPeriodInfo")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("StartTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("TipsId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Colosseums");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.DailyLoginBonusEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("BonusData")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("BonusId")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("DailyLoginBonuses");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.DefaultDeckEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("CardIdArray")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("ClassId")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DeckName")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DeckNo")
+ .HasColumnType("integer");
+
+ b.Property("LeaderSkinId")
+ .HasColumnType("integer");
+
+ b.Property("SleeveId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("DefaultDecks");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.DegreeEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("Degrees");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.EmblemEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("Emblems");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.FeatureMaintenanceEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("Data")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("FeatureKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("FeatureMaintenances");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.GameConfigSection", b =>
+ {
+ b.Property("SectionName")
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ValueJson")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.HasKey("SectionName");
+
+ b.ToTable("GameConfigs");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.ItemEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Items");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.LeaderSkinEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("ClassId")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EmoteId")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClassId");
+
+ b.ToTable("LeaderSkins");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.LoadingExclusionCardEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("CardId")
+ .HasColumnType("bigint");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("LoadingExclusionCards");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.MaintenanceCardEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("bigint");
+
+ b.Property("CardId")
+ .HasColumnType("bigint");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("MaintenanceCards");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.MasterPointRankingPeriodEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("BeginTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EndTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("NecessaryScore")
+ .HasColumnType("bigint");
+
+ b.Property("PeriodNum")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("MasterPointRankingPeriods");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.MyPageBackgroundEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("MyPageBackgrounds");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.MyRotationAbilityEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("AbilityId")
+ .HasColumnType("integer");
+
+ b.Property("Data")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("MyRotationAbilities");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.MyRotationSettingEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("AbilitiesCsv")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("CardSetIdsCsv")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ReprintedCardIds")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("RestrictedCardIds")
+ .IsRequired()
+ .HasColumnType("jsonb");
+
+ b.Property("RotationId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("MyRotationSettings");
+ });
+
+ modelBuilder.Entity("SVSim.Database.Models.PackConfigEntry", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer");
+
+ b.Property("BasePackId")
+ .HasColumnType("integer");
+
+ b.Property("CommenceDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CompleteDate")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateUpdated")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("GachaDetail")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("GachaType")
+ .HasColumnType("integer");
+
+ b.Property