ソースを参照

完成遗物效果,增加能力:加速,增加卡图,增加一些卡片。

Luxnk 6 年 前
コミット
0bff0c070e
38 ファイル変更631 行追加92 行削除
  1. 46 50
      mxmmod/src/main/java/xyz/luxnk/mxmmod/MxmMod.java
  2. 61 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Dexterity_MXM.java
  3. 70 1
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Headbutt_MXM.java
  4. 2 1
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/PoorWine_MXM.java
  5. 72 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/PreciseStab_MXM.java
  6. 5 1
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/QuickStrike_MXM.java
  7. 1 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SadCat_MXM.java
  8. 61 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SavageStab_MXM.java
  9. 66 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SpeedUp_MXM.java
  10. 4 8
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Whirlwind_MXM.java
  11. 61 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Strength_MXM.java
  12. 1 1
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Strike_MXM.java
  13. 1 1
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/TwinStrike_MXM.java
  14. 4 9
      mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SpeedUp.java
  15. 3 4
      mxmmod/src/main/java/xyz/luxnk/mxmmod/characters/Mxm.java
  16. 85 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/power/SpeedUpPower.java
  17. 13 4
      mxmmod/src/main/java/xyz/luxnk/mxmmod/relics/Hamakagami.java
  18. 24 0
      mxmmod/src/main/java/xyz/luxnk/mxmmod/util/SpeedUpUtil.java
  19. BIN
      mxmmod/src/main/resources/img/1024/bg_attack_MRS.png
  20. BIN
      mxmmod/src/main/resources/img/1024/bg_attack_mxm.png
  21. BIN
      mxmmod/src/main/resources/img/1024/bg_power_MRS.png
  22. BIN
      mxmmod/src/main/resources/img/1024/bg_power_mxm.png
  23. BIN
      mxmmod/src/main/resources/img/1024/bg_skill_MRS.png
  24. BIN
      mxmmod/src/main/resources/img/512/bg_attack_MRS_s.png
  25. BIN
      mxmmod/src/main/resources/img/512/bg_attack_mxm_s.png
  26. BIN
      mxmmod/src/main/resources/img/512/bg_power_MRS_s.png
  27. BIN
      mxmmod/src/main/resources/img/512/bg_power_mxm_s.png
  28. BIN
      mxmmod/src/main/resources/img/512/bg_skill_MRS_s.png
  29. BIN
      mxmmod/src/main/resources/img/cards/attack/strike_mxm.png
  30. BIN
      mxmmod/src/main/resources/img/cards/attack/strike_mxm_p.png
  31. BIN
      mxmmod/src/main/resources/img/cards/skill/poor_wine.png
  32. BIN
      mxmmod/src/main/resources/img/cards/skill/poor_wine_p.png
  33. BIN
      mxmmod/src/main/resources/img/powers/generator.png
  34. BIN
      mxmmod/src/main/resources/img/relics/hamakagami_used.png
  35. 31 7
      mxmmod/src/main/resources/localization/mxm_cards-zh.json
  36. 8 2
      mxmmod/src/main/resources/localization/mxm_keywords-zh.json
  37. 9 0
      mxmmod/src/main/resources/localization/mxm_powers-zh.json
  38. 3 3
      mxmmod/src/main/resources/localization/mxm_relics-zh.json

+ 46 - 50
mxmmod/src/main/java/xyz/luxnk/mxmmod/MxmMod.java

@@ -2,28 +2,23 @@ package xyz.luxnk.mxmmod;
 
 import basemod.BaseMod;
 import basemod.ModPanel;
-import basemod.helpers.RelicType;
 import basemod.interfaces.*;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.utils.compression.lzma.Base;
 import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer;
 import com.google.gson.Gson;
 import com.megacrit.cardcrawl.cards.AbstractCard;
 import com.megacrit.cardcrawl.cards.CardGroup;
-import com.megacrit.cardcrawl.cards.green.*;
 import com.megacrit.cardcrawl.cards.red.*;
 import com.megacrit.cardcrawl.characters.AbstractPlayer;
+import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
 import com.megacrit.cardcrawl.helpers.CardHelper;
 import com.megacrit.cardcrawl.helpers.ImageMaster;
-import com.megacrit.cardcrawl.localization.CardStrings;
-import com.megacrit.cardcrawl.localization.Keyword;
-import com.megacrit.cardcrawl.localization.RelicStrings;
-import com.megacrit.cardcrawl.localization.UIStrings;
+import com.megacrit.cardcrawl.localization.*;
+import com.megacrit.cardcrawl.powers.AbstractPower;
 import com.megacrit.cardcrawl.rooms.AbstractRoom;
 import com.megacrit.cardcrawl.unlock.UnlockTracker;
-import com.sun.org.apache.xpath.internal.compiler.Keywords;
 import xyz.luxnk.mxmmod.cards.*;
 import xyz.luxnk.mxmmod.characters.Mxm;
 import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
@@ -32,7 +27,7 @@ import xyz.luxnk.mxmmod.relics.Hamakagami;
 
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Map;
+import java.util.Iterator;
 
 @SpireInitializer
 public class MxmMod implements PostInitializeSubscriber,
@@ -45,10 +40,13 @@ public class MxmMod implements PostInitializeSubscriber,
         EditStringsSubscriber,
         EditRelicsSubscriber,
         EditCardsSubscriber,
-        EditKeywordsSubscriber {
+        EditKeywordsSubscriber,
+        PostDungeonUpdateSubscriber,
+        PostPlayerUpdateSubscriber {
 
     private static final String RELIC_STRING = "localization/mxm_relics-zh.json";
     private static final String CARD_STRING = "localization/mxm_cards-zh.json";
+    private static final String POWER_STRING = "localization/mxm_powers-zh.json";
     private static final String KEYWORD_STRING = "localization/mxm_keywords-zh.json";
     private static final String UI_STRING = "localization/mxm_ui-zh.json";
 
@@ -60,14 +58,14 @@ public class MxmMod implements PostInitializeSubscriber,
     private static final String MXM_PORTRAIT = "img/charSelect/mxmPortrait.jpg";
 
     // 卡片背景图(暂时借用魔理沙小姐的
-    private static final String ATTACK_CC = "img/512/bg_attack_MRS_s.png";
+    private static final String ATTACK_CC = "img/512/bg_attack_mxm_s.png";
     private static final String SKILL_CC = "img/512/bg_skill_mxm_s.png";
-    private static final String POWER_CC = "img/512/bg_power_MRS_s.png";
+    private static final String POWER_CC = "img/512/bg_power_mxm_s.png";
     private static final String ENERGY_ORB_CC = "img/512/cardOrb.png";
 
-    private static final String ATTACK_CC_PORTRAIT = "img/1024/bg_attack_MRS.png";
+    private static final String ATTACK_CC_PORTRAIT = "img/1024/bg_attack_mxm.png";
     private static final String SKILL_CC_PORTRAIT = "img/1024/bg_skill_mxm.png";
-    private static final String POWER_CC_PORTRAIT = "img/1024/bg_power_MRS.png";
+    private static final String POWER_CC_PORTRAIT = "img/1024/bg_power_mxm.png";
     private static final String ENERGY_ORB_CC_PORTRAIT = "img/1024/cardOrb.png";
 
     public static final String CARD_ENERGY_ORB = "img/UI/energyOrb.png";
@@ -131,6 +129,9 @@ public class MxmMod implements PostInitializeSubscriber,
         BaseMod.loadCustomStrings(CardStrings.class, Gdx.files.internal(CARD_STRING).readString(
                 String.valueOf(StandardCharsets.UTF_8)
         ));
+        BaseMod.loadCustomStrings(PowerStrings.class, Gdx.files.internal(POWER_STRING).readString(
+                String.valueOf(StandardCharsets.UTF_8)
+        ));
         BaseMod.loadCustomStrings(UIStrings.class, Gdx.files.internal(UI_STRING).readString(
                 String.valueOf(StandardCharsets.UTF_8)
         ));
@@ -149,50 +150,25 @@ public class MxmMod implements PostInitializeSubscriber,
 
     @Override
     public void receiveEditCards() {
+
+        // 攻击牌
         BaseMod.addCard(new Strike_MXM());
         BaseMod.addCard(new TwinStrike_MXM());
         BaseMod.addCard(new QuickStrike_MXM());
-        BaseMod.addCard(new Whirlwind_MXM());
+        BaseMod.addCard(new Stab_MXM());
+        BaseMod.addCard(new SavageStab_MXM());
+
+        // 技能牌
         BaseMod.addCard(new Defend_MXM());
-        BaseMod.addCard(new SpeedUp());
+        BaseMod.addCard(new WarmUp_MXM());
+        BaseMod.addCard(new SpeedUp_MXM());
         BaseMod.addCard(new PoorWine_MXM());
         BaseMod.addCard(new SadCat_MXM());
         BaseMod.addCard(new LuckyCat_MXM());
 
-        // 借用下卡牌
-
-        // 攻击
-        BaseMod.addCard(new Anger());
-        BaseMod.addCard(new BodySlam());
-        BaseMod.addCard(new DieDieDie());
-        BaseMod.addCard(new HeelHook());
-        BaseMod.addCard(new SuckerPunch());
-        BaseMod.addCard(new GrandFinale());
-        BaseMod.addCard(new Feed());
-        BaseMod.addCard(new HeavyBlade());
-        BaseMod.addCard(new Unload());
-        BaseMod.addCard(new RecklessCharge());
-        BaseMod.addCard(new Uppercut());
-        BaseMod.addCard(new Clash());
-
-        // 技能
-        BaseMod.addCard(new SecondWind());
-        BaseMod.addCard(new SpotWeakness());
-        BaseMod.addCard(new Backflip());
-        BaseMod.addCard(new DodgeAndRoll());
-        BaseMod.addCard(new Warcry());
-        BaseMod.addCard(new Flex());
-        BaseMod.addCard(new Intimidate());
-        BaseMod.addCard(new Disarm());
-        BaseMod.addCard(new Rage());
-        BaseMod.addCard(new Blur());
-
-        // 能力
-        BaseMod.addCard(new Inflame());
-        BaseMod.addCard(new Berserk());
-        BaseMod.addCard(new Footwork());
-        BaseMod.addCard(new Caltrops());
-        BaseMod.addCard(new AfterImage());
+        // 能力牌
+        BaseMod.addCard(new Strength_MXM());
+        BaseMod.addCard(new Dexterity_MXM());
     }
 
     @Override
@@ -235,6 +211,26 @@ public class MxmMod implements PostInitializeSubscriber,
         }
     }
 
+    @Override
+    public void receivePostDungeonUpdate() {
+    }
+
+    @Override
+    public void receivePostPlayerUpdate() {
+        // 抵御诅咒
+        if (AbstractDungeon.player.hasRelic("Hamakagami") && AbstractDungeon.player.getRelic("Hamakagami").counter > 0) {
+            Iterator deck = AbstractDungeon.player.masterDeck.group.iterator();
+            while (deck.hasNext()) {
+                AbstractCard c = (AbstractCard)deck.next();
+                if (c.color == AbstractCard.CardColor.CURSE) {
+                    AbstractDungeon.player.masterDeck.removeCard(c);
+                    ((Hamakagami)AbstractDungeon.player.getRelic("Hamakagami")).use();
+                    break;
+                }
+            }
+        }
+    }
+
     class Keywords {
 
         Keyword[] keywords;

+ 61 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Dexterity_MXM.java

@@ -0,0 +1,61 @@
+package xyz.luxnk.mxmmod.cards;
+
+import basemod.abstracts.CustomCard;
+import com.megacrit.cardcrawl.actions.animations.VFXAction;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import com.megacrit.cardcrawl.powers.DexterityPower;
+import com.megacrit.cardcrawl.vfx.combat.InflameEffect;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+
+public class Dexterity_MXM extends CustomCard {
+
+    public static final String ID = "Dexterity_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    private static final int COST = 1;
+    private static final int BASE_STR = 2;
+
+    public Dexterity_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.POWER,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.UNCOMMON,
+                CardTarget.SELF
+        );
+        this.baseMagicNumber = BASE_STR;
+        this.magicNumber = this.baseMagicNumber;
+    }
+
+    @Override
+    public void use(AbstractPlayer p, AbstractMonster abstractMonster) {
+        AbstractDungeon.actionManager.addToBottom(new VFXAction(p, new InflameEffect(p), 1.0F));
+        AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new DexterityPower(p, this.magicNumber), this.magicNumber));
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new Dexterity_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeMagicNumber(1);
+            initializeDescription();
+        }
+    }
+}

+ 70 - 1
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Headbutt_MXM.java

@@ -1,4 +1,73 @@
 package xyz.luxnk.mxmmod.cards;
 
-public class Headbutt_MXM {
+import basemod.abstracts.CustomCard;
+import basemod.helpers.BaseModCardTags;
+import com.megacrit.cardcrawl.actions.AbstractGameAction;
+import com.megacrit.cardcrawl.actions.common.DamageAction;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+
+/**
+ * @// TODO: 2019/8/13
+ */
+public class Headbutt_MXM extends CustomCard {
+
+    public static final String ID = "Headbutt_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/attack/strike_mxm.png";
+    private static final int COST = 1;
+    private static final int ATTACK_DMG = 4;
+    private static final int UPGRADE_PLUS_DMG = 1;
+
+    public Headbutt_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.ATTACK,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.COMMON,
+                CardTarget.ENEMY
+        );
+        this.tags.add(BaseModCardTags.BASIC_STRIKE);
+        this.baseDamage = 4;
+    }
+
+    @Override
+    public void use(AbstractPlayer abstractPlayer, AbstractMonster abstractMonster) {
+        this.baseDamage = abstractPlayer.currentBlock + 4;
+        AbstractDungeon.actionManager.addToBottom(
+                new DamageAction(
+                        abstractMonster,
+                        new DamageInfo(abstractPlayer, this.damage, this.damageTypeForTurn),
+                        AbstractGameAction.AttackEffect.SLASH_HORIZONTAL));
+        AbstractDungeon.actionManager.addToBottom(
+                new DamageAction(
+                        abstractMonster,
+                        new DamageInfo(abstractPlayer, this.damage, this.damageTypeForTurn),
+                        AbstractGameAction.AttackEffect.SLASH_VERTICAL));
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new Headbutt_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeDamage(UPGRADE_PLUS_DMG);
+        }
+    }
 }

+ 2 - 1
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/PoorWine_MXM.java

@@ -24,7 +24,7 @@ public class PoorWine_MXM extends CustomCard {
     public static final String NAME = cardStrings.NAME;
     public static final String DESCRIPTION = cardStrings.DESCRIPTION;
     public static final String DESCRIPTION_UPG = cardStrings.UPGRADE_DESCRIPTION;
-    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    public static final String IMG_PATH = "img/cards/skill/poor_wine.png";
     private static final int COST = 1;
 
     public PoorWine_MXM() {
@@ -77,6 +77,7 @@ public class PoorWine_MXM extends CustomCard {
         if (!this.upgraded) {
             upgradeName();
             this.rawDescription = DESCRIPTION_UPG;
+            initializeDescription();
         }
     }
 }

+ 72 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/PreciseStab_MXM.java

@@ -0,0 +1,72 @@
+package xyz.luxnk.mxmmod.cards;
+
+import basemod.abstracts.CustomCard;
+import com.megacrit.cardcrawl.actions.AbstractGameAction;
+import com.megacrit.cardcrawl.actions.common.DamageAction;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+import xyz.luxnk.mxmmod.util.SpeedUpUtil;
+
+public class PreciseStab_MXM extends CustomCard {
+
+    public static final String ID = "PreciseStab_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/attack/strike_mxm.png";
+    private static final int COST = 2;
+    private static final int ATTACK_DMG = 9;
+    private static final int UPGRADE_PLUS_DMG = 3;
+    private static final int SPEED_COUNT = 3;
+    private static final int SPEED_DMG = 6;
+
+    public PreciseStab_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.ATTACK,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.COMMON,
+                CardTarget.ENEMY
+        );
+        this.baseDamage = ATTACK_DMG;
+    }
+
+    @Override
+    public void use(AbstractPlayer abstractPlayer, AbstractMonster abstractMonster) {
+        AbstractDungeon.actionManager.addToBottom(
+                new DamageAction(
+                        abstractMonster,
+                        new DamageInfo(abstractPlayer, this.damage, this.damageTypeForTurn),
+                        AbstractGameAction.AttackEffect.SLASH_HORIZONTAL));
+        if (SpeedUpUtil.checkSpeed(abstractPlayer, SPEED_COUNT)) {
+            AbstractDungeon.actionManager.addToBottom(
+                    new DamageAction(
+                            abstractMonster,
+                            new DamageInfo(abstractPlayer, SPEED_DMG, this.damageTypeForTurn),
+                            AbstractGameAction.AttackEffect.SLASH_HORIZONTAL));
+        }
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new PreciseStab_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeDamage(UPGRADE_PLUS_DMG);
+        }
+    }
+}

+ 5 - 1
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/QuickStrike_MXM.java

@@ -13,6 +13,7 @@ import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
 import com.megacrit.cardcrawl.localization.CardStrings;
 import com.megacrit.cardcrawl.monsters.AbstractMonster;
 import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+import xyz.luxnk.mxmmod.util.SpeedUpUtil;
 
 public class QuickStrike_MXM extends CustomCard {
 
@@ -24,6 +25,7 @@ public class QuickStrike_MXM extends CustomCard {
     private static final int COST = 1;
     private static final int ATTACK_DMG = 4;
     private static final int UPGRADE_PLUS_DMG = 2;
+    private static final int SPEED_COUNT = 3;
 
     public QuickStrike_MXM() {
         super(
@@ -47,7 +49,9 @@ public class QuickStrike_MXM extends CustomCard {
                         abstractMonster,
                         new DamageInfo(abstractPlayer, this.damage, this.damageTypeForTurn),
                         AbstractGameAction.AttackEffect.SLASH_HORIZONTAL));
-        AbstractDungeon.actionManager.addToBottom(new DrawCardAction(abstractPlayer, 1));
+        if (SpeedUpUtil.checkSpeed(abstractPlayer, SPEED_COUNT)) {
+            AbstractDungeon.actionManager.addToBottom(new DrawCardAction(abstractPlayer, 1));
+        }
     }
 
     @Override

+ 1 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SadCat_MXM.java

@@ -65,6 +65,7 @@ public class SadCat_MXM extends CustomCard {
         if (!this.upgraded) {
             upgradeName();
             this.rawDescription = DESCRIPTION_UPG;
+            initializeDescription();
         }
     }
 }

+ 61 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SavageStab_MXM.java

@@ -0,0 +1,61 @@
+package xyz.luxnk.mxmmod.cards;
+
+import basemod.abstracts.CustomCard;
+import com.megacrit.cardcrawl.actions.AbstractGameAction;
+import com.megacrit.cardcrawl.actions.common.DamageRandomEnemyAction;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+
+public class SavageStab_MXM extends CustomCard {
+
+    public static final String ID = "SavageStab_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/attack/strike_mxm.png";
+    private static final int COST = 2;
+    private static final int ATTACK_DMG = 16;
+    private static final int UPGRADE_PLUS_DMG = 6;
+
+    public SavageStab_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.ATTACK,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.COMMON,
+                CardTarget.ENEMY
+        );
+        this.baseDamage = ATTACK_DMG;
+    }
+
+    @Override
+    public void use(AbstractPlayer abstractPlayer, AbstractMonster abstractMonster) {
+        AbstractDungeon.actionManager.addToBottom(
+                new DamageRandomEnemyAction(
+                        new DamageInfo(abstractPlayer, this.damage, this.damageTypeForTurn),
+                        AbstractGameAction.AttackEffect.SLASH_HEAVY));
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new SavageStab_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeDamage(UPGRADE_PLUS_DMG);
+        }
+    }
+}

+ 66 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SpeedUp_MXM.java

@@ -0,0 +1,66 @@
+package xyz.luxnk.mxmmod.cards;
+
+import basemod.abstracts.CustomCard;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+import xyz.luxnk.mxmmod.power.SpeedUpPower;
+
+/**
+ * 加速
+ */
+public class SpeedUp_MXM extends CustomCard {
+
+    public static final String ID = "SpeedUp_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    private static final int COST = 1;
+    private static final int SPEED_AMOUNT = 2;
+
+    public SpeedUp_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.SKILL,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.COMMON,
+                CardTarget.SELF
+        );
+        this.baseMagicNumber = SPEED_AMOUNT;
+        this.magicNumber = this.baseMagicNumber;
+    }
+
+    @Override
+    public void use(AbstractPlayer abstractPlayer, AbstractMonster abstractMonster) {
+
+        AbstractDungeon.actionManager.addToBottom(
+                new ApplyPowerAction(
+                        abstractPlayer,
+                        abstractPlayer,
+                        new SpeedUpPower(abstractPlayer, this.magicNumber),
+                        this.magicNumber));
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new SpeedUp_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeBaseCost(0);
+        }
+    }
+}

+ 4 - 8
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Whirlwind_MXM.java

@@ -1,15 +1,11 @@
 package xyz.luxnk.mxmmod.cards;
 
 import basemod.abstracts.CustomCard;
-import basemod.helpers.BaseModCardTags;
 import com.megacrit.cardcrawl.actions.AbstractGameAction;
 import com.megacrit.cardcrawl.actions.animations.VFXAction;
-import com.megacrit.cardcrawl.actions.common.DamageAction;
 import com.megacrit.cardcrawl.actions.common.DamageAllEnemiesAction;
-import com.megacrit.cardcrawl.actions.unique.WhirlwindAction;
 import com.megacrit.cardcrawl.actions.utility.SFXAction;
 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.dungeons.AbstractDungeon;
@@ -23,9 +19,9 @@ import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
  * cost 2
  * 对所有敌人造成12点伤害 → 对所有敌人造成18点伤害
  */
-public class Whirlwind_MXM extends CustomCard {
+public class Stab_MXM extends CustomCard {
 
-    public static final String ID = "Whirlwind_MXM";
+    public static final String ID = "Stab_MXM";
     private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
     public static final String NAME = cardStrings.NAME;
     public static final String DESCRIPTION = cardStrings.DESCRIPTION;
@@ -34,7 +30,7 @@ public class Whirlwind_MXM extends CustomCard {
     private static final int ATTACK_DMG = 12;
     private static final int UPGRADE_PLUS_DMG = 6;
 
-    public Whirlwind_MXM() {
+    public Stab_MXM() {
         super(
                 ID,
                 NAME,
@@ -64,7 +60,7 @@ public class Whirlwind_MXM extends CustomCard {
 
     @Override
     public AbstractCard makeCopy() {
-        return new Whirlwind_MXM();
+        return new Stab_MXM();
     }
 
     @Override

+ 61 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Strength_MXM.java

@@ -0,0 +1,61 @@
+package xyz.luxnk.mxmmod.cards;
+
+import basemod.abstracts.CustomCard;
+import com.megacrit.cardcrawl.actions.animations.VFXAction;
+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.dungeons.AbstractDungeon;
+import com.megacrit.cardcrawl.localization.CardStrings;
+import com.megacrit.cardcrawl.monsters.AbstractMonster;
+import com.megacrit.cardcrawl.powers.StrengthPower;
+import com.megacrit.cardcrawl.vfx.combat.InflameEffect;
+import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
+
+public class Strength_MXM extends CustomCard {
+
+    public static final String ID = "Strength_MXM";
+    private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
+    public static final String NAME = cardStrings.NAME;
+    public static final String DESCRIPTION = cardStrings.DESCRIPTION;
+    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    private static final int COST = 1;
+    private static final int BASE_STR = 2;
+
+    public Strength_MXM() {
+        super(
+                ID,
+                NAME,
+                IMG_PATH,
+                COST,
+                DESCRIPTION,
+                CardType.POWER,
+                AbstractCardEnum.MXM_COLOR,
+                CardRarity.UNCOMMON,
+                CardTarget.SELF
+        );
+        this.baseMagicNumber = BASE_STR;
+        this.magicNumber = this.baseMagicNumber;
+    }
+
+    @Override
+    public void use(AbstractPlayer p, AbstractMonster abstractMonster) {
+        AbstractDungeon.actionManager.addToBottom(new VFXAction(p, new InflameEffect(p), 1.0F));
+        AbstractDungeon.actionManager.addToBottom(new ApplyPowerAction(p, p, new StrengthPower(p, this.magicNumber), this.magicNumber));
+    }
+
+    @Override
+    public AbstractCard makeCopy() {
+        return new Strength_MXM();
+    }
+
+    @Override
+    public void upgrade() {
+        if (!this.upgraded) {
+            upgradeName();
+            upgradeMagicNumber(1);
+            initializeDescription();
+        }
+    }
+}

+ 1 - 1
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/Strike_MXM.java

@@ -24,7 +24,7 @@ public class Strike_MXM extends CustomCard {
     private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
     public static final String NAME = cardStrings.NAME;
     public static final String DESCRIPTION = cardStrings.DESCRIPTION;
-    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    public static final String IMG_PATH = "img/cards/attack/strike_mxm.png";
     private static final int COST = 1;
     private static final int ATTACK_DMG = 6;
     private static final int UPGRADE_PLUS_DMG = 3;

+ 1 - 1
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/TwinStrike_MXM.java

@@ -24,7 +24,7 @@ public class TwinStrike_MXM extends CustomCard {
     private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
     public static final String NAME = cardStrings.NAME;
     public static final String DESCRIPTION = cardStrings.DESCRIPTION;
-    public static final String IMG_PATH = "img/cards/mxmCard.png";
+    public static final String IMG_PATH = "img/cards/attack/strike_mxm.png";
     private static final int COST = 1;
     private static final int ATTACK_DMG = 4;
     private static final int UPGRADE_PLUS_DMG = 1;

+ 4 - 9
mxmmod/src/main/java/xyz/luxnk/mxmmod/cards/SpeedUp.java

@@ -12,14 +12,9 @@ import com.megacrit.cardcrawl.powers.DexterityPower;
 import com.megacrit.cardcrawl.powers.LoseDexterityPower;
 import xyz.luxnk.mxmmod.patches.AbstractCardEnum;
 
-/**
- * 加速
- * cost 0
- * 获得2点敏捷。你的回合结束时,失去2点敏捷。
- */
-public class SpeedUp extends CustomCard {
+public class WarmUp_MXM extends CustomCard {
 
-    public static final String ID = "SpeedUp";
+    public static final String ID = "WarmUp_MXM";
     private static final CardStrings cardStrings = CardCrawlGame.languagePack.getCardStrings(ID);
     public static final String NAME = cardStrings.NAME;
     public static final String DESCRIPTION = cardStrings.DESCRIPTION;
@@ -28,7 +23,7 @@ public class SpeedUp extends CustomCard {
     private static final int DEX_AMOUNT = 2;
     private static final int UPGRADE_PLUS_DEX = 3;
 
-    public SpeedUp() {
+    public WarmUp_MXM() {
         super(
                 ID,
                 NAME,
@@ -63,7 +58,7 @@ public class SpeedUp extends CustomCard {
 
     @Override
     public AbstractCard makeCopy() {
-        return new SpeedUp();
+        return new WarmUp_MXM();
     }
 
     @Override

+ 3 - 4
mxmmod/src/main/java/xyz/luxnk/mxmmod/characters/Mxm.java

@@ -78,13 +78,13 @@ public class Mxm extends CustomPlayer {
         retVal.add("Strike_MXM");
         retVal.add("Strike_MXM");
         retVal.add("Strike_MXM");
-        retVal.add("TwinStrike_MXM");
+        retVal.add("QuickStrike_MXM");
         retVal.add("TwinStrike_MXM");
         retVal.add("Defend_MXM");
         retVal.add("Defend_MXM");
         retVal.add("Defend_MXM");
         retVal.add("Defend_MXM");
-        retVal.add("PoorWine_MXM");
+        retVal.add("SpeedUp_MXM");
         retVal.add("SadCat_MXM");
         retVal.add("LuckyCat_MXM");
         return retVal;
@@ -121,8 +121,7 @@ public class Mxm extends CustomPlayer {
 
     @Override
     public AbstractCard.CardColor getCardColor() {
-        return AbstractCard.CardColor.RED;
-        //return AbstractCardEnum.MXM_COLOR;
+        return AbstractCardEnum.MXM_COLOR;
     }
 
     @Override

+ 85 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/power/SpeedUpPower.java

@@ -0,0 +1,85 @@
+package xyz.luxnk.mxmmod.power;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.megacrit.cardcrawl.actions.common.ReducePowerAction;
+import com.megacrit.cardcrawl.actions.common.RemoveSpecificPowerAction;
+import com.megacrit.cardcrawl.cards.DamageInfo;
+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.AbstractPower;
+
+public class SpeedUpPower extends AbstractPower {
+
+    public static final String POWER_ID = "SpeedUpPower";
+    private static final PowerStrings powerStrings = CardCrawlGame.languagePack.getPowerStrings(POWER_ID);
+    public static final String NAME = powerStrings.NAME;
+    public static final String[] DESCRIPTIONS = powerStrings.DESCRIPTIONS;
+
+    public SpeedUpPower(AbstractCreature owner, int amount) {
+        this.name = NAME;
+        this.ID = POWER_ID;
+        this.owner = owner;
+        this.amount = amount;
+        this.type = PowerType.BUFF;
+        updateDescription();
+        this.img = new Texture("img/powers/generator.png");
+        this.isTurnBased = true;
+    }
+
+    @Override
+    public float atDamageReceive(float damage, DamageInfo.DamageType damageType) {
+        int count = this.amount;
+        if (count > 10) {
+            count = 10;
+        }
+        System.out.println("伤害为" + damage);
+        if (damageType == DamageInfo.DamageType.NORMAL) {
+            damage = damage * (1F - 0.1F * count);
+        }
+        return damage;
+    }
+
+    @Override
+    public float atDamageFinalReceive(float damage, DamageInfo.DamageType type) {
+        System.out.println("实际受到了" + damage + "点伤害");
+
+        /*if (damage > 0 && this.amount > 0) {
+            AbstractDungeon.actionManager.addToBottom(new ReducePowerAction(this.owner, this.owner, "SpeedUpPower", 1));
+        }*/
+
+        return super.atDamageFinalReceive(damage, type);
+    }
+
+    @Override
+    public int onAttacked(DamageInfo info, int damageAmount) {
+        if (info.type != DamageInfo.DamageType.THORNS && info.type != DamageInfo.DamageType.HP_LOSS && info.owner != null && info.owner != this.owner && damageAmount > 0) {
+            if (this.amount == 0) {
+                AbstractDungeon.actionManager.addToBottom(new RemoveSpecificPowerAction(this.owner, this.owner, "SpeedUpPower"));
+            } else {
+                AbstractDungeon.actionManager.addToBottom(new ReducePowerAction(this.owner, this.owner, "SpeedUpPower", 1));
+            }
+        }
+        return damageAmount;
+    }
+
+    @Override
+    public void updateDescription() {
+        int count = this.amount;
+        if (count > 10) {
+            count = 10;
+        }
+        this.description = DESCRIPTIONS[0] + count + "0%" + DESCRIPTIONS[1];
+    }
+
+    @Override
+    public void atEndOfRound() {
+        this.flash();
+        if (this.amount == 0) {
+            AbstractDungeon.actionManager.addToBottom(new RemoveSpecificPowerAction(this.owner, this.owner, "SpeedUpPower"));
+        } else {
+            AbstractDungeon.actionManager.addToBottom(new ReducePowerAction(this.owner, this.owner, "SpeedUpPower", 1));
+        }
+    }
+}

+ 13 - 4
mxmmod/src/main/java/xyz/luxnk/mxmmod/relics/Hamakagami.java

@@ -33,20 +33,29 @@ public class Hamakagami extends CustomRelic {
     public void setCounter(int counter) {
         this.counter = counter;
         if (counter == 0) {
+            this.img = ImageMaster.loadImage("img/relics/hamakagami_used.png");
             this.usedUp();
+            this.description = this.DESCRIPTIONS[2];
         }
     }
 
+    public void use() {
+        this.flash();
+        this.setCounter(0);
+    }
+
     @Override
     public String getUpdatedDescription() {
-        return this.DESCRIPTIONS[0] + this.DESCRIPTIONS[1] + CON_AMT + this.DESCRIPTIONS[2];
+        return this.DESCRIPTIONS[0] + CON_AMT + this.DESCRIPTIONS[1];
     }
 
     @Override
     public void atBattleStart() {
-        this.flash();
-        AbstractDungeon.actionManager.addToTop(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new ArtifactPower(AbstractDungeon.player, CON_AMT), 1));
-        AbstractDungeon.actionManager.addToTop(new RelicAboveCreatureAction(AbstractDungeon.player, this));
+        if (!this.usedUp) {
+            this.flash();
+            AbstractDungeon.actionManager.addToTop(new ApplyPowerAction(AbstractDungeon.player, AbstractDungeon.player, new ArtifactPower(AbstractDungeon.player, CON_AMT), 1));
+            AbstractDungeon.actionManager.addToTop(new RelicAboveCreatureAction(AbstractDungeon.player, this));
+        }
     }
 
     @Override

+ 24 - 0
mxmmod/src/main/java/xyz/luxnk/mxmmod/util/SpeedUpUtil.java

@@ -0,0 +1,24 @@
+package xyz.luxnk.mxmmod.util;
+
+import com.megacrit.cardcrawl.characters.AbstractPlayer;
+import com.megacrit.cardcrawl.powers.AbstractPower;
+
+import java.util.Iterator;
+
+public class SpeedUpUtil {
+
+    public static boolean checkSpeed(AbstractPlayer player, int count) {
+        Iterator powers = player.powers.iterator();
+        while (powers.hasNext()) {
+            AbstractPower power = (AbstractPower) powers.next();
+            if (power.ID.equals("SpeedUpPower")) {
+                if (power.amount >= count) {
+                    return true;
+                }
+                break;
+            }
+        }
+        return false;
+    }
+
+}

BIN
mxmmod/src/main/resources/img/1024/bg_attack_MRS.png


BIN
mxmmod/src/main/resources/img/1024/bg_attack_mxm.png


BIN
mxmmod/src/main/resources/img/1024/bg_power_MRS.png


BIN
mxmmod/src/main/resources/img/1024/bg_power_mxm.png


BIN
mxmmod/src/main/resources/img/1024/bg_skill_MRS.png


BIN
mxmmod/src/main/resources/img/512/bg_attack_MRS_s.png


BIN
mxmmod/src/main/resources/img/512/bg_attack_mxm_s.png


BIN
mxmmod/src/main/resources/img/512/bg_power_MRS_s.png


BIN
mxmmod/src/main/resources/img/512/bg_power_mxm_s.png


BIN
mxmmod/src/main/resources/img/512/bg_skill_MRS_s.png


BIN
mxmmod/src/main/resources/img/cards/attack/strike_mxm.png


BIN
mxmmod/src/main/resources/img/cards/attack/strike_mxm_p.png


BIN
mxmmod/src/main/resources/img/cards/skill/poor_wine.png


BIN
mxmmod/src/main/resources/img/cards/skill/poor_wine_p.png


BIN
mxmmod/src/main/resources/img/powers/generator.png


BIN
mxmmod/src/main/resources/img/relics/hamakagami_used.png


+ 31 - 7
mxmmod/src/main/resources/localization/mxm_cards-zh.json

@@ -13,20 +13,34 @@
   },
   "QuickStrike_MXM": {
     "NAME": "快速爪击",
-    "DESCRIPTION": "造成 !D! 点伤害。抽一张牌。"
+    "DESCRIPTION": "造成 !D! 点伤害。 NL 加速 3:抽一张牌。"
   },
-  "Whirlwind_MXM": {
+  "Stab_MXM": {
     "NAME": "穿刺",
     "DESCRIPTION": "对所有敌人造成 !D! 点伤害。"
   },
-  "SpeedUp": {
-    "NAME": "加速",
+  "SavageStab_MXM": {
+    "NAME": "野蛮钉击",
+    "DESCRIPTION": "随机对一名敌人造成 !D! 点伤害。"
+  },
+  "PreciseStab_MXM": {
+    "NAME": "精准钉击",
+    "DESCRIPTION": "造成 !D! 点伤害。 NL 加速 3:再造成6点伤害。"
+  },
+
+
+  "WarmUp_MXM": {
+    "NAME": "准备运动",
     "DESCRIPTION": "获得 !M! 点 敏捷 。你的回合结束时,失去 !M! 点 敏捷 。"
   },
+  "SpeedUp_MXM": {
+    "NAME": "加速",
+    "DESCRIPTION": "获得 !M! 层 加速 。"
+  },
   "PoorWine_MXM": {
     "NAME": "酒品极差",
     "DESCRIPTION": "将6张 晕眩 随机加入抽牌堆与弃牌堆。 NL 在抽牌堆、弃牌堆中各选一张卡加入手牌。",
-    "UPGRADE_DESCRIPTION": "将6张 晕眩 随机加入抽牌堆与弃牌堆。 NL 在抽牌堆、弃牌堆和 消耗牌 中各选一张卡加入手牌。"
+    "UPGRADE_DESCRIPTION": "将6张 晕眩 随机加入抽牌堆与弃牌堆。 NL 在抽牌堆、弃牌堆和 消耗牌 中各选一张卡加入手牌。"
   },
   "SadCat_MXM": {
     "NAME": "厄运猫",
@@ -35,7 +49,17 @@
   },
   "LuckyCat_MXM": {
     "NAME": "好运猫",
-    "DESCRIPTION": "选择抽牌堆中的一张卡放入抽牌堆顶端,这张卡在打出之前为0费。 NL 消耗 。",
-    "UPGRADE_DESCRIPTION": "选择抽牌堆中的一张卡放入抽牌堆顶端,这张卡在打出之前为0费。 NL 消耗 。"
+    "DESCRIPTION": "选择抽牌堆中的一张卡放入抽牌堆顶端,那张卡在打出之前耗能变成0。 NL 消耗 。",
+    "UPGRADE_DESCRIPTION": "选择抽牌堆中的一张卡放入抽牌堆顶端,那张卡在打出之前耗能变成0。 NL 消耗 。"
+  },
+
+
+  "Strength_MXM": {
+    "NAME": "蛮力",
+    "DESCRIPTION": "获得 !M! 点 力量 。"
+  },
+  "Dexterity_MXM": {
+    "NAME": "灵巧",
+    "DESCRIPTION": "获得 !M! 点 敏捷 。"
   }
 }

+ 8 - 2
mxmmod/src/main/resources/localization/mxm_keywords-zh.json

@@ -8,9 +8,15 @@
     },
     {
       "NAMES": [
-        "消耗牌"
+        "消耗牌"
       ],
-      "DESCRIPTION": "游戏中被消耗掉的牌。"
+      "DESCRIPTION": "战斗中已经被消耗掉的牌。"
+    },
+    {
+      "NAMES": [
+        "加速"
+      ],
+      "DESCRIPTION": "每一层加速使你从攻击受到的伤害减少10%(最多减少100%),并且当达到一定层级的加速时可以激活一些卡牌新的效果。 NL 受到攻击伤害而失去生命时加速会减少1层。 NL 每一轮结束时加速会减少1层。"
     }
   ]
 }

+ 9 - 0
mxmmod/src/main/resources/localization/mxm_powers-zh.json

@@ -0,0 +1,9 @@
+{
+  "SpeedUpPower": {
+    "NAME": "加速",
+    "DESCRIPTIONS": [
+      "从 #y攻击 受到的伤害减少 #b",
+      " 。"
+    ]
+  }
+}

+ 3 - 3
mxmmod/src/main/resources/localization/mxm_relics-zh.json

@@ -2,9 +2,9 @@
   "Hamakagami": {
     "NAME": "破魔镜",
     "DESCRIPTIONS": [
-      "猫小咪持有的破魔镜,可以抵挡灾祸。 NL ",
-      "在每场战斗开始时,获得 #b",
-      " 层 #y 人工制品 。"
+      "猫小咪持有的破魔镜,可以抵挡1次 #r诅咒 。在每场战斗开始时,获得 #b",
+      " 层 #y人工制品 。",
+      "这面镜子已经坏了。"
     ]
   }
 }