v2.2.0: overhauled the wandmaker's elemental embers quest
This commit is contained in:
@@ -1047,7 +1047,7 @@ actors.mobs.npcs.wandmaker.intro_huntress=Oh, hello miss! A friendly face is a p
|
||||
actors.mobs.npcs.wandmaker.intro_duelist=Oh, hello miss! What a pleasant surprise to meet a hero in such a depressing place! If you're up to helping an old man out, I may have a task for you.
|
||||
actors.mobs.npcs.wandmaker.intro_1=\n\nI came here to find a rare ingredient for a wand, but I've gotten myself lost, and my magical shield is weakening. I'll need to leave soon, but can't bear to go without getting what I came for.
|
||||
actors.mobs.npcs.wandmaker.intro_dust=I'm looking for some _corpse dust._ It's a special kind of cursed bone meal that usually shows up in places like this. There should be a barricaded room around here somewhere, I'm sure some dust will turn up there. Do be careful though, the curse the dust carries is quite potent, _get back to me as fast as you can_ and I'll cleanse it for you.
|
||||
actors.mobs.npcs.wandmaker.intro_ember=I'm looking for some _fresh embers_ from a newborn fire elemental. Elementals usually pop up when a summoning ritual isn't controlled, so just find some candles and a ritual site and I'm sure you can get one to pop up. You might want to _keep some sort of freezing item handy_ though, elementals are very powerful, but ice will take them down quite easily.
|
||||
actors.mobs.npcs.wandmaker.intro_ember=I'm looking for some _fresh embers_ from a newborn fire elemental. Elementals usually pop up when a summoning ritual isn't controlled, so just find some candles and a ritual site and I'm sure you can get one to pop up. You'll wand to _avoid boxing yourself in_ while fighting it though, or you could _keep some sort of freezing item handy._ Newborn Elementals are pretty powerful and chaotic, but they can't stand the cold.
|
||||
actors.mobs.npcs.wandmaker.intro_berry=The old warden of this prison kept a _rotberry plant,_ and I'm after one of its seeds. The plant has probably gone wild by now though, so getting it to give up a seed might be tricky. Its garden should be somewhere around here. Try to _keep away from its vine lashers_ if you want to stay in one piece. Using fire might be tempting but please don't, you'll kill the plant and destroy its seeds.
|
||||
actors.mobs.npcs.wandmaker.intro_2=\n\nIf you can get that for me, I'll be happy to pay you with one of my finely crafted wands! I brought two with me, so you can take whichever one you prefer.
|
||||
actors.mobs.npcs.wandmaker.reminder_dust=Any luck with corpse dust, %s? Look for some barricades.
|
||||
@@ -1149,7 +1149,10 @@ actors.mobs.dwarfking$dkwarlock.rankings_desc=Fell Before the King of Dwarves
|
||||
actors.mobs.elemental$fireelemental.name=fire elemental
|
||||
actors.mobs.elemental$fireelemental.desc=Elementals are chaotic creatures that are often created when powerful occult magic isn't properly controlled. Elementals have minimal intelligence, and are usually associated with a particular type of magic.\n\nFire elementals are a common type of elemental which deals damage with fiery magic. They will set their target ablaze with melee attacks, and can occasionally shoot bolts of fire as well.
|
||||
actors.mobs.elemental$newbornfireelemental.name=newborn fire elemental
|
||||
actors.mobs.elemental$newbornfireelemental.desc=Elementals are chaotic creatures that are often created when powerful occult magic isn't properly controlled. Elementals have minimal intelligence, and are usually associated with a particular type of magic.\n\nFire elementals are a common type of elemental which deals damage with fiery magic. They will set their target ablaze with melee attacks, and can occasionally shoot bolts of fire as well.\n\nThis fire elemental is freshy summoned, and is weakened as a result. In this state it is especially vulnerable to the cold. Its offensive capabilities are still great though, caution is advised.
|
||||
actors.mobs.elemental$newbornfireelemental.charging=The elemental is charging up!
|
||||
actors.mobs.elemental$newbornfireelemental.desc=Elementals are chaotic creatures that are often created when powerful occult magic isn't properly controlled. Elementals have minimal intelligence, and are usually associated with a particular type of magic.\n\nThis fire elemental is freshly summoned, but still quite dangerous!
|
||||
actors.mobs.elemental$newbornfireelemental.desc_boss=Because of the chaotic nature of its summoning, this elemental can only spread fire in inaccurate blasts after charging for a turn.
|
||||
actors.mobs.elemental$newbornfireelemental.desc_ally=Because this elemental was summoned by a spell, it has a little more control over its flame. It's incapable of making ranged attacks, but will ignite enemies it attacks in melee.
|
||||
actors.mobs.elemental$frostelemental.name=frost elemental
|
||||
actors.mobs.elemental$frostelemental.desc=Elementals are chaotic creatures that are often created when powerful occult magic isn't properly controlled. Elementals have minimal intelligence, and are usually associated with a particular type of magic.\n\nFrost elementals are a common type of elemental which weakens enemies with chilling magic. They will chill their target with melee and occasional ranged attacks. Their magic is much more effective in water.
|
||||
actors.mobs.elemental$shockelemental.name=shock elemental
|
||||
|
||||
@@ -1181,7 +1181,7 @@ items.spells.summonelemental.ac_imbue=IMBUE
|
||||
items.spells.summonelemental.summon_limit=You can only have one elemental summoned at a time.
|
||||
items.spells.summonelemental.imbue_prompt=Imbue an item
|
||||
items.spells.summonelemental.desc=This spell channels the energy of the elemental embers used to make it, and will allow you to summon a friendly elemental to fight with you! Only one elemental can be summoned at a time, but the spell can be re-cast to return the elemental to you at no cost.
|
||||
items.spells.summonelemental.desc_newborn=The spell is currently unimbued, and will summon a _newborn elemental_. You can imbue an identified potion of liquid flame, potion of frost, scroll of recharging, or scroll of transmutation to power the spell up, causing its next summon to be a full power elemental!
|
||||
items.spells.summonelemental.desc_newborn=The spell is currently unimbued, and will summon a _newborn elemental_ without a ranged attack. You can imbue an identified potion of liquid flame, potion of frost, scroll of recharging, or scroll of transmutation to power the spell up, causing its next summon to be a full power elemental!
|
||||
items.spells.summonelemental.desc_fire=The spell is currently hot to the touch, its next summon will be a _fire elemental_. You can imbue a different item, but the spell will lose its current imbue.
|
||||
items.spells.summonelemental.desc_frost=The spell is currently cold to the touch, its next summon will be a _frost elemental_. You can imbue a different item, but the spell will lose its current imbue.
|
||||
items.spells.summonelemental.desc_shock=The spell is currently radiating static energy, its next summon will be a _shock elemental_. You can imbue a different item, but the spell will lose its current imbue.
|
||||
|
||||
@@ -24,15 +24,21 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers;
|
||||
@@ -48,6 +54,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ElementalSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -64,7 +71,7 @@ public abstract class Elemental extends Mob {
|
||||
flying = true;
|
||||
}
|
||||
|
||||
private boolean summonedALly;
|
||||
protected boolean summonedALly;
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
@@ -147,7 +154,7 @@ public abstract class Elemental extends Mob {
|
||||
return damage;
|
||||
}
|
||||
|
||||
private void zap() {
|
||||
protected void zap() {
|
||||
spend( 1f );
|
||||
|
||||
Invisibility.dispel(this);
|
||||
@@ -236,23 +243,136 @@ public abstract class Elemental extends Mob {
|
||||
}
|
||||
}
|
||||
|
||||
//used in wandmaker quest
|
||||
//used in wandmaker quest, a fire elemental with lower ACC/EVA/DMG, no on-hit fire
|
||||
// and a unique 'fireball' style ranged attack, which can be dodged
|
||||
public static class NewbornFireElemental extends FireElemental {
|
||||
|
||||
{
|
||||
spriteClass = ElementalSprite.NewbornFire.class;
|
||||
|
||||
HT = 60;
|
||||
HP = HT/2; //30
|
||||
|
||||
|
||||
defenseSkill = 12;
|
||||
|
||||
EXP = 7;
|
||||
|
||||
properties.add(Property.MINIBOSS);
|
||||
}
|
||||
|
||||
//newborn elementals do not have ranged attacks
|
||||
rangedCooldown = Integer.MAX_VALUE;
|
||||
private int targetingPos = -1;
|
||||
|
||||
@Override
|
||||
protected boolean act() {
|
||||
if (targetingPos != -1){
|
||||
if (sprite != null && (sprite.visible || Dungeon.level.heroFOV[targetingPos])) {
|
||||
sprite.zap( targetingPos );
|
||||
return false;
|
||||
} else {
|
||||
zap();
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return super.act();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAttack( Char enemy ) {
|
||||
if (super.canAttack(enemy)){
|
||||
return true;
|
||||
} else {
|
||||
return rangedCooldown < 0 && new Ballistica( pos, enemy.pos, Ballistica.STOP_SOLID | Ballistica.STOP_TARGET ).collisionPos == enemy.pos;
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean doAttack( Char enemy ) {
|
||||
|
||||
if (rangedCooldown > 0) {
|
||||
|
||||
return super.doAttack( enemy );
|
||||
|
||||
} else if (new Ballistica( pos, enemy.pos, Ballistica.STOP_SOLID | Ballistica.STOP_TARGET ).collisionPos == enemy.pos) {
|
||||
|
||||
//set up an attack for next turn
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int i : PathFinder.NEIGHBOURS8){
|
||||
int target = enemy.pos + i;
|
||||
if (target != pos && new Ballistica(pos, target, Ballistica.STOP_SOLID | Ballistica.STOP_TARGET).collisionPos == target){
|
||||
candidates.add(target);
|
||||
}
|
||||
}
|
||||
|
||||
if (!candidates.isEmpty()){
|
||||
targetingPos = Random.element(candidates);
|
||||
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
if (!Dungeon.level.solid[targetingPos + i]) {
|
||||
sprite.parent.addToBack(new TargetedCell(targetingPos + i, 0xFF0000));
|
||||
}
|
||||
}
|
||||
|
||||
GLog.n(Messages.get(this, "charging"));
|
||||
spend(TICK);
|
||||
return true;
|
||||
} else {
|
||||
rangedCooldown = 1;
|
||||
return super.doAttack(enemy);
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
rangedCooldown = 1;
|
||||
return super.doAttack(enemy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void zap() {
|
||||
spend( 1f );
|
||||
|
||||
Invisibility.dispel(this);
|
||||
|
||||
for (int i : PathFinder.NEIGHBOURS9){
|
||||
if (!Dungeon.level.solid[targetingPos + i]) {
|
||||
CellEmitter.get(targetingPos+i).burst(ElmoParticle.FACTORY, 5);
|
||||
if (Dungeon.level.water[targetingPos+i]){
|
||||
GameScene.add(Blob.seed(targetingPos+i, 2, Fire.class));
|
||||
} else {
|
||||
GameScene.add(Blob.seed(targetingPos+i, 8, Fire.class));
|
||||
}
|
||||
|
||||
Char target = Actor.findChar(targetingPos+i);
|
||||
if (target != null && target != this){
|
||||
Buff.affect(target, Burning.class).reignite(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
Sample.INSTANCE.play(Assets.Sounds.BURNING);
|
||||
|
||||
targetingPos = -1;
|
||||
rangedCooldown = Random.NormalIntRange( 3, 5 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill(Char target) {
|
||||
if (!summonedALly) {
|
||||
return 15;
|
||||
} else {
|
||||
return super.attackSkill(target);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
if (!summonedALly) {
|
||||
return Random.NormalIntRange(8, 10);
|
||||
} else {
|
||||
return super.damageRoll();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void meleeProc(Char enemy, int damage) {
|
||||
//no fiery on-hit unless it is an ally summon
|
||||
if (summonedALly) {
|
||||
super.meleeProc(enemy, damage);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -266,22 +386,44 @@ public abstract class Elemental extends Mob {
|
||||
|
||||
@Override
|
||||
public boolean reset() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//not a miniboss, fully HP, otherwise a newborn elemental
|
||||
public static class AllyNewBornElemental extends NewbornFireElemental {
|
||||
|
||||
{
|
||||
HP = HT;
|
||||
properties.remove(Property.MINIBOSS);
|
||||
return !summonedALly;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean reset() {
|
||||
return false;
|
||||
public String description() {
|
||||
String desc = super.description();
|
||||
|
||||
if (summonedALly){
|
||||
desc += " " + Messages.get(this, "desc_ally");
|
||||
} else {
|
||||
desc += " " + Messages.get(this, "desc_boss");
|
||||
}
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
private static final String TARGETING_POS = "targeting_pos";
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put(TARGETING_POS, targetingPos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
targetingPos = bundle.getInt(TARGETING_POS);
|
||||
}
|
||||
}
|
||||
|
||||
//not a miniboss, no ranged attack, otherwise a newborn elemental
|
||||
public static class AllyNewBornElemental extends NewbornFireElemental {
|
||||
|
||||
{
|
||||
rangedCooldown = Integer.MAX_VALUE;
|
||||
|
||||
properties.remove(Property.MINIBOSS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -35,12 +35,12 @@ public class RitualSiteRoom extends StandardRoom {
|
||||
|
||||
@Override
|
||||
public int minWidth() {
|
||||
return Math.max(super.minWidth(), 5);
|
||||
return Math.max(super.minWidth(), 9);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int minHeight() {
|
||||
return Math.max(super.minHeight(), 5);
|
||||
return Math.max(super.minHeight(), 9);
|
||||
}
|
||||
|
||||
public void paint( Level level ) {
|
||||
|
||||
@@ -156,7 +156,7 @@ public abstract class ElementalSprite extends MobSprite {
|
||||
public static class NewbornFire extends ElementalSprite {
|
||||
|
||||
{
|
||||
boltType = MagicMissile.FIRE;
|
||||
boltType = MagicMissile.ELMO;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user