diff --git a/DragaliaAPI.Database/ApiContext.cs b/DragaliaAPI.Database/ApiContext.cs index f1bed91d0..734464f7b 100644 --- a/DragaliaAPI.Database/ApiContext.cs +++ b/DragaliaAPI.Database/ApiContext.cs @@ -183,4 +183,6 @@ but EF Core doesn't like this and the client probably stops you anyway? public DbSet PlayerSummonTickets { get; set; } public DbSet Emblems { get; set; } + + public DbSet PartyPowers { get; set; } } diff --git a/DragaliaAPI.Database/Entities/DbPartyPower.cs b/DragaliaAPI.Database/Entities/DbPartyPower.cs new file mode 100644 index 000000000..65e44050f --- /dev/null +++ b/DragaliaAPI.Database/Entities/DbPartyPower.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using Microsoft.EntityFrameworkCore; + +namespace DragaliaAPI.Database.Entities; + +[PrimaryKey(nameof(DeviceAccountId))] +public class DbPartyPower : IDbHasAccountId +{ + /// + public virtual DbPlayer? Owner { get; set; } + + /// + [ForeignKey(nameof(Owner))] + [Required] + public required string DeviceAccountId { get; set; } + + [Column("MaxPartyPower")] + public int MaxPartyPower { get; set; } +} diff --git a/DragaliaAPI.Database/Entities/DbPlayer.cs b/DragaliaAPI.Database/Entities/DbPlayer.cs index b2a6da173..f84671e3a 100644 --- a/DragaliaAPI.Database/Entities/DbPlayer.cs +++ b/DragaliaAPI.Database/Entities/DbPlayer.cs @@ -90,4 +90,6 @@ public class DbPlayer new List(); public virtual DbPlayerShopInfo? ShopInfo { get; set; } + + public virtual DbPartyPower? PartyPower { get; set; } } diff --git a/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.Designer.cs b/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.Designer.cs new file mode 100644 index 000000000..6291fa18a --- /dev/null +++ b/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.Designer.cs @@ -0,0 +1,2308 @@ +// +using System; +using DragaliaAPI.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace DragaliaAPI.Database.Migrations +{ + [DbContext(typeof(ApiContext))] + [Migration("20230807233558_party-power-1")] + partial class partypower1 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbAbilityCrest", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("AbilityCrestId") + .HasColumnType("integer"); + + b.Property("AttackPlusCount") + .HasColumnType("integer"); + + b.Property("BuildupCount") + .HasColumnType("integer"); + + b.Property("EquipableCount") + .HasColumnType("integer"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone"); + + b.Property("HpPlusCount") + .HasColumnType("integer"); + + b.Property("IsFavorite") + .HasColumnType("boolean"); + + b.Property("IsNew") + .HasColumnType("boolean"); + + b.Property("LimitBreakCount") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "AbilityCrestId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerAbilityCrests"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbAbilityCrestSet", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("AbilityCrestSetNo") + .HasColumnType("integer"); + + b.Property("AbilityCrestSetName") + .IsRequired() + .HasColumnType("text"); + + b.Property("CrestSlotType1CrestId1") + .HasColumnType("integer"); + + b.Property("CrestSlotType1CrestId2") + .HasColumnType("integer"); + + b.Property("CrestSlotType1CrestId3") + .HasColumnType("integer"); + + b.Property("CrestSlotType2CrestId1") + .HasColumnType("integer"); + + b.Property("CrestSlotType2CrestId2") + .HasColumnType("integer"); + + b.Property("CrestSlotType3CrestId1") + .HasColumnType("integer"); + + b.Property("CrestSlotType3CrestId2") + .HasColumnType("integer"); + + b.Property("TalismanKeyId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("DeviceAccountId", "AbilityCrestSetNo"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerAbilityCrestSets"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbDeviceAccount", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("HashedPassword") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DeviceAccounts"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbEmblem", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("EmblemId") + .HasColumnType("integer") + .HasColumnName("EmblemId"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("GetTime"); + + b.Property("IsNew") + .HasColumnType("boolean") + .HasColumnName("IsNew"); + + b.HasKey("DeviceAccountId", "EmblemId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("Emblems"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbEquippedStamp", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("Slot") + .HasColumnType("integer"); + + b.Property("StampId") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "Slot"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("EquippedStamps"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbFortBuild", b => + { + b.Property("BuildId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("BuildId")); + + b.Property("BuildEndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("BuildStartDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsNew") + .HasColumnType("boolean"); + + b.Property("LastIncomeDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("PlantId") + .HasColumnType("integer"); + + b.Property("PositionX") + .HasColumnType("integer"); + + b.Property("PositionZ") + .HasColumnType("integer"); + + b.HasKey("BuildId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerFortBuilds"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbFortDetail", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CarpenterNum") + .HasColumnType("integer") + .HasColumnName("CarpenterNum"); + + b.HasKey("DeviceAccountId"); + + b.HasIndex("DeviceAccountId") + .IsUnique(); + + b.ToTable("PlayerFortDetail"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbLoginBonus", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("Id") + .HasColumnType("integer"); + + b.Property("CurrentDay") + .HasColumnType("integer"); + + b.Property("IsComplete") + .HasColumnType("boolean"); + + b.HasKey("DeviceAccountId", "Id"); + + b.ToTable("LoginBonuses"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbParty", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("PartyNo") + .HasColumnType("integer"); + + b.Property("PartyName") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.HasKey("DeviceAccountId", "PartyNo"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PartyData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyPower", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("MaxPartyPower") + .HasColumnType("integer") + .HasColumnName("MaxPartyPower"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PartyPowers"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyUnit", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("CharaId") + .HasColumnType("integer"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("EditSkill1CharaId") + .HasColumnType("integer"); + + b.Property("EditSkill2CharaId") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId3") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId2") + .HasColumnType("integer"); + + b.Property("EquipDragonKeyId") + .HasColumnType("bigint"); + + b.Property("EquipTalismanKeyId") + .HasColumnType("bigint"); + + b.Property("EquipWeaponBodyId") + .HasColumnType("integer"); + + b.Property("EquipWeaponSkinId") + .HasColumnType("integer"); + + b.Property("PartyNo") + .HasColumnType("integer"); + + b.Property("UnitNo") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("DeviceAccountId"); + + b.HasIndex("DeviceAccountId", "PartyNo"); + + b.ToTable("PlayerPartyUnits"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayer", b => + { + b.Property("AccountId") + .HasColumnType("text"); + + b.Property("SavefileVersion") + .HasColumnType("integer"); + + b.HasKey("AccountId"); + + b.ToTable("Players"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerBannerData", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("SummonBannerId") + .HasColumnType("integer") + .HasColumnName("SummonBannerId"); + + b.Property("ConsecutionSummonPoints") + .HasColumnType("integer") + .HasColumnName("CsSummonPoints"); + + b.Property("ConsecutionSummonPointsMaxDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("CsSummonPointsMaxDate"); + + b.Property("ConsecutionSummonPointsMinDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("CsSummonPointsMinDate"); + + b.Property("DailyLimitedSummonCount") + .HasColumnType("integer") + .HasColumnName("DailyLimitedSummons"); + + b.Property("IsBeginnerFreeSummonAvailable") + .HasColumnType("integer") + .HasColumnName("BeginnerSummonAvailable"); + + b.Property("IsConsecutionFreeSummonAvailable") + .HasColumnType("integer") + .HasColumnName("CsSummonAvailable"); + + b.Property("IsFreeSummonAvailable") + .HasColumnType("integer") + .HasColumnName("FreeSummonAvailable"); + + b.Property("PityRate") + .HasColumnType("smallint") + .HasColumnName("Pity"); + + b.Property("SummonCount") + .HasColumnType("integer") + .HasColumnName("SummonCount"); + + b.Property("SummonPoints") + .HasColumnType("integer") + .HasColumnName("SummonPoints"); + + b.HasKey("DeviceAccountId", "SummonBannerId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerBannerData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerCharaData", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CharaId") + .HasColumnType("integer") + .HasColumnName("CharaId"); + + b.Property("Ability1Level") + .HasColumnType("smallint") + .HasColumnName("Abil1Lvl"); + + b.Property("Ability2Level") + .HasColumnType("smallint") + .HasColumnName("Abil2Lvl"); + + b.Property("Ability3Level") + .HasColumnType("smallint") + .HasColumnName("Abil3Lvl"); + + b.Property("AttackBase") + .HasColumnType("integer") + .HasColumnName("AtkBase"); + + b.Property("AttackNode") + .HasColumnType("integer") + .HasColumnName("AtkNode"); + + b.Property("AttackPlusCount") + .HasColumnType("smallint") + .HasColumnName("AtkPlusCount"); + + b.Property("BurstAttackLevel") + .HasColumnType("smallint") + .HasColumnName("BurstAtkLvl"); + + b.Property("ComboBuildupCount") + .HasColumnType("integer") + .HasColumnName("ComboBuildupCount"); + + b.Property("ExAbility2Level") + .HasColumnType("smallint") + .HasColumnName("ExAbility2Lvl"); + + b.Property("ExAbilityLevel") + .HasColumnType("smallint") + .HasColumnName("ExAbility1Lvl"); + + b.Property("Exp") + .HasColumnType("integer") + .HasColumnName("Exp"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("GetTime"); + + b.Property("HpBase") + .HasColumnType("integer") + .HasColumnName("HpBase"); + + b.Property("HpNode") + .HasColumnType("integer") + .HasColumnName("HpNode"); + + b.Property("HpPlusCount") + .HasColumnType("smallint") + .HasColumnName("HpPlusCount"); + + b.Property("IsNew") + .HasColumnType("boolean") + .HasColumnName("IsNew"); + + b.Property("IsTemporary") + .HasColumnType("boolean") + .HasColumnName("IsTemp"); + + b.Property("IsUnlockEditSkill") + .HasColumnType("boolean") + .HasColumnName("IsUnlockEditSkill"); + + b.Property("Level") + .HasColumnType("smallint") + .HasColumnName("Level"); + + b.Property("ListViewFlag") + .HasColumnType("boolean") + .HasColumnName("ListViewFlag"); + + b.Property("ManaNodeUnlockCount") + .HasColumnType("integer") + .HasColumnName("ManaNodeUnlockCount"); + + b.Property("Rarity") + .HasColumnType("smallint") + .HasColumnName("Rarity"); + + b.Property("Skill1Level") + .HasColumnType("smallint") + .HasColumnName("Skill1Lvl"); + + b.Property("Skill2Level") + .HasColumnType("smallint") + .HasColumnName("Skill2Lvl"); + + b.HasKey("DeviceAccountId", "CharaId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerCharaData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerCurrency", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CurrencyType") + .HasColumnType("integer") + .HasColumnName("CurrencyType"); + + b.Property("Quantity") + .HasColumnType("bigint") + .HasColumnName("Quantity"); + + b.HasKey("DeviceAccountId", "CurrencyType"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerCurrency"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeChara", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CharaId") + .HasColumnType("integer") + .HasColumnName("CharaId"); + + b.Property("MaxFloor") + .HasColumnType("integer") + .HasColumnName("MaxFloor"); + + b.Property("MaxScore") + .HasColumnType("integer") + .HasColumnName("MaxScore"); + + b.Property("SelectEditSkillCharaId1") + .HasColumnType("integer") + .HasColumnName("SelectEditSkillCharaId1"); + + b.Property("SelectEditSkillCharaId2") + .HasColumnType("integer") + .HasColumnName("SelectEditSkillCharaId2"); + + b.Property("SelectEditSkillCharaId3") + .HasColumnType("integer") + .HasColumnName("SelectEditSkillCharaId3"); + + b.Property("SelectedServitorId") + .HasColumnType("integer") + .HasColumnName("SelectedServitorId"); + + b.HasKey("DeviceAccountId", "CharaId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerDmodeCharas"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeDungeon", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CharaId") + .HasColumnType("integer") + .HasColumnName("CharaId"); + + b.Property("DungeonScore") + .HasColumnType("integer") + .HasColumnName("DungeonScore"); + + b.Property("Floor") + .HasColumnType("integer") + .HasColumnName("Floor"); + + b.Property("IsPlayEnd") + .HasColumnType("boolean") + .HasColumnName("IsPlayEnd"); + + b.Property("QuestTime") + .HasColumnType("integer") + .HasColumnName("QuestTime"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("State"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PlayerDmodeDungeons"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeExpedition", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CharaId1") + .HasColumnType("integer") + .HasColumnName("CharaId1"); + + b.Property("CharaId2") + .HasColumnType("integer") + .HasColumnName("CharaId2"); + + b.Property("CharaId3") + .HasColumnType("integer") + .HasColumnName("CharaId3"); + + b.Property("CharaId4") + .HasColumnType("integer") + .HasColumnName("CharaId4"); + + b.Property("StartTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("StartTime"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("State"); + + b.Property("TargetFloor") + .HasColumnType("integer") + .HasColumnName("TargetFloor"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PlayerDmodeExpeditions"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeInfo", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("FloorSkipCount") + .HasColumnType("integer") + .HasColumnName("FloorSkipCount"); + + b.Property("FloorSkipTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("FloorSkipTime"); + + b.Property("Point1Quantity") + .HasColumnType("integer") + .HasColumnName("Point1Quantity"); + + b.Property("Point2Quantity") + .HasColumnType("integer") + .HasColumnName("Point2Quantity"); + + b.Property("RecoveryCount") + .HasColumnType("integer") + .HasColumnName("RecoveryCount"); + + b.Property("RecoveryTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("RecoveryTime"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PlayerDmodeInfos"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeServitorPassive", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("PassiveId") + .HasColumnType("integer") + .HasColumnName("PassiveId"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("Level"); + + b.HasKey("DeviceAccountId", "PassiveId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerDmodeServitorPassives"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonData", b => + { + b.Property("DragonKeyId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("DragonKeyId"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("DragonKeyId")); + + b.Property("Ability1Level") + .HasColumnType("smallint") + .HasColumnName("Abil1Level"); + + b.Property("Ability2Level") + .HasColumnType("smallint") + .HasColumnName("Abil2Level"); + + b.Property("AttackPlusCount") + .HasColumnType("smallint") + .HasColumnName("AttackPlusCount"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("DragonId") + .HasColumnType("integer") + .HasColumnName("DragonId"); + + b.Property("Exp") + .HasColumnType("integer") + .HasColumnName("Exp"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("GetTime"); + + b.Property("HpPlusCount") + .HasColumnType("smallint") + .HasColumnName("HpPlusCount"); + + b.Property("IsLock") + .HasColumnType("boolean") + .HasColumnName("IsLocked"); + + b.Property("IsNew") + .HasColumnType("boolean") + .HasColumnName("IsNew"); + + b.Property("Level") + .HasColumnType("smallint") + .HasColumnName("Level"); + + b.Property("LimitBreakCount") + .HasColumnType("smallint") + .HasColumnName("LimitBreakCount"); + + b.Property("Skill1Level") + .HasColumnType("smallint") + .HasColumnName("Skill1Level"); + + b.HasKey("DragonKeyId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerDragonData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonGift", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text") + .HasColumnName("DeviceAccountId"); + + b.Property("DragonGiftId") + .HasColumnType("integer") + .HasColumnName("DragonGiftId"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.HasKey("DeviceAccountId", "DragonGiftId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerDragonGift"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonReliability", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("DragonId") + .HasColumnType("integer") + .HasColumnName("DragonId"); + + b.Property("Exp") + .HasColumnType("integer") + .HasColumnName("TotalExp"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastContactTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastContactTime"); + + b.Property("Level") + .HasColumnType("smallint") + .HasColumnName("Level"); + + b.HasKey("DeviceAccountId", "DragonId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerDragonReliability"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventData", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("EventId") + .HasColumnType("integer") + .HasColumnName("EventId"); + + b.Property("CustomEventFlag") + .HasColumnType("boolean") + .HasColumnName("CustomEventFlag"); + + b.HasKey("DeviceAccountId", "EventId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerEventData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventItem", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("Id"); + + b.Property("EventId") + .HasColumnType("integer") + .HasColumnName("EventId"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("Type"); + + b.HasKey("DeviceAccountId", "Id"); + + b.HasIndex("DeviceAccountId", "EventId"); + + b.ToTable("PlayerEventItems"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventPassive", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("EventId") + .HasColumnType("integer") + .HasColumnName("EventId"); + + b.Property("PassiveId") + .HasColumnType("integer") + .HasColumnName("PassiveId"); + + b.Property("Progress") + .HasColumnType("integer") + .HasColumnName("Progress"); + + b.HasKey("DeviceAccountId", "EventId", "PassiveId"); + + b.HasIndex("DeviceAccountId", "EventId"); + + b.ToTable("PlayerEventPassives"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventReward", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("EventId") + .HasColumnType("integer") + .HasColumnName("EventId"); + + b.Property("RewardId") + .HasColumnType("integer") + .HasColumnName("RewardId"); + + b.HasKey("DeviceAccountId", "EventId", "RewardId"); + + b.HasIndex("DeviceAccountId", "EventId"); + + b.ToTable("PlayerEventRewards"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerMaterial", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("MaterialId") + .HasColumnType("integer") + .HasColumnName("MaterialId"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.HasKey("DeviceAccountId", "MaterialId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerMaterial"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerMission", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("MissionId"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("Type"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("EndDate"); + + b.Property("GroupId") + .HasColumnType("integer") + .HasColumnName("GroupId"); + + b.Property("Pickup") + .HasColumnType("boolean") + .HasColumnName("Pickup"); + + b.Property("Progress") + .HasColumnType("integer") + .HasColumnName("Progress"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("StartDate"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("State"); + + b.HasKey("DeviceAccountId", "Id", "Type"); + + b.ToTable("PlayerMissions"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerPresent", b => + { + b.Property("PresentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("PresentId"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PresentId")); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreateTime"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityId") + .HasColumnType("integer") + .HasColumnName("EntityId"); + + b.Property("EntityLevel") + .HasColumnType("integer") + .HasColumnName("EntityLevel"); + + b.Property("EntityLimitBreakCount") + .HasColumnType("integer") + .HasColumnName("EntityLimitBreakCount"); + + b.Property("EntityQuantity") + .HasColumnType("integer") + .HasColumnName("EntityQuantity"); + + b.Property("EntityStatusPlusCount") + .HasColumnType("integer") + .HasColumnName("EntityStatusPlusCount"); + + b.Property("EntityType") + .HasColumnType("integer") + .HasColumnName("EntityType"); + + b.Property("MasterId") + .HasColumnType("bigint") + .HasColumnName("MasterId"); + + b.Property("MessageId") + .HasColumnType("integer") + .HasColumnName("MessageId"); + + b.Property("MessageParamValue1") + .HasColumnType("integer") + .HasColumnName("MessageParamValue1"); + + b.Property("MessageParamValue2") + .HasColumnType("integer") + .HasColumnName("MessageParamValue2"); + + b.Property("MessageParamValue3") + .HasColumnType("integer") + .HasColumnName("MessageParamValue3"); + + b.Property("MessageParamValue4") + .HasColumnType("integer") + .HasColumnName("MessageParamValue4"); + + b.Property("ReceiveLimitTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ReceiveLimitTime"); + + b.Property("State") + .HasColumnType("bigint") + .HasColumnName("State"); + + b.HasKey("PresentId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerPresent"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerPresentHistory", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("CreateTime"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityId") + .HasColumnType("integer") + .HasColumnName("EntityId"); + + b.Property("EntityLevel") + .HasColumnType("integer") + .HasColumnName("EntityLevel"); + + b.Property("EntityLimitBreakCount") + .HasColumnType("integer") + .HasColumnName("EntityLimitBreakCount"); + + b.Property("EntityQuantity") + .HasColumnType("integer") + .HasColumnName("EntityQuantity"); + + b.Property("EntityStatusPlusCount") + .HasColumnType("integer") + .HasColumnName("EntityStatusPlusCount"); + + b.Property("EntityType") + .HasColumnType("integer") + .HasColumnName("EntityType"); + + b.Property("MessageId") + .HasColumnType("integer") + .HasColumnName("MessageId"); + + b.Property("MessageParamValue1") + .HasColumnType("integer") + .HasColumnName("MessageParamValue1"); + + b.Property("MessageParamValue2") + .HasColumnType("integer") + .HasColumnName("MessageParamValue2"); + + b.Property("MessageParamValue3") + .HasColumnType("integer") + .HasColumnName("MessageParamValue3"); + + b.Property("MessageParamValue4") + .HasColumnType("integer") + .HasColumnName("MessageParamValue4"); + + b.HasKey("Id"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerPresentHistory"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerShopInfo", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("DailySummonCount") + .HasColumnType("integer"); + + b.Property("LastSummonTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PlayerShopInfos"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerShopPurchase", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("GoodsId") + .HasColumnType("integer"); + + b.Property("BuyCount") + .HasColumnType("integer"); + + b.Property("EffectEndTime") + .HasColumnType("timestamp with time zone"); + + b.Property("EffectStartTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastBuyTime") + .HasColumnType("timestamp with time zone"); + + b.Property("ShopType") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "GoodsId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerPurchases"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerStoryState", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("StoryType") + .HasColumnType("integer") + .HasColumnName("StoryType"); + + b.Property("StoryId") + .HasColumnType("integer") + .HasColumnName("StoryId"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("State"); + + b.HasKey("DeviceAccountId", "StoryType", "StoryId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerStoryState"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerSummonHistory", b => + { + b.Property("KeyId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("KeyId")); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("EntityAttackPlusCount") + .HasColumnType("integer") + .HasColumnName("AtkPlusCount"); + + b.Property("EntityHpPlusCount") + .HasColumnType("integer") + .HasColumnName("HpPlusCount"); + + b.Property("EntityId") + .HasColumnType("integer") + .HasColumnName("EntityId"); + + b.Property("EntityLevel") + .HasColumnType("smallint") + .HasColumnName("Level"); + + b.Property("EntityLimitBreakCount") + .HasColumnType("smallint") + .HasColumnName("LimitBreakCount"); + + b.Property("EntityQuantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.Property("EntityRarity") + .HasColumnType("smallint") + .HasColumnName("Rarity"); + + b.Property("EntityType") + .HasColumnType("integer") + .HasColumnName("EntityType"); + + b.Property("ExecDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("SummonDate"); + + b.Property("GetDewPointQuantity") + .HasColumnType("integer") + .HasColumnName("DewPointGet"); + + b.Property("PaymentType") + .HasColumnType("integer") + .HasColumnName("PaymentType"); + + b.Property("SummonExecType") + .HasColumnType("smallint") + .HasColumnName("SummonExecType"); + + b.Property("SummonId") + .HasColumnType("integer") + .HasColumnName("BannerId"); + + b.Property("SummonPoint") + .HasColumnType("integer") + .HasColumnName("SummonPointGet"); + + b.Property("SummonPrizeRank") + .HasColumnType("integer") + .HasColumnName("SummonPrizeRank"); + + b.HasKey("KeyId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerSummonHistory"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerTrade", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("TradeId"); + + b.Property("Count") + .HasColumnType("integer") + .HasColumnName("TradeCount"); + + b.Property("LastTradeTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("LastTrade"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("TradeType"); + + b.HasKey("DeviceAccountId", "Id"); + + b.HasIndex("DeviceAccountId"); + + b.HasIndex("DeviceAccountId", "Type"); + + b.ToTable("PlayerTrades"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerUseItem", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("ItemId") + .HasColumnType("integer") + .HasColumnName("ItemId"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.HasKey("DeviceAccountId", "ItemId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerUseItems"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerUserData", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("ActiveMemoryEventId") + .HasColumnType("integer"); + + b.Property("BuildTimePoint") + .HasColumnType("integer"); + + b.Property("Coin") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Crystal") + .HasColumnType("integer"); + + b.Property("DewPoint") + .HasColumnType("integer"); + + b.Property("EmblemId") + .HasColumnType("integer"); + + b.Property("Exp") + .HasColumnType("integer"); + + b.Property("FortOpenTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastLoginTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastSaveImportTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastStaminaMultiUpdateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("LastStaminaSingleUpdateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("MainPartyNo") + .HasColumnType("integer"); + + b.Property("ManaPoint") + .HasColumnType("integer"); + + b.Property("MaxDragonQuantity") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property("QuestSkipPoint") + .HasColumnType("integer"); + + b.Property("StaminaMulti") + .HasColumnType("integer"); + + b.Property("StaminaMultiSurplusSecond") + .HasColumnType("integer"); + + b.Property("StaminaSingle") + .HasColumnType("integer"); + + b.Property("StaminaSingleSurplusSecond") + .HasColumnType("integer"); + + b.Property("TutorialFlag") + .HasColumnType("integer"); + + b.Property("TutorialStatus") + .HasColumnType("integer"); + + b.Property("ViewerId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ViewerId")); + + b.HasKey("DeviceAccountId"); + + b.HasIndex("DeviceAccountId") + .IsUnique(); + + b.ToTable("PlayerUserData"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbQuest", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("QuestId") + .HasColumnType("integer"); + + b.Property("BestClearTime") + .HasColumnType("real"); + + b.Property("DailyPlayCount") + .HasColumnType("integer"); + + b.Property("IsAppear") + .HasColumnType("boolean"); + + b.Property("IsMissionClear1") + .HasColumnType("boolean"); + + b.Property("IsMissionClear2") + .HasColumnType("boolean"); + + b.Property("IsMissionClear3") + .HasColumnType("boolean"); + + b.Property("LastDailyResetTime") + .HasColumnType("integer"); + + b.Property("LastWeeklyResetTime") + .HasColumnType("integer"); + + b.Property("PlayCount") + .HasColumnType("integer"); + + b.Property("State") + .HasColumnType("smallint"); + + b.Property("WeeklyPlayCount") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "QuestId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerQuests"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbQuestClearPartyUnit", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("QuestId") + .HasColumnType("integer"); + + b.Property("IsMulti") + .HasColumnType("boolean"); + + b.Property("UnitNo") + .HasColumnType("integer"); + + b.Property("CharaId") + .HasColumnType("integer"); + + b.Property("EditSkill1CharaId") + .HasColumnType("integer"); + + b.Property("EditSkill2CharaId") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId3") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId2") + .HasColumnType("integer"); + + b.Property("EquipDragonKeyId") + .HasColumnType("bigint"); + + b.Property("EquipTalismanKeyId") + .HasColumnType("bigint"); + + b.Property("EquipWeaponBodyId") + .HasColumnType("integer"); + + b.Property("EquipWeaponSkinId") + .HasColumnType("integer"); + + b.Property("EquippedDragonEntityId") + .HasColumnType("integer"); + + b.Property("EquippedTalismanEntityId") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "QuestId", "IsMulti", "UnitNo"); + + b.ToTable("QuestClearPartyUnits"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbSetUnit", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("CharaId") + .HasColumnType("integer"); + + b.Property("UnitSetNo") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType1CrestId3") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType2CrestId2") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId1") + .HasColumnType("integer"); + + b.Property("EquipCrestSlotType3CrestId2") + .HasColumnType("integer"); + + b.Property("EquipDragonKeyId") + .HasColumnType("bigint"); + + b.Property("EquipTalismanKeyId") + .HasColumnType("bigint"); + + b.Property("EquipWeaponBodyId") + .HasColumnType("integer"); + + b.Property("UnitSetName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("DeviceAccountId", "CharaId", "UnitSetNo"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerSetUnit"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbSummonTicket", b => + { + b.Property("TicketKeyId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("TicketKeyId")); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ExpirationTime"); + + b.Property("Quantity") + .HasColumnType("integer") + .HasColumnName("Quantity"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("Type"); + + b.HasKey("TicketKeyId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerSummonTickets"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbTalisman", b => + { + b.Property("TalismanKeyId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("TalismanKeyId")); + + b.Property("AdditionalAttack") + .HasColumnType("integer"); + + b.Property("AdditionalHp") + .HasColumnType("integer"); + + b.Property("DeviceAccountId") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsLock") + .HasColumnType("boolean"); + + b.Property("IsNew") + .HasColumnType("boolean"); + + b.Property("TalismanAbilityId1") + .HasColumnType("integer"); + + b.Property("TalismanAbilityId2") + .HasColumnType("integer"); + + b.Property("TalismanAbilityId3") + .HasColumnType("integer"); + + b.Property("TalismanId") + .HasColumnType("integer"); + + b.HasKey("TalismanKeyId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerTalismans"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponBody", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("WeaponBodyId") + .HasColumnType("integer"); + + b.Property("AdditionalCrestSlotType1Count") + .HasColumnType("integer"); + + b.Property("AdditionalCrestSlotType2Count") + .HasColumnType("integer"); + + b.Property("AdditionalCrestSlotType3Count") + .HasColumnType("integer"); + + b.Property("BuildupCount") + .HasColumnType("integer"); + + b.Property("EquipableCount") + .HasColumnType("integer"); + + b.Property("FortPassiveCharaWeaponBuildupCount") + .HasColumnType("integer"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsNew") + .HasColumnType("boolean"); + + b.Property("LimitBreakCount") + .HasColumnType("integer"); + + b.Property("LimitOverCount") + .HasColumnType("integer"); + + b.Property("UnlockWeaponPassiveAbilityNoString") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("DeviceAccountId", "WeaponBodyId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerWeapons"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponPassiveAbility", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("WeaponPassiveAbilityId") + .HasColumnType("integer"); + + b.HasKey("DeviceAccountId", "WeaponPassiveAbilityId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerPassiveAbilities"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponSkin", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("WeaponSkinId") + .HasColumnType("integer"); + + b.Property("GetTime") + .HasColumnType("timestamp with time zone"); + + b.Property("IsNew") + .HasColumnType("boolean"); + + b.HasKey("DeviceAccountId", "WeaponSkinId"); + + b.HasIndex("DeviceAccountId"); + + b.ToTable("PlayerWeaponSkins"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbAbilityCrest", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("AbilityCrestList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbAbilityCrestSet", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("AbilityCrestSetList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbEmblem", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbEquippedStamp", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("EquippedStampList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbFortBuild", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("BuildList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbFortDetail", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("FortDetail") + .HasForeignKey("DragaliaAPI.Database.Entities.DbFortDetail", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbLoginBonus", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbParty", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("PartyList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyPower", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyUnit", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbParty", "Party") + .WithMany("Units") + .HasForeignKey("DeviceAccountId", "PartyNo") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Party"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerBannerData", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("UserSummonList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerCharaData", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("CharaList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerCurrency", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("Currencies") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeChara", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("DmodeCharas") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeDungeon", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("DmodeDungeon") + .HasForeignKey("DragaliaAPI.Database.Entities.DbPlayerDmodeDungeon", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeExpedition", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("DmodeExpedition") + .HasForeignKey("DragaliaAPI.Database.Entities.DbPlayerDmodeExpedition", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeInfo", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("DmodeInfo") + .HasForeignKey("DragaliaAPI.Database.Entities.DbPlayerDmodeInfo", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDmodeServitorPassive", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("DmodeServitorPassives") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonData", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("DragonList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonGift", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("DragonGiftList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerDragonReliability", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("DragonReliabilityList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventData", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventItem", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventPassive", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerEventReward", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerMaterial", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("MaterialList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerMission", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerPresent", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("Presents") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerPresentHistory", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("PresentHistory") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerShopInfo", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("ShopInfo") + .HasForeignKey("DragaliaAPI.Database.Entities.DbPlayerShopInfo", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerShopPurchase", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerStoryState", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("StoryStates") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerSummonHistory", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("SummonHistory") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerTrade", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerUseItem", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayerUserData", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithOne("UserData") + .HasForeignKey("DragaliaAPI.Database.Entities.DbPlayerUserData", "DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbQuest", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("QuestList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbQuestClearPartyUnit", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbSetUnit", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("UnitSets") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbSummonTicket", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbTalisman", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("TalismanList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponBody", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("WeaponBodyList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponPassiveAbility", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("WeaponPassiveAbilityList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbWeaponSkin", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany("WeaponSkinList") + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbParty", b => + { + b.Navigation("Units"); + }); + + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPlayer", b => + { + b.Navigation("AbilityCrestList"); + + b.Navigation("AbilityCrestSetList"); + + b.Navigation("BuildList"); + + b.Navigation("CharaList"); + + b.Navigation("Currencies"); + + b.Navigation("DmodeCharas"); + + b.Navigation("DmodeDungeon"); + + b.Navigation("DmodeExpedition"); + + b.Navigation("DmodeInfo"); + + b.Navigation("DmodeServitorPassives"); + + b.Navigation("DragonGiftList"); + + b.Navigation("DragonList"); + + b.Navigation("DragonReliabilityList"); + + b.Navigation("EquippedStampList"); + + b.Navigation("FortDetail"); + + b.Navigation("MaterialList"); + + b.Navigation("PartyList"); + + b.Navigation("PresentHistory"); + + b.Navigation("Presents"); + + b.Navigation("QuestList"); + + b.Navigation("ShopInfo"); + + b.Navigation("StoryStates"); + + b.Navigation("SummonHistory"); + + b.Navigation("TalismanList"); + + b.Navigation("UnitSets"); + + b.Navigation("UserData"); + + b.Navigation("UserSummonList"); + + b.Navigation("WeaponBodyList"); + + b.Navigation("WeaponPassiveAbilityList"); + + b.Navigation("WeaponSkinList"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.cs b/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.cs new file mode 100644 index 000000000..6e965bdc6 --- /dev/null +++ b/DragaliaAPI.Database/Migrations/20230807233558_party-power-1.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace DragaliaAPI.Database.Migrations +{ + /// + public partial class partypower1 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "PartyPowers", + columns: table => new + { + DeviceAccountId = table.Column(type: "text", nullable: false), + MaxPartyPower = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PartyPowers", x => x.DeviceAccountId); + table.ForeignKey( + name: "FK_PartyPowers_Players_DeviceAccountId", + column: x => x.DeviceAccountId, + principalTable: "Players", + principalColumn: "AccountId", + onDelete: ReferentialAction.Cascade); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "PartyPowers"); + } + } +} diff --git a/DragaliaAPI.Database/Migrations/ApiContextModelSnapshot.cs b/DragaliaAPI.Database/Migrations/ApiContextModelSnapshot.cs index e3923e197..f68835d4d 100644 --- a/DragaliaAPI.Database/Migrations/ApiContextModelSnapshot.cs +++ b/DragaliaAPI.Database/Migrations/ApiContextModelSnapshot.cs @@ -259,6 +259,20 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("PartyData"); }); + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyPower", b => + { + b.Property("DeviceAccountId") + .HasColumnType("text"); + + b.Property("MaxPartyPower") + .HasColumnType("integer") + .HasColumnName("MaxPartyPower"); + + b.HasKey("DeviceAccountId"); + + b.ToTable("PartyPowers"); + }); + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyUnit", b => { b.Property("Id") @@ -1822,6 +1836,17 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Owner"); }); + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyPower", b => + { + b.HasOne("DragaliaAPI.Database.Entities.DbPlayer", "Owner") + .WithMany() + .HasForeignKey("DeviceAccountId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + modelBuilder.Entity("DragaliaAPI.Database.Entities.DbPartyUnit", b => { b.HasOne("DragaliaAPI.Database.Entities.DbParty", "Party") diff --git a/DragaliaAPI.Database/Repositories/IUnitRepository.cs b/DragaliaAPI.Database/Repositories/IUnitRepository.cs index 7565d523b..37b8a75f4 100644 --- a/DragaliaAPI.Database/Repositories/IUnitRepository.cs +++ b/DragaliaAPI.Database/Repositories/IUnitRepository.cs @@ -36,6 +36,10 @@ public interface IUnitRepository Task>> GetCharaSets(IEnumerable charaId); Task FindCharaAsync(Charas chara); + Task FindDragonAsync(long dragonKeyId); + Task FindDragonReliabilityAsync(Dragons dragon); + Task FindTalismanAsync(long talismanKeyId); + Task FindWeaponBodyAsync(WeaponBodies weaponBody); DbTalisman AddTalisman( Talismans id, diff --git a/DragaliaAPI.Database/Repositories/UnitRepository.cs b/DragaliaAPI.Database/Repositories/UnitRepository.cs index c85ccf861..10aabc382 100644 --- a/DragaliaAPI.Database/Repositories/UnitRepository.cs +++ b/DragaliaAPI.Database/Repositories/UnitRepository.cs @@ -9,7 +9,6 @@ using DragaliaAPI.Shared.PlayerDetails; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; -using CharasEnum = DragaliaAPI.Shared.Definitions.Enums.Charas; namespace DragaliaAPI.Database.Repositories; @@ -75,6 +74,32 @@ public async Task CheckHasCharas(IEnumerable idList) ); } + public async Task FindDragonAsync(long dragonKeyId) + { + return await apiContext.PlayerDragonData.FindAsync(dragonKeyId); + } + + public async Task FindDragonReliabilityAsync(Dragons dragon) + { + return await apiContext.PlayerDragonReliability.FindAsync( + playerIdentityService.AccountId, + dragon + ); + } + + public async Task FindTalismanAsync(long talismanKeyId) + { + return await apiContext.PlayerTalismans.FindAsync(talismanKeyId); + } + + public async Task FindWeaponBodyAsync(WeaponBodies weaponBody) + { + return await apiContext.PlayerWeapons.FindAsync( + playerIdentityService.AccountId, + weaponBody + ); + } + public async Task CheckHasDragons(IEnumerable idList) { IEnumerable owned = await Dragons.Select(x => x.DragonId).ToListAsync(); diff --git a/DragaliaAPI.Integration.Test/Dragalia/PartyTest.cs b/DragaliaAPI.Integration.Test/Dragalia/PartyTest.cs index 05329b894..b5f5aa13a 100644 --- a/DragaliaAPI.Integration.Test/Dragalia/PartyTest.cs +++ b/DragaliaAPI.Integration.Test/Dragalia/PartyTest.cs @@ -21,6 +21,14 @@ public async Task SetPartySetting_ValidRequest_UpdatesDatabase() { this.AddCharacter(Charas.Ilia); + await AddToDatabase( + new DbWeaponBody + { + DeviceAccountId = DeviceAccountId, + WeaponBodyId = WeaponBodies.DivineTrigger + } + ); + await this.Client.PostMsgpack( "/party/set_party_setting", new PartySetPartySettingRequest( diff --git a/DragaliaAPI.Integration.Test/Features/SavefileUpdate/ISavefileUpdateTest.cs b/DragaliaAPI.Integration.Test/Features/SavefileUpdate/ISavefileUpdateTest.cs index 87891ad8e..d7baab240 100644 --- a/DragaliaAPI.Integration.Test/Features/SavefileUpdate/ISavefileUpdateTest.cs +++ b/DragaliaAPI.Integration.Test/Features/SavefileUpdate/ISavefileUpdateTest.cs @@ -21,7 +21,7 @@ ITestOutputHelper outputHelper public void ISavefileUpdate_HasExpectedCount() { // Update this test when adding a new update. - this.updates.Should().HaveCount(10); + this.updates.Should().HaveCount(11); } [Fact] diff --git a/DragaliaAPI.Shared.Test/Unit/MasterAssetTest.cs b/DragaliaAPI.Shared.Test/Unit/MasterAssetTest.cs index 8e21f8eb4..a7652e704 100644 --- a/DragaliaAPI.Shared.Test/Unit/MasterAssetTest.cs +++ b/DragaliaAPI.Shared.Test/Unit/MasterAssetTest.cs @@ -85,7 +85,17 @@ public void CharaData_Get_ReturnsExpectedProperties() Abilities32: 1074, Abilities33: 2041, Abilities34: 0, - MinDef: 10 + MinDef: 10, + ExAbilityData1: 106070004, + ExAbilityData2: 106070005, + ExAbilityData3: 106070006, + ExAbilityData4: 106070007, + ExAbilityData5: 106070008, + ExAbility2Data1: 400000735, + ExAbility2Data2: 400000736, + ExAbility2Data3: 400000737, + ExAbility2Data4: 400000738, + ExAbility2Data5: 400000740 ) ); } @@ -371,7 +381,17 @@ public void WeaponBody_Get_ReturnsExpectedProperties() CreateEntityId4: Materials.StreamOrb, CreateEntityQuantity4: 8, CreateEntityId5: 0, - CreateEntityQuantity5: 0 + CreateEntityQuantity5: 0, + LimitOverCountPartyPower1: 100, + LimitOverCountPartyPower2: 150, + BaseHp: 45, + MaxHp1: 151, + MaxHp2: 216, + MaxHp3: 0, + BaseAtk: 97, + MaxAtk1: 324, + MaxAtk2: 590, + MaxAtk3: 0 ) ); } @@ -701,7 +721,12 @@ public void AbilityCrest_Get_ReturnsExpectedProperties() Abilities13: 2340, Abilities21: 0, Abilities22: 0, - Abilities23: 0 + Abilities23: 0, + BaseHp: 14, + MaxHp: 44, + BaseAtk: 5, + MaxAtk: 25, + UnionAbilityGroupId: 4 ) ); } diff --git a/DragaliaAPI.Shared/DragaliaAPI.Shared.csproj b/DragaliaAPI.Shared/DragaliaAPI.Shared.csproj index 2aa96119a..be215fa62 100644 --- a/DragaliaAPI.Shared/DragaliaAPI.Shared.csproj +++ b/DragaliaAPI.Shared/DragaliaAPI.Shared.csproj @@ -75,6 +75,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -126,6 +129,9 @@ PreserveNewest + + PreserveNewest + Always @@ -267,6 +273,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -297,6 +306,9 @@ PreserveNewest + + PreserveNewest + diff --git a/DragaliaAPI.Shared/MasterAsset/MasterAsset.cs b/DragaliaAPI.Shared/MasterAsset/MasterAsset.cs index 763fe1d0e..0f7f67714 100644 --- a/DragaliaAPI.Shared/MasterAsset/MasterAsset.cs +++ b/DragaliaAPI.Shared/MasterAsset/MasterAsset.cs @@ -32,6 +32,9 @@ public static class MasterAsset public static readonly MasterAssetData DragonData = new("DragonData.json", x => x.Id); + public static readonly MasterAssetData DragonRarity = + new("DragonRarity.json", x => x.Id); + /// /// Contains information about quests. /// @@ -74,6 +77,9 @@ public static class MasterAsset public static readonly MasterAssetData WeaponPassiveAbility = new("WeaponPassiveAbility.json", x => x.Id); + public static readonly MasterAssetData WeaponBodyRarity = + new("WeaponBodyRarity.json", x => x.Id); + /// /// Contains information about the materials required to unbind ability crests. /// @@ -113,6 +119,12 @@ public static class MasterAsset public static readonly MasterAssetData AbilityLimitedGroup = new("AbilityLimitedGroup.json", x => x.Id); + public static readonly MasterAssetData ExAbilityData = + new("ExAbilityData.json", x => x.Id); + + public static readonly MasterAssetData UnionAbility = + new("UnionAbility.json", x => x.Id); + #region Missions public static readonly MasterAssetData AlbumMission = diff --git a/DragaliaAPI.Shared/MasterAsset/Models/AbilityCrest.cs b/DragaliaAPI.Shared/MasterAsset/Models/AbilityCrest.cs index b1b40c451..729d8dee3 100644 --- a/DragaliaAPI.Shared/MasterAsset/Models/AbilityCrest.cs +++ b/DragaliaAPI.Shared/MasterAsset/Models/AbilityCrest.cs @@ -16,7 +16,12 @@ public record AbilityCrest( int Abilities13, int Abilities21, int Abilities22, - int Abilities23 + int Abilities23, + int BaseAtk, + int MaxAtk, + int BaseHp, + int MaxHp, + int UnionAbilityGroupId ) { public int GetBuildupGroupId(BuildupPieceTypes type, int step) => diff --git a/DragaliaAPI.Shared/MasterAsset/Models/AbilityData.cs b/DragaliaAPI.Shared/MasterAsset/Models/AbilityData.cs index 41f2af39a..67c66d93f 100644 --- a/DragaliaAPI.Shared/MasterAsset/Models/AbilityData.cs +++ b/DragaliaAPI.Shared/MasterAsset/Models/AbilityData.cs @@ -7,5 +7,6 @@ public record AbilityData( AbilityTypes AbilityType1, double AbilityType1UpValue, int AbilityLimitedGroupId1, - int EventId + int EventId, + int PartyPowerWeight ); diff --git a/DragaliaAPI.Shared/MasterAsset/Models/CharaData.cs b/DragaliaAPI.Shared/MasterAsset/Models/CharaData.cs index 43929cfdf..73f1223b1 100644 --- a/DragaliaAPI.Shared/MasterAsset/Models/CharaData.cs +++ b/DragaliaAPI.Shared/MasterAsset/Models/CharaData.cs @@ -76,7 +76,17 @@ public record CharaData( int Abilities32, int Abilities33, int Abilities34, - int MinDef + int MinDef, + int ExAbilityData1, + int ExAbilityData2, + int ExAbilityData3, + int ExAbilityData4, + int ExAbilityData5, + int ExAbility2Data1, + int ExAbility2Data2, + int ExAbility2Data3, + int ExAbility2Data4, + int ExAbility2Data5 ) { public bool HasManaSpiral => this.MaxLimitBreakCount > 4; @@ -150,4 +160,48 @@ public IEnumerable GetManaNodes() { Charas.Chelle, CharaAvailabilities.Story }, { Charas.Zena, CharaAvailabilities.Story } }; + + public readonly int[] ExAbility = + { + ExAbilityData1, + ExAbilityData2, + ExAbilityData3, + ExAbilityData4, + ExAbilityData5 + }; + + public readonly int[] ExAbility2 = + { + ExAbility2Data1, + ExAbility2Data2, + ExAbility2Data3, + ExAbility2Data4, + ExAbility2Data5 + }; + + public readonly int[][] Abilities = + { + new[] { Abilities11, Abilities12, Abilities13, Abilities14 }, + new[] { Abilities21, Abilities22, Abilities23, Abilities24 }, + new[] { Abilities31, Abilities32, Abilities33, Abilities34 } + }; + + public int GetAbility(int abilityNo, int level) + { + int[] pool = Abilities[abilityNo - 1]; + + int current = 0; + + for (int i = 0; i < level; i++) + { + int val = pool[i]; + + if (val == 0) + break; + + current = val; + } + + return current; + } } diff --git a/DragaliaAPI.Shared/MasterAsset/Models/DragonData.cs b/DragaliaAPI.Shared/MasterAsset/Models/DragonData.cs index 5e3400d88..4725825c2 100644 --- a/DragaliaAPI.Shared/MasterAsset/Models/DragonData.cs +++ b/DragaliaAPI.Shared/MasterAsset/Models/DragonData.cs @@ -37,4 +37,30 @@ public record DragonData( int FavoriteType, int SellCoin, int SellDewPoint -); +) +{ + public readonly int[][] Abilities = + { + new[] { Abilities11, Abilities12, Abilities13, Abilities14, Abilities15, Abilities16 }, + new[] { Abilities21, Abilities22, Abilities23, Abilities24, Abilities25, Abilities26 } + }; + + public int GetAbility(int abilityNo, int level) + { + int[] pool = Abilities[abilityNo - 1]; + + int current = 0; + + for (int i = 0; i < level; i++) + { + int val = pool[i]; + + if (val == 0) + break; + + current = val; + } + + return current; + } +}; diff --git a/DragaliaAPI.Shared/MasterAsset/Models/DragonRarity.cs b/DragaliaAPI.Shared/MasterAsset/Models/DragonRarity.cs new file mode 100644 index 000000000..c49def78f --- /dev/null +++ b/DragaliaAPI.Shared/MasterAsset/Models/DragonRarity.cs @@ -0,0 +1,20 @@ +namespace DragaliaAPI.Shared.MasterAsset.Models; + +public record DragonRarity( + int Id, + int MaxLimitLevel, + int LimitLevel00, + int LimitLevel01, + int LimitLevel02, + int LimitLevel03, + int LimitLevel04, + int LimitLevel05, + int SkillLearningLevel01, + int Sell, + int BuildupBaseExp, + int BuildupLevelExp, + int MaxHpPlusCount, + int MaxAtkPlusCount, + int RarityBasePartyPower, + int LimitBreakCountPartyPowerWeight +); diff --git a/DragaliaAPI.Shared/MasterAsset/Models/ExAbilityData.cs b/DragaliaAPI.Shared/MasterAsset/Models/ExAbilityData.cs new file mode 100644 index 000000000..311eaeb07 --- /dev/null +++ b/DragaliaAPI.Shared/MasterAsset/Models/ExAbilityData.cs @@ -0,0 +1,3 @@ +namespace DragaliaAPI.Shared.MasterAsset.Models; + +public record ExAbilityData(int Id, int PartyPowerWeight); diff --git a/DragaliaAPI.Shared/MasterAsset/Models/UnionAbility.cs b/DragaliaAPI.Shared/MasterAsset/Models/UnionAbility.cs new file mode 100644 index 000000000..8f41de623 --- /dev/null +++ b/DragaliaAPI.Shared/MasterAsset/Models/UnionAbility.cs @@ -0,0 +1,30 @@ +namespace DragaliaAPI.Shared.MasterAsset.Models; + +public record UnionAbility( + int Id, + int CrestGroup1Count1, + int AbilityId1, + int PartyPower1, + int CrestGroup1Count2, + int AbilityId2, + int PartyPower2, + int CrestGroup1Count3, + int AbilityId3, + int PartyPower3, + int CrestGroup1Count4, + int AbilityId4, + int PartyPower4, + int CrestGroup1Count5, + int AbilityId5, + int PartyPower5 +) +{ + public readonly (int Count, int AbilityId, int Power)[] Abilities = + { + (CrestGroup1Count1, AbilityId1, PartyPower1), + (CrestGroup1Count2, AbilityId2, PartyPower2), + (CrestGroup1Count3, AbilityId3, PartyPower3), + (CrestGroup1Count4, AbilityId4, PartyPower4), + (CrestGroup1Count5, AbilityId5, PartyPower5) + }; +}; diff --git a/DragaliaAPI.Shared/MasterAsset/Models/WeaponBody.cs b/DragaliaAPI.Shared/MasterAsset/Models/WeaponBody.cs index 7121ea13a..532c66374 100644 --- a/DragaliaAPI.Shared/MasterAsset/Models/WeaponBody.cs +++ b/DragaliaAPI.Shared/MasterAsset/Models/WeaponBody.cs @@ -78,7 +78,17 @@ public record WeaponBody( Materials CreateEntityId4, int CreateEntityQuantity4, Materials CreateEntityId5, - int CreateEntityQuantity5 + int CreateEntityQuantity5, + int LimitOverCountPartyPower1, + int LimitOverCountPartyPower2, + int BaseHp, + int MaxHp1, + int MaxHp2, + int MaxHp3, + int BaseAtk, + int MaxAtk1, + int MaxAtk2, + int MaxAtk3 ) { public Dictionary CreateMaterialMap { get; } = @@ -121,4 +131,20 @@ public int GetBuildupGroupId(BuildupPieceTypes type, int step) => /// The row id. public int GetPassiveAbilityId(int abilityNo) => int.Parse($"{this.WeaponPassiveAbilityGroupId}{abilityNo:00}"); + + public readonly int[] Hp = { BaseHp, MaxHp1, MaxHp2, MaxHp3 }; + + public readonly int[] Atk = { BaseAtk, MaxAtk1, MaxAtk2, MaxAtk3 }; + + public readonly int[][] Abilities = + { + new[] { Abilities11, Abilities12, Abilities13 }, + new[] { Abilities21, Abilities22, Abilities23 } + }; + + public int GetAbility(int abilityNo, int level) + { + int[] pool = Abilities[abilityNo - 1]; + return level < 1 || level > 3 ? 0 : pool[level - 1]; + } }; diff --git a/DragaliaAPI.Shared/MasterAsset/Models/WeaponBodyRarity.cs b/DragaliaAPI.Shared/MasterAsset/Models/WeaponBodyRarity.cs new file mode 100644 index 000000000..48e6ed6d9 --- /dev/null +++ b/DragaliaAPI.Shared/MasterAsset/Models/WeaponBodyRarity.cs @@ -0,0 +1,8 @@ +namespace DragaliaAPI.Shared.MasterAsset.Models; + +public record WeaponBodyRarity( + int Id, + int MaxLimitLevelByLimitBreak4, + int MaxLimitLevelByLimitBreak8, + int MaxLimitLevelByLimitBreak9 +); diff --git a/DragaliaAPI.Shared/Resources/DragonRarity.json b/DragaliaAPI.Shared/Resources/DragonRarity.json new file mode 100644 index 000000000..2d664bc61 --- /dev/null +++ b/DragaliaAPI.Shared/Resources/DragonRarity.json @@ -0,0 +1 @@ +[{"_Id":1,"_MaxLimitLevel":0,"_LimitLevel00":0,"_LimitLevel01":0,"_LimitLevel02":0,"_LimitLevel03":0,"_LimitLevel04":0,"_LimitLevel05":0,"_SkillLearningLevel01":0,"_Sell":0,"_BuildupBaseExp":0,"_BuildupLevelExp":0,"_MaxHpPlusCount":0,"_MaxAtkPlusCount":0,"_RarityBasePartyPower":0,"_LimitBreakCountPartyPowerWeight":0},{"_Id":2,"_MaxLimitLevel":50,"_LimitLevel00":10,"_LimitLevel01":20,"_LimitLevel02":30,"_LimitLevel03":40,"_LimitLevel04":50,"_LimitLevel05":50,"_SkillLearningLevel01":1,"_Sell":50,"_BuildupBaseExp":250,"_BuildupLevelExp":5,"_MaxHpPlusCount":50,"_MaxAtkPlusCount":50,"_RarityBasePartyPower":0,"_LimitBreakCountPartyPowerWeight":0},{"_Id":3,"_MaxLimitLevel":60,"_LimitLevel00":20,"_LimitLevel01":30,"_LimitLevel02":40,"_LimitLevel03":50,"_LimitLevel04":60,"_LimitLevel05":60,"_SkillLearningLevel01":1,"_Sell":120,"_BuildupBaseExp":500,"_BuildupLevelExp":10,"_MaxHpPlusCount":50,"_MaxAtkPlusCount":50,"_RarityBasePartyPower":20,"_LimitBreakCountPartyPowerWeight":5},{"_Id":4,"_MaxLimitLevel":80,"_LimitLevel00":30,"_LimitLevel01":40,"_LimitLevel02":50,"_LimitLevel03":65,"_LimitLevel04":80,"_LimitLevel05":80,"_SkillLearningLevel01":1,"_Sell":250,"_BuildupBaseExp":1000,"_BuildupLevelExp":20,"_MaxHpPlusCount":50,"_MaxAtkPlusCount":50,"_RarityBasePartyPower":60,"_LimitBreakCountPartyPowerWeight":5},{"_Id":5,"_MaxLimitLevel":120,"_LimitLevel00":40,"_LimitLevel01":55,"_LimitLevel02":70,"_LimitLevel03":85,"_LimitLevel04":100,"_LimitLevel05":120,"_SkillLearningLevel01":1,"_Sell":400,"_BuildupBaseExp":1500,"_BuildupLevelExp":30,"_MaxHpPlusCount":50,"_MaxAtkPlusCount":50,"_RarityBasePartyPower":160,"_LimitBreakCountPartyPowerWeight":10}] \ No newline at end of file diff --git a/DragaliaAPI.Shared/Resources/ExAbilityData.json b/DragaliaAPI.Shared/Resources/ExAbilityData.json new file mode 100644 index 000000000..0b9185cd4 --- /dev/null +++ b/DragaliaAPI.Shared/Resources/ExAbilityData.json @@ -0,0 +1 @@ +[{"_Id":101010001,"_Name":"EX_ABILITY_NAME_101010001","_Details":"EX_ABILITY_DETAIL_101010001","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010002,"_Name":"EX_ABILITY_NAME_101010002","_Details":"EX_ABILITY_DETAIL_101010002","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010003,"_Name":"EX_ABILITY_NAME_101010003","_Details":"EX_ABILITY_DETAIL_101010003","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010004,"_Name":"EX_ABILITY_NAME_101010004","_Details":"EX_ABILITY_DETAIL_101010004","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010005,"_Name":"EX_ABILITY_NAME_101010005","_Details":"EX_ABILITY_DETAIL_101010005","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":9.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010006,"_Name":"EX_ABILITY_NAME_101010006","_Details":"EX_ABILITY_DETAIL_101010006","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010007,"_Name":"EX_ABILITY_NAME_101010007","_Details":"EX_ABILITY_DETAIL_101010007","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010008,"_Name":"EX_ABILITY_NAME_101010008","_Details":"EX_ABILITY_DETAIL_101010008","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":13.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101010010,"_Name":"EX_ABILITY_NAME_101010010","_Details":"EX_ABILITY_DETAIL_101010010","_Category":1,"_AbilityIconName":"Icon_Ability_1020001","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020001,"_Name":"EX_ABILITY_NAME_101020001","_Details":"EX_ABILITY_DETAIL_101020001","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":1.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020002,"_Name":"EX_ABILITY_NAME_101020002","_Details":"EX_ABILITY_DETAIL_101020002","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020003,"_Name":"EX_ABILITY_NAME_101020003","_Details":"EX_ABILITY_DETAIL_101020003","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020004,"_Name":"EX_ABILITY_NAME_101020004","_Details":"EX_ABILITY_DETAIL_101020004","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020005,"_Name":"EX_ABILITY_NAME_101020005","_Details":"EX_ABILITY_DETAIL_101020005","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020006,"_Name":"EX_ABILITY_NAME_101020006","_Details":"EX_ABILITY_DETAIL_101020006","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020007,"_Name":"EX_ABILITY_NAME_101020007","_Details":"EX_ABILITY_DETAIL_101020007","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020008,"_Name":"EX_ABILITY_NAME_101020008","_Details":"EX_ABILITY_DETAIL_101020008","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101020010,"_Name":"EX_ABILITY_NAME_101020010","_Details":"EX_ABILITY_DETAIL_101020010","_Category":2,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":2,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030001,"_Name":"EX_ABILITY_NAME_101030001","_Details":"EX_ABILITY_DETAIL_101030001","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030002,"_Name":"EX_ABILITY_NAME_101030002","_Details":"EX_ABILITY_DETAIL_101030002","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030003,"_Name":"EX_ABILITY_NAME_101030003","_Details":"EX_ABILITY_DETAIL_101030003","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030004,"_Name":"EX_ABILITY_NAME_101030004","_Details":"EX_ABILITY_DETAIL_101030004","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030005,"_Name":"EX_ABILITY_NAME_101030005","_Details":"EX_ABILITY_DETAIL_101030005","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":9.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030006,"_Name":"EX_ABILITY_NAME_101030006","_Details":"EX_ABILITY_DETAIL_101030006","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030007,"_Name":"EX_ABILITY_NAME_101030007","_Details":"EX_ABILITY_DETAIL_101030007","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":11.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030008,"_Name":"EX_ABILITY_NAME_101030008","_Details":"EX_ABILITY_DETAIL_101030008","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101030010,"_Name":"EX_ABILITY_NAME_101030010","_Details":"EX_ABILITY_DETAIL_101030010","_Category":3,"_AbilityIconName":"Icon_Ability_1020003","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040001,"_Name":"EX_ABILITY_NAME_101040001","_Details":"EX_ABILITY_DETAIL_101040001","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040002,"_Name":"EX_ABILITY_NAME_101040002","_Details":"EX_ABILITY_DETAIL_101040002","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040003,"_Name":"EX_ABILITY_NAME_101040003","_Details":"EX_ABILITY_DETAIL_101040003","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040004,"_Name":"EX_ABILITY_NAME_101040004","_Details":"EX_ABILITY_DETAIL_101040004","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040005,"_Name":"EX_ABILITY_NAME_101040005","_Details":"EX_ABILITY_DETAIL_101040005","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040006,"_Name":"EX_ABILITY_NAME_101040006","_Details":"EX_ABILITY_DETAIL_101040006","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":9.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040007,"_Name":"EX_ABILITY_NAME_101040007","_Details":"EX_ABILITY_DETAIL_101040007","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":11.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040008,"_Name":"EX_ABILITY_NAME_101040008","_Details":"EX_ABILITY_DETAIL_101040008","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101040010,"_Name":"EX_ABILITY_NAME_101040010","_Details":"EX_ABILITY_DETAIL_101040010","_Category":4,"_AbilityIconName":"Icon_Ability_1020004","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050001,"_Name":"EX_ABILITY_NAME_101050001","_Details":"EX_ABILITY_DETAIL_101050001","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050002,"_Name":"EX_ABILITY_NAME_101050002","_Details":"EX_ABILITY_DETAIL_101050002","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050003,"_Name":"EX_ABILITY_NAME_101050003","_Details":"EX_ABILITY_DETAIL_101050003","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050004,"_Name":"EX_ABILITY_NAME_101050004","_Details":"EX_ABILITY_DETAIL_101050004","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050005,"_Name":"EX_ABILITY_NAME_101050005","_Details":"EX_ABILITY_DETAIL_101050005","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050006,"_Name":"EX_ABILITY_NAME_101050006","_Details":"EX_ABILITY_DETAIL_101050006","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":9.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050007,"_Name":"EX_ABILITY_NAME_101050007","_Details":"EX_ABILITY_DETAIL_101050007","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":11.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050008,"_Name":"EX_ABILITY_NAME_101050008","_Details":"EX_ABILITY_DETAIL_101050008","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101050010,"_Name":"EX_ABILITY_NAME_101050010","_Details":"EX_ABILITY_DETAIL_101050010","_Category":5,"_AbilityIconName":"Icon_Ability_1020005","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":5,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000001,"_Name":"EX_ABILITY_NAME_102000001","_Details":"EX_ABILITY_DETAIL_102000001","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000002,"_Name":"EX_ABILITY_NAME_102000002","_Details":"EX_ABILITY_DETAIL_102000002","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000003,"_Name":"EX_ABILITY_NAME_102000003","_Details":"EX_ABILITY_DETAIL_102000003","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000004,"_Name":"EX_ABILITY_NAME_102000004","_Details":"EX_ABILITY_DETAIL_102000004","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000005,"_Name":"EX_ABILITY_NAME_102000005","_Details":"EX_ABILITY_DETAIL_102000005","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000006,"_Name":"EX_ABILITY_NAME_102000006","_Details":"EX_ABILITY_DETAIL_102000006","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":9.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000007,"_Name":"EX_ABILITY_NAME_102000007","_Details":"EX_ABILITY_DETAIL_102000007","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":11.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000008,"_Name":"EX_ABILITY_NAME_102000008","_Details":"EX_ABILITY_DETAIL_102000008","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":102000010,"_Name":"EX_ABILITY_NAME_102000010","_Details":"EX_ABILITY_DETAIL_102000010","_Category":6,"_AbilityIconName":"Icon_Ability_1010002","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000001,"_Name":"EX_ABILITY_NAME_103000001","_Details":"EX_ABILITY_DETAIL_103000001","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":1.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000002,"_Name":"EX_ABILITY_NAME_103000002","_Details":"EX_ABILITY_DETAIL_103000002","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000003,"_Name":"EX_ABILITY_NAME_103000003","_Details":"EX_ABILITY_DETAIL_103000003","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000004,"_Name":"EX_ABILITY_NAME_103000004","_Details":"EX_ABILITY_DETAIL_103000004","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000005,"_Name":"EX_ABILITY_NAME_103000005","_Details":"EX_ABILITY_DETAIL_103000005","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000006,"_Name":"EX_ABILITY_NAME_103000006","_Details":"EX_ABILITY_DETAIL_103000006","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000007,"_Name":"EX_ABILITY_NAME_103000007","_Details":"EX_ABILITY_DETAIL_103000007","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000008,"_Name":"EX_ABILITY_NAME_103000008","_Details":"EX_ABILITY_DETAIL_103000008","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103000010,"_Name":"EX_ABILITY_NAME_103000010","_Details":"EX_ABILITY_DETAIL_103000010","_Category":7,"_AbilityIconName":"Icon_Ability_1020010","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":7,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000001,"_Name":"EX_ABILITY_NAME_104000001","_Details":"EX_ABILITY_DETAIL_104000001","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000002,"_Name":"EX_ABILITY_NAME_104000002","_Details":"EX_ABILITY_DETAIL_104000002","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":80,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000003,"_Name":"EX_ABILITY_NAME_104000003","_Details":"EX_ABILITY_DETAIL_104000003","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000004,"_Name":"EX_ABILITY_NAME_104000004","_Details":"EX_ABILITY_DETAIL_104000004","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":140,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000005,"_Name":"EX_ABILITY_NAME_104000005","_Details":"EX_ABILITY_DETAIL_104000005","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000006,"_Name":"EX_ABILITY_NAME_104000006","_Details":"EX_ABILITY_DETAIL_104000006","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000007,"_Name":"EX_ABILITY_NAME_104000007","_Details":"EX_ABILITY_DETAIL_104000007","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000008,"_Name":"EX_ABILITY_NAME_104000008","_Details":"EX_ABILITY_DETAIL_104000008","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":104000010,"_Name":"EX_ABILITY_NAME_104000010","_Details":"EX_ABILITY_DETAIL_104000010","_Category":8,"_AbilityIconName":"Icon_Ability_1020009","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":8,"_VariousId1":0,"_TargetAction1":6,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000004,"_Name":"EX_ABILITY_NAME_136000004","_Details":"EX_ABILITY_DETAIL_136000004","_Category":9,"_AbilityIconName":"Icon_Ability_1020032","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":1,"_VariousId2":8,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000005,"_Name":"EX_ABILITY_NAME_136000005","_Details":"EX_ABILITY_DETAIL_136000005","_Category":9,"_AbilityIconName":"Icon_Ability_1020032","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":1,"_VariousId2":8,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000006,"_Name":"EX_ABILITY_NAME_136000006","_Details":"EX_ABILITY_DETAIL_136000006","_Category":9,"_AbilityIconName":"Icon_Ability_1020032","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":1,"_VariousId2":8,"_TargetAction2":0,"_AbilityType2UpValue0":15.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000007,"_Name":"EX_ABILITY_NAME_136000007","_Details":"EX_ABILITY_DETAIL_136000007","_Category":9,"_AbilityIconName":"Icon_Ability_1020032","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":9.0,"_AbilityType2":1,"_VariousId2":8,"_TargetAction2":0,"_AbilityType2UpValue0":15.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000008,"_Name":"EX_ABILITY_NAME_136000008","_Details":"EX_ABILITY_DETAIL_136000008","_Category":9,"_AbilityIconName":"Icon_Ability_1020032","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":1,"_VariousId2":8,"_TargetAction2":0,"_AbilityType2UpValue0":20.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000004,"_Name":"EX_ABILITY_NAME_106000004","_Details":"EX_ABILITY_DETAIL_106000001","_Category":10,"_AbilityIconName":"Icon_Ability_1010016","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":16,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":11.0,"_AbilityType2":9,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000005,"_Name":"EX_ABILITY_NAME_106000005","_Details":"EX_ABILITY_DETAIL_106000001","_Category":10,"_AbilityIconName":"Icon_Ability_1010016","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":16,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":9,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000006,"_Name":"EX_ABILITY_NAME_106000006","_Details":"EX_ABILITY_DETAIL_106000001","_Category":10,"_AbilityIconName":"Icon_Ability_1010016","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":16,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":13.0,"_AbilityType2":9,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000007,"_Name":"EX_ABILITY_NAME_106000007","_Details":"EX_ABILITY_DETAIL_106000001","_Category":10,"_AbilityIconName":"Icon_Ability_1010016","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":16,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":9,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000008,"_Name":"EX_ABILITY_NAME_106000008","_Details":"EX_ABILITY_DETAIL_106000001","_Category":10,"_AbilityIconName":"Icon_Ability_1010016","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":16,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":9,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":126000004,"_Name":"EX_ABILITY_NAME_126000004","_Details":"EX_ABILITY_DETAIL_126000001","_Category":12,"_AbilityIconName":"Icon_Ability_1020011","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":26,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":17.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":126000005,"_Name":"EX_ABILITY_NAME_126000005","_Details":"EX_ABILITY_DETAIL_126000001","_Category":12,"_AbilityIconName":"Icon_Ability_1020011","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":26,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":126000006,"_Name":"EX_ABILITY_NAME_126000006","_Details":"EX_ABILITY_DETAIL_126000001","_Category":12,"_AbilityIconName":"Icon_Ability_1020011","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":26,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":23.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":126000007,"_Name":"EX_ABILITY_NAME_126000007","_Details":"EX_ABILITY_DETAIL_126000001","_Category":12,"_AbilityIconName":"Icon_Ability_1020011","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":26,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":26.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":126000008,"_Name":"EX_ABILITY_NAME_126000008","_Details":"EX_ABILITY_DETAIL_126000001","_Category":12,"_AbilityIconName":"Icon_Ability_1020011","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":26,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":30.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":118000004,"_Name":"EX_ABILITY_NAME_118000004","_Details":"EX_ABILITY_DETAIL_118000004","_Category":13,"_AbilityIconName":"Icon_Ability_1010006","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":18,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":118000005,"_Name":"EX_ABILITY_NAME_118000005","_Details":"EX_ABILITY_DETAIL_118000005","_Category":13,"_AbilityIconName":"Icon_Ability_1010006","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":18,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":118000006,"_Name":"EX_ABILITY_NAME_118000006","_Details":"EX_ABILITY_DETAIL_118000006","_Category":13,"_AbilityIconName":"Icon_Ability_1010006","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":18,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":118000007,"_Name":"EX_ABILITY_NAME_118000007","_Details":"EX_ABILITY_DETAIL_118000007","_Category":13,"_AbilityIconName":"Icon_Ability_1010006","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":18,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":118000008,"_Name":"EX_ABILITY_NAME_118000008","_Details":"EX_ABILITY_DETAIL_118000008","_Category":13,"_AbilityIconName":"Icon_Ability_1010006","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":18,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000012,"_Name":"EX_ABILITY_NAME_106000012","_Details":"EX_ABILITY_DETAIL_106000012","_Category":17,"_AbilityIconName":"Icon_Ability_1010001","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":2,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000013,"_Name":"EX_ABILITY_NAME_106000013","_Details":"EX_ABILITY_DETAIL_106000013","_Category":17,"_AbilityIconName":"Icon_Ability_1010001","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":2,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000014,"_Name":"EX_ABILITY_NAME_106000014","_Details":"EX_ABILITY_DETAIL_106000014","_Category":17,"_AbilityIconName":"Icon_Ability_1010001","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":2,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000015,"_Name":"EX_ABILITY_NAME_106000015","_Details":"EX_ABILITY_DETAIL_106000015","_Category":17,"_AbilityIconName":"Icon_Ability_1010001","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":2,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106000016,"_Name":"EX_ABILITY_NAME_106000016","_Details":"EX_ABILITY_DETAIL_106000016","_Category":17,"_AbilityIconName":"Icon_Ability_1010001","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":2,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570404,"_Name":"EX_ABILITY_NAME_157570404","_Details":"EX_ABILITY_DETAIL_157570404","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570405,"_Name":"EX_ABILITY_NAME_157570405","_Details":"EX_ABILITY_DETAIL_157570405","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570406,"_Name":"EX_ABILITY_NAME_157570406","_Details":"EX_ABILITY_DETAIL_157570406","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570407,"_Name":"EX_ABILITY_NAME_157570407","_Details":"EX_ABILITY_DETAIL_157570407","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570408,"_Name":"EX_ABILITY_NAME_157570408","_Details":"EX_ABILITY_DETAIL_157570408","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101060005,"_Name":"EX_ABILITY_NAME_101060005","_Details":"EX_ABILITY_DETAIL_101060005","_Category":18,"_AbilityIconName":"Icon_Ability_1010041","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":1,"_VariousId2":3,"_TargetAction2":0,"_AbilityType2UpValue0":5.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101060006,"_Name":"EX_ABILITY_NAME_101060006","_Details":"EX_ABILITY_DETAIL_101060006","_Category":18,"_AbilityIconName":"Icon_Ability_1010041","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":1,"_VariousId2":3,"_TargetAction2":0,"_AbilityType2UpValue0":6.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101060007,"_Name":"EX_ABILITY_NAME_101060007","_Details":"EX_ABILITY_DETAIL_101060007","_Category":18,"_AbilityIconName":"Icon_Ability_1010041","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":1,"_VariousId2":3,"_TargetAction2":0,"_AbilityType2UpValue0":7.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101060008,"_Name":"EX_ABILITY_NAME_101060008","_Details":"EX_ABILITY_DETAIL_101060008","_Category":18,"_AbilityIconName":"Icon_Ability_1010041","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":1,"_VariousId2":3,"_TargetAction2":0,"_AbilityType2UpValue0":8.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101060010,"_Name":"EX_ABILITY_NAME_101060010","_Details":"EX_ABILITY_DETAIL_101060010","_Category":18,"_AbilityIconName":"Icon_Ability_1010041","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":1,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":1,"_VariousId2":3,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":120040004,"_Name":"EX_ABILITY_NAME_120040004","_Details":"EX_ABILITY_DETAIL_120040004","_Category":19,"_AbilityIconName":"Icon_Ability_1070004","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":20,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":120040005,"_Name":"EX_ABILITY_NAME_120040005","_Details":"EX_ABILITY_DETAIL_120040005","_Category":19,"_AbilityIconName":"Icon_Ability_1070004","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":20,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":120040006,"_Name":"EX_ABILITY_NAME_120040006","_Details":"EX_ABILITY_DETAIL_120040006","_Category":19,"_AbilityIconName":"Icon_Ability_1070004","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":20,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":120040007,"_Name":"EX_ABILITY_NAME_120040007","_Details":"EX_ABILITY_DETAIL_120040007","_Category":19,"_AbilityIconName":"Icon_Ability_1070004","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":20,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":120040008,"_Name":"EX_ABILITY_NAME_120040008","_Details":"EX_ABILITY_DETAIL_120040008","_Category":19,"_AbilityIconName":"Icon_Ability_1070004","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":20,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106070004,"_Name":"EX_ABILITY_NAME_106070004","_Details":"EX_ABILITY_DETAIL_106070004","_Category":20,"_AbilityIconName":"Icon_Ability_1010045","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":1,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106070005,"_Name":"EX_ABILITY_NAME_106070005","_Details":"EX_ABILITY_DETAIL_106070005","_Category":20,"_AbilityIconName":"Icon_Ability_1010045","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":1,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106070006,"_Name":"EX_ABILITY_NAME_106070006","_Details":"EX_ABILITY_DETAIL_106070006","_Category":20,"_AbilityIconName":"Icon_Ability_1010045","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":1,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106070007,"_Name":"EX_ABILITY_NAME_106070007","_Details":"EX_ABILITY_DETAIL_106070007","_Category":20,"_AbilityIconName":"Icon_Ability_1010045","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":1,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106070008,"_Name":"EX_ABILITY_NAME_106070008","_Details":"EX_ABILITY_DETAIL_106070008","_Category":20,"_AbilityIconName":"Icon_Ability_1010045","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":1,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106080004,"_Name":"EX_ABILITY_NAME_106080004","_Details":"EX_ABILITY_DETAIL_106080004","_Category":21,"_AbilityIconName":"Icon_Ability_1070016","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":50,"_ConditionValue":21.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106080005,"_Name":"EX_ABILITY_NAME_106080005","_Details":"EX_ABILITY_DETAIL_106080005","_Category":21,"_AbilityIconName":"Icon_Ability_1070016","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":50,"_ConditionValue":21.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106080006,"_Name":"EX_ABILITY_NAME_106080006","_Details":"EX_ABILITY_DETAIL_106080006","_Category":21,"_AbilityIconName":"Icon_Ability_1070016","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":50,"_ConditionValue":21.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106080007,"_Name":"EX_ABILITY_NAME_106080007","_Details":"EX_ABILITY_DETAIL_106080007","_Category":21,"_AbilityIconName":"Icon_Ability_1070016","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":50,"_ConditionValue":21.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":106080008,"_Name":"EX_ABILITY_NAME_106080008","_Details":"EX_ABILITY_DETAIL_106080008","_Category":21,"_AbilityIconName":"Icon_Ability_1070016","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":50,"_ConditionValue":21.0,"_Probability":0,"_AbilityType1":6,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000001,"_Name":"EX_ABILITY_NAME_109000001","_Details":"EX_ABILITY_DETAIL_109000001","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":50,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000003,"_Name":"EX_ABILITY_NAME_109000003","_Details":"EX_ABILITY_DETAIL_109000003","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":110,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000005,"_Name":"EX_ABILITY_NAME_109000005","_Details":"EX_ABILITY_DETAIL_109000005","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000006,"_Name":"EX_ABILITY_NAME_109000006","_Details":"EX_ABILITY_DETAIL_109000006","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000007,"_Name":"EX_ABILITY_NAME_109000007","_Details":"EX_ABILITY_DETAIL_109000007","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000008,"_Name":"EX_ABILITY_NAME_109000008","_Details":"EX_ABILITY_DETAIL_109000008","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":109000009,"_Name":"EX_ABILITY_NAME_109000009","_Details":"EX_ABILITY_DETAIL_109000009","_Category":22,"_AbilityIconName":"Icon_Ability_1020013","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":9,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":166000004,"_Name":"EX_ABILITY_NAME_166000004","_Details":"EX_ABILITY_DETAIL_166000004","_Category":23,"_AbilityIconName":"Icon_Ability_1010078","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":66,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":17.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":166000005,"_Name":"EX_ABILITY_NAME_166000005","_Details":"EX_ABILITY_DETAIL_166000005","_Category":23,"_AbilityIconName":"Icon_Ability_1010078","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":66,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":166000006,"_Name":"EX_ABILITY_NAME_166000006","_Details":"EX_ABILITY_DETAIL_166000006","_Category":23,"_AbilityIconName":"Icon_Ability_1010078","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":66,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":23.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":166000007,"_Name":"EX_ABILITY_NAME_166000007","_Details":"EX_ABILITY_DETAIL_166000007","_Category":23,"_AbilityIconName":"Icon_Ability_1010078","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":66,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":26.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":166000008,"_Name":"EX_ABILITY_NAME_166000008","_Details":"EX_ABILITY_DETAIL_166000008","_Category":23,"_AbilityIconName":"Icon_Ability_1010078","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":66,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":30.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103150001,"_Name":"EX_ABILITY_NAME_103150001","_Details":"EX_ABILITY_DETAIL_103150001","_Category":24,"_AbilityIconName":"Icon_Ability_1010094","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":3,"_VariousId1":15,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":47,"_VariousId2":15,"_TargetAction2":0,"_AbilityType2UpValue0":10.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103150002,"_Name":"EX_ABILITY_NAME_103150002","_Details":"EX_ABILITY_DETAIL_103150002","_Category":24,"_AbilityIconName":"Icon_Ability_1010094","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":3,"_VariousId1":15,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":47,"_VariousId2":15,"_TargetAction2":0,"_AbilityType2UpValue0":12.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103150003,"_Name":"EX_ABILITY_NAME_103150003","_Details":"EX_ABILITY_DETAIL_103150003","_Category":24,"_AbilityIconName":"Icon_Ability_1010094","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":3,"_VariousId1":15,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":47,"_VariousId2":15,"_TargetAction2":0,"_AbilityType2UpValue0":14.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103150004,"_Name":"EX_ABILITY_NAME_103150004","_Details":"EX_ABILITY_DETAIL_103150004","_Category":24,"_AbilityIconName":"Icon_Ability_1010094","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":3,"_VariousId1":15,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":47,"_VariousId2":15,"_TargetAction2":0,"_AbilityType2UpValue0":16.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":103150005,"_Name":"EX_ABILITY_NAME_103150005","_Details":"EX_ABILITY_DETAIL_103150005","_Category":24,"_AbilityIconName":"Icon_Ability_1010094","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":3,"_VariousId1":15,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":47,"_VariousId2":15,"_TargetAction2":0,"_AbilityType2UpValue0":20.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101100002,"_Name":"EX_ABILITY_NAME_101100002","_Details":"EX_ABILITY_DETAIL_101100001","_Category":25,"_AbilityIconName":"Icon_Ability_1020014","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":10,"_TargetAction1":0,"_AbilityType1UpValue0":2.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101100003,"_Name":"EX_ABILITY_NAME_101100003","_Details":"EX_ABILITY_DETAIL_101100001","_Category":25,"_AbilityIconName":"Icon_Ability_1020014","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":10,"_TargetAction1":0,"_AbilityType1UpValue0":3.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101100004,"_Name":"EX_ABILITY_NAME_101100004","_Details":"EX_ABILITY_DETAIL_101100001","_Category":25,"_AbilityIconName":"Icon_Ability_1020014","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":10,"_TargetAction1":0,"_AbilityType1UpValue0":4.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101100005,"_Name":"EX_ABILITY_NAME_101100005","_Details":"EX_ABILITY_DETAIL_101100001","_Category":25,"_AbilityIconName":"Icon_Ability_1020014","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":10,"_TargetAction1":0,"_AbilityType1UpValue0":5.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":101100007,"_Name":"EX_ABILITY_NAME_101100007","_Details":"EX_ABILITY_DETAIL_101100001","_Category":25,"_AbilityIconName":"Icon_Ability_1020014","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":1,"_VariousId1":10,"_TargetAction1":0,"_AbilityType1UpValue0":7.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570001,"_Name":"EX_ABILITY_NAME_157570001","_Details":"EX_ABILITY_DETAIL_157570001","_Category":26,"_AbilityIconName":"Icon_Ability_1090003","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570002,"_Name":"EX_ABILITY_NAME_157570002","_Details":"EX_ABILITY_DETAIL_157570002","_Category":26,"_AbilityIconName":"Icon_Ability_1090003","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570003,"_Name":"EX_ABILITY_NAME_157570003","_Details":"EX_ABILITY_DETAIL_157570003","_Category":26,"_AbilityIconName":"Icon_Ability_1090003","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570004,"_Name":"EX_ABILITY_NAME_157570004","_Details":"EX_ABILITY_DETAIL_157570004","_Category":26,"_AbilityIconName":"Icon_Ability_1090003","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":18.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570005,"_Name":"EX_ABILITY_NAME_157570005","_Details":"EX_ABILITY_DETAIL_157570005","_Category":26,"_AbilityIconName":"Icon_Ability_1090003","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":3,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570409,"_Name":"EX_ABILITY_NAME_157570409","_Details":"EX_ABILITY_DETAIL_157570409","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":170,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":6.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570410,"_Name":"EX_ABILITY_NAME_157570410","_Details":"EX_ABILITY_DETAIL_157570410","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":8.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570411,"_Name":"EX_ABILITY_NAME_157570411","_Details":"EX_ABILITY_DETAIL_157570411","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":230,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570412,"_Name":"EX_ABILITY_NAME_157570412","_Details":"EX_ABILITY_DETAIL_157570412","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":260,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":157570413,"_Name":"EX_ABILITY_NAME_157570413","_Details":"EX_ABILITY_DETAIL_157570413","_Category":16,"_AbilityIconName":"Icon_Ability_1090004","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":57,"_VariousId1":4,"_TargetAction1":0,"_AbilityType1UpValue0":15.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000009,"_Name":"EX_ABILITY_NAME_136000009","_Details":"EX_ABILITY_DETAIL_136000009","_Category":27,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":160,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":10.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000010,"_Name":"EX_ABILITY_NAME_136000010","_Details":"EX_ABILITY_DETAIL_136000010","_Category":27,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":200,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":12.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000011,"_Name":"EX_ABILITY_NAME_136000011","_Details":"EX_ABILITY_DETAIL_136000011","_Category":27,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":240,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":14.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000012,"_Name":"EX_ABILITY_NAME_136000012","_Details":"EX_ABILITY_DETAIL_136000012","_Category":27,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":280,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":16.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0},{"_Id":136000013,"_Name":"EX_ABILITY_NAME_136000013","_Details":"EX_ABILITY_DETAIL_136000013","_Category":27,"_AbilityIconName":"Icon_Ability_1020002","_PartyPowerWeight":320,"_UnitType":0,"_ElementalType":0,"_WeaponType":0,"_ConditionType":0,"_ConditionValue":0.0,"_Probability":0,"_AbilityType1":36,"_VariousId1":0,"_TargetAction1":0,"_AbilityType1UpValue0":20.0,"_AbilityType2":0,"_VariousId2":0,"_TargetAction2":0,"_AbilityType2UpValue0":0.0,"_AbilityType3":0,"_VariousId3":0,"_TargetAction3":0,"_AbilityType3UpValue0":0.0}] \ No newline at end of file diff --git a/DragaliaAPI.Shared/Resources/UnionAbility.json b/DragaliaAPI.Shared/Resources/UnionAbility.json new file mode 100644 index 000000000..f074bd30a --- /dev/null +++ b/DragaliaAPI.Shared/Resources/UnionAbility.json @@ -0,0 +1 @@ +[{"_Id":1,"_Name":"UNION_BONUS_NAME_1","_IconEffect":"pf_UnionMatchEffect","_SortId":1,"_CrestGroup1Count1":4,"_AbilityId1":110060009,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":2,"_Name":"UNION_BONUS_NAME_2","_IconEffect":"pf_UnionMatchEffect","_SortId":2,"_CrestGroup1Count1":4,"_AbilityId1":110080009,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":3,"_Name":"UNION_BONUS_NAME_3","_IconEffect":"pf_UnionMatchEffect","_SortId":3,"_CrestGroup1Count1":4,"_AbilityId1":120010236,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":4,"_Name":"UNION_BONUS_NAME_4","_IconEffect":"pf_UnionMatchEffect","_SortId":4,"_CrestGroup1Count1":3,"_AbilityId1":110010413,"_PartyPower1":80,"_CrestGroup1Count2":4,"_AbilityId2":110010414,"_PartyPower2":100,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":5,"_Name":"UNION_BONUS_NAME_5","_IconEffect":"pf_UnionMatchEffect_yellow","_SortId":6,"_CrestGroup1Count1":2,"_AbilityId1":1376,"_PartyPower1":60,"_CrestGroup1Count2":3,"_AbilityId2":1377,"_PartyPower2":80,"_CrestGroup1Count3":4,"_AbilityId3":1378,"_PartyPower3":100,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":6,"_Name":"UNION_BONUS_NAME_6","_IconEffect":"pf_UnionMatchEffect","_SortId":5,"_CrestGroup1Count1":2,"_AbilityId1":110070008,"_PartyPower1":60,"_CrestGroup1Count2":3,"_AbilityId2":110070009,"_PartyPower2":80,"_CrestGroup1Count3":4,"_AbilityId3":110070010,"_PartyPower3":100,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":7,"_Name":"UNION_BONUS_NAME_7","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":8,"_CrestGroup1Count1":2,"_AbilityId1":110020207,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":8,"_Name":"UNION_BONUS_NAME_8","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":12,"_CrestGroup1Count1":2,"_AbilityId1":110020607,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":9,"_Name":"UNION_BONUS_NAME_9","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":10,"_CrestGroup1Count1":2,"_AbilityId1":110020409,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":10,"_Name":"UNION_BONUS_NAME_10","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":13,"_CrestGroup1Count1":2,"_AbilityId1":110020710,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":11,"_Name":"UNION_BONUS_NAME_11","_IconEffect":"pf_UnionMatchEffect_green","_SortId":16,"_CrestGroup1Count1":2,"_AbilityId1":110130009,"_PartyPower1":60,"_CrestGroup1Count2":3,"_AbilityId2":110130010,"_PartyPower2":80,"_CrestGroup1Count3":4,"_AbilityId3":110130011,"_PartyPower3":100,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":12,"_Name":"UNION_BONUS_NAME_12","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":7,"_CrestGroup1Count1":2,"_AbilityId1":110020106,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":13,"_Name":"UNION_BONUS_NAME_13","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":9,"_CrestGroup1Count1":2,"_AbilityId1":110020306,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":14,"_Name":"UNION_BONUS_NAME_14","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":11,"_CrestGroup1Count1":2,"_AbilityId1":110020506,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":15,"_Name":"UNION_BONUS_NAME_15","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":14,"_CrestGroup1Count1":2,"_AbilityId1":110020906,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0},{"_Id":16,"_Name":"UNION_BONUS_NAME_16","_IconEffect":"pf_UnionMatchEffect_purple","_SortId":15,"_CrestGroup1Count1":2,"_AbilityId1":110021006,"_PartyPower1":100,"_CrestGroup1Count2":0,"_AbilityId2":0,"_PartyPower2":0,"_CrestGroup1Count3":0,"_AbilityId3":0,"_PartyPower3":0,"_CrestGroup1Count4":0,"_AbilityId4":0,"_PartyPower4":0,"_CrestGroup1Count5":0,"_AbilityId5":0,"_PartyPower5":0}] \ No newline at end of file diff --git a/DragaliaAPI.Shared/Resources/WeaponBodyRarity.json b/DragaliaAPI.Shared/Resources/WeaponBodyRarity.json new file mode 100644 index 000000000..5aa0de9ff --- /dev/null +++ b/DragaliaAPI.Shared/Resources/WeaponBodyRarity.json @@ -0,0 +1,135 @@ +[ + { + "_Id": 0, + "_MaxLimitBreakCountByLimitOver0": 0, + "_MaxLimitBreakCountByLimitOver1": 0, + "_MaxLimitBreakCountByLimitOver2": 0, + "_MaxLimitLevelByLimitBreak0": 0, + "_MaxLimitLevelByLimitBreak1": 0, + "_MaxLimitLevelByLimitBreak2": 0, + "_MaxLimitLevelByLimitBreak3": 0, + "_MaxLimitLevelByLimitBreak4": 0, + "_MaxLimitLevelByLimitBreak5": 0, + "_MaxLimitLevelByLimitBreak6": 0, + "_MaxLimitLevelByLimitBreak7": 0, + "_MaxLimitLevelByLimitBreak8": 0, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 1, + "_MaxLimitBreakCountByLimitOver0": 0, + "_MaxLimitBreakCountByLimitOver1": 0, + "_MaxLimitBreakCountByLimitOver2": 0, + "_MaxLimitLevelByLimitBreak0": 0, + "_MaxLimitLevelByLimitBreak1": 0, + "_MaxLimitLevelByLimitBreak2": 0, + "_MaxLimitLevelByLimitBreak3": 0, + "_MaxLimitLevelByLimitBreak4": 0, + "_MaxLimitLevelByLimitBreak5": 0, + "_MaxLimitLevelByLimitBreak6": 0, + "_MaxLimitLevelByLimitBreak7": 0, + "_MaxLimitLevelByLimitBreak8": 0, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 2, + "_MaxLimitBreakCountByLimitOver0": 4, + "_MaxLimitBreakCountByLimitOver1": 8, + "_MaxLimitBreakCountByLimitOver2": 12, + "_MaxLimitLevelByLimitBreak0": 6, + "_MaxLimitLevelByLimitBreak1": 7, + "_MaxLimitLevelByLimitBreak2": 8, + "_MaxLimitLevelByLimitBreak3": 9, + "_MaxLimitLevelByLimitBreak4": 10, + "_MaxLimitLevelByLimitBreak5": 0, + "_MaxLimitLevelByLimitBreak6": 0, + "_MaxLimitLevelByLimitBreak7": 0, + "_MaxLimitLevelByLimitBreak8": 0, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 3, + "_MaxLimitBreakCountByLimitOver0": 4, + "_MaxLimitBreakCountByLimitOver1": 8, + "_MaxLimitBreakCountByLimitOver2": 12, + "_MaxLimitLevelByLimitBreak0": 12, + "_MaxLimitLevelByLimitBreak1": 14, + "_MaxLimitLevelByLimitBreak2": 16, + "_MaxLimitLevelByLimitBreak3": 18, + "_MaxLimitLevelByLimitBreak4": 20, + "_MaxLimitLevelByLimitBreak5": 0, + "_MaxLimitLevelByLimitBreak6": 0, + "_MaxLimitLevelByLimitBreak7": 0, + "_MaxLimitLevelByLimitBreak8": 0, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 4, + "_MaxLimitBreakCountByLimitOver0": 4, + "_MaxLimitBreakCountByLimitOver1": 8, + "_MaxLimitBreakCountByLimitOver2": 12, + "_MaxLimitLevelByLimitBreak0": 18, + "_MaxLimitLevelByLimitBreak1": 21, + "_MaxLimitLevelByLimitBreak2": 24, + "_MaxLimitLevelByLimitBreak3": 27, + "_MaxLimitLevelByLimitBreak4": 30, + "_MaxLimitLevelByLimitBreak5": 0, + "_MaxLimitLevelByLimitBreak6": 0, + "_MaxLimitLevelByLimitBreak7": 0, + "_MaxLimitLevelByLimitBreak8": 0, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 5, + "_MaxLimitBreakCountByLimitOver0": 4, + "_MaxLimitBreakCountByLimitOver1": 8, + "_MaxLimitBreakCountByLimitOver2": 12, + "_MaxLimitLevelByLimitBreak0": 30, + "_MaxLimitLevelByLimitBreak1": 35, + "_MaxLimitLevelByLimitBreak2": 40, + "_MaxLimitLevelByLimitBreak3": 45, + "_MaxLimitLevelByLimitBreak4": 50, + "_MaxLimitLevelByLimitBreak5": 55, + "_MaxLimitLevelByLimitBreak6": 60, + "_MaxLimitLevelByLimitBreak7": 65, + "_MaxLimitLevelByLimitBreak8": 70, + "_MaxLimitLevelByLimitBreak9": 0, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + }, + { + "_Id": 6, + "_MaxLimitBreakCountByLimitOver0": 4, + "_MaxLimitBreakCountByLimitOver1": 8, + "_MaxLimitBreakCountByLimitOver2": 9, + "_MaxLimitLevelByLimitBreak0": 40, + "_MaxLimitLevelByLimitBreak1": 45, + "_MaxLimitLevelByLimitBreak2": 50, + "_MaxLimitLevelByLimitBreak3": 55, + "_MaxLimitLevelByLimitBreak4": 60, + "_MaxLimitLevelByLimitBreak5": 65, + "_MaxLimitLevelByLimitBreak6": 70, + "_MaxLimitLevelByLimitBreak7": 75, + "_MaxLimitLevelByLimitBreak8": 80, + "_MaxLimitLevelByLimitBreak9": 90, + "_MaxLimitLevelByLimitBreak10": 0, + "_MaxLimitLevelByLimitBreak11": 0, + "_MaxLimitLevelByLimitBreak12": 0 + } +] \ No newline at end of file diff --git a/DragaliaAPI.Test/Controllers/PartyControllerTest.cs b/DragaliaAPI.Test/Controllers/PartyControllerTest.cs index 81bc8e85e..ee9ce8d70 100644 --- a/DragaliaAPI.Test/Controllers/PartyControllerTest.cs +++ b/DragaliaAPI.Test/Controllers/PartyControllerTest.cs @@ -1,6 +1,7 @@ using AutoMapper; using DragaliaAPI.Controllers.Dragalia; using DragaliaAPI.Database.Repositories; +using DragaliaAPI.Features.PartyPower; using DragaliaAPI.Models.Generated; using DragaliaAPI.Services; using Microsoft.Extensions.Logging; @@ -36,7 +37,9 @@ public PartyControllerTest() this.mockUserDataRepository.Object, this.mockUpdateDataService.Object, mapper, - this.mockLogger.Object + this.mockLogger.Object, + new Mock().Object, + new Mock().Object ); this.partyController.SetupMockContext(); } diff --git a/DragaliaAPI.Test/Services/AbilityCrestServiceTest.cs b/DragaliaAPI.Test/Services/AbilityCrestServiceTest.cs index 400d265d2..0996708bd 100644 --- a/DragaliaAPI.Test/Services/AbilityCrestServiceTest.cs +++ b/DragaliaAPI.Test/Services/AbilityCrestServiceTest.cs @@ -322,7 +322,27 @@ BuildupPieceTypes buildupType ) { AbilityCrest abilityCrest = - new(0, 0, 0, 0, Materials.Empty, Materials.Empty, 0, 0, 0, 0, 0, 0, 0, 0); + new( + 0, + 0, + 0, + 0, + Materials.Empty, + Materials.Empty, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ); AtgenBuildupAbilityCrestPieceList pieceList = new() { @@ -713,7 +733,27 @@ int dewpoint public async Task TryBuildup_Level_WithInvalidBuildupLevelIdReturnsInvalidResultCode() { AbilityCrest abilityCrest = - new(0, 0, 0, 0, Materials.Empty, Materials.Empty, 0, 0, 0, 0, 0, 0, 0, 0); + new( + 0, + 0, + 0, + 0, + Materials.Empty, + Materials.Empty, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ); AtgenBuildupAbilityCrestPieceList pieceList = new() { diff --git a/DragaliaAPI/AutoMapper/Profiles/PartyPowerMapProfile.cs b/DragaliaAPI/AutoMapper/Profiles/PartyPowerMapProfile.cs new file mode 100644 index 000000000..d2c7e8073 --- /dev/null +++ b/DragaliaAPI/AutoMapper/Profiles/PartyPowerMapProfile.cs @@ -0,0 +1,16 @@ +using AutoMapper; +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Models.Generated; + +namespace DragaliaAPI.AutoMapper.Profiles; + +public class PartyPowerMapProfile : Profile +{ + public PartyPowerMapProfile() + { + this.CreateMap(); + + this.SourceMemberNamingConvention = DatabaseNamingConvention.Instance; + this.DestinationMemberNamingConvention = LowerUnderscoreNamingConvention.Instance; + } +} diff --git a/DragaliaAPI/AutoMapper/Profiles/PartyPowerReverseMapProfile.cs b/DragaliaAPI/AutoMapper/Profiles/PartyPowerReverseMapProfile.cs new file mode 100644 index 000000000..de49b2f65 --- /dev/null +++ b/DragaliaAPI/AutoMapper/Profiles/PartyPowerReverseMapProfile.cs @@ -0,0 +1,19 @@ +using AutoMapper; +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Models.Generated; + +namespace DragaliaAPI.AutoMapper.Profiles; + +public class PartyPowerReverseMapProfile : Profile +{ + public PartyPowerReverseMapProfile() + { + this.AddGlobalIgnore("DeviceAccount"); + this.AddGlobalIgnore("Owner"); + + this.CreateMap(); + + this.SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance; + this.DestinationMemberNamingConvention = DatabaseNamingConvention.Instance; + } +} diff --git a/DragaliaAPI/Controllers/Dragalia/PartyController.cs b/DragaliaAPI/Controllers/Dragalia/PartyController.cs index c37f30621..1c5b2a475 100644 --- a/DragaliaAPI/Controllers/Dragalia/PartyController.cs +++ b/DragaliaAPI/Controllers/Dragalia/PartyController.cs @@ -1,6 +1,7 @@ using AutoMapper; using DragaliaAPI.Database.Entities; using DragaliaAPI.Database.Repositories; +using DragaliaAPI.Features.PartyPower; using DragaliaAPI.Models; using DragaliaAPI.Models.Generated; using DragaliaAPI.Services; @@ -15,32 +16,17 @@ namespace DragaliaAPI.Controllers.Dragalia; [Consumes("application/octet-stream")] [Produces("application/octet-stream")] [ApiController] -public class PartyController : DragaliaControllerBase +public class PartyController( + IPartyRepository partyRepository, + IUnitRepository unitRepository, + IUserDataRepository userDataRepository, + IUpdateDataService updateDataService, + IMapper mapper, + ILogger logger, + IPartyPowerService partyPowerService, + IPartyPowerRepository partyPowerRepository +) : DragaliaControllerBase { - private readonly IPartyRepository partyRepository; - private readonly IUnitRepository unitRepository; - private readonly IUserDataRepository userDataRepository; - private readonly IUpdateDataService updateDataService; - private readonly IMapper mapper; - private readonly ILogger logger; - - public PartyController( - IPartyRepository partyRepository, - IUnitRepository unitRepository, - IUserDataRepository userDataRepository, - IUpdateDataService updateDataService, - IMapper mapper, - ILogger logger - ) - { - this.partyRepository = partyRepository; - this.unitRepository = unitRepository; - this.userDataRepository = userDataRepository; - this.updateDataService = updateDataService; - this.mapper = mapper; - this.logger = logger; - } - /// /// Does not seem to do anything useful. /// ILSpy indicates the response should contain halidom info, but it is always empty and only called on fresh accounts. @@ -71,6 +57,15 @@ public async Task SetPartySetting(PartySetPartySettingRequest re } } + int partyPower = await partyPowerService.CalculatePartyPower( + requestParty.request_party_setting_list + ); + + await partyPowerRepository.SetMaxPartyPowerAsync(partyPower); + + logger.LogTrace("Party power {power}", partyPower); + // TODO: PartyPower event + DbParty dbEntry = mapper.Map( new PartyList( requestParty.party_no, @@ -89,9 +84,9 @@ public async Task SetPartySetting(PartySetPartySettingRequest re [HttpPost("set_main_party_no")] public async Task SetMainPartyNo(PartySetMainPartyNoRequest request) { - await this.userDataRepository.SetMainPartyNo(request.main_party_no); + await userDataRepository.SetMainPartyNo(request.main_party_no); - await this.updateDataService.SaveChangesAsync(); + await updateDataService.SaveChangesAsync(); return this.Ok(new PartySetMainPartyNoData(request.main_party_no)); } @@ -99,9 +94,9 @@ public async Task SetMainPartyNo(PartySetMainPartyNoRequest requ [HttpPost("update_party_name")] public async Task UpdatePartyName(PartyUpdatePartyNameRequest request) { - await this.partyRepository.UpdatePartyName(request.party_no, request.party_name); + await partyRepository.UpdatePartyName(request.party_no, request.party_name); - UpdateDataList updateDataList = await this.updateDataService.SaveChangesAsync(); + UpdateDataList updateDataList = await updateDataService.SaveChangesAsync(); return this.Ok(new PartyUpdatePartyNameData() { update_data_list = updateDataList }); } @@ -112,7 +107,7 @@ private async Task ValidateCharacterId(Charas id) return true; // TODO: can make this single query instead of 8 (this method is called in a loop) - IEnumerable ownedCharaIds = await this.unitRepository.Charas + IEnumerable ownedCharaIds = await unitRepository.Charas .Select(x => x.CharaId) .ToListAsync(); @@ -137,7 +132,7 @@ private async Task ValidateDragonKeyId(ulong keyId) if (keyId == 0) return true; - IEnumerable ownedDragonKeyIds = await this.unitRepository.Dragons + IEnumerable ownedDragonKeyIds = await unitRepository.Dragons .Select(x => x.DragonKeyId) .ToListAsync(); diff --git a/DragaliaAPI/Features/GraphQL/Schema.cs b/DragaliaAPI/Features/GraphQL/Schema.cs index bbf818e25..bdf473d0d 100644 --- a/DragaliaAPI/Features/GraphQL/Schema.cs +++ b/DragaliaAPI/Features/GraphQL/Schema.cs @@ -43,6 +43,7 @@ public static IServiceCollection ConfigureGraphQlSchema(this IServiceCollection .Include(x => x.DmodeExpedition) .Include(x => x.DmodeInfo) .Include(x => x.DmodeServitorPassives) + .Include(x => x.PartyPower) .AsSplitQuery() .First( x => x.UserData != null && x.UserData.ViewerId == args.viewerId diff --git a/DragaliaAPI/Features/PartyPower/IPartyPowerRepository.cs b/DragaliaAPI/Features/PartyPower/IPartyPowerRepository.cs new file mode 100644 index 000000000..16abb5182 --- /dev/null +++ b/DragaliaAPI/Features/PartyPower/IPartyPowerRepository.cs @@ -0,0 +1,11 @@ +using DragaliaAPI.Database.Entities; + +namespace DragaliaAPI.Features.PartyPower; + +public interface IPartyPowerRepository +{ + Task GetPartyPowerAsync(); + + Task GetMaxPartyPowerAsync(); + Task SetMaxPartyPowerAsync(int power); +} diff --git a/DragaliaAPI/Features/PartyPower/IPartyPowerService.cs b/DragaliaAPI/Features/PartyPower/IPartyPowerService.cs new file mode 100644 index 000000000..c8ec93569 --- /dev/null +++ b/DragaliaAPI/Features/PartyPower/IPartyPowerService.cs @@ -0,0 +1,24 @@ +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Models.Generated; + +namespace DragaliaAPI.Features.PartyPower; + +public interface IPartyPowerService +{ + Task CalculatePartyPower( + IEnumerable party, + FortBonusList? bonusList = null + ); + Task CalculatePartyPower(DbParty party, FortBonusList? bonusList = null); + + Task CalculateCharacterPower( + PartySettingList partySetting, + bool shouldAddSkillBonus = true, + FortBonusList? bonusList = null + ); + Task CalculateCharacterPower( + DbPartyUnit partyUnit, + bool shouldAddSkillBonus = true, + FortBonusList? bonusList = null + ); +} diff --git a/DragaliaAPI/Features/PartyPower/PartyPowerRepository.cs b/DragaliaAPI/Features/PartyPower/PartyPowerRepository.cs new file mode 100644 index 000000000..747785f0a --- /dev/null +++ b/DragaliaAPI/Features/PartyPower/PartyPowerRepository.cs @@ -0,0 +1,32 @@ +using DragaliaAPI.Database; +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Shared.PlayerDetails; + +namespace DragaliaAPI.Features.PartyPower; + +public class PartyPowerRepository( + ApiContext apiContext, + IPlayerIdentityService playerIdentityService +) : IPartyPowerRepository +{ + public async Task GetPartyPowerAsync() + { + return await apiContext.PartyPowers.FindAsync(playerIdentityService.AccountId) + ?? apiContext.PartyPowers + .Add(new DbPartyPower { DeviceAccountId = playerIdentityService.AccountId }) + .Entity; + } + + public async Task GetMaxPartyPowerAsync() + { + DbPartyPower dbPower = await GetPartyPowerAsync(); + return dbPower.MaxPartyPower; + } + + public async Task SetMaxPartyPowerAsync(int power) + { + DbPartyPower dbPower = await GetPartyPowerAsync(); + if (power > dbPower.MaxPartyPower) + dbPower.MaxPartyPower = power; + } +} diff --git a/DragaliaAPI/Features/PartyPower/PartyPowerService.cs b/DragaliaAPI/Features/PartyPower/PartyPowerService.cs new file mode 100644 index 000000000..e2eaf3ff3 --- /dev/null +++ b/DragaliaAPI/Features/PartyPower/PartyPowerService.cs @@ -0,0 +1,675 @@ +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Database.Repositories; +using DragaliaAPI.Models; +using DragaliaAPI.Models.Generated; +using DragaliaAPI.Services; +using DragaliaAPI.Services.Exceptions; +using DragaliaAPI.Shared.Definitions.Enums; +using DragaliaAPI.Shared.MasterAsset; +using DragaliaAPI.Shared.MasterAsset.Models; + +namespace DragaliaAPI.Features.PartyPower; + +public class PartyPowerService( + IUnitRepository unitRepository, + IAbilityCrestRepository abilityCrestRepository, + IBonusService bonusService +) : IPartyPowerService +{ + public async Task CalculatePartyPower( + IEnumerable party, + FortBonusList? bonusList = null + ) + { + int power = 0; + + bool isFirst = true; + + bonusList ??= await bonusService.GetBonusList(); + + foreach (PartySettingList partySetting in party) + { + power += await CalculateCharacterPower(partySetting, isFirst, bonusList); + isFirst = false; + } + + return power; + } + + public async Task CalculatePartyPower(DbParty party, FortBonusList? bonusList = null) + { + int power = 0; + + bool isFirst = true; + + bonusList ??= await bonusService.GetBonusList(); + + foreach (DbPartyUnit partyUnit in party.Units) + { + power += await CalculateCharacterPower(partyUnit, isFirst, bonusList); + isFirst = false; + } + + return power; + } + + public async Task CalculateCharacterPower( + PartySettingList partySetting, + bool shouldAddSkillBonus = true, + FortBonusList? bonusList = null + ) + { + return await CalculateCharacterPower( + partySetting.chara_id, + (long)partySetting.equip_dragon_key_id, + partySetting.equip_weapon_body_id, + (long)partySetting.equip_talisman_key_id, + partySetting.edit_skill_1_chara_id, + partySetting.edit_skill_2_chara_id, + partySetting.equip_crest_slot_type_1_crest_id_1, + partySetting.equip_crest_slot_type_1_crest_id_2, + partySetting.equip_crest_slot_type_1_crest_id_3, + partySetting.equip_crest_slot_type_2_crest_id_1, + partySetting.equip_crest_slot_type_2_crest_id_2, + partySetting.equip_crest_slot_type_3_crest_id_1, + partySetting.equip_crest_slot_type_3_crest_id_2, + shouldAddSkillBonus, + bonusList + ); + } + + public async Task CalculateCharacterPower( + DbPartyUnit partyUnit, + bool shouldAddSkillBonus = true, + FortBonusList? bonusList = null + ) + { + return await CalculateCharacterPower( + partyUnit.CharaId, + partyUnit.EquipDragonKeyId, + partyUnit.EquipWeaponBodyId, + partyUnit.EquipTalismanKeyId, + partyUnit.EditSkill1CharaId, + partyUnit.EditSkill2CharaId, + partyUnit.EquipCrestSlotType1CrestId1, + partyUnit.EquipCrestSlotType1CrestId2, + partyUnit.EquipCrestSlotType1CrestId3, + partyUnit.EquipCrestSlotType2CrestId1, + partyUnit.EquipCrestSlotType2CrestId2, + partyUnit.EquipCrestSlotType3CrestId1, + partyUnit.EquipCrestSlotType3CrestId2, + shouldAddSkillBonus, + bonusList + ); + } + + private async Task CalculateCharacterPower( + Charas charaId, + long dragonKeyId, + WeaponBodies weaponBodyId, + long talismanId, + Charas editSkill1, + Charas editSkill2, + AbilityCrests crestType1No1, + AbilityCrests crestType1No2, + AbilityCrests crestType1No3, + AbilityCrests crestType2No1, + AbilityCrests crestType2No2, + AbilityCrests crestType3No1, + AbilityCrests crestType3No2, + bool shouldAddSkillBonus = true, + FortBonusList? bonus = null + ) + { + if (charaId == 0) + return 0; + + bonus ??= await bonusService.GetBonusList(); + + DbPlayerCharaData chara = + await unitRepository.FindCharaAsync(charaId) + ?? throw new DragaliaException( + ResultCode.CommonDbError, + "No chara found for power calculation" + ); + + CharaData charaData = MasterAsset.CharaData[charaId]; + + DbPlayerDragonData? dragon = null; + DbPlayerDragonReliability? reliability = null; + DragonData? dragonData = null; + DragonRarity? dragonRarity = null; + + if (dragonKeyId != 0) + { + dragon = + await unitRepository.FindDragonAsync(dragonKeyId) + ?? throw new DragaliaException( + ResultCode.CommonDbError, + "No dragon found for power calculation" + ); + + reliability = + await unitRepository.FindDragonReliabilityAsync(dragon.DragonId) + ?? throw new DragaliaException( + ResultCode.CommonDbError, + "No reliability found for power calculation" + ); + + dragonData = MasterAsset.DragonData[dragon.DragonId]; + dragonRarity = MasterAsset.DragonRarity[dragonData.Rarity]; + } + + DbWeaponBody? dbWeapon = null; + WeaponBody? weaponBody = null; + WeaponBodyRarity? weaponRarity = null; + + if (weaponBodyId != 0) + { + dbWeapon = + await unitRepository.FindWeaponBodyAsync(weaponBodyId) + ?? throw new DragaliaException( + ResultCode.CommonDbError, + "No weapon body found for power calculation" + ); + + weaponBody = MasterAsset.WeaponBody[dbWeapon.WeaponBodyId]; + weaponRarity = MasterAsset.WeaponBodyRarity[weaponBody.Rarity]; + } + + DbTalisman? talisman = + talismanId == 0 ? null : await unitRepository.FindTalismanAsync(talismanId); + + AbilityCrests[] crests = + { + crestType1No1, + crestType1No2, + crestType1No3, + crestType2No1, + crestType2No2, + crestType3No1, + crestType3No2 + }; + + HashSet uniqueCrests = crests.Where(x => x != 0).ToHashSet(); + + List dbCrests = abilityCrestRepository.AbilityCrests + .Where(x => uniqueCrests.Contains(x.AbilityCrestId)) + .ToList(); + + double charaPowerParam = GetCharacterPower( + ref chara, + editSkill1, + editSkill2, + ref bonus, + shouldAddSkillBonus + ); + + double dragonPowerParam = GetDragonPower( + ref dragon, + ref reliability, + ref bonus, + ref dragonData, + ref dragonRarity, + charaData.ElementalType + ); + + double crestPowerParam = GetCrestPower(dbCrests, talisman); + + double weaponPowerParam = GetWeaponPower( + ref dbWeapon, + ref weaponBody, + ref weaponRarity, + charaData.ElementalType + ); + + double exAbilityPowerParam = GetExAbilityPower(ref chara, ref charaData); + + double unionBonusPowerParam = GetUnionAbilityPower(dbCrests); + + double abilityPartyPowerParam = GetAbilityPartyPower( + ref chara, + ref charaData, + ref dragon, + ref dragonData, + ref dbWeapon, + ref weaponBody, + dbCrests + ); + + double power = + unionBonusPowerParam + + crestPowerParam + + dragonPowerParam + + charaPowerParam + + weaponPowerParam + + abilityPartyPowerParam + + exAbilityPowerParam; + + return CeilToInt(power); + } + + private static int GetCharacterPower( + ref DbPlayerCharaData dbChara, + Charas editSkill1, + Charas editSkill2, + ref FortBonusList bonus, + bool addSkillBonus + ) + { + if (dbChara.CharaId == 0) + return 0; + + CharaData charaData = MasterAsset.CharaData[dbChara.CharaId]; + + (int statusPlusAtk, int statusPlusHp) = GetStatusPlusParam(ref bonus); + + BonusParams bonusParams = BonusParams.GetBonus(ref bonus, charaData.Id); + + int normalAtk = dbChara.Attack + dbChara.AttackPlusCount; + int normalHp = dbChara.Hp + dbChara.HpPlusCount; + + int fortAtk = CeilToInt((normalAtk * bonusParams.FortAtk) + statusPlusAtk); + int fortHp = CeilToInt((normalHp * bonusParams.FortHp) + statusPlusHp); + + int albumAtk = CeilToInt(normalAtk * bonusParams.AlbumAtk); + int albumHp = CeilToInt(normalHp * bonusParams.AlbumHp); + + int charaAtk = normalAtk + fortAtk + albumAtk; + int charaHp = normalHp + fortHp + albumHp; + + int skillPower = (dbChara.Skill1Level + dbChara.Skill2Level) * 100; + int burstPower = dbChara.BurstAttackLevel * 60; + int comboPower = dbChara.ComboBuildupCount * 200; + + int charaPowerParam = charaAtk + charaHp + skillPower + burstPower + comboPower; + + if (addSkillBonus) + { + if (editSkill1 != 0) + charaPowerParam += 100; + + if (editSkill2 != 0) + charaPowerParam += 100; + } + + return charaPowerParam; + } + + private static int GetCrestPower(IEnumerable crests, DbTalisman? talisman) + { + int totalCrestAtk = 0; + int totalCrestHp = 0; + + foreach (DbAbilityCrest crest in crests) + { + (int crestAtk, int crestHp) = GetAbilityCrest( + crest.AbilityCrestId, + crest.BuildupCount, + crest.AttackPlusCount, + crest.HpPlusCount + ); + totalCrestAtk += crestAtk; + totalCrestHp += crestHp; + } + + if (talisman != null) + { + totalCrestHp += 20 + talisman.AdditionalHp; + totalCrestAtk += 10 + talisman.AdditionalAttack; + } + + int crestPower = totalCrestHp + totalCrestAtk; + + return crestPower; + } + + private static int GetDragonPower( + ref DbPlayerDragonData? dbDragon, + ref DbPlayerDragonReliability? reliability, + ref FortBonusList bonus, + ref DragonData? dragonData, + ref DragonRarity? rarity, + UnitElement charaElement + ) + { + if (dbDragon == null || reliability == null || dragonData == null || rarity == null) + return 0; + + int maxLevel = rarity.Id == 5 ? rarity.LimitLevel04 : rarity.MaxLimitLevel; + + int levelMultiplier = Math.Min(dbDragon.Level, maxLevel); + + int baseHp = CeilToInt( + ((maxLevel + -1.0) / (levelMultiplier + -1.0) * (dragonData.MaxHp - dragonData.MinHp)) + + dragonData.MinHp + ); + int baseAtk = CeilToInt( + ((maxLevel + -1.0) / (levelMultiplier + -1.0) * (dragonData.MaxAtk - dragonData.MinAtk)) + + dragonData.MinAtk + ); + + if (dragonData.MaxLimitBreakCount == 5) + { + baseAtk += + (dragonData.AddMaxAtk1 - dragonData.MaxAtk) + * (Math.Min(dbDragon.Level, rarity.LimitLevel05) - rarity.LimitLevel04) + / (rarity.LimitLevel05 - rarity.LimitLevel04); + + baseHp += + (dragonData.AddMaxHp1 - dragonData.MaxHp) + * (Math.Min(dbDragon.Level, rarity.LimitLevel05) - rarity.LimitLevel04) + / (rarity.LimitLevel05 - rarity.LimitLevel04); + } + + double multiplier = dragonData.ElementalType == charaElement ? 1.5 : 1; + + int normalAtk = CeilToInt((baseAtk + dbDragon.AttackPlusCount) * multiplier); + int normalHp = CeilToInt((baseHp + dbDragon.HpPlusCount) * multiplier); + + // set totalUnitAtk + totalUnitHp + + BonusParams bonusParams = BonusParams.GetBonus(ref bonus, dbDragon.DragonId); + + int fortAtk = CeilToInt(normalAtk * bonusParams.FortAtk); + int fortHp = CeilToInt(normalHp * bonusParams.FortHp); + + int albumAtk = CeilToInt(normalAtk * bonusParams.AlbumAtk); + int albumHp = CeilToInt(normalHp * bonusParams.AlbumHp); + + int dragonAtk = normalAtk + fortAtk + albumAtk; + int dragonHp = normalHp + fortHp + albumHp; + + int dragonPowerParam = + dragonAtk + + dragonHp + + (dbDragon.Skill1Level * 50) + + ((reliability?.Level ?? 1) * 10) + + rarity.RarityBasePartyPower + + (rarity.LimitBreakCountPartyPowerWeight * dbDragon.LimitBreakCount); + + return dragonPowerParam; + } + + private static int GetWeaponPower( + ref DbWeaponBody? dbWeapon, + ref WeaponBody? weaponBody, + ref WeaponBodyRarity? weaponRarity, + UnitElement charaElement + ) + { + if (dbWeapon == null || weaponBody == null || weaponRarity == null) + return 0; + + int weaponBodyHp = 0; + int weaponBodyAtk = 0; + + if ( + weaponRarity.MaxLimitLevelByLimitBreak4 != 0 + && dbWeapon.BuildupCount <= weaponRarity.MaxLimitLevelByLimitBreak4 + ) + { + weaponBodyHp = CeilToInt( + (double)dbWeapon.BuildupCount + / weaponRarity.MaxLimitLevelByLimitBreak4 + * (weaponBody.MaxHp1 - weaponBody.BaseHp) + + weaponBody.BaseHp + ); + weaponBodyAtk = CeilToInt( + (double)dbWeapon.BuildupCount + / weaponRarity.MaxLimitLevelByLimitBreak4 + * (weaponBody.MaxAtk1 - weaponBody.BaseAtk) + + weaponBody.BaseAtk + ); + } + else if ( + weaponRarity.MaxLimitLevelByLimitBreak4 < dbWeapon.BuildupCount + && dbWeapon.BuildupCount <= weaponRarity.MaxLimitLevelByLimitBreak8 + ) + { + weaponBodyHp = CeilToInt( + (double)(dbWeapon.BuildupCount - weaponRarity.MaxLimitLevelByLimitBreak4) + / ( + weaponRarity.MaxLimitLevelByLimitBreak8 + - weaponRarity.MaxLimitLevelByLimitBreak4 + ) + * (weaponBody.MaxHp2 - weaponBody.MaxHp1) + + weaponBody.MaxHp1 + ); + weaponBodyAtk = CeilToInt( + (double)(dbWeapon.BuildupCount - weaponRarity.MaxLimitLevelByLimitBreak4) + / ( + weaponRarity.MaxLimitLevelByLimitBreak8 + - weaponRarity.MaxLimitLevelByLimitBreak4 + ) + * (weaponBody.MaxAtk2 - weaponBody.MaxAtk1) + + weaponBody.MaxAtk1 + ); + } + else if ( + weaponRarity.MaxLimitLevelByLimitBreak8 < dbWeapon.BuildupCount + && dbWeapon.BuildupCount <= weaponRarity.MaxLimitLevelByLimitBreak9 + ) + { + weaponBodyHp = CeilToInt( + (double)(dbWeapon.BuildupCount - weaponRarity.MaxLimitLevelByLimitBreak8) + / ( + weaponRarity.MaxLimitLevelByLimitBreak9 + - weaponRarity.MaxLimitLevelByLimitBreak8 + ) + * (weaponBody.MaxHp3 - weaponBody.MaxHp2) + + weaponBody.MaxHp2 + ); + weaponBodyAtk = CeilToInt( + (double)(dbWeapon.BuildupCount - weaponRarity.MaxLimitLevelByLimitBreak8) + / ( + weaponRarity.MaxLimitLevelByLimitBreak9 + - weaponRarity.MaxLimitLevelByLimitBreak8 + ) + * (weaponBody.MaxAtk3 - weaponBody.MaxAtk2) + + weaponBody.MaxAtk2 + ); + } + + double multiplier = weaponBody.ElementalType == charaElement ? 1.5 : 1; + int weaponPower = CeilToInt((weaponBodyHp + weaponBodyAtk) * multiplier); + + int weaponSkillPower = dbWeapon.SkillNo == 0 ? 0 : dbWeapon.SkillLevel * 50; + + int weaponBodyPowerParam = weaponPower + weaponSkillPower; + + if (dbWeapon.LimitOverCount >= 1) + weaponBodyPowerParam += weaponBody.LimitOverCountPartyPower1; + + // funnily enough the only weapons that can reach limit over count 2, agito weapons, don't have stat boosts for it + if (dbWeapon.LimitOverCount >= 2) + weaponBodyPowerParam += weaponBody.LimitOverCountPartyPower2; + + return weaponBodyPowerParam; + } + + private static int GetExAbilityPower(ref DbPlayerCharaData dbChara, ref CharaData charaData) + { + if (dbChara.ExAbilityLevel == 0) + return 0; + + int power = MasterAsset.ExAbilityData[ + charaData.ExAbility[dbChara.ExAbilityLevel - 1] + ].PartyPowerWeight; + + if (dbChara.ExAbility2Level == 0) + return power; + + // yes this is intentionally AbilityData + return power + + MasterAsset.AbilityData[ + charaData.ExAbility2[dbChara.ExAbility2Level - 1] + ].PartyPowerWeight; + } + + private static int GetUnionAbilityPower(IEnumerable crests) + { + int totalPower = 0; + + foreach ( + (int unionId, int unionCrestCount) in crests + .Select(x => MasterAsset.AbilityCrest[x.AbilityCrestId].UnionAbilityGroupId) + .Where(x => x != 0) + .ToLookup(x => x) + .ToDictionary(x => x.Key, x => x.Count()) + ) + { + UnionAbility ability = MasterAsset.UnionAbility[unionId]; + + int maxPower = 0; + + foreach ((int count, int abilityId, int power) in ability.Abilities) + { + if (abilityId == 0) + break; + + if (unionCrestCount >= count) + maxPower = power; + } + + totalPower += maxPower; + } + + return totalPower; + } + + private static int GetAbilityPartyPower( + ref DbPlayerCharaData dbChara, + ref CharaData charaData, + ref DbPlayerDragonData? dbDragon, + ref DragonData? dragonData, + ref DbWeaponBody? dbWeapon, + ref WeaponBody? weaponData, + IEnumerable crests + ) + { + List abilityIdList = new(); + + int[] abilityIds = + { + charaData.GetAbility(1, dbChara.Ability1Level), + charaData.GetAbility(2, dbChara.Ability2Level), + charaData.GetAbility(3, dbChara.Ability3Level), + dbDragon == null || dragonData == null + ? 0 + : dragonData.GetAbility(1, dbDragon.Ability1Level), + dbDragon == null || dragonData == null + ? 0 + : dragonData.GetAbility(2, dbDragon.Ability2Level), + dbWeapon == null || weaponData == null + ? 0 + : weaponData.GetAbility(1, dbWeapon.Ability1Level), + dbWeapon == null || weaponData == null + ? 0 + : weaponData.GetAbility(2, dbWeapon.Ability2Level) + }; + + abilityIdList.AddRange(abilityIds); + abilityIdList.AddRange( + crests.SelectMany( + x => MasterAsset.AbilityCrest[x.AbilityCrestId].GetAbilities(x.AbilityLevel) + ) + ); + + int power = abilityIdList + .Where(x => x != 0) + .Select(x => MasterAsset.AbilityData[x].PartyPowerWeight) + .Sum(); + + return power; + } + + private static (int AtkPlus, int HpPlus) GetStatusPlusParam(ref FortBonusList bonus) + { + return (bonus.all_bonus.attack, bonus.all_bonus.hp); + } + + private static int CeilToInt(double value) + { + return (int)Math.Ceiling(value); + } + + private static (int Atk, int Hp) GetAbilityCrest( + AbilityCrests id, + int buildup, + int atkPlus, + int hpPlus + ) + { + if (id == 0) + return (0, 0); + + AbilityCrest crest = MasterAsset.AbilityCrest[id]; + AbilityCrestRarity rarity = MasterAsset.AbilityCrestRarity[crest.Rarity]; + + if (buildup == 0) + return (crest.BaseAtk + atkPlus, crest.BaseHp + hpPlus); + + int atkDiff = crest.MaxAtk - crest.BaseAtk; + int hpDiff = crest.MaxHp - crest.BaseHp; + + double multiplier = buildup; + if (buildup > rarity.MaxLimitLevelByLimitBreak4) + multiplier = rarity.MaxLimitLevelByLimitBreak4; + + int atk = + crest.BaseAtk + + atkPlus + + CeilToInt(atkDiff * multiplier / rarity.MaxLimitLevelByLimitBreak4); + + int hp = + crest.BaseHp + + hpPlus + + CeilToInt(hpDiff * multiplier / rarity.MaxLimitLevelByLimitBreak4); + + return (atk, hp); + } +} + +file record BonusParams(double FortAtk, double FortHp, double AlbumAtk, double AlbumHp) +{ + public static BonusParams GetBonus(ref FortBonusList bonus, Charas charaId) + { + CharaData data = MasterAsset.CharaData[charaId]; + + AtgenParamBonus paramBonus = bonus.param_bonus.First(x => x.weapon_type == data.WeaponType); + AtgenElementBonus elementBonus = bonus.element_bonus.First( + x => x.elemental_type == data.ElementalType + ); + AtgenParamBonus paramByWeaponBonus = bonus.param_bonus_by_weapon.First( + x => x.weapon_type == data.WeaponType + ); + + double atk = (paramBonus.attack + elementBonus.attack + paramByWeaponBonus.attack) / 100.0; + double hp = (paramBonus.hp + elementBonus.hp + paramByWeaponBonus.hp) / 100.0; + + AtgenElementBonus albumBonus = bonus.chara_bonus_by_album.First( + x => x.elemental_type == data.ElementalType + ); + + return new BonusParams(atk, hp, albumBonus.attack / 100.0, albumBonus.hp / 100.0); + } + + public static BonusParams GetBonus(ref FortBonusList bonus, Dragons dragonId) + { + DragonData data = MasterAsset.DragonData[dragonId]; + + AtgenDragonBonus dragonBonus = bonus.dragon_bonus.First( + x => x.elemental_type == data.ElementalType + ); + + double atk = dragonBonus.attack / 100.0; + double hp = dragonBonus.hp / 100.0; + + AtgenElementBonus albumBonus = bonus.dragon_bonus_by_album.First( + x => x.elemental_type == data.ElementalType + ); + + return new BonusParams(atk, hp, albumBonus.attack / 100.0, albumBonus.hp / 100.0); + } +}; diff --git a/DragaliaAPI/Features/SavefileUpdate/V11Update.cs b/DragaliaAPI/Features/SavefileUpdate/V11Update.cs new file mode 100644 index 000000000..b541487fa --- /dev/null +++ b/DragaliaAPI/Features/SavefileUpdate/V11Update.cs @@ -0,0 +1,35 @@ +using DragaliaAPI.Database.Entities; +using DragaliaAPI.Database.Repositories; +using DragaliaAPI.Features.Emblem; +using DragaliaAPI.Features.PartyPower; +using DragaliaAPI.Models.Generated; +using DragaliaAPI.Services; +using DragaliaAPI.Shared.Definitions.Enums; + +namespace DragaliaAPI.Features.SavefileUpdate; + +public class V11Update( + IPartyPowerService partyPowerService, + IPartyPowerRepository partyPowerRepository, + IPartyRepository partyRepository, + IBonusService bonusService +) : ISavefileUpdate +{ + public int SavefileVersion => 11; + + public async Task Apply() + { + FortBonusList bonusList = await bonusService.GetBonusList(); + + int power = 0; + + foreach (DbParty party in partyRepository.Parties.ToList()) + { + int partyPower = await partyPowerService.CalculatePartyPower(party, bonusList); + if (partyPower > power) + power = partyPower; + } + + await partyPowerRepository.SetMaxPartyPowerAsync(power); + } +} diff --git a/DragaliaAPI/Program.cs b/DragaliaAPI/Program.cs index e17020495..101c38841 100644 --- a/DragaliaAPI/Program.cs +++ b/DragaliaAPI/Program.cs @@ -34,6 +34,7 @@ using DragaliaAPI.Features.DmodeDungeon; using DragaliaAPI.Features.Emblem; using DragaliaAPI.Features.Item; +using DragaliaAPI.Features.PartyPower; using DragaliaAPI.Features.Player; using DragaliaAPI.Features.Talisman; using DragaliaAPI.Features.Tickets; @@ -199,7 +200,10 @@ // Tickets feature .AddScoped() // Emblem feature - .AddScoped(); + .AddScoped() + // Party power feature + .AddScoped() + .AddScoped(); builder.Services.AddAllOfType(); builder.Services.AddAllOfType(); diff --git a/DragaliaAPI/Services/Game/LoadService.cs b/DragaliaAPI/Services/Game/LoadService.cs index ba48437f4..1878786f9 100644 --- a/DragaliaAPI/Services/Game/LoadService.cs +++ b/DragaliaAPI/Services/Game/LoadService.cs @@ -1,10 +1,11 @@ using System.Diagnostics; using AutoMapper; using DragaliaAPI.Database.Entities; +using DragaliaAPI.Database.Repositories; using DragaliaAPI.Features.Missions; +using DragaliaAPI.Features.PartyPower; using DragaliaAPI.Features.Player; using DragaliaAPI.Features.Present; -using DragaliaAPI.Features.SavefileUpdate; using DragaliaAPI.Features.Shop; using DragaliaAPI.Features.Tickets; using DragaliaAPI.Features.Trade; @@ -78,7 +79,7 @@ public async Task BuildIndexData() mapper.Map ), fort_bonus_list = bonusList, - party_power_data = new(999999), + party_power_data = mapper.Map(savefile.PartyPower), friend_notice = new(0, 0), present_notice = await presentService.GetPresentNotice(), guild_notice = new(0, 0, 0, 0, 0), diff --git a/DragaliaAPI/Services/Game/SavefileService.cs b/DragaliaAPI/Services/Game/SavefileService.cs index cdbd96294..6395347f3 100644 --- a/DragaliaAPI/Services/Game/SavefileService.cs +++ b/DragaliaAPI/Services/Game/SavefileService.cs @@ -471,6 +471,18 @@ out DbTalisman? talisman stopwatch.Elapsed.TotalMilliseconds ); + apiContext.PartyPowers.Add( + savefile.party_power_data.MapWithDeviceAccount( + mapper, + deviceAccountId + ) + ); + + this.logger.LogDebug( + "Mapping DbPartyPower step done after {t} ms", + stopwatch.Elapsed.TotalMilliseconds + ); + this.logger.LogInformation( "Mapping completed after {t} ms", stopwatch.Elapsed.TotalMilliseconds @@ -600,6 +612,9 @@ private void Delete() this.apiContext.Emblems.RemoveRange( this.apiContext.Emblems.Where(x => x.DeviceAccountId == deviceAccountId) ); + this.apiContext.PartyPowers.RemoveRange( + this.apiContext.PartyPowers.Where(x => x.DeviceAccountId == deviceAccountId) + ); } public async Task Reset() @@ -630,6 +645,7 @@ public IQueryable Load() .Include(x => x.WeaponSkinList) .Include(x => x.WeaponPassiveAbilityList) .Include(x => x.EquippedStampList) + .Include(x => x.PartyPower) .AsSplitQuery(); }