v0.7.0: significant implementation and polish for exotic potions

This commit is contained in:
Evan Debenham 2018-07-20 03:09:58 -04:00
parent c14995902e
commit ef3c7b03db
23 changed files with 364 additions and 88 deletions

View File

@ -58,6 +58,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.ShadowCaster;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
@ -695,7 +696,7 @@ public class Dungeon {
}
public static void observe(){
observe( hero.viewDistance+1 );
observe( ShadowCaster.MAX_DISTANCE+1 );
}
public static void observe( int dist ) {

View File

@ -55,13 +55,14 @@ public class SmokeScreen extends Blob {
@Override
public void clear(int cell) {
super.clear(cell);
//TODO
Level l = Dungeon.level;
l.losBlocking[cell] = cur[cell] > 0 || (Terrain.flags[l.map[cell]] & Terrain.LOS_BLOCKING) != 0;
}
@Override
public void fullyClear() {
super.fullyClear();
//TODO
Dungeon.level.buildFlagMaps();
}
@Override

View File

@ -60,8 +60,7 @@ public class StormCloud extends Blob {
@Override
public void use( BlobEmitter emitter ) {
super.use( emitter );
//TODO finalize VFX
emitter.pour( Speck.factory( Speck.CONFUSION ), 0.4f );
emitter.pour( Speck.factory( Speck.STORM ), 0.4f );
}
@Override

View File

@ -0,0 +1,81 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2018 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.utils.Bundle;
public class AdrenalineSurge extends Buff {
private int boost;
private static final float INTERVAL = TICK * 500f;
public void reset(){
boost = 2;
spend(INTERVAL - cooldown());
}
public int boost(){
return boost;
}
@Override
public boolean act() {
boost --;
if (boost > 0){
spend( INTERVAL );
} else {
detach();
}
return true;
}
@Override
public int icon() {
return BuffIndicator.FURY;
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", boost, dispTurns(cooldown()+1));
}
private static final String BOOST = "boost";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( BOOST, boost );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
boost = bundle.getInt( BOOST );
}
}

View File

@ -57,7 +57,7 @@ public class Barkskin extends Buff {
if (Math.sqrt(interval)*level < Math.sqrt(time)*value) {
level = value;
interval = time;
spend(cooldown() - time);
spend(time - cooldown());
}
}
@ -74,7 +74,7 @@ public class Barkskin extends Buff {
@Override
//TODO
public String desc() {
return Messages.get(this, "desc", level);
return Messages.get(this, "desc", level, dispTurns(cooldown()+1));
}
private static final String LEVEL = "level";

View File

@ -21,7 +21,10 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundle;
public class Barrier extends ShieldBuff {
@ -62,4 +65,24 @@ public class Barrier extends ShieldBuff {
shielding = bundle.getInt("level");
}
}
@Override
public int icon() {
return BuffIndicator.ARMOR;
}
@Override
public void tintIcon(Image icon) {
icon.tint(0, 0.5f, 1, 0.5f);
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", shielding);
}
}

View File

@ -28,7 +28,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ParalyticGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Regrowth;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SmokeScreen;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StenchGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.StormCloud;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Web;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -63,7 +65,9 @@ public class BlobImmunity extends FlavourBuff {
immunities.add( Freezing.class );
immunities.add( ParalyticGas.class );
immunities.add( Regrowth.class );
immunities.add( SmokeScreen.class );
immunities.add( StenchGas.class );
immunities.add( StormCloud.class );
immunities.add( ToxicGas.class );
immunities.add( Web.class );
}

View File

@ -40,6 +40,7 @@ public class Buff extends Actor {
//determines how the buff is announced when it is shown.
//buffs that work behind the scenes, or have other visual indicators can usually be silent.
//FIXME should extend this to more buffs, want silent positive and silent negative?
public enum buffType {POSITIVE, NEGATIVE, NEUTRAL, SILENT};
public buffType type = buffType.SILENT;

View File

@ -0,0 +1,67 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2018 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class MagicalSight extends FlavourBuff {
public static final float DURATION = 30f;
public int distance = 8;
{
type = buffType.POSITIVE;
}
@Override
public int icon() {
return BuffIndicator.MIND_VISION;
}
@Override
public void tintIcon(Image icon) {
greyIcon(icon, 5f, cooldown());
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public void detach() {
super.detach();
Dungeon.observe();
GameScene.updateFog();
}
@Override
public String desc() {
return Messages.get(this, "desc", dispTurns());
}
}

View File

@ -21,6 +21,31 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
//TODO
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.watabou.noosa.Image;
public class Stamina extends FlavourBuff {
@Override
public int icon() {
return BuffIndicator.MOMENTUM;
}
@Override
public void tintIcon(Image icon) {
icon.tint(1, 1, 0, 0.5f);
if (cooldown() < 5f) greyIcon(icon, 5f, cooldown());
}
@Override
public String toString() {
return Messages.get(this, "name");
}
@Override
public String desc() {
return Messages.get(this, "desc", dispTurns());
}
}

View File

@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AdrenalineSurge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Berserk;
@ -76,7 +77,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfAdrenalineSurge;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEvasion;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror;
@ -200,7 +200,7 @@ public class Hero extends Char {
STR += RingOfMight.strengthBonus( this );
PotionOfAdrenalineSurge.strBoost buff = buff(PotionOfAdrenalineSurge.strBoost.class);
AdrenalineSurge buff = buff(AdrenalineSurge.class);
if (buff != null){
STR += buff.boost();
}

View File

@ -67,6 +67,7 @@ public class Speck extends Image {
public static final int RED_LIGHT = 114;
public static final int CALM = 115;
public static final int SMOKE = 116;
public static final int STORM = 117;
private static final int SIZE = 7;
@ -113,6 +114,7 @@ public class Speck extends Image {
case PARALYSIS:
case STENCH:
case CONFUSION:
case STORM:
case DUST:
case SMOKE:
frame( film.get( STEAM ) );
@ -316,6 +318,13 @@ public class Speck extends Image {
lifespan = Random.Float( 1f, 3f );
break;
case STORM:
hardlight( 0x8AD8D8 );
angularSpeed = Random.Float( -20, +20 );
angle = Random.Float( 360 );
lifespan = Random.Float( 1f, 3f );
break;
case SMOKE:
hardlight( 0x000000 );
angularSpeed = 30;
@ -433,6 +442,7 @@ public class Speck extends Image {
case TOXIC:
case PARALYSIS:
case CONFUSION:
case STORM:
case DUST:
am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 0.5f );
scale.set( 1 + p );

View File

@ -41,6 +41,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.ItemStatusHandler;
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCorrosiveGas;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfShroudingFog;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze;
@ -137,11 +138,12 @@ public class Potion extends Item {
static{
canThrowPots.add(PotionOfPurity.class);
canThrowPots.add(PotionOfLevitation.class);
canThrowPots.add(PotionOfCleansing.class);
}
protected static ItemStatusHandler<Potion> handler;
private String color;
protected String color;
public boolean ownedByFruit = false;
@ -344,14 +346,12 @@ public class Potion extends Item {
@Override
public String name() {
return isKnown() ? super.name() : Messages.get(Potion.class, color);
return isKnown() ? super.name() : Messages.get(this, color);
}
@Override
public String info() {
return isKnown() ?
desc() :
Messages.get(Potion.class, "unknown_desc");
return isKnown() ? desc() : Messages.get(this, "unknown_desc");
}
public Integer initials(){

View File

@ -111,6 +111,7 @@ public class ExoticPotion extends Potion {
super.reset();
if (handler != null && handler.contains(exoToReg.get(this.getClass()))) {
image = handler.image(exoToReg.get(this.getClass())) + 16;
color = handler.label(exoToReg.get(this.getClass()));
}
}

View File

@ -21,58 +21,16 @@
package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AdrenalineSurge;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
public class PotionOfAdrenalineSurge extends ExoticPotion {
@Override
public void apply(Hero hero) {
setKnown();
Buff.affect(hero, strBoost.class).reset();
Buff.affect(hero, AdrenalineSurge.class).reset();
}
public static class strBoost extends Buff {
int boost;
private static final float INTERVAL = TICK * 500f;
public void reset(){
boost = 2;
spend(INTERVAL - cooldown());
}
public int boost(){
return boost;
}
@Override
public boolean act() {
boost --;
if (boost > 0){
spend( INTERVAL );
} else {
detach();
}
return true;
}
//TODO visuals
@Override
public int icon() {
return BuffIndicator.MOMENTUM;
}
@Override
public String toString() {
return "surge";
}
@Override
public String desc() {
return "cur boost: +" + boost + "\n\nleft: " + dispTurns(cooldown());
}
}
}

View File

@ -21,15 +21,50 @@
package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.watabou.noosa.audio.Sample;
public class PotionOfCleansing extends ExoticPotion {
@Override
public void apply( Hero hero ) {
setKnown();
//TODO detach all debuffs, and satifsy hunger
//perhaps heal a little too?
cleanse( hero );
}
@Override
public void shatter(int cell) {
if (Actor.findChar(cell) == null){
super.shatter(cell);
} else {
if (Dungeon.level.heroFOV[cell]) {
Sample.INSTANCE.play(Assets.SND_SHATTER);
splash(cell);
setKnown();
}
if (Actor.findChar(cell) != null){
cleanse(Actor.findChar(cell));
}
}
}
public static void cleanse(Char ch){
for (Buff b : ch.buffs()){
if (b.type == Buff.buffType.NEGATIVE && !(b instanceof Corruption)){
b.detach();
}
if (b instanceof Hunger){
((Hunger) b).satisfy(Hunger.STARVING);
}
}
}
}

View File

@ -40,6 +40,6 @@ public class PotionOfCorrosiveGas extends ExoticPotion {
Sample.INSTANCE.play( Assets.SND_SHATTER );
}
GameScene.add( Blob.seed( cell, 100, CorrosiveGas.class ).setStrength( 1 + Dungeon.depth/5));
GameScene.add( Blob.seed( cell, 120, CorrosiveGas.class ).setStrength( 1 + Dungeon.depth/5));
}
}

View File

@ -57,10 +57,6 @@ public class PotionOfDragonsBreath extends ExoticPotion {
detach( hero.belongings.backpack );
setKnown();
//hero.spend( TIME_TO_DRINK );
//hero.busy();
//apply( hero );
GameScene.selectCell(targeter);
}

View File

@ -23,7 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSight;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
public class PotionOfMagicalSight extends ExoticPotion {
@ -31,13 +31,9 @@ public class PotionOfMagicalSight extends ExoticPotion {
@Override
public void apply(Hero hero) {
setKnown();
Buff.affect(hero, MagicalSight.class, 30f);
Buff.affect(hero, MagicalSight.class, MagicalSight.DURATION);
Dungeon.observe();
}
public static class MagicalSight extends FlavourBuff {
}
}

View File

@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Awareness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicalSight;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MindVision;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Shadows;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
@ -51,7 +52,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfMagicalSight;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment;
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfIntuition;
@ -566,7 +566,7 @@ public abstract class Level implements Bundlable {
return null;
}
protected void buildFlagMaps() {
public void buildFlagMaps() {
for (int i=0; i < length(); i++) {
int flags = Terrain.flags[map[i]];
@ -861,23 +861,32 @@ public abstract class Level implements Bundlable {
for (Buff b : c.buffs( MindVision.class )) {
sense = Math.max( ((MindVision)b).distance, sense );
}
if (c.buff(PotionOfMagicalSight.MagicalSight.class) != null){
if (c.buff(MagicalSight.class) != null){
sense = 8;
}
}
//TODO rounding
if ((sighted && sense > 1) || !sighted) {
//uses rounding
if (!sighted || sense > 1) {
int ax = Math.max( 0, cx - sense );
int bx = Math.min( cx + sense, width() - 1 );
int ay = Math.max( 0, cy - sense );
int by = Math.min( cy + sense, height() - 1 );
int len = bx - ax + 1;
int pos = ax + ay * width();
for (int y = ay; y <= by; y++, pos+=width()) {
System.arraycopy(discoverable, pos, fieldOfView, pos, len);
int[][] rounding = ShadowCaster.rounding;
int left, right;
int pos;
for (int y = Math.max(0, cy - sense); y <= Math.min(height()-1, cy + sense); y++) {
if (rounding[sense][Math.abs(cy - y)] < Math.abs(cy - y)) {
left = cx - rounding[sense][Math.abs(cy - y)];
} else {
left = sense;
while (rounding[sense][left] < rounding[sense][Math.abs(cy - y)]){
left--;
}
left = cx - left;
}
right = Math.min(width()-1, cx + cx - left);
left = Math.max(0, left);
pos = left + y * width();
System.arraycopy(discoverable, pos, fieldOfView, pos, right - left);
}
}

View File

@ -31,7 +31,7 @@ public final class ShadowCaster {
//max length of rows as FOV moves out, for each FOV distance
//This is used to make the overall FOV circular, instead of square
private static int[][] rounding;
public static int[][] rounding;
static {
rounding = new int[MAX_DISTANCE+1][];
for (int i=1; i <= MAX_DISTANCE; i++) {

View File

@ -14,8 +14,12 @@ actors.blobs.goowarn.desc=Specks of dark energy are swarming here!
actors.blobs.paralyticgas.desc=A cloud of paralytic gas is swirling here.
actors.blobs.smokescreen.desc=A cloud of thick black smoke is swirling here.
actors.blobs.stenchgas.desc=A cloud of fetid stench is swirling here.
actors.blobs.stormcloud.desc=A cloud of billowing water vapor is swirling here.
actors.blobs.toxicgas.desc=A greenish cloud of toxic gas is swirling here.
actors.blobs.toxicgas.rankings_desc=Suffocated
actors.blobs.toxicgas.ondeath=You died from the toxic gas...
@ -38,11 +42,17 @@ actors.blobs.web.desc=Everything is covered with a thick web here.
actors.buffs.adrenaline.name=Adrenaline
actors.buffs.adrenaline.desc=A surge of physical power, adrenaline enhanced both attack and movement speed.\n\nAdrenaline allows its target to run at 2x speed, and attack at 1.5x speed.\n\nTurns remaining: %s.
actors.buffs.adrenalinesurge.name=Adrenaline Surge
actors.buffs.adrenalinesurge.desc=A surge of great might, but sadly not permanent.\n\nStrength boost: +%d.\nTurns until boost weakens: %s.
actors.buffs.amok.name=Amok
actors.buffs.amok.desc=Amok causes a state of great rage and confusion in its target.\n\nWhen a creature is amoked, they will attack whatever is near them, whether they be friend or foe.\n\nTurns of amok remaining: %s.
actors.buffs.barkskin.name=Barkskin
actors.buffs.barkskin.desc=Your skin is hardened, it feels rough and solid like bark.\n\nThe hardened skin increases your effective armor, allowing you to better defend against physical attack. The armor bonus will decrease by one point each turn until it expires.\n\nYour armor is currently increased by: %d.
actors.buffs.barkskin.desc=Your skin is hardened, it feels rough and solid like bark.\n\nThe hardened skin increases your effective armor, allowing you to better defend against physical attack.\n\nYour armor is currently increased by: %d.\nTurns until barkskin weakens: %s.
actors.buffs.barrier.name=Barrier
actors.buffs.barrier.desc=A durable bubble of force which blocks all damage.\n\nThe barrier will take damage for whatever it is protecting so long as there is shielding left. The shielding will also decay at a rate of 1 per turn.\n\nShielding remaining: %d.
actors.buffs.berserk.angered=Angered
actors.buffs.berserk.berserk=Berserking
@ -156,6 +166,9 @@ actors.buffs.light.desc=Even in the Darkest Dungeon, a steady light at your side
actors.buffs.lockedfloor.name=Floor is Locked
actors.buffs.lockedfloor.desc=The current floor is locked, and you are unable to leave it!\n\nWhile a floor is locked, you will not gain hunger or take damage from starving. In addition, if you do not work towards defeating this floor's boss, passive regeneration effects will also stop.\n\nAdditionally, if you are revived by an unblessed ankh while the floor is locked, then it will reset.\n\nKill this floor's boss to break the lock.
actors.buffs.magicalsight.name=Magical Sight
actors.buffs.magicalsight.desc=Somehow you are able to see with your mind, rather than your eyes.\n\nAll terrain or effects which reduce or block vision are broken while magical sight is active.\n\nTurns of magical sight remaining: %s.
actors.buffs.magicalsleep.name=Magical Sleep
actors.buffs.magicalsleep.toohealthy=You are too healthy, and resist the urge to sleep.
actors.buffs.magicalsleep.fallasleep=You fall into a deep magical sleep.
@ -217,6 +230,9 @@ actors.buffs.snipersmark.desc=The sniper is honed in on a nearby target, gaining
actors.buffs.soulmark.name=Soul Marked
actors.buffs.soulmark.desc=The warlock has tapped into the soul of this creature. He will heal and satisfy his hunger as it takes physical damage.\n\nTurns of soul mark remaining: %s.
actors.buffs.stamina.name=Stamina
actors.buffs.stamina.desc=You have unending stamina, allowing for faster movement!\n\nWhile under the effects of stamina you will run at +50%% speed, but will perform all other actions at normal speed.\n\nTurns of stamina remaining: %s.
actors.buffs.terror.name=Terrified
actors.buffs.terror.desc=Terror is manipulative magic which forces its target into an uncontrollable panic.\n\nTerrified characters are forced to run away from their opponent, trying to put as many doors and walls between them as possible. The shock of pain is enough to break this effect, however.\n\nTurns of terror remaining: %s.

View File

@ -541,6 +541,59 @@ items.potions.potionoftoxicgas.desc=Uncorking or shattering this pressurized gla
###exotic potions
items.potions.exotic.exoticpotion.turquoise=exotic turquoise potion
items.potions.exotic.exoticpotion.crimson=exotic crimson potion
items.potions.exotic.exoticpotion.azure=exotic azure potion
items.potions.exotic.exoticpotion.jade=exotic jade potion
items.potions.exotic.exoticpotion.golden=exotic golden potion
items.potions.exotic.exoticpotion.magenta=exotic magenta potion
items.potions.exotic.exoticpotion.charcoal=exotic charcoal potion
items.potions.exotic.exoticpotion.ivory=exotic ivory potion
items.potions.exotic.exoticpotion.amber=exotic amber potion
items.potions.exotic.exoticpotion.bistre=exotic bistre potion
items.potions.exotic.exoticpotion.indigo=exotic indigo potion
items.potions.exotic.exoticpotion.silver=exotic silver potion
items.potions.exotic.exoticpotion.unknown_desc=This round flask contains a grainy colorful liquid. It seems to be foreign to this land, who knows what it might do when drunk or thrown?
items.potions.exotic.potionofadrenalinesurge.name=potion of adrenaline surge
items.potions.exotic.potionofadrenalinesurge.desc=This powerful liquid will give you a greater boost of strength that withers after an extended period of time.
items.potions.exotic.potionofcleansing.name=potion of cleansing
items.potions.exotic.potionofcleansing.desc=This power reagent will completely neutralize all harmful effects on the drinker when quaffed. It can be thrown at a target to cleanse them as well.
items.potions.exotic.potionofcorrosivegas.name=potion of corrosive gas
items.potions.exotic.potionofcorrosivegas.desc=Uncorking or shattering this pressurized glass will cause its contents to explode into a deadly cloud of corrosive rust-colored gas. The gas is less concentrated however, and will not last for very long.
items.potions.exotic.potionofdragonsbreath.name=potion of dragon's breath
items.potions.exotic.potionofdragonsbreath.desc=This flask contains an unusual compound which bursts into flame shortly after mixing with saliva. Quickly spitting the liquid will allow the user to spew flame from their mouth!
items.potions.exotic.potionofearthenarmor.name=potion of earthen armor
items.potions.exotic.potionofearthenarmor.desc=Rather than paralyze, this liquid has a hardening effect on the skin which will turn it into temporary natural armor.
items.potions.exotic.potionofholyfuror.name=potion of holy furor
items.potions.exotic.potionofholyfuror.desc=The power of holy energy reduced to liquid form, this draught will bless you for an extended period of time.
items.potions.exotic.potionofmagicalsight.name=potion of magical sight
items.potions.exotic.potionofmagicalsight.desc=After drinking this, your senses will be breifly heightened to incredible levels, allowing you to see through walls!
items.potions.exotic.potionofshielding.name=potion of shielding
items.potions.exotic.potionofshielding.desc=Rather than heal, this potion will instead project a durable shield around the users body, blocking a considerable amount of damage.
items.potions.exotic.potionofshroudingfog.name=potion of shrouding fog
items.potions.exotic.potionofshroudingfog.desc=When exposed to air, the liquid in this flask will produce a thick smoky fog which completely blocks vision.
items.potions.exotic.potionofsnapfreeze.name=potion of snap freeze
items.potions.exotic.potionofsnapfreeze.desc=The chemical contained in this potion will rapidly react with the air, instantly freezing and rooting all within its effect.
items.potions.exotic.potionofstamina.name=potion of stamina
items.potions.exotic.potionofstamina.desc=Drinking this oddly sweet liquid will imbue you with a long-lasting boost of energy, allowing you to run at a quickened pace for an extended period of time.
items.potions.exotic.potionofstormclouds.name=potion of storm clouds
items.potions.exotic.potionofstormclouds.desc=Throwing this potion will create a cloud of concentrated vapor, which will condense and pour down onto the environment. Most terrain will be converted to water, and traps will be overwhelmed and break.
###quest items
items.quest.ceremonialcandle.name=ceremonial candle
items.quest.ceremonialcandle.desc=A set of candles, melted down and fused together through use.\n\nAlone they are worthless, but used with other candles in a pattern, they can focus the energy for a summoning ritual.