/* * 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 */ package com.shatteredpixel.shatteredpixeldungeon.plants; import java.util.ArrayList; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.sprites.PlantSprite; import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; import com.watabou.utils.Bundlable; import com.watabou.utils.Bundle; import com.watabou.utils.Random; public abstract class Plant implements Bundlable { public String plantName = Messages.get(this, "name"); public int image; public int pos; public PlantSprite sprite; public void trigger(){ Char ch = Actor.findChar(pos); if (ch instanceof Hero && ((Hero)ch).subClass == HeroSubClass.WARDEN) { Buff.affect( ch, Barkskin.class ).level( ch.HT / 3 ); } wither(); activate(); } public abstract void activate(); public void wither() { Dungeon.level.uproot( pos ); sprite.kill(); if (Dungeon.visible[pos]) { CellEmitter.get( pos ).burst( LeafParticle.GENERAL, 6 ); } if (Dungeon.hero.subClass == HeroSubClass.WARDEN) { int naturalismLevel = 0; SandalsOfNature.Naturalism naturalism = Dungeon.hero.buff( SandalsOfNature.Naturalism.class ); if (naturalism != null) { naturalismLevel = naturalism.itemLevel()+1; } if (Random.Int( 5 - (naturalismLevel/2) ) == 0) { Item seed = Generator.random(Generator.Category.SEED); if (seed instanceof BlandfruitBush.Seed) { if (Random.Int(15) - Dungeon.limitedDrops.blandfruitSeed.count >= 0) { Dungeon.level.drop(seed, pos).sprite.drop(); Dungeon.limitedDrops.blandfruitSeed.count++; } } else Dungeon.level.drop(seed, pos).sprite.drop(); } if (Random.Int( 5 - naturalismLevel ) == 0) { Dungeon.level.drop( new Dewdrop(), pos ).sprite.drop(); } } } private static final String POS = "pos"; @Override public void restoreFromBundle( Bundle bundle ) { pos = bundle.getInt( POS ); } @Override public void storeInBundle( Bundle bundle ) { bundle.put( POS, pos ); } public String desc() { return Messages.get(this, "desc"); } public static class Seed extends Item { private static final float TIME_TO_PLANT = 1f; { stackable = true; defaultAction = AC_THROW; } protected Class plantClass; protected String plantName; public Class alchemyClass; protected void setPlant(Class plantClass){ this.plantClass = plantClass; plantName = Messages.get(plantClass, "name"); name = Messages.get(Seed.class, "seed_of", plantName); } @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); actions.add( Messages.get( Seed.class, "ac_plant" ) ); return actions; } @Override protected void onThrow( int cell ) { if (Dungeon.level.map[cell] == Terrain.ALCHEMY || Level.pit[cell]) { super.onThrow( cell ); } else { Dungeon.level.plant( this, cell ); } } @Override public void execute( Hero hero, String action ) { if (action.equals( Messages.get( Seed.class, "ac_plant" ))) { hero.spend( TIME_TO_PLANT ); hero.busy(); ((Seed)detach( hero.belongings.backpack )).onThrow( hero.pos ); hero.sprite.operate( hero.pos ); } else { super.execute (hero, action ); } } public Plant couch( int pos ) { try { if (Dungeon.visible[pos]) { Sample.INSTANCE.play(Assets.SND_PLANT); } Plant plant = plantClass.newInstance(); plant.pos = pos; return plant; } catch (Exception e) { return null; } } @Override public boolean isUpgradable() { return false; } @Override public boolean isIdentified() { return true; } @Override public int price() { return 10 * quantity; } @Override public String desc() { return Messages.get(plantClass, "desc"); } @Override public String info() { return Messages.get( Seed.class, "info", Utils.indefinite( plantName ), desc() ); } } }