v2.3.0: added more icons, in particular for misc dmg that ignores armor

This commit is contained in:
Evan Debenham
2023-12-08 15:34:52 -05:00
parent 24823e31bc
commit 3dc39de061
14 changed files with 72 additions and 23 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 B

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -1319,7 +1319,7 @@ actors.mobs.armoredbrute.desc=The most senior gnoll brutes often wear powerful a
actors.mobs.skeleton.name=skeleton
actors.mobs.skeleton.explo_kill=You were killed by the explosion of bones...
actors.mobs.skeleton.def_verb=blocked
actors.mobs.skeleton.desc=Skeletons are composed of corpses bones from unlucky adventurers and inhabitants of the dungeon, animated by emanations of evil magic from the depths below. After they have been damaged enough, they disintegrate in an explosion of bones.
actors.mobs.skeleton.desc=Skeletons are composed of the bones of unlucky adventurers and inhabitants of the prison, animated by emanations of evil magic from the depths below. After they have been damaged enough, skeletons will disintegrate in an explosion of bones. The shrapnel from this explosion is harmful to anything nearby, but armor is very effective at mitigating it.
actors.mobs.slime.name=slime
actors.mobs.slime.def_verb=blocked

View File

@@ -41,6 +41,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Daze;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom;
@@ -76,7 +77,11 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Challenge;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.rogue.DeathMark;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.warrior.Endure;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CrystalSpire;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.DwarfKing;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Elemental;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollGeomancer;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Necromancer;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.MirrorImage;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PrismaticImage;
@@ -86,6 +91,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.Pickaxe;
@@ -94,6 +100,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetributio
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
@@ -792,9 +799,15 @@ public abstract class Char extends Actor {
if (sprite != null) {
//defaults to normal damage icon if no other ones apply
int icon = FloatingText.PHYS_DMG;
if (NO_ARMOR_PHYSICAL_SOURCES.contains(src.getClass())) icon = FloatingText.PHYS_DMG_NO_BLOCK;
if (AntiMagic.RESISTS.contains(src.getClass())) icon = FloatingText.MAGIC_DMG;
if (src instanceof Pickaxe) icon = FloatingText.PICK_DMG;
//special case for sniper when using ranged attacks
if (src == Dungeon.hero && Dungeon.hero.subClass == HeroSubClass.SNIPER && Dungeon.hero.belongings.attackingWeapon() instanceof MissileWeapon){
icon = FloatingText.PHYS_DMG_NO_BLOCK;
}
if (src instanceof Hunger) icon = FloatingText.HUNGER;
if (src instanceof Burning) icon = FloatingText.BURNING;
if (src instanceof Chilling || src instanceof Frost) icon = FloatingText.FROST;
@@ -807,6 +820,8 @@ public abstract class Char extends Actor {
if (src instanceof Poison) icon = FloatingText.POISON;
if (src instanceof Ooze) icon = FloatingText.OOZE;
if (src instanceof Viscosity.DeferedDamage) icon = FloatingText.DEFERRED;
if (src instanceof Corruption) icon = FloatingText.CORRUPTION;
if (src instanceof AscensionChallenge) icon = FloatingText.AMULET;
sprite.showStatusWithIcon(HP > HT / 2 ?
CharSprite.WARNING :
@@ -823,6 +838,20 @@ public abstract class Char extends Actor {
DeathMark.processFearTheReaper(this);
}
}
//these are misc. sources of physical damage which do not apply armor, they get a different icon
private static HashSet<Class> NO_ARMOR_PHYSICAL_SOURCES = new HashSet<>();
{
NO_ARMOR_PHYSICAL_SOURCES.add(CrystalSpire.SpireSpike.class);
NO_ARMOR_PHYSICAL_SOURCES.add(GnollGeomancer.Boulder.class);
NO_ARMOR_PHYSICAL_SOURCES.add(DwarfKing.KingDamager.class);
NO_ARMOR_PHYSICAL_SOURCES.add(DwarfKing.Summoning.class);
NO_ARMOR_PHYSICAL_SOURCES.add(Chasm.class);
NO_ARMOR_PHYSICAL_SOURCES.add(WandOfBlastWave.Knockback.class);
NO_ARMOR_PHYSICAL_SOURCES.add(Heap.class); //damage from wraiths attempting to spawn from heaps
NO_ARMOR_PHYSICAL_SOURCES.add(Necromancer.SummoningBlockDamage.class);
NO_ARMOR_PHYSICAL_SOURCES.add(DriedRose.GhostHero.NoRoseDamage.class);
}
public void destroy() {
HP = 0;

View File

@@ -686,7 +686,7 @@ public class DwarfKing extends Mob {
}
} else {
Char ch = Actor.findChar(pos);
ch.damage(Random.NormalIntRange(20, 40), target);
ch.damage(Random.NormalIntRange(20, 40), this);
if (((DwarfKing)target).phase == 2){
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)){
target.damage(target.HT/18, new KingDamager());

View File

@@ -218,7 +218,7 @@ public class Necromancer extends Mob {
Char blocker = Actor.findChar(summoningPos);
if (blocker.alignment != alignment){
blocker.damage( Random.NormalIntRange(2, 10), this );
blocker.damage( Random.NormalIntRange(2, 10), new SummoningBlockDamage() );
if (blocker == Dungeon.hero && !blocker.isAlive()){
Badges.validateDeathFromEnemyMagic();
Dungeon.fail(this);
@@ -246,6 +246,8 @@ public class Necromancer extends Mob {
Buff.affect( mySkeleton, b.getClass());
}
}
public static class SummoningBlockDamage{}
private class Hunting extends Mob.Hunting{

View File

@@ -71,6 +71,7 @@ public class Skeleton extends Mob {
if (ch != null && ch.isAlive()) {
int damage = Math.round(Random.NormalIntRange(6, 12));
damage = Math.round( damage * AscensionChallenge.statModifier(this));
//armor is 2x effective against bone explosion
damage = Math.max( 0, damage - (ch.drRoll() + ch.drRoll()) );
ch.damage( damage, this );
if (ch == Dungeon.hero && !ch.isAlive()) {

View File

@@ -136,7 +136,7 @@ public class SpectralNecromancer extends Necromancer {
Char blocker = Actor.findChar(summoningPos);
if (blocker.alignment != alignment){
blocker.damage( Random.NormalIntRange(2, 10), this );
blocker.damage( Random.NormalIntRange(2, 10), new SummoningBlockDamage() );
if (blocker == Dungeon.hero && !blocker.isAlive()){
Badges.validateDeathFromEnemyMagic();
Dungeon.fail(this);

View File

@@ -47,31 +47,35 @@ public class FloatingText extends RenderedTextBlock {
public static int NO_ICON = -1;
//combat damage icons
public static int PHYS_DMG = 0;
public static int MAGIC_DMG = 1;
public static int PICK_DMG = 2;
public static int PHYS_DMG = 0;
public static int PHYS_DMG_NO_BLOCK = 1;
public static int MAGIC_DMG = 2;
public static int PICK_DMG = 3;
//debuff/dot damage icons
public static int HUNGER = 4;
public static int BURNING = 5;
public static int SHOCKING = 6;
public static int FROST = 7;
public static int WATER = 8;
public static int BLEEDING = 9;
public static int TOXIC = 10;
public static int CORROSION = 11;
public static int POISON = 12;
public static int OOZE = 13;
public static int DEFERRED = 14;
public static int HUNGER = 5;
public static int BURNING = 6;
public static int SHOCKING = 7;
public static int FROST = 8;
public static int WATER = 9;
public static int BLEEDING = 10;
public static int TOXIC = 11;
public static int CORROSION = 12;
public static int POISON = 13;
public static int OOZE = 14;
public static int DEFERRED = 15;
public static int CORRUPTION= 16;
public static int AMULET = 17;
//positive icons
public static int HEALING = 18;
public static int SHIELDING = 19;
public static int EXPERIENCE= 20;
public static int STRENGTH = 21;
//currency icons
public static int GOLD = 22;
public static int ENERGY = 23;
public static int GOLD = 23;
public static int ENERGY = 24;
private Image icon;
private boolean iconLeft;

View File

@@ -56,6 +56,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfWarding;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blazing;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.HolyDart;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisintegrationTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.GrimTrap;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
@@ -83,6 +84,7 @@ public class AntiMagic extends Armor.Glyph {
RESISTS.add( ScrollOfRetribution.class );
RESISTS.add( ScrollOfPsionicBlast.class );
RESISTS.add( ScrollOfTeleportation.class );
RESISTS.add( HolyDart.class );
RESISTS.add( ElementalBlast.class );
RESISTS.add( CursedWand.class );

View File

@@ -580,7 +580,7 @@ public class DriedRose extends Artifact {
if (rose == null
|| !rose.isEquipped(Dungeon.hero)
|| Dungeon.hero.buff(MagicImmune.class) != null){
damage(1, this);
damage(1, new NoRoseDamage());
}
if (!isAlive()) {
@@ -589,6 +589,8 @@ public class DriedRose extends Artifact {
return super.act();
}
public static class NoRoseDamage{}
@Override
public int attackSkill(Char target) {

View File

@@ -23,7 +23,9 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -42,6 +44,7 @@ public class PotionOfStrength extends Potion {
identify();
hero.STR++;
hero.sprite.showStatusWithIcon(CharSprite.POSITIVE, "1", FloatingText.STRENGTH);
GLog.p( Messages.get(this, "msg", hero.STR()) );

View File

@@ -25,9 +25,11 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
@@ -47,6 +49,7 @@ public class ElixirOfMight extends Elixir {
identify();
hero.STR++;
hero.sprite.showStatusWithIcon(CharSprite.POSITIVE, "1", FloatingText.STRENGTH);
Buff.affect(hero, HTBoost.class).reset();
HTBoost boost = Buff.affect(hero, HTBoost.class);

View File

@@ -159,7 +159,7 @@ public class WandOfBlastWave extends DamageWand {
int oldPos = ch.pos;
ch.pos = newPos;
if (finalCollided && ch.isActive()) {
ch.damage(Random.NormalIntRange(finalDist, 2*finalDist), this);
ch.damage(Random.NormalIntRange(finalDist, 2*finalDist), new Knockback());
if (ch.isActive()) {
Paralysis.prolong(ch, Paralysis.class, 1 + finalDist/2f);
} else if (ch == Dungeon.hero){
@@ -181,6 +181,8 @@ public class WandOfBlastWave extends DamageWand {
}));
}
public static class Knockback{}
@Override
public void onHit(MagesStaff staff, Char attacker, Char defender, int damage) {
//acts like elastic enchantment

View File

@@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.effects.Lightning;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -44,7 +45,7 @@ public class ShockingDart extends TippedDart {
//when processing charged shot, only shock enemies
if (!processingChargedShot || attacker.alignment != defender.alignment) {
defender.damage(Random.NormalIntRange(5 + Dungeon.scalingDepth() / 4, 10 + Dungeon.scalingDepth() / 4), this);
defender.damage(Random.NormalIntRange(5 + Dungeon.scalingDepth() / 4, 10 + Dungeon.scalingDepth() / 4), new Electricity());
CharSprite s = defender.sprite;
if (s != null && s.parent != null) {