v0.9.3: adjusted Tengu for bosses challenge:
Baseline changes: - Tengu can now throw bombs near to himself - fixed odd behaviour when fire ability stacks Challenge changes: - HP up to 250 from 200 - 1st phase traps are much deadlier - 2nd phase abilities are used more often
This commit is contained in:
parent
741420bc34
commit
9a8c127709
|
@ -86,6 +86,6 @@ challenges.no_scrolls_desc=A certain rune is harder to find. Unfortunately, it's
|
||||||
challenges.champion_enemies=Hostile champions
|
challenges.champion_enemies=Hostile champions
|
||||||
challenges.champion_enemies_desc=You're not the only one who can level up!\n\n- Regular enemies have a 1/8 chance to spawn with a special champion buff.\n- Champions wake up if they spawn asleep\n- The hero knows when a champion spawns\n- Champions are immune to corruption\n\nThere are six types of champion enemy:\n_Blazing (orange):_ +25% melee damage, ignites on hit, immune to fire, spreads flames on death\n_Projecting (purple):_ +25% melee damage, can attack anything they see\n_Antimagic (green):_ -25% damage taken, immune to magical effects\n_Giant (blue):_ -75% damage taken, +1 melee range, cannot move into tunnels\n_Blessed (yellow):_ +200% accuracy, +200% evasion\n_Growing (red):_ +20% accuracy, evasion, damage, and effective HP. Increases by 1% every 3 turns.
|
challenges.champion_enemies_desc=You're not the only one who can level up!\n\n- Regular enemies have a 1/8 chance to spawn with a special champion buff.\n- Champions wake up if they spawn asleep\n- The hero knows when a champion spawns\n- Champions are immune to corruption\n\nThere are six types of champion enemy:\n_Blazing (orange):_ +25% melee damage, ignites on hit, immune to fire, spreads flames on death\n_Projecting (purple):_ +25% melee damage, can attack anything they see\n_Antimagic (green):_ -25% damage taken, immune to magical effects\n_Giant (blue):_ -75% damage taken, +1 melee range, cannot move into tunnels\n_Blessed (yellow):_ +200% accuracy, +200% evasion\n_Growing (red):_ +20% accuracy, evasion, damage, and effective HP. Increases by 1% every 3 turns.
|
||||||
challenges.stronger_bosses=Badder bosses
|
challenges.stronger_bosses=Badder bosses
|
||||||
challenges.stronger_bosses_desc=TODO\n\n_Goo:_ +20% health\n_-_ Healing in water ramps up, to a max of 3/turn\n_-_ Pumps up in 1 turn instead of 2
|
challenges.stronger_bosses_desc=TODO\n\n_Goo:_ +20% health\n_-_ Healing in water ramps up, to a max of 3/turn\n_-_ Pumps up in 1 turn instead of 2\n\n_Tengu:_ +25% health\n_-_ 1st phase traps are much deadlier\n_-_ 2nd phase abilities are more frequent
|
||||||
|
|
||||||
rankings$record.something=Killed by Something
|
rankings$record.something=Killed by Something
|
||||||
|
|
|
@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
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;
|
||||||
|
@ -69,6 +70,7 @@ import com.watabou.noosa.audio.Sample;
|
||||||
import com.watabou.noosa.particles.Emitter;
|
import com.watabou.noosa.particles.Emitter;
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
import com.watabou.utils.Callback;
|
import com.watabou.utils.Callback;
|
||||||
|
import com.watabou.utils.GameMath;
|
||||||
import com.watabou.utils.PathFinder;
|
import com.watabou.utils.PathFinder;
|
||||||
import com.watabou.utils.PointF;
|
import com.watabou.utils.PointF;
|
||||||
import com.watabou.utils.Random;
|
import com.watabou.utils.Random;
|
||||||
|
@ -81,7 +83,7 @@ public class Tengu extends Mob {
|
||||||
{
|
{
|
||||||
spriteClass = TenguSprite.class;
|
spriteClass = TenguSprite.class;
|
||||||
|
|
||||||
HP = HT = 200;
|
HP = HT = Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 250 : 200;
|
||||||
EXP = 20;
|
EXP = 20;
|
||||||
defenseSkill = 15;
|
defenseSkill = 15;
|
||||||
|
|
||||||
|
@ -434,8 +436,9 @@ public class Tengu extends Mob {
|
||||||
|
|
||||||
abilityCooldown--;
|
abilityCooldown--;
|
||||||
|
|
||||||
if (targetAbilityUses() - abilitiesUsed >= 4){
|
if (targetAbilityUses() - abilitiesUsed >= 4 && !Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||||
//Very behind in ability uses, use one right away!
|
//Very behind in ability uses, use one right away!
|
||||||
|
//but not on bosses challenge, we already cast quickly then
|
||||||
abilityCooldown = 0;
|
abilityCooldown = 0;
|
||||||
|
|
||||||
} else if (targetAbilityUses() - abilitiesUsed >= 3){
|
} else if (targetAbilityUses() - abilitiesUsed >= 3){
|
||||||
|
@ -475,6 +478,8 @@ public class Tengu extends Mob {
|
||||||
abilityToUse = BOMB_ABILITY;
|
abilityToUse = BOMB_ABILITY;
|
||||||
} else if (abilitiesUsed == 1){
|
} else if (abilitiesUsed == 1){
|
||||||
abilityToUse = SHOCKER_ABILITY;
|
abilityToUse = SHOCKER_ABILITY;
|
||||||
|
} else if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) {
|
||||||
|
abilityToUse = Random.Int(2)*2; //0 or 2, can't roll fire ability with challenge
|
||||||
} else {
|
} else {
|
||||||
abilityToUse = Random.Int(3);
|
abilityToUse = Random.Int(3);
|
||||||
}
|
}
|
||||||
|
@ -502,16 +507,28 @@ public class Tengu extends Mob {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//always use the fire ability with the bosses challenge
|
||||||
|
if (abilityUsed && abilityToUse != FIRE_ABILITY && Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||||
|
throwFire(Tengu.this, enemy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//spend only 1 turn if seriously behind on ability uses
|
//spend 1 less turn if seriously behind on ability uses
|
||||||
if (targetAbilityUses() - abilitiesUsed >= 4){
|
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||||
|
if (targetAbilityUses() - abilitiesUsed >= 4) {
|
||||||
|
//spend no time
|
||||||
|
} else {
|
||||||
|
spend(TICK);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (targetAbilityUses() - abilitiesUsed >= 4) {
|
||||||
spend(TICK);
|
spend(TICK);
|
||||||
} else {
|
} else {
|
||||||
spend(2 * TICK);
|
spend(2 * TICK);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lastAbility = abilityToUse;
|
lastAbility = abilityToUse;
|
||||||
abilitiesUsed++;
|
abilitiesUsed++;
|
||||||
|
@ -527,16 +544,14 @@ public class Tengu extends Mob {
|
||||||
|
|
||||||
int targetCell = -1;
|
int targetCell = -1;
|
||||||
|
|
||||||
//Targets closest cell which is adjacent to target, and at least 3 tiles away
|
//Targets closest cell which is adjacent to target
|
||||||
for (int i : PathFinder.NEIGHBOURS8){
|
for (int i : PathFinder.NEIGHBOURS8){
|
||||||
int cell = target.pos + i;
|
int cell = target.pos + i;
|
||||||
if (Dungeon.level.distance(cell, thrower.pos) >= 3 && !Dungeon.level.solid[cell]){
|
|
||||||
if (targetCell == -1 ||
|
if (targetCell == -1 ||
|
||||||
Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){
|
Dungeon.level.trueDistance(cell, thrower.pos) < Dungeon.level.trueDistance(targetCell, thrower.pos)){
|
||||||
targetCell = cell;
|
targetCell = cell;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (targetCell == -1){
|
if (targetCell == -1){
|
||||||
return false;
|
return false;
|
||||||
|
@ -811,7 +826,7 @@ public class Tengu extends Mob {
|
||||||
for (int i = area.left; i < area.right; i++){
|
for (int i = area.left; i < area.right; i++){
|
||||||
for (int j = area.top; j < area.bottom; j++){
|
for (int j = area.top; j < area.bottom; j++){
|
||||||
cell = i + j* Dungeon.level.width();
|
cell = i + j* Dungeon.level.width();
|
||||||
off[cell] = cur[cell] > 0 ? cur[cell] - 1 : 0;
|
off[cell] = (int)GameMath.gate(0, cur[cell] - 1, 1);
|
||||||
|
|
||||||
if (off[cell] > 0) {
|
if (off[cell] > 0) {
|
||||||
volume += off[cell];
|
volume += off[cell];
|
||||||
|
|
|
@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Bones;
|
import com.shatteredpixel.shatteredpixeldungeon.Bones;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
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;
|
||||||
|
@ -573,7 +574,14 @@ public class PrisonBossLevel extends Level {
|
||||||
|
|
||||||
boolean[] trapsPatch;
|
boolean[] trapsPatch;
|
||||||
|
|
||||||
|
//fill ramps up much faster during challenge, effectively 78%-90%
|
||||||
|
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||||
|
fill = 0.675f + fill/4f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tries = 0;
|
||||||
do {
|
do {
|
||||||
|
tries++;
|
||||||
trapsPatch = Patch.generate(7, 7, fill, 0, false);
|
trapsPatch = Patch.generate(7, 7, fill, 0, false);
|
||||||
|
|
||||||
PathFinder.buildDistanceMap(tenguPos, BArray.not(trapsPatch, null));
|
PathFinder.buildDistanceMap(tenguPos, BArray.not(trapsPatch, null));
|
||||||
|
@ -581,6 +589,7 @@ public class PrisonBossLevel extends Level {
|
||||||
//so distance to tengu starts at 3-6 tiles and scales up to 7-8 as fill increases
|
//so distance to tengu starts at 3-6 tiles and scales up to 7-8 as fill increases
|
||||||
} while (((PathFinder.distance[heroPos] < Math.ceil(7*fill))
|
} while (((PathFinder.distance[heroPos] < Math.ceil(7*fill))
|
||||||
|| (PathFinder.distance[heroPos] > Math.ceil(4 + 4*fill))));
|
|| (PathFinder.distance[heroPos] > Math.ceil(4 + 4*fill))));
|
||||||
|
System.out.println(tries);
|
||||||
|
|
||||||
PathFinder.setMapSize(width(), height());
|
PathFinder.setMapSize(width(), height());
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
|
package com.shatteredpixel.shatteredpixeldungeon.levels.traps;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
|
||||||
|
|
||||||
|
@ -33,8 +35,12 @@ public class TenguDartTrap extends PoisonDartTrap {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int poisonAmount() {
|
protected int poisonAmount() {
|
||||||
|
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
|
||||||
|
return 15; //50 damage total, equal to poison dart traps on floor 10
|
||||||
|
} else {
|
||||||
return 8; //17 damage total
|
return 8; //17 damage total
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canTarget(Char ch) {
|
protected boolean canTarget(Char ch) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user