v2.2.0: added aggroing behaviour when crystal spire is attacked
This commit is contained in:
+15
-11
@@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
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.Healing;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||||
@@ -54,6 +55,12 @@ public class CrystalGuardian extends Mob{
|
|||||||
properties.add(Property.MINIBOSS);
|
properties.add(Property.MINIBOSS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean act() {
|
||||||
|
if (sprite instanceof CrystalGuardianSprite) ((CrystalGuardianSprite) sprite).endCrumple();
|
||||||
|
return super.act();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int damageRoll() {
|
public int damageRoll() {
|
||||||
return Random.NormalIntRange( 10, 20 );
|
return Random.NormalIntRange( 10, 20 );
|
||||||
@@ -76,7 +83,7 @@ public class CrystalGuardian extends Mob{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAlive() {
|
public boolean isAlive() {
|
||||||
if (HP <= 0){
|
if (HP <= 0 && !Blacksmith.Quest.bossBeaten()){
|
||||||
HP = 1;
|
HP = 1;
|
||||||
if (sprite != null) ((CrystalGuardianSprite)sprite).crumple();
|
if (sprite != null) ((CrystalGuardianSprite)sprite).crumple();
|
||||||
spend(10f-cooldown());
|
spend(10f-cooldown());
|
||||||
@@ -114,12 +121,6 @@ public class CrystalGuardian extends Mob{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void beckon(int cell) {
|
|
||||||
super.beckon(cell);
|
|
||||||
state = HUNTING;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void move(int step, boolean travelling) {
|
public void move(int step, boolean travelling) {
|
||||||
super.move(step, travelling);
|
super.move(step, travelling);
|
||||||
@@ -135,11 +136,14 @@ public class CrystalGuardian extends Mob{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean[] modifyPassable(boolean[] passable) {
|
public boolean[] modifyPassable(boolean[] passable) {
|
||||||
//TODO maybe base this on passable instead of hunting?
|
//if we are hunting, and our current target is not reachable otherwise, then we can step on crystals
|
||||||
// want to prevent one guardian randomly waking another though
|
|
||||||
if (state == HUNTING){
|
if (state == HUNTING){
|
||||||
for (int i = 0; i < Dungeon.level.length(); i++){
|
PathFinder.buildDistanceMap(target, passable);
|
||||||
passable[i] = passable[i] || Dungeon.level.map[i] == Terrain.MINE_CRYSTAL;
|
|
||||||
|
if (PathFinder.distance[pos] == Integer.MAX_VALUE) {
|
||||||
|
for (int i = 0; i < Dungeon.level.length(); i++) {
|
||||||
|
passable[i] = passable[i] || Dungeon.level.map[i] == Terrain.MINE_CRYSTAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return passable;
|
return passable;
|
||||||
|
|||||||
+18
@@ -26,7 +26,9 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|||||||
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.Amok;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
||||||
@@ -111,6 +113,22 @@ public class CrystalSpire extends Mob {
|
|||||||
Blacksmith.Quest.beatBoss();
|
Blacksmith.Quest.beatBoss();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (Char ch : Actor.chars()){
|
||||||
|
if (ch instanceof CrystalWisp){
|
||||||
|
((CrystalWisp)ch).beckon(pos);
|
||||||
|
} else if (ch instanceof CrystalGuardian){
|
||||||
|
//TODO we want some way to encourage the player to explore first, but also not disturb guardians.
|
||||||
|
// maybe wisps alone are enough for this?
|
||||||
|
if (((CrystalGuardian) ch).state == ((CrystalGuardian) ch).SLEEPING){
|
||||||
|
Buff.affect(ch, Haste.class, 6f);
|
||||||
|
}
|
||||||
|
((CrystalGuardian) ch).beckon(pos);
|
||||||
|
if (((CrystalGuardian) ch).state != HUNTING){
|
||||||
|
((CrystalGuardian) ch).aggro(Dungeon.hero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Dungeon.hero.spendAndNext(Actor.TICK);
|
Dungeon.hero.spendAndNext(Actor.TICK);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user