v0.4.1: rebalanced several artifacts

This commit is contained in:
Evan Debenham
2016-07-07 17:49:34 -04:00
committed by Evan Debenham
parent cc1c156428
commit 669e0bb87b
7 changed files with 40 additions and 36 deletions
@@ -63,6 +63,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.EtherealChains; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.EtherealChains;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HornOfPlenty;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TalismanOfForesight;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key; import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key;
@@ -1129,6 +1130,10 @@ public class Hero extends Char {
EtherealChains.chainsRecharge chains = buff(EtherealChains.chainsRecharge.class); EtherealChains.chainsRecharge chains = buff(EtherealChains.chainsRecharge.class);
if (chains != null) chains.gainExp(percent); if (chains != null) chains.gainExp(percent);
HornOfPlenty.hornRecharge horn = buff(HornOfPlenty.hornRecharge.class);
if (horn != null) horn.gainCharge(percent);
if (subClass == HeroSubClass.BERSERKER) Buff.affect(this, Berserk.class).recover(percent); if (subClass == HeroSubClass.BERSERKER) Buff.affect(this, Berserk.class).recover(percent);
boolean levelUp = false; boolean levelUp = false;
@@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfPsionicBlast; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfPsionicBlast;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.messages.Languages;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
@@ -201,7 +202,7 @@ public class DriedRose extends Artifact {
LockedFloor lock = target.buff(LockedFloor.class); LockedFloor lock = target.buff(LockedFloor.class);
if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) { if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) {
partialCharge += 10/75f; partialCharge += 1/5f; //500 turns to a full charge
if (partialCharge > 1){ if (partialCharge > 1){
charge++; charge++;
partialCharge--; partialCharge--;
@@ -292,11 +293,11 @@ public class DriedRose extends Artifact {
public GhostHero(int roseLevel){ public GhostHero(int roseLevel){
this(); this();
HP = HT = 10+roseLevel*3; HP = HT = 10+roseLevel*4;
} }
public void saySpawned(){ public void saySpawned(){
if (!name.equals("sad ghost")) return; //don't say anything if not on english if (Messages.lang() != Languages.ENGLISH) return; //don't say anything if not on english
int i = (Dungeon.depth - 1) / 5; int i = (Dungeon.depth - 1) / 5;
if (chooseEnemy() == null) if (chooseEnemy() == null)
yell( Random.element( VOICE_AMBIENT[i] ) ); yell( Random.element( VOICE_AMBIENT[i] ) );
@@ -311,13 +312,13 @@ public class DriedRose extends Artifact {
} }
public void sayDefeated(){ public void sayDefeated(){
if (!name.equals("sad ghost")) return; //don't say anything if not on english if (Messages.lang() != Languages.ENGLISH) return; //don't say anything if not on english
yell( Random.element( VOICE_DEFEATED[ Dungeon.bossLevel() ? 1 : 0 ] ) ); yell( Random.element( VOICE_DEFEATED[ Dungeon.bossLevel() ? 1 : 0 ] ) );
Sample.INSTANCE.play( Assets.SND_GHOST ); Sample.INSTANCE.play( Assets.SND_GHOST );
} }
public void sayHeroKilled(){ public void sayHeroKilled(){
if (!name.equals("sad ghost")) return; //don't say anything if not on english if (Messages.lang() != Languages.ENGLISH) return; //don't say anything if not on english
yell(Random.element(VOICE_HEROKILLED)); yell(Random.element(VOICE_HEROKILLED));
Sample.INSTANCE.play( Assets.SND_GHOST ); Sample.INSTANCE.play( Assets.SND_GHOST );
} }
@@ -371,7 +372,6 @@ public class DriedRose extends Artifact {
@Override @Override
public int damageRoll() { public int damageRoll() {
//equivalent to N/2 to 5+N, where N is rose level.
int lvl = (HT-10)/3; int lvl = (HT-10)/3;
return Random.NormalIntRange( lvl/2, 5+lvl); return Random.NormalIntRange( lvl/2, 5+lvl);
} }
@@ -26,7 +26,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -165,19 +164,18 @@ public class HornOfPlenty extends Artifact {
public class hornRecharge extends ArtifactBuff{ public class hornRecharge extends ArtifactBuff{
@Override public void gainCharge(float levelPortion) {
public boolean act() { if (charge < chargeCap) {
LockedFloor lock = target.buff(LockedFloor.class);
if (charge < chargeCap && !cursed && (lock == null || lock.regenOn())) {
//generates 0.25 food value every round, +0.015 value per level //generates 0.25x max hunger value every hero level, +0.025x max value per horn level
//to a max of 0.70 food value per round (0.25+0.5, at level 30) //to a max of exactly max hunger value per hero level (0.25+0.75, at horn level 30)
partialCharge += 0.25f + (0.015f*level()); //This means that a standard ration will be recovered in 10 hero levels
partialCharge += Hunger.STARVING * levelPortion * (0.25f + (0.025f*level()));
//charge is in increments of 36 food value. //charge is in increments of 1/10 max hunger value.
if (partialCharge >= 36) { while (partialCharge >= Hunger.STARVING/10) {
charge++; charge++;
partialCharge -= 36; partialCharge -= Hunger.STARVING/10;
if (charge == chargeCap)image = ItemSpriteSheet.ARTIFACT_HORN4; if (charge == chargeCap)image = ItemSpriteSheet.ARTIFACT_HORN4;
else if (charge >= 7) image = ItemSpriteSheet.ARTIFACT_HORN3; else if (charge >= 7) image = ItemSpriteSheet.ARTIFACT_HORN3;
@@ -193,10 +191,6 @@ public class HornOfPlenty extends Artifact {
} }
} else } else
partialCharge = 0; partialCharge = 0;
spend( TICK );
return true;
} }
} }
@@ -80,17 +80,16 @@ public class MasterThievesArmband extends Artifact {
exp += value; exp += value;
} }
} }
while(exp >= 600 && level() < levelCap) { while(exp >= (250 + 50*level()) && level() < levelCap) {
exp -= 600; exp -= (250 + 50*level());
upgrade(); upgrade();
} }
return true; return true;
} }
public float stealChance(int value){ public float stealChance(int value){
//get lvl*100 gold or lvl*5% item value of free charge, whichever is less. //get lvl*50 gold or lvl*3.33% item value of free charge, whichever is less.
int chargeBonus = Math.min(level()*100, (value*level())/20); int chargeBonus = Math.min(level()*50, (value*level())/30);
return (((float)charge + chargeBonus)/value); return (((float)charge + chargeBonus)/value);
} }
} }
@@ -176,7 +176,7 @@ public class SandalsOfNature extends Artifact {
Sample.INSTANCE.play( Assets.SND_PLANT ); Sample.INSTANCE.play( Assets.SND_PLANT );
hero.busy(); hero.busy();
hero.spend( 2f ); hero.spend( 2f );
if (seeds.size() >= 5+(level()*2)){ if (seeds.size() >= 3+(level()*3)){
seeds.clear(); seeds.clear();
upgrade(); upgrade();
if (level() >= 1 && level() <= 3) { if (level() >= 1 && level() <= 3) {
@@ -75,8 +75,13 @@ public class TimekeepersHourglass extends Artifact {
if (action.equals(AC_ACTIVATE)){ if (action.equals(AC_ACTIVATE)){
if (!isEquipped( hero )) GLog.i( Messages.get(Artifact.class, "need_to_equip") ); 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 (activeBuff != null) {
else if (charge <= 1) GLog.i( Messages.get(this, "no_charge") ); if (activeBuff instanceof timeStasis) { //do nothing
} else {
activeBuff.detach();
GLog.i( Messages.get(this, "deactivate") );
}
} else if (charge <= 1) GLog.i( Messages.get(this, "no_charge") );
else if (cursed) GLog.i( Messages.get(this, "cursed") ); else if (cursed) GLog.i( Messages.get(this, "cursed") );
else GameScene.show( else GameScene.show(
new WndOptions( Messages.get(this, "name"), new WndOptions( Messages.get(this, "name"),
@@ -220,16 +225,18 @@ public class TimekeepersHourglass extends Artifact {
public boolean attachTo(Char target) { public boolean attachTo(Char target) {
if (super.attachTo(target)) { if (super.attachTo(target)) {
int usedCharge = Math.min(charge, 5);
//buffs always act last, so the stasis buff should end a turn early. //buffs always act last, so the stasis buff should end a turn early.
spend(charge - 1); spend(usedCharge - 1);
((Hero) target).spendAndNext(charge); ((Hero) target).spendAndNext(usedCharge);
//shouldn't punish the player for going into stasis frequently //shouldn't punish the player for going into stasis frequently
Hunger hunger = target.buff(Hunger.class); Hunger hunger = target.buff(Hunger.class);
if (hunger != null && !hunger.isStarving()) if (hunger != null && !hunger.isStarving())
hunger.satisfy(charge); hunger.satisfy(usedCharge);
charge = 0; charge -= usedCharge;
target.invisible++; target.invisible++;
@@ -310,7 +317,6 @@ public class TimekeepersHourglass extends Artifact {
mob.sprite.remove(CharSprite.State.PARALYSED); mob.sprite.remove(CharSprite.State.PARALYSED);
GameScene.freezeEmitters = false; GameScene.freezeEmitters = false;
charge = 0;
updateQuickslot(); updateQuickslot();
super.detach(); super.detach();
activeBuff = null; activeBuff = null;
@@ -269,14 +269,14 @@ items.artifacts.talismanofforesight$foresight.desc=You feel very nervous, as if
items.artifacts.timekeepershourglass.name=timekeeper's hourglass items.artifacts.timekeepershourglass.name=timekeeper's hourglass
items.artifacts.timekeepershourglass.ac_activate=ACTIVATE items.artifacts.timekeepershourglass.ac_activate=ACTIVATE
items.artifacts.timekeepershourglass.in_use=Your hourglass is already in use. items.artifacts.timekeepershourglass.deactivate=You deactive the time freeze.
items.artifacts.timekeepershourglass.no_charge=Your hourglass hasn't recharged enough to be usable yet. 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.cursed=You cannot use a cursed hourglass.
items.artifacts.timekeepershourglass.onstasis=The world seems to shift around you in an instant. 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.onfreeze=Everything around you suddenly freezes.
items.artifacts.timekeepershourglass.stasis=Put myself in stasis items.artifacts.timekeepershourglass.stasis=Put myself in stasis
items.artifacts.timekeepershourglass.freeze=Freeze time around me 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.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, consumes up to 5 charge at a timea.\n\nWhen time is frozen, you can move as if your actions take no time. This can be deactivated at any time by using the hourglass or attacking.
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=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_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.desc_cursed=The cursed hourglass is locked to your side, you can feel it trying to manipulate your flow of time.