package theDefault.events; import com.megacrit.cardcrawl.cards.AbstractCard; import com.megacrit.cardcrawl.cards.CardGroup; import com.megacrit.cardcrawl.cards.colorless.Apotheosis; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.dungeons.AbstractDungeon; import com.megacrit.cardcrawl.events.AbstractImageEvent; import com.megacrit.cardcrawl.helpers.RelicLibrary; import com.megacrit.cardcrawl.helpers.ScreenShake; import com.megacrit.cardcrawl.localization.EventStrings; import com.megacrit.cardcrawl.relics.AbstractRelic; import com.megacrit.cardcrawl.vfx.cardManip.PurgeCardEffect; import com.megacrit.cardcrawl.vfx.cardManip.ShowCardAndObtainEffect; import theDefault.DefaultMod; import static theDefault.DefaultMod.makeEventPath; public class IdentityCrisisEvent extends AbstractImageEvent { public static final String ID = DefaultMod.makeID("IdentityCrisisEvent"); private static final EventStrings eventStrings = CardCrawlGame.languagePack.getEventString(ID); private static final String NAME = eventStrings.NAME; private static final String[] DESCRIPTIONS = eventStrings.DESCRIPTIONS; private static final String[] OPTIONS = eventStrings.OPTIONS; public static final String IMG = makeEventPath("IdentityCrisisEvent.png"); private int screenNum = 0; // The initial screen we will see when encountering the event - screen 0; private float HEALTH_LOSS_PERCENTAGE = 0.03F; // 3% private float HEALTH_LOSS_PERCENTAGE_LOW_ASCENSION = 0.05F; // 5% private int healthdamage; //The actual number of how much Max HP we're going to lose. public IdentityCrisisEvent() { super(NAME, DESCRIPTIONS[0], IMG); if (AbstractDungeon.ascensionLevel >= 15) { // If the player is ascension 15 or above, lose 5% max hp. Else, lose just 3%. healthdamage = (int) ((float) AbstractDungeon.player.maxHealth * HEALTH_LOSS_PERCENTAGE); } else { healthdamage = (int) ((float) AbstractDungeon.player.maxHealth * HEALTH_LOSS_PERCENTAGE_LOW_ASCENSION); } // The first dialogue options available to us. imageEventText.setDialogOption(OPTIONS[0]); // Inspiration - Gain a Random Starting Relic imageEventText.setDialogOption(OPTIONS[1] + healthdamage + OPTIONS[2]); // Denial - lose healthDamage Max HP imageEventText.setDialogOption(OPTIONS[3], new Apotheosis()); // Acceptance - Gain Apotheosis imageEventText.setDialogOption(OPTIONS[4]); // TOUCH THE MIRROR } @Override protected void buttonEffect(int i) { // This is the event: switch (screenNum) { case 0: // While you are on screen number 0 (The starting screen) switch (i) { case 0: // If you press button the first button (Button at index 0), in this case: Inspiration. this.imageEventText.updateBodyText(DESCRIPTIONS[1]); // Update the text of the event this.imageEventText.updateDialogOption(0, OPTIONS[5]); // 1. Change the first button to the [Leave] button this.imageEventText.clearRemainingOptions(); // 2. and remove all others screenNum = 1; // Screen set the screen number to 1. Once we exit the switch (i) statement, // we'll still continue the switch (screenNum) statement. It'll find screen 1 and do it's actions // (in our case, that's the final screen, but you can chain as many as you want like that) AbstractRelic relicToAdd = RelicLibrary.starterList.get(AbstractDungeon.relicRng.random(RelicLibrary.starterList.size() - 1)).makeCopy(); // Get a random starting relic AbstractDungeon.getCurrRoom().spawnRelicAndObtain((float)(Settings.WIDTH / 2), (float)(Settings.HEIGHT / 2), relicToAdd); break; // Onto screen 1 we go. case 1: // If you press button the second button (Button at index 1), in this case: Deinal CardCrawlGame.screenShake.shake(ScreenShake.ShakeIntensity.MED, ScreenShake.ShakeDur.MED, false); // Shake the screen CardCrawlGame.sound.play("BLUNT_FAST"); // Play a hit sound AbstractDungeon.player.decreaseMaxHealth(healthdamage); // Lose max HP if (CardGroup.getGroupWithoutBottledCards(AbstractDungeon.player.masterDeck.getPurgeableCards()).size() > 0) { // If you have cards you can remove - remove a card AbstractDungeon.gridSelectScreen.open( CardGroup.getGroupWithoutBottledCards( AbstractDungeon.player.masterDeck.getPurgeableCards()), 1, OPTIONS[6], false, false, false, true); } this.imageEventText.updateBodyText(DESCRIPTIONS[2]); this.imageEventText.updateDialogOption(0, OPTIONS[5]); this.imageEventText.clearRemainingOptions(); screenNum = 1; // Same as before. A note here is that you can also do // imageEventText.clearAllDialogs(); // imageEventText.setDialogOption(OPTIONS[1]); // imageEventText.setDialogOption(OPTIONS[4]); // (etc.) // And that would also just set them into slot 0, 1, 2... in order, just like what we do in the very beginning break; // Onto screen 1 we go. case 2: // If you press button the third button (Button at index 2), in this case: Acceptance AbstractCard c = new Apotheosis().makeCopy(); AbstractDungeon.effectList.add(new ShowCardAndObtainEffect(c, (float) (Settings.WIDTH / 2), (float) (Settings.HEIGHT / 2))); this.imageEventText.updateBodyText(DESCRIPTIONS[3]); this.imageEventText.updateDialogOption(0, OPTIONS[5]); this.imageEventText.clearRemainingOptions(); screenNum = 1; break; case 3: // If you press button the fourth button (Button at index 3), in this case: TOUCH imageEventText.loadImage("theDefaultResources/images/events/IdentityCrisisEvent2.png"); // Change the shown image // Other than that, this option doesn't do anything special. this.imageEventText.updateBodyText(DESCRIPTIONS[4]); this.imageEventText.updateDialogOption(0, OPTIONS[5]); this.imageEventText.clearRemainingOptions(); screenNum = 1; break; } break; case 1: // Welcome to screenNum = 1; switch (i) { case 0: // If you press the first (and this should be the only) button, openMap(); // You'll open the map and end the event. break; } break; } } public void update() { // We need the update() when we use grid screens (such as, in this case, the screen for selecting a card to remove) super.update(); // Do everything the original update() if (!AbstractDungeon.gridSelectScreen.selectedCards.isEmpty()) { // Once the grid screen isn't empty (we selected a card for removal) AbstractCard c = (AbstractCard)AbstractDungeon.gridSelectScreen.selectedCards.get(0); // Get the card AbstractDungeon.topLevelEffects.add(new PurgeCardEffect(c, (float)(Settings.WIDTH / 2), (float)(Settings.HEIGHT / 2))); // Create the card removal effect AbstractDungeon.player.masterDeck.removeCard(c); // Remove it from the deck AbstractDungeon.gridSelectScreen.selectedCards.clear(); // Or you can .remove(c) instead of clear, // if you want to continue using the other selected cards for something } } }