diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/WaterOfTransmutation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/WaterOfTransmutation.java index 5d106ed8e..61e1bab23 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/WaterOfTransmutation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/blobs/WaterOfTransmutation.java @@ -139,7 +139,7 @@ public class WaterOfTransmutation extends WellWater { n.levelKnown = w.levelKnown; n.cursedKnown = w.cursedKnown; n.cursed = w.cursed; - n.imbue = w.imbue; + n.augment = w.augment; return n; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index faa9b2305..d41b061bd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -60,12 +60,8 @@ 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.armor.glyphs.AntiMagic; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Flow; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Obfuscation; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Stone; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; @@ -323,28 +319,19 @@ public class Hero extends Char { @Override public int defenseSkill( Char enemy ) { - float multiplier = 1f * RingOfEvasion.evasionMultiplier( this ); + float evasion = defenseSkill; + + evasion *= RingOfEvasion.evasionMultiplier( this ); if (paralysed > 0) { - multiplier /= 2; - } - - int aEnc = belongings.armor != null ? belongings.armor.STRReq() - STR() : 10 - STR(); - - if (aEnc > 0) { - multiplier /= Math.pow( 1.5, aEnc ); - } - int bonus = 0; - - if (belongings.armor != null && belongings.armor.hasGlyph(Swiftness.class)) - bonus += 5 + belongings.armor.level()*1.5f; - - Momentum momentum = buff(Momentum.class); - if (momentum != null){ - bonus += momentum.evasionBonus(Math.max(0, -aEnc)); + evasion /= 2; } - return Math.round((defenseSkill * multiplier) + bonus); + if (belongings.armor != null) { + evasion = belongings.armor.evasionFactor(this, evasion); + } + + return Math.round(evasion); } @Override @@ -389,20 +376,10 @@ public class Hero extends Char { float speed = super.speed(); speed *= RingOfHaste.speedMultiplier(this); - - Armor armor = belongings.armor; - - if (armor != null){ - - if (armor.hasGlyph(Swiftness.class)) { - speed *= (1.1f + 0.01f * belongings.armor.level()); - } else if (armor.hasGlyph(Flow.class) && Dungeon.level.water[pos]){ - speed *= (1.5f + 0.05f * belongings.armor.level()); - } - } - int aEnc = armor != null ? armor.STRReq() - STR() : 0; - if (aEnc > 0) speed /= Math.pow( 1.2, aEnc ); + if (belongings.armor != null) { + speed = belongings.armor.speedFactor(this, speed); + } Momentum momentum = buff(Momentum.class); if (momentum != null){ @@ -1301,9 +1278,10 @@ public class Hero extends Char { public int stealth() { int stealth = super.stealth(); - if (belongings.armor != null && belongings.armor.hasGlyph(Obfuscation.class)){ - stealth += 1 + belongings.armor.level()/3; + if (belongings.armor != null){ + stealth = Math.round(belongings.armor.stealthFactor(this, stealth)); } + return stealth; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java deleted file mode 100644 index 2a1229875..000000000 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2018 Evan Debenham - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - */ - -package com.shatteredpixel.shatteredpixeldungeon.items; - -import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; -import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; -import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; -import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline; -import com.shatteredpixel.shatteredpixeldungeon.ui.Window; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -import com.shatteredpixel.shatteredpixeldungeon.windows.IconTitle; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; -import com.watabou.noosa.audio.Sample; - -import java.util.ArrayList; - -public class Weightstone extends Item { - - private static final float TIME_TO_APPLY = 2; - - private static final String AC_APPLY = "APPLY"; - - { - image = ItemSpriteSheet.WEIGHT; - - stackable = true; - - bones = true; - } - - @Override - public ArrayList actions( Hero hero ) { - ArrayList actions = super.actions( hero ); - actions.add( AC_APPLY ); - return actions; - } - - @Override - public void execute( Hero hero, String action ) { - - super.execute( hero, action ); - - if (action.equals(AC_APPLY)) { - - curUser = hero; - GameScene.selectItem( itemSelector, WndBag.Mode.WEAPON, Messages.get(this, "select") ); - - } - } - - @Override - public boolean isUpgradable() { - return false; - } - - @Override - public boolean isIdentified() { - return true; - } - - private void apply( Weapon weapon, boolean forSpeed ) { - - detach( curUser.belongings.backpack ); - - if (forSpeed) { - weapon.imbue = Weapon.Imbue.LIGHT; - GLog.p( Messages.get(this, "light") ); - } else { - weapon.imbue = Weapon.Imbue.HEAVY; - GLog.p( Messages.get(this, "heavy") ); - } - - curUser.sprite.operate( curUser.pos ); - Sample.INSTANCE.play( Assets.SND_MISS ); - - curUser.spend( TIME_TO_APPLY ); - curUser.busy(); - } - - @Override - public int price() { - return 50 * quantity; - } - - private final WndBag.Listener itemSelector = new WndBag.Listener() { - @Override - public void onSelect( Item item ) { - if (item != null) { - GameScene.show( new WndBalance( (Weapon)item ) ); - } - } - }; - - public class WndBalance extends Window { - - private static final int WIDTH = 120; - private static final int MARGIN = 2; - private static final int BUTTON_WIDTH = WIDTH - MARGIN * 2; - private static final int BUTTON_HEIGHT = 20; - - public WndBalance( final Weapon weapon ) { - super(); - - IconTitle titlebar = new IconTitle( weapon ); - titlebar.setRect( 0, 0, WIDTH, 0 ); - add( titlebar ); - - RenderedTextMultiline tfMesage = PixelScene.renderMultiline( Messages.get(this, "choice"), 8 ); - tfMesage.maxWidth(WIDTH - MARGIN * 2); - tfMesage.setPos(MARGIN, titlebar.bottom() + MARGIN); - add( tfMesage ); - - float pos = tfMesage.top() + tfMesage.height(); - - if (weapon.imbue != Weapon.Imbue.LIGHT) { - RedButton btnSpeed = new RedButton( Messages.get(this, "light") ) { - @Override - protected void onClick() { - hide(); - Weightstone.this.apply( weapon, true ); - } - }; - btnSpeed.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); - add( btnSpeed ); - - pos = btnSpeed.bottom(); - } - - if (weapon.imbue != Weapon.Imbue.HEAVY) { - RedButton btnAccuracy = new RedButton( Messages.get(this, "heavy") ) { - @Override - protected void onClick() { - hide(); - Weightstone.this.apply( weapon, false ); - } - }; - btnAccuracy.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); - add( btnAccuracy ); - - pos = btnAccuracy.bottom(); - } - - RedButton btnCancel = new RedButton( Messages.get(this, "cancel") ) { - @Override - protected void onClick() { - hide(); - } - }; - btnCancel.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); - add( btnCancel ); - - resize( WIDTH, (int)btnCancel.bottom() + MARGIN ); - } - - protected void onSelect( int index ) {}; - } -} \ No newline at end of file diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index 4fbbdc5b8..c5afe18c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; @@ -68,13 +69,37 @@ public class Armor extends EquipableItem { protected static final String AC_DETACH = "DETACH"; + public enum Augment { + EVASION (1.5f , -1f), + DEFENSE (-1.5f, 1f), + NONE (0f , 0f); + + private float evasionFactor; + private float defenceFactor; + + Augment(float eva, float df){ + evasionFactor = eva; + defenceFactor = df; + } + + //TODO balance on this seems good, but needs testing. + public int evasionFactor(int level){ + return Math.round((2 + level) * evasionFactor); + } + + public int defenseFactor(int level){ + return Math.round((2 + level) * defenceFactor); + } + } + + public Augment augment = Augment.NONE; + public Glyph glyph; + private BrokenSeal seal; + public int tier; private int hitsToKnow = HITS_TO_KNOW; - public Glyph glyph; - private BrokenSeal seal; - public Armor( int tier ) { this.tier = tier; } @@ -82,6 +107,7 @@ public class Armor extends EquipableItem { private static final String UNFAMILIRIARITY = "unfamiliarity"; private static final String GLYPH = "glyph"; private static final String SEAL = "seal"; + private static final String AUGMENT = "augment"; @Override public void storeInBundle( Bundle bundle ) { @@ -89,16 +115,16 @@ public class Armor extends EquipableItem { bundle.put( UNFAMILIRIARITY, hitsToKnow ); bundle.put( GLYPH, glyph ); bundle.put( SEAL, seal); + bundle.put( AUGMENT, augment); } @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle(bundle); - if ((hitsToKnow = bundle.getInt( UNFAMILIRIARITY )) == 0) { - hitsToKnow = HITS_TO_KNOW; - } + hitsToKnow = bundle.getInt( UNFAMILIRIARITY ); inscribe((Glyph) bundle.get(GLYPH)); seal = (BrokenSeal)bundle.get(SEAL); + augment = bundle.getEnum(AUGMENT, Augment.class); } @Override @@ -220,11 +246,12 @@ public class Armor extends EquipableItem { } public int DRMax(int lvl){ - int effectiveTier = tier; - if (glyph != null) effectiveTier += glyph.tierDRAdjust(); - effectiveTier = Math.max(0, effectiveTier); - - return Math.max(DRMin(lvl), effectiveTier * (2 + lvl)); + int max = tier * (2 + lvl) + augment.defenseFactor(lvl); + if (lvl > max){ + return ((lvl - max)+1)/2; + } else { + return max; + } } public final int DRMin(){ @@ -232,10 +259,57 @@ public class Armor extends EquipableItem { } public int DRMin(int lvl){ - if (glyph != null && glyph instanceof Stone) - return 2*lvl; - else + int max = DRMax(lvl); + if (lvl >= max){ + return (lvl - max); + } else { return lvl; + } + } + + public float evasionFactor( Char owner, float evasion ){ + + if (owner instanceof Hero){ + int aEnc = STRReq() - ((Hero) owner).STR(); + if (aEnc > 0) evasion /= Math.pow(1.5, aEnc); + + Momentum momentum = owner.buff(Momentum.class); + if (momentum != null){ + evasion += momentum.evasionBonus(Math.max(0, -aEnc)); + } + } + + if (hasGlyph(Swiftness.class)) { + evasion += 5 + level()*1.5f; + } + + return evasion + augment.evasionFactor(level()); + } + + public float speedFactor( Char owner, float speed ){ + + if (owner instanceof Hero) { + int aEnc = STRReq() - ((Hero) owner).STR(); + if (aEnc > 0) speed /= Math.pow(1.2, aEnc); + } + + if (hasGlyph(Swiftness.class)) { + speed *= (1.1f + 0.01f * level()); + } else if (hasGlyph(Flow.class) && Dungeon.level.water[owner.pos]){ + speed *= (1.5f + 0.05f * level()); + } + + return speed; + + } + + public float stealthFactor( Char owner, float stealth ){ + + if (hasGlyph(Obfuscation.class)){ + stealth += 1 + level()/3f; + } + + return stealth; } @Override @@ -299,6 +373,16 @@ public class Armor extends EquipableItem { info += " " + Messages.get(Armor.class, "probably_too_heavy"); } } + + switch (augment) { + case EVASION: + info += "\n\n" + Messages.get(Armor.class, "evasion"); + break; + case DEFENSE: + info += "\n\n" + Messages.get(Armor.class, "defense"); + break; + case NONE: + } if (glyph != null && (cursedKnown || !glyph.curse())) { info += "\n\n" + Messages.get(Armor.class, "inscribed", glyph.name()); @@ -359,12 +443,9 @@ public class Armor extends EquipableItem { public int STRReq(int lvl){ lvl = Math.max(0, lvl); - float effectiveTier = tier; - if (glyph != null) effectiveTier += glyph.tierSTRAdjust(); - effectiveTier = Math.max(0, effectiveTier); //strength req decreases at +1,+3,+6,+10,etc. - return (8 + Math.round(effectiveTier * 2)) - (int)(Math.sqrt(8 * lvl + 1) - 1)/2; + return (8 + Math.round(tier * 2)) - (int)(Math.sqrt(8 * lvl + 1) - 1)/2; } @Override @@ -421,6 +502,7 @@ public class Armor extends EquipableItem { return glyph != null && (cursedKnown || !glyph.curse()) ? glyph.glowing() : null; } + //FIXME need to adjust glyphs given armor augmentation changes public static abstract class Glyph implements Bundlable { private static final Class[] glyphs = new Class[]{ @@ -467,14 +549,6 @@ public class Armor extends EquipableItem { public abstract ItemSprite.Glowing glowing(); - public int tierDRAdjust(){ - return 0; - } - - public float tierSTRAdjust(){ - return 0; - } - public boolean checkOwner( Char owner ) { if (!owner.isAlive() && owner instanceof Hero) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java index d3601c37c..e1a60d379 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java @@ -128,21 +128,19 @@ abstract public class ClassArmor extends Armor { @Override public int STRReq(int lvl) { lvl = Math.max(0, lvl); - float effectiveTier = armorTier; - if (glyph != null) effectiveTier += glyph.tierSTRAdjust(); - effectiveTier = Math.max(0, effectiveTier); //strength req decreases at +1,+3,+6,+10,etc. - return (8 + Math.round(effectiveTier * 2)) - (int)(Math.sqrt(8 * lvl + 1) - 1)/2; + return (8 + Math.round(armorTier * 2)) - (int)(Math.sqrt(8 * lvl + 1) - 1)/2; } @Override public int DRMax(int lvl){ - int effectiveTier = armorTier; - if (glyph != null) effectiveTier += glyph.tierDRAdjust(); - effectiveTier = Math.max(0, effectiveTier); - - return Math.max(DRMin(lvl), effectiveTier * (2 + lvl)); + int max = armorTier * (2 + lvl) + augment.defenseFactor(lvl); + if (lvl > max){ + return ((lvl - max)+1)/2; + } else { + return max; + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Flow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Flow.java index f1a3a7bf1..e25464adf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Flow.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Flow.java @@ -31,7 +31,7 @@ public class Flow extends Armor.Glyph { @Override public int proc(Armor armor, Char attacker, Char defender, int damage) { - //no proc effect, see hero.speed for effect. + //no proc effect, see armor.speedfactor for effect. return damage; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Obfuscation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Obfuscation.java index 0606c349c..82e0af569 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Obfuscation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Obfuscation.java @@ -31,7 +31,7 @@ public class Obfuscation extends Armor.Glyph { @Override public int proc(Armor armor, Char attacker, Char defender, int damage) { - //no proc effect, see hero.stealth for effect. + //no proc effect, see armor.stealthfactor for effect. return damage; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Swiftness.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Swiftness.java index d6b60259f..1b0dfca88 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Swiftness.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Swiftness.java @@ -31,20 +31,10 @@ public class Swiftness extends Armor.Glyph { @Override public int proc(Armor armor, Char attacker, Char defender, int damage) { - //no proc effect, see hero.defenseskill and hero.speed for effect. + //no proc effect, see hero.defenseskill and armor.speedfactor for effect. return damage; } - @Override - public int tierDRAdjust() { - return -2; - } - - @Override - public float tierSTRAdjust() { - return -1; - } - @Override public ItemSprite.Glowing glowing() { return YELLOW; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java index 73d4d1a4d..ba04bd01a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java @@ -41,9 +41,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Flow; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Obfuscation; -import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Swiftness; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfPsionicBlast; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; @@ -552,11 +549,7 @@ public class DriedRose extends Artifact { float speed = super.speed(); if (rose != null && rose.armor != null){ - if (rose.armor.hasGlyph(Swiftness.class)) { - speed *= (1.1f + 0.01f * rose.armor.level()); - } else if (rose.armor.hasGlyph(Flow.class) && Dungeon.level.water[pos]){ - speed *= (1.5f + 0.05f * rose.armor.level()); - } + speed = rose.armor.speedFactor(this, speed); } return speed; @@ -566,8 +559,8 @@ public class DriedRose extends Artifact { public int defenseSkill(Char enemy) { int defense = super.defenseSkill(enemy); - if (defense != 0 && rose != null && rose.armor != null && rose.armor.hasGlyph(Swiftness.class)){ - defense += 5 + rose.armor.level()*1.5f; + if (defense != 0 && rose != null && rose.armor != null ){ + defense = Math.round(rose.armor.evasionFactor( this, defense )); } return defense; @@ -577,8 +570,8 @@ public class DriedRose extends Artifact { public int stealth() { int stealth = super.stealth(); - if (rose != null && rose.armor != null && rose.armor.hasGlyph(Obfuscation.class)){ - stealth += 1 + rose.armor.level()/3; + if (rose != null && rose.armor != null){ + stealth = Math.round(rose.armor.stealthFactor(this, stealth)); } return stealth; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/InventoryStone.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/InventoryStone.java index b5f1ea8ad..5989f39c4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/InventoryStone.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/InventoryStone.java @@ -64,10 +64,13 @@ public abstract class InventoryStone extends Runestone { GameScene.selectItem( itemSelector, mode, inventoryTitle ); } - private void useAnimation() { + protected void useAnimation() { curUser.spend( 1f ); curUser.busy(); curUser.sprite.operate(curUser.pos); + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); } protected abstract void onItemSelected( Item item ); @@ -85,10 +88,6 @@ public abstract class InventoryStone extends Runestone { if (item != null) { ((InventoryStone)curItem).onItemSelected( item ); - ((InventoryStone)curItem).useAnimation(); - - Sample.INSTANCE.play( Assets.SND_READ ); - Invisibility.dispel(); } else{ curItem.collect( curUser.belongings.backpack ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAugmentation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAugmentation.java new file mode 100644 index 000000000..40ece9e22 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAugmentation.java @@ -0,0 +1,142 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.items.stones; + +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.shatteredpixel.shatteredpixeldungeon.windows.IconTitle; +import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; + +public class StoneOfAugmentation extends InventoryStone { + + { + mode = WndBag.Mode.ENCHANTABLE; + image = ItemSpriteSheet.STONE_YNGVI; + } + + @Override + protected void onItemSelected(Item item) { + + GameScene.show(new WndAugment( item)); + + } + + public void apply( Weapon weapon, Weapon.Augment augment ) { + + weapon.augment = augment; + useAnimation(); + ScrollOfUpgrade.upgrade(curUser); + + } + + public void apply( Armor armor, Armor.Augment augment ) { + + armor.augment = augment; + useAnimation(); + ScrollOfUpgrade.upgrade(curUser); + } + + public class WndAugment extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 2; + private static final int BUTTON_WIDTH = WIDTH - MARGIN * 2; + private static final int BUTTON_HEIGHT = 20; + + public WndAugment( final Item toAugment ) { + super(); + + IconTitle titlebar = new IconTitle( toAugment ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + RenderedTextMultiline tfMesage = PixelScene.renderMultiline( Messages.get(this, "choice"), 8 ); + tfMesage.maxWidth(WIDTH - MARGIN * 2); + tfMesage.setPos(MARGIN, titlebar.bottom() + MARGIN); + add( tfMesage ); + + float pos = tfMesage.top() + tfMesage.height(); + + if (toAugment instanceof Weapon){ + for (final Weapon.Augment aug : Weapon.Augment.values()){ + if (((Weapon) toAugment).augment != aug){ + RedButton btnSpeed = new RedButton( Messages.get(this, aug.name()) ) { + @Override + protected void onClick() { + hide(); + StoneOfAugmentation.this.apply( (Weapon)toAugment, aug ); + } + }; + btnSpeed.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); + add( btnSpeed ); + + pos = btnSpeed.bottom(); + } + } + + } else if (toAugment instanceof Armor){ + for (final Armor.Augment aug : Armor.Augment.values()){ + if (((Armor) toAugment).augment != aug){ + RedButton btnSpeed = new RedButton( Messages.get(this, aug.name()) ) { + @Override + protected void onClick() { + hide(); + StoneOfAugmentation.this.apply( (Armor) toAugment, aug ); + } + }; + btnSpeed.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); + add( btnSpeed ); + + pos = btnSpeed.bottom(); + } + } + } + + RedButton btnCancel = new RedButton( Messages.get(this, "cancel") ) { + @Override + protected void onClick() { + hide(); + StoneOfAugmentation.this.collect(); + } + }; + btnCancel.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT ); + add( btnCancel ); + + resize( WIDTH, (int)btnCancel.bottom() + MARGIN ); + } + + @Override + public void onBackPressed() { + StoneOfAugmentation.this.collect(); + super.onBackPressed(); + } + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfEnchantment.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfEnchantment.java index 33f6eeb0a..06006c22f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfEnchantment.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfEnchantment.java @@ -54,12 +54,13 @@ public class StoneOfEnchantment extends InventoryStone { curUser.sprite.emitter().start( Speck.factory( Speck.LIGHT ), 0.1f, 5 ); Enchanting.show( curUser, item ); - //FIXME add this to translations if (item instanceof Weapon) { GLog.p(Messages.get(this, "weapon")); } else { GLog.p(Messages.get(this, "armor")); } + useAnimation(); + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index 55473b820..8b69064ed 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -58,21 +58,19 @@ abstract public class Weapon extends KindOfWeapon { private static final int HITS_TO_KNOW = 20; - private static final String TXT_TO_STRING = "%s :%d"; - public float ACC = 1f; // Accuracy modifier public float DLY = 1f; // Speed modifier public int RCH = 1; // Reach modifier (only applies to melee hits) - public enum Imbue { - NONE (1.0f, 1.00f), - LIGHT (0.7f, 0.67f), - HEAVY (1.5f, 1.67f); + public enum Augment { + SPEED (0.7f, 0.67f), + DAMAGE (1.5f, 1.67f), + NONE (1.0f, 1.00f); private float damageFactor; private float delayFactor; - Imbue(float dmg, float dly){ + Augment(float dmg, float dly){ damageFactor = dmg; delayFactor = dly; } @@ -85,7 +83,8 @@ abstract public class Weapon extends KindOfWeapon { return dly * delayFactor; } } - public Imbue imbue = Imbue.NONE; + + public Augment augment = Augment.NONE; private int hitsToKnow = HITS_TO_KNOW; @@ -111,24 +110,29 @@ abstract public class Weapon extends KindOfWeapon { private static final String UNFAMILIRIARITY = "unfamiliarity"; private static final String ENCHANTMENT = "enchantment"; - private static final String IMBUE = "imbue"; + private static final String AUGMENT = "augment"; @Override public void storeInBundle( Bundle bundle ) { super.storeInBundle( bundle ); bundle.put( UNFAMILIRIARITY, hitsToKnow ); bundle.put( ENCHANTMENT, enchantment ); - bundle.put( IMBUE, imbue ); + bundle.put( AUGMENT, augment ); } @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle( bundle ); - if ((hitsToKnow = bundle.getInt( UNFAMILIRIARITY )) == 0) { - hitsToKnow = HITS_TO_KNOW; - } + hitsToKnow = bundle.getInt( UNFAMILIRIARITY ); enchantment = (Enchantment)bundle.get( ENCHANTMENT ); - imbue = bundle.getEnum( IMBUE, Imbue.class ); + + //pre-0.6.5 saves + if (bundle.contains( "imbue" )){ + if (bundle.getString( "imbue" ).equals( "LIGHT" )) augment = Augment.SPEED; + else augment = Augment.DAMAGE; + } else { + augment = bundle.getEnum(AUGMENT, Augment.class); + } } @Override @@ -156,7 +160,7 @@ abstract public class Weapon extends KindOfWeapon { encumbrance = STRReq() - ((Hero)owner).STR(); } - float DLY = imbue.delayFactor(this.DLY); + float DLY = augment.delayFactor(this.DLY); DLY = RingOfFuror.modifyAttackDelay(DLY, owner); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java index 97fa08c90..4f7421743 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/AssassinsBlade.java @@ -49,7 +49,7 @@ public class AssassinsBlade extends MeleeWeapon { if (enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero)) { //deals 50% toward max to max on surprise, instead of min to max. int diff = max() - min(); - int damage = imbue.damageFactor(Random.NormalIntRange( + int damage = augment.damageFactor(Random.NormalIntRange( min() + Math.round(diff*0.50f), max())); int exStr = hero.STR() - STRReq(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java index ca6c9a741..2b5a6651f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dagger.java @@ -51,7 +51,7 @@ public class Dagger extends MeleeWeapon { if (enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero)) { //deals 75% toward max to max on surprise, instead of min to max. int diff = max() - min(); - int damage = imbue.damageFactor(Random.NormalIntRange( + int damage = augment.damageFactor(Random.NormalIntRange( min() + Math.round(diff*0.75f), max())); int exStr = hero.STR() - STRReq(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java index 1421798ac..14ef42a4b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Dirk.java @@ -49,7 +49,7 @@ public class Dirk extends MeleeWeapon { if (enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero)) { //deals 67% toward max to max on surprise, instead of min to max. int diff = max() - min(); - int damage = imbue.damageFactor(Random.NormalIntRange( + int damage = augment.damageFactor(Random.NormalIntRange( min() + Math.round(diff*0.67f), max())); int exStr = hero.STR() - STRReq(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java index b82b89a81..6c87f6bba 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java @@ -52,7 +52,7 @@ public class MeleeWeapon extends Weapon { @Override public int damageRoll(Char owner) { - int damage = imbue.damageFactor(super.damageRoll( owner )); + int damage = augment.damageFactor(super.damageRoll( owner )); if (owner instanceof Hero) { int exStr = ((Hero)owner).STR() - STRReq(); @@ -70,7 +70,7 @@ public class MeleeWeapon extends Weapon { String info = desc(); if (levelKnown) { - info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_known", tier, imbue.damageFactor(min()), imbue.damageFactor(max()), STRReq()); + info += "\n\n" + Messages.get(MeleeWeapon.class, "stats_known", tier, augment.damageFactor(min()), augment.damageFactor(max()), STRReq()); if (STRReq() > Dungeon.hero.STR()) { info += " " + Messages.get(Weapon.class, "too_heavy"); } else if (Dungeon.hero.STR() > STRReq()){ @@ -86,12 +86,12 @@ public class MeleeWeapon extends Weapon { String stats_desc = Messages.get(this, "stats_desc"); if (!stats_desc.equals("")) info+= "\n\n" + stats_desc; - switch (imbue) { - case LIGHT: - info += "\n\n" + Messages.get(Weapon.class, "lighter"); + switch (augment) { + case SPEED: + info += "\n\n" + Messages.get(Weapon.class, "faster"); break; - case HEAVY: - info += "\n\n" + Messages.get(Weapon.class, "heavier"); + case DAMAGE: + info += "\n\n" + Messages.get(Weapon.class, "stronger"); break; case NONE: } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java index 2484c94b5..7864d9bc4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java @@ -132,12 +132,12 @@ public class Boomerang extends MissileWeapon { @Override public String desc() { String info = super.desc(); - switch (imbue) { - case LIGHT: - info += "\n\n" + Messages.get(Weapon.class, "lighter"); + switch (augment) { + case SPEED: + info += "\n\n" + Messages.get(Weapon.class, "faster"); break; - case HEAVY: - info += "\n\n" + Messages.get(Weapon.class, "heavier"); + case DAMAGE: + info += "\n\n" + Messages.get(Weapon.class, "stronger"); break; case NONE: } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java index 79777cf41..20b0fdccf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -182,7 +182,7 @@ abstract public class MissileWeapon extends Weapon { @Override public int damageRoll(Char owner) { - int damage = imbue.damageFactor(super.damageRoll( owner )); + int damage = augment.damageFactor(super.damageRoll( owner )); damage = Math.round( damage * RingOfSharpshooting.damageMultiplier( owner )); if (owner instanceof Hero && @@ -253,8 +253,8 @@ abstract public class MissileWeapon extends Weapon { String info = desc(); info += "\n\n" + Messages.get( MissileWeapon.class, "stats", - Math.round(imbue.damageFactor(min()) * RingOfSharpshooting.damageMultiplier( Dungeon.hero )), - Math.round(imbue.damageFactor(max()) * RingOfSharpshooting.damageMultiplier( Dungeon.hero )), + Math.round(augment.damageFactor(min()) * RingOfSharpshooting.damageMultiplier( Dungeon.hero )), + Math.round(augment.damageFactor(max()) * RingOfSharpshooting.damageMultiplier( Dungeon.hero )), STRReq()); if (STRReq() > Dungeon.hero.STR()) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java index 81cc510c1..2cfa82f0b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java @@ -69,7 +69,7 @@ public class ThrowingKnife extends MissileWeapon { if (enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero)) { //deals 75% toward max to max on surprise, instead of min to max. int diff = max() - min(); - int damage = imbue.damageFactor(Random.NormalIntRange( + int damage = augment.damageFactor(Random.NormalIntRange( min() + Math.round(diff*0.75f), max())); damage = Math.round(damage * RingOfSharpshooting.damageMultiplier( hero )); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java index 513a97fbb..18d608bdc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java @@ -34,7 +34,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.MerchantsBeacon; import com.shatteredpixel.shatteredpixeldungeon.items.Stylus; import com.shatteredpixel.shatteredpixeldungeon.items.Torch; -import com.shatteredpixel.shatteredpixeldungeon.items.Weightstone; import com.shatteredpixel.shatteredpixeldungeon.items.armor.LeatherArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.MailArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.PlateArmor; @@ -53,6 +52,7 @@ 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.stones.Runestone; +import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAugmentation; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Greatsword; @@ -244,14 +244,8 @@ public class ShopRoom extends SpecialRoom { break; } - - if (Dungeon.depth == 6) { - itemsToSpawn.add( new Ankh() ); - itemsToSpawn.add( new Weightstone() ); - } else { - itemsToSpawn.add(Random.Int(2) == 0 ? new Ankh() : new Weightstone()); - } - + itemsToSpawn.add( new Ankh() ); + itemsToSpawn.add( new StoneOfAugmentation() ); TimekeepersHourglass hourglass = Dungeon.hero.belongings.getItem(TimekeepersHourglass.class); if (hourglass != null){ diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties index 94e7a3506..123f7428e 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties @@ -77,6 +77,8 @@ items.armor.armor.avg_absorb=Typically this armor blocks _%1$d-%2$d damage_ and items.armor.armor.too_heavy=Because of your inadequate strength wearing this armor will decrease your ability to move, evade, and defend. items.armor.armor.probably_too_heavy=Probably this armor is too heavy for you. items.armor.armor.excess_str=Because of your excess strength, you are _more evasive_ while wearing this armor. +items.armor.armor.evasion=It is augmented to enhance _evasion._ +items.armor.armor.defense=It is augmented to enhance _defense._ items.armor.armor.inscribed=It is inscribed with a _%s._ items.armor.armor.cursed_worn=Because this armor is cursed, you are powerless to remove it. items.armor.armor.cursed=You can feel a malevolent magic lurking within this armor. @@ -656,6 +658,17 @@ items.scrolls.scrollofupgrade.desc=This scroll will upgrade a single item, impro ###runestones items.stones.inventorystone.ac_use=USE +items.stones.stoneofaugmentation.name=Stone of Augmentation +items.stones.stoneofaugmentation.inv_title=Augment an item +items.stones.stoneofaugmentation.desc=This runestone possesses pontent magic, which can augment equipment to enhance one property at the cost of another.\n\nUsing on a weapon will allow you to enhance either speed or damage.\n\nUsing on armor will allow you to enhance either defense or evasion. +items.stones.stoneofaugmentation$wndaugment.choice=What would you like to enhance? +items.stones.stoneofaugmentation$wndaugment.speed=Speed +items.stones.stoneofaugmentation$wndaugment.damage=Damage +items.stones.stoneofaugmentation$wndaugment.evasion=Evasion +items.stones.stoneofaugmentation$wndaugment.defense=Defense +items.stones.stoneofaugmentation$wndaugment.none=Remove Augmentation +items.stones.stoneofaugmentation$wndaugment.cancel=Never mind + items.stones.stoneofenchantment.name=Stone of Enchantment items.stones.stoneofenchantment.inv_title=Enchant an item items.stones.stoneofenchantment.weapon=Your weapon glows in the darkness! @@ -1023,8 +1036,8 @@ items.weapon.weapon.excess_str=Because of your excess strength, you will deal up items.weapon.weapon.incompatible=Interaction of different types of magic has negated the enchantment on this weapon! items.weapon.weapon.cursed_worn=Because this weapon is cursed, you are powerless to remove it. items.weapon.weapon.cursed=You can feel a malevolent magic lurking within this weapon. -items.weapon.weapon.lighter=It was balanced to be _lighter._ -items.weapon.weapon.heavier=It was balanced to be _heavier._ +items.weapon.weapon.faster=It is augmented to enhance _speed._ +items.weapon.weapon.stronger=It is augmented to enhance _damage._ items.weapon.weapon.enchanted=It has a _%s._ items.weapon.weapon$enchantment.enchant=enchantment @@ -1139,14 +1152,3 @@ items.tomeofmastery.desc=This worn leather book is not that thick, but you feel items.torch.name=torch items.torch.ac_light=LIGHT items.torch.desc=An adventuring staple, when a dungeon goes dark, a torch can help lead the way. - -items.weightstone.name=weightstone -items.weightstone.ac_apply=APPLY -items.weightstone.select=Select a weapon -items.weightstone.light=you balanced your weapon to make it lighter -items.weightstone.heavy=you balanced your weapon to make it heavier -items.weightstone.desc=Using a weightstone, you can balance your melee weapon to make it lighter or heavier, increasing either speed or damage at the expense of the other. -items.weightstone$wndbalance.choice=How would you like to balance your weapon? -items.weightstone$wndbalance.light=Lighter -items.weightstone$wndbalance.heavy=Heavier -items.weightstone$wndbalance.cancel=Never mind