diff --git a/core/src/main/assets/effects/text_icons.png b/core/src/main/assets/effects/text_icons.png new file mode 100644 index 000000000..7599d4647 Binary files /dev/null and b/core/src/main/assets/effects/text_icons.png differ diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index f4e53e170..351a90ff1 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -1266,7 +1266,6 @@ actors.mobs.necromancer$necroskeleton.desc=This skeleton has been summoned by a actors.mobs.mob.died=You hear something die in the distance. actors.mobs.mob.rage=#$%^ -actors.mobs.mob.exp=%+dEXP actors.mobs.mob.rankings_desc=Slain by: %s actors.mobs.monk.name=dwarf monk diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 68d2496ca..2d98a91d9 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -712,8 +712,7 @@ items.potions.potionofpurity.protected=A protective film envelops you! items.potions.potionofpurity.desc=This magical reagent will quickly neutralize all harmful area-bound effects in a large area. Drinking it will give you temporary immunity to such effects. items.potions.potionofstrength.name=potion of strength -items.potions.potionofstrength.msg_1=+1 str -items.potions.potionofstrength.msg_2=Newfound strength surges through your body. +items.potions.potionofstrength.msg=Newfound strength surges through your body, you now have %d strength! items.potions.potionofstrength.desc=This powerful liquid will course through your muscles, permanently increasing your strength by one point. items.potions.potionoftoxicgas.name=potion of toxic gas @@ -755,8 +754,7 @@ items.potions.elixirs.elixiroficytouch.name=elixir of icy touch items.potions.elixirs.elixiroficytouch.desc=When consumed, this elixir will allow the drinker to sap the heat from enemies they attack. This effect will make the drinker immune to the cold, and allow them to chill enemies with physical attacks. items.potions.elixirs.elixirofmight.name=elixir of might -items.potions.elixirs.elixirofmight.msg_1=+1 str, +%d hp -items.potions.elixirs.elixirofmight.msg_2=Newfound strength surges through your body. +items.potions.elixirs.elixirofmight.msg=Newfound strength surges through your body, you now have %d strength! items.potions.elixirs.elixirofmight.desc=This powerful liquid will course through your muscles, permanently increasing your strength by one point and temporarily increasing maximum health by %d points. The health boost scales with your maximum health, but will slowly wear off as you gain levels. items.potions.elixirs.elixirofmight$htboost.name=max health boost items.potions.elixirs.elixirofmight$htboost.desc=Your body feels unnaturally strong and healthy.\n\nYour maximum health is boosted for an extended period of time. As you gain levels, the boost will steadily fade.\n\nCurrent boost amount: %d.\nLevels remaining: %d. @@ -1954,9 +1952,6 @@ items.brokenseal.choose_title=Choose a Glyph items.brokenseal.choose_desc=Both this armor and the broken seal are carrying a glyph. Pick which glyph should be kept.\n\nNote that if you pick the glyph that is currently on the armor, the seal will not be able to transfer it later. items.dewdrop.name=dewdrop -items.dewdrop.heal=+%dHP -items.dewdrop.shield=+%dSHLD -items.dewdrop.both=+%1$dHP, +%2$dSHLD 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. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java index d784c7841..75e4c2111 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Assets.java @@ -28,6 +28,7 @@ public class Assets { public static final String FIREBALL = "effects/fireball.png"; public static final String SPECKS = "effects/specks.png"; public static final String SPELL_ICONS = "effects/spell_icons.png"; + public static final String TEXT_ICONS = "effects/text_icons.png"; } public static class Environment { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 6052424de..3f0607e89 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -79,6 +79,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Elemental; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Tengu; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.MirrorImage; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PrismaticImage; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; @@ -86,6 +87,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.Pickaxe; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; @@ -785,10 +787,26 @@ public abstract class Char extends Actor { } if (sprite != null) { - sprite.showStatus(HP > HT / 2 ? + //defaults to normal damage icon if no other ones apply + int icon = FloatingText.PHYS_DMG; + if (AntiMagic.RESISTS.contains(src.getClass())) icon = FloatingText.MAGIC_DMG; + if (src instanceof Pickaxe) icon = FloatingText.PICK_DMG; + + if (src instanceof Hunger) icon = FloatingText.HUNGER; + if (src instanceof Burning) icon = FloatingText.BURNING; + if (src instanceof Electricity) icon = FloatingText.SHOCKING; + if (src instanceof Bleeding) icon = FloatingText.BLEEDING; + if (src instanceof ToxicGas) icon = FloatingText.TOXIC; + if (src instanceof Corrosion) icon = FloatingText.CORROSION; + if (src instanceof Poison) icon = FloatingText.POISON; + if (src instanceof Ooze) icon = FloatingText.OOZE; + if (src instanceof Viscosity.DeferedDamage) icon = FloatingText.DEFERRED; + + sprite.showStatusWithIcon(HP > HT / 2 ? CharSprite.WARNING : CharSprite.NEGATIVE, - Integer.toString(dmg + shielded)); + Integer.toString(dmg + shielded), + icon); } if (HP < 0) HP = 0; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java index bcb636228..e78eb241c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal.WarriorShield; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -212,6 +213,7 @@ public class Berserk extends Buff implements ActionIndicator.Action { WarriorShield shield = target.buff(WarriorShield.class); int shieldAmount = Math.round(shield.maxShield() * shieldMultiplier); shield.supercharge(shieldAmount); + target.sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf(shieldAmount), FloatingText.SHIELDING ); BuffIndicator.refreshHero(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Healing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Healing.java index d5d11974a..b289360be 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Healing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Healing.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; 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.ui.BuffIndicator; @@ -53,7 +54,8 @@ public class Healing extends Buff { ((Hero) target).resting = false; } } - + + target.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(healingThisTick()), FloatingText.HEALING); healingLeft -= healingThisTick(); if (healingLeft <= 0){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/duelist/ElementalStrike.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/duelist/ElementalStrike.java index 33b92218c..24278e528 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/duelist/ElementalStrike.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/duelist/ElementalStrike.java @@ -47,6 +47,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; @@ -260,7 +261,7 @@ public class ElementalStrike extends ArmorAbility { if (heal > 0){ hero.HP += heal; hero.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 1 ); - hero.sprite.showStatus( CharSprite.POSITIVE, Integer.toString( heal ) ); + hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString( heal ), FloatingText.HEALING ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java index f6b736266..470b7ca2e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/mage/ElementalBlast.java @@ -46,6 +46,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.ArmorAbility; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite; @@ -344,7 +345,13 @@ public class ElementalBlast extends ArmorAbility { mob.HP += healing; mob.sprite.emitter().burst(Speck.factory(Speck.HEALING), 4); - mob.sprite.showStatus(CharSprite.POSITIVE, "+%dHP", healing + shielding); + + if (healing > 0) { + mob.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(healing), FloatingText.HEALING); + } + if (shielding > 0){ + mob.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(shielding), FloatingText.SHIELDING); + } } else { if (!mob.properties().contains(Char.Property.UNDEAD)) { Charm charm = Buff.affect(mob, Charm.class, effectMulti*Charm.DURATION/2f); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/ArmoredBrute.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/ArmoredBrute.java index 291487c83..030d71f0a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/ArmoredBrute.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/ArmoredBrute.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.PlateArmor; @@ -51,6 +52,7 @@ public class ArmoredBrute extends Brute { @Override protected void triggerEnrage () { Buff.affect(this, ArmoredRage.class).setShield(HT/2 + 1); + sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf(HT/2 + 1), FloatingText.SHIELDING ); if (Dungeon.level.heroFOV[pos]) { sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "enraged") ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Brute.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Brute.java index 423caefca..4d395dc2b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Brute.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Brute.java @@ -27,11 +27,13 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AscensionChallenge; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ShieldBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.SpellSprite; import com.shatteredpixel.shatteredpixeldungeon.items.Gold; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.BruteSprite; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.watabou.utils.Bundle; import com.watabou.utils.Random; @@ -93,6 +95,7 @@ public class Brute extends Mob { protected void triggerEnrage(){ Buff.affect(this, BruteRage.class).setShield(HT/2 + 4); + sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf(HT/2 + 4), FloatingText.SHIELDING ); if (Dungeon.level.heroFOV[pos]) { SpellSprite.show( this, SpellSprite.BERSERK); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java index 6e024c17b..cc50c7ba3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java @@ -43,6 +43,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Slow; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.TargetedCell; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; @@ -335,6 +336,7 @@ public class DM300 extends Mob { } Sample.INSTANCE.play(Assets.Sounds.LIGHTNING); sprite.emitter().start(SparkParticle.STATIC, 0.05f, 20); + sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(30 + (HT - HP)/10), FloatingText.SHIELDING); } Buff.affect(this, Barrier.class).setShield( 30 + (HT - HP)/10); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index a839a4c48..a5ac319b0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -53,6 +53,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.abilities.duelist.Feint; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.DirectableAlly; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.Surprise; import com.shatteredpixel.shatteredpixeldungeon.effects.Wound; @@ -94,12 +95,6 @@ public abstract class Mob extends Char { alignment = Alignment.ENEMY; } - - private static final String TXT_DIED = "You hear something died in the distance"; - - protected static final String TXT_NOTICE1 = "?!"; - protected static final String TXT_RAGE = "#$%^"; - protected static final String TXT_EXP = "%+dEXP"; public AiState SLEEPING = new Sleeping(); public AiState HUNTING = new Hunting(); @@ -794,7 +789,7 @@ public abstract class Mob extends Char { } if (exp > 0) { - Dungeon.hero.sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "exp", exp)); + Dungeon.hero.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(exp), FloatingText.EXPERIENCE); } Dungeon.hero.earnExp(exp, getClass()); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/FloatingText.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/FloatingText.java index a248f5af4..0b12a1ba6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/FloatingText.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/effects/FloatingText.java @@ -21,13 +21,16 @@ package com.shatteredpixel.shatteredpixeldungeon.effects; +import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.watabou.noosa.Camera; import com.watabou.noosa.Game; +import com.watabou.noosa.Image; import com.watabou.noosa.RenderedText; +import com.watabou.noosa.TextureFilm; import com.watabou.utils.Callback; import com.watabou.utils.SparseArray; @@ -38,6 +41,39 @@ public class FloatingText extends RenderedTextBlock { private static final float LIFESPAN = 1f; private static final float DISTANCE = DungeonTilemap.SIZE; + public static final int ICON_SIZE = 7; + public static TextureFilm iconFilm = new TextureFilm( Assets.Effects.TEXT_ICONS, ICON_SIZE, ICON_SIZE ); + + 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; + + //debuff/dot damage icons + public static int HUNGER = 4; + public static int BURNING = 5; + public static int SHOCKING = 6; + public static int BLEEDING = 7; + public static int TOXIC = 8; + public static int CORROSION = 9; + public static int POISON = 10; + public static int OOZE = 11; + public static int DEFERRED = 12; + + //positive icons + public static int HEALING = 18; + public static int SHIELDING = 19; + public static int EXPERIENCE= 20; + + //currency icons + public static int GOLD = 22; + public static int ENERGY = 23; + + private Image icon; + private boolean iconLeft; + private float timeLeft; private int key = -1; @@ -65,10 +101,38 @@ public class FloatingText extends RenderedTextBlock { for (RenderedText t : words){ t.y -= yMove; } + + if (icon != null){ + icon.alpha(p > 0.5f ? 1 : p * 2); + icon.y -= yMove; + } } } } - + + @Override + protected synchronized void layout() { + super.layout(); + if (icon != null){ + if (iconLeft){ + icon.x = left(); + } else { + icon.x = left() + width() - icon.width(); + } + icon.y = top(); + PixelScene.align(icon); + } + } + + @Override + public float width() { + float width = super.width(); + if (icon != null){ + width += icon.width()-0.5f; + } + return width; + } + @Override public void kill() { if (key != -1) { @@ -86,7 +150,7 @@ public class FloatingText extends RenderedTextBlock { super.destroy(); } - public void reset( float x, float y, String text, int color ) { + public void reset( float x, float y, String text, int color, int iconIdx, boolean left ) { revive(); @@ -95,6 +159,18 @@ public class FloatingText extends RenderedTextBlock { text( text ); hardlight( color ); + if (iconIdx != NO_ICON){ + icon = new Image( Assets.Effects.TEXT_ICONS); + icon.frame(iconFilm.get(iconIdx)); + add(icon); + iconLeft = left; + if (iconLeft){ + align(RIGHT_ALIGN); + } + } else { + icon = null; + } + setPos( PixelScene.align( Camera.main, x - width() / 2), PixelScene.align( Camera.main, y - height()) @@ -104,27 +180,23 @@ public class FloatingText extends RenderedTextBlock { } /* STATIC METHODS */ - - public static void show( float x, float y, String text, int color ) { - Game.runOnRenderThread(new Callback() { - @Override - public void call() { - FloatingText txt = GameScene.status(); - if (txt != null){ - txt.reset(x, y, text, color); - } - } - }); + + public static void show( float x, float y, String text, int color) { + show(x, y, -1, text, color, -1, false); } - public static void show( float x, float y, int key, String text, int color ) { + public static void show( float x, float y, int key, String text, int color) { + show(x, y, key, text, color, -1, false); + } + + public static void show( float x, float y, int key, String text, int color, int iconIdx, boolean left ) { Game.runOnRenderThread(new Callback() { @Override public void call() { FloatingText txt = GameScene.status(); if (txt != null){ - txt.reset(x, y, text, color); - push(txt, key); + txt.reset(x, y, text, color, iconIdx, left); + if (key != -1) push(txt, key); } } }); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java index efe463e74..a18cbd320 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java @@ -27,7 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; @@ -86,13 +86,11 @@ public class Dewdrop extends Item { if (effect > 0 || shield > 0) { hero.HP += effect; if (shield > 0) Buff.affect(hero, Barrier.class).incShield(shield); - hero.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); - if (effect > 0 && shield > 0){ - hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(Dewdrop.class, "both", effect, shield) ); - } else if (effect > 0){ - hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(Dewdrop.class, "heal", effect) ); - } else { - hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(Dewdrop.class, "shield", shield) ); + if (effect > 0){ + hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf(effect), FloatingText.HEALING); + } + if (shield > 0) { + hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf(effect), FloatingText.SHIELDING ); } } else if (!force) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java index 7b3efb58e..62d9bda05 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -33,8 +34,6 @@ import java.util.ArrayList; public class EnergyCrystal extends Item { - private static final String TXT_VALUE = "%+d"; - { image = ItemSpriteSheet.ENERGY; stackable = true; @@ -60,7 +59,7 @@ public class EnergyCrystal extends Item { //TODO track energy collected maybe? We do already track recipes crafted though.. GameScene.pickUp( this, pos ); - hero.sprite.showStatus( 0x44CCFF, TXT_VALUE, quantity ); + hero.sprite.showStatusWithIcon( 0x44CCFF, String.valueOf(quantity), FloatingText.ENERGY ); hero.spendAndNext( TIME_TO_PICK_UP ); Sample.INSTANCE.play( Assets.Sounds.ITEM ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java index 130b800b4..c157007ab 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -36,8 +37,6 @@ import java.util.ArrayList; public class Gold extends Item { - private static final String TXT_VALUE = "%+d"; - { image = ItemSpriteSheet.GOLD; stackable = true; @@ -64,7 +63,7 @@ public class Gold extends Item { Badges.validateGoldCollected(); GameScene.pickUp( this, pos ); - hero.sprite.showStatus( CharSprite.NEUTRAL, TXT_VALUE, quantity ); + hero.sprite.showStatusWithIcon( CharSprite.NEUTRAL, String.valueOf(quantity), FloatingText.GOLD ); hero.spendAndNext( TIME_TO_PICK_UP ); Sample.INSTANCE.play( Assets.Sounds.GOLD, 1, 1, Random.Float( 0.9f, 1.1f ) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Metabolism.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Metabolism.java index 7e8aa7478..3b5c527b8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Metabolism.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Metabolism.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor.Glyph; @@ -56,7 +57,7 @@ public class Metabolism extends Glyph { defender.HP += healing; defender.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); - defender.sprite.showStatus( CharSprite.POSITIVE, Integer.toString( healing ) ); + defender.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString( healing ), FloatingText.HEALING); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java index 450c795ba..b348dc925 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfExperience.java @@ -23,6 +23,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.Flare; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class PotionOfExperience extends Potion { @@ -38,6 +40,7 @@ public class PotionOfExperience extends Potion { @Override public void apply( Hero hero ) { identify(); + hero.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(hero.maxExp()), FloatingText.EXPERIENCE); hero.earnExp( hero.maxExp(), getClass() ); new Flare( 6, 32 ).color(0xFFFF00, true).show( curUser.sprite, 2f ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java index f612b73de..0bd40bf28 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/PotionOfStrength.java @@ -24,7 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -41,10 +40,8 @@ public class PotionOfStrength extends Potion { @Override public void apply( Hero hero ) { identify(); - - hero.STR++; - hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(this, "msg_1") ); - GLog.p( Messages.get(this, "msg_2") ); + + GLog.p( Messages.get(this, "msg", hero.STR()) ); Badges.validateStrengthAttained(); Badges.validateDuelistUnlock(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java index 23c01b0d9..1587ec93d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java @@ -28,7 +28,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; 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; @@ -54,8 +53,7 @@ public class ElixirOfMight extends Elixir { boost.reset(); hero.updateHT( true ); - hero.sprite.showStatus( CharSprite.POSITIVE, Messages.get(this, "msg_1", boost.boost() )); - GLog.p( Messages.get(this, "msg_2") ); + GLog.p( Messages.get(this, "msg", hero.STR()) ); Badges.validateStrengthAttained(); Badges.validateDuelistUnlock(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java index e2e6d1119..61fe632be 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfShielding.java @@ -26,7 +26,9 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; 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.PotionOfHealing; +import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class PotionOfShielding extends ExoticPotion { @@ -44,6 +46,7 @@ public class PotionOfShielding extends ExoticPotion { } else { //~75% of a potion of healing Buff.affect(hero, Barrier.class).setShield((int) (0.6f * hero.HT + 10)); + hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, String.valueOf((int) (0.6f * hero.HT + 10)), FloatingText.SHIELDING ); } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java index 089f7e8c3..6f84a170a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTransfusion.java @@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BloodParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; @@ -93,7 +94,12 @@ public class WandOfTransfusion extends Wand { ch.HP += healing; ch.sprite.emitter().burst(Speck.factory(Speck.HEALING), 2 + buffedLvl() / 2); - ch.sprite.showStatus(CharSprite.POSITIVE, "+%dHP", healing + shielding); + if (healing > 0) { + ch.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(healing), FloatingText.HEALING); + } + if (shielding > 0){ + ch.sprite.showStatusWithIcon(CharSprite.POSITIVE, String.valueOf(shielding), FloatingText.SHIELDING); + } if (!freeCharge) { damageHero(selfDmg); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java index c1805cf86..ed4f6c988 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfWarding.java @@ -34,6 +34,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -287,7 +288,7 @@ public class WandOfWarding extends Wand { } HP = Math.min(HT, HP+heal); - if (sprite != null) sprite.showStatus(CharSprite.POSITIVE, Integer.toString(heal)); + if (sprite != null) sprite.showStatusWithIcon(CharSprite.POSITIVE, Integer.toString(heal), FloatingText.HEALING); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Vampiric.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Vampiric.java index b79d4ab9c..adfb8c4d4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Vampiric.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Vampiric.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; @@ -54,7 +55,7 @@ public class Vampiric extends Weapon.Enchantment { attacker.HP += healAmt; attacker.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 1 ); - attacker.sprite.showStatus( CharSprite.POSITIVE, Integer.toString( healAmt ) ); + attacker.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString( healAmt ), FloatingText.HEALING ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Sungrass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Sungrass.java index ea0e90e2d..54e46d465 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Sungrass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Sungrass.java @@ -28,9 +28,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.effects.FloatingText; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle; 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.watabou.utils.Bundle; @@ -94,7 +95,7 @@ public class Sungrass extends Plant { target.HP += (int)partialHeal; level -= (int)partialHeal; partialHeal -= (int)partialHeal; - target.sprite.emitter().burst(Speck.factory(Speck.HEALING), 1); + target.sprite.showStatusWithIcon(CharSprite.POSITIVE, "1", FloatingText.HEALING); if (target.HP >= target.HT) { target.HP = target.HT; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java index 467b3cd33..ab2398203 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CharSprite.java @@ -189,6 +189,10 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip } public void showStatus( int color, String text, Object... args ) { + showStatusWithIcon(color, text, FloatingText.NO_ICON, args); + } + + public void showStatusWithIcon( int color, String text, int icon, Object... args ) { if (visible) { if (args.length > 0) { text = Messages.format( text, args ); @@ -196,9 +200,9 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip float x = destinationCenter().x; float y = destinationCenter().y - height()/2f; if (ch != null) { - FloatingText.show( x, y, ch.pos, text, color ); + FloatingText.show( x, y, ch.pos, text, color, icon, true ); } else { - FloatingText.show( x, y, text, color ); + FloatingText.show( x, y, -1, text, color, icon, true ); } } }