diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java index 44c0f560e..432ba7ce8 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java @@ -153,7 +153,6 @@ public class DM300 extends Mob { LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); if (beacon != null) { beacon.upgrade(); - GLog.p("Your beacon grows stronger!"); } yell( Messages.get(this, "defeated") ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java index 4cc04464a..eaa157507 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java @@ -160,7 +160,6 @@ public class King extends Mob { LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); if (beacon != null) { beacon.upgrade(); - GLog.p("Your beacon grows stronger!"); } yell( Messages.get(this, "defeated") ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java index e6d80f125..0726fe258 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java @@ -141,7 +141,6 @@ public class Tengu extends Mob { LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); if (beacon != null) { beacon.upgrade(); - GLog.p("Your beacon grows stronger!"); } yell( Messages.get(this, "defeated") ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java index 4bb9e995b..858d63e22 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.KindofMisc; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions; @@ -44,10 +45,6 @@ public class Artifact extends KindofMisc { private static final String TXT_TO_STRING_LVL = "%s%+d"; private static final String TXT_TO_STRING_LVL_CHARGE = "%s%+d (%d/%d)"; - private static final String TXT_UNEQUIP_TITLE = "Unequip one item"; - private static final String TXT_UNEQUIP_MESSAGE = - "You can only wear two misc items at a time."; - protected Buff passiveBuff; protected Buff activeBuff; @@ -87,7 +84,7 @@ public class Artifact extends KindofMisc { if ((hero.belongings.misc1 != null && hero.belongings.misc1.getClass() == this.getClass()) || (hero.belongings.misc2 != null && hero.belongings.misc2.getClass() == this.getClass())){ - GLog.w("you cannot wear two of the same artifact"); + GLog.w( Messages.get(Artifact.class, "cannot_wear_two") ); return false; } else if (hero.belongings.misc1 != null && hero.belongings.misc2 != null) { @@ -97,7 +94,8 @@ public class Artifact extends KindofMisc { final Artifact art = this; ShatteredPixelDungeon.scene().add( - new WndOptions(TXT_UNEQUIP_TITLE, TXT_UNEQUIP_MESSAGE, + new WndOptions(Messages.get(Artifact.class, "unequip_title"), + Messages.get(Artifact.class, "unequip_message"), Utils.capitalize(m1.toString()), Utils.capitalize(m2.toString())) { @@ -134,7 +132,7 @@ public class Artifact extends KindofMisc { identify(); if (cursed) { equipCursed( hero ); - GLog.n( "the " + this.name + " painfully binds itself to you" ); + GLog.n( Messages.get(Artifact.class, "cursed_worn") ); } hero.spendAndNext( TIME_TO_EQUIP ); @@ -200,7 +198,7 @@ public class Artifact extends KindofMisc { public String info() { if (cursed && cursedKnown && !isEquipped( Dungeon.hero )) { - return desc() + "\n\nYou can feel a malevolent magic lurking within the " + name() + "."; + return desc() + "\n\n" + Messages.get(Artifact.class, "curse_known"); } else { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CapeOfThorns.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CapeOfThorns.java index 2b65fba5b..ead270b8b 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CapeOfThorns.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CapeOfThorns.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -39,7 +40,7 @@ public class CapeOfThorns extends Artifact { chargeCap = 100; cooldown = 0; - defaultAction = "NONE"; + defaultAction = "NONE"; //so it can be quickslotted } @Override @@ -49,17 +50,13 @@ public class CapeOfThorns extends Artifact { @Override public String desc() { - String desc = "These collapsed sheets of metal from the DM-300 have formed together into a rigid wearable " + - "cape. The metal is old and coated in thick flakes of rust. It seems to store a deep energy, " + - "perhaps it has some of the DM-300's power?"; + String desc = Messages.get(this, "desc"); if (isEquipped( Dungeon.hero )) { desc += "\n\n"; if (cooldown == 0) - desc += "The cape feels reassuringly heavy on your shoulders. You're not sure if it will directly " + - "help you in a fight, but it seems to be gaining energy from the damage you take."; + desc += Messages.get(this, "desc_inactive"); else - desc += "The cape seems to be releasing some stored energy, " + - "it is radiating a protective power at all angles. "; + desc += Messages.get(this, "desc_active"); } return desc; @@ -73,7 +70,7 @@ public class CapeOfThorns extends Artifact { cooldown--; if (cooldown == 0) { BuffIndicator.refreshHero(); - GLog.w("Your Cape becomes inert again."); + GLog.w( Messages.get(this, "inert") ); } updateQuickslot(); } @@ -87,7 +84,7 @@ public class CapeOfThorns extends Artifact { if (charge >= chargeCap){ charge = 0; cooldown = 10+level(); - GLog.p("Your Cape begins radiating energy, you feel protected!"); + GLog.p( Messages.get(this, "radiating") ); BuffIndicator.refreshHero(); } } @@ -105,7 +102,7 @@ public class CapeOfThorns extends Artifact { if (exp >= (level()+1)*5 && level() < levelCap){ exp -= (level()+1)*5; upgrade(); - GLog.p("Your Cape grows stronger!"); + GLog.p( Messages.get(this, "levelup") ); } } @@ -115,17 +112,12 @@ public class CapeOfThorns extends Artifact { @Override public String toString() { - return "Thorns"; + return Messages.get(this, "name"); } @Override public String desc() { - return "Your cape is radiating energy, surrounding you in a field of deflective force!\n" + - "\n" + - "All damage you receive is reduced while the thorns effect is active. Additionally, " + - "if the attacker is next to you, the reduced amount is deflected back at the attacker.\n" + - "\n" + - "Your cape will continue radiating energy for " + dispTurns(cooldown) + "."; + return Messages.get(this, "desc", dispTurns(cooldown)); } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java index 28f227291..bbd4efb3e 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/ChaliceOfBlood.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -39,15 +40,6 @@ import java.util.ArrayList; public class ChaliceOfBlood extends Artifact { - private static final String TXT_CHALICE = "Chalice of Blood"; - private static final String TXT_YES = "Yes, I know what I'm doing"; - private static final String TXT_NO = "No, I changed my mind"; - private static final String TXT_PRICK = - "Each time you use the chalice it will drain more life energy, "+ - "if you are not careful this draining effect can easily kill you.\n\n"+ - "Are you sure you want to offer it more life energy?"; - - { image = ItemSpriteSheet.ARTIFACT_CHALICE1; @@ -74,7 +66,10 @@ public class ChaliceOfBlood extends Artifact { if (damage > hero.HP*0.75) { GameScene.show( - new WndOptions(TXT_CHALICE, TXT_PRICK, TXT_YES, TXT_NO) { + new WndOptions(Messages.get(this, "name"), + Messages.get(this, "prick_warn"), + Messages.get(this, "yes"), + Messages.get(this, "no")) { @Override protected void onSelect(int index) { if (index == 0) @@ -102,28 +97,19 @@ public class ChaliceOfBlood extends Artifact { hero.sprite.operate( hero.pos ); hero.busy(); hero.spend(3f); + GLog.w( Messages.get(this, "onprick") ); if (damage <= 0){ - GLog.i("You prick yourself, and your blood drips into the chalice."); - } else if (damage < 25){ - GLog.w("You prick yourself and the chalice feeds on you."); - Sample.INSTANCE.play(Assets.SND_CURSED); - hero.sprite.emitter().burst( ShadowParticle.CURSE, 6 ); - } else if (damage < 100){ - GLog.w("Your life essence drains into the chalice."); - Sample.INSTANCE.play(Assets.SND_CURSED); - hero.sprite.emitter().burst( ShadowParticle.CURSE, 12 ); + damage = 1; } else { - GLog.w("The chalice devours your life energy."); Sample.INSTANCE.play(Assets.SND_CURSED); - hero.sprite.emitter().burst( ShadowParticle.CURSE, 18 ); + hero.sprite.emitter().burst( ShadowParticle.CURSE, 4+(damage/10) ); } - if (damage > 0) - hero.damage(damage, this); + hero.damage(damage, this); if (!hero.isAlive()) { Dungeon.fail(Utils.format( ResultDescriptions.ITEM, name )); - GLog.n("The Chalice sucks your life essence dry..."); + GLog.n( Messages.get(this, "ondeath") ); } else { upgrade(); } @@ -145,32 +131,18 @@ public class ChaliceOfBlood extends Artifact { @Override public String desc() { - String desc = "This shining silver chalice is oddly adorned with sharp gems at the rim. "; - if (level() < levelCap) - desc += "The chalice is pulling your attention strangely, you feel like it wants something from you."; - else - desc += "The chalice is full and radiating energy."; + String desc = super.desc(); if (isEquipped (Dungeon.hero)){ desc += "\n\n"; if (cursed) - desc += "The cursed chalice has bound itself to your hand, and is slowly tugging at your life energy."; + desc += Messages.get(this, "desc_cursed"); else if (level() == 0) - desc += "As you hold the chalice, you feel oddly compelled to prick yourself on the sharp gems."; - else if (level() < 3) - desc += "Some of your blood is pooled into the chalice, you can subtly feel the chalice feeding life " + - "energy into you. You still want to cut yourself on the chalice, even though you know it will hurt."; - else if (level() < 7) - desc += "The chalice is about half full of your blood and you can feel it feeding life energy " + - "into you. you still want to hurt yourself, the chalice needs your energy, it's your friend."; + desc += Messages.get(this, "desc_1"); else if (level() < levelCap) - desc += "The chalice is getting pretty full, and the life force it's feeding you is stronger than " + - "ever. You should give it more energy, you need too, your friend needs your energy, it needs " + - "your help. Your friend knows you have limits though, it doesn't want you to die, just bleed."; + desc += Messages.get(this, "desc_2"); else - desc += "The chalice is filled to the brim with your life essence. You can feel the chalice pouring " + - "life energy back into you. It's your best friend. It's happy with you. So happy. " + - "You've done well. So well. You're being rewarded. You don't need to touch the sharp gems anymore."; + desc += Messages.get(this, "desc_3"); } return desc; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java index 81204d2aa..c35e33db5 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/CloakOfShadows.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; @@ -74,9 +75,9 @@ public class CloakOfShadows extends Artifact { if (action.equals( AC_STEALTH )) { if (!stealthed){ - if (!isEquipped(hero)) GLog.i("You need to equip your cloak to do that."); - else if (cooldown > 0) GLog.i("Your cloak needs " + cooldown + " more rounds to re-energize."); - else if (charge <= 1) GLog.i("Your cloak hasn't recharged enough to be usable yet."); + if (!isEquipped(hero)) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (cooldown > 0) GLog.i( Messages.get(this, "cooldown", cooldown) ); + else if (charge <= 1) GLog.i( Messages.get(this, "no_charge") ); else { stealthed = true; hero.spend( 1f ); @@ -90,14 +91,12 @@ public class CloakOfShadows extends Artifact { hero.sprite.alpha(0.4f); } hero.sprite.operate(hero.pos); - GLog.i("Your cloak blends you into the shadows."); } } else { stealthed = false; activeBuff.detach(); activeBuff = null; hero.sprite.operate( hero.pos ); - GLog.i("You return from underneath your cloak."); } } else @@ -138,28 +137,6 @@ public class CloakOfShadows extends Artifact { return super.upgrade(); } - @Override - public String desc() { - String desc = "This light silken cloak shimmers in and out of your vision as it sways in the air. When worn, " + - "it can be used to hide your presence for a short time.\n\n"; - - if (level() < 5) - desc += "The cloak's magic has faded and it is not very powerful, perhaps it will regain strength through use."; - else if (level() < 10) - desc += "The cloak's power has begun to return."; - else if (level() < 15) - desc += "The cloak has almost returned to full strength."; - else - desc += "The cloak is at full potential and will work for extended durations."; - - - if ( isEquipped (Dungeon.hero) ) - desc += "\n\nThe cloak rests around your shoulders."; - - - return desc; - } - private static final String STEALTHED = "stealthed"; private static final String COOLDOWN = "cooldown"; @@ -231,7 +208,7 @@ public class CloakOfShadows extends Artifact { if (turnsToCost == 0) charge--; if (charge <= 0) { detach(); - GLog.w("Your cloak has run out of energy."); + GLog.w( Messages.get(this, "no_charge") ); ((Hero)target).interrupt(); } @@ -240,7 +217,7 @@ public class CloakOfShadows extends Artifact { if (exp >= (level()+1)*50 && level() < levelCap) { upgrade(); exp -= level()*50; - GLog.p("Your cloak grows stronger!"); + GLog.p( Messages.get(this, "levelup") ); } if (turnsToCost == 0) turnsToCost = 2; @@ -260,7 +237,7 @@ public class CloakOfShadows extends Artifact { if (exp >= (level()+1)*50 && level() < levelCap) { upgrade(); exp -= level()*50; - GLog.p("Your cloak grows stronger!"); + GLog.p( Messages.get(this, "levelup") ); } updateQuickslot(); @@ -275,17 +252,12 @@ public class CloakOfShadows extends Artifact { @Override public String toString() { - return "Cloaked"; + return Messages.get(this, "name"); } @Override public String desc() { - return "Your cloak of shadows is granting you invisibility while you are shrouded by it.\n" + - "\n" + - "While you are invisible enemies are unable to attack or follow you. " + - "Most physical attacks and magical effects (such as scrolls and wands) will immediately cancel invisibility.\n" + - "\n" + - "You will remain cloaked until it is cancelled or your cloak runs out of charge."; + return Messages.get(this, "desc"); } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java index 663a68888..8f1997ac2 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java @@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfPsionicBlast; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -88,7 +89,7 @@ public class DriedRose extends Artifact { if (action.equals(AC_SUMMON)) { if (spawned) GLog.n("sad ghost: \"I'm already here\""); - else if (!isEquipped( hero )) GLog.i("You need to equip your rose to do that."); + else if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); else if (charge != chargeCap) GLog.i("Your rose isn't fully charged yet."); else if (cursed) GLog.i("You cannot use a cursed rose."); else { @@ -140,19 +141,12 @@ public class DriedRose extends Artifact { if (isEquipped( Dungeon.hero )){ if (!cursed){ - desc += "\n\nThe rose rests in your hand, it feels strangely warm."; - if (level() < 5) - desc+= "\n\nThe rose has lost most of its petals. It feels extremely frail, like it " + - "could snap any moment."; - else if (level() < 10) - desc+= "\n\nYou have reattached many petals and the rose has started to somehow come back to life."+ - " It almost looks like it's ready to bloom."; - else - desc+= "\n\nThe rose has blossomed again through some kind of magic, its connection to your spirit"+ - " friend is stronger than ever."; + if (level() < levelCap) + desc+= "\n\nIt seems to be missing some petals. Perhaps reattaching them out strengthen the rose."; + } else - desc += "\n\nThe cursed rose is bound to you hand, it feels eerily cold."; + desc += "\n\nThe cursed rose is bound to your hand, it feels eerily cold."; } return desc; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java index 6a968f405..fa0fe5b7c 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Chains; import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -71,9 +72,9 @@ public class EtherealChains extends Artifact { curUser = hero; - if (!isEquipped( hero )) GLog.i("You need to equip the chains to do that."); - else if (charge < 1) GLog.i("Your chains do not have any available charge."); - else if (cursed) GLog.w("You can't use cursed chains."); + if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (charge < 1) GLog.i( Messages.get(this, "no_charge") ); + else if (cursed) GLog.w( Messages.get(this, "cursed") ); else { GameScene.selectCell(caster); } @@ -104,16 +105,16 @@ public class EtherealChains extends Artifact { } } if (newPos == -1){ - GLog.w("That won't do anything"); + GLog.w( Messages.get(this, "does_nothing") ); } else { final int newMobPos = newPos; final Char affected = Actor.findChar( chain.collisionPos ); int chargeUse = Level.distance(affected.pos, newMobPos); if (chargeUse > charge) { - GLog.w("Your chains do not have enough charge."); + GLog.w( Messages.get(this, "no_charge") ); return; } else if (affected.properties().contains(Char.Property.IMMOVABLE)) { - GLog.w("Your chains cannot pull that target"); + GLog.w( Messages.get(this, "cant_pull") ); return; } else { charge -= chargeUse; @@ -144,12 +145,12 @@ public class EtherealChains extends Artifact { if (!Level.solid[i] && Actor.findChar(i) == null) newPos = i; } if (newPos == -1) { - GLog.w("That won't do anything"); + GLog.w( Messages.get(this, "does_nothing") ); } else { final int newHeroPos = newPos; int chargeUse = Level.distance(curUser.pos, newHeroPos); if (chargeUse > charge){ - GLog.w("Your chains do not have enough charge."); + GLog.w( Messages.get(this, "no_charge") ); return; } else { charge -= chargeUse; @@ -171,7 +172,7 @@ public class EtherealChains extends Artifact { } } else { - GLog.i("There is nothing to grab there"); + GLog.i( Messages.get(this, "nothing_to_grab") ); } } @@ -180,7 +181,7 @@ public class EtherealChains extends Artifact { @Override public String prompt() { - return "Choose a location to target"; + return Messages.get(this, "prompt"); } }; @@ -191,18 +192,14 @@ public class EtherealChains extends Artifact { @Override public String desc() { - String desc = "These large clanky chains glow with spiritual energy. They move with a certain heft, " + - "but are surprisingly almost weightless. These chains can be used to grab surfaces, pulling you " + - "towards terrain or pulling enemies toward you. The ethereal nature of the chains even allows them to " + - "extend and pull targets through walls!"; + String desc = super.desc(); if (isEquipped( Dungeon.hero )){ - if (!cursed) { - desc += "\n\nThe chains rest around your side, slowly siphoning the spiritual energy of those you defeat. " + - "Each charge is a link in the chain, which will extend out exactly one tile."; - - }else - desc += "\n\nThe cursed chains are locked to your side, constantly swinging around, trying to trip or bind you"; + desc += "\n\n"; + if (cursed) + desc += Messages.get(this, "desc_cursed"); + else + desc += Messages.get(this, "desc_equipped"); } return desc; } @@ -244,7 +241,7 @@ public class EtherealChains extends Artifact { if (exp > 100+level()*50 && level() < levelCap){ exp -= 100+level()*50; - GLog.p("Your chains grow stronger!"); + GLog.p( Messages.get(this, "levelup") ); upgrade(); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java index b3813f7bc..6af856687 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/HornOfPlenty.java @@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.food.Blandfruit; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -65,7 +66,6 @@ public class HornOfPlenty extends Artifact { public static final String AC_EAT = "EAT"; public static final String AC_STORE = "STORE"; - protected String inventoryTitle = "Select a piece of food"; protected WndBag.Mode mode = WndBag.Mode.FOOD; @Override @@ -84,8 +84,8 @@ public class HornOfPlenty extends Artifact { if (action.equals(AC_EAT)){ - if (!isEquipped(hero)) GLog.i("You need to equip your horn to do that."); - else if (charge == 0) GLog.i("Your horn has no food in it to eat!"); + if (!isEquipped(hero)) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (charge == 0) GLog.i( Messages.get(this, "no_food") ); else { ((Hunger) hero.buff(Hunger.class)).satisfy(energy * charge); @@ -116,7 +116,7 @@ public class HornOfPlenty extends Artifact { hero.busy(); SpellSprite.show(hero, SpellSprite.FOOD); Sample.INSTANCE.play(Assets.SND_EAT); - GLog.i("You eat from the horn."); + GLog.i( Messages.get(this, "eat") ); hero.spend(TIME_TO_EAT); @@ -129,7 +129,7 @@ public class HornOfPlenty extends Artifact { } else if (action.equals(AC_STORE)){ - GameScene.selectItem(itemSelector, mode, inventoryTitle); + GameScene.selectItem(itemSelector, mode, Messages.get(this, "prompt")); } } @@ -140,28 +140,14 @@ public class HornOfPlenty extends Artifact { @Override public String desc() { - String desc = "This horn can't be blown into, but instead seems to fill up with food over time.\n\n"; - - if (charge == 0) - desc += "The horn is completely empty."; - else if (charge < 3) - desc += "The horn is almost empty, a few small fruits and berries sit in the back."; - else if (charge < 7) - desc += "The horn is partially filled, you can see several fruits & vegetables inside."; - else if (charge < 10) - desc += "The horn is getting quite full, several pieces of fresh produce are poking up towards the front."; - else - desc += "The horn is overflowing! A delicious array of fruit and veg is filling the horn up to its brim."; + String desc = super.desc(); if ( isEquipped( Dungeon.hero ) ){ if (!cursed) { - desc += "\n\nThe horn rests at your side and is surprisingly lightweight, even with food in it."; - - if (level() < 15) - desc += " Perhaps there is a way to increase the horn's power by giving it food energy."; + if (level() < levelCap) + desc += "\n\n" +Messages.get(this, "desc_hint"); } else { - desc += "\n\nThe cursed horn has bound itself to your side, " + - "it seems to be eager to take food rather than produce it."; + desc += "\n\n" +Messages.get(this, "desc_cursed"); } } @@ -194,7 +180,7 @@ public class HornOfPlenty extends Artifact { image = ItemSpriteSheet.ARTIFACT_HORN1; if (charge == chargeCap){ - GLog.p("Your horn is full of food!"); + GLog.p( Messages.get(this, "full") ); partialCharge = 0; } @@ -215,7 +201,7 @@ public class HornOfPlenty extends Artifact { public void onSelect( Item item ) { if (item != null && item instanceof Food) { if (item instanceof Blandfruit && ((Blandfruit) item).potionAttrib == null){ - GLog.w("your horn rejects the unprepared blandfruit."); + GLog.w( Messages.get(HornOfPlenty.class, "reject") ); } else { Hero hero = Dungeon.hero; hero.sprite.operate( hero.pos ); @@ -225,9 +211,9 @@ public class HornOfPlenty extends Artifact { curItem.upgrade(((Food)item).hornValue); if (curItem.level() >= 30){ curItem.level(30); - GLog.p("your horn has consumed all the food it can!"); + GLog.p( Messages.get(HornOfPlenty.class, "maxlevel") ); } else - GLog.p("the horn consumes your food offering and grows in strength!"); + GLog.p( Messages.get(HornOfPlenty.class, "levelup") ); item.detach(hero.belongings.backpack); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java index a3d7e96a9..bf75f2718 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java @@ -56,24 +56,6 @@ import java.util.ArrayList; public class LloydsBeacon extends Artifact { - private static final String TXT_PREVENTING = - "Strong magic aura of this place prevents you from using the lloyd's beacon!"; - - private static final String TXT_CREATURES = - "Psychic aura of neighbouring creatures doesn't allow you to use the lloyd's beacon at this moment."; - - private static final String TXT_RETURN = - "The lloyd's beacon is successfully set at your current location, now you can return here anytime."; - - private static final String TXT_INFO = - "Lloyd's beacon is an intricate magic device, which grants the user control of teleportation magics.\n" + - "\n" + - "The beacon can be used to return to a set location, but can also expel bursts of random teleportation " + - "magic once it has charged from being equipped. This magic can be directed at a target or at the user themselves."; - - private static final String TXT_SET = - "\n\nThis beacon was set somewhere on the level %d of Pixel Dungeon."; - public static final float TIME_TO_USE = 1; public static final String AC_ZAP = "ZAP"; @@ -132,13 +114,13 @@ public class LloydsBeacon extends Artifact { if (Dungeon.bossLevel()) { hero.spend( LloydsBeacon.TIME_TO_USE ); - GLog.w( TXT_PREVENTING ); + GLog.w( Messages.get(this, "preventing") ); return; } for (int i=0; i < Level.NEIGHBOURS8.length; i++) { if (Actor.findChar( hero.pos + Level.NEIGHBOURS8[i] ) != null) { - GLog.w( TXT_CREATURES ); + GLog.w( Messages.get(this, "creatures") ); return; } } @@ -149,8 +131,8 @@ public class LloydsBeacon extends Artifact { curUser = hero; int chargesToUse = Dungeon.depth > 20 ? 2 : 1; - if (!isEquipped( hero )) GLog.i("You need to equip the beacon to do that."); - else if (charge < chargesToUse) GLog.i("Your beacon does not have enough energy right now."); + if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (charge < chargesToUse) GLog.i( Messages.get(this, "no_charge") ); else { GameScene.selectCell(zapper); } @@ -166,7 +148,7 @@ public class LloydsBeacon extends Artifact { hero.sprite.operate( hero.pos ); Sample.INSTANCE.play( Assets.SND_BEACON ); - GLog.i( TXT_RETURN ); + GLog.i( Messages.get(this, "return") ); } else if (action == AC_RETURN) { @@ -243,7 +225,7 @@ public class LloydsBeacon extends Artifact { } else if (ch.properties().contains(Char.Property.IMMOVABLE)) { - GLog.w("The teleportation magic fails."); + GLog.w( Messages.get(this, "tele_fail") ); } else { @@ -266,7 +248,7 @@ public class LloydsBeacon extends Artifact { @Override public String prompt() { - return "Choose a location to zap."; + return Messages.get(this, "prompt"); } }; @@ -277,14 +259,19 @@ public class LloydsBeacon extends Artifact { @Override public Item upgrade() { + if (level() == levelCap) return this; chargeCap ++; - + GLog.p( Messages.get(this, "levelup") ); return super.upgrade(); } @Override public String desc() { - return TXT_INFO + (returnDepth == -1 ? "" : Utils.format( TXT_SET, returnDepth ) ); + String desc = super.desc(); + if (returnDepth != -1){ + desc += "\n\n" + Messages.get(this, "desc_set", returnDepth); + } + return desc; } public void reset() { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java index 0183372f6..1088b60f2 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/MasterThievesArmband.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Random; @@ -43,13 +44,10 @@ public class MasterThievesArmband extends Artifact { @Override public String desc() { - String desc = "This purple velvet armband bears the mark of a master thief. This doesn't belong to you, but " + - "you doubt it belonged to the person you took it from either."; + String desc = super.desc(); if ( isEquipped (Dungeon.hero) ) - desc += "\n\nWith the armband around your wrist you feel more dexterous and cunning. Every piece of gold " + - "you find makes you desire others property more. " + - "You wonder if Pixel Mart accepts the five finger discount..."; + desc += "\n\n" + Messages.get(this, "desc_worn"); return desc; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java index 7cb02f827..df9a07823 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/SandalsOfNature.java @@ -79,7 +79,7 @@ public class SandalsOfNature extends Artifact { GameScene.selectItem(itemSelector, mode, inventoryTitle); } else if (action.equals(AC_ROOT) && level() > 0){ - if (!isEquipped( hero )) GLog.i("You need to equip them to do that."); + if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); else if (charge == 0) GLog.i("They have no energy right now."); else { Buff.prolong(hero, Roots.class, 5); @@ -101,39 +101,23 @@ public class SandalsOfNature extends Artifact { public String desc() { String desc = ""; if (level() == 0) - desc += "What initially seem like sandals made of twine are actually two plants! The footwear moves ever " + - "so slightly when being held. They seem very weak and pale, perhaps they need to be given nutrients?"; + desc += "What initially seem like sandals made of twine are actually two plants! They seem very weak and pale, perhaps they need to be given nutrients?"; else if (level() == 1) - desc += "The footwear has grown and now more closely resemble two tailored shoes. They seem to match the " + - "contours of your feet exactly. Some colour has returned to them, perhaps they can still grow further?"; + desc += "The footwear has grown and now more closely resemble two tailored shoes. Some colour has returned to them, perhaps they can still grow further?"; else if (level() == 2) - desc += "The plants have grown again and now resembles a pair of solid tall boots. They appear to be made" + - " of solid bark more than vine now, yet are still very flexible. The plants seem to have " + + desc += "The plants have grown again and now resembles a pair of solid boots made from bark.The plants seem to have " + "regained their strength, but perhaps they can still grow further"; else - desc += "Now almost tall enough to make full pants, the bark-mesh artifact seems to have reached its " + - "maximum size. Perhaps the two plants don't want to merge together? The greaves are a deep brown " + + desc += "The plants seem to have reached their maximum size, they resemble a pair of armored greaves. The greaves are a deep brown " + "and resemble a very sturdy tree."; if ( isEquipped ( Dungeon.hero ) ){ desc += "\n\n"; - if (level() == 0) { - if (!cursed) - desc += "The sandals wrap snugly around your feet, they seem happy to be worn."; - else - desc += "The cursed sandals wrap tightly around your feet."; - } - else if (level() == 1) - desc += "The shoes fit on loosely but quickly tighten to make a perfect fit."; - else if (level() == 2) - desc += "The boots fit snugly and add a nice heft to your step."; - else - desc += "The greaves are thick and weighty, but very easy to move in, as if they are moving with you."; if (!cursed) - desc += " You feel more attuned with nature while wearing them."; + desc += " You feel more attuned with nature while wearing this artifact."; else - desc += " They are blocking any attunement with nature."; + desc += " The cursed sandals are blocking any attunement with nature."; if (level() > 0) desc += "\n\nThe footwear has gained the ability to form up into a sort of immobile natural armour, " + @@ -169,7 +153,6 @@ public class SandalsOfNature extends Artifact { private static final String SEEDS = "seeds"; - private static final String NAME = "name"; @Override public void storeInBundle( Bundle bundle ) { @@ -200,7 +183,7 @@ public class SandalsOfNature extends Artifact { public void onSelect( Item item ) { if (item != null && item instanceof Plant.Seed) { if (seeds.contains(item.name())){ - GLog.w("Your " + name + " have already gained nutrients from that seed recently."); + GLog.w("Your footwear have already gained nutrients from that seed recently."); } else { seeds.add(item.name()); @@ -217,7 +200,7 @@ public class SandalsOfNature extends Artifact { } } else { - GLog.i("Your " + name + " absorb the seed, they seem healthier."); + GLog.i("The footwear absorbs the seed, they seem healthier."); } item.detach(hero.belongings.backpack); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java index f570a3a82..ee8e9cd25 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TalismanOfForesight.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; @@ -66,8 +67,8 @@ public class TalismanOfForesight extends Artifact { super.execute(hero, action); if (action.equals(AC_SCRY)){ - if (!isEquipped(hero)) GLog.i("You need to equip your talisman to do that."); - else if (charge != chargeCap) GLog.i("Your talisman isn't full charged yet."); + if (!isEquipped(hero)) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (charge != chargeCap) GLog.i( Messages.get(this, "no_charge") ); else { hero.sprite.operate(hero.pos); hero.busy(); @@ -86,7 +87,7 @@ public class TalismanOfForesight extends Artifact { } } - GLog.p("The Talisman floods your mind with knowledge about the current floor."); + GLog.p( Messages.get(this, "scry") ); Buff.affect(hero, Awareness.class, Awareness.DURATION); Dungeon.observe(); @@ -101,16 +102,14 @@ public class TalismanOfForesight extends Artifact { @Override public String desc() { - String desc = "A smooth stone, almost too big for your pocket or hand, with strange engravings on it. " + - "You feel like it's watching you, assessing your every move."; + String desc = super.desc(); + if ( isEquipped( Dungeon.hero ) ){ if (!cursed) { - desc += "\n\nWhen you hold the talisman you feel like your senses are heightened."; - if (charge == chargeCap) - desc += "\n\nThe talisman is radiating energy, prodding at your mind. You wonder what would " + - "happen if you let it in."; + desc += "\n\n" + Messages.get(this, "desc_worn"); + } else { - desc += "\n\nThe cursed talisman is intently staring into you, making it impossible to concentrate."; + desc += "\n\n" + Messages.get(this, "desc_cursed"); } } @@ -157,7 +156,7 @@ public class TalismanOfForesight extends Artifact { if (smthFound && !cursed){ if (warn == 0){ - GLog.w("You feel uneasy."); + GLog.w( Messages.get(this, "uneasy") ); if (target instanceof Hero){ ((Hero)target).interrupt(); } @@ -180,7 +179,7 @@ public class TalismanOfForesight extends Artifact { charge++; } else if (charge >= chargeCap) { partialCharge = 0; - GLog.p("Your Talisman is fully charged!"); + GLog.p( Messages.get(this, "full_charge") ); } } @@ -192,19 +191,19 @@ public class TalismanOfForesight extends Artifact { exp++; if (exp >= 4 && level() < levelCap) { upgrade(); - GLog.p("Your Talisman grows stronger!"); + GLog.p( Messages.get(this, "levelup") ); exp -= 4; } } @Override public String toString() { - return "Foresight"; + return Messages.get(this, "name"); } @Override public String desc() { - return "You feel very nervous, as if there is nearby unseen danger."; + return Messages.get(this, "desc"); } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java index 1288282e5..e28a3df02 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java @@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -41,14 +42,6 @@ import java.util.ArrayList; public class TimekeepersHourglass extends Artifact { - private static final String TXT_HGLASS = "Timekeeper's Hourglass"; - private static final String TXT_STASIS = "Put myself in stasis"; - private static final String TXT_FREEZE = "Freeze time around me"; - private static final String TXT_DESC = - "How would you like to use the hourglass's magic?\n\n" + - "While in stasis, time will move normally while you are frozen and completely invulnerable.\n\n" + - "When time is frozen, you can move as if your actions take no time. Note that attacking will break this."; - { image = ItemSpriteSheet.ARTIFACT_HOURGLASS; @@ -78,23 +71,26 @@ public class TimekeepersHourglass extends Artifact { public void execute( Hero hero, String action ) { if (action.equals(AC_ACTIVATE)){ - if (!isEquipped( hero )) GLog.i("You need to equip your hourglass to do that."); - else if (activeBuff != null) GLog.i("Your hourglass is already in use."); - else if (charge <= 1) GLog.i("Your hourglass hasn't recharged enough to be usable yet."); - else if (cursed) GLog.i("You cannot use a cursed hourglass."); + if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); + else if (activeBuff != null) GLog.i( Messages.get(this, "in_use") ); + else if (charge <= 1) GLog.i( Messages.get(this, "no_charge") ); + else if (cursed) GLog.i( Messages.get(this, "cursed") ); else GameScene.show( - new WndOptions(TXT_HGLASS, TXT_DESC, TXT_STASIS, TXT_FREEZE) { + new WndOptions( Messages.get(this, "name"), + Messages.get(this, "prompt"), + Messages.get(this, "stasis"), + Messages.get(this, "freeze")) { @Override protected void onSelect(int index) { if (index == 0) { - GLog.i("The world seems to shift around you in an instant."); + GLog.i( Messages.get(this, "onstasis") ); GameScene.flash(0xFFFFFF); Sample.INSTANCE.play(Assets.SND_TELEPORT); activeBuff = new timeStasis(); activeBuff.attachTo(Dungeon.hero); } else if (index == 1) { - GLog.i("everything around you suddenly freezes."); + GLog.i( Messages.get(this, "onfreeze") ); GameScene.flash(0xFFFFFF); Sample.INSTANCE.play(Assets.SND_TELEPORT); @@ -145,22 +141,15 @@ public class TimekeepersHourglass extends Artifact { @Override public String desc() { - String desc = - "This large ornate hourglass looks fairly unassuming, but you feel a great power in its finely carved" + - " frame. As you rotate the hourglass and watch the sand pour you can feel its magic tugging at you, " + - "surely invoking this magic would give you some power over time."; + String desc = super.desc(); if (isEquipped( Dungeon.hero )){ if (!cursed) { - desc += "\n\nThe hourglass rests at your side, the whisper of steadily pouring sand is reassuring."; - if (level() < levelCap ) - desc += - "\n\nThe hourglass seems to have lost some sand with age. While there are no cracks, " + - "there is a port on the top of the hourglass to pour sand in, if only you could find some..."; - }else - desc += "\n\nThe cursed hourglass is locked to your side, " + - "you can feel it trying to manipulate your flow of time."; + desc += "\n\n" + Messages.get(this, "desc_hint"); + + } else + desc += "\n\n" + Messages.get(this, "desc_cursed"); } return desc; } @@ -366,23 +355,17 @@ public class TimekeepersHourglass extends Artifact { hourglass.upgrade(); Sample.INSTANCE.play( Assets.SND_DEWDROP ); if (hourglass.level() == hourglass.levelCap) - GLog.p("Your hourglass is filled with magical sand!"); + GLog.p( Messages.get(this, "maxlevel") ); else - GLog.i("you add the sand to your hourglass."); + GLog.i( Messages.get(this, "levelup") ); hero.spendAndNext(TIME_TO_PICK_UP); return true; } else { - GLog.w("You have no hourglass to place this sand into."); + GLog.w( Messages.get(this, "no_hourglass") ); 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/items/artifacts/UnstableSpellbook.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java index 49ea52aeb..6c7274274 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/UnstableSpellbook.java @@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; 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.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -95,7 +96,7 @@ public class UnstableSpellbook extends Artifact { if (action.equals( AC_READ )) { if (hero.buff( Blindness.class ) != null) GLog.w("You cannot read from the book while blinded."); - else if (!isEquipped( hero )) GLog.i("You need to equip your spellbook to do that."); + else if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); else if (charge == 0) GLog.i("Your spellbook is out of energy for now."); else if (cursed) GLog.i("Your cannot read from a cursed spellbook."); else { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties b/src/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties index 1100c032b..69120c569 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties +++ b/src/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties @@ -76,23 +76,87 @@ items.armor.warriorarmor.desc=While this armor looks heavy, it allows a warrior ###artifacts items.artifacts.alchemiststoolkit.name=alchemists toolkit +##this one isn't dropped, so for now no i18n -items.artifacts.capeofthorns.name=cape of Thorns +items.artifacts.artifact.unequip_title=Unequip one item +items.artifacts.artifact.unequip_message=You can only wear two misc items at a time. +items.artifacts.artifact.cannot_wear_two=You cannot wear two of the same artifact. +items.artifacts.artifact.cursed_worn=The artifact painfully binds itself to you. +items.artifacts.artifact.curse_known=You can feel a malevolent magic lurking within the artifact. +items.artifacts.artifact.need_to_equip=You need to equip your artifact to do that. + +items.artifacts.capeofthorns.name=cape of thorns +items.artifacts.capeofthorns.desc=These collapsed sheets of metal from the DM-300 have formed together into a rigid cape. It seems to store a deep energy, perhaps it has some of the DM-300's power? +items.artifacts.capeofthorns.desc_inactive=The cape feels reassuringly heavy on your shoulders, it seems to be gaining energy from the damage you take. +items.artifacts.capeofthorns.desc_active=The cape seems to be releasing stored energy, it is radiating a protective power. +items.artifacts.capeofthorns$thorns.inert=Your Cape becomes inert again. +items.artifacts.capeofthorns$thorns.radiating=Your Cape begins radiating energy, you feel protected! +items.artifacts.capeofthorns$thorns.levelup=Your Cape grows stronger! +items.artifacts.capeofthorns$thorns.name=Thorns +items.artifacts.capeofthorns$thorns.desc=Your cape is radiating energy, surrounding you in a field of deflective force!\n\nAll damage you receive is reduced while the thorns effect is active. Additionally, if the attacker is next to you, the reduced amount is deflected back at the attacker.\n\nYour cape will continue radiating energy for %s. items.artifacts.chaliceofblood.name=chalice of blood +items.artifacts.chaliceofblood.yes=Yes, I know what I'm doing +items.artifacts.chaliceofblood.no=No, I changed my mind +items.artifacts.chaliceofblood.prick_warn=Each time you use the chalice it will drain more life energy, if you are not careful this can easily kill you.\n\nAre you sure you want to offer it more life energy? +items.artifacts.chaliceofblood.onprick=You prick yourself, and your life essence drains into the chalice. +items.artifacts.chaliceofblood.ondeath=The Chalice sucks your life essence dry... +items.artifacts.chaliceofblood.desc=This shining silver chalice is oddly adorned with sharp gems at the rim. +items.artifacts.chaliceofblood.desc_cursed=The cursed chalice has bound itself to your hand, and is inhibiting your ability to regenrate health. +items.artifacts.chaliceofblood.desc_1=As you hold the chalice, you feel oddly compelled to prick yourself on the sharp gems. +items.artifacts.chaliceofblood.desc_2=Some of your blood is pooled into the chalice, you can subtly feel the chalice feeding life energy into you. You still want to cut yourself on the chalice, even though you know it will hurt. +items.artifacts.chaliceofblood.desc_3=The chalice is filled to the brim with your life essence. You can feel the chalice pouring life energy back into you. items.artifacts.cloakofshadows.name=cloak of shadows +items.artifacts.cloakofshadows.cooldown=Your cloak needs %d more rounds to re-energize. +items.artifacts.cloakofshadows.no_charge=Your cloak hasn't recharged enough to be usable yet. +items.artifacts.cloakofshadows.desc=A priceless magical cloak, stolen from the royal armory many years ago by the Rogue. When worn, it can be used to turn completely invisible for a short time.\n\nThe more the cloak is used, the stronger it will become, allowing the Rogue to become invisible more frequently and for longer durations. +items.artifacts.cloakofshadows$cloakstealth.no_charge=Your cloak has run out of energy. +items.artifacts.cloakofshadows$cloakstealth.levelup=Your cloak grows stronger! +items.artifacts.cloakofshadows$cloakstealth.name=Cloaked +items.artifacts.cloakofshadows$cloakstealth.desc=Your cloak of shadows is granting you invisibility while you are shrouded by it.\n\nWhile you are invisible enemies are unable to attack or follow you. Physical attacks and magical effects (such as scrolls and wands) will immediately cancel invisibility.\n\nYou will remain cloaked until it is cancelled or your cloak runs out of charge. items.artifacts.driedrose.name=dried rose items.artifacts.driedrose$petal.name=dried petal items.artifacts.etherealchains.name=ethereal chains +items.artifacts.etherealchains.no_charge=Your chains do not have enough charge. +items.artifacts.etherealchains.cursed=You can't use cursed chains. +items.artifacts.etherealchains.does_nothing=That won't do anything. +items.artifacts.etherealchains.cant_pull=Your chains cannot pull that target. +items.artifacts.etherealchains.nothing_to_grab=There is nothing to grab there. +items.artifacts.etherealchains.prompt=Choose a location to target. +items.artifacts.etherealchains.desc=These large yet lightweight chains glow with spiritual energy. They can be used to pull you towards terrain, or pull enemies toward you. The ethereal nature of the chains even allows them to extend through walls! +items.artifacts.etherealchains.desc_cursed=The cursed chains are locked to your side, constantly swinging around, trying to trip or bind you +items.artifacts.etherealchains.desc_equipped=The chains rest around your side, slowly siphoning the spiritual energy of those you defeat. Each charge is a link in the chain, which will extend out exactly one tile. +items.artifacts.etherealchains$chainsrecharge.levelup=Your chains grow stronger! -items.artifacts.hornofplenty.name=horn of Plenty +items.artifacts.hornofplenty.name=horn of plenty +items.artifacts.hornofplenty.eat=You eat from the horn. +items.artifacts.hornofplenty.prompt=Select a piece of food +items.artifacts.hornofplenty.no_food=Your horn has no food in it to eat! +items.artifacts.hornofplenty.full=Your horn is full of food! +items.artifacts.hornofplenty.reject=Your horn rejects the uncooked blandfruit. +items.artifacts.hornofplenty.maxlevel=Your horn has consumed all the food it can! +items.artifacts.hornofplenty.levelup=The horn consumes your food offering and grows in strength! +items.artifacts.hornofplenty.desc=This horn can't be blown into, but instead seems to fill up with food over time when equipped. +items.artifacts.hornofplenty.desc_hint=Perhaps there is a way to increase the horn's power by giving it food energy. +items.artifacts.hornofplenty.desc_cursed=The cursed horn has bound itself to your side, it seems to be eager to take food rather than produce it. items.artifacts.lloydsbeacon.name=lloyd's beacon +items.artifacts.lloydsbeacon.no_charge=Your beacon does not have enough energy right now. +items.artifacts.lloydsbeacon.tele_fail=The teleportation magic fails. +items.artifacts.lloydsbeacon.prompt=Choose a location to zap. +items.artifacts.lloydsbeacon.levelup=Your beacon grows stronger! +items.artifacts.lloydsbeacon.preventing=Strong magic aura of this place prevents you from using the lloyd's beacon! +items.artifacts.lloydsbeacon.creatures=Psychic aura of neighbouring creatures doesn't allow you to use the lloyd's beacon at this moment. +items.artifacts.lloydsbeacon.return=The lloyd's beacon is successfully set at your current location, now you can return here anytime. +items.artifacts.lloydsbeacon.desc=Lloyd's beacon is an intricate magical device which grants the user control of teleportation magics. The beacon can be used to return to a set location, but can also expel bursts of random teleportation magic once it has charged from being equipped. This magic can be directed at a target or at the user themselves. +items.artifacts.lloydsbeacon.desc_set=This beacon was set somewhere on the level %d of Pixel Dungeon. items.artifacts.masterthievesarmband.name=master thieves' armband +items.artifacts.masterthievesarmband.desc=This purple velvet armband bears the mark of a master thief. This doesn't belong to you, but it probably didn't belong to the person you took it from either. +items.artifacts.masterthievesarmband.desc_worn=With the armband around your wrist, every piece of gold you find makes you desire other people's property more. Perhaps it wouldn't be too hard to steal from pixel mart... items.artifacts.sandalsofnature.name=sandals of nature items.artifacts.sandalsofnature.name_1=shoes of nature @@ -100,13 +164,39 @@ items.artifacts.sandalsofnature.name_2=boots of nature items.artifacts.sandalsofnature.name_3=greaves of nature items.artifacts.talismanofforesight.name=talisman of foresight +items.artifacts.talismanofforesight.no_charge=Your talisman isn't fully charged yet. +items.artifacts.talismanofforesight.scry=The Talisman floods your mind with knowledge about the current floor. +items.artifacts.talismanofforesight.desc=A smooth stone with strange engravings on it. You feel like it's watching everything around you, keeping an eye out for anything unusual. +items.artifacts.talismanofforesight.desc_worn=When you hold the talisman you feel like your senses are heightened. +items.artifacts.talismanofforesight.desc_cursed=The cursed talisman is intently staring into you, making it impossible to concentrate. +items.artifacts.talismanofforesight$foresight.name=Foresight +items.artifacts.talismanofforesight$foresight.levelup=Your Talisman grows stronger! +items.artifacts.talismanofforesight$foresight.full_charge=Your Talisman is fully charged! +items.artifacts.talismanofforesight$foresight.uneasy=You feel uneasy. +items.artifacts.talismanofforesight$foresight.desc=You feel very nervous, as if there is nearby unseen danger. items.artifacts.timekeepershourglass.name=timekeeper's hourglass +items.artifacts.timekeepershourglass.in_use=Your hourglass is already in use. +items.artifacts.timekeepershourglass.no_charge=Your hourglass hasn't recharged enough to be usable yet. +items.artifacts.timekeepershourglass.cursed=You cannot use a cursed hourglass. +items.artifacts.timekeepershourglass.onstasis=The world seems to shift around you in an instant. +items.artifacts.timekeepershourglass.onfreeze=Everything around you suddenly freezes. +items.artifacts.timekeepershourglass.stasis=Put myself in stasis +items.artifacts.timekeepershourglass.freeze=Freeze time around me +items.artifacts.timekeepershourglass.prompt=How would you like to use the hourglass's magic?\n\nWhile in stasis, time will move normally while you are frozen and completely invulnerable.\n\nWhen time is frozen, you can move as if your actions take no time. Note that attacking will break this. +items.artifacts.timekeepershourglass.desc=This large ornate hourglass looks fairly unassuming, but you feel a great power in its finely carved frame. As you rotate the hourglass and watch the sand pour you can feel its magic tugging at you, surely using this magic would give you some control over time. +items.artifacts.timekeepershourglass.desc_hint=The hourglass seems to have lost some sand, if only you could find some... +items.artifacts.timekeepershourglass.desc_cursed=The cursed hourglass is locked to your side, you can feel it trying to manipulate your flow of time. items.artifacts.timekeepershourglass$sandbag.name=bag of magic sand +items.artifacts.timekeepershourglass$sandbag.levelup=You add the sand to your hourglass. +items.artifacts.timekeepershourglass$sandbag.maxlevel=Your hourglass is filled with magical sand! +items.artifacts.timekeepershourglass$sandbag.no_hourglass=You have no hourglass to place this sand into. +items.artifacts.timekeepershourglass$sandbag.desc=This small bag of fine sand should work perfectly with your hourglass.\n\nIt seems odd that the shopkeeper would have this specific item right when you need it... items.artifacts.unstablespellbook.name=unstable spellbook + ###bags items.bags.bag.name=backpack @@ -215,62 +305,50 @@ items.potions.potion.sure_throw=Are you sure you want to throw it? In most cases items.potions.potion.shatter=The flask shatters and %s liquid splashes harmlessly items.potions.potionofexperience.name=potion of experience -items.potions.potionofexperience.initials=Ex items.potions.potionofexperience.desc=The storied experiences of multitudes of battles reduced to liquid form, this draught will instantly raise your experience level. items.potions.potionoffrost.name=potion of frost -items.potions.potionoffrost.initials=Fr items.potions.potionoffrost.desc=Upon exposure to open air this chemical will evaporate into a freezing cloud, causing any creature that contacts it to be frozen in place unable to act and move. The freezing effect is much stronger if the environment is wet. items.potions.potionofhealing.name=potion of healing -items.potions.potionofhealing.initials=He items.potions.potionofhealing.heal=Your wounds heal completely. items.potions.potionofhealing.desc=An elixir that will instantly return you to full health and cure poison. items.potions.potionofinvisibility.name=potion of invisibility -items.potions.potionofinvisibility.initials=In items.potions.potionofinvisibility.invisible=You see your hands turn invisible! items.potions.potionofinvisibility.desc=Drinking this potion will render you temporarily invisible. While invisible, enemies will be unable to see you. Attacking an enemy, as well as using a wand or a scroll before enemy's eyes, will dispel the effect. items.potions.potionoflevitation.name=potion of levitation -items.potions.potionoflevitation.initials=Le items.potions.potionoflevitation.float=You float into the air! items.potions.potionoflevitation.desc=Drinking this curious liquid will cause you to hover in the air, able to drift effortlessly over traps and pits. Throwing this potion will create a cloud of unrefined gas, disorienting anything caught in it. items.potions.potionofliquidflame.name=potion of liquid flame -items.potions.potionofliquidflame.initials=LF items.potions.potionofliquidflame.desc=This flask contains an unstable compound which will burst violently into flame upon exposure to open air. items.potions.potionofmight.name=potion of might -items.potions.potionofmight.initials=Mi items.potions.potionofmight.msg_1=+1 str, +5 hp items.potions.potionofmight.msg_2=Newfound strength surges through your body. items.potions.potionofmight.desc=This powerful liquid will course through your muscles, permanently increasing your strength by one point and health by five points. items.potions.potionofmindvision.name=potion of mind vision -items.potions.potionofmindvision.initials=MV items.potions.potionofmindvision.see_mobs=You can somehow feel the presence of other creatures' minds! items.potions.potionofmindvision.see_none=You can somehow tell that you are alone on this level at the moment. items.potions.potionofmindvision.desc=After drinking this, your mind will become attuned to the psychic signature of distant creatures, enabling you to sense biological presences through walls. Also this potion will permit you to see through nearby walls and doors. items.potions.potionofparalyticgas.name=potion of paralytic gas -items.potions.potionofparalyticgas.initials=PG items.potions.potionofparalyticgas.desc=Upon exposure to open air, the liquid in this flask will vaporize into a numbing yellow haze. Anyone who inhales the cloud will be paralyzed instantly, unable to move for some time after the cloud dissipates. This item can be thrown at distant enemies to catch them within the effect of the gas. items.potions.potionofpurity.name=potion of purification -items.potions.potionofpurity.initials=Pu items.potions.potionofpurity.freshness=You feel uncommon freshness in the air. items.potions.potionofpurity.no_smell=You've stopped sensing any smells! items.potions.potionofpurity.desc=This reagent will quickly neutralize all harmful gases in the area of effect. Drinking it will give you a temporary immunity to such gases. items.potions.potionofstrength.name=potion of strength -items.potions.potionofstrength.initials=St items.potions.potionofstrength.msg_1=+1 str items.potions.potionofstrength.msg_2=Newfound strength surges through your body. items.potions.potionofstrength.desc=This powerful liquid will course through your muscles, permanently increasing your strength by one point. items.potions.potionoftoxicgas.name=potion of toxic gas -items.potions.potionoftoxicgas.initials=TG items.potions.potionoftoxicgas.desc=Uncorking or shattering this pressurized glass will cause its contents to explode into a deadly cloud of toxic green gas. You might choose to fling this potion at distant enemies instead of uncorking it by hand. @@ -384,67 +462,55 @@ items.scrolls.inventoryscroll.yes=Yes, I'm positive items.scrolls.inventoryscroll.no=No, I changed my mind items.scrolls.scrollofidentify.name=scroll of identify -items.scrolls.scrollofidentify.initials=Id items.scrolls.scrollofidentify.inv_title=Select an item to identify items.scrolls.scrollofidentify.it_is=It is %s items.scrolls.scrollofidentify.desc=This scroll permanently reveals all of the secrets of a single item. items.scrolls.scrolloflullaby.name=scroll of lullaby -items.scrolls.scrolloflullaby.initials=Lu items.scrolls.scrolloflullaby.sooth=The scroll utters a soothing melody. You feel very sleepy. items.scrolls.scrolloflullaby.desc=Reading this scroll emits a soothing melody will lull all who hear it into a deep magical sleep. items.scrolls.scrollofmagicalinfusion.name=scroll of magical infusion -items.scrolls.scrollofmagicalinfusion.initials=MaI items.scrolls.scrollofmagicalinfusion.inv_title=Select an item to infuse items.scrolls.scrollofmagicalinfusion.infuse=your %s is infused with arcane energy! items.scrolls.scrollofmagicalinfusion.desc=This scroll will infuse a weapon or armor with powerful magical energy.\n\nIn addition to being upgraded, A weapon will gain a magical enchantment, or armor will be imbued with a magical glyph.\n\nIf the item already has an enchantment or glyph, it will never be erased by this scroll. items.scrolls.scrollofmagicmapping.name=scroll of magic mapping -items.scrolls.scrollofmagicmapping.initials=MM items.scrolls.scrollofmagicmapping.layout=You are now aware of the level layout. items.scrolls.scrollofmagicmapping.desc=When this scroll is read, an image of crystal clarity will be etched into your memory, alerting you to the precise layout of the level and revealing all hidden secrets. The locations of items and creatures will remain unknown. items.scrolls.scrollofmirrorimage.name=scroll of mirror image -items.scrolls.scrollofmirrorimage.initials=MI items.scrolls.scrollofmirrorimage.desc=The incantation on this scroll will create illusionary twins of the reader, which will chase their enemies. items.scrolls.scrollofpsionicblast.name=scroll of psionic blast -items.scrolls.scrollofpsionicblast.initials=PB items.scrolls.scrollofpsionicblast.ondeath=The Psionic Blast tears your mind apart... items.scrolls.scrollofpsionicblast.desc=This scroll contains destructive energy that can be channeled to tear apart the minds of all visible creatures. The power unleashed by the scroll will also temporarily blind, stun, and seriously harm the reader. items.scrolls.scrollofrage.name=scroll of rage -items.scrolls.scrollofrage.initials=Ra items.scrolls.scrollofrage.roar=The scroll emits an enraging roar that echoes throughout the dungeon! items.scrolls.scrollofrage.desc=When read aloud, this scroll will unleash a great roar that draws all enemies to the reader, and enrages nearby ones. items.scrolls.scrollofrecharging.name=scroll of recharging -items.scrolls.scrollofrecharging.initials=Re items.scrolls.scrollofrecharging.surge=A surge of energy courses through your body, invigorating your wands! items.scrolls.scrollofrecharging.desc=The raw magical power bound up in this parchment will, when released, charge up all the users wands over time. items.scrolls.scrollofremovecurse.name=scroll of remove curse -items.scrolls.scrollofremovecurse.initials=RC items.scrolls.scrollofremovecurse.cleansed=Your pack glows with a cleansing light, and a malevolent energy disperses. items.scrolls.scrollofremovecurse.not_cleansed=Your pack glows with a cleansing light, but nothing happens. items.scrolls.scrollofremovecurse.desc=The incantation on this scroll will instantly strip from the reader's weapon, armor, rings and carried items any evil enchantments that might prevent the wearer from removing them. items.scrolls.scrollofteleportation.name=scroll of teleportation -items.scrolls.scrollofteleportation.initials=TP items.scrolls.scrollofteleportation.tele=In a blink of an eye you were teleported to another location of the level. items.scrolls.scrollofteleportation.no_tele=Strong magic aura of this place prevents you from teleporting! items.scrolls.scrollofteleportation.desc=The spell on this parchment instantly transports the reader to a random location on the dungeon level. It can be used to escape a dangerous situation, but the unlucky reader might find themselves in an even more dangerous place. items.scrolls.scrollofterror.name=scroll of terror -items.scrolls.scrollofterror.initials=Te items.scrolls.scrollofterror.none=The scroll emits a brilliant flash of red light. items.scrolls.scrollofterror.one=The scroll emits a brilliant flash of red light and the %s flees! items.scrolls.scrollofterror.many=The scroll emits a brilliant flash of red light and the monsters flee! items.scrolls.scrollofterror.desc=A flash of red light will overwhelm all creatures in your field of view with terror, and they will turn and flee. Attacking a fleeing enemy will dispel the effect. items.scrolls.scrollofupgrade.name=scroll of upgrade -items.scrolls.scrollofupgrade.initials=Up items.scrolls.scrollofupgrade.inv_title=Select an item to upgrade items.scrolls.scrollofupgrade.looks_better=your %s certainly looks better now items.scrolls.scrollofupgrade.desc=This scroll will upgrade a single item, improving its quality. A wand will increase in power and in number of charges; a weapon will inflict more damage or find its mark more frequently; a suit of armor will deflect additional blows; the effect of a ring on its wearer will intensify. Weapons and armor will also require less strength to use, and any curses on the item will be lifted. @@ -496,7 +562,7 @@ items.wands.wandofprismaticlight.name=wand of prismatic light items.wands.wandofprismaticlight.desc=This wand is made of a solid piece of translucent crystal, like a long chunk of smooth glass.\n\nThis wand shoots rays of light which damage and blind enemies and cut through the darkness of the dungeon, revealing hidden areas and traps. Demonic and undead foes will burn in the bright light of the wand, taking significant bonus damage. items.wands.wandofregrowth.name=wand of regrowth -items.wands.wandofregrowth.desc=This wand is made from a thin shaft of expertly carved wood. Somehow it is still alive and vibrant, bright green like a young tree's core.\n\nWhen used, this wand will consume all its charges to blast magical regrowth energy outward in a cone. This magic will cause grass, roots, and rare plants to spring to life.\n\n"When life ceases new life always begins to grow... The eternal cycle always remains! +items.wands.wandofregrowth.desc=This wand is made from a thin shaft of expertly carved wood. Somehow it is still alive and vibrant, bright green like a young tree's core.\n\nWhen used, this wand will consume all its charges to blast magical regrowth energy outward in a cone. This magic will cause grass, roots, and rare plants to spring to life.\n\n"When life ceases new life always begins to grow... The eternal cycle always remains!" items.wands.wandofregrowth$dewcatcher.name=Dewcatcher items.wands.wandofregrowth$dewcatcher.desc=Dewcatchers camouflage as grass to avoid attention, but their bulges of collected dew give them away. items.wands.wandofregrowth$seedpod.name=Seed Pod