diff --git a/pom.xml b/pom.xml index fec992a..8334b12 100644 --- a/pom.xml +++ b/pom.xml @@ -21,14 +21,14 @@ com.evacipated.cardcrawl ModTheSpire - 2.8.0 + 3.0.0 system ${basedir}/../lib/ModTheSpire.jar com.evacipated.cardcrawl BaseMod - 2.14.0 + 3.0.0 system ${basedir}/../lib/BaseMod.jar diff --git a/src/main/java/Initializer.java b/src/main/java/kobting/friendlyminions/Initializer.java similarity index 77% rename from src/main/java/Initializer.java rename to src/main/java/kobting/friendlyminions/Initializer.java index 40c6fd6..dc65ff4 100644 --- a/src/main/java/Initializer.java +++ b/src/main/java/kobting/friendlyminions/Initializer.java @@ -1,17 +1,18 @@ +package kobting.friendlyminions; + import basemod.BaseMod; import basemod.interfaces.*; -import cards.MonsterCard; -import characters.AbstractPlayerWithMinions; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import kobting.friendlyminions.cards.MonsterCard; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; -import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.rooms.AbstractRoom; -import helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; @SpireInitializer -public class Initializer implements EditCardsSubscriber, PostBattleSubscriber, EditKeywordsSubscriber { +public class Initializer implements + EditCardsSubscriber, PostBattleSubscriber, + EditKeywordsSubscriber { //Used by @SpireInitializer public static void initialize(){ @@ -45,4 +46,5 @@ public void receiveEditKeywords() { BaseMod.addKeyword(minionKeyword, "A friendly monster that fights for you and has a chance to receive #yVulnerable, #yWeak, #yFrail, or #yStrength loss instead of you."); } + } diff --git a/src/main/java/actions/ChooseAction.java b/src/main/java/kobting/friendlyminions/actions/ChooseAction.java similarity index 98% rename from src/main/java/actions/ChooseAction.java rename to src/main/java/kobting/friendlyminions/actions/ChooseAction.java index 047ba71..57cc842 100644 --- a/src/main/java/actions/ChooseAction.java +++ b/src/main/java/kobting/friendlyminions/actions/ChooseAction.java @@ -1,4 +1,4 @@ -package actions; +package kobting.friendlyminions.actions; import com.megacrit.cardcrawl.actions.AbstractGameAction; import com.megacrit.cardcrawl.cards.AbstractCard; diff --git a/src/main/java/actions/ChooseActionInfo.java b/src/main/java/kobting/friendlyminions/actions/ChooseActionInfo.java similarity index 92% rename from src/main/java/actions/ChooseActionInfo.java rename to src/main/java/kobting/friendlyminions/actions/ChooseActionInfo.java index 16a8303..e9ec7b8 100644 --- a/src/main/java/actions/ChooseActionInfo.java +++ b/src/main/java/kobting/friendlyminions/actions/ChooseActionInfo.java @@ -1,4 +1,4 @@ -package actions; +package kobting.friendlyminions.actions; public class ChooseActionInfo { diff --git a/src/main/java/cards/CustomSummonCard.java b/src/main/java/kobting/friendlyminions/cards/CustomSummonCard.java similarity index 54% rename from src/main/java/cards/CustomSummonCard.java rename to src/main/java/kobting/friendlyminions/cards/CustomSummonCard.java index fa05d68..88e8f99 100644 --- a/src/main/java/cards/CustomSummonCard.java +++ b/src/main/java/kobting/friendlyminions/cards/CustomSummonCard.java @@ -1,13 +1,9 @@ -package cards; +package kobting.friendlyminions.cards; import basemod.abstracts.CustomCard; public abstract class CustomSummonCard extends CustomCard { - public CustomSummonCard(String id, String name, String img, int cost, String rawDescription, CardType type, CardColor color, CardRarity rarity, CardTarget target, int cardPool) { - super(id, name, img, cost, rawDescription, type, color, rarity, target, cardPool); - } - public CustomSummonCard(String id, String name, String img, int cost, String rawDescription, CardType type, CardColor color, CardRarity rarity, CardTarget target) { super(id, name, img, cost, rawDescription, type, color, rarity, target); } diff --git a/src/main/java/cards/MonsterCard.java b/src/main/java/kobting/friendlyminions/cards/MonsterCard.java similarity index 95% rename from src/main/java/cards/MonsterCard.java rename to src/main/java/kobting/friendlyminions/cards/MonsterCard.java index 8fe83e2..3c3c894 100644 --- a/src/main/java/cards/MonsterCard.java +++ b/src/main/java/kobting/friendlyminions/cards/MonsterCard.java @@ -1,4 +1,4 @@ -package cards; +package kobting.friendlyminions.cards; import basemod.abstracts.CustomCard; import com.megacrit.cardcrawl.cards.AbstractCard; @@ -21,6 +21,7 @@ public void upgrade() { } + @Override public AbstractCard makeCopy() { return new MonsterCard(); diff --git a/src/main/java/characters/AbstractPlayerWithMinions.java b/src/main/java/kobting/friendlyminions/characters/AbstractPlayerWithMinions.java similarity index 75% rename from src/main/java/characters/AbstractPlayerWithMinions.java rename to src/main/java/kobting/friendlyminions/characters/AbstractPlayerWithMinions.java index e3bb39a..eb4a881 100644 --- a/src/main/java/characters/AbstractPlayerWithMinions.java +++ b/src/main/java/kobting/friendlyminions/characters/AbstractPlayerWithMinions.java @@ -1,33 +1,22 @@ -package characters; +package kobting.friendlyminions.characters; import basemod.abstracts.CustomPlayer; import basemod.animations.AbstractAnimation; import basemod.animations.G3DJAnimation; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.megacrit.cardcrawl.actions.AbstractGameAction; 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.core.EnergyManager; -import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.helpers.Hitbox; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.MonsterGroup; -import com.megacrit.cardcrawl.powers.*; -import com.megacrit.cardcrawl.screens.CharSelectInfo; -import enums.MonsterIntentEnum; -import monsters.AbstractFriendlyMonster; +import kobting.friendlyminions.enums.MonsterIntentEnum; +import kobting.friendlyminions.helpers.MonsterHelper; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; -import java.util.ArrayList; import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -public abstract class AbstractPlayerWithMinions extends CustomPlayer { +public abstract class AbstractPlayerWithMinions extends CustomPlayer{ public MonsterGroup minions; private AbstractFriendlyMonster[] p_minions; @@ -61,6 +50,11 @@ public void preBattlePrep() { clearMinions(); } + @Override + public void applyStartOfTurnRelics() { + super.applyStartOfTurnRelics(); + } + @Override public void damage(DamageInfo info) { @@ -72,7 +66,13 @@ public void damage(DamageInfo info) { } if(attackingMonster && minions.monsters.size() > 0) { - damageFriendlyMonster(info); + AbstractDungeon.actionManager.addToBottom(new DamageAction(MonsterHelper.getTarget((AbstractMonster) info.owner), info, AbstractGameAction.AttackEffect.NONE)); + //damageFriendlyMonster(info); + } + else if(attackingMonster && minions.monsters.size() <= 0) { + MonsterHelper.switchTarget((AbstractMonster) info.owner, null); + info.applyPowers(info.owner, this); + super.damage(info); } else { super.damage(info); @@ -152,7 +152,7 @@ public boolean addMinion(AbstractFriendlyMonster minion){ } else { minion.init(); minion.usePreBattleAction(); - minion.useUniversalPreBattleAction(); + //minion.useUniversalPreBattleAction(); //This might be causing blights to effect minions minion.showHealthBar(); minions.add(minion); return true; @@ -173,10 +173,10 @@ public void clearMinions(){ private boolean checkAttackMonsterIntent(AbstractMonster.Intent intent) { - if(intent == MonsterIntentEnum.ATTACK_MONSTER - || intent == MonsterIntentEnum.ATTACK_MONSTER_BUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEBUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEFEND) { + if(intent == MonsterIntentEnum.ATTACK_MINION + || intent == MonsterIntentEnum.ATTACK_MINION_BUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { return true; } @@ -185,18 +185,6 @@ private boolean checkAttackMonsterIntent(AbstractMonster.Intent intent) { } - /* This causes a delay when attacking the monster but I can't find another way around it other - * than patching every monsters attacks. Which isn't realistic. - * - * This is needed because if the player is blocking or intangible or has any effects applied it - * would count towards how the minions are damaged. - */ - private void damageFriendlyMonster(DamageInfo info){ - int randomMinionIndex = AbstractDungeon.aiRng.random(minions.monsters.size() - 1); - AbstractFriendlyMonster minion = (AbstractFriendlyMonster) minions.monsters.get(randomMinionIndex); - info.applyPowers(info.owner, minion); - AbstractDungeon.actionManager.addToBottom(new DamageAction(minions.monsters.get(randomMinionIndex), info, AbstractGameAction.AttackEffect.NONE)); - } public boolean hasMinions() { return minions.monsters.size() > 0; diff --git a/src/main/java/characters/CustomCharSelectInfo.java b/src/main/java/kobting/friendlyminions/characters/CustomCharSelectInfo.java similarity index 96% rename from src/main/java/characters/CustomCharSelectInfo.java rename to src/main/java/kobting/friendlyminions/characters/CustomCharSelectInfo.java index 349e02e..71e7fd6 100644 --- a/src/main/java/characters/CustomCharSelectInfo.java +++ b/src/main/java/kobting/friendlyminions/characters/CustomCharSelectInfo.java @@ -1,4 +1,4 @@ -package characters; +package kobting.friendlyminions.characters; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.screens.CharSelectInfo; diff --git a/src/main/java/enums/MonsterIntentEnum.java b/src/main/java/kobting/friendlyminions/enums/MonsterIntentEnum.java similarity index 61% rename from src/main/java/enums/MonsterIntentEnum.java rename to src/main/java/kobting/friendlyminions/enums/MonsterIntentEnum.java index fbbf2d2..820718c 100644 --- a/src/main/java/enums/MonsterIntentEnum.java +++ b/src/main/java/kobting/friendlyminions/enums/MonsterIntentEnum.java @@ -1,4 +1,4 @@ -package enums; +package kobting.friendlyminions.enums; import com.evacipated.cardcrawl.modthespire.lib.SpireEnum; import com.megacrit.cardcrawl.monsters.AbstractMonster; @@ -6,16 +6,16 @@ public class MonsterIntentEnum { @SpireEnum - public static AbstractMonster.Intent ATTACK_MONSTER; + public static AbstractMonster.Intent ATTACK_MINION; @SpireEnum - public static AbstractMonster.Intent ATTACK_MONSTER_BUFF; + public static AbstractMonster.Intent ATTACK_MINION_BUFF; @SpireEnum - public static AbstractMonster.Intent ATTACK_MONSTER_DEBUFF; + public static AbstractMonster.Intent ATTACK_MINION_DEBUFF; @SpireEnum - public static AbstractMonster.Intent ATTACK_MONSTER_DEFEND; + public static AbstractMonster.Intent ATTACK_MINION_DEFEND; @SpireEnum public static AbstractMonster.Intent DEBUFF_MONSTER; diff --git a/src/main/java/helpers/BasePlayerMinionHelper.java b/src/main/java/kobting/friendlyminions/helpers/BasePlayerMinionHelper.java similarity index 85% rename from src/main/java/helpers/BasePlayerMinionHelper.java rename to src/main/java/kobting/friendlyminions/helpers/BasePlayerMinionHelper.java index d3002d5..b35adcb 100644 --- a/src/main/java/helpers/BasePlayerMinionHelper.java +++ b/src/main/java/kobting/friendlyminions/helpers/BasePlayerMinionHelper.java @@ -1,15 +1,11 @@ -package helpers; +package kobting.friendlyminions.helpers; import com.megacrit.cardcrawl.characters.AbstractPlayer; -import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.MonsterGroup; -import monsters.AbstractFriendlyMonster; -import patches.PlayerAddFieldsPatch; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; +import kobting.friendlyminions.patches.PlayerAddFieldsPatch; -import java.util.ArrayList; import java.util.Objects; -import java.util.Optional; public class BasePlayerMinionHelper { @@ -30,7 +26,7 @@ public static boolean addMinion(AbstractPlayer player, AbstractFriendlyMonster m } else { minionToAdd.init(); minionToAdd.usePreBattleAction(); - minionToAdd.useUniversalPreBattleAction(); + //minionToAdd.useUniversalPreBattleAction(); minionToAdd.showHealthBar(); minions.add(minionToAdd); return true; diff --git a/src/main/java/helpers/MinionConfigHelper.java b/src/main/java/kobting/friendlyminions/helpers/MinionConfigHelper.java similarity index 78% rename from src/main/java/helpers/MinionConfigHelper.java rename to src/main/java/kobting/friendlyminions/helpers/MinionConfigHelper.java index 532cdbb..5170187 100644 --- a/src/main/java/helpers/MinionConfigHelper.java +++ b/src/main/java/kobting/friendlyminions/helpers/MinionConfigHelper.java @@ -1,4 +1,4 @@ -package helpers; +package kobting.friendlyminions.helpers; public class MinionConfigHelper { diff --git a/src/main/java/kobting/friendlyminions/helpers/MonsterHelper.java b/src/main/java/kobting/friendlyminions/helpers/MonsterHelper.java new file mode 100644 index 0000000..3d6f48d --- /dev/null +++ b/src/main/java/kobting/friendlyminions/helpers/MonsterHelper.java @@ -0,0 +1,48 @@ +package kobting.friendlyminions.helpers; + +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import kobting.friendlyminions.enums.MonsterIntentEnum; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; +import kobting.friendlyminions.patches.MonsterAddFieldsPatch; + +public class MonsterHelper { + + public static void setTarget(AbstractMonster monster, AbstractFriendlyMonster target) { + MonsterAddFieldsPatch.f_target.set(monster, target); + } + + public static AbstractFriendlyMonster getTarget(AbstractMonster monster) { + return MonsterAddFieldsPatch.f_target.get(monster); + } + + + /** + * Use to switch a monsters current target to someone else. Passing in null will cause + * the target to be the player. + * @param monster + * @param newTarget + */ + public static void switchTarget(AbstractMonster monster, AbstractFriendlyMonster newTarget) { + + AbstractMonster.Intent intent = monster.intent; + + if(newTarget == null) { + if(intent == MonsterIntentEnum.ATTACK_MINION) { + monster.intent = AbstractMonster.Intent.ATTACK; + } + else if(intent == MonsterIntentEnum.ATTACK_MINION_BUFF) { + monster.intent = AbstractMonster.Intent.ATTACK_BUFF; + } + else if(intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF) { + monster.intent = AbstractMonster.Intent.ATTACK_DEBUFF; + } + else if(intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { + monster.intent = AbstractMonster.Intent.ATTACK_DEFEND; + } + + } + + setTarget(monster, newTarget); + monster.applyPowers(); + } +} diff --git a/src/main/java/monsters/AbstractFriendlyMonster.java b/src/main/java/kobting/friendlyminions/monsters/AbstractFriendlyMonster.java similarity index 88% rename from src/main/java/monsters/AbstractFriendlyMonster.java rename to src/main/java/kobting/friendlyminions/monsters/AbstractFriendlyMonster.java index 14d1dab..fe5535d 100644 --- a/src/main/java/monsters/AbstractFriendlyMonster.java +++ b/src/main/java/kobting/friendlyminions/monsters/AbstractFriendlyMonster.java @@ -1,17 +1,16 @@ -package monsters; +package kobting.friendlyminions.monsters; -import actions.ChooseAction; -import actions.ChooseActionInfo; -import cards.MonsterCard; -import characters.AbstractPlayerWithMinions; -import com.badlogic.gdx.graphics.Color; +import kobting.friendlyminions.actions.ChooseAction; +import kobting.friendlyminions.actions.ChooseActionInfo; +import kobting.friendlyminions.cards.MonsterCard; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.vfx.TintEffect; -import helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; import java.util.ArrayList; @@ -63,9 +62,10 @@ public void die() { if(!(AbstractDungeon.player instanceof AbstractPlayerWithMinions)){ BasePlayerMinionHelper.removeMinion(AbstractDungeon.player, this); } else { + this.isDead = true; ((AbstractPlayerWithMinions)AbstractDungeon.player).removeMinion(this); } - super.die(); + super.die(false); } @Override diff --git a/src/main/java/patches/ApplyPowerActionPatch.java b/src/main/java/kobting/friendlyminions/patches/ApplyPowerActionPatch.java similarity index 92% rename from src/main/java/patches/ApplyPowerActionPatch.java rename to src/main/java/kobting/friendlyminions/patches/ApplyPowerActionPatch.java index 8b6ef58..78ac826 100644 --- a/src/main/java/patches/ApplyPowerActionPatch.java +++ b/src/main/java/kobting/friendlyminions/patches/ApplyPowerActionPatch.java @@ -1,6 +1,6 @@ -package patches; +package kobting.friendlyminions.patches; -import characters.AbstractPlayerWithMinions; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.actions.AbstractGameAction; @@ -10,10 +10,9 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.MonsterGroup; import com.megacrit.cardcrawl.powers.*; -import enums.MonsterIntentEnum; -import helpers.BasePlayerMinionHelper; -import helpers.MinionConfigHelper; -import monsters.AbstractFriendlyMonster; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.MinionConfigHelper; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; import java.lang.reflect.Field; diff --git a/src/main/java/patches/CardPatch.java b/src/main/java/kobting/friendlyminions/patches/CardPatch.java similarity index 86% rename from src/main/java/patches/CardPatch.java rename to src/main/java/kobting/friendlyminions/patches/CardPatch.java index 84e3fcf..5ecf914 100644 --- a/src/main/java/patches/CardPatch.java +++ b/src/main/java/kobting/friendlyminions/patches/CardPatch.java @@ -1,13 +1,13 @@ -package patches; +package kobting.friendlyminions.patches; -import cards.CustomSummonCard; -import characters.AbstractPlayerWithMinions; +import kobting.friendlyminions.cards.CustomSummonCard; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.characters.AbstractPlayer; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; @SpirePatch( cls = "com.megacrit.cardcrawl.cards.AbstractCard", diff --git a/src/main/java/kobting/friendlyminions/patches/MonsterAddFieldsPatch.java b/src/main/java/kobting/friendlyminions/patches/MonsterAddFieldsPatch.java new file mode 100644 index 0000000..34747cb --- /dev/null +++ b/src/main/java/kobting/friendlyminions/patches/MonsterAddFieldsPatch.java @@ -0,0 +1,15 @@ +package kobting.friendlyminions.patches; + +import com.evacipated.cardcrawl.modthespire.lib.SpireField; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; + +@SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = SpirePatch.CLASS +) +public class MonsterAddFieldsPatch { + + public static SpireField f_target = new SpireField<>(()-> null); + +} diff --git a/src/main/java/kobting/friendlyminions/patches/MonsterIntentPatch.java b/src/main/java/kobting/friendlyminions/patches/MonsterIntentPatch.java new file mode 100644 index 0000000..04b0987 --- /dev/null +++ b/src/main/java/kobting/friendlyminions/patches/MonsterIntentPatch.java @@ -0,0 +1,432 @@ +package kobting.friendlyminions.patches; + + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.math.MathUtils; +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.cards.DamageInfo; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.helpers.ImageMaster; +import com.megacrit.cardcrawl.helpers.PowerTip; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.monsters.EnemyMoveInfo; +import com.megacrit.cardcrawl.monsters.MonsterGroup; +import com.megacrit.cardcrawl.powers.AbstractPower; +import com.megacrit.cardcrawl.vfx.AbstractGameEffect; +import com.megacrit.cardcrawl.vfx.DebuffParticleEffect; +import com.megacrit.cardcrawl.vfx.ShieldParticleEffect; +import com.megacrit.cardcrawl.vfx.combat.BuffParticleEffect; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import kobting.friendlyminions.cards.MonsterCard; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; +import kobting.friendlyminions.enums.MonsterIntentEnum; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.MonsterHelper; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; + +import javax.swing.text.AbstractDocument; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; + + +public class MonsterIntentPatch { + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "createIntent" + ) + public static class CreateIntentPatch{ + + @SpireInsertPatch( + locator = Locator.class + ) + public static void Insert(AbstractMonster __instance) { + AbstractMonster.Intent _intent = __instance.intent; + if(((AbstractPlayerWithMinions)AbstractDungeon.player).hasMinions() || BasePlayerMinionHelper.hasMinions(AbstractDungeon.player)){ + if((_intent == MonsterIntentEnum.ATTACK_MINION + || _intent == MonsterIntentEnum.ATTACK_MINION_BUFF + || _intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || _intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) + && MonsterHelper.getTarget(__instance) == null) { + if(AbstractDungeon.player instanceof AbstractPlayerWithMinions) { + AbstractPlayerWithMinions player = (AbstractPlayerWithMinions) AbstractDungeon.player; + AbstractFriendlyMonster target = (AbstractFriendlyMonster) player.minions.getRandomMonster(); + MonsterHelper.setTarget(__instance, target); + } else { + AbstractFriendlyMonster target = (AbstractFriendlyMonster) BasePlayerMinionHelper.getMinions(AbstractDungeon.player).getRandomMonster(); + MonsterHelper.setTarget(__instance, target); + } + } + } + } + + public static void Prefix(AbstractMonster __instance) { + MonsterHelper.setTarget(__instance, null); + } + + public static class Locator extends SpireInsertLocator { + public int[] Locate(CtBehavior ctMethodToPatch) throws CannotCompileException, PatchingException { + + Matcher finalMatcher = new Matcher.MethodCallMatcher("com.megacrit.cardcrawl.monsters.AbstractMonster", "updateIntentTip"); + return LineFinder.findInOrder(ctMethodToPatch, new ArrayList(), finalMatcher); + + } + } + } + + + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "getIntentImg" + ) + public static class GetIntentImagePatch { + + public static SpireReturn Prefix(AbstractMonster __instance){ + + AbstractMonster.Intent intent = __instance.intent; + + if(intent == MonsterIntentEnum.ATTACK_MINION + || intent == MonsterIntentEnum.ATTACK_MINION_BUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { + return SpireReturn.Return(getAttackIntent(__instance)); + } + + return SpireReturn.Continue(); + } + + private static Texture getAttackIntent(AbstractMonster monster) { + + try { + Field isMultiDmg = AbstractMonster.class.getDeclaredField("isMultiDmg"); + Field intentDmg = AbstractMonster.class.getDeclaredField("intentDmg"); + Field intentMultiAmt = AbstractMonster.class.getDeclaredField("intentMultiAmt"); + isMultiDmg.setAccessible(true); + intentDmg.setAccessible(true); + intentMultiAmt.setAccessible(true); + + int tmp; + if (isMultiDmg.getBoolean(monster)) { + tmp = intentDmg.getInt(monster) * intentMultiAmt.getInt(monster); + } else { + tmp = intentDmg.getInt(monster); + } + + if (tmp < 5) { + return new Texture("images/intents/attack_monster_intent_1.png"); + } else if (tmp < 10) { + return new Texture("images/intents/attack_monster_intent_2.png"); + } else if (tmp < 15) { + return new Texture("images/intents/attack_monster_intent_3.png"); + } else if (tmp < 20) { + return new Texture("images/intents/attack_monster_intent_4.png"); + } else if (tmp < 25) { + return new Texture("images/intents/attack_monster_intent_5.png"); + } else { + return tmp < 30 ? new Texture("images/intents/attack_monster_intent_6.png") : new Texture("images/intents/attack_monster_intent_7.png"); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return null; + + } + + } + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "updateIntentVFX" + ) + public static class UpdateIntentVFXPatch { + + public static SpireReturn Prefix(AbstractMonster __instance) { + + try { + Field intentParticleTimer = AbstractMonster.class.getDeclaredField("intentParticleTimer"); + intentParticleTimer.setAccessible(true); + + Field intentVfx = AbstractMonster.class.getDeclaredField("intentVfx"); + intentVfx.setAccessible(true); + + if(__instance.intentAlpha > 0.0f) { + if(__instance.intent == MonsterIntentEnum.ATTACK_MINION_DEFEND){ + intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); + float valIntentParticleTime = intentParticleTimer.getFloat(__instance); + if (valIntentParticleTime < 0.0F) { + intentParticleTimer.setFloat(__instance, 0.5f); + ((ArrayList)intentVfx.get(__instance)).add(new ShieldParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); + return SpireReturn.Return(null); + } + } + else if(__instance.intent == MonsterIntentEnum.ATTACK_MINION_BUFF) { + intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); + float valIntentParticleTime = intentParticleTimer.getFloat(__instance); + if(valIntentParticleTime < 0.0F) { + intentParticleTimer.setFloat(__instance, 0.1f); + ((ArrayList)intentVfx.get(__instance)).add(new BuffParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); + return SpireReturn.Return(null); + } + } + else if(__instance.intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF) { + intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); + float valIntentParticleTime = intentParticleTimer.getFloat(__instance); + if(valIntentParticleTime < 0.0F) { + intentParticleTimer.setFloat(__instance, 1.0f); + ((ArrayList)intentVfx.get(__instance)).add(new DebuffParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); + return SpireReturn.Return(null); + } + } + } + + return SpireReturn.Continue(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return SpireReturn.Continue(); + } + + } + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "updateIntentTip" + ) + public static class UpdateIntentTipPatch { + + + public static SpireReturn Prefix(AbstractMonster __instance) { + + try { + + PowerTip intentTip; + boolean isMultiDamage; + int intentDmg; + int intentMultiAmt; + + Field f_intentTip = AbstractMonster.class.getDeclaredField("intentTip"); + f_intentTip.setAccessible(true); + Field f_isMultiDamage = AbstractMonster.class.getDeclaredField("isMultiDmg"); + f_isMultiDamage.setAccessible(true); + Field f_intentDmg = AbstractMonster.class.getDeclaredField("intentDmg"); + f_intentDmg.setAccessible(true); + Field f_intentMultiAmt = AbstractMonster.class.getDeclaredField("intentMultiAmt"); + f_intentMultiAmt.setAccessible(true); + + + intentTip = (PowerTip) f_intentTip.get(__instance); + isMultiDamage = f_isMultiDamage.getBoolean(__instance); + intentDmg = f_intentDmg.getInt(__instance); + intentMultiAmt = f_intentMultiAmt.getInt(__instance); + + AbstractMonster.Intent intent = __instance.intent; + AbstractPlayerWithMinions player = (AbstractPlayerWithMinions) AbstractDungeon.player; + MonsterGroup playerMinions = player.minions; + MonsterGroup playerMinion2 = BasePlayerMinionHelper.getMinions(AbstractDungeon.player); + AbstractFriendlyMonster target = MonsterHelper.getTarget(__instance); + + if(MonsterHelper.getTarget(__instance) != null) { + + if (intent == MonsterIntentEnum.ATTACK_MINION) { + String targetName = MonsterHelper.getTarget(__instance).name; + intentTip.header = "Aggressive"; + if(isMultiDamage) { + intentTip.body = "This enemy intends to NL #yAttack a #y" + targetName + " for #b" + intentDmg + " damage #b" + intentMultiAmt + " times."; + } else { + intentTip.body = "This enemy intends to NL #yAttack a #y" + targetName + " for #b" + intentDmg + " damage"; + } + Method method = AbstractMonster.class.getDeclaredMethod("getAttackIntentTip"); + method.setAccessible(true); + intentTip.img = (Texture) method.invoke(__instance); + } + else if (intent == MonsterIntentEnum.ATTACK_MINION_BUFF) { + String targetName = MonsterHelper.getTarget(__instance).name; + intentTip.header = "Aggressive"; + + if(isMultiDamage) { + intentTip.body = "This enemy intends to use a #yBuff and #yAttack a #y " + targetName + " for #b" + intentDmg + " damage #b" + intentMultiAmt + " times."; + } else { + intentTip.body = "This enemy intends to use a #yBuff and #yAttack a #y" + targetName + " for #b" + intentDmg + " damage."; + } + + intentTip.img = ImageMaster.INTENT_ATTACK_BUFF; + + } + else if (intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF) { + String targetName = MonsterHelper.getTarget(__instance).name; + intentTip.header = "Strategic"; + intentTip.body = "This enemy intends to inflict a #yNegative #yEffect on you and #yAttack a #y" + targetName + " for #b" + intentDmg + " damage."; + intentTip.img = ImageMaster.INTENT_ATTACK_DEBUFF; + + } + else if (intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { + String targetName = MonsterHelper.getTarget(__instance).name; + intentTip.header = "Aggressive"; + + if(isMultiDamage) { + intentTip.body = "This enemy intends to #yBlock and #yAttack a #y" + targetName + " for #b" + intentDmg + " damage #b" + intentMultiAmt + " times."; + } else { + intentTip.body = "This enemy intends to #yBlock and #yAttack a #y" + targetName + " for #b" + intentDmg + " damage."; + } + intentTip.img = ImageMaster.INTENT_ATTACK_DEFEND; + + } else { + return SpireReturn.Continue(); + } + } else if( + (MonsterHelper.getTarget(__instance) == null + || !playerMinions.monsters.contains(target) + || !playerMinion2.monsters.contains(target)) + && + (intent == MonsterIntentEnum.ATTACK_MINION + || intent == MonsterIntentEnum.ATTACK_MINION_DEFEND + || intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || intent == MonsterIntentEnum.ATTACK_MINION_BUFF + )){ + MonsterHelper.switchTarget(__instance, null); + return SpireReturn.Return(null); + } else { + return SpireReturn.Continue(); + } + + + f_intentTip.set(__instance, intentTip); + return SpireReturn.Return(null); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return SpireReturn.Continue(); + } + } + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "calculateDamage", + paramtypes = {"int"} + ) + public static class CalculateDamagePatch{ + + public static SpireReturn Prefix(AbstractMonster __instance, int dmg) { + + try { + Field f_intentDmg = AbstractMonster.class.getDeclaredField("intentDmg"); + f_intentDmg.setAccessible(true); + + AbstractMonster.Intent intent = __instance.intent; + + if(intent == MonsterIntentEnum.ATTACK_MINION + || intent == MonsterIntentEnum.ATTACK_MINION_BUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { + + AbstractFriendlyMonster target = MonsterHelper.getTarget(__instance); + + if(target == null) { + return SpireReturn.Continue(); + } else { + float tmp = dmg; + for(final AbstractPower p : __instance.powers) { + tmp = p.atDamageGive(tmp, DamageInfo.DamageType.NORMAL); + } + for(final AbstractPower p: target.powers) { + tmp = p.atDamageReceive(tmp, DamageInfo.DamageType.NORMAL); + } + for(final AbstractPower p: __instance.powers) { + tmp = p.atDamageFinalGive(tmp, DamageInfo.DamageType.NORMAL); + } + for(final AbstractPower p: target.powers) { + tmp = p.atDamageFinalReceive(tmp, DamageInfo.DamageType.NORMAL); + } + dmg = MathUtils.floor(tmp); + if(dmg < 0) dmg = 0; + f_intentDmg.set(__instance, dmg); + } + return SpireReturn.Return(null); + } else { + return SpireReturn.Continue(); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + return SpireReturn.Continue(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + return SpireReturn.Continue(); + } + } + + } + + @SpirePatch( + cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", + method = "applyPowers" + ) + public static class ApplyPowersPatch{ + + public static SpireReturn Prefix(AbstractMonster __instance) { + + try { + Field f_move = AbstractMonster.class.getDeclaredField("move"); + f_move.setAccessible(true); + Field f_intentImg = AbstractMonster.class.getDeclaredField("intentImg"); + f_intentImg.setAccessible(true); + Method m_calcDmg = AbstractMonster.class.getDeclaredMethod("calculateDamage", int.class); + m_calcDmg.setAccessible(true); + Method m_getIntentImg = AbstractMonster.class.getDeclaredMethod("getIntentImg"); + m_getIntentImg.setAccessible(true); + Method m_updateIntentTip = AbstractMonster.class.getDeclaredMethod("updateIntentTip"); + m_updateIntentTip.setAccessible(true); + + EnemyMoveInfo move = (EnemyMoveInfo) f_move.get(__instance); + + AbstractFriendlyMonster target = MonsterHelper.getTarget(__instance); + + if(target != null) { + for(final DamageInfo dmg: __instance.damage) { + dmg.applyPowers(__instance, target); + } + if(move.baseDamage > -1) { + m_calcDmg.invoke(__instance, move.baseDamage); + } + + f_intentImg.set(__instance, m_getIntentImg.invoke(__instance)); + m_updateIntentTip.invoke(__instance); + return SpireReturn.Return(null); + } else { + return SpireReturn.Continue(); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return SpireReturn.Continue(); + } + + } + +} diff --git a/src/main/java/patches/MonsterSetMovePatch.java b/src/main/java/kobting/friendlyminions/patches/MonsterSetMovePatch.java similarity index 68% rename from src/main/java/patches/MonsterSetMovePatch.java rename to src/main/java/kobting/friendlyminions/patches/MonsterSetMovePatch.java index 7f382bb..f2516d2 100644 --- a/src/main/java/patches/MonsterSetMovePatch.java +++ b/src/main/java/kobting/friendlyminions/patches/MonsterSetMovePatch.java @@ -1,39 +1,43 @@ -package patches; +package kobting.friendlyminions.patches; -import characters.AbstractPlayerWithMinions; -import com.badlogic.gdx.graphics.Texture; +import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.EnemyMoveInfo; -import enums.MonsterIntentEnum; -import helpers.BasePlayerMinionHelper; -import helpers.MinionConfigHelper; +import kobting.friendlyminions.enums.MonsterIntentEnum; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.MinionConfigHelper; +import kobting.friendlyminions.helpers.MonsterHelper; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; import java.lang.reflect.Field; @SpirePatch( - cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", - method = "setMove" + clz = AbstractMonster.class, + method = "setMove", + paramtypez = {String.class, byte.class, AbstractMonster.Intent.class, int.class, int.class, boolean.class} ) public class MonsterSetMovePatch { + @SpirePostfixPatch public static void Postfix(AbstractMonster monster, String moveName, byte nextMove, AbstractMonster.Intent intent, int baseDamage, int multiplier, boolean isMultiDamage) { if(BasePlayerMinionHelper.hasMinions(AbstractDungeon.player) || (AbstractDungeon.player instanceof AbstractPlayerWithMinions && ((AbstractPlayerWithMinions)AbstractDungeon.player).hasMinions())){ switch (intent) { case ATTACK: - maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MONSTER, nextMove, baseDamage, multiplier, isMultiDamage); + maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MINION, nextMove, baseDamage, multiplier, isMultiDamage); break; case ATTACK_BUFF: - maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MONSTER_BUFF, nextMove, baseDamage, multiplier, isMultiDamage); + maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MINION_BUFF, nextMove, baseDamage, multiplier, isMultiDamage); break; case ATTACK_DEBUFF: - maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MONSTER_DEBUFF, nextMove, baseDamage, multiplier, isMultiDamage); + maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MINION_DEBUFF, nextMove, baseDamage, multiplier, isMultiDamage); break; case ATTACK_DEFEND: - maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MONSTER_DEFEND, nextMove, baseDamage, multiplier, isMultiDamage); + maybeChangeIntent(monster, MonsterIntentEnum.ATTACK_MINION_DEFEND, nextMove, baseDamage, multiplier, isMultiDamage); break; } } @@ -56,6 +60,8 @@ private static void maybeChangeIntent(AbstractMonster monster, AbstractMonster.I moveInfo.set(monster, newInfo); + } else { + MonsterHelper.setTarget(monster, null); } System.out.println("-------- End Change Intent -------------"); @@ -67,8 +73,4 @@ private static void maybeChangeIntent(AbstractMonster monster, AbstractMonster.I } - private static void switchIntentType(AbstractMonster.Intent originalIntent) { - - } - } diff --git a/src/main/java/patches/PlayerAddFieldsPatch.java b/src/main/java/kobting/friendlyminions/patches/PlayerAddFieldsPatch.java similarity index 64% rename from src/main/java/patches/PlayerAddFieldsPatch.java rename to src/main/java/kobting/friendlyminions/patches/PlayerAddFieldsPatch.java index ebf189a..8564998 100644 --- a/src/main/java/patches/PlayerAddFieldsPatch.java +++ b/src/main/java/kobting/friendlyminions/patches/PlayerAddFieldsPatch.java @@ -1,16 +1,9 @@ -package patches; +package kobting.friendlyminions.patches; import com.evacipated.cardcrawl.modthespire.lib.SpireField; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatches; -import com.megacrit.cardcrawl.characters.AbstractPlayer; -import com.megacrit.cardcrawl.dungeons.AbstractDungeon; -import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.MonsterGroup; -import monsters.AbstractFriendlyMonster; - -import java.lang.reflect.Field; -import java.util.Objects; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; @SpirePatch( cls = "com.megacrit.cardcrawl.characters.AbstractPlayer", @@ -22,8 +15,8 @@ public class PlayerAddFieldsPatch { private static AbstractFriendlyMonster[] p_minions = new AbstractFriendlyMonster[maxMinions]; private static MonsterGroup minions = new MonsterGroup(p_minions); - public static SpireField f_baseMinions = new SpireField<>(maxMinions); - public static SpireField f_maxMinions = new SpireField<>(maxMinions); - public static SpireField f_minions = new SpireField<>(minions); + public static SpireField f_baseMinions = new SpireField<>(() ->maxMinions); + public static SpireField f_maxMinions = new SpireField<>(() ->maxMinions); + public static SpireField f_minions = new SpireField<>(() ->minions); } diff --git a/src/main/java/patches/PlayerMethodPatches.java b/src/main/java/kobting/friendlyminions/patches/PlayerMethodPatches.java similarity index 91% rename from src/main/java/patches/PlayerMethodPatches.java rename to src/main/java/kobting/friendlyminions/patches/PlayerMethodPatches.java index c842ab1..fca90b7 100644 --- a/src/main/java/patches/PlayerMethodPatches.java +++ b/src/main/java/kobting/friendlyminions/patches/PlayerMethodPatches.java @@ -1,10 +1,8 @@ -package patches; +package kobting.friendlyminions.patches; import basemod.BaseMod; -import characters.AbstractPlayerWithMinions; +import kobting.friendlyminions.characters.AbstractPlayerWithMinions; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.evacipated.cardcrawl.modthespire.lib.ByRef; -import com.evacipated.cardcrawl.modthespire.lib.SpireField; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.actions.AbstractGameAction; @@ -16,13 +14,10 @@ import com.megacrit.cardcrawl.monsters.AbstractMonster; import com.megacrit.cardcrawl.monsters.MonsterGroup; import com.megacrit.cardcrawl.rooms.MonsterRoom; -import enums.MonsterIntentEnum; -import helpers.BasePlayerMinionHelper; -import monsters.AbstractFriendlyMonster; - -import java.lang.reflect.Field; -import java.util.Objects; -import java.util.Optional; +import kobting.friendlyminions.enums.MonsterIntentEnum; +import kobting.friendlyminions.helpers.BasePlayerMinionHelper; +import kobting.friendlyminions.helpers.MonsterHelper; +import kobting.friendlyminions.monsters.AbstractFriendlyMonster; /* * All of these are checking against AbstractPlayerWithMinions to avoid double calling of those if @@ -59,7 +54,8 @@ public static SpireReturn Prefix(AbstractPlayer _instance, DamageInfo info) { attackingMonster = checkAttackMonsterIntent(owner.intent); } if (attackingMonster) { - damageFriendlyMonster(info); + //damageFriendlyMonster(info); + AbstractDungeon.actionManager.addToBottom(new DamageAction(MonsterHelper.getTarget((AbstractFriendlyMonster)info.owner), info, AbstractGameAction.AttackEffect.NONE)); return SpireReturn.Return(null); } else { return SpireReturn.Continue(); @@ -70,10 +66,10 @@ public static SpireReturn Prefix(AbstractPlayer _instance, DamageInfo info) { private static boolean checkAttackMonsterIntent(AbstractMonster.Intent intent) { - if(intent == MonsterIntentEnum.ATTACK_MONSTER - || intent == MonsterIntentEnum.ATTACK_MONSTER_BUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEBUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEFEND) { + if(intent == MonsterIntentEnum.ATTACK_MINION + || intent == MonsterIntentEnum.ATTACK_MINION_BUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEBUFF + || intent == MonsterIntentEnum.ATTACK_MINION_DEFEND) { return true; } diff --git a/src/main/java/patches/MonsterIntentPatch.java b/src/main/java/patches/MonsterIntentPatch.java deleted file mode 100644 index 45d130c..0000000 --- a/src/main/java/patches/MonsterIntentPatch.java +++ /dev/null @@ -1,139 +0,0 @@ -package patches; - - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Texture; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; -import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; -import com.megacrit.cardcrawl.monsters.AbstractMonster; -import com.megacrit.cardcrawl.vfx.AbstractGameEffect; -import com.megacrit.cardcrawl.vfx.DebuffParticleEffect; -import com.megacrit.cardcrawl.vfx.ShieldParticleEffect; -import com.megacrit.cardcrawl.vfx.combat.BuffParticleEffect; -import enums.MonsterIntentEnum; - -import java.lang.reflect.Field; -import java.util.ArrayList; - - -public class MonsterIntentPatch { - - - @SpirePatch( - cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", - method = "getIntentImg" - ) - public static class GetIntentImagePatch { - - public static SpireReturn Prefix(AbstractMonster __instance){ - - AbstractMonster.Intent intent = __instance.intent; - - if(intent == MonsterIntentEnum.ATTACK_MONSTER - || intent == MonsterIntentEnum.ATTACK_MONSTER_BUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEBUFF - || intent == MonsterIntentEnum.ATTACK_MONSTER_DEFEND) { - return SpireReturn.Return(getAttackIntent(__instance)); - } - - return SpireReturn.Continue(); - } - - private static Texture getAttackIntent(AbstractMonster monster) { - - try { - Field isMultiDmg = AbstractMonster.class.getDeclaredField("isMultiDmg"); - Field intentDmg = AbstractMonster.class.getDeclaredField("intentDmg"); - Field intentMultiAmt = AbstractMonster.class.getDeclaredField("intentMultiAmt"); - isMultiDmg.setAccessible(true); - intentDmg.setAccessible(true); - intentMultiAmt.setAccessible(true); - - int tmp; - if (isMultiDmg.getBoolean(monster)) { - tmp = intentDmg.getInt(monster) * intentMultiAmt.getInt(monster); - } else { - tmp = intentDmg.getInt(monster); - } - - if (tmp < 5) { - return new Texture("images/intents/attack_monster_intent_1.png"); - } else if (tmp < 10) { - return new Texture("images/intents/attack_monster_intent_2.png"); - } else if (tmp < 15) { - return new Texture("images/intents/attack_monster_intent_3.png"); - } else if (tmp < 20) { - return new Texture("images/intents/attack_monster_intent_4.png"); - } else if (tmp < 25) { - return new Texture("images/intents/attack_monster_intent_5.png"); - } else { - return tmp < 30 ? new Texture("images/intents/attack_monster_intent_6.png") : new Texture("images/intents/attack_monster_intent_7.png"); - } - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - return null; - - } - - } - - @SpirePatch( - cls = "com.megacrit.cardcrawl.monsters.AbstractMonster", - method = "updateIntentVFX" - ) - public static class UpdateIntentVFXPatch { - - public static SpireReturn Prefix(AbstractMonster __instance) { - - try { - Field intentParticleTimer = AbstractMonster.class.getDeclaredField("intentParticleTimer"); - intentParticleTimer.setAccessible(true); - - Field intentVfx = AbstractMonster.class.getDeclaredField("intentVfx"); - intentVfx.setAccessible(true); - - if(__instance.intentAlpha > 0.0f) { - if(__instance.intent == MonsterIntentEnum.ATTACK_MONSTER_DEFEND){ - intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); - float valIntentParticleTime = intentParticleTimer.getFloat(__instance); - if (valIntentParticleTime < 0.0F) { - intentParticleTimer.setFloat(__instance, 0.5f); - ((ArrayList)intentVfx.get(__instance)).add(new ShieldParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); - return SpireReturn.Return(null); - } - } - else if(__instance.intent == MonsterIntentEnum.ATTACK_MONSTER_BUFF) { - intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); - float valIntentParticleTime = intentParticleTimer.getFloat(__instance); - if(valIntentParticleTime < 0.0F) { - ((ArrayList)intentVfx.get(__instance)).add(new BuffParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); - return SpireReturn.Return(null); - } - } - else if(__instance.intent == MonsterIntentEnum.ATTACK_MONSTER_DEBUFF) { - intentParticleTimer.setFloat(__instance, intentParticleTimer.getFloat(__instance) - Gdx.graphics.getDeltaTime()); - float valIntentParticleTime = intentParticleTimer.getFloat(__instance); - if(valIntentParticleTime < 0.0F) { - ((ArrayList)intentVfx.get(__instance)).add(new DebuffParticleEffect(__instance.intentHb.cX, __instance.intentHb.cY)); - return SpireReturn.Return(null); - } - } - } - - return SpireReturn.Continue(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - - return SpireReturn.Continue(); - } - - } - -} diff --git a/src/main/resources/ModTheSpire.json b/src/main/resources/ModTheSpire.json index 7506355..0796d4c 100644 --- a/src/main/resources/ModTheSpire.json +++ b/src/main/resources/ModTheSpire.json @@ -4,6 +4,6 @@ "author_list": ["Kobting"], "description": "Library for creating friendly minions and custom characters that can use friendly minions.", "version": "0.1", - "sts_version": "7-8-2018", - "mts_version": "2.7.0" + "sts_version": "08-23-2018", + "mts_version": "3.0.0" } \ No newline at end of file