v3.0.0: fully implemented body form's effect

This commit is contained in:
Evan Debenham
2025-02-03 16:39:23 -05:00
parent 9f9c3a2bdc
commit 3c963e917f
9 changed files with 246 additions and 28 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -548,6 +548,14 @@ actors.hero.abilities.cleric.ascendedform$ascendbuff.name=ascended form
actors.hero.abilities.cleric.ascendedform$ascendbuff.desc=Radiant energy is emanating from the Cleric's body. While in this form the Cleric gains 2 attack range (from the holy energy projecting from them), and 10 shielding whenever they spend a holy tome charge. They are also able to cast the spells which are unlocked via ascended form's talents.\n\nThe shield granted by ascended form and its spells will not decay normally, but will instantly fade when ascended form ends.\n\nCurrent shielding: %1$d.\nTurns remaining: %2$d.
actors.hero.abilities.cleric.trinity.name=trinity
actors.hero.abilities.cleric.trinity.no_imbue=Trinity has no effect set for any of its forms currently, use one of its spells!
actors.hero.abilities.cleric.trinity.no_duplicate=Trinity cannot duplicate an effect that you already have equipped!
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.wand_use=Trinity will zap this 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.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.cost=The charge cost of this ability varies, but is most often _%d._
actors.hero.abilities.cleric.trinity.short_desc=The Cleric gains a _Trinity_ of abilities, which emulate equipment they have seen and can be assigned by using new spells.
actors.hero.abilities.cleric.trinity.desc=The Cleric gains a _Trinity_ of armor abilities, which can be assigned to various item effects by using three new spells. Each of these spells focuses on emulating the effects of different kinds of equipment that the Cleric has identified during this run: body form (weapons and armor), mind form (wands and thrown weapons), and spirit form (rings and artifacts).\n\nEach Trinity form can be imbued with one effect at a time, and the Cleric chooses which one to activate when using Trinity. Trinity will not duplicate the effect of something you already have equipped.
actors.hero.abilities.cleric.trinity$wndusetrinity.text=Select which form of Trinity to use. The effects of different forms can be active simultaneously.
@@ -558,13 +566,6 @@ actors.hero.abilities.cleric.trinity$wnditemtypeselect.text=Select an effect to
actors.hero.abilities.cleric.trinity$wnditemconfirm.body=Assign to body form
actors.hero.abilities.cleric.trinity$wnditemconfirm.mind=Assign to mind form
actors.hero.abilities.cleric.trinity$wnditemconfirm.spirit=Assign to spirit form
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.wand_use=Trinity will zap this 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.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.cost=The charge cost of this ability varies, but is most often _%d._
actors.hero.abilities.cleric.powerofmany.name=power of many
actors.hero.abilities.cleric.powerofmany.short_desc=_(UNFINISHED)_ The Cleric channels the _Power of Many_, empowering an existing ally or creating a new one.
actors.hero.abilities.cleric.powerofmany.desc=_Power of Many has not been implemented yet, and so is currently unselectable._
@@ -593,6 +594,8 @@ actors.hero.spells.blessspell.desc=The Cleric places a holy blessing on themselv
actors.hero.spells.bodyform.name=body form
actors.hero.spells.bodyform.short_desc=Assigns Trinity to an enchant or glyph.
actors.hero.spells.bodyform.desc=The Cleric chooses an enchantment or glyph that they have identified this run and imbues Trinity with its effect.\n\nWhen Trinity is used, The Cleric gains the effect of the chosen enchantment or glyph for %d turns. This temporary enchant or glyph will work with any effect that a regular enchantment or glyph would.\n\nThis spell replaces any other body effect that Trinity is currently imbued with.
actors.hero.spells.bodyform$bodyformbuff.name=body form
actors.hero.spells.bodyform$bodyformbuff.desc=Trinity's body form is currently granting you the power of an enchantment or glyph, as if you had it equipped on your current weapon or armor.\n\nNote that body form cannot provide another copy of an effect that you're already benefitting from.\n\nCurrent Effect: %1$s.\n\nTurns Remaining: %2$s.
actors.hero.spells.cleanse.name=cleanse
actors.hero.spells.cleanse.short_desc=Clears debuffs and grants shielding.

View File

@@ -70,6 +70,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Ch
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.huntress.NaturesPower;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.BodyForm;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HallowedGround;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HolyWard;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HolyWeapon;
@@ -93,6 +94,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClassArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.AlchemistsToolkit;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns;
@@ -140,6 +142,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Quarterstaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RoundShield;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sai;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Scimitar;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog;
import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
@@ -1449,6 +1452,12 @@ public class Hero extends Char {
if (wep != null) {
damage = wep.proc( this, enemy, damage );
} else {
boolean wasEnemy = enemy.alignment == Alignment.ENEMY;
if (buff(BodyForm.BodyFormBuff.class) != null
&& buff(BodyForm.BodyFormBuff.class).enchant() != null){
damage = buff(BodyForm.BodyFormBuff.class).enchant().proc(new WornShortsword(), this, enemy, damage);
}
if (!wasEnemy || enemy.alignment == Alignment.ENEMY) {
if (buff(HolyWeapon.HolyWepBuff.class) != null) {
int dmg = subClass == HeroSubClass.PALADIN ? 6 : 2;
enemy.damage(Math.round(dmg * Weapon.Enchantment.genericProcChanceMultiplier(this)), HolyWeapon.INSTANCE);
@@ -1457,6 +1466,7 @@ public class Hero extends Char {
enemy.damage(Smite.bonusDmg(this, enemy), Smite.INSTANCE);
}
}
}
switch (subClass) {
case SNIPER:
@@ -1501,10 +1511,16 @@ public class Hero extends Char {
if (belongings.armor() != null) {
damage = belongings.armor().proc( enemy, this, damage );
} else if (buff(HolyWard.HolyArmBuff.class) != null){
} else {
if (buff(BodyForm.BodyFormBuff.class) != null
&& buff(BodyForm.BodyFormBuff.class).glyph() != null){
damage = buff(BodyForm.BodyFormBuff.class).glyph().proc(new ClothArmor(), enemy, this, damage);
}
if (buff(HolyWard.HolyArmBuff.class) != null){
int blocking = subClass == HeroSubClass.PALADIN ? 3 : 1;
damage -= Math.round(blocking * Armor.Glyph.genericProcChanceMultiplier(enemy));
}
}
WandOfLivingEarth.RockArmor rockArmor = buff(WandOfLivingEarth.RockArmor.class);
if (rockArmor != null) {
@@ -1518,6 +1534,10 @@ public class Hero extends Char {
public int glyphLevel(Class<? extends Armor.Glyph> cls) {
if (belongings.armor() != null && belongings.armor().hasGlyph(cls, this)){
return Math.max(super.glyphLevel(cls), belongings.armor.buffedLvl());
} else if (buff(BodyForm.BodyFormBuff.class) != null
&& buff(BodyForm.BodyFormBuff.class).glyph() != null
&& buff(BodyForm.BodyFormBuff.class).glyph().getClass() == cls){
return belongings.armor() != null ? belongings.armor.buffedLvl() : 0;
} else {
return super.glyphLevel(cls);
}

View File

@@ -24,6 +24,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility;
@@ -77,14 +79,14 @@ public class Trinity extends ArmorAbility {
if (bodyForm == null && mindForm == null && spiritForm == null){
GLog.w(Messages.get(this, "no_imbue"));
} else {
GameScene.show(new WndUseTrinity());
GameScene.show(new WndUseTrinity(armor));
}
}
public class WndUseTrinity extends WndTitledMessage {
public WndUseTrinity() {
public WndUseTrinity(ClassArmor armor) {
super(new HeroIcon(Trinity.this),
Messages.titleCase(Trinity.this.name()),
Messages.get(WndUseTrinity.class, "text"));
@@ -100,26 +102,74 @@ public class Trinity extends ArmorAbility {
+ " " + trinityItemUseText(bodyForm.getClass()), 6){
@Override
protected void onClick() {
//TODO
if (Dungeon.hero.belongings.weapon() != null &&
((Weapon)Dungeon.hero.belongings.weapon()).enchantment.getClass().equals(bodyForm.getClass())){
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
hide();
} else {
Buff.affect(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
Weapon w = new WornShortsword();
if (Dungeon.hero.belongings.weapon() != null) {
w.image = Dungeon.hero.belongings.weapon().image;
}
w.enchant((Weapon.Enchantment) bodyForm);
Enchanting.show(Dungeon.hero, w);
Dungeon.hero.sprite.operate(Dungeon.hero.pos);
Dungeon.hero.spendAndNext(1f);
armor.charge -= trinityChargeUsePerEffect(bodyForm.getClass());
armor.updateQuickslot();
Invisibility.dispel();
hide();
}
}
};
if (Dungeon.hero.belongings.weapon() != null) {
btnBody.icon(new ItemSprite(Dungeon.hero.belongings.weapon().image, ((Weapon.Enchantment) bodyForm).glowing()));
} else {
btnBody.icon(new ItemSprite(ItemSpriteSheet.WORN_SHORTSWORD, ((Weapon.Enchantment) bodyForm).glowing()));
}
} else if (bodyForm instanceof Armor.Glyph){
btnBody = new RedButton(Messages.get(WndUseTrinity.class, "body",
Messages.titleCase(((Armor.Glyph)bodyForm).name()))
+ " " + trinityItemUseText(bodyForm.getClass()), 6){
@Override
protected void onClick() {
//TODO
if (Dungeon.hero.belongings.armor() != null &&
(Dungeon.hero.belongings.armor()).glyph.getClass().equals(bodyForm.getClass())){
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
hide();
} else {
Buff.affect(Dungeon.hero, BodyForm.BodyFormBuff.class, BodyForm.duration()).setEffect(bodyForm);
Sample.INSTANCE.play(Assets.Sounds.TELEPORT);
Armor a = new ClothArmor();
if (Dungeon.hero.belongings.armor() != null) {
a.image = Dungeon.hero.belongings.armor().image;
}
a.inscribe((Armor.Glyph) bodyForm);
Enchanting.show(Dungeon.hero, a);
Dungeon.hero.sprite.operate(Dungeon.hero.pos);
Dungeon.hero.spendAndNext(1f);
armor.charge -= trinityChargeUsePerEffect(bodyForm.getClass());
armor.updateQuickslot();
Invisibility.dispel();
hide();
}
}
};
if (Dungeon.hero.belongings.armor() != null) {
btnBody.icon(new ItemSprite(Dungeon.hero.belongings.armor().image, ((Armor.Glyph) bodyForm).glowing()));
} else {
btnBody.icon(new ItemSprite(ItemSpriteSheet.ARMOR_CLOTH, ((Armor.Glyph) bodyForm).glowing()));
}
}
btnBody.multiline = true;
btnBody.setSize(width, 100); //for text layout
btnBody.setRect(0, top + 2, width, btnBody.reqHeight());
add(btnBody);
top = (int)btnBody.bottom();
btnBody.enable(armor.charge >= trinityChargeUsePerEffect(bodyForm.getClass()));
}
if (mindForm != null){
@@ -145,6 +195,12 @@ public class Trinity extends ArmorAbility {
+ " " + trinityItemUseText(spiritForm.getClass()), 6){
@Override
protected void onClick() {
if (Dungeon.hero.belongings.ring().getClass().equals(spiritForm.getClass())
|| Dungeon.hero.belongings.misc().getClass().equals(spiritForm.getClass())
|| Dungeon.hero.belongings.artifact().getClass().equals(spiritForm.getClass())){
GLog.w(Messages.get(Trinity.class, "no_duplicate"));
hide();
}
//TODO
}
};
@@ -241,10 +297,16 @@ public class Trinity extends ArmorAbility {
for (Class<?> cls : discoveredClasses){
if (Weapon.Enchantment.class.isAssignableFrom(cls)){
MeleeWeapon w = new WornShortsword();
if (Dungeon.hero.belongings.weapon() != null){
w.image = Dungeon.hero.belongings.weapon().image;
}
w.enchant((Weapon.Enchantment) Reflection.newInstance(cls));
options.add(w);
} else if (Armor.Glyph.class.isAssignableFrom(cls)) {
Armor a = new ClothArmor();
if (Dungeon.hero.belongings.armor() != null){
a.image = Dungeon.hero.belongings.armor().image;
}
a.inscribe((Armor.Glyph) Reflection.newInstance(cls));
options.add(a);
} else {
@@ -349,16 +411,16 @@ public class Trinity extends ArmorAbility {
}
public static String trinityItemUseText(Class<?> cls ){
float chargeUse = Dungeon.hero.armorAbility.chargeUse(Dungeon.hero);
float chargeUse = trinityChargeUsePerEffect(cls);
if (Weapon.Enchantment.class.isAssignableFrom(cls) || Armor.Glyph.class.isAssignableFrom(cls)) {
for (Class ench : Weapon.Enchantment.rare) {
if (ench.equals(cls)) {
return Messages.get(Trinity.class, "rare_ench_glyph_use", BodyForm.duration(), Messages.decimalFormat("#.##", 2*chargeUse));
return Messages.get(Trinity.class, "rare_ench_glyph_use", BodyForm.duration(), Messages.decimalFormat("#.##", chargeUse));
}
}
for (Class glyph : Armor.Glyph.rare){
if (glyph.equals(cls)){
return Messages.get(Trinity.class, "rare_ench_glyph_use", BodyForm.duration(), Messages.decimalFormat("#.##", 2*chargeUse));
return Messages.get(Trinity.class, "rare_ench_glyph_use", BodyForm.duration(), Messages.decimalFormat("#.##", chargeUse));
}
}
return Messages.get(Trinity.class, "ench_glyph_use", BodyForm.duration(), Messages.decimalFormat("#.##", chargeUse));
@@ -379,4 +441,25 @@ public class Trinity extends ArmorAbility {
}
public static float trinityChargeUsePerEffect(Class<?> cls){
float chargeUse = Dungeon.hero.armorAbility.chargeUse(Dungeon.hero);
if (Weapon.Enchantment.class.isAssignableFrom(cls) || Armor.Glyph.class.isAssignableFrom(cls)) {
for (Class ench : Weapon.Enchantment.rare) {
if (ench.equals(cls)) {
return 2*chargeUse;
}
}
for (Class glyph : Armor.Glyph.rare){
if (glyph.equals(cls)){
return 2*chargeUse;
}
}
}
if (Artifact.class.isAssignableFrom(cls)){
return chargeUse; //TODO
}
//all other effects are standard charge use
return chargeUse;
}
}

View File

@@ -22,12 +22,20 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric.Trinity;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.HeroIcon;
import com.watabou.noosa.Image;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
public class BodyForm extends ClericSpell {
@@ -59,4 +67,70 @@ public class BodyForm extends ClericSpell {
return Math.round(13.33f + 6.67f* Dungeon.hero.pointsInTalent(Talent.BODY_FORM));
}
public static class BodyFormBuff extends FlavourBuff {
{
type = buffType.POSITIVE;
}
private Bundlable effect;
@Override
public int icon() {
return BuffIndicator.TRINITY_FORM;
}
@Override
public void tintIcon(Image icon) {
icon.hardlight(1, 0, 0);
}
@Override
public float iconFadePercent() {
return Math.max(0, (duration() - visualcooldown()) / duration());
}
public void setEffect(Bundlable effect){
this.effect = effect;
}
public Weapon.Enchantment enchant(){
if (effect instanceof Weapon.Enchantment){
return (Weapon.Enchantment) effect;
}
return null;
}
public Armor.Glyph glyph(){
if (effect instanceof Armor.Glyph){
return (Armor.Glyph) effect;
}
return null;
}
@Override
public String desc() {
if (enchant() != null){
return Messages.get(this, "desc", Messages.titleCase(enchant().name()), dispTurns());
} else if (glyph() != null){
return Messages.get(this, "desc", Messages.titleCase(glyph().name()), dispTurns());
}
return super.desc();
}
private static final String EFFECT = "effect";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put(EFFECT, effect);
}
@Override
public void restoreFromBundle(Bundle bundle) {
super.restoreFromBundle(bundle);
effect = bundle.get(EFFECT);
}
}
}

View File

@@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.AuraOfProtection;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.BodyForm;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HolyWard;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
@@ -434,18 +435,33 @@ public class Armor extends EquipableItem {
public int proc( Char attacker, Char defender, int damage ) {
if (defender.buff(MagicImmune.class) == null) {
Glyph trinityGlyph = null;
if (Dungeon.hero.buff(BodyForm.BodyFormBuff.class) != null){
trinityGlyph = Dungeon.hero.buff(BodyForm.BodyFormBuff.class).glyph();
if (glyph != null && trinityGlyph != null && trinityGlyph.getClass() == glyph.getClass()){
trinityGlyph = null;
}
}
if (defender instanceof Hero && isEquipped((Hero) defender)
&& defender.buff(HolyWard.HolyArmBuff.class) != null){
if (glyph != null &&
(((Hero) defender).subClass == HeroSubClass.PALADIN || hasCurseGlyph())){
damage = glyph.proc( this, attacker, defender, damage );
}
if (trinityGlyph != null){
damage = trinityGlyph.proc( this, attacker, defender, damage );
}
int blocking = ((Hero) defender).subClass == HeroSubClass.PALADIN ? 3 : 1;
damage -= Math.round(blocking * Glyph.genericProcChanceMultiplier(defender));
} else {
if (glyph != null) {
damage = glyph.proc(this, attacker, defender, damage);
}
if (trinityGlyph != null){
damage = trinityGlyph.proc( this, attacker, defender, damage );
}
//so that this effect procs for allies using this armor via aura of protection
if (defender.alignment == Dungeon.hero.alignment
&& Dungeon.level.distance(defender.pos, Dungeon.hero.pos) <= 2

View File

@@ -32,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.cleric.AscendedForm;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.ElementalStrike;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.BodyForm;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.HolyWeapon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.spells.Smite;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
@@ -122,6 +123,15 @@ abstract public class Weapon extends KindOfWeapon {
boolean becameAlly = false;
boolean wasAlly = defender.alignment == Char.Alignment.ALLY;
if (attacker.buff(MagicImmune.class) == null) {
//TODO body form
Enchantment trinityEnchant = null;
if (Dungeon.hero.buff(BodyForm.BodyFormBuff.class) != null){
trinityEnchant = Dungeon.hero.buff(BodyForm.BodyFormBuff.class).enchant();
if (enchantment != null && trinityEnchant != null && trinityEnchant.getClass() == enchantment.getClass()){
trinityEnchant = null;
}
}
if (attacker instanceof Hero && isEquipped((Hero) attacker)
&& attacker.buff(HolyWeapon.HolyWepBuff.class) != null){
if (enchantment != null &&
@@ -131,16 +141,27 @@ abstract public class Weapon extends KindOfWeapon {
becameAlly = true;
}
}
if (defender.isAlive() && !becameAlly && trinityEnchant != null){
damage = trinityEnchant.proc(this, attacker, defender, damage);
}
if (defender.isAlive() && !becameAlly) {
int dmg = ((Hero) attacker).subClass == HeroSubClass.PALADIN ? 6 : 2;
defender.damage(Math.round(dmg * Enchantment.genericProcChanceMultiplier(attacker)), HolyWeapon.INSTANCE);
}
} else if (enchantment != null) {
} else {
if (enchantment != null) {
damage = enchantment.proc(this, attacker, defender, damage);
if (defender.alignment == Char.Alignment.ALLY && !wasAlly) {
becameAlly = true;
}
}
if (defender.isAlive() && !becameAlly && trinityEnchant != null){
damage = trinityEnchant.proc(this, attacker, defender, damage);
}
}
if (attacker instanceof Hero && isEquipped((Hero) attacker) &&
attacker.buff(Smite.SmiteTracker.class) != null && !becameAlly){
defender.damage(Smite.bonusDmg((Hero) attacker, defender), Smite.INSTANCE);

View File

@@ -131,6 +131,7 @@ public class BuffIndicator extends Component {
public static final int ASCEND = 79;
public static final int PROT_AURA = 80;
public static final int ILLUMINATED = 81;
public static final int TRINITY_FORM= 82;
public static final int SIZE_SMALL = 7;
public static final int SIZE_LARGE = 16;