diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderCardDescriptors.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderCardDescriptors.java index 02e0d5ba..68c64ace 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderCardDescriptors.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderCardDescriptors.java @@ -54,6 +54,7 @@ public int[] Locate(CtBehavior ctBehavior) throws Exception } } + //Should be deleted, but cannot because stslib patches this. @SpirePatch( clz = AbstractCard.class, method = "renderPortraitFrame" @@ -66,6 +67,8 @@ public static class Frame ) public static SpireReturn Insert(AbstractCard __instance, SpriteBatch sb, float x, float y, @ByRef float[] tOffset, @ByRef float[] tWidth) { + if (__instance != null) return SpireReturn.Continue(); //if (true) gets optimized and removes rest of method + String typeText; switch (__instance.type) { case ATTACK: diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderFixSwitches.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderFixSwitches.java index d0c3bee1..42a36e00 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderFixSwitches.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderFixSwitches.java @@ -5,8 +5,10 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.Vector2; import com.evacipated.cardcrawl.modthespire.lib.*; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.cards.AbstractCard.CardColor; @@ -24,6 +26,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.List; import static basemod.patches.com.megacrit.cardcrawl.cards.AbstractCard.RenderCardDescriptors.getAllDescriptors; @@ -54,6 +57,13 @@ public static SpireReturn Prefix(AbstractCard __instance, SpriteBatch sb, flo } } + /* + 4 possibilities + no frame, no descriptor - normal rendering + custom frame, no descriptor - custom rendering + custom frame, descriptor - custom rendering + no frame, descriptor - ....custom rendering? + */ @SpirePatch( clz=AbstractCard.class, method="renderPortraitFrame" @@ -67,57 +77,131 @@ public static SpireReturn Prefix(AbstractCard __instance, SpriteBatch sb, flo return SpireReturn.Continue(); } - // If the card has card descriptors, don't render here because the descriptor rendering will break - if (!getAllDescriptors(__instance).isEmpty()) { - return SpireReturn.Continue(); - } + List descriptors = getAllDescriptors(__instance); CustomCard card = (CustomCard) __instance; + TextureAtlas.AtlasRegion frame = card.frameSmallRegion, + frameMid = card.frameMiddleRegion, + frameLeft = card.frameLeftRegion, + frameRight = card.frameRightRegion; + + if (frame == null) { + if (descriptors.isEmpty()) { + return SpireReturn.Continue(); + } - if (card.frameSmallRegion != null) //Does it have a custom frame? + switch (card.rarity) { + case UNCOMMON: + if (frameMid == null) { + frameMid = ImageMaster.CARD_UNCOMMON_FRAME_MID; + frameLeft = ImageMaster.CARD_UNCOMMON_FRAME_LEFT; + frameRight = ImageMaster.CARD_UNCOMMON_FRAME_RIGHT; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_UNCOMMON; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_UNCOMMON; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_UNCOMMON; + break; + } + break; + case RARE: + if (frameMid == null) { + frameMid = ImageMaster.CARD_RARE_FRAME_MID; + frameLeft = ImageMaster.CARD_RARE_FRAME_LEFT; + frameRight = ImageMaster.CARD_RARE_FRAME_RIGHT; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_RARE; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_RARE; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_RARE; + break; + } + break; + default: + if (frameMid == null) { + frameMid = ImageMaster.CARD_COMMON_FRAME_MID; + frameLeft = ImageMaster.CARD_COMMON_FRAME_LEFT; + frameRight = ImageMaster.CARD_COMMON_FRAME_RIGHT; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_COMMON; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_COMMON; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_COMMON; + break; + } + break; + } + } + + + float tWidth = 0; + float tOffset = 0; + + switch (card.type) { - renderHelper(card, sb, ___renderColor, card.frameSmallRegion, x, y); + case ATTACK: + descriptors.add(0, AbstractCard.TEXT[0]); + tWidth = AbstractCard.typeWidthAttack; + tOffset = AbstractCard.typeOffsetAttack; + break; + case SKILL: + descriptors.add(0, AbstractCard.TEXT[1]); + tWidth = AbstractCard.typeWidthSkill; + tOffset = AbstractCard.typeOffsetSkill; + break; + case POWER: + descriptors.add(0, AbstractCard.TEXT[2]); + tWidth = AbstractCard.typeWidthPower; + tOffset = AbstractCard.typeOffsetPower; + break; + case CURSE: + descriptors.add(0, AbstractCard.TEXT[3]); + tWidth = AbstractCard.typeWidthCurse; + tOffset = AbstractCard.typeOffsetCurse; + break; + case STATUS: + descriptors.add(0, AbstractCard.TEXT[7]); + tWidth = AbstractCard.typeWidthStatus; + tOffset = AbstractCard.typeOffsetStatus; + break; + default: + descriptors.add(0, AbstractCard.TEXT[5]); + break; + } - if (card.frameMiddleRegion != null) //Does it have dynamic frame parts? - { - float tWidth = 0; - float tOffset = 0; - - switch (card.type) - { - case ATTACK: - tWidth = AbstractCard.typeWidthAttack; - tOffset = AbstractCard.typeOffsetAttack; - break; - case SKILL: - tWidth = AbstractCard.typeWidthSkill; - tOffset = AbstractCard.typeOffsetSkill; - break; - case POWER: - tWidth = AbstractCard.typeWidthPower; - tOffset = AbstractCard.typeOffsetPower; - break; - case STATUS: - tWidth = AbstractCard.typeWidthStatus; - tOffset = AbstractCard.typeOffsetStatus; - break; - case CURSE: - tWidth = AbstractCard.typeWidthCurse; - tOffset = AbstractCard.typeOffsetCurse; - break; - } + renderHelper(card, sb, ___renderColor, frame, x, y); - if (tWidth > 1.1f) - { - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_MID, x, y, 0.0F, __instance.drawScale, __instance.angle, tWidth); - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_LEFT, x, y, -tOffset, __instance.drawScale, __instance.angle, 1.0F); - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_RIGHT, x, y, tOffset, __instance.drawScale, __instance.angle, 1.0F); - } - } - return SpireReturn.Return(null); + if (descriptors.size() > 1) { + String text = String.join(RenderCardDescriptors.SEPARATOR, descriptors); + GlyphLayout gl = new GlyphLayout(); + FontHelper.cardTypeFont.getData().setScale(1f); + gl.setText(FontHelper.cardTypeFont, text); + tOffset = (gl.width - 38 * Settings.scale) / 2f; + tWidth = (gl.width - 0f) / (32 * Settings.scale); } - return SpireReturn.Continue(); + if (tWidth > 1.1f && frameMid != null) { + dynamicFrameRenderHelper(sb, frameMid, x, y, 0.0F, __instance.drawScale, __instance.angle, tWidth); + dynamicFrameRenderHelper(sb, frameLeft, x, y, -tOffset, __instance.drawScale, __instance.angle, 1.0F); + dynamicFrameRenderHelper(sb, frameRight, x, y, tOffset, __instance.drawScale, __instance.angle, 1.0F); + } + + return SpireReturn.Return(null); } } @@ -339,6 +423,21 @@ private static void renderHelper(AbstractCard card, SpriteBatch sb, Color color, } private static void dynamicFrameRenderHelper(SpriteBatch sb, TextureAtlas.AtlasRegion img, float x, float y, float xOffset, float drawScale, float angle, float xScale) { - sb.draw(img, x + img.offsetX - (float)img.originalWidth / 2.0F + xOffset * drawScale, y + img.offsetY - (float)img.originalHeight / 2.0F, (float)img.originalWidth / 2.0F - img.offsetX, (float)img.originalHeight / 2.0F - img.offsetY, (float)img.packedWidth, (float)img.packedHeight, drawScale * Settings.scale * xScale, drawScale * Settings.scale, angle); + Vector2 tmp = new Vector2(0,0); + tmp.set(xOffset, 0); + tmp.scl(drawScale); + tmp.rotate(angle); + sb.draw( + img, + x + img.offsetX - (img.originalWidth / 2f + 1) + tmp.x, + y + img.offsetY - img.originalHeight / 2f + tmp.y, + img.originalWidth / 2f - img.offsetX + 1, + img.originalHeight / 2f - img.offsetY, + img.packedWidth, + img.packedHeight, + Settings.scale * drawScale * xScale, + Settings.scale * drawScale, + angle + ); } } diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/CustomRendering.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/CustomRendering.java index 6c8bb505..c0842897 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/CustomRendering.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/CustomRendering.java @@ -1,15 +1,21 @@ package basemod.patches.com.megacrit.cardcrawl.screens.SingleCardViewPopup; import basemod.abstracts.CustomCard; +import basemod.patches.com.megacrit.cardcrawl.cards.AbstractCard.RenderCardDescriptors; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.math.Vector2; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.helpers.FontHelper; import com.megacrit.cardcrawl.helpers.ImageMaster; import com.megacrit.cardcrawl.screens.SingleCardViewPopup; +import java.util.List; + import static basemod.patches.com.megacrit.cardcrawl.cards.AbstractCard.RenderCardDescriptors.getAllDescriptors; public class CustomRendering { @@ -50,57 +56,130 @@ public static SpireReturn Prefix(SingleCardViewPopup __instance, SpriteBatch return SpireReturn.Continue(); } - // If the card has card descriptors, don't render here because the descriptor rendering will break - if (!getAllDescriptors(___card).isEmpty()) { - return SpireReturn.Continue(); - } + List descriptors = getAllDescriptors(___card); CustomCard card = (CustomCard) ___card; + TextureAtlas.AtlasRegion frame = card.frameLargeRegion, + frameMid = card.frameMiddleLargeRegion, + frameLeft = card.frameLeftLargeRegion, + frameRight = card.frameRightLargeRegion; + + if (frame == null) { + if (descriptors.isEmpty()) { + return SpireReturn.Continue(); + } - if (card.frameLargeRegion != null) //Does it have a custom frame? - { - renderHelper(sb, (float) Settings.WIDTH / 2.0F, (float)Settings.HEIGHT / 2.0F, card.frameLargeRegion); - - if (card.frameMiddleLargeRegion != null) //Does it have dynamic frame parts? - { - float tWidth = 0; - float tOffset = 0; - - switch (card.type) - { - case ATTACK: - tWidth = AbstractCard.typeWidthAttack; - tOffset = AbstractCard.typeOffsetAttack; - break; - case SKILL: - tWidth = AbstractCard.typeWidthSkill; - tOffset = AbstractCard.typeOffsetSkill; - break; - case POWER: - tWidth = AbstractCard.typeWidthPower; - tOffset = AbstractCard.typeOffsetPower; - break; - case STATUS: - tWidth = AbstractCard.typeWidthStatus; - tOffset = AbstractCard.typeOffsetStatus; - break; - case CURSE: - tWidth = AbstractCard.typeWidthCurse; - tOffset = AbstractCard.typeOffsetCurse; - break; - } - - if (tWidth > 1.1f) - { - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_MID, 0.0F, ___drawScale, tWidth); - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_LEFT, -tOffset, ___drawScale, 1.0F); - dynamicFrameRenderHelper(sb, ImageMaster.CARD_COMMON_FRAME_RIGHT, tOffset, ___drawScale, 1.0F); - } + switch (card.rarity) { + case UNCOMMON: + if (frameMid == null) { + frameMid = ImageMaster.CARD_UNCOMMON_FRAME_MID_L; + frameLeft = ImageMaster.CARD_UNCOMMON_FRAME_LEFT_L; + frameRight = ImageMaster.CARD_UNCOMMON_FRAME_RIGHT_L; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_UNCOMMON_L; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_UNCOMMON_L; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_UNCOMMON_L; + break; + } + break; + case RARE: + if (frameMid == null) { + frameMid = ImageMaster.CARD_RARE_FRAME_MID_L; + frameLeft = ImageMaster.CARD_RARE_FRAME_LEFT_L; + frameRight = ImageMaster.CARD_RARE_FRAME_RIGHT_L; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_RARE_L; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_RARE_L; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_RARE_L; + break; + } + break; + default: + if (frameMid == null) { + frameMid = ImageMaster.CARD_COMMON_FRAME_MID_L; + frameLeft = ImageMaster.CARD_COMMON_FRAME_LEFT_L; + frameRight = ImageMaster.CARD_COMMON_FRAME_RIGHT_L; + } + switch (card.type) { + case ATTACK: + frame = ImageMaster.CARD_FRAME_ATTACK_COMMON_L; + break; + case POWER: + frame = ImageMaster.CARD_FRAME_POWER_COMMON_L; + break; + default: + frame = ImageMaster.CARD_FRAME_SKILL_COMMON_L; + break; + } + break; } - return SpireReturn.Return(null); } - return SpireReturn.Continue(); + float tWidth = 0; + float tOffset = 0; + + switch (card.type) + { + case ATTACK: + descriptors.add(0, AbstractCard.TEXT[0]); + tWidth = AbstractCard.typeWidthAttack; + tOffset = AbstractCard.typeOffsetAttack; + break; + case SKILL: + descriptors.add(0, AbstractCard.TEXT[1]); + tWidth = AbstractCard.typeWidthSkill; + tOffset = AbstractCard.typeOffsetSkill; + break; + case POWER: + descriptors.add(0, AbstractCard.TEXT[2]); + tWidth = AbstractCard.typeWidthPower; + tOffset = AbstractCard.typeOffsetPower; + break; + case CURSE: + descriptors.add(0, AbstractCard.TEXT[3]); + tWidth = AbstractCard.typeWidthCurse; + tOffset = AbstractCard.typeOffsetCurse; + break; + case STATUS: + descriptors.add(0, AbstractCard.TEXT[7]); + tWidth = AbstractCard.typeWidthStatus; + tOffset = AbstractCard.typeOffsetStatus; + break; + default: + descriptors.add(0, AbstractCard.TEXT[5]); + break; + } + + renderHelper(sb, (float) Settings.WIDTH / 2.0F, (float)Settings.HEIGHT / 2.0F, frame); + + if (descriptors.size() > 1) { + String text = String.join(RenderCardDescriptors.SEPARATOR, descriptors); + GlyphLayout gl = new GlyphLayout(); + FontHelper.panelNameFont.getData().setScale(1f); + gl.setText(FontHelper.panelNameFont, text); + tOffset = (gl.width - 70 * Settings.scale) / 2f; + tWidth = (gl.width - 0f) / (62 * Settings.scale); + } + + if (tWidth > 1.1f && frameMid != null) { + dynamicFrameRenderHelper(sb, frameMid, 0.0F, ___drawScale, tWidth); + dynamicFrameRenderHelper(sb, frameLeft, -tOffset, ___drawScale, 1.0F); + dynamicFrameRenderHelper(sb, frameRight, tOffset, ___drawScale, 1.0F); + } + + return SpireReturn.Return(null); } } @@ -110,7 +189,19 @@ private static void renderHelper(SpriteBatch sb, float x, float y, TextureAtlas. } private static void dynamicFrameRenderHelper(SpriteBatch sb, TextureAtlas.AtlasRegion img, float xOffset, float drawScale, float xScale) { - if (img != null) - sb.draw(img, (float)Settings.WIDTH / 2.0F + img.offsetX - (float)img.originalWidth / 2.0F + xOffset * drawScale, (float)Settings.HEIGHT / 2.0F + img.offsetY - (float)img.originalHeight / 2.0F, (float)img.originalWidth / 2.0F - img.offsetX, (float)img.originalHeight / 2.0F - img.offsetY, (float)img.packedWidth, (float)img.packedHeight, Settings.scale * xScale, Settings.scale, 0.0F); + Vector2 tmp = new Vector2(0, 0); + tmp.set(xOffset, 0); + sb.draw( + img, + Settings.WIDTH / 2f + img.offsetX - (img.originalWidth / 2f + 2) + tmp.x, + Settings.HEIGHT / 2f + img.offsetY - img.originalHeight / 2f + tmp.y, + img.originalWidth / 2f - img.offsetX + 2, + img.originalHeight / 2f - img.offsetY, + img.packedWidth, + img.packedHeight, + Settings.scale * xScale, + Settings.scale, + 0f + ); } } diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderCardDescriptorsSCV.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderCardDescriptorsSCV.java index 0a928454..fc66fefc 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderCardDescriptorsSCV.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderCardDescriptorsSCV.java @@ -43,6 +43,8 @@ public int[] Locate(CtBehavior ctBehavior) throws Exception } } } + + //Should be deleted, but cannot because stslib patches this. @SpirePatch( clz = SingleCardViewPopup.class, method = "renderFrame" @@ -55,6 +57,8 @@ public static class Frame ) public static SpireReturn Insert(SingleCardViewPopup __instance, SpriteBatch sb, AbstractCard ___card, @ByRef float[] tOffset, @ByRef float[] tWidth) { + if (__instance != null) return SpireReturn.Continue(); //if (true) gets optimized and removes rest of method + //RenderCardDescriptors.Frame.Insert(___card, sb, 0, 0, tOffset, tWidth); String typeText; switch (___card.type) {