diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java index 8bfce5523..15db278d4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -177,7 +177,6 @@ public abstract class Recipe { private static Recipe[] twoIngredientRecipes = new Recipe[]{ new Blandfruit.CookFruit(), - new TippedDart.TipDart(), new Bomb.EnhanceBomb(), new AlchemicalCatalyst.Recipe(), new ArcaneCatalyst.Recipe(), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java index c42d5ef26..138acdcc9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java @@ -24,9 +24,18 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; + +import java.util.ArrayList; public class Dart extends MissileWeapon { @@ -38,7 +47,25 @@ public class Dart extends MissileWeapon { //infinite, even with penalties baseUses = 1000; } - + + protected static final String AC_TIP = "TIP"; + + @Override + public ArrayList actions(Hero hero) { + ArrayList actions = super.actions( hero ); + actions.add( AC_TIP ); + return actions; + } + + @Override + public void execute(Hero hero, String action) { + if (action.equals(AC_TIP)){ + GameScene.selectItem(itemSelector, WndBag.Mode.SEED, "select a seed"); + } + + super.execute(hero, action); + } + @Override public int min(int lvl) { if (bow != null){ @@ -106,4 +133,91 @@ public class Dart extends MissileWeapon { public boolean isUpgradable() { return false; } + + @Override + public int price() { + return super.price()/2; //half normal value + } + + private final WndBag.Listener itemSelector = new WndBag.Listener() { + + @Override + public void onSelect(final Item item) { + + if (item == null) return; + + final int maxToTip = Math.min(curItem.quantity(), item.quantity()*2); + final int maxSeedsToUse = (maxToTip+1)/2; + + final int singleSeedDarts; + + final String[] options; + + if (curItem.quantity() == 1){ + singleSeedDarts = 1; + options = new String[]{ + Messages.get(Dart.class, "tip_one"), + Messages.get(Dart.class, "tip_cancel")}; + } else { + singleSeedDarts = 2; + if (maxToTip <= 2){ + options = new String[]{ + Messages.get(Dart.class, "tip_two"), + Messages.get(Dart.class, "tip_cancel")}; + } else { + options = new String[]{ + Messages.get(Dart.class, "tip_all", maxToTip, maxSeedsToUse), + Messages.get(Dart.class, "tip_two"), + Messages.get(Dart.class, "tip_cancel")}; + } + } + + TippedDart tipResult = TippedDart.getTipped((Plant.Seed) item, 1); + + GameScene.show(new WndOptions(Messages.get(Dart.class, "tip_title"), + Messages.get(Dart.class, "tip_desc", tipResult.name()) + "\n\n" + tipResult.desc(), + options){ + + @Override + protected void onSelect(int index) { + super.onSelect(index); + + if (index == 0 && options.length == 3){ + if (item.quantity() <= maxSeedsToUse){ + item.detachAll( curUser.belongings.backpack ); + } else { + item.quantity(item.quantity() - maxSeedsToUse); + } + + curItem.detachAll( curUser.belongings.backpack ); + + TippedDart newDart = TippedDart.getTipped((Plant.Seed) item, maxToTip); + if (!newDart.collect()) Dungeon.level.drop(newDart, curUser.pos).sprite.drop(); + + curUser.spend( 1f ); + curUser.busy(); + curUser.sprite.operate(curUser.pos); + + } else if ((index == 1 && options.length == 3) || (index == 0 && options.length == 2)){ + item.detach( curUser.belongings.backpack ); + + if (curItem.quantity() <= singleSeedDarts){ + curItem.detachAll( curUser.belongings.backpack ); + } else { + curItem.quantity(curItem.quantity() - singleSeedDarts); + } + + TippedDart newDart = TippedDart.getTipped((Plant.Seed) item, singleSeedDarts); + if (!newDart.collect()) Dungeon.level.drop(newDart, curUser.pos).sprite.drop(); + + curUser.spend( 1f ); + curUser.busy(); + curUser.sprite.operate(curUser.pos); + } + } + }); + + } + + }; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java index 3ed839080..7e99b6d91 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/TippedDart.java @@ -23,13 +23,16 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil; import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot; @@ -43,6 +46,8 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.Starflower; import com.shatteredpixel.shatteredpixeldungeon.plants.Stormvine; import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass; import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; import java.util.ArrayList; import java.util.HashMap; @@ -56,6 +61,49 @@ public abstract class TippedDart extends Dart { baseUses = 0.65f; } + private static final String AC_CLEAN = "CLEAN"; + + @Override + public ArrayList actions(Hero hero) { + ArrayList actions = super.actions( hero ); + actions.remove( AC_TIP ); + actions.add( AC_CLEAN ); + return actions; + } + + @Override + public void execute(final Hero hero, String action) { + if (action.equals( AC_CLEAN )){ + + GameScene.show(new WndOptions(Messages.get(this, "clean_title"), + Messages.get(this, "clean_desc"), + Messages.get(this, "clean_all"), + Messages.get(this, "clean_one"), + Messages.get(this, "cancel")){ + @Override + protected void onSelect(int index) { + if (index == 0){ + detachAll(hero.belongings.backpack); + new Dart().quantity(quantity).collect(); + + hero.spend( 1f ); + hero.busy(); + hero.sprite.operate(hero.pos); + } else if (index == 1){ + detach(hero.belongings.backpack); + if (!new Dart().collect()) Dungeon.level.drop(new Dart(), hero.pos).sprite.drop(); + + hero.spend( 1f ); + hero.busy(); + hero.sprite.operate(hero.pos); + } + } + }); + + } + super.execute(hero, action); + } + //exact same damage as regular darts, despite being higher tier. @Override @@ -88,6 +136,12 @@ public abstract class TippedDart extends Dart { return use; } + @Override + public int price() { + //value of regular dart plus half of the seed + return 8 * quantity; + } + private static HashMap, Class> types = new HashMap<>(); static { types.put(Blindweed.Seed.class, BlindingDart.class); @@ -104,89 +158,23 @@ public abstract class TippedDart extends Dart { types.put(Swiftthistle.Seed.class, AdrenalineDart.class); } - public static TippedDart randomTipped(){ + public static TippedDart getTipped( Plant.Seed s, int quantity ){ + try { + return (TippedDart) types.get(s.getClass()).newInstance().quantity(quantity); + } catch (Exception e){ + ShatteredPixelDungeon.reportException(e); + return null; + } + } + + public static TippedDart randomTipped( int quantity ){ Plant.Seed s; do{ s = (Plant.Seed) Generator.random(Generator.Category.SEED); } while (!types.containsKey(s.getClass())); - try{ - return (TippedDart) types.get(s.getClass()).newInstance().quantity(2); - } catch (Exception e) { - ShatteredPixelDungeon.reportException(e); - return null; - } + return getTipped(s, quantity ); } - public static class TipDart extends Recipe{ - - @Override - //also sorts ingredients if it can - public boolean testIngredients(ArrayList ingredients) { - if (ingredients.size() != 2) return false; - - if (ingredients.get(0).getClass() == Dart.class){ - if (!(ingredients.get(1) instanceof Plant.Seed)){ - return false; - } - } else if (ingredients.get(0) instanceof Plant.Seed){ - if (ingredients.get(1).getClass() == Dart.class){ - Item temp = ingredients.get(0); - ingredients.set(0, ingredients.get(1)); - ingredients.set(1, temp); - } else { - return false; - } - } else { - return false; - } - - Plant.Seed seed = (Plant.Seed) ingredients.get(1); - - if (ingredients.get(0).quantity() >= 1 - && seed.quantity() >= 1 - && types.containsKey(seed.getClass())){ - return true; - } - - return false; - } - - @Override - public int cost(ArrayList ingredients) { - return 0; - } - - @Override - public Item brew(ArrayList ingredients) { - if (!testIngredients(ingredients)) return null; - - int produced = Math.min(2, ingredients.get(0).quantity()); - - ingredients.get(0).quantity(ingredients.get(0).quantity() - produced); - ingredients.get(1).quantity(ingredients.get(1).quantity() - 1); - - try{ - return types.get(ingredients.get(1).getClass()).newInstance().quantity(produced); - } catch (Exception e) { - ShatteredPixelDungeon.reportException(e); - return null; - } - - } - - @Override - public Item sampleOutput(ArrayList ingredients) { - if (!testIngredients(ingredients)) return null; - - try{ - int produced = Math.min(2, ingredients.get(0).quantity()); - return types.get(ingredients.get(1).getClass()).newInstance().quantity( produced ); - } catch (Exception e) { - ShatteredPixelDungeon.reportException(e); - return null; - } - } - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java index 3d0c6703b..11a9149e2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java @@ -204,7 +204,7 @@ public class ShopRoom extends SpecialRoom { break; } - itemsToSpawn.add( TippedDart.randomTipped() ); + itemsToSpawn.add( TippedDart.randomTipped(2) ); itemsToSpawn.add( new MerchantsBeacon() ); diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties index a934ae9cd..b613335c0 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties @@ -1339,7 +1339,14 @@ items.weapon.missiles.darts.chillingdart.name=chilling dart items.weapon.missiles.darts.chillingdart.desc=These darts are tipped with an icecap-based compound which will significantly chill their target. items.weapon.missiles.darts.dart.name=dart -items.weapon.missiles.darts.dart.desc=These simple shafts of spike-tipped wood are weighted to fly true and sting their prey with a flick of the wrist. +items.weapon.missiles.darts.dart.ac_tip=TIP +items.weapon.missiles.darts.dart.tip_title=Tip Darts +items.weapon.missiles.darts.dart.tip_desc=A seed can be combined with one or two darts to tip them. Each type of seed produces its own type of tipped dart, with a unique single-use effect.\n\nTipping a dart with these seeds will produce a _%s._ +items.weapon.missiles.darts.dart.tip_all=tip %d darts with %d seeds +items.weapon.missiles.darts.dart.tip_two=tip 2 darts with 1 seed +items.weapon.missiles.darts.dart.tip_one=tip 1 dart with 1 seed +items.weapon.missiles.darts.dart.tip_cancel=cancel +items.weapon.missiles.darts.dart.desc=These simple shafts of spike-tipped wood are weighted to fly true and sting their prey with a flick of the wrist. They can tipped with seeds to gain bonus effects when thrown. items.weapon.missiles.darts.dart.unlimited_uses=However, due to their simple construction darts will effectively last forever. items.weapon.missiles.darts.displacingdart.name=displacing dart @@ -1369,6 +1376,12 @@ items.weapon.missiles.darts.shockingdart.desc=These darts are tipped with a stor items.weapon.missiles.darts.sleepdart.name=sleep dart items.weapon.missiles.darts.sleepdart.desc=These darts are tipped with a dreamfoil-based compound which will instantly put their target into a light sleep. +items.weapon.missiles.darts.tippeddart.ac_clean=CLEAN +items.weapon.missiles.darts.tippeddart.clean_title=Clean Darts +items.weapon.missiles.darts.tippeddart.clean_desc=This action will remove the seed tipping on your darts, reverting them back to regular darts. +items.weapon.missiles.darts.tippeddart.clean_all=clean all +items.weapon.missiles.darts.tippeddart.clean_one=clean one +items.weapon.missiles.darts.tippeddart.cancel=cancel items.weapon.missiles.darts.tippeddart.durability=Tipped darts will lose their tips and become regular darts when used. items.weapon.missiles.darts.tippeddart.uses_left=This stack of darts has _%d/%d_ uses left before one tip wears off. items.weapon.missiles.darts.tippeddart.unlimited_uses=_But these are of such high quality that they will effectively last forever._