v2.2.0: various balance changes to the new caves quest
This commit is contained in:
@@ -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 );
|
||||||
|
|||||||
+10
-10
@@ -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){
|
||||||
|
|||||||
+6
-8
@@ -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();
|
||||||
|
|||||||
+3
-3
@@ -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() );
|
||||||
|
|||||||
Reference in New Issue
Block a user