From c3cba0f046d0d322a971f84faa1887f200508432 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 20 May 2015 02:02:37 -0400 Subject: [PATCH] v0.3.0: reworked wand of regrowth, some polish needed though --- assets/plants.png | Bin 5135 -> 5787 bytes .../shatteredpixeldungeon/actors/Char.java | 5 +- .../actors/blobs/Regrowth.java | 4 +- .../actors/buffs/Bless.java | 22 ++ .../actors/hero/Hero.java | 6 +- .../items/wands/WandOfRegrowth.java | 232 ++++++++++++++++-- .../plants/Starflower.java | 53 ++++ 7 files changed, 289 insertions(+), 33 deletions(-) create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bless.java create mode 100644 src/com/shatteredpixel/shatteredpixeldungeon/plants/Starflower.java diff --git a/assets/plants.png b/assets/plants.png index 96a503a745b32478c6fbe4b922faf6c4440159e3..1ee5e60574bf8281bf59e61d71b3ba3c61b67d13 100644 GIT binary patch delta 5776 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 defRoll; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Regrowth.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Regrowth.java index f265108ce..e009d3140 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Regrowth.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/Regrowth.java @@ -46,7 +46,7 @@ public class Regrowth extends Blob { Level.set( i, cur[i] > 9 ? Terrain.HIGH_GRASS : Terrain.GRASS ); mapUpdated = true; - } else if (c == Terrain.GRASS && cur[i] > 9) { + } else if (c == Terrain.GRASS && cur[i] > 9 && Dungeon.level.plants.get(i) == null ) { Level.set( i, Terrain.HIGH_GRASS ); mapUpdated = true; @@ -54,7 +54,7 @@ public class Regrowth extends Blob { } Char ch = Actor.findChar( i ); - if (ch != null) { + if (ch != null && cur[i] > 1) { Buff.prolong( ch, Roots.class, TICK ); } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bless.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bless.java new file mode 100644 index 000000000..44cd8e6ed --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Bless.java @@ -0,0 +1,22 @@ +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; + +/** + * Created by debenhame on 27/04/2015. + */ +public class Bless extends FlavourBuff { + + @Override + public int icon() { + //TODO: add icon + return BuffIndicator.FIRE; + } + + @Override + public String toString() { + return "Blessed"; + } + +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 63db3c9fe..b2ef41719 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; @@ -1117,12 +1118,11 @@ public class Hero extends Char { defenseSkill++; } else { - //TODO: add blessed buff here - + Buff.prolong(this, Bless.class, 30f); this.exp = 0; GLog.p( "You cannot grow stronger, but your experiences do give you a surge of power!" ); - //TODO: holy SFX + Sample.INSTANCE.play( Assets.SND_LEVELUP ); } if (lvl < 10) { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java index be82b5514..60d09a4ca 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfRegrowth.java @@ -19,7 +19,11 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.plants.Starflower; import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -36,41 +40,127 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.utils.Callback; import com.watabou.utils.Random; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; + +//TODO: finish visuals & polish public class WandOfRegrowth extends Wand { { name = "Wand of Regrowth"; image = ItemSpriteSheet.WAND_REGROWTH; + + collisionProperties = Ballistica.STOP_TERRAIN; } + + private HashSet affectedCells; + private int direction = 0; @Override protected void onZap( Ballistica bolt ) { - - for (int i : bolt.subPath(1, bolt.dist)) { - int c = Dungeon.level.map[i]; - if (c == Terrain.EMPTY || - c == Terrain.EMBERS || - c == Terrain.EMPTY_DECO) { - - Level.set( i, Terrain.GRASS ); - + + affectedCells = new HashSet<>(); + + int maxDist = Math.round(1.2f + chargesPerCast()*.8f); + int dist = Math.min(bolt.dist, maxDist); + + for (int i = 0; i < Level.NEIGHBOURS8.length; i++){ + if (bolt.sourcePos+Level.NEIGHBOURS8[i] == bolt.path.get(1)){ + direction = i; + break; } } - - int c = Dungeon.level.map[bolt.collisionPos]; - if (c == Terrain.EMPTY || - c == Terrain.EMBERS || - c == Terrain.EMPTY_DECO || - c == Terrain.GRASS || - c == Terrain.HIGH_GRASS) { - - GameScene.add( Blob.seed( bolt.collisionPos, (level() + 2) * 20, Regrowth.class ) ); - - } else { - - GLog.i( "nothing happened" ); - + + float strength = maxDist; + for (int c : bolt.subPath(1, dist)) { + strength--; //as we start at dist 1, not 0. + if (!Level.losBlocking[c]) { + affectedCells.add(c); + spreadRegrowth(c + Level.NEIGHBOURS8[left(direction)], strength - 1); + spreadRegrowth(c + Level.NEIGHBOURS8[direction], strength - 1); + spreadRegrowth(c + Level.NEIGHBOURS8[right(direction)], strength - 1); + } } + + //ignore tiles which can't have anything grow in them. + for (Iterator i = affectedCells.iterator(); i.hasNext();) { + int c = Dungeon.level.map[i.next()]; + if (!(c == Terrain.EMPTY || + c == Terrain.EMBERS || + c == Terrain.EMPTY_DECO || + c == Terrain.GRASS || + c == Terrain.HIGH_GRASS)) { + i.remove(); + } + } + + float numPlants, numDews, numPods, numStars; + + int chrgUsed = chargesPerCast(); + //numbers greater than n*100% means n garunteed plants, e.g. 210% = 2 plants w/10% chance for 3 plants. + numPlants = 0.2f + chrgUsed*chrgUsed*0.020f; //scales from 22% to 220% + numDews = 0.05f + chrgUsed*chrgUsed*0.016f; //scales from 6.6% to 165% + numPods = 0.02f + chrgUsed*chrgUsed*0.013f; //scales from 3.3% to 135% + numStars = (chrgUsed*chrgUsed*chrgUsed/5f)*0.005f; //scales from 0.1% to 100% + placePlants(numPlants, numDews, numPods, numStars); + + for (int i : affectedCells){ + int c = Dungeon.level.map[i]; + if (c == Terrain.EMPTY || + c == Terrain.EMBERS || + c == Terrain.EMPTY_DECO) { + Level.set( i, Terrain.GRASS ); + } + + GameScene.add( Blob.seed( i, 10, Regrowth.class ) ); + + } + } + + private void spreadRegrowth(int cell, float strength){ + if (strength >= 0 && Level.passable[cell] && !Level.losBlocking[cell]){ + affectedCells.add(cell); + if (strength >= 1.5f) { + spreadRegrowth(cell + Level.NEIGHBOURS8[left(direction)], strength - 1.5f); + spreadRegrowth(cell + Level.NEIGHBOURS8[direction], strength - 1.5f); + spreadRegrowth(cell + Level.NEIGHBOURS8[right(direction)], strength-1.5f); + } + } + } + + private void placePlants(float numPlants, float numDews, float numPods, float numStars){ + Iterator cells = affectedCells.iterator(); + Level floor = Dungeon.level; + + while(cells.hasNext() && Random.Float() <= numPlants){ + floor.plant((Plant.Seed) Generator.random(Generator.Category.SEED), cells.next()); + numPlants --; + } + + while (cells.hasNext() && Random.Float() <= numDews){ + floor.plant(new Dewcatcher.Seed(), cells.next()); + numDews --; + } + + while (cells.hasNext() && Random.Float() <= numPods){ + floor.plant(new Seedpod.Seed(), cells.next()); + numPods --; + } + + while (cells.hasNext() && Random.Float() <= numStars){ + floor.plant(new Starflower.Seed(), cells.next()); + numStars --; + } + + } + + private int left(int direction){ + return direction == 0 ? 7 : direction-1; + } + + private int right(int direction){ + return direction == 7 ? 0 : direction+1; } @Override @@ -90,13 +180,105 @@ public class WandOfRegrowth extends Wand { } protected void fx( Ballistica bolt, Callback callback ) { - MagicMissile.foliage( curUser.sprite.parent, bolt.sourcePos, bolt.collisionPos, callback ); + //TODO: proper effects Sample.INSTANCE.play( Assets.SND_ZAP ); + callback.call(); } - + + @Override + //consumes all available charges, needs at least one. + protected int chargesPerCast() { + return Math.max(1, curCharges); + } + @Override public String desc() { return "\"When life ceases new life always begins to grow... The eternal cycle always remains!\""; } + + + public static class Dewcatcher extends Plant{ + + { + image = 12; + plantName = "Dewcatcher"; + } + + @Override + public void activate(Char ch) { + super.activate( ch ); + + int nDrops = Random.NormalIntRange(2, 8); + + ArrayList candidates = new ArrayList(); + for (int i : Level.NEIGHBOURS8){ + if (Level.passable[pos+i]){ + candidates.add(pos+i); + } + } + + for (int i = 0; i < nDrops && !candidates.isEmpty(); i++){ + Integer c = Random.element(candidates); + Dungeon.level.drop(new Dewdrop(), c).sprite.drop(pos); + candidates.remove(c); + } + + } + + @Override + public String desc() { + return ""; + } + + //seed is never dropped, only care about plant class + public static class Seed extends Plant.Seed { + { + plantClass = Dewcatcher.class; + } + } + } + + public static class Seedpod extends Plant{ + + { + image = 13; + plantName = "Seed Pod"; + } + + @Override + public void activate(Char ch) { + super.activate( ch ); + + int nSeeds = Random.NormalIntRange(1, 5); + + ArrayList candidates = new ArrayList(); + for (int i : Level.NEIGHBOURS8){ + if (Level.passable[pos+i]){ + candidates.add(pos+i); + } + } + + for (int i = 0; i < nSeeds && !candidates.isEmpty(); i++){ + Integer c = Random.element(candidates); + Dungeon.level.drop(Generator.random(Generator.Category.SEED), c).sprite.drop(pos); + candidates.remove(c); + } + + } + + @Override + public String desc() { + return ""; + } + + //seed is never dropped, only care about plant class + public static class Seed extends Plant.Seed { + { + plantClass = Seedpod.class; + } + } + + } + } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/plants/Starflower.java b/src/com/shatteredpixel/shatteredpixeldungeon/plants/Starflower.java new file mode 100644 index 000000000..5b0df4545 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/plants/Starflower.java @@ -0,0 +1,53 @@ +package com.shatteredpixel.shatteredpixeldungeon.plants; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Starflower extends Plant{ + + private static final String TXT_DESC = "TODO"; + + { + image = 11; + plantName = "Starflower"; + } + + @Override + public void activate(Char ch){ + super.activate(ch); + + if (ch != null) Buff.prolong(ch, Bless.class, 30f); + + if ( Random.Int(1) == 0 ) { + Dungeon.level.drop(new Seed(),pos); + } + } + + @Override + public String desc(){ + return""; + } + + public static class Seed extends Plant.Seed{ + + { + plantName="Starflower"; + + name= "Seed of " + plantName; + image= ItemSpriteSheet.SEED_BLANDFRUIT; + + plantClass = Starflower.class; + alchemyClass = PotionOfExperience.class; + } + + @Override + public String desc() { + return""; + } + } +}