v2.0.1: fixed ranged enemy AI and projecting champ buff in some cases

This commit is contained in:
Evan Debenham
2023-03-23 11:57:11 -04:00
parent dbc96faef5
commit b8bc82c122
7 changed files with 33 additions and 22 deletions
@@ -71,10 +71,11 @@ public class DM100 extends Mob implements Callback {
public int drRoll() { public int drRoll() {
return super.drRoll() + Random.NormalIntRange(0, 4); return super.drRoll() + Random.NormalIntRange(0, 4);
} }
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
return new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos; return super.canAttack(enemy)
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos;
} }
//used so resistances can differentiate between melee and magical attacks //used so resistances can differentiate between melee and magical attacks
@@ -83,7 +84,8 @@ public class DM100 extends Mob implements Callback {
@Override @Override
protected boolean doAttack( Char enemy ) { protected boolean doAttack( Char enemy ) {
if (Dungeon.level.distance( pos, enemy.pos ) <= 1) { if (Dungeon.level.adjacent( pos, enemy.pos )
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos != enemy.pos) {
return super.doAttack( enemy ); return super.doAttack( enemy );
@@ -112,16 +112,18 @@ public abstract class Elemental extends Mob {
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
if (rangedCooldown <= 0) { if (super.canAttack(enemy)){
return new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT ).collisionPos == enemy.pos; return true;
} else { } else {
return super.canAttack( enemy ); return rangedCooldown < 0 && new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT ).collisionPos == enemy.pos;
} }
} }
protected boolean doAttack( Char enemy ) { protected boolean doAttack( Char enemy ) {
if (Dungeon.level.adjacent( pos, enemy.pos ) || rangedCooldown > 0) { if (Dungeon.level.adjacent( pos, enemy.pos )
|| rangedCooldown > 0
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT ).collisionPos != enemy.pos) {
return super.doAttack( enemy ); return super.doAttack( enemy );
@@ -93,15 +93,18 @@ public class Eye extends Mob {
if (beamCooldown == 0) { if (beamCooldown == 0) {
Ballistica aim = new Ballistica(pos, enemy.pos, Ballistica.STOP_SOLID); Ballistica aim = new Ballistica(pos, enemy.pos, Ballistica.STOP_SOLID);
if (enemy.invisible == 0 && !isCharmedBy(enemy) && fieldOfView[enemy.pos] && aim.subPath(1, aim.dist).contains(enemy.pos)){ if (enemy.invisible == 0 && !isCharmedBy(enemy) && fieldOfView[enemy.pos]
&& (super.canAttack(enemy) || aim.subPath(1, aim.dist).contains(enemy.pos))){
beam = aim; beam = aim;
beamTarget = aim.collisionPos; beamTarget = aim.collisionPos;
return true; return true;
} else } else {
//if the beam is charged, it has to attack, will aim at previous location of target. //if the beam is charged, it has to attack, will aim at previous location of target.
return beamCharged; return beamCharged;
} else }
} else {
return super.canAttack(enemy); return super.canAttack(enemy);
}
} }
@Override @Override
@@ -122,7 +125,8 @@ public class Eye extends Mob {
@Override @Override
protected boolean doAttack( Char enemy ) { protected boolean doAttack( Char enemy ) {
if (beamCooldown > 0) { beam = new Ballistica(pos, enemy.pos, Ballistica.STOP_SOLID);
if (beamCooldown > 0 || !beam.subPath(1, beam.dist).contains(enemy.pos)) {
return super.doAttack(enemy); return super.doAttack(enemy);
} else if (!beamCharged){ } else if (!beamCharged){
((EyeSprite)sprite).charge( enemy.pos ); ((EyeSprite)sprite).charge( enemy.pos );
@@ -133,7 +137,6 @@ public class Eye extends Mob {
spend( attackDelay() ); spend( attackDelay() );
beam = new Ballistica(pos, beamTarget, Ballistica.STOP_SOLID);
if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[beam.collisionPos] ) { if (Dungeon.level.heroFOV[pos] || Dungeon.level.heroFOV[beam.collisionPos] ) {
sprite.zap( beam.collisionPos ); sprite.zap( beam.collisionPos );
return false; return false;
@@ -66,8 +66,8 @@ public class GnollTrickster extends Gnoll {
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE); return !Dungeon.level.adjacent( pos, enemy.pos )
return !Dungeon.level.adjacent(pos, enemy.pos) && attack.collisionPos == enemy.pos; && (super.canAttack(enemy) || new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos);
} }
@Override @Override
@@ -71,8 +71,8 @@ public class Scorpio extends Mob {
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
Ballistica attack = new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE); return !Dungeon.level.adjacent( pos, enemy.pos )
return !Dungeon.level.adjacent( pos, enemy.pos ) && attack.collisionPos == enemy.pos; && (super.canAttack(enemy) || new Ballistica( pos, enemy.pos, Ballistica.PROJECTILE).collisionPos == enemy.pos);
} }
@Override @Override
@@ -68,10 +68,11 @@ public abstract class Shaman extends Mob {
public int drRoll() { public int drRoll() {
return super.drRoll() + Random.NormalIntRange(0, 6); return super.drRoll() + Random.NormalIntRange(0, 6);
} }
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
return new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos; return super.canAttack(enemy)
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos;
} }
@Override @Override
@@ -88,8 +89,9 @@ public abstract class Shaman extends Mob {
} }
protected boolean doAttack(Char enemy ) { protected boolean doAttack(Char enemy ) {
if (Dungeon.level.adjacent( pos, enemy.pos )) { if (Dungeon.level.adjacent( pos, enemy.pos )
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos != enemy.pos) {
return super.doAttack( enemy ); return super.doAttack( enemy );
@@ -77,12 +77,14 @@ public class Warlock extends Mob implements Callback {
@Override @Override
protected boolean canAttack( Char enemy ) { protected boolean canAttack( Char enemy ) {
return new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos; return super.canAttack(enemy)
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos == enemy.pos;
} }
protected boolean doAttack( Char enemy ) { protected boolean doAttack( Char enemy ) {
if (Dungeon.level.adjacent( pos, enemy.pos )) { if (Dungeon.level.adjacent( pos, enemy.pos )
|| new Ballistica( pos, enemy.pos, Ballistica.MAGIC_BOLT).collisionPos != enemy.pos) {
return super.doAttack( enemy ); return super.doAttack( enemy );