v0.8.1: More Enchant/Glyph/Wand balance changes:
- Knockback effects (blast wave, elastic, repulsion) now close doors if the knockback target was inside one. - Swiftness now requires no enemies within 2 tiles, up from 1 tile - Camouflage now applies regular invisibility, but duration scaling is halved - Flow speed multiplier increased to 2 + 0.25*lvl from 2. - Antimagic defense reduced by ~20% - Thorns proc rate scaling with level reduced by ~50% - Corrupting proc rate scaling with level increased by ~20%
This commit is contained in:
parent
a0d45fa48a
commit
3925015dda
|
@ -57,7 +57,7 @@ items.armor.glyphs.stone.name=%s of stone
|
||||||
items.armor.glyphs.stone.desc=This glyph surrounds the armor with heavy magical stone that makes dodging impossible, but blocks damage in proportion with evasion.
|
items.armor.glyphs.stone.desc=This glyph surrounds the armor with heavy magical stone that makes dodging impossible, but blocks damage in proportion with evasion.
|
||||||
|
|
||||||
items.armor.glyphs.swiftness.name=%s of swiftness
|
items.armor.glyphs.swiftness.name=%s of swiftness
|
||||||
items.armor.glyphs.swiftness.desc=This glyph enhances the speed of the wearer whenever they aren't next to an enemy.
|
items.armor.glyphs.swiftness.desc=This glyph enhances the speed of the wearer whenever they aren't NEAR to an enemy.
|
||||||
|
|
||||||
items.armor.glyphs.thorns.name=%s of thorns
|
items.armor.glyphs.thorns.name=%s of thorns
|
||||||
items.armor.glyphs.thorns.desc=This powerful glyph harms attackers, causing them to slowly bleed when they attack the wearer.
|
items.armor.glyphs.thorns.desc=This powerful glyph harms attackers, causing them to slowly bleed when they attack the wearer.
|
||||||
|
|
|
@ -63,6 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
import com.watabou.noosa.particles.Emitter;
|
import com.watabou.noosa.particles.Emitter;
|
||||||
import com.watabou.utils.Bundlable;
|
import com.watabou.utils.Bundlable;
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
import com.watabou.utils.Random;
|
import com.watabou.utils.Random;
|
||||||
import com.watabou.utils.Reflection;
|
import com.watabou.utils.Reflection;
|
||||||
|
|
||||||
|
@ -318,15 +319,16 @@ public class Armor extends EquipableItem {
|
||||||
|
|
||||||
if (hasGlyph(Swiftness.class, owner)) {
|
if (hasGlyph(Swiftness.class, owner)) {
|
||||||
boolean enemyNear = false;
|
boolean enemyNear = false;
|
||||||
|
PathFinder.buildDistanceMap(owner.pos, Dungeon.level.passable, 2);
|
||||||
for (Char ch : Actor.chars()){
|
for (Char ch : Actor.chars()){
|
||||||
if (Dungeon.level.adjacent(ch.pos, owner.pos) && owner.alignment != ch.alignment){
|
if ( PathFinder.distance[ch.pos] != Integer.MAX_VALUE && owner.alignment != ch.alignment){
|
||||||
enemyNear = true;
|
enemyNear = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!enemyNear) speed *= (1.2f + 0.04f * buffedLvl());
|
if (!enemyNear) speed *= (1.2f + 0.04f * buffedLvl());
|
||||||
} else if (hasGlyph(Flow.class, owner) && Dungeon.level.water[owner.pos]){
|
} else if (hasGlyph(Flow.class, owner) && Dungeon.level.water[owner.pos]){
|
||||||
speed *= 2f;
|
speed *= (2f + 0.25f*buffedLvl());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasGlyph(Bulk.class, owner) &&
|
if (hasGlyph(Bulk.class, owner) &&
|
||||||
|
|
|
@ -93,7 +93,7 @@ public class AntiMagic extends Armor.Glyph {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int drRoll( int level ){
|
public static int drRoll( int level ){
|
||||||
return Random.NormalIntRange(level, 4 + (level*2));
|
return Random.NormalIntRange(level, 3 + Math.round(level*1.5f));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -45,59 +45,5 @@ public class Camouflage extends Armor.Glyph {
|
||||||
return GREEN;
|
return GREEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Camo extends Invisibility {
|
|
||||||
|
|
||||||
{
|
|
||||||
announced = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int pos;
|
|
||||||
private int left;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean act() {
|
|
||||||
left--;
|
|
||||||
if (left == 0 || target.pos != pos) {
|
|
||||||
detach();
|
|
||||||
} else {
|
|
||||||
spend(TICK);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int time){
|
|
||||||
left = time;
|
|
||||||
pos = target.pos;
|
|
||||||
Sample.INSTANCE.play( Assets.Sounds.MELD );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return Messages.get(this, "name");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String desc() {
|
|
||||||
return Messages.get(this, "desc", dispTurns(left));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String POS = "pos";
|
|
||||||
private static final String LEFT = "left";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void storeInBundle( Bundle bundle ) {
|
|
||||||
super.storeInBundle( bundle );
|
|
||||||
bundle.put( POS, pos );
|
|
||||||
bundle.put( LEFT, left );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void restoreFromBundle( Bundle bundle ) {
|
|
||||||
super.restoreFromBundle( bundle );
|
|
||||||
pos = bundle.getInt( POS );
|
|
||||||
left = bundle.getInt( LEFT );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,9 @@ public class Repulsion extends Armor.Glyph {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int proc( Armor armor, Char attacker, Char defender, int damage) {
|
public int proc( Armor armor, Char attacker, Char defender, int damage) {
|
||||||
|
// lvl 0 - 20%
|
||||||
|
// lvl 1 - 33%
|
||||||
|
// lvl 2 - 43%
|
||||||
int level = Math.max( 0, armor.buffedLvl() );
|
int level = Math.max( 0, armor.buffedLvl() );
|
||||||
|
|
||||||
if (Random.Int( level + 5 ) >= 4){
|
if (Random.Int( level + 5 ) >= 4){
|
||||||
|
|
|
@ -38,9 +38,9 @@ public class Thorns extends Armor.Glyph {
|
||||||
int level = Math.max(0, armor.buffedLvl());
|
int level = Math.max(0, armor.buffedLvl());
|
||||||
|
|
||||||
// lvl 0 - 16.7%
|
// lvl 0 - 16.7%
|
||||||
// lvl 1 - 28.6%
|
// lvl 1 - 23.1%
|
||||||
// lvl 2 - 37.5%
|
// lvl 2 - 28.5%
|
||||||
if ( Random.Int( level + 6) >= 5) {
|
if ( Random.Int( level + 12) >= 10) {
|
||||||
|
|
||||||
Buff.affect( attacker, Bleeding.class).set( 4 + level );
|
Buff.affect( attacker, Bleeding.class).set( 4 + level );
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,8 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Pushing;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Elastic;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Elastic;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Door;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.TenguDartTrap;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.TenguDartTrap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
|
@ -156,11 +158,15 @@ public class WandOfBlastWave extends DamageWand {
|
||||||
ch.sprite.place(ch.pos);
|
ch.sprite.place(ch.pos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int oldPos = ch.pos;
|
||||||
ch.pos = newPos;
|
ch.pos = newPos;
|
||||||
if (finalCollided && ch.isAlive()) {
|
if (finalCollided && ch.isAlive()) {
|
||||||
ch.damage(Random.NormalIntRange((finalDist + 1) / 2, finalDist), this);
|
ch.damage(Random.NormalIntRange((finalDist + 1) / 2, finalDist), this);
|
||||||
Paralysis.prolong(ch, Paralysis.class, Random.NormalIntRange((finalDist + 1) / 2, finalDist));
|
Paralysis.prolong(ch, Paralysis.class, Random.NormalIntRange((finalDist + 1) / 2, finalDist));
|
||||||
}
|
}
|
||||||
|
if (Dungeon.level.map[oldPos] == Terrain.OPEN_DOOR){
|
||||||
|
Door.leave(oldPos);
|
||||||
|
}
|
||||||
Dungeon.level.occupyCell(ch);
|
Dungeon.level.occupyCell(ch);
|
||||||
if (ch == Dungeon.hero){
|
if (ch == Dungeon.hero){
|
||||||
//FIXME currently no logic here if the throw effect kills the hero
|
//FIXME currently no logic here if the throw effect kills the hero
|
||||||
|
|
|
@ -48,11 +48,11 @@ public class Corrupting extends Weapon.Enchantment {
|
||||||
int level = Math.max( 0, weapon.buffedLvl() );
|
int level = Math.max( 0, weapon.buffedLvl() );
|
||||||
|
|
||||||
// lvl 0 - 20%
|
// lvl 0 - 20%
|
||||||
// lvl 1 ~ 22.5%
|
// lvl 1 ~ 23%
|
||||||
// lvl 2 ~ 25%
|
// lvl 2 ~ 26%
|
||||||
if (damage >= defender.HP
|
if (damage >= defender.HP
|
||||||
&& !defender.isImmune(Corruption.class)
|
&& !defender.isImmune(Corruption.class)
|
||||||
&& Random.Int( level + 30 ) >= 24){
|
&& Random.Int( level + 25 ) >= 20){
|
||||||
|
|
||||||
Mob enemy = (Mob) defender;
|
Mob enemy = (Mob) defender;
|
||||||
Hero hero = (attacker instanceof Hero) ? (Hero) attacker : Dungeon.hero;
|
Hero hero = (attacker instanceof Hero) ? (Hero) attacker : Dungeon.hero;
|
||||||
|
|
|
@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||||
|
@ -107,7 +108,8 @@ public class HighGrass {
|
||||||
//Camouflage
|
//Camouflage
|
||||||
//FIXME doesn't work with sad ghost
|
//FIXME doesn't work with sad ghost
|
||||||
if (hero.belongings.armor != null && hero.belongings.armor.hasGlyph(Camouflage.class, hero)) {
|
if (hero.belongings.armor != null && hero.belongings.armor.hasGlyph(Camouflage.class, hero)) {
|
||||||
Buff.affect(hero, Camouflage.Camo.class).set(3 + hero.belongings.armor.buffedLvl());
|
Buff.prolong(hero, Invisibility.class, 3 + hero.belongings.armor.buffedLvl()/2);
|
||||||
|
Sample.INSTANCE.play( Assets.Sounds.MELD );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user