Skip to content

Commit 84a7279

Browse files
committed
Implement Black Tentacles
1 parent c9317b3 commit 84a7279

File tree

8 files changed

+189
-1
lines changed

8 files changed

+189
-1
lines changed

src/main/java/stsjorbsmod/JorbsMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.megacrit.cardcrawl.unlock.UnlockTracker;
2222
import org.apache.logging.log4j.LogManager;
2323
import org.apache.logging.log4j.Logger;
24+
import org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter;
2425
import stsjorbsmod.cards.*;
2526
import stsjorbsmod.characters.Wanderer;
2627
import stsjorbsmod.events.DeckOfManyThingsEvent;
@@ -347,6 +348,7 @@ public void receiveEditCards() {
347348
addUnlockedCard(new Strike_Wanderer(), Strike_Wanderer.ID);
348349
addUnlockedCard(new FreshAdventure(), FreshAdventure.ID);
349350
addUnlockedCard(new EyeOfTheStorm(), EyeOfTheStorm.ID);
351+
addUnlockedCard(new BlackTentacles(), BlackTentacles.ID);
350352
addUnlockedCard(new ArcaneWeapon(), ArcaneWeapon.ID);
351353
addUnlockedCard(new Firebolt(), Firebolt.ID);
352354
addUnlockedCard(new MagicMissles(), MagicMissles.ID);

src/main/java/stsjorbsmod/actions/RememberRandomMemoryAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void update() {
2323
candidates.removeIf(memory -> target.hasPower(memory.ID));
2424

2525
if (!candidates.isEmpty()) {
26-
int randomIndex = AbstractDungeon.cardRng.random.nextInt(candidates.size());
26+
int randomIndex = AbstractDungeon.cardRandomRng.random(0, candidates.size() - 1);
2727
AbstractMemoryPower chosenMemory = candidates.get(randomIndex);
2828
AbstractDungeon.actionManager.addToTop(new RememberSpecificMemoryAction(target, source, chosenMemory));
2929
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package stsjorbsmod.cards;
2+
3+
import com.megacrit.cardcrawl.actions.AbstractGameAction;
4+
import com.megacrit.cardcrawl.actions.common.ApplyPowerAction;
5+
import com.megacrit.cardcrawl.actions.common.DamageAction;
6+
import com.megacrit.cardcrawl.cards.DamageInfo;
7+
import com.megacrit.cardcrawl.characters.AbstractPlayer;
8+
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
9+
import com.megacrit.cardcrawl.monsters.AbstractMonster;
10+
import com.megacrit.cardcrawl.powers.WeakPower;
11+
import stsjorbsmod.JorbsMod;
12+
import stsjorbsmod.characters.Wanderer;
13+
import stsjorbsmod.powers.BlackTentaclesPower;
14+
15+
import static stsjorbsmod.JorbsMod.makeCardPath;
16+
17+
// Deal 10(12) damage and apply 3(5) weak
18+
public class BlackTentacles extends AbstractDynamicCard {
19+
public static final String ID = JorbsMod.makeID(BlackTentacles.class.getSimpleName());
20+
public static final String IMG = makeCardPath("Damage_Commons/black_tentacles.png");
21+
22+
private static final CardRarity RARITY = CardRarity.COMMON;
23+
private static final CardTarget TARGET = CardTarget.ENEMY;
24+
private static final CardType TYPE = CardType.ATTACK;
25+
public static final CardColor COLOR = Wanderer.Enums.COLOR_GRAY;
26+
27+
private static final int COST = 0;
28+
private static final int DAMAGE = 4;
29+
private static final int EFFECT_TURN_DURATION = 1;
30+
private static final int UPGRADE_PLUS_EFFECT_TURN_DURATION = 1;
31+
32+
public BlackTentacles() {
33+
super(ID, IMG, COST, TYPE, COLOR, RARITY, TARGET);
34+
baseDamage = DAMAGE;
35+
magicNumber = baseMagicNumber = EFFECT_TURN_DURATION;
36+
}
37+
38+
@Override
39+
public void use(AbstractPlayer p, AbstractMonster m) {
40+
AbstractDungeon.actionManager.addToBottom(
41+
new DamageAction(m, new DamageInfo(p, damage, damageTypeForTurn), AbstractGameAction.AttackEffect.SLASH_HORIZONTAL));
42+
AbstractDungeon.actionManager.addToBottom(
43+
new ApplyPowerAction(m, p, new BlackTentaclesPower(m, p, this.magicNumber), this.magicNumber));
44+
}
45+
46+
@Override
47+
public void upgrade() {
48+
if (!upgraded) {
49+
upgradeName();
50+
upgradeMagicNumber(UPGRADE_PLUS_EFFECT_TURN_DURATION);
51+
initializeDescription();
52+
}
53+
}
54+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package stsjorbsmod.patches;
2+
3+
import com.evacipated.cardcrawl.modthespire.lib.*;
4+
import com.megacrit.cardcrawl.actions.common.AttackDamageRandomEnemyAction;
5+
import com.megacrit.cardcrawl.cards.AbstractCard;
6+
import com.megacrit.cardcrawl.core.AbstractCreature;
7+
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
8+
import javassist.CtBehavior;
9+
import org.apache.logging.log4j.LogManager;
10+
import org.apache.logging.log4j.Logger;
11+
import stsjorbsmod.powers.BlackTentaclesPower;
12+
13+
import java.util.ArrayList;
14+
15+
@SpirePatch(
16+
clz = AttackDamageRandomEnemyAction.class,
17+
method = "update"
18+
)
19+
public class BlackTentaclesOverrideAttackDamageRandomEnemyActionPatch {
20+
private static final Logger logger = LogManager.getLogger(BlackTentaclesOverrideAttackDamageRandomEnemyActionPatch.class.getName());
21+
22+
@SpireInsertPatch(
23+
locator = Locator.class
24+
)
25+
public static void patch(AttackDamageRandomEnemyAction action) {
26+
logger.info("Entering AttackDamageRandomEnemyAction patch");
27+
ArrayList<AbstractCreature> candidateTargetsWithBlackTentacles = new ArrayList<>();
28+
for (AbstractCreature m : AbstractDungeon.getMonsters().monsters) {
29+
if (!m.halfDead && !m.isDying && !m.isEscaping && m.hasPower(BlackTentaclesPower.POWER_ID)) {
30+
candidateTargetsWithBlackTentacles.add(m);
31+
}
32+
}
33+
if (!candidateTargetsWithBlackTentacles.isEmpty()) {
34+
logger.info("Black Tentacles overriding AttackDamageRandomEnemyAction target");
35+
int blackTentaclesTargetIndex = AbstractDungeon.cardRandomRng.random(0, candidateTargetsWithBlackTentacles.size() - 1);
36+
action.target = candidateTargetsWithBlackTentacles.get(blackTentaclesTargetIndex);
37+
}
38+
logger.info("Leaving AttackDamageRandomEnemyAction patch");
39+
}
40+
41+
private static class Locator extends SpireInsertLocator {
42+
@Override
43+
public int[] Locate(CtBehavior ctMethodToPatch) throws Exception {
44+
Matcher finalMatcher = new Matcher.MethodCallMatcher(AbstractCard.class, "calculateCardDamage");
45+
return LineFinder.findInOrder(ctMethodToPatch, finalMatcher);
46+
}
47+
}
48+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package stsjorbsmod.powers;
2+
3+
import basemod.interfaces.CloneablePowerInterface;
4+
import com.badlogic.gdx.graphics.Texture;
5+
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
6+
import com.megacrit.cardcrawl.actions.AbstractGameAction;
7+
import com.megacrit.cardcrawl.actions.common.AttackDamageRandomEnemyAction;
8+
import com.megacrit.cardcrawl.actions.common.DrawCardAction;
9+
import com.megacrit.cardcrawl.actions.common.ReducePowerAction;
10+
import com.megacrit.cardcrawl.actions.common.RemoveSpecificPowerAction;
11+
import com.megacrit.cardcrawl.actions.unique.RetainCardsAction;
12+
import com.megacrit.cardcrawl.cards.AbstractCard;
13+
import com.megacrit.cardcrawl.core.AbstractCreature;
14+
import com.megacrit.cardcrawl.core.CardCrawlGame;
15+
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
16+
import com.megacrit.cardcrawl.localization.PowerStrings;
17+
import com.megacrit.cardcrawl.powers.AbstractPower;
18+
import stsjorbsmod.JorbsMod;
19+
import stsjorbsmod.util.TextureLoader;
20+
21+
import static stsjorbsmod.JorbsMod.makePowerPath;
22+
23+
// attacks with random targets (specifically, uses of the AttackDamageRandomEnemyAction) target this enemy
24+
// The actual implementation is in BlackTentaclesOverrideAttackDamageRandomEnemyActionPatch
25+
public class BlackTentaclesPower extends AbstractPower implements CloneablePowerInterface {
26+
public AbstractCreature source;
27+
28+
public static final String POWER_ID = JorbsMod.makeID(BlackTentaclesPower.class.getSimpleName());
29+
private static final PowerStrings powerStrings = CardCrawlGame.languagePack.getPowerStrings(POWER_ID);
30+
public static final String NAME = powerStrings.NAME;
31+
public static final String[] DESCRIPTIONS = powerStrings.DESCRIPTIONS;
32+
33+
private static final Texture tex84 = TextureLoader.getTexture(makePowerPath("black_tentacles_power84.png"));
34+
private static final Texture tex32 = TextureLoader.getTexture(makePowerPath("black_tentacles_power32.png"));
35+
36+
public BlackTentaclesPower(final AbstractCreature owner, final AbstractCreature source, final int amount) {
37+
ID = POWER_ID;
38+
this.name = NAME;
39+
40+
this.owner = owner;
41+
this.source = source;
42+
this.amount = amount;
43+
44+
this.isTurnBased = true;
45+
46+
this.region128 = new TextureAtlas.AtlasRegion(tex84, 0, 0, 84, 84);
47+
this.region48 = new TextureAtlas.AtlasRegion(tex32, 0, 0, 32, 32);
48+
49+
updateDescription();
50+
}
51+
52+
@Override
53+
public void atEndOfRound() {
54+
if (this.amount == 0) {
55+
AbstractDungeon.actionManager.addToBottom(new RemoveSpecificPowerAction(this.owner, this.owner, this.ID));
56+
} else {
57+
AbstractDungeon.actionManager.addToBottom(new ReducePowerAction(this.owner, this.owner, this.ID, 1));
58+
}
59+
}
60+
61+
@Override
62+
public void updateDescription() {
63+
description = DESCRIPTIONS[0] + this.amount + (this.amount == 1 ? DESCRIPTIONS[1] : DESCRIPTIONS[2]);
64+
}
65+
66+
@Override
67+
public AbstractPower makeCopy() {
68+
return new BlackTentaclesPower(owner, source, amount);
69+
}
70+
}
71+
5.48 KB
Loading

src/main/resources/stsjorbsmodResources/localization/eng/JorbsMod-Card-Strings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
"NAME": "Eye of the Storm",
4242
"DESCRIPTION": "Gain stsjorbsmod:Clarity of current memory, then remember a random memory you do not have stsjorbsmod:Clarity of. NL Gain !B! Block."
4343
},
44+
"stsjorbsmod:BlackTentacles": {
45+
"NAME": "Black Tentacles",
46+
"DESCRIPTION": "Deal !D! Damage. NL Attacks with random targets target this enemy for !M! turn.",
47+
"UPGRADE_DESCRIPTION": "Deal !D! Damage. NL Attacks with random targets target this enemy for !M! turns."
48+
},
4449
"stsjorbsmod:ArcaneWeapon": {
4550
"NAME": "Arcane Weapon",
4651
"DESCRIPTION": "At the end of each turn, attack a random enemy for !D! Damage."

src/main/resources/stsjorbsmodResources/localization/eng/JorbsMod-Power-Strings.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@
2222
" Damage."
2323
]
2424
},
25+
"stsjorbsmod:BlackTentaclesPower": {
26+
"NAME": "Black Tentacles",
27+
"DESCRIPTIONS": [
28+
"Attacks with random targets target this enemy for #b",
29+
" turn.",
30+
" turns."
31+
]
32+
},
2533
"stsjorbsmod:CoilPower": {
2634
"NAME": "Coil",
2735
"DESCRIPTIONS": [

0 commit comments

Comments
 (0)