diff --git a/src/main/java/automaton/FunctionHelper.java b/src/main/java/automaton/FunctionHelper.java index 1e404d189..02b728168 100644 --- a/src/main/java/automaton/FunctionHelper.java +++ b/src/main/java/automaton/FunctionHelper.java @@ -21,10 +21,17 @@ import com.megacrit.cardcrawl.cards.CardGroup; import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.monsters.MonsterGroup; import com.megacrit.cardcrawl.powers.AbstractPower; import com.megacrit.cardcrawl.relics.AbstractRelic; +import com.megacrit.cardcrawl.rooms.AbstractRoom; +import com.megacrit.cardcrawl.rooms.MonsterRoom; import com.megacrit.cardcrawl.vfx.BobEffect; import downfall.util.TextureLoader; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; +import sneckomod.TheSnecko; import java.util.HashMap; @@ -139,6 +146,26 @@ public static void addToSequence(AbstractCard c) { ((AbstractBronzeCard) c).onInput(); } if (held.size() == max()) { + boolean bossPresent = false; + AbstractRoom currentRoom = AbstractDungeon.getCurrRoom(); + if (currentRoom instanceof MonsterRoom) { + MonsterGroup monsters = currentRoom.monsters; + for (AbstractMonster monster : monsters.monsters) { + if (monster.type == AbstractMonster.EnemyType.BOSS) { + bossPresent = true; + break; + } + } + } + + if (bossPresent) { + DownfallAchievementVariables.functionCreated = true; + } + + if (AbstractDungeon.player instanceof TheSnecko) { + DownfallAchievementUnlocker.unlockAchievement("NOODLE_CODE"); + } + output(); } secretStorage = makeFunction(false); diff --git a/src/main/java/automaton/cards/Mutator.java b/src/main/java/automaton/cards/Mutator.java index e66aaf0af..2831c6ef7 100644 --- a/src/main/java/automaton/cards/Mutator.java +++ b/src/main/java/automaton/cards/Mutator.java @@ -8,6 +8,8 @@ import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.powers.StrengthPower; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import static automaton.AutomatonMod.makeBetaCardPath; @@ -28,6 +30,10 @@ public void use(AbstractPlayer p, AbstractMonster m) { atb(new SelectCardsInHandAction(1, masterUI.TEXT[6], c -> c.type == CardType.STATUS, (cards) -> { att(new MakeTempCardInHandAction(q.makeStatEquivalentCopy(), true)); att(new ExhaustSpecificCardAction(cards.get(0), p.hand, true)); + DownfallAchievementVariables.statusesMutated++; + if (DownfallAchievementVariables.statusesMutated >= 3) { + DownfallAchievementUnlocker.unlockAchievement("TRIPLE_SETTER"); + } })); } diff --git a/src/main/java/automaton/events/ShapeFactory.java b/src/main/java/automaton/events/ShapeFactory.java index 537e26ee5..ccd8d1e38 100644 --- a/src/main/java/automaton/events/ShapeFactory.java +++ b/src/main/java/automaton/events/ShapeFactory.java @@ -1,27 +1,20 @@ package automaton.events; - import automaton.cards.DazingPulse; import automaton.cards.Explode; import automaton.cards.Spike; import automaton.util.DazingPulseReward; -import automaton.util.DonuBeamReward; import automaton.util.ExplodeReward; import automaton.util.SpikeReward; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.events.AbstractImageEvent; -import com.megacrit.cardcrawl.helpers.MonsterHelper; import com.megacrit.cardcrawl.localization.EventStrings; import com.megacrit.cardcrawl.monsters.MonsterGroup; import com.megacrit.cardcrawl.monsters.beyond.Exploder; import com.megacrit.cardcrawl.monsters.beyond.Repulsor; import com.megacrit.cardcrawl.monsters.beyond.Spiker; -import com.megacrit.cardcrawl.monsters.exordium.SlaverBlue; -import com.megacrit.cardcrawl.relics.ChampionsBelt; -import com.megacrit.cardcrawl.relics.CloakClasp; -import com.megacrit.cardcrawl.relics.WristBlade; -import slimebound.SlimeboundMod; +import expansioncontent.util.DownfallAchievementVariables; public class ShapeFactory extends AbstractImageEvent { public static final String ID = "bronze:ShapeFactory"; @@ -167,6 +160,9 @@ private void beginFight(){ if (fightExploder){ AbstractDungeon.getCurrRoom().rewards.add(new ExplodeReward()); } + if (fightSpiker && fightRepulsor && fightExploder) { + DownfallAchievementVariables.threeShapesFought = true; + } int numShapes = AbstractDungeon.getCurrRoom().rewards.size(); logMetric(ID, "Fought " + numShapes + " shapes"); @@ -207,4 +203,4 @@ private enum CurScreen { CurScreen() { } } -} +} \ No newline at end of file diff --git a/src/main/java/champ/stances/BerserkerStance.java b/src/main/java/champ/stances/BerserkerStance.java index 48b4fd660..355c015b1 100644 --- a/src/main/java/champ/stances/BerserkerStance.java +++ b/src/main/java/champ/stances/BerserkerStance.java @@ -8,18 +8,13 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; -import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; -import com.megacrit.cardcrawl.actions.common.HealAction; -import com.megacrit.cardcrawl.actions.common.RemoveSpecificPowerAction; import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.powers.AbstractPower; import com.megacrit.cardcrawl.powers.StrengthPower; import com.megacrit.cardcrawl.vfx.stance.StanceAuraEffect; import guardian.vfx.DefensiveModeStanceParticleEffect; -import static champ.ChampMod.fatigue; import static champ.ChampMod.vigor; public class BerserkerStance extends AbstractChampStance { diff --git a/src/main/java/champ/stances/UltimateStance.java b/src/main/java/champ/stances/UltimateStance.java index ef07da10a..6a42d4fd4 100644 --- a/src/main/java/champ/stances/UltimateStance.java +++ b/src/main/java/champ/stances/UltimateStance.java @@ -3,6 +3,8 @@ import champ.ChampChar; import champ.ChampMod; import com.megacrit.cardcrawl.stances.AbstractStance; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; public class UltimateStance extends AbstractChampStance { @@ -47,6 +49,10 @@ public void onEnterStance() { super.onEnterStance(); ChampMod.enteredBerserkerThisTurn = true; ChampMod.enteredDefensiveThisTurn = true; + DownfallAchievementVariables.enteredUltimateStance++; + if (DownfallAchievementVariables.enteredUltimateStance >= 3) { + DownfallAchievementUnlocker.unlockAchievement("I_AM_THE_ONE"); + } } @Override diff --git a/src/main/java/charbosses/bosses/Ironclad/CharBossIronclad.java b/src/main/java/charbosses/bosses/Ironclad/CharBossIronclad.java index 2db4ba2b9..78cb07edb 100644 --- a/src/main/java/charbosses/bosses/Ironclad/CharBossIronclad.java +++ b/src/main/java/charbosses/bosses/Ironclad/CharBossIronclad.java @@ -35,6 +35,7 @@ import com.megacrit.cardcrawl.ui.panels.energyorb.EnergyOrbRed; import downfall.downfallMod; import downfall.monsters.NeowBoss; +import expansioncontent.util.DownfallAchievementUnlocker; import guardian.powers.ConstructPower; import hermit.util.TextureLoader; import slimebound.SlimeboundMod; @@ -193,6 +194,11 @@ public void die() { } } } + + if (AbstractDungeon.player instanceof ChampChar && AbstractDungeon.actNum == 1) { + DownfallAchievementUnlocker.unlockAchievement("MY_BELT"); + } + } @Override diff --git a/src/main/java/collector/cards/Goodbye.java b/src/main/java/collector/cards/Goodbye.java index a970340f9..9b520d102 100644 --- a/src/main/java/collector/cards/Goodbye.java +++ b/src/main/java/collector/cards/Goodbye.java @@ -8,6 +8,7 @@ import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.combat.VerticalAuraEffect; +import expansioncontent.util.DownfallAchievementUnlocker; import static collector.CollectorMod.makeID; import static collector.util.Wiz.applyToEnemyTop; @@ -15,7 +16,6 @@ public class Goodbye extends AbstractCollectorCard { public final static String ID = makeID(Goodbye.class.getSimpleName()); - // intellij stuff skill, enemy, rare, , , , , 2, 1 public Goodbye() { super(ID, 2, CardType.SKILL, CardRarity.RARE, CardTarget.ENEMY); @@ -33,8 +33,22 @@ public void use(AbstractPlayer p, AbstractMonster m) { public void update() { isDone = true; if (m.hasPower(DoomPower.POWER_ID)) { - int count = m.getPower(DoomPower.POWER_ID).amount; - applyToEnemyTop(m, new DoomPower(m, count * magicNumber)); + int initialDoom = m.getPower(DoomPower.POWER_ID).amount; + int doomToApply = initialDoom * magicNumber; + applyToEnemyTop(m, new DoomPower(m, doomToApply)); + + addToBot(new AbstractGameAction() { + @Override + public void update() { + isDone = true; + if (m.hasPower(DoomPower.POWER_ID)) { + int finalDoom = m.getPower(DoomPower.POWER_ID).amount; + if (finalDoom - initialDoom >= 100) { + DownfallAchievementUnlocker.unlockAchievement("SAYONARA"); + } + } + } + }); } } }); diff --git a/src/main/java/collector/cards/collectibles/FinalBossCard.java b/src/main/java/collector/cards/collectibles/FinalBossCard.java index ff3ae9043..363a07609 100644 --- a/src/main/java/collector/cards/collectibles/FinalBossCard.java +++ b/src/main/java/collector/cards/collectibles/FinalBossCard.java @@ -5,6 +5,7 @@ import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.powers.InvinciblePower; +import expansioncontent.util.DownfallAchievementUnlocker; import static collector.CollectorMod.makeID; import static collector.util.Wiz.atb; @@ -20,6 +21,7 @@ public FinalBossCard() { public void use(AbstractPlayer p, AbstractMonster m) { atb(new RemoveSpecificPowerAction(m, p, InvinciblePower.POWER_ID)); atb(new StunMonsterAction(m, p)); + DownfallAchievementUnlocker.unlockAchievement("THE_BIGGER_THEY_ARE"); } public void upp() { diff --git a/src/main/java/downfall/downfallMod.java b/src/main/java/downfall/downfallMod.java index e3225fe52..070416f63 100644 --- a/src/main/java/downfall/downfallMod.java +++ b/src/main/java/downfall/downfallMod.java @@ -131,6 +131,7 @@ import guardian.rewards.GemReward; import guardian.rewards.GemRewardAllRarities; import hermit.HermitMod; +import hermit.characters.hermit; import slimebound.SlimeboundMod; import slimebound.characters.SlimeboundCharacter; import slimebound.potions.ThreeZeroPotion; @@ -1367,6 +1368,9 @@ public void receiveStartGame() { AbstractDungeon.player.increaseMaxOrbSlots(1, false); } } + // if (CardCrawlGame.loadingSave && (EvilModeCharacterSelect.evilMode || downfallMod.contentSharing_events)) { + // addPotions(); + // } } @Override @@ -1403,7 +1407,7 @@ public void receiveStartAct() { public static boolean isDownfallCharacter(AbstractPlayer p) { - if (p instanceof SlimeboundCharacter || p instanceof TheHexaghost || p instanceof GuardianCharacter || p instanceof TheSnecko || p instanceof ChampChar || p instanceof AutomatonChar || p instanceof GremlinCharacter || p instanceof hermit.characters.hermit || p instanceof CollectorChar) { + if (p instanceof SlimeboundCharacter || p instanceof TheHexaghost || p instanceof GuardianCharacter || p instanceof TheSnecko || p instanceof ChampChar || p instanceof AutomatonChar || p instanceof GremlinCharacter || p instanceof hermit || p instanceof CollectorChar) { return true; } return false; diff --git a/src/main/java/downfall/events/Beggar_Evil.java b/src/main/java/downfall/events/Beggar_Evil.java index bca017c88..5afec50ff 100644 --- a/src/main/java/downfall/events/Beggar_Evil.java +++ b/src/main/java/downfall/events/Beggar_Evil.java @@ -15,6 +15,7 @@ import com.megacrit.cardcrawl.vfx.cardManip.PurgeCardEffect; import com.megacrit.cardcrawl.vfx.cardManip.ShowCardAndObtainEffect; import downfall.downfallMod; +import expansioncontent.util.DownfallAchievementUnlocker; import slimebound.SlimeboundMod; import java.util.ArrayList; @@ -193,6 +194,7 @@ protected void buttonEffect(int buttonPressed) { this.imageEventText.clearAllDialogs(); this.imageEventText.updateBodyText(DESCRIPTIONSALT[7]); AbstractDungeon.gridSelectScreen.open(CardGroup.getGroupWithoutBottledCards(AbstractDungeon.player.masterDeck.getPurgeableCards()), 2, OPTIONSOG[3], false, false, false, true); + DownfallAchievementUnlocker.unlockAchievement("BULLY"); this.screen = CurScreen.END; this.imageEventText.setDialogOption(OPTIONS[5]); break; diff --git a/src/main/java/downfall/patches/BanStuffPatch.java b/src/main/java/downfall/patches/BanStuffPatch.java index 4e00e70ac..bfc4ca14c 100644 --- a/src/main/java/downfall/patches/BanStuffPatch.java +++ b/src/main/java/downfall/patches/BanStuffPatch.java @@ -1,3 +1,4 @@ + package downfall.patches; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; diff --git a/src/main/java/downfall/patches/ui/campfire/AddBustKeyButtonPatches.java b/src/main/java/downfall/patches/ui/campfire/AddBustKeyButtonPatches.java index 34b1732ae..486ee9a19 100644 --- a/src/main/java/downfall/patches/ui/campfire/AddBustKeyButtonPatches.java +++ b/src/main/java/downfall/patches/ui/campfire/AddBustKeyButtonPatches.java @@ -85,4 +85,4 @@ public void edit(MethodCall m) throws CannotCompileException { } } -} +} \ No newline at end of file diff --git a/src/main/java/downfall/patches/ui/map/FlipMap.java b/src/main/java/downfall/patches/ui/map/FlipMap.java index 9697c03dd..c65bc5c9e 100644 --- a/src/main/java/downfall/patches/ui/map/FlipMap.java +++ b/src/main/java/downfall/patches/ui/map/FlipMap.java @@ -16,9 +16,11 @@ import com.megacrit.cardcrawl.map.MapEdge; import com.megacrit.cardcrawl.map.MapRoomNode; import com.megacrit.cardcrawl.map.RoomTypeAssigner; +import com.megacrit.cardcrawl.potions.AbstractPotion; import com.megacrit.cardcrawl.rooms.*; import com.megacrit.cardcrawl.screens.DungeonMapScreen; import com.megacrit.cardcrawl.ui.buttons.DynamicBanner; +import com.megacrit.cardcrawl.ui.panels.TopPanel; import downfall.downfallMod; import downfall.patches.EvilModeCharacterSelect; import downfall.patches.actlikeit.MapCompatiblity; @@ -31,6 +33,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.lang.reflect.Field; import java.util.*; public class FlipMap { @@ -636,4 +639,109 @@ public void edit(MethodCall m) throws CannotCompileException { } } } -} + @SpirePatch( + clz = DungeonMapScreen.class, + method = "updateControllerInput" + ) + public static class FixDownfallControllerInput { + private static Field visibleMapNodesField; + private static MapRoomNode lastSelectedNode; + + static { + try { + visibleMapNodesField = DungeonMapScreen.class.getDeclaredField("visibleMapNodes"); + visibleMapNodesField.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + @SpireInsertPatch( + locator = Locator.class, + localvars = {"nodes", "index", "anyHovered"} + ) + public static void Insert(DungeonMapScreen __instance, ArrayList nodes, @ByRef int[] index, @ByRef boolean[] anyHovered) { + if (EvilModeCharacterSelect.evilMode && !invalidActs.contains(AbstractDungeon.id) && !AbstractDungeon.firstRoomChosen) { + try { + @SuppressWarnings("unchecked") + ArrayList visibleMapNodes = (ArrayList) visibleMapNodesField.get(__instance); + nodes.clear(); + for (MapRoomNode n : visibleMapNodes) { + if (n.y == FlipMap.MapFlipper.startY) { + nodes.add(n); + } + } + + anyHovered[0] = false; + + for (int i = 0; i < nodes.size(); i++) { + if (nodes.get(i).hb.hovered) { + index[0] = i; + anyHovered[0] = true; + lastSelectedNode = nodes.get(i); + break; + } + } + + if (!anyHovered[0]) { + if (lastSelectedNode != null && nodes.contains(lastSelectedNode)) { + index[0] = nodes.indexOf(lastSelectedNode); + } else if (!nodes.isEmpty()) { + index[0] = nodes.size() / 2; + lastSelectedNode = nodes.get(index[0]); + } + + if (!nodes.isEmpty()) { + Gdx.input.setCursorPosition((int)nodes.get(index[0]).hb.cX, Settings.HEIGHT - (int)nodes.get(index[0]).hb.cY); + __instance.mapNodeHb = nodes.get(index[0]).hb; + } + } + + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + private static class Locator extends SpireInsertLocator { + @Override + public int[] Locate(CtBehavior ctMethodToPatch) throws Exception { + Matcher finalMatcher = new Matcher.MethodCallMatcher(ArrayList.class, "isEmpty"); + return LineFinder.findInOrder(ctMethodToPatch, finalMatcher); + } + } + } + @SpirePatch(clz = TopPanel.class, method = "update") + public static class DisableTopPanelHoveringPatch { + @SpireInsertPatch(locator = Locator.class) + public static void Insert(TopPanel __instance) { + if (Settings.isControllerMode && EvilModeCharacterSelect.evilMode && !__instance.selectPotionMode) { + __instance.goldHb.hovered = false; + + for (AbstractPotion potion : AbstractDungeon.player.potions) { + potion.hb.hovered = false; + } + } + } + + private static class Locator extends SpireInsertLocator { + @Override + public int[] Locate(CtBehavior ctBehavior) throws Exception { + Matcher finalMatcher = new Matcher.MethodCallMatcher(TopPanel.class, "updateButtons"); + return LineFinder.findInOrder(ctBehavior, finalMatcher); + } + } + } + + @SpirePatch(clz = TopPanel.class, method = "updateAscensionHover") + public static class DisableAscensionHoveringPatch { + @SpirePrefixPatch + public static SpireReturn Prefix(TopPanel __instance) { + if (Settings.isControllerMode && EvilModeCharacterSelect.evilMode && !__instance.selectPotionMode) { + __instance.ascensionHb.hovered = false; + return SpireReturn.Return(null); + } + return SpireReturn.Continue(); + } + } +} \ No newline at end of file diff --git a/src/main/java/downfall/ui/campfire/BustKeyOption.java b/src/main/java/downfall/ui/campfire/BustKeyOption.java index 7ca066a19..a17b8d7ac 100644 --- a/src/main/java/downfall/ui/campfire/BustKeyOption.java +++ b/src/main/java/downfall/ui/campfire/BustKeyOption.java @@ -185,4 +185,4 @@ public void useOption() { public enum Keys { RUBY, EMERALD, SAPPHIRE } -} +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/achievements/DownfallAchievementGrid.java b/src/main/java/expansioncontent/achievements/DownfallAchievementGrid.java new file mode 100644 index 000000000..1084cecbb --- /dev/null +++ b/src/main/java/expansioncontent/achievements/DownfallAchievementGrid.java @@ -0,0 +1,118 @@ +package expansioncontent.achievements; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.localization.UIStrings; +import com.megacrit.cardcrawl.unlock.UnlockTracker; +import downfall.downfallMod; + +import java.util.ArrayList; + +public class DownfallAchievementGrid { + public ArrayList items = new ArrayList<>(); + private static final float SPACING = 200.0F * Settings.scale; + private static final int ITEMS_PER_ROW = 5; + + public DownfallAchievementGrid() { + DownfallAchievementItem.atlas = new TextureAtlas(Gdx.files.internal("expansioncontentResources/images/achievements/DownfallAchievements.atlas")); + loadAchievement("BULLY"); + loadAchievement("CORRUPTED"); + loadAchievement("UPRISE"); + loadAchievement("LONGSHOT"); + loadAchievement("BOUNTY_HUNTER"); + loadAchievement("WIELDER_OF_WOE"); + loadAchievement("GORGED"); + loadAchievement("FOR_THE_BOSS"); + loadAchievement("PAYMENT_RECEIVED"); + loadAchievement("HYPER_ACCELERATION"); + loadAchievement("IMPENETRABLE"); + loadAchievement("BEJEWELED"); + loadAchievement("HEXABURN"); + loadAchievement("GHOSTLY"); + loadAchievement("THE_BROKEN_SEAL"); + loadAchievement("MY_BELT"); + loadAchievement("I_AM_THE_ONE"); + loadAchievement("OVER_OVERKILL"); + loadAchievement("TRIPLE_SETTER"); + loadAchievement("MECHANICAL_GAUNTLET"); + loadAchievement("CODERS_BLOCK"); + loadAchievement("PICKPOCKET_100"); + loadAchievement("GLASS_BONES"); + loadAchievement("OUR_TRUE_FORM"); + loadAchievement("NOODLE_CODE"); + loadAchievement("MASTER_OF_CONFUSION"); + loadAchievement("UNBOUND"); + loadAchievement("SAYONARA"); + loadAchievement("THE_BIGGER_THEY_ARE"); + loadAchievement("HOARDER"); + loadAchievement("TOPAZ"); + loadAchievement("JADE"); + loadAchievement("CITRINE"); + loadAchievement("TANZANITE"); + loadAchievement("KYANITE"); + loadAchievement("RUTILE"); + loadAchievement("SPINEL"); + loadAchievement("CHRYSOCOLLA"); + loadAchievement("MALACHITE"); + loadAchievement("TOPAZ+"); + loadAchievement("JADE+"); + loadAchievement("CITRINE+"); + loadAchievement("TANZANITE+"); + loadAchievement("KYANITE+"); + loadAchievement("RUTILE+"); + loadAchievement("SPINEL+"); + loadAchievement("CHRYSOCOLLA+"); + loadAchievement("MALACHITE+"); + loadAchievement("EVIL_ONE"); + } + + private void loadAchievement(String id) { + String fullId = downfallMod.makeID(id); + UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(fullId); + String name = uiStrings.TEXT[0]; + String description = uiStrings.TEXT[1]; + TextureAtlas.AtlasRegion AchievementImageUnlocked = DownfallAchievementItem.atlas.findRegion("unlocked/" + id); + TextureAtlas.AtlasRegion AchievementImageLocked = DownfallAchievementItem.atlas.findRegion("locked/" + id); + items.add(new DownfallAchievementItem(name, description, fullId, AchievementImageUnlocked, AchievementImageLocked)); + } + + public void updateAchievementStatus() { + for (DownfallAchievementItem item : items) { + String achievementKey = item.getKey(); + boolean isUnlocked = UnlockTracker.isAchievementUnlocked(achievementKey); + item.isUnlocked = isUnlocked; + item.reloadImg(); + } + } + + public void render(SpriteBatch sb, float renderY) { + for (int i = 0; i < items.size(); ++i) { + items.get(i).render(sb, 560.0F * Settings.scale + (i % ITEMS_PER_ROW) * SPACING, renderY - (i / ITEMS_PER_ROW) * SPACING + 680.0F * Settings.yScale); + } + } + + public float calculateHeight() { + int numRows = (items.size() + ITEMS_PER_ROW - 1) / ITEMS_PER_ROW; + return numRows * SPACING + 50.0F * Settings.scale; + } + + public void update() { + updateAchievementStatus(); + for (DownfallAchievementItem item : items) { + item.update(); + } + } + + public boolean areAllAchievementsUnlockedExceptEvilOne() { + for (DownfallAchievementItem item : items) { + if (!item.isUnlocked && !item.getKey().equals(downfallMod.makeID("EVIL_ONE"))) { + return false; + } + } + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/achievements/DownfallAchievementItem.java b/src/main/java/expansioncontent/achievements/DownfallAchievementItem.java new file mode 100644 index 000000000..6ed53ffc8 --- /dev/null +++ b/src/main/java/expansioncontent/achievements/DownfallAchievementItem.java @@ -0,0 +1,69 @@ +package expansioncontent.achievements; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.helpers.Hitbox; +import com.megacrit.cardcrawl.helpers.TipHelper; +import com.megacrit.cardcrawl.helpers.input.InputHelper; +import com.megacrit.cardcrawl.unlock.UnlockTracker; + +public class DownfallAchievementItem { + private TextureAtlas.AtlasRegion unlockedImg; + private TextureAtlas.AtlasRegion lockedImg; + public TextureAtlas.AtlasRegion currentImg; + private static final Color LOCKED_COLOR = new Color(1.0F, 1.0F, 1.0F, 0.8F); + public static TextureAtlas atlas; + private String title; + private String desc; + public String key; + public boolean isUnlocked; + public Hitbox hb; + + public DownfallAchievementItem(String title, String desc, String key, TextureAtlas.AtlasRegion unlockedImage, TextureAtlas.AtlasRegion lockedImage) { + this.hb = new Hitbox(160.0F * Settings.scale, 160.0F * Settings.scale); + this.isUnlocked = UnlockTracker.achievementPref.getBoolean(key, false); + this.key = key; + this.title = title; + this.desc = desc; + this.unlockedImg = unlockedImage; + this.lockedImg = lockedImage; + this.currentImg = lockedImage; + } + + public String getKey() { + return key; + } + + public void reloadImg() { + if (this.isUnlocked) { + this.unlockedImg = atlas.findRegion(this.unlockedImg.name); + } else { + this.lockedImg = atlas.findRegion(this.lockedImg.name); + } + } + + public void render(SpriteBatch sb, float x, float y) { + TextureAtlas.AtlasRegion currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; + this.currentImg = currentImg; + Color currentColor = this.isUnlocked ? Color.WHITE : LOCKED_COLOR; + sb.setColor(currentColor); + if (this.hb.hovered) { + sb.draw(currentImg, x - (float)currentImg.packedWidth / 2.0F, y - (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth / 2.0F, (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth, (float)currentImg.packedHeight, Settings.scale * 1.1F, Settings.scale * 1.1F, 0.0F); + } else { + sb.draw(currentImg, x - (float)currentImg.packedWidth / 2.0F, y - (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth / 2.0F, (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth, (float)currentImg.packedHeight, Settings.scale, Settings.scale, 0.0F); + } + this.hb.move(x, y); + this.hb.render(sb); + } + + public void update() { + if (this.hb != null) { + this.hb.update(); + if (this.hb.hovered) { + TipHelper.renderGenericTip((float) InputHelper.mX + 100.0F * Settings.scale, (float)InputHelper.mY, this.title, this.desc); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/expansionContentMod.java b/src/main/java/expansioncontent/expansionContentMod.java index e2eccd184..e5f42817c 100644 --- a/src/main/java/expansioncontent/expansionContentMod.java +++ b/src/main/java/expansioncontent/expansionContentMod.java @@ -9,10 +9,15 @@ Global Relics (not attached to character-specific unlocks), */ +import automaton.AutomatonChar; +import automaton.events.ShapeFactory; import basemod.BaseMod; import basemod.ReflectionHacks; import basemod.helpers.RelicType; import basemod.interfaces.*; +import champ.ChampChar; +import collector.CollectorChar; +import collector.CollectorCollection; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureAtlas; @@ -22,12 +27,22 @@ Global Relics (not attached to character-specific unlocks), import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.characters.TheSilent; +import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.events.AbstractEvent; import com.megacrit.cardcrawl.powers.AbstractPower; +import com.megacrit.cardcrawl.powers.watcher.VigorPower; import com.megacrit.cardcrawl.rooms.AbstractRoom; +import com.megacrit.cardcrawl.rooms.EventRoom; +import com.megacrit.cardcrawl.rooms.MonsterRoomBoss; import com.megacrit.cardcrawl.unlock.UnlockTracker; import downfall.ui.campfire.WheelSpinButton; import downfall.util.CardIgnore; +import expansioncontent.achievements.DownfallAchievementGrid; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import downfall.util.TextureLoader; import expansioncontent.cards.AbstractExpansionCard; import expansioncontent.patches.CardColorEnumPatch; @@ -36,10 +51,17 @@ Global Relics (not attached to character-specific unlocks), import expansioncontent.util.CardFilter; import expansioncontent.util.DownfallMagic; import expansioncontent.util.SecondDownfallMagic; +import gremlin.characters.GremlinCharacter; +import gremlin.powers.GremlinNobPower; +import guardian.characters.GuardianCharacter; import javassist.CtClass; import javassist.Modifier; import javassist.NotFoundException; import org.clapper.util.classutil.*; +import slimebound.characters.SlimeboundCharacter; +import sneckomod.SneckoMod; +import sneckomod.TheSnecko; +import theHexaghost.TheHexaghost; import java.io.File; import java.net.URISyntaxException; @@ -47,6 +69,9 @@ Global Relics (not attached to character-specific unlocks), import java.util.ArrayList; import java.util.Collection; +import static downfall.downfallMod.isDownfallCharacter; +import static downfall.patches.EvilModeCharacterSelect.evilMode; + @SuppressWarnings({"ConstantConditions", "unused", "WeakerAccess"}) @SpireInitializer public class expansionContentMod implements @@ -56,7 +81,13 @@ public class expansionContentMod implements PostInitializeSubscriber, //EditStringsSubscriber, //EditKeywordsSubscriber, - PostUpdateSubscriber { + PostUpdateSubscriber, + PostDeathSubscriber, + OnPlayerTurnStartSubscriber, + OnStartBattleSubscriber, + OnCardUseSubscriber, + PostBattleSubscriber, + StartGameSubscriber { @SpireEnum public static AbstractCard.CardTags STUDY_HEXAGHOST; @@ -93,6 +124,7 @@ public class expansionContentMod implements public static Texture exhaustIcon; public static Texture retainIcon; public static Texture unplayableIcon; + public static DownfallAchievementGrid downfallAchievementGrid; public expansionContentMod() { BaseMod.subscribe(this); @@ -104,7 +136,7 @@ public expansionContentMod() { "champResources/images/512/bg_attack_colorless.png", "champResources/images/512/bg_skill_colorless.png", "champResources/images/512/bg_power_colorless.png", "champResources/images/512/card_champ_orb.png", "champResources/images/1024/bg_attack_colorless.png", "champResources/images/1024/bg_skill_colorless.png", - "champResources/images/1024/bg_power_colorless.png","champResources/images/1024/card_champ_orb.png"); + "champResources/images/1024/bg_power_colorless.png", "champResources/images/1024/card_champ_orb.png"); } public static void loadJokeCardImage(AbstractCard card, String img) { @@ -215,7 +247,8 @@ public void receiveEditCards() { BaseMod.addDynamicVariable(new SecondDownfallMagic()); try { autoAddCards(); - } catch (URISyntaxException | IllegalAccessException | InstantiationException | NotFoundException | ClassNotFoundException e) { + } catch (URISyntaxException | IllegalAccessException | InstantiationException | NotFoundException | + ClassNotFoundException e) { throw new RuntimeException(e); } } @@ -267,6 +300,155 @@ public void receivePostInitialize() { UIAtlas.addRegion("exhaustIcon", exhaustIcon, 0, 0, exhaustIcon.getWidth(), exhaustIcon.getHeight()); UIAtlas.addRegion("retainIcon", retainIcon, 0, 0, retainIcon.getWidth(), retainIcon.getHeight()); UIAtlas.addRegion("unplayableIcon", unplayableIcon, 0, 0, unplayableIcon.getWidth(), unplayableIcon.getHeight()); + + downfallAchievementGrid = new DownfallAchievementGrid(); + DownfallAchievementUnlocker.setAchievementGrid(downfallAchievementGrid); + } + + @Override + public void receiveStartGame() { + if (!CardCrawlGame.loadingSave) { + DownfallAchievementVariables.resetRunAchievementVariables(); + } + } + + @Override + public void receiveOnBattleStart(AbstractRoom abstractRoom) { + DownfallAchievementVariables.resetBattleAchievementVariables(); + } + + @Override + public void receiveOnPlayerTurnStart() { + DownfallAchievementVariables.resetTurnAchievementVariables(); + } + + @Override + public void receiveCardUsed(AbstractCard abstractCard) { + if (abstractCard.type == AbstractCard.CardType.ATTACK && + AbstractDungeon.player.getPower(VigorPower.POWER_ID) != null && + AbstractDungeon.player.getPower(VigorPower.POWER_ID).amount >= 200) { + DownfallAchievementUnlocker.unlockAchievement("OVER_OVERKILL"); + } + } + + @Override + public void receivePostBattle(AbstractRoom abstractRoom) { + if (abstractRoom instanceof EventRoom) { + AbstractEvent event = ((EventRoom) abstractRoom).event; + if (event instanceof ShapeFactory && DownfallAchievementVariables.threeShapesFought) { + DownfallAchievementUnlocker.unlockAchievement("MECHANICAL_GAUNTLET"); + DownfallAchievementVariables.threeShapesFought = false; + } + } + + if (abstractRoom instanceof MonsterRoomBoss) { + if (AbstractDungeon.player.hasPower(GremlinNobPower.POWER_ID)) { + DownfallAchievementUnlocker.unlockAchievement("OUR_TRUE_FORM"); + } + } + + DownfallAchievementVariables.bountiesCollectedPerm += DownfallAchievementVariables.bountiesCollectedTemp; + } + + @Override + public void receivePostDeath() { + AbstractPlayer p = AbstractDungeon.player; + + // Any wins + if (AbstractDungeon.player.currentHealth > 0 || AbstractDungeon.actNum >= 4) { + + if (p instanceof hermit.characters.hermit) { + DownfallAchievementUnlocker.unlockAchievement("TOPAZ"); + } + if (p instanceof SlimeboundCharacter) { + DownfallAchievementUnlocker.unlockAchievement("JADE"); + } + if (p instanceof GuardianCharacter) { + DownfallAchievementUnlocker.unlockAchievement("CITRINE"); + } + if (p instanceof TheHexaghost) { + DownfallAchievementUnlocker.unlockAchievement("TANZANITE"); + } + if (p instanceof ChampChar) { + DownfallAchievementUnlocker.unlockAchievement("KYANITE"); + } + if (p instanceof AutomatonChar) { + DownfallAchievementUnlocker.unlockAchievement("RUTILE"); + } + if (p instanceof GremlinCharacter) { + DownfallAchievementUnlocker.unlockAchievement("SPINEL"); + } + if (p instanceof TheSnecko) { + DownfallAchievementUnlocker.unlockAchievement("CHRYSOCOLLA"); + if (SneckoMod.pureSneckoMode) { + DownfallAchievementUnlocker.unlockAchievement("UNBOUND"); + } + } + if (p instanceof CollectorChar) { + DownfallAchievementUnlocker.unlockAchievement("MALACHITE"); + if (CollectorCollection.collection.size() >= 20) { + DownfallAchievementUnlocker.unlockAchievement("HOARDER"); + } + } + + // Act 4 wins + if (AbstractDungeon.actNum == 4) { + + if (p instanceof hermit.characters.hermit) { + DownfallAchievementUnlocker.unlockAchievement("TOPAZ+"); + } + if (p instanceof SlimeboundCharacter) { + DownfallAchievementUnlocker.unlockAchievement("JADE+"); + } + if (p instanceof GuardianCharacter) { + DownfallAchievementUnlocker.unlockAchievement("CITRINE+"); + } + if (p instanceof TheHexaghost) { + DownfallAchievementUnlocker.unlockAchievement("TANZANITE+"); + } + if (p instanceof ChampChar) { + DownfallAchievementUnlocker.unlockAchievement("KYANITE+"); + } + if (p instanceof AutomatonChar) { + DownfallAchievementUnlocker.unlockAchievement("RUTILE+"); + } + if (p instanceof GremlinCharacter) { + DownfallAchievementUnlocker.unlockAchievement("SPINEL+"); + } + if (p instanceof TheSnecko) { + DownfallAchievementUnlocker.unlockAchievement("CHRYSOCOLLA+"); + } + if (p instanceof CollectorChar) { + DownfallAchievementUnlocker.unlockAchievement("MALACHITE+"); + } + + // Act 4 wins (Standard) + + if (!evilMode) { + + if (isDownfallCharacter(p)) { + if (!(p instanceof hermit.characters.hermit)) { + DownfallAchievementUnlocker.unlockAchievement("UPRISE"); + } + + } + } + + // Act 4 wins (Downfall) + + if (evilMode) { + + if (p instanceof com.megacrit.cardcrawl.characters.Ironclad || p instanceof TheSilent || + p instanceof com.megacrit.cardcrawl.characters.Defect || p instanceof com.megacrit.cardcrawl.characters.Watcher || + p instanceof hermit.characters.hermit) { + DownfallAchievementUnlocker.unlockAchievement("CORRUPTED"); + } + + } + + } + + } } } diff --git a/src/main/java/expansioncontent/patches/AchievementFloorTransitionPatch.java b/src/main/java/expansioncontent/patches/AchievementFloorTransitionPatch.java new file mode 100644 index 000000000..ceb36d146 --- /dev/null +++ b/src/main/java/expansioncontent/patches/AchievementFloorTransitionPatch.java @@ -0,0 +1,16 @@ +package expansioncontent.patches; + + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import expansioncontent.util.DownfallAchievementVariables; + +@SpirePatch( + clz = AbstractDungeon.class, + method = "nextRoomTransitionStart" +) +public class AchievementFloorTransitionPatch { + public static void Postfix() { + DownfallAchievementVariables.resetFloorAchievementVariables(); + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/patches/CodersBlockPatch.java b/src/main/java/expansioncontent/patches/CodersBlockPatch.java new file mode 100644 index 000000000..0aa283f39 --- /dev/null +++ b/src/main/java/expansioncontent/patches/CodersBlockPatch.java @@ -0,0 +1,25 @@ +package expansioncontent.patches; + +import automaton.AutomatonChar; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; + +@SpirePatch( + clz = AbstractMonster.class, + method = "onBossVictoryLogic" +) +public class CodersBlockPatch { + + @SpirePostfixPatch + public static void Postfix(AbstractMonster __instance) { + if (AbstractDungeon.player instanceof AutomatonChar) { + if (!DownfallAchievementVariables.functionCreated) { + DownfallAchievementUnlocker.unlockAchievement("CODERS_BLOCK"); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/patches/RenderAchievementGrid.java b/src/main/java/expansioncontent/patches/RenderAchievementGrid.java new file mode 100644 index 000000000..73866491f --- /dev/null +++ b/src/main/java/expansioncontent/patches/RenderAchievementGrid.java @@ -0,0 +1,39 @@ +package expansioncontent.patches; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.localization.UIStrings; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; +import expansioncontent.expansionContentMod; +import javassist.CtBehavior; + +import java.util.Iterator; + +@SpirePatch(clz = StatsScreen.class, method = "renderStatScreen") +public class RenderAchievementGrid { + private static UIStrings uiStrings; + + static { + uiStrings = CardCrawlGame.languagePack.getUIString("downfall:AchievementGrid"); + } + + @SpireInsertPatch(locator = Locator.class, localvars = {"renderY"}) + public static void Insert(StatsScreen __instance, SpriteBatch sb, @ByRef float[] renderY) { + renderY[0] += 50.0F * Settings.scale; + + StatsScreen.renderHeader(sb, uiStrings.TEXT[0], 300.0F * Settings.scale, renderY[0]); + expansionContentMod.downfallAchievementGrid.render(sb, renderY[0]); + renderY[0] -= expansionContentMod.downfallAchievementGrid.calculateHeight(); + renderY[0] -= 100.0F * Settings.scale; + } + + private static class Locator extends SpireInsertLocator { + @Override + public int[] Locate(CtBehavior ctMethodToPatch) throws Exception { + Matcher finalMatcher = new Matcher.MethodCallMatcher(Iterator.class, "hasNext"); + return LineFinder.findInOrder(ctMethodToPatch, finalMatcher); + } + } +} diff --git a/src/main/java/expansioncontent/patches/StatsScreenScrollbarPatch.java b/src/main/java/expansioncontent/patches/StatsScreenScrollbarPatch.java new file mode 100644 index 000000000..3da2f8c45 --- /dev/null +++ b/src/main/java/expansioncontent/patches/StatsScreenScrollbarPatch.java @@ -0,0 +1,20 @@ +package expansioncontent.patches; + +import basemod.ReflectionHacks; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch2; +import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; +import expansioncontent.expansionContentMod; + +@SpirePatch2( + clz = StatsScreen.class, + method = "calculateScrollBounds" +) +public class StatsScreenScrollbarPatch { + @SpirePostfixPatch + public static void Postfix(StatsScreen __instance) { + float currentUpperBound = (Float) ReflectionHacks.getPrivate(__instance, StatsScreen.class, "scrollUpperBound"); + float downfallAchievementsHeight = expansionContentMod.downfallAchievementGrid.calculateHeight(); + ReflectionHacks.setPrivate(__instance, StatsScreen.class, "scrollUpperBound", currentUpperBound + (downfallAchievementsHeight + 50F)); + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/patches/UpdateAchievements.java b/src/main/java/expansioncontent/patches/UpdateAchievements.java new file mode 100644 index 000000000..b0bcc5a78 --- /dev/null +++ b/src/main/java/expansioncontent/patches/UpdateAchievements.java @@ -0,0 +1,12 @@ +package expansioncontent.patches; + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; +import expansioncontent.expansionContentMod; + +@SpirePatch(clz = StatsScreen.class, method = "update") +public class UpdateAchievements { + public static void Postfix(StatsScreen __instance) { + expansionContentMod.downfallAchievementGrid.update(); + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/util/DownfallAchievementUnlocker.java b/src/main/java/expansioncontent/util/DownfallAchievementUnlocker.java new file mode 100644 index 000000000..5fab8a499 --- /dev/null +++ b/src/main/java/expansioncontent/util/DownfallAchievementUnlocker.java @@ -0,0 +1,33 @@ +package expansioncontent.util; + +import com.megacrit.cardcrawl.core.Settings; +import downfall.downfallMod; +import expansioncontent.achievements.DownfallAchievementGrid; + +import static com.megacrit.cardcrawl.unlock.UnlockTracker.achievementPref; + +public class DownfallAchievementUnlocker { + private static DownfallAchievementGrid achievementGrid; + + public static void setAchievementGrid(DownfallAchievementGrid grid) { + achievementGrid = grid; + } + + public static void unlockAchievement(String key) { + String fullKey = downfallMod.makeID(key); + if (!Settings.isShowBuild && Settings.isStandardRun()) { + if (!achievementPref.getBoolean(fullKey, false)) { + achievementPref.putBoolean(fullKey, true); + } + + achievementPref.flush(); + + if (achievementGrid != null) { + achievementGrid.updateAchievementStatus(); + if (!key.equals("EVIL_ONE") && achievementGrid.areAllAchievementsUnlockedExceptEvilOne()) { + unlockAchievement("EVIL_ONE"); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/expansioncontent/util/DownfallAchievementVariables.java b/src/main/java/expansioncontent/util/DownfallAchievementVariables.java new file mode 100644 index 000000000..924ddccac --- /dev/null +++ b/src/main/java/expansioncontent/util/DownfallAchievementVariables.java @@ -0,0 +1,41 @@ +package expansioncontent.util; + +public class DownfallAchievementVariables { + public static boolean threeShapesFought = false; + public static boolean functionCreated = false; + public static int slimesEvoked = 0; + public static int gemsSocketed = 0; + public static int cardsReturnedFromStasis = 0; + public static int fullInfernoIgnitions = 0; + public static int councilStrikesRemoved = 0; + public static int councilDefendsRemoved = 0; + public static int enteredUltimateStance = 0; + public static int statusesMutated = 0; + public static int bountiesCollectedTemp = 0; + public static int bountiesCollectedPerm = 0; + + public static void resetRunAchievementVariables() { + bountiesCollectedPerm = 0; + } + + public static void resetBattleAchievementVariables() { + slimesEvoked = 0; + functionCreated = false; + bountiesCollectedTemp = 0; + fullInfernoIgnitions = 0; + } + + public static void resetTurnAchievementVariables() { + cardsReturnedFromStasis = 0; + enteredUltimateStance = 0; + statusesMutated = 0; + } + + public static void resetFloorAchievementVariables() { + threeShapesFought = false; + gemsSocketed = 0; + councilStrikesRemoved = 0; + councilDefendsRemoved = 0; + } + +} diff --git a/src/main/java/gremlin/actions/StealArtifactAction.java b/src/main/java/gremlin/actions/StealArtifactAction.java index 6fe1b8162..a23e58b80 100644 --- a/src/main/java/gremlin/actions/StealArtifactAction.java +++ b/src/main/java/gremlin/actions/StealArtifactAction.java @@ -5,6 +5,7 @@ import com.megacrit.cardcrawl.dungeons.*; import com.megacrit.cardcrawl.actions.common.*; import com.megacrit.cardcrawl.powers.ArtifactPower; +import expansioncontent.util.DownfallAchievementUnlocker; public class StealArtifactAction extends AbstractGameAction { @@ -22,6 +23,11 @@ public void update() { AbstractDungeon.actionManager.addToTop(new ApplyPowerAction(source, source, new ArtifactPower(source, amount), amount)); AbstractDungeon.actionManager.addToTop(new RemoveSpecificPowerAction(target, source, "Artifact")); + + // Check for achievement + if (amount >= 3) { + DownfallAchievementUnlocker.unlockAchievement("PICKPOCKET_100"); + } } this.tickDuration(); } diff --git a/src/main/java/gremlin/powers/AgonyPower.java b/src/main/java/gremlin/powers/AgonyPower.java index d4005cb16..6a43b5516 100644 --- a/src/main/java/gremlin/powers/AgonyPower.java +++ b/src/main/java/gremlin/powers/AgonyPower.java @@ -7,6 +7,7 @@ import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.localization.PowerStrings; +import expansioncontent.util.DownfallAchievementUnlocker; import gremlin.GremlinMod; public class AgonyPower extends AbstractGremlinPower { @@ -59,4 +60,11 @@ public float atDamageGive(float damage, DamageInfo.DamageType type) { return damage; } } + + @Override + public void onInitialApplication() { + if (this.owner.hasPower(CrippledPower.POWER_ID)) { + DownfallAchievementUnlocker.unlockAchievement("GLASS_BONES"); + } + } } diff --git a/src/main/java/gremlin/powers/CrippledPower.java b/src/main/java/gremlin/powers/CrippledPower.java index 992aa9882..3c50e7794 100644 --- a/src/main/java/gremlin/powers/CrippledPower.java +++ b/src/main/java/gremlin/powers/CrippledPower.java @@ -4,13 +4,13 @@ import com.badlogic.gdx.graphics.Texture; import com.evacipated.cardcrawl.mod.stslib.powers.interfaces.HealthBarRenderPower; import com.megacrit.cardcrawl.actions.AbstractGameAction; -import com.megacrit.cardcrawl.actions.unique.PoisonLoseHpAction; import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.localization.PowerStrings; import com.megacrit.cardcrawl.powers.WeakPower; import com.megacrit.cardcrawl.rooms.AbstractRoom; +import expansioncontent.util.DownfallAchievementUnlocker; import gremlin.GremlinMod; public class CrippledPower extends AbstractGremlinPower implements HealthBarRenderPower { @@ -54,6 +54,13 @@ public int getHealthBarAmount() { return 0; } + @Override + public void onInitialApplication() { + if (this.owner.hasPower(AgonyPower.POWER_ID)) { + DownfallAchievementUnlocker.unlockAchievement("GLASS_BONES"); + } + } + @Override public Color getColor() { return Color.YELLOW; diff --git a/src/main/java/guardian/actions/ReturnStasisCardToHandAction.java b/src/main/java/guardian/actions/ReturnStasisCardToHandAction.java index 85cdb8b0c..a468c31e8 100644 --- a/src/main/java/guardian/actions/ReturnStasisCardToHandAction.java +++ b/src/main/java/guardian/actions/ReturnStasisCardToHandAction.java @@ -3,6 +3,8 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import guardian.cards.InStasisCard; @@ -17,6 +19,10 @@ public ReturnStasisCardToHandAction(AbstractCard card) { public void update() { if (!AbstractDungeon.player.hand.contains(this.card)) { AbstractDungeon.player.hand.addToHand(this.card); + DownfallAchievementVariables.cardsReturnedFromStasis++; + if (DownfallAchievementVariables.cardsReturnedFromStasis >= 10) { + DownfallAchievementUnlocker.unlockAchievement("HYPER_ACCELERATION"); + } if (this.card instanceof InStasisCard) { ((InStasisCard) this.card).whenReturnedFromStasis(); } diff --git a/src/main/java/guardian/orbs/StasisOrb.java b/src/main/java/guardian/orbs/StasisOrb.java index 3230d7257..1573a03e9 100644 --- a/src/main/java/guardian/orbs/StasisOrb.java +++ b/src/main/java/guardian/orbs/StasisOrb.java @@ -18,7 +18,6 @@ import guardian.actions.StasisEvokeIfRoomInHandAction; import guardian.cards.AbstractGuardianCard; import guardian.cards.InStasisCard; -import guardian.cards.ChargeUp; import guardian.relics.StasisUpgradeRelic; import guardian.vfx.AddCardToStasisEffect; diff --git a/src/main/java/guardian/powers/DontLeaveDefensiveModePower.java b/src/main/java/guardian/powers/DontLeaveDefensiveModePower.java index 3f89f9bed..079a76bd0 100644 --- a/src/main/java/guardian/powers/DontLeaveDefensiveModePower.java +++ b/src/main/java/guardian/powers/DontLeaveDefensiveModePower.java @@ -3,6 +3,7 @@ import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.core.CardCrawlGame; +import expansioncontent.util.DownfallAchievementUnlocker; public class DontLeaveDefensiveModePower extends AbstractGuardianPower { @@ -25,6 +26,24 @@ public DontLeaveDefensiveModePower(AbstractCreature owner, int amount) { } + @Override + public void stackPower(int stackAmount) { + super.stackPower(stackAmount); + checkAchievement(); + } + + @Override + public void reducePower(int reduceAmount) { + super.reducePower(reduceAmount); + checkAchievement(); + } + + private void checkAchievement() { + if (this.amount >= 5) { + DownfallAchievementUnlocker.unlockAchievement("IMPENETRABLE"); + } + } + public void updateDescription() { if (this.amount == 1) { this.description = DESCRIPTIONS[0]; diff --git a/src/main/java/guardian/vfx/SocketGemEffect.java b/src/main/java/guardian/vfx/SocketGemEffect.java index c456b75e4..460466c60 100644 --- a/src/main/java/guardian/vfx/SocketGemEffect.java +++ b/src/main/java/guardian/vfx/SocketGemEffect.java @@ -16,6 +16,8 @@ import com.megacrit.cardcrawl.vfx.AbstractGameEffect; import com.megacrit.cardcrawl.vfx.UpgradeShineEffect; import com.megacrit.cardcrawl.vfx.cardManip.ShowCardBrieflyEffect; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import guardian.GuardianMod; import guardian.cards.AbstractGuardianCard; @@ -80,6 +82,11 @@ public void update() { ((RestRoom) AbstractDungeon.getCurrRoom()).fadeIn(); GuardianMod.gridScreenForSockets = false; + DownfallAchievementVariables.gemsSocketed++; + if (DownfallAchievementVariables.gemsSocketed >= 8) { + DownfallAchievementUnlocker.unlockAchievement("BEJEWELED"); + } + } AbstractDungeon.gridSelectScreen.selectedCards.clear(); @@ -97,12 +104,9 @@ public void update() { AbstractDungeon.effectsQueue.add(new ShowCardBrieflyEffect(cg.makeStatEquivalentCopy())); ((RestRoom) AbstractDungeon.getCurrRoom()).fadeIn(); GuardianMod.gridScreenForSockets = false; - } AbstractDungeon.gridSelectScreen.selectedCards.clear(); - - } if (this.duration < 1.0F && !this.openedScreen) { diff --git a/src/main/java/hermit/actions/DeadOrAliveActionAction.java b/src/main/java/hermit/actions/DeadOrAliveActionAction.java index b7e564ad2..71043c585 100644 --- a/src/main/java/hermit/actions/DeadOrAliveActionAction.java +++ b/src/main/java/hermit/actions/DeadOrAliveActionAction.java @@ -8,6 +8,8 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.GainPennyEffect; import com.megacrit.cardcrawl.vfx.combat.FlashAtkImgEffect; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; public class DeadOrAliveActionAction extends AbstractGameAction { @@ -36,6 +38,11 @@ public void update() { } AbstractDungeon.player.gainGold(amount); + DownfallAchievementVariables.bountiesCollectedTemp += amount; + + if (DownfallAchievementVariables.bountiesCollectedTemp + DownfallAchievementVariables.bountiesCollectedPerm >= 300) { + DownfallAchievementUnlocker.unlockAchievement("BOUNTY_HUNTER"); + } for (int ii = 0; ii < amount; ++ii) { AbstractDungeon.effectList.add(new GainPennyEffect(this.source, this.target.hb.cX, this.target.hb.cY, this.source.hb.cX, this.source.hb.cY, true)); diff --git a/src/main/java/hermit/cards/AbstractHermitCard.java b/src/main/java/hermit/cards/AbstractHermitCard.java index b148d01b0..064f3e3b8 100644 --- a/src/main/java/hermit/cards/AbstractHermitCard.java +++ b/src/main/java/hermit/cards/AbstractHermitCard.java @@ -16,6 +16,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.relics.AbstractRelic; import com.megacrit.cardcrawl.unlock.UnlockTracker; +import expansioncontent.util.DownfallAchievementUnlocker; import hermit.actions.ComboAction; import hermit.patches.EndOfTurnPatch; import hermit.patches.VigorPatch; @@ -169,6 +170,11 @@ protected boolean onDeadOn() public void TriggerDeadOnEffect(AbstractPlayer p, AbstractMonster m) { + // Check for Longshot achievement. + if (p.hand.size() >= 9 && !p.hasPower(Concentration.POWER_ID)) { + DownfallAchievementUnlocker.unlockAchievement("LONGSHOT"); + } + // Things that happen before Dead On effect. onDeadOn(); diff --git a/src/main/java/hermit/cards/CursedWeapon.java b/src/main/java/hermit/cards/CursedWeapon.java index 7c7600a7d..de871c1e4 100644 --- a/src/main/java/hermit/cards/CursedWeapon.java +++ b/src/main/java/hermit/cards/CursedWeapon.java @@ -10,6 +10,7 @@ import com.megacrit.cardcrawl.localization.CardStrings; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.combat.FlashAtkImgEffect; +import expansioncontent.util.DownfallAchievementUnlocker; import hermit.HermitMod; import hermit.characters.hermit; import hermit.patches.EnumPatch; @@ -37,6 +38,7 @@ public class CursedWeapon extends AbstractDynamicCard { private static final int COST = 1; private static final int DAMAGE = 10; + private static final int ACHIEVEMENT_DAMAGE = 40; // /STAT DECLARATION/ @@ -91,6 +93,10 @@ public void update() public void triggerOnCardPlayed(AbstractCard c) { if (c instanceof CursedWeapon) { baseDamage += ((CursedWeapon)c).defaultSecondMagicNumber; + + if (baseDamage >= ACHIEVEMENT_DAMAGE) { + DownfallAchievementUnlocker.unlockAchievement("WIELDER_OF_WOE"); + } } } diff --git a/src/main/java/saveData/SaveData.java b/src/main/java/saveData/SaveData.java index af2d84586..65f87e0ff 100644 --- a/src/main/java/saveData/SaveData.java +++ b/src/main/java/saveData/SaveData.java @@ -18,6 +18,7 @@ import downfall.patches.ui.campfire.AddBustKeyButtonPatches; import downfall.patches.ui.topPanel.GoldToSoulPatches; import downfall.relics.BrokenWingStatue; +import expansioncontent.util.DownfallAchievementVariables; import javassist.CtBehavior; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -48,6 +49,7 @@ public class SaveData { public static final String VALID_COLORS = "VALID_COLORS"; public static final String PURE_SNECKO_MODE = "PURE_SNECKO_MODE"; public static final String IDENTIFY_RNG_COUNT = "IDENTIFY_RNG_COUNT"; + public static final String BOUNTIES_COLLECTED = "BOUNTIES_COLLECTED"; private static Logger saveLogger = LogManager.getLogger("downfallSaveData"); //data is stored here in addition to the actual location @@ -160,6 +162,7 @@ public static void addCustomSaveData(SaveFile save, HashMap para params.put(VALID_COLORS, saveCacheColors); params.put(PURE_SNECKO_MODE, pureSneckoMode); params.put(IDENTIFY_RNG_COUNT, identifyRngCount); + params.put(BOUNTIES_COLLECTED, DownfallAchievementVariables.bountiesCollectedPerm); } private static class Locator extends SpireInsertLocator { @@ -214,6 +217,7 @@ public static void loadCustomSaveData(String path, Gson gson, String savestr) { pureSneckoMode = data.PURE_SNECKO_MODE; identifyRngCount = data.IDENTIFY_RNG_COUNT; + DownfallAchievementVariables.bountiesCollectedPerm = data.BOUNTIES_COLLECTED; saveLogger.info("Loaded downfall save data successfully."); } catch (Exception e) { @@ -284,6 +288,9 @@ public static void loadSave(AbstractDungeon __instance, SaveFile file) { OffclassHelper.updateAllUnknownReplacements(); + DownfallAchievementVariables.gemsSocketed = 0; + DownfallAchievementVariables.threeShapesFought = false; + saveLogger.info("Save loaded."); //Anything that triggers on load goes here diff --git a/src/main/java/saveData/downfallSaveData.java b/src/main/java/saveData/downfallSaveData.java index ba3989a13..eea9920cf 100644 --- a/src/main/java/saveData/downfallSaveData.java +++ b/src/main/java/saveData/downfallSaveData.java @@ -35,4 +35,5 @@ public class downfallSaveData { public boolean PURE_SNECKO_MODE; public int IDENTIFY_RNG_COUNT; + public int BOUNTIES_COLLECTED; } diff --git a/src/main/java/slimebound/SlimeboundMod.java b/src/main/java/slimebound/SlimeboundMod.java index 3b3834dbc..4d7356273 100644 --- a/src/main/java/slimebound/SlimeboundMod.java +++ b/src/main/java/slimebound/SlimeboundMod.java @@ -13,6 +13,7 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.evacipated.cardcrawl.mod.widepotions.WidePotionsMod; import com.evacipated.cardcrawl.modthespire.Loader; +import com.evacipated.cardcrawl.modthespire.lib.SpireConfig; import com.evacipated.cardcrawl.modthespire.lib.SpireEnum; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.cards.status.Slimed; @@ -35,6 +36,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import slimebound.actions.SlimeSpawnAction; +import slimebound.actions.TriggerSpecificSlimeAttackAction; import slimebound.cards.*; import slimebound.characters.SlimeboundCharacter; import slimebound.events.*; @@ -53,6 +55,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Properties; import static downfall.patches.EvilModeCharacterSelect.evilMode; @@ -70,10 +73,10 @@ public class SlimeboundMod implements OnCardUseSubscriber, //basemod.interfaces.PostDrawSubscriber, basemod.interfaces.OnStartBattleSubscriber { public static final boolean hasHubris; -// public static final String PROP_RELIC_SHARING = "contentSharing_relics"; -// public static final String PROP_POTION_SHARING = "contentSharing_potions"; -// public static final String PROP_EVENT_SHARING = "contentSharing_events"; -// public static final String PROP_UNLOCK_ALL = "unlockEverything"; + public static final String PROP_RELIC_SHARING = "contentSharing_relics"; + public static final String PROP_POTION_SHARING = "contentSharing_potions"; + public static final String PROP_EVENT_SHARING = "contentSharing_events"; + public static final String PROP_UNLOCK_ALL = "unlockEverything"; public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); public static final com.badlogic.gdx.graphics.Color SLIME_COLOR = com.megacrit.cardcrawl.helpers.CardHelper.getColor(25.0F, 95.0F, 25.0F); private static final String SLIMEBOUNDMOD_ASSETS_FOLDER = "slimeboundResources/SlimeboundImages"; @@ -118,11 +121,11 @@ public class SlimeboundMod implements OnCardUseSubscriber, @SpireEnum public static AbstractCard.CardTags TACKLE; -// public static Properties slimeboundDefault = new Properties(); -// public static boolean contentSharing_relics = true; -// public static boolean contentSharing_potions = true; -// public static boolean contentSharing_events = true; -// public static boolean unlockEverything = false; + public static Properties slimeboundDefault = new Properties(); + public static boolean contentSharing_relics = true; + public static boolean contentSharing_potions = true; + public static boolean contentSharing_events = true; + public static boolean unlockEverything = false; public static ArrayList shareableRelics = new ArrayList<>(); public static boolean goopGlow = false; @@ -157,10 +160,10 @@ public SlimeboundMod() { getResourcePath(ATTACK_CARD_PORTRAIT), getResourcePath(SKILL_CARD_PORTRAIT), getResourcePath(POWER_CARD_PORTRAIT), getResourcePath(ENERGY_ORB_PORTRAIT), getResourcePath(CARD_ENERGY_ORB)); -// slimeboundDefault.setProperty(PROP_EVENT_SHARING, "FALSE"); -// slimeboundDefault.setProperty(PROP_RELIC_SHARING, "FALSE"); -// slimeboundDefault.setProperty(PROP_POTION_SHARING, "FALSE"); -// slimeboundDefault.setProperty(PROP_UNLOCK_ALL, "FALSE"); + slimeboundDefault.setProperty(PROP_EVENT_SHARING, "FALSE"); + slimeboundDefault.setProperty(PROP_RELIC_SHARING, "FALSE"); + slimeboundDefault.setProperty(PROP_POTION_SHARING, "FALSE"); + slimeboundDefault.setProperty(PROP_UNLOCK_ALL, "FALSE"); loadConfigData(); @@ -198,32 +201,32 @@ public static void clearData() { } public static void saveData() { -// try { -// SpireConfig config = new SpireConfig("SlimeboundMod", "SlimeboundSaveData", slimeboundDefault); -// config.setBool(PROP_EVENT_SHARING, contentSharing_events); -// config.setBool(PROP_RELIC_SHARING, contentSharing_relics); -// config.setBool(PROP_POTION_SHARING, contentSharing_potions); -// config.setBool(PROP_UNLOCK_ALL, unlockEverything); -// -// config.save(); -// } catch (Exception e) { -// e.printStackTrace(); -// } + try { + SpireConfig config = new SpireConfig("SlimeboundMod", "SlimeboundSaveData", slimeboundDefault); + config.setBool(PROP_EVENT_SHARING, contentSharing_events); + config.setBool(PROP_RELIC_SHARING, contentSharing_relics); + config.setBool(PROP_POTION_SHARING, contentSharing_potions); + config.setBool(PROP_UNLOCK_ALL, unlockEverything); + + config.save(); + } catch (Exception e) { + e.printStackTrace(); + } } public static void loadConfigData() { -// try { -// logger.info("SlimeboundMod | Loading Config Preferences..."); -// SpireConfig config = new SpireConfig("SlimeboundMod", "SlimeboundSaveData", slimeboundDefault); -// config.load(); -// contentSharing_events = config.getBool(PROP_EVENT_SHARING); -// contentSharing_relics = config.getBool(PROP_RELIC_SHARING); -// contentSharing_potions = config.getBool(PROP_POTION_SHARING); -// unlockEverything = config.getBool(PROP_UNLOCK_ALL); -// } catch (Exception e) { -// e.printStackTrace(); -// clearData(); -// } + try { + logger.info("SlimeboundMod | Loading Config Preferences..."); + SpireConfig config = new SpireConfig("SlimeboundMod", "SlimeboundSaveData", slimeboundDefault); + config.load(); + contentSharing_events = config.getBool(PROP_EVENT_SHARING); + contentSharing_relics = config.getBool(PROP_RELIC_SHARING); + contentSharing_potions = config.getBool(PROP_POTION_SHARING); + unlockEverything = config.getBool(PROP_UNLOCK_ALL); + } catch (Exception e) { + e.printStackTrace(); + clearData(); + } } public static void loadJokeCardImage(AbstractCard card, String img) { @@ -296,16 +299,27 @@ public void receivePostDungeonInitialize() { } public static AbstractOrb getLeadingSlime() { - AbstractOrb oldestOrb = null; + AbstractOrb leadingSlime = null; + int leadingSlimeIndex = -1; if (AbstractDungeon.player.maxOrbs > 0) { - for (AbstractOrb o : AbstractDungeon.player.orbs) { + for (int i = 0; i < AbstractDungeon.player.orbs.size(); i++) { + AbstractOrb o = AbstractDungeon.player.orbs.get(i); if (o instanceof SpawnedSlime) { - oldestOrb = o; + leadingSlime = o; + leadingSlimeIndex = i; + // We don't break here because we want to find the last (frontmost) slime } } } - return oldestOrb; + + if (leadingSlime != null) { + // BaseMod.logger.info("Leading Slime found: ID = " + leadingSlime.ID + ", Index = " + leadingSlimeIndex); + } else { + // BaseMod.logger.info("No Leading Slime found"); + } + + return leadingSlime; } @Override @@ -358,12 +372,12 @@ public void receiveEditCards() { BaseMod.addDynamicVariable(new SelfDamageVariable()); BaseMod.addDynamicVariable(new SlimedVariable()); - // BaseMod.addCard(new DivideAndConquerDivide()); - // BaseMod.addCard(new DivideAndConquerConquer()); + // BaseMod.addCard(new DivideAndConquerDivide()); + // BaseMod.addCard(new DivideAndConquerConquer()); BaseMod.addCard(new DivideAndConquer()); - // BaseMod.addCard(new ServeAndProtectProtect()); - // BaseMod.addCard(new ServeAndProtectServe()); + // BaseMod.addCard(new ServeAndProtectProtect()); + // BaseMod.addCard(new ServeAndProtectServe()); BaseMod.addCard(new ServeAndProtect()); BaseMod.addCard(new slimebound.cards.Defend_Slimebound()); @@ -374,9 +388,9 @@ public void receiveEditCards() { BaseMod.addCard(new SplitAcid()); BaseMod.addCard(new SplitLeeching()); BaseMod.addCard(new SplitLicking()); - BaseMod.addCard(new ProtectTheBoss()); + // BaseMod.addCard(new ProtectTheBoss()); //BaseMod.addCard(new slimebound.cards.zzzAbsorbAll()); - BaseMod.addCard(new Overexert()); + // BaseMod.addCard(new Overexert()); BaseMod.addCard(new Split()); //BaseMod.addCard(new SuperSplit()); BaseMod.addCard(new LeadByExample()); @@ -392,6 +406,9 @@ public void receiveEditCards() { BaseMod.addCard(new MassRepurpose()); BaseMod.addCard(new DouseInSlime()); BaseMod.addCard(new Chomp()); + BaseMod.addCard(new AfterDinnerTackle()); + BaseMod.addCard(new PainToPower()); + BaseMod.addCard(new BlockAndTackle()); BaseMod.addCard(new BestDefense()); BaseMod.addCard(new OozeBath()); //BaseMod.addCard(new zzzSoTasty()); @@ -417,12 +434,13 @@ public void receiveEditCards() { BaseMod.addCard(new slimebound.cards.AcidTongue()); //BaseMod.addCard(new slimebound.cards.TendrilStrike()); //BaseMod.addCard(new slimebound.cards.PoisonLick()); - BaseMod.addCard(new slimebound.cards.WasteNot()); + // BaseMod.addCard(new slimebound.cards.WasteNot()); BaseMod.addCard(new HungryTackle()); + BaseMod.addCard(new SplitGeneral()); BaseMod.addCard(new slimebound.cards.FlameTackle()); BaseMod.addCard(new RollThrough()); BaseMod.addCard(new ComboTackle()); - BaseMod.addCard(new GoopTackle()); + //BaseMod.addCard(new GoopTackle()); //BaseMod.addCard(new VenomTackle()); BaseMod.addCard(new slimebound.cards.Grow()); BaseMod.addCard(new slimebound.cards.Prepare()); @@ -443,16 +461,17 @@ public void receiveEditCards() { BaseMod.addCard(new slimebound.cards.Tackle()); //BaseMod.addCard(new zzzSlimepotheosis()); - BaseMod.addCard(new slimebound.cards.FinishingTackle()); - BaseMod.addCard(new FirmFortitude()); + // BaseMod.addCard(new slimebound.cards.FinishingTackle()); + // BaseMod.addCard(new FirmFortitude()); BaseMod.addCard(new Replication()); BaseMod.addCard(new CheckThePlaybook()); BaseMod.addCard(new Repurpose()); BaseMod.addCard(new GrowthPunch()); - BaseMod.addCard(new slimebound.cards.Recycling()); + //BaseMod.addCard(new slimebound.cards.Recycling()); BaseMod.addCard(new slimebound.cards.Recollect()); BaseMod.addCard(new SplitSpecialist()); + BaseMod.addCard(new BackupTackle()); BaseMod.addCard(new Darklings()); BaseMod.addCard(new Schlurp()); BaseMod.addCard(new SlimeSlap()); @@ -598,10 +617,10 @@ public void receivePostInitialize() { public void addPotions() { + BaseMod.addPotion(ThreeZeroPotion.class, Color.FOREST, Color.BLACK, Color.BLACK, ThreeZeroPotion.POTION_ID); BaseMod.addPotion(SlimedPotion.class, Color.PURPLE, Color.PURPLE, Color.MAROON, SlimedPotion.POTION_ID, SlimeboundEnum.SLIMEBOUND); BaseMod.addPotion(SpawnSlimePotion.class, Color.GREEN, Color.FOREST, Color.BLACK, SpawnSlimePotion.POTION_ID, SlimeboundEnum.SLIMEBOUND); BaseMod.addPotion(SlimyTonguePotion.class, Color.PURPLE, Color.PURPLE, Color.MAROON, SlimyTonguePotion.POTION_ID, SlimeboundEnum.SLIMEBOUND); - // BanSharedContentPatch.registerRunLockedPotion(SlimeboundEnum.SLIMEBOUND, ThreeZeroPotion.POTION_ID); if (Loader.isModLoaded("widepotions")) { WidePotionsMod.whitelistSimplePotion(ThreeZeroPotion.POTION_ID); @@ -613,11 +632,24 @@ public void addPotions() { public void receiveCardUsed(AbstractCard c) { - if (c.type == AbstractCard.CardType.ATTACK) { ++attacksPlayedThisTurn; } + // Check if the card is a Tackle + if (c.hasTag(SlimeboundMod.TACKLE)) { + // Get the player + AbstractPlayer p = AbstractDungeon.player; + + // Iterate through all orbs + for (AbstractOrb orb : p.orbs) { + // Check if the orb is a RecklessSlime + if (orb instanceof RecklessSlime) { + // Trigger the RecklessSlime's attack + AbstractDungeon.actionManager.addToBottom(new TriggerSpecificSlimeAttackAction((SpawnedSlime)orb)); + } + } + } } @@ -699,4 +731,4 @@ public void receivePowersModified() { } } } -} +} \ No newline at end of file diff --git a/src/main/java/slimebound/actions/CommandAction.java b/src/main/java/slimebound/actions/CommandAction.java index 529be30c3..753d7bce3 100644 --- a/src/main/java/slimebound/actions/CommandAction.java +++ b/src/main/java/slimebound/actions/CommandAction.java @@ -1,11 +1,8 @@ package slimebound.actions; import com.megacrit.cardcrawl.actions.AbstractGameAction; -import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.SlimeboundMod; -import slimebound.orbs.SpawnedSlime; -import slimebound.powers.BuffSecondarySlimeEffectsPower; public class CommandAction extends AbstractGameAction { @@ -13,9 +10,8 @@ public void update() { isDone = true; AbstractOrb oldestOrb = SlimeboundMod.getLeadingSlime(); if (oldestOrb != null) { - addToTop(new TrigggerSpecificSlimeAttackAction(oldestOrb)); + addToTop(new TriggerSpecificSlimeAttackAction(oldestOrb)); } } } - diff --git a/src/main/java/slimebound/actions/CommandRandomSlimesAction.java b/src/main/java/slimebound/actions/CommandRandomSlimesAction.java new file mode 100644 index 000000000..10795aaf6 --- /dev/null +++ b/src/main/java/slimebound/actions/CommandRandomSlimesAction.java @@ -0,0 +1,47 @@ +package slimebound.actions; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import slimebound.orbs.GeneralSlime; +import slimebound.orbs.SpawnedSlime; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Random; + +public class CommandRandomSlimesAction extends AbstractGameAction { + private int numberOfSlimesToCommand; + + public CommandRandomSlimesAction(int numberOfSlimes) { + this.actionType = ActionType.SPECIAL; + this.duration = Settings.ACTION_DUR_FAST; + this.numberOfSlimesToCommand = numberOfSlimes; + } + + @Override + public void update() { + if (this.duration == Settings.ACTION_DUR_FAST) { + ArrayList commandableSlimes = new ArrayList<>(); + + for (AbstractOrb orb : AbstractDungeon.player.orbs) { + if (orb instanceof SpawnedSlime && !(orb instanceof GeneralSlime)) { + commandableSlimes.add(orb); + } + } + + if (commandableSlimes.size() > 0) { + int slimesToCommand = Math.min(this.numberOfSlimesToCommand, commandableSlimes.size()); + Collections.shuffle(commandableSlimes, new Random(AbstractDungeon.miscRng.randomLong())); + + for (int i = 0; i < slimesToCommand; i++) { + AbstractOrb slimeToCommand = commandableSlimes.get(i); + AbstractDungeon.actionManager.addToTop(new TriggerSpecificSlimeAttackAction((SpawnedSlime)slimeToCommand)); + } + } + } + + this.tickDuration(); + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/actions/MassFeedAction.java b/src/main/java/slimebound/actions/MassFeedAction.java index 120d67c9e..6cc4f0743 100644 --- a/src/main/java/slimebound/actions/MassFeedAction.java +++ b/src/main/java/slimebound/actions/MassFeedAction.java @@ -9,11 +9,13 @@ import com.megacrit.cardcrawl.powers.AbstractPower; import com.megacrit.cardcrawl.vfx.combat.BiteEffect; import com.megacrit.cardcrawl.vfx.combat.FlashAtkImgEffect; +import expansioncontent.util.DownfallAchievementUnlocker; public class MassFeedAction extends AbstractGameAction { public int[] damage; private int increaseHpAmount; + private int killCount; public MassFeedAction(AbstractCreature source, int[] amount, DamageInfo.DamageType type, AbstractGameAction.AttackEffect effect, int increaseHpAmount) { @@ -23,6 +25,7 @@ public MassFeedAction(AbstractCreature source, int[] amount, DamageInfo.DamageTy this.damageType = type; this.attackEffect = effect; this.increaseHpAmount = increaseHpAmount; + this.killCount = 0; } public void update() { @@ -63,9 +66,15 @@ public void update() { if (((target.isDying) || (target.currentHealth <= 0)) && (!target.halfDead) && (!target.hasPower("Minion"))) { AbstractDungeon.player.increaseMaxHp(this.increaseHpAmount, false); + killCount++; } } } + + if (killCount >= 3) { + DownfallAchievementUnlocker.unlockAchievement("GORGED"); + } + if (AbstractDungeon.getCurrRoom().monsters.areMonstersBasicallyDead()) { AbstractDungeon.actionManager.clearPostCombatActions(); } diff --git a/src/main/java/slimebound/actions/RotateAction.java b/src/main/java/slimebound/actions/RotateAction.java new file mode 100644 index 000000000..2de37f880 --- /dev/null +++ b/src/main/java/slimebound/actions/RotateAction.java @@ -0,0 +1,118 @@ +package slimebound.actions; + + +import basemod.BaseMod; +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import com.megacrit.cardcrawl.orbs.EmptyOrbSlot; +import slimebound.orbs.SpawnedSlime; + +public class RotateAction extends AbstractGameAction { + private boolean rotateSpecificSlime; + private Class slimeClass; + + public RotateAction() { + this.rotateSpecificSlime = false; + } + + public RotateAction(Class slimeClass) { + this.rotateSpecificSlime = true; + this.slimeClass = slimeClass; + } + + + @Override + public void update() { + AbstractPlayer p = AbstractDungeon.player; + + if (p.orbs.isEmpty() || p.maxOrbs == 0) { + this.isDone = true; + return; + } + + // Log the frontmost orb ID before rotation + logFrontmostOrbId(p, "Before rotation"); + + if (rotateSpecificSlime) { + rotateSpecificSlime(p); + } else { + rotateAllOrbs(p); + } + + // Log the frontmost orb ID after rotation + logFrontmostOrbId(p, "After rotation"); + + this.isDone = true; + } + + private void rotateAllOrbs(AbstractPlayer p) { + int lastNonEmptyIndex = p.orbs.size() - 1; + while (lastNonEmptyIndex >= 0 && p.orbs.get(lastNonEmptyIndex) instanceof EmptyOrbSlot) { + lastNonEmptyIndex--; + } + + if (lastNonEmptyIndex < 0) { + // All orbs are empty, nothing to rotate + return; + } + + AbstractOrb orbToMove = p.orbs.get(lastNonEmptyIndex); + p.orbs.remove(lastNonEmptyIndex); + + int firstNonEmptyIndex = 0; + while (firstNonEmptyIndex < p.orbs.size() && p.orbs.get(firstNonEmptyIndex) instanceof EmptyOrbSlot) { + firstNonEmptyIndex++; + } + + p.orbs.add(firstNonEmptyIndex, orbToMove); + + for (int i = 0; i < p.orbs.size(); i++) { + p.orbs.get(i).setSlot(i, p.maxOrbs); + } + } + + private void rotateSpecificSlime(AbstractPlayer p) { + int slimeIndex = -1; + int frontmostOccupiedSlot = -1; + + // Find the index of the specific slime type and the frontmost occupied slot + for (int i = p.orbs.size() - 1; i >= 0; i--) { + if (!(p.orbs.get(i) instanceof EmptyOrbSlot)) { + if (frontmostOccupiedSlot == -1) { + frontmostOccupiedSlot = i; + } + if (p.orbs.get(i).getClass() == slimeClass) { + slimeIndex = i; + break; + } + } + } + + // If the slime is not present or already at the frontmost occupied slot, do nothing + if (slimeIndex == -1 || slimeIndex == frontmostOccupiedSlot) { + return; + } + + // Remove the slime from its current position + AbstractOrb slimeOrb = p.orbs.remove(slimeIndex); + + // Add the slime to the frontmost occupied slot + p.orbs.add(frontmostOccupiedSlot, slimeOrb); + + // Adjust the positions of all orbs + for (int i = 0; i < p.orbs.size(); i++) { + p.orbs.get(i).setSlot(i, p.maxOrbs); + } + } + private void logFrontmostOrbId(AbstractPlayer p, String phase) { + for (int i = p.orbs.size() - 1; i >= 0; i--) { + if (!(p.orbs.get(i) instanceof EmptyOrbSlot)) { + BaseMod.logger.info(phase + ": Frontmost orb ID is " + p.orbs.get(i).ID + " at index " + i); + return; + } + } + BaseMod.logger.info(phase + ": No non-empty orbs found"); + } +} diff --git a/src/main/java/slimebound/actions/SlimeApplyDebuff.java b/src/main/java/slimebound/actions/SlimeApplyDebuff.java new file mode 100644 index 000000000..5cde2bd32 --- /dev/null +++ b/src/main/java/slimebound/actions/SlimeApplyDebuff.java @@ -0,0 +1,65 @@ +package slimebound.actions; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.animations.VFXAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; +import slimebound.orbs.SpawnedSlime; +import slimebound.powers.SlimedPower; +import slimebound.vfx.SlimeIntentEffect; + +public class SlimeApplyDebuff extends AbstractGameAction { + private static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + private AbstractCreature owner; + private int debuffAmount; + private SpawnedSlime slime; + + public SlimeApplyDebuff(AbstractCreature player, int debuffAmount, SpawnedSlime slime) { + this.owner = player; + this.actionType = ActionType.DEBUFF; + this.duration = 0.1F; + this.debuffAmount = debuffAmount; + this.slime = slime; + } + + public void update() { + if (AbstractDungeon.getCurrRoom().monsters.areMonstersBasicallyDead()) { + AbstractDungeon.actionManager.clearPostCombatActions(); + this.isDone = true; + return; + } + + if (this.duration == 0.1F) { + logger.info("Slime applying debuff"); + + AbstractMonster targetMonster = AbstractDungeon.getMonsters().getRandomMonster(null, true, AbstractDungeon.cardRandomRng); + + if (targetMonster != null) { + AbstractDungeon.actionManager.addToTop(new ApplyPowerAction(targetMonster, this.owner, new SlimedPower(targetMonster, this.owner, this.debuffAmount), this.debuffAmount)); + } + + float speedTime = 0.2F / (float)AbstractDungeon.player.orbs.size(); + if (Settings.FAST_MODE) { + speedTime = 0.0F; + } + + AbstractDungeon.actionManager.addToTop(new VFXAction(new SlimeIntentEffect(slime.intentImage, slime, speedTime), speedTime)); + + if (slime.movesToAttack) { + slime.useFastAttackAnimation(); + } + } + + tickDuration(); + + if (this.isDone) { + logger.info("Slime debuff application complete"); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/actions/SlimeGainBlock.java b/src/main/java/slimebound/actions/SlimeGainBlock.java new file mode 100644 index 000000000..b1699982d --- /dev/null +++ b/src/main/java/slimebound/actions/SlimeGainBlock.java @@ -0,0 +1,59 @@ +package slimebound.actions; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.animations.VFXAction; +import com.megacrit.cardcrawl.actions.common.GainBlockAction; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; +import slimebound.orbs.SpawnedSlime; +import slimebound.vfx.SlimeIntentEffect; + +public class SlimeGainBlock extends AbstractGameAction { + private static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + private AbstractCreature owner; + private int blockAmount; + private SpawnedSlime slime; + + public SlimeGainBlock(AbstractCreature player, int blockAmount, SpawnedSlime slime) { + this.owner = player; + this.actionType = ActionType.BLOCK; + this.duration = 0.1F; + this.blockAmount = blockAmount; + this.slime = slime; + } + + public void update() { + if (AbstractDungeon.getCurrRoom().monsters.areMonstersBasicallyDead()) { + AbstractDungeon.actionManager.clearPostCombatActions(); + this.isDone = true; + return; + } + + if (this.duration == 0.1F) { + logger.info("Slime gaining block"); + + AbstractDungeon.actionManager.addToTop(new GainBlockAction(this.owner, this.owner, this.blockAmount)); + + float speedTime = 0.2F / (float)AbstractDungeon.player.orbs.size(); + if (Settings.FAST_MODE) { + speedTime = 0.0F; + } + + AbstractDungeon.actionManager.addToTop(new VFXAction(new SlimeIntentEffect(slime.intentImage, slime, speedTime), speedTime)); + + if (slime.movesToAttack) { + slime.useFastAttackAnimation(); + } + } + + tickDuration(); + + if (this.isDone) { + logger.info("Slime block gain complete"); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/actions/SlimeSpawnAction.java b/src/main/java/slimebound/actions/SlimeSpawnAction.java index a223ea820..eaec75ab5 100644 --- a/src/main/java/slimebound/actions/SlimeSpawnAction.java +++ b/src/main/java/slimebound/actions/SlimeSpawnAction.java @@ -65,70 +65,28 @@ public void update() { if (AbstractDungeon.player.maxOrbs > 0 || (AbstractDungeon.player.masterMaxOrbs == 0 && AbstractDungeon.player.maxOrbs == 0)) { int currentHealth = AbstractDungeon.player.currentHealth; - - /* - int maxFortitudes = 0; - if (AbstractDungeon.player.hasPower("FirmFortitudePower")) - maxFortitudes = AbstractDungeon.player.getPower("FirmFortitudePower").amount; - if (AbstractDungeon.player.hasPower("Buffer")) - maxFortitudes = maxFortitudes + AbstractDungeon.player.getPower("Buffer").amount; - - - int usedFortitudes = 0; - */ - -/* - if (SelfDamage) { - - if (currentAmount >= currentHealth) { - AbstractDungeon.effectList.add(new SpeechBubble(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, 1.0F, "Need... health...", true)); - this.isDone = true; - return; - } - if (currentAmount > 0) { - ////SlimeboundMod.logger.info("Losing HP" + this.currentAmount); - - - if (AbstractDungeon.player.chosenClass == SlimeboundEnum.SLIMEBOUND) { - SlimeboundMod.disabledStrikeVFX = true; - } - ////SlimeboundMod.logger.info("No buffer, proceeding"); - - - //AbstractDungeon.player.damageFlash = true; - //AbstractDungeon.player.damageFlashFrames = 4; - - ////SlimeboundMod.logger.info("Reducing max HP"); - int MaxHPActuallyLost = 4; - if (AbstractDungeon.player.hasRelic(TarBlob.ID)) { - MaxHPActuallyLost++; - MaxHPActuallyLost++; - } - if (AbstractDungeon.player.maxHealth <= MaxHPActuallyLost) { - MaxHPActuallyLost = AbstractDungeon.player.maxHealth - 1; + if (this.orbType != null) { + // Check if the player already has this type of Slime + boolean slimeExists = false; + AbstractOrb existingSlime = null; + for (AbstractOrb orb : AbstractDungeon.player.orbs) { + if (orb.getClass().equals(this.orbType.getClass())) { + slimeExists = true; + existingSlime = orb; + break; } - - if (MaxHPActuallyLost > 0) - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new DuplicatedFormNoHealPower(AbstractDungeon.player, AbstractDungeon.player, MaxHPActuallyLost), MaxHPActuallyLost)); - } - } - */ - // AbstractDungeon.effectsQueue.add(new SlimeDripsEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, 0)); - - ////SlimeboundMod.logger.info("Channeling slime orb"); - if (this.orbType == null) { - - //OLD RANDOM, NOW UNUSED, CLEAN UP LATER - - } else { - - if (this.bonusUniqueFocus > 0) { - ((SpawnedSlime) this.orbType).applyUniqueFocus(bonusUniqueFocus); + if (slimeExists && existingSlime instanceof SpawnedSlime) { + // Upgrade existing Slime + ((SpawnedSlime) existingSlime).upgrade(); + } else { + // Spawn new Slime as before + if (this.bonusUniqueFocus > 0) { + ((SpawnedSlime) this.orbType).applyUniqueFocus(bonusUniqueFocus); + } + AbstractDungeon.player.channelOrb(this.orbType); } - - AbstractDungeon.player.channelOrb(this.orbType); for (AbstractCard q : AbstractDungeon.player.exhaustPile.group) { if (q instanceof OneTwoCombo) { ((OneTwoCombo) q).onSplit(); diff --git a/src/main/java/slimebound/actions/TriggerSlimeAttacksAction.java b/src/main/java/slimebound/actions/TriggerSlimeAttacksAction.java index 69bf1ca23..8a1e8f5fe 100644 --- a/src/main/java/slimebound/actions/TriggerSlimeAttacksAction.java +++ b/src/main/java/slimebound/actions/TriggerSlimeAttacksAction.java @@ -36,4 +36,3 @@ public void update() { } - diff --git a/src/main/java/slimebound/actions/TrigggerSpecificSlimeAttackAction.java b/src/main/java/slimebound/actions/TriggerSpecificSlimeAttackAction.java similarity index 82% rename from src/main/java/slimebound/actions/TrigggerSpecificSlimeAttackAction.java rename to src/main/java/slimebound/actions/TriggerSpecificSlimeAttackAction.java index 0e3645031..e71293d86 100644 --- a/src/main/java/slimebound/actions/TrigggerSpecificSlimeAttackAction.java +++ b/src/main/java/slimebound/actions/TriggerSpecificSlimeAttackAction.java @@ -7,11 +7,11 @@ import slimebound.orbs.DarklingSlime; -public class TrigggerSpecificSlimeAttackAction extends AbstractGameAction { +public class TriggerSpecificSlimeAttackAction extends AbstractGameAction { public boolean upgradeCard; public AbstractOrb o; - public TrigggerSpecificSlimeAttackAction(AbstractOrb o) { + public TriggerSpecificSlimeAttackAction(AbstractOrb o) { this.o = o; diff --git a/src/main/java/slimebound/cards/AbstractSlimeboundCard.java b/src/main/java/slimebound/cards/AbstractSlimeboundCard.java index d57d3357b..f97acc9a1 100644 --- a/src/main/java/slimebound/cards/AbstractSlimeboundCard.java +++ b/src/main/java/slimebound/cards/AbstractSlimeboundCard.java @@ -6,13 +6,11 @@ import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.helpers.ImageMaster; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.unlock.UnlockTracker; import hermit.util.TextureLoader; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; -import slimebound.actions.TrigggerSpecificSlimeAttackAction; import slimebound.powers.*; import slimebound.relics.SelfDamagePreventRelic; diff --git a/src/main/java/slimebound/cards/AfterDinnerTackle.java b/src/main/java/slimebound/cards/AfterDinnerTackle.java new file mode 100644 index 000000000..bf3b31946 --- /dev/null +++ b/src/main/java/slimebound/cards/AfterDinnerTackle.java @@ -0,0 +1,64 @@ +package slimebound.cards; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.common.DamageAction; +import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.localization.CardStrings; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; +import slimebound.SlimeboundMod; +import slimebound.actions.ExhaustToHandDirectlyAction; +import slimebound.patches.AbstractCardEnum; +import slimebound.powers.PreventTackleDamagePower; + +public class AfterDinnerTackle extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:AfterDinnerTackle"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/afterdinnertackle.png"; + private static final CardType TYPE = CardType.ATTACK; + private static final CardRarity RARITY = CardRarity.COMMON; + private static final CardTarget TARGET = CardTarget.ENEMY; + private static final CardStrings cardStrings; + private static final int COST = 0; + public static String UPGRADED_DESCRIPTION; + + static { + cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); + NAME = cardStrings.NAME; + DESCRIPTION = cardStrings.DESCRIPTION; + UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; + + } + + public AfterDinnerTackle() { + + super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); + tags.add(SlimeboundMod.TACKLE); + this.baseDamage = 9; + magicNumber = this.baseMagicNumber = 3; + SlimeboundMod.loadJokeCardImage(this, "Tackle.png"); + } + + public void onConsume() { + addToBot(new ExhaustToHandDirectlyAction(this)); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, magicNumber), magicNumber, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + } + + public void upgrade() { + if (!this.upgraded) { + upgradeName(); + upgradeDamage(3); + } + } +} + diff --git a/src/main/java/slimebound/cards/BackupTackle.java b/src/main/java/slimebound/cards/BackupTackle.java new file mode 100644 index 000000000..0638006ad --- /dev/null +++ b/src/main/java/slimebound/cards/BackupTackle.java @@ -0,0 +1,63 @@ +package slimebound.cards; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.common.DamageAction; +import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.localization.CardStrings; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; +import slimebound.SlimeboundMod; +import slimebound.actions.SlimeSpawnAction; +import slimebound.orbs.RecklessSlime; +import slimebound.patches.AbstractCardEnum; +import slimebound.powers.PreventTackleDamagePower; + +public class BackupTackle extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:BackupTackle"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/backuptackle.png"; + private static final CardType TYPE = CardType.ATTACK; + private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardTarget TARGET = CardTarget.ENEMY; + private static final CardStrings cardStrings; + private static final int COST = 0; + public static String UPGRADED_DESCRIPTION; + + static { + cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); + NAME = cardStrings.NAME; + DESCRIPTION = cardStrings.DESCRIPTION; + UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; + } + + public BackupTackle() { + super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); + tags.add(SlimeboundMod.TACKLE); + this.baseDamage = 9; + magicNumber = this.baseMagicNumber = 3; + SlimeboundMod.loadJokeCardImage(this, "BackupTackle.png"); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + + if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) { + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, magicNumber), magicNumber, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + } + + int bonus = 0; + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new RecklessSlime(), false, true, 0, bonus)); + } + + public void upgrade() { + if (!this.upgraded) { + upgradeName(); + upgradeDamage(3); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/BestDefense.java b/src/main/java/slimebound/cards/BestDefense.java index 5b45f2f90..735047212 100644 --- a/src/main/java/slimebound/cards/BestDefense.java +++ b/src/main/java/slimebound/cards/BestDefense.java @@ -12,6 +12,8 @@ import slimebound.patches.AbstractCardEnum; import slimebound.powers.TackleBuffPower; import slimebound.powers.TackleModifyDamagePower; +import sneckomod.SneckoMod; + public class BestDefense extends AbstractSlimeboundCard { public static final String ID = "Slimebound:BestDefense"; @@ -24,7 +26,7 @@ public class BestDefense extends AbstractSlimeboundCard { private static final CardTarget TARGET = CardTarget.SELF; private static final int COST = 1; public static String UPGRADED_DESCRIPTION; - //Reckless + static { cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); NAME = cardStrings.NAME; @@ -34,15 +36,14 @@ public class BestDefense extends AbstractSlimeboundCard { public BestDefense() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.magicNumber = this.baseMagicNumber = 7; + this.magicNumber = this.baseMagicNumber = 6; SlimeboundMod.loadJokeCardImage(this, "BestDefense.png"); - // this.tags.add(SneckoMod.BANNEDFORSNECKO); + // this.tags.add(SneckoMod.BANNEDFORSNECKO); } public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new TackleBuffPower(p, p, this.magicNumber), this.magicNumber)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new TackleModifyDamagePower(p, p, 1), 1)); } @@ -53,8 +54,9 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeMagicNumber(4); + upgradeMagicNumber(3); + + } } } - diff --git a/src/main/java/slimebound/cards/BlockAndTackle.java b/src/main/java/slimebound/cards/BlockAndTackle.java new file mode 100644 index 000000000..bc0446b01 --- /dev/null +++ b/src/main/java/slimebound/cards/BlockAndTackle.java @@ -0,0 +1,66 @@ +package slimebound.cards; + +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.common.DamageAction; +import com.megacrit.cardcrawl.actions.common.GainBlockAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.localization.CardStrings; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; +import slimebound.SlimeboundMod; +import slimebound.patches.AbstractCardEnum; +import slimebound.powers.PreventTackleDamagePower; + +public class BlockAndTackle extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:BlockAndTackle"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/dodgeandtackle.png"; + private static final CardType TYPE = CardType.ATTACK; + private static final CardRarity RARITY = CardRarity.COMMON; + private static final CardTarget TARGET = CardTarget.ENEMY; + private static final CardStrings cardStrings; + private static final int COST = 0; + public static String UPGRADED_DESCRIPTION; + + static { + cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); + NAME = cardStrings.NAME; + DESCRIPTION = cardStrings.DESCRIPTION; + UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; + } + + public BlockAndTackle() { + super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); + tags.add(SlimeboundMod.TACKLE); + this.baseDamage = 5; + this.baseBlock = 5; + this.magicNumber = this.baseMagicNumber = 3; + SlimeboundMod.loadJokeCardImage(this, "BlockAndTackle.png"); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + addToBot(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + addToBot(new GainBlockAction(p, p, this.block)); + if (!p.hasPower(PreventTackleDamagePower.POWER_ID)) { + addToBot(new ApplyPowerAction(p, p, new Bruise(p, this.magicNumber), this.magicNumber, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + } + } + + public void upgrade() { + if (!this.upgraded) { + upgradeName(); + upgradeDamage(2); + upgradeBlock(2); + initializeDescription(); + } + } + + public AbstractCard makeCopy() { + return new BlockAndTackle(); + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/CheckThePlaybook.java b/src/main/java/slimebound/cards/CheckThePlaybook.java index d7403abfd..5a2bbc25a 100644 --- a/src/main/java/slimebound/cards/CheckThePlaybook.java +++ b/src/main/java/slimebound/cards/CheckThePlaybook.java @@ -27,7 +27,7 @@ public class CheckThePlaybook extends AbstractSlimeboundCard { private static final CardType TYPE = CardType.SKILL; private static final CardRarity RARITY = CardRarity.RARE; private static final CardTarget TARGET = CardTarget.SELF; - private static final int COST = 2; + private static final int COST = 1; public static String UPGRADED_DESCRIPTION; static { @@ -63,32 +63,9 @@ public void use(AbstractPlayer p, AbstractMonster m) { AbstractCard cTackle = CardLibrary.cards.get(tmp.get(AbstractDungeon.cardRng.random(0, tmp.size() - 1))); cTackle = cTackle.makeCopy(); - cTackle.modifyCostForCombat(-1); AbstractDungeon.actionManager.addToBottom(new MakeTempCardInHandAction(cTackle)); } - /* FILL version - - int space = BaseMod.MAX_HAND_SIZE - p.hand.size(); - - if (space > 0) { - for (int i = 0; i <= space; i++) { - while (var3.hasNext()) { - Map.Entry c = (Map.Entry) var3.next(); - if (c.getValue().hasTag(SlimeboundMod.TACKLE)) { - tmp.add(c.getKey()); - - } - } - - AbstractCard cTackle = CardLibrary.cards.get(tmp.get(AbstractDungeon.cardRng.random(0, tmp.size() - 1))); - cTackle = cTackle.makeCopy(); - cTackle.modifyCostForCombat(-1); - AbstractDungeon.actionManager.addToBottom(new MakeTempCardInHandAction(cTackle)); - - } - } - */ } @@ -99,7 +76,7 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeBaseCost(1); + upgradeBaseCost(0); } diff --git a/src/main/java/slimebound/cards/Chomp.java b/src/main/java/slimebound/cards/Chomp.java index d4a977129..6e3fc00bb 100644 --- a/src/main/java/slimebound/cards/Chomp.java +++ b/src/main/java/slimebound/cards/Chomp.java @@ -15,7 +15,10 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.combat.BiteEffect; import slimebound.SlimeboundMod; +import slimebound.actions.CommandAction; +import slimebound.actions.SlimeSpawnAction; import slimebound.patches.AbstractCardEnum; +import slimebound.powers.SlimedPower; import java.util.ArrayList; @@ -61,33 +64,15 @@ public Chomp() { } public void use(AbstractPlayer p, AbstractMonster m) { - +int bonus = 0; AbstractDungeon.actionManager.addToBottom(new VFXAction(new BiteEffect(m.hb.cX, m.hb.cY, Color.GREEN), 0.2F)); AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new com.megacrit.cardcrawl.cards.DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.NONE)); - addToBot(new AbstractGameAction() { - @Override - public void update() { - isDone = true; - ArrayList tackleList = new ArrayList<>(); - for (AbstractCard q : AbstractDungeon.player.hand.group) { - if (q.hasTag(SlimeboundMod.TACKLE) && q.costForTurn > 0) { - tackleList.add(q); - } - } - if (!tackleList.isEmpty()) { - if (upgraded){ - tackleList.get(AbstractDungeon.cardRandomRng.random(tackleList.size() - 1)).modifyCostForCombat(-9); - - - } else { - addToTop(new ReduceCostForTurnAction(tackleList.get(AbstractDungeon.cardRandomRng.random(tackleList.size() - 1)), 9)); - } - } - } - }); + if (upgraded || m.hasPower(SlimedPower.POWER_ID)) { + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.HungrySlime(), false, true, bonus, 0)); + } } public AbstractCard makeCopy() { diff --git a/src/main/java/slimebound/cards/ComboTackle.java b/src/main/java/slimebound/cards/ComboTackle.java index 7cc195ef0..536fe129e 100644 --- a/src/main/java/slimebound/cards/ComboTackle.java +++ b/src/main/java/slimebound/cards/ComboTackle.java @@ -2,6 +2,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.DamageAction; import com.megacrit.cardcrawl.actions.common.DrawCardAction; import com.megacrit.cardcrawl.cards.AbstractCard; @@ -11,6 +12,8 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.localization.CardStrings; import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.powers.DrawCardNextTurnPower; +import hermit.powers.Bruise; import slimebound.SlimeboundMod; import slimebound.actions.TackleSelfDamageAction; import slimebound.patches.AbstractCardEnum; @@ -25,10 +28,10 @@ public class ComboTackle extends AbstractSlimeboundCard { public static final String DESCRIPTION; public static final String IMG_PATH = "cards/quicktackle.png"; private static final CardType TYPE = CardType.ATTACK; - private static final CardRarity RARITY = CardRarity.COMMON; + private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 1; + private static final int COST = 0; public static String UPGRADED_DESCRIPTION; static { @@ -42,18 +45,17 @@ public class ComboTackle extends AbstractSlimeboundCard { public ComboTackle() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 11; + this.baseDamage = 9; this.baseSelfDamage = this.selfDamage = 3; - this.magicNumber = this.baseMagicNumber = 2; + this.magicNumber = this.baseMagicNumber = 1; SlimeboundMod.loadJokeCardImage(this, "ComboTackle.png"); } public void use(AbstractPlayer p, AbstractMonster m) { - AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new com.megacrit.cardcrawl.cards.DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + this.addToBot(new ApplyPowerAction(p, p, new DrawCardNextTurnPower(p, magicNumber), magicNumber)); if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) - addToBot(new TackleSelfDamageAction(new DamageInfo(p, selfDamage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.SMASH)); - AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, this.magicNumber)); - + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, baseSelfDamage), baseSelfDamage, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); } public void upgrade() { @@ -61,8 +63,9 @@ public void upgrade() { upgradeName(); upgradeDamage(2); upgradeMagicNumber(1); + this.rawDescription = UPGRADED_DESCRIPTION; + this.initializeDescription(); } } } - diff --git a/src/main/java/slimebound/cards/DisruptingSlam.java b/src/main/java/slimebound/cards/DisruptingSlam.java index f06284a8f..3c25cc527 100644 --- a/src/main/java/slimebound/cards/DisruptingSlam.java +++ b/src/main/java/slimebound/cards/DisruptingSlam.java @@ -3,6 +3,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.common.DamageAllEnemiesAction; +import com.megacrit.cardcrawl.actions.common.MakeTempCardInHandAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; @@ -29,7 +30,7 @@ public DisruptingSlam() { public void use(AbstractPlayer p, AbstractMonster m) { addToBot(new DamageAllEnemiesAction(p, this.multiDamage, this.damageTypeForTurn, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); - addToBot(new ExhumeLickAction(magicNumber, false)); + this.addToBot(new MakeTempCardInHandAction(new Lick(), this.magicNumber)); } public void upgrade() { diff --git a/src/main/java/slimebound/cards/DivideAndConquer.java b/src/main/java/slimebound/cards/DivideAndConquer.java index bf838d9a0..601e5dbfd 100644 --- a/src/main/java/slimebound/cards/DivideAndConquer.java +++ b/src/main/java/slimebound/cards/DivideAndConquer.java @@ -53,9 +53,8 @@ public class DivideAndConquer extends AbstractSlimeboundCard { public DivideAndConquer() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.exhaust = true; this.isMultiDamage = true; - baseDamage = 10; + baseDamage = 5; SlimeboundMod.loadJokeCardImage(this, "DivideAndConquer.png"); } @@ -76,12 +75,6 @@ public void use(AbstractPlayer p, AbstractMonster m) { } } - for (AbstractOrb o : p.orbs) { - if (o instanceof SpawnedSlime) { - AbstractDungeon.actionManager.addToBottom(new EvokeSpecificOrbAction(o)); - } - } - } public AbstractCard makeCopy() { @@ -91,7 +84,7 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(5); + upgradeDamage(2); } } } diff --git a/src/main/java/slimebound/cards/FinishingTackle.java b/src/main/java/slimebound/cards/FinishingTackle.java index 7e626a93c..9edc8607a 100644 --- a/src/main/java/slimebound/cards/FinishingTackle.java +++ b/src/main/java/slimebound/cards/FinishingTackle.java @@ -46,7 +46,7 @@ public class FinishingTackle extends AbstractSlimeboundCard { public FinishingTackle() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 12; + this.baseDamage = 11; baseSelfDamage = this.selfDamage = 3; baseMagicNumber = magicNumber = 2; SlimeboundMod.loadJokeCardImage(this, "FinishingTackle.png"); @@ -79,4 +79,3 @@ public void upgrade() { } } - diff --git a/src/main/java/slimebound/cards/FlameTackle.java b/src/main/java/slimebound/cards/FlameTackle.java index 2e3768d16..bf119d9ee 100644 --- a/src/main/java/slimebound/cards/FlameTackle.java +++ b/src/main/java/slimebound/cards/FlameTackle.java @@ -14,6 +14,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.combat.InflameEffect; import com.megacrit.cardcrawl.vfx.combat.SearingBlowEffect; +import hermit.powers.Bruise; import slimebound.SlimeboundMod; import slimebound.actions.TackleSelfDamageAction; import slimebound.patches.AbstractCardEnum; @@ -31,7 +32,7 @@ public class FlameTackle extends AbstractSlimeboundCard { private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 2; + private static final int COST = 0; public static String UPGRADED_DESCRIPTION; static { @@ -45,9 +46,9 @@ public class FlameTackle extends AbstractSlimeboundCard { public FlameTackle() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 18; + this.baseDamage = 9; baseSelfDamage = this.selfDamage = 3; - this.magicNumber = this.baseMagicNumber = 5; + this.magicNumber = this.baseMagicNumber = 2; SlimeboundMod.loadJokeCardImage(this, "FlameTackle.png"); } @@ -57,7 +58,7 @@ public void use(AbstractPlayer p, AbstractMonster m) { } AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new com.megacrit.cardcrawl.cards.DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.NONE)); if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) - addToBot(new TackleSelfDamageAction(new DamageInfo(p, selfDamage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.SMASH)); + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, selfDamage), selfDamage, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); AbstractDungeon.actionManager.addToBottom(new VFXAction(p, new InflameEffect(p), 0.5F)); AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new TackleBuffPower(p, p, this.magicNumber), this.magicNumber, true, AbstractGameAction.AttackEffect.NONE)); } @@ -65,10 +66,9 @@ public void use(AbstractPlayer p, AbstractMonster m) { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(4); - upgradeMagicNumber(2); + upgradeDamage(3); + upgradeMagicNumber(1); } } } - diff --git a/src/main/java/slimebound/cards/ForwardTackle.java b/src/main/java/slimebound/cards/ForwardTackle.java index 51462c50d..d077bd38e 100644 --- a/src/main/java/slimebound/cards/ForwardTackle.java +++ b/src/main/java/slimebound/cards/ForwardTackle.java @@ -2,6 +2,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.DamageAction; import com.megacrit.cardcrawl.cards.DamageInfo; import com.megacrit.cardcrawl.characters.AbstractPlayer; @@ -9,6 +10,7 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.localization.CardStrings; import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; import slimebound.actions.TackleSelfDamageAction; @@ -27,7 +29,7 @@ public class ForwardTackle extends AbstractSlimeboundCard { private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 2; + private static final int COST = 0; public static String UPGRADED_DESCRIPTION; static { @@ -45,7 +47,7 @@ public ForwardTackle() { tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 18; + this.baseDamage = 9; baseSelfDamage = this.selfDamage = 3; SlimeboundMod.loadJokeCardImage(this, "ForwardTackle.png"); @@ -56,10 +58,8 @@ public ForwardTackle() { public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) - addToBot(new TackleSelfDamageAction(new DamageInfo(p, selfDamage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.SMASH)); + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, selfDamage), selfDamage, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); addToBot(new CommandAction()); - addToBot(new CommandAction()); - if (upgraded) addToBot(new CommandAction()); checkMinionMaster(); @@ -68,11 +68,8 @@ public void use(AbstractPlayer p, AbstractMonster m) { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(4); - rawDescription = UPGRADED_DESCRIPTION; - initializeDescription(); + upgradeDamage(3); } } } - diff --git a/src/main/java/slimebound/cards/GoopTackle.java b/src/main/java/slimebound/cards/GoopTackle.java index 392c70eb5..4ceb45649 100644 --- a/src/main/java/slimebound/cards/GoopTackle.java +++ b/src/main/java/slimebound/cards/GoopTackle.java @@ -75,9 +75,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(7); + upgradeDamage(4); } } } - diff --git a/src/main/java/slimebound/cards/Grow.java b/src/main/java/slimebound/cards/Grow.java index 7314100fe..00aa089ac 100644 --- a/src/main/java/slimebound/cards/Grow.java +++ b/src/main/java/slimebound/cards/Grow.java @@ -44,12 +44,8 @@ public Grow() { public void use(AbstractPlayer p, AbstractMonster m) { - if (p.maxOrbs > 0) { - AbstractDungeon.actionManager.addToBottom(new DecreaseMaxOrbAction(1)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new DexterityPower(p, this.magicNumber), this.magicNumber)); AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new StrengthPower(p, this.magicNumber), this.magicNumber)); - } } diff --git a/src/main/java/slimebound/cards/HauntingLick.java b/src/main/java/slimebound/cards/HauntingLick.java index eebb2d0fb..77020c0c9 100644 --- a/src/main/java/slimebound/cards/HauntingLick.java +++ b/src/main/java/slimebound/cards/HauntingLick.java @@ -15,6 +15,7 @@ import com.megacrit.cardcrawl.powers.VulnerablePower; import slimebound.SlimeboundMod; import slimebound.patches.AbstractCardEnum; +import slimebound.powers.HauntingLickPower; import slimebound.powers.SlimedPower; import slimebound.vfx.LickEffect; import slimebound.vfx.SlimeDripsEffect; @@ -27,71 +28,36 @@ public class HauntingLick extends AbstractSlimeboundCard { public static final String NAME; public static final String DESCRIPTION; public static final String IMG_PATH = "cards/hauntinglick.png"; - private static final CardType TYPE = CardType.SKILL; - private static final CardRarity RARITY = CardRarity.COMMON; - private static final CardTarget TARGET = CardTarget.ENEMY; + private static final CardType TYPE = CardType.POWER; + private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardTarget TARGET = CardTarget.SELF; private static final CardStrings cardStrings; - private static final int COST = 0; - private static final int POWER = 6; - private static final int UPGRADE_BONUS = 3; - public static String UPGRADED_DESCRIPTION; + private static final int COST = 1; static { cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; - UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - } - public HauntingLick() { - super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - tags.add(SlimeboundMod.LICK); - - this.exhaust = true; - this.slimed = this.baseSlimed = 4; this.magicNumber = this.baseMagicNumber = 1; SlimeboundMod.loadJokeCardImage(this, "HauntingLick.png"); } public void use(AbstractPlayer p, AbstractMonster m) { - - AbstractDungeon.effectsQueue.add(new SlimeDripsEffect(m.hb.cX, m.hb.cY, 3)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(m, p, new VulnerablePower(m, this.magicNumber, false), this.magicNumber, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(m, p, new SlimedPower(m, p, this.slimed), this.slimed, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new VFXAction(new LickEffect(m.hb.cX, m.hb.cY, 0.6F, new Color(ROYAL)), 0.1F)); - - if (upgraded) upgradeAction(p,m); - - } - - - - public void upgradeAction(AbstractPlayer p, AbstractMonster m){ - AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, 1)); + AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new HauntingLickPower(p, this.magicNumber), this.magicNumber)); } public AbstractCard makeCopy() { - return new HauntingLick(); - } public void upgrade() { - if (!this.upgraded) { - upgradeName(); - - this.rawDescription = UPGRADED_DESCRIPTION; - this.initializeDescription(); - - + upgradeBaseCost(0); } - } } - - diff --git a/src/main/java/slimebound/cards/HungryTackle.java b/src/main/java/slimebound/cards/HungryTackle.java index e2c32a4d4..f1c619882 100644 --- a/src/main/java/slimebound/cards/HungryTackle.java +++ b/src/main/java/slimebound/cards/HungryTackle.java @@ -2,14 +2,18 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.DamageAction; +import com.megacrit.cardcrawl.actions.common.MakeTempCardInHandAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.cards.tempCards.Shiv; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.localization.CardStrings; import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; import slimebound.SlimeboundMod; import slimebound.actions.ExhumeLickAction; import slimebound.actions.ReturnRandom0Cost; @@ -29,7 +33,7 @@ public class HungryTackle extends AbstractSlimeboundCard { private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 1; + private static final int COST = 0; public static String UPGRADED_DESCRIPTION; static { @@ -46,7 +50,7 @@ public HungryTackle() { tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 12; + this.baseDamage = 9; baseSelfDamage = this.selfDamage = 3; @@ -59,10 +63,8 @@ public HungryTackle() { public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) - AbstractDungeon.actionManager.addToBottom(new TackleSelfDamageAction(new DamageInfo(AbstractDungeon.player, selfDamage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_LIGHT)); - // AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(m, p, new WeakPower(m, this.magicNumber, false), this.magicNumber, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new ExhumeLickAction(this.magicNumber, false)); - //AbstractDungeon.actionManager.addToBottom(new RemoveSpecificPowerAction(p,p,TackleBuffPower.POWER_ID)); + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, baseSelfDamage), baseSelfDamage, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + this.addToBot(new MakeTempCardInHandAction(new Lick(), this.magicNumber)); } public AbstractCard makeCopy() { @@ -77,15 +79,14 @@ public void upgrade() { upgradeName(); - upgradeDamage(4); + upgradeDamage(3); - // this.rawDescription = UPGRADED_DESCRIPTION; - //this.initializeDescription(); - //upgradeMagicNumber(1); + this.rawDescription = UPGRADED_DESCRIPTION; + this.initializeDescription(); + upgradeMagicNumber(1); } } } - diff --git a/src/main/java/slimebound/cards/LevelUp.java b/src/main/java/slimebound/cards/LevelUp.java index 2463b9199..2b37bc1c9 100644 --- a/src/main/java/slimebound/cards/LevelUp.java +++ b/src/main/java/slimebound/cards/LevelUp.java @@ -39,7 +39,7 @@ public LevelUp() { this.magicNumber = this.baseMagicNumber = 1; - // this.tags.add(SneckoMod.BANNEDFORSNECKO); + // this.tags.add(SneckoMod.BANNEDFORSNECKO); SlimeboundMod.loadJokeCardImage(this, "LevelUp.png"); } @@ -61,4 +61,3 @@ public void upgrade() { } } } - diff --git a/src/main/java/slimebound/cards/MassRepurpose.java b/src/main/java/slimebound/cards/MassRepurpose.java index d6013cecd..d76c3127f 100644 --- a/src/main/java/slimebound/cards/MassRepurpose.java +++ b/src/main/java/slimebound/cards/MassRepurpose.java @@ -17,12 +17,16 @@ import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; import slimebound.actions.MassRepurposeAction; +import slimebound.actions.SlimeSpawnAction; import slimebound.actions.TriggerSlimeAttacksAction; -import slimebound.orbs.SpawnedSlime; +import slimebound.orbs.*; import slimebound.patches.AbstractCardEnum; import slimebound.powers.PotencyPower; import sneckomod.SneckoMod; +import java.util.ArrayList; +import java.util.HashSet; + public class MassRepurpose extends AbstractSlimeboundCard { public static final String ID = "Slimebound:MassRepurpose"; @@ -48,23 +52,57 @@ public class MassRepurpose extends AbstractSlimeboundCard { public MassRepurpose() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); this.baseMagicNumber = magicNumber = 2; - this.exhaust = true; SlimeboundMod.loadJokeCardImage(this, "MassRepurpose.png"); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + HashSet uniqueSlimeTypes = new HashSet<>(); + // Collect unique Slime types + for (AbstractOrb o : p.orbs) { + if (o instanceof SpawnedSlime) { + uniqueSlimeTypes.add(((SpawnedSlime) o).ID); + } + } - // this.tags.add(SneckoMod.BANNEDFORSNECKO); + // Spawn one of each unique Slime type + spawnUniqueSlimes(uniqueSlimeTypes); -// this.tags.add(CardTags.HEALING); + // Repeat the process if upgraded + if (upgraded) { + spawnUniqueSlimes(uniqueSlimeTypes); + } } - public void use(AbstractPlayer p, AbstractMonster m) { - for (AbstractOrb o : p.orbs){ - if (o instanceof SpawnedSlime) { - AbstractDungeon.actionManager.addToBottom(new EvokeSpecificOrbAction(o)); - SlimeboundMod.spawnSpecialistSlime(); + private void spawnUniqueSlimes(HashSet slimeTypes) { + for (String slimeID : slimeTypes) { + switch (slimeID) { + case AttackSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new AttackSlime(), false, true)); + break; + case ShieldSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new ShieldSlime(), false, true)); + break; + case SlimingSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new SlimingSlime(), false, true)); + break; + case PoisonSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new PoisonSlime(), false, true)); + break; + case GeneralSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new GeneralSlime(), false, true)); + break; + case RecklessSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new RecklessSlime(), false, true)); + break; + case HungrySlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new HungrySlime(), false, true)); + break; + case GreedOozeSlime.ID: + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new GreedOozeSlime(), false, true)); + break; } } - if (upgraded) AbstractDungeon.actionManager.addToBottom(new TriggerSlimeAttacksAction(p)); } public void upgrade() { @@ -74,6 +112,4 @@ public void upgrade() { this.initializeDescription(); } } -} - - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/MegaLick.java b/src/main/java/slimebound/cards/MegaLick.java index 3accc2b48..64707cca2 100644 --- a/src/main/java/slimebound/cards/MegaLick.java +++ b/src/main/java/slimebound/cards/MegaLick.java @@ -15,6 +15,7 @@ import com.megacrit.cardcrawl.powers.WeakPower; import slimebound.SlimeboundMod; import slimebound.patches.AbstractCardEnum; +import slimebound.powers.MegaLickPower; import slimebound.powers.SlimedPower; import slimebound.vfx.LickEffect; import slimebound.vfx.SlimeDripsEffect; @@ -27,13 +28,11 @@ public class MegaLick extends AbstractSlimeboundCard { public static final String NAME; public static final String DESCRIPTION; public static final String IMG_PATH = "cards/megalick.png"; - private static final CardType TYPE = CardType.SKILL; + private static final CardType TYPE = CardType.POWER; private static final CardRarity RARITY = CardRarity.UNCOMMON; - private static final CardTarget TARGET = CardTarget.ALL_ENEMY; + private static final CardTarget TARGET = CardTarget.SELF; private static final CardStrings cardStrings; - private static final int COST = 0; - private static final int POWER = 6; - private static final int UPGRADE_BONUS = 3; + private static final int COST = 1; public static String UPGRADED_DESCRIPTION; static { @@ -41,70 +40,27 @@ public class MegaLick extends AbstractSlimeboundCard { NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - } - public MegaLick() { - super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - tags.add(SlimeboundMod.LICK); - - this.magicNumber = this.baseMagicNumber = 1; - - this.slimed = this.baseSlimed = 4; - this.exhaust = true; SlimeboundMod.loadJokeCardImage(this, "MegaLick.png"); - - } public void use(AbstractPlayer p, AbstractMonster m) { - - - if (!AbstractDungeon.getMonsters().areMonstersBasicallyDead()) { - flash(); - for (AbstractMonster monster : AbstractDungeon.getMonsters().monsters) { - if ((!monster.isDead) && (!monster.isDying)) { - - AbstractDungeon.effectsQueue.add(new SlimeDripsEffect(monster.hb.cX, monster.hb.cY, 3)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(monster, p, new WeakPower(monster, this.magicNumber, false), this.magicNumber, true, AbstractGameAction.AttackEffect.NONE)); - - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(monster, p, new SlimedPower(monster, p, this.slimed), this.slimed, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new VFXAction(new LickEffect(monster.hb.cX, monster.hb.cY, 0.6F, new Color(GREEN)), 0.1F)); - - - } - } - - } - if (upgraded)upgradeAction(p,m); - + addToBot(new ApplyPowerAction(p, p, new MegaLickPower(p, this.magicNumber), this.magicNumber)); } - - public void upgradeAction(AbstractPlayer p, AbstractMonster m){ - AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, 1)); - } public AbstractCard makeCopy() { - return new MegaLick(); - } public void upgrade() { - if (!this.upgraded) { - upgradeName(); - - this.rawDescription = UPGRADED_DESCRIPTION; - this.initializeDescription(); - + upgradeBaseCost(0); + initializeDescription(); } - } -} - - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/Nibble.java b/src/main/java/slimebound/cards/Nibble.java index 375f56bb6..b78e89c4c 100644 --- a/src/main/java/slimebound/cards/Nibble.java +++ b/src/main/java/slimebound/cards/Nibble.java @@ -2,6 +2,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.DamageAction; import com.megacrit.cardcrawl.actions.common.DrawCardAction; import com.megacrit.cardcrawl.actions.common.MakeTempCardInHandAction; @@ -14,6 +15,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.patches.AbstractCardEnum; +import slimebound.powers.NibblePower; import slimebound.vfx.SlimeDripsEffect; @@ -23,33 +25,23 @@ public class Nibble extends AbstractSlimeboundCard { private static final CardStrings cardStrings; public Nibble() { - super(ID, cardStrings.NAME, IMG_PATH, 0, cardStrings.DESCRIPTION, CardType.ATTACK, AbstractCardEnum.SLIMEBOUND, CardRarity.UNCOMMON, CardTarget.ENEMY); - baseDamage = damage = 4; - this.exhaust = true; - tags.add(SlimeboundMod.LICK); - this.cardsToPreview = new Lick(); + super(ID, cardStrings.NAME, IMG_PATH, 1, cardStrings.DESCRIPTION, CardType.POWER, AbstractCardEnum.SLIMEBOUND, CardRarity.UNCOMMON, CardTarget.SELF); + this.magicNumber = this.baseMagicNumber = 4; SlimeboundMod.loadJokeCardImage(this, "Nibble.png"); } public void use(AbstractPlayer p, AbstractMonster m) { - addToBot(new DamageAction(m, new DamageInfo(p, damage, damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_LIGHT)); - AbstractDungeon.effectsQueue.add(new SlimeDripsEffect(m.hb.cX, m.hb.cY, 3)); - AbstractDungeon.actionManager.addToBottom(new MakeTempCardInHandAction(new Lick())); - if (upgraded) upgradeAction(p,m); + addToBot(new ApplyPowerAction(p, p, new NibblePower(p, this.magicNumber), this.magicNumber)); } public void upgrade() { if (!this.upgraded) { upgradeName(); - this.rawDescription = cardStrings.UPGRADE_DESCRIPTION; - this.initializeDescription(); + upgradeBaseCost(0); + initializeDescription(); } } - public void upgradeAction(AbstractPlayer p, AbstractMonster m){ - AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, 1)); - } - public AbstractCard makeCopy() { return new Nibble(); } @@ -57,5 +49,4 @@ public AbstractCard makeCopy() { static { cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/PainToPower.java b/src/main/java/slimebound/cards/PainToPower.java new file mode 100644 index 000000000..4b77156b3 --- /dev/null +++ b/src/main/java/slimebound/cards/PainToPower.java @@ -0,0 +1,53 @@ +package slimebound.cards; + +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.localization.CardStrings; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import slimebound.SlimeboundMod; +import slimebound.patches.AbstractCardEnum; +import slimebound.powers.PainToPowerPower; + +public class PainToPower extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:PainToPower"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/paintopower.png"; + private static final CardType TYPE = CardType.POWER; + private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardTarget TARGET = CardTarget.SELF; + private static final CardStrings cardStrings; + private static final int COST = 2; + public static String UPGRADED_DESCRIPTION; + + static { + cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); + NAME = cardStrings.NAME; + DESCRIPTION = cardStrings.DESCRIPTION; + UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; + } + + public PainToPower() { + super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); + this.magicNumber = this.baseMagicNumber = 3; + SlimeboundMod.loadJokeCardImage(this, "PainToPower.png"); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + addToBot(new ApplyPowerAction(p, p, new PainToPowerPower(p, 1, this.magicNumber), 1)); + } + + public AbstractCard makeCopy() { + return new PainToPower(); + } + + public void upgrade() { + if (!this.upgraded) { + upgradeName(); + upgradeBaseCost(1); + initializeDescription(); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/PressTheAttack.java b/src/main/java/slimebound/cards/PressTheAttack.java index 5cb54e2a4..577a7233f 100644 --- a/src/main/java/slimebound/cards/PressTheAttack.java +++ b/src/main/java/slimebound/cards/PressTheAttack.java @@ -14,7 +14,6 @@ import slimebound.patches.AbstractCardEnum; import slimebound.powers.SlimedPower; - public class PressTheAttack extends AbstractSlimeboundCard { public static final String ID = "Slimebound:PressTheAttack"; public static final String NAME; @@ -25,55 +24,39 @@ public class PressTheAttack extends AbstractSlimeboundCard { private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; private static final int COST = 1; - private static final int POWER = 6; - private static final int UPGRADE_BONUS = 3; + private static final int DAMAGE = 9; + private static final int DAMAGE_UPGRADE = 2; public static String UPGRADED_DESCRIPTION; - static { cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - } - - public PressTheAttack() { - super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - - this.baseDamage = 9; + this.baseDamage = DAMAGE; SlimeboundMod.loadJokeCardImage(this, "PressTheAttack.png"); - - } - @Override public void triggerOnGlowCheck() { slimedGlowCheck(); } - public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new com.megacrit.cardcrawl.cards.DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); - if (m.hasPower(SlimedPower.POWER_ID)) { + if (upgraded || m.hasPower(SlimedPower.POWER_ID)) { addToBot(new CommandAction()); - if (upgraded) addToBot(new CommandAction()); } - - checkMinionMaster(); } public AbstractCard makeCopy() { - return new PressTheAttack(); - } - public void upgrade() { if (!this.upgraded) { upgradeName(); - //upgradeDamage(1); + upgradeDamage(DAMAGE_UPGRADE); this.rawDescription = UPGRADED_DESCRIPTION; this.initializeDescription(); } diff --git a/src/main/java/slimebound/cards/Recollect.java b/src/main/java/slimebound/cards/Recollect.java index 9a16a2527..26226b8d2 100644 --- a/src/main/java/slimebound/cards/Recollect.java +++ b/src/main/java/slimebound/cards/Recollect.java @@ -2,6 +2,7 @@ import com.megacrit.cardcrawl.actions.common.GainBlockAction; +import com.megacrit.cardcrawl.actions.common.MakeTempCardInHandAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; @@ -56,7 +57,7 @@ public Recollect() { public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new GainBlockAction(p, p, this.block)); - AbstractDungeon.actionManager.addToBottom(new ExhumeLickAction(this.magicNumber, false)); + this.addToBot(new MakeTempCardInHandAction(new Lick(), this.magicNumber)); } diff --git a/src/main/java/slimebound/cards/Repurpose.java b/src/main/java/slimebound/cards/Repurpose.java index 12a970c1d..34a06086e 100644 --- a/src/main/java/slimebound/cards/Repurpose.java +++ b/src/main/java/slimebound/cards/Repurpose.java @@ -2,6 +2,7 @@ import com.evacipated.cardcrawl.mod.stslib.actions.defect.EvokeSpecificOrbAction; +import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.GainBlockAction; import com.megacrit.cardcrawl.actions.common.HealAction; @@ -15,6 +16,8 @@ import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; +import slimebound.actions.SlimeSpawnAction; import slimebound.orbs.*; import slimebound.patches.AbstractCardEnum; import slimebound.powers.PotencyPower; @@ -25,13 +28,12 @@ public class Repurpose extends AbstractSlimeboundCard { public static final String ID = "Slimebound:Repurpose"; public static final String NAME; public static final String DESCRIPTION; - public static final String[] EXTENDED_DESCRIPTION; public static final String IMG_PATH = "cards/morphcard.png"; private static final CardType TYPE = CardType.SKILL; - private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardRarity RARITY = CardRarity.RARE; private static final CardTarget TARGET = CardTarget.SELF; private static final CardStrings cardStrings; - private static final int COST = 0; + private static final int COST = 1; public static String UPGRADED_DESCRIPTION; static { @@ -39,30 +41,32 @@ public class Repurpose extends AbstractSlimeboundCard { NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - EXTENDED_DESCRIPTION = cardStrings.EXTENDED_DESCRIPTION; } public Repurpose() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.baseMagicNumber = magicNumber = 2; - exhaust = true; + this.baseMagicNumber = magicNumber = 3; + this.exhaust = true; SlimeboundMod.loadJokeCardImage(this, "Repurpose.png"); - - // this.tags.add(SneckoMod.BANNEDFORSNECKO); - -// this.tags.add(CardTags.HEALING); } + @Override public void use(AbstractPlayer p, AbstractMonster m) { - AbstractOrb o = SlimeboundMod.getLeadingSlime(); - if (o != null) { - AbstractDungeon.actionManager.addToBottom(new EvokeSpecificOrbAction(o)); - SlimeboundMod.spawnSpecialistSlime(); - if (upgraded) addToBot(new CommandAction()); - } - } - + // Rotate + AbstractDungeon.actionManager.addToBottom(new RotateAction()); + // Add a new action to determine the leading slime and spawn + AbstractDungeon.actionManager.addToBottom(new AbstractGameAction() { + @Override + public void update() { + AbstractOrb leadingSlime = SlimeboundMod.getLeadingSlime(); + for (int i = 0; i < magicNumber; i++) { + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(leadingSlime, false, true)); + } + this.isDone = true; + } + }); + } public AbstractCard makeCopy() { return new Repurpose(); @@ -71,10 +75,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - this.rawDescription = UPGRADED_DESCRIPTION; + upgradeMagicNumber(2); this.initializeDescription(); } } -} - - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/RollThrough.java b/src/main/java/slimebound/cards/RollThrough.java index 877f4ebef..dd60269ae 100644 --- a/src/main/java/slimebound/cards/RollThrough.java +++ b/src/main/java/slimebound/cards/RollThrough.java @@ -42,7 +42,7 @@ public RollThrough() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.baseDamage = 6; + this.baseDamage = 5; this.magicNumber = this.baseMagicNumber = 2; this.selfDamage = 2; this.isMultiDamage = true; @@ -67,7 +67,7 @@ public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(1); + upgradeDamage(2); upgradeMagicNumber(1); } @@ -75,4 +75,3 @@ public void upgrade() { } } - diff --git a/src/main/java/slimebound/cards/SamplingLick.java b/src/main/java/slimebound/cards/SamplingLick.java index 18132749d..825628fd0 100644 --- a/src/main/java/slimebound/cards/SamplingLick.java +++ b/src/main/java/slimebound/cards/SamplingLick.java @@ -15,6 +15,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.patches.AbstractCardEnum; +import slimebound.powers.SamplingLickPower; import slimebound.powers.SlimedPower; import slimebound.vfx.LickEffect; import slimebound.vfx.SlimeDripsEffect; @@ -25,13 +26,11 @@ public class SamplingLick extends AbstractSlimeboundCard { public static final String NAME; public static final String DESCRIPTION; public static final String IMG_PATH = "cards/samplinglick.png"; - private static final CardType TYPE = CardType.SKILL; + private static final CardType TYPE = CardType.POWER; private static final CardRarity RARITY = CardRarity.UNCOMMON; - private static final CardTarget TARGET = CardTarget.ENEMY; + private static final CardTarget TARGET = CardTarget.SELF; private static final CardStrings cardStrings; - private static final int COST = 0; - private static final int BLOCK = 5; - private static final int UPGRADE_BONUS = 3; + private static final int COST = 1; public static String UPGRADED_DESCRIPTION; static { @@ -43,31 +42,12 @@ public class SamplingLick extends AbstractSlimeboundCard { public SamplingLick() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - tags.add(SlimeboundMod.LICK); - - - this.slimed = this.baseSlimed = 4; - this.baseBlock = 4; - this.exhaust = true; + this.magicNumber = this.baseMagicNumber = 4; SlimeboundMod.loadJokeCardImage(this, "SamplingLick.png"); - - } public void use(AbstractPlayer p, AbstractMonster m) { - - AbstractDungeon.effectsQueue.add(new SlimeDripsEffect(m.hb.cX, m.hb.cY, 3)); - AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(m, p, new SlimedPower(m, p, this.slimed), this.slimed, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new VFXAction(new LickEffect(m.hb.cX, m.hb.cY, 0.6F, new Color(Color.GOLDENROD)), 0.1F)); - - AbstractDungeon.actionManager.addToBottom(new GainBlockAction(p, p, this.block)); - if (upgraded)upgradeAction(p,m); - - } - - - public void upgradeAction(AbstractPlayer p, AbstractMonster m){ - AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, 1)); + addToBot(new ApplyPowerAction(p, p, new SamplingLickPower(p, this.magicNumber), this.magicNumber)); } public AbstractCard makeCopy() { @@ -77,10 +57,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - this.rawDescription = UPGRADED_DESCRIPTION; - this.initializeDescription(); + upgradeBaseCost(0); + initializeDescription(); } } } - - diff --git a/src/main/java/slimebound/cards/ServeAndProtect.java b/src/main/java/slimebound/cards/ServeAndProtect.java index b673ffa28..8a76d8000 100644 --- a/src/main/java/slimebound/cards/ServeAndProtect.java +++ b/src/main/java/slimebound/cards/ServeAndProtect.java @@ -23,21 +23,19 @@ import slimebound.patches.AbstractCardEnum; import java.util.ArrayList; +import java.util.HashSet; public class ServeAndProtect extends AbstractSlimeboundCard { public static final String ID = "Slimebound:ServeAndProtect"; public static final String NAME; public static final String DESCRIPTION; - public static final String[] EXTENDED_DESCRIPTION; public static final String IMG_PATH = "cards/formablockade.png"; private static final CardStrings cardStrings; private static final CardType TYPE = CardType.SKILL; private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.SELF; private static final int COST = 1; - private static final int BLOCK = 5; - private static final int UPGRADE_BONUS = 3; public static String UPGRADED_DESCRIPTION; static { @@ -45,42 +43,34 @@ public class ServeAndProtect extends AbstractSlimeboundCard { NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - EXTENDED_DESCRIPTION = cardStrings.EXTENDED_DESCRIPTION; } - public ServeAndProtect() { - super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - baseMagicNumber = magicNumber = 1; - baseBlock = block = 10; - this.exhaust = true; + this.baseBlock = 3; + this.magicNumber = this.baseMagicNumber = 1; SlimeboundMod.loadJokeCardImage(this, "ServeAndProtect.png"); - } - - public void use(AbstractPlayer p, AbstractMonster m) { - int slimecount = 0; + HashSet uniqueSlimeTypes = new HashSet<>(); + // Count unique Slime types for (AbstractOrb o : p.orbs) { if (o instanceof SpawnedSlime) { - slimecount++; + uniqueSlimeTypes.add(((SpawnedSlime) o).ID); } } - if (slimecount > 0) { - addToBot(new GainBlockAction(p, slimecount * block)); - addToBot(new ApplyPowerAction(p,p,new BlurPower(p, slimecount))); - } + int uniqueSlimeCount = uniqueSlimeTypes.size(); - for (AbstractOrb o : p.orbs) { - if (o instanceof SpawnedSlime) { - addToBot(new EvokeSpecificOrbAction(o)); - } + // Gain Block for each unique Slime + if (uniqueSlimeCount > 0) { + addToBot(new GainBlockAction(p, p, this.block * uniqueSlimeCount)); } + // Gain 1 Blur + addToBot(new ApplyPowerAction(p, p, new BlurPower(p, this.magicNumber))); } public AbstractCard makeCopy() { @@ -90,9 +80,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeBlock(5); + upgradeBlock(1); + initializeDescription(); } } } - - diff --git a/src/main/java/slimebound/cards/SlimeBarrage.java b/src/main/java/slimebound/cards/SlimeBarrage.java index d50c27950..6db9e3661 100644 --- a/src/main/java/slimebound/cards/SlimeBarrage.java +++ b/src/main/java/slimebound/cards/SlimeBarrage.java @@ -22,10 +22,10 @@ public class SlimeBarrage extends AbstractSlimeboundCard { public static final String DESCRIPTION; public static final String IMG_PATH = "cards/slimebarrage.png"; private static final CardType TYPE = CardType.ATTACK; - private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardRarity RARITY = CardRarity.RARE; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 2; + private static final int COST = 3; private static final int POWER = 6; private static final int UPGRADE_BONUS = 3; public static String UPGRADED_DESCRIPTION; diff --git a/src/main/java/slimebound/cards/SlimeTap.java b/src/main/java/slimebound/cards/SlimeTap.java index 2ec58fdb6..5892d7153 100644 --- a/src/main/java/slimebound/cards/SlimeTap.java +++ b/src/main/java/slimebound/cards/SlimeTap.java @@ -2,6 +2,7 @@ import com.evacipated.cardcrawl.mod.stslib.actions.defect.EvokeSpecificOrbAction; +import com.megacrit.cardcrawl.actions.common.DrawCardAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; @@ -10,6 +11,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.SlimeboundMod; +import slimebound.actions.RotateAction; import slimebound.orbs.SpawnedSlime; import slimebound.patches.AbstractCardEnum; import sneckomod.SneckoMod; @@ -19,15 +21,12 @@ public class SlimeTap extends AbstractSlimeboundCard { public static final String ID = "Slimebound:SlimeTap"; public static final String NAME; public static final String DESCRIPTION; - public static final String[] EXTENDED_DESCRIPTION; public static final String IMG_PATH = "cards/slimetap.png"; private static final CardStrings cardStrings; private static final CardType TYPE = CardType.SKILL; private static final CardRarity RARITY = CardRarity.UNCOMMON; private static final CardTarget TARGET = CardTarget.SELF; - private static final int COST = 0; - private static final int BLOCK = 5; - private static final int UPGRADE_BONUS = 3; + private static final int COST = 1; public static String UPGRADED_DESCRIPTION; static { @@ -35,55 +34,17 @@ public class SlimeTap extends AbstractSlimeboundCard { NAME = cardStrings.NAME; DESCRIPTION = cardStrings.DESCRIPTION; UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; - EXTENDED_DESCRIPTION = cardStrings.EXTENDED_DESCRIPTION; } - private int numEaten = 0; - - public SlimeTap() { - super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - - - this.exhaust = true; this.magicNumber = this.baseMagicNumber = 2; SlimeboundMod.loadJokeCardImage(this, "SlimeTap.png"); - - //this.tags.add(SneckoMod.BANNEDFORSNECKO); - - } - - public boolean canUse(AbstractPlayer p, AbstractMonster m) { - boolean canUse = super.canUse(p, m); - if (canUse) { - - canUse = false; - for (AbstractOrb o : p.orbs) { - if (o instanceof SpawnedSlime) { - canUse = true; - } - } - if (!canUse) this.cantUseMessage = EXTENDED_DESCRIPTION[0]; - } - return canUse; } public void use(AbstractPlayer p, AbstractMonster m) { - - AbstractOrb o = SlimeboundMod.getLeadingSlime(); - if (o != null) { - numEaten = numEaten + 1; - AbstractDungeon.actionManager.addToBottom(new EvokeSpecificOrbAction(o)); - AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.common.DrawCardAction(AbstractDungeon.player, this.magicNumber)); - if (upgraded){ - AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.common.GainEnergyAction(2)); - } else { - AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.common.GainEnergyAction(1)); - } - - return; - } + AbstractDungeon.actionManager.addToBottom(new RotateAction()); + AbstractDungeon.actionManager.addToBottom(new DrawCardAction(p, this.magicNumber)); } public AbstractCard makeCopy() { @@ -93,12 +54,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - - rawDescription = UPGRADED_DESCRIPTION; + this.upgradeMagicNumber(1); initializeDescription(); - - } } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/SplitAcid.java b/src/main/java/slimebound/cards/SplitAcid.java index 86ffbec3e..df234c47e 100644 --- a/src/main/java/slimebound/cards/SplitAcid.java +++ b/src/main/java/slimebound/cards/SplitAcid.java @@ -1,8 +1,6 @@ package slimebound.cards; -import com.megacrit.cardcrawl.actions.AbstractGameAction; -import com.megacrit.cardcrawl.actions.common.DamageAllEnemiesAction; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; @@ -11,7 +9,9 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; import slimebound.actions.SlimeSpawnAction; +import slimebound.orbs.PoisonSlime; import slimebound.patches.AbstractCardEnum; @@ -39,24 +39,22 @@ public class SplitAcid extends AbstractSlimeboundCard { public SplitAcid() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.baseDamage = 7; - this.exhaust = true; - this.magicNumber = this.baseMagicNumber = 2; + this.magicNumber = this.baseMagicNumber = 0; this.isMultiDamage = true; SlimeboundMod.loadJokeCardImage(this, "SplitAcid.png"); } public void use(AbstractPlayer p, AbstractMonster m) { int bonus = 0; - //AbstractDungeon.actionManager.addToBottom(new DamageAllEnemiesAction(p, this.multiDamage, this.damageTypeForTurn, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.PoisonSlime(), false, true, 0, bonus)); - for (int i = 0; i < this.magicNumber; i++) { + AbstractDungeon.actionManager.addToBottom(new RotateAction(PoisonSlime.class)); + + if (this.upgraded) { addToBot(new CommandAction()); } checkMinionMaster(); - } public AbstractCard makeCopy() { @@ -66,10 +64,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeMagicNumber(1); - - + this.rawDescription = UPGRADED_DESCRIPTION; + initializeDescription(); } } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/SplitBruiser.java b/src/main/java/slimebound/cards/SplitBruiser.java index 3ef6f059f..3f71edd8a 100644 --- a/src/main/java/slimebound/cards/SplitBruiser.java +++ b/src/main/java/slimebound/cards/SplitBruiser.java @@ -10,7 +10,9 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; import slimebound.actions.SlimeSpawnAction; +import slimebound.orbs.AttackSlime; import slimebound.patches.AbstractCardEnum; @@ -37,21 +39,17 @@ public class SplitBruiser extends AbstractSlimeboundCard { public SplitBruiser() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.baseDamage = 9; - this.magicNumber = this.baseMagicNumber = 2; - this.exhaust = true; + this.magicNumber = this.baseMagicNumber = 0; SlimeboundMod.loadJokeCardImage(this, "SplitBruiser.png"); } public void use(AbstractPlayer p, AbstractMonster m) { - int bonus = 0; - //com.megacrit.cardcrawl.dungeons.AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.common.DamageAction(m, new com.megacrit.cardcrawl.cards.DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_LIGHT)); - AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.AttackSlime(), false, true, bonus, 0)); + AbstractDungeon.actionManager.addToBottom(new RotateAction(AttackSlime.class)); - for (int i = 0; i < this.magicNumber; i++) { + if (this.upgraded) { addToBot(new CommandAction()); } @@ -65,10 +63,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeMagicNumber(1); - - + this.rawDescription = UPGRADED_DESCRIPTION; + initializeDescription(); } } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/SplitGeneral.java b/src/main/java/slimebound/cards/SplitGeneral.java new file mode 100644 index 000000000..c16d90961 --- /dev/null +++ b/src/main/java/slimebound/cards/SplitGeneral.java @@ -0,0 +1,58 @@ +package slimebound.cards; + +import com.megacrit.cardcrawl.actions.common.ExhaustSpecificCardAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.characters.AbstractPlayer; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.localization.CardStrings; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import slimebound.SlimeboundMod; +import slimebound.actions.SlimeSpawnAction; +import slimebound.orbs.GeneralSlime; +import slimebound.actions.RotateAction; +import slimebound.patches.AbstractCardEnum; + +public class SplitGeneral extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:SplitGeneral"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/splitgeneral.png"; + private static final CardType TYPE = CardType.SKILL; + private static final CardRarity RARITY = CardRarity.RARE; + private static final CardTarget TARGET = CardTarget.SELF; + private static final int COST = 2; + private static final CardStrings cardStrings; + public static String UPGRADED_DESCRIPTION; + + static { + cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); + NAME = cardStrings.NAME; + DESCRIPTION = cardStrings.DESCRIPTION; + UPGRADED_DESCRIPTION = cardStrings.UPGRADE_DESCRIPTION; + } + + public SplitGeneral() { + super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); + SlimeboundMod.loadJokeCardImage(this, "SplitGeneral.png"); + } + + public void use(AbstractPlayer p, AbstractMonster m) { + int bonus = 0; + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new GeneralSlime(), false, true, bonus, 0)); + AbstractDungeon.actionManager.addToBottom(new RotateAction(GeneralSlime.class)); + AbstractDungeon.actionManager.addToBottom(new ExhaustSpecificCardAction(this, AbstractDungeon.player.hand)); + checkMinionMaster(); + } + + public AbstractCard makeCopy() { + return new SplitGeneral(); + } + + public void upgrade() { + if (!this.upgraded) { + upgradeName(); + upgradeBaseCost(1); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/SplitLeeching.java b/src/main/java/slimebound/cards/SplitLeeching.java index 5c84d3816..7b78c626b 100644 --- a/src/main/java/slimebound/cards/SplitLeeching.java +++ b/src/main/java/slimebound/cards/SplitLeeching.java @@ -9,6 +9,7 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; import slimebound.actions.SlimeSpawnAction; import slimebound.orbs.ShieldSlime; import slimebound.patches.AbstractCardEnum; @@ -37,23 +38,21 @@ public class SplitLeeching extends AbstractSlimeboundCard { public SplitLeeching() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - this.baseBlock = 8; - this.magicNumber = this.baseMagicNumber = 2; - this.exhaust = true; + this.magicNumber = this.baseMagicNumber = 0; SlimeboundMod.loadJokeCardImage(this, "SplitLeeching.png"); } public void use(AbstractPlayer p, AbstractMonster m) { int bonus = 0; - //AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.common.GainBlockAction(p, p, this.block)); AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new ShieldSlime(), false, true, 0, bonus)); - for (int i = 0; i < this.magicNumber; i++) { + AbstractDungeon.actionManager.addToBottom(new RotateAction(ShieldSlime.class)); + + if (this.upgraded) { addToBot(new CommandAction()); } checkMinionMaster(); - } public AbstractCard makeCopy() { @@ -63,9 +62,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeMagicNumber(1); - + this.rawDescription = UPGRADED_DESCRIPTION; + initializeDescription(); } } } - diff --git a/src/main/java/slimebound/cards/SplitLicking.java b/src/main/java/slimebound/cards/SplitLicking.java index 115e363a8..329a72758 100644 --- a/src/main/java/slimebound/cards/SplitLicking.java +++ b/src/main/java/slimebound/cards/SplitLicking.java @@ -12,7 +12,9 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; import slimebound.actions.SlimeSpawnAction; +import slimebound.orbs.SlimingSlime; import slimebound.patches.AbstractCardEnum; import slimebound.powers.SlimedPower; import slimebound.vfx.SlimeProjectileEffect; @@ -41,26 +43,21 @@ public class SplitLicking extends AbstractSlimeboundCard { public SplitLicking() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - - this.magicNumber = this.baseMagicNumber = 2; + this.magicNumber = this.baseMagicNumber = 0; this.slimed = this.baseSlimed = 8; - this.exhaust = true; SlimeboundMod.loadJokeCardImage(this, "SplitMire.png"); } public void use(AbstractPlayer p, AbstractMonster m) { int bonus = 0; - // AbstractDungeon.actionManager.addToBottom(new VFXAction(new SlimeProjectileEffect(p.hb.cX, p.hb.cY, m.hb.cX, m.hb.cY, 2F, false, 0.6F), 0.3F)); - - // AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(m, p, new SlimedPower(m, p, this.slimed), this.slimed, true, AbstractGameAction.AttackEffect.NONE)); - AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.SlimingSlime(), false, true, 0, bonus)); - for (int i = 0; i < this.magicNumber; i++) { + AbstractDungeon.actionManager.addToBottom(new RotateAction(SlimingSlime.class)); + + if (this.upgraded) { addToBot(new CommandAction()); } checkMinionMaster(); - } public AbstractCard makeCopy() { @@ -70,10 +67,8 @@ public AbstractCard makeCopy() { public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeMagicNumber(1); - - + this.rawDescription = UPGRADED_DESCRIPTION; + initializeDescription(); } } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/SplitSpecialist.java b/src/main/java/slimebound/cards/SplitSpecialist.java index 0ed960397..5130176fa 100644 --- a/src/main/java/slimebound/cards/SplitSpecialist.java +++ b/src/main/java/slimebound/cards/SplitSpecialist.java @@ -3,6 +3,7 @@ import basemod.BaseMod; import com.badlogic.gdx.Gdx; +import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; @@ -15,6 +16,7 @@ import expansioncontent.expansionContentMod; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; +import slimebound.actions.RotateAction; import slimebound.actions.SlimeSpawnAction; import slimebound.orbs.*; import slimebound.patches.AbstractCardEnum; @@ -23,24 +25,19 @@ import java.util.Collections; -public class SplitSpecialist extends AbstractSlimeboundCard implements OctopusCard { - public static String ID = "Slimebound:SplitSpecialist"; - public static String NAME; - public static String DESCRIPTION; - public static String IMG_PATH = "cards/splitspecialist.png"; - public static CardStrings cardStrings; - public static CardType TYPE = CardType.SKILL; - public static CardRarity RARITY = CardRarity.UNCOMMON; - public static CardTarget TARGET = CardTarget.SELF; - public static int COST = 1; +public class SplitSpecialist extends AbstractSlimeboundCard { + public static final String ID = "Slimebound:SplitSpecialist"; + public static final String NAME; + public static final String DESCRIPTION; + public static final String IMG_PATH = "cards/splitspecialist.png"; + private static final CardType TYPE = CardType.SKILL; + private static final CardRarity RARITY = CardRarity.UNCOMMON; + private static final CardTarget TARGET = CardTarget.SELF; + private static final int COST = 1; + private static final int BLOCK = 5; + private static final int UPGRADE_BONUS = 3; + private static final CardStrings cardStrings; public static String UPGRADED_DESCRIPTION; - private static int upgradedamount = 1; - public String[] NAMES = CardCrawlGame.languagePack.getCharacterString("downfall:OctoChoiceCards").NAMES; - public String[] TEXT = CardCrawlGame.languagePack.getCharacterString("downfall:OctoChoiceCards").TEXT; - - private float rotationTimer; - private int previewIndex; - private ArrayList cardList = new ArrayList<>(); static { cardStrings = CardCrawlGame.languagePack.getCardStrings(ID); @@ -51,147 +48,32 @@ public class SplitSpecialist extends AbstractSlimeboundCard implements OctopusCa public SplitSpecialist() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); - exhaust = true; - - - cardList.add(new OctoChoiceCard("Slimebound:SplotBronze", - NAMES[12], - expansionContentMod.makeCardPath("QuickAutomaton.png"), - TEXT[12] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:bronze_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotGhostflame", - NAMES[13], - expansionContentMod.makeCardPath("QuickHexa.png"), - TEXT[13] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:ghostflame_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotTorchhead", - NAMES[14], - expansionContentMod.makeCardPath("QuickCollector.png"), - TEXT[14] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:torchhead_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotCultist", - NAMES[15], - expansionContentMod.makeCardPath("QuickAwakened.png"), - TEXT[15] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:cultist_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotProtector", - NAMES[16], - expansionContentMod.makeCardPath("QuickGuardian.png"), - TEXT[16] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:protector_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotInsulting", - NAMES[17], - expansionContentMod.makeCardPath("QuickChamp.png"), - TEXT[17] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:insulting_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotAncient", - NAMES[18], - expansionContentMod.makeCardPath("QuickAncients.png"), - TEXT[18] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:ancient_slime").replaceAll("#b","").replaceAll("#y",""))); - cardList.add(new OctoChoiceCard("Slimebound:SplotSlowing", - NAMES[19], - expansionContentMod.makeCardPath("QuickTimeEater.png"), - TEXT[19] + " NL " + BaseMod.getKeywordDescription("slimeboundmod:time_slime").replaceAll("#b","").replaceAll("#y",""))); + this.baseDamage = 9; + this.magicNumber = this.baseMagicNumber = 0; SlimeboundMod.loadJokeCardImage(this, "SplitSpecialist.png"); - } public void use(AbstractPlayer p, AbstractMonster m) { - choice(m); - } + int bonus = 0; + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.HungrySlime(), false, true, bonus, 0)); + AbstractDungeon.actionManager.addToBottom(new RotateAction(AttackSlime.class)); - public void choice(AbstractMonster m) { - addToBot(new OctoChoiceAction(m, this)); - } - - public ArrayList choiceList() { - ArrayList realList = new ArrayList<>(); - Collections.shuffle(cardList, AbstractDungeon.cardRng.random); - for (int i = 0; i < 3; i++) { - realList.add(cardList.get(i)); + if (this.upgraded) { + addToBot(new CommandAction()); } - return realList; + checkMinionMaster(); } - public void doChoiceStuff(AbstractMonster m, OctoChoiceCard card) { - switch (card.cardID) { - case "Slimebound:SplotBronze": { - addToBot(new SlimeSpawnAction(new BronzeSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotGhostflame": { - addToBot(new SlimeSpawnAction(new HexSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotTorchhead": { - addToBot(new SlimeSpawnAction(new TorchHeadSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotCultist": { - addToBot(new SlimeSpawnAction(new CultistSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotProtector": { - addToBot(new SlimeSpawnAction(new ProtectorSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotInsulting": { - addToBot(new SlimeSpawnAction(new ChampSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotAncient": { - addToBot(new SlimeSpawnAction(new DrawingSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - case "Slimebound:SplotSlowing": { - addToBot(new SlimeSpawnAction(new SlowingSlime(), false, true)); - if (upgraded) addToBot(new CommandAction()); - break; - } - } - - if (upgraded) { - checkMinionMaster(); - } + public AbstractCard makeCopy() { + return new SplitSpecialist(); } public void upgrade() { if (!this.upgraded) { upgradeName(); - - rawDescription = UPGRADED_DESCRIPTION; + this.rawDescription = UPGRADED_DESCRIPTION; initializeDescription(); } } - - @Override - public void update() { - super.update(); - if (hb.hovered) { - if (rotationTimer <= 0F) { - rotationTimer = 2F; - if (cardList.size() == 0) { - cardsToPreview = CardLibrary.cards.get("Madness"); - } else { - cardsToPreview = cardList.get(previewIndex); - } - if (previewIndex == cardList.size() - 1) { - previewIndex = 0; - } else { - previewIndex++; - } - } else { - rotationTimer -= Gdx.graphics.getDeltaTime(); - } - } - } - - @Override - public void unhover() { - super.unhover(); - cardsToPreview = null; - } -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/cards/Tackle.java b/src/main/java/slimebound/cards/Tackle.java index 3a069bf58..c09ed1dc8 100644 --- a/src/main/java/slimebound/cards/Tackle.java +++ b/src/main/java/slimebound/cards/Tackle.java @@ -2,6 +2,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; import com.megacrit.cardcrawl.actions.common.DamageAction; import com.megacrit.cardcrawl.cards.DamageInfo; import com.megacrit.cardcrawl.characters.AbstractPlayer; @@ -9,6 +10,7 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.localization.CardStrings; import com.megacrit.cardcrawl.monsters.AbstractMonster; +import hermit.powers.Bruise; import slimebound.SlimeboundMod; import slimebound.actions.TackleSelfDamageAction; import slimebound.patches.AbstractCardEnum; @@ -24,7 +26,7 @@ public class Tackle extends AbstractSlimeboundCard { private static final CardRarity RARITY = CardRarity.BASIC; private static final CardTarget TARGET = CardTarget.ENEMY; private static final CardStrings cardStrings; - private static final int COST = 1; + private static final int COST = 0; public static String UPGRADED_DESCRIPTION; static { @@ -39,23 +41,22 @@ public Tackle() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 12; - baseSelfDamage = this.selfDamage = 3; + this.baseDamage = 9; + magicNumber = this.baseMagicNumber = 3; SlimeboundMod.loadJokeCardImage(this, "Tackle.png"); } public void use(AbstractPlayer p, AbstractMonster m) { AbstractDungeon.actionManager.addToBottom(new DamageAction(m, new DamageInfo(p, this.damage, this.damageTypeForTurn), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); if (!AbstractDungeon.player.hasPower(PreventTackleDamagePower.POWER_ID)) - AbstractDungeon.actionManager.addToBottom(new TackleSelfDamageAction(new DamageInfo(AbstractDungeon.player, selfDamage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_LIGHT)); + this.addToBot(new ApplyPowerAction(p, p, new Bruise(p, magicNumber), magicNumber, true, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); } public void upgrade() { if (!this.upgraded) { upgradeName(); - upgradeDamage(4); + upgradeDamage(3); } } } - diff --git a/src/main/java/slimebound/cards/VenomTackle.java b/src/main/java/slimebound/cards/VenomTackle.java index 236d85a73..6c289e6a4 100644 --- a/src/main/java/slimebound/cards/VenomTackle.java +++ b/src/main/java/slimebound/cards/VenomTackle.java @@ -112,4 +112,3 @@ public void upgrade() { } } - diff --git a/src/main/java/slimebound/cards/ViciousTackle.java b/src/main/java/slimebound/cards/ViciousTackle.java index f3bc03db0..cc5c8fb31 100644 --- a/src/main/java/slimebound/cards/ViciousTackle.java +++ b/src/main/java/slimebound/cards/ViciousTackle.java @@ -51,7 +51,7 @@ public ViciousTackle() { super(ID, NAME, SlimeboundMod.getResourcePath(IMG_PATH), COST, DESCRIPTION, TYPE, AbstractCardEnum.SLIMEBOUND, RARITY, TARGET); tags.add(SlimeboundMod.TACKLE); - this.baseDamage = 17; + this.baseDamage = 16; this.baseSelfDamage = this.selfDamage = 3; SlimeboundMod.loadJokeCardImage(this, "ViciousTackle.png"); @@ -111,7 +111,7 @@ public void upgrade() { upgradeName(); - upgradeDamage(7); + upgradeDamage(4); //this.rawDescription = UPGRADED_DESCRIPTION; //this.initializeDescription(); @@ -121,4 +121,3 @@ public void upgrade() { } } - diff --git a/src/main/java/slimebound/characters/SlimeboundCharacter.java b/src/main/java/slimebound/characters/SlimeboundCharacter.java index 69721a7f5..422674a47 100644 --- a/src/main/java/slimebound/characters/SlimeboundCharacter.java +++ b/src/main/java/slimebound/characters/SlimeboundCharacter.java @@ -180,7 +180,7 @@ public void reloadAnimation() { public void movePosition(float x, float y) { - super.movePosition(x, y); + super.movePosition(x - (180F * Settings.scale), y - (100F * Settings.scale)); this.drawY = this.drawY + mainRenderYOffset; this.dialogY = this.drawY + 30F * Settings.scale; this.refreshHitboxLocation(); @@ -209,7 +209,7 @@ public ArrayList getStartingRelics() { } public CharSelectInfo getLoadout() { - return new CharSelectInfo(NAME, DESCRIPTION,65, 65, 3, 99, 5, this, + return new CharSelectInfo(NAME, DESCRIPTION,65, 65, 10, 99, 5, this, getStartingRelics(), getStartingDeck(), false); } @@ -290,4 +290,3 @@ public void applyStartOfTurnCards() { } - diff --git a/src/main/java/slimebound/orbs/AttackSlime.java b/src/main/java/slimebound/orbs/AttackSlime.java index bd37baf0d..f1b7b5a70 100644 --- a/src/main/java/slimebound/orbs/AttackSlime.java +++ b/src/main/java/slimebound/orbs/AttackSlime.java @@ -36,10 +36,14 @@ public void activateEffectUnique() { } + public void upgrade() { + this.passiveAmount += 3; + updateDescription(); + } + public AbstractOrb makeCopy() { return new AttackSlime(); } } - diff --git a/src/main/java/slimebound/orbs/BronzeSlime.java b/src/main/java/slimebound/orbs/BronzeSlime.java index 2fb3e02b7..100348393 100644 --- a/src/main/java/slimebound/orbs/BronzeSlime.java +++ b/src/main/java/slimebound/orbs/BronzeSlime.java @@ -50,4 +50,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/ChampSlime.java b/src/main/java/slimebound/orbs/ChampSlime.java index 634a31ef7..d68a90733 100644 --- a/src/main/java/slimebound/orbs/ChampSlime.java +++ b/src/main/java/slimebound/orbs/ChampSlime.java @@ -39,7 +39,7 @@ public ChampSlime() { public void postSpawnEffects() { this.crownVFX = new CrownParticle(this); if(CharacterSelectScreenPatches.characters[1].isOriginal()){ - AbstractDungeon.effectList.add(this.crownVFX); + AbstractDungeon.effectList.add(this.crownVFX); } } @@ -64,7 +64,7 @@ public void triggerEvokeAnimation() { public void cleanUpVFX() { if(CharacterSelectScreenPatches.characters[1].isOriginal()) - this.crownVFX.finish(); + this.crownVFX.finish(); } @Override @@ -79,4 +79,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/CultistSlime.java b/src/main/java/slimebound/orbs/CultistSlime.java index bbf7b5abe..f554db8ed 100644 --- a/src/main/java/slimebound/orbs/CultistSlime.java +++ b/src/main/java/slimebound/orbs/CultistSlime.java @@ -73,9 +73,9 @@ public void cleanUpVFX() { if (sticksLeftVFX != null) { this.sticksLeftVFX.finish(); } - if (sticksRightVFX != null){ - this.sticksRightVFX.finish(); - } + if (sticksRightVFX != null){ + this.sticksRightVFX.finish(); + } } } @@ -94,4 +94,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/DarklingSlime.java b/src/main/java/slimebound/orbs/DarklingSlime.java index 4d2970e24..228ba4423 100644 --- a/src/main/java/slimebound/orbs/DarklingSlime.java +++ b/src/main/java/slimebound/orbs/DarklingSlime.java @@ -42,4 +42,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/DrawingSlime.java b/src/main/java/slimebound/orbs/DrawingSlime.java index afd068512..c4899f778 100644 --- a/src/main/java/slimebound/orbs/DrawingSlime.java +++ b/src/main/java/slimebound/orbs/DrawingSlime.java @@ -45,4 +45,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/GeneralSlime.java b/src/main/java/slimebound/orbs/GeneralSlime.java new file mode 100644 index 000000000..236f34637 --- /dev/null +++ b/src/main/java/slimebound/orbs/GeneralSlime.java @@ -0,0 +1,44 @@ +package slimebound.orbs; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import slimebound.SlimeboundMod; +import slimebound.actions.CommandRandomSlimesAction; +import slimebound.actions.SlimeGainBlock; +import slimebound.vfx.SlimeFlareEffect; + +public class GeneralSlime extends SpawnedSlime { + public static final String ID = "Slimebound:GeneralSlime"; + public static final String atlasString = SlimeboundMod.getResourcePath("orbs/slowing2.atlas"); + public static final String skeletonString = "images/monsters/theBottom/slimeAltS/skeleton.json"; + + public GeneralSlime() { + super(ID, new Color(0.5f, 0.5f, 0.8f, 1f), atlasString, skeletonString, false, false, 0, 2, false, new Color(0.4F, 0.4F, 0.8F, 1), SlimeFlareEffect.OrbFlareColor.LICKING, new Texture("slimeboundResources/SlimeboundImages/orbs/attackDebuff.png")); + this.extraFontColor = Color.GOLD; + this.debuffAmount = 2; + this.useDebuffForDescription = true; + spawnVFX(); + } + + @Override + public void updateDescription() { + this.description = this.descriptions[0] + this.debuffAmount + this.descriptions[1]; + } + + @Override + public void activateEffectUnique() { + AbstractDungeon.actionManager.addToBottom(new CommandRandomSlimesAction(debuffAmount)); + } + + public void upgrade() { + this.debuffAmount += 1; + updateDescription(); + } + + @Override + public AbstractOrb makeCopy() { + return new GeneralSlime(); + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/orbs/GreedOozeSlime.java b/src/main/java/slimebound/orbs/GreedOozeSlime.java index c62e348b4..1c86f422c 100644 --- a/src/main/java/slimebound/orbs/GreedOozeSlime.java +++ b/src/main/java/slimebound/orbs/GreedOozeSlime.java @@ -77,4 +77,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/HexSlime.java b/src/main/java/slimebound/orbs/HexSlime.java index 494581ecb..607c26090 100644 --- a/src/main/java/slimebound/orbs/HexSlime.java +++ b/src/main/java/slimebound/orbs/HexSlime.java @@ -108,4 +108,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/HungrySlime.java b/src/main/java/slimebound/orbs/HungrySlime.java new file mode 100644 index 000000000..4c73b829f --- /dev/null +++ b/src/main/java/slimebound/orbs/HungrySlime.java @@ -0,0 +1,47 @@ +package slimebound.orbs; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import slimebound.SlimeboundMod; +import slimebound.actions.SlimeAutoAttack; +import slimebound.vfx.SlimeFlareEffect; + +public class HungrySlime + extends SpawnedSlime { + public static final String ID = "Slimebound:HungrySlime"; + public static final String atlasString = SlimeboundMod.getResourcePath("orbs/cultist2.atlas"); + public static final String skeletonString = "images/monsters/theBottom/slimeM/skeleton.json"; + + public HungrySlime() { + + super(ID, new Color(1.0F, 100F / 255F, 100F / 255F, 100F), atlasString, skeletonString, false, true, 3, 0, true, new Color(.45F, .58F, .58F, 1), SlimeFlareEffect.OrbFlareColor.AGGRESSIVE, new Texture("slimeboundResources/SlimeboundImages/orbs/3.png")); + spawnVFX(); + + } + + public void updateDescription() { + this.description = this.descriptions[0] + this.passiveAmount + this.descriptions[1]; + } + + + public void activateEffectUnique() { + + + AbstractDungeon.actionManager.addToBottom(new SlimeAutoAttack(AbstractDungeon.player, this.passiveAmount, AbstractGameAction.AttackEffect.BLUNT_LIGHT, this, false, false, false, 0, false, 0, false)); + + } + + public void upgrade() { + this.passiveAmount += 2; + updateDescription(); + } + + + public AbstractOrb makeCopy() { + return new HungrySlime(); + } +} + diff --git a/src/main/java/slimebound/orbs/PoisonSlime.java b/src/main/java/slimebound/orbs/PoisonSlime.java index c514cbf01..74657b04c 100644 --- a/src/main/java/slimebound/orbs/PoisonSlime.java +++ b/src/main/java/slimebound/orbs/PoisonSlime.java @@ -23,6 +23,7 @@ public PoisonSlime() { public PoisonSlime(boolean topLevelVFX) { super(ID, new Color(.5F, 1.0F, .5F, 100F), atlasString, skeletonString, false, false, 3, 1, true, new Color(.58F, .81F, .35F, 1), SlimeFlareEffect.OrbFlareColor.POISON, new Texture("slimeboundResources/SlimeboundImages/orbs/4.png")); this.topSpawnVFX = topLevelVFX; + this.passiveAmount = 3; spawnVFX(); } @@ -40,10 +41,14 @@ public void activateEffectUnique() { } + public void upgrade() { + this.passiveAmount += 2; + updateDescription(); + } + public AbstractOrb makeCopy() { return new PoisonSlime(); } } - diff --git a/src/main/java/slimebound/orbs/ProtectorSlime.java b/src/main/java/slimebound/orbs/ProtectorSlime.java index 025886369..aae1c44ee 100644 --- a/src/main/java/slimebound/orbs/ProtectorSlime.java +++ b/src/main/java/slimebound/orbs/ProtectorSlime.java @@ -43,4 +43,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/RecklessSlime.java b/src/main/java/slimebound/orbs/RecklessSlime.java new file mode 100644 index 000000000..1fe6f9412 --- /dev/null +++ b/src/main/java/slimebound/orbs/RecklessSlime.java @@ -0,0 +1,47 @@ +package slimebound.orbs; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import slimebound.SlimeboundMod; +import slimebound.actions.SlimeAutoAttack; +import slimebound.vfx.SlimeFlareEffect; + +public class RecklessSlime + extends SpawnedSlime { + public static final String ID = "Slimebound:RecklessSlime"; + public static final String atlasString = SlimeboundMod.getResourcePath("orbs/champ2.atlas"); + public static final String skeletonString = "images/monsters/theBottom/slimeAltM/skeleton.json"; + + public RecklessSlime() { + + super(ID, new Color(1.0F, 100F / 255F, 100F / 255F, 100F), atlasString, skeletonString, false, true, 3, 0, true, new Color(.45F, .58F, .58F, 1), SlimeFlareEffect.OrbFlareColor.AGGRESSIVE, new Texture("slimeboundResources/SlimeboundImages/orbs/attackDebuff.png")); + spawnVFX(); + + } + + public void updateDescription() { + this.description = this.descriptions[0] + this.passiveAmount + this.descriptions[1]; + } + + + public void activateEffectUnique() { + + + AbstractDungeon.actionManager.addToBottom(new SlimeAutoAttack(AbstractDungeon.player, this.passiveAmount, AbstractGameAction.AttackEffect.BLUNT_LIGHT, this, false, false, false, 0, false, 0, false)); + + } + + public void upgrade() { + this.passiveAmount += 2; + updateDescription(); + } + + + public AbstractOrb makeCopy() { + return new RecklessSlime(); + } +} + diff --git a/src/main/java/slimebound/orbs/ScrapOozeSlime.java b/src/main/java/slimebound/orbs/ScrapOozeSlime.java index 58fb6ece7..2332cca18 100644 --- a/src/main/java/slimebound/orbs/ScrapOozeSlime.java +++ b/src/main/java/slimebound/orbs/ScrapOozeSlime.java @@ -91,4 +91,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/ShieldSlime.java b/src/main/java/slimebound/orbs/ShieldSlime.java index 8ec315b86..3b6d25dad 100644 --- a/src/main/java/slimebound/orbs/ShieldSlime.java +++ b/src/main/java/slimebound/orbs/ShieldSlime.java @@ -8,43 +8,37 @@ import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.SlimeboundMod; import slimebound.actions.SlimeAutoAttack; +import slimebound.actions.SlimeGainBlock; import slimebound.vfx.SlimeFlareEffect; -public class ShieldSlime - extends SpawnedSlime { +public class ShieldSlime extends SpawnedSlime { public static final String ID = "Slimebound:ShieldSlime"; public static final String atlasString = SlimeboundMod.getResourcePath("orbs/shield.atlas"); public static final String skeletonString = "images/monsters/theBottom/slimeS/skeleton.json"; - public ShieldSlime() { - - super(ID, new Color(0f, 1f, 1.00F, 100F), atlasString, skeletonString, false, false, 1, 3, true, new Color(0F, .4F, 1F, 1), SlimeFlareEffect.OrbFlareColor.LICKING, new Texture("slimeboundResources/SlimeboundImages/orbs/attackDefend.png")); + super(ID, new Color(0f, 1f, 1.00F, 100F), atlasString, skeletonString, false, false, 0, 3, false, new Color(0F, .4F, 1F, 1), SlimeFlareEffect.OrbFlareColor.LICKING, new Texture("slimeboundResources/SlimeboundImages/orbs/attackDefend.png")); this.debuffAmount = 3; this.extraFontColor = Color.ROYAL; + this.useDebuffForDescription = true; spawnVFX(); - } - public void updateDescription() { - this.description = this.descriptions[0] + this.passiveAmount + this.descriptions[1] + (this.debuffAmount) + this.descriptions[2]; + this.description = this.descriptions[0] + this.debuffAmount + this.descriptions[1]; } - public void activateEffectUnique() { - AbstractDungeon.actionManager.addToBottom(new SlimeAutoAttack(AbstractDungeon.player, this.passiveAmount, AbstractGameAction.AttackEffect.BLUNT_LIGHT, this, false, false, false, this.debuffAmount, false,0 , false)); + AbstractDungeon.actionManager.addToBottom(new SlimeGainBlock(AbstractDungeon.player, this.debuffAmount, this)); } + public void upgrade() { + this.debuffAmount += 2; + updateDescription(); + } public AbstractOrb makeCopy() { return new ShieldSlime(); } } - - - - - - diff --git a/src/main/java/slimebound/orbs/SlimingSlime.java b/src/main/java/slimebound/orbs/SlimingSlime.java index 51875fbec..3cba5b26b 100644 --- a/src/main/java/slimebound/orbs/SlimingSlime.java +++ b/src/main/java/slimebound/orbs/SlimingSlime.java @@ -7,23 +7,22 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.SlimeboundMod; +import slimebound.actions.SlimeApplyDebuff; import slimebound.actions.SlimeAutoAttack; import slimebound.vfx.SlimeFlareEffect; -public class SlimingSlime - extends SpawnedSlime { +public class SlimingSlime extends SpawnedSlime { public static final String ID = "Slimebound:SlimingSlime"; public static final String atlasString = SlimeboundMod.getResourcePath("orbs/sliming.atlas"); public static final String skeletonString = "images/monsters/theBottom/slimeAltS/skeleton.json"; public SlimingSlime() { - super(ID, new Color(1.0F, .5F, 1.0F, 100F), atlasString, skeletonString, false, true, 2, 2, true, new Color(.6F, .47F, .59F, 1), SlimeFlareEffect.OrbFlareColor.SLIMING, new Texture("slimeboundResources/SlimeboundImages/orbs/debuff2.png")); + super(ID, new Color(1.0F, .5F, 1.0F, 100F), atlasString, skeletonString, false, true, 0, 5, false, new Color(.6F, .47F, .59F, 1), SlimeFlareEffect.OrbFlareColor.SLIMING, new Texture("slimeboundResources/SlimeboundImages/orbs/debuff2.png")); this.extraFontColor = new Color(.7F, .3F, .7F, 1F); - this.debuffAmount = 2; - + this.debuffAmount = 5; + this.useDebuffForDescription = true; spawnVFX(); - } @Override @@ -33,24 +32,23 @@ public void postSpawnEffects() { } public void updateDescription() { - this.description = this.descriptions[0] + this.passiveAmount + this.descriptions[1] + (this.debuffAmount) + this.descriptions[2]; + this.description = this.descriptions[0] + this.debuffAmount + this.descriptions[1]; } public void updateSlimedNumber() { - this.slimeBonus = SlimeboundMod.getAcidTongueBonus(AbstractDungeon.player); } public void activateEffectUnique() { - - AbstractDungeon.actionManager.addToBottom(new SlimeAutoAttack(AbstractDungeon.player, this.passiveAmount, AbstractGameAction.AttackEffect.BLUNT_LIGHT, this, false, true, false, debuffAmount + SlimeboundMod.getAcidTongueBonus(AbstractDungeon.player), false, 0, false)); - + AbstractDungeon.actionManager.addToBottom(new SlimeApplyDebuff(AbstractDungeon.player, this.debuffAmount + SlimeboundMod.getAcidTongueBonus(AbstractDungeon.player), this)); } + public void upgrade() { + this.debuffAmount += 3; + updateDescription(); + } public AbstractOrb makeCopy() { return new SlimingSlime(); } -} - - +} \ No newline at end of file diff --git a/src/main/java/slimebound/orbs/SlowingSlime.java b/src/main/java/slimebound/orbs/SlowingSlime.java index f63197626..43236f62f 100644 --- a/src/main/java/slimebound/orbs/SlowingSlime.java +++ b/src/main/java/slimebound/orbs/SlowingSlime.java @@ -46,8 +46,8 @@ public void postSpawnEffects() { this.stopwatch = new StopwatchParticle(this); if(CharacterSelectScreenPatches.characters[1].isOriginal()){ - AbstractDungeon.effectList.add(this.antennae); - AbstractDungeon.effectList.add(this.stopwatch); + AbstractDungeon.effectList.add(this.antennae); + AbstractDungeon.effectList.add(this.stopwatch); } } @@ -94,4 +94,3 @@ public AbstractOrb makeCopy() { } } - diff --git a/src/main/java/slimebound/orbs/SpawnedSlime.java b/src/main/java/slimebound/orbs/SpawnedSlime.java index f5a5c118c..e23e28c0e 100644 --- a/src/main/java/slimebound/orbs/SpawnedSlime.java +++ b/src/main/java/slimebound/orbs/SpawnedSlime.java @@ -55,6 +55,7 @@ public abstract class SpawnedSlime public float NUM_Y_OFFSET = -35.0F * Settings.scale; public AbstractCard lockedCard; public boolean upgraded = false; + protected boolean useDebuffForDescription = false; public boolean showPassive = true; public boolean activatedThisTurn = false; public int UniqueFocus; @@ -163,19 +164,19 @@ public SpawnedSlime(String ID, Color projectileColor, String atlasString, String //this.renderBehind=true; SkeletonJson json = new SkeletonJson(this.atlas); - if (this instanceof DarklingSlime) { - json.setScale(Settings.scale * .45F); + if ((this instanceof DarklingSlime) || (this instanceof RecklessSlime)) { + json.setScale(Settings.scale * .5F); } else { if (medScale) { - json.setScale(Settings.scale / .85F * .7F); + json.setScale(Settings.scale / .85F * .4F); if (alt) { this.yOffset = -7F * Settings.scale; } else { this.yOffset = -27F * Settings.scale; } } else { - json.setScale(Settings.scale / .5F * .7F); + json.setScale(Settings.scale / .5F * .4F); if (alt) { this.yOffset = -17F * Settings.scale; } else { @@ -279,24 +280,22 @@ public void update() { */ public void applyFocus() { - super.applyFocus(); AbstractPower power = AbstractDungeon.player.getPower(PotencyPower.POWER_ID); int bonus = 0; if (this instanceof TorchHeadSlime && AbstractDungeon.player.hasPower(StrengthPower.POWER_ID)) bonus = AbstractDungeon.player.getPower(StrengthPower.POWER_ID).amount; if (power != null) { - this.passiveAmount = this.basePassiveAmount + power.amount + this.UniqueFocus + bonus; - this.debuffAmount = this.debuffBaseAmount + (power.amount / 2) ; - + this.passiveAmount = Math.max(this.passiveAmount, this.basePassiveAmount + power.amount + this.UniqueFocus + bonus); + this.debuffAmount = Math.max(this.debuffAmount, this.debuffBaseAmount + (power.amount / 2)); } else { - this.passiveAmount = this.basePassiveAmount + this.UniqueFocus + bonus; - this.debuffAmount = this.debuffBaseAmount; - + this.passiveAmount = Math.max(this.passiveAmount, this.basePassiveAmount + this.UniqueFocus + bonus); + this.debuffAmount = Math.max(this.debuffAmount, this.debuffBaseAmount); } updateDescription(); } + public void applyUniqueFocus(int StrAmount) { this.UniqueFocus = this.UniqueFocus + StrAmount; @@ -306,6 +305,14 @@ public void applyUniqueFocus(int StrAmount) { } + @Override + public void updateDescription() { + if (useDebuffForDescription) { + this.description = this.descriptions[0] + this.debuffAmount + this.descriptions[1]; + } + } + + public void onEvoke() { if (!noEvokeBonus) { if (this instanceof ScrapOozeSlime) { @@ -463,24 +470,52 @@ public void render(SpriteBatch sb) { } } + public void upgrade() { - public void renderText(SpriteBatch sb) { - if (this.extraFontColor != null) { + } + public void renderText(SpriteBatch sb) { + if (this instanceof ShieldSlime || this instanceof SlimingSlime) { + // For ShieldSlime and SlimingSlime, only show the debuff number + FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, + Integer.toString(this.debuffAmount + this.slimeBonus), + this.cX + this.NUM_X_OFFSET, + this.cY + this.NUM_Y_OFFSET, + this.extraFontColor != null ? this.extraFontColor : this.c, + this.fontScale); + } else if (this.extraFontColor != null) { + // For other slimes with extra font color, show both numbers float fontOffset = 26 * Settings.scale; if (this.passiveAmount > 9) fontOffset = fontOffset + (6 * Settings.scale); - FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, this.passiveAmount + "/", this.cX + this.NUM_X_OFFSET, this.cY + this.NUM_Y_OFFSET, this.c, this.fontScale); - - - FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, Integer.toString(this.debuffAmount + this.slimeBonus), this.cX + this.NUM_X_OFFSET + fontOffset, this.cY + this.NUM_Y_OFFSET + 1F, this.extraFontColor, this.fontScale); - + FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, + this.passiveAmount + "/", + this.cX + this.NUM_X_OFFSET, + this.cY + this.NUM_Y_OFFSET, + this.c, + this.fontScale); + FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, + Integer.toString(this.debuffAmount + this.slimeBonus), + this.cX + this.NUM_X_OFFSET + fontOffset, + this.cY + this.NUM_Y_OFFSET + 1F, + this.extraFontColor, + this.fontScale); } else if (this instanceof PoisonSlime) { - - FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, this.passiveAmount + " All", this.cX + this.NUM_X_OFFSET - (Settings.scale * 0.01F), this.cY + this.NUM_Y_OFFSET, this.c, this.fontScale); + // For PoisonSlime, show "X All" + FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, + this.passiveAmount + " All", + this.cX + this.NUM_X_OFFSET - (Settings.scale * 0.01F), + this.cY + this.NUM_Y_OFFSET, + this.c, + this.fontScale); } else { - FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, Integer.toString(this.passiveAmount), this.cX + this.NUM_X_OFFSET, this.cY + this.NUM_Y_OFFSET, this.c, this.fontScale); - + // For all other slimes, show only the passive amount + FontHelper.renderFontCentered(sb, FontHelper.cardEnergyFont_L, + Integer.toString(this.passiveAmount), + this.cX + this.NUM_X_OFFSET, + this.cY + this.NUM_Y_OFFSET, + this.c, + this.fontScale); } } @@ -488,4 +523,3 @@ public void renderText(SpriteBatch sb) { - diff --git a/src/main/java/slimebound/orbs/TarrSlime.java b/src/main/java/slimebound/orbs/TarrSlime.java new file mode 100644 index 000000000..8ea91bebd --- /dev/null +++ b/src/main/java/slimebound/orbs/TarrSlime.java @@ -0,0 +1,66 @@ +package slimebound.orbs; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; +import slimebound.SlimeboundMod; +import slimebound.actions.RotateAction; +import slimebound.vfx.SlimeFlareEffect; +import slimebound.vfx.TarrGlowParticle; + +public class TarrSlime extends SpawnedSlime { + public static final String ID = "Slimebound:TarrSlime"; + public static final String atlasString = SlimeboundMod.getResourcePath("orbs/tarr.atlas"); + public static final String skeletonString = "images/monsters/theBottom/slimeS/skeleton.json"; + + public float attachmentX; + public float attachmentY; + public Boolean stopShiny = false; + private float shinyTimer; + public TarrSlime() { + super(ID, new Color(0.5f, 0.5f, 0.8f, 1f), atlasString, skeletonString, false, false, 0, 0, false, new Color(0.4F, 0.4F, 0.8F, 1), SlimeFlareEffect.OrbFlareColor.LICKING, new Texture("slimeboundResources/SlimeboundImages/orbs/attackDebuff.png")); + this.extraFontColor = Color.PURPLE; + spawnVFX(); + } + + @Override + public void updateDescription() { + this.description = this.descriptions[0]; + } + + @Override + public void activateEffectUnique() { + AbstractDungeon.actionManager.addToBottom(new RotateAction(TarrSlime.class)); + } + + @Override + public void render(SpriteBatch sb) { + super.render(sb); + this.attachmentX = (this.skeleton.findBone("eyeback").getX()) * Settings.scale; + this.attachmentY = (this.skeleton.findBone("eyeback").getY()) * Settings.scale; + + + if (!this.stopShiny) updateShiny(); + } + + private void updateShiny() { + + this.shinyTimer -= Gdx.graphics.getDeltaTime(); + if (this.shinyTimer < 0.0F && !Settings.DISABLE_EFFECTS) { + this.shinyTimer = 0.2F; + + AbstractDungeon.topLevelEffects.add(new TarrGlowParticle(this)); + + } + + } + + @Override + public AbstractOrb makeCopy() { + return new TarrSlime(); + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/orbs/TorchHeadSlime.java b/src/main/java/slimebound/orbs/TorchHeadSlime.java index fc0b4796c..f16b207ef 100644 --- a/src/main/java/slimebound/orbs/TorchHeadSlime.java +++ b/src/main/java/slimebound/orbs/TorchHeadSlime.java @@ -67,4 +67,3 @@ public void update() { } } - diff --git a/src/main/java/slimebound/patches/MaxOrbsPatch.java b/src/main/java/slimebound/patches/MaxOrbsPatch.java index 4d0774b95..10032da1c 100644 --- a/src/main/java/slimebound/patches/MaxOrbsPatch.java +++ b/src/main/java/slimebound/patches/MaxOrbsPatch.java @@ -14,7 +14,7 @@ public class MaxOrbsPatch { public static SpireReturn Prefix(AbstractPlayer obj) { - if (obj instanceof SlimeboundCharacter && obj.maxOrbs == 5) { + if (obj instanceof SlimeboundCharacter && obj.maxOrbs == 12) { AbstractDungeon.effectList.add(new ThoughtBubble(obj.dialogX, obj.dialogY, 3.0F, AbstractPlayer.MSG[3], true)); return SpireReturn.Return(null); } diff --git a/src/main/java/slimebound/patches/OrbPositionPatch.java b/src/main/java/slimebound/patches/OrbPositionPatch.java index 6529dcf2c..8d3460280 100644 --- a/src/main/java/slimebound/patches/OrbPositionPatch.java +++ b/src/main/java/slimebound/patches/OrbPositionPatch.java @@ -1,6 +1,7 @@ package slimebound.patches; import charbosses.orbs.AbstractEnemyOrb; +import com.badlogic.gdx.math.Vector2; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.core.Settings; @@ -8,34 +9,40 @@ import com.megacrit.cardcrawl.orbs.AbstractOrb; import slimebound.characters.SlimeboundCharacter; +import java.util.ArrayList; +import java.util.Random; + @SpirePatch(clz = AbstractOrb.class, method = "setSlot", paramtypez = { int.class, int.class}) public class OrbPositionPatch { - + // Adjustable parameters + private static final float BASE_X_OFFSET = 200F * Settings.scale; + private static final float X_SPACING = 40F * Settings.scale; + private static final float BASE_Y_OFFSET = 0F * Settings.scale; + private static final float Y_SPACING = 30F * Settings.scale; // Reduced for a tighter zig-zag public static SpireReturn Prefix(AbstractOrb abstractOrb_instance, int slotNum, int maxOrbs) { - if (AbstractDungeon.player instanceof SlimeboundCharacter && !(abstractOrb_instance instanceof AbstractEnemyOrb)) { - float xStartOffset = AbstractDungeon.player.drawX + Settings.scale * -150F; - float yStartOffset = AbstractDungeon.player.drawY + Settings.scale * -130F; - float ySpaceAlternatingOffset = -20 * Settings.scale; - float xSpaceBetweenSlots = 110 * Settings.scale; - - abstractOrb_instance.tX = xStartOffset + (xSpaceBetweenSlots * slotNum); - abstractOrb_instance.tY = yStartOffset + (slotNum % 2) * ySpaceAlternatingOffset; - + float xPos = AbstractDungeon.player.drawX + BASE_X_OFFSET + (slotNum * X_SPACING); + float yPos = AbstractDungeon.player.drawY + BASE_Y_OFFSET; + + // Create the zig-zag pattern + if (slotNum % 2 == 0) { + // Even-numbered slots go up + yPos += Y_SPACING; + } else { + // Odd-numbered slots go down + yPos -= Y_SPACING; + } + + abstractOrb_instance.tX = xPos; + abstractOrb_instance.tY = yPos; abstractOrb_instance.hb.move(abstractOrb_instance.tX, abstractOrb_instance.tY); - return SpireReturn.Return(null); } else { - return SpireReturn.Continue(); - } - } - -} - +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/ComboAttackPower.java b/src/main/java/slimebound/powers/ComboAttackPower.java index ce271aa36..d73a1abfa 100644 --- a/src/main/java/slimebound/powers/ComboAttackPower.java +++ b/src/main/java/slimebound/powers/ComboAttackPower.java @@ -5,12 +5,10 @@ import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.core.CardCrawlGame; -import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import slimebound.SlimeboundMod; import slimebound.actions.CommandAction; -import slimebound.actions.TrigggerSpecificSlimeAttackAction; public class ComboAttackPower extends TwoAmountPower { diff --git a/src/main/java/slimebound/powers/CommandOnPlayPower.java b/src/main/java/slimebound/powers/CommandOnPlayPower.java index 357f88b76..8c29d7d77 100644 --- a/src/main/java/slimebound/powers/CommandOnPlayPower.java +++ b/src/main/java/slimebound/powers/CommandOnPlayPower.java @@ -11,9 +11,7 @@ import com.megacrit.cardcrawl.orbs.AbstractOrb; import com.megacrit.cardcrawl.powers.AbstractPower; import slimebound.SlimeboundMod; -import slimebound.actions.TrigggerSpecificSlimeAttackAction; -import slimebound.orbs.SpawnedSlime; -import theHexaghost.HexaMod; +import slimebound.actions.TriggerSpecificSlimeAttackAction; import downfall.util.TextureLoader; public class CommandOnPlayPower extends AbstractPower implements CloneablePowerInterface { @@ -44,7 +42,7 @@ public void onAfterCardPlayed(AbstractCard usedCard) { flash(); AbstractOrb o = SlimeboundMod.getLeadingSlime(); if (o != null) { - addToBot(new TrigggerSpecificSlimeAttackAction(o)); + addToBot(new TriggerSpecificSlimeAttackAction(o)); } addToBot(new ReducePowerAction(AbstractDungeon.player, AbstractDungeon.player, this, 1)); } diff --git a/src/main/java/slimebound/powers/HauntingLickPower.java b/src/main/java/slimebound/powers/HauntingLickPower.java new file mode 100644 index 000000000..d48183dc6 --- /dev/null +++ b/src/main/java/slimebound/powers/HauntingLickPower.java @@ -0,0 +1,53 @@ +package slimebound.powers; + +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.utility.UseCardAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.powers.AbstractPower; +import com.megacrit.cardcrawl.powers.VulnerablePower; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; + +public class HauntingLickPower extends AbstractPower { + public static final String POWER_ID = "Slimebound:HauntingLickPower"; + public static final String NAME = "Haunting Lick"; + public static final String IMG = "powers/hauntinglick.png"; + public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + public static PowerType POWER_TYPE = PowerType.BUFF; + public static String[] DESCRIPTIONS; + + public HauntingLickPower(AbstractCreature owner, int amount) { + this.name = NAME; + this.ID = POWER_ID; + this.owner = owner; + this.img = new Texture(SlimeboundMod.getResourcePath(IMG)); + this.type = POWER_TYPE; + this.amount = amount; + DESCRIPTIONS = CardCrawlGame.languagePack.getPowerStrings(this.ID).DESCRIPTIONS; + this.name = CardCrawlGame.languagePack.getPowerStrings(this.ID).NAME; + updateDescription(); + } + + public void updateDescription() { + this.description = DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1]; + } + + @Override + public void onUseCard(AbstractCard card, UseCardAction action) { + if (card.hasTag(SlimeboundMod.LICK)) { + // flash(); + AbstractMonster m = null; + if (action.target != null && action.target instanceof AbstractMonster) { + m = (AbstractMonster) action.target; + } + if (m != null) { + this.addToBot(new ApplyPowerAction(m, this.owner, new VulnerablePower(m, this.amount, false), this.amount)); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/MegaLickPower.java b/src/main/java/slimebound/powers/MegaLickPower.java new file mode 100644 index 000000000..f32c3c6b8 --- /dev/null +++ b/src/main/java/slimebound/powers/MegaLickPower.java @@ -0,0 +1,53 @@ +package slimebound.powers; + +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.utility.UseCardAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.powers.AbstractPower; +import com.megacrit.cardcrawl.powers.WeakPower; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; + +public class MegaLickPower extends AbstractPower { + public static final String POWER_ID = "Slimebound:MegaLickPower"; + public static final String NAME = "Mega Lick"; + public static final String IMG = "powers/megalick.png"; + public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + public static PowerType POWER_TYPE = PowerType.BUFF; + public static String[] DESCRIPTIONS; + + public MegaLickPower(AbstractCreature owner, int amount) { + this.name = NAME; + this.ID = POWER_ID; + this.owner = owner; + this.img = new Texture(SlimeboundMod.getResourcePath(IMG)); + this.type = POWER_TYPE; + this.amount = amount; + DESCRIPTIONS = CardCrawlGame.languagePack.getPowerStrings(this.ID).DESCRIPTIONS; + this.name = CardCrawlGame.languagePack.getPowerStrings(this.ID).NAME; + updateDescription(); + } + + public void updateDescription() { + this.description = DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1]; + } + + @Override + public void onUseCard(AbstractCard card, UseCardAction action) { + if (card.hasTag(SlimeboundMod.LICK)) { + flash(); + AbstractMonster m = null; + if (action.target != null && action.target instanceof AbstractMonster) { + m = (AbstractMonster) action.target; + } + if (m != null) { + this.addToBot(new ApplyPowerAction(m, this.owner, new WeakPower(m, this.amount, false), this.amount)); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/NibblePower.java b/src/main/java/slimebound/powers/NibblePower.java new file mode 100644 index 000000000..2aab702ff --- /dev/null +++ b/src/main/java/slimebound/powers/NibblePower.java @@ -0,0 +1,54 @@ +package slimebound.powers; + +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.AbstractGameAction; +import com.megacrit.cardcrawl.actions.common.DamageAction; +import com.megacrit.cardcrawl.actions.utility.UseCardAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.powers.AbstractPower; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; + +public class NibblePower extends AbstractPower { + public static final String POWER_ID = "Slimebound:NibblePower"; + public static final String NAME = "Nibble"; + public static final String IMG = "powers/nibble.png"; + public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + public static PowerType POWER_TYPE = PowerType.BUFF; + public static String[] DESCRIPTIONS; + + public NibblePower(AbstractCreature owner, int amount) { + this.name = NAME; + this.ID = POWER_ID; + this.owner = owner; + this.img = new Texture(SlimeboundMod.getResourcePath(IMG)); + this.type = POWER_TYPE; + this.amount = amount; + DESCRIPTIONS = CardCrawlGame.languagePack.getPowerStrings(this.ID).DESCRIPTIONS; + this.name = CardCrawlGame.languagePack.getPowerStrings(this.ID).NAME; + updateDescription(); + } + + public void updateDescription() { + this.description = DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1]; + } + + @Override + public void onUseCard(AbstractCard card, UseCardAction action) { + if (card.hasTag(SlimeboundMod.LICK)) { + // flash(); + AbstractMonster m = null; + if (action.target != null && action.target instanceof AbstractMonster) { + m = (AbstractMonster) action.target; + } + if (m != null) { + this.addToBot(new DamageAction(m, new DamageInfo(this.owner, this.amount, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_LIGHT)); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/PainToPowerPower.java b/src/main/java/slimebound/powers/PainToPowerPower.java new file mode 100644 index 000000000..42edae773 --- /dev/null +++ b/src/main/java/slimebound/powers/PainToPowerPower.java @@ -0,0 +1,54 @@ +package slimebound.powers; + +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.powers.AbstractPower; +import com.megacrit.cardcrawl.powers.StrengthPower; +import hermit.powers.Bruise; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; + +public class PainToPowerPower extends AbstractPower { + public static final String POWER_ID = "Slimebound:PainToPowerPower"; + public static final String NAME = "Pain to Power"; + public static final String IMG = "powers/paintopower.png"; + public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + public static PowerType POWER_TYPE = PowerType.BUFF; + public static String[] DESCRIPTIONS; + private int bruiseThreshold; + + public PainToPowerPower(AbstractCreature owner, int amount, int bruiseThreshold) { + this.name = NAME; + this.ID = POWER_ID; + this.owner = owner; + this.amount = amount; + this.bruiseThreshold = bruiseThreshold; + this.img = new Texture(SlimeboundMod.getResourcePath(IMG)); + this.type = POWER_TYPE; + DESCRIPTIONS = CardCrawlGame.languagePack.getPowerStrings(this.ID).DESCRIPTIONS; + this.name = CardCrawlGame.languagePack.getPowerStrings(this.ID).NAME; + updateDescription(); + } + + public void updateDescription() { + this.description = DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1] + this.bruiseThreshold + DESCRIPTIONS[2]; + } + + @Override + public void atEndOfTurn(boolean isPlayer) { + if (isPlayer) { + int bruiseAmount = 0; + if (owner.hasPower(Bruise.POWER_ID)) { + bruiseAmount = owner.getPower(Bruise.POWER_ID).amount; + } + int strengthGain = (bruiseAmount / bruiseThreshold) * this.amount; + if (strengthGain > 0) { + flash(); + addToBot(new ApplyPowerAction(owner, owner, new StrengthPower(owner, strengthGain), strengthGain)); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/SamplingLickPower.java b/src/main/java/slimebound/powers/SamplingLickPower.java new file mode 100644 index 000000000..bb8b9d493 --- /dev/null +++ b/src/main/java/slimebound/powers/SamplingLickPower.java @@ -0,0 +1,45 @@ +package slimebound.powers; + +import com.badlogic.gdx.graphics.Texture; +import com.megacrit.cardcrawl.actions.common.GainBlockAction; +import com.megacrit.cardcrawl.actions.utility.UseCardAction; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.core.AbstractCreature; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.powers.AbstractPower; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import slimebound.SlimeboundMod; + +public class SamplingLickPower extends AbstractPower { + public static final String POWER_ID = "Slimebound:SamplingLickPower"; + public static final String NAME = "Sampling Lick"; + public static final String IMG = "powers/samplinglick.png"; + public static final Logger logger = LogManager.getLogger(SlimeboundMod.class.getName()); + public static PowerType POWER_TYPE = PowerType.BUFF; + public static String[] DESCRIPTIONS; + + public SamplingLickPower(AbstractCreature owner, int amount) { + this.name = NAME; + this.ID = POWER_ID; + this.owner = owner; + this.img = new Texture(SlimeboundMod.getResourcePath(IMG)); + this.type = POWER_TYPE; + this.amount = amount; + DESCRIPTIONS = CardCrawlGame.languagePack.getPowerStrings(this.ID).DESCRIPTIONS; + this.name = CardCrawlGame.languagePack.getPowerStrings(this.ID).NAME; + updateDescription(); + } + + public void updateDescription() { + this.description = DESCRIPTIONS[0] + this.amount + DESCRIPTIONS[1]; + } + + @Override + public void onUseCard(AbstractCard card, UseCardAction action) { + if (card.hasTag(SlimeboundMod.LICK)) { + // flash(); + this.addToBot(new GainBlockAction(this.owner, this.owner, this.amount)); + } + } +} \ No newline at end of file diff --git a/src/main/java/slimebound/powers/SlimedPower.java b/src/main/java/slimebound/powers/SlimedPower.java index c9c2e8577..d751c70c6 100644 --- a/src/main/java/slimebound/powers/SlimedPower.java +++ b/src/main/java/slimebound/powers/SlimedPower.java @@ -8,15 +8,23 @@ import com.megacrit.cardcrawl.actions.common.GainBlockAction; import com.megacrit.cardcrawl.actions.common.ReducePowerAction; import com.megacrit.cardcrawl.actions.common.RemoveSpecificPowerAction; +import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.core.AbstractCreature; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.orbs.AbstractOrb; import com.megacrit.cardcrawl.powers.AbstractPower; import com.megacrit.cardcrawl.powers.PoisonPower; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import slimebound.SlimeboundMod; +import slimebound.actions.TriggerSpecificSlimeAttackAction; +import slimebound.cards.AfterDinnerTackle; +import slimebound.cards.OneTwoCombo; +import slimebound.orbs.HungrySlime; +import slimebound.orbs.SpawnedSlime; import slimebound.relics.AbsorbEndCombat; import slimebound.relics.AbsorbEndCombatUpgraded; import slimebound.vfx.FakeFlashAtkImgEffect; @@ -106,11 +114,27 @@ public int onAttacked(DamageInfo info, int damageAmount) { if (this.source.hasPower(GluttonyPower.POWER_ID)) { ((GluttonyPower) this.source.getPower(GluttonyPower.POWER_ID)).activate(); } + + triggerHungrySlimes(); + for (AbstractCard q : AbstractDungeon.player.discardPile.group) { + if (q instanceof AfterDinnerTackle) { + ((AfterDinnerTackle) q).onConsume(); + } + } } return super.onAttacked(info, damageAmount); } + private void triggerHungrySlimes() { + AbstractPlayer p = AbstractDungeon.player; + for (AbstractOrb orb : p.orbs) { + if (orb instanceof HungrySlime) { + AbstractDungeon.actionManager.addToBottom(new TriggerSpecificSlimeAttackAction((SpawnedSlime)orb)); + } + } + } + @Override public void onRemove() { super.onRemove(); diff --git a/src/main/java/slimebound/relics/TarBlob.java b/src/main/java/slimebound/relics/TarBlob.java index 8e2c93fe2..a2dcfa363 100644 --- a/src/main/java/slimebound/relics/TarBlob.java +++ b/src/main/java/slimebound/relics/TarBlob.java @@ -5,6 +5,7 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.helpers.ImageMaster; import com.megacrit.cardcrawl.relics.AbstractRelic; +import slimebound.actions.SlimeSpawnAction; import slimebound.characters.SlimeboundCharacter; public class TarBlob extends CustomRelic { @@ -30,7 +31,7 @@ public void onUnequip() { public void atBattleStartPreDraw() { this.flash(); - com.megacrit.cardcrawl.dungeons.AbstractDungeon.actionManager.addToBottom(new com.megacrit.cardcrawl.actions.defect.DecreaseMaxOrbAction(1)); + AbstractDungeon.actionManager.addToBottom(new SlimeSpawnAction(new slimebound.orbs.TarrSlime(), false, true)); } diff --git a/src/main/java/slimebound/vfx/TarrGlowParticle.java b/src/main/java/slimebound/vfx/TarrGlowParticle.java new file mode 100644 index 000000000..919ebdfd5 --- /dev/null +++ b/src/main/java/slimebound/vfx/TarrGlowParticle.java @@ -0,0 +1,85 @@ +package slimebound.vfx; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.math.MathUtils; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.helpers.ImageMaster; +import com.megacrit.cardcrawl.vfx.AbstractGameEffect; +import slimebound.orbs.GreedOozeSlime; +import slimebound.orbs.TarrSlime; + +public class TarrGlowParticle extends AbstractGameEffect { + private static float xOffset = -30F * Settings.scale; + private static float yOffset = -100F * Settings.scale; + private float effectDuration; + private float x; + private float y; + private float vY; + private float alpha; + private float targetScale; + private TarrSlime o; + private TextureAtlas.AtlasRegion img; + + public TarrGlowParticle(TarrSlime o) { + this.o = o; + this.img = ImageMaster.ROOM_SHINE_2; + this.effectDuration = MathUtils.random(1.0F, 3.0F); + this.duration = this.effectDuration; + this.startingDuration = this.effectDuration; + this.x = this.o.attachmentX + this.o.animX + this.o.cX + xOffset + (MathUtils.random(-50.0F, 50.0F) * Settings.scale); + this.y = this.o.attachmentY + this.o.animY + this.o.cY + yOffset + (MathUtils.random(30.0F, -10.0F) * Settings.scale); + this.vY = MathUtils.random(10.0F, 40.0F) * Settings.scale; + this.alpha = MathUtils.random(0.5F, .7F); + this.color = new Color(1.0F, 1.0F, MathUtils.random(0.6F, 0.9F), this.alpha); + this.scale = 0.02F; + this.targetScale = MathUtils.random(0.3F, .7F); + this.rotation = MathUtils.random(-3.0F, 3.0F); + //this.renderBehind = true; + } + + public void update() { + if (this.vY != 0.0F) { + this.y += this.vY * Gdx.graphics.getDeltaTime(); + MathUtils.lerp(this.vY, 0.0F, Gdx.graphics.getDeltaTime() * 10.0F); + if (this.vY < 0.5F) { + this.vY = 0.0F; + } + } + + float t = (this.effectDuration - this.duration) * 2.0F; + if (t > 1.0F) { + t = 1.0F; + } + + float tmp = Interpolation.bounceOut.apply(0.01F, this.targetScale, t); + this.scale = tmp * tmp * Settings.scale; + this.duration -= Gdx.graphics.getDeltaTime(); + if (this.duration < 0.0F) { + this.isDone = true; + } else if (this.duration < this.effectDuration / 2.0F) { + this.color.a = Interpolation.exp5In.apply(0.0F, this.alpha, this.duration / (this.effectDuration / 2.0F)); + } + + } + + public void render(SpriteBatch sb) { + sb.setColor(this.color); + sb.setBlendFunction(770, 1); + sb.draw(this.img, this.x, this.y, (float) this.img.packedWidth / 2.0F, (float) this.img.packedHeight / 2.0F, (float) this.img.packedWidth, (float) this.img.packedHeight, this.scale * MathUtils.random(0.9F, 1.1F), this.scale * MathUtils.random(0.7F, 1.3F), this.rotation); + sb.setBlendFunction(770, 771); + } + + public void finish() { + this.isDone = true; + + } + + + public void dispose() { + this.isDone = true; + } +} diff --git a/src/main/java/sneckomod/relics/SuperSneckoEye.java b/src/main/java/sneckomod/relics/SuperSneckoEye.java index 8fab0738f..333cac08c 100644 --- a/src/main/java/sneckomod/relics/SuperSneckoEye.java +++ b/src/main/java/sneckomod/relics/SuperSneckoEye.java @@ -9,6 +9,7 @@ import com.megacrit.cardcrawl.powers.ConfusionPower; import com.megacrit.cardcrawl.relics.SneckoEye; import downfall.util.TextureLoader; +import expansioncontent.util.DownfallAchievementUnlocker; import sneckomod.SneckoMod; public class SuperSneckoEye extends CustomRelic { @@ -63,12 +64,13 @@ public void update() { }); } - public void onEquip() { - if(!added_hand_size) { - AbstractDungeon.player.masterHandSize += 2; - added_hand_size = true; - } +public void onEquip() { + if(!added_hand_size) { + AbstractDungeon.player.masterHandSize += 2; + added_hand_size = true; + DownfallAchievementUnlocker.unlockAchievement("MASTER_OF_CONFUSION"); } +} public void onUnequip() { AbstractDungeon.player.masterHandSize -= 2; diff --git a/src/main/java/theHexaghost/cards/ApocalypseNow.java b/src/main/java/theHexaghost/cards/ApocalypseNow.java index 72f42a7e3..d82d1bb76 100644 --- a/src/main/java/theHexaghost/cards/ApocalypseNow.java +++ b/src/main/java/theHexaghost/cards/ApocalypseNow.java @@ -2,7 +2,6 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.common.GainEnergyAction; -import com.megacrit.cardcrawl.actions.common.LoseHPAction; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.monsters.AbstractMonster; import downfall.util.CardIgnore; diff --git a/src/main/java/theHexaghost/cards/seals/AbstractSealCard.java b/src/main/java/theHexaghost/cards/seals/AbstractSealCard.java index 6c612e90c..ea6216b9d 100644 --- a/src/main/java/theHexaghost/cards/seals/AbstractSealCard.java +++ b/src/main/java/theHexaghost/cards/seals/AbstractSealCard.java @@ -5,6 +5,7 @@ import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.monsters.AbstractMonster; +import expansioncontent.util.DownfallAchievementUnlocker; import theHexaghost.cards.AbstractHexaCard; import theHexaghost.relics.TheBrokenSeal; import theHexaghost.vfx.BrokenSealEffect; @@ -85,6 +86,7 @@ public void use(AbstractPlayer abstractPlayer, AbstractMonster abstractMonster) addToTop(new VFXAction(new BrokenSealEffect(first_upgraded,second_upgraded,third_upgraded,fourth_upgraded,fifth_upgraded,sixth_upgraded) )); + DownfallAchievementUnlocker.unlockAchievement("THE_BROKEN_SEAL"); } } } @@ -95,4 +97,4 @@ public static boolean playedAll(ArrayList sList) { } public abstract void realUse(AbstractPlayer p, AbstractMonster m); -} +} \ No newline at end of file diff --git a/src/main/java/theHexaghost/events/CouncilOfGhosts_Hexa.java b/src/main/java/theHexaghost/events/CouncilOfGhosts_Hexa.java index 99711f7db..2c6570760 100644 --- a/src/main/java/theHexaghost/events/CouncilOfGhosts_Hexa.java +++ b/src/main/java/theHexaghost/events/CouncilOfGhosts_Hexa.java @@ -10,6 +10,8 @@ import com.megacrit.cardcrawl.events.AbstractImageEvent; import com.megacrit.cardcrawl.localization.EventStrings; import com.megacrit.cardcrawl.vfx.cardManip.ShowCardAndObtainEffect; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import theHexaghost.HexaMod; import theHexaghost.cards.CouncilsJustice; @@ -127,7 +129,9 @@ private void nukeStrikes() { AbstractDungeon.topLevelEffects.add(new com.megacrit.cardcrawl.vfx.cardManip.PurgeCardEffect(c, com.megacrit.cardcrawl.core.Settings.WIDTH * (AbstractDungeon.cardRng.random(0.25F,0.75F)), com.megacrit.cardcrawl.core.Settings.HEIGHT * (AbstractDungeon.cardRng.random(0.25F,0.75F)))); AbstractDungeon.player.masterDeck.removeCard(c); cardsRemoved.add(c.cardID); + DownfallAchievementVariables.councilStrikesRemoved++; } + checkCouncilAchievement(); } private void nukeDefends() { @@ -142,10 +146,17 @@ private void nukeDefends() { AbstractDungeon.topLevelEffects.add(new com.megacrit.cardcrawl.vfx.cardManip.PurgeCardEffect(c, com.megacrit.cardcrawl.core.Settings.WIDTH * (AbstractDungeon.cardRng.random(0.25F,0.75F)), com.megacrit.cardcrawl.core.Settings.HEIGHT * (AbstractDungeon.cardRng.random(0.25F,0.75F)))); AbstractDungeon.player.masterDeck.removeCard(c); cardsRemoved.add(c.cardID); - + DownfallAchievementVariables.councilDefendsRemoved++; } + checkCouncilAchievement(); } + private void checkCouncilAchievement() { + if (DownfallAchievementVariables.councilStrikesRemoved >= 4 && + DownfallAchievementVariables.councilDefendsRemoved >= 4) { + DownfallAchievementUnlocker.unlockAchievement("GHOSTLY"); + } + } private enum CurScreen { INTRO, diff --git a/src/main/java/theHexaghost/ghostflames/BolsteringGhostflame.java b/src/main/java/theHexaghost/ghostflames/BolsteringGhostflame.java index 06fb6ff69..3937fbb72 100644 --- a/src/main/java/theHexaghost/ghostflames/BolsteringGhostflame.java +++ b/src/main/java/theHexaghost/ghostflames/BolsteringGhostflame.java @@ -8,6 +8,7 @@ import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.powers.StrengthPower; import com.megacrit.cardcrawl.vfx.combat.InflameEffect; import downfall.util.TextureLoader; @@ -42,19 +43,38 @@ public BolsteringGhostflame(float x, float y) { @Override public void onCharge() { int x = getEffectCount(); - if(!AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)) { - atb(new VFXAction(AbstractDungeon.player, new InflameEffect(AbstractDungeon.player), 0.5F)); - atb(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new StrengthPower(AbstractDungeon.player, 1), 1)); - atb(new GainBlockAction(AbstractDungeon.player, x)); - }else { + // boolean isHexaghostChallengeActive = HexaghostChallenge.ID.equals(CuratedChallenges.currentChallengeId); + + if (!AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)) { + applyEffectToPlayer(x); + // if (isHexaghostChallengeActive) { + // applyEffectToRandomEnemy(x); + // } + } else { for (int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++) { - atb(new VFXAction(AbstractDungeon.player, new InflameEffect(AbstractDungeon.player), 0.4F)); - atb(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new StrengthPower(AbstractDungeon.player, 1), 1)); - atb(new GainBlockAction(AbstractDungeon.player, x)); + applyEffectToPlayer(x); + // if (isHexaghostChallengeActive) { + // applyEffectToRandomEnemy(x); + // } } } } + private void applyEffectToPlayer(int x) { + atb(new VFXAction(AbstractDungeon.player, new InflameEffect(AbstractDungeon.player), 0.5F)); + atb(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new StrengthPower(AbstractDungeon.player, 1), 1)); + atb(new GainBlockAction(AbstractDungeon.player, x)); + } + + private void applyEffectToRandomEnemy(int x) { + AbstractMonster randomEnemy = AbstractDungeon.getRandomMonster(); + if (randomEnemy != null) { + atb(new VFXAction(randomEnemy, new InflameEffect(randomEnemy), 0.5F)); + atb(new ApplyPowerAction(randomEnemy, AbstractDungeon.player, new StrengthPower(randomEnemy, 1), 1)); + atb(new GainBlockAction(randomEnemy, x)); + } + } + @Override public Texture getHelperTexture() { return bruh; diff --git a/src/main/java/theHexaghost/ghostflames/CrushingGhostflame.java b/src/main/java/theHexaghost/ghostflames/CrushingGhostflame.java index 81a7f1845..7e12952db 100644 --- a/src/main/java/theHexaghost/ghostflames/CrushingGhostflame.java +++ b/src/main/java/theHexaghost/ghostflames/CrushingGhostflame.java @@ -72,7 +72,7 @@ public int getActiveFlamesTriggerCount() { return skillsPlayedThisTurn; } - @Override + @Override public void onCharge() { atb(new AbstractGameAction() { @Override @@ -83,27 +83,27 @@ public void update() { if(AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)){ for(int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++){ - addToTop(new VFXAction( - new AbstractGameEffect() { + addToTop(new VFXAction( + new AbstractGameEffect() { - public void update() { - CardCrawlGame.sound.playA("ATTACK_IRON_2", -0.4F); - CardCrawlGame.sound.playA("ATTACK_HEAVY", -0.4F); - for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { - if (m != null && !m.isDead && !m.isDying && !m.halfDead) { - AbstractDungeon.effectsQueue.add(new AnimatedSlashEffect(m.hb.cX, m.hb.cY - 30.0F * Settings.scale, 0.0F, -500.0F, 180.0F, 5.0F, Color.GOLD, Color.GOLD)); - } + public void update() { + CardCrawlGame.sound.playA("ATTACK_IRON_2", -0.4F); + CardCrawlGame.sound.playA("ATTACK_HEAVY", -0.4F); + for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (m != null && !m.isDead && !m.isDying && !m.halfDead) { + AbstractDungeon.effectsQueue.add(new AnimatedSlashEffect(m.hb.cX, m.hb.cY - 30.0F * Settings.scale, 0.0F, -500.0F, 180.0F, 5.0F, Color.GOLD, Color.GOLD)); } - this.isDone = true; } - - @Override - public void render(SpriteBatch spriteBatch) {} - - @Override - public void dispose() {} + this.isDone = true; } - )); + + @Override + public void render(SpriteBatch spriteBatch) {} + + @Override + public void dispose() {} + } + )); att(new DamageAllEnemiesAction(AbstractDungeon.player, DamageInfo.createDamageMatrix(x, true), DamageInfo.DamageType.THORNS, AttackEffect.NONE)); // att(new DamageAllEnemiesAction(AbstractDungeon.player, x, DamageInfo.DamageType.THORNS, AttackEffect.NONE)); @@ -111,14 +111,48 @@ public void dispose() {} } else { AbstractMonster m = AbstractDungeon.getRandomMonster(); if (m != null && !m.isDead && !m.isDying && !m.halfDead) { - addToTop(new DamageAction(m, new DamageInfo(AbstractDungeon.player, x, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.NONE)); - addToTop(new VFXAction(new GoldenSlashEffect(m.hb.cX, m.hb.cY, true))); + applyEffectToSingleEnemy(m, x); + // if (isHexaghostChallengeActive) { + // applyEffectToPlayer(x); + // } } } } }); } + private void applyEffectToAllEnemies(int x) { + AbstractDungeon.actionManager.addToTop(new VFXAction( + new AbstractGameEffect() { + public void update() { + CardCrawlGame.sound.playA("ATTACK_IRON_2", -0.4F); + CardCrawlGame.sound.playA("ATTACK_HEAVY", -0.4F); + for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (m != null && !m.isDead && !m.isDying && !m.halfDead) { + AbstractDungeon.effectsQueue.add(new AnimatedSlashEffect(m.hb.cX, m.hb.cY - 30.0F * Settings.scale, 0.0F, -500.0F, 180.0F, 5.0F, Color.GOLD, Color.GOLD)); + } + } + this.isDone = true; + } + @Override + public void render(SpriteBatch spriteBatch) {} + @Override + public void dispose() {} + } + )); + att(new DamageAllEnemiesAction(AbstractDungeon.player, damage, DamageInfo.DamageType.THORNS, AbstractGameAction.AttackEffect.NONE)); + } + + private void applyEffectToSingleEnemy(AbstractMonster m, int x) { + AbstractDungeon.actionManager.addToTop(new DamageAction(m, new DamageInfo(AbstractDungeon.player, x, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.NONE)); + AbstractDungeon.actionManager.addToTop(new VFXAction(new GoldenSlashEffect(m.hb.cX, m.hb.cY, true))); + } + + private void applyEffectToPlayer(int x) { + AbstractDungeon.actionManager.addToTop(new DamageAction(AbstractDungeon.player, new DamageInfo(AbstractDungeon.player, x, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.NONE)); + AbstractDungeon.actionManager.addToTop(new VFXAction(new GoldenSlashEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, true))); + } + @Override public String returnHoverHelperText() { int x = getEffectCount(); diff --git a/src/main/java/theHexaghost/ghostflames/InfernoGhostflame.java b/src/main/java/theHexaghost/ghostflames/InfernoGhostflame.java index b10cdd349..54aca7505 100644 --- a/src/main/java/theHexaghost/ghostflames/InfernoGhostflame.java +++ b/src/main/java/theHexaghost/ghostflames/InfernoGhostflame.java @@ -5,6 +5,7 @@ import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.actions.animations.VFXAction; import com.megacrit.cardcrawl.actions.common.ApplyPowerAction; +import com.megacrit.cardcrawl.actions.common.DamageAction; import com.megacrit.cardcrawl.actions.common.DamageAllEnemiesAction; import com.megacrit.cardcrawl.actions.common.DamageRandomEnemyAction; import com.megacrit.cardcrawl.actions.utility.WaitAction; @@ -13,6 +14,8 @@ import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.vfx.combat.ScreenOnFireEffect; +import expansioncontent.util.DownfallAchievementUnlocker; +import expansioncontent.util.DownfallAchievementVariables; import downfall.util.TextureLoader; import theHexaghost.GhostflameHelper; import theHexaghost.actions.ExtinguishAction; @@ -39,7 +42,6 @@ public class InfernoGhostflame extends AbstractGhostflame { public InfernoGhostflame(float x, float y) { super(x, y); damage = 4; - //this.textColor = new Color(1F,.75F,.75F,1F); this.triggersRequired = 3; this.effectIconXOffset = 80F; @@ -53,23 +55,33 @@ public int getActiveFlamesTriggerCount() { return energySpentThisTurn; } + private boolean areAllGhostflamesIgnited() { + for (AbstractGhostflame gf : GhostflameHelper.hexaGhostFlames) { + if (!gf.charged) { + return false; + } + } + return true; + } + @Override public void onCharge() { - - int damage = getEffectCount(); int amountOfIgnitedGhostflames = 0; + // boolean isHexaghostChallengeActive = HexaghostChallenge.ID.equals(CuratedChallenges.currentChallengeId); - if(AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)){ + if (AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)) { atb(new VFXAction(AbstractDungeon.player, new ScreenOnFireEffect(), 1.0F)); for (int j = GhostflameHelper.hexaGhostFlames.size() - 1; j >= 0; j--) { AbstractGhostflame gf = GhostflameHelper.hexaGhostFlames.get(j); if (gf.charged) { - for(int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++){ + for (int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++) { atb(new DamageAllEnemiesAction(AbstractDungeon.player, damage, DamageInfo.DamageType.THORNS, AbstractGameAction.AttackEffect.BLUNT_HEAVY)); - atb(new WaitAction(0.1F)); //Critical for keeping the UI not broken, and helps sell the anim + // if (isHexaghostChallengeActive) { + // atb(new DamageAction(AbstractDungeon.player, new DamageInfo(AbstractDungeon.player, damage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + // } + atb(new WaitAction(0.1F)); } - if (gf != this) atb(new ExtinguishAction(gf)); amountOfIgnitedGhostflames++; } @@ -80,19 +92,28 @@ public void onCharge() { AbstractGhostflame gf = GhostflameHelper.hexaGhostFlames.get(j); if (gf.charged) { atb(new DamageRandomEnemyAction(new DamageInfo(AbstractDungeon.player, damage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); - atb(new WaitAction(0.1F)); //Critical for keeping the UI not broken, and helps sell the anim + // if (isHexaghostChallengeActive) { + // atb(new DamageAction(AbstractDungeon.player, new DamageInfo(AbstractDungeon.player, damage, DamageInfo.DamageType.THORNS), AbstractGameAction.AttackEffect.BLUNT_HEAVY)); + // } + atb(new WaitAction(0.1F)); if (gf != this) atb(new ExtinguishAction(gf)); amountOfIgnitedGhostflames++; } } } + // Rest of the method remains unchanged if (amountOfIgnitedGhostflames == 6) { - if(!AbstractDungeon.player.hasRelic(IceCube.ID)){ + if (!AbstractDungeon.player.hasRelic(IceCube.ID)) { atb(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new EnhancePower(2), 2)); } } - + if (areAllGhostflamesIgnited()) { + DownfallAchievementVariables.fullInfernoIgnitions++; + if (DownfallAchievementVariables.fullInfernoIgnitions >= 6) { + DownfallAchievementUnlocker.unlockAchievement("HEXABURN"); + } + } } @Override @@ -199,11 +220,9 @@ public String getDescription() { public Color getFlameColor() { return activeColor.cpy(); - //return Color.SKY.cpy(); } public Color getActiveColor() { - //return activeColor.cpy(); return Color.PURPLE.cpy(); } } diff --git a/src/main/java/theHexaghost/ghostflames/SearingGhostflame.java b/src/main/java/theHexaghost/ghostflames/SearingGhostflame.java index bd9a6cfa3..229a92bd4 100644 --- a/src/main/java/theHexaghost/ghostflames/SearingGhostflame.java +++ b/src/main/java/theHexaghost/ghostflames/SearingGhostflame.java @@ -13,6 +13,7 @@ import com.megacrit.cardcrawl.relics.AbstractRelic; import com.megacrit.cardcrawl.vfx.AbstractGameEffect; import com.megacrit.cardcrawl.vfx.combat.FireballEffect; +import curatedchallenges.CuratedChallenges; import downfall.util.TextureLoader; import theHexaghost.GhostflameHelper; import theHexaghost.HexaMod; @@ -61,55 +62,65 @@ public void onCharge() { public void update() { isDone = true; int x = getEffectCount(); - - if(AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)){ - for(int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++){ - for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { - if (m != null && !m.isDead && !m.isDying && !m.halfDead) { - att(new ApplyPowerAction(m, AbstractDungeon.player, new BurnPower(m, x), x)); - } - } -// att(new VFXAction(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, m.hb.cX, m.hb.cY), 0.2F)); - att(new VFXAction( - new AbstractGameEffect() { - - public void update() { - for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { - if (m != null && !m.isDead && !m.isDying && !m.halfDead) { - AbstractDungeon.effectsQueue.add(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, m.hb.cX, m.hb.cY)); - } - } - this.isDone = true; - } - - @Override - public void render(SpriteBatch spriteBatch) {} - - @Override - public void dispose() {} - } - , 0.3F)); - if (AbstractDungeon.player.hasRelic(CandleOfCauterizing.ID)) { - AbstractRelic r = AbstractDungeon.player.getRelic(CandleOfCauterizing.ID); - r.flash(); - } + // boolean isHexaghostChallengeActive = HexaghostChallenge.ID.equals(CuratedChallenges.currentChallengeId); + + if (AbstractDungeon.player.hasPower(FlameAffectAllEnemiesPower.POWER_ID)) { + for (int i = 0; i < AbstractDungeon.player.getPower(FlameAffectAllEnemiesPower.POWER_ID).amount; i++) { + applyEffectToAllEnemies(x); + // if (isHexaghostChallengeActive) { + // applyEffectToPlayer(x); + // } } - } - else { + } else { AbstractMonster m = AbstractDungeon.getRandomMonster(); if (m != null && !m.isDead && !m.isDying && !m.halfDead) { - att(new ApplyPowerAction(m, AbstractDungeon.player, new BurnPower(m, x), x)); - att(new VFXAction(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, m.hb.cX, m.hb.cY), 0.4F)); - if (AbstractDungeon.player.hasRelic(CandleOfCauterizing.ID)) { - AbstractRelic r = AbstractDungeon.player.getRelic(CandleOfCauterizing.ID); - r.flash(); - } + applyEffectToSingleEnemy(m, x); + // if (isHexaghostChallengeActive) { + // applyEffectToPlayer(x); + // } } } + + if (AbstractDungeon.player.hasRelic(CandleOfCauterizing.ID)) { + AbstractRelic r = AbstractDungeon.player.getRelic(CandleOfCauterizing.ID); + r.flash(); + } } }); } + private void applyEffectToAllEnemies(int x) { + for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (m != null && !m.isDead && !m.isDying && !m.halfDead) { + att(new ApplyPowerAction(m, AbstractDungeon.player, new BurnPower(m, x), x)); + } + } + att(new VFXAction(new AbstractGameEffect() { + public void update() { + for (AbstractMonster m : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (m != null && !m.isDead && !m.isDying && !m.halfDead) { + AbstractDungeon.effectsQueue.add(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, m.hb.cX, m.hb.cY)); + } + } + this.isDone = true; + } + @Override + public void render(SpriteBatch spriteBatch) {} + @Override + public void dispose() {} + }, 0.3F)); + } + + private void applyEffectToSingleEnemy(AbstractMonster m, int x) { + att(new ApplyPowerAction(m, AbstractDungeon.player, new BurnPower(m, x), x)); + att(new VFXAction(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, m.hb.cX, m.hb.cY), 0.4F)); + } + + private void applyEffectToPlayer(int x) { + att(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new BurnPower(AbstractDungeon.player, x), x)); + att(new VFXAction(new FireballEffect(AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY, AbstractDungeon.player.hb.cX, AbstractDungeon.player.hb.cY), 0.4F)); + } + @Override public void advanceTrigger(AbstractCard c) { if (!charged && ( c.type == AbstractCard.CardType.ATTACK || (AbstractDungeon.player.hasRelic(JarOfFuel.ID) && c.type == AbstractCard.CardType.POWER ) ) ){ diff --git a/src/main/java/theHexaghost/vfx/BrokenSealEffect.java b/src/main/java/theHexaghost/vfx/BrokenSealEffect.java index b731bd5aa..959bb9043 100644 --- a/src/main/java/theHexaghost/vfx/BrokenSealEffect.java +++ b/src/main/java/theHexaghost/vfx/BrokenSealEffect.java @@ -154,7 +154,7 @@ public void update() { for (AbstractCard c : this.seals){ c.update(); } - + this.duration -= Gdx.graphics.getDeltaTime() * 1.3F; if (this.duration < 0.0F) { diff --git a/src/main/resources/downfallResources/localization/eng/UIStrings.json b/src/main/resources/downfallResources/localization/eng/UIStrings.json index 0075c7530..357d8a1dc 100644 --- a/src/main/resources/downfallResources/localization/eng/UIStrings.json +++ b/src/main/resources/downfallResources/localization/eng/UIStrings.json @@ -167,4 +167,4 @@ ], "Translator note": "This pops up when you try to escape the gauntlet fight, where there are more than 1 hero alive yet, so you are overwhelmed by number thus cant escape." } -} +} \ No newline at end of file diff --git a/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.atlas b/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.atlas new file mode 100644 index 000000000..564873dbe --- /dev/null +++ b/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.atlas @@ -0,0 +1,691 @@ +DownfallAchievements.png +size: 2560,1280 +format: RGB888 +filter: Linear,Linear +repeat: none +locked/BULLY + rotate: false + xy: 0, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/BULLY + rotate: false + xy: 160, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CORRUPTED + rotate: false + xy: 320, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CORRUPTED + rotate: false + xy: 480, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/UPRISE + rotate: false + xy: 640, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/UPRISE + rotate: false + xy: 800, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/LONGSHOT + rotate: false + xy: 960, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/LONGSHOT + rotate: false + xy: 1120, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/BOUNTY_HUNTER + rotate: false + xy: 1280, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/BOUNTY_HUNTER + rotate: false + xy: 1440, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/WIELDER_OF_WOE + rotate: false + xy: 1600, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/WIELDER_OF_WOE + rotate: false + xy: 1760, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/GORGED + rotate: false + xy: 1920, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/GORGED + rotate: false + xy: 2080, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/FOR_THE_BOSS + rotate: false + xy: 2240, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/FOR_THE_BOSS + rotate: false + xy: 2400, 0 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/PAYMENT_RECEIVED + rotate: false + xy: 0, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/PAYMENT_RECEIVED + rotate: false + xy: 160, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/HYPER_ACCELERATION + rotate: false + xy: 320, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/HYPER_ACCELERATION + rotate: false + xy: 480, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/IMPENETRABLE + rotate: false + xy: 640, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/IMPENETRABLE + rotate: false + xy: 800, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/BEJEWELED + rotate: false + xy: 960, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/BEJEWELED + rotate: false + xy: 1120, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/THE_BROKEN_SEAL + rotate: false + xy: 1280, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/THE_BROKEN_SEAL + rotate: false + xy: 1440, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/MY_BELT + rotate: false + xy: 1600, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/MY_BELT + rotate: false + xy: 1760, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/I_AM_THE_ONE + rotate: false + xy: 1920, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/I_AM_THE_ONE + rotate: false + xy: 2080, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/OVER_OVERKILL + rotate: false + xy: 2240, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/OVER_OVERKILL + rotate: false + xy: 2400, 160 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/TRIPLE_SETTER + rotate: false + xy: 0, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/TRIPLE_SETTER + rotate: false + xy: 160, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/MECHANICAL_GAUNTLET + rotate: false + xy: 320, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/MECHANICAL_GAUNTLET + rotate: false + xy: 480, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CODERS_BLOCK + rotate: false + xy: 640, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CODERS_BLOCK + rotate: false + xy: 800, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/PICKPOCKET_100 + rotate: false + xy: 960, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/PICKPOCKET_100 + rotate: false + xy: 1120, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/GLASS_BONES + rotate: false + xy: 1280, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/GLASS_BONES + rotate: false + xy: 1440, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/OUR_TRUE_FORM + rotate: false + xy: 1600, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/OUR_TRUE_FORM + rotate: false + xy: 1760, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/NOODLE_CODE + rotate: false + xy: 1920, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/NOODLE_CODE + rotate: false + xy: 2080, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/MASTER_OF_CONFUSION + rotate: false + xy: 2240, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/MASTER_OF_CONFUSION + rotate: false + xy: 2400, 320 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/UNBOUND + rotate: false + xy: 0, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/UNBOUND + rotate: false + xy: 160, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/SAYONARA + rotate: false + xy: 320, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/SAYONARA + rotate: false + xy: 480, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/THE_BIGGER_THEY_ARE + rotate: false + xy: 640, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/THE_BIGGER_THEY_ARE + rotate: false + xy: 800, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/HOARDER + rotate: false + xy: 960, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/HOARDER + rotate: false + xy: 1120, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/TOPAZ + rotate: false + xy: 1280, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/TOPAZ + rotate: false + xy: 1440, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/JADE + rotate: false + xy: 1600, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/JADE + rotate: false + xy: 1760, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CITRINE + rotate: false + xy: 1920, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CITRINE + rotate: false + xy: 2080, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/TANZANITE + rotate: false + xy: 2240, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/TANZANITE + rotate: false + xy: 2400, 480 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/KYANITE + rotate: false + xy: 0, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/KYANITE + rotate: false + xy: 160, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/RUTILE + rotate: false + xy: 320, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/RUTILE + rotate: false + xy: 480, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/SPINEL + rotate: false + xy: 640, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/SPINEL + rotate: false + xy: 800, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CHRYSOCOLLA + rotate: false + xy: 960, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CHRYSOCOLLA + rotate: false + xy: 1120, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/MALACHITE + rotate: false + xy: 1280, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/MALACHITE + rotate: false + xy: 1440, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/TOPAZ+ + rotate: false + xy: 1600, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/TOPAZ+ + rotate: false + xy: 1760, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/JADE+ + rotate: false + xy: 1920, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/JADE+ + rotate: false + xy: 2080, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CITRINE+ + rotate: false + xy: 2240, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CITRINE+ + rotate: false + xy: 2400, 640 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/TANZANITE+ + rotate: false + xy: 0, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/TANZANITE+ + rotate: false + xy: 160, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/KYANITE+ + rotate: false + xy: 320, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/KYANITE+ + rotate: false + xy: 480, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/RUTILE+ + rotate: false + xy: 640, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/RUTILE+ + rotate: false + xy: 800, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/SPINEL+ + rotate: false + xy: 960, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/SPINEL+ + rotate: false + xy: 1120, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/CHRYSOCOLLA+ + rotate: false + xy: 1280, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/CHRYSOCOLLA+ + rotate: false + xy: 1440, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/MALACHITE+ + rotate: false + xy: 1600, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/MALACHITE+ + rotate: false + xy: 1760, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/EVIL_ONE + rotate: false + xy: 1920, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/EVIL_ONE + rotate: false + xy: 2080, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/HEXABURN + rotate: false + xy: 2240, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/HEXABURN + rotate: false + xy: 2400, 800 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +locked/GHOSTLY + rotate: false + xy: 0, 960 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +unlocked/GHOSTLY + rotate: false + xy: 160, 960 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 \ No newline at end of file diff --git a/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.png b/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.png new file mode 100644 index 000000000..3dbb279c8 Binary files /dev/null and b/src/main/resources/expansioncontentResources/images/achievements/DownfallAchievements.png differ diff --git a/src/main/resources/expansioncontentResources/localization/eng/UIStrings.json b/src/main/resources/expansioncontentResources/localization/eng/UIStrings.json index 78d23f37f..8edde232a 100644 --- a/src/main/resources/expansioncontentResources/localization/eng/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/eng/UIStrings.json @@ -45,6 +45,305 @@ "This card can't be played this turn." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "I've already played a Boss card this turn!" diff --git a/src/main/resources/expansioncontentResources/localization/fra/UIStrings.json b/src/main/resources/expansioncontentResources/localization/fra/UIStrings.json index bf73a0e59..bd3a72c35 100644 --- a/src/main/resources/expansioncontentResources/localization/fra/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/fra/UIStrings.json @@ -45,6 +45,305 @@ "This card can't be played this turn." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "J'ai déjà joué une carte de Boss ce tour!" diff --git a/src/main/resources/expansioncontentResources/localization/kor/UIStrings.json b/src/main/resources/expansioncontentResources/localization/kor/UIStrings.json index d42581086..d547b2ac8 100644 --- a/src/main/resources/expansioncontentResources/localization/kor/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/kor/UIStrings.json @@ -45,6 +45,305 @@ "이번 턴에 이 카드는 사용할 수 없다." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "이번 턴에 이미 보스 카드를 사용했다!" diff --git a/src/main/resources/expansioncontentResources/localization/ptb/UIStrings.json b/src/main/resources/expansioncontentResources/localization/ptb/UIStrings.json index de2fac08a..ae36ecc20 100644 --- a/src/main/resources/expansioncontentResources/localization/ptb/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/ptb/UIStrings.json @@ -45,6 +45,305 @@ "This card can't be played this turn." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "Eu já joguei uma carta de Chefe neste turno!" diff --git a/src/main/resources/expansioncontentResources/localization/rus/UIStrings.json b/src/main/resources/expansioncontentResources/localization/rus/UIStrings.json index ba2181514..39d0550ee 100644 --- a/src/main/resources/expansioncontentResources/localization/rus/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/rus/UIStrings.json @@ -45,6 +45,305 @@ "Я не могу разыграть эту карту в этом ходу." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "Карта Босса уже была разыграна в этом ходу!" diff --git a/src/main/resources/expansioncontentResources/localization/zhs/UIStrings.json b/src/main/resources/expansioncontentResources/localization/zhs/UIStrings.json index 7bf7a4450..3f6d7432f 100644 --- a/src/main/resources/expansioncontentResources/localization/zhs/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/zhs/UIStrings.json @@ -45,6 +45,305 @@ "本牌本回合无法被打出。" ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "我本回合已经打出了首领牌!" diff --git a/src/main/resources/expansioncontentResources/localization/zht/UIStrings.json b/src/main/resources/expansioncontentResources/localization/zht/UIStrings.json index f20be3fe2..702467bc9 100644 --- a/src/main/resources/expansioncontentResources/localization/zht/UIStrings.json +++ b/src/main/resources/expansioncontentResources/localization/zht/UIStrings.json @@ -45,6 +45,305 @@ "This card can't be played this turn." ] }, + "downfall:AchievementGrid": { + "TEXT": [ + "#yDownfall #yAchievements" + ] + }, + "downfall:BULLY": { + "TEXT": [ + "Bully", + "Coerce Cleric into removing 3 of your cards in a single run." + ] + }, + "downfall:CORRUPTED": { + "TEXT": [ + "Corrupted", + "Complete the Ending in Downfall mode as Ironclad, Silent, Defect, Watcher, or Hermit." + ] + }, + "downfall:UPRISE": { + "TEXT": [ + "Uprise", + "Complete the Ending in Standard mode as a Downfall villain." + ] + }, + "downfall:LONGSHOT": { + "TEXT": [ + "Longshot", + "(Hermit) Without Concentration, trigger a Dead On effect while you have at least 9 cards in hand." + ] + }, + "downfall:BOUNTY_HUNTER": { + "TEXT": [ + "Bounty Hunter", + "(Hermit) Claim 300 Gold from Bounties in a single run." + ] + }, + "downfall:WIELDER_OF_WOE": { + "TEXT": [ + "Wielder Of Woe", + "(Hermit) Get Cursed Weapon to a base of 40 damage." + ] + }, + "downfall:GORGED": { + "TEXT": [ + "Gorged", + "(Slime Boss) Raise your Max HP 3 times from a single use of Mass Feed." + ] + }, + "downfall:FOR_THE_BOSS": { + "TEXT": [ + "For The Boss", + "(Slime Boss) Absorb 15 Slimes in a single combat." + ] + }, + "downfall:PAYMENT_RECEIVED": { + "TEXT": [ + "Payment Received", + "(Slime Boss) Have 400 Souls taken by the Greed Ooze in a single run." + ] + }, + "downfall:HYPER_ACCELERATION": { + "TEXT": [ + "Hyper Acceleration", + "(Guardian) Return 10 cards from Stasis to your hand in a single turn." + ] + }, + "downfall:IMPENETRABLE": { + "TEXT": [ + "Impenetrable", + "(Guardian) Have 5 stacks of Defensive Mode at once." + ] + }, + "downfall:BEJEWELED": { + "TEXT": [ + "Bejeweled", + "(Guardian) Socket 8 gems in a single floor." + ] + }, + "downfall:HEXABURN": { + "TEXT": [ + "Hexaburn", + "(Hexaghost) Fully Ignite the Inferno Ghostflame 6 times in a single combat." + ] + }, + "downfall:GHOSTLY": { + "TEXT": [ + "Ghostly", + "(Hexaghost) Lose 4 Strikes and 4 Defends at a single visit of the Council of Ghosts event." + ] + }, + "downfall:THE_BROKEN_SEAL": { + "TEXT": [ + "The Broken Seal", + "(Hexaghost) Obtain The Broken Seal." + ] + }, + "downfall:MY_BELT": { + "TEXT": [ + "\"Hey, That's My Belt\"", + "(Champ) As the Champ, defeat Ironclad 1." + ] + }, + "downfall:I_AM_THE_ONE": { + "TEXT": [ + "I Am The One", + "(Champ) Enter Ultimate Stance 3 times in a single turn." + ] + }, + "downfall:OVER_OVERKILL": { + "TEXT": [ + "Over Overkill", + "(Champ) Play an Attack while you have at least 200 Vigor." + ] + }, + "downfall:TRIPLE_SETTER": { + "TEXT": [ + "Triple Setter", + "(Automaton) Use Mutator to transform 3 Statuses in a single turn." + ] + }, + "downfall:MECHANICAL_GAUNTLET": { + "TEXT": [ + "Mechanical Gauntlet", + "(Automaton) Defeat an Exploder, Repulsor, and Spiker in a single Exordium combat." + ] + }, + "downfall:CODERS_BLOCK": { + "TEXT": [ + "Coder's Block", + "(Automaton) As the Automaton, defeat a Boss without creating a Function." + ] + }, + "downfall:PICKPOCKET_100": { + "TEXT": [ + "Pickpocket 100", + "(Gremlins) Steal at least 3 Artifact from a single use of Pickpocket." + ] + }, + "downfall:GLASS_BONES": { + "TEXT": [ + "Glass Bones & Paper Skin", + "(Gremlins) Cause an enemy to have Agony and Crippled at the same time." + ] + }, + "downfall:OUR_TRUE_FORM": { + "TEXT": [ + "Our True Form", + "(Gremlins) Defeat a Boss as NOB." + ] + }, + "downfall:NOODLE_CODE": { + "TEXT": [ + "Noodle Code", + "(Snecko) As the Snecko, create a Function." + ] + }, + "downfall:MASTER_OF_CONFUSION": { + "TEXT": [ + "Master Of Confusion", + "(Snecko) Acquire the Super Snecko Eye." + ] + }, + "downfall:UNBOUND": { + "TEXT": [ + "Unbound", + "(Snecko) Beat the game as Pure Snecko." + ] + }, + "downfall:SAYONARA": { + "TEXT": [ + "Sayonara", + "(Collector) Apply at least 100 Doom with a single use of Goodbye." + ] + }, + "downfall:THE_BIGGER_THEY_ARE": { + "TEXT": [ + "The Bigger They Are...", + "(Collector) Play Endgame." + ] + }, + "downfall:HOARDER": { + "TEXT": [ + "Hoarder", + "(Collector) Beat the game with at least 20 Collected cards." + ] + }, + "downfall:TOPAZ": { + "TEXT": [ + "Topaz", + "Beat the game with the Hermit." + ] + }, + "downfall:TOPAZ+": { + "TEXT": [ + "Topaz+", + "Complete the Ending with the Hermit." + ] + }, + "downfall:JADE": { + "TEXT": [ + "Jade", + "Beat the game with the Slime Boss." + ] + }, + "downfall:JADE+": { + "TEXT": [ + "Jade+", + "Complete the Ending with the Slime Boss." + ] + }, + "downfall:CITRINE": { + "TEXT": [ + "Citrine", + "Beat the game with the Guardian." + ] + }, + "downfall:CITRINE+": { + "TEXT": [ + "Citrine+", + "Complete the Ending with the Guardian." + ] + }, + "downfall:TANZANITE": { + "TEXT": [ + "Tanzanite", + "Beat the game with the Hexaghost." + ] + }, + "downfall:TANZANITE+": { + "TEXT": [ + "Tanzanite+", + "Complete the Ending with the Hexaghost." + ] + }, + "downfall:KYANITE": { + "TEXT": [ + "Kyanite", + "Beat the game with the Champ." + ] + }, + "downfall:KYANITE+": { + "TEXT": [ + "Kyanite+", + "Complete the Ending with the Champ." + ] + }, + "downfall:RUTILE": { + "TEXT": [ + "Rutile", + "Beat the game with the Automaton." + ] + }, + "downfall:RUTILE+": { + "TEXT": [ + "Rutile+", + "Complete the Ending with the Automaton." + ] + }, + "downfall:SPINEL": { + "TEXT": [ + "Spinel", + "Beat the game with the Gremlins." + ] + }, + "downfall:SPINEL+": { + "TEXT": [ + "Spinel+", + "Complete the Ending with the Gremlins." + ] + }, + "downfall:CHRYSOCOLLA": { + "TEXT": [ + "Chrysocolla", + "Beat the game with the Snecko." + ] + }, + "downfall:CHRYSOCOLLA+": { + "TEXT": [ + "Chrysocolla+", + "Complete the Ending with the Snecko." + ] + }, + "downfall:MALACHITE": { + "TEXT": [ + "Malachite", + "Beat the game with the Collector." + ] + }, + "downfall:MALACHITE+": { + "TEXT": [ + "Malachite+", + "Complete the Ending with the Collector." + ] + }, + "downfall:EVIL_ONE": { + "TEXT": [ + "Evil One", + "Obtain all other Downfall Achievements." + ] + }, "expansioncontent:CannotUseBossCardMessage": { "TEXT": [ "我本回合已經打出了首領牌!" diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle.png new file mode 100644 index 000000000..f68ceafce Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle_p.png new file mode 100644 index 000000000..b20d68ac6 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/afterdinnertackle_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle.png new file mode 100644 index 000000000..ada656b01 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle_p.png new file mode 100644 index 000000000..6716cb3ba Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/backuptackle_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle.png new file mode 100644 index 000000000..5354740b5 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle_p.png new file mode 100644 index 000000000..80b9f1ca8 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/dodgeandtackle_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick.png index 3504a81cc..0b18349c5 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick_p.png index 22387ea03..4ed8f886c 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick_p.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/hauntinglick_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick.png index 4ca0d7d45..77b0acbf5 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick_p.png index 4e3488586..d9b570d3d 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick_p.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/megalick_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble.png index 1368f41e3..d91eac667 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble_p.png index 7239bf40d..fd5ce13e5 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble_p.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/nibble_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower.png new file mode 100644 index 000000000..cbeeec3b4 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower_p.png new file mode 100644 index 000000000..69d669bf4 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/paintopower_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand.png new file mode 100644 index 000000000..7afc206d7 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand_p.png new file mode 100644 index 000000000..466d7d5cb Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/reprimand_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick.png index 151ab897e..7d7e233be 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick_p.png index 623492221..5bea44aa7 100644 Binary files a/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick_p.png and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/samplinglick_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral.png new file mode 100644 index 000000000..7849001d8 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral_p.png b/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral_p.png new file mode 100644 index 000000000..30ee8b74d Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/cards/splitgeneral_p.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.atlas b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.atlas new file mode 100644 index 000000000..3f1f39fe4 --- /dev/null +++ b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.atlas @@ -0,0 +1,41 @@ + +champ2.png +size: 512,128 +format: RGBA8888 +filter: Linear,Linear +repeat: none +images/body + rotate: false + xy: 2, 26 + size: 135, 87 + orig: 135, 87 + offset: 0, 0 + index: -1 +images/eye + rotate: false + xy: 313, 98 + size: 20, 15 + orig: 20, 15 + offset: 0, 0 + index: -1 +images/eyelid + rotate: false + xy: 2, 2 + size: 50, 22 + orig: 50, 22 + offset: 0, 0 + index: -1 +images/eyeshadow + rotate: false + xy: 139, 41 + size: 48, 21 + orig: 48, 21 + offset: 0, 0 + index: -1 +images/shadow + rotate: false + xy: 139, 64 + size: 172, 49 + orig: 172, 49 + offset: 0, 0 + index: -1 diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.png b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.png new file mode 100644 index 000000000..942ddee0b Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/champ2.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.atlas b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.atlas new file mode 100644 index 000000000..563874bf8 --- /dev/null +++ b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.atlas @@ -0,0 +1,76 @@ + +cultist2.png +size: 512,128 +format: RGBA8888 +filter: Linear,Linear +repeat: none +images/body + rotate: false + xy: 2, 36 + size: 135, 87 + orig: 135, 87 + offset: 0, 0 + index: -1 +images/eye1 + rotate: false + xy: 2, 2 + size: 13, 13 + orig: 13, 13 + offset: 0, 0 + index: -1 +images/eye2 + rotate: false + xy: 139, 40 + size: 12, 13 + orig: 12, 13 + offset: 0, 0 + index: -1 +images/eye3 + rotate: false + xy: 170, 60 + size: 11, 12 + orig: 11, 12 + offset: 0, 0 + index: -1 +images/eye4 + rotate: false + xy: 313, 96 + size: 11, 10 + orig: 11, 10 + offset: 0, 0 + index: -1 +images/eyeback1 + rotate: false + xy: 35, 17 + size: 25, 17 + orig: 25, 17 + offset: 0, 0 + index: -1 +images/eyeback2 + rotate: false + xy: 313, 108 + size: 29, 15 + orig: 29, 15 + offset: 0, 0 + index: -1 +images/eyeback3 + rotate: false + xy: 2, 17 + size: 31, 17 + orig: 31, 17 + offset: 0, 0 + index: -1 +images/eyeback4 + rotate: false + xy: 139, 55 + size: 29, 17 + orig: 29, 17 + offset: 0, 0 + index: -1 +images/shadow + rotate: false + xy: 139, 74 + size: 172, 49 + orig: 172, 49 + offset: 0, 0 + index: -1 diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.png b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.png new file mode 100644 index 000000000..d826b22f3 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/cultist2.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.atlas b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.atlas new file mode 100644 index 000000000..97a8c0e10 --- /dev/null +++ b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.atlas @@ -0,0 +1,41 @@ + +slowing2.png +size: 256,64 +format: RGBA8888 +filter: Linear,Linear +repeat: none +images/body + rotate: false + xy: 106, 2 + size: 74, 56 + orig: 74, 56 + offset: 0, 0 + index: -1 +images/eye + rotate: false + xy: 40, 13 + size: 17, 13 + orig: 17, 13 + offset: 0, 0 + index: -1 +images/eyelid + rotate: false + xy: 182, 43 + size: 34, 15 + orig: 34, 15 + offset: 0, 0 + index: -1 +images/eyeshadow + rotate: false + xy: 2, 8 + size: 36, 18 + orig: 36, 18 + offset: 0, 0 + index: -1 +images/shadow + rotate: false + xy: 2, 28 + size: 102, 30 + orig: 102, 30 + offset: 0, 0 + index: -1 diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.png b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.png new file mode 100644 index 000000000..c68e00d80 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/slowing2.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.atlas b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.atlas new file mode 100644 index 000000000..4c0a74a0f --- /dev/null +++ b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.atlas @@ -0,0 +1,34 @@ + +tarr.png +size: 256,64 +format: RGBA8888 +filter: Linear,Linear +repeat: none +body + rotate: false + xy: 106, 15 + size: 74, 47 + orig: 74, 47 + offset: 0, 0 + index: -1 +eyeShadow + rotate: true + xy: 2, 2 + size: 28, 17 + orig: 28, 17 + offset: 0, 0 + index: -1 +eyes + rotate: false + xy: 182, 51 + size: 11, 11 + orig: 11, 11 + offset: 0, 0 + index: -1 +shadow + rotate: false + xy: 2, 32 + size: 102, 30 + orig: 102, 30 + offset: 0, 0 + index: -1 diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.png b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.png new file mode 100644 index 000000000..6602e0dae Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/orbs/tarr.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/powers/hauntinglick.png b/src/main/resources/slimeboundResources/SlimeboundImages/powers/hauntinglick.png new file mode 100644 index 000000000..ae9ebd11f Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/powers/hauntinglick.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/powers/megalick.png b/src/main/resources/slimeboundResources/SlimeboundImages/powers/megalick.png new file mode 100644 index 000000000..f63464a6f Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/powers/megalick.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/powers/nibble.png b/src/main/resources/slimeboundResources/SlimeboundImages/powers/nibble.png new file mode 100644 index 000000000..fbc37f5c0 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/powers/nibble.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/powers/paintopower.png b/src/main/resources/slimeboundResources/SlimeboundImages/powers/paintopower.png new file mode 100644 index 000000000..833798c66 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/powers/paintopower.png differ diff --git a/src/main/resources/slimeboundResources/SlimeboundImages/powers/samplinglick.png b/src/main/resources/slimeboundResources/SlimeboundImages/powers/samplinglick.png new file mode 100644 index 000000000..5255400d3 Binary files /dev/null and b/src/main/resources/slimeboundResources/SlimeboundImages/powers/samplinglick.png differ diff --git a/src/main/resources/slimeboundResources/localization/eng/CardStrings.json b/src/main/resources/slimeboundResources/localization/eng/CardStrings.json index 4666140f7..611ba95da 100644 --- a/src/main/resources/slimeboundResources/localization/eng/CardStrings.json +++ b/src/main/resources/slimeboundResources/localization/eng/CardStrings.json @@ -5,20 +5,21 @@ }, "Slimebound:BestDefense": { "NAME": "Recklessness", - "DESCRIPTION": "Your \"Tackle\" cards deal !M! more damage to enemies, and 1 more damage to you." + "DESCRIPTION": "Your \"Tackle\" cards deal !M! more damage." }, "Slimebound:CheckThePlaybook": { "NAME": "Consult Playbook", - "DESCRIPTION": "Gain 3 random \"Tackle\" cards. They cost 1 less this combat. NL Exhaust." + "DESCRIPTION": "Gain 4 random \"Tackle\" cards. NL Exhaust." }, "Slimebound:Chomp": { "NAME": "Chomp", - "DESCRIPTION": "Deal !D! damage. NL Reduce the cost of a random \"Tackle\" in your hand to 0 this turn.", - "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Reduce the cost of a random \"Tackle\" in your hand to 0 this combat." + "DESCRIPTION": "Deal !D! damage. NL slimeboundmod:Consume - slimeboundmod:Split into a slimeboundmod:Hungry_Slime.", + "UPGRADE_DESCRIPTION": "Deal !D! damage. NL slimeboundmod:Split into a slimeboundmod:Hungry_Slime." }, "Slimebound:ComboTackle": { "NAME": "Spear Tackle", - "DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL Draw !M! cards." + "DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL Next turn, draw !M! additional card.", + "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL Next turn, draw !M! additional cards." }, "Slimebound:CorrosiveSpit": { "NAME": "Corrosive Spit", @@ -35,7 +36,7 @@ }, "Slimebound:DisruptingSlam": { "NAME": "Just Desserts", - "DESCRIPTION": "Deal !D! damage to ALL enemies. NL expansioncontent:Exhume !M! random \"Lick\" cards." + "DESCRIPTION": "Deal !D! damage to ALL enemies. NL Gain !M! *Licks." }, "Slimebound:Dissolve": { "NAME": "Quick Snack", @@ -44,7 +45,7 @@ }, "Slimebound:DivideAndConquer": { "NAME": "Divide & Conquer", - "DESCRIPTION": "Deal !D! damage to a random enemy for each Slime. NL slimeboundmod:Absorb all Slimes. NL Exhaust." + "DESCRIPTION": "Deal !D! damage to a random enemy for each spawned Slime." }, "Slimebound:DouseInSlime": { "NAME": "Douse in Slime", @@ -72,7 +73,7 @@ }, "Slimebound:FlameTackle": { "NAME": "Flame Tackle", - "DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL Your \"Tackle\" cards deal !M! more damage this combat." + "DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL Your \"Tackle\" cards deal !M! more damage this combat." }, "Slimebound:FormOfPuddle": { "NAME": "Shape of Puddle", @@ -80,8 +81,7 @@ }, "Slimebound:ForwardTackle": { "NAME": "Forward Tackle", - "DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL slimeboundmod:Command twice.", - "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL slimeboundmod:Command three times." + "DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL slimeboundmod:Command." }, "Slimebound:Gluttony": { "NAME": "Gluttony", @@ -99,21 +99,20 @@ }, "Slimebound:Grow": { "NAME": "Grow", - "DESCRIPTION": "Lose 1 Slime slot in exchange for !M! Strength and !M! Dexterity." + "DESCRIPTION": "Gain !M! Strength and !M! Dexterity." }, "Slimebound:GrowthPunch": { "NAME": "Growth Punch", "DESCRIPTION": "Gain !B! Block. NL Deal !D! damage. NL slimeboundmod:Consume - Increase this card's effects by !M! this combat." }, "Slimebound:HauntingLick": { - "NAME": "Haunting Lick", - "DESCRIPTION": "Apply !M! Vulnerable and !slime! slimeboundmod:Goop. NL Exhaust.", - "UPGRADE_DESCRIPTION": "Apply !M! Vulnerable and !slime! slimeboundmod:Goop. NL Draw a card. NL Exhaust." + "NAME": "Haunting Licks", + "DESCRIPTION": "Whenever you play a *Lick, apply !M! Vulnerable." }, "Slimebound:HungryTackle": { "NAME": "Hungry Tackle", - "DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL expansioncontent:Exhume a random \"Lick\" card.", - "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage. NL expansioncontent:Exhume 2 random \"Lick\" cards." + "DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL Gain a *Lick.", + "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Gain 3 hermit:Bruise. NL Gain 2 *Licks." }, "Slimebound:ItLooksTasty": { "NAME": "It Looks Tasty", @@ -157,14 +156,13 @@ "DESCRIPTION": "Deal !D! damage to ALL enemies. NL If Fatal, raise your Max HP by !M!. NL Exhaust." }, "Slimebound:MassRepurpose": { - "NAME": "Mass Repurpose", - "DESCRIPTION": "slimeboundmod:Absorb ALL Slimes. Split into a random slimeboundmod:Specialist for each. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Absorb ALL Slimes. Split into a random slimeboundmod:Specialist for each. slimeboundmod:Command them. NL Exhaust." + "NAME": "Mass Upgrade", + "DESCRIPTION": "slimeboundmod:Split into one of each Slime you already have.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split twice into one of each Slime you already have." }, "Slimebound:MegaLick": { - "NAME": "Mega-Lick", - "DESCRIPTION": "Apply !M! Weak and !slime! slimeboundmod:Goop to ALL enemies. NL Exhaust.", - "UPGRADE_DESCRIPTION": "Apply !M! Weak and !slime! slimeboundmod:Goop to ALL enemies. NL Draw a card. NL Exhaust." + "NAME": "Mega-Licks", + "DESCRIPTION": "Whenever you play a *Lick, apply !M! Weak." }, "Slimebound:MinionMaster": { "NAME": "Minion Master", @@ -172,9 +170,8 @@ "UPGRADE_DESCRIPTION": "Innate. NL Whenever you play a card with slimeboundmod:Command, slimeboundmod:Command again." }, "Slimebound:Nibble": { - "NAME": "Nibble and Lick", - "DESCRIPTION": "Deal !D! damage. NL Gain a *Lick. NL Exhaust.", - "UPGRADE_DESCRIPTION": "Deal !D! damage. NL Gain a *Lick. NL Draw a card. NL Exhaust." + "NAME": "Nibble Licks", + "DESCRIPTION": "Whenever you play a *Lick, deal !M! damage." }, "Slimebound:OneTwoCombo": { "NAME": "One-Two Combo", @@ -225,7 +222,7 @@ }, "Slimebound:Recollect": { "NAME": "Recollect", - "DESCRIPTION": "Gain !B! Block. NL expansioncontent:Exhume a random \"Lick\" card.", + "DESCRIPTION": "Gain !B! Block. NL Gain a *Lick.", "UPGRADE_DESCRIPTION": "Gain !B! Block. NL expansioncontent:Exhume 2 random \"Lick\" cards.", "EXTENDED_DESCRIPTION": [ "Not... Exhausted..." @@ -251,18 +248,24 @@ ] }, "Slimebound:Repurpose": { - "NAME": "Repurpose", - "DESCRIPTION": "slimeboundmod:Absorb - Split into a random slimeboundmod:Specialist. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Absorb - Split into a random slimeboundmod:Specialist. NL slimeboundmod:Command. NL Exhaust." + "NAME": "I Choose You", + "DESCRIPTION": "slimeboundmod:Rotate. NL slimeboundmod:Split into the leading Slime !M! times. NL Exhaust." + }, + "Slimebound:BackupTackle": { + "NAME": "Backup Tackle", + "DESCRIPTION": "Deal !D! damage. NL Gain !M! hermit:Bruise. NL slimeboundmod:Split into a slimeboundmod:Reckless_Slime." + }, + "Slimebound:SplitGeneral": { + "NAME": "Split: General", + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:General_Slime. NL slimeboundmod:Rotate it to the front." }, "Slimebound:RollThrough": { "NAME": "Roll Through", - "DESCRIPTION": "Deal !D! damage to ALL enemies. NL You do not take damage from the next !M! \"Tackle\" cards." + "DESCRIPTION": "Deal !D! damage to ALL enemies. NL You do not gain hermit:Bruise from the next !M! \"Tackle\" cards." }, "Slimebound:SamplingLick": { - "NAME": "Sampling Lick", - "DESCRIPTION": "Apply !slime! slimeboundmod:Goop. NL Gain !B! Block. NL Exhaust.", - "UPGRADE_DESCRIPTION": "Apply !slime! slimeboundmod:Goop. NL Gain !B! Block. NL Draw a card. NL Exhaust." + "NAME": "Sampling Licks", + "DESCRIPTION": "Whenever you play a *Lick, gain !M! Block." }, "Slimebound:Schlurp": { "NAME": "Schlurp", @@ -275,7 +278,7 @@ }, "Slimebound:ServeAndProtect": { "NAME": "Serve & Protect", - "DESCRIPTION": "Gain !B! Block and 1 bronze:Blur for each Slime. NL slimeboundmod:Absorb all Slimes. NL Exhaust." + "DESCRIPTION": "Gain !B! Block for each spawned Slime. NL Gain 1 bronze:Blur." }, "Slimebound:SlimeBarrage": { "NAME": "Pile On!", @@ -286,6 +289,14 @@ "NAME": "Slime Brawl", "DESCRIPTION": "Play the top card of your draw pile. Repeat for each of your spawned Slimes. NL Exhaust." }, + "Slimebound:PainToPower": { + "NAME": "Pain To Power", + "DESCRIPTION": "At the end of your turn, gain 1 Strength for every 3 hermit:Bruise you have." + }, + "Slimebound:BlockAndTackle": { + "NAME": "Block And Tackle", + "DESCRIPTION": "Deal !D! damage. NL Gain !B! Block. NL Gain !M! hermit:Bruise." + }, "Slimebound:SlimeCrush": { "NAME": "SLIME CRUSH!!!", "DESCRIPTION": "Ethereal. NL Deal !D! damage. NL Exhaust.", @@ -301,11 +312,7 @@ }, "Slimebound:SlimeTap": { "NAME": "Slime Tap", - "DESCRIPTION": "slimeboundmod:Absorb - Gain [E] and draw !M! cards. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Absorb - Gain [E] [E] and draw !M! cards. NL Exhaust.", - "EXTENDED_DESCRIPTION": [ - "Need... slimes..." - ] + "DESCRIPTION": "slimeboundmod:Rotate. NL Draw !M! cards." }, "Slimebound:SpikyOuterGoop": { "NAME": "Goop Armor", @@ -317,13 +324,13 @@ }, "Slimebound:SplitAcid": { "NAME": "Split: Guerilla", - "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Guerilla_Slime. NL slimeboundmod:Command !M! times. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Guerilla_Slime. NL slimeboundmod:Command three times. NL Exhaust." + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Guerilla_Slime. NL slimeboundmod:Rotate it to the front.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Guerilla_Slime. NL slimeboundmod:Rotate it to the front. NL slimeboundmod:Command." }, "Slimebound:SplitBruiser": { "NAME": "Split: Bruiser", - "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Bruiser_Slime. NL slimeboundmod:Command !M! times. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Bruiser_Slime. NL slimeboundmod:Command three times. NL Exhaust." + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Bruiser_Slime. NL slimeboundmod:Rotate it to the front.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Bruiser_Slime. NL slimeboundmod:Rotate it to the front. NL slimeboundmod:Command." }, "Slimebound:SplitGreed": { "NAME": "Revive Greed", @@ -331,22 +338,22 @@ }, "Slimebound:SplitLeeching": { "NAME": "Split: Leeching", - "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Leeching_Slime. NL slimeboundmod:Command !M! times. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Leeching_Slime. NL slimeboundmod:Command three times. NL Exhaust." + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Leeching_Slime. NL slimeboundmod:Rotate it to the front.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Leeching_Slime. NL slimeboundmod:Rotate it to the front. NL slimeboundmod:Command." }, "Slimebound:SplitMire": { "NAME": "Split: Mire", - "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Mire_Slime. NL slimeboundmod:Command !M! times. NL Exhaust.", - "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Mire_Slime. NL slimeboundmod:Command three times. NL Exhaust." + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Mire_Slime. NL slimeboundmod:Rotate it to the front.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Mire_Slime. NL slimeboundmod:Rotate it to the front. NL slimeboundmod:Command." }, "Slimebound:SplitScrap": { "NAME": "Revive Scrap", "DESCRIPTION": "Retain. NL Summon Scrap Ooze. NL Exhaust." }, "Slimebound:SplitSpecialist": { - "NAME": "Split: Specialist", - "DESCRIPTION": "Choose 1 of 3 slimeboundmod:Specialist to slimeboundmod:Split into. NL Exhaust.", - "UPGRADE_DESCRIPTION": "Choose 1 of 3 slimeboundmod:Specialist to slimeboundmod:Split into. NL slimeboundmod:Command. NL Exhaust." + "NAME": "Split: Hungry", + "DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Hungry_Slime. NL slimeboundmod:Rotate it to the front.", + "UPGRADE_DESCRIPTION": "slimeboundmod:Split into a slimeboundmod:Hungry_Slime. NL slimeboundmod:Rotate it to the front. NL slimeboundmod:Command." }, "Slimebound:Strike_Slimebound": { "NAME": "Strike", @@ -354,7 +361,11 @@ }, "Slimebound:Tackle": { "NAME": "Tackle", - "DESCRIPTION": "Deal !D! damage. NL Take !SlimeboundSelfharm! damage." + "DESCRIPTION": "Deal !D! damage. NL Gain !M! hermit:Bruise." + }, + "Slimebound:AfterDinnerTackle": { + "NAME": "After-Dinner Tackle", + "DESCRIPTION": "Deal !D! damage. NL Gain !M! hermit:Bruise. NL Whenever you slimeboundmod:Consume, return this from the discard pile to your hand." }, "Slimebound:TagTeam": { "NAME": "Glop Chop", @@ -383,4 +394,4 @@ "Not... Exhausted..." ] } -} +} \ No newline at end of file diff --git a/src/main/resources/slimeboundResources/localization/eng/KeywordStrings.json b/src/main/resources/slimeboundResources/localization/eng/KeywordStrings.json index e80be86c3..13f6d2e7b 100644 --- a/src/main/resources/slimeboundResources/localization/eng/KeywordStrings.json +++ b/src/main/resources/slimeboundResources/localization/eng/KeywordStrings.json @@ -14,7 +14,7 @@ "splitting" ], "PROPER_NAME": "Split", - "DESCRIPTION": "Spawn a Slime minion, who attacks at the start of each turn. NL If you have no empty slots, your oldest Slime is automatically #yAbsorbed to make room, granting you 1 #yStrength." + "DESCRIPTION": "Spawn a Slime, who takes action at the start of each turn. NL If you try to Split into a Slime that already exists, upgrade the existing one instead." }, { "NAMES": [ @@ -37,7 +37,7 @@ "commands" ], "PROPER_NAME": "Command", - "DESCRIPTION": "Your leading Slime attacks." + "DESCRIPTION": "Trigger a slime's action. Unless specified otherwise, it targets the leading slime." }, { "NAMES": [ @@ -56,7 +56,7 @@ "bruiser" ], "PROPER_NAME": "Bruiser Slime", - "DESCRIPTION": "Attacks for #b5 each turn." + "DESCRIPTION": "Attacks for #b5 each turn. When upgraded, increase damage by #b3." }, { "NAMES": [ @@ -66,6 +66,38 @@ "PROPER_NAME": "Cultist Slime", "DESCRIPTION": "Attacks for #b6 each turn, then increases its damage by #b1." }, + { + "NAMES": [ + "reckless slime", + "reckless_slime" + ], + "PROPER_NAME": "Reckless Slime", + "DESCRIPTION": "Attacks for #b3 each turn. This slime is #yCommanded whenever you play a #yTackle card. When upgraded, increase damage by #b2." + }, + { + "NAMES": [ + "hungry slime", + "hungry_slime" + ], + "PROPER_NAME": "Hungry Slime", + "DESCRIPTION": "Attacks for #b3 each turn. This slime is #yCommanded whenever you #yConsume. When upgraded, increase damage by #b2." + }, + { + "NAMES": [ + "general slime", + "general_slime" + ], + "PROPER_NAME": "General Slime", + "DESCRIPTION": "Each turn and when #yCommanded, #yCommands #b2 other Slimes at random. When upgraded, increase the number of Slimes #yCommanded by #b1." + }, + { + "NAMES": [ + "tarr slime", + "tarr_slime" + ], + "PROPER_NAME": "Tarr Slime", + "DESCRIPTION": "Each turn and when #yCommanded, #yRotate this to the front. Cannot be upgraded." + }, { "NAMES": [ "leeching slime", @@ -75,7 +107,7 @@ "leeching" ], "PROPER_NAME": "Leeching Slime", - "DESCRIPTION": "Attacks for #b1 and grants you #b3 #yBlock each turn." + "DESCRIPTION": "Grants you #b3 #yBlock each turn. When upgraded, increase #yBlock by #b2." }, { "NAMES": [ @@ -86,7 +118,7 @@ "guerilla" ], "PROPER_NAME": "Guerilla Slime", - "DESCRIPTION": "Attacks for #b3 to ALL enemies each turn." + "DESCRIPTION": "Attacks for #b3 to ALL enemies each turn. When upgraded, increase damage by #b2." }, { "NAMES": [ @@ -97,7 +129,7 @@ "mire" ], "PROPER_NAME": "Mire Slime", - "DESCRIPTION": "Attacks for #b2 and applies #b2 #yGoop each turn." + "DESCRIPTION": "Attacks for #b2 and applies #b2 #yGoop each turn. When upgraded, increase #yGoop by #b3." }, { "NAMES": [ @@ -206,5 +238,12 @@ ], "PROPER_NAME": "Buried", "DESCRIPTION": "Buried cards will always be chosen last for random #yExhume effects." + }, + { + "NAMES": [ + "rotate" + ], + "PROPER_NAME": "Rotate", + "DESCRIPTION": "Move the frontmost slime to the back, unless otherwise specified." } -] +] \ No newline at end of file diff --git a/src/main/resources/slimeboundResources/localization/eng/OrbStrings.json b/src/main/resources/slimeboundResources/localization/eng/OrbStrings.json index 997ff5d6c..1caf0a220 100644 --- a/src/main/resources/slimeboundResources/localization/eng/OrbStrings.json +++ b/src/main/resources/slimeboundResources/localization/eng/OrbStrings.json @@ -17,7 +17,34 @@ "NAME": "Bruiser Slime", "DESCRIPTION": [ "Deals #b", - " damage at the start of your turn." + " damage at the start of your turn. When upgraded, increase damage by #b3." + ] + }, + "Slimebound:GeneralSlime": { + "NAME": "General Slime", + "DESCRIPTION": [ + "#yCommands #b", + " random other Slimes at the start of your turn or when Commanded. When upgraded, increase the number of Slimes Commanded by #b1." + ] + }, + "Slimebound:TarrSlime": { + "NAME": "Tarr Slime", + "DESCRIPTION": [ + "#yRotates to the front at the start of your turn. Cannot be upgraded." + ] + }, + "Slimebound:RecklessSlime": { + "NAME": "Reckless Slime", + "DESCRIPTION": [ + "Deals #b", + " damage at the start of your turn. Whenever you play a #yTackle, #yCommand this. When upgraded, increase damage by #b2." + ] + }, + "Slimebound:HungrySlime": { + "NAME": "Hungry Slime", + "DESCRIPTION": [ + "Deals #b", + " damage at the start of your turn. Whenever you #yConsume, #yCommand this. When upgraded, increase damage by #b2." ] }, "Slimebound:ScrapOozeSlime": { @@ -49,26 +76,24 @@ ] }, "Slimebound:ShieldSlime": { - "NAME": "Leeching Slime", + "NAME": "Armored Slime", "DESCRIPTION": [ - "Deals #b", - " damage at the start of your turn and grants you #b", - " #yBlock." + "Grants you #b", + " #yBlock at the start of your turn. When upgraded, increase #yBlock by #b2." ] }, "Slimebound:PoisonSlime": { "NAME": "Guerilla Slime", "DESCRIPTION": [ "Deals #b", - " damage to ALL enemies at the start of your turn." + " damage to ALL enemies at the start of your turn. When upgraded, increase damage by #b2." ] }, "Slimebound:SlimingSlime": { "NAME": "Mire Slime", "DESCRIPTION": [ - "Deals #b", - " damage and applies #b", - " #yGoop at the start of your turn." + "Applies #b", + " #yGoop at the start of your turn. When upgraded, increase Goop by #b3." ] }, "Slimebound:HexSlime": { diff --git a/src/main/resources/slimeboundResources/localization/eng/PowerStrings.json b/src/main/resources/slimeboundResources/localization/eng/PowerStrings.json index fd987c0d7..dca6463ec 100644 --- a/src/main/resources/slimeboundResources/localization/eng/PowerStrings.json +++ b/src/main/resources/slimeboundResources/localization/eng/PowerStrings.json @@ -17,8 +17,8 @@ "Slimebound:PreventTackleDamagePower": { "NAME": "Protected", "DESCRIPTIONS": [ - "You do not take damage from the next #b", - " #yTackles you play." + "The next #b", + " #yTackles you play do not #yBruise you." ] }, "Slimebound:SplitDailyTriggerPower": { @@ -517,5 +517,41 @@ "Adds ", " Goop at the start of this enemy's turn." ] + }, + "Slimebound:HauntingLickPower": { + "NAME": "Haunting Licks", + "DESCRIPTIONS": [ + "Whenever you play a #yLick, apply #b", + " #yVulnerable." + ] + }, + "Slimebound:NibblePower": { + "NAME": "Nibble Licks", + "DESCRIPTIONS": [ + "Whenever you play a #yLick, deal #b", + " damage." + ] + }, + "Slimebound:MegaLickPower": { + "NAME": "Mega Licks", + "DESCRIPTIONS": [ + "Whenever you play a #yLick, apply #b", + " #yWeak." + ] + }, + "Slimebound:SamplingLickPower": { + "NAME": "Sampling Licks", + "DESCRIPTIONS": [ + "Whenever you play a #yLick, gain #b", + " #yBlock." + ] + }, + "Slimebound:PainToPowerPower": { + "NAME": "Pain To Power", + "DESCRIPTIONS": [ + "At the end of your turn, gain #b", + " #yStrength for every #b", + " #yBruise you have." + ] } } diff --git a/src/main/resources/slimeboundResources/localization/eng/RelicStrings.json b/src/main/resources/slimeboundResources/localization/eng/RelicStrings.json index 4eec9004d..3758a800f 100644 --- a/src/main/resources/slimeboundResources/localization/eng/RelicStrings.json +++ b/src/main/resources/slimeboundResources/localization/eng/RelicStrings.json @@ -26,7 +26,7 @@ "NAME": "Stone of Nomakk", "FLAVOR": "When presented to one of your Goop Gang, it seems to make the blob dance.", "DESCRIPTIONS": [ - "At the start of combat, gain #b2 #yslimeboundmod:Potency." + "At the start of combat, gain #b1 #yslimeboundmod:Potency." ] }, "Slimebound:DailySplitRelic": { @@ -86,14 +86,14 @@ "NAME": "Protective Gear", "FLAVOR": "The best defense is a good offense.", "DESCRIPTIONS": [ - "Reduce the damage you take from #yslimeboundmod:Tackles by #b3." + "#yslimeboundmod:Tackles no longer hermit:Bruise you." ] }, "Slimebound:TarBlob": { "NAME": "Tarr Blob", "FLAVOR": "The bad kind of Slime.", "DESCRIPTIONS": [ - "Gain [E] at the start of your turn. At the start of combat, lose #b1 Slime slot." + "Gain [E] at the start of your turn. At the start of combat, #yslimeboundmod:Split into a #yslimeboundmod:Tarr_Slime." ] }, "Slimebound:StickyStick": { @@ -103,4 +103,4 @@ "Whenever you draw a #yStatus card, draw #b1 card." ] } -} +} \ No newline at end of file