diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 8e5e6b03f..e8a465e27 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -49,6 +49,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Speed; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Stamina; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; @@ -281,6 +282,7 @@ public abstract class Char extends Actor { public float speed() { float speed = baseSpeed; if ( buff( Cripple.class ) != null ) speed /= 2f; + if ( buff( Stamina.class ) != null) speed *= 1.5f; if ( buff( Adrenaline.class ) != null) speed *= 2f; if ( buff( Haste.class ) != null) speed *= 3f; return speed; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/CorrosiveGas.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/CorrosiveGas.java index 93a12c160..8e08d424a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/CorrosiveGas.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/CorrosiveGas.java @@ -33,6 +33,7 @@ import com.watabou.utils.Bundle; public class CorrosiveGas extends Blob { + //FIXME should have strength per-cell private int strength = 0; @Override @@ -57,9 +58,11 @@ public class CorrosiveGas extends Blob { } } - public void setStrength(int str){ - if (str > strength) + public CorrosiveGas setStrength(int str){ + if (str > strength) { strength = str; + } + return this; } private static final String STRENGTH = "strength"; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Stamina.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Stamina.java new file mode 100644 index 000000000..d200d0829 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Stamina.java @@ -0,0 +1,26 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.actors.buffs; + +//TODO +public class Stamina extends FlavourBuff { +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index f53e51f55..3ede64e67 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -76,6 +76,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfAdrenalineSurge; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror; @@ -198,6 +199,11 @@ public class Hero extends Char { int STR = this.STR; STR += RingOfMight.strengthBonus( this ); + + PotionOfAdrenalineSurge.strBoost buff = buff(PotionOfAdrenalineSurge.strBoost.class); + if (buff != null){ + STR += buff.boost(); + } return (buff(Weakness.class) != null) ? STR - 2 : STR; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index da1622842..a7a45ff85 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -529,16 +529,28 @@ public class Armor extends EquipableItem { Obfuscation.class, Swiftness.class, Viscosity.class, Potential.class, Brimstone.class, Stone.class, Entanglement.class, Repulsion.class, Camouflage.class, Flow.class, Affection.class, AntiMagic.class, Thorns.class }; - private static final float[] chances= new float[]{ - 10, 10, 10, 10, - 5, 5, 5, 5, 5, 5, - 2, 2, 2 }; + + private static final Class[] common = new Class[]{ + Obfuscation.class, Swiftness.class, Viscosity.class, Potential.class }; + + private static final Class[] uncommon = new Class[]{ + Brimstone.class, Stone.class, Entanglement.class, + Repulsion.class, Camouflage.class, Flow.class }; + + private static final Class[] rare = new Class[]{ + Affection.class, AntiMagic.class, Thorns.class }; + + private static final float[] typeChances = new float[]{ + 40, //10 each + 30, // 5 each + 6 // 2 each + }; private static final Class[] curses = new Class[]{ AntiEntropy.class, Corrosion.class, Displacement.class, Metabolism.class, Multiplicity.class, Stench.class, Overgrowth.class, Bulk.class }; - + public abstract int proc( Armor armor, Char attacker, Char defender, int damage ); public String name() { @@ -572,14 +584,46 @@ public class Armor extends EquipableItem { @SuppressWarnings("unchecked") public static Glyph random() { + switch(Random.chances(typeChances)){ + case 0: default: + return randomCommon(); + case 1: + return randomUncommon(); + case 2: + return randomRare(); + } + } + + @SuppressWarnings("unchecked") + public static Glyph randomCommon(){ try { - return ((Class)glyphs[ Random.chances( chances ) ]).newInstance(); + return ((Class)Random.oneOf(common)).newInstance(); } catch (Exception e) { ShatteredPixelDungeon.reportException(e); return null; } } - + + @SuppressWarnings("unchecked") + public static Glyph randomUncommon(){ + try { + return ((Class)Random.oneOf(uncommon)).newInstance(); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static Glyph randomRare(){ + try { + return ((Class)Random.oneOf(rare)).newInstance(); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + return null; + } + } + @SuppressWarnings("unchecked") public static Glyph randomCurse(){ try { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java index bc493ee7f..37935f664 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java @@ -41,6 +41,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.ItemStatusHandler; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCorrosiveGas; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -121,6 +123,10 @@ public class Potion extends Item { mustThrowPots.add(PotionOfLiquidFlame.class); mustThrowPots.add(PotionOfParalyticGas.class); mustThrowPots.add(PotionOfFrost.class); + + //exotic + mustThrowPots.add(PotionOfCorrosiveGas.class); + mustThrowPots.add(PotionOfSnapFreeze.class); } private static final HashSet> canThrowPots = new HashSet<>(); @@ -313,8 +319,10 @@ public class Potion extends Item { updateQuickslot(); Potion p = Dungeon.hero.belongings.getItem(getClass()); if (p != null) p.setAction(); - p = Dungeon.hero.belongings.getItem(ExoticPotion.regToExo.get(getClass())); - if (p != null) p.setAction(); + if (ExoticPotion.regToExo.get(getClass()) != null) { + p = Dungeon.hero.belongings.getItem(ExoticPotion.regToExo.get(getClass())); + if (p != null) p.setAction(); + } } if (Dungeon.hero.isAlive()) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/ExoticPotion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/ExoticPotion.java index 5cbd41176..4977e5003 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/ExoticPotion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/ExoticPotion.java @@ -26,7 +26,12 @@ import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; import java.util.ArrayList; @@ -41,8 +46,23 @@ public class ExoticPotion extends Potion { public static final HashMap, Class> regToExo = new HashMap<>(); public static final HashMap, Class> exoToReg = new HashMap<>(); static{ - regToExo.put(PotionOfHealing.class, PotionOfSheilding.class); - exoToReg.put(PotionOfSheilding.class, PotionOfHealing.class); + regToExo.put(PotionOfHealing.class, PotionOfShielding.class); + exoToReg.put(PotionOfShielding.class, PotionOfHealing.class); + + regToExo.put(PotionOfToxicGas.class, PotionOfCorrosiveGas.class); + exoToReg.put(PotionOfCorrosiveGas.class, PotionOfToxicGas.class); + + regToExo.put(PotionOfStrength.class, PotionOfAdrenalineSurge.class); + exoToReg.put(PotionOfAdrenalineSurge.class, PotionOfStrength.class); + + regToExo.put(PotionOfFrost.class, PotionOfSnapFreeze.class); + exoToReg.put(PotionOfSnapFreeze.class, PotionOfFrost.class); + + regToExo.put(PotionOfHaste.class, PotionOfStamina.class); + exoToReg.put(PotionOfStamina.class, PotionOfHaste.class); + + regToExo.put(PotionOfLiquidFlame.class, PotionOfDragonsBreath.class); + exoToReg.put(PotionOfDragonsBreath.class, PotionOfLiquidFlame.class); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfAdrenalineSurge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfAdrenalineSurge.java new file mode 100644 index 000000000..451b302ea --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfAdrenalineSurge.java @@ -0,0 +1,78 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.potions.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; + +public class PotionOfAdrenalineSurge extends ExoticPotion { + + @Override + public void apply(Hero hero) { + setKnown(); + Buff.affect(hero, strBoost.class).reset(); + } + + public static class strBoost extends Buff { + + int boost; + private static final float INTERVAL = TICK * 500f; + + public void reset(){ + boost = 2; + spend(INTERVAL - cooldown()); + } + + public int boost(){ + return boost; + } + + @Override + public boolean act() { + boost --; + if (boost > 0){ + spend( INTERVAL ); + } else { + detach(); + } + return true; + } + + //TODO visuals + + @Override + public int icon() { + return BuffIndicator.MOMENTUM; + } + + @Override + public String toString() { + return "surge"; + } + + @Override + public String desc() { + return "cur boost: +" + boost + "\n\nleft: " + dispTurns(cooldown()); + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCorrosiveGas.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCorrosiveGas.java new file mode 100644 index 000000000..1f5acc0ec --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfCorrosiveGas.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.potions.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.watabou.noosa.audio.Sample; + +public class PotionOfCorrosiveGas extends ExoticPotion { + + @Override + public void shatter( int cell ) { + + if (Dungeon.level.heroFOV[cell]) { + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + } + + GameScene.add( Blob.seed( cell, 100, CorrosiveGas.class ).setStrength( 1 + Dungeon.depth/5)); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java new file mode 100644 index 000000000..ac895be82 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfDragonsBreath.java @@ -0,0 +1,185 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.potions.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Callback; +import com.watabou.utils.PathFinder; + +import java.util.HashSet; + +public class PotionOfDragonsBreath extends ExoticPotion { + + //a lot of this is copy-paste from wand of fireblast + + //the actual affected cells + private HashSet affectedCells; + //the cells to trace fire shots to, for visual effects. + private HashSet visualCells; + private int direction = 0; + + @Override + //need to override drink so that time isn't spent right away + protected void drink(final Hero hero) { + detach( hero.belongings.backpack ); + setKnown(); + + //hero.spend( TIME_TO_DRINK ); + //hero.busy(); + //apply( hero ); + + GameScene.selectCell(targeter); + } + + private CellSelector.Listener targeter = new CellSelector.Listener() { + @Override + public void onSelect(final Integer cell) { + + if (cell == null){ + return; + } else { + Sample.INSTANCE.play( Assets.SND_DRINK ); + curUser.sprite.operate(curUser.pos, new Callback() { + @Override + public void call() { + + curUser.spend(1f); + curUser.sprite.idle(); + curUser.sprite.zap(cell); + + final Ballistica bolt + = new Ballistica(curUser.pos, cell, Ballistica.MAGIC_BOLT); + + affectedCells = new HashSet<>(); + visualCells = new HashSet<>(); + + int maxDist = 6; + int dist = Math.min(bolt.dist, maxDist); + + for (int i = 0; i < PathFinder.CIRCLE8.length; i++) { + if (bolt.sourcePos + PathFinder.CIRCLE8[i] == bolt.path.get(1)) { + direction = i; + break; + } + } + + float strength = maxDist; + for (int c : bolt.subPath(1, dist)) { + strength--; //as we start at dist 1, not 0. + affectedCells.add(c); + if (strength > 1) { + spreadFlames(c + PathFinder.CIRCLE8[left(direction)], strength - 1); + spreadFlames(c + PathFinder.CIRCLE8[direction], strength - 1); + spreadFlames(c + PathFinder.CIRCLE8[right(direction)], strength - 1); + } else { + visualCells.add(c); + } + } + + //going to call this one manually + visualCells.remove(bolt.path.get(dist)); + + for (int c : visualCells) { + //this way we only get the cells at the tip, much better performance. + ((MagicMissile) curUser.sprite.parent.recycle(MagicMissile.class)).reset( + MagicMissile.FIRE_CONE, + curUser.sprite, + c, + null + ); + } + + MagicMissile.boltFromChar(curUser.sprite.parent, + MagicMissile.FIRE_CONE, + curUser.sprite, + bolt.path.get(dist / 2), + new Callback() { + @Override + public void call() { + for (int cell : affectedCells){ + //ignore caster cell + if (cell == bolt.sourcePos){ + continue; + } + + GameScene.add( Blob.seed( cell, 5, Fire.class ) ); + + Char ch = Actor.findChar( cell ); + if (ch != null) { + + Buff.affect( ch, Burning.class ).reignite( ch ); + Buff.affect(ch, Cripple.class, 5f); break; + } + } + } + }); + + } + }); + } + } + + @Override + public String prompt() { + return "test"; + } + }; + + //burn... BURNNNNN!..... + private void spreadFlames(int cell, float strength){ + if (strength >= 0 && (Dungeon.level.passable[cell] || Dungeon.level.flamable[cell])){ + affectedCells.add(cell); + if (strength >= 1.5f) { + visualCells.remove(cell); + spreadFlames(cell + PathFinder.CIRCLE8[left(direction)], strength - 1.5f); + spreadFlames(cell + PathFinder.CIRCLE8[direction], strength - 1.5f); + spreadFlames(cell + PathFinder.CIRCLE8[right(direction)], strength - 1.5f); + } else { + visualCells.add(cell); + } + } else if (!Dungeon.level.passable[cell]) + visualCells.add(cell); + } + + private int left(int direction){ + return direction == 0 ? 7 : direction-1; + } + + private int right(int direction){ + return direction == 7 ? 0 : direction+1; + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSheilding.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java similarity index 93% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSheilding.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java index 626956943..f11685489 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSheilding.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java @@ -21,5 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic; -public class PotionOfSheilding extends ExoticPotion { +public class PotionOfShielding extends ExoticPotion { + //TODO } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSnapFreeze.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSnapFreeze.java new file mode 100644 index 000000000..c4a3199f9 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfSnapFreeze.java @@ -0,0 +1,63 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.potions.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.PathFinder; + +public class PotionOfSnapFreeze extends ExoticPotion { + + @Override + public void shatter(int cell) { + + if (Dungeon.level.heroFOV[cell]) { + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + } + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + + for (int offset : PathFinder.NEIGHBOURS9){ + if (!Dungeon.level.solid[cell+offset]) { + + Freezing.affect( cell + offset, fire ); + + Char ch = Actor.findChar( cell + offset); + if (ch != null){ + //TODO balancing on this + Buff.affect(ch, Roots.class, 10f); + } + + } + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfStamina.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfStamina.java new file mode 100644 index 000000000..eb4ebdfec --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfStamina.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.potions.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Stamina; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; + +public class PotionOfStamina extends ExoticPotion { + + @Override + public void apply(Hero hero) { + setKnown(); + + Buff.affect(hero, Stamina.class, 100f); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java index 81b4b0097..cc48e0595 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java @@ -139,7 +139,7 @@ public class Ring extends KindofMisc { return handler != null && handler.isKnown( this ); } - protected void setKnown() { + public void setKnown() { if (!isKnown()) { handler.know( this ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java index bd8363663..668e79c10 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java @@ -59,7 +59,7 @@ public abstract class Scroll extends Item { protected static final float TIME_TO_READ = 1f; - protected int initials; + protected Integer initials; private static final Class[] scrolls = { ScrollOfIdentify.class, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ExoticScroll.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ExoticScroll.java index 072166da3..cc7e6201e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ExoticScroll.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ExoticScroll.java @@ -26,6 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import java.util.ArrayList; @@ -39,6 +41,13 @@ public abstract class ExoticScroll extends Scroll { static{ regToExo.put(ScrollOfIdentify.class, ScrollOfForesight.class); exoToReg.put(ScrollOfForesight.class, ScrollOfIdentify.class); + + regToExo.put(ScrollOfUpgrade.class, ScrollOfEnchantment.class); + exoToReg.put(ScrollOfEnchantment.class, ScrollOfUpgrade.class); + + regToExo.put(ScrollOfTerror.class, ScrollOfPetrification.class); + exoToReg.put(ScrollOfPetrification.class, ScrollOfTerror.class); + } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfDistortion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfDistortion.java new file mode 100644 index 000000000..ee1943104 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfDistortion.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.scrolls.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon; +import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; +import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; +import com.watabou.noosa.Game; + +public class ScrollOfDistortion extends ExoticScroll { + + @Override + public void doRead() { + //FIXME this doesn't handle various edge-cases. especially as it can trigger in boss rooms! + InterlevelScene.returnDepth = Dungeon.depth; + Belongings belongings = Dungeon.hero.belongings; + + for (Notes.Record rec : Notes.getRecords()){ + if (rec.depth() == Dungeon.depth){ + Notes.remove(rec); + } + } + + for (Item i : belongings){ + if (i instanceof LloydsBeacon && ((LloydsBeacon) i).returnDepth == Dungeon.depth) + ((LloydsBeacon) i).returnDepth = -1; + } + + InterlevelScene.mode = InterlevelScene.Mode.RESET; + Game.switchScene(InterlevelScene.class); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfEnchantment.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfEnchantment.java new file mode 100644 index 000000000..e1bea5dea --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfEnchantment.java @@ -0,0 +1,100 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.scrolls.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.effects.Enchanting; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; + +public class ScrollOfEnchantment extends ExoticScroll { + @Override + public void doRead() { + setKnown(); + + GameScene.selectItem( itemSelector, WndBag.Mode.ENCHANTABLE, "TODO" ); + } + + protected static WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect(final Item item) { + + if (item instanceof Weapon){ + + final Weapon.Enchantment enchants[] = new Weapon.Enchantment[3]; + + enchants[0] = Weapon.Enchantment.randomCommon(); + enchants[1] = Weapon.Enchantment.randomUncommon(); + do { + enchants[2] = Weapon.Enchantment.random(); + } while (enchants[2].getClass() == enchants[0].getClass() || + enchants[1].getClass() == enchants[0].getClass()); + + GameScene.show(new WndOptions("title", "body", + enchants[0].name(), + enchants[1].name(), + enchants[2].name(), + "cancel"){ + + @Override + protected void onSelect(int index) { + if (index < 3) { + ((Weapon) item).enchant(enchants[index]); + //TODO text + Enchanting.show(curUser, item); + } + } + }); + + } else { + + final Armor.Glyph glyphs[] = new Armor.Glyph[3]; + + glyphs[0] = Armor.Glyph.randomCommon(); + glyphs[1] = Armor.Glyph.randomUncommon(); + do { + glyphs[2] = Armor.Glyph.random(); + } while (glyphs[2].getClass() == glyphs[0].getClass() || + glyphs[1].getClass() == glyphs[0].getClass()); + + GameScene.show(new WndOptions("title", "body", + glyphs[0].name(), + glyphs[1].name(), + glyphs[2].name(), + "cancel"){ + + @Override + protected void onSelect(int index) { + if (index < 3) { + ((Armor) item).inscribe(glyphs[index]); + //TODO text + Enchanting.show(curUser, item); + } + } + }); + } + } + }; +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfForesight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfForesight.java index 862dea172..f64855414 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfForesight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfForesight.java @@ -21,9 +21,102 @@ package com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic; +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; +import com.shatteredpixel.shatteredpixeldungeon.effects.Identification; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Random; + +import java.util.HashSet; + public class ScrollOfForesight extends ExoticScroll { @Override public void doRead() { - + + curUser.sprite.parent.add( new Identification( curUser.sprite.center().offset( 0, -16 ) ) ); + + readAnimation(); + setKnown(); + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + HashSet> potions = Potion.getUnknown(); + HashSet> scrolls = Scroll.getUnknown(); + HashSet> rings = Ring.getUnknown(); + + int total = potions.size() + scrolls.size() + rings.size(); + + if (total == 0){ + GLog.n("Nothing left to Identify!"); + return; + } + + /* + //items which the player holds have lower priority + HashSet> heldPotions = new HashSet<>(); + HashSet> heldScrolls = new HashSet<>(); + HashSet> heldRings = new HashSet<>(); + + for (Class p : potions){ + if (curUser.belongings.getItem(p) != null){ + heldPotions.add(p); + } + } + potions.removeAll(heldPotions); + + for (Class s : scrolls){ + if (curUser.belongings.getItem(s) != null){ + heldScrolls.add(s); + } + } + scrolls.removeAll(heldScrolls); + + for (Class r : rings){ + if (curUser.belongings.getItem(r) != null){ + heldRings.add(r); + } + } + rings.removeAll(heldRings);*/ + + int left = 4; + + while (left > 0 && total > 0) { + try { + switch (Random.Int(3)) { + case 0: + default: + if (potions.isEmpty()) continue; + Potion p = Random.element(potions).newInstance(); + p.setKnown(); + GLog.i(p.name() + " identified!"); + potions.remove(p.getClass()); + break; + case 1: + if (scrolls.isEmpty()) continue; + Scroll s = Random.element(scrolls).newInstance(); + s.setKnown(); + GLog.i(s.name() + " identified!"); + scrolls.remove(s.getClass()); + break; + case 2: + if (rings.isEmpty()) continue; + Ring r = Random.element(rings).newInstance(); + r.setKnown(); + GLog.i(r.name() + " identified!"); + rings.remove(r.getClass()); + break; + } + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + } + left --; + total --; + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPetrification.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPetrification.java new file mode 100644 index 000000000..102806d85 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPetrification.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 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.scrolls.exotic; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; +import com.watabou.noosa.audio.Sample; + +public class ScrollOfPetrification extends ExoticScroll { + @Override + public void doRead() { + new Flare( 5, 32 ).color( 0xFF0000, true ).show( curUser.sprite, 2f ); + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { + if (Dungeon.level.heroFOV[mob.pos]) { + Buff.affect( mob, Paralysis.class, Paralysis.DURATION ); + + } + } + + setKnown(); + + readAnimation(); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index 362ad03e6..07325784e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -265,20 +265,28 @@ abstract public class Weapon extends KindOfWeapon { } public static abstract class Enchantment implements Bundlable { - - private static final Class[] enchants = new Class[]{ - Blazing.class, Venomous.class, Vorpal.class, Shocking.class, - Chilling.class, Eldritch.class, Lucky.class, Projecting.class, Unstable.class, Dazzling.class, - Grim.class, Stunning.class, Vampiric.class,}; - private static final float[] chances= new float[]{ - 10, 10, 10, 10, - 5, 5, 5, 5, 5, 5, - 2, 2, 2 }; - + + private static final Class[] common = new Class[]{ + Blazing.class, Venomous.class, Vorpal.class, Shocking.class}; + + private static final Class[] uncommon = new Class[]{ + Chilling.class, Eldritch.class, Lucky.class, + Projecting.class, Unstable.class, Dazzling.class}; + + private static final Class[] rare = new Class[]{ + Grim.class, Stunning.class, Vampiric.class}; + + private static final float[] typeChances = new float[]{ + 40, //10 each + 30, // 5 each + 6 // 2 each + }; + private static final Class[] curses = new Class[]{ Annoying.class, Displacing.class, Exhausting.class, Fragile.class, Sacrificial.class, Wayward.class, Elastic.class, Friendly.class }; + public abstract int proc( Weapon weapon, Char attacker, Char defender, int damage ); @@ -313,8 +321,40 @@ abstract public class Weapon extends KindOfWeapon { @SuppressWarnings("unchecked") public static Enchantment random() { + switch(Random.chances(typeChances)){ + case 0: default: + return randomCommon(); + case 1: + return randomUncommon(); + case 2: + return randomRare(); + } + } + + @SuppressWarnings("unchecked") + public static Enchantment randomCommon() { try { - return ((Class)enchants[ Random.chances( chances ) ]).newInstance(); + return ((Class)Random.oneOf(common)).newInstance(); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static Enchantment randomUncommon() { + try { + return ((Class)Random.oneOf(uncommon)).newInstance(); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static Enchantment randomRare() { + try { + return ((Class)Random.oneOf(rare)).newInstance(); } catch (Exception e) { ShatteredPixelDungeon.reportException(e); return null; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java index 73ee1cb12..6c76dc209 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java @@ -222,6 +222,12 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip play( operate ); } + public void operate( int cell, Callback callback ) { + animCallback = callback; + turnTo( ch.pos, cell ); + play( operate ); + } + public void zap( int cell ) { turnTo( ch.pos, cell ); play( zap );