diff --git a/src/main/java/emu/nebula/command/commands/BuildCommand.java b/src/main/java/emu/nebula/command/commands/BuildCommand.java index 5efee74..bc4d67a 100644 --- a/src/main/java/emu/nebula/command/commands/BuildCommand.java +++ b/src/main/java/emu/nebula/command/commands/BuildCommand.java @@ -60,10 +60,7 @@ public class BuildCommand implements CommandHandler { var build = builder.toBuild(); // Add to star tower manager - target.getStarTowerManager().getBuilds().put(build.getUid(), build); - - // Save to database - build.save(); + target.getStarTowerManager().addBuild(build); // Send package to player target.addNextPackage(NetMsgId.st_import_build_notify, build.toProto()); diff --git a/src/main/java/emu/nebula/command/commands/CharacterCommand.java b/src/main/java/emu/nebula/command/commands/CharacterCommand.java index 5c4f875..7b91d04 100644 --- a/src/main/java/emu/nebula/command/commands/CharacterCommand.java +++ b/src/main/java/emu/nebula/command/commands/CharacterCommand.java @@ -83,6 +83,13 @@ public class CharacterCommand implements CommandHandler { } player.addNextPackage(NetMsgId.chars_final_notify, proto); + + // Trigger achievements + if (args.getLevel() > 0 && args.getLevel() <= 90) { + player.getCharacters().triggerCharacterAchievements(modified, args.getLevel()); + } + + // Result return "Updated " + modified.size() + " character(s)"; } } diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 6217e41..992be53 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -122,6 +122,7 @@ public class GameData { @Getter private static DataTable StarTowerFloorExpDataTable = new DataTable<>(); @Getter private static DataTable StarTowerTeamExpDataTable = new DataTable<>(); @Getter private static DataTable StarTowerEventDataTable = new DataTable<>(); + @Getter private static DataTable StarTowerBuildRankDataTable = new DataTable<>(); @Getter private static DataTable SubNoteSkillPromoteGroupDataTable = new DataTable<>(); @Getter private static DataTable PotentialDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/custom/AchievementParamDef.java b/src/main/java/emu/nebula/data/custom/AchievementParamDef.java new file mode 100644 index 0000000..49039ac --- /dev/null +++ b/src/main/java/emu/nebula/data/custom/AchievementParamDef.java @@ -0,0 +1,33 @@ +package emu.nebula.data.custom; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.GameData; +import emu.nebula.data.ResourceType; +import emu.nebula.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = "AchievementParam.json", useInternal = true, loadPriority = LoadPriority.LOW) +public class AchievementParamDef extends BaseDef { + private int Id; + + private int Param1; + private int ParamCond1; + private int Param2; + private int ParamCond2; + + @Override + public int getId() { + return Id; + } + + @Override + public void onLoad() { + var achievement = GameData.getAchievementDataTable().get(this.Id); + if (achievement == null) { + return; + } + + achievement.setParams(this); + } +} diff --git a/src/main/java/emu/nebula/data/resources/AchievementDef.java b/src/main/java/emu/nebula/data/resources/AchievementDef.java index 0c2758b..16f2ef3 100644 --- a/src/main/java/emu/nebula/data/resources/AchievementDef.java +++ b/src/main/java/emu/nebula/data/resources/AchievementDef.java @@ -2,7 +2,9 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; +import emu.nebula.data.custom.AchievementParamDef; import emu.nebula.game.achievement.AchievementHelper; +import emu.nebula.game.achievement.AchievementParamCond; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; @@ -20,43 +22,50 @@ public class AchievementDef extends BaseDef { private int Qty1; // Custom params - private transient int param1; // -1 == any, 0 = no param, 1+ = param required - private transient int param2; // -1 == any, 0 = no param, 1+ = param required + private transient int param1; + private transient AchievementParamCond paramCond1; + private transient int param2; + private transient AchievementParamCond paramCond2; @Override public int getId() { return Id; } + @Deprecated public void setParams(int param1, int param2) { this.param1 = param1; this.param2 = param2; } + public void setParams(AchievementParamDef params) { + this.param1 = params.getParam1(); + this.param2 = params.getParam2(); + + this.paramCond1 = AchievementParamCond.getByValue(params.getParamCond1()); + this.paramCond2 = AchievementParamCond.getByValue(params.getParamCond2()); + } + /** * Checks if this achievement requires params to match */ - public boolean hasParam1(int param) { - if (this.param1 < 0) { - return false; - } else if (this.param1 == 0) { - return param != 0; - } else { - return true; + public boolean matchParam1(int value) { + if (this.paramCond1 == null) { + this.paramCond1 = AchievementParamCond.EQUALS; } + + return this.paramCond1.test(this.param1, value); } /** * Checks if this achievement requires params to match */ - public boolean hasParam2(int param) { - if (this.param2 < 0) { - return false; - } else if (this.param2 == 0) { - return param != 0; - } else { - return true; + public boolean matchParam2(int value) { + if (this.paramCond2 == null) { + this.paramCond2 = AchievementParamCond.EQUALS; } + + return this.paramCond2.test(this.param2, value); } @Override diff --git a/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java b/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java index 2f17944..b705158 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java @@ -4,9 +4,9 @@ import emu.nebula.data.BaseDef; import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.data.custom.CharGemAttrGroupDef; -import emu.nebula.util.CustomIntArray; import emu.nebula.util.Utils; import emu.nebula.util.WeightedList; +import emu.nebula.util.ints.CustomIntArray; import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; diff --git a/src/main/java/emu/nebula/data/resources/GachaDef.java b/src/main/java/emu/nebula/data/resources/GachaDef.java index 192cc22..2f5da20 100644 --- a/src/main/java/emu/nebula/data/resources/GachaDef.java +++ b/src/main/java/emu/nebula/data/resources/GachaDef.java @@ -4,7 +4,6 @@ import emu.nebula.data.BaseDef; import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.util.WeightedList; - import lombok.Getter; @Getter diff --git a/src/main/java/emu/nebula/data/resources/StarTowerBuildRankDef.java b/src/main/java/emu/nebula/data/resources/StarTowerBuildRankDef.java new file mode 100644 index 0000000..56748fd --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/StarTowerBuildRankDef.java @@ -0,0 +1,18 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = "StarTowerBuildRank.json") +public class StarTowerBuildRankDef extends BaseDef { + private int Id; + private int MinGrade; + private int Rarity; + + @Override + public int getId() { + return Id; + } +} diff --git a/src/main/java/emu/nebula/database/codecs/String2IntMapCodec.java b/src/main/java/emu/nebula/database/codecs/String2IntMapCodec.java index 27fd9bb..4ffb6d7 100644 --- a/src/main/java/emu/nebula/database/codecs/String2IntMapCodec.java +++ b/src/main/java/emu/nebula/database/codecs/String2IntMapCodec.java @@ -7,7 +7,7 @@ import org.bson.codecs.Codec; import org.bson.codecs.DecoderContext; import org.bson.codecs.EncoderContext; -import emu.nebula.util.String2IntMap; +import emu.nebula.util.ints.String2IntMap; /** * Custom mongodb codec for encoding/decoding fastutil int2int maps. diff --git a/src/main/java/emu/nebula/game/achievement/AchievementHelper.java b/src/main/java/emu/nebula/game/achievement/AchievementHelper.java index 1e3c754..49144b7 100644 --- a/src/main/java/emu/nebula/game/achievement/AchievementHelper.java +++ b/src/main/java/emu/nebula/game/achievement/AchievementHelper.java @@ -2,14 +2,13 @@ package emu.nebula.game.achievement; import java.util.List; -import emu.nebula.GameConstants; -import emu.nebula.data.GameData; import emu.nebula.data.resources.AchievementDef; -import emu.nebula.game.tower.room.RoomType; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; + import lombok.Getter; // Because achievements in the data files do not have params, we will hardcode them here @@ -47,120 +46,5 @@ public class AchievementHelper { incrementalAchievementSet.add(AchievementCondition.TowerItemsGet.getValue()); incrementalAchievementSet.add(AchievementCondition.TowerEnterRoom.getValue()); - - // Fix params - fixParams(); - } - - private static void fixParams() { - // Clear "Misstep On One" - addParam(56, 401, 0); // Custom trigger - - // Clear "Currents and Shadows" - addParam(57, 102, 0); - addParam(58, 103, 0); - addParam(59, 104, 0); - addParam(60, 105, 0); - addParam(61, 106, 0); - addParam(62, 107, 0); - addParam(63, 108, 0); - - // Clear "Dust and Flames" - addParam(64, 202, 0); - addParam(65, 203, 0); - addParam(66, 204, 0); - addParam(67, 205, 0); - addParam(68, 206, 0); - addParam(69, 207, 0); - addParam(70, 208, 0); - - // Clear "Storm and Thunder" - addParam(71, 302, 0); - addParam(72, 303, 0); - addParam(73, 304, 0); - addParam(74, 305, 0); - addParam(75, 306, 0); - addParam(76, 307, 0); - addParam(77, 308, 0); - - // First Ascension - addParam(498, 0, 1); - - // Monolith Conqueror - addParam(78, 2, 0); - addParam(79, 4, 0); - addParam(80, 6, 0); - addParam(81, 7, 0); - - // Money - addParam(25, GameConstants.GOLD_ITEM_ID, 0); - addParam(26, GameConstants.GOLD_ITEM_ID, 0); - addParam(27, GameConstants.GOLD_ITEM_ID, 0); - addParam(28, GameConstants.GOLD_ITEM_ID, 0); - addParam(29, GameConstants.GOLD_ITEM_ID, 0); - - // Ininfite tower - for (int diff = 10, id = 270; diff <= 60; diff += 10) { - addParam(id++, 11000 + diff, 0); // Infinite Arena - addParam(id++, 51000 + diff, 0); // Shake the Floor - addParam(id++, 41000 + diff, 0); // Elegance and Flow - addParam(id++, 71000 + diff, 0); // Upbeat Party - addParam(id++, 31000 + diff, 0); // Thrilling Beat - addParam(id++, 21000 + diff, 0); // Flames and Beats - addParam(id++, 61000 + diff, 0); // Sinister Ritual - } - - // Character count - addParams(393, 398, 1, 0); - - // Disc count - addParams(382, 387, 1, 0); - - // Star Tower team clear - addParams(95, 98, 1, 0); // Aqua team clear - addParams(99, 102, 2, 0); // Fire team clear - addParams(103, 106, 3, 0); // Earth team clear - addParams(107, 110, 4, 0); // Wind team clear - addParams(111, 114, 5, 0); // Light team clear - addParams(115, 118, 6, 0); // Dark team clear - - // Star tower items - addParams(139, 144, GameConstants.TOWER_COIN_ITEM_ID, 0); - - addParams(145, 149, 90011, 0); - addParams(150, 154, 90012, 0); - addParams(155, 159, 90013, 0); - addParams(160, 164, 90014, 0); - addParams(165, 169, 90015, 0); - addParams(170, 174, 90016, 0); - addParams(175, 179, 90017, 0); - - addParams(180, 184, 90018, 0); - addParams(185, 189, 90019, 0); - addParams(190, 194, 90020, 0); - addParams(195, 199, 90021, 0); - addParams(200, 204, 90022, 0); - addParams(205, 209, 90023, 0); - - // Star tower rooms - addParams(210, 216, RoomType.BattleRoom.getValue() + 1, 0); - addParams(217, 223, RoomType.EliteBattleRoom.getValue() + 1, 0); - addParams(224, 230, RoomType.BossRoom.getValue() + 1, 0); - addParams(231, 237, RoomType.FinalBossRoom.getValue() + 1, 0); - addParams(238, 244, RoomType.ShopRoom.getValue() + 1, 0); - addParams(245, 251, RoomType.EventRoom.getValue() + 1, 0); - } - - private static void addParam(int achievementId, int param1, int param2) { - var data = GameData.getAchievementDataTable().get(achievementId); - if (data == null) return; - - data.setParams(param1, param2); - } - - private static void addParams(int start, int end, int param1, int param2) { - for (int id = start; id <= end; id++) { - addParam(id, param1, param2); - } } } diff --git a/src/main/java/emu/nebula/game/achievement/AchievementParamCond.java b/src/main/java/emu/nebula/game/achievement/AchievementParamCond.java new file mode 100644 index 0000000..d312b2c --- /dev/null +++ b/src/main/java/emu/nebula/game/achievement/AchievementParamCond.java @@ -0,0 +1,46 @@ +package emu.nebula.game.achievement; + +import emu.nebula.util.ints.IntBiPredicate; + +import lombok.Getter; + +@Getter +public enum AchievementParamCond { + EQUALS (0, (param, value) -> value == param), + ANY (1, (param, value) -> true), + NOT_EQUALS (2, (param, value) -> value != param), + GREATER_THAN (3, (param, value) -> value > param), + GREATER_THAN_OR_EQ (4, (param, value) -> value >= param), + LESS_THAN (5, (param, value) -> value < param), + LESS_THAN_OR_EQ (6, (param, value) -> value <= param); + + private final int value; + private final IntBiPredicate operation; + + // Static cache + private static AchievementParamCond[] CACHE; + + static { + CACHE = new AchievementParamCond[AchievementParamCond.values().length]; + for (AchievementParamCond type : AchievementParamCond.values()) { + CACHE[type.getValue()] = type; + } + } + + private AchievementParamCond(int value, IntBiPredicate operation) { + this.value = value; + this.operation = operation; + } + + public boolean test(int param, int value) { + return this.getOperation().test(param, value); + } + + public static AchievementParamCond getByValue(int value) { + try { + return CACHE[value]; + } catch (Exception e) { + return AchievementParamCond.EQUALS; + } + } +} diff --git a/src/main/java/emu/nebula/game/achievement/GameAchievement.java b/src/main/java/emu/nebula/game/achievement/GameAchievement.java index e7c465c..1bb62a1 100644 --- a/src/main/java/emu/nebula/game/achievement/GameAchievement.java +++ b/src/main/java/emu/nebula/game/achievement/GameAchievement.java @@ -75,11 +75,7 @@ public class GameAchievement { var data = this.getData(); if (data == null) return false; - if (data.hasParam1(param1) && data.getParam1() != param1) { - return false; - } - - if (data.hasParam2(param2) && data.getParam2() != param2) { + if (!data.matchParam1(param1) || !data.matchParam2(param2)) { return false; } diff --git a/src/main/java/emu/nebula/game/character/CharacterStorage.java b/src/main/java/emu/nebula/game/character/CharacterStorage.java index 954fa1b..149018b 100644 --- a/src/main/java/emu/nebula/game/character/CharacterStorage.java +++ b/src/main/java/emu/nebula/game/character/CharacterStorage.java @@ -12,8 +12,10 @@ import emu.nebula.net.NetMsgId; import emu.nebula.proto.Public.HandbookInfo; import emu.nebula.util.Bitset; import emu.nebula.game.achievement.AchievementCondition; +import emu.nebula.game.inventory.ItemParamMap; import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.Getter; @@ -117,6 +119,67 @@ public class CharacterStorage extends PlayerManager { return handbook; } + public void triggerCharacterAchievements(GameCharacter character) { + // Create elements we want to trigger the achievement for + var elements = new ItemParamMap(); + elements.put(character.getData().getElementType().getValue(), 0); + + // Calculate the amount of characters with the elements + this.triggerCharacterAchievements(elements, character.getLevel()); + } + + public void triggerCharacterAchievements(Collection characters, int level) { + var elements = new ItemParamMap(); + + for (var character : characters) { + elements.put(character.getElementType().getValue(), 0); + } + + // Calculate the amount of characters with the elements + this.triggerCharacterAchievements(elements, level); + } + + private void triggerCharacterAchievements(ItemParamMap elements, int level) { + // Get current amount of characters with same level or higher + int anyCount = 0; + + for (var character : this.getCharacterCollection()) { + if (character.getLevel() >= level) { + anyCount++; + } else { + continue; + } + + int element = character.getElementType().getValue(); + + if (elements.containsKey(element)) { + elements.add(element, 1); + } + } + + // Trigger achievements + var achievements = this.getPlayer().getAchievementManager(); + + achievements.trigger( + AchievementCondition.CharactersWithSpecificLevelAndQuantity, + anyCount, + level, + 0 + ); + + for (var entry : elements) { + int element = entry.getIntKey(); + int amount = entry.getIntValue(); + + achievements.trigger( + AchievementCondition.CharactersWithSpecificNumberLevelAndAttributes, + amount, + level, + element + ); + } + } + // Discs public GameDisc getDiscById(int id) { diff --git a/src/main/java/emu/nebula/game/character/GameCharacter.java b/src/main/java/emu/nebula/game/character/GameCharacter.java index e315082..6a400ac 100644 --- a/src/main/java/emu/nebula/game/character/GameCharacter.java +++ b/src/main/java/emu/nebula/game/character/GameCharacter.java @@ -35,7 +35,7 @@ import emu.nebula.proto.PublicStarTower.StarTowerChar; import emu.nebula.proto.PublicStarTower.StarTowerCharGem; import emu.nebula.server.error.ServerException; import emu.nebula.util.Bitset; -import emu.nebula.util.CustomIntArray; +import emu.nebula.util.ints.CustomIntArray; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; @@ -119,6 +119,10 @@ public class GameCharacter implements GameDatabaseObject { } } + public ElementType getElementType() { + return this.getData().getElementType(); + } + public boolean isMaster() { return this.getData().getGrade() == 1; } @@ -193,6 +197,8 @@ public class GameCharacter implements GameDatabaseObject { if (this.level > oldLevel) { // Trigger quest this.getPlayer().trigger(QuestCondition.CharacterUpTotal, this.level - oldLevel); + // Trigger any achievements + this.getPlayer().getCharacters().triggerCharacterAchievements(this); } // Save to database diff --git a/src/main/java/emu/nebula/game/gacha/GachaModule.java b/src/main/java/emu/nebula/game/gacha/GachaModule.java index 6f82b32..3ab23ef 100644 --- a/src/main/java/emu/nebula/game/gacha/GachaModule.java +++ b/src/main/java/emu/nebula/game/gacha/GachaModule.java @@ -76,6 +76,9 @@ public class GachaModule extends GameContextModule { var transformItemsDst = new ItemParamMap(); var bonusItems = new ItemParamMap(); + // Character count (for achievements) + int characters = 0; + // Add for player for (var entry : acquireItems.getItems().int2ObjectEntrySet()) { // Get ids and aquire params @@ -102,6 +105,9 @@ public class GachaModule extends GameContextModule { transformItemsDst.add(characterData.getFragmentsId(), characterData.getTransformQty() * count); transformItemsDst.add(24, 40 * count); // Expert permits } + + // Add to count + characters += acquire.getCount(); } else if (acquire.getType() == ItemType.Disc) { // Get add amount int begin = acquire.getBegin(); @@ -167,6 +173,7 @@ public class GachaModule extends GameContextModule { // Trigger achievements player.trigger(AchievementCondition.GachaTotal, amount); + player.trigger(AchievementCondition.GachaCharacterTotal, characters); // Complete return new GachaResult(info, change, results); diff --git a/src/main/java/emu/nebula/game/inventory/Inventory.java b/src/main/java/emu/nebula/game/inventory/Inventory.java index 67a72ac..d44c149 100644 --- a/src/main/java/emu/nebula/game/inventory/Inventory.java +++ b/src/main/java/emu/nebula/game/inventory/Inventory.java @@ -20,7 +20,7 @@ import emu.nebula.proto.Public.Item; import emu.nebula.proto.Public.Res; import emu.nebula.proto.Public.Title; import emu.nebula.proto.Public.UI32; -import emu.nebula.util.String2IntMap; +import emu.nebula.util.ints.String2IntMap; import emu.nebula.game.achievement.AchievementCondition; import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; diff --git a/src/main/java/emu/nebula/game/story/StoryManager.java b/src/main/java/emu/nebula/game/story/StoryManager.java index 0cfdf07..9ffc791 100644 --- a/src/main/java/emu/nebula/game/story/StoryManager.java +++ b/src/main/java/emu/nebula/game/story/StoryManager.java @@ -9,6 +9,7 @@ import dev.morphia.annotations.PostLoad; import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.database.GameDatabaseObject; +import emu.nebula.game.achievement.AchievementCondition; import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerManager; @@ -103,6 +104,9 @@ public class StoryManager extends PlayerManager implements GameDatabaseObject { // Add rewards this.getPlayer().getInventory().addItems(data.getRewards(), change); + // Trigger any achievement/quests + this.getPlayer().trigger(AchievementCondition.StoryClear, 1, id, 0); + // Save to db Nebula.getGameDatabase().addToSet(this, this.getPlayerUid(), "completedStories", id); } diff --git a/src/main/java/emu/nebula/game/tower/StarTowerBuild.java b/src/main/java/emu/nebula/game/tower/StarTowerBuild.java index 7a09da8..c4d28d2 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerBuild.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerBuild.java @@ -8,6 +8,7 @@ import dev.morphia.annotations.Indexed; import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.data.resources.SecondarySkillDef; +import emu.nebula.data.resources.StarTowerBuildRankDef; import emu.nebula.database.GameDatabaseObject; import emu.nebula.game.character.GameCharacter; import emu.nebula.game.character.GameDisc; @@ -162,6 +163,19 @@ public class StarTowerBuild implements GameDatabaseObject { return this.score; } + public StarTowerBuildRankDef getRank() { + StarTowerBuildRankDef rank = null; + + // TODO optimize + for (var data : GameData.getStarTowerBuildRankDataTable()) { + if (this.getScore() >= data.getMinGrade()) { + rank = data; + } + } + + return rank; + } + // Proto public StarTowerBuildInfo toProto() { diff --git a/src/main/java/emu/nebula/game/tower/StarTowerManager.java b/src/main/java/emu/nebula/game/tower/StarTowerManager.java index ecfdc30..9525be8 100644 --- a/src/main/java/emu/nebula/game/tower/StarTowerManager.java +++ b/src/main/java/emu/nebula/game/tower/StarTowerManager.java @@ -166,6 +166,100 @@ public class StarTowerManager extends PlayerManager { return this.getBuilds().containsKey(id); } + public void addBuild(StarTowerBuild build) { + // Add to builds + this.getBuilds().put(build.getUid(), build); + + // Save build to database + build.save(); + + // Achievement + var rank = build.getRank(); + if (rank != null) { + this.getPlayer().getAchievementManager().trigger( + AchievementCondition.TowerBuildSpecificScoreWithTotal, + 1, + rank.getRarity(), + 0 + ); + } + } + + public PlayerChangeInfo saveBuild(boolean delete, String name, boolean lock) { + // Sanity check + if (this.getLastBuild() == null) { + return null; + } + + // Create player change info + var change = new PlayerChangeInfo(); + + // Cache build + var build = this.lastBuild; + + // Clear reference to build + this.lastBuild = null; + + // Check if the player wants this build or not + if (delete) { + return this.dismantleBuild(build, change); + } + + // Check limit + if (this.getBuilds().size() >= 50) { + return null; + } + + // Add build + this.addBuild(build); + + // Success + return change; + } + + private PlayerChangeInfo dismantleBuild(StarTowerBuild build, PlayerChangeInfo change) { + // Calculate quanity of tickets from record score + int count = (int) Math.floor(build.getScore() / 100); + + // Check weekly tickets + int maxAmount = this.getPlayer().getProgress().getMaxEarnableWeeklyTowerTickets(); + count = Math.min(maxAmount, count); + + // Add journey tickets + this.getPlayer().getInventory().addItem(12, count, change); + + // Add to weekly ticket log + this.getPlayer().getProgress().addWeeklyTowerTicketLog(count); + + // Success + return change; + } + + public PlayerChangeInfo deleteBuild(long buildId, PlayerChangeInfo change) { + // Create change info + if (change == null) { + change = new PlayerChangeInfo(); + } + + // Get build + var build = this.getBuilds().remove(buildId); + + if (build == null) { + return change; + } + + // Delete + build.delete(); + + // Add journey tickets + this.dismantleBuild(build, change); + + // Success + return change; + } + + // Game + public PlayerChangeInfo apply(StarTowerApplyReq req) { // Sanity checks var data = GameData.getStarTowerDataTable().get(req.getId()); @@ -297,84 +391,6 @@ public class StarTowerManager extends PlayerManager { ); } - // Build - - private PlayerChangeInfo dismantleBuild(StarTowerBuild build, PlayerChangeInfo change) { - // Calculate quanity of tickets from record score - int count = (int) Math.floor(build.getScore() / 100); - - // Check weekly tickets - int maxAmount = this.getPlayer().getProgress().getMaxEarnableWeeklyTowerTickets(); - count = Math.min(maxAmount, count); - - // Add journey tickets - this.getPlayer().getInventory().addItem(12, count, change); - - // Add to weekly ticket log - this.getPlayer().getProgress().addWeeklyTowerTicketLog(count); - - // Success - return change; - } - - public PlayerChangeInfo saveBuild(boolean delete, String name, boolean lock) { - // Sanity check - if (this.getLastBuild() == null) { - return null; - } - - // Create player change info - var change = new PlayerChangeInfo(); - - // Cache build - var build = this.lastBuild; - - // Clear reference to build - this.lastBuild = null; - - // Check if the player wants this build or not - if (delete) { - return this.dismantleBuild(build, change); - } - - // Check limit - if (this.getBuilds().size() >= 50) { - return null; - } - - // Add to builds - this.getBuilds().put(build.getUid(), build); - - // Save build to database - build.save(); - - // Success - return change; - } - - public PlayerChangeInfo deleteBuild(long buildId, PlayerChangeInfo change) { - // Create change info - if (change == null) { - change = new PlayerChangeInfo(); - } - - // Get build - var build = this.getBuilds().remove(buildId); - - if (build == null) { - return change; - } - - // Delete - build.delete(); - - // Add journey tickets - this.dismantleBuild(build, change); - - // Success - return change; - } - // Database public void loadFromDatabase() { diff --git a/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java b/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java index 89ff05d..ea41f89 100644 --- a/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java +++ b/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java @@ -9,7 +9,6 @@ import emu.nebula.data.resources.VampireSurvivorDef; import emu.nebula.proto.Public.CardInfo; import emu.nebula.proto.Public.VampireSurvivorLevelReward; import emu.nebula.util.WeightedList; - import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; diff --git a/src/main/java/emu/nebula/util/CustomIntArray.java b/src/main/java/emu/nebula/util/ints/CustomIntArray.java similarity index 97% rename from src/main/java/emu/nebula/util/CustomIntArray.java rename to src/main/java/emu/nebula/util/ints/CustomIntArray.java index cc318f3..e920bcf 100644 --- a/src/main/java/emu/nebula/util/CustomIntArray.java +++ b/src/main/java/emu/nebula/util/ints/CustomIntArray.java @@ -1,4 +1,4 @@ -package emu.nebula.util; +package emu.nebula.util.ints; import it.unimi.dsi.fastutil.ints.IntArrayList; diff --git a/src/main/java/emu/nebula/util/ints/IntBiPredicate.java b/src/main/java/emu/nebula/util/ints/IntBiPredicate.java new file mode 100644 index 0000000..8a0e720 --- /dev/null +++ b/src/main/java/emu/nebula/util/ints/IntBiPredicate.java @@ -0,0 +1,15 @@ +package emu.nebula.util.ints; + +import java.util.function.BiPredicate; + +public interface IntBiPredicate extends BiPredicate{ + + @Deprecated + @Override + default boolean test(Integer t, Integer u) { + return test(t, u); + } + + public boolean test(int t, int u); + +} diff --git a/src/main/java/emu/nebula/util/String2IntMap.java b/src/main/java/emu/nebula/util/ints/String2IntMap.java similarity index 92% rename from src/main/java/emu/nebula/util/String2IntMap.java rename to src/main/java/emu/nebula/util/ints/String2IntMap.java index e5ad365..2af936c 100644 --- a/src/main/java/emu/nebula/util/String2IntMap.java +++ b/src/main/java/emu/nebula/util/ints/String2IntMap.java @@ -1,4 +1,4 @@ -package emu.nebula.util; +package emu.nebula.util.ints; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; diff --git a/src/main/resources/defs/AchievementParam.json b/src/main/resources/defs/AchievementParam.json new file mode 100644 index 0000000..8f9dcd6 --- /dev/null +++ b/src/main/resources/defs/AchievementParam.json @@ -0,0 +1,1425 @@ +[ + { + "Id": 22, + "Param1": 112, + "ParamCond1": 0 + }, + { + "Id": 23, + "Param1": 217, + "ParamCond1": 0 + }, + { + "Id": 24, + "Param1": 318, + "ParamCond1": 0 + }, + { + "Id": 25, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 26, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 27, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 28, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 29, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 30, + "Param1": 12, + "ParamCond1": 0 + }, + { + "Id": 31, + "Param1": 12, + "ParamCond1": 0 + }, + { + "Id": 32, + "Param1": 12, + "ParamCond1": 0 + }, + { + "Id": 33, + "Param1": 12, + "ParamCond1": 0 + }, + { + "Id": 34, + "Param1": 12, + "ParamCond1": 0 + }, + { + "Id": 56, + "Param1": 401, + "ParamCond1": 0 + }, + { + "Id": 57, + "Param1": 102, + "ParamCond1": 0 + }, + { + "Id": 58, + "Param1": 103, + "ParamCond1": 0 + }, + { + "Id": 59, + "Param1": 104, + "ParamCond1": 0 + }, + { + "Id": 60, + "Param1": 105, + "ParamCond1": 0 + }, + { + "Id": 61, + "Param1": 106, + "ParamCond1": 0 + }, + { + "Id": 62, + "Param1": 107, + "ParamCond1": 0 + }, + { + "Id": 63, + "Param1": 108, + "ParamCond1": 0 + }, + { + "Id": 64, + "Param1": 202, + "ParamCond1": 0 + }, + { + "Id": 65, + "Param1": 203, + "ParamCond1": 0 + }, + { + "Id": 66, + "Param1": 204, + "ParamCond1": 0 + }, + { + "Id": 67, + "Param1": 205, + "ParamCond1": 0 + }, + { + "Id": 68, + "Param1": 206, + "ParamCond1": 0 + }, + { + "Id": 69, + "Param1": 207, + "ParamCond1": 0 + }, + { + "Id": 70, + "Param1": 208, + "ParamCond1": 0 + }, + { + "Id": 71, + "Param1": 302, + "ParamCond1": 0 + }, + { + "Id": 72, + "Param1": 303, + "ParamCond1": 0 + }, + { + "Id": 73, + "Param1": 304, + "ParamCond1": 0 + }, + { + "Id": 74, + "Param1": 305, + "ParamCond1": 0 + }, + { + "Id": 75, + "Param1": 306, + "ParamCond1": 0 + }, + { + "Id": 76, + "Param1": 307, + "ParamCond1": 0 + }, + { + "Id": 77, + "Param1": 308, + "ParamCond1": 0 + }, + { + "Id": 78, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 79, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 80, + "Param1": 6, + "ParamCond1": 0 + }, + { + "Id": 81, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 87, + "Param1": 4, + "ParamCond1": 6 + }, + { + "Id": 88, + "Param1": 3, + "ParamCond1": 6 + }, + { + "Id": 89, + "Param1": 2, + "ParamCond1": 6 + }, + { + "Id": 90, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 91, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 92, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 93, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 94, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 95, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 96, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 97, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 98, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 99, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 100, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 101, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 102, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 103, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 104, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 105, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 106, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 107, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 108, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 109, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 110, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 111, + "Param1": 5, + "ParamCond1": 0 + }, + { + "Id": 112, + "Param1": 5, + "ParamCond1": 0 + }, + { + "Id": 113, + "Param1": 5, + "ParamCond1": 0 + }, + { + "Id": 114, + "Param1": 5, + "ParamCond1": 0 + }, + { + "Id": 115, + "Param1": 6, + "ParamCond1": 0 + }, + { + "Id": 116, + "Param1": 6, + "ParamCond1": 0 + }, + { + "Id": 117, + "Param1": 6, + "ParamCond1": 0 + }, + { + "Id": 118, + "Param1": 6, + "ParamCond1": 0 + }, + { + "Id": 139, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 140, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 141, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 142, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 143, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 144, + "Param1": 11, + "ParamCond1": 0 + }, + { + "Id": 145, + "Param1": 90011, + "ParamCond1": 0 + }, + { + "Id": 146, + "Param1": 90011, + "ParamCond1": 0 + }, + { + "Id": 147, + "Param1": 90011, + "ParamCond1": 0 + }, + { + "Id": 148, + "Param1": 90011, + "ParamCond1": 0 + }, + { + "Id": 149, + "Param1": 90011, + "ParamCond1": 0 + }, + { + "Id": 150, + "Param1": 90012, + "ParamCond1": 0 + }, + { + "Id": 151, + "Param1": 90012, + "ParamCond1": 0 + }, + { + "Id": 152, + "Param1": 90012, + "ParamCond1": 0 + }, + { + "Id": 153, + "Param1": 90012, + "ParamCond1": 0 + }, + { + "Id": 154, + "Param1": 90012, + "ParamCond1": 0 + }, + { + "Id": 155, + "Param1": 90013, + "ParamCond1": 0 + }, + { + "Id": 156, + "Param1": 90013, + "ParamCond1": 0 + }, + { + "Id": 157, + "Param1": 90013, + "ParamCond1": 0 + }, + { + "Id": 158, + "Param1": 90013, + "ParamCond1": 0 + }, + { + "Id": 159, + "Param1": 90013, + "ParamCond1": 0 + }, + { + "Id": 160, + "Param1": 90014, + "ParamCond1": 0 + }, + { + "Id": 161, + "Param1": 90014, + "ParamCond1": 0 + }, + { + "Id": 162, + "Param1": 90014, + "ParamCond1": 0 + }, + { + "Id": 163, + "Param1": 90014, + "ParamCond1": 0 + }, + { + "Id": 164, + "Param1": 90014, + "ParamCond1": 0 + }, + { + "Id": 165, + "Param1": 90015, + "ParamCond1": 0 + }, + { + "Id": 166, + "Param1": 90015, + "ParamCond1": 0 + }, + { + "Id": 167, + "Param1": 90015, + "ParamCond1": 0 + }, + { + "Id": 168, + "Param1": 90015, + "ParamCond1": 0 + }, + { + "Id": 169, + "Param1": 90015, + "ParamCond1": 0 + }, + { + "Id": 170, + "Param1": 90016, + "ParamCond1": 0 + }, + { + "Id": 171, + "Param1": 90016, + "ParamCond1": 0 + }, + { + "Id": 172, + "Param1": 90016, + "ParamCond1": 0 + }, + { + "Id": 173, + "Param1": 90016, + "ParamCond1": 0 + }, + { + "Id": 174, + "Param1": 90016, + "ParamCond1": 0 + }, + { + "Id": 175, + "Param1": 90017, + "ParamCond1": 0 + }, + { + "Id": 176, + "Param1": 90017, + "ParamCond1": 0 + }, + { + "Id": 177, + "Param1": 90017, + "ParamCond1": 0 + }, + { + "Id": 178, + "Param1": 90017, + "ParamCond1": 0 + }, + { + "Id": 179, + "Param1": 90017, + "ParamCond1": 0 + }, + { + "Id": 180, + "Param1": 90018, + "ParamCond1": 0 + }, + { + "Id": 181, + "Param1": 90018, + "ParamCond1": 0 + }, + { + "Id": 182, + "Param1": 90018, + "ParamCond1": 0 + }, + { + "Id": 183, + "Param1": 90018, + "ParamCond1": 0 + }, + { + "Id": 184, + "Param1": 90018, + "ParamCond1": 0 + }, + { + "Id": 185, + "Param1": 90019, + "ParamCond1": 0 + }, + { + "Id": 186, + "Param1": 90019, + "ParamCond1": 0 + }, + { + "Id": 187, + "Param1": 90019, + "ParamCond1": 0 + }, + { + "Id": 188, + "Param1": 90019, + "ParamCond1": 0 + }, + { + "Id": 189, + "Param1": 90019, + "ParamCond1": 0 + }, + { + "Id": 190, + "Param1": 90020, + "ParamCond1": 0 + }, + { + "Id": 191, + "Param1": 90020, + "ParamCond1": 0 + }, + { + "Id": 192, + "Param1": 90020, + "ParamCond1": 0 + }, + { + "Id": 193, + "Param1": 90020, + "ParamCond1": 0 + }, + { + "Id": 194, + "Param1": 90020, + "ParamCond1": 0 + }, + { + "Id": 195, + "Param1": 90021, + "ParamCond1": 0 + }, + { + "Id": 196, + "Param1": 90021, + "ParamCond1": 0 + }, + { + "Id": 197, + "Param1": 90021, + "ParamCond1": 0 + }, + { + "Id": 198, + "Param1": 90021, + "ParamCond1": 0 + }, + { + "Id": 199, + "Param1": 90021, + "ParamCond1": 0 + }, + { + "Id": 200, + "Param1": 90022, + "ParamCond1": 0 + }, + { + "Id": 201, + "Param1": 90022, + "ParamCond1": 0 + }, + { + "Id": 202, + "Param1": 90022, + "ParamCond1": 0 + }, + { + "Id": 203, + "Param1": 90022, + "ParamCond1": 0 + }, + { + "Id": 204, + "Param1": 90022, + "ParamCond1": 0 + }, + { + "Id": 205, + "Param1": 90023, + "ParamCond1": 0 + }, + { + "Id": 206, + "Param1": 90023, + "ParamCond1": 0 + }, + { + "Id": 207, + "Param1": 90023, + "ParamCond1": 0 + }, + { + "Id": 208, + "Param1": 90023, + "ParamCond1": 0 + }, + { + "Id": 209, + "Param1": 90023, + "ParamCond1": 0 + }, + { + "Id": 210, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 211, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 212, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 213, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 214, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 215, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 216, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 217, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 218, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 219, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 220, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 221, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 222, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 223, + "Param1": 2, + "ParamCond1": 0 + }, + { + "Id": 224, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 225, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 226, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 227, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 228, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 229, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 230, + "Param1": 3, + "ParamCond1": 0 + }, + { + "Id": 231, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 232, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 233, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 234, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 235, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 236, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 237, + "Param1": 4, + "ParamCond1": 0 + }, + { + "Id": 238, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 239, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 240, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 241, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 242, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 243, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 244, + "Param1": 7, + "ParamCond1": 0 + }, + { + "Id": 245, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 246, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 247, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 248, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 249, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 250, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 251, + "Param1": 8, + "ParamCond1": 0 + }, + { + "Id": 270, + "Param1": 11010, + "ParamCond1": 0 + }, + { + "Id": 271, + "Param1": 51010, + "ParamCond1": 0 + }, + { + "Id": 272, + "Param1": 41010, + "ParamCond1": 0 + }, + { + "Id": 273, + "Param1": 71010, + "ParamCond1": 0 + }, + { + "Id": 274, + "Param1": 31010, + "ParamCond1": 0 + }, + { + "Id": 275, + "Param1": 21010, + "ParamCond1": 0 + }, + { + "Id": 276, + "Param1": 61010, + "ParamCond1": 0 + }, + { + "Id": 277, + "Param1": 11020, + "ParamCond1": 0 + }, + { + "Id": 278, + "Param1": 51020, + "ParamCond1": 0 + }, + { + "Id": 279, + "Param1": 41020, + "ParamCond1": 0 + }, + { + "Id": 280, + "Param1": 71020, + "ParamCond1": 0 + }, + { + "Id": 281, + "Param1": 31020, + "ParamCond1": 0 + }, + { + "Id": 282, + "Param1": 21020, + "ParamCond1": 0 + }, + { + "Id": 283, + "Param1": 61020, + "ParamCond1": 0 + }, + { + "Id": 284, + "Param1": 11030, + "ParamCond1": 0 + }, + { + "Id": 285, + "Param1": 51030, + "ParamCond1": 0 + }, + { + "Id": 286, + "Param1": 41030, + "ParamCond1": 0 + }, + { + "Id": 287, + "Param1": 71030, + "ParamCond1": 0 + }, + { + "Id": 288, + "Param1": 31030, + "ParamCond1": 0 + }, + { + "Id": 289, + "Param1": 21030, + "ParamCond1": 0 + }, + { + "Id": 290, + "Param1": 61030, + "ParamCond1": 0 + }, + { + "Id": 291, + "Param1": 11040, + "ParamCond1": 0 + }, + { + "Id": 292, + "Param1": 51040, + "ParamCond1": 0 + }, + { + "Id": 293, + "Param1": 41040, + "ParamCond1": 0 + }, + { + "Id": 294, + "Param1": 71040, + "ParamCond1": 0 + }, + { + "Id": 295, + "Param1": 31040, + "ParamCond1": 0 + }, + { + "Id": 296, + "Param1": 21040, + "ParamCond1": 0 + }, + { + "Id": 297, + "Param1": 61040, + "ParamCond1": 0 + }, + { + "Id": 298, + "Param1": 11050, + "ParamCond1": 0 + }, + { + "Id": 299, + "Param1": 51050, + "ParamCond1": 0 + }, + { + "Id": 300, + "Param1": 41050, + "ParamCond1": 0 + }, + { + "Id": 301, + "Param1": 71050, + "ParamCond1": 0 + }, + { + "Id": 302, + "Param1": 31050, + "ParamCond1": 0 + }, + { + "Id": 303, + "Param1": 21050, + "ParamCond1": 0 + }, + { + "Id": 304, + "Param1": 61050, + "ParamCond1": 0 + }, + { + "Id": 305, + "Param1": 11060, + "ParamCond1": 0 + }, + { + "Id": 306, + "Param1": 51060, + "ParamCond1": 0 + }, + { + "Id": 307, + "Param1": 41060, + "ParamCond1": 0 + }, + { + "Id": 308, + "Param1": 71060, + "ParamCond1": 0 + }, + { + "Id": 309, + "Param1": 31060, + "ParamCond1": 0 + }, + { + "Id": 310, + "Param1": 21060, + "ParamCond1": 0 + }, + { + "Id": 311, + "Param1": 61060, + "ParamCond1": 0 + }, + { + "Id": 335, + "Param1": 20, + "ParamCond1": 4 + }, + { + "Id": 336, + "Param1": 30, + "ParamCond1": 4 + }, + { + "Id": 337, + "Param1": 50, + "ParamCond1": 4 + }, + { + "Id": 338, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 339, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 340, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 341, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 342, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 343, + "Param1": 90, + "ParamCond1": 4 + }, + { + "Id": 344, + "Param1": 20, + "ParamCond1": 4, + "Param2": 1, + "ParamCond2": 0 + }, + { + "Id": 345, + "Param1": 30, + "ParamCond1": 4, + "Param2": 1, + "ParamCond2": 0 + }, + { + "Id": 346, + "Param1": 50, + "ParamCond1": 4, + "Param2": 1, + "ParamCond2": 0 + }, + { + "Id": 347, + "Param1": 90, + "ParamCond1": 4, + "Param2": 1, + "ParamCond2": 0 + }, + { + "Id": 348, + "Param1": 20, + "ParamCond1": 4, + "Param2": 2, + "ParamCond2": 0 + }, + { + "Id": 349, + "Param1": 30, + "ParamCond1": 4, + "Param2": 2, + "ParamCond2": 0 + }, + { + "Id": 350, + "Param1": 50, + "ParamCond1": 4, + "Param2": 2, + "ParamCond2": 0 + }, + { + "Id": 351, + "Param1": 90, + "ParamCond1": 4, + "Param2": 2, + "ParamCond2": 0 + }, + { + "Id": 352, + "Param1": 20, + "ParamCond1": 4, + "Param2": 3, + "ParamCond2": 0 + }, + { + "Id": 353, + "Param1": 30, + "ParamCond1": 4, + "Param2": 3, + "ParamCond2": 0 + }, + { + "Id": 354, + "Param1": 50, + "ParamCond1": 4, + "Param2": 3, + "ParamCond2": 0 + }, + { + "Id": 355, + "Param1": 90, + "ParamCond1": 4, + "Param2": 3, + "ParamCond2": 0 + }, + { + "Id": 356, + "Param1": 20, + "ParamCond1": 4, + "Param2": 4, + "ParamCond2": 0 + }, + { + "Id": 357, + "Param1": 30, + "ParamCond1": 4, + "Param2": 4, + "ParamCond2": 0 + }, + { + "Id": 358, + "Param1": 50, + "ParamCond1": 4, + "Param2": 4, + "ParamCond2": 0 + }, + { + "Id": 359, + "Param1": 90, + "ParamCond1": 4, + "Param2": 4, + "ParamCond2": 0 + }, + { + "Id": 360, + "Param1": 20, + "ParamCond1": 4, + "Param2": 5, + "ParamCond2": 0 + }, + { + "Id": 361, + "Param1": 30, + "ParamCond1": 4, + "Param2": 5, + "ParamCond2": 0 + }, + { + "Id": 362, + "Param1": 50, + "ParamCond1": 4, + "Param2": 5, + "ParamCond2": 0 + }, + { + "Id": 363, + "Param1": 90, + "ParamCond1": 4, + "Param2": 5, + "ParamCond2": 0 + }, + { + "Id": 364, + "Param1": 20, + "ParamCond1": 4, + "Param2": 6, + "ParamCond2": 0 + }, + { + "Id": 365, + "Param1": 30, + "ParamCond1": 4, + "Param2": 6, + "ParamCond2": 0 + }, + { + "Id": 366, + "Param1": 50, + "ParamCond1": 4, + "Param2": 6, + "ParamCond2": 0 + }, + { + "Id": 367, + "Param1": 90, + "ParamCond1": 4, + "Param2": 6, + "ParamCond2": 0 + }, + { + "Id": 382, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 383, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 384, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 385, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 386, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 387, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 393, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 394, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 395, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 396, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 397, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 398, + "Param1": 1, + "ParamCond1": 0 + }, + { + "Id": 498, + "Param2": 1, + "ParamCond2": 0 + }, + { + "Id": 499, + "Param1": 110, + "ParamCond1": 0 + }, + { + "Id": 500, + "Param1": 207, + "ParamCond1": 0 + }, + { + "Id": 627, + "Param1": 417, + "ParamCond1": 0 + } +]