diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 9584fdebd..f495e7101 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -17,27 +17,13 @@ */ package com.shatteredpixel.shatteredpixeldungeon.actors.hero; -import java.util.ArrayList; -import java.util.HashSet; - -import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions; -import com.shatteredpixel.shatteredpixeldungeon.Statistics; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; -import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; -import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; -import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; -import com.shatteredpixel.shatteredpixeldungeon.items.rings.*; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; -import com.watabou.noosa.Camera; -import com.watabou.noosa.Game; -import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; +import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; @@ -45,8 +31,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Combo; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Drowsy; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Fury; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; @@ -56,32 +44,45 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Regeneration; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.SnipersMark; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.CheckedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Amulet; import com.shatteredpixel.shatteredpixeldungeon.items.Ankh; -import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; import com.shatteredpixel.shatteredpixeldungeon.items.DewVial; +import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap.Type; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey; +import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key; import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey; -import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfHaste; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfMight; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfTenacity; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.features.AlchemyPot; @@ -100,9 +101,15 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.shatteredpixel.shatteredpixeldungeon.windows.WndResurrect; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; import com.watabou.utils.Random; +import java.util.ArrayList; +import java.util.HashSet; + public class Hero extends Char { private static final String TXT_LEAVE = "One does not simply leave Pixel Dungeon."; @@ -589,7 +596,7 @@ public class Hero extends Char { Item item = heap.pickUp(); if (item.doPickUp( this )) { - if (item instanceof Dewdrop) { + if (item instanceof Dewdrop || item instanceof TimekeepersHourglass.sandBag) { } else { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java new file mode 100644 index 000000000..6fd989860 --- /dev/null +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java @@ -0,0 +1,160 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; + +import java.util.ArrayList; + +/** + * Created by debenhame on 01/12/2014. + */ +public class TimekeepersHourglass extends Artifact { + //TODO: string, effect implementation. + + { + name = "timekeeper's hourglass"; + image = 0; + + level = 0; + levelCap = 5; + charge = 5+level; + chargeCap = 5+level; + defaultAction = AC_ACTIVATE; + } + + public static final String AC_ACTIVATE = "ACTIVATE"; + + //keeps track of generated sandbags. + public int sandBags = 0; + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (isEquipped( hero ) && charge > 0) + actions.add(AC_ACTIVATE); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals(AC_ACTIVATE)){ + //todo: add logic here + } else + super.execute(hero, action); + } + + @Override + protected ArtifactBuff passiveBuff() { + return new hourglassRecharge(); + } + + @Override + public Item upgrade() { + chargeCap++; + + //for artifact transmutation. + while (level+1 > sandBags) + sandBags ++; + + return super.upgrade(); + } + + @Override + public String desc() { + return ""; + } + + //needs to bundle chargecap as it is dynamic. + private static final String CHARGECAP = "chargecap"; + private static final String SANDBAGS = "sandbags"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle(bundle); + bundle.put( CHARGECAP, chargeCap ); + bundle.put( SANDBAGS, sandBags ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + chargeCap = bundle.getInt( CHARGECAP ); + sandBags = bundle.getInt( SANDBAGS ); + } + + public class hourglassRecharge extends ArtifactBuff { + @Override + public boolean act() { + if (charge < chargeCap) { + partialCharge += 1 / (40f - (chargeCap - charge)*3f); + + if (partialCharge >= 1) { + partialCharge --; + charge ++; + + if (charge == chargeCap){ + partialCharge = 0; + } + } + } + + QuickSlot.refresh(); + + spend( TICK ); + + return true; + } + } + + public class timeStasis extends ArtifactBuff { + //todo: add logic here + } + + public class timeFreeze extends ArtifactBuff { + //todo: add logic here + } + + public static class sandBag extends Item { + + { + name = "bag of magic sand"; + image = 0; + } + + @Override + public boolean doPickUp( Hero hero ) { + TimekeepersHourglass hourglass = hero.belongings.getItem( TimekeepersHourglass.class ); + if (hourglass != null) { + hourglass.upgrade(); + Sample.INSTANCE.play( Assets.SND_ITEM ); + if (hourglass.level == hourglass.levelCap) + GLog.p("Your hourglass is filled with magical sand!"); + else + GLog.i("you add the sand to your hourglass."); + hero.spendAndNext(TIME_TO_PICK_UP); + return true; + } else { + GLog.w("You have no hourglass to place this sand into."); + return false; + } + } + + @Override + public String desc(){ + return "This small bag of finely ground sand should work perfectly with your hourglass.\n\n" + + "It seems odd that the shopkeeper would have this specific item right when you need it."; + } + + @Override + public int price() { + return 20; + } + } + + +} diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/levels/painters/ShopPainter.java b/src/com/shatteredpixel/shatteredpixeldungeon/levels/painters/ShopPainter.java index 3df6a3d42..e9f3a7d4d 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/levels/painters/ShopPainter.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/levels/painters/ShopPainter.java @@ -17,8 +17,6 @@ */ package com.shatteredpixel.shatteredpixeldungeon.levels.painters; -import java.util.ArrayList; - import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.ImpShopkeeper; @@ -29,7 +27,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Torch; import com.shatteredpixel.shatteredpixeldungeon.items.Weightstone; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.*; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.LeatherArmor; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.MailArmor; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.PlateArmor; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.ScaleArmor; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.bags.ScrollHolder; import com.shatteredpixel.shatteredpixeldungeon.items.bags.SeedPouch; import com.shatteredpixel.shatteredpixeldungeon.items.bags.WandHolster; @@ -38,7 +40,14 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.*; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Glaive; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Longsword; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Mace; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Quarterstaff; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Spear; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sword; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer; import com.shatteredpixel.shatteredpixeldungeon.levels.LastShopLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Room; @@ -46,6 +55,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.watabou.utils.Point; import com.watabou.utils.Random; +import java.util.ArrayList; + public class ShopPainter extends Painter { private static int pasWidth; @@ -144,6 +155,28 @@ public class ShopPainter extends Painter { items.add( new OverpricedRation() ); items.add( new Ankh() ); + + TimekeepersHourglass hourglass = Dungeon.hero.belongings.getItem(TimekeepersHourglass.class); + + if (hourglass != null){ + int bags = 0; + switch (Dungeon.depth) { + case 21: + bags = (int)Math.ceil(( 5-hourglass.sandBags) * 0.80f ); break; + case 16: + bags = (int)Math.ceil(( 5-hourglass.sandBags) * 0.50f ); break; + case 11: + bags = (int)Math.ceil(( 5-hourglass.sandBags) * 0.25f ); break; + case 6: + bags = (int)Math.ceil(( 5-hourglass.sandBags) * 0.20f ); break; + } + + + for(int i = 1; i <= bags; i++){ + items.add( new TimekeepersHourglass.sandBag()); + hourglass.sandBags ++; + } + } Item[] range =items.toArray( new Item[0] ); Random.shuffle( range );