/* * Pixel Dungeon * Copyright (C) 2012-2015 Oleg Dolya * * Shattered Pixel Dungeon * Copyright (C) 2014-2016 Evan Debenham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ package com.shatteredpixel.shatteredpixeldungeon.items; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndItem; import com.watabou.noosa.audio.Sample; import java.util.ArrayList; public class BrokenSeal extends Item { public static final String AC_AFFIX = "AFFIX"; //only to be used from the quickslot, for tutorial purposes mostly. public static final String AC_INFO = "INFO_WINDOW"; { image = ItemSpriteSheet.SEAL; cursedKnown = levelKnown = true; unique = true; bones = false; defaultAction = AC_INFO; } @Override public ArrayList actions(Hero hero) { ArrayList actions = super.actions(hero); actions.add(AC_AFFIX); return actions; } @Override public void execute(Hero hero, String action) { super.execute(hero, action); if (action.equals(AC_AFFIX)){ curItem = this; GameScene.selectItem(armorSelector, WndBag.Mode.ARMOR, Messages.get(this, "prompt")); } else if (action.equals(AC_INFO)) { GameScene.show(new WndItem(null, this, true)); } } @Override //scroll of upgrade can be used directly once, same as upgrading armor the seal is affixed to then removing it. public boolean isUpgradable() { return level() == 0; } protected static WndBag.Listener armorSelector = new WndBag.Listener() { @Override public void onSelect( Item item ) { if (item != null && item instanceof Armor) { Armor armor = (Armor)item; if (!armor.levelKnown){ GLog.w(Messages.get(BrokenSeal.class, "unknown_armor")); } else if (armor.cursed || armor.level() < 0){ GLog.w(Messages.get(BrokenSeal.class, "degraded_armor")); } else { GLog.p(Messages.get(BrokenSeal.class, "affix")); Dungeon.hero.sprite.operate(Dungeon.hero.pos); Sample.INSTANCE.play(Assets.SND_UNLOCK); armor.affixSeal((BrokenSeal)curItem); curItem.detach(Dungeon.hero.belongings.backpack); Badges.validateTutorial(); } } } }; public static class WarriorShield extends Buff { private Armor armor; private float partialShield; @Override public boolean act() { if (armor == null) detach(); else if (armor.isEquipped((Hero)target)) { if (target.SHLD < maxShield()){ partialShield += 1/(35*Math.pow(0.885f, (maxShield() - target.SHLD - 1))); } } while (partialShield >= 1){ target.SHLD++; partialShield--; } spend(TICK); return true; } public void setArmor(Armor arm){ armor = arm; } public int maxShield() { return 1 + armor.tier + armor.level(); } } }