v2.4.0: aqua blast and feather fall are now a brew and elixir

This commit is contained in:
Evan Debenham
2024-02-24 13:45:23 -05:00
parent e2372805bf
commit e67d25967c
13 changed files with 90 additions and 85 deletions

View File

@@ -729,12 +729,15 @@ items.potions.potionoftoxicgas.desc=Uncorking or shattering this pressurized gla
###brews ###brews
items.potions.brews.causticbrew.name=caustic brew items.potions.brews.aquabrew.name=aqua brew
items.potions.brews.causticbrew.desc=This brew will spread corrosive ooze in a wide area around the location it shatters in. Anything caught by the ooze will slowly melt if it can't wash it off in water. items.potions.brews.aquabrew.desc=When shattered, this brew will release a burst of pressurized water at its location. It's only forceful enough to damage fiery enemies, but it also spreads water to nearby terrain, douses fires, and knocks back characters near the burst.
items.potions.brews.blizzardbrew.name=blizzard brew items.potions.brews.blizzardbrew.name=blizzard brew
items.potions.brews.blizzardbrew.desc=When shattered, this brew will unleash a swirling blizzard which quickly spreads like a gas. items.potions.brews.blizzardbrew.desc=When shattered, this brew will unleash a swirling blizzard which quickly spreads like a gas.
items.potions.brews.causticbrew.name=caustic brew
items.potions.brews.causticbrew.desc=This brew will spread corrosive ooze in a wide area around the location it shatters in. Anything caught by the ooze will slowly melt if it can't wash it off in water.
items.potions.brews.infernalbrew.name=infernal brew items.potions.brews.infernalbrew.name=infernal brew
items.potions.brews.infernalbrew.desc=When shattered, this brew will unleash a raging inferno which quickly spreads like a gas. items.potions.brews.infernalbrew.desc=When shattered, this brew will unleash a raging inferno which quickly spreads like a gas.
@@ -755,6 +758,12 @@ items.potions.elixirs.elixirofaquaticrejuvenation$aquahealing.desc=You have temp
items.potions.elixirs.elixirofdragonsblood.name=elixir of dragon's blood items.potions.elixirs.elixirofdragonsblood.name=elixir of dragon's blood
items.potions.elixirs.elixirofdragonsblood.desc=When consumed, this elixir will send fiery power coursing through the drinker's veins. This effect will make the drinker immune to fire, and allow them to set enemies aflame with physical attacks. items.potions.elixirs.elixirofdragonsblood.desc=When consumed, this elixir will send fiery power coursing through the drinker's veins. This effect will make the drinker immune to fire, and allow them to set enemies aflame with physical attacks.
items.potions.elixirs.elixiroffeatherfall.name=elixir of feather fall
items.potions.elixirs.elixiroffeatherfall.light=You feel light as a feather!
items.potions.elixirs.elixiroffeatherfall.desc=This elixir offers a weaker but more controlled levitation effect, allowing the drinker to fall great distances without harm for a short time. Each use of the elixir will only provide enough protection for one chasm.
items.potions.elixirs.elixiroffeatherfall$featherbuff.name=feather fall
items.potions.elixirs.elixiroffeatherfall$featherbuff.desc=You are under the effects of a feather fall elixir, allowing you to fall into a chasm without taking damage! This effect will expire when it is used, or after a bit of time passes.\n\nTurns remaining: %s.
items.potions.elixirs.elixirofhoneyedhealing.name=elixir of honeyed healing items.potions.elixirs.elixirofhoneyedhealing.name=elixir of honeyed healing
items.potions.elixirs.elixirofhoneyedhealing.desc=This elixir combines healing with the sweetness of honey. When drank, it will satisfy a small amount of hunger, but it can also be thrown to heal an ally.\n\nCreatures with an affinity for honey might be pacified if this item is used on them. items.potions.elixirs.elixirofhoneyedhealing.desc=This elixir combines healing with the sweetness of honey. When drank, it will satisfy a small amount of hunger, but it can also be thrown to heal an ally.\n\nCreatures with an affinity for honey might be pacified if this item is used on them.
@@ -1157,9 +1166,6 @@ items.spells.alchemize$wndalchemizeitem.energize=Turn into %d energy
items.spells.alchemize$wndalchemizeitem.energize_1=Turn 1 into %d energy items.spells.alchemize$wndalchemizeitem.energize_1=Turn 1 into %d energy
items.spells.alchemize$wndalchemizeitem.energize_all=Turn all into %d energy items.spells.alchemize$wndalchemizeitem.energize_all=Turn all into %d energy
items.spells.aquablast.name=aqua blast
items.spells.aquablast.desc=This spell will create a burst of water at the target location. It's only forceful enough to damage fiery enemies, but it also spreads water to nearby terrain, douses fires, and knocks back characters near the burst.
items.spells.arcanecatalyst.name=arcane catalyst items.spells.arcanecatalyst.name=arcane catalyst
items.spells.arcanecatalyst.desc=This ball of golden dust is made from the deconstructed essence of a scroll. It glimmers in the darkness of the dungeon.\n\nThis catalyst is primarily useful as an alchemy ingredient, but you can also channel the magic directly to get the effect of a random scroll. items.spells.arcanecatalyst.desc=This ball of golden dust is made from the deconstructed essence of a scroll. It glimmers in the darkness of the dungeon.\n\nThis catalyst is primarily useful as an alchemy ingredient, but you can also channel the magic directly to get the effect of a random scroll.
@@ -1177,12 +1183,6 @@ items.spells.curseinfusion.name=curse infusion
items.spells.curseinfusion.inv_title=Curse an item items.spells.curseinfusion.inv_title=Curse an item
items.spells.curseinfusion.desc=This spell infuses a piece of equipment with the same powerful malignant magic present within DM-300. The item it is used on will immediately be cursed, and any enchantment or glyph it may have had will be overridden.\n\nIn the case of weapons, armor, and wands, the item will gain upgrades in addition to being cursed. Curse infusion upgrades do not stack, and the upgrades are lost if the item becomes uncursed.\n\nMultiple curse infusions can also be used to change the curse on a weapon or armor. items.spells.curseinfusion.desc=This spell infuses a piece of equipment with the same powerful malignant magic present within DM-300. The item it is used on will immediately be cursed, and any enchantment or glyph it may have had will be overridden.\n\nIn the case of weapons, armor, and wands, the item will gain upgrades in addition to being cursed. Curse infusion upgrades do not stack, and the upgrades are lost if the item becomes uncursed.\n\nMultiple curse infusions can also be used to change the curse on a weapon or armor.
items.spells.featherfall.name=feather fall
items.spells.featherfall.light=You feel light as a feather!
items.spells.featherfall.desc=This spell manipulates gravity's effect on the caster, allowing them to fall great distances without harm for a short time. Each use of the spell will only provide enough protection for one chasm.
items.spells.featherfall$featherbuff.name=feather fall
items.spells.featherfall$featherbuff.desc=You are under the effects of a feather fall spell, allowing you to fall into a chasm without taking damage! This effect will expire when it is used, or after a bit of time passes.\n\nTurns remaining: %s.
items.spells.spell.ac_cast=CAST items.spells.spell.ac_cast=CAST
items.spells.spell.no_magic=You can't cast spells while magic immune. items.spells.spell.no_magic=You can't cast spells while magic immune.

View File

@@ -44,9 +44,9 @@ journal.document.alchemy_guide.weapons.body=Some of the lighter or more magical
journal.document.alchemy_guide.catalysts.title=Catalysts journal.document.alchemy_guide.catalysts.title=Catalysts
journal.document.alchemy_guide.catalysts.body=Catalysts are made by combining a scroll or potion with a single seed or runestone. If the pair of items match, the alchemical energy cost is removed.\n\nCatalysts are most useful as components in recipes covered in the next two pages, but also can be used in a pinch for a random effect. journal.document.alchemy_guide.catalysts.body=Catalysts are made by combining a scroll or potion with a single seed or runestone. If the pair of items match, the alchemical energy cost is removed.\n\nCatalysts are most useful as components in recipes covered in the next two pages, but also can be used in a pinch for a random effect.
journal.document.alchemy_guide.brews_elixirs.title=Brews and Elixirs journal.document.alchemy_guide.brews_elixirs.title=Brews and Elixirs
journal.document.alchemy_guide.brews_elixirs.body=Brews and elixirs are advanced potions which provide a variety of effects with a single use. journal.document.alchemy_guide.brews_elixirs.body=Brews and elixirs are advanced potions which provide a variety of effects, and usually have a single use.
journal.document.alchemy_guide.spells.title=Spells journal.document.alchemy_guide.spells.title=Spells
journal.document.alchemy_guide.spells.body=Spells are contained in crystals and provide a variety of effects with multiple uses. journal.document.alchemy_guide.spells.body=Spells are contained in crystals and provide a variety of effects, usually with multiple uses.
journal.document.intros.title=Region Introductions journal.document.intros.title=Region Introductions
journal.document.intros.dungeon.title=Dungeon journal.document.intros.dungeon.title=Dungeon

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -47,6 +47,17 @@ public class ShatteredPixelDungeon extends Game {
public ShatteredPixelDungeon( PlatformSupport platform ) { public ShatteredPixelDungeon( PlatformSupport platform ) {
super( sceneClass == null ? WelcomeScene.class : sceneClass, platform ); super( sceneClass == null ? WelcomeScene.class : sceneClass, platform );
//pre-v2.4.0
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfFeatherFall.class,
"com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall" );
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfFeatherFall.FeatherBuff.class,
"com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall$FeatherBuff" );
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.AquaBrew.class,
"com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast" );
//pre-v2.3.0 //pre-v2.3.0
com.watabou.utils.Bundle.addAlias( com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb.ConjuredBomb.class, com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb.ConjuredBomb.class,

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie;
import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat; import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.AquaBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew;
@@ -35,6 +36,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfArcaneArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfFeatherFall;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight;
@@ -43,11 +45,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotio
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning; import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift; import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap;
@@ -176,15 +176,15 @@ public abstract class Recipe {
new ArcaneResin.Recipe(), new ArcaneResin.Recipe(),
new BlizzardBrew.Recipe(), new BlizzardBrew.Recipe(),
new InfernalBrew.Recipe(), new InfernalBrew.Recipe(),
new AquaBrew.Recipe(),
new ShockingBrew.Recipe(), new ShockingBrew.Recipe(),
new ElixirOfDragonsBlood.Recipe(), new ElixirOfDragonsBlood.Recipe(),
new ElixirOfIcyTouch.Recipe(), new ElixirOfIcyTouch.Recipe(),
new ElixirOfToxicEssence.Recipe(), new ElixirOfToxicEssence.Recipe(),
new ElixirOfMight.Recipe(), new ElixirOfMight.Recipe(),
new ElixirOfFeatherFall.Recipe(),
new MagicalInfusion.Recipe(), new MagicalInfusion.Recipe(),
new AquaBlast.Recipe(),
new BeaconOfReturning.Recipe(), new BeaconOfReturning.Recipe(),
new FeatherFall.Recipe(),
new PhaseShift.Recipe(), new PhaseShift.Recipe(),
new Recycle.Recipe(), new Recycle.Recipe(),
new TelekineticGrab.Recipe(), new TelekineticGrab.Recipe(),

View File

@@ -156,7 +156,12 @@ public class Bag extends Item implements Iterable<Item> {
loading = true; loading = true;
for (Bundlable item : bundle.getCollection( ITEMS )) { for (Bundlable item : bundle.getCollection( ITEMS )) {
if (item != null) ((Item)item).collect( this ); if (item != null){
if (!((Item)item).collect( this )){
//force-add the item if necessary, such as if its item category changed after an update
items.add((Item) item);
}
}
} }
loading = false; loading = false;
} }

View File

@@ -19,34 +19,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
package com.shatteredpixel.shatteredpixeldungeon.items.spells; package com.shatteredpixel.shatteredpixeldungeon.items.potions.brews;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfStormClouds; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfStormClouds;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GeyserTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GeyserTrap;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class AquaBlast extends TargetedSpell { public class AquaBrew extends Brew {
{
image = ItemSpriteSheet.AQUA_BLAST;
usesTargeting = true;
}
@Override
protected void affectTarget(Ballistica bolt, Hero hero) {
int cell = bolt.collisionPos;
{
image = ItemSpriteSheet.BREW_AQUA;
}
@Override
public void shatter(int cell) {
GeyserTrap geyser = new GeyserTrap(); GeyserTrap geyser = new GeyserTrap();
geyser.pos = cell; geyser.pos = cell;
geyser.source = this; geyser.source = this;
if (bolt.path.size() > bolt.dist+1) {
geyser.centerKnockBackDirection = bolt.path.get(bolt.dist + 1); int userPos = curUser.pos;
Ballistica aim = new Ballistica(userPos, cell, Ballistica.STOP_TARGET);
if (aim.path.size() > aim.dist+1) {
geyser.centerKnockBackDirection = aim.path.get(aim.dist + 1);
} }
geyser.activate(); geyser.activate();
} }
@Override @Override
public int value() { public int value() {
return (int)(60 * (quantity/8f)); return (int)(60 * (quantity/8f));
@@ -56,18 +55,19 @@ public class AquaBlast extends TargetedSpell {
public int energyVal() { public int energyVal() {
return (int)(12 * (quantity/8f)); return (int)(12 * (quantity/8f));
} }
public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe {
{ {
inputs = new Class[]{PotionOfStormClouds.class}; inputs = new Class[]{PotionOfStormClouds.class};
inQuantity = new int[]{1}; inQuantity = new int[]{1};
cost = 11; cost = 11;
output = AquaBlast.class; output = AquaBrew.class;
outQuantity = 8; outQuantity = 8;
} }
} }
} }

View File

@@ -19,12 +19,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
package com.shatteredpixel.shatteredpixeldungeon.items.spells; package com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation;
@@ -33,36 +31,28 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Image; import com.watabou.noosa.Image;
import com.watabou.noosa.audio.Sample;
public class FeatherFall extends Spell { public class ElixirOfFeatherFall extends Elixir {
{ {
image = ItemSpriteSheet.FEATHER_FALL; image = ItemSpriteSheet.ELIXIR_FEATHER;
} }
@Override @Override
protected void onCast(Hero hero) { public void apply(Hero hero) {
Buff.append(hero, FeatherBuff.class, FeatherBuff.DURATION); Buff.append(hero, FeatherBuff.class, FeatherBuff.DURATION);
hero.sprite.operate(hero.pos);
Sample.INSTANCE.play(Assets.Sounds.READ ); hero.sprite.emitter().burst(Speck.factory(Speck.JET), 20);
hero.sprite.emitter().burst( Speck.factory( Speck.JET ), 20);
GLog.p(Messages.get(this, "light")); GLog.p(Messages.get(this, "light"));
detach( curUser.belongings.backpack );
updateQuickslot();
Invisibility.dispel();
hero.spendAndNext( 1f );
} }
public static class FeatherBuff extends FlavourBuff { public static class FeatherBuff extends FlavourBuff {
//does nothing, just waits to be triggered by chasm falling //does nothing, just waits to be triggered by chasm falling
{ {
type = buffType.POSITIVE; type = buffType.POSITIVE;
} }
public static final float DURATION = 30f; public static final float DURATION = 50f;
@Override @Override
public int icon() { public int icon() {
@@ -79,7 +69,7 @@ public class FeatherFall extends Spell {
return Math.max(0, (DURATION - visualcooldown()) / DURATION); return Math.max(0, (DURATION - visualcooldown()) / DURATION);
} }
} }
@Override @Override
public int value() { public int value() {
return (int)(60 * (quantity/2f)); return (int)(60 * (quantity/2f));
@@ -89,18 +79,19 @@ public class FeatherFall extends Spell {
public int energyVal() { public int energyVal() {
return (int)(12 * (quantity/2f)); return (int)(12 * (quantity/2f));
} }
public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe {
{ {
inputs = new Class[]{PotionOfLevitation.class}; inputs = new Class[]{PotionOfLevitation.class};
inQuantity = new int[]{1}; inQuantity = new int[]{1};
cost = 17; cost = 17;
output = FeatherFall.class; output = ElixirOfFeatherFall.class;
outQuantity = 2; outQuantity = 2;
} }
} }
} }

View File

@@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.effects.Effects; import com.shatteredpixel.shatteredpixeldungeon.effects.Effects;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Elastic; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Elastic;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
@@ -163,7 +162,7 @@ public class WandOfBlastWave extends DamageWand {
if (ch.isActive()) { if (ch.isActive()) {
Paralysis.prolong(ch, Paralysis.class, 1 + finalDist/2f); Paralysis.prolong(ch, Paralysis.class, 1 + finalDist/2f);
} else if (ch == Dungeon.hero){ } else if (ch == Dungeon.hero){
if (cause instanceof WandOfBlastWave || cause instanceof AquaBlast){ if (cause instanceof WandOfBlastWave){
Badges.validateDeathFromFriendlyMagic(); Badges.validateDeathFromFriendlyMagic();
} }
Dungeon.fail(cause); Dungeon.fail(cause);

View File

@@ -30,7 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfFeatherFall;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
@@ -130,7 +130,7 @@ public class Chasm implements Hero.Doom {
Hero hero = Dungeon.hero; Hero hero = Dungeon.hero;
FeatherFall.FeatherBuff b = hero.buff(FeatherFall.FeatherBuff.class); ElixirOfFeatherFall.FeatherBuff b = hero.buff(ElixirOfFeatherFall.FeatherBuff.class);
if (b != null){ if (b != null){
hero.sprite.emitter().burst( Speck.factory( Speck.JET ), 20); hero.sprite.emitter().burst( Speck.factory( Speck.JET ), 20);

View File

@@ -592,6 +592,7 @@ public class ItemSpriteSheet {
public static final int BREW_BLIZZARD = BREWS+1; public static final int BREW_BLIZZARD = BREWS+1;
public static final int BREW_SHOCKING = BREWS+2; public static final int BREW_SHOCKING = BREWS+2;
public static final int BREW_CAUSTIC = BREWS+3; public static final int BREW_CAUSTIC = BREWS+3;
public static final int BREW_AQUA = BREWS+4;
private static final int ELIXIRS = xy(9, 25); //8 slots private static final int ELIXIRS = xy(9, 25); //8 slots
public static final int ELIXIR_HONEY = ELIXIRS+0; public static final int ELIXIR_HONEY = ELIXIRS+0;
@@ -601,9 +602,12 @@ public class ItemSpriteSheet {
public static final int ELIXIR_TOXIC = ELIXIRS+4; public static final int ELIXIR_TOXIC = ELIXIRS+4;
public static final int ELIXIR_ICY = ELIXIRS+5; public static final int ELIXIR_ICY = ELIXIRS+5;
public static final int ELIXIR_ARCANE = ELIXIRS+6; public static final int ELIXIR_ARCANE = ELIXIRS+6;
public static final int ELIXIR_FEATHER = ELIXIRS+7;
static{ static{
for (int i = BREWS; i < BREWS+16; i++) for (int i = BREWS; i < BREWS+16; i++)
assignItemRect(i, 12, 14); assignItemRect(i, 12, 14);
assignItemRect(BREW_AQUA, 9, 11);
} }
//16 free slots //16 free slots
@@ -615,9 +619,7 @@ public class ItemSpriteSheet {
public static final int WILD_ENERGY = SPELLS+3; public static final int WILD_ENERGY = SPELLS+3;
public static final int RETURN_BEACON = SPELLS+4; public static final int RETURN_BEACON = SPELLS+4;
public static final int SUMMON_ELE = SPELLS+5; public static final int SUMMON_ELE = SPELLS+5;
public static final int AQUA_BLAST = SPELLS+7;
public static final int FEATHER_FALL = SPELLS+8;
public static final int RECLAIM_TRAP = SPELLS+9; public static final int RECLAIM_TRAP = SPELLS+9;
public static final int CURSE_INFUSE = SPELLS+11; public static final int CURSE_INFUSE = SPELLS+11;
@@ -632,8 +634,6 @@ public class ItemSpriteSheet {
assignItemRect(RETURN_BEACON, 8, 16); assignItemRect(RETURN_BEACON, 8, 16);
assignItemRect(SUMMON_ELE, 8, 16); assignItemRect(SUMMON_ELE, 8, 16);
assignItemRect(AQUA_BLAST, 11, 11);
assignItemRect(FEATHER_FALL, 11, 11);
assignItemRect(RECLAIM_TRAP, 11, 11); assignItemRect(RECLAIM_TRAP, 11, 11);
assignItemRect(CURSE_INFUSE, 10, 15); assignItemRect(CURSE_INFUSE, 10, 15);

View File

@@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty;
import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat; import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.AquaBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew;
@@ -44,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfArcaneArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfFeatherFall;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight;
@@ -52,11 +54,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotio
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning; import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift; import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap;
@@ -364,15 +364,16 @@ public class QuickRecipe extends Component {
result.add(new QuickRecipe(new CausticBrew.Recipe())); result.add(new QuickRecipe(new CausticBrew.Recipe()));
result.add(new QuickRecipe(new BlizzardBrew.Recipe())); result.add(new QuickRecipe(new BlizzardBrew.Recipe()));
result.add(new QuickRecipe(new InfernalBrew.Recipe())); result.add(new QuickRecipe(new InfernalBrew.Recipe()));
result.add(new QuickRecipe(new AquaBrew.Recipe()));
result.add(new QuickRecipe(new ShockingBrew.Recipe())); result.add(new QuickRecipe(new ShockingBrew.Recipe()));
result.add(null); result.add(null);
result.add(null);
result.add(new QuickRecipe(new ElixirOfHoneyedHealing.Recipe())); result.add(new QuickRecipe(new ElixirOfHoneyedHealing.Recipe()));
result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe())); result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe()));
result.add(new QuickRecipe(new ElixirOfMight.Recipe())); result.add(new QuickRecipe(new ElixirOfMight.Recipe()));
result.add(new QuickRecipe(new ElixirOfDragonsBlood.Recipe())); result.add(new QuickRecipe(new ElixirOfDragonsBlood.Recipe()));
result.add(new QuickRecipe(new ElixirOfIcyTouch.Recipe())); result.add(new QuickRecipe(new ElixirOfIcyTouch.Recipe()));
result.add(new QuickRecipe(new ElixirOfToxicEssence.Recipe())); result.add(new QuickRecipe(new ElixirOfToxicEssence.Recipe()));
result.add(new QuickRecipe(new ElixirOfFeatherFall.Recipe()));
result.add(new QuickRecipe(new ElixirOfArcaneArmor.Recipe())); result.add(new QuickRecipe(new ElixirOfArcaneArmor.Recipe()));
return result; return result;
case 9: case 9:
@@ -382,9 +383,7 @@ public class QuickRecipe extends Component {
result.add(new QuickRecipe(new BeaconOfReturning.Recipe())); result.add(new QuickRecipe(new BeaconOfReturning.Recipe()));
result.add(new QuickRecipe(new SummonElemental.Recipe())); result.add(new QuickRecipe(new SummonElemental.Recipe()));
result.add(null); result.add(null);
result.add(new QuickRecipe(new AquaBlast.Recipe()));
result.add(new QuickRecipe(new ReclaimTrap.Recipe())); result.add(new QuickRecipe(new ReclaimTrap.Recipe()));
result.add(new QuickRecipe(new FeatherFall.Recipe()));
result.add(null); result.add(null);
result.add(new QuickRecipe(new Alchemize.Recipe(), new ArrayList<>(Arrays.asList(new Plant.Seed.PlaceHolder(), new Runestone.PlaceHolder())), new Alchemize().quantity(8))); result.add(new QuickRecipe(new Alchemize.Recipe(), new ArrayList<>(Arrays.asList(new Plant.Seed.PlaceHolder(), new Runestone.PlaceHolder())), new Alchemize().quantity(8)));
result.add(new QuickRecipe(new MagicalInfusion.Recipe())); result.add(new QuickRecipe(new MagicalInfusion.Recipe()));

View File

@@ -473,10 +473,10 @@ public class v1_X_Changes {
"_-_ Released March 23rd, 2022\n" + "_-_ Released March 23rd, 2022\n" +
"_-_ 103 days after Shattered v1.1.0\n\n" + "_-_ 103 days after Shattered v1.1.0\n\n" +
"v1.2.0 focused on a number of improvements to try and make Shattered play just as well for desktop users as it does for phone users. While these changes weren't perfect right at launch, they played a major role in making Shattered feel like more than a mobile port and helped it have a successful launch on Steam.\n" + "v1.2.0 focused on a number of improvements to try and make Shattered play just as well for desktop users as it does for phone users. While these changes weren't perfect right at launch, they played a major role in making Shattered feel like more than a mobile port and helped it have a successful launch on Steam.\n" +
"\n" + "\n" +
"One big change for desktop users that's external to the game itself was native executables. Previously Shattered's desktop version required a separate installation of Java to run. After v1.2.0, I started making versions of Shattered with built-in Java instead. This meant that most users could just download the game and run it, much nicer.\n" + "One big change for desktop users that's external to the game itself was native executables. Previously Shattered's desktop version required a separate installation of Java to run. After v1.2.0, I started making versions of Shattered with built-in Java instead. This meant that most users could just download the game and run it, much nicer.\n" +
"\n" + "\n" +
"v1.2.0 also included a variety of little additions and tweaks. Most of them are self-explanatory, but the badge additions in particular were timed with the game's release on Steam so they could tie into steamworks achievements and give newer players a little more to do.")); "v1.2.0 also included a variety of little additions and tweaks. Most of them are self-explanatory, but the badge additions in particular were timed with the game's release on Steam so they could tie into steamworks achievements and give newer players a little more to do."));
changes.addButton( new ChangeButton(Icons.get(Icons.DISPLAY_LAND), "Desktop Enhancements and Steam Release!", changes.addButton( new ChangeButton(Icons.get(Icons.DISPLAY_LAND), "Desktop Enhancements and Steam Release!",
"_Shattered Pixel Dungeon has received a bunch of new features in preparation for its release on Steam!_\n\n" + "_Shattered Pixel Dungeon has received a bunch of new features in preparation for its release on Steam!_\n\n" +
@@ -583,7 +583,7 @@ public class v1_X_Changes {
"_- Summon Elemental_ energy cost down to 6 from 8\n" + "_- Summon Elemental_ energy cost down to 6 from 8\n" +
"_- Alchemize_ energy cost down to 2 from 3")); "_- Alchemize_ energy cost down to 2 from 3"));
changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.AQUA_BLAST), "Alchemy Buffs", changes.addButton( new ChangeButton(new ItemSprite(ItemSpriteSheet.ENERGY), "Alchemy Buffs",
"Several recipes have also been buffed, in addition to the cost reductions:\n\n" + "Several recipes have also been buffed, in addition to the cost reductions:\n\n" +
"_- Scroll of Foresight_ duration up to 400 from 250\n" + "_- Scroll of Foresight_ duration up to 400 from 250\n" +
"_- Scroll of Dread_ now grants 1/2 exp for defeated enemies\n" + "_- Scroll of Dread_ now grants 1/2 exp for defeated enemies\n" +