package stsjorbsmod.patches; import com.evacipated.cardcrawl.modthespire.lib.SpireField; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.megacrit.cardcrawl.cutscenes.Cutscene; import com.megacrit.cardcrawl.cutscenes.CutscenePanel; import javassist.CannotCompileException; import javassist.expr.ExprEditor; import javassist.expr.MethodCall; import java.util.ArrayList; public class CutsceneMultiScreenPatch { @SpirePatch( clz = CutscenePanel.class, method = SpirePatch.CLASS ) public static class CutscenePanelNewScreenField { public static SpireField<Boolean> startsNewScreen = new SpireField<>(() -> false); } @SpirePatch( clz = Cutscene.class, method = "updateSceneChange" ) public static class CutsceneFadeOlderPanelsOnNewScreen { public static void fadePanelsOnPreviousScreen(ArrayList<CutscenePanel> panels, CutscenePanel panelBeingActivated) { if (CutscenePanelNewScreenField.startsNewScreen.get(panelBeingActivated)) { for (CutscenePanel panel : panels) { if (panel == panelBeingActivated) { return; } if (!panel.fadeOut) { panel.fadeOut(); } } } } public static ExprEditor Instrument() { return new ExprEditor() { @Override public void edit(MethodCall methodCall) throws CannotCompileException { if (methodCall.getClassName().equals(CutscenePanel.class.getName()) && methodCall.getMethodName().equals("activate")) { methodCall.replace(String.format( "{ %1$s.fadePanelsOnPreviousScreen(this.panels, $0); $_ = $proceed($$); }", CutsceneFadeOlderPanelsOnNewScreen.class.getName())); } } }; } } }