v2.2.0: implemented VFX, text, and some boss tweaks to the crystal quest

This commit is contained in:
Evan Debenham
2023-09-21 16:59:21 -04:00
parent 2e90a74b7d
commit 3eec9c8d6e
4 changed files with 41 additions and 23 deletions

View File

@@ -956,7 +956,7 @@ actors.mobs.npcs.blacksmith.intro_quest_huntress=Hey Human! You look like a quic
actors.mobs.npcs.blacksmith.intro_quest_duelist=Hey Human! You look like a brave one.
actors.mobs.npcs.blacksmith.intro_quest_cleric=Hey Human! You look like an important one.
actors.mobs.npcs.blacksmith.intro_quest_start=Wanna be useful, eh? Yeah I got something you could do. I built dis workshop ontop of an old mine, it's just down dat ladder. Take dis pickaxe and mine me some _dark gold ore. 40 pieces_ should be enough.\n\nWhat do you mean, how am I gonna pay? You greedy...\n\nOk, ok, I can do some smithin' for you. Consider yourself lucky, I'm the only blacksmith around.
actors.mobs.npcs.blacksmith.intro_quest_crystal=Careful though, the mine's dangerous for a little human like you. It's been abandoned for a while, and bunch of crystals have started growing. They're shiny, but too fragile to be worth anythin', and they've got some magic things protecting 'em. They're pretty strong, so _be careful where you mine_ or you'll get their attention.\n\nThere's a _giant crystal_ somewhere too. It's a lot tougher, so be prepared for a fight if you start breakin' it. I'll bet smashing it will slow all other crystals down though, so I'll pay extra if you can do it.
actors.mobs.npcs.blacksmith.intro_quest_crystal=Careful though, the mine's dangerous for a little human like you. It's been abandoned for a while, and bunch of crystals have started growing. They're shiny, but too fragile to be worth anythin', and they've got some magic things protecting 'em. They're pretty strong, so _be careful where you mine_ or you'll get their attention.\n\nThere's a _giant crystal_ somewhere too. It's a lot tougher, so be prepared for a fight if you start breakin' it. I'll bet smashing it will slow all the crystal growth down though, so I'll pay extra if you can do it.
actors.mobs.npcs.blacksmith.intro_quest_fungi=Careful though, the mine's dangerous for a little human like you. There's some sorta fungus monster that's been growing down there. It's got mushroom sentries that're really deadly if they see you, but they can't get up and chase you at least. _Keep out of sight_ if you want to stay alive.\n\nI'll pay extra if you can manage to take down the _biggest mushrom,_ but it'll take some real effort. It's connected to a bunch of mycelium nodes that're hidden in the walls. You'll have to break most of 'em before you can really damage it.
actors.mobs.npcs.blacksmith.intro_quest_gnoll=Careful though, the mine's dangerous for a little human like you. Some gnolls want the gold too and now they're wreckin' the place. They're stupid things, so their mining has caused all sorts of collapses and cave-ins. You'll have to mine though it, so _look for recently disturbed rock._\n\nI think one of the gnolls is causing most of the trouble, probably a _geomancer shaman_ or somethin'. I'll pay extra, if you can find and kill it, but I'm sure it'll fight back.
actors.mobs.npcs.blacksmith.reminder=You done wastin' my time? The mine entrance is over there.
@@ -1112,7 +1112,7 @@ actors.mobs.crab.name=sewer crab
actors.mobs.crab.desc=These huge crabs are at the top of the food chain in the sewers. They are extremely fast and their thick carapace can withstand heavy blows.
actors.mobs.crystalguardian.name=crystal guardian
actors.mobs.crystalguardian.desc=TODO
actors.mobs.crystalguardian.desc=These large crystalline guardians almost look like statues, if it weren't for their bright glowing eyes. The hardened crystal they're made out of causes them to be sluggish but very tough, so _it's best to leave them to sleep in their crystal nest for as long as possible._\n\nDue to their size, crystal guardians will move much more slowly in enclosed spaces. They're also so durable that they're impossible to kill outright. They can be beaten down and temporarily disabled, but they'll just get back up again after a little while.
actors.mobs.crystalmimic.name=crystal mimic
actors.mobs.crystalmimic.ate=The mimic ate your %s!
@@ -1120,10 +1120,12 @@ actors.mobs.crystalmimic.escaped=The crystal mimic has escaped!
actors.mobs.crystalmimic.desc=Mimics are magical creatures which can take any shape they wish. In dungeons they almost always choose a shape of a treasure chest, in order to lure in unsuspecting adventurers.\n\nCrystal mimics are trickier than their regular cousins, and prefer to avoid conflict while stealing loot. They will attempt to sprint away once discovered, and have the ability to reposition enemies when they attack.
actors.mobs.crystalspire.name=crystal spire
actors.mobs.crystalspire.desc=TODO
actors.mobs.crystalspire.warning=The crystal vibrates as you strike it. Keeping this up is bound to draw attention to you...
actors.mobs.crystalspire.alert=The vibration grows and rumbles through the whole cave!
actors.mobs.crystalspire.desc=This gigantic spire of ultra hard crystal is probably the source of all the strange crystalline creatures in this cave. Your regular weapons are ineffective against it, so you'll need to use your pickaxe if you want to destroy it.\n\nBreaking such a big crystal is likely to take a while though, and you probably won't be able to do it undisturbed. The spire itself may even have some means of defending itself as well. _Make sure you're prepared before you start breaking it._
actors.mobs.crystalwisp.name=crystal wisp
actors.mobs.crystalwisp.desc=TODO
actors.mobs.crystalwisp.desc=A small angry floating chunk of hardened crystal that's producing a bright glow. While not especially strong, crystal wisps will shoot a damaging beam of light at you if they have a clear shot.\n\nWisps are small enough to easily move through the various crystal outcroppings, but they aren't able to shoot through them.
actors.mobs.demonspawner.name=demon spawner
actors.mobs.demonspawner.on_death=The demonic energy here seems to lessen as the spawner dies.

View File

@@ -229,7 +229,7 @@ levels.level.empty_well_desc=The well has run dry.
levels.mininglevel.crystal_name=Crystal spike
levels.mininglevel.boulder_name=Boulder
levels.mininglevel.crystal_desc=There is a large and colorful crystal outcropping here. Crystal is fragile, and can easily be broken with a pickaxe, or will break if something is mined next to it.
levels.mininglevel.crystal_desc=There is a large and colorful crystal outcropping here. These crystals are fragile and can easily be broken with a pickaxe, or will break if something is mined next to it.
levels.mininglevel.boulder_desc=There is a large boulder is blocking the way. It should be fairly easy to break with a pickaxe.
levels.prisonlevel.water_name=Dark cold water

View File

@@ -26,7 +26,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
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.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
@@ -83,11 +82,11 @@ public class CrystalGuardian extends Mob{
@Override
public boolean isAlive() {
if (HP <= 0 && !Blacksmith.Quest.bossBeaten()){
if (HP <= 0){
HP = 1;
if (sprite != null) ((CrystalGuardianSprite)sprite).crumple();
spend(10f-cooldown());
Buff.affect(this, Healing.class).setHeal(100, 0, 10);
spend(20f-cooldown());
Buff.affect(this, Healing.class).setHeal(100, 0, 5);
}
return super.isAlive();
}

View File

@@ -26,17 +26,18 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
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.Haste;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Pickaxe;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrystalSpireSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BossHealthBar;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
@@ -83,6 +84,8 @@ public class CrystalSpire extends Mob {
super.damage(dmg, src);
}
int hits = 0;
@Override
public boolean interact(Char c) {
if (c == Dungeon.hero){
@@ -113,18 +116,29 @@ public class CrystalSpire extends Mob {
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);
hits++;
if (hits == 1){
GLog.w(Messages.get(CrystalSpire.class, "warning"));
PixelScene.shake( 1, 0.7f );
Sample.INSTANCE.play( Assets.Sounds.MINE );
} else if (hits >= 3) {
if (hits == 3){
Sample.INSTANCE.play( Assets.Sounds.ROCKS );
PixelScene.shake( 3, 0.7f );
GLog.n(Messages.get(CrystalSpire.class, "alert"));
BossHealthBar.assignBoss(CrystalSpire.this);
}
for (Char ch : Actor.chars()) {
if (ch instanceof CrystalWisp) {
((CrystalWisp) ch).beckon(pos);
} else if (ch instanceof CrystalGuardian) {
((CrystalGuardian) ch).beckon(pos);
if (((CrystalGuardian) ch).state != HUNTING) {
((CrystalGuardian) ch).aggro(Dungeon.hero);
}
}
}
}
@@ -159,17 +173,20 @@ public class CrystalSpire extends Mob {
}
public static final String SPRITE = "sprite";
public static final String HITS = "hits";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(SPRITE, spriteClass);
bundle.put(HITS, hits);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
spriteClass = bundle.getClass(SPRITE);
hits = bundle.getInt(HITS);
}
{