v3.0.0: added metamorph fx for T1 cleric talents

This commit is contained in:
Evan Debenham
2025-02-21 13:38:43 -05:00
parent 734b405421
commit 02d0f4e018
12 changed files with 94 additions and 7 deletions

View File

@@ -662,6 +662,7 @@ actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=The Priest will
actors.hero.spells.guidinglight$illuminated.name=Illuminated
actors.hero.spells.guidinglight$illuminated.desc=This character is glowing as a result of being struck by guiding light. While the glow isn't strong enough to brighten the surrounding area, the magical effect will make landing blows on them much easier for the Cleric.
actors.hero.spells.guidinglight$illuminated.desc_priest=The Priest can additionally consume illuminated with a wand zap, strike from an ally, or effects from some artifacts. Using illuminated in this way will deal bonus damage.
actors.hero.spells.guidinglight$illuminated.desc_generic=Other heroes can still use illuminated to benefit from the searing light talent, but will not gain any accuracy.
actors.hero.spells.hallowedground.name=hallowed ground
actors.hero.spells.hallowedground.prompt=Choose a location
@@ -884,6 +885,8 @@ actors.hero.talent$deadlyfollowuptracker.desc=The Duelist has recently attacked
actors.hero.talent$combinedlethalityabilitytracker.executed=executed
actors.hero.talent$satiatedspellstracker.name=Shielding Spell
actors.hero.talent$satiatedspellstracker.desc=The next spell the Cleric casts will grant them a small amount of shielding.
actors.hero.talent$searinglightcooldown.name=Searing Light
actors.hero.talent$searinglightcooldown.desc=You have recently used this talent, and must wait before using it again.\n\nTurns remaining: %s.
#warrior
actors.hero.talent.hearty_meal.title=hearty meal
@@ -1206,12 +1209,16 @@ actors.hero.talent.counter_ability.desc=_+1:_ If the Duelist uses a weapon abili
#cleric
actors.hero.talent.satiated_spells.title=Satiated Spells
actors.hero.talent.satiated_spells.desc=_+1:_ Eating food causes the Cleric to gain _3 shielding_ the next time they cast a spell.\n\n_+2:_ Eating food causes the Cleric to gain _5 shielding_ the next time they cast a spell.
actors.hero.talent.satiated_spells.meta_desc=_If this talent is gained by a different hero_ it will instead grant shielding immediately, which will start to decay normally after 10 turns.
actors.hero.talent.holy_intuition.title=holy intuition
actors.hero.talent.holy_intuition.desc=_+1:_ The Cleric can cast _Holy Intuition,_ a spell that reveals whether an item is cursed at the cost of _3 charges._\n\n_+2:_ The Cleric can cast _Holy Intuition,_ a spell that reveals whether an item is cursed at the cost of _2 charges._
actors.hero.talent.holy_intuition.meta_desc=_If this talent is gained by a different hero_ it will instead let the hero identify the curse status on a cursed item just before equipping it, 15% of the time at +1 or 25% of the time at +2.
actors.hero.talent.searing_light.title=searing light
actors.hero.talent.searing_light.desc=_+1:_ The Cleric's physical attacks on enemies illuminated by _Guiding Light_ deal _+4 damage._\n\n_+2:_ The Cleric's physical attacks on enemies illuminated by _Guiding Light_ deal _+6 damage._
actors.hero.talent.searing_light.meta_desc=_If this talent is gained by a different hero_ it will instead grant its bonus damage after a wand or artifact is used on an enemy, with a 20 turn cooldown.
actors.hero.talent.shield_of_light.title=shield of light
actors.hero.talent.shield_of_light.desc=_+1:_ The Cleric can cast _Shield of Light,_ a spell that is cast instantly and grants them _2-4 armor_ against a target for 4 turns at the cost of 1 charge.\n\n_+2:_ The Cleric can cast _Shield of Light,_ a spell that is cast instantly and grants them _3-6 armor_ against a target for 4 turns at the cost of 1 charge.
actors.hero.talent.shield_of_light.meta_desc=_If this talent is gained by a different hero_ it will instead reduce physical damage taken from your targeted enemy by 1, 33% of the time at +1 or 50% of the time at +2.
actors.hero.talent.enlightening_meal.title=Enlightening Meal
actors.hero.talent.enlightening_meal.desc=_+1:_ Eating food takes the Cleric 1 turn and grants them _1 charge_ on their holy tome.\n\n_+2:_ Eating food takes the Cleric 1 turn and grants them _1.5 charges_ on their holy tome.

View File

@@ -2195,6 +2195,7 @@ items.dewdrop.name=dewdrop
items.dewdrop.already_full=You already have full health.
items.dewdrop.desc=A crystal clear dewdrop.\n\nDue to the magic of this place, pure water has minor restorative properties.
items.equipableitem.curse_detected=You sense that the item is cursed just before you equip it!
items.equipableitem.unequip_cursed=You can't remove a cursed item!
items.equipableitem.ac_equip=EQUIP
items.equipableitem.ac_unequip=UNEQUIP

View File

@@ -75,6 +75,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Weakness;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
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.abilities.cleric.PowerOfMany;
@@ -144,6 +145,7 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MobSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.BArray;
@@ -694,6 +696,14 @@ public abstract class Char extends Actor {
int min = 1 + Dungeon.hero.pointsInTalent(Talent.SHIELD_OF_LIGHT);
damage -= Random.NormalIntRange(min, 2*min);
damage = Math.max(damage, 0);
} else if (this == Dungeon.hero
&& Dungeon.hero.heroClass != HeroClass.CLERIC
&& Dungeon.hero.hasTalent(Talent.SHIELD_OF_LIGHT)
&& TargetHealthIndicator.instance.target() == enemy){
//33/50%
if (Random.Int(6) < 1+Dungeon.hero.pointsInTalent(Talent.SHIELD_OF_LIGHT)){
damage -= 1;
}
}
// hero and pris images skip this as they already benefit from hero's armor glyph proc

View File

@@ -401,13 +401,22 @@ public enum Talent {
wepAbilUsed = bundle.getBoolean(WEP_ABIL_USED);
}
}
public static class CounterAbilityTacker extends FlavourBuff{};
public static class CounterAbilityTacker extends FlavourBuff{}
public static class SatiatedSpellsTracker extends Buff{
@Override
public int icon() {
return BuffIndicator.SPELL_FOOD;
}
};
}
//used for metamorphed searing light
public static class SearingLightCooldown extends FlavourBuff{
@Override
public int icon() {
return BuffIndicator.TIME;
}
public void tintIcon(Image icon) { icon.hardlight(0f, 0f, 1f); }
public float iconFadePercent() { return Math.max(0, visualcooldown() / 20); }
}
int icon;
int maxPoints;
@@ -615,7 +624,17 @@ public enum Talent {
}
}
if (hero.hasTalent(SATIATED_SPELLS)){
Buff.affect( hero, SatiatedSpellsTracker.class );
if (hero.heroClass == HeroClass.CLERIC) {
Buff.affect(hero, SatiatedSpellsTracker.class);
} else {
//3/5 shielding, delayed up to 10 turns
int amount = 1 + 2*hero.pointsInTalent(SATIATED_SPELLS);
Barrier b = Buff.affect(hero, Barrier.class);
if (b.shielding() <= amount){
b.setShield(amount);
b.delay(Math.max(10-b.cooldown(), 0));
}
}
}
if (hero.hasTalent(ENLIGHTENING_MEAL)){
HolyTome tome = hero.belongings.getItem(HolyTome.class);

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.HolyTome;
@@ -161,6 +162,8 @@ public class GuidingLight extends TargetedClericSpell {
if (Dungeon.hero.subClass == HeroSubClass.PRIEST){
desc += "\n\n" + Messages.get(this, "desc_priest");
} else if (Dungeon.hero.heroClass != HeroClass.CLERIC){
desc += "\n\n" + Messages.get(this, "desc_generic");
}
return desc;

View File

@@ -675,8 +675,8 @@ public abstract class Mob extends Char {
@Override
public int defenseSkill( Char enemy ) {
if (buff(GuidingLight.Illuminated.class) != null){
//if the attacker is the hero, they must be using a weapon they have the str for
if (buff(GuidingLight.Illuminated.class) != null && Dungeon.hero.heroClass == HeroClass.CLERIC){
//if the attacker is the cleric, they must be using a weapon they have the str for
if (enemy instanceof Hero){
Hero h = (Hero) enemy;
if (!(h.belongings.attackingWeapon() instanceof Weapon)

View File

@@ -28,6 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
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.messages.Messages;
@@ -112,6 +113,15 @@ abstract public class KindOfWeapon extends EquipableItem {
}
}
// 15/25% chance
if (hero.heroClass != HeroClass.CLERIC && hero.hasTalent(Talent.HOLY_INTUITION)
&& cursed && !cursedKnown
&& Random.Int(20) < 1 + 2*hero.pointsInTalent(Talent.HOLY_INTUITION)){
cursedKnown = true;
GLog.p(Messages.get(this, "curse_detected"));
return false;
}
detachAll( hero.belongings.backpack );
if (hero.belongings.weapon == null || hero.belongings.weapon.doUnequip( hero, true )) {

View File

@@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring;
@@ -31,6 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
import com.watabou.utils.Random;
public abstract class KindofMisc extends EquipableItem {
@@ -132,6 +134,15 @@ public abstract class KindofMisc extends EquipableItem {
} else {
// 15/25% chance
if (hero.heroClass != HeroClass.CLERIC && hero.hasTalent(Talent.HOLY_INTUITION)
&& cursed && !cursedKnown
&& Random.Int(20) < 1 + 2*hero.pointsInTalent(Talent.HOLY_INTUITION)){
cursedKnown = true;
GLog.p(Messages.get(this, "curse_detected"));
return false;
}
if (this instanceof Artifact){
if (hero.belongings.artifact == null) hero.belongings.artifact = (Artifact) this;
else hero.belongings.misc = (Artifact) this;

View File

@@ -242,6 +242,15 @@ public class Armor extends EquipableItem {
detach(hero.belongings.backpack);
// 15/25% chance
if (hero.heroClass != HeroClass.CLERIC && hero.hasTalent(Talent.HOLY_INTUITION)
&& cursed && !cursedKnown
&& Random.Int(20) < 1 + 2*hero.pointsInTalent(Talent.HOLY_INTUITION)){
cursedKnown = true;
GLog.p(Messages.get(this, "curse_detected"));
return false;
}
if (hero.belongings.armor == null || hero.belongings.armor.doUnequip( hero, true, false )) {
hero.belongings.armor = this;

View File

@@ -26,7 +26,9 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
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.GuidingLight;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.KindofMisc;
@@ -149,6 +151,13 @@ public class Artifact extends KindofMisc {
target.buff(GuidingLight.Illuminated.class).detach();
target.damage(Dungeon.hero.lvl, GuidingLight.INSTANCE);
}
if (Dungeon.hero.heroClass != HeroClass.CLERIC
&& Dungeon.hero.hasTalent(Talent.SEARING_LIGHT)
&& Dungeon.hero.buff(Talent.SearingLightCooldown.class) == null){
Buff.affect(target, GuidingLight.Illuminated.class);
Buff.affect(Dungeon.hero, Talent.SearingLightCooldown.class, 20f);
}
}
@Override

View File

@@ -211,8 +211,9 @@ public class ScrollOfMetamorphosis extends ExoticScroll {
Set<Talent> curTalentsAtTier = Dungeon.hero.talents.get(tier-1).keySet();
for (HeroClass cls : HeroClass.values()){
if (cls == HeroClass.CLERIC && Dungeon.hero.heroClass != HeroClass.CLERIC){
continue; //TODO CLERIC for now no metamorphing cleric talents
//TODO CLERIC only T1 talents have metamorph effects atm
if (tier != 1 && cls == HeroClass.CLERIC && Dungeon.hero.heroClass != HeroClass.CLERIC){
continue;
}
ArrayList<LinkedHashMap<Talent, Integer>> clsTalents = new ArrayList<>();

View File

@@ -220,6 +220,13 @@ public abstract class Wand extends Item {
target.buff(GuidingLight.Illuminated.class).detach();
target.damage(Dungeon.hero.lvl, GuidingLight.INSTANCE);
}
if (Dungeon.hero.heroClass != HeroClass.CLERIC
&& Dungeon.hero.hasTalent(Talent.SEARING_LIGHT)
&& Dungeon.hero.buff(Talent.SearingLightCooldown.class) == null){
Buff.affect(target, GuidingLight.Illuminated.class);
Buff.affect(Dungeon.hero, Talent.SearingLightCooldown.class, 20f);
}
}
@Override