Files
shattered-pixel-dungeon-web…/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java
T

232 lines
6.9 KiB
Java

/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2015 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 <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.items.artifacts;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
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.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.Collections;
public class UnstableSpellbook extends Artifact {
{
image = ItemSpriteSheet.ARTIFACT_SPELLBOOK;
levelCap = 10;
charge = ((level()/2)+3);
partialCharge = 0;
chargeCap = ((level()/2)+3);
defaultAction = AC_READ;
}
public static final String AC_READ = "READ";
public static final String AC_ADD = "ADD";
private final ArrayList<Class> scrolls = new ArrayList<>();
protected WndBag.Mode mode = WndBag.Mode.SCROLL;
public UnstableSpellbook() {
super();
Class<?>[] scrollClasses = Generator.Category.SCROLL.classes;
float[] probs = Generator.Category.SCROLL.probs.clone(); //array of primitives, clone gives deep copy.
int i = Random.chances(probs);
while (i != -1){
scrolls.add(scrollClasses[i]);
probs[i] = 0;
i = Random.chances(probs);
};
}
@Override
public ArrayList<String> actions( Hero hero ) {
ArrayList<String> actions = super.actions( hero );
if (isEquipped( hero ) && charge > 0 && !cursed)
actions.add(AC_READ);
if (isEquipped( hero ) && level() < levelCap && !cursed)
actions.add(AC_ADD);
return actions;
}
@Override
public void execute( Hero hero, String action ) {
super.execute( hero, action );
if (action.equals( AC_READ )) {
if (hero.buff( Blindness.class ) != null) GLog.w( Messages.get(this, "blinded") );
else if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") );
else if (charge == 0) GLog.i( Messages.get(this, "no_charge") );
else if (cursed) GLog.i( Messages.get(this, "cursed") );
else {
charge--;
Scroll scroll;
do {
scroll = (Scroll) Generator.random(Generator.Category.SCROLL);
} while (scroll == null ||
//gotta reduce the rate on these scrolls or that'll be all the item does.
((scroll instanceof ScrollOfIdentify ||
scroll instanceof ScrollOfRemoveCurse ||
scroll instanceof ScrollOfMagicMapping) && Random.Int(2) == 0));
scroll.ownedByBook = true;
scroll.execute(hero, AC_READ);
}
} else if (action.equals( AC_ADD )) {
GameScene.selectItem(itemSelector, mode, Messages.get(this, "prompt"));
}
}
@Override
protected ArtifactBuff passiveBuff() {
return new bookRecharge();
}
@Override
public Item upgrade() {
chargeCap = (((level()+1)/2)+3);
//for artifact transmutation.
while (scrolls.size() > (levelCap-1-level()))
scrolls.remove(0);
return super.upgrade();
}
@Override
public String desc() {
String desc = super.desc();
if (cursed && isEquipped (Dungeon.hero)){
desc += "\n\n" + Messages.get(this, "desc_cursed");
}
if (level() < levelCap)
if (scrolls.size() > 0) {
desc += "\n\n" + Messages.get(this, "desc_index");
desc += "\n" + Messages.get(scrolls.get(0), "name");
if (scrolls.size() > 1) desc += "\n" + Messages.get(scrolls.get(1), "name");
}
return desc;
}
private static final String SCROLLS = "scrolls";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle(bundle);
bundle.put( SCROLLS, scrolls.toArray(new Class[scrolls.size()]) );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle(bundle);
scrolls.clear();
Collections.addAll(scrolls, bundle.getClassArray(SCROLLS));
if (scrolls.contains(null)){
//compatability with pre-0.3.4, just give them a maxed book.
scrolls.clear();
level(levelCap);
chargeCap = 8;
}
}
public class bookRecharge extends ArtifactBuff{
@Override
public boolean act() {
LockedFloor lock = target.buff(LockedFloor.class);
if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) {
partialCharge += 1 / (150f - (chargeCap - charge)*15f);
if (partialCharge >= 1) {
partialCharge --;
charge ++;
if (charge == chargeCap){
partialCharge = 0;
}
}
}
updateQuickslot();
spend( TICK );
return true;
}
}
protected WndBag.Listener itemSelector = new WndBag.Listener() {
@Override
public void onSelect(Item item) {
if (item != null && item instanceof Scroll && item.isIdentified()){
Hero hero = Dungeon.hero;
for (int i = 0; ( i <= 1 && i < scrolls.size() ); i++){
if (scrolls.get(i).equals(item.getClass())){
hero.sprite.operate( hero.pos );
hero.busy();
hero.spend( 2f );
Sample.INSTANCE.play(Assets.SND_BURNING);
hero.sprite.emitter().burst( ElmoParticle.FACTORY, 12 );
scrolls.remove(i);
item.detach(hero.belongings.backpack);
upgrade();
GLog.i( Messages.get(UnstableSpellbook.class, "infuse_scroll") );
return;
}
}
GLog.w( Messages.get(UnstableSpellbook.class, "unable_scroll") );
} else if (item instanceof Scroll && !item.isIdentified())
GLog.w( Messages.get(UnstableSpellbook.class, "unknown_scroll") );
}
};
}