v0.7.0: rough implementation of some exotic potions/scrolls
This commit is contained in:
parent
e3ec860e18
commit
c95c5e93ad
|
@ -49,6 +49,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Speed;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Speed;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Stamina;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
|
||||||
|
@ -281,6 +282,7 @@ public abstract class Char extends Actor {
|
||||||
public float speed() {
|
public float speed() {
|
||||||
float speed = baseSpeed;
|
float speed = baseSpeed;
|
||||||
if ( buff( Cripple.class ) != null ) speed /= 2f;
|
if ( buff( Cripple.class ) != null ) speed /= 2f;
|
||||||
|
if ( buff( Stamina.class ) != null) speed *= 1.5f;
|
||||||
if ( buff( Adrenaline.class ) != null) speed *= 2f;
|
if ( buff( Adrenaline.class ) != null) speed *= 2f;
|
||||||
if ( buff( Haste.class ) != null) speed *= 3f;
|
if ( buff( Haste.class ) != null) speed *= 3f;
|
||||||
return speed;
|
return speed;
|
||||||
|
|
|
@ -33,6 +33,7 @@ import com.watabou.utils.Bundle;
|
||||||
|
|
||||||
public class CorrosiveGas extends Blob {
|
public class CorrosiveGas extends Blob {
|
||||||
|
|
||||||
|
//FIXME should have strength per-cell
|
||||||
private int strength = 0;
|
private int strength = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -57,9 +58,11 @@ public class CorrosiveGas extends Blob {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStrength(int str){
|
public CorrosiveGas setStrength(int str){
|
||||||
if (str > strength)
|
if (str > strength) {
|
||||||
strength = str;
|
strength = str;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String STRENGTH = "strength";
|
private static final String STRENGTH = "strength";
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
public class Stamina extends FlavourBuff {
|
||||||
|
}
|
|
@ -76,6 +76,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
|
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.RingOfEvasion;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce;
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfForce;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror;
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfFuror;
|
||||||
|
@ -198,6 +199,11 @@ public class Hero extends Char {
|
||||||
int STR = this.STR;
|
int STR = this.STR;
|
||||||
|
|
||||||
STR += RingOfMight.strengthBonus( this );
|
STR += RingOfMight.strengthBonus( this );
|
||||||
|
|
||||||
|
PotionOfAdrenalineSurge.strBoost buff = buff(PotionOfAdrenalineSurge.strBoost.class);
|
||||||
|
if (buff != null){
|
||||||
|
STR += buff.boost();
|
||||||
|
}
|
||||||
|
|
||||||
return (buff(Weakness.class) != null) ? STR - 2 : STR;
|
return (buff(Weakness.class) != null) ? STR - 2 : STR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -529,16 +529,28 @@ public class Armor extends EquipableItem {
|
||||||
Obfuscation.class, Swiftness.class, Viscosity.class, Potential.class,
|
Obfuscation.class, Swiftness.class, Viscosity.class, Potential.class,
|
||||||
Brimstone.class, Stone.class, Entanglement.class, Repulsion.class, Camouflage.class, Flow.class,
|
Brimstone.class, Stone.class, Entanglement.class, Repulsion.class, Camouflage.class, Flow.class,
|
||||||
Affection.class, AntiMagic.class, Thorns.class };
|
Affection.class, AntiMagic.class, Thorns.class };
|
||||||
private static final float[] chances= new float[]{
|
|
||||||
10, 10, 10, 10,
|
private static final Class<?>[] common = new Class<?>[]{
|
||||||
5, 5, 5, 5, 5, 5,
|
Obfuscation.class, Swiftness.class, Viscosity.class, Potential.class };
|
||||||
2, 2, 2 };
|
|
||||||
|
private static final Class<?>[] uncommon = new Class<?>[]{
|
||||||
|
Brimstone.class, Stone.class, Entanglement.class,
|
||||||
|
Repulsion.class, Camouflage.class, Flow.class };
|
||||||
|
|
||||||
|
private static final Class<?>[] rare = new Class<?>[]{
|
||||||
|
Affection.class, AntiMagic.class, Thorns.class };
|
||||||
|
|
||||||
|
private static final float[] typeChances = new float[]{
|
||||||
|
40, //10 each
|
||||||
|
30, // 5 each
|
||||||
|
6 // 2 each
|
||||||
|
};
|
||||||
|
|
||||||
private static final Class<?>[] curses = new Class<?>[]{
|
private static final Class<?>[] curses = new Class<?>[]{
|
||||||
AntiEntropy.class, Corrosion.class, Displacement.class, Metabolism.class,
|
AntiEntropy.class, Corrosion.class, Displacement.class, Metabolism.class,
|
||||||
Multiplicity.class, Stench.class, Overgrowth.class, Bulk.class
|
Multiplicity.class, Stench.class, Overgrowth.class, Bulk.class
|
||||||
};
|
};
|
||||||
|
|
||||||
public abstract int proc( Armor armor, Char attacker, Char defender, int damage );
|
public abstract int proc( Armor armor, Char attacker, Char defender, int damage );
|
||||||
|
|
||||||
public String name() {
|
public String name() {
|
||||||
|
@ -572,14 +584,46 @@ public class Armor extends EquipableItem {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static Glyph random() {
|
public static Glyph random() {
|
||||||
|
switch(Random.chances(typeChances)){
|
||||||
|
case 0: default:
|
||||||
|
return randomCommon();
|
||||||
|
case 1:
|
||||||
|
return randomUncommon();
|
||||||
|
case 2:
|
||||||
|
return randomRare();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Glyph randomCommon(){
|
||||||
try {
|
try {
|
||||||
return ((Class<Glyph>)glyphs[ Random.chances( chances ) ]).newInstance();
|
return ((Class<Glyph>)Random.oneOf(common)).newInstance();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ShatteredPixelDungeon.reportException(e);
|
ShatteredPixelDungeon.reportException(e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Glyph randomUncommon(){
|
||||||
|
try {
|
||||||
|
return ((Class<Glyph>)Random.oneOf(uncommon)).newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShatteredPixelDungeon.reportException(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Glyph randomRare(){
|
||||||
|
try {
|
||||||
|
return ((Class<Glyph>)Random.oneOf(rare)).newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShatteredPixelDungeon.reportException(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static Glyph randomCurse(){
|
public static Glyph randomCurse(){
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -41,6 +41,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.ItemStatusHandler;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
|
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCorrosiveGas;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog;
|
import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
|
@ -121,6 +123,10 @@ public class Potion extends Item {
|
||||||
mustThrowPots.add(PotionOfLiquidFlame.class);
|
mustThrowPots.add(PotionOfLiquidFlame.class);
|
||||||
mustThrowPots.add(PotionOfParalyticGas.class);
|
mustThrowPots.add(PotionOfParalyticGas.class);
|
||||||
mustThrowPots.add(PotionOfFrost.class);
|
mustThrowPots.add(PotionOfFrost.class);
|
||||||
|
|
||||||
|
//exotic
|
||||||
|
mustThrowPots.add(PotionOfCorrosiveGas.class);
|
||||||
|
mustThrowPots.add(PotionOfSnapFreeze.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final HashSet<Class<?extends Potion>> canThrowPots = new HashSet<>();
|
private static final HashSet<Class<?extends Potion>> canThrowPots = new HashSet<>();
|
||||||
|
@ -313,8 +319,10 @@ public class Potion extends Item {
|
||||||
updateQuickslot();
|
updateQuickslot();
|
||||||
Potion p = Dungeon.hero.belongings.getItem(getClass());
|
Potion p = Dungeon.hero.belongings.getItem(getClass());
|
||||||
if (p != null) p.setAction();
|
if (p != null) p.setAction();
|
||||||
p = Dungeon.hero.belongings.getItem(ExoticPotion.regToExo.get(getClass()));
|
if (ExoticPotion.regToExo.get(getClass()) != null) {
|
||||||
if (p != null) p.setAction();
|
p = Dungeon.hero.belongings.getItem(ExoticPotion.regToExo.get(getClass()));
|
||||||
|
if (p != null) p.setAction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dungeon.hero.isAlive()) {
|
if (Dungeon.hero.isAlive()) {
|
||||||
|
|
|
@ -26,7 +26,12 @@ import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
|
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -41,8 +46,23 @@ public class ExoticPotion extends Potion {
|
||||||
public static final HashMap<Class<?extends Potion>, Class<?extends ExoticPotion>> regToExo = new HashMap<>();
|
public static final HashMap<Class<?extends Potion>, Class<?extends ExoticPotion>> regToExo = new HashMap<>();
|
||||||
public static final HashMap<Class<?extends ExoticPotion>, Class<?extends Potion>> exoToReg = new HashMap<>();
|
public static final HashMap<Class<?extends ExoticPotion>, Class<?extends Potion>> exoToReg = new HashMap<>();
|
||||||
static{
|
static{
|
||||||
regToExo.put(PotionOfHealing.class, PotionOfSheilding.class);
|
regToExo.put(PotionOfHealing.class, PotionOfShielding.class);
|
||||||
exoToReg.put(PotionOfSheilding.class, PotionOfHealing.class);
|
exoToReg.put(PotionOfShielding.class, PotionOfHealing.class);
|
||||||
|
|
||||||
|
regToExo.put(PotionOfToxicGas.class, PotionOfCorrosiveGas.class);
|
||||||
|
exoToReg.put(PotionOfCorrosiveGas.class, PotionOfToxicGas.class);
|
||||||
|
|
||||||
|
regToExo.put(PotionOfStrength.class, PotionOfAdrenalineSurge.class);
|
||||||
|
exoToReg.put(PotionOfAdrenalineSurge.class, PotionOfStrength.class);
|
||||||
|
|
||||||
|
regToExo.put(PotionOfFrost.class, PotionOfSnapFreeze.class);
|
||||||
|
exoToReg.put(PotionOfSnapFreeze.class, PotionOfFrost.class);
|
||||||
|
|
||||||
|
regToExo.put(PotionOfHaste.class, PotionOfStamina.class);
|
||||||
|
exoToReg.put(PotionOfStamina.class, PotionOfHaste.class);
|
||||||
|
|
||||||
|
regToExo.put(PotionOfLiquidFlame.class, PotionOfDragonsBreath.class);
|
||||||
|
exoToReg.put(PotionOfDragonsBreath.class, PotionOfLiquidFlame.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* 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.items.potions.exotic;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* 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.items.potions.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
|
||||||
|
public class PotionOfCorrosiveGas extends ExoticPotion {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shatter( int cell ) {
|
||||||
|
|
||||||
|
if (Dungeon.level.heroFOV[cell]) {
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
splash( cell );
|
||||||
|
Sample.INSTANCE.play( Assets.SND_SHATTER );
|
||||||
|
}
|
||||||
|
|
||||||
|
GameScene.add( Blob.seed( cell, 100, CorrosiveGas.class ).setStrength( 1 + Dungeon.depth/5));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,185 @@
|
||||||
|
/*
|
||||||
|
* 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.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.blobs.Blob;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.Callback;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
public class PotionOfDragonsBreath extends ExoticPotion {
|
||||||
|
|
||||||
|
//a lot of this is copy-paste from wand of fireblast
|
||||||
|
|
||||||
|
//the actual affected cells
|
||||||
|
private HashSet<Integer> affectedCells;
|
||||||
|
//the cells to trace fire shots to, for visual effects.
|
||||||
|
private HashSet<Integer> visualCells;
|
||||||
|
private int direction = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
//need to override drink so that time isn't spent right away
|
||||||
|
protected void drink(final Hero hero) {
|
||||||
|
detach( hero.belongings.backpack );
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
//hero.spend( TIME_TO_DRINK );
|
||||||
|
//hero.busy();
|
||||||
|
//apply( hero );
|
||||||
|
|
||||||
|
GameScene.selectCell(targeter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CellSelector.Listener targeter = new CellSelector.Listener() {
|
||||||
|
@Override
|
||||||
|
public void onSelect(final Integer cell) {
|
||||||
|
|
||||||
|
if (cell == null){
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Sample.INSTANCE.play( Assets.SND_DRINK );
|
||||||
|
curUser.sprite.operate(curUser.pos, new Callback() {
|
||||||
|
@Override
|
||||||
|
public void call() {
|
||||||
|
|
||||||
|
curUser.spend(1f);
|
||||||
|
curUser.sprite.idle();
|
||||||
|
curUser.sprite.zap(cell);
|
||||||
|
|
||||||
|
final Ballistica bolt
|
||||||
|
= new Ballistica(curUser.pos, cell, Ballistica.MAGIC_BOLT);
|
||||||
|
|
||||||
|
affectedCells = new HashSet<>();
|
||||||
|
visualCells = new HashSet<>();
|
||||||
|
|
||||||
|
int maxDist = 6;
|
||||||
|
int dist = Math.min(bolt.dist, maxDist);
|
||||||
|
|
||||||
|
for (int i = 0; i < PathFinder.CIRCLE8.length; i++) {
|
||||||
|
if (bolt.sourcePos + PathFinder.CIRCLE8[i] == bolt.path.get(1)) {
|
||||||
|
direction = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float strength = maxDist;
|
||||||
|
for (int c : bolt.subPath(1, dist)) {
|
||||||
|
strength--; //as we start at dist 1, not 0.
|
||||||
|
affectedCells.add(c);
|
||||||
|
if (strength > 1) {
|
||||||
|
spreadFlames(c + PathFinder.CIRCLE8[left(direction)], strength - 1);
|
||||||
|
spreadFlames(c + PathFinder.CIRCLE8[direction], strength - 1);
|
||||||
|
spreadFlames(c + PathFinder.CIRCLE8[right(direction)], strength - 1);
|
||||||
|
} else {
|
||||||
|
visualCells.add(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//going to call this one manually
|
||||||
|
visualCells.remove(bolt.path.get(dist));
|
||||||
|
|
||||||
|
for (int c : visualCells) {
|
||||||
|
//this way we only get the cells at the tip, much better performance.
|
||||||
|
((MagicMissile) curUser.sprite.parent.recycle(MagicMissile.class)).reset(
|
||||||
|
MagicMissile.FIRE_CONE,
|
||||||
|
curUser.sprite,
|
||||||
|
c,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MagicMissile.boltFromChar(curUser.sprite.parent,
|
||||||
|
MagicMissile.FIRE_CONE,
|
||||||
|
curUser.sprite,
|
||||||
|
bolt.path.get(dist / 2),
|
||||||
|
new Callback() {
|
||||||
|
@Override
|
||||||
|
public void call() {
|
||||||
|
for (int cell : affectedCells){
|
||||||
|
//ignore caster cell
|
||||||
|
if (cell == bolt.sourcePos){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameScene.add( Blob.seed( cell, 5, Fire.class ) );
|
||||||
|
|
||||||
|
Char ch = Actor.findChar( cell );
|
||||||
|
if (ch != null) {
|
||||||
|
|
||||||
|
Buff.affect( ch, Burning.class ).reignite( ch );
|
||||||
|
Buff.affect(ch, Cripple.class, 5f); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String prompt() {
|
||||||
|
return "test";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//burn... BURNNNNN!.....
|
||||||
|
private void spreadFlames(int cell, float strength){
|
||||||
|
if (strength >= 0 && (Dungeon.level.passable[cell] || Dungeon.level.flamable[cell])){
|
||||||
|
affectedCells.add(cell);
|
||||||
|
if (strength >= 1.5f) {
|
||||||
|
visualCells.remove(cell);
|
||||||
|
spreadFlames(cell + PathFinder.CIRCLE8[left(direction)], strength - 1.5f);
|
||||||
|
spreadFlames(cell + PathFinder.CIRCLE8[direction], strength - 1.5f);
|
||||||
|
spreadFlames(cell + PathFinder.CIRCLE8[right(direction)], strength - 1.5f);
|
||||||
|
} else {
|
||||||
|
visualCells.add(cell);
|
||||||
|
}
|
||||||
|
} else if (!Dungeon.level.passable[cell])
|
||||||
|
visualCells.add(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int left(int direction){
|
||||||
|
return direction == 0 ? 7 : direction-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int right(int direction){
|
||||||
|
return direction == 7 ? 0 : direction+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -21,5 +21,6 @@
|
||||||
|
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic;
|
package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic;
|
||||||
|
|
||||||
public class PotionOfSheilding extends ExoticPotion {
|
public class PotionOfShielding extends ExoticPotion {
|
||||||
|
//TODO
|
||||||
}
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* 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.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.blobs.Fire;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Roots;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
|
|
||||||
|
public class PotionOfSnapFreeze extends ExoticPotion {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shatter(int cell) {
|
||||||
|
|
||||||
|
if (Dungeon.level.heroFOV[cell]) {
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
splash( cell );
|
||||||
|
Sample.INSTANCE.play( Assets.SND_SHATTER );
|
||||||
|
}
|
||||||
|
|
||||||
|
Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class );
|
||||||
|
|
||||||
|
for (int offset : PathFinder.NEIGHBOURS9){
|
||||||
|
if (!Dungeon.level.solid[cell+offset]) {
|
||||||
|
|
||||||
|
Freezing.affect( cell + offset, fire );
|
||||||
|
|
||||||
|
Char ch = Actor.findChar( cell + offset);
|
||||||
|
if (ch != null){
|
||||||
|
//TODO balancing on this
|
||||||
|
Buff.affect(ch, Roots.class, 10f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* 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.items.potions.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Stamina;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
|
|
||||||
|
public class PotionOfStamina extends ExoticPotion {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply(Hero hero) {
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
Buff.affect(hero, Stamina.class, 100f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -139,7 +139,7 @@ public class Ring extends KindofMisc {
|
||||||
return handler != null && handler.isKnown( this );
|
return handler != null && handler.isKnown( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setKnown() {
|
public void setKnown() {
|
||||||
if (!isKnown()) {
|
if (!isKnown()) {
|
||||||
handler.know( this );
|
handler.know( this );
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ public abstract class Scroll extends Item {
|
||||||
|
|
||||||
protected static final float TIME_TO_READ = 1f;
|
protected static final float TIME_TO_READ = 1f;
|
||||||
|
|
||||||
protected int initials;
|
protected Integer initials;
|
||||||
|
|
||||||
private static final Class<?>[] scrolls = {
|
private static final Class<?>[] scrolls = {
|
||||||
ScrollOfIdentify.class,
|
ScrollOfIdentify.class,
|
||||||
|
|
|
@ -26,6 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone;
|
import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -39,6 +41,13 @@ public abstract class ExoticScroll extends Scroll {
|
||||||
static{
|
static{
|
||||||
regToExo.put(ScrollOfIdentify.class, ScrollOfForesight.class);
|
regToExo.put(ScrollOfIdentify.class, ScrollOfForesight.class);
|
||||||
exoToReg.put(ScrollOfForesight.class, ScrollOfIdentify.class);
|
exoToReg.put(ScrollOfForesight.class, ScrollOfIdentify.class);
|
||||||
|
|
||||||
|
regToExo.put(ScrollOfUpgrade.class, ScrollOfEnchantment.class);
|
||||||
|
exoToReg.put(ScrollOfEnchantment.class, ScrollOfUpgrade.class);
|
||||||
|
|
||||||
|
regToExo.put(ScrollOfTerror.class, ScrollOfPetrification.class);
|
||||||
|
exoToReg.put(ScrollOfPetrification.class, ScrollOfTerror.class);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* 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.items.scrolls.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
|
||||||
|
import com.watabou.noosa.Game;
|
||||||
|
|
||||||
|
public class ScrollOfDistortion extends ExoticScroll {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doRead() {
|
||||||
|
//FIXME this doesn't handle various edge-cases. especially as it can trigger in boss rooms!
|
||||||
|
InterlevelScene.returnDepth = Dungeon.depth;
|
||||||
|
Belongings belongings = Dungeon.hero.belongings;
|
||||||
|
|
||||||
|
for (Notes.Record rec : Notes.getRecords()){
|
||||||
|
if (rec.depth() == Dungeon.depth){
|
||||||
|
Notes.remove(rec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Item i : belongings){
|
||||||
|
if (i instanceof LloydsBeacon && ((LloydsBeacon) i).returnDepth == Dungeon.depth)
|
||||||
|
((LloydsBeacon) i).returnDepth = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
InterlevelScene.mode = InterlevelScene.Mode.RESET;
|
||||||
|
Game.switchScene(InterlevelScene.class);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* 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.items.scrolls.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Enchanting;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
|
||||||
|
|
||||||
|
public class ScrollOfEnchantment extends ExoticScroll {
|
||||||
|
@Override
|
||||||
|
public void doRead() {
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
GameScene.selectItem( itemSelector, WndBag.Mode.ENCHANTABLE, "TODO" );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static WndBag.Listener itemSelector = new WndBag.Listener() {
|
||||||
|
@Override
|
||||||
|
public void onSelect(final Item item) {
|
||||||
|
|
||||||
|
if (item instanceof Weapon){
|
||||||
|
|
||||||
|
final Weapon.Enchantment enchants[] = new Weapon.Enchantment[3];
|
||||||
|
|
||||||
|
enchants[0] = Weapon.Enchantment.randomCommon();
|
||||||
|
enchants[1] = Weapon.Enchantment.randomUncommon();
|
||||||
|
do {
|
||||||
|
enchants[2] = Weapon.Enchantment.random();
|
||||||
|
} while (enchants[2].getClass() == enchants[0].getClass() ||
|
||||||
|
enchants[1].getClass() == enchants[0].getClass());
|
||||||
|
|
||||||
|
GameScene.show(new WndOptions("title", "body",
|
||||||
|
enchants[0].name(),
|
||||||
|
enchants[1].name(),
|
||||||
|
enchants[2].name(),
|
||||||
|
"cancel"){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSelect(int index) {
|
||||||
|
if (index < 3) {
|
||||||
|
((Weapon) item).enchant(enchants[index]);
|
||||||
|
//TODO text
|
||||||
|
Enchanting.show(curUser, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
final Armor.Glyph glyphs[] = new Armor.Glyph[3];
|
||||||
|
|
||||||
|
glyphs[0] = Armor.Glyph.randomCommon();
|
||||||
|
glyphs[1] = Armor.Glyph.randomUncommon();
|
||||||
|
do {
|
||||||
|
glyphs[2] = Armor.Glyph.random();
|
||||||
|
} while (glyphs[2].getClass() == glyphs[0].getClass() ||
|
||||||
|
glyphs[1].getClass() == glyphs[0].getClass());
|
||||||
|
|
||||||
|
GameScene.show(new WndOptions("title", "body",
|
||||||
|
glyphs[0].name(),
|
||||||
|
glyphs[1].name(),
|
||||||
|
glyphs[2].name(),
|
||||||
|
"cancel"){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSelect(int index) {
|
||||||
|
if (index < 3) {
|
||||||
|
((Armor) item).inscribe(glyphs[index]);
|
||||||
|
//TODO text
|
||||||
|
Enchanting.show(curUser, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -21,9 +21,102 @@
|
||||||
|
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic;
|
package com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Identification;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.Random;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
public class ScrollOfForesight extends ExoticScroll {
|
public class ScrollOfForesight extends ExoticScroll {
|
||||||
@Override
|
@Override
|
||||||
public void doRead() {
|
public void doRead() {
|
||||||
|
|
||||||
|
curUser.sprite.parent.add( new Identification( curUser.sprite.center().offset( 0, -16 ) ) );
|
||||||
|
|
||||||
|
readAnimation();
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
Sample.INSTANCE.play( Assets.SND_READ );
|
||||||
|
Invisibility.dispel();
|
||||||
|
|
||||||
|
HashSet<Class<? extends Potion>> potions = Potion.getUnknown();
|
||||||
|
HashSet<Class<? extends Scroll>> scrolls = Scroll.getUnknown();
|
||||||
|
HashSet<Class<? extends Ring>> rings = Ring.getUnknown();
|
||||||
|
|
||||||
|
int total = potions.size() + scrolls.size() + rings.size();
|
||||||
|
|
||||||
|
if (total == 0){
|
||||||
|
GLog.n("Nothing left to Identify!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
//items which the player holds have lower priority
|
||||||
|
HashSet<Class <? extends Potion>> heldPotions = new HashSet<>();
|
||||||
|
HashSet<Class <? extends Scroll>> heldScrolls = new HashSet<>();
|
||||||
|
HashSet<Class <? extends Ring>> heldRings = new HashSet<>();
|
||||||
|
|
||||||
|
for (Class <? extends Potion> p : potions){
|
||||||
|
if (curUser.belongings.getItem(p) != null){
|
||||||
|
heldPotions.add(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
potions.removeAll(heldPotions);
|
||||||
|
|
||||||
|
for (Class <? extends Scroll> s : scrolls){
|
||||||
|
if (curUser.belongings.getItem(s) != null){
|
||||||
|
heldScrolls.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scrolls.removeAll(heldScrolls);
|
||||||
|
|
||||||
|
for (Class <? extends Ring> r : rings){
|
||||||
|
if (curUser.belongings.getItem(r) != null){
|
||||||
|
heldRings.add(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rings.removeAll(heldRings);*/
|
||||||
|
|
||||||
|
int left = 4;
|
||||||
|
|
||||||
|
while (left > 0 && total > 0) {
|
||||||
|
try {
|
||||||
|
switch (Random.Int(3)) {
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
if (potions.isEmpty()) continue;
|
||||||
|
Potion p = Random.element(potions).newInstance();
|
||||||
|
p.setKnown();
|
||||||
|
GLog.i(p.name() + " identified!");
|
||||||
|
potions.remove(p.getClass());
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (scrolls.isEmpty()) continue;
|
||||||
|
Scroll s = Random.element(scrolls).newInstance();
|
||||||
|
s.setKnown();
|
||||||
|
GLog.i(s.name() + " identified!");
|
||||||
|
scrolls.remove(s.getClass());
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (rings.isEmpty()) continue;
|
||||||
|
Ring r = Random.element(rings).newInstance();
|
||||||
|
r.setKnown();
|
||||||
|
GLog.i(r.name() + " identified!");
|
||||||
|
rings.remove(r.getClass());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShatteredPixelDungeon.reportException(e);
|
||||||
|
}
|
||||||
|
left --;
|
||||||
|
total --;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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.items.scrolls.exotic;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.effects.Flare;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
|
||||||
|
public class ScrollOfPetrification extends ExoticScroll {
|
||||||
|
@Override
|
||||||
|
public void doRead() {
|
||||||
|
new Flare( 5, 32 ).color( 0xFF0000, true ).show( curUser.sprite, 2f );
|
||||||
|
Sample.INSTANCE.play( Assets.SND_READ );
|
||||||
|
Invisibility.dispel();
|
||||||
|
|
||||||
|
for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) {
|
||||||
|
if (Dungeon.level.heroFOV[mob.pos]) {
|
||||||
|
Buff.affect( mob, Paralysis.class, Paralysis.DURATION );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setKnown();
|
||||||
|
|
||||||
|
readAnimation();
|
||||||
|
}
|
||||||
|
}
|
|
@ -265,20 +265,28 @@ abstract public class Weapon extends KindOfWeapon {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static abstract class Enchantment implements Bundlable {
|
public static abstract class Enchantment implements Bundlable {
|
||||||
|
|
||||||
private static final Class<?>[] enchants = new Class<?>[]{
|
private static final Class<?>[] common = new Class<?>[]{
|
||||||
Blazing.class, Venomous.class, Vorpal.class, Shocking.class,
|
Blazing.class, Venomous.class, Vorpal.class, Shocking.class};
|
||||||
Chilling.class, Eldritch.class, Lucky.class, Projecting.class, Unstable.class, Dazzling.class,
|
|
||||||
Grim.class, Stunning.class, Vampiric.class,};
|
private static final Class<?>[] uncommon = new Class<?>[]{
|
||||||
private static final float[] chances= new float[]{
|
Chilling.class, Eldritch.class, Lucky.class,
|
||||||
10, 10, 10, 10,
|
Projecting.class, Unstable.class, Dazzling.class};
|
||||||
5, 5, 5, 5, 5, 5,
|
|
||||||
2, 2, 2 };
|
private static final Class<?>[] rare = new Class<?>[]{
|
||||||
|
Grim.class, Stunning.class, Vampiric.class};
|
||||||
|
|
||||||
|
private static final float[] typeChances = new float[]{
|
||||||
|
40, //10 each
|
||||||
|
30, // 5 each
|
||||||
|
6 // 2 each
|
||||||
|
};
|
||||||
|
|
||||||
private static final Class<?>[] curses = new Class<?>[]{
|
private static final Class<?>[] curses = new Class<?>[]{
|
||||||
Annoying.class, Displacing.class, Exhausting.class, Fragile.class,
|
Annoying.class, Displacing.class, Exhausting.class, Fragile.class,
|
||||||
Sacrificial.class, Wayward.class, Elastic.class, Friendly.class
|
Sacrificial.class, Wayward.class, Elastic.class, Friendly.class
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
public abstract int proc( Weapon weapon, Char attacker, Char defender, int damage );
|
public abstract int proc( Weapon weapon, Char attacker, Char defender, int damage );
|
||||||
|
|
||||||
|
@ -313,8 +321,40 @@ abstract public class Weapon extends KindOfWeapon {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static Enchantment random() {
|
public static Enchantment random() {
|
||||||
|
switch(Random.chances(typeChances)){
|
||||||
|
case 0: default:
|
||||||
|
return randomCommon();
|
||||||
|
case 1:
|
||||||
|
return randomUncommon();
|
||||||
|
case 2:
|
||||||
|
return randomRare();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Enchantment randomCommon() {
|
||||||
try {
|
try {
|
||||||
return ((Class<Enchantment>)enchants[ Random.chances( chances ) ]).newInstance();
|
return ((Class<Enchantment>)Random.oneOf(common)).newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShatteredPixelDungeon.reportException(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Enchantment randomUncommon() {
|
||||||
|
try {
|
||||||
|
return ((Class<Enchantment>)Random.oneOf(uncommon)).newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
ShatteredPixelDungeon.reportException(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Enchantment randomRare() {
|
||||||
|
try {
|
||||||
|
return ((Class<Enchantment>)Random.oneOf(rare)).newInstance();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ShatteredPixelDungeon.reportException(e);
|
ShatteredPixelDungeon.reportException(e);
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -222,6 +222,12 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
|
||||||
play( operate );
|
play( operate );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void operate( int cell, Callback callback ) {
|
||||||
|
animCallback = callback;
|
||||||
|
turnTo( ch.pos, cell );
|
||||||
|
play( operate );
|
||||||
|
}
|
||||||
|
|
||||||
public void zap( int cell ) {
|
public void zap( int cell ) {
|
||||||
turnTo( ch.pos, cell );
|
turnTo( ch.pos, cell );
|
||||||
play( zap );
|
play( zap );
|
||||||
|
|
Loading…
Reference in New Issue
Block a user