v2.2.0: various balance changes to the new caves quest

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