v3.0.0: Implemented Trinity mind form for wands
This commit is contained in:
@@ -552,6 +552,7 @@ actors.hero.abilities.cleric.trinity.no_duplicate=Trinity cannot duplicate an ef
|
|||||||
actors.hero.abilities.cleric.trinity.ench_glyph_use=Trinity will apply this effect for _%1$d turns_ at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.ench_glyph_use=Trinity will apply this effect for _%1$d turns_ at the cost of _%2$s charge._
|
||||||
actors.hero.abilities.cleric.trinity.rare_ench_glyph_use=Trinity will apply this _powerful_ effect for _%1$d turns_ at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.rare_ench_glyph_use=Trinity will apply this _powerful_ effect for _%1$d turns_ at the cost of _%2$s charge._
|
||||||
actors.hero.abilities.cleric.trinity.wand_use=Trinity will zap this wand at _+%1$d_ at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.wand_use=Trinity will zap this wand at _+%1$d_ at the cost of _%2$s charge._
|
||||||
|
actors.hero.abilities.cleric.trinity.wand_multi_use=Trinity will zap this _multi-charge_ wand at _+%1$d_ at the cost of _%2$s charge._
|
||||||
actors.hero.abilities.cleric.trinity.thrown_use=Trinity will throw this weapon at _+%1$d_ at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.thrown_use=Trinity will throw this weapon at _+%1$d_ at the cost of _%2$s charge._
|
||||||
actors.hero.abilities.cleric.trinity.ring_use=Trinity will apply this ring's effect at _+%1$d_ for 20 turns, at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.ring_use=Trinity will apply this ring's effect at _+%1$d_ for 20 turns, at the cost of _%2$s charge._
|
||||||
actors.hero.abilities.cleric.trinity.artifact_use=Trinity will apply this artifact's effect at _+%1$d_, at the cost of _%2$s charge._
|
actors.hero.abilities.cleric.trinity.artifact_use=Trinity will apply this artifact's effect at _+%1$d_, at the cost of _%2$s charge._
|
||||||
|
|||||||
+36
-4
@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
@@ -42,6 +43,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
|
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
|
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
|
||||||
@@ -52,6 +55,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
@@ -84,6 +88,14 @@ public class Trinity extends ArmorAbility {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int targetedPos(Char user, int dst) {
|
||||||
|
if (mindForm != null){
|
||||||
|
return ((Item)mindForm).targetingPos((Hero)user, dst);
|
||||||
|
}
|
||||||
|
return super.targetedPos(user, dst);
|
||||||
|
}
|
||||||
|
|
||||||
public class WndUseTrinity extends WndTitledMessage {
|
public class WndUseTrinity extends WndTitledMessage {
|
||||||
|
|
||||||
public WndUseTrinity(ClassArmor armor) {
|
public WndUseTrinity(ClassArmor armor) {
|
||||||
@@ -107,7 +119,7 @@ public class Trinity extends ArmorAbility {
|
|||||||
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
|
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
|
||||||
hide();
|
hide();
|
||||||
} else {
|
} else {
|
||||||
Buff.affect(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
|
Buff.prolong(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
|
||||||
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||||
Weapon w = new WornShortsword();
|
Weapon w = new WornShortsword();
|
||||||
if (Dungeon.hero.belongings.weapon() != null) {
|
if (Dungeon.hero.belongings.weapon() != null) {
|
||||||
@@ -140,7 +152,7 @@ public class Trinity extends ArmorAbility {
|
|||||||
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
|
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
|
||||||
hide();
|
hide();
|
||||||
} else {
|
} else {
|
||||||
Buff.affect(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
|
Buff.prolong(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
|
||||||
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||||
Armor a = new ClothArmor();
|
Armor a = new ClothArmor();
|
||||||
if (Dungeon.hero.belongings.armor() != null) {
|
if (Dungeon.hero.belongings.armor() != null) {
|
||||||
@@ -178,7 +190,17 @@ public class Trinity extends ArmorAbility {
|
|||||||
+ " " + trinityItemUseText(mindForm.getClass()), 6){
|
+ " " + trinityItemUseText(mindForm.getClass()), 6){
|
||||||
@Override
|
@Override
|
||||||
protected void onClick() {
|
protected void onClick() {
|
||||||
//TODO
|
hide();
|
||||||
|
MindForm.targetSelector mindEffect = new MindForm.targetSelector();
|
||||||
|
mindEffect.setEffect(mindForm);
|
||||||
|
GameScene.selectCell(mindEffect);
|
||||||
|
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||||
|
Enchanting.show(Dungeon.hero, (Item)mindForm);
|
||||||
|
Dungeon.hero.sprite.operate(Dungeon.hero.pos);
|
||||||
|
|
||||||
|
if (((Item) mindForm).usesTargeting && Dungeon.quickslot.contains(armor)){
|
||||||
|
QuickSlotButton.useTargeting(Dungeon.quickslot.getSlot(armor));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
btnMind.icon(new ItemSprite((Item)mindForm));
|
btnMind.icon(new ItemSprite((Item)mindForm));
|
||||||
@@ -187,6 +209,8 @@ public class Trinity extends ArmorAbility {
|
|||||||
btnMind.setRect(0, top + 2, width, btnMind.reqHeight());
|
btnMind.setRect(0, top + 2, width, btnMind.reqHeight());
|
||||||
add(btnMind);
|
add(btnMind);
|
||||||
top = (int)btnMind.bottom();
|
top = (int)btnMind.bottom();
|
||||||
|
|
||||||
|
btnMind.enable(armor.charge >= trinityChargeUsePerEffect(mindForm.getClass()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spiritForm != null){
|
if (spiritForm != null){
|
||||||
@@ -202,7 +226,7 @@ public class Trinity extends ArmorAbility {
|
|||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Buff.affect(Dungeon.hero, SpiritForm.SpiritFormBuff.class, SpiritForm.SpiritFormBuff.DURATION).setEffect(spiritForm);
|
Buff.prolong(Dungeon.hero, SpiritForm.SpiritFormBuff.class, SpiritForm.SpiritFormBuff.DURATION).setEffect(spiritForm);
|
||||||
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
|
||||||
Enchanting.show(Dungeon.hero, (Item)spiritForm);
|
Enchanting.show(Dungeon.hero, (Item)spiritForm);
|
||||||
Dungeon.hero.sprite.operate(Dungeon.hero.pos);
|
Dungeon.hero.sprite.operate(Dungeon.hero.pos);
|
||||||
@@ -221,6 +245,8 @@ public class Trinity extends ArmorAbility {
|
|||||||
btnSpirit.setRect(0, top + 2, width, btnSpirit.reqHeight());
|
btnSpirit.setRect(0, top + 2, width, btnSpirit.reqHeight());
|
||||||
add(btnSpirit);
|
add(btnSpirit);
|
||||||
top = (int)btnSpirit.bottom();
|
top = (int)btnSpirit.bottom();
|
||||||
|
|
||||||
|
btnSpirit.enable(armor.charge >= trinityChargeUsePerEffect(spiritForm.getClass()));
|
||||||
}
|
}
|
||||||
|
|
||||||
resize(width, top);
|
resize(width, top);
|
||||||
@@ -440,6 +466,9 @@ public class Trinity extends ArmorAbility {
|
|||||||
return Messages.get(Trinity.class, "thrown_use", MindForm.itemLevel(), Messages.decimalFormat("#.##", chargeUse));
|
return Messages.get(Trinity.class, "thrown_use", MindForm.itemLevel(), Messages.decimalFormat("#.##", chargeUse));
|
||||||
}
|
}
|
||||||
if (Wand.class.isAssignableFrom(cls)){
|
if (Wand.class.isAssignableFrom(cls)){
|
||||||
|
if (cls.equals(WandOfFireblast.class) || cls.equals(WandOfRegrowth.class)){
|
||||||
|
return Messages.get(Trinity.class, "wand_multi_use", MindForm.itemLevel(), Messages.decimalFormat("#.##", chargeUse));
|
||||||
|
}
|
||||||
return Messages.get(Trinity.class, "wand_use", MindForm.itemLevel(), Messages.decimalFormat("#.##", chargeUse));
|
return Messages.get(Trinity.class, "wand_use", MindForm.itemLevel(), Messages.decimalFormat("#.##", chargeUse));
|
||||||
}
|
}
|
||||||
if (Ring.class.isAssignableFrom(cls)){
|
if (Ring.class.isAssignableFrom(cls)){
|
||||||
@@ -466,6 +495,9 @@ public class Trinity extends ArmorAbility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (cls.equals(WandOfFireblast.class) || cls.equals(WandOfRegrowth.class)){
|
||||||
|
return 2*chargeUse;
|
||||||
|
}
|
||||||
if (Artifact.class.isAssignableFrom(cls)){
|
if (Artifact.class.isAssignableFrom(cls)){
|
||||||
return chargeUse; //TODO
|
return chargeUse; //TODO
|
||||||
}
|
}
|
||||||
|
|||||||
+106
@@ -22,12 +22,27 @@
|
|||||||
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells;
|
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric.Trinity;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric.Trinity;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
|
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.WondrousResin;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.CursedWand;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
|
import com.watabou.utils.Bundlable;
|
||||||
|
import com.watabou.utils.Callback;
|
||||||
|
import com.watabou.utils.Random;
|
||||||
|
|
||||||
public class MindForm extends ClericSpell {
|
public class MindForm extends ClericSpell {
|
||||||
|
|
||||||
@@ -48,6 +63,10 @@ public class MindForm extends ClericSpell {
|
|||||||
return super.canCast(hero) && hero.hasTalent(Talent.MIND_FORM);
|
return super.canCast(hero) && hero.hasTalent(Talent.MIND_FORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int effectLevel(){
|
||||||
|
return 2 + Dungeon.hero.pointsInTalent(Talent.MIND_FORM);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCast(HolyTome tome, Hero hero) {
|
public void onCast(HolyTome tome, Hero hero) {
|
||||||
|
|
||||||
@@ -59,4 +78,91 @@ public class MindForm extends ClericSpell {
|
|||||||
return 2 + Dungeon.hero.pointsInTalent(Talent.MIND_FORM);
|
return 2 + Dungeon.hero.pointsInTalent(Talent.MIND_FORM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO selecting
|
||||||
|
public static class targetSelector extends CellSelector.Listener {
|
||||||
|
|
||||||
|
private Bundlable effect;
|
||||||
|
|
||||||
|
public void setEffect(Bundlable effect){
|
||||||
|
this.effect = effect;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Wand wand(){
|
||||||
|
if (effect instanceof Wand){
|
||||||
|
((Wand) effect).level(effectLevel());
|
||||||
|
((Wand) effect).curCharges = ((Wand) effect).maxCharges;
|
||||||
|
((Wand) effect).identify(false);
|
||||||
|
return (Wand)effect;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MissileWeapon thrown(){
|
||||||
|
if (effect instanceof MissileWeapon){
|
||||||
|
((MissileWeapon) effect).level(effectLevel());
|
||||||
|
((MissileWeapon) effect).identify(false);
|
||||||
|
return (MissileWeapon) effect;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSelect(Integer target) {
|
||||||
|
if (target == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (wand() != null){
|
||||||
|
Wand wand = wand();
|
||||||
|
if (wand.tryToZap(Dungeon.hero, target)) {
|
||||||
|
|
||||||
|
final Ballistica shot = new Ballistica( Dungeon.hero.pos, target, wand.collisionProperties(target));
|
||||||
|
int cell = shot.collisionPos;
|
||||||
|
|
||||||
|
if (target == Dungeon.hero.pos || cell == Dungeon.hero.pos) {
|
||||||
|
GLog.i( Messages.get(Wand.class, "self_target") );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dungeon.hero.sprite.zap(cell);
|
||||||
|
|
||||||
|
//attempts to target the cell aimed at if something is there, otherwise targets the collision pos.
|
||||||
|
if (Actor.findChar(target) != null)
|
||||||
|
QuickSlotButton.target(Actor.findChar(target));
|
||||||
|
else
|
||||||
|
QuickSlotButton.target(Actor.findChar(cell));
|
||||||
|
|
||||||
|
wand.fx(shot, new Callback() {
|
||||||
|
public void call() {
|
||||||
|
wand.onZap(shot);
|
||||||
|
if (Random.Float() < WondrousResin.extraCurseEffectChance()){
|
||||||
|
WondrousResin.forcePositive = true;
|
||||||
|
CursedWand.cursedZap(wand,
|
||||||
|
Dungeon.hero,
|
||||||
|
new Ballistica(Dungeon.hero.pos, cell, Ballistica.MAGIC_BOLT), new Callback() {
|
||||||
|
@Override
|
||||||
|
public void call() {
|
||||||
|
WondrousResin.forcePositive = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
((ClassArmor)Dungeon.hero.belongings.armor()).charge -= Trinity.trinityChargeUsePerEffect(wand.getClass());
|
||||||
|
wand.wandUsed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (thrown() != null){
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String prompt() {
|
||||||
|
if (wand() != null){
|
||||||
|
return Messages.get(Wand.class, "prompt");
|
||||||
|
} else {
|
||||||
|
return Messages.get(Item.class, "prompt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -433,7 +433,7 @@ public abstract class Wand extends Item {
|
|||||||
particle.radiateXY(0.5f);
|
particle.radiateXY(0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void wandUsed() {
|
public void wandUsed() {
|
||||||
if (!isIdentified()) {
|
if (!isIdentified()) {
|
||||||
float uses = Math.min( availableUsesToID, Talent.itemIDSpeedFactor(Dungeon.hero, this) );
|
float uses = Math.min( availableUsesToID, Talent.itemIDSpeedFactor(Dungeon.hero, this) );
|
||||||
availableUsesToID -= uses;
|
availableUsesToID -= uses;
|
||||||
|
|||||||
Reference in New Issue
Block a user