From abdad5350af0a9ebf1389e2513fabd3aa9a4061a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 2 Oct 2023 13:26:50 -0400 Subject: [PATCH] v2.2.0: various balance changes to the new caves quest --- .../actors/hero/Hero.java | 7 +++++-- .../actors/mobs/CrystalSpire.java | 20 +++++++++---------- .../actors/mobs/CrystalWisp.java | 14 ++++++------- .../sprites/CrystalSpireSprite.java | 6 +++--- 4 files changed, 24 insertions(+), 23 deletions(-) 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 ade33c2aa..6e2d0c365 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 @@ -1157,6 +1157,7 @@ public class Hero extends Char { } } + //1 hunger spent total if (Dungeon.level.map[action.dst] == Terrain.WALL_DECO){ DarkGold gold = new DarkGold(); if (gold.doPickUp( Dungeon.hero )) { @@ -1180,20 +1181,22 @@ public class Hero extends Char { //mining gold doesn't break crystals crystalAdjacent = false; + //4 hunger spent total } else if (Dungeon.level.map[action.dst] == Terrain.WALL){ - buff(Hunger.class).affectHunger(-5); + buff(Hunger.class).affectHunger(-3); PixelScene.shake(0.5f, 0.5f); CellEmitter.get( action.dst ).burst( Speck.factory( Speck.ROCK ), 2 ); Sample.INSTANCE.play( Assets.Sounds.MINE ); Level.set( action.dst, Terrain.EMPTY_DECO ); + //1 hunger spent total } else if (Dungeon.level.map[action.dst] == Terrain.MINE_CRYSTAL){ Splash.at(action.dst, 0xFFFFFF, 5); Sample.INSTANCE.play( Assets.Sounds.SHATTER ); Level.set( action.dst, Terrain.EMPTY ); + //1 hunger spent total } else if (Dungeon.level.map[action.dst] == Terrain.MINE_BOULDER){ - buff(Hunger.class).affectHunger(-1); Splash.at(action.dst, ColorMath.random( 0x444444, 0x777766 ), 5); Sample.INSTANCE.play( Assets.Sounds.MINE, 0.6f ); Level.set( action.dst, Terrain.EMPTY ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalSpire.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalSpire.java index 55fa95c34..52cad8bc3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalSpire.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalSpire.java @@ -66,8 +66,8 @@ public class CrystalSpire extends Mob { HP = HT = 300; spriteClass = CrystalSpireSprite.class; - //acts before other mobs, this is important for how it blocks crystal guardians - actPriority = MOB_PRIO+1; + //acts after other mobs, which makes baiting crystal guardians more consistent + actPriority = MOB_PRIO-1; state = PASSIVE; @@ -78,10 +78,8 @@ public class CrystalSpire extends Mob { properties.add(Property.INORGANIC); } - //TODO this fight needs some mechanics and balance tuning now - private float abilityCooldown; - private static final int ABILITY_CD = 12; + private static final int ABILITY_CD = 15; private ArrayList> targetedCells = new ArrayList<>(); @@ -131,12 +129,12 @@ public class CrystalSpire extends Mob { Char ch = Actor.findChar(i); if (ch != null && !(ch instanceof CrystalWisp || ch instanceof CrystalSpire)){ - int dmg = Random.NormalIntRange(8, 16); + int dmg = Random.NormalIntRange(6, 15); //guardians are hit harder by the attack if (ch instanceof CrystalGuardian) { - dmg += 8; - Buff.prolong(ch, Cripple.class, 20f); + dmg += 12; //18-27 damage + Buff.prolong(ch, Cripple.class, 30f); } ch.damage(dmg, CrystalSpire.this); @@ -363,6 +361,8 @@ public class CrystalSpire extends Mob { PixelScene.shake( 3, 0.7f ); GLog.n(Messages.get(CrystalSpire.class, "alert")); BossHealthBar.assignBoss(CrystalSpire.this); + + abilityCooldown = 1; //dely first attack by 1 turn } boolean affectingGuardians = false; @@ -400,8 +400,8 @@ public class CrystalSpire extends Mob { } //delays sleeping guardians that happen to be near to the crystal - if (PathFinder.distance[ch.pos] < 24){ - Buff.affect(ch, Paralysis.class, 24-PathFinder.distance[ch.pos]); + if (PathFinder.distance[ch.pos] < 20){ + Buff.affect(ch, Paralysis.class, 20-PathFinder.distance[ch.pos]); } } else if (((CrystalGuardian) ch).state != ((CrystalGuardian) ch).HUNTING && ((CrystalGuardian) ch).target != pos){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalWisp.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalWisp.java index 5d55c93db..2509d3165 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalWisp.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/CrystalWisp.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -40,7 +39,7 @@ public class CrystalWisp extends Mob{ { spriteClass = CrystalWispSprite.class; - HP = HT = 35; + HP = HT = 30; defenseSkill = 16; EXP = 7; @@ -76,12 +75,12 @@ public class CrystalWisp extends Mob{ @Override public int damageRoll() { - return Random.NormalIntRange( 3, 10 ); + return Random.NormalIntRange( 5, 10 ); } @Override public int attackSkill( Char target ) { - return 16; + return 18; } @Override @@ -115,7 +114,7 @@ public class CrystalWisp extends Mob{ } //used so resistances can differentiate between melee and magical attacks - public static class CrystalBolt{} + public static class LightBeam {} private void zap() { spend( 1f ); @@ -124,9 +123,8 @@ public class CrystalWisp extends Mob{ Char enemy = this.enemy; if (hit( this, enemy, true )) { - int dmg = Random.NormalIntRange( 2, 8 ); - dmg = Math.round(dmg * AscensionChallenge.statModifier(this)); - enemy.damage( dmg, new CrystalBolt() ); + int dmg = Random.NormalIntRange( 5, 10 ); + enemy.damage( dmg, new LightBeam() ); if (!enemy.isAlive() && enemy == Dungeon.hero) { Badges.validateDeathFromEnemyMagic(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalSpireSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalSpireSprite.java index 2309c9f86..8312378b2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalSpireSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalSpireSprite.java @@ -67,11 +67,11 @@ public abstract class CrystalSpireSprite extends MobSprite { TextureFilm frames = new TextureFilm( texture, 24, 41 ); - if (hpPercent > 0.8f){ + if (hpPercent > 0.9f){ idle.frames( frames, 0+texOffset() ); - } else if (hpPercent > 0.5f){ + } else if (hpPercent > 0.67f){ idle.frames( frames, 1+texOffset() ); - } else if (hpPercent > 0.25f){ + } else if (hpPercent > 0.33f){ idle.frames( frames, 2+texOffset() ); } else { idle.frames( frames, 3+texOffset() );