From 520257ea1f458576afd0ab9cc06b3cce9dc1ae5c Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 22 Aug 2018 20:54:33 -0400 Subject: [PATCH] v0.7.0: lots of implementation: - refined 12 brews/elixirs - nerfed earth imbue effect - bees now attack eachother --- core/src/main/assets/items.png | Bin 17262 -> 17194 bytes .../actors/blobs/Blizzard.java | 75 +++++++++++++++ .../actors/blobs/Fire.java | 6 +- .../actors/blobs/Freezing.java | 35 ++++--- .../actors/blobs/Inferno.java | 91 ++++++++++++++++++ .../actors/buffs/EarthImbue.java | 9 +- .../actors/mobs/Bee.java | 23 ++++- .../shatteredpixeldungeon/effects/Speck.java | 76 +++++++++------ .../shatteredpixeldungeon/items/Honeypot.java | 2 +- .../items/bombs/Bomb.java | 17 ++++ .../items/potions/Potion.java | 2 +- .../items/potions/brews/BlizzardBrew.java | 17 +++- .../items/potions/brews/FrostfireBrew.java | 2 +- .../items/potions/brews/InfernalBrew.java | 18 +++- .../items/potions/brews/ShockingBrew.java | 2 +- .../potions/elixirs/ElixirOfDragonsBlood.java | 2 +- .../potions/elixirs/ElixirOfEarthenPower.java | 2 +- .../elixirs/ElixirOfHoneyedHealing.java | 12 +-- .../potions/elixirs/ElixirOfRestoration.java | 2 +- .../potions/elixirs/ElixirOfToxicEssence.java | 2 +- .../sprites/ItemSpriteSheet.java | 2 +- .../messages/actors/actors.properties | 7 +- .../messages/items/items.properties | 24 ++--- 23 files changed, 339 insertions(+), 89 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Blizzard.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Inferno.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index c56fab6b233327da1db87820515ebcb60838cec2..40be4d588ef848ebcf0e631c33890b04a662cdce 100644 GIT binary patch literal 17194 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 G@&5r9oz3?E literal 17262 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 + */ + +package com.shatteredpixel.shatteredpixeldungeon.actors.blobs; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; + +public class Blizzard extends Blob { + + @Override + protected void evolve() { + super.evolve(); + + int cell; + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + Freezing freeze = (Freezing)Dungeon.level.blobs.get( Freezing.class ); + + Inferno inf = (Inferno)Dungeon.level.blobs.get( Inferno.class ); + + for (int i = area.left; i < area.right; i++) { + for (int j = area.top; j < area.bottom; j++) { + cell = i + j * Dungeon.level.width(); + if (cur[cell] > 0) { + + if (fire != null) fire.clear(cell); + if (freeze != null) freeze.clear(cell); + + if (inf != null && inf.volume > 0 && inf.cur[cell] > 0){ + inf.clear(cell); + off[cell] = cur[cell] = 0; + continue; + } + + Freezing.freeze(cell); + + } + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.pour( Speck.factory( Speck.BLIZZARD ), 0.2f ); + } + + @Override + public String tileDesc() { + return Messages.get(this, "desc"); + } + + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Fire.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Fire.java index d643e5d98..a3c06b43a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Fire.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Fire.java @@ -96,9 +96,9 @@ public class Fire extends Blob { } } - private void burn( int pos ) { + public static void burn( int pos ) { Char ch = Actor.findChar( pos ); - if (ch != null && !ch.isImmune(this.getClass())) { + if (ch != null && !ch.isImmune(Fire.class)) { Buff.affect( ch, Burning.class ).reignite( ch ); } @@ -116,7 +116,7 @@ public class Fire extends Blob { @Override public void use( BlobEmitter emitter ) { super.use( emitter ); - emitter.start( FlameParticle.FACTORY, 0.03f, 0 ); + emitter.pour( FlameParticle.FACTORY, 0.03f ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Freezing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Freezing.java index bb08d43c3..b93b5c175 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Freezing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Freezing.java @@ -39,7 +39,6 @@ public class Freezing extends Blob { @Override protected void evolve() { - boolean[] water = Dungeon.level.water; int cell; Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); @@ -55,21 +54,7 @@ public class Freezing extends Blob { continue; } - Char ch = Actor.findChar( cell ); - if (ch != null && !ch.isImmune(this.getClass())) { - if (ch.buff(Frost.class) != null){ - Buff.affect(ch, Frost.class, 2f); - } else { - Buff.affect(ch, Chill.class, water[cell] ? 5f : 3f); - Chill chill = ch.buff(Chill.class); - if (chill != null && chill.cooldown() >= 10f){ - Buff.affect(ch, Frost.class, 5f); - } - } - } - - Heap heap = Dungeon.level.heaps.get( cell ); - if (heap != null) heap.freeze(); + Freezing.freeze(cell); off[cell] = cur[cell] - 1; volume += off[cell]; @@ -80,6 +65,24 @@ public class Freezing extends Blob { } } + public static void freeze( int cell ){ + Char ch = Actor.findChar( cell ); + if (ch != null && !ch.isImmune(Freezing.class)) { + if (ch.buff(Frost.class) != null){ + Buff.affect(ch, Frost.class, 2f); + } else { + Buff.affect(ch, Chill.class, Dungeon.level.water[cell] ? 5f : 3f); + Chill chill = ch.buff(Chill.class); + if (chill != null && chill.cooldown() >= 10f){ + Buff.affect(ch, Frost.class, 5f); + } + } + } + + Heap heap = Dungeon.level.heaps.get( cell ); + if (heap != null) heap.freeze(); + } + @Override public void use( BlobEmitter emitter ) { super.use( emitter ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Inferno.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Inferno.java new file mode 100644 index 000000000..8b1c76afb --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Inferno.java @@ -0,0 +1,91 @@ +/* + * 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.blobs; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; + +public class Inferno extends Blob { + + @Override + protected void evolve() { + super.evolve(); + + int cell; + boolean observe = false; + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + Freezing freeze = (Freezing)Dungeon.level.blobs.get( Freezing.class ); + + Blizzard bliz = (Blizzard)Dungeon.level.blobs.get( Blizzard.class ); + + for (int i = area.left-1; i <= area.right; i++) { + for (int j = area.top-1; j <= area.bottom; j++) { + cell = i + j * Dungeon.level.width(); + if (cur[cell] > 0) { + + if (fire != null) fire.clear(cell); + if (freeze != null) freeze.clear(cell); + + if (bliz != null && bliz.volume > 0 && bliz.cur[cell] > 0){ + bliz.clear(cell); + off[cell] = cur[cell] = 0; + continue; + } + + Fire.burn(cell); + + } else if (Dungeon.level.flamable[cell] + && (cur[cell-1] > 0 + || cur[cell+1] > 0 + || cur[cell-Dungeon.level.width()] > 0 + || cur[cell+Dungeon.level.width()] > 0)) { + Fire.burn(cell); + Dungeon.level.destroy( cell ); + + observe = true; + GameScene.updateMap( cell ); + } + } + } + + if (observe) { + Dungeon.observe(); + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.pour( Speck.factory( Speck.INFERNO ), 0.2f ); + } + + @Override + public String tileDesc() { + return Messages.get(this, "desc"); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/EarthImbue.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/EarthImbue.java index dd885fc0c..c68651d4e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/EarthImbue.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/EarthImbue.java @@ -38,7 +38,7 @@ public class EarthImbue extends FlavourBuff { public static final float DURATION = 30f; public void proc(Char enemy){ - Buff.affect(enemy, Roots.class, 2); + Buff.affect(enemy, Cripple.class, 2); CellEmitter.bottom(enemy.pos).start(EarthParticle.FACTORY, 0.05f, 8); } @@ -61,10 +61,5 @@ public class EarthImbue extends FlavourBuff { public String desc() { return Messages.get(this, "desc", dispTurns()); } - - { - immunities.add( Paralysis.class ); - immunities.add( Roots.class ); - immunities.add( Slow.class ); - } + } \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java index c85a0e299..de30e38ab 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Bee.java @@ -25,13 +25,16 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.BeeSprite; import com.watabou.utils.Bundle; import com.watabou.utils.Random; import java.util.HashSet; +//FIXME the AI for these things is becoming a complete mess, should refactor public class Bee extends Mob { { @@ -55,6 +58,7 @@ public class Bee extends Mob { private static final String LEVEL = "level"; private static final String POTPOS = "potpos"; private static final String POTHOLDER = "potholder"; + private static final String ALIGMNENT = "alignment"; @Override public void storeInBundle( Bundle bundle ) { @@ -62,6 +66,7 @@ public class Bee extends Mob { bundle.put( LEVEL, level ); bundle.put( POTPOS, potPos ); bundle.put( POTHOLDER, potHolder ); + bundle.put( ALIGMNENT, alignment); } @Override @@ -70,6 +75,7 @@ public class Bee extends Mob { spawn( bundle.getInt( LEVEL ) ); potPos = bundle.getInt( POTPOS ); potHolder = bundle.getInt( POTHOLDER ); + if (bundle.contains(ALIGMNENT)) alignment = bundle.getEnum( ALIGMNENT, Alignment.class); } public void spawn( int level ) { @@ -109,7 +115,7 @@ public class Bee extends Mob { @Override protected Char chooseEnemy() { //if the pot is no longer present, default to regular AI behaviour - if (potHolder == -1 && potPos == -1) + if (alignment == Alignment.ALLY || (potHolder == -1 && potPos == -1)) return super.chooseEnemy(); //if something is holding the pot, target that @@ -127,7 +133,7 @@ public class Bee extends Mob { //find all mobs near the pot HashSet enemies = new HashSet<>(); for (Mob mob : Dungeon.level.mobs) { - if (!(mob instanceof Bee) + if (!(mob == this) && Dungeon.level.distance(mob.pos, potPos) <= 3 && mob.alignment != Alignment.NEUTRAL && !(alignment == Alignment.ALLY && mob.alignment == Alignment.ALLY)) { @@ -155,13 +161,24 @@ public class Bee extends Mob { @Override protected boolean getCloser(int target) { - if (enemy != null && Actor.findById(potHolder) == enemy) { + if (alignment == Alignment.ALLY && enemy == null && buff(Corruption.class) == null){ + target = Dungeon.hero.pos; + } else if (enemy != null && Actor.findById(potHolder) == enemy) { target = enemy.pos; } else if (potPos != -1 && (state == WANDERING || Dungeon.level.distance(target, potPos) > 3)) this.target = target = potPos; return super.getCloser( target ); } + @Override + public String description() { + if (alignment == Alignment.ALLY && buff(Corruption.class) == null){ + return Messages.get(this, "desc_honey"); + } else { + return super.description(); + } + } + { immunities.add( Poison.class ); immunities.add( Amok.class ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java index 13f362193..eefffa076 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/Speck.java @@ -35,39 +35,41 @@ import com.watabou.utils.Random; public class Speck extends Image { - public static final int HEALING = 0; - public static final int STAR = 1; - public static final int LIGHT = 2; - public static final int QUESTION = 3; - public static final int UP = 4; - public static final int SCREAM = 5; - public static final int BONE = 6; - public static final int WOOL = 7; - public static final int ROCK = 8; - public static final int NOTE = 9; - public static final int CHANGE = 10; - public static final int HEART = 11; - public static final int BUBBLE = 12; - public static final int STEAM = 13; - public static final int COIN = 14; + public static final int HEALING = 0; + public static final int STAR = 1; + public static final int LIGHT = 2; + public static final int QUESTION = 3; + public static final int UP = 4; + public static final int SCREAM = 5; + public static final int BONE = 6; + public static final int WOOL = 7; + public static final int ROCK = 8; + public static final int NOTE = 9; + public static final int CHANGE = 10; + public static final int HEART = 11; + public static final int BUBBLE = 12; + public static final int STEAM = 13; + public static final int COIN = 14; - public static final int DISCOVER = 101; - public static final int EVOKE = 102; - public static final int MASTERY = 103; - public static final int KIT = 104; - public static final int RATTLE = 105; - public static final int JET = 106; - public static final int TOXIC = 107; + public static final int DISCOVER = 101; + public static final int EVOKE = 102; + public static final int MASTERY = 103; + public static final int KIT = 104; + public static final int RATTLE = 105; + public static final int JET = 106; + public static final int TOXIC = 107; public static final int CORROSION = 108; - public static final int PARALYSIS = 109; - public static final int DUST = 110; + public static final int PARALYSIS = 109; + public static final int DUST = 110; public static final int STENCH = 111; - public static final int FORGE = 112; - public static final int CONFUSION = 113; + public static final int FORGE = 112; + public static final int CONFUSION = 113; public static final int RED_LIGHT = 114; public static final int CALM = 115; - public static final int SMOKE = 116; - public static final int STORM = 117; + public static final int SMOKE = 116; + public static final int STORM = 117; + public static final int INFERNO = 118; + public static final int BLIZZARD = 119; private static final int SIZE = 7; @@ -117,6 +119,8 @@ public class Speck extends Image { case STORM: case DUST: case SMOKE: + case BLIZZARD: + case INFERNO: frame( film.get( STEAM ) ); break; case CALM: @@ -325,6 +329,20 @@ public class Speck extends Image { lifespan = Random.Float( 1f, 3f ); break; + case INFERNO: + hardlight( 0xFF0000 ); + angularSpeed = Random.Float( -20, +20 ); + angle = Random.Float( 360 ); + lifespan = Random.Float( 1f, 3f ); + break; + + case BLIZZARD: + hardlight( 0xFFFFFF ); + angularSpeed = Random.Float( -20, +20 ); + angle = Random.Float( 360 ); + lifespan = Random.Float( 1f, 3f ); + break; + case SMOKE: hardlight( 0x000000 ); angularSpeed = 30; @@ -443,6 +461,8 @@ public class Speck extends Image { case PARALYSIS: case CONFUSION: case STORM: + case BLIZZARD: + case INFERNO: case DUST: am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 0.5f ); scale.set( 1 + p ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java index b5ec887f4..41c00439b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java @@ -195,7 +195,7 @@ public class Honeypot extends Item { return; Bee bee = (Bee)Actor.findById( myBee ); - if (bee != null) + if (bee != null && bee.alignment == Char.Alignment.ENEMY) bee.setPotInfo( cell, holder ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index 307b3bc99..0a124eccb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -311,6 +311,18 @@ public class Bomb extends Item { validIngredients.put(ScrollOfRage.class, Noisemaker.class); } + private static final HashMap, Integer> bombCosts = new HashMap<>(); + static { + bombCosts.put(Firebomb.class, 0); + bombCosts.put(FrostBomb.class, 0); + bombCosts.put(HealingBomb.class, 0); + bombCosts.put(Flashbang.class, 0); + bombCosts.put(ShockBomb.class, 0); + bombCosts.put(HolyBomb.class, 0); + bombCosts.put(WoollyBomb.class, 0); + bombCosts.put(Noisemaker.class, 0); + } + @Override public boolean testIngredients(ArrayList ingredients) { boolean seedOrStone = false; @@ -332,6 +344,11 @@ public class Bomb extends Item { @Override public int cost(ArrayList ingredients) { + for (Item i : ingredients){ + if (validIngredients.containsKey(i.getClass())){ + return (bombCosts.get(validIngredients.get(i.getClass()))); + } + } return 0; } 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 ddb347ecd..c42935a4a 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 @@ -389,7 +389,7 @@ public class Potion extends Item { } protected int splashColor(){ - return ItemSprite.pick( image, 8, 10 ); + return ItemSprite.pick( image, 5, 9 ); } protected void splash( int cell ) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java index 0f8d8a666..ea3daec84 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java @@ -21,9 +21,15 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.brews; +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blizzard; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.noosa.audio.Sample; public class BlizzardBrew extends Brew { @@ -33,7 +39,14 @@ public class BlizzardBrew extends Brew { @Override public void shatter(int cell) { - //TODO + if (Dungeon.level.heroFOV[cell]) { + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + } + + GameScene.add( Blob.seed( cell, 1000, Blizzard.class ) ); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { @@ -42,7 +55,7 @@ public class BlizzardBrew extends Brew { inputs = new Class[]{PotionOfSnapFreeze.class, PotionOfFrost.class}; inQuantity = new int[]{1, 1}; - cost = 1; + cost = 5; output = BlizzardBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java index f81678c36..3c12b6cee 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java @@ -75,7 +75,7 @@ public class FrostfireBrew extends Brew { inputs = new Class[]{PotionOfSnapFreeze.class, PotionOfLiquidFlame.class}; inQuantity = new int[]{1, 1}; - cost = 3; + cost = 5; output = FrostfireBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java index ff37991eb..396090106 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java @@ -21,9 +21,15 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.brews; +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Inferno; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDragonsBreath; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.noosa.audio.Sample; public class InfernalBrew extends Brew { @@ -33,7 +39,15 @@ public class InfernalBrew extends Brew { @Override public void shatter(int cell) { - //TODO + + if (Dungeon.level.heroFOV[cell]) { + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + } + + GameScene.add( Blob.seed( cell, 1000, Inferno.class ) ); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { @@ -42,7 +56,7 @@ public class InfernalBrew extends Brew { inputs = new Class[]{PotionOfDragonsBreath.class, PotionOfLiquidFlame.class}; inQuantity = new int[]{1, 1}; - cost = 1; + cost = 5; output = InfernalBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java index b52b25f2d..4f1484ce7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java @@ -60,7 +60,7 @@ public class ShockingBrew extends Brew { inputs = new Class[]{PotionOfParalyticGas.class, PotionOfStormClouds.class}; inQuantity = new int[]{1, 1}; - cost = 1; + cost = 5; output = ShockingBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java index 8e6aaa15d..e518d7473 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java @@ -56,7 +56,7 @@ public class ElixirOfDragonsBlood extends Elixir { inputs = new Class[]{PotionOfLiquidFlame.class, PotionOfPurity.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 4; output = ElixirOfDragonsBlood.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java index 346319c78..7949170ab 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java @@ -53,7 +53,7 @@ public class ElixirOfEarthenPower extends Elixir { inputs = new Class[]{PotionOfParalyticGas.class, PotionOfHaste.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 4; output = ElixirOfEarthenPower.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java index 805a60235..298d9e89d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java @@ -26,10 +26,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; 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.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; import com.shatteredpixel.shatteredpixeldungeon.items.Honeypot; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -57,10 +57,10 @@ public class ElixirOfHoneyedHealing extends Elixir { Char ch = Actor.findChar(cell); if (ch != null){ Buff.affect( ch, Healing.class ).setHeal((int)(0.8f*ch.HT + 14), 0.25f, 0); - if (ch.alignment != curUser.alignment){ - //TODO this is effectively a free kill against enemies, do we want that? - Buff.affect(ch, Charm.class, 999f).object = curUser.id(); - //TODO specific bee interactions? + if (ch instanceof Bee && ch.alignment != curUser.alignment){ + ch.alignment = Char.Alignment.ALLY; + ((Bee)ch).setPotInfo(-1, null); + } } } @@ -71,7 +71,7 @@ public class ElixirOfHoneyedHealing extends Elixir { inputs = new Class[]{PotionOfHealing.class, Honeypot.ShatteredPot.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 5; output = ElixirOfHoneyedHealing.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfRestoration.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfRestoration.java index 01ab73df6..190c7aa5f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfRestoration.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfRestoration.java @@ -46,7 +46,7 @@ public class ElixirOfRestoration extends Elixir { inputs = new Class[]{PotionOfHealing.class, PotionOfCleansing.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 1; output = ElixirOfRestoration.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java index ca7e3e602..c8afd80e4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java @@ -53,7 +53,7 @@ public class ElixirOfToxicEssence extends Elixir { inputs = new Class[]{PotionOfToxicGas.class, PotionOfPurity.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 4; output = ElixirOfToxicEssence.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index c5aa8922c..910aa9a7a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -575,7 +575,7 @@ public class ItemSpriteSheet { assignItemRect(PASTY, 16, 11); assignItemRect(PUMPKIN_PIE, 16, 12); assignItemRect(CANDY_CANE, 13, 16); - assignItemRect(FEAST, 16, 11); + assignItemRect(FEAST, 16, 12); assignItemRect(BLANDFRUIT, 9, 12); assignItemRect(BLAND_CHUNKS,14, 6); } diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties index ef268dcdf..268ea8e9b 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties @@ -1,4 +1,6 @@ ###blobs +actors.blobs.blizzard.desc=A blizzard is swirling here. + actors.blobs.confusiongas.desc=A cloud of confusion gas is swirling here. actors.blobs.electricity.desc=A field of electricity is sparking brightly here. @@ -12,6 +14,8 @@ actors.blobs.freezing.desc=The air is unnaturally frigid here. actors.blobs.goowarn.desc=Specks of dark energy are swarming here! +actors.blobs.inferno.desc=An inferno is raging here. + actors.blobs.paralyticgas.desc=A cloud of paralytic gas is swirling here. actors.blobs.smokescreen.desc=A cloud of thick black smoke is swirling here. @@ -125,7 +129,7 @@ actors.buffs.drowsy.name=Drowsy actors.buffs.drowsy.desc=A magical force is making it difficult to stay awake.\n\nThe hero can resist drowsiness by taking damage or by being at full health.\n\nAfter a few turns, the target will fall into a deep magical sleep. actors.buffs.earthimbue.name=Imbued with Earth -actors.buffs.earthimbue.desc=You are imbued with the power of earth!\n\nAll physical attacks will command roots to lock the enemy in place while the effect lasts.\n\nTurns of earth imbue remaining: %s. +actors.buffs.earthimbue.desc=You are imbued with the power of earth!\n\nAll physical attacks will shift the earth under the enemy, crippling them for a short time.\n\nTurns of earth imbue remaining: %s. actors.buffs.fireimbue.name=Imbued with Fire actors.buffs.fireimbue.desc=You are imbued with the power of fire!\n\nAll physical attacks will have a chance to light enemies ablaze. Additionally, you are completely immune to the effects of fire.\n\nTurns of fire imbue remaining: %s. @@ -426,6 +430,7 @@ actors.mobs.bat.def_verb=evaded actors.mobs.bat.desc=These brisk and tenacious inhabitants of cave domes may defeat much larger opponents by replenishing their health with each successful attack. actors.mobs.bee.name=golden bee +actors.mobs.bee.desc_honey=Despite their small size, golden bees tend to protect their home fiercely. This one has been placated, and seems to want to follow you. actors.mobs.bee.desc=Despite their small size, golden bees tend to protect their home fiercely. This one is very mad, better keep your distance. actors.mobs.brute.name=gnoll brute 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 b849783ff..5560b4fcf 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 @@ -555,43 +555,43 @@ items.potions.potionoftoxicgas.desc=Uncorking or shattering this pressurized gla ###brews items.potions.brews.blizzardbrew.name=blizzard brew -items.potions.brews.blizzardbrew.desc=TODO +items.potions.brews.blizzardbrew.desc=When shattered, this brew will unleash a swirling blizzard which spreads like a gas. items.potions.brews.frigidbrew.name=frigid brew -items.potions.brews.frigidbrew.desc=TODO +items.potions.brews.frigidbrew.desc=This brew combines the properties of a frost and storm clouds potion. When thrown it will erupt into a cloud which both freezes and spreads water to surrounding terrain. items.potions.brews.frostfirebrew.name=frostfire brew -items.potions.brews.frostfirebrew.desc=TODO +items.potions.brews.frostfirebrew.desc=This brew combines the properties of a liquid flame and snap freeze potion. The area around where the vial is thrown will be snap-frozen, then set ablaze for an extended duration. items.potions.brews.infernalbrew.name=infernal brew -items.potions.brews.infernalbrew.desc=TODO +items.potions.brews.infernalbrew.desc=When shattered, this brew will unleash a raging inferno which spreads like a gas. items.potions.brews.shockingbrew.name=shocking brew -items.potions.brews.shockingbrew.desc=TODO +items.potions.brews.shockingbrew.desc=When shattered, this brew will unleash an electrical storm in an area around the location it breaks at. items.potions.brews.wickedbrew.name=wicked brew -items.potions.brews.wickedbrew.desc=TODO +items.potions.brews.wickedbrew.desc=This brew combines the properties of a toxic gas and paralytic gas potion. When exposed to open air the liquid of the brew will erupt into both gasses at once. ###elixirs items.potions.elixirs.elixirofdragonsblood.name=elixir of dragon's blood -items.potions.elixirs.elixirofdragonsblood.desc=TODO +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.elixirofearthenpower.name=elixir of earthen power -items.potions.elixirs.elixirofearthenpower.desc=TODO +items.potions.elixirs.elixirofearthenpower.desc=When consumed, this elixir will allow the drinker to bend the earth around them to their will. Any physical attack the drinker makes will shift the earth under the target, slowing their movement speed. items.potions.elixirs.elixirofhoneyedhealing.name=elixir of honeyed healing -items.potions.elixirs.elixirofhoneyedhealing.desc=TODO +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.elixirofrestoration.name=elixir of restoration -items.potions.elixirs.elixirofrestoration.desc=TODO +items.potions.elixirs.elixirofrestoration.desc=This elixir combines the properties of a healing and cleansing potion. When consumed, the drinker will start to rapidly heal, and will be cleansed of all negative effects. items.potions.elixirs.elixirofsurgingvitality.name=elixir of surging vitality -items.potions.elixirs.elixirofsurgingvitality.desc=TODO +items.potions.elixirs.elixirofsurgingvitality.desc=This elixir combines the properties of a healing and shielding potion, granting a massive burst of survivability to whomever drinks it. items.potions.elixirs.elixiroftoxicessence.name=elixir of toxic essence -items.potions.elixirs.elixiroftoxicessence.desc=TODO +items.potions.elixirs.elixiroftoxicessence.desc=When consumed, this elixir will imbue the drinker with toxic energy. The drinker will be immune to toxic gas and poison, and will continuously spread toxic gas as they move.